@fundamental-ngx/core 0.43.16 → 0.43.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/calendar/calendar-directives.d.ts +11 -9
  2. package/calendar/calendar-header/calendar-header.component.d.ts +5 -23
  3. package/calendar/calendar-views/calendar-aggregated-year-view/calendar-aggregated-year-view.component.d.ts +1 -20
  4. package/calendar/calendar-views/calendar-day-view/calendar-day-view.component.d.ts +3 -41
  5. package/calendar/calendar-views/calendar-month-view/calendar-month-view.component.d.ts +1 -20
  6. package/calendar/calendar-views/calendar-year-view/calendar-year-view.component.d.ts +1 -20
  7. package/calendar/calendar.module.d.ts +2 -1
  8. package/calendar/i18n/calendar-i18n-labels.d.ts +20 -22
  9. package/calendar/patch-deprecated-i18n-labels.d.ts +6 -0
  10. package/combobox/combobox.component.d.ts +9 -7
  11. package/esm2020/calendar/calendar-directives.mjs +27 -20
  12. package/esm2020/calendar/calendar-header/calendar-header.component.mjs +30 -60
  13. package/esm2020/calendar/calendar-views/calendar-aggregated-year-view/calendar-aggregated-year-view.component.mjs +9 -34
  14. package/esm2020/calendar/calendar-views/calendar-day-view/calendar-day-view.component.mjs +10 -62
  15. package/esm2020/calendar/calendar-views/calendar-month-view/calendar-month-view.component.mjs +9 -34
  16. package/esm2020/calendar/calendar-views/calendar-year-view/calendar-year-view.component.mjs +9 -34
  17. package/esm2020/calendar/calendar.component.mjs +13 -3
  18. package/esm2020/calendar/calendar.module.mjs +5 -4
  19. package/esm2020/calendar/i18n/calendar-i18n-labels.mjs +22 -28
  20. package/esm2020/calendar/patch-deprecated-i18n-labels.mjs +26 -0
  21. package/esm2020/combobox/combobox.component.mjs +20 -9
  22. package/esm2020/date-picker/date-picker.component.mjs +1 -1
  23. package/esm2020/datetime-picker/datetime-picker.component.mjs +1 -1
  24. package/esm2020/input-group/input-group.component.mjs +6 -4
  25. package/esm2020/multi-combobox/multi-combobox.component.mjs +15 -17
  26. package/esm2020/multi-input/multi-input.component.mjs +13 -11
  27. package/esm2020/popover/base/base-popover.class.mjs +2 -2
  28. package/esm2020/popover/popover-body/popover-body.component.mjs +2 -2
  29. package/esm2020/select/select.component.mjs +3 -3
  30. package/esm2020/table/table-wrapper.component.mjs +2 -2
  31. package/esm2020/table/table.component.mjs +2 -2
  32. package/esm2020/time-picker/time-picker.component.mjs +1 -1
  33. package/esm2020/token/token.component.mjs +10 -8
  34. package/esm2020/token/tokenizer.component.mjs +5 -4
  35. package/fesm2015/fundamental-ngx-core-calendar.mjs +156 -282
  36. package/fesm2015/fundamental-ngx-core-calendar.mjs.map +1 -1
  37. package/fesm2015/fundamental-ngx-core-combobox.mjs +16 -6
  38. package/fesm2015/fundamental-ngx-core-combobox.mjs.map +1 -1
  39. package/fesm2015/fundamental-ngx-core-date-picker.mjs +1 -1
  40. package/fesm2015/fundamental-ngx-core-date-picker.mjs.map +1 -1
  41. package/fesm2015/fundamental-ngx-core-datetime-picker.mjs +1 -1
  42. package/fesm2015/fundamental-ngx-core-datetime-picker.mjs.map +1 -1
  43. package/fesm2015/fundamental-ngx-core-input-group.mjs +5 -3
  44. package/fesm2015/fundamental-ngx-core-input-group.mjs.map +1 -1
  45. package/fesm2015/fundamental-ngx-core-multi-combobox.mjs +10 -13
  46. package/fesm2015/fundamental-ngx-core-multi-combobox.mjs.map +1 -1
  47. package/fesm2015/fundamental-ngx-core-multi-input.mjs +11 -9
  48. package/fesm2015/fundamental-ngx-core-multi-input.mjs.map +1 -1
  49. package/fesm2015/fundamental-ngx-core-popover.mjs +2 -2
  50. package/fesm2015/fundamental-ngx-core-popover.mjs.map +1 -1
  51. package/fesm2015/fundamental-ngx-core-select.mjs +2 -2
  52. package/fesm2015/fundamental-ngx-core-select.mjs.map +1 -1
  53. package/fesm2015/fundamental-ngx-core-table.mjs +4 -4
  54. package/fesm2015/fundamental-ngx-core-table.mjs.map +1 -1
  55. package/fesm2015/fundamental-ngx-core-time-picker.mjs +1 -1
  56. package/fesm2015/fundamental-ngx-core-time-picker.mjs.map +1 -1
  57. package/fesm2015/fundamental-ngx-core-token.mjs +11 -9
  58. package/fesm2015/fundamental-ngx-core-token.mjs.map +1 -1
  59. package/fesm2020/fundamental-ngx-core-calendar.mjs +162 -282
  60. package/fesm2020/fundamental-ngx-core-calendar.mjs.map +1 -1
  61. package/fesm2020/fundamental-ngx-core-combobox.mjs +18 -7
  62. package/fesm2020/fundamental-ngx-core-combobox.mjs.map +1 -1
  63. package/fesm2020/fundamental-ngx-core-date-picker.mjs +1 -1
  64. package/fesm2020/fundamental-ngx-core-date-picker.mjs.map +1 -1
  65. package/fesm2020/fundamental-ngx-core-datetime-picker.mjs +1 -1
  66. package/fesm2020/fundamental-ngx-core-datetime-picker.mjs.map +1 -1
  67. package/fesm2020/fundamental-ngx-core-input-group.mjs +5 -3
  68. package/fesm2020/fundamental-ngx-core-input-group.mjs.map +1 -1
  69. package/fesm2020/fundamental-ngx-core-multi-combobox.mjs +10 -12
  70. package/fesm2020/fundamental-ngx-core-multi-combobox.mjs.map +1 -1
  71. package/fesm2020/fundamental-ngx-core-multi-input.mjs +11 -9
  72. package/fesm2020/fundamental-ngx-core-multi-input.mjs.map +1 -1
  73. package/fesm2020/fundamental-ngx-core-popover.mjs +2 -2
  74. package/fesm2020/fundamental-ngx-core-popover.mjs.map +1 -1
  75. package/fesm2020/fundamental-ngx-core-select.mjs +2 -2
  76. package/fesm2020/fundamental-ngx-core-select.mjs.map +1 -1
  77. package/fesm2020/fundamental-ngx-core-table.mjs +4 -4
  78. package/fesm2020/fundamental-ngx-core-table.mjs.map +1 -1
  79. package/fesm2020/fundamental-ngx-core-time-picker.mjs +1 -1
  80. package/fesm2020/fundamental-ngx-core-time-picker.mjs.map +1 -1
  81. package/fesm2020/fundamental-ngx-core-token.mjs +11 -9
  82. package/fesm2020/fundamental-ngx-core-token.mjs.map +1 -1
  83. package/fundamental-ngx-core-v0.43.17.tgz +0 -0
  84. package/input-group/input-group.component.d.ts +7 -1
  85. package/multi-combobox/multi-combobox.component.d.ts +1 -1
  86. package/multi-input/multi-input.component.d.ts +5 -3
  87. package/package.json +3 -3
  88. package/schematics/add-dependencies/index.js +4 -4
  89. package/token/token.component.d.ts +4 -2
  90. package/fundamental-ngx-core-v0.43.16.tgz +0 -0
@@ -6,12 +6,11 @@ import equal from 'fast-deep-equal';
6
6
  import { DateRange } from '../../models/date-range';
7
7
  import { ActiveCalendarDayCellStrategy as CalendarActiveDayCellStrategy } from '../../models/calendar-day';
8
8
  import { CalendarService } from '../../calendar.service';
9
- import { CalendarI18nLabels } from '../../i18n/calendar-i18n-labels';
10
9
  import * as i0 from "@angular/core";
11
10
  import * as i1 from "../../calendar.service";
12
11
  import * as i2 from "@fundamental-ngx/core/datetime";
13
- import * as i3 from "../../i18n/calendar-i18n-labels";
14
- import * as i4 from "@angular/common";
12
+ import * as i3 from "@angular/common";
13
+ import * as i4 from "@fundamental-ngx/i18n";
15
14
  /** Component representing the day view of the calendar. */
16
15
  export class CalendarDayViewComponent {
17
16
  /** Currently displayed month and year for days */
@@ -52,13 +51,12 @@ export class CalendarDayViewComponent {
52
51
  return this._selectedRangeDate;
53
52
  }
54
53
  /** @hidden */
55
- constructor(eRef, changeDetRef, calendarService, _dateTimeFormats, _dateTimeAdapter, _calendarI18nLabels) {
54
+ constructor(eRef, changeDetRef, calendarService, _dateTimeFormats, _dateTimeAdapter) {
56
55
  this.eRef = eRef;
57
56
  this.changeDetRef = changeDetRef;
58
57
  this.calendarService = calendarService;
59
58
  this._dateTimeFormats = _dateTimeFormats;
60
59
  this._dateTimeAdapter = _dateTimeAdapter;
61
- this._calendarI18nLabels = _calendarI18nLabels;
62
60
  /** The type of calendar, 'single' for single date selection or 'range' for a range of dates. */
63
61
  this.calType = 'single';
64
62
  /**
@@ -135,6 +133,7 @@ export class CalendarDayViewComponent {
135
133
  /**
136
134
  * Function for selecting a date on the calendar. Typically called when a date is clicked, but can also be called programmatically.
137
135
  * @param day CalendarDay object to be selected.
136
+ * @param event
138
137
  */
139
138
  selectDate(day, event) {
140
139
  if (event) {
@@ -264,57 +263,6 @@ export class CalendarDayViewComponent {
264
263
  return totalCalendarRows.concat(calendarRow);
265
264
  });
266
265
  }
267
- /**
268
- * @hidden
269
- * Today cell label.
270
- * Is used in conjunction with cell date itself
271
- */
272
- get _todayAriaLabel() {
273
- return this._calendarI18nLabels.todayLabel;
274
- }
275
- /**
276
- * @hidden
277
- * Selected date cell label.
278
- * Is used in conjunction with cell date itself
279
- */
280
- get _selectedDateAriaLabel() {
281
- return this._calendarI18nLabels.dateSelectedLabel;
282
- }
283
- /**
284
- * @hidden
285
- * column label
286
- */
287
- get _weekColumnLabelAriaLabel() {
288
- return this._calendarI18nLabels.weekColumnLabel;
289
- }
290
- /**
291
- * @hidden
292
- * Range start label
293
- */
294
- get _rangeStartAriaLabel() {
295
- return this._calendarI18nLabels.rangeStartLabel;
296
- }
297
- /**
298
- * @hidden
299
- * Range end label
300
- */
301
- get _rangeEndAriaLabel() {
302
- return this._calendarI18nLabels.rangeEndLabel;
303
- }
304
- /**
305
- * @hidden
306
- * Date in past label
307
- */
308
- get _dateInPastAriaLabel() {
309
- return this._calendarI18nLabels.dayInPastLabel;
310
- }
311
- /**
312
- * @hidden
313
- * View description
314
- */
315
- get _viewRoleDescription() {
316
- return this._calendarI18nLabels.calendarDayViewDescription;
317
- }
318
266
  /**
319
267
  * View ID
320
268
  */
@@ -368,7 +316,7 @@ export class CalendarDayViewComponent {
368
316
  * Method that handles day cells keydown events,
369
317
  * @param event KeyboardEvent
370
318
  * @param cell CalendarDay
371
- * @param grid with specified column and row as a x and y
319
+ * @param index
372
320
  */
373
321
  _onKeydownDayHandler(event, cell, index) {
374
322
  if (event.key === 'Tab' && !event.shiftKey) {
@@ -768,18 +716,18 @@ export class CalendarDayViewComponent {
768
716
  this._focusElementBySelector(`#${this._getCellIdByIndex(index)}`);
769
717
  }
770
718
  }
771
- CalendarDayViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CalendarDayViewComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.CalendarService }, { token: DATE_TIME_FORMATS }, { token: i2.DatetimeAdapter }, { token: i3.CalendarI18nLabels }], target: i0.ɵɵFactoryTarget.Component });
772
- CalendarDayViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: CalendarDayViewComponent, selector: "fd-calendar-day-view", inputs: { currentlyDisplayed: "currentlyDisplayed", selectedDate: "selectedDate", selectedRangeDate: "selectedRangeDate", startingDayOfWeek: "startingDayOfWeek", calType: "calType", id: "id", rangeHoverEffect: "rangeHoverEffect", markWeekends: "markWeekends", showWeekNumbers: "showWeekNumbers", focusEscapeFunction: "focusEscapeFunction", specialDaysRules: "specialDaysRules", disableFunction: "disableFunction", disableRangeStartFunction: "disableRangeStartFunction", disableRangeEndFunction: "disableRangeEndFunction" }, outputs: { selectedRangeDateChange: "selectedRangeDateChange", nextMonthSelect: "nextMonthSelect", previousMonthSelect: "previousMonthSelect", selectedDateChange: "selectedDateChange" }, host: { properties: { "attr.id": "viewId" }, classAttribute: "fd-calendar__dates" }, usesOnChanges: true, ngImport: i0, template: "<table class=\"fd-calendar__table\" role=\"grid\" [attr.aria-roledescription]=\"_viewRoleDescription\">\n <thead class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n [attr.id]=\"_weekNumbersColumnHeaderId\"\n [attr.aria-label]=\"_weekColumnLabelAriaLabel\"\n ></th>\n <th\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n *ngFor=\"let day of shortWeekDays; index as i\"\n [attr.aria-label]=\"longWeekDays[i]\"\n >\n <span class=\"fd-calendar__text\">{{ day }}</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\" *ngFor=\"let row of _dayViewGrid; let rowIndex = index\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"rowheader\"\n scope=\"row\"\n [attr.data-fd-calendar-week]=\"_weeks[rowIndex]\"\n [attr.id]=\"viewId + '-week-' + _weeks[rowIndex]\"\n [attr.aria-labelledby]=\"_weekNumbersColumnHeaderId + ' ' + (viewId + '-week-' + _weeks[rowIndex])\"\n >\n <span *ngIf=\"_weeks && _weeks[rowIndex]\" class=\"fd-calendar__text\">\n {{ _weeks[rowIndex] }}\n </span>\n </th>\n\n <td\n class=\"fd-calendar__item\"\n role=\"gridcell\"\n *ngFor=\"let cell of row; let cellIndex = index\"\n [class.is-active]=\"cell.selectedFirst || cell.selectedLast || cell.selected\"\n [class.fd-calendar__item--range]=\"\n (cell.selectedRange || cell.hoverRange) && !cell.selectedFirst && !cell.selectedLast\n \"\n [class.fd-calendar__item--current]=\"cell.current\"\n [class.fd-calendar__item--weekend]=\"cell.weekend && markWeekends && cell.monthStatus === 'current'\"\n [class.fd-calendar__item--other-month]=\"cell.monthStatus !== 'current'\"\n [class.is-disabled]=\"cell.disabled\"\n [class]=\"cell.specialNumber ? 'fd-calendar__special-day--' + cell.specialNumber : ''\"\n [attr.id]=\"cell.id\"\n [attr.data-fd-calendar-date-day]=\"cell.label\"\n [attr.data-fd-calendar-day]=\"cell.index\"\n [attr.aria-selected]=\"cell.selected\"\n [attr.aria-disabled]=\"cell.disabled\"\n [attr.tabindex]=\"cell.isTabIndexed ? 0 : -1\"\n (click)=\"selectDate(cell, $event)\"\n (mouseenter)=\"_refreshHoverRange(cell)\"\n (keydown)=\"_onKeydownDayHandler($event, cell, _getIndex(rowIndex, cellIndex))\"\n >\n <span\n class=\"fd-calendar__text\"\n role=\"button\"\n [attr.aria-labelledby]=\"\n cell.id +\n '-aria-label ' +\n (cell.selectedFirst ? _dateRangeStartLabelId + ' ' : '') +\n (cell.selectedLast ? _dateRangeEndLabelId + ' ' : '') +\n (cell.current ? _todayLabelId + ' ' : '') +\n (cell.selected && calType === 'single' ? _selectedDateLabelId + ' ' : '') +\n (cell.past ? _dateInPastLabelId : '')\n \"\n >{{ cell.label }}</span\n >\n <span hidden aria-hidden=\"true\" [attr.id]=\"cell.id + '-aria-label'\">\n {{ cell.ariaLabel }}\n </span>\n </td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length <= 5\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length === 4\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n </tbody>\n</table>\n\n<!-- Hidden elements for aria purposes -->\n<div hidden aria-hidden=\"true\">\n <div [attr.id]=\"_todayLabelId\">{{ _todayAriaLabel }}</div>\n <div [attr.id]=\"_selectedDateLabelId\">{{ _selectedDateAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeStartLabelId\">{{ _rangeStartAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeEndLabelId\">{{ _rangeEndAriaLabel }}</div>\n <div [attr.id]=\"_dateInPastLabelId\">{{ _dateInPastAriaLabel }}</div>\n</div>\n", styles: [".hidden-day{visibility:hidden}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
719
+ CalendarDayViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CalendarDayViewComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.CalendarService }, { token: DATE_TIME_FORMATS }, { token: i2.DatetimeAdapter }], target: i0.ɵɵFactoryTarget.Component });
720
+ CalendarDayViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: CalendarDayViewComponent, selector: "fd-calendar-day-view", inputs: { currentlyDisplayed: "currentlyDisplayed", selectedDate: "selectedDate", selectedRangeDate: "selectedRangeDate", startingDayOfWeek: "startingDayOfWeek", calType: "calType", id: "id", rangeHoverEffect: "rangeHoverEffect", markWeekends: "markWeekends", showWeekNumbers: "showWeekNumbers", focusEscapeFunction: "focusEscapeFunction", specialDaysRules: "specialDaysRules", disableFunction: "disableFunction", disableRangeStartFunction: "disableRangeStartFunction", disableRangeEndFunction: "disableRangeEndFunction" }, outputs: { selectedRangeDateChange: "selectedRangeDateChange", nextMonthSelect: "nextMonthSelect", previousMonthSelect: "previousMonthSelect", selectedDateChange: "selectedDateChange" }, host: { properties: { "attr.id": "viewId" }, classAttribute: "fd-calendar__dates" }, usesOnChanges: true, ngImport: i0, template: "<table\n class=\"fd-calendar__table\"\n role=\"grid\"\n [attr.aria-roledescription]=\"'coreCalendar.calendarDayViewDescription' | fdTranslate\"\n>\n <thead class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n [attr.id]=\"_weekNumbersColumnHeaderId\"\n [attr.aria-label]=\"'coreCalendar.weekColumnLabel' | fdTranslate\"\n ></th>\n <th\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n *ngFor=\"let day of shortWeekDays; index as i\"\n [attr.aria-label]=\"longWeekDays[i]\"\n >\n <span class=\"fd-calendar__text\">{{ day }}</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\" *ngFor=\"let row of _dayViewGrid; let rowIndex = index\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"rowheader\"\n scope=\"row\"\n [attr.data-fd-calendar-week]=\"_weeks[rowIndex]\"\n [attr.id]=\"viewId + '-week-' + _weeks[rowIndex]\"\n [attr.aria-labelledby]=\"_weekNumbersColumnHeaderId + ' ' + (viewId + '-week-' + _weeks[rowIndex])\"\n >\n <span *ngIf=\"_weeks && _weeks[rowIndex]\" class=\"fd-calendar__text\">\n {{ _weeks[rowIndex] }}\n </span>\n </th>\n\n <td\n class=\"fd-calendar__item\"\n role=\"gridcell\"\n *ngFor=\"let cell of row; let cellIndex = index\"\n [class.is-active]=\"cell.selectedFirst || cell.selectedLast || cell.selected\"\n [class.fd-calendar__item--range]=\"\n (cell.selectedRange || cell.hoverRange) && !cell.selectedFirst && !cell.selectedLast\n \"\n [class.fd-calendar__item--current]=\"cell.current\"\n [class.fd-calendar__item--weekend]=\"cell.weekend && markWeekends && cell.monthStatus === 'current'\"\n [class.fd-calendar__item--other-month]=\"cell.monthStatus !== 'current'\"\n [class.is-disabled]=\"cell.disabled\"\n [class]=\"cell.specialNumber ? 'fd-calendar__special-day--' + cell.specialNumber : ''\"\n [attr.id]=\"cell.id\"\n [attr.data-fd-calendar-date-day]=\"cell.label\"\n [attr.data-fd-calendar-day]=\"cell.index\"\n [attr.aria-selected]=\"cell.selected\"\n [attr.aria-disabled]=\"cell.disabled\"\n [attr.tabindex]=\"cell.isTabIndexed ? 0 : -1\"\n (click)=\"selectDate(cell, $event)\"\n (mouseenter)=\"_refreshHoverRange(cell)\"\n (keydown)=\"_onKeydownDayHandler($event, cell, _getIndex(rowIndex, cellIndex))\"\n >\n <span\n class=\"fd-calendar__text\"\n role=\"button\"\n [attr.aria-labelledby]=\"\n cell.id +\n '-aria-label ' +\n (cell.selectedFirst ? _dateRangeStartLabelId + ' ' : '') +\n (cell.selectedLast ? _dateRangeEndLabelId + ' ' : '') +\n (cell.current ? _todayLabelId + ' ' : '') +\n (cell.selected && calType === 'single' ? _selectedDateLabelId + ' ' : '') +\n (cell.past ? _dateInPastLabelId : '')\n \"\n >{{ cell.label }}</span\n >\n <span hidden aria-hidden=\"true\" [attr.id]=\"cell.id + '-aria-label'\">\n {{ cell.ariaLabel }}\n </span>\n </td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length <= 5\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length === 4\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n </tbody>\n</table>\n\n<!-- Hidden elements for aria purposes -->\n<div hidden aria-hidden=\"true\">\n <div [attr.id]=\"_todayLabelId\">{{ 'coreCalendar.todayLabel' | fdTranslate }}</div>\n <div [attr.id]=\"_selectedDateLabelId\">{{ 'coreCalendar.dateSelectedLabel' | fdTranslate }}</div>\n <div [attr.id]=\"_dateRangeStartLabelId\">{{ 'coreCalendar.rangeStartLabel' | fdTranslate }}</div>\n <div [attr.id]=\"_dateRangeEndLabelId\">{{ 'coreCalendar.rangeEndLabel' | fdTranslate }}</div>\n <div [attr.id]=\"_dateInPastLabelId\">{{ 'coreCalendar.dayInPastLabel' | fdTranslate }}</div>\n</div>\n", styles: [".hidden-day{visibility:hidden}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i4.FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
773
721
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CalendarDayViewComponent, decorators: [{
774
722
  type: Component,
775
723
  args: [{ selector: 'fd-calendar-day-view', encapsulation: ViewEncapsulation.None, host: {
776
724
  '[attr.id]': 'viewId',
777
725
  class: 'fd-calendar__dates'
778
- }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<table class=\"fd-calendar__table\" role=\"grid\" [attr.aria-roledescription]=\"_viewRoleDescription\">\n <thead class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n [attr.id]=\"_weekNumbersColumnHeaderId\"\n [attr.aria-label]=\"_weekColumnLabelAriaLabel\"\n ></th>\n <th\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n *ngFor=\"let day of shortWeekDays; index as i\"\n [attr.aria-label]=\"longWeekDays[i]\"\n >\n <span class=\"fd-calendar__text\">{{ day }}</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\" *ngFor=\"let row of _dayViewGrid; let rowIndex = index\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"rowheader\"\n scope=\"row\"\n [attr.data-fd-calendar-week]=\"_weeks[rowIndex]\"\n [attr.id]=\"viewId + '-week-' + _weeks[rowIndex]\"\n [attr.aria-labelledby]=\"_weekNumbersColumnHeaderId + ' ' + (viewId + '-week-' + _weeks[rowIndex])\"\n >\n <span *ngIf=\"_weeks && _weeks[rowIndex]\" class=\"fd-calendar__text\">\n {{ _weeks[rowIndex] }}\n </span>\n </th>\n\n <td\n class=\"fd-calendar__item\"\n role=\"gridcell\"\n *ngFor=\"let cell of row; let cellIndex = index\"\n [class.is-active]=\"cell.selectedFirst || cell.selectedLast || cell.selected\"\n [class.fd-calendar__item--range]=\"\n (cell.selectedRange || cell.hoverRange) && !cell.selectedFirst && !cell.selectedLast\n \"\n [class.fd-calendar__item--current]=\"cell.current\"\n [class.fd-calendar__item--weekend]=\"cell.weekend && markWeekends && cell.monthStatus === 'current'\"\n [class.fd-calendar__item--other-month]=\"cell.monthStatus !== 'current'\"\n [class.is-disabled]=\"cell.disabled\"\n [class]=\"cell.specialNumber ? 'fd-calendar__special-day--' + cell.specialNumber : ''\"\n [attr.id]=\"cell.id\"\n [attr.data-fd-calendar-date-day]=\"cell.label\"\n [attr.data-fd-calendar-day]=\"cell.index\"\n [attr.aria-selected]=\"cell.selected\"\n [attr.aria-disabled]=\"cell.disabled\"\n [attr.tabindex]=\"cell.isTabIndexed ? 0 : -1\"\n (click)=\"selectDate(cell, $event)\"\n (mouseenter)=\"_refreshHoverRange(cell)\"\n (keydown)=\"_onKeydownDayHandler($event, cell, _getIndex(rowIndex, cellIndex))\"\n >\n <span\n class=\"fd-calendar__text\"\n role=\"button\"\n [attr.aria-labelledby]=\"\n cell.id +\n '-aria-label ' +\n (cell.selectedFirst ? _dateRangeStartLabelId + ' ' : '') +\n (cell.selectedLast ? _dateRangeEndLabelId + ' ' : '') +\n (cell.current ? _todayLabelId + ' ' : '') +\n (cell.selected && calType === 'single' ? _selectedDateLabelId + ' ' : '') +\n (cell.past ? _dateInPastLabelId : '')\n \"\n >{{ cell.label }}</span\n >\n <span hidden aria-hidden=\"true\" [attr.id]=\"cell.id + '-aria-label'\">\n {{ cell.ariaLabel }}\n </span>\n </td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length <= 5\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length === 4\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n </tbody>\n</table>\n\n<!-- Hidden elements for aria purposes -->\n<div hidden aria-hidden=\"true\">\n <div [attr.id]=\"_todayLabelId\">{{ _todayAriaLabel }}</div>\n <div [attr.id]=\"_selectedDateLabelId\">{{ _selectedDateAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeStartLabelId\">{{ _rangeStartAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeEndLabelId\">{{ _rangeEndAriaLabel }}</div>\n <div [attr.id]=\"_dateInPastLabelId\">{{ _dateInPastAriaLabel }}</div>\n</div>\n", styles: [".hidden-day{visibility:hidden}\n"] }]
726
+ }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<table\n class=\"fd-calendar__table\"\n role=\"grid\"\n [attr.aria-roledescription]=\"'coreCalendar.calendarDayViewDescription' | fdTranslate\"\n>\n <thead class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n [attr.id]=\"_weekNumbersColumnHeaderId\"\n [attr.aria-label]=\"'coreCalendar.weekColumnLabel' | fdTranslate\"\n ></th>\n <th\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n *ngFor=\"let day of shortWeekDays; index as i\"\n [attr.aria-label]=\"longWeekDays[i]\"\n >\n <span class=\"fd-calendar__text\">{{ day }}</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\" *ngFor=\"let row of _dayViewGrid; let rowIndex = index\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"rowheader\"\n scope=\"row\"\n [attr.data-fd-calendar-week]=\"_weeks[rowIndex]\"\n [attr.id]=\"viewId + '-week-' + _weeks[rowIndex]\"\n [attr.aria-labelledby]=\"_weekNumbersColumnHeaderId + ' ' + (viewId + '-week-' + _weeks[rowIndex])\"\n >\n <span *ngIf=\"_weeks && _weeks[rowIndex]\" class=\"fd-calendar__text\">\n {{ _weeks[rowIndex] }}\n </span>\n </th>\n\n <td\n class=\"fd-calendar__item\"\n role=\"gridcell\"\n *ngFor=\"let cell of row; let cellIndex = index\"\n [class.is-active]=\"cell.selectedFirst || cell.selectedLast || cell.selected\"\n [class.fd-calendar__item--range]=\"\n (cell.selectedRange || cell.hoverRange) && !cell.selectedFirst && !cell.selectedLast\n \"\n [class.fd-calendar__item--current]=\"cell.current\"\n [class.fd-calendar__item--weekend]=\"cell.weekend && markWeekends && cell.monthStatus === 'current'\"\n [class.fd-calendar__item--other-month]=\"cell.monthStatus !== 'current'\"\n [class.is-disabled]=\"cell.disabled\"\n [class]=\"cell.specialNumber ? 'fd-calendar__special-day--' + cell.specialNumber : ''\"\n [attr.id]=\"cell.id\"\n [attr.data-fd-calendar-date-day]=\"cell.label\"\n [attr.data-fd-calendar-day]=\"cell.index\"\n [attr.aria-selected]=\"cell.selected\"\n [attr.aria-disabled]=\"cell.disabled\"\n [attr.tabindex]=\"cell.isTabIndexed ? 0 : -1\"\n (click)=\"selectDate(cell, $event)\"\n (mouseenter)=\"_refreshHoverRange(cell)\"\n (keydown)=\"_onKeydownDayHandler($event, cell, _getIndex(rowIndex, cellIndex))\"\n >\n <span\n class=\"fd-calendar__text\"\n role=\"button\"\n [attr.aria-labelledby]=\"\n cell.id +\n '-aria-label ' +\n (cell.selectedFirst ? _dateRangeStartLabelId + ' ' : '') +\n (cell.selectedLast ? _dateRangeEndLabelId + ' ' : '') +\n (cell.current ? _todayLabelId + ' ' : '') +\n (cell.selected && calType === 'single' ? _selectedDateLabelId + ' ' : '') +\n (cell.past ? _dateInPastLabelId : '')\n \"\n >{{ cell.label }}</span\n >\n <span hidden aria-hidden=\"true\" [attr.id]=\"cell.id + '-aria-label'\">\n {{ cell.ariaLabel }}\n </span>\n </td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length <= 5\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length === 4\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n </tbody>\n</table>\n\n<!-- Hidden elements for aria purposes -->\n<div hidden aria-hidden=\"true\">\n <div [attr.id]=\"_todayLabelId\">{{ 'coreCalendar.todayLabel' | fdTranslate }}</div>\n <div [attr.id]=\"_selectedDateLabelId\">{{ 'coreCalendar.dateSelectedLabel' | fdTranslate }}</div>\n <div [attr.id]=\"_dateRangeStartLabelId\">{{ 'coreCalendar.rangeStartLabel' | fdTranslate }}</div>\n <div [attr.id]=\"_dateRangeEndLabelId\">{{ 'coreCalendar.rangeEndLabel' | fdTranslate }}</div>\n <div [attr.id]=\"_dateInPastLabelId\">{{ 'coreCalendar.dayInPastLabel' | fdTranslate }}</div>\n</div>\n", styles: [".hidden-day{visibility:hidden}\n"] }]
779
727
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.CalendarService }, { type: undefined, decorators: [{
780
728
  type: Inject,
781
729
  args: [DATE_TIME_FORMATS]
782
- }] }, { type: i2.DatetimeAdapter }, { type: i3.CalendarI18nLabels }]; }, propDecorators: { currentlyDisplayed: [{
730
+ }] }, { type: i2.DatetimeAdapter }]; }, propDecorators: { currentlyDisplayed: [{
783
731
  type: Input
784
732
  }], selectedDate: [{
785
733
  type: Input
@@ -816,4 +764,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
816
764
  }], disableRangeEndFunction: [{
817
765
  type: Input
818
766
  }] } });
