imm-element-ui 2.6.8 → 2.6.9
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/esm2022/lib/grid/cell-render/upload-renderer.mjs +228 -0
- package/esm2022/lib/grid/grid/grid.component.mjs +15 -4
- package/esm2022/lib/grid/grid-utils.mjs +22 -1
- package/esm2022/lib/grid/mock-data.mjs +4 -2
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/imm-element-ui.mjs +259 -5
- package/fesm2022/imm-element-ui.mjs.map +1 -1
- package/lib/grid/cell-render/upload-renderer.d.ts +36 -0
- package/lib/grid/grid/grid.component.d.ts +2 -0
- package/lib/grid/mock-data.d.ts +2 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/src/lib/grid/grid/grid.component.scss +6 -1
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { HttpClient, HttpEventType, HttpRequest } from '@angular/common/http';
|
|
3
|
+
import { ButtonModule } from 'primeng/button';
|
|
4
|
+
import { FileUpload } from 'primeng/fileupload';
|
|
5
|
+
import { filter, forkJoin } from 'rxjs';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "primeng/button";
|
|
8
|
+
export class UploadRenderer {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.http = inject(HttpClient);
|
|
11
|
+
this.uploadParams = {};
|
|
12
|
+
this.fileList = [];
|
|
13
|
+
this.loading = false;
|
|
14
|
+
}
|
|
15
|
+
agInit(params) {
|
|
16
|
+
this.refresh(params);
|
|
17
|
+
}
|
|
18
|
+
refresh(params) {
|
|
19
|
+
this.params = params;
|
|
20
|
+
this.uploadParams = this.resolveUploadParams(params);
|
|
21
|
+
this.fileList = this.toFileList(params.value);
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
uploadHandler(event, fu) {
|
|
25
|
+
const files = Array.from(event.files || []);
|
|
26
|
+
if (!files.length || this.isDisabled()) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const uploadRequests = files.map((file) => this.uploadFile(file));
|
|
30
|
+
this.loading = true;
|
|
31
|
+
forkJoin(uploadRequests).subscribe({
|
|
32
|
+
next: (responses) => {
|
|
33
|
+
const uploadedFiles = responses.map((response) => response.body?.fileName).filter(Boolean);
|
|
34
|
+
this.fileList = [...this.fileList, ...uploadedFiles];
|
|
35
|
+
this.commitValue();
|
|
36
|
+
fu.clear();
|
|
37
|
+
},
|
|
38
|
+
error: () => {
|
|
39
|
+
this.loading = false;
|
|
40
|
+
fu.clear();
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
deleteHandler(file, index) {
|
|
45
|
+
if (this.isDisabled() || this.loading) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
this.loading = true;
|
|
49
|
+
this.delFile(file).subscribe({
|
|
50
|
+
next: () => {
|
|
51
|
+
this.fileList = this.fileList.filter((_, fileIndex) => fileIndex !== index);
|
|
52
|
+
this.commitValue();
|
|
53
|
+
},
|
|
54
|
+
error: () => {
|
|
55
|
+
this.loading = false;
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
isDisabled() {
|
|
60
|
+
if (typeof this.uploadParams.disabled === 'function') {
|
|
61
|
+
return this.uploadParams.disabled(this.params);
|
|
62
|
+
}
|
|
63
|
+
if (this.uploadParams.disabled !== undefined) {
|
|
64
|
+
return this.uploadParams.disabled;
|
|
65
|
+
}
|
|
66
|
+
return Boolean(this.params.context?.gridDisabled?.());
|
|
67
|
+
}
|
|
68
|
+
getDownloadUrl(file) {
|
|
69
|
+
const baseUrl = this.uploadParams.downloadBaseUrl ?? 'https://file-filer.myfoodiepet.com/';
|
|
70
|
+
return `${baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`}${file}`;
|
|
71
|
+
}
|
|
72
|
+
uploadFile(file) {
|
|
73
|
+
const formData = new FormData();
|
|
74
|
+
formData.append('file', file);
|
|
75
|
+
return this.http
|
|
76
|
+
.request(new HttpRequest('POST', this.uploadParams.url ?? 'filerUpload', formData, {
|
|
77
|
+
reportProgress: true,
|
|
78
|
+
withCredentials: this.uploadParams.withCredentials ?? false,
|
|
79
|
+
}))
|
|
80
|
+
.pipe(filter((response) => response.type == HttpEventType.Response));
|
|
81
|
+
}
|
|
82
|
+
delFile(file) {
|
|
83
|
+
return this.http.post(this.uploadParams.deleteUrl ?? 'filerDelete', { fileName: file });
|
|
84
|
+
}
|
|
85
|
+
commitValue() {
|
|
86
|
+
this.loading = false;
|
|
87
|
+
const field = this.params.colDef?.field;
|
|
88
|
+
if (!field) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const oldValue = this.params.data?.[field];
|
|
92
|
+
const newValue = this.toValue(this.fileList);
|
|
93
|
+
const grid = this.params.context?.grid?.();
|
|
94
|
+
this.params.data[field] = newValue;
|
|
95
|
+
grid?.cellValueChanged({
|
|
96
|
+
colDef: this.params.colDef,
|
|
97
|
+
oldValue,
|
|
98
|
+
newValue,
|
|
99
|
+
rowIndex: this.params.node.rowIndex,
|
|
100
|
+
data: this.params.data,
|
|
101
|
+
});
|
|
102
|
+
setTimeout(() => this.params.api.resetRowHeights());
|
|
103
|
+
}
|
|
104
|
+
resolveUploadParams(params) {
|
|
105
|
+
if (typeof params.colDef?.cellRendererParams === 'function') {
|
|
106
|
+
return params.colDef.cellRendererParams(params) || {};
|
|
107
|
+
}
|
|
108
|
+
return params.colDef?.cellRendererParams || {};
|
|
109
|
+
}
|
|
110
|
+
toFileList(value) {
|
|
111
|
+
if (Array.isArray(value)) {
|
|
112
|
+
return value.filter(Boolean);
|
|
113
|
+
}
|
|
114
|
+
return typeof value === 'string' && value.length > 0 ? value.split(';').filter(Boolean) : [];
|
|
115
|
+
}
|
|
116
|
+
toValue(files) {
|
|
117
|
+
return files.join(';');
|
|
118
|
+
}
|
|
119
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UploadRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
120
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: UploadRenderer, isStandalone: true, selector: "ng-component", ngImport: i0, template: `
|
|
121
|
+
<div class="upload-renderer">
|
|
122
|
+
<p-fileUpload
|
|
123
|
+
#fu
|
|
124
|
+
auto
|
|
125
|
+
mode="basic"
|
|
126
|
+
[name]="uploadParams.name || 'file'"
|
|
127
|
+
[multiple]="uploadParams.multiple ?? true"
|
|
128
|
+
[accept]="uploadParams.accept"
|
|
129
|
+
[maxFileSize]="uploadParams.maxFileSize"
|
|
130
|
+
[fileLimit]="uploadParams.fileLimit"
|
|
131
|
+
[withCredentials]="uploadParams.withCredentials ?? false"
|
|
132
|
+
[customUpload]="true"
|
|
133
|
+
[disabled]="isDisabled() || loading"
|
|
134
|
+
mode="advanced"
|
|
135
|
+
[styleClass]="'upload-renderer-choose'"
|
|
136
|
+
(uploadHandler)="uploadHandler($event, fu)">
|
|
137
|
+
<ng-template
|
|
138
|
+
#header
|
|
139
|
+
let-chooseCallback="chooseCallback">
|
|
140
|
+
<p-button
|
|
141
|
+
icon="pi pi-cloud-upload"
|
|
142
|
+
[text]="true"
|
|
143
|
+
size="small"
|
|
144
|
+
[disabled]="isDisabled() || loading"
|
|
145
|
+
(onClick)="chooseCallback()" />
|
|
146
|
+
</ng-template>
|
|
147
|
+
</p-fileUpload>
|
|
148
|
+
|
|
149
|
+
<div class="upload-renderer-files">
|
|
150
|
+
@for (file of fileList; track index; let index = $index) {
|
|
151
|
+
<div class="upload-renderer-file">
|
|
152
|
+
<a
|
|
153
|
+
class="upload-renderer-file-name"
|
|
154
|
+
[href]="getDownloadUrl(file)"
|
|
155
|
+
[download]="file"
|
|
156
|
+
target="_blank"
|
|
157
|
+
(click)="$event.stopPropagation()"
|
|
158
|
+
>{{ file }}</a
|
|
159
|
+
>
|
|
160
|
+
<p-button
|
|
161
|
+
icon="pi pi-times"
|
|
162
|
+
severity="danger"
|
|
163
|
+
size="small"
|
|
164
|
+
[text]="true"
|
|
165
|
+
[disabled]="isDisabled() || loading"
|
|
166
|
+
(onClick)="deleteHandler(file, index)" />
|
|
167
|
+
</div>
|
|
168
|
+
}
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
`, isInline: true, styles: [".upload-renderer{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:2px;width:100%;min-width:0;padding:2px 0}:host ::ng-deep .upload-renderer-choose{display:inline-flex;align-items:center;width:28px;height:28px;border:0;background:transparent}:host ::ng-deep .upload-renderer-choose .p-fileupload-header{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;background:transparent}:host ::ng-deep .upload-renderer-choose .p-fileupload-content{display:none;padding:0;border:0}:host ::ng-deep .upload-renderer-choose .p-button,:host ::ng-deep .upload-renderer-choose p-button{width:28px;height:28px;padding:0}:host ::ng-deep .upload-renderer-choose .p-button-label{display:none}.upload-renderer-files{display:flex;flex-direction:column;align-items:stretch;gap:2px;width:100%;min-width:0;overflow:hidden}.upload-renderer-file{display:flex;align-items:center;justify-content:space-between;gap:4px;min-width:0;width:100%}.upload-renderer-file-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--p-primary-color);text-decoration:none}.upload-renderer-file-name:hover{text-decoration:underline}\n"], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: FileUpload, selector: "p-fileupload, p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "chooseButtonProps", "uploadButtonProps", "cancelButtonProps", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError", "onRemoveUploadedFile"] }] }); }
|
|
172
|
+
}
|
|
173
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UploadRenderer, decorators: [{
|
|
174
|
+
type: Component,
|
|
175
|
+
args: [{ standalone: true, imports: [ButtonModule, FileUpload], template: `
|
|
176
|
+
<div class="upload-renderer">
|
|
177
|
+
<p-fileUpload
|
|
178
|
+
#fu
|
|
179
|
+
auto
|
|
180
|
+
mode="basic"
|
|
181
|
+
[name]="uploadParams.name || 'file'"
|
|
182
|
+
[multiple]="uploadParams.multiple ?? true"
|
|
183
|
+
[accept]="uploadParams.accept"
|
|
184
|
+
[maxFileSize]="uploadParams.maxFileSize"
|
|
185
|
+
[fileLimit]="uploadParams.fileLimit"
|
|
186
|
+
[withCredentials]="uploadParams.withCredentials ?? false"
|
|
187
|
+
[customUpload]="true"
|
|
188
|
+
[disabled]="isDisabled() || loading"
|
|
189
|
+
mode="advanced"
|
|
190
|
+
[styleClass]="'upload-renderer-choose'"
|
|
191
|
+
(uploadHandler)="uploadHandler($event, fu)">
|
|
192
|
+
<ng-template
|
|
193
|
+
#header
|
|
194
|
+
let-chooseCallback="chooseCallback">
|
|
195
|
+
<p-button
|
|
196
|
+
icon="pi pi-cloud-upload"
|
|
197
|
+
[text]="true"
|
|
198
|
+
size="small"
|
|
199
|
+
[disabled]="isDisabled() || loading"
|
|
200
|
+
(onClick)="chooseCallback()" />
|
|
201
|
+
</ng-template>
|
|
202
|
+
</p-fileUpload>
|
|
203
|
+
|
|
204
|
+
<div class="upload-renderer-files">
|
|
205
|
+
@for (file of fileList; track index; let index = $index) {
|
|
206
|
+
<div class="upload-renderer-file">
|
|
207
|
+
<a
|
|
208
|
+
class="upload-renderer-file-name"
|
|
209
|
+
[href]="getDownloadUrl(file)"
|
|
210
|
+
[download]="file"
|
|
211
|
+
target="_blank"
|
|
212
|
+
(click)="$event.stopPropagation()"
|
|
213
|
+
>{{ file }}</a
|
|
214
|
+
>
|
|
215
|
+
<p-button
|
|
216
|
+
icon="pi pi-times"
|
|
217
|
+
severity="danger"
|
|
218
|
+
size="small"
|
|
219
|
+
[text]="true"
|
|
220
|
+
[disabled]="isDisabled() || loading"
|
|
221
|
+
(onClick)="deleteHandler(file, index)" />
|
|
222
|
+
</div>
|
|
223
|
+
}
|
|
224
|
+
</div>
|
|
225
|
+
</div>
|
|
226
|
+
`, styles: [".upload-renderer{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:2px;width:100%;min-width:0;padding:2px 0}:host ::ng-deep .upload-renderer-choose{display:inline-flex;align-items:center;width:28px;height:28px;border:0;background:transparent}:host ::ng-deep .upload-renderer-choose .p-fileupload-header{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;background:transparent}:host ::ng-deep .upload-renderer-choose .p-fileupload-content{display:none;padding:0;border:0}:host ::ng-deep .upload-renderer-choose .p-button,:host ::ng-deep .upload-renderer-choose p-button{width:28px;height:28px;padding:0}:host ::ng-deep .upload-renderer-choose .p-button-label{display:none}.upload-renderer-files{display:flex;flex-direction:column;align-items:stretch;gap:2px;width:100%;min-width:0;overflow:hidden}.upload-renderer-file{display:flex;align-items:center;justify-content:space-between;gap:4px;min-width:0;width:100%}.upload-renderer-file-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--p-primary-color);text-decoration:none}.upload-renderer-file-name:hover{text-decoration:underline}\n"] }]
|
|
227
|
+
}] });
|
|
228
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLXJlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW1tLWVsZW1lbnQtdWkvc3JjL2xpYi9ncmlkL2NlbGwtcmVuZGVyL3VwbG9hZC1yZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFhLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUl6RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFjLE1BQU0sTUFBTSxDQUFDOzs7QUErSXBELE1BQU0sT0FBTyxjQUFjO0lBaEkzQjtRQWlJUyxTQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWxDLGlCQUFZLEdBQXlCLEVBQUUsQ0FBQztRQUN4QyxhQUFRLEdBQWEsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBRyxLQUFLLENBQUM7S0F1SGhCO0lBckhBLE1BQU0sQ0FBQyxNQUEyQjtRQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxPQUFPLENBQUMsTUFBMkI7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7SUFFRCxhQUFhLENBQUMs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QU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUYsQ0FBQztJQUVPLE9BQU8sQ0FBQyxLQUFlO1FBQzlCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDOytHQTNIVyxjQUFjO21HQUFkLGNBQWMsd0VBN0hoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBbURULDB2Q0FwRFMsWUFBWSxrYkFBRSxVQUFVOzs0RkE4SHRCLGNBQWM7a0JBaEkxQixTQUFTO2lDQUNHLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsWUFDekI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW1EVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXZlbnQsIEh0dHBFdmVudFR5cGUsIEh0dHBSZXF1ZXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHR5cGUgeyBJQ2VsbFJlbmRlcmVyQW5ndWxhckNvbXAgfSBmcm9tICdhZy1ncmlkLWFuZ3VsYXInO1xuaW1wb3J0IHR5cGUgeyBJQ2VsbFJlbmRlcmVyUGFyYW1zIH0gZnJvbSAnYWctZ3JpZC1jb21tdW5pdHknO1xuaW1wb3J0IHsgR3JpZENvbXBvbmVudCB9IGZyb20gJy4uL2dyaWQvZ3JpZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHsgRmlsZVVwbG9hZCB9IGZyb20gJ3ByaW1lbmcvZmlsZXVwbG9hZCc7XG5pbXBvcnQgeyBmaWx0ZXIsIGZvcmtKb2luLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkUmVuZGVyZXJQYXJhbXMge1xuXHR1cmw/OiBzdHJpbmc7XG5cdGRlbGV0ZVVybD86IHN0cmluZztcblx0ZG93bmxvYWRCYXNlVXJsPzogc3RyaW5nO1xuXHRtdWx0aXBsZT86IGJvb2xlYW47XG5cdGFjY2VwdD86IHN0cmluZztcblx0bWF4RmlsZVNpemU/OiBudW1iZXI7XG5cdGZpbGVMaW1pdD86IG51bWJlcjtcblx0bmFtZT86IHN0cmluZztcblx0d2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjtcblx0ZGlzYWJsZWQ/OiBib29sZWFuIHwgKChwYXJhbXM6IElDZWxsUmVuZGVyZXJQYXJhbXMpID0+IGJvb2xlYW4pO1xufVxuXG5AQ29tcG9uZW50KHtcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0aW1wb3J0czogW0J1dHRvbk1vZHVsZSwgRmlsZVVwbG9hZF0sXG5cdHRlbXBsYXRlOiBgXG5cdFx0PGRpdiBjbGFzcz1cInVwbG9hZC1yZW5kZXJlclwiPlxuXHRcdFx0PHAtZmlsZVVwbG9hZFxuXHRcdFx0XHQjZnVcblx0XHRcdFx0YXV0b1xuXHRcdFx0XHRtb2RlPVwiYmFzaWNcIlxuXHRcdFx0XHRbbmFtZV09XCJ1cGxvYWRQYXJhbXMubmFtZSB8fCAnZmlsZSdcIlxuXHRcdFx0XHRbbXVsdGlwbGVdPVwidXBsb2FkUGFyYW1zLm11bHRpcGxlID8/IHRydWVcIlxuXHRcdFx0XHRbYWNjZXB0XT1cInVwbG9hZFBhcmFtcy5hY2NlcHRcIlxuXHRcdFx0XHRbbWF4RmlsZVNpemVdPVwidXBsb2FkUGFyYW1zLm1heEZpbGVTaXplXCJcblx0XHRcdFx0W2ZpbGVMaW1pdF09XCJ1cGxvYWRQYXJhbXMuZmlsZUxpbWl0XCJcblx0XHRcdFx0W3dpdGhDcmVkZW50aWFsc109XCJ1cGxvYWRQYXJhbXMud2l0aENyZWRlbnRpYWxzID8/IGZhbHNlXCJcblx0XHRcdFx0W2N1c3RvbVVwbG9hZF09XCJ0cnVlXCJcblx0XHRcdFx0W2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoKSB8fCBsb2FkaW5nXCJcblx0XHRcdFx0bW9kZT1cImFkdmFuY2VkXCJcblx0XHRcdFx0W3N0eWxlQ2xhc3NdPVwiJ3VwbG9hZC1yZW5kZXJlci1jaG9vc2UnXCJcblx0XHRcdFx0KHVwbG9hZEhhbmRsZXIpPVwidXBsb2FkSGFuZGxlcigkZXZlbnQsIGZ1KVwiPlxuXHRcdFx0XHQ8bmctdGVtcGxhdGVcblx0XHRcdFx0XHQjaGVhZGVyXG5cdFx0XHRcdFx0bGV0LWNob29zZUNhbGxiYWNrPVwiY2hvb3NlQ2FsbGJhY2tcIj5cblx0XHRcdFx0XHQ8cC1idXR0b25cblx0XHRcdFx0XHRcdGljb249XCJwaSBwaS1jbG91ZC11cGxvYWRcIlxuXHRcdFx0XHRcdFx0W3RleHRdPVwidHJ1ZVwiXG5cdFx0XHRcdFx0XHRzaXplPVwic21hbGxcIlxuXHRcdFx0XHRcdFx0W2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoKSB8fCBsb2FkaW5nXCJcblx0XHRcdFx0XHRcdChvbkNsaWNrKT1cImNob29zZUNhbGxiYWNrKClcIiAvPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PC9wLWZpbGVVcGxvYWQ+XG5cblx0XHRcdDxkaXYgY2xhc3M9XCJ1cGxvYWQtcmVuZGVyZXItZmlsZXNcIj5cblx0XHRcdFx0QGZvciAoZmlsZSBvZiBmaWxlTGlzdDsgdHJhY2sgaW5kZXg7IGxldCBpbmRleCA9ICRpbmRleCkge1xuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ1cGxvYWQtcmVuZGVyZXItZmlsZVwiPlxuXHRcdFx0XHRcdFx0PGFcblx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJ1cGxvYWQtcmVuZGVyZXItZmlsZS1uYW1lXCJcblx0XHRcdFx0XHRcdFx0W2hyZWZdPVwiZ2V0RG93bmxvYWRVcmwoZmlsZSlcIlxuXHRcdFx0XHRcdFx0XHRbZG93bmxvYWRdPVwiZmlsZVwiXG5cdFx0XHRcdFx0XHRcdHRhcmdldD1cIl9ibGFua1wiXG5cdFx0XHRcdFx0XHRcdChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuXHRcdFx0XHRcdFx0XHQ+e3sgZmlsZSB9fTwvYVxuXHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0PHAtYnV0dG9uXG5cdFx0XHRcdFx0XHRcdGljb249XCJwaSBwaS10aW1lc1wiXG5cdFx0XHRcdFx0XHRcdHNldmVyaXR5PVwiZGFuZ2VyXCJcblx0XHRcdFx0XHRcdFx0c2l6ZT1cInNtYWxsXCJcblx0XHRcdFx0XHRcdFx0W3RleHRdPVwidHJ1ZVwiXG5cdFx0XHRcdFx0XHRcdFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKCkgfHwgbG9hZGluZ1wiXG5cdFx0XHRcdFx0XHRcdChvbkNsaWNrKT1cImRlbGV0ZUhhbmRsZXIoZmlsZSwgaW5kZXgpXCIgLz5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0fVxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdGAsXG5cdHN0eWxlczogYFxuXHRcdC51cGxvYWQtcmVuZGVyZXIge1xuXHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdFx0XHRhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblx0XHRcdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHRcdFx0Z2FwOiAycHg7XG5cdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdG1pbi13aWR0aDogMDtcblx0XHRcdHBhZGRpbmc6IDJweCAwO1xuXHRcdH1cblx0XHQ6aG9zdCA6Om5nLWRlZXAgLnVwbG9hZC1yZW5kZXJlci1jaG9vc2Uge1xuXHRcdFx0ZGlzcGxheTogaW5saW5lLWZsZXg7XG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRcdFx0d2lkdGg6IDI4cHg7XG5cdFx0XHRoZWlnaHQ6IDI4cHg7XG5cdFx0XHRib3JkZXI6IDA7XG5cdFx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0XHR9XG5cdFx0Omhvc3QgOjpuZy1kZWVwIC51cGxvYWQtcmVuZGVyZXItY2hvb3NlIC5wLWZpbGV1cGxvYWQtaGVhZGVyIHtcblx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRcdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdFx0XHR3aWR0aDogMjhweDtcblx0XHRcdGhlaWdodDogMjhweDtcblx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHRib3JkZXI6IDA7XG5cdFx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0XHR9XG5cdFx0Omhvc3QgOjpuZy1kZWVwIC51cGxvYWQtcmVuZGVyZXItY2hvb3NlIC5wLWZpbGV1cGxvYWQtY29udGVudCB7XG5cdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdFx0cGFkZGluZzogMDtcblx0XHRcdGJvcmRlcjogMDtcblx0XHR9XG5cdFx0Omhvc3QgOjpuZy1kZWVwIC51cGxvYWQtcmVuZGVyZXItY2hvb3NlIC5wLWJ1dHRvbixcblx0XHQ6aG9zdCA6Om5nLWRlZXAgLnVwbG9hZC1yZW5kZXJlci1jaG9vc2UgcC1idXR0b24ge1xuXHRcdFx0d2lkdGg6IDI4cHg7XG5cdFx0XHRoZWlnaHQ6IDI4cHg7XG5cdFx0XHRwYWRkaW5nOiAwO1xuXHRcdH1cblx0XHQ6aG9zdCA6Om5nLWRlZXAgLnVwbG9hZC1yZW5kZXJlci1jaG9vc2UgLnAtYnV0dG9uLWxhYmVsIHtcblx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0fVxuXHRcdC51cGxvYWQtcmVuZGVyZXItZmlsZXMge1xuXHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdFx0XHRhbGlnbi1pdGVtczogc3RyZXRjaDtcblx0XHRcdGdhcDogMnB4O1xuXHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRtaW4td2lkdGg6IDA7XG5cdFx0XHRvdmVyZmxvdzogaGlkZGVuO1xuXHRcdH1cblx0XHQudXBsb2FkLXJlbmRlcmVyLWZpbGUge1xuXHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdFx0XHRqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cdFx0XHRnYXA6IDRweDtcblx0XHRcdG1pbi13aWR0aDogMDtcblx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdH1cblx0XHQudXBsb2FkLXJlbmRlcmVyLWZpbGUtbmFtZSB7XG5cdFx0XHRtaW4td2lkdGg6IDA7XG5cdFx0XHRvdmVyZmxvdzogaGlkZGVuO1xuXHRcdFx0dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG5cdFx0XHR3aGl0ZS1zcGFjZTogbm93cmFwO1xuXHRcdFx0Y29sb3I6IHZhcigtLXAtcHJpbWFyeS1jb2xvcik7XG5cdFx0XHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cdFx0fVxuXHRcdC51cGxvYWQtcmVuZGVyZXItZmlsZS1uYW1lOmhvdmVyIHtcblx0XHRcdHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuXHRcdH1cblx0YCxcbn0pXG5leHBvcnQgY2xhc3MgVXBsb2FkUmVuZGVyZXIgaW1wbGVtZW50cyBJQ2VsbFJlbmRlcmVyQW5ndWxhckNvbXAge1xuXHRwcml2YXRlIGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XG5cdHBhcmFtcyE6IElDZWxsUmVuZGVyZXJQYXJhbXM7XG5cdHVwbG9hZFBhcmFtczogVXBsb2FkUmVuZGVyZXJQYXJhbXMgPSB7fTtcblx0ZmlsZUxpc3Q6IHN0cmluZ1tdID0gW107XG5cdGxvYWRpbmcgPSBmYWxzZTtcblxuXHRhZ0luaXQocGFyYW1zOiBJQ2VsbFJlbmRlcmVyUGFyYW1zKTogdm9pZCB7XG5cdFx0dGhpcy5yZWZyZXNoKHBhcmFtcyk7XG5cdH1cblxuXHRyZWZyZXNoKHBhcmFtczogSUNlbGxSZW5kZXJlclBhcmFtcyk6IGJvb2xlYW4ge1xuXHRcdHRoaXMucGFyYW1zID0gcGFyYW1zO1xuXHRcdHRoaXMudXBsb2FkUGFyYW1zID0gdGhpcy5yZXNvbHZlVXBsb2FkUGFyYW1zKHBhcmFtcyk7XG5cdFx0dGhpcy5maWxlTGlzdCA9IHRoaXMudG9GaWxlTGlzdChwYXJhbXMudmFsdWUpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0dXBsb2FkSGFuZGxlcihldmVudDogYW55LCBmdTogYW55KSB7XG5cdFx0Y29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKGV2ZW50LmZpbGVzIHx8IFtdKSBhcyBGaWxlW107XG5cdFx0aWYgKCFmaWxlcy5sZW5ndGggfHwgdGhpcy5pc0Rpc2FibGVkKCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgdXBsb2FkUmVxdWVzdHM6IE9ic2VydmFibGU8YW55PltdID0gZmlsZXMubWFwKChmaWxlKSA9PiB0aGlzLnVwbG9hZEZpbGUoZmlsZSkpO1xuXHRcdHRoaXMubG9hZGluZyA9IHRydWU7XG5cdFx0Zm9ya0pvaW4odXBsb2FkUmVxdWVzdHMpLnN1YnNjcmliZSh7XG5cdFx0XHRuZXh0OiAocmVzcG9uc2VzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHVwbG9hZGVkRmlsZXMgPSByZXNwb25zZXMubWFwKChyZXNwb25zZTogYW55KSA9PiByZXNwb25zZS5ib2R5Py5maWxlTmFtZSkuZmlsdGVyKEJvb2xlYW4pO1xuXHRcdFx0XHR0aGlzLmZpbGVMaXN0ID0gWy4uLnRoaXMuZmlsZUxpc3QsIC4uLnVwbG9hZGVkRmlsZXNdO1xuXHRcdFx0XHR0aGlzLmNvbW1pdFZhbHVlKCk7XG5cdFx0XHRcdGZ1LmNsZWFyKCk7XG5cdFx0XHR9LFxuXHRcdFx0ZXJyb3I6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cdFx0XHRcdGZ1LmNsZWFyKCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9XG5cblx0ZGVsZXRlSGFuZGxlcihmaWxlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpIHtcblx0XHRpZiAodGhpcy5pc0Rpc2FibGVkKCkgfHwgdGhpcy5sb2FkaW5nKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMubG9hZGluZyA9IHRydWU7XG5cdFx0dGhpcy5kZWxGaWxlKGZpbGUpLnN1YnNjcmliZSh7XG5cdFx0XHRuZXh0OiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZmlsZUxpc3QgPSB0aGlzLmZpbGVMaXN0LmZpbHRlcigoXywgZmlsZUluZGV4KSA9PiBmaWxlSW5kZXggIT09IGluZGV4KTtcblx0XHRcdFx0dGhpcy5jb21taXRWYWx1ZSgpO1xuXHRcdFx0fSxcblx0XHRcdGVycm9yOiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdGlzRGlzYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0aWYgKHR5cGVvZiB0aGlzLnVwbG9hZFBhcmFtcy5kaXNhYmxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0cmV0dXJuIHRoaXMudXBsb2FkUGFyYW1zLmRpc2FibGVkKHRoaXMucGFyYW1zKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMudXBsb2FkUGFyYW1zLmRpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnVwbG9hZFBhcmFtcy5kaXNhYmxlZDtcblx0XHR9XG5cdFx0cmV0dXJuIEJvb2xlYW4odGhpcy5wYXJhbXMuY29udGV4dD8uZ3JpZERpc2FibGVkPy4oKSk7XG5cdH1cblxuXHRnZXREb3dubG9hZFVybChmaWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGJhc2VVcmwgPSB0aGlzLnVwbG9hZFBhcmFtcy5kb3dubG9hZEJhc2VVcmwgPz8gJ2h0dHBzOi8vZmlsZS1maWxlci5teWZvb2RpZXBldC5jb20vJztcblx0XHRyZXR1cm4gYCR7YmFzZVVybC5lbmRzV2l0aCgnLycpID8gYmFzZVVybCA6IGAke2Jhc2VVcmx9L2B9JHtmaWxlfWA7XG5cdH1cblxuXHRwcml2YXRlIHVwbG9hZEZpbGUoZmlsZTogRmlsZSk6IE9ic2VydmFibGU8YW55PiB7XG5cdFx0Y29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcblx0XHRmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcblx0XHRyZXR1cm4gdGhpcy5odHRwXG5cdFx0XHQucmVxdWVzdChcblx0XHRcdFx0bmV3IEh0dHBSZXF1ZXN0KCdQT1NUJywgdGhpcy51cGxvYWRQYXJhbXMudXJsID8/ICdmaWxlclVwbG9hZCcsIGZvcm1EYXRhLCB7XG5cdFx0XHRcdFx0cmVwb3J0UHJvZ3Jlc3M6IHRydWUsXG5cdFx0XHRcdFx0d2l0aENyZWRlbnRpYWxzOiB0aGlzLnVwbG9hZFBhcmFtcy53aXRoQ3JlZGVudGlhbHMgPz8gZmFsc2UsXG5cdFx0XHRcdH0pLFxuXHRcdFx0KVxuXHRcdFx0LnBpcGUoZmlsdGVyKChyZXNwb25zZTogSHR0cEV2ZW50PGFueT4pID0+IHJlc3BvbnNlLnR5cGUgPT0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBkZWxGaWxlKGZpbGU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMudXBsb2FkUGFyYW1zLmRlbGV0ZVVybCA/PyAnZmlsZXJEZWxldGUnLCB7IGZpbGVOYW1lOiBmaWxlIH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBjb21taXRWYWx1ZSgpIHtcblx0XHR0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblx0XHRjb25zdCBmaWVsZCA9IHRoaXMucGFyYW1zLmNvbERlZj8uZmllbGQ7XG5cdFx0aWYgKCFmaWVsZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBvbGRWYWx1ZSA9IHRoaXMucGFyYW1zLmRhdGE/LltmaWVsZF07XG5cdFx0Y29uc3QgbmV3VmFsdWUgPSB0aGlzLnRvVmFsdWUodGhpcy5maWxlTGlzdCk7XG5cdFx0Y29uc3QgZ3JpZDogR3JpZENvbXBvbmVudCB8IHVuZGVmaW5lZCA9IHRoaXMucGFyYW1zLmNvbnRleHQ/LmdyaWQ/LigpO1xuXHRcdHRoaXMucGFyYW1zLmRhdGFbZmllbGRdID0gbmV3VmFsdWU7XG5cdFx0Z3JpZD8uY2VsbFZhbHVlQ2hhbmdlZCh7XG5cdFx0XHRjb2xEZWY6IHRoaXMucGFyYW1zLmNvbERlZixcblx0XHRcdG9sZFZhbHVlLFxuXHRcdFx0bmV3VmFsdWUsXG5cdFx0XHRyb3dJbmRleDogdGhpcy5wYXJhbXMubm9kZS5yb3dJbmRleCxcblx0XHRcdGRhdGE6IHRoaXMucGFyYW1zLmRhdGEsXG5cdFx0fSBhcyBhbnkpO1xuXHRcdHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wYXJhbXMuYXBpLnJlc2V0Um93SGVpZ2h0cygpKTtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZVVwbG9hZFBhcmFtcyhwYXJhbXM6IElDZWxsUmVuZGVyZXJQYXJhbXMpOiBVcGxvYWRSZW5kZXJlclBhcmFtcyB7XG5cdFx0aWYgKHR5cGVvZiBwYXJhbXMuY29sRGVmPy5jZWxsUmVuZGVyZXJQYXJhbXMgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHJldHVybiBwYXJhbXMuY29sRGVmLmNlbGxSZW5kZXJlclBhcmFtcyhwYXJhbXMpIHx8IHt9O1xuXHRcdH1cblx0XHRyZXR1cm4gcGFyYW1zLmNvbERlZj8uY2VsbFJlbmRlcmVyUGFyYW1zIHx8IHt9O1xuXHR9XG5cblx0cHJpdmF0ZSB0b0ZpbGVMaXN0KHZhbHVlOiBhbnkpOiBzdHJpbmdbXSB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUuZmlsdGVyKEJvb2xlYW4pO1xuXHRcdH1cblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwID8gdmFsdWUuc3BsaXQoJzsnKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcblx0fVxuXG5cdHByaXZhdGUgdG9WYWx1ZShmaWxlczogc3RyaW5nW10pOiBzdHJpbmcge1xuXHRcdHJldHVybiBmaWxlcy5qb2luKCc7Jyk7XG5cdH1cbn1cbiJdfQ==
|