@seniorsistemas/angular-components 18.0.4 → 18.1.0-feature-sds-276-640ecaac

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 (45) hide show
  1. package/esm2022/form-dynamic/components/form-dynamic/form-dynamic.component.mjs +53 -0
  2. package/esm2022/form-dynamic/core/registry.mjs +10 -0
  3. package/esm2022/form-dynamic/fields-basic/boolean-field/boolean-field.component.mjs +15 -0
  4. package/esm2022/form-dynamic/fields-basic/string-field/string-field.component.mjs +15 -0
  5. package/esm2022/form-dynamic/lib/optional-fields/editor/editor-field/editor-field.component.mjs +30 -0
  6. package/esm2022/form-dynamic/lib/optional-fields/editor/editor-types.mjs +3 -0
  7. package/esm2022/form-dynamic/lib/optional-fields/editor/public-api.mjs +8 -0
  8. package/esm2022/form-dynamic/lib/optional-fields/editor/seniorsistemas-angular-components-form-dynamic-lib-optional-fields-editor.mjs +5 -0
  9. package/esm2022/form-dynamic/public-api.mjs +10 -0
  10. package/esm2022/form-dynamic/schemas/field-dynamic.mjs +2 -0
  11. package/esm2022/form-dynamic/schemas/form-dynamic-schema.mjs +2 -0
  12. package/esm2022/form-dynamic/seniorsistemas-angular-components-form-dynamic.mjs +5 -0
  13. package/esm2022/numeric-mask/lib/numeric-mask/numeric-mask.directive.mjs +10 -14
  14. package/esm2022/pin-code-field/lib/pin-code-field/pin-code-field.component.mjs +460 -0
  15. package/esm2022/pin-code-field/lib/pin-code-field.module.mjs +16 -0
  16. package/esm2022/pin-code-field/public-api.mjs +3 -0
  17. package/esm2022/pin-code-field/seniorsistemas-angular-components-pin-code-field.mjs +5 -0
  18. package/fesm2022/seniorsistemas-angular-components-form-dynamic-lib-optional-fields-editor.mjs +44 -0
  19. package/fesm2022/seniorsistemas-angular-components-form-dynamic-lib-optional-fields-editor.mjs.map +1 -0
  20. package/fesm2022/seniorsistemas-angular-components-form-dynamic.mjs +94 -0
  21. package/fesm2022/seniorsistemas-angular-components-form-dynamic.mjs.map +1 -0
  22. package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs +9 -13
  23. package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs.map +1 -1
  24. package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs +480 -0
  25. package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs.map +1 -0
  26. package/form-dynamic/components/form-dynamic/form-dynamic.component.d.ts +15 -0
  27. package/form-dynamic/core/registry.d.ts +7 -0
  28. package/form-dynamic/fields-basic/boolean-field/boolean-field.component.d.ts +9 -0
  29. package/form-dynamic/fields-basic/string-field/string-field.component.d.ts +9 -0
  30. package/form-dynamic/index.d.ts +5 -0
  31. package/form-dynamic/lib/optional-fields/editor/editor-field/editor-field.component.d.ts +15 -0
  32. package/form-dynamic/lib/optional-fields/editor/editor-types.d.ts +13 -0
  33. package/form-dynamic/lib/optional-fields/editor/index.d.ts +5 -0
  34. package/form-dynamic/lib/optional-fields/editor/public-api.d.ts +2 -0
  35. package/form-dynamic/public-api.d.ts +4 -0
  36. package/form-dynamic/schemas/field-dynamic.d.ts +20 -0
  37. package/form-dynamic/schemas/form-dynamic-schema.d.ts +4 -0
  38. package/numeric-mask/README.md +182 -154
  39. package/numeric-mask/lib/numeric-mask/numeric-mask.directive.d.ts +2 -7
  40. package/package.json +32 -14
  41. package/pin-code-field/README.md +366 -0
  42. package/pin-code-field/index.d.ts +5 -0
  43. package/pin-code-field/lib/pin-code-field/pin-code-field.component.d.ts +284 -0
  44. package/pin-code-field/lib/pin-code-field.module.d.ts +7 -0
  45. package/pin-code-field/public-api.d.ts +2 -0
