@seniorsistemas/components-ai 2.3.0 → 2.4.0-master-bdd92d4e

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.
@@ -20,6 +20,13 @@ const DATETIME_MASK_CONFIGS = {
20
20
  'en-US': { mask: '99/99/9999 99:99', placeholder: 'mm/dd/yyyy HH:mm', format: 'mdy' },
21
21
  'es-ES': { mask: '99/99/9999 99:99', placeholder: 'dd/mm/aaaa HH:mm', format: 'dmy' }
22
22
  };
23
+ /**
24
+ * DynamicFieldDatetimeComponent
25
+ *
26
+ * O FormControl.value SEMPRE armazena o datetime no formato ISO: "yyyy-MM-ddTHH:mm:ss.sssZ".
27
+ * A variável `displayValue` mantém o valor formatado no locale do usuário para exibição no input.
28
+ * Isso garante que qualquer componente que acesse form.value receba o valor pronto para o backend.
29
+ */
23
30
  export class DynamicFieldDatetimeComponent extends DynamicFieldBaseComponent {
24
31
  localeService;
25
32
  cdr;
@@ -27,9 +34,12 @@ export class DynamicFieldDatetimeComponent extends DynamicFieldBaseComponent {
27
34
  currentDateFormat = 'dd/mm/yy';
28
35
  datetimeMask = '99/99/9999 99:99';
29
36
  calendarValue = null;
37
+ /** Valor de exibição no formato locale (ex: "18/05/2026 14:30" para pt-BR) */
38
+ displayValue = null;
30
39
  langSub;
31
40
  valueSub;
32
41
  currentLocale = 'pt-BR';
42
+ updatingFromControl = false;
33
43
  constructor(translationService, localeService, cdr) {
34
44
  super(translationService);
35
45
  this.localeService = localeService;
@@ -38,46 +48,111 @@ export class DynamicFieldDatetimeComponent extends DynamicFieldBaseComponent {
38
48
  ngOnInit() {
39
49
  this.currentLocale = this.translationService.getCurrentLanguage();
40
50
  this.updateDatetimeFormat();
41
- this.initializeValue();
42
- this.langSub = this.translationService.currentLanguage$.subscribe((lang) => {
43
- this.currentLocale = lang;
44
- this.updateDatetimeFormat();
45
- this.convertValueToNewLocale();
46
- });
47
51
  const control = this.form.get(this.field.field);
48
52
  if (control) {
53
+ // Inicializar displayValue a partir do valor ISO do control
54
+ this.syncDisplayFromControl(control.value);
55
+ // Observar mudanças externas no control (patchValue, setValue)
49
56
  this.valueSub = control.valueChanges.subscribe(value => {
50
- if (value instanceof Date) {
51
- control.setValue(this.dateToString(value), { emitEvent: false });
57
+ if (this.updatingFromControl) {
58
+ return;
52
59
  }
60
+ this.syncDisplayFromControl(value);
53
61
  });
54
62
  }
63
+ this.langSub = this.translationService.currentLanguage$.subscribe((lang) => {
64
+ this.currentLocale = lang;
65
+ this.updateDatetimeFormat();
66
+ // Re-formatar o display com o novo locale
67
+ const ctrl = this.form.get(this.field.field);
68
+ if (ctrl) {
69
+ this.syncDisplayFromControl(ctrl.value);
70
+ }
71
+ });
55
72
  }
56
73
  ngOnDestroy() {
57
74
  this.langSub?.unsubscribe();
58
75
  this.valueSub?.unsubscribe();
59
76
  }
60
- initializeValue() {
61
- const control = this.form.get(this.field.field);
62
- if (control?.value instanceof Date) {
63
- control.setValue(this.dateToString(control.value), { emitEvent: false });
77
+ /**
78
+ * Sincroniza o displayValue a partir do valor ISO do FormControl.
79
+ * Aceita: ISO string, Date, locale string, ou null.
80
+ */
81
+ syncDisplayFromControl(value) {
82
+ if (!value) {
83
+ this.displayValue = null;
84
+ return;
85
+ }
86
+ if (value instanceof Date) {
87
+ const iso = value.toISOString();
88
+ this.setControlValue(iso);
89
+ this.displayValue = this.isoToLocale(value);
90
+ return;
91
+ }
92
+ const s = String(value);
93
+ // ISO datetime string (contém T)
94
+ if (s.includes('T')) {
95
+ const d = new Date(s);
96
+ if (!isNaN(d.getTime())) {
97
+ this.displayValue = this.isoToLocale(d);
98
+ }
99
+ return;
64
100
  }
101
+ // Formato locale "dd/MM/yyyy HH:mm" ou "MM/dd/yyyy HH:mm"
102
+ if (s.match(/^\d{2}\/\d{2}\/\d{4} \d{2}:\d{2}$/)) {
103
+ const iso = this.localeToIso(s);
104
+ if (iso) {
105
+ this.setControlValue(iso);
106
+ this.displayValue = s;
107
+ }
108
+ else {
109
+ this.displayValue = s;
110
+ }
111
+ return;
112
+ }
113
+ // Valor incompleto
114
+ this.displayValue = s.includes('_') ? null : null;
65
115
  }
66
- updateDatetimeFormat() {
67
- const config = DATETIME_MASK_CONFIGS[this.currentLocale] || DATETIME_MASK_CONFIGS['pt-BR'];
68
- this.datetimeMask = config.mask;
69
- this.currentDateFormat = this.field?.dateFormat || this.localeService.getPrimeNGDateFormat();
116
+ /** Chamado quando o usuário completa a digitação da máscara */
117
+ onDisplayValueComplete() {
118
+ this.syncControlFromDisplay();
70
119
  }
71
- convertValueToNewLocale() {
120
+ /** Chamado quando o input perde foco */
121
+ onDisplayValueBlur() {
122
+ this.syncControlFromDisplay();
123
+ }
124
+ /**
125
+ * Converte o displayValue (locale) para ISO e seta no FormControl.
126
+ */
127
+ syncControlFromDisplay() {
72
128
  const control = this.form.get(this.field.field);
73
- if (control?.value && typeof control.value === 'string' && !control.value.includes('_')) {
74
- const date = this.stringToDate(control.value);
75
- if (date) {
76
- control.setValue(this.dateToString(date), { emitEvent: false });
77
- }
129
+ if (!control) {
130
+ return;
131
+ }
132
+ if (!this.displayValue || this.displayValue.includes('_')) {
133
+ this.setControlValue(null);
134
+ control.markAsDirty();
135
+ return;
136
+ }
137
+ const iso = this.localeToIso(this.displayValue);
138
+ if (iso) {
139
+ this.setControlValue(iso);
140
+ control.markAsDirty();
78
141
  }
79
142
  }
80
- dateToString(date) {
143
+ /** Seta o valor no control sem disparar o subscriber interno */
144
+ setControlValue(value) {
145
+ const control = this.form.get(this.field.field);
146
+ if (!control) {
147
+ return;
148
+ }
149
+ this.updatingFromControl = true;
150
+ control.setValue(value, { emitEvent: true });
151
+ this.updatingFromControl = false;
152
+ }
153
+ // ==================== CONVERSÕES ====================
154
+ /** Converte Date para locale display string */
155
+ isoToLocale(date) {
81
156
  const day = String(date.getDate()).padStart(2, '0');
82
157
  const month = String(date.getMonth() + 1).padStart(2, '0');
83
158
  const year = String(date.getFullYear());
@@ -88,33 +163,53 @@ export class DynamicFieldDatetimeComponent extends DynamicFieldBaseComponent {
88
163
  ? `${month}/${day}/${year} ${hours}:${minutes}`
89
164
  : `${day}/${month}/${year} ${hours}:${minutes}`;
90
165
  }
91
- stringToDate(value) {
92
- if (!value || value.includes('_'))
93
- return null;
94
- const parts = value.split(' ');
95
- if (parts.length !== 2)
166
+ /** Converte locale string para ISO datetime string */
167
+ localeToIso(locale) {
168
+ const parts = locale.split(' ');
169
+ if (parts.length !== 2) {
96
170
  return null;
171
+ }
97
172
  const dateParts = parts[0].split('/');
98
173
  const timeParts = parts[1].split(':');
99
- if (dateParts.length !== 3 || timeParts.length !== 2)
174
+ if (dateParts.length !== 3 || timeParts.length !== 2) {
100
175
  return null;
176
+ }
101
177
  const config = DATETIME_MASK_CONFIGS[this.currentLocale] || DATETIME_MASK_CONFIGS['pt-BR'];
102
178
  const [p0, p1, p2] = dateParts.map(p => parseInt(p, 10));
103
179
  const [day, month, year] = config.format === 'mdy' ? [p1, p0, p2] : [p0, p1, p2];
104
180
  const hours = parseInt(timeParts[0], 10);
105
181
  const minutes = parseInt(timeParts[1], 10);
106
- if (isNaN(day) || isNaN(month) || isNaN(year) || isNaN(hours) || isNaN(minutes))
182
+ if (isNaN(day) || isNaN(month) || isNaN(year) || isNaN(hours) || isNaN(minutes)) {
107
183
  return null;
108
- if (month < 1 || month > 12 || day < 1 || day > 31 || hours < 0 || hours > 23 || minutes < 0 || minutes > 59)
184
+ }
185
+ if (month < 1 || month > 12 || day < 1 || day > 31 || hours < 0 || hours > 23 || minutes < 0 || minutes > 59) {
109
186
  return null;
187
+ }
110
188
  const date = new Date(year, month - 1, day, hours, minutes);
111
- return isNaN(date.getTime()) ? null : date;
189
+ return isNaN(date.getTime()) ? null : date.toISOString();
190
+ }
191
+ /** Converte locale string para Date */
192
+ localeToDate(value) {
193
+ const iso = this.localeToIso(value);
194
+ if (!iso) {
195
+ return null;
196
+ }
197
+ return new Date(iso);
198
+ }
199
+ // ==================== CALENDAR ====================
200
+ updateDatetimeFormat() {
201
+ const config = DATETIME_MASK_CONFIGS[this.currentLocale] || DATETIME_MASK_CONFIGS['pt-BR'];
202
+ this.datetimeMask = config.mask;
203
+ this.currentDateFormat = this.field?.dateFormat || this.localeService.getPrimeNGDateFormat();
112
204
  }
113
205
  toggleCalendar(event) {
114
206
  event.stopPropagation();
115
- const control = this.form.get(this.field.field);
116
- this.calendarValue = control?.value ? this.stringToDate(control.value) : new Date();
117
- // Simular clique no input do calendar para abrir o overlay
207
+ if (this.displayValue && !this.displayValue.includes('_')) {
208
+ this.calendarValue = this.localeToDate(this.displayValue);
209
+ }
210
+ else {
211
+ this.calendarValue = new Date();
212
+ }
118
213
  setTimeout(() => {
119
214
  if (this.calendarPicker && this.calendarPicker.inputfieldViewChild) {
120
215
  this.calendarPicker.inputfieldViewChild.nativeElement.click();
@@ -122,22 +217,32 @@ export class DynamicFieldDatetimeComponent extends DynamicFieldBaseComponent {
122
217
  });
123
218
  }
124
219
  onCalendarSelect(date) {
125
- const control = this.form.get(this.field.field);
126
- if (control && date) {
127
- control.setValue(this.dateToString(date));
128
- control.markAsDirty();
220
+ if (date) {
221
+ const iso = date.toISOString();
222
+ this.displayValue = this.isoToLocale(date);
223
+ this.setControlValue(iso);
224
+ const control = this.form.get(this.field.field);
225
+ if (control) {
226
+ control.markAsDirty();
227
+ }
129
228
  }
130
229
  }
131
230
  onCalendarClear() {
231
+ this.displayValue = null;
232
+ this.setControlValue(null);
132
233
  const control = this.form.get(this.field.field);
133
234
  if (control) {
134
- control.setValue(null);
135
235
  control.markAsDirty();
136
236
  }
137
237
  }
238
+ isControlDisabled() {
239
+ const control = this.form.get(this.field.field);
240
+ return control ? control.disabled : false;
241
+ }
138
242
  getPlaceholder() {
139
- if (this.field.placeholder)
243
+ if (this.field.placeholder) {
140
244
  return this.field.placeholder;
245
+ }
141
246
  return DATETIME_MASK_CONFIGS[this.currentLocale]?.placeholder || 'dd/mm/aaaa HH:mm';
142
247
  }
143
248
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldDatetimeComponent, deps: [{ token: i1.TranslationService }, { token: i2.LocaleService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
@@ -147,14 +252,18 @@ export class DynamicFieldDatetimeComponent extends DynamicFieldBaseComponent {
147
252
  <div class="datetime-input-group">
148
253
  <p-inputmask
149
254
  [inputId]="field.field"
150
- [formControlName]="field.field"
255
+ [(ngModel)]="displayValue"
256
+ [ngModelOptions]="{standalone: true}"
151
257
  [mask]="datetimeMask"
152
258
  [placeholder]="getPlaceholder()"
153
259
  slotChar="_"
154
260
  [autoClear]="false"
155
261
  styleClass="datetime-input"
156
262
  [class.ng-invalid]="isFieldInvalid()"
157
- [class.ng-dirty]="isFieldDirty()">
263
+ [class.ng-dirty]="isFieldDirty()"
264
+ [disabled]="isControlDisabled()"
265
+ (onComplete)="onDisplayValueComplete()"
266
+ (onBlur)="onDisplayValueBlur()">
158
267
  </p-inputmask>
159
268
  <div class="datetime-buttons">
160
269
  <p-button
@@ -172,6 +281,7 @@ export class DynamicFieldDatetimeComponent extends DynamicFieldBaseComponent {
172
281
  <p-calendar
173
282
  #calendarPicker
174
283
  [(ngModel)]="calendarValue"
284
+ [ngModelOptions]="{standalone: true}"
175
285
  [dateFormat]="currentDateFormat"
176
286
  [showTime]="true"
177
287
  [showSeconds]="false"
@@ -186,7 +296,7 @@ export class DynamicFieldDatetimeComponent extends DynamicFieldBaseComponent {
186
296
  </p-calendar>
187
297
  </div>
188
298
  </sia-dynamic-field-wrapper>
189
- `, isInline: true, styles: [".datetime-field{width:100%;position:relative}.datetime-input-group{position:relative;width:100%;::ng-deep p-inputmask{width:100%;display:block;input{width:100%;padding-right:2.5rem}}.datetime-buttons{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;z-index:10}::ng-deep .p-button{width:2rem!important;height:2rem!important;min-width:2rem!important;min-height:2rem!important;padding:0!important;margin:0!important;display:flex!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;.p-button-icon{margin:0!important;font-size:.875rem!important}.p-button-label{display:none!important}}}::ng-deep .hidden-calendar-input{position:absolute;width:0;height:0;overflow:hidden;opacity:0;pointer-events:none;input{width:0;height:0;padding:0;border:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: InputMaskModule }, { kind: "component", type: i4.InputMask, selector: "p-inputmask, p-inputMask, p-input-mask", inputs: ["type", "slotChar", "autoClear", "showClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "variant", "ariaLabel", "ariaLabelledBy", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autofocus", "autoFocus", "autocomplete", "keepBuffer", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown", "onClear"] }, { kind: "ngmodule", type: CalendarModule }, { kind: "component", type: i5.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "fluid", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i6.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: DynamicFieldWrapperComponent, selector: "sia-dynamic-field-wrapper", inputs: ["field", "form", "mode"] }] });
299
+ `, isInline: true, styles: [".datetime-field{width:100%;position:relative}.datetime-input-group{position:relative;width:100%;::ng-deep p-inputmask{width:100%;display:block;input{width:100%;padding-right:2.5rem}}.datetime-buttons{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:flex;gap:2px;z-index:10}::ng-deep .p-button{width:2rem!important;height:2rem!important;min-width:2rem!important;min-height:2rem!important;padding:0!important;margin:0!important;display:flex!important;align-items:center!important;justify-content:center!important;box-sizing:border-box!important;.p-button-icon{margin:0!important;font-size:.875rem!important}.p-button-label{display:none!important}}}::ng-deep .hidden-calendar-input{position:absolute;width:0;height:0;overflow:hidden;opacity:0;pointer-events:none;input{width:0;height:0;padding:0;border:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: InputMaskModule }, { kind: "component", type: i4.InputMask, selector: "p-inputmask, p-inputMask, p-input-mask", inputs: ["type", "slotChar", "autoClear", "showClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "variant", "ariaLabel", "ariaLabelledBy", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autofocus", "autoFocus", "autocomplete", "keepBuffer", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown", "onClear"] }, { kind: "ngmodule", type: CalendarModule }, { kind: "component", type: i5.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "fluid", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i6.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: DynamicFieldWrapperComponent, selector: "sia-dynamic-field-wrapper", inputs: ["field", "form", "mode"] }] });
190
300
  }
191
301
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFieldDatetimeComponent, decorators: [{
192
302
  type: Component,
@@ -205,14 +315,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
205
315
  <div class="datetime-input-group">
206
316
  <p-inputmask
207
317
  [inputId]="field.field"
208
- [formControlName]="field.field"
318
+ [(ngModel)]="displayValue"
319
+ [ngModelOptions]="{standalone: true}"
209
320
  [mask]="datetimeMask"
210
321
  [placeholder]="getPlaceholder()"
211
322
  slotChar="_"
212
323
  [autoClear]="false"
213
324
  styleClass="datetime-input"
214
325
  [class.ng-invalid]="isFieldInvalid()"
215
- [class.ng-dirty]="isFieldDirty()">
326
+ [class.ng-dirty]="isFieldDirty()"
327
+ [disabled]="isControlDisabled()"
328
+ (onComplete)="onDisplayValueComplete()"
329
+ (onBlur)="onDisplayValueBlur()">
216
330
  </p-inputmask>
217
331
  <div class="datetime-buttons">
218
332
  <p-button
@@ -230,6 +344,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
230
344
  <p-calendar
231
345
  #calendarPicker
232
346
  [(ngModel)]="calendarValue"
347
+ [ngModelOptions]="{standalone: true}"
233
348
  [dateFormat]="currentDateFormat"
234
349
  [showTime]="true"
235
350
  [showSeconds]="false"
@@ -249,4 +364,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
249
364
  type: ViewChild,
250
365
  args: ['calendarPicker']
251
366
  }] } });
252
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWVsZC1kYXRldGltZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzLWFpL3NyYy9saWIvY29tcG9uZW50cy9keW5hbWljLWZvcm0vZmllbGRzL2R5bmFtaWMtZmllbGQtZGF0ZXRpbWUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXdDLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFZLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUloRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7Ozs7O0FBVzNFLE1BQU0scUJBQXFCLEdBQWtEO0lBQzNFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtJQUNyRixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7SUFDckYsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxrQkFBa0Is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SSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQzFELE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLFdBQVcsSUFBSSxrQkFBa0IsQ0FBQztJQUN0RixDQUFDO3dHQXJJVSw2QkFBNkI7NEZBQTdCLDZCQUE2QiwrTkFwSDlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Q1QsdTRCQXREQyxZQUFZLDhCQUNaLG1CQUFtQixtbEJBQ25CLFdBQVcsc1BBQ1gsZUFBZSxxaUJBQ2YsY0FBYyxpekNBQ2QsWUFBWSxpYkFDWixhQUFhLHNYQUNiLDRCQUE0Qjs7NEZBc0huQiw2QkFBNkI7a0JBakl6QyxTQUFTOytCQUNFLDRCQUE0QixjQUMxQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLFdBQVc7d0JBQ1gsZUFBZTt3QkFDZixjQUFjO3dCQUNkLFlBQVk7d0JBQ1osYUFBYTt3QkFDYiw0QkFBNEI7cUJBQzdCLFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDVDttSkF3RTRCLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW5wdXRNYXNrTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dG1hc2snO1xuaW1wb3J0IHsgQ2FsZW5kYXJNb2R1bGUsIENhbGVuZGFyIH0gZnJvbSAncHJpbWVuZy9jYWxlbmRhcic7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlLCBTdXBwb3J0ZWRMYW5ndWFnZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2xvY2FsZS5zZXJ2aWNlJztcbmltcG9ydCB7IER5bmFtaWNGaWVsZFdyYXBwZXJDb21wb25lbnQgfSBmcm9tICcuL2R5bmFtaWMtZmllbGQtd3JhcHBlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkQmFzZUNvbXBvbmVudCB9IGZyb20gJy4vZHluYW1pYy1maWVsZC1iYXNlLmNvbXBvbmVudCc7XG5cbi8qKlxuICogQ29uZmlndXJhw6fDo28gZGUgbcOhc2NhcmEgZGUgZGF0ZXRpbWUgcG9yIGxvY2FsZVxuICovXG5pbnRlcmZhY2UgRGF0ZXRpbWVNYXNrQ29uZmlnIHtcbiAgbWFzazogc3RyaW5nO1xuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBmb3JtYXQ6ICdkbXknIHwgJ21keSc7XG59XG5cbmNvbnN0IERBVEVUSU1FX01BU0tfQ09ORklHUzogUmVjb3JkPFN1cHBvcnRlZExhbmd1YWdlLCBEYXRldGltZU1hc2tDb25maWc+ID0ge1xuICAncHQtQlInOiB7IG1hc2s6ICc5OS85OS85OTk5IDk5Ojk5JywgcGxhY2Vob2xkZXI6ICdkZC9tbS9hYWFhIEhIOm1tJywgZm9ybWF0OiAnZG15JyB9LFxuICAnZW4tVVMnOiB7IG1hc2s6ICc5OS85OS85OTk5IDk5Ojk5JywgcGxhY2Vob2xkZXI6ICdtbS9kZC95eXl5IEhIOm1tJywgZm9ybWF0OiAnbWR5JyB9LFxuICAnZXMtRVMnOiB7IG1hc2s6ICc5OS85OS85OTk5IDk5Ojk5JywgcGxhY2Vob2xkZXI6ICdkZC9tbS9hYWFhIEhIOm1tJywgZm9ybWF0OiAnZG15JyB9XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzaWEtZHluYW1pYy1maWVsZC1kYXRldGltZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBJbnB1dE1hc2tNb2R1bGUsXG4gICAgQ2FsZW5kYXJNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgRHluYW1pY0ZpZWxkV3JhcHBlckNvbXBvbmVudFxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxzaWEtZHluYW1pYy1maWVsZC13cmFwcGVyIFtmaWVsZF09XCJmaWVsZFwiIFtmb3JtXT1cImZvcm1cIiBbbW9kZV09XCJtb2RlXCI+XG4gICAgICA8ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiZGF0ZXRpbWUtZmllbGRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGV0aW1lLWlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgPHAtaW5wdXRtYXNrXG4gICAgICAgICAgICBbaW5wdXRJZF09XCJmaWVsZC5maWVsZFwiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLmZpZWxkXCJcbiAgICAgICAgICAgIFttYXNrXT1cImRhdGV0aW1lTWFza1wiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZ2V0UGxhY2Vob2xkZXIoKVwiXG4gICAgICAgICAgICBzbG90Q2hhcj1cIl9cIlxuICAgICAgICAgICAgW2F1dG9DbGVhcl09XCJmYWxzZVwiXG4gICAgICAgICAgICBzdHlsZUNsYXNzPVwiZGF0ZXRpbWUtaW5wdXRcIlxuICAgICAgICAgICAgW2NsYXNzLm5nLWludmFsaWRdPVwiaXNGaWVsZEludmFsaWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MubmctZGlydHldPVwiaXNGaWVsZERpcnR5KClcIj5cbiAgICAgICAgICA8L3AtaW5wdXRtYXNrPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRldGltZS1idXR0b25zXCI+XG4gICAgICAgICAgICA8cC1idXR0b25cbiAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNhbGVuZGFyXCJcbiAgICAgICAgICAgICAgc2V2ZXJpdHk9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3JvdW5kZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIChvbkNsaWNrKT1cInRvZ2dsZUNhbGVuZGFyKCRldmVudClcIlxuICAgICAgICAgICAgICBwVG9vbHRpcD1cIkFicmlyIGNhbGVuZMOhcmlvXCJcbiAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCI+XG4gICAgICAgICAgICA8L3AtYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAtY2FsZW5kYXJcbiAgICAgICAgICAjY2FsZW5kYXJQaWNrZXJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImNhbGVuZGFyVmFsdWVcIlxuICAgICAgICAgIFtkYXRlRm9ybWF0XT1cImN1cnJlbnREYXRlRm9ybWF0XCJcbiAgICAgICAgICBbc2hvd1RpbWVdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Nob3dTZWNvbmRzXT1cImZhbHNlXCJcbiAgICAgICAgICBbaG91ckZvcm1hdF09XCInMjQnXCJcbiAgICAgICAgICBbc2hvd0J1dHRvbkJhcl09XCJ0cnVlXCJcbiAgICAgICAgICBbYXBwZW5kVG9dPVwiJ2JvZHknXCJcbiAgICAgICAgICBbaW5saW5lXT1cImZhbHNlXCJcbiAgICAgICAgICBbc2hvd0ljb25dPVwiZmFsc2VcIlxuICAgICAgICAgIChvblNlbGVjdCk9XCJvbkNhbGVuZGFyU2VsZWN0KCRldmVudClcIlxuICAgICAgICAgIChvbkNsZWFyQ2xpY2spPVwib25DYWxlbmRhckNsZWFyKClcIlxuICAgICAgICAgIHN0eWxlQ2xhc3M9XCJoaWRkZW4tY2FsZW5kYXItaW5wdXRcIj5cbiAgICAgICAgPC9wLWNhbGVuZGFyPlxuICAgICAgPC9kaXY+XG4gICAgPC9zaWEtZHluYW1pYy1maWVsZC13cmFwcGVyPlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgLmRhdGV0aW1lLWZpZWxkIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cblxuICAgIC5kYXRldGltZS1pbnB1dC1ncm91cCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB3aWR0aDogMTAwJTtcblxuICAgICAgOjpuZy1kZWVwIHAtaW5wdXRtYXNrIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuXG4gICAgICAgIGlucHV0IHtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyLjVyZW07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLmRhdGV0aW1lLWJ1dHRvbnMge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHJpZ2h0OiA0cHg7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogMnB4O1xuICAgICAgICB6LWluZGV4OiAxMDtcbiAgICAgIH1cblxuICAgICAgOjpuZy1kZWVwIC5wLWJ1dHRvbiB7XG4gICAgICAgIHdpZHRoOiAycmVtICFpbXBvcnRhbnQ7XG4gICAgICAgIGhlaWdodDogMnJlbSAhaW1wb3J0YW50O1xuICAgICAgICBtaW4td2lkdGg6IDJyZW0gIWltcG9ydGFudDtcbiAgICAgICAgbWluLWhlaWdodDogMnJlbSAhaW1wb3J0YW50O1xuICAgICAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xuICAgICAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xuXG4gICAgICAgIC5wLWJ1dHRvbi1pY29uIHtcbiAgICAgICAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcbiAgICAgICAgICBmb250LXNpemU6IDAuODc1cmVtICFpbXBvcnRhbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAucC1idXR0b24tbGFiZWwge1xuICAgICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIDo6bmctZGVlcCAuaGlkZGVuLWNhbGVuZGFyLWlucHV0IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHdpZHRoOiAwO1xuICAgICAgaGVpZ2h0OiAwO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIG9wYWNpdHk6IDA7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcblxuICAgICAgaW5wdXQge1xuICAgICAgICB3aWR0aDogMDtcbiAgICAgICAgaGVpZ2h0OiAwO1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICB9XG4gICAgfVxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljRmllbGREYXRldGltZUNvbXBvbmVudCBleHRlbmRzIER5bmFtaWNGaWVsZEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ2NhbGVuZGFyUGlja2VyJykgY2FsZW5kYXJQaWNrZXIhOiBDYWxlbmRhcjtcbiAgXG4gIGN1cnJlbnREYXRlRm9ybWF0ID0gJ2RkL21tL3l5JztcbiAgZGF0ZXRpbWVNYXNrID0gJzk5Lzk5Lzk5OTkgOTk6OTknO1xuICBjYWxlbmRhclZhbHVlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIFxuICBwcml2YXRlIGxhbmdTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgdmFsdWVTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgY3VycmVudExvY2FsZTogU3VwcG9ydGVkTGFuZ3VhZ2UgPSAncHQtQlInO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9jYWxlU2VydmljZTogTG9jYWxlU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIodHJhbnNsYXRpb25TZXJ2aWNlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmdldEN1cnJlbnRMYW5ndWFnZSgpO1xuICAgIHRoaXMudXBkYXRlRGF0ZXRpbWVGb3JtYXQoKTtcbiAgICB0aGlzLmluaXRpYWxpemVWYWx1ZSgpO1xuICAgIFxuICAgIHRoaXMubGFuZ1N1YiA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmN1cnJlbnRMYW5ndWFnZSQuc3Vic2NyaWJlKChsYW5nKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRMb2NhbGUgPSBsYW5nO1xuICAgICAgdGhpcy51cGRhdGVEYXRldGltZUZvcm1hdCgpO1xuICAgICAgdGhpcy5jb252ZXJ0VmFsdWVUb05ld0xvY2FsZSgpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgIHRoaXMudmFsdWVTdWIgPSBjb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgY29udHJvbC5zZXRWYWx1ZSh0aGlzLmRhdGVUb1N0cmluZyh2YWx1ZSksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5sYW5nU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudmFsdWVTdWI/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVWYWx1ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLmZpZWxkKTtcbiAgICBpZiAoY29udHJvbD8udmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBjb250cm9sLnNldFZhbHVlKHRoaXMuZGF0ZVRvU3RyaW5nKGNvbnRyb2wudmFsdWUpLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEYXRldGltZUZvcm1hdCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSBEQVRFVElNRV9NQVNLX0NPTkZJR1NbdGhpcy5jdXJyZW50TG9jYWxlXSB8fCBEQVRFVElNRV9NQVNLX0NPTkZJR1NbJ3B0LUJSJ107XG4gICAgdGhpcy5kYXRldGltZU1hc2sgPSBjb25maWcubWFzaztcbiAgICB0aGlzLmN1cnJlbnREYXRlRm9ybWF0ID0gdGhpcy5maWVsZD8uZGF0ZUZvcm1hdCB8fCB0aGlzLmxvY2FsZVNlcnZpY2UuZ2V0UHJpbWVOR0RhdGVGb3JtYXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFZhbHVlVG9OZXdMb2NhbGUoKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgaWYgKGNvbnRyb2w/LnZhbHVlICYmIHR5cGVvZiBjb250cm9sLnZhbHVlID09PSAnc3RyaW5nJyAmJiAhY29udHJvbC52YWx1ZS5pbmNsdWRlcygnXycpKSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5zdHJpbmdUb0RhdGUoY29udHJvbC52YWx1ZSk7XG4gICAgICBpZiAoZGF0ZSkge1xuICAgICAgICBjb250cm9sLnNldFZhbHVlKHRoaXMuZGF0ZVRvU3RyaW5nKGRhdGUpLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkYXRlVG9TdHJpbmcoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF5ID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgeWVhciA9IFN0cmluZyhkYXRlLmdldEZ1bGxZZWFyKCkpO1xuICAgIGNvbnN0IGhvdXJzID0gU3RyaW5nKGRhdGUuZ2V0SG91cnMoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBtaW51dGVzID0gU3RyaW5nKGRhdGUuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IGNvbmZpZyA9IERBVEVUSU1FX01BU0tfQ09ORklHU1t0aGlzLmN1cnJlbnRMb2NhbGVdIHx8IERBVEVUSU1FX01BU0tfQ09ORklHU1sncHQtQlInXTtcbiAgICByZXR1cm4gY29uZmlnLmZvcm1hdCA9PT0gJ21keScgXG4gICAgICA/IGAke21vbnRofS8ke2RheX0vJHt5ZWFyfSAke2hvdXJzfToke21pbnV0ZXN9YCBcbiAgICAgIDogYCR7ZGF5fS8ke21vbnRofS8ke3llYXJ9ICR7aG91cnN9OiR7bWludXRlc31gO1xuICB9XG5cbiAgcHJpdmF0ZSBzdHJpbmdUb0RhdGUodmFsdWU6IHN0cmluZyk6IERhdGUgfCBudWxsIHtcbiAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLmluY2x1ZGVzKCdfJykpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc3BsaXQoJyAnKTtcbiAgICBpZiAocGFydHMubGVuZ3RoICE9PSAyKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBkYXRlUGFydHMgPSBwYXJ0c1swXS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHRpbWVQYXJ0cyA9IHBhcnRzWzFdLnNwbGl0KCc6Jyk7XG4gICAgaWYgKGRhdGVQYXJ0cy5sZW5ndGggIT09IDMgfHwgdGltZVBhcnRzLmxlbmd0aCAhPT0gMikgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgY29uc3QgY29uZmlnID0gREFURVRJTUVfTUFTS19DT05GSUdTW3RoaXMuY3VycmVudExvY2FsZV0gfHwgREFURVRJTUVfTUFTS19DT05GSUdTWydwdC1CUiddO1xuICAgIGNvbnN0IFtwMCwgcDEsIHAyXSA9IGRhdGVQYXJ0cy5tYXAocCA9PiBwYXJzZUludChwLCAxMCkpO1xuICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IGNvbmZpZy5mb3JtYXQgPT09ICdtZHknID8gW3AxLCBwMCwgcDJdIDogW3AwLCBwMSwgcDJdO1xuICAgIGNvbnN0IGhvdXJzID0gcGFyc2VJbnQodGltZVBhcnRzWzBdLCAxMCk7XG4gICAgY29uc3QgbWludXRlcyA9IHBhcnNlSW50KHRpbWVQYXJ0c1sxXSwgMTApO1xuICAgIFxuICAgIGlmIChpc05hTihkYXkpIHx8IGlzTmFOKG1vbnRoKSB8fCBpc05hTih5ZWFyKSB8fCBpc05hTihob3VycykgfHwgaXNOYU4obWludXRlcykpIHJldHVybiBudWxsO1xuICAgIGlmIChtb250aCA8IDEgfHwgbW9udGggPiAxMiB8fCBkYXkgPCAxIHx8IGRheSA+IDMxIHx8IGhvdXJzIDwgMCB8fCBob3VycyA+IDIzIHx8IG1pbnV0ZXMgPCAwIHx8IG1pbnV0ZXMgPiA1OSkgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5LCBob3VycywgbWludXRlcyk7XG4gICAgcmV0dXJuIGlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IG51bGwgOiBkYXRlO1xuICB9XG5cbiAgdG9nZ2xlQ2FsZW5kYXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgdGhpcy5jYWxlbmRhclZhbHVlID0gY29udHJvbD8udmFsdWUgPyB0aGlzLnN0cmluZ1RvRGF0ZShjb250cm9sLnZhbHVlKSA6IG5ldyBEYXRlKCk7XG4gICAgXG4gICAgLy8gU2ltdWxhciBjbGlxdWUgbm8gaW5wdXQgZG8gY2FsZW5kYXIgcGFyYSBhYnJpciBvIG92ZXJsYXlcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNhbGVuZGFyUGlja2VyICYmIHRoaXMuY2FsZW5kYXJQaWNrZXIuaW5wdXRmaWVsZFZpZXdDaGlsZCkge1xuICAgICAgICB0aGlzLmNhbGVuZGFyUGlja2VyLmlucHV0ZmllbGRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25DYWxlbmRhclNlbGVjdChkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgaWYgKGNvbnRyb2wgJiYgZGF0ZSkge1xuICAgICAgY29udHJvbC5zZXRWYWx1ZSh0aGlzLmRhdGVUb1N0cmluZyhkYXRlKSk7XG4gICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgfVxuICB9XG5cbiAgb25DYWxlbmRhckNsZWFyKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQuZmllbGQpO1xuICAgIGlmIChjb250cm9sKSB7XG4gICAgICBjb250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGdldFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZmllbGQucGxhY2Vob2xkZXIpIHJldHVybiB0aGlzLmZpZWxkLnBsYWNlaG9sZGVyO1xuICAgIHJldHVybiBEQVRFVElNRV9NQVNLX0NPTkZJR1NbdGhpcy5jdXJyZW50TG9jYWxlXT8ucGxhY2Vob2xkZXIgfHwgJ2RkL21tL2FhYWEgSEg6bW0nO1xuICB9XG59XG4iXX0=
367
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1maWVsZC1kYXRldGltZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzLWFpL3NyYy9saWIvY29tcG9uZW50cy9keW5hbWljLWZvcm0vZmllbGRzL2R5bmFtaWMtZmllbGQtZGF0ZXRpbWUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXdDLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFZLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUloRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7Ozs7O0FBVzNFLE1BQU0scUJBQXFCLEdBQWtEO0lBQzNFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtJQUNyRixPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7SUFDckYsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxrQkFBa0Is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QyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUFDLE9BQU8sSUFBSSxDQUFDO1FBQUMsQ0FBQztRQUV0RSxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUkscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0YsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakYsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6QyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRTNDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQUMsT0FBTyxJQUFJLENBQUM7UUFBQyxDQUFDO1FBQ2pHLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxFQUFFLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxPQUFPLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFBQyxPQUFPLElBQUksQ0FBQztRQUFDLENBQUM7UUFFOUgsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1RCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUVELHVDQUF1QztJQUMvQixZQUFZLENBQUMsS0FBYTtRQUNoQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUFDLE9BQU8sSUFBSSxDQUFDO1FBQUMsQ0FBQztRQUMxQixPQUFPLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxxREFBcUQ7SUFFN0Msb0JBQW9CO1FBQzFCLE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzRixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUMvRixDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQVk7UUFDekIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1RCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQyxDQUFDO1FBRUQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxJQUFVO1FBQ3pCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRCxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUFDLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELElBQUksT0FBTyxFQUFFLENBQUM7WUFBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7UUFBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxpQkFBaUI7UUFDZixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDNUMsQ0FBQztJQUVRLGNBQWM7UUFDckIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUFDLENBQUM7UUFDOUQsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsV0FBVyxJQUFJLGtCQUFrQixDQUFDO0lBQ3RGLENBQUM7d0dBck9VLDZCQUE2Qjs0RkFBN0IsNkJBQTZCLCtOQXpIOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0RULHU0QkEzREMsWUFBWSw4QkFDWixtQkFBbUIsbWJBQ25CLFdBQVcsc1BBQ1gsZUFBZSxxaUJBQ2YsY0FBYyxpekNBQ2QsWUFBWSxpYkFDWixhQUFhLHNYQUNiLDRCQUE0Qjs7NEZBMkhuQiw2QkFBNkI7a0JBdEl6QyxTQUFTOytCQUNFLDRCQUE0QixjQUMxQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLFdBQVc7d0JBQ1gsZUFBZTt3QkFDZixjQUFjO3dCQUNkLFlBQVk7d0JBQ1osYUFBYTt3QkFDYiw0QkFBNEI7cUJBQzdCLFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0RUO21KQXdFNEIsY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBDaGFuZ2VEZXRlY3RvclJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJbnB1dE1hc2tNb2R1bGUgfSBmcm9tICdwcmltZW5nL2lucHV0bWFzayc7XG5pbXBvcnQgeyBDYWxlbmRhck1vZHVsZSwgQ2FsZW5kYXIgfSBmcm9tICdwcmltZW5nL2NhbGVuZGFyJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICdwcmltZW5nL3Rvb2x0aXAnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGlvblNlcnZpY2UsIFN1cHBvcnRlZExhbmd1YWdlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdHJhbnNsYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBMb2NhbGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbG9jYWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgRHluYW1pY0ZpZWxkV3JhcHBlckNvbXBvbmVudCB9IGZyb20gJy4vZHluYW1pYy1maWVsZC13cmFwcGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljRmllbGRCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9keW5hbWljLWZpZWxkLWJhc2UuY29tcG9uZW50JztcblxuLyoqXG4gKiBDb25maWd1cmHDp8OjbyBkZSBtw6FzY2FyYSBkZSBkYXRldGltZSBwb3IgbG9jYWxlXG4gKi9cbmludGVyZmFjZSBEYXRldGltZU1hc2tDb25maWcge1xuICBtYXNrOiBzdHJpbmc7XG4gIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIGZvcm1hdDogJ2RteScgfCAnbWR5Jztcbn1cblxuY29uc3QgREFURVRJTUVfTUFTS19DT05GSUdTOiBSZWNvcmQ8U3VwcG9ydGVkTGFuZ3VhZ2UsIERhdGV0aW1lTWFza0NvbmZpZz4gPSB7XG4gICdwdC1CUic6IHsgbWFzazogJzk5Lzk5Lzk5OTkgOTk6OTknLCBwbGFjZWhvbGRlcjogJ2RkL21tL2FhYWEgSEg6bW0nLCBmb3JtYXQ6ICdkbXknIH0sXG4gICdlbi1VUyc6IHsgbWFzazogJzk5Lzk5Lzk5OTkgOTk6OTknLCBwbGFjZWhvbGRlcjogJ21tL2RkL3l5eXkgSEg6bW0nLCBmb3JtYXQ6ICdtZHknIH0sXG4gICdlcy1FUyc6IHsgbWFzazogJzk5Lzk5Lzk5OTkgOTk6OTknLCBwbGFjZWhvbGRlcjogJ2RkL21tL2FhYWEgSEg6bW0nLCBmb3JtYXQ6ICdkbXknIH1cbn07XG5cbi8qKlxuICogRHluYW1pY0ZpZWxkRGF0ZXRpbWVDb21wb25lbnRcbiAqXG4gKiBPIEZvcm1Db250cm9sLnZhbHVlIFNFTVBSRSBhcm1hemVuYSBvIGRhdGV0aW1lIG5vIGZvcm1hdG8gSVNPOiBcInl5eXktTU0tZGRUSEg6bW06c3Muc3NzWlwiLlxuICogQSB2YXJpw6F2ZWwgYGRpc3BsYXlWYWx1ZWAgbWFudMOpbSBvIHZhbG9yIGZvcm1hdGFkbyBubyBsb2NhbGUgZG8gdXN1w6FyaW8gcGFyYSBleGliacOnw6NvIG5vIGlucHV0LlxuICogSXNzbyBnYXJhbnRlIHF1ZSBxdWFscXVlciBjb21wb25lbnRlIHF1ZSBhY2Vzc2UgZm9ybS52YWx1ZSByZWNlYmEgbyB2YWxvciBwcm9udG8gcGFyYSBvIGJhY2tlbmQuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpYS1keW5hbWljLWZpZWxkLWRhdGV0aW1lJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIElucHV0TWFza01vZHVsZSxcbiAgICBDYWxlbmRhck1vZHVsZSxcbiAgICBCdXR0b25Nb2R1bGUsXG4gICAgVG9vbHRpcE1vZHVsZSxcbiAgICBEeW5hbWljRmllbGRXcmFwcGVyQ29tcG9uZW50XG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPHNpYS1keW5hbWljLWZpZWxkLXdyYXBwZXIgW2ZpZWxkXT1cImZpZWxkXCIgW2Zvcm1dPVwiZm9ybVwiIFttb2RlXT1cIm1vZGVcIj5cbiAgICAgIDxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJkYXRldGltZS1maWVsZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXRpbWUtaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICA8cC1pbnB1dG1hc2tcbiAgICAgICAgICAgIFtpbnB1dElkXT1cImZpZWxkLmZpZWxkXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZGlzcGxheVZhbHVlXCJcbiAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxuICAgICAgICAgICAgW21hc2tdPVwiZGF0ZXRpbWVNYXNrXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRQbGFjZWhvbGRlcigpXCJcbiAgICAgICAgICAgIHNsb3RDaGFyPVwiX1wiXG4gICAgICAgICAgICBbYXV0b0NsZWFyXT1cImZhbHNlXCJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJkYXRldGltZS1pbnB1dFwiXG4gICAgICAgICAgICBbY2xhc3MubmctaW52YWxpZF09XCJpc0ZpZWxkSW52YWxpZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5uZy1kaXJ0eV09XCJpc0ZpZWxkRGlydHkoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNDb250cm9sRGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAob25Db21wbGV0ZSk9XCJvbkRpc3BsYXlWYWx1ZUNvbXBsZXRlKClcIlxuICAgICAgICAgICAgKG9uQmx1cik9XCJvbkRpc3BsYXlWYWx1ZUJsdXIoKVwiPlxuICAgICAgICAgIDwvcC1pbnB1dG1hc2s+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGV0aW1lLWJ1dHRvbnNcIj5cbiAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICBpY29uPVwicGkgcGktY2FsZW5kYXJcIlxuICAgICAgICAgICAgICBzZXZlcml0eT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgICAgICAgICBbcm91bmRlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwidG9nZ2xlQ2FsZW5kYXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHBUb29sdGlwPVwiQWJyaXIgY2FsZW5kw6FyaW9cIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgICAgICBzaXplPVwic21hbGxcIj5cbiAgICAgICAgICAgIDwvcC1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cC1jYWxlbmRhclxuICAgICAgICAgICNjYWxlbmRhclBpY2tlclxuICAgICAgICAgIFsobmdNb2RlbCldPVwiY2FsZW5kYXJWYWx1ZVwiXG4gICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgICAgICAgW2RhdGVGb3JtYXRdPVwiY3VycmVudERhdGVGb3JtYXRcIlxuICAgICAgICAgIFtzaG93VGltZV09XCJ0cnVlXCJcbiAgICAgICAgICBbc2hvd1NlY29uZHNdPVwiZmFsc2VcIlxuICAgICAgICAgIFtob3VyRm9ybWF0XT1cIicyNCdcIlxuICAgICAgICAgIFtzaG93QnV0dG9uQmFyXT1cInRydWVcIlxuICAgICAgICAgIFthcHBlbmRUb109XCInYm9keSdcIlxuICAgICAgICAgIFtpbmxpbmVdPVwiZmFsc2VcIlxuICAgICAgICAgIFtzaG93SWNvbl09XCJmYWxzZVwiXG4gICAgICAgICAgKG9uU2VsZWN0KT1cIm9uQ2FsZW5kYXJTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgKG9uQ2xlYXJDbGljayk9XCJvbkNhbGVuZGFyQ2xlYXIoKVwiXG4gICAgICAgICAgc3R5bGVDbGFzcz1cImhpZGRlbi1jYWxlbmRhci1pbnB1dFwiPlxuICAgICAgICA8L3AtY2FsZW5kYXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L3NpYS1keW5hbWljLWZpZWxkLXdyYXBwZXI+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICAuZGF0ZXRpbWUtZmllbGQge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuXG4gICAgLmRhdGV0aW1lLWlucHV0LWdyb3VwIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuXG4gICAgICA6Om5nLWRlZXAgcC1pbnB1dG1hc2sge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG5cbiAgICAgICAgaW5wdXQge1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDIuNXJlbTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAuZGF0ZXRpbWUtYnV0dG9ucyB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgcmlnaHQ6IDRweDtcbiAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiAycHg7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgfVxuXG4gICAgICA6Om5nLWRlZXAgLnAtYnV0dG9uIHtcbiAgICAgICAgd2lkdGg6IDJyZW0gIWltcG9ydGFudDtcbiAgICAgICAgaGVpZ2h0OiAycmVtICFpbXBvcnRhbnQ7XG4gICAgICAgIG1pbi13aWR0aDogMnJlbSAhaW1wb3J0YW50O1xuICAgICAgICBtaW4taGVpZ2h0OiAycmVtICFpbXBvcnRhbnQ7XG4gICAgICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICAgICAgbWFyZ2luOiAwICFpbXBvcnRhbnQ7XG4gICAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50O1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlciAhaW1wb3J0YW50O1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94ICFpbXBvcnRhbnQ7XG5cbiAgICAgICAgLnAtYnV0dG9uLWljb24ge1xuICAgICAgICAgIG1hcmdpbjogMCAhaW1wb3J0YW50O1xuICAgICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW0gIWltcG9ydGFudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5wLWJ1dHRvbi1sYWJlbCB7XG4gICAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgOjpuZy1kZWVwIC5oaWRkZW4tY2FsZW5kYXItaW5wdXQge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgd2lkdGg6IDA7XG4gICAgICBoZWlnaHQ6IDA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgb3BhY2l0eTogMDtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuXG4gICAgICBpbnB1dCB7XG4gICAgICAgIHdpZHRoOiAwO1xuICAgICAgICBoZWlnaHQ6IDA7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIH1cbiAgICB9XG4gIGBdXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNGaWVsZERhdGV0aW1lQ29tcG9uZW50IGV4dGVuZHMgRHluYW1pY0ZpZWxkQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgnY2FsZW5kYXJQaWNrZXInKSBjYWxlbmRhclBpY2tlciE6IENhbGVuZGFyO1xuXG4gIGN1cnJlbnREYXRlRm9ybWF0ID0gJ2RkL21tL3l5JztcbiAgZGF0ZXRpbWVNYXNrID0gJzk5Lzk5Lzk5OTkgOTk6OTknO1xuICBjYWxlbmRhclZhbHVlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFZhbG9yIGRlIGV4aWJpw6fDo28gbm8gZm9ybWF0byBsb2NhbGUgKGV4OiBcIjE4LzA1LzIwMjYgMTQ6MzBcIiBwYXJhIHB0LUJSKSAqL1xuICBkaXNwbGF5VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgbGFuZ1N1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSB2YWx1ZVN1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBjdXJyZW50TG9jYWxlOiBTdXBwb3J0ZWRMYW5ndWFnZSA9ICdwdC1CUic7XG4gIHByaXZhdGUgdXBkYXRpbmdGcm9tQ29udHJvbCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9jYWxlU2VydmljZTogTG9jYWxlU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIodHJhbnNsYXRpb25TZXJ2aWNlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmdldEN1cnJlbnRMYW5ndWFnZSgpO1xuICAgIHRoaXMudXBkYXRlRGF0ZXRpbWVGb3JtYXQoKTtcblxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQuZmllbGQpO1xuICAgIGlmIChjb250cm9sKSB7XG4gICAgICAvLyBJbmljaWFsaXphciBkaXNwbGF5VmFsdWUgYSBwYXJ0aXIgZG8gdmFsb3IgSVNPIGRvIGNvbnRyb2xcbiAgICAgIHRoaXMuc3luY0Rpc3BsYXlGcm9tQ29udHJvbChjb250cm9sLnZhbHVlKTtcblxuICAgICAgLy8gT2JzZXJ2YXIgbXVkYW7Dp2FzIGV4dGVybmFzIG5vIGNvbnRyb2wgKHBhdGNoVmFsdWUsIHNldFZhbHVlKVxuICAgICAgdGhpcy52YWx1ZVN1YiA9IGNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnVwZGF0aW5nRnJvbUNvbnRyb2wpIHsgcmV0dXJuOyB9XG4gICAgICAgIHRoaXMuc3luY0Rpc3BsYXlGcm9tQ29udHJvbCh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmxhbmdTdWIgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5jdXJyZW50TGFuZ3VhZ2UkLnN1YnNjcmliZSgobGFuZykgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50TG9jYWxlID0gbGFuZztcbiAgICAgIHRoaXMudXBkYXRlRGF0ZXRpbWVGb3JtYXQoKTtcbiAgICAgIC8vIFJlLWZvcm1hdGFyIG8gZGlzcGxheSBjb20gbyBub3ZvIGxvY2FsZVxuICAgICAgY29uc3QgY3RybCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgICBpZiAoY3RybCkge1xuICAgICAgICB0aGlzLnN5bmNEaXNwbGF5RnJvbUNvbnRyb2woY3RybC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmxhbmdTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy52YWx1ZVN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW5jcm9uaXphIG8gZGlzcGxheVZhbHVlIGEgcGFydGlyIGRvIHZhbG9yIElTTyBkbyBGb3JtQ29udHJvbC5cbiAgICogQWNlaXRhOiBJU08gc3RyaW5nLCBEYXRlLCBsb2NhbGUgc3RyaW5nLCBvdSBudWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBzeW5jRGlzcGxheUZyb21Db250cm9sKHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIGNvbnN0IGlzbyA9IHZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gICAgICB0aGlzLnNldENvbnRyb2xWYWx1ZShpc28pO1xuICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSB0aGlzLmlzb1RvTG9jYWxlKHZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzID0gU3RyaW5nKHZhbHVlKTtcblxuICAgIC8vIElTTyBkYXRldGltZSBzdHJpbmcgKGNvbnTDqW0gVClcbiAgICBpZiAocy5pbmNsdWRlcygnVCcpKSB7XG4gICAgICBjb25zdCBkID0gbmV3IERhdGUocyk7XG4gICAgICBpZiAoIWlzTmFOKGQuZ2V0VGltZSgpKSkge1xuICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHRoaXMuaXNvVG9Mb2NhbGUoZCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0byBsb2NhbGUgXCJkZC9NTS95eXl5IEhIOm1tXCIgb3UgXCJNTS9kZC95eXl5IEhIOm1tXCJcbiAgICBpZiAocy5tYXRjaCgvXlxcZHsyfVxcL1xcZHsyfVxcL1xcZHs0fSBcXGR7Mn06XFxkezJ9JC8pKSB7XG4gICAgICBjb25zdCBpc28gPSB0aGlzLmxvY2FsZVRvSXNvKHMpO1xuICAgICAgaWYgKGlzbykge1xuICAgICAgICB0aGlzLnNldENvbnRyb2xWYWx1ZShpc28pO1xuICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHM7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVmFsb3IgaW5jb21wbGV0b1xuICAgIHRoaXMuZGlzcGxheVZhbHVlID0gcy5pbmNsdWRlcygnXycpID8gbnVsbCA6IG51bGw7XG4gIH1cblxuICAvKiogQ2hhbWFkbyBxdWFuZG8gbyB1c3XDoXJpbyBjb21wbGV0YSBhIGRpZ2l0YcOnw6NvIGRhIG3DoXNjYXJhICovXG4gIG9uRGlzcGxheVZhbHVlQ29tcGxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5zeW5jQ29udHJvbEZyb21EaXNwbGF5KCk7XG4gIH1cblxuICAvKiogQ2hhbWFkbyBxdWFuZG8gbyBpbnB1dCBwZXJkZSBmb2NvICovXG4gIG9uRGlzcGxheVZhbHVlQmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLnN5bmNDb250cm9sRnJvbURpc3BsYXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0ZSBvIGRpc3BsYXlWYWx1ZSAobG9jYWxlKSBwYXJhIElTTyBlIHNldGEgbm8gRm9ybUNvbnRyb2wuXG4gICAqL1xuICBwcml2YXRlIHN5bmNDb250cm9sRnJvbURpc3BsYXkoKTogdm9pZCB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgaWYgKCFjb250cm9sKSB7IHJldHVybjsgfVxuXG4gICAgaWYgKCF0aGlzLmRpc3BsYXlWYWx1ZSB8fCB0aGlzLmRpc3BsYXlWYWx1ZS5pbmNsdWRlcygnXycpKSB7XG4gICAgICB0aGlzLnNldENvbnRyb2xWYWx1ZShudWxsKTtcbiAgICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc28gPSB0aGlzLmxvY2FsZVRvSXNvKHRoaXMuZGlzcGxheVZhbHVlKTtcbiAgICBpZiAoaXNvKSB7XG4gICAgICB0aGlzLnNldENvbnRyb2xWYWx1ZShpc28pO1xuICAgICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZXRhIG8gdmFsb3Igbm8gY29udHJvbCBzZW0gZGlzcGFyYXIgbyBzdWJzY3JpYmVyIGludGVybm8gKi9cbiAgcHJpdmF0ZSBzZXRDb250cm9sVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldCh0aGlzLmZpZWxkLmZpZWxkKTtcbiAgICBpZiAoIWNvbnRyb2wpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy51cGRhdGluZ0Zyb21Db250cm9sID0gdHJ1ZTtcbiAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICB0aGlzLnVwZGF0aW5nRnJvbUNvbnRyb2wgPSBmYWxzZTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IENPTlZFUlPDlUVTID09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENvbnZlcnRlIERhdGUgcGFyYSBsb2NhbGUgZGlzcGxheSBzdHJpbmcgKi9cbiAgcHJpdmF0ZSBpc29Ub0xvY2FsZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCB5ZWFyID0gU3RyaW5nKGRhdGUuZ2V0RnVsbFllYXIoKSk7XG4gICAgY29uc3QgaG91cnMgPSBTdHJpbmcoZGF0ZS5nZXRIb3VycygpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBTdHJpbmcoZGF0ZS5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgY29uZmlnID0gREFURVRJTUVfTUFTS19DT05GSUdTW3RoaXMuY3VycmVudExvY2FsZV0gfHwgREFURVRJTUVfTUFTS19DT05GSUdTWydwdC1CUiddO1xuICAgIHJldHVybiBjb25maWcuZm9ybWF0ID09PSAnbWR5J1xuICAgICAgPyBgJHttb250aH0vJHtkYXl9LyR7eWVhcn0gJHtob3Vyc306JHttaW51dGVzfWBcbiAgICAgIDogYCR7ZGF5fS8ke21vbnRofS8ke3llYXJ9ICR7aG91cnN9OiR7bWludXRlc31gO1xuICB9XG5cbiAgLyoqIENvbnZlcnRlIGxvY2FsZSBzdHJpbmcgcGFyYSBJU08gZGF0ZXRpbWUgc3RyaW5nICovXG4gIHByaXZhdGUgbG9jYWxlVG9Jc28obG9jYWxlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBwYXJ0cyA9IGxvY2FsZS5zcGxpdCgnICcpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDIpIHsgcmV0dXJuIG51bGw7IH1cbiAgICBjb25zdCBkYXRlUGFydHMgPSBwYXJ0c1swXS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHRpbWVQYXJ0cyA9IHBhcnRzWzFdLnNwbGl0KCc6Jyk7XG4gICAgaWYgKGRhdGVQYXJ0cy5sZW5ndGggIT09IDMgfHwgdGltZVBhcnRzLmxlbmd0aCAhPT0gMikgeyByZXR1cm4gbnVsbDsgfVxuXG4gICAgY29uc3QgY29uZmlnID0gREFURVRJTUVfTUFTS19DT05GSUdTW3RoaXMuY3VycmVudExvY2FsZV0gfHwgREFURVRJTUVfTUFTS19DT05GSUdTWydwdC1CUiddO1xuICAgIGNvbnN0IFtwMCwgcDEsIHAyXSA9IGRhdGVQYXJ0cy5tYXAocCA9PiBwYXJzZUludChwLCAxMCkpO1xuICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IGNvbmZpZy5mb3JtYXQgPT09ICdtZHknID8gW3AxLCBwMCwgcDJdIDogW3AwLCBwMSwgcDJdO1xuICAgIGNvbnN0IGhvdXJzID0gcGFyc2VJbnQodGltZVBhcnRzWzBdLCAxMCk7XG4gICAgY29uc3QgbWludXRlcyA9IHBhcnNlSW50KHRpbWVQYXJ0c1sxXSwgMTApO1xuXG4gICAgaWYgKGlzTmFOKGRheSkgfHwgaXNOYU4obW9udGgpIHx8IGlzTmFOKHllYXIpIHx8IGlzTmFOKGhvdXJzKSB8fCBpc05hTihtaW51dGVzKSkgeyByZXR1cm4gbnVsbDsgfVxuICAgIGlmIChtb250aCA8IDEgfHwgbW9udGggPiAxMiB8fCBkYXkgPCAxIHx8IGRheSA+IDMxIHx8IGhvdXJzIDwgMCB8fCBob3VycyA+IDIzIHx8IG1pbnV0ZXMgPCAwIHx8IG1pbnV0ZXMgPiA1OSkgeyByZXR1cm4gbnVsbDsgfVxuXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5LCBob3VycywgbWludXRlcyk7XG4gICAgcmV0dXJuIGlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IG51bGwgOiBkYXRlLnRvSVNPU3RyaW5nKCk7XG4gIH1cblxuICAvKiogQ29udmVydGUgbG9jYWxlIHN0cmluZyBwYXJhIERhdGUgKi9cbiAgcHJpdmF0ZSBsb2NhbGVUb0RhdGUodmFsdWU6IHN0cmluZyk6IERhdGUgfCBudWxsIHtcbiAgICBjb25zdCBpc28gPSB0aGlzLmxvY2FsZVRvSXNvKHZhbHVlKTtcbiAgICBpZiAoIWlzbykgeyByZXR1cm4gbnVsbDsgfVxuICAgIHJldHVybiBuZXcgRGF0ZShpc28pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gQ0FMRU5EQVIgPT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIHVwZGF0ZURhdGV0aW1lRm9ybWF0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IERBVEVUSU1FX01BU0tfQ09ORklHU1t0aGlzLmN1cnJlbnRMb2NhbGVdIHx8IERBVEVUSU1FX01BU0tfQ09ORklHU1sncHQtQlInXTtcbiAgICB0aGlzLmRhdGV0aW1lTWFzayA9IGNvbmZpZy5tYXNrO1xuICAgIHRoaXMuY3VycmVudERhdGVGb3JtYXQgPSB0aGlzLmZpZWxkPy5kYXRlRm9ybWF0IHx8IHRoaXMubG9jYWxlU2VydmljZS5nZXRQcmltZU5HRGF0ZUZvcm1hdCgpO1xuICB9XG5cbiAgdG9nZ2xlQ2FsZW5kYXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuZGlzcGxheVZhbHVlICYmICF0aGlzLmRpc3BsYXlWYWx1ZS5pbmNsdWRlcygnXycpKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyVmFsdWUgPSB0aGlzLmxvY2FsZVRvRGF0ZSh0aGlzLmRpc3BsYXlWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FsZW5kYXJWYWx1ZSA9IG5ldyBEYXRlKCk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jYWxlbmRhclBpY2tlciAmJiB0aGlzLmNhbGVuZGFyUGlja2VyLmlucHV0ZmllbGRWaWV3Q2hpbGQpIHtcbiAgICAgICAgdGhpcy5jYWxlbmRhclBpY2tlci5pbnB1dGZpZWxkVmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uQ2FsZW5kYXJTZWxlY3QoZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIGlmIChkYXRlKSB7XG4gICAgICBjb25zdCBpc28gPSBkYXRlLnRvSVNPU3RyaW5nKCk7XG4gICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHRoaXMuaXNvVG9Mb2NhbGUoZGF0ZSk7XG4gICAgICB0aGlzLnNldENvbnRyb2xWYWx1ZShpc28pO1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgICBpZiAoY29udHJvbCkgeyBjb250cm9sLm1hcmtBc0RpcnR5KCk7IH1cbiAgICB9XG4gIH1cblxuICBvbkNhbGVuZGFyQ2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5VmFsdWUgPSBudWxsO1xuICAgIHRoaXMuc2V0Q29udHJvbFZhbHVlKG51bGwpO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KHRoaXMuZmllbGQuZmllbGQpO1xuICAgIGlmIChjb250cm9sKSB7IGNvbnRyb2wubWFya0FzRGlydHkoKTsgfVxuICB9XG5cbiAgaXNDb250cm9sRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQodGhpcy5maWVsZC5maWVsZCk7XG4gICAgcmV0dXJuIGNvbnRyb2wgPyBjb250cm9sLmRpc2FibGVkIDogZmFsc2U7XG4gIH1cblxuICBvdmVycmlkZSBnZXRQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpZWxkLnBsYWNlaG9sZGVyKSB7IHJldHVybiB0aGlzLmZpZWxkLnBsYWNlaG9sZGVyOyB9XG4gICAgcmV0dXJuIERBVEVUSU1FX01BU0tfQ09ORklHU1t0aGlzLmN1cnJlbnRMb2NhbGVdPy5wbGFjZWhvbGRlciB8fCAnZGQvbW0vYWFhYSBISDptbSc7XG4gIH1cbn1cbiJdfQ==