@wavemaker/app-ng-runtime 11.12.1-rc.6244 → 11.13.0-rc.222

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 (61) hide show
  1. package/build-task/bundles/index.umd.js +26 -24
  2. package/build-task/esm2022/containers/repeat-template.build.mjs +4 -2
  3. package/build-task/esm2022/data/form/form.build.mjs +4 -2
  4. package/build-task/esm2022/data/table/table-row/table-row.build.mjs +5 -3
  5. package/build-task/esm2022/page/page-content/page-content.build.mjs +6 -7
  6. package/build-task/esm2022/page/page.build.mjs +6 -7
  7. package/build-task/esm2022/partial/partial.build.mjs +6 -7
  8. package/build-task/esm2022/prefab/prefab-container/prefab-container.build.mjs +6 -7
  9. package/build-task/fesm2022/index.mjs +26 -24
  10. package/build-task/fesm2022/index.mjs.map +1 -1
  11. package/components/data/live-table/bundles/index.umd.js +4 -2
  12. package/components/data/live-table/esm2022/live-table.component.mjs +5 -3
  13. package/components/data/live-table/fesm2022/index.mjs +4 -2
  14. package/components/data/live-table/fesm2022/index.mjs.map +1 -1
  15. package/components/data/pagination/bundles/index.umd.js +4 -4
  16. package/components/data/pagination/esm2022/pagination.component.mjs +5 -5
  17. package/components/data/pagination/fesm2022/index.mjs +4 -4
  18. package/components/data/pagination/fesm2022/index.mjs.map +1 -1
  19. package/components/dialogs/design-dialog/bundles/index.umd.js +6 -12
  20. package/components/dialogs/design-dialog/esm2022/dialog.component.mjs +7 -13
  21. package/components/dialogs/design-dialog/fesm2022/index.mjs +6 -12
  22. package/components/dialogs/design-dialog/fesm2022/index.mjs.map +1 -1
  23. package/components/dialogs/iframe-dialog/bundles/index.umd.js +9 -16
  24. package/components/dialogs/iframe-dialog/esm2022/iframe-dialog.component.mjs +8 -15
  25. package/components/dialogs/iframe-dialog/fesm2022/index.mjs +7 -14
  26. package/components/dialogs/iframe-dialog/fesm2022/index.mjs.map +1 -1
  27. package/components/input/epoch/base-date-time.component.d.ts +6 -0
  28. package/components/input/epoch/bundles/index.umd.js +54 -31
  29. package/components/input/epoch/esm2022/base-date-time.component.mjs +16 -5
  30. package/components/input/epoch/esm2022/date-time/date-time.component.mjs +22 -15
  31. package/components/input/epoch/esm2022/time/time.component.mjs +19 -14
  32. package/components/input/epoch/fesm2022/index.mjs +54 -31
  33. package/components/input/epoch/fesm2022/index.mjs.map +1 -1
  34. package/components/input/slider/bundles/index.umd.js +9 -9
  35. package/components/input/slider/esm2022/slider.component.mjs +10 -10
  36. package/components/input/slider/fesm2022/index.mjs +9 -9
  37. package/components/input/slider/fesm2022/index.mjs.map +1 -1
  38. package/core/bundles/index.umd.js +3 -0
  39. package/core/esm2022/utils/wm-project-properties.mjs +4 -1
  40. package/core/fesm2022/index.mjs +3 -0
  41. package/core/fesm2022/index.mjs.map +1 -1
  42. package/npm-shrinkwrap.json +2 -2
  43. package/package-lock.json +2 -2
  44. package/package.json +1 -1
  45. package/runtime/base/bundles/index.umd.js +1 -1
  46. package/runtime/base/esm2022/services/i18n.service.mjs +2 -2
  47. package/runtime/base/fesm2022/index.mjs +1 -1
  48. package/runtime/base/fesm2022/index.mjs.map +1 -1
  49. package/security/bundles/index.umd.js +2 -2
  50. package/security/esm2022/security.service.mjs +3 -3
  51. package/security/fesm2022/index.mjs +2 -2
  52. package/security/fesm2022/index.mjs.map +1 -1
  53. package/transpiler/bundles/index.umd.js +0 -13
  54. package/transpiler/esm2022/build.mjs +1 -14
  55. package/transpiler/fesm2022/index.mjs +0 -13
  56. package/transpiler/fesm2022/index.mjs.map +1 -1
  57. package/variables/bundles/index.umd.js +1 -1
  58. package/variables/esm2022/service/metadata-service/metadata.service.mjs +2 -2
  59. package/variables/fesm2022/index.mjs +1 -1
  60. package/variables/fesm2022/index.mjs.map +1 -1
  61. package/scripts/hammerjs/hammer.min.js +0 -7
@@ -26,19 +26,23 @@ function TimeComponent_div_5_Conditional_2_Template(rf, ctx) { if (rf & 1) {
26
26
  const _r3 = i0.ɵɵgetCurrentView();
27
27
  i0.ɵɵelementStart(0, "div", 8)(1, "button", 9);
28
28
  i0.ɵɵlistener("click", function TimeComponent_div_5_Conditional_2_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.setPeriod("AM")); });
29
- i0.ɵɵtext(2, "AM");
29
+ i0.ɵɵtext(2);
30
30
  i0.ɵɵelementEnd();
31
31
  i0.ɵɵelement(3, "br");
32
32
  i0.ɵɵelementStart(4, "button", 10);
33
33
  i0.ɵɵlistener("click", function TimeComponent_div_5_Conditional_2_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.setPeriod("PM")); });
34
- i0.ɵɵtext(5, "PM");
34
+ i0.ɵɵtext(5);
35
35
  i0.ɵɵelementEnd()();
36
36
  } if (rf & 2) {
37
37
  const ctx_r1 = i0.ɵɵnextContext(2);
38
38
  i0.ɵɵadvance();
39
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(2, _c3, ctx_r1.getPeriod() === "AM"));
40
- i0.ɵɵadvance(3);
41
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(4, _c3, ctx_r1.getPeriod() === "PM"));
39
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(4, _c3, ctx_r1.getPeriod() === "AM"));
40
+ i0.ɵɵadvance();
41
+ i0.ɵɵtextInterpolate(ctx_r1.appLocale.LABEL_AM || "AM");
42
+ i0.ɵɵadvance(2);
43
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(6, _c3, ctx_r1.getPeriod() === "PM"));
44
+ i0.ɵɵadvance();
45
+ i0.ɵɵtextInterpolate(ctx_r1.appLocale.LABEL_PM || "PM");
42
46
  } }
43
47
  function TimeComponent_div_5_Template(rf, ctx) { if (rf & 1) {
44
48
  const _r1 = i0.ɵɵgetCurrentView();
@@ -48,7 +52,7 @@ function TimeComponent_div_5_Template(rf, ctx) { if (rf & 1) {
48
52
  i0.ɵɵtwoWayListener("ngModelChange", function TimeComponent_div_5_Template_timepicker_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.bsTimeValue, $event) || (ctx_r1.bsTimeValue = $event); return i0.ɵɵresetView($event); });
49
53
  i0.ɵɵlistener("isValid", function TimeComponent_div_5_Template_timepicker_isValid_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.isValid($event)); })("ngModelChange", function TimeComponent_div_5_Template_timepicker_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onTimeChange($event)); });
50
54
  i0.ɵɵelementEnd();
51
- i0.ɵɵtemplate(2, TimeComponent_div_5_Conditional_2_Template, 6, 6, "div", 8);
55
+ i0.ɵɵtemplate(2, TimeComponent_div_5_Conditional_2_Template, 6, 8, "div", 8);
52
56
  i0.ɵɵelementEnd();