@@ -0,0 +1,460 @@
1
+ import { Component, forwardRef, viewChildren, ElementRef, signal, input, output, effect, computed, model, inject, DestroyRef, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ /**
7
+ * Pin Code Field Component
8
+ *
9
+ * A flexible, accessible PIN code input component that implements {@link ControlValueAccessor}
10
+ * for seamless integration with Angular Reactive Forms and Template-driven Forms.
11
+ *
12
+ * Features:
13
+ * - Multiple input fields for PIN/OTP code entry
14
+ * - Configurable code length and character validation
15
+ * - Keyboard navigation (arrow keys, backspace)
16
+ * - Paste support with automatic truncation
17
+ * - Error state display via the `invalid` input
18
+ * - Full accessibility support (ARIA labels, semantic roles)
19
+ * - Signal-based state management
20
+ *
21
+ * @example
22
+ * ```html
23
+ * <form [formGroup]="form">
24
+ * <s-pin-code-field
25
+ * formControlName="code"
26
+ * [length]="6"
27
+ * [alphanumeric]="false"
28
+ * [invalid]="(form.get('code')?.invalid && form.get('code')?.dirty) || false"
29
+ * helpText="Enter your 6-digit code"
30
+ * (codeFilled)="onCodeFilled($event)">
31
+ * </s-pin-code-field>
32
+ * </form>
33
+ * ```
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * form = this.fb.group({
38
+ * code: ['', [Validators.required]],
39
+ * });
40
+ * ```
41
+ */
42
+ export class PinCodeFieldComponent {
43
+ static LAST_INDEX_OFFSET = 1;
44
+ static EMPTY_VALUE = '';
45
+ /**
46
+ * Number of input fields (PIN code length).
47
+ * Must be at least 1.
48
+ *
49
+ * @default 6
50
+ */
51
+ length = input(6);
52
+ /**
53
+ * Allows alphanumeric and special characters input.
54
+ * When false, only numeric input (0-9) is accepted.
55
+ *
56
+ * @default false
57
+ */
58
+ alphanumeric = input(false);
59
+ /**
60
+ * Help text displayed below the input fields.
61
+ *
62
+ * @default ''
63
+ */
64
+ helpText = input('');
65
+ /**
66
+ * Controls the error state visualization of the component.
67
+ * When true, displays red border on input fields.
68
+ * Typically bound to FormControl's invalid and dirty state.
69
+ *
70
+ * @example
71
+ * ```html
72
+ * [invalid]="(control?.invalid && control?.dirty) || false"
73
+ * ```
74
+ * @default false
75
+ */
76
+ invalid = input(false);
77
+ /**
78
+ * Two-way binding for the disabled state of the component.
79
+ * Disables all input fields and prevents user interaction.
80
+ *
81
+ * @default false
82
+ */
83
+ disabled = model(false);
84
+ /**
85
+ * Emitted when all PIN code fields are filled.
86
+ * Emits the complete PIN code as a string.
87
+ *
88
+ * @example
89
+ * ```html
90
+ * (codeFilled)="onCodeFilled($event)"
91
+ * ```
92
+ */
93
+ codeFilled = output();
94
+ /**
95
+ * Signal containing the current values of each input field.
96
+ * Array length matches the `length` input value.
97
+ */
98
+ inputs = signal([]);
99
+ /**
100
+ * Signal tracking whether the component has been touched by the user.
101
+ * Set to true when the last input field loses focus (blur event).
102
+ */
103
+ touched = signal(false);
104
+ /**
105
+ * Computed signal indicating whether all PIN code fields are filled.
106
+ * True only when every field contains a non-empty value.
107
+ */
108
+ isComplete = computed(() => this.inputs().every((input) => input !== ''));
109
+ /**
110
+ * Computed signal containing the complete PIN code as a joined string.
111
+ * Returns empty string if no inputs are filled.
112
+ */
113
+ currentValue = computed(() => this.inputs().join(''));
114
+ /**
115
+ * Signal tracking if the component host has the ng-invalid class from FormControl validators.
116
+ * Updated reactively whenever the invalid state changes.
117
+ */
118
+ hasNgInvalidClass = signal(false);
119
+ /**
120
+ * Signal tracking if the FormControl is dirty.
121
+ * Updated reactively whenever the dirty state changes.
122
+ */
123
+ isControlDirty = signal(false);
124
+ /**
125
+ * Computed signal indicating if the component should show error state.
126
+ * Returns true if:
127
+ * - The `invalid` input is true, OR
128
+ * - The component has the `ng-invalid` class AND the FormControl is dirty (touched/modified)
129
+ * This ensures errors are only shown to the user after they've interacted with the field.
130
+ */
131
+ hasError = computed(() => this.invalid() || (this.hasNgInvalidClass() && this.isControlDirty()));
132
+ /**
133
+ * ViewChildren reference to all input DOM elements.
134
+ * Used for DOM manipulation (focus, selection).
135
+ */
136
+ pinInputs = viewChildren('pinInput');
137
+ elementRef = inject(ElementRef);
138
+ destroyRef = inject(DestroyRef);
139
+ onChange = () => { };
140
+ onTouched = () => { };
141
+ constructor() {
142
+ effect(() => {
143
+ const newLength = this.length();
144
+ if (newLength < 1) {
145
+ console.warn('PIN code length must be at least 1');
146
+ return;
147
+ }
148
+ if (this.inputs().length !== newLength) {
149
+ this.inputs.set(Array.from({ length: newLength }, () => ''));
150
+ }
151
+ }, { allowSignalWrites: true });
152
+ // Monitor ng-invalid and ng-dirty classes on the host element for reactive error state
153
+ effect(() => {
154
+ // Access inputs to create dependency on changes
155
+ this.inputs();
156
+ this.invalid();
157
+ // Use setTimeout to defer the check to next tick to ensure Angular has updated DOM classes
158
+ const timeoutId = window.setTimeout(() => {
159
+ const hostElement = this.elementRef.nativeElement;
160
+ const hasNgInvalid = hostElement.classList.contains('ng-invalid');
161
+ const isDirty = hostElement.classList.contains('ng-dirty');
162
+ this.hasNgInvalidClass.set(hasNgInvalid);
163
+ this.isControlDirty.set(isDirty);
164
+ });
165
+ // Cleanup timeout on component destroy
166
+ this.destroyRef.onDestroy(() => {
167
+ clearTimeout(timeoutId);
168
+ });
169
+ }, { allowSignalWrites: true });
170
+ }
171
+ /**
172
+ * Handles input event on PIN code fields.
173
+ * Validates character input, prevents multiple characters per field,
174
+ * auto-advances to next field when character is entered.
175
+ *
176
+ * @param index - The input field index (0-based)
177
+ * @param event - The input event
178
+ */
179
+ onInput(index, event) {
180
+ if (this.disabled()) {
181
+ event.preventDefault();
182
+ return;
183
+ }
184
+ const target = event.target;
185
+ const value = target.value;
186
+ if (value.length > 1 || (value && !this.isValidCharacter(value))) {
187
+ this.clearInput(target);
188
+ return;
189
+ }
190
+ this.setInputAtIndex(index, value);
191
+ if (value && index < this.length() - 1) {
192
+ this.focusAndSelectInput(index + 1);
193
+ }
194
+ if (this.isComplete()) {
195
+ this.codeFilled.emit(this.currentValue());
196
+ }
197
+ }
198
+ /**
199
+ * Handles keyboard events on PIN code fields.
200
+ * Supports arrow navigation (left/right) and backspace key.
201
+ *
202
+ * Keyboard behavior:
203
+ * - ArrowRight: Move focus to next field
204
+ * - ArrowLeft: Move focus to previous field
205
+ * - Backspace: Clear current or previous field and adjust focus
206
+ *
207
+ * @param index - The input field index (0-based)
208
+ * @param event - The keyboard event
209
+ */
210
+ onKeyDown(index, event) {
211
+ if (this.disabled()) {
212
+ event.preventDefault();
213
+ return;
214
+ }
215
+ const key = event.key;
216
+ switch (key) {
217
+ case 'ArrowRight':
218
+ if (index < this.length() - 1) {
219
+ event.preventDefault();
220
+ this.focusAndSelectInput(index + 1);
221
+ }
222
+ break;
223
+ case 'ArrowLeft':
224
+ if (index > 0) {
225
+ event.preventDefault();
226
+ this.focusAndSelectInput(index - 1);
227
+ }
228
+ break;
229
+ case 'Backspace':
230
+ event.preventDefault();
231
+ this.handleBackspace(index);
232
+ break;
233
+ }
234
+ }
235
+ /**
236
+ * Handles paste (clipboard) events on PIN code fields.
237
+ * Extracts valid characters from pasted content, filters by character type,
238
+ * and automatically truncates to match field length.
239
+ *
240
+ * Behavior:
241
+ * - Filters characters based on `alphanumeric` setting
242
+ * - Truncates to maximum field count
243
+ * - Fills available fields with pasted content
244
+ * - Emits codeFilled event if all fields are filled
245
+ *
246
+ * @param event - The clipboard event
247
+ */
248
+ onPaste(event) {
249
+ if (this.disabled()) {
250
+ event.preventDefault();
251
+ return;
252
+ }
253
+ event.preventDefault();
254
+ const validChars = this.extractValidCharactersFromPaste(event);
255
+ if (validChars.length === 0) {
256
+ return;
257
+ }
258
+ const filledInputs = [
259
+ ...validChars,
260
+ ...Array(this.length() - validChars.length).fill(''),
261
+ ];
262
+ this.inputs.set(filledInputs);
263
+ this.updateValue();
264
+ // Focus on the first empty input or the last filled input if all are filled
265
+ const firstEmptyIndex = validChars.length < this.length() ? validChars.length : validChars.length - 1;
266
+ this.focusAndSelectInput(firstEmptyIndex);
267
+ if (this.isComplete()) {
268
+ this.codeFilled.emit(this.currentValue());
269
+ }
270
+ }
271
+ /**
272
+ * Handles focus event on PIN code fields.
273
+ * Selects all text in the input field when focused.
274
+ *
275
+ * @param index - The input field index (0-based)
276
+ */
277
+ onFocus(index) {
278
+ const input = this.pinInputs()[index];
279
+ if (input) {
280
+ input.nativeElement.select();
281
+ }
282
+ }
283
+ /**
284
+ * Handles blur event on PIN code fields.
285
+ * Marks the component as touched when the last input field loses focus.
286
+ * Also notifies the registered onTouched callback for FormControl integration.
287
+ *
288
+ * @param index - The input field index (0-based)
289
+ */
290
+ onBlur(index) {
291
+ // Only mark as touched when the LAST input loses focus
292
+ if (index === this.length() - PinCodeFieldComponent.LAST_INDEX_OFFSET) {
293
+ this.touched.set(true);
294
+ this.onTouched();
295
+ }
296
+ }
297
+ /**
298
+ * Clears the input value at specified index and adjusts focus accordingly.
299
+ * If current field is empty, moves to previous field and clears it.
300
+ *
301
+ * @private
302
+ * @param index - The input field index (0-based)
303
+ */
304
+ handleBackspace(index) {
305
+ const currentInputs = this.inputs();
306
+ // If current input has value, clear it
307
+ if (currentInputs[index]) {
308
+ this.setInputAtIndex(index, PinCodeFieldComponent.EMPTY_VALUE);
309
+ return;
310
+ }
311
+ // Otherwise, clear previous input and focus it
312
+ if (index > 0) {
313
+ this.setInputAtIndex(index - 1, PinCodeFieldComponent.EMPTY_VALUE);
314
+ this.focusAndSelectInput(index - 1);
315
+ }
316
+ }
317
+ /**
318
+ * Sets the value at a specific input field index and updates the form value.
319
+ * Updates the signal and triggers the change detection via onChange callback.
320
+ *
321
+ * @private
322
+ * @param index - The input field index (0-based)
323
+ * @param value - The value to set in the field
324
+ */
325
+ setInputAtIndex(index, value) {
326
+ const currentInputs = this.inputs();
327
+ currentInputs[index] = value;
328
+ this.inputs.set([...currentInputs]);
329
+ this.updateValue();
330
+ }
331
+ /**
332
+ * Focuses on and selects text in the input field at the specified index.
333
+ * Uses queueMicrotask to ensure DOM is updated before focusing.
334
+ *
335
+ * @private
336
+ * @param index - The input field index (0-based)
337
+ */
338
+ focusAndSelectInput(index) {
339
+ queueMicrotask(() => {
340
+ const input = this.pinInputs()[index];
341
+ if (input) {
342
+ input.nativeElement.focus();
343
+ input.nativeElement.select();
344
+ }
345
+ });
346
+ }
347
+ /**
348
+ * Clears the value of an input element.
349
+ * Used for input validation to reject invalid characters.
350
+ *
351
+ * @private
352
+ * @param target - The HTML input element to clear
353
+ */
354
+ clearInput(target) {
355
+ target.value = '';
356
+ }
357
+ /**
358
+ * Extracts valid characters from pasted content.
359
+ * Filters based on alphanumeric setting and limits to component's length.
360
+ *
361
+ * @private
362
+ * @param event - The clipboard event
363
+ * @returns Array of valid characters from the pasted content
364
+ */
365
+ extractValidCharactersFromPaste(event) {
366
+ const pastedText = (event.clipboardData?.getData('text') || '').trim();
367
+ return pastedText
368
+ .split('')
369
+ .filter((char) => this.isValidCharacter(char))
370
+ .slice(0, this.length());
371
+ }
372
+ /**
373
+ * Validates if a character is acceptable based on component configuration.
374
+ * For numeric mode, accepts only digits 0-9.
375
+ * For alphanumeric mode, accepts any non-whitespace character.
376
+ *
377
+ * @private
378
+ * @param char - The character to validate
379
+ * @returns true if character is valid, false otherwise
380
+ */
381
+ isValidCharacter(char) {
382
+ if (this.alphanumeric()) {
383
+ return char.trim().length > 0;
384
+ }
385
+ return /^[0-9]$/.test(char);
386
+ }
387
+ /**
388
+ * Updates the form value by calling the onChange callback registered by FormControl.
389
+ * This ensures the reactive form stays synchronized with component state.
390
+ *
391
+ * @private
392
+ */
393
+ updateValue() {
394
+ this.onChange(this.currentValue());
395
+ }
396
+ /**
397
+ * Implements ControlValueAccessor interface.
398
+ * Called by the FormControl to write a value to the component.
399
+ * Only accepts string values with length matching the component's length setting.
400
+ *
401
+ * @param value - The value to write (typically from the FormControl)
402
+ */
403
+ writeValue(value) {
404
+ if (value) {
405
+ const stringValue = String(value);
406
+ if (stringValue.length === this.length()) {
407
+ this.inputs.set(stringValue.split(''));
408
+ }
409
+ }
410
+ }
411
+ /**
412
+ * Implements ControlValueAccessor interface.
413
+ * Called by the FormControl when value changes.
414
+ * Registers the callback to be called when the component value changes.
415
+ *
416
+ * @param fn - Callback function to invoke when component value changes
417
+ */
418
+ registerOnChange(fn) {
419
+ this.onChange = fn;
420
+ }
421
+ /**
422
+ * Implements ControlValueAccessor interface.
423
+ * Called by the FormControl to register the touched callback.
424
+ * The callback is invoked when the last input field loses focus.
425
+ *
426
+ * @param fn - Callback function to invoke when component is touched
427
+ */
428
+ registerOnTouched(fn) {
429
+ this.onTouched = fn;
430
+ }
431
+ /**
432
+ * Implements ControlValueAccessor interface.
433
+ * Called by the FormControl to set the disabled state of the component.
434
+ * Updates the disabled model to reflect the form's disabled state.
435
+ *
436
+ * @param isDisabled - Whether the component should be disabled
437
+ */
438
+ setDisabledState(isDisabled) {
439
+ this.disabled.set(isDisabled);
440
+ }
441
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PinCodeFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
442
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PinCodeFieldComponent, isStandalone: true, selector: "s-pin-code-field", inputs: { length: { classPropertyName: "length", publicName: "length", isSignal: true, isRequired: false, transformFunction: null }, alphanumeric: { classPropertyName: "alphanumeric", publicName: "alphanumeric", isSignal: true, isRequired: false, transformFunction: null }, helpText: { classPropertyName: "helpText", publicName: "helpText", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { disabled: "disabledChange", codeFilled: "codeFilled" }, providers: [
443
+ {
444
+ provide: NG_VALUE_ACCESSOR,
445
+ useExisting: forwardRef(() => PinCodeFieldComponent),
446
+ multi: true,
447
+ },
448
+ ], viewQueries: [{ propertyName: "pinInputs", predicate: ["pinInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"gap-xsmall flex flex-col\">\n <div\n class=\"flex gap-2\"\n role=\"group\"\n aria-label=\"PIN code input\"\n [attr.aria-labelledby]=\"helpText() ? 'pin-help-text' : null\"\n >\n @for (input of inputs(); let i = $index; track i) {\n <input\n #pinInput\n type=\"text\"\n class=\"h-12 w-12 rounded-xbig border text-center text-lg font-medium transition-all duration-200\"\n [ngClass]=\"{\n 'border-criticality-red focus:ring-criticality-red': hasError(),\n 'border-grayscale-30 focus:border-primary focus:ring-primary': !hasError(),\n 'cursor-not-allowed bg-grayscale-10 text-grayscale-60': disabled(),\n 'bg-grayscale-0 text-grayscale-100 focus:outline-none': !disabled(),\n }\"\n [value]=\"input\"\n [disabled]=\"disabled()\"\n [attr.maxlength]=\"1\"\n [attr.inputmode]=\"alphanumeric() ? 'text' : 'numeric'\"\n [attr.aria-label]=\"'PIN code character ' + (i + 1) + ' of ' + length()\"\n [attr.aria-describedby]=\"helpText() ? 'pin-help-text' : null\"\n [attr.aria-required]=\"true\"\n autocomplete=\"off\"\n (input)=\"onInput(i, $event)\"\n (keydown)=\"onKeyDown(i, $event)\"\n (paste)=\"onPaste($event)\"\n (focus)=\"onFocus(i)\"\n (blur)=\"onBlur(i)\"\n />\n }\n </div>\n\n @if (helpText()) {\n <div\n id=\"pin-help-text\"\n class=\"mt-small text-sm text-grayscale-60\"\n >\n {{ helpText() }}\n </div>\n }\n</div>\n\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
449
+ }
450
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PinCodeFieldComponent, decorators: [{
451
+ type: Component,
452
+ args: [{ selector: 's-pin-code-field', standalone: true, imports: [CommonModule], providers: [
453
+ {
454
+ provide: NG_VALUE_ACCESSOR,
455
+ useExisting: forwardRef(() => PinCodeFieldComponent),
456
+ multi: true,
457
+ },
458
+ ], template: "<div class=\"gap-xsmall flex flex-col\">\n <div\n class=\"flex gap-2\"\n role=\"group\"\n aria-label=\"PIN code input\"\n [attr.aria-labelledby]=\"helpText() ? 'pin-help-text' : null\"\n >\n @for (input of inputs(); let i = $index; track i) {\n <input\n #pinInput\n type=\"text\"\n class=\"h-12 w-12 rounded-xbig border text-center text-lg font-medium transition-all duration-200\"\n [ngClass]=\"{\n 'border-criticality-red focus:ring-criticality-red': hasError(),\n 'border-grayscale-30 focus:border-primary focus:ring-primary': !hasError(),\n 'cursor-not-allowed bg-grayscale-10 text-grayscale-60': disabled(),\n 'bg-grayscale-0 text-grayscale-100 focus:outline-none': !disabled(),\n }\"\n [value]=\"input\"\n [disabled]=\"disabled()\"\n [attr.maxlength]=\"1\"\n [attr.inputmode]=\"alphanumeric() ? 'text' : 'numeric'\"\n [attr.aria-label]=\"'PIN code character ' + (i + 1) + ' of ' + length()\"\n [attr.aria-describedby]=\"helpText() ? 'pin-help-text' : null\"\n [attr.aria-required]=\"true\"\n autocomplete=\"off\"\n (input)=\"onInput(i, $event)\"\n (keydown)=\"onKeyDown(i, $event)\"\n (paste)=\"onPaste($event)\"\n (focus)=\"onFocus(i)\"\n (blur)=\"onBlur(i)\"\n />\n }\n </div>\n\n @if (helpText()) {\n <div\n id=\"pin-help-text\"\n class=\"mt-small text-sm text-grayscale-60\"\n >\n {{ helpText() }}\n </div>\n }\n</div>\n\n" }]
459
+ }], ctorParameters: () => [] });
460
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGluLWNvZGUtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3Bpbi1jb2RlLWZpZWxkL3NyYy9saWIvcGluLWNvZGUtZmllbGQvcGluLWNvZGUtZmllbGQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3Bpbi1jb2RlLWZpZWxkL3NyYy9saWIvcGluLWNvZGUtZmllbGQvcGluLWNvZGUtZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBQ04sVUFBVSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUV6RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ0c7QUFjSCxNQUFNLE9BQU8scUJBQXFCO0lBQ3RCLE1BQU0sQ0FBVSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7SUFDdEMsTUFBTSxDQUFVLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFFekM7Ozs7O09BS0c7SUFDSSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXpCOzs7OztPQUtHO0lBQ0ksWUFBWSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVuQzs7OztPQUlHO0lBQ0ksUUFBUSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUU1Qjs7Ozs7Ozs7OztPQVVHO0lBQ0ksT0FB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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgZm9yd2FyZFJlZixcbiAgICB2aWV3Q2hpbGRyZW4sXG4gICAgRWxlbWVudFJlZixcbiAgICBzaWduYWwsXG4gICAgaW5wdXQsXG4gICAgb3V0cHV0LFxuICAgIGVmZmVjdCxcbiAgICBjb21wdXRlZCxcbiAgICBtb2RlbCxcbiAgICBpbmplY3QsXG4gICAgRGVzdHJveVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG4vKipcbiAqIFBpbiBDb2RlIEZpZWxkIENvbXBvbmVudFxuICpcbiAqIEEgZmxleGlibGUsIGFjY2Vzc2libGUgUElOIGNvZGUgaW5wdXQgY29tcG9uZW50IHRoYXQgaW1wbGVtZW50cyB7QGxpbmsgQ29udHJvbFZhbHVlQWNjZXNzb3J9XG4gKiBmb3Igc2VhbWxlc3MgaW50ZWdyYXRpb24gd2l0aCBBbmd1bGFyIFJlYWN0aXZlIEZvcm1zIGFuZCBUZW1wbGF0ZS1kcml2ZW4gRm9ybXMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIE11bHRpcGxlIGlucHV0IGZpZWxkcyBmb3IgUElOL09UUCBjb2RlIGVudHJ5XG4gKiAtIENvbmZpZ3VyYWJsZSBjb2RlIGxlbmd0aCBhbmQgY2hhcmFjdGVyIHZhbGlkYXRpb25cbiAqIC0gS2V5Ym9hcmQgbmF2aWdhdGlvbiAoYXJyb3cga2V5cywgYmFja3NwYWNlKVxuICogLSBQYXN0ZSBzdXBwb3J0IHdpdGggYXV0b21hdGljIHRydW5jYXRpb25cbiAqIC0gRXJyb3Igc3RhdGUgZGlzcGxheSB2aWEgdGhlIGBpbnZhbGlkYCBpbnB1dFxuICogLSBGdWxsIGFjY2Vzc2liaWxpdHkgc3VwcG9ydCAoQVJJQSBsYWJlbHMsIHNlbWFudGljIHJvbGVzKVxuICogLSBTaWduYWwtYmFzZWQgc3RhdGUgbWFuYWdlbWVudFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAqICAgPHMtcGluLWNvZGUtZmllbGRcbiAqICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb2RlXCJcbiAqICAgICBbbGVuZ3RoXT1cIjZcIlxuICogICAgIFthbHBoYW51bWVyaWNdPVwiZmFsc2VcIlxuICogICAgIFtpbnZhbGlkXT1cIihmb3JtLmdldCgnY29kZScpPy5pbnZhbGlkICYmIGZvcm0uZ2V0KCdjb2RlJyk/LmRpcnR5KSB8fCBmYWxzZVwiXG4gKiAgICAgaGVscFRleHQ9XCJFbnRlciB5b3VyIDYtZGlnaXQgY29kZVwiXG4gKiAgICAgKGNvZGVGaWxsZWQpPVwib25Db2RlRmlsbGVkKCRldmVudClcIj5cbiAqICAgPC9zLXBpbi1jb2RlLWZpZWxkPlxuICogPC9mb3JtPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAqICAgY29kZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzLXBpbi1jb2RlLWZpZWxkJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcGluLWNvZGUtZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUGluQ29kZUZpZWxkQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIFBpbkNvZGVGaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBMQVNUX0lOREVYX09GRlNFVCA9IDE7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRU1QVFlfVkFMVUUgPSAnJztcblxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbnB1dCBmaWVsZHMgKFBJTiBjb2RlIGxlbmd0aCkuXG4gICAgICogTXVzdCBiZSBhdCBsZWFzdCAxLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgNlxuICAgICAqL1xuICAgIHB1YmxpYyBsZW5ndGggPSBpbnB1dCg2KTtcblxuICAgIC8qKlxuICAgICAqIEFsbG93cyBhbHBoYW51bWVyaWMgYW5kIHNwZWNpYWwgY2hhcmFjdGVycyBpbnB1dC5cbiAgICAgKiBXaGVuIGZhbHNlLCBvbmx5IG51bWVyaWMgaW5wdXQgKDAtOSkgaXMgYWNjZXB0ZWQuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIHB1YmxpYyBhbHBoYW51bWVyaWMgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKipcbiAgICAgKiBIZWxwIHRleHQgZGlzcGxheWVkIGJlbG93IHRoZSBpbnB1dCBmaWVsZHMuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAqL1xuICAgIHB1YmxpYyBoZWxwVGV4dCA9IGlucHV0KCcnKTtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHRoZSBlcnJvciBzdGF0ZSB2aXN1YWxpemF0aW9uIG9mIHRoZSBjb21wb25lbnQuXG4gICAgICogV2hlbiB0cnVlLCBkaXNwbGF5cyByZWQgYm9yZGVyIG9uIGlucHV0IGZpZWxkcy5cbiAgICAgKiBUeXBpY2FsbHkgYm91bmQgdG8gRm9ybUNvbnRyb2wncyBpbnZhbGlkIGFuZCBkaXJ0eSBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIFtpbnZhbGlkXT1cIihjb250cm9sPy5pbnZhbGlkICYmIGNvbnRyb2w/LmRpcnR5KSB8fCBmYWxzZVwiXG4gICAgICogYGBgXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52YWxpZCA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqIFR3by13YXkgYmluZGluZyBmb3IgdGhlIGRpc2FibGVkIHN0YXRlIG9mIHRoZSBjb21wb25lbnQuXG4gICAgICogRGlzYWJsZXMgYWxsIGlucHV0IGZpZWxkcyBhbmQgcHJldmVudHMgdXNlciBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgcHVibGljIGRpc2FibGVkID0gbW9kZWwoZmFsc2UpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGFsbCBQSU4gY29kZSBmaWVsZHMgYXJlIGZpbGxlZC5cbiAgICAgKiBFbWl0cyB0aGUgY29tcGxldGUgUElOIGNvZGUgYXMgYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAoY29kZUZpbGxlZCk9XCJvbkNvZGVGaWxsZWQoJGV2ZW50KVwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNvZGVGaWxsZWQgPSBvdXRwdXQ8c3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICogU2lnbmFsIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIGVhY2ggaW5wdXQgZmllbGQuXG4gICAgICogQXJyYXkgbGVuZ3RoIG1hdGNoZXMgdGhlIGBsZW5ndGhgIGlucHV0IHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnB1dHMgPSBzaWduYWw8c3RyaW5nW10+KFtdKTtcblxuICAgIC8qKlxuICAgICAqIFNpZ25hbCB0cmFja2luZyB3aGV0aGVyIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gdG91Y2hlZCBieSB0aGUgdXNlci5cbiAgICAgKiBTZXQgdG8gdHJ1ZSB3aGVuIHRoZSBsYXN0IGlucHV0IGZpZWxkIGxvc2VzIGZvY3VzIChibHVyIGV2ZW50KS5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG91Y2hlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlZCBzaWduYWwgaW5kaWNhdGluZyB3aGV0aGVyIGFsbCBQSU4gY29kZSBmaWVsZHMgYXJlIGZpbGxlZC5cbiAgICAgKiBUcnVlIG9ubHkgd2hlbiBldmVyeSBmaWVsZCBjb250YWlucyBhIG5vbi1lbXB0eSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNDb21wbGV0ZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaW5wdXRzKCkuZXZlcnkoKGlucHV0KSA9PiBpbnB1dCAhPT0gJycpKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVkIHNpZ25hbCBjb250YWluaW5nIHRoZSBjb21wbGV0ZSBQSU4gY29kZSBhcyBhIGpvaW5lZCBzdHJpbmcuXG4gICAgICogUmV0dXJucyBlbXB0eSBzdHJpbmcgaWYgbm8gaW5wdXRzIGFyZSBmaWxsZWQuXG4gICAgICovXG4gICAgcHVibGljIGN1cnJlbnRWYWx1ZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaW5wdXRzKCkuam9pbignJykpO1xuXG4gICAgLyoqXG4gICAgICogU2lnbmFsIHRyYWNraW5nIGlmIHRoZSBjb21wb25lbnQgaG9zdCBoYXMgdGhlIG5nLWludmFsaWQgY2xhc3MgZnJvbSBGb3JtQ29udHJvbCB2YWxpZGF0b3JzLlxuICAgICAqIFVwZGF0ZWQgcmVhY3RpdmVseSB3aGVuZXZlciB0aGUgaW52YWxpZCBzdGF0ZSBjaGFuZ2VzLlxuICAgICAqL1xuICAgIHByaXZhdGUgaGFzTmdJbnZhbGlkQ2xhc3MgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqXG4gICAgICogU2lnbmFsIHRyYWNraW5nIGlmIHRoZSBGb3JtQ29udHJvbCBpcyBkaXJ0eS5cbiAgICAgKiBVcGRhdGVkIHJlYWN0aXZlbHkgd2hlbmV2ZXIgdGhlIGRpcnR5IHN0YXRlIGNoYW5nZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc0NvbnRyb2xEaXJ0eSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlZCBzaWduYWwgaW5kaWNhdGluZyBpZiB0aGUgY29tcG9uZW50IHNob3VsZCBzaG93IGVycm9yIHN0YXRlLlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZjpcbiAgICAgKiAtIFRoZSBgaW52YWxpZGAgaW5wdXQgaXMgdHJ1ZSwgT1JcbiAgICAgKiAtIFRoZSBjb21wb25lbnQgaGFzIHRoZSBgbmctaW52YWxpZGAgY2xhc3MgQU5EIHRoZSBGb3JtQ29udHJvbCBpcyBkaXJ0eSAodG91Y2hlZC9tb2RpZmllZClcbiAgICAgKiBUaGlzIGVuc3VyZXMgZXJyb3JzIGFyZSBvbmx5IHNob3duIHRvIHRoZSB1c2VyIGFmdGVyIHRoZXkndmUgaW50ZXJhY3RlZCB3aXRoIHRoZSBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzRXJyb3IgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgICB0aGlzLmludmFsaWQoKSB8fCAodGhpcy5oYXNOZ0ludmFsaWRDbGFzcygpICYmIHRoaXMuaXNDb250cm9sRGlydHkoKSlcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICogVmlld0NoaWxkcmVuIHJlZmVyZW5jZSB0byBhbGwgaW5wdXQgRE9NIGVsZW1lbnRzLlxuICAgICAqIFVzZWQgZm9yIERPTSBtYW5pcHVsYXRpb24gKGZvY3VzLCBzZWxlY3Rpb24pLlxuICAgICAqL1xuICAgIHB1YmxpYyBwaW5JbnB1dHMgPSB2aWV3Q2hpbGRyZW48RWxlbWVudFJlZj4oJ3BpbklucHV0Jyk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGVmZmVjdChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdMZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xuICAgICAgICAgICAgICAgIGlmIChuZXdMZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignUElOIGNvZGUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgMScpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlucHV0cygpLmxlbmd0aCAhPT0gbmV3TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRzLnNldChBcnJheS5mcm9tKHsgbGVuZ3RoOiBuZXdMZW5ndGggfSwgKCkgPT4gJycpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIE1vbml0b3IgbmctaW52YWxpZCBhbmQgbmctZGlydHkgY2xhc3NlcyBvbiB0aGUgaG9zdCBlbGVtZW50IGZvciByZWFjdGl2ZSBlcnJvciBzdGF0ZVxuICAgICAgICBlZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQWNjZXNzIGlucHV0cyB0byBjcmVhdGUgZGVwZW5kZW5jeSBvbiBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dHMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmludmFsaWQoKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBVc2Ugc2V0VGltZW91dCB0byBkZWZlciB0aGUgY2hlY2sgdG8gbmV4dCB0aWNrIHRvIGVuc3VyZSBBbmd1bGFyIGhhcyB1cGRhdGVkIERPTSBjbGFzc2VzXG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBob3N0RWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNOZ0ludmFsaWQgPSBob3N0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ25nLWludmFsaWQnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNEaXJ0eSA9IGhvc3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbmctZGlydHknKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzTmdJbnZhbGlkQ2xhc3Muc2V0KGhhc05nSW52YWxpZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDb250cm9sRGlydHkuc2V0KGlzRGlydHkpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2xlYW51cCB0aW1lb3V0IG9uIGNvbXBvbmVudCBkZXN0cm95XG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGlucHV0IGV2ZW50IG9uIFBJTiBjb2RlIGZpZWxkcy5cbiAgICAgKiBWYWxpZGF0ZXMgY2hhcmFjdGVyIGlucHV0LCBwcmV2ZW50cyBtdWx0aXBsZSBjaGFyYWN0ZXJzIHBlciBmaWVsZCxcbiAgICAgKiBhdXRvLWFkdmFuY2VzIHRvIG5leHQgZmllbGQgd2hlbiBjaGFyYWN0ZXIgaXMgZW50ZXJlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbnB1dCBmaWVsZCBpbmRleCAoMC1iYXNlZClcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgaW5wdXQgZXZlbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgb25JbnB1dChpbmRleDogbnVtYmVyLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRhcmdldC52YWx1ZTtcblxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMSB8fCAodmFsdWUgJiYgIXRoaXMuaXNWYWxpZENoYXJhY3Rlcih2YWx1ZSkpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFySW5wdXQodGFyZ2V0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0SW5wdXRBdEluZGV4KGluZGV4LCB2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHZhbHVlICYmIGluZGV4IDwgdGhpcy5sZW5ndGgoKSAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNBbmRTZWxlY3RJbnB1dChpbmRleCArIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNDb21wbGV0ZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmNvZGVGaWxsZWQuZW1pdCh0aGlzLmN1cnJlbnRWYWx1ZSgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMga2V5Ym9hcmQgZXZlbnRzIG9uIFBJTiBjb2RlIGZpZWxkcy5cbiAgICAgKiBTdXBwb3J0cyBhcnJvdyBuYXZpZ2F0aW9uIChsZWZ0L3JpZ2h0KSBhbmQgYmFja3NwYWNlIGtleS5cbiAgICAgKlxuICAgICAqIEtleWJvYXJkIGJlaGF2aW9yOlxuICAgICAqIC0gQXJyb3dSaWdodDogTW92ZSBmb2N1cyB0byBuZXh0IGZpZWxkXG4gICAgICogLSBBcnJvd0xlZnQ6IE1vdmUgZm9jdXMgdG8gcHJldmlvdXMgZmllbGRcbiAgICAgKiAtIEJhY2tzcGFjZTogQ2xlYXIgY3VycmVudCBvciBwcmV2aW91cyBmaWVsZCBhbmQgYWRqdXN0IGZvY3VzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5wdXQgZmllbGQgaW5kZXggKDAtYmFzZWQpXG4gICAgICogQHBhcmFtIGV2ZW50IC0gVGhlIGtleWJvYXJkIGV2ZW50XG4gICAgICovXG4gICAgcHVibGljIG9uS2V5RG93bihpbmRleDogbnVtYmVyLCBldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCgpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5ID0gZXZlbnQua2V5O1xuXG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCB0aGlzLmxlbmd0aCgpIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzQW5kU2VsZWN0SW5wdXQoaW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c0FuZFNlbGVjdElucHV0KGluZGV4IC0gMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQmFja3NwYWNlJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQmFja3NwYWNlKGluZGV4KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgcGFzdGUgKGNsaXBib2FyZCkgZXZlbnRzIG9uIFBJTiBjb2RlIGZpZWxkcy5cbiAgICAgKiBFeHRyYWN0cyB2YWxpZCBjaGFyYWN0ZXJzIGZyb20gcGFzdGVkIGNvbnRlbnQsIGZpbHRlcnMgYnkgY2hhcmFjdGVyIHR5cGUsXG4gICAgICogYW5kIGF1dG9tYXRpY2FsbHkgdHJ1bmNhdGVzIHRvIG1hdGNoIGZpZWxkIGxlbmd0aC5cbiAgICAgKlxuICAgICAqIEJlaGF2aW9yOlxuICAgICAqIC0gRmlsdGVycyBjaGFyYWN0ZXJzIGJhc2VkIG9uIGBhbHBoYW51bWVyaWNgIHNldHRpbmdcbiAgICAgKiAtIFRydW5jYXRlcyB0byBtYXhpbXVtIGZpZWxkIGNvdW50XG4gICAgICogLSBGaWxscyBhdmFpbGFibGUgZmllbGRzIHdpdGggcGFzdGVkIGNvbnRlbnRcbiAgICAgKiAtIEVtaXRzIGNvZGVGaWxsZWQgZXZlbnQgaWYgYWxsIGZpZWxkcyBhcmUgZmlsbGVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgY2xpcGJvYXJkIGV2ZW50XG4gICAgICovXG4gICAgcHVibGljIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGNvbnN0IHZhbGlkQ2hhcnMgPSB0aGlzLmV4dHJhY3RWYWxpZENoYXJhY3RlcnNGcm9tUGFzdGUoZXZlbnQpO1xuXG4gICAgICAgIGlmICh2YWxpZENoYXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsbGVkSW5wdXRzID0gW1xuICAgICAgICAgICAgLi4udmFsaWRDaGFycyxcbiAgICAgICAgICAgIC4uLkFycmF5KHRoaXMubGVuZ3RoKCkgLSB2YWxpZENoYXJzLmxlbmd0aCkuZmlsbCgnJyksXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5pbnB1dHMuc2V0KGZpbGxlZElucHV0cyk7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUoKTtcblxuICAgICAgICAvLyBGb2N1cyBvbiB0aGUgZmlyc3QgZW1wdHkgaW5wdXQgb3IgdGhlIGxhc3QgZmlsbGVkIGlucHV0IGlmIGFsbCBhcmUgZmlsbGVkXG4gICAgICAgIGNvbnN0IGZpcnN0RW1wdHlJbmRleCA9IHZhbGlkQ2hhcnMubGVuZ3RoIDwgdGhpcy5sZW5ndGgoKSA/IHZhbGlkQ2hhcnMubGVuZ3RoIDogdmFsaWRDaGFycy5sZW5ndGggLSAxO1xuICAgICAgICB0aGlzLmZvY3VzQW5kU2VsZWN0SW5wdXQoZmlyc3RFbXB0eUluZGV4KTtcblxuICAgICAgICBpZiAodGhpcy5pc0NvbXBsZXRlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZUZpbGxlZC5lbWl0KHRoaXMuY3VycmVudFZhbHVlKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBmb2N1cyBldmVudCBvbiBQSU4gY29kZSBmaWVsZHMuXG4gICAgICogU2VsZWN0cyBhbGwgdGV4dCBpbiB0aGUgaW5wdXQgZmllbGQgd2hlbiBmb2N1c2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGlucHV0IGZpZWxkIGluZGV4ICgwLWJhc2VkKVxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZvY3VzKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLnBpbklucHV0cygpW2luZGV4XTtcbiAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgICBpbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBibHVyIGV2ZW50IG9uIFBJTiBjb2RlIGZpZWxkcy5cbiAgICAgKiBNYXJrcyB0aGUgY29tcG9uZW50IGFzIHRvdWNoZWQgd2hlbiB0aGUgbGFzdCBpbnB1dCBmaWVsZCBsb3NlcyBmb2N1cy5cbiAgICAgKiBBbHNvIG5vdGlmaWVzIHRoZSByZWdpc3RlcmVkIG9uVG91Y2hlZCBjYWxsYmFjayBmb3IgRm9ybUNvbnRyb2wgaW50ZWdyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5wdXQgZmllbGQgaW5kZXggKDAtYmFzZWQpXG4gICAgICovXG4gICAgcHVibGljIG9uQmx1cihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIC8vIE9ubHkgbWFyayBhcyB0b3VjaGVkIHdoZW4gdGhlIExBU1QgaW5wdXQgbG9zZXMgZm9jdXNcbiAgICAgICAgaWYgKGluZGV4ID09PSB0aGlzLmxlbmd0aCgpIC0gUGluQ29kZUZpZWxkQ29tcG9uZW50LkxBU1RfSU5ERVhfT0ZGU0VUKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoZWQuc2V0KHRydWUpO1xuICAgICAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgaW5wdXQgdmFsdWUgYXQgc3BlY2lmaWVkIGluZGV4IGFuZCBhZGp1c3RzIGZvY3VzIGFjY29yZGluZ2x5LlxuICAgICAqIElmIGN1cnJlbnQgZmllbGQgaXMgZW1wdHksIG1vdmVzIHRvIHByZXZpb3VzIGZpZWxkIGFuZCBjbGVhcnMgaXQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbnB1dCBmaWVsZCBpbmRleCAoMC1iYXNlZClcbiAgICAgKi9cbiAgICBwcml2YXRlIGhhbmRsZUJhY2tzcGFjZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbnB1dHMgPSB0aGlzLmlucHV0cygpO1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgY3VycmVudCBpbnB1dCBoYXMgdmFsdWUsIGNsZWFyIGl0XG4gICAgICAgIGlmIChjdXJyZW50SW5wdXRzW2luZGV4XSkge1xuICAgICAgICAgICAgdGhpcy5zZXRJbnB1dEF0SW5kZXgoaW5kZXgsIFBpbkNvZGVGaWVsZENvbXBvbmVudC5FTVBUWV9WQUxVRSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2UsIGNsZWFyIHByZXZpb3VzIGlucHV0IGFuZCBmb2N1cyBpdFxuICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldElucHV0QXRJbmRleChpbmRleCAtIDEsIFBpbkNvZGVGaWVsZENvbXBvbmVudC5FTVBUWV9WQUxVRSk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQW5kU2VsZWN0SW5wdXQoaW5kZXggLSAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIGF0IGEgc3BlY2lmaWMgaW5wdXQgZmllbGQgaW5kZXggYW5kIHVwZGF0ZXMgdGhlIGZvcm0gdmFsdWUuXG4gICAgICogVXBkYXRlcyB0aGUgc2lnbmFsIGFuZCB0cmlnZ2VycyB0aGUgY2hhbmdlIGRldGVjdGlvbiB2aWEgb25DaGFuZ2UgY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbnB1dCBmaWVsZCBpbmRleCAoMC1iYXNlZClcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0IGluIHRoZSBmaWVsZFxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0SW5wdXRBdEluZGV4KGluZGV4OiBudW1iZXIsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudElucHV0cyA9IHRoaXMuaW5wdXRzKCk7XG4gICAgICAgIGN1cnJlbnRJbnB1dHNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgIHRoaXMuaW5wdXRzLnNldChbLi4uY3VycmVudElucHV0c10pO1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXNlcyBvbiBhbmQgc2VsZWN0cyB0ZXh0IGluIHRoZSBpbnB1dCBmaWVsZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICAgICAqIFVzZXMgcXVldWVNaWNyb3Rhc2sgdG8gZW5zdXJlIERPTSBpcyB1cGRhdGVkIGJlZm9yZSBmb2N1c2luZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGlucHV0IGZpZWxkIGluZGV4ICgwLWJhc2VkKVxuICAgICAqL1xuICAgIHByaXZhdGUgZm9jdXNBbmRTZWxlY3RJbnB1dChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5waW5JbnB1dHMoKVtpbmRleF07XG4gICAgICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgaW5wdXQubmF0aXZlRWxlbWVudC5zZWxlY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSB2YWx1ZSBvZiBhbiBpbnB1dCBlbGVtZW50LlxuICAgICAqIFVzZWQgZm9yIGlucHV0IHZhbGlkYXRpb24gdG8gcmVqZWN0IGludmFsaWQgY2hhcmFjdGVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHRhcmdldCAtIFRoZSBIVE1MIGlucHV0IGVsZW1lbnQgdG8gY2xlYXJcbiAgICAgKi9cbiAgICBwcml2YXRlIGNsZWFySW5wdXQodGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIHRhcmdldC52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHZhbGlkIGNoYXJhY3RlcnMgZnJvbSBwYXN0ZWQgY29udGVudC5cbiAgICAgKiBGaWx0ZXJzIGJhc2VkIG9uIGFscGhhbnVtZXJpYyBzZXR0aW5nIGFuZCBsaW1pdHMgdG8gY29tcG9uZW50J3MgbGVuZ3RoLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgY2xpcGJvYXJkIGV2ZW50XG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgdmFsaWQgY2hhcmFjdGVycyBmcm9tIHRoZSBwYXN0ZWQgY29udGVudFxuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdFZhbGlkQ2hhcmFjdGVyc0Zyb21QYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSAoZXZlbnQuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YSgndGV4dCcpIHx8ICcnKS50cmltKCk7XG4gICAgICAgIHJldHVybiBwYXN0ZWRUZXh0XG4gICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAuZmlsdGVyKChjaGFyKSA9PiB0aGlzLmlzVmFsaWRDaGFyYWN0ZXIoY2hhcikpXG4gICAgICAgICAgICAuc2xpY2UoMCwgdGhpcy5sZW5ndGgoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIGlmIGEgY2hhcmFjdGVyIGlzIGFjY2VwdGFibGUgYmFzZWQgb24gY29tcG9uZW50IGNvbmZpZ3VyYXRpb24uXG4gICAgICogRm9yIG51bWVyaWMgbW9kZSwgYWNjZXB0cyBvbmx5IGRpZ2l0cyAwLTkuXG4gICAgICogRm9yIGFscGhhbnVtZXJpYyBtb2RlLCBhY2NlcHRzIGFueSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBjaGFyIC0gVGhlIGNoYXJhY3RlciB0byB2YWxpZGF0ZVxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgY2hhcmFjdGVyIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGlzVmFsaWRDaGFyYWN0ZXIoY2hhcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmFscGhhbnVtZXJpYygpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hhci50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gL15bMC05XSQvLnRlc3QoY2hhcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgZm9ybSB2YWx1ZSBieSBjYWxsaW5nIHRoZSBvbkNoYW5nZSBjYWxsYmFjayByZWdpc3RlcmVkIGJ5IEZvcm1Db250cm9sLlxuICAgICAqIFRoaXMgZW5zdXJlcyB0aGUgcmVhY3RpdmUgZm9ybSBzdGF5cyBzeW5jaHJvbml6ZWQgd2l0aCBjb21wb25lbnQgc3RhdGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlVmFsdWUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5jdXJyZW50VmFsdWUoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2UuXG4gICAgICogQ2FsbGVkIGJ5IHRoZSBGb3JtQ29udHJvbCB0byB3cml0ZSBhIHZhbHVlIHRvIHRoZSBjb21wb25lbnQuXG4gICAgICogT25seSBhY2NlcHRzIHN0cmluZyB2YWx1ZXMgd2l0aCBsZW5ndGggbWF0Y2hpbmcgdGhlIGNvbXBvbmVudCdzIGxlbmd0aCBzZXR0aW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHdyaXRlICh0eXBpY2FsbHkgZnJvbSB0aGUgRm9ybUNvbnRyb2wpXG4gICAgICovXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZ1ZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChzdHJpbmdWYWx1ZS5sZW5ndGggPT09IHRoaXMubGVuZ3RoKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0cy5zZXQoc3RyaW5nVmFsdWUuc3BsaXQoJycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlLlxuICAgICAqIENhbGxlZCBieSB0aGUgRm9ybUNvbnRyb2wgd2hlbiB2YWx1ZSBjaGFuZ2VzLlxuICAgICAqIFJlZ2lzdGVycyB0aGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCB2YWx1ZSBjaGFuZ2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZuIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gaW52b2tlIHdoZW4gY29tcG9uZW50IHZhbHVlIGNoYW5nZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlLlxuICAgICAqIENhbGxlZCBieSB0aGUgRm9ybUNvbnRyb2wgdG8gcmVnaXN0ZXIgdGhlIHRvdWNoZWQgY2FsbGJhY2suXG4gICAgICogVGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiB0aGUgbGFzdCBpbnB1dCBmaWVsZCBsb3NlcyBmb2N1cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmbiAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGludm9rZSB3aGVuIGNvbXBvbmVudCBpcyB0b3VjaGVkXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2UuXG4gICAgICogQ2FsbGVkIGJ5IHRoZSBGb3JtQ29udHJvbCB0byBzZXQgdGhlIGRpc2FibGVkIHN0YXRlIG9mIHRoZSBjb21wb25lbnQuXG4gICAgICogVXBkYXRlcyB0aGUgZGlzYWJsZWQgbW9kZWwgdG8gcmVmbGVjdCB0aGUgZm9ybSdzIGRpc2FibGVkIHN0YXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlzRGlzYWJsZWQgLSBXaGV0aGVyIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIGRpc2FibGVkXG4gICAgICovXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkLnNldChpc0Rpc2FibGVkKTtcbiAgICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJnYXAteHNtYWxsIGZsZXggZmxleC1jb2xcIj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZmxleCBnYXAtMlwiXG4gICAgICAgIHJvbGU9XCJncm91cFwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJQSU4gY29kZSBpbnB1dFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJoZWxwVGV4dCgpID8gJ3Bpbi1oZWxwLXRleHQnIDogbnVsbFwiXG4gICAgPlxuICAgICAgICBAZm9yIChpbnB1dCBvZiBpbnB1dHMoKTsgbGV0IGkgPSAkaW5kZXg7IHRyYWNrIGkpIHtcbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICNwaW5JbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImgtMTIgdy0xMiByb3VuZGVkLXhiaWcgYm9yZGVyIHRleHQtY2VudGVyIHRleHQtbGcgZm9udC1tZWRpdW0gdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICdib3JkZXItY3JpdGljYWxpdHktcmVkIGZvY3VzOnJpbmctY3JpdGljYWxpdHktcmVkJzogaGFzRXJyb3IoKSxcbiAgICAgICAgICAgICAgICAgICAgJ2JvcmRlci1ncmF5c2NhbGUtMzAgZm9jdXM6Ym9yZGVyLXByaW1hcnkgZm9jdXM6cmluZy1wcmltYXJ5JzogIWhhc0Vycm9yKCksXG4gICAgICAgICAgICAgICAgICAgICdjdXJzb3Itbm90LWFsbG93ZWQgYmctZ3JheXNjYWxlLTEwIHRleHQtZ3JheXNjYWxlLTYwJzogZGlzYWJsZWQoKSxcbiAgICAgICAgICAgICAgICAgICAgJ2JnLWdyYXlzY2FsZS0wIHRleHQtZ3JheXNjYWxlLTEwMCBmb2N1czpvdXRsaW5lLW5vbmUnOiAhZGlzYWJsZWQoKSxcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaW5wdXRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwiMVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuaW5wdXRtb2RlXT1cImFscGhhbnVtZXJpYygpID8gJ3RleHQnIDogJ251bWVyaWMnXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidQSU4gY29kZSBjaGFyYWN0ZXIgJyArIChpICsgMSkgKyAnIG9mICcgKyBsZW5ndGgoKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJoZWxwVGV4dCgpID8gJ3Bpbi1oZWxwLXRleHQnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0KGksICRldmVudClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bihpLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAocGFzdGUpPVwib25QYXN0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cyhpKVwiXG4gICAgICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKGkpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIEBpZiAoaGVscFRleHQoKSkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBpZD1cInBpbi1oZWxwLXRleHRcIlxuICAgICAgICAgICAgY2xhc3M9XCJtdC1zbWFsbCB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTYwXCJcbiAgICAgICAgPlxuICAgICAgICAgICAge3sgaGVscFRleHQoKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICB9XG48L2Rpdj5cblxuIl19
@@ -0,0 +1,16 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { PinCodeFieldComponent } from './pin-code-field/pin-code-field.component';
3
+ import * as i0 from "@angular/core";
4
+ export class PinCodeFieldModule {
5
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PinCodeFieldModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
6
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: PinCodeFieldModule, imports: [PinCodeFieldComponent], exports: [PinCodeFieldComponent] });
7
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PinCodeFieldModule, imports: [PinCodeFieldComponent] });
8
+ }
9
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PinCodeFieldModule, decorators: [{
10
+ type: NgModule,
11
+ args: [{
12
+ imports: [PinCodeFieldComponent],
13
+ exports: [PinCodeFieldComponent],
14
+ }]
15
+ }] });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGluLWNvZGUtZmllbGQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3Bpbi1jb2RlLWZpZWxkL3NyYy9saWIvcGluLWNvZGUtZmllbGQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7O0FBTWxGLE1BQU0sT0FBTyxrQkFBa0I7d0dBQWxCLGtCQUFrQjt5R0FBbEIsa0JBQWtCLFlBSGpCLHFCQUFxQixhQUNyQixxQkFBcUI7eUdBRXRCLGtCQUFrQixZQUhqQixxQkFBcUI7OzRGQUd0QixrQkFBa0I7a0JBSjlCLFFBQVE7bUJBQUM7b0JBQ04sT0FBTyxFQUFFLENBQUMscUJBQXFCLENBQUM7b0JBQ2hDLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDO2lCQUNuQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQaW5Db2RlRmllbGRDb21wb25lbnQgfSBmcm9tICcuL3Bpbi1jb2RlLWZpZWxkL3Bpbi1jb2RlLWZpZWxkLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gICAgaW1wb3J0czogW1BpbkNvZGVGaWVsZENvbXBvbmVudF0sXG4gICAgZXhwb3J0czogW1BpbkNvZGVGaWVsZENvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIFBpbkNvZGVGaWVsZE1vZHVsZSB7fVxuIl19
@@ -0,0 +1,3 @@
1
+ export * from './lib/pin-code-field.module';
2
+ export * from './lib/pin-code-field/pin-code-field.component';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9waW4tY29kZS1maWVsZC9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsK0NBQStDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9waW4tY29kZS1maWVsZC5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcGluLWNvZGUtZmllbGQvcGluLWNvZGUtZmllbGQuY29tcG9uZW50JztcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuaW9yc2lzdGVtYXMtYW5ndWxhci1jb21wb25lbnRzLXBpbi1jb2RlLWZpZWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL3Bpbi1jb2RlLWZpZWxkL3NyYy9zZW5pb3JzaXN0ZW1hcy1hbmd1bGFyLWNvbXBvbmVudHMtcGluLWNvZGUtZmllbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,44 @@
1
+ import { FormDynamicRegistry } from '@seniorsistemas/angular-components/form-dynamic';
2
+ import * as i0 from '@angular/core';
3
+ import { input, viewChild, Component } from '@angular/core';
4
+ import Quill from 'quill';
5
+
6
+ class EditorFieldComponent {
7
+ id = crypto.randomUUID();
8
+ field = input.required();
9
+ control = input.required();
10
+ editorContainer = viewChild.required('editorContainer');
11
+ quill;
12
+ ngAfterViewInit() {
13
+ this.quill = new Quill(this.editorContainer().nativeElement, {
14
+ theme: this.field().theme ?? 'snow',
15
+ });
16
+ this.quill.on('text-change', () => {
17
+ const html = this.editorContainer().nativeElement.querySelector('.ql-editor')?.innerHTML;
18
+ this.control().setValue(html, { emitEvent: true });
19
+ });
20
+ const initial = this.control().value;
21
+ if (initial) {
22
+ this.quill.root.innerHTML = initial;
23
+ }
24
+ }
25
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EditorFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
26
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.14", type: EditorFieldComponent, isStandalone: true, selector: "s-editor-field", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "editorContainer", first: true, predicate: ["editorContainer"], descendants: true, isSignal: true }], ngImport: i0, template: " <label [for]=\"id\">{{ field().label }}</label>\n\n<div [id]=\"id\" #editorContainer class=\"quill-container\"></div>\n", styles: [""] });
27
+ }
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EditorFieldComponent, decorators: [{
29
+ type: Component,
30
+ args: [{ selector: 's-editor-field', standalone: true, imports: [], template: " <label [for]=\"id\">{{ field().label }}</label>\n\n<div [id]=\"id\" #editorContainer class=\"quill-container\"></div>\n" }]
31
+ }] });
32
+
33
+ // import { FieldDynamicBase } from "../../schemas/field-dynamic";
34
+
35
+ // import { FormDynamicRegistry } from '@e-components/form-dynamic';
36
+ // import { FormDynamicRegistry } from '../../core/registry';
37
+ FormDynamicRegistry.registerField('editor', EditorFieldComponent);
38
+
39
+ /**
40
+ * Generated bundle index. Do not edit.
41
+ */
42
+
43
+ export { EditorFieldComponent };
44
+ //# sourceMappingURL=seniorsistemas-angular-components-form-dynamic-lib-optional-fields-editor.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seniorsistemas-angular-components-form-dynamic-lib-optional-fields-editor.mjs","sources":["../../projects/angular-components/form-dynamic/lib/optional-fields/editor/editor-field/editor-field.component.ts","../../projects/angular-components/form-dynamic/lib/optional-fields/editor/editor-field/editor-field.component.html","../../projects/angular-components/form-dynamic/lib/optional-fields/editor/editor-types.ts","../../projects/angular-components/form-dynamic/lib/optional-fields/editor/public-api.ts","../../projects/angular-components/form-dynamic/lib/optional-fields/editor/seniorsistemas-angular-components-form-dynamic-lib-optional-fields-editor.ts"],"sourcesContent":["import { AfterViewInit, Component, ElementRef, input, viewChild } from '@angular/core';\nimport { EditorField } from '../editor-types';\nimport { FormControl } from '@angular/forms';\nimport Quill from 'quill';\n\n@Component({\n selector: 's-editor-field',\n standalone: true,\n imports: [],\n templateUrl: './editor-field.component.html',\n styleUrl: './editor-field.component.css',\n})\nexport class EditorFieldComponent implements AfterViewInit {\n id = crypto.randomUUID();\n\n field = input.required<EditorField>();\n control = input.required<FormControl>();\n\n editorContainer = viewChild.required<ElementRef<HTMLElement>>('editorContainer');\n\n quill!: Quill;\n\n ngAfterViewInit() {\n this.quill = new Quill(this.editorContainer().nativeElement, {\n theme: this.field().theme ?? 'snow',\n });\n\n this.quill.on('text-change', () => {\n const html = this.editorContainer().nativeElement.querySelector('.ql-editor')?.innerHTML;\n this.control().setValue(html, { emitEvent: true });\n });\n\n const initial = this.control().value;\n if (initial) {\n this.quill.root.innerHTML = initial;\n }\n }\n}\n\n"," <label [for]=\"id\">{{ field().label }}</label>\n\n<div [id]=\"id\" #editorContainer class=\"quill-container\"></div>\n","// import { FieldDynamicBase } from \"../../schemas/field-dynamic\";\n\nimport { FieldDynamicBase } from '@seniorsistemas/angular-components/form-dynamic';\n\n// import { FieldDynamicBase } from \"@e-components/form-dynamic\";\nexport interface EditorField extends FieldDynamicBase {\n type: 'editor';\n key: string;\n label?: string;\n required?: boolean;\n\n theme?: 'snow' | 'bubble';\n}\n\n// import { FieldTypeMap } from \"./../../schemas/field-dynamic\";\n\ndeclare module '@seniorsistemas/angular-components/form-dynamic' {\n export interface FieldTypeMap {\n editor: EditorField;\n }\n}\n","// import { FormDynamicRegistry } from '@e-components/form-dynamic';\n// import { FormDynamicRegistry } from '../../core/registry';\nimport { FormDynamicRegistry } from '@seniorsistemas/angular-components/form-dynamic';\nimport { EditorFieldComponent } from '../editor/editor-field/editor-field.component';\n\nFormDynamicRegistry.registerField('editor', EditorFieldComponent);\n\nexport * from '../editor/editor-types';\nexport { EditorFieldComponent } from '../editor/editor-field/editor-field.component';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;MAYa,oBAAoB,CAAA;AAC7B,IAAA,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;AAEzB,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAe,CAAC;AACtC,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAe,CAAC;AAExC,IAAA,eAAe,GAAG,SAAS,CAAC,QAAQ,CAA0B,iBAAiB,CAAC,CAAC;AAEjF,IAAA,KAAK,CAAS;IAEd,eAAe,GAAA;AACX,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,aAAa,EAAE;YACzD,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,MAAM;AACtC,SAAA,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,MAAK;AAC9B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC;AACzF,YAAA,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,SAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;QACrC,IAAI,OAAO,EAAE;YACT,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;SACvC;KACJ;wGAxBQ,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,8cCZjC,0HAGA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDSa,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;+BACI,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EACP,EAAE,EAAA,QAAA,EAAA,0HAAA,EAAA,CAAA;;;AERf;;ACAA;AACA;AAIA,mBAAmB,CAAC,aAAa,CAAC,QAAQ,EAAE,oBAAoB,CAAC;;ACLjE;;AAEG;;;;"}