@libs-ui/components-datetime-picker 0.2.72

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 (29) hide show
  1. package/README.md +3 -0
  2. package/custom-ranges/calendar/calendar.component.d.ts +140 -0
  3. package/custom-ranges/custom-ranges.component.d.ts +59 -0
  4. package/defines/calendar.define.d.ts +13 -0
  5. package/defines/date-options.define.d.ts +20 -0
  6. package/esm2022/custom-ranges/calendar/calendar.component.mjs +1256 -0
  7. package/esm2022/custom-ranges/custom-ranges.component.mjs +266 -0
  8. package/esm2022/defines/calendar.define.mjs +135 -0
  9. package/esm2022/defines/date-options.define.mjs +55 -0
  10. package/esm2022/index.mjs +2 -0
  11. package/esm2022/interfaces/calendar-emit.interface.mjs +2 -0
  12. package/esm2022/interfaces/calendar-variables.interface.mjs +6 -0
  13. package/esm2022/interfaces/function-control.interface.mjs +2 -0
  14. package/esm2022/interfaces/picker.interface.mjs +2 -0
  15. package/esm2022/interfaces/time-variables.interface.mjs +4 -0
  16. package/esm2022/interfaces/valid.interface.mjs +2 -0
  17. package/esm2022/libs-ui-components-datetime-picker.mjs +5 -0
  18. package/esm2022/picker.component.mjs +180 -0
  19. package/fesm2022/libs-ui-components-datetime-picker.mjs +1882 -0
  20. package/fesm2022/libs-ui-components-datetime-picker.mjs.map +1 -0
  21. package/index.d.ts +1 -0
  22. package/interfaces/calendar-emit.interface.d.ts +25 -0
  23. package/interfaces/calendar-variables.interface.d.ts +80 -0
  24. package/interfaces/function-control.interface.d.ts +8 -0
  25. package/interfaces/picker.interface.d.ts +26 -0
  26. package/interfaces/time-variables.interface.d.ts +36 -0
  27. package/interfaces/valid.interface.d.ts +5 -0
  28. package/package.json +25 -0
  29. package/picker.component.d.ts +77 -0
