bpm-core 0.0.49 → 0.0.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/esm2022/lib/app/app.component.mjs +6 -6
  2. package/esm2022/lib/components/app-component-sections/activities/activities.component.mjs +6 -5
  3. package/esm2022/lib/components/app-component-sections/approvals/approvals.component.mjs +4 -4
  4. package/esm2022/lib/components/app-component-sections/approvals-workflow/approvals-workflow.component.mjs +5 -5
  5. package/esm2022/lib/components/app-component-sections/faq-sidenav/faq-sidenav.component.mjs +4 -4
  6. package/esm2022/lib/components/app-component-sections/faqs/faqs.component.mjs +4 -4
  7. package/esm2022/lib/components/app-component-sections/feedback-section/feedback-section.component.mjs +4 -4
  8. package/esm2022/lib/components/app-component-sections/form-section/form-section.component.mjs +4 -4
  9. package/esm2022/lib/components/app-component-sections/layout/header/header.component.mjs +4 -4
  10. package/esm2022/lib/components/app-component-sections/layout/layout.component.mjs +4 -4
  11. package/esm2022/lib/components/app-component-sections/layout/side-nav/side-nav.component.mjs +4 -4
  12. package/esm2022/lib/components/app-component-sections/main-request-details/main-request-details.component.mjs +4 -4
  13. package/esm2022/lib/components/app-component-sections/previous-requests/previous-requests.component.mjs +128 -24
  14. package/esm2022/lib/components/app-component-sections/profile-section/profile-section.component.mjs +4 -4
  15. package/esm2022/lib/components/app-component-sections/service-header/service-header.component.mjs +4 -4
  16. package/esm2022/lib/components/app-component-sections/status/status.component.mjs +4 -4
  17. package/esm2022/lib/components/app-component-sections/workflow-section/workflow-section.component.mjs +4 -4
  18. package/esm2022/lib/components/shared-components/action-buttons/action-buttons.component.mjs +4 -4
  19. package/esm2022/lib/components/shared-components/confirmation-popup/confirmation-popup.component.mjs +4 -4
  20. package/esm2022/lib/components/shared-components/delete-popup/delete-popup.component.mjs +4 -4
  21. package/esm2022/lib/components/shared-components/dialogs/confirm-dialog/confirm-dialog.component.mjs +4 -4
  22. package/esm2022/lib/components/shared-components/dialogs/delete-dialog/delete-dialog.component.mjs +4 -4
  23. package/esm2022/lib/components/shared-components/dialogs/submit-dialog/submit-dialog.component.mjs +4 -4
  24. package/esm2022/lib/components/shared-components/form-field/add-attachment-section/add-attachment-section.component.mjs +42 -20
  25. package/esm2022/lib/components/shared-components/form-field/attachment-section/attachment-section.component.mjs +5 -5
  26. package/esm2022/lib/components/shared-components/form-field/base-component/base-component.component.mjs +4 -4
  27. package/esm2022/lib/components/shared-components/form-field/checkbox/checkbox.component.mjs +9 -15
  28. package/esm2022/lib/components/shared-components/form-field/control-value-accessor.directive.mjs +36 -39
  29. package/esm2022/lib/components/shared-components/form-field/custom-searchable-autocomplete/custom-searchable.component.mjs +13 -25
  30. package/esm2022/lib/components/shared-components/form-field/date-picker/date-picker.component.mjs +60 -67
  31. package/esm2022/lib/components/shared-components/form-field/date-range-picker/date-range-picker.component.mjs +75 -80
  32. package/esm2022/lib/components/shared-components/form-field/doc-uploader/docs-uploader.component.mjs +579 -0
  33. package/esm2022/lib/components/shared-components/form-field/form-label/form-label.component.mjs +4 -4
  34. package/esm2022/lib/components/shared-components/form-field/info-item/info-item.component.mjs +6 -8
  35. package/esm2022/lib/components/shared-components/form-field/input/input.component.mjs +11 -10
  36. package/esm2022/lib/components/shared-components/form-field/input-currency/input-currency.component.mjs +6 -8
  37. package/esm2022/lib/components/shared-components/form-field/input-email/input-email.component.mjs +5 -7
  38. package/esm2022/lib/components/shared-components/form-field/input-mask/input-mask.component.mjs +4 -4
  39. package/esm2022/lib/components/shared-components/form-field/input-number/input-number.component.mjs +5 -8
  40. package/esm2022/lib/components/shared-components/form-field/input-telephone/input-telephone.component.mjs +23 -131
  41. package/esm2022/lib/components/shared-components/form-field/radio/radio.component.mjs +29 -27
  42. package/esm2022/lib/components/shared-components/form-field/repeated-list/repeated-list.component.mjs +4 -4
  43. package/esm2022/lib/components/shared-components/form-field/search-employee/search-employee.component.mjs +87 -78
  44. package/esm2022/lib/components/shared-components/form-field/select/select.component.mjs +4 -4
  45. package/esm2022/lib/components/shared-components/form-field/shared-imports.mjs +14 -0
  46. package/esm2022/lib/components/shared-components/form-field/table-list/table-list.component.mjs +4 -4
  47. package/esm2022/lib/components/shared-components/form-field/textarea/special-chars.directive.mjs +4 -4
  48. package/esm2022/lib/components/shared-components/form-field/textarea/textarea.component.mjs +10 -9
  49. package/esm2022/lib/components/shared-components/form-field/toggle-button/toggle-button.component.mjs +33 -32
  50. package/esm2022/lib/components/shared-components/form-field/validation-errors/validation-errors.component.mjs +7 -6
  51. package/esm2022/lib/components/shared-components/index.mjs +1 -2
  52. package/esm2022/lib/components/shared-components/terms-conditions/terms-conditions.component.mjs +4 -4
  53. package/esm2022/lib/components/shared-components/title-section/title-section.component.mjs +4 -4
  54. package/esm2022/lib/directives/ar.directive.mjs +4 -4
  55. package/esm2022/lib/directives/currency.directive.mjs +4 -4
  56. package/esm2022/lib/directives/en.directive.mjs +4 -4
  57. package/esm2022/lib/directives/number.directive.mjs +4 -4
  58. package/esm2022/lib/i18n/ar.mjs +7 -1
  59. package/esm2022/lib/i18n/en.mjs +7 -1
  60. package/esm2022/lib/pipes/currency.pipe.mjs +4 -4
  61. package/esm2022/lib/pipes/format-as-password.pipe.mjs +4 -4
  62. package/esm2022/lib/pipes/status-style.pipe.mjs +4 -4
  63. package/esm2022/lib/services/action.service.ts.mjs +4 -4
  64. package/esm2022/lib/services/core.service.ts.mjs +63 -100
  65. package/esm2022/lib/services/feedBack.service.mjs +4 -4
  66. package/esm2022/lib/services/i18n.service.mjs +4 -4
  67. package/esm2022/lib/services/sidenav.service.mjs +4 -4
  68. package/esm2022/lib/testComponent/general-approver-section/general-approver-section.component.mjs +4 -4
  69. package/esm2022/lib/testComponent/request-details-section/request-details-section.component.mjs +28 -21
  70. package/esm2022/lib/testComponent/services/i18n.service.mjs +4 -4
  71. package/esm2022/lib/testComponent/services/segment-dynamic-loader.service.mjs +4 -4
  72. package/esm2022/lib/validators/string-to-boolean.pipe.mjs +4 -4
  73. package/esm2022/lib/validators/text.directive.mjs +4 -4
  74. package/esm2022/lib/validators/timer.pipe.mjs +4 -4
  75. package/fesm2022/bpm-core.mjs +2568 -2697
  76. package/fesm2022/bpm-core.mjs.map +1 -1
  77. package/lib/app/app.component.d.ts +1 -1
  78. package/lib/components/app-component-sections/previous-requests/previous-requests.component.d.ts +27 -6
  79. package/lib/components/shared-components/form-field/add-attachment-section/add-attachment-section.component.d.ts +9 -5
  80. package/lib/components/shared-components/form-field/checkbox/checkbox.component.d.ts +1 -3
  81. package/lib/components/shared-components/form-field/control-value-accessor.directive.d.ts +15 -7
  82. package/lib/components/shared-components/form-field/custom-searchable-autocomplete/custom-searchable.component.d.ts +2 -5
  83. package/lib/components/shared-components/form-field/date-picker/date-picker.component.d.ts +3 -4
  84. package/lib/components/shared-components/form-field/date-range-picker/date-range-picker.component.d.ts +6 -6
  85. package/lib/components/shared-components/form-field/doc-uploader/docs-uploader.component.d.ts +131 -0
  86. package/lib/components/shared-components/form-field/input-telephone/input-telephone.component.d.ts +5 -27
  87. package/lib/components/shared-components/form-field/radio/radio.component.d.ts +5 -8
  88. package/lib/components/shared-components/form-field/search-employee/search-employee.component.d.ts +4 -6
  89. package/lib/components/shared-components/form-field/shared-imports.d.ts +5 -0
  90. package/lib/components/shared-components/form-field/toggle-button/toggle-button.component.d.ts +7 -8
  91. package/lib/components/shared-components/form-field/validation-errors/validation-errors.component.d.ts +1 -0
  92. package/lib/components/shared-components/index.d.ts +0 -1
  93. package/lib/i18n/ar.d.ts +6 -0
  94. package/lib/i18n/en.d.ts +6 -0
  95. package/lib/services/core.service.ts.d.ts +9 -4
  96. package/lib/testComponent/request-details-section/request-details-section.component.d.ts +1 -0
  97. package/package.json +2 -3
  98. package/src/lib/assets/scss/_general.scss +1 -0
  99. package/src/lib/assets/scss/input-telephone.scss +133 -159
