cps-ui-kit 18.11.0 → 19.1.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 (84) hide show
  1. package/fesm2022/cps-ui-kit.mjs +269 -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/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.d.ts +3 -3
  7. package/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.d.ts +3 -3
  8. package/package.json +6 -8
  9. package/styles/styles.scss +9 -0
  10. package/esm2022/cps-ui-kit.mjs +0 -5
  11. package/esm2022/lib/components/cps-autocomplete/cps-autocomplete.component.mjs +0 -948
  12. package/esm2022/lib/components/cps-button/cps-button.component.mjs +0 -205
  13. package/esm2022/lib/components/cps-button-toggle/cps-button-toggle.component.mjs +0 -239
  14. package/esm2022/lib/components/cps-checkbox/cps-checkbox.component.mjs +0 -154
  15. package/esm2022/lib/components/cps-chip/cps-chip.component.mjs +0 -94
  16. package/esm2022/lib/components/cps-datepicker/cps-datepicker.component.mjs +0 -382
  17. package/esm2022/lib/components/cps-divider/cps-divider.component.mjs +0 -60
  18. package/esm2022/lib/components/cps-expansion-panel/cps-expansion-panel.component.mjs +0 -213
  19. package/esm2022/lib/components/cps-file-upload/cps-file-upload.component.mjs +0 -182
  20. package/esm2022/lib/components/cps-icon/cps-icon.component.mjs +0 -203
  21. package/esm2022/lib/components/cps-info-circle/cps-info-circle.component.mjs +0 -61
  22. package/esm2022/lib/components/cps-input/cps-input.component.mjs +0 -385
  23. package/esm2022/lib/components/cps-loader/cps-loader.component.mjs +0 -58
  24. package/esm2022/lib/components/cps-menu/cps-menu.component.mjs +0 -572
  25. package/esm2022/lib/components/cps-paginator/cps-paginator.component.mjs +0 -118
  26. package/esm2022/lib/components/cps-paginator/pipes/cps-paginate.pipe.mjs +0 -30
  27. package/esm2022/lib/components/cps-progress-circular/cps-progress-circular.component.mjs +0 -51
  28. package/esm2022/lib/components/cps-progress-linear/cps-progress-linear.component.mjs +0 -75
  29. package/esm2022/lib/components/cps-radio-group/cps-radio/cps-radio.component.mjs +0 -42
  30. package/esm2022/lib/components/cps-radio-group/cps-radio-button/cps-radio-button.component.mjs +0 -77
  31. package/esm2022/lib/components/cps-radio-group/cps-radio-group.component.mjs +0 -225
  32. package/esm2022/lib/components/cps-scheduler/cps-scheduler.component.mjs +0 -682
  33. package/esm2022/lib/components/cps-scheduler/cps-scheduler.utils.mjs +0 -604
  34. package/esm2022/lib/components/cps-select/cps-select.component.mjs +0 -654
  35. package/esm2022/lib/components/cps-sidebar-menu/cps-sidebar-menu.component.mjs +0 -110
  36. package/esm2022/lib/components/cps-switch/cps-switch.component.mjs +0 -131
  37. package/esm2022/lib/components/cps-tab-group/cps-tab/cps-tab.component.mjs +0 -86
  38. package/esm2022/lib/components/cps-tab-group/cps-tab-group.component.mjs +0 -308
  39. package/esm2022/lib/components/cps-table/components/internal/cps-sort-icon/cps-sort-icon.component.mjs +0 -79
  40. package/esm2022/lib/components/cps-table/components/internal/table-column-filter/table-column-filter.component.mjs +0 -407
  41. package/esm2022/lib/components/cps-table/components/internal/table-column-filter-constraint/table-column-filter-constraint.component.mjs +0 -147
  42. package/esm2022/lib/components/cps-table/components/internal/table-row-menu/table-row-menu.component.mjs +0 -105
  43. package/esm2022/lib/components/cps-table/cps-column-filter-types.mjs +0 -29
  44. package/esm2022/lib/components/cps-table/cps-table.component.mjs +0 -1022
  45. package/esm2022/lib/components/cps-table/directives/cps-table-column-filter.directive.mjs +0 -181
  46. package/esm2022/lib/components/cps-table/directives/cps-table-column-resizable.directive.mjs +0 -22
  47. package/esm2022/lib/components/cps-table/directives/cps-table-column-sortable.directive.mjs +0 -47
  48. package/esm2022/lib/components/cps-table/directives/cps-table-header-selectable.directive.mjs +0 -32
  49. package/esm2022/lib/components/cps-table/directives/cps-table-row-selectable.directive.mjs +0 -35
  50. package/esm2022/lib/components/cps-table/directives/internal/table-unsort.directive.mjs +0 -212
  51. package/esm2022/lib/components/cps-table/pipes/cps-table-detect-filter-type.pipe.mjs +0 -29
  52. package/esm2022/lib/components/cps-tag/cps-tag.component.mjs +0 -121
  53. package/esm2022/lib/components/cps-textarea/cps-textarea.component.mjs +0 -290
  54. package/esm2022/lib/components/cps-timepicker/cps-timepicker.component.mjs +0 -370
  55. package/esm2022/lib/components/cps-tree-autocomplete/cps-tree-autocomplete.component.mjs +0 -273
  56. package/esm2022/lib/components/cps-tree-select/cps-tree-select.component.mjs +0 -87
  57. package/esm2022/lib/components/cps-tree-table/cps-tree-table.component.mjs +0 -1279
  58. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-column-filter.directive.mjs +0 -174
  59. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-column-resizable.directive.mjs +0 -22
  60. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-column-sortable.directive.mjs +0 -47
  61. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-header-selectable.directive.mjs +0 -33
  62. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-row-selectable.directive.mjs +0 -36
  63. package/esm2022/lib/components/cps-tree-table/directives/cps-tree-table-row-toggler.directive.mjs +0 -48
  64. package/esm2022/lib/components/cps-tree-table/directives/internal/tree-table-unsort.directive.mjs +0 -352
  65. package/esm2022/lib/components/cps-tree-table/pipes/cps-tree-table-detect-filter-type.pipe.mjs +0 -30
  66. package/esm2022/lib/components/internal/cps-base-tree-dropdown/cps-base-tree-dropdown.component.mjs +0 -656
  67. package/esm2022/lib/directives/cps-tooltip/cps-tooltip.directive.mjs +0 -275
  68. package/esm2022/lib/pipes/internal/check-option-selected.pipe.mjs +0 -24
  69. package/esm2022/lib/pipes/internal/combine-labels.pipe.mjs +0 -25
  70. package/esm2022/lib/pipes/internal/label-by-value.pipe.mjs +0 -16
  71. package/esm2022/lib/services/cps-dialog/cps-dialog.service.mjs +0 -146
  72. package/esm2022/lib/services/cps-dialog/internal/components/cps-confirmation/cps-confirmation.component.mjs +0 -25
  73. package/esm2022/lib/services/cps-dialog/internal/components/cps-dialog/cps-dialog.component.mjs +0 -470
  74. package/esm2022/lib/services/cps-dialog/internal/directives/cps-dialog-content.directive.mjs +0 -18
  75. package/esm2022/lib/services/cps-dialog/utils/cps-dialog-config.mjs +0 -3
  76. package/esm2022/lib/services/cps-dialog/utils/cps-dialog-ref.mjs +0 -128
  77. package/esm2022/lib/services/cps-notification/cps-notification.service.mjs +0 -122
  78. package/esm2022/lib/services/cps-notification/internal/components/cps-notification-container/cps-notification-container.component.mjs +0 -95
  79. package/esm2022/lib/services/cps-notification/internal/components/cps-toast/cps-toast.component.mjs +0 -106
  80. package/esm2022/lib/services/cps-notification/utils/cps-notification-config.mjs +0 -27
  81. package/esm2022/lib/services/cps-notification/utils/internal/cps-notification-data.mjs +0 -12
  82. package/esm2022/lib/utils/colors-utils.mjs +0 -59
  83. package/esm2022/lib/utils/internal/size-utils.mjs +0 -24
  84. package/esm2022/public-api.mjs +0 -58
