design-angular-kit
Version:
Un toolkit Angular conforme alle linee guida di design per i servizi web della PA
107 lines • 22 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { ItAbstractComponent } from '../../../abstracts/abstract.component';
import { ItFileUtils } from '../../../utils/file-utils';
import { forkJoin, take, tap } from 'rxjs';
import { ItIconComponent } from '../../utils/icon/icon.component';
import { TranslateModule } from '@ngx-translate/core';
import { ItTooltipDirective } from '../../core/tooltip/tooltip.directive';
import { ItProgressBarComponent } from '../../core/progress-bar/progress-bar.component';
import { inputToBoolean } from '../../../utils/coercion';
import * as i0 from "@angular/core";
import * as i1 from "@ngx-translate/core";
export class ItUploadFileListComponent extends ItAbstractComponent {
constructor() {
super(...arguments);
/**
* The accepted file type to upload <br>
* Possible values: <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types">MIME Types</a> separated by comma
* @example application/pdf,image/png
* @default *
*/
this.accept = '*';
/**
* If upload multiple files
* @default true
*/
this.multiple = true;
/**
* Fired when upload new files
*/
this.uploadFiles = new EventEmitter();
/**
* Fired on delete item button click
*/
this.deleteItem = new EventEmitter();
/**
* Cache to preview image
*/
this.previewImages = new Map();
}
ngOnInit() {
if (!!this.images && this.accept === '*') {
this.accept = 'image/*';
}
}
ngOnChanges(changes) {
if (changes['fileList'] && !!this.images) {
const images$ = this.fileList.map(item => ItFileUtils.fileToBase64(item.file).pipe(take(1), tap(base64 => this.previewImages.set(item.id, base64))));
forkJoin(images$).subscribe(() => {
this._changeDetectorRef.detectChanges();
super.ngOnChanges(changes);
});
}
else {
super.ngOnChanges(changes);
}
}
/**
* On load file from input
* @param event
*/
onLoadFiles(event) {
const input = event.target;
const files = input?.files;
if (!files?.length) {
return;
}
const newFiles = Array.from(files).filter(file => !this.fileList.some(item => {
return item.file.name === file.name && item.file.size === file.size && item.file.type === file.type;
}));
const fileList = new DataTransfer();
newFiles.forEach(file => fileList.items.add(file));
this.uploadFiles.emit(fileList.files);
input.value = '';
}
/**
* Get the file size string
* @param file
*/
getFileSize(file) {
return ItFileUtils.getFileSizeString(file);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItUploadFileListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItUploadFileListComponent, isStandalone: true, selector: "it-upload-file-list", inputs: { fileList: "fileList", accept: "accept", multiple: ["multiple", "multiple", inputToBoolean], images: ["images", "images", inputToBoolean], hideLoadButton: ["hideLoadButton", "hideLoadButton", inputToBoolean] }, outputs: { uploadFiles: "uploadFiles", deleteItem: "deleteItem" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if (!hideLoadButton) {\n <input type=\"file\" [id]=\"id\" class=\"upload\" [accept]=\"accept\" [multiple]=\"multiple\" (change)=\"onLoadFiles($event)\" />\n <label [for]=\"id\">\n <it-icon name=\"upload\" size=\"sm\"></it-icon>\n <span>{{ 'it.form.upload' | translate }}</span>\n </label>\n}\n\n@if (fileList.length) {\n <ul class=\"upload-file-list\" [class.upload-file-list-image]=\"images\">\n @for (item of fileList; track item.id) {\n <li\n class=\"upload-file\"\n [class.error]=\"item.error\"\n [class.uploading]=\"!item.error && item.progress !== undefined && item.progress > 0 && item.progress < 100\"\n [class.success]=\"!item.error && (!item.progress || item.progress >= 100)\">\n @if (images) {\n <div class=\"upload-image\">\n <img [attr.src]=\"previewImages.get(item.id)\" [alt]=\"item.file.name\" />\n </div>\n } @else {\n <it-icon name=\"file\" size=\"sm\" [color]=\"!item.error ? (item.progress ? 'secondary' : 'primary') : 'danger'\"></it-icon>\n }\n <p [itTooltip]=\"item.tooltip\">\n <span class=\"visually-hidden\">{{ 'it.form.uploaded-file' | translate: { name: item.file.name } }}</span>\n {{ item.file.name }} <span class=\"upload-file-weight\">{{ getFileSize(item.file) }}</span>\n </p>\n @if (item.removable && (!item.progress || item.progress < 100)) {\n <button type=\"button\" (click)=\"deleteItem.emit(item)\">\n <span class=\"visually-hidden\">{{ 'it.form.delete-file' | translate: { name: item.file.name } }}</span>\n <it-icon name=\"close\"></it-icon>\n </button>\n }\n @if ((!item.removable && !item.progress) || (item.progress !== undefined && item.progress >= 100)) {\n <button type=\"button\" disabled>\n <span class=\"visually-hidden\">{{ 'it.form.upload-complete' | translate }}</span>\n <it-icon name=\"check\"></it-icon>\n </button>\n }\n @if (!item.error && item.progress !== undefined && item.progress > 0 && item.progress < 100) {\n <it-progress-bar [value]=\"item.progress!\"></it-progress-bar>\n }\n </li>\n }\n </ul>\n}\n", dependencies: [{ kind: "component", type: ItIconComponent, selector: "it-icon", inputs: ["name", "size", "color", "padded", "svgClass", "title", "labelWaria"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: ItTooltipDirective, selector: "[itTooltip]", inputs: ["itTooltip", "tooltipPlacement", "tooltipHtml"], outputs: ["showEvent", "shownEvent", "hideEvent", "hiddenEvent", "insertedEvent"], exportAs: ["itTooltip"] }, { kind: "component", type: ItProgressBarComponent, selector: "it-progress-bar", inputs: ["value", "showLabel", "indeterminate", "color"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItUploadFileListComponent, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'it-upload-file-list', imports: [ItIconComponent, TranslateModule, ItTooltipDirective, ItProgressBarComponent], template: "@if (!hideLoadButton) {\n <input type=\"file\" [id]=\"id\" class=\"upload\" [accept]=\"accept\" [multiple]=\"multiple\" (change)=\"onLoadFiles($event)\" />\n <label [for]=\"id\">\n <it-icon name=\"upload\" size=\"sm\"></it-icon>\n <span>{{ 'it.form.upload' | translate }}</span>\n </label>\n}\n\n@if (fileList.length) {\n <ul class=\"upload-file-list\" [class.upload-file-list-image]=\"images\">\n @for (item of fileList; track item.id) {\n <li\n class=\"upload-file\"\n [class.error]=\"item.error\"\n [class.uploading]=\"!item.error && item.progress !== undefined && item.progress > 0 && item.progress < 100\"\n [class.success]=\"!item.error && (!item.progress || item.progress >= 100)\">\n @if (images) {\n <div class=\"upload-image\">\n <img [attr.src]=\"previewImages.get(item.id)\" [alt]=\"item.file.name\" />\n </div>\n } @else {\n <it-icon name=\"file\" size=\"sm\" [color]=\"!item.error ? (item.progress ? 'secondary' : 'primary') : 'danger'\"></it-icon>\n }\n <p [itTooltip]=\"item.tooltip\">\n <span class=\"visually-hidden\">{{ 'it.form.uploaded-file' | translate: { name: item.file.name } }}</span>\n {{ item.file.name }} <span class=\"upload-file-weight\">{{ getFileSize(item.file) }}</span>\n </p>\n @if (item.removable && (!item.progress || item.progress < 100)) {\n <button type=\"button\" (click)=\"deleteItem.emit(item)\">\n <span class=\"visually-hidden\">{{ 'it.form.delete-file' | translate: { name: item.file.name } }}</span>\n <it-icon name=\"close\"></it-icon>\n </button>\n }\n @if ((!item.removable && !item.progress) || (item.progress !== undefined && item.progress >= 100)) {\n <button type=\"button\" disabled>\n <span class=\"visually-hidden\">{{ 'it.form.upload-complete' | translate }}</span>\n <it-icon name=\"check\"></it-icon>\n </button>\n }\n @if (!item.error && item.progress !== undefined && item.progress > 0 && item.progress < 100) {\n <it-progress-bar [value]=\"item.progress!\"></it-progress-bar>\n }\n </li>\n }\n </ul>\n}\n" }]
}], propDecorators: { fileList: [{
type: Input,
args: [{ required: true }]
}], accept: [{
type: Input
}], multiple: [{
type: Input,
args: [{ transform: inputToBoolean }]
}], images: [{
type: Input,
args: [{ transform: inputToBoolean }]
}], hideLoadButton: [{
type: Input,
args: [{ transform: inputToBoolean }]
}], uploadFiles: [{
type: Output
}], deleteItem: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWZpbGUtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tYW5ndWxhci1raXQvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vdXBsb2FkLWZpbGUtbGlzdC91cGxvYWQtZmlsZS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS91cGxvYWQtZmlsZS1saXN0L3VwbG9hZC1maWxlLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRTVFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN4RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7OztBQVF6RCxNQUFNLE9BQU8seUJBQTBCLFNBQVEsbUJBQW1CO0lBTmxFOztRQVlFOzs7OztXQUtHO1FBQ00sV0FBTSxHQUFXLEdBQUcsQ0FBQztRQUU5Qjs7O1dBR0c7UUFDbUMsYUFBUSxHQUFZ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LDRJQy9DcEMsdXNFQThDQSw0Q0QvQlksZUFBZSxtSUFBRSxlQUFlLDRGQUFFLGtCQUFrQiw4TkFBRSxzQkFBc0I7OzJGQUUzRSx5QkFBeUI7a0JBTnJDLFNBQVM7aUNBQ0ksSUFBSSxZQUNOLHFCQUFxQixXQUV0QixDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLENBQUM7OEJBTTVELFFBQVE7c0JBQWxDLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQVFoQixNQUFNO3NCQUFkLEtBQUs7Z0JBTWdDLFFBQVE7c0JBQTdDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFO2dCQU1FLE1BQU07c0JBQTNDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFO2dCQU1FLGNBQWM7c0JBQW5ELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFO2dCQUsxQixXQUFXO3NCQUFwQixNQUFNO2dCQUtHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEl0QWJzdHJhY3RDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9hYnN0cmFjdHMvYWJzdHJhY3QuY29tcG9uZW50JztcbmltcG9ydCB7IFVwbG9hZEZpbGVMaXN0SXRlbSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvZm9ybSc7XG5pbXBvcnQgeyBJdEZpbGVVdGlscyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2ZpbGUtdXRpbHMnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIHRha2UsIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSXRJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvaWNvbi9pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEl0VG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2NvcmUvdG9vbHRpcC90b29sdGlwLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJdFByb2dyZXNzQmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS9wcm9ncmVzcy1iYXIvcHJvZ3Jlc3MtYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBpbnB1dFRvQm9vbGVhbiB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2NvZXJjaW9uJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnaXQtdXBsb2FkLWZpbGUtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi91cGxvYWQtZmlsZS1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgaW1wb3J0czogW0l0SWNvbkNvbXBvbmVudCwgVHJhbnNsYXRlTW9kdWxlLCBJdFRvb2x0aXBEaXJlY3RpdmUsIEl0UHJvZ3Jlc3NCYXJDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBJdFVwbG9hZEZpbGVMaXN0Q29tcG9uZW50IGV4dGVuZHMgSXRBYnN0cmFjdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGZpbGVzIHRvIHNob3cgaW4gbGlzdFxuICAgKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgZmlsZUxpc3QhOiBBcnJheTxVcGxvYWRGaWxlTGlzdEl0ZW0+O1xuXG4gIC8qKlxuICAgKiBUaGUgYWNjZXB0ZWQgZmlsZSB0eXBlIHRvIHVwbG9hZCA8YnI+XG4gICAqIFBvc3NpYmxlIHZhbHVlczogPGEgaHJlZj1cImh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQmFzaWNzX29mX0hUVFAvTUlNRV90eXBlcy9Db21tb25fdHlwZXNcIj5NSU1FIFR5cGVzPC9hPiBzZXBhcmF0ZWQgYnkgY29tbWFcbiAgICogQGV4YW1wbGUgYXBwbGljYXRpb24vcGRmLGltYWdlL3BuZ1xuICAgKiBAZGVmYXVsdCAqXG4gICAqL1xuICBASW5wdXQoKSBhY2NlcHQ6IHN0cmluZyA9ICcqJztcblxuICAvKipcbiAgICogSWYgdXBsb2FkIG11bHRpcGxlIGZpbGVzXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogaW5wdXRUb0Jvb2xlYW4gfSkgbXVsdGlwbGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBJZiBpcyBmaWxlIGxpc3QgaW1hZ2VcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogaW5wdXRUb0Jvb2xlYW4gfSkgaW1hZ2VzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSGlkZSB0aGUgbG9hZCBidXR0b25cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogaW5wdXRUb0Jvb2xlYW4gfSkgaGlkZUxvYWRCdXR0b24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHVwbG9hZCBuZXcgZmlsZXNcbiAgICovXG4gIEBPdXRwdXQoKSB1cGxvYWRGaWxlczogRXZlbnRFbWl0dGVyPEZpbGVMaXN0PiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZUxpc3Q+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVkIG9uIGRlbGV0ZSBpdGVtIGJ1dHRvbiBjbGlja1xuICAgKi9cbiAgQE91dHB1dCgpIGRlbGV0ZUl0ZW06IEV2ZW50RW1pdHRlcjxVcGxvYWRGaWxlTGlzdEl0ZW0+ID0gbmV3IEV2ZW50RW1pdHRlcjxVcGxvYWRGaWxlTGlzdEl0ZW0+KCk7XG5cbiAgLyoqXG4gICAqIENhY2hlIHRvIHByZXZpZXcgaW1hZ2VcbiAgICovXG4gIHByZXZpZXdJbWFnZXM6IE1hcDxudW1iZXIsIHN0cmluZz4gPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghIXRoaXMuaW1hZ2VzICYmIHRoaXMuYWNjZXB0ID09PSAnKicpIHtcbiAgICAgIHRoaXMuYWNjZXB0ID0gJ2ltYWdlLyonO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZmlsZUxpc3QnXSAmJiAhIXRoaXMuaW1hZ2VzKSB7XG4gICAgICBjb25zdCBpbWFnZXMkID0gdGhpcy5maWxlTGlzdC5tYXAoaXRlbSA9PlxuICAgICAgICBJdEZpbGVVdGlscy5maWxlVG9CYXNlNjQoaXRlbS5maWxlKS5waXBlKFxuICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgdGFwKGJhc2U2NCA9PiB0aGlzLnByZXZpZXdJbWFnZXMuc2V0KGl0ZW0uaWQsIGJhc2U2NCkpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBmb3JrSm9pbihpbWFnZXMkKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBsb2FkIGZpbGUgZnJvbSBpbnB1dFxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIG9uTG9hZEZpbGVzKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgZmlsZXMgPSBpbnB1dD8uZmlsZXM7XG4gICAgaWYgKCFmaWxlcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3RmlsZXMgPSBBcnJheS5mcm9tKGZpbGVzKS5maWx0ZXIoXG4gICAgICBmaWxlID0+XG4gICAgICAgICF0aGlzLmZpbGVMaXN0LnNvbWUoaXRlbSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0uZmlsZS5uYW1lID09PSBmaWxlLm5hbWUgJiYgaXRlbS5maWxlLnNpemUgPT09IGZpbGUuc2l6ZSAmJiBpdGVtLmZpbGUudHlwZSA9PT0gZmlsZS50eXBlO1xuICAgICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBmaWxlTGlzdCA9IG5ldyBEYXRhVHJhbnNmZXIoKTtcbiAgICBuZXdGaWxlcy5mb3JFYWNoKGZpbGUgPT4gZmlsZUxpc3QuaXRlbXMuYWRkKGZpbGUpKTtcblxuICAgIHRoaXMudXBsb2FkRmlsZXMuZW1pdChmaWxlTGlzdC5maWxlcyk7XG4gICAgaW5wdXQudmFsdWUgPSAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGUgc2l6ZSBzdHJpbmdcbiAgICogQHBhcmFtIGZpbGVcbiAgICovXG4gIGdldEZpbGVTaXplKGZpbGU6IEZpbGUpOiBzdHJpbmcge1xuICAgIHJldHVybiBJdEZpbGVVdGlscy5nZXRGaWxlU2l6ZVN0cmluZyhmaWxlKTtcbiAgfVxufVxuIiwiQGlmICghaGlkZUxvYWRCdXR0b24pIHtcbiAgPGlucHV0IHR5cGU9XCJmaWxlXCIgW2lkXT1cImlkXCIgY2xhc3M9XCJ1cGxvYWRcIiBbYWNjZXB0XT1cImFjY2VwdFwiIFttdWx0aXBsZV09XCJtdWx0aXBsZVwiIChjaGFuZ2UpPVwib25Mb2FkRmlsZXMoJGV2ZW50KVwiIC8+XG4gIDxsYWJlbCBbZm9yXT1cImlkXCI+XG4gICAgPGl0LWljb24gbmFtZT1cInVwbG9hZFwiIHNpemU9XCJzbVwiPjwvaXQtaWNvbj5cbiAgICA8c3Bhbj57eyAnaXQuZm9ybS51cGxvYWQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICA8L2xhYmVsPlxufVxuXG5AaWYgKGZpbGVMaXN0Lmxlbmd0aCkge1xuICA8dWwgY2xhc3M9XCJ1cGxvYWQtZmlsZS1saXN0XCIgW2NsYXNzLnVwbG9hZC1maWxlLWxpc3QtaW1hZ2VdPVwiaW1hZ2VzXCI+XG4gICAgQGZvciAoaXRlbSBvZiBmaWxlTGlzdDsgdHJhY2sgaXRlbS5pZCkge1xuICAgICAgPGxpXG4gICAgICAgIGNsYXNzPVwidXBsb2FkLWZpbGVcIlxuICAgICAgICBbY2xhc3MuZXJyb3JdPVwiaXRlbS5lcnJvclwiXG4gICAgICAgIFtjbGFzcy51cGxvYWRpbmddPVwiIWl0ZW0uZXJyb3IgJiYgaXRlbS5wcm9ncmVzcyAhPT0gdW5kZWZpbmVkICYmIGl0ZW0ucHJvZ3Jlc3MgPiAwICYmIGl0ZW0ucHJvZ3Jlc3MgPCAxMDBcIlxuICAgICAgICBbY2xhc3Muc3VjY2Vzc109XCIhaXRlbS5lcnJvciAmJiAoIWl0ZW0ucHJvZ3Jlc3MgfHwgaXRlbS5wcm9ncmVzcyA+PSAxMDApXCI+XG4gICAgICAgIEBpZiAoaW1hZ2VzKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInVwbG9hZC1pbWFnZVwiPlxuICAgICAgICAgICAgPGltZyBbYXR0ci5zcmNdPVwicHJldmlld0ltYWdlcy5nZXQoaXRlbS5pZClcIiBbYWx0XT1cIml0ZW0uZmlsZS5uYW1lXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGl0LWljb24gbmFtZT1cImZpbGVcIiBzaXplPVwic21cIiBbY29sb3JdPVwiIWl0ZW0uZXJyb3IgPyAoaXRlbS5wcm9ncmVzcyA/ICdzZWNvbmRhcnknIDogJ3ByaW1hcnknKSA6ICdkYW5nZXInXCI+PC9pdC1pY29uPlxuICAgICAgICB9XG4gICAgICAgIDxwIFtpdFRvb2x0aXBdPVwiaXRlbS50b29sdGlwXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj57eyAnaXQuZm9ybS51cGxvYWRlZC1maWxlJyB8IHRyYW5zbGF0ZTogeyBuYW1lOiBpdGVtLmZpbGUubmFtZSB9IH19PC9zcGFuPlxuICAgICAgICAgIHt7IGl0ZW0uZmlsZS5uYW1lIH19IDxzcGFuIGNsYXNzPVwidXBsb2FkLWZpbGUtd2VpZ2h0XCI+e3sgZ2V0RmlsZVNpemUoaXRlbS5maWxlKSB9fTwvc3Bhbj5cbiAgICAgICAgPC9wPlxuICAgICAgICBAaWYgKGl0ZW0ucmVtb3ZhYmxlICYmICghaXRlbS5wcm9ncmVzcyB8fCBpdGVtLnByb2dyZXNzIDwgMTAwKSkge1xuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJkZWxldGVJdGVtLmVtaXQoaXRlbSlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+e3sgJ2l0LmZvcm0uZGVsZXRlLWZpbGUnIHwgdHJhbnNsYXRlOiB7IG5hbWU6IGl0ZW0uZmlsZS5uYW1lIH0gfX08L3NwYW4+XG4gICAgICAgICAgICA8aXQtaWNvbiBuYW1lPVwiY2xvc2VcIj48L2l0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgICAgQGlmICgoIWl0ZW0ucmVtb3ZhYmxlICYmICFpdGVtLnByb2dyZXNzKSB8fCAoaXRlbS5wcm9ncmVzcyAhPT0gdW5kZWZpbmVkICYmIGl0ZW0ucHJvZ3Jlc3MgPj0gMTAwKSkge1xuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRpc2FibGVkPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj57eyAnaXQuZm9ybS51cGxvYWQtY29tcGxldGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPGl0LWljb24gbmFtZT1cImNoZWNrXCI+PC9pdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoIWl0ZW0uZXJyb3IgJiYgaXRlbS5wcm9ncmVzcyAhPT0gdW5kZWZpbmVkICYmIGl0ZW0ucHJvZ3Jlc3MgPiAwICYmIGl0ZW0ucHJvZ3Jlc3MgPCAxMDApIHtcbiAgICAgICAgICA8aXQtcHJvZ3Jlc3MtYmFyIFt2YWx1ZV09XCJpdGVtLnByb2dyZXNzIVwiPjwvaXQtcHJvZ3Jlc3MtYmFyPlxuICAgICAgICB9XG4gICAgICA8L2xpPlxuICAgIH1cbiAgPC91bD5cbn1cbiJdfQ==