@wizishop/angular-components 14.3.23 → 14.3.24

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.
@@ -146,6 +146,74 @@ $wac-google-preview-description: #4D5156!default;
146
146
  .wac-table__head__cell--checkbox .wac-field-checkbox__row {
147
147
  transform: translateX(5px);
148
148
  }
149
+ .wac-alert {
150
+ width: 100%;
151
+ background-color: transparentize($wac-link-color, 0.85);
152
+ color: $wac-link-color;
153
+ border-radius: 3px;
154
+ display: flex;
155
+ flex-wrap: nowrap;
156
+ justify-content: space-between;
157
+ padding: 20px;
158
+ &.success {
159
+ background-color: transparentize($wac-green-color, 0.85);
160
+ p {
161
+ color: $wac-p-alert-color-success;
162
+ > * {
163
+ color: $wac-p-alert-color-success;
164
+ }
165
+ }
166
+ i {
167
+ color: $wac-green-color;
168
+ }
169
+ }
170
+ &.warning {
171
+ background-color: transparentize($wac-primary-button, 0.85);
172
+ p {
173
+ color: $wac-p-alert-color-warning;
174
+ > * {
175
+ color: $wac-p-alert-color-warning;
176
+ }
177
+ }
178
+ i {
179
+ color: $wac-primary-button;
180
+ }
181
+ }
182
+ &.alert {
183
+ background-color: transparentize($wac-orange-color, 0.85);
184
+ p {
185
+ color: $wac-p-alert-color-alert;
186
+ > * {
187
+ color: $wac-p-alert-color-alert;
188
+ }
189
+ }
190
+ i {
191
+ color: $wac-orange-color;
192
+ }
193
+ }
194
+ p {
195
+ width: 100%;
196
+ font-size: rem(14);
197
+ line-height: rem(25);
198
+ margin: 0;
199
+ padding: 0;
200
+ color: $wac-p-alert-color-default;
201
+ > * {
202
+ color: $wac-p-alert-color-default;
203
+ }
204
+ }
205
+ i {
206
+ width: auto;
207
+ margin: 0 10px 0 0;
208
+ color: inherit;
209
+ font-size: rem(14);
210
+ line-height: rem(25);
211
+ }
212
+
213
+ .wac-button i {
214
+ color: $wac-white;
215
+ }
216
+ }
149
217
  .wac-alert-popup {
150
218
  .alert {
151
219
  z-index: 999999;
@@ -368,74 +436,6 @@ $wac-google-preview-description: #4D5156!default;
368
436
  }
369
437
 
370
438
  }
371
- .wac-alert {
372
- width: 100%;
373
- background-color: transparentize($wac-link-color, 0.85);
374
- color: $wac-link-color;
375
- border-radius: 3px;
376
- display: flex;
377
- flex-wrap: nowrap;
378
- justify-content: space-between;
379
- padding: 20px;
380
- &.success {
381
- background-color: transparentize($wac-green-color, 0.85);
382
- p {
383
- color: $wac-p-alert-color-success;
384
- > * {
385
- color: $wac-p-alert-color-success;
386
- }
387
- }
388
- i {
389
- color: $wac-green-color;
390
- }
391
- }
392
- &.warning {
393
- background-color: transparentize($wac-primary-button, 0.85);
394
- p {
395
- color: $wac-p-alert-color-warning;
396
- > * {
397
- color: $wac-p-alert-color-warning;
398
- }
399
- }
400
- i {
401
- color: $wac-primary-button;
402
- }
403
- }
404
- &.alert {
405
- background-color: transparentize($wac-orange-color, 0.85);
406
- p {
407
- color: $wac-p-alert-color-alert;
408
- > * {
409
- color: $wac-p-alert-color-alert;
410
- }
411
- }
412
- i {
413
- color: $wac-orange-color;
414
- }
415
- }
416
- p {
417
- width: 100%;
418
- font-size: rem(14);
419
- line-height: rem(25);
420
- margin: 0;
421
- padding: 0;
422
- color: $wac-p-alert-color-default;
423
- > * {
424
- color: $wac-p-alert-color-default;
425
- }
426
- }
427
- i {
428
- width: auto;
429
- margin: 0 10px 0 0;
430
- color: inherit;
431
- font-size: rem(14);
432
- line-height: rem(25);
433
- }
434
-
435
- .wac-button i {
436
- color: $wac-white;
437
- }
438
- }
439
439
  .wac-back {
440
440
  width: 40px;
441
441
  height: 40px;
@@ -6381,6 +6381,13 @@ span.wac-tooltip {
6381
6381
  }
6382
6382
  }
6383
6383
  }
6384
+ .wac-wrapper {
6385
+ width: 100%;
6386
+ &.max-width {
6387
+ max-width: 1080px;
6388
+ margin: 0 auto;
6389
+ }
6390
+ }
6384
6391
  .wac-wrapper-blocs {
6385
6392
  &.sidebar {
6386
6393
  width: calc(100% + 30px);
@@ -6402,13 +6409,6 @@ span.wac-tooltip {
6402
6409
  }
6403
6410
  }
6404
6411
  }