@@ -0,0 +1,1256 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-expressions */
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ import { ChangeDetectionStrategy, Component, computed, effect, inject, input, model, output, signal, untracked, viewChild } from "@angular/core";
4
+ import { LibsUiComponentsButtonsButtonComponent } from "@libs-ui/components-buttons-button";
5
+ import { LibsUiComponentsDropdownComponent } from "@libs-ui/components-dropdown";
6
+ import { LibsUiComponentsInputsInputComponent } from "@libs-ui/components-inputs-input";
7
+ import { isEmpty, set } from "@libs-ui/utils";
8
+ import { TranslateModule, TranslateService } from "@ngx-translate/core";
9
+ import dayjs from 'dayjs';
10
+ import isoWeek from 'dayjs/plugin/isoWeek';
11
+ import { getMonthsDetailById, getMonthsListConfig, getYearsDetailById, getYearsListConfig } from "../../defines/calendar.define";
12
+ import { DEFAULT_MAX_YEAR, DEFAULT_MIN_YEAR, defaultLocaleConfig, getDateOptions } from "../../defines/date-options.define";
13
+ import { SideEnum } from "../../interfaces/calendar-variables.interface";
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@ngx-translate/core";
16
+ dayjs.extend(isoWeek);
17
+ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
18
+ /** PROPERTY */
19
+ sideEnum = SideEnum;
20
+ calendarVariables = signal({ left: signal({}), right: signal({}) });
21
+ timepickerVariables = signal({ left: signal({ selectedHour: 0, selectedMinute: 0 }), right: signal({ selectedHour: 23, selectedMinute: 59 }) });
22
+ disableMonth = signal({ left: signal([]), right: signal([]) });
23
+ today = signal(dayjs());
24
+ listKeyFromSelected = signal({ month: undefined, year: undefined });
25
+ listKeyToSelected = signal({ month: undefined, year: undefined });
26
+ checkShowListDropdown = signal({});
27
+ selectedQuickRange = signal('');
28
+ leftCalendar = signal({});
29
+ rightCalendar = signal({});
30
+ listMonthsConfig = signal(undefined);
31
+ monthHttpDetailConfig = signal(getMonthsDetailById());
32
+ listLeftYearConfig = signal(undefined);
33
+ listRightYearConfig = signal(undefined);
34
+ listYearConfig = signal(undefined);
35
+ leftYearHttpDetailConfig = signal(undefined);
36
+ rightYearHttpDetailConfig = signal(undefined);
37
+ timePickerError = signal(false);
38
+ computedDisplayTimeLeft = computed(() => this.computedDisplayTime({ selectedHour: this.timepickerValueItem().lefthour(), selectedMinute: this.timepickerValueItem().leftminute() }));
39
+ computedDisplayTimeRight = computed(() => this.computedDisplayTime({ selectedHour: this.timepickerValueItem().righthour(), selectedMinute: this.timepickerValueItem().rightminute() }));
40
+ computedDisplayTimeLeftInputHour = computed(() => this.computedDisplayTimeInput(SideEnum.left, 'hour'));
41
+ computedDisplayTimeLeftInputMinute = computed(() => this.computedDisplayTimeInput(SideEnum.left, 'minute'));
42
+ computedDisplayTimeRightInputHour = computed(() => this.computedDisplayTimeInput(SideEnum.right, 'hour'));
43
+ computedDisplayTimeRightInputMinute = computed(() => this.computedDisplayTimeInput(SideEnum.right, 'minute'));
44
+ functionControls = new Map();
45
+ pickingDate = signal(false);
46
+ isShown = signal(false);
47
+ nowHoveredDate = signal(null);
48
+ timePickerIncrement = signal(1);
49
+ selectedLabel = signal(undefined);
50
+ keyCodeBackspace = signal(false);
51
+ checkBackspaceFocus = signal({ lefthour: signal(1), leftminute: signal(1), righthour: signal(1), rightminute: signal(1) });
52
+ timepickerValueItem = signal({ lefthour: signal(0), leftminute: signal(0), righthour: signal(0), rightminute: signal(0) });
53
+ isZero = signal(undefined);
54
+ oldDate = signal({ start: dayjs(0), end: dayjs(0) });
55
+ isSelectedData = signal({ leftmonth: false, leftyear: false, rightmonth: false, rightyear: false });
56
+ splitPickerDate = signal({ start: signal({ month: 0, year: 0, day: 0, hour: 0, minute: 0 }), end: signal({ month: 0, year: 0, day: 0, hour: 23, minute: 59 }) });
57
+ /** INPUT */
58
+ quickRangesArray = input([]);
59
+ zIndex = input(1200, { transform: (value) => value ?? 1200 });
60
+ classInclude = input('');
61
+ isSingle = input(false);
62
+ showDropdownsSelect = input(true);
63
+ hasTimePicker = input(true);
64
+ flagMouse = input({ isMouseEnter: false, isMouseEnterContent: false });
65
+ dateOptions = input({ ...defaultLocaleConfig(), ...getDateOptions() });
66
+ autoApply = input(false);
67
+ hasSecondPicker = input(false);
68
+ showRangeLabelOnInput = input(undefined);
69
+ startDate = model(dayjs().startOf('day'));
70
+ endDate = model(dayjs().endOf('day'));
71
+ minDate = input(undefined, { transform: this.transformMinMaxDate.bind(this) });
72
+ maxDate = input(undefined, { transform: this.transformMinMaxDate.bind(this) });
73
+ /** OUTPUT */
74
+ outChangStageFlagMouse = output();
75
+ // readonly outStartDateChanged = output<{ startDate: dayjs.Dayjs | undefined }>();
76
+ // readonly outEndDateChanged = output<{ endDate: dayjs.Dayjs | undefined }>();
77
+ outPickerDate = output();
78
+ // readonly outRangeClicked: EventEmitter<IRangesClicked> = new EventEmitter();
79
+ outCancel = output();
80
+ outUpdateWidth = output();
81
+ outFunctionsControl = output();
82
+ /** INJECTION */
83
+ translate = inject(TranslateService);
84
+ pickerContainer = viewChild('pickerContainer');
85
+ constructor() {
86
+ this.listMonthsConfig.set(getMonthsListConfig(this.translate));
87
+ effect(() => {
88
+ const oldStart = this.startDate()?.clone();
89
+ const oldEnd = this.endDate()?.clone();
90
+ untracked(() => {
91
+ this.oldDate.set({ start: oldStart, end: oldEnd });
92
+ });
93
+ });
94
+ }
95
+ ngOnInit() {
96
+ const startDate = this.startDate()?.clone();
97
+ const endDate = this.endDate()?.clone();
98
+ this.splitPickerDate.update(current => {
99
+ current.start.update(sideCurrent => {
100
+ sideCurrent.day = (startDate ?? dayjs().startOf('day')).date();
101
+ return sideCurrent;
102
+ });
103
+ current.end.update(sideCurrent => {
104
+ sideCurrent.day = (endDate ?? dayjs().endOf('day')).date();
105
+ return sideCurrent;
106
+ });
107
+ return current;
108
+ });
109
+ if (startDate) {
110
+ this.updateElement();
111
+ }
112
+ if (startDate && this.hasTimePicker()) {
113
+ this.setStartDate(startDate);
114
+ this.renderTimePicker(SideEnum.left);
115
+ }
116
+ if (endDate && this.hasTimePicker()) {
117
+ this.setEndDate(endDate);
118
+ this.renderTimePicker(SideEnum.right);
119
+ }
120
+ this.buildConfigYear(SideEnum.left);
121
+ this.buildConfigYear(SideEnum.right, startDate?.year());
122
+ this.updateMonthsInView();
123
+ this.renderCalendar(SideEnum.left);
124
+ this.renderCalendar(SideEnum.right);
125
+ // this.renderRanges();
126
+ this.formatMonthYear();
127
+ this.outUpdateWidth.emit(1);
128
+ this.updateElement();
129
+ this.timepickerValueItem.set({
130
+ lefthour: signal(this.timepickerVariables().left().selectedHour),
131
+ righthour: signal(this.timepickerVariables().right().selectedHour),
132
+ leftminute: signal(this.timepickerVariables().left().selectedMinute),
133
+ rightminute: signal(this.timepickerVariables().right().selectedMinute)
134
+ });
135
+ // this.outFunctionsControl.emit({ buildDefaultRange: this.buildDefaultRange.bind(this), applyToSelect: this.applyToSelect.bind(this) })
136
+ }
137
+ buildConfigYear(side, startYear) {
138
+ const minDate = this.minDate();
139
+ const maxDate = this.maxDate();
140
+ const listLeftYear = [];
141
+ const listRightYear = [];
142
+ if (side === SideEnum.left) {
143
+ for (let i = (minDate ? minDate.year() : DEFAULT_MIN_YEAR); i <= (maxDate ? maxDate?.year() : DEFAULT_MAX_YEAR); i++) {
144
+ listLeftYear.push({
145
+ id: i,
146
+ label: `${i}`
147
+ });
148
+ }
149
+ this.listLeftYearConfig.set(getYearsListConfig(listLeftYear));
150
+ this.leftYearHttpDetailConfig.set(getYearsDetailById(listLeftYear));
151
+ return;
152
+ }
153
+ for (let i = (startYear ? startYear : minDate ? minDate.year() : dayjs().year()); i <= (maxDate ? maxDate?.year() : DEFAULT_MAX_YEAR); i++) {
154
+ listRightYear.push({
155
+ id: i,
156
+ label: `${i}`
157
+ });
158
+ }
159
+ this.listRightYearConfig.set(getYearsListConfig(listRightYear));
160
+ this.rightYearHttpDetailConfig.set(getYearsDetailById(listRightYear));
161
+ }
162
+ handlerChangeFlagMouse(flagMouse) {
163
+ this.outChangStageFlagMouse.emit(flagMouse);
164
+ }
165
+ updateStartEndDate(date) {
166
+ if ((this.endDate() || date.isBefore(this.startDate(), 'day'))) {
167
+ if (this.hasTimePicker()) {
168
+ date = this.getDateWithTime(date, SideEnum.left);
169
+ }
170
+ this.endDate.set(undefined);
171
+ this.setStartDate(date.clone());
172
+ return;
173
+ }
174
+ if (!this.endDate() && this.startDate() && date.isBefore(this.startDate())) {
175
+ this.setEndDate(this.startDate()?.clone());
176
+ return;
177
+ }
178
+ if (this.hasTimePicker()) {
179
+ date = this.getDateWithTime(date, SideEnum.right);
180
+ }
181
+ if (!date.isBefore(this.startDate(), 'day')) {
182
+ this.setEndDate(date.clone());
183
+ }
184
+ if (this.autoApply()) {
185
+ this.calculateSelectedLabel();
186
+ }
187
+ }
188
+ calculateSelectedLabel() {
189
+ this.updateElement();
190
+ }
191
+ formatMonthYear() {
192
+ const month = (this.calendarVariables().left().dropdowns?.()?.currentMonth ?? 0) + 1;
193
+ const rightMonth = (this.calendarVariables().right().dropdowns?.()?.currentMonth ?? 0) + 1;
194
+ this.listKeyFromSelected.update(current => {
195
+ current.month = month;
196
+ current.year = this.calendarVariables().left().dropdowns?.()?.currentYear;
197
+ return current;
198
+ });
199
+ this.listKeyToSelected.update(current => {
200
+ current.month = rightMonth;
201
+ current.year = this.calendarVariables().right().dropdowns?.()?.currentYear;
202
+ return current;
203
+ });
204
+ this.isSelectedData.set({ leftmonth: true, leftyear: true, rightmonth: true, rightyear: true });
205
+ }
206
+ setStartDate(startDate) {
207
+ if (!this.startDate()) {
208
+ return;
209
+ }
210
+ if (typeof startDate === 'string') {
211
+ this.startDate.set(dayjs(startDate, this.dateOptions().format));
212
+ }
213
+ if (typeof startDate === 'object') {
214
+ this.pickingDate.set(true);
215
+ this.startDate.set(dayjs(startDate));
216
+ }
217
+ if (!this.hasTimePicker()) {
218
+ this.pickingDate.set(true);
219
+ this.startDate.set(this.startDate()?.startOf('day'));
220
+ }
221
+ this.setStartDateInTimePicker();
222
+ if (this.minDate() && this.startDate()?.isBefore(this.minDate())) {
223
+ this.startDate.set(this.minDate()?.clone());
224
+ this.setStartDateInTimePicker();
225
+ }
226
+ if (this.maxDate() && this.startDate()?.isAfter(this.maxDate())) {
227
+ this.startDate.set(this.maxDate().clone());
228
+ this.setStartDateInTimePicker();
229
+ }
230
+ if (!this.isShown()) {
231
+ this.updateElement();
232
+ }
233
+ // this.outStartDateChanged.emit({ startDate: this.startDate() });
234
+ this.updateMonthsInView();
235
+ }
236
+ setStartDateInTimePicker() {
237
+ if (!this.hasTimePicker() || !this.timePickerIncrement()) {
238
+ return;
239
+ }
240
+ this.startDate.update((current) => {
241
+ if (!current) {
242
+ return;
243
+ }
244
+ current.minute(Math.round(current.minute() / this.timePickerIncrement()) * this.timePickerIncrement());
245
+ return current;
246
+ });
247
+ }
248
+ setEndDate(endDate) {
249
+ if (typeof endDate === 'string') {
250
+ this.endDate.set(dayjs(endDate, this.dateOptions().format));
251
+ }
252
+ if (typeof endDate === 'object') {
253
+ this.pickingDate.set(false);
254
+ this.endDate.set(dayjs(endDate));
255
+ }
256
+ if (!this.endDate() || !this.startDate()) {
257
+ return this.updateMonthsInView();
258
+ }
259
+ if (!this.hasTimePicker()) {
260
+ this.pickingDate.set(false);
261
+ this.endDate.set(this.endDate()?.add(1, 'd').startOf('day').subtract(1, 'second'));
262
+ }
263
+ if (this.hasTimePicker() && this.timePickerIncrement()) {
264
+ this.endDate.update((current) => {
265
+ if (!current) {
266
+ return;
267
+ }
268
+ current.minute(Math.round(current.minute() / this.timePickerIncrement()) * this.timePickerIncrement());
269
+ return current;
270
+ });
271
+ }
272
+ if (this.endDate()?.isBefore(this.startDate())) {
273
+ this.endDate.set(this.startDate()?.clone());
274
+ }
275
+ if (this.maxDate() && this.endDate()?.isAfter(this.maxDate())) {
276
+ this.endDate.set(this.maxDate()?.clone());
277
+ }
278
+ // this.outEndDateChanged.emit({ endDate: this.endDate() });
279
+ this.updateMonthsInView();
280
+ }
281
+ handlerHoverDate(event, side, row, col) {
282
+ event.stopPropagation();
283
+ const leftCalDate = this.calendarVariables().left().calendar?.[row][col];
284
+ const rightCalDate = this.calendarVariables().right().calendar?.[row][col];
285
+ if (!this.pickingDate || !rightCalDate || !leftCalDate) {
286
+ return;
287
+ }
288
+ this.nowHoveredDate.set(side === SideEnum.left ? leftCalDate : rightCalDate);
289
+ this.renderCalendar(SideEnum.left);
290
+ this.renderCalendar(SideEnum.right);
291
+ }
292
+ getDisable(type) {
293
+ const minDate = this.minDate();
294
+ const maxDate = this.maxDate();
295
+ if (type === 'left') {
296
+ this.disableMonth().left.set([]);
297
+ if (minDate?.year() === this.listKeyFromSelected().year) {
298
+ for (let i = 1; i < (minDate?.month() + 1); i++) {
299
+ this.disableMonth().left.update(current => {
300
+ current.push(i);
301
+ return current;
302
+ });
303
+ }
304
+ }
305
+ if (maxDate?.year() === this.listKeyFromSelected().year) {
306
+ for (let i = maxDate?.month() + 2; i < 13; i++) {
307
+ this.disableMonth().left.update(current => {
308
+ current.push(i);
309
+ return current;
310
+ });
311
+ }
312
+ }
313
+ return;
314
+ }
315
+ this.disableMonth().right.set([]);
316
+ if (minDate?.year() === this.listKeyToSelected().year) {
317
+ for (let i = 1; i < (minDate?.month() + 1); i++) {
318
+ this.disableMonth().right.update(current => {
319
+ current.push(i);
320
+ return current;
321
+ });
322
+ }
323
+ }
324
+ if (maxDate?.year() === this.listKeyToSelected().year) {
325
+ for (let i = maxDate?.month() + 2; i < 13; i++) {
326
+ this.disableMonth().right.update(current => {
327
+ current.push(i);
328
+ return current;
329
+ });
330
+ }
331
+ }
332
+ if ((Number(this.listKeyFromSelected().year) === Number(this.listKeyToSelected().year))) {
333
+ for (let i = 1; i <= Number(this.listKeyFromSelected().month); i++) {
334
+ this.disableMonth().right.update(current => {
335
+ current.push(i);
336
+ return current;
337
+ });
338
+ }
339
+ }
340
+ }
341
+ handlerClickPrev(side) {
342
+ if (side === SideEnum.left && this.leftCalendar().month) {
343
+ this.leftCalendar.update(current => {
344
+ current.month = current.month?.subtract(1, 'month');
345
+ return current;
346
+ });
347
+ this.listKeyFromSelected.update(current => {
348
+ current.month = (this.leftCalendar().month?.month() ?? 0) + 1;
349
+ current.year = this.leftCalendar().month?.year();
350
+ return current;
351
+ });
352
+ return this.updateCalendars();
353
+ }
354
+ this.rightCalendar.update(current => {
355
+ current.month = current.month?.subtract(1, 'month');
356
+ return current;
357
+ });
358
+ this.listKeyToSelected.update(current => {
359
+ current.month = (this.rightCalendar().month?.month() ?? 0) + 1;
360
+ current.year = this.rightCalendar().month?.year();
361
+ return current;
362
+ });
363
+ this.getDisable('right');
364
+ this.updateCalendars();
365
+ }
366
+ handlerClickNext(side) {
367
+ if (side === SideEnum.left) {
368
+ this.leftCalendar.update(current => {
369
+ current.month = current.month?.add(1, 'month');
370
+ return current;
371
+ });
372
+ this.listKeyFromSelected.update(current => {
373
+ current.month = (this.leftCalendar().month?.month() ?? 0) + 1;
374
+ current.year = this.leftCalendar().month?.year();
375
+ return current;
376
+ });
377
+ if ((this.listKeyFromSelected().month === this.listKeyToSelected().month) && (this.listKeyFromSelected().year === this.listKeyToSelected().year)) {
378
+ this.rightCalendar.update(current => {
379
+ current.month = current.month?.add(1, 'month');
380
+ return current;
381
+ });
382
+ this.listKeyToSelected.update(current => {
383
+ current.month = (this.rightCalendar().month?.month() ?? 0) + 1;
384
+ current.year = this.rightCalendar().month?.year();
385
+ return current;
386
+ });
387
+ }
388
+ this.getDisable('right');
389
+ return this.updateCalendars();
390
+ }
391
+ this.rightCalendar.update(current => {
392
+ current.month = current.month?.add(1, 'month');
393
+ return current;
394
+ });
395
+ this.listKeyToSelected.update(current => {
396
+ current.month = (this.rightCalendar().month?.month() ?? 0) + 1;
397
+ current.year = this.rightCalendar().month?.year();
398
+ return current;
399
+ });
400
+ this.updateCalendars();
401
+ }
402
+ handlerPickerDate(event, side, row, col) {
403
+ event.stopPropagation();
404
+ if (event.target?.tagName === 'TD') {
405
+ if (event.target.classList && !event.target.classList.contains('available')) {
406
+ return;
407
+ }
408
+ }
409
+ if (event.target.tagName === 'SPAN') {
410
+ if (event.target.parentElement && event.target.parentElement.classList && !event.target.parentElement.classList.contains('available')) {
411
+ return;
412
+ }
413
+ }
414
+ if (!this.dateOptions().customRangeLabel) {
415
+ return;
416
+ }
417
+ if (this.quickRangesArray().length) {
418
+ this.selectedQuickRange.set(this.dateOptions().customRangeLabel);
419
+ }
420
+ const date = side === SideEnum.left ? this.leftCalendar().calendar?.[row][col] : this.rightCalendar().calendar?.[row][col];
421
+ if (!date) {
422
+ return;
423
+ }
424
+ this.splitPickerDate.update(current => {
425
+ current[side === SideEnum.left ? 'start' : 'end'].update(sideCurrent => {
426
+ sideCurrent.day = date.date();
427
+ return sideCurrent;
428
+ });
429
+ return current;
430
+ });
431
+ this.updateStartEndDate(date);
432
+ if (this.isSingle() && this.startDate()) {
433
+ this.setEndDate(this.startDate());
434
+ this.updateElement();
435
+ if (this.autoApply()) {
436
+ this.handlerClickApply();
437
+ }
438
+ }
439
+ this.updateView();
440
+ if (this.autoApply() && this.startDate() && this.endDate()) {
441
+ this.handlerClickApply();
442
+ }
443
+ }
444
+ handlerClickApply(event) {
445
+ event?.stopPropagation();
446
+ // this.validate();
447
+ // if (!this.validate()) {
448
+ // return;
449
+ // }
450
+ if (this.hasTimePicker()) {
451
+ this.setTimeInput(SideEnum.left);
452
+ this.setTimeInput(SideEnum.right);
453
+ }
454
+ this.calculateSelectedLabel();
455
+ if (this.selectedLabel()) {
456
+ this.outPickerDate.emit({ displayLabel: this.selectedLabel(), startDate: this.startDate(), endDate: this.endDate(), detailDatePicker: this.splitPickerDate() });
457
+ }
458
+ }
459
+ handlerClickCancel(event) {
460
+ event.stopPropagation();
461
+ this.startDate.set(dayjs(0));
462
+ this.endDate.set(dayjs(0));
463
+ this.outCancel.emit('');
464
+ }
465
+ handlerFunctionControl(event, type) {
466
+ this.functionControls.set(type, event);
467
+ }
468
+ handlerSelectedDropdown(event, type) {
469
+ this.outChangStageFlagMouse.emit({
470
+ isMouseEnter: false,
471
+ isMouseEnterContent: false,
472
+ isContainerHasScroll: false
473
+ });
474
+ if (!event) {
475
+ return;
476
+ }
477
+ switch (type) {
478
+ case `${SideEnum.left}month`:
479
+ case `${SideEnum.right}month`:
480
+ this.updateMonthSelect(event, type);
481
+ break;
482
+ case `${SideEnum.left}year`:
483
+ case `${SideEnum.right}year`:
484
+ this.updateYearSelect(event, type);
485
+ break;
486
+ default:
487
+ break;
488
+ }
489
+ this.splitPickerDate.update(current => {
490
+ if (type === `${SideEnum.left}month` || type === `${SideEnum.left}year`) {
491
+ current.start.update(start => {
492
+ if (type === `${SideEnum.left}month`) {
493
+ start.month = event.key;
494
+ }
495
+ if (type === `${SideEnum.left}year`) {
496
+ start.year = event.key;
497
+ }
498
+ return start;
499
+ });
500
+ return current;
501
+ }
502
+ current.end.update(end => {
503
+ if (type === `${SideEnum.right}month`) {
504
+ end.month = event.key;
505
+ }
506
+ if (type === `${SideEnum.right}year`) {
507
+ end.year = event.key;
508
+ }
509
+ return end;
510
+ });
511
+ return current;
512
+ });
513
+ }
514
+ updateMonthSelect(event, type) {
515
+ const side = type.includes(SideEnum.left) ? SideEnum.left : SideEnum.right;
516
+ const year = this.calendarVariables()[side]().dropdowns?.()?.currentYear || dayjs().year();
517
+ const month = Number(event.key) - 1;
518
+ if (side === SideEnum.left) {
519
+ if (this.isSelectedData().leftmonth) {
520
+ this.isSelectedData.update(current => {
521
+ current.leftmonth = false;
522
+ return current;
523
+ });
524
+ this.getDisable('right');
525
+ return;
526
+ }
527
+ this.listKeyFromSelected.update(current => {
528
+ current.month = event.key;
529
+ return current;
530
+ });
531
+ if (Number(event.key) >= Number(this.listKeyFromSelected().month) && (Number(this.listKeyFromSelected().year) === Number(this.listKeyToSelected().year))) {
532
+ if (Number(event.key) <= 11) {
533
+ this.listKeyToSelected.update(current => {
534
+ current.month = Number(event.key) + 1;
535
+ return current;
536
+ });
537
+ }
538
+ if (Number(event.key) === 12) {
539
+ this.listKeyToSelected.update(current => {
540
+ current.month = 1;
541
+ current.year += 1;
542
+ return current;
543
+ });
544
+ }
545
+ }
546
+ }
547
+ if (side === SideEnum.right) {
548
+ if (this.isSelectedData().rightmonth) {
549
+ this.isSelectedData.update(current => {
550
+ current.rightmonth = false;
551
+ return current;
552
+ });
553
+ this.getDisable('right');
554
+ return;
555
+ }
556
+ this.listKeyToSelected.update(current => {
557
+ current.month = event.key;
558
+ return current;
559
+ });
560
+ }
561
+ this.functionControls.get(type)?.removeList();
562
+ this.getDisable('right');
563
+ this.monthOrYearChanged(month, year, side);
564
+ }
565
+ updateYearSelect(event, type) {
566
+ const side = type.includes(SideEnum.left) ? SideEnum.left : SideEnum.right;
567
+ if (side === SideEnum.left) {
568
+ if (this.isSelectedData()?.leftyear) {
569
+ this.isSelectedData.update(current => {
570
+ current.leftyear = false;
571
+ return current;
572
+ });
573
+ this.getDisable('left');
574
+ // this.SetListYearRight(this.listViewKeySelectedYear as number);
575
+ this.functionControls.get(type)?.removeList();
576
+ return;
577
+ }
578
+ this.listKeyFromSelected.update(current => {
579
+ current.year = event.key;
580
+ return current;
581
+ });
582
+ if (this.listKeyFromSelected().year && this.listKeyToSelected().year && (this.listKeyFromSelected().year >= this.listKeyToSelected().year)) {
583
+ this.listKeyToSelected.update(current => {
584
+ current.year = event.key;
585
+ return current;
586
+ });
587
+ if (this.listKeyFromSelected().month && Number(this.listKeyFromSelected().month) <= 11) {
588
+ this.listKeyToSelected.update(current => {
589
+ current.month = Number(this.listKeyFromSelected().month) + 1;
590
+ return current;
591
+ });
592
+ }
593
+ if (this.listKeyFromSelected().month && this.listKeyFromSelected().month === 12) {
594
+ this.listKeyToSelected.update(current => {
595
+ current.month = Number(this.listKeyFromSelected().month);
596
+ return current;
597
+ });
598
+ }
599
+ }
600
+ this.getDisable('left');
601
+ this.buildConfigYear(SideEnum.right, this.listKeyFromSelected().year);
602
+ this.functionControls.get(type)?.removeList();
603
+ }
604
+ if (side === SideEnum.right) {
605
+ if (this.isSelectedData().rightyear) {
606
+ this.isSelectedData.update(current => {
607
+ current.rightyear = false;
608
+ return current;
609
+ });
610
+ this.getDisable('right');
611
+ return;
612
+ }
613
+ this.listKeyToSelected.update(current => {
614
+ current.year = event.key;
615
+ return current;
616
+ });
617
+ if (this.listKeyFromSelected().year && this.listKeyToSelected().year && (this.listKeyFromSelected().year >= this.listKeyToSelected().year)) {
618
+ if (this.listKeyFromSelected().month && Number(this.listKeyFromSelected().month) <= 11) {
619
+ this.listKeyToSelected.update(current => {
620
+ current.month = Number(this.listKeyFromSelected().month) + 1;
621
+ return current;
622
+ });
623
+ }
624
+ if (this.listKeyFromSelected().month && this.listKeyFromSelected().month === 12) {
625
+ this.listKeyToSelected.update(current => {
626
+ current.month = Number(this.listKeyFromSelected().month);
627
+ return current;
628
+ });
629
+ }
630
+ }
631
+ }
632
+ this.getDisable('right');
633
+ let month = dayjs().month();
634
+ if (side === SideEnum.right && this.listKeyFromSelected().month) {
635
+ month = Number(this.listKeyFromSelected().month) - 1;
636
+ }
637
+ if (side === SideEnum.left && this.listKeyFromSelected().month) {
638
+ month = Number(this.listKeyFromSelected().month) - 1;
639
+ }
640
+ const year = Number(event.key);
641
+ this.monthOrYearChanged(month, year, side);
642
+ }
643
+ monthOrYearChanged(month, year, side) {
644
+ const isLeft = side === SideEnum.left;
645
+ const minDate = this.minDate();
646
+ const maxDate = this.maxDate();
647
+ if (minDate && (year < minDate?.year() || (year === minDate?.year() && month < minDate?.month()))) {
648
+ month = minDate?.month();
649
+ year = minDate?.year();
650
+ }
651
+ if (maxDate && (year > maxDate?.year() || (year === maxDate?.year() && month > maxDate?.month()))) {
652
+ month = maxDate?.month();
653
+ year = maxDate?.year();
654
+ }
655
+ const dropdowns = this.calendarVariables()[side]().dropdowns;
656
+ if (dropdowns?.()) {
657
+ dropdowns.update(current => {
658
+ current.currentYear = year;
659
+ current.currentMonth = month;
660
+ return current;
661
+ });
662
+ }
663
+ if (isLeft && this.leftCalendar().month) {
664
+ this.leftCalendar.update(current => {
665
+ current.month = current.month?.month(month).year(year);
666
+ return current;
667
+ });
668
+ return this.updateCalendars();
669
+ }
670
+ if (month === 12) {
671
+ this.rightCalendar.update(current => {
672
+ current.month = current.month?.clone().add(1, 'month');
673
+ return current;
674
+ });
675
+ return this.updateCalendars();
676
+ }
677
+ this.rightCalendar.update(current => {
678
+ current.month = current.month?.month(month).year(year);
679
+ return current;
680
+ });
681
+ this.updateCalendars();
682
+ }
683
+ handlerInputEvent(event, type) {
684
+ if (event.keyCode !== 8) {
685
+ event.keyCode && this.checkBackspaceFocus.update(current => {
686
+ current[type].set(1);
687
+ return current;
688
+ });
689
+ this.keyCodeBackspace.set(false);
690
+ return;
691
+ }
692
+ this.keyCodeBackspace.set(true);
693
+ switch (type) {
694
+ case 'leftminute':
695
+ if (isEmpty(this.timepickerValueItem().leftminute())) {
696
+ if (this.checkBackspaceFocus()[type]() === 1) {
697
+ this.checkBackspaceFocus.update(current => {
698
+ current[type].set(current[type]() + 1);
699
+ return current;
700
+ });
701
+ return;
702
+ }
703
+ this.checkBackspaceFocus.update(current => {
704
+ current[type].set(1);
705
+ return current;
706
+ });
707
+ this.functionControls.get(`${SideEnum.left}hour`)?.focus();
708
+ }
709
+ break;
710
+ case 'rightminute':
711
+ if (isEmpty(this.timepickerValueItem().rightminute())) {
712
+ if (this.checkBackspaceFocus()[type]() === 1) {
713
+ this.checkBackspaceFocus.update(current => {
714
+ current[type].set(current[type]() + 1);
715
+ return current;
716
+ });
717
+ return;
718
+ }
719
+ this.checkBackspaceFocus.update(current => {
720
+ current[type].set(1);
721
+ return current;
722
+ });
723
+ this.functionControls.get(`${SideEnum.right}hour`)?.focus();
724
+ }
725
+ break;
726
+ }
727
+ }
728
+ handlerFocusAndBlurTime(event, type) {
729
+ if (event.name === 'focus') {
730
+ return;
731
+ }
732
+ const eventInput = event.event;
733
+ const target = eventInput.target;
734
+ switch (type) {
735
+ case 'lefthour':
736
+ this.timepickerVariables().left.update(current => {
737
+ current.selectedHour = !isEmpty(this.timepickerValueItem().lefthour()) ? this.timepickerValueItem().lefthour() : 0;
738
+ return current;
739
+ });
740
+ if ((Number(this.timepickerValueItem().lefthour()) === 0) || isEmpty(this.timepickerValueItem().lefthour())) {
741
+ this.timepickerValueItem.update(current => {
742
+ current.lefthour.set(0);
743
+ return current;
744
+ });
745
+ target.value = '00';
746
+ break;
747
+ }
748
+ if (Number(this.timepickerValueItem().lefthour()) < 10) {
749
+ target.value = `0${Number(this.timepickerValueItem().lefthour())}`;
750
+ }
751
+ break;
752
+ case 'righthour':
753
+ this.timepickerVariables().right.update(current => {
754
+ current.selectedHour = !isEmpty(this.timepickerValueItem().righthour()) ? this.timepickerValueItem().righthour() : 0;
755
+ return current;
756
+ });
757
+ if ((Number(this.timepickerValueItem().righthour()) === 0) || isEmpty(this.timepickerValueItem().righthour())) {
758
+ this.timepickerValueItem.update(current => {
759
+ current.righthour.set(0);
760
+ return current;
761
+ });
762
+ target.value = '00';
763
+ break;
764
+ }
765
+ if (Number(this.timepickerValueItem().righthour()) < 10) {
766
+ target.value = `0${Number(this.timepickerValueItem().righthour())}`;
767
+ }
768
+ break;
769
+ case 'leftminute':
770
+ this.timepickerVariables().left.update(current => {
771
+ current.selectedMinute = !isEmpty(this.timepickerValueItem().leftminute()) ? this.timepickerValueItem().leftminute() : 0;
772
+ return current;
773
+ });
774
+ if ((Number(this.timepickerValueItem().leftminute()) === 0) || isEmpty(this.timepickerValueItem().leftminute())) {
775
+ this.timepickerValueItem.update(current => {
776
+ current.leftminute.set(0);
777
+ return current;
778
+ });
779
+ target.value = '00';
780
+ break;
781
+ }
782
+ if (Number(this.timepickerValueItem().leftminute()) < 10) {
783
+ target.value = `0${Number(this.timepickerValueItem().leftminute())}`;
784
+ }
785
+ break;
786
+ case 'rightminute':
787
+ this.timepickerVariables().right.update(current => {
788
+ current.selectedMinute = !isEmpty(this.timepickerValueItem().rightminute()) ? this.timepickerValueItem().rightminute() : 0;
789
+ return current;
790
+ });
791
+ if ((Number(this.timepickerValueItem().rightminute()) === 0) || isEmpty(this.timepickerValueItem().rightminute())) {
792
+ this.timepickerValueItem.update(current => {
793
+ current.rightminute.set(0);
794
+ return current;
795
+ });
796
+ target.value = '00';
797
+ break;
798
+ }
799
+ if (Number(this.timepickerValueItem().rightminute()) < 10) {
800
+ target.value = `0${Number(this.timepickerValueItem().rightminute())}`;
801
+ }
802
+ break;
803
+ }
804
+ }
805
+ handlerChangeTimeValue(event, type) {
806
+ this.timepickerValueItem.update(current => {
807
+ current[type].set(event);
808
+ return current;
809
+ });
810
+ const side = type.includes(SideEnum.left) ? SideEnum.left : SideEnum.right;
811
+ const attr = type.includes('hour') ? 'hour' : 'minute';
812
+ this.splitPickerDate.update(current => {
813
+ current[side === SideEnum.left ? 'start' : 'end'].update(sideCurrent => {
814
+ sideCurrent[attr] = event;
815
+ return sideCurrent;
816
+ });
817
+ return current;
818
+ });
819
+ if ((type !== 'lefthour' && type !== 'righthour') || event === undefined) {
820
+ this.isZero.set(false);
821
+ return;
822
+ }
823
+ if ((`${event}`.length === 2) || (Number(event) > 2) || (Number(event) <= 2 && Number(event) > 0 && this.isZero()) || (this.isZero() && !this.keyCodeBackspace())) {
824
+ this.isZero.set(false);
825
+ this.functionControls.get(type === 'lefthour' ? `${SideEnum.left}minute` : `${SideEnum.right}minute`)?.focus();
826
+ return;
827
+ }
828
+ if (Number(event) === 0 && !this.keyCodeBackspace()) {
829
+ this.isZero.set(true);
830
+ return;
831
+ }
832
+ }
833
+ handlerShowListDropdown(event, type) {
834
+ this.checkShowListDropdown.update((current) => {
835
+ current[type] = event;
836
+ return current;
837
+ });
838
+ }
839
+ convertItemMonth = (item) => {
840
+ if (!item) {
841
+ return '';
842
+ }
843
+ set(item, 'labelDisplay', this.translate.instant(item.label || ' ', { year: '' }));
844
+ return item;
845
+ };
846
+ convertItemYear = (item) => {
847
+ if (!item) {
848
+ return '';
849
+ }
850
+ item.labelDisplay = this.translate.instant('i18n_year_param', { year: item.label });
851
+ return item;
852
+ };
853
+ updateMonthsInView() {
854
+ if (this.endDate()) {
855
+ if (!this.isSingle() && this.leftCalendar().month && this.rightCalendar().month &&
856
+ ((this.leftCalendar() && this.startDate()?.format('YYYY-MM') === this.leftCalendar().month?.format('YYYY-MM')) || (this.rightCalendar() && this.startDate()?.format('YYYY-MM') === this.rightCalendar().month?.format('YYYY-MM')))
857
+ && (this.endDate()?.format('YYYY-MM') === this.leftCalendar().month?.format('YYYY-MM') || this.endDate()?.format('YYYY-MM') === this.rightCalendar().month?.format('YYYY-MM'))) {
858
+ return;
859
+ }
860
+ if (this.startDate()) {
861
+ this.leftCalendar.update(current => {
862
+ current.month = this.startDate()?.clone()?.date(2);
863
+ return current;
864
+ });
865
+ if (this.endDate()?.month() !== this.startDate()?.month() || this.endDate()?.year() !== this.startDate()?.year()) {
866
+ this.rightCalendar.update(current => {
867
+ current.month = this.endDate()?.clone()?.date(2);
868
+ return current;
869
+ });
870
+ return;
871
+ }
872
+ this.rightCalendar.update(current => {
873
+ current.month = this.startDate()?.clone()?.date(2)?.add(1, 'month');
874
+ return current;
875
+ });
876
+ }
877
+ }
878
+ if (this.startDate() && this.leftCalendar().month && this.rightCalendar().month && this.leftCalendar().month?.format('YYYY-MM') !== this.startDate()?.format('YYYY-MM') && this.rightCalendar().month?.format('YYYY-MM') !== this.startDate()?.format('YYYY-MM')) {
879
+ this.leftCalendar.update(current => {
880
+ current.month = this.startDate()?.clone()?.date(2);
881
+ return current;
882
+ });
883
+ this.rightCalendar.update(current => {
884
+ current.month = this.startDate()?.clone()?.date(2)?.add(1, 'month');
885
+ return current;
886
+ });
887
+ }
888
+ }
889
+ setTimeInput(side) {
890
+ const hour = parseInt(`${this.timepickerVariables()[side]().selectedHour}`);
891
+ const minute = parseInt(`${this.timepickerVariables()[side]().selectedMinute}`);
892
+ if (side === SideEnum.left && this.startDate()) {
893
+ let start = this.startDate()?.clone();
894
+ start = start?.hour(hour);
895
+ start = start?.minute(minute);
896
+ this.setStartDate(start);
897
+ if (this.isSingle()) {
898
+ this.endDate.set(this.startDate()?.clone());
899
+ }
900
+ if (this.endDate() && this.endDate()?.format('YYYY-MM-DD') === start?.format('YYYY-MM-DD') && this.endDate()?.isBefore(start)) {
901
+ this.setEndDate(start?.clone());
902
+ }
903
+ if (!this.endDate() && start && this.hasTimePicker()) {
904
+ const startClone = this.getDateWithTime(start, SideEnum.right);
905
+ if (startClone.isBefore(start)) {
906
+ this.timepickerVariables()[SideEnum.right].update(current => {
907
+ current.selectedHour = hour;
908
+ current.selectedMinute = minute;
909
+ return current;
910
+ });
911
+ }
912
+ }
913
+ return;
914
+ }
915
+ if (this.endDate()) {
916
+ let end = this.endDate()?.clone();
917
+ end = end?.hour(hour);
918
+ end = end?.minute(minute);
919
+ this.setEndDate(end);
920
+ }
921
+ this.updateCalendars();
922
+ this.renderTimePicker(SideEnum.left);
923
+ this.renderTimePicker(SideEnum.right);
924
+ }
925
+ updateCalendars() {
926
+ this.renderCalendar(SideEnum.left);
927
+ this.renderCalendar(SideEnum.right);
928
+ if (this.endDate() === null) {
929
+ return;
930
+ }
931
+ this.calculateSelectedLabel();
932
+ }
933
+ renderCalendar(side) {
934
+ const mainCalendar = (side === SideEnum.left) ? this.leftCalendar() : this.rightCalendar();
935
+ if (!mainCalendar.month || (this.dateOptions().firstDay === undefined || this.dateOptions().firstDay === undefined)) {
936
+ return;
937
+ }
938
+ const month = mainCalendar.month.month();
939
+ const year = mainCalendar.month.year();
940
+ const hour = mainCalendar.month.hour();
941
+ const minute = mainCalendar.month.minute();
942
+ const second = mainCalendar.month.second();
943
+ const daysInMonth = dayjs(new Date(year, month)).daysInMonth();
944
+ const firstDay = dayjs(new Date(year, month, 1));
945
+ const lastDay = dayjs(new Date(year, month, daysInMonth));
946
+ const lastMonth = dayjs(firstDay).subtract(1, 'month').month();
947
+ const lastYear = dayjs(firstDay).subtract(1, 'month').year();
948
+ const daysInLastMonth = dayjs(new Date(lastYear, lastMonth)).daysInMonth();
949
+ const dayOfWeek = firstDay.day();
950
+ const calendar = {};
951
+ calendar.firstDay = firstDay;
952
+ calendar.lastDay = lastDay;
953
+ for (let i = 0; i < 6; i++) {
954
+ calendar[i] = [];
955
+ }
956
+ let startDay = daysInLastMonth - dayOfWeek + (this.dateOptions().firstDay ?? 1) + 1;
957
+ if (startDay > daysInLastMonth) {
958
+ startDay -= 7;
959
+ }
960
+ if (dayOfWeek === this.dateOptions().firstDay) {
961
+ startDay = daysInLastMonth - 6;
962
+ }
963
+ let curDate = dayjs(new Date(lastYear, lastMonth, startDay, 12, minute, second));
964
+ for (let i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = dayjs(curDate).add(24, 'hour')) {
965
+ if (i > 0 && col % 7 === 0) {
966
+ col = 0;
967
+ row++;
968
+ }
969
+ calendar[row][col] = curDate.clone().hour(hour).minute(minute).second(second);
970
+ curDate = curDate.hour(12);
971
+ const minDate = this.minDate();
972
+ const maxDate = this.maxDate();
973
+ if (minDate && calendar[row][col].format('YYYY-MM-DD') === minDate?.format('YYYY-MM-DD') && calendar[row][col].isBefore(minDate) && side === 'left') {
974
+ calendar[row][col] = minDate?.clone();
975
+ }
976
+ if (maxDate && calendar[row][col].format('YYYY-MM-DD') === maxDate?.format('YYYY-MM-DD') && calendar[row][col].isAfter(maxDate) && side === 'right') {
977
+ calendar[row][col] = maxDate?.clone();
978
+ }
979
+ }
980
+ if (side === SideEnum.left) {
981
+ this.leftCalendar.update(current => {
982
+ current.calendar = calendar;
983
+ return current;
984
+ });
985
+ }
986
+ if (side === SideEnum.right) {
987
+ this.rightCalendar.update(current => {
988
+ current.calendar = calendar;
989
+ return current;
990
+ });
991
+ }
992
+ const minDate = side === 'left' ? this.minDate() : this.startDate();
993
+ const maxDate = this.maxDate();
994
+ this.calendarVariables()[side].set({
995
+ month: month,
996
+ year: year,
997
+ hour: hour,
998
+ minute: minute,
999
+ second: second,
1000
+ daysInMonth: daysInMonth,
1001
+ firstDay: firstDay,
1002
+ lastDay: lastDay,
1003
+ lastMonth: lastMonth,
1004
+ lastYear: lastYear,
1005
+ daysInLastMonth: daysInLastMonth,
1006
+ dayOfWeek: dayOfWeek,
1007
+ calRows: signal(Array.from(Array(6).keys())),
1008
+ calCols: signal(Array.from(Array(7).keys())),
1009
+ classes: {},
1010
+ minDate: minDate,
1011
+ maxDate: maxDate,
1012
+ calendar: calendar,
1013
+ dropdowns: signal({})
1014
+ });
1015
+ if (this.showDropdownsSelect()) {
1016
+ const currentMonth = calendar[1][1].month();
1017
+ const currentYear = calendar[1][1].year();
1018
+ const maxYear = (maxDate && maxDate?.year()) || DEFAULT_MAX_YEAR;
1019
+ const minYear = (minDate && minDate?.year()) || DEFAULT_MIN_YEAR;
1020
+ const inMinYear = currentYear === minYear;
1021
+ const inMaxYear = currentYear === maxYear;
1022
+ const years = [];
1023
+ for (let y = minYear; y <= maxYear; y++) {
1024
+ years.push(y);
1025
+ }
1026
+ this.calendarVariables()[side]().dropdowns?.set({
1027
+ currentMonth: currentMonth,
1028
+ currentYear: currentYear,
1029
+ maxYear: maxYear,
1030
+ minYear: minYear,
1031
+ inMinYear: inMinYear,
1032
+ inMaxYear: inMaxYear,
1033
+ monthArrays: signal(Array.from(Array(12).keys())),
1034
+ yearArrays: signal(years)
1035
+ });
1036
+ }
1037
+ this.buildCells(calendar, side);
1038
+ }
1039
+ buildCells(calendar, side) {
1040
+ for (let row = 0; row < 6; row++) {
1041
+ const classless = this.calendarVariables()[side]();
1042
+ if (classless.classes) {
1043
+ classless.classes[row] = {};
1044
+ }
1045
+ for (let col = 0; col < 7; col++) {
1046
+ const classes = [];
1047
+ const startDate = this.startDate();
1048
+ const endDate = this.endDate();
1049
+ const nowHoveredDate = this.nowHoveredDate();
1050
+ if (calendar[row][col].isSame(new Date(), 'day')) {
1051
+ classes.push('today');
1052
+ }
1053
+ if (calendar[row][col].isoWeekday() > 5) {
1054
+ classes.push('weekend');
1055
+ }
1056
+ if (calendar[row][col].month() !== calendar[1][1].month()) {
1057
+ classes.push('off');
1058
+ }
1059
+ if (this.minDate() && calendar[row][col].isBefore(this.minDate(), 'day')) {
1060
+ classes.push('off', 'disabled');
1061
+ }
1062
+ if (this.calendarVariables()[side]().maxDate && calendar[row][col].isAfter(this.calendarVariables()[side]().maxDate, 'day')) {
1063
+ classes.push('off', 'disabled');
1064
+ }
1065
+ if (startDate && calendar[row][col].format('YYYY-MM-DD') === startDate?.format('YYYY-MM-DD')) {
1066
+ classes.push('active', 'start-date');
1067
+ }
1068
+ if (endDate !== null && calendar[row][col].format('YYYY-MM-DD') === endDate?.format('YYYY-MM-DD')) {
1069
+ classes.push('active', 'end-date');
1070
+ }
1071
+ if (startDate && calendar[row][col].format('YYYY-MM-DD') === startDate?.format('YYYY-MM-DD') && (!endDate || endDate !== null && calendar[row][col].format('YYYY-MM-DD') === endDate?.format('YYYY-MM-DD'))) {
1072
+ classes.push('active', 'full-date');
1073
+ }
1074
+ if (startDate && endDate && ((nowHoveredDate !== null && this.pickingDate()) || endDate !== null) && (calendar[row][col] > startDate && (calendar[row][col] < endDate || (nowHoveredDate && calendar[row][col] < nowHoveredDate && this.pickingDate())))) {
1075
+ classes.push(!classes.find(el => el === 'off') ? 'in-range' : 'focus-off');
1076
+ }
1077
+ let cname = '', disabled = false;
1078
+ for (let i = 0; i < classes.length; i++) {
1079
+ cname += classes[i] + ' ';
1080
+ if (classes[i] === 'disabled') {
1081
+ disabled = true;
1082
+ }
1083
+ ;
1084
+ }
1085
+ if (!disabled) {
1086
+ cname += 'available';
1087
+ }
1088
+ if (classless.classes) {
1089
+ classless.classes[row][col] = cname.replace(/^\s+|\s+$/g, '');
1090
+ }
1091
+ }
1092
+ }
1093
+ }
1094
+ renderTimePicker(side) {
1095
+ let selected = dayjs(), minDate;
1096
+ const maxDate = this.maxDate();
1097
+ const startDate = this.startDate();
1098
+ const endDate = this.endDate();
1099
+ if (side === SideEnum.left && startDate) {
1100
+ selected = startDate.clone();
1101
+ minDate = this.maxDate();
1102
+ }
1103
+ if (side === SideEnum.right && endDate) {
1104
+ selected = endDate.clone();
1105
+ minDate = this.startDate();
1106
+ }
1107
+ if (side === SideEnum.right && !endDate) {
1108
+ if (!startDate) {
1109
+ return;
1110
+ }
1111
+ selected = this.getDateWithTime(startDate, SideEnum.right);
1112
+ if (selected.isBefore(startDate)) {
1113
+ selected = startDate.clone();
1114
+ }
1115
+ minDate = startDate;
1116
+ }
1117
+ const start = 0;
1118
+ const end = 23;
1119
+ this.timepickerVariables()[side].set({
1120
+ hours: [],
1121
+ minutes: [],
1122
+ minutesLabel: [],
1123
+ seconds: [],
1124
+ secondsLabel: [],
1125
+ disabledHours: [],
1126
+ disabledMinutes: [],
1127
+ disabledSeconds: [],
1128
+ selectedHour: 0,
1129
+ selectedMinute: 0,
1130
+ selectedSecond: 0,
1131
+ });
1132
+ for (let i = start; i <= end; i++) {
1133
+ const i_in_24 = i;
1134
+ const time = selected.clone().hour(i_in_24);
1135
+ let disabled = false;
1136
+ if (minDate && time.minute(59).isBefore(minDate)) {
1137
+ disabled = true;
1138
+ }
1139
+ if (maxDate && time.minute(0).isAfter(maxDate)) {
1140
+ disabled = true;
1141
+ }
1142
+ this.timepickerVariables()[side].update(current => {
1143
+ current.hours?.push(i);
1144
+ if (i_in_24 === selected.hour() && !disabled) {
1145
+ current.selectedHour = i;
1146
+ }
1147
+ if (disabled) {
1148
+ current.disabledHours?.push(i);
1149
+ }
1150
+ return current;
1151
+ });
1152
+ }
1153
+ for (let i = 0; i < 60; i += this.timePickerIncrement()) {
1154
+ const padded = i < 10 ? '0' + i : `${i}`;
1155
+ const time = selected.clone().minute(i);
1156
+ let disabled = false;
1157
+ if (minDate && time.second(59).isBefore(minDate)) {
1158
+ disabled = true;
1159
+ }
1160
+ if (maxDate && time.second(0).isAfter(maxDate)) {
1161
+ disabled = true;
1162
+ }
1163
+ this.timepickerVariables()[side].update(current => {
1164
+ current.minutes?.push(i);
1165
+ current.minutesLabel?.push(padded);
1166
+ if (selected.minute() === i && !disabled) {
1167
+ current.selectedMinute = i;
1168
+ }
1169
+ if (disabled) {
1170
+ current.disabledMinutes?.push(i);
1171
+ }
1172
+ return current;
1173
+ });
1174
+ }
1175
+ this.timepickerVariables()[side].update(current => {
1176
+ current.selected = selected;
1177
+ return current;
1178
+ });
1179
+ }
1180
+ updateElement() {
1181
+ if (this.isSingle() && this.startDate()) {
1182
+ this.selectedLabel.set(this.startDate()?.format('DD/MM/YYYY'));
1183
+ return;
1184
+ }
1185
+ if (this.startDate() && this.endDate()) {
1186
+ // if we use ranges and should show range label on input
1187
+ if (this.quickRangesArray().length && this.showRangeLabelOnInput() && this.selectedQuickRange() && this.dateOptions().customRangeLabel !== this.selectedQuickRange()) {
1188
+ this.selectedLabel.set(this.selectedQuickRange());
1189
+ return;
1190
+ }
1191
+ this.selectedLabel.set(`${this.startDate()?.format('DD/MM/YYYY')}${this.dateOptions().separator}${this.endDate()?.format('DD/MM/YYYY')}`);
1192
+ }
1193
+ }
1194
+ updateView() {
1195
+ if (this.hasTimePicker()) {
1196
+ this.renderTimePicker(SideEnum.left);
1197
+ this.renderTimePicker(SideEnum.right);
1198
+ }
1199
+ this.updateMonthsInView();
1200
+ this.updateCalendars();
1201
+ }
1202
+ getDateWithTime(date, side) {
1203
+ const hour = parseInt(`${this.timepickerVariables()[side]().selectedHour}`, 10);
1204
+ const minute = parseInt(`${this.timepickerVariables()[side]().selectedMinute}`, 10);
1205
+ const second = this.hasSecondPicker() && !isEmpty(this.timepickerVariables()[side]().selectedSecond) ? parseInt(`${this.timepickerVariables()[side]().selectedSecond}`, 10) : 0;
1206
+ return date.clone().hour(hour).minute(minute).second(second);
1207
+ }
1208
+ transformMinMaxDate(value) {
1209
+ if (isEmpty(value)) {
1210
+ return undefined;
1211
+ }
1212
+ if (dayjs.isDayjs(value)) {
1213
+ return value;
1214
+ }
1215
+ if (typeof value === 'string') {
1216
+ return dayjs(value);
1217
+ }
1218
+ return undefined;
1219
+ }
1220
+ computedDisplayTime(side) {
1221
+ let strHours = side.selectedHour;
1222
+ let strMinute = side.selectedMinute;
1223
+ if ((side.selectedHour || 0) < 10) {
1224
+ strHours = `0${side.selectedHour ?? 0}`;
1225
+ }
1226
+ if ((side.selectedMinute || 0) < 10) {
1227
+ strMinute = `0${side.selectedMinute ?? 0}`;
1228
+ }
1229
+ return `${strHours}:${strMinute}`;
1230
+ }
1231
+ computedDisplayTimeInput(side, timeType) {
1232
+ const time = timeType === 'hour' ? (side === SideEnum.left ? this.timepickerValueItem().lefthour() : this.timepickerValueItem().righthour()) : (side === SideEnum.left ? this.timepickerValueItem().leftminute() : this.timepickerValueItem().rightminute());
1233
+ if (!time) {
1234
+ return '00';
1235
+ }
1236
+ if (time < 10) {
1237
+ return `0${time}`;
1238
+ }
1239
+ return time;
1240
+ }
1241
+ ngOnDestroy() {
1242
+ console.log('ngOnDestroy');
1243
+ }
1244
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsDatetimePickerCustomRangesCalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1245
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsDatetimePickerCustomRangesCalendarComponent, isStandalone: true, selector: "libs_ui-components-datetime-picker-custom_ranges-calendar", inputs: { quickRangesArray: { classPropertyName: "quickRangesArray", publicName: "quickRangesArray", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, isSingle: { classPropertyName: "isSingle", publicName: "isSingle", isSignal: true, isRequired: false, transformFunction: null }, showDropdownsSelect: { classPropertyName: "showDropdownsSelect", publicName: "showDropdownsSelect", isSignal: true, isRequired: false, transformFunction: null }, hasTimePicker: { classPropertyName: "hasTimePicker", publicName: "hasTimePicker", isSignal: true, isRequired: false, transformFunction: null }, flagMouse: { classPropertyName: "flagMouse", publicName: "flagMouse", isSignal: true, isRequired: false, transformFunction: null }, dateOptions: { classPropertyName: "dateOptions", publicName: "dateOptions", isSignal: true, isRequired: false, transformFunction: null }, autoApply: { classPropertyName: "autoApply", publicName: "autoApply", isSignal: true, isRequired: false, transformFunction: null }, hasSecondPicker: { classPropertyName: "hasSecondPicker", publicName: "hasSecondPicker", isSignal: true, isRequired: false, transformFunction: null }, showRangeLabelOnInput: { classPropertyName: "showRangeLabelOnInput", publicName: "showRangeLabelOnInput", isSignal: true, isRequired: false, transformFunction: null }, startDate: { classPropertyName: "startDate", publicName: "startDate", isSignal: true, isRequired: false, transformFunction: null }, endDate: { classPropertyName: "endDate", publicName: "endDate", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { startDate: "startDateChange", endDate: "endDateChange", outChangStageFlagMouse: "outChangStageFlagMouse", outPickerDate: "outPickerDate", outCancel: "outCancel", outUpdateWidth: "outUpdateWidth", outFunctionsControl: "outFunctionsControl" }, viewQueries: [{ propertyName: "pickerContainer", first: true, predicate: ["pickerContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"libs-ui-component-custom_ranges-calendar test-class\">\n <div class=\"relative flex\">\n <div class=\"libs-ui-component-custom_ranges-calendar\"\n [class.right]=\"isSingle()\"\n [class.left]=\"!isSingle()\">\n <div class=\"rounded-[4px] bg-[#ffffff]\">\n @if (calendarVariables(); as calendarVariables) {\n <table>\n <thead>\n <tr>\n <th colspan=\"7\"\n class=\"month\">\n @if (showDropdownsSelect() && calendarVariables.left().dropdowns?.()) {\n <div class=\"!flex mb-[10px] w-full\">\n <div class=\"w-3/4 flex items-center\">\n <div class='mr-[8px]'>\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true, classInclude: '!w-[130px]',position:{ mode:'center',distance:0}}\"\n [listMaxItemShow]=\"10\"\n [listClickExactly]=\"false\"\n [listKeysDisable]=\"disableMonth().left()\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemMonth\"\n [listConfig]=\"listMonthsConfig()\"\n [listKeySelected]=\"listKeyFromSelected().month\"\n [flagMouse]=\"flagMouse()\"\n [listHiddenInputSearch]=\"true\"\n [httpRequestDetailItemById]=\"monthHttpDetailConfig()\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.left + 'month')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'month')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.left + 'month')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'month']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.left + 'month']\">\n <div class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dateOptions().monthNames && calendarVariables.left().calendar && dateOptions().monthNames[calendarVariables.left().calendar?.[1]?.[1]?.month() ?? -1] }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'month']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.left + 'month'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n <div>\n <libs_ui-components-dropdown [listMaxItemShow]=\"10\"\n [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true,classInclude: '!w-[110px]',position:{mode:'center',distance:0}}\"\n [listClickExactly]=\"false\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemYear\"\n [listHiddenInputSearch]=\"true\"\n [listConfig]=\"listLeftYearConfig()\"\n [listKeySelected]=\"listKeyFromSelected().year\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"leftYearHttpDetailConfig()\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.left + 'year')\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.left + 'year')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'year')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'year']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.left + 'year']\">\n <div class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">{{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[1]?.[1]?.format(\" YYYY\") }}</div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'year']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.left + 'year'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n </div>\n\n <div class=\"w-1/4 flex items-center relative\">\n @if (!calendarVariables.left().minDate || (calendarVariables.left().minDate?.isBefore(calendarVariables.left().calendar && calendarVariables.left().calendar?.firstDay))) {\n <div (click)=\"handlerClickPrev(sideEnum.left)\">\n <div class=\"flex items-center justify-center absolute left-0 top-[-3px]\">\n <i class=\"libs-ui-icon-chevron-right rotate-[180deg] text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n @if ((!calendarVariables.left().maxDate || calendarVariables.left().maxDate?.isAfter(calendarVariables.left().calendar && calendarVariables.left().calendar?.lastDay)) && isSingle()) {\n <div (click)=\"handlerClickNext(sideEnum.left)\">\n <div class=\"flex items-center justify-center ml-[12px] absolute right-0 top-[-3px]\">\n <i class=\"libs-ui-icon-chevron-right text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (!showDropdownsSelect() || !calendarVariables.left().dropdowns) {\n {{ dateOptions().monthNames && calendarVariables.left().calendar && dateOptions().monthNames[calendarVariables.left().calendar?.[1]?.[1]?.month() ?? -1] }}\n {{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[1]?.[1]?.format(\" YYYY\") }}\n }\n </th>\n </tr>\n <tr class=\"week-days\">\n @for (dayofweek of dateOptions().daysOfWeek; track dayofweek) {\n <th>\n <span class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">{{ dayofweek }}</span>\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"drp-animate\">\n @for (row of calendarVariables.left().calRows?.(); track row) {\n <tr class=\"h-[32px]\"\n [class]=\"calendarVariables.left().classes && calendarVariables.left().classes?.[row]?.classList\">\n @for (col of calendarVariables.left().calCols?.(); track col) {\n <td class=\"libs-ui-font-h5r\"\n [class.today]=\"calendarVariables.left().calendar && calendarVariables.left().calendar?.[row]?.[col]?.date() === today().date() && calendarVariables.left().calendar?.[row]?.[col]?.month() === today().month() && calendarVariables.left().calendar?.[row]?.[col]?.year() === today().year()\"\n [class]=\"calendarVariables.left().classes && calendarVariables.left().classes?.[row]?.[col]\"\n (click)=\"handlerPickerDate($event, sideEnum.left, row, col)\"\n (mouseenter)=\"handlerHoverDate($event, sideEnum.left, row, col)\">\n <span class=\"libs-ui-font-h5r\">{{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[row]?.[col]?.date() }}</span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n @if (hasTimePicker()) {\n <div>\n <div class=\"flex justify-center column items-center pt-[12px]\">\n <div class=\"w-full flex justify-center items-center rounded-[4px] border\"\n [class.border-[#e6e8ed]]=\"!timePickerError()\"\n [class.border-[#ff5454]]=\"timePickerError()\">\n <libs_ui-components-inputs-input classInclude=\"!w-[30px] !p-0 !border-none !text-center libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"23\"\n [minValueNumber]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().lefthour()\"\n (outInputEvent)=\"handlerInputEvent($event, 'lefthour')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'hour')\"\n (outChange)=\"handlerChangeTimeValue($event, 'lefthour')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'lefthour')\" />\n <span class=\"libs-ui-font-h3s text-[#333333]\">:</span>\n <libs_ui-components-inputs-input classInclude=\"!w-[30px] !p-0 !border-none !text-center !libs-ui-font-h4s !text-[#071631]\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n dataType=\"int\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxValueNumber]=\"59\"\n [minValueNumber]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().leftminute()\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'minute')\"\n (outInputEvent)=\"handlerInputEvent($event, 'leftminute')\"\n (outChange)=\"handlerChangeTimeValue($event, 'leftminute')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'leftminute')\" />\n </div>\n </div>\n </div>\n }\n </div>\n\n @if (!isSingle()) {\n <div class=\"libs-ui-component-custom_ranges-calendar right ml-[24px]\">\n <div class=\"rounded-[4px] bg-[#ffffff]\">\n @if (calendarVariables()) {\n <table>\n <thead>\n <tr>\n <th colspan=\"7\"\n class=\"month\">\n @if (showDropdownsSelect() && calendarVariables().left().dropdowns?.()) {\n <div class=\"!flex mb-[10px] w-full\">\n <div class=\"w-3/4 flex items-center\">\n <div class='mr-[8px]'>\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true,classInclude: '!w-[130px]',position:{mode:'center',distance:0}}\"\n [listMaxItemShow]=\"10\"\n [listClickExactly]=\"false\"\n [listKeysDisable]=\"disableMonth().right()\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemMonth\"\n [listHiddenInputSearch]=\"true\"\n [listConfig]=\"listMonthsConfig()\"\n [listKeySelected]=\"listKeyToSelected().month\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"monthHttpDetailConfig()\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.right + 'month')\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.right + 'month')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.right + 'month')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'month']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.right + 'month']\">\n <div class=\"libs-ui-font-h4m\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'month']\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dateOptions().monthNames && calendarVariables().right().calendar && dateOptions().monthNames[ calendarVariables().right().calendar?.[1]?.[1]?.month() ?? -1] }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.right + 'month'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n <div>\n <libs_ui-components-dropdown [listMaxItemShow]=\"10\"\n [zIndex]=\"zIndex() + 1\"\n [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true, classInclude: '!w-[110px]', position:{mode:'center', distance:0}}\"\n [listClickExactly]=\"false\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemYear\"\n [listHiddenInputSearch]=\"true\"\n [listConfig]=\"listRightYearConfig()\"\n [listKeySelected]=\"listKeyToSelected().year\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"rightYearHttpDetailConfig()\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.right + 'year')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.right + 'year')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.right + 'year')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'year']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.right + 'year']\">\n <div class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ calendarVariables().right().calendar && calendarVariables().right().calendar?.[1]?.[1]?.format(\"YYYY\") }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'year']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.right + 'year'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n </div>\n <div class=\"w-1/4 flex items-center relative\">\n @if (listKeyFromSelected().year && listKeyToSelected().year && !(((listKeyFromSelected().year +1) === listKeyToSelected().year) && (listKeyFromSelected().month === 12) && listKeyToSelected().month === 1)&& (listKeyFromSelected().year < listKeyToSelected().year) || listKeyFromSelected().month && listKeyToSelected().month && ((listKeyFromSelected().month + 1) < +listKeyToSelected().month)) {\n <div class=\"flex items-center justify-center absolute left-0 top-[-3px]\"\n (click)=\"handlerClickPrev(sideEnum.right)\">\n <i class=\"libs-ui-icon-chevron-right rotate-[180deg] text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n }\n @if (listKeyFromSelected().month && listKeyToSelected().month && (listKeyFromSelected().month > listKeyToSelected().month) && listKeyFromSelected().year && listKeyToSelected().year && (listKeyFromSelected().year === listKeyToSelected().year )) {\n <div class=\"bg-[#ffffff] w-[21px] h-[21px] cursor-none flex items-center justify-center rounded-[50px]\">\n </div>\n }\n @if (!calendarVariables().right().maxDate || (calendarVariables().right().maxDate?.isAfter(calendarVariables().right().calendar && calendarVariables().right().calendar?.lastDay))) {\n <div (click)=\"handlerClickNext(sideEnum.right)\">\n <div class=\"flex items-center justify-center ml-[12px] absolute right-0 top-[-3px]\">\n <i class=\"libs-ui-icon-chevron-right text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (!showDropdownsSelect() || !calendarVariables().right().dropdowns) {\n {{ dateOptions().monthNames && calendarVariables().right().calendar && dateOptions().monthNames[calendarVariables().right().calendar?.[1]?.[1]?.month() ?? -1] }}\n {{ calendarVariables().right().calendar && calendarVariables().right().calendar?.[1]?.[1]?.format(\"YYYY\") }}\n }\n </th>\n </tr>\n <tr class=\"week-days\">\n @for (dayofweek of dateOptions().daysOfWeek; track dayofweek) {\n <th>\n <span class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">{{ dayofweek }}</span>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of calendarVariables().right().calRows?.(); track row) {\n <tr class=\"h-[32px]\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.classList\">\n @for (col of calendarVariables().right().calCols?.(); track col) {\n <td class=\"libs-ui-font-h5r\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.[col]\"\n [class.today]=\"calendarVariables().right().calendar && calendarVariables().right().calendar?.[row]?.[col]?.date() === today().date() && calendarVariables().right().calendar?.[row]?.[col]?.month() === today().month() && calendarVariables().right().calendar &&calendarVariables().right().calendar?.[row]?.[col]?.year() === today().year()\"\n (click)=\"handlerPickerDate($event, sideEnum.right, row, col)\"\n (mouseenter)=\"handlerHoverDate($event, sideEnum.right, row, col)\">\n <span>{{ calendarVariables().right().calendar?.[row]?.[col]?.date() }}</span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n @if (hasTimePicker()) {\n <div>\n <div class=\"flex justify-center items-center pt-[12px]\">\n <div class=\"w-full flex justify-center items-center rounded-[4px] border\"\n [class.border-[#e6e8ed]]=\"!timePickerError()\"\n [class.border-[#ff5454]]=\"timePickerError()\">\n <libs_ui-components-inputs-input classInclude=\"!w-[30px] !p-0 !border-none !text-center !libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"23\"\n [minValueNumber]=\"0\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().righthour()\"\n (outChange)=\"handlerChangeTimeValue($event, 'righthour')\"\n (outInputEvent)=\"handlerInputEvent($event,'righthour')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, 'righthour')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'righthour')\" />\n <span class=\"libs-ui-font-h3s text-[#333333]\">:</span>\n <libs_ui-components-inputs-input classInclude=\"!w-[30px] !p-0 !border-none !text-center libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"59\"\n [minValueNumber]=\"0\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().rightminute()\"\n (outInputEvent)=\"handlerInputEvent($event,'rightminute')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, 'rightminute')\"\n (outChange)=\"handlerChangeTimeValue($event, 'rightminute')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'rightminute')\" />\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n </div>\n <div>\n <div class=\"flex w-full\">\n @if (!isSingle() && hasTimePicker()) {\n <div class=\"mt-[8px] libs-ui-font-h7r text-[#ff5454] h-[14px]\">\n @if (timePickerError()) {\n <span>{{ 'i18n_date_compare_start_end_message_error' | translate }}</span>\n }\n </div>\n }\n </div>\n @if (!quickRangesArray().length || !isSingle()) {\n <div class=\" flex w-full pt-[16px] justify-between\">\n <div class=\"flex items-center\">\n @if (!isSingle()) {\n @if (!endDate()) {\n <div class=\"text-[#cdd0d6] libs-ui-font-h6r\">\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeLeft() }}</span>\n }\n &hyphen;\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeRight() }}</span>\n }\n </div>\n }\n @if (endDate()) {\n <div class=\"text-[#cdd0d6] libs-ui-font-h6r\">\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeLeft() }}</span>\n }\n &hyphen;\n <span>{{ endDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeRight() }}</span>\n }\n </div>\n }\n }\n </div>\n\n <div class=\"flex\">\n <libs_ui-components-buttons-button class=\"mr-[12px]\"\n label=\"i18n_cancel\"\n type=\"button-third\"\n (outClick)=\"handlerClickCancel($event)\" />\n <libs_ui-components-buttons-button label=\"i18n_select\"\n (outClick)=\"handlerClickApply($event)\" />\n </div>\n </div>\n }\n </div>\n</div>\n", styles: [".libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown{display:flex;align-items:center}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover{color:var(--libs-ui-color-light-1)}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover i:before,.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover i:after{color:var(--libs-ui-color-light-1)!important}.libs-ui-component-custom_ranges-calendar table{border-collapse:inherit;border-spacing:0 2px}.libs-ui-component-custom_ranges-calendar th,.libs-ui-component-custom_ranges-calendar td{padding:0;text-align:center;min-width:32px}.libs-ui-component-custom_ranges-calendar th span,.libs-ui-component-custom_ranges-calendar td span{pointer-events:none}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover{color:var(--libs-ui-color-light-1)}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover i:before,.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover i:after{color:var(--libs-ui-color-light-1)!important}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:before{font-size:20px}.libs-ui-component-custom_ranges-calendar td,.libs-ui-component-custom_ranges-calendar th{cursor:pointer;height:2em;width:2em}.libs-ui-component-custom_ranges-calendar td.available:hover,.libs-ui-component-custom_ranges-calendar th.available:hover{background-color:#f8f5fe;border-color:transparent;border-radius:8px;color:inherit;background-repeat:no-repeat;background-size:.5em;background-position:center;margin:.25em 0;opacity:.8;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0ms}.libs-ui-component-custom_ranges-calendar td{margin:.25em 0;background-color:#fff;transition:background-color .2s ease;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0ms;color:#071631!important}.libs-ui-component-custom_ranges-calendar td:hover{color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.off,.libs-ui-component-custom_ranges-calendar td.off.in-range,.libs-ui-component-custom_ranges-calendar td.off.start-date,.libs-ui-component-custom_ranges-calendar td.off.end-date{background-color:#fff;border-color:transparent;color:#cdd0d6!important}.libs-ui-component-custom_ranges-calendar td.focus-off{background-color:#f8f5fe!important}.libs-ui-component-custom_ranges-calendar td.in-range{background-color:#f8f5fe;border-color:transparent;border-radius:0;color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.today{position:relative;color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.today:after{position:absolute;content:\"\";width:2px;height:2px;background-color:#8e61ee;left:49%;bottom:5px}.libs-ui-component-custom_ranges-calendar td.active{transition:background .3s ease-out;background:#0000001a}.libs-ui-component-custom_ranges-calendar td.active.today:after{position:absolute;content:\"\";background-color:#fff}.libs-ui-component-custom_ranges-calendar td.active.start-date{border-radius:8px 0 0 8px}.libs-ui-component-custom_ranges-calendar td.active.end-date{border-radius:0 8px 8px 0}.libs-ui-component-custom_ranges-calendar td.active.full-date{border-radius:8px}.libs-ui-component-custom_ranges-calendar td.active,.libs-ui-component-custom_ranges-calendar td.active:hover{background-color:#8e61ee;border-color:transparent;color:#fff!important}.libs-ui-component-custom_ranges-calendar th.month{width:auto}.libs-ui-component-custom_ranges-calendar td.disabled,.libs-ui-component-custom_ranges-calendar option.disabled{color:#999!important;cursor:not-allowed;text-decoration:line-through;background-color:#f4f5f7}.libs-ui-component-custom_ranges-calendar .dropdowns{background-repeat:no-repeat;background-size:10px;background-position-y:center;background-position-x:right}.libs-ui-component-custom_ranges-calendar th.month>div{position:relative;display:inline-block}@media (min-width: 564px){.libs-ui-component-custom_ranges{width:auto}}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsInputsInputComponent, selector: "libs_ui-components-inputs-input", inputs: ["tagInput", "dataType", "tabInsertContentTagInput", "textAreaEnterNotNewLine", "emitEmptyInDataTypeNumber", "keepZeroInTypeInt", "autoAddZeroLessThan10InTypeInt", "ignoreBlockInputMaxValue", "hiddenContent", "maxValueNumber", "minValueNumber", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "classInclude", "maxLength", "readonly", "disable", "noBorder", "backgroundNone", "borderError", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "value", "autoRemoveEmoji", "defaultHeight", "minHeightTextArea", "maxHeightTextArea", "focusTimeOut", "blurTimeOut", "zIndexPopoverContent", "classContainerInput", "showCount", "ignoreStopPropagationEvent", "resize", "templateLeftBottomInput", "templateRightBottomInput", "classContainerBottomInput", "ignoreWidthInput100", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "resetAutoCompletePassword", "acceptOnlyClickIcon", "setIconRightColorSameColorDisableReadOnly", "onlyAcceptNegativeValue", "maxLengthNumberCount", "focusInput"], outputs: ["maxValueNumberChange", "minValueNumberChange", "fixedFloatChange", "acceptNegativeValueChange", "maxLengthChange", "valueChange", "maxLengthNumberCountChange", "outHeightAreaChange", "outChange", "outFocusAndBlurEvent", "outEnterEvent", "outInputEvent", "outIconLeft", "outIconRight", "outFunctionsControl", "outFilesDrop", "outFileDrop", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1246
+ }
1247
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsDatetimePickerCustomRangesCalendarComponent, decorators: [{
1248
+ type: Component,
1249
+ args: [{ selector: 'libs_ui-components-datetime-picker-custom_ranges-calendar', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
1250
+ TranslateModule,
1251
+ LibsUiComponentsDropdownComponent,
1252
+ LibsUiComponentsInputsInputComponent,
1253
+ LibsUiComponentsButtonsButtonComponent
1254
+ ], template: "<div class=\"libs-ui-component-custom_ranges-calendar test-class\">\n <div class=\"relative flex\">\n <div class=\"libs-ui-component-custom_ranges-calendar\"\n [class.right]=\"isSingle()\"\n [class.left]=\"!isSingle()\">\n <div class=\"rounded-[4px] bg-[#ffffff]\">\n @if (calendarVariables(); as calendarVariables) {\n <table>\n <thead>\n <tr>\n <th colspan=\"7\"\n class=\"month\">\n @if (showDropdownsSelect() && calendarVariables.left().dropdowns?.()) {\n <div class=\"!flex mb-[10px] w-full\">\n <div class=\"w-3/4 flex items-center\">\n <div class='mr-[8px]'>\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true, classInclude: '!w-[130px]',position:{ mode:'center',distance:0}}\"\n [listMaxItemShow]=\"10\"\n [listClickExactly]=\"false\"\n [listKeysDisable]=\"disableMonth().left()\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemMonth\"\n [listConfig]=\"listMonthsConfig()\"\n [listKeySelected]=\"listKeyFromSelected().month\"\n [flagMouse]=\"flagMouse()\"\n [listHiddenInputSearch]=\"true\"\n [httpRequestDetailItemById]=\"monthHttpDetailConfig()\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.left + 'month')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'month')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.left + 'month')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'month']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.left + 'month']\">\n <div class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dateOptions().monthNames && calendarVariables.left().calendar && dateOptions().monthNames[calendarVariables.left().calendar?.[1]?.[1]?.month() ?? -1] }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'month']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.left + 'month'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n <div>\n <libs_ui-components-dropdown [listMaxItemShow]=\"10\"\n [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true,classInclude: '!w-[110px]',position:{mode:'center',distance:0}}\"\n [listClickExactly]=\"false\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemYear\"\n [listHiddenInputSearch]=\"true\"\n [listConfig]=\"listLeftYearConfig()\"\n [listKeySelected]=\"listKeyFromSelected().year\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"leftYearHttpDetailConfig()\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.left + 'year')\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.left + 'year')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'year')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'year']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.left + 'year']\">\n <div class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">{{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[1]?.[1]?.format(\" YYYY\") }}</div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.left + 'year']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.left + 'year'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n </div>\n\n <div class=\"w-1/4 flex items-center relative\">\n @if (!calendarVariables.left().minDate || (calendarVariables.left().minDate?.isBefore(calendarVariables.left().calendar && calendarVariables.left().calendar?.firstDay))) {\n <div (click)=\"handlerClickPrev(sideEnum.left)\">\n <div class=\"flex items-center justify-center absolute left-0 top-[-3px]\">\n <i class=\"libs-ui-icon-chevron-right rotate-[180deg] text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n @if ((!calendarVariables.left().maxDate || calendarVariables.left().maxDate?.isAfter(calendarVariables.left().calendar && calendarVariables.left().calendar?.lastDay)) && isSingle()) {\n <div (click)=\"handlerClickNext(sideEnum.left)\">\n <div class=\"flex items-center justify-center ml-[12px] absolute right-0 top-[-3px]\">\n <i class=\"libs-ui-icon-chevron-right text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (!showDropdownsSelect() || !calendarVariables.left().dropdowns) {\n {{ dateOptions().monthNames && calendarVariables.left().calendar && dateOptions().monthNames[calendarVariables.left().calendar?.[1]?.[1]?.month() ?? -1] }}\n {{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[1]?.[1]?.format(\" YYYY\") }}\n }\n </th>\n </tr>\n <tr class=\"week-days\">\n @for (dayofweek of dateOptions().daysOfWeek; track dayofweek) {\n <th>\n <span class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">{{ dayofweek }}</span>\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"drp-animate\">\n @for (row of calendarVariables.left().calRows?.(); track row) {\n <tr class=\"h-[32px]\"\n [class]=\"calendarVariables.left().classes && calendarVariables.left().classes?.[row]?.classList\">\n @for (col of calendarVariables.left().calCols?.(); track col) {\n <td class=\"libs-ui-font-h5r\"\n [class.today]=\"calendarVariables.left().calendar && calendarVariables.left().calendar?.[row]?.[col]?.date() === today().date() && calendarVariables.left().calendar?.[row]?.[col]?.month() === today().month() && calendarVariables.left().calendar?.[row]?.[col]?.year() === today().year()\"\n [class]=\"calendarVariables.left().classes && calendarVariables.left().classes?.[row]?.[col]\"\n (click)=\"handlerPickerDate($event, sideEnum.left, row, col)\"\n (mouseenter)=\"handlerHoverDate($event, sideEnum.left, row, col)\">\n <span class=\"libs-ui-font-h5r\">{{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[row]?.[col]?.date() }}</span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n @if (hasTimePicker()) {\n <div>\n <div class=\"flex justify-center column items-center pt-[12px]\">\n <div class=\"w-full flex justify-center items-center rounded-[4px] border\"\n [class.border-[#e6e8ed]]=\"!timePickerError()\"\n [class.border-[#ff5454]]=\"timePickerError()\">\n <libs_ui-components-inputs-input classInclude=\"!w-[30px] !p-0 !border-none !text-center libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"23\"\n [minValueNumber]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().lefthour()\"\n (outInputEvent)=\"handlerInputEvent($event, 'lefthour')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'hour')\"\n (outChange)=\"handlerChangeTimeValue($event, 'lefthour')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'lefthour')\" />\n <span class=\"libs-ui-font-h3s text-[#333333]\">:</span>\n <libs_ui-components-inputs-input classInclude=\"!w-[30px] !p-0 !border-none !text-center !libs-ui-font-h4s !text-[#071631]\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n dataType=\"int\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxValueNumber]=\"59\"\n [minValueNumber]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().leftminute()\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.left + 'minute')\"\n (outInputEvent)=\"handlerInputEvent($event, 'leftminute')\"\n (outChange)=\"handlerChangeTimeValue($event, 'leftminute')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'leftminute')\" />\n </div>\n </div>\n </div>\n }\n </div>\n\n @if (!isSingle()) {\n <div class=\"libs-ui-component-custom_ranges-calendar right ml-[24px]\">\n <div class=\"rounded-[4px] bg-[#ffffff]\">\n @if (calendarVariables()) {\n <table>\n <thead>\n <tr>\n <th colspan=\"7\"\n class=\"month\">\n @if (showDropdownsSelect() && calendarVariables().left().dropdowns?.()) {\n <div class=\"!flex mb-[10px] w-full\">\n <div class=\"w-3/4 flex items-center\">\n <div class='mr-[8px]'>\n <libs_ui-components-dropdown [isNgContent]=\"true\"\n [zIndex]=\"zIndex() + 1\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true,classInclude: '!w-[130px]',position:{mode:'center',distance:0}}\"\n [listMaxItemShow]=\"10\"\n [listClickExactly]=\"false\"\n [listKeysDisable]=\"disableMonth().right()\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemMonth\"\n [listHiddenInputSearch]=\"true\"\n [listConfig]=\"listMonthsConfig()\"\n [listKeySelected]=\"listKeyToSelected().month\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"monthHttpDetailConfig()\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.right + 'month')\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.right + 'month')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.right + 'month')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'month']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.right + 'month']\">\n <div class=\"libs-ui-font-h4m\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'month']\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dateOptions().monthNames && calendarVariables().right().calendar && dateOptions().monthNames[ calendarVariables().right().calendar?.[1]?.[1]?.month() ?? -1] }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.right + 'month'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n <div>\n <libs_ui-components-dropdown [listMaxItemShow]=\"10\"\n [zIndex]=\"zIndex() + 1\"\n [isNgContent]=\"true\"\n [popoverCustomConfig]=\"{widthByParent:false,ignoreArrow:true,paddingLeftItem: true, classInclude: '!w-[110px]', position:{mode:'center', distance:0}}\"\n [listClickExactly]=\"false\"\n [listHasButtonUnSelectOption]=\"false\"\n [convertItemSelected]=\"convertItemYear\"\n [listHiddenInputSearch]=\"true\"\n [listConfig]=\"listRightYearConfig()\"\n [listKeySelected]=\"listKeyToSelected().year\"\n [flagMouse]=\"flagMouse()\"\n [httpRequestDetailItemById]=\"rightYearHttpDetailConfig()\"\n (outSelectKey)=\"handlerSelectedDropdown($event, sideEnum.right + 'year')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, sideEnum.right + 'year')\"\n (outChangStageFlagMouse)=\"handlerChangeFlagMouse($event)\"\n (outShowList)=\"handlerShowListDropdown($event, sideEnum.right + 'year')\">\n <div class=\"libs-ui-component-custom_ranges-calendar-dropdown\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'year']\"\n [class.text-[#6a7383]]=\"!checkShowListDropdown()[sideEnum.right + 'year']\">\n <div class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ calendarVariables().right().calendar && calendarVariables().right().calendar?.[1]?.[1]?.format(\"YYYY\") }}\n </div>\n <i class=\"libs-ui-icon-chevron-right text-[13px] text-[#6a7383]\"\n [class.text-[var(--libs-ui-color-dark)]]=\"checkShowListDropdown()[sideEnum.right + 'year']\"\n [style.fontWeight]=\"500\"\n [style.rotate]=\"!checkShowListDropdown()[sideEnum.right + 'year'] ? '90deg':'270deg'\"></i>\n </div>\n </libs_ui-components-dropdown>\n </div>\n </div>\n <div class=\"w-1/4 flex items-center relative\">\n @if (listKeyFromSelected().year && listKeyToSelected().year && !(((listKeyFromSelected().year +1) === listKeyToSelected().year) && (listKeyFromSelected().month === 12) && listKeyToSelected().month === 1)&& (listKeyFromSelected().year < listKeyToSelected().year) || listKeyFromSelected().month && listKeyToSelected().month && ((listKeyFromSelected().month + 1) < +listKeyToSelected().month)) {\n <div class=\"flex items-center justify-center absolute left-0 top-[-3px]\"\n (click)=\"handlerClickPrev(sideEnum.right)\">\n <i class=\"libs-ui-icon-chevron-right rotate-[180deg] text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n }\n @if (listKeyFromSelected().month && listKeyToSelected().month && (listKeyFromSelected().month > listKeyToSelected().month) && listKeyFromSelected().year && listKeyToSelected().year && (listKeyFromSelected().year === listKeyToSelected().year )) {\n <div class=\"bg-[#ffffff] w-[21px] h-[21px] cursor-none flex items-center justify-center rounded-[50px]\">\n </div>\n }\n @if (!calendarVariables().right().maxDate || (calendarVariables().right().maxDate?.isAfter(calendarVariables().right().calendar && calendarVariables().right().calendar?.lastDay))) {\n <div (click)=\"handlerClickNext(sideEnum.right)\">\n <div class=\"flex items-center justify-center ml-[12px] absolute right-0 top-[-3px]\">\n <i class=\"libs-ui-icon-chevron-right text-[#6a7383] cursor-pointer libs-ui-component-custom_ranges-calendar-icon\"></i>\n </div>\n </div>\n }\n </div>\n </div>\n }\n @if (!showDropdownsSelect() || !calendarVariables().right().dropdowns) {\n {{ dateOptions().monthNames && calendarVariables().right().calendar && dateOptions().monthNames[calendarVariables().right().calendar?.[1]?.[1]?.month() ?? -1] }}\n {{ calendarVariables().right().calendar && calendarVariables().right().calendar?.[1]?.[1]?.format(\"YYYY\") }}\n }\n </th>\n </tr>\n <tr class=\"week-days\">\n @for (dayofweek of dateOptions().daysOfWeek; track dayofweek) {\n <th>\n <span class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">{{ dayofweek }}</span>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of calendarVariables().right().calRows?.(); track row) {\n <tr class=\"h-[32px]\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.classList\">\n @for (col of calendarVariables().right().calCols?.(); track col) {\n <td class=\"libs-ui-font-h5r\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.[col]\"\n [class.today]=\"calendarVariables().right().calendar && calendarVariables().right().calendar?.[row]?.[col]?.date() === today().date() && calendarVariables().right().calendar?.[row]?.[col]?.month() === today().month() && calendarVariables().right().calendar &&calendarVariables().right().calendar?.[row]?.[col]?.year() === today().year()\"\n (click)=\"handlerPickerDate($event, sideEnum.right, row, col)\"\n (mouseenter)=\"handlerHoverDate($event, sideEnum.right, row, col)\">\n <span>{{ calendarVariables().right().calendar?.[row]?.[col]?.date() }}</span>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n @if (hasTimePicker()) {\n <div>\n <div class=\"flex justify-center items-center pt-[12px]\">\n <div class=\"w-full flex justify-center items-center rounded-[4px] border\"\n [class.border-[#e6e8ed]]=\"!timePickerError()\"\n [class.border-[#ff5454]]=\"timePickerError()\">\n <libs_ui-components-inputs-input classInclude=\"!w-[30px] !p-0 !border-none !text-center !libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"23\"\n [minValueNumber]=\"0\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().righthour()\"\n (outChange)=\"handlerChangeTimeValue($event, 'righthour')\"\n (outInputEvent)=\"handlerInputEvent($event,'righthour')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, 'righthour')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'righthour')\" />\n <span class=\"libs-ui-font-h3s text-[#333333]\">:</span>\n <libs_ui-components-inputs-input classInclude=\"!w-[30px] !p-0 !border-none !text-center libs-ui-font-h4s !text-[#071631]\"\n dataType=\"int\"\n [autoAddZeroLessThan10InTypeInt]=\"true\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [maxValueNumber]=\"59\"\n [minValueNumber]=\"0\"\n [focusTimeOut]=\"0\"\n [blurTimeOut]=\"0\"\n [maxLength]=\"2\"\n [value]=\"timepickerValueItem().rightminute()\"\n (outInputEvent)=\"handlerInputEvent($event,'rightminute')\"\n (outFunctionsControl)=\"handlerFunctionControl($event, 'rightminute')\"\n (outChange)=\"handlerChangeTimeValue($event, 'rightminute')\"\n (outFocusAndBlurEvent)=\"handlerFocusAndBlurTime($event, 'rightminute')\" />\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n </div>\n <div>\n <div class=\"flex w-full\">\n @if (!isSingle() && hasTimePicker()) {\n <div class=\"mt-[8px] libs-ui-font-h7r text-[#ff5454] h-[14px]\">\n @if (timePickerError()) {\n <span>{{ 'i18n_date_compare_start_end_message_error' | translate }}</span>\n }\n </div>\n }\n </div>\n @if (!quickRangesArray().length || !isSingle()) {\n <div class=\" flex w-full pt-[16px] justify-between\">\n <div class=\"flex items-center\">\n @if (!isSingle()) {\n @if (!endDate()) {\n <div class=\"text-[#cdd0d6] libs-ui-font-h6r\">\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeLeft() }}</span>\n }\n &hyphen;\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeRight() }}</span>\n }\n </div>\n }\n @if (endDate()) {\n <div class=\"text-[#cdd0d6] libs-ui-font-h6r\">\n <span>{{ startDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeLeft() }}</span>\n }\n &hyphen;\n <span>{{ endDate()?.format('DD/MM/YYYY') }}</span>\n @if (hasTimePicker()) {\n <span> {{ computedDisplayTimeRight() }}</span>\n }\n </div>\n }\n }\n </div>\n\n <div class=\"flex\">\n <libs_ui-components-buttons-button class=\"mr-[12px]\"\n label=\"i18n_cancel\"\n type=\"button-third\"\n (outClick)=\"handlerClickCancel($event)\" />\n <libs_ui-components-buttons-button label=\"i18n_select\"\n (outClick)=\"handlerClickApply($event)\" />\n </div>\n </div>\n }\n </div>\n</div>\n", styles: [".libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown{display:flex;align-items:center}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover{color:var(--libs-ui-color-light-1)}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover i:before,.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-dropdown:hover i:after{color:var(--libs-ui-color-light-1)!important}.libs-ui-component-custom_ranges-calendar table{border-collapse:inherit;border-spacing:0 2px}.libs-ui-component-custom_ranges-calendar th,.libs-ui-component-custom_ranges-calendar td{padding:0;text-align:center;min-width:32px}.libs-ui-component-custom_ranges-calendar th span,.libs-ui-component-custom_ranges-calendar td span{pointer-events:none}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover{color:var(--libs-ui-color-light-1)}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover i:before,.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:hover i:after{color:var(--libs-ui-color-light-1)!important}.libs-ui-component-custom_ranges-calendar .libs-ui-component-custom_ranges-calendar-icon:before{font-size:20px}.libs-ui-component-custom_ranges-calendar td,.libs-ui-component-custom_ranges-calendar th{cursor:pointer;height:2em;width:2em}.libs-ui-component-custom_ranges-calendar td.available:hover,.libs-ui-component-custom_ranges-calendar th.available:hover{background-color:#f8f5fe;border-color:transparent;border-radius:8px;color:inherit;background-repeat:no-repeat;background-size:.5em;background-position:center;margin:.25em 0;opacity:.8;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0ms}.libs-ui-component-custom_ranges-calendar td{margin:.25em 0;background-color:#fff;transition:background-color .2s ease;transform:scale(1);transition:all .45s cubic-bezier(.23,1,.32,1) 0ms;color:#071631!important}.libs-ui-component-custom_ranges-calendar td:hover{color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.off,.libs-ui-component-custom_ranges-calendar td.off.in-range,.libs-ui-component-custom_ranges-calendar td.off.start-date,.libs-ui-component-custom_ranges-calendar td.off.end-date{background-color:#fff;border-color:transparent;color:#cdd0d6!important}.libs-ui-component-custom_ranges-calendar td.focus-off{background-color:#f8f5fe!important}.libs-ui-component-custom_ranges-calendar td.in-range{background-color:#f8f5fe;border-color:transparent;border-radius:0;color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.today{position:relative;color:#8e61ee!important}.libs-ui-component-custom_ranges-calendar td.today:after{position:absolute;content:\"\";width:2px;height:2px;background-color:#8e61ee;left:49%;bottom:5px}.libs-ui-component-custom_ranges-calendar td.active{transition:background .3s ease-out;background:#0000001a}.libs-ui-component-custom_ranges-calendar td.active.today:after{position:absolute;content:\"\";background-color:#fff}.libs-ui-component-custom_ranges-calendar td.active.start-date{border-radius:8px 0 0 8px}.libs-ui-component-custom_ranges-calendar td.active.end-date{border-radius:0 8px 8px 0}.libs-ui-component-custom_ranges-calendar td.active.full-date{border-radius:8px}.libs-ui-component-custom_ranges-calendar td.active,.libs-ui-component-custom_ranges-calendar td.active:hover{background-color:#8e61ee;border-color:transparent;color:#fff!important}.libs-ui-component-custom_ranges-calendar th.month{width:auto}.libs-ui-component-custom_ranges-calendar td.disabled,.libs-ui-component-custom_ranges-calendar option.disabled{color:#999!important;cursor:not-allowed;text-decoration:line-through;background-color:#f4f5f7}.libs-ui-component-custom_ranges-calendar .dropdowns{background-repeat:no-repeat;background-size:10px;background-position-y:center;background-position-x:right}.libs-ui-component-custom_ranges-calendar th.month>div{position:relative;display:inline-block}@media (min-width: 564px){.libs-ui-component-custom_ranges{width:auto}}\n"] }]
1255
+ }], ctorParameters: () => [] });
1256
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2RhdGV0aW1lL3BpY2tlci9zcmMvY3VzdG9tLXJhbmdlcy9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZGF0ZXRpbWUvcGlja2VyL3NyYy9jdXN0b20tcmFuZ2VzL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQXFCLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUNuTixPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQWlELGlDQUFpQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEksT0FBTyxFQUFrRCxvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBS3hJLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqSSxPQUFPLEVBQUUsZ0JBQWdC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Q0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzdCLENBQUM7d0dBNTZDVSwyREFBMkQ7NEZBQTNELDJEQUEyRCxvaUZDckN4RSxncDBCQXNaQSw0b0lEdlhJLGVBQWUsNEZBQ2YsaUNBQWlDLG16REFDakMsb0NBQW9DLDg5Q0FDcEMsc0NBQXNDOzs0RkFHN0IsMkRBQTJEO2tCQWR2RSxTQUFTOytCQUVFLDJEQUEyRCxjQUd6RCxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7d0JBQ1AsZUFBZTt3QkFDZixpQ0FBaUM7d0JBQ2pDLG9DQUFvQzt3QkFDcEMsc0NBQXNDO3FCQUN2QyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCByZXNvbHZlRm9yd2FyZFJlZiwgc2lnbmFsLCB1bnRyYWNrZWQsIHZpZXdDaGlsZCwgV3JpdGFibGVTaWduYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblwiO1xuaW1wb3J0IHsgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQsIElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1kcm9wZG93blwiO1xuaW1wb3J0IHsgSUZvY3VzQW5kQmx1ckV2ZW50LCBJSW5wdXRGdW5jdGlvbkNvbnRyb2xFdmVudCwgTGlic1VpQ29tcG9uZW50c0lucHV0c0lucHV0Q29tcG9uZW50IH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLWlucHV0XCI7XG5pbXBvcnQgeyBJTGlzdENvbmZpZ0l0ZW0gfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1saXN0XCI7XG5pbXBvcnQgeyBJRmxhZ01vdXNlIH0gZnJvbSBcIkBsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3ZlclwiO1xuaW1wb3J0IHsgSUV2ZW50IH0gZnJvbSBcIkBsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXNcIjtcbmltcG9ydCB7IElIdHRwUmVxdWVzdENvbmZpZyB9IGZyb20gXCJAbGlicy11aS9zZXJ2aWNlcy1odHRwLXJlcXVlc3RcIjtcbmltcG9ydCB7IGlzRW1wdHksIHNldCB9IGZyb20gXCJAbGlicy11aS91dGlsc1wiO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5pbXBvcnQgaXNvV2VlayBmcm9tICdkYXlqcy9wbHVnaW4vaXNvV2Vlayc7XG5pbXBvcnQgeyBnZXRNb250aHNEZXRhaWxCeUlkLCBnZXRNb250aHNMaXN0Q29uZmlnLCBnZXRZZWFyc0RldGFpbEJ5SWQsIGdldFllYXJzTGlzdENvbmZpZyB9IGZyb20gXCIuLi8uLi9kZWZpbmVzL2NhbGVuZGFyLmRlZmluZVwiO1xuaW1wb3J0IHsgREVGQVVMVF9NQVhfWUVBUiwgREVGQVVMVF9NSU5fWUVBUiwgZGVmYXVsdExvY2FsZUNvbmZpZywgZ2V0RGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vZGVmaW5lcy9kYXRlLW9wdGlvbnMuZGVmaW5lXCI7XG5pbXBvcnQgeyBJRW1pdERhdGVDYWxlbmRhciB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL2NhbGVuZGFyLWVtaXQuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBJQ2FsZW5kYXIsIElDYWxlbmRhclZhcmlhYmxlcywgSURhdGVSYW5nZSwgSVNwbGl0UGlja2VyRGF0ZSwgU2lkZUVudW0gfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9jYWxlbmRhci12YXJpYWJsZXMuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBJQ2FsZW5kYXJGdW5jdGlvbkNvbnRyb2xFdmVudCB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL2Z1bmN0aW9uLWNvbnRyb2wuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBMb2NhbGl6YXRpb25Db25maWcgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9waWNrZXIuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBJQ2hlY2tUaW1lcGlja2VyU2VsZWN0ZWQsIElTZWxlY3RlZE9sZCwgSVRpbWVwaWNrZXJJdGVtVmFsdWUsIElUaW1lcGlja2VyVmFyaWFibGVzLCBJVGltZXBpY2tlclZhcmlhYmxlc1NpZGUgfSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy90aW1lLXZhcmlhYmxlcy5pbnRlcmZhY2VcIjtcbmRheWpzLmV4dGVuZChpc29XZWVrKTtcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWRhdGV0aW1lLXBpY2tlci1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXIuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNJbnB1dENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNEYXRldGltZVBpY2tlckN1c3RvbVJhbmdlc0NhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiogUFJPUEVSVFkgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZGVFbnVtID0gU2lkZUVudW07XG4gIHByb3RlY3RlZCBjYWxlbmRhclZhcmlhYmxlcyA9IHNpZ25hbDxJQ2FsZW5kYXJWYXJpYWJsZXM+KHsgbGVmdDogc2lnbmFsKHt9KSwgcmlnaHQ6IHNpZ25hbCh7fSkgfSk7XG4gIHByb3RlY3RlZCB0aW1lcGlja2VyVmFyaWFibGVzID0gc2lnbmFsPElUaW1lcGlja2VyVmFyaWFibGVzPih7IGxlZnQ6IHNpZ25hbCh7IHNlbGVjdGVkSG91cjogMCwgc2VsZWN0ZWRNaW51dGU6IDAgfSksIHJpZ2h0OiBzaWduYWwoeyBzZWxlY3RlZEhvdXI6IDIzLCBzZWxlY3RlZE1pbnV0ZTogNTkgfSkgfSk7XG4gIHByb3RlY3RlZCBkaXNhYmxlTW9udGggPSBzaWduYWw8eyBsZWZ0OiBXcml0YWJsZVNpZ25hbDxBcnJheTxhbnk+PiwgcmlnaHQ6IFdyaXRhYmxlU2lnbmFsPEFycmF5PGFueT4+IH0+KHsgbGVmdDogc2lnbmFsKFtdKSwgcmlnaHQ6IHNpZ25hbChbXSkgfSk7XG4gIHByb3RlY3RlZCB0b2RheSA9IHNpZ25hbDxkYXlqcy5EYXlqcz4oZGF5anMoKSk7XG4gIHByb3RlY3RlZCBsaXN0S2V5RnJvbVNlbGVjdGVkID0gc2lnbmFsPHsgbW9udGg6IGFueSwgeWVhcjogYW55IH0+KHsgbW9udGg6IHVuZGVmaW5lZCwgeWVhcjogdW5kZWZpbmVkIH0pO1xuICBwcm90ZWN0ZWQgbGlzdEtleVRvU2VsZWN0ZWQgPSBzaWduYWw8eyBtb250aDogYW55LCB5ZWFyOiBhbnkgfT4oeyBtb250aDogdW5kZWZpbmVkLCB5ZWFyOiB1bmRlZmluZWQgfSk7XG4gIHByb3RlY3RlZCBjaGVja1Nob3dMaXN0RHJvcGRvd24gPSBzaWduYWw8eyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0+KHt9KTtcbiAgcHJvdGVjdGVkIHNlbGVjdGVkUXVpY2tSYW5nZSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcbiAgcHJvdGVjdGVkIGxlZnRDYWxlbmRhciA9IHNpZ25hbDx7IGNhbGVuZGFyPzogSUNhbGVuZGFyLCBtb250aD86IGRheWpzLkRheWpzIH0+KHt9KTtcbiAgcHJvdGVjdGVkIHJpZ2h0Q2FsZW5kYXIgPSBzaWduYWw8eyBjYWxlbmRhcj86IElDYWxlbmRhciwgbW9udGg/OiBkYXlqcy5EYXlqcyB9Pih7fSk7XG5cbiAgcHJvdGVjdGVkIGxpc3RNb250aHNDb25maWcgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbW9udGhIdHRwRGV0YWlsQ29uZmlnID0gc2lnbmFsPElIdHRwUmVxdWVzdENvbmZpZz4oZ2V0TW9udGhzRGV0YWlsQnlJZCgpKTtcbiAgcHJvdGVjdGVkIGxpc3RMZWZ0WWVhckNvbmZpZyA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW0gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBsaXN0UmlnaHRZZWFyQ29uZmlnID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGxpc3RZZWFyQ29uZmlnID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGxlZnRZZWFySHR0cERldGFpbENvbmZpZyA9IHNpZ25hbDxJSHR0cFJlcXVlc3RDb25maWcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCByaWdodFllYXJIdHRwRGV0YWlsQ29uZmlnID0gc2lnbmFsPElIdHRwUmVxdWVzdENvbmZpZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwcm90ZWN0ZWQgdGltZVBpY2tlckVycm9yID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGNvbXB1dGVkRGlzcGxheVRpbWVMZWZ0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wdXRlZERpc3BsYXlUaW1lKHsgc2VsZWN0ZWRIb3VyOiB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpLCBzZWxlY3RlZE1pbnV0ZTogdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpIH0pKTtcbiAgcHJvdGVjdGVkIGNvbXB1dGVkRGlzcGxheVRpbWVSaWdodCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29tcHV0ZWREaXNwbGF5VGltZSh7IHNlbGVjdGVkSG91cjogdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCksIHNlbGVjdGVkTWludXRlOiB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodG1pbnV0ZSgpIH0pKTtcbiAgcHJvdGVjdGVkIGNvbXB1dGVkRGlzcGxheVRpbWVMZWZ0SW5wdXRIb3VyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wdXRlZERpc3BsYXlUaW1lSW5wdXQoU2lkZUVudW0ubGVmdCwgJ2hvdXInKSk7XG4gIHByb3RlY3RlZCBjb21wdXRlZERpc3BsYXlUaW1lTGVmdElucHV0TWludXRlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wdXRlZERpc3BsYXlUaW1lSW5wdXQoU2lkZUVudW0ubGVmdCwgJ21pbnV0ZScpKTtcbiAgcHJvdGVjdGVkIGNvbXB1dGVkRGlzcGxheVRpbWVSaWdodElucHV0SG91ciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29tcHV0ZWREaXNwbGF5VGltZUlucHV0KFNpZGVFbnVtLnJpZ2h0LCAnaG91cicpKTtcbiAgcHJvdGVjdGVkIGNvbXB1dGVkRGlzcGxheVRpbWVSaWdodElucHV0TWludXRlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wdXRlZERpc3BsYXlUaW1lSW5wdXQoU2lkZUVudW0ucmlnaHQsICdtaW51dGUnKSk7XG5cbiAgcHJpdmF0ZSBmdW5jdGlvbkNvbnRyb2xzID0gbmV3IE1hcDxzdHJpbmcsIElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIHByaXZhdGUgcGlja2luZ0RhdGUgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIGlzU2hvd24gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIG5vd0hvdmVyZWREYXRlID0gc2lnbmFsPGRheWpzLkRheWpzIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgdGltZVBpY2tlckluY3JlbWVudCA9IHNpZ25hbDxudW1iZXI+KDEpO1xuICBwcml2YXRlIHNlbGVjdGVkTGFiZWwgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGtleUNvZGVCYWNrc3BhY2UgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIGNoZWNrQmFja3NwYWNlRm9jdXMgPSBzaWduYWw8SVRpbWVwaWNrZXJJdGVtVmFsdWU+KHsgbGVmdGhvdXI6IHNpZ25hbCgxKSwgbGVmdG1pbnV0ZTogc2lnbmFsKDEpLCByaWdodGhvdXI6IHNpZ25hbCgxKSwgcmlnaHRtaW51dGU6IHNpZ25hbCgxKSB9KTtcbiAgcHJvdGVjdGVkIHRpbWVwaWNrZXJWYWx1ZUl0ZW0gPSBzaWduYWw8SVRpbWVwaWNrZXJJdGVtVmFsdWU+KHsgbGVmdGhvdXI6IHNpZ25hbCgwKSwgbGVmdG1pbnV0ZTogc2lnbmFsKDApLCByaWdodGhvdXI6IHNpZ25hbCgwKSwgcmlnaHRtaW51dGU6IHNpZ25hbCgwKSB9KTtcbiAgcHJpdmF0ZSBpc1plcm8gPSBzaWduYWw8Ym9vbGVhbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBvbGREYXRlID0gc2lnbmFsPElTZWxlY3RlZE9sZD4oeyBzdGFydDogZGF5anMoMCksIGVuZDogZGF5anMoMCkgfSk7XG4gIHByaXZhdGUgaXNTZWxlY3RlZERhdGEgPSBzaWduYWw8SUNoZWNrVGltZXBpY2tlclNlbGVjdGVkPih7IGxlZnRtb250aDogZmFsc2UsIGxlZnR5ZWFyOiBmYWxzZSwgcmlnaHRtb250aDogZmFsc2UsIHJpZ2h0eWVhcjogZmFsc2UgfSk7XG4gIHByaXZhdGUgc3BsaXRQaWNrZXJEYXRlID0gc2lnbmFsPElTcGxpdFBpY2tlckRhdGU+KHsgc3RhcnQ6IHNpZ25hbCh7IG1vbnRoOiAwLCB5ZWFyOiAwLCBkYXk6IDAsIGhvdXI6IDAsIG1pbnV0ZTogMCB9KSwgZW5kOiBzaWduYWwoeyBtb250aDogMCwgeWVhcjogMCwgZGF5OiAwLCBob3VyOiAyMywgbWludXRlOiA1OSB9KSB9KTtcblxuICAvKiogSU5QVVQgKi9cbiAgcmVhZG9ubHkgcXVpY2tSYW5nZXNBcnJheSA9IGlucHV0PEFycmF5PElEYXRlUmFuZ2U+PihbXSk7XG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlciwgbnVtYmVyPigxMjAwLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyAxMjAwIH0pO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGUgPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgaXNTaW5nbGUgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHNob3dEcm9wZG93bnNTZWxlY3QgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgaGFzVGltZVBpY2tlciA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBmbGFnTW91c2UgPSBpbnB1dDxJRmxhZ01vdXNlPih7IGlzTW91c2VFbnRlcjogZmFsc2UsIGlzTW91c2VFbnRlckNvbnRlbnQ6IGZhbHNlIH0pO1xuICByZWFkb25seSBkYXRlT3B0aW9ucyA9IGlucHV0PExvY2FsaXphdGlvbkNvbmZpZz4oeyAuLi5kZWZhdWx0TG9jYWxlQ29uZmlnKCksIC4uLmdldERhdGVPcHRpb25zKCkgfSk7XG4gIHJlYWRvbmx5IGF1dG9BcHBseSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgaGFzU2Vjb25kUGlja2VyID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBzaG93UmFuZ2VMYWJlbE9uSW5wdXQgPSBpbnB1dDxib29sZWFuIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHJlYWRvbmx5IHN0YXJ0RGF0ZSA9IG1vZGVsPGRheWpzLkRheWpzIHwgdW5kZWZpbmVkPihkYXlqcygpLnN0YXJ0T2YoJ2RheScpKTtcbiAgcmVhZG9ubHkgZW5kRGF0ZSA9IG1vZGVsPGRheWpzLkRheWpzIHwgdW5kZWZpbmVkPihkYXlqcygpLmVuZE9mKCdkYXknKSk7XG4gIHJlYWRvbmx5IG1pbkRhdGUgPSBpbnB1dDxkYXlqcy5EYXlqcyB8IHN0cmluZyB8IHVuZGVmaW5lZCwgZGF5anMuRGF5anMgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCwgeyB0cmFuc2Zvcm06IHRoaXMudHJhbnNmb3JtTWluTWF4RGF0ZS5iaW5kKHRoaXMpIH0pO1xuICByZWFkb25seSBtYXhEYXRlID0gaW5wdXQ8ZGF5anMuRGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQsIGRheWpzLkRheWpzIHwgdW5kZWZpbmVkPih1bmRlZmluZWQsIHsgdHJhbnNmb3JtOiB0aGlzLnRyYW5zZm9ybU1pbk1heERhdGUuYmluZCh0aGlzKSB9KTtcblxuICAvKiogT1VUUFVUICovXG4gIHJlYWRvbmx5IG91dENoYW5nU3RhZ2VGbGFnTW91c2UgPSBvdXRwdXQ8SUZsYWdNb3VzZT4oKTtcbiAgLy8gcmVhZG9ubHkgb3V0U3RhcnREYXRlQ2hhbmdlZCA9IG91dHB1dDx7IHN0YXJ0RGF0ZTogZGF5anMuRGF5anMgfCB1bmRlZmluZWQgfT4oKTtcbiAgLy8gcmVhZG9ubHkgb3V0RW5kRGF0ZUNoYW5nZWQgPSBvdXRwdXQ8eyBlbmREYXRlOiBkYXlqcy5EYXlqcyB8IHVuZGVmaW5lZCB9PigpO1xuICByZWFkb25seSBvdXRQaWNrZXJEYXRlID0gb3V0cHV0PElFbWl0RGF0ZUNhbGVuZGFyPigpO1xuICAvLyByZWFkb25seSBvdXRSYW5nZUNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxJUmFuZ2VzQ2xpY2tlZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHJlYWRvbmx5IG91dENhbmNlbCA9IG91dHB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IG91dFVwZGF0ZVdpZHRoID0gb3V0cHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJQ2FsZW5kYXJGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcblxuICAvKiogSU5KRUNUSU9OICovXG4gIHByaXZhdGUgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuXG4gIHJlYWRvbmx5IHBpY2tlckNvbnRhaW5lciA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPigncGlja2VyQ29udGFpbmVyJyk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5saXN0TW9udGhzQ29uZmlnLnNldChnZXRNb250aHNMaXN0Q29uZmlnKHRoaXMudHJhbnNsYXRlKSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3Qgb2xkU3RhcnQgPSB0aGlzLnN0YXJ0RGF0ZSgpPy5jbG9uZSgpO1xuICAgICAgY29uc3Qgb2xkRW5kID0gdGhpcy5lbmREYXRlKCk/LmNsb25lKCk7XG5cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMub2xkRGF0ZS5zZXQoeyBzdGFydDogb2xkU3RhcnQsIGVuZDogb2xkRW5kIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZSgpPy5jbG9uZSgpO1xuICAgIGNvbnN0IGVuZERhdGUgPSB0aGlzLmVuZERhdGUoKT8uY2xvbmUoKTtcblxuICAgIHRoaXMuc3BsaXRQaWNrZXJEYXRlLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQuc3RhcnQudXBkYXRlKHNpZGVDdXJyZW50ID0+IHtcbiAgICAgICAgc2lkZUN1cnJlbnQuZGF5ID0gKHN0YXJ0RGF0ZSA/PyBkYXlqcygpLnN0YXJ0T2YoJ2RheScpKS5kYXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIHNpZGVDdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBjdXJyZW50LmVuZC51cGRhdGUoc2lkZUN1cnJlbnQgPT4ge1xuICAgICAgICBzaWRlQ3VycmVudC5kYXkgPSAoZW5kRGF0ZSA/PyBkYXlqcygpLmVuZE9mKCdkYXknKSkuZGF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBzaWRlQ3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0RGF0ZSAmJiB0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5zZXRTdGFydERhdGUoc3RhcnREYXRlKTtcbiAgICAgIHRoaXMucmVuZGVyVGltZVBpY2tlcihTaWRlRW51bS5sZWZ0KTtcbiAgICB9XG5cbiAgICBpZiAoZW5kRGF0ZSAmJiB0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5zZXRFbmREYXRlKGVuZERhdGUpO1xuICAgICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgICB9XG4gICAgdGhpcy5idWlsZENvbmZpZ1llYXIoU2lkZUVudW0ubGVmdCk7XG4gICAgdGhpcy5idWlsZENvbmZpZ1llYXIoU2lkZUVudW0ucmlnaHQsIHN0YXJ0RGF0ZT8ueWVhcigpKTtcbiAgICB0aGlzLnVwZGF0ZU1vbnRoc0luVmlldygpO1xuICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoU2lkZUVudW0ubGVmdCk7XG4gICAgdGhpcy5yZW5kZXJDYWxlbmRhcihTaWRlRW51bS5yaWdodCk7XG4gICAgLy8gdGhpcy5yZW5kZXJSYW5nZXMoKTtcbiAgICB0aGlzLmZvcm1hdE1vbnRoWWVhcigpO1xuICAgIHRoaXMub3V0VXBkYXRlV2lkdGguZW1pdCgxKTtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgICB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0uc2V0KHtcbiAgICAgIGxlZnRob3VyOiBzaWduYWwodGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkubGVmdCgpLnNlbGVjdGVkSG91ciksXG4gICAgICByaWdodGhvdXI6IHNpZ25hbCh0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKS5yaWdodCgpLnNlbGVjdGVkSG91ciksXG4gICAgICBsZWZ0bWludXRlOiBzaWduYWwodGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkubGVmdCgpLnNlbGVjdGVkTWludXRlKSxcbiAgICAgIHJpZ2h0bWludXRlOiBzaWduYWwodGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkucmlnaHQoKS5zZWxlY3RlZE1pbnV0ZSlcbiAgICB9KTtcblxuICAgIC8vIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KHsgYnVpbGREZWZhdWx0UmFuZ2U6IHRoaXMuYnVpbGREZWZhdWx0UmFuZ2UuYmluZCh0aGlzKSwgYXBwbHlUb1NlbGVjdDogdGhpcy5hcHBseVRvU2VsZWN0LmJpbmQodGhpcykgfSlcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDb25maWdZZWFyKHNpZGU6IFNpZGVFbnVtLCBzdGFydFllYXI/OiBudW1iZXIsKSB7XG4gICAgY29uc3QgbWluRGF0ZSA9IHRoaXMubWluRGF0ZSgpIGFzIGRheWpzLkRheWpzO1xuICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm1heERhdGUoKSBhcyBkYXlqcy5EYXlqcztcblxuICAgIGNvbnN0IGxpc3RMZWZ0WWVhciA9IFtdO1xuICAgIGNvbnN0IGxpc3RSaWdodFllYXIgPSBbXTtcblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSB7XG4gICAgICBmb3IgKGxldCBpID0gKG1pbkRhdGUgPyBtaW5EYXRlLnllYXIoKSA6IERFRkFVTFRfTUlOX1lFQVIpOyBpIDw9IChtYXhEYXRlID8gbWF4RGF0ZT8ueWVhcigpIDogREVGQVVMVF9NQVhfWUVBUik7IGkrKykge1xuICAgICAgICBsaXN0TGVmdFllYXIucHVzaCh7XG4gICAgICAgICAgaWQ6IGksXG4gICAgICAgICAgbGFiZWw6IGAke2l9YFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGlzdExlZnRZZWFyQ29uZmlnLnNldChnZXRZZWFyc0xpc3RDb25maWcobGlzdExlZnRZZWFyKSk7XG4gICAgICB0aGlzLmxlZnRZZWFySHR0cERldGFpbENvbmZpZy5zZXQoZ2V0WWVhcnNEZXRhaWxCeUlkKGxpc3RMZWZ0WWVhcikpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IChzdGFydFllYXIgPyBzdGFydFllYXIgOiBtaW5EYXRlID8gbWluRGF0ZS55ZWFyKCkgOiBkYXlqcygpLnllYXIoKSk7IGkgPD0gKG1heERhdGUgPyBtYXhEYXRlPy55ZWFyKCkgOiBERUZBVUxUX01BWF9ZRUFSKTsgaSsrKSB7XG4gICAgICBsaXN0UmlnaHRZZWFyLnB1c2goe1xuICAgICAgICBpZDogaSxcbiAgICAgICAgbGFiZWw6IGAke2l9YFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5saXN0UmlnaHRZZWFyQ29uZmlnLnNldChnZXRZZWFyc0xpc3RDb25maWcobGlzdFJpZ2h0WWVhcikpO1xuICAgIHRoaXMucmlnaHRZZWFySHR0cERldGFpbENvbmZpZy5zZXQoZ2V0WWVhcnNEZXRhaWxCeUlkKGxpc3RSaWdodFllYXIpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlRmxhZ01vdXNlKGZsYWdNb3VzZTogSUZsYWdNb3VzZSkge1xuICAgIHRoaXMub3V0Q2hhbmdTdGFnZUZsYWdNb3VzZS5lbWl0KGZsYWdNb3VzZSlcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RhcnRFbmREYXRlKGRhdGU6IGRheWpzLkRheWpzKSB7XG4gICAgaWYgKCh0aGlzLmVuZERhdGUoKSB8fCBkYXRlLmlzQmVmb3JlKHRoaXMuc3RhcnREYXRlKCksICdkYXknKSkpIHtcbiAgICAgIGlmICh0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICBkYXRlID0gdGhpcy5nZXREYXRlV2l0aFRpbWUoZGF0ZSwgU2lkZUVudW0ubGVmdCk7XG4gICAgICB9XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLnNldFN0YXJ0RGF0ZShkYXRlLmNsb25lKCkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5lbmREYXRlKCkgJiYgdGhpcy5zdGFydERhdGUoKSAmJiBkYXRlLmlzQmVmb3JlKHRoaXMuc3RhcnREYXRlKCkpKSB7XG4gICAgICB0aGlzLnNldEVuZERhdGUodGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICBkYXRlID0gdGhpcy5nZXREYXRlV2l0aFRpbWUoZGF0ZSwgU2lkZUVudW0ucmlnaHQpO1xuICAgIH1cbiAgICBpZiAoIWRhdGUuaXNCZWZvcmUodGhpcy5zdGFydERhdGUoKSwgJ2RheScpKSB7XG4gICAgICB0aGlzLnNldEVuZERhdGUoZGF0ZS5jbG9uZSgpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXV0b0FwcGx5KCkpIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlU2VsZWN0ZWRMYWJlbCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlU2VsZWN0ZWRMYWJlbCgpIHtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0TW9udGhZZWFyKCkge1xuICAgIGNvbnN0IG1vbnRoID0gKHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKS5sZWZ0KCkuZHJvcGRvd25zPy4oKT8uY3VycmVudE1vbnRoID8/IDApICsgMTtcbiAgICBjb25zdCByaWdodE1vbnRoID0gKHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmRyb3Bkb3ducz8uKCk/LmN1cnJlbnRNb250aCA/PyAwKSArIDE7XG5cbiAgICB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgY3VycmVudC5tb250aCA9IG1vbnRoO1xuICAgICAgY3VycmVudC55ZWFyID0gdGhpcy5jYWxlbmRhclZhcmlhYmxlcygpLmxlZnQoKS5kcm9wZG93bnM/LigpPy5jdXJyZW50WWVhcjtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50Lm1vbnRoID0gcmlnaHRNb250aDtcbiAgICAgIGN1cnJlbnQueWVhciA9IHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmRyb3Bkb3ducz8uKCk/LmN1cnJlbnRZZWFyO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICB0aGlzLmlzU2VsZWN0ZWREYXRhLnNldCh7IGxlZnRtb250aDogdHJ1ZSwgbGVmdHllYXI6IHRydWUsIHJpZ2h0bW9udGg6IHRydWUsIHJpZ2h0eWVhcjogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RhcnREYXRlKHN0YXJ0RGF0ZTogZGF5anMuRGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXRoaXMuc3RhcnREYXRlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzdGFydERhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZGF5anMoc3RhcnREYXRlLCB0aGlzLmRhdGVPcHRpb25zKCkuZm9ybWF0KSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3RhcnREYXRlID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5waWNraW5nRGF0ZS5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZGF5anMoc3RhcnREYXRlKSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5oYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgIHRoaXMucGlja2luZ0RhdGUuc2V0KHRydWUpO1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KHRoaXMuc3RhcnREYXRlKCk/LnN0YXJ0T2YoJ2RheScpKTtcbiAgICB9XG4gICAgdGhpcy5zZXRTdGFydERhdGVJblRpbWVQaWNrZXIoKTtcblxuICAgIGlmICh0aGlzLm1pbkRhdGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpPy5pc0JlZm9yZSh0aGlzLm1pbkRhdGUoKSkpIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlLnNldCgodGhpcy5taW5EYXRlKCkgYXMgZGF5anMuRGF5anMpPy5jbG9uZSgpKTtcblxuICAgICAgdGhpcy5zZXRTdGFydERhdGVJblRpbWVQaWNrZXIoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4RGF0ZSgpICYmIHRoaXMuc3RhcnREYXRlKCk/LmlzQWZ0ZXIodGhpcy5tYXhEYXRlKCkpKSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoKHRoaXMubWF4RGF0ZSgpIGFzIGRheWpzLkRheWpzKS5jbG9uZSgpKTtcbiAgICAgIHRoaXMuc2V0U3RhcnREYXRlSW5UaW1lUGlja2VyKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1Nob3duKCkpIHtcbiAgICAgIHRoaXMudXBkYXRlRWxlbWVudCgpO1xuICAgIH1cbiAgICAvLyB0aGlzLm91dFN0YXJ0RGF0ZUNoYW5nZWQuZW1pdCh7IHN0YXJ0RGF0ZTogdGhpcy5zdGFydERhdGUoKSB9KTtcbiAgICB0aGlzLnVwZGF0ZU1vbnRoc0luVmlldygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTdGFydERhdGVJblRpbWVQaWNrZXIoKSB7XG4gICAgaWYgKCF0aGlzLmhhc1RpbWVQaWNrZXIoKSB8fCAhdGhpcy50aW1lUGlja2VySW5jcmVtZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdGFydERhdGUudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY3VycmVudC5taW51dGUoTWF0aC5yb3VuZChjdXJyZW50Lm1pbnV0ZSgpIC8gdGhpcy50aW1lUGlja2VySW5jcmVtZW50KCkpICogdGhpcy50aW1lUGlja2VySW5jcmVtZW50KCkpO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHNldEVuZERhdGUoZW5kRGF0ZTogZGF5anMuRGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGVuZERhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KGRheWpzKGVuZERhdGUsIHRoaXMuZGF0ZU9wdGlvbnMoKS5mb3JtYXQpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmREYXRlID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5waWNraW5nRGF0ZS5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5lbmREYXRlLnNldChkYXlqcyhlbmREYXRlKSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5lbmREYXRlKCkgfHwgIXRoaXMuc3RhcnREYXRlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU1vbnRoc0luVmlldygpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICB0aGlzLnBpY2tpbmdEYXRlLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KHRoaXMuZW5kRGF0ZSgpPy5hZGQoMSwgJ2QnKS5zdGFydE9mKCdkYXknKS5zdWJ0cmFjdCgxLCAnc2Vjb25kJykpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNUaW1lUGlja2VyKCkgJiYgdGhpcy50aW1lUGlja2VySW5jcmVtZW50KCkpIHtcbiAgICAgIHRoaXMuZW5kRGF0ZS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQubWludXRlKE1hdGgucm91bmQoY3VycmVudC5taW51dGUoKSAvIHRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKSAqIHRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbmREYXRlKCk/LmlzQmVmb3JlKHRoaXMuc3RhcnREYXRlKCkpKSB7XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXhEYXRlKCkgJiYgdGhpcy5lbmREYXRlKCk/LmlzQWZ0ZXIodGhpcy5tYXhEYXRlKCkpKSB7XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KCh0aGlzLm1heERhdGUoKSBhcyBkYXlqcy5EYXlqcyk/LmNsb25lKCkpO1xuICAgIH1cbiAgICAvLyB0aGlzLm91dEVuZERhdGVDaGFuZ2VkLmVtaXQoeyBlbmREYXRlOiB0aGlzLmVuZERhdGUoKSB9KTtcbiAgICB0aGlzLnVwZGF0ZU1vbnRoc0luVmlldygpO1xuICB9XG4gIHByb3RlY3RlZCBoYW5kbGVySG92ZXJEYXRlKGV2ZW50OiBFdmVudCwgc2lkZTogU2lkZUVudW0sIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgbGVmdENhbERhdGUgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkubGVmdCgpLmNhbGVuZGFyPy5bcm93XVtjb2xdO1xuICAgIGNvbnN0IHJpZ2h0Q2FsRGF0ZSA9IHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bcm93XVtjb2xdO1xuXG4gICAgaWYgKCF0aGlzLnBpY2tpbmdEYXRlIHx8ICFyaWdodENhbERhdGUgfHwgIWxlZnRDYWxEYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubm93SG92ZXJlZERhdGUuc2V0KHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgPyBsZWZ0Q2FsRGF0ZSA6IHJpZ2h0Q2FsRGF0ZSk7XG4gICAgdGhpcy5yZW5kZXJDYWxlbmRhcihTaWRlRW51bS5sZWZ0KTtcbiAgICB0aGlzLnJlbmRlckNhbGVuZGFyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgfVxuICBwcml2YXRlIGdldERpc2FibGUodHlwZTogJ2xlZnQnIHwgJ3JpZ2h0Jykge1xuICAgIGNvbnN0IG1pbkRhdGUgPSB0aGlzLm1pbkRhdGUoKSBhcyBkYXlqcy5EYXlqcztcbiAgICBjb25zdCBtYXhEYXRlID0gdGhpcy5tYXhEYXRlKCkgYXMgZGF5anMuRGF5anM7XG5cbiAgICBpZiAodHlwZSA9PT0gJ2xlZnQnKSB7XG4gICAgICB0aGlzLmRpc2FibGVNb250aCgpLmxlZnQuc2V0KFtdKTtcblxuICAgICAgaWYgKG1pbkRhdGU/LnllYXIoKSA9PT0gdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhcikge1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IChtaW5EYXRlPy5tb250aCgpICsgMSk7IGkrKykge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZU1vbnRoKCkubGVmdC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgICBjdXJyZW50LnB1c2goaSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobWF4RGF0ZT8ueWVhcigpID09PSB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBtYXhEYXRlPy5tb250aCgpICsgMjsgaSA8IDEzOyBpKyspIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVNb250aCgpLmxlZnQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5wdXNoKGkpO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXNhYmxlTW9udGgoKS5yaWdodC5zZXQoW10pO1xuICAgIGlmIChtaW5EYXRlPy55ZWFyKCkgPT09IHRoaXMubGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IChtaW5EYXRlPy5tb250aCgpICsgMSk7IGkrKykge1xuICAgICAgICB0aGlzLmRpc2FibGVNb250aCgpLnJpZ2h0LnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LnB1c2goaSk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtYXhEYXRlPy55ZWFyKCkgPT09IHRoaXMubGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICBmb3IgKGxldCBpID0gbWF4RGF0ZT8ubW9udGgoKSArIDI7IGkgPCAxMzsgaSsrKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZU1vbnRoKCkucmlnaHQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQucHVzaChpKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKChOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhcikgPT09IE51bWJlcih0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpOyBpKyspIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlTW9udGgoKS5yaWdodC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5wdXNoKGkpO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tQcmV2KHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgJiYgdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aCkge1xuICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8uc3VidHJhY3QoMSwgJ21vbnRoJyk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSAodGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8ubW9udGgoKSA/PyAwKSArIDE7XG4gICAgICAgIGN1cnJlbnQueWVhciA9IHRoaXMubGVmdENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG4gICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQubW9udGggPSBjdXJyZW50Lm1vbnRoPy5zdWJ0cmFjdCgxLCAnbW9udGgnKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50Lm1vbnRoID0gKHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoPy5tb250aCgpID8/IDApICsgMTtcbiAgICAgIGN1cnJlbnQueWVhciA9IHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoPy55ZWFyKCk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcbiAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja05leHQoc2lkZTogU2lkZUVudW0pIHtcbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCkge1xuICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8uYWRkKDEsICdtb250aCcpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gKHRoaXMubGVmdENhbGVuZGFyKCkubW9udGg/Lm1vbnRoKCkgPz8gMCkgKyAxO1xuICAgICAgICBjdXJyZW50LnllYXIgPSB0aGlzLmxlZnRDYWxlbmRhcigpLm1vbnRoPy55ZWFyKCk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCh0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCA9PT0gdGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLm1vbnRoKSAmJiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciA9PT0gdGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLnllYXIpKSB7XG4gICAgICAgIHRoaXMucmlnaHRDYWxlbmRhci51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/LmFkZCgxLCAnbW9udGgnKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5tb250aCA9ICh0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aD8ubW9udGgoKSA/PyAwKSArIDE7XG4gICAgICAgICAgY3VycmVudC55ZWFyID0gdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcblxuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuICAgIHRoaXMucmlnaHRDYWxlbmRhci51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8uYWRkKDEsICdtb250aCcpO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQubW9udGggPSAodGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/Lm1vbnRoKCkgPz8gMCkgKyAxO1xuICAgICAgY3VycmVudC55ZWFyID0gdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFuZGxlclBpY2tlckRhdGUoZXZlbnQ6IGFueSwgc2lkZTogU2lkZUVudW0sIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKGV2ZW50LnRhcmdldD8udGFnTmFtZSA9PT0gJ1REJykge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldC5jbGFzc0xpc3QgJiYgIWV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2F2YWlsYWJsZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGV2ZW50LnRhcmdldC50YWdOYW1lID09PSAnU1BBTicpIHtcbiAgICAgIGlmIChldmVudC50YXJnZXQucGFyZW50RWxlbWVudCAmJiBldmVudC50YXJnZXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QgJiYgIWV2ZW50LnRhcmdldC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnYXZhaWxhYmxlJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuZGF0ZU9wdGlvbnMoKS5jdXN0b21SYW5nZUxhYmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnF1aWNrUmFuZ2VzQXJyYXkoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRRdWlja1JhbmdlLnNldCh0aGlzLmRhdGVPcHRpb25zKCkuY3VzdG9tUmFuZ2VMYWJlbCk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGUgPSBzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gdGhpcy5sZWZ0Q2FsZW5kYXIoKS5jYWxlbmRhcj8uW3Jvd11bY29sXSA6IHRoaXMucmlnaHRDYWxlbmRhcigpLmNhbGVuZGFyPy5bcm93XVtjb2xdO1xuXG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3BsaXRQaWNrZXJEYXRlLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnRbc2lkZSA9PT0gU2lkZUVudW0ubGVmdCA/ICdzdGFydCcgOiAnZW5kJ10udXBkYXRlKHNpZGVDdXJyZW50ID0+IHtcbiAgICAgICAgc2lkZUN1cnJlbnQuZGF5ID0gZGF0ZS5kYXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIHNpZGVDdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlU3RhcnRFbmREYXRlKGRhdGUpO1xuXG4gICAgaWYgKHRoaXMuaXNTaW5nbGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICB0aGlzLnNldEVuZERhdGUodGhpcy5zdGFydERhdGUoKSk7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcblxuICAgICAgaWYgKHRoaXMuYXV0b0FwcGx5KCkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyQ2xpY2tBcHBseSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgIGlmICh0aGlzLmF1dG9BcHBseSgpICYmIHRoaXMuc3RhcnREYXRlKCkgJiYgdGhpcy5lbmREYXRlKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlckNsaWNrQXBwbHkoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNsaWNrQXBwbHkoZXZlbnQ/OiBFdmVudCkge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAvLyB0aGlzLnZhbGlkYXRlKCk7XG4gICAgLy8gaWYgKCF0aGlzLnZhbGlkYXRlKCkpIHtcbiAgICAvLyAgIHJldHVybjtcbiAgICAvLyB9XG4gICAgaWYgKHRoaXMuaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICB0aGlzLnNldFRpbWVJbnB1dChTaWRlRW51bS5sZWZ0KTtcbiAgICAgIHRoaXMuc2V0VGltZUlucHV0KFNpZGVFbnVtLnJpZ2h0KTtcbiAgICB9XG4gICAgdGhpcy5jYWxjdWxhdGVTZWxlY3RlZExhYmVsKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZExhYmVsKCkpIHtcbiAgICAgIHRoaXMub3V0UGlja2VyRGF0ZS5lbWl0KHsgZGlzcGxheUxhYmVsOiB0aGlzLnNlbGVjdGVkTGFiZWwoKSwgc3RhcnREYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpLCBlbmREYXRlOiB0aGlzLmVuZERhdGUoKSwgZGV0YWlsRGF0ZVBpY2tlcjogdGhpcy5zcGxpdFBpY2tlckRhdGUoKSB9KTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0NhbmNlbChldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZGF5anMoMCkpO1xuICAgIHRoaXMuZW5kRGF0ZS5zZXQoZGF5anMoMCkpO1xuICAgIHRoaXMub3V0Q2FuY2VsLmVtaXQoJycpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2woZXZlbnQ6IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQsIHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9scy5zZXQodHlwZSwgZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RlZERyb3Bkb3duKGV2ZW50OiBJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZCwgdHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vdXRDaGFuZ1N0YWdlRmxhZ01vdXNlLmVtaXQoe1xuICAgICAgaXNNb3VzZUVudGVyOiBmYWxzZSxcbiAgICAgIGlzTW91c2VFbnRlckNvbnRlbnQ6IGZhbHNlLFxuICAgICAgaXNDb250YWluZXJIYXNTY3JvbGw6IGZhbHNlXG4gICAgfSk7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgYCR7U2lkZUVudW0ubGVmdH1tb250aGA6XG4gICAgICBjYXNlIGAke1NpZGVFbnVtLnJpZ2h0fW1vbnRoYDpcbiAgICAgICAgdGhpcy51cGRhdGVNb250aFNlbGVjdChldmVudCwgdHlwZSk7XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgYCR7U2lkZUVudW0ubGVmdH15ZWFyYDpcbiAgICAgIGNhc2UgYCR7U2lkZUVudW0ucmlnaHR9eWVhcmA6XG4gICAgICAgIHRoaXMudXBkYXRlWWVhclNlbGVjdChldmVudCwgdHlwZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLnNwbGl0UGlja2VyRGF0ZS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBpZiAodHlwZSA9PT0gYCR7U2lkZUVudW0ubGVmdH1tb250aGAgfHwgdHlwZSA9PT0gYCR7U2lkZUVudW0ubGVmdH15ZWFyYCkge1xuICAgICAgICBjdXJyZW50LnN0YXJ0LnVwZGF0ZShzdGFydCA9PiB7XG4gICAgICAgICAgaWYgKHR5cGUgPT09IGAke1NpZGVFbnVtLmxlZnR9bW9udGhgKSB7XG4gICAgICAgICAgICBzdGFydC5tb250aCA9IGV2ZW50LmtleSBhcyBudW1iZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlID09PSBgJHtTaWRlRW51bS5sZWZ0fXllYXJgKSB7XG4gICAgICAgICAgICBzdGFydC55ZWFyID0gZXZlbnQua2V5IGFzIG51bWJlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3RhcnQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50LmVuZC51cGRhdGUoZW5kID0+IHtcbiAgICAgICAgaWYgKHR5cGUgPT09IGAke1NpZGVFbnVtLnJpZ2h0fW1vbnRoYCkge1xuICAgICAgICAgIGVuZC5tb250aCA9IGV2ZW50LmtleSBhcyBudW1iZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IGAke1NpZGVFbnVtLnJpZ2h0fXllYXJgKSB7XG4gICAgICAgICAgZW5kLnllYXIgPSBldmVudC5rZXkgYXMgbnVtYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVuZDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTW9udGhTZWxlY3QoZXZlbnQ6IElFbWl0U2VsZWN0S2V5LCB0eXBlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaWRlID0gdHlwZS5pbmNsdWRlcyhTaWRlRW51bS5sZWZ0KSA/IFNpZGVFbnVtLmxlZnQgOiBTaWRlRW51bS5yaWdodDtcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5jYWxlbmRhclZhcmlhYmxlcygpW3NpZGVdKCkuZHJvcGRvd25zPy4oKT8uY3VycmVudFllYXIgfHwgZGF5anMoKS55ZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSBOdW1iZXIoZXZlbnQua2V5KSAtIDE7XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCkge1xuICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZERhdGEoKS5sZWZ0bW9udGgpIHtcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkRGF0YS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5sZWZ0bW9udGggPSBmYWxzZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nZXREaXNhYmxlKCdyaWdodCcpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSBldmVudC5rZXk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChOdW1iZXIoZXZlbnQua2V5KSA+PSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpICYmIChOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhcikgPT09IE51bWJlcih0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikpKSB7XG4gICAgICAgIGlmIChOdW1iZXIoZXZlbnQua2V5KSA8PSAxMSkge1xuICAgICAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5tb250aCA9IE51bWJlcihldmVudC5rZXkpICsgMTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE51bWJlcihldmVudC5rZXkpID09PSAxMikge1xuICAgICAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5tb250aCA9IDE7XG4gICAgICAgICAgICBjdXJyZW50LnllYXIgKz0gMTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ucmlnaHQpIHtcbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0ZWREYXRhKCkucmlnaHRtb250aCkge1xuICAgICAgICB0aGlzLmlzU2VsZWN0ZWREYXRhLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LnJpZ2h0bW9udGggPSBmYWxzZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nZXREaXNhYmxlKCdyaWdodCcpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gZXZlbnQua2V5O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuICAgICh0aGlzLmZ1bmN0aW9uQ29udHJvbHMuZ2V0KHR5cGUpIGFzIElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KT8ucmVtb3ZlTGlzdCgpO1xuXG4gICAgdGhpcy5nZXREaXNhYmxlKCdyaWdodCcpO1xuICAgIHRoaXMubW9udGhPclllYXJDaGFuZ2VkKG1vbnRoLCB5ZWFyLCBzaWRlKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVllYXJTZWxlY3QoZXZlbnQ6IElFbWl0U2VsZWN0S2V5LCB0eXBlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaWRlID0gdHlwZS5pbmNsdWRlcyhTaWRlRW51bS5sZWZ0KSA/IFNpZGVFbnVtLmxlZnQgOiBTaWRlRW51bS5yaWdodDtcblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSB7XG4gICAgICBpZiAodGhpcy5pc1NlbGVjdGVkRGF0YSgpPy5sZWZ0eWVhcikge1xuICAgICAgICB0aGlzLmlzU2VsZWN0ZWREYXRhLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LmxlZnR5ZWFyID0gZmFsc2U7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2V0RGlzYWJsZSgnbGVmdCcpO1xuICAgICAgICAvLyB0aGlzLlNldExpc3RZZWFyUmlnaHQodGhpcy5saXN0Vmlld0tleVNlbGVjdGVkWWVhciBhcyBudW1iZXIpO1xuICAgICAgICAodGhpcy5mdW5jdGlvbkNvbnRyb2xzLmdldCh0eXBlKSBhcyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCk/LnJlbW92ZUxpc3QoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LnllYXIgPSBldmVudC5rZXk7XG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciAmJiB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhciAmJiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciA+PSB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikpIHtcbiAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC55ZWFyID0gZXZlbnQua2V5O1xuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICYmIE51bWJlcih0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCkgPD0gMTEpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpICsgMTtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCAmJiB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCA9PT0gMTIpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpO1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0RGlzYWJsZSgnbGVmdCcpO1xuICAgICAgdGhpcy5idWlsZENvbmZpZ1llYXIoU2lkZUVudW0ucmlnaHQsIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgYXMgbnVtYmVyKTtcbiAgICAgICh0aGlzLmZ1bmN0aW9uQ29udHJvbHMuZ2V0KHR5cGUpIGFzIElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KT8ucmVtb3ZlTGlzdCgpO1xuICAgIH1cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ucmlnaHQpIHtcbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0ZWREYXRhKCkucmlnaHR5ZWFyKSB7XG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZERhdGEudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQucmlnaHR5ZWFyID0gZmFsc2U7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC55ZWFyID0gZXZlbnQua2V5O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciAmJiB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhciAmJiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciA+PSB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikpIHtcbiAgICAgICAgaWYgKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICYmIE51bWJlcih0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCkgPD0gMTEpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpICsgMTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICYmIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoID09PSAxMikge1xuICAgICAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5tb250aCA9IE51bWJlcih0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcbiAgICBsZXQgbW9udGggPSBkYXlqcygpLm1vbnRoKCk7XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ucmlnaHQgJiYgdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpIHtcbiAgICAgIG1vbnRoID0gTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSAtIDE7XG4gICAgfVxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0ICYmIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSB7XG4gICAgICBtb250aCA9IE51bWJlcih0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCkgLSAxO1xuICAgIH1cbiAgICBjb25zdCB5ZWFyID0gTnVtYmVyKGV2ZW50LmtleSk7XG5cbiAgICB0aGlzLm1vbnRoT3JZZWFyQ2hhbmdlZChtb250aCwgeWVhciwgc2lkZSk7XG5cbiAgfVxuICBwcml2YXRlIG1vbnRoT3JZZWFyQ2hhbmdlZChtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIsIHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgY29uc3QgaXNMZWZ0ID0gc2lkZSA9PT0gU2lkZUVudW0ubGVmdDtcbiAgICBjb25zdCBtaW5EYXRlID0gdGhpcy5taW5EYXRlKCkgYXMgZGF5anMuRGF5anM7XG4gICAgY29uc3QgbWF4RGF0ZSA9IHRoaXMubWF4RGF0ZSgpIGFzIGRheWpzLkRheWpzO1xuXG4gICAgaWYgKG1pbkRhdGUgJiYgKHllYXIgPCBtaW5EYXRlPy55ZWFyKCkgfHwgKHllYXIgPT09IG1pbkRhdGU/LnllYXIoKSAmJiBtb250aCA8IG1pbkRhdGU/Lm1vbnRoKCkpKSkge1xuICAgICAgbW9udGggPSBtaW5EYXRlPy5tb250aCgpO1xuICAgICAgeWVhciA9IG1pbkRhdGU/LnllYXIoKTtcbiAgICB9XG5cbiAgICBpZiAobWF4RGF0ZSAmJiAoeWVhciA+IG1heERhdGU/LnllYXIoKSB8fCAoeWVhciA9PT0gbWF4RGF0ZT8ueWVhcigpICYmIG1vbnRoID4gbWF4RGF0ZT8ubW9udGgoKSkpKSB7XG4gICAgICBtb250aCA9IG1heERhdGU/Lm1vbnRoKCk7XG4gICAgICB5ZWFyID0gbWF4RGF0ZT8ueWVhcigpO1xuICAgIH1cblxuICAgIGNvbnN0IGRyb3Bkb3ducyA9IHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKVtzaWRlXSgpLmRyb3Bkb3ducztcblxuICAgIGlmIChkcm9wZG93bnM/LigpKSB7XG4gICAgICBkcm9wZG93bnMudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LmN1cnJlbnRZZWFyID0geWVhcjtcbiAgICAgICAgY3VycmVudC5jdXJyZW50TW9udGggPSBtb250aDtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pXG5cbiAgICB9XG4gICAgaWYgKGlzTGVmdCAmJiB0aGlzLmxlZnRDYWxlbmRhcigpLm1vbnRoKSB7XG4gICAgICB0aGlzLmxlZnRDYWxlbmRhci51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSBjdXJyZW50Lm1vbnRoPy5tb250aChtb250aCkueWVhcih5ZWFyKTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuXG4gICAgaWYgKG1vbnRoID09PSAxMikge1xuICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/LmNsb25lKCkuYWRkKDEsICdtb250aCcpO1xuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG4gICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQubW9udGggPSBjdXJyZW50Lm1vbnRoPy5tb250aChtb250aCkueWVhcih5ZWFyKTtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlcklucHV0RXZlbnQoZXZlbnQ6IElFdmVudCwgdHlwZTogYGxlZnRob3VyYCB8IGBsZWZ0bWludXRlYCB8IGByaWdodGhvdXJgIHwgYHJpZ2h0bWludXRlYCkge1xuICAgIGlmIChldmVudC5rZXlDb2RlICE9PSA4KSB7XG4gICAgICBldmVudC5rZXlDb2RlICYmIHRoaXMuY2hlY2tCYWNrc3BhY2VGb2N1cy51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnRbdHlwZV0uc2V0KDEpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMua2V5Q29kZUJhY2tzcGFjZS5zZXQoZmFsc2UpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5rZXlDb2RlQmFja3NwYWNlLnNldCh0cnVlKTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnbGVmdG1pbnV0ZSc6XG4gICAgICAgIGlmIChpc0VtcHR5KHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSkpIHtcbiAgICAgICAgICBpZiAodGhpcy5jaGVja0JhY2tzcGFjZUZvY3VzKClbdHlwZV0oKSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja0JhY2tzcGFjZUZvY3VzLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgICAgY3VycmVudFt0eXBlXS5zZXQoY3VycmVudFt0eXBlXSgpICsgMSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNoZWNrQmFja3NwYWNlRm9jdXMudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudFt0eXBlXS5zZXQoMSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgICh0aGlzLmZ1bmN0aW9uQ29udHJvbHMuZ2V0KGAke1NpZGVFbnVtLmxlZnR9aG91cmApIGFzIElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50KT8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmlnaHRtaW51dGUnOlxuICAgICAgICBpZiAoaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodG1pbnV0ZSgpKSkge1xuICAgICAgICAgIGlmICh0aGlzLmNoZWNrQmFja3NwYWNlRm9jdXMoKVt0eXBlXSgpID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrQmFja3NwYWNlRm9jdXMudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgICBjdXJyZW50W3R5cGVdLnNldChjdXJyZW50W3R5cGVdKCkgKyAxKTtcblxuICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2hlY2tCYWNrc3BhY2VGb2N1cy51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgICBjdXJyZW50W3R5cGVdLnNldCgxKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgKHRoaXMuZnVuY3Rpb25Db250cm9scy5nZXQoYCR7U2lkZUVudW0ucmlnaHR9aG91cmApIGFzIElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50KT8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckZvY3VzQW5kQmx1clRpbWUoZXZlbnQ6IElGb2N1c0FuZEJsdXJFdmVudCwgdHlwZTogYGxlZnRob3VyYCB8IGBsZWZ0bWludXRlYCB8IGByaWdodGhvdXJgIHwgYHJpZ2h0bWludXRlYCkge1xuICAgIGlmIChldmVudC5uYW1lID09PSAnZm9jdXMnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50SW5wdXQgPSBldmVudC5ldmVudCBhcyBJRXZlbnQ7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnRJbnB1dC50YXJnZXQ7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2xlZnRob3VyJzpcbiAgICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkubGVmdC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5zZWxlY3RlZEhvdXIgPSAhaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpKSA/IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRob3VyKCkgOiAwO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKE51bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpKSA9PT0gMCkgfHwgaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpKSkge1xuICAgICAgICAgIHRoaXMudGltZXBpY2tlclZhbHVlSXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgICBjdXJyZW50LmxlZnRob3VyLnNldCgwKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGFyZ2V0LnZhbHVlID0gJzAwJztcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdGhvdXIoKSkgPCAxMCkge1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGAwJHtOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdGhvdXIoKSl9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmlnaHRob3VyJzpcbiAgICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkucmlnaHQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuc2VsZWN0ZWRIb3VyID0gIWlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkpID8gdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkgOiAwO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKE51bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKSkgPT09IDApIHx8IGlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkpKSB7XG4gICAgICAgICAgdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQucmlnaHRob3VyLnNldCgwKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGFyZ2V0LnZhbHVlID0gJzAwJztcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE51bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKSkgPCAxMCkge1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGAwJHtOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkpfWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2xlZnRtaW51dGUnOlxuICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKS5sZWZ0LnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkTWludXRlID0gIWlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpKSA/IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSA6IDA7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICgoTnVtYmVyKHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSkgPT09IDApIHx8IGlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpKSkge1xuICAgICAgICAgIHRoaXMudGltZXBpY2tlclZhbHVlSXRlbS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgICBjdXJyZW50LmxlZnRtaW51dGUuc2V0KDApO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0YXJnZXQudmFsdWUgPSAnMDAnO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoTnVtYmVyKHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSkgPCAxMCkge1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGAwJHtOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpKX1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyaWdodG1pbnV0ZSc6XG4gICAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpLnJpZ2h0LnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkTWludXRlID0gIWlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSkgPyB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodG1pbnV0ZSgpIDogMDtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKChOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSkgPT09IDApIHx8IGlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSkpIHtcbiAgICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5yaWdodG1pbnV0ZS5zZXQoMCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9ICcwMCc7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSkgPCAxMCkge1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGAwJHtOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSl9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNoYW5nZVRpbWVWYWx1ZShldmVudDogc3RyaW5nIHwgbnVtYmVyLCB0eXBlOiBgbGVmdGhvdXJgIHwgYGxlZnRtaW51dGVgIHwgYHJpZ2h0aG91cmAgfCBgcmlnaHRtaW51dGVgKSB7XG4gICAgdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnRbdHlwZV0uc2V0KGV2ZW50IGFzIG51bWJlcik7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2lkZSA9IHR5cGUuaW5jbHVkZXMoU2lkZUVudW0ubGVmdCkgPyBTaWRlRW51bS5sZWZ0IDogU2lkZUVudW0ucmlnaHQ7XG4gICAgY29uc3QgYXR0ciA9IHR5cGUuaW5jbHVkZXMoJ2hvdXInKSA/ICdob3VyJyA6ICdtaW51dGUnO1xuXG4gICAgdGhpcy5zcGxpdFBpY2tlckRhdGUudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgY3VycmVudFtzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gJ3N0YXJ0JyA6ICdlbmQnXS51cGRhdGUoc2lkZUN1cnJlbnQgPT4ge1xuICAgICAgICBzaWRlQ3VycmVudFthdHRyXSA9IGV2ZW50IGFzIG51bWJlcjtcblxuICAgICAgICByZXR1cm4gc2lkZUN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgaWYgKCh0eXBlICE9PSAnbGVmdGhvdXInICYmIHR5cGUgIT09ICdyaWdodGhvdXInKSB8fCBldmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzWmVyby5zZXQoZmFsc2UpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgoYCR7ZXZlbnR9YC5sZW5ndGggPT09IDIpIHx8IChOdW1iZXIoZXZlbnQpID4gMikgfHwgKE51bWJlcihldmVudCkgPD0gMiAmJiBOdW1iZXIoZXZlbnQpID4gMCAmJiB0aGlzLmlzWmVybygpKSB8fCAodGhpcy5pc1plcm8oKSAmJiAhdGhpcy5rZXlDb2RlQmFja3NwYWNlKCkpKSB7XG4gICAgICB0aGlzLmlzWmVyby5zZXQoZmFsc2UpO1xuICAgICAgKHRoaXMuZnVuY3Rpb25Db250cm9scy5nZXQodHlwZSA9PT0gJ2xlZnRob3VyJyA/IGAke1NpZGVFbnVtLmxlZnR9bWludXRlYCA6IGAke1NpZGVFbnVtLnJpZ2h0fW1pbnV0ZWApIGFzIElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50KT8uZm9jdXMoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoTnVtYmVyKGV2ZW50KSA9PT0gMCAmJiAhdGhpcy5rZXlDb2RlQmFja3NwYWNlKCkpIHtcbiAgICAgIHRoaXMuaXNaZXJvLnNldCh0cnVlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2hvd0xpc3REcm9wZG93bihldmVudDogYm9vbGVhbiwgdHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy5jaGVja1Nob3dMaXN0RHJvcGRvd24udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBjdXJyZW50W3R5cGVdID0gZXZlbnQ7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnZlcnRJdGVtTW9udGggPSAoaXRlbTogYW55KSA9PiB7XG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHNldChpdGVtLCAnbGFiZWxEaXNwbGF5JywgdGhpcy50cmFuc2xhdGUuaW5zdGFudChpdGVtLmxhYmVsIHx8ICcgJywgeyB5ZWFyOiAnJyB9KSk7XG5cbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuICBwcm90ZWN0ZWQgY29udmVydEl0ZW1ZZWFyID0gKGl0ZW06IGFueSkgPT4ge1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBpdGVtLmxhYmVsRGlzcGxheSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2kxOG5feWVhcl9wYXJhbScsIHsgeWVhcjogaXRlbS5sYWJlbCB9KTtcblxuICAgIHJldHVybiBpdGVtO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNb250aHNJblZpZXcoKSB7XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICBpZiAoIXRoaXMuaXNTaW5nbGUoKSAmJiB0aGlzLmxlZnRDYWxlbmRhcigpLm1vbnRoICYmIHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoICYmXG4gICAgICAgICgodGhpcy5sZWZ0Q2FsZW5kYXIoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0nKSA9PT0gdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykpIHx8ICh0aGlzLnJpZ2h0Q2FsZW5kYXIoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0nKSA9PT0gdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/LmZvcm1hdCgnWVlZWS1NTScpKSlcbiAgICAgICAgJiYgKHRoaXMuZW5kRGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0nKSA9PT0gdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykgfHwgdGhpcy5lbmREYXRlKCk/LmZvcm1hdCgnWVlZWS1NTScpID09PSB0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykpXG4gICAgICApIHsgcmV0dXJuOyB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICAgIHRoaXMubGVmdENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50Lm1vbnRoID0gdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKT8uZGF0ZSgyKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5lbmREYXRlKCk/Lm1vbnRoKCkgIT09IHRoaXMuc3RhcnREYXRlKCk/Lm1vbnRoKCkgfHwgdGhpcy5lbmREYXRlKCk/LnllYXIoKSAhPT0gdGhpcy5zdGFydERhdGUoKT8ueWVhcigpKSB7XG4gICAgICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSB0aGlzLmVuZERhdGUoKT8uY2xvbmUoKT8uZGF0ZSgyKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50Lm1vbnRoID0gdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKT8uZGF0ZSgyKT8uYWRkKDEsICdtb250aCcpO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSgpICYmIHRoaXMubGVmdENhbGVuZGFyKCkubW9udGggJiYgdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGggJiYgdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykgIT09IHRoaXMuc3RhcnREYXRlKCk/LmZvcm1hdCgnWVlZWS1NTScpICYmIHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoPy5mb3JtYXQoJ1lZWVktTU0nKSAhPT0gdGhpcy5zdGFydERhdGUoKT8uZm9ybWF0KCdZWVlZLU1NJykpIHtcbiAgICAgIHRoaXMubGVmdENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5tb250aCA9IHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCk/LmRhdGUoMik7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmlnaHRDYWxlbmRhci51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSB0aGlzLnN0YXJ0RGF0ZSgpPy5jbG9uZSgpPy5kYXRlKDIpPy5hZGQoMSwgJ21vbnRoJyk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFRpbWVJbnB1dChzaWRlOiBTaWRlRW51bSkge1xuICAgIGNvbnN0IGhvdXIgPSBwYXJzZUludChgJHt0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkSG91cn1gKTtcbiAgICBjb25zdCBtaW51dGUgPSBwYXJzZUludChgJHt0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkTWludXRlfWApO1xuXG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgJiYgdGhpcy5zdGFydERhdGUoKSkge1xuICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKTtcblxuICAgICAgc3RhcnQgPSBzdGFydD8uaG91cihob3VyKTtcbiAgICAgIHN0YXJ0ID0gc3RhcnQ/Lm1pbnV0ZShtaW51dGUpO1xuICAgICAgdGhpcy5zZXRTdGFydERhdGUoc3RhcnQpO1xuICAgICAgaWYgKHRoaXMuaXNTaW5nbGUoKSkge1xuICAgICAgICB0aGlzLmVuZERhdGUuc2V0KHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCkpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZW5kRGF0ZSgpICYmIHRoaXMuZW5kRGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gc3RhcnQ/LmZvcm1hdCgnWVlZWS1NTS1ERCcpICYmIHRoaXMuZW5kRGF0ZSgpPy5pc0JlZm9yZShzdGFydCkpIHtcbiAgICAgICAgdGhpcy5zZXRFbmREYXRlKHN0YXJ0Py5jbG9uZSgpKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5lbmREYXRlKCkgJiYgc3RhcnQgJiYgdGhpcy5oYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDbG9uZSA9IHRoaXMuZ2V0RGF0ZVdpdGhUaW1lKHN0YXJ0LCBTaWRlRW51bS5yaWdodCk7XG5cbiAgICAgICAgaWYgKHN0YXJ0Q2xvbmUuaXNCZWZvcmUoc3RhcnQpKSB7XG4gICAgICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbU2lkZUVudW0ucmlnaHRdLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQuc2VsZWN0ZWRIb3VyID0gaG91cjtcbiAgICAgICAgICAgIGN1cnJlbnQuc2VsZWN0ZWRNaW51dGUgPSBtaW51dGU7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICBsZXQgZW5kID0gdGhpcy5lbmREYXRlKCk/LmNsb25lKCk7XG5cbiAgICAgIGVuZCA9IGVuZD8uaG91cihob3VyKTtcbiAgICAgIGVuZCA9IGVuZD8ubWludXRlKG1pbnV0ZSk7XG4gICAgICB0aGlzLnNldEVuZERhdGUoZW5kKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB0aGlzLnJlbmRlclRpbWVQaWNrZXIoU2lkZUVudW0ubGVmdCk7XG4gICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2FsZW5kYXJzKCkge1xuICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoU2lkZUVudW0ubGVmdCk7XG4gICAgdGhpcy5yZW5kZXJDYWxlbmRhcihTaWRlRW51bS5yaWdodCk7XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSgpID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2FsY3VsYXRlU2VsZWN0ZWRMYWJlbCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJDYWxlbmRhcihzaWRlOiBTaWRlRW51bSkgeyAvLyBzaWRlIGVudW1cbiAgICBjb25zdCBtYWluQ2FsZW5kYXI6IHsgY2FsZW5kYXI/OiBJQ2FsZW5kYXIsIG1vbnRoPzogZGF5anMuRGF5anMgfSA9IChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSA/IHRoaXMubGVmdENhbGVuZGFyKCkgOiB0aGlzLnJpZ2h0Q2FsZW5kYXIoKTtcblxuICAgIGlmICghbWFpbkNhbGVuZGFyLm1vbnRoIHx8ICh0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9udGggPSBtYWluQ2FsZW5kYXIubW9udGgubW9udGgoKTtcbiAgICBjb25zdCB5ZWFyID0gbWFpbkNhbGVuZGFyLm1vbnRoLnllYXIoKTtcbiAgICBjb25zdCBob3VyID0gbWFpbkNhbGVuZGFyLm1vbnRoLmhvdXIoKTtcbiAgICBjb25zdCBtaW51dGUgPSBtYWluQ2FsZW5kYXIubW9udGgubWludXRlKCk7XG4gICAgY29uc3Qgc2Vjb25kID0gbWFpbkNhbGVuZGFyLm1vbnRoLnNlY29uZCgpO1xuICAgIGNvbnN0IGRheXNJbk1vbnRoID0gZGF5anMobmV3IERhdGUoeWVhciwgbW9udGgpKS5kYXlzSW5Nb250aCgpO1xuICAgIGNvbnN0IGZpcnN0RGF5ID0gZGF5anMobmV3IERhdGUoeWVhciwgbW9udGgsIDEpKTtcbiAgICBjb25zdCBsYXN0RGF5ID0gZGF5anMobmV3IERhdGUoeWVhciwgbW9udGgsIGRheXNJbk1vbnRoKSk7XG4gICAgY29uc3QgbGFzdE1vbnRoID0gZGF5anMoZmlyc3REYXkpLnN1YnRyYWN0KDEsICdtb250aCcpLm1vbnRoKCk7XG4gICAgY29uc3QgbGFzdFllYXIgPSBkYXlqcyhmaXJzdERheSkuc3VidHJhY3QoMSwgJ21vbnRoJykueWVhcigpO1xuICAgIGNvbnN0IGRheXNJbkxhc3RNb250aCA9IGRheWpzKG5ldyBEYXRlKGxhc3RZZWFyLCBsYXN0TW9udGgpKS5kYXlzSW5Nb250aCgpO1xuICAgIGNvbnN0IGRheU9mV2VlayA9IGZpcnN0RGF5LmRheSgpO1xuICAgIGNvbnN0IGNhbGVuZGFyOiBJQ2FsZW5kYXIgPSB7fTtcblxuICAgIGNhbGVuZGFyLmZpcnN0RGF5ID0gZmlyc3REYXk7XG4gICAgY2FsZW5kYXIubGFzdERheSA9IGxhc3REYXk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICAgIGNhbGVuZGFyW2ldID0gW107XG4gICAgfVxuICAgIGxldCBzdGFydERheSA9IGRheXNJbkxhc3RNb250aCAtIGRheU9mV2VlayArICh0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkgPz8gMSkgKyAxO1xuXG4gICAgaWYgKHN0YXJ0RGF5ID4gZGF5c0luTGFzdE1vbnRoKSB7XG4gICAgICBzdGFydERheSAtPSA3O1xuICAgIH1cbiAgICBpZiAoZGF5T2ZXZWVrID09PSB0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkpIHtcbiAgICAgIHN0YXJ0RGF5ID0gZGF5c0luTGFzdE1vbnRoIC0gNjtcbiAgICB9XG4gICAgbGV0IGN1ckRhdGUgPSBkYXlqcyhuZXcgRGF0ZShsYXN0WWVhciwgbGFzdE1vbnRoLCBzdGFydERheSwgMTIsIG1pbnV0ZSwgc2Vjb25kKSk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgY29sID0gMCwgcm93ID0gMDsgaSA8IDQyOyBpKyssIGNvbCsrLCBjdXJEYXRlID0gZGF5anMoY3VyRGF0ZSkuYWRkKDI0LCAnaG91cicpKSB7XG4gICAgICBpZiAoaSA+IDAgJiYgY29sICUgNyA9PT0gMCkge1xuICAgICAgICBjb2wgPSAwO1xuICAgICAgICByb3crKztcbiAgICAgIH1cbiAgICAgIGNhbGVuZGFyW3Jvd11bY29sXSA9IGN1ckRhdGUuY2xvbmUoKS5ob3VyKGhvdXIpLm1pbnV0ZShtaW51dGUpLnNlY29uZChzZWNvbmQpO1xuICAgICAgY3VyRGF0ZSA9IGN1ckRhdGUuaG91cigxMik7XG5cbiAgICAgIGNvbnN0IG1pbkRhdGUgPSB0aGlzLm1pbkRhdGUoKSBhcyBkYXlqcy5EYXlqcztcbiAgICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm1heERhdGUoKSBhcyBkYXlqcy5EYXlqcztcbiAgICAgIGlmIChtaW5EYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gbWluRGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmlzQmVmb3JlKG1pbkRhdGUpICYmIHNpZGUgPT09ICdsZWZ0Jykge1xuICAgICAgICBjYWxlbmRhcltyb3ddW2NvbF0gPSBtaW5EYXRlPy5jbG9uZSgpO1xuICAgICAgfVxuICAgICAgaWYgKG1heERhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBtYXhEYXRlPy5mb3JtYXQoJ1lZWVktTU0tREQnKSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uaXNBZnRlcihtYXhEYXRlKSAmJiBzaWRlID09PSAncmlnaHQnKSB7XG4gICAgICAgIGNhbGVuZGFyW3Jvd11bY29sXSA9IG1heERhdGU/LmNsb25lKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQpIHtcbiAgICAgIHRoaXMubGVmdENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5jYWxlbmRhciA9IGNhbGVuZGFyO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5yaWdodCkge1xuICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5jYWxlbmRhciA9IGNhbGVuZGFyO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IG1pbkRhdGUgPSBzaWRlID09PSAnbGVmdCcgPyAodGhpcy5taW5EYXRlKCkgYXMgZGF5anMuRGF5anMpIDogdGhpcy5zdGFydERhdGUoKTtcbiAgICBjb25zdCBtYXhEYXRlID0gdGhpcy5tYXhEYXRlKCkgYXMgZGF5anMuRGF5anM7XG5cbiAgICB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKClbc2lkZV0uc2V0KHtcbiAgICAgIG1vbnRoOiBtb250aCxcbiAgICAgIHllYXI6IHllYXIsXG4gICAgICBob3VyOiBob3VyLFxuICAgICAgbWludXRlOiBtaW51dGUsXG4gICAgICBzZWNvbmQ6IHNlY29uZCxcbiAgICAgIGRheXNJbk1vbnRoOiBkYXlzSW5Nb250aCxcbiAgICAgIGZpcnN0RGF5OiBmaXJzdERheSxcbiAgICAgIGxhc3REYXk6IGxhc3REYXksXG4gICAgICBsYXN0TW9udGg6IGxhc3RNb250aCxcbiAgICAgIGxhc3RZZWFyOiBsYXN0WWVhcixcbiAgICAgIGRheXNJbkxhc3RNb250aDogZGF5c0luTGFzdE1vbnRoLFxuICAgICAgZGF5T2ZXZWVrOiBkYXlPZldlZWssXG4gICAgICBjYWxSb3dzOiBzaWduYWwoQXJyYXkuZnJvbShBcnJheSg2KS5rZXlzKCkpKSxcbiAgICAgIGNhbENvbHM6IHNpZ25hbChBcnJheS5mcm9tKEFycmF5KDcpLmtleXMoKSkpLFxuICAgICAgY2xhc3Nlczoge30sXG4gICAgICBtaW5EYXRlOiBtaW5EYXRlLFxuICAgICAgbWF4RGF0ZTogbWF4RGF0ZSxcbiAgICAgIGNhbGVuZGFyOiBjYWxlbmRhcixcbiAgICAgIGRyb3Bkb3duczogc2lnbmFsKHt9KVxuICAgIH0pO1xuICAgIGlmICh0aGlzLnNob3dEcm9wZG93bnNTZWxlY3QoKSkge1xuICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gY2FsZW5kYXJbMV1bMV0ubW9udGgoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gY2FsZW5kYXJbMV1bMV0ueWVhcigpO1xuICAgICAgY29uc3QgbWF4WWVhciA9IChtYXhEYXRlICYmIG1heERhdGU/LnllYXIoKSkgfHwgREVGQVVMVF9NQVhfWUVBUjtcbiAgICAgIGNvbnN0IG1pblllYXIgPSAobWluRGF0ZSAmJiBtaW5EYXRlPy55ZWFyKCkpIHx8IERFRkFVTFRfTUlOX1lFQVI7XG4gICAgICBjb25zdCBpbk1pblllYXIgPSBjdXJyZW50WWVhciA9PT0gbWluWWVhcjtcbiAgICAgIGNvbnN0IGluTWF4WWVhciA9IGN1cnJlbnRZZWFyID09PSBtYXhZZWFyO1xuICAgICAgY29uc3QgeWVhcnMgPSBbXTtcblxuICAgICAgZm9yIChsZXQgeSA9IG1pblllYXI7IHkgPD0gbWF4WWVhcjsgeSsrKSB7XG4gICAgICAgIHllYXJzLnB1c2goeSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKClbc2lkZV0oKS5kcm9wZG93bnM/LnNldCh7XG4gICAgICAgIGN1cnJlbnRNb250aDogY3VycmVudE1vbnRoLFxuICAgICAgICBjdXJyZW50WWVhcjogY3VycmVudFllYXIsXG4gICAgICAgIG1heFllYXI6IG1heFllYXIsXG4gICAgICAgIG1pblllYXI6IG1pblllYXIsXG4gICAgICAgIGluTWluWWVhcjogaW5NaW5ZZWFyLFxuICAgICAgICBpbk1heFllYXI6IGluTWF4WWVhcixcbiAgICAgICAgbW9udGhBcnJheXM6IHNpZ25hbChBcnJheS5mcm9tKEFycmF5KDEyKS5rZXlzKCkpKSxcbiAgICAgICAgeWVhckFycmF5czogc2lnbmFsKHllYXJzKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuYnVpbGRDZWxscyhjYWxlbmRhciwgc2lkZSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQ2VsbHMoY2FsZW5kYXI6IElDYWxlbmRhciwgc2lkZTogU2lkZUVudW0pIHtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCA2OyByb3crKykge1xuICAgICAgY29uc3QgY2xhc3NsZXNzID0gdGhpcy5jYWxlbmRhclZhcmlhYmxlcygpW3NpZGVdKCk7XG5cbiAgICAgIGlmIChjbGFzc2xlc3MuY2xhc3Nlcykge1xuICAgICAgICBjbGFzc2xlc3MuY2xhc3Nlc1tyb3ddID0ge307XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCA3OyBjb2wrKykge1xuICAgICAgICBjb25zdCBjbGFzc2VzID0gW107XG5cbiAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGUoKSBhcyBkYXlqcy5EYXlqcztcbiAgICAgICAgY29uc3QgZW5kRGF0ZSA9IHRoaXMuZW5kRGF0ZSgpIGFzIGRheWpzLkRheWpzO1xuICAgICAgICBjb25zdCBub3dIb3ZlcmVkRGF0ZSA9IHRoaXMubm93SG92ZXJlZERhdGUoKTtcblxuICAgICAgICBpZiAoY2FsZW5kYXJbcm93XVtjb2xdLmlzU2FtZShuZXcgRGF0ZSgpLCAnZGF5JykpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ3RvZGF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhbGVuZGFyW3Jvd11bY29sXS5pc29XZWVrZGF5KCkgPiA1KSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCd3ZWVrZW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhbGVuZGFyW3Jvd11bY29sXS5tb250aCgpICE9PSBjYWxlbmRhclsxXVsxXS5tb250aCgpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdvZmYnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5taW5EYXRlKCkgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmlzQmVmb3JlKHRoaXMubWluRGF0ZSgpLCAnZGF5JykpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ29mZicsICdkaXNhYmxlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNhbGVuZGFyVmFyaWFibGVzKClbc2lkZV0oKS5tYXhEYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXS5pc0FmdGVyKHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKVtzaWRlXSgpLm1heERhdGUsICdkYXknKSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnb2ZmJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0RGF0ZSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uZm9ybWF0KCdZWVlZLU1NLUREJykgPT09IHN0YXJ0RGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ2FjdGl2ZScsICdzdGFydC1kYXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZERhdGUgIT09IG51bGwgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBlbmREYXRlPy5mb3JtYXQoJ1lZWVktTU0tREQnKSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnYWN0aXZlJywgJ2VuZC1kYXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0RGF0ZSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uZm9ybWF0KCdZWVlZLU1NLUREJykgPT09IHN0YXJ0RGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykgJiYgKCFlbmREYXRlIHx8IGVuZERhdGUgIT09IG51bGwgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBlbmREYXRlPy5mb3JtYXQoJ1lZWVktTU0tREQnKSkpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ2FjdGl2ZScsICdmdWxsLWRhdGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGFydERhdGUgJiYgZW5kRGF0ZSAmJiAoKG5vd0hvdmVyZWREYXRlICE9PSBudWxsICYmIHRoaXMucGlja2luZ0RhdGUoKSkgfHwgZW5kRGF0ZSAhPT0gbnVsbCkgJiYgKGNhbGVuZGFyW3Jvd11bY29sXSA+IHN0YXJ0RGF0ZSAmJiAoY2FsZW5kYXJbcm93XVtjb2xdIDwgZW5kRGF0ZSB8fCAobm93SG92ZXJlZERhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdIDwgbm93SG92ZXJlZERhdGUgJiYgdGhpcy5waWNraW5nRGF0ZSgpKSkpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCFjbGFzc2VzLmZpbmQoZWwgPT4gZWwgPT09ICdvZmYnKSA/ICdpbi1yYW5nZScgOiAnZm9jdXMtb2ZmJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNuYW1lID0gJycsIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY25hbWUgKz0gY2xhc3Nlc1tpXSArICcgJztcblxuICAgICAgICAgIGlmIChjbGFzc2VzW2ldID09PSAnZGlzYWJsZWQnKSB7XG4gICAgICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICAgICAgY25hbWUgKz0gJ2F2YWlsYWJsZSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2xhc3NsZXNzLmNsYXNzZXMpIHtcbiAgICAgICAgICBjbGFzc2xlc3MuY2xhc3Nlc1tyb3ddW2NvbF0gPSBjbmFtZS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclRpbWVQaWNrZXIoc2lkZTogU2lkZUVudW0pIHtcbiAgICBsZXQgc2VsZWN0ZWQ6IGRheWpzLkRheWpzID0gZGF5anMoKSwgbWluRGF0ZTtcbiAgICBjb25zdCBtYXhEYXRlID0gdGhpcy5tYXhEYXRlKCk7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGUoKTtcbiAgICBjb25zdCBlbmREYXRlID0gdGhpcy5lbmREYXRlKCk7XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCAmJiBzdGFydERhdGUpIHtcbiAgICAgIHNlbGVjdGVkID0gc3RhcnREYXRlLmNsb25lKCk7XG4gICAgICBtaW5EYXRlID0gdGhpcy5tYXhEYXRlKCk7XG4gICAgfVxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5yaWdodCAmJiBlbmREYXRlKSB7XG4gICAgICBzZWxlY3RlZCA9IGVuZERhdGUuY2xvbmUoKTtcbiAgICAgIG1pbkRhdGUgPSB0aGlzLnN0YXJ0RGF0ZSgpO1xuICAgIH1cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ucmlnaHQgJiYgIWVuZERhdGUpIHtcbiAgICAgIGlmICghc3RhcnREYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNlbGVjdGVkID0gdGhpcy5nZXREYXRlV2l0aFRpbWUoc3RhcnREYXRlLCBTaWRlRW51bS5yaWdodCk7XG4gICAgICBpZiAoc2VsZWN0ZWQuaXNCZWZvcmUoc3RhcnREYXRlKSkge1xuICAgICAgICBzZWxlY3RlZCA9IHN0YXJ0RGF0ZS5jbG9uZSgpO1xuICAgICAgfVxuICAgICAgbWluRGF0ZSA9IHN0YXJ0RGF0ZTtcbiAgICB9XG4gICAgY29uc3Qgc3RhcnQgPSAwO1xuICAgIGNvbnN0IGVuZCA9IDIzO1xuXG4gICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbc2lkZV0uc2V0KHtcbiAgICAgIGhvdXJzOiBbXSxcbiAgICAgIG1pbnV0ZXM6IFtdLFxuICAgICAgbWludXRlc0xhYmVsOiBbXSxcbiAgICAgIHNlY29uZHM6IFtdLFxuICAgICAgc2Vjb25kc0xhYmVsOiBbXSxcbiAgICAgIGRpc2FibGVkSG91cnM6IFtdLFxuICAgICAgZGlzYWJsZWRNaW51dGVzOiBbXSxcbiAgICAgIGRpc2FibGVkU2Vjb25kczogW10sXG4gICAgICBzZWxlY3RlZEhvdXI6IDAsXG4gICAgICBzZWxlY3RlZE1pbnV0ZTogMCxcbiAgICAgIHNlbGVjdGVkU2Vjb25kOiAwLFxuICAgIH0pO1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgY29uc3QgaV9pbl8yNCA9IGk7XG5cbiAgICAgIGNvbnN0IHRpbWUgPSBzZWxlY3RlZC5jbG9uZSgpLmhvdXIoaV9pbl8yNCk7XG4gICAgICBsZXQgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKG1pbkRhdGUgJiYgdGltZS5taW51dGUoNTkpLmlzQmVmb3JlKG1pbkRhdGUpKSB7XG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhEYXRlICYmIHRpbWUubWludXRlKDApLmlzQWZ0ZXIobWF4RGF0ZSkpIHtcbiAgICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbc2lkZV0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50LmhvdXJzPy5wdXNoKGkpO1xuICAgICAgICBpZiAoaV9pbl8yNCA9PT0gc2VsZWN0ZWQuaG91cigpICYmICFkaXNhYmxlZCkge1xuICAgICAgICAgIGN1cnJlbnQuc2VsZWN0ZWRIb3VyID0gaTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgICBjdXJyZW50LmRpc2FibGVkSG91cnM/LnB1c2goaSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDYwOyBpICs9IHRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKSB7XG4gICAgICBjb25zdCBwYWRkZWQgPSBpIDwgMTAgPyAnMCcgKyBpIDogYCR7aX1gO1xuICAgICAgY29uc3QgdGltZSA9IHNlbGVjdGVkLmNsb25lKCkubWludXRlKGkpO1xuXG4gICAgICBsZXQgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKG1pbkRhdGUgJiYgdGltZS5zZWNvbmQoNTkpLmlzQmVmb3JlKG1pbkRhdGUpKSB7XG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhEYXRlICYmIHRpbWUuc2Vjb25kKDApLmlzQWZ0ZXIobWF4RGF0ZSkpIHtcbiAgICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbc2lkZV0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1pbnV0ZXM/LnB1c2goaSk7XG4gICAgICAgIGN1cnJlbnQubWludXRlc0xhYmVsPy5wdXNoKHBhZGRlZCk7XG4gICAgICAgIGlmIChzZWxlY3RlZC5taW51dGUoKSA9PT0gaSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkTWludXRlID0gaTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgICBjdXJyZW50LmRpc2FibGVkTWludXRlcz8ucHVzaChpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbc2lkZV0udXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgY3VycmVudC5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRWxlbWVudCgpIHtcbiAgICBpZiAodGhpcy5pc1NpbmdsZSgpICYmIHRoaXMuc3RhcnREYXRlKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRMYWJlbC5zZXQodGhpcy5zdGFydERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJykpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSgpICYmIHRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICAvLyBpZiB3ZSB1c2UgcmFuZ2VzIGFuZCBzaG91bGQgc2hvdyByYW5nZSBsYWJlbCBvbiBpbnB1dFxuICAgICAgaWYgKHRoaXMucXVpY2tSYW5nZXNBcnJheSgpLmxlbmd0aCAmJiB0aGlzLnNob3dSYW5nZUxhYmVsT25JbnB1dCgpICYmIHRoaXMuc2VsZWN0ZWRRdWlja1JhbmdlKCkgJiYgdGhpcy5kYXRlT3B0aW9ucygpLmN1c3RvbVJhbmdlTGFiZWwgIT09IHRoaXMuc2VsZWN0ZWRRdWlja1JhbmdlKCkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZExhYmVsLnNldCh0aGlzLnNlbGVjdGVkUXVpY2tSYW5nZSgpKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdGVkTGFiZWwuc2V0KGAke3RoaXMuc3RhcnREYXRlKCk/LmZvcm1hdCgnREQvTU0vWVlZWScpfSR7dGhpcy5kYXRlT3B0aW9ucygpLnNlcGFyYXRvcn0ke3RoaXMuZW5kRGF0ZSgpPy5mb3JtYXQoJ0REL01NL1lZWVknKX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVZpZXcoKSB7XG4gICAgaWYgKHRoaXMuaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICB0aGlzLnJlbmRlclRpbWVQaWNrZXIoU2lkZUVudW0ubGVmdCk7XG4gICAgICB0aGlzLnJlbmRlclRpbWVQaWNrZXIoU2lkZUVudW0ucmlnaHQpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZU1vbnRoc0luVmlldygpO1xuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGdldERhdGVXaXRoVGltZShkYXRlOiBkYXlqcy5EYXlqcywgc2lkZTogU2lkZUVudW0pOiBkYXlqcy5EYXlqcyB7XG4gICAgY29uc3QgaG91ciA9IHBhcnNlSW50KGAke3RoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdKCkuc2VsZWN0ZWRIb3VyfWAsIDEwKTtcbiAgICBjb25zdCBtaW51dGUgPSBwYXJzZUludChgJHt0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkTWludXRlfWAsIDEwKTtcbiAgICBjb25zdCBzZWNvbmQgPSB0aGlzLmhhc1NlY29uZFBpY2tlcigpICYmICFpc0VtcHR5KHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdKCkuc2VsZWN0ZWRTZWNvbmQpID8gcGFyc2VJbnQoYCR7dGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbc2lkZV0oKS5zZWxlY3RlZFNlY29uZH1gLCAxMCkgOiAwO1xuXG4gICAgcmV0dXJuIGRhdGUuY2xvbmUoKS5ob3VyKGhvdXIpLm1pbnV0ZShtaW51dGUpLnNlY29uZChzZWNvbmQpO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1NaW5NYXhEYXRlKHZhbHVlOiBkYXlqcy5EYXlqcyB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IGRheWpzLkRheWpzIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChkYXlqcy5pc0RheWpzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGRheWpzKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlZERpc3BsYXlUaW1lKHNpZGU6IElUaW1lcGlja2VyVmFyaWFibGVzU2lkZSkge1xuICAgIGxldCBzdHJIb3Vyczogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkID0gc2lkZS5zZWxlY3RlZEhvdXI7XG4gICAgbGV0IHN0ck1pbnV0ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkID0gc2lkZS5zZWxlY3RlZE1pbnV0ZTtcblxuICAgIGlmICgoc2lkZS5zZWxlY3RlZEhvdXIgfHwgMCkgPCAxMCkge1xuICAgICAgc3RySG91cnMgPSBgMCR7c2lkZS5zZWxlY3RlZEhvdXIgPz8gMH1gO1xuICAgIH1cblxuICAgIGlmICgoc2lkZS5zZWxlY3RlZE1pbnV0ZSB8fCAwKSA8IDEwKSB7XG4gICAgICBzdHJNaW51dGUgPSBgMCR7c2lkZS5zZWxlY3RlZE1pbnV0ZSA/PyAwfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3N0ckhvdXJzfToke3N0ck1pbnV0ZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlZERpc3BsYXlUaW1lSW5wdXQoc2lkZTogU2lkZUVudW0sIHRpbWVUeXBlOiAnaG91cicgfCAnbWludXRlJykge1xuICAgIGNvbnN0IHRpbWUgPSB0aW1lVHlwZSA9PT0gJ2hvdXInID8gKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgPyB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpIDogdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkpIDogKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgPyB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0bWludXRlKCkgOiB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodG1pbnV0ZSgpKTtcblxuICAgIGlmICghdGltZSkge1xuICAgICAgcmV0dXJuICcwMCc7XG4gICAgfVxuICAgIGlmICh0aW1lIDwgMTApIHtcbiAgICAgIHJldHVybiBgMCR7dGltZX1gO1xuICAgIH1cblxuICAgIHJldHVybiB0aW1lO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgY29uc29sZS5sb2coJ25nT25EZXN0cm95Jyk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyIHRlc3QtY2xhc3NcIj5cbiAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXhcIj5cbiAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhclwiXG4gICAgICBbY2xhc3MucmlnaHRdPVwiaXNTaW5nbGUoKVwiXG4gICAgICBbY2xhc3MubGVmdF09XCIhaXNTaW5nbGUoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJvdW5kZWQtWzRweF0gYmctWyNmZmZmZmZdXCI+XG4gICAgICAgIEBpZiAoY2FsZW5kYXJWYXJpYWJsZXMoKTsgYXMgY2FsZW5kYXJWYXJpYWJsZXMpIHtcbiAgICAgICAgICA8dGFibGU+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj1cIjdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtb250aFwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChzaG93RHJvcGRvd25zU2VsZWN0KCkgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmRyb3Bkb3ducz8uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiFmbGV4IG1iLVsxMHB4XSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0zLzQgZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J21yLVs4cHhdJz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93biBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKSArIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cInt3aWR0aEJ5UGFyZW50OmZhbHNlLGlnbm9yZUFycm93OnRydWUscGFkZGluZ0xlZnRJdGVtOiB0cnVlLCBjbGFzc0luY2x1ZGU6ICchdy1bMTMwcHhdJyxwb3NpdGlvbjp7IG1vZGU6J2NlbnRlcicsZGlzdGFuY2U6MH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdENsaWNrRXhhY3RseV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RLZXlzRGlzYWJsZV09XCJkaXNhYmxlTW9udGgoKS5sZWZ0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb252ZXJ0SXRlbVNlbGVjdGVkXT1cImNvbnZlcnRJdGVtTW9udGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RNb250aHNDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RLZXlTZWxlY3RlZF09XCJsaXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmbGFnTW91c2VdPVwiZmxhZ01vdXNlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2h0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRdPVwibW9udGhIdHRwRGV0YWlsQ29uZmlnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkRHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5sZWZ0ICsgJ21vbnRoJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCBzaWRlRW51bS5sZWZ0ICsgJ21vbnRoJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlKT1cImhhbmRsZXJDaGFuZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNob3dMaXN0KT1cImhhbmRsZXJTaG93TGlzdERyb3Bkb3duKCRldmVudCwgc2lkZUVudW0ubGVmdCArICdtb250aCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXItZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGFyayldXT1cImNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLmxlZnQgKyAnbW9udGgnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bIzZhNzM4M11dPVwiIWNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLmxlZnQgKyAnbW9udGgnXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oNG1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFN0eWxlXT1cIidub3JtYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGVPcHRpb25zKCkubW9udGhOYW1lcyAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiYgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzW2NhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhcj8uWzFdPy5bMV0/Lm1vbnRoKCkgPz8gLTFdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgdGV4dC1bMTNweF0gdGV4dC1bIzZhNzM4M11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICdtb250aCddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnJvdGF0ZV09XCIhY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICdtb250aCddID8gJzkwZGVnJzonMjcwZGVnJ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24gW2xpc3RNYXhJdGVtU2hvd109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwiekluZGV4KCkgKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7d2lkdGhCeVBhcmVudDpmYWxzZSxpZ25vcmVBcnJvdzp0cnVlLHBhZGRpbmdMZWZ0SXRlbTogdHJ1ZSxjbGFzc0luY2x1ZGU6ICchdy1bMTEwcHhdJyxwb3NpdGlvbjp7bW9kZTonY2VudGVyJyxkaXN0YW5jZTowfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q2xpY2tFeGFjdGx5XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29udmVydEl0ZW1TZWxlY3RlZF09XCJjb252ZXJ0SXRlbVllYXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwibGlzdExlZnRZZWFyQ29uZmlnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0S2V5U2VsZWN0ZWRdPVwibGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmbGFnTW91c2VdPVwiZmxhZ01vdXNlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkXT1cImxlZnRZZWFySHR0cERldGFpbENvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSk9XCJoYW5kbGVyQ2hhbmdlRmxhZ01vdXNlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTaG93TGlzdCk9XCJoYW5kbGVyU2hvd0xpc3REcm9wZG93bigkZXZlbnQsIHNpZGVFbnVtLmxlZnQgKyAneWVhcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZERyb3Bkb3duKCRldmVudCwgc2lkZUVudW0ubGVmdCArICd5ZWFyJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCBzaWRlRW51bS5sZWZ0ICsgJ3llYXInKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRhcmspXV09XCJjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5sZWZ0ICsgJ3llYXInXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bIzZhNzM4M11dPVwiIWNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLmxlZnQgKyAneWVhciddXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg0bVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250U3R5bGVdPVwiJ25vcm1hbCdcIj57eyBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8uZm9ybWF0KFwiIFlZWVlcIikgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgdGV4dC1bMTNweF0gdGV4dC1bIzZhNzM4M11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICd5ZWFyJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucm90YXRlXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5sZWZ0ICsgJ3llYXInXSA/ICc5MGRlZyc6JzI3MGRlZydcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzQgZmxleCBpdGVtcy1jZW50ZXIgcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5taW5EYXRlIHx8IChjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkubWluRGF0ZT8uaXNCZWZvcmUoY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhcj8uZmlyc3REYXkpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJoYW5kbGVyQ2xpY2tQcmV2KHNpZGVFbnVtLmxlZnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGFic29sdXRlIGxlZnQtMCB0b3AtWy0zcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHJvdGF0ZS1bMTgwZGVnXSB0ZXh0LVsjNmE3MzgzXSBjdXJzb3ItcG9pbnRlciBsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyLWljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICgoIWNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5tYXhEYXRlIHx8IGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5tYXhEYXRlPy5pc0FmdGVyKGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/Lmxhc3REYXkpKSAmJiBpc1NpbmdsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImhhbmRsZXJDbGlja05leHQoc2lkZUVudW0ubGVmdClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbWwtWzEycHhdIGFic29sdXRlIHJpZ2h0LTAgdG9wLVstM3B4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCB0ZXh0LVsjNmE3MzgzXSBjdXJzb3ItcG9pbnRlciBsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyLWljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBpZiAoIXNob3dEcm9wZG93bnNTZWxlY3QoKSB8fCAhY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmRyb3Bkb3ducykge1xuICAgICAgICAgICAgICAgICAgICB7eyBkYXRlT3B0aW9ucygpLm1vbnRoTmFtZXMgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyICYmIGRhdGVPcHRpb25zKCkubW9udGhOYW1lc1tjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/LlsxXT8uWzFdPy5tb250aCgpID8/IC0xXSB9fVxuICAgICAgICAgICAgICAgICAgICB7eyBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8uZm9ybWF0KFwiIFlZWVlcIikgfX1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJ3ZWVrLWRheXNcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChkYXlvZndlZWsgb2YgZGF0ZU9wdGlvbnMoKS5kYXlzT2ZXZWVrOyB0cmFjayBkYXlvZndlZWspIHtcbiAgICAgICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDZtIHRleHQtWyM2YTczODNdXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250U3R5bGVdPVwiJ25vcm1hbCdcIj57eyBkYXlvZndlZWsgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJkcnAtYW5pbWF0ZVwiPlxuICAgICAgICAgICAgICBAZm9yIChyb3cgb2YgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbFJvd3M/LigpOyB0cmFjayByb3cpIHtcbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJoLVszMnB4XVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNsYXNzZXMgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNsYXNzZXM/Lltyb3ddPy5jbGFzc0xpc3RcIj5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsQ29scz8uKCk7IHRyYWNrIGNvbCkge1xuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudG9kYXldPVwiY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhcj8uW3Jvd10/Lltjb2xdPy5kYXRlKCkgPT09IHRvZGF5KCkuZGF0ZSgpICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhcj8uW3Jvd10/Lltjb2xdPy5tb250aCgpID09PSB0b2RheSgpLm1vbnRoKCkgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/LnllYXIoKSA9PT0gdG9kYXkoKS55ZWFyKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2xhc3NlcyAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2xhc3Nlcz8uW3Jvd10/Lltjb2xdXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlclBpY2tlckRhdGUoJGV2ZW50LCBzaWRlRW51bS5sZWZ0LCByb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImhhbmRsZXJIb3ZlckRhdGUoJGV2ZW50LCBzaWRlRW51bS5sZWZ0LCByb3csIGNvbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktZm9udC1oNXJcIj57eyBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/LmRhdGUoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgQGlmIChoYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBjb2x1bW4gaXRlbXMtY2VudGVyIHB0LVsxMnB4XVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciByb3VuZGVkLVs0cHhdIGJvcmRlclwiXG4gICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItWyNlNmU4ZWRdXT1cIiF0aW1lUGlja2VyRXJyb3IoKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItWyNmZjU0NTRdXT1cInRpbWVQaWNrZXJFcnJvcigpXCI+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLWlucHV0IGNsYXNzSW5jbHVkZT1cIiF3LVszMHB4XSAhcC0wICFib3JkZXItbm9uZSAhdGV4dC1jZW50ZXIgbGlicy11aS1mb250LWg0cyAhdGV4dC1bIzA3MTYzMV1cIlxuICAgICAgICAgICAgICAgIGRhdGFUeXBlPVwiaW50XCJcbiAgICAgICAgICAgICAgICBbZm9jdXNUaW1lT3V0XT1cIjBcIlxuICAgICAgICAgICAgICAgIFtibHVyVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICBbYXV0b0FkZFplcm9MZXNzVGhhbjEwSW5UeXBlSW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFttYXhWYWx1ZU51bWJlcl09XCIyM1wiXG4gICAgICAgICAgICAgICAgW21pblZhbHVlTnVtYmVyXT1cIjBcIlxuICAgICAgICAgICAgICAgIFttYXhMZW5ndGhdPVwiMlwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpXCJcbiAgICAgICAgICAgICAgICAob3V0SW5wdXRFdmVudCk9XCJoYW5kbGVySW5wdXRFdmVudCgkZXZlbnQsICdsZWZ0aG91cicpXCJcbiAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgc2lkZUVudW0ubGVmdCArICdob3VyJylcIlxuICAgICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZVRpbWVWYWx1ZSgkZXZlbnQsICdsZWZ0aG91cicpXCJcbiAgICAgICAgICAgICAgICAob3V0Rm9jdXNBbmRCbHVyRXZlbnQpPVwiaGFuZGxlckZvY3VzQW5kQmx1clRpbWUoJGV2ZW50LCAnbGVmdGhvdXInKVwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGlicy11aS1mb250LWgzcyB0ZXh0LVsjMzMzMzMzXVwiPjo8L3NwYW4+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLWlucHV0IGNsYXNzSW5jbHVkZT1cIiF3LVszMHB4XSAhcC0wICFib3JkZXItbm9uZSAhdGV4dC1jZW50ZXIgIWxpYnMtdWktZm9udC1oNHMgIXRleHQtWyMwNzE2MzFdXCJcbiAgICAgICAgICAgICAgICBbYXV0b0FkZFplcm9MZXNzVGhhbjEwSW5UeXBlSW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIGRhdGFUeXBlPVwiaW50XCJcbiAgICAgICAgICAgICAgICBbZm9jdXNUaW1lT3V0XT1cIjBcIlxuICAgICAgICAgICAgICAgIFtibHVyVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICBbbWF4VmFsdWVOdW1iZXJdPVwiNTlcIlxuICAgICAgICAgICAgICAgIFttaW5WYWx1ZU51bWJlcl09XCIwXCJcbiAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIjJcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpXCJcbiAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgc2lkZUVudW0ubGVmdCArICdtaW51dGUnKVwiXG4gICAgICAgICAgICAgICAgKG91dElucHV0RXZlbnQpPVwiaGFuZGxlcklucHV0RXZlbnQoJGV2ZW50LCAnbGVmdG1pbnV0ZScpXCJcbiAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VUaW1lVmFsdWUoJGV2ZW50LCAnbGVmdG1pbnV0ZScpXCJcbiAgICAgICAgICAgICAgICAob3V0Rm9jdXNBbmRCbHVyRXZlbnQpPVwiaGFuZGxlckZvY3VzQW5kQmx1clRpbWUoJGV2ZW50LCAnbGVmdG1pbnV0ZScpXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoIWlzU2luZ2xlKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyIHJpZ2h0IG1sLVsyNHB4XVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm91bmRlZC1bNHB4XSBiZy1bI2ZmZmZmZl1cIj5cbiAgICAgICAgICBAaWYgKGNhbGVuZGFyVmFyaWFibGVzKCkpIHtcbiAgICAgICAgICAgIDx0YWJsZT5cbiAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPVwiN1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibW9udGhcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzaG93RHJvcGRvd25zU2VsZWN0KCkgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5sZWZ0KCkuZHJvcGRvd25zPy4oKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIhZmxleCBtYi1bMTBweF0gdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0zLzQgZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nbXItWzhweF0nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24gW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKSArIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJDdXN0b21Db25maWddPVwie3dpZHRoQnlQYXJlbnQ6ZmFsc2UsaWdub3JlQXJyb3c6dHJ1ZSxwYWRkaW5nTGVmdEl0ZW06IHRydWUsY2xhc3NJbmNsdWRlOiAnIXctWzEzMHB4XScscG9zaXRpb246e21vZGU6J2NlbnRlcicsZGlzdGFuY2U6MH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0TWF4SXRlbVNob3ddPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDbGlja0V4YWN0bHldPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RLZXlzRGlzYWJsZV09XCJkaXNhYmxlTW9udGgoKS5yaWdodCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnZlcnRJdGVtU2VsZWN0ZWRdPVwiY29udmVydEl0ZW1Nb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwibGlzdE1vbnRoc0NvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0S2V5U2VsZWN0ZWRdPVwibGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmxhZ01vdXNlXT1cImZsYWdNb3VzZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkXT1cIm1vbnRoSHR0cERldGFpbENvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICdtb250aCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkRHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICdtb250aCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlKT1cImhhbmRsZXJDaGFuZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2hvd0xpc3QpPVwiaGFuZGxlclNob3dMaXN0RHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICdtb250aCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRhcmspXV09XCJjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5yaWdodCArICdtb250aCddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtWyM2YTczODNdXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5yaWdodCArICdtb250aCddXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDRtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ucmlnaHQgKyAnbW9udGgnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFN0eWxlXT1cIidub3JtYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzICYmIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhciAmJiBkYXRlT3B0aW9ucygpLm1vbnRoTmFtZXNbIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8uWzFdPy5bMV0/Lm1vbnRoKCkgPz8gLTFdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHRleHQtWzEzcHhdIHRleHQtWyM2YTczODNdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5yb3RhdGVdPVwiIWNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLnJpZ2h0ICsgJ21vbnRoJ10gPyAnOTBkZWcnOicyNzBkZWcnXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24gW2xpc3RNYXhJdGVtU2hvd109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpICsgMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7d2lkdGhCeVBhcmVudDpmYWxzZSxpZ25vcmVBcnJvdzp0cnVlLHBhZGRpbmdMZWZ0SXRlbTogdHJ1ZSwgY2xhc3NJbmNsdWRlOiAnIXctWzExMHB4XScsICBwb3NpdGlvbjp7bW9kZTonY2VudGVyJywgZGlzdGFuY2U6MH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q2xpY2tFeGFjdGx5XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnZlcnRJdGVtU2VsZWN0ZWRdPVwiY29udmVydEl0ZW1ZZWFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdENvbmZpZ109XCJsaXN0UmlnaHRZZWFyQ29uZmlnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RLZXlTZWxlY3RlZF09XCJsaXN0S2V5VG9TZWxlY3RlZCgpLnllYXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZsYWdNb3VzZV09XCJmbGFnTW91c2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZF09XCJyaWdodFllYXJIdHRwRGV0YWlsQ29uZmlnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWREcm9wZG93bigkZXZlbnQsIHNpZGVFbnVtLnJpZ2h0ICsgJ3llYXInKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgc2lkZUVudW0ucmlnaHQgKyAneWVhcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlKT1cImhhbmRsZXJDaGFuZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2hvd0xpc3QpPVwiaGFuZGxlclNob3dMaXN0RHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICd5ZWFyJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGFyayldXT1cImNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLnJpZ2h0ICsgJ3llYXInXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVsjNmE3MzgzXV09XCIhY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ucmlnaHQgKyAneWVhciddXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDRtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250U3R5bGVdPVwiJ25vcm1hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8uZm9ybWF0KFwiWVlZWVwiKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCB0ZXh0LVsxM3B4XSB0ZXh0LVsjNmE3MzgzXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGFyayldXT1cImNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLnJpZ2h0ICsgJ3llYXInXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucm90YXRlXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5yaWdodCArICd5ZWFyJ10gPyAnOTBkZWcnOicyNzBkZWcnXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzQgZmxleCBpdGVtcy1jZW50ZXIgcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChsaXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciAmJiBsaXN0S2V5VG9TZWxlY3RlZCgpLnllYXIgJiYgISgoKGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyICArMSkgPT09IGxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikgJiYgKGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCA9PT0gMTIpICYmIGxpc3RLZXlUb1NlbGVjdGVkKCkubW9udGggPT09IDEpJiYgKGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyIDwgbGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSB8fCBsaXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGggJiYgbGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aCAmJiAoKGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCArIDEpIDwgK2xpc3RLZXlUb1NlbGVjdGVkKCkubW9udGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGFic29sdXRlIGxlZnQtMCB0b3AtWy0zcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyQ2xpY2tQcmV2KHNpZGVFbnVtLnJpZ2h0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCByb3RhdGUtWzE4MGRlZ10gdGV4dC1bIzZhNzM4M10gY3Vyc29yLXBvaW50ZXIgbGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1pY29uXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICYmIGxpc3RLZXlUb1NlbGVjdGVkKCkubW9udGggJiYgKGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCA+IGxpc3RLZXlUb1NlbGVjdGVkKCkubW9udGgpICYmIGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyICYmIGxpc3RLZXlUb1NlbGVjdGVkKCkueWVhciAmJiAobGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgPT09IGxpc3RLZXlUb1NlbGVjdGVkKCkueWVhciApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJnLVsjZmZmZmZmXSB3LVsyMXB4XSBoLVsyMXB4XSBjdXJzb3Itbm9uZSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLVs1MHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5tYXhEYXRlIHx8IChjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkubWF4RGF0ZT8uaXNBZnRlcihjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5sYXN0RGF5KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJoYW5kbGVyQ2xpY2tOZXh0KHNpZGVFbnVtLnJpZ2h0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG1sLVsxMnB4XSBhYnNvbHV0ZSByaWdodC0wIHRvcC1bLTNweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCB0ZXh0LVsjNmE3MzgzXSBjdXJzb3ItcG9pbnRlciBsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyLWljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmICghc2hvd0Ryb3Bkb3duc1NlbGVjdCgpIHx8ICAhY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmRyb3Bkb3ducykge1xuICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGVPcHRpb25zKCkubW9udGhOYW1lcyAmJiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiYgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzW2NhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8uWzFdPy5bMV0/Lm1vbnRoKCkgPz8gLTFdIH19XG4gICAgICAgICAgICAgICAgICAgICAge3sgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyICYmIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8uWzFdPy5bMV0/LmZvcm1hdChcIllZWVlcIikgfX1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIndlZWstZGF5c1wiPlxuICAgICAgICAgICAgICAgICAgQGZvciAoZGF5b2Z3ZWVrIG9mIGRhdGVPcHRpb25zKCkuZGF5c09mV2VlazsgdHJhY2sgZGF5b2Z3ZWVrKSB7XG4gICAgICAgICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktZm9udC1oNm0gdGV4dC1bIzZhNzM4M11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250U3R5bGVdPVwiJ25vcm1hbCdcIj57eyBkYXlvZndlZWsgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsUm93cz8uKCk7IHRyYWNrIHJvdykge1xuICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiaC1bMzJweF1cIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNsYXNzZXMgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNsYXNzZXM/Lltyb3ddPy5jbGFzc0xpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxDb2xzPy4oKTsgdHJhY2sgY29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwibGlicy11aS1mb250LWg1clwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNsYXNzZXMgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNsYXNzZXM/Lltyb3ddPy5bY29sXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudG9kYXldPVwiY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyICYmIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8uW3Jvd10/Lltjb2xdPy5kYXRlKCkgPT09IHRvZGF5KCkuZGF0ZSgpICYmIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8uW3Jvd10/Lltjb2xdPy5tb250aCgpID09PSB0b2RheSgpLm1vbnRoKCkgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyICYmY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/LnllYXIoKSA9PT0gdG9kYXkoKS55ZWFyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJQaWNrZXJEYXRlKCRldmVudCwgc2lkZUVudW0ucmlnaHQsIHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJoYW5kbGVySG92ZXJEYXRlKCRldmVudCwgc2lkZUVudW0ucmlnaHQsIHJvdywgY29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/LmRhdGUoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChoYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHB0LVsxMnB4XVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHJvdW5kZWQtWzRweF0gYm9yZGVyXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyLVsjZTZlOGVkXV09XCIhdGltZVBpY2tlckVycm9yKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItWyNmZjU0NTRdXT1cInRpbWVQaWNrZXJFcnJvcigpXCI+XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtaW5wdXQgY2xhc3NJbmNsdWRlPVwiIXctWzMwcHhdICFwLTAgIWJvcmRlci1ub25lICF0ZXh0LWNlbnRlciAhbGlicy11aS1mb250LWg0cyAhdGV4dC1bIzA3MTYzMV1cIlxuICAgICAgICAgICAgICAgICAgZGF0YVR5cGU9XCJpbnRcIlxuICAgICAgICAgICAgICAgICAgW2F1dG9BZGRaZXJvTGVzc1RoYW4xMEluVHlwZUludF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFtlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIjIzXCJcbiAgICAgICAgICAgICAgICAgIFttaW5WYWx1ZU51bWJlcl09XCIwXCJcbiAgICAgICAgICAgICAgICAgIFtmb2N1c1RpbWVPdXRdPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbYmx1clRpbWVPdXRdPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIjJcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKVwiXG4gICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VUaW1lVmFsdWUoJGV2ZW50LCAncmlnaHRob3VyJylcIlxuICAgICAgICAgICAgICAgICAgKG91dElucHV0RXZlbnQpPVwiaGFuZGxlcklucHV0RXZlbnQoJGV2ZW50LCdyaWdodGhvdXInKVwiXG4gICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgJ3JpZ2h0aG91cicpXCJcbiAgICAgICAgICAgICAgICAgIChvdXRGb2N1c0FuZEJsdXJFdmVudCk9XCJoYW5kbGVyRm9jdXNBbmRCbHVyVGltZSgkZXZlbnQsICdyaWdodGhvdXInKVwiIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDNzIHRleHQtWyMzMzMzMzNdXCI+Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy1pbnB1dCBjbGFzc0luY2x1ZGU9XCIhdy1bMzBweF0gIXAtMCAhYm9yZGVyLW5vbmUgIXRleHQtY2VudGVyIGxpYnMtdWktZm9udC1oNHMgIXRleHQtWyMwNzE2MzFdXCJcbiAgICAgICAgICAgICAgICAgIGRhdGFUeXBlPVwiaW50XCJcbiAgICAgICAgICAgICAgICAgIFthdXRvQWRkWmVyb0xlc3NUaGFuMTBJblR5cGVJbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFttYXhWYWx1ZU51bWJlcl09XCI1OVwiXG4gICAgICAgICAgICAgICAgICBbbWluVmFsdWVOdW1iZXJdPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbZm9jdXNUaW1lT3V0XT1cIjBcIlxuICAgICAgICAgICAgICAgICAgW2JsdXJUaW1lT3V0XT1cIjBcIlxuICAgICAgICAgICAgICAgICAgW21heExlbmd0aF09XCIyXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKVwiXG4gICAgICAgICAgICAgICAgICAob3V0SW5wdXRFdmVudCk9XCJoYW5kbGVySW5wdXRFdmVudCgkZXZlbnQsJ3JpZ2h0bWludXRlJylcIlxuICAgICAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbCgkZXZlbnQsICdyaWdodG1pbnV0ZScpXCJcbiAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ2UpPVwiaGFuZGxlckNoYW5nZVRpbWVWYWx1ZSgkZXZlbnQsICdyaWdodG1pbnV0ZScpXCJcbiAgICAgICAgICAgICAgICAgIChvdXRGb2N1c0FuZEJsdXJFdmVudCk9XCJoYW5kbGVyRm9jdXNBbmRCbHVyVGltZSgkZXZlbnQsICdyaWdodG1pbnV0ZScpXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gIDwvZGl2PlxuICA8ZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbFwiPlxuICAgICAgQGlmICghaXNTaW5nbGUoKSAmJiBoYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LVs4cHhdIGxpYnMtdWktZm9udC1oN3IgdGV4dC1bI2ZmNTQ1NF0gaC1bMTRweF1cIj5cbiAgICAgICAgICBAaWYgKHRpbWVQaWNrZXJFcnJvcigpKSB7XG4gICAgICAgICAgICA8c3Bhbj57eyAnaTE4bl9kYXRlX2NvbXBhcmVfc3RhcnRfZW5kX21lc3NhZ2VfZXJyb3InIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgQGlmICghcXVpY2tSYW5nZXNBcnJheSgpLmxlbmd0aCB8fCAhaXNTaW5nbGUoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cIiBmbGV4IHctZnVsbCBwdC1bMTZweF0ganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIEBpZiAoIWlzU2luZ2xlKCkpIHtcbiAgICAgICAgICAgIEBpZiAoIWVuZERhdGUoKSkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1bI2NkZDBkNl0gbGlicy11aS1mb250LWg2clwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ0REL01NL1lZWVknKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICBAaWYgKGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+IHt7IGNvbXB1dGVkRGlzcGxheVRpbWVMZWZ0KCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICZoeXBoZW47XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgc3RhcnREYXRlKCk/LmZvcm1hdCgnREQvTU0vWVlZWScpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIEBpZiAoaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgICAgICAgICA8c3Bhbj4ge3sgY29tcHV0ZWREaXNwbGF5VGltZVJpZ2h0KCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoZW5kRGF0ZSgpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LVsjY2RkMGQ2XSBsaWJzLXVpLWZvbnQtaDZyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgc3RhcnREYXRlKCk/LmZvcm1hdCgnREQvTU0vWVlZWScpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIEBpZiAoaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgICAgICAgICA8c3Bhbj4ge3sgY29tcHV0ZWREaXNwbGF5VGltZUxlZnQoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJmh5cGhlbjtcbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBlbmREYXRlKCk/LmZvcm1hdCgnREQvTU0vWVlZWScpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIEBpZiAoaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgICAgICAgICA8c3Bhbj4ge3sgY29tcHV0ZWREaXNwbGF5VGltZVJpZ2h0KCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBjbGFzcz1cIm1yLVsxMnB4XVwiXG4gICAgICAgICAgICBsYWJlbD1cImkxOG5fY2FuY2VsXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b24tdGhpcmRcIlxuICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGlja0NhbmNlbCgkZXZlbnQpXCIgLz5cbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIGxhYmVsPVwiaTE4bl9zZWxlY3RcIlxuICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGlja0FwcGx5KCRldmVudClcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==