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