@libs-ui/components-datetime-picker 0.2.306 → 0.2.307-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,17 +1,17 @@
1
1
  /* eslint-disable @typescript-eslint/no-unused-expressions */
2
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 { getDayjs, isEmpty, set } from "@libs-ui/utils";
8
- import { TranslateModule, TranslateService } from "@ngx-translate/core";
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 { getDayjs, isEmpty, set } from '@libs-ui/utils';
8
+ import { TranslateModule, TranslateService } from '@ngx-translate/core';
9
9
  import dayjs from 'dayjs';
10
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 } from "../../defines/common-date.define";
13
- import { defaultLocaleConfig, getDateOptions } from "../../defines/date-options.define";
14
- import { SideEnum } from "../../interfaces/calendar-variables.interface";
11
+ import { getMonthsDetailById, getMonthsListConfig, getYearsDetailById, getYearsListConfig } from '../../defines/calendar.define';
12
+ import { DEFAULT_MAX_YEAR, DEFAULT_MIN_YEAR } from '../../defines/common-date.define';
13
+ import { defaultLocaleConfig, getDateOptions } from '../../defines/date-options.define';
14
+ import { SideEnum } from '../../interfaces/calendar-variables.interface';
15
15
  import * as i0 from "@angular/core";
16
16
  import * as i1 from "@ngx-translate/core";
17
17
  dayjs.extend(isoWeek);
