@acorex/components 16.0.8 → 16.0.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,24 +1,27 @@
1
- import { Component, ViewChild, Input, ElementRef, ViewEncapsulation, TemplateRef, Renderer2, EventEmitter, Output, ChangeDetectorRef } from '@angular/core';
1
+ import { AXRenderService, AXTranslator } from '@acorex/core';
2
+ import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, Renderer2, TemplateRef, ViewChild, ViewEncapsulation, } from '@angular/core';
3
+ import { AXBaseComponent, } from '../base/element.class';
2
4
  import { AXProgressBarComponent } from '../progress-bar/progress-bar.component';
3
- import { AXBaseComponent } from '../base/element.class';
4
- import { AXRenderService } from '@acorex/core';
5
+ import { AXToastService } from '../toast/toast.service';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "@acorex/core";
7
- import * as i2 from "@angular/common";
8
- import * as i3 from "../button/button.component";
9
- import * as i4 from "../textbox/textbox.component";
10
- import * as i5 from "../form-group/form-group.component";
8
+ import * as i2 from "../toast/toast.service";
9
+ import * as i3 from "@angular/common";
10
+ import * as i4 from "../button/button.component";
11
+ import * as i5 from "../textbox/textbox.component";
12
+ import * as i6 from "../form-group/form-group.component";
11
13
  export class AXUploadFileComponent extends AXBaseComponent {
12
14
  el;
13
15
  injectionService;
14
16
  rendrer;
15
17
  cdr;
18
+ toastService;
16
19
  overlayDiv;
17
20
  contentType = 'image';
18
21
  dropRef;
19
22
  progressRef;
20
23
  label;
21
- size = "md";
24
+ size = 'md';
22
25
  fileInput;
23
26
  type = 'inline';
24
27
  template;
@@ -30,45 +33,60 @@ export class AXUploadFileComponent extends AXBaseComponent {
30
33
  {
31
34
  type: 'image',
32
35
  accept: ['image/gif', 'image/jpeg', 'image/png'],
36
+ message: 'عکس',
33
37
  },
34
38
  {
35
39
  type: 'audio',
36
40
  accept: ['audio/mp3'],
41
+ message: 'audio',
37
42
  },
38
43
  {
39
44
  type: 'ebook',
40
45
  accept: ['application/pdf'],
46
+ message: 'pdf',
41
47
  },
42
48
  {
43
49
  type: 'excel',
44
- accept: ['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
50
+ accept: [
51
+ 'application/vnd.ms-excel',
52
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
53
+ 'application/vnd.ms-excel.sheet.macroEnabled.12',
54
+ 'application/vnd.oasis.opendocument.spreadsheet',
55
+ 'text/csv',
56
+ ],
57
+ message: 'اکسل',
45
58
  },
46
59
  {
47
60
  type: 'video',
48
61
  accept: ['video/*'],
62
+ message: 'video',
49
63
  },
50
64
  {
51
65
  type: 'video/image',
52
66
  accept: ['image/gif', 'image/jpeg', 'image/png', 'video/*'],
67
+ message: 'video/image',
53
68
  },
54
69
  {
55
70
  type: 'json',
56
71
  accept: ['application/json'],
72
+ message: 'json',
57
73
  },
58
74
  {
59
75
  type: 'any',
60
76
  accept: ['*/*'],
77
+ message: '',
61
78
  },
62
79
  ];
63
80
  files = [];
64
81
  focus() { }
65
82
  fileName = '';
66
- constructor(el, injectionService, rendrer, cdr) {
83
+ constructor(el, injectionService, rendrer, cdr, toastService) {
67
84
  super();
68
85
  this.el = el;
69
86
  this.injectionService = injectionService;
70
87
  this.rendrer = rendrer;
71
88
  this.cdr = cdr;
89
+ this.toastService = toastService;
72
90
  }
73
91
  onDeleteClick(e) {
74
92
  e.stopPropagation();
@@ -91,31 +109,24 @@ export class AXUploadFileComponent extends AXBaseComponent {
91
109
  if (this.dropRef != null) {
92
110
  }
93
111
  else {
94
- this.dropRef = this.el.nativeElement;
112
+ this.dropRef = this.el.nativeElement.querySelector('.upload-file-box');
95
113
  }
96
114
  //
97
115
  if (this.progressRef != null) {
98
116
  }
99
117
  else {
100
- this.progressRef = this.el.nativeElement;
118
+ this.progressRef =
119
+ this.el.nativeElement.querySelector('.upload-file-box');
101
120
  }
102
121
  //
103
122
  if (this.type === 'hidden' || this.type === 'box') {
104
- this.overlayDiv = this.rendrer.createElement('div');
105
- this.overlayDiv.classList.add('overlay');
106
- this.overlayDiv.innerHTML = `
107
- <div class="icon-wrapper">
108
- <i class="far fa-cloud-upload-alt fa-3x"></i>
109
- <span>Drop File(s) Here</span>
110
- </div>
111
- `;
123
+ this.handleShowEmptyFile();
112
124
  this.overlayDiv.addEventListener('drag', this.handleOverlayDragOver);
113
125
  this.overlayDiv.addEventListener('dragover', this.handleOverlayDragOver);
114
126
  this.overlayDiv.addEventListener('dragleave', this.handleOverlayDragOver);
115
- this.rendrer.appendChild(this.dropRef, this.overlayDiv);
116
127
  }
117
128
  //
118
- this.dropRef.classList.add('ax-upload-drop-over');
129
+ // this.dropRef.classList.add('ax-upload-drop-over');
119
130
  this.dropRef.addEventListener('dragover', this.handleDragOver.bind(this));
120
131
  this.dropRef.addEventListener('dragleave', this.handleDragLeave.bind(this));
121
132
  this.dropRef.addEventListener('drop', this.handleDrop.bind(this));
@@ -145,6 +156,14 @@ export class AXUploadFileComponent extends AXBaseComponent {
145
156
  }
146
157
  }
147
158
  addFile(file) {
159
+ if (this.contentType &&
160
+ this.contentType !== 'any' &&
161
+ !this.fileTypes
162
+ .find((x) => x.type === this.contentType)
163
+ .accept.includes(file.type)) {
164
+ this.toastService.info(`فایل بارگذاری باید از نوع ${this.fileTypes.find((x) => x.type === this.contentType).message} باشد`);
165
+ return;
166
+ }
148
167
  const progressDiv = this.rendrer.createElement('div');
149
168
  progressDiv.classList.add('ax-upload-progress-panel');
150
169
  const progressLabel = this.rendrer.createElement('small');
@@ -157,7 +176,7 @@ export class AXUploadFileComponent extends AXBaseComponent {
157
176
  reader.addEventListener('load', (e) => {
158
177
  this.onLoad.emit({
159
178
  file,
160
- data: e.target.result
179
+ data: e.target.result,
161
180
  });
162
181
  //
163
182
  // Fake Upload
@@ -174,13 +193,41 @@ export class AXUploadFileComponent extends AXBaseComponent {
174
193
  file,
175
194
  total: e.total,
176
195
  uploaded,
177
- value: pv
196
+ value: pv,
178
197
  });
179
198
  //
180
199
  if (com.progress >= 100) {
181
200
  clearInterval(intv);
182
201
  setTimeout(() => {
183
202
  this.rendrer.removeChild(this.progressRef, progressDiv);
203
+ if (this.fileName) {
204
+ this.rendrer.removeChild(this.dropRef, this.overlayDiv);
205
+ this.overlayDiv = this.rendrer.createElement('div');
206
+ this.overlayDiv.classList.add('overlay');
207
+ this.overlayDiv.innerHTML = `
208
+ <div
209
+ style="
210
+ display: flex;
211
+ flex-direction: column;
212
+ align-items: center;
213
+ justify-content: center;
214
+ gap: 8px;
215
+ "
216
+ >
217
+ <i style="color: var(--ax-danger-color)" class="far fa-times fa-3x"></i>
218
+ <span>${this.fileName}</span>
219
+ </div>
220
+
221
+ `;
222
+ const closeIcon = this.overlayDiv.querySelector('.far.fa-times');
223
+ this.rendrer.listen(closeIcon, 'click', (e) => {
224
+ this.remove();
225
+ this.rendrer.removeChild(this.dropRef, this.overlayDiv);
226
+ this.handleShowEmptyFile();
227
+ e.stopPropagation();
228
+ });
229
+ this.rendrer.appendChild(this.dropRef, this.overlayDiv);
230
+ }
184
231
  }, 1000);
185
232
  }
186
233
  }, 100);
@@ -191,13 +238,31 @@ export class AXUploadFileComponent extends AXBaseComponent {
191
238
  get accessTypes() {
192
239
  return this.fileTypes.find((item) => item.type == this.contentType).accept;
193
240
  }
194
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AXUploadFileComponent, deps: [{ token: i0.ElementRef }, { token: i1.AXRenderService }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
195
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AXUploadFileComponent, selector: "ax-upload-file", inputs: { contentType: "contentType", dropRef: "dropRef", progressRef: "progressRef", label: "label", size: "size", type: "type", template: "template", disabled: "disabled" }, outputs: { onLoad: "onLoad", onProgress: "onProgress", onRemove: "onRemove" }, host: { styleAttribute: "display: block; width:100%; position: relative" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<input #fileInput type=\"file\" [accept]=\"accessTypes.join(',')\" style=\"display: none;\" (change)=\"onFileChange($event)\" />\n\n<ng-container *ngIf=\"type == 'inline'; else elseTemplate\">\n <ax-form-group size=\"{{size}}\">\n <ax-text-box [value]=\"fileName\" readonly=\"true\" [disabled]=\"disabled\"></ax-text-box>\n <ax-button type=\"blank light\" icon=\"far fa-times\" (click)=\"remove()\" *ngIf=\"fileName\" [tabIndex]=\"-1\">\n </ax-button>\n <ax-button type=\"primary blank\" icon=\"far fa-upload\" (click)=\"open()\" [disabled]=\"disabled\" [tabIndex]=\"-1\">\n </ax-button>\n </ax-form-group>\n</ng-container>\n\n<ng-template #elseTemplate>\n <div class=\"ax upload-file-box\" (click)=\"open()\" #dropRef>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.AXButtonComponent, selector: "ax-button", inputs: ["type", "icon", "submitBehavior", "cancelBehavior", "block", "loading", "selected"] }, { kind: "component", type: i4.AXTextBoxComponent, selector: "ax-text-box", inputs: ["mask", "showMask", "type", "maxLength", "maskGuid", "maskPlaceholder", "maskKeepCharPositions"] }, { kind: "component", type: i5.AXFormGroupComponent, selector: "ax-form-group", inputs: ["size"] }], encapsulation: i0.ViewEncapsulation.None });
241
+ handleShowEmptyFile() {
242
+ this.overlayDiv = this.rendrer.createElement('div');
243
+ this.overlayDiv.classList.add('overlay');
244
+ this.overlayDiv.innerHTML = `
245
+ <div style="
246
+ display: flex;
247
+ flex-direction: column;
248
+ align-items: center;
249
+ justify-content: center;
250
+ gap: 8px;
251
+ ">
252
+ <i class="far fa-cloud-upload-alt fa-3x"></i>
253
+ <span>${AXTranslator.get('common.upload')}</span>
254
+ </div>
255
+ `;
256
+ this.rendrer.appendChild(this.dropRef, this.overlayDiv);
257
+ this.dropRef.classList.add('ax-upload-drop-over');
258
+ }
259
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AXUploadFileComponent, deps: [{ token: i0.ElementRef }, { token: i1.AXRenderService }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i2.AXToastService }], target: i0.ɵɵFactoryTarget.Component });
260
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AXUploadFileComponent, selector: "ax-upload-file", inputs: { contentType: "contentType", dropRef: "dropRef", progressRef: "progressRef", label: "label", size: "size", type: "type", template: "template", disabled: "disabled" }, outputs: { onLoad: "onLoad", onProgress: "onProgress", onRemove: "onRemove" }, host: { styleAttribute: "display: block; width:100%; position: relative" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<input\n #fileInput\n type=\"file\"\n [accept]=\"accessTypes.join(',')\"\n style=\"display: none\"\n (change)=\"onFileChange($event)\"\n/>\n\n<ng-container *ngIf=\"type == 'inline'; else elseTemplate\">\n <ax-form-group size=\"{{ size }}\">\n <ax-text-box\n [value]=\"fileName\"\n readonly=\"true\"\n [disabled]=\"disabled\"\n ></ax-text-box>\n <ax-button\n type=\"blank light\"\n icon=\"far fa-times\"\n (click)=\"remove()\"\n *ngIf=\"fileName\"\n [tabIndex]=\"-1\"\n >\n </ax-button>\n <ax-button\n type=\"primary blank\"\n icon=\"far fa-upload\"\n (click)=\"open()\"\n [disabled]=\"disabled\"\n [tabIndex]=\"-1\"\n >\n </ax-button>\n </ax-form-group>\n</ng-container>\n\n<ng-template #elseTemplate>\n <div class=\"ax upload-file-box\" (click)=\"open()\" #dropRef></div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.AXButtonComponent, selector: "ax-button", inputs: ["type", "icon", "submitBehavior", "cancelBehavior", "block", "loading", "selected"] }, { kind: "component", type: i5.AXTextBoxComponent, selector: "ax-text-box", inputs: ["mask", "showMask", "type", "maxLength", "maskGuid", "maskPlaceholder", "maskKeepCharPositions"] }, { kind: "component", type: i6.AXFormGroupComponent, selector: "ax-form-group", inputs: ["size"] }], encapsulation: i0.ViewEncapsulation.None });
196
261
  }
197
262
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AXUploadFileComponent, decorators: [{
198
263
  type: Component,
199
- args: [{ selector: 'ax-upload-file', encapsulation: ViewEncapsulation.None, host: { style: 'display: block; width:100%; position: relative' }, template: "<input #fileInput type=\"file\" [accept]=\"accessTypes.join(',')\" style=\"display: none;\" (change)=\"onFileChange($event)\" />\n\n<ng-container *ngIf=\"type == 'inline'; else elseTemplate\">\n <ax-form-group size=\"{{size}}\">\n <ax-text-box [value]=\"fileName\" readonly=\"true\" [disabled]=\"disabled\"></ax-text-box>\n <ax-button type=\"blank light\" icon=\"far fa-times\" (click)=\"remove()\" *ngIf=\"fileName\" [tabIndex]=\"-1\">\n </ax-button>\n <ax-button type=\"primary blank\" icon=\"far fa-upload\" (click)=\"open()\" [disabled]=\"disabled\" [tabIndex]=\"-1\">\n </ax-button>\n </ax-form-group>\n</ng-container>\n\n<ng-template #elseTemplate>\n <div class=\"ax upload-file-box\" (click)=\"open()\" #dropRef>\n </div>\n</ng-template>\n" }]
200
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.AXRenderService }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { contentType: [{
264
+ args: [{ selector: 'ax-upload-file', encapsulation: ViewEncapsulation.None, host: { style: 'display: block; width:100%; position: relative' }, template: "<input\n #fileInput\n type=\"file\"\n [accept]=\"accessTypes.join(',')\"\n style=\"display: none\"\n (change)=\"onFileChange($event)\"\n/>\n\n<ng-container *ngIf=\"type == 'inline'; else elseTemplate\">\n <ax-form-group size=\"{{ size }}\">\n <ax-text-box\n [value]=\"fileName\"\n readonly=\"true\"\n [disabled]=\"disabled\"\n ></ax-text-box>\n <ax-button\n type=\"blank light\"\n icon=\"far fa-times\"\n (click)=\"remove()\"\n *ngIf=\"fileName\"\n [tabIndex]=\"-1\"\n >\n </ax-button>\n <ax-button\n type=\"primary blank\"\n icon=\"far fa-upload\"\n (click)=\"open()\"\n [disabled]=\"disabled\"\n [tabIndex]=\"-1\"\n >\n </ax-button>\n </ax-form-group>\n</ng-container>\n\n<ng-template #elseTemplate>\n <div class=\"ax upload-file-box\" (click)=\"open()\" #dropRef></div>\n</ng-template>\n" }]
265
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.AXRenderService }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i2.AXToastService }]; }, propDecorators: { contentType: [{
201
266
  type: Input
202
267
  }], dropRef: [{
203
268
  type: Input
@@ -223,4 +288,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
223
288
  }], onRemove: [{
224
289
  type: Output
225
290
  }] } });
226
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWZpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NyYy9saWIvdXBsb2FkLWZpbGUvdXBsb2FkLWZpbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NyYy9saWIvdXBsb2FkLWZpbGUvdXBsb2FkLWZpbGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFVBQVUsRUFDVixpQkFBaUIsRUFDakIsV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRixPQUFPLEVBQThELGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7QUFRL0MsTUFBTSxPQUFPLHFCQUFzQixTQUFRLGVBQWU7SUE4RTlDO0lBQ0E7SUFDQTtJQUNFO0lBaEZKLFVBQVUsQ0FBYztJQUdoQyxXQUFXLEdBQTJFLE9BQU8sQ0FBQztJQUc5RixPQUFPLENBQWM7SUFHckIsV0FBVyxDQUFjO0lBR3pCLEtBQUssQ0FBUztJQUdkLElBQUksR0FBa0IsSUFBSSxDQUFDO0lBRUgsU0FBUyxDQUFhO0lBRzlDLElBQUksR0FBZ0MsUUFBUSxDQUFDO0lBR3RDLFFBQVEsQ0FBbUI7SUFFekIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUVuQyxNQUFNLEdBQXdDLElBQUksWUFBWSxFQUF5QixDQUFDO0lBR3hGLFVBQVUsR0FBNEMsSUFBSSxZQUFZLEVBQTZCLENBQUM7SUFHcEcsUUFBUSxHQUFzQixJQUFJLFlBQVksRUFBRSxD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QVM7dUJBQUMsV0FBVztnQkFHdEIsSUFBSTtzQkFESCxLQUFLO2dCQUlDLFFBQVE7c0JBRGQsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVOLE1BQU07c0JBREwsTUFBTTtnQkFJUCxVQUFVO3NCQURULE1BQU07Z0JBSVAsUUFBUTtzQkFEUCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBWaWV3Q2hpbGQsXG4gIElucHV0LFxuICBFbGVtZW50UmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgVGVtcGxhdGVSZWYsXG4gIFJlbmRlcmVyMixcbiAgRXZlbnRFbWl0dGVyLFxuICBPdXRwdXQsXG4gIENoYW5nZURldGVjdG9yUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhVcGxvYWRGaWxlTG9hZEV2ZW50LCBBWFVwbG9hZEZpbGVQcm9ncmVzc0V2ZW50IH0gZnJvbSAnLi91cGxvYWQtZmlsZS5ldmVudHMnO1xuaW1wb3J0IHsgQVhQcm9ncmVzc0JhckNvbXBvbmVudCB9IGZyb20gJy4uL3Byb2dyZXNzLWJhci9wcm9ncmVzcy1iYXIuY29tcG9uZW50JztcbmltcG9ydCB7IEFYQmFzZVRleHRDb21wb25lbnQsIEFYRWxlbWVudFNpemUsIEFYQmFzZVNpemFibGVDb21wb25lbnQsIEFYQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2UvZWxlbWVudC5jbGFzcyc7XG5pbXBvcnQgeyBBWFJlbmRlclNlcnZpY2UgfSBmcm9tICdAYWNvcmV4L2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdheC11cGxvYWQtZmlsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi91cGxvYWQtZmlsZS5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHsgc3R5bGU6ICdkaXNwbGF5OiBibG9jazsgd2lkdGg6MTAwJTsgcG9zaXRpb246IHJlbGF0aXZlJyB9XG59KVxuZXhwb3J0IGNsYXNzIEFYVXBsb2FkRmlsZUNvbXBvbmVudCBleHRlbmRzIEFYQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFYQmFzZVNpemFibGVDb21wb25lbnQge1xuICBwcml2YXRlIG92ZXJsYXlEaXY6IEhUTUxFbGVtZW50O1xuXG4gIEBJbnB1dCgpXG4gIGNvbnRlbnRUeXBlOiAnaW1hZ2UnIHwgJ2V4Y2VsJyB8ICdhdWRpbycgfCAndmlkZW8nIHwgJ3ZpZGVvL2ltYWdlJyB8ICdhbnknIHwgJ2pzb24nID0gJ2ltYWdlJztcblxuICBASW5wdXQoKVxuICBkcm9wUmVmOiBIVE1MRWxlbWVudDtcblxuICBASW5wdXQoKVxuICBwcm9ncmVzc1JlZjogSFRNTEVsZW1lbnQ7XG5cbiAgQElucHV0KClcbiAgbGFiZWw6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBzaXplOiBBWEVsZW1lbnRTaXplID0gXCJtZFwiO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcpIGZpbGVJbnB1dDogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKVxuICB0eXBlOiAnYm94JyB8ICdpbmxpbmUnIHwgJ2hpZGRlbicgPSAnaW5saW5lJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpXG4gIG9uTG9hZDogRXZlbnRFbWl0dGVyPEFYVXBsb2FkRmlsZUxvYWRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYVXBsb2FkRmlsZUxvYWRFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgb25Qcm9ncmVzczogRXZlbnRFbWl0dGVyPEFYVXBsb2FkRmlsZVByb2dyZXNzRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBWFVwbG9hZEZpbGVQcm9ncmVzc0V2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBvblJlbW92ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgZmlsZVR5cGVzOiBhbnlbXSA9IFtcbiAgICB7XG4gICAgICB0eXBlOiAnaW1hZ2UnLFxuICAgICAgYWNjZXB0OiBbJ2ltYWdlL2dpZicsICdpbWFnZS9qcGVnJywgJ2ltYWdlL3BuZyddLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ2F1ZGlvJyxcbiAgICAgIGFjY2VwdDogWydhdWRpby9tcDMnXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdlYm9vaycsXG4gICAgICBhY2NlcHQ6IFsnYXBwbGljYXRpb24vcGRmJ10sXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnZXhjZWwnLFxuICAgICAgYWNjZXB0OiBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCddLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3ZpZGVvJyxcbiAgICAgIGFjY2VwdDogWyd2aWRlby8qJ10sXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAndmlkZW8vaW1hZ2UnLFxuICAgICAgYWNjZXB0OiBbJ2ltYWdlL2dpZicsICdpbWFnZS9qcGVnJywgJ2ltYWdlL3BuZycsICd2aWRlby8qJ10sXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnanNvbicsXG4gICAgICBhY2NlcHQ6IFsnYXBwbGljYXRpb24vanNvbiddLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ2FueScsXG4gICAgICBhY2NlcHQ6IFsnKi8qJ10sXG4gICAgfSxcbiAgXTtcblxuXG5cbiAgZmlsZXM6IEZpbGVbXSA9IFtdO1xuICBmb2N1cygpIHsgfVxuXG4gIGZpbGVOYW1lOiBzdHJpbmcgPSAnJztcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgcHJpdmF0ZSBpbmplY3Rpb25TZXJ2aWNlOiBBWFJlbmRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZW5kcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG5cbiAgb25EZWxldGVDbGljayhlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIG9uRmlsZUNoYW5nZShlKSB7XG4gICAgY29uc3QgZmlsZXMgPSBlLnRhcmdldC5maWxlcztcbiAgICB0aGlzLmFkZEZpbGUoZmlsZXNbMF0pO1xuICAgICh0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlID0gbnVsbDtcbiAgfVxuXG4gIG9wZW4oKSB7XG4gICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC5jbGljayh7IGFjY2VwdDogdGhpcy5hY2Nlc3NUeXBlcyB9KTtcbiAgfVxuICByZW1vdmUoKSB7XG4gICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnXG4gICAgdGhpcy5maWxlcyA9IFtdO1xuICAgIHRoaXMuZmlsZU5hbWUgPSBudWxsXG4gICAgdGhpcy5vblJlbW92ZS5lbWl0KClcbiAgfVxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZHJvcFJlZiAhPSBudWxsKSB7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZHJvcFJlZiA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICB9XG4gICAgLy9cbiAgICBpZiAodGhpcy5wcm9ncmVzc1JlZiAhPSBudWxsKSB7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvZ3Jlc3NSZWYgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuICAgIC8vXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2hpZGRlbicgfHwgdGhpcy50eXBlID09PSAnYm94Jykge1xuICAgICAgdGhpcy5vdmVybGF5RGl2ID0gdGhpcy5yZW5kcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgdGhpcy5vdmVybGF5RGl2LmNsYXNzTGlzdC5hZGQoJ292ZXJsYXknKTtcbiAgICAgIHRoaXMub3ZlcmxheURpdi5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvbi13cmFwcGVyXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiZmFyIGZhLWNsb3VkLXVwbG9hZC1hbHQgZmEtM3hcIj48L2k+XG4gICAgICAgIDxzcGFuPkRyb3AgRmlsZShzKSBIZXJlPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgICAgIHRoaXMub3ZlcmxheURpdi5hZGRFdmVudExpc3RlbmVyKCdkcmFnJywgdGhpcy5oYW5kbGVPdmVybGF5RHJhZ092ZXIpO1xuICAgICAgdGhpcy5vdmVybGF5RGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5oYW5kbGVPdmVybGF5RHJhZ092ZXIpO1xuICAgICAgdGhpcy5vdmVybGF5RGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMuaGFuZGxlT3ZlcmxheURyYWdPdmVyKTtcbiAgICAgIHRoaXMucmVuZHJlci5hcHBlbmRDaGlsZCh0aGlzLmRyb3BSZWYsIHRoaXMub3ZlcmxheURpdik7XG4gICAgfVxuICAgIC8vXG4gICAgdGhpcy5kcm9wUmVmLmNsYXNzTGlzdC5hZGQoJ2F4LXVwbG9hZC1kcm9wLW92ZXInKTtcbiAgICB0aGlzLmRyb3BSZWYuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmhhbmRsZURyYWdPdmVyLmJpbmQodGhpcykpO1xuICAgIHRoaXMuZHJvcFJlZi5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCB0aGlzLmhhbmRsZURyYWdMZWF2ZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmRyb3BSZWYuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuaGFuZGxlRHJvcC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlT3ZlcmxheURyYWdPdmVyKGU6IERyYWdFdmVudCkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRHJhZ092ZXIoZTogRHJhZ0V2ZW50KSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5vdmVybGF5RGl2LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURyYWdMZWF2ZShlOiBEcmFnRXZlbnQpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLm92ZXJsYXlEaXYuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGhhbmRsZURyb3AoZTogRHJhZ0V2ZW50KSB7XG4gICAgdGhpcy5oYW5kbGVEcmFnTGVhdmUoZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlLmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZmlsZSA9IGUuZGF0YVRyYW5zZmVyLmZpbGVzW2ldO1xuICAgICAgdGhpcy5hZGRGaWxlKGZpbGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRmlsZShmaWxlOiBGaWxlKSB7XG4gICAgY29uc3QgcHJvZ3Jlc3NEaXYgPSB0aGlzLnJlbmRyZXIuY3JlYXRlRWxlbWVudCgnZGl2JykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgcHJvZ3Jlc3NEaXYuY2xhc3NMaXN0LmFkZCgnYXgtdXBsb2FkLXByb2dyZXNzLXBhbmVsJyk7XG4gICAgY29uc3QgcHJvZ3Jlc3NMYWJlbCA9IHRoaXMucmVuZHJlci5jcmVhdGVFbGVtZW50KCdzbWFsbCcpIGFzIEhUTUxFbGVtZW50O1xuICAgIHByb2dyZXNzTGFiZWwuaW5uZXJUZXh0ID0gZmlsZS5uYW1lO1xuICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlLm5hbWU7XG4gICAgdGhpcy5yZW5kcmVyLmFwcGVuZENoaWxkKHRoaXMucHJvZ3Jlc3NSZWYsIHByb2dyZXNzRGl2KTtcbiAgICBjb25zdCBjb20gPSB0aGlzLmluamVjdGlvblNlcnZpY2UuYXBwZW5kQ29tcG9uZW50KEFYUHJvZ3Jlc3NCYXJDb21wb25lbnQsIHsgcHJvZ3Jlc3M6IDAgfSwgcHJvZ3Jlc3NEaXYpLmluc3RhbmNlIGFzIEFYUHJvZ3Jlc3NCYXJDb21wb25lbnQ7XG4gICAgdGhpcy5yZW5kcmVyLmFwcGVuZENoaWxkKHByb2dyZXNzRGl2LCBwcm9ncmVzc0xhYmVsKTtcblxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoZSkgPT4ge1xuICAgICAgdGhpcy5vbkxvYWQuZW1pdCh7XG4gICAgICAgIGZpbGUsXG4gICAgICAgIGRhdGE6IChlIGFzIGFueSkudGFyZ2V0LnJlc3VsdFxuICAgICAgfSk7XG4gICAgICAvL1xuICAgICAgLy8gRmFrZSBVcGxvYWRcbiAgICAgIGxldCBwdiA9IDA7XG4gICAgICBsZXQgdXBsb2FkZWQgPSAwO1xuICAgICAgY29uc3QgaW50diA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdXBsb2FkZWQgKz0gMTAyNCAqIDEwMDA7XG4gICAgICAgIGlmICh1cGxvYWRlZCA+IGUudG90YWwpIHtcbiAgICAgICAgICB1cGxvYWRlZCA9IGUudG90YWw7XG4gICAgICAgIH1cbiAgICAgICAgcHYgPSBNYXRoLmNlaWwoKHVwbG9hZGVkIC8gZS50b3RhbCkgKiAxMDApO1xuICAgICAgICBjb20ucHJvZ3Jlc3MgPSBwdjtcbiAgICAgICAgdGhpcy5vblByb2dyZXNzLmVtaXQoe1xuICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgdG90YWw6IGUudG90YWwsXG4gICAgICAgICAgdXBsb2FkZWQsXG4gICAgICAgICAgdmFsdWU6IHB2XG4gICAgICAgIH0pO1xuICAgICAgICAvL1xuICAgICAgICBpZiAoY29tLnByb2dyZXNzID49IDEwMCkge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50dik7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbmRyZXIucmVtb3ZlQ2hpbGQodGhpcy5wcm9ncmVzc1JlZiwgcHJvZ3Jlc3NEaXYpO1xuICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH0pO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgIHRoaXMuZmlsZXMucHVzaChmaWxlKTtcbiAgfVxuXG4gIGdldCBhY2Nlc3NUeXBlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZVR5cGVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PSB0aGlzLmNvbnRlbnRUeXBlKS5hY2NlcHQ7XG4gIH1cbn1cbiIsIjxpbnB1dCAjZmlsZUlucHV0IHR5cGU9XCJmaWxlXCIgW2FjY2VwdF09XCJhY2Nlc3NUeXBlcy5qb2luKCcsJylcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgKGNoYW5nZSk9XCJvbkZpbGVDaGFuZ2UoJGV2ZW50KVwiIC8+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09ICdpbmxpbmUnOyBlbHNlIGVsc2VUZW1wbGF0ZVwiPlxuICA8YXgtZm9ybS1ncm91cCBzaXplPVwie3tzaXplfX1cIj5cbiAgICA8YXgtdGV4dC1ib3ggW3ZhbHVlXT1cImZpbGVOYW1lXCIgcmVhZG9ubHk9XCJ0cnVlXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+PC9heC10ZXh0LWJveD5cbiAgICA8YXgtYnV0dG9uIHR5cGU9XCJibGFuayBsaWdodFwiIGljb249XCJmYXIgZmEtdGltZXNcIiAoY2xpY2spPVwicmVtb3ZlKClcIiAqbmdJZj1cImZpbGVOYW1lXCIgW3RhYkluZGV4XT1cIi0xXCI+XG4gICAgPC9heC1idXR0b24+XG4gICAgPGF4LWJ1dHRvbiB0eXBlPVwicHJpbWFyeSBibGFua1wiIGljb249XCJmYXIgZmEtdXBsb2FkXCIgKGNsaWNrKT1cIm9wZW4oKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFt0YWJJbmRleF09XCItMVwiPlxuICAgIDwvYXgtYnV0dG9uPlxuICA8L2F4LWZvcm0tZ3JvdXA+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNlbHNlVGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJheCB1cGxvYWQtZmlsZS1ib3hcIiAoY2xpY2spPVwib3BlbigpXCIgI2Ryb3BSZWY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
291
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWZpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NyYy9saWIvdXBsb2FkLWZpbGUvdXBsb2FkLWZpbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NyYy9saWIvdXBsb2FkLWZpbGUvdXBsb2FkLWZpbGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0QsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsZUFBZSxHQUdoQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7QUFZeEQsTUFBTSxPQUFPLHFCQUNYLFNBQVEsZUFBZTtJQXFHYjtJQUNBO0lBQ0E7SUFDRTtJQUNGO0lBdEdGLFVBQVUsQ0FBYztJQUdoQyxXQUFXLEdBT0UsT0FBTyxDQUFDO0lBR3JCLE9BQU8sQ0FBYztJQUdyQixXQUFXLENBQWM7SUFHekIsS0FBSyxDQUFTO0lBR2QsSUFBSSxHQUFrQixJQUFJLENBQUM7SUFFSCxTQUFTLENBQWE7SUFHOUMsSUFBSSxHQUFnQyxRQUFRLENBQUM7SUFHdEMsUUFBUSxDQUFtQjtJQUV6QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBRW5DLE1BQU0sR0FDSixJQUFJLFlBQVksRUFBeUIsQ0FBQztJQUc1QyxVQUFVLEdBQ1Is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QVhSZW5kZXJTZXJ2aWNlLCBBWFRyYW5zbGF0b3IgfSBmcm9tICdAYWNvcmV4L2NvcmUnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFYQmFzZUNvbXBvbmVudCxcbiAgQVhCYXNlU2l6YWJsZUNvbXBvbmVudCxcbiAgQVhFbGVtZW50U2l6ZSxcbn0gZnJvbSAnLi4vYmFzZS9lbGVtZW50LmNsYXNzJztcbmltcG9ydCB7IEFYUHJvZ3Jlc3NCYXJDb21wb25lbnQgfSBmcm9tICcuLi9wcm9ncmVzcy1iYXIvcHJvZ3Jlc3MtYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBWFRvYXN0U2VydmljZSB9IGZyb20gJy4uL3RvYXN0L3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQVhVcGxvYWRGaWxlTG9hZEV2ZW50LFxuICBBWFVwbG9hZEZpbGVQcm9ncmVzc0V2ZW50LFxufSBmcm9tICcuL3VwbG9hZC1maWxlLmV2ZW50cyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F4LXVwbG9hZC1maWxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VwbG9hZC1maWxlLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDogeyBzdHlsZTogJ2Rpc3BsYXk6IGJsb2NrOyB3aWR0aDoxMDAlOyBwb3NpdGlvbjogcmVsYXRpdmUnIH0sXG59KVxuZXhwb3J0IGNsYXNzIEFYVXBsb2FkRmlsZUNvbXBvbmVudFxuICBleHRlbmRzIEFYQmFzZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFYQmFzZVNpemFibGVDb21wb25lbnRcbntcbiAgcHJpdmF0ZSBvdmVybGF5RGl2OiBIVE1MRWxlbWVudDtcblxuICBASW5wdXQoKVxuICBjb250ZW50VHlwZTpcbiAgICB8ICdpbWFnZSdcbiAgICB8ICdleGNlbCdcbiAgICB8ICdhdWRpbydcbiAgICB8ICd2aWRlbydcbiAgICB8ICd2aWRlby9pbWFnZSdcbiAgICB8ICdhbnknXG4gICAgfCAnanNvbicgPSAnaW1hZ2UnO1xuXG4gIEBJbnB1dCgpXG4gIGRyb3BSZWY6IEhUTUxFbGVtZW50O1xuXG4gIEBJbnB1dCgpXG4gIHByb2dyZXNzUmVmOiBIVE1MRWxlbWVudDtcblxuICBASW5wdXQoKVxuICBsYWJlbDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHNpemU6IEFYRWxlbWVudFNpemUgPSAnbWQnO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcpIGZpbGVJbnB1dDogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKVxuICB0eXBlOiAnYm94JyB8ICdpbmxpbmUnIHwgJ2hpZGRlbicgPSAnaW5saW5lJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpXG4gIG9uTG9hZDogRXZlbnRFbWl0dGVyPEFYVXBsb2FkRmlsZUxvYWRFdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8QVhVcGxvYWRGaWxlTG9hZEV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBvblByb2dyZXNzOiBFdmVudEVtaXR0ZXI8QVhVcGxvYWRGaWxlUHJvZ3Jlc3NFdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8QVhVcGxvYWRGaWxlUHJvZ3Jlc3NFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgb25SZW1vdmU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGZpbGVUeXBlczogYW55W10gPSBbXG4gICAge1xuICAgICAgdHlwZTogJ2ltYWdlJyxcbiAgICAgIGFjY2VwdDogWydpbWFnZS9naWYnLCAnaW1hZ2UvanBlZycsICdpbWFnZS9wbmcnXSxcbiAgICAgIG1lc3NhZ2U6ICfYudqp2LMnLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ2F1ZGlvJyxcbiAgICAgIGFjY2VwdDogWydhdWRpby9tcDMnXSxcbiAgICAgIG1lc3NhZ2U6ICdhdWRpbycsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnZWJvb2snLFxuICAgICAgYWNjZXB0OiBbJ2FwcGxpY2F0aW9uL3BkZiddLFxuICAgICAgbWVzc2FnZTogJ3BkZicsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnZXhjZWwnLFxuICAgICAgYWNjZXB0OiBbXG4gICAgICAgICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnLFxuICAgICAgICAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnLFxuICAgICAgICAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0Lm1hY3JvRW5hYmxlZC4xMicsXG4gICAgICAgICdhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0JyxcbiAgICAgICAgJ3RleHQvY3N2JyxcbiAgICAgIF0sXG4gICAgICBtZXNzYWdlOiAn2Kfaqdiz2YQnLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3ZpZGVvJyxcbiAgICAgIGFjY2VwdDogWyd2aWRlby8qJ10sXG4gICAgICBtZXNzYWdlOiAndmlkZW8nLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3ZpZGVvL2ltYWdlJyxcbiAgICAgIGFjY2VwdDogWydpbWFnZS9naWYnLCAnaW1hZ2UvanBlZycsICdpbWFnZS9wbmcnLCAndmlkZW8vKiddLFxuICAgICAgbWVzc2FnZTogJ3ZpZGVvL2ltYWdlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdqc29uJyxcbiAgICAgIGFjY2VwdDogWydhcHBsaWNhdGlvbi9qc29uJ10sXG4gICAgICBtZXNzYWdlOiAnanNvbicsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnYW55JyxcbiAgICAgIGFjY2VwdDogWycqLyonXSxcbiAgICAgIG1lc3NhZ2U6ICcnLFxuICAgIH0sXG4gIF07XG5cbiAgZmlsZXM6IEZpbGVbXSA9IFtdO1xuICBmb2N1cygpIHt9XG5cbiAgZmlsZU5hbWU6IHN0cmluZyA9ICcnO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIGluamVjdGlvblNlcnZpY2U6IEFYUmVuZGVyU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmRyZXI6IFJlbmRlcmVyMixcbiAgICBwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogQVhUb2FzdFNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG9uRGVsZXRlQ2xpY2soZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBvbkZpbGVDaGFuZ2UoZSkge1xuICAgIGNvbnN0IGZpbGVzID0gZS50YXJnZXQuZmlsZXM7XG4gICAgdGhpcy5hZGRGaWxlKGZpbGVzWzBdKTtcbiAgICAodGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSA9IG51bGw7XG4gIH1cblxuICBvcGVuKCkge1xuICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQuY2xpY2soeyBhY2NlcHQ6IHRoaXMuYWNjZXNzVHlwZXMgfSk7XG4gIH1cbiAgcmVtb3ZlKCkge1xuICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICB0aGlzLmZpbGVzID0gW107XG4gICAgdGhpcy5maWxlTmFtZSA9IG51bGw7XG4gICAgdGhpcy5vblJlbW92ZS5lbWl0KCk7XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRyb3BSZWYgIT0gbnVsbCkge1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyb3BSZWYgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnVwbG9hZC1maWxlLWJveCcpO1xuICAgIH1cbiAgICAvL1xuICAgIGlmICh0aGlzLnByb2dyZXNzUmVmICE9IG51bGwpIHtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9ncmVzc1JlZiA9XG4gICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudXBsb2FkLWZpbGUtYm94Jyk7XG4gICAgfVxuICAgIC8vXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2hpZGRlbicgfHwgdGhpcy50eXBlID09PSAnYm94Jykge1xuICAgICAgdGhpcy5oYW5kbGVTaG93RW1wdHlGaWxlKCk7XG4gICAgICB0aGlzLm92ZXJsYXlEaXYuYWRkRXZlbnRMaXN0ZW5lcignZHJhZycsIHRoaXMuaGFuZGxlT3ZlcmxheURyYWdPdmVyKTtcbiAgICAgIHRoaXMub3ZlcmxheURpdi5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuaGFuZGxlT3ZlcmxheURyYWdPdmVyKTtcbiAgICAgIHRoaXMub3ZlcmxheURpdi5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCB0aGlzLmhhbmRsZU92ZXJsYXlEcmFnT3Zlcik7XG4gICAgfVxuICAgIC8vXG4gICAgLy8gdGhpcy5kcm9wUmVmLmNsYXNzTGlzdC5hZGQoJ2F4LXVwbG9hZC1kcm9wLW92ZXInKTtcbiAgICB0aGlzLmRyb3BSZWYuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmhhbmRsZURyYWdPdmVyLmJpbmQodGhpcykpO1xuICAgIHRoaXMuZHJvcFJlZi5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCB0aGlzLmhhbmRsZURyYWdMZWF2ZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmRyb3BSZWYuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuaGFuZGxlRHJvcC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlT3ZlcmxheURyYWdPdmVyKGU6IERyYWdFdmVudCkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRHJhZ092ZXIoZTogRHJhZ0V2ZW50KSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5vdmVybGF5RGl2LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURyYWdMZWF2ZShlOiBEcmFnRXZlbnQpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLm92ZXJsYXlEaXYuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGhhbmRsZURyb3AoZTogRHJhZ0V2ZW50KSB7XG4gICAgdGhpcy5oYW5kbGVEcmFnTGVhdmUoZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlLmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZmlsZSA9IGUuZGF0YVRyYW5zZmVyLmZpbGVzW2ldO1xuICAgICAgdGhpcy5hZGRGaWxlKGZpbGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRmlsZShmaWxlOiBGaWxlKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb250ZW50VHlwZSAmJlxuICAgICAgdGhpcy5jb250ZW50VHlwZSAhPT0gJ2FueScgJiZcbiAgICAgICF0aGlzLmZpbGVUeXBlc1xuICAgICAgICAuZmluZCgoeCkgPT4geC50eXBlID09PSB0aGlzLmNvbnRlbnRUeXBlKVxuICAgICAgICAuYWNjZXB0LmluY2x1ZGVzKGZpbGUudHlwZSlcbiAgICApIHtcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmluZm8oXG4gICAgICAgIGDZgdin24zZhCDYqNin2LHar9iw2KfYsduMINio2KfbjNivINin2LIg2YbZiNi5ICR7XG4gICAgICAgICAgdGhpcy5maWxlVHlwZXMuZmluZCgoeCkgPT4geC50eXBlID09PSB0aGlzLmNvbnRlbnRUeXBlKS5tZXNzYWdlXG4gICAgICAgIH0g2KjYp9i02K9gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2dyZXNzRGl2ID0gdGhpcy5yZW5kcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpIGFzIEhUTUxFbGVtZW50O1xuICAgIHByb2dyZXNzRGl2LmNsYXNzTGlzdC5hZGQoJ2F4LXVwbG9hZC1wcm9ncmVzcy1wYW5lbCcpO1xuICAgIGNvbnN0IHByb2dyZXNzTGFiZWwgPSB0aGlzLnJlbmRyZXIuY3JlYXRlRWxlbWVudCgnc21hbGwnKSBhcyBIVE1MRWxlbWVudDtcbiAgICBwcm9ncmVzc0xhYmVsLmlubmVyVGV4dCA9IGZpbGUubmFtZTtcbiAgICB0aGlzLmZpbGVOYW1lID0gZmlsZS5uYW1lO1xuICAgIHRoaXMucmVuZHJlci5hcHBlbmRDaGlsZCh0aGlzLnByb2dyZXNzUmVmLCBwcm9ncmVzc0Rpdik7XG4gICAgY29uc3QgY29tID0gdGhpcy5pbmplY3Rpb25TZXJ2aWNlLmFwcGVuZENvbXBvbmVudChcbiAgICAgIEFYUHJvZ3Jlc3NCYXJDb21wb25lbnQsXG4gICAgICB7IHByb2dyZXNzOiAwIH0sXG4gICAgICBwcm9ncmVzc0RpdlxuICAgICkuaW5zdGFuY2UgYXMgQVhQcm9ncmVzc0JhckNvbXBvbmVudDtcbiAgICB0aGlzLnJlbmRyZXIuYXBwZW5kQ2hpbGQocHJvZ3Jlc3NEaXYsIHByb2dyZXNzTGFiZWwpO1xuXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIChlKSA9PiB7XG4gICAgICB0aGlzLm9uTG9hZC5lbWl0KHtcbiAgICAgICAgZmlsZSxcbiAgICAgICAgZGF0YTogKGUgYXMgYW55KS50YXJnZXQucmVzdWx0LFxuICAgICAgfSk7XG4gICAgICAvL1xuICAgICAgLy8gRmFrZSBVcGxvYWRcbiAgICAgIGxldCBwdiA9IDA7XG4gICAgICBsZXQgdXBsb2FkZWQgPSAwO1xuICAgICAgY29uc3QgaW50diA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdXBsb2FkZWQgKz0gMTAyNCAqIDEwMDA7XG4gICAgICAgIGlmICh1cGxvYWRlZCA+IGUudG90YWwpIHtcbiAgICAgICAgICB1cGxvYWRlZCA9IGUudG90YWw7XG4gICAgICAgIH1cbiAgICAgICAgcHYgPSBNYXRoLmNlaWwoKHVwbG9hZGVkIC8gZS50b3RhbCkgKiAxMDApO1xuICAgICAgICBjb20ucHJvZ3Jlc3MgPSBwdjtcbiAgICAgICAgdGhpcy5vblByb2dyZXNzLmVtaXQoe1xuICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgdG90YWw6IGUudG90YWwsXG4gICAgICAgICAgdXBsb2FkZWQsXG4gICAgICAgICAgdmFsdWU6IHB2LFxuICAgICAgICB9KTtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGNvbS5wcm9ncmVzcyA+PSAxMDApIHtcbiAgICAgICAgICBjbGVhckludGVydmFsKGludHYpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kcmVyLnJlbW92ZUNoaWxkKHRoaXMucHJvZ3Jlc3NSZWYsIHByb2dyZXNzRGl2KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbGVOYW1lKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVuZHJlci5yZW1vdmVDaGlsZCh0aGlzLmRyb3BSZWYsIHRoaXMub3ZlcmxheURpdik7XG4gICAgICAgICAgICAgIHRoaXMub3ZlcmxheURpdiA9IHRoaXMucmVuZHJlci5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICdkaXYnXG4gICAgICAgICAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgIHRoaXMub3ZlcmxheURpdi5jbGFzc0xpc3QuYWRkKCdvdmVybGF5Jyk7XG4gICAgICAgICAgICAgIHRoaXMub3ZlcmxheURpdi5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgICAgICAgICBnYXA6IDhweDtcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIHN0eWxlPVwiY29sb3I6IHZhcigtLWF4LWRhbmdlci1jb2xvcilcIiBjbGFzcz1cImZhciBmYS10aW1lcyBmYS0zeFwiPjwvaT5cbiAgICAgICAgICAgICAgPHNwYW4+JHt0aGlzLmZpbGVOYW1lfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgXG4gICAgICAgICAgICBgO1xuICAgICAgICAgICAgICBjb25zdCBjbG9zZUljb24gPSB0aGlzLm92ZXJsYXlEaXYucXVlcnlTZWxlY3RvcignLmZhci5mYS10aW1lcycpO1xuICAgICAgICAgICAgICB0aGlzLnJlbmRyZXIubGlzdGVuKGNsb3NlSWNvbiwgJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZHJlci5yZW1vdmVDaGlsZCh0aGlzLmRyb3BSZWYsIHRoaXMub3ZlcmxheURpdik7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTaG93RW1wdHlGaWxlKCk7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMucmVuZHJlci5hcHBlbmRDaGlsZCh0aGlzLmRyb3BSZWYsIHRoaXMub3ZlcmxheURpdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDEwMCk7XG4gICAgfSk7XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgdGhpcy5maWxlcy5wdXNoKGZpbGUpO1xuICB9XG5cbiAgZ2V0IGFjY2Vzc1R5cGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5maWxlVHlwZXMuZmluZCgoaXRlbSkgPT4gaXRlbS50eXBlID09IHRoaXMuY29udGVudFR5cGUpLmFjY2VwdDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU2hvd0VtcHR5RmlsZSgpIHtcbiAgICB0aGlzLm92ZXJsYXlEaXYgPSB0aGlzLnJlbmRyZXIuY3JlYXRlRWxlbWVudCgnZGl2JykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy5vdmVybGF5RGl2LmNsYXNzTGlzdC5hZGQoJ292ZXJsYXknKTtcbiAgICB0aGlzLm92ZXJsYXlEaXYuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiAgc3R5bGU9XCJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgXCI+XG4gICAgPGkgY2xhc3M9XCJmYXIgZmEtY2xvdWQtdXBsb2FkLWFsdCBmYS0zeFwiPjwvaT5cbiAgICA8c3Bhbj4ke0FYVHJhbnNsYXRvci5nZXQoJ2NvbW1vbi51cGxvYWQnKX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICAgIHRoaXMucmVuZHJlci5hcHBlbmRDaGlsZCh0aGlzLmRyb3BSZWYsIHRoaXMub3ZlcmxheURpdik7XG4gICAgdGhpcy5kcm9wUmVmLmNsYXNzTGlzdC5hZGQoJ2F4LXVwbG9hZC1kcm9wLW92ZXInKTtcbiAgfVxufVxuIiwiPGlucHV0XG4gICNmaWxlSW5wdXRcbiAgdHlwZT1cImZpbGVcIlxuICBbYWNjZXB0XT1cImFjY2Vzc1R5cGVzLmpvaW4oJywnKVwiXG4gIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiXG4gIChjaGFuZ2UpPVwib25GaWxlQ2hhbmdlKCRldmVudClcIlxuLz5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInR5cGUgPT0gJ2lubGluZSc7IGVsc2UgZWxzZVRlbXBsYXRlXCI+XG4gIDxheC1mb3JtLWdyb3VwIHNpemU9XCJ7eyBzaXplIH19XCI+XG4gICAgPGF4LXRleHQtYm94XG4gICAgICBbdmFsdWVdPVwiZmlsZU5hbWVcIlxuICAgICAgcmVhZG9ubHk9XCJ0cnVlXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgPjwvYXgtdGV4dC1ib3g+XG4gICAgPGF4LWJ1dHRvblxuICAgICAgdHlwZT1cImJsYW5rIGxpZ2h0XCJcbiAgICAgIGljb249XCJmYXIgZmEtdGltZXNcIlxuICAgICAgKGNsaWNrKT1cInJlbW92ZSgpXCJcbiAgICAgICpuZ0lmPVwiZmlsZU5hbWVcIlxuICAgICAgW3RhYkluZGV4XT1cIi0xXCJcbiAgICA+XG4gICAgPC9heC1idXR0b24+XG4gICAgPGF4LWJ1dHRvblxuICAgICAgdHlwZT1cInByaW1hcnkgYmxhbmtcIlxuICAgICAgaWNvbj1cImZhciBmYS11cGxvYWRcIlxuICAgICAgKGNsaWNrKT1cIm9wZW4oKVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW3RhYkluZGV4XT1cIi0xXCJcbiAgICA+XG4gICAgPC9heC1idXR0b24+XG4gIDwvYXgtZm9ybS1ncm91cD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2Vsc2VUZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImF4IHVwbG9hZC1maWxlLWJveFwiIChjbGljayk9XCJvcGVuKClcIiAjZHJvcFJlZj48L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -17141,12 +17141,13 @@ class AXUploadFileComponent extends AXBaseComponent {
17141
17141
  injectionService;
17142
17142
  rendrer;
17143
17143
  cdr;
17144
+ toastService;
17144
17145
  overlayDiv;
17145
17146
  contentType = 'image';
17146
17147
  dropRef;
17147
17148
  progressRef;
17148
17149
  label;
17149
- size = "md";
17150
+ size = 'md';
17150
17151
  fileInput;
17151
17152
  type = 'inline';
17152
17153
  template;
@@ -17158,45 +17159,60 @@ class AXUploadFileComponent extends AXBaseComponent {
17158
17159
  {
17159
17160
  type: 'image',
17160
17161
  accept: ['image/gif', 'image/jpeg', 'image/png'],
17162
+ message: 'عکس',
17161
17163
  },
17162
17164
  {
17163
17165
  type: 'audio',
17164
17166
  accept: ['audio/mp3'],
17167
+ message: 'audio',
17165
17168
  },
17166
17169
  {
17167
17170
  type: 'ebook',
17168
17171
  accept: ['application/pdf'],
17172
+ message: 'pdf',
17169
17173
  },
17170
17174
  {
17171
17175
  type: 'excel',
17172
- accept: ['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
17176
+ accept: [
17177
+ 'application/vnd.ms-excel',
17178
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
17179
+ 'application/vnd.ms-excel.sheet.macroEnabled.12',
17180
+ 'application/vnd.oasis.opendocument.spreadsheet',
17181
+ 'text/csv',
17182
+ ],
17183
+ message: 'اکسل',
17173
17184
  },
17174
17185
  {
17175
17186
  type: 'video',
17176
17187
  accept: ['video/*'],
17188
+ message: 'video',
17177
17189
  },
17178
17190
  {
17179
17191
  type: 'video/image',
17180
17192
  accept: ['image/gif', 'image/jpeg', 'image/png', 'video/*'],
17193
+ message: 'video/image',
17181
17194
  },
17182
17195
  {
17183
17196
  type: 'json',
17184
17197
  accept: ['application/json'],
17198
+ message: 'json',
17185
17199
  },
17186
17200
  {
17187
17201
  type: 'any',
17188
17202
  accept: ['*/*'],
17203
+ message: '',
17189
17204
  },
17190
17205
  ];
17191
17206
  files = [];
17192
17207
  focus() { }
17193
17208
  fileName = '';
17194
- constructor(el, injectionService, rendrer, cdr) {
17209
+ constructor(el, injectionService, rendrer, cdr, toastService) {
17195
17210
  super();
17196
17211
  this.el = el;
17197
17212
  this.injectionService = injectionService;
17198
17213
  this.rendrer = rendrer;
17199
17214
  this.cdr = cdr;
17215
+ this.toastService = toastService;
17200
17216
  }
17201
17217
  onDeleteClick(e) {
17202
17218
  e.stopPropagation();
@@ -17219,31 +17235,24 @@ class AXUploadFileComponent extends AXBaseComponent {
17219
17235
  if (this.dropRef != null) {
17220
17236
  }
17221
17237
  else {
17222
- this.dropRef = this.el.nativeElement;
17238
+ this.dropRef = this.el.nativeElement.querySelector('.upload-file-box');
17223
17239
  }
17224
17240
  //
17225
17241
  if (this.progressRef != null) {
17226
17242
  }
17227
17243
  else {
17228
- this.progressRef = this.el.nativeElement;
17244
+ this.progressRef =
17245
+ this.el.nativeElement.querySelector('.upload-file-box');
17229
17246
  }
17230
17247
  //
17231
17248
  if (this.type === 'hidden' || this.type === 'box') {
17232
- this.overlayDiv = this.rendrer.createElement('div');
17233
- this.overlayDiv.classList.add('overlay');
17234
- this.overlayDiv.innerHTML = `
17235
- <div class="icon-wrapper">
17236
- <i class="far fa-cloud-upload-alt fa-3x"></i>
17237
- <span>Drop File(s) Here</span>
17238
- </div>
17239
- `;
17249
+ this.handleShowEmptyFile();
17240
17250
  this.overlayDiv.addEventListener('drag', this.handleOverlayDragOver);
17241
17251
  this.overlayDiv.addEventListener('dragover', this.handleOverlayDragOver);
17242
17252
  this.overlayDiv.addEventListener('dragleave', this.handleOverlayDragOver);
17243
- this.rendrer.appendChild(this.dropRef, this.overlayDiv);
17244
17253
  }
17245
17254
  //
17246
- this.dropRef.classList.add('ax-upload-drop-over');
17255
+ // this.dropRef.classList.add('ax-upload-drop-over');
17247
17256
  this.dropRef.addEventListener('dragover', this.handleDragOver.bind(this));
17248
17257
  this.dropRef.addEventListener('dragleave', this.handleDragLeave.bind(this));
17249
17258
  this.dropRef.addEventListener('drop', this.handleDrop.bind(this));
@@ -17273,6 +17282,14 @@ class AXUploadFileComponent extends AXBaseComponent {
17273
17282
  }
17274
17283
  }
17275
17284
  addFile(file) {
17285
+ if (this.contentType &&
17286
+ this.contentType !== 'any' &&
17287
+ !this.fileTypes
17288
+ .find((x) => x.type === this.contentType)
17289
+ .accept.includes(file.type)) {
17290
+ this.toastService.info(`فایل بارگذاری باید از نوع ${this.fileTypes.find((x) => x.type === this.contentType).message} باشد`);
17291
+ return;
17292
+ }
17276
17293
  const progressDiv = this.rendrer.createElement('div');
17277
17294
  progressDiv.classList.add('ax-upload-progress-panel');
17278
17295
  const progressLabel = this.rendrer.createElement('small');
@@ -17285,7 +17302,7 @@ class AXUploadFileComponent extends AXBaseComponent {
17285
17302
  reader.addEventListener('load', (e) => {
17286
17303
  this.onLoad.emit({
17287
17304
  file,
17288
- data: e.target.result
17305
+ data: e.target.result,
17289
17306
  });
17290
17307
  //
17291
17308
  // Fake Upload
@@ -17302,13 +17319,41 @@ class AXUploadFileComponent extends AXBaseComponent {
17302
17319
  file,
17303
17320
  total: e.total,
17304
17321
  uploaded,
17305
- value: pv
17322
+ value: pv,
17306
17323
  });
17307
17324
  //
17308
17325
  if (com.progress >= 100) {
17309
17326
  clearInterval(intv);
17310
17327
  setTimeout(() => {
17311
17328
  this.rendrer.removeChild(this.progressRef, progressDiv);
17329
+ if (this.fileName) {
17330
+ this.rendrer.removeChild(this.dropRef, this.overlayDiv);
17331
+ this.overlayDiv = this.rendrer.createElement('div');
17332
+ this.overlayDiv.classList.add('overlay');
17333
+ this.overlayDiv.innerHTML = `
17334
+ <div
17335
+ style="
17336
+ display: flex;
17337
+ flex-direction: column;
17338
+ align-items: center;
17339
+ justify-content: center;
17340
+ gap: 8px;
17341
+ "
17342
+ >
17343
+ <i style="color: var(--ax-danger-color)" class="far fa-times fa-3x"></i>
17344
+ <span>${this.fileName}</span>
17345
+ </div>
17346
+
17347
+ `;
17348
+ const closeIcon = this.overlayDiv.querySelector('.far.fa-times');
17349
+ this.rendrer.listen(closeIcon, 'click', (e) => {
17350
+ this.remove();
17351
+ this.rendrer.removeChild(this.dropRef, this.overlayDiv);
17352
+ this.handleShowEmptyFile();
17353
+ e.stopPropagation();
17354
+ });
17355
+ this.rendrer.appendChild(this.dropRef, this.overlayDiv);
17356
+ }
17312
17357
  }, 1000);
17313
17358
  }
17314
17359
  }, 100);
@@ -17319,13 +17364,31 @@ class AXUploadFileComponent extends AXBaseComponent {
17319
17364
  get accessTypes() {
17320
17365
  return this.fileTypes.find((item) => item.type == this.contentType).accept;
17321
17366
  }
17322
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AXUploadFileComponent, deps: [{ token: i0.ElementRef }, { token: i1$2.AXRenderService }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
17323
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AXUploadFileComponent, selector: "ax-upload-file", inputs: { contentType: "contentType", dropRef: "dropRef", progressRef: "progressRef", label: "label", size: "size", type: "type", template: "template", disabled: "disabled" }, outputs: { onLoad: "onLoad", onProgress: "onProgress", onRemove: "onRemove" }, host: { styleAttribute: "display: block; width:100%; position: relative" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<input #fileInput type=\"file\" [accept]=\"accessTypes.join(',')\" style=\"display: none;\" (change)=\"onFileChange($event)\" />\n\n<ng-container *ngIf=\"type == 'inline'; else elseTemplate\">\n <ax-form-group size=\"{{size}}\">\n <ax-text-box [value]=\"fileName\" readonly=\"true\" [disabled]=\"disabled\"></ax-text-box>\n <ax-button type=\"blank light\" icon=\"far fa-times\" (click)=\"remove()\" *ngIf=\"fileName\" [tabIndex]=\"-1\">\n </ax-button>\n <ax-button type=\"primary blank\" icon=\"far fa-upload\" (click)=\"open()\" [disabled]=\"disabled\" [tabIndex]=\"-1\">\n </ax-button>\n </ax-form-group>\n</ng-container>\n\n<ng-template #elseTemplate>\n <div class=\"ax upload-file-box\" (click)=\"open()\" #dropRef>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["type", "icon", "submitBehavior", "cancelBehavior", "block", "loading", "selected"] }, { kind: "component", type: AXTextBoxComponent, selector: "ax-text-box", inputs: ["mask", "showMask", "type", "maxLength", "maskGuid", "maskPlaceholder", "maskKeepCharPositions"] }, { kind: "component", type: AXFormGroupComponent, selector: "ax-form-group", inputs: ["size"] }], encapsulation: i0.ViewEncapsulation.None });
17367
+ handleShowEmptyFile() {
17368
+ this.overlayDiv = this.rendrer.createElement('div');
17369
+ this.overlayDiv.classList.add('overlay');
17370
+ this.overlayDiv.innerHTML = `
17371
+ <div style="
17372
+ display: flex;
17373
+ flex-direction: column;
17374
+ align-items: center;
17375
+ justify-content: center;
17376
+ gap: 8px;
17377
+ ">
17378
+ <i class="far fa-cloud-upload-alt fa-3x"></i>
17379
+ <span>${AXTranslator.get('common.upload')}</span>
17380
+ </div>
17381
+ `;
17382
+ this.rendrer.appendChild(this.dropRef, this.overlayDiv);
17383
+ this.dropRef.classList.add('ax-upload-drop-over');
17384
+ }
17385
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AXUploadFileComponent, deps: [{ token: i0.ElementRef }, { token: i1$2.AXRenderService }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: AXToastService }], target: i0.ɵɵFactoryTarget.Component });
17386
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AXUploadFileComponent, selector: "ax-upload-file", inputs: { contentType: "contentType", dropRef: "dropRef", progressRef: "progressRef", label: "label", size: "size", type: "type", template: "template", disabled: "disabled" }, outputs: { onLoad: "onLoad", onProgress: "onProgress", onRemove: "onRemove" }, host: { styleAttribute: "display: block; width:100%; position: relative" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<input\n #fileInput\n type=\"file\"\n [accept]=\"accessTypes.join(',')\"\n style=\"display: none\"\n (change)=\"onFileChange($event)\"\n/>\n\n<ng-container *ngIf=\"type == 'inline'; else elseTemplate\">\n <ax-form-group size=\"{{ size }}\">\n <ax-text-box\n [value]=\"fileName\"\n readonly=\"true\"\n [disabled]=\"disabled\"\n ></ax-text-box>\n <ax-button\n type=\"blank light\"\n icon=\"far fa-times\"\n (click)=\"remove()\"\n *ngIf=\"fileName\"\n [tabIndex]=\"-1\"\n >\n </ax-button>\n <ax-button\n type=\"primary blank\"\n icon=\"far fa-upload\"\n (click)=\"open()\"\n [disabled]=\"disabled\"\n [tabIndex]=\"-1\"\n >\n </ax-button>\n </ax-form-group>\n</ng-container>\n\n<ng-template #elseTemplate>\n <div class=\"ax upload-file-box\" (click)=\"open()\" #dropRef></div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["type", "icon", "submitBehavior", "cancelBehavior", "block", "loading", "selected"] }, { kind: "component", type: AXTextBoxComponent, selector: "ax-text-box", inputs: ["mask", "showMask", "type", "maxLength", "maskGuid", "maskPlaceholder", "maskKeepCharPositions"] }, { kind: "component", type: AXFormGroupComponent, selector: "ax-form-group", inputs: ["size"] }], encapsulation: i0.ViewEncapsulation.None });
17324
17387
  }
17325
17388
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AXUploadFileComponent, decorators: [{
17326
17389
  type: Component,
17327
- args: [{ selector: 'ax-upload-file', encapsulation: ViewEncapsulation.None, host: { style: 'display: block; width:100%; position: relative' }, template: "<input #fileInput type=\"file\" [accept]=\"accessTypes.join(',')\" style=\"display: none;\" (change)=\"onFileChange($event)\" />\n\n<ng-container *ngIf=\"type == 'inline'; else elseTemplate\">\n <ax-form-group size=\"{{size}}\">\n <ax-text-box [value]=\"fileName\" readonly=\"true\" [disabled]=\"disabled\"></ax-text-box>\n <ax-button type=\"blank light\" icon=\"far fa-times\" (click)=\"remove()\" *ngIf=\"fileName\" [tabIndex]=\"-1\">\n </ax-button>\n <ax-button type=\"primary blank\" icon=\"far fa-upload\" (click)=\"open()\" [disabled]=\"disabled\" [tabIndex]=\"-1\">\n </ax-button>\n </ax-form-group>\n</ng-container>\n\n<ng-template #elseTemplate>\n <div class=\"ax upload-file-box\" (click)=\"open()\" #dropRef>\n </div>\n</ng-template>\n" }]
17328
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$2.AXRenderService }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { contentType: [{
17390
+ args: [{ selector: 'ax-upload-file', encapsulation: ViewEncapsulation.None, host: { style: 'display: block; width:100%; position: relative' }, template: "<input\n #fileInput\n type=\"file\"\n [accept]=\"accessTypes.join(',')\"\n style=\"display: none\"\n (change)=\"onFileChange($event)\"\n/>\n\n<ng-container *ngIf=\"type == 'inline'; else elseTemplate\">\n <ax-form-group size=\"{{ size }}\">\n <ax-text-box\n [value]=\"fileName\"\n readonly=\"true\"\n [disabled]=\"disabled\"\n ></ax-text-box>\n <ax-button\n type=\"blank light\"\n icon=\"far fa-times\"\n (click)=\"remove()\"\n *ngIf=\"fileName\"\n [tabIndex]=\"-1\"\n >\n </ax-button>\n <ax-button\n type=\"primary blank\"\n icon=\"far fa-upload\"\n (click)=\"open()\"\n [disabled]=\"disabled\"\n [tabIndex]=\"-1\"\n >\n </ax-button>\n </ax-form-group>\n</ng-container>\n\n<ng-template #elseTemplate>\n <div class=\"ax upload-file-box\" (click)=\"open()\" #dropRef></div>\n</ng-template>\n" }]
17391
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$2.AXRenderService }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: AXToastService }]; }, propDecorators: { contentType: [{
17329
17392
  type: Input
17330
17393
  }], dropRef: [{
17331
17394
  type: Input