@skyux/forms 11.0.0-alpha.1 → 11.0.0-alpha.10

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 (106) hide show
  1. package/documentation.json +4262 -4681
  2. package/esm2022/index.mjs +14 -11
  3. package/esm2022/lib/modules/character-counter/character-counter-indicator.component.mjs +3 -3
  4. package/esm2022/lib/modules/character-counter/character-counter-screen-reader.pipe.mjs +3 -3
  5. package/esm2022/lib/modules/character-counter/character-counter.directive.mjs +3 -3
  6. package/esm2022/lib/modules/character-counter/character-counter.module.mjs +4 -4
  7. package/esm2022/lib/modules/checkbox/checkbox-group.component.mjs +6 -6
  8. package/esm2022/lib/modules/checkbox/checkbox-label-text-label.component.mjs +4 -4
  9. package/esm2022/lib/modules/checkbox/checkbox-label.component.mjs +3 -3
  10. package/esm2022/lib/modules/checkbox/checkbox.component.mjs +27 -34
  11. package/esm2022/lib/modules/checkbox/checkbox.module.mjs +4 -4
  12. package/esm2022/lib/modules/field-group/field-group.component.mjs +3 -3
  13. package/esm2022/lib/modules/field-group/field-group.module.mjs +4 -4
  14. package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment-change.mjs +2 -0
  15. package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment-click.mjs +2 -0
  16. package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment-join-ids.pipe.mjs +22 -0
  17. package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment-label.component.mjs +32 -0
  18. package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment.component.mjs +485 -0
  19. package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment.module.mjs +24 -0
  20. package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment.service.mjs +103 -0
  21. package/esm2022/lib/modules/file-attachment/file-attachments.module.mjs +12 -75
  22. package/esm2022/lib/modules/file-attachment/file-drop/file-drop-change.mjs +2 -0
  23. package/esm2022/lib/modules/file-attachment/file-drop/file-drop.component.mjs +336 -0
  24. package/esm2022/lib/modules/file-attachment/file-drop/file-drop.module.mjs +18 -0
  25. package/esm2022/lib/modules/file-attachment/file-drop/file-item.component.mjs +163 -0
  26. package/esm2022/lib/modules/file-attachment/file-drop/file-link.mjs +2 -0
  27. package/esm2022/lib/modules/file-attachment/shared/file-item-error-type.mjs +2 -0
  28. package/esm2022/lib/modules/file-attachment/shared/file-item.mjs +2 -0
  29. package/esm2022/lib/modules/file-attachment/shared/file-item.service.mjs +71 -0
  30. package/esm2022/lib/modules/file-attachment/shared/file-size.pipe.mjs +61 -0
  31. package/esm2022/lib/modules/file-attachment/shared/file-validate-function.mjs +2 -0
  32. package/esm2022/lib/modules/form-error/form-error.component.mjs +3 -3
  33. package/esm2022/lib/modules/form-error/form-error.module.mjs +4 -4
  34. package/esm2022/lib/modules/form-error/form-errors.component.mjs +5 -5
  35. package/esm2022/lib/modules/form-error/form-errors.module.mjs +4 -4
  36. package/esm2022/lib/modules/input-box/input-box-adapter.service.mjs +3 -3
  37. package/esm2022/lib/modules/input-box/input-box-control.directive.mjs +3 -3
  38. package/esm2022/lib/modules/input-box/input-box-hint-text.pipe.mjs +3 -3
  39. package/esm2022/lib/modules/input-box/input-box-host.service.mjs +7 -4
  40. package/esm2022/lib/modules/input-box/input-box.component.mjs +22 -26
  41. package/esm2022/lib/modules/input-box/input-box.module.mjs +4 -4
  42. package/esm2022/lib/modules/radio/radio-group-id.service.mjs +3 -3
  43. package/esm2022/lib/modules/radio/radio-group.component.mjs +30 -40
  44. package/esm2022/lib/modules/radio/radio-label.component.mjs +3 -3
  45. package/esm2022/lib/modules/radio/radio.component.mjs +23 -30
  46. package/esm2022/lib/modules/radio/radio.module.mjs +4 -4
  47. package/esm2022/lib/modules/required-state/required-state.directive.mjs +3 -3
  48. package/esm2022/lib/modules/selection-box/selection-box-adapter.service.mjs +3 -3
  49. package/esm2022/lib/modules/selection-box/selection-box-description.component.mjs +3 -3
  50. package/esm2022/lib/modules/selection-box/selection-box-grid.component.mjs +4 -4
  51. package/esm2022/lib/modules/selection-box/selection-box-header.component.mjs +3 -3
  52. package/esm2022/lib/modules/selection-box/selection-box.component.mjs +3 -3
  53. package/esm2022/lib/modules/selection-box/selection-box.module.mjs +4 -4
  54. package/esm2022/lib/modules/shared/form-field-label-text-required.directive.mjs +37 -0
  55. package/esm2022/lib/modules/shared/form-field-label-text-required.service.mjs +9 -7
  56. package/esm2022/lib/modules/shared/sky-forms-resources.module.mjs +7 -9
  57. package/esm2022/lib/modules/toggle-switch/toggle-switch-label.component.mjs +3 -3
  58. package/esm2022/lib/modules/toggle-switch/toggle-switch.component.mjs +16 -23
  59. package/esm2022/lib/modules/toggle-switch/toggle-switch.module.mjs +4 -4
  60. package/esm2022/testing/checkbox/checkbox-harness.mjs +5 -4
  61. package/fesm2022/skyux-forms-testing.mjs +4 -3
  62. package/fesm2022/skyux-forms-testing.mjs.map +1 -1
  63. package/fesm2022/skyux-forms.mjs +474 -454
  64. package/fesm2022/skyux-forms.mjs.map +1 -1
  65. package/index.d.ts +21 -18
  66. package/lib/modules/checkbox/checkbox.component.d.ts +6 -6
  67. package/lib/modules/file-attachment/{types → file-attachment}/file-attachment-change.d.ts +1 -1
  68. package/lib/modules/file-attachment/{types → file-attachment}/file-attachment-click.d.ts +1 -1
  69. package/lib/modules/file-attachment/file-attachment/file-attachment-join-ids.pipe.d.ts +11 -0
  70. package/lib/modules/file-attachment/{file-attachment-label.component.d.ts → file-attachment/file-attachment-label.component.d.ts} +7 -5
  71. package/lib/modules/file-attachment/{file-attachment.component.d.ts → file-attachment/file-attachment.component.d.ts} +24 -18
  72. package/lib/modules/file-attachment/file-attachment/file-attachment.module.d.ts +9 -0
  73. package/lib/modules/file-attachment/{file-attachment.service.d.ts → file-attachment/file-attachment.service.d.ts} +2 -2
  74. package/lib/modules/file-attachment/file-attachments.module.d.ts +6 -15
  75. package/lib/modules/file-attachment/{types → file-drop}/file-drop-change.d.ts +1 -1
  76. package/lib/modules/file-attachment/{file-drop.component.d.ts → file-drop/file-drop.component.d.ts} +12 -8
  77. package/lib/modules/file-attachment/file-drop/file-drop.module.d.ts +9 -0
  78. package/lib/modules/file-attachment/{file-item.component.d.ts → file-drop/file-item.component.d.ts} +3 -3
  79. package/lib/modules/file-attachment/{file-size.pipe.d.ts → shared/file-size.pipe.d.ts} +2 -3
  80. package/lib/modules/input-box/input-box-host.service.d.ts +1 -0
  81. package/lib/modules/input-box/input-box.component.d.ts +3 -3
  82. package/lib/modules/radio/radio-group.component.d.ts +9 -8
  83. package/lib/modules/radio/radio.component.d.ts +6 -6
  84. package/lib/modules/shared/form-field-label-text-required.directive.d.ts +14 -0
  85. package/lib/modules/shared/form-field-label-text-required.service.d.ts +2 -1
  86. package/lib/modules/toggle-switch/toggle-switch.component.d.ts +4 -5
  87. package/package.json +14 -14
  88. package/esm2022/lib/modules/file-attachment/file-attachment-label.component.mjs +0 -28
  89. package/esm2022/lib/modules/file-attachment/file-attachment.component.mjs +0 -479
  90. package/esm2022/lib/modules/file-attachment/file-attachment.service.mjs +0 -93
  91. package/esm2022/lib/modules/file-attachment/file-drop.component.mjs +0 -326
  92. package/esm2022/lib/modules/file-attachment/file-item-error-type.mjs +0 -2
  93. package/esm2022/lib/modules/file-attachment/file-item.component.mjs +0 -155
  94. package/esm2022/lib/modules/file-attachment/file-item.mjs +0 -2
  95. package/esm2022/lib/modules/file-attachment/file-item.service.mjs +0 -70
  96. package/esm2022/lib/modules/file-attachment/file-link.mjs +0 -2
  97. package/esm2022/lib/modules/file-attachment/file-size.pipe.mjs +0 -61
  98. package/esm2022/lib/modules/file-attachment/file-validate-function.mjs +0 -2
  99. package/esm2022/lib/modules/file-attachment/types/file-attachment-change.mjs +0 -2
  100. package/esm2022/lib/modules/file-attachment/types/file-attachment-click.mjs +0 -2
  101. package/esm2022/lib/modules/file-attachment/types/file-drop-change.mjs +0 -2
  102. /package/lib/modules/file-attachment/{file-link.d.ts → file-drop/file-link.d.ts} +0 -0
  103. /package/lib/modules/file-attachment/{file-item-error-type.d.ts → shared/file-item-error-type.d.ts} +0 -0
  104. /package/lib/modules/file-attachment/{file-item.d.ts → shared/file-item.d.ts} +0 -0
  105. /package/lib/modules/file-attachment/{file-item.service.d.ts → shared/file-item.service.d.ts} +0 -0
  106. /package/lib/modules/file-attachment/{file-validate-function.d.ts → shared/file-validate-function.d.ts} +0 -0