6405
- .wac-wrapper {
6406
- width: 100%;
6407
- &.max-width {
6408
- max-width: 1080px;
6409
- margin: 0 auto;
6410
- }
6411
- }
6412
6412
  .wac-wrapper-multiple-block {
6413
6413
  width: 100%;
6414
6414
  display: flex;
@@ -1,12 +1,17 @@
1
- import { Component, Input, EventEmitter, Output, ChangeDetectionStrategy } from '@angular/core';
1
+ import { DatePipe } from '@angular/common';
2
+ import { Component, Input, EventEmitter, Output, ChangeDetectionStrategy, ViewChild } from '@angular/core';
2
3
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
4
  import * as i0 from "@angular/core";
4
5
  import * as i1 from "@angular/common";
5
- import * as i2 from "@wizishop/ng-wizi-bulma";
6
- import * as i3 from "../../directives/auto-hide/auto-hide.directive";
7
- import * as i4 from "../../directives/zindex-toggle/zindex-toggle.directive";
6
+ import * as i2 from "@angular/forms";
7
+ import * as i3 from "@wizishop/ng-wizi-bulma";
8
+ import * as i4 from "../../directives/auto-hide/auto-hide.directive";
9
+ import * as i5 from "../../directives/zindex-toggle/zindex-toggle.directive";
10
+ import * as i6 from "../../directives/keyboard-events/only-numbers.directive";
11
+ import * as i7 from "../optional-disable-container/optional-disable-container.component";
8
12
  export class CalendarComponent {
9
- constructor() {
13
+ constructor(datePipe) {
14
+ this.datePipe = datePipe;
10
15
  this.type = 'input';
11
16
  this.options = {
12
17
  displayMode: 'inline',
@@ -14,7 +19,7 @@ export class CalendarComponent {
14
19
  showFooter: true,
15
20
  };
16
21
  this.position = 'bottom';
17
- this._dateSelected = new Date(); // todo only allow date
22
+ this._dateSelected = new Date();
18
23
  this.dateSelectedChange = new EventEmitter();
19
24
  this.typeDate = 'datetime-local'; // todo check why it is broken
20
25
  this.noMargin = false;
@@ -31,48 +36,46 @@ export class CalendarComponent {
31
36
  if (this.disabled) {
32
37
  return;
33
38
  }
34
- this._dateSelected = dateSelected;
35
- this.setCalendarDate();
39
+ this._dateSelected = new Date(dateSelected); // trigger change detection for pure pipe
36
40
  }
37
41
  get dateSelected() {
38
42
  return this._dateSelected;
39
43
  }
40
- ngOnInit() {
41
- this.setCalendarLabel();
42
- this.setCalendarDate();
44
+ set calendarMinutes(calendarMinutes) {
45
+ const minutes = this.formatTime(calendarMinutes, 0, 59);
46
+ this.dateSelected.setMinutes(minutes);
47
+ this.dateSelected = this.dateSelected; // trigger change detection
48
+ this.minutes.nativeElement.value = this.datePipe.transform(this.dateSelected, 'mm'); // force to update the input value
49
+ this.triggerDateSelectedChange();
50
+ }
51
+ get calendarMinutes() {
52
+ return this.datePipe.transform(this.dateSelected, 'mm');
53
+ }
54
+ set calendarHours(calendarHours) {
55
+ const hours = this.formatTime(calendarHours, 0, 23);
56
+ this.dateSelected.setHours(hours);
57
+ this.dateSelected = this.dateSelected; // trigger change detection
58
+ this.hours.nativeElement.value = this.datePipe.transform(this.dateSelected, 'HH'); // force to update the input value
59
+ this.triggerDateSelectedChange();
60
+ }
61
+ get calendarHours() {
62
+ return this.datePipe.transform(this.dateSelected, 'HH');
43
63
  }
44
64
  ngOnChanges(changes) {
45
65
  if (changes.label || changes.type) {
46
66
  this.setCalendarLabel();
47
67
  }
48
- if (changes.typeDate) {
49
- this.typeDateChange();
50
- }
51
- }
52
- writeValue(date) {
53
- if (!date) {
54
- return;
55
- }
56
- this.dateSelected = date;
57
- }
58
- registerOnChange(fn) {
59
- this.onChange = fn;
60
- }
61
- registerOnTouched(fn) {
62
- this.onTouch = fn;
63
- }
64
- setDisabledState(isDisabled) {
65
- this.disabled = isDisabled;
66
68
  }
67
69
  onChangeDate(selectedDates) {
68
70
  if (this.disabled) {
69
71
  return;
70
72
  }
71
- this.currentDate = new Date(new Date(selectedDates.startDate).setHours(0, 0, 0, 0));
72
- this.setDateSelected();
73
+ selectedDates.startDate.setHours(this.dateSelected.getHours());
74
+ selectedDates.startDate.setMinutes(this.dateSelected.getMinutes());
75
+ this.dateSelected = selectedDates.startDate;
76
+ this.triggerDateSelectedChange();
73
77
  }
74
- setDateSelected() {
75
- this.dateSelected = this.getDateData();
78
+ triggerDateSelectedChange() {
76
79
  this.onChange(this.dateSelected);
77
80
  this.dateSelectedChange.emit(this.dateSelected);
78
81
  this.triggerChange({
@@ -84,6 +87,9 @@ export class CalendarComponent {
84
87
  this.changeData.emit(event);
85
88
  }
86
89
  openCalendar(value = null) {
90
+ if (this.disabled) {
91
+ return;
92
+ }
87
93
  if (value === 'close') {
88
94
  if (this.open) {
89
95
  this.open = false;
@@ -94,21 +100,6 @@ export class CalendarComponent {
94
100
  this.open = !this.open;
95
101
  }
96
102
  }
97
- setCalendarDate() {
98
- this.currentHours = this.dateSelected.getHours() < 10 ? '0' + this.dateSelected.getHours() : this.dateSelected.getHours();
99
- this.currentMinutes = this.dateSelected.getMinutes() < 10 ? '0' + this.dateSelected.getMinutes() : this.dateSelected.getMinutes();
100
- this.currentDate = new Date(this.dateSelected.setHours(0, 0, 0, 0));
101
- if (this.typeDate === 'date') {
102
- this.currentHours = '00';
103
- this.currentMinutes = '00';
104
- }
105
- }
106
- typeDateChange() {
107
- if (this.typeDate === 'date') {
108
- this.currentHours = '00';
109
- this.currentMinutes = '00';
110
- }
111
- }
112
103
  setCalendarLabel() {
113
104
  if (this.type === 'edit' && this.label) {
114
105
  const splitLabel = this.label.split('{x}');
@@ -121,77 +112,53 @@ export class CalendarComponent {
121
112
  }
122
113
  }
123
114
  }
124
- verifKeyup(events) {
125
- events.target.value = events.target.value.replace(/\D+/g, '');
126
- }
127
- verifHours(events) {
128
- const value = parseInt(events.target.value, 0);
129
- events.target.value = this.currentHours = value < 24 ? (value < 10 ? '0' + value : value) : 23;
130
- this.setDateSelected();
131
- }
132
- verifMinutes(events) {
133
- const value = parseInt(events.target.value, 0);
134
- events.target.value = this.currentMinutes = value < 60 ? (value < 10 ? '0' + value : value) : 59;
135
- this.setDateSelected();
136
- }
137
- addHours(target) {
138
- target.value = this.currentHours =
139
- parseInt(target.value, 0) + 1 < 24
140
- ? parseInt(target.value, 0) + 1 < 10
141
- ? '0' + (parseInt(target.value, 0) + 1)
142
- : parseInt(target.value, 0) + 1
143
- : parseInt(target.value, 0) < 10
144
- ? '0' + parseInt(target.value, 0)
145
- : parseInt(target.value, 0);
146
- this.setDateSelected();
147
- }
148
- removeHours(target) {
149
- target.value = this.currentHours =
150
- parseInt(target.value, 0) - 1 > -1
151
- ? parseInt(target.value, 0) - 1 < 10
152
- ? '0' + (parseInt(target.value, 0) - 1)
153
- : parseInt(target.value, 0) - 1
154
- : parseInt(target.value, 0) < 10
155
- ? '0' + parseInt(target.value, 0)
156
- : parseInt(target.value, 0);
157
- this.setDateSelected();
158
- }
159
- addMinutes(target) {
160
- target.value = this.currentMinutes =
161
- parseInt(target.value, 0) + 1 < 60
162
- ? parseInt(target.value, 0) + 1 < 10
163
- ? '0' + (parseInt(target.value, 0) + 1)
164
- : parseInt(target.value, 0) + 1
165
- : parseInt(target.value, 0) < 10
166
- ? '0' + parseInt(target.value, 0)
167
- : parseInt(target.value, 0);
168
- this.setDateSelected();
169
- }
170
- removeMinutes(target) {
171
- target.value = this.currentMinutes =
172
- parseInt(target.value, 0) - 1 > -1
173
- ? parseInt(target.value, 0) - 1 < 10
174
- ? '0' + (parseInt(target.value, 0) - 1)
175
- : parseInt(target.value, 0) - 1
176
- : parseInt(target.value, 0) < 10
177
- ? '0' + parseInt(target.value, 0)
178
- : parseInt(target.value, 0);
179
- this.setDateSelected();
180
- }
181
- getDateData() {
182
- return new Date(new Date(new Date(this.currentDate).setHours(0, 0, 0, 0)).getTime() +
183
- parseInt(this.currentHours, 0) * 60 * 60 * 1000 +
184
- parseInt(this.currentMinutes, 0) * 60000);
115
+ incrementMinutes() {
116
+ this.calendarMinutes = parseInt(this.calendarMinutes, 10) + 1 + '';
117
+ }
118
+ decrementsMinutes() {
119
+ this.calendarMinutes = parseInt(this.calendarMinutes, 10) - 1 + '';
120
+ }
121
+ incrementHours() {
122
+ this.calendarHours = parseInt(this.calendarHours, 10) + 1 + '';
123
+ }
124
+ decrementHours() {
125
+ this.calendarHours = parseInt(this.calendarHours, 10) - 1 + '';
126
+ }
127
+ /*
128
+ Ensure that the input value is a number and that it is between min and max
129
+ */
130
+ formatTime(time, min = 0, max = 59) {
131
+ let timeNumber = typeof time === 'string' ? parseInt(time, 10) : time;
132
+ timeNumber = timeNumber > max ? min : timeNumber;
133
+ timeNumber = timeNumber < min ? max : timeNumber;
134
+ timeNumber = parseInt(('' + timeNumber).slice(-2)); // keeps only the last 2 digits
135
+ return timeNumber;
136
+ }
137
+ writeValue(date) {
138
+ if (!date) {
139
+ return;
140
+ }
141
+ this.dateSelected = date;
142
+ }
143
+ registerOnChange(fn) {
144
+ this.onChange = fn;
145
+ }
146
+ registerOnTouched(fn) {
147
+ this.onTouch = fn;
148
+ }
149
+ setDisabledState(isDisabled) {
150
+ this.disabled = isDisabled;
185
151
  }
186
152
  }
187
- CalendarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: CalendarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
153
+ CalendarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: CalendarComponent, deps: [{ token: i1.DatePipe }], target: i0.ɵɵFactoryTarget.Component });
188
154
  CalendarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.7", type: CalendarComponent, selector: "wac-calendar", inputs: { label: "label", type: "type", options: "options", position: "position", dateSelected: "dateSelected", typeDate: "typeDate", noMargin: "noMargin", disabled: "disabled" }, outputs: { dateSelectedChange: "dateSelectedChange", changeData: "changeData" }, providers: [
189
155
  {
190
156
  provide: NG_VALUE_ACCESSOR,
191
157
  useExisting: CalendarComponent,
192
158
  multi: true
193
- }
194
- ], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"wac-calendar\"\n [ngClass]=\"{\n 'wac-calendar--input': type === 'input',\n 'wac-calendar--edit': type === 'edit',\n 'wac-calendar--select': type === 'select',\n 'wac-calendar--no-margin': noMargin,\n 'wac-calendar--open': open\n }\"\n [zIndexToggle]=\"open\"\n>\n <p class=\"wac-calendar__label\" *ngIf=\"label && (type === 'input' || type === 'select')\" (click)=\"openCalendar()\">{{ label }}</p>\n <p class=\"wac-calendar__startLabel\" *ngIf=\"type === 'edit'\">{{ startLabel }}</p>\n <div class=\"wac-calendar__autoHide\" wzAutoHide (clickOutside)=\"openCalendar('close')\">\n <div class=\"wac-calendar__wrapper\">\n <div class=\"wac-calendar__wrapper__input\" *ngIf=\"type === 'input'\" (click)=\"openCalendar()\">\n <div class=\"wac-calendar__wrapper__input__icon\">\n <i class=\"far fa-calendar-alt\"></i>\n </div>\n <div class=\"wac-calendar__wrapper__input__date\">\n {{ dateSelected | date: 'dd/MM/yyyy' }}\n </div>\n <div class=\"wac-calendar__wrapper__input__time\">\n {{ dateSelected | date: 'HH:mm' }}\n </div>\n </div>\n <div class=\"wac-calendar__wrapper__editInPlace\" *ngIf=\"type === 'edit'\" (click)=\"openCalendar()\">\n <div class=\"wac-calendar__wrapper__editInPlace__icon\">\n <i class=\"fal fa-calendar-alt\"></i>\n </div>\n <div class=\"wac-calendar__wrapper__editInPlace__date\">\n {{ dateSelected | date: 'dd/MM/yyyy HH:mm' }}\n </div>\n </div>\n <div class=\"wac-calendar__wrapper__select\" *ngIf=\"type === 'select'\" (click)=\"openCalendar()\">\n <div class=\"wac-calendar__wrapper__select__icon\">\n <i class=\"fal fa-calendar-alt\"></i>\n </div>\n <div class=\"wac-calendar__wrapper__select__date\">\n {{ dateSelected | date: 'dd/MM/yyyy HH:mm' }}\n </div>\n </div>\n </div>\n <div\n class=\"wac-calendar__absolute\"\n [ngClass]=\"{\n top: position === 'top',\n bottom: position === 'bottom',\n left: position === 'left',\n right: position === 'right',\n 'right-top': position === 'right-top',\n 'right-bottom': position === 'right-bottom',\n 'left-top': position === 'left-top',\n 'left-bottom': position === 'left-bottom',\n 'with-time': typeDate === 'datetime-local' || typeDate === 'datetime'\n }\"\n >\n <nwb-date-picker #datePicker (change)=\"onChangeDate($event)\" [options]=\"options\">\n\n <input [nwbDatepickerStart]=\"datePicker\" type=\"text\" [nwbDateType]=\"'date'\" [value]=\"dateSelected.toISOString()\" />\n </nwb-date-picker>\n <div class=\"wac-calendar__absolute__time\" *ngIf=\"typeDate === 'datetime-local' || typeDate === 'datetime'\">\n <div class=\"wac-calendar__absolute__time__wrapper\">\n <div class=\"wac-calendar__absolute__time__wrapper__hours\">\n <div class=\"wac-calendar__absolute__time__wrapper__hours__left\">\n <button class=\"wac-calendar__absolute__time__wrapper__hours__btn\" (click)=\"addHours(hours)\">\n <i class=\"fas fa-plus\"></i>\n </button>\n <button class=\"wac-calendar__absolute__time__wrapper__hours__btn\" (click)=\"removeHours(hours)\">\n <i class=\"fas fa-minus\"></i>\n </button>\n </div>\n <div class=\"wac-calendar__absolute__time__wrapper__hours__right\">\n <input #hours type=\"text\" [value]=\"currentHours\" (keyup)=\"verifKeyup($event)\" (blur)=\"verifHours($event)\" />\n </div>\n </div>\n <div class=\"wac-calendar__absolute__time__wrapper__minutes\">\n <div class=\"wac-calendar__absolute__time__wrapper__minutes__left\">\n <input #minutes type=\"text\" [value]=\"currentMinutes\" (keyup)=\"verifKeyup($event)\" (blur)=\"verifMinutes($event)\" />\n </div>\n <div class=\"wac-calendar__absolute__time__wrapper__minutes__right\">\n <button class=\"wac-calendar__absolute__time__wrapper__minutes__btn\" (click)=\"addMinutes(minutes)\">\n <i class=\"fas fa-plus\"></i>\n </button>\n <button class=\"wac-calendar__absolute__time__wrapper__minutes__btn\" (click)=\"removeMinutes(minutes)\">\n <i class=\"fas fa-minus\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <p class=\"wac-calendar__endLabel\" *ngIf=\"type === 'edit'\">{{ endLabel }}</p>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.NwbDatePickerComponent, selector: "nwb-date-picker", inputs: ["options"], outputs: ["change", "clear"] }, { kind: "directive", type: i2.NwbDatePickerInputStartDirective, selector: "input[nwbDatepickerStart]", inputs: ["nwbDatepickerStart"] }, { kind: "directive", type: i2.NwbDatePickerInputDateTypeDirective, selector: "input[nwbDateType]", inputs: ["nwbDateType"] }, { kind: "directive", type: i3.AutoHideDirective, selector: "[wzAutoHide]", inputs: ["triggerElement", "forceOn"], outputs: ["clickOutside"] }, { kind: "directive", type: i4.ZindexToggleDirective, selector: "[zIndexToggle]", inputs: ["zIndexToggle"], outputs: ["onEventChange"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
159
+ },
160
+ DatePipe
161
+ ], viewQueries: [{ propertyName: "minutes", first: true, predicate: ["minutes"], descendants: true }, { propertyName: "hours", first: true, predicate: ["hours"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"wac-calendar\"\n [ngClass]=\"{\n 'wac-calendar--input': type === 'input',\n 'wac-calendar--edit': type === 'edit',\n 'wac-calendar--select': type === 'select',\n 'wac-calendar--no-margin': noMargin,\n 'wac-calendar--open': open\n }\"\n [zIndexToggle]=\"open\"\n>\n <p class=\"wac-calendar__label\" *ngIf=\"label && (type === 'input' || type === 'select')\" (click)=\"openCalendar()\">{{ label }}</p>\n <p class=\"wac-calendar__startLabel\" *ngIf=\"type === 'edit'\">{{ startLabel }}</p>\n <wac-optional-disable-container [disabled]=\"disabled\">\n <div class=\"wac-calendar__autoHide\" wzAutoHide (clickOutside)=\"openCalendar('close')\">\n <div class=\"wac-calendar__wrapper\">\n <div class=\"wac-calendar__wrapper__input\" *ngIf=\"type === 'input'\" (click)=\"openCalendar()\">\n <div class=\"wac-calendar__wrapper__input__icon\">\n <i class=\"far fa-calendar-alt\"></i>\n </div>\n <div class=\"wac-calendar__wrapper__input__date\">\n {{ dateSelected | date: 'dd/MM/yyyy' }}\n </div>\n <div class=\"wac-calendar__wrapper__input__time\">\n {{ dateSelected | date: 'HH:mm' }}\n </div>\n </div>\n <div class=\"wac-calendar__wrapper__editInPlace\" *ngIf=\"type === 'edit'\" (click)=\"openCalendar()\">\n <div class=\"wac-calendar__wrapper__editInPlace__icon\">\n <i class=\"fal fa-calendar-alt\"></i>\n </div>\n <div class=\"wac-calendar__wrapper__editInPlace__date\">\n {{ dateSelected | date: 'dd/MM/yyyy HH:mm' }}\n </div>\n </div>\n <div class=\"wac-calendar__wrapper__select\" *ngIf=\"type === 'select'\" (click)=\"openCalendar()\">\n <div class=\"wac-calendar__wrapper__select__icon\">\n <i class=\"fal fa-calendar-alt\"></i>\n </div>\n <div class=\"wac-calendar__wrapper__select__date\">\n {{ dateSelected | date: 'dd/MM/yyyy HH:mm' }}\n </div>\n </div>\n </div>\n <div\n class=\"wac-calendar__absolute\"\n [ngClass]=\"{\n top: position === 'top',\n bottom: position === 'bottom',\n left: position === 'left',\n right: position === 'right',\n 'right-top': position === 'right-top',\n 'right-bottom': position === 'right-bottom',\n 'left-top': position === 'left-top',\n 'left-bottom': position === 'left-bottom',\n 'with-time': typeDate === 'datetime-local' || typeDate === 'datetime'\n }\"\n >\n <nwb-date-picker #datePicker (change)=\"onChangeDate($event)\" [options]=\"options\">\n <input [nwbDatepickerStart]=\"datePicker\" type=\"text\" [nwbDateType]=\"'date'\" [value]=\"dateSelected.toISOString()\" />\n </nwb-date-picker>\n <div class=\"wac-calendar__absolute__time\" *ngIf=\"typeDate === 'datetime-local' || typeDate === 'datetime'\">\n <div class=\"wac-calendar__absolute__time__wrapper\">\n <div class=\"wac-calendar__absolute__time__wrapper__hours\">\n <div class=\"wac-calendar__absolute__time__wrapper__hours__left\">\n <button class=\"wac-calendar__absolute__time__wrapper__hours__btn\" (click)=\"incrementHours()\">\n <i class=\"fas fa-plus\"></i>\n </button>\n <button class=\"wac-calendar__absolute__time__wrapper__hours__btn\" (click)=\"decrementHours()\">\n <i class=\"fas fa-minus\"></i>\n </button>\n </div>\n <div class=\"wac-calendar__absolute__time__wrapper__hours__right\">\n <input #hours type=\"text\" [(ngModel)]=\"calendarHours\" [wacOnlyNumber]=\"true\"/>\n </div>\n </div>\n <div class=\"wac-calendar__absolute__time__wrapper__minutes\">\n <div class=\"wac-calendar__absolute__time__wrapper__minutes__left\">\n <input #minutes type=\"text\" [(ngModel)]=\"calendarMinutes\" [wacOnlyNumber]=\"true\"/>\n </div>\n <div class=\"wac-calendar__absolute__time__wrapper__minutes__right\">\n <button class=\"wac-calendar__absolute__time__wrapper__minutes__btn\" (click)=\"incrementMinutes()\">\n <i class=\"fas fa-plus\"></i>\n </button>\n <button class=\"wac-calendar__absolute__time__wrapper__minutes__btn\" (click)=\"decrementsMinutes()\">\n <i class=\"fas fa-minus\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </wac-optional-disable-container>\n <p class=\"wac-calendar__endLabel\" *ngIf=\"type === 'edit'\">{{ endLabel }}</p>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.NwbDatePickerComponent, selector: "nwb-date-picker", inputs: ["options"], outputs: ["change", "clear"] }, { kind: "directive", type: i3.NwbDatePickerInputStartDirective, selector: "input[nwbDatepickerStart]", inputs: ["nwbDatepickerStart"] }, { kind: "directive", type: i3.NwbDatePickerInputDateTypeDirective, selector: "input[nwbDateType]", inputs: ["nwbDateType"] }, { kind: "directive", type: i4.AutoHideDirective, selector: "[wzAutoHide]", inputs: ["triggerElement", "forceOn"], outputs: ["clickOutside"] }, { kind: "directive", type: i5.ZindexToggleDirective, selector: "[zIndexToggle]", inputs: ["zIndexToggle"], outputs: ["onEventChange"] }, { kind: "directive", type: i6.OnlyNumberDirective, selector: "[wacOnlyNumber]", inputs: ["wacOnlyNumber"] }, { kind: "component", type: i7.OptionalDisableContainerComponent, selector: "wac-optional-disable-container", inputs: ["disabled"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
195
162
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: CalendarComponent, decorators: [{
196
163
  type: Component,
197
164
  args: [{ selector: 'wac-calendar', providers: [
@@ -199,9 +166,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImpor
199
166
  provide: NG_VALUE_ACCESSOR,
200
167
  useExisting: CalendarComponent,
201
168
  multi: true
202
- }
203
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"wac-calendar\"\n [ngClass]=\"{\n 'wac-calendar--input': type === 'input',\n 'wac-calendar--edit': type === 'edit',\n 'wac-calendar--select': type === 'select',\n 'wac-calendar--no-margin': noMargin,\n 'wac-calendar--open': open\n }\"\n [zIndexToggle]=\"open\"\n>\n <p class=\"wac-calendar__label\" *ngIf=\"label && (type === 'input' || type === 'select')\" (click)=\"openCalendar()\">{{ label }}</p>\n <p class=\"wac-calendar__startLabel\" *ngIf=\"type === 'edit'\">{{ startLabel }}</p>\n <div class=\"wac-calendar__autoHide\" wzAutoHide (clickOutside)=\"openCalendar('close')\">\n <div class=\"wac-calendar__wrapper\">\n <div class=\"wac-calendar__wrapper__input\" *ngIf=\"type === 'input'\" (click)=\"openCalendar()\">\n <div class=\"wac-calendar__wrapper__input__icon\">\n <i class=\"far fa-calendar-alt\"></i>\n </div>\n <div class=\"wac-calendar__wrapper__input__date\">\n {{ dateSelected | date: 'dd/MM/yyyy' }}\n </div>\n <div class=\"wac-calendar__wrapper__input__time\">\n {{ dateSelected | date: 'HH:mm' }}\n </div>\n </div>\n <div class=\"wac-calendar__wrapper__editInPlace\" *ngIf=\"type === 'edit'\" (click)=\"openCalendar()\">\n <div class=\"wac-calendar__wrapper__editInPlace__icon\">\n <i class=\"fal fa-calendar-alt\"></i>\n </div>\n <div class=\"wac-calendar__wrapper__editInPlace__date\">\n {{ dateSelected | date: 'dd/MM/yyyy HH:mm' }}\n </div>\n </div>\n <div class=\"wac-calendar__wrapper__select\" *ngIf=\"type === 'select'\" (click)=\"openCalendar()\">\n <div class=\"wac-calendar__wrapper__select__icon\">\n <i class=\"fal fa-calendar-alt\"></i>\n </div>\n <div class=\"wac-calendar__wrapper__select__date\">\n {{ dateSelected | date: 'dd/MM/yyyy HH:mm' }}\n </div>\n </div>\n </div>\n <div\n class=\"wac-calendar__absolute\"\n [ngClass]=\"{\n top: position === 'top',\n bottom: position === 'bottom',\n left: position === 'left',\n right: position === 'right',\n 'right-top': position === 'right-top',\n 'right-bottom': position === 'right-bottom',\n 'left-top': position === 'left-top',\n 'left-bottom': position === 'left-bottom',\n 'with-time': typeDate === 'datetime-local' || typeDate === 'datetime'\n }\"\n >\n <nwb-date-picker #datePicker (change)=\"onChangeDate($event)\" [options]=\"options\">\n\n <input [nwbDatepickerStart]=\"datePicker\" type=\"text\" [nwbDateType]=\"'date'\" [value]=\"dateSelected.toISOString()\" />\n </nwb-date-picker>\n <div class=\"wac-calendar__absolute__time\" *ngIf=\"typeDate === 'datetime-local' || typeDate === 'datetime'\">\n <div class=\"wac-calendar__absolute__time__wrapper\">\n <div class=\"wac-calendar__absolute__time__wrapper__hours\">\n <div class=\"wac-calendar__absolute__time__wrapper__hours__left\">\n <button class=\"wac-calendar__absolute__time__wrapper__hours__btn\" (click)=\"addHours(hours)\">\n <i class=\"fas fa-plus\"></i>\n </button>\n <button class=\"wac-calendar__absolute__time__wrapper__hours__btn\" (click)=\"removeHours(hours)\">\n <i class=\"fas fa-minus\"></i>\n </button>\n </div>\n <div class=\"wac-calendar__absolute__time__wrapper__hours__right\">\n <input #hours type=\"text\" [value]=\"currentHours\" (keyup)=\"verifKeyup($event)\" (blur)=\"verifHours($event)\" />\n </div>\n </div>\n <div class=\"wac-calendar__absolute__time__wrapper__minutes\">\n <div class=\"wac-calendar__absolute__time__wrapper__minutes__left\">\n <input #minutes type=\"text\" [value]=\"currentMinutes\" (keyup)=\"verifKeyup($event)\" (blur)=\"verifMinutes($event)\" />\n </div>\n <div class=\"wac-calendar__absolute__time__wrapper__minutes__right\">\n <button class=\"wac-calendar__absolute__time__wrapper__minutes__btn\" (click)=\"addMinutes(minutes)\">\n <i class=\"fas fa-plus\"></i>\n </button>\n <button class=\"wac-calendar__absolute__time__wrapper__minutes__btn\" (click)=\"removeMinutes(minutes)\">\n <i class=\"fas fa-minus\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <p class=\"wac-calendar__endLabel\" *ngIf=\"type === 'edit'\">{{ endLabel }}</p>\n</div>\n" }]
204
- }], ctorParameters: function () { return []; }, propDecorators: { label: [{
169
+ },
170
+ DatePipe
171
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"wac-calendar\"\n [ngClass]=\"{\n 'wac-calendar--input': type === 'input',\n 'wac-calendar--edit': type === 'edit',\n 'wac-calendar--select': type === 'select',\n 'wac-calendar--no-margin': noMargin,\n 'wac-calendar--open': open\n }\"\n [zIndexToggle]=\"open\"\n>\n <p class=\"wac-calendar__label\" *ngIf=\"label && (type === 'input' || type === 'select')\" (click)=\"openCalendar()\">{{ label }}</p>\n <p class=\"wac-calendar__startLabel\" *ngIf=\"type === 'edit'\">{{ startLabel }}</p>\n <wac-optional-disable-container [disabled]=\"disabled\">\n <div class=\"wac-calendar__autoHide\" wzAutoHide (clickOutside)=\"openCalendar('close')\">\n <div class=\"wac-calendar__wrapper\">\n <div class=\"wac-calendar__wrapper__input\" *ngIf=\"type === 'input'\" (click)=\"openCalendar()\">\n <div class=\"wac-calendar__wrapper__input__icon\">\n <i class=\"far fa-calendar-alt\"></i>\n </div>\n <div class=\"wac-calendar__wrapper__input__date\">\n {{ dateSelected | date: 'dd/MM/yyyy' }}\n </div>\n <div class=\"wac-calendar__wrapper__input__time\">\n {{ dateSelected | date: 'HH:mm' }}\n </div>\n </div>\n <div class=\"wac-calendar__wrapper__editInPlace\" *ngIf=\"type === 'edit'\" (click)=\"openCalendar()\">\n <div class=\"wac-calendar__wrapper__editInPlace__icon\">\n <i class=\"fal fa-calendar-alt\"></i>\n </div>\n <div class=\"wac-calendar__wrapper__editInPlace__date\">\n {{ dateSelected | date: 'dd/MM/yyyy HH:mm' }}\n </div>\n </div>\n <div class=\"wac-calendar__wrapper__select\" *ngIf=\"type === 'select'\" (click)=\"openCalendar()\">\n <div class=\"wac-calendar__wrapper__select__icon\">\n <i class=\"fal fa-calendar-alt\"></i>\n </div>\n <div class=\"wac-calendar__wrapper__select__date\">\n {{ dateSelected | date: 'dd/MM/yyyy HH:mm' }}\n </div>\n </div>\n </div>\n <div\n class=\"wac-calendar__absolute\"\n [ngClass]=\"{\n top: position === 'top',\n bottom: position === 'bottom',\n left: position === 'left',\n right: position === 'right',\n 'right-top': position === 'right-top',\n 'right-bottom': position === 'right-bottom',\n 'left-top': position === 'left-top',\n 'left-bottom': position === 'left-bottom',\n 'with-time': typeDate === 'datetime-local' || typeDate === 'datetime'\n }\"\n >\n <nwb-date-picker #datePicker (change)=\"onChangeDate($event)\" [options]=\"options\">\n <input [nwbDatepickerStart]=\"datePicker\" type=\"text\" [nwbDateType]=\"'date'\" [value]=\"dateSelected.toISOString()\" />\n </nwb-date-picker>\n <div class=\"wac-calendar__absolute__time\" *ngIf=\"typeDate === 'datetime-local' || typeDate === 'datetime'\">\n <div class=\"wac-calendar__absolute__time__wrapper\">\n <div class=\"wac-calendar__absolute__time__wrapper__hours\">\n <div class=\"wac-calendar__absolute__time__wrapper__hours__left\">\n <button class=\"wac-calendar__absolute__time__wrapper__hours__btn\" (click)=\"incrementHours()\">\n <i class=\"fas fa-plus\"></i>\n </button>\n <button class=\"wac-calendar__absolute__time__wrapper__hours__btn\" (click)=\"decrementHours()\">\n <i class=\"fas fa-minus\"></i>\n </button>\n </div>\n <div class=\"wac-calendar__absolute__time__wrapper__hours__right\">\n <input #hours type=\"text\" [(ngModel)]=\"calendarHours\" [wacOnlyNumber]=\"true\"/>\n </div>\n </div>\n <div class=\"wac-calendar__absolute__time__wrapper__minutes\">\n <div class=\"wac-calendar__absolute__time__wrapper__minutes__left\">\n <input #minutes type=\"text\" [(ngModel)]=\"calendarMinutes\" [wacOnlyNumber]=\"true\"/>\n </div>\n <div class=\"wac-calendar__absolute__time__wrapper__minutes__right\">\n <button class=\"wac-calendar__absolute__time__wrapper__minutes__btn\" (click)=\"incrementMinutes()\">\n <i class=\"fas fa-plus\"></i>\n </button>\n <button class=\"wac-calendar__absolute__time__wrapper__minutes__btn\" (click)=\"decrementsMinutes()\">\n <i class=\"fas fa-minus\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </wac-optional-disable-container>\n <p class=\"wac-calendar__endLabel\" *ngIf=\"type === 'edit'\">{{ endLabel }}</p>\n</div>\n" }]
172
+ }], ctorParameters: function () { return [{ type: i1.DatePipe }]; }, propDecorators: { minutes: [{
173
+ type: ViewChild,
174
+ args: ['minutes']
175
+ }], hours: [{
176
+ type: ViewChild,
177
+ args: ['hours']
178
+ }], label: [{
205
179
  type: Input
206
180
  }], type: [{
207
181
  type: Input
@@ -222,4 +196,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImpor
222
196
  }], changeData: [{
223
197
  type: Output
224
198
  }] } });
225
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQW9DLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xJLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBZXpFLE1BQU0sT0FBTyxpQkFBaUI7SUE0QzVCO1FBdkNBLFNBQUksR0FBZ0MsT0FBTyxDQUFDO1FBRTVDLFlBQU8sR0FBeUI7WUFDOUIsV0FBVyxFQUFFLFFBQVE7WUFDckIsVUFBVSxFQUFFLEtBQUs7WUFDakIsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQztRQUVGLGFBQVEsR0FBRyxRQUFRLENBQUM7UUFFcEIsa0JBQWEsR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsdUJBQXVCO1FBWS9DLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFHbEQsYUFBUSxHQUEyQyxnQkFBZ0IsQ0FBQyxDQUFDLDhCQUE4QjtRQUVuRyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRVIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVoQixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQXVDLENBQUM7UUFDL0UsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUNiLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQTBLYiwrQkFBK0I7UUFFL0IsYUFBUSxHQUEwQixHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFM0MsWUFBTyxHQUFlLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQXpLakIsQ0FBQztJQTVCaEIsSUFDSSxZQUFZLENBQUMsWUFBa0I7UUFDakMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBQ0QsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFvQkQsUUFBUTtRQUNOLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQ3pCO1FBRUQsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2QjtJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsSUFBVTtRQUNuQixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUNELGdCQUFnQixDQUFDLEVBQU87UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUNELGlCQUFpQixDQUFDLEVBQU87UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUNELGdCQUFnQixDQUFDLFVBQW1CO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzdCLENBQUM7SUFFRCxZQUFZLENBQUMsYUFBaUM7UUFDNUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVqQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ2pCLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWTtZQUM1QixPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVk7U0FDM0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUEwQztRQUN0RCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQUssR0FBRyxJQUFJO1FBQ3ZCLElBQUksS0FBSyxLQUFLLE9BQU8sRUFBRTtZQUNyQixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNoQjtTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUN4QjtJQUNILENBQUM7SUFFTyxlQUFlO1FBRXJCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzFILElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xJLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVwRSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssTUFBTSxFQUFFO1lBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVPLGNBQWM7UUFDcEIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLE1BQU0sRUFBRTtZQUM1QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztTQUM1QjtJQUNILENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3RDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvQjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7YUFDOUI7U0FDRjtJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsTUFBVztRQUNwQixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxVQUFVLENBQUMsTUFBVztRQUNwQixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0YsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFDRCxZQUFZLENBQUMsTUFBVztRQUN0QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFDRCxRQUFRLENBQUMsTUFBVztRQUNsQixNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZO1lBQzlCLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNoQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7b0JBQ3BDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3ZDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUMvQixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRTtvQkFDaEMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7b0JBQ2pDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUNELFdBQVcsQ0FBQyxNQUFXO1FBQ3JCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVk7WUFDOUIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO29CQUNwQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN2QyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDL0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUU7b0JBQ2hDLENBQUMsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO29CQUNqQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFDRCxVQUFVLENBQUMsTUFBVztRQUNwQixNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjO1lBQ2hDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNoQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7b0JBQ3BDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3ZDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUMvQixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRTtvQkFDaEMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7b0JBQ2pDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUNELGFBQWEsQ0FBQyxNQUFXO1FBQ3ZCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWM7WUFDaEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO29CQUNwQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN2QyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDL0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUU7b0JBQ2hDLENBQUMsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO29CQUNqQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTyxXQUFXO1FBQ2pCLE9BQU8sSUFBSSxJQUFJLENBQ2IsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRTtZQUNuRSxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUk7WUFDL0MsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUN6QyxDQUFDO0lBQ0osQ0FBQzs7OEdBL01VLGlCQUFpQjtrR0FBakIsaUJBQWlCLDRTQVRqQjtRQUNUO1lBQ0UsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixXQUFXLEVBQUUsaUJBQWlCO1lBQzlCLEtBQUssRUFBRSxJQUFJO1NBQ1o7S0FDRiwrQ0NiSCxnakpBK0ZBOzJGRC9FYSxpQkFBaUI7a0JBWjdCLFNBQVM7K0JBQ0UsY0FBYyxhQUViO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsbUJBQW1COzRCQUM5QixLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTTswRUFLL0MsS0FBSztzQkFESixLQUFLO2dCQUdOLElBQUk7c0JBREgsS0FBSztnQkFHTixPQUFPO3NCQUROLEtBQUs7Z0JBT04sUUFBUTtzQkFEUCxLQUFLO2dCQUtGLFlBQVk7c0JBRGYsS0FBSztnQkFXSSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBR1AsUUFBUTtzQkFEUCxLQUFLO2dCQUdOLFFBQVE7c0JBRFAsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOd2JEYXRlUGlja2VyRXZlbnQsIE53YkRhdGVQaWNrZXJPcHRpb25zIH0gZnJvbSAnQHdpemlzaG9wL25nLXdpemktYnVsbWEnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3YWMtY2FsZW5kYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBDYWxlbmRhckNvbXBvbmVudCxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBDYWxlbmRhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIC8vISBBdCB0aGUgbW9tZW50LCB0aGUgY29tcG9uZW50IGhhbmRsZSBvbmx5IG9uZSBkYXRlIChub3QgYSByYW5nZSlcbiAgQElucHV0KClcbiAgbGFiZWw6IHN0cmluZyB8IG51bGw7XG4gIEBJbnB1dCgpXG4gIHR5cGU6ICdpbnB1dCcgfCAnZWRpdCcgfCAnc2VsZWN0JyA9ICdpbnB1dCc7XG4gIEBJbnB1dCgpXG4gIG9wdGlvbnM6IE53YkRhdGVQaWNrZXJPcHRpb25zID0ge1xuICAgIGRpc3BsYXlNb2RlOiAnaW5saW5lJyxcbiAgICBzaG93SGVhZGVyOiBmYWxzZSxcbiAgICBzaG93Rm9vdGVyOiB0cnVlLFxuICB9O1xuICBASW5wdXQoKVxuICBwb3NpdGlvbiA9ICdib3R0b20nO1xuXG4gIF9kYXRlU2VsZWN0ZWQ6IERhdGUgPSBuZXcgRGF0ZSgpOyAvLyB0b2RvIG9ubHkgYWxsb3cgZGF0ZVxuICBASW5wdXQoKVxuICBzZXQgZGF0ZVNlbGVjdGVkKGRhdGVTZWxlY3RlZDogRGF0ZSkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2RhdGVTZWxlY3RlZCA9IGRhdGVTZWxlY3RlZDtcbiAgICB0aGlzLnNldENhbGVuZGFyRGF0ZSgpO1xuICB9XG4gIGdldCBkYXRlU2VsZWN0ZWQoKSA6IERhdGUge1xuICAgIHJldHVybiB0aGlzLl9kYXRlU2VsZWN0ZWQ7XG4gIH1cbiAgQE91dHB1dCgpIGRhdGVTZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASW5wdXQoKVxuICB0eXBlRGF0ZTogJ2RhdGV0aW1lJyB8ICdkYXRldGltZS1sb2NhbCcgfCAnZGF0ZScgPSAnZGF0ZXRpbWUtbG9jYWwnOyAvLyB0b2RvIGNoZWNrIHdoeSBpdCBpcyBicm9rZW5cbiAgQElucHV0KClcbiAgbm9NYXJnaW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBjaGFuZ2VEYXRhID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0YXJ0RGF0ZTogRGF0ZTsgZW5kRGF0ZTogRGF0ZTsgfT4oKTtcbiAgb3BlbiA9IGZhbHNlO1xuICBzdGFydExhYmVsID0gJyc7XG4gIGVuZExhYmVsID0gJyc7XG4gIGN1cnJlbnRIb3VyczogYW55O1xuICBjdXJyZW50TWludXRlczogYW55O1xuICBjdXJyZW50RGF0ZTogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRDYWxlbmRhckxhYmVsKCk7XG4gICAgdGhpcy5zZXRDYWxlbmRhckRhdGUoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5sYWJlbCB8fCBjaGFuZ2VzLnR5cGUpIHtcbiAgICAgIHRoaXMuc2V0Q2FsZW5kYXJMYWJlbCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLnR5cGVEYXRlKSB7XG4gICAgICB0aGlzLnR5cGVEYXRlQ2hhbmdlKCk7XG4gICAgfVxuICB9XG5cbiAgd3JpdGVWYWx1ZShkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGF0ZVNlbGVjdGVkID0gZGF0ZTtcbiAgfVxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpe1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KXtcbiAgICAgIHRoaXMub25Ub3VjaCA9IGZuO1xuICB9XG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgb25DaGFuZ2VEYXRlKHNlbGVjdGVkRGF0ZXM6IE53YkRhdGVQaWNrZXJFdmVudCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50RGF0ZSA9IG5ldyBEYXRlKG5ldyBEYXRlKHNlbGVjdGVkRGF0ZXMuc3RhcnREYXRlKS5zZXRIb3VycygwLCAwLCAwLCAwKSk7XG4gICAgdGhpcy5zZXREYXRlU2VsZWN0ZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RGF0ZVNlbGVjdGVkKCkge1xuICAgIHRoaXMuZGF0ZVNlbGVjdGVkID0gdGhpcy5nZXREYXRlRGF0YSgpO1xuICAgIHRoaXMub25DaGFuZ2UodGhpcy5kYXRlU2VsZWN0ZWQpO1xuXG4gICAgdGhpcy5kYXRlU2VsZWN0ZWRDaGFuZ2UuZW1pdCh0aGlzLmRhdGVTZWxlY3RlZCk7XG4gICAgdGhpcy50cmlnZ2VyQ2hhbmdlKHtcbiAgICAgIHN0YXJ0RGF0ZTogdGhpcy5kYXRlU2VsZWN0ZWQsXG4gICAgICBlbmREYXRlOiB0aGlzLmRhdGVTZWxlY3RlZFxuICAgIH0pO1xuICB9XG5cbiAgdHJpZ2dlckNoYW5nZShldmVudDogeyBzdGFydERhdGU6IERhdGU7IGVuZERhdGU6IERhdGU7IH0pIHtcbiAgICB0aGlzLmNoYW5nZURhdGEuZW1pdChldmVudCk7XG4gIH1cblxuICBvcGVuQ2FsZW5kYXIodmFsdWUgPSBudWxsKSB7XG4gICAgaWYgKHZhbHVlID09PSAnY2xvc2UnKSB7XG4gICAgICBpZiAodGhpcy5vcGVuKSB7XG4gICAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uVG91Y2goKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVuID0gIXRoaXMub3BlbjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldENhbGVuZGFyRGF0ZSgpIHtcblxuICAgIHRoaXMuY3VycmVudEhvdXJzID0gdGhpcy5kYXRlU2VsZWN0ZWQuZ2V0SG91cnMoKSA8IDEwID8gJzAnICsgdGhpcy5kYXRlU2VsZWN0ZWQuZ2V0SG91cnMoKSA6IHRoaXMuZGF0ZVNlbGVjdGVkLmdldEhvdXJzKCk7XG4gICAgdGhpcy5jdXJyZW50TWludXRlcyA9IHRoaXMuZGF0ZVNlbGVjdGVkLmdldE1pbnV0ZXMoKSA8IDEwID8gJzAnICsgdGhpcy5kYXRlU2VsZWN0ZWQuZ2V0TWludXRlcygpIDogdGhpcy5kYXRlU2VsZWN0ZWQuZ2V0TWludXRlcygpO1xuICAgIHRoaXMuY3VycmVudERhdGUgPSBuZXcgRGF0ZSh0aGlzLmRhdGVTZWxlY3RlZC5zZXRIb3VycygwLCAwLCAwLCAwKSk7XG5cbiAgICBpZiAodGhpcy50eXBlRGF0ZSA9PT0gJ2RhdGUnKSB7XG4gICAgICB0aGlzLmN1cnJlbnRIb3VycyA9ICcwMCc7XG4gICAgICB0aGlzLmN1cnJlbnRNaW51dGVzID0gJzAwJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHR5cGVEYXRlQ2hhbmdlKCkge1xuICAgIGlmICh0aGlzLnR5cGVEYXRlID09PSAnZGF0ZScpIHtcbiAgICAgIHRoaXMuY3VycmVudEhvdXJzID0gJzAwJztcbiAgICAgIHRoaXMuY3VycmVudE1pbnV0ZXMgPSAnMDAnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2FsZW5kYXJMYWJlbCgpIHtcbiAgICBpZiAodGhpcy50eXBlID09PSAnZWRpdCcgJiYgdGhpcy5sYWJlbCkge1xuICAgICAgY29uc3Qgc3BsaXRMYWJlbCA9IHRoaXMubGFiZWwuc3BsaXQoJ3t4fScpO1xuICAgICAgaWYgKHNwbGl0TGFiZWwubGVuZ3RoID4gMSkge1xuICAgICAgICB0aGlzLnN0YXJ0TGFiZWwgPSBzcGxpdExhYmVsWzBdO1xuICAgICAgICB0aGlzLmVuZExhYmVsID0gc3BsaXRMYWJlbFsxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RhcnRMYWJlbCA9IHRoaXMubGFiZWw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmVyaWZLZXl1cChldmVudHM6IGFueSkge1xuICAgIGV2ZW50cy50YXJnZXQudmFsdWUgPSBldmVudHMudGFyZ2V0LnZhbHVlLnJlcGxhY2UoL1xcRCsvZywgJycpO1xuICB9XG4gIHZlcmlmSG91cnMoZXZlbnRzOiBhbnkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSW50KGV2ZW50cy50YXJnZXQudmFsdWUsIDApO1xuICAgIGV2ZW50cy50YXJnZXQudmFsdWUgPSB0aGlzLmN1cnJlbnRIb3VycyA9IHZhbHVlIDwgMjQgPyAodmFsdWUgPCAxMCA/ICcwJyArIHZhbHVlIDogdmFsdWUpIDogMjM7XG4gICAgdGhpcy5zZXREYXRlU2VsZWN0ZWQoKTtcbiAgfVxuICB2ZXJpZk1pbnV0ZXMoZXZlbnRzOiBhbnkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSW50KGV2ZW50cy50YXJnZXQudmFsdWUsIDApO1xuICAgIGV2ZW50cy50YXJnZXQudmFsdWUgPSB0aGlzLmN1cnJlbnRNaW51dGVzID0gdmFsdWUgPCA2MCA/ICh2YWx1ZSA8IDEwID8gJzAnICsgdmFsdWUgOiB2YWx1ZSkgOiA1OTtcbiAgICB0aGlzLnNldERhdGVTZWxlY3RlZCgpO1xuICB9XG4gIGFkZEhvdXJzKHRhcmdldDogYW55KSB7XG4gICAgdGFyZ2V0LnZhbHVlID0gdGhpcy5jdXJyZW50SG91cnMgPVxuICAgICAgcGFyc2VJbnQodGFyZ2V0LnZhbHVlLCAwKSArIDEgPCAyNFxuICAgICAgICA/IHBhcnNlSW50KHRhcmdldC52YWx1ZSwgMCkgKyAxIDwgMTBcbiAgICAgICAgPyAnMCcgKyAocGFyc2VJbnQodGFyZ2V0LnZhbHVlLCAwKSArIDEpXG4gICAgICAgIDogcGFyc2VJbnQodGFyZ2V0LnZhbHVlLCAwKSArIDFcbiAgICAgICAgOiBwYXJzZUludCh0YXJnZXQudmFsdWUsIDApIDwgMTBcbiAgICAgICAgPyAnMCcgKyBwYXJzZUludCh0YXJnZXQudmFsdWUsIDApXG4gICAgICAgIDogcGFyc2VJbnQodGFyZ2V0LnZhbHVlLCAwKTtcbiAgICAgICAgdGhpcy5zZXREYXRlU2VsZWN0ZWQoKTtcbiAgfVxuICByZW1vdmVIb3Vycyh0YXJnZXQ6IGFueSkge1xuICAgIHRhcmdldC52YWx1ZSA9IHRoaXMuY3VycmVudEhvdXJzID1cbiAgICAgIHBhcnNlSW50KHRhcmdldC52YWx1ZSwgMCkgLSAxID4gLTFcbiAgICAgICAgPyBwYXJzZUludCh0YXJnZXQudmFsdWUsIDApIC0gMSA8IDEwXG4gICAgICAgID8gJzAnICsgKHBhcnNlSW50KHRhcmdldC52YWx1ZSwgMCkgLSAxKVxuICAgICAgICA6IHBhcnNlSW50KHRhcmdldC52YWx1ZSwgMCkgLSAxXG4gICAgICAgIDogcGFyc2VJbnQodGFyZ2V0LnZhbHVlLCAwKSA8IDEwXG4gICAgICAgID8gJzAnICsgcGFyc2VJbnQodGFyZ2V0LnZhbHVlLCAwKVxuICAgICAgICA6IHBhcnNlSW50KHRhcmdldC52YWx1ZSwgMCk7XG4gICAgICAgIHRoaXMuc2V0RGF0ZVNlbGVjdGVkKCk7XG4gIH1cbiAgYWRkTWludXRlcyh0YXJnZXQ6IGFueSkge1xuICAgIHRhcmdldC52YWx1ZSA9IHRoaXMuY3VycmVudE1pbnV0ZXMgPVxuICAgICAgcGFyc2VJbnQodGFyZ2V0LnZhbHVlLCAwKSArIDEgPCA2MFxuICAgICAgICA/IHBhcnNlSW50KHRhcmdldC52YWx1ZSwgMCkgKyAxIDwgMTBcbiAgICAgICAgPyAnMCcgKyAocGFyc2VJbnQodGFyZ2V0LnZhbHVlLCAwKSArIDEpXG4gICAgICAgIDogcGFyc2VJbnQodGFyZ2V0LnZhbHVlLCAwKSArIDFcbiAgICAgICAgOiBwYXJzZUludCh0YXJnZXQudmFsdWUsIDApIDwgMTBcbiAgICAgICAgPyAnMCcgKyBwYXJzZUludCh0YXJnZXQudmFsdWUsIDApXG4gICAgICAgIDogcGFyc2VJbnQodGFyZ2V0LnZhbHVlLCAwKTtcbiAgICAgICAgdGhpcy5zZXREYXRlU2VsZWN0ZWQoKTtcbiAgfVxuICByZW1vdmVNaW51dGVzKHRhcmdldDogYW55KSB7XG4gICAgdGFyZ2V0LnZhbHVlID0gdGhpcy5jdXJyZW50TWludXRlcyA9XG4gICAgICBwYXJzZUludCh0YXJnZXQudmFsdWUsIDApIC0gMSA+IC0xXG4gICAgICAgID8gcGFyc2VJbnQodGFyZ2V0LnZhbHVlLCAwKSAtIDEgPCAxMFxuICAgICAgICA/ICcwJyArIChwYXJzZUludCh0YXJnZXQudmFsdWUsIDApIC0gMSlcbiAgICAgICAgOiBwYXJzZUludCh0YXJnZXQudmFsdWUsIDApIC0gMVxuICAgICAgICA6IHBhcnNlSW50KHRhcmdldC52YWx1ZSwgMCkgPCAxMFxuICAgICAgICA/ICcwJyArIHBhcnNlSW50KHRhcmdldC52YWx1ZSwgMClcbiAgICAgICAgOiBwYXJzZUludCh0YXJnZXQudmFsdWUsIDApO1xuICAgICAgICB0aGlzLnNldERhdGVTZWxlY3RlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRlRGF0YSgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoXG4gICAgICBuZXcgRGF0ZShuZXcgRGF0ZSh0aGlzLmN1cnJlbnREYXRlKS5zZXRIb3VycygwLCAwLCAwLCAwKSkuZ2V0VGltZSgpICtcbiAgICAgIHBhcnNlSW50KHRoaXMuY3VycmVudEhvdXJzLCAwKSAqIDYwICogNjAgKiAxMDAwICtcbiAgICAgIHBhcnNlSW50KHRoaXMuY3VycmVudE1pbnV0ZXMsIDApICogNjAwMDBcbiAgICApO1xuICB9XG5cbiAgIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIG1ldGhvZHNcblxuICAgb25DaGFuZ2U6ICh2YWx1ZTogRGF0ZSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICBvblRvdWNoOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJ3YWMtY2FsZW5kYXJcIlxuICBbbmdDbGFzc109XCJ7XG4gICAgJ3dhYy1jYWxlbmRhci0taW5wdXQnOiB0eXBlID09PSAnaW5wdXQnLFxuICAgICd3YWMtY2FsZW5kYXItLWVkaXQnOiB0eXBlID09PSAnZWRpdCcsXG4gICAgJ3dhYy1jYWxlbmRhci0tc2VsZWN0JzogdHlwZSA9PT0gJ3NlbGVjdCcsXG4gICAgJ3dhYy1jYWxlbmRhci0tbm8tbWFyZ2luJzogbm9NYXJnaW4sXG4gICAgJ3dhYy1jYWxlbmRhci0tb3Blbic6IG9wZW5cbiAgfVwiXG4gIFt6SW5kZXhUb2dnbGVdPVwib3BlblwiXG4+XG4gIDxwIGNsYXNzPVwid2FjLWNhbGVuZGFyX19sYWJlbFwiICpuZ0lmPVwibGFiZWwgJiYgKHR5cGUgPT09ICdpbnB1dCcgfHwgdHlwZSA9PT0gJ3NlbGVjdCcpXCIgKGNsaWNrKT1cIm9wZW5DYWxlbmRhcigpXCI+e3sgbGFiZWwgfX08L3A+XG4gIDxwIGNsYXNzPVwid2FjLWNhbGVuZGFyX19zdGFydExhYmVsXCIgKm5nSWY9XCJ0eXBlID09PSAnZWRpdCdcIj57eyBzdGFydExhYmVsIH19PC9wPlxuICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX19hdXRvSGlkZVwiIHd6QXV0b0hpZGUgKGNsaWNrT3V0c2lkZSk9XCJvcGVuQ2FsZW5kYXIoJ2Nsb3NlJylcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX193cmFwcGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX193cmFwcGVyX19pbnB1dFwiICpuZ0lmPVwidHlwZSA9PT0gJ2lucHV0J1wiIChjbGljayk9XCJvcGVuQ2FsZW5kYXIoKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX193cmFwcGVyX19pbnB1dF9faWNvblwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLWNhbGVuZGFyLWFsdFwiPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3YWMtY2FsZW5kYXJfX3dyYXBwZXJfX2lucHV0X19kYXRlXCI+XG4gICAgICAgICAge3sgZGF0ZVNlbGVjdGVkIHwgZGF0ZTogJ2RkL01NL3l5eXknIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX193cmFwcGVyX19pbnB1dF9fdGltZVwiPlxuICAgICAgICAgIHt7IGRhdGVTZWxlY3RlZCB8IGRhdGU6ICdISDptbScgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3YWMtY2FsZW5kYXJfX3dyYXBwZXJfX2VkaXRJblBsYWNlXCIgKm5nSWY9XCJ0eXBlID09PSAnZWRpdCdcIiAoY2xpY2spPVwib3BlbkNhbGVuZGFyKClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndhYy1jYWxlbmRhcl9fd3JhcHBlcl9fZWRpdEluUGxhY2VfX2ljb25cIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhbCBmYS1jYWxlbmRhci1hbHRcIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX193cmFwcGVyX19lZGl0SW5QbGFjZV9fZGF0ZVwiPlxuICAgICAgICAgIHt7IGRhdGVTZWxlY3RlZCB8IGRhdGU6ICdkZC9NTS95eXl5IEhIOm1tJyB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIndhYy1jYWxlbmRhcl9fd3JhcHBlcl9fc2VsZWN0XCIgKm5nSWY9XCJ0eXBlID09PSAnc2VsZWN0J1wiIChjbGljayk9XCJvcGVuQ2FsZW5kYXIoKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX193cmFwcGVyX19zZWxlY3RfX2ljb25cIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhbCBmYS1jYWxlbmRhci1hbHRcIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX193cmFwcGVyX19zZWxlY3RfX2RhdGVcIj5cbiAgICAgICAgICB7eyBkYXRlU2VsZWN0ZWQgfCBkYXRlOiAnZGQvTU0veXl5eSBISDptbScgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cIndhYy1jYWxlbmRhcl9fYWJzb2x1dGVcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICB0b3A6IHBvc2l0aW9uID09PSAndG9wJyxcbiAgICAgICAgYm90dG9tOiBwb3NpdGlvbiA9PT0gJ2JvdHRvbScsXG4gICAgICAgIGxlZnQ6IHBvc2l0aW9uID09PSAnbGVmdCcsXG4gICAgICAgIHJpZ2h0OiBwb3NpdGlvbiA9PT0gJ3JpZ2h0JyxcbiAgICAgICAgJ3JpZ2h0LXRvcCc6IHBvc2l0aW9uID09PSAncmlnaHQtdG9wJyxcbiAgICAgICAgJ3JpZ2h0LWJvdHRvbSc6IHBvc2l0aW9uID09PSAncmlnaHQtYm90dG9tJyxcbiAgICAgICAgJ2xlZnQtdG9wJzogcG9zaXRpb24gPT09ICdsZWZ0LXRvcCcsXG4gICAgICAgICdsZWZ0LWJvdHRvbSc6IHBvc2l0aW9uID09PSAnbGVmdC1ib3R0b20nLFxuICAgICAgICAnd2l0aC10aW1lJzogdHlwZURhdGUgPT09ICdkYXRldGltZS1sb2NhbCcgfHwgdHlwZURhdGUgPT09ICdkYXRldGltZSdcbiAgICAgIH1cIlxuICAgID5cbiAgICAgIDxud2ItZGF0ZS1waWNrZXIgI2RhdGVQaWNrZXIgKGNoYW5nZSk9XCJvbkNoYW5nZURhdGUoJGV2ZW50KVwiIFtvcHRpb25zXT1cIm9wdGlvbnNcIj5cblxuICAgICAgICA8aW5wdXQgW253YkRhdGVwaWNrZXJTdGFydF09XCJkYXRlUGlja2VyXCIgdHlwZT1cInRleHRcIiBbbndiRGF0ZVR5cGVdPVwiJ2RhdGUnXCIgW3ZhbHVlXT1cImRhdGVTZWxlY3RlZC50b0lTT1N0cmluZygpXCIgLz5cbiAgICAgIDwvbndiLWRhdGUtcGlja2VyPlxuICAgICAgPGRpdiBjbGFzcz1cIndhYy1jYWxlbmRhcl9fYWJzb2x1dGVfX3RpbWVcIiAqbmdJZj1cInR5cGVEYXRlID09PSAnZGF0ZXRpbWUtbG9jYWwnIHx8IHR5cGVEYXRlID09PSAnZGF0ZXRpbWUnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3YWMtY2FsZW5kYXJfX2Fic29sdXRlX190aW1lX193cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIndhYy1jYWxlbmRhcl9fYWJzb2x1dGVfX3RpbWVfX3dyYXBwZXJfX2hvdXJzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX19hYnNvbHV0ZV9fdGltZV9fd3JhcHBlcl9faG91cnNfX2xlZnRcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIndhYy1jYWxlbmRhcl9fYWJzb2x1dGVfX3RpbWVfX3dyYXBwZXJfX2hvdXJzX19idG5cIiAoY2xpY2spPVwiYWRkSG91cnMoaG91cnMpXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGx1c1wiPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ3YWMtY2FsZW5kYXJfX2Fic29sdXRlX190aW1lX193cmFwcGVyX19ob3Vyc19fYnRuXCIgKGNsaWNrKT1cInJlbW92ZUhvdXJzKGhvdXJzKVwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLW1pbnVzXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndhYy1jYWxlbmRhcl9fYWJzb2x1dGVfX3RpbWVfX3dyYXBwZXJfX2hvdXJzX19yaWdodFwiPlxuICAgICAgICAgICAgICA8aW5wdXQgI2hvdXJzIHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cImN1cnJlbnRIb3Vyc1wiIChrZXl1cCk9XCJ2ZXJpZktleXVwKCRldmVudClcIiAoYmx1cik9XCJ2ZXJpZkhvdXJzKCRldmVudClcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIndhYy1jYWxlbmRhcl9fYWJzb2x1dGVfX3RpbWVfX3dyYXBwZXJfX21pbnV0ZXNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWMtY2FsZW5kYXJfX2Fic29sdXRlX190aW1lX193cmFwcGVyX19taW51dGVzX19sZWZ0XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCAjbWludXRlcyB0eXBlPVwidGV4dFwiIFt2YWx1ZV09XCJjdXJyZW50TWludXRlc1wiIChrZXl1cCk9XCJ2ZXJpZktleXVwKCRldmVudClcIiAoYmx1cik9XCJ2ZXJpZk1pbnV0ZXMoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWMtY2FsZW5kYXJfX2Fic29sdXRlX190aW1lX193cmFwcGVyX19taW51dGVzX19yaWdodFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwid2FjLWNhbGVuZGFyX19hYnNvbHV0ZV9fdGltZV9fd3JhcHBlcl9fbWludXRlc19fYnRuXCIgKGNsaWNrKT1cImFkZE1pbnV0ZXMobWludXRlcylcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wbHVzXCI+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIndhYy1jYWxlbmRhcl9fYWJzb2x1dGVfX3RpbWVfX3dyYXBwZXJfX21pbnV0ZXNfX2J0blwiIChjbGljayk9XCJyZW1vdmVNaW51dGVzKG1pbnV0ZXMpXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtbWludXNcIj48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8cCBjbGFzcz1cIndhYy1jYWxlbmRhcl9fZW5kTGFiZWxcIiAqbmdJZj1cInR5cGUgPT09ICdlZGl0J1wiPnt7IGVuZExhYmVsIH19PC9wPlxuPC9kaXY+XG4iXX0=
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUE0Qix1QkFBdUIsRUFBRSxTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFDakosT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7QUFnQnpFLE1BQU0sT0FBTyxpQkFBaUI7SUFvRTVCLFlBQW9CLFFBQWtCO1FBQWxCLGFBQVEsR0FBUixRQUFRLENBQVU7UUE1RHRDLFNBQUksR0FBZ0MsT0FBTyxDQUFDO1FBRTVDLFlBQU8sR0FBeUI7WUFDOUIsV0FBVyxFQUFFLFFBQVE7WUFDckIsVUFBVSxFQUFFLEtBQUs7WUFDakIsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQztRQUVGLGFBQVEsR0FBRyxRQUFRLENBQUM7UUFZcEIsa0JBQWEsR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1FBRXZCLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFHbEQsYUFBUSxHQUEyQyxnQkFBZ0IsQ0FBQyxDQUFDLDhCQUE4QjtRQUVuRyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRVIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVoQixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQXVD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O2dCQUdQLFFBQVE7c0JBRFAsS0FBSztnQkFHTixRQUFRO3NCQURQLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIFZpZXdDaGlsZCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTndiRGF0ZVBpY2tlckV2ZW50LCBOd2JEYXRlUGlja2VyT3B0aW9ucyB9IGZyb20gJ0B3aXppc2hvcC9uZy13aXppLWJ1bG1hJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd2FjLWNhbGVuZGFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogQ2FsZW5kYXJDb21wb25lbnQsXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH0sXG4gICAgRGF0ZVBpcGVcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgLy8hIEF0IHRoZSBtb21lbnQsIHRoZSBjb21wb25lbnQgaGFuZGxlIG9ubHkgb25lIGRhdGUgKG5vdCBhIHJhbmdlKVxuICBAVmlld0NoaWxkKCdtaW51dGVzJykgbWludXRlczogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnaG91cnMnKSBob3VyczogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKVxuICBsYWJlbDogc3RyaW5nIHwgbnVsbDtcbiAgQElucHV0KClcbiAgdHlwZTogJ2lucHV0JyB8ICdlZGl0JyB8ICdzZWxlY3QnID0gJ2lucHV0JztcbiAgQElucHV0KClcbiAgb3B0aW9uczogTndiRGF0ZVBpY2tlck9wdGlvbnMgPSB7XG4gICAgZGlzcGxheU1vZGU6ICdpbmxpbmUnLFxuICAgIHNob3dIZWFkZXI6IGZhbHNlLFxuICAgIHNob3dGb290ZXI6IHRydWUsXG4gIH07XG4gIEBJbnB1dCgpXG4gIHBvc2l0aW9uID0gJ2JvdHRvbSc7XG5cbiAgQElucHV0KClcbiAgc2V0IGRhdGVTZWxlY3RlZChkYXRlU2VsZWN0ZWQ6IERhdGUpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9kYXRlU2VsZWN0ZWQgPSBuZXcgRGF0ZShkYXRlU2VsZWN0ZWQpOyAvLyB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gZm9yIHB1cmUgcGlwZVxuICB9XG4gIGdldCBkYXRlU2VsZWN0ZWQoKSA6IERhdGUge1xuICAgIHJldHVybiB0aGlzLl9kYXRlU2VsZWN0ZWQ7XG4gIH1cbiAgX2RhdGVTZWxlY3RlZDogRGF0ZSA9IG5ldyBEYXRlKCk7XG5cbiAgQE91dHB1dCgpIGRhdGVTZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASW5wdXQoKVxuICB0eXBlRGF0ZTogJ2RhdGV0aW1lJyB8ICdkYXRldGltZS1sb2NhbCcgfCAnZGF0ZScgPSAnZGF0ZXRpbWUtbG9jYWwnOyAvLyB0b2RvIGNoZWNrIHdoeSBpdCBpcyBicm9rZW5cbiAgQElucHV0KClcbiAgbm9NYXJnaW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBjaGFuZ2VEYXRhID0gbmV3IEV2ZW50RW1pdHRlcjx7IHN0YXJ0RGF0ZTogRGF0ZTsgZW5kRGF0ZTogRGF0ZTsgfT4oKTtcbiAgb3BlbiA9IGZhbHNlO1xuICBzdGFydExhYmVsID0gJyc7XG4gIGVuZExhYmVsID0gJyc7XG5cbiAgc2V0IGNhbGVuZGFyTWludXRlcyhjYWxlbmRhck1pbnV0ZXM6IHN0cmluZykge1xuICAgIGNvbnN0IG1pbnV0ZXMgPSB0aGlzLmZvcm1hdFRpbWUoY2FsZW5kYXJNaW51dGVzLCAwLCA1OSk7XG4gICAgdGhpcy5kYXRlU2VsZWN0ZWQuc2V0TWludXRlcyhtaW51dGVzKTtcbiAgICB0aGlzLmRhdGVTZWxlY3RlZCA9IHRoaXMuZGF0ZVNlbGVjdGVkOyAvLyB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICB0aGlzLm1pbnV0ZXMubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuZGF0ZVNlbGVjdGVkLCAnbW0nKTsgLy8gZm9yY2UgdG8gdXBkYXRlIHRoZSBpbnB1dCB2YWx1ZVxuICAgIHRoaXMudHJpZ2dlckRhdGVTZWxlY3RlZENoYW5nZSgpO1xuICB9XG5cbiAgZ2V0IGNhbGVuZGFyTWludXRlcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh0aGlzLmRhdGVTZWxlY3RlZCwgJ21tJyk7XG4gIH1cblxuICBzZXQgY2FsZW5kYXJIb3VycyhjYWxlbmRhckhvdXJzOiBzdHJpbmcpIHtcbiAgICBjb25zdCBob3VycyA9IHRoaXMuZm9ybWF0VGltZShjYWxlbmRhckhvdXJzLCAwLCAyMyk7XG4gICAgdGhpcy5kYXRlU2VsZWN0ZWQuc2V0SG91cnMoaG91cnMpO1xuICAgIHRoaXMuZGF0ZVNlbGVjdGVkID0gdGhpcy5kYXRlU2VsZWN0ZWQ7IC8vIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICAgIHRoaXMuaG91cnMubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHRoaXMuZGF0ZVNlbGVjdGVkLCAnSEgnKTsgLy8gZm9yY2UgdG8gdXBkYXRlIHRoZSBpbnB1dCB2YWx1ZVxuICAgIHRoaXMudHJpZ2dlckRhdGVTZWxlY3RlZENoYW5nZSgpO1xuICB9XG5cbiAgZ2V0IGNhbGVuZGFySG91cnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odGhpcy5kYXRlU2VsZWN0ZWQsICdISCcpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUpIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmxhYmVsIHx8IGNoYW5nZXMudHlwZSkge1xuICAgICAgdGhpcy5zZXRDYWxlbmRhckxhYmVsKCk7XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2VEYXRlKHNlbGVjdGVkRGF0ZXM6IE53YkRhdGVQaWNrZXJFdmVudCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VsZWN0ZWREYXRlcy5zdGFydERhdGUuc2V0SG91cnModGhpcy5kYXRlU2VsZWN0ZWQuZ2V0SG91cnMoKSk7XG4gICAgc2VsZWN0ZWREYXRlcy5zdGFydERhdGUuc2V0TWludXRlcyh0aGlzLmRhdGVTZWxlY3RlZC5nZXRNaW51dGVzKCkpO1xuXG4gICAgdGhpcy5kYXRlU2VsZWN0ZWQgPSBzZWxlY3RlZERhdGVzLnN0YXJ0RGF0ZTtcbiAgICB0aGlzLnRyaWdnZXJEYXRlU2VsZWN0ZWRDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpZ2dlckRhdGVTZWxlY3RlZENoYW5nZSgpIHtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZGF0ZVNlbGVjdGVkKTtcbiAgICB0aGlzLmRhdGVTZWxlY3RlZENoYW5nZS5lbWl0KHRoaXMuZGF0ZVNlbGVjdGVkKTtcbiAgICB0aGlzLnRyaWdnZXJDaGFuZ2Uoe1xuICAgICAgc3RhcnREYXRlOiB0aGlzLmRhdGVTZWxlY3RlZCxcbiAgICAgIGVuZERhdGU6IHRoaXMuZGF0ZVNlbGVjdGVkXG4gICAgfSk7XG4gIH1cblxuICB0cmlnZ2VyQ2hhbmdlKGV2ZW50OiB7IHN0YXJ0RGF0ZTogRGF0ZTsgZW5kRGF0ZTogRGF0ZTsgfSkge1xuICAgIHRoaXMuY2hhbmdlRGF0YS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9wZW5DYWxlbmRhcih2YWx1ZSA9IG51bGwpIHtcblxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnY2xvc2UnKSB7XG4gICAgICBpZiAodGhpcy5vcGVuKSB7XG4gICAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uVG91Y2goKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVuID0gIXRoaXMub3BlbjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldENhbGVuZGFyTGFiZWwoKSB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2VkaXQnICYmIHRoaXMubGFiZWwpIHtcbiAgICAgIGNvbnN0IHNwbGl0TGFiZWwgPSB0aGlzLmxhYmVsLnNwbGl0KCd7eH0nKTtcbiAgICAgIGlmIChzcGxpdExhYmVsLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdGhpcy5zdGFydExhYmVsID0gc3BsaXRMYWJlbFswXTtcbiAgICAgICAgdGhpcy5lbmRMYWJlbCA9IHNwbGl0TGFiZWxbMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXJ0TGFiZWwgPSB0aGlzLmxhYmVsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGluY3JlbWVudE1pbnV0ZXMoKSB7XG4gICAgdGhpcy5jYWxlbmRhck1pbnV0ZXMgPSBwYXJzZUludCh0aGlzLmNhbGVuZGFyTWludXRlcywgMTApICsgMSArICcnO1xuICB9XG5cbiAgZGVjcmVtZW50c01pbnV0ZXMoKSB7XG4gICAgdGhpcy5jYWxlbmRhck1pbnV0ZXMgPSBwYXJzZUludCh0aGlzLmNhbGVuZGFyTWludXRlcywgMTApIC0gMSArICcnO1xuICB9XG5cbiAgaW5jcmVtZW50SG91cnMoKSB7XG4gICAgdGhpcy5jYWxlbmRhckhvdXJzID0gcGFyc2VJbnQodGhpcy5jYWxlbmRhckhvdXJzLCAxMCkgKyAxICsgJyc7XG4gIH1cblxuICBkZWNyZW1lbnRIb3VycygpIHtcbiAgICB0aGlzLmNhbGVuZGFySG91cnMgPSBwYXJzZUludCh0aGlzLmNhbGVuZGFySG91cnMsIDEwKSAtIDEgKyAnJztcbiAgfVxuXG4gIC8qXG4gICAgRW5zdXJlIHRoYXQgdGhlIGlucHV0IHZhbHVlIGlzIGEgbnVtYmVyIGFuZCB0aGF0IGl0IGlzIGJldHdlZW4gbWluIGFuZCBtYXhcbiAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRUaW1lKHRpbWU6IHN0cmluZyB8IG51bWJlciwgbWluID0gMCwgbWF4ID0gNTkpIHtcbiAgICBsZXQgdGltZU51bWJlciA9IHR5cGVvZiB0aW1lID09PSAnc3RyaW5nJyA/IHBhcnNlSW50KHRpbWUsIDEwKSA6IHRpbWU7XG4gICAgdGltZU51bWJlciA9IHRpbWVOdW1iZXIgPiBtYXggPyBtaW4gOiB0aW1lTnVtYmVyO1xuICAgIHRpbWVOdW1iZXIgPSB0aW1lTnVtYmVyIDwgbWluID8gbWF4IDogdGltZU51bWJlcjtcbiAgICB0aW1lTnVtYmVyID0gcGFyc2VJbnQoKCcnICsgdGltZU51bWJlcikuc2xpY2UoLTIpKTsgLy8ga2VlcHMgb25seSB0aGUgbGFzdCAyIGRpZ2l0c1xuICAgIHJldHVybiB0aW1lTnVtYmVyO1xuICB9XG5cbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3IgbWV0aG9kc1xuXG4gIG9uQ2hhbmdlOiAodmFsdWU6IERhdGUpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICBvblRvdWNoOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgd3JpdGVWYWx1ZShkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGF0ZVNlbGVjdGVkID0gZGF0ZTtcbiAgfVxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpe1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KXtcbiAgICAgIHRoaXMub25Ub3VjaCA9IGZuO1xuICB9XG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwid2FjLWNhbGVuZGFyXCJcbiAgW25nQ2xhc3NdPVwie1xuICAgICd3YWMtY2FsZW5kYXItLWlucHV0JzogdHlwZSA9PT0gJ2lucHV0JyxcbiAgICAnd2FjLWNhbGVuZGFyLS1lZGl0JzogdHlwZSA9PT0gJ2VkaXQnLFxuICAgICd3YWMtY2FsZW5kYXItLXNlbGVjdCc6IHR5cGUgPT09ICdzZWxlY3QnLFxuICAgICd3YWMtY2FsZW5kYXItLW5vLW1hcmdpbic6IG5vTWFyZ2luLFxuICAgICd3YWMtY2FsZW5kYXItLW9wZW4nOiBvcGVuXG4gIH1cIlxuICBbekluZGV4VG9nZ2xlXT1cIm9wZW5cIlxuPlxuICA8cCBjbGFzcz1cIndhYy1jYWxlbmRhcl9fbGFiZWxcIiAqbmdJZj1cImxhYmVsICYmICh0eXBlID09PSAnaW5wdXQnIHx8IHR5cGUgPT09ICdzZWxlY3QnKVwiIChjbGljayk9XCJvcGVuQ2FsZW5kYXIoKVwiPnt7IGxhYmVsIH19PC9wPlxuICA8cCBjbGFzcz1cIndhYy1jYWxlbmRhcl9fc3RhcnRMYWJlbFwiICpuZ0lmPVwidHlwZSA9PT0gJ2VkaXQnXCI+e3sgc3RhcnRMYWJlbCB9fTwvcD5cbiAgPHdhYy1vcHRpb25hbC1kaXNhYmxlLWNvbnRhaW5lciBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX19hdXRvSGlkZVwiIHd6QXV0b0hpZGUgKGNsaWNrT3V0c2lkZSk9XCJvcGVuQ2FsZW5kYXIoJ2Nsb3NlJylcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3YWMtY2FsZW5kYXJfX3dyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndhYy1jYWxlbmRhcl9fd3JhcHBlcl9faW5wdXRcIiAqbmdJZj1cInR5cGUgPT09ICdpbnB1dCdcIiAoY2xpY2spPVwib3BlbkNhbGVuZGFyKClcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX193cmFwcGVyX19pbnB1dF9faWNvblwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtY2FsZW5kYXItYWx0XCI+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWMtY2FsZW5kYXJfX3dyYXBwZXJfX2lucHV0X19kYXRlXCI+XG4gICAgICAgICAgICB7eyBkYXRlU2VsZWN0ZWQgfCBkYXRlOiAnZGQvTU0veXl5eScgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX193cmFwcGVyX19pbnB1dF9fdGltZVwiPlxuICAgICAgICAgICAge3sgZGF0ZVNlbGVjdGVkIHwgZGF0ZTogJ0hIOm1tJyB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndhYy1jYWxlbmRhcl9fd3JhcHBlcl9fZWRpdEluUGxhY2VcIiAqbmdJZj1cInR5cGUgPT09ICdlZGl0J1wiIChjbGljayk9XCJvcGVuQ2FsZW5kYXIoKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWMtY2FsZW5kYXJfX3dyYXBwZXJfX2VkaXRJblBsYWNlX19pY29uXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhbCBmYS1jYWxlbmRhci1hbHRcIj48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIndhYy1jYWxlbmRhcl9fd3JhcHBlcl9fZWRpdEluUGxhY2VfX2RhdGVcIj5cbiAgICAgICAgICAgIHt7IGRhdGVTZWxlY3RlZCB8IGRhdGU6ICdkZC9NTS95eXl5IEhIOm1tJyB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndhYy1jYWxlbmRhcl9fd3JhcHBlcl9fc2VsZWN0XCIgKm5nSWY9XCJ0eXBlID09PSAnc2VsZWN0J1wiIChjbGljayk9XCJvcGVuQ2FsZW5kYXIoKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWMtY2FsZW5kYXJfX3dyYXBwZXJfX3NlbGVjdF9faWNvblwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYWwgZmEtY2FsZW5kYXItYWx0XCI+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWMtY2FsZW5kYXJfX3dyYXBwZXJfX3NlbGVjdF9fZGF0ZVwiPlxuICAgICAgICAgICAge3sgZGF0ZVNlbGVjdGVkIHwgZGF0ZTogJ2RkL01NL3l5eXkgSEg6bW0nIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwid2FjLWNhbGVuZGFyX19hYnNvbHV0ZVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICB0b3A6IHBvc2l0aW9uID09PSAndG9wJyxcbiAgICAgICAgICBib3R0b206IHBvc2l0aW9uID09PSAnYm90dG9tJyxcbiAgICAgICAgICBsZWZ0OiBwb3NpdGlvbiA9PT0gJ2xlZnQnLFxuICAgICAgICAgIHJpZ2h0OiBwb3NpdGlvbiA9PT0gJ3JpZ2h0JyxcbiAgICAgICAgICAncmlnaHQtdG9wJzogcG9zaXRpb24gPT09ICdyaWdodC10b3AnLFxuICAgICAgICAgICdyaWdodC1ib3R0b20nOiBwb3NpdGlvbiA9PT0gJ3JpZ2h0LWJvdHRvbScsXG4gICAgICAgICAgJ2xlZnQtdG9wJzogcG9zaXRpb24gPT09ICdsZWZ0LXRvcCcsXG4gICAgICAgICAgJ2xlZnQtYm90dG9tJzogcG9zaXRpb24gPT09ICdsZWZ0LWJvdHRvbScsXG4gICAgICAgICAgJ3dpdGgtdGltZSc6IHR5cGVEYXRlID09PSAnZGF0ZXRpbWUtbG9jYWwnIHx8IHR5cGVEYXRlID09PSAnZGF0ZXRpbWUnXG4gICAgICAgIH1cIlxuICAgICAgPlxuICAgICAgICA8bndiLWRhdGUtcGlja2VyICNkYXRlUGlja2VyIChjaGFuZ2UpPVwib25DaGFuZ2VEYXRlKCRldmVudClcIiBbb3B0aW9uc109XCJvcHRpb25zXCI+XG4gICAgICAgICAgPGlucHV0IFtud2JEYXRlcGlja2VyU3RhcnRdPVwiZGF0ZVBpY2tlclwiIHR5cGU9XCJ0ZXh0XCIgW253YkRhdGVUeXBlXT1cIidkYXRlJ1wiIFt2YWx1ZV09XCJkYXRlU2VsZWN0ZWQudG9JU09TdHJpbmcoKVwiIC8+XG4gICAgICAgIDwvbndiLWRhdGUtcGlja2VyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX19hYnNvbHV0ZV9fdGltZVwiICpuZ0lmPVwidHlwZURhdGUgPT09ICdkYXRldGltZS1sb2NhbCcgfHwgdHlwZURhdGUgPT09ICdkYXRldGltZSdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX19hYnNvbHV0ZV9fdGltZV9fd3JhcHBlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndhYy1jYWxlbmRhcl9fYWJzb2x1dGVfX3RpbWVfX3dyYXBwZXJfX2hvdXJzXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWMtY2FsZW5kYXJfX2Fic29sdXRlX190aW1lX193cmFwcGVyX19ob3Vyc19fbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ3YWMtY2FsZW5kYXJfX2Fic29sdXRlX190aW1lX193cmFwcGVyX19ob3Vyc19fYnRuXCIgKGNsaWNrKT1cImluY3JlbWVudEhvdXJzKClcIj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXNcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIndhYy1jYWxlbmRhcl9fYWJzb2x1dGVfX3RpbWVfX3dyYXBwZXJfX2hvdXJzX19idG5cIiAoY2xpY2spPVwiZGVjcmVtZW50SG91cnMoKVwiPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtbWludXNcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX19hYnNvbHV0ZV9fdGltZV9fd3JhcHBlcl9faG91cnNfX3JpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0ICNob3VycyB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FsZW5kYXJIb3Vyc1wiIFt3YWNPbmx5TnVtYmVyXT1cInRydWVcIi8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX19hYnNvbHV0ZV9fdGltZV9fd3JhcHBlcl9fbWludXRlc1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FjLWNhbGVuZGFyX19hYnNvbHV0ZV9fdGltZV9fd3JhcHBlcl9fbWludXRlc19fbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCAjbWludXRlcyB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FsZW5kYXJNaW51dGVzXCIgW3dhY09ubHlOdW1iZXJdPVwidHJ1ZVwiLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWMtY2FsZW5kYXJfX2Fic29sdXRlX190aW1lX193cmFwcGVyX19taW51dGVzX19yaWdodFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ3YWMtY2FsZW5kYXJfX2Fic29sdXRlX190aW1lX193cmFwcGVyX19taW51dGVzX19idG5cIiAoY2xpY2spPVwiaW5jcmVtZW50TWludXRlcygpXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1wbHVzXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ3YWMtY2FsZW5kYXJfX2Fic29sdXRlX190aW1lX193cmFwcGVyX19taW51dGVzX19idG5cIiAoY2xpY2spPVwiZGVjcmVtZW50c01pbnV0ZXMoKVwiPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtbWludXNcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvd2FjLW9wdGlvbmFsLWRpc2FibGUtY29udGFpbmVyPlxuICA8cCBjbGFzcz1cIndhYy1jYWxlbmRhcl9fZW5kTGFiZWxcIiAqbmdJZj1cInR5cGUgPT09ICdlZGl0J1wiPnt7IGVuZExhYmVsIH19PC9wPlxuPC9kaXY+XG4iXX0=