819
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY2FsZW5kYXIvY2FsZW5kYXItdmlld3MvY2FsZW5kYXItZGF5LXZpZXcvY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY2FsZW5kYXIvY2FsZW5kYXItdmlld3MvY2FsZW5kYXItZGF5LXZpZXcvY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixpQkFBaUIsRUFDakIsTUFBTSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBbUIsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFckcsT0FBTyxLQUFLLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXBELE9BQU8sRUFBRSw2QkFBNkIsSUFBSSw2QkFBNkIsRUFBZSxNQUFNLDJCQUEyQixDQUFDO0FBR3hILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7O0FBSXJFLDJEQUEyRDtBQVkzRCxNQUFNLE9BQU8sd0JBQXdCO0lBQ2pDLGtEQUFrRDtJQUNsRCxJQUNJLGtCQUFrQixDQUFD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TztzQkFETixLQUFLO2dCQUtOLEVBQUU7c0JBREQsS0FBSztnQkFRTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFPTixZQUFZO3NCQURYLEtBQUs7Z0JBT04sZUFBZTtzQkFEZCxLQUFLO2dCQUtOLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFXTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFLRyx1QkFBdUI7c0JBRC9CLE1BQU07Z0JBS0UsZUFBZTtzQkFEdkIsTUFBTTtnQkFLRSxtQkFBbUI7c0JBRDNCLE1BQU07Z0JBS0Usa0JBQWtCO3NCQUQxQixNQUFNO2dCQWdEUCxlQUFlO3NCQURkLEtBQUs7Z0JBUU4seUJBQXlCO3NCQUR4QixLQUFLO2dCQVFOLHVCQUF1QjtzQkFEdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIEluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgREFURV9USU1FX0ZPUk1BVFMsIERhdGVUaW1lRm9ybWF0cywgRGF0ZXRpbWVBZGFwdGVyIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2RhdGV0aW1lJztcbmltcG9ydCB7IFNwZWNpYWxEYXlSdWxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL3NoYXJlZCc7XG5pbXBvcnQgZXF1YWwgZnJvbSAnZmFzdC1kZWVwLWVxdWFsJztcblxuaW1wb3J0IHsgRGF0ZVJhbmdlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2RhdGUtcmFuZ2UnO1xuaW1wb3J0IHsgQ2FsZW5kYXJDdXJyZW50IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhbGVuZGFyLWN1cnJlbnQnO1xuaW1wb3J0IHsgQWN0aXZlQ2FsZW5kYXJEYXlDZWxsU3RyYXRlZ3kgYXMgQ2FsZW5kYXJBY3RpdmVEYXlDZWxsU3RyYXRlZ3ksIENhbGVuZGFyRGF5IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhbGVuZGFyLWRheSc7XG5cbmltcG9ydCB7IENhbGVuZGFyVHlwZSwgRGF5c09mV2VlayB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENhbGVuZGFyU2VydmljZSB9IGZyb20gJy4uLy4uL2NhbGVuZGFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FsZW5kYXJJMThuTGFiZWxzIH0gZnJvbSAnLi4vLi4vaTE4bi9jYWxlbmRhci1pMThuLWxhYmVscyc7XG5pbXBvcnQgeyBEaXNhYmxlRGF0ZUZ1bmN0aW9uLCBFc2NhcGVGb2N1c0Z1bmN0aW9uLCBGb2N1c2FibGVDYWxlbmRhclZpZXcgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29tbW9uJztcbmltcG9ydCB7IE51bGxhYmxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuXG4vKiogQ29tcG9uZW50IHJlcHJlc2VudGluZyB0aGUgZGF5IHZpZXcgb2YgdGhlIGNhbGVuZGFyLiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC1jYWxlbmRhci1kYXktdmlldycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLWRheS12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1kYXktdmlldy5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgaG9zdDoge1xuICAgICAgICAnW2F0dHIuaWRdJzogJ3ZpZXdJZCcsXG4gICAgICAgIGNsYXNzOiAnZmQtY2FsZW5kYXJfX2RhdGVzJ1xuICAgIH0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJEYXlWaWV3Q29tcG9uZW50PEQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgRm9jdXNhYmxlQ2FsZW5kYXJWaWV3IHtcbiAgICAvKiogQ3VycmVudGx5IGRpc3BsYXllZCBtb250aCBhbmQgeWVhciBmb3IgZGF5cyAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGN1cnJlbnRseURpc3BsYXllZChjdXJyZW50bHlEaXNwbGF5ZWQ6IENhbGVuZGFyQ3VycmVudCkge1xuICAgICAgICBpZiAoIWVxdWFsKGN1cnJlbnRseURpc3BsYXllZCwgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkKSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkID0gY3VycmVudGx5RGlzcGxheWVkO1xuICAgICAgICAgICAgdGhpcy5fYnVpbGREYXlWaWV3R3JpZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGN1cnJlbnRseURpc3BsYXllZCgpOiBDYWxlbmRhckN1cnJlbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudGx5RGlzcGxheWVkO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY3VycmVudGx5RGlzcGxheWVkOiBDYWxlbmRhckN1cnJlbnQ7XG5cbiAgICAvKiogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBkYXRlIG1vZGVsIGluIHNpbmdsZSBtb2RlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHNlbGVjdGVkRGF0ZShkYXRlOiBOdWxsYWJsZTxEPikge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSBkYXRlO1xuICAgICAgICBpZiAodGhpcy5fZGF5Vmlld0dyaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRheUZyb21EYXRlID0gdGhpcy5fY2FsZW5kYXJEYXlMaXN0LmZpbmQoKGRheSkgPT4gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwoZGF5LmRhdGUsIGRhdGUpKTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZVNlbGVjdGVkU2luZ2xlRGF5KGRheUZyb21EYXRlLCB0aGlzLl9jYWxlbmRhckRheUxpc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHNlbGVjdGVkRGF0ZSgpOiBOdWxsYWJsZTxEPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZERhdGU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zZWxlY3RlZERhdGU6IE51bGxhYmxlPEQ+O1xuXG4gICAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgRmREYXRlcyBtb2RlbCBzdGFydCBhbmQgZW5kIGluIHJhbmdlIG1vZGUuICovXG4gICAgQElucHV0KClcbiAgICBzZXQgc2VsZWN0ZWRSYW5nZURhdGUoZGF0ZVJhbmdlOiBEYXRlUmFuZ2U8RD4pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0ZVJhbmdlICYmXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlICYmXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChkYXRlUmFuZ2Uuc3RhcnQsIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnQpICYmXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChkYXRlUmFuZ2UuZW5kLCB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLmVuZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUgPSBkYXRlUmFuZ2U7XG4gICAgICAgIGlmICh0aGlzLl9kYXlWaWV3R3JpZCkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlU2VsZWN0ZWRSYW5nZURheXMoZGF0ZVJhbmdlLCB0aGlzLl9jYWxlbmRhckRheUxpc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHNlbGVjdGVkUmFuZ2VEYXRlKCk6IERhdGVSYW5nZTxEPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3NlbGVjdGVkUmFuZ2VEYXRlOiBEYXRlUmFuZ2U8RD47XG5cbiAgICAvKiogVGhlIGRheSBvZiB0aGUgd2VlayB0aGUgY2FsZW5kYXIgc2hvdWxkIHN0YXJ0IG9uLiAxIHJlcHJlc2VudHMgU3VuZGF5LCAyIGlzIE1vbmRheSwgMyBpcyBUdWVzZGF5LCBhbmQgc28gb24uICovXG4gICAgQElucHV0KClcbiAgICBzdGFydGluZ0RheU9mV2VlazogRGF5c09mV2VlaztcblxuICAgIC8qKiBUaGUgdHlwZSBvZiBjYWxlbmRhciwgJ3NpbmdsZScgZm9yIHNpbmdsZSBkYXRlIHNlbGVjdGlvbiBvciAncmFuZ2UnIGZvciBhIHJhbmdlIG9mIGRhdGVzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgY2FsVHlwZTogQ2FsZW5kYXJUeXBlID0gJ3NpbmdsZSc7XG5cbiAgICAvKiogSWQgb2YgdGhlIGNhbGVuZGFyLiBJZiBub25lIGlzIHByb3ZpZGVkLCBvbmUgd2lsbCBiZSBnZW5lcmF0ZWQuICovXG4gICAgQElucHV0KClcbiAgICBpZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB1c2VyIHdhbnRzIHRvIG1hcmsgZGF5IGNlbGxzIG9uIGhvdmVyLlxuICAgICAqIFdvcmtzIG9ubHkgb24gcmFuZ2UgbW9kZSwgd2hlbiBzdGFydCBkYXRlIGlzIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcmFuZ2VIb3ZlckVmZmVjdCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB1c2VyIHdhbnRzIHRvIG1hcmsgc3VuZGF5L3NhdHVyZGF5IHdpdGggYGZkLWNhbGVuZGFyX19pdGVtLS13ZWVrZW5kYCBjbGFzc1xuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWFya1dlZWtlbmRzID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHVzZXIgd2FudHMgdG8gc2hvdyB3ZWVrIG51bWJlcnMgbmV4dCB0byBkYXlzXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzaG93V2Vla051bWJlcnMgPSB0cnVlO1xuXG4gICAgLyoqIEZ1bmN0aW9uIHRoYXQgYWxsb3dzIHRvIHNwZWNpZnkgd2hpY2ggZnVuY3Rpb24gd291bGQgYmUgY2FsbGVkLCB3aGVuIGZvY3VzIHdhbnRzIHRvIGVzY2FwZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgZm9jdXNFc2NhcGVGdW5jdGlvbjogRXNjYXBlRm9jdXNGdW5jdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpYWwgZGF5cyBtYXJrLCBpdCBjYW4gYmUgdXNlZCBieSBwYXNzaW5nIGFycmF5IG9mIG9iamVjdCB3aXRoXG4gICAgICogU3BlY2lhbCBkYXkgbnVtYmVyLCBsaXN0IDEtMjAgW2NsYXNzOmBmZC1jYWxlbmRhcl9fc3BlY2lhbC1kYXktLXt7bnVtYmVyfX1gXSBpcyBhdmFpbGFibGUgdGhlcmU6XG4gICAgICogaHR0cHM6Ly9zYXAuZ2l0aHViLmlvL2Z1bmRhbWVudGFsLXN0eWxlcy9jb21wb25lbnRzL2NhbGVuZGFyLmh0bWwgY2FsZW5kYXIgc3BlY2lhbCBkYXlzIHNlY3Rpb25cbiAgICAgKiBSdWxlIGFjY2VwdHMgbWV0aG9kIHdpdGggZGF0ZSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIuIGV4OlxuICAgICAqIGBydWxlOiAoZGF0ZTogRCkgPT4gdGhpcy5kYXRlQWRhcHRlci5nZXREYXkoZGF0ZSkgPT09IDFgLCB3aGljaCB3aWxsIG1hcmsgYWxsIHN1bmRheXMgYXMgc3BlY2lhbCBkYXkuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzcGVjaWFsRGF5c1J1bGVzOiBTcGVjaWFsRGF5UnVsZTxEPltdID0gW107XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCBhbHdheXMsIHdoZW4gbW9kZWwgaXMgY2hhbmdlZCBpbiByYW5nZSBtb2RlICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgc2VsZWN0ZWRSYW5nZURhdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEYXRlUmFuZ2U8RD4+ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlUmFuZ2U8RD4+KCk7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCBhbHdheXMsIHdoZW4gbmV4dCBtb250aCBpcyBzZWxlY3RlZCwgYnkgZm9jdXMgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBuZXh0TW9udGhTZWxlY3Q6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIGFsd2F5cywgd2hlbiBwcmV2aW91cyBtb250aCBpcyBzZWxlY3RlZCwgYnkgZm9jdXMgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBwcmV2aW91c01vbnRoU2VsZWN0OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCBhbHdheXMsIHdoZW4gbW9kZWwgaXMgY2hhbmdlZCBpbiBzaW5nbGUgbW9kZSAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IHNlbGVjdGVkRGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPEQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEFjdHVhbCBkYXkgZ3JpZCB3aXRoIHByZXZpb3VzL2N1cnJlbnQvbmV4dCBtb250aCBkYXlzXG4gICAgICovXG4gICAgX2RheVZpZXdHcmlkOiBDYWxlbmRhckRheTxEPltdW107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQXJyYXkgb2Ygd2VlayBudW1iZXJzIGRpc3BsYXllZCBmb3IgY3VycmVudCBtb250aC95ZWFyXG4gICAgICovXG4gICAgX3dlZWtzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBBbiBSeEpTIFN1YmplY3QgdGhhdCB3aWxsIGtpbGwgdGhlIGRhdGEgc3RyZWFtIHVwb24gY29tcG9uZW504oCZcyBkZXN0cnVjdGlvbiAoZm9yIHVuc3Vic2NyaWJpbmcpXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25EZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogRGF5cyBwZXIgd2Vla1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Ftb3VudE9mQ29scyA9IDc7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pc09uUmFuZ2VQaWNrID0gZmFsc2U7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pc0luaXRpYXRlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFZhcmlhYmxlIHRoYXQgY29udGFpbnMgc2hvcnQgd2Vla2RheSBuYW1lcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9zaG9ydFdlZWtEYXlzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBWYXJpYWJsZSB0aGF0IGNvbnRhaW5zIHNob3J0IHdlZWtkYXkgbmFtZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbG9uZ1dlZWtEYXlzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHVzZWQgdG8gZGlzYWJsZSBjZXJ0YWluIGRhdGVzIGluIHRoZSBjYWxlbmRhci5cbiAgICAgKiBAcGFyYW0gZGF0ZSBkYXRlIHR5cGVcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVGdW5jdGlvbjogRGlzYWJsZURhdGVGdW5jdGlvbjxEPjtcblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHVzZWQgdG8gZGlzYWJsZSBjZXJ0YWluIGRhdGVzIGluIHRoZSBjYWxlbmRhciBmb3IgdGhlIHJhbmdlIHN0YXJ0IHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0gZGF0ZSBkYXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlUmFuZ2VTdGFydEZ1bmN0aW9uOiBEaXNhYmxlRGF0ZUZ1bmN0aW9uPEQ+O1xuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdXNlZCB0byBkaXNhYmxlIGNlcnRhaW4gZGF0ZXMgaW4gdGhlIGNhbGVuZGFyIGZvciB0aGUgcmFuZ2UgZW5kIHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0gZGF0ZSBkYXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlUmFuZ2VFbmRGdW5jdGlvbjogRGlzYWJsZURhdGVGdW5jdGlvbjxEPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZVJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIGNhbGVuZGFyU2VydmljZTogQ2FsZW5kYXJTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KERBVEVfVElNRV9GT1JNQVRTKSBwcml2YXRlIF9kYXRlVGltZUZvcm1hdHM6IERhdGVUaW1lRm9ybWF0cyxcbiAgICAgICAgcHVibGljIF9kYXRlVGltZUFkYXB0ZXI6IERhdGV0aW1lQWRhcHRlcjxEPixcbiAgICAgICAgcHJpdmF0ZSBfY2FsZW5kYXJJMThuTGFiZWxzOiBDYWxlbmRhckkxOG5MYWJlbHNcbiAgICApIHt9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pc0luaXRpYXRlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fc2V0dXBLZXlib2FyZFNlcnZpY2UoKTtcblxuICAgICAgICB0aGlzLl9yZWZyZXNoU2hvcnRXZWVrRGF5cygpO1xuXG4gICAgICAgIHRoaXMuX2J1aWxkRGF5Vmlld0dyaWQoKTtcblxuICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIubG9jYWxlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hTaG9ydFdlZWtEYXlzKCk7XG4gICAgICAgICAgICB0aGlzLl9idWlsZERheVZpZXdHcmlkKCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIC8qKiBDaGFuZ2VzIG9mIHRob3NlIHByb3BlcnRpZXMgYXJlIGRvbmUgaW5zaWRlIGl0cyBzZXR0ZXJzICovXG4gICAgICAgIGlmICghY2hhbmdlc1snc2VsZWN0ZWREYXRlJ10gJiYgIWNoYW5nZXNbJ3NlbGVjdGVkUmFuZ2VEYXRlJ10gJiYgIWNoYW5nZXNbJ2N1cnJlbnRseURpc3BsYXllZCddKSB7XG4gICAgICAgICAgICB0aGlzLl9idWlsZERheVZpZXdHcmlkKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXNbJ3N0YXJ0aW5nRGF5T2ZXZWVrJ10pIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hTaG9ydFdlZWtEYXlzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5fb25EZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIGZvciBzZWxlY3RpbmcgYSBkYXRlIG9uIHRoZSBjYWxlbmRhci4gVHlwaWNhbGx5IGNhbGxlZCB3aGVuIGEgZGF0ZSBpcyBjbGlja2VkLCBidXQgY2FuIGFsc28gYmUgY2FsbGVkIHByb2dyYW1tYXRpY2FsbHkuXG4gICAgICogQHBhcmFtIGRheSBDYWxlbmRhckRheSBvYmplY3QgdG8gYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgc2VsZWN0RGF0ZShkYXk6IENhbGVuZGFyRGF5PEQ+LCBldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZXJlIGFyZSBzb21lIHByb2JsZW1zIHdpdGggcG9wdXAgaW50ZWdyYXRpb24uIEFmdGVyIGNsaWNraW5nIGluc2lkZSBkYXkgY29tcG9uZW50LCB0aGUgcG9wb3ZlciBjbG9zZXMuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGF5LmRpc2FibGVkICYmICFkYXkuYmxvY2tlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FsVHlwZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgICAgICAvKiogUmVtb3ZlIHNlbGVjdGlvbnMgZnJvbSBvdGhlciBkYXkgYW5kIHB1dCBzZWxlY3Rpb24gdG8gY2hvc2VuIGRheSAqL1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyRGF5TGlzdC5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5zZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgZGF5LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSBkYXkuZGF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KGRheS5kYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdENvdW50ZXIgPT09IDAgfHwgdGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZSA9IHsgc3RhcnQ6IGRheS5kYXRlLCBlbmQ6IG51bGwgfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBkYXRlIHBpY2tlZCBpcyBoaWdoZXIgdGhhbiBhbHJlYWR5IGNob3Nlbiwgb3RoZXJ3aXNlIGp1c3QgcmV2ZXJzZSB0aGVtXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY29tcGFyZURhdGUodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCEsIGRheS5kYXRlKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUmFuZ2VEYXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogZGF5LmRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogZGF5LmRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGVDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlU2VsZWN0ZWRSYW5nZURheXModGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUsIHRoaXMuX2NhbGVuZGFyRGF5TGlzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jYWxUeXBlID09PSAncmFuZ2UnICYmIHRoaXMucmFuZ2VIb3ZlckVmZmVjdCAmJiB0aGlzLl9zZWxlY3RDb3VudGVyID09PSAxICYmIGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9pc09uUmFuZ2VQaWNrID0gIXRoaXMuX2lzT25SYW5nZVBpY2s7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pc09uUmFuZ2VQaWNrID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoYW5nZURldFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZm9jdXMgb24gZGVmYXVsdCBmb2N1c2FibGUgY2VsbFxuICAgICAqL1xuICAgIHNldEZvY3VzT25DZWxsKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjZWxsVG9Gb2N1cyA9IG5ldyBDYWxlbmRhckFjdGl2ZURheUNlbGxTdHJhdGVneSgpLmdldEFjdGl2ZUNlbGwodGhpcy5fY2FsZW5kYXJEYXlMaXN0KTtcbiAgICAgICAgaWYgKCFjZWxsVG9Gb2N1cz8uaW5kZXggJiYgY2VsbFRvRm9jdXM/LmluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb2N1c09uQ2VsbEJ5SW5kZXgoY2VsbFRvRm9jdXMuaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3JlZnJlc2hIb3ZlclJhbmdlKGRheTogQ2FsZW5kYXJEYXk8RD4pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlPy5zdGFydDtcbiAgICAgICAgaWYgKHRoaXMuX2lzT25SYW5nZVBpY2sgJiYgc3RhcnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY29tcGFyZURhdGUoZGF5LmRhdGUsIHN0YXJ0KSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxlbmRhckRheUxpc3QuZm9yRWFjaCgoX2RheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBfZGF5LmhvdmVyUmFuZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKF9kYXkuZGF0ZSwgZGF5LmRhdGUpID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKF9kYXkuZGF0ZSwgc3RhcnQpIDwgMDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJEYXlMaXN0LmZvckVhY2goKF9kYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgX2RheS5ob3ZlclJhbmdlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZShfZGF5LmRhdGUsIGRheS5kYXRlKSA8IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZShfZGF5LmRhdGUsIHN0YXJ0KSA+IDA7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogIEFtb3VudCBvZiBzZWxlY3RlZCBkYXlzXG4gICAgICogIDAsIHdoZW4gdGhlcmUgaXMgbm8gZGF5IHNlbGVjdGVkLCBvciBzdGFydCBkYXRlIGlzIGludmFsaWQsXG4gICAgICogIDEsIHdoZW4gdGhlcmUgaXMgb25seSB2YWxpZCBzdGFydCBkYXRlLCBvciBlbmQgZGF0ZSBpcyBzYW1lIGFzIHN0YXJ0IGRhdGUsXG4gICAgICogIDIsIHdoZW4gYm90aCBkYXRlcyBhcmUgdmFsaWRcbiAgICAgKi9cbiAgICBnZXQgX3NlbGVjdENvdW50ZXIoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlIHx8ICF0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0KSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCAmJlxuICAgICAgICAgICAgKCF0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLmVuZCkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0LCB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLmVuZCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5zdGFydCkgJiZcbiAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuZW5kKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCByZXR1cm5zIHNob3J0IHdlZWtkYXkgbmFtZS5cbiAgICAgKiBDYW4gYmUgY2hhbmdlZCBieSB1c2VyIGJ5IHByb3ZpZGluZyBvdGhlciBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIERhdGV0aW1lQWRhcHRlclxuICAgICAqL1xuICAgIGdldCBzaG9ydFdlZWtEYXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3J0V2Vla0RheXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IHJldHVybnMgd2Vla2RheSBuYW1lLlxuICAgICAqIENhbiBiZSBjaGFuZ2VkIGJ5IHVzZXIgYnkgcHJvdmlkaW5nIG90aGVyIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgRGF0ZXRpbWVBZGFwdGVyXG4gICAgICovXG4gICAgZ2V0IGxvbmdXZWVrRGF5cygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb25nV2Vla0RheXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEZ1bmN0aW9uIHRoYXQgZ2l2ZXMgYXJyYXkgb2YgYWxsIGRpc3BsYXllZCBDYWxlbmRhckRheXNcbiAgICAgKi9cbiAgICBnZXQgX2NhbGVuZGFyRGF5TGlzdCgpOiBDYWxlbmRhckRheTxEPltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RheVZpZXdHcmlkLnJlZHVjZSgodG90YWxDYWxlbmRhclJvd3M6IENhbGVuZGFyRGF5PEQ+W10sIGNhbGVuZGFyUm93OiBDYWxlbmRhckRheTxEPltdKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNhbGVuZGFyUm93KSB7XG4gICAgICAgICAgICAgICAgY2FsZW5kYXJSb3cgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0b3RhbENhbGVuZGFyUm93cy5jb25jYXQoY2FsZW5kYXJSb3cpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogVG9kYXkgY2VsbCBsYWJlbC5cbiAgICAgKiBJcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggY2VsbCBkYXRlIGl0c2VsZlxuICAgICAqL1xuICAgIGdldCBfdG9kYXlBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFySTE4bkxhYmVscy50b2RheUxhYmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZWxlY3RlZCBkYXRlIGNlbGwgbGFiZWwuXG4gICAgICogSXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGNlbGwgZGF0ZSBpdHNlbGZcbiAgICAgKi9cbiAgICBnZXQgX3NlbGVjdGVkRGF0ZUFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLmRhdGVTZWxlY3RlZExhYmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBjb2x1bW4gbGFiZWxcbiAgICAgKi9cbiAgICBnZXQgX3dlZWtDb2x1bW5MYWJlbEFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLndlZWtDb2x1bW5MYWJlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogUmFuZ2Ugc3RhcnQgbGFiZWxcbiAgICAgKi9cbiAgICBnZXQgX3JhbmdlU3RhcnRBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFySTE4bkxhYmVscy5yYW5nZVN0YXJ0TGFiZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFJhbmdlIGVuZCBsYWJlbFxuICAgICAqL1xuICAgIGdldCBfcmFuZ2VFbmRBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFySTE4bkxhYmVscy5yYW5nZUVuZExhYmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXRlIGluIHBhc3QgbGFiZWxcbiAgICAgKi9cbiAgICBnZXQgX2RhdGVJblBhc3RBcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFySTE4bkxhYmVscy5kYXlJblBhc3RMYWJlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogVmlldyBkZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGdldCBfdmlld1JvbGVEZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLmNhbGVuZGFyRGF5Vmlld0Rlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZpZXcgSURcbiAgICAgKi9cbiAgICBnZXQgdmlld0lkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkICsgJy1kYXktdmlldyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFdlZWsgY29sdW1uIGhlYWRlciBJRFxuICAgICAqL1xuICAgIGdldCBfd2Vla051bWJlcnNDb2x1bW5IZWFkZXJJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXdlZWstY29sdW1uLWhlYWRlcic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFRvZGF5IGNlbGwgbGFiZWwgSURcbiAgICAgKi9cbiAgICBnZXQgX3RvZGF5TGFiZWxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXRvZGF5LWxhYmVsJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogU2VsZWN0ZWQgZGF0ZSBsYWJlbCBJRFxuICAgICAqL1xuICAgIGdldCBfc2VsZWN0ZWREYXRlTGFiZWxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXNlbGVjdGVkLWRhdGUtbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXRlIHJhbmdlIHN0YXJ0IGRhdGUgbGFiZWwgSURcbiAgICAgKi9cbiAgICBnZXQgX2RhdGVSYW5nZVN0YXJ0TGFiZWxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXJhbmdlLXN0YXJ0LWRhdGUtbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXRlIHJhbmdlIGVuZCBkYXRlIGxhYmVsIElEXG4gICAgICovXG4gICAgZ2V0IF9kYXRlUmFuZ2VFbmRMYWJlbElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctcmFuZ2UtZW5kLWRhdGUtbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXRlIGluIHBhc3QgbGFiZWwgSURcbiAgICAgKi9cbiAgICBnZXQgX2RhdGVJblBhc3RMYWJlbElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctZGF5LWluLXBhc3QtbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBoYW5kbGVzIGRheSBjZWxscyBrZXlkb3duIGV2ZW50cyxcbiAgICAgKiBAcGFyYW0gZXZlbnQgS2V5Ym9hcmRFdmVudFxuICAgICAqIEBwYXJhbSBjZWxsIENhbGVuZGFyRGF5XG4gICAgICogQHBhcmFtIGdyaWQgd2l0aCBzcGVjaWZpZWQgY29sdW1uIGFuZCByb3cgYXMgYSB4IGFuZCB5XG4gICAgICovXG4gICAgX29uS2V5ZG93bkRheUhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGNlbGw6IENhbGVuZGFyRGF5PEQ+LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdUYWInICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNFc2NhcGVGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNFc2NhcGVGdW5jdGlvbihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5vbktleWRvd25IYW5kbGVyKGV2ZW50LCBpbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogIE1ldGhvZCB0aGF0IGFsbG93IHRvIGZvY3VzIGVsZW1lbnRzIGluc2lkZSB0aGlzIGNvbXBvbmVudFxuICAgICAqL1xuICAgIF9mb2N1c0VsZW1lbnRCeVNlbGVjdG9yKGVsZW1lbnRTZWxlY3Rvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRUb0ZvY3VzOiBIVE1MRWxlbWVudCA9IHRoaXMuZVJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudFNlbGVjdG9yKTtcbiAgICAgICAgaWYgKGVsZW1lbnRUb0ZvY3VzPy5mb2N1cykge1xuICAgICAgICAgICAgZWxlbWVudFRvRm9jdXMuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTdGFuZGFyZGl6ZWQgbWV0aG9kIHRvIGNhbGN1bGF0ZSBncmlkIFt4XVt5XSB0byBpbmRleCBudW1iZXIgb2YgZmxhdHRlbiBsaXN0XG4gICAgICovXG4gICAgX2dldEluZGV4KHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclNlcnZpY2UuZ2V0SWQocm93SW5kZXgsIGNvbEluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgc2VsZWN0cyBwcmV2aW91cyBtb250aFxuICAgICAqIFRyaWdnZXJlZCBvbmx5IHdoZW4gdGhlIG1vbnRoIGlzIGNoYW5nZWQgZHVyaW5nIGNoYW5naW5nIGZvY3VzXG4gICAgICogQWxzbyB0cmlnZ2VycyBldmVudCB0byBwYXJlbnQgY2FsZW5kYXIgY29tcG9uZW50IGFuZCByZWJ1aWxkcyBkYXkgdmlldyBncmlkXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2VsZWN0UHJldmlvdXNNb250aCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkID0gdGhpcy5fZ2V0UHJldmlvdXNNb250aCgpO1xuICAgICAgICB0aGlzLl9idWlsZERheVZpZXdHcmlkKCk7XG4gICAgICAgIHRoaXMucHJldmlvdXNNb250aFNlbGVjdC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IHNlbGVjdHMgbmV4dCBtb250aFxuICAgICAqIFRyaWdnZXJlZCBvbmx5IHdoZW4gdGhlIG1vbnRoIGlzIGNoYW5nZWQgZHVyaW5nIGNoYW5naW5nIGZvY3VzXG4gICAgICogQWxzbyB0cmlnZ2VycyBldmVudCB0byBwYXJlbnQgY2FsZW5kYXIgY29tcG9uZW50IGFuZCByZWJ1aWxkcyBkYXkgdmlldyBncmlkXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2VsZWN0TmV4dE1vbnRoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQgPSB0aGlzLl9nZXROZXh0TW9udGgoKTtcbiAgICAgICAgdGhpcy5fYnVpbGREYXlWaWV3R3JpZCgpO1xuICAgICAgICB0aGlzLm5leHRNb250aFNlbGVjdC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGNyZWF0ZXMgYXJyYXkgb2YgQ2FsZW5kYXJEYXkgbW9kZWxzIHdoaWNoIHdpbGwgYmUgc2hvd24gb24gZGF5IGdyaWQsXG4gICAgICogZGVwZW5kaW5nIG9uIGN1cnJlbnQgbW9udGggYW5kIHllYXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfcG9wdWxhdGVDYWxlbmRhcigpOiBDYWxlbmRhckRheTxEPltdIHtcbiAgICAgICAgbGV0IGNhbGVuZGFyOiBDYWxlbmRhckRheTxEPltdID0gW107XG5cbiAgICAgICAgY2FsZW5kYXIgPSB0aGlzLl9nZXRQcmV2aW91c01vbnRoRGF5cyhjYWxlbmRhcik7XG4gICAgICAgIGNhbGVuZGFyID0gY2FsZW5kYXIuY29uY2F0KHRoaXMuX2dldEN1cnJlbnRNb250aERheXMoKSk7XG4gICAgICAgIGNhbGVuZGFyID0gdGhpcy5fZ2V0TmV4dE1vbnRoRGF5cyhjYWxlbmRhcik7XG5cbiAgICAgICAgY2FsZW5kYXIuZm9yRWFjaCgoY2FsbCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY2FsbC5pZCA9IHRoaXMuX2dldENlbGxJZEJ5SW5kZXgoaW5kZXgpO1xuICAgICAgICAgICAgY2FsbC5pbmRleCA9IGluZGV4O1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5jYWxUeXBlID09PSAnc2luZ2xlJyAmJiB0aGlzLl9zZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IF9kYXkgPSBjYWxlbmRhci5maW5kKChkYXkpID0+IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKGRheS5kYXRlLCB0aGlzLl9zZWxlY3RlZERhdGUpKTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZVNlbGVjdGVkU2luZ2xlRGF5KF9kYXksIGNhbGVuZGFyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNhbFR5cGUgPT09ICdyYW5nZScgJiYgdGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZVNlbGVjdGVkUmFuZ2VEYXlzKHRoaXMuX3NlbGVjdGVkUmFuZ2VEYXRlLCBjYWxlbmRhcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2FsZW5kYXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGJ1aWxkcyAyIGRpbWVuc2lvbnMgZGF5IHZpZXcgZ3JpZCwgYWxzbyBzZXRzIHVwIGN1cnJlbnRseSBkaXNwbGF5ZWQgbW9udGgsIG9yIHllYXIsXG4gICAgICogd2hlbiB0aGVyZSBpcyBub3QgYW55LlxuICAgICAqL1xuICAgIHByaXZhdGUgX2J1aWxkRGF5Vmlld0dyaWQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5faXNJbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRseURpc3BsYXllZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXRNb250aCh0aGlzLnNlbGVjdGVkRGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIHllYXI6IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXRZZWFyKHRoaXMuc2VsZWN0ZWREYXRlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvZGF5ID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLnRvZGF5KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkID0ge1xuICAgICAgICAgICAgICAgICAgICBtb250aDogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKHRvZGF5KSxcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodG9kYXkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyRGF5cyA9IHRoaXMuX3BvcHVsYXRlQ2FsZW5kYXIoKTtcbiAgICAgICAgY29uc3QgZGF5Vmlld0dyaWQ6IENhbGVuZGFyRGF5PEQ+W11bXSA9IFtdO1xuXG4gICAgICAgIHdoaWxlIChjYWxlbmRhckRheXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGF5Vmlld0dyaWQucHVzaChjYWxlbmRhckRheXMuc3BsaWNlKDAsIHRoaXMuX2Ftb3VudE9mQ29scykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uucm93QW1vdW50ID0gZGF5Vmlld0dyaWQubGVuZ3RoO1xuXG4gICAgICAgIHRoaXMuX2RheVZpZXdHcmlkID0gZGF5Vmlld0dyaWQ7XG4gICAgICAgIHRoaXMuX3dlZWtzID0gdGhpcy5fcmVmcmVzaFdlZWtDb3VudCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBHZXQgaWQgb2YgY2FsZW5kYXIncyBkYXkgaXRlbVxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldENlbGxJZEJ5SW5kZXgoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctZGF5LScgKyBpbmRleCArICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2Qgd2hpY2ggcHJvdmlkZXMgYXJyYXkgb2YgQ2FsZW5kYXJEYXksXG4gICAgICogd2hpY2ggY29udGFpbnMgZXZlcnkgc2luZ2xlIGRheSBvZiBjdXJyZW50bHkgc2hvd24gbW9udGgveWVhci5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRDdXJyZW50TW9udGhEYXlzKCk6IENhbGVuZGFyRGF5PEQ+W10ge1xuICAgICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLm1vbnRoO1xuICAgICAgICBjb25zdCB5ZWFyID0gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQueWVhcjtcbiAgICAgICAgY29uc3QgY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheTxEPltdID0gW107XG4gICAgICAgIGNvbnN0IGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoOiBudW1iZXIgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgoXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgMSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdG9kYXkgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIudG9kYXkoKTtcbiAgICAgICAgZm9yIChsZXQgZGF5TnVtYmVyID0gMTsgZGF5TnVtYmVyIDw9IGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoOyBkYXlOdW1iZXIrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZTogRCA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCBkYXlOdW1iZXIpO1xuICAgICAgICAgICAgY2FsZW5kYXJEYXlzLnB1c2goe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2dldERheShkYXRlKSxcbiAgICAgICAgICAgICAgICBtb250aFN0YXR1czogJ2N1cnJlbnQnLFxuICAgICAgICAgICAgICAgIGN1cnJlbnQ6IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKHRvZGF5LCBkYXRlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2VsbCA9IHRoaXMuX2dldEFjdGl2ZUNlbGwoY2FsZW5kYXJEYXlzKTtcbiAgICAgICAgY2VsbCAmJiAoY2VsbC5pc1RhYkluZGV4ZWQgPSB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGNhbGVuZGFyRGF5cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgcmV0dXJucyBhY3RpdmUgY2VsbCwgd2hpY2ggbWVhbnM6XG4gICAgICogaWYgdGhlcmUgaXMgYW55IHNlbGVjdGVkIGRheSwgcmV0dXJuIHNlbGVjdGVkIGRheVxuICAgICAqIGlmIHRoZXJlIGlzIG5vIHNlbGVjdGVkIGRheSwgYnV0IHRoZXJlIGlzIHRvZGF5IGRheSwgcmV0dXJuIHRvZGF5IGRheVxuICAgICAqIGlmIHRoZXJlIGlzIG5vIHRvZGF5LCBvciBzZWxlY3RlZCwgcmV0dXJuIGZpcnN0IG9uZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldEFjdGl2ZUNlbGwoY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheTxEPltdKTogQ2FsZW5kYXJEYXk8RD4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYWxlbmRhckFjdGl2ZURheUNlbGxTdHJhdGVneTxEPigpLmdldEFjdGl2ZUNlbGwoY2FsZW5kYXJEYXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHdoaWNoIHByb3ZpZGVzIGFycmF5IG9mIENhbGVuZGFyRGF5LFxuICAgICAqIHdoaWNoIGNvbnRhaW5zIGxhc3QgMC02IGRheXMgb2YgcHJldmlvdXMgbW9udGgveWVhci4gVGhlc2VzIGRheXNcbiAgICAgKiBmaWxscyB0aGUgZ2FwIGJldHdlZW4gc3RhcnRpbmcgc3RhcnRpbmdEYXlPZldlZWsgYW5kIGZpcnN0IGRheSBvZiBjdXJyZW50IG1vbnRoXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0UHJldmlvdXNNb250aERheXMoY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheTxEPltdKTogQ2FsZW5kYXJEYXk8RD5bXSB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPiAxID8gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggLSAxIDogMTI7XG4gICAgICAgIGNvbnN0IHllYXIgPVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPiAxID8gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQueWVhciA6IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLnllYXIgLSAxO1xuICAgICAgICBjb25zdCBhbW91bnRPZkRheXNJbkN1cnJlbnRNb250aDogbnVtYmVyID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKFxuICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIDEpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHByZXZNb250aExhc3REYXRlID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoKTtcbiAgICAgICAgY29uc3QgcHJldk1vbnRoTGFzdERheSA9IGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoO1xuICAgICAgICBsZXQgcHJldk1vbnRoTGFzdFdlZWtEYXkgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrKHByZXZNb250aExhc3REYXRlKSAtIHRoaXMuc3RhcnRpbmdEYXlPZldlZWs7XG5cbiAgICAgICAgLyoqIENoZWNraW5nIGlmIHRoZXJlIGFyZSBzb21lIGRheXMgY3V0IGJ5IHN0YXJ0aW5nRGF5T2ZXZWVrIG9wdGlvblxuICAgICAgICAgKiAgSWYgeWVzLCB0aGVyZSBpcyB3aG9sZSB3ZWVrIGFkZGVkLCB0byBhdm9pZCBoaWRpbmdcbiAgICAgICAgICovXG4gICAgICAgIGlmIChwcmV2TW9udGhMYXN0V2Vla0RheSA8IDApIHtcbiAgICAgICAgICAgIHByZXZNb250aExhc3RXZWVrRGF5ID0gcHJldk1vbnRoTGFzdFdlZWtEYXkgKyA3O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXZNb250aExhc3RXZWVrRGF5IDwgNikge1xuICAgICAgICAgICAgd2hpbGUgKHByZXZNb250aExhc3RXZWVrRGF5ID49IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2TW9udGhEYXkgPSBwcmV2TW9udGhMYXN0RGF5IC0gcHJldk1vbnRoTGFzdFdlZWtEYXk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCBwcmV2TW9udGhEYXkpO1xuICAgICAgICAgICAgICAgIGNhbGVuZGFyRGF5cy5wdXNoKHsgLi4udGhpcy5fZ2V0RGF5KGRhdGUpLCBtb250aFN0YXR1czogJ3ByZXZpb3VzJyB9KTtcbiAgICAgICAgICAgICAgICBwcmV2TW9udGhMYXN0V2Vla0RheS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxlbmRhckRheXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB3aGljaCBwcm92aWRlcyBhcnJheSBvZiBDYWxlbmRhckRheSwgd2hpY2ggY29udGFpbnMgZmlyc3QgZGF5cyBvZiBuZXh0IG1vbnRoL3llYXIuIFRoZXNlcyBkYXlzXG4gICAgICogZmlsbHMgdGhlIGdhcCBiZXR3ZWVuIGxhc3QgZGF5IG9mIGN1cnJlbnQgZGF5IGFuZCBlbmQgb2YgNi13ZWVrcyBjYWxlbmRhciBncmlkLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldE5leHRNb250aERheXMoY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheTxEPltdKTogQ2FsZW5kYXJEYXk8RD5bXSB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPCAxMiA/IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLm1vbnRoICsgMSA6IDE7XG4gICAgICAgIGNvbnN0IHllYXIgPVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPCAxMiA/IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLnllYXIgOiB0aGlzLmN1cnJlbnRseURpc3BsYXllZC55ZWFyICsgMTtcblxuICAgICAgICAvLyBUaGUgY2FsZW5kYXIgZ3JpZCBjYW4gaGF2ZSA1ICgzNSBkYXlzKSBvciA2ICg0MiBkYXlzKSB3ZWVrc1xuICAgICAgICBjb25zdCBuZXh0TW9udGhEaXNwbGF5ZWREYXlzID0gKDQyIC0gY2FsZW5kYXJEYXlzLmxlbmd0aCkgJSA3O1xuXG4gICAgICAgIGZvciAobGV0IG5leHREID0gMTsgbmV4dEQgPD0gbmV4dE1vbnRoRGlzcGxheWVkRGF5czsgbmV4dEQrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCBuZXh0RCk7XG4gICAgICAgICAgICBjYWxlbmRhckRheXMucHVzaCh7IC4uLnRoaXMuX2dldERheShkYXRlKSwgbW9udGhTdGF0dXM6ICduZXh0JyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsZW5kYXJEYXlzO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfaXNXZWVrZW5kRGF5KGRheU9mV2VlazogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBkYXlPZldlZWsgPT09IDEgfHwgZGF5T2ZXZWVrID09PSA3O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBnZW5lcmF0ZXMgd2hvbGUgZGF5IG1vZGVsIGJhc2luZyBvbiBkYXRlLCBkaXNhYmxpbmcgZnVuY3Rpb25zLCBibG9jayBmdW5jdGlvbnMsIGFuZCBhY3R1YWxseVxuICAgICAqIGNob3NlbiByYW5nZSAvIHNpbmdsZSBkYXRlLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldERheShkYXRlOiBEKTogQ2FsZW5kYXJEYXk8RD4ge1xuICAgICAgICBjb25zdCB3ZWVrRGF5ID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldERheU9mV2VlayhkYXRlKTtcbiAgICAgICAgY29uc3QgZGF5T2ZNb250aCA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXRlKGRhdGUpO1xuICAgICAgICBjb25zdCBkYXRlTmFtZXMgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0RGF0ZU5hbWVzKCk7XG4gICAgICAgIGNvbnN0IGlzUGFzdCA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZShkYXRlLCB0aGlzLl9kYXRlVGltZUFkYXB0ZXIudG9kYXkoKSkgPCAwO1xuICAgICAgICBjb25zdCBkYXk6IENhbGVuZGFyRGF5PEQ+ID0ge1xuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGxhYmVsOiBkYXRlTmFtZXNbZGF5T2ZNb250aCAtIDFdLFxuICAgICAgICAgICAgd2Vla0RheSxcbiAgICAgICAgICAgIHdlZWtlbmQ6IHRoaXMuX2lzV2Vla2VuZERheSh3ZWVrRGF5KSxcbiAgICAgICAgICAgIGFyaWFMYWJlbDogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmZvcm1hdChkYXRlLCB0aGlzLl9kYXRlVGltZUZvcm1hdHMuZGlzcGxheS5kYXRlQTExeUxhYmVsKSxcbiAgICAgICAgICAgIHNwZWNpYWxOdW1iZXI6IHRoaXMuX2dldFNwZWNpYWxEYXkoZGF0ZSkgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgcGFzdDogaXNQYXN0XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqIEFwcGx5IGRpc2FibGVkIHN0YXRlIHRvIGRheXMgbWFya2VkIHdpdGggcGFzc2VkIGZ1bmN0aW9uICovXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVGdW5jdGlvbikge1xuICAgICAgICAgICAgZGF5LmRpc2FibGVkID0gdGhpcy5kaXNhYmxlRnVuY3Rpb24oZGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBpcyBjYWxsZWQgdG8gcmVmcmVzaCBpMThuIHNob3J0IHdlZWsgZGF5cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9yZWZyZXNoU2hvcnRXZWVrRGF5cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2hvcnREYXlPZldlZWtOYW1lcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnc2hvcnQnKTtcbiAgICAgICAgY29uc3QgZGF5T2ZXZWVrTmFtZXMgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrTmFtZXMoJ2xvbmcnKTtcblxuICAgICAgICB0aGlzLl9zaG9ydFdlZWtEYXlzID0gc2hvcnREYXlPZldlZWtOYW1lc1xuICAgICAgICAgICAgLnNsaWNlKHRoaXMuc3RhcnRpbmdEYXlPZldlZWsgLSAxKVxuICAgICAgICAgICAgLmNvbmNhdChzaG9ydERheU9mV2Vla05hbWVzLnNsaWNlKDAsIHRoaXMuc3RhcnRpbmdEYXlPZldlZWsgLSAxKSk7XG5cbiAgICAgICAgdGhpcy5fbG9uZ1dlZWtEYXlzID0gZGF5T2ZXZWVrTmFtZXNcbiAgICAgICAgICAgIC5zbGljZSh0aGlzLnN0YXJ0aW5nRGF5T2ZXZWVrIC0gMSlcbiAgICAgICAgICAgIC5jb25jYXQoZGF5T2ZXZWVrTmFtZXMuc2xpY2UoMCwgdGhpcy5zdGFydGluZ0RheU9mV2VlayAtIDEpKTtcblxuICAgICAgICB0aGlzLmNoYW5nZURldFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogR2V0cyBzcGVjaWFsIGRheSBudW1iZXIgb2Ygc3BlY2lmaWVkIGRhdGUgbW9kZWxcbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRTcGVjaWFsRGF5KGRhdGU6IEQpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgc3BlY2lhbERheSA9IHRoaXMuc3BlY2lhbERheXNSdWxlcy5maW5kKChzcGVjaWFsRGF5UnVsZSkgPT4gc3BlY2lhbERheVJ1bGUucnVsZShkYXRlKSk7XG4gICAgICAgIGlmIChzcGVjaWFsRGF5KSB7XG4gICAgICAgICAgICByZXR1cm4gc3BlY2lhbERheS5zcGVjaWFsRGF5TnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCByZXR1cm5zIGFycmF5IG9mIHdlZWsncyBjb3VudFxuICAgICAqL1xuICAgIHByaXZhdGUgX3JlZnJlc2hXZWVrQ291bnQoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBjYWxlbmRhckRheUxpc3QgPSB0aGlzLl9jYWxlbmRhckRheUxpc3Q7XG4gICAgICAgIGNvbnN0IHdlZWtOdW1iZXJzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDY7IGluZGV4IDwgY2FsZW5kYXJEYXlMaXN0Lmxlbmd0aDsgaW5kZXggPSBpbmRleCArIDYpIHtcbiAgICAgICAgICAgIHdlZWtOdW1iZXJzLnB1c2godGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldFdlZWtOYW1lKGNhbGVuZGFyRGF5TGlzdFtpbmRleF0uZGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3ZWVrTnVtYmVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogR2V0IHllYXIgYW5kIG1vbnRoIGZvciBwcmV2aW91cyB5ZWFyXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0UHJldmlvdXNNb250aCgpOiBDYWxlbmRhckN1cnJlbnQge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudGx5RGlzcGxheWVkLm1vbnRoID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgeWVhcjogdGhpcy5fY3VycmVudGx5RGlzcGxheWVkLnllYXIsIG1vbnRoOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggLSAxIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyB5ZWFyOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQueWVhciAtIDEsIG1vbnRoOiAxMiB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEdldCB5ZWFyIGFuZCBtb250aCBmb3IgbmV4dCB5ZWFyXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0TmV4dE1vbnRoKCk6IENhbGVuZGFyQ3VycmVudCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPCAxMikge1xuICAgICAgICAgICAgcmV0dXJuIHsgeWVhcjogdGhpcy5fY3VycmVudGx5RGlzcGxheWVkLnllYXIsIG1vbnRoOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggKyAxIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyB5ZWFyOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQueWVhciArIDEsIG1vbnRoOiAxIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRvIHB1dCBjb25maWd1cmF0aW9uIGFuZCBsaXN0ZW5lcnMgb24gY2FsZW5kYXIga2V5Ym9hcmQgc2VydmljZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3NldHVwS2V5Ym9hcmRTZXJ2aWNlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5jb2xBbW91bnQgPSB0aGlzLl9hbW91bnRPZkNvbHM7XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2UuZm9jdXNFc2NhcGVGdW5jdGlvbiA9IHRoaXMuZm9jdXNFc2NhcGVGdW5jdGlvbjtcblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5vbkZvY3VzSWRDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZSgoaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbkNlbGxCeUluZGV4KGluZGV4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uub25LZXlTZWxlY3QucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZSgoaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZSh0aGlzLl9jYWxlbmRhckRheUxpc3RbaW5kZXhdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uub25MaXN0U3RhcnRBcHByb2FjaC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKChpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0UHJldmlvdXNNb250aCgpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBDYWxjdWxhdGUgZm9jdXNlZCBjZWxsIGluIG5ldyBncmlkXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTW9udGggPSB0aGlzLl9nZXROZXh0TW9udGgoKTsgLy8gbW9udGggdGhhdCB3YXMgYmVmb3JlIG1vdmluZyBiYWNrXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEFtb3VudE9mV2Vla3MgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0QW1vdW50T2ZXZWVrcyhcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE1vbnRoLnllYXIsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxNb250aC5tb250aCxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0aW5nRGF5T2ZXZWVrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcHJldk1vbnRoQW1vdW50T2ZXZWVrcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXRBbW91bnRPZldlZWtzKFxuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC55ZWFyLFxuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC5tb250aCxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0aW5nRGF5T2ZXZWVrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gdHJpZ2dlciByZW5kZXJpbmcgZm9yIG5ldyBncmlkIHNvIGZvY3VzIGNhbiBiZSBzZXRcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbkNlbGxCeUluZGV4KGluZGV4IC0gNyAqIChvcmlnaW5hbEFtb3VudE9mV2Vla3MgLSBwcmV2TW9udGhBbW91bnRPZldlZWtzKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLm9uTGlzdEVuZEFwcHJvYWNoLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKS5zdWJzY3JpYmUoKGluZGV4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3ROZXh0TW9udGgoKTtcbiAgICAgICAgICAgIC8vIHRyaWdnZXIgcmVuZGVyaW5nIGZvciBuZXcgZ3JpZCBzbyBmb2N1cyBjYW4gYmUgc2V0XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzT25DZWxsQnlJbmRleChpbmRleCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBDaGFuZ2Ugc2VsZWN0aW9uIGZsYWcgb24gZGF5cyB0byBmYWxzZSwgYmVzaWRlcyB0aGUgc2VsZWN0ZWQgb25lXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2hhbmdlU2VsZWN0ZWRTaW5nbGVEYXkoZGF5OiBDYWxlbmRhckRheTxEPiB8IHVuZGVmaW5lZCwgY2FsZW5kYXI6IENhbGVuZGFyRGF5PEQ+W10pOiB2b2lkIHtcbiAgICAgICAgY2FsZW5kYXIuZm9yRWFjaCgoX2RheSkgPT4gKF9kYXkuc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgICAgICBpZiAoZGF5ICYmICFkYXkuYmxvY2tlZCAmJiAhZGF5LmRpc2FibGVkKSB7XG4gICAgICAgICAgICBkYXkuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVmcmVzaFRhYkluZGV4KGNhbGVuZGFyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQ2hhbmdlIHByb3BlcnRpZXMgb2YgcmFuZ2UgZGF5cywgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCB0byBub3QgcmVidWlsZCB3aG9sZSBncmlkIGZyb20gc2NyYXRjaCxcbiAgICAgKiBpdCBqdXN0IGNoYW5nZXMgcHJvcGVydGllcyBvZiBuZXdseSBzZWxlY3RlZC91bnNlbGVjdGVkIGRheXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2hhbmdlU2VsZWN0ZWRSYW5nZURheXMoZGF0ZXM6IERhdGVSYW5nZTxEPiwgY2FsZW5kYXI6IENhbGVuZGFyRGF5PEQ+W10pOiB2b2lkIHtcbiAgICAgICAgLyoqIFB1bGwgbGlzdCBvZiBjYWxlbmRhciBkYXlzICovXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyTGlzdCA9IGNhbGVuZGFyO1xuXG4gICAgICAgIC8qKiBSZXNldCBjaGFuZ2luZyBwcm9wZXJ0aWVzICovXG4gICAgICAgIGNhbGVuZGFyTGlzdC5mb3JFYWNoKFxuICAgICAgICAgICAgKF9kYXkpID0+XG4gICAgICAgICAgICAgICAgKF9kYXkuc2VsZWN0ZWRGaXJzdCA9XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuc2VsZWN0ZWRMYXN0ID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5zZWxlY3RlZCA9XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuaXNUYWJJbmRleGVkID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5kaXNhYmxlZCA9XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuaG92ZXJSYW5nZSA9XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuc2VsZWN0ZWRSYW5nZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZGF0ZXMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydERheTogQ2FsZW5kYXJEYXk8RD4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgZW5kRGF5OiBDYWxlbmRhckRheTxEPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChkYXRlcy5zdGFydCkge1xuICAgICAgICAgICAgICAgIC8qKiBGaW5kIHN0YXJ0IGRhdGUgYW5kIG1hcmsgaXQgYXMgc2VsZWN0ZWQgKi9cbiAgICAgICAgICAgICAgICBzdGFydERheSA9IGNhbGVuZGFyTGlzdC5maW5kKChfZGF5KSA9PiB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChfZGF5LmRhdGUsIGRhdGVzLnN0YXJ0KSk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBzdGFydERheSAmJlxuICAgICAgICAgICAgICAgICAgICAhc3RhcnREYXkuYmxvY2tlZCAmJlxuICAgICAgICAgICAgICAgICAgICAhc3RhcnREYXkuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRpc2FibGVSYW5nZVN0YXJ0RnVuY3Rpb24gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLmRpc2FibGVSYW5nZVN0YXJ0RnVuY3Rpb24oc3RhcnREYXkuZGF0ZSkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF5LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXkuc2VsZWN0ZWRGaXJzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGVzLmVuZCkge1xuICAgICAgICAgICAgICAgIC8qKiBGaW5kIGVuZCBkYXRlIGFuZCBtYXJrIGl0IGFzIHNlbGVjdGVkICovXG4gICAgICAgICAgICAgICAgZW5kRGF5ID0gY2FsZW5kYXJMaXN0LmZpbmQoKF9kYXkpID0+IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKF9kYXkuZGF0ZSwgZGF0ZXMuZW5kKSk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBlbmREYXkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWVuZERheS5ibG9ja2VkICYmXG4gICAgICAgICAgICAgICAgICAgICFlbmREYXkuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uICE9PSAnZnVuY3Rpb24nIHx8ICF0aGlzLmRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uKGVuZERheS5kYXRlKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF5LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF5LnNlbGVjdGVkTGFzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiogVmVyaWZ5IGlmIHN0YXJ0IGRheSBhbmQgZW5kIGRheSBpcyB2YWxpZCwgb3RoZXJ3aXNlIGRvbid0IHB1dCByYW5nZSBzZWxlY3Rpb24gKi9cbiAgICAgICAgICAgIGlmIChkYXRlcy5zdGFydCAmJiBkYXRlcy5lbmQpIHtcbiAgICAgICAgICAgICAgICAvKiogTWFyayBhbGwgZGF5cywgd2hpY2ggYXJlIGJldHdlZW4gc3RhcnQgYW5kIGVuZCBkYXRlICovXG4gICAgICAgICAgICAgICAgY2FsZW5kYXJMaXN0XG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAoX2RheSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX2RheS5zZWxlY3RlZFJhbmdlID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmlzQmV0d2VlbihfZGF5LmRhdGUsIGRhdGVzLnN0YXJ0ISwgZGF0ZXMuZW5kISkpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goKF9kYXkpID0+IChfZGF5LnNlbGVjdGVkUmFuZ2UgPSB0cnVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hUYWJJbmRleChjYWxlbmRhckxpc3QpO1xuXG4gICAgICAgIC8qKiBBcHBseSBkaXNhYmxlZCBzdGF0ZSB0byBkYXlzIG1hcmtlZCB3aXRoIHBhc3NlZCBmdW5jdGlvbiAqL1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGNhbGVuZGFyTGlzdC5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZUZ1bmN0aW9uIShfZGF5LmRhdGUpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHRoaXMuX3NlbGVjdENvdW50ZXIgPT09IDAgfHwgdGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMikgJiYgdGhpcy5kaXNhYmxlUmFuZ2VTdGFydEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBjYWxlbmRhckxpc3QuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAoX2RheSkgPT4gKF9kYXkuZGlzYWJsZWQgPSBfZGF5LmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZVJhbmdlU3RhcnRGdW5jdGlvbiEoX2RheS5kYXRlKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMSAmJiB0aGlzLmRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBjYWxlbmRhckxpc3QuZm9yRWFjaCgoX2RheSkgPT4gKF9kYXkuZGlzYWJsZWQgPSBfZGF5LmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZVJhbmdlRW5kRnVuY3Rpb24hKF9kYXkuZGF0ZSkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSByZWZyZXNoVGFiSW5kZXgoY2FsZW5kYXI6IENhbGVuZGFyRGF5PEQ+W10pOiB2b2lkIHtcbiAgICAgICAgY2FsZW5kYXIuZm9yRWFjaCgoX2RheSkgPT4gKF9kYXkuaXNUYWJJbmRleGVkID0gZmFsc2UpKTtcbiAgICAgICAgY29uc3QgY2VsbCA9IHRoaXMuX2dldEFjdGl2ZUNlbGwoY2FsZW5kYXIuZmlsdGVyKChfZGF5KSA9PiBfZGF5Lm1vbnRoU3RhdHVzID09PSAnY3VycmVudCcpKTtcbiAgICAgICAgY2VsbCAmJiAoY2VsbC5pc1RhYkluZGV4ZWQgPSB0cnVlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgZm9jdXNPbkNlbGxCeUluZGV4KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZm9jdXNFbGVtZW50QnlTZWxlY3RvcihgIyR7dGhpcy5fZ2V0Q2VsbElkQnlJbmRleChpbmRleCl9YCk7XG4gICAgfVxufVxuIiwiPHRhYmxlIGNsYXNzPVwiZmQtY2FsZW5kYXJfX3RhYmxlXCIgcm9sZT1cImdyaWRcIiBbYXR0ci5hcmlhLXJvbGVkZXNjcmlwdGlvbl09XCJfdmlld1JvbGVEZXNjcmlwdGlvblwiPlxuICAgIDx0aGVhZCBjbGFzcz1cImZkLWNhbGVuZGFyX19ncm91cFwiIHJvbGU9XCJyb3dncm91cFwiPlxuICAgICAgICA8dHIgY2xhc3M9XCJmZC1jYWxlbmRhcl9fcm93XCIgcm9sZT1cInJvd1wiPlxuICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93V2Vla051bWJlcnNcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtY2FsZW5kYXJfX2l0ZW0gZmQtY2FsZW5kYXJfX2l0ZW0tLXNpZGUtaGVscGVyXCJcbiAgICAgICAgICAgICAgICByb2xlPVwiY29sdW1uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJfd2Vla051bWJlcnNDb2x1bW5IZWFkZXJJZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJfd2Vla0NvbHVtbkxhYmVsQXJpYUxhYmVsXCJcbiAgICAgICAgICAgID48L3RoPlxuICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1jYWxlbmRhcl9faXRlbSBmZC1jYWxlbmRhcl9faXRlbS0tc2lkZS1oZWxwZXJcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJjb2x1bW5oZWFkZXJcIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXkgb2Ygc2hvcnRXZWVrRGF5czsgaW5kZXggYXMgaVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsb25nV2Vla0RheXNbaV1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmQtY2FsZW5kYXJfX3RleHRcIj57eyBkYXkgfX08L3NwYW4+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgIDwvdGhlYWQ+XG4gICAgPHRib2R5IGNsYXNzPVwiZmQtY2FsZW5kYXJfX2dyb3VwXCIgcm9sZT1cInJvd2dyb3VwXCI+XG4gICAgICAgIDx0ciBjbGFzcz1cImZkLWNhbGVuZGFyX19yb3dcIiByb2xlPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBfZGF5Vmlld0dyaWQ7IGxldCByb3dJbmRleCA9IGluZGV4XCI+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dXZWVrTnVtYmVyc1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1jYWxlbmRhcl9faXRlbSBmZC1jYWxlbmRhcl9faXRlbS0tc2lkZS1oZWxwZXJcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJyb3doZWFkZXJcIlxuICAgICAgICAgICAgICAgIHNjb3BlPVwicm93XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWZkLWNhbGVuZGFyLXdlZWtdPVwiX3dlZWtzW3Jvd0luZGV4XVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwidmlld0lkICsgJy13ZWVrLScgKyBfd2Vla3Nbcm93SW5kZXhdXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiX3dlZWtOdW1iZXJzQ29sdW1uSGVhZGVySWQgKyAnICcgKyAodmlld0lkICsgJy13ZWVrLScgKyBfd2Vla3Nbcm93SW5kZXhdKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJfd2Vla3MgJiYgX3dlZWtzW3Jvd0luZGV4XVwiIGNsYXNzPVwiZmQtY2FsZW5kYXJfX3RleHRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgX3dlZWtzW3Jvd0luZGV4XSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmQtY2FsZW5kYXJfX2l0ZW1cIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNlbGwgb2Ygcm93OyBsZXQgY2VsbEluZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwiY2VsbC5zZWxlY3RlZEZpcnN0IHx8IGNlbGwuc2VsZWN0ZWRMYXN0IHx8IGNlbGwuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mZC1jYWxlbmRhcl9faXRlbS0tcmFuZ2VdPVwiXG4gICAgICAgICAgICAgICAgICAgIChjZWxsLnNlbGVjdGVkUmFuZ2UgfHwgY2VsbC5ob3ZlclJhbmdlKSAmJiAhY2VsbC5zZWxlY3RlZEZpcnN0ICYmICFjZWxsLnNlbGVjdGVkTGFzdFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZkLWNhbGVuZGFyX19pdGVtLS1jdXJyZW50XT1cImNlbGwuY3VycmVudFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZkLWNhbGVuZGFyX19pdGVtLS13ZWVrZW5kXT1cImNlbGwud2Vla2VuZCAmJiBtYXJrV2Vla2VuZHMgJiYgY2VsbC5tb250aFN0YXR1cyA9PT0gJ2N1cnJlbnQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtY2FsZW5kYXJfX2l0ZW0tLW90aGVyLW1vbnRoXT1cImNlbGwubW9udGhTdGF0dXMgIT09ICdjdXJyZW50J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLWRpc2FibGVkXT1cImNlbGwuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjZWxsLnNwZWNpYWxOdW1iZXIgPyAnZmQtY2FsZW5kYXJfX3NwZWNpYWwtZGF5LS0nICsgY2VsbC5zcGVjaWFsTnVtYmVyIDogJydcIlxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImNlbGwuaWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZmQtY2FsZW5kYXItZGF0ZS1kYXldPVwiY2VsbC5sYWJlbFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mZC1jYWxlbmRhci1kYXldPVwiY2VsbC5pbmRleFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJjZWxsLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImNlbGwuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImNlbGwuaXNUYWJJbmRleGVkID8gMCA6IC0xXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShjZWxsLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJfcmVmcmVzaEhvdmVyUmFuZ2UoY2VsbClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIl9vbktleWRvd25EYXlIYW5kbGVyKCRldmVudCwgY2VsbCwgX2dldEluZGV4KHJvd0luZGV4LCBjZWxsSW5kZXgpKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1jYWxlbmRhcl9fdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsLmlkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICctYXJpYS1sYWJlbCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChjZWxsLnNlbGVjdGVkRmlyc3QgPyBfZGF0ZVJhbmdlU3RhcnRMYWJlbElkICsgJyAnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChjZWxsLnNlbGVjdGVkTGFzdCA/IF9kYXRlUmFuZ2VFbmRMYWJlbElkICsgJyAnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChjZWxsLmN1cnJlbnQgPyBfdG9kYXlMYWJlbElkICsgJyAnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChjZWxsLnNlbGVjdGVkICYmIGNhbFR5cGUgPT09ICdzaW5nbGUnID8gX3NlbGVjdGVkRGF0ZUxhYmVsSWQgKyAnICcgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGwucGFzdCA/IF9kYXRlSW5QYXN0TGFiZWxJZCA6ICcnKVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+e3sgY2VsbC5sYWJlbCB9fTwvc3BhblxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBoaWRkZW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgW2F0dHIuaWRdPVwiY2VsbC5pZCArICctYXJpYS1sYWJlbCdcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY2VsbC5hcmlhTGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJmZC1jYWxlbmRhcl9fcm93XCIgKm5nSWY9XCJfZGF5Vmlld0dyaWQubGVuZ3RoIDw9IDVcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtIGhpZGRlbi1kYXlcIj48L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJmZC1jYWxlbmRhcl9fcm93XCIgKm5nSWY9XCJfZGF5Vmlld0dyaWQubGVuZ3RoID09PSA0XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJmZC1jYWxlbmRhcl9faXRlbSBoaWRkZW4tZGF5XCI+PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L3Rib2R5PlxuPC90YWJsZT5cblxuPCEtLSBIaWRkZW4gZWxlbWVudHMgZm9yIGFyaWEgcHVycG9zZXMgLS0+XG48ZGl2IGhpZGRlbiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICA8ZGl2IFthdHRyLmlkXT1cIl90b2RheUxhYmVsSWRcIj57eyBfdG9kYXlBcmlhTGFiZWwgfX08L2Rpdj5cbiAgICA8ZGl2IFthdHRyLmlkXT1cIl9zZWxlY3RlZERhdGVMYWJlbElkXCI+e3sgX3NlbGVjdGVkRGF0ZUFyaWFMYWJlbCB9fTwvZGl2PlxuICAgIDxkaXYgW2F0dHIuaWRdPVwiX2RhdGVSYW5nZVN0YXJ0TGFiZWxJZFwiPnt7IF9yYW5nZVN0YXJ0QXJpYUxhYmVsIH19PC9kaXY+XG4gICAgPGRpdiBbYXR0ci5pZF09XCJfZGF0ZVJhbmdlRW5kTGFiZWxJZFwiPnt7IF9yYW5nZUVuZEFyaWFMYWJlbCB9fTwvZGl2PlxuICAgIDxkaXYgW2F0dHIuaWRdPVwiX2RhdGVJblBhc3RMYWJlbElkXCI+e3sgX2RhdGVJblBhc3RBcmlhTGFiZWwgfX08L2Rpdj5cbjwvZGl2PlxuIl19
767
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY2FsZW5kYXIvY2FsZW5kYXItdmlld3MvY2FsZW5kYXItZGF5LXZpZXcvY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY2FsZW5kYXIvY2FsZW5kYXItdmlld3MvY2FsZW5kYXItZGF5LXZpZXcvY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixpQkFBaUIsRUFDakIsTUFBTSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBbUIsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFckcsT0FBTyxLQUFLLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXBELE9BQU8sRUFBRSw2QkFBNkIsSUFBSSw2QkFBNkIsRUFBZSxNQUFNLDJCQUEyQixDQUFDO0FBR3hILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7O0FBSXpELDJEQUEyRDtBQVkzRCxNQUFNLE9BQU8sd0JBQXdCO0lBQ2pDLGtEQUFrRDtJQUNsRCxJQUNJLGtCQUFrQixDQUFDLGtCQUFtQztRQUN0RCxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFF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QyxJQUFJLFFBQy9CO3dCQUNGLFdBQVcsRUFBRSxRQUFRO3dCQUNyQixLQUFLLEVBQUUsb0JBQW9CO3FCQUM5QixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTTs7MEJBMkwxQyxNQUFNOzJCQUFDLGlCQUFpQjswRUF0THpCLGtCQUFrQjtzQkFEckIsS0FBSztnQkFpQkYsWUFBWTtzQkFEZixLQUFLO2dCQWtCRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBeUJOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFLTixPQUFPO3NCQUROLEtBQUs7Z0JBS04sRUFBRTtzQkFERCxLQUFLO2dCQVFOLGdCQUFnQjtzQkFEZixLQUFLO2dCQU9OLFlBQVk7c0JBRFgsS0FBSztnQkFPTixlQUFlO3NCQURkLEtBQUs7Z0JBS04sbUJBQW1CO3NCQURsQixLQUFLO2dCQVdOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUtHLHVCQUF1QjtzQkFEL0IsTUFBTTtnQkFLRSxlQUFlO3NCQUR2QixNQUFNO2dCQUtFLG1CQUFtQjtzQkFEM0IsTUFBTTtnQkFLRSxrQkFBa0I7c0JBRDFCLE1BQU07Z0JBZ0RQLGVBQWU7c0JBRGQsS0FBSztnQkFRTix5QkFBeUI7c0JBRHhCLEtBQUs7Z0JBUU4sdUJBQXVCO3NCQUR0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG4gICAgSW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBEQVRFX1RJTUVfRk9STUFUUywgRGF0ZVRpbWVGb3JtYXRzLCBEYXRldGltZUFkYXB0ZXIgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvZGF0ZXRpbWUnO1xuaW1wb3J0IHsgU3BlY2lhbERheVJ1bGUgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvc2hhcmVkJztcbmltcG9ydCBlcXVhbCBmcm9tICdmYXN0LWRlZXAtZXF1YWwnO1xuXG5pbXBvcnQgeyBEYXRlUmFuZ2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0ZS1yYW5nZSc7XG5pbXBvcnQgeyBDYWxlbmRhckN1cnJlbnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2FsZW5kYXItY3VycmVudCc7XG5pbXBvcnQgeyBBY3RpdmVDYWxlbmRhckRheUNlbGxTdHJhdGVneSBhcyBDYWxlbmRhckFjdGl2ZURheUNlbGxTdHJhdGVneSwgQ2FsZW5kYXJEYXkgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2FsZW5kYXItZGF5JztcblxuaW1wb3J0IHsgQ2FsZW5kYXJUeXBlLCBEYXlzT2ZXZWVrIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ2FsZW5kYXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY2FsZW5kYXIuc2VydmljZSc7XG5pbXBvcnQgeyBEaXNhYmxlRGF0ZUZ1bmN0aW9uLCBFc2NhcGVGb2N1c0Z1bmN0aW9uLCBGb2N1c2FibGVDYWxlbmRhclZpZXcgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29tbW9uJztcbmltcG9ydCB7IE51bGxhYmxlIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuXG4vKiogQ29tcG9uZW50IHJlcHJlc2VudGluZyB0aGUgZGF5IHZpZXcgb2YgdGhlIGNhbGVuZGFyLiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC1jYWxlbmRhci1kYXktdmlldycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLWRheS12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1kYXktdmlldy5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgaG9zdDoge1xuICAgICAgICAnW2F0dHIuaWRdJzogJ3ZpZXdJZCcsXG4gICAgICAgIGNsYXNzOiAnZmQtY2FsZW5kYXJfX2RhdGVzJ1xuICAgIH0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJEYXlWaWV3Q29tcG9uZW50PEQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgRm9jdXNhYmxlQ2FsZW5kYXJWaWV3IHtcbiAgICAvKiogQ3VycmVudGx5IGRpc3BsYXllZCBtb250aCBhbmQgeWVhciBmb3IgZGF5cyAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGN1cnJlbnRseURpc3BsYXllZChjdXJyZW50bHlEaXNwbGF5ZWQ6IENhbGVuZGFyQ3VycmVudCkge1xuICAgICAgICBpZiAoIWVxdWFsKGN1cnJlbnRseURpc3BsYXllZCwgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkKSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkID0gY3VycmVudGx5RGlzcGxheWVkO1xuICAgICAgICAgICAgdGhpcy5fYnVpbGREYXlWaWV3R3JpZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGN1cnJlbnRseURpc3BsYXllZCgpOiBDYWxlbmRhckN1cnJlbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudGx5RGlzcGxheWVkO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY3VycmVudGx5RGlzcGxheWVkOiBDYWxlbmRhckN1cnJlbnQ7XG5cbiAgICAvKiogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBkYXRlIG1vZGVsIGluIHNpbmdsZSBtb2RlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHNlbGVjdGVkRGF0ZShkYXRlOiBOdWxsYWJsZTxEPikge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGUgPSBkYXRlO1xuICAgICAgICBpZiAodGhpcy5fZGF5Vmlld0dyaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRheUZyb21EYXRlID0gdGhpcy5fY2FsZW5kYXJEYXlMaXN0LmZpbmQoKGRheSkgPT4gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwoZGF5LmRhdGUsIGRhdGUpKTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZVNlbGVjdGVkU2luZ2xlRGF5KGRheUZyb21EYXRlLCB0aGlzLl9jYWxlbmRhckRheUxpc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHNlbGVjdGVkRGF0ZSgpOiBOdWxsYWJsZTxEPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZERhdGU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zZWxlY3RlZERhdGU6IE51bGxhYmxlPEQ+O1xuXG4gICAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgRmREYXRlcyBtb2RlbCBzdGFydCBhbmQgZW5kIGluIHJhbmdlIG1vZGUuICovXG4gICAgQElucHV0KClcbiAgICBzZXQgc2VsZWN0ZWRSYW5nZURhdGUoZGF0ZVJhbmdlOiBEYXRlUmFuZ2U8RD4pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0ZVJhbmdlICYmXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlICYmXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChkYXRlUmFuZ2Uuc3RhcnQsIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnQpICYmXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChkYXRlUmFuZ2UuZW5kLCB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLmVuZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUgPSBkYXRlUmFuZ2U7XG4gICAgICAgIGlmICh0aGlzLl9kYXlWaWV3R3JpZCkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlU2VsZWN0ZWRSYW5nZURheXMoZGF0ZVJhbmdlLCB0aGlzLl9jYWxlbmRhckRheUxpc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHNlbGVjdGVkUmFuZ2VEYXRlKCk6IERhdGVSYW5nZTxEPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3NlbGVjdGVkUmFuZ2VEYXRlOiBEYXRlUmFuZ2U8RD47XG5cbiAgICAvKiogVGhlIGRheSBvZiB0aGUgd2VlayB0aGUgY2FsZW5kYXIgc2hvdWxkIHN0YXJ0IG9uLiAxIHJlcHJlc2VudHMgU3VuZGF5LCAyIGlzIE1vbmRheSwgMyBpcyBUdWVzZGF5LCBhbmQgc28gb24uICovXG4gICAgQElucHV0KClcbiAgICBzdGFydGluZ0RheU9mV2VlazogRGF5c09mV2VlaztcblxuICAgIC8qKiBUaGUgdHlwZSBvZiBjYWxlbmRhciwgJ3NpbmdsZScgZm9yIHNpbmdsZSBkYXRlIHNlbGVjdGlvbiBvciAncmFuZ2UnIGZvciBhIHJhbmdlIG9mIGRhdGVzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgY2FsVHlwZTogQ2FsZW5kYXJUeXBlID0gJ3NpbmdsZSc7XG5cbiAgICAvKiogSWQgb2YgdGhlIGNhbGVuZGFyLiBJZiBub25lIGlzIHByb3ZpZGVkLCBvbmUgd2lsbCBiZSBnZW5lcmF0ZWQuICovXG4gICAgQElucHV0KClcbiAgICBpZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB1c2VyIHdhbnRzIHRvIG1hcmsgZGF5IGNlbGxzIG9uIGhvdmVyLlxuICAgICAqIFdvcmtzIG9ubHkgb24gcmFuZ2UgbW9kZSwgd2hlbiBzdGFydCBkYXRlIGlzIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcmFuZ2VIb3ZlckVmZmVjdCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB1c2VyIHdhbnRzIHRvIG1hcmsgc3VuZGF5L3NhdHVyZGF5IHdpdGggYGZkLWNhbGVuZGFyX19pdGVtLS13ZWVrZW5kYCBjbGFzc1xuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWFya1dlZWtlbmRzID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHVzZXIgd2FudHMgdG8gc2hvdyB3ZWVrIG51bWJlcnMgbmV4dCB0byBkYXlzXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzaG93V2Vla051bWJlcnMgPSB0cnVlO1xuXG4gICAgLyoqIEZ1bmN0aW9uIHRoYXQgYWxsb3dzIHRvIHNwZWNpZnkgd2hpY2ggZnVuY3Rpb24gd291bGQgYmUgY2FsbGVkLCB3aGVuIGZvY3VzIHdhbnRzIHRvIGVzY2FwZSAqL1xuICAgIEBJbnB1dCgpXG4gICAgZm9jdXNFc2NhcGVGdW5jdGlvbjogRXNjYXBlRm9jdXNGdW5jdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpYWwgZGF5cyBtYXJrLCBpdCBjYW4gYmUgdXNlZCBieSBwYXNzaW5nIGFycmF5IG9mIG9iamVjdCB3aXRoXG4gICAgICogU3BlY2lhbCBkYXkgbnVtYmVyLCBsaXN0IDEtMjAgW2NsYXNzOmBmZC1jYWxlbmRhcl9fc3BlY2lhbC1kYXktLXt7bnVtYmVyfX1gXSBpcyBhdmFpbGFibGUgdGhlcmU6XG4gICAgICogaHR0cHM6Ly9zYXAuZ2l0aHViLmlvL2Z1bmRhbWVudGFsLXN0eWxlcy9jb21wb25lbnRzL2NhbGVuZGFyLmh0bWwgY2FsZW5kYXIgc3BlY2lhbCBkYXlzIHNlY3Rpb25cbiAgICAgKiBSdWxlIGFjY2VwdHMgbWV0aG9kIHdpdGggZGF0ZSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIuIGV4OlxuICAgICAqIGBydWxlOiAoZGF0ZTogRCkgPT4gdGhpcy5kYXRlQWRhcHRlci5nZXREYXkoZGF0ZSkgPT09IDFgLCB3aGljaCB3aWxsIG1hcmsgYWxsIHN1bmRheXMgYXMgc3BlY2lhbCBkYXkuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBzcGVjaWFsRGF5c1J1bGVzOiBTcGVjaWFsRGF5UnVsZTxEPltdID0gW107XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCBhbHdheXMsIHdoZW4gbW9kZWwgaXMgY2hhbmdlZCBpbiByYW5nZSBtb2RlICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgc2VsZWN0ZWRSYW5nZURhdGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxEYXRlUmFuZ2U8RD4+ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlUmFuZ2U8RD4+KCk7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCBhbHdheXMsIHdoZW4gbmV4dCBtb250aCBpcyBzZWxlY3RlZCwgYnkgZm9jdXMgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBuZXh0TW9udGhTZWxlY3Q6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIGFsd2F5cywgd2hlbiBwcmV2aW91cyBtb250aCBpcyBzZWxlY3RlZCwgYnkgZm9jdXMgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBwcmV2aW91c01vbnRoU2VsZWN0OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCBhbHdheXMsIHdoZW4gbW9kZWwgaXMgY2hhbmdlZCBpbiBzaW5nbGUgbW9kZSAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IHNlbGVjdGVkRGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPEQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEFjdHVhbCBkYXkgZ3JpZCB3aXRoIHByZXZpb3VzL2N1cnJlbnQvbmV4dCBtb250aCBkYXlzXG4gICAgICovXG4gICAgX2RheVZpZXdHcmlkOiBDYWxlbmRhckRheTxEPltdW107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQXJyYXkgb2Ygd2VlayBudW1iZXJzIGRpc3BsYXllZCBmb3IgY3VycmVudCBtb250aC95ZWFyXG4gICAgICovXG4gICAgX3dlZWtzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBBbiBSeEpTIFN1YmplY3QgdGhhdCB3aWxsIGtpbGwgdGhlIGRhdGEgc3RyZWFtIHVwb24gY29tcG9uZW504oCZcyBkZXN0cnVjdGlvbiAoZm9yIHVuc3Vic2NyaWJpbmcpXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25EZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogRGF5cyBwZXIgd2Vla1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Ftb3VudE9mQ29scyA9IDc7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pc09uUmFuZ2VQaWNrID0gZmFsc2U7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pc0luaXRpYXRlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFZhcmlhYmxlIHRoYXQgY29udGFpbnMgc2hvcnQgd2Vla2RheSBuYW1lcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9zaG9ydFdlZWtEYXlzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBWYXJpYWJsZSB0aGF0IGNvbnRhaW5zIHNob3J0IHdlZWtkYXkgbmFtZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbG9uZ1dlZWtEYXlzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHVzZWQgdG8gZGlzYWJsZSBjZXJ0YWluIGRhdGVzIGluIHRoZSBjYWxlbmRhci5cbiAgICAgKiBAcGFyYW0gZGF0ZSBkYXRlIHR5cGVcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVGdW5jdGlvbjogRGlzYWJsZURhdGVGdW5jdGlvbjxEPjtcblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHVzZWQgdG8gZGlzYWJsZSBjZXJ0YWluIGRhdGVzIGluIHRoZSBjYWxlbmRhciBmb3IgdGhlIHJhbmdlIHN0YXJ0IHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0gZGF0ZSBkYXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlUmFuZ2VTdGFydEZ1bmN0aW9uOiBEaXNhYmxlRGF0ZUZ1bmN0aW9uPEQ+O1xuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdXNlZCB0byBkaXNhYmxlIGNlcnRhaW4gZGF0ZXMgaW4gdGhlIGNhbGVuZGFyIGZvciB0aGUgcmFuZ2UgZW5kIHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0gZGF0ZSBkYXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlUmFuZ2VFbmRGdW5jdGlvbjogRGlzYWJsZURhdGVGdW5jdGlvbjxEPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZVJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIGNhbGVuZGFyU2VydmljZTogQ2FsZW5kYXJTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KERBVEVfVElNRV9GT1JNQVRTKSBwcml2YXRlIF9kYXRlVGltZUZvcm1hdHM6IERhdGVUaW1lRm9ybWF0cyxcbiAgICAgICAgcHVibGljIF9kYXRlVGltZUFkYXB0ZXI6IERhdGV0aW1lQWRhcHRlcjxEPlxuICAgICkge31cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2lzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLl9zZXR1cEtleWJvYXJkU2VydmljZSgpO1xuXG4gICAgICAgIHRoaXMuX3JlZnJlc2hTaG9ydFdlZWtEYXlzKCk7XG5cbiAgICAgICAgdGhpcy5fYnVpbGREYXlWaWV3R3JpZCgpO1xuXG4gICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5sb2NhbGVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFNob3J0V2Vla0RheXMoKTtcbiAgICAgICAgICAgIHRoaXMuX2J1aWxkRGF5Vmlld0dyaWQoKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0UmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgLyoqIENoYW5nZXMgb2YgdGhvc2UgcHJvcGVydGllcyBhcmUgZG9uZSBpbnNpZGUgaXRzIHNldHRlcnMgKi9cbiAgICAgICAgaWYgKCFjaGFuZ2VzWydzZWxlY3RlZERhdGUnXSAmJiAhY2hhbmdlc1snc2VsZWN0ZWRSYW5nZURhdGUnXSAmJiAhY2hhbmdlc1snY3VycmVudGx5RGlzcGxheWVkJ10pIHtcbiAgICAgICAgICAgIHRoaXMuX2J1aWxkRGF5Vmlld0dyaWQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc1snc3RhcnRpbmdEYXlPZldlZWsnXSkge1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFNob3J0V2Vla0RheXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gZm9yIHNlbGVjdGluZyBhIGRhdGUgb24gdGhlIGNhbGVuZGFyLiBUeXBpY2FsbHkgY2FsbGVkIHdoZW4gYSBkYXRlIGlzIGNsaWNrZWQsIGJ1dCBjYW4gYWxzbyBiZSBjYWxsZWQgcHJvZ3JhbW1hdGljYWxseS5cbiAgICAgKiBAcGFyYW0gZGF5IENhbGVuZGFyRGF5IG9iamVjdCB0byBiZSBzZWxlY3RlZC5cbiAgICAgKiBAcGFyYW0gZXZlbnRcbiAgICAgKi9cbiAgICBzZWxlY3REYXRlKGRheTogQ2FsZW5kYXJEYXk8RD4sIGV2ZW50PzogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlcmUgYXJlIHNvbWUgcHJvYmxlbXMgd2l0aCBwb3B1cCBpbnRlZ3JhdGlvbi4gQWZ0ZXIgY2xpY2tpbmcgaW5zaWRlIGRheSBjb21wb25lbnQsIHRoZSBwb3BvdmVyIGNsb3Nlcy5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkYXkuZGlzYWJsZWQgJiYgIWRheS5ibG9ja2VkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jYWxUeXBlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgICAgIC8qKiBSZW1vdmUgc2VsZWN0aW9ucyBmcm9tIG90aGVyIGRheSBhbmQgcHV0IHNlbGVjdGlvbiB0byBjaG9zZW4gZGF5ICovXG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJEYXlMaXN0LmZvckVhY2goKF9kYXkpID0+IChfZGF5LnNlbGVjdGVkID0gZmFsc2UpKTtcbiAgICAgICAgICAgICAgICBkYXkuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRGF0ZSA9IGRheS5kYXRlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2hhbmdlLmVtaXQoZGF5LmRhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMCB8fCB0aGlzLl9zZWxlY3RDb3VudGVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUmFuZ2VEYXRlID0geyBzdGFydDogZGF5LmRhdGUsIGVuZDogbnVsbCB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9zZWxlY3RDb3VudGVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGRhdGUgcGlja2VkIGlzIGhpZ2hlciB0aGFuIGFscmVhZHkgY2hvc2VuLCBvdGhlcndpc2UganVzdCByZXZlcnNlIHRoZW1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZSh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0ISwgZGF5LmRhdGUpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBkYXkuZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUmFuZ2VEYXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBkYXkuZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VTZWxlY3RlZFJhbmdlRGF5cyh0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZSwgdGhpcy5fY2FsZW5kYXJEYXlMaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNhbFR5cGUgPT09ICdyYW5nZScgJiYgdGhpcy5yYW5nZUhvdmVyRWZmZWN0ICYmIHRoaXMuX3NlbGVjdENvdW50ZXIgPT09IDEgJiYgZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzT25SYW5nZVBpY2sgPSAhdGhpcy5faXNPblJhbmdlUGljaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lzT25SYW5nZVBpY2sgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0UmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBmb2N1cyBvbiBkZWZhdWx0IGZvY3VzYWJsZSBjZWxsXG4gICAgICovXG4gICAgc2V0Rm9jdXNPbkNlbGwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNlbGxUb0ZvY3VzID0gbmV3IENhbGVuZGFyQWN0aXZlRGF5Q2VsbFN0cmF0ZWd5KCkuZ2V0QWN0aXZlQ2VsbCh0aGlzLl9jYWxlbmRhckRheUxpc3QpO1xuICAgICAgICBpZiAoIWNlbGxUb0ZvY3VzPy5pbmRleCAmJiBjZWxsVG9Gb2N1cz8uaW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvY3VzT25DZWxsQnlJbmRleChjZWxsVG9Gb2N1cy5pbmRleCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfcmVmcmVzaEhvdmVyUmFuZ2UoZGF5OiBDYWxlbmRhckRheTxEPik6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuc2VsZWN0ZWRSYW5nZURhdGU/LnN0YXJ0O1xuICAgICAgICBpZiAodGhpcy5faXNPblJhbmdlUGljayAmJiBzdGFydCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZShkYXkuZGF0ZSwgc3RhcnQpIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyRGF5TGlzdC5mb3JFYWNoKChfZGF5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuaG92ZXJSYW5nZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY29tcGFyZURhdGUoX2RheS5kYXRlLCBkYXkuZGF0ZSkgPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY29tcGFyZURhdGUoX2RheS5kYXRlLCBzdGFydCkgPCAwO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxlbmRhckRheUxpc3QuZm9yRWFjaCgoX2RheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBfZGF5LmhvdmVyUmFuZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKF9kYXkuZGF0ZSwgZGF5LmRhdGUpIDwgMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKF9kYXkuZGF0ZSwgc3RhcnQpID4gMDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiAgQW1vdW50IG9mIHNlbGVjdGVkIGRheXNcbiAgICAgKiAgMCwgd2hlbiB0aGVyZSBpcyBubyBkYXkgc2VsZWN0ZWQsIG9yIHN0YXJ0IGRhdGUgaXMgaW52YWxpZCxcbiAgICAgKiAgMSwgd2hlbiB0aGVyZSBpcyBvbmx5IHZhbGlkIHN0YXJ0IGRhdGUsIG9yIGVuZCBkYXRlIGlzIHNhbWUgYXMgc3RhcnQgZGF0ZSxcbiAgICAgKiAgMiwgd2hlbiBib3RoIGRhdGVzIGFyZSB2YWxpZFxuICAgICAqL1xuICAgIGdldCBfc2VsZWN0Q291bnRlcigpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRSYW5nZURhdGUgfHwgIXRoaXMuX2RhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0ICYmXG4gICAgICAgICAgICAoIXRoaXMuX2RhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuZW5kKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnQsIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuZW5kKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0KSAmJlxuICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5lbmQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IHJldHVybnMgc2hvcnQgd2Vla2RheSBuYW1lLlxuICAgICAqIENhbiBiZSBjaGFuZ2VkIGJ5IHVzZXIgYnkgcHJvdmlkaW5nIG90aGVyIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgRGF0ZXRpbWVBZGFwdGVyXG4gICAgICovXG4gICAgZ2V0IHNob3J0V2Vla0RheXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2hvcnRXZWVrRGF5cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgcmV0dXJucyB3ZWVrZGF5IG5hbWUuXG4gICAgICogQ2FuIGJlIGNoYW5nZWQgYnkgdXNlciBieSBwcm92aWRpbmcgb3RoZXIgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyBEYXRldGltZUFkYXB0ZXJcbiAgICAgKi9cbiAgICBnZXQgbG9uZ1dlZWtEYXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvbmdXZWVrRGF5cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogRnVuY3Rpb24gdGhhdCBnaXZlcyBhcnJheSBvZiBhbGwgZGlzcGxheWVkIENhbGVuZGFyRGF5c1xuICAgICAqL1xuICAgIGdldCBfY2FsZW5kYXJEYXlMaXN0KCk6IENhbGVuZGFyRGF5PEQ+W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF5Vmlld0dyaWQucmVkdWNlKCh0b3RhbENhbGVuZGFyUm93czogQ2FsZW5kYXJEYXk8RD5bXSwgY2FsZW5kYXJSb3c6IENhbGVuZGFyRGF5PEQ+W10pID0+IHtcbiAgICAgICAgICAgIGlmICghY2FsZW5kYXJSb3cpIHtcbiAgICAgICAgICAgICAgICBjYWxlbmRhclJvdyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRvdGFsQ2FsZW5kYXJSb3dzLmNvbmNhdChjYWxlbmRhclJvdyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZpZXcgSURcbiAgICAgKi9cbiAgICBnZXQgdmlld0lkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkICsgJy1kYXktdmlldyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFdlZWsgY29sdW1uIGhlYWRlciBJRFxuICAgICAqL1xuICAgIGdldCBfd2Vla051bWJlcnNDb2x1bW5IZWFkZXJJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXdlZWstY29sdW1uLWhlYWRlcic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFRvZGF5IGNlbGwgbGFiZWwgSURcbiAgICAgKi9cbiAgICBnZXQgX3RvZGF5TGFiZWxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXRvZGF5LWxhYmVsJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogU2VsZWN0ZWQgZGF0ZSBsYWJlbCBJRFxuICAgICAqL1xuICAgIGdldCBfc2VsZWN0ZWREYXRlTGFiZWxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXNlbGVjdGVkLWRhdGUtbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXRlIHJhbmdlIHN0YXJ0IGRhdGUgbGFiZWwgSURcbiAgICAgKi9cbiAgICBnZXQgX2RhdGVSYW5nZVN0YXJ0TGFiZWxJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3SWQgKyAnLXJhbmdlLXN0YXJ0LWRhdGUtbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXRlIHJhbmdlIGVuZCBkYXRlIGxhYmVsIElEXG4gICAgICovXG4gICAgZ2V0IF9kYXRlUmFuZ2VFbmRMYWJlbElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctcmFuZ2UtZW5kLWRhdGUtbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXRlIGluIHBhc3QgbGFiZWwgSURcbiAgICAgKi9cbiAgICBnZXQgX2RhdGVJblBhc3RMYWJlbElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctZGF5LWluLXBhc3QtbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBoYW5kbGVzIGRheSBjZWxscyBrZXlkb3duIGV2ZW50cyxcbiAgICAgKiBAcGFyYW0gZXZlbnQgS2V5Ym9hcmRFdmVudFxuICAgICAqIEBwYXJhbSBjZWxsIENhbGVuZGFyRGF5XG4gICAgICogQHBhcmFtIGluZGV4XG4gICAgICovXG4gICAgX29uS2V5ZG93bkRheUhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGNlbGw6IENhbGVuZGFyRGF5PEQ+LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdUYWInICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNFc2NhcGVGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNFc2NhcGVGdW5jdGlvbihldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5vbktleWRvd25IYW5kbGVyKGV2ZW50LCBpbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogIE1ldGhvZCB0aGF0IGFsbG93IHRvIGZvY3VzIGVsZW1lbnRzIGluc2lkZSB0aGlzIGNvbXBvbmVudFxuICAgICAqL1xuICAgIF9mb2N1c0VsZW1lbnRCeVNlbGVjdG9yKGVsZW1lbnRTZWxlY3Rvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRUb0ZvY3VzOiBIVE1MRWxlbWVudCA9IHRoaXMuZVJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudFNlbGVjdG9yKTtcbiAgICAgICAgaWYgKGVsZW1lbnRUb0ZvY3VzPy5mb2N1cykge1xuICAgICAgICAgICAgZWxlbWVudFRvRm9jdXMuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTdGFuZGFyZGl6ZWQgbWV0aG9kIHRvIGNhbGN1bGF0ZSBncmlkIFt4XVt5XSB0byBpbmRleCBudW1iZXIgb2YgZmxhdHRlbiBsaXN0XG4gICAgICovXG4gICAgX2dldEluZGV4KHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclNlcnZpY2UuZ2V0SWQocm93SW5kZXgsIGNvbEluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgc2VsZWN0cyBwcmV2aW91cyBtb250aFxuICAgICAqIFRyaWdnZXJlZCBvbmx5IHdoZW4gdGhlIG1vbnRoIGlzIGNoYW5nZWQgZHVyaW5nIGNoYW5naW5nIGZvY3VzXG4gICAgICogQWxzbyB0cmlnZ2VycyBldmVudCB0byBwYXJlbnQgY2FsZW5kYXIgY29tcG9uZW50IGFuZCByZWJ1aWxkcyBkYXkgdmlldyBncmlkXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2VsZWN0UHJldmlvdXNNb250aCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkID0gdGhpcy5fZ2V0UHJldmlvdXNNb250aCgpO1xuICAgICAgICB0aGlzLl9idWlsZERheVZpZXdHcmlkKCk7XG4gICAgICAgIHRoaXMucHJldmlvdXNNb250aFNlbGVjdC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IHNlbGVjdHMgbmV4dCBtb250aFxuICAgICAqIFRyaWdnZXJlZCBvbmx5IHdoZW4gdGhlIG1vbnRoIGlzIGNoYW5nZWQgZHVyaW5nIGNoYW5naW5nIGZvY3VzXG4gICAgICogQWxzbyB0cmlnZ2VycyBldmVudCB0byBwYXJlbnQgY2FsZW5kYXIgY29tcG9uZW50IGFuZCByZWJ1aWxkcyBkYXkgdmlldyBncmlkXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2VsZWN0TmV4dE1vbnRoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQgPSB0aGlzLl9nZXROZXh0TW9udGgoKTtcbiAgICAgICAgdGhpcy5fYnVpbGREYXlWaWV3R3JpZCgpO1xuICAgICAgICB0aGlzLm5leHRNb250aFNlbGVjdC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGNyZWF0ZXMgYXJyYXkgb2YgQ2FsZW5kYXJEYXkgbW9kZWxzIHdoaWNoIHdpbGwgYmUgc2hvd24gb24gZGF5IGdyaWQsXG4gICAgICogZGVwZW5kaW5nIG9uIGN1cnJlbnQgbW9udGggYW5kIHllYXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfcG9wdWxhdGVDYWxlbmRhcigpOiBDYWxlbmRhckRheTxEPltdIHtcbiAgICAgICAgbGV0IGNhbGVuZGFyOiBDYWxlbmRhckRheTxEPltdID0gW107XG5cbiAgICAgICAgY2FsZW5kYXIgPSB0aGlzLl9nZXRQcmV2aW91c01vbnRoRGF5cyhjYWxlbmRhcik7XG4gICAgICAgIGNhbGVuZGFyID0gY2FsZW5kYXIuY29uY2F0KHRoaXMuX2dldEN1cnJlbnRNb250aERheXMoKSk7XG4gICAgICAgIGNhbGVuZGFyID0gdGhpcy5fZ2V0TmV4dE1vbnRoRGF5cyhjYWxlbmRhcik7XG5cbiAgICAgICAgY2FsZW5kYXIuZm9yRWFjaCgoY2FsbCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY2FsbC5pZCA9IHRoaXMuX2dldENlbGxJZEJ5SW5kZXgoaW5kZXgpO1xuICAgICAgICAgICAgY2FsbC5pbmRleCA9IGluZGV4O1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5jYWxUeXBlID09PSAnc2luZ2xlJyAmJiB0aGlzLl9zZWxlY3RlZERhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IF9kYXkgPSBjYWxlbmRhci5maW5kKChkYXkpID0+IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKGRheS5kYXRlLCB0aGlzLl9zZWxlY3RlZERhdGUpKTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZVNlbGVjdGVkU2luZ2xlRGF5KF9kYXksIGNhbGVuZGFyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNhbFR5cGUgPT09ICdyYW5nZScgJiYgdGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZVNlbGVjdGVkUmFuZ2VEYXlzKHRoaXMuX3NlbGVjdGVkUmFuZ2VEYXRlLCBjYWxlbmRhcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2FsZW5kYXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGJ1aWxkcyAyIGRpbWVuc2lvbnMgZGF5IHZpZXcgZ3JpZCwgYWxzbyBzZXRzIHVwIGN1cnJlbnRseSBkaXNwbGF5ZWQgbW9udGgsIG9yIHllYXIsXG4gICAgICogd2hlbiB0aGVyZSBpcyBub3QgYW55LlxuICAgICAqL1xuICAgIHByaXZhdGUgX2J1aWxkRGF5Vmlld0dyaWQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5faXNJbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRseURpc3BsYXllZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXRNb250aCh0aGlzLnNlbGVjdGVkRGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIHllYXI6IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXRZZWFyKHRoaXMuc2VsZWN0ZWREYXRlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvZGF5ID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLnRvZGF5KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkID0ge1xuICAgICAgICAgICAgICAgICAgICBtb250aDogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKHRvZGF5KSxcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodG9kYXkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyRGF5cyA9IHRoaXMuX3BvcHVsYXRlQ2FsZW5kYXIoKTtcbiAgICAgICAgY29uc3QgZGF5Vmlld0dyaWQ6IENhbGVuZGFyRGF5PEQ+W11bXSA9IFtdO1xuXG4gICAgICAgIHdoaWxlIChjYWxlbmRhckRheXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGF5Vmlld0dyaWQucHVzaChjYWxlbmRhckRheXMuc3BsaWNlKDAsIHRoaXMuX2Ftb3VudE9mQ29scykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uucm93QW1vdW50ID0gZGF5Vmlld0dyaWQubGVuZ3RoO1xuXG4gICAgICAgIHRoaXMuX2RheVZpZXdHcmlkID0gZGF5Vmlld0dyaWQ7XG4gICAgICAgIHRoaXMuX3dlZWtzID0gdGhpcy5fcmVmcmVzaFdlZWtDb3VudCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBHZXQgaWQgb2YgY2FsZW5kYXIncyBkYXkgaXRlbVxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldENlbGxJZEJ5SW5kZXgoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctZGF5LScgKyBpbmRleCArICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2Qgd2hpY2ggcHJvdmlkZXMgYXJyYXkgb2YgQ2FsZW5kYXJEYXksXG4gICAgICogd2hpY2ggY29udGFpbnMgZXZlcnkgc2luZ2xlIGRheSBvZiBjdXJyZW50bHkgc2hvd24gbW9udGgveWVhci5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRDdXJyZW50TW9udGhEYXlzKCk6IENhbGVuZGFyRGF5PEQ+W10ge1xuICAgICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLm1vbnRoO1xuICAgICAgICBjb25zdCB5ZWFyID0gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQueWVhcjtcbiAgICAgICAgY29uc3QgY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheTxEPltdID0gW107XG4gICAgICAgIGNvbnN0IGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoOiBudW1iZXIgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgoXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgMSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdG9kYXkgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIudG9kYXkoKTtcbiAgICAgICAgZm9yIChsZXQgZGF5TnVtYmVyID0gMTsgZGF5TnVtYmVyIDw9IGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoOyBkYXlOdW1iZXIrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZTogRCA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCBkYXlOdW1iZXIpO1xuICAgICAgICAgICAgY2FsZW5kYXJEYXlzLnB1c2goe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2dldERheShkYXRlKSxcbiAgICAgICAgICAgICAgICBtb250aFN0YXR1czogJ2N1cnJlbnQnLFxuICAgICAgICAgICAgICAgIGN1cnJlbnQ6IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKHRvZGF5LCBkYXRlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2VsbCA9IHRoaXMuX2dldEFjdGl2ZUNlbGwoY2FsZW5kYXJEYXlzKTtcbiAgICAgICAgY2VsbCAmJiAoY2VsbC5pc1RhYkluZGV4ZWQgPSB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGNhbGVuZGFyRGF5cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgcmV0dXJucyBhY3RpdmUgY2VsbCwgd2hpY2ggbWVhbnM6XG4gICAgICogaWYgdGhlcmUgaXMgYW55IHNlbGVjdGVkIGRheSwgcmV0dXJuIHNlbGVjdGVkIGRheVxuICAgICAqIGlmIHRoZXJlIGlzIG5vIHNlbGVjdGVkIGRheSwgYnV0IHRoZXJlIGlzIHRvZGF5IGRheSwgcmV0dXJuIHRvZGF5IGRheVxuICAgICAqIGlmIHRoZXJlIGlzIG5vIHRvZGF5LCBvciBzZWxlY3RlZCwgcmV0dXJuIGZpcnN0IG9uZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldEFjdGl2ZUNlbGwoY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheTxEPltdKTogQ2FsZW5kYXJEYXk8RD4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYWxlbmRhckFjdGl2ZURheUNlbGxTdHJhdGVneTxEPigpLmdldEFjdGl2ZUNlbGwoY2FsZW5kYXJEYXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHdoaWNoIHByb3ZpZGVzIGFycmF5IG9mIENhbGVuZGFyRGF5LFxuICAgICAqIHdoaWNoIGNvbnRhaW5zIGxhc3QgMC02IGRheXMgb2YgcHJldmlvdXMgbW9udGgveWVhci4gVGhlc2VzIGRheXNcbiAgICAgKiBmaWxscyB0aGUgZ2FwIGJldHdlZW4gc3RhcnRpbmcgc3RhcnRpbmdEYXlPZldlZWsgYW5kIGZpcnN0IGRheSBvZiBjdXJyZW50IG1vbnRoXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0UHJldmlvdXNNb250aERheXMoY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheTxEPltdKTogQ2FsZW5kYXJEYXk8RD5bXSB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPiAxID8gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggLSAxIDogMTI7XG4gICAgICAgIGNvbnN0IHllYXIgPVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPiAxID8gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQueWVhciA6IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLnllYXIgLSAxO1xuICAgICAgICBjb25zdCBhbW91bnRPZkRheXNJbkN1cnJlbnRNb250aDogbnVtYmVyID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKFxuICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIDEpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHByZXZNb250aExhc3REYXRlID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoKTtcbiAgICAgICAgY29uc3QgcHJldk1vbnRoTGFzdERheSA9IGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoO1xuICAgICAgICBsZXQgcHJldk1vbnRoTGFzdFdlZWtEYXkgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrKHByZXZNb250aExhc3REYXRlKSAtIHRoaXMuc3RhcnRpbmdEYXlPZldlZWs7XG5cbiAgICAgICAgLyoqIENoZWNraW5nIGlmIHRoZXJlIGFyZSBzb21lIGRheXMgY3V0IGJ5IHN0YXJ0aW5nRGF5T2ZXZWVrIG9wdGlvblxuICAgICAgICAgKiAgSWYgeWVzLCB0aGVyZSBpcyB3aG9sZSB3ZWVrIGFkZGVkLCB0byBhdm9pZCBoaWRpbmdcbiAgICAgICAgICovXG4gICAgICAgIGlmIChwcmV2TW9udGhMYXN0V2Vla0RheSA8IDApIHtcbiAgICAgICAgICAgIHByZXZNb250aExhc3RXZWVrRGF5ID0gcHJldk1vbnRoTGFzdFdlZWtEYXkgKyA3O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXZNb250aExhc3RXZWVrRGF5IDwgNikge1xuICAgICAgICAgICAgd2hpbGUgKHByZXZNb250aExhc3RXZWVrRGF5ID49IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2TW9udGhEYXkgPSBwcmV2TW9udGhMYXN0RGF5IC0gcHJldk1vbnRoTGFzdFdlZWtEYXk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCBwcmV2TW9udGhEYXkpO1xuICAgICAgICAgICAgICAgIGNhbGVuZGFyRGF5cy5wdXNoKHsgLi4udGhpcy5fZ2V0RGF5KGRhdGUpLCBtb250aFN0YXR1czogJ3ByZXZpb3VzJyB9KTtcbiAgICAgICAgICAgICAgICBwcmV2TW9udGhMYXN0V2Vla0RheS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxlbmRhckRheXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB3aGljaCBwcm92aWRlcyBhcnJheSBvZiBDYWxlbmRhckRheSwgd2hpY2ggY29udGFpbnMgZmlyc3QgZGF5cyBvZiBuZXh0IG1vbnRoL3llYXIuIFRoZXNlcyBkYXlzXG4gICAgICogZmlsbHMgdGhlIGdhcCBiZXR3ZWVuIGxhc3QgZGF5IG9mIGN1cnJlbnQgZGF5IGFuZCBlbmQgb2YgNi13ZWVrcyBjYWxlbmRhciBncmlkLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldE5leHRNb250aERheXMoY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheTxEPltdKTogQ2FsZW5kYXJEYXk8RD5bXSB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPCAxMiA/IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLm1vbnRoICsgMSA6IDE7XG4gICAgICAgIGNvbnN0IHllYXIgPVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPCAxMiA/IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLnllYXIgOiB0aGlzLmN1cnJlbnRseURpc3BsYXllZC55ZWFyICsgMTtcblxuICAgICAgICAvLyBUaGUgY2FsZW5kYXIgZ3JpZCBjYW4gaGF2ZSA1ICgzNSBkYXlzKSBvciA2ICg0MiBkYXlzKSB3ZWVrc1xuICAgICAgICBjb25zdCBuZXh0TW9udGhEaXNwbGF5ZWREYXlzID0gKDQyIC0gY2FsZW5kYXJEYXlzLmxlbmd0aCkgJSA3O1xuXG4gICAgICAgIGZvciAobGV0IG5leHREID0gMTsgbmV4dEQgPD0gbmV4dE1vbnRoRGlzcGxheWVkRGF5czsgbmV4dEQrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCBuZXh0RCk7XG4gICAgICAgICAgICBjYWxlbmRhckRheXMucHVzaCh7IC4uLnRoaXMuX2dldERheShkYXRlKSwgbW9udGhTdGF0dXM6ICduZXh0JyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsZW5kYXJEYXlzO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfaXNXZWVrZW5kRGF5KGRheU9mV2VlazogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBkYXlPZldlZWsgPT09IDEgfHwgZGF5T2ZXZWVrID09PSA3O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBnZW5lcmF0ZXMgd2hvbGUgZGF5IG1vZGVsIGJhc2luZyBvbiBkYXRlLCBkaXNhYmxpbmcgZnVuY3Rpb25zLCBibG9jayBmdW5jdGlvbnMsIGFuZCBhY3R1YWxseVxuICAgICAqIGNob3NlbiByYW5nZSAvIHNpbmdsZSBkYXRlLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldERheShkYXRlOiBEKTogQ2FsZW5kYXJEYXk8RD4ge1xuICAgICAgICBjb25zdCB3ZWVrRGF5ID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldERheU9mV2VlayhkYXRlKTtcbiAgICAgICAgY29uc3QgZGF5T2ZNb250aCA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXRlKGRhdGUpO1xuICAgICAgICBjb25zdCBkYXRlTmFtZXMgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0RGF0ZU5hbWVzKCk7XG4gICAgICAgIGNvbnN0IGlzUGFzdCA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZShkYXRlLCB0aGlzLl9kYXRlVGltZUFkYXB0ZXIudG9kYXkoKSkgPCAwO1xuICAgICAgICBjb25zdCBkYXk6IENhbGVuZGFyRGF5PEQ+ID0ge1xuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGxhYmVsOiBkYXRlTmFtZXNbZGF5T2ZNb250aCAtIDFdLFxuICAgICAgICAgICAgd2Vla0RheSxcbiAgICAgICAgICAgIHdlZWtlbmQ6IHRoaXMuX2lzV2Vla2VuZERheSh3ZWVrRGF5KSxcbiAgICAgICAgICAgIGFyaWFMYWJlbDogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmZvcm1hdChkYXRlLCB0aGlzLl9kYXRlVGltZUZvcm1hdHMuZGlzcGxheS5kYXRlQTExeUxhYmVsKSxcbiAgICAgICAgICAgIHNwZWNpYWxOdW1iZXI6IHRoaXMuX2dldFNwZWNpYWxEYXkoZGF0ZSkgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgcGFzdDogaXNQYXN0XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqIEFwcGx5IGRpc2FibGVkIHN0YXRlIHRvIGRheXMgbWFya2VkIHdpdGggcGFzc2VkIGZ1bmN0aW9uICovXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVGdW5jdGlvbikge1xuICAgICAgICAgICAgZGF5LmRpc2FibGVkID0gdGhpcy5kaXNhYmxlRnVuY3Rpb24oZGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBpcyBjYWxsZWQgdG8gcmVmcmVzaCBpMThuIHNob3J0IHdlZWsgZGF5cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9yZWZyZXNoU2hvcnRXZWVrRGF5cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2hvcnREYXlPZldlZWtOYW1lcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnc2hvcnQnKTtcbiAgICAgICAgY29uc3QgZGF5T2ZXZWVrTmFtZXMgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrTmFtZXMoJ2xvbmcnKTtcblxuICAgICAgICB0aGlzLl9zaG9ydFdlZWtEYXlzID0gc2hvcnREYXlPZldlZWtOYW1lc1xuICAgICAgICAgICAgLnNsaWNlKHRoaXMuc3RhcnRpbmdEYXlPZldlZWsgLSAxKVxuICAgICAgICAgICAgLmNvbmNhdChzaG9ydERheU9mV2Vla05hbWVzLnNsaWNlKDAsIHRoaXMuc3RhcnRpbmdEYXlPZldlZWsgLSAxKSk7XG5cbiAgICAgICAgdGhpcy5fbG9uZ1dlZWtEYXlzID0gZGF5T2ZXZWVrTmFtZXNcbiAgICAgICAgICAgIC5zbGljZSh0aGlzLnN0YXJ0aW5nRGF5T2ZXZWVrIC0gMSlcbiAgICAgICAgICAgIC5jb25jYXQoZGF5T2ZXZWVrTmFtZXMuc2xpY2UoMCwgdGhpcy5zdGFydGluZ0RheU9mV2VlayAtIDEpKTtcblxuICAgICAgICB0aGlzLmNoYW5nZURldFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogR2V0cyBzcGVjaWFsIGRheSBudW1iZXIgb2Ygc3BlY2lmaWVkIGRhdGUgbW9kZWxcbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRTcGVjaWFsRGF5KGRhdGU6IEQpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgc3BlY2lhbERheSA9IHRoaXMuc3BlY2lhbERheXNSdWxlcy5maW5kKChzcGVjaWFsRGF5UnVsZSkgPT4gc3BlY2lhbERheVJ1bGUucnVsZShkYXRlKSk7XG4gICAgICAgIGlmIChzcGVjaWFsRGF5KSB7XG4gICAgICAgICAgICByZXR1cm4gc3BlY2lhbERheS5zcGVjaWFsRGF5TnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCByZXR1cm5zIGFycmF5IG9mIHdlZWsncyBjb3VudFxuICAgICAqL1xuICAgIHByaXZhdGUgX3JlZnJlc2hXZWVrQ291bnQoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBjYWxlbmRhckRheUxpc3QgPSB0aGlzLl9jYWxlbmRhckRheUxpc3Q7XG4gICAgICAgIGNvbnN0IHdlZWtOdW1iZXJzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDY7IGluZGV4IDwgY2FsZW5kYXJEYXlMaXN0Lmxlbmd0aDsgaW5kZXggPSBpbmRleCArIDYpIHtcbiAgICAgICAgICAgIHdlZWtOdW1iZXJzLnB1c2godGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldFdlZWtOYW1lKGNhbGVuZGFyRGF5TGlzdFtpbmRleF0uZGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3ZWVrTnVtYmVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogR2V0IHllYXIgYW5kIG1vbnRoIGZvciBwcmV2aW91cyB5ZWFyXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0UHJldmlvdXNNb250aCgpOiBDYWxlbmRhckN1cnJlbnQge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudGx5RGlzcGxheWVkLm1vbnRoID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgeWVhcjogdGhpcy5fY3VycmVudGx5RGlzcGxheWVkLnllYXIsIG1vbnRoOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggLSAxIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyB5ZWFyOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQueWVhciAtIDEsIG1vbnRoOiAxMiB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEdldCB5ZWFyIGFuZCBtb250aCBmb3IgbmV4dCB5ZWFyXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0TmV4dE1vbnRoKCk6IENhbGVuZGFyQ3VycmVudCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPCAxMikge1xuICAgICAgICAgICAgcmV0dXJuIHsgeWVhcjogdGhpcy5fY3VycmVudGx5RGlzcGxheWVkLnllYXIsIG1vbnRoOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggKyAxIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyB5ZWFyOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQueWVhciArIDEsIG1vbnRoOiAxIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRvIHB1dCBjb25maWd1cmF0aW9uIGFuZCBsaXN0ZW5lcnMgb24gY2FsZW5kYXIga2V5Ym9hcmQgc2VydmljZVxuICAgICAqL1xuICAgIHByaXZhdGUgX3NldHVwS2V5Ym9hcmRTZXJ2aWNlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5jb2xBbW91bnQgPSB0aGlzLl9hbW91bnRPZkNvbHM7XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2UuZm9jdXNFc2NhcGVGdW5jdGlvbiA9IHRoaXMuZm9jdXNFc2NhcGVGdW5jdGlvbjtcblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5vbkZvY3VzSWRDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZSgoaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbkNlbGxCeUluZGV4KGluZGV4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uub25LZXlTZWxlY3QucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZSgoaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZSh0aGlzLl9jYWxlbmRhckRheUxpc3RbaW5kZXhdKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uub25MaXN0U3RhcnRBcHByb2FjaC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKChpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0UHJldmlvdXNNb250aCgpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBDYWxjdWxhdGUgZm9jdXNlZCBjZWxsIGluIG5ldyBncmlkXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTW9udGggPSB0aGlzLl9nZXROZXh0TW9udGgoKTsgLy8gbW9udGggdGhhdCB3YXMgYmVmb3JlIG1vdmluZyBiYWNrXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEFtb3VudE9mV2Vla3MgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0QW1vdW50T2ZXZWVrcyhcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE1vbnRoLnllYXIsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxNb250aC5tb250aCxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0aW5nRGF5T2ZXZWVrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcHJldk1vbnRoQW1vdW50T2ZXZWVrcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXRBbW91bnRPZldlZWtzKFxuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC55ZWFyLFxuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC5tb250aCxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0aW5nRGF5T2ZXZWVrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gdHJpZ2dlciByZW5kZXJpbmcgZm9yIG5ldyBncmlkIHNvIGZvY3VzIGNhbiBiZSBzZXRcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbkNlbGxCeUluZGV4KGluZGV4IC0gNyAqIChvcmlnaW5hbEFtb3VudE9mV2Vla3MgLSBwcmV2TW9udGhBbW91bnRPZldlZWtzKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLm9uTGlzdEVuZEFwcHJvYWNoLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKS5zdWJzY3JpYmUoKGluZGV4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3ROZXh0TW9udGgoKTtcbiAgICAgICAgICAgIC8vIHRyaWdnZXIgcmVuZGVyaW5nIGZvciBuZXcgZ3JpZCBzbyBmb2N1cyBjYW4gYmUgc2V0XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzT25DZWxsQnlJbmRleChpbmRleCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBDaGFuZ2Ugc2VsZWN0aW9uIGZsYWcgb24gZGF5cyB0byBmYWxzZSwgYmVzaWRlcyB0aGUgc2VsZWN0ZWQgb25lXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2hhbmdlU2VsZWN0ZWRTaW5nbGVEYXkoZGF5OiBDYWxlbmRhckRheTxEPiB8IHVuZGVmaW5lZCwgY2FsZW5kYXI6IENhbGVuZGFyRGF5PEQ+W10pOiB2b2lkIHtcbiAgICAgICAgY2FsZW5kYXIuZm9yRWFjaCgoX2RheSkgPT4gKF9kYXkuc2VsZWN0ZWQgPSBmYWxzZSkpO1xuICAgICAgICBpZiAoZGF5ICYmICFkYXkuYmxvY2tlZCAmJiAhZGF5LmRpc2FibGVkKSB7XG4gICAgICAgICAgICBkYXkuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVmcmVzaFRhYkluZGV4KGNhbGVuZGFyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQ2hhbmdlIHByb3BlcnRpZXMgb2YgcmFuZ2UgZGF5cywgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCB0byBub3QgcmVidWlsZCB3aG9sZSBncmlkIGZyb20gc2NyYXRjaCxcbiAgICAgKiBpdCBqdXN0IGNoYW5nZXMgcHJvcGVydGllcyBvZiBuZXdseSBzZWxlY3RlZC91bnNlbGVjdGVkIGRheXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2hhbmdlU2VsZWN0ZWRSYW5nZURheXMoZGF0ZXM6IERhdGVSYW5nZTxEPiwgY2FsZW5kYXI6IENhbGVuZGFyRGF5PEQ+W10pOiB2b2lkIHtcbiAgICAgICAgLyoqIFB1bGwgbGlzdCBvZiBjYWxlbmRhciBkYXlzICovXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyTGlzdCA9IGNhbGVuZGFyO1xuXG4gICAgICAgIC8qKiBSZXNldCBjaGFuZ2luZyBwcm9wZXJ0aWVzICovXG4gICAgICAgIGNhbGVuZGFyTGlzdC5mb3JFYWNoKFxuICAgICAgICAgICAgKF9kYXkpID0+XG4gICAgICAgICAgICAgICAgKF9kYXkuc2VsZWN0ZWRGaXJzdCA9XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuc2VsZWN0ZWRMYXN0ID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5zZWxlY3RlZCA9XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuaXNUYWJJbmRleGVkID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5kaXNhYmxlZCA9XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuaG92ZXJSYW5nZSA9XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuc2VsZWN0ZWRSYW5nZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZGF0ZXMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydERheTogQ2FsZW5kYXJEYXk8RD4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgZW5kRGF5OiBDYWxlbmRhckRheTxEPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChkYXRlcy5zdGFydCkge1xuICAgICAgICAgICAgICAgIC8qKiBGaW5kIHN0YXJ0IGRhdGUgYW5kIG1hcmsgaXQgYXMgc2VsZWN0ZWQgKi9cbiAgICAgICAgICAgICAgICBzdGFydERheSA9IGNhbGVuZGFyTGlzdC5maW5kKChfZGF5KSA9PiB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChfZGF5LmRhdGUsIGRhdGVzLnN0YXJ0KSk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBzdGFydERheSAmJlxuICAgICAgICAgICAgICAgICAgICAhc3RhcnREYXkuYmxvY2tlZCAmJlxuICAgICAgICAgICAgICAgICAgICAhc3RhcnREYXkuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRpc2FibGVSYW5nZVN0YXJ0RnVuY3Rpb24gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLmRpc2FibGVSYW5nZVN0YXJ0RnVuY3Rpb24oc3RhcnREYXkuZGF0ZSkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF5LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXkuc2VsZWN0ZWRGaXJzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGVzLmVuZCkge1xuICAgICAgICAgICAgICAgIC8qKiBGaW5kIGVuZCBkYXRlIGFuZCBtYXJrIGl0IGFzIHNlbGVjdGVkICovXG4gICAgICAgICAgICAgICAgZW5kRGF5ID0gY2FsZW5kYXJMaXN0LmZpbmQoKF9kYXkpID0+IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKF9kYXkuZGF0ZSwgZGF0ZXMuZW5kKSk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBlbmREYXkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWVuZERheS5ibG9ja2VkICYmXG4gICAgICAgICAgICAgICAgICAgICFlbmREYXkuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uICE9PSAnZnVuY3Rpb24nIHx8ICF0aGlzLmRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uKGVuZERheS5kYXRlKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF5LnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF5LnNlbGVjdGVkTGFzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiogVmVyaWZ5IGlmIHN0YXJ0IGRheSBhbmQgZW5kIGRheSBpcyB2YWxpZCwgb3RoZXJ3aXNlIGRvbid0IHB1dCByYW5nZSBzZWxlY3Rpb24gKi9cbiAgICAgICAgICAgIGlmIChkYXRlcy5zdGFydCAmJiBkYXRlcy5lbmQpIHtcbiAgICAgICAgICAgICAgICAvKiogTWFyayBhbGwgZGF5cywgd2hpY2ggYXJlIGJldHdlZW4gc3RhcnQgYW5kIGVuZCBkYXRlICovXG4gICAgICAgICAgICAgICAgY2FsZW5kYXJMaXN0XG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAoX2RheSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX2RheS5zZWxlY3RlZFJhbmdlID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmlzQmV0d2VlbihfZGF5LmRhdGUsIGRhdGVzLnN0YXJ0ISwgZGF0ZXMuZW5kISkpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goKF9kYXkpID0+IChfZGF5LnNlbGVjdGVkUmFuZ2UgPSB0cnVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hUYWJJbmRleChjYWxlbmRhckxpc3QpO1xuXG4gICAgICAgIC8qKiBBcHBseSBkaXNhYmxlZCBzdGF0ZSB0byBkYXlzIG1hcmtlZCB3aXRoIHBhc3NlZCBmdW5jdGlvbiAqL1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGNhbGVuZGFyTGlzdC5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZUZ1bmN0aW9uIShfZGF5LmRhdGUpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHRoaXMuX3NlbGVjdENvdW50ZXIgPT09IDAgfHwgdGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMikgJiYgdGhpcy5kaXNhYmxlUmFuZ2VTdGFydEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBjYWxlbmRhckxpc3QuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAoX2RheSkgPT4gKF9kYXkuZGlzYWJsZWQgPSBfZGF5LmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZVJhbmdlU3RhcnRGdW5jdGlvbiEoX2RheS5kYXRlKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMSAmJiB0aGlzLmRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBjYWxlbmRhckxpc3QuZm9yRWFjaCgoX2RheSkgPT4gKF9kYXkuZGlzYWJsZWQgPSBfZGF5LmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZVJhbmdlRW5kRnVuY3Rpb24hKF9kYXkuZGF0ZSkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSByZWZyZXNoVGFiSW5kZXgoY2FsZW5kYXI6IENhbGVuZGFyRGF5PEQ+W10pOiB2b2lkIHtcbiAgICAgICAgY2FsZW5kYXIuZm9yRWFjaCgoX2RheSkgPT4gKF9kYXkuaXNUYWJJbmRleGVkID0gZmFsc2UpKTtcbiAgICAgICAgY29uc3QgY2VsbCA9IHRoaXMuX2dldEFjdGl2ZUNlbGwoY2FsZW5kYXIuZmlsdGVyKChfZGF5KSA9PiBfZGF5Lm1vbnRoU3RhdHVzID09PSAnY3VycmVudCcpKTtcbiAgICAgICAgY2VsbCAmJiAoY2VsbC5pc1RhYkluZGV4ZWQgPSB0cnVlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgZm9jdXNPbkNlbGxCeUluZGV4KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZm9jdXNFbGVtZW50QnlTZWxlY3RvcihgIyR7dGhpcy5fZ2V0Q2VsbElkQnlJbmRleChpbmRleCl9YCk7XG4gICAgfVxufVxuIiwiPHRhYmxlXG4gICAgY2xhc3M9XCJmZC1jYWxlbmRhcl9fdGFibGVcIlxuICAgIHJvbGU9XCJncmlkXCJcbiAgICBbYXR0ci5hcmlhLXJvbGVkZXNjcmlwdGlvbl09XCInY29yZUNhbGVuZGFyLmNhbGVuZGFyRGF5Vmlld0Rlc2NyaXB0aW9uJyB8IGZkVHJhbnNsYXRlXCJcbj5cbiAgICA8dGhlYWQgY2xhc3M9XCJmZC1jYWxlbmRhcl9fZ3JvdXBcIiByb2xlPVwicm93Z3JvdXBcIj5cbiAgICAgICAgPHRyIGNsYXNzPVwiZmQtY2FsZW5kYXJfX3Jvd1wiIHJvbGU9XCJyb3dcIj5cbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1dlZWtOdW1iZXJzXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtIGZkLWNhbGVuZGFyX19pdGVtLS1zaWRlLWhlbHBlclwiXG4gICAgICAgICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiXG4gICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiX3dlZWtOdW1iZXJzQ29sdW1uSGVhZGVySWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2NvcmVDYWxlbmRhci53ZWVrQ29sdW1uTGFiZWwnIHwgZmRUcmFuc2xhdGVcIlxuICAgICAgICAgICAgPjwvdGg+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtIGZkLWNhbGVuZGFyX19pdGVtLS1zaWRlLWhlbHBlclwiXG4gICAgICAgICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiBzaG9ydFdlZWtEYXlzOyBpbmRleCBhcyBpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxvbmdXZWVrRGF5c1tpXVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmZC1jYWxlbmRhcl9fdGV4dFwiPnt7IGRheSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgPC90aGVhZD5cbiAgICA8dGJvZHkgY2xhc3M9XCJmZC1jYWxlbmRhcl9fZ3JvdXBcIiByb2xlPVwicm93Z3JvdXBcIj5cbiAgICAgICAgPHRyIGNsYXNzPVwiZmQtY2FsZW5kYXJfX3Jvd1wiIHJvbGU9XCJyb3dcIiAqbmdGb3I9XCJsZXQgcm93IG9mIF9kYXlWaWV3R3JpZDsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1dlZWtOdW1iZXJzXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtIGZkLWNhbGVuZGFyX19pdGVtLS1zaWRlLWhlbHBlclwiXG4gICAgICAgICAgICAgICAgcm9sZT1cInJvd2hlYWRlclwiXG4gICAgICAgICAgICAgICAgc2NvcGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZmQtY2FsZW5kYXItd2Vla109XCJfd2Vla3Nbcm93SW5kZXhdXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJ2aWV3SWQgKyAnLXdlZWstJyArIF93ZWVrc1tyb3dJbmRleF1cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJfd2Vla051bWJlcnNDb2x1bW5IZWFkZXJJZCArICcgJyArICh2aWV3SWQgKyAnLXdlZWstJyArIF93ZWVrc1tyb3dJbmRleF0pXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIl93ZWVrcyAmJiBfd2Vla3Nbcm93SW5kZXhdXCIgY2xhc3M9XCJmZC1jYWxlbmRhcl9fdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBfd2Vla3Nbcm93SW5kZXhdIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC90aD5cblxuICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1jYWxlbmRhcl9faXRlbVwiXG4gICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2VsbCBvZiByb3c7IGxldCBjZWxsSW5kZXggPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJjZWxsLnNlbGVjdGVkRmlyc3QgfHwgY2VsbC5zZWxlY3RlZExhc3QgfHwgY2VsbC5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZkLWNhbGVuZGFyX19pdGVtLS1yYW5nZV09XCJcbiAgICAgICAgICAgICAgICAgICAgKGNlbGwuc2VsZWN0ZWRSYW5nZSB8fCBjZWxsLmhvdmVyUmFuZ2UpICYmICFjZWxsLnNlbGVjdGVkRmlyc3QgJiYgIWNlbGwuc2VsZWN0ZWRMYXN0XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtY2FsZW5kYXJfX2l0ZW0tLWN1cnJlbnRdPVwiY2VsbC5jdXJyZW50XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtY2FsZW5kYXJfX2l0ZW0tLXdlZWtlbmRdPVwiY2VsbC53ZWVrZW5kICYmIG1hcmtXZWVrZW5kcyAmJiBjZWxsLm1vbnRoU3RhdHVzID09PSAnY3VycmVudCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mZC1jYWxlbmRhcl9faXRlbS0tb3RoZXItbW9udGhdPVwiY2VsbC5tb250aFN0YXR1cyAhPT0gJ2N1cnJlbnQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtZGlzYWJsZWRdPVwiY2VsbC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImNlbGwuc3BlY2lhbE51bWJlciA/ICdmZC1jYWxlbmRhcl9fc3BlY2lhbC1kYXktLScgKyBjZWxsLnNwZWNpYWxOdW1iZXIgOiAnJ1wiXG4gICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiY2VsbC5pZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mZC1jYWxlbmRhci1kYXRlLWRheV09XCJjZWxsLmxhYmVsXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWZkLWNhbGVuZGFyLWRheV09XCJjZWxsLmluZGV4XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImNlbGwuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiY2VsbC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiY2VsbC5pc1RhYkluZGV4ZWQgPyAwIDogLTFcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGNlbGwsICRldmVudClcIlxuICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIl9yZWZyZXNoSG92ZXJSYW5nZShjZWxsKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwiX29uS2V5ZG93bkRheUhhbmRsZXIoJGV2ZW50LCBjZWxsLCBfZ2V0SW5kZXgocm93SW5kZXgsIGNlbGxJbmRleCkpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWNhbGVuZGFyX190ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuaWQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJy1hcmlhLWxhYmVsICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGwuc2VsZWN0ZWRGaXJzdCA/IF9kYXRlUmFuZ2VTdGFydExhYmVsSWQgKyAnICcgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGwuc2VsZWN0ZWRMYXN0ID8gX2RhdGVSYW5nZUVuZExhYmVsSWQgKyAnICcgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGwuY3VycmVudCA/IF90b2RheUxhYmVsSWQgKyAnICcgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGwuc2VsZWN0ZWQgJiYgY2FsVHlwZSA9PT0gJ3NpbmdsZScgPyBfc2VsZWN0ZWREYXRlTGFiZWxJZCArICcgJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2VsbC5wYXN0ID8gX2RhdGVJblBhc3RMYWJlbElkIDogJycpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID57eyBjZWxsLmxhYmVsIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGhpZGRlbiBhcmlhLWhpZGRlbj1cInRydWVcIiBbYXR0ci5pZF09XCJjZWxsLmlkICsgJy1hcmlhLWxhYmVsJ1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyBjZWxsLmFyaWFMYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cImZkLWNhbGVuZGFyX19yb3dcIiAqbmdJZj1cIl9kYXlWaWV3R3JpZC5sZW5ndGggPD0gNVwiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZmQtY2FsZW5kYXJfX2l0ZW0gaGlkZGVuLWRheVwiPjwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cImZkLWNhbGVuZGFyX19yb3dcIiAqbmdJZj1cIl9kYXlWaWV3R3JpZC5sZW5ndGggPT09IDRcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtIGhpZGRlbi1kYXlcIj48L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvdGJvZHk+XG48L3RhYmxlPlxuXG48IS0tIEhpZGRlbiBlbGVtZW50cyBmb3IgYXJpYSBwdXJwb3NlcyAtLT5cbjxkaXYgaGlkZGVuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgIDxkaXYgW2F0dHIuaWRdPVwiX3RvZGF5TGFiZWxJZFwiPnt7ICdjb3JlQ2FsZW5kYXIudG9kYXlMYWJlbCcgfCBmZFRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgIDxkaXYgW2F0dHIuaWRdPVwiX3NlbGVjdGVkRGF0ZUxhYmVsSWRcIj57eyAnY29yZUNhbGVuZGFyLmRhdGVTZWxlY3RlZExhYmVsJyB8IGZkVHJhbnNsYXRlIH19PC9kaXY+XG4gICAgPGRpdiBbYXR0ci5pZF09XCJfZGF0ZVJhbmdlU3RhcnRMYWJlbElkXCI+e3sgJ2NvcmVDYWxlbmRhci5yYW5nZVN0YXJ0TGFiZWwnIHwgZmRUcmFuc2xhdGUgfX08L2Rpdj5cbiAgICA8ZGl2IFthdHRyLmlkXT1cIl9kYXRlUmFuZ2VFbmRMYWJlbElkXCI+e3sgJ2NvcmVDYWxlbmRhci5yYW5nZUVuZExhYmVsJyB8IGZkVHJhbnNsYXRlIH19PC9kaXY+XG4gICAgPGRpdiBbYXR0ci5pZF09XCJfZGF0ZUluUGFzdExhYmVsSWRcIj57eyAnY29yZUNhbGVuZGFyLmRheUluUGFzdExhYmVsJyB8IGZkVHJhbnNsYXRlIH19PC9kaXY+XG48L2Rpdj5cbiJdfQ==