@@ -1,479 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, HostBinding, Input, Optional, Output, Self, ViewChild, booleanAttribute, inject, } from '@angular/core';
2
- import { SkyFormsUtility, SkyIdService, SkyLiveAnnouncerService, } from '@skyux/core';
3
- import { SkyLibResourcesService } from '@skyux/i18n';
4
- import { Subject } from 'rxjs';
5
- import { take, takeUntil } from 'rxjs/operators';
6
- import { SKY_FORM_ERRORS_ENABLED } from '../form-error/form-errors-enabled-token';
7
- import { SkyFormFieldLabelTextRequiredService } from '../shared/form-field-label-text-required.service';
8
- import { SkyFileAttachmentLabelComponent } from './file-attachment-label.component';
9
- import { SkyFileAttachmentService } from './file-attachment.service';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "./file-attachment.service";
12
- import * as i2 from "./file-item.service";
13
- import * as i3 from "@angular/forms";
14
- import * as i4 from "@skyux/theme";
15
- import * as i5 from "@angular/common";
16
- import * as i6 from "../form-error/form-error.component";
17
- import * as i7 from "../form-error/form-errors.component";
18
- import * as i8 from "@skyux/icon";
19
- import * as i9 from "@skyux/core";
20
- import * as i10 from "@skyux/help-inline";
21
- import * as i11 from "@skyux/i18n";
22
- import * as i12 from "./file-size.pipe";
23
- let uniqueId = 0;
24
- const MAX_FILE_SIZE_DEFAULT = 500000;
25
- const MIN_FILE_SIZE_DEFAULT = 0;
26
- /**
27
- * Provides an element to attach a single local file.
28
- */
29
- export class SkyFileAttachmentComponent {
30
- /**
31
- * Whether to disable the input on template-driven forms. Don't use this input on reactive forms because they may overwrite the input or leave the control out of sync.
32
- * To set the disabled state on reactive forms, use the `FormControl` instead.
33
- * @default false
34
- */
35
- set disabled(value) {
36
- const newDisabledState = SkyFormsUtility.coerceBooleanProperty(value);
37
- if (this.#_disabled !== newDisabledState) {
38
- this.#_disabled = newDisabledState;
39
- }
40
- }
41
- get disabled() {
42
- return this.#_disabled;
43
- }
44
- /**
45
- * The maximum size in bytes for valid files.
46
- * @default 500000
47
- */
48
- set maxFileSize(value) {
49
- this.#_maxFileSize = value ?? MAX_FILE_SIZE_DEFAULT;
50
- }
51
- get maxFileSize() {
52
- return this.#_maxFileSize;
53
- }
54
- /**
55
- * The minimum size in bytes for valid files.
56
- * @default 0
57
- */
58
- set minFileSize(value) {
59
- this.#_minFileSize = value ?? MIN_FILE_SIZE_DEFAULT;
60
- }
61
- get minFileSize() {
62
- return this.#_minFileSize;
63
- }
64
- set value(value) {
65
- // The null check is needed to address a bug in Angular 4.
66
- // writeValue is being called twice, first time with a phantom null value
67
- // See: https://github.com/angular/angular/issues/14988
68
- const isNewValue = value !== this.value && value !== null;
69
- if (isNewValue) {
70
- if (value) {
71
- this.isImage = this.#fileItemService.isImage(value);
72
- }
73
- else {
74
- this.isImage = false;
75
- }
76
- this.#setFileName(value);
77
- this.#_value = value;
78
- this.#onChange(value);
79
- this.#updateFileAttachmentButton();
80
- }
81
- }
82
- get value() {
83
- return this.#_value;
84
- }
85
- #enterEventTarget;
86
- #fileAttachmentId;
87
- #ngUnsubscribe;
88
- #_disabled;
89
- #_maxFileSize;
90
- #_minFileSize;
91
- #_value;
92
- #changeDetector;
93
- #fileAttachmentService;
94
- #fileItemService;
95
- #themeSvc;
96
- #idSvc;
97
- #liveAnnouncerSvc;
98
- #resourcesSvc;
99
- #labelTextRequired;
100
- constructor(changeDetector, fileAttachmentService, fileItemService, ngControl, themeSvc) {
101
- /**
102
- * Whether to hide `labelText` from view.
103
- */
104
- this.labelHidden = false;
105
- /**
106
- * Whether the single file attachment is stacked on another form component. When specified,
107
- * the appropriate vertical spacing is automatically added to the single file attachment.
108
- */
109
- this.stacked = false;
110
- /**
111
- * Fires when users add or remove files.
112
- */
113
- this.fileChange = new EventEmitter();
114
- /**
115
- * Fires when users select the file name link. Make sure to bind the event.
116
- * If you do not, the file name link will be a dead link.
117
- */
118
- this.fileClick = new EventEmitter();
119
- this.acceptedOver = false;
120
- this.hasLabelComponent = false;
121
- this.rejectedOver = false;
122
- /**
123
- * Whether the input is required for form validation.
124
- * When you set this property to `true`, the component adds `aria-required` and `required`
125
- * attributes to the input element so that forms display an invalid state until the input element
126
- * is complete.
127
- * For more information about the `aria-required` attribute, see the [WAI-ARIA definition](https://www.w3.org/TR/wai-aria/#aria-required).
128
- */
129
- this.required = false;
130
- this.fileName = '';
131
- this.showFileAttachmentButton = true;
132
- this.truncatedFileName = '';
133
- this.isImage = false;
134
- this.#fileAttachmentId = uniqueId++;
135
- this.#ngUnsubscribe = new Subject();
136
- this.#_disabled = false;
137
- this.#_maxFileSize = MAX_FILE_SIZE_DEFAULT;
138
- this.#_minFileSize = MIN_FILE_SIZE_DEFAULT;
139
- this.#idSvc = inject(SkyIdService);
140
- this.#liveAnnouncerSvc = inject(SkyLiveAnnouncerService);
141
- this.#resourcesSvc = inject(SkyLibResourcesService);
142
- this.#labelTextRequired = inject(SkyFormFieldLabelTextRequiredService, {
143
- optional: true,
144
- });
145
- this.errorId = this.#idSvc.generateId();
146
- // istanbul ignore next
147
- // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
148
- this.#onChange = (_) => {
149
- return;
150
- };
151
- // istanbul ignore next
152
- // eslint-disable-next-line @typescript-eslint/no-empty-function
153
- this.#onTouched = () => {
154
- return;
155
- };
156
- this.#changeDetector = changeDetector;
157
- this.#fileAttachmentService = fileAttachmentService;
158
- this.#fileItemService = fileItemService;
159
- this.ngControl = ngControl;
160
- this.#themeSvc = themeSvc;
161
- this.labelElementId = `sky-file-attachment-label-${this.#fileAttachmentId}`;
162
- this.fileDropDescriptionElementId = `sky-file-attachment-drop-description-${this.#fileAttachmentId}`;
163
- if (this.ngControl) {
164
- this.ngControl.valueAccessor = this;
165
- }
166
- }
167
- ngOnInit() {
168
- if (this.#themeSvc) {
169
- this.#themeSvc.settingsChange
170
- .pipe(takeUntil(this.#ngUnsubscribe))
171
- .subscribe((themeSettings) => {
172
- this.currentThemeName = themeSettings.currentSettings.theme.name;
173
- this.#updateFileAttachmentButton();
174
- });
175
- }
176
- if (this.#labelTextRequired && !this.labelText) {
177
- this.display = 'none';
178
- }
179
- this.#labelTextRequired?.validateLabelText(this.labelText);
180
- }
181
- ngAfterViewInit() {
182
- // This is needed to address a bug in Angular 7.
183
- // When a control value is set initially, its value is not represented on the view.
184
- // See: https://github.com/angular/angular/issues/13792
185
- // Of note is the parent check which allows us to determine if the form is reactive.
186
- // Without this check there is a changed before checked error
187
- /* istanbul ignore else */
188
- if (this.ngControl) {
189
- setTimeout(() => {
190
- this.ngControl.control.setValue(this.value, {
191
- emitEvent: false,
192
- });
193
- this.#changeDetector.markForCheck();
194
- });
195
- this.required =
196
- this.required || SkyFormsUtility.hasRequiredValidation(this.ngControl);
197
- }
198
- }
199
- ngAfterContentInit() {
200
- if (this.labelComponents) {
201
- this.hasLabelComponent = this.labelComponents.length > 0;
202
- this.#changeDetector.detectChanges();
203
- // Handles updating classes when label changes
204
- this.labelComponents.changes
205
- .pipe(takeUntil(this.#ngUnsubscribe))
206
- .subscribe((newLabelComponents) => {
207
- this.hasLabelComponent = newLabelComponents.length > 0;
208
- this.#changeDetector.markForCheck();
209
- });
210
- }
211
- }
212
- onDropClicked() {
213
- this.#onTouched();
214
- /* istanbul ignore else */
215
- if (this.inputEl) {
216
- this.inputEl.nativeElement.click();
217
- }
218
- }
219
- fileChangeEvent(fileChangeEvent) {
220
- this.#handleFiles(fileChangeEvent.target?.files);
221
- }
222
- fileDragEnter(dragEnterEvent) {
223
- // Save this target to know when the drag event leaves
224
- this.#enterEventTarget = dragEnterEvent.target;
225
- dragEnterEvent.stopPropagation();
226
- dragEnterEvent.preventDefault();
227
- }
228
- fileDragOver(dragOverEvent) {
229
- const transfer = dragOverEvent.dataTransfer;
230
- dragOverEvent.stopPropagation();
231
- dragOverEvent.preventDefault();
232
- if (transfer) {
233
- if (transfer.items) {
234
- const files = Array.from(transfer.items);
235
- for (const file of files) {
236
- if (file.type &&
237
- this.#fileAttachmentService.fileTypeRejected(file.type, this.acceptedTypes)) {
238
- this.rejectedOver = true;
239
- this.acceptedOver = false;
240
- return;
241
- }
242
- }
243
- if (files.length > 0 && !this.acceptedOver) {
244
- this.rejectedOver = false;
245
- this.acceptedOver = true;
246
- }
247
- }
248
- else if (transfer.files) {
249
- // If the browser does not support DataTransfer.items,
250
- // defer file-type checking to drop handler.
251
- // https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/items#Browser_compatibility
252
- this.rejectedOver = false;
253
- this.acceptedOver = true;
254
- }
255
- }
256
- }
257
- fileDrop(dropEvent) {
258
- dropEvent.stopPropagation();
259
- dropEvent.preventDefault();
260
- this.#enterEventTarget = undefined;
261
- this.rejectedOver = false;
262
- this.acceptedOver = false;
263
- if (dropEvent.dataTransfer && dropEvent.dataTransfer.files) {
264
- if (dropEvent.dataTransfer.files.length > 1) {
265
- return;
266
- }
267
- if (this.#fileAttachmentService.hasDirectory(dropEvent.dataTransfer.files)) {
268
- return;
269
- }
270
- this.#handleFiles(dropEvent.dataTransfer.files);
271
- }
272
- }
273
- fileDragLeave(dragLeaveEvent) {
274
- if (this.#enterEventTarget === dragLeaveEvent.target) {
275
- this.rejectedOver = false;
276
- this.acceptedOver = false;
277
- }
278
- }
279
- deleteFileAttachment() {
280
- const fileName = this.value?.file.name;
281
- this.value = undefined;
282
- this.#emitFileChangeEvent(this.value);
283
- /* istanbul ignore else: safety check */
284
- if (fileName) {
285
- this.#announceState('skyux_file_attachment_file_upload_file_removed', fileName);
286
- }
287
- this.#changeDetector.markForCheck();
288
- }
289
- ngOnDestroy() {
290
- this.fileChange.complete();
291
- this.#ngUnsubscribe.next();
292
- this.#ngUnsubscribe.complete();
293
- }
294
- registerOnChange(fn) {
295
- this.#onChange = fn;
296
- }
297
- registerOnTouched(fn) {
298
- this.#onTouched = fn;
299
- }
300
- writeValue(value) {
301
- this.value = value;
302
- this.#changeDetector.markForCheck();
303
- }
304
- /**
305
- * @internal
306
- * Sets the disabled state of the control. Implemented as a part of ControlValueAccessor.
307
- * @param isDisabled Whether the control should be disabled.
308
- */
309
- setDisabledState(isDisabled) {
310
- this.disabled = isDisabled;
311
- this.#changeDetector.markForCheck();
312
- }
313
- emitClick() {
314
- /* istanbul ignore else */
315
- if (this.value) {
316
- this.fileClick.emit({
317
- file: this.value,
318
- });
319
- }
320
- }
321
- #announceState(resourceString, ...args) {
322
- this.#resourcesSvc
323
- .getString(resourceString, ...args)
324
- .pipe(take(1))
325
- .subscribe((internationalizedString) => {
326
- this.#liveAnnouncerSvc.announce(internationalizedString);
327
- });
328
- }
329
- #emitFileChangeEvent(currentFile) {
330
- if (currentFile && !currentFile.errorType) {
331
- this.writeValue(currentFile);
332
- this.fileErrorName = undefined;
333
- this.fileErrorParam = undefined;
334
- this.fileErrorValidation = undefined;
335
- }
336
- else {
337
- this.writeValue(undefined);
338
- // Makes sure value accessor is marked as dirty even if current file is undefined
339
- this.#onChange(undefined);
340
- this.fileErrorValidation = { fileError: true };
341
- this.fileErrorName = currentFile?.errorType;
342
- this.fileErrorParam = currentFile?.errorParam;
343
- }
344
- this.fileChange.emit({
345
- file: currentFile,
346
- });
347
- /* istanbul ignore else */
348
- if (this.inputEl) {
349
- this.inputEl.nativeElement.value = '';
350
- }
351
- }
352
- #loadFile(file) {
353
- if (file.file) {
354
- const reader = new FileReader();
355
- reader.addEventListener('load', (event) => {
356
- const previousFileName = this.value?.file.name;
357
- file.url = event.target.result;
358
- this.#emitFileChangeEvent(file);
359
- if (previousFileName) {
360
- this.#announceState('skyux_file_attachment_file_upload_file_replaced', previousFileName, file.file.name);
361
- }
362
- else {
363
- this.#announceState('skyux_file_attachment_file_upload_file_added', file.file.name);
364
- }
365
- });
366
- reader.addEventListener('error', () => {
367
- this.#emitFileChangeEvent(file);
368
- });
369
- reader.addEventListener('abort', () => {
370
- this.#emitFileChangeEvent(file);
371
- });
372
- reader.readAsDataURL(file.file);
373
- }
374
- }
375
- #handleFiles(files) {
376
- if (files) {
377
- const processedFiles = this.#fileAttachmentService.checkFiles(files, this.minFileSize, this.maxFileSize, this.acceptedTypes, this.validateFn);
378
- for (const file of processedFiles) {
379
- if (file.errorType) {
380
- this.#emitFileChangeEvent(file);
381
- }
382
- else {
383
- this.#loadFile(file);
384
- }
385
- }
386
- }
387
- }
388
- #setFileName(file) {
389
- if (file) {
390
- const dropName = this.#fileItemService.isFile(file) && file.file.name
391
- ? file.file.name
392
- : file.url;
393
- this.fileName = dropName;
394
- if (dropName.length > 26) {
395
- this.truncatedFileName = dropName.slice(0, 26) + '...';
396
- }
397
- else {
398
- this.truncatedFileName = dropName;
399
- }
400
- }
401
- else {
402
- this.fileName = '';
403
- this.truncatedFileName = '';
404
- }
405
- }
406
- #updateFileAttachmentButton() {
407
- this.showFileAttachmentButton = !(this.value && this.currentThemeName === 'modern');
408
- this.#changeDetector.markForCheck();
409
- }
410
- // istanbul ignore next
411
- // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
412
- #onChange;
413
- // istanbul ignore next
414
- // eslint-disable-next-line @typescript-eslint/no-empty-function
415
- #onTouched;
416
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: SkyFileAttachmentComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SkyFileAttachmentService }, { token: i2.SkyFileItemService }, { token: i3.NgControl, optional: true, self: true }, { token: i4.SkyThemeService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
417
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.0.5", type: SkyFileAttachmentComponent, selector: "sky-file-attachment", inputs: { acceptedTypes: "acceptedTypes", disabled: "disabled", helpPopoverContent: "helpPopoverContent", helpPopoverTitle: "helpPopoverTitle", helpKey: "helpKey", labelText: "labelText", labelHidden: ["labelHidden", "labelHidden", booleanAttribute], hintText: "hintText", maxFileSize: "maxFileSize", minFileSize: "minFileSize", stacked: ["stacked", "stacked", booleanAttribute], validateFn: "validateFn", required: "required" }, outputs: { fileChange: "fileChange", fileClick: "fileClick" }, host: { properties: { "class.sky-margin-stacked-lg": "this.stacked", "style.display": "this.display" } }, providers: [
418
- SkyFileAttachmentService,
419
- { provide: SKY_FORM_ERRORS_ENABLED, useValue: true },
420
- ], queries: [{ propertyName: "labelComponents", predicate: SkyFileAttachmentLabelComponent }], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div class=\"sky-file-attachment-wrapper\">\n <div\n class=\"sky-file-attachment-label-wrapper\"\n [attr.id]=\"labelElementId\"\n [ngClass]=\"{\n 'sky-control-label-required': !labelText && required && hasLabelComponent,\n }\"\n >\n <ng-container *ngIf=\"labelText; else labelContent\">\n <span\n *ngIf=\"!labelHidden\"\n class=\"sky-control-label sky-margin-inline-xs\"\n [ngClass]=\"{\n 'sky-control-label-required': required,\n }\"\n >{{ labelText }}</span\n ><sky-help-inline\n *ngIf=\"helpPopoverContent || helpKey\"\n [labelText]=\"labelText\"\n [helpKey]=\"helpKey\"\n [popoverTitle]=\"helpPopoverTitle\"\n [popoverContent]=\"helpPopoverContent\"\n />\n </ng-container>\n <span\n class=\"sky-screen-reader-only\"\n *ngIf=\"required && (hasLabelComponent || labelText)\"\n >{{ 'skyux_file_attachment_required' | skyLibResources }}</span\n >\n </div>\n <div\n class=\"sky-file-attachment-upload sky-file-attachment sky-file-attachment-target\"\n [ngClass]=\"{\n 'sky-file-attachment-accept': acceptedOver,\n 'sky-file-attachment-reject': rejectedOver,\n }\"\n (dragenter)=\"fileDragEnter($event)\"\n (dragover)=\"fileDragOver($event)\"\n (dragleave)=\"fileDragLeave($event)\"\n (drop)=\"fileDrop($event)\"\n >\n <div\n aria-hidden=\"true\"\n class=\"sky-screen-reader-only\"\n role=\"tooltip\"\n [attr.id]=\"fileDropDescriptionElementId\"\n >\n {{ 'skyux_file_attachment_file_upload_drag_or_click' | skyLibResources }}\n </div>\n <input\n hidden\n tabindex=\"-1\"\n type=\"file\"\n [attr.accept]=\"acceptedTypes || null\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n (change)=\"fileChangeEvent($event)\"\n #fileInput\n />\n <ng-container *ngIf=\"showFileAttachmentButton\">\n <button\n *ngIf=\"showFileAttachmentButton\"\n class=\"sky-file-attachment-btn sky-btn sky-btn-default\"\n type=\"button\"\n skyId\n [attr.aria-describedby]=\"\n (hintText ? hintTextEl.id + ' ' : '') + fileDropDescriptionElementId\n \"\n [attr.aria-label]=\"\n value\n ? ('skyux_file_attachment_button_label_replace_file_label'\n | skyLibResources: fileName)\n : ('skyux_file_attachment_button_label_choose_file_label'\n | skyLibResources)\n \"\n [attr.aria-labelledby]=\"\n attachButton.id +\n ' ' +\n (labelText\n ? labelElementId\n : hasLabelComponent\n ? labelComponents?.get(0)?.labelContentId?.id\n : undefined)\n \"\n [disabled]=\"disabled\"\n (click)=\"onDropClicked()\"\n #attachButton=\"skyId\"\n >\n <sky-icon icon=\"folder-open-o\" />\n {{\n value\n ? ('skyux_file_attachment_button_label_replace_file'\n | skyLibResources)\n : ('skyux_file_attachment_button_label_choose_file'\n | skyLibResources)\n }}\n </button>\n </ng-container>\n <sky-icon\n *ngIf=\"value && !isImage && currentThemeName === 'modern'\"\n class=\"sky-file-attachment-icon sky-deemphasized\"\n icon=\"file-o\"\n size=\"2x\"\n />\n <span\n *ngIf=\"value || currentThemeName === 'default'\"\n class=\"sky-file-attachment-name\"\n >\n <a\n *ngIf=\"value; else noFile\"\n [attr.title]=\"fileName\"\n (click)=\"emitClick()\"\n >\n {{ truncatedFileName }}\n </a>\n </span>\n <ng-template #noFile>\n <span class=\"sky-file-attachment-none sky-deemphasized\">\n {{ 'skyux_file_attachment_label_no_file_chosen' | skyLibResources }}\n </span>\n </ng-template>\n <button\n *ngIf=\"value\"\n class=\"sky-btn sky-btn-borderless sky-file-attachment-delete\"\n skyId\n type=\"button\"\n [attr.aria-label]=\"\n 'skyux_file_attachment_file_item_remove' | skyLibResources: fileName\n \"\n [attr.aria-labelledby]=\"\n deleteButton.id +\n ' ' +\n (hasLabelComponent\n ? labelComponents?.get(0)?.labelContentId?.id\n : undefined)\n \"\n [disabled]=\"disabled\"\n [skyThemeClass]=\"{\n 'sky-btn-icon-borderless': 'modern',\n }\"\n (click)=\"deleteFileAttachment()\"\n #deleteButton=\"skyId\"\n >\n <sky-icon icon=\"trash-o\" size=\"md\" />\n </button>\n </div>\n\n <img\n *ngIf=\"value && isImage\"\n class=\"sky-file-attachment-preview-img\"\n [alt]=\"\n 'skyux_file_attachment_file_upload_image_preview_alt_text'\n | skyLibResources\n \"\n [src]=\"value.url\"\n />\n</div>\n<div skyId #hintTextEl=\"skyId\">\n <div\n *ngIf=\"hintText\"\n class=\"sky-font-deemphasized sky-file-attachment-hint-text\"\n >\n {{ hintText }}\n </div>\n</div>\n\n<sky-form-errors\n *ngIf=\"labelText && (ngControl?.control?.errors || fileErrorValidation)\"\n [id]=\"errorId\"\n [errors]=\"\n ngControl?.errors !== null ? ngControl?.errors : fileErrorValidation\n \"\n [labelText]=\"labelText\"\n [showErrors]=\"ngControl?.touched || ngControl?.dirty\"\n>\n <ng-content select=\"sky-form-error\" />\n <sky-form-error\n *ngIf=\"fileErrorName === 'fileType'\"\n [errorName]=\"'fileType'\"\n [errorText]=\"\n 'skyux_file_attachment_file_type_error_label_text'\n | skyLibResources: fileErrorParam\n \"\n />\n <sky-form-error\n *ngIf=\"fileErrorName === 'maxFileSize'\"\n [errorName]=\"'maxFileSize'\"\n [errorText]=\"\n 'skyux_file_attachment_max_file_size_error_label_text'\n | skyLibResources: (fileErrorParam | skyFileSize)\n \"\n />\n <sky-form-error\n *ngIf=\"fileErrorName === 'minFileSize'\"\n [errorName]=\"'minFileSize'\"\n [errorText]=\"\n 'skyux_file_attachment_min_file_size_error_label_text'\n | skyLibResources: (fileErrorParam | skyFileSize)\n \"\n />\n</sky-form-errors>\n\n<ng-template #labelContent>\n <ng-content select=\"sky-file-attachment-label\" />\n</ng-template>\n", styles: [":host.sky-margin-stacked-lg{display:block}.sky-file-attachment-wrapper{display:inline-block}.sky-file-attachment-upload{padding-right:8px;display:block;border:1px solid transparent}.sky-file-attachment-accept{border-color:#72bf44;border-style:dashed;border-width:1px;border-radius:5px;color:#212327}.sky-file-attachment-reject{border-color:#ef4044;border-style:dashed;border-width:1px;border-radius:5px;color:#212327}:host(.ng-invalid.ng-dirty) .sky-file-attachment-btn{box-shadow:0 0 8px #ef404499;border:1px solid #ef4044}.sky-file-attachment-name{padding:0 5px}.sky-file-attachment-name a{cursor:pointer}.sky-file-attachment-delete{border:none;color:#cdcfd2;cursor:pointer;padding:0}.sky-file-attachment-delete:hover{color:#979ba2;transition:color .15s}.sky-file-attachment-preview-img{max-width:25%;height:auto;box-shadow:0 0 5px #666;margin:10px}.sky-file-attachment-hint-text{margin-top:var(--sky-margin-stacked-xs)}:host-context(.sky-theme-modern) .sky-control-label{color:#686c73;font-size:13px}:host-context(.sky-theme-modern) .sky-file-attachment-none{font-size:13px}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper{display:flex;flex-wrap:wrap}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-label-wrapper{width:100%}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-preview-img{border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;box-shadow:none;margin:0 10px 0 0;width:100px;flex:0;order:1}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-btn{margin:0 10px 0 0}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-icon{margin:5px 10px 5px 5px}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-upload{flex:1;order:2;display:flex;align-items:flex-start}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-upload .sky-file-attachment-name{margin:10px 10px 0 0;padding:0}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-delete{width:40px;height:40px;color:#686c73!important}.sky-theme-modern .sky-control-label{color:#686c73;font-size:13px}.sky-theme-modern .sky-file-attachment-none{font-size:13px}.sky-theme-modern .sky-file-attachment-wrapper{display:flex;flex-wrap:wrap}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-label-wrapper{width:100%}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-preview-img{border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;box-shadow:none;margin:0 10px 0 0;width:100px;flex:0;order:1}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-btn{margin:0 10px 0 0}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-icon{margin:5px 10px 5px 5px}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-upload{flex:1;order:2;display:flex;align-items:flex-start}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-upload .sky-file-attachment-name{margin:10px 10px 0 0;padding:0}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-delete{width:40px;height:40px;color:#686c73!important}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.SkyFormErrorComponent, selector: "sky-form-error", inputs: ["errorName", "errorText"] }, { kind: "component", type: i7.SkyFormErrorsComponent, selector: "sky-form-errors", inputs: ["errors", "labelText", "showErrors"] }, { kind: "component", type: i8.λ1, selector: "sky-icon", inputs: ["icon", "iconName", "iconType", "size", "fixedWidth", "variant"] }, { kind: "directive", type: i9.λ2, selector: "[skyId]", exportAs: ["skyId"] }, { kind: "directive", type: i4.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { kind: "component", type: i10.λ1, selector: "sky-help-inline", inputs: ["ariaControls", "ariaExpanded", "ariaLabel", "helpKey", "labelledBy", "labelText", "popoverContent", "popoverTitle"], outputs: ["actionClick"] }, { kind: "pipe", type: i11.SkyLibResourcesPipe, name: "skyLibResources" }, { kind: "pipe", type: i12.SkyFileSizePipe, name: "skyFileSize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
421
- }
422
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: SkyFileAttachmentComponent, decorators: [{
423
- type: Component,
424
- args: [{ selector: 'sky-file-attachment', providers: [
425
- SkyFileAttachmentService,
426
- { provide: SKY_FORM_ERRORS_ENABLED, useValue: true },
427
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sky-file-attachment-wrapper\">\n <div\n class=\"sky-file-attachment-label-wrapper\"\n [attr.id]=\"labelElementId\"\n [ngClass]=\"{\n 'sky-control-label-required': !labelText && required && hasLabelComponent,\n }\"\n >\n <ng-container *ngIf=\"labelText; else labelContent\">\n <span\n *ngIf=\"!labelHidden\"\n class=\"sky-control-label sky-margin-inline-xs\"\n [ngClass]=\"{\n 'sky-control-label-required': required,\n }\"\n >{{ labelText }}</span\n ><sky-help-inline\n *ngIf=\"helpPopoverContent || helpKey\"\n [labelText]=\"labelText\"\n [helpKey]=\"helpKey\"\n [popoverTitle]=\"helpPopoverTitle\"\n [popoverContent]=\"helpPopoverContent\"\n />\n </ng-container>\n <span\n class=\"sky-screen-reader-only\"\n *ngIf=\"required && (hasLabelComponent || labelText)\"\n >{{ 'skyux_file_attachment_required' | skyLibResources }}</span\n >\n </div>\n <div\n class=\"sky-file-attachment-upload sky-file-attachment sky-file-attachment-target\"\n [ngClass]=\"{\n 'sky-file-attachment-accept': acceptedOver,\n 'sky-file-attachment-reject': rejectedOver,\n }\"\n (dragenter)=\"fileDragEnter($event)\"\n (dragover)=\"fileDragOver($event)\"\n (dragleave)=\"fileDragLeave($event)\"\n (drop)=\"fileDrop($event)\"\n >\n <div\n aria-hidden=\"true\"\n class=\"sky-screen-reader-only\"\n role=\"tooltip\"\n [attr.id]=\"fileDropDescriptionElementId\"\n >\n {{ 'skyux_file_attachment_file_upload_drag_or_click' | skyLibResources }}\n </div>\n <input\n hidden\n tabindex=\"-1\"\n type=\"file\"\n [attr.accept]=\"acceptedTypes || null\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n (change)=\"fileChangeEvent($event)\"\n #fileInput\n />\n <ng-container *ngIf=\"showFileAttachmentButton\">\n <button\n *ngIf=\"showFileAttachmentButton\"\n class=\"sky-file-attachment-btn sky-btn sky-btn-default\"\n type=\"button\"\n skyId\n [attr.aria-describedby]=\"\n (hintText ? hintTextEl.id + ' ' : '') + fileDropDescriptionElementId\n \"\n [attr.aria-label]=\"\n value\n ? ('skyux_file_attachment_button_label_replace_file_label'\n | skyLibResources: fileName)\n : ('skyux_file_attachment_button_label_choose_file_label'\n | skyLibResources)\n \"\n [attr.aria-labelledby]=\"\n attachButton.id +\n ' ' +\n (labelText\n ? labelElementId\n : hasLabelComponent\n ? labelComponents?.get(0)?.labelContentId?.id\n : undefined)\n \"\n [disabled]=\"disabled\"\n (click)=\"onDropClicked()\"\n #attachButton=\"skyId\"\n >\n <sky-icon icon=\"folder-open-o\" />\n {{\n value\n ? ('skyux_file_attachment_button_label_replace_file'\n | skyLibResources)\n : ('skyux_file_attachment_button_label_choose_file'\n | skyLibResources)\n }}\n </button>\n </ng-container>\n <sky-icon\n *ngIf=\"value && !isImage && currentThemeName === 'modern'\"\n class=\"sky-file-attachment-icon sky-deemphasized\"\n icon=\"file-o\"\n size=\"2x\"\n />\n <span\n *ngIf=\"value || currentThemeName === 'default'\"\n class=\"sky-file-attachment-name\"\n >\n <a\n *ngIf=\"value; else noFile\"\n [attr.title]=\"fileName\"\n (click)=\"emitClick()\"\n >\n {{ truncatedFileName }}\n </a>\n </span>\n <ng-template #noFile>\n <span class=\"sky-file-attachment-none sky-deemphasized\">\n {{ 'skyux_file_attachment_label_no_file_chosen' | skyLibResources }}\n </span>\n </ng-template>\n <button\n *ngIf=\"value\"\n class=\"sky-btn sky-btn-borderless sky-file-attachment-delete\"\n skyId\n type=\"button\"\n [attr.aria-label]=\"\n 'skyux_file_attachment_file_item_remove' | skyLibResources: fileName\n \"\n [attr.aria-labelledby]=\"\n deleteButton.id +\n ' ' +\n (hasLabelComponent\n ? labelComponents?.get(0)?.labelContentId?.id\n : undefined)\n \"\n [disabled]=\"disabled\"\n [skyThemeClass]=\"{\n 'sky-btn-icon-borderless': 'modern',\n }\"\n (click)=\"deleteFileAttachment()\"\n #deleteButton=\"skyId\"\n >\n <sky-icon icon=\"trash-o\" size=\"md\" />\n </button>\n </div>\n\n <img\n *ngIf=\"value && isImage\"\n class=\"sky-file-attachment-preview-img\"\n [alt]=\"\n 'skyux_file_attachment_file_upload_image_preview_alt_text'\n | skyLibResources\n \"\n [src]=\"value.url\"\n />\n</div>\n<div skyId #hintTextEl=\"skyId\">\n <div\n *ngIf=\"hintText\"\n class=\"sky-font-deemphasized sky-file-attachment-hint-text\"\n >\n {{ hintText }}\n </div>\n</div>\n\n<sky-form-errors\n *ngIf=\"labelText && (ngControl?.control?.errors || fileErrorValidation)\"\n [id]=\"errorId\"\n [errors]=\"\n ngControl?.errors !== null ? ngControl?.errors : fileErrorValidation\n \"\n [labelText]=\"labelText\"\n [showErrors]=\"ngControl?.touched || ngControl?.dirty\"\n>\n <ng-content select=\"sky-form-error\" />\n <sky-form-error\n *ngIf=\"fileErrorName === 'fileType'\"\n [errorName]=\"'fileType'\"\n [errorText]=\"\n 'skyux_file_attachment_file_type_error_label_text'\n | skyLibResources: fileErrorParam\n \"\n />\n <sky-form-error\n *ngIf=\"fileErrorName === 'maxFileSize'\"\n [errorName]=\"'maxFileSize'\"\n [errorText]=\"\n 'skyux_file_attachment_max_file_size_error_label_text'\n | skyLibResources: (fileErrorParam | skyFileSize)\n \"\n />\n <sky-form-error\n *ngIf=\"fileErrorName === 'minFileSize'\"\n [errorName]=\"'minFileSize'\"\n [errorText]=\"\n 'skyux_file_attachment_min_file_size_error_label_text'\n | skyLibResources: (fileErrorParam | skyFileSize)\n \"\n />\n</sky-form-errors>\n\n<ng-template #labelContent>\n <ng-content select=\"sky-file-attachment-label\" />\n</ng-template>\n", styles: [":host.sky-margin-stacked-lg{display:block}.sky-file-attachment-wrapper{display:inline-block}.sky-file-attachment-upload{padding-right:8px;display:block;border:1px solid transparent}.sky-file-attachment-accept{border-color:#72bf44;border-style:dashed;border-width:1px;border-radius:5px;color:#212327}.sky-file-attachment-reject{border-color:#ef4044;border-style:dashed;border-width:1px;border-radius:5px;color:#212327}:host(.ng-invalid.ng-dirty) .sky-file-attachment-btn{box-shadow:0 0 8px #ef404499;border:1px solid #ef4044}.sky-file-attachment-name{padding:0 5px}.sky-file-attachment-name a{cursor:pointer}.sky-file-attachment-delete{border:none;color:#cdcfd2;cursor:pointer;padding:0}.sky-file-attachment-delete:hover{color:#979ba2;transition:color .15s}.sky-file-attachment-preview-img{max-width:25%;height:auto;box-shadow:0 0 5px #666;margin:10px}.sky-file-attachment-hint-text{margin-top:var(--sky-margin-stacked-xs)}:host-context(.sky-theme-modern) .sky-control-label{color:#686c73;font-size:13px}:host-context(.sky-theme-modern) .sky-file-attachment-none{font-size:13px}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper{display:flex;flex-wrap:wrap}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-label-wrapper{width:100%}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-preview-img{border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;box-shadow:none;margin:0 10px 0 0;width:100px;flex:0;order:1}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-btn{margin:0 10px 0 0}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-icon{margin:5px 10px 5px 5px}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-upload{flex:1;order:2;display:flex;align-items:flex-start}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-upload .sky-file-attachment-name{margin:10px 10px 0 0;padding:0}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-delete{width:40px;height:40px;color:#686c73!important}.sky-theme-modern .sky-control-label{color:#686c73;font-size:13px}.sky-theme-modern .sky-file-attachment-none{font-size:13px}.sky-theme-modern .sky-file-attachment-wrapper{display:flex;flex-wrap:wrap}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-label-wrapper{width:100%}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-preview-img{border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;box-shadow:none;margin:0 10px 0 0;width:100px;flex:0;order:1}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-btn{margin:0 10px 0 0}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-icon{margin:5px 10px 5px 5px}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-upload{flex:1;order:2;display:flex;align-items:flex-start}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-upload .sky-file-attachment-name{margin:10px 10px 0 0;padding:0}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-delete{width:40px;height:40px;color:#686c73!important}\n"] }]
428
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.SkyFileAttachmentService }, { type: i2.SkyFileItemService }, { type: i3.NgControl, decorators: [{
429
- type: Self
430
- }, {
431
- type: Optional
432
- }] }, { type: i4.SkyThemeService, decorators: [{
433
- type: Optional
434
- }] }], propDecorators: { acceptedTypes: [{
435
- type: Input
436
- }], disabled: [{
437
- type: Input
438
- }], helpPopoverContent: [{
439
- type: Input
440
- }], helpPopoverTitle: [{
441
- type: Input
442
- }], helpKey: [{
443
- type: Input
444
- }], labelText: [{
445
- type: Input
446
- }], labelHidden: [{
447
- type: Input,
448
- args: [{ transform: booleanAttribute }]
449
- }], hintText: [{
450
- type: Input
451
- }], maxFileSize: [{
452
- type: Input
453
- }], minFileSize: [{
454
- type: Input
455
- }], stacked: [{
456
- type: Input,
457
- args: [{ transform: booleanAttribute }]
458
- }, {
459
- type: HostBinding,
460
- args: ['class.sky-margin-stacked-lg']
461
- }], validateFn: [{
462
- type: Input
463
- }], fileChange: [{
464
- type: Output
465
- }], fileClick: [{
466
- type: Output
467
- }], required: [{
468
- type: Input
469
- }], display: [{
470
- type: HostBinding,
471
- args: ['style.display']
472
- }], inputEl: [{
473
- type: ViewChild,
474
- args: ['fileInput']
475
- }], labelComponents: [{
476
- type: ContentChildren,
477
- args: [SkyFileAttachmentLabelComponent]
478
- }] } });
479
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1hdHRhY2htZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9mb3Jtcy9zcmMvbGliL21vZHVsZXMvZmlsZS1hdHRhY2htZW50L2ZpbGUtYXR0YWNobWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZm9ybXMvc3JjL2xpYi9tb2R1bGVzL2ZpbGUtYXR0YWNobWVudC9maWxlLWF0dGFjaG1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUVmLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sSUFBSSxFQUVKLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxlQUFlLEVBQ2YsWUFBWSxFQUNaLHVCQUF1QixHQUN4QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHckQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBRXhHLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQVFyRSxJQUFJLFFBQVEsR0FBRyxDQUFDLENB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c0JBRGIsS0FBSztnQkFPQyxTQUFTO3NCQURmLEtBQUs7Z0JBT0MsV0FBVztzQkFEakIsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFRL0IsUUFBUTtzQkFEZCxLQUFLO2dCQVFLLFdBQVc7c0JBRHJCLEtBQUs7Z0JBY0ssV0FBVztzQkFEckIsS0FBSztnQkFlQyxPQUFPO3NCQUZiLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7O3NCQUNyQyxXQUFXO3VCQUFDLDZCQUE2QjtnQkFRbkMsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxVQUFVO3NCQURoQixNQUFNO2dCQVFBLFNBQVM7c0JBRGYsTUFBTTtnQkFxQkEsUUFBUTtzQkFEZCxLQUFLO2dCQUlDLE9BQU87c0JBRGIsV0FBVzt1QkFBQyxlQUFlO2dCQW9DckIsT0FBTztzQkFEYixTQUFTO3VCQUFDLFdBQVc7Z0JBSWYsZUFBZTtzQkFEckIsZUFBZTt1QkFBQywrQkFBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2VsZixcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nQ29udHJvbCwgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIFNreUZvcm1zVXRpbGl0eSxcbiAgU2t5SWRTZXJ2aWNlLFxuICBTa3lMaXZlQW5ub3VuY2VyU2VydmljZSxcbn0gZnJvbSAnQHNreXV4L2NvcmUnO1xuaW1wb3J0IHsgU2t5TGliUmVzb3VyY2VzU2VydmljZSB9IGZyb20gJ0Bza3l1eC9pMThuJztcbmltcG9ydCB7IFNreVRoZW1lU2VydmljZSB9IGZyb20gJ0Bza3l1eC90aGVtZSc7XG5cbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU0tZX0ZPUk1fRVJST1JTX0VOQUJMRUQgfSBmcm9tICcuLi9mb3JtLWVycm9yL2Zvcm0tZXJyb3JzLWVuYWJsZWQtdG9rZW4nO1xuaW1wb3J0IHsgU2t5Rm9ybUZpZWxkTGFiZWxUZXh0UmVxdWlyZWRTZXJ2aWNlIH0gZnJvbSAnLi4vc2hhcmVkL2Zvcm0tZmllbGQtbGFiZWwtdGV4dC1yZXF1aXJlZC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgU2t5RmlsZUF0dGFjaG1lbnRMYWJlbENvbXBvbmVudCB9IGZyb20gJy4vZmlsZS1hdHRhY2htZW50LWxhYmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTa3lGaWxlQXR0YWNobWVudFNlcnZpY2UgfSBmcm9tICcuL2ZpbGUtYXR0YWNobWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFNreUZpbGVJdGVtIH0gZnJvbSAnLi9maWxlLWl0ZW0nO1xuaW1wb3J0IHsgU2t5RmlsZUl0ZW1FcnJvclR5cGUgfSBmcm9tICcuL2ZpbGUtaXRlbS1lcnJvci10eXBlJztcbmltcG9ydCB7IFNreUZpbGVJdGVtU2VydmljZSB9IGZyb20gJy4vZmlsZS1pdGVtLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5RmlsZVZhbGlkYXRlRm4gfSBmcm9tICcuL2ZpbGUtdmFsaWRhdGUtZnVuY3Rpb24nO1xuaW1wb3J0IHsgU2t5RmlsZUF0dGFjaG1lbnRDaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2ZpbGUtYXR0YWNobWVudC1jaGFuZ2UnO1xuaW1wb3J0IHsgU2t5RmlsZUF0dGFjaG1lbnRDbGljayB9IGZyb20gJy4vdHlwZXMvZmlsZS1hdHRhY2htZW50LWNsaWNrJztcblxubGV0IHVuaXF1ZUlkID0gMDtcblxuY29uc3QgTUFYX0ZJTEVfU0laRV9ERUZBVUxUID0gNTAwMDAwO1xuY29uc3QgTUlOX0ZJTEVfU0laRV9ERUZBVUxUID0gMDtcblxuLyoqXG4gKiBQcm92aWRlcyBhbiBlbGVtZW50IHRvIGF0dGFjaCBhIHNpbmdsZSBsb2NhbCBmaWxlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktZmlsZS1hdHRhY2htZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbGUtYXR0YWNobWVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGUtYXR0YWNobWVudC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICBTa3lGaWxlQXR0YWNobWVudFNlcnZpY2UsXG4gICAgeyBwcm92aWRlOiBTS1lfRk9STV9FUlJPUlNfRU5BQkxFRCwgdXNlVmFsdWU6IHRydWUgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNreUZpbGVBdHRhY2htZW50Q29tcG9uZW50XG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25Jbml0LCBPbkRlc3Ryb3lcbntcbiAgLyoqXG4gICAqIFRoZSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIGxpdGVyYWwgb2YgTUlNRSB0eXBlcyB0aGF0IHVzZXJzIGNhbiBhdHRhY2guXG4gICAqIEJ5IGRlZmF1bHQsIGFsbCBmaWxlIHR5cGVzIGFyZSBhbGxvd2VkLlxuICAgKiBAcmVxdWlyZWRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhY2NlcHRlZFR5cGVzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgaW5wdXQgb24gdGVtcGxhdGUtZHJpdmVuIGZvcm1zLiBEb24ndCB1c2UgdGhpcyBpbnB1dCBvbiByZWFjdGl2ZSBmb3JtcyBiZWNhdXNlIHRoZXkgbWF5IG92ZXJ3cml0ZSB0aGUgaW5wdXQgb3IgbGVhdmUgdGhlIGNvbnRyb2wgb3V0IG9mIHN5bmMuXG4gICAqIFRvIHNldCB0aGUgZGlzYWJsZWQgc3RhdGUgb24gcmVhY3RpdmUgZm9ybXMsIHVzZSB0aGUgYEZvcm1Db250cm9sYCBpbnN0ZWFkLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG5ld0Rpc2FibGVkU3RhdGUgPSBTa3lGb3Jtc1V0aWxpdHkuY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICBpZiAodGhpcy4jX2Rpc2FibGVkICE9PSBuZXdEaXNhYmxlZFN0YXRlKSB7XG4gICAgICB0aGlzLiNfZGlzYWJsZWQgPSBuZXdEaXNhYmxlZFN0YXRlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI19kaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgaGVscCBwb3BvdmVyLiBXaGVuIHNwZWNpZmllZCBhbG9uZyB3aXRoIGBsYWJlbFRleHRgLCBhIFtoZWxwIGlubGluZV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9jb21wb25lbnRzL2hlbHAtaW5saW5lKVxuICAgKiBidXR0b24gaXMgYWRkZWQgdG8gdGhlIHNpbmdsZSBmaWxlIGF0dGFjaG1lbnQgbGFiZWwuIFRoZSBoZWxwIGlubGluZSBidXR0b24gZGlzcGxheXMgYSBbcG9wb3Zlcl0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9jb21wb25lbnRzL3BvcG92ZXIpXG4gICAqIHdoZW4gY2xpY2tlZCB1c2luZyB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgYW5kIG9wdGlvbmFsIHRpdGxlLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGhlbHBQb3BvdmVyQ29udGVudDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB0aXRsZSBvZiB0aGUgaGVscCBwb3BvdmVyLiBUaGlzIHByb3BlcnR5IG9ubHkgYXBwbGllcyB3aGVuIGBoZWxwUG9wb3ZlckNvbnRlbnRgIGlzXG4gICAqIGFsc28gc3BlY2lmaWVkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGhlbHBQb3BvdmVyVGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQSBoZWxwIGtleSB0aGF0IGlkZW50aWZpZXMgdGhlIGdsb2JhbCBoZWxwIGNvbnRlbnQgdG8gZGlzcGxheS4gV2hlbiBzcGVjaWZpZWQsIGEgW2hlbHAgaW5saW5lXShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2NvbXBvbmVudHMvaGVscC1pbmxpbmUpXG4gICAqIGJ1dHRvbiBpcyBwbGFjZWQgYmVzaWRlIHRoZSBzaW5nbGUgZmlsZSBhdHRhY2htZW50IGxhYmVsLiBDbGlja2luZyB0aGUgYnV0dG9uIGludm9rZXMgW2dsb2JhbCBoZWxwXShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2xlYXJuL2RldmVsb3AvZ2xvYmFsLWhlbHApXG4gICAqIGFzIGNvbmZpZ3VyZWQgYnkgdGhlIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGhlbHBLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHRleHQgdG8gZGlzcGxheSBhcyB0aGUgZmlsZSBhdHRhY2htZW50J3MgbGFiZWwuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgbGFiZWxUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGlkZSBgbGFiZWxUZXh0YCBmcm9tIHZpZXcuXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgcHVibGljIGxhYmVsSGlkZGVuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFtQZXJzaXN0ZW50IGlubGluZSBoZWxwIHRleHRdKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvZGVzaWduL2d1aWRlbGluZXMvdXNlci1hc3Npc3RhbmNlI2lubGluZS1oZWxwKSB0aGF0IHByb3ZpZGVzXG4gICAqIGFkZGl0aW9uYWwgY29udGV4dCB0byB0aGUgdXNlci5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoaW50VGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBzaXplIGluIGJ5dGVzIGZvciB2YWxpZCBmaWxlcy5cbiAgICogQGRlZmF1bHQgNTAwMDAwXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IG1heEZpbGVTaXplKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfbWF4RmlsZVNpemUgPSB2YWx1ZSA/PyBNQVhfRklMRV9TSVpFX0RFRkFVTFQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1heEZpbGVTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuI19tYXhGaWxlU2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBzaXplIGluIGJ5dGVzIGZvciB2YWxpZCBmaWxlcy5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBtaW5GaWxlU2l6ZSh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX21pbkZpbGVTaXplID0gdmFsdWUgPz8gTUlOX0ZJTEVfU0laRV9ERUZBVUxUO1xuICB9XG5cbiAgcHVibGljIGdldCBtaW5GaWxlU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLiNfbWluRmlsZVNpemU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgc2luZ2xlIGZpbGUgYXR0YWNobWVudCBpcyBzdGFja2VkIG9uIGFub3RoZXIgZm9ybSBjb21wb25lbnQuIFdoZW4gc3BlY2lmaWVkLFxuICAgKiB0aGUgYXBwcm9wcmlhdGUgdmVydGljYWwgc3BhY2luZyBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBzaW5nbGUgZmlsZSBhdHRhY2htZW50LlxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2t5LW1hcmdpbi1zdGFja2VkLWxnJylcbiAgcHVibGljIHN0YWNrZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uLiBUaGlzIHZhbGlkYXRpb24gcnVucyBhbG9uZ3NpZGUgdGhlIGludGVybmFsXG4gICAqIGZpbGUgdmFsaWRhdGlvbi4gVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGBTa3lGaWxlSXRlbWAgb2JqZWN0IGFzIGEgcGFyYW1ldGVyLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHZhbGlkYXRlRm46IFNreUZpbGVWYWxpZGF0ZUZuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIGFkZCBvciByZW1vdmUgZmlsZXMuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGZpbGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNreUZpbGVBdHRhY2htZW50Q2hhbmdlPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIHNlbGVjdCB0aGUgZmlsZSBuYW1lIGxpbmsuIE1ha2Ugc3VyZSB0byBiaW5kIHRoZSBldmVudC5cbiAgICogSWYgeW91IGRvIG5vdCwgdGhlIGZpbGUgbmFtZSBsaW5rIHdpbGwgYmUgYSBkZWFkIGxpbmsuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGZpbGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5RmlsZUF0dGFjaG1lbnRDbGljaz4oKTtcblxuICBwdWJsaWMgYWNjZXB0ZWRPdmVyID0gZmFsc2U7XG5cbiAgcHVibGljIGhhc0xhYmVsQ29tcG9uZW50ID0gZmFsc2U7XG5cbiAgcHVibGljIGZpbGVEcm9wRGVzY3JpcHRpb25FbGVtZW50SWQ6IHN0cmluZztcblxuICBwdWJsaWMgbGFiZWxFbGVtZW50SWQ6IHN0cmluZztcblxuICBwdWJsaWMgcmVqZWN0ZWRPdmVyID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGlucHV0IGlzIHJlcXVpcmVkIGZvciBmb3JtIHZhbGlkYXRpb24uXG4gICAqIFdoZW4geW91IHNldCB0aGlzIHByb3BlcnR5IHRvIGB0cnVlYCwgdGhlIGNvbXBvbmVudCBhZGRzIGBhcmlhLXJlcXVpcmVkYCBhbmQgYHJlcXVpcmVkYFxuICAgKiBhdHRyaWJ1dGVzIHRvIHRoZSBpbnB1dCBlbGVtZW50IHNvIHRoYXQgZm9ybXMgZGlzcGxheSBhbiBpbnZhbGlkIHN0YXRlIHVudGlsIHRoZSBpbnB1dCBlbGVtZW50XG4gICAqIGlzIGNvbXBsZXRlLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYGFyaWEtcmVxdWlyZWRgIGF0dHJpYnV0ZSwgc2VlIHRoZSBbV0FJLUFSSUEgZGVmaW5pdGlvbl0oaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLyNhcmlhLXJlcXVpcmVkKS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByZXF1aXJlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlO1xuXG4gIEBIb3N0QmluZGluZygnc3R5bGUuZGlzcGxheScpXG4gIHB1YmxpYyBkaXNwbGF5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogU2t5RmlsZUl0ZW0gfCB1bmRlZmluZWQgfCBudWxsKSB7XG4gICAgLy8gVGhlIG51bGwgY2hlY2sgaXMgbmVlZGVkIHRvIGFkZHJlc3MgYSBidWcgaW4gQW5ndWxhciA0LlxuICAgIC8vIHdyaXRlVmFsdWUgaXMgYmVpbmcgY2FsbGVkIHR3aWNlLCBmaXJzdCB0aW1lIHdpdGggYSBwaGFudG9tIG51bGwgdmFsdWVcbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE0OTg4XG4gICAgY29uc3QgaXNOZXdWYWx1ZSA9IHZhbHVlICE9PSB0aGlzLnZhbHVlICYmIHZhbHVlICE9PSBudWxsO1xuXG4gICAgaWYgKGlzTmV3VmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLmlzSW1hZ2UgPSB0aGlzLiNmaWxlSXRlbVNlcnZpY2UuaXNJbWFnZSh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzSW1hZ2UgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuI3NldEZpbGVOYW1lKHZhbHVlKTtcblxuICAgICAgdGhpcy4jX3ZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLiNvbkNoYW5nZSh2YWx1ZSk7XG4gICAgICB0aGlzLiN1cGRhdGVGaWxlQXR0YWNobWVudEJ1dHRvbigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogU2t5RmlsZUl0ZW0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNfdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgY3VycmVudFRoZW1lTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBmaWxlTmFtZSA9ICcnO1xuXG4gIHB1YmxpYyBzaG93RmlsZUF0dGFjaG1lbnRCdXR0b24gPSB0cnVlO1xuXG4gIHB1YmxpYyB0cnVuY2F0ZWRGaWxlTmFtZSA9ICcnO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcpXG4gIHB1YmxpYyBpbnB1dEVsOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oU2t5RmlsZUF0dGFjaG1lbnRMYWJlbENvbXBvbmVudClcbiAgcHVibGljIGxhYmVsQ29tcG9uZW50czpcbiAgICB8IFF1ZXJ5TGlzdDxTa3lGaWxlQXR0YWNobWVudExhYmVsQ29tcG9uZW50PlxuICAgIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBpc0ltYWdlID0gZmFsc2U7XG5cbiAgI2VudGVyRXZlbnRUYXJnZXQ6IEV2ZW50VGFyZ2V0IHwgdW5kZWZpbmVkIHwgbnVsbDtcblxuICAjZmlsZUF0dGFjaG1lbnRJZCA9IHVuaXF1ZUlkKys7XG5cbiAgI25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICNfZGlzYWJsZWQgPSBmYWxzZTtcblxuICAjX21heEZpbGVTaXplID0gTUFYX0ZJTEVfU0laRV9ERUZBVUxUO1xuXG4gICNfbWluRmlsZVNpemUgPSBNSU5fRklMRV9TSVpFX0RFRkFVTFQ7XG5cbiAgI192YWx1ZTogU2t5RmlsZUl0ZW0gfCB1bmRlZmluZWQ7XG5cbiAgI2NoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZjtcbiAgI2ZpbGVBdHRhY2htZW50U2VydmljZTogU2t5RmlsZUF0dGFjaG1lbnRTZXJ2aWNlO1xuICAjZmlsZUl0ZW1TZXJ2aWNlOiBTa3lGaWxlSXRlbVNlcnZpY2U7XG4gICN0aGVtZVN2YzogU2t5VGhlbWVTZXJ2aWNlIHwgdW5kZWZpbmVkO1xuXG4gIHJlYWRvbmx5ICNpZFN2YyA9IGluamVjdChTa3lJZFNlcnZpY2UpO1xuICByZWFkb25seSAjbGl2ZUFubm91bmNlclN2YyA9IGluamVjdChTa3lMaXZlQW5ub3VuY2VyU2VydmljZSk7XG4gIHJlYWRvbmx5ICNyZXNvdXJjZXNTdmMgPSBpbmplY3QoU2t5TGliUmVzb3VyY2VzU2VydmljZSk7XG5cbiAgcmVhZG9ubHkgI2xhYmVsVGV4dFJlcXVpcmVkID0gaW5qZWN0KFNreUZvcm1GaWVsZExhYmVsVGV4dFJlcXVpcmVkU2VydmljZSwge1xuICAgIG9wdGlvbmFsOiB0cnVlLFxuICB9KTtcblxuICBwcm90ZWN0ZWQgbmdDb250cm9sOiBOZ0NvbnRyb2wgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBlcnJvcklkID0gdGhpcy4jaWRTdmMuZ2VuZXJhdGVJZCgpO1xuXG4gIHByb3RlY3RlZCBmaWxlRXJyb3JOYW1lOiBTa3lGaWxlSXRlbUVycm9yVHlwZSB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGZpbGVFcnJvclBhcmFtOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBmaWxlRXJyb3JWYWxpZGF0aW9uOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgZmlsZUF0dGFjaG1lbnRTZXJ2aWNlOiBTa3lGaWxlQXR0YWNobWVudFNlcnZpY2UsXG4gICAgZmlsZUl0ZW1TZXJ2aWNlOiBTa3lGaWxlSXRlbVNlcnZpY2UsXG4gICAgQFNlbGYoKSBAT3B0aW9uYWwoKSBuZ0NvbnRyb2w/OiBOZ0NvbnRyb2wsXG4gICAgQE9wdGlvbmFsKCkgdGhlbWVTdmM/OiBTa3lUaGVtZVNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yID0gY2hhbmdlRGV0ZWN0b3I7XG4gICAgdGhpcy4jZmlsZUF0dGFjaG1lbnRTZXJ2aWNlID0gZmlsZUF0dGFjaG1lbnRTZXJ2aWNlO1xuICAgIHRoaXMuI2ZpbGVJdGVtU2VydmljZSA9IGZpbGVJdGVtU2VydmljZTtcbiAgICB0aGlzLm5nQ29udHJvbCA9IG5nQ29udHJvbDtcbiAgICB0aGlzLiN0aGVtZVN2YyA9IHRoZW1lU3ZjO1xuXG4gICAgdGhpcy5sYWJlbEVsZW1lbnRJZCA9IGBza3ktZmlsZS1hdHRhY2htZW50LWxhYmVsLSR7dGhpcy4jZmlsZUF0dGFjaG1lbnRJZH1gO1xuICAgIHRoaXMuZmlsZURyb3BEZXNjcmlwdGlvbkVsZW1lbnRJZCA9IGBza3ktZmlsZS1hdHRhY2htZW50LWRyb3AtZGVzY3JpcHRpb24tJHt0aGlzLiNmaWxlQXR0YWNobWVudElkfWA7XG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuI3RoZW1lU3ZjKSB7XG4gICAgICB0aGlzLiN0aGVtZVN2Yy5zZXR0aW5nc0NoYW5nZVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHRoZW1lU2V0dGluZ3MpID0+IHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRUaGVtZU5hbWUgPSB0aGVtZVNldHRpbmdzLmN1cnJlbnRTZXR0aW5ncy50aGVtZS5uYW1lO1xuICAgICAgICAgIHRoaXMuI3VwZGF0ZUZpbGVBdHRhY2htZW50QnV0dG9uKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLiNsYWJlbFRleHRSZXF1aXJlZCAmJiAhdGhpcy5sYWJlbFRleHQpIHtcbiAgICAgIHRoaXMuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gICAgdGhpcy4jbGFiZWxUZXh0UmVxdWlyZWQ/LnZhbGlkYXRlTGFiZWxUZXh0KHRoaXMubGFiZWxUZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYWRkcmVzcyBhIGJ1ZyBpbiBBbmd1bGFyIDcuXG4gICAgLy8gV2hlbiBhIGNvbnRyb2wgdmFsdWUgaXMgc2V0IGluaXRpYWxseSwgaXRzIHZhbHVlIGlzIG5vdCByZXByZXNlbnRlZCBvbiB0aGUgdmlldy5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzEzNzkyXG4gICAgLy8gT2Ygbm90ZSBpcyB0aGUgcGFyZW50IGNoZWNrIHdoaWNoIGFsbG93cyB1cyB0byBkZXRlcm1pbmUgaWYgdGhlIGZvcm0gaXMgcmVhY3RpdmUuXG4gICAgLy8gV2l0aG91dCB0aGlzIGNoZWNrIHRoZXJlIGlzIGEgY2hhbmdlZCBiZWZvcmUgY2hlY2tlZCBlcnJvclxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2whLmNvbnRyb2whLnNldFZhbHVlKHRoaXMudmFsdWUsIHtcbiAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5yZXF1aXJlZCA9XG4gICAgICAgIHRoaXMucmVxdWlyZWQgfHwgU2t5Rm9ybXNVdGlsaXR5Lmhhc1JlcXVpcmVkVmFsaWRhdGlvbih0aGlzLm5nQ29udHJvbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sYWJlbENvbXBvbmVudHMpIHtcbiAgICAgIHRoaXMuaGFzTGFiZWxDb21wb25lbnQgPSB0aGlzLmxhYmVsQ29tcG9uZW50cy5sZW5ndGggPiAwO1xuICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAvLyBIYW5kbGVzIHVwZGF0aW5nIGNsYXNzZXMgd2hlbiBsYWJlbCBjaGFuZ2VzXG4gICAgICB0aGlzLmxhYmVsQ29tcG9uZW50cy5jaGFuZ2VzXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAobmV3TGFiZWxDb21wb25lbnRzOiBRdWVyeUxpc3Q8U2t5RmlsZUF0dGFjaG1lbnRMYWJlbENvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFzTGFiZWxDb21wb25lbnQgPSBuZXdMYWJlbENvbXBvbmVudHMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uRHJvcENsaWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy4jb25Ub3VjaGVkKCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5pbnB1dEVsKSB7XG4gICAgICB0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmaWxlQ2hhbmdlRXZlbnQoZmlsZUNoYW5nZUV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuI2hhbmRsZUZpbGVzKFxuICAgICAgKGZpbGVDaGFuZ2VFdmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCB8IHVuZGVmaW5lZCk/LmZpbGVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZmlsZURyYWdFbnRlcihkcmFnRW50ZXJFdmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgLy8gU2F2ZSB0aGlzIHRhcmdldCB0byBrbm93IHdoZW4gdGhlIGRyYWcgZXZlbnQgbGVhdmVzXG4gICAgdGhpcy4jZW50ZXJFdmVudFRhcmdldCA9IGRyYWdFbnRlckV2ZW50LnRhcmdldDtcbiAgICBkcmFnRW50ZXJFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBkcmFnRW50ZXJFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgcHVibGljIGZpbGVEcmFnT3ZlcihkcmFnT3ZlckV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0cmFuc2ZlciA9IGRyYWdPdmVyRXZlbnQuZGF0YVRyYW5zZmVyO1xuXG4gICAgZHJhZ092ZXJFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBkcmFnT3ZlckV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAodHJhbnNmZXIpIHtcbiAgICAgIGlmICh0cmFuc2Zlci5pdGVtcykge1xuICAgICAgICBjb25zdCBmaWxlcyA9IEFycmF5LmZyb20odHJhbnNmZXIuaXRlbXMpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGZpbGUudHlwZSAmJlxuICAgICAgICAgICAgdGhpcy4jZmlsZUF0dGFjaG1lbnRTZXJ2aWNlLmZpbGVUeXBlUmVqZWN0ZWQoXG4gICAgICAgICAgICAgIGZpbGUudHlwZSxcbiAgICAgICAgICAgICAgdGhpcy5hY2NlcHRlZFR5cGVzLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5yZWplY3RlZE92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5hY2NlcHRlZE92ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCAmJiAhdGhpcy5hY2NlcHRlZE92ZXIpIHtcbiAgICAgICAgICB0aGlzLnJlamVjdGVkT3ZlciA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuYWNjZXB0ZWRPdmVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0cmFuc2Zlci5maWxlcykge1xuICAgICAgICAvLyBJZiB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IERhdGFUcmFuc2Zlci5pdGVtcyxcbiAgICAgICAgLy8gZGVmZXIgZmlsZS10eXBlIGNoZWNraW5nIHRvIGRyb3AgaGFuZGxlci5cbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2Zlci9pdGVtcyNCcm93c2VyX2NvbXBhdGliaWxpdHlcbiAgICAgICAgdGhpcy5yZWplY3RlZE92ZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hY2NlcHRlZE92ZXIgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmaWxlRHJvcChkcm9wRXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGRyb3BFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBkcm9wRXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMuI2VudGVyRXZlbnRUYXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZWplY3RlZE92ZXIgPSBmYWxzZTtcbiAgICB0aGlzLmFjY2VwdGVkT3ZlciA9IGZhbHNlO1xuXG4gICAgaWYgKGRyb3BFdmVudC5kYXRhVHJhbnNmZXIgJiYgZHJvcEV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcykge1xuICAgICAgaWYgKGRyb3BFdmVudC5kYXRhVHJhbnNmZXIuZmlsZXMubGVuZ3RoID4gMSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy4jZmlsZUF0dGFjaG1lbnRTZXJ2aWNlLmhhc0RpcmVjdG9yeShkcm9wRXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy4jaGFuZGxlRmlsZXMoZHJvcEV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZpbGVEcmFnTGVhdmUoZHJhZ0xlYXZlRXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNlbnRlckV2ZW50VGFyZ2V0ID09PSBkcmFnTGVhdmVFdmVudC50YXJnZXQpIHtcbiAgICAgIHRoaXMucmVqZWN0ZWRPdmVyID0gZmFsc2U7XG4gICAgICB0aGlzLmFjY2VwdGVkT3ZlciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkZWxldGVGaWxlQXR0YWNobWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlTmFtZSA9IHRoaXMudmFsdWU/LmZpbGUubmFtZTtcbiAgICB0aGlzLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuI2VtaXRGaWxlQ2hhbmdlRXZlbnQodGhpcy52YWx1ZSk7XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogc2FmZXR5IGNoZWNrICovXG4gICAgaWYgKGZpbGVOYW1lKSB7XG4gICAgICB0aGlzLiNhbm5vdW5jZVN0YXRlKFxuICAgICAgICAnc2t5dXhfZmlsZV9hdHRhY2htZW50X2ZpbGVfdXBsb2FkX2ZpbGVfcmVtb3ZlZCcsXG4gICAgICAgIGZpbGVOYW1lLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbGVDaGFuZ2UuY29tcGxldGUoKTtcbiAgICB0aGlzLiNuZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLiNuZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBhbnkpID0+IGFueSk6IHZvaWQge1xuICAgIHRoaXMuI29uQ2hhbmdlID0gZm47XG4gIH1cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLiNvblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIFNldHMgdGhlIGRpc2FibGVkIHN0YXRlIG9mIHRoZSBjb250cm9sLiBJbXBsZW1lbnRlZCBhcyBhIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAqIEBwYXJhbSBpc0Rpc2FibGVkIFdoZXRoZXIgdGhlIGNvbnRyb2wgc2hvdWxkIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIGVtaXRDbGljaygpOiB2b2lkIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLmZpbGVDbGljay5lbWl0KHtcbiAgICAgICAgZmlsZTogdGhpcy52YWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gICNhbm5vdW5jZVN0YXRlKHJlc291cmNlU3RyaW5nOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgdGhpcy4jcmVzb3VyY2VzU3ZjXG4gICAgICAuZ2V0U3RyaW5nKHJlc291cmNlU3RyaW5nLCAuLi5hcmdzKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKGludGVybmF0aW9uYWxpemVkU3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuI2xpdmVBbm5vdW5jZXJTdmMuYW5ub3VuY2UoaW50ZXJuYXRpb25hbGl6ZWRTdHJpbmcpO1xuICAgICAgfSk7XG4gIH1cblxuICAjZW1pdEZpbGVDaGFuZ2VFdmVudChjdXJyZW50RmlsZT86IFNreUZpbGVJdGVtKTogdm9pZCB7XG4gICAgaWYgKGN1cnJlbnRGaWxlICYmICFjdXJyZW50RmlsZS5lcnJvclR5cGUpIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZShjdXJyZW50RmlsZSk7XG4gICAgICB0aGlzLmZpbGVFcnJvck5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmZpbGVFcnJvclBhcmFtID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5maWxlRXJyb3JWYWxpZGF0aW9uID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndyaXRlVmFsdWUodW5kZWZpbmVkKTtcbiAgICAgIC8vIE1ha2VzIHN1cmUgdmFsdWUgYWNjZXNzb3IgaXMgbWFya2VkIGFzIGRpcnR5IGV2ZW4gaWYgY3VycmVudCBmaWxlIGlzIHVuZGVmaW5lZFxuICAgICAgdGhpcy4jb25DaGFuZ2UodW5kZWZpbmVkKTtcbiAgICAgIHRoaXMuZmlsZUVycm9yVmFsaWRhdGlvbiA9IHsgZmlsZUVycm9yOiB0cnVlIH07XG4gICAgICB0aGlzLmZpbGVFcnJvck5hbWUgPSBjdXJyZW50RmlsZT8uZXJyb3JUeXBlO1xuICAgICAgdGhpcy5maWxlRXJyb3JQYXJhbSA9IGN1cnJlbnRGaWxlPy5lcnJvclBhcmFtO1xuICAgIH1cbiAgICB0aGlzLmZpbGVDaGFuZ2UuZW1pdCh7XG4gICAgICBmaWxlOiBjdXJyZW50RmlsZSxcbiAgICB9IGFzIFNreUZpbGVBdHRhY2htZW50Q2hhbmdlKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuaW5wdXRFbCkge1xuICAgICAgdGhpcy5pbnB1dEVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICB9XG4gIH1cblxuICAjbG9hZEZpbGUoZmlsZTogU2t5RmlsZUl0ZW0pOiB2b2lkIHtcbiAgICBpZiAoZmlsZS5maWxlKSB7XG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgICByZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIChldmVudDogYW55KTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzRmlsZU5hbWUgPSB0aGlzLnZhbHVlPy5maWxlLm5hbWU7XG4gICAgICAgIGZpbGUudXJsID0gZXZlbnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgdGhpcy4jZW1pdEZpbGVDaGFuZ2VFdmVudChmaWxlKTtcbiAgICAgICAgaWYgKHByZXZpb3VzRmlsZU5hbWUpIHtcbiAgICAgICAgICB0aGlzLiNhbm5vdW5jZVN0YXRlKFxuICAgICAgICAgICAgJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9maWxlX3VwbG9hZF9maWxlX3JlcGxhY2VkJyxcbiAgICAgICAgICAgIHByZXZpb3VzRmlsZU5hbWUsXG4gICAgICAgICAgICBmaWxlLmZpbGUubmFtZSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuI2Fubm91bmNlU3RhdGUoXG4gICAgICAgICAgICAnc2t5dXhfZmlsZV9hdHRhY2htZW50X2ZpbGVfdXBsb2FkX2ZpbGVfYWRkZWQnLFxuICAgICAgICAgICAgZmlsZS5maWxlLm5hbWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJlYWRlci5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy4jZW1pdEZpbGVDaGFuZ2VFdmVudChmaWxlKTtcbiAgICAgIH0pO1xuXG4gICAgICByZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuI2VtaXRGaWxlQ2hhbmdlRXZlbnQoZmlsZSk7XG4gICAgICB9KTtcblxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZS5maWxlKTtcbiAgICB9XG4gIH1cblxuICAjaGFuZGxlRmlsZXMoZmlsZXM/OiBGaWxlTGlzdCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoZmlsZXMpIHtcbiAgICAgIGNvbnN0IHByb2Nlc3NlZEZpbGVzID0gdGhpcy4jZmlsZUF0dGFjaG1lbnRTZXJ2aWNlLmNoZWNrRmlsZXMoXG4gICAgICAgIGZpbGVzLFxuICAgICAgICB0aGlzLm1pbkZpbGVTaXplLFxuICAgICAgICB0aGlzLm1heEZpbGVTaXplLFxuICAgICAgICB0aGlzLmFjY2VwdGVkVHlwZXMsXG4gICAgICAgIHRoaXMudmFsaWRhdGVGbixcbiAgICAgICk7XG5cbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBwcm9jZXNzZWRGaWxlcykge1xuICAgICAgICBpZiAoZmlsZS5lcnJvclR5cGUpIHtcbiAgICAgICAgICB0aGlzLiNlbWl0RmlsZUNoYW5nZUV2ZW50KGZpbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuI2xvYWRGaWxlKGZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI3NldEZpbGVOYW1lKGZpbGU/OiBTa3lGaWxlSXRlbSk6IHZvaWQge1xuICAgIGlmIChmaWxlKSB7XG4gICAgICBjb25zdCBkcm9wTmFtZSA9XG4gICAgICAgIHRoaXMuI2ZpbGVJdGVtU2VydmljZS5pc0ZpbGUoZmlsZSkgJiYgZmlsZS5maWxlLm5hbWVcbiAgICAgICAgICA/IGZpbGUuZmlsZS5uYW1lXG4gICAgICAgICAgOiBmaWxlLnVybDtcblxuICAgICAgdGhpcy5maWxlTmFtZSA9IGRyb3BOYW1lO1xuXG4gICAgICBpZiAoZHJvcE5hbWUubGVuZ3RoID4gMjYpIHtcbiAgICAgICAgdGhpcy50cnVuY2F0ZWRGaWxlTmFtZSA9IGRyb3BOYW1lLnNsaWNlKDAsIDI2KSArICcuLi4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50cnVuY2F0ZWRGaWxlTmFtZSA9IGRyb3BOYW1lO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbGVOYW1lID0gJyc7XG4gICAgICB0aGlzLnRydW5jYXRlZEZpbGVOYW1lID0gJyc7XG4gICAgfVxuICB9XG5cbiAgI3VwZGF0ZUZpbGVBdHRhY2htZW50QnV0dG9uKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0ZpbGVBdHRhY2htZW50QnV0dG9uID0gIShcbiAgICAgIHRoaXMudmFsdWUgJiYgdGhpcy5jdXJyZW50VGhlbWVOYW1lID09PSAnbW9kZXJuJ1xuICAgICk7XG4gICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMsIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgI29uQ2hhbmdlID0gKF86IGFueSk6IHZvaWQgPT4ge1xuICAgIHJldHVybjtcbiAgfTtcbiAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAjb25Ub3VjaGVkID0gKCk6IHZvaWQgPT4ge1xuICAgIHJldHVybjtcbiAgfTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJza3ktZmlsZS1hdHRhY2htZW50LXdyYXBwZXJcIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwic2t5LWZpbGUtYXR0YWNobWVudC1sYWJlbC13cmFwcGVyXCJcbiAgICBbYXR0ci5pZF09XCJsYWJlbEVsZW1lbnRJZFwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgJ3NreS1jb250cm9sLWxhYmVsLXJlcXVpcmVkJzogIWxhYmVsVGV4dCAmJiByZXF1aXJlZCAmJiBoYXNMYWJlbENvbXBvbmVudCxcbiAgICB9XCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsYWJlbFRleHQ7IGVsc2UgbGFiZWxDb250ZW50XCI+XG4gICAgICA8c3BhblxuICAgICAgICAqbmdJZj1cIiFsYWJlbEhpZGRlblwiXG4gICAgICAgIGNsYXNzPVwic2t5LWNvbnRyb2wtbGFiZWwgc2t5LW1hcmdpbi1pbmxpbmUteHNcIlxuICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgJ3NreS1jb250cm9sLWxhYmVsLXJlcXVpcmVkJzogcmVxdWlyZWQsXG4gICAgICAgIH1cIlxuICAgICAgICA+e3sgbGFiZWxUZXh0IH19PC9zcGFuXG4gICAgICA+PHNreS1oZWxwLWlubGluZVxuICAgICAgICAqbmdJZj1cImhlbHBQb3BvdmVyQ29udGVudCB8fCBoZWxwS2V5XCJcbiAgICAgICAgW2xhYmVsVGV4dF09XCJsYWJlbFRleHRcIlxuICAgICAgICBbaGVscEtleV09XCJoZWxwS2V5XCJcbiAgICAgICAgW3BvcG92ZXJUaXRsZV09XCJoZWxwUG9wb3ZlclRpdGxlXCJcbiAgICAgICAgW3BvcG92ZXJDb250ZW50XT1cImhlbHBQb3BvdmVyQ29udGVudFwiXG4gICAgICAvPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxzcGFuXG4gICAgICBjbGFzcz1cInNreS1zY3JlZW4tcmVhZGVyLW9ubHlcIlxuICAgICAgKm5nSWY9XCJyZXF1aXJlZCAmJiAoaGFzTGFiZWxDb21wb25lbnQgfHwgbGFiZWxUZXh0KVwiXG4gICAgICA+e3sgJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9yZXF1aXJlZCcgfCBza3lMaWJSZXNvdXJjZXMgfX08L3NwYW5cbiAgICA+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJza3ktZmlsZS1hdHRhY2htZW50LXVwbG9hZCBza3ktZmlsZS1hdHRhY2htZW50IHNreS1maWxlLWF0dGFjaG1lbnQtdGFyZ2V0XCJcbiAgICBbbmdDbGFzc109XCJ7XG4gICAgICAnc2t5LWZpbGUtYXR0YWNobWVudC1hY2NlcHQnOiBhY2NlcHRlZE92ZXIsXG4gICAgICAnc2t5LWZpbGUtYXR0YWNobWVudC1yZWplY3QnOiByZWplY3RlZE92ZXIsXG4gICAgfVwiXG4gICAgKGRyYWdlbnRlcik9XCJmaWxlRHJhZ0VudGVyKCRldmVudClcIlxuICAgIChkcmFnb3Zlcik9XCJmaWxlRHJhZ092ZXIoJGV2ZW50KVwiXG4gICAgKGRyYWdsZWF2ZSk9XCJmaWxlRHJhZ0xlYXZlKCRldmVudClcIlxuICAgIChkcm9wKT1cImZpbGVEcm9wKCRldmVudClcIlxuICA+XG4gICAgPGRpdlxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgIGNsYXNzPVwic2t5LXNjcmVlbi1yZWFkZXItb25seVwiXG4gICAgICByb2xlPVwidG9vbHRpcFwiXG4gICAgICBbYXR0ci5pZF09XCJmaWxlRHJvcERlc2NyaXB0aW9uRWxlbWVudElkXCJcbiAgICA+XG4gICAgICB7eyAnc2t5dXhfZmlsZV9hdHRhY2htZW50X2ZpbGVfdXBsb2FkX2RyYWdfb3JfY2xpY2snIHwgc2t5TGliUmVzb3VyY2VzIH19XG4gICAgPC9kaXY+XG4gICAgPGlucHV0XG4gICAgICBoaWRkZW5cbiAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgW2F0dHIuYWNjZXB0XT1cImFjY2VwdGVkVHlwZXMgfHwgbnVsbFwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgIChjaGFuZ2UpPVwiZmlsZUNoYW5nZUV2ZW50KCRldmVudClcIlxuICAgICAgI2ZpbGVJbnB1dFxuICAgIC8+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWxlQXR0YWNobWVudEJ1dHRvblwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cInNob3dGaWxlQXR0YWNobWVudEJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwic2t5LWZpbGUtYXR0YWNobWVudC1idG4gc2t5LWJ0biBza3ktYnRuLWRlZmF1bHRcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgc2t5SWRcbiAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJcbiAgICAgICAgICAoaGludFRleHQgPyBoaW50VGV4dEVsLmlkICsgJyAnIDogJycpICsgZmlsZURyb3BEZXNjcmlwdGlvbkVsZW1lbnRJZFxuICAgICAgICBcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICA/ICgnc2t5dXhfZmlsZV9hdHRhY2htZW50X2J1dHRvbl9sYWJlbF9yZXBsYWNlX2ZpbGVfbGFiZWwnXG4gICAgICAgICAgICAgIHwgc2t5TGliUmVzb3VyY2VzOiBmaWxlTmFtZSlcbiAgICAgICAgICAgIDogKCdza3l1eF9maWxlX2F0dGFjaG1lbnRfYnV0dG9uX2xhYmVsX2Nob29zZV9maWxlX2xhYmVsJ1xuICAgICAgICAgICAgICB8IHNreUxpYlJlc291cmNlcylcbiAgICAgICAgXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIlxuICAgICAgICAgIGF0dGFjaEJ1dHRvbi5pZCArXG4gICAgICAgICAgJyAnICtcbiAgICAgICAgICAobGFiZWxUZXh0XG4gICAgICAgICAgICA/IGxhYmVsRWxlbWVudElkXG4gICAgICAgICAgICA6IGhhc0xhYmVsQ29tcG9uZW50XG4gICAgICAgICAgICAgID8gbGFiZWxDb21wb25lbnRzPy5nZXQoMCk/LmxhYmVsQ29udGVudElkPy5pZFxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZClcbiAgICAgICAgXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uRHJvcENsaWNrZWQoKVwiXG4gICAgICAgICNhdHRhY2hCdXR0b249XCJza3lJZFwiXG4gICAgICA+XG4gICAgICAgIDxza3ktaWNvbiBpY29uPVwiZm9sZGVyLW9wZW4tb1wiIC8+XG4gICAgICAgIHt7XG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgID8gKCdza3l1eF9maWxlX2F0dGFjaG1lbnRfYnV0dG9uX2xhYmVsX3JlcGxhY2VfZmlsZSdcbiAgICAgICAgICAgICAgfCBza3lMaWJSZXNvdXJjZXMpXG4gICAgICAgICAgICA6ICgnc2t5dXhfZmlsZV9hdHRhY2htZW50X2J1dHRvbl9sYWJlbF9jaG9vc2VfZmlsZSdcbiAgICAgICAgICAgICAgfCBza3lMaWJSZXNvdXJjZXMpXG4gICAgICAgIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8c2t5LWljb25cbiAgICAgICpuZ0lmPVwidmFsdWUgJiYgIWlzSW1hZ2UgJiYgY3VycmVudFRoZW1lTmFtZSA9PT0gJ21vZGVybidcIlxuICAgICAgY2xhc3M9XCJza3ktZmlsZS1hdHRhY2htZW50LWljb24gc2t5LWRlZW1waGFzaXplZFwiXG4gICAgICBpY29uPVwiZmlsZS1vXCJcbiAgICAgIHNpemU9XCIyeFwiXG4gICAgLz5cbiAgICA8c3BhblxuICAgICAgKm5nSWY9XCJ2YWx1ZSB8fCBjdXJyZW50VGhlbWVOYW1lID09PSAnZGVmYXVsdCdcIlxuICAgICAgY2xhc3M9XCJza3ktZmlsZS1hdHRhY2htZW50LW5hbWVcIlxuICAgID5cbiAgICAgIDxhXG4gICAgICAgICpuZ0lmPVwidmFsdWU7IGVsc2Ugbm9GaWxlXCJcbiAgICAgICAgW2F0dHIudGl0bGVdPVwiZmlsZU5hbWVcIlxuICAgICAgICAoY2xpY2spPVwiZW1pdENsaWNrKClcIlxuICAgICAgPlxuICAgICAgICB7eyB0cnVuY2F0ZWRGaWxlTmFtZSB9fVxuICAgICAgPC9hPlxuICAgIDwvc3Bhbj5cbiAgICA8bmctdGVtcGxhdGUgI25vRmlsZT5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2t5LWZpbGUtYXR0YWNobWVudC1ub25lIHNreS1kZWVtcGhhc2l6ZWRcIj5cbiAgICAgICAge3sgJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9sYWJlbF9ub19maWxlX2Nob3NlbicgfCBza3lMaWJSZXNvdXJjZXMgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwidmFsdWVcIlxuICAgICAgY2xhc3M9XCJza3ktYnRuIHNreS1idG4tYm9yZGVybGVzcyBza3ktZmlsZS1hdHRhY2htZW50LWRlbGV0ZVwiXG4gICAgICBza3lJZFxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAnc2t5dXhfZmlsZV9hdHRhY2htZW50X2ZpbGVfaXRlbV9yZW1vdmUnIHwgc2t5TGliUmVzb3VyY2VzOiBmaWxlTmFtZVxuICAgICAgXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJcbiAgICAgICAgZGVsZXRlQnV0dG9uLmlkICtcbiAgICAgICAgJyAnICtcbiAgICAgICAgKGhhc0xhYmVsQ29tcG9uZW50XG4gICAgICAgICAgPyBsYWJlbENvbXBvbmVudHM/LmdldCgwKT8ubGFiZWxDb250ZW50SWQ/LmlkXG4gICAgICAgICAgOiB1bmRlZmluZWQpXG4gICAgICBcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtza3lUaGVtZUNsYXNzXT1cIntcbiAgICAgICAgJ3NreS1idG4taWNvbi1ib3JkZXJsZXNzJzogJ21vZGVybicsXG4gICAgICB9XCJcbiAgICAgIChjbGljayk9XCJkZWxldGVGaWxlQXR0YWNobWVudCgpXCJcbiAgICAgICNkZWxldGVCdXR0b249XCJza3lJZFwiXG4gICAgPlxuICAgICAgPHNreS1pY29uIGljb249XCJ0cmFzaC1vXCIgc2l6ZT1cIm1kXCIgLz5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGltZ1xuICAgICpuZ0lmPVwidmFsdWUgJiYgaXNJbWFnZVwiXG4gICAgY2xhc3M9XCJza3ktZmlsZS1hdHRhY2htZW50LXByZXZpZXctaW1nXCJcbiAgICBbYWx0XT1cIlxuICAgICAgJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9maWxlX3VwbG9hZF9pbWFnZV9wcmV2aWV3X2FsdF90ZXh0J1xuICAgICAgICB8IHNreUxpYlJlc291cmNlc1xuICAgIFwiXG4gICAgW3NyY109XCJ2YWx1ZS51cmxcIlxuICAvPlxuPC9kaXY+XG48ZGl2IHNreUlkICNoaW50VGV4dEVsPVwic2t5SWRcIj5cbiAgPGRpdlxuICAgICpuZ0lmPVwiaGludFRleHRcIlxuICAgIGNsYXNzPVwic2t5LWZvbnQtZGVlbXBoYXNpemVkIHNreS1maWxlLWF0dGFjaG1lbnQtaGludC10ZXh0XCJcbiAgPlxuICAgIHt7IGhpbnRUZXh0IH19XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxza3ktZm9ybS1lcnJvcnNcbiAgKm5nSWY9XCJsYWJlbFRleHQgJiYgKG5nQ29udHJvbD8uY29udHJvbD8uZXJyb3JzIHx8IGZpbGVFcnJvclZhbGlkYXRpb24pXCJcbiAgW2lkXT1cImVycm9ySWRcIlxuICBbZXJyb3JzXT1cIlxuICAgIG5nQ29udHJvbD8uZXJyb3JzICE9PSBudWxsID8gbmdDb250cm9sPy5lcnJvcnMgOiBmaWxlRXJyb3JWYWxpZGF0aW9uXG4gIFwiXG4gIFtsYWJlbFRleHRdPVwibGFiZWxUZXh0XCJcbiAgW3Nob3dFcnJvcnNdPVwibmdDb250cm9sPy50b3VjaGVkIHx8IG5nQ29udHJvbD8uZGlydHlcIlxuPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJza3ktZm9ybS1lcnJvclwiIC8+XG4gIDxza3ktZm9ybS1lcnJvclxuICAgICpuZ0lmPVwiZmlsZUVycm9yTmFtZSA9PT0gJ2ZpbGVUeXBlJ1wiXG4gICAgW2Vycm9yTmFtZV09XCInZmlsZVR5cGUnXCJcbiAgICBbZXJyb3JUZXh0XT1cIlxuICAgICAgJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9maWxlX3R5cGVfZXJyb3JfbGFiZWxfdGV4dCdcbiAgICAgICAgfCBza3lMaWJSZXNvdXJjZXM6IGZpbGVFcnJvclBhcmFtXG4gICAgXCJcbiAgLz5cbiAgPHNreS1mb3JtLWVycm9yXG4gICAgKm5nSWY9XCJmaWxlRXJyb3JOYW1lID09PSAnbWF4RmlsZVNpemUnXCJcbiAgICBbZXJyb3JOYW1lXT1cIidtYXhGaWxlU2l6ZSdcIlxuICAgIFtlcnJvclRleHRdPVwiXG4gICAgICAnc2t5dXhfZmlsZV9hdHRhY2htZW50X21heF9maWxlX3NpemVfZXJyb3JfbGFiZWxfdGV4dCdcbiAgICAgICAgfCBza3lMaWJSZXNvdXJjZXM6IChmaWxlRXJyb3JQYXJhbSB8IHNreUZpbGVTaXplKVxuICAgIFwiXG4gIC8+XG4gIDxza3ktZm9ybS1lcnJvclxuICAgICpuZ0lmPVwiZmlsZUVycm9yTmFtZSA9PT0gJ21pbkZpbGVTaXplJ1wiXG4gICAgW2Vycm9yTmFtZV09XCInbWluRmlsZVNpemUnXCJcbiAgICBbZXJyb3JUZXh0XT1cIlxuICAgICAgJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9taW5fZmlsZV9zaXplX2Vycm9yX2xhYmVsX3RleHQnXG4gICAgICAgIHwgc2t5TGliUmVzb3VyY2VzOiAoZmlsZUVycm9yUGFyYW0gfCBza3lGaWxlU2l6ZSlcbiAgICBcIlxuICAvPlxuPC9za3ktZm9ybS1lcnJvcnM+XG5cbjxuZy10ZW1wbGF0ZSAjbGFiZWxDb250ZW50PlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJza3ktZmlsZS1hdHRhY2htZW50LWxhYmVsXCIgLz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=