@@ -0,0 +1,579 @@
1
+ import { DeleteDialogComponent } from '../../dialogs/delete-dialog/delete-dialog.component';
2
+ import { NoopScrollStrategy } from '@angular/cdk/overlay';
3
+ /* eslint-disable @angular-eslint/use-lifecycle-interface */
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ /* eslint-disable @angular-eslint/component-selector */
6
+ import { Component, CUSTOM_ELEMENTS_SCHEMA, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core';
7
+ import * as FileSaver from 'file-saver';
8
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
9
+ import { NgClass, NgForOf, NgIf, NgTemplateOutlet } from "@angular/common";
10
+ import { MatError, MatHint } from "@angular/material/form-field";
11
+ import { ControlValueAccessorDirective } from '../control-value-accessor.directive';
12
+ import * as i0 from "@angular/core";
13
+ export class DocsUploaderComponent extends ControlValueAccessorDirective {
14
+ maxSizeFlag = true;
15
+ maxSizeValue;
16
+ wrongExtensionFlag = true;
17
+ useCrop;
18
+ formKey;
19
+ showLabel = true;
20
+ downloadLink = false;
21
+ showActions = true;
22
+ styleHeight = ''; // medium, mini
23
+ fileInputHeight = ''; // medium, mini
24
+ styleWidth = '6';
25
+ hints;
26
+ allowedExtensions = '';
27
+ callApi;
28
+ tooltip;
29
+ attachments;
30
+ optional = false;
31
+ display = '';
32
+ validExtension = true;
33
+ attachType = '';
34
+ error;
35
+ displayedFiles = [];
36
+ selectedTemplateAttachment = new EventEmitter();
37
+ fileNotDuplicated = true;
38
+ allowedFileSize = true;
39
+ getDataFromTemplate = false;
40
+ allowFileContentsWithMultiAttachments = false;
41
+ accept;
42
+ filesize;
43
+ wrongFile = {
44
+ mimeType: "",
45
+ fileContents: "",
46
+ fileName: this.i18n.language == 'ar' ? "امتداد الملف خاطىء" : "Wrong File Extension"
47
+ };
48
+ allAttachments = [];
49
+ uploadForm;
50
+ signType = 'Sign';
51
+ showSignButton = false;
52
+ printType = 'Print';
53
+ showPrintButton = false;
54
+ downloadType = 'Download';
55
+ showDownloadButton = false;
56
+ preventFileContents = false;
57
+ addSignatureClicked = new EventEmitter();
58
+ printActionClicked = new EventEmitter();
59
+ downloadActionClicked = new EventEmitter();
60
+ maxSize = '10';
61
+ inputFile;
62
+ dialog;
63
+ validImageTypes = {
64
+ jpg: ['image/jpeg', 'image/pjpeg'],
65
+ JPG: ['image/jpeg', 'image/pjpeg'],
66
+ jpeg: ['image/jpeg', 'image/pjpeg'],
67
+ png: ['image/png']
68
+ };
69
+ validImgPdfTypes = {
70
+ pdf: ['application/pdf'],
71
+ jpg: ['image/jpeg', 'image/pjpeg'],
72
+ JPG: ['image/jpeg', 'image/pjpeg'],
73
+ jpeg: ['image/jpeg', 'image/pjpeg'],
74
+ bmp: ['image/bmp', 'image/x-windows-bmp'],
75
+ png: ['image/png']
76
+ };
77
+ validFileTypes = {
78
+ 'pdf': ['application/pdf'],
79
+ 'doc': ['application/msword'],
80
+ 'docx': ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
81
+ 'ppt': ['application/vnd.ms-powerpoint'],
82
+ 'pptx': ['application/vnd.openxmlformats-officedocument.presentationml.presentation'],
83
+ 'pps': ['application/vnd.ms-powerpoint'],
84
+ 'ppsx': ['application/vnd.openxmlformats-officedocument.presentationml.slideshow'],
85
+ 'odt': ['application/vnd.oasis.opendocument.text'],
86
+ 'xls': ['application/vnd.ms-excel'],
87
+ 'xlsx': ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
88
+ 'zip': ['application/zip', 'application/x-zip-compressed', 'multipart/x-zip', 'application/zip'],
89
+ 'msg': ['application/vnd.ms-outlook', 'application/msg'],
90
+ 'csv': ['text/csv'],
91
+ 'txt': ['text/plain'],
92
+ 'rtf': ['application/rtf', 'application/x-rtf', 'text/richtext'],
93
+ 'html': ['text/html'],
94
+ // 'mp4': ['video/mp4'],
95
+ // 'm4v': ['video/mp4'],
96
+ 'mov': ['video/quicktime'],
97
+ 'wmv': ['video/x-ms-wmv'],
98
+ // 'avi': ['video/x-msvideo'],
99
+ 'mpg': ['mpg'],
100
+ 'rmvb': ['rmvb'],
101
+ // 'ogv': ['video/ogg'],
102
+ // '3gp': ['video/3gpp', 'audio/3gpp'],
103
+ // '3g2': ['video/3gpp2', 'audio/3gpp'],
104
+ 'jpg': ['image/jpeg', 'image/pjpeg'],
105
+ 'jpeg': ['image/jpeg', 'image/pjpeg'],
106
+ 'png': ['image/png'],
107
+ 'gif': ['image/gif'],
108
+ 'bmp': ['image/bmp', 'image/x-windows-bmp']
109
+ };
110
+ validPdfTypes = {
111
+ 'pdf': ['application/pdf'],
112
+ };
113
+ uploading;
114
+ lengthError;
115
+ downloadUrl;
116
+ ngOnChanges(changes) {
117
+ if (this.attachments?.length) {
118
+ this.allAttachments = [...this.attachments];
119
+ }
120
+ }
121
+ // ngOnInit(): void {
122
+ /* this.resetPropagator.subscribe(this, this.resetAttachmentData);
123
+ this.uploadForm = this.fb.group({
124
+ file: [''],
125
+ name: '',
126
+ });*/
127
+ // }
128
+ resetAttachmentData() {
129
+ if (!this.isReadOnly) {
130
+ if (this.multiple) {
131
+ this.displayedFiles = [];
132
+ this.allAttachments = [];
133
+ this.emit(this.displayedFiles);
134
+ }
135
+ else {
136
+ const emptyObj = {
137
+ mimeType: "",
138
+ fileContents: "",
139
+ fileName: "",
140
+ };
141
+ this.emit(emptyObj);
142
+ this.selectedTemplateAttachment.emit(null);
143
+ }
144
+ }
145
+ }
146
+ getFileType(attachment) {
147
+ if (!attachment.fileName?.includes('.') && attachment.mimeType.includes('.')) {
148
+ return this.checkFileType(attachment.mimeType);
149
+ }
150
+ else if (attachment.fileName) {
151
+ return this.checkFileType(attachment.fileName);
152
+ }
153
+ else {
154
+ return attachment.mimeType;
155
+ }
156
+ }
157
+ checkFileType(attachmentData) {
158
+ if (attachmentData.split('.').pop() == 'msg') {
159
+ return 'email-icon';
160
+ }
161
+ else if (attachmentData.split('.').pop() == 'jpeg') {
162
+ return 'jpg';
163
+ }
164
+ else if (attachmentData.split('.').pop() == 'xlsx' || attachmentData.split('.').pop() == 'xls') {
165
+ return 'application/vnd.ms-excel;charset=utf-8';
166
+ }
167
+ return attachmentData.split('.').pop();
168
+ }
169
+ attch(type, index, field) {
170
+ if (type == "download") {
171
+ if (this.downloadLink) {
172
+ window.open(field?.attachmentId, '_blank', 'top=0,left=0,height=auto,width=auto');
173
+ }
174
+ else {
175
+ if (field && field.attachmentId) {
176
+ this.downloadFile(type, field);
177
+ }
178
+ else if (field && field.fileContents) {
179
+ this.downloadFileNew(field);
180
+ }
181
+ }
182
+ }
183
+ if (type == "delete") {
184
+ if (this.validExtension) {
185
+ if (this.multiple) {
186
+ this.confirmDelete(index);
187
+ }
188
+ else {
189
+ this.removeAttachedFile();
190
+ }
191
+ }
192
+ else {
193
+ this.validExtension = true;
194
+ }
195
+ }
196
+ }
197
+ confirmDelete(index) {
198
+ const dialogRef = this.dialog.open(DeleteDialogComponent, {
199
+ panelClass: ['main-popup', 'confirm-dialog'],
200
+ scrollStrategy: new NoopScrollStrategy(),
201
+ });
202
+ dialogRef.afterClosed().subscribe((returnValue) => {
203
+ if (returnValue == 'yes') {
204
+ this.removeMulti(index);
205
+ }
206
+ });
207
+ }
208
+ removeMulti(index) {
209
+ this.displayedFiles.splice(index, 1);
210
+ this.allAttachments.splice(index, 1);
211
+ }
212
+ downloadFileNew(fileData) {
213
+ const fileType = this.getFileType(fileData);
214
+ const blob = new Blob([fileData.fileContents], { type: fileType });
215
+ FileSaver.saveAs(blob, `${fileData.fileName}`);
216
+ }
217
+ onValueChange(event) {
218
+ if (event?.target?.files?.length > 0) {
219
+ if (this.formKey == 'TSV') {
220
+ const input = event.target;
221
+ this.selectedTemplateAttachment.emit(input.files[0]); ///// test
222
+ }
223
+ const file = event.target.files[0];
224
+ let fileType;
225
+ if (file.name !== null && file.name !== undefined && file.name.endsWith(".msg")) {
226
+ fileType = 'application/vnd.ms-outlook';
227
+ }
228
+ if (this.accept?.length) {
229
+ if (!this.accept.includes(file.type) && !this.accept.includes(fileType)) {
230
+ alert(this.i18n.translate('thisIsInvalidFile'));
231
+ return;
232
+ }
233
+ }
234
+ this.uploadForm?.get('file')?.setValue(file);
235
+ this.uploadForm?.get('name')?.setValue(file?.name);
236
+ }
237
+ if (!this.uploading) {
238
+ const input = event.target;
239
+ if (this.maxSize) {
240
+ this.filesize = ((input.files[0].size / 1024) / 1024).toFixed(4); // MB
241
+ this.maxSizeValue = this.maxSize;
242
+ }
243
+ else {
244
+ this.filesize = ((input.files[0].size / 1024) / 1024).toFixed(4); // MB
245
+ this.maxSizeValue = 1;
246
+ }
247
+ this.maxSizeFlag = +this.filesize < +this.maxSize;
248
+ this.lengthError = this.displayedFiles?.length >= +this.maxLength;
249
+ this.wrongExtensionFlag = this.isValidMimeType(input.files[0].type);
250
+ this.validExtension = this.isValidExtension(input.files[0].name.split('.').pop(), this.type);
251
+ if (!this.lengthError) {
252
+ if (+this.filesize < +this.maxSize) {
253
+ this.allowedFileSize = true;
254
+ if (this.validExtension) {
255
+ if (this.getDataFromTemplate) {
256
+ this.selectedTemplateAttachment.emit(event);
257
+ }
258
+ const obj = new AttatchmentFile(input.files[0].name, input.files[0].name, input.files[0].type, '', this.filesize);
259
+ this.value = new AttatchmentFile(input.files[0].name, input.files[0].name, input.files[0].type, '', this.filesize);
260
+ const reader = new FileReader();
261
+ reader.onload = () => {
262
+ obj.fileContents = reader.result.split(',')[1];
263
+ obj.filesize = this.filesize;
264
+ if (!this.multiple) {
265
+ this.fileNotDuplicated = this.checkFileExistance(obj);
266
+ if (!this.fileNotDuplicated) {
267
+ return;
268
+ }
269
+ this.value.fileContents = reader.result.split(',')[1];
270
+ this.control.setValue(this.value);
271
+ if (this.callApi) {
272
+ this.addAttachments();
273
+ }
274
+ else {
275
+ this.selectedTemplateAttachment.emit(event);
276
+ }
277
+ }
278
+ else {
279
+ this.fileNotDuplicated = this.checkFileExistance(obj);
280
+ if (this.fileNotDuplicated) {
281
+ this.addMultiAttachments(obj);
282
+ }
283
+ }
284
+ };
285
+ reader.readAsDataURL(input.files[0]);
286
+ }
287
+ else {
288
+ if (this.multiple) {
289
+ return;
290
+ }
291
+ const emptyObj = {
292
+ mimeType: "",
293
+ fileContents: "",
294
+ fileName: "",
295
+ };
296
+ this.emit(emptyObj);
297
+ this.selectedTemplateAttachment.emit(null);
298
+ }
299
+ }
300
+ else {
301
+ this.allowedFileSize = false;
302
+ }
303
+ }
304
+ event.target.value = '';
305
+ }
306
+ }
307
+ addAttachments() {
308
+ const data = {
309
+ "fileDescription": "",
310
+ "attachmentcomment": "",
311
+ "fileName": this.control.value.fileName,
312
+ "mimeType": this.control.value.mimeType,
313
+ "fileContents": this.control.value.fileContents,
314
+ };
315
+ this.uploading = true;
316
+ this.coreService.getAttachments(data).subscribe({
317
+ next: (form) => {
318
+ const newObj = {
319
+ "fileName": this.control.value.fileName,
320
+ "name": this.control.value.fileName,
321
+ "attachmentId": form.attachment.attachmentId,
322
+ "mimeType": form.attachment.mimeType
323
+ };
324
+ this.control.setValue(newObj);
325
+ this.uploading = false;
326
+ /*this.field = newObj
327
+ this.selectedTemplateAttachment.emit(this.field);
328
+ this.emit(this.field)*/
329
+ },
330
+ error: (err) => {
331
+ this.uploading = false;
332
+ /* this.noError = false;
333
+ this.loading['form'] = false
334
+ this.errorMessage = err?.error?.meta?.messages*/
335
+ }
336
+ });
337
+ }
338
+ addMultiAttachments(field) {
339
+ const data = {
340
+ "fileDescription": "",
341
+ "attachmentcomment": "",
342
+ "fileName": field.fileName,
343
+ "mimeType": field.mimeType,
344
+ "fileContents": field.fileContents,
345
+ };
346
+ this.uploading = true;
347
+ this.coreService.getAttachments(data).subscribe({
348
+ next: (form) => {
349
+ const newObj = {
350
+ "fileName": field.fileName,
351
+ "attachmentId": form.attachment.attachmentId,
352
+ "mimeType": field.mimeType
353
+ };
354
+ if (this.allowFileContentsWithMultiAttachments)
355
+ newObj['fileContents'] = field.fileContents;
356
+ this.displayedFiles = this.displayedFiles?.length ? this.displayedFiles : [];
357
+ this.displayedFiles.push(newObj);
358
+ this.allAttachments.push(newObj);
359
+ this.emit(this.displayedFiles);
360
+ this.control.setValue(newObj);
361
+ /*this.field = newObj
362
+ this.selectedTemplateAttachment.emit(this.field);
363
+ this.emit(this.field)*/
364
+ },
365
+ error: (err) => {
366
+ /* this.noError = false;
367
+ this.loading['form'] = false
368
+ this.errorMessage = err?.error?.meta?.messages*/
369
+ }
370
+ });
371
+ }
372
+ checkFileExistance(file) {
373
+ if (this.allAttachments?.length) {
374
+ return this.allAttachments?.findIndex(($file) => (file.fileName === $file.fileName)) === -1;
375
+ }
376
+ else {
377
+ return true;
378
+ }
379
+ }
380
+ isValidMimeType(value) {
381
+ if (this.attachType == 'pdf') {
382
+ return [].concat(...Object.values(this.validPdfTypes)).includes(value);
383
+ }
384
+ else if (this.attachType == 'image') {
385
+ return [].concat(...Object.values(this.validImageTypes)).includes(value);
386
+ }
387
+ else {
388
+ return true;
389
+ }
390
+ }
391
+ isValidExtension(value, type) {
392
+ if (type == 'image') {
393
+ return [].concat(...Object.keys(this.validImageTypes)).includes(value.toLowerCase());
394
+ }
395
+ else if (type == "imagePdf") {
396
+ return [].concat(...Object.keys(this.validImgPdfTypes)).includes(value.toLowerCase());
397
+ }
398
+ else if (type === "pdf") {
399
+ return [].concat(...Object.keys(this.validPdfTypes)).includes(value.toLowerCase());
400
+ }
401
+ else {
402
+ return [].concat(...Object.keys(this.validFileTypes)).includes(value.toLowerCase());
403
+ }
404
+ }
405
+ removeAttachedFile() {
406
+ // this.field = this.value = new AttatchmentFile(null, null, null, null, null);
407
+ this.control.setValue(new AttatchmentFile(null, null, null, null, null));
408
+ if (this.inputFile) {
409
+ this.inputFile.nativeElement.value = null;
410
+ }
411
+ // this.controller.setValue(this.field);
412
+ this.emit(this.value);
413
+ this.selectedTemplateAttachment.emit(null);
414
+ }
415
+ downloadFile(event, field) {
416
+ this.coreService.loadFile(field.attachmentId).subscribe((responseObject) => {
417
+ const fileInformation = responseObject.body;
418
+ const fileBlob = this.coreService.dataURItoBlob(fileInformation.fileContents);
419
+ const file = new File([fileBlob], fileInformation.fileName, { type: fileInformation.mimeType });
420
+ const blobUrl = URL.createObjectURL(file);
421
+ const link = document.createElement('a');
422
+ link.href = blobUrl;
423
+ link.download = fileInformation.fileName;
424
+ link.click();
425
+ URL.revokeObjectURL(blobUrl);
426
+ }, error => {
427
+ this.toasterService.error(error.error?.['message']);
428
+ });
429
+ }
430
+ addSignature(event) {
431
+ const obj = {
432
+ type: 'openPopupDialog'
433
+ };
434
+ this.addSignatureClicked.emit(obj);
435
+ event?.stopPropagation();
436
+ event?.preventDefault();
437
+ }
438
+ printFileData(event) {
439
+ this.printActionClicked.emit({ event, field: this.control.value });
440
+ }
441
+ downloadFileData(event) {
442
+ this.downloadActionClicked.emit({ event, field: this.control.value });
443
+ }
444
+ getExtension(attachment) {
445
+ if (attachment) {
446
+ if (attachment.split('.').pop() == 'msg') {
447
+ return 'email-icon';
448
+ }
449
+ else if (attachment.split('.').pop() == 'jpeg') {
450
+ return 'jpg';
451
+ }
452
+ return attachment.split('.').pop();
453
+ }
454
+ }
455
+ emit(value) {
456
+ if (this.preventFileContents) {
457
+ value = JSON.parse(JSON.stringify(value));
458
+ this.deleteFileContents(value);
459
+ }
460
+ // this.emitedValue.emit(value);
461
+ }
462
+ deleteFileContents(data) {
463
+ if (typeof data === 'object' && 'fileContents' in data) {
464
+ delete data.fileContents;
465
+ }
466
+ else if (Array.isArray(data)) {
467
+ data.forEach(elem => this.deleteFileContents(elem));
468
+ }
469
+ }
470
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: DocsUploaderComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
471
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: DocsUploaderComponent, isStandalone: true, selector: "app-file-uploader", inputs: { useCrop: "useCrop", formKey: "formKey", showLabel: "showLabel", downloadLink: "downloadLink", showActions: "showActions", styleHeight: "styleHeight", fileInputHeight: "fileInputHeight", styleWidth: "styleWidth", hints: "hints", allowedExtensions: "allowedExtensions", callApi: "callApi", tooltip: "tooltip", attachments: "attachments", optional: "optional", display: "display", attachType: "attachType", error: "error", displayedFiles: "displayedFiles", getDataFromTemplate: "getDataFromTemplate", allowFileContentsWithMultiAttachments: "allowFileContentsWithMultiAttachments", accept: "accept", signType: "signType", showSignButton: "showSignButton", printType: "printType", showPrintButton: "showPrintButton", downloadType: "downloadType", showDownloadButton: "showDownloadButton", preventFileContents: "preventFileContents", maxSize: "maxSize" }, outputs: { selectedTemplateAttachment: "selectedTemplateAttachment", addSignatureClicked: "addSignatureClicked", printActionClicked: "printActionClicked", downloadActionClicked: "downloadActionClicked" }, providers: [
472
+ {
473
+ provide: NG_VALUE_ACCESSOR,
474
+ useExisting: forwardRef(() => DocsUploaderComponent),
475
+ multi: true,
476
+ },
477
+ ], viewQueries: [{ propertyName: "inputFile", first: true, predicate: ["inputFile"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if (!isReadOnly) {\r\n <ng-container>\r\n @if (label) {\r\n <div class=\"d-flex justify-content-between mb-1\">\r\n <span class=\"form-label mb-0\">{{ label }}</span>\r\n @if (!required) {\r\n <span class=\"fs-11 fc-dark-gray\">\r\n {{ i18n.translate('Optional') }}\r\n </span>\r\n }\r\n\r\n </div>\r\n }\r\n\r\n\r\n\r\n <section\r\n [ngClass]=\"insideTable ? 'file-uploader-table' : 'file-uploader'\" class=\" mb-2\"\r\n [class.insideTableStyle]=\"insideTable\">\r\n <div\r\n [ngClass]=\"insideTable ? 'file-uploader-table-dev' : ''\" class=\"file-uploader-input\"\r\n (click)=\"fileAttached.click()\">\r\n @if (!uploading) {\r\n <div class=\"icon mb-1\">\r\n <svg\r\n [ngClass]=\"insideTable ? 'file-uploader-table-svg' : ''\" width=\"41\" height=\"38\" viewBox=\"0 0 41 38\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0 22.1947V20.6736C0.0971303 20.1019 0.070094 19.5141 0.276371 18.9533C1.28372 16.2086 3.21231 14.5023 6.0421 13.8094C6.70499 13.6472 6.68497 13.6632 6.69899 12.9843C6.73203 11.3321 6.99839 9.71992 7.62423 8.17986C8.86289 5.13678 10.9467 2.83969 13.8816 1.39175C17.168 -0.230424 20.5956 -0.450719 24.0553 0.81598C27.4929 2.07467 29.9622 4.41581 31.4802 7.74828C31.7786 8.40316 32.027 9.08307 32.1712 9.79202C32.2402 10.1315 32.4035 10.2566 32.7529 10.3107C36.7012 10.9165 39.3358 13.1255 40.6946 16.8735C40.9069 17.4603 40.9199 18.0731 40.9599 18.6829C40.9649 18.7601 40.9389 18.8442 41 18.9113V20.5124C40.9109 20.995 40.969 21.4937 40.8608 21.9734C40.5244 23.4614 39.8454 24.7821 38.8501 25.9297C37.4522 27.5418 35.7059 28.5882 33.6161 29.0519C32.791 29.2351 31.9499 29.2521 31.1117 29.2922C30.6571 29.3142 30.584 29.193 30.592 28.7484C30.6451 25.8446 29.802 23.2571 27.8624 21.0591C25.9979 18.9463 23.6597 17.7167 20.867 17.4012C18.8553 17.1739 16.9057 17.4593 15.0612 18.3395C11.8319 19.8816 9.81416 22.4069 8.96102 25.8696C8.74273 26.7538 8.68265 27.658 8.70568 28.5702C8.7217 29.2111 8.60254 29.3122 7.95968 29.2972C5.95098 29.2511 4.10551 28.7234 2.58146 27.3596C1.07644 26.0168 0.0680913 24.3996 0.0400537 22.3028C0.0400537 22.2607 0.0250336 22.2257 0 22.1937V22.1947Z\"\r\n fill=\"#DEE0E2\"/>\r\n <path\r\n d=\"M29.0303 28.2632C29.0604 33.4031 24.8657 37.6187 19.6838 37.6548C14.5169 37.6908 10.2852 33.4952 10.2521 28.3042C10.2201 23.1403 14.4297 18.9126 19.6227 18.8946C24.8037 18.8766 28.9993 23.0542 29.0303 28.2632Z\"\r\n fill=\"#8E9AA0\"/>\r\n <path\r\n d=\"M20.5573 25.2644C20.4622 25.4477 20.5012 25.5939 20.5012 25.734C20.4982 28.2154 20.5002 30.6957 20.4982 33.177C20.4982 33.8099 20.2339 34.1704 19.7462 34.2234C19.2645 34.2765 18.88 33.9831 18.8169 33.5025C18.7959 33.3443 18.7969 33.183 18.7969 33.0238C18.7959 30.5826 18.7969 28.1423 18.7969 25.701C18.7969 25.5728 18.7969 25.4447 18.7969 25.2003C18.1971 25.8031 17.6774 26.3288 17.1527 26.8505C17.0115 26.9907 16.8683 27.1349 16.7061 27.2471C16.3566 27.4864 15.9341 27.4413 15.6457 27.154C15.3643 26.8746 15.3203 26.442 15.5486 26.0925C15.6207 25.9824 15.7128 25.8832 15.8069 25.7891C16.8613 24.7307 17.9167 23.6733 18.9732 22.6179C19.4017 22.1893 19.8784 22.1763 20.3039 22.5988C21.3914 23.6803 22.4739 24.7667 23.5533 25.8572C23.9809 26.2898 24.0129 26.8065 23.6534 27.167C23.299 27.5214 22.7753 27.4844 22.3437 27.0568C21.7499 26.47 21.1661 25.8732 20.5603 25.2644H20.5573Z\"\r\n fill=\"#F9F9F9\"/>\r\n </svg>\r\n </div>\r\n }\r\n @if (uploading) {\r\n <ds-icon class=\"sfi sfi-spinner d-inline-block spin fc-coral fs-30-imp\"></ds-icon>\r\n }\r\n\r\n <div class=\"f-14 fc-black fw-normal\">\r\n <span class=\"fc-coral fw-medium\">{{ i18n.translate('browse') }}</span>\r\n </div>\r\n <div class=\"fs-10 fc-dark-gray\">\r\n {{ allowedExtensions ? allowedExtensions : '' }}\r\n </div>\r\n\r\n <input type=\"file\" #inputFile [accept]=\"accept\" class=\"d-none\" #fileAttached (change)=\"onValueChange($event)\">\r\n </div>\r\n\r\n </section>\r\n\r\n @if (hints) {\r\n <div class=\"d-flex align-items-center gap-3 mb-3\">\r\n @for (hint of hints; track hint) {\r\n <ng-container>\r\n <div class=\"d-flex align-items-center gap-1 fs-12\">\r\n <ds-icon\r\n icon=\"{{hint.valid ? 'check-circle-f' : 'check-circle-o'}}\"\r\n class=\"fs-24 {{hint.valid ? 'fc-green' : 'fc-dark-gray'}}\"></ds-icon>\r\n <span class=\"{{hint.valid ? 'fc-black' : 'fc-dark-gray'}}\">{{ hint.label }}</span>\r\n </div>\r\n </ng-container>\r\n }\r\n </div>\r\n }\r\n\r\n @if (hint) {\r\n <mat-hint class=\"d-flex align-items-center gap-1\">\r\n <ds-icon icon=\"info\" class=\"fs-17 fc-dark-gray\"></ds-icon>\r\n <span class=\"fs-12 fc-black line-height-1\">{{ hint }}</span>\r\n </mat-hint>\r\n }\r\n\r\n\r\n @if (multiple) {\r\n <section class=\"files-list\">\r\n @for (file of displayedFiles; track file; let i = $index) {\r\n <div class=\"file-item-container\">\r\n <ds-attachments\r\n [file]=\"file\"\r\n (downloadEvent)=\"attch('download',i,file)\"\r\n (deleteEvent)=\"attch('delete',i,file)\"\r\n [showActions]=\"showActions\">\r\n </ds-attachments>\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n <!-- <mat-error class=\"fs-12\">Test error </mat-error> -->\r\n </div>\r\n }\r\n\r\n </section>\r\n }\r\n\r\n @if (!multiple && (control.value?.fileContents || control.value?.attachmentId)) {\r\n <section class=\"files-list\">\r\n\r\n <!-- {{field | json }} -->\r\n <div class=\"file-item-container file-item-container-actions\">\r\n <ds-attachments\r\n [file]=\"control.value\"\r\n (downloadEvent)=\"attch('download',null,control.value)\"\r\n (deleteEvent)=\"attch('delete',null,control.value)\"\r\n [showActions]=\"showActions\">\r\n </ds-attachments>\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n <ng-container *ngTemplateOutlet=\"attachmentCustomActions\"></ng-container>\r\n <!-- <mat-error class=\"fs-12\">Test error </mat-error> -->\r\n </div>\r\n\r\n\r\n </section>\r\n }\r\n <div class=\"attachments-error\">\r\n\r\n <!-- (!validExtension ) && !multiple -->\r\n @if ((!validExtension)) {\r\n <section class=\"files-list mt-2\">\r\n <div class=\"file-item-container \">\r\n <ds-attachments\r\n [file]=\"wrongFile\" error [showActions]=\"false\">\r\n </ds-attachments>\r\n </div>\r\n </section>\r\n }\r\n\r\n @if (!allowedFileSize) {\r\n <mat-error class=\"fs-12 my-2\">\r\n {{ maxSize === \"0.3\" ? i18n.translate('support3') : i18n.translate('support2') + maxSize + i18n.translate('mb') }}\r\n </mat-error>\r\n }\r\n @if ((!fileNotDuplicated)) {\r\n <mat-error class=\"fs-12 my-2\">{{ i18n.translate('duplicated-error') }}</mat-error>\r\n }\r\n @if (lengthError) {\r\n <mat-error class=\"fs-12\">{{ i18n.translate('lengthError') }} :{{ maxLength }}</mat-error>\r\n }\r\n @if (showErrorMessage) {\r\n <!-- <mat-error class=\"fs-12\">{{errorMessage}} </mat-error> -->\r\n }\r\n\r\n </div>\r\n </ng-container>\r\n}\r\n\r\n\r\n@if (isReadOnly) {\r\n <ng-container>\r\n @if (multiple && displayedFiles) {\r\n <ng-container>\r\n <div class=\"info-item\">\r\n @if (label) {\r\n <span class=\"name\">{{ label }}</span>\r\n }\r\n @if (displayedFiles?.length) {\r\n <span class=\"disc\">\r\n @for (file of displayedFiles; track file; let i = $index) {\r\n <div class=\"file-item-container\">\r\n <ds-attachments\r\n class=\"my-2\" [file]=\"file\" readOnly (attachmentEvent)=\"downloadFile($event,file)\"\r\n [showActions]=\"showActions\">\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n </ds-attachments>\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n </div>\r\n }\r\n\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n </span>\r\n }\r\n @if (!displayedFiles?.length) {\r\n <span class=\"disc\">\r\n {{ i18n.translate('NoAttachments') }}\r\n </span>\r\n }\r\n\r\n </div>\r\n </ng-container>\r\n }\r\n\r\n @if (!multiple && (control.value?.attachmentId || control.value?.fileContents)) {\r\n <ng-container>\r\n <div class=\"info-item\">\r\n @if (label) {\r\n <span class=\"name\">{{ label }}</span>\r\n }\r\n <div class=\"disc file-item-container file-item-container-actions\" [ngClass]=\"{'insideTableWidth':insideTable}\">\r\n @if (control.value?.attachmentId || control.value?.fileContents) {\r\n <ds-attachments\r\n [matTooltip]=\"control.value?.fileName\" [file]=\"control.value\" [showActions]=\"showActions\"\r\n (attachmentEvent)=\"attch($event,null,control.value)\" readOnly>\r\n </ds-attachments>\r\n }\r\n\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n <ng-container *ngTemplateOutlet=\"attachmentCustomActions\"></ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n }\r\n </ng-container>\r\n}\r\n\r\n<ng-template #attachmentCustomActions>\r\n @if (!isDisabled) {\r\n <div class=\"uploaded-file-actions\">\r\n @if (showSignButton) {\r\n <ds-button shape=\"outline\" (click)=\"addSignature($event)\" color=\"red\">\r\n {{ signType }}\r\n </ds-button>\r\n }\r\n @if (showDownloadButton) {\r\n <ds-button shape=\"outline\" (click)=\"downloadFileData($event)\" color=\"red\">\r\n {{ downloadType }}\r\n </ds-button>\r\n }\r\n\r\n @if (showDownloadButton) {\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n }\r\n @if (showPrintButton) {\r\n <ds-button shape=\"outline\" (click)=\"printFileData($event)\" color=\"red\">\r\n {{ printType }}\r\n </ds-button>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n", styles: [".file-uploader{--uploader-height: 150px;--uploader-width: 100%;--uploader-bg: var(--off-white);--uploader-border: 1px dashed var(--dark-gray);--uploader-radius: var(--box-radius);--uploader-padding: 1rem;height:var(--uploader-height);background-color:var(--uploader-bg);border:var(--uploader-border);border-radius:var(--uploader-radius);padding:var(--uploader-padding);text-align:center;cursor:pointer}.insideTableWidth{width:250px!important}.file-uploader-table{--uploader-height: 45PX;--uploader-width: 100%;--uploader-bg: var(--off-white);--uploader-border: 1px dashed var(--dark-gray);--uploader-radius: var(--box-radius);--uploader-padding: 0 1rem;height:var(--uploader-height);background-color:var(--uploader-bg);border:var(--uploader-border);border-radius:var(--uploader-radius);padding:var(--uploader-padding);text-align:center;cursor:pointer;DISPLAY:FLEX;ALIGN-ITEMS:CENTER;JUSTIFY-CONTENT:CENTER}.file-uploader-table-dev{DISPLAY:FLEX;ALIGN-ITEMS:CENTER;GAP:1REM}.file-uploader-table-svg{width:70%}.insideTableStyle{width:272px}.files-list{--file-item-width: 300px;display:grid;grid-template-columns:repeat(auto-fill,var(--file-item-width));grid-gap:.5rem}@media (max-width: 768px){.files-list{grid-template-columns:repeat(auto-fill,minmax(var(--file-item-width),1fr))}}.files-list .file-item-container .uploaded-file-actions{margin-inline-start:20px}.files-list .file-item-container .uploaded-file-actions .button__wrapper{font-size:15px}.files-list .file-item-container .file-item{--file-bg: var(--off-white);--file-radius: var(--box-radius);--icon-color: var(--purple);--icon-size: 2rem;--file-border: transparent;display:flex;align-items:center;background-color:var(--file-bg);border:1px solid var(--file-border);border-radius:var(--file-radius);padding:0 1rem;height:70px;gap:.75rem}.files-list .file-item-container .file-item.error{--file-bg: rgba(var(--rgb-red), 10%);--file-border: var(--red);--icon-color: var(--red)}.files-list .file-item-container .file-item .icon{color:var(--icon-color);font-size:var(--icon-size)}.files-list .file-item-container .file-item .file-action{display:flex;align-items:center;gap:.5rem}ds-attachments::part(base){--file-width: 250px}.file-item-container-actions{display:flex;align-items:center}.file-item-container-actions .uploaded-file-actions{display:flex;align-items:center;gap:10px;margin-inline-start:25px}.file-item-container-actions .uploaded-file-actions .button__wrapper{font-size:15px}::ng-deep .file-item .name-size{display:flex;flex-direction:column;justify-content:center;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:120px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: MatHint, selector: "mat-hint", inputs: ["align", "id"] }] });
478
+ }
479
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: DocsUploaderComponent, decorators: [{
480
+ type: Component,
481
+ args: [{ selector: 'app-file-uploader', schemas: [CUSTOM_ELEMENTS_SCHEMA], standalone: true, imports: [
482
+ NgIf,
483
+ NgClass,
484
+ NgForOf,
485
+ MatError,
486
+ NgTemplateOutlet,
487
+ MatHint
488
+ ], providers: [
489
+ {
490
+ provide: NG_VALUE_ACCESSOR,
491
+ useExisting: forwardRef(() => DocsUploaderComponent),
492
+ multi: true,
493
+ },
494
+ ], template: "@if (!isReadOnly) {\r\n <ng-container>\r\n @if (label) {\r\n <div class=\"d-flex justify-content-between mb-1\">\r\n <span class=\"form-label mb-0\">{{ label }}</span>\r\n @if (!required) {\r\n <span class=\"fs-11 fc-dark-gray\">\r\n {{ i18n.translate('Optional') }}\r\n </span>\r\n }\r\n\r\n </div>\r\n }\r\n\r\n\r\n\r\n <section\r\n [ngClass]=\"insideTable ? 'file-uploader-table' : 'file-uploader'\" class=\" mb-2\"\r\n [class.insideTableStyle]=\"insideTable\">\r\n <div\r\n [ngClass]=\"insideTable ? 'file-uploader-table-dev' : ''\" class=\"file-uploader-input\"\r\n (click)=\"fileAttached.click()\">\r\n @if (!uploading) {\r\n <div class=\"icon mb-1\">\r\n <svg\r\n [ngClass]=\"insideTable ? 'file-uploader-table-svg' : ''\" width=\"41\" height=\"38\" viewBox=\"0 0 41 38\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M0 22.1947V20.6736C0.0971303 20.1019 0.070094 19.5141 0.276371 18.9533C1.28372 16.2086 3.21231 14.5023 6.0421 13.8094C6.70499 13.6472 6.68497 13.6632 6.69899 12.9843C6.73203 11.3321 6.99839 9.71992 7.62423 8.17986C8.86289 5.13678 10.9467 2.83969 13.8816 1.39175C17.168 -0.230424 20.5956 -0.450719 24.0553 0.81598C27.4929 2.07467 29.9622 4.41581 31.4802 7.74828C31.7786 8.40316 32.027 9.08307 32.1712 9.79202C32.2402 10.1315 32.4035 10.2566 32.7529 10.3107C36.7012 10.9165 39.3358 13.1255 40.6946 16.8735C40.9069 17.4603 40.9199 18.0731 40.9599 18.6829C40.9649 18.7601 40.9389 18.8442 41 18.9113V20.5124C40.9109 20.995 40.969 21.4937 40.8608 21.9734C40.5244 23.4614 39.8454 24.7821 38.8501 25.9297C37.4522 27.5418 35.7059 28.5882 33.6161 29.0519C32.791 29.2351 31.9499 29.2521 31.1117 29.2922C30.6571 29.3142 30.584 29.193 30.592 28.7484C30.6451 25.8446 29.802 23.2571 27.8624 21.0591C25.9979 18.9463 23.6597 17.7167 20.867 17.4012C18.8553 17.1739 16.9057 17.4593 15.0612 18.3395C11.8319 19.8816 9.81416 22.4069 8.96102 25.8696C8.74273 26.7538 8.68265 27.658 8.70568 28.5702C8.7217 29.2111 8.60254 29.3122 7.95968 29.2972C5.95098 29.2511 4.10551 28.7234 2.58146 27.3596C1.07644 26.0168 0.0680913 24.3996 0.0400537 22.3028C0.0400537 22.2607 0.0250336 22.2257 0 22.1937V22.1947Z\"\r\n fill=\"#DEE0E2\"/>\r\n <path\r\n d=\"M29.0303 28.2632C29.0604 33.4031 24.8657 37.6187 19.6838 37.6548C14.5169 37.6908 10.2852 33.4952 10.2521 28.3042C10.2201 23.1403 14.4297 18.9126 19.6227 18.8946C24.8037 18.8766 28.9993 23.0542 29.0303 28.2632Z\"\r\n fill=\"#8E9AA0\"/>\r\n <path\r\n d=\"M20.5573 25.2644C20.4622 25.4477 20.5012 25.5939 20.5012 25.734C20.4982 28.2154 20.5002 30.6957 20.4982 33.177C20.4982 33.8099 20.2339 34.1704 19.7462 34.2234C19.2645 34.2765 18.88 33.9831 18.8169 33.5025C18.7959 33.3443 18.7969 33.183 18.7969 33.0238C18.7959 30.5826 18.7969 28.1423 18.7969 25.701C18.7969 25.5728 18.7969 25.4447 18.7969 25.2003C18.1971 25.8031 17.6774 26.3288 17.1527 26.8505C17.0115 26.9907 16.8683 27.1349 16.7061 27.2471C16.3566 27.4864 15.9341 27.4413 15.6457 27.154C15.3643 26.8746 15.3203 26.442 15.5486 26.0925C15.6207 25.9824 15.7128 25.8832 15.8069 25.7891C16.8613 24.7307 17.9167 23.6733 18.9732 22.6179C19.4017 22.1893 19.8784 22.1763 20.3039 22.5988C21.3914 23.6803 22.4739 24.7667 23.5533 25.8572C23.9809 26.2898 24.0129 26.8065 23.6534 27.167C23.299 27.5214 22.7753 27.4844 22.3437 27.0568C21.7499 26.47 21.1661 25.8732 20.5603 25.2644H20.5573Z\"\r\n fill=\"#F9F9F9\"/>\r\n </svg>\r\n </div>\r\n }\r\n @if (uploading) {\r\n <ds-icon class=\"sfi sfi-spinner d-inline-block spin fc-coral fs-30-imp\"></ds-icon>\r\n }\r\n\r\n <div class=\"f-14 fc-black fw-normal\">\r\n <span class=\"fc-coral fw-medium\">{{ i18n.translate('browse') }}</span>\r\n </div>\r\n <div class=\"fs-10 fc-dark-gray\">\r\n {{ allowedExtensions ? allowedExtensions : '' }}\r\n </div>\r\n\r\n <input type=\"file\" #inputFile [accept]=\"accept\" class=\"d-none\" #fileAttached (change)=\"onValueChange($event)\">\r\n </div>\r\n\r\n </section>\r\n\r\n @if (hints) {\r\n <div class=\"d-flex align-items-center gap-3 mb-3\">\r\n @for (hint of hints; track hint) {\r\n <ng-container>\r\n <div class=\"d-flex align-items-center gap-1 fs-12\">\r\n <ds-icon\r\n icon=\"{{hint.valid ? 'check-circle-f' : 'check-circle-o'}}\"\r\n class=\"fs-24 {{hint.valid ? 'fc-green' : 'fc-dark-gray'}}\"></ds-icon>\r\n <span class=\"{{hint.valid ? 'fc-black' : 'fc-dark-gray'}}\">{{ hint.label }}</span>\r\n </div>\r\n </ng-container>\r\n }\r\n </div>\r\n }\r\n\r\n @if (hint) {\r\n <mat-hint class=\"d-flex align-items-center gap-1\">\r\n <ds-icon icon=\"info\" class=\"fs-17 fc-dark-gray\"></ds-icon>\r\n <span class=\"fs-12 fc-black line-height-1\">{{ hint }}</span>\r\n </mat-hint>\r\n }\r\n\r\n\r\n @if (multiple) {\r\n <section class=\"files-list\">\r\n @for (file of displayedFiles; track file; let i = $index) {\r\n <div class=\"file-item-container\">\r\n <ds-attachments\r\n [file]=\"file\"\r\n (downloadEvent)=\"attch('download',i,file)\"\r\n (deleteEvent)=\"attch('delete',i,file)\"\r\n [showActions]=\"showActions\">\r\n </ds-attachments>\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n <!-- <mat-error class=\"fs-12\">Test error </mat-error> -->\r\n </div>\r\n }\r\n\r\n </section>\r\n }\r\n\r\n @if (!multiple && (control.value?.fileContents || control.value?.attachmentId)) {\r\n <section class=\"files-list\">\r\n\r\n <!-- {{field | json }} -->\r\n <div class=\"file-item-container file-item-container-actions\">\r\n <ds-attachments\r\n [file]=\"control.value\"\r\n (downloadEvent)=\"attch('download',null,control.value)\"\r\n (deleteEvent)=\"attch('delete',null,control.value)\"\r\n [showActions]=\"showActions\">\r\n </ds-attachments>\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n <ng-container *ngTemplateOutlet=\"attachmentCustomActions\"></ng-container>\r\n <!-- <mat-error class=\"fs-12\">Test error </mat-error> -->\r\n </div>\r\n\r\n\r\n </section>\r\n }\r\n <div class=\"attachments-error\">\r\n\r\n <!-- (!validExtension ) && !multiple -->\r\n @if ((!validExtension)) {\r\n <section class=\"files-list mt-2\">\r\n <div class=\"file-item-container \">\r\n <ds-attachments\r\n [file]=\"wrongFile\" error [showActions]=\"false\">\r\n </ds-attachments>\r\n </div>\r\n </section>\r\n }\r\n\r\n @if (!allowedFileSize) {\r\n <mat-error class=\"fs-12 my-2\">\r\n {{ maxSize === \"0.3\" ? i18n.translate('support3') : i18n.translate('support2') + maxSize + i18n.translate('mb') }}\r\n </mat-error>\r\n }\r\n @if ((!fileNotDuplicated)) {\r\n <mat-error class=\"fs-12 my-2\">{{ i18n.translate('duplicated-error') }}</mat-error>\r\n }\r\n @if (lengthError) {\r\n <mat-error class=\"fs-12\">{{ i18n.translate('lengthError') }} :{{ maxLength }}</mat-error>\r\n }\r\n @if (showErrorMessage) {\r\n <!-- <mat-error class=\"fs-12\">{{errorMessage}} </mat-error> -->\r\n }\r\n\r\n </div>\r\n </ng-container>\r\n}\r\n\r\n\r\n@if (isReadOnly) {\r\n <ng-container>\r\n @if (multiple && displayedFiles) {\r\n <ng-container>\r\n <div class=\"info-item\">\r\n @if (label) {\r\n <span class=\"name\">{{ label }}</span>\r\n }\r\n @if (displayedFiles?.length) {\r\n <span class=\"disc\">\r\n @for (file of displayedFiles; track file; let i = $index) {\r\n <div class=\"file-item-container\">\r\n <ds-attachments\r\n class=\"my-2\" [file]=\"file\" readOnly (attachmentEvent)=\"downloadFile($event,file)\"\r\n [showActions]=\"showActions\">\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n </ds-attachments>\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n </div>\r\n }\r\n\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n </span>\r\n }\r\n @if (!displayedFiles?.length) {\r\n <span class=\"disc\">\r\n {{ i18n.translate('NoAttachments') }}\r\n </span>\r\n }\r\n\r\n </div>\r\n </ng-container>\r\n }\r\n\r\n @if (!multiple && (control.value?.attachmentId || control.value?.fileContents)) {\r\n <ng-container>\r\n <div class=\"info-item\">\r\n @if (label) {\r\n <span class=\"name\">{{ label }}</span>\r\n }\r\n <div class=\"disc file-item-container file-item-container-actions\" [ngClass]=\"{'insideTableWidth':insideTable}\">\r\n @if (control.value?.attachmentId || control.value?.fileContents) {\r\n <ds-attachments\r\n [matTooltip]=\"control.value?.fileName\" [file]=\"control.value\" [showActions]=\"showActions\"\r\n (attachmentEvent)=\"attch($event,null,control.value)\" readOnly>\r\n </ds-attachments>\r\n }\r\n\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n <ng-container *ngTemplateOutlet=\"attachmentCustomActions\"></ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n }\r\n </ng-container>\r\n}\r\n\r\n<ng-template #attachmentCustomActions>\r\n @if (!isDisabled) {\r\n <div class=\"uploaded-file-actions\">\r\n @if (showSignButton) {\r\n <ds-button shape=\"outline\" (click)=\"addSignature($event)\" color=\"red\">\r\n {{ signType }}\r\n </ds-button>\r\n }\r\n @if (showDownloadButton) {\r\n <ds-button shape=\"outline\" (click)=\"downloadFileData($event)\" color=\"red\">\r\n {{ downloadType }}\r\n </ds-button>\r\n }\r\n\r\n @if (showDownloadButton) {\r\n <a href=\"\" class=\"hidden-placeholder\"></a>\r\n }\r\n @if (showPrintButton) {\r\n <ds-button shape=\"outline\" (click)=\"printFileData($event)\" color=\"red\">\r\n {{ printType }}\r\n </ds-button>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n", styles: [".file-uploader{--uploader-height: 150px;--uploader-width: 100%;--uploader-bg: var(--off-white);--uploader-border: 1px dashed var(--dark-gray);--uploader-radius: var(--box-radius);--uploader-padding: 1rem;height:var(--uploader-height);background-color:var(--uploader-bg);border:var(--uploader-border);border-radius:var(--uploader-radius);padding:var(--uploader-padding);text-align:center;cursor:pointer}.insideTableWidth{width:250px!important}.file-uploader-table{--uploader-height: 45PX;--uploader-width: 100%;--uploader-bg: var(--off-white);--uploader-border: 1px dashed var(--dark-gray);--uploader-radius: var(--box-radius);--uploader-padding: 0 1rem;height:var(--uploader-height);background-color:var(--uploader-bg);border:var(--uploader-border);border-radius:var(--uploader-radius);padding:var(--uploader-padding);text-align:center;cursor:pointer;DISPLAY:FLEX;ALIGN-ITEMS:CENTER;JUSTIFY-CONTENT:CENTER}.file-uploader-table-dev{DISPLAY:FLEX;ALIGN-ITEMS:CENTER;GAP:1REM}.file-uploader-table-svg{width:70%}.insideTableStyle{width:272px}.files-list{--file-item-width: 300px;display:grid;grid-template-columns:repeat(auto-fill,var(--file-item-width));grid-gap:.5rem}@media (max-width: 768px){.files-list{grid-template-columns:repeat(auto-fill,minmax(var(--file-item-width),1fr))}}.files-list .file-item-container .uploaded-file-actions{margin-inline-start:20px}.files-list .file-item-container .uploaded-file-actions .button__wrapper{font-size:15px}.files-list .file-item-container .file-item{--file-bg: var(--off-white);--file-radius: var(--box-radius);--icon-color: var(--purple);--icon-size: 2rem;--file-border: transparent;display:flex;align-items:center;background-color:var(--file-bg);border:1px solid var(--file-border);border-radius:var(--file-radius);padding:0 1rem;height:70px;gap:.75rem}.files-list .file-item-container .file-item.error{--file-bg: rgba(var(--rgb-red), 10%);--file-border: var(--red);--icon-color: var(--red)}.files-list .file-item-container .file-item .icon{color:var(--icon-color);font-size:var(--icon-size)}.files-list .file-item-container .file-item .file-action{display:flex;align-items:center;gap:.5rem}ds-attachments::part(base){--file-width: 250px}.file-item-container-actions{display:flex;align-items:center}.file-item-container-actions .uploaded-file-actions{display:flex;align-items:center;gap:10px;margin-inline-start:25px}.file-item-container-actions .uploaded-file-actions .button__wrapper{font-size:15px}::ng-deep .file-item .name-size{display:flex;flex-direction:column;justify-content:center;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:120px}\n"] }]
495
+ }], propDecorators: { useCrop: [{
496
+ type: Input
497
+ }], formKey: [{
498
+ type: Input
499
+ }], showLabel: [{
500
+ type: Input
501
+ }], downloadLink: [{
502
+ type: Input
503
+ }], showActions: [{
504
+ type: Input
505
+ }], styleHeight: [{
506
+ type: Input
507
+ }], fileInputHeight: [{
508
+ type: Input
509
+ }], styleWidth: [{
510
+ type: Input
511
+ }], hints: [{
512
+ type: Input
513
+ }], allowedExtensions: [{
514
+ type: Input
515
+ }], callApi: [{
516
+ type: Input
517
+ }], tooltip: [{
518
+ type: Input
519
+ }], attachments: [{
520
+ type: Input
521
+ }], optional: [{
522
+ type: Input
523
+ }], display: [{
524
+ type: Input
525
+ }], attachType: [{
526
+ type: Input
527
+ }], error: [{
528
+ type: Input
529
+ }], displayedFiles: [{
530
+ type: Input
531
+ }], selectedTemplateAttachment: [{
532
+ type: Output
533
+ }], getDataFromTemplate: [{
534
+ type: Input
535
+ }], allowFileContentsWithMultiAttachments: [{
536
+ type: Input
537
+ }], accept: [{
538
+ type: Input
539
+ }], signType: [{
540
+ type: Input
541
+ }], showSignButton: [{
542
+ type: Input
543
+ }], printType: [{
544
+ type: Input
545
+ }], showPrintButton: [{
546
+ type: Input
547
+ }], downloadType: [{
548
+ type: Input
549
+ }], showDownloadButton: [{
550
+ type: Input
551
+ }], preventFileContents: [{
552
+ type: Input
553
+ }], addSignatureClicked: [{
554
+ type: Output
555
+ }], printActionClicked: [{
556
+ type: Output
557
+ }], downloadActionClicked: [{
558
+ type: Output
559
+ }], maxSize: [{
560
+ type: Input
561
+ }], inputFile: [{
562
+ type: ViewChild,
563
+ args: ['inputFile']
564
+ }] } });
565
+ class AttatchmentFile {
566
+ fileName;
567
+ name;
568
+ mimeType;
569
+ fileContents;
570
+ filesize;
571
+ constructor(fileName, name, mimeType, fileContents, filesize) {
572
+ this.fileName = fileName;
573
+ this.name = name;
574
+ this.mimeType = mimeType;
575
+ this.fileContents = fileContents;
576
+ this.filesize = filesize;
577
+ }
578
+ }
579
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jcy11cGxvYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9icG0tY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc2hhcmVkLWNvbXBvbmVudHMvZm9ybS1maWVsZC9kb2MtdXBsb2FkZXIvZG9jcy11cGxvYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9icG0tY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc2hhcmVkLWNvbXBvbmVudHMvZm9ybS1maWVsZC9kb2MtdXBsb2FkZXIvZG9jcy11cGxvYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxxREFBcUQsQ0FBQztBQUMxRixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCw0REFBNEQ7QUFDNUQsdURBQXVEO0FBQ3ZELHVEQUF1RDtBQUN2RCxPQUFPLEVBQ0wsU0FBUyxFQUNULHNCQUFzQixFQUV0QixZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBRXhDLE9BQU8sRUFBWSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pFLE9BQU8sRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0scUNBQXFDLENBQUM7O0FBMkJsRixNQUFNLE9BQU8scUJBQTRCLFNBQVEsNkJBQW1DO0lBQ2xGLFdBQVcs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QUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0ksMEJBQTBCO3NCQUFuQyxNQUFNO2dCQUdFLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxxQ0FBcUM7c0JBQTdDLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQVVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNJLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNFLE9BQU87c0JBQWYsS0FBSztnQkFDa0IsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXOztBQTZheEIsTUFBTSxlQUFlO0lBRVY7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUxULFlBQ1MsUUFBZ0IsRUFDaEIsSUFBWSxFQUNaLFFBQWdCLEVBQ2hCLFlBQW9CLEVBQ3BCLFFBQWdCO1FBSmhCLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDaEIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDaEIsaUJBQVksR0FBWixZQUFZLENBQVE7UUFDcEIsYUFBUSxHQUFSLFFBQVEsQ0FBUTtJQUNyQixDQUFDO0NBQ04iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RlbGV0ZURpYWxvZ0NvbXBvbmVudH0gZnJvbSAnLi4vLi4vZGlhbG9ncy9kZWxldGUtZGlhbG9nL2RlbGV0ZS1kaWFsb2cuY29tcG9uZW50JztcclxuaW1wb3J0IHtOb29wU2Nyb2xsU3RyYXRlZ3l9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L3VzZS1saWZlY3ljbGUtaW50ZXJmYWNlICovXHJcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cclxuLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvciAqL1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgRmlsZVNhdmVyIGZyb20gJ2ZpbGUtc2F2ZXInO1xyXG5pbXBvcnQge0RvY3VtZW50RmlsZX0gZnJvbSAnLi4vLi4vLi4vLi4vaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7Rm9ybUdyb3VwLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge05nQ2xhc3MsIE5nRm9yT2YsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXR9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHtNYXRFcnJvciwgTWF0SGludH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGRcIjtcclxuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvckRpcmVjdGl2ZX0gZnJvbSAnLi4vY29udHJvbC12YWx1ZS1hY2Nlc3Nvci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQge01hdERpYWxvZ30gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHtTYWZlVXJsfSBmcm9tIFwiQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlclwiO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWZpbGUtdXBsb2FkZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kb2NzLXVwbG9hZGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kb2NzLXVwbG9hZGVyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTmdJZixcclxuICAgIE5nQ2xhc3MsXHJcbiAgICBOZ0Zvck9mLFxyXG4gICAgTWF0RXJyb3IsXHJcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxyXG4gICAgTWF0SGludFxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEb2NzVXBsb2FkZXJDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRG9jc1VwbG9hZGVyQ29tcG9uZW50PFR5cGU+IGV4dGVuZHMgQ29udHJvbFZhbHVlQWNjZXNzb3JEaXJlY3RpdmU8VHlwZT4gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgbWF4U2l6ZUZsYWcgPSB0cnVlO1xyXG4gIG1heFNpemVWYWx1ZTogYW55O1xyXG4gIHdyb25nRXh0ZW5zaW9uRmxhZyA9IHRydWU7XHJcbiAgQElucHV0KCkgdXNlQ3JvcDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBmb3JtS2V5ITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNob3dMYWJlbCA9IHRydWU7XHJcbiAgQElucHV0KCkgZG93bmxvYWRMaW5rID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2hvd0FjdGlvbnMgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHN0eWxlSGVpZ2h0ID0gJyc7IC8vIG1lZGl1bSwgbWluaVxyXG4gIEBJbnB1dCgpIGZpbGVJbnB1dEhlaWdodCA9ICcnOyAvLyBtZWRpdW0sIG1pbmlcclxuICBASW5wdXQoKSBzdHlsZVdpZHRoID0gJzYnO1xyXG4gIEBJbnB1dCgpIGhpbnRzITogYW55O1xyXG4gIEBJbnB1dCgpIGFsbG93ZWRFeHRlbnNpb25zID0gJyc7XHJcbiAgQElucHV0KCkgY2FsbEFwaTogYm9vbGVhbjtcclxuICBASW5wdXQoKSB0b29sdGlwITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGF0dGFjaG1lbnRzITogYW55W107XHJcbiAgQElucHV0KCkgb3B0aW9uYWwgPSBmYWxzZTtcclxuICBASW5wdXQoKSBkaXNwbGF5ID0gJyc7XHJcbiAgdmFsaWRFeHRlbnNpb24gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGF0dGFjaFR5cGUgPSAnJztcclxuICBASW5wdXQoKSBlcnJvciE6IHN0cmluZztcclxuICBASW5wdXQoKSBkaXNwbGF5ZWRGaWxlczogRG9jdW1lbnRGaWxlW10gPSBbXTtcclxuICBAT3V0cHV0KCkgc2VsZWN0ZWRUZW1wbGF0ZUF0dGFjaG1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgZmlsZU5vdER1cGxpY2F0ZWQgPSB0cnVlO1xyXG4gIGFsbG93ZWRGaWxlU2l6ZSA9IHRydWU7XHJcbiAgQElucHV0KCkgZ2V0RGF0YUZyb21UZW1wbGF0ZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGFsbG93RmlsZUNvbnRlbnRzV2l0aE11bHRpQXR0YWNobWVudHMgPSBmYWxzZTtcclxuICBASW5wdXQoKSBhY2NlcHQ6IHN0cmluZ1tdO1xyXG4gIGZpbGVzaXplOiBzdHJpbmc7XHJcbiAgd3JvbmdGaWxlID0ge1xyXG4gICAgbWltZVR5cGU6IFwiXCIsXHJcbiAgICBmaWxlQ29udGVudHM6IFwiXCIsXHJcbiAgICBmaWxlTmFtZTogdGhpcy5pMThuLmxhbmd1YWdlID09ICdhcicgPyBcItin2YXYqtiv2KfYryDYp9mE2YXZhNmBINiu2KfYt9mJ2KFcIiA6IFwiV3JvbmcgRmlsZSBFeHRlbnNpb25cIlxyXG4gIH1cclxuICBhbGxBdHRhY2htZW50cyA9IFtdO1xyXG5cclxuICB1cGxvYWRGb3JtOiBGb3JtR3JvdXA7XHJcbiAgQElucHV0KCkgc2lnblR5cGUgPSAnU2lnbic7XHJcbiAgQElucHV0KCkgc2hvd1NpZ25CdXR0b24gPSBmYWxzZTtcclxuICBASW5wdXQoKSBwcmludFR5cGUgPSAnUHJpbnQnO1xyXG4gIEBJbnB1dCgpIHNob3dQcmludEJ1dHRvbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGRvd25sb2FkVHlwZSA9ICdEb3dubG9hZCc7XHJcbiAgQElucHV0KCkgc2hvd0Rvd25sb2FkQnV0dG9uID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcHJldmVudEZpbGVDb250ZW50cyA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBhZGRTaWduYXR1cmVDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBwcmludEFjdGlvbkNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGRvd25sb2FkQWN0aW9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBASW5wdXQoKSBtYXhTaXplID0gJzEwJztcclxuICBAVmlld0NoaWxkKCdpbnB1dEZpbGUnKSBpbnB1dEZpbGU6IEVsZW1lbnRSZWY7XHJcbiAgZGlhbG9nOiBNYXREaWFsb2dcclxuXHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRJbWFnZVR5cGVzID0ge1xyXG4gICAganBnOiBbJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvcGpwZWcnXSxcclxuICAgIEpQRzogWydpbWFnZS9qcGVnJywgJ2ltYWdlL3BqcGVnJ10sXHJcbiAgICBqcGVnOiBbJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvcGpwZWcnXSxcclxuICAgIHBuZzogWydpbWFnZS9wbmcnXVxyXG4gIH1cclxuXHJcbiAgdmFsaWRJbWdQZGZUeXBlcyA9IHtcclxuICAgIHBkZjogWydhcHBsaWNhdGlvbi9wZGYnXSxcclxuICAgIGpwZzogWydpbWFnZS9qcGVnJywgJ2ltYWdlL3BqcGVnJ10sXHJcbiAgICBKUEc6IFsnaW1hZ2UvanBlZycsICdpbWFnZS9wanBlZyddLFxyXG4gICAganBlZzogWydpbWFnZS9qcGVnJywgJ2ltYWdlL3BqcGVnJ10sXHJcbiAgICBibXA6IFsnaW1hZ2UvYm1wJywgJ2ltYWdlL3gtd2luZG93cy1ibXAnXSxcclxuICAgIHBuZzogWydpbWFnZS9wbmcnXVxyXG4gIH1cclxuXHJcbiAgdmFsaWRGaWxlVHlwZXMgPSB7XHJcbiAgICAncGRmJzogWydhcHBsaWNhdGlvbi9wZGYnXSxcclxuICAgICdkb2MnOiBbJ2FwcGxpY2F0aW9uL21zd29yZCddLFxyXG4gICAgJ2RvY3gnOiBbJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50J10sXHJcbiAgICAncHB0JzogWydhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCddLFxyXG4gICAgJ3BwdHgnOiBbJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nXSxcclxuICAgICdwcHMnOiBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50J10sXHJcbiAgICAncHBzeCc6IFsnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdyddLFxyXG4gICAgJ29kdCc6IFsnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0J10sXHJcbiAgICAneGxzJzogWydhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnXSxcclxuICAgICd4bHN4JzogWydhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCddLFxyXG4gICAgJ3ppcCc6IFsnYXBwbGljYXRpb24vemlwJywgJ2FwcGxpY2F0aW9uL3gtemlwLWNvbXByZXNzZWQnLCAnbXVsdGlwYXJ0L3gtemlwJywgJ2FwcGxpY2F0aW9uL3ppcCddLFxyXG4gICAgJ21zZyc6IFsnYXBwbGljYXRpb24vdm5kLm1zLW91dGxvb2snLCAnYXBwbGljYXRpb24vbXNnJ10sXHJcbiAgICAnY3N2JzogWyd0ZXh0L2NzdiddLFxyXG4gICAgJ3R4dCc6IFsndGV4dC9wbGFpbiddLFxyXG4gICAgJ3J0Zic6IFsnYXBwbGljYXRpb24vcnRmJywgJ2FwcGxpY2F0aW9uL3gtcnRmJywgJ3RleHQvcmljaHRleHQnXSxcclxuICAgICdodG1sJzogWyd0ZXh0L2h0bWwnXSxcclxuICAgIC8vICdtcDQnOiBbJ3ZpZGVvL21wNCddLFxyXG4gICAgLy8gJ200dic6IFsndmlkZW8vbXA0J10sXHJcbiAgICAnbW92JzogWyd2aWRlby9xdWlja3RpbWUnXSxcclxuICAgICd3bXYnOiBbJ3ZpZGVvL3gtbXMtd212J10sXHJcbiAgICAvLyAnYXZpJzogWyd2aWRlby94LW1zdmlkZW8nXSxcclxuICAgICdtcGcnOiBbJ21wZyddLFxyXG4gICAgJ3JtdmInOiBbJ3JtdmInXSxcclxuICAgIC8vICdvZ3YnOiBbJ3ZpZGVvL29nZyddLFxyXG4gICAgLy8gJzNncCc6IFsndmlkZW8vM2dwcCcsICdhdWRpby8zZ3BwJ10sXHJcbiAgICAvLyAnM2cyJzogWyd2aWRlby8zZ3BwMicsICdhdWRpby8zZ3BwJ10sXHJcbiAgICAnanBnJzogWydpbWFnZS9qcGVnJywgJ2ltYWdlL3BqcGVnJ10sXHJcbiAgICAnanBlZyc6IFsnaW1hZ2UvanBlZycsICdpbWFnZS9wanBlZyddLFxyXG4gICAgJ3BuZyc6IFsnaW1hZ2UvcG5nJ10sXHJcbiAgICAnZ2lmJzogWydpbWFnZS9naWYnXSxcclxuICAgICdibXAnOiBbJ2ltYWdlL2JtcCcsICdpbWFnZS94LXdpbmRvd3MtYm1wJ11cclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkUGRmVHlwZXMgPSB7XHJcbiAgICAncGRmJzogWydhcHBsaWNhdGlvbi9wZGYnXSxcclxuICB9XHJcbiAgdXBsb2FkaW5nOiBib29sZWFuO1xyXG4gIGxlbmd0aEVycm9yOiBib29sZWFuO1xyXG4gIGRvd25sb2FkVXJsOiBTYWZlVXJsO1xyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hdHRhY2htZW50cz8ubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuYWxsQXR0YWNobWVudHMgPSBbLi4udGhpcy5hdHRhY2htZW50c107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAvKiAgdGhpcy5yZXNldFByb3BhZ2F0b3Iuc3Vic2NyaWJlKHRoaXMsIHRoaXMucmVzZXRBdHRhY2htZW50RGF0YSk7XHJcbiAgICB0aGlzLnVwbG9hZEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgZmlsZTogWycnXSxcclxuICAgICAgbmFtZTogJycsXHJcbiAgICB9KTsqL1xyXG5cclxuICAvLyB9XHJcblxyXG4gIHJlc2V0QXR0YWNobWVudERhdGEoKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNSZWFkT25seSkge1xyXG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheWVkRmlsZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmFsbEF0dGFjaG1lbnRzID0gW107XHJcbiAgICAgICAgdGhpcy5lbWl0KHRoaXMuZGlzcGxheWVkRmlsZXMpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgZW1wdHlPYmogPSB7XHJcbiAgICAgICAgICBtaW1lVHlwZTogXCJcIixcclxuICAgICAgICAgIGZpbGVDb250ZW50czogXCJcIixcclxuICAgICAgICAgIGZpbGVOYW1lOiBcIlwiLFxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVtaXQoZW1wdHlPYmopXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlVHlwZShhdHRhY2htZW50OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFhdHRhY2htZW50LmZpbGVOYW1lPy5pbmNsdWRlcygnLicpICYmIGF0dGFjaG1lbnQubWltZVR5cGUuaW5jbHVkZXMoJy4nKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGVja0ZpbGVUeXBlKGF0dGFjaG1lbnQubWltZVR5cGUpO1xyXG4gICAgfSBlbHNlIGlmIChhdHRhY2htZW50LmZpbGVOYW1lKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoZWNrRmlsZVR5cGUoYXR0YWNobWVudC5maWxlTmFtZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gYXR0YWNobWVudC5taW1lVHlwZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tGaWxlVHlwZShhdHRhY2htZW50RGF0YTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmIChhdHRhY2htZW50RGF0YS5zcGxpdCgnLicpLnBvcCgpID09ICdtc2cnKSB7XHJcbiAgICAgIHJldHVybiAnZW1haWwtaWNvbidcclxuICAgIH0gZWxzZSBpZiAoYXR0YWNobWVudERhdGEuc3BsaXQoJy4nKS5wb3AoKSA9PSAnanBlZycpIHtcclxuICAgICAgcmV0dXJuICdqcGcnXHJcbiAgICB9IGVsc2UgaWYgKGF0dGFjaG1lbnREYXRhLnNwbGl0KCcuJykucG9wKCkgPT0gJ3hsc3gnIHx8IGF0dGFjaG1lbnREYXRhLnNwbGl0KCcuJykucG9wKCkgPT0gJ3hscycpIHtcclxuICAgICAgcmV0dXJuICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWw7Y2hhcnNldD11dGYtOCc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXR0YWNobWVudERhdGEuc3BsaXQoJy4nKS5wb3AoKTtcclxuICB9XHJcblxyXG4gIGF0dGNoKHR5cGU6IGFueSwgaW5kZXg6IG51bWJlciwgZmllbGQ6IGFueSkge1xyXG4gICAgaWYgKHR5cGUgPT0gXCJkb3dubG9hZFwiKSB7XHJcbiAgICAgIGlmICh0aGlzLmRvd25sb2FkTGluaykge1xyXG4gICAgICAgIHdpbmRvdy5vcGVuKGZpZWxkPy5hdHRhY2htZW50SWQsICdfYmxhbmsnLCAndG9wPTAsbGVmdD0wLGhlaWdodD1hdXRvLHdpZHRoPWF1dG8nKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQuYXR0YWNobWVudElkKSB7XHJcbiAgICAgICAgICB0aGlzLmRvd25sb2FkRmlsZSh0eXBlLCBmaWVsZCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZCAmJiBmaWVsZC5maWxlQ29udGVudHMpIHtcclxuICAgICAgICAgIHRoaXMuZG93bmxvYWRGaWxlTmV3KGZpZWxkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0eXBlID09IFwiZGVsZXRlXCIpIHtcclxuICAgICAgaWYgKHRoaXMudmFsaWRFeHRlbnNpb24pIHtcclxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgdGhpcy5jb25maXJtRGVsZXRlKGluZGV4KVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZUF0dGFjaGVkRmlsZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudmFsaWRFeHRlbnNpb24gPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25maXJtRGVsZXRlKGluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGVsZXRlRGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgIHBhbmVsQ2xhc3M6IFsnbWFpbi1wb3B1cCcsICdjb25maXJtLWRpYWxvZyddLFxyXG4gICAgICBzY3JvbGxTdHJhdGVneTogbmV3IE5vb3BTY3JvbGxTdHJhdGVneSgpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXR1cm5WYWx1ZSkgPT4ge1xyXG4gICAgICBpZiAocmV0dXJuVmFsdWUgPT0gJ3llcycpIHtcclxuICAgICAgICB0aGlzLnJlbW92ZU11bHRpKGluZGV4KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZU11bHRpKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuZGlzcGxheWVkRmlsZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIHRoaXMuYWxsQXR0YWNobWVudHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICB9XHJcblxyXG4gIGRvd25sb2FkRmlsZU5ldyhmaWxlRGF0YTogYW55KSB7XHJcbiAgICBjb25zdCBmaWxlVHlwZSA9IHRoaXMuZ2V0RmlsZVR5cGUoZmlsZURhdGEpO1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtmaWxlRGF0YS5maWxlQ29udGVudHNdLCB7dHlwZTogZmlsZVR5cGV9KTtcclxuICAgIEZpbGVTYXZlci5zYXZlQXMoYmxvYiwgYCR7ZmlsZURhdGEuZmlsZU5hbWV9YCk7XHJcbiAgfVxyXG5cclxuICBvblZhbHVlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmIChldmVudD8udGFyZ2V0Py5maWxlcz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAodGhpcy5mb3JtS2V5ID09ICdUU1YnKSB7XHJcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQ7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KGlucHV0LmZpbGVzWzBdKSAvLy8vLyB0ZXN0XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGZpbGU6IEZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XHJcbiAgICAgIGxldCBmaWxlVHlwZVxyXG4gICAgICBpZiAoZmlsZS5uYW1lICE9PSBudWxsICYmIGZpbGUubmFtZSAhPT0gdW5kZWZpbmVkICYmIGZpbGUubmFtZS5lbmRzV2l0aChcIi5tc2dcIikpIHtcclxuICAgICAgICBmaWxlVHlwZSA9ICdhcHBsaWNhdGlvbi92bmQubXMtb3V0bG9vaydcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5hY2NlcHQ/Lmxlbmd0aCkge1xyXG4gICAgICAgIGlmICghdGhpcy5hY2NlcHQuaW5jbHVkZXMoZmlsZS50eXBlKSAmJiAhdGhpcy5hY2NlcHQuaW5jbHVkZXMoZmlsZVR5cGUpKSB7XHJcbiAgICAgICAgICBhbGVydCh0aGlzLmkxOG4udHJhbnNsYXRlKCd0aGlzSXNJbnZhbGlkRmlsZScpKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy51cGxvYWRGb3JtPy5nZXQoJ2ZpbGUnKT8uc2V0VmFsdWUoZmlsZSk7XHJcbiAgICAgIHRoaXMudXBsb2FkRm9ybT8uZ2V0KCduYW1lJyk/LnNldFZhbHVlKGZpbGU/Lm5hbWUpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnVwbG9hZGluZykge1xyXG4gICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldDtcclxuICAgICAgaWYgKHRoaXMubWF4U2l6ZSkge1xyXG4gICAgICAgIHRoaXMuZmlsZXNpemUgPSAoKGlucHV0LmZpbGVzWzBdLnNpemUgLyAxMDI0KSAvIDEwMjQpLnRvRml4ZWQoNCk7IC8vIE1CXHJcbiAgICAgICAgdGhpcy5tYXhTaXplVmFsdWUgPSB0aGlzLm1heFNpemU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5maWxlc2l6ZSA9ICgoaW5wdXQuZmlsZXNbMF0uc2l6ZSAvIDEwMjQpIC8gMTAyNCkudG9GaXhlZCg0KTsgLy8gTUJcclxuICAgICAgICB0aGlzLm1heFNpemVWYWx1ZSA9IDE7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tYXhTaXplRmxhZyA9ICt0aGlzLmZpbGVzaXplIDwgK3RoaXMubWF4U2l6ZTtcclxuXHJcbiAgICAgIHRoaXMubGVuZ3RoRXJyb3IgPSB0aGlzLmRpc3BsYXllZEZpbGVzPy5sZW5ndGggPj0gK3RoaXMubWF4TGVuZ3RoO1xyXG5cclxuICAgICAgdGhpcy53cm9uZ0V4dGVuc2lvbkZsYWcgPSB0aGlzLmlzVmFsaWRNaW1lVHlwZShpbnB1dC5maWxlc1swXS50eXBlKTtcclxuICAgICAgdGhpcy52YWxpZEV4dGVuc2lvbiA9IHRoaXMuaXNWYWxpZEV4dGVuc2lvbihpbnB1dC5maWxlc1swXS5uYW1lLnNwbGl0KCcuJykucG9wKCksIHRoaXMudHlwZSk7XHJcblxyXG4gICAgICBpZiAoIXRoaXMubGVuZ3RoRXJyb3IpIHtcclxuICAgICAgICBpZiAoK3RoaXMuZmlsZXNpemUgPCArdGhpcy5tYXhTaXplKSB7XHJcbiAgICAgICAgICB0aGlzLmFsbG93ZWRGaWxlU2l6ZSA9IHRydWU7XHJcbiAgICAgICAgICBpZiAodGhpcy52YWxpZEV4dGVuc2lvbikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXREYXRhRnJvbVRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBvYmogPSBuZXcgQXR0YXRjaG1lbnRGaWxlKGlucHV0LmZpbGVzWzBdLm5hbWUsIGlucHV0LmZpbGVzWzBdLm5hbWUsIGlucHV0LmZpbGVzWzBdLnR5cGUsICcnLCB0aGlzLmZpbGVzaXplKTtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5ldyBBdHRhdGNobWVudEZpbGUoaW5wdXQuZmlsZXNbMF0ubmFtZSwgaW5wdXQuZmlsZXNbMF0ubmFtZSwgaW5wdXQuZmlsZXNbMF0udHlwZSwgJycsIHRoaXMuZmlsZXNpemUpO1xyXG4gICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgIG9iai5maWxlQ29udGVudHMgPSAocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpLnNwbGl0KCcsJylbMV07XHJcbiAgICAgICAgICAgICAgb2JqLmZpbGVzaXplID0gdGhpcy5maWxlc2l6ZTtcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZU5vdER1cGxpY2F0ZWQgPSB0aGlzLmNoZWNrRmlsZUV4aXN0YW5jZShvYmopO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmZpbGVOb3REdXBsaWNhdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUuZmlsZUNvbnRlbnRzID0gKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKS5zcGxpdCgnLCcpWzFdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHRoaXMudmFsdWUpXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYWxsQXBpKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQXR0YWNobWVudHMoKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWxlTm90RHVwbGljYXRlZCA9IHRoaXMuY2hlY2tGaWxlRXhpc3RhbmNlKG9iaik7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWxlTm90RHVwbGljYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmFkZE11bHRpQXR0YWNobWVudHMob2JqKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoaW5wdXQuZmlsZXNbMF0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgZW1wdHlPYmogPSB7XHJcbiAgICAgICAgICAgICAgbWltZVR5cGU6IFwiXCIsXHJcbiAgICAgICAgICAgICAgZmlsZUNvbnRlbnRzOiBcIlwiLFxyXG4gICAgICAgICAgICAgIGZpbGVOYW1lOiBcIlwiLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdChlbXB0eU9iailcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KG51bGwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmFsbG93ZWRGaWxlU2l6ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBldmVudC50YXJnZXQudmFsdWUgPSAnJ1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkQXR0YWNobWVudHMoKSB7XHJcbiAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICBcImZpbGVEZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gICAgICBcImF0dGFjaG1lbnRjb21tZW50XCI6IFwiXCIsXHJcbiAgICAgIFwiZmlsZU5hbWVcIjogdGhpcy5jb250cm9sLnZhbHVlLmZpbGVOYW1lLFxyXG4gICAgICBcIm1pbWVUeXBlXCI6IHRoaXMuY29udHJvbC52YWx1ZS5taW1lVHlwZSxcclxuICAgICAgXCJmaWxlQ29udGVudHNcIjogdGhpcy5jb250cm9sLnZhbHVlLmZpbGVDb250ZW50cyxcclxuICAgIH1cclxuICAgIHRoaXMudXBsb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuY29yZVNlcnZpY2UuZ2V0QXR0YWNobWVudHMoZGF0YSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGZvcm06IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5ld09iaiA9IHtcclxuICAgICAgICAgIFwiZmlsZU5hbWVcIjogdGhpcy5jb250cm9sLnZhbHVlLmZpbGVOYW1lLFxyXG4gICAgICAgICAgXCJuYW1lXCI6IHRoaXMuY29udHJvbC52YWx1ZS5maWxlTmFtZSxcclxuICAgICAgICAgIFwiYXR0YWNobWVudElkXCI6IGZvcm0uYXR0YWNobWVudC5hdHRhY2htZW50SWQsXHJcbiAgICAgICAgICBcIm1pbWVUeXBlXCI6IGZvcm0uYXR0YWNobWVudC5taW1lVHlwZVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUobmV3T2JqKVxyXG4gICAgICAgIHRoaXMudXBsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgLyp0aGlzLmZpZWxkID0gbmV3T2JqXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KHRoaXMuZmllbGQpO1xyXG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLmZpZWxkKSovXHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgdGhpcy51cGxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAvKiB0aGlzLm5vRXJyb3IgPSBmYWxzZTtcclxuICAgICAgICAgdGhpcy5sb2FkaW5nWydmb3JtJ10gPSBmYWxzZVxyXG4gICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGVycj8uZXJyb3I/Lm1ldGE/Lm1lc3NhZ2VzKi9cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZGRNdWx0aUF0dGFjaG1lbnRzKGZpZWxkOiBhbnkpIHtcclxuICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgIFwiZmlsZURlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgIFwiYXR0YWNobWVudGNvbW1lbnRcIjogXCJcIixcclxuICAgICAgXCJmaWxlTmFtZVwiOiBmaWVsZC5maWxlTmFtZSxcclxuICAgICAgXCJtaW1lVHlwZVwiOiBmaWVsZC5taW1lVHlwZSxcclxuICAgICAgXCJmaWxlQ29udGVudHNcIjogZmllbGQuZmlsZUNvbnRlbnRzLFxyXG4gICAgfVxyXG4gICAgdGhpcy51cGxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5jb3JlU2VydmljZS5nZXRBdHRhY2htZW50cyhkYXRhKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZm9ybTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgbmV3T2JqID0ge1xyXG4gICAgICAgICAgXCJmaWxlTmFtZVwiOiBmaWVsZC5maWxlTmFtZSxcclxuICAgICAgICAgIFwiYXR0YWNobWVudElkXCI6IGZvcm0uYXR0YWNobWVudC5hdHRhY2htZW50SWQsXHJcbiAgICAgICAgICBcIm1pbWVUeXBlXCI6IGZpZWxkLm1pbWVUeXBlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmFsbG93RmlsZUNvbnRlbnRzV2l0aE11bHRpQXR0YWNobWVudHMpIG5ld09ialsnZmlsZUNvbnRlbnRzJ10gPSBmaWVsZC5maWxlQ29udGVudHM7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRGaWxlcyA9IHRoaXMuZGlzcGxheWVkRmlsZXM/Lmxlbmd0aCA/IHRoaXMuZGlzcGxheWVkRmlsZXMgOiBbXVxyXG4gICAgICAgIHRoaXMuZGlzcGxheWVkRmlsZXMucHVzaChuZXdPYmopO1xyXG4gICAgICAgIHRoaXMuYWxsQXR0YWNobWVudHMucHVzaChuZXdPYmopO1xyXG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLmRpc3BsYXllZEZpbGVzKVxyXG4gICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShuZXdPYmopXHJcbiAgICAgICAgLyp0aGlzLmZpZWxkID0gbmV3T2JqXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlQXR0YWNobWVudC5lbWl0KHRoaXMuZmllbGQpO1xyXG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLmZpZWxkKSovXHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgLyogdGhpcy5ub0Vycm9yID0gZmFsc2U7XHJcbiAgICAgICAgIHRoaXMubG9hZGluZ1snZm9ybSddID0gZmFsc2VcclxuICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnI/LmVycm9yPy5tZXRhPy5tZXNzYWdlcyovXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGNoZWNrRmlsZUV4aXN0YW5jZShmaWxlOiBBdHRhdGNobWVudEZpbGUpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmFsbEF0dGFjaG1lbnRzPy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYWxsQXR0YWNobWVudHM/LmZpbmRJbmRleCgoJGZpbGUpID0+IChmaWxlLmZpbGVOYW1lID09PSAkZmlsZS5maWxlTmFtZSkpID09PSAtMTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGlzVmFsaWRNaW1lVHlwZSh2YWx1ZTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5hdHRhY2hUeXBlID09ICdwZGYnKSB7XHJcbiAgICAgIHJldHVybiAoW10gYXMgc3RyaW5nW10pLmNvbmNhdCguLi5PYmplY3QudmFsdWVzKHRoaXMudmFsaWRQZGZUeXBlcykpLmluY2x1ZGVzKHZhbHVlKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5hdHRhY2hUeXBlID09ICdpbWFnZScpIHtcclxuICAgICAgcmV0dXJuIChbXSBhcyBzdHJpbmdbXSkuY29uY2F0KC4uLk9iamVjdC52YWx1ZXModGhpcy52YWxpZEltYWdlVHlwZXMpKS5pbmNsdWRlcyh2YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNWYWxpZEV4dGVuc2lvbih2YWx1ZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcpIHtcclxuICAgIGlmICh0eXBlID09ICdpbWFnZScpIHtcclxuICAgICAgcmV0dXJuIFtdLmNvbmNhdCguLi5PYmplY3Qua2V5cyh0aGlzLnZhbGlkSW1hZ2VUeXBlcykpLmluY2x1ZGVzKHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiaW1hZ2VQZGZcIikge1xyXG4gICAgICByZXR1cm4gW10uY29uY2F0KC4uLk9iamVjdC5rZXlzKHRoaXMudmFsaWRJbWdQZGZUeXBlcykpLmluY2x1ZGVzKHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcInBkZlwiKSB7XHJcbiAgICAgIHJldHVybiBbXS5jb25jYXQoLi4uT2JqZWN0LmtleXModGhpcy52YWxpZFBkZlR5cGVzKSkuaW5jbHVkZXModmFsdWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gW10uY29uY2F0KC4uLk9iamVjdC5rZXlzKHRoaXMudmFsaWRGaWxlVHlwZXMpKS5pbmNsdWRlcyh2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZUF0dGFjaGVkRmlsZSgpIHtcclxuICAgIC8vIHRoaXMuZmllbGQgPSB0aGlzLnZhbHVlID0gbmV3IEF0dGF0Y2htZW50RmlsZShudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTtcclxuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShuZXcgQXR0YXRjaG1lbnRGaWxlKG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpKVxyXG4gICAgaWYgKHRoaXMuaW5wdXRGaWxlKSB7XHJcbiAgICAgIHRoaXMuaW5wdXRGaWxlLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgLy8gdGhpcy5jb250cm9sbGVyLnNldFZhbHVlKHRoaXMuZmllbGQpO1xyXG4gICAgdGhpcy5lbWl0KHRoaXMudmFsdWUpXHJcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGVBdHRhY2htZW50LmVtaXQobnVsbCk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZEZpbGUoZXZlbnQsIGZpZWxkKSB7XHJcbiAgICB0aGlzLmNvcmVTZXJ2aWNlLmxvYWRGaWxlKGZpZWxkLmF0dGFjaG1lbnRJZCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzcG9uc2VPYmplY3Q6IHsgYm9keTogYW55OyB9KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmlsZUluZm9ybWF0aW9uID0gcmVzcG9uc2VPYmplY3QuYm9keTtcclxuICAgICAgICBjb25zdCBmaWxlQmxvYiA9IHRoaXMuY29yZVNlcnZpY2UuZGF0YVVSSXRvQmxvYihmaWxlSW5mb3JtYXRpb24uZmlsZUNvbnRlbnRzKTtcclxuICAgICAgICBjb25zdCBmaWxlID0gbmV3IEZpbGUoW2ZpbGVCbG9iXSwgZmlsZUluZm9ybWF0aW9uLmZpbGVOYW1lLCB7dHlwZTogZmlsZUluZm9ybWF0aW9uLm1pbWVUeXBlfSk7XHJcbiAgICAgICAgY29uc3QgYmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XHJcbiAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgICBsaW5rLmhyZWYgPSBibG9iVXJsO1xyXG4gICAgICAgIGxpbmsuZG93bmxvYWQgPSBmaWxlSW5mb3JtYXRpb24uZmlsZU5hbWU7XHJcbiAgICAgICAgbGluay5jbGljaygpO1xyXG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yID0+IHtcclxuICAgICB0aGlzLnRvYXN0ZXJTZXJ2aWNlLmVycm9yKGVycm9yLmVycm9yPy5bJ21lc3NhZ2UnXSlcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFkZFNpZ25hdHVyZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9iaiA9IHtcclxuICAgICAgdHlwZTogJ29wZW5Qb3B1cERpYWxvZydcclxuICAgIH07XHJcbiAgICB0aGlzLmFkZFNpZ25hdHVyZUNsaWNrZWQuZW1pdChvYmopO1xyXG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxuICBwcmludEZpbGVEYXRhKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucHJpbnRBY3Rpb25DbGlja2VkLmVtaXQoe2V2ZW50LCBmaWVsZDogdGhpcy5jb250cm9sLnZhbHVlfSk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZEZpbGVEYXRhKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuZG93bmxvYWRBY3Rpb25DbGlja2VkLmVtaXQoe2V2ZW50LCBmaWVsZDogdGhpcy5jb250cm9sLnZhbHVlfSk7XHJcbiAgfVxyXG5cclxuICBnZXRFeHRlbnNpb24oYXR0YWNobWVudDogYW55KSB7XHJcbiAgICBpZiAoYXR0YWNobWVudCkge1xyXG4gICAgICBpZiAoYXR0YWNobWVudC5zcGxpdCgnLicpLnBvcCgpID09ICdtc2cnKSB7XHJcbiAgICAgICAgcmV0dXJuICdlbWFpbC1pY29uJ1xyXG4gICAgICB9IGVsc2UgaWYgKGF0dGFjaG1lbnQuc3BsaXQoJy4nKS5wb3AoKSA9PSAnanBlZycpIHtcclxuICAgICAgICByZXR1cm4gJ2pwZydcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gYXR0YWNobWVudC5zcGxpdCgnLicpLnBvcCgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXQ8VD4odmFsdWU6IFQgfCBUW10pIHtcclxuICAgIGlmICh0aGlzLnByZXZlbnRGaWxlQ29udGVudHMpIHtcclxuICAgICAgdmFsdWUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XHJcbiAgICAgIHRoaXMuZGVsZXRlRmlsZUNvbnRlbnRzKHZhbHVlKTtcclxuICAgIH1cclxuICAgIC8vIHRoaXMuZW1pdGVkVmFsdWUuZW1pdCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlbGV0ZUZpbGVDb250ZW50cyhkYXRhOiBhbnkgfCBhbnlbXSkge1xyXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAnZmlsZUNvbnRlbnRzJyBpbiBkYXRhKSB7XHJcbiAgICAgIGRlbGV0ZSBkYXRhLmZpbGVDb250ZW50cztcclxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xyXG4gICAgICBkYXRhLmZvckVhY2goZWxlbSA9PiB0aGlzLmRlbGV0ZUZpbGVDb250ZW50cyhlbGVtKSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBBdHRhdGNobWVudEZpbGUge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGZpbGVOYW1lOiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxyXG4gICAgcHVibGljIG1pbWVUeXBlOiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgZmlsZUNvbnRlbnRzOiBzdHJpbmcsXHJcbiAgICBwdWJsaWMgZmlsZXNpemU6IHN0cmluZ1xyXG4gICkgeyB9XHJcbn1cclxuIiwiQGlmICghaXNSZWFkT25seSkge1xyXG4gIDxuZy1jb250YWluZXI+XHJcbiAgICBAaWYgKGxhYmVsKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbWItMVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0wXCI+e3sgbGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgQGlmICghcmVxdWlyZWQpIHtcclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnMtMTEgZmMtZGFyay1ncmF5XCI+XHJcbiAgICAgICAgICAgIHt7IGkxOG4udHJhbnNsYXRlKCdPcHRpb25hbCcpIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICA8c2VjdGlvblxyXG4gICAgICBbbmdDbGFzc109XCJpbnNpZGVUYWJsZSA/ICdmaWxlLXVwbG9hZGVyLXRhYmxlJyA6ICdmaWxlLXVwbG9hZGVyJ1wiIGNsYXNzPVwiIG1iLTJcIlxyXG4gICAgICBbY2xhc3MuaW5zaWRlVGFibGVTdHlsZV09XCJpbnNpZGVUYWJsZVwiPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgW25nQ2xhc3NdPVwiaW5zaWRlVGFibGUgPyAnZmlsZS11cGxvYWRlci10YWJsZS1kZXYnIDogJydcIiBjbGFzcz1cImZpbGUtdXBsb2FkZXItaW5wdXRcIlxyXG4gICAgICAgIChjbGljayk9XCJmaWxlQXR0YWNoZWQuY2xpY2soKVwiPlxyXG4gICAgICAgIEBpZiAoIXVwbG9hZGluZykge1xyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImljb24gbWItMVwiPlxyXG4gICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaW5zaWRlVGFibGUgPyAnZmlsZS11cGxvYWRlci10YWJsZS1zdmcnIDogJydcIiB3aWR0aD1cIjQxXCIgaGVpZ2h0PVwiMzhcIiB2aWV3Qm94PVwiMCAwIDQxIDM4XCJcclxuICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0wIDIyLjE5NDdWMjAuNjczNkMwLjA5NzEzMDMgMjAuMTAxOSAwLjA3MDA5NCAxOS41MTQxIDAuMjc2MzcxIDE4Ljk1MzNDMS4yODM3MiAxNi4yMDg2IDMuMjEyMzEgMTQuNTAyMyA2LjA0MjEgMTMuODA5NEM2LjcwNDk5IDEzLjY0NzIgNi42ODQ5NyAxMy42NjMyIDYuNjk4OTkgMTIuOTg0M0M2LjczMjAzIDExLjMzMjEgNi45OTgzOSA5LjcxOTkyIDcuNjI0MjMgOC4xNzk4NkM4Ljg2Mjg5IDUuMTM2NzggMTAuOTQ2NyAyLjgzOTY5IDEzLjg4MTYgMS4zOTE3NUMxNy4xNjggLTAuMjMwNDI0IDIwLjU5NTYgLTAuNDUwNzE5IDI0LjA1NTMgMC44MTU5OEMyNy40OTI5IDIuMDc0NjcgMjkuOTYyMiA0LjQxNTgxIDMxLjQ4MDIgNy43NDgyOEMzMS43Nzg2IDguNDAzMTYgMzIuMDI3IDkuMDgzMDcgMzIuMTcxMiA5Ljc5MjAyQzMyLjI0MDIgMTAuMTMxNSAzMi40MDM1IDEwLjI1NjYgMzIuNzUyOSAxMC4zMTA3QzM2LjcwMTIgMTAuOTE2NSAzOS4zMzU4IDEzLjEyNTUgNDAuNjk0NiAxNi44NzM1QzQwLjkwNjkgMTcuNDYwMyA0MC45MTk5IDE4LjA3MzEgNDAuOTU5OSAxOC42ODI5QzQwLjk2NDkgMTguNzYwMSA0MC45Mzg5IDE4Ljg0NDIgNDEgMTguOTExM1YyMC41MTI0QzQwLjkxMDkgMjAuOTk1IDQwLjk2OSAyMS40OTM3IDQwLjg2MDggMjEuOTczNEM0MC41MjQ0IDIzLjQ2MTQgMzkuODQ1NCAyNC43ODIxIDM4Ljg1MDEgMjUuOTI5N0MzNy40NTIyIDI3LjU0MTggMzUuNzA1OSAyOC41ODgyIDMzLjYxNjEgMjkuMDUxOUMzMi43OTEgMjkuMjM1MSAzMS45NDk5IDI5LjI1MjEgMzEuMTExNyAyOS4yOTIyQzMwLjY1NzEgMjkuMzE0MiAzMC41ODQgMjkuMTkzIDMwLjU5MiAyOC43NDg0QzMwLjY0NTEgMjUuODQ0NiAyOS44MDIgMjMuMjU3MSAyNy44NjI0IDIxLjA1OTFDMjUuOTk3OSAxOC45NDYzIDIzLjY1OTcgMTcuNzE2NyAyMC44NjcgMTcuNDAxMkMxOC44NTUzIDE3LjE3MzkgMTYuOTA1NyAxNy40NTkzIDE1LjA2MTIgMTguMzM5NUMxMS44MzE5IDE5Ljg4MTYgOS44MTQxNiAyMi40MDY5IDguOTYxMDIgMjUuODY5NkM4Ljc0MjczIDI2Ljc1MzggOC42ODI2NSAyNy42NTggOC43MDU2OCAyOC41NzAyQzguNzIxNyAyOS4yMTExIDguNjAyNTQgMjkuMzEyMiA3Ljk1OTY4IDI5LjI5NzJDNS45NTA5OCAyOS4yNTExIDQuMTA1NTEgMjguNzIzNCAyLjU4MTQ2IDI3LjM1OTZDMS4wNzY0NCAyNi4wMTY4IDAuMDY4MDkxMyAyNC4zOTk2IDAuMDQwMDUzNyAyMi4zMDI4QzAuMDQwMDUzNyAyMi4yNjA3IDAuMDI1MDMzNiAyMi4yMjU3IDAgMjIuMTkzN1YyMi4xOTQ3WlwiXHJcbiAgICAgICAgICAgICAgICBmaWxsPVwiI0RFRTBFMlwiLz5cclxuICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0yOS4wMzAzIDI4LjI2MzJDMjkuMDYwNCAzMy40MDMxIDI0Ljg2NTcgMzcuNjE4NyAxOS42ODM4IDM3LjY1NDhDMTQuNTE2OSAzNy42OTA4IDEwLjI4NTIgMzMuNDk1MiAxMC4yNTIxIDI4LjMwNDJDMTAuMjIwMSAyMy4xNDAzIDE0LjQyOTcgMTguOTEyNiAxOS42MjI3IDE4Ljg5NDZDMjQuODAzNyAxOC44NzY2IDI4Ljk5OTMgMjMuMDU0MiAyOS4wMzAzIDI4LjI2MzJaXCJcclxuICAgICAgICAgICAgICAgIGZpbGw9XCIjOEU5QUEwXCIvPlxyXG4gICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTIwLjU1NzMgMjUuMjY0NEMyMC40NjIyIDI1LjQ0NzcgMjAuNTAxMiAyNS41OTM5IDIwLjUwMTIgMjUuNzM0QzIwLjQ5ODIgMjguMjE1NCAyMC41MDAyIDMwLjY5NTcgMjAuNDk4MiAzMy4xNzdDMjAuNDk4MiAzMy44MDk5IDIwLjIzMzkgMzQuMTcwNCAxOS43NDYyIDM0LjIyMzRDMTkuMjY0NSAzNC4yNzY1IDE4Ljg4IDMzLjk4MzEgMTguODE2OSAzMy41MDI1QzE4Ljc5NTkgMzMuMzQ0MyAxOC43OTY5IDMzLjE4MyAxOC43OTY5IDMzLjAyMzhDMTguNzk1OSAzMC41ODI2IDE4Ljc5NjkgMjguMTQyMyAxOC43OTY5IDI1LjcwMUMxOC43OTY5IDI1LjU3MjggMTguNzk2OSAyNS40NDQ3IDE4Ljc5NjkgMjUuMjAwM0MxOC4xOTcxIDI1LjgwMzEgMTcuNjc3NCAyNi4zMjg4IDE3LjE1MjcgMjYuODUwNUMxNy4wMTE1IDI2Ljk5MDcgMTYuODY4MyAyNy4xMzQ5IDE2LjcwNjEgMjcuMjQ3MUMxNi4zNTY2IDI3LjQ4NjQgMTUuOTM0MSAyNy40NDEzIDE1LjY0NTcgMjcuMTU0QzE1LjM2NDMgMjYuODc0NiAxNS4zMjAzIDI2LjQ0MiAxNS41NDg2IDI2LjA5MjVDMTUuNjIwNyAyNS45ODI0IDE1LjcxMjggMjUuODgzMiAxNS44MDY5IDI1Ljc4OTFDMTYuODYxMyAyNC43MzA3IDE3LjkxNjcgMjMuNjczMyAxOC45NzMyIDIyLjYxNzlDMTkuNDAxNyAyMi4xODkzIDE5Ljg3ODQgMjIuMTc2MyAyMC4zMDM5IDIyLjU5ODhDMjEuMzkxNCAyMy42ODAzIDIyLjQ3MzkgMjQuNzY2NyAyMy41NTMzIDI1Ljg1NzJDMjMuOTgwOSAyNi4yODk4IDI0LjAxMjkgMjYuODA2NSAyMy42NTM0IDI3LjE2N0MyMy4yOTkgMjcuNTIxNCAyMi43NzUzIDI3LjQ4NDQgMjIuMzQzNyAyNy4wNTY4QzIxLjc0OTkgMjYuNDcgMjEuMTY2MSAyNS44NzMyIDIwLjU2MDMgMjUuMjY0NEgyMC41NTczWlwiXHJcbiAgICAgICAgICAgICAgICBmaWxsPVwiI0Y5RjlGOVwiLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgICAgQGlmICh1cGxvYWRpbmcpIHtcclxuICAgICAgICAgIDxkcy1pY29uIGNsYXNzPVwic2ZpIHNmaS1zcGlubmVyIGQtaW5saW5lLWJsb2NrIHNwaW4gZmMtY29yYWwgZnMtMzAtaW1wXCI+PC9kcy1pY29uPlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImYtMTQgZmMtYmxhY2sgZnctbm9ybWFsXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZjLWNvcmFsIGZ3LW1lZGl1bVwiPnt7IGkxOG4udHJhbnNsYXRlKCdicm93c2UnKSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtMTAgZmMtZGFyay1ncmF5XCI+XHJcbiAgICAgICAgICB7eyBhbGxvd2VkRXh0ZW5zaW9ucyA/IGFsbG93ZWRFeHRlbnNpb25zIDogJycgfX1cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgI2lucHV0RmlsZSBbYWNjZXB0XT1cImFjY2VwdFwiIGNsYXNzPVwiZC1ub25lXCIgI2ZpbGVBdHRhY2hlZCAoY2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgQGlmIChoaW50cykge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMyBtYi0zXCI+XHJcbiAgICAgICAgQGZvciAoaGludCBvZiBoaW50czsgdHJhY2sgaGludCkge1xyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTEgZnMtMTJcIj5cclxuICAgICAgICAgICAgICA8ZHMtaWNvblxyXG4gICAgICAgICAgICAgICAgaWNvbj1cInt7aGludC52YWxpZCA/ICdjaGVjay1jaXJjbGUtZicgOiAnY2hlY2stY2lyY2xlLW8nfX1cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmcy0yNCB7e2hpbnQudmFsaWQgPyAnZmMtZ3JlZW4nIDogJ2ZjLWRhcmstZ3JheSd9fVwiPjwvZHMtaWNvbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInt7aGludC52YWxpZCA/ICdmYy1ibGFjaycgOiAnZmMtZGFyay1ncmF5J319XCI+e3sgaGludC5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG5cclxuICAgIEBpZiAoaGludCkge1xyXG4gICAgICA8bWF0LWhpbnQgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xXCI+XHJcbiAgICAgICAgPGRzLWljb24gaWNvbj1cImluZm9cIiBjbGFzcz1cImZzLTE3IGZjLWRhcmstZ3JheVwiPjwvZHMtaWNvbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImZzLTEyIGZjLWJsYWNrIGxpbmUtaGVpZ2h0LTFcIj57eyBoaW50IH19PC9zcGFuPlxyXG4gICAgICA8L21hdC1oaW50PlxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBAaWYgKG11bHRpcGxlKSB7XHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZmlsZXMtbGlzdFwiPlxyXG4gICAgICAgIEBmb3IgKGZpbGUgb2YgZGlzcGxheWVkRmlsZXM7IHRyYWNrIGZpbGU7IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pdGVtLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZHMtYXR0YWNobWVudHNcclxuICAgICAgICAgICAgICBbZmlsZV09XCJmaWxlXCJcclxuICAgICAgICAgICAgICAoZG93bmxvYWRFdmVudCk9XCJhdHRjaCgnZG93bmxvYWQnLGksZmlsZSlcIlxyXG4gICAgICAgICAgICAgIChkZWxldGVFdmVudCk9XCJhdHRjaCgnZGVsZXRlJyxpLGZpbGUpXCJcclxuICAgICAgICAgICAgICBbc2hvd0FjdGlvbnNdPVwic2hvd0FjdGlvbnNcIj5cclxuICAgICAgICAgICAgPC9kcy1hdHRhY2htZW50cz5cclxuICAgICAgICAgICAgPGEgaHJlZj1cIlwiIGNsYXNzPVwiaGlkZGVuLXBsYWNlaG9sZGVyXCI+PC9hPlxyXG4gICAgICAgICAgICA8IS0tIDxtYXQtZXJyb3IgY2xhc3M9XCJmcy0xMlwiPlRlc3QgZXJyb3IgPC9tYXQtZXJyb3I+IC0tPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgPC9zZWN0aW9uPlxyXG4gICAgfVxyXG5cclxuICAgIEBpZiAoIW11bHRpcGxlICYmIChjb250cm9sLnZhbHVlPy5maWxlQ29udGVudHMgfHwgY29udHJvbC52YWx1ZT8uYXR0YWNobWVudElkKSkge1xyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImZpbGVzLWxpc3RcIj5cclxuXHJcbiAgICAgICAgPCEtLSB7e2ZpZWxkIHwganNvbiB9fSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pdGVtLWNvbnRhaW5lciBmaWxlLWl0ZW0tY29udGFpbmVyLWFjdGlvbnNcIj5cclxuICAgICAgICAgIDxkcy1hdHRhY2htZW50c1xyXG4gICAgICAgICAgICBbZmlsZV09XCJjb250cm9sLnZhbHVlXCJcclxuICAgICAgICAgICAgKGRvd25sb2FkRXZlbnQpPVwiYXR0Y2goJ2Rvd25sb2FkJyxudWxsLGNvbnRyb2wudmFsdWUpXCJcclxuICAgICAgICAgICAgKGRlbGV0ZUV2ZW50KT1cImF0dGNoKCdkZWxldGUnLG51bGwsY29udHJvbC52YWx1ZSlcIlxyXG4gICAgICAgICAgICBbc2hvd0FjdGlvbnNdPVwic2hvd0FjdGlvbnNcIj5cclxuICAgICAgICAgIDwvZHMtYXR0YWNobWVudHM+XHJcbiAgICAgICAgICA8YSBocmVmPVwiXCIgY2xhc3M9XCJoaWRkZW4tcGxhY2Vob2xkZXJcIj48L2E+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXR0YWNobWVudEN1c3RvbUFjdGlvbnNcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwhLS0gPG1hdC1lcnJvciBjbGFzcz1cImZzLTEyXCI+VGVzdCBlcnJvciA8L21hdC1lcnJvcj4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgPC9zZWN0aW9uPlxyXG4gICAgfVxyXG4gICAgPGRpdiBjbGFzcz1cImF0dGFjaG1lbnRzLWVycm9yXCI+XHJcblxyXG4gICAgICA8IS0tICghdmFsaWRFeHRlbnNpb24gKSAgJiYgIW11bHRpcGxlIC0tPlxyXG4gICAgICBAaWYgKCghdmFsaWRFeHRlbnNpb24pKSB7XHJcbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJmaWxlcy1saXN0IG10LTJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLWl0ZW0tY29udGFpbmVyIFwiPlxyXG4gICAgICAgICAgICA8ZHMtYXR0YWNobWVudHNcclxuICAgICAgICAgICAgICBbZmlsZV09XCJ3cm9uZ0ZpbGVcIiBlcnJvciBbc2hvd0FjdGlvbnNdPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgPC9kcy1hdHRhY2htZW50cz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgfVxyXG5cclxuICAgICAgQGlmICghYWxsb3dlZEZpbGVTaXplKSB7XHJcbiAgICAgICAgPG1hdC1lcnJvciBjbGFzcz1cImZzLTEyIG15LTJcIj5cclxuICAgICAgICAgIHt7IG1heFNpemUgPT09IFwiMC4zXCIgPyBpMThuLnRyYW5zbGF0ZSgnc3VwcG9ydDMnKSA6IGkxOG4udHJhbnNsYXRlKCdzdXBwb3J0MicpICsgbWF4U2l6ZSArIGkxOG4udHJhbnNsYXRlKCdtYicpIH19XHJcbiAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgIH1cclxuICAgICAgQGlmICgoIWZpbGVOb3REdXBsaWNhdGVkKSkge1xyXG4gICAgICAgIDxtYXQtZXJyb3IgY2xhc3M9XCJmcy0xMiBteS0yXCI+e3sgaTE4bi50cmFuc2xhdGUoJ2R1cGxpY2F0ZWQtZXJyb3InKSB9fTwvbWF0LWVycm9yPlxyXG4gICAgICB9XHJcbiAgICAgIEBpZiAobGVuZ3RoRXJyb3IpIHtcclxuICAgICAgICA8bWF0LWVycm9yIGNsYXNzPVwiZnMtMTJcIj57eyBpMThuLnRyYW5zbGF0ZSgnbGVuZ3RoRXJyb3InKSB9fSA6e3sgbWF4TGVuZ3RoIH19PC9tYXQtZXJyb3I+XHJcbiAgICAgIH1cclxuICAgICAgQGlmIChzaG93RXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgICAgPCEtLSA8bWF0LWVycm9yIGNsYXNzPVwiZnMtMTJcIj57e2Vycm9yTWVzc2FnZX19IDwvbWF0LWVycm9yPiAtLT5cclxuICAgICAgfVxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG59XHJcblxyXG5cclxuQGlmIChpc1JlYWRPbmx5KSB7XHJcbiAgPG5nLWNvbnRhaW5lcj5cclxuICAgIEBpZiAobXVsdGlwbGUgJiYgZGlzcGxheWVkRmlsZXMpIHtcclxuICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1pdGVtXCI+XHJcbiAgICAgICAgICBAaWYgKGxhYmVsKSB7XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmFtZVwiPnt7IGxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgQGlmIChkaXNwbGF5ZWRGaWxlcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGlzY1wiPlxyXG4gICAgICAgICAgICAgIEBmb3IgKGZpbGUgb2YgZGlzcGxheWVkRmlsZXM7IHRyYWNrIGZpbGU7IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1pdGVtLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZHMtYXR0YWNobWVudHNcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm15LTJcIiBbZmlsZV09XCJmaWxlXCIgcmVhZE9ubHkgKGF0dGFjaG1lbnRFdmVudCk9XCJkb3dubG9hZEZpbGUoJGV2ZW50LGZpbGUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0FjdGlvbnNdPVwic2hvd0FjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiXCIgY2xhc3M9XCJoaWRkZW4tcGxhY2Vob2xkZXJcIj48L2E+XHJcbiAgICAgICAgICAgICAgICAgIDwvZHMtYXR0YWNobWVudHM+XHJcbiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJcIiBjbGFzcz1cImhpZGRlbi1wbGFjZWhvbGRlclwiPjwvYT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgPGEgaHJlZj1cIlwiIGNsYXNzPVwiaGlkZGVuLXBsYWNlaG9sZGVyXCI+PC9hPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBAaWYgKCFkaXNwbGF5ZWRGaWxlcz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGlzY1wiPlxyXG4gICAgICAgICAge3sgaTE4bi50cmFuc2xhdGUoJ05vQXR0YWNobWVudHMnKSB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgfVxyXG5cclxuICAgIEBpZiAoIW11bHRpcGxlICYmIChjb250cm9sLnZhbHVlPy5hdHRhY2htZW50SWQgfHwgY29udHJvbC52YWx1ZT8uZmlsZUNvbnRlbnRzKSkge1xyXG4gICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLWl0ZW1cIj5cclxuICAgICAgICAgIEBpZiAobGFiZWwpIHtcclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYW1lXCI+e3sgbGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzYyBmaWxlLWl0ZW0tY29udGFpbmVyIGZpbGUtaXRlbS1jb250YWluZXItYWN0aW9uc1wiIFtuZ0NsYXNzXT1cInsnaW5zaWRlVGFibGVXaWR0aCc6aW5zaWRlVGFibGV9XCI+XHJcbiAgICAgICAgICAgIEBpZiAoY29udHJvbC52YWx1ZT8uYXR0YWNobWVudElkIHx8IGNvbnRyb2wudmFsdWU/LmZpbGVDb250ZW50cykge1xyXG4gICAgICAgICAgICAgIDxkcy1hdHRhY2htZW50c1xyXG4gICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiY29udHJvbC52YWx1ZT8uZmlsZU5hbWVcIiBbZmlsZV09XCJjb250cm9sLnZhbHVlXCIgW3Nob3dBY3Rpb25zXT1cInNob3dBY3Rpb25zXCJcclxuICAgICAgICAgICAgICAgIChhdHRhY2htZW50RXZlbnQpPVwiYXR0Y2goJGV2ZW50LG51bGwsY29udHJvbC52YWx1ZSlcIiByZWFkT25seT5cclxuICAgICAgICAgICAgICA8L2RzLWF0dGFjaG1lbnRzPlxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICA8YSBocmVmPVwiXCIgY2xhc3M9XCJoaWRkZW4tcGxhY2Vob2xkZXJcIj48L2E+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhdHRhY2htZW50Q3VzdG9tQWN0aW9uc1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgfVxyXG4gIDwvbmctY29udGFpbmVyPlxyXG59XHJcblxyXG48bmctdGVtcGxhdGUgI2F0dGFjaG1lbnRDdXN0b21BY3Rpb25zPlxyXG4gIEBpZiAoIWlzRGlzYWJsZWQpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWRlZC1maWxlLWFjdGlvbnNcIj5cclxuICAgICAgQGlmIChzaG93U2lnbkJ1dHRvbikge1xyXG4gICAgICAgIDxkcy1idXR0b24gc2hhcGU9XCJvdXRsaW5lXCIgKGNsaWNrKT1cImFkZFNpZ25hdHVyZSgkZXZlbnQpXCIgY29sb3I9XCJyZWRcIj5cclxuICAgICAgICAgIHt7IHNpZ25UeXBlIH19XHJcbiAgICAgICAgPC9kcy1idXR0b24+XHJcbiAgICAgIH1cclxuICAgICAgQGlmIChzaG93RG93bmxvYWRCdXR0b24pIHtcclxuICAgICAgICA8ZHMtYnV0dG9uIHNoYXBlPVwib3V0bGluZVwiIChjbGljayk9XCJkb3dubG9hZEZpbGVEYXRhKCRldmVudClcIiBjb2xvcj1cInJlZFwiPlxyXG4gICAgICAgICAge3sgZG93bmxvYWRUeXBlIH19XHJcbiAgICAgICAgPC9kcy1idXR0b24+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIEBpZiAoc2hvd0Rvd25sb2FkQnV0dG9uKSB7XHJcbiAgICAgICAgPGEgaHJlZj1cIlwiIGNsYXNzPVwiaGlkZGVuLXBsYWNlaG9sZGVyXCI+PC9hPlxyXG4gICAgICB9XHJcbiAgICAgIEBpZiAoc2hvd1ByaW50QnV0dG9uKSB7XHJcbiAgICAgICAgPGRzLWJ1dHRvbiBzaGFwZT1cIm91dGxpbmVcIiAoY2xpY2spPVwicHJpbnRGaWxlRGF0YSgkZXZlbnQpXCIgY29sb3I9XCJyZWRcIj5cclxuICAgICAgICAgIHt7IHByaW50VHlwZSB9fVxyXG4gICAgICAgIDwvZHMtYnV0dG9uPlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICB9XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==