@@ -97,12 +97,12 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
97
97
  ngOnInit() {
98
98
  const startDate = getDayjs({ date: this.startDate()?.clone() });
99
99
  const endDate = getDayjs({ date: this.endDate()?.clone() });
100
- this.splitPickerDate.update(current => {
101
- current.start.update(sideCurrent => {
100
+ this.splitPickerDate.update((current) => {
101
+ current.start.update((sideCurrent) => {
102
102
  sideCurrent.day = (startDate ?? getDayjs().startOf('day')).date();
103
103
  return sideCurrent;
104
104
  });
105
- current.end.update(sideCurrent => {
105
+ current.end.update((sideCurrent) => {
106
106
  sideCurrent.day = (endDate ?? getDayjs().endOf('day')).date();
107
107
  return sideCurrent;
108
108
  });
@@ -140,7 +140,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
140
140
  lefthour: signal(this.timepickerVariables().left().selectedHour),
141
141
  righthour: signal(this.timepickerVariables().right().selectedHour),
142
142
  leftminute: signal(this.timepickerVariables().left().selectedMinute),
143
- rightminute: signal(this.timepickerVariables().right().selectedMinute)
143
+ rightminute: signal(this.timepickerVariables().right().selectedMinute),
144
144
  });
145
145
  // this.outFunctionsControl.emit({ buildDefaultRange: this.buildDefaultRange.bind(this), applyToSelect: this.applyToSelect.bind(this) })
146
146
  }
@@ -155,7 +155,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
155
155
  for (let i = start; i >= end; i--) {
156
156
  listLeftYear.push({
157
157
  id: i,
158
- label: `${i}`
158
+ label: `${i}`,
159
159
  });
160
160
  }
161
161
  this.listLeftYearConfig.set(getYearsListConfig(listLeftYear));
@@ -167,7 +167,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
167
167
  for (let i = start; i >= end; i--) {
168
168
  listRightYear.push({
169
169
  id: i,
170
- label: `${i}`
170
+ label: `${i}`,
171
171
  });
172
172
  }
173
173
  this.listRightYearConfig.set(getYearsListConfig(listRightYear));
@@ -178,7 +178,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
178
178
  }
179
179
  updateStartEndDate(date) {
180
180
  date = getDayjs({ date });
181
- if ((this.endDate() || date.isBefore(getDayjs({ date: this.startDate() }), 'day'))) {
181
+ if (this.endDate() || date.isBefore(getDayjs({ date: this.startDate() }), 'day')) {
182
182
  if (this.hasTimePicker()) {
183
183
  date = this.getDateWithTime(date, SideEnum.left);
184
184
  }
@@ -205,7 +205,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
205
205
  }
206
206
  formatMonthYear() {
207
207
  const month = (this.calendarVariables().left().dropdowns?.()?.currentMonth ?? 0) + 1;
208
- this.listKeyFromSelected.update(current => {
208
+ this.listKeyFromSelected.update((current) => {
209
209
  current.month = month;
210
210
  current.year = this.calendarVariables().left().dropdowns?.()?.currentYear;
211
211
  return current;
@@ -215,7 +215,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
215
215
  return;
216
216
  }
217
217
  const rightMonth = (this.calendarVariables().right().dropdowns?.()?.currentMonth ?? 0) + 1;
218
- this.listKeyToSelected.update(current => {
218
+ this.listKeyToSelected.update((current) => {
219
219
  current.month = rightMonth;
220
220
  current.year = this.calendarVariables().right().dropdowns?.()?.currentYear;
221
221
  return current;
@@ -292,7 +292,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
292
292
  this.endDate.set(this.startDate()?.clone());
293
293
  }
294
294
  if (this.maxDate() && this.endDate()?.isAfter(this.maxDate())) {
295
- this.endDate.set(getDayjs({ date: (this.maxDate()) })?.clone());
295
+ this.endDate.set(getDayjs({ date: this.maxDate() })?.clone());
296
296
  }
297
297
  // this.outEndDateChanged.emit({ endDate: this.endDate() });
298
298
  this.updateMonthsInView();
@@ -314,8 +314,8 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
314
314
  if (type === 'left') {
315
315
  this.disableMonth().left.set([]);
316
316
  if (minDate?.year() === this.listKeyFromSelected().year) {
317
- for (let i = 1; i < (minDate?.month() + 1); i++) {
318
- this.disableMonth().left.update(current => {
317
+ for (let i = 1; i < minDate?.month() + 1; i++) {
318
+ this.disableMonth().left.update((current) => {
319
319
  current.push(i);
320
320
  return current;
321
321
  });
@@ -323,7 +323,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
323
323
  }
324
324
  if (maxDate?.year() === this.listKeyFromSelected().year) {
325
325
  for (let i = maxDate?.month() + 2; i < 13; i++) {
326
- this.disableMonth().left.update(current => {
326
+ this.disableMonth().left.update((current) => {
327
327
  current.push(i);
328
328
  return current;
329
329
  });
@@ -333,8 +333,8 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
333
333
  }
334
334
  this.disableMonth().right.set([]);
335
335
  if (minDate?.year() === this.listKeyToSelected().year) {
336
- for (let i = 1; i < (minDate?.month() + 1); i++) {
337
- this.disableMonth().right.update(current => {
336
+ for (let i = 1; i < minDate?.month() + 1; i++) {
337
+ this.disableMonth().right.update((current) => {
338
338
  current.push(i);
339
339
  return current;
340
340
  });
@@ -342,15 +342,15 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
342
342
  }
343
343
  if (maxDate?.year() === this.listKeyToSelected().year) {
344
344
  for (let i = maxDate?.month() + 2; i < 13; i++) {
345
- this.disableMonth().right.update(current => {
345
+ this.disableMonth().right.update((current) => {
346
346
  current.push(i);
347
347
  return current;
348
348
  });
349
349
  }
350
350
  }
351
- if ((Number(this.listKeyFromSelected().year) === Number(this.listKeyToSelected().year))) {
351
+ if (Number(this.listKeyFromSelected().year) === Number(this.listKeyToSelected().year)) {
352
352
  for (let i = 1; i <= Number(this.listKeyFromSelected().month); i++) {
353
- this.disableMonth().right.update(current => {
353
+ this.disableMonth().right.update((current) => {
354
354
  current.push(i);
355
355
  return current;
356
356
  });
@@ -359,22 +359,22 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
359
359
  }
360
360
  handlerClickPrev(side) {
361
361
  if (side === SideEnum.left && this.leftCalendar().month) {
362
- this.leftCalendar.update(current => {
362
+ this.leftCalendar.update((current) => {
363
363
  current.month = current.month?.subtract(1, 'month');
364
364
  return current;
365
365
  });
366
- this.listKeyFromSelected.update(current => {
366
+ this.listKeyFromSelected.update((current) => {
367
367
  current.month = (this.leftCalendar().month?.month() ?? 0) + 1;
368
368
  current.year = this.leftCalendar().month?.year();
369
369
  return current;
370
370
  });
371
371
  return this.updateCalendars();
372
372
  }
373
- this.rightCalendar.update(current => {
373
+ this.rightCalendar.update((current) => {
374
374
  current.month = current.month?.subtract(1, 'month');
375
375
  return current;
376
376
  });
377
- this.listKeyToSelected.update(current => {
377
+ this.listKeyToSelected.update((current) => {
378
378
  current.month = (this.rightCalendar().month?.month() ?? 0) + 1;
379
379
  current.year = this.rightCalendar().month?.year();
380
380
  return current;
@@ -384,21 +384,21 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
384
384
  }
385
385
  handlerClickNext(side) {
386
386
  if (side === SideEnum.left) {
387
- this.leftCalendar.update(current => {
387
+ this.leftCalendar.update((current) => {
388
388
  current.month = current.month?.add(1, 'month');
389
389
  return current;
390
390
  });
391
- this.listKeyFromSelected.update(current => {
391
+ this.listKeyFromSelected.update((current) => {
392
392
  current.month = (this.leftCalendar().month?.month() ?? 0) + 1;
393
393
  current.year = this.leftCalendar().month?.year();
394
394
  return current;
395
395
  });
396
- if ((this.listKeyFromSelected().month === this.listKeyToSelected().month) && (this.listKeyFromSelected().year === this.listKeyToSelected().year)) {
397
- this.rightCalendar.update(current => {
396
+ if (this.listKeyFromSelected().month === this.listKeyToSelected().month && this.listKeyFromSelected().year === this.listKeyToSelected().year) {
397
+ this.rightCalendar.update((current) => {
398
398
  current.month = current.month?.add(1, 'month');
399
399
  return current;
400
400
  });
401
- this.listKeyToSelected.update(current => {
401
+ this.listKeyToSelected.update((current) => {
402
402
  current.month = (this.rightCalendar().month?.month() ?? 0) + 1;
403
403
  current.year = this.rightCalendar().month?.year();
404
404
  return current;
@@ -407,11 +407,11 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
407
407
  this.getDisable('right');
408
408
  return this.updateCalendars();
409
409
  }
410
- this.rightCalendar.update(current => {
410
+ this.rightCalendar.update((current) => {
411
411
  current.month = current.month?.add(1, 'month');
412
412
  return current;
413
413
  });
414
- this.listKeyToSelected.update(current => {
414
+ this.listKeyToSelected.update((current) => {
415
415
  current.month = (this.rightCalendar().month?.month() ?? 0) + 1;
416
416
  current.year = this.rightCalendar().month?.year();
417
417
  return current;
@@ -440,8 +440,8 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
440
440
  if (!date) {
441
441
  return;
442
442
  }
443
- this.splitPickerDate.update(current => {
444
- current[side === SideEnum.left ? 'start' : 'end'].update(sideCurrent => {
443
+ this.splitPickerDate.update((current) => {
444
+ current[side === SideEnum.left ? 'start' : 'end'].update((sideCurrent) => {
445
445
  sideCurrent.day = date.date();
446
446
  return sideCurrent;
447
447
  });
@@ -488,7 +488,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
488
488
  this.outChangStageFlagMouse.emit({
489
489
  isMouseEnter: false,
490
490
  isMouseEnterContent: false,
491
- isContainerHasScroll: false
491
+ isContainerHasScroll: false,
492
492
  });
493
493
  if (!event) {
494
494
  return;
@@ -505,9 +505,9 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
505
505
  default:
506
506
  break;
507
507
  }
508
- this.splitPickerDate.update(current => {
508
+ this.splitPickerDate.update((current) => {
509
509
  if (type === `${SideEnum.left}month` || type === `${SideEnum.left}year`) {
510
- current.start.update(start => {
510
+ current.start.update((start) => {
511
511
  if (type === `${SideEnum.left}month`) {
512
512
  start.month = event.key;
513
513
  }
@@ -518,7 +518,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
518
518
  });
519
519
  return current;
520
520
  }
521
- current.end.update(end => {
521
+ current.end.update((end) => {
522
522
  if (type === `${SideEnum.right}month`) {
523
523
  end.month = event.key;
524
524
  }
@@ -536,26 +536,26 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
536
536
  const month = Number(event.key) - 1;
537
537
  if (side === SideEnum.left) {
538
538
  if (this.isSelectedData().leftmonth) {
539
- this.isSelectedData.update(current => {
539
+ this.isSelectedData.update((current) => {
540
540
  current.leftmonth = false;
541
541
  return current;
542
542
  });
543
543
  this.getDisable('right');
544
544
  return;
545
545
  }
546
- this.listKeyFromSelected.update(current => {
546
+ this.listKeyFromSelected.update((current) => {
547
547
  current.month = event.key;
548
548
  return current;
549
549
  });
550
- if (Number(event.key) >= Number(this.listKeyFromSelected().month) && (Number(this.listKeyFromSelected().year) === Number(this.listKeyToSelected().year))) {
550
+ if (Number(event.key) >= Number(this.listKeyFromSelected().month) && Number(this.listKeyFromSelected().year) === Number(this.listKeyToSelected().year)) {
551
551
  if (Number(event.key) <= 11) {
552
- this.listKeyToSelected.update(current => {
552
+ this.listKeyToSelected.update((current) => {
553
553
  current.month = Number(event.key) + 1;
554
554
  return current;
555
555
  });
556
556
  }
557
557
  if (Number(event.key) === 12) {
558
- this.listKeyToSelected.update(current => {
558
+ this.listKeyToSelected.update((current) => {
559
559
  current.month = 1;
560
560
  current.year += 1;
561
561
  return current;
@@ -565,14 +565,14 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
565
565
  }
566
566
  if (side === SideEnum.right) {
567
567
  if (this.isSelectedData().rightmonth) {
568
- this.isSelectedData.update(current => {
568
+ this.isSelectedData.update((current) => {
569
569
  current.rightmonth = false;
570
570
  return current;
571
571
  });
572
572
  this.getDisable('right');
573
573
  return;
574
574
  }
575
- this.listKeyToSelected.update(current => {
575
+ this.listKeyToSelected.update((current) => {
576
576
  current.month = event.key;
577
577
  return current;
578
578
  });
@@ -585,7 +585,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
585
585
  const side = type.includes(SideEnum.left) ? SideEnum.left : SideEnum.right;
586
586
  if (side === SideEnum.left) {
587
587
  if (this.isSelectedData()?.leftyear) {
588
- this.isSelectedData.update(current => {
588
+ this.isSelectedData.update((current) => {
589
589
  current.leftyear = false;
590
590
  return current;
591
591
  });
@@ -594,23 +594,23 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
594
594
  this.functionControls.get(type)?.removeList();
595
595
  return;
596
596
  }
597
- this.listKeyFromSelected.update(current => {
597
+ this.listKeyFromSelected.update((current) => {
598
598
  current.year = event.key;
599
599
  return current;
600
600
  });
601
- if (this.listKeyFromSelected().year && this.listKeyToSelected().year && (this.listKeyFromSelected().year >= this.listKeyToSelected().year)) {
602
- this.listKeyToSelected.update(current => {
601
+ if (this.listKeyFromSelected().year && this.listKeyToSelected().year && this.listKeyFromSelected().year >= this.listKeyToSelected().year) {
602
+ this.listKeyToSelected.update((current) => {
603
603
  current.year = event.key;
604
604
  return current;
605
605
  });
606
606
  if (this.listKeyFromSelected().month && Number(this.listKeyFromSelected().month) <= 11) {
607
- this.listKeyToSelected.update(current => {
607
+ this.listKeyToSelected.update((current) => {
608
608
  current.month = Number(this.listKeyFromSelected().month) + 1;
609
609
  return current;
610
610
  });
611
611
  }
612
612
  if (this.listKeyFromSelected().month && this.listKeyFromSelected().month === 12) {
613
- this.listKeyToSelected.update(current => {
613
+ this.listKeyToSelected.update((current) => {
614
614
  current.month = Number(this.listKeyFromSelected().month);
615
615
  return current;
616
616
  });
@@ -622,26 +622,26 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
622
622
  }
623
623
  if (side === SideEnum.right) {
624
624
  if (this.isSelectedData().rightyear) {
625
- this.isSelectedData.update(current => {
625
+ this.isSelectedData.update((current) => {
626
626
  current.rightyear = false;
627
627
  return current;
628
628
  });
629
629
  this.getDisable('right');
630
630
  return;
631
631
  }
632
- this.listKeyToSelected.update(current => {
632
+ this.listKeyToSelected.update((current) => {
633
633
  current.year = event.key;
634
634
  return current;
635
635
  });
636
- if (this.listKeyFromSelected().year && this.listKeyToSelected().year && (this.listKeyFromSelected().year >= this.listKeyToSelected().year)) {
636
+ if (this.listKeyFromSelected().year && this.listKeyToSelected().year && this.listKeyFromSelected().year >= this.listKeyToSelected().year) {
637
637
  if (this.listKeyFromSelected().month && Number(this.listKeyFromSelected().month) <= 11) {
638
- this.listKeyToSelected.update(current => {
638
+ this.listKeyToSelected.update((current) => {
639
639
  current.month = Number(this.listKeyFromSelected().month) + 1;
640
640
  return current;
641
641
  });
642
642
  }
643
643
  if (this.listKeyFromSelected().month && this.listKeyFromSelected().month === 12) {
644
- this.listKeyToSelected.update(current => {
644
+ this.listKeyToSelected.update((current) => {
645
645
  current.month = Number(this.listKeyFromSelected().month);
646
646
  return current;
647
647
  });
@@ -673,27 +673,27 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
673
673
  }
674
674
  const dropdowns = this.calendarVariables()[side]().dropdowns;
675
675
  if (dropdowns?.()) {
676
- dropdowns.update(current => {
676
+ dropdowns.update((current) => {
677
677
  current.currentYear = year;
678
678
  current.currentMonth = month;
679
679
  return current;
680
680
  });
681
681
  }
682
682
  if (isLeft && this.leftCalendar().month) {
683
- this.leftCalendar.update(current => {
683
+ this.leftCalendar.update((current) => {
684
684
  current.month = current.month?.month(month).year(year);
685
685
  return current;
686
686
  });
687
687
  return this.updateCalendars();
688
688
  }
689
689
  if (month === 12) {
690
- this.rightCalendar.update(current => {
690
+ this.rightCalendar.update((current) => {
691
691
  current.month = current.month?.clone().add(1, 'month');
692
692
  return current;
693
693
  });
694
694
  return this.updateCalendars();
695
695
  }
696
- this.rightCalendar.update(current => {
696
+ this.rightCalendar.update((current) => {
697
697
  current.month = current.month?.month(month).year(year);
698
698
  return current;
699
699
  });
@@ -701,10 +701,11 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
701
701
  }
702
702
  handlerInputEvent(event, type) {
703
703
  if (event.keyCode !== 8) {
704
- event.keyCode && this.checkBackspaceFocus.update(current => {
705
- current[type].set(1);
706
- return current;
707
- });
704
+ event.keyCode &&
705
+ this.checkBackspaceFocus.update((current) => {
706
+ current[type].set(1);
707
+ return current;
708
+ });
708
709
  this.keyCodeBackspace.set(false);
709
710
  return;
710
711
  }
@@ -713,13 +714,13 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
713
714
  case 'leftminute':
714
715
  if (isEmpty(this.timepickerValueItem().leftminute())) {
715
716
  if (this.checkBackspaceFocus()[type]() === 1) {
716
- this.checkBackspaceFocus.update(current => {
717
+ this.checkBackspaceFocus.update((current) => {
717
718
  current[type].set(current[type]() + 1);
718
719
  return current;
719
720
  });
720
721
  return;
721
722
  }
722
- this.checkBackspaceFocus.update(current => {
723
+ this.checkBackspaceFocus.update((current) => {
723
724
  current[type].set(1);
724
725
  return current;
725
726
  });
@@ -729,13 +730,13 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
729
730
  case 'rightminute':
730
731
  if (isEmpty(this.timepickerValueItem().rightminute())) {
731
732
  if (this.checkBackspaceFocus()[type]() === 1) {
732
- this.checkBackspaceFocus.update(current => {
733
+ this.checkBackspaceFocus.update((current) => {
733
734
  current[type].set(current[type]() + 1);
734
735
  return current;
735
736
  });
736
737
  return;
737
738
  }
738
- this.checkBackspaceFocus.update(current => {
739
+ this.checkBackspaceFocus.update((current) => {
739
740
  current[type].set(1);
740
741
  return current;
741
742
  });
@@ -752,12 +753,12 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
752
753
  const target = eventInput.target;
753
754
  switch (type) {
754
755
  case 'lefthour':
755
- this.timepickerVariables().left.update(current => {
756
+ this.timepickerVariables().left.update((current) => {
756
757
  current.selectedHour = !isEmpty(this.timepickerValueItem().lefthour()) ? this.timepickerValueItem().lefthour() : 0;
757
758
  return current;
758
759
  });
759
- if ((Number(this.timepickerValueItem().lefthour()) === 0) || isEmpty(this.timepickerValueItem().lefthour())) {
760
- this.timepickerValueItem.update(current => {
760
+ if (Number(this.timepickerValueItem().lefthour()) === 0 || isEmpty(this.timepickerValueItem().lefthour())) {
761
+ this.timepickerValueItem.update((current) => {
761
762
  current.lefthour.set(0);
762
763
  return current;
763
764
  });
@@ -769,12 +770,12 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
769
770
  }
770
771
  break;
771
772
  case 'righthour':
772
- this.timepickerVariables().right.update(current => {
773
+ this.timepickerVariables().right.update((current) => {
773
774
  current.selectedHour = !isEmpty(this.timepickerValueItem().righthour()) ? this.timepickerValueItem().righthour() : 0;
774
775
  return current;
775
776
  });
776
- if ((Number(this.timepickerValueItem().righthour()) === 0) || isEmpty(this.timepickerValueItem().righthour())) {
777
- this.timepickerValueItem.update(current => {
777
+ if (Number(this.timepickerValueItem().righthour()) === 0 || isEmpty(this.timepickerValueItem().righthour())) {
778
+ this.timepickerValueItem.update((current) => {
778
779
  current.righthour.set(0);
779
780
  return current;
780
781
  });
@@ -786,12 +787,12 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
786
787
  }
787
788
  break;
788
789
  case 'leftminute':
789
- this.timepickerVariables().left.update(current => {
790
+ this.timepickerVariables().left.update((current) => {
790
791
  current.selectedMinute = !isEmpty(this.timepickerValueItem().leftminute()) ? this.timepickerValueItem().leftminute() : 0;
791
792
  return current;
792
793
  });
793
- if ((Number(this.timepickerValueItem().leftminute()) === 0) || isEmpty(this.timepickerValueItem().leftminute())) {
794
- this.timepickerValueItem.update(current => {
794
+ if (Number(this.timepickerValueItem().leftminute()) === 0 || isEmpty(this.timepickerValueItem().leftminute())) {
795
+ this.timepickerValueItem.update((current) => {
795
796
  current.leftminute.set(0);
796
797
  return current;
797
798
  });
@@ -803,12 +804,12 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
803
804
  }
804
805
  break;
805
806
  case 'rightminute':
806
- this.timepickerVariables().right.update(current => {
807
+ this.timepickerVariables().right.update((current) => {
807
808
  current.selectedMinute = !isEmpty(this.timepickerValueItem().rightminute()) ? this.timepickerValueItem().rightminute() : 0;
808
809
  return current;
809
810
  });
810
- if ((Number(this.timepickerValueItem().rightminute()) === 0) || isEmpty(this.timepickerValueItem().rightminute())) {
811
- this.timepickerValueItem.update(current => {
811
+ if (Number(this.timepickerValueItem().rightminute()) === 0 || isEmpty(this.timepickerValueItem().rightminute())) {
812
+ this.timepickerValueItem.update((current) => {
812
813
  current.rightminute.set(0);
813
814
  return current;
814
815
  });
@@ -822,14 +823,14 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
822
823
  }
823
824
  }
824
825
  handlerChangeTimeValue(event, type) {
825
- this.timepickerValueItem.update(current => {
826
+ this.timepickerValueItem.update((current) => {
826
827
  current[type].set(event);
827
828
  return current;
828
829
  });
829
830
  const side = type.includes(SideEnum.left) ? SideEnum.left : SideEnum.right;
830
831
  const attr = type.includes('hour') ? 'hour' : 'minute';
831
- this.splitPickerDate.update(current => {
832
- current[side === SideEnum.left ? 'start' : 'end'].update(sideCurrent => {
832
+ this.splitPickerDate.update((current) => {
833
+ current[side === SideEnum.left ? 'start' : 'end'].update((sideCurrent) => {
833
834
  sideCurrent[attr] = event;
834
835
  return sideCurrent;
835
836
  });
@@ -839,7 +840,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
839
840
  this.isZero.set(false);
840
841
  return;
841
842
  }
842
- if ((`${event}`.length === 2) || (Number(event) > 2) || (Number(event) <= 2 && Number(event) > 0 && this.isZero()) || (this.isZero() && !this.keyCodeBackspace())) {
843
+ if (`${event}`.length === 2 || Number(event) > 2 || (Number(event) <= 2 && Number(event) > 0 && this.isZero()) || (this.isZero() && !this.keyCodeBackspace())) {
843
844
  this.isZero.set(false);
844
845
  this.functionControls.get(type === 'lefthour' ? `${SideEnum.left}minute` : `${SideEnum.right}minute`)?.focus();
845
846
  return;
@@ -871,35 +872,41 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
871
872
  };
872
873
  updateMonthsInView() {
873
874
  if (this.endDate()) {
874
- if (!this.isSingle() && this.leftCalendar().month && this.rightCalendar().month &&
875
- ((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')))
876
- && (this.endDate()?.format('YYYY-MM') === this.leftCalendar().month?.format('YYYY-MM') || this.endDate()?.format('YYYY-MM') === this.rightCalendar().month?.format('YYYY-MM'))) {
875
+ if (!this.isSingle() &&
876
+ this.leftCalendar().month &&
877
+ this.rightCalendar().month &&
878
+ ((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'))) &&
879
+ (this.endDate()?.format('YYYY-MM') === this.leftCalendar().month?.format('YYYY-MM') || this.endDate()?.format('YYYY-MM') === this.rightCalendar().month?.format('YYYY-MM'))) {
877
880
  return;
878
881
  }
879
882
  if (this.startDate()) {
880
- this.leftCalendar.update(current => {
883
+ this.leftCalendar.update((current) => {
881
884
  current.month = this.startDate()?.clone()?.date(2);
882
885
  return current;
883
886
  });
884
887
  if (this.endDate()?.month() !== this.startDate()?.month() || this.endDate()?.year() !== this.startDate()?.year()) {
885
- this.rightCalendar.update(current => {
888
+ this.rightCalendar.update((current) => {
886
889
  current.month = this.endDate()?.clone()?.date(2);
887
890
  return current;
888
891
  });
889
892
  return;
890
893
  }
891
- this.rightCalendar.update(current => {
894
+ this.rightCalendar.update((current) => {
892
895
  current.month = this.startDate()?.clone()?.date(2)?.add(1, 'month');
893
896
  return current;
894
897
  });
895
898
  }
896
899
  }
897
- 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')) {
898
- this.leftCalendar.update(current => {
900
+ if (this.startDate() &&
901
+ this.leftCalendar().month &&
902
+ this.rightCalendar().month &&
903
+ this.leftCalendar().month?.format('YYYY-MM') !== this.startDate()?.format('YYYY-MM') &&
904
+ this.rightCalendar().month?.format('YYYY-MM') !== this.startDate()?.format('YYYY-MM')) {
905
+ this.leftCalendar.update((current) => {
899
906
  current.month = this.startDate()?.clone()?.date(2);
900
907
  return current;
901
908
  });
902
- this.rightCalendar.update(current => {
909
+ this.rightCalendar.update((current) => {
903
910
  current.month = this.startDate()?.clone()?.date(2)?.add(1, 'month');
904
911
  return current;
905
912
  });
@@ -922,7 +929,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
922
929
  if (!this.endDate() && start && this.hasTimePicker()) {
923
930
  const startClone = this.getDateWithTime(start, SideEnum.right);
924
931
  if (startClone.isBefore(start)) {
925
- this.timepickerVariables()[SideEnum.right].update(current => {
932
+ this.timepickerVariables()[SideEnum.right].update((current) => {
926
933
  current.selectedHour = hour;
927
934
  current.selectedMinute = minute;
928
935
  return current;
@@ -950,8 +957,9 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
950
957
  this.calculateSelectedLabel();
951
958
  }
952
959
  renderCalendar(side) {
953
- const mainCalendar = (side === SideEnum.left) ? this.leftCalendar() : this.rightCalendar();
954
- if (!mainCalendar.month || (this.dateOptions().firstDay === undefined || this.dateOptions().firstDay === undefined)) {
960
+ // side enum
961
+ const mainCalendar = side === SideEnum.left ? this.leftCalendar() : this.rightCalendar();
962
+ if (!mainCalendar.month || this.dateOptions().firstDay === undefined || this.dateOptions().firstDay === undefined) {
955
963
  return;
956
964
  }
957
965
  const month = mainCalendar.month.month();
@@ -997,13 +1005,13 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
997
1005
  }
998
1006
  }
999
1007
  if (side === SideEnum.left) {
1000
- this.leftCalendar.update(current => {
1008
+ this.leftCalendar.update((current) => {
1001
1009
  current.calendar = calendar;
1002
1010
  return current;
1003
1011
  });
1004
1012
  }
1005
1013
  if (side === SideEnum.right) {
1006
- this.rightCalendar.update(current => {
1014
+ this.rightCalendar.update((current) => {
1007
1015
  current.calendar = calendar;
1008
1016
  return current;
1009
1017
  });
@@ -1029,7 +1037,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
1029
1037
  minDate: minDate,
1030
1038
  maxDate: maxDate,
1031
1039
  calendar: calendar,
1032
- dropdowns: signal({})
1040
+ dropdowns: signal({}),
1033
1041
  });
1034
1042
  if (this.showDropdownsSelect()) {
1035
1043
  const currentMonth = calendar[1][1].month();
@@ -1042,7 +1050,8 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
1042
1050
  for (let y = minYear; y <= maxYear; y++) {
1043
1051
  years.push(y);
1044
1052
  }
1045
- this.calendarVariables()[side]().dropdowns?.set({
1053
+ this.calendarVariables()[side]()
1054
+ .dropdowns?.set({
1046
1055
  currentMonth: currentMonth,
1047
1056
  currentYear: currentYear,
1048
1057
  maxYear: maxYear,
@@ -1050,7 +1059,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
1050
1059
  inMinYear: inMinYear,
1051
1060
  inMaxYear: inMaxYear,
1052
1061
  monthArrays: signal(Array.from(Array(12).keys())),
1053
- yearArrays: signal(years)
1062
+ yearArrays: signal(years),
1054
1063
  });
1055
1064
  }
1056
1065
  this.buildCells(calendar, side);
@@ -1087,11 +1096,15 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
1087
1096
  if (endDate !== null && calendar[row][col].format('YYYY-MM-DD') === endDate?.format('YYYY-MM-DD')) {
1088
1097
  classes.push('active', 'end-date');
1089
1098
  }
1090
- 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'))) {
1099
+ 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')))) {
1091
1100
  classes.push('active', 'full-date');
1092
1101
  }
1093
- if (startDate && endDate && ((nowHoveredDate !== null && this.pickingDate()) || endDate !== null) && (calendar[row][col] > startDate && (calendar[row][col] < endDate || (nowHoveredDate && calendar[row][col] < nowHoveredDate && this.pickingDate())))) {
1094
- classes.push(!classes.find(el => el === 'off') ? 'in-range' : 'focus-off');
1102
+ if (startDate &&
1103
+ endDate &&
1104
+ ((nowHoveredDate !== null && this.pickingDate()) || endDate !== null) &&
1105
+ calendar[row][col] > startDate &&
1106
+ (calendar[row][col] < endDate || (nowHoveredDate && calendar[row][col] < nowHoveredDate && this.pickingDate()))) {
1107
+ classes.push(!classes.find((el) => el === 'off') ? 'in-range' : 'focus-off');
1095
1108
  }
1096
1109
  let cname = '', disabled = false;
1097
1110
  for (let i = 0; i < classes.length; i++) {
@@ -1099,7 +1112,6 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
1099
1112
  if (classes[i] === 'disabled') {
1100
1113
  disabled = true;
1101
1114
  }
1102
- ;
1103
1115
  }
1104
1116
  if (!disabled) {
1105
1117
  cname += 'available';
@@ -1158,7 +1170,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
1158
1170
  if (maxDate && time.minute(0).isAfter(maxDate)) {
1159
1171
  disabled = true;
1160
1172
  }
1161
- this.timepickerVariables()[side].update(current => {
1173
+ this.timepickerVariables()[side].update((current) => {
1162
1174
  current.hours?.push(i);
1163
1175
  if (i_in_24 === selected.hour() && !disabled) {
1164
1176
  current.selectedHour = i;
@@ -1179,7 +1191,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
1179
1191
  if (maxDate && time.second(0).isAfter(maxDate)) {
1180
1192
  disabled = true;
1181
1193
  }
1182
- this.timepickerVariables()[side].update(current => {
1194
+ this.timepickerVariables()[side].update((current) => {
1183
1195
  current.minutes?.push(i);
1184
1196
  current.minutesLabel?.push(padded);
1185
1197
  if (selected.minute() === i && !disabled) {
@@ -1191,24 +1203,29 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
1191
1203
  return current;
1192
1204
  });
1193
1205
  }
1194
- this.timepickerVariables()[side].update(current => {
1206
+ this.timepickerVariables()[side].update((current) => {
1195
1207
  current.selected = selected;
1196
1208
  return current;
1197
1209
  });
1198
1210
  }
1199
1211
  updateElement() {
1200
- if (this.isSingle() && this.startDate()) {
1212
+ if (!this.startDate()) {
1213
+ return;
1214
+ }
1215
+ if (this.isSingle()) {
1201
1216
  this.selectedLabel.set(this.startDate()?.format('DD/MM/YYYY'));
1202
1217
  return;
1203
1218
  }
1204
- if (this.startDate() && this.endDate()) {
1219
+ if (this.endDate()) {
1205
1220
  // if we use ranges and should show range label on input
1206
1221
  if (this.quickRangesArray().length && this.showRangeLabelOnInput() && this.selectedQuickRange() && this.dateOptions().customRangeLabel !== this.selectedQuickRange()) {
1207
1222
  this.selectedLabel.set(this.selectedQuickRange());
1208
1223
  return;
1209
1224
  }
1210
1225
  this.selectedLabel.set(`${this.startDate()?.format('DD/MM/YYYY')}${this.dateOptions().separator}${this.endDate()?.format('DD/MM/YYYY')}`);
1226
+ return;
1211
1227
  }
1228
+ this.selectedLabel.set(`${this.startDate()?.format('DD/MM/YYYY')}${this.dateOptions().separator}${this.startDate()?.format('DD/MM/YYYY')}`);
1212
1229
  }
1213
1230
  updateView() {
1214
1231
  if (this.hasTimePicker()) {
@@ -1248,7 +1265,7 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
1248
1265
  return `${strHours}:${strMinute}`;
1249
1266
  }
1250
1267
  computedDisplayTimeInput(side, timeType) {
1251
- const time = timeType === 'hour' ? (side === SideEnum.left ? this.timepickerValueItem().lefthour() : this.timepickerValueItem().righthour()) : (side === SideEnum.left ? this.timepickerValueItem().leftminute() : this.timepickerValueItem().rightminute());
1268
+ const time = timeType === 'hour' ? (side === SideEnum.left ? this.timepickerValueItem().lefthour() : this.timepickerValueItem().righthour()) : side === SideEnum.left ? this.timepickerValueItem().leftminute() : this.timepickerValueItem().rightminute();
1252
1269
  if (!time) {
1253
1270
  return '00';
1254
1271
  }
@@ -1261,15 +1278,10 @@ export class LibsUiComponentsDatetimePickerCustomRangesCalendarComponent {
1261
1278
  return;
1262
1279
  }
1263
1280
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsDatetimePickerCustomRangesCalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1264
- 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 }, listYearHiddenInputSearch: { classPropertyName: "listYearHiddenInputSearch", publicName: "listYearHiddenInputSearch", 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]=\"listYearHiddenInputSearch()\"\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'\">\n {{ calendarVariables.left().calendar && calendarVariables.left().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.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\n 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\n 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\n 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\n 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\n 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]=\"listYearHiddenInputSearch()\"\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\n 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\n 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\n 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\n 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\n 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", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "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", "typeInput", "modeInput", "tabInsertContentTagInput", "textAreaEnterNotNewLine", "emitEmptyInDataTypeNumber", "keepZeroInTypeInt", "autoAddZeroLessThan10InTypeInt", "ignoreBlockInputMaxValue", "maxValueNumber", "minValueNumber", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "classInclude", "maxLength", "readonly", "disable", "noBorder", "backgroundNone", "borderError", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "value", "autoRemoveEmoji", "defaultHeight", "minHeightTextArea", "maxHeightTextArea", "focusTimeOut", "selectAllTimeOut", "blurTimeOut", "zIndexPopoverContent", "classContainerInput", "showCount", "ignoreStopPropagationEvent", "resize", "templateLeftBottomInput", "templateRightBottomInput", "classContainerBottomInput", "ignoreWidthInput100", "iframeTextareaCustomStyle", "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", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1281
+ 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 }, listYearHiddenInputSearch: { classPropertyName: "listYearHiddenInputSearch", publicName: "listYearHiddenInputSearch", 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\n 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\n 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\n [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\n 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\n 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\n 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\n [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]=\"listYearHiddenInputSearch()\"\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\n 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\n class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[1]?.[1]?.format(' YYYY') }}\n </div>\n <i\n 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\n class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dayofweek }}\n </span>\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"drp-animate\">\n @for (row of calendarVariables.left().calRows?.(); track row) {\n <tr\n class=\"h-[32px]\"\n [class]=\"calendarVariables.left().classes && calendarVariables.left().classes?.[row]?.classList\">\n @for (col of calendarVariables.left().calCols?.(); track col) {\n <td\n class=\"libs-ui-font-h5r\"\n [class.today]=\"\n calendarVariables.left().calendar &&\n calendarVariables.left().calendar?.[row]?.[col]?.date() === today().date() &&\n calendarVariables.left().calendar?.[row]?.[col]?.month() === today().month() &&\n calendarVariables.left().calendar?.[row]?.[col]?.year() === today().year()\n \"\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\n 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\n 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\n 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\n 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\n [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\n 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\n 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\n 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\n [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]=\"listYearHiddenInputSearch()\"\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\n 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\n 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\n 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 (\n (listKeyFromSelected().year &&\n listKeyToSelected().year &&\n !(listKeyFromSelected().year + 1 === listKeyToSelected().year && listKeyFromSelected().month === 12 && listKeyToSelected().month === 1) &&\n listKeyFromSelected().year < listKeyToSelected().year) ||\n (listKeyFromSelected().month && listKeyToSelected().month && listKeyFromSelected().month + 1 < +listKeyToSelected().month)\n ) {\n <div\n 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 (\n listKeyFromSelected().month &&\n listKeyToSelected().month &&\n listKeyFromSelected().month > listKeyToSelected().month &&\n listKeyFromSelected().year &&\n listKeyToSelected().year &&\n listKeyFromSelected().year === listKeyToSelected().year\n ) {\n <div class=\"bg-[#ffffff] w-[21px] h-[21px] cursor-none flex items-center justify-center rounded-[50px]\"></div>\n }\n @if (\n !calendarVariables().right().maxDate ||\n calendarVariables()\n .right()\n .maxDate?.isAfter(calendarVariables().right().calendar && calendarVariables().right().calendar?.lastDay)\n ) {\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\n class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dayofweek }}\n </span>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of calendarVariables().right().calRows?.(); track row) {\n <tr\n class=\"h-[32px]\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.classList\">\n @for (col of calendarVariables().right().calCols?.(); track col) {\n <td\n class=\"libs-ui-font-h5r\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.[col]\"\n [class.today]=\"\n calendarVariables().right().calendar &&\n calendarVariables().right().calendar?.[row]?.[col]?.date() === today().date() &&\n calendarVariables().right().calendar?.[row]?.[col]?.month() === today().month() &&\n calendarVariables().right().calendar &&\n calendarVariables().right().calendar?.[row]?.[col]?.year() === today().year()\n \"\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\n 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\n 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\n 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 </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\n class=\"mr-[12px]\"\n label=\"i18n_cancel\"\n type=\"button-third\"\n (outClick)=\"handlerClickCancel($event)\" />\n <libs_ui-components-buttons-button\n 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", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "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", "typeInput", "modeInput", "tabInsertContentTagInput", "textAreaEnterNotNewLine", "emitEmptyInDataTypeNumber", "keepZeroInTypeInt", "autoAddZeroLessThan10InTypeInt", "ignoreBlockInputMaxValue", "maxValueNumber", "minValueNumber", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "classInclude", "maxLength", "readonly", "disable", "noBorder", "backgroundNone", "borderError", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "value", "autoRemoveEmoji", "defaultHeight", "minHeightTextArea", "maxHeightTextArea", "focusTimeOut", "selectAllTimeOut", "blurTimeOut", "zIndexPopoverContent", "classContainerInput", "showCount", "ignoreStopPropagationEvent", "resize", "templateLeftBottomInput", "templateRightBottomInput", "classContainerBottomInput", "ignoreWidthInput100", "iframeTextareaCustomStyle", "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", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1265
1282
  }
1266
1283
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsDatetimePickerCustomRangesCalendarComponent, decorators: [{
1267
1284
  type: Component,
1268
- args: [{ selector: 'libs_ui-components-datetime-picker-custom_ranges-calendar', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
1269
- TranslateModule,
1270
- LibsUiComponentsDropdownComponent,
1271
- LibsUiComponentsInputsInputComponent,
1272
- LibsUiComponentsButtonsButtonComponent
1273
- ], 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]=\"listYearHiddenInputSearch()\"\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'\">\n {{ calendarVariables.left().calendar && calendarVariables.left().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.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\n 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\n 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\n 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\n 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\n 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]=\"listYearHiddenInputSearch()\"\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\n 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\n 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\n 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\n 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\n 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"] }]
1285
+ args: [{ selector: 'libs_ui-components-datetime-picker-custom_ranges-calendar', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsDropdownComponent, LibsUiComponentsInputsInputComponent, LibsUiComponentsButtonsButtonComponent], template: "<div class=\"libs-ui-component-custom_ranges-calendar test-class\">\n <div class=\"relative flex\">\n <div\n 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\n 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\n [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\n 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\n 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\n 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\n [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]=\"listYearHiddenInputSearch()\"\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\n 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\n class=\"libs-ui-font-h4m\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ calendarVariables.left().calendar && calendarVariables.left().calendar?.[1]?.[1]?.format(' YYYY') }}\n </div>\n <i\n 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\n class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dayofweek }}\n </span>\n </th>\n }\n </tr>\n </thead>\n <tbody class=\"drp-animate\">\n @for (row of calendarVariables.left().calRows?.(); track row) {\n <tr\n class=\"h-[32px]\"\n [class]=\"calendarVariables.left().classes && calendarVariables.left().classes?.[row]?.classList\">\n @for (col of calendarVariables.left().calCols?.(); track col) {\n <td\n class=\"libs-ui-font-h5r\"\n [class.today]=\"\n calendarVariables.left().calendar &&\n calendarVariables.left().calendar?.[row]?.[col]?.date() === today().date() &&\n calendarVariables.left().calendar?.[row]?.[col]?.month() === today().month() &&\n calendarVariables.left().calendar?.[row]?.[col]?.year() === today().year()\n \"\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\n 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\n 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\n 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\n 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\n [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\n 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\n 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\n 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\n [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]=\"listYearHiddenInputSearch()\"\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\n 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\n 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\n 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 (\n (listKeyFromSelected().year &&\n listKeyToSelected().year &&\n !(listKeyFromSelected().year + 1 === listKeyToSelected().year && listKeyFromSelected().month === 12 && listKeyToSelected().month === 1) &&\n listKeyFromSelected().year < listKeyToSelected().year) ||\n (listKeyFromSelected().month && listKeyToSelected().month && listKeyFromSelected().month + 1 < +listKeyToSelected().month)\n ) {\n <div\n 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 (\n listKeyFromSelected().month &&\n listKeyToSelected().month &&\n listKeyFromSelected().month > listKeyToSelected().month &&\n listKeyFromSelected().year &&\n listKeyToSelected().year &&\n listKeyFromSelected().year === listKeyToSelected().year\n ) {\n <div class=\"bg-[#ffffff] w-[21px] h-[21px] cursor-none flex items-center justify-center rounded-[50px]\"></div>\n }\n @if (\n !calendarVariables().right().maxDate ||\n calendarVariables()\n .right()\n .maxDate?.isAfter(calendarVariables().right().calendar && calendarVariables().right().calendar?.lastDay)\n ) {\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\n class=\"libs-ui-font-h6m text-[#6a7383]\"\n [style.fontWeight]=\"500\"\n [style.fontStyle]=\"'normal'\">\n {{ dayofweek }}\n </span>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of calendarVariables().right().calRows?.(); track row) {\n <tr\n class=\"h-[32px]\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.classList\">\n @for (col of calendarVariables().right().calCols?.(); track col) {\n <td\n class=\"libs-ui-font-h5r\"\n [class]=\"calendarVariables().right().classes && calendarVariables().right().classes?.[row]?.[col]\"\n [class.today]=\"\n calendarVariables().right().calendar &&\n calendarVariables().right().calendar?.[row]?.[col]?.date() === today().date() &&\n calendarVariables().right().calendar?.[row]?.[col]?.month() === today().month() &&\n calendarVariables().right().calendar &&\n calendarVariables().right().calendar?.[row]?.[col]?.year() === today().year()\n \"\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\n 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\n 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\n 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 </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\n class=\"mr-[12px]\"\n label=\"i18n_cancel\"\n type=\"button-third\"\n (outClick)=\"handlerClickCancel($event)\" />\n <libs_ui-components-buttons-button\n 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"] }]
1274
1286
  }], ctorParameters: () => [] });
1275
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2RhdGV0aW1lL3BpY2tlci9zcmMvY3VzdG9tLXJhbmdlcy9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZGF0ZXRpbWUvcGlja2VyL3NyYy9jdXN0b20tcmFuZ2VzL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ2hNLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBaUQsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoSSxPQUFPLEVBQWtELG9DQUFvQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFLeEksT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sS0FBZ0IsTUFBTSxPQUFPLENBQUM7QUFDckMsT0FBTyxPQUFPLE1BQU0sc0JBQXNCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakksT0FBTyxF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QUVFLDJEQUEyRCxjQUd6RCxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7d0JBQ1AsZUFBZTt3QkFDZixpQ0FBaUM7d0JBQ2pDLG9DQUFvQzt3QkFDcEMsc0NBQXNDO3FCQUN2QyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBPbkRlc3Ryb3ksIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXCI7XG5pbXBvcnQgeyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCwgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duXCI7XG5pbXBvcnQgeyBJRm9jdXNBbmRCbHVyRXZlbnQsIElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBMaWJzVWlDb21wb25lbnRzSW5wdXRzSW5wdXRDb21wb25lbnQgfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtaW5wdXRcIjtcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbSB9IGZyb20gXCJAbGlicy11aS9jb21wb25lbnRzLWxpc3RcIjtcbmltcG9ydCB7IElGbGFnTW91c2UgfSBmcm9tIFwiQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyXCI7XG5pbXBvcnQgeyBJRXZlbnQgfSBmcm9tIFwiQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlc1wiO1xuaW1wb3J0IHsgSUh0dHBSZXF1ZXN0Q29uZmlnIH0gZnJvbSBcIkBsaWJzLXVpL3NlcnZpY2VzLWh0dHAtcmVxdWVzdFwiO1xuaW1wb3J0IHsgZ2V0RGF5anMsIGlzRW1wdHksIHNldCB9IGZyb20gXCJAbGlicy11aS91dGlsc1wiO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcbmltcG9ydCBkYXlqcywgeyBEYXlqcyB9IGZyb20gJ2RheWpzJztcbmltcG9ydCBpc29XZWVrIGZyb20gJ2RheWpzL3BsdWdpbi9pc29XZWVrJztcbmltcG9ydCB7IGdldE1vbnRoc0RldGFpbEJ5SWQsIGdldE1vbnRoc0xpc3RDb25maWcsIGdldFllYXJzRGV0YWlsQnlJZCwgZ2V0WWVhcnNMaXN0Q29uZmlnIH0gZnJvbSBcIi4uLy4uL2RlZmluZXMvY2FsZW5kYXIuZGVmaW5lXCI7XG5pbXBvcnQgeyBERUZBVUxUX01BWF9ZRUFSLCBERUZBVUxUX01JTl9ZRUFSIH0gZnJvbSBcIi4uLy4uL2RlZmluZXMvY29tbW9uLWRhdGUuZGVmaW5lXCI7XG5pbXBvcnQgeyBkZWZhdWx0TG9jYWxlQ29uZmlnLCBnZXREYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9kZWZpbmVzL2RhdGUtb3B0aW9ucy5kZWZpbmVcIjtcbmltcG9ydCB7IElFbWl0RGF0ZUNhbGVuZGFyIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvY2FsZW5kYXItZW1pdC5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IElDYWxlbmRhciwgSUNhbGVuZGFyVmFyaWFibGVzLCBJRGF0ZVJhbmdlLCBJU3BsaXRQaWNrZXJEYXRlLCBTaWRlRW51bSB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL2NhbGVuZGFyLXZhcmlhYmxlcy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IElDYWxlbmRhckZ1bmN0aW9uQ29udHJvbEV2ZW50IH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvZnVuY3Rpb24tY29udHJvbC5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IExvY2FsaXphdGlvbkNvbmZpZyB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL3BpY2tlci5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IElDaGVja1RpbWVwaWNrZXJTZWxlY3RlZCwgSVNlbGVjdGVkT2xkLCBJVGltZXBpY2tlckl0ZW1WYWx1ZSwgSVRpbWVwaWNrZXJWYXJpYWJsZXMsIElUaW1lcGlja2VyVmFyaWFibGVzU2lkZSB9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL3RpbWUtdmFyaWFibGVzLmludGVyZmFjZVwiO1xuZGF5anMuZXh0ZW5kKGlzb1dlZWspO1xuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWRhdGV0aW1lLXBpY2tlci1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXIuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNJbnB1dENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNEYXRldGltZVBpY2tlckN1c3RvbVJhbmdlc0NhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiogUFJPUEVSVFkgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZGVFbnVtID0gU2lkZUVudW07XG4gIHByb3RlY3RlZCBjYWxlbmRhclZhcmlhYmxlcyA9IHNpZ25hbDxJQ2FsZW5kYXJWYXJpYWJsZXM+KHsgbGVmdDogc2lnbmFsKHt9KSwgcmlnaHQ6IHNpZ25hbCh7fSkgfSk7XG4gIHByb3RlY3RlZCB0aW1lcGlja2VyVmFyaWFibGVzID0gc2lnbmFsPElUaW1lcGlja2VyVmFyaWFibGVzPih7IGxlZnQ6IHNpZ25hbCh7IHNlbGVjdGVkSG91cjogMCwgc2VsZWN0ZWRNaW51dGU6IDAgfSksIHJpZ2h0OiBzaWduYWwoeyBzZWxlY3RlZEhvdXI6IDIzLCBzZWxlY3RlZE1pbnV0ZTogNTkgfSkgfSk7XG4gIHByb3RlY3RlZCBkaXNhYmxlTW9udGggPSBzaWduYWw8eyBsZWZ0OiBXcml0YWJsZVNpZ25hbDxBcnJheTxhbnk+PiwgcmlnaHQ6IFdyaXRhYmxlU2lnbmFsPEFycmF5PGFueT4+IH0+KHsgbGVmdDogc2lnbmFsKFtdKSwgcmlnaHQ6IHNpZ25hbChbXSkgfSk7XG4gIHByb3RlY3RlZCB0b2RheSA9IHNpZ25hbDxEYXlqcz4oZ2V0RGF5anM8RGF5anM+KCkpO1xuICBwcm90ZWN0ZWQgbGlzdEtleUZyb21TZWxlY3RlZCA9IHNpZ25hbDx7IG1vbnRoOiBhbnksIHllYXI6IGFueSB9Pih7IG1vbnRoOiB1bmRlZmluZWQsIHllYXI6IHVuZGVmaW5lZCB9KTtcbiAgcHJvdGVjdGVkIGxpc3RLZXlUb1NlbGVjdGVkID0gc2lnbmFsPHsgbW9udGg6IGFueSwgeWVhcjogYW55IH0+KHsgbW9udGg6IHVuZGVmaW5lZCwgeWVhcjogdW5kZWZpbmVkIH0pO1xuICBwcm90ZWN0ZWQgY2hlY2tTaG93TGlzdERyb3Bkb3duID0gc2lnbmFsPHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9Pih7fSk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFF1aWNrUmFuZ2UgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCBsZWZ0Q2FsZW5kYXIgPSBzaWduYWw8eyBjYWxlbmRhcj86IElDYWxlbmRhciwgbW9udGg/OiBEYXlqcyB9Pih7fSk7XG4gIHByb3RlY3RlZCByaWdodENhbGVuZGFyID0gc2lnbmFsPHsgY2FsZW5kYXI/OiBJQ2FsZW5kYXIsIG1vbnRoPzogRGF5anMgfT4oe30pO1xuXG4gIHByb3RlY3RlZCBsaXN0TW9udGhzQ29uZmlnID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIG1vbnRoSHR0cERldGFpbENvbmZpZyA9IHNpZ25hbDxJSHR0cFJlcXVlc3RDb25maWc+KGdldE1vbnRoc0RldGFpbEJ5SWQoKSk7XG4gIHByb3RlY3RlZCBsaXN0TGVmdFllYXJDb25maWcgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbGlzdFJpZ2h0WWVhckNvbmZpZyA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW0gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBsaXN0WWVhckNvbmZpZyA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW0gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBsZWZ0WWVhckh0dHBEZXRhaWxDb25maWcgPSBzaWduYWw8SUh0dHBSZXF1ZXN0Q29uZmlnIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgcmlnaHRZZWFySHR0cERldGFpbENvbmZpZyA9IHNpZ25hbDxJSHR0cFJlcXVlc3RDb25maWcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcHJvdGVjdGVkIHRpbWVQaWNrZXJFcnJvciA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBjb21wdXRlZERpc3BsYXlUaW1lTGVmdCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29tcHV0ZWREaXNwbGF5VGltZSh7IHNlbGVjdGVkSG91cjogdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdGhvdXIoKSwgc2VsZWN0ZWRNaW51dGU6IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSB9KSk7XG4gIHByb3RlY3RlZCBjb21wdXRlZERpc3BsYXlUaW1lUmlnaHQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWUoeyBzZWxlY3RlZEhvdXI6IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0aG91cigpLCBzZWxlY3RlZE1pbnV0ZTogdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSB9KSk7XG4gIHByb3RlY3RlZCBjb21wdXRlZERpc3BsYXlUaW1lTGVmdElucHV0SG91ciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29tcHV0ZWREaXNwbGF5VGltZUlucHV0KFNpZGVFbnVtLmxlZnQsICdob3VyJykpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZUxlZnRJbnB1dE1pbnV0ZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29tcHV0ZWREaXNwbGF5VGltZUlucHV0KFNpZGVFbnVtLmxlZnQsICdtaW51dGUnKSk7XG4gIHByb3RlY3RlZCBjb21wdXRlZERpc3BsYXlUaW1lUmlnaHRJbnB1dEhvdXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWVJbnB1dChTaWRlRW51bS5yaWdodCwgJ2hvdXInKSk7XG4gIHByb3RlY3RlZCBjb21wdXRlZERpc3BsYXlUaW1lUmlnaHRJbnB1dE1pbnV0ZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29tcHV0ZWREaXNwbGF5VGltZUlucHV0KFNpZGVFbnVtLnJpZ2h0LCAnbWludXRlJykpO1xuICBwcm90ZWN0ZWQgdGltZXBpY2tlclZhbHVlSXRlbSA9IHNpZ25hbDxJVGltZXBpY2tlckl0ZW1WYWx1ZT4oeyBsZWZ0aG91cjogc2lnbmFsKDApLCBsZWZ0bWludXRlOiBzaWduYWwoMCksIHJpZ2h0aG91cjogc2lnbmFsKDApLCByaWdodG1pbnV0ZTogc2lnbmFsKDApIH0pO1xuXG4gIHByaXZhdGUgZnVuY3Rpb25Db250cm9scyA9IG5ldyBNYXA8c3RyaW5nLCBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCB8IElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICBwcml2YXRlIHBpY2tpbmdEYXRlID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBpc1Nob3duID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBub3dIb3ZlcmVkRGF0ZSA9IHNpZ25hbDxEYXlqcyB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHRpbWVQaWNrZXJJbmNyZW1lbnQgPSBzaWduYWw8bnVtYmVyPigxKTtcbiAgcHJpdmF0ZSBzZWxlY3RlZExhYmVsID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBrZXlDb2RlQmFja3NwYWNlID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBjaGVja0JhY2tzcGFjZUZvY3VzID0gc2lnbmFsPElUaW1lcGlja2VySXRlbVZhbHVlPih7IGxlZnRob3VyOiBzaWduYWwoMSksIGxlZnRtaW51dGU6IHNpZ25hbCgxKSwgcmlnaHRob3VyOiBzaWduYWwoMSksIHJpZ2h0bWludXRlOiBzaWduYWwoMSkgfSk7XG4gIHByaXZhdGUgaXNaZXJvID0gc2lnbmFsPGJvb2xlYW4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgb2xkRGF0ZSA9IHNpZ25hbDxJU2VsZWN0ZWRPbGQ+KHsgc3RhcnQ6IGRheWpzKDApLCBlbmQ6IGRheWpzKDApIH0pO1xuICBwcml2YXRlIGlzU2VsZWN0ZWREYXRhID0gc2lnbmFsPElDaGVja1RpbWVwaWNrZXJTZWxlY3RlZD4oeyBsZWZ0bW9udGg6IGZhbHNlLCBsZWZ0eWVhcjogZmFsc2UsIHJpZ2h0bW9udGg6IGZhbHNlLCByaWdodHllYXI6IGZhbHNlIH0pO1xuICBwcml2YXRlIHNwbGl0UGlja2VyRGF0ZSA9IHNpZ25hbDxJU3BsaXRQaWNrZXJEYXRlPih7IHN0YXJ0OiBzaWduYWwoeyBtb250aDogMCwgeWVhcjogMCwgZGF5OiAwLCBob3VyOiAwLCBtaW51dGU6IDAgfSksIGVuZDogc2lnbmFsKHsgbW9udGg6IDAsIHllYXI6IDAsIGRheTogMCwgaG91cjogMjMsIG1pbnV0ZTogNTkgfSkgfSk7XG5cbiAgLyoqIElOUFVUICovXG4gIHJlYWRvbmx5IHF1aWNrUmFuZ2VzQXJyYXkgPSBpbnB1dDxBcnJheTxJRGF0ZVJhbmdlPj4oW10pO1xuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxudW1iZXIsIG51bWJlcj4oMTIwMCwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gMTIwMCB9KTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlID0gaW5wdXQ8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGlzU2luZ2xlID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBzaG93RHJvcGRvd25zU2VsZWN0ID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGhhc1RpbWVQaWNrZXIgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgZmxhZ01vdXNlID0gaW5wdXQ8SUZsYWdNb3VzZT4oeyBpc01vdXNlRW50ZXI6IGZhbHNlLCBpc01vdXNlRW50ZXJDb250ZW50OiBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgZGF0ZU9wdGlvbnMgPSBpbnB1dDxMb2NhbGl6YXRpb25Db25maWc+KHsgLi4uZGVmYXVsdExvY2FsZUNvbmZpZygpLCAuLi5nZXREYXRlT3B0aW9ucygpIH0pO1xuICByZWFkb25seSBhdXRvQXBwbHkgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGhhc1NlY29uZFBpY2tlciA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgc2hvd1JhbmdlTGFiZWxPbklucHV0ID0gaW5wdXQ8Ym9vbGVhbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICByZWFkb25seSBzdGFydERhdGUgPSBtb2RlbDxEYXlqcyB8IHVuZGVmaW5lZD4oZ2V0RGF5anM8RGF5anM+KCkuc3RhcnRPZignZGF5JykpO1xuICByZWFkb25seSBlbmREYXRlID0gbW9kZWw8RGF5anMgfCB1bmRlZmluZWQ+KGdldERheWpzPERheWpzPigpLmVuZE9mKCdkYXknKSk7XG4gIHJlYWRvbmx5IG1pbkRhdGUgPSBpbnB1dDxEYXlqcyB8IHN0cmluZyB8IHVuZGVmaW5lZCwgRGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCwgeyB0cmFuc2Zvcm06IHRoaXMudHJhbnNmb3JtTWluTWF4RGF0ZS5iaW5kKHRoaXMpIH0pO1xuICByZWFkb25seSBtYXhEYXRlID0gaW5wdXQ8RGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQsIERheWpzIHwgc3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQsIHsgdHJhbnNmb3JtOiB0aGlzLnRyYW5zZm9ybU1pbk1heERhdGUuYmluZCh0aGlzKSB9KTtcbiAgcmVhZG9ubHkgbGlzdFllYXJIaWRkZW5JbnB1dFNlYXJjaCA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KHRydWUsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IHRydWUgfSk7XG4gIC8qKiBPVVRQVVQgKi9cbiAgcmVhZG9ubHkgb3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSA9IG91dHB1dDxJRmxhZ01vdXNlPigpO1xuICAvLyByZWFkb25seSBvdXRTdGFydERhdGVDaGFuZ2VkID0gb3V0cHV0PHsgc3RhcnREYXRlOiBEYXlqcyB8IHVuZGVmaW5lZCB9PigpO1xuICAvLyByZWFkb25seSBvdXRFbmREYXRlQ2hhbmdlZCA9IG91dHB1dDx7IGVuZERhdGU6IERheWpzIHwgdW5kZWZpbmVkIH0+KCk7XG4gIHJlYWRvbmx5IG91dFBpY2tlckRhdGUgPSBvdXRwdXQ8SUVtaXREYXRlQ2FsZW5kYXI+KCk7XG4gIC8vIHJlYWRvbmx5IG91dFJhbmdlQ2xpY2tlZDogRXZlbnRFbWl0dGVyPElSYW5nZXNDbGlja2VkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcmVhZG9ubHkgb3V0Q2FuY2VsID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgb3V0VXBkYXRlV2lkdGggPSBvdXRwdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElDYWxlbmRhckZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuXG4gIC8qKiBJTkpFQ1RJT04gKi9cbiAgcHJpdmF0ZSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgcmVhZG9ubHkgcGlja2VyQ29udGFpbmVyID0gdmlld0NoaWxkPEVsZW1lbnRSZWY+KCdwaWNrZXJDb250YWluZXInKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmxpc3RNb250aHNDb25maWcuc2V0KGdldE1vbnRoc0xpc3RDb25maWcodGhpcy50cmFuc2xhdGUpKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBvbGRTdGFydCA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKSB9KTtcbiAgICAgIGNvbnN0IG9sZEVuZCA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5lbmREYXRlKCk/LmNsb25lKCkgfSk7XG5cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHRoaXMub2xkRGF0ZS5zZXQoeyBzdGFydDogb2xkU3RhcnQsIGVuZDogb2xkRW5kIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBzdGFydERhdGUgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCkgfSk7XG4gICAgY29uc3QgZW5kRGF0ZSA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5lbmREYXRlKCk/LmNsb25lKCkgfSk7XG5cbiAgICB0aGlzLnNwbGl0UGlja2VyRGF0ZS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50LnN0YXJ0LnVwZGF0ZShzaWRlQ3VycmVudCA9PiB7XG4gICAgICAgIHNpZGVDdXJyZW50LmRheSA9IChzdGFydERhdGUgPz8gZ2V0RGF5anM8RGF5anM+KCkuc3RhcnRPZignZGF5JykpLmRhdGUoKTtcblxuICAgICAgICByZXR1cm4gc2lkZUN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIGN1cnJlbnQuZW5kLnVwZGF0ZShzaWRlQ3VycmVudCA9PiB7XG4gICAgICAgIHNpZGVDdXJyZW50LmRheSA9IChlbmREYXRlID8/IGdldERheWpzPERheWpzPigpLmVuZE9mKCdkYXknKSkuZGF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBzaWRlQ3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgICB9XG4gICAgaWYgKHN0YXJ0RGF0ZSAmJiB0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5zZXRTdGFydERhdGUoc3RhcnREYXRlKTtcbiAgICAgIHRoaXMucmVuZGVyVGltZVBpY2tlcihTaWRlRW51bS5sZWZ0KTtcbiAgICB9XG5cbiAgICBpZiAoZW5kRGF0ZSAmJiB0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5zZXRFbmREYXRlKGVuZERhdGUpO1xuICAgICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgICB9XG4gICAgdGhpcy5idWlsZENvbmZpZ1llYXIoU2lkZUVudW0ubGVmdCk7XG4gICAgdGhpcy5idWlsZENvbmZpZ1llYXIoU2lkZUVudW0ucmlnaHQsIHN0YXJ0RGF0ZT8ueWVhcigpKTtcbiAgICB0aGlzLnVwZGF0ZU1vbnRoc0luVmlldygpO1xuICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoU2lkZUVudW0ubGVmdCk7XG4gICAgaWYgKChnZXREYXlqcyh7IGRhdGU6IHRoaXMubWF4RGF0ZSgpIH0pPy55ZWFyKCkgPz8gREVGQVVMVF9NQVhfWUVBUikgPCAoc3RhcnREYXRlPy55ZWFyKCkgfHwgMCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlclNlbGVjdGVkRHJvcGRvd24oeyBrZXk6IGdldERheWpzKHsgZGF0ZTogdGhpcy5tYXhEYXRlKCkgfSk/LnllYXIoKSBhcyB1bmtub3duIGFzIHN0cmluZyB9LCBTaWRlRW51bS5sZWZ0ICsgJ3llYXInKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNTaW5nbGUoKSkge1xuICAgICAgdGhpcy5yZW5kZXJDYWxlbmRhcihTaWRlRW51bS5yaWdodCk7XG4gICAgICBpZiAoKGdldERheWpzKHsgZGF0ZTogdGhpcy5tYXhEYXRlKCkgfSk/LnllYXIoKSA/PyBERUZBVUxUX01BWF9ZRUFSKSA8IChlbmREYXRlPy55ZWFyKCkgfHwgMCkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyU2VsZWN0ZWREcm9wZG93bih7IGtleTogZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1heERhdGUoKSB9KT8ueWVhcigpIGFzIHVua25vd24gYXMgc3RyaW5nIH0sIFNpZGVFbnVtLnJpZ2h0ICsgJ3llYXInKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0aGlzLnJlbmRlclJhbmdlcygpO1xuICAgIHRoaXMuZm9ybWF0TW9udGhZZWFyKCk7XG4gICAgdGhpcy5vdXRVcGRhdGVXaWR0aC5lbWl0KDEpO1xuICAgIHRoaXMudXBkYXRlRWxlbWVudCgpO1xuICAgIHRoaXMudGltZXBpY2tlclZhbHVlSXRlbS5zZXQoe1xuICAgICAgbGVmdGhvdXI6IHNpZ25hbCh0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKS5sZWZ0KCkuc2VsZWN0ZWRIb3VyKSxcbiAgICAgIHJpZ2h0aG91cjogc2lnbmFsKHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpLnJpZ2h0KCkuc2VsZWN0ZWRIb3VyKSxcbiAgICAgIGxlZnRtaW51dGU6IHNpZ25hbCh0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKS5sZWZ0KCkuc2VsZWN0ZWRNaW51dGUpLFxuICAgICAgcmlnaHRtaW51dGU6IHNpZ25hbCh0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKS5yaWdodCgpLnNlbGVjdGVkTWludXRlKVxuICAgIH0pO1xuXG4gICAgLy8gdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQoeyBidWlsZERlZmF1bHRSYW5nZTogdGhpcy5idWlsZERlZmF1bHRSYW5nZS5iaW5kKHRoaXMpLCBhcHBseVRvU2VsZWN0OiB0aGlzLmFwcGx5VG9TZWxlY3QuYmluZCh0aGlzKSB9KVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENvbmZpZ1llYXIoc2lkZTogU2lkZUVudW0sIHN0YXJ0WWVhcj86IG51bWJlciwpIHtcbiAgICBjb25zdCBtaW5EYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1pbkRhdGUoKSB9KTtcbiAgICBjb25zdCBtYXhEYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1heERhdGUoKSB9KTtcblxuICAgIGNvbnN0IGxpc3RMZWZ0WWVhciA9IFtdO1xuICAgIGNvbnN0IGxpc3RSaWdodFllYXIgPSBbXTtcblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSB7XG4gICAgICBjb25zdCBzdGFydCA9IG1heERhdGU/LnllYXIoKSA/PyBERUZBVUxUX01BWF9ZRUFSO1xuICAgICAgY29uc3QgZW5kID0gbWluRGF0ZT8ueWVhcigpID8/IERFRkFVTFRfTUlOX1lFQVI7XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPj0gZW5kOyBpLS0pIHtcbiAgICAgICAgbGlzdExlZnRZZWFyLnB1c2goe1xuICAgICAgICAgIGlkOiBpLFxuICAgICAgICAgIGxhYmVsOiBgJHtpfWBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmxpc3RMZWZ0WWVhckNvbmZpZy5zZXQoZ2V0WWVhcnNMaXN0Q29uZmlnKGxpc3RMZWZ0WWVhcikpO1xuICAgICAgdGhpcy5sZWZ0WWVhckh0dHBEZXRhaWxDb25maWcuc2V0KGdldFllYXJzRGV0YWlsQnlJZChsaXN0TGVmdFllYXIpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gbWF4RGF0ZT8ueWVhcigpID8/IERFRkFVTFRfTUFYX1lFQVI7XG4gICAgY29uc3QgZW5kID0gc3RhcnRZZWFyID8/IG1pbkRhdGU/LnllYXIoKSA/PyBnZXREYXlqczxEYXlqcz4oKS55ZWFyKCk7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpID49IGVuZDsgaS0tKSB7XG4gICAgICBsaXN0UmlnaHRZZWFyLnB1c2goe1xuICAgICAgICBpZDogaSxcbiAgICAgICAgbGFiZWw6IGAke2l9YFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5saXN0UmlnaHRZZWFyQ29uZmlnLnNldChnZXRZZWFyc0xpc3RDb25maWcobGlzdFJpZ2h0WWVhcikpO1xuICAgIHRoaXMucmlnaHRZZWFySHR0cERldGFpbENvbmZpZy5zZXQoZ2V0WWVhcnNEZXRhaWxCeUlkKGxpc3RSaWdodFllYXIpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlRmxhZ01vdXNlKGZsYWdNb3VzZTogSUZsYWdNb3VzZSkge1xuICAgIHRoaXMub3V0Q2hhbmdTdGFnZUZsYWdNb3VzZS5lbWl0KGZsYWdNb3VzZSlcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RhcnRFbmREYXRlKGRhdGU6IERheWpzKSB7XG4gICAgZGF0ZSA9IGdldERheWpzKHsgZGF0ZSB9KTtcbiAgICBpZiAoKHRoaXMuZW5kRGF0ZSgpIHx8IGRhdGUuaXNCZWZvcmUoZ2V0RGF5anMoeyBkYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpIH0pLCAnZGF5JykpKSB7XG4gICAgICBpZiAodGhpcy5oYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgZGF0ZSA9IHRoaXMuZ2V0RGF0ZVdpdGhUaW1lKGRhdGUsIFNpZGVFbnVtLmxlZnQpO1xuICAgICAgfVxuICAgICAgdGhpcy5lbmREYXRlLnNldCh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5zZXRTdGFydERhdGUoZ2V0RGF5anMoeyBkYXRlOiBkYXRlLmNsb25lKCkgfSkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5lbmREYXRlKCkgJiYgdGhpcy5zdGFydERhdGUoKSAmJiBkYXRlLmlzQmVmb3JlKGdldERheWpzKHsgZGF0ZTogdGhpcy5zdGFydERhdGUoKSB9KSkpIHtcbiAgICAgIHRoaXMuc2V0RW5kRGF0ZShnZXREYXlqcyh7IGRhdGU6IHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCkgfSkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgZGF0ZSA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5nZXREYXRlV2l0aFRpbWUoZGF0ZSwgU2lkZUVudW0ucmlnaHQpIH0pO1xuICAgIH1cbiAgICBpZiAoIWRhdGUuaXNCZWZvcmUoZ2V0RGF5anMoeyBkYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpIH0pLCAnZGF5JykpIHtcbiAgICAgIHRoaXMuc2V0RW5kRGF0ZShnZXREYXlqcyh7IGRhdGU6IGRhdGUuY2xvbmUoKSB9KSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmF1dG9BcHBseSgpKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVNlbGVjdGVkTGFiZWwoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZVNlbGVjdGVkTGFiZWwoKSB7XG4gICAgdGhpcy51cGRhdGVFbGVtZW50KCk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdE1vbnRoWWVhcigpIHtcbiAgICBjb25zdCBtb250aCA9ICh0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkubGVmdCgpLmRyb3Bkb3ducz8uKCk/LmN1cnJlbnRNb250aCA/PyAwKSArIDE7XG4gICAgdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQubW9udGggPSBtb250aDtcbiAgICAgIGN1cnJlbnQueWVhciA9IHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKS5sZWZ0KCkuZHJvcGRvd25zPy4oKT8uY3VycmVudFllYXI7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmlzU2luZ2xlKCkpIHtcbiAgICAgIHRoaXMuaXNTZWxlY3RlZERhdGEuc2V0KHsgbGVmdG1vbnRoOiB0cnVlLCBsZWZ0eWVhcjogdHJ1ZSwgcmlnaHRtb250aDogdHJ1ZSwgcmlnaHR5ZWFyOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByaWdodE1vbnRoID0gKHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmRyb3Bkb3ducz8uKCk/LmN1cnJlbnRNb250aCA/PyAwKSArIDE7XG4gICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50Lm1vbnRoID0gcmlnaHRNb250aDtcbiAgICAgIGN1cnJlbnQueWVhciA9IHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmRyb3Bkb3ducz8uKCk/LmN1cnJlbnRZZWFyO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICB0aGlzLmlzU2VsZWN0ZWREYXRhLnNldCh7IGxlZnRtb250aDogdHJ1ZSwgbGVmdHllYXI6IHRydWUsIHJpZ2h0bW9udGg6IHRydWUsIHJpZ2h0eWVhcjogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RhcnREYXRlKHN0YXJ0RGF0ZTogRGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXRoaXMuc3RhcnREYXRlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzdGFydERhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZ2V0RGF5anM8RGF5anM+KHsgZGF0ZTogZGF5anMoc3RhcnREYXRlLCB0aGlzLmRhdGVPcHRpb25zKCkuZm9ybWF0KSwgcmV0dXJuRGF5anNJZkNvbmZpZ0RhdGVOb3RFeGlzdDogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3RhcnREYXRlID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5waWNraW5nRGF0ZS5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZ2V0RGF5anM8RGF5anM+KHsgZGF0ZTogc3RhcnREYXRlLCByZXR1cm5EYXlqc0lmQ29uZmlnRGF0ZU5vdEV4aXN0OiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5waWNraW5nRGF0ZS5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZ2V0RGF5anMoeyBkYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpPy5zdGFydE9mKCdkYXknKSB9KSk7XG4gICAgfVxuICAgIHRoaXMuc2V0U3RhcnREYXRlSW5UaW1lUGlja2VyKCk7XG5cbiAgICBpZiAodGhpcy5taW5EYXRlKCkgJiYgdGhpcy5zdGFydERhdGUoKT8uaXNCZWZvcmUodGhpcy5taW5EYXRlKCkpKSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1pbkRhdGUoKSB9KT8uY2xvbmUoKSk7XG5cbiAgICAgIHRoaXMuc2V0U3RhcnREYXRlSW5UaW1lUGlja2VyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1heERhdGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpPy5pc0FmdGVyKHRoaXMubWF4RGF0ZSgpKSkge1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KGdldERheWpzKHsgZGF0ZTogdGhpcy5tYXhEYXRlKCkgfSk/LmNsb25lKCkpO1xuICAgICAgdGhpcy5zZXRTdGFydERhdGVJblRpbWVQaWNrZXIoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzU2hvd24oKSkge1xuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KCk7XG4gICAgfVxuICAgIC8vIHRoaXMub3V0U3RhcnREYXRlQ2hhbmdlZC5lbWl0KHsgc3RhcnREYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpIH0pO1xuICAgIHRoaXMudXBkYXRlTW9udGhzSW5WaWV3KCk7XG4gIH1cblxuICBwcml2YXRlIHNldFN0YXJ0RGF0ZUluVGltZVBpY2tlcigpIHtcbiAgICBpZiAoIXRoaXMuaGFzVGltZVBpY2tlcigpIHx8ICF0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnREYXRlLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQubWludXRlKE1hdGgucm91bmQoY3VycmVudC5taW51dGUoKSAvIHRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKSAqIHRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRFbmREYXRlKGVuZERhdGU6IERheWpzIHwgc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBlbmREYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5lbmREYXRlLnNldChnZXREYXlqczxEYXlqcz4oeyBkYXRlOiBkYXlqcyhlbmREYXRlLCB0aGlzLmRhdGVPcHRpb25zKCkuZm9ybWF0KSwgcmV0dXJuRGF5anNJZkNvbmZpZ0RhdGVOb3RFeGlzdDogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5kRGF0ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMucGlja2luZ0RhdGUuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuZW5kRGF0ZS5zZXQoZ2V0RGF5anM8RGF5anM+KHsgZGF0ZTogZGF5anMoZW5kRGF0ZSksIHJldHVybkRheWpzSWZDb25maWdEYXRlTm90RXhpc3Q6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZW5kRGF0ZSgpIHx8ICF0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVNb250aHNJblZpZXcoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5waWNraW5nRGF0ZS5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5lbmREYXRlLnNldCh0aGlzLmVuZERhdGUoKT8uYWRkKDEsICdkJykuc3RhcnRPZignZGF5Jykuc3VidHJhY3QoMSwgJ3NlY29uZCcpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzVGltZVBpY2tlcigpICYmIHRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKSB7XG4gICAgICB0aGlzLmVuZERhdGUudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGlmICghY3VycmVudCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50Lm1pbnV0ZShNYXRoLnJvdW5kKGN1cnJlbnQubWludXRlKCkgLyB0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQoKSkgKiB0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQoKSk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSgpPy5pc0JlZm9yZSh0aGlzLnN0YXJ0RGF0ZSgpKSkge1xuICAgICAgdGhpcy5lbmREYXRlLnNldCh0aGlzLnN0YXJ0RGF0ZSgpPy5jbG9uZSgpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4RGF0ZSgpICYmIHRoaXMuZW5kRGF0ZSgpPy5pc0FmdGVyKHRoaXMubWF4RGF0ZSgpKSkge1xuICAgICAgdGhpcy5lbmREYXRlLnNldChnZXREYXlqcyh7IGRhdGU6ICh0aGlzLm1heERhdGUoKSkgfSk/LmNsb25lKCkpO1xuICAgIH1cbiAgICAvLyB0aGlzLm91dEVuZERhdGVDaGFuZ2VkLmVtaXQoeyBlbmREYXRlOiB0aGlzLmVuZERhdGUoKSB9KTtcbiAgICB0aGlzLnVwZGF0ZU1vbnRoc0luVmlldygpO1xuICB9XG4gIHByb3RlY3RlZCBoYW5kbGVySG92ZXJEYXRlKGV2ZW50OiBFdmVudCwgc2lkZTogU2lkZUVudW0sIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgbGVmdENhbERhdGUgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkubGVmdCgpLmNhbGVuZGFyPy5bcm93XVtjb2xdO1xuICAgIGNvbnN0IHJpZ2h0Q2FsRGF0ZSA9IHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bcm93XVtjb2xdO1xuXG4gICAgaWYgKCF0aGlzLnBpY2tpbmdEYXRlIHx8ICFyaWdodENhbERhdGUgfHwgIWxlZnRDYWxEYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubm93SG92ZXJlZERhdGUuc2V0KHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgPyBsZWZ0Q2FsRGF0ZSA6IHJpZ2h0Q2FsRGF0ZSk7XG4gICAgdGhpcy5yZW5kZXJDYWxlbmRhcihTaWRlRW51bS5sZWZ0KTtcbiAgICB0aGlzLnJlbmRlckNhbGVuZGFyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgfVxuICBwcml2YXRlIGdldERpc2FibGUodHlwZTogJ2xlZnQnIHwgJ3JpZ2h0Jykge1xuICAgIGNvbnN0IG1pbkRhdGUgPSBnZXREYXlqczxEYXlqcz4oeyBkYXRlOiB0aGlzLm1pbkRhdGUoKSB9KTtcbiAgICBjb25zdCBtYXhEYXRlID0gZ2V0RGF5anM8RGF5anM+KHsgZGF0ZTogdGhpcy5tYXhEYXRlKCkgfSk7XG5cbiAgICBpZiAodHlwZSA9PT0gJ2xlZnQnKSB7XG4gICAgICB0aGlzLmRpc2FibGVNb250aCgpLmxlZnQuc2V0KFtdKTtcblxuICAgICAgaWYgKG1pbkRhdGU/LnllYXIoKSA9PT0gdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhcikge1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IChtaW5EYXRlPy5tb250aCgpICsgMSk7IGkrKykge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZU1vbnRoKCkubGVmdC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgICBjdXJyZW50LnB1c2goaSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobWF4RGF0ZT8ueWVhcigpID09PSB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBtYXhEYXRlPy5tb250aCgpICsgMjsgaSA8IDEzOyBpKyspIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVNb250aCgpLmxlZnQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5wdXNoKGkpO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXNhYmxlTW9udGgoKS5yaWdodC5zZXQoW10pO1xuICAgIGlmIChtaW5EYXRlPy55ZWFyKCkgPT09IHRoaXMubGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IChtaW5EYXRlPy5tb250aCgpICsgMSk7IGkrKykge1xuICAgICAgICB0aGlzLmRpc2FibGVNb250aCgpLnJpZ2h0LnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LnB1c2goaSk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtYXhEYXRlPy55ZWFyKCkgPT09IHRoaXMubGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICBmb3IgKGxldCBpID0gbWF4RGF0ZT8ubW9udGgoKSArIDI7IGkgPCAxMzsgaSsrKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZU1vbnRoKCkucmlnaHQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQucHVzaChpKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKChOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhcikgPT09IE51bWJlcih0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpOyBpKyspIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlTW9udGgoKS5yaWdodC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5wdXNoKGkpO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tQcmV2KHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgJiYgdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aCkge1xuICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8uc3VidHJhY3QoMSwgJ21vbnRoJyk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSAodGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8ubW9udGgoKSA/PyAwKSArIDE7XG4gICAgICAgIGN1cnJlbnQueWVhciA9IHRoaXMubGVmdENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG4gICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQubW9udGggPSBjdXJyZW50Lm1vbnRoPy5zdWJ0cmFjdCgxLCAnbW9udGgnKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50Lm1vbnRoID0gKHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoPy5tb250aCgpID8/IDApICsgMTtcbiAgICAgIGN1cnJlbnQueWVhciA9IHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoPy55ZWFyKCk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcbiAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja05leHQoc2lkZTogU2lkZUVudW0pIHtcbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCkge1xuICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8uYWRkKDEsICdtb250aCcpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gKHRoaXMubGVmdENhbGVuZGFyKCkubW9udGg/Lm1vbnRoKCkgPz8gMCkgKyAxO1xuICAgICAgICBjdXJyZW50LnllYXIgPSB0aGlzLmxlZnRDYWxlbmRhcigpLm1vbnRoPy55ZWFyKCk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCh0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCA9PT0gdGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLm1vbnRoKSAmJiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciA9PT0gdGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLnllYXIpKSB7XG4gICAgICAgIHRoaXMucmlnaHRDYWxlbmRhci51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/LmFkZCgxLCAnbW9udGgnKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5tb250aCA9ICh0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aD8ubW9udGgoKSA/PyAwKSArIDE7XG4gICAgICAgICAgY3VycmVudC55ZWFyID0gdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcblxuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuICAgIHRoaXMucmlnaHRDYWxlbmRhci51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8uYWRkKDEsICdtb250aCcpO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQubW9udGggPSAodGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/Lm1vbnRoKCkgPz8gMCkgKyAxO1xuICAgICAgY3VycmVudC55ZWFyID0gdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFuZGxlclBpY2tlckRhdGUoZXZlbnQ6IGFueSwgc2lkZTogU2lkZUVudW0sIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKGV2ZW50LnRhcmdldD8udGFnTmFtZSA9PT0gJ1REJykge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldC5jbGFzc0xpc3QgJiYgIWV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2F2YWlsYWJsZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGV2ZW50LnRhcmdldC50YWdOYW1lID09PSAnU1BBTicpIHtcbiAgICAgIGlmIChldmVudC50YXJnZXQucGFyZW50RWxlbWVudCAmJiBldmVudC50YXJnZXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QgJiYgIWV2ZW50LnRhcmdldC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnYXZhaWxhYmxlJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuZGF0ZU9wdGlvbnMoKS5jdXN0b21SYW5nZUxhYmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnF1aWNrUmFuZ2VzQXJyYXkoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRRdWlja1JhbmdlLnNldCh0aGlzLmRhdGVPcHRpb25zKCkuY3VzdG9tUmFuZ2VMYWJlbCk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGUgPSBzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gdGhpcy5sZWZ0Q2FsZW5kYXIoKS5jYWxlbmRhcj8uW3Jvd11bY29sXSA6IHRoaXMucmlnaHRDYWxlbmRhcigpLmNhbGVuZGFyPy5bcm93XVtjb2xdO1xuXG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3BsaXRQaWNrZXJEYXRlLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnRbc2lkZSA9PT0gU2lkZUVudW0ubGVmdCA/ICdzdGFydCcgOiAnZW5kJ10udXBkYXRlKHNpZGVDdXJyZW50ID0+IHtcbiAgICAgICAgc2lkZUN1cnJlbnQuZGF5ID0gZGF0ZS5kYXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIHNpZGVDdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlU3RhcnRFbmREYXRlKGRhdGUpO1xuXG4gICAgaWYgKHRoaXMuaXNTaW5nbGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICB0aGlzLnNldEVuZERhdGUodGhpcy5zdGFydERhdGUoKSk7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcblxuICAgICAgaWYgKHRoaXMuYXV0b0FwcGx5KCkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyQ2xpY2tBcHBseSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgIGlmICh0aGlzLmF1dG9BcHBseSgpICYmIHRoaXMuc3RhcnREYXRlKCkgJiYgdGhpcy5lbmREYXRlKCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlckNsaWNrQXBwbHkoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNsaWNrQXBwbHkoZXZlbnQ/OiBFdmVudCkge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAvLyB0aGlzLnZhbGlkYXRlKCk7XG4gICAgLy8gaWYgKCF0aGlzLnZhbGlkYXRlKCkpIHtcbiAgICAvLyAgIHJldHVybjtcbiAgICAvLyB9XG4gICAgaWYgKHRoaXMuaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICB0aGlzLnNldFRpbWVJbnB1dChTaWRlRW51bS5sZWZ0KTtcbiAgICAgIHRoaXMuc2V0VGltZUlucHV0KFNpZGVFbnVtLnJpZ2h0KTtcbiAgICB9XG4gICAgdGhpcy5jYWxjdWxhdGVTZWxlY3RlZExhYmVsKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZExhYmVsKCkpIHtcbiAgICAgIHRoaXMub3V0UGlja2VyRGF0ZS5lbWl0KHsgZGlzcGxheUxhYmVsOiB0aGlzLnNlbGVjdGVkTGFiZWwoKSwgc3RhcnREYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpLCBlbmREYXRlOiB0aGlzLmVuZERhdGUoKSwgZGV0YWlsRGF0ZVBpY2tlcjogdGhpcy5zcGxpdFBpY2tlckRhdGUoKSB9KTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0NhbmNlbChldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZGF5anMoMCkpO1xuICAgIHRoaXMuZW5kRGF0ZS5zZXQoZGF5anMoMCkpO1xuICAgIHRoaXMub3V0Q2FuY2VsLmVtaXQoJycpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2woZXZlbnQ6IElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQsIHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMuZnVuY3Rpb25Db250cm9scy5zZXQodHlwZSwgZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTZWxlY3RlZERyb3Bkb3duKGV2ZW50OiBJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZCwgdHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vdXRDaGFuZ1N0YWdlRmxhZ01vdXNlLmVtaXQoe1xuICAgICAgaXNNb3VzZUVudGVyOiBmYWxzZSxcbiAgICAgIGlzTW91c2VFbnRlckNvbnRlbnQ6IGZhbHNlLFxuICAgICAgaXNDb250YWluZXJIYXNTY3JvbGw6IGZhbHNlXG4gICAgfSk7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgYCR7U2lkZUVudW0ubGVmdH1tb250aGA6XG4gICAgICBjYXNlIGAke1NpZGVFbnVtLnJpZ2h0fW1vbnRoYDpcbiAgICAgICAgdGhpcy51cGRhdGVNb250aFNlbGVjdChldmVudCwgdHlwZSk7XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgYCR7U2lkZUVudW0ubGVmdH15ZWFyYDpcbiAgICAgIGNhc2UgYCR7U2lkZUVudW0ucmlnaHR9eWVhcmA6XG4gICAgICAgIHRoaXMudXBkYXRlWWVhclNlbGVjdChldmVudCwgdHlwZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLnNwbGl0UGlja2VyRGF0ZS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICBpZiAodHlwZSA9PT0gYCR7U2lkZUVudW0ubGVmdH1tb250aGAgfHwgdHlwZSA9PT0gYCR7U2lkZUVudW0ubGVmdH15ZWFyYCkge1xuICAgICAgICBjdXJyZW50LnN0YXJ0LnVwZGF0ZShzdGFydCA9PiB7XG4gICAgICAgICAgaWYgKHR5cGUgPT09IGAke1NpZGVFbnVtLmxlZnR9bW9udGhgKSB7XG4gICAgICAgICAgICBzdGFydC5tb250aCA9IGV2ZW50LmtleSBhcyBudW1iZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlID09PSBgJHtTaWRlRW51bS5sZWZ0fXllYXJgKSB7XG4gICAgICAgICAgICBzdGFydC55ZWFyID0gZXZlbnQua2V5IGFzIG51bWJlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3RhcnQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50LmVuZC51cGRhdGUoZW5kID0+IHtcbiAgICAgICAgaWYgKHR5cGUgPT09IGAke1NpZGVFbnVtLnJpZ2h0fW1vbnRoYCkge1xuICAgICAgICAgIGVuZC5tb250aCA9IGV2ZW50LmtleSBhcyBudW1iZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IGAke1NpZGVFbnVtLnJpZ2h0fXllYXJgKSB7XG4gICAgICAgICAgZW5kLnllYXIgPSBldmVudC5rZXkgYXMgbnVtYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVuZDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTW9udGhTZWxlY3QoZXZlbnQ6IElFbWl0U2VsZWN0S2V5LCB0eXBlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaWRlID0gdHlwZS5pbmNsdWRlcyhTaWRlRW51bS5sZWZ0KSA/IFNpZGVFbnVtLmxlZnQgOiBTaWRlRW51bS5yaWdodDtcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5jYWxlbmRhclZhcmlhYmxlcygpW3NpZGVdKCkuZHJvcGRvd25zPy4oKT8uY3VycmVudFllYXIgfHwgZ2V0RGF5anM8RGF5anM+KCkueWVhcigpO1xuICAgIGNvbnN0IG1vbnRoID0gTnVtYmVyKGV2ZW50LmtleSkgLSAxO1xuXG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQpIHtcbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0ZWREYXRhKCkubGVmdG1vbnRoKSB7XG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZERhdGEudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQubGVmdG1vbnRoID0gZmFsc2U7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gZXZlbnQua2V5O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAoTnVtYmVyKGV2ZW50LmtleSkgPj0gTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSAmJiAoTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIpID09PSBOdW1iZXIodGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLnllYXIpKSkge1xuICAgICAgICBpZiAoTnVtYmVyKGV2ZW50LmtleSkgPD0gMTEpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSBOdW1iZXIoZXZlbnQua2V5KSArIDE7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChOdW1iZXIoZXZlbnQua2V5KSA9PT0gMTIpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSAxO1xuICAgICAgICAgICAgY3VycmVudC55ZWFyICs9IDE7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLnJpZ2h0KSB7XG4gICAgICBpZiAodGhpcy5pc1NlbGVjdGVkRGF0YSgpLnJpZ2h0bW9udGgpIHtcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkRGF0YS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5yaWdodG1vbnRoID0gZmFsc2U7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5tb250aCA9IGV2ZW50LmtleTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAodGhpcy5mdW5jdGlvbkNvbnRyb2xzLmdldCh0eXBlKSBhcyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCk/LnJlbW92ZUxpc3QoKTtcblxuICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcbiAgICB0aGlzLm1vbnRoT3JZZWFyQ2hhbmdlZChtb250aCwgeWVhciwgc2lkZSk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVZZWFyU2VsZWN0KGV2ZW50OiBJRW1pdFNlbGVjdEtleSwgdHlwZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2lkZSA9IHR5cGUuaW5jbHVkZXMoU2lkZUVudW0ubGVmdCkgPyBTaWRlRW51bS5sZWZ0IDogU2lkZUVudW0ucmlnaHQ7XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCkge1xuICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZERhdGEoKT8ubGVmdHllYXIpIHtcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkRGF0YS51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgY3VycmVudC5sZWZ0eWVhciA9IGZhbHNlO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdldERpc2FibGUoJ2xlZnQnKTtcbiAgICAgICAgLy8gdGhpcy5TZXRMaXN0WWVhclJpZ2h0KHRoaXMubGlzdFZpZXdLZXlTZWxlY3RlZFllYXIgYXMgbnVtYmVyKTtcbiAgICAgICAgKHRoaXMuZnVuY3Rpb25Db250cm9scy5nZXQodHlwZSkgYXMgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQpPy5yZW1vdmVMaXN0KCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC55ZWFyID0gZXZlbnQua2V5O1xuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgJiYgdGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLnllYXIgJiYgKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgPj0gdGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLnllYXIpKSB7XG4gICAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKGN1cnJlbnQgPT4ge1xuICAgICAgICAgIGN1cnJlbnQueWVhciA9IGV2ZW50LmtleTtcbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCAmJiBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpIDw9IDExKSB7XG4gICAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgICBjdXJyZW50Lm1vbnRoID0gTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSArIDE7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGggJiYgdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGggPT09IDEyKSB7XG4gICAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgICBjdXJyZW50Lm1vbnRoID0gTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKTtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmdldERpc2FibGUoJ2xlZnQnKTtcbiAgICAgIHRoaXMuYnVpbGRDb25maWdZZWFyKFNpZGVFbnVtLnJpZ2h0LCB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyIGFzIG51bWJlcik7XG4gICAgICAodGhpcy5mdW5jdGlvbkNvbnRyb2xzLmdldCh0eXBlKSBhcyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCk/LnJlbW92ZUxpc3QoKTtcbiAgICB9XG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLnJpZ2h0KSB7XG4gICAgICBpZiAodGhpcy5pc1NlbGVjdGVkRGF0YSgpLnJpZ2h0eWVhcikge1xuICAgICAgICB0aGlzLmlzU2VsZWN0ZWREYXRhLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICBjdXJyZW50LnJpZ2h0eWVhciA9IGZhbHNlO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdldERpc2FibGUoJ3JpZ2h0Jyk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQueWVhciA9IGV2ZW50LmtleTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgJiYgdGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLnllYXIgJiYgKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgPj0gdGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLnllYXIpKSB7XG4gICAgICAgIGlmICh0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCAmJiBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpIDw9IDExKSB7XG4gICAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgICAgICBjdXJyZW50Lm1vbnRoID0gTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSArIDE7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCAmJiB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCA9PT0gMTIpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmdldERpc2FibGUoJ3JpZ2h0Jyk7XG4gICAgbGV0IG1vbnRoID0gZ2V0RGF5anM8RGF5anM+KCkubW9udGgoKTtcblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5yaWdodCAmJiB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCkge1xuICAgICAgbW9udGggPSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpIC0gMTtcbiAgICB9XG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgJiYgdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpIHtcbiAgICAgIG1vbnRoID0gTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSAtIDE7XG4gICAgfVxuICAgIGNvbnN0IHllYXIgPSBOdW1iZXIoZXZlbnQua2V5KTtcblxuICAgIHRoaXMubW9udGhPclllYXJDaGFuZ2VkKG1vbnRoLCB5ZWFyLCBzaWRlKTtcblxuICB9XG4gIHByaXZhdGUgbW9udGhPclllYXJDaGFuZ2VkKG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlciwgc2lkZTogU2lkZUVudW0pIHtcbiAgICBjb25zdCBpc0xlZnQgPSBzaWRlID09PSBTaWRlRW51bS5sZWZ0O1xuICAgIGNvbnN0IG1pbkRhdGUgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMubWluRGF0ZSgpIH0pO1xuICAgIGNvbnN0IG1heERhdGUgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMubWF4RGF0ZSgpIH0pO1xuXG4gICAgaWYgKG1pbkRhdGUgJiYgKHllYXIgPCBtaW5EYXRlPy55ZWFyKCkgfHwgKHllYXIgPT09IG1pbkRhdGU/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/OiBJQ2FsZW5kYXIsIG1vbnRoPzogRGF5anMgfSA9IChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSA/IHRoaXMubGVmdENhbGVuZGFyKCkgOiB0aGlzLnJpZ2h0Q2FsZW5kYXIoKTtcblxuICAgIGlmICghbWFpbkNhbGVuZGFyLm1vbnRoIHx8ICh0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9udGggPSBtYWluQ2FsZW5kYXIubW9udGgubW9udGgoKTtcbiAgICBjb25zdCB5ZWFyID0gbWFpbkNhbGVuZGFyLm1vbnRoLnllYXIoKTtcbiAgICBjb25zdCBob3VyID0gbWFpbkNhbGVuZGFyLm1vbnRoLmhvdXIoKTtcbiAgICBjb25zdCBtaW51dGUgPSBtYWluQ2FsZW5kYXIubW9udGgubWludXRlKCk7XG4gICAgY29uc3Qgc2Vjb25kID0gbWFpbkNhbGVuZGFyLm1vbnRoLnNlY29uZCgpO1xuICAgIGNvbnN0IGRheXNJbk1vbnRoID0gZ2V0RGF5anM8RGF5anM+KHsgZGF0ZTogbmV3IERhdGUoeWVhciwgbW9udGgpIH0pLmRheXNJbk1vbnRoKCk7XG4gICAgY29uc3QgZmlyc3REYXkgPSBnZXREYXlqczxEYXlqcz4oeyBkYXRlOiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSkgfSk7XG4gICAgY29uc3QgbGFzdERheSA9IGdldERheWpzPERheWpzPih7IGRhdGU6IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXlzSW5Nb250aCkgfSk7XG4gICAgY29uc3QgbGFzdE1vbnRoID0gZ2V0RGF5anM8RGF5anM+KHsgZGF0ZTogZmlyc3REYXkuc3VidHJhY3QoMSwgJ21vbnRoJykgfSkubW9udGgoKTtcbiAgICBjb25zdCBsYXN0WWVhciA9IGdldERheWpzPERheWpzPih7IGRhdGU6IGZpcnN0RGF5LnN1YnRyYWN0KDEsICdtb250aCcpIH0pLnllYXIoKTtcbiAgICBjb25zdCBkYXlzSW5MYXN0TW9udGggPSBnZXREYXlqczxEYXlqcz4oeyBkYXRlOiBuZXcgRGF0ZShsYXN0WWVhciwgbGFzdE1vbnRoKX0pLmRheXNJbk1vbnRoKCk7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZmlyc3REYXkuZGF5KCk7XG4gICAgY29uc3QgY2FsZW5kYXI6IElDYWxlbmRhciA9IHt9O1xuXG4gICAgY2FsZW5kYXIuZmlyc3REYXkgPSBmaXJzdERheTtcbiAgICBjYWxlbmRhci5sYXN0RGF5ID0gbGFzdERheTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgY2FsZW5kYXJbaV0gPSBbXTtcbiAgICB9XG4gICAgbGV0IHN0YXJ0RGF5ID0gZGF5c0luTGFzdE1vbnRoIC0gZGF5T2ZXZWVrICsgKHRoaXMuZGF0ZU9wdGlvbnMoKS5maXJzdERheSA/PyAxKSArIDE7XG5cbiAgICBpZiAoc3RhcnREYXkgPiBkYXlzSW5MYXN0TW9udGgpIHtcbiAgICAgIHN0YXJ0RGF5IC09IDc7XG4gICAgfVxuICAgIGlmIChkYXlPZldlZWsgPT09IHRoaXMuZGF0ZU9wdGlvbnMoKS5maXJzdERheSkge1xuICAgICAgc3RhcnREYXkgPSBkYXlzSW5MYXN0TW9udGggLSA2O1xuICAgIH1cbiAgICBsZXQgY3VyRGF0ZSA9IGdldERheWpzPERheWpzPih7ZGF0ZTpuZXcgRGF0ZShsYXN0WWVhciwgbGFzdE1vbnRoLCBzdGFydERheSwgMTIsIG1pbnV0ZSwgc2Vjb25kKX0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGNvbCA9IDAsIHJvdyA9IDA7IGkgPCA0MjsgaSsrLCBjb2wrKywgY3VyRGF0ZSA9IGdldERheWpzPERheWpzPih7ZGF0ZTpjdXJEYXRlfSkuYWRkKDI0LCAnaG91cicpKSB7XG4gICAgICBpZiAoaSA+IDAgJiYgY29sICUgNyA9PT0gMCkge1xuICAgICAgICBjb2wgPSAwO1xuICAgICAgICByb3crKztcbiAgICAgIH1cbiAgICAgIGNhbGVuZGFyW3Jvd11bY29sXSA9IGN1ckRhdGUuY2xvbmUoKS5ob3VyKGhvdXIpLm1pbnV0ZShtaW51dGUpLnNlY29uZChzZWNvbmQpO1xuICAgICAgY3VyRGF0ZSA9IGN1ckRhdGUuaG91cigxMik7XG5cbiAgICAgIGNvbnN0IG1pbkRhdGUgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMubWluRGF0ZSgpIH0pO1xuICAgICAgY29uc3QgbWF4RGF0ZSA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5tYXhEYXRlKCkgfSk7XG4gICAgICBpZiAobWluRGF0ZSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uZm9ybWF0KCdZWVlZLU1NLUREJykgPT09IG1pbkRhdGU/LmZvcm1hdCgnWVlZWS1NTS1ERCcpICYmIGNhbGVuZGFyW3Jvd11bY29sXS5pc0JlZm9yZShtaW5EYXRlKSAmJiBzaWRlID09PSAnbGVmdCcpIHtcbiAgICAgICAgY2FsZW5kYXJbcm93XVtjb2xdID0gbWluRGF0ZT8uY2xvbmUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhEYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gbWF4RGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmlzQWZ0ZXIobWF4RGF0ZSkgJiYgc2lkZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICBjYWxlbmRhcltyb3ddW2NvbF0gPSBtYXhEYXRlPy5jbG9uZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSB7XG4gICAgICB0aGlzLmxlZnRDYWxlbmRhci51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQuY2FsZW5kYXIgPSBjYWxlbmRhcjtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ucmlnaHQpIHtcbiAgICAgIHRoaXMucmlnaHRDYWxlbmRhci51cGRhdGUoY3VycmVudCA9PiB7XG4gICAgICAgIGN1cnJlbnQuY2FsZW5kYXIgPSBjYWxlbmRhcjtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBtaW5EYXRlID0gc2lkZSA9PT0gJ2xlZnQnID8gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1pbkRhdGUoKSB9KSA6IGdldERheWpzKHsgZGF0ZTogdGhpcy5zdGFydERhdGUoKSB9KTtcbiAgICBjb25zdCBtYXhEYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1heERhdGUoKSB9KTtcblxuICAgIHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKVtzaWRlXS5zZXQoe1xuICAgICAgbW9udGg6IG1vbnRoLFxuICAgICAgeWVhcjogeWVhcixcbiAgICAgIGhvdXI6IGhvdXIsXG4gICAgICBtaW51dGU6IG1pbnV0ZSxcbiAgICAgIHNlY29uZDogc2Vjb25kLFxuICAgICAgZGF5c0luTW9udGg6IGRheXNJbk1vbnRoLFxuICAgICAgZmlyc3REYXk6IGZpcnN0RGF5LFxuICAgICAgbGFzdERheTogbGFzdERheSxcbiAgICAgIGxhc3RNb250aDogbGFzdE1vbnRoLFxuICAgICAgbGFzdFllYXI6IGxhc3RZZWFyLFxuICAgICAgZGF5c0luTGFzdE1vbnRoOiBkYXlzSW5MYXN0TW9udGgsXG4gICAgICBkYXlPZldlZWs6IGRheU9mV2VlayxcbiAgICAgIGNhbFJvd3M6IHNpZ25hbChBcnJheS5mcm9tKEFycmF5KDYpLmtleXMoKSkpLFxuICAgICAgY2FsQ29sczogc2lnbmFsKEFycmF5LmZyb20oQXJyYXkoNykua2V5cygpKSksXG4gICAgICBjbGFzc2VzOiB7fSxcbiAgICAgIG1pbkRhdGU6IG1pbkRhdGUsXG4gICAgICBtYXhEYXRlOiBtYXhEYXRlLFxuICAgICAgY2FsZW5kYXI6IGNhbGVuZGFyLFxuICAgICAgZHJvcGRvd25zOiBzaWduYWwoe30pXG4gICAgfSk7XG4gICAgaWYgKHRoaXMuc2hvd0Ryb3Bkb3duc1NlbGVjdCgpKSB7XG4gICAgICBjb25zdCBjdXJyZW50TW9udGggPSBjYWxlbmRhclsxXVsxXS5tb250aCgpO1xuICAgICAgY29uc3QgY3VycmVudFllYXIgPSBjYWxlbmRhclsxXVsxXS55ZWFyKCk7XG4gICAgICBjb25zdCBtYXhZZWFyID0gbWF4RGF0ZT8ueWVhcigpID8/IERFRkFVTFRfTUFYX1lFQVI7XG4gICAgICBjb25zdCBtaW5ZZWFyID0gbWluRGF0ZT8ueWVhcigpID8/IERFRkFVTFRfTUlOX1lFQVI7XG4gICAgICBjb25zdCBpbk1pblllYXIgPSBjdXJyZW50WWVhciA9PT0gbWluWWVhcjtcbiAgICAgIGNvbnN0IGluTWF4WWVhciA9IGN1cnJlbnRZZWFyID09PSBtYXhZZWFyO1xuICAgICAgY29uc3QgeWVhcnMgPSBbXTtcblxuICAgICAgZm9yIChsZXQgeSA9IG1pblllYXI7IHkgPD0gbWF4WWVhcjsgeSsrKSB7XG4gICAgICAgIHllYXJzLnB1c2goeSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKClbc2lkZV0oKS5kcm9wZG93bnM/LnNldCh7XG4gICAgICAgIGN1cnJlbnRNb250aDogY3VycmVudE1vbnRoLFxuICAgICAgICBjdXJyZW50WWVhcjogY3VycmVudFllYXIsXG4gICAgICAgIG1heFllYXI6IG1heFllYXIsXG4gICAgICAgIG1pblllYXI6IG1pblllYXIsXG4gICAgICAgIGluTWluWWVhcjogaW5NaW5ZZWFyLFxuICAgICAgICBpbk1heFllYXI6IGluTWF4WWVhcixcbiAgICAgICAgbW9udGhBcnJheXM6IHNpZ25hbChBcnJheS5mcm9tKEFycmF5KDEyKS5rZXlzKCkpKSxcbiAgICAgICAgeWVhckFycmF5czogc2lnbmFsKHllYXJzKVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuYnVpbGRDZWxscyhjYWxlbmRhciwgc2lkZSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQ2VsbHMoY2FsZW5kYXI6IElDYWxlbmRhciwgc2lkZTogU2lkZUVudW0pIHtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCA2OyByb3crKykge1xuICAgICAgY29uc3QgY2xhc3NsZXNzID0gdGhpcy5jYWxlbmRhclZhcmlhYmxlcygpW3NpZGVdKCk7XG5cbiAgICAgIGlmIChjbGFzc2xlc3MuY2xhc3Nlcykge1xuICAgICAgICBjbGFzc2xlc3MuY2xhc3Nlc1tyb3ddID0ge307XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCA3OyBjb2wrKykge1xuICAgICAgICBjb25zdCBjbGFzc2VzID0gW107XG5cbiAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpIH0pO1xuICAgICAgICBjb25zdCBlbmREYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLmVuZERhdGUoKSB9KTtcbiAgICAgICAgY29uc3Qgbm93SG92ZXJlZERhdGUgPSB0aGlzLm5vd0hvdmVyZWREYXRlKCk7XG5cbiAgICAgICAgaWYgKGNhbGVuZGFyW3Jvd11bY29sXS5pc1NhbWUobmV3IERhdGUoKSwgJ2RheScpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCd0b2RheScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYWxlbmRhcltyb3ddW2NvbF0uaXNvV2Vla2RheSgpID4gNSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnd2Vla2VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYWxlbmRhcltyb3ddW2NvbF0ubW9udGgoKSAhPT0gY2FsZW5kYXJbMV1bMV0ubW9udGgoKSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnb2ZmJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWluRGF0ZSgpICYmIGNhbGVuZGFyW3Jvd11bY29sXS5pc0JlZm9yZSh0aGlzLm1pbkRhdGUoKSwgJ2RheScpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdvZmYnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jYWxlbmRhclZhcmlhYmxlcygpW3NpZGVdKCkubWF4RGF0ZSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uaXNBZnRlcih0aGlzLmNhbGVuZGFyVmFyaWFibGVzKClbc2lkZV0oKS5tYXhEYXRlLCAnZGF5JykpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ29mZicsICdkaXNhYmxlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydERhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBzdGFydERhdGU/LmZvcm1hdCgnWVlZWS1NTS1ERCcpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdhY3RpdmUnLCAnc3RhcnQtZGF0ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmREYXRlICE9PSBudWxsICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gZW5kRGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ2FjdGl2ZScsICdlbmQtZGF0ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydERhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBzdGFydERhdGU/LmZvcm1hdCgnWVlZWS1NTS1ERCcpICYmICghZW5kRGF0ZSB8fCBlbmREYXRlICE9PSBudWxsICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gZW5kRGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdhY3RpdmUnLCAnZnVsbC1kYXRlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhcnREYXRlICYmIGVuZERhdGUgJiYgKChub3dIb3ZlcmVkRGF0ZSAhPT0gbnVsbCAmJiB0aGlzLnBpY2tpbmdEYXRlKCkpIHx8IGVuZERhdGUgIT09IG51bGwpICYmIChjYWxlbmRhcltyb3ddW2NvbF0gPiBzdGFydERhdGUgJiYgKGNhbGVuZGFyW3Jvd11bY29sXSA8IGVuZERhdGUgfHwgKG5vd0hvdmVyZWREYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXSA8IG5vd0hvdmVyZWREYXRlICYmIHRoaXMucGlja2luZ0RhdGUoKSkpKSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCghY2xhc3Nlcy5maW5kKGVsID0+IGVsID09PSAnb2ZmJykgPyAnaW4tcmFuZ2UnIDogJ2ZvY3VzLW9mZicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjbmFtZSA9ICcnLCBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNuYW1lICs9IGNsYXNzZXNbaV0gKyAnICc7XG5cbiAgICAgICAgICBpZiAoY2xhc3Nlc1tpXSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgICAgIGNuYW1lICs9ICdhdmFpbGFibGUnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNsYXNzbGVzcy5jbGFzc2VzKSB7XG4gICAgICAgICAgY2xhc3NsZXNzLmNsYXNzZXNbcm93XVtjb2xdID0gY25hbWUucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJUaW1lUGlja2VyKHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgbGV0IHNlbGVjdGVkOiBEYXlqcyA9IGdldERheWpzPERheWpzPigpLCBtaW5EYXRlO1xuICAgIGNvbnN0IG1heERhdGUgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMubWF4RGF0ZSgpIH0pO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5zdGFydERhdGUoKSB9KTtcbiAgICBjb25zdCBlbmREYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLmVuZERhdGUoKSB9KTtcblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0ICYmIHN0YXJ0RGF0ZSkge1xuICAgICAgc2VsZWN0ZWQgPSBzdGFydERhdGUuY2xvbmUoKTtcbiAgICAgIG1pbkRhdGUgPSB0aGlzLm1heERhdGUoKTtcbiAgICB9XG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLnJpZ2h0ICYmIGVuZERhdGUpIHtcbiAgICAgIHNlbGVjdGVkID0gZW5kRGF0ZS5jbG9uZSgpO1xuICAgICAgbWluRGF0ZSA9IHRoaXMuc3RhcnREYXRlKCk7XG4gICAgfVxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5yaWdodCAmJiAhZW5kRGF0ZSkge1xuICAgICAgaWYgKCFzdGFydERhdGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2VsZWN0ZWQgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMuZ2V0RGF0ZVdpdGhUaW1lKHN0YXJ0RGF0ZSwgU2lkZUVudW0ucmlnaHQpIH0pO1xuICAgICAgaWYgKHNlbGVjdGVkLmlzQmVmb3JlKHN0YXJ0RGF0ZSkpIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBzdGFydERhdGUuY2xvbmUoKTtcbiAgICAgIH1cbiAgICAgIG1pbkRhdGUgPSBzdGFydERhdGU7XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0ID0gMDtcbiAgICBjb25zdCBlbmQgPSAyMztcblxuICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdLnNldCh7XG4gICAgICBob3VyczogW10sXG4gICAgICBtaW51dGVzOiBbXSxcbiAgICAgIG1pbnV0ZXNMYWJlbDogW10sXG4gICAgICBzZWNvbmRzOiBbXSxcbiAgICAgIHNlY29uZHNMYWJlbDogW10sXG4gICAgICBkaXNhYmxlZEhvdXJzOiBbXSxcbiAgICAgIGRpc2FibGVkTWludXRlczogW10sXG4gICAgICBkaXNhYmxlZFNlY29uZHM6IFtdLFxuICAgICAgc2VsZWN0ZWRIb3VyOiAwLFxuICAgICAgc2VsZWN0ZWRNaW51dGU6IDAsXG4gICAgICBzZWxlY3RlZFNlY29uZDogMCxcbiAgICB9KTtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgIGNvbnN0IGlfaW5fMjQgPSBpO1xuXG4gICAgICBjb25zdCB0aW1lID0gc2VsZWN0ZWQuY2xvbmUoKS5ob3VyKGlfaW5fMjQpO1xuICAgICAgbGV0IGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAgIGlmIChtaW5EYXRlICYmIHRpbWUubWludXRlKDU5KS5pc0JlZm9yZShtaW5EYXRlKSkge1xuICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAobWF4RGF0ZSAmJiB0aW1lLm1pbnV0ZSgwKS5pc0FmdGVyKG1heERhdGUpKSB7XG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5ob3Vycz8ucHVzaChpKTtcbiAgICAgICAgaWYgKGlfaW5fMjQgPT09IHNlbGVjdGVkLmhvdXIoKSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkSG91ciA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgY3VycmVudC5kaXNhYmxlZEhvdXJzPy5wdXNoKGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2MDsgaSArPSB0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQoKSkge1xuICAgICAgY29uc3QgcGFkZGVkID0gaSA8IDEwID8gJzAnICsgaSA6IGAke2l9YDtcbiAgICAgIGNvbnN0IHRpbWUgPSBzZWxlY3RlZC5jbG9uZSgpLm1pbnV0ZShpKTtcblxuICAgICAgbGV0IGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAgIGlmIChtaW5EYXRlICYmIHRpbWUuc2Vjb25kKDU5KS5pc0JlZm9yZShtaW5EYXRlKSkge1xuICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAobWF4RGF0ZSAmJiB0aW1lLnNlY29uZCgwKS5pc0FmdGVyKG1heERhdGUpKSB7XG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgICAgY3VycmVudC5taW51dGVzPy5wdXNoKGkpO1xuICAgICAgICBjdXJyZW50Lm1pbnV0ZXNMYWJlbD8ucHVzaChwYWRkZWQpO1xuICAgICAgICBpZiAoc2VsZWN0ZWQubWludXRlKCkgPT09IGkgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgICAgY3VycmVudC5zZWxlY3RlZE1pbnV0ZSA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgICAgY3VycmVudC5kaXNhYmxlZE1pbnV0ZXM/LnB1c2goaSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdLnVwZGF0ZShjdXJyZW50ID0+IHtcbiAgICAgIGN1cnJlbnQuc2VsZWN0ZWQgPSBzZWxlY3RlZDtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVsZW1lbnQoKSB7XG4gICAgaWYgKHRoaXMuaXNTaW5nbGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTGFiZWwuc2V0KHRoaXMuc3RhcnREYXRlKCk/LmZvcm1hdCgnREQvTU0vWVlZWScpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdGFydERhdGUoKSAmJiB0aGlzLmVuZERhdGUoKSkge1xuICAgICAgLy8gaWYgd2UgdXNlIHJhbmdlcyBhbmQgc2hvdWxkIHNob3cgcmFuZ2UgbGFiZWwgb24gaW5wdXRcbiAgICAgIGlmICh0aGlzLnF1aWNrUmFuZ2VzQXJyYXkoKS5sZW5ndGggJiYgdGhpcy5zaG93UmFuZ2VMYWJlbE9uSW5wdXQoKSAmJiB0aGlzLnNlbGVjdGVkUXVpY2tSYW5nZSgpICYmIHRoaXMuZGF0ZU9wdGlvbnMoKS5jdXN0b21SYW5nZUxhYmVsICE9PSB0aGlzLnNlbGVjdGVkUXVpY2tSYW5nZSgpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMYWJlbC5zZXQodGhpcy5zZWxlY3RlZFF1aWNrUmFuZ2UoKSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RlZExhYmVsLnNldChgJHt0aGlzLnN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ0REL01NL1lZWVknKX0ke3RoaXMuZGF0ZU9wdGlvbnMoKS5zZXBhcmF0b3J9JHt0aGlzLmVuZERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJyl9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVWaWV3KCkge1xuICAgIGlmICh0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKFNpZGVFbnVtLmxlZnQpO1xuICAgICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKFNpZGVFbnVtLnJpZ2h0KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVNb250aHNJblZpZXcoKTtcbiAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRlV2l0aFRpbWUoZGF0ZTogRGF5anMsIHNpZGU6IFNpZGVFbnVtKTogRGF5anMge1xuICAgIGNvbnN0IGhvdXIgPSBwYXJzZUludChgJHt0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkSG91cn1gLCAxMCk7XG4gICAgY29uc3QgbWludXRlID0gcGFyc2VJbnQoYCR7dGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbc2lkZV0oKS5zZWxlY3RlZE1pbnV0ZX1gLCAxMCk7XG4gICAgY29uc3Qgc2Vjb25kID0gdGhpcy5oYXNTZWNvbmRQaWNrZXIoKSAmJiAhaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkU2Vjb25kKSA/IHBhcnNlSW50KGAke3RoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdKCkuc2VsZWN0ZWRTZWNvbmR9YCwgMTApIDogMDtcblxuICAgIHJldHVybiBkYXRlLmNsb25lKCkuaG91cihob3VyKS5taW51dGUobWludXRlKS5zZWNvbmQoc2Vjb25kKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNmb3JtTWluTWF4RGF0ZSh2YWx1ZTogRGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQpOiBEYXlqcyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGlzRW1wdHkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoZGF5anMuaXNEYXlqcyh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBnZXREYXlqcyh7IGRhdGU6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVkRGlzcGxheVRpbWUoc2lkZTogSVRpbWVwaWNrZXJWYXJpYWJsZXNTaWRlKSB7XG4gICAgbGV0IHN0ckhvdXJzOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgPSBzaWRlLnNlbGVjdGVkSG91cjtcbiAgICBsZXQgc3RyTWludXRlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgPSBzaWRlLnNlbGVjdGVkTWludXRlO1xuXG4gICAgaWYgKChzaWRlLnNlbGVjdGVkSG91ciB8fCAwKSA8IDEwKSB7XG4gICAgICBzdHJIb3VycyA9IGAwJHtzaWRlLnNlbGVjdGVkSG91ciA/PyAwfWA7XG4gICAgfVxuXG4gICAgaWYgKChzaWRlLnNlbGVjdGVkTWludXRlIHx8IDApIDwgMTApIHtcbiAgICAgIHN0ck1pbnV0ZSA9IGAwJHtzaWRlLnNlbGVjdGVkTWludXRlID8/IDB9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7c3RySG91cnN9OiR7c3RyTWludXRlfWA7XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVkRGlzcGxheVRpbWVJbnB1dChzaWRlOiBTaWRlRW51bSwgdGltZVR5cGU6ICdob3VyJyB8ICdtaW51dGUnKSB7XG4gICAgY29uc3QgdGltZSA9IHRpbWVUeXBlID09PSAnaG91cicgPyAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCA/IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRob3VyKCkgOiB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKSkgOiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCA/IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSA6IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0bWludXRlKCkpO1xuXG4gICAgaWYgKCF0aW1lKSB7XG4gICAgICByZXR1cm4gJzAwJztcbiAgICB9XG4gICAgaWYgKHRpbWUgPCAxMCkge1xuICAgICAgcmV0dXJuIGAwJHt0aW1lfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbWU7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICByZXR1cm47XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyIHRlc3QtY2xhc3NcIj5cbiAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXhcIj5cbiAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhclwiXG4gICAgICBbY2xhc3MucmlnaHRdPVwiaXNTaW5nbGUoKVwiXG4gICAgICBbY2xhc3MubGVmdF09XCIhaXNTaW5nbGUoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJvdW5kZWQtWzRweF0gYmctWyNmZmZmZmZdXCI+XG4gICAgICAgIEBpZiAoY2FsZW5kYXJWYXJpYWJsZXMoKTsgYXMgY2FsZW5kYXJWYXJpYWJsZXMpIHtcbiAgICAgICAgICA8dGFibGU+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj1cIjdcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtb250aFwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChzaG93RHJvcGRvd25zU2VsZWN0KCkgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmRyb3Bkb3ducz8uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiFmbGV4IG1iLVsxMHB4XSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0zLzQgZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J21yLVs4cHhdJz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93biBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKSArIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cInt3aWR0aEJ5UGFyZW50OmZhbHNlLGlnbm9yZUFycm93OnRydWUscGFkZGluZ0xlZnRJdGVtOiB0cnVlLCBjbGFzc0luY2x1ZGU6ICchdy1bMTMwcHhdJyxwb3NpdGlvbjp7IG1vZGU6J2NlbnRlcicsZGlzdGFuY2U6MH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdENsaWNrRXhhY3RseV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RLZXlzRGlzYWJsZV09XCJkaXNhYmxlTW9udGgoKS5sZWZ0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb252ZXJ0SXRlbVNlbGVjdGVkXT1cImNvbnZlcnRJdGVtTW9udGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RNb250aHNDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RLZXlTZWxlY3RlZF09XCJsaXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmbGFnTW91c2VdPVwiZmxhZ01vdXNlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2h0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRdPVwibW9udGhIdHRwRGV0YWlsQ29uZmlnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkRHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5sZWZ0ICsgJ21vbnRoJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCBzaWRlRW51bS5sZWZ0ICsgJ21vbnRoJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlKT1cImhhbmRsZXJDaGFuZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNob3dMaXN0KT1cImhhbmRsZXJTaG93TGlzdERyb3Bkb3duKCRldmVudCwgc2lkZUVudW0ubGVmdCArICdtb250aCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXItZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGFyayldXT1cImNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLmxlZnQgKyAnbW9udGgnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bIzZhNzM4M11dPVwiIWNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLmxlZnQgKyAnbW9udGgnXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktZm9udC1oNG1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFN0eWxlXT1cIidub3JtYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGVPcHRpb25zKCkubW9udGhOYW1lcyAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiYgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzW2NhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhcj8uWzFdPy5bMV0/Lm1vbnRoKCkgPz8gLTFdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgdGV4dC1bMTNweF0gdGV4dC1bIzZhNzM4M11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICdtb250aCddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnJvdGF0ZV09XCIhY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICdtb250aCddID8gJzkwZGVnJzonMjcwZGVnJ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24gW2xpc3RNYXhJdGVtU2hvd109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwiekluZGV4KCkgKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3ZlckN1c3RvbUNvbmZpZ109XCJ7d2lkdGhCeVBhcmVudDpmYWxzZSxpZ25vcmVBcnJvdzp0cnVlLHBhZGRpbmdMZWZ0SXRlbTogdHJ1ZSxjbGFzc0luY2x1ZGU6ICchdy1bMTEwcHhdJyxwb3NpdGlvbjp7bW9kZTonY2VudGVyJyxkaXN0YW5jZTowfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q2xpY2tFeGFjdGx5XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29udmVydEl0ZW1TZWxlY3RlZF09XCJjb252ZXJ0SXRlbVllYXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwibGlzdFllYXJIaWRkZW5JbnB1dFNlYXJjaCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdENvbmZpZ109XCJsaXN0TGVmdFllYXJDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RLZXlTZWxlY3RlZF09XCJsaXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZsYWdNb3VzZV09XCJmbGFnTW91c2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2h0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRdPVwibGVmdFllYXJIdHRwRGV0YWlsQ29uZmlnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlKT1cImhhbmRsZXJDaGFuZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNob3dMaXN0KT1cImhhbmRsZXJTaG93TGlzdERyb3Bkb3duKCRldmVudCwgc2lkZUVudW0ubGVmdCArICd5ZWFyJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkRHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5sZWZ0ICsgJ3llYXInKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbCgkZXZlbnQsIHNpZGVFbnVtLmxlZnQgKyAneWVhcicpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXItZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGFyayldXT1cImNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLmxlZnQgKyAneWVhciddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVsjNmE3MzgzXV09XCIhY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICd5ZWFyJ11cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDRtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRTdHlsZV09XCInbm9ybWFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8uZm9ybWF0KFwiIFlZWVlcIikgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCB0ZXh0LVsxM3B4XSB0ZXh0LVsjNmE3MzgzXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRhcmspXV09XCJjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5sZWZ0ICsgJ3llYXInXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5yb3RhdGVdPVwiIWNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLmxlZnQgKyAneWVhciddID8gJzkwZGVnJzonMjcwZGVnJ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvNCBmbGV4IGl0ZW1zLWNlbnRlciByZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLm1pbkRhdGUgfHwgKGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5taW5EYXRlPy5pc0JlZm9yZShjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5maXJzdERheSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImhhbmRsZXJDbGlja1ByZXYoc2lkZUVudW0ubGVmdClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYWJzb2x1dGUgbGVmdC0wIHRvcC1bLTNweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgcm90YXRlLVsxODBkZWddIHRleHQtWyM2YTczODNdIGN1cnNvci1wb2ludGVyIGxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXItaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCghY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLm1heERhdGUgfHwgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLm1heERhdGU/LmlzQWZ0ZXIoY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhcj8ubGFzdERheSkpICYmIGlzU2luZ2xlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiaGFuZGxlckNsaWNrTmV4dChzaWRlRW51bS5sZWZ0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBtbC1bMTJweF0gYWJzb2x1dGUgcmlnaHQtMCB0b3AtWy0zcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHRleHQtWyM2YTczODNdIGN1cnNvci1wb2ludGVyIGxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXItaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGlmICghc2hvd0Ryb3Bkb3duc1NlbGVjdCgpIHx8ICFjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuZHJvcGRvd25zKSB7XG4gICAgICAgICAgICAgICAgICAgIHt7IGRhdGVPcHRpb25zKCkubW9udGhOYW1lcyAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiYgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzW2NhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhcj8uWzFdPy5bMV0/Lm1vbnRoKCkgPz8gLTFdIH19XG4gICAgICAgICAgICAgICAgICAgIHt7IGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/LlsxXT8uWzFdPy5mb3JtYXQoXCIgWVlZWVwiKSB9fVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIDx0ciBjbGFzcz1cIndlZWstZGF5c1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGRheW9md2VlayBvZiBkYXRlT3B0aW9ucygpLmRheXNPZldlZWs7IHRyYWNrIGRheW9md2Vlaykge1xuICAgICAgICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktZm9udC1oNm0gdGV4dC1bIzZhNzM4M11cIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRTdHlsZV09XCInbm9ybWFsJ1wiPnt7IGRheW9md2VlayB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImRycC1hbmltYXRlXCI+XG4gICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsUm93cz8uKCk7IHRyYWNrIHJvdykge1xuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImgtWzMycHhdXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2xhc3NlcyAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2xhc3Nlcz8uW3Jvd10/LmNsYXNzTGlzdFwiPlxuICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxDb2xzPy4oKTsgdHJhY2sgY29sKSB7XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImxpYnMtdWktZm9udC1oNXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50b2RheV09XCJjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/LmRhdGUoKSA9PT0gdG9kYXkoKS5kYXRlKCkgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/Lm1vbnRoKCkgPT09IHRvZGF5KCkubW9udGgoKSAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8ueWVhcigpID09PSB0b2RheSgpLnllYXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jbGFzc2VzICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jbGFzc2VzPy5bcm93XT8uW2NvbF1cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyUGlja2VyRGF0ZSgkZXZlbnQsIHNpZGVFbnVtLmxlZnQsIHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlckhvdmVyRGF0ZSgkZXZlbnQsIHNpZGVFbnVtLmxlZnQsIHJvdywgY29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktZm9udC1oNXJcIj57eyBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/LmRhdGUoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgQGlmIChoYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBjb2x1bW4gaXRlbXMtY2VudGVyIHB0LVsxMnB4XVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciByb3VuZGVkLVs0cHhdIGJvcmRlclwiXG4gICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItWyNlNmU4ZWRdXT1cIiF0aW1lUGlja2VyRXJyb3IoKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItWyNmZjU0NTRdXT1cInRpbWVQaWNrZXJFcnJvcigpXCI+XG4gICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLWlucHV0XG4gICAgICAgICAgICAgICAgY2xhc3NJbmNsdWRlPVwiIXctWzMwcHhdICFwLTAgIWJvcmRlci1ub25lICF0ZXh0LWNlbnRlciBsaWJzLXVpLWZvbnQtaDRzICF0ZXh0LVsjMDcxNjMxXVwiXG4gICAgICAgICAgICAgICAgZGF0YVR5cGU9XCJpbnRcIlxuICAgICAgICAgICAgICAgIFtmb2N1c1RpbWVPdXRdPVwiMFwiXG4gICAgICAgICAgICAgICAgW2JsdXJUaW1lT3V0XT1cIjBcIlxuICAgICAgICAgICAgICAgIFthdXRvQWRkWmVyb0xlc3NUaGFuMTBJblR5cGVJbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2VtaXRFbXB0eUluRGF0YVR5cGVOdW1iZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIjIzXCJcbiAgICAgICAgICAgICAgICBbbWluVmFsdWVOdW1iZXJdPVwiMFwiXG4gICAgICAgICAgICAgICAgW21heExlbmd0aF09XCIyXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRob3VyKClcIlxuICAgICAgICAgICAgICAgIChvdXRJbnB1dEV2ZW50KT1cImhhbmRsZXJJbnB1dEV2ZW50KCRldmVudCwgJ2xlZnRob3VyJylcIlxuICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCBzaWRlRW51bS5sZWZ0ICsgJ2hvdXInKVwiXG4gICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlVGltZVZhbHVlKCRldmVudCwgJ2xlZnRob3VyJylcIlxuICAgICAgICAgICAgICAgIChvdXRGb2N1c0FuZEJsdXJFdmVudCk9XCJoYW5kbGVyRm9jdXNBbmRCbHVyVGltZSgkZXZlbnQsICdsZWZ0aG91cicpXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDNzIHRleHQtWyMzMzMzMzNdXCI+Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtaW5wdXRcbiAgICAgICAgICAgICAgICBjbGFzc0luY2x1ZGU9XCIhdy1bMzBweF0gIXAtMCAhYm9yZGVyLW5vbmUgIXRleHQtY2VudGVyICFsaWJzLXVpLWZvbnQtaDRzICF0ZXh0LVsjMDcxNjMxXVwiXG4gICAgICAgICAgICAgICAgW2F1dG9BZGRaZXJvTGVzc1RoYW4xMEluVHlwZUludF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZT1cImludFwiXG4gICAgICAgICAgICAgICAgW2ZvY3VzVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICBbYmx1clRpbWVPdXRdPVwiMFwiXG4gICAgICAgICAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIjU5XCJcbiAgICAgICAgICAgICAgICBbbWluVmFsdWVOdW1iZXJdPVwiMFwiXG4gICAgICAgICAgICAgICAgW21heExlbmd0aF09XCIyXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKVwiXG4gICAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbCgkZXZlbnQsIHNpZGVFbnVtLmxlZnQgKyAnbWludXRlJylcIlxuICAgICAgICAgICAgICAgIChvdXRJbnB1dEV2ZW50KT1cImhhbmRsZXJJbnB1dEV2ZW50KCRldmVudCwgJ2xlZnRtaW51dGUnKVwiXG4gICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlVGltZVZhbHVlKCRldmVudCwgJ2xlZnRtaW51dGUnKVwiXG4gICAgICAgICAgICAgICAgKG91dEZvY3VzQW5kQmx1ckV2ZW50KT1cImhhbmRsZXJGb2N1c0FuZEJsdXJUaW1lKCRldmVudCwgJ2xlZnRtaW51dGUnKVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKCFpc1NpbmdsZSgpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhciByaWdodCBtbC1bMjRweF1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdW5kZWQtWzRweF0gYmctWyNmZmZmZmZdXCI+XG4gICAgICAgICAgQGlmIChjYWxlbmRhclZhcmlhYmxlcygpKSB7XG4gICAgICAgICAgICA8dGFibGU+XG4gICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj1cIjdcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1vbnRoXCI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd0Ryb3Bkb3duc1NlbGVjdCgpICYmIGNhbGVuZGFyVmFyaWFibGVzKCkubGVmdCgpLmRyb3Bkb3ducz8uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIWZsZXggbWItWzEwcHhdIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMy80IGZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J21yLVs4cHhdJz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwiekluZGV4KCkgKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cInt3aWR0aEJ5UGFyZW50OmZhbHNlLGlnbm9yZUFycm93OnRydWUscGFkZGluZ0xlZnRJdGVtOiB0cnVlLGNsYXNzSW5jbHVkZTogJyF3LVsxMzBweF0nLHBvc2l0aW9uOnttb2RlOidjZW50ZXInLGRpc3RhbmNlOjB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q2xpY2tFeGFjdGx5XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0S2V5c0Rpc2FibGVdPVwiZGlzYWJsZU1vbnRoKCkucmlnaHQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb252ZXJ0SXRlbVNlbGVjdGVkXT1cImNvbnZlcnRJdGVtTW9udGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RNb250aHNDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEtleVNlbGVjdGVkXT1cImxpc3RLZXlUb1NlbGVjdGVkKCkubW9udGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZsYWdNb3VzZV09XCJmbGFnTW91c2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZF09XCJtb250aEh0dHBEZXRhaWxDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgc2lkZUVudW0ucmlnaHQgKyAnbW9udGgnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZERyb3Bkb3duKCRldmVudCwgc2lkZUVudW0ucmlnaHQgKyAnbW9udGgnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSk9XCJoYW5kbGVyQ2hhbmdlRmxhZ01vdXNlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNob3dMaXN0KT1cImhhbmRsZXJTaG93TGlzdERyb3Bkb3duKCRldmVudCwgc2lkZUVudW0ucmlnaHQgKyAnbW9udGgnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXItZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ucmlnaHQgKyAnbW9udGgnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVsjNmE3MzgzXV09XCIhY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ucmlnaHQgKyAnbW9udGgnXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg0bVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGFyayldXT1cImNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLnJpZ2h0ICsgJ21vbnRoJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRTdHlsZV09XCInbm9ybWFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGVPcHRpb25zKCkubW9udGhOYW1lcyAmJiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiYgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzWyBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXI/LlsxXT8uWzFdPy5tb250aCgpID8/IC0xXSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCB0ZXh0LVsxM3B4XSB0ZXh0LVsjNmE3MzgzXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucm90YXRlXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5yaWdodCArICdtb250aCddID8gJzkwZGVnJzonMjcwZGVnJ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duIFtsaXN0TWF4SXRlbVNob3ddPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKSArIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJDdXN0b21Db25maWddPVwie3dpZHRoQnlQYXJlbnQ6ZmFsc2UsaWdub3JlQXJyb3c6dHJ1ZSxwYWRkaW5nTGVmdEl0ZW06IHRydWUsIGNsYXNzSW5jbHVkZTogJyF3LVsxMTBweF0nLCAgcG9zaXRpb246e21vZGU6J2NlbnRlcicsIGRpc3RhbmNlOjB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdENsaWNrRXhhY3RseV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb252ZXJ0SXRlbVNlbGVjdGVkXT1cImNvbnZlcnRJdGVtWWVhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cImxpc3RZZWFySGlkZGVuSW5wdXRTZWFyY2goKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdENvbmZpZ109XCJsaXN0UmlnaHRZZWFyQ29uZmlnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RLZXlTZWxlY3RlZF09XCJsaXN0S2V5VG9TZWxlY3RlZCgpLnllYXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZsYWdNb3VzZV09XCJmbGFnTW91c2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaHR0cFJlcXVlc3REZXRhaWxJdGVtQnlJZF09XCJyaWdodFllYXJIdHRwRGV0YWlsQ29uZmlnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWREcm9wZG93bigkZXZlbnQsIHNpZGVFbnVtLnJpZ2h0ICsgJ3llYXInKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgc2lkZUVudW0ucmlnaHQgKyAneWVhcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlKT1cImhhbmRsZXJDaGFuZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2hvd0xpc3QpPVwiaGFuZGxlclNob3dMaXN0RHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICd5ZWFyJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGFyayldXT1cImNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLnJpZ2h0ICsgJ3llYXInXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVsjNmE3MzgzXV09XCIhY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ucmlnaHQgKyAneWVhciddXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDRtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250U3R5bGVdPVwiJ25vcm1hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bMV0/LlsxXT8uZm9ybWF0KFwiWVlZWVwiKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCB0ZXh0LVsxM3B4XSB0ZXh0LVsjNmE3MzgzXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGFyayldXT1cImNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLnJpZ2h0ICsgJ3llYXInXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUucm90YXRlXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5yaWdodCArICd5ZWFyJ10gPyAnOTBkZWcnOicyNzBkZWcnXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzQgZmxleCBpdGVtcy1jZW50ZXIgcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChsaXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciAmJiBsaXN0S2V5VG9TZWxlY3RlZCgpLnllYXIgJiYgISgoKGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyICArMSkgPT09IGxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikgJiYgKGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCA9PT0gMTIpICYmIGxpc3RLZXlUb1NlbGVjdGVkKCkubW9udGggPT09IDEpJiYgKGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyIDwgbGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSB8fCBsaXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGggJiYgbGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aCAmJiAoKGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCArIDEpIDwgK2xpc3RLZXlUb1NlbGVjdGVkKCkubW9udGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGFic29sdXRlIGxlZnQtMCB0b3AtWy0zcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyQ2xpY2tQcmV2KHNpZGVFbnVtLnJpZ2h0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCByb3RhdGUtWzE4MGRlZ10gdGV4dC1bIzZhNzM4M10gY3Vyc29yLXBvaW50ZXIgbGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1pY29uXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICYmIGxpc3RLZXlUb1NlbGVjdGVkKCkubW9udGggJiYgKGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCA+IGxpc3RLZXlUb1NlbGVjdGVkKCkubW9udGgpICYmIGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyICYmIGxpc3RLZXlUb1NlbGVjdGVkKCkueWVhciAmJiAobGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgPT09IGxpc3RLZXlUb1NlbGVjdGVkKCkueWVhciApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJiZy1bI2ZmZmZmZl0gdy1bMjFweF0gaC1bMjFweF0gY3Vyc29yLW5vbmUgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1bNTBweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCFjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkubWF4RGF0ZSB8fCAoY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLm1heERhdGU/LmlzQWZ0ZXIoY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyICYmIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8ubGFzdERheSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiaGFuZGxlckNsaWNrTmV4dChzaWRlRW51bS5yaWdodClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBtbC1bMTJweF0gYWJzb2x1dGUgcmlnaHQtMCB0b3AtWy0zcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCB0ZXh0LVsjNmE3MzgzXSBjdXJzb3ItcG9pbnRlciBsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyLWljb25cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmICghc2hvd0Ryb3Bkb3duc1NlbGVjdCgpIHx8ICAhY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmRyb3Bkb3ducykge1xuICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGVPcHRpb25zKCkubW9udGhOYW1lcyAmJiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiYgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzW2NhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8uWzFdPy5bMV0/Lm1vbnRoKCkgPz8gLTFdIH19XG4gICAgICAgICAgICAgICAgICAgICAge3sgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyICYmIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8uWzFdPy5bMV0/LmZvcm1hdChcIllZWVlcIikgfX1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIndlZWstZGF5c1wiPlxuICAgICAgICAgICAgICAgICAgQGZvciAoZGF5b2Z3ZWVrIG9mIGRhdGVPcHRpb25zKCkuZGF5c09mV2VlazsgdHJhY2sgZGF5b2Z3ZWVrKSB7XG4gICAgICAgICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktZm9udC1oNm0gdGV4dC1bIzZhNzM4M11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250U3R5bGVdPVwiJ25vcm1hbCdcIj57eyBkYXlvZndlZWsgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsUm93cz8uKCk7IHRyYWNrIHJvdykge1xuICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiaC1bMzJweF1cIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNsYXNzZXMgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNsYXNzZXM/Lltyb3ddPy5jbGFzc0xpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxDb2xzPy4oKTsgdHJhY2sgY29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwibGlicy11aS1mb250LWg1clwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNsYXNzZXMgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNsYXNzZXM/Lltyb3ddPy5bY29sXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudG9kYXldPVwiY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyICYmIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8uW3Jvd10/Lltjb2xdPy5kYXRlKCkgPT09IHRvZGF5KCkuZGF0ZSgpICYmIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8uW3Jvd10/Lltjb2xdPy5tb250aCgpID09PSB0b2RheSgpLm1vbnRoKCkgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyICYmY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/LnllYXIoKSA9PT0gdG9kYXkoKS55ZWFyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJQaWNrZXJEYXRlKCRldmVudCwgc2lkZUVudW0ucmlnaHQsIHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJoYW5kbGVySG92ZXJEYXRlKCRldmVudCwgc2lkZUVudW0ucmlnaHQsIHJvdywgY29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyPy5bcm93XT8uW2NvbF0/LmRhdGUoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChoYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHB0LVsxMnB4XVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHJvdW5kZWQtWzRweF0gYm9yZGVyXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyLVsjZTZlOGVkXV09XCIhdGltZVBpY2tlckVycm9yKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItWyNmZjU0NTRdXT1cInRpbWVQaWNrZXJFcnJvcigpXCI+XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtaW5wdXRcbiAgICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZT1cIiF3LVszMHB4XSAhcC0wICFib3JkZXItbm9uZSAhdGV4dC1jZW50ZXIgIWxpYnMtdWktZm9udC1oNHMgIXRleHQtWyMwNzE2MzFdXCJcbiAgICAgICAgICAgICAgICAgIGRhdGFUeXBlPVwiaW50XCJcbiAgICAgICAgICAgICAgICAgIFthdXRvQWRkWmVyb0xlc3NUaGFuMTBJblR5cGVJbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFttYXhWYWx1ZU51bWJlcl09XCIyM1wiXG4gICAgICAgICAgICAgICAgICBbbWluVmFsdWVOdW1iZXJdPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbZm9jdXNUaW1lT3V0XT1cIjBcIlxuICAgICAgICAgICAgICAgICAgW2JsdXJUaW1lT3V0XT1cIjBcIlxuICAgICAgICAgICAgICAgICAgW21heExlbmd0aF09XCIyXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKClcIlxuICAgICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlVGltZVZhbHVlKCRldmVudCwgJ3JpZ2h0aG91cicpXCJcbiAgICAgICAgICAgICAgICAgIChvdXRJbnB1dEV2ZW50KT1cImhhbmRsZXJJbnB1dEV2ZW50KCRldmVudCwncmlnaHRob3VyJylcIlxuICAgICAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbCgkZXZlbnQsICdyaWdodGhvdXInKVwiXG4gICAgICAgICAgICAgICAgICAob3V0Rm9jdXNBbmRCbHVyRXZlbnQpPVwiaGFuZGxlckZvY3VzQW5kQmx1clRpbWUoJGV2ZW50LCAncmlnaHRob3VyJylcIiAvPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGlicy11aS1mb250LWgzcyB0ZXh0LVsjMzMzMzMzXVwiPjo8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtaW5wdXRcbiAgICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZT1cIiF3LVszMHB4XSAhcC0wICFib3JkZXItbm9uZSAhdGV4dC1jZW50ZXIgbGlicy11aS1mb250LWg0cyAhdGV4dC1bIzA3MTYzMV1cIlxuICAgICAgICAgICAgICAgICAgZGF0YVR5cGU9XCJpbnRcIlxuICAgICAgICAgICAgICAgICAgW2F1dG9BZGRaZXJvTGVzc1RoYW4xMEluVHlwZUludF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFtlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIjU5XCJcbiAgICAgICAgICAgICAgICAgIFttaW5WYWx1ZU51bWJlcl09XCIwXCJcbiAgICAgICAgICAgICAgICAgIFtmb2N1c1RpbWVPdXRdPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbYmx1clRpbWVPdXRdPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIjJcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodG1pbnV0ZSgpXCJcbiAgICAgICAgICAgICAgICAgIChvdXRJbnB1dEV2ZW50KT1cImhhbmRsZXJJbnB1dEV2ZW50KCRldmVudCwncmlnaHRtaW51dGUnKVwiXG4gICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgJ3JpZ2h0bWludXRlJylcIlxuICAgICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlVGltZVZhbHVlKCRldmVudCwgJ3JpZ2h0bWludXRlJylcIlxuICAgICAgICAgICAgICAgICAgKG91dEZvY3VzQW5kQmx1ckV2ZW50KT1cImhhbmRsZXJGb2N1c0FuZEJsdXJUaW1lKCRldmVudCwgJ3JpZ2h0bWludXRlJylcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgPC9kaXY+XG4gIDxkaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsXCI+XG4gICAgICBAaWYgKCFpc1NpbmdsZSgpICYmIGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtWzhweF0gbGlicy11aS1mb250LWg3ciB0ZXh0LVsjZmY1NDU0XSBoLVsxNHB4XVwiPlxuICAgICAgICAgIEBpZiAodGltZVBpY2tlckVycm9yKCkpIHtcbiAgICAgICAgICAgIDxzcGFuPnt7ICdpMThuX2RhdGVfY29tcGFyZV9zdGFydF9lbmRfbWVzc2FnZV9lcnJvcicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICBAaWYgKCFxdWlja1Jhbmdlc0FycmF5KCkubGVuZ3RoIHx8ICFpc1NpbmdsZSgpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiIGZsZXggdy1mdWxsIHB0LVsxNnB4XSBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgQGlmICghaXNTaW5nbGUoKSkge1xuICAgICAgICAgICAgQGlmICghZW5kRGF0ZSgpKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LVsjY2RkMGQ2XSBsaWJzLXVpLWZvbnQtaDZyXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgc3RhcnREYXRlKCk/LmZvcm1hdCgnREQvTU0vWVlZWScpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIEBpZiAoaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgICAgICAgICA8c3Bhbj4ge3sgY29tcHV0ZWREaXNwbGF5VGltZUxlZnQoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJmh5cGhlbjtcbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBzdGFydERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChoYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuPiB7eyBjb21wdXRlZERpc3BsYXlUaW1lUmlnaHQoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChlbmREYXRlKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtWyNjZGQwZDZdIGxpYnMtdWktZm9udC1oNnJcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBzdGFydERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChoYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuPiB7eyBjb21wdXRlZERpc3BsYXlUaW1lTGVmdCgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAmaHlwaGVuO1xuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGVuZERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChoYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuPiB7eyBjb21wdXRlZERpc3BsYXlUaW1lUmlnaHQoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIGNsYXNzPVwibXItWzEycHhdXCJcbiAgICAgICAgICAgIGxhYmVsPVwiaTE4bl9jYW5jZWxcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvbi10aGlyZFwiXG4gICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrQ2FuY2VsKCRldmVudClcIiAvPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gbGFiZWw9XCJpMThuX3NlbGVjdFwiXG4gICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrQXBwbHkoJGV2ZW50KVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
1287
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2RhdGV0aW1lL3BpY2tlci9zcmMvY3VzdG9tLXJhbmdlcy9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvZGF0ZXRpbWUvcGlja2VyL3NyYy9jdXN0b20tcmFuZ2VzL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ2hNLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBaUQsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoSSxPQUFPLEVBQWtELG9DQUFvQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFLeEksT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sS0FBZ0IsTUFBTSxPQUFPLENBQUM7QUFDckMsT0FBTyxPQUFPLE1BQU0sc0JBQXNCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakksT0FBTyxF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QyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFaFAsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsSUFBSSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDZCxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPO0lBQ1QsQ0FBQzt3R0EzOUNVLDJEQUEyRDs0RkFBM0QsMkRBQTJELHd0RkNoQ3hFLHUvM0JBeWRBLDRvSUQzYlksZUFBZSw0RkFBRSxpQ0FBaUMsaTFEQUFFLG9DQUFvQyx3aERBQUUsc0NBQXNDOzs0RkFFL0gsMkRBQTJEO2tCQVR2RSxTQUFTOytCQUVFLDJEQUEyRCxjQUd6RCxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxlQUFlLEVBQUUsaUNBQWlDLEVBQUUsb0NBQW9DLEVBQUUsc0NBQXNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBtb2RlbCwgT25EZXN0cm95LCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQsIHZpZXdDaGlsZCwgV3JpdGFibGVTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCwgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSUZvY3VzQW5kQmx1ckV2ZW50LCBJSW5wdXRGdW5jdGlvbkNvbnRyb2xFdmVudCwgTGlic1VpQ29tcG9uZW50c0lucHV0c0lucHV0Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtaW5wdXQnO1xuaW1wb3J0IHsgSUxpc3RDb25maWdJdGVtIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IElGbGFnTW91c2UgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgSUV2ZW50IH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBJSHR0cFJlcXVlc3RDb25maWcgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1odHRwLXJlcXVlc3QnO1xuaW1wb3J0IHsgZ2V0RGF5anMsIGlzRW1wdHksIHNldCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IGRheWpzLCB7IERheWpzIH0gZnJvbSAnZGF5anMnO1xuaW1wb3J0IGlzb1dlZWsgZnJvbSAnZGF5anMvcGx1Z2luL2lzb1dlZWsnO1xuaW1wb3J0IHsgZ2V0TW9udGhzRGV0YWlsQnlJZCwgZ2V0TW9udGhzTGlzdENvbmZpZywgZ2V0WWVhcnNEZXRhaWxCeUlkLCBnZXRZZWFyc0xpc3RDb25maWcgfSBmcm9tICcuLi8uLi9kZWZpbmVzL2NhbGVuZGFyLmRlZmluZSc7XG5pbXBvcnQgeyBERUZBVUxUX01BWF9ZRUFSLCBERUZBVUxUX01JTl9ZRUFSIH0gZnJvbSAnLi4vLi4vZGVmaW5lcy9jb21tb24tZGF0ZS5kZWZpbmUnO1xuaW1wb3J0IHsgZGVmYXVsdExvY2FsZUNvbmZpZywgZ2V0RGF0ZU9wdGlvbnMgfSBmcm9tICcuLi8uLi9kZWZpbmVzL2RhdGUtb3B0aW9ucy5kZWZpbmUnO1xuaW1wb3J0IHsgSUVtaXREYXRlQ2FsZW5kYXIgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2NhbGVuZGFyLWVtaXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElDYWxlbmRhciwgSUNhbGVuZGFyVmFyaWFibGVzLCBJRGF0ZVJhbmdlLCBJU3BsaXRQaWNrZXJEYXRlLCBTaWRlRW51bSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY2FsZW5kYXItdmFyaWFibGVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJQ2FsZW5kYXJGdW5jdGlvbkNvbnRyb2xFdmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZnVuY3Rpb24tY29udHJvbC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTG9jYWxpemF0aW9uQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9waWNrZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IElDaGVja1RpbWVwaWNrZXJTZWxlY3RlZCwgSVNlbGVjdGVkT2xkLCBJVGltZXBpY2tlckl0ZW1WYWx1ZSwgSVRpbWVwaWNrZXJWYXJpYWJsZXMsIElUaW1lcGlja2VyVmFyaWFibGVzU2lkZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdGltZS12YXJpYWJsZXMuaW50ZXJmYWNlJztcbmRheWpzLmV4dGVuZChpc29XZWVrKTtcbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1kYXRldGltZS1waWNrZXItY3VzdG9tX3Jhbmdlcy1jYWxlbmRhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NhbGVuZGFyLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbVHJhbnNsYXRlTW9kdWxlLCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNJbnB1dENvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzRGF0ZXRpbWVQaWNrZXJDdXN0b21SYW5nZXNDYWxlbmRhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIFBST1BFUlRZICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzaWRlRW51bSA9IFNpZGVFbnVtO1xuICBwcm90ZWN0ZWQgY2FsZW5kYXJWYXJpYWJsZXMgPSBzaWduYWw8SUNhbGVuZGFyVmFyaWFibGVzPih7IGxlZnQ6IHNpZ25hbCh7fSksIHJpZ2h0OiBzaWduYWwoe30pIH0pO1xuICBwcm90ZWN0ZWQgdGltZXBpY2tlclZhcmlhYmxlcyA9IHNpZ25hbDxJVGltZXBpY2tlclZhcmlhYmxlcz4oeyBsZWZ0OiBzaWduYWwoeyBzZWxlY3RlZEhvdXI6IDAsIHNlbGVjdGVkTWludXRlOiAwIH0pLCByaWdodDogc2lnbmFsKHsgc2VsZWN0ZWRIb3VyOiAyMywgc2VsZWN0ZWRNaW51dGU6IDU5IH0pIH0pO1xuICBwcm90ZWN0ZWQgZGlzYWJsZU1vbnRoID0gc2lnbmFsPHsgbGVmdDogV3JpdGFibGVTaWduYWw8QXJyYXk8YW55Pj47IHJpZ2h0OiBXcml0YWJsZVNpZ25hbDxBcnJheTxhbnk+PiB9Pih7IGxlZnQ6IHNpZ25hbChbXSksIHJpZ2h0OiBzaWduYWwoW10pIH0pO1xuICBwcm90ZWN0ZWQgdG9kYXkgPSBzaWduYWw8RGF5anM+KGdldERheWpzPERheWpzPigpKTtcbiAgcHJvdGVjdGVkIGxpc3RLZXlGcm9tU2VsZWN0ZWQgPSBzaWduYWw8eyBtb250aDogYW55OyB5ZWFyOiBhbnkgfT4oeyBtb250aDogdW5kZWZpbmVkLCB5ZWFyOiB1bmRlZmluZWQgfSk7XG4gIHByb3RlY3RlZCBsaXN0S2V5VG9TZWxlY3RlZCA9IHNpZ25hbDx7IG1vbnRoOiBhbnk7IHllYXI6IGFueSB9Pih7IG1vbnRoOiB1bmRlZmluZWQsIHllYXI6IHVuZGVmaW5lZCB9KTtcbiAgcHJvdGVjdGVkIGNoZWNrU2hvd0xpc3REcm9wZG93biA9IHNpZ25hbDx7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfT4oe30pO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRRdWlja1JhbmdlID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcm90ZWN0ZWQgbGVmdENhbGVuZGFyID0gc2lnbmFsPHsgY2FsZW5kYXI/OiBJQ2FsZW5kYXI7IG1vbnRoPzogRGF5anMgfT4oe30pO1xuICBwcm90ZWN0ZWQgcmlnaHRDYWxlbmRhciA9IHNpZ25hbDx7IGNhbGVuZGFyPzogSUNhbGVuZGFyOyBtb250aD86IERheWpzIH0+KHt9KTtcblxuICBwcm90ZWN0ZWQgbGlzdE1vbnRoc0NvbmZpZyA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW0gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBtb250aEh0dHBEZXRhaWxDb25maWcgPSBzaWduYWw8SUh0dHBSZXF1ZXN0Q29uZmlnPihnZXRNb250aHNEZXRhaWxCeUlkKCkpO1xuICBwcm90ZWN0ZWQgbGlzdExlZnRZZWFyQ29uZmlnID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGxpc3RSaWdodFllYXJDb25maWcgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbGlzdFllYXJDb25maWcgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbGVmdFllYXJIdHRwRGV0YWlsQ29uZmlnID0gc2lnbmFsPElIdHRwUmVxdWVzdENvbmZpZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIHJpZ2h0WWVhckh0dHBEZXRhaWxDb25maWcgPSBzaWduYWw8SUh0dHBSZXF1ZXN0Q29uZmlnIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCB0aW1lUGlja2VyRXJyb3IgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZUxlZnQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWUoeyBzZWxlY3RlZEhvdXI6IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRob3VyKCksIHNlbGVjdGVkTWludXRlOiB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0bWludXRlKCkgfSkpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZVJpZ2h0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wdXRlZERpc3BsYXlUaW1lKHsgc2VsZWN0ZWRIb3VyOiB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKSwgc2VsZWN0ZWRNaW51dGU6IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0bWludXRlKCkgfSkpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZUxlZnRJbnB1dEhvdXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWVJbnB1dChTaWRlRW51bS5sZWZ0LCAnaG91cicpKTtcbiAgcHJvdGVjdGVkIGNvbXB1dGVkRGlzcGxheVRpbWVMZWZ0SW5wdXRNaW51dGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWVJbnB1dChTaWRlRW51bS5sZWZ0LCAnbWludXRlJykpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZVJpZ2h0SW5wdXRIb3VyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wdXRlZERpc3BsYXlUaW1lSW5wdXQoU2lkZUVudW0ucmlnaHQsICdob3VyJykpO1xuICBwcm90ZWN0ZWQgY29tcHV0ZWREaXNwbGF5VGltZVJpZ2h0SW5wdXRNaW51dGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXB1dGVkRGlzcGxheVRpbWVJbnB1dChTaWRlRW51bS5yaWdodCwgJ21pbnV0ZScpKTtcbiAgcHJvdGVjdGVkIHRpbWVwaWNrZXJWYWx1ZUl0ZW0gPSBzaWduYWw8SVRpbWVwaWNrZXJJdGVtVmFsdWU+KHsgbGVmdGhvdXI6IHNpZ25hbCgwKSwgbGVmdG1pbnV0ZTogc2lnbmFsKDApLCByaWdodGhvdXI6IHNpZ25hbCgwKSwgcmlnaHRtaW51dGU6IHNpZ25hbCgwKSB9KTtcblxuICBwcml2YXRlIGZ1bmN0aW9uQ29udHJvbHMgPSBuZXcgTWFwPHN0cmluZywgSURyb3Bkb3duRnVuY3Rpb25Db250cm9sRXZlbnQgfCBJSW5wdXRGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcHJpdmF0ZSBwaWNraW5nRGF0ZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgaXNTaG93biA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgbm93SG92ZXJlZERhdGUgPSBzaWduYWw8RGF5anMgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSB0aW1lUGlja2VySW5jcmVtZW50ID0gc2lnbmFsPG51bWJlcj4oMSk7XG4gIHByaXZhdGUgc2VsZWN0ZWRMYWJlbCA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUga2V5Q29kZUJhY2tzcGFjZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgY2hlY2tCYWNrc3BhY2VGb2N1cyA9IHNpZ25hbDxJVGltZXBpY2tlckl0ZW1WYWx1ZT4oeyBsZWZ0aG91cjogc2lnbmFsKDEpLCBsZWZ0bWludXRlOiBzaWduYWwoMSksIHJpZ2h0aG91cjogc2lnbmFsKDEpLCByaWdodG1pbnV0ZTogc2lnbmFsKDEpIH0pO1xuICBwcml2YXRlIGlzWmVybyA9IHNpZ25hbDxib29sZWFuIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIG9sZERhdGUgPSBzaWduYWw8SVNlbGVjdGVkT2xkPih7IHN0YXJ0OiBkYXlqcygwKSwgZW5kOiBkYXlqcygwKSB9KTtcbiAgcHJpdmF0ZSBpc1NlbGVjdGVkRGF0YSA9IHNpZ25hbDxJQ2hlY2tUaW1lcGlja2VyU2VsZWN0ZWQ+KHsgbGVmdG1vbnRoOiBmYWxzZSwgbGVmdHllYXI6IGZhbHNlLCByaWdodG1vbnRoOiBmYWxzZSwgcmlnaHR5ZWFyOiBmYWxzZSB9KTtcbiAgcHJpdmF0ZSBzcGxpdFBpY2tlckRhdGUgPSBzaWduYWw8SVNwbGl0UGlja2VyRGF0ZT4oeyBzdGFydDogc2lnbmFsKHsgbW9udGg6IDAsIHllYXI6IDAsIGRheTogMCwgaG91cjogMCwgbWludXRlOiAwIH0pLCBlbmQ6IHNpZ25hbCh7IG1vbnRoOiAwLCB5ZWFyOiAwLCBkYXk6IDAsIGhvdXI6IDIzLCBtaW51dGU6IDU5IH0pIH0pO1xuXG4gIC8qKiBJTlBVVCAqL1xuICByZWFkb25seSBxdWlja1Jhbmdlc0FycmF5ID0gaW5wdXQ8QXJyYXk8SURhdGVSYW5nZT4+KFtdKTtcbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXI+KDEyMDAsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IDEyMDAgfSk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZSA9IGlucHV0PHN0cmluZz4oJycpO1xuICByZWFkb25seSBpc1NpbmdsZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgc2hvd0Ryb3Bkb3duc1NlbGVjdCA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBoYXNUaW1lUGlja2VyID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IGZsYWdNb3VzZSA9IGlucHV0PElGbGFnTW91c2U+KHsgaXNNb3VzZUVudGVyOiBmYWxzZSwgaXNNb3VzZUVudGVyQ29udGVudDogZmFsc2UgfSk7XG4gIHJlYWRvbmx5IGRhdGVPcHRpb25zID0gaW5wdXQ8TG9jYWxpemF0aW9uQ29uZmlnPih7IC4uLmRlZmF1bHRMb2NhbGVDb25maWcoKSwgLi4uZ2V0RGF0ZU9wdGlvbnMoKSB9KTtcbiAgcmVhZG9ubHkgYXV0b0FwcGx5ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBoYXNTZWNvbmRQaWNrZXIgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHNob3dSYW5nZUxhYmVsT25JbnB1dCA9IGlucHV0PGJvb2xlYW4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcmVhZG9ubHkgc3RhcnREYXRlID0gbW9kZWw8RGF5anMgfCB1bmRlZmluZWQ+KGdldERheWpzPERheWpzPigpLnN0YXJ0T2YoJ2RheScpKTtcbiAgcmVhZG9ubHkgZW5kRGF0ZSA9IG1vZGVsPERheWpzIHwgdW5kZWZpbmVkPihnZXREYXlqczxEYXlqcz4oKS5lbmRPZignZGF5JykpO1xuICByZWFkb25seSBtaW5EYXRlID0gaW5wdXQ8RGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQsIERheWpzIHwgc3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQsIHsgdHJhbnNmb3JtOiB0aGlzLnRyYW5zZm9ybU1pbk1heERhdGUuYmluZCh0aGlzKSB9KTtcbiAgcmVhZG9ubHkgbWF4RGF0ZSA9IGlucHV0PERheWpzIHwgc3RyaW5nIHwgdW5kZWZpbmVkLCBEYXlqcyB8IHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7IHRyYW5zZm9ybTogdGhpcy50cmFuc2Zvcm1NaW5NYXhEYXRlLmJpbmQodGhpcykgfSk7XG4gIHJlYWRvbmx5IGxpc3RZZWFySGlkZGVuSW5wdXRTZWFyY2ggPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPih0cnVlLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyB0cnVlIH0pO1xuICAvKiogT1VUUFVUICovXG4gIHJlYWRvbmx5IG91dENoYW5nU3RhZ2VGbGFnTW91c2UgPSBvdXRwdXQ8SUZsYWdNb3VzZT4oKTtcbiAgLy8gcmVhZG9ubHkgb3V0U3RhcnREYXRlQ2hhbmdlZCA9IG91dHB1dDx7IHN0YXJ0RGF0ZTogRGF5anMgfCB1bmRlZmluZWQgfT4oKTtcbiAgLy8gcmVhZG9ubHkgb3V0RW5kRGF0ZUNoYW5nZWQgPSBvdXRwdXQ8eyBlbmREYXRlOiBEYXlqcyB8IHVuZGVmaW5lZCB9PigpO1xuICByZWFkb25seSBvdXRQaWNrZXJEYXRlID0gb3V0cHV0PElFbWl0RGF0ZUNhbGVuZGFyPigpO1xuICAvLyByZWFkb25seSBvdXRSYW5nZUNsaWNrZWQ6IEV2ZW50RW1pdHRlcjxJUmFuZ2VzQ2xpY2tlZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHJlYWRvbmx5IG91dENhbmNlbCA9IG91dHB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IG91dFVwZGF0ZVdpZHRoID0gb3V0cHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJQ2FsZW5kYXJGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcblxuICAvKiogSU5KRUNUSU9OICovXG4gIHByaXZhdGUgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuXG4gIHJlYWRvbmx5IHBpY2tlckNvbnRhaW5lciA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPigncGlja2VyQ29udGFpbmVyJyk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5saXN0TW9udGhzQ29uZmlnLnNldChnZXRNb250aHNMaXN0Q29uZmlnKHRoaXMudHJhbnNsYXRlKSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3Qgb2xkU3RhcnQgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCkgfSk7XG4gICAgICBjb25zdCBvbGRFbmQgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMuZW5kRGF0ZSgpPy5jbG9uZSgpIH0pO1xuXG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLm9sZERhdGUuc2V0KHsgc3RhcnQ6IG9sZFN0YXJ0LCBlbmQ6IG9sZEVuZCB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpPy5jbG9uZSgpIH0pO1xuICAgIGNvbnN0IGVuZERhdGUgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMuZW5kRGF0ZSgpPy5jbG9uZSgpIH0pO1xuXG4gICAgdGhpcy5zcGxpdFBpY2tlckRhdGUudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBjdXJyZW50LnN0YXJ0LnVwZGF0ZSgoc2lkZUN1cnJlbnQpID0+IHtcbiAgICAgICAgc2lkZUN1cnJlbnQuZGF5ID0gKHN0YXJ0RGF0ZSA/PyBnZXREYXlqczxEYXlqcz4oKS5zdGFydE9mKCdkYXknKSkuZGF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBzaWRlQ3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgY3VycmVudC5lbmQudXBkYXRlKChzaWRlQ3VycmVudCkgPT4ge1xuICAgICAgICBzaWRlQ3VycmVudC5kYXkgPSAoZW5kRGF0ZSA/PyBnZXREYXlqczxEYXlqcz4oKS5lbmRPZignZGF5JykpLmRhdGUoKTtcblxuICAgICAgICByZXR1cm4gc2lkZUN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgaWYgKHN0YXJ0RGF0ZSkge1xuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KCk7XG4gICAgfVxuICAgIGlmIChzdGFydERhdGUgJiYgdGhpcy5oYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgIHRoaXMuc2V0U3RhcnREYXRlKHN0YXJ0RGF0ZSk7XG4gICAgICB0aGlzLnJlbmRlclRpbWVQaWNrZXIoU2lkZUVudW0ubGVmdCk7XG4gICAgfVxuXG4gICAgaWYgKGVuZERhdGUgJiYgdGhpcy5oYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgIHRoaXMuc2V0RW5kRGF0ZShlbmREYXRlKTtcbiAgICAgIHRoaXMucmVuZGVyVGltZVBpY2tlcihTaWRlRW51bS5yaWdodCk7XG4gICAgfVxuICAgIHRoaXMuYnVpbGRDb25maWdZZWFyKFNpZGVFbnVtLmxlZnQpO1xuICAgIHRoaXMuYnVpbGRDb25maWdZZWFyKFNpZGVFbnVtLnJpZ2h0LCBzdGFydERhdGU/LnllYXIoKSk7XG4gICAgdGhpcy51cGRhdGVNb250aHNJblZpZXcoKTtcbiAgICB0aGlzLnJlbmRlckNhbGVuZGFyKFNpZGVFbnVtLmxlZnQpO1xuICAgIGlmICgoZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1heERhdGUoKSB9KT8ueWVhcigpID8/IERFRkFVTFRfTUFYX1lFQVIpIDwgKHN0YXJ0RGF0ZT8ueWVhcigpIHx8IDApKSB7XG4gICAgICB0aGlzLmhhbmRsZXJTZWxlY3RlZERyb3Bkb3duKHsga2V5OiBnZXREYXlqcyh7IGRhdGU6IHRoaXMubWF4RGF0ZSgpIH0pPy55ZWFyKCkgYXMgdW5rbm93biBhcyBzdHJpbmcgfSwgU2lkZUVudW0ubGVmdCArICd5ZWFyJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzU2luZ2xlKCkpIHtcbiAgICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoU2lkZUVudW0ucmlnaHQpO1xuICAgICAgaWYgKChnZXREYXlqcyh7IGRhdGU6IHRoaXMubWF4RGF0ZSgpIH0pPy55ZWFyKCkgPz8gREVGQVVMVF9NQVhfWUVBUikgPCAoZW5kRGF0ZT8ueWVhcigpIHx8IDApKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlclNlbGVjdGVkRHJvcGRvd24oeyBrZXk6IGdldERheWpzKHsgZGF0ZTogdGhpcy5tYXhEYXRlKCkgfSk/LnllYXIoKSBhcyB1bmtub3duIGFzIHN0cmluZyB9LCBTaWRlRW51bS5yaWdodCArICd5ZWFyJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdGhpcy5yZW5kZXJSYW5nZXMoKTtcbiAgICB0aGlzLmZvcm1hdE1vbnRoWWVhcigpO1xuICAgIHRoaXMub3V0VXBkYXRlV2lkdGguZW1pdCgxKTtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgICB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0uc2V0KHtcbiAgICAgIGxlZnRob3VyOiBzaWduYWwodGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkubGVmdCgpLnNlbGVjdGVkSG91ciksXG4gICAgICByaWdodGhvdXI6IHNpZ25hbCh0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKS5yaWdodCgpLnNlbGVjdGVkSG91ciksXG4gICAgICBsZWZ0bWludXRlOiBzaWduYWwodGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkubGVmdCgpLnNlbGVjdGVkTWludXRlKSxcbiAgICAgIHJpZ2h0bWludXRlOiBzaWduYWwodGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkucmlnaHQoKS5zZWxlY3RlZE1pbnV0ZSksXG4gICAgfSk7XG5cbiAgICAvLyB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh7IGJ1aWxkRGVmYXVsdFJhbmdlOiB0aGlzLmJ1aWxkRGVmYXVsdFJhbmdlLmJpbmQodGhpcyksIGFwcGx5VG9TZWxlY3Q6IHRoaXMuYXBwbHlUb1NlbGVjdC5iaW5kKHRoaXMpIH0pXG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQ29uZmlnWWVhcihzaWRlOiBTaWRlRW51bSwgc3RhcnRZZWFyPzogbnVtYmVyKSB7XG4gICAgY29uc3QgbWluRGF0ZSA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5taW5EYXRlKCkgfSk7XG4gICAgY29uc3QgbWF4RGF0ZSA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5tYXhEYXRlKCkgfSk7XG5cbiAgICBjb25zdCBsaXN0TGVmdFllYXIgPSBbXTtcbiAgICBjb25zdCBsaXN0UmlnaHRZZWFyID0gW107XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCkge1xuICAgICAgY29uc3Qgc3RhcnQgPSBtYXhEYXRlPy55ZWFyKCkgPz8gREVGQVVMVF9NQVhfWUVBUjtcbiAgICAgIGNvbnN0IGVuZCA9IG1pbkRhdGU/LnllYXIoKSA/PyBERUZBVUxUX01JTl9ZRUFSO1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpID49IGVuZDsgaS0tKSB7XG4gICAgICAgIGxpc3RMZWZ0WWVhci5wdXNoKHtcbiAgICAgICAgICBpZDogaSxcbiAgICAgICAgICBsYWJlbDogYCR7aX1gLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGlzdExlZnRZZWFyQ29uZmlnLnNldChnZXRZZWFyc0xpc3RDb25maWcobGlzdExlZnRZZWFyKSk7XG4gICAgICB0aGlzLmxlZnRZZWFySHR0cERldGFpbENvbmZpZy5zZXQoZ2V0WWVhcnNEZXRhaWxCeUlkKGxpc3RMZWZ0WWVhcikpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSBtYXhEYXRlPy55ZWFyKCkgPz8gREVGQVVMVF9NQVhfWUVBUjtcbiAgICBjb25zdCBlbmQgPSBzdGFydFllYXIgPz8gbWluRGF0ZT8ueWVhcigpID8/IGdldERheWpzPERheWpzPigpLnllYXIoKTtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPj0gZW5kOyBpLS0pIHtcbiAgICAgIGxpc3RSaWdodFllYXIucHVzaCh7XG4gICAgICAgIGlkOiBpLFxuICAgICAgICBsYWJlbDogYCR7aX1gLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5saXN0UmlnaHRZZWFyQ29uZmlnLnNldChnZXRZZWFyc0xpc3RDb25maWcobGlzdFJpZ2h0WWVhcikpO1xuICAgIHRoaXMucmlnaHRZZWFySHR0cERldGFpbENvbmZpZy5zZXQoZ2V0WWVhcnNEZXRhaWxCeUlkKGxpc3RSaWdodFllYXIpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2hhbmdlRmxhZ01vdXNlKGZsYWdNb3VzZTogSUZsYWdNb3VzZSkge1xuICAgIHRoaXMub3V0Q2hhbmdTdGFnZUZsYWdNb3VzZS5lbWl0KGZsYWdNb3VzZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0YXJ0RW5kRGF0ZShkYXRlOiBEYXlqcykge1xuICAgIGRhdGUgPSBnZXREYXlqcyh7IGRhdGUgfSk7XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSgpIHx8IGRhdGUuaXNCZWZvcmUoZ2V0RGF5anMoeyBkYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpIH0pLCAnZGF5JykpIHtcbiAgICAgIGlmICh0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICBkYXRlID0gdGhpcy5nZXREYXRlV2l0aFRpbWUoZGF0ZSwgU2lkZUVudW0ubGVmdCk7XG4gICAgICB9XG4gICAgICB0aGlzLmVuZERhdGUuc2V0KHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLnNldFN0YXJ0RGF0ZShnZXREYXlqcyh7IGRhdGU6IGRhdGUuY2xvbmUoKSB9KSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmVuZERhdGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpICYmIGRhdGUuaXNCZWZvcmUoZ2V0RGF5anMoeyBkYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpIH0pKSkge1xuICAgICAgdGhpcy5zZXRFbmREYXRlKGdldERheWpzKHsgZGF0ZTogdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKSB9KSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICBkYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLmdldERhdGVXaXRoVGltZShkYXRlLCBTaWRlRW51bS5yaWdodCkgfSk7XG4gICAgfVxuICAgIGlmICghZGF0ZS5pc0JlZm9yZShnZXREYXlqcyh7IGRhdGU6IHRoaXMuc3RhcnREYXRlKCkgfSksICdkYXknKSkge1xuICAgICAgdGhpcy5zZXRFbmREYXRlKGdldERheWpzKHsgZGF0ZTogZGF0ZS5jbG9uZSgpIH0pKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXV0b0FwcGx5KCkpIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlU2VsZWN0ZWRMYWJlbCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlU2VsZWN0ZWRMYWJlbCgpIHtcbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0TW9udGhZZWFyKCkge1xuICAgIGNvbnN0IG1vbnRoID0gKHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKS5sZWZ0KCkuZHJvcGRvd25zPy4oKT8uY3VycmVudE1vbnRoID8/IDApICsgMTtcbiAgICB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBjdXJyZW50Lm1vbnRoID0gbW9udGg7XG4gICAgICBjdXJyZW50LnllYXIgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkubGVmdCgpLmRyb3Bkb3ducz8uKCk/LmN1cnJlbnRZZWFyO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICBpZiAodGhpcy5pc1NpbmdsZSgpKSB7XG4gICAgICB0aGlzLmlzU2VsZWN0ZWREYXRhLnNldCh7IGxlZnRtb250aDogdHJ1ZSwgbGVmdHllYXI6IHRydWUsIHJpZ2h0bW9udGg6IHRydWUsIHJpZ2h0eWVhcjogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmlnaHRNb250aCA9ICh0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5kcm9wZG93bnM/LigpPy5jdXJyZW50TW9udGggPz8gMCkgKyAxO1xuICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBjdXJyZW50Lm1vbnRoID0gcmlnaHRNb250aDtcbiAgICAgIGN1cnJlbnQueWVhciA9IHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmRyb3Bkb3ducz8uKCk/LmN1cnJlbnRZZWFyO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICB0aGlzLmlzU2VsZWN0ZWREYXRhLnNldCh7IGxlZnRtb250aDogdHJ1ZSwgbGVmdHllYXI6IHRydWUsIHJpZ2h0bW9udGg6IHRydWUsIHJpZ2h0eWVhcjogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RhcnREYXRlKHN0YXJ0RGF0ZTogRGF5anMgfCBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXRoaXMuc3RhcnREYXRlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzdGFydERhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZ2V0RGF5anM8RGF5anM+KHsgZGF0ZTogZGF5anMoc3RhcnREYXRlLCB0aGlzLmRhdGVPcHRpb25zKCkuZm9ybWF0KSwgcmV0dXJuRGF5anNJZkNvbmZpZ0RhdGVOb3RFeGlzdDogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3RhcnREYXRlID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5waWNraW5nRGF0ZS5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZ2V0RGF5anM8RGF5anM+KHsgZGF0ZTogc3RhcnREYXRlLCByZXR1cm5EYXlqc0lmQ29uZmlnRGF0ZU5vdEV4aXN0OiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5waWNraW5nRGF0ZS5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZ2V0RGF5anMoeyBkYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpPy5zdGFydE9mKCdkYXknKSB9KSk7XG4gICAgfVxuICAgIHRoaXMuc2V0U3RhcnREYXRlSW5UaW1lUGlja2VyKCk7XG5cbiAgICBpZiAodGhpcy5taW5EYXRlKCkgJiYgdGhpcy5zdGFydERhdGUoKT8uaXNCZWZvcmUodGhpcy5taW5EYXRlKCkpKSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZ2V0RGF5anMoeyBkYXRlOiB0aGlzLm1pbkRhdGUoKSB9KT8uY2xvbmUoKSk7XG5cbiAgICAgIHRoaXMuc2V0U3RhcnREYXRlSW5UaW1lUGlja2VyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1heERhdGUoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpPy5pc0FmdGVyKHRoaXMubWF4RGF0ZSgpKSkge1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KGdldERheWpzKHsgZGF0ZTogdGhpcy5tYXhEYXRlKCkgfSk/LmNsb25lKCkpO1xuICAgICAgdGhpcy5zZXRTdGFydERhdGVJblRpbWVQaWNrZXIoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzU2hvd24oKSkge1xuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KCk7XG4gICAgfVxuICAgIC8vIHRoaXMub3V0U3RhcnREYXRlQ2hhbmdlZC5lbWl0KHsgc3RhcnREYXRlOiB0aGlzLnN0YXJ0RGF0ZSgpIH0pO1xuICAgIHRoaXMudXBkYXRlTW9udGhzSW5WaWV3KCk7XG4gIH1cblxuICBwcml2YXRlIHNldFN0YXJ0RGF0ZUluVGltZVBpY2tlcigpIHtcbiAgICBpZiAoIXRoaXMuaGFzVGltZVBpY2tlcigpIHx8ICF0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnREYXRlLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQubWludXRlKE1hdGgucm91bmQoY3VycmVudC5taW51dGUoKSAvIHRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKSAqIHRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRFbmREYXRlKGVuZERhdGU6IERheWpzIHwgc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBlbmREYXRlID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5lbmREYXRlLnNldChnZXREYXlqczxEYXlqcz4oeyBkYXRlOiBkYXlqcyhlbmREYXRlLCB0aGlzLmRhdGVPcHRpb25zKCkuZm9ybWF0KSwgcmV0dXJuRGF5anNJZkNvbmZpZ0RhdGVOb3RFeGlzdDogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5kRGF0ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMucGlja2luZ0RhdGUuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuZW5kRGF0ZS5zZXQoZ2V0RGF5anM8RGF5anM+KHsgZGF0ZTogZGF5anMoZW5kRGF0ZSksIHJldHVybkRheWpzSWZDb25maWdEYXRlTm90RXhpc3Q6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZW5kRGF0ZSgpIHx8ICF0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVNb250aHNJblZpZXcoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5waWNraW5nRGF0ZS5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5lbmREYXRlLnNldCh0aGlzLmVuZERhdGUoKT8uYWRkKDEsICdkJykuc3RhcnRPZignZGF5Jykuc3VidHJhY3QoMSwgJ3NlY29uZCcpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzVGltZVBpY2tlcigpICYmIHRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKSB7XG4gICAgICB0aGlzLmVuZERhdGUudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGlmICghY3VycmVudCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50Lm1pbnV0ZShNYXRoLnJvdW5kKGN1cnJlbnQubWludXRlKCkgLyB0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQoKSkgKiB0aGlzLnRpbWVQaWNrZXJJbmNyZW1lbnQoKSk7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5kRGF0ZSgpPy5pc0JlZm9yZSh0aGlzLnN0YXJ0RGF0ZSgpKSkge1xuICAgICAgdGhpcy5lbmREYXRlLnNldCh0aGlzLnN0YXJ0RGF0ZSgpPy5jbG9uZSgpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4RGF0ZSgpICYmIHRoaXMuZW5kRGF0ZSgpPy5pc0FmdGVyKHRoaXMubWF4RGF0ZSgpKSkge1xuICAgICAgdGhpcy5lbmREYXRlLnNldChnZXREYXlqcyh7IGRhdGU6IHRoaXMubWF4RGF0ZSgpIH0pPy5jbG9uZSgpKTtcbiAgICB9XG4gICAgLy8gdGhpcy5vdXRFbmREYXRlQ2hhbmdlZC5lbWl0KHsgZW5kRGF0ZTogdGhpcy5lbmREYXRlKCkgfSk7XG4gICAgdGhpcy51cGRhdGVNb250aHNJblZpZXcoKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFuZGxlckhvdmVyRGF0ZShldmVudDogRXZlbnQsIHNpZGU6IFNpZGVFbnVtLCByb3c6IG51bWJlciwgY29sOiBudW1iZXIpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IGxlZnRDYWxEYXRlID0gdGhpcy5jYWxlbmRhclZhcmlhYmxlcygpLmxlZnQoKS5jYWxlbmRhcj8uW3Jvd11bY29sXTtcbiAgICBjb25zdCByaWdodENhbERhdGUgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8uW3Jvd11bY29sXTtcblxuICAgIGlmICghdGhpcy5waWNraW5nRGF0ZSB8fCAhcmlnaHRDYWxEYXRlIHx8ICFsZWZ0Q2FsRGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm5vd0hvdmVyZWREYXRlLnNldChzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gbGVmdENhbERhdGUgOiByaWdodENhbERhdGUpO1xuICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoU2lkZUVudW0ubGVmdCk7XG4gICAgdGhpcy5yZW5kZXJDYWxlbmRhcihTaWRlRW51bS5yaWdodCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXREaXNhYmxlKHR5cGU6ICdsZWZ0JyB8ICdyaWdodCcpIHtcbiAgICBjb25zdCBtaW5EYXRlID0gZ2V0RGF5anM8RGF5anM+KHsgZGF0ZTogdGhpcy5taW5EYXRlKCkgfSk7XG4gICAgY29uc3QgbWF4RGF0ZSA9IGdldERheWpzPERheWpzPih7IGRhdGU6IHRoaXMubWF4RGF0ZSgpIH0pO1xuXG4gICAgaWYgKHR5cGUgPT09ICdsZWZ0Jykge1xuICAgICAgdGhpcy5kaXNhYmxlTW9udGgoKS5sZWZ0LnNldChbXSk7XG5cbiAgICAgIGlmIChtaW5EYXRlPy55ZWFyKCkgPT09IHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBtaW5EYXRlPy5tb250aCgpICsgMTsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlTW9udGgoKS5sZWZ0LnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5wdXNoKGkpO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1heERhdGU/LnllYXIoKSA9PT0gdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhcikge1xuICAgICAgICBmb3IgKGxldCBpID0gbWF4RGF0ZT8ubW9udGgoKSArIDI7IGkgPCAxMzsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlTW9udGgoKS5sZWZ0LnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5wdXNoKGkpO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXNhYmxlTW9udGgoKS5yaWdodC5zZXQoW10pO1xuICAgIGlmIChtaW5EYXRlPy55ZWFyKCkgPT09IHRoaXMubGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG1pbkRhdGU/Lm1vbnRoKCkgKyAxOyBpKyspIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlTW9udGgoKS5yaWdodC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50LnB1c2goaSk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtYXhEYXRlPy55ZWFyKCkgPT09IHRoaXMubGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyKSB7XG4gICAgICBmb3IgKGxldCBpID0gbWF4RGF0ZT8ubW9udGgoKSArIDI7IGkgPCAxMzsgaSsrKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZU1vbnRoKCkucmlnaHQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudC5wdXNoKGkpO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIpID09PSBOdW1iZXIodGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLnllYXIpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpOyBpKyspIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlTW9udGgoKS5yaWdodC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50LnB1c2goaSk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja1ByZXYoc2lkZTogU2lkZUVudW0pIHtcbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCAmJiB0aGlzLmxlZnRDYWxlbmRhcigpLm1vbnRoKSB7XG4gICAgICB0aGlzLmxlZnRDYWxlbmRhci51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/LnN1YnRyYWN0KDEsICdtb250aCcpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSAodGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8ubW9udGgoKSA/PyAwKSArIDE7XG4gICAgICAgIGN1cnJlbnQueWVhciA9IHRoaXMubGVmdENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG4gICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/LnN1YnRyYWN0KDEsICdtb250aCcpO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudC5tb250aCA9ICh0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aD8ubW9udGgoKSA/PyAwKSArIDE7XG4gICAgICBjdXJyZW50LnllYXIgPSB0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aD8ueWVhcigpO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICB0aGlzLmdldERpc2FibGUoJ3JpZ2h0Jyk7XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tOZXh0KHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLmxlZnQpIHtcbiAgICAgIHRoaXMubGVmdENhbGVuZGFyLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8uYWRkKDEsICdtb250aCcpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSAodGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8ubW9udGgoKSA/PyAwKSArIDE7XG4gICAgICAgIGN1cnJlbnQueWVhciA9IHRoaXMubGVmdENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGggPT09IHRoaXMubGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aCAmJiB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyID09PSB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikge1xuICAgICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/LmFkZCgxLCAnbW9udGgnKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50Lm1vbnRoID0gKHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoPy5tb250aCgpID8/IDApICsgMTtcbiAgICAgICAgICBjdXJyZW50LnllYXIgPSB0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aD8ueWVhcigpO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5nZXREaXNhYmxlKCdyaWdodCcpO1xuXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgICB9XG4gICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudC5tb250aCA9IGN1cnJlbnQubW9udGg/LmFkZCgxLCAnbW9udGgnKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgIGN1cnJlbnQubW9udGggPSAodGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/Lm1vbnRoKCkgPz8gMCkgKyAxO1xuICAgICAgY3VycmVudC55ZWFyID0gdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/LnllYXIoKTtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFuZGxlclBpY2tlckRhdGUoZXZlbnQ6IGFueSwgc2lkZTogU2lkZUVudW0sIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcikge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKGV2ZW50LnRhcmdldD8udGFnTmFtZSA9PT0gJ1REJykge1xuICAgICAgaWYgKGV2ZW50LnRhcmdldC5jbGFzc0xpc3QgJiYgIWV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2F2YWlsYWJsZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGV2ZW50LnRhcmdldC50YWdOYW1lID09PSAnU1BBTicpIHtcbiAgICAgIGlmIChldmVudC50YXJnZXQucGFyZW50RWxlbWVudCAmJiBldmVudC50YXJnZXQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QgJiYgIWV2ZW50LnRhcmdldC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnYXZhaWxhYmxlJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuZGF0ZU9wdGlvbnMoKS5jdXN0b21SYW5nZUxhYmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnF1aWNrUmFuZ2VzQXJyYXkoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRRdWlja1JhbmdlLnNldCh0aGlzLmRhdGVPcHRpb25zKCkuY3VzdG9tUmFuZ2VMYWJlbCk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGUgPSBzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gdGhpcy5sZWZ0Q2FsZW5kYXIoKS5jYWxlbmRhcj8uW3Jvd11bY29sXSA6IHRoaXMucmlnaHRDYWxlbmRhcigpLmNhbGVuZGFyPy5bcm93XVtjb2xdO1xuXG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3BsaXRQaWNrZXJEYXRlLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgY3VycmVudFtzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gJ3N0YXJ0JyA6ICdlbmQnXS51cGRhdGUoKHNpZGVDdXJyZW50KSA9PiB7XG4gICAgICAgIHNpZGVDdXJyZW50LmRheSA9IGRhdGUuZGF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBzaWRlQ3VycmVudDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZVN0YXJ0RW5kRGF0ZShkYXRlKTtcblxuICAgIGlmICh0aGlzLmlzU2luZ2xlKCkgJiYgdGhpcy5zdGFydERhdGUoKSkge1xuICAgICAgdGhpcy5zZXRFbmREYXRlKHRoaXMuc3RhcnREYXRlKCkpO1xuICAgICAgdGhpcy51cGRhdGVFbGVtZW50KCk7XG5cbiAgICAgIGlmICh0aGlzLmF1dG9BcHBseSgpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlckNsaWNrQXBwbHkoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICBpZiAodGhpcy5hdXRvQXBwbHkoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpICYmIHRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICB0aGlzLmhhbmRsZXJDbGlja0FwcGx5KCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDbGlja0FwcGx5KGV2ZW50PzogRXZlbnQpIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgLy8gdGhpcy52YWxpZGF0ZSgpO1xuICAgIC8vIGlmICghdGhpcy52YWxpZGF0ZSgpKSB7XG4gICAgLy8gICByZXR1cm47XG4gICAgLy8gfVxuICAgIGlmICh0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgdGhpcy5zZXRUaW1lSW5wdXQoU2lkZUVudW0ubGVmdCk7XG4gICAgICB0aGlzLnNldFRpbWVJbnB1dChTaWRlRW51bS5yaWdodCk7XG4gICAgfVxuICAgIHRoaXMuY2FsY3VsYXRlU2VsZWN0ZWRMYWJlbCgpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRMYWJlbCgpKSB7XG4gICAgICB0aGlzLm91dFBpY2tlckRhdGUuZW1pdCh7IGRpc3BsYXlMYWJlbDogdGhpcy5zZWxlY3RlZExhYmVsKCksIHN0YXJ0RGF0ZTogdGhpcy5zdGFydERhdGUoKSwgZW5kRGF0ZTogdGhpcy5lbmREYXRlKCksIGRldGFpbERhdGVQaWNrZXI6IHRoaXMuc3BsaXRQaWNrZXJEYXRlKCkgfSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tDYW5jZWwoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zdGFydERhdGUuc2V0KGRheWpzKDApKTtcbiAgICB0aGlzLmVuZERhdGUuc2V0KGRheWpzKDApKTtcbiAgICB0aGlzLm91dENhbmNlbC5lbWl0KCcnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRnVuY3Rpb25Db250cm9sKGV2ZW50OiBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCB8IElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50LCB0eXBlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZ1bmN0aW9uQ29udHJvbHMuc2V0KHR5cGUsIGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2VsZWN0ZWREcm9wZG93bihldmVudDogSUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQsIHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMub3V0Q2hhbmdTdGFnZUZsYWdNb3VzZS5lbWl0KHtcbiAgICAgIGlzTW91c2VFbnRlcjogZmFsc2UsXG4gICAgICBpc01vdXNlRW50ZXJDb250ZW50OiBmYWxzZSxcbiAgICAgIGlzQ29udGFpbmVySGFzU2Nyb2xsOiBmYWxzZSxcbiAgICB9KTtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBgJHtTaWRlRW51bS5sZWZ0fW1vbnRoYDpcbiAgICAgIGNhc2UgYCR7U2lkZUVudW0ucmlnaHR9bW9udGhgOlxuICAgICAgICB0aGlzLnVwZGF0ZU1vbnRoU2VsZWN0KGV2ZW50LCB0eXBlKTtcblxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBgJHtTaWRlRW51bS5sZWZ0fXllYXJgOlxuICAgICAgY2FzZSBgJHtTaWRlRW51bS5yaWdodH15ZWFyYDpcbiAgICAgICAgdGhpcy51cGRhdGVZZWFyU2VsZWN0KGV2ZW50LCB0eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuc3BsaXRQaWNrZXJEYXRlLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgaWYgKHR5cGUgPT09IGAke1NpZGVFbnVtLmxlZnR9bW9udGhgIHx8IHR5cGUgPT09IGAke1NpZGVFbnVtLmxlZnR9eWVhcmApIHtcbiAgICAgICAgY3VycmVudC5zdGFydC51cGRhdGUoKHN0YXJ0KSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGUgPT09IGAke1NpZGVFbnVtLmxlZnR9bW9udGhgKSB7XG4gICAgICAgICAgICBzdGFydC5tb250aCA9IGV2ZW50LmtleSBhcyBudW1iZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlID09PSBgJHtTaWRlRW51bS5sZWZ0fXllYXJgKSB7XG4gICAgICAgICAgICBzdGFydC55ZWFyID0gZXZlbnQua2V5IGFzIG51bWJlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3RhcnQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50LmVuZC51cGRhdGUoKGVuZCkgPT4ge1xuICAgICAgICBpZiAodHlwZSA9PT0gYCR7U2lkZUVudW0ucmlnaHR9bW9udGhgKSB7XG4gICAgICAgICAgZW5kLm1vbnRoID0gZXZlbnQua2V5IGFzIG51bWJlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gYCR7U2lkZUVudW0ucmlnaHR9eWVhcmApIHtcbiAgICAgICAgICBlbmQueWVhciA9IGV2ZW50LmtleSBhcyBudW1iZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW5kO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNb250aFNlbGVjdChldmVudDogSUVtaXRTZWxlY3RLZXksIHR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IHNpZGUgPSB0eXBlLmluY2x1ZGVzKFNpZGVFbnVtLmxlZnQpID8gU2lkZUVudW0ubGVmdCA6IFNpZGVFbnVtLnJpZ2h0O1xuICAgIGNvbnN0IHllYXIgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKClbc2lkZV0oKS5kcm9wZG93bnM/LigpPy5jdXJyZW50WWVhciB8fCBnZXREYXlqczxEYXlqcz4oKS55ZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSBOdW1iZXIoZXZlbnQua2V5KSAtIDE7XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCkge1xuICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZERhdGEoKS5sZWZ0bW9udGgpIHtcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkRGF0YS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50LmxlZnRtb250aCA9IGZhbHNlO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdldERpc2FibGUoJ3JpZ2h0Jyk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gZXZlbnQua2V5O1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgICBpZiAoTnVtYmVyKGV2ZW50LmtleSkgPj0gTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSAmJiBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhcikgPT09IE51bWJlcih0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikpIHtcbiAgICAgICAgaWYgKE51bWJlcihldmVudC5rZXkpIDw9IDExKSB7XG4gICAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSBOdW1iZXIoZXZlbnQua2V5KSArIDE7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChOdW1iZXIoZXZlbnQua2V5KSA9PT0gMTIpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5tb250aCA9IDE7XG4gICAgICAgICAgICBjdXJyZW50LnllYXIgKz0gMTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ucmlnaHQpIHtcbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0ZWREYXRhKCkucmlnaHRtb250aCkge1xuICAgICAgICB0aGlzLmlzU2VsZWN0ZWREYXRhLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQucmlnaHRtb250aCA9IGZhbHNlO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdldERpc2FibGUoJ3JpZ2h0Jyk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5tb250aCA9IGV2ZW50LmtleTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAodGhpcy5mdW5jdGlvbkNvbnRyb2xzLmdldCh0eXBlKSBhcyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCk/LnJlbW92ZUxpc3QoKTtcblxuICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcbiAgICB0aGlzLm1vbnRoT3JZZWFyQ2hhbmdlZChtb250aCwgeWVhciwgc2lkZSk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVZZWFyU2VsZWN0KGV2ZW50OiBJRW1pdFNlbGVjdEtleSwgdHlwZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2lkZSA9IHR5cGUuaW5jbHVkZXMoU2lkZUVudW0ubGVmdCkgPyBTaWRlRW51bS5sZWZ0IDogU2lkZUVudW0ucmlnaHQ7XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCkge1xuICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZERhdGEoKT8ubGVmdHllYXIpIHtcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkRGF0YS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50LmxlZnR5ZWFyID0gZmFsc2U7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZ2V0RGlzYWJsZSgnbGVmdCcpO1xuICAgICAgICAvLyB0aGlzLlNldExpc3RZZWFyUmlnaHQodGhpcy5saXN0Vmlld0tleVNlbGVjdGVkWWVhciBhcyBudW1iZXIpO1xuICAgICAgICAodGhpcy5mdW5jdGlvbkNvbnRyb2xzLmdldCh0eXBlKSBhcyBJRHJvcGRvd25GdW5jdGlvbkNvbnRyb2xFdmVudCk/LnJlbW92ZUxpc3QoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQueWVhciA9IGV2ZW50LmtleTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyICYmIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQoKS55ZWFyICYmIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgPj0gdGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLnllYXIpIHtcbiAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50LnllYXIgPSBldmVudC5rZXk7XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGggJiYgTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSA8PSAxMSkge1xuICAgICAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjdXJyZW50Lm1vbnRoID0gTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSArIDE7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGggJiYgdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGggPT09IDEyKSB7XG4gICAgICAgICAgdGhpcy5saXN0S2V5VG9TZWxlY3RlZC51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubW9udGggPSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpO1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0RGlzYWJsZSgnbGVmdCcpO1xuICAgICAgdGhpcy5idWlsZENvbmZpZ1llYXIoU2lkZUVudW0ucmlnaHQsIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgYXMgbnVtYmVyKTtcbiAgICAgICh0aGlzLmZ1bmN0aW9uQ29udHJvbHMuZ2V0KHR5cGUpIGFzIElEcm9wZG93bkZ1bmN0aW9uQ29udHJvbEV2ZW50KT8ucmVtb3ZlTGlzdCgpO1xuICAgIH1cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ucmlnaHQpIHtcbiAgICAgIGlmICh0aGlzLmlzU2VsZWN0ZWREYXRhKCkucmlnaHR5ZWFyKSB7XG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZERhdGEudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudC5yaWdodHllYXIgPSBmYWxzZTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nZXREaXNhYmxlKCdyaWdodCcpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQueWVhciA9IGV2ZW50LmtleTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgJiYgdGhpcy5saXN0S2V5VG9TZWxlY3RlZCgpLnllYXIgJiYgdGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciA+PSB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikge1xuICAgICAgICBpZiAodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGggJiYgTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSA8PSAxMSkge1xuICAgICAgICAgIHRoaXMubGlzdEtleVRvU2VsZWN0ZWQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjdXJyZW50Lm1vbnRoID0gTnVtYmVyKHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSArIDE7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCAmJiB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCA9PT0gMTIpIHtcbiAgICAgICAgICB0aGlzLmxpc3RLZXlUb1NlbGVjdGVkLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5tb250aCA9IE51bWJlcih0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZ2V0RGlzYWJsZSgncmlnaHQnKTtcbiAgICBsZXQgbW9udGggPSBnZXREYXlqczxEYXlqcz4oKS5tb250aCgpO1xuXG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLnJpZ2h0ICYmIHRoaXMubGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoKSB7XG4gICAgICBtb250aCA9IE51bWJlcih0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCkgLSAxO1xuICAgIH1cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCAmJiB0aGlzLmxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCkge1xuICAgICAgbW9udGggPSBOdW1iZXIodGhpcy5saXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGgpIC0gMTtcbiAgICB9XG4gICAgY29uc3QgeWVhciA9IE51bWJlcihldmVudC5rZXkpO1xuXG4gICAgdGhpcy5tb250aE9yWWVhckNoYW5nZWQobW9udGgsIHllYXIsIHNpZGUpO1xuICB9XG4gIHByaXZhdGUgbW9udGhPclllYXJDaGFuZ2VkKG1vbnRoOiBudW1iZXIsIHllYXI6IG51bWJlciwgc2lkZTogU2lkZUVudW0pIHtcbiAgICBjb25zdCBpc0xlZnQgPSBzaWRlID09PSBTaWRlRW51bS5sZWZ0O1xuICAgIGNvbnN0IG1pbkRhdGUgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMubWluRGF0ZSgpIH0pO1xuICAgIGNvbnN0IG1heERhdGUgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMubWF4RGF0ZSgpIH0pO1xuXG4gICAgaWYgKG1pbkRhdGUgJiYgKHllYXIgPCBtaW5EYXRlPy55ZWFyKCkgfHwgKHllYXIgPT09IG1pbkRhdGU/LnllYXIoKSAmJiBtb250aCA8IG1pbkRhdGU/Lm1vbnRoKCkpKSkge1xuICAgICAgbW9udGggPSBtaW5EYXRlPy5tb250aCgpO1xuICAgICAgeWVhciA9IG1pbkRhdGU/LnllYXIoKTtcbiAgICB9XG5cbiAgICBpZiAobWF4RGF0ZSAmJiAoeWVhciA+IG1heERhdGU/LnllYXIoKSB8fCAoeWVhciA9PT0gbWF4RGF0ZT8ueWVhcigpICYmIG1vbnRoID4gbWF4RGF0ZT8ubW9udGgoKSkpKSB7XG4gICAgICBtb250aCA9IG1heERhdGU/Lm1vbnRoKCk7XG4gICAgICB5ZWFyID0gbWF4RGF0ZT8ueWVhcigpO1xuICAgIH1cblxuICAgIGNvbnN0IGRyb3Bkb3ducyA9IHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKVtzaWRlXSgpLmRyb3Bkb3ducztcblxuICAgIGlmIChkcm9wZG93bnM/LigpKSB7XG4gICAgICBkcm9wZG93bnMudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQuY3VycmVudFllYXIgPSB5ZWFyO1xuICAgICAgICBjdXJyZW50LmN1cnJlbnRNb250aCA9IG1vbnRoO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChpc0xlZnQgJiYgdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aCkge1xuICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQubW9udGggPSBjdXJyZW50Lm1vbnRoPy5tb250aChtb250aCkueWVhcih5ZWFyKTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgfVxuXG4gICAgaWYgKG1vbnRoID09PSAxMikge1xuICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8uY2xvbmUoKS5hZGQoMSwgJ21vbnRoJyk7XG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICAgIH1cbiAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBjdXJyZW50Lm1vbnRoID0gY3VycmVudC5tb250aD8ubW9udGgobW9udGgpLnllYXIoeWVhcik7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZUNhbGVuZGFycygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJJbnB1dEV2ZW50KGV2ZW50OiBJRXZlbnQsIHR5cGU6IGBsZWZ0aG91cmAgfCBgbGVmdG1pbnV0ZWAgfCBgcmlnaHRob3VyYCB8IGByaWdodG1pbnV0ZWApIHtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSAhPT0gOCkge1xuICAgICAgZXZlbnQua2V5Q29kZSAmJlxuICAgICAgICB0aGlzLmNoZWNrQmFja3NwYWNlRm9jdXMudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudFt0eXBlXS5zZXQoMSk7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMua2V5Q29kZUJhY2tzcGFjZS5zZXQoZmFsc2UpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5rZXlDb2RlQmFja3NwYWNlLnNldCh0cnVlKTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnbGVmdG1pbnV0ZSc6XG4gICAgICAgIGlmIChpc0VtcHR5KHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRtaW51dGUoKSkpIHtcbiAgICAgICAgICBpZiAodGhpcy5jaGVja0JhY2tzcGFjZUZvY3VzKClbdHlwZV0oKSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja0JhY2tzcGFjZUZvY3VzLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgICBjdXJyZW50W3R5cGVdLnNldChjdXJyZW50W3R5cGVdKCkgKyAxKTtcblxuICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2hlY2tCYWNrc3BhY2VGb2N1cy51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnRbdHlwZV0uc2V0KDEpO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAodGhpcy5mdW5jdGlvbkNvbnRyb2xzLmdldChgJHtTaWRlRW51bS5sZWZ0fWhvdXJgKSBhcyBJSW5wdXRGdW5jdGlvbkNvbnRyb2xFdmVudCk/LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JpZ2h0bWludXRlJzpcbiAgICAgICAgaWYgKGlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSkpIHtcbiAgICAgICAgICBpZiAodGhpcy5jaGVja0JhY2tzcGFjZUZvY3VzKClbdHlwZV0oKSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja0JhY2tzcGFjZUZvY3VzLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgICBjdXJyZW50W3R5cGVdLnNldChjdXJyZW50W3R5cGVdKCkgKyAxKTtcblxuICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2hlY2tCYWNrc3BhY2VGb2N1cy51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnRbdHlwZV0uc2V0KDEpO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAodGhpcy5mdW5jdGlvbkNvbnRyb2xzLmdldChgJHtTaWRlRW51bS5yaWdodH1ob3VyYCkgYXMgSUlucHV0RnVuY3Rpb25Db250cm9sRXZlbnQpPy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRm9jdXNBbmRCbHVyVGltZShldmVudDogSUZvY3VzQW5kQmx1ckV2ZW50LCB0eXBlOiBgbGVmdGhvdXJgIHwgYGxlZnRtaW51dGVgIHwgYHJpZ2h0aG91cmAgfCBgcmlnaHRtaW51dGVgKSB7XG4gICAgaWYgKGV2ZW50Lm5hbWUgPT09ICdmb2N1cycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXZlbnRJbnB1dCA9IGV2ZW50LmV2ZW50IGFzIElFdmVudDtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudElucHV0LnRhcmdldDtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnbGVmdGhvdXInOlxuICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKS5sZWZ0LnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuc2VsZWN0ZWRIb3VyID0gIWlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdGhvdXIoKSkgPyB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpIDogMDtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKE51bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0aG91cigpKSA9PT0gMCB8fCBpc0VtcHR5KHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRob3VyKCkpKSB7XG4gICAgICAgICAgdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5sZWZ0aG91ci5zZXQoMCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9ICcwMCc7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoTnVtYmVyKHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRob3VyKCkpIDwgMTApIHtcbiAgICAgICAgICB0YXJnZXQudmFsdWUgPSBgMCR7TnVtYmVyKHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLmxlZnRob3VyKCkpfWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JpZ2h0aG91cic6XG4gICAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpLnJpZ2h0LnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuc2VsZWN0ZWRIb3VyID0gIWlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkpID8gdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkgOiAwO1xuXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoTnVtYmVyKHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0aG91cigpKSA9PT0gMCB8fCBpc0VtcHR5KHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0aG91cigpKSkge1xuICAgICAgICAgIHRoaXMudGltZXBpY2tlclZhbHVlSXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQucmlnaHRob3VyLnNldCgwKTtcblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGFyZ2V0LnZhbHVlID0gJzAwJztcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE51bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodGhvdXIoKSkgPCAxMCkge1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9IGAwJHtOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKCkpfWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2xlZnRtaW51dGUnOlxuICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKS5sZWZ0LnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgIGN1cnJlbnQuc2VsZWN0ZWRNaW51dGUgPSAhaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0bWludXRlKCkpID8gdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpIDogMDtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKE51bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0bWludXRlKCkpID09PSAwIHx8IGlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpKSkge1xuICAgICAgICAgIHRoaXMudGltZXBpY2tlclZhbHVlSXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQubGVmdG1pbnV0ZS5zZXQoMCk7XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRhcmdldC52YWx1ZSA9ICcwMCc7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpKSA8IDEwKSB7XG4gICAgICAgICAgdGFyZ2V0LnZhbHVlID0gYDAke051bWJlcih0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0bWludXRlKCkpfWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JpZ2h0bWludXRlJzpcbiAgICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKCkucmlnaHQudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudC5zZWxlY3RlZE1pbnV0ZSA9ICFpc0VtcHR5KHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0bWludXRlKCkpID8gdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSA6IDA7XG5cbiAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChOdW1iZXIodGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKSkgPT09IDAgfHwgaXNFbXB0eSh0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodG1pbnV0ZSgpKSkge1xuICAgICAgICAgIHRoaXMudGltZXBpY2tlclZhbHVlSXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnQucmlnaHRtaW51dGUuc2V0KDApO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0YXJnZXQudmFsdWUgPSAnMDAnO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoTnVtYmVyKHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0bWludXRlKCkpIDwgMTApIHtcbiAgICAgICAgICB0YXJnZXQudmFsdWUgPSBgMCR7TnVtYmVyKHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0bWludXRlKCkpfWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VUaW1lVmFsdWUoZXZlbnQ6IHN0cmluZyB8IG51bWJlciwgdHlwZTogYGxlZnRob3VyYCB8IGBsZWZ0bWludXRlYCB8IGByaWdodGhvdXJgIHwgYHJpZ2h0bWludXRlYCkge1xuICAgIHRoaXMudGltZXBpY2tlclZhbHVlSXRlbS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgIGN1cnJlbnRbdHlwZV0uc2V0KGV2ZW50IGFzIG51bWJlcik7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2lkZSA9IHR5cGUuaW5jbHVkZXMoU2lkZUVudW0ubGVmdCkgPyBTaWRlRW51bS5sZWZ0IDogU2lkZUVudW0ucmlnaHQ7XG4gICAgY29uc3QgYXR0ciA9IHR5cGUuaW5jbHVkZXMoJ2hvdXInKSA/ICdob3VyJyA6ICdtaW51dGUnO1xuXG4gICAgdGhpcy5zcGxpdFBpY2tlckRhdGUudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBjdXJyZW50W3NpZGUgPT09IFNpZGVFbnVtLmxlZnQgPyAnc3RhcnQnIDogJ2VuZCddLnVwZGF0ZSgoc2lkZUN1cnJlbnQpID0+IHtcbiAgICAgICAgc2lkZUN1cnJlbnRbYXR0cl0gPSBldmVudCBhcyBudW1iZXI7XG5cbiAgICAgICAgcmV0dXJuIHNpZGVDdXJyZW50O1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICAgIGlmICgodHlwZSAhPT0gJ2xlZnRob3VyJyAmJiB0eXBlICE9PSAncmlnaHRob3VyJykgfHwgZXZlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc1plcm8uc2V0KGZhbHNlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoYCR7ZXZlbnR9YC5sZW5ndGggPT09IDIgfHwgTnVtYmVyKGV2ZW50KSA+IDIgfHwgKE51bWJlcihldmVudCkgPD0gMiAmJiBOdW1iZXIoZXZlbnQpID4gMCAmJiB0aGlzLmlzWmVybygpKSB8fCAodGhpcy5pc1plcm8oKSAmJiAhdGhpcy5rZXlDb2RlQmFja3NwYWNlKCkpKSB7XG4gICAgICB0aGlzLmlzWmVyby5zZXQoZmFsc2UpO1xuICAgICAgKHRoaXMuZnVuY3Rpb25Db250cm9scy5nZXQodHlwZSA9PT0gJ2xlZnRob3VyJyA/IGAke1NpZGVFbnVtLmxlZnR9bWludXRlYCA6IGAke1NpZGVFbnVtLnJpZ2h0fW1pbnV0ZWApIGFzIElJbnB1dEZ1bmN0aW9uQ29udHJvbEV2ZW50KT8uZm9jdXMoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoTnVtYmVyKGV2ZW50KSA9PT0gMCAmJiAhdGhpcy5rZXlDb2RlQmFja3NwYWNlKCkpIHtcbiAgICAgIHRoaXMuaXNaZXJvLnNldCh0cnVlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2hvd0xpc3REcm9wZG93bihldmVudDogYm9vbGVhbiwgdHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy5jaGVja1Nob3dMaXN0RHJvcGRvd24udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICBjdXJyZW50W3R5cGVdID0gZXZlbnQ7XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbnZlcnRJdGVtTW9udGggPSAoaXRlbTogYW55KSA9PiB7XG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHNldChpdGVtLCAnbGFiZWxEaXNwbGF5JywgdGhpcy50cmFuc2xhdGUuaW5zdGFudChpdGVtLmxhYmVsIHx8ICcgJywgeyB5ZWFyOiAnJyB9KSk7XG5cbiAgICByZXR1cm4gaXRlbTtcbiAgfTtcbiAgcHJvdGVjdGVkIGNvbnZlcnRJdGVtWWVhciA9IChpdGVtOiBhbnkpID0+IHtcbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaXRlbS5sYWJlbERpc3BsYXkgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdpMThuX3llYXJfcGFyYW0nLCB7IHllYXI6IGl0ZW0ubGFiZWwgfSk7XG5cbiAgICByZXR1cm4gaXRlbTtcbiAgfTtcblxuICBwcml2YXRlIHVwZGF0ZU1vbnRoc0luVmlldygpIHtcbiAgICBpZiAodGhpcy5lbmREYXRlKCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuaXNTaW5nbGUoKSAmJlxuICAgICAgICB0aGlzLmxlZnRDYWxlbmRhcigpLm1vbnRoICYmXG4gICAgICAgIHRoaXMucmlnaHRDYWxlbmRhcigpLm1vbnRoICYmXG4gICAgICAgICgodGhpcy5sZWZ0Q2FsZW5kYXIoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0nKSA9PT0gdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykpIHx8ICh0aGlzLnJpZ2h0Q2FsZW5kYXIoKSAmJiB0aGlzLnN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0nKSA9PT0gdGhpcy5yaWdodENhbGVuZGFyKCkubW9udGg/LmZvcm1hdCgnWVlZWS1NTScpKSkgJiZcbiAgICAgICAgKHRoaXMuZW5kRGF0ZSgpPy5mb3JtYXQoJ1lZWVktTU0nKSA9PT0gdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykgfHwgdGhpcy5lbmREYXRlKCk/LmZvcm1hdCgnWVlZWS1NTScpID09PSB0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGFydERhdGUoKSkge1xuICAgICAgICB0aGlzLmxlZnRDYWxlbmRhci51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50Lm1vbnRoID0gdGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKT8uZGF0ZSgyKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5lbmREYXRlKCk/Lm1vbnRoKCkgIT09IHRoaXMuc3RhcnREYXRlKCk/Lm1vbnRoKCkgfHwgdGhpcy5lbmREYXRlKCk/LnllYXIoKSAhPT0gdGhpcy5zdGFydERhdGUoKT8ueWVhcigpKSB7XG4gICAgICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgY3VycmVudC5tb250aCA9IHRoaXMuZW5kRGF0ZSgpPy5jbG9uZSgpPy5kYXRlKDIpO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIudXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgY3VycmVudC5tb250aCA9IHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCk/LmRhdGUoMik/LmFkZCgxLCAnbW9udGgnKTtcblxuICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXJ0RGF0ZSgpICYmXG4gICAgICB0aGlzLmxlZnRDYWxlbmRhcigpLm1vbnRoICYmXG4gICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aCAmJlxuICAgICAgdGhpcy5sZWZ0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykgIT09IHRoaXMuc3RhcnREYXRlKCk/LmZvcm1hdCgnWVlZWS1NTScpICYmXG4gICAgICB0aGlzLnJpZ2h0Q2FsZW5kYXIoKS5tb250aD8uZm9ybWF0KCdZWVlZLU1NJykgIT09IHRoaXMuc3RhcnREYXRlKCk/LmZvcm1hdCgnWVlZWS1NTScpXG4gICAgKSB7XG4gICAgICB0aGlzLmxlZnRDYWxlbmRhci51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5tb250aCA9IHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCk/LmRhdGUoMik7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmlnaHRDYWxlbmRhci51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5tb250aCA9IHRoaXMuc3RhcnREYXRlKCk/LmNsb25lKCk/LmRhdGUoMik/LmFkZCgxLCAnbW9udGgnKTtcblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0VGltZUlucHV0KHNpZGU6IFNpZGVFbnVtKSB7XG4gICAgY29uc3QgaG91ciA9IHBhcnNlSW50KGAke3RoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdKCkuc2VsZWN0ZWRIb3VyfWApO1xuICAgIGNvbnN0IG1pbnV0ZSA9IHBhcnNlSW50KGAke3RoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdKCkuc2VsZWN0ZWRNaW51dGV9YCk7XG5cbiAgICBpZiAoc2lkZSA9PT0gU2lkZUVudW0ubGVmdCAmJiB0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICBsZXQgc3RhcnQgPSB0aGlzLnN0YXJ0RGF0ZSgpPy5jbG9uZSgpO1xuXG4gICAgICBzdGFydCA9IHN0YXJ0Py5ob3VyKGhvdXIpO1xuICAgICAgc3RhcnQgPSBzdGFydD8ubWludXRlKG1pbnV0ZSk7XG4gICAgICB0aGlzLnNldFN0YXJ0RGF0ZShzdGFydCk7XG4gICAgICBpZiAodGhpcy5pc1NpbmdsZSgpKSB7XG4gICAgICAgIHRoaXMuZW5kRGF0ZS5zZXQodGhpcy5zdGFydERhdGUoKT8uY2xvbmUoKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5lbmREYXRlKCkgJiYgdGhpcy5lbmREYXRlKCk/LmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBzdGFydD8uZm9ybWF0KCdZWVlZLU1NLUREJykgJiYgdGhpcy5lbmREYXRlKCk/LmlzQmVmb3JlKHN0YXJ0KSkge1xuICAgICAgICB0aGlzLnNldEVuZERhdGUoc3RhcnQ/LmNsb25lKCkpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmVuZERhdGUoKSAmJiBzdGFydCAmJiB0aGlzLmhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICBjb25zdCBzdGFydENsb25lID0gdGhpcy5nZXREYXRlV2l0aFRpbWUoc3RhcnQsIFNpZGVFbnVtLnJpZ2h0KTtcblxuICAgICAgICBpZiAoc3RhcnRDbG9uZS5pc0JlZm9yZShzdGFydCkpIHtcbiAgICAgICAgICB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtTaWRlRW51bS5yaWdodF0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkSG91ciA9IGhvdXI7XG4gICAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkTWludXRlID0gbWludXRlO1xuXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmVuZERhdGUoKSkge1xuICAgICAgbGV0IGVuZCA9IHRoaXMuZW5kRGF0ZSgpPy5jbG9uZSgpO1xuXG4gICAgICBlbmQgPSBlbmQ/LmhvdXIoaG91cik7XG4gICAgICBlbmQgPSBlbmQ/Lm1pbnV0ZShtaW51dGUpO1xuICAgICAgdGhpcy5zZXRFbmREYXRlKGVuZCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQ2FsZW5kYXJzKCk7XG4gICAgdGhpcy5yZW5kZXJUaW1lUGlja2VyKFNpZGVFbnVtLmxlZnQpO1xuICAgIHRoaXMucmVuZGVyVGltZVBpY2tlcihTaWRlRW51bS5yaWdodCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNhbGVuZGFycygpIHtcbiAgICB0aGlzLnJlbmRlckNhbGVuZGFyKFNpZGVFbnVtLmxlZnQpO1xuICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoU2lkZUVudW0ucmlnaHQpO1xuICAgIGlmICh0aGlzLmVuZERhdGUoKSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNhbGN1bGF0ZVNlbGVjdGVkTGFiZWwoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ2FsZW5kYXIoc2lkZTogU2lkZUVudW0pIHtcbiAgICAvLyBzaWRlIGVudW1cbiAgICBjb25zdCBtYWluQ2FsZW5kYXI6IHsgY2FsZW5kYXI/OiBJQ2FsZW5kYXI7IG1vbnRoPzogRGF5anMgfSA9IHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgPyB0aGlzLmxlZnRDYWxlbmRhcigpIDogdGhpcy5yaWdodENhbGVuZGFyKCk7XG5cbiAgICBpZiAoIW1haW5DYWxlbmRhci5tb250aCB8fCB0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmRhdGVPcHRpb25zKCkuZmlyc3REYXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtb250aCA9IG1haW5DYWxlbmRhci5tb250aC5tb250aCgpO1xuICAgIGNvbnN0IHllYXIgPSBtYWluQ2FsZW5kYXIubW9udGgueWVhcigpO1xuICAgIGNvbnN0IGhvdXIgPSBtYWluQ2FsZW5kYXIubW9udGguaG91cigpO1xuICAgIGNvbnN0IG1pbnV0ZSA9IG1haW5DYWxlbmRhci5tb250aC5taW51dGUoKTtcbiAgICBjb25zdCBzZWNvbmQgPSBtYWluQ2FsZW5kYXIubW9udGguc2Vjb25kKCk7XG4gICAgY29uc3QgZGF5c0luTW9udGggPSBnZXREYXlqczxEYXlqcz4oeyBkYXRlOiBuZXcgRGF0ZSh5ZWFyLCBtb250aCkgfSkuZGF5c0luTW9udGgoKTtcbiAgICBjb25zdCBmaXJzdERheSA9IGdldERheWpzPERheWpzPih7IGRhdGU6IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKSB9KTtcbiAgICBjb25zdCBsYXN0RGF5ID0gZ2V0RGF5anM8RGF5anM+KHsgZGF0ZTogbmV3IERhdGUoeWVhciwgbW9udGgsIGRheXNJbk1vbnRoKSB9KTtcbiAgICBjb25zdCBsYXN0TW9udGggPSBnZXREYXlqczxEYXlqcz4oeyBkYXRlOiBmaXJzdERheS5zdWJ0cmFjdCgxLCAnbW9udGgnKSB9KS5tb250aCgpO1xuICAgIGNvbnN0IGxhc3RZZWFyID0gZ2V0RGF5anM8RGF5anM+KHsgZGF0ZTogZmlyc3REYXkuc3VidHJhY3QoMSwgJ21vbnRoJykgfSkueWVhcigpO1xuICAgIGNvbnN0IGRheXNJbkxhc3RNb250aCA9IGdldERheWpzPERheWpzPih7IGRhdGU6IG5ldyBEYXRlKGxhc3RZZWFyLCBsYXN0TW9udGgpIH0pLmRheXNJbk1vbnRoKCk7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZmlyc3REYXkuZGF5KCk7XG4gICAgY29uc3QgY2FsZW5kYXI6IElDYWxlbmRhciA9IHt9O1xuXG4gICAgY2FsZW5kYXIuZmlyc3REYXkgPSBmaXJzdERheTtcbiAgICBjYWxlbmRhci5sYXN0RGF5ID0gbGFzdERheTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgY2FsZW5kYXJbaV0gPSBbXTtcbiAgICB9XG4gICAgbGV0IHN0YXJ0RGF5ID0gZGF5c0luTGFzdE1vbnRoIC0gZGF5T2ZXZWVrICsgKHRoaXMuZGF0ZU9wdGlvbnMoKS5maXJzdERheSA/PyAxKSArIDE7XG5cbiAgICBpZiAoc3RhcnREYXkgPiBkYXlzSW5MYXN0TW9udGgpIHtcbiAgICAgIHN0YXJ0RGF5IC09IDc7XG4gICAgfVxuICAgIGlmIChkYXlPZldlZWsgPT09IHRoaXMuZGF0ZU9wdGlvbnMoKS5maXJzdERheSkge1xuICAgICAgc3RhcnREYXkgPSBkYXlzSW5MYXN0TW9udGggLSA2O1xuICAgIH1cbiAgICBsZXQgY3VyRGF0ZSA9IGdldERheWpzPERheWpzPih7IGRhdGU6IG5ldyBEYXRlKGxhc3RZZWFyLCBsYXN0TW9udGgsIHN0YXJ0RGF5LCAxMiwgbWludXRlLCBzZWNvbmQpIH0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGNvbCA9IDAsIHJvdyA9IDA7IGkgPCA0MjsgaSsrLCBjb2wrKywgY3VyRGF0ZSA9IGdldERheWpzPERheWpzPih7IGRhdGU6IGN1ckRhdGUgfSkuYWRkKDI0LCAnaG91cicpKSB7XG4gICAgICBpZiAoaSA+IDAgJiYgY29sICUgNyA9PT0gMCkge1xuICAgICAgICBjb2wgPSAwO1xuICAgICAgICByb3crKztcbiAgICAgIH1cbiAgICAgIGNhbGVuZGFyW3Jvd11bY29sXSA9IGN1ckRhdGUuY2xvbmUoKS5ob3VyKGhvdXIpLm1pbnV0ZShtaW51dGUpLnNlY29uZChzZWNvbmQpO1xuICAgICAgY3VyRGF0ZSA9IGN1ckRhdGUuaG91cigxMik7XG5cbiAgICAgIGNvbnN0IG1pbkRhdGUgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMubWluRGF0ZSgpIH0pO1xuICAgICAgY29uc3QgbWF4RGF0ZSA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5tYXhEYXRlKCkgfSk7XG4gICAgICBpZiAobWluRGF0ZSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uZm9ybWF0KCdZWVlZLU1NLUREJykgPT09IG1pbkRhdGU/LmZvcm1hdCgnWVlZWS1NTS1ERCcpICYmIGNhbGVuZGFyW3Jvd11bY29sXS5pc0JlZm9yZShtaW5EYXRlKSAmJiBzaWRlID09PSAnbGVmdCcpIHtcbiAgICAgICAgY2FsZW5kYXJbcm93XVtjb2xdID0gbWluRGF0ZT8uY2xvbmUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhEYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gbWF4RGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmlzQWZ0ZXIobWF4RGF0ZSkgJiYgc2lkZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICBjYWxlbmRhcltyb3ddW2NvbF0gPSBtYXhEYXRlPy5jbG9uZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0KSB7XG4gICAgICB0aGlzLmxlZnRDYWxlbmRhci51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgY3VycmVudC5jYWxlbmRhciA9IGNhbGVuZGFyO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5yaWdodCkge1xuICAgICAgdGhpcy5yaWdodENhbGVuZGFyLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50LmNhbGVuZGFyID0gY2FsZW5kYXI7XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgbWluRGF0ZSA9IHNpZGUgPT09ICdsZWZ0JyA/IGdldERheWpzKHsgZGF0ZTogdGhpcy5taW5EYXRlKCkgfSkgOiBnZXREYXlqcyh7IGRhdGU6IHRoaXMuc3RhcnREYXRlKCkgfSk7XG4gICAgY29uc3QgbWF4RGF0ZSA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5tYXhEYXRlKCkgfSk7XG5cbiAgICB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKClbc2lkZV0uc2V0KHtcbiAgICAgIG1vbnRoOiBtb250aCxcbiAgICAgIHllYXI6IHllYXIsXG4gICAgICBob3VyOiBob3VyLFxuICAgICAgbWludXRlOiBtaW51dGUsXG4gICAgICBzZWNvbmQ6IHNlY29uZCxcbiAgICAgIGRheXNJbk1vbnRoOiBkYXlzSW5Nb250aCxcbiAgICAgIGZpcnN0RGF5OiBmaXJzdERheSxcbiAgICAgIGxhc3REYXk6IGxhc3REYXksXG4gICAgICBsYXN0TW9udGg6IGxhc3RNb250aCxcbiAgICAgIGxhc3RZZWFyOiBsYXN0WWVhcixcbiAgICAgIGRheXNJbkxhc3RNb250aDogZGF5c0luTGFzdE1vbnRoLFxuICAgICAgZGF5T2ZXZWVrOiBkYXlPZldlZWssXG4gICAgICBjYWxSb3dzOiBzaWduYWwoQXJyYXkuZnJvbShBcnJheSg2KS5rZXlzKCkpKSxcbiAgICAgIGNhbENvbHM6IHNpZ25hbChBcnJheS5mcm9tKEFycmF5KDcpLmtleXMoKSkpLFxuICAgICAgY2xhc3Nlczoge30sXG4gICAgICBtaW5EYXRlOiBtaW5EYXRlLFxuICAgICAgbWF4RGF0ZTogbWF4RGF0ZSxcbiAgICAgIGNhbGVuZGFyOiBjYWxlbmRhcixcbiAgICAgIGRyb3Bkb3duczogc2lnbmFsKHt9KSxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5zaG93RHJvcGRvd25zU2VsZWN0KCkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IGNhbGVuZGFyWzFdWzFdLm1vbnRoKCk7XG4gICAgICBjb25zdCBjdXJyZW50WWVhciA9IGNhbGVuZGFyWzFdWzFdLnllYXIoKTtcbiAgICAgIGNvbnN0IG1heFllYXIgPSBtYXhEYXRlPy55ZWFyKCkgPz8gREVGQVVMVF9NQVhfWUVBUjtcbiAgICAgIGNvbnN0IG1pblllYXIgPSBtaW5EYXRlPy55ZWFyKCkgPz8gREVGQVVMVF9NSU5fWUVBUjtcbiAgICAgIGNvbnN0IGluTWluWWVhciA9IGN1cnJlbnRZZWFyID09PSBtaW5ZZWFyO1xuICAgICAgY29uc3QgaW5NYXhZZWFyID0gY3VycmVudFllYXIgPT09IG1heFllYXI7XG4gICAgICBjb25zdCB5ZWFycyA9IFtdO1xuXG4gICAgICBmb3IgKGxldCB5ID0gbWluWWVhcjsgeSA8PSBtYXhZZWFyOyB5KyspIHtcbiAgICAgICAgeWVhcnMucHVzaCh5KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKVxuICAgICAgICBbc2lkZV0oKVxuICAgICAgICAuZHJvcGRvd25zPy5zZXQoe1xuICAgICAgICAgIGN1cnJlbnRNb250aDogY3VycmVudE1vbnRoLFxuICAgICAgICAgIGN1cnJlbnRZZWFyOiBjdXJyZW50WWVhcixcbiAgICAgICAgICBtYXhZZWFyOiBtYXhZZWFyLFxuICAgICAgICAgIG1pblllYXI6IG1pblllYXIsXG4gICAgICAgICAgaW5NaW5ZZWFyOiBpbk1pblllYXIsXG4gICAgICAgICAgaW5NYXhZZWFyOiBpbk1heFllYXIsXG4gICAgICAgICAgbW9udGhBcnJheXM6IHNpZ25hbChBcnJheS5mcm9tKEFycmF5KDEyKS5rZXlzKCkpKSxcbiAgICAgICAgICB5ZWFyQXJyYXlzOiBzaWduYWwoeWVhcnMpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5idWlsZENlbGxzKGNhbGVuZGFyLCBzaWRlKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDZWxscyhjYWxlbmRhcjogSUNhbGVuZGFyLCBzaWRlOiBTaWRlRW51bSkge1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IDY7IHJvdysrKSB7XG4gICAgICBjb25zdCBjbGFzc2xlc3MgPSB0aGlzLmNhbGVuZGFyVmFyaWFibGVzKClbc2lkZV0oKTtcblxuICAgICAgaWYgKGNsYXNzbGVzcy5jbGFzc2VzKSB7XG4gICAgICAgIGNsYXNzbGVzcy5jbGFzc2VzW3Jvd10gPSB7fTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IDc7IGNvbCsrKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBbXTtcblxuICAgICAgICBjb25zdCBzdGFydERhdGUgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMuc3RhcnREYXRlKCkgfSk7XG4gICAgICAgIGNvbnN0IGVuZERhdGUgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMuZW5kRGF0ZSgpIH0pO1xuICAgICAgICBjb25zdCBub3dIb3ZlcmVkRGF0ZSA9IHRoaXMubm93SG92ZXJlZERhdGUoKTtcblxuICAgICAgICBpZiAoY2FsZW5kYXJbcm93XVtjb2xdLmlzU2FtZShuZXcgRGF0ZSgpLCAnZGF5JykpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ3RvZGF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhbGVuZGFyW3Jvd11bY29sXS5pc29XZWVrZGF5KCkgPiA1KSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCd3ZWVrZW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhbGVuZGFyW3Jvd11bY29sXS5tb250aCgpICE9PSBjYWxlbmRhclsxXVsxXS5tb250aCgpKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCdvZmYnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5taW5EYXRlKCkgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmlzQmVmb3JlKHRoaXMubWluRGF0ZSgpLCAnZGF5JykpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ29mZicsICdkaXNhYmxlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNhbGVuZGFyVmFyaWFibGVzKClbc2lkZV0oKS5tYXhEYXRlICYmIGNhbGVuZGFyW3Jvd11bY29sXS5pc0FmdGVyKHRoaXMuY2FsZW5kYXJWYXJpYWJsZXMoKVtzaWRlXSgpLm1heERhdGUsICdkYXknKSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnb2ZmJywgJ2Rpc2FibGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0RGF0ZSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uZm9ybWF0KCdZWVlZLU1NLUREJykgPT09IHN0YXJ0RGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ2FjdGl2ZScsICdzdGFydC1kYXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZERhdGUgIT09IG51bGwgJiYgY2FsZW5kYXJbcm93XVtjb2xdLmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBlbmREYXRlPy5mb3JtYXQoJ1lZWVktTU0tREQnKSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnYWN0aXZlJywgJ2VuZC1kYXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0RGF0ZSAmJiBjYWxlbmRhcltyb3ddW2NvbF0uZm9ybWF0KCdZWVlZLU1NLUREJykgPT09IHN0YXJ0RGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykgJiYgKCFlbmREYXRlIHx8IChlbmREYXRlICE9PSBudWxsICYmIGNhbGVuZGFyW3Jvd11bY29sXS5mb3JtYXQoJ1lZWVktTU0tREQnKSA9PT0gZW5kRGF0ZT8uZm9ybWF0KCdZWVlZLU1NLUREJykpKSkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaCgnYWN0aXZlJywgJ2Z1bGwtZGF0ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHN0YXJ0RGF0ZSAmJlxuICAgICAgICAgIGVuZERhdGUgJiZcbiAgICAgICAgICAoKG5vd0hvdmVyZWREYXRlICE9PSBudWxsICYmIHRoaXMucGlja2luZ0RhdGUoKSkgfHwgZW5kRGF0ZSAhPT0gbnVsbCkgJiZcbiAgICAgICAgICBjYWxlbmRhcltyb3ddW2NvbF0gPiBzdGFydERhdGUgJiZcbiAgICAgICAgICAoY2FsZW5kYXJbcm93XVtjb2xdIDwgZW5kRGF0ZSB8fCAobm93SG92ZXJlZERhdGUgJiYgY2FsZW5kYXJbcm93XVtjb2xdIDwgbm93SG92ZXJlZERhdGUgJiYgdGhpcy5waWNraW5nRGF0ZSgpKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCFjbGFzc2VzLmZpbmQoKGVsKSA9PiBlbCA9PT0gJ29mZicpID8gJ2luLXJhbmdlJyA6ICdmb2N1cy1vZmYnKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY25hbWUgPSAnJyxcbiAgICAgICAgICBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNuYW1lICs9IGNsYXNzZXNbaV0gKyAnICc7XG5cbiAgICAgICAgICBpZiAoY2xhc3Nlc1tpXSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICAgICAgY25hbWUgKz0gJ2F2YWlsYWJsZSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2xhc3NsZXNzLmNsYXNzZXMpIHtcbiAgICAgICAgICBjbGFzc2xlc3MuY2xhc3Nlc1tyb3ddW2NvbF0gPSBjbmFtZS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbmRlclRpbWVQaWNrZXIoc2lkZTogU2lkZUVudW0pIHtcbiAgICBsZXQgc2VsZWN0ZWQ6IERheWpzID0gZ2V0RGF5anM8RGF5anM+KCksXG4gICAgICBtaW5EYXRlO1xuICAgIGNvbnN0IG1heERhdGUgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMubWF4RGF0ZSgpIH0pO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGdldERheWpzKHsgZGF0ZTogdGhpcy5zdGFydERhdGUoKSB9KTtcbiAgICBjb25zdCBlbmREYXRlID0gZ2V0RGF5anMoeyBkYXRlOiB0aGlzLmVuZERhdGUoKSB9KTtcblxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5sZWZ0ICYmIHN0YXJ0RGF0ZSkge1xuICAgICAgc2VsZWN0ZWQgPSBzdGFydERhdGUuY2xvbmUoKTtcbiAgICAgIG1pbkRhdGUgPSB0aGlzLm1heERhdGUoKTtcbiAgICB9XG4gICAgaWYgKHNpZGUgPT09IFNpZGVFbnVtLnJpZ2h0ICYmIGVuZERhdGUpIHtcbiAgICAgIHNlbGVjdGVkID0gZW5kRGF0ZS5jbG9uZSgpO1xuICAgICAgbWluRGF0ZSA9IHRoaXMuc3RhcnREYXRlKCk7XG4gICAgfVxuICAgIGlmIChzaWRlID09PSBTaWRlRW51bS5yaWdodCAmJiAhZW5kRGF0ZSkge1xuICAgICAgaWYgKCFzdGFydERhdGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2VsZWN0ZWQgPSBnZXREYXlqcyh7IGRhdGU6IHRoaXMuZ2V0RGF0ZVdpdGhUaW1lKHN0YXJ0RGF0ZSwgU2lkZUVudW0ucmlnaHQpIH0pO1xuICAgICAgaWYgKHNlbGVjdGVkLmlzQmVmb3JlKHN0YXJ0RGF0ZSkpIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBzdGFydERhdGUuY2xvbmUoKTtcbiAgICAgIH1cbiAgICAgIG1pbkRhdGUgPSBzdGFydERhdGU7XG4gICAgfVxuICAgIGNvbnN0IHN0YXJ0ID0gMDtcbiAgICBjb25zdCBlbmQgPSAyMztcblxuICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdLnNldCh7XG4gICAgICBob3VyczogW10sXG4gICAgICBtaW51dGVzOiBbXSxcbiAgICAgIG1pbnV0ZXNMYWJlbDogW10sXG4gICAgICBzZWNvbmRzOiBbXSxcbiAgICAgIHNlY29uZHNMYWJlbDogW10sXG4gICAgICBkaXNhYmxlZEhvdXJzOiBbXSxcbiAgICAgIGRpc2FibGVkTWludXRlczogW10sXG4gICAgICBkaXNhYmxlZFNlY29uZHM6IFtdLFxuICAgICAgc2VsZWN0ZWRIb3VyOiAwLFxuICAgICAgc2VsZWN0ZWRNaW51dGU6IDAsXG4gICAgICBzZWxlY3RlZFNlY29uZDogMCxcbiAgICB9KTtcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgIGNvbnN0IGlfaW5fMjQgPSBpO1xuXG4gICAgICBjb25zdCB0aW1lID0gc2VsZWN0ZWQuY2xvbmUoKS5ob3VyKGlfaW5fMjQpO1xuICAgICAgbGV0IGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICAgIGlmIChtaW5EYXRlICYmIHRpbWUubWludXRlKDU5KS5pc0JlZm9yZShtaW5EYXRlKSkge1xuICAgICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAobWF4RGF0ZSAmJiB0aW1lLm1pbnV0ZSgwKS5pc0FmdGVyKG1heERhdGUpKSB7XG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdLnVwZGF0ZSgoY3VycmVudCkgPT4ge1xuICAgICAgICBjdXJyZW50LmhvdXJzPy5wdXNoKGkpO1xuICAgICAgICBpZiAoaV9pbl8yNCA9PT0gc2VsZWN0ZWQuaG91cigpICYmICFkaXNhYmxlZCkge1xuICAgICAgICAgIGN1cnJlbnQuc2VsZWN0ZWRIb3VyID0gaTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgICBjdXJyZW50LmRpc2FibGVkSG91cnM/LnB1c2goaSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDYwOyBpICs9IHRoaXMudGltZVBpY2tlckluY3JlbWVudCgpKSB7XG4gICAgICBjb25zdCBwYWRkZWQgPSBpIDwgMTAgPyAnMCcgKyBpIDogYCR7aX1gO1xuICAgICAgY29uc3QgdGltZSA9IHNlbGVjdGVkLmNsb25lKCkubWludXRlKGkpO1xuXG4gICAgICBsZXQgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKG1pbkRhdGUgJiYgdGltZS5zZWNvbmQoNTkpLmlzQmVmb3JlKG1pbkRhdGUpKSB7XG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhEYXRlICYmIHRpbWUuc2Vjb25kKDApLmlzQWZ0ZXIobWF4RGF0ZSkpIHtcbiAgICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbc2lkZV0udXBkYXRlKChjdXJyZW50KSA9PiB7XG4gICAgICAgIGN1cnJlbnQubWludXRlcz8ucHVzaChpKTtcbiAgICAgICAgY3VycmVudC5taW51dGVzTGFiZWw/LnB1c2gocGFkZGVkKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkLm1pbnV0ZSgpID09PSBpICYmICFkaXNhYmxlZCkge1xuICAgICAgICAgIGN1cnJlbnQuc2VsZWN0ZWRNaW51dGUgPSBpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICAgIGN1cnJlbnQuZGlzYWJsZWRNaW51dGVzPy5wdXNoKGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXS51cGRhdGUoKGN1cnJlbnQpID0+IHtcbiAgICAgIGN1cnJlbnQuc2VsZWN0ZWQgPSBzZWxlY3RlZDtcblxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVsZW1lbnQoKSB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0RGF0ZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmlzU2luZ2xlKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRMYWJlbC5zZXQodGhpcy5zdGFydERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJykpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmVuZERhdGUoKSkge1xuICAgICAgLy8gaWYgd2UgdXNlIHJhbmdlcyBhbmQgc2hvdWxkIHNob3cgcmFuZ2UgbGFiZWwgb24gaW5wdXRcbiAgICAgIGlmICh0aGlzLnF1aWNrUmFuZ2VzQXJyYXkoKS5sZW5ndGggJiYgdGhpcy5zaG93UmFuZ2VMYWJlbE9uSW5wdXQoKSAmJiB0aGlzLnNlbGVjdGVkUXVpY2tSYW5nZSgpICYmIHRoaXMuZGF0ZU9wdGlvbnMoKS5jdXN0b21SYW5nZUxhYmVsICE9PSB0aGlzLnNlbGVjdGVkUXVpY2tSYW5nZSgpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMYWJlbC5zZXQodGhpcy5zZWxlY3RlZFF1aWNrUmFuZ2UoKSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RlZExhYmVsLnNldChgJHt0aGlzLnN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ0REL01NL1lZWVknKX0ke3RoaXMuZGF0ZU9wdGlvbnMoKS5zZXBhcmF0b3J9JHt0aGlzLmVuZERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJyl9YCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZExhYmVsLnNldChgJHt0aGlzLnN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ0REL01NL1lZWVknKX0ke3RoaXMuZGF0ZU9wdGlvbnMoKS5zZXBhcmF0b3J9JHt0aGlzLnN0YXJ0RGF0ZSgpPy5mb3JtYXQoJ0REL01NL1lZWVknKX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVmlldygpIHtcbiAgICBpZiAodGhpcy5oYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgIHRoaXMucmVuZGVyVGltZVBpY2tlcihTaWRlRW51bS5sZWZ0KTtcbiAgICAgIHRoaXMucmVuZGVyVGltZVBpY2tlcihTaWRlRW51bS5yaWdodCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlTW9udGhzSW5WaWV3KCk7XG4gICAgdGhpcy51cGRhdGVDYWxlbmRhcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF0ZVdpdGhUaW1lKGRhdGU6IERheWpzLCBzaWRlOiBTaWRlRW51bSk6IERheWpzIHtcbiAgICBjb25zdCBob3VyID0gcGFyc2VJbnQoYCR7dGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbc2lkZV0oKS5zZWxlY3RlZEhvdXJ9YCwgMTApO1xuICAgIGNvbnN0IG1pbnV0ZSA9IHBhcnNlSW50KGAke3RoaXMudGltZXBpY2tlclZhcmlhYmxlcygpW3NpZGVdKCkuc2VsZWN0ZWRNaW51dGV9YCwgMTApO1xuICAgIGNvbnN0IHNlY29uZCA9IHRoaXMuaGFzU2Vjb25kUGlja2VyKCkgJiYgIWlzRW1wdHkodGhpcy50aW1lcGlja2VyVmFyaWFibGVzKClbc2lkZV0oKS5zZWxlY3RlZFNlY29uZCkgPyBwYXJzZUludChgJHt0aGlzLnRpbWVwaWNrZXJWYXJpYWJsZXMoKVtzaWRlXSgpLnNlbGVjdGVkU2Vjb25kfWAsIDEwKSA6IDA7XG5cbiAgICByZXR1cm4gZGF0ZS5jbG9uZSgpLmhvdXIoaG91cikubWludXRlKG1pbnV0ZSkuc2Vjb25kKHNlY29uZCk7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybU1pbk1heERhdGUodmFsdWU6IERheWpzIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogRGF5anMgfCB1bmRlZmluZWQge1xuICAgIGlmIChpc0VtcHR5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGRheWpzLmlzRGF5anModmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZ2V0RGF5anMoeyBkYXRlOiB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlZERpc3BsYXlUaW1lKHNpZGU6IElUaW1lcGlja2VyVmFyaWFibGVzU2lkZSkge1xuICAgIGxldCBzdHJIb3Vyczogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkID0gc2lkZS5zZWxlY3RlZEhvdXI7XG4gICAgbGV0IHN0ck1pbnV0ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkID0gc2lkZS5zZWxlY3RlZE1pbnV0ZTtcblxuICAgIGlmICgoc2lkZS5zZWxlY3RlZEhvdXIgfHwgMCkgPCAxMCkge1xuICAgICAgc3RySG91cnMgPSBgMCR7c2lkZS5zZWxlY3RlZEhvdXIgPz8gMH1gO1xuICAgIH1cblxuICAgIGlmICgoc2lkZS5zZWxlY3RlZE1pbnV0ZSB8fCAwKSA8IDEwKSB7XG4gICAgICBzdHJNaW51dGUgPSBgMCR7c2lkZS5zZWxlY3RlZE1pbnV0ZSA/PyAwfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3N0ckhvdXJzfToke3N0ck1pbnV0ZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlZERpc3BsYXlUaW1lSW5wdXQoc2lkZTogU2lkZUVudW0sIHRpbWVUeXBlOiAnaG91cicgfCAnbWludXRlJykge1xuICAgIGNvbnN0IHRpbWUgPVxuICAgICAgdGltZVR5cGUgPT09ICdob3VyJyA/IChzaWRlID09PSBTaWRlRW51bS5sZWZ0ID8gdGhpcy50aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdGhvdXIoKSA6IHRoaXMudGltZXBpY2tlclZhbHVlSXRlbSgpLnJpZ2h0aG91cigpKSA6IHNpZGUgPT09IFNpZGVFbnVtLmxlZnQgPyB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5sZWZ0bWludXRlKCkgOiB0aGlzLnRpbWVwaWNrZXJWYWx1ZUl0ZW0oKS5yaWdodG1pbnV0ZSgpO1xuXG4gICAgaWYgKCF0aW1lKSB7XG4gICAgICByZXR1cm4gJzAwJztcbiAgICB9XG4gICAgaWYgKHRpbWUgPCAxMCkge1xuICAgICAgcmV0dXJuIGAwJHt0aW1lfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbWU7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICByZXR1cm47XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyIHRlc3QtY2xhc3NcIj5cbiAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXhcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXJcIlxuICAgICAgW2NsYXNzLnJpZ2h0XT1cImlzU2luZ2xlKClcIlxuICAgICAgW2NsYXNzLmxlZnRdPVwiIWlzU2luZ2xlKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3VuZGVkLVs0cHhdIGJnLVsjZmZmZmZmXVwiPlxuICAgICAgICBAaWYgKGNhbGVuZGFyVmFyaWFibGVzKCk7IGFzIGNhbGVuZGFyVmFyaWFibGVzKSB7XG4gICAgICAgICAgPHRhYmxlPlxuICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICBjb2xzcGFuPVwiN1wiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm1vbnRoXCI+XG4gICAgICAgICAgICAgICAgICBAaWYgKHNob3dEcm9wZG93bnNTZWxlY3QoKSAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuZHJvcGRvd25zPy4oKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIWZsZXggbWItWzEwcHhdIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTMvNCBmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1yLVs4cHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKSArIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cInsgd2lkdGhCeVBhcmVudDogZmFsc2UsIGlnbm9yZUFycm93OiB0cnVlLCBwYWRkaW5nTGVmdEl0ZW06IHRydWUsIGNsYXNzSW5jbHVkZTogJyF3LVsxMzBweF0nLCBwb3NpdGlvbjogeyBtb2RlOiAnY2VudGVyJywgZGlzdGFuY2U6IDAgfSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdENsaWNrRXhhY3RseV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RLZXlzRGlzYWJsZV09XCJkaXNhYmxlTW9udGgoKS5sZWZ0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb252ZXJ0SXRlbVNlbGVjdGVkXT1cImNvbnZlcnRJdGVtTW9udGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RNb250aHNDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RLZXlTZWxlY3RlZF09XCJsaXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmbGFnTW91c2VdPVwiZmxhZ01vdXNlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2h0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRdPVwibW9udGhIdHRwRGV0YWlsQ29uZmlnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdGVkRHJvcGRvd24oJGV2ZW50LCBzaWRlRW51bS5sZWZ0ICsgJ21vbnRoJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCBzaWRlRW51bS5sZWZ0ICsgJ21vbnRoJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRDaGFuZ1N0YWdlRmxhZ01vdXNlKT1cImhhbmRsZXJDaGFuZ2VGbGFnTW91c2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNob3dMaXN0KT1cImhhbmRsZXJTaG93TGlzdERyb3Bkb3duKCRldmVudCwgc2lkZUVudW0ubGVmdCArICdtb250aCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRhcmspXV09XCJjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5sZWZ0ICsgJ21vbnRoJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtWyM2YTczODNdXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5sZWZ0ICsgJ21vbnRoJ11cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDRtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRTdHlsZV09XCInbm9ybWFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRlT3B0aW9ucygpLm1vbnRoTmFtZXMgJiYgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyICYmIGRhdGVPcHRpb25zKCkubW9udGhOYW1lc1tjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/LlsxXT8uWzFdPy5tb250aCgpID8/IC0xXSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHRleHQtWzEzcHhdIHRleHQtWyM2YTczODNdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGFyayldXT1cImNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLmxlZnQgKyAnbW9udGgnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5yb3RhdGVdPVwiIWNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLmxlZnQgKyAnbW9udGgnXSA/ICc5MGRlZycgOiAnMjcwZGVnJ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKSArIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cInsgd2lkdGhCeVBhcmVudDogZmFsc2UsIGlnbm9yZUFycm93OiB0cnVlLCBwYWRkaW5nTGVmdEl0ZW06IHRydWUsIGNsYXNzSW5jbHVkZTogJyF3LVsxMTBweF0nLCBwb3NpdGlvbjogeyBtb2RlOiAnY2VudGVyJywgZGlzdGFuY2U6IDAgfSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdENsaWNrRXhhY3RseV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RIYXNCdXR0b25VblNlbGVjdE9wdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnZlcnRJdGVtU2VsZWN0ZWRdPVwiY29udmVydEl0ZW1ZZWFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cImxpc3RZZWFySGlkZGVuSW5wdXRTZWFyY2goKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RDb25maWddPVwibGlzdExlZnRZZWFyQ29uZmlnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0S2V5U2VsZWN0ZWRdPVwibGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmbGFnTW91c2VdPVwiZmxhZ01vdXNlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkXT1cImxlZnRZZWFySHR0cERldGFpbENvbmZpZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0Q2hhbmdTdGFnZUZsYWdNb3VzZSk9XCJoYW5kbGVyQ2hhbmdlRmxhZ01vdXNlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTaG93TGlzdCk9XCJoYW5kbGVyU2hvd0xpc3REcm9wZG93bigkZXZlbnQsIHNpZGVFbnVtLmxlZnQgKyAneWVhcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZERyb3Bkb3duKCRldmVudCwgc2lkZUVudW0ubGVmdCArICd5ZWFyJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCBzaWRlRW51bS5sZWZ0ICsgJ3llYXInKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ubGVmdCArICd5ZWFyJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtWyM2YTczODNdXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5sZWZ0ICsgJ3llYXInXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktZm9udC1oNG1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFdlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFN0eWxlXT1cIidub3JtYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/LlsxXT8uWzFdPy5mb3JtYXQoJyBZWVlZJykgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCB0ZXh0LVsxM3B4XSB0ZXh0LVsjNmE3MzgzXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRhcmspXV09XCJjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5sZWZ0ICsgJ3llYXInXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5yb3RhdGVdPVwiIWNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLmxlZnQgKyAneWVhciddID8gJzkwZGVnJyA6ICcyNzBkZWcnXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS80IGZsZXggaXRlbXMtY2VudGVyIHJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCFjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkubWluRGF0ZSB8fCBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkubWluRGF0ZT8uaXNCZWZvcmUoY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhcj8uZmlyc3REYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImhhbmRsZXJDbGlja1ByZXYoc2lkZUVudW0ubGVmdClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYWJzb2x1dGUgbGVmdC0wIHRvcC1bLTNweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgcm90YXRlLVsxODBkZWddIHRleHQtWyM2YTczODNdIGN1cnNvci1wb2ludGVyIGxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXItaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCghY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLm1heERhdGUgfHwgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLm1heERhdGU/LmlzQWZ0ZXIoY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbGVuZGFyICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhcj8ubGFzdERheSkpICYmIGlzU2luZ2xlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiaGFuZGxlckNsaWNrTmV4dChzaWRlRW51bS5sZWZ0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBtbC1bMTJweF0gYWJzb2x1dGUgcmlnaHQtMCB0b3AtWy0zcHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHRleHQtWyM2YTczODNdIGN1cnNvci1wb2ludGVyIGxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXItaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGlmICghc2hvd0Ryb3Bkb3duc1NlbGVjdCgpIHx8ICFjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuZHJvcGRvd25zKSB7XG4gICAgICAgICAgICAgICAgICAgIHt7IGRhdGVPcHRpb25zKCkubW9udGhOYW1lcyAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiYgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzW2NhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhcj8uWzFdPy5bMV0/Lm1vbnRoKCkgPz8gLTFdIH19XG4gICAgICAgICAgICAgICAgICAgIHt7IGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/LlsxXT8uWzFdPy5mb3JtYXQoJyBZWVlZJykgfX1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJ3ZWVrLWRheXNcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChkYXlvZndlZWsgb2YgZGF0ZU9wdGlvbnMoKS5kYXlzT2ZXZWVrOyB0cmFjayBkYXlvZndlZWspIHtcbiAgICAgICAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktZm9udC1oNm0gdGV4dC1bIzZhNzM4M11cIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRTdHlsZV09XCInbm9ybWFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGRheW9md2VlayB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJkcnAtYW5pbWF0ZVwiPlxuICAgICAgICAgICAgICBAZm9yIChyb3cgb2YgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbFJvd3M/LigpOyB0cmFjayByb3cpIHtcbiAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC1bMzJweF1cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jbGFzc2VzICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jbGFzc2VzPy5bcm93XT8uY2xhc3NMaXN0XCI+XG4gICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY2FsZW5kYXJWYXJpYWJsZXMubGVmdCgpLmNhbENvbHM/LigpOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudG9kYXldPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhcj8uW3Jvd10/Lltjb2xdPy5kYXRlKCkgPT09IHRvZGF5KCkuZGF0ZSgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8ubW9udGgoKSA9PT0gdG9kYXkoKS5tb250aCgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8ueWVhcigpID09PSB0b2RheSgpLnllYXIoKVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jbGFzc2VzICYmIGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jbGFzc2VzPy5bcm93XT8uW2NvbF1cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyUGlja2VyRGF0ZSgkZXZlbnQsIHNpZGVFbnVtLmxlZnQsIHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlckhvdmVyRGF0ZSgkZXZlbnQsIHNpZGVFbnVtLmxlZnQsIHJvdywgY29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGlicy11aS1mb250LWg1clwiPnt7IGNhbGVuZGFyVmFyaWFibGVzLmxlZnQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcy5sZWZ0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8uZGF0ZSgpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICBAaWYgKGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyIGNvbHVtbiBpdGVtcy1jZW50ZXIgcHQtWzEycHhdXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHJvdW5kZWQtWzRweF0gYm9yZGVyXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1bI2U2ZThlZF1dPVwiIXRpbWVQaWNrZXJFcnJvcigpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1bI2ZmNTQ1NF1dPVwidGltZVBpY2tlckVycm9yKClcIj5cbiAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtaW5wdXRcbiAgICAgICAgICAgICAgICBjbGFzc0luY2x1ZGU9XCIhdy1bMzBweF0gIXAtMCAhYm9yZGVyLW5vbmUgIXRleHQtY2VudGVyIGxpYnMtdWktZm9udC1oNHMgIXRleHQtWyMwNzE2MzFdXCJcbiAgICAgICAgICAgICAgICBkYXRhVHlwZT1cImludFwiXG4gICAgICAgICAgICAgICAgW2ZvY3VzVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICBbYmx1clRpbWVPdXRdPVwiMFwiXG4gICAgICAgICAgICAgICAgW2F1dG9BZGRaZXJvTGVzc1RoYW4xMEluVHlwZUludF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbWF4VmFsdWVOdW1iZXJdPVwiMjNcIlxuICAgICAgICAgICAgICAgIFttaW5WYWx1ZU51bWJlcl09XCIwXCJcbiAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIjJcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdGhvdXIoKVwiXG4gICAgICAgICAgICAgICAgKG91dElucHV0RXZlbnQpPVwiaGFuZGxlcklucHV0RXZlbnQoJGV2ZW50LCAnbGVmdGhvdXInKVwiXG4gICAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbCgkZXZlbnQsIHNpZGVFbnVtLmxlZnQgKyAnaG91cicpXCJcbiAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VUaW1lVmFsdWUoJGV2ZW50LCAnbGVmdGhvdXInKVwiXG4gICAgICAgICAgICAgICAgKG91dEZvY3VzQW5kQmx1ckV2ZW50KT1cImhhbmRsZXJGb2N1c0FuZEJsdXJUaW1lKCRldmVudCwgJ2xlZnRob3VyJylcIiAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktZm9udC1oM3MgdGV4dC1bIzMzMzMzM11cIj46PC9zcGFuPlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy1pbnB1dFxuICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZT1cIiF3LVszMHB4XSAhcC0wICFib3JkZXItbm9uZSAhdGV4dC1jZW50ZXIgIWxpYnMtdWktZm9udC1oNHMgIXRleHQtWyMwNzE2MzFdXCJcbiAgICAgICAgICAgICAgICBbYXV0b0FkZFplcm9MZXNzVGhhbjEwSW5UeXBlSW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtlbWl0RW1wdHlJbkRhdGFUeXBlTnVtYmVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIGRhdGFUeXBlPVwiaW50XCJcbiAgICAgICAgICAgICAgICBbZm9jdXNUaW1lT3V0XT1cIjBcIlxuICAgICAgICAgICAgICAgIFtibHVyVGltZU91dF09XCIwXCJcbiAgICAgICAgICAgICAgICBbbWF4VmFsdWVOdW1iZXJdPVwiNTlcIlxuICAgICAgICAgICAgICAgIFttaW5WYWx1ZU51bWJlcl09XCIwXCJcbiAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIjJcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0aW1lcGlja2VyVmFsdWVJdGVtKCkubGVmdG1pbnV0ZSgpXCJcbiAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sKCRldmVudCwgc2lkZUVudW0ubGVmdCArICdtaW51dGUnKVwiXG4gICAgICAgICAgICAgICAgKG91dElucHV0RXZlbnQpPVwiaGFuZGxlcklucHV0RXZlbnQoJGV2ZW50LCAnbGVmdG1pbnV0ZScpXCJcbiAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VUaW1lVmFsdWUoJGV2ZW50LCAnbGVmdG1pbnV0ZScpXCJcbiAgICAgICAgICAgICAgICAob3V0Rm9jdXNBbmRCbHVyRXZlbnQpPVwiaGFuZGxlckZvY3VzQW5kQmx1clRpbWUoJGV2ZW50LCAnbGVmdG1pbnV0ZScpXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoIWlzU2luZ2xlKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyIHJpZ2h0IG1sLVsyNHB4XVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm91bmRlZC1bNHB4XSBiZy1bI2ZmZmZmZl1cIj5cbiAgICAgICAgICBAaWYgKGNhbGVuZGFyVmFyaWFibGVzKCkpIHtcbiAgICAgICAgICAgIDx0YWJsZT5cbiAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICBjb2xzcGFuPVwiN1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibW9udGhcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzaG93RHJvcGRvd25zU2VsZWN0KCkgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5sZWZ0KCkuZHJvcGRvd25zPy4oKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIhZmxleCBtYi1bMTBweF0gdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0zLzQgZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1yLVs4cHhdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKSArIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJDdXN0b21Db25maWddPVwieyB3aWR0aEJ5UGFyZW50OiBmYWxzZSwgaWdub3JlQXJyb3c6IHRydWUsIHBhZGRpbmdMZWZ0SXRlbTogdHJ1ZSwgY2xhc3NJbmNsdWRlOiAnIXctWzEzMHB4XScsIHBvc2l0aW9uOiB7IG1vZGU6ICdjZW50ZXInLCBkaXN0YW5jZTogMCB9IH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RNYXhJdGVtU2hvd109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdENsaWNrRXhhY3RseV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEtleXNEaXNhYmxlXT1cImRpc2FibGVNb250aCgpLnJpZ2h0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RIYXNCdXR0b25VblNlbGVjdE9wdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29udmVydEl0ZW1TZWxlY3RlZF09XCJjb252ZXJ0SXRlbU1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdENvbmZpZ109XCJsaXN0TW9udGhzQ29uZmlnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpc3RLZXlTZWxlY3RlZF09XCJsaXN0S2V5VG9TZWxlY3RlZCgpLm1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmbGFnTW91c2VdPVwiZmxhZ01vdXNlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2h0dHBSZXF1ZXN0RGV0YWlsSXRlbUJ5SWRdPVwibW9udGhIdHRwRGV0YWlsQ29uZmlnKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uQ29udHJvbCgkZXZlbnQsIHNpZGVFbnVtLnJpZ2h0ICsgJ21vbnRoJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0ZWREcm9wZG93bigkZXZlbnQsIHNpZGVFbnVtLnJpZ2h0ICsgJ21vbnRoJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2UpPVwiaGFuZGxlckNoYW5nZUZsYWdNb3VzZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTaG93TGlzdCk9XCJoYW5kbGVyU2hvd0xpc3REcm9wZG93bigkZXZlbnQsIHNpZGVFbnVtLnJpZ2h0ICsgJ21vbnRoJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWNvbXBvbmVudC1jdXN0b21fcmFuZ2VzLWNhbGVuZGFyLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGFyayldXT1cImNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLnJpZ2h0ICsgJ21vbnRoJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bIzZhNzM4M11dPVwiIWNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLnJpZ2h0ICsgJ21vbnRoJ11cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1mb250LWg0bVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGFyayldXT1cImNoZWNrU2hvd0xpc3REcm9wZG93bigpW3NpZGVFbnVtLnJpZ2h0ICsgJ21vbnRoJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRTdHlsZV09XCInbm9ybWFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGVPcHRpb25zKCkubW9udGhOYW1lcyAmJiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXIgJiYgZGF0ZU9wdGlvbnMoKS5tb250aE5hbWVzW2NhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8uWzFdPy5bMV0/Lm1vbnRoKCkgPz8gLTFdIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgdGV4dC1bMTNweF0gdGV4dC1bIzZhNzM4M11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnJvdGF0ZV09XCIhY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ucmlnaHQgKyAnbW9udGgnXSA/ICc5MGRlZycgOiAnMjcwZGVnJ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt6SW5kZXhdPVwiekluZGV4KCkgKyAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyQ3VzdG9tQ29uZmlnXT1cInsgd2lkdGhCeVBhcmVudDogZmFsc2UsIGlnbm9yZUFycm93OiB0cnVlLCBwYWRkaW5nTGVmdEl0ZW06IHRydWUsIGNsYXNzSW5jbHVkZTogJyF3LVsxMTBweF0nLCBwb3NpdGlvbjogeyBtb2RlOiAnY2VudGVyJywgZGlzdGFuY2U6IDAgfSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q2xpY2tFeGFjdGx5XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnZlcnRJdGVtU2VsZWN0ZWRdPVwiY29udmVydEl0ZW1ZZWFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwibGlzdFllYXJIaWRkZW5JbnB1dFNlYXJjaCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RSaWdodFllYXJDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdEtleVNlbGVjdGVkXT1cImxpc3RLZXlUb1NlbGVjdGVkKCkueWVhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmxhZ01vdXNlXT1cImZsYWdNb3VzZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkXT1cInJpZ2h0WWVhckh0dHBEZXRhaWxDb25maWcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RlZERyb3Bkb3duKCRldmVudCwgc2lkZUVudW0ucmlnaHQgKyAneWVhcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCBzaWRlRW51bS5yaWdodCArICd5ZWFyJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dENoYW5nU3RhZ2VGbGFnTW91c2UpPVwiaGFuZGxlckNoYW5nZUZsYWdNb3VzZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRTaG93TGlzdCk9XCJoYW5kbGVyU2hvd0xpc3REcm9wZG93bigkZXZlbnQsIHNpZGVFbnVtLnJpZ2h0ICsgJ3llYXInKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXItZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kYXJrKV1dPVwiY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ucmlnaHQgKyAneWVhciddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtWyM2YTczODNdXT1cIiFjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5yaWdodCArICd5ZWFyJ11cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1mb250LWg0bVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZm9udFN0eWxlXT1cIidub3JtYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyICYmIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8uWzFdPy5bMV0/LmZvcm1hdCgnWVlZWScpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1pY29uLWNoZXZyb24tcmlnaHQgdGV4dC1bMTNweF0gdGV4dC1bIzZhNzM4M11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRhcmspXV09XCJjaGVja1Nob3dMaXN0RHJvcGRvd24oKVtzaWRlRW51bS5yaWdodCArICd5ZWFyJ11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250V2VpZ2h0XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnJvdGF0ZV09XCIhY2hlY2tTaG93TGlzdERyb3Bkb3duKClbc2lkZUVudW0ucmlnaHQgKyAneWVhciddID8gJzkwZGVnJyA6ICcyNzBkZWcnXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzQgZmxleCBpdGVtcy1jZW50ZXIgcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdEtleUZyb21TZWxlY3RlZCgpLnllYXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RLZXlUb1NlbGVjdGVkKCkueWVhciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShsaXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciArIDEgPT09IGxpc3RLZXlUb1NlbGVjdGVkKCkueWVhciAmJiBsaXN0S2V5RnJvbVNlbGVjdGVkKCkubW9udGggPT09IDEyICYmIGxpc3RLZXlUb1NlbGVjdGVkKCkubW9udGggPT09IDEpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciA8IGxpc3RLZXlUb1NlbGVjdGVkKCkueWVhcikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICYmIGxpc3RLZXlUb1NlbGVjdGVkKCkubW9udGggJiYgbGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICsgMSA8ICtsaXN0S2V5VG9TZWxlY3RlZCgpLm1vbnRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGFic29sdXRlIGxlZnQtMCB0b3AtWy0zcHhdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyQ2xpY2tQcmV2KHNpZGVFbnVtLnJpZ2h0KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tY2hldnJvbi1yaWdodCByb3RhdGUtWzE4MGRlZ10gdGV4dC1bIzZhNzM4M10gY3Vyc29yLXBvaW50ZXIgbGlicy11aS1jb21wb25lbnQtY3VzdG9tX3Jhbmdlcy1jYWxlbmRhci1pY29uXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEtleUZyb21TZWxlY3RlZCgpLm1vbnRoICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEtleVRvU2VsZWN0ZWQoKS5tb250aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS5tb250aCA+IGxpc3RLZXlUb1NlbGVjdGVkKCkubW9udGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0S2V5RnJvbVNlbGVjdGVkKCkueWVhciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RLZXlUb1NlbGVjdGVkKCkueWVhciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RLZXlGcm9tU2VsZWN0ZWQoKS55ZWFyID09PSBsaXN0S2V5VG9TZWxlY3RlZCgpLnllYXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJnLVsjZmZmZmZmXSB3LVsyMXB4XSBoLVsyMXB4XSBjdXJzb3Itbm9uZSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLVs1MHB4XVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5tYXhEYXRlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJWYXJpYWJsZXMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJpZ2h0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhEYXRlPy5pc0FmdGVyKGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXI/Lmxhc3REYXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImhhbmRsZXJDbGlja05leHQoc2lkZUVudW0ucmlnaHQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbWwtWzEycHhdIGFic29sdXRlIHJpZ2h0LTAgdG9wLVstM3B4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1jaGV2cm9uLXJpZ2h0IHRleHQtWyM2YTczODNdIGN1cnNvci1wb2ludGVyIGxpYnMtdWktY29tcG9uZW50LWN1c3RvbV9yYW5nZXMtY2FsZW5kYXItaWNvblwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKCFzaG93RHJvcGRvd25zU2VsZWN0KCkgfHwgIWNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5kcm9wZG93bnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRlT3B0aW9ucygpLm1vbnRoTmFtZXMgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbGVuZGFyICYmIGRhdGVPcHRpb25zKCkubW9udGhOYW1lc1tjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXI/LlsxXT8uWzFdPy5tb250aCgpID8/IC0xXSB9fVxuICAgICAgICAgICAgICAgICAgICAgIHt7IGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhciAmJiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXI/LlsxXT8uWzFdPy5mb3JtYXQoJ1lZWVknKSB9fVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwid2Vlay1kYXlzXCI+XG4gICAgICAgICAgICAgICAgICBAZm9yIChkYXlvZndlZWsgb2YgZGF0ZU9wdGlvbnMoKS5kYXlzT2ZXZWVrOyB0cmFjayBkYXlvZndlZWspIHtcbiAgICAgICAgICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktZm9udC1oNm0gdGV4dC1bIzZhNzM4M11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZvbnRXZWlnaHRdPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mb250U3R5bGVdPVwiJ25vcm1hbCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRheW9md2VlayB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgQGZvciAocm93IG9mIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxSb3dzPy4oKTsgdHJhY2sgcm93KSB7XG4gICAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLVszMnB4XVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2xhc3NlcyAmJiBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2xhc3Nlcz8uW3Jvd10/LmNsYXNzTGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNhbENvbHM/LigpOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1mb250LWg1clwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNsYXNzZXMgJiYgY2FsZW5kYXJWYXJpYWJsZXMoKS5yaWdodCgpLmNsYXNzZXM/Lltyb3ddPy5bY29sXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudG9kYXldPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8uZGF0ZSgpID09PSB0b2RheSgpLmRhdGUoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8ubW9udGgoKSA9PT0gdG9kYXkoKS5tb250aCgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhclZhcmlhYmxlcygpLnJpZ2h0KCkuY2FsZW5kYXI/Lltyb3ddPy5bY29sXT8ueWVhcigpID09PSB0b2RheSgpLnllYXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyUGlja2VyRGF0ZSgkZXZlbnQsIHNpZGVFbnVtLnJpZ2h0LCByb3csIGNvbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlckhvdmVyRGF0ZSgkZXZlbnQsIHNpZGVFbnVtLnJpZ2h0LCByb3csIGNvbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNhbGVuZGFyVmFyaWFibGVzKCkucmlnaHQoKS5jYWxlbmRhcj8uW3Jvd10/Lltjb2xdPy5kYXRlKCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAoaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBwdC1bMTJweF1cIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIHJvdW5kZWQtWzRweF0gYm9yZGVyXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyLVsjZTZlOGVkXV09XCIhdGltZVBpY2tlckVycm9yKClcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItWyNmZjU0NTRdXT1cInRpbWVQaWNrZXJFcnJvcigpXCI+XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtaW5wdXRcbiAgICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZT1cIiF3LVszMHB4XSAhcC0wICFib3JkZXItbm9uZSAhdGV4dC1jZW50ZXIgIWxpYnMtdWktZm9udC1oNHMgIXRleHQtWyMwNzE2MzFdXCJcbiAgICAgICAgICAgICAgICAgIGRhdGFUeXBlPVwiaW50XCJcbiAgICAgICAgICAgICAgICAgIFthdXRvQWRkWmVyb0xlc3NUaGFuMTBJblR5cGVJbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFttYXhWYWx1ZU51bWJlcl09XCIyM1wiXG4gICAgICAgICAgICAgICAgICBbbWluVmFsdWVOdW1iZXJdPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbZm9jdXNUaW1lT3V0XT1cIjBcIlxuICAgICAgICAgICAgICAgICAgW2JsdXJUaW1lT3V0XT1cIjBcIlxuICAgICAgICAgICAgICAgICAgW21heExlbmd0aF09XCIyXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRob3VyKClcIlxuICAgICAgICAgICAgICAgICAgKG91dENoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlVGltZVZhbHVlKCRldmVudCwgJ3JpZ2h0aG91cicpXCJcbiAgICAgICAgICAgICAgICAgIChvdXRJbnB1dEV2ZW50KT1cImhhbmRsZXJJbnB1dEV2ZW50KCRldmVudCwgJ3JpZ2h0aG91cicpXCJcbiAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCAncmlnaHRob3VyJylcIlxuICAgICAgICAgICAgICAgICAgKG91dEZvY3VzQW5kQmx1ckV2ZW50KT1cImhhbmRsZXJGb2N1c0FuZEJsdXJUaW1lKCRldmVudCwgJ3JpZ2h0aG91cicpXCIgLz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktZm9udC1oM3MgdGV4dC1bIzMzMzMzM11cIj46PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLWlucHV0XG4gICAgICAgICAgICAgICAgICBjbGFzc0luY2x1ZGU9XCIhdy1bMzBweF0gIXAtMCAhYm9yZGVyLW5vbmUgIXRleHQtY2VudGVyIGxpYnMtdWktZm9udC1oNHMgIXRleHQtWyMwNzE2MzFdXCJcbiAgICAgICAgICAgICAgICAgIGRhdGFUeXBlPVwiaW50XCJcbiAgICAgICAgICAgICAgICAgIFthdXRvQWRkWmVyb0xlc3NUaGFuMTBJblR5cGVJbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFttYXhWYWx1ZU51bWJlcl09XCI1OVwiXG4gICAgICAgICAgICAgICAgICBbbWluVmFsdWVOdW1iZXJdPVwiMFwiXG4gICAgICAgICAgICAgICAgICBbZm9jdXNUaW1lT3V0XT1cIjBcIlxuICAgICAgICAgICAgICAgICAgW2JsdXJUaW1lT3V0XT1cIjBcIlxuICAgICAgICAgICAgICAgICAgW21heExlbmd0aF09XCIyXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0aW1lcGlja2VyVmFsdWVJdGVtKCkucmlnaHRtaW51dGUoKVwiXG4gICAgICAgICAgICAgICAgICAob3V0SW5wdXRFdmVudCk9XCJoYW5kbGVySW5wdXRFdmVudCgkZXZlbnQsICdyaWdodG1pbnV0ZScpXCJcbiAgICAgICAgICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50LCAncmlnaHRtaW51dGUnKVwiXG4gICAgICAgICAgICAgICAgICAob3V0Q2hhbmdlKT1cImhhbmRsZXJDaGFuZ2VUaW1lVmFsdWUoJGV2ZW50LCAncmlnaHRtaW51dGUnKVwiXG4gICAgICAgICAgICAgICAgICAob3V0Rm9jdXNBbmRCbHVyRXZlbnQpPVwiaGFuZGxlckZvY3VzQW5kQmx1clRpbWUoJGV2ZW50LCAncmlnaHRtaW51dGUnKVwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG4gIDxkaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsXCI+XG4gICAgICBAaWYgKCFpc1NpbmdsZSgpICYmIGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtWzhweF0gbGlicy11aS1mb250LWg3ciB0ZXh0LVsjZmY1NDU0XSBoLVsxNHB4XVwiPlxuICAgICAgICAgIEBpZiAodGltZVBpY2tlckVycm9yKCkpIHtcbiAgICAgICAgICAgIDxzcGFuPnt7ICdpMThuX2RhdGVfY29tcGFyZV9zdGFydF9lbmRfbWVzc2FnZV9lcnJvcicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICBAaWYgKCFxdWlja1Jhbmdlc0FycmF5KCkubGVuZ3RoIHx8ICFpc1NpbmdsZSgpKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgcHQtWzE2cHhdIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICBAaWYgKCFpc1NpbmdsZSgpKSB7XG4gICAgICAgICAgICBAaWYgKCFlbmREYXRlKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtWyNjZGQwZDZdIGxpYnMtdWktZm9udC1oNnJcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBzdGFydERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChoYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNvbXB1dGVkRGlzcGxheVRpbWVMZWZ0KCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICZoeXBoZW47XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgc3RhcnREYXRlKCk/LmZvcm1hdCgnREQvTU0vWVlZWScpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIEBpZiAoaGFzVGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjb21wdXRlZERpc3BsYXlUaW1lUmlnaHQoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChlbmREYXRlKCkpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtWyNjZGQwZDZdIGxpYnMtdWktZm9udC1oNnJcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBzdGFydERhdGUoKT8uZm9ybWF0KCdERC9NTS9ZWVlZJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChoYXNUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNvbXB1dGVkRGlzcGxheVRpbWVMZWZ0KCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICZoeXBoZW47XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgZW5kRGF0ZSgpPy5mb3JtYXQoJ0REL01NL1lZWVknKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICBAaWYgKGhhc1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgY29tcHV0ZWREaXNwbGF5VGltZVJpZ2h0KCkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJtci1bMTJweF1cIlxuICAgICAgICAgICAgbGFiZWw9XCJpMThuX2NhbmNlbFwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uLXRoaXJkXCJcbiAgICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2tDYW5jZWwoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgbGFiZWw9XCJpMThuX3NlbGVjdFwiXG4gICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrQXBwbHkoJGV2ZW50KVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbjwvZGl2PlxuIl19