@@ -1,370 +0,0 @@
1
- import { Component, EventEmitter, Input, Optional, Output, Self, ViewChild } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { FormsModule } from '@angular/forms';
4
- import { CpsButtonToggleComponent } from '../cps-button-toggle/cps-button-toggle.component';
5
- import { CpsAutocompleteComponent } from '../cps-autocomplete/cps-autocomplete.component';
6
- import { CpsInfoCircleComponent } from '../cps-info-circle/cps-info-circle.component';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/forms";
9
- import * as i2 from "@angular/common";
10
- /**
11
- * CpsTimepickerComponent allows to pick a specific time from a set of available options or input it manually.
12
- * @group Components
13
- */
14
- export class CpsTimepickerComponent {
15
- /**
16
- * Value of the timepicker.
17
- * @group Props
18
- */
19
- set value(value) {
20
- if (!value)
21
- value = undefined;
22
- this._value = value;
23
- this.onChange(value);
24
- }
25
- get value() {
26
- return this._value;
27
- }
28
- constructor(_control) {
29
- this._control = _control;
30
- /**
31
- * Label of the timepicker.
32
- * @group Props
33
- */
34
- this.label = '';
35
- /**
36
- * Determines whether the timepicker is disabled.
37
- * @group Props
38
- */
39
- this.disabled = false;
40
- /**
41
- * Determines whether the timepicker uses 24-hour format.
42
- * @group Props
43
- */
44
- this.use24HourTime = false;
45
- /**
46
- * Determines whether the timepicker has seconds.
47
- * @group Props
48
- */
49
- this.withSeconds = false;
50
- /**
51
- * Bottom hint text for the timepicker.
52
- * @group Props
53
- */
54
- this.hint = '';
55
- /**
56
- * Hides hint and validation errors.
57
- * @group Props
58
- */
59
- this.hideDetails = false;
60
- /**
61
- * When it is not an empty string, an info icon is displayed to show text for more info.
62
- * @group Props
63
- */
64
- this.infoTooltip = '';
65
- /**
66
- * InfoTooltip class for styling.
67
- * @group Props
68
- */
69
- this.infoTooltipClass = 'cps-tooltip-content';
70
- /**
71
- * Max width of infoTooltip, of type number denoting pixels or string.
72
- * @group Props
73
- */
74
- this.infoTooltipMaxWidth = '100%';
75
- /**
76
- * Determines whether the infoTooltip is persistent.
77
- * @group Props
78
- */
79
- this.infoTooltipPersistent = false;
80
- /**
81
- * Position of infoTooltip, it can be 'top', 'bottom', 'left' or 'right'.
82
- * @group Props
83
- */
84
- this.infoTooltipPosition = 'top';
85
- /**
86
- * Determines whether the timepicker input fields can be cleared.
87
- * @group Props
88
- */
89
- this.mandatoryValue = false;
90
- /**
91
- * Callback to invoke on value change.
92
- * @param {string} string - value changed.
93
- * @group Emits
94
- */
95
- this.valueChanged = new EventEmitter();
96
- /**
97
- * Callback to invoke when the component receives focus.
98
- * @param {any}
99
- * @group Emits
100
- */
101
- this.focused = new EventEmitter();
102
- /**
103
- * Callback to invoke when the component loses focus.
104
- * @param {any}
105
- * @group Emits
106
- */
107
- this.blurred = new EventEmitter();
108
- this.dayPeriodOptions = [
109
- { label: 'AM', value: 'AM' },
110
- { label: 'PM', value: 'PM' }
111
- ];
112
- this.hoursOptions = [];
113
- this.minutesOptions = this._getRange(0, 59).map((m) => ({
114
- value: m.toString().padStart(2, '0'),
115
- label: m.toString().padStart(2, '0')
116
- }));
117
- this.secondsOptions = [];
118
- this.error = '';
119
- this.hoursError = '';
120
- this.minutesError = '';
121
- this.secondsError = '';
122
- this._value = undefined;
123
- // eslint-disable-next-line @typescript-eslint/no-empty-function
124
- this.onChange = (event) => { };
125
- // eslint-disable-next-line @typescript-eslint/no-empty-function
126
- this.onTouched = () => { };
127
- if (this._control) {
128
- this._control.valueAccessor = this;
129
- }
130
- }
131
- ngOnInit() {
132
- this._initHoursOptions();
133
- if (this.withSeconds) {
134
- this.secondsOptions = this._getRange(0, 59).map((m) => ({
135
- value: m.toString().padStart(2, '0'),
136
- label: m.toString().padStart(2, '0')
137
- }));
138
- }
139
- this._statusChangesSubscription = this._control?.statusChanges?.subscribe(() => {
140
- this._checkErrors();
141
- });
142
- }
143
- ngAfterViewInit() {
144
- if (this.hoursField)
145
- this.hoursField.isTimePickerField = true;
146
- if (this.minutesField)
147
- this.minutesField.isTimePickerField = true;
148
- if (this.secondsField)
149
- this.secondsField.isTimePickerField = true;
150
- }
151
- ngOnDestroy() {
152
- this._statusChangesSubscription?.unsubscribe();
153
- }
154
- registerOnChange(fn) {
155
- this.onChange = fn;
156
- }
157
- registerOnTouched(fn) {
158
- this.onTouched = fn;
159
- }
160
- // eslint-disable-next-line @typescript-eslint/no-empty-function
161
- setDisabledState(disabled) { }
162
- writeValue(value) {
163
- this.value = value;
164
- }
165
- onFieldBlur() {
166
- this._checkErrors();
167
- this.blurred.emit();
168
- }
169
- onFieldFocus() {
170
- this._control?.control?.markAsTouched();
171
- this.focused.emit();
172
- }
173
- updateHours(hours) {
174
- hours = hours || '';
175
- const userInput = this.hoursField?.inputText || hours;
176
- if (userInput) {
177
- this._initValue();
178
- const h = parseInt(userInput, 10);
179
- if (!isNaN(h) && this.value) {
180
- if (h >= 13 && h <= 23 && !this.use24HourTime) {
181
- this.value.dayPeriod = 'PM';
182
- }
183
- }
184
- }
185
- if (this.value?.hours !== hours) {
186
- if (this.value)
187
- this.value.hours = hours;
188
- }
189
- this._updateValue(this.value);
190
- }
191
- updateMinutes(minutes) {
192
- minutes = minutes || '';
193
- if (minutes)
194
- this._initValue();
195
- if (this.value?.minutes !== minutes) {
196
- if (this.value)
197
- this.value.minutes = minutes;
198
- }
199
- this._updateValue(this.value);
200
- }
201
- updateSeconds(seconds) {
202
- seconds = seconds || '';
203
- if (seconds)
204
- this._initValue();
205
- if (this.value?.seconds !== seconds) {
206
- if (this.value)
207
- this.value.seconds = seconds;
208
- }
209
- this._updateValue(this.value);
210
- }
211
- updateDayPeriod(dayPeriod) {
212
- if (dayPeriod)
213
- this._initValue();
214
- if (this.value?.dayPeriod !== dayPeriod) {
215
- if (this.value)
216
- this.value.dayPeriod = dayPeriod;
217
- }
218
- this._updateValue(this.value);
219
- }
220
- numberOnly(event) {
221
- const charCode = event.which ? event.which : event.keyCode;
222
- if (charCode > 31 && (charCode < 48 || charCode > 57)) {
223
- return false;
224
- }
225
- return true;
226
- }
227
- _initValue() {
228
- if (!this.value) {
229
- this.value = {
230
- hours: '',
231
- minutes: ''
232
- };
233
- }
234
- if (!this.use24HourTime && !('dayPeriod' in this.value)) {
235
- this.value.dayPeriod = 'AM';
236
- }
237
- if (this.withSeconds && !('seconds' in this.value)) {
238
- this.value.seconds = '';
239
- }
240
- }
241
- _isValueValid() {
242
- if (!this.value)
243
- return false;
244
- if (!this.value.hours || !this.value.minutes)
245
- return false;
246
- if (this.withSeconds && !this.value.seconds)
247
- return false;
248
- if (!this.use24HourTime && !this.value.dayPeriod)
249
- return false;
250
- return true;
251
- }
252
- _updateErrors() {
253
- this.error = 'Time is invalid';
254
- this.hoursError = this.value?.hours ? '' : this.error;
255
- this.minutesError = this.value?.minutes ? '' : this.error;
256
- if (this.withSeconds)
257
- this.secondsError = this.value?.seconds ? '' : this.error;
258
- }
259
- _setErrors(error) {
260
- this.error = error;
261
- this.hoursError = error;
262
- this.minutesError = error;
263
- this.secondsError = this.withSeconds ? error : '';
264
- }
265
- _checkErrors() {
266
- if (!this._control)
267
- return;
268
- if (this.value && !this._isValueValid()) {
269
- this._updateErrors();
270
- return;
271
- }
272
- const errors = this._control?.errors;
273
- if (!this._control?.control?.touched || !errors) {
274
- this._setErrors('');
275
- return;
276
- }
277
- if ('required' in errors) {
278
- this._setErrors('Field is required');
279
- return;
280
- }
281
- const errArr = Object.values(errors);
282
- if (errArr.length < 1) {
283
- this._setErrors('');
284
- return;
285
- }
286
- const message = errArr.find((msg) => typeof msg === 'string');
287
- this._setErrors(message || 'Unknown error');
288
- }
289
- _initHoursOptions() {
290
- const getHourAlias = (h) => {
291
- h = h === 12 ? 0 : h + 12;
292
- return h.toString().padStart(2, '0');
293
- };
294
- this.hoursOptions = (this.use24HourTime ? this._getRange(0, 23) : this._getRange(1, 12)).map((h) => {
295
- const res = {
296
- value: h.toString().padStart(2, '0'),
297
- label: h.toString().padStart(2, '0')
298
- };
299
- if (!this.use24HourTime)
300
- res.alias = getHourAlias(h);
301
- return res;
302
- });
303
- }
304
- _updateValue(value) {
305
- this.writeValue(value);
306
- this.onChange(value);
307
- this.valueChanged.emit(value);
308
- }
309
- _getRange(startFrom, until) {
310
- return Array.from({ length: until + 1 - startFrom }, (_, k) => k + startFrom);
311
- }
312
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: CpsTimepickerComponent, deps: [{ token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
313
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.3", type: CpsTimepickerComponent, isStandalone: true, selector: "cps-timepicker", inputs: { label: "label", disabled: "disabled", use24HourTime: "use24HourTime", withSeconds: "withSeconds", hint: "hint", hideDetails: "hideDetails", infoTooltip: "infoTooltip", infoTooltipClass: "infoTooltipClass", infoTooltipMaxWidth: "infoTooltipMaxWidth", infoTooltipPersistent: "infoTooltipPersistent", infoTooltipPosition: "infoTooltipPosition", mandatoryValue: "mandatoryValue", value: "value" }, outputs: { valueChanged: "valueChanged", focused: "focused", blurred: "blurred" }, viewQueries: [{ propertyName: "hoursField", first: true, predicate: ["hoursField"], descendants: true }, { propertyName: "minutesField", first: true, predicate: ["minutesField"], descendants: true }, { propertyName: "secondsField", first: true, predicate: ["secondsField"], descendants: true }], ngImport: i0, template: "<div class=\"cps-timepicker\">\n <div\n class=\"cps-timepicker-label\"\n [ngClass]=\"{ 'cps-timepicker-label-disabled': disabled }\"\n *ngIf=\"label\">\n <label>{{ label }}</label>\n <cps-info-circle\n *ngIf=\"infoTooltip\"\n class=\"cps-timepicker-label-info-circle\"\n size=\"xsmall\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipContentClass]=\"infoTooltipClass\"\n [tooltipMaxWidth]=\"infoTooltipMaxWidth\"\n [tooltipPersistent]=\"infoTooltipPersistent\"\n [tooltipText]=\"infoTooltip\">\n </cps-info-circle>\n </div>\n <div class=\"cps-timepicker-body\">\n <cps-autocomplete\n #hoursField\n (keypress)=\"numberOnly($event)\"\n width=\"60\"\n [emptyOptionIndex]=\"mandatoryValue ? 0 : -1\"\n [options]=\"hoursOptions\"\n [withOptionsAliases]=\"!use24HourTime\"\n [useOptionsAliasesWhenNoMatch]=\"true\"\n [hideDetails]=\"true\"\n [disabled]=\"disabled\"\n [showChevron]=\"false\"\n [showEmptyMessage]=\"false\"\n (focused)=\"onFieldFocus()\"\n (blurred)=\"onFieldBlur()\"\n [returnObject]=\"false\"\n [value]=\"value?.hours\"\n (valueChanged)=\"updateHours($event)\"\n [externalError]=\"hoursError\"\n placeholder=\"HH\"></cps-autocomplete>\n <span class=\"cps-timepicker-delimiter\">:</span>\n <cps-autocomplete\n #minutesField\n (keypress)=\"numberOnly($event)\"\n width=\"60\"\n [emptyOptionIndex]=\"mandatoryValue ? 0 : -1\"\n [options]=\"minutesOptions\"\n [hideDetails]=\"true\"\n [disabled]=\"disabled\"\n [showChevron]=\"false\"\n [showEmptyMessage]=\"false\"\n (focused)=\"onFieldFocus()\"\n (blurred)=\"onFieldBlur()\"\n [returnObject]=\"false\"\n [value]=\"value?.minutes\"\n (valueChanged)=\"updateMinutes($event)\"\n [externalError]=\"minutesError\"\n placeholder=\"MM\"></cps-autocomplete>\n <span *ngIf=\"withSeconds\" class=\"cps-timepicker-delimiter\">:</span>\n <cps-autocomplete\n *ngIf=\"withSeconds\"\n #secondsField\n (keypress)=\"numberOnly($event)\"\n width=\"60\"\n [emptyOptionIndex]=\"mandatoryValue ? 0 : -1\"\n [options]=\"secondsOptions\"\n [hideDetails]=\"true\"\n [disabled]=\"disabled\"\n [showChevron]=\"false\"\n [showEmptyMessage]=\"false\"\n (focused)=\"onFieldFocus()\"\n (blurred)=\"onFieldBlur()\"\n [returnObject]=\"false\"\n [value]=\"value?.seconds\"\n (valueChanged)=\"updateSeconds($event)\"\n [externalError]=\"secondsError\"\n placeholder=\"SS\"></cps-autocomplete>\n <cps-button-toggle\n *ngIf=\"!use24HourTime\"\n class=\"cps-timepicker-am-pm-selector\"\n [options]=\"dayPeriodOptions\"\n [disabled]=\"disabled\"\n [value]=\"value?.dayPeriod || 'AM'\"\n (valueChanged)=\"updateDayPeriod($event)\">\n </cps-button-toggle>\n </div>\n <div *ngIf=\"!error && !hideDetails\" class=\"cps-timepicker-hint\">\n {{ hint }}\n </div>\n <div *ngIf=\"error && !hideDetails\" class=\"cps-timepicker-error\">\n {{ error }}\n </div>\n</div>\n", styles: [":host .cps-timepicker{display:flex;flex-direction:column}:host .cps-timepicker .cps-timepicker-label{align-items:center;display:inline-flex;margin-bottom:.2rem;color:var(--cps-color-text-dark);font-size:.875rem;font-weight:600}:host .cps-timepicker .cps-timepicker-label-info-circle{margin-left:8px}:host .cps-timepicker .cps-timepicker-label-disabled{color:var(--cps-color-text-mild)}:host .cps-timepicker-body{display:flex;flex-direction:row}:host .cps-timepicker-body .cps-timepicker-am-pm-selector{margin-left:10px;margin-top:0}:host .cps-timepicker-body .cps-timepicker-delimiter{color:var(--cps-color-text-lightest);font-size:24px;margin:0 10px}:host .cps-timepicker .cps-timepicker-hint{color:var(--cps-color-text-mild);font-size:.75rem;min-height:1.125rem;line-height:1.125rem;cursor:default;margin-top:.2rem}:host .cps-timepicker .cps-timepicker-error{color:var(--cps-color-error);font-weight:700;font-size:.75rem;min-height:1.125rem;line-height:1.125rem;cursor:default;margin-top:.2rem}\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: "ngmodule", type: FormsModule }, { 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: 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"] }, { kind: "component", type: CpsInfoCircleComponent, selector: "cps-info-circle", inputs: ["size", "tooltipText", "tooltipPosition", "tooltipContentClass", "tooltipMaxWidth", "tooltipPersistent"] }] }); }
314
- }
315
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: CpsTimepickerComponent, decorators: [{
316
- type: Component,
317
- args: [{ selector: 'cps-timepicker', standalone: true, imports: [
318
- CommonModule,
319
- FormsModule,
320
- CpsButtonToggleComponent,
321
- CpsAutocompleteComponent,
322
- CpsInfoCircleComponent
323
- ], template: "<div class=\"cps-timepicker\">\n <div\n class=\"cps-timepicker-label\"\n [ngClass]=\"{ 'cps-timepicker-label-disabled': disabled }\"\n *ngIf=\"label\">\n <label>{{ label }}</label>\n <cps-info-circle\n *ngIf=\"infoTooltip\"\n class=\"cps-timepicker-label-info-circle\"\n size=\"xsmall\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipContentClass]=\"infoTooltipClass\"\n [tooltipMaxWidth]=\"infoTooltipMaxWidth\"\n [tooltipPersistent]=\"infoTooltipPersistent\"\n [tooltipText]=\"infoTooltip\">\n </cps-info-circle>\n </div>\n <div class=\"cps-timepicker-body\">\n <cps-autocomplete\n #hoursField\n (keypress)=\"numberOnly($event)\"\n width=\"60\"\n [emptyOptionIndex]=\"mandatoryValue ? 0 : -1\"\n [options]=\"hoursOptions\"\n [withOptionsAliases]=\"!use24HourTime\"\n [useOptionsAliasesWhenNoMatch]=\"true\"\n [hideDetails]=\"true\"\n [disabled]=\"disabled\"\n [showChevron]=\"false\"\n [showEmptyMessage]=\"false\"\n (focused)=\"onFieldFocus()\"\n (blurred)=\"onFieldBlur()\"\n [returnObject]=\"false\"\n [value]=\"value?.hours\"\n (valueChanged)=\"updateHours($event)\"\n [externalError]=\"hoursError\"\n placeholder=\"HH\"></cps-autocomplete>\n <span class=\"cps-timepicker-delimiter\">:</span>\n <cps-autocomplete\n #minutesField\n (keypress)=\"numberOnly($event)\"\n width=\"60\"\n [emptyOptionIndex]=\"mandatoryValue ? 0 : -1\"\n [options]=\"minutesOptions\"\n [hideDetails]=\"true\"\n [disabled]=\"disabled\"\n [showChevron]=\"false\"\n [showEmptyMessage]=\"false\"\n (focused)=\"onFieldFocus()\"\n (blurred)=\"onFieldBlur()\"\n [returnObject]=\"false\"\n [value]=\"value?.minutes\"\n (valueChanged)=\"updateMinutes($event)\"\n [externalError]=\"minutesError\"\n placeholder=\"MM\"></cps-autocomplete>\n <span *ngIf=\"withSeconds\" class=\"cps-timepicker-delimiter\">:</span>\n <cps-autocomplete\n *ngIf=\"withSeconds\"\n #secondsField\n (keypress)=\"numberOnly($event)\"\n width=\"60\"\n [emptyOptionIndex]=\"mandatoryValue ? 0 : -1\"\n [options]=\"secondsOptions\"\n [hideDetails]=\"true\"\n [disabled]=\"disabled\"\n [showChevron]=\"false\"\n [showEmptyMessage]=\"false\"\n (focused)=\"onFieldFocus()\"\n (blurred)=\"onFieldBlur()\"\n [returnObject]=\"false\"\n [value]=\"value?.seconds\"\n (valueChanged)=\"updateSeconds($event)\"\n [externalError]=\"secondsError\"\n placeholder=\"SS\"></cps-autocomplete>\n <cps-button-toggle\n *ngIf=\"!use24HourTime\"\n class=\"cps-timepicker-am-pm-selector\"\n [options]=\"dayPeriodOptions\"\n [disabled]=\"disabled\"\n [value]=\"value?.dayPeriod || 'AM'\"\n (valueChanged)=\"updateDayPeriod($event)\">\n </cps-button-toggle>\n </div>\n <div *ngIf=\"!error && !hideDetails\" class=\"cps-timepicker-hint\">\n {{ hint }}\n </div>\n <div *ngIf=\"error && !hideDetails\" class=\"cps-timepicker-error\">\n {{ error }}\n </div>\n</div>\n", styles: [":host .cps-timepicker{display:flex;flex-direction:column}:host .cps-timepicker .cps-timepicker-label{align-items:center;display:inline-flex;margin-bottom:.2rem;color:var(--cps-color-text-dark);font-size:.875rem;font-weight:600}:host .cps-timepicker .cps-timepicker-label-info-circle{margin-left:8px}:host .cps-timepicker .cps-timepicker-label-disabled{color:var(--cps-color-text-mild)}:host .cps-timepicker-body{display:flex;flex-direction:row}:host .cps-timepicker-body .cps-timepicker-am-pm-selector{margin-left:10px;margin-top:0}:host .cps-timepicker-body .cps-timepicker-delimiter{color:var(--cps-color-text-lightest);font-size:24px;margin:0 10px}:host .cps-timepicker .cps-timepicker-hint{color:var(--cps-color-text-mild);font-size:.75rem;min-height:1.125rem;line-height:1.125rem;cursor:default;margin-top:.2rem}:host .cps-timepicker .cps-timepicker-error{color:var(--cps-color-error);font-weight:700;font-size:.75rem;min-height:1.125rem;line-height:1.125rem;cursor:default;margin-top:.2rem}\n"] }]
324
- }], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
325
- type: Self
326
- }, {
327
- type: Optional
328
- }] }], propDecorators: { label: [{
329
- type: Input
330
- }], disabled: [{
331
- type: Input
332
- }], use24HourTime: [{
333
- type: Input
334
- }], withSeconds: [{
335
- type: Input
336
- }], hint: [{
337
- type: Input
338
- }], hideDetails: [{
339
- type: Input
340
- }], infoTooltip: [{
341
- type: Input
342
- }], infoTooltipClass: [{
343
- type: Input
344
- }], infoTooltipMaxWidth: [{
345
- type: Input
346
- }], infoTooltipPersistent: [{
347
- type: Input
348
- }], infoTooltipPosition: [{
349
- type: Input
350
- }], mandatoryValue: [{
351
- type: Input
352
- }], value: [{
353
- type: Input
354
- }], valueChanged: [{
355
- type: Output
356
- }], focused: [{
357
- type: Output
358
- }], blurred: [{
359
- type: Output
360
- }], hoursField: [{
361
- type: ViewChild,
362
- args: ['hoursField']
363
- }], minutesField: [{
364
- type: ViewChild,
365
- args: ['minutesField']
366
- }], secondsField: [{
367
- type: ViewChild,
368
- args: ['secondsField']
369
- }] } });
370
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BzLXRpbWVwaWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3BzLXVpLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvY3BzLXRpbWVwaWNrZXIvY3BzLXRpbWVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3BzLXVpLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvY3BzLXRpbWVwaWNrZXIvY3BzLXRpbWVwaWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBQ04sSUFBSSxFQUNKLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBRXhELE9BQU8sRUFDTCx3QkFBd0IsRUFFekIsTUFBTSxrREFBa0QsQ0FBQztBQUMxRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUUxRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQzs7OztBQWF0Rjs7O0dBR0c7QUFjSCxNQUFNLE9BQU8sc0JBQXNCO0lBMkVqQzs7O09BR0c7SUFDSCxJQUFhLEtBQUssQ0FBQyxLQUEwQjtRQUMzQyxJQUFJLENBQUMsS0FBSztZQUFFLEtBQUssR0FBRyxTQUFTLENBQUM7UUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUF1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QkFNRyxhQUFhO3NCQUFyQixLQUFLO2dCQU1HLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTUcsSUFBSTtzQkFBWixLQUFLO2dCQU1HLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTUcsV0FBVztzQkFBbkIsS0FBSztnQkFNRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBTUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQU1HLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFNRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBTUcsY0FBYztzQkFBdEIsS0FBSztnQkFNTyxLQUFLO3NCQUFqQixLQUFLO2dCQWVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBT0csT0FBTztzQkFBaEIsTUFBTTtnQkFPRyxPQUFPO3NCQUFoQixNQUFNO2dCQUdQLFVBQVU7c0JBRFQsU0FBUzt1QkFBQyxZQUFZO2dCQUl2QixZQUFZO3NCQURYLFNBQVM7dUJBQUMsY0FBYztnQkFJekIsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBTZWxmLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgQ3BzQnV0dG9uVG9nZ2xlQ29tcG9uZW50LFxuICBDcHNCdXR0b25Ub2dnbGVPcHRpb25cbn0gZnJvbSAnLi4vY3BzLWJ1dHRvbi10b2dnbGUvY3BzLWJ1dHRvbi10b2dnbGUuY29tcG9uZW50JztcbmltcG9ydCB7IENwc0F1dG9jb21wbGV0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2Nwcy1hdXRvY29tcGxldGUvY3BzLWF1dG9jb21wbGV0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3BzVG9vbHRpcFBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9jcHMtdG9vbHRpcC9jcHMtdG9vbHRpcC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ3BzSW5mb0NpcmNsZUNvbXBvbmVudCB9IGZyb20gJy4uL2Nwcy1pbmZvLWNpcmNsZS9jcHMtaW5mby1jaXJjbGUuY29tcG9uZW50JztcblxuLyoqXG4gKiBDcHNUaW1lIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSB0aW1lIGZvcm1hdC5cbiAqIEBncm91cCBJbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcHNUaW1lIHtcbiAgaG91cnM6IHN0cmluZztcbiAgbWludXRlczogc3RyaW5nO1xuICBzZWNvbmRzPzogc3RyaW5nO1xuICBkYXlQZXJpb2Q/OiAnQU0nIHwgJ1BNJztcbn1cblxuLyoqXG4gKiBDcHNUaW1lcGlja2VyQ29tcG9uZW50IGFsbG93cyB0byBwaWNrIGEgc3BlY2lmaWMgdGltZSBmcm9tIGEgc2V0IG9mIGF2YWlsYWJsZSBvcHRpb25zIG9yIGlucHV0IGl0IG1hbnVhbGx5LlxuICogQGdyb3VwIENvbXBvbmVudHNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3BzLXRpbWVwaWNrZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIENwc0J1dHRvblRvZ2dsZUNvbXBvbmVudCxcbiAgICBDcHNBdXRvY29tcGxldGVDb21wb25lbnQsXG4gICAgQ3BzSW5mb0NpcmNsZUNvbXBvbmVudFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vY3BzLXRpbWVwaWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jcHMtdGltZXBpY2tlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENwc1RpbWVwaWNrZXJDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveVxue1xuICAvKipcbiAgICogTGFiZWwgb2YgdGhlIHRpbWVwaWNrZXIuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgbGFiZWwgPSAnJztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0aW1lcGlja2VyIGlzIGRpc2FibGVkLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgdGltZXBpY2tlciB1c2VzIDI0LWhvdXIgZm9ybWF0LlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHVzZTI0SG91clRpbWUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0aW1lcGlja2VyIGhhcyBzZWNvbmRzLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHdpdGhTZWNvbmRzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEJvdHRvbSBoaW50IHRleHQgZm9yIHRoZSB0aW1lcGlja2VyLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGhpbnQgPSAnJztcblxuICAvKipcbiAgICogSGlkZXMgaGludCBhbmQgdmFsaWRhdGlvbiBlcnJvcnMuXG4gICAqIEBncm91cCBQcm9wc1xuICAgKi9cbiAgQElucHV0KCkgaGlkZURldGFpbHMgPSBmYWxzZTtcblxuICAvKipcbiAgICogV2hlbiBpdCBpcyBub3QgYW4gZW1wdHkgc3RyaW5nLCBhbiBpbmZvIGljb24gaXMgZGlzcGxheWVkIHRvIHNob3cgdGV4dCBmb3IgbW9yZSBpbmZvLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGluZm9Ub29sdGlwID0gJyc7XG5cbiAgLyoqXG4gICAqIEluZm9Ub29sdGlwIGNsYXNzIGZvciBzdHlsaW5nLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGluZm9Ub29sdGlwQ2xhc3MgPSAnY3BzLXRvb2x0aXAtY29udGVudCc7XG5cbiAgLyoqXG4gICAqIE1heCB3aWR0aCBvZiBpbmZvVG9vbHRpcCwgb2YgdHlwZSBudW1iZXIgZGVub3RpbmcgcGl4ZWxzIG9yIHN0cmluZy5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcE1heFdpZHRoOiBudW1iZXIgfCBzdHJpbmcgPSAnMTAwJSc7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgaW5mb1Rvb2x0aXAgaXMgcGVyc2lzdGVudC5cbiAgICogQGdyb3VwIFByb3BzXG4gICAqL1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcFBlcnNpc3RlbnQgPSBmYWxzZTtcblxuICAvKipcbiAgICogUG9zaXRpb24gb2YgaW5mb1Rvb2x0aXAsIGl0IGNhbiBiZSAndG9wJywgJ2JvdHRvbScsICdsZWZ0JyBvciAncmlnaHQnLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIGluZm9Ub29sdGlwUG9zaXRpb246IENwc1Rvb2x0aXBQb3NpdGlvbiA9ICd0b3AnO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRpbWVwaWNrZXIgaW5wdXQgZmllbGRzIGNhbiBiZSBjbGVhcmVkLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIG1hbmRhdG9yeVZhbHVlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFZhbHVlIG9mIHRoZSB0aW1lcGlja2VyLlxuICAgKiBAZ3JvdXAgUHJvcHNcbiAgICovXG4gIEBJbnB1dCgpIHNldCB2YWx1ZSh2YWx1ZTogQ3BzVGltZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghdmFsdWUpIHZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogQ3BzVGltZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSBvbiB2YWx1ZSBjaGFuZ2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgLSB2YWx1ZSBjaGFuZ2VkLlxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENwc1RpbWU+KCk7XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSBjb21wb25lbnQgcmVjZWl2ZXMgZm9jdXMuXG4gICAqIEBwYXJhbSB7YW55fVxuICAgKiBAZ3JvdXAgRW1pdHNcbiAgICovXG4gIEBPdXRwdXQoKSBmb2N1c2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgY29tcG9uZW50IGxvc2VzIGZvY3VzLlxuICAgKiBAcGFyYW0ge2FueX1cbiAgICogQGdyb3VwIEVtaXRzXG4gICAqL1xuICBAT3V0cHV0KCkgYmx1cnJlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKCdob3Vyc0ZpZWxkJylcbiAgaG91cnNGaWVsZCE6IENwc0F1dG9jb21wbGV0ZUNvbXBvbmVudDtcblxuICBAVmlld0NoaWxkKCdtaW51dGVzRmllbGQnKVxuICBtaW51dGVzRmllbGQhOiBDcHNBdXRvY29tcGxldGVDb21wb25lbnQ7XG5cbiAgQFZpZXdDaGlsZCgnc2Vjb25kc0ZpZWxkJylcbiAgc2Vjb25kc0ZpZWxkPzogQ3BzQXV0b2NvbXBsZXRlQ29tcG9uZW50O1xuXG4gIGRheVBlcmlvZE9wdGlvbnM6IENwc0J1dHRvblRvZ2dsZU9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICdBTScsIHZhbHVlOiAnQU0nIH0sXG4gICAgeyBsYWJlbDogJ1BNJywgdmFsdWU6ICdQTScgfVxuICBdO1xuXG4gIGhvdXJzT3B0aW9uczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdO1xuXG4gIG1pbnV0ZXNPcHRpb25zID0gdGhpcy5fZ2V0UmFuZ2UoMCwgNTkpLm1hcCgobSkgPT4gKHtcbiAgICB2YWx1ZTogbS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyksXG4gICAgbGFiZWw6IG0udG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXG4gIH0pKTtcblxuICBzZWNvbmRzT3B0aW9uczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtdO1xuXG4gIHByaXZhdGUgX3N0YXR1c0NoYW5nZXNTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgZXJyb3IgPSAnJztcbiAgaG91cnNFcnJvciA9ICcnO1xuICBtaW51dGVzRXJyb3IgPSAnJztcbiAgc2Vjb25kc0Vycm9yID0gJyc7XG5cbiAgcHJpdmF0ZSBfdmFsdWU6IENwc1RpbWUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoQFNlbGYoKSBAT3B0aW9uYWwoKSBwcml2YXRlIF9jb250cm9sOiBOZ0NvbnRyb2wpIHtcbiAgICBpZiAodGhpcy5fY29udHJvbCkge1xuICAgICAgdGhpcy5fY29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pbml0SG91cnNPcHRpb25zKCk7XG5cbiAgICBpZiAodGhpcy53aXRoU2Vjb25kcykge1xuICAgICAgdGhpcy5zZWNvbmRzT3B0aW9ucyA9IHRoaXMuX2dldFJhbmdlKDAsIDU5KS5tYXAoKG0pID0+ICh7XG4gICAgICAgIHZhbHVlOiBtLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSxcbiAgICAgICAgbGFiZWw6IG0udG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdHVzQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IHRoaXMuX2NvbnRyb2w/LnN0YXR1c0NoYW5nZXM/LnN1YnNjcmliZShcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5fY2hlY2tFcnJvcnMoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvdXJzRmllbGQpIHRoaXMuaG91cnNGaWVsZC5pc1RpbWVQaWNrZXJGaWVsZCA9IHRydWU7XG4gICAgaWYgKHRoaXMubWludXRlc0ZpZWxkKSB0aGlzLm1pbnV0ZXNGaWVsZC5pc1RpbWVQaWNrZXJGaWVsZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2Vjb25kc0ZpZWxkKSB0aGlzLnNlY29uZHNGaWVsZC5pc1RpbWVQaWNrZXJGaWVsZCA9IHRydWU7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdGF0dXNDaGFuZ2VzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBvbkNoYW5nZSA9IChldmVudDogYW55KSA9PiB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBvblRvdWNoZWQgPSAoKSA9PiB7fTtcblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbikge31cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBDcHNUaW1lIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgb25GaWVsZEJsdXIoKSB7XG4gICAgdGhpcy5fY2hlY2tFcnJvcnMoKTtcbiAgICB0aGlzLmJsdXJyZWQuZW1pdCgpO1xuICB9XG5cbiAgb25GaWVsZEZvY3VzKCkge1xuICAgIHRoaXMuX2NvbnRyb2w/LmNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLmZvY3VzZWQuZW1pdCgpO1xuICB9XG5cbiAgdXBkYXRlSG91cnMoaG91cnM6IHN0cmluZykge1xuICAgIGhvdXJzID0gaG91cnMgfHwgJyc7XG4gICAgY29uc3QgdXNlcklucHV0ID0gdGhpcy5ob3Vyc0ZpZWxkPy5pbnB1dFRleHQgfHwgaG91cnM7XG4gICAgaWYgKHVzZXJJbnB1dCkge1xuICAgICAgdGhpcy5faW5pdFZhbHVlKCk7XG4gICAgICBjb25zdCBoID0gcGFyc2VJbnQodXNlcklucHV0LCAxMCk7XG4gICAgICBpZiAoIWlzTmFOKGgpICYmIHRoaXMudmFsdWUpIHtcbiAgICAgICAgaWYgKGggPj0gMTMgJiYgaCA8PSAyMyAmJiAhdGhpcy51c2UyNEhvdXJUaW1lKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZS5kYXlQZXJpb2QgPSAnUE0nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudmFsdWU/LmhvdXJzICE9PSBob3Vycykge1xuICAgICAgaWYgKHRoaXMudmFsdWUpIHRoaXMudmFsdWUuaG91cnMgPSBob3VycztcbiAgICB9XG4gICAgdGhpcy5fdXBkYXRlVmFsdWUodGhpcy52YWx1ZSk7XG4gIH1cblxuICB1cGRhdGVNaW51dGVzKG1pbnV0ZXM6IHN0cmluZykge1xuICAgIG1pbnV0ZXMgPSBtaW51dGVzIHx8ICcnO1xuICAgIGlmIChtaW51dGVzKSB0aGlzLl9pbml0VmFsdWUoKTtcbiAgICBpZiAodGhpcy52YWx1ZT8ubWludXRlcyAhPT0gbWludXRlcykge1xuICAgICAgaWYgKHRoaXMudmFsdWUpIHRoaXMudmFsdWUubWludXRlcyA9IG1pbnV0ZXM7XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZVZhbHVlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgdXBkYXRlU2Vjb25kcyhzZWNvbmRzOiBzdHJpbmcpIHtcbiAgICBzZWNvbmRzID0gc2Vjb25kcyB8fCAnJztcbiAgICBpZiAoc2Vjb25kcykgdGhpcy5faW5pdFZhbHVlKCk7XG4gICAgaWYgKHRoaXMudmFsdWU/LnNlY29uZHMgIT09IHNlY29uZHMpIHtcbiAgICAgIGlmICh0aGlzLnZhbHVlKSB0aGlzLnZhbHVlLnNlY29uZHMgPSBzZWNvbmRzO1xuICAgIH1cbiAgICB0aGlzLl91cGRhdGVWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIHVwZGF0ZURheVBlcmlvZChkYXlQZXJpb2Q6ICdBTScgfCAnUE0nKSB7XG4gICAgaWYgKGRheVBlcmlvZCkgdGhpcy5faW5pdFZhbHVlKCk7XG4gICAgaWYgKHRoaXMudmFsdWU/LmRheVBlcmlvZCAhPT0gZGF5UGVyaW9kKSB7XG4gICAgICBpZiAodGhpcy52YWx1ZSkgdGhpcy52YWx1ZS5kYXlQZXJpb2QgPSBkYXlQZXJpb2Q7XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZVZhbHVlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgbnVtYmVyT25seShldmVudDogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2hhckNvZGUgPSBldmVudC53aGljaCA/IGV2ZW50LndoaWNoIDogZXZlbnQua2V5Q29kZTtcbiAgICBpZiAoY2hhckNvZGUgPiAzMSAmJiAoY2hhckNvZGUgPCA0OCB8fCBjaGFyQ29kZSA+IDU3KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRWYWx1ZSgpIHtcbiAgICBpZiAoIXRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB7XG4gICAgICAgIGhvdXJzOiAnJyxcbiAgICAgICAgbWludXRlczogJydcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICghdGhpcy51c2UyNEhvdXJUaW1lICYmICEoJ2RheVBlcmlvZCcgaW4gdGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMudmFsdWUuZGF5UGVyaW9kID0gJ0FNJztcbiAgICB9XG4gICAgaWYgKHRoaXMud2l0aFNlY29uZHMgJiYgISgnc2Vjb25kcycgaW4gdGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMudmFsdWUuc2Vjb25kcyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2lzVmFsdWVWYWxpZCgpIHtcbiAgICBpZiAoIXRoaXMudmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXRoaXMudmFsdWUuaG91cnMgfHwgIXRoaXMudmFsdWUubWludXRlcykgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLndpdGhTZWNvbmRzICYmICF0aGlzLnZhbHVlLnNlY29uZHMpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXRoaXMudXNlMjRIb3VyVGltZSAmJiAhdGhpcy52YWx1ZS5kYXlQZXJpb2QpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUVycm9ycygpIHtcbiAgICB0aGlzLmVycm9yID0gJ1RpbWUgaXMgaW52YWxpZCc7XG4gICAgdGhpcy5ob3Vyc0Vycm9yID0gdGhpcy52YWx1ZT8uaG91cnMgPyAnJyA6IHRoaXMuZXJyb3I7XG4gICAgdGhpcy5taW51dGVzRXJyb3IgPSB0aGlzLnZhbHVlPy5taW51dGVzID8gJycgOiB0aGlzLmVycm9yO1xuICAgIGlmICh0aGlzLndpdGhTZWNvbmRzKVxuICAgICAgdGhpcy5zZWNvbmRzRXJyb3IgPSB0aGlzLnZhbHVlPy5zZWNvbmRzID8gJycgOiB0aGlzLmVycm9yO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0RXJyb3JzKGVycm9yOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVycm9yID0gZXJyb3I7XG4gICAgdGhpcy5ob3Vyc0Vycm9yID0gZXJyb3I7XG4gICAgdGhpcy5taW51dGVzRXJyb3IgPSBlcnJvcjtcbiAgICB0aGlzLnNlY29uZHNFcnJvciA9IHRoaXMud2l0aFNlY29uZHMgPyBlcnJvciA6ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tFcnJvcnMoKSB7XG4gICAgaWYgKCF0aGlzLl9jb250cm9sKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy52YWx1ZSAmJiAhdGhpcy5faXNWYWx1ZVZhbGlkKCkpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUVycm9ycygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuX2NvbnRyb2w/LmVycm9ycztcblxuICAgIGlmICghdGhpcy5fY29udHJvbD8uY29udHJvbD8udG91Y2hlZCB8fCAhZXJyb3JzKSB7XG4gICAgICB0aGlzLl9zZXRFcnJvcnMoJycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICgncmVxdWlyZWQnIGluIGVycm9ycykge1xuICAgICAgdGhpcy5fc2V0RXJyb3JzKCdGaWVsZCBpcyByZXF1aXJlZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVyckFyciA9IE9iamVjdC52YWx1ZXMoZXJyb3JzKTtcbiAgICBpZiAoZXJyQXJyLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRoaXMuX3NldEVycm9ycygnJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJBcnIuZmluZCgobXNnKSA9PiB0eXBlb2YgbXNnID09PSAnc3RyaW5nJyk7XG5cbiAgICB0aGlzLl9zZXRFcnJvcnMobWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdEhvdXJzT3B0aW9ucygpIHtcbiAgICBjb25zdCBnZXRIb3VyQWxpYXMgPSAoaDogbnVtYmVyKSA9PiB7XG4gICAgICBoID0gaCA9PT0gMTIgPyAwIDogaCArIDEyO1xuICAgICAgcmV0dXJuIGgudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIH07XG5cbiAgICB0aGlzLmhvdXJzT3B0aW9ucyA9IChcbiAgICAgIHRoaXMudXNlMjRIb3VyVGltZSA/IHRoaXMuX2dldFJhbmdlKDAsIDIzKSA6IHRoaXMuX2dldFJhbmdlKDEsIDEyKVxuICAgICkubWFwKChoKSA9PiB7XG4gICAgICBjb25zdCByZXM6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZzsgYWxpYXM/OiBzdHJpbmcgfSA9IHtcbiAgICAgICAgdmFsdWU6IGgudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpLFxuICAgICAgICBsYWJlbDogaC50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcbiAgICAgIH07XG4gICAgICBpZiAoIXRoaXMudXNlMjRIb3VyVGltZSkgcmVzLmFsaWFzID0gZ2V0SG91ckFsaWFzKGgpO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVZhbHVlKHZhbHVlOiBDcHNUaW1lIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy53cml0ZVZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlZC5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJhbmdlKHN0YXJ0RnJvbTogbnVtYmVyLCB1bnRpbDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICB7IGxlbmd0aDogdW50aWwgKyAxIC0gc3RhcnRGcm9tIH0sXG4gICAgICAoXywgaykgPT4gayArIHN0YXJ0RnJvbVxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjcHMtdGltZXBpY2tlclwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjcHMtdGltZXBpY2tlci1sYWJlbFwiXG4gICAgW25nQ2xhc3NdPVwieyAnY3BzLXRpbWVwaWNrZXItbGFiZWwtZGlzYWJsZWQnOiBkaXNhYmxlZCB9XCJcbiAgICAqbmdJZj1cImxhYmVsXCI+XG4gICAgPGxhYmVsPnt7IGxhYmVsIH19PC9sYWJlbD5cbiAgICA8Y3BzLWluZm8tY2lyY2xlXG4gICAgICAqbmdJZj1cImluZm9Ub29sdGlwXCJcbiAgICAgIGNsYXNzPVwiY3BzLXRpbWVwaWNrZXItbGFiZWwtaW5mby1jaXJjbGVcIlxuICAgICAgc2l6ZT1cInhzbWFsbFwiXG4gICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cImluZm9Ub29sdGlwUG9zaXRpb25cIlxuICAgICAgW3Rvb2x0aXBDb250ZW50Q2xhc3NdPVwiaW5mb1Rvb2x0aXBDbGFzc1wiXG4gICAgICBbdG9vbHRpcE1heFdpZHRoXT1cImluZm9Ub29sdGlwTWF4V2lkdGhcIlxuICAgICAgW3Rvb2x0aXBQZXJzaXN0ZW50XT1cImluZm9Ub29sdGlwUGVyc2lzdGVudFwiXG4gICAgICBbdG9vbHRpcFRleHRdPVwiaW5mb1Rvb2x0aXBcIj5cbiAgICA8L2Nwcy1pbmZvLWNpcmNsZT5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjcHMtdGltZXBpY2tlci1ib2R5XCI+XG4gICAgPGNwcy1hdXRvY29tcGxldGVcbiAgICAgICNob3Vyc0ZpZWxkXG4gICAgICAoa2V5cHJlc3MpPVwibnVtYmVyT25seSgkZXZlbnQpXCJcbiAgICAgIHdpZHRoPVwiNjBcIlxuICAgICAgW2VtcHR5T3B0aW9uSW5kZXhdPVwibWFuZGF0b3J5VmFsdWUgPyAwIDogLTFcIlxuICAgICAgW29wdGlvbnNdPVwiaG91cnNPcHRpb25zXCJcbiAgICAgIFt3aXRoT3B0aW9uc0FsaWFzZXNdPVwiIXVzZTI0SG91clRpbWVcIlxuICAgICAgW3VzZU9wdGlvbnNBbGlhc2VzV2hlbk5vTWF0Y2hdPVwidHJ1ZVwiXG4gICAgICBbaGlkZURldGFpbHNdPVwidHJ1ZVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW3Nob3dDaGV2cm9uXT1cImZhbHNlXCJcbiAgICAgIFtzaG93RW1wdHlNZXNzYWdlXT1cImZhbHNlXCJcbiAgICAgIChmb2N1c2VkKT1cIm9uRmllbGRGb2N1cygpXCJcbiAgICAgIChibHVycmVkKT1cIm9uRmllbGRCbHVyKClcIlxuICAgICAgW3JldHVybk9iamVjdF09XCJmYWxzZVwiXG4gICAgICBbdmFsdWVdPVwidmFsdWU/LmhvdXJzXCJcbiAgICAgICh2YWx1ZUNoYW5nZWQpPVwidXBkYXRlSG91cnMoJGV2ZW50KVwiXG4gICAgICBbZXh0ZXJuYWxFcnJvcl09XCJob3Vyc0Vycm9yXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiSEhcIj48L2Nwcy1hdXRvY29tcGxldGU+XG4gICAgPHNwYW4gY2xhc3M9XCJjcHMtdGltZXBpY2tlci1kZWxpbWl0ZXJcIj46PC9zcGFuPlxuICAgIDxjcHMtYXV0b2NvbXBsZXRlXG4gICAgICAjbWludXRlc0ZpZWxkXG4gICAgICAoa2V5cHJlc3MpPVwibnVtYmVyT25seSgkZXZlbnQpXCJcbiAgICAgIHdpZHRoPVwiNjBcIlxuICAgICAgW2VtcHR5T3B0aW9uSW5kZXhdPVwibWFuZGF0b3J5VmFsdWUgPyAwIDogLTFcIlxuICAgICAgW29wdGlvbnNdPVwibWludXRlc09wdGlvbnNcIlxuICAgICAgW2hpZGVEZXRhaWxzXT1cInRydWVcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtzaG93Q2hldnJvbl09XCJmYWxzZVwiXG4gICAgICBbc2hvd0VtcHR5TWVzc2FnZV09XCJmYWxzZVwiXG4gICAgICAoZm9jdXNlZCk9XCJvbkZpZWxkRm9jdXMoKVwiXG4gICAgICAoYmx1cnJlZCk9XCJvbkZpZWxkQmx1cigpXCJcbiAgICAgIFtyZXR1cm5PYmplY3RdPVwiZmFsc2VcIlxuICAgICAgW3ZhbHVlXT1cInZhbHVlPy5taW51dGVzXCJcbiAgICAgICh2YWx1ZUNoYW5nZWQpPVwidXBkYXRlTWludXRlcygkZXZlbnQpXCJcbiAgICAgIFtleHRlcm5hbEVycm9yXT1cIm1pbnV0ZXNFcnJvclwiXG4gICAgICBwbGFjZWhvbGRlcj1cIk1NXCI+PC9jcHMtYXV0b2NvbXBsZXRlPlxuICAgIDxzcGFuICpuZ0lmPVwid2l0aFNlY29uZHNcIiBjbGFzcz1cImNwcy10aW1lcGlja2VyLWRlbGltaXRlclwiPjo8L3NwYW4+XG4gICAgPGNwcy1hdXRvY29tcGxldGVcbiAgICAgICpuZ0lmPVwid2l0aFNlY29uZHNcIlxuICAgICAgI3NlY29uZHNGaWVsZFxuICAgICAgKGtleXByZXNzKT1cIm51bWJlck9ubHkoJGV2ZW50KVwiXG4gICAgICB3aWR0aD1cIjYwXCJcbiAgICAgIFtlbXB0eU9wdGlvbkluZGV4XT1cIm1hbmRhdG9yeVZhbHVlID8gMCA6IC0xXCJcbiAgICAgIFtvcHRpb25zXT1cInNlY29uZHNPcHRpb25zXCJcbiAgICAgIFtoaWRlRGV0YWlsc109XCJ0cnVlXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbc2hvd0NoZXZyb25dPVwiZmFsc2VcIlxuICAgICAgW3Nob3dFbXB0eU1lc3NhZ2VdPVwiZmFsc2VcIlxuICAgICAgKGZvY3VzZWQpPVwib25GaWVsZEZvY3VzKClcIlxuICAgICAgKGJsdXJyZWQpPVwib25GaWVsZEJsdXIoKVwiXG4gICAgICBbcmV0dXJuT2JqZWN0XT1cImZhbHNlXCJcbiAgICAgIFt2YWx1ZV09XCJ2YWx1ZT8uc2Vjb25kc1wiXG4gICAgICAodmFsdWVDaGFuZ2VkKT1cInVwZGF0ZVNlY29uZHMoJGV2ZW50KVwiXG4gICAgICBbZXh0ZXJuYWxFcnJvcl09XCJzZWNvbmRzRXJyb3JcIlxuICAgICAgcGxhY2Vob2xkZXI9XCJTU1wiPjwvY3BzLWF1dG9jb21wbGV0ZT5cbiAgICA8Y3BzLWJ1dHRvbi10b2dnbGVcbiAgICAgICpuZ0lmPVwiIXVzZTI0SG91clRpbWVcIlxuICAgICAgY2xhc3M9XCJjcHMtdGltZXBpY2tlci1hbS1wbS1zZWxlY3RvclwiXG4gICAgICBbb3B0aW9uc109XCJkYXlQZXJpb2RPcHRpb25zXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbdmFsdWVdPVwidmFsdWU/LmRheVBlcmlvZCB8fCAnQU0nXCJcbiAgICAgICh2YWx1ZUNoYW5nZWQpPVwidXBkYXRlRGF5UGVyaW9kKCRldmVudClcIj5cbiAgICA8L2Nwcy1idXR0b24tdG9nZ2xlPlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cIiFlcnJvciAmJiAhaGlkZURldGFpbHNcIiBjbGFzcz1cImNwcy10aW1lcGlja2VyLWhpbnRcIj5cbiAgICB7eyBoaW50IH19XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwiZXJyb3IgJiYgIWhpZGVEZXRhaWxzXCIgY2xhc3M9XCJjcHMtdGltZXBpY2tlci1lcnJvclwiPlxuICAgIHt7IGVycm9yIH19XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=