53
57
  } if (rf & 2) {
54
58
  const ctx_r1 = i0.ɵɵnextContext();
@@ -115,7 +119,8 @@ export class TimeComponent extends BaseDateTimeComponent {
115
119
  $appDigest();
116
120
  }
117
121
  get displayValue() {
118
- return getFormattedDate(this.datePipe, this.bsTimeValue, this.timepattern, this.timeZone, null, null, this) || '';
122
+ const display = getFormattedDate(this.datePipe, this.bsTimeValue, this.timepattern, this.timeZone, null, null, this) || '';
123
+ return this.safeReplaceMeridians(display);
119
124
  }
120
125
  get nativeDisplayValue() {
121
126
  return getFormattedDate(this.datePipe, this.bsTimeValue, 'HH:mm:ss', this.timeZone, null, null, this) || '';
@@ -241,7 +246,7 @@ export class TimeComponent extends BaseDateTimeComponent {
241
246
  * This is an internal method triggered when the time input changes
242
247
  */
243
248
  onDisplayTimeChange($event) {
244
- const newVal = getNativeDateObject($event.target.value, { meridians: this.meridians, pattern: this.loadNativeDateInput ? this.outputformat : undefined, isNativePicker: this.loadNativeDateInput });
249
+ const newVal = getNativeDateObject($event.target.value?.replace(this.am, this.meridians[0])?.replace(this.pm, this.meridians[1]), { meridians: this.meridians, pattern: this.loadNativeDateInput ? this.outputformat : undefined, isNativePicker: this.loadNativeDateInput });
245
250
  // time pattern validation
246
251
  // if invalid pattern is entered, device is showing an error.
247
252
  if (!this.formatValidation(newVal, $event.target.value)) {
@@ -278,13 +283,13 @@ export class TimeComponent extends BaseDateTimeComponent {
278
283
  maxTimeMeridian = moment(new Date(this.bsTimePicker.max)).format('A');
279
284
  timeValue = this.bsTimePicker.hours + ':' + (this.bsTimePicker.minutes || 0) + ':' + (this.bsTimePicker.seconds || 0) + (this.bsTimePicker.showMeridian ? (' ' + minTimeMeridian) : '');
280
285
  timeInputValue = getNativeDateObject(timeValue, { pattern: this.loadNativeDateInput ? this.outputformat : undefined, isNativePicker: this.loadNativeDateInput });
281
- this.bsTimePicker.meridian = minTimeMeridian;
286
+ this.bsTimePicker.meridian = minTimeMeridian?.replace(this.meridians[0], this.am)?.replace(this.meridians[1], this.pm);
282
287
  this.timeNotInRange = this.bsTimePicker.min > timeInputValue || this.bsTimePicker.max < timeInputValue;
283
288
  if (this.timeNotInRange || this.invalidDateTimeFormat) {
284
289
  this.bsTimeValue = this.getPrevDataValue();
285
290
  setTimeout(() => {
286
291
  const timeStr = getFormattedDate(this.datePipe, timeValue, this.timepattern, this.timeZone, null, null, this) || '';
287
- $(this.nativeElement).find('.display-input').val(timeStr);
292
+ $(this.nativeElement).find('.display-input').val(this.safeReplaceMeridians(timeStr));
288
293
  });
289
294
  }
290
295
  this.setValidateType(this.bsTimePicker.min, this.bsTimePicker.max, timeInputValue);
@@ -295,7 +300,7 @@ export class TimeComponent extends BaseDateTimeComponent {
295
300
  // Update UI display if value hasn't changed
296
301
  if (!this.timeNotInRange && this.datavalue === this.getPrevDataValue()) {
297
302
  const displayTime = getFormattedDate(this.datePipe, this.datavalue, this.timepattern, this.timeZone, null, null, this) || '';
298
- $(this.nativeElement).find('.display-input').val(displayTime);
303
+ $(this.nativeElement).find('.display-input').val(this.safeReplaceMeridians(displayTime));
299
304
  }
300
305
  this.invokeOnTouched();
301
306
  this.invokeOnChange(this.datavalue, {}, true);
@@ -351,7 +356,7 @@ export class TimeComponent extends BaseDateTimeComponent {
351
356
  }
352
357
  isValid(event) {
353
358
  if (!event) {
354
- const enteredDate = $(this.nativeElement).find('input').val();
359
+ const enteredDate = $(this.nativeElement).find('input').val()?.replace(this.am, this.meridians[0])?.replace(this.pm, this.meridians[1]);
355
360
  const newVal = getNativeDateObject(enteredDate, { meridians: this.meridians, pattern: this.loadNativeDateInput ? this.outputformat : undefined, isNativePicker: this.loadNativeDateInput });
356
361
  if (!this.formatValidation(newVal, enteredDate)) {
357
362
  return;
@@ -416,7 +421,7 @@ export class TimeComponent extends BaseDateTimeComponent {
416
421
  provideAs(TimeComponent, NG_VALIDATORS, true),
417
422
  provideAsWidgetRef(TimeComponent),
418
423
  { provide: TimepickerConfig, deps: [AbstractI18nService], useFactory: getTimepickerConfig }
419
- ], template: "<div dropdown [isOpen]=\"status.isopen\" (onShown)=\"onShown()\" (onHidden)=\"hideTimepickerDropdown()\" [container]=\"'body'\" style=\"display: inherit\">\n <input [attr.aria-label]=\"arialabel\" class=\"form-control app-textbox display-input\"\n focus-target\n [tabindex]=\"tabindex\"\n [name]=\"name\"\n type=\"text\"\n role=\"timer\"\n [value]=\"displayValue\"\n [disabled]=\"disabled || readonly || isCurrentTime\"\n [autofocus]=\"autofocus\"\n [attr.placeholder]=\"placeholder\"\n [attr.accesskey]=\"shortcutkey\"\n [attr.aria-atomic]=\"isCurrentTime ? 'true' : 'false'\"\n [required]=\"required\"\n [readOnly]=\"isReadOnly\"\n (click)=\"toggleDropdown($event, true)\"\n (focus)=\"onDateTimeInputFocus(); invokeOnFocus($event);\"\n (blur)=\"onInputBlur($event)\"\n (change)=\"onDisplayTimeChange($event)\"\n (keydown)=\"this._triggeredByUser = true; onDisplayKeydown($event)\">\n <span class=\"input-group-btn dropdown-toggle\">\n <button type=\"button\" class=\"btn btn-default btn-date\" [tabindex]=\"tabindex\" [disabled]=\"disabled || readonly || isCurrentTime\" aria-label=\"Select time\" aria-haspopup=\"true\" aria-expanded=\"false\" (click)=\"toggleDropdown($event, false)\"><i aria-hidden=\"true\" class=\"app-icon wm-sl-l sl-time\"></i></button>\n </span>\n <div *dropdownMenu class=\"dropdown-menu\" (click)=\"preventTpClose($event)\">\n <timepicker class=\"model-holder\"\n [showMeridian]=\"ismeridian\"\n [readonlyInput]=\"isDisabled\"\n [(ngModel)]=\"bsTimeValue\"\n [ngModelOptions]=\"{standalone: true}\"\n [disabled]=\"disabled || readonly || isCurrentTime\"\n [min]=\"minTime\"\n [max]=\"maxTime\"\n [hourStep]=\"hourstep\"\n [minuteStep]=\"minutestep\"\n [secondsStep]=\"secondsstep\"\n [mousewheel]=\"true\"\n [arrowkeys]=\"true\"\n (isValid)=\"isValid($event)\"\n [showSeconds]=\"showseconds\" (ngModelChange)=\"onTimeChange($event)\"\n [ngClass]=\"{ 'showbuttons': showampmbuttons }\"></timepicker>\n @if (ismeridian && showampmbuttons) {\n <div class=\"ampm-toggle text-center\">\n <button class=\"meridian-btn mb-1\" [ngClass]=\"{ 'active btn-secondary': getPeriod() === 'AM' }\" (click)=\"setPeriod('AM')\">AM</button><br>\n <button class=\"meridian-btn\" [ngClass]=\"{ 'active btn-secondary': getPeriod() === 'PM' }\" (click)=\"setPeriod('PM')\">PM</button>\n </div>\n }\n </div>\n</div>\n@if (loadNativeDateInput) {\n <wm-datetimepicker\n dateTimePicker\n mode=\"TIME\"\n [minTime]=\"minTime\"\n [maxTime]=\"maxTime\"\n [placement]=\"modal\"\n [displayFormat]=\"timepattern\"\n [value]=\"bsTimeValue\"\n (change)=\"onTimeChange($event)\">\n </wm-datetimepicker>\n <div class=\"mobile-input mobile-datepicker-container\"\n tabindex=\"1000000\"\n (click)=\"!(disabled || readonly) && showDatePickerModal(bsTimeValue)\"\n [attr.aria-label]=\"displayValue ? 'Change time ' + displayValue : arialabel || 'Select time'\"\n (focus)=\"onDateTimeInputFocus(true); invokeOnFocus($event); assignModel()\"\n (blur)=\"onDateTimeInputBlur(); invokeOnTouched($event)\"\n role=\"button\">\n </div>\n}\n" }]
424
+ ], template: "<div dropdown [isOpen]=\"status.isopen\" (onShown)=\"onShown()\" (onHidden)=\"hideTimepickerDropdown()\" [container]=\"'body'\" style=\"display: inherit\">\n <input [attr.aria-label]=\"arialabel\" class=\"form-control app-textbox display-input\"\n focus-target\n [tabindex]=\"tabindex\"\n [name]=\"name\"\n type=\"text\"\n role=\"timer\"\n [value]=\"displayValue\"\n [disabled]=\"disabled || readonly || isCurrentTime\"\n [autofocus]=\"autofocus\"\n [attr.placeholder]=\"placeholder\"\n [attr.accesskey]=\"shortcutkey\"\n [attr.aria-atomic]=\"isCurrentTime ? 'true' : 'false'\"\n [required]=\"required\"\n [readOnly]=\"isReadOnly\"\n (click)=\"toggleDropdown($event, true)\"\n (focus)=\"onDateTimeInputFocus(); invokeOnFocus($event);\"\n (blur)=\"onInputBlur($event)\"\n (change)=\"onDisplayTimeChange($event)\"\n (keydown)=\"this._triggeredByUser = true; onDisplayKeydown($event)\">\n <span class=\"input-group-btn dropdown-toggle\">\n <button type=\"button\" class=\"btn btn-default btn-date\" [tabindex]=\"tabindex\" [disabled]=\"disabled || readonly || isCurrentTime\" aria-label=\"Select time\" aria-haspopup=\"true\" aria-expanded=\"false\" (click)=\"toggleDropdown($event, false)\"><i aria-hidden=\"true\" class=\"app-icon wm-sl-l sl-time\"></i></button>\n </span>\n <div *dropdownMenu class=\"dropdown-menu\" (click)=\"preventTpClose($event)\">\n <timepicker class=\"model-holder\"\n [showMeridian]=\"ismeridian\"\n [readonlyInput]=\"isDisabled\"\n [(ngModel)]=\"bsTimeValue\"\n [ngModelOptions]=\"{standalone: true}\"\n [disabled]=\"disabled || readonly || isCurrentTime\"\n [min]=\"minTime\"\n [max]=\"maxTime\"\n [hourStep]=\"hourstep\"\n [minuteStep]=\"minutestep\"\n [secondsStep]=\"secondsstep\"\n [mousewheel]=\"true\"\n [arrowkeys]=\"true\"\n (isValid)=\"isValid($event)\"\n [showSeconds]=\"showseconds\" (ngModelChange)=\"onTimeChange($event)\"\n [ngClass]=\"{ 'showbuttons': showampmbuttons }\"></timepicker>\n @if (ismeridian && showampmbuttons) {\n <div class=\"ampm-toggle text-center\">\n <button class=\"meridian-btn mb-1\" [ngClass]=\"{ 'active btn-secondary': getPeriod() === 'AM' }\" (click)=\"setPeriod('AM')\">{{appLocale.LABEL_AM ||\"AM\"}}</button><br>\n <button class=\"meridian-btn\" [ngClass]=\"{ 'active btn-secondary': getPeriod() === 'PM' }\" (click)=\"setPeriod('PM')\">{{appLocale.LABEL_PM ||\"PM\"}}</button>\n </div>\n }\n </div>\n</div>\n@if (loadNativeDateInput) {\n <wm-datetimepicker\n dateTimePicker\n mode=\"TIME\"\n [minTime]=\"minTime\"\n [maxTime]=\"maxTime\"\n [placement]=\"modal\"\n [displayFormat]=\"timepattern\"\n [value]=\"bsTimeValue\"\n (change)=\"onTimeChange($event)\">\n </wm-datetimepicker>\n <div class=\"mobile-input mobile-datepicker-container\"\n tabindex=\"1000000\"\n (click)=\"!(disabled || readonly) && showDatePickerModal(bsTimeValue)\"\n [attr.aria-label]=\"displayValue ? 'Change time ' + displayValue : arialabel || 'Select time'\"\n (focus)=\"onDateTimeInputFocus(true); invokeOnFocus($event); assignModel()\"\n (blur)=\"onDateTimeInputBlur(); invokeOnTouched($event)\"\n role=\"button\">\n </div>\n}\n" }]
420
425
  }], () => [{ type: i0.Injector }, { type: i0.NgZone }, { type: i1.AppDefaults }, { type: i1.App }, { type: undefined, decorators: [{
421
426
  type: Inject,
422
427
  args: ['EXPLICIT_CONTEXT']
@@ -424,4 +429,4 @@ export class TimeComponent extends BaseDateTimeComponent {
424
429
  type: Optional
425
430
  }] }], null); })();
426
431
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TimeComponent, { className: "TimeComponent", filePath: "time/time.component.ts", lineNumber: 50 }); })();
427
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvaW5wdXQvZXBvY2gvc3JjL3RpbWUvdGltZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvaW5wdXQvZXBvY2gvc3JjL3RpbWUvdGltZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQWEsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RSxPQUFPLEVBQ0gsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixRQUFRLEVBQ1IseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2QixHQUFHLEVBQ0gsV0FBVyxFQUVYLGNBQWMsRUFDZCx3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDdEIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU1RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUs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QUFxQjtZQUFDLEFBQXRCLHVDQUFxQiwrREFBbUQ7WUEyQm5JLGVBbUJDO1lBbkJELGtEQW1CQzs0QkQ1QmEsa0JBQWtCLEVBQUUsV0FBVyxrQ0FBRSx1QkFBdUIsRUFBRSxnQkFBZ0Isc0RBQUUsZ0JBQWdCLDBCQUFDLFlBQVk7O2lGQVUxRyxhQUFhO2NBWnpCLFNBQVM7NkJBQ00sSUFBSSxXQUNQLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFDLFlBQVksQ0FBQyxZQUMxRyxVQUFVLGFBRVQ7b0JBQ1AsU0FBUyxnQkFBZ0IsaUJBQWlCLEVBQUUsSUFBSSxDQUFDO29CQUNqRCxTQUFTLGdCQUFnQixhQUFhLEVBQUUsSUFBSSxDQUFDO29CQUM3QyxrQkFBa0IsZUFBZTtvQkFDakMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUMsbUJBQW1CLENBQUMsRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUU7aUJBQzlGOztzQkFrR0ksTUFBTTt1QkFBQyxrQkFBa0I7O3NCQUFHLFFBQVE7O2tGQWhHaEMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdtQ29tcG9uZW50c01vZHVsZSB9IGZyb20gXCJAd20vY29tcG9uZW50cy9iYXNlXCI7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGVUaW1lUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS10aW1lL2RhdGUtdGltZS1waWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgSW5qZWN0b3IsIE5nWm9uZSwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUaW1lcGlja2VyQ29uZmlnLCBUaW1lcGlja2VyTW9kdWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC90aW1lcGlja2VyJztcbmltcG9ydCB7XG4gICAgJGFwcERpZ2VzdCxcbiAgICBBYnN0cmFjdEkxOG5TZXJ2aWNlLFxuICAgIGFkZENsYXNzLFxuICAgIGFkZEV2ZW50TGlzdGVuZXJPbkVsZW1lbnQsXG4gICAgYWRqdXN0Q29udGFpbmVyUG9zaXRpb24sXG4gICAgQXBwLFxuICAgIEFwcERlZmF1bHRzLFxuICAgIEVWRU5UX0xJRkUsXG4gICAgRm9ybVdpZGdldFR5cGUsXG4gICAgZ2V0RGlzcGxheURhdGVUaW1lRm9ybWF0LFxuICAgIGdldEZvcm1hdHRlZERhdGUsXG4gICAgZ2V0TW9tZW50TG9jYWxlT2JqZWN0LFxuICAgIGdldE5hdGl2ZURhdGVPYmplY3Rcbn0gZnJvbSAnQHdtL2NvcmUnO1xuaW1wb3J0IHsgcHJvdmlkZUFzLCBwcm92aWRlQXNXaWRnZXRSZWYsIHN0eWxlciB9IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuXG5pbXBvcnQgeyBCYXNlRGF0ZVRpbWVDb21wb25lbnQsIGdldFRpbWVwaWNrZXJDb25maWcgfSBmcm9tICcuLy4uL2Jhc2UtZGF0ZS10aW1lLmNvbXBvbmVudCc7XG5pbXBvcnQgeyByZWdpc3RlclByb3BzIH0gZnJvbSAnLi90aW1lLnByb3BzJztcbmltcG9ydCB7IGZvckVhY2gsIGdldCwgaW5jbHVkZXMgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBCc0Ryb3Bkb3duTW9kdWxlIH0gZnJvbSBcIm5neC1ib290c3RyYXAvZHJvcGRvd25cIjtcblxuZGVjbGFyZSBjb25zdCAkO1xuaW1wb3J0ICogYXMgbW9tZW50TGliICBmcm9tICdtb21lbnQnO1xuY29uc3QgbW9tZW50ID0gbW9tZW50TGliLmRlZmF1bHQgfHwgd2luZG93Wydtb21lbnQnXTtcblxuY29uc3QgQ1VSUkVOVF9USU1FID0gJ0NVUlJFTlRfVElNRSc7XG5jb25zdCBERUZBVUxUX0NMUyA9ICdpbnB1dC1ncm91cCBhcHAtdGltZWlucHV0JztcbmNvbnN0IFdJREdFVF9DT05GSUcgPSB7IHdpZGdldFR5cGU6ICd3bS10aW1lJywgaG9zdENsYXNzOiBERUZBVUxUX0NMUyB9O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtXbUNvbXBvbmVudHNNb2R1bGUsIEZvcm1zTW9kdWxlLCBEYXRlVGltZVBpY2tlckNvbXBvbmVudCwgQnNEcm9wZG93bk1vZHVsZSwgVGltZXBpY2tlck1vZHVsZSxDb21tb25Nb2R1bGVdLFxuICAgIHNlbGVjdG9yOiAnW3dtVGltZV0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90aW1lLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgcHJvdmlkZUFzKFRpbWVDb21wb25lbnQsIE5HX1ZBTFVFX0FDQ0VTU09SLCB0cnVlKSxcbiAgICAgICAgcHJvdmlkZUFzKFRpbWVDb21wb25lbnQsIE5HX1ZBTElEQVRPUlMsIHRydWUpLFxuICAgICAgICBwcm92aWRlQXNXaWRnZXRSZWYoVGltZUNvbXBvbmVudCksXG4gICAgICAgIHsgcHJvdmlkZTogVGltZXBpY2tlckNvbmZpZywgZGVwczogW0Fic3RyYWN0STE4blNlcnZpY2VdLCB1c2VGYWN0b3J5OiBnZXRUaW1lcGlja2VyQ29uZmlnIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIFRpbWVDb21wb25lbnQgZXh0ZW5kcyBCYXNlRGF0ZVRpbWVDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHN0YXRpYyBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlclByb3BzKCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBzZXRzIHRoZSBkaXNwbGF5IHBhdHRlcm4gb2YgdGhlIHRpbWUgc2VsZWN0ZWRcbiAgICAgKi9cbiAgICB0aW1lcGF0dGVybjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBzZXRzIHRoZSBvdXRwdXQgZm9ybWF0IGZvciB0aGUgc2VsZWN0ZWQgdGltZSBkYXRhdmFsdWVcbiAgICAgKi9cbiAgICBvdXRwdXRmb3JtYXQ6IHN0cmluZztcblxuICAgIHB1YmxpYyBzaG93ZHJvcGRvd25vbjogc3RyaW5nO1xuICAgIHB1YmxpYyBtaW50aW1lO1xuICAgIHB1YmxpYyBtYXh0aW1lO1xuICAgIHB1YmxpYyBoaW50OiBzdHJpbmc7XG4gICAgcHVibGljIGFyaWFsYWJlbDogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBkZXJlZ2lzdGVyRXZlbnRMaXN0ZW5lcjtcbiAgICBwcml2YXRlIGFwcDogQXBwO1xuICAgIHByaXZhdGUgZGlzcGxheUlucHV0RWxlbTogSFRNTEVsZW1lbnQ7XG5cbiAgICBnZXQgdGltZXN0YW1wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ic1RpbWVWYWx1ZSA/IHRoaXMuYnNUaW1lVmFsdWUudmFsdWVPZigpIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBnZXQgZGF0YXZhbHVlKCk6IGFueSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ3VycmVudFRpbWUgJiYgIXRoaXMuYnNUaW1lVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBDVVJSRU5UX1RJTUU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldEZvcm1hdHRlZERhdGUodGhpcy5kYXRlUGlwZSwgdGhpcy5ic1RpbWVWYWx1ZSwgdGhpcy5vdXRwdXRmb3JtYXQsIHRoaXMudGltZVpvbmUsIG51bGwsIG51bGwsIHRoaXMpIHx8ICcnO1xuICAgIH1cblxuICAgIC8qKlRvZG9bU2h1YmhhbV06IG5lZWRzIHRvIGJlIHJlZGVmaW5lZFxuICAgICAqIFRoaXMgcHJvcGVydHkgc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHRpbWUgc2VsZWN0aW9uXG4gICAgICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHNldCBkYXRhdmFsdWUobmV3VmFsOiBhbnkpIHtcbiAgICAgICAgaWYgKG5ld1ZhbCkge1xuICAgICAgICAgICAgaWYgKG5ld1ZhbCA9PT0gQ1VSUkVOVF9USU1FKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0N1cnJlbnRUaW1lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRpbWVJbnRlcnZhbCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVGltZUludGVydmFsKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ic1RpbWVWYWx1ZSA9IGdldE5hdGl2ZURhdGVPYmplY3QobmV3VmFsLCB7IHBhdHRlcm46IHRoaXMubG9hZE5hdGl2ZURhdGVJbnB1dCA/IHRoaXMub3V0cHV0Zm9ybWF0IDogdW5kZWZpbmVkLCBpc05hdGl2ZVBpY2tlcjogdGhpcy5sb2FkTmF0aXZlRGF0ZUlucHV0IH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNDdXJyZW50VGltZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMubWludGltZU1heHRpbWVWYWxpZGF0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJzVGltZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVJbnRlcnZhbCgpO1xuICAgICAgICAgICAgdGhpcy5pc0N1cnJlbnRUaW1lID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnZva2VPbkNoYW5nZSh0aGlzLmRhdGF2YWx1ZSk7XG4gICAgICAgICRhcHBEaWdlc3QoKTtcbiAgICB9XG5cbiAgICBnZXQgZGlzcGxheVZhbHVlKCkge1xuICAgICAgICByZXR1cm4gZ2V0Rm9ybWF0dGVkRGF0ZSh0aGlzLmRhdGVQaXBlLCB0aGlzLmJzVGltZVZhbHVlLCB0aGlzLnRpbWVwYXR0ZXJuLCB0aGlzLnRpbWVab25lLCBudWxsLCBudWxsLCB0aGlzKSB8fCAnJztcbiAgICB9XG5cbiAgICBnZXQgbmF0aXZlRGlzcGxheVZhbHVlKCkge1xuICAgICAgICByZXR1cm4gZ2V0Rm9ybWF0dGVkRGF0ZSh0aGlzLmRhdGVQaXBlLCB0aGlzLmJzVGltZVZhbHVlLCAnSEg6bW06c3MnLCB0aGlzLnRpbWVab25lLCBudWxsLCBudWxsLCB0aGlzKSB8fCAnJztcbiAgICB9XG5cbiAgICAvKiBJbnRlcm5hbCBwcm9wZXJ0eSB0byBoYXZlIGEgZmxhZyB0byBjaGVjayB0aGUgZ2l2ZW4gZGF0YXZhbHVlIGlzIG9mIEN1cnJlbnQgdGltZSovXG4gICAgcHVibGljIGlzQ3VycmVudFRpbWU6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIHRpbWVpbnRlcnZhbDogYW55O1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBwcm9wZXJ0eSB1c2VkIHRvIG1hcCBpdCB0byB0aGUgd2lkZ2V0XG4gICAgICovXG4gICAgcHJpdmF0ZSBtaW5UaW1lOiBEYXRlO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBwcm9wZXJ0eSB1c2VkIHRvIG1hcCBpdCB0byB0aGUgd2lkZ2V0XG4gICAgICovXG4gICAgcHJpdmF0ZSBtYXhUaW1lOiBEYXRlO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBwcm9wZXJ0eSB1c2VkIHRvIHRvZ2dsZSB0aGUgdGltZXBpY2tlciBkcm9wZG93blxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0dXMgPSB7IGlzb3BlbjogZmFsc2UgfTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgcHJvcGVydHkgdXNlZCB0byBtYXAgdGhlIG1haW4gbW9kZWwgdG8gdGhlIHRpbWUgd2lkZ2V0XG4gICAgICovXG4gICAgcHJpdmF0ZSBic1RpbWVWYWx1ZTogRGF0ZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBpbmo6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgICAgICBwcml2YXRlIGFwcERlZmF1bHRzOiBBcHBEZWZhdWx0cyxcbiAgICAgICAgYXBwOiBBcHAsXG4gICAgICAgIEBJbmplY3QoJ0VYUExJQ0lUX0NPTlRFWFQnKSBAT3B0aW9uYWwoKSBleHBsaWNpdENvbnRleHQ6IGFueVxuICAgICkge1xuICAgICAgICBzdXBlcihpbmosIFdJREdFVF9DT05GSUcsIGV4cGxpY2l0Q29udGV4dCk7XG5cbiAgICAgICAgc3R5bGVyKHRoaXMubmF0aXZlRWxlbWVudCwgdGhpcyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXN0cm95IHRoZSB0aW1lciBvbmNlIHRoZSBkYXRlIHdpZGdldCBpcyBnb25lXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRGVzdHJveUxpc3RlbmVyKCgpID0+IHRoaXMuY2xlYXJUaW1lSW50ZXJ2YWwoKSk7XG5cbiAgICAgICAgdGhpcy50aW1lcGF0dGVybiA9IHRoaXMuYXBwRGVmYXVsdHMudGltZUZvcm1hdCB8fCBnZXREaXNwbGF5RGF0ZVRpbWVGb3JtYXQoRm9ybVdpZGdldFR5cGUuVElNRSk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9ybWF0KCd0aW1lcGF0dGVybicpO1xuICAgICAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICB9XG5cbiAgICBvblByb3BlcnR5Q2hhbmdlKGtleTogc3RyaW5nLCBudjogYW55LCBvdj86IGFueSkge1xuICAgICAgICBpZiAoa2V5ID09PSAndGFiaW5kZXgnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gJ3RpbWVwYXR0ZXJuJykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtYXQoJ3RpbWVwYXR0ZXJuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gJ21pbnRpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLm1pblRpbWUgPSBnZXROYXRpdmVEYXRlT2JqZWN0KG52LCB7IHBhdHRlcm46IHRoaXMubG9hZE5hdGl2ZURhdGVJbnB1dCA/IHRoaXMub3V0cHV0Zm9ybWF0IDogdW5kZWZpbmVkLCBpc05hdGl2ZVBpY2tlcjogdGhpcy5sb2FkTmF0aXZlRGF0ZUlucHV0IH0pOyAvLyBUT0RPIGl0IGlzIHN1cHBvc2VkIHRvIGJlIHRpbWUgY29udmVyc2lvbiwgbm90IHRvIHRoZSBkYXlcbiAgICAgICAgICAgIHRoaXMubWludGltZU1heHRpbWVWYWxpZGF0aW9uKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbWF4dGltZScpIHtcbiAgICAgICAgICAgIHRoaXMubWF4VGltZSA9IGdldE5hdGl2ZURhdGVPYmplY3QobnYsIHsgcGF0dGVybjogdGhpcy5sb2FkTmF0aXZlRGF0ZUlucHV0ID8gdGhpcy5vdXRwdXRmb3JtYXQgOiB1bmRlZmluZWQsIGlzTmF0aXZlUGlja2VyOiB0aGlzLmxvYWROYXRpdmVEYXRlSW5wdXQgfSk7XG4gICAgICAgICAgICB0aGlzLm1pbnRpbWVNYXh0aW1lVmFsaWRhdGlvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VwZXIub25Qcm9wZXJ0eUNoYW5nZShrZXksIG52LCBvdik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRWYWxpZGF0ZVR5cGUobWluLCBtYXgsIHZhbCkge1xuICAgICAgICBpZiAodGhpcy50aW1lTm90SW5SYW5nZSkge1xuICAgICAgICAgICAgaWYgKHZhbCA8IG1pbikge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIGFueSkudmFsaWRhdGVUeXBlID0gJ21pbnRpbWUnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwgPiBtYXgpIHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpLnZhbGlkYXRlVHlwZSA9ICdtYXh0aW1lJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kIHVzZWQgdG8gdmFsaWRhdGUgbWludGltZSBhbmQgbWF4dGltZVxuICAgICAqL1xuICAgIHByaXZhdGUgbWludGltZU1heHRpbWVWYWxpZGF0aW9uKCkge1xuICAgICAgICB0aGlzLnRpbWVOb3RJblJhbmdlID0gdGhpcy5taW5UaW1lICYmIHRoaXMubWF4VGltZSAmJiAodGhpcy5ic1RpbWVWYWx1ZSA8IHRoaXMubWluVGltZSB8fCB0aGlzLmJzVGltZVZhbHVlID4gdGhpcy5tYXhUaW1lKTtcbiAgICAgICAgdGhpcy5zZXRWYWxpZGF0ZVR5cGUodGhpcy5taW5UaW1lLCB0aGlzLm1heFRpbWUsIHRoaXMuYnNUaW1lVmFsdWUpO1xuICAgICAgICB0aGlzLmludm9rZU9uQ2hhbmdlKHRoaXMuZGF0YXZhbHVlLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB1c2VkIHRvIHRvZ2dsZSB0aGUgZHJvcGRvd24gb2YgdGhlIHRpbWUgd2lkZ2V0XG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZURyb3Bkb3duKCRldmVudCwgc2tpcEZvY3VzOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubG9hZE5hdGl2ZURhdGVJbnB1dCkge1xuICAgICAgICAgICAgLy9GaXhlcyBjbGljayBldmVudCBnZXR0aW5nIHRyaWdncmVkIHR3aWNlIGluIE1vYmlsZSBkZXZpY2VzLlxuICAgICAgICAgICAgaWYgKCFza2lwRm9jdXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRGF0ZVRpbWVJbnB1dEZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCRldmVudC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2NsaWNrJywgeyAkZXZlbnQ6ICRldmVudCB9KTtcbiAgICAgICAgICAgIC8vdGhpcy5mb2N1c09uSW5wdXRFbCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkZXZlbnQudGFyZ2V0ICYmICQoJGV2ZW50LnRhcmdldCkuaXMoJ2lucHV0JykgJiYgISh0aGlzLmlzRHJvcERvd25EaXNwbGF5RW5hYmxlZE9uSW5wdXQodGhpcy5zaG93ZHJvcGRvd25vbikpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzLmlzb3BlbiA9ICF0aGlzLnN0YXR1cy5pc29wZW47XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFkZEJvZHlDbGlja0xpc3RlbmVyKHRoaXMuc3RhdHVzLmlzb3Blbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QgdXNlZCB0byBQcmV2ZW50IHRpbWUgcGlja2VyIGNsb3NlIHdoaWxlIGNoYW5naW5nIHRpbWUgdmFsdWVcbiAgICAgKi9cbiAgICBwcml2YXRlIHByZXZlbnRUcENsb3NlKCRldmVudCkge1xuICAgICAgICAkZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnN0IHBhcmVudEVsID0gJCh0aGlzLm5hdGl2ZUVsZW1lbnQpLmNsb3Nlc3QoJy5hcHAtY29tcG9zaXRlLXdpZGdldC5jYXB0aW9uLWZsb2F0aW5nJyk7XG4gICAgICAgIGlmIChwYXJlbnRFbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFwcC5ub3RpZnkoJ2NhcHRpb25Qb3NpdGlvbkFuaW1hdGUnLCB7IGRpc3BsYXlWYWw6IHRoaXMuZGlzcGxheVZhbHVlLCBuYXRpdmVFbDogcGFyZW50RWwgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEJvZHlDbGlja0xpc3RlbmVyKHNraXBMaXN0ZW5lcikge1xuICAgICAgICBpZiAoIXNraXBMaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJvZHlFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duRWxlbWVudCA9ICQoYm9keUVsZW1lbnQpLmZpbmQoJz5icy1kcm9wZG93bi1jb250YWluZXIgLmRyb3Bkb3duLW1lbnUnKS5nZXQoMCk7XG4gICAgICAgICAgICB0aGlzLmRlcmVnaXN0ZXJFdmVudExpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lck9uRWxlbWVudChib2R5RWxlbWVudCwgZHJvcGRvd25FbGVtZW50LCB0aGlzLm5hdGl2ZUVsZW1lbnQsICdjbGljaycsIHRoaXMuaXNEcm9wRG93bkRpc3BsYXlFbmFibGVkT25JbnB1dCh0aGlzLnNob3dkcm9wZG93bm9uKSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzLmlzb3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgfSwgRVZFTlRfTElGRS5PTkNFLCB0cnVlKTtcbiAgICAgICAgfSwgMzUwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB0cmlnZ2VyZWQgd2hlbiBwcmVzc2luZyBrZXkgb24gdGhlIHRpbWUgaW5wdXRcbiAgICAgKi9cbiAgICBwdWJsaWMgb25EaXNwbGF5S2V5ZG93bihldmVudCkge1xuICAgICAgICBpZiAodGhpcy5pc0Ryb3BEb3duRGlzcGxheUVuYWJsZWRPbklucHV0KHRoaXMuc2hvd2Ryb3Bkb3dub24pKSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVEcm9wZG93bihldmVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZVRpbWVwaWNrZXJEcm9wZG93bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oaWRlVGltZXBpY2tlckRyb3Bkb3duKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB0cmlnZ2VyZWQgd2hlbiB0aGUgdGltZSBpbnB1dCBjaGFuZ2VzXG4gICAgICovXG4gICAgb25EaXNwbGF5VGltZUNoYW5nZSgkZXZlbnQpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsID0gZ2V0TmF0aXZlRGF0ZU9iamVjdCgkZXZlbnQudGFyZ2V0LnZhbHVlLCB7IG1lcmlkaWFuczogdGhpcy5tZXJpZGlhbnMsIHBhdHRlcm46IHRoaXMubG9hZE5hdGl2ZURhdGVJbnB1dCA/IHRoaXMub3V0cHV0Zm9ybWF0IDogdW5kZWZpbmVkLCBpc05hdGl2ZVBpY2tlcjogdGhpcy5sb2FkTmF0aXZlRGF0ZUlucHV0IH0pO1xuICAgICAgICAvLyB0aW1lIHBhdHRlcm4gdmFsaWRhdGlvblxuICAgICAgICAvLyBpZiBpbnZhbGlkIHBhdHRlcm4gaXMgZW50ZXJlZCwgZGV2aWNlIGlzIHNob3dpbmcgYW4gZXJyb3IuXG4gICAgICAgIGlmICghdGhpcy5mb3JtYXRWYWxpZGF0aW9uKG5ld1ZhbCwgJGV2ZW50LnRhcmdldC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmludmFsaWREYXRlVGltZUZvcm1hdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uVGltZUNoYW5nZShuZXdWYWwpO1xuICAgIH1cblxuICAgIG9uSW5wdXRCbHVyKCRldmVudCkge1xuICAgICAgICBpZiAoISQoJGV2ZW50LnJlbGF0ZWRUYXJnZXQpLmhhc0NsYXNzKCdicy10aW1lcGlja2VyLWZpZWxkJykpIHtcbiAgICAgICAgICAgIHRoaXMuaW52b2tlT25Ub3VjaGVkKCk7XG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2JsdXInLCB7ICRldmVudCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kIHVzZWQgdG8gZXhlY3V0ZSB0aGUgb24gdGltZSBjaGFuZ2UgZnVuY3Rpb25hbGl0eVxuICAgICAqL1xuICAgIHByaXZhdGUgb25UaW1lQ2hhbmdlKG5ld1ZhbCwgaXNOYXRpdmVQaWNrZXI/OiBib29sZWFuKSB7XG4gICAgICAgIGxldCB0aW1lVmFsdWUsXG4gICAgICAgICAgICB0aW1lSW5wdXRWYWx1ZSxcbiAgICAgICAgICAgIG1pblRpbWVNZXJpZGlhbixcbiAgICAgICAgICAgIG1heFRpbWVNZXJpZGlhbjtcbiAgICAgICAgLy8gRm9yIG5hdGl2ZVBpY2tlciwgbmV3VmFsIGlzIGV2ZW50LCBnZXQgdGhlIGRhdGVvYmplY3QgZnJvbSB0aGUgZXZlbnQuXG4gICAgICAgIGlmIChpc05hdGl2ZVBpY2tlcikge1xuICAgICAgICAgICAgbmV3VmFsID0gZ2V0TmF0aXZlRGF0ZU9iamVjdChuZXdWYWwudGFyZ2V0LnZhbHVlLCB7IHBhdHRlcm46IHRoaXMubG9hZE5hdGl2ZURhdGVJbnB1dCA/IHRoaXMub3V0cHV0Zm9ybWF0IDogdW5kZWZpbmVkLCBpc05hdGl2ZVBpY2tlcjogdGhpcy5sb2FkTmF0aXZlRGF0ZUlucHV0IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdWYWwpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBuZXdWYWwgaXMgdmFsaWQgYnV0IG5vdCBpbiB0aGUgZ2l2ZW4gcmFuZ2UgdGhlbiBoaWdobGlnaHQgdGhlIGlucHV0IGZpZWxkXG4gICAgICAgICAgICB0aGlzLnRpbWVOb3RJblJhbmdlID0gdGhpcy5taW5UaW1lICYmIHRoaXMubWF4VGltZSAmJiAobmV3VmFsIDwgdGhpcy5taW5UaW1lIHx8IG5ld1ZhbCA+IHRoaXMubWF4VGltZSk7XG4gICAgICAgICAgICB0aGlzLnNldFZhbGlkYXRlVHlwZSh0aGlzLm1pblRpbWUsIHRoaXMubWF4VGltZSwgbmV3VmFsKTtcbiAgICAgICAgICAgIGlmKCF0aGlzLnRpbWVOb3RJblJhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ic1RpbWVWYWx1ZSA9IG5ld1ZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBzb21ldGltZXMgbGlicmFyeSBpcyBub3QgcmV0dXJuaW5nIHRoZSBjb3JyZWN0IHZhbHVlIHdoZW4gdGhlIG1pbiBhbmQgbWF4IHRpbWUgYXJlIGdpdmVuLCBkaXNwbGF5aW5nIHRoZSBkYXRhdmFsdWUgYmFzZWQgb24gdGhlIHZhbHVlIGdpdmVuIGJ5IHRoZSB1c2VyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYnNUaW1lUGlja2VyICYmIHRoaXMuYnNUaW1lUGlja2VyLm1pbiAmJiB0aGlzLmJzVGltZVBpY2tlci5tYXgpIHtcbiAgICAgICAgICAgIG1pblRpbWVNZXJpZGlhbiA9IG1vbWVudChuZXcgRGF0ZSh0aGlzLmJzVGltZVBpY2tlci5taW4pKS5mb3JtYXQoJ0EnKTtcbiAgICAgICAgICAgIG1heFRpbWVNZXJpZGlhbiA9IG1vbWVudChuZXcgRGF0ZSh0aGlzLmJzVGltZVBpY2tlci5tYXgpKS5mb3JtYXQoJ0EnKTtcbiAgICAgICAgICAgIHRpbWVWYWx1ZSA9IHRoaXMuYnNUaW1lUGlja2VyLmhvdXJzICsgJzonICsgKHRoaXMuYnNUaW1lUGlja2VyLm1pbnV0ZXMgfHwgMCkgKyAnOicgKyAodGhpcy5ic1RpbWVQaWNrZXIuc2Vjb25kcyB8fCAwKSArICh0aGlzLmJzVGltZVBpY2tlci5zaG93TWVyaWRpYW4gPyAoJyAnICsgbWluVGltZU1lcmlkaWFuKSA6ICcnKTtcbiAgICAgICAgICAgIHRpbWVJbnB1dFZhbHVlID0gZ2V0TmF0aXZlRGF0ZU9iamVjdCh0aW1lVmFsdWUsIHsgcGF0dGVybjogdGhpcy5sb2FkTmF0aXZlRGF0ZUlucHV0ID8gdGhpcy5vdXRwdXRmb3JtYXQgOiB1bmRlZmluZWQsIGlzTmF0aXZlUGlja2VyOiB0aGlzLmxvYWROYXRpdmVEYXRlSW5wdXQgfSk7XG4gICAgICAgICAgICB0aGlzLmJzVGltZVBpY2tlci5tZXJpZGlhbiA9IG1pblRpbWVNZXJpZGlhbjtcbiAgICAgICAgICAgIHRoaXMudGltZU5vdEluUmFuZ2UgPSAgdGhpcy5ic1RpbWVQaWNrZXIubWluID4gdGltZUlucHV0VmFsdWUgfHwgdGhpcy5ic1RpbWVQaWNrZXIubWF4IDwgdGltZUlucHV0VmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVOb3RJblJhbmdlIHx8IHRoaXMuaW52YWxpZERhdGVUaW1lRm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ic1RpbWVWYWx1ZSA9IHRoaXMuZ2V0UHJldkRhdGFWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lU3RyID0gZ2V0Rm9ybWF0dGVkRGF0ZSh0aGlzLmRhdGVQaXBlLCB0aW1lVmFsdWUsIHRoaXMudGltZXBhdHRlcm4sIHRoaXMudGltZVpvbmUsIG51bGwsIG51bGwsIHRoaXMpIHx8ICcnO1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMubmF0aXZlRWxlbWVudCkuZmluZCgnLmRpc3BsYXktaW5wdXQnKS52YWwodGltZVN0cik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFZhbGlkYXRlVHlwZSh0aGlzLmJzVGltZVBpY2tlci5taW4sIHRoaXMuYnNUaW1lUGlja2VyLm1heCwgdGltZUlucHV0VmFsdWUpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnRpbWVOb3RJblJhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ic1RpbWVWYWx1ZSA9IHRpbWVJbnB1dFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSBVSSBkaXNwbGF5IGlmIHZhbHVlIGhhc24ndCBjaGFuZ2VkXG4gICAgICAgIGlmICghdGhpcy50aW1lTm90SW5SYW5nZSAmJiB0aGlzLmRhdGF2YWx1ZSA9PT0gdGhpcy5nZXRQcmV2RGF0YVZhbHVlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlUaW1lID0gZ2V0Rm9ybWF0dGVkRGF0ZSh0aGlzLmRhdGVQaXBlLCB0aGlzLmRhdGF2YWx1ZSwgdGhpcy50aW1lcGF0dGVybiwgdGhpcy50aW1lWm9uZSwgbnVsbCwgbnVsbCwgdGhpcykgfHwgJyc7XG4gICAgICAgICAgICAkKHRoaXMubmF0aXZlRWxlbWVudCkuZmluZCgnLmRpc3BsYXktaW5wdXQnKS52YWwoZGlzcGxheVRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW52b2tlT25Ub3VjaGVkKCk7XG4gICAgICAgIHRoaXMuaW52b2tlT25DaGFuZ2UodGhpcy5kYXRhdmFsdWUsIHt9LCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB1c2VkIHRvIG1haW50YWluIGEgdGltZSBpbnRlcnZhbCB0byB1cGRhdGUgdGhlIHRpbWUgbW9kZWwgd2hlbiB0aGUgZGF0YSB2YWx1ZSBpcyBzZXQgdG8gQ1VSUkVOVF9USU1FXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRUaW1lSW50ZXJ2YWwoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVpbnRlcnZhbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGltZWludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gdGhpcy50aW1lWm9uZSA/IGdldE1vbWVudExvY2FsZU9iamVjdCh0aGlzLnRpbWVab25lKSA6IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBub3cuc2V0U2Vjb25kcyhub3cuZ2V0U2Vjb25kcygpICsgMSk7XG4gICAgICAgICAgICB0aGlzLmRhdGF2YWx1ZSA9IENVUlJFTlRfVElNRTtcbiAgICAgICAgICAgIHRoaXMub25UaW1lQ2hhbmdlKG5vdyk7XG4gICAgICAgIH0sIDEwMDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kIHVzZWQgdG8gY2xlYXIgdGhlIHRpbWUgaW50ZXJ2YWwgY3JlYXRlZFxuICAgICAqL1xuICAgIHByaXZhdGUgY2xlYXJUaW1lSW50ZXJ2YWwoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVpbnRlcnZhbCkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVpbnRlcnZhbCk7XG4gICAgICAgICAgICB0aGlzLnRpbWVpbnRlcnZhbCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHZhbHVlIGlzT3Blbi9pc1RpbWVPcGVuIChpLmUgd2hlbiBkYXRlcGlja2VyIHBvcHVwIGlzIGNsb3NlZCkgYmFzZWQgb24gd2lkZ2V0IHR5cGUoaS5lICBEYXRlVGltZSwgVGltZSlcbiAgICAgKiBAcGFyYW0gdmFsIC0gaXNPcGVuL2lzVGltZU9wZW4gaXMgc2V0IGJhc2VkIG9uIHRoZSB0aW1lcGlja2VyIHBvcHVwIGlzIG9wZW4vY2xvc2VkXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRJc1RpbWVPcGVuKHZhbDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnN0YXR1cy5pc29wZW4gPSB2YWw7XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIGV2ZW50IGlzIHJlZ2lzdGVyZWQgZnJvbSB0aGUgdGVtcGxhdGUsIFByZXZlbnQgdGhlIGZyYW1ld29yayBmcm9tIHJlZ2lzdGVyaW5nIG9uZSBtb3JlIGV2ZW50XG4gICAgcHJvdGVjdGVkIGhhbmRsZUV2ZW50KG5vZGU6IEhUTUxFbGVtZW50LCBldmVudE5hbWU6IHN0cmluZywgZXZlbnRDYWxsYmFjazogRnVuY3Rpb24sIGxvY2FsczogYW55KSB7XG4gICAgICAgIGlmICghaW5jbHVkZXMoWydibHVyJywgJ2ZvY3VzJywgJ2NoYW5nZScsICdjbGljayddLCBldmVudE5hbWUpKSB7XG4gICAgICAgICAgICBzdXBlci5oYW5kbGVFdmVudChub2RlLCBldmVudE5hbWUsIGV2ZW50Q2FsbGJhY2ssIGxvY2Fscyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGlkZVRpbWVwaWNrZXJEcm9wZG93bigpIHtcbiAgICAgICAgdGhpcy5pbnZva2VPblRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5zdGF0dXMuaXNvcGVuID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmRlcmVnaXN0ZXJFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICB0aGlzLmRlcmVnaXN0ZXJFdmVudExpc3RlbmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVLZXl1cExpc3RlbmVyKCk7XG4gICAgICAgIGNvbnN0IHBhcmVudEVsID0gJCh0aGlzLm5hdGl2ZUVsZW1lbnQpLmNsb3Nlc3QoJy5hcHAtY29tcG9zaXRlLXdpZGdldC5jYXB0aW9uLWZsb2F0aW5nJyk7XG4gICAgICAgIGlmIChwYXJlbnRFbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFwcC5ub3RpZnkoJ2NhcHRpb25Qb3NpdGlvbkFuaW1hdGUnLCB7IGRpc3BsYXlWYWw6IHRoaXMuZGlzcGxheVZhbHVlLCBuYXRpdmVFbDogcGFyZW50RWwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ibHVyRGF0ZUlucHV0KHRydWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZChldmVudCkge1xuICAgICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRlcmVkRGF0ZSA9ICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCdpbnB1dCcpLnZhbCgpO1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsID0gZ2V0TmF0aXZlRGF0ZU9iamVjdChlbnRlcmVkRGF0ZSwgeyBtZXJpZGlhbnM6IHRoaXMubWVyaWRpYW5zLCBwYXR0ZXJuOiB0aGlzLmxvYWROYXRpdmVEYXRlSW5wdXQgPyB0aGlzLm91dHB1dGZvcm1hdCA6IHVuZGVmaW5lZCwgaXNOYXRpdmVQaWNrZXI6IHRoaXMubG9hZE5hdGl2ZURhdGVJbnB1dCB9KTtcbiAgICAgICAgICAgIGlmICghdGhpcy5mb3JtYXRWYWxpZGF0aW9uKG5ld1ZhbCwgZW50ZXJlZERhdGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kIHRvIGFkZCBjc3MgY2xhc3MgZm9yIGRyb3Bkb3duIHdoaWxlIG9wZW5pbmcgdGhlIHRpbWUgZHJvcGRvd25cbiAgICAgKi9cbiAgICBwdWJsaWMgb25TaG93bigpIHtcbiAgICAgICAgY29uc3QgdHBFbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RpbWVwaWNrZXInKTtcbiAgICAgICAgZm9yRWFjaCh0cEVsZW1lbnRzLCBlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudCwgJ2FwcC1kYXRldGltZScsIHRydWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuYnNEcm9wZG93biAmJiAodGhpcy50aW1lTm90SW5SYW5nZSB8fCB0aGlzLmludmFsaWREYXRlVGltZUZvcm1hdCkpIHtcbiAgICAgICAgICAgIHRoaXMuYnNUaW1lVmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9jdXNUaW1lUGlja2VyUG9wb3Zlcih0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kVGltZVBpY2tlcktleWJvYXJkRXZlbnRzKCk7XG4gICAgICAgIGFkanVzdENvbnRhaW5lclBvc2l0aW9uKCQoJ2JzLWRyb3Bkb3duLWNvbnRhaW5lcicpLCB0aGlzLm5hdGl2ZUVsZW1lbnQsIHRoaXMuYnNEcm9wZG93bi5fZHJvcGRvd24sICQoJ2JzLWRyb3Bkb3duLWNvbnRhaW5lciAuZHJvcGRvd24tbWVudScpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXNzaWduTW9kZWwoKSB7XG4gICAgICAgIGlmICghdGhpcy5kaXNwbGF5SW5wdXRFbGVtKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlJbnB1dEVsZW0gPSB0aGlzLmdldE1vYmlsZUlucHV0KCk7XG4gICAgICAgIH1cbiAgICAgICAgKHRoaXMuZGlzcGxheUlucHV0RWxlbSBhcyBhbnkpLnZhbHVlID0gZ2V0KHRoaXMsICduYXRpdmVEaXNwbGF5VmFsdWUnKTtcbiAgICB9XG59XG4iLCI8ZGl2IGRyb3Bkb3duIFtpc09wZW5dPVwic3RhdHVzLmlzb3BlblwiIChvblNob3duKT1cIm9uU2hvd24oKVwiIChvbkhpZGRlbik9XCJoaWRlVGltZXBpY2tlckRyb3Bkb3duKClcIiBbY29udGFpbmVyXT1cIidib2R5J1wiIHN0eWxlPVwiZGlzcGxheTogaW5oZXJpdFwiPlxuICA8aW5wdXQgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhbGFiZWxcIiBjbGFzcz1cImZvcm0tY29udHJvbCBhcHAtdGV4dGJveCBkaXNwbGF5LWlucHV0XCJcbiAgICBmb2N1cy10YXJnZXRcbiAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgIFtuYW1lXT1cIm5hbWVcIlxuICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICByb2xlPVwidGltZXJcIlxuICAgIFt2YWx1ZV09XCJkaXNwbGF5VmFsdWVcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCByZWFkb25seSB8fCBpc0N1cnJlbnRUaW1lXCJcbiAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXG4gICAgW2F0dHIucGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIFthdHRyLmFjY2Vzc2tleV09XCJzaG9ydGN1dGtleVwiXG4gICAgW2F0dHIuYXJpYS1hdG9taWNdPVwiaXNDdXJyZW50VGltZSA/ICd0cnVlJyA6ICdmYWxzZSdcIlxuICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgW3JlYWRPbmx5XT1cImlzUmVhZE9ubHlcIlxuICAgIChjbGljayk9XCJ0b2dnbGVEcm9wZG93bigkZXZlbnQsIHRydWUpXCJcbiAgICAoZm9jdXMpPVwib25EYXRlVGltZUlucHV0Rm9jdXMoKTsgaW52b2tlT25Gb2N1cygkZXZlbnQpO1wiXG4gICAgKGJsdXIpPVwib25JbnB1dEJsdXIoJGV2ZW50KVwiXG4gICAgKGNoYW5nZSk9XCJvbkRpc3BsYXlUaW1lQ2hhbmdlKCRldmVudClcIlxuICAgIChrZXlkb3duKT1cInRoaXMuX3RyaWdnZXJlZEJ5VXNlciA9IHRydWU7IG9uRGlzcGxheUtleWRvd24oJGV2ZW50KVwiPlxuICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0biBkcm9wZG93bi10b2dnbGVcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tZGF0ZVwiIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCByZWFkb25seSB8fCBpc0N1cnJlbnRUaW1lXCIgYXJpYS1sYWJlbD1cIlNlbGVjdCB0aW1lXCIgYXJpYS1oYXNwb3B1cD1cInRydWVcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oJGV2ZW50LCBmYWxzZSlcIj48aSBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImFwcC1pY29uIHdtLXNsLWwgc2wtdGltZVwiPjwvaT48L2J1dHRvbj5cbiAgPC9zcGFuPlxuICA8ZGl2ICpkcm9wZG93bk1lbnUgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgKGNsaWNrKT1cInByZXZlbnRUcENsb3NlKCRldmVudClcIj5cbiAgICA8dGltZXBpY2tlciBjbGFzcz1cIm1vZGVsLWhvbGRlclwiXG4gICAgICBbc2hvd01lcmlkaWFuXT1cImlzbWVyaWRpYW5cIlxuICAgICAgW3JlYWRvbmx5SW5wdXRdPVwiaXNEaXNhYmxlZFwiXG4gICAgICBbKG5nTW9kZWwpXT1cImJzVGltZVZhbHVlXCJcbiAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHJlYWRvbmx5IHx8IGlzQ3VycmVudFRpbWVcIlxuICAgICAgW21pbl09XCJtaW5UaW1lXCJcbiAgICAgIFttYXhdPVwibWF4VGltZVwiXG4gICAgICBbaG91clN0ZXBdPVwiaG91cnN0ZXBcIlxuICAgICAgW21pbnV0ZVN0ZXBdPVwibWludXRlc3RlcFwiXG4gICAgICBbc2Vjb25kc1N0ZXBdPVwic2Vjb25kc3N0ZXBcIlxuICAgICAgW21vdXNld2hlZWxdPVwidHJ1ZVwiXG4gICAgICBbYXJyb3drZXlzXT1cInRydWVcIlxuICAgICAgKGlzVmFsaWQpPVwiaXNWYWxpZCgkZXZlbnQpXCJcbiAgICAgIFtzaG93U2Vjb25kc109XCJzaG93c2Vjb25kc1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uVGltZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ3Nob3didXR0b25zJzogc2hvd2FtcG1idXR0b25zIH1cIj48L3RpbWVwaWNrZXI+XG4gICAgICBAaWYgKGlzbWVyaWRpYW4gJiYgc2hvd2FtcG1idXR0b25zKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFtcG0tdG9nZ2xlIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJtZXJpZGlhbi1idG4gbWItMVwiIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZSBidG4tc2Vjb25kYXJ5JzogZ2V0UGVyaW9kKCkgPT09ICdBTScgfVwiIChjbGljayk9XCJzZXRQZXJpb2QoJ0FNJylcIj5BTTwvYnV0dG9uPjxicj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1lcmlkaWFuLWJ0blwiIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZSBidG4tc2Vjb25kYXJ5JzogZ2V0UGVyaW9kKCkgPT09ICdQTScgfVwiIChjbGljayk9XCJzZXRQZXJpb2QoJ1BNJylcIj5QTTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgfVxuICA8L2Rpdj5cbjwvZGl2PlxuQGlmIChsb2FkTmF0aXZlRGF0ZUlucHV0KSB7XG4gIDx3bS1kYXRldGltZXBpY2tlclxuICAgIGRhdGVUaW1lUGlja2VyXG4gICAgbW9kZT1cIlRJTUVcIlxuICAgIFttaW5UaW1lXT1cIm1pblRpbWVcIlxuICAgIFttYXhUaW1lXT1cIm1heFRpbWVcIlxuICAgIFtwbGFjZW1lbnRdPVwibW9kYWxcIlxuICAgIFtkaXNwbGF5Rm9ybWF0XT1cInRpbWVwYXR0ZXJuXCJcbiAgICBbdmFsdWVdPVwiYnNUaW1lVmFsdWVcIlxuICAgIChjaGFuZ2UpPVwib25UaW1lQ2hhbmdlKCRldmVudClcIj5cbiAgPC93bS1kYXRldGltZXBpY2tlcj5cbiAgPGRpdiBjbGFzcz1cIm1vYmlsZS1pbnB1dCBtb2JpbGUtZGF0ZXBpY2tlci1jb250YWluZXJcIlxuICAgIHRhYmluZGV4PVwiMTAwMDAwMFwiXG4gICAgKGNsaWNrKT1cIiEoZGlzYWJsZWQgfHwgcmVhZG9ubHkpICYmIHNob3dEYXRlUGlja2VyTW9kYWwoYnNUaW1lVmFsdWUpXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRpc3BsYXlWYWx1ZSA/ICdDaGFuZ2UgdGltZSAgJyArIGRpc3BsYXlWYWx1ZSA6IGFyaWFsYWJlbCB8fCAnU2VsZWN0IHRpbWUnXCJcbiAgICAoZm9jdXMpPVwib25EYXRlVGltZUlucHV0Rm9jdXModHJ1ZSk7IGludm9rZU9uRm9jdXMoJGV2ZW50KTsgYXNzaWduTW9kZWwoKVwiXG4gICAgKGJsdXIpPVwib25EYXRlVGltZUlucHV0Qmx1cigpOyBpbnZva2VPblRvdWNoZWQoJGV2ZW50KVwiXG4gICAgcm9sZT1cImJ1dHRvblwiPlxuICA8L2Rpdj5cbn1cbiJdfQ==
432
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvaW5wdXQvZXBvY2gvc3JjL3RpbWUvdGltZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvaW5wdXQvZXBvY2gvc3JjL3RpbWUvdGltZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQWEsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RSxPQUFPLEVBQ0gsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixRQUFRLEVBQ1IseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2QixHQUFHLEVBQ0gsV0FBVyxFQUVYLGNBQWMsRUFDZCx3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDdEIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU1RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUs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QUFhLEVBQUUsSUFBSSxDQUFDO29CQUM3QyxrQkFBa0IsZUFBZTtvQkFDakMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUMsbUJBQW1CLENBQUMsRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUU7aUJBQzlGOztzQkFtR0ksTUFBTTt1QkFBQyxrQkFBa0I7O3NCQUFHLFFBQVE7O2tGQWpHaEMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdtQ29tcG9uZW50c01vZHVsZSB9IGZyb20gXCJAd20vY29tcG9uZW50cy9iYXNlXCI7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGVUaW1lUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZS10aW1lL2RhdGUtdGltZS1waWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgSW5qZWN0b3IsIE5nWm9uZSwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUaW1lcGlja2VyQ29uZmlnLCBUaW1lcGlja2VyTW9kdWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC90aW1lcGlja2VyJztcbmltcG9ydCB7XG4gICAgJGFwcERpZ2VzdCxcbiAgICBBYnN0cmFjdEkxOG5TZXJ2aWNlLFxuICAgIGFkZENsYXNzLFxuICAgIGFkZEV2ZW50TGlzdGVuZXJPbkVsZW1lbnQsXG4gICAgYWRqdXN0Q29udGFpbmVyUG9zaXRpb24sXG4gICAgQXBwLFxuICAgIEFwcERlZmF1bHRzLFxuICAgIEVWRU5UX0xJRkUsXG4gICAgRm9ybVdpZGdldFR5cGUsXG4gICAgZ2V0RGlzcGxheURhdGVUaW1lRm9ybWF0LFxuICAgIGdldEZvcm1hdHRlZERhdGUsXG4gICAgZ2V0TW9tZW50TG9jYWxlT2JqZWN0LFxuICAgIGdldE5hdGl2ZURhdGVPYmplY3Rcbn0gZnJvbSAnQHdtL2NvcmUnO1xuaW1wb3J0IHsgcHJvdmlkZUFzLCBwcm92aWRlQXNXaWRnZXRSZWYsIHN0eWxlciB9IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuXG5pbXBvcnQgeyBCYXNlRGF0ZVRpbWVDb21wb25lbnQsIGdldFRpbWVwaWNrZXJDb25maWcgfSBmcm9tICcuLy4uL2Jhc2UtZGF0ZS10aW1lLmNvbXBvbmVudCc7XG5pbXBvcnQgeyByZWdpc3RlclByb3BzIH0gZnJvbSAnLi90aW1lLnByb3BzJztcbmltcG9ydCB7IGZvckVhY2gsIGdldCwgaW5jbHVkZXMgfSBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgeyBCc0Ryb3Bkb3duTW9kdWxlIH0gZnJvbSBcIm5neC1ib290c3RyYXAvZHJvcGRvd25cIjtcblxuZGVjbGFyZSBjb25zdCAkO1xuaW1wb3J0ICogYXMgbW9tZW50TGliICBmcm9tICdtb21lbnQnO1xuY29uc3QgbW9tZW50ID0gbW9tZW50TGliLmRlZmF1bHQgfHwgd2luZG93Wydtb21lbnQnXTtcblxuY29uc3QgQ1VSUkVOVF9USU1FID0gJ0NVUlJFTlRfVElNRSc7XG5jb25zdCBERUZBVUxUX0NMUyA9ICdpbnB1dC1ncm91cCBhcHAtdGltZWlucHV0JztcbmNvbnN0IFdJREdFVF9DT05GSUcgPSB7IHdpZGdldFR5cGU6ICd3bS10aW1lJywgaG9zdENsYXNzOiBERUZBVUxUX0NMUyB9O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtXbUNvbXBvbmVudHNNb2R1bGUsIEZvcm1zTW9kdWxlLCBEYXRlVGltZVBpY2tlckNvbXBvbmVudCwgQnNEcm9wZG93bk1vZHVsZSwgVGltZXBpY2tlck1vZHVsZSxDb21tb25Nb2R1bGVdLFxuICAgIHNlbGVjdG9yOiAnW3dtVGltZV0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90aW1lLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgcHJvdmlkZUFzKFRpbWVDb21wb25lbnQsIE5HX1ZBTFVFX0FDQ0VTU09SLCB0cnVlKSxcbiAgICAgICAgcHJvdmlkZUFzKFRpbWVDb21wb25lbnQsIE5HX1ZBTElEQVRPUlMsIHRydWUpLFxuICAgICAgICBwcm92aWRlQXNXaWRnZXRSZWYoVGltZUNvbXBvbmVudCksXG4gICAgICAgIHsgcHJvdmlkZTogVGltZXBpY2tlckNvbmZpZywgZGVwczogW0Fic3RyYWN0STE4blNlcnZpY2VdLCB1c2VGYWN0b3J5OiBnZXRUaW1lcGlja2VyQ29uZmlnIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIFRpbWVDb21wb25lbnQgZXh0ZW5kcyBCYXNlRGF0ZVRpbWVDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHN0YXRpYyBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlclByb3BzKCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBzZXRzIHRoZSBkaXNwbGF5IHBhdHRlcm4gb2YgdGhlIHRpbWUgc2VsZWN0ZWRcbiAgICAgKi9cbiAgICB0aW1lcGF0dGVybjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBzZXRzIHRoZSBvdXRwdXQgZm9ybWF0IGZvciB0aGUgc2VsZWN0ZWQgdGltZSBkYXRhdmFsdWVcbiAgICAgKi9cbiAgICBvdXRwdXRmb3JtYXQ6IHN0cmluZztcblxuICAgIHB1YmxpYyBzaG93ZHJvcGRvd25vbjogc3RyaW5nO1xuICAgIHB1YmxpYyBtaW50aW1lO1xuICAgIHB1YmxpYyBtYXh0aW1lO1xuICAgIHB1YmxpYyBoaW50OiBzdHJpbmc7XG4gICAgcHVibGljIGFyaWFsYWJlbDogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBkZXJlZ2lzdGVyRXZlbnRMaXN0ZW5lcjtcbiAgICBwcml2YXRlIGFwcDogQXBwO1xuICAgIHByaXZhdGUgZGlzcGxheUlucHV0RWxlbTogSFRNTEVsZW1lbnQ7XG5cbiAgICBnZXQgdGltZXN0YW1wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ic1RpbWVWYWx1ZSA/IHRoaXMuYnNUaW1lVmFsdWUudmFsdWVPZigpIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBnZXQgZGF0YXZhbHVlKCk6IGFueSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ3VycmVudFRpbWUgJiYgIXRoaXMuYnNUaW1lVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBDVVJSRU5UX1RJTUU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldEZvcm1hdHRlZERhdGUodGhpcy5kYXRlUGlwZSwgdGhpcy5ic1RpbWVWYWx1ZSwgdGhpcy5vdXRwdXRmb3JtYXQsIHRoaXMudGltZVpvbmUsIG51bGwsIG51bGwsIHRoaXMpIHx8ICcnO1xuICAgIH1cblxuICAgIC8qKlRvZG9bU2h1YmhhbV06IG5lZWRzIHRvIGJlIHJlZGVmaW5lZFxuICAgICAqIFRoaXMgcHJvcGVydHkgc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHRpbWUgc2VsZWN0aW9uXG4gICAgICovXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHNldCBkYXRhdmFsdWUobmV3VmFsOiBhbnkpIHtcbiAgICAgICAgaWYgKG5ld1ZhbCkge1xuICAgICAgICAgICAgaWYgKG5ld1ZhbCA9PT0gQ1VSUkVOVF9USU1FKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0N1cnJlbnRUaW1lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRpbWVJbnRlcnZhbCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVGltZUludGVydmFsKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ic1RpbWVWYWx1ZSA9IGdldE5hdGl2ZURhdGVPYmplY3QobmV3VmFsLCB7IHBhdHRlcm46IHRoaXMubG9hZE5hdGl2ZURhdGVJbnB1dCA/IHRoaXMub3V0cHV0Zm9ybWF0IDogdW5kZWZpbmVkLCBpc05hdGl2ZVBpY2tlcjogdGhpcy5sb2FkTmF0aXZlRGF0ZUlucHV0IH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNDdXJyZW50VGltZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMubWludGltZU1heHRpbWVWYWxpZGF0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJzVGltZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVJbnRlcnZhbCgpO1xuICAgICAgICAgICAgdGhpcy5pc0N1cnJlbnRUaW1lID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnZva2VPbkNoYW5nZSh0aGlzLmRhdGF2YWx1ZSk7XG4gICAgICAgICRhcHBEaWdlc3QoKTtcbiAgICB9XG5cbiAgICBnZXQgZGlzcGxheVZhbHVlKCkge1xuICAgICAgICBjb25zdCBkaXNwbGF5ID0gZ2V0Rm9ybWF0dGVkRGF0ZSh0aGlzLmRhdGVQaXBlLCB0aGlzLmJzVGltZVZhbHVlLCB0aGlzLnRpbWVwYXR0ZXJuLCB0aGlzLnRpbWVab25lLCBudWxsLCBudWxsLCB0aGlzKSB8fCAnJztcbiAgICAgICAgcmV0dXJuIHRoaXMuc2FmZVJlcGxhY2VNZXJpZGlhbnMoZGlzcGxheSk7XG4gICAgfVxuXG4gICAgZ2V0IG5hdGl2ZURpc3BsYXlWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIGdldEZvcm1hdHRlZERhdGUodGhpcy5kYXRlUGlwZSwgdGhpcy5ic1RpbWVWYWx1ZSwgJ0hIOm1tOnNzJywgdGhpcy50aW1lWm9uZSwgbnVsbCwgbnVsbCwgdGhpcykgfHwgJyc7XG4gICAgfVxuXG4gICAgLyogSW50ZXJuYWwgcHJvcGVydHkgdG8gaGF2ZSBhIGZsYWcgdG8gY2hlY2sgdGhlIGdpdmVuIGRhdGF2YWx1ZSBpcyBvZiBDdXJyZW50IHRpbWUqL1xuICAgIHB1YmxpYyBpc0N1cnJlbnRUaW1lOiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSB0aW1laW50ZXJ2YWw6IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgcHJvcGVydHkgdXNlZCB0byBtYXAgaXQgdG8gdGhlIHdpZGdldFxuICAgICAqL1xuICAgIHByaXZhdGUgbWluVGltZTogRGF0ZTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgcHJvcGVydHkgdXNlZCB0byBtYXAgaXQgdG8gdGhlIHdpZGdldFxuICAgICAqL1xuICAgIHByaXZhdGUgbWF4VGltZTogRGF0ZTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgcHJvcGVydHkgdXNlZCB0byB0b2dnbGUgdGhlIHRpbWVwaWNrZXIgZHJvcGRvd25cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdHVzID0geyBpc29wZW46IGZhbHNlIH07XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIHByb3BlcnR5IHVzZWQgdG8gbWFwIHRoZSBtYWluIG1vZGVsIHRvIHRoZSB0aW1lIHdpZGdldFxuICAgICAqL1xuICAgIHByaXZhdGUgYnNUaW1lVmFsdWU6IERhdGU7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgaW5qOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgcHJpdmF0ZSBhcHBEZWZhdWx0czogQXBwRGVmYXVsdHMsXG4gICAgICAgIGFwcDogQXBwLFxuICAgICAgICBASW5qZWN0KCdFWFBMSUNJVF9DT05URVhUJykgQE9wdGlvbmFsKCkgZXhwbGljaXRDb250ZXh0OiBhbnlcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaW5qLCBXSURHRVRfQ09ORklHLCBleHBsaWNpdENvbnRleHQpO1xuXG4gICAgICAgIHN0eWxlcih0aGlzLm5hdGl2ZUVsZW1lbnQsIHRoaXMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVzdHJveSB0aGUgdGltZXIgb25jZSB0aGUgZGF0ZSB3aWRnZXQgaXMgZ29uZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWdpc3RlckRlc3Ryb3lMaXN0ZW5lcigoKSA9PiB0aGlzLmNsZWFyVGltZUludGVydmFsKCkpO1xuXG4gICAgICAgIHRoaXMudGltZXBhdHRlcm4gPSB0aGlzLmFwcERlZmF1bHRzLnRpbWVGb3JtYXQgfHwgZ2V0RGlzcGxheURhdGVUaW1lRm9ybWF0KEZvcm1XaWRnZXRUeXBlLlRJTUUpO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1hdCgndGltZXBhdHRlcm4nKTtcbiAgICAgICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgfVxuXG4gICAgb25Qcm9wZXJ0eUNoYW5nZShrZXk6IHN0cmluZywgbnY6IGFueSwgb3Y/OiBhbnkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ3RhYmluZGV4Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09ICd0aW1lcGF0dGVybicpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybWF0KCd0aW1lcGF0dGVybicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09ICdtaW50aW1lJykge1xuICAgICAgICAgICAgdGhpcy5taW5UaW1lID0gZ2V0TmF0aXZlRGF0ZU9iamVjdChudiwgeyBwYXR0ZXJuOiB0aGlzLmxvYWROYXRpdmVEYXRlSW5wdXQgPyB0aGlzLm91dHB1dGZvcm1hdCA6IHVuZGVmaW5lZCwgaXNOYXRpdmVQaWNrZXI6IHRoaXMubG9hZE5hdGl2ZURhdGVJbnB1dCB9KTsgLy8gVE9ETyBpdCBpcyBzdXBwb3NlZCB0byBiZSB0aW1lIGNvbnZlcnNpb24sIG5vdCB0byB0aGUgZGF5XG4gICAgICAgICAgICB0aGlzLm1pbnRpbWVNYXh0aW1lVmFsaWRhdGlvbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ21heHRpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLm1heFRpbWUgPSBnZXROYXRpdmVEYXRlT2JqZWN0KG52LCB7IHBhdHRlcm46IHRoaXMubG9hZE5hdGl2ZURhdGVJbnB1dCA/IHRoaXMub3V0cHV0Zm9ybWF0IDogdW5kZWZpbmVkLCBpc05hdGl2ZVBpY2tlcjogdGhpcy5sb2FkTmF0aXZlRGF0ZUlucHV0IH0pO1xuICAgICAgICAgICAgdGhpcy5taW50aW1lTWF4dGltZVZhbGlkYXRpb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0VmFsaWRhdGVUeXBlKG1pbiwgbWF4LCB2YWwpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZU5vdEluUmFuZ2UpIHtcbiAgICAgICAgICAgIGlmICh2YWwgPCBtaW4pIHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpLnZhbGlkYXRlVHlwZSA9ICdtaW50aW1lJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsID4gbWF4KSB7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgYW55KS52YWxpZGF0ZVR5cGUgPSAnbWF4dGltZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB1c2VkIHRvIHZhbGlkYXRlIG1pbnRpbWUgYW5kIG1heHRpbWVcbiAgICAgKi9cbiAgICBwcml2YXRlIG1pbnRpbWVNYXh0aW1lVmFsaWRhdGlvbigpIHtcbiAgICAgICAgdGhpcy50aW1lTm90SW5SYW5nZSA9IHRoaXMubWluVGltZSAmJiB0aGlzLm1heFRpbWUgJiYgKHRoaXMuYnNUaW1lVmFsdWUgPCB0aGlzLm1pblRpbWUgfHwgdGhpcy5ic1RpbWVWYWx1ZSA+IHRoaXMubWF4VGltZSk7XG4gICAgICAgIHRoaXMuc2V0VmFsaWRhdGVUeXBlKHRoaXMubWluVGltZSwgdGhpcy5tYXhUaW1lLCB0aGlzLmJzVGltZVZhbHVlKTtcbiAgICAgICAgdGhpcy5pbnZva2VPbkNoYW5nZSh0aGlzLmRhdGF2YWx1ZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QgdXNlZCB0byB0b2dnbGUgdGhlIGRyb3Bkb3duIG9mIHRoZSB0aW1lIHdpZGdldFxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVEcm9wZG93bigkZXZlbnQsIHNraXBGb2N1czogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmxvYWROYXRpdmVEYXRlSW5wdXQpIHtcbiAgICAgICAgICAgIC8vRml4ZXMgY2xpY2sgZXZlbnQgZ2V0dGluZyB0cmlnZ3JlZCB0d2ljZSBpbiBNb2JpbGUgZGV2aWNlcy5cbiAgICAgICAgICAgIGlmICghc2tpcEZvY3VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkRhdGVUaW1lSW5wdXRGb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgkZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdjbGljaycsIHsgJGV2ZW50OiAkZXZlbnQgfSk7XG4gICAgICAgICAgICAvL3RoaXMuZm9jdXNPbklucHV0RWwoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJGV2ZW50LnRhcmdldCAmJiAkKCRldmVudC50YXJnZXQpLmlzKCdpbnB1dCcpICYmICEodGhpcy5pc0Ryb3BEb3duRGlzcGxheUVuYWJsZWRPbklucHV0KHRoaXMuc2hvd2Ryb3Bkb3dub24pKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0YXR1cy5pc29wZW4gPSAhdGhpcy5zdGF0dXMuaXNvcGVuO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hZGRCb2R5Q2xpY2tMaXN0ZW5lcih0aGlzLnN0YXR1cy5pc29wZW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kIHVzZWQgdG8gUHJldmVudCB0aW1lIHBpY2tlciBjbG9zZSB3aGlsZSBjaGFuZ2luZyB0aW1lIHZhbHVlXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcmV2ZW50VHBDbG9zZSgkZXZlbnQpIHtcbiAgICAgICAgJGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb25zdCBwYXJlbnRFbCA9ICQodGhpcy5uYXRpdmVFbGVtZW50KS5jbG9zZXN0KCcuYXBwLWNvbXBvc2l0ZS13aWRnZXQuY2FwdGlvbi1mbG9hdGluZycpO1xuICAgICAgICBpZiAocGFyZW50RWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hcHAubm90aWZ5KCdjYXB0aW9uUG9zaXRpb25BbmltYXRlJywgeyBkaXNwbGF5VmFsOiB0aGlzLmRpc3BsYXlWYWx1ZSwgbmF0aXZlRWw6IHBhcmVudEVsIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRCb2R5Q2xpY2tMaXN0ZW5lcihza2lwTGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKCFza2lwTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBib2R5RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkVsZW1lbnQgPSAkKGJvZHlFbGVtZW50KS5maW5kKCc+YnMtZHJvcGRvd24tY29udGFpbmVyIC5kcm9wZG93bi1tZW51JykuZ2V0KDApO1xuICAgICAgICAgICAgdGhpcy5kZXJlZ2lzdGVyRXZlbnRMaXN0ZW5lciA9IGFkZEV2ZW50TGlzdGVuZXJPbkVsZW1lbnQoYm9keUVsZW1lbnQsIGRyb3Bkb3duRWxlbWVudCwgdGhpcy5uYXRpdmVFbGVtZW50LCAnY2xpY2snLCB0aGlzLmlzRHJvcERvd25EaXNwbGF5RW5hYmxlZE9uSW5wdXQodGhpcy5zaG93ZHJvcGRvd25vbiksICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cy5pc29wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIH0sIEVWRU5UX0xJRkUuT05DRSwgdHJ1ZSk7XG4gICAgICAgIH0sIDM1MCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QgdHJpZ2dlcmVkIHdoZW4gcHJlc3Npbmcga2V5IG9uIHRoZSB0aW1lIGlucHV0XG4gICAgICovXG4gICAgcHVibGljIG9uRGlzcGxheUtleWRvd24oZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEcm9wRG93bkRpc3BsYXlFbmFibGVkT25JbnB1dCh0aGlzLnNob3dkcm9wZG93bm9uKSkge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlRHJvcGRvd24oZXZlbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVUaW1lcGlja2VyRHJvcGRvd24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZVRpbWVwaWNrZXJEcm9wZG93bigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QgdHJpZ2dlcmVkIHdoZW4gdGhlIHRpbWUgaW5wdXQgY2hhbmdlc1xuICAgICAqL1xuICAgIG9uRGlzcGxheVRpbWVDaGFuZ2UoJGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbCA9IGdldE5hdGl2ZURhdGVPYmplY3QoJGV2ZW50LnRhcmdldC52YWx1ZT8ucmVwbGFjZSh0aGlzLmFtLCB0aGlzLm1lcmlkaWFuc1swXSk/LnJlcGxhY2UodGhpcy5wbSwgdGhpcy5tZXJpZGlhbnNbMV0pLCB7IG1lcmlkaWFuczogdGhpcy5tZXJpZGlhbnMsIHBhdHRlcm46IHRoaXMubG9hZE5hdGl2ZURhdGVJbnB1dCA/IHRoaXMub3V0cHV0Zm9ybWF0IDogdW5kZWZpbmVkLCBpc05hdGl2ZVBpY2tlcjogdGhpcy5sb2FkTmF0aXZlRGF0ZUlucHV0IH0pO1xuICAgICAgICAvLyB0aW1lIHBhdHRlcm4gdmFsaWRhdGlvblxuICAgICAgICAvLyBpZiBpbnZhbGlkIHBhdHRlcm4gaXMgZW50ZXJlZCwgZGV2aWNlIGlzIHNob3dpbmcgYW4gZXJyb3IuXG4gICAgICAgIGlmICghdGhpcy5mb3JtYXRWYWxpZGF0aW9uKG5ld1ZhbCwgJGV2ZW50LnRhcmdldC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmludmFsaWREYXRlVGltZUZvcm1hdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uVGltZUNoYW5nZShuZXdWYWwpO1xuICAgIH1cblxuICAgIG9uSW5wdXRCbHVyKCRldmVudCkge1xuICAgICAgICBpZiAoISQoJGV2ZW50LnJlbGF0ZWRUYXJnZXQpLmhhc0NsYXNzKCdicy10aW1lcGlja2VyLWZpZWxkJykpIHtcbiAgICAgICAgICAgIHRoaXMuaW52b2tlT25Ub3VjaGVkKCk7XG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2JsdXInLCB7ICRldmVudCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kIHVzZWQgdG8gZXhlY3V0ZSB0aGUgb24gdGltZSBjaGFuZ2UgZnVuY3Rpb25hbGl0eVxuICAgICAqL1xuICAgIHByaXZhdGUgb25UaW1lQ2hhbmdlKG5ld1ZhbCwgaXNOYXRpdmVQaWNrZXI/OiBib29sZWFuKSB7XG4gICAgICAgIGxldCB0aW1lVmFsdWUsXG4gICAgICAgICAgICB0aW1lSW5wdXRWYWx1ZSxcbiAgICAgICAgICAgIG1pblRpbWVNZXJpZGlhbixcbiAgICAgICAgICAgIG1heFRpbWVNZXJpZGlhbjtcbiAgICAgICAgLy8gRm9yIG5hdGl2ZVBpY2tlciwgbmV3VmFsIGlzIGV2ZW50LCBnZXQgdGhlIGRhdGVvYmplY3QgZnJvbSB0aGUgZXZlbnQuXG4gICAgICAgIGlmIChpc05hdGl2ZVBpY2tlcikge1xuICAgICAgICAgICAgbmV3VmFsID0gZ2V0TmF0aXZlRGF0ZU9iamVjdChuZXdWYWwudGFyZ2V0LnZhbHVlLCB7IHBhdHRlcm46IHRoaXMubG9hZE5hdGl2ZURhdGVJbnB1dCA/IHRoaXMub3V0cHV0Zm9ybWF0IDogdW5kZWZpbmVkLCBpc05hdGl2ZVBpY2tlcjogdGhpcy5sb2FkTmF0aXZlRGF0ZUlucHV0IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdWYWwpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBuZXdWYWwgaXMgdmFsaWQgYnV0IG5vdCBpbiB0aGUgZ2l2ZW4gcmFuZ2UgdGhlbiBoaWdobGlnaHQgdGhlIGlucHV0IGZpZWxkXG4gICAgICAgICAgICB0aGlzLnRpbWVOb3RJblJhbmdlID0gdGhpcy5taW5UaW1lICYmIHRoaXMubWF4VGltZSAmJiAobmV3VmFsIDwgdGhpcy5taW5UaW1lIHx8IG5ld1ZhbCA+IHRoaXMubWF4VGltZSk7XG4gICAgICAgICAgICB0aGlzLnNldFZhbGlkYXRlVHlwZSh0aGlzLm1pblRpbWUsIHRoaXMubWF4VGltZSwgbmV3VmFsKTtcbiAgICAgICAgICAgIGlmKCF0aGlzLnRpbWVOb3RJblJhbmdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ic1RpbWVWYWx1ZSA9IG5ld1ZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBzb21ldGltZXMgbGlicmFyeSBpcyBub3QgcmV0dXJuaW5nIHRoZSBjb3JyZWN0IHZhbHVlIHdoZW4gdGhlIG1pbiBhbmQgbWF4IHRpbWUgYXJlIGdpdmVuLCBkaXNwbGF5aW5nIHRoZSBkYXRhdmFsdWUgYmFzZWQgb24gdGhlIHZhbHVlIGdpdmVuIGJ5IHRoZSB1c2VyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYnNUaW1lUGlja2VyICYmIHRoaXMuYnNUaW1lUGlja2VyLm1pbiAmJiB0aGlzLmJzVGltZVBpY2tlci5tYXgpIHtcbiAgICAgICAgICAgIG1pblRpbWVNZXJpZGlhbiA9IG1vbWVudChuZXcgRGF0ZSh0aGlzLmJzVGltZVBpY2tlci5taW4pKS5mb3JtYXQoJ0EnKTtcbiAgICAgICAgICAgIG1heFRpbWVNZXJpZGlhbiA9IG1vbWVudChuZXcgRGF0ZSh0aGlzLmJzVGltZVBpY2tlci5tYXgpKS5mb3JtYXQoJ0EnKTtcbiAgICAgICAgICAgIHRpbWVWYWx1ZSA9IHRoaXMuYnNUaW1lUGlja2VyLmhvdXJzICsgJzonICsgKHRoaXMuYnNUaW1lUGlja2VyLm1pbnV0ZXMgfHwgMCkgKyAnOicgKyAodGhpcy5ic1RpbWVQaWNrZXIuc2Vjb25kcyB8fCAwKSArICh0aGlzLmJzVGltZVBpY2tlci5zaG93TWVyaWRpYW4gPyAoJyAnICsgbWluVGltZU1lcmlkaWFuKSA6ICcnKTtcbiAgICAgICAgICAgIHRpbWVJbnB1dFZhbHVlID0gZ2V0TmF0aXZlRGF0ZU9iamVjdCh0aW1lVmFsdWUsIHsgcGF0dGVybjogdGhpcy5sb2FkTmF0aXZlRGF0ZUlucHV0ID8gdGhpcy5vdXRwdXRmb3JtYXQgOiB1bmRlZmluZWQsIGlzTmF0aXZlUGlja2VyOiB0aGlzLmxvYWROYXRpdmVEYXRlSW5wdXQgfSk7XG4gICAgICAgICAgICB0aGlzLmJzVGltZVBpY2tlci5tZXJpZGlhbiA9IG1pblRpbWVNZXJpZGlhbj8ucmVwbGFjZSh0aGlzLm1lcmlkaWFuc1swXSwgdGhpcy5hbSk/LnJlcGxhY2UodGhpcy5tZXJpZGlhbnNbMV0sIHRoaXMucG0pO1xuICAgICAgICAgICAgdGhpcy50aW1lTm90SW5SYW5nZSA9ICB0aGlzLmJzVGltZVBpY2tlci5taW4gPiB0aW1lSW5wdXRWYWx1ZSB8fCB0aGlzLmJzVGltZVBpY2tlci5tYXggPCB0aW1lSW5wdXRWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMudGltZU5vdEluUmFuZ2UgfHwgdGhpcy5pbnZhbGlkRGF0ZVRpbWVGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJzVGltZVZhbHVlID0gdGhpcy5nZXRQcmV2RGF0YVZhbHVlKCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVTdHIgPSBnZXRGb3JtYXR0ZWREYXRlKHRoaXMuZGF0ZVBpcGUsIHRpbWVWYWx1ZSwgdGhpcy50aW1lcGF0dGVybiwgdGhpcy50aW1lWm9uZSwgbnVsbCwgbnVsbCwgdGhpcykgfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcuZGlzcGxheS1pbnB1dCcpLnZhbCh0aGlzLnNhZmVSZXBsYWNlTWVyaWRpYW5zKHRpbWVTdHIpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0VmFsaWRhdGVUeXBlKHRoaXMuYnNUaW1lUGlja2VyLm1pbiwgdGhpcy5ic1RpbWVQaWNrZXIubWF4LCB0aW1lSW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMudGltZU5vdEluUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJzVGltZVZhbHVlID0gdGltZUlucHV0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIFVJIGRpc3BsYXkgaWYgdmFsdWUgaGFzbid0IGNoYW5nZWRcbiAgICAgICAgaWYgKCF0aGlzLnRpbWVOb3RJblJhbmdlICYmIHRoaXMuZGF0YXZhbHVlID09PSB0aGlzLmdldFByZXZEYXRhVmFsdWUoKSkge1xuICAgICAgICAgICAgY29uc3QgZGlzcGxheVRpbWUgPSBnZXRGb3JtYXR0ZWREYXRlKHRoaXMuZGF0ZVBpcGUsIHRoaXMuZGF0YXZhbHVlLCB0aGlzLnRpbWVwYXR0ZXJuLCB0aGlzLnRpbWVab25lLCBudWxsLCBudWxsLCB0aGlzKSB8fCAnJztcbiAgICAgICAgICAgICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcuZGlzcGxheS1pbnB1dCcpLnZhbCh0aGlzLnNhZmVSZXBsYWNlTWVyaWRpYW5zKGRpc3BsYXlUaW1lKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnZva2VPblRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5pbnZva2VPbkNoYW5nZSh0aGlzLmRhdGF2YWx1ZSwge30sIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kIHVzZWQgdG8gbWFpbnRhaW4gYSB0aW1lIGludGVydmFsIHRvIHVwZGF0ZSB0aGUgdGltZSBtb2RlbCB3aGVuIHRoZSBkYXRhIHZhbHVlIGlzIHNldCB0byBDVVJSRU5UX1RJTUVcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldFRpbWVJbnRlcnZhbCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZWludGVydmFsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aW1laW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSB0aGlzLnRpbWVab25lID8gZ2V0TW9tZW50TG9jYWxlT2JqZWN0KHRoaXMudGltZVpvbmUpIDogbmV3IERhdGUoKTtcbiAgICAgICAgICAgIG5vdy5zZXRTZWNvbmRzKG5vdy5nZXRTZWNvbmRzKCkgKyAxKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YXZhbHVlID0gQ1VSUkVOVF9USU1FO1xuICAgICAgICAgICAgdGhpcy5vblRpbWVDaGFuZ2Uobm93KTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QgdXNlZCB0byBjbGVhciB0aGUgdGltZSBpbnRlcnZhbCBjcmVhdGVkXG4gICAgICovXG4gICAgcHJpdmF0ZSBjbGVhclRpbWVJbnRlcnZhbCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZWludGVydmFsKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMudGltZWludGVydmFsKTtcbiAgICAgICAgICAgIHRoaXMudGltZWludGVydmFsID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgdmFsdWUgaXNPcGVuL2lzVGltZU9wZW4gKGkuZSB3aGVuIGRhdGVwaWNrZXIgcG9wdXAgaXMgY2xvc2VkKSBiYXNlZCBvbiB3aWRnZXQgdHlwZShpLmUgIERhdGVUaW1lLCBUaW1lKVxuICAgICAqIEBwYXJhbSB2YWwgLSBpc09wZW4vaXNUaW1lT3BlbiBpcyBzZXQgYmFzZWQgb24gdGhlIHRpbWVwaWNrZXIgcG9wdXAgaXMgb3Blbi9jbG9zZWRcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldElzVGltZU9wZW4odmFsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzLmlzb3BlbiA9IHZhbDtcbiAgICB9XG5cbiAgICAvLyBDaGFuZ2UgZXZlbnQgaXMgcmVnaXN0ZXJlZCBmcm9tIHRoZSB0ZW1wbGF0ZSwgUHJldmVudCB0aGUgZnJhbWV3b3JrIGZyb20gcmVnaXN0ZXJpbmcgb25lIG1vcmUgZXZlbnRcbiAgICBwcm90ZWN0ZWQgaGFuZGxlRXZlbnQobm9kZTogSFRNTEVsZW1lbnQsIGV2ZW50TmFtZTogc3RyaW5nLCBldmVudENhbGxiYWNrOiBGdW5jdGlvbiwgbG9jYWxzOiBhbnkpIHtcbiAgICAgICAgaWYgKCFpbmNsdWRlcyhbJ2JsdXInLCAnZm9jdXMnLCAnY2hhbmdlJywgJ2NsaWNrJ10sIGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHN1cGVyLmhhbmRsZUV2ZW50KG5vZGUsIGV2ZW50TmFtZSwgZXZlbnRDYWxsYmFjaywgbG9jYWxzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoaWRlVGltZXBpY2tlckRyb3Bkb3duKCkge1xuICAgICAgICB0aGlzLmludm9rZU9uVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLnN0YXR1cy5pc29wZW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZGVyZWdpc3RlckV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZGVyZWdpc3RlckV2ZW50TGlzdGVuZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUtleXVwTGlzdGVuZXIoKTtcbiAgICAgICAgY29uc3QgcGFyZW50RWwgPSAkKHRoaXMubmF0aXZlRWxlbWVudCkuY2xvc2VzdCgnLmFwcC1jb21wb3NpdGUtd2lkZ2V0LmNhcHRpb24tZmxvYXRpbmcnKTtcbiAgICAgICAgaWYgKHBhcmVudEVsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuYXBwLm5vdGlmeSgnY2FwdGlvblBvc2l0aW9uQW5pbWF0ZScsIHsgZGlzcGxheVZhbDogdGhpcy5kaXNwbGF5VmFsdWUsIG5hdGl2ZUVsOiBwYXJlbnRFbCB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJsdXJEYXRlSW5wdXQodHJ1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1ZhbGlkKGV2ZW50KSB7XG4gICAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudGVyZWREYXRlID0gJCh0aGlzLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJ2lucHV0JykudmFsKCk/LnJlcGxhY2UodGhpcy5hbSwgdGhpcy5tZXJpZGlhbnNbMF0pPy5yZXBsYWNlKHRoaXMucG0sIHRoaXMubWVyaWRpYW5zWzFdKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbCA9IGdldE5hdGl2ZURhdGVPYmplY3QoZW50ZXJlZERhdGUsIHsgbWVyaWRpYW5zOiB0aGlzLm1lcmlkaWFucywgcGF0dGVybjogdGhpcy5sb2FkTmF0aXZlRGF0ZUlucHV0ID8gdGhpcy5vdXRwdXRmb3JtYXQgOiB1bmRlZmluZWQsIGlzTmF0aXZlUGlja2VyOiB0aGlzLmxvYWROYXRpdmVEYXRlSW5wdXQgfSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZm9ybWF0VmFsaWRhdGlvbihuZXdWYWwsIGVudGVyZWREYXRlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB0byBhZGQgY3NzIGNsYXNzIGZvciBkcm9wZG93biB3aGlsZSBvcGVuaW5nIHRoZSB0aW1lIGRyb3Bkb3duXG4gICAgICovXG4gICAgcHVibGljIG9uU2hvd24oKSB7XG4gICAgICAgIGNvbnN0IHRwRWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0aW1lcGlja2VyJyk7XG4gICAgICAgIGZvckVhY2godHBFbGVtZW50cywgZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQsICdhcHAtZGF0ZXRpbWUnLCB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmJzRHJvcGRvd24gJiYgKHRoaXMudGltZU5vdEluUmFuZ2UgfHwgdGhpcy5pbnZhbGlkRGF0ZVRpbWVGb3JtYXQpKSB7XG4gICAgICAgICAgICB0aGlzLmJzVGltZVZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvY3VzVGltZVBpY2tlclBvcG92ZXIodGhpcyk7XG4gICAgICAgIHRoaXMuYmluZFRpbWVQaWNrZXJLZXlib2FyZEV2ZW50cygpO1xuICAgICAgICBhZGp1c3RDb250YWluZXJQb3NpdGlvbigkKCdicy1kcm9wZG93bi1jb250YWluZXInKSwgdGhpcy5uYXRpdmVFbGVtZW50LCB0aGlzLmJzRHJvcGRvd24uX2Ryb3Bkb3duLCAkKCdicy1kcm9wZG93bi1jb250YWluZXIgLmRyb3Bkb3duLW1lbnUnKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzc2lnbk1vZGVsKCkge1xuICAgICAgICBpZiAoIXRoaXMuZGlzcGxheUlucHV0RWxlbSkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5SW5wdXRFbGVtID0gdGhpcy5nZXRNb2JpbGVJbnB1dCgpO1xuICAgICAgICB9XG4gICAgICAgICh0aGlzLmRpc3BsYXlJbnB1dEVsZW0gYXMgYW55KS52YWx1ZSA9IGdldCh0aGlzLCAnbmF0aXZlRGlzcGxheVZhbHVlJyk7XG4gICAgfVxufVxuIiwiPGRpdiBkcm9wZG93biBbaXNPcGVuXT1cInN0YXR1cy5pc29wZW5cIiAob25TaG93bik9XCJvblNob3duKClcIiAob25IaWRkZW4pPVwiaGlkZVRpbWVwaWNrZXJEcm9wZG93bigpXCIgW2NvbnRhaW5lcl09XCInYm9keSdcIiBzdHlsZT1cImRpc3BsYXk6IGluaGVyaXRcIj5cbiAgPGlucHV0IFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYWxhYmVsXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYXBwLXRleHRib3ggZGlzcGxheS1pbnB1dFwiXG4gICAgZm9jdXMtdGFyZ2V0XG4gICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICBbbmFtZV09XCJuYW1lXCJcbiAgICB0eXBlPVwidGV4dFwiXG4gICAgcm9sZT1cInRpbWVyXCJcbiAgICBbdmFsdWVdPVwiZGlzcGxheVZhbHVlXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgcmVhZG9ubHkgfHwgaXNDdXJyZW50VGltZVwiXG4gICAgW2F1dG9mb2N1c109XCJhdXRvZm9jdXNcIlxuICAgIFthdHRyLnBsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICBbYXR0ci5hY2Nlc3NrZXldPVwic2hvcnRjdXRrZXlcIlxuICAgIFthdHRyLmFyaWEtYXRvbWljXT1cImlzQ3VycmVudFRpbWUgPyAndHJ1ZScgOiAnZmFsc2UnXCJcbiAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgIFtyZWFkT25seV09XCJpc1JlYWRPbmx5XCJcbiAgICAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oJGV2ZW50LCB0cnVlKVwiXG4gICAgKGZvY3VzKT1cIm9uRGF0ZVRpbWVJbnB1dEZvY3VzKCk7IGludm9rZU9uRm9jdXMoJGV2ZW50KTtcIlxuICAgIChibHVyKT1cIm9uSW5wdXRCbHVyKCRldmVudClcIlxuICAgIChjaGFuZ2UpPVwib25EaXNwbGF5VGltZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAoa2V5ZG93bik9XCJ0aGlzLl90cmlnZ2VyZWRCeVVzZXIgPSB0cnVlOyBvbkRpc3BsYXlLZXlkb3duKCRldmVudClcIj5cbiAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1idG4gZHJvcGRvd24tdG9nZ2xlXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLWRhdGVcIiBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgcmVhZG9ubHkgfHwgaXNDdXJyZW50VGltZVwiIGFyaWEtbGFiZWw9XCJTZWxlY3QgdGltZVwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCIgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKCRldmVudCwgZmFsc2UpXCI+PGkgYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3M9XCJhcHAtaWNvbiB3bS1zbC1sIHNsLXRpbWVcIj48L2k+PC9idXR0b24+XG4gIDwvc3Bhbj5cbiAgPGRpdiAqZHJvcGRvd25NZW51IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIChjbGljayk9XCJwcmV2ZW50VHBDbG9zZSgkZXZlbnQpXCI+XG4gICAgPHRpbWVwaWNrZXIgY2xhc3M9XCJtb2RlbC1ob2xkZXJcIlxuICAgICAgW3Nob3dNZXJpZGlhbl09XCJpc21lcmlkaWFuXCJcbiAgICAgIFtyZWFkb25seUlucHV0XT1cImlzRGlzYWJsZWRcIlxuICAgICAgWyhuZ01vZGVsKV09XCJic1RpbWVWYWx1ZVwiXG4gICAgICBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCByZWFkb25seSB8fCBpc0N1cnJlbnRUaW1lXCJcbiAgICAgIFttaW5dPVwibWluVGltZVwiXG4gICAgICBbbWF4XT1cIm1heFRpbWVcIlxuICAgICAgW2hvdXJTdGVwXT1cImhvdXJzdGVwXCJcbiAgICAgIFttaW51dGVTdGVwXT1cIm1pbnV0ZXN0ZXBcIlxuICAgICAgW3NlY29uZHNTdGVwXT1cInNlY29uZHNzdGVwXCJcbiAgICAgIFttb3VzZXdoZWVsXT1cInRydWVcIlxuICAgICAgW2Fycm93a2V5c109XCJ0cnVlXCJcbiAgICAgIChpc1ZhbGlkKT1cImlzVmFsaWQoJGV2ZW50KVwiXG4gICAgICBbc2hvd1NlY29uZHNdPVwic2hvd3NlY29uZHNcIiAobmdNb2RlbENoYW5nZSk9XCJvblRpbWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICBbbmdDbGFzc109XCJ7ICdzaG93YnV0dG9ucyc6IHNob3dhbXBtYnV0dG9ucyB9XCI+PC90aW1lcGlja2VyPlxuICAgICAgQGlmIChpc21lcmlkaWFuICYmIHNob3dhbXBtYnV0dG9ucykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbXBtLXRvZ2dsZSB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibWVyaWRpYW4tYnRuIG1iLTFcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUgYnRuLXNlY29uZGFyeSc6IGdldFBlcmlvZCgpID09PSAnQU0nIH1cIiAoY2xpY2spPVwic2V0UGVyaW9kKCdBTScpXCI+e3thcHBMb2NhbGUuTEFCRUxfQU0gfHxcIkFNXCJ9fTwvYnV0dG9uPjxicj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1lcmlkaWFuLWJ0blwiIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZSBidG4tc2Vjb25kYXJ5JzogZ2V0UGVyaW9kKCkgPT09ICdQTScgfVwiIChjbGljayk9XCJzZXRQZXJpb2QoJ1BNJylcIj57e2FwcExvY2FsZS5MQUJFTF9QTSB8fFwiUE1cIn19PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gIDwvZGl2PlxuPC9kaXY+XG5AaWYgKGxvYWROYXRpdmVEYXRlSW5wdXQpIHtcbiAgPHdtLWRhdGV0aW1lcGlja2VyXG4gICAgZGF0ZVRpbWVQaWNrZXJcbiAgICBtb2RlPVwiVElNRVwiXG4gICAgW21pblRpbWVdPVwibWluVGltZVwiXG4gICAgW21heFRpbWVdPVwibWF4VGltZVwiXG4gICAgW3BsYWNlbWVudF09XCJtb2RhbFwiXG4gICAgW2Rpc3BsYXlGb3JtYXRdPVwidGltZXBhdHRlcm5cIlxuICAgIFt2YWx1ZV09XCJic1RpbWVWYWx1ZVwiXG4gICAgKGNoYW5nZSk9XCJvblRpbWVDaGFuZ2UoJGV2ZW50KVwiPlxuICA8L3dtLWRhdGV0aW1lcGlja2VyPlxuICA8ZGl2IGNsYXNzPVwibW9iaWxlLWlucHV0IG1vYmlsZS1kYXRlcGlja2VyLWNvbnRhaW5lclwiXG4gICAgdGFiaW5kZXg9XCIxMDAwMDAwXCJcbiAgICAoY2xpY2spPVwiIShkaXNhYmxlZCB8fCByZWFkb25seSkgJiYgc2hvd0RhdGVQaWNrZXJNb2RhbChic1RpbWVWYWx1ZSlcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZGlzcGxheVZhbHVlID8gJ0NoYW5nZSB0aW1lICAnICsgZGlzcGxheVZhbHVlIDogYXJpYWxhYmVsIHx8ICdTZWxlY3QgdGltZSdcIlxuICAgIChmb2N1cyk9XCJvbkRhdGVUaW1lSW5wdXRGb2N1cyh0cnVlKTsgaW52b2tlT25Gb2N1cygkZXZlbnQpOyBhc3NpZ25Nb2RlbCgpXCJcbiAgICAoYmx1cik9XCJvbkRhdGVUaW1lSW5wdXRCbHVyKCk7IGludm9rZU9uVG91Y2hlZCgkZXZlbnQpXCJcbiAgICByb2xlPVwiYnV0dG9uXCI+XG4gIDwvZGl2PlxufVxuIl19