cps-ui-kit 18.11.0 → 19.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/fesm2022/cps-ui-kit.mjs +347 -307
  2. package/fesm2022/cps-ui-kit.mjs.map +1 -1
  3. package/lib/components/cps-autocomplete/cps-autocomplete.component.d.ts +2 -2
  4. package/lib/components/cps-menu/cps-menu.component.d.ts +4 -3
  5. package/lib/components/cps-select/cps-select.component.d.ts +2 -2
  6. package/lib/components/cps-tree-table/cps-tree-table.component.d.ts +25 -1
  7. package/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.d.ts +3 -3
  8. package/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.d.ts +3 -3
  9. package/package.json +6 -8
  10. package/styles/styles.scss +9 -0
  11. package/esm2022/cps-ui-kit.mjs +0 -5
  12. package/esm2022/lib/components/cps-autocomplete/cps-autocomplete.component.mjs +0 -948
  13. package/esm2022/lib/components/cps-button/cps-button.component.mjs +0 -205
  14. package/esm2022/lib/components/cps-button-toggle/cps-button-toggle.component.mjs +0 -239
  15. package/esm2022/lib/components/cps-checkbox/cps-checkbox.component.mjs +0 -154
  16. package/esm2022/lib/components/cps-chip/cps-chip.component.mjs +0 -94
  17. package/esm2022/lib/components/cps-datepicker/cps-datepicker.component.mjs +0 -382
  18. package/esm2022/lib/components/cps-divider/cps-divider.component.mjs +0 -60
  19. package/esm2022/lib/components/cps-expansion-panel/cps-expansion-panel.component.mjs +0 -213
  20. package/esm2022/lib/components/cps-file-upload/cps-file-upload.component.mjs +0 -182
  21. package/esm2022/lib/components/cps-icon/cps-icon.component.mjs +0 -203
  22. package/esm2022/lib/components/cps-info-circle/cps-info-circle.component.mjs +0 -61
  23. package/esm2022/lib/components/cps-input/cps-input.component.mjs +0 -385
  24. package/esm2022/lib/components/cps-loader/cps-loader.component.mjs +0 -58
  25. package/esm2022/lib/components/cps-menu/cps-menu.component.mjs +0 -572
  26. package/esm2022/lib/components/cps-paginator/cps-paginator.component.mjs +0 -118
  27. package/esm2022/lib/components/cps-paginator/pipes/cps-paginate.pipe.mjs +0 -30
  28. package/esm2022/lib/components/cps-progress-circular/cps-progress-circular.component.mjs +0 -51
  29. package/esm2022/lib/components/cps-progress-linear/cps-progress-linear.component.mjs +0 -75
  30. package/esm2022/lib/components/cps-radio-group/cps-radio/cps-radio.component.mjs +0 -42
  31. package/esm2022/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.mjs +0 -77
  32. package/esm2022/lib/components/cps-radio-group/cps-radio-group.component.mjs +0 -225
  33. package/esm2022/lib/components/cps-scheduler/cps-scheduler.component.mjs +0 -682
  34. package/esm2022/lib/components/cps-scheduler/cps-scheduler.utils.mjs +0 -604
  35. package/esm2022/lib/components/cps-select/cps-select.component.mjs +0 -654
  36. package/esm2022/lib/components/cps-sidebar-menu/cps-sidebar-menu.component.mjs +0 -110
  37. package/esm2022/lib/components/cps-switch/cps-switch.component.mjs +0 -131
  38. package/esm2022/lib/components/cps-tab-group/cps-tab/cps-tab.component.mjs +0 -86
  39. package/esm2022/lib/components/cps-tab-group/cps-tab-group.component.mjs +0 -308
  40. package/esm2022/lib/components/cps-table/components/internal/cps-sort-icon/cps-sort-icon.component.mjs +0 -79
  41. package/esm2022/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.mjs +0 -407
  42. package/esm2022/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.mjs +0 -147
  43. package/esm2022/lib/components/cps-table/components/internal/table-row-menu/table-row-menu.component.mjs +0 -105
  44. package/esm2022/lib/components/cps-table/cps-column-filter-types.mjs +0 -29
  45. package/esm2022/lib/components/cps-table/cps-table.component.mjs +0 -1022
  46. package/esm2022/lib/components/cps-table/directives/cps-table-column-filter.directive.mjs +0 -181
  47. package/esm2022/lib/components/cps-table/directives/cps-table-column-resizable.directive.mjs +0 -22
  48. package/esm2022/lib/components/cps-table/directives/cps-table-column-sortable.directive.mjs +0 -47
  49. package/esm2022/lib/components/cps-table/directives/cps-table-header-selectable.directive.mjs +0 -32
  50. package/esm2022/lib/components/cps-table/directives/cps-table-row-selectable.directive.mjs +0 -35
  51. package/esm2022/lib/components/cps-table/directives/internal/table-unsort.directive.mjs +0 -212
  52. package/esm2022/lib/components/cps-table/pipes/cps-table-detect-filter-type.pipe.mjs +0 -29
  53. package/esm2022/lib/components/cps-tag/cps-tag.component.mjs +0 -121
  54. package/esm2022/lib/components/cps-textarea/cps-textarea.component.mjs +0 -290
  55. package/esm2022/lib/components/cps-timepicker/cps-timepicker.component.mjs +0 -370
  56. package/esm2022/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.mjs +0 -273
  57. package/esm2022/lib/components/cps-tree-select/cps-tree-select.component.mjs +0 -87
  58. package/esm2022/lib/components/cps-tree-table/cps-tree-table.component.mjs +0 -1279
  59. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-column-filter.directive.mjs +0 -174
  60. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-column-resizable.directive.mjs +0 -22
  61. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-column-sortable.directive.mjs +0 -47
  62. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-header-selectable.directive.mjs +0 -33
  63. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-row-selectable.directive.mjs +0 -36
  64. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler.directive.mjs +0 -48
  65. package/esm2022/lib/components/cps-tree-table/directives/internal/tree-table-unsort.directive.mjs +0 -352
  66. package/esm2022/lib/components/cps-tree-table/pipes/cps-tree-table-detect-filter-type.pipe.mjs +0 -30
  67. package/esm2022/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.mjs +0 -656
  68. package/esm2022/lib/directives/cps-tooltip/cps-tooltip.directive.mjs +0 -275
  69. package/esm2022/lib/pipes/internal/check-option-selected.pipe.mjs +0 -24
  70. package/esm2022/lib/pipes/internal/combine-labels.pipe.mjs +0 -25
  71. package/esm2022/lib/pipes/internal/label-by-value.pipe.mjs +0 -16
  72. package/esm2022/lib/services/cps-dialog/cps-dialog.service.mjs +0 -146
  73. package/esm2022/lib/services/cps-dialog/internal/components/cps-confirmation/cps-confirmation.component.mjs +0 -25
  74. package/esm2022/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.mjs +0 -470
  75. package/esm2022/lib/services/cps-dialog/internal/directives/cps-dialog-content.directive.mjs +0 -18
  76. package/esm2022/lib/services/cps-dialog/utils/cps-dialog-config.mjs +0 -3
  77. package/esm2022/lib/services/cps-dialog/utils/cps-dialog-ref.mjs +0 -128
  78. package/esm2022/lib/services/cps-notification/cps-notification.service.mjs +0 -122
  79. package/esm2022/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.mjs +0 -95
  80. package/esm2022/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.mjs +0 -106
  81. package/esm2022/lib/services/cps-notification/utils/cps-notification-config.mjs +0 -27
  82. package/esm2022/lib/services/cps-notification/utils/internal/cps-notification-data.mjs +0 -12
  83. package/esm2022/lib/utils/colors-utils.mjs +0 -59
  84. package/esm2022/lib/utils/internal/size-utils.mjs +0 -24
  85. package/esm2022/public-api.mjs +0 -58
@@ -1,682 +0,0 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
4
- import { timeZones } from './cps-scheduler.utils';
5
- import { CpsSelectComponent } from '../cps-select/cps-select.component';
6
- import { CpsRadioGroupComponent } from '../cps-radio-group/cps-radio-group.component';
7
- import { CpsRadioComponent } from '../cps-radio-group/cps-radio/cps-radio.component';
8
- import { CpsCheckboxComponent } from '../cps-checkbox/cps-checkbox.component';
9
- import { CpsInputComponent } from '../cps-input/cps-input.component';
10
- import { CpsAutocompleteComponent } from '../cps-autocomplete/cps-autocomplete.component';
11
- import { CpsButtonToggleComponent } from '../cps-button-toggle/cps-button-toggle.component';
12
- import { CpsTimepickerComponent } from '../cps-timepicker/cps-timepicker.component';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@angular/forms";
15
- import * as i2 from "@angular/common";
16
- const Days = {
17
- MON: 'Monday',
18
- TUE: 'Tuesday',
19
- WED: 'Wednesday',
20
- THU: 'Thursday',
21
- FRI: 'Friday',
22
- SAT: 'Saturday',
23
- SUN: 'Sunday'
24
- };
25
- const MonthWeeks = {
26
- '#1': 'First',
27
- '#2': 'Second',
28
- '#3': 'Third',
29
- '#4': 'Fourth',
30
- '#5': 'Fifth',
31
- L: 'Last'
32
- };
33
- var Months;
34
- (function (Months) {
35
- Months[Months["January"] = 1] = "January";
36
- Months[Months["February"] = 2] = "February";
37
- Months[Months["March"] = 3] = "March";
38
- Months[Months["April"] = 4] = "April";
39
- Months[Months["May"] = 5] = "May";
40
- Months[Months["June"] = 6] = "June";
41
- Months[Months["July"] = 7] = "July";
42
- Months[Months["August"] = 8] = "August";
43
- Months[Months["September"] = 9] = "September";
44
- Months[Months["October"] = 10] = "October";
45
- Months[Months["November"] = 11] = "November";
46
- Months[Months["December"] = 12] = "December";
47
- })(Months || (Months = {}));
48
- /**
49
- * CpsSchedulerComponent is a component designed to facilitate the creation of Amazon EventBridge CRON expressions.
50
- * @group Components
51
- */
52
- export class CpsSchedulerComponent {
53
- // eslint-disable-next-line no-useless-constructor
54
- constructor(_fb, _cdr) {
55
- this._fb = _fb;
56
- this._cdr = _cdr;
57
- /**
58
- * Label of the component.
59
- * @group Props
60
- */
61
- this.label = '';
62
- /**
63
- * Cron expression value.
64
- * @group Props
65
- */
66
- this.cron = '';
67
- /**
68
- * Time zone value.
69
- * @group Props
70
- */
71
- this.timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';
72
- /**
73
- * Determines whether to show the 'Not set' tab.
74
- * @group Props
75
- */
76
- this.showNotSet = true;
77
- /**
78
- * Determines whether to show the 'Advanced' tab.
79
- * @group Props
80
- */
81
- this.showAdvanced = true;
82
- /**
83
- * Determines whether to show the 'Minutes' tab.
84
- * @group Props
85
- */
86
- this.showMinutes = true;
87
- /**
88
- * Determines whether to show the time zone selector.
89
- * @group Props
90
- */
91
- this.showTimeZone = false;
92
- /**
93
- * Default time format for the component.
94
- * @group Props
95
- */
96
- this.defaultTime = '00:00';
97
- /**
98
- * Determines whether to use 24-hour time format.
99
- * @group Props
100
- */
101
- this.use24HourTime = true;
102
- /**
103
- * Determines whether the component is disabled.
104
- * @group Props
105
- */
106
- this.disabled = false;
107
- /**
108
- * Information tooltip for the component.
109
- * @group Props
110
- */
111
- this.infoTooltip = '';
112
- /**
113
- * Callback to invoke on cron expression value change.
114
- * @param {string} string - cron expression value changed.
115
- * @group Emits
116
- */
117
- this.cronChange = new EventEmitter();
118
- /**
119
- * Callback to invoke on time zone change.
120
- * @param {string} string - time zone changed.
121
- * @group Emits
122
- */
123
- this.timeZoneChange = new EventEmitter();
124
- this.scheduleTypes = [
125
- { label: 'Not set', value: 'Not set' },
126
- { label: 'Minutes', value: 'Minutes' },
127
- { label: 'Hourly', value: 'Hourly' },
128
- { label: 'Daily', value: 'Daily' },
129
- { label: 'Weekly', value: 'Weekly' },
130
- { label: 'Monthly', value: 'Monthly' },
131
- { label: 'Yearly', value: 'Yearly' },
132
- { label: 'Advanced', value: 'Advanced' }
133
- ];
134
- this.activeScheduleType = 'Not set';
135
- this.selectOptions = this._getSelectOptions();
136
- this.timeZoneOptions = timeZones.map((tz) => ({ label: tz, value: tz }));
137
- this.form = this._fb.group({
138
- advanced: ['', [this._validateAdvancedExpr]]
139
- });
140
- this._isDirty = false;
141
- this._minutesDefault = '0/1 * 1/1 * ? *';
142
- }
143
- ngOnInit() {
144
- this.state = this._getDefaultState();
145
- if (!this.showAdvanced) {
146
- this.scheduleTypes.pop();
147
- }
148
- if (!this.showMinutes) {
149
- const minutesIndex = this.scheduleTypes.findIndex((option) => option.value === 'Minutes');
150
- if (minutesIndex !== -1) {
151
- this.scheduleTypes.splice(minutesIndex, 1);
152
- }
153
- }
154
- if (!this.showNotSet) {
155
- this.scheduleTypes.shift();
156
- if (!this.cron)
157
- this.cron = this._minutesDefault;
158
- }
159
- this._handleModelChange(this.cron);
160
- }
161
- ngOnChanges(changes) {
162
- const newCron = changes.value;
163
- if (newCron && !newCron.firstChange) {
164
- this._handleModelChange(this.cron);
165
- }
166
- }
167
- setActiveScheduleType(value) {
168
- if (!this.disabled) {
169
- this.activeScheduleType = value;
170
- this.regenerateCron(true);
171
- }
172
- if (value && this.form) {
173
- if (value === 'Advanced') {
174
- this.form.controls.advanced.addValidators(Validators.required);
175
- this.form.controls.advanced.updateValueAndValidity();
176
- }
177
- else {
178
- this.form.controls.advanced.removeValidators(Validators.required);
179
- this.form.controls.advanced.setErrors(null);
180
- }
181
- }
182
- }
183
- regenerateCron(tabChange) {
184
- this._isDirty = true;
185
- switch (this.activeScheduleType) {
186
- case 'Minutes':
187
- this._updateCron(`0/${this.state.minutes.minutes} * 1/1 * ? *`);
188
- break;
189
- case 'Hourly':
190
- this._updateCron(`${this.state.hourly.minutes} 0/${this.state.hourly.hours} 1/1 * ? *`);
191
- break;
192
- case 'Daily':
193
- switch (this.state.daily.subTab) {
194
- case 'everyDays':
195
- this._updateCron(`${this.state.daily.everyDays.minutes} ${this._hourToCron(this.state.daily.everyDays.hours, this.state.daily.everyDays.hourType)} 1/${this.state.daily.everyDays.days} * ? *`);
196
- break;
197
- case 'everyWeekDay':
198
- this._updateCron(`${this.state.daily.everyWeekDay.minutes} ${this._hourToCron(this.state.daily.everyWeekDay.hours, this.state.daily.everyWeekDay.hourType)} ? * MON-FRI *`);
199
- break;
200
- default:
201
- throw new Error('Invalid cron daily subtab selection');
202
- }
203
- break;
204
- case 'Weekly': {
205
- const days = this.selectOptions.days
206
- .map((d) => d.value)
207
- .reduce((acc, day) => (this.state.weekly[day] ? acc.concat([day]) : acc), [])
208
- .join(',');
209
- this._updateCron(`${this.state.weekly.minutes} ${this._hourToCron(this.state.weekly.hours, this.state.weekly.hourType)} ? * ${days} *`);
210
- break;
211
- }
212
- case 'Monthly': {
213
- switch (this.state.monthly.subTab) {
214
- case 'specificDay': {
215
- const day = this.state.monthly.runOnWeekday
216
- ? `${this.state.monthly.specificDay.day}W`
217
- : this.state.monthly.specificDay.day;
218
- this._updateCron(`${this.state.monthly.specificDay.minutes} ${this._hourToCron(this.state.monthly.specificDay.hours, this.state.monthly.specificDay.hourType)} ${day} 1/${this.state.monthly.specificDay.months} ? *`);
219
- break;
220
- }
221
- case 'specificWeekDay':
222
- this._updateCron(`${this.state.monthly.specificWeekDay.minutes} ${this._hourToCron(this.state.monthly.specificWeekDay.hours, this.state.monthly.specificWeekDay.hourType)} ? ${this.state.monthly.specificWeekDay.startMonth}/${this.state.monthly.specificWeekDay.months} ${this.state.monthly.specificWeekDay.day}${this.state.monthly.specificWeekDay.monthWeek} *`);
223
- break;
224
- default:
225
- throw new Error('Invalid cron monthly subtab selection');
226
- }
227
- break;
228
- }
229
- case 'Yearly':
230
- switch (this.state.yearly.subTab) {
231
- case 'specificMonthDay': {
232
- const day = this.state.yearly.runOnWeekday
233
- ? `${this.state.yearly.specificMonthDay.day}W`
234
- : this.state.yearly.specificMonthDay.day;
235
- this._updateCron(`${this.state.yearly.specificMonthDay.minutes} ${this._hourToCron(this.state.yearly.specificMonthDay.hours, this.state.yearly.specificMonthDay.hourType)} ${day} ${this.state.yearly.specificMonthDay.month} ? *`);
236
- break;
237
- }
238
- case 'specificMonthWeek':
239
- this._updateCron(`${this.state.yearly.specificMonthWeek.minutes} ${this._hourToCron(this.state.yearly.specificMonthWeek.hours, this.state.yearly.specificMonthWeek.hourType)} ? ${this.state.yearly.specificMonthWeek.month} ${this.state.yearly.specificMonthWeek.day}${this.state.yearly.specificMonthWeek.monthWeek} *`);
240
- break;
241
- default:
242
- throw new Error('Invalid cron yearly subtab selection');
243
- }
244
- break;
245
- case 'Advanced':
246
- if (!tabChange)
247
- this._updateCron(this.form.value.advanced || '');
248
- this.form.controls.advanced.setValue(this.cron);
249
- break;
250
- default:
251
- if (this.showNotSet)
252
- this._updateCron('');
253
- else
254
- throw new Error('Invalid cron type');
255
- }
256
- }
257
- onTimeZoneChanged(value) {
258
- if (!this.showTimeZone)
259
- return;
260
- this.timeZoneChange.emit(value);
261
- }
262
- onTimeChanged(value, target) {
263
- target.hours = this._stringToNum(value.hours);
264
- target.minutes = this._stringToNum(value.minutes);
265
- this.regenerateCron();
266
- }
267
- formatTimeValue(value) {
268
- return {
269
- hours: this._numToString(value.hours),
270
- minutes: this._numToString(value.minutes)
271
- };
272
- }
273
- _updateCron(value) {
274
- if (this.cron === value)
275
- return;
276
- this.cron = value;
277
- this.cronChange.emit(this.cron);
278
- }
279
- _isValidCron(cron) {
280
- if (typeof cron !== 'string')
281
- return false;
282
- if (!this.showNotSet) {
283
- if (!cron)
284
- return false;
285
- }
286
- else if (cron === '')
287
- return true;
288
- const parts = cron.split(' ');
289
- if (parts.length !== 6) {
290
- return false;
291
- }
292
- return true;
293
- }
294
- _validateAdvancedExpr(c) {
295
- const cron = c.value;
296
- if (!cron)
297
- return null;
298
- const splits = cron?.split(' ') || [];
299
- if (splits.length !== 6)
300
- return { invalidExpression: 'Invalid expression' };
301
- const cronSeven = `0 ${cron}`;
302
- return cronSeven.match(/\d+ 0\/\d+ \* 1\/1 \* \? \*/) ||
303
- cronSeven.match(/\d+ \d+ 0\/\d+ 1\/1 \* \? \*/) ||
304
- cronSeven.match(/\d+ \d+ \d+ 1\/\d+ \* \? \*/) ||
305
- cronSeven.match(/\d+ \d+ \d+ \? \* MON-FRI \*/) ||
306
- cronSeven.match(/\d+ \d+ \d+ \? \* (MON|TUE|WED|THU|FRI|SAT|SUN)(,(MON|TUE|WED|THU|FRI|SAT|SUN))* \*/) ||
307
- cronSeven.match(/\d+ \d+ \d+ (\d+|L|LW|1W) 1\/\d+ \? \*/) ||
308
- cronSeven.match(/\d+ \d+ \d+ \? \d+\/\d+ (MON|TUE|WED|THU|FRI|SAT|SUN)((#[1-5])|L) \*/) ||
309
- cronSeven.match(/\d+ \d+ \d+ (\d+|L|LW|1W) \d+ \? \*/) ||
310
- cronSeven.match(/\d+ \d+ \d+ \? \d+ (MON|TUE|WED|THU|FRI|SAT|SUN)((#[1-5])|L) \*/)
311
- ? null
312
- : { invalidExpression: 'Invalid expression' };
313
- }
314
- _getAmPmHour(hour) {
315
- return this.use24HourTime ? hour : ((hour + 11) % 12) + 1;
316
- }
317
- _getHourType(hour) {
318
- return this.use24HourTime ? undefined : hour >= 12 ? 'PM' : 'AM';
319
- }
320
- _hourToCron(hour, hourType) {
321
- if (this.use24HourTime) {
322
- return hour;
323
- }
324
- else {
325
- return hourType === 'AM'
326
- ? hour === 12
327
- ? 0
328
- : hour
329
- : hour === 12
330
- ? 12
331
- : hour + 12;
332
- }
333
- }
334
- _handleModelChange(cron) {
335
- if (!this._isValidCron(cron)) {
336
- console.error('Invalid cron value:', cron);
337
- this.cron = this.showNotSet ? '' : this._minutesDefault;
338
- return;
339
- }
340
- if (this._isDirty) {
341
- this._isDirty = false;
342
- return;
343
- }
344
- else {
345
- this._isDirty = false;
346
- }
347
- if (!cron || cron.length < 1) {
348
- this.activeScheduleType = 'Not set';
349
- this._cdr.detectChanges();
350
- return;
351
- }
352
- const cronSeven = `0 ${cron}`;
353
- const [minutes, hours, dayOfMonth, month, dayOfWeek] = cron.split(' ');
354
- if (cronSeven.match(/\d+ 0\/\d+ \* 1\/1 \* \? \*/)) {
355
- this.activeScheduleType = 'Minutes';
356
- this.state.minutes.minutes = Number(minutes.substring(2));
357
- }
358
- else if (cronSeven.match(/\d+ \d+ 0\/\d+ 1\/1 \* \? \*/)) {
359
- this.activeScheduleType = 'Hourly';
360
- this.state.hourly.hours = Number(hours.substring(2));
361
- this.state.hourly.minutes = Number(minutes);
362
- }
363
- else if (cronSeven.match(/\d+ \d+ \d+ 1\/\d+ \* \? \*/)) {
364
- this.activeScheduleType = 'Daily';
365
- this.state.daily.subTab = 'everyDays';
366
- this.state.daily.everyDays.days = Number(dayOfMonth.substring(2));
367
- const parsedHours = Number(hours);
368
- this.state.daily.everyDays.hours = this._getAmPmHour(parsedHours);
369
- this.state.daily.everyDays.hourType = this._getHourType(parsedHours);
370
- this.state.daily.everyDays.minutes = Number(minutes);
371
- }
372
- else if (cronSeven.match(/\d+ \d+ \d+ \? \* MON-FRI \*/)) {
373
- this.activeScheduleType = 'Daily';
374
- this.state.daily.subTab = 'everyWeekDay';
375
- const parsedHours = Number(hours);
376
- this.state.daily.everyWeekDay.hours = this._getAmPmHour(parsedHours);
377
- this.state.daily.everyWeekDay.hourType = this._getHourType(parsedHours);
378
- this.state.daily.everyWeekDay.minutes = Number(minutes);
379
- }
380
- else if (cronSeven.match(/\d+ \d+ \d+ \? \* (MON|TUE|WED|THU|FRI|SAT|SUN)(,(MON|TUE|WED|THU|FRI|SAT|SUN))* \*/)) {
381
- this.activeScheduleType = 'Weekly';
382
- this.selectOptions.days
383
- .map((d) => d.value)
384
- .forEach((weekDay) => (this.state.weekly[weekDay] = false));
385
- dayOfWeek
386
- .split(',')
387
- .forEach((weekDay) => (this.state.weekly[weekDay] = true));
388
- const parsedHours = Number(hours);
389
- this.state.weekly.hours = this._getAmPmHour(parsedHours);
390
- this.state.weekly.hourType = this._getHourType(parsedHours);
391
- this.state.weekly.minutes = Number(minutes);
392
- }
393
- else if (cronSeven.match(/\d+ \d+ \d+ (\d+|L|LW|1W) 1\/\d+ \? \*/)) {
394
- this.activeScheduleType = 'Monthly';
395
- this.state.monthly.subTab = 'specificDay';
396
- if (dayOfMonth.indexOf('W') !== -1) {
397
- this.state.monthly.specificDay.day = dayOfMonth.charAt(0);
398
- this.state.monthly.runOnWeekday = true;
399
- }
400
- else {
401
- this.state.monthly.specificDay.day = dayOfMonth;
402
- }
403
- this.state.monthly.specificDay.months = Number(month.substring(2));
404
- const parsedHours = Number(hours);
405
- this.state.monthly.specificDay.hours = this._getAmPmHour(parsedHours);
406
- this.state.monthly.specificDay.hourType = this._getHourType(parsedHours);
407
- this.state.monthly.specificDay.minutes = Number(minutes);
408
- }
409
- else if (cronSeven.match(/\d+ \d+ \d+ \? \d+\/\d+ (MON|TUE|WED|THU|FRI|SAT|SUN)((#[1-5])|L) \*/)) {
410
- const day = dayOfWeek.substring(0, 3);
411
- const monthWeek = dayOfWeek.substring(3);
412
- this.activeScheduleType = 'Monthly';
413
- this.state.monthly.subTab = 'specificWeekDay';
414
- this.state.monthly.specificWeekDay.monthWeek = monthWeek;
415
- this.state.monthly.specificWeekDay.day = day;
416
- if (month.indexOf('/') !== -1) {
417
- const [startMonth, months] = month.split('/').map(Number);
418
- this.state.monthly.specificWeekDay.months = months;
419
- this.state.monthly.specificWeekDay.startMonth = startMonth;
420
- }
421
- const parsedHours = Number(hours);
422
- this.state.monthly.specificWeekDay.hours = this._getAmPmHour(parsedHours);
423
- this.state.monthly.specificWeekDay.hourType =
424
- this._getHourType(parsedHours);
425
- this.state.monthly.specificWeekDay.minutes = Number(minutes);
426
- }
427
- else if (cronSeven.match(/\d+ \d+ \d+ (\d+|L|LW|1W) \d+ \? \*/)) {
428
- this.activeScheduleType = 'Yearly';
429
- this.state.yearly.subTab = 'specificMonthDay';
430
- this.state.yearly.specificMonthDay.month = Number(month);
431
- if (dayOfMonth.indexOf('W') !== -1) {
432
- this.state.yearly.specificMonthDay.day = dayOfMonth.charAt(0);
433
- this.state.yearly.runOnWeekday = true;
434
- }
435
- else {
436
- this.state.yearly.specificMonthDay.day = dayOfMonth;
437
- }
438
- const parsedHours = Number(hours);
439
- this.state.yearly.specificMonthDay.hours = this._getAmPmHour(parsedHours);
440
- this.state.yearly.specificMonthDay.hourType =
441
- this._getHourType(parsedHours);
442
- this.state.yearly.specificMonthDay.minutes = Number(minutes);
443
- }
444
- else if (cronSeven.match(/\d+ \d+ \d+ \? \d+ (MON|TUE|WED|THU|FRI|SAT|SUN)((#[1-5])|L) \*/)) {
445
- const day = dayOfWeek.substring(0, 3);
446
- const monthWeek = dayOfWeek.substring(3);
447
- this.activeScheduleType = 'Yearly';
448
- this.state.yearly.subTab = 'specificMonthWeek';
449
- this.state.yearly.specificMonthWeek.monthWeek = monthWeek;
450
- this.state.yearly.specificMonthWeek.day = day;
451
- this.state.yearly.specificMonthWeek.month = Number(month);
452
- const parsedHours = Number(hours);
453
- this.state.yearly.specificMonthWeek.hours =
454
- this._getAmPmHour(parsedHours);
455
- this.state.yearly.specificMonthWeek.hourType =
456
- this._getHourType(parsedHours);
457
- this.state.yearly.specificMonthWeek.minutes = Number(minutes);
458
- }
459
- else {
460
- this.activeScheduleType = 'Advanced';
461
- this.form.controls.advanced.setValue(cron);
462
- }
463
- this._cdr.detectChanges();
464
- }
465
- _getDefaultState() {
466
- const [defaultHours, defaultMinutes] = this.defaultTime
467
- .split(':')
468
- .map(Number);
469
- return {
470
- minutes: {
471
- minutes: 1
472
- },
473
- hourly: {
474
- hours: 1,
475
- minutes: 0
476
- },
477
- daily: {
478
- subTab: 'everyDays',
479
- everyDays: {
480
- days: 1,
481
- hours: this._getAmPmHour(defaultHours),
482
- minutes: defaultMinutes,
483
- hourType: this._getHourType(defaultHours)
484
- },
485
- everyWeekDay: {
486
- hours: this._getAmPmHour(defaultHours),
487
- minutes: defaultMinutes,
488
- hourType: this._getHourType(defaultHours)
489
- }
490
- },
491
- weekly: {
492
- MON: true,
493
- TUE: false,
494
- WED: false,
495
- THU: false,
496
- FRI: false,
497
- SAT: false,
498
- SUN: false,
499
- hours: this._getAmPmHour(defaultHours),
500
- minutes: defaultMinutes,
501
- hourType: this._getHourType(defaultHours)
502
- },
503
- monthly: {
504
- subTab: 'specificDay',
505
- runOnWeekday: false,
506
- specificDay: {
507
- day: '1',
508
- months: 1,
509
- hours: this._getAmPmHour(defaultHours),
510
- minutes: defaultMinutes,
511
- hourType: this._getHourType(defaultHours)
512
- },
513
- specificWeekDay: {
514
- monthWeek: '#1',
515
- day: 'MON',
516
- startMonth: 1,
517
- months: 1,
518
- hours: this._getAmPmHour(defaultHours),
519
- minutes: defaultMinutes,
520
- hourType: this._getHourType(defaultHours)
521
- }
522
- },
523
- yearly: {
524
- subTab: 'specificMonthDay',
525
- runOnWeekday: false,
526
- specificMonthDay: {
527
- month: 1,
528
- day: '1',
529
- hours: this._getAmPmHour(defaultHours),
530
- minutes: defaultMinutes,
531
- hourType: this._getHourType(defaultHours)
532
- },
533
- specificMonthWeek: {
534
- monthWeek: '#1',
535
- day: 'MON',
536
- month: 1,
537
- hours: this._getAmPmHour(defaultHours),
538
- minutes: defaultMinutes,
539
- hourType: this._getHourType(defaultHours)
540
- }
541
- },
542
- advanced: {
543
- expression: this.cron
544
- }
545
- };
546
- }
547
- _getRange(startFrom, until) {
548
- return Array.from({ length: until + 1 - startFrom }, (_, k) => k + startFrom);
549
- }
550
- _getSelectOptions() {
551
- return {
552
- monthsNumeric: this._getRange(1, 12).map((month) => ({
553
- label: month,
554
- value: month
555
- })),
556
- months: this._getRange(1, 12).map((month) => ({
557
- label: Months[month],
558
- value: month
559
- })),
560
- monthWeeks: Object.entries(MonthWeeks).map(([key, value]) => ({
561
- label: value,
562
- value: key
563
- })),
564
- days: Object.entries(Days).map(([key, value]) => ({
565
- label: value,
566
- value: key
567
- })),
568
- minutes: this._getRange(1, 59).map((min) => ({
569
- label: min,
570
- value: min
571
- })),
572
- fullMinutes: this._getRange(0, 59).map((min) => ({
573
- label: this._numToString(min),
574
- value: min
575
- })),
576
- hours: this._getRange(1, 23).map((hour) => ({
577
- label: hour,
578
- value: hour
579
- })),
580
- monthDays: this._getRange(1, 31).map((day) => ({
581
- label: day,
582
- value: day
583
- })),
584
- monthDaysWithLasts: [...this._getRange(1, 31).map(String), 'L'].map((mdl) => {
585
- return {
586
- label: this._getMonthDayLabel(mdl),
587
- value: mdl
588
- };
589
- })
590
- };
591
- }
592
- _getMonthDayLabel(month) {
593
- if (month === 'L') {
594
- return 'Last Day';
595
- }
596
- else if (month === 'LW') {
597
- return 'Last Weekday';
598
- }
599
- else if (month === '1W') {
600
- return 'First Weekday';
601
- }
602
- else {
603
- let suffix = '';
604
- if (month.length > 1) {
605
- const secondToLastDigit = month.charAt(month.length - 2);
606
- if (secondToLastDigit === '1') {
607
- suffix = 'th';
608
- }
609
- }
610
- if (!suffix) {
611
- const lastDigit = month.charAt(month.length - 1);
612
- switch (lastDigit) {
613
- case '1':
614
- suffix = 'st';
615
- break;
616
- case '2':
617
- suffix = 'nd';
618
- break;
619
- case '3':
620
- suffix = 'rd';
621
- break;
622
- default:
623
- suffix = 'th';
624
- break;
625
- }
626
- }
627
- return `${month}${suffix} day`;
628
- }
629
- }
630
- _numToString(value) {
631
- return value >= 0 && value <= 9 ? '0' + value : value.toString();
632
- }
633
- _stringToNum(value) {
634
- const res = Number(value);
635
- return isNaN(res) ? 0 : res;
636
- }
637
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: CpsSchedulerComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
638
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.3", type: CpsSchedulerComponent, isStandalone: true, selector: "cps-scheduler", inputs: { label: "label", cron: "cron", timeZone: "timeZone", showNotSet: "showNotSet", showAdvanced: "showAdvanced", showMinutes: "showMinutes", showTimeZone: "showTimeZone", defaultTime: "defaultTime", use24HourTime: "use24HourTime", disabled: "disabled", infoTooltip: "infoTooltip" }, outputs: { cronChange: "cronChange", timeZoneChange: "timeZoneChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cps-scheduler-selector\">\n <cps-button-toggle\n [options]=\"scheduleTypes\"\n [disabled]=\"disabled\"\n [label]=\"label\"\n [infoTooltip]=\"infoTooltip\"\n [(ngModel)]=\"activeScheduleType\"\n (ngModelChange)=\"setActiveScheduleType($event)\">\n </cps-button-toggle>\n</div>\n\n<div\n [ngSwitch]=\"activeScheduleType\"\n class=\"cps-scheduler-container\"\n [ngClass]=\"{ 'cps-scheduler-container-disabled': disabled }\">\n <div *ngSwitchCase=\"'Not set'\" class=\"cps-scheduler-tab-pane\"></div>\n\n <div *ngSwitchCase=\"'Minutes'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-tab-pane-row\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.minutes.minutes\"\n [options]=\"selectOptions.minutes\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n minute(s)\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Hourly'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-tab-pane-row\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.hourly.hours\"\n [options]=\"selectOptions.hours\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n hour(s) on minute\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.hourly.minutes\"\n [options]=\"selectOptions.fullMinutes\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Daily'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [hideDetails]=\"true\"\n [(ngModel)]=\"state.daily.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'everyDays', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.daily.subTab !== 'everyDays'\n }\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled || state.daily.subTab !== 'everyDays'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.daily.everyDays.days\"\n [options]=\"selectOptions.monthDays\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n day(s) at\n <cps-timepicker\n [disabled]=\"disabled || state.daily.subTab !== 'everyDays'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.daily.everyDays)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.daily.everyDays)\">\n </cps-timepicker>\n </div>\n </cps-radio>\n <cps-radio [option]=\"{ value: 'everyWeekDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.daily.subTab !== 'everyWeekDay'\n }\">\n Every working day at\n <cps-timepicker\n [disabled]=\"disabled || state.daily.subTab !== 'everyWeekDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.daily.everyWeekDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.daily.everyWeekDay)\">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Weekly'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-days-checkbox-group\">\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Monday\"\n [(ngModel)]=\"state.weekly.MON\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Tuesday\"\n [(ngModel)]=\"state.weekly.TUE\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Wednesday\"\n [(ngModel)]=\"state.weekly.WED\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Thursday\"\n [(ngModel)]=\"state.weekly.THU\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Friday\"\n [(ngModel)]=\"state.weekly.FRI\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Saturday\"\n [(ngModel)]=\"state.weekly.SAT\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Sunday\"\n [(ngModel)]=\"state.weekly.SUN\">\n </cps-checkbox>\n </div>\n <div class=\"cps-scheduler-tab-pane-row\">\n at\n <cps-timepicker\n [disabled]=\"disabled\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.weekly)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.weekly)\">\n </cps-timepicker>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Monthly'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [hideDetails]=\"true\"\n [(ngModel)]=\"state.monthly.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'specificDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.monthly.subTab !== 'specificDay'\n }\">\n On the\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificDay.day\"\n [options]=\"selectOptions.monthDaysWithLasts\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificDay.months\"\n [options]=\"selectOptions.monthsNumeric\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n month(s) at\n <cps-timepicker\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.monthly.specificDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.monthly.specificDay)\">\n </cps-timepicker>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n label=\"During the nearest weekday\"\n [(ngModel)]=\"state.monthly.runOnWeekday\"\n class=\"cps-scheduler-nearest-weekday-checkbox\">\n </cps-checkbox>\n </div>\n </cps-radio>\n\n <cps-radio [option]=\"{ value: 'specificWeekDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.monthly.subTab !== 'specificWeekDay'\n }\">\n On the\n <cps-select\n width=\"106px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.monthWeek\"\n [options]=\"selectOptions.monthWeeks\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n <cps-select\n width=\"130px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.day\"\n [options]=\"selectOptions.days\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of every\n <cps-select\n width=\"90px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.months\"\n [options]=\"selectOptions.monthsNumeric\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n month(s) starting in\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.startMonth\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.monthly.specificWeekDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.monthly.specificWeekDay)\n \">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Yearly'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [hideDetails]=\"true\"\n [(ngModel)]=\"state.yearly.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'specificMonthDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.yearly.subTab !== 'specificMonthDay'\n }\">\n Every\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthDay.month\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n on the\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthDay.day\"\n [options]=\"selectOptions.monthDaysWithLasts\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.yearly.specificMonthDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.yearly.specificMonthDay)\n \">\n </cps-timepicker>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n label=\"During the nearest weekday\"\n [(ngModel)]=\"state.yearly.runOnWeekday\"\n class=\"cps-scheduler-nearest-weekday-checkbox\">\n </cps-checkbox>\n </div>\n </cps-radio>\n\n <cps-radio [option]=\"{ value: 'specificMonthWeek', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.yearly.subTab !== 'specificMonthWeek'\n }\">\n On the\n <cps-select\n width=\"106px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.monthWeek\"\n [options]=\"selectOptions.monthWeeks\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.day\"\n [options]=\"selectOptions.days\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.month\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.yearly.specificMonthWeek)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.yearly.specificMonthWeek)\n \">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Advanced'\">\n <form [formGroup]=\"form\">\n <cps-input\n label=\"\"\n [disabled]=\"disabled\"\n width=\"500px\"\n placeholder=\"Please enter\"\n formControlName=\"advanced\"\n (valueChanged)=\"regenerateCron()\">\n </cps-input>\n </form>\n </div>\n <div class=\"cps-scheduler-time-zone\" *ngIf=\"cron && showTimeZone\">\n <cps-autocomplete\n label=\"Time zone\"\n [(ngModel)]=\"timeZone\"\n (valueChanged)=\"onTimeZoneChanged($event)\"\n [returnObject]=\"false\"\n width=\"300\"\n [options]=\"timeZoneOptions\"></cps-autocomplete>\n </div>\n</div>\n", styles: [":host .cps-scheduler-selector{margin-bottom:24px}:host .cps-scheduler-container{margin-top:10px;margin-left:16px}:host .cps-scheduler-container .cps-scheduler-select-control{margin-left:8px;margin-right:8px}:host .cps-scheduler-container .cps-scheduler-days-checkbox-group{max-width:700px;display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));grid-template-rows:1fr 1fr;grid-gap:20px;margin-bottom:16px}:host .cps-scheduler-container .cps-scheduler-tab-pane{margin-bottom:28px}:host .cps-scheduler-container .cps-scheduler-tab-pane cps-radio-group ::ng-deep .cps-radio-group-content{margin-left:0!important}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-tab-pane-row{display:flex;align-items:center}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-tab-pane-row-disabled{color:var(--cps-color-text-light)}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-nearest-weekday-checkbox{margin-left:16px}:host .cps-scheduler-container .cps-scheduler-tab-pane cps-timepicker{margin-left:8px}:host .cps-scheduler-container-disabled{color:var(--cps-color-text-light)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CpsButtonToggleComponent, selector: "cps-button-toggle", inputs: ["label", "options", "multiple", "disabled", "mandatory", "equalWidths", "optionTooltipPosition", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "value"], outputs: ["valueChanged"] }, { kind: "component", type: CpsSelectComponent, selector: "cps-select", inputs: ["label", "placeholder", "hint", "returnObject", "multiple", "disabled", "width", "selectAll", "chips", "closableChips", "clearable", "openOnClear", "options", "keepInitialOrder", "optionLabel", "optionValue", "optionInfo", "optionIcon", "optionIconColor", "hideDetails", "persistentClear", "prefixIcon", "prefixIconSize", "loading", "virtualScroll", "numToleratedItems", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "optionsClass", "appearance", "showChevron", "value"], outputs: ["valueChanged", "focused", "blurred"] }, { kind: "component", type: CpsRadioGroupComponent, selector: "cps-radio-group", inputs: ["options", "groupLabel", "vertical", "disabled", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "hint", "hideDetails", "value"], outputs: ["valueChanged", "blurred", "focused"] }, { kind: "component", type: CpsRadioComponent, selector: "cps-radio", inputs: ["option"] }, { kind: "component", type: CpsCheckboxComponent, selector: "cps-checkbox", inputs: ["label", "disabled", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "icon", "iconColor", "value"], outputs: ["valueChanged"] }, { kind: "component", type: CpsInputComponent, selector: "cps-input", inputs: ["label", "hint", "placeholder", "disabled", "readonly", "width", "type", "loading", "clearable", "prefixIcon", "prefixIconClickable", "prefixIconSize", "prefixText", "hideDetails", "persistentClear", "error", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "appearance", "valueToDisplay", "value"], outputs: ["valueChanged", "focused", "prefixIconClicked", "blurred", "cleared", "enterClicked"] }, { kind: "component", type: CpsTimepickerComponent, selector: "cps-timepicker", inputs: ["label", "disabled", "use24HourTime", "withSeconds", "hint", "hideDetails", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "mandatoryValue", "value"], outputs: ["valueChanged", "focused", "blurred"] }, { kind: "component", type: CpsAutocompleteComponent, selector: "cps-autocomplete", inputs: ["label", "placeholder", "hint", "returnObject", "multiple", "disabled", "width", "selectAll", "showChevron", "withOptionsAliases", "useOptionsAliasesWhenNoMatch", "optionAlias", "chips", "closableChips", "clearable", "openOnClear", "keepInitialOrder", "optionLabel", "optionValue", "optionInfo", "hideDetails", "persistentClear", "prefixIcon", "prefixIconSize", "loading", "loadingMessage", "showLoadingMessage", "emptyMessage", "showEmptyMessage", "virtualScroll", "numToleratedItems", "externalError", "infoTooltip", "infoTooltipClass", "infoTooltipMaxWidth", "infoTooltipPersistent", "infoTooltipPosition", "appearance", "emptyOptionIndex", "inputChangeDebounceTime", "validating", "value", "options"], outputs: ["valueChanged", "inputChanged", "focused", "blurred"] }] }); }
639
- }
640
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: CpsSchedulerComponent, decorators: [{
641
- type: Component,
642
- args: [{ selector: 'cps-scheduler', standalone: true, imports: [
643
- CommonModule,
644
- FormsModule,
645
- ReactiveFormsModule,
646
- CpsButtonToggleComponent,
647
- CpsSelectComponent,
648
- CpsRadioGroupComponent,
649
- CpsRadioComponent,
650
- CpsCheckboxComponent,
651
- CpsInputComponent,
652
- CpsTimepickerComponent,
653
- CpsAutocompleteComponent
654
- ], template: "<div class=\"cps-scheduler-selector\">\n <cps-button-toggle\n [options]=\"scheduleTypes\"\n [disabled]=\"disabled\"\n [label]=\"label\"\n [infoTooltip]=\"infoTooltip\"\n [(ngModel)]=\"activeScheduleType\"\n (ngModelChange)=\"setActiveScheduleType($event)\">\n </cps-button-toggle>\n</div>\n\n<div\n [ngSwitch]=\"activeScheduleType\"\n class=\"cps-scheduler-container\"\n [ngClass]=\"{ 'cps-scheduler-container-disabled': disabled }\">\n <div *ngSwitchCase=\"'Not set'\" class=\"cps-scheduler-tab-pane\"></div>\n\n <div *ngSwitchCase=\"'Minutes'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-tab-pane-row\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.minutes.minutes\"\n [options]=\"selectOptions.minutes\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n minute(s)\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Hourly'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-tab-pane-row\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.hourly.hours\"\n [options]=\"selectOptions.hours\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n hour(s) on minute\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.hourly.minutes\"\n [options]=\"selectOptions.fullMinutes\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Daily'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [hideDetails]=\"true\"\n [(ngModel)]=\"state.daily.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'everyDays', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.daily.subTab !== 'everyDays'\n }\">\n Every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled || state.daily.subTab !== 'everyDays'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.daily.everyDays.days\"\n [options]=\"selectOptions.monthDays\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n day(s) at\n <cps-timepicker\n [disabled]=\"disabled || state.daily.subTab !== 'everyDays'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.daily.everyDays)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.daily.everyDays)\">\n </cps-timepicker>\n </div>\n </cps-radio>\n <cps-radio [option]=\"{ value: 'everyWeekDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.daily.subTab !== 'everyWeekDay'\n }\">\n Every working day at\n <cps-timepicker\n [disabled]=\"disabled || state.daily.subTab !== 'everyWeekDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.daily.everyWeekDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.daily.everyWeekDay)\">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Weekly'\" class=\"cps-scheduler-tab-pane\">\n <div class=\"cps-scheduler-days-checkbox-group\">\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Monday\"\n [(ngModel)]=\"state.weekly.MON\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Tuesday\"\n [(ngModel)]=\"state.weekly.TUE\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Wednesday\"\n [(ngModel)]=\"state.weekly.WED\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Thursday\"\n [(ngModel)]=\"state.weekly.THU\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Friday\"\n [(ngModel)]=\"state.weekly.FRI\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Saturday\"\n [(ngModel)]=\"state.weekly.SAT\">\n </cps-checkbox>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled\"\n label=\"Sunday\"\n [(ngModel)]=\"state.weekly.SUN\">\n </cps-checkbox>\n </div>\n <div class=\"cps-scheduler-tab-pane-row\">\n at\n <cps-timepicker\n [disabled]=\"disabled\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.weekly)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.weekly)\">\n </cps-timepicker>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'Monthly'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [hideDetails]=\"true\"\n [(ngModel)]=\"state.monthly.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'specificDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.monthly.subTab !== 'specificDay'\n }\">\n On the\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificDay.day\"\n [options]=\"selectOptions.monthDaysWithLasts\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of every\n <cps-select\n width=\"70px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificDay.months\"\n [options]=\"selectOptions.monthsNumeric\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n month(s) at\n <cps-timepicker\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.monthly.specificDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"onTimeChanged($event, state.monthly.specificDay)\">\n </cps-timepicker>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificDay'\"\n label=\"During the nearest weekday\"\n [(ngModel)]=\"state.monthly.runOnWeekday\"\n class=\"cps-scheduler-nearest-weekday-checkbox\">\n </cps-checkbox>\n </div>\n </cps-radio>\n\n <cps-radio [option]=\"{ value: 'specificWeekDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.monthly.subTab !== 'specificWeekDay'\n }\">\n On the\n <cps-select\n width=\"106px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.monthWeek\"\n [options]=\"selectOptions.monthWeeks\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n <cps-select\n width=\"130px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.day\"\n [options]=\"selectOptions.days\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of every\n <cps-select\n width=\"90px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.months\"\n [options]=\"selectOptions.monthsNumeric\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n month(s) starting in\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.monthly.specificWeekDay.startMonth\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.monthly.subTab !== 'specificWeekDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.monthly.specificWeekDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.monthly.specificWeekDay)\n \">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Yearly'\" class=\"cps-scheduler-tab-pane\">\n <cps-radio-group\n [hideDetails]=\"true\"\n [(ngModel)]=\"state.yearly.subTab\"\n (valueChanged)=\"regenerateCron()\"\n [vertical]=\"true\">\n <cps-radio [option]=\"{ value: 'specificMonthDay', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.yearly.subTab !== 'specificMonthDay'\n }\">\n Every\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthDay.month\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n on the\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthDay.day\"\n [options]=\"selectOptions.monthDaysWithLasts\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.yearly.specificMonthDay)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.yearly.specificMonthDay)\n \">\n </cps-timepicker>\n <cps-checkbox\n (valueChanged)=\"regenerateCron()\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthDay'\"\n label=\"During the nearest weekday\"\n [(ngModel)]=\"state.yearly.runOnWeekday\"\n class=\"cps-scheduler-nearest-weekday-checkbox\">\n </cps-checkbox>\n </div>\n </cps-radio>\n\n <cps-radio [option]=\"{ value: 'specificMonthWeek', disabled: disabled }\">\n <div\n class=\"cps-scheduler-tab-pane-row\"\n [ngClass]=\"{\n 'cps-scheduler-tab-pane-row-disabled':\n state.yearly.subTab !== 'specificMonthWeek'\n }\">\n On the\n <cps-select\n width=\"106px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.monthWeek\"\n [options]=\"selectOptions.monthWeeks\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.day\"\n [options]=\"selectOptions.days\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n of\n <cps-select\n width=\"120px\"\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [returnObject]=\"false\"\n [hideDetails]=\"true\"\n (valueChanged)=\"regenerateCron()\"\n [(ngModel)]=\"state.yearly.specificMonthWeek.month\"\n [options]=\"selectOptions.months\"\n class=\"cps-scheduler-select-control\">\n </cps-select>\n at\n <cps-timepicker\n [disabled]=\"disabled || state.yearly.subTab !== 'specificMonthWeek'\"\n [use24HourTime]=\"use24HourTime\"\n [mandatoryValue]=\"true\"\n [value]=\"formatTimeValue(state.yearly.specificMonthWeek)\"\n [hideDetails]=\"true\"\n (valueChanged)=\"\n onTimeChanged($event, state.yearly.specificMonthWeek)\n \">\n </cps-timepicker>\n </div>\n </cps-radio>\n </cps-radio-group>\n </div>\n\n <div *ngSwitchCase=\"'Advanced'\">\n <form [formGroup]=\"form\">\n <cps-input\n label=\"\"\n [disabled]=\"disabled\"\n width=\"500px\"\n placeholder=\"Please enter\"\n formControlName=\"advanced\"\n (valueChanged)=\"regenerateCron()\">\n </cps-input>\n </form>\n </div>\n <div class=\"cps-scheduler-time-zone\" *ngIf=\"cron && showTimeZone\">\n <cps-autocomplete\n label=\"Time zone\"\n [(ngModel)]=\"timeZone\"\n (valueChanged)=\"onTimeZoneChanged($event)\"\n [returnObject]=\"false\"\n width=\"300\"\n [options]=\"timeZoneOptions\"></cps-autocomplete>\n </div>\n</div>\n", styles: [":host .cps-scheduler-selector{margin-bottom:24px}:host .cps-scheduler-container{margin-top:10px;margin-left:16px}:host .cps-scheduler-container .cps-scheduler-select-control{margin-left:8px;margin-right:8px}:host .cps-scheduler-container .cps-scheduler-days-checkbox-group{max-width:700px;display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));grid-template-rows:1fr 1fr;grid-gap:20px;margin-bottom:16px}:host .cps-scheduler-container .cps-scheduler-tab-pane{margin-bottom:28px}:host .cps-scheduler-container .cps-scheduler-tab-pane cps-radio-group ::ng-deep .cps-radio-group-content{margin-left:0!important}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-tab-pane-row{display:flex;align-items:center}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-tab-pane-row-disabled{color:var(--cps-color-text-light)}:host .cps-scheduler-container .cps-scheduler-tab-pane .cps-scheduler-nearest-weekday-checkbox{margin-left:16px}:host .cps-scheduler-container .cps-scheduler-tab-pane cps-timepicker{margin-left:8px}:host .cps-scheduler-container-disabled{color:var(--cps-color-text-light)}\n"] }]
655
- }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }], propDecorators: { label: [{
656
- type: Input
657
- }], cron: [{
658
- type: Input
659
- }], timeZone: [{
660
- type: Input
661
- }], showNotSet: [{
662
- type: Input
663
- }], showAdvanced: [{
664
- type: Input
665
- }], showMinutes: [{
666
- type: Input
667
- }], showTimeZone: [{
668
- type: Input
669
- }], defaultTime: [{
670
- type: Input
671
- }], use24HourTime: [{
672
- type: Input
673
- }], disabled: [{
674
- type: Input
675
- }], infoTooltip: [{
676
- type: Input
677
- }], cronChange: [{
678
- type: Output
679
- }], timeZoneChange: [{
680
- type: Output
681
- }] } });
682
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BzLXNjaGVkdWxlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcHMtdWkta2l0L3NyYy9saWIvY29tcG9uZW50cy9jcHMtc2NoZWR1bGVyL2Nwcy1zY2hlZHVsZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3BzLXVpLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvY3BzLXNjaGVkdWxlci9jcHMtc2NoZWR1bGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFJTCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUNyRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUMxRixPQUFPLEVBQ0wsd0JBQXdCLEVBRXpCLE1BQU0sa0RBQWtELENBQUM7QUFDMUQsT0FBTyxFQUNMLHNCQUFzQixFQUV2QixNQUFNLDRDQUE0QyxDQUFDOzs7O0FBRXBELE1BQU0s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YW5nZXMsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgRm9ybUJ1aWxkZXIsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1zTW9kdWxlLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBWYWxpZGF0b3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHRpbWVab25lcyB9IGZyb20gJy4vY3BzLXNjaGVkdWxlci51dGlscyc7XG5pbXBvcnQgeyBDcHNTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi9jcHMtc2VsZWN0L2Nwcy1zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IENwc1JhZGlvR3JvdXBDb21wb25lbnQgfSBmcm9tICcuLi9jcHMtcmFkaW8tZ3JvdXAvY3BzLXJhZGlvLWdyb3VwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDcHNSYWRpb0NvbXBvbmVudCB9IGZyb20gJy4uL2Nwcy1yYWRpby1ncm91cC9jcHMtcmFkaW8vY3BzLXJhZGlvLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDcHNDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uL2Nwcy1jaGVja2JveC9jcHMtY2hlY2tib3guY29tcG9uZW50JztcbmltcG9ydCB7IENwc0lucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vY3BzLWlucHV0L2Nwcy1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3BzQXV0b2NvbXBsZXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vY3BzLWF1dG9jb21wbGV0ZS9jcHMtYXV0b2NvbXBsZXRlLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBDcHNCdXR0b25Ub2dnbGVDb21wb25lbnQsXG4gIENwc0J1dHRvblRvZ2dsZU9wdGlvblxufSBmcm9tICcuLi9jcHMtYnV0dG9uLXRvZ2dsZS9jcHMtYnV0dG9uLXRvZ2dsZS5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgQ3BzVGltZXBpY2tlckNvbXBvbmVudCxcbiAgQ3BzVGltZVxufSBmcm9tICcuLi9jcHMtdGltZXBpY2tlci9jcHMtdGltZXBpY2tlci5jb21wb25lbnQnO1xuXG5jb25zdCBEYXlzID0ge1xuICBNT046ICdNb25kYXknLFxuICBUVUU6ICdUdWVzZGF5JyxcbiAgV0VEOiAnV2VkbmVzZGF5JyxcbiAgVEhVOiAnVGh1cnNkYXknLFxuICBGUkk6ICdGcmlkYXknLFxuICBTQVQ6ICdTYXR1cmRheScsXG4gIFNVTjogJ1N1bmRheSdcbn07XG5cbmNvbnN0IE1vbnRoV2Vla3MgPSB7XG4gICcjMSc6ICdGaXJzdCcsXG4gICcjMic6ICdTZWNvbmQnLFxuICAnIzMnOiAnVGhpcmQnLFxuICAnIzQnOiAnRm91cnRoJyxcbiAgJyM1JzogJ0ZpZnRoJyxcbiAgTDogJ0xhc3QnXG59O1xuXG5lbnVtIE1vbnRocyB7XG4gIEphbnVhcnkgPSAxLFxuICBGZWJydWFyeSxcbiAgTWFyY2gsXG4gIEFwcmlsLFxuICBNYXksXG4gIEp1bmUsXG4gIEp1bHksXG4gIEF1Z3VzdCxcbiAgU2VwdGVtYmVyLFxuICBPY3RvYmVyLFxuICBOb3ZlbWJlcixcbiAgRGVjZW1iZXJcbn1cblxuLyoqXG4gKiBDcHNTY2hlZHVsZXJDb21wb25lbnQgaXMgYSBjb21wb25lbnQgZGVzaWduZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY3JlYXRpb24gb2YgQW1hem9uIEV2ZW50QnJpZGdlIENST04gZXhwcmVzc2lvbnMuXG4gKiBAZ3JvdXAgQ29tcG9uZW50c1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcHMtc2NoZWR1bGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIENwc0J1dHRvblRvZ2dsZUNvbXBvbmVudCxcbiAgICBDcHNTZWxlY3RDb21wb25lbnQsXG4gICAgQ3BzUmFkaW9Hcm91cENvbXBvbmVudCxcbiAgICBDcHNSYWRpb0NvbXBvbmVudCxcbiAgICBDcHNDaGVja2JveENvbXBvbmVudCxcbiAgICBDcHNJbnB1dENvbXBvbmVudCxcbiAgICBDcHNUaW1lcGlja2VyQ29tcG9uZW50LFxuICAgIENwc0F1dG9jb21wbGV0ZUNvbXBvbmVudFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vY3BzLXNjaGVkdWxlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jcHMtc2NoZWR1bGVyLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBDcHNTY2hlZHVsZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBMYWJlbCBvZiB0aGUgY29tcG9uZW50LlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsID0gJyc7XG5cbiAgLyoqXG4gICAqIENyb24gZXhwcmVzc2lvbiB2YWx1ZS5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBjcm9uID0gJyc7XG5cbiAgLyoqXG4gICAqIFRpbWUgem9uZSB2YWx1ZS5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSB0aW1lWm9uZSA9IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSB8fCAnVVRDJztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHNob3cgdGhlICdOb3Qgc2V0JyB0YWIuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgc2hvd05vdFNldCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0byBzaG93IHRoZSAnQWR2YW5jZWQnIHRhYi5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzaG93QWR2YW5jZWQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gc2hvdyB0aGUgJ01pbnV0ZXMnIHRhYi5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBzaG93TWludXRlcyA9IHRydWU7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0byBzaG93IHRoZSB0aW1lIHpvbmUgc2VsZWN0b3IuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgc2hvd1RpbWVab25lID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdGltZSBmb3JtYXQgZm9yIHRoZSBjb21wb25lbnQuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgZGVmYXVsdFRpbWUgPSAnMDA6MDAnO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIDI0LWhvdXIgdGltZSBmb3JtYXQuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgdXNlMjRIb3VyVGltZSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgY29tcG9uZW50IGlzIGRpc2FibGVkLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIHRvb2x0aXAgZm9yIHRoZSBjb21wb25lbnQuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgaW5mb1Rvb2x0aXAgPSAnJztcblxuICAvKipcbiAgICogQ2FsbGJhY2sgdG8gaW52b2tlIG9uIGNyb24gZXhwcmVzc2lvbiB2YWx1ZSBjaGFuZ2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgLSBjcm9uIGV4cHJlc3Npb24gdmFsdWUgY2hhbmdlZC5cbiAgICogQGdyb3VwIEVtaXRzXG4gICAqL1xuICBAT3V0cHV0KCkgY3JvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBpbnZva2Ugb24gdGltZSB6b25lIGNoYW5nZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAtIHRpbWUgem9uZSBjaGFuZ2VkLlxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSB0aW1lWm9uZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIHNjaGVkdWxlVHlwZXM6IENwc0J1dHRvblRvZ2dsZU9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICdOb3Qgc2V0JywgdmFsdWU6ICdOb3Qgc2V0JyB9LFxuICAgIHsgbGFiZWw6ICdNaW51dGVzJywgdmFsdWU6ICdNaW51dGVzJyB9LFxuICAgIHsgbGFiZWw6ICdIb3VybHknLCB2YWx1ZTogJ0hvdXJseScgfSxcbiAgICB7IGxhYmVsOiAnRGFpbHknLCB2YWx1ZTogJ0RhaWx5JyB9LFxuICAgIHsgbGFiZWw6ICdXZWVrbHknLCB2YWx1ZTogJ1dlZWtseScgfSxcbiAgICB7IGxhYmVsOiAnTW9udGhseScsIHZhbHVlOiAnTW9udGhseScgfSxcbiAgICB7IGxhYmVsOiAnWWVhcmx5JywgdmFsdWU6ICdZZWFybHknIH0sXG4gICAgeyBsYWJlbDogJ0FkdmFuY2VkJywgdmFsdWU6ICdBZHZhbmNlZCcgfVxuICBdO1xuXG4gIGFjdGl2ZVNjaGVkdWxlVHlwZSA9ICdOb3Qgc2V0JztcbiAgc2VsZWN0T3B0aW9ucyA9IHRoaXMuX2dldFNlbGVjdE9wdGlvbnMoKTtcbiAgdGltZVpvbmVPcHRpb25zID0gdGltZVpvbmVzLm1hcCgodHopID0+ICh7IGxhYmVsOiB0eiwgdmFsdWU6IHR6IH0pKTtcbiAgc3RhdGU6IGFueTtcbiAgZm9ybTogRm9ybUdyb3VwID0gdGhpcy5fZmIuZ3JvdXAoe1xuICAgIGFkdmFuY2VkOiBbJycsIFt0aGlzLl92YWxpZGF0ZUFkdmFuY2VkRXhwcl1dXG4gIH0pO1xuXG4gIHByaXZhdGUgX2lzRGlydHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbWludXRlc0RlZmF1bHQgPSAnMC8xICogMS8xICogPyAqJztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jb25zdHJ1Y3RvclxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9mYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBfY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9IHRoaXMuX2dldERlZmF1bHRTdGF0ZSgpO1xuXG4gICAgaWYgKCF0aGlzLnNob3dBZHZhbmNlZCkge1xuICAgICAgdGhpcy5zY2hlZHVsZVR5cGVzLnBvcCgpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zaG93TWludXRlcykge1xuICAgICAgY29uc3QgbWludXRlc0luZGV4ID0gdGhpcy5zY2hlZHVsZVR5cGVzLmZpbmRJbmRleChcbiAgICAgICAgKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSAnTWludXRlcydcbiAgICAgICk7XG4gICAgICBpZiAobWludXRlc0luZGV4ICE9PSAtMSkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlVHlwZXMuc3BsaWNlKG1pbnV0ZXNJbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNob3dOb3RTZXQpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVUeXBlcy5zaGlmdCgpO1xuICAgICAgaWYgKCF0aGlzLmNyb24pIHRoaXMuY3JvbiA9IHRoaXMuX21pbnV0ZXNEZWZhdWx0O1xuICAgIH1cbiAgICB0aGlzLl9oYW5kbGVNb2RlbENoYW5nZSh0aGlzLmNyb24pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IG5ld0Nyb24gPSBjaGFuZ2VzLnZhbHVlO1xuICAgIGlmIChuZXdDcm9uICYmICFuZXdDcm9uLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLl9oYW5kbGVNb2RlbENoYW5nZSh0aGlzLmNyb24pO1xuICAgIH1cbiAgfVxuXG4gIHNldEFjdGl2ZVNjaGVkdWxlVHlwZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLmFjdGl2ZVNjaGVkdWxlVHlwZSA9IHZhbHVlO1xuICAgICAgdGhpcy5yZWdlbmVyYXRlQ3Jvbih0cnVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlICYmIHRoaXMuZm9ybSkge1xuICAgICAgaWYgKHZhbHVlID09PSAnQWR2YW5jZWQnKSB7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5hZHZhbmNlZC5hZGRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMuYWR2YW5jZWQudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmFkdmFuY2VkLnJlbW92ZVZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5hZHZhbmNlZC5zZXRFcnJvcnMobnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVnZW5lcmF0ZUNyb24odGFiQ2hhbmdlPzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuXG4gICAgc3dpdGNoICh0aGlzLmFjdGl2ZVNjaGVkdWxlVHlwZSkge1xuICAgICAgY2FzZSAnTWludXRlcyc6XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNyb24oYDAvJHt0aGlzLnN0YXRlLm1pbnV0ZXMubWludXRlc30gKiAxLzEgKiA/ICpgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdIb3VybHknOlxuICAgICAgICB0aGlzLl91cGRhdGVDcm9uKFxuICAgICAgICAgIGAke3RoaXMuc3RhdGUuaG91cmx5Lm1pbnV0ZXN9IDAvJHt0aGlzLnN0YXRlLmhvdXJseS5ob3Vyc30gMS8xICogPyAqYFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0RhaWx5JzpcbiAgICAgICAgc3dpdGNoICh0aGlzLnN0YXRlLmRhaWx5LnN1YlRhYikge1xuICAgICAgICAgIGNhc2UgJ2V2ZXJ5RGF5cyc6XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDcm9uKFxuICAgICAgICAgICAgICBgJHt0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5RGF5cy5taW51dGVzfSAke3RoaXMuX2hvdXJUb0Nyb24oXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5kYWlseS5ldmVyeURheXMuaG91cnMsXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5kYWlseS5ldmVyeURheXMuaG91clR5cGVcbiAgICAgICAgICAgICAgKX0gMS8ke3RoaXMuc3RhdGUuZGFpbHkuZXZlcnlEYXlzLmRheXN9ICogPyAqYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZXZlcnlXZWVrRGF5JzpcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNyb24oXG4gICAgICAgICAgICAgIGAke3RoaXMuc3RhdGUuZGFpbHkuZXZlcnlXZWVrRGF5Lm1pbnV0ZXN9ICR7dGhpcy5faG91clRvQ3JvbihcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5V2Vla0RheS5ob3VycyxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5V2Vla0RheS5ob3VyVHlwZVxuICAgICAgICAgICAgICApfSA/ICogTU9OLUZSSSAqYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY3JvbiBkYWlseSBzdWJ0YWIgc2VsZWN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdXZWVrbHknOiB7XG4gICAgICAgIGNvbnN0IGRheXMgPSB0aGlzLnNlbGVjdE9wdGlvbnMuZGF5c1xuICAgICAgICAgIC5tYXAoKGQpID0+IGQudmFsdWUpXG4gICAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAgIChhY2MsIGRheSkgPT4gKHRoaXMuc3RhdGUud2Vla2x5W2RheV0gPyBhY2MuY29uY2F0KFtkYXldKSA6IGFjYyksXG4gICAgICAgICAgICBbXSBhcyBzdHJpbmdbXVxuICAgICAgICAgIClcbiAgICAgICAgICAuam9pbignLCcpO1xuICAgICAgICB0aGlzLl91cGRhdGVDcm9uKFxuICAgICAgICAgIGAke3RoaXMuc3RhdGUud2Vla2x5Lm1pbnV0ZXN9ICR7dGhpcy5faG91clRvQ3JvbihcbiAgICAgICAgICAgIHRoaXMuc3RhdGUud2Vla2x5LmhvdXJzLFxuICAgICAgICAgICAgdGhpcy5zdGF0ZS53ZWVrbHkuaG91clR5cGVcbiAgICAgICAgICApfSA/ICogJHtkYXlzfSAqYFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ01vbnRobHknOiB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5zdGF0ZS5tb250aGx5LnN1YlRhYikge1xuICAgICAgICAgIGNhc2UgJ3NwZWNpZmljRGF5Jzoge1xuICAgICAgICAgICAgY29uc3QgZGF5ID0gdGhpcy5zdGF0ZS5tb250aGx5LnJ1bk9uV2Vla2RheVxuICAgICAgICAgICAgICA/IGAke3RoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5kYXl9V2BcbiAgICAgICAgICAgICAgOiB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkuZGF5O1xuXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDcm9uKFxuICAgICAgICAgICAgICBgJHt0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkubWludXRlc30gJHt0aGlzLl9ob3VyVG9Dcm9uKFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5ob3VycyxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkuaG91clR5cGVcbiAgICAgICAgICAgICAgKX0gJHtkYXl9IDEvJHt0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkubW9udGhzfSA/ICpgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3NwZWNpZmljV2Vla0RheSc6XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDcm9uKFxuICAgICAgICAgICAgICBgJHt0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNXZWVrRGF5Lm1pbnV0ZXN9ICR7dGhpcy5faG91clRvQ3JvbihcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNXZWVrRGF5LmhvdXJzLFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkuaG91clR5cGVcbiAgICAgICAgICAgICAgKX0gPyAke3RoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkuc3RhcnRNb250aH0vJHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNXZWVrRGF5Lm1vbnRoc1xuICAgICAgICAgICAgICB9ICR7dGhpcy5zdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5kYXl9JHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNXZWVrRGF5Lm1vbnRoV2Vla1xuICAgICAgICAgICAgICB9ICpgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjcm9uIG1vbnRobHkgc3VidGFiIHNlbGVjdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnWWVhcmx5JzpcbiAgICAgICAgc3dpdGNoICh0aGlzLnN0YXRlLnllYXJseS5zdWJUYWIpIHtcbiAgICAgICAgICBjYXNlICdzcGVjaWZpY01vbnRoRGF5Jzoge1xuICAgICAgICAgICAgY29uc3QgZGF5ID0gdGhpcy5zdGF0ZS55ZWFybHkucnVuT25XZWVrZGF5XG4gICAgICAgICAgICAgID8gYCR7dGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aERheS5kYXl9V2BcbiAgICAgICAgICAgICAgOiB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5LmRheTtcblxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ3JvbihcbiAgICAgICAgICAgICAgYCR7dGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aERheS5taW51dGVzfSAke3RoaXMuX2hvdXJUb0Nyb24oXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aERheS5ob3VycyxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5LmhvdXJUeXBlXG4gICAgICAgICAgICAgICl9ICR7ZGF5fSAke3RoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhEYXkubW9udGh9ID8gKmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnc3BlY2lmaWNNb250aFdlZWsnOlxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ3JvbihcbiAgICAgICAgICAgICAgYCR7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsubWludXRlc1xuICAgICAgICAgICAgICB9ICR7dGhpcy5faG91clRvQ3JvbihcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoV2Vlay5ob3VycyxcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoV2Vlay5ob3VyVHlwZVxuICAgICAgICAgICAgICApfSA/ICR7dGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsubW9udGh9ICR7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsuZGF5XG4gICAgICAgICAgICAgIH0ke3RoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrLm1vbnRoV2Vla30gKmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNyb24geWVhcmx5IHN1YnRhYiBzZWxlY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0FkdmFuY2VkJzpcbiAgICAgICAgaWYgKCF0YWJDaGFuZ2UpIHRoaXMuX3VwZGF0ZUNyb24odGhpcy5mb3JtLnZhbHVlLmFkdmFuY2VkIHx8ICcnKTtcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmFkdmFuY2VkLnNldFZhbHVlKHRoaXMuY3Jvbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHRoaXMuc2hvd05vdFNldCkgdGhpcy5fdXBkYXRlQ3JvbignJyk7XG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNyb24gdHlwZScpO1xuICAgIH1cbiAgfVxuXG4gIG9uVGltZVpvbmVDaGFuZ2VkKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvd1RpbWVab25lKSByZXR1cm47XG4gICAgdGhpcy50aW1lWm9uZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIG9uVGltZUNoYW5nZWQodmFsdWU6IENwc1RpbWUsIHRhcmdldDogYW55KTogdm9pZCB7XG4gICAgdGFyZ2V0LmhvdXJzID0gdGhpcy5fc3RyaW5nVG9OdW0odmFsdWUuaG91cnMpO1xuICAgIHRhcmdldC5taW51dGVzID0gdGhpcy5fc3RyaW5nVG9OdW0odmFsdWUubWludXRlcyk7XG4gICAgdGhpcy5yZWdlbmVyYXRlQ3JvbigpO1xuICB9XG5cbiAgZm9ybWF0VGltZVZhbHVlKHZhbHVlOiBhbnkpOiBDcHNUaW1lIHtcbiAgICByZXR1cm4ge1xuICAgICAgaG91cnM6IHRoaXMuX251bVRvU3RyaW5nKHZhbHVlLmhvdXJzKSxcbiAgICAgIG1pbnV0ZXM6IHRoaXMuX251bVRvU3RyaW5nKHZhbHVlLm1pbnV0ZXMpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUNyb24odmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNyb24gPT09IHZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5jcm9uID0gdmFsdWU7XG4gICAgdGhpcy5jcm9uQ2hhbmdlLmVtaXQodGhpcy5jcm9uKTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzVmFsaWRDcm9uKGNyb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgY3JvbiAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICghdGhpcy5zaG93Tm90U2V0KSB7XG4gICAgICBpZiAoIWNyb24pIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGNyb24gPT09ICcnKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IHBhcnRzID0gY3Jvbi5zcGxpdCgnICcpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDYpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3ZhbGlkYXRlQWR2YW5jZWRFeHByKGM6IEZvcm1Db250cm9sKSB7XG4gICAgY29uc3QgY3JvbiA9IGMudmFsdWU7XG4gICAgaWYgKCFjcm9uKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHNwbGl0cyA9IGNyb24/LnNwbGl0KCcgJykgfHwgW107XG4gICAgaWYgKHNwbGl0cy5sZW5ndGggIT09IDYpIHJldHVybiB7IGludmFsaWRFeHByZXNzaW9uOiAnSW52YWxpZCBleHByZXNzaW9uJyB9O1xuXG4gICAgY29uc3QgY3JvblNldmVuID0gYDAgJHtjcm9ufWA7XG5cbiAgICByZXR1cm4gY3JvblNldmVuLm1hdGNoKC9cXGQrIDBcXC9cXGQrIFxcKiAxXFwvMSBcXCogXFw/IFxcKi8pIHx8XG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goL1xcZCsgXFxkKyAwXFwvXFxkKyAxXFwvMSBcXCogXFw/IFxcKi8pIHx8XG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goL1xcZCsgXFxkKyBcXGQrIDFcXC9cXGQrIFxcKiBcXD8gXFwqLykgfHxcbiAgICAgIGNyb25TZXZlbi5tYXRjaCgvXFxkKyBcXGQrIFxcZCsgXFw/IFxcKiBNT04tRlJJIFxcKi8pIHx8XG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goXG4gICAgICAgIC9cXGQrIFxcZCsgXFxkKyBcXD8gXFwqIChNT058VFVFfFdFRHxUSFV8RlJJfFNBVHxTVU4pKCwoTU9OfFRVRXxXRUR8VEhVfEZSSXxTQVR8U1VOKSkqIFxcKi9cbiAgICAgICkgfHxcbiAgICAgIGNyb25TZXZlbi5tYXRjaCgvXFxkKyBcXGQrIFxcZCsgKFxcZCt8THxMV3wxVykgMVxcL1xcZCsgXFw/IFxcKi8pIHx8XG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goXG4gICAgICAgIC9cXGQrIFxcZCsgXFxkKyBcXD8gXFxkK1xcL1xcZCsgKE1PTnxUVUV8V0VEfFRIVXxGUkl8U0FUfFNVTikoKCNbMS01XSl8TCkgXFwqL1xuICAgICAgKSB8fFxuICAgICAgY3JvblNldmVuLm1hdGNoKC9cXGQrIFxcZCsgXFxkKyAoXFxkK3xMfExXfDFXKSBcXGQrIFxcPyBcXCovKSB8fFxuICAgICAgY3JvblNldmVuLm1hdGNoKFxuICAgICAgICAvXFxkKyBcXGQrIFxcZCsgXFw/IFxcZCsgKE1PTnxUVUV8V0VEfFRIVXxGUkl8U0FUfFNVTikoKCNbMS01XSl8TCkgXFwqL1xuICAgICAgKVxuICAgICAgPyBudWxsXG4gICAgICA6IHsgaW52YWxpZEV4cHJlc3Npb246ICdJbnZhbGlkIGV4cHJlc3Npb24nIH07XG4gIH1cblxuICBwcml2YXRlIF9nZXRBbVBtSG91cihob3VyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnVzZTI0SG91clRpbWUgPyBob3VyIDogKChob3VyICsgMTEpICUgMTIpICsgMTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEhvdXJUeXBlKGhvdXI6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudXNlMjRIb3VyVGltZSA/IHVuZGVmaW5lZCA6IGhvdXIgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgfVxuXG4gIHByaXZhdGUgX2hvdXJUb0Nyb24oaG91cjogbnVtYmVyLCBob3VyVHlwZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy51c2UyNEhvdXJUaW1lKSB7XG4gICAgICByZXR1cm4gaG91cjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGhvdXJUeXBlID09PSAnQU0nXG4gICAgICAgID8gaG91ciA9PT0gMTJcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IGhvdXJcbiAgICAgICAgOiBob3VyID09PSAxMlxuICAgICAgICAgID8gMTJcbiAgICAgICAgICA6IGhvdXIgKyAxMjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVNb2RlbENoYW5nZShjcm9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzVmFsaWRDcm9uKGNyb24pKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGNyb24gdmFsdWU6JywgY3Jvbik7XG4gICAgICB0aGlzLmNyb24gPSB0aGlzLnNob3dOb3RTZXQgPyAnJyA6IHRoaXMuX21pbnV0ZXNEZWZhdWx0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc0RpcnR5KSB7XG4gICAgICB0aGlzLl9pc0RpcnR5ID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2lzRGlydHkgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWNyb24gfHwgY3Jvbi5sZW5ndGggPCAxKSB7XG4gICAgICB0aGlzLmFjdGl2ZVNjaGVkdWxlVHlwZSA9ICdOb3Qgc2V0JztcbiAgICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3JvblNldmVuID0gYDAgJHtjcm9ufWA7XG5cbiAgICBjb25zdCBbbWludXRlcywgaG91cnMsIGRheU9mTW9udGgsIG1vbnRoLCBkYXlPZldlZWtdID0gY3Jvbi5zcGxpdCgnICcpO1xuXG4gICAgaWYgKGNyb25TZXZlbi5tYXRjaCgvXFxkKyAwXFwvXFxkKyBcXCogMVxcLzEgXFwqIFxcPyBcXCovKSkge1xuICAgICAgdGhpcy5hY3RpdmVTY2hlZHVsZVR5cGUgPSAnTWludXRlcyc7XG5cbiAgICAgIHRoaXMuc3RhdGUubWludXRlcy5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMuc3Vic3RyaW5nKDIpKTtcbiAgICB9IGVsc2UgaWYgKGNyb25TZXZlbi5tYXRjaCgvXFxkKyBcXGQrIDBcXC9cXGQrIDFcXC8xIFxcKiBcXD8gXFwqLykpIHtcbiAgICAgIHRoaXMuYWN0aXZlU2NoZWR1bGVUeXBlID0gJ0hvdXJseSc7XG5cbiAgICAgIHRoaXMuc3RhdGUuaG91cmx5LmhvdXJzID0gTnVtYmVyKGhvdXJzLnN1YnN0cmluZygyKSk7XG4gICAgICB0aGlzLnN0YXRlLmhvdXJseS5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoY3JvblNldmVuLm1hdGNoKC9cXGQrIFxcZCsgXFxkKyAxXFwvXFxkKyBcXCogXFw/IFxcKi8pKSB7XG4gICAgICB0aGlzLmFjdGl2ZVNjaGVkdWxlVHlwZSA9ICdEYWlseSc7XG5cbiAgICAgIHRoaXMuc3RhdGUuZGFpbHkuc3ViVGFiID0gJ2V2ZXJ5RGF5cyc7XG4gICAgICB0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5RGF5cy5kYXlzID0gTnVtYmVyKGRheU9mTW9udGguc3Vic3RyaW5nKDIpKTtcbiAgICAgIGNvbnN0IHBhcnNlZEhvdXJzID0gTnVtYmVyKGhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUuZGFpbHkuZXZlcnlEYXlzLmhvdXJzID0gdGhpcy5fZ2V0QW1QbUhvdXIocGFyc2VkSG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS5kYWlseS5ldmVyeURheXMuaG91clR5cGUgPSB0aGlzLl9nZXRIb3VyVHlwZShwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5RGF5cy5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoY3JvblNldmVuLm1hdGNoKC9cXGQrIFxcZCsgXFxkKyBcXD8gXFwqIE1PTi1GUkkgXFwqLykpIHtcbiAgICAgIHRoaXMuYWN0aXZlU2NoZWR1bGVUeXBlID0gJ0RhaWx5JztcblxuICAgICAgdGhpcy5zdGF0ZS5kYWlseS5zdWJUYWIgPSAnZXZlcnlXZWVrRGF5JztcbiAgICAgIGNvbnN0IHBhcnNlZEhvdXJzID0gTnVtYmVyKGhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUuZGFpbHkuZXZlcnlXZWVrRGF5LmhvdXJzID0gdGhpcy5fZ2V0QW1QbUhvdXIocGFyc2VkSG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS5kYWlseS5ldmVyeVdlZWtEYXkuaG91clR5cGUgPSB0aGlzLl9nZXRIb3VyVHlwZShwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLmRhaWx5LmV2ZXJ5V2Vla0RheS5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goXG4gICAgICAgIC9cXGQrIFxcZCsgXFxkKyBcXD8gXFwqIChNT058VFVFfFdFRHxUSFV8RlJJfFNBVHxTVU4pKCwoTU9OfFRVRXxXRUR8VEhVfEZSSXxTQVR8U1VOKSkqIFxcKi9cbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRoaXMuYWN0aXZlU2NoZWR1bGVUeXBlID0gJ1dlZWtseSc7XG4gICAgICB0aGlzLnNlbGVjdE9wdGlvbnMuZGF5c1xuICAgICAgICAubWFwKChkKSA9PiBkLnZhbHVlKVxuICAgICAgICAuZm9yRWFjaCgod2Vla0RheSkgPT4gKHRoaXMuc3RhdGUud2Vla2x5W3dlZWtEYXldID0gZmFsc2UpKTtcbiAgICAgIGRheU9mV2Vla1xuICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAuZm9yRWFjaCgod2Vla0RheSkgPT4gKHRoaXMuc3RhdGUud2Vla2x5W3dlZWtEYXldID0gdHJ1ZSkpO1xuICAgICAgY29uc3QgcGFyc2VkSG91cnMgPSBOdW1iZXIoaG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS53ZWVrbHkuaG91cnMgPSB0aGlzLl9nZXRBbVBtSG91cihwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLndlZWtseS5ob3VyVHlwZSA9IHRoaXMuX2dldEhvdXJUeXBlKHBhcnNlZEhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUud2Vla2x5Lm1pbnV0ZXMgPSBOdW1iZXIobWludXRlcyk7XG4gICAgfSBlbHNlIGlmIChjcm9uU2V2ZW4ubWF0Y2goL1xcZCsgXFxkKyBcXGQrIChcXGQrfEx8TFd8MVcpIDFcXC9cXGQrIFxcPyBcXCovKSkge1xuICAgICAgdGhpcy5hY3RpdmVTY2hlZHVsZVR5cGUgPSAnTW9udGhseSc7XG4gICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3ViVGFiID0gJ3NwZWNpZmljRGF5JztcblxuICAgICAgaWYgKGRheU9mTW9udGguaW5kZXhPZignVycpICE9PSAtMSkge1xuICAgICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkuZGF5ID0gZGF5T2ZNb250aC5jaGFyQXQoMCk7XG4gICAgICAgIHRoaXMuc3RhdGUubW9udGhseS5ydW5PbldlZWtkYXkgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5tb250aGx5LnNwZWNpZmljRGF5LmRheSA9IGRheU9mTW9udGg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5tb250aHMgPSBOdW1iZXIobW9udGguc3Vic3RyaW5nKDIpKTtcbiAgICAgIGNvbnN0IHBhcnNlZEhvdXJzID0gTnVtYmVyKGhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5ob3VycyA9IHRoaXMuX2dldEFtUG1Ib3VyKHBhcnNlZEhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5ob3VyVHlwZSA9IHRoaXMuX2dldEhvdXJUeXBlKHBhcnNlZEhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY0RheS5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goXG4gICAgICAgIC9cXGQrIFxcZCsgXFxkKyBcXD8gXFxkK1xcL1xcZCsgKE1PTnxUVUV8V0VEfFRIVXxGUkl8U0FUfFNVTikoKCNbMS01XSl8TCkgXFwqL1xuICAgICAgKVxuICAgICkge1xuICAgICAgY29uc3QgZGF5ID0gZGF5T2ZXZWVrLnN1YnN0cmluZygwLCAzKTtcbiAgICAgIGNvbnN0IG1vbnRoV2VlayA9IGRheU9mV2Vlay5zdWJzdHJpbmcoMyk7XG4gICAgICB0aGlzLmFjdGl2ZVNjaGVkdWxlVHlwZSA9ICdNb250aGx5JztcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zdWJUYWIgPSAnc3BlY2lmaWNXZWVrRGF5JztcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkubW9udGhXZWVrID0gbW9udGhXZWVrO1xuICAgICAgdGhpcy5zdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5kYXkgPSBkYXk7XG5cbiAgICAgIGlmIChtb250aC5pbmRleE9mKCcvJykgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IFtzdGFydE1vbnRoLCBtb250aHNdID0gbW9udGguc3BsaXQoJy8nKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5tb250aHMgPSBtb250aHM7XG4gICAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkuc3RhcnRNb250aCA9IHN0YXJ0TW9udGg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZEhvdXJzID0gTnVtYmVyKGhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkuaG91cnMgPSB0aGlzLl9nZXRBbVBtSG91cihwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLm1vbnRobHkuc3BlY2lmaWNXZWVrRGF5LmhvdXJUeXBlID1cbiAgICAgICAgdGhpcy5fZ2V0SG91clR5cGUocGFyc2VkSG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoY3JvblNldmVuLm1hdGNoKC9cXGQrIFxcZCsgXFxkKyAoXFxkK3xMfExXfDFXKSBcXGQrIFxcPyBcXCovKSkge1xuICAgICAgdGhpcy5hY3RpdmVTY2hlZHVsZVR5cGUgPSAnWWVhcmx5JztcbiAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnN1YlRhYiA9ICdzcGVjaWZpY01vbnRoRGF5JztcbiAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhEYXkubW9udGggPSBOdW1iZXIobW9udGgpO1xuXG4gICAgICBpZiAoZGF5T2ZNb250aC5pbmRleE9mKCdXJykgIT09IC0xKSB7XG4gICAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhEYXkuZGF5ID0gZGF5T2ZNb250aC5jaGFyQXQoMCk7XG4gICAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnJ1bk9uV2Vla2RheSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5LmRheSA9IGRheU9mTW9udGg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZEhvdXJzID0gTnVtYmVyKGhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhEYXkuaG91cnMgPSB0aGlzLl9nZXRBbVBtSG91cihwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5LmhvdXJUeXBlID1cbiAgICAgICAgdGhpcy5fZ2V0SG91clR5cGUocGFyc2VkSG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aERheS5taW51dGVzID0gTnVtYmVyKG1pbnV0ZXMpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjcm9uU2V2ZW4ubWF0Y2goXG4gICAgICAgIC9cXGQrIFxcZCsgXFxkKyBcXD8gXFxkKyAoTU9OfFRVRXxXRUR8VEhVfEZSSXxTQVR8U1VOKSgoI1sxLTVdKXxMKSBcXCovXG4gICAgICApXG4gICAgKSB7XG4gICAgICBjb25zdCBkYXkgPSBkYXlPZldlZWsuc3Vic3RyaW5nKDAsIDMpO1xuICAgICAgY29uc3QgbW9udGhXZWVrID0gZGF5T2ZXZWVrLnN1YnN0cmluZygzKTtcbiAgICAgIHRoaXMuYWN0aXZlU2NoZWR1bGVUeXBlID0gJ1llYXJseSc7XG4gICAgICB0aGlzLnN0YXRlLnllYXJseS5zdWJUYWIgPSAnc3BlY2lmaWNNb250aFdlZWsnO1xuICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsubW9udGhXZWVrID0gbW9udGhXZWVrO1xuICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsuZGF5ID0gZGF5O1xuICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsubW9udGggPSBOdW1iZXIobW9udGgpO1xuICAgICAgY29uc3QgcGFyc2VkSG91cnMgPSBOdW1iZXIoaG91cnMpO1xuICAgICAgdGhpcy5zdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsuaG91cnMgPVxuICAgICAgICB0aGlzLl9nZXRBbVBtSG91cihwYXJzZWRIb3Vycyk7XG4gICAgICB0aGlzLnN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoV2Vlay5ob3VyVHlwZSA9XG4gICAgICAgIHRoaXMuX2dldEhvdXJUeXBlKHBhcnNlZEhvdXJzKTtcbiAgICAgIHRoaXMuc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrLm1pbnV0ZXMgPSBOdW1iZXIobWludXRlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWN0aXZlU2NoZWR1bGVUeXBlID0gJ0FkdmFuY2VkJztcbiAgICAgIHRoaXMuZm9ybS5jb250cm9scy5hZHZhbmNlZC5zZXRWYWx1ZShjcm9uKTtcbiAgICB9XG4gICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldERlZmF1bHRTdGF0ZSgpIHtcbiAgICBjb25zdCBbZGVmYXVsdEhvdXJzLCBkZWZhdWx0TWludXRlc10gPSB0aGlzLmRlZmF1bHRUaW1lXG4gICAgICAuc3BsaXQoJzonKVxuICAgICAgLm1hcChOdW1iZXIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1pbnV0ZXM6IHtcbiAgICAgICAgbWludXRlczogMVxuICAgICAgfSxcbiAgICAgIGhvdXJseToge1xuICAgICAgICBob3VyczogMSxcbiAgICAgICAgbWludXRlczogMFxuICAgICAgfSxcbiAgICAgIGRhaWx5OiB7XG4gICAgICAgIHN1YlRhYjogJ2V2ZXJ5RGF5cycsXG4gICAgICAgIGV2ZXJ5RGF5czoge1xuICAgICAgICAgIGRheXM6IDEsXG4gICAgICAgICAgaG91cnM6IHRoaXMuX2dldEFtUG1Ib3VyKGRlZmF1bHRIb3VycyksXG4gICAgICAgICAgbWludXRlczogZGVmYXVsdE1pbnV0ZXMsXG4gICAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgICAgfSxcbiAgICAgICAgZXZlcnlXZWVrRGF5OiB7XG4gICAgICAgICAgaG91cnM6IHRoaXMuX2dldEFtUG1Ib3VyKGRlZmF1bHRIb3VycyksXG4gICAgICAgICAgbWludXRlczogZGVmYXVsdE1pbnV0ZXMsXG4gICAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdlZWtseToge1xuICAgICAgICBNT046IHRydWUsXG4gICAgICAgIFRVRTogZmFsc2UsXG4gICAgICAgIFdFRDogZmFsc2UsXG4gICAgICAgIFRIVTogZmFsc2UsXG4gICAgICAgIEZSSTogZmFsc2UsXG4gICAgICAgIFNBVDogZmFsc2UsXG4gICAgICAgIFNVTjogZmFsc2UsXG4gICAgICAgIGhvdXJzOiB0aGlzLl9nZXRBbVBtSG91cihkZWZhdWx0SG91cnMpLFxuICAgICAgICBtaW51dGVzOiBkZWZhdWx0TWludXRlcyxcbiAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgIH0sXG4gICAgICBtb250aGx5OiB7XG4gICAgICAgIHN1YlRhYjogJ3NwZWNpZmljRGF5JyxcbiAgICAgICAgcnVuT25XZWVrZGF5OiBmYWxzZSxcbiAgICAgICAgc3BlY2lmaWNEYXk6IHtcbiAgICAgICAgICBkYXk6ICcxJyxcbiAgICAgICAgICBtb250aHM6IDEsXG4gICAgICAgICAgaG91cnM6IHRoaXMuX2dldEFtUG1Ib3VyKGRlZmF1bHRIb3VycyksXG4gICAgICAgICAgbWludXRlczogZGVmYXVsdE1pbnV0ZXMsXG4gICAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgICAgfSxcbiAgICAgICAgc3BlY2lmaWNXZWVrRGF5OiB7XG4gICAgICAgICAgbW9udGhXZWVrOiAnIzEnLFxuICAgICAgICAgIGRheTogJ01PTicsXG4gICAgICAgICAgc3RhcnRNb250aDogMSxcbiAgICAgICAgICBtb250aHM6IDEsXG4gICAgICAgICAgaG91cnM6IHRoaXMuX2dldEFtUG1Ib3VyKGRlZmF1bHRIb3VycyksXG4gICAgICAgICAgbWludXRlczogZGVmYXVsdE1pbnV0ZXMsXG4gICAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHllYXJseToge1xuICAgICAgICBzdWJUYWI6ICdzcGVjaWZpY01vbnRoRGF5JyxcbiAgICAgICAgcnVuT25XZWVrZGF5OiBmYWxzZSxcbiAgICAgICAgc3BlY2lmaWNNb250aERheToge1xuICAgICAgICAgIG1vbnRoOiAxLFxuICAgICAgICAgIGRheTogJzEnLFxuICAgICAgICAgIGhvdXJzOiB0aGlzLl9nZXRBbVBtSG91cihkZWZhdWx0SG91cnMpLFxuICAgICAgICAgIG1pbnV0ZXM6IGRlZmF1bHRNaW51dGVzLFxuICAgICAgICAgIGhvdXJUeXBlOiB0aGlzLl9nZXRIb3VyVHlwZShkZWZhdWx0SG91cnMpXG4gICAgICAgIH0sXG4gICAgICAgIHNwZWNpZmljTW9udGhXZWVrOiB7XG4gICAgICAgICAgbW9udGhXZWVrOiAnIzEnLFxuICAgICAgICAgIGRheTogJ01PTicsXG4gICAgICAgICAgbW9udGg6IDEsXG4gICAgICAgICAgaG91cnM6IHRoaXMuX2dldEFtUG1Ib3VyKGRlZmF1bHRIb3VycyksXG4gICAgICAgICAgbWludXRlczogZGVmYXVsdE1pbnV0ZXMsXG4gICAgICAgICAgaG91clR5cGU6IHRoaXMuX2dldEhvdXJUeXBlKGRlZmF1bHRIb3VycylcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFkdmFuY2VkOiB7XG4gICAgICAgIGV4cHJlc3Npb246IHRoaXMuY3JvblxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9nZXRSYW5nZShzdGFydEZyb206IG51bWJlciwgdW50aWw6IG51bWJlcik6IG51bWJlcltdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgIHsgbGVuZ3RoOiB1bnRpbCArIDEgLSBzdGFydEZyb20gfSxcbiAgICAgIChfLCBrKSA9PiBrICsgc3RhcnRGcm9tXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFNlbGVjdE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vbnRoc051bWVyaWM6IHRoaXMuX2dldFJhbmdlKDEsIDEyKS5tYXAoKG1vbnRoKSA9PiAoe1xuICAgICAgICBsYWJlbDogbW9udGgsXG4gICAgICAgIHZhbHVlOiBtb250aFxuICAgICAgfSkpLFxuICAgICAgbW9udGhzOiB0aGlzLl9nZXRSYW5nZSgxLCAxMikubWFwKChtb250aCkgPT4gKHtcbiAgICAgICAgbGFiZWw6IE1vbnRoc1ttb250aF0sXG4gICAgICAgIHZhbHVlOiBtb250aFxuICAgICAgfSkpLFxuICAgICAgbW9udGhXZWVrczogT2JqZWN0LmVudHJpZXMoTW9udGhXZWVrcykubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgIGxhYmVsOiB2YWx1ZSxcbiAgICAgICAgdmFsdWU6IGtleVxuICAgICAgfSkpLFxuICAgICAgZGF5czogT2JqZWN0LmVudHJpZXMoRGF5cykubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgIGxhYmVsOiB2YWx1ZSxcbiAgICAgICAgdmFsdWU6IGtleVxuICAgICAgfSkpLFxuICAgICAgbWludXRlczogdGhpcy5fZ2V0UmFuZ2UoMSwgNTkpLm1hcCgobWluKSA9PiAoe1xuICAgICAgICBsYWJlbDogbWluLFxuICAgICAgICB2YWx1ZTogbWluXG4gICAgICB9KSksXG4gICAgICBmdWxsTWludXRlczogdGhpcy5fZ2V0UmFuZ2UoMCwgNTkpLm1hcCgobWluKSA9PiAoe1xuICAgICAgICBsYWJlbDogdGhpcy5fbnVtVG9TdHJpbmcobWluKSxcbiAgICAgICAgdmFsdWU6IG1pblxuICAgICAgfSkpLFxuICAgICAgaG91cnM6IHRoaXMuX2dldFJhbmdlKDEsIDIzKS5tYXAoKGhvdXIpID0+ICh7XG4gICAgICAgIGxhYmVsOiBob3VyLFxuICAgICAgICB2YWx1ZTogaG91clxuICAgICAgfSkpLFxuICAgICAgbW9udGhEYXlzOiB0aGlzLl9nZXRSYW5nZSgxLCAzMSkubWFwKChkYXkpID0+ICh7XG4gICAgICAgIGxhYmVsOiBkYXksXG4gICAgICAgIHZhbHVlOiBkYXlcbiAgICAgIH0pKSxcbiAgICAgIG1vbnRoRGF5c1dpdGhMYXN0czogWy4uLnRoaXMuX2dldFJhbmdlKDEsIDMxKS5tYXAoU3RyaW5nKSwgJ0wnXS5tYXAoXG4gICAgICAgIChtZGwpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6IHRoaXMuX2dldE1vbnRoRGF5TGFiZWwobWRsKSxcbiAgICAgICAgICAgIHZhbHVlOiBtZGxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldE1vbnRoRGF5TGFiZWwobW9udGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKG1vbnRoID09PSAnTCcpIHtcbiAgICAgIHJldHVybiAnTGFzdCBEYXknO1xuICAgIH0gZWxzZSBpZiAobW9udGggPT09ICdMVycpIHtcbiAgICAgIHJldHVybiAnTGFzdCBXZWVrZGF5JztcbiAgICB9IGVsc2UgaWYgKG1vbnRoID09PSAnMVcnKSB7XG4gICAgICByZXR1cm4gJ0ZpcnN0IFdlZWtkYXknO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgc3VmZml4ID0gJyc7XG4gICAgICBpZiAobW9udGgubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBzZWNvbmRUb0xhc3REaWdpdCA9IG1vbnRoLmNoYXJBdChtb250aC5sZW5ndGggLSAyKTtcbiAgICAgICAgaWYgKHNlY29uZFRvTGFzdERpZ2l0ID09PSAnMScpIHtcbiAgICAgICAgICBzdWZmaXggPSAndGgnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXN1ZmZpeCkge1xuICAgICAgICBjb25zdCBsYXN0RGlnaXQgPSBtb250aC5jaGFyQXQobW9udGgubGVuZ3RoIC0gMSk7XG4gICAgICAgIHN3aXRjaCAobGFzdERpZ2l0KSB7XG4gICAgICAgICAgY2FzZSAnMSc6XG4gICAgICAgICAgICBzdWZmaXggPSAnc3QnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnMic6XG4gICAgICAgICAgICBzdWZmaXggPSAnbmQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnMyc6XG4gICAgICAgICAgICBzdWZmaXggPSAncmQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHN1ZmZpeCA9ICd0aCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYCR7bW9udGh9JHtzdWZmaXh9IGRheWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbnVtVG9TdHJpbmcodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlID49IDAgJiYgdmFsdWUgPD0gOSA/ICcwJyArIHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N0cmluZ1RvTnVtKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IHJlcyA9IE51bWJlcih2YWx1ZSk7XG4gICAgcmV0dXJuIGlzTmFOKHJlcykgPyAwIDogcmVzO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3RvclwiPlxuICA8Y3BzLWJ1dHRvbi10b2dnbGVcbiAgICBbb3B0aW9uc109XCJzY2hlZHVsZVR5cGVzXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtsYWJlbF09XCJsYWJlbFwiXG4gICAgW2luZm9Ub29sdGlwXT1cImluZm9Ub29sdGlwXCJcbiAgICBbKG5nTW9kZWwpXT1cImFjdGl2ZVNjaGVkdWxlVHlwZVwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwic2V0QWN0aXZlU2NoZWR1bGVUeXBlKCRldmVudClcIj5cbiAgPC9jcHMtYnV0dG9uLXRvZ2dsZT5cbjwvZGl2PlxuXG48ZGl2XG4gIFtuZ1N3aXRjaF09XCJhY3RpdmVTY2hlZHVsZVR5cGVcIlxuICBjbGFzcz1cImNwcy1zY2hlZHVsZXItY29udGFpbmVyXCJcbiAgW25nQ2xhc3NdPVwieyAnY3BzLXNjaGVkdWxlci1jb250YWluZXItZGlzYWJsZWQnOiBkaXNhYmxlZCB9XCI+XG4gIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidOb3Qgc2V0J1wiIGNsYXNzPVwiY3BzLXNjaGVkdWxlci10YWItcGFuZVwiPjwvZGl2PlxuXG4gIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidNaW51dGVzJ1wiIGNsYXNzPVwiY3BzLXNjaGVkdWxlci10YWItcGFuZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lLXJvd1wiPlxuICAgICAgRXZlcnlcbiAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgIHdpZHRoPVwiNzBweFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUubWludXRlcy5taW51dGVzXCJcbiAgICAgICAgW29wdGlvbnNdPVwic2VsZWN0T3B0aW9ucy5taW51dGVzXCJcbiAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXNlbGVjdC1jb250cm9sXCI+XG4gICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICBtaW51dGUocylcbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ0hvdXJseSdcIiBjbGFzcz1cImNwcy1zY2hlZHVsZXItdGFiLXBhbmVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3dcIj5cbiAgICAgIEV2ZXJ5XG4gICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICB3aWR0aD1cIjcwcHhcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLmhvdXJseS5ob3Vyc1wiXG4gICAgICAgIFtvcHRpb25zXT1cInNlbGVjdE9wdGlvbnMuaG91cnNcIlxuICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgIDwvY3BzLXNlbGVjdD5cbiAgICAgIGhvdXIocykgb24gbWludXRlXG4gICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICB3aWR0aD1cIjcwcHhcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLmhvdXJseS5taW51dGVzXCJcbiAgICAgICAgW29wdGlvbnNdPVwic2VsZWN0T3B0aW9ucy5mdWxsTWludXRlc1wiXG4gICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3QtY29udHJvbFwiPlxuICAgICAgPC9jcHMtc2VsZWN0PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInRGFpbHknXCIgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lXCI+XG4gICAgPGNwcy1yYWRpby1ncm91cFxuICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5kYWlseS5zdWJUYWJcIlxuICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgIFt2ZXJ0aWNhbF09XCJ0cnVlXCI+XG4gICAgICA8Y3BzLXJhZGlvIFtvcHRpb25dPVwieyB2YWx1ZTogJ2V2ZXJ5RGF5cycsIGRpc2FibGVkOiBkaXNhYmxlZCB9XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItdGFiLXBhbmUtcm93XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3ctZGlzYWJsZWQnOlxuICAgICAgICAgICAgICBzdGF0ZS5kYWlseS5zdWJUYWIgIT09ICdldmVyeURheXMnXG4gICAgICAgICAgfVwiPlxuICAgICAgICAgIEV2ZXJ5XG4gICAgICAgICAgPGNwcy1zZWxlY3RcbiAgICAgICAgICAgIHdpZHRoPVwiNzBweFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUuZGFpbHkuc3ViVGFiICE9PSAnZXZlcnlEYXlzJ1wiXG4gICAgICAgICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLmRhaWx5LmV2ZXJ5RGF5cy5kYXlzXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInNlbGVjdE9wdGlvbnMubW9udGhEYXlzXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3QtY29udHJvbFwiPlxuICAgICAgICAgIDwvY3BzLXNlbGVjdD5cbiAgICAgICAgICBkYXkocykgYXRcbiAgICAgICAgICA8Y3BzLXRpbWVwaWNrZXJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5kYWlseS5zdWJUYWIgIT09ICdldmVyeURheXMnXCJcbiAgICAgICAgICAgIFt1c2UyNEhvdXJUaW1lXT1cInVzZTI0SG91clRpbWVcIlxuICAgICAgICAgICAgW21hbmRhdG9yeVZhbHVlXT1cInRydWVcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImZvcm1hdFRpbWVWYWx1ZShzdGF0ZS5kYWlseS5ldmVyeURheXMpXCJcbiAgICAgICAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwib25UaW1lQ2hhbmdlZCgkZXZlbnQsIHN0YXRlLmRhaWx5LmV2ZXJ5RGF5cylcIj5cbiAgICAgICAgICA8L2Nwcy10aW1lcGlja2VyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvY3BzLXJhZGlvPlxuICAgICAgPGNwcy1yYWRpbyBbb3B0aW9uXT1cInsgdmFsdWU6ICdldmVyeVdlZWtEYXknLCBkaXNhYmxlZDogZGlzYWJsZWQgfVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lLXJvd1wiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2Nwcy1zY2hlZHVsZXItdGFiLXBhbmUtcm93LWRpc2FibGVkJzpcbiAgICAgICAgICAgICAgc3RhdGUuZGFpbHkuc3ViVGFiICE9PSAnZXZlcnlXZWVrRGF5J1xuICAgICAgICAgIH1cIj5cbiAgICAgICAgICBFdmVyeSB3b3JraW5nIGRheSBhdFxuICAgICAgICAgIDxjcHMtdGltZXBpY2tlclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHN0YXRlLmRhaWx5LnN1YlRhYiAhPT0gJ2V2ZXJ5V2Vla0RheSdcIlxuICAgICAgICAgICAgW3VzZTI0SG91clRpbWVdPVwidXNlMjRIb3VyVGltZVwiXG4gICAgICAgICAgICBbbWFuZGF0b3J5VmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZm9ybWF0VGltZVZhbHVlKHN0YXRlLmRhaWx5LmV2ZXJ5V2Vla0RheSlcIlxuICAgICAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJvblRpbWVDaGFuZ2VkKCRldmVudCwgc3RhdGUuZGFpbHkuZXZlcnlXZWVrRGF5KVwiPlxuICAgICAgICAgIDwvY3BzLXRpbWVwaWNrZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9jcHMtcmFkaW8+XG4gICAgPC9jcHMtcmFkaW8tZ3JvdXA+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidXZWVrbHknXCIgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lXCI+XG4gICAgPGRpdiBjbGFzcz1cImNwcy1zY2hlZHVsZXItZGF5cy1jaGVja2JveC1ncm91cFwiPlxuICAgICAgPGNwcy1jaGVja2JveFxuICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBsYWJlbD1cIk1vbmRheVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUud2Vla2x5Lk1PTlwiPlxuICAgICAgPC9jcHMtY2hlY2tib3g+XG4gICAgICA8Y3BzLWNoZWNrYm94XG4gICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIGxhYmVsPVwiVHVlc2RheVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUud2Vla2x5LlRVRVwiPlxuICAgICAgPC9jcHMtY2hlY2tib3g+XG4gICAgICA8Y3BzLWNoZWNrYm94XG4gICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIGxhYmVsPVwiV2VkbmVzZGF5XCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS53ZWVrbHkuV0VEXCI+XG4gICAgICA8L2Nwcy1jaGVja2JveD5cbiAgICAgIDxjcHMtY2hlY2tib3hcbiAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgbGFiZWw9XCJUaHVyc2RheVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUud2Vla2x5LlRIVVwiPlxuICAgICAgPC9jcHMtY2hlY2tib3g+XG4gICAgICA8Y3BzLWNoZWNrYm94XG4gICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIGxhYmVsPVwiRnJpZGF5XCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS53ZWVrbHkuRlJJXCI+XG4gICAgICA8L2Nwcy1jaGVja2JveD5cbiAgICAgIDxjcHMtY2hlY2tib3hcbiAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgbGFiZWw9XCJTYXR1cmRheVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUud2Vla2x5LlNBVFwiPlxuICAgICAgPC9jcHMtY2hlY2tib3g+XG4gICAgICA8Y3BzLWNoZWNrYm94XG4gICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIGxhYmVsPVwiU3VuZGF5XCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS53ZWVrbHkuU1VOXCI+XG4gICAgICA8L2Nwcy1jaGVja2JveD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3dcIj5cbiAgICAgIGF0XG4gICAgICA8Y3BzLXRpbWVwaWNrZXJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW3VzZTI0SG91clRpbWVdPVwidXNlMjRIb3VyVGltZVwiXG4gICAgICAgIFttYW5kYXRvcnlWYWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgW3ZhbHVlXT1cImZvcm1hdFRpbWVWYWx1ZShzdGF0ZS53ZWVrbHkpXCJcbiAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2VkKT1cIm9uVGltZUNoYW5nZWQoJGV2ZW50LCBzdGF0ZS53ZWVrbHkpXCI+XG4gICAgICA8L2Nwcy10aW1lcGlja2VyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInTW9udGhseSdcIiBjbGFzcz1cImNwcy1zY2hlZHVsZXItdGFiLXBhbmVcIj5cbiAgICA8Y3BzLXJhZGlvLWdyb3VwXG4gICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLm1vbnRobHkuc3ViVGFiXCJcbiAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICBbdmVydGljYWxdPVwidHJ1ZVwiPlxuICAgICAgPGNwcy1yYWRpbyBbb3B0aW9uXT1cInsgdmFsdWU6ICdzcGVjaWZpY0RheScsIGRpc2FibGVkOiBkaXNhYmxlZCB9XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItdGFiLXBhbmUtcm93XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3ctZGlzYWJsZWQnOlxuICAgICAgICAgICAgICBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljRGF5J1xuICAgICAgICAgIH1cIj5cbiAgICAgICAgICBPbiB0aGVcbiAgICAgICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICAgICAgd2lkdGg9XCIxMjBweFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUubW9udGhseS5zdWJUYWIgIT09ICdzcGVjaWZpY0RheSdcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5tb250aGx5LnNwZWNpZmljRGF5LmRheVwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzZWxlY3RPcHRpb25zLm1vbnRoRGF5c1dpdGhMYXN0c1wiXG4gICAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICAgICAgb2YgZXZlcnlcbiAgICAgICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICAgICAgd2lkdGg9XCI3MHB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljRGF5J1wiXG4gICAgICAgICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLm1vbnRobHkuc3BlY2lmaWNEYXkubW9udGhzXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInNlbGVjdE9wdGlvbnMubW9udGhzTnVtZXJpY1wiXG4gICAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICAgICAgbW9udGgocykgYXRcbiAgICAgICAgICA8Y3BzLXRpbWVwaWNrZXJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljRGF5J1wiXG4gICAgICAgICAgICBbdXNlMjRIb3VyVGltZV09XCJ1c2UyNEhvdXJUaW1lXCJcbiAgICAgICAgICAgIFttYW5kYXRvcnlWYWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtYXRUaW1lVmFsdWUoc3RhdGUubW9udGhseS5zcGVjaWZpY0RheSlcIlxuICAgICAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJvblRpbWVDaGFuZ2VkKCRldmVudCwgc3RhdGUubW9udGhseS5zcGVjaWZpY0RheSlcIj5cbiAgICAgICAgICA8L2Nwcy10aW1lcGlja2VyPlxuICAgICAgICAgIDxjcHMtY2hlY2tib3hcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUubW9udGhseS5zdWJUYWIgIT09ICdzcGVjaWZpY0RheSdcIlxuICAgICAgICAgICAgbGFiZWw9XCJEdXJpbmcgdGhlIG5lYXJlc3Qgd2Vla2RheVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLm1vbnRobHkucnVuT25XZWVrZGF5XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1uZWFyZXN0LXdlZWtkYXktY2hlY2tib3hcIj5cbiAgICAgICAgICA8L2Nwcy1jaGVja2JveD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Nwcy1yYWRpbz5cblxuICAgICAgPGNwcy1yYWRpbyBbb3B0aW9uXT1cInsgdmFsdWU6ICdzcGVjaWZpY1dlZWtEYXknLCBkaXNhYmxlZDogZGlzYWJsZWQgfVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lLXJvd1wiXG4gICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ2Nwcy1zY2hlZHVsZXItdGFiLXBhbmUtcm93LWRpc2FibGVkJzpcbiAgICAgICAgICAgICAgc3RhdGUubW9udGhseS5zdWJUYWIgIT09ICdzcGVjaWZpY1dlZWtEYXknXG4gICAgICAgICAgfVwiPlxuICAgICAgICAgIE9uIHRoZVxuICAgICAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgICAgICB3aWR0aD1cIjEwNnB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljV2Vla0RheSdcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5tb250aFdlZWtcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwic2VsZWN0T3B0aW9ucy5tb250aFdlZWtzXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3QtY29udHJvbFwiPlxuICAgICAgICAgIDwvY3BzLXNlbGVjdD5cbiAgICAgICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICAgICAgd2lkdGg9XCIxMzBweFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUubW9udGhseS5zdWJUYWIgIT09ICdzcGVjaWZpY1dlZWtEYXknXCJcbiAgICAgICAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkuZGF5XCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInNlbGVjdE9wdGlvbnMuZGF5c1wiXG4gICAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICAgICAgb2YgZXZlcnlcbiAgICAgICAgICA8Y3BzLXNlbGVjdFxuICAgICAgICAgICAgd2lkdGg9XCI5MHB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljV2Vla0RheSdcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5tb250aHNcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwic2VsZWN0T3B0aW9ucy5tb250aHNOdW1lcmljXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3QtY29udHJvbFwiPlxuICAgICAgICAgIDwvY3BzLXNlbGVjdD5cbiAgICAgICAgICBtb250aChzKSBzdGFydGluZyBpblxuICAgICAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgICAgICB3aWR0aD1cIjEyMHB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS5tb250aGx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljV2Vla0RheSdcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheS5zdGFydE1vbnRoXCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInNlbGVjdE9wdGlvbnMubW9udGhzXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1zZWxlY3QtY29udHJvbFwiPlxuICAgICAgICAgIDwvY3BzLXNlbGVjdD5cbiAgICAgICAgICBhdFxuICAgICAgICAgIDxjcHMtdGltZXBpY2tlclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHN0YXRlLm1vbnRobHkuc3ViVGFiICE9PSAnc3BlY2lmaWNXZWVrRGF5J1wiXG4gICAgICAgICAgICBbdXNlMjRIb3VyVGltZV09XCJ1c2UyNEhvdXJUaW1lXCJcbiAgICAgICAgICAgIFttYW5kYXRvcnlWYWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtYXRUaW1lVmFsdWUoc3RhdGUubW9udGhseS5zcGVjaWZpY1dlZWtEYXkpXCJcbiAgICAgICAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwiXG4gICAgICAgICAgICAgIG9uVGltZUNoYW5nZWQoJGV2ZW50LCBzdGF0ZS5tb250aGx5LnNwZWNpZmljV2Vla0RheSlcbiAgICAgICAgICAgIFwiPlxuICAgICAgICAgIDwvY3BzLXRpbWVwaWNrZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9jcHMtcmFkaW8+XG4gICAgPC9jcHMtcmFkaW8tZ3JvdXA+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidZZWFybHknXCIgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXRhYi1wYW5lXCI+XG4gICAgPGNwcy1yYWRpby1ncm91cFxuICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS55ZWFybHkuc3ViVGFiXCJcbiAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICBbdmVydGljYWxdPVwidHJ1ZVwiPlxuICAgICAgPGNwcy1yYWRpbyBbb3B0aW9uXT1cInsgdmFsdWU6ICdzcGVjaWZpY01vbnRoRGF5JywgZGlzYWJsZWQ6IGRpc2FibGVkIH1cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3dcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdjcHMtc2NoZWR1bGVyLXRhYi1wYW5lLXJvdy1kaXNhYmxlZCc6XG4gICAgICAgICAgICAgIHN0YXRlLnllYXJseS5zdWJUYWIgIT09ICdzcGVjaWZpY01vbnRoRGF5J1xuICAgICAgICAgIH1cIj5cbiAgICAgICAgICBFdmVyeVxuICAgICAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgICAgICB3aWR0aD1cIjEyMHB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS55ZWFybHkuc3ViVGFiICE9PSAnc3BlY2lmaWNNb250aERheSdcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aERheS5tb250aFwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzZWxlY3RPcHRpb25zLm1vbnRoc1wiXG4gICAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICAgICAgb24gdGhlXG4gICAgICAgICAgPGNwcy1zZWxlY3RcbiAgICAgICAgICAgIHdpZHRoPVwiMTIwcHhcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHN0YXRlLnllYXJseS5zdWJUYWIgIT09ICdzcGVjaWZpY01vbnRoRGF5J1wiXG4gICAgICAgICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5LmRheVwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzZWxlY3RPcHRpb25zLm1vbnRoRGF5c1dpdGhMYXN0c1wiXG4gICAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItc2VsZWN0LWNvbnRyb2xcIj5cbiAgICAgICAgICA8L2Nwcy1zZWxlY3Q+XG4gICAgICAgICAgYXRcbiAgICAgICAgICA8Y3BzLXRpbWVwaWNrZXJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS55ZWFybHkuc3ViVGFiICE9PSAnc3BlY2lmaWNNb250aERheSdcIlxuICAgICAgICAgICAgW3VzZTI0SG91clRpbWVdPVwidXNlMjRIb3VyVGltZVwiXG4gICAgICAgICAgICBbbWFuZGF0b3J5VmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZm9ybWF0VGltZVZhbHVlKHN0YXRlLnllYXJseS5zcGVjaWZpY01vbnRoRGF5KVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cIlxuICAgICAgICAgICAgICBvblRpbWVDaGFuZ2VkKCRldmVudCwgc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhEYXkpXG4gICAgICAgICAgICBcIj5cbiAgICAgICAgICA8L2Nwcy10aW1lcGlja2VyPlxuICAgICAgICAgIDxjcHMtY2hlY2tib3hcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZWQpPVwicmVnZW5lcmF0ZUNyb24oKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUueWVhcmx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljTW9udGhEYXknXCJcbiAgICAgICAgICAgIGxhYmVsPVwiRHVyaW5nIHRoZSBuZWFyZXN0IHdlZWtkYXlcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS55ZWFybHkucnVuT25XZWVrZGF5XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3BzLXNjaGVkdWxlci1uZWFyZXN0LXdlZWtkYXktY2hlY2tib3hcIj5cbiAgICAgICAgICA8L2Nwcy1jaGVja2JveD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Nwcy1yYWRpbz5cblxuICAgICAgPGNwcy1yYWRpbyBbb3B0aW9uXT1cInsgdmFsdWU6ICdzcGVjaWZpY01vbnRoV2VlaycsIGRpc2FibGVkOiBkaXNhYmxlZCB9XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNwcy1zY2hlZHVsZXItdGFiLXBhbmUtcm93XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnY3BzLXNjaGVkdWxlci10YWItcGFuZS1yb3ctZGlzYWJsZWQnOlxuICAgICAgICAgICAgICBzdGF0ZS55ZWFybHkuc3ViVGFiICE9PSAnc3BlY2lmaWNNb250aFdlZWsnXG4gICAgICAgICAgfVwiPlxuICAgICAgICAgIE9uIHRoZVxuICAgICAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgICAgICB3aWR0aD1cIjEwNnB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS55ZWFybHkuc3ViVGFiICE9PSAnc3BlY2lmaWNNb250aFdlZWsnXCJcbiAgICAgICAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrLm1vbnRoV2Vla1wiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzZWxlY3RPcHRpb25zLm1vbnRoV2Vla3NcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXNlbGVjdC1jb250cm9sXCI+XG4gICAgICAgICAgPC9jcHMtc2VsZWN0PlxuICAgICAgICAgIDxjcHMtc2VsZWN0XG4gICAgICAgICAgICB3aWR0aD1cIjEyMHB4XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzdGF0ZS55ZWFybHkuc3ViVGFiICE9PSAnc3BlY2lmaWNNb250aFdlZWsnXCJcbiAgICAgICAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrLmRheVwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJzZWxlY3RPcHRpb25zLmRheXNcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXNlbGVjdC1jb250cm9sXCI+XG4gICAgICAgICAgPC9jcHMtc2VsZWN0PlxuICAgICAgICAgIG9mXG4gICAgICAgICAgPGNwcy1zZWxlY3RcbiAgICAgICAgICAgIHdpZHRoPVwiMTIwcHhcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHN0YXRlLnllYXJseS5zdWJUYWIgIT09ICdzcGVjaWZpY01vbnRoV2VlaydcIlxuICAgICAgICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cInJlZ2VuZXJhdGVDcm9uKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS55ZWFybHkuc3BlY2lmaWNNb250aFdlZWsubW9udGhcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwic2VsZWN0T3B0aW9ucy5tb250aHNcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcHMtc2NoZWR1bGVyLXNlbGVjdC1jb250cm9sXCI+XG4gICAgICAgICAgPC9jcHMtc2VsZWN0PlxuICAgICAgICAgIGF0XG4gICAgICAgICAgPGNwcy10aW1lcGlja2VyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgc3RhdGUueWVhcmx5LnN1YlRhYiAhPT0gJ3NwZWNpZmljTW9udGhXZWVrJ1wiXG4gICAgICAgICAgICBbdXNlMjRIb3VyVGltZV09XCJ1c2UyNEhvdXJUaW1lXCJcbiAgICAgICAgICAgIFttYW5kYXRvcnlWYWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJmb3JtYXRUaW1lVmFsdWUoc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrKVwiXG4gICAgICAgICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2VkKT1cIlxuICAgICAgICAgICAgICBvblRpbWVDaGFuZ2VkKCRldmVudCwgc3RhdGUueWVhcmx5LnNwZWNpZmljTW9udGhXZWVrKVxuICAgICAgICAgICAgXCI+XG4gICAgICAgICAgPC9jcHMtdGltZXBpY2tlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Nwcy1yYWRpbz5cbiAgICA8L2Nwcy1yYWRpby1ncm91cD5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ0FkdmFuY2VkJ1wiPlxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgICAgPGNwcy1pbnB1dFxuICAgICAgICBsYWJlbD1cIlwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIHdpZHRoPVwiNTAwcHhcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIlBsZWFzZSBlbnRlclwiXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cImFkdmFuY2VkXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJyZWdlbmVyYXRlQ3JvbigpXCI+XG4gICAgICA8L2Nwcy1pbnB1dD5cbiAgICA8L2Zvcm0+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3BzLXNjaGVkdWxlci10aW1lLXpvbmVcIiAqbmdJZj1cImNyb24gJiYgc2hvd1RpbWVab25lXCI+XG4gICAgPGNwcy1hdXRvY29tcGxldGVcbiAgICAgIGxhYmVsPVwiVGltZSB6b25lXCJcbiAgICAgIFsobmdNb2RlbCldPVwidGltZVpvbmVcIlxuICAgICAgKHZhbHVlQ2hhbmdlZCk9XCJvblRpbWVab25lQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgd2lkdGg9XCIzMDBcIlxuICAgICAgW29wdGlvbnNdPVwidGltZVpvbmVPcHRpb25zXCI+PC9jcHMtYXV0b2NvbXBsZXRlPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19