Socket
Socket
Sign inDemoInstall

angular-extensions

Package Overview
Dependencies
21
Maintainers
1
Versions
222
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.0.50 to 1.0.51

2

bundles/angular-extensions-controls-file-control.umd.js

@@ -445,3 +445,3 @@ (function (global, factory) {

FileControlComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.9", ngImport: i0__namespace, type: FileControlComponent, deps: [{ token: i0__namespace.ElementRef }, { token: i0__namespace.ChangeDetectorRef }, { token: i1__namespace.FileSizePipe }, { token: FileService }], target: i0__namespace.ɵɵFactoryTarget.Component });
FileControlComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.9", type: FileControlComponent, selector: "file-control", inputs: { multiple: "multiple", allowedFileExtensions: "allowedFileExtensions", accept: "accept", maxFileSize: "maxFileSize", totalFileSize: "totalFileSize", autoUpload: "autoUpload", adapter: "adapter", showPreview: "showPreview" }, outputs: { changes: "changes" }, providers: [FileService], viewQueries: [{ propertyName: "filePicker", first: true, predicate: i4.FilePickerComponent, descendants: true }], usesInheritance: true, ngImport: i0__namespace, template: "<base-control #baseControl\r\n [control]=\"this\">\r\n <div class=\"field-label\">\r\n <ngx-awesome-uploader #uploader\r\n [adapter]=\"adapter\"\r\n [showeDragDropZone]=\"true\"\r\n [ngClass]=\"fieldClass\"\r\n [showPreviewContainer]=\"showPreview\"\r\n [uploadType]=\"multiple ? 'multi' : 'single'\"\r\n [fileMaxSize]=\"maxFileSize\"\r\n [totalMaxSize]=\"totalFileSize\"\r\n [accept]=\"accept.toString()\"\r\n [itemTemplate]=\"fileItemTemplate\"\r\n [enableAutoUpload]=\"autoUpload\"\r\n [fileExtensions]=\"allowedFileExtensions\"\r\n (validationError)=\"onValidationError($event)\"\r\n (fileAdded)=\"onFileAdded($event)\">\r\n\r\n <div class=\"dropzoneTemplate\">\r\n <button mat-raised-button\r\n (click)=\"onDialogOpen()\">{{ field.label }}</button>\r\n </div>\r\n </ngx-awesome-uploader>\r\n </div>\r\n\r\n <mat-error *ngIf=\"baseControl.initialized && field.control.touched\">\r\n <ng-container *ngTemplateOutlet=\"baseControl.errorsTemplate\"></ng-container>\r\n <ng-container *ngIf=\"validationErrors\">\r\n <mat-error *ngFor=\"let error of validationErrors\">\r\n {{ error.error }}\r\n </mat-error>\r\n </ng-container>\r\n </mat-error>\r\n</base-control>\r\n\r\n<ng-template #fileItemTemplate\r\n let-fileItem=\"fileItem\"\r\n let-uploadProgress=\"uploadProgress\">\r\n <div class=\"toolbar\">\r\n <span class=\"text-left\">\r\n {{ fileItem.fileName }}\r\n </span>\r\n\r\n <div *ngIf=\"fileItem\">\r\n <button mat-button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"uploader.removeFile(fileItem); onFileRemoved(fileItem)\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host .field-label{width:100%}:host ::ng-deep ngx-awesome-uploader{max-width:none!important}:host ::ng-deep .file-drop-wrapper{width:auto!important;background:none!important;padding-top:0!important}:host ::ng-deep .file-drop-wrapper #dropZone{padding:5px 0;border:none;max-width:none;background:none}:host ::ng-deep .file-drop-wrapper file-drop{padding:0 3px}:host ::ng-deep file-preview-item{position:initial;padding:10px 16px;max-width:none}:host .toolbar{position:relative;display:flex;justify-content:space-between;align-items:center}:host .toolbar mat-icon{cursor:pointer}:host .toolbar .editor-label{padding:8px 14px;display:inline-block;line-height:1em;height:34px}:host .toolbar .form-control{width:auto;display:inline-block;line-height:1em;height:34px;margin-right:.3em}\n"], components: [{ type: i3__namespace.BaseControlComponent, selector: "base-control", inputs: ["control"] }, { type: i4__namespace.FilePickerComponent, selector: "ngx-awesome-uploader", inputs: ["enableCropper", "showeDragDropZone", "showPreviewContainer", "uploadType", "croppedCanvasOptions", "captions", "enableAutoUpload", "cropperOptions", "customValidator", "itemTemplate", "fileMaxSize", "fileMaxCount", "totalMaxSize", "accept", "fileExtensions", "adapter", "dropzoneTemplate", "fileInputCapture"], outputs: ["uploadSuccess", "uploadFail", "removeSuccess", "validationError", "fileAdded", "fileRemoved"] }, { type: i5__namespace.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i7__namespace.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8__namespace.MatError, selector: "mat-error", inputs: ["id"] }, { type: i7__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i7__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0__namespace.ChangeDetectionStrategy.OnPush });
FileControlComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.9", type: FileControlComponent, selector: "file-control", inputs: { multiple: "multiple", allowedFileExtensions: "allowedFileExtensions", accept: "accept", maxFileSize: "maxFileSize", totalFileSize: "totalFileSize", autoUpload: "autoUpload", adapter: "adapter", showPreview: "showPreview" }, outputs: { changes: "changes" }, providers: [FileService], viewQueries: [{ propertyName: "filePicker", first: true, predicate: i4.FilePickerComponent, descendants: true }], usesInheritance: true, ngImport: i0__namespace, template: "<base-control #baseControl\r\n [control]=\"this\">\r\n <div class=\"field-label\">\r\n <ngx-awesome-uploader #uploader\r\n [adapter]=\"adapter\"\r\n [showeDragDropZone]=\"true\"\r\n [ngClass]=\"fieldClass\"\r\n [showPreviewContainer]=\"showPreview\"\r\n [uploadType]=\"multiple ? 'multi' : 'single'\"\r\n [fileMaxSize]=\"maxFileSize\"\r\n [totalMaxSize]=\"totalFileSize\"\r\n [accept]=\"accept.toString()\"\r\n [itemTemplate]=\"fileItemTemplate\"\r\n [enableAutoUpload]=\"autoUpload\"\r\n [fileExtensions]=\"allowedFileExtensions\"\r\n (validationError)=\"onValidationError($event)\"\r\n (fileAdded)=\"onFileAdded($event)\">\r\n\r\n <div class=\"dropzoneTemplate\">\r\n <button type=\"button\"\r\n mat-raised-button\r\n (click)=\"onDialogOpen()\">{{ field.label }}</button>\r\n </div>\r\n </ngx-awesome-uploader>\r\n </div>\r\n\r\n <mat-error *ngIf=\"baseControl.initialized && field.control.touched\">\r\n <ng-container *ngTemplateOutlet=\"baseControl.errorsTemplate\"></ng-container>\r\n <ng-container *ngIf=\"validationErrors\">\r\n <mat-error *ngFor=\"let error of validationErrors\">\r\n {{ error.error }}\r\n </mat-error>\r\n </ng-container>\r\n </mat-error>\r\n</base-control>\r\n\r\n<ng-template #fileItemTemplate\r\n let-fileItem=\"fileItem\"\r\n let-uploadProgress=\"uploadProgress\">\r\n <div class=\"toolbar\">\r\n <span class=\"text-left\">\r\n {{ fileItem.fileName }}\r\n </span>\r\n\r\n <div *ngIf=\"fileItem\">\r\n <button mat-button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"uploader.removeFile(fileItem); onFileRemoved(fileItem)\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host .field-label{width:100%}:host ::ng-deep ngx-awesome-uploader{max-width:none!important}:host ::ng-deep .file-drop-wrapper{width:auto!important;background:none!important;padding-top:0!important}:host ::ng-deep .file-drop-wrapper #dropZone{padding:5px 0;border:none;max-width:none;background:none}:host ::ng-deep .file-drop-wrapper file-drop{padding:0 3px}:host ::ng-deep file-preview-item{position:initial;padding:10px 16px;max-width:none}:host .toolbar{position:relative;display:flex;justify-content:space-between;align-items:center}:host .toolbar mat-icon{cursor:pointer}:host .toolbar .editor-label{padding:8px 14px;display:inline-block;line-height:1em;height:34px}:host .toolbar .form-control{width:auto;display:inline-block;line-height:1em;height:34px;margin-right:.3em}\n"], components: [{ type: i3__namespace.BaseControlComponent, selector: "base-control", inputs: ["control"] }, { type: i4__namespace.FilePickerComponent, selector: "ngx-awesome-uploader", inputs: ["enableCropper", "showeDragDropZone", "showPreviewContainer", "uploadType", "croppedCanvasOptions", "captions", "enableAutoUpload", "cropperOptions", "customValidator", "itemTemplate", "fileMaxSize", "fileMaxCount", "totalMaxSize", "accept", "fileExtensions", "adapter", "dropzoneTemplate", "fileInputCapture"], outputs: ["uploadSuccess", "uploadFail", "removeSuccess", "validationError", "fileAdded", "fileRemoved"] }, { type: i5__namespace.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6__namespace.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i7__namespace.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8__namespace.MatError, selector: "mat-error", inputs: ["id"] }, { type: i7__namespace.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i7__namespace.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0__namespace.ChangeDetectionStrategy.OnPush });
i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.9", ngImport: i0__namespace, type: FileControlComponent, decorators: [{

@@ -448,0 +448,0 @@ type: i0.Component,

@@ -84,3 +84,3 @@ import { Component, Input, Output, EventEmitter, ViewChild, ChangeDetectionStrategy, } from "@angular/core";

FileControlComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.9", ngImport: i0, type: FileControlComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.FileSizePipe }, { token: i2.FileService }], target: i0.ɵɵFactoryTarget.Component });
FileControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.9", type: FileControlComponent, selector: "file-control", inputs: { multiple: "multiple", allowedFileExtensions: "allowedFileExtensions", accept: "accept", maxFileSize: "maxFileSize", totalFileSize: "totalFileSize", autoUpload: "autoUpload", adapter: "adapter", showPreview: "showPreview" }, outputs: { changes: "changes" }, providers: [FileService], viewQueries: [{ propertyName: "filePicker", first: true, predicate: FilePickerComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<base-control #baseControl\r\n [control]=\"this\">\r\n <div class=\"field-label\">\r\n <ngx-awesome-uploader #uploader\r\n [adapter]=\"adapter\"\r\n [showeDragDropZone]=\"true\"\r\n [ngClass]=\"fieldClass\"\r\n [showPreviewContainer]=\"showPreview\"\r\n [uploadType]=\"multiple ? 'multi' : 'single'\"\r\n [fileMaxSize]=\"maxFileSize\"\r\n [totalMaxSize]=\"totalFileSize\"\r\n [accept]=\"accept.toString()\"\r\n [itemTemplate]=\"fileItemTemplate\"\r\n [enableAutoUpload]=\"autoUpload\"\r\n [fileExtensions]=\"allowedFileExtensions\"\r\n (validationError)=\"onValidationError($event)\"\r\n (fileAdded)=\"onFileAdded($event)\">\r\n\r\n <div class=\"dropzoneTemplate\">\r\n <button mat-raised-button\r\n (click)=\"onDialogOpen()\">{{ field.label }}</button>\r\n </div>\r\n </ngx-awesome-uploader>\r\n </div>\r\n\r\n <mat-error *ngIf=\"baseControl.initialized && field.control.touched\">\r\n <ng-container *ngTemplateOutlet=\"baseControl.errorsTemplate\"></ng-container>\r\n <ng-container *ngIf=\"validationErrors\">\r\n <mat-error *ngFor=\"let error of validationErrors\">\r\n {{ error.error }}\r\n </mat-error>\r\n </ng-container>\r\n </mat-error>\r\n</base-control>\r\n\r\n<ng-template #fileItemTemplate\r\n let-fileItem=\"fileItem\"\r\n let-uploadProgress=\"uploadProgress\">\r\n <div class=\"toolbar\">\r\n <span class=\"text-left\">\r\n {{ fileItem.fileName }}\r\n </span>\r\n\r\n <div *ngIf=\"fileItem\">\r\n <button mat-button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"uploader.removeFile(fileItem); onFileRemoved(fileItem)\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host .field-label{width:100%}:host ::ng-deep ngx-awesome-uploader{max-width:none!important}:host ::ng-deep .file-drop-wrapper{width:auto!important;background:none!important;padding-top:0!important}:host ::ng-deep .file-drop-wrapper #dropZone{padding:5px 0;border:none;max-width:none;background:none}:host ::ng-deep .file-drop-wrapper file-drop{padding:0 3px}:host ::ng-deep file-preview-item{position:initial;padding:10px 16px;max-width:none}:host .toolbar{position:relative;display:flex;justify-content:space-between;align-items:center}:host .toolbar mat-icon{cursor:pointer}:host .toolbar .editor-label{padding:8px 14px;display:inline-block;line-height:1em;height:34px}:host .toolbar .form-control{width:auto;display:inline-block;line-height:1em;height:34px;margin-right:.3em}\n"], components: [{ type: i3.BaseControlComponent, selector: "base-control", inputs: ["control"] }, { type: i4.FilePickerComponent, selector: "ngx-awesome-uploader", inputs: ["enableCropper", "showeDragDropZone", "showPreviewContainer", "uploadType", "croppedCanvasOptions", "captions", "enableAutoUpload", "cropperOptions", "customValidator", "itemTemplate", "fileMaxSize", "fileMaxCount", "totalMaxSize", "accept", "fileExtensions", "adapter", "dropzoneTemplate", "fileInputCapture"], outputs: ["uploadSuccess", "uploadFail", "removeSuccess", "validationError", "fileAdded", "fileRemoved"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.MatError, selector: "mat-error", inputs: ["id"] }, { type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
FileControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.9", type: FileControlComponent, selector: "file-control", inputs: { multiple: "multiple", allowedFileExtensions: "allowedFileExtensions", accept: "accept", maxFileSize: "maxFileSize", totalFileSize: "totalFileSize", autoUpload: "autoUpload", adapter: "adapter", showPreview: "showPreview" }, outputs: { changes: "changes" }, providers: [FileService], viewQueries: [{ propertyName: "filePicker", first: true, predicate: FilePickerComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<base-control #baseControl\r\n [control]=\"this\">\r\n <div class=\"field-label\">\r\n <ngx-awesome-uploader #uploader\r\n [adapter]=\"adapter\"\r\n [showeDragDropZone]=\"true\"\r\n [ngClass]=\"fieldClass\"\r\n [showPreviewContainer]=\"showPreview\"\r\n [uploadType]=\"multiple ? 'multi' : 'single'\"\r\n [fileMaxSize]=\"maxFileSize\"\r\n [totalMaxSize]=\"totalFileSize\"\r\n [accept]=\"accept.toString()\"\r\n [itemTemplate]=\"fileItemTemplate\"\r\n [enableAutoUpload]=\"autoUpload\"\r\n [fileExtensions]=\"allowedFileExtensions\"\r\n (validationError)=\"onValidationError($event)\"\r\n (fileAdded)=\"onFileAdded($event)\">\r\n\r\n <div class=\"dropzoneTemplate\">\r\n <button type=\"button\"\r\n mat-raised-button\r\n (click)=\"onDialogOpen()\">{{ field.label }}</button>\r\n </div>\r\n </ngx-awesome-uploader>\r\n </div>\r\n\r\n <mat-error *ngIf=\"baseControl.initialized && field.control.touched\">\r\n <ng-container *ngTemplateOutlet=\"baseControl.errorsTemplate\"></ng-container>\r\n <ng-container *ngIf=\"validationErrors\">\r\n <mat-error *ngFor=\"let error of validationErrors\">\r\n {{ error.error }}\r\n </mat-error>\r\n </ng-container>\r\n </mat-error>\r\n</base-control>\r\n\r\n<ng-template #fileItemTemplate\r\n let-fileItem=\"fileItem\"\r\n let-uploadProgress=\"uploadProgress\">\r\n <div class=\"toolbar\">\r\n <span class=\"text-left\">\r\n {{ fileItem.fileName }}\r\n </span>\r\n\r\n <div *ngIf=\"fileItem\">\r\n <button mat-button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"uploader.removeFile(fileItem); onFileRemoved(fileItem)\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host .field-label{width:100%}:host ::ng-deep ngx-awesome-uploader{max-width:none!important}:host ::ng-deep .file-drop-wrapper{width:auto!important;background:none!important;padding-top:0!important}:host ::ng-deep .file-drop-wrapper #dropZone{padding:5px 0;border:none;max-width:none;background:none}:host ::ng-deep .file-drop-wrapper file-drop{padding:0 3px}:host ::ng-deep file-preview-item{position:initial;padding:10px 16px;max-width:none}:host .toolbar{position:relative;display:flex;justify-content:space-between;align-items:center}:host .toolbar mat-icon{cursor:pointer}:host .toolbar .editor-label{padding:8px 14px;display:inline-block;line-height:1em;height:34px}:host .toolbar .form-control{width:auto;display:inline-block;line-height:1em;height:34px;margin-right:.3em}\n"], components: [{ type: i3.BaseControlComponent, selector: "base-control", inputs: ["control"] }, { type: i4.FilePickerComponent, selector: "ngx-awesome-uploader", inputs: ["enableCropper", "showeDragDropZone", "showPreviewContainer", "uploadType", "croppedCanvasOptions", "captions", "enableAutoUpload", "cropperOptions", "customValidator", "itemTemplate", "fileMaxSize", "fileMaxCount", "totalMaxSize", "accept", "fileExtensions", "adapter", "dropzoneTemplate", "fileInputCapture"], outputs: ["uploadSuccess", "uploadFail", "removeSuccess", "validationError", "fileAdded", "fileRemoved"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.MatError, selector: "mat-error", inputs: ["id"] }, { type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.9", ngImport: i0, type: FileControlComponent, decorators: [{

@@ -117,2 +117,2 @@ type: Component,

}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1jb250cm9sLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZXh0ZW5zaW9ucy9jb250cm9scy9maWxlLWNvbnRyb2wvZmlsZS1jb250cm9sLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZXh0ZW5zaW9ucy9jb250cm9scy9maWxlLWNvbnRyb2wvZmlsZS1jb250cm9sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUNWLHVCQUF1QixHQUMvRCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQXFCLG1CQUFtQixFQUFvQixtQkFBbUIsRUFBbUIsTUFBTSxzQkFBc0IsQ0FBQztBQUV0SSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7Ozs7O0FBU3ZFLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxXQUFtQjtJQWtDM0QsWUFDVSxVQUEyQyxFQUMzQyxpQkFBb0MsRUFDcEMsWUFBMEIsRUFDM0IsY0FBMkI7UUFFbEMsS0FBSyxFQUFFLENBQUM7UUFMQSxlQUFVLEdBQVYsVUFBVSxDQUFpQztRQUMzQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzNCLG1CQUFjLEdBQWQsY0FBYyxDQUFhO1FBN0I3QixXQUFNLEdBQWEsRUFBRSxDQUFDO1FBU3RCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFTbkIsWUFBTyxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBSzNELHFCQUFnQixHQUFzQixFQUFFLENBQUM7UUFVOUMsSUFBSSxDQUFDLE9BQU8sR0FB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c0JBRGpCLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixNQUFNO2dCQUlBLFVBQVU7c0JBRGhCLFNBQVM7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLFxyXG4gIEVsZW1lbnRSZWYsIE9uSW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG5pbXBvcnQgeyBGaWxlU2l6ZVBpcGUgfSBmcm9tIFwibmd4LWZpbGVzaXplXCI7XHJcbmltcG9ydCB7IEZpbGVQaWNrZXJBZGFwdGVyLCBGaWxlUGlja2VyQ29tcG9uZW50LCBGaWxlUHJldmlld01vZGVsLCBGaWxlVmFsaWRhdGlvblR5cGVzLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwibmd4LWF3ZXNvbWUtdXBsb2FkZXJcIjtcclxuXHJcbmltcG9ydCB7IEZpbGVTZXJ2aWNlIH0gZnJvbSBcIi4vZmlsZS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENvbnRyb2xCYXNlIH0gZnJvbSBcImFuZ3VsYXItZXh0ZW5zaW9ucy9jb250cm9scy9iYXNlLWNvbnRyb2xcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImZpbGUtY29udHJvbFwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vZmlsZS1jb250cm9sLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL2ZpbGUtY29udHJvbC5jb21wb25lbnQuc2Nzc1wiXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBwcm92aWRlcnM6IFtGaWxlU2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIEZpbGVDb250cm9sQ29tcG9uZW50IGV4dGVuZHMgQ29udHJvbEJhc2U8RmlsZVtdPiBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIG11bHRpcGxlOiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IHN0cmluZ1tdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhY2NlcHQ6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIG1heEZpbGVTaXplOiBudW1iZXI7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHRvdGFsRmlsZVNpemU6IG51bWJlcjtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgYXV0b1VwbG9hZCA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhZGFwdGVyOiBGaWxlUGlja2VyQWRhcHRlcjtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2hvd1ByZXZpZXc6IGJvb2xlYW47XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBjaGFuZ2VzOiBFdmVudEVtaXR0ZXI8RmlsZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVtdPigpO1xyXG5cclxuICBAVmlld0NoaWxkKEZpbGVQaWNrZXJDb21wb25lbnQpXHJcbiAgcHVibGljIGZpbGVQaWNrZXI6IEZpbGVQaWNrZXJDb21wb25lbnQ7XHJcblxyXG4gIHB1YmxpYyB2YWxpZGF0aW9uRXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRmllbGRTZXRFbGVtZW50PixcclxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBmaWxlU2l6ZVBpcGU6IEZpbGVTaXplUGlwZSxcclxuICAgIHB1YmxpYyBkZWZhdWx0QWRhcHRlcjogRmlsZVNlcnZpY2UsXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIHRoaXMuYWRhcHRlciA9IHRoaXMuYWRhcHRlciB8fCBkZWZhdWx0QWRhcHRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgIC8vIHJlcGxhY2UgZmlsZSBpbiBzaW5nbGUgc2VsZWN0IG1vZGVcclxuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgIFwiY2hhbmdlXCIsXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5maWVsZC5jb250cm9sLnNldFZhbHVlKFtdLCB7IGVtaXRFdmVudDogZmFsc2UsIGVtaXRNb2RlbFRvVmlld0NoYW5nZTogZmFsc2UgfSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5maWxlUGlja2VyLmZpbGVzID0gW107XHJcblxyXG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgY2FwdHVyZTogdHJ1ZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkRpYWxvZ09wZW4oKSB7XHJcbiAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICBcImZvY3VzXCIsXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICB0aGlzLmZpZWxkLmNvbnRyb2wubWFya0FzVG91Y2hlZCh7IG9ubHlTZWxmOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9LFxyXG4gICAgICB7IGNhcHR1cmU6IHRydWUsIG9uY2U6IHRydWUgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25WYWxpZGF0aW9uRXJyb3IoZXJyb3I6IFZhbGlkYXRpb25FcnJvcikge1xyXG4gICAgY29uc3QgZXJySW5kZXggPSB0aGlzLnZhbGlkYXRpb25FcnJvcnMuZmluZEluZGV4KGUgPT4gZS5maWxlID09IGVycm9yLmZpbGUpO1xyXG4gICAgZXJyb3IuZXJyb3IgPSB0aGlzLmdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UoZXJyb3IuZXJyb3IgYXMgRmlsZVZhbGlkYXRpb25UeXBlcyk7XHJcblxyXG4gICAgaWYgKGVyckluZGV4ICE9IC0xKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9yc1tlcnJJbmRleF0gPSBlcnJvcjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMucHVzaChlcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkZpbGVBZGRlZChmaWxlOiBGaWxlUHJldmlld01vZGVsKSB7XHJcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMgPSBbXTtcclxuXHJcbiAgICB0aGlzLmZpZWxkLnZhbHVlID0gdGhpcy5maWVsZC52YWx1ZVxyXG4gICAgICA/IFsuLi50aGlzLmZpZWxkLnZhbHVlLCBmaWxlLmZpbGUgYXMgRmlsZV1cclxuICAgICAgOiBbZmlsZS5maWxlIGFzIEZpbGVdO1xyXG5cclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25GaWxlUmVtb3ZlZChyZW1vdmVkRmlsZTogRmlsZVByZXZpZXdNb2RlbCkge1xyXG4gICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzID0gW107XHJcblxyXG4gICAgdGhpcy5maWVsZC52YWx1ZSA9IHRoaXMuZmllbGQudmFsdWVcclxuICAgICAgPyB0aGlzLmZpZWxkLnZhbHVlLmZpbHRlcihmaWxlID0+IGZpbGUubmFtZSAhPSByZW1vdmVkRmlsZS5maWxlTmFtZSlcclxuICAgICAgOiBbcmVtb3ZlZEZpbGUuZmlsZSBhcyBGaWxlXTtcclxuXHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKGVycm9yVHlwZTogRmlsZVZhbGlkYXRpb25UeXBlcykge1xyXG4gICAgc3dpdGNoIChlcnJvclR5cGUpIHtcclxuXHJcbiAgICAgIGNhc2UgRmlsZVZhbGlkYXRpb25UeXBlcy51cGxvYWRUeXBlOlxyXG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlID8gXCJTZWxlY3QgbXVsdGlwbGUgZmlsZXNcIiA6IFwiU2VsZWN0IG9ubHkgb25lIGZpbGVcIjtcclxuXHJcbiAgICAgIGNhc2UgRmlsZVZhbGlkYXRpb25UeXBlcy5leHRlbnNpb25zOlxyXG4gICAgICAgIHJldHVybiBgU2VsZWN0ZWQgZmlsZSBzaG91bGQgaGF2ZSAke3RoaXMuYWxsb3dlZEZpbGVFeHRlbnNpb25zfSBleHRlbnNpb25gO1xyXG5cclxuICAgICAgY2FzZSBGaWxlVmFsaWRhdGlvblR5cGVzLmZpbGVNYXhTaXplOlxyXG4gICAgICAgIHJldHVybiBgVGhlIHNpemUgb2Ygc2VsZWN0ZWQgZmlsZSBpcyBsYXJnZXIgdGhhbiAke3RoaXMuZmlsZVNpemVQaXBlLnRyYW5zZm9ybSh0aGlzLm1heEZpbGVTaXplKX1gO1xyXG5cclxuICAgICAgY2FzZSBGaWxlVmFsaWRhdGlvblR5cGVzLnRvdGFsTWF4U2l6ZTpcclxuICAgICAgICByZXR1cm4gYFRoZSB0b3RhbCBzaXplIG9mIHNlbGVjdGVkIGZpbGVzIGlzIGxhcmdlciB0aGFuICR7dGhpcy5maWxlU2l6ZVBpcGUudHJhbnNmb3JtKHRoaXMudG90YWxGaWxlU2l6ZSl9YDtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIFwiVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGFkZGluZyB5b3VyIGZpbGVcIjtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGJhc2UtY29udHJvbCAjYmFzZUNvbnRyb2xcclxuICAgICAgICAgICAgICBbY29udHJvbF09XCJ0aGlzXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZpZWxkLWxhYmVsXCI+XHJcbiAgICA8bmd4LWF3ZXNvbWUtdXBsb2FkZXIgI3VwbG9hZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2FkYXB0ZXJdPVwiYWRhcHRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dlRHJhZ0Ryb3Bab25lXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZpZWxkQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93UHJldmlld0NvbnRhaW5lcl09XCJzaG93UHJldmlld1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3VwbG9hZFR5cGVdPVwibXVsdGlwbGUgPyAnbXVsdGknIDogJ3NpbmdsZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWxlTWF4U2l6ZV09XCJtYXhGaWxlU2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3RvdGFsTWF4U2l6ZV09XCJ0b3RhbEZpbGVTaXplXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0XT1cImFjY2VwdC50b1N0cmluZygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbVRlbXBsYXRlXT1cImZpbGVJdGVtVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtlbmFibGVBdXRvVXBsb2FkXT1cImF1dG9VcGxvYWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWxlRXh0ZW5zaW9uc109XCJhbGxvd2VkRmlsZUV4dGVuc2lvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh2YWxpZGF0aW9uRXJyb3IpPVwib25WYWxpZGF0aW9uRXJyb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVBZGRlZCk9XCJvbkZpbGVBZGRlZCgkZXZlbnQpXCI+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZHJvcHpvbmVUZW1wbGF0ZVwiPlxyXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b25cclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRpYWxvZ09wZW4oKVwiPnt7IGZpZWxkLmxhYmVsIH19PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZ3gtYXdlc29tZS11cGxvYWRlcj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPG1hdC1lcnJvciAqbmdJZj1cImJhc2VDb250cm9sLmluaXRpYWxpemVkICYmIGZpZWxkLmNvbnRyb2wudG91Y2hlZFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJhc2VDb250cm9sLmVycm9yc1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFsaWRhdGlvbkVycm9yc1wiPlxyXG4gICAgICA8bWF0LWVycm9yICpuZ0Zvcj1cImxldCBlcnJvciBvZiB2YWxpZGF0aW9uRXJyb3JzXCI+XHJcbiAgICAgICAge3sgZXJyb3IuZXJyb3IgfX1cclxuICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L21hdC1lcnJvcj5cclxuPC9iYXNlLWNvbnRyb2w+XHJcblxyXG48bmctdGVtcGxhdGUgI2ZpbGVJdGVtVGVtcGxhdGVcclxuICAgICAgICAgICAgIGxldC1maWxlSXRlbT1cImZpbGVJdGVtXCJcclxuICAgICAgICAgICAgIGxldC11cGxvYWRQcm9ncmVzcz1cInVwbG9hZFByb2dyZXNzXCI+XHJcbiAgPGRpdiBjbGFzcz1cInRvb2xiYXJcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sZWZ0XCI+XHJcbiAgICAgIHt7IGZpbGVJdGVtLmZpbGVOYW1lIH19XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cImZpbGVJdGVtXCI+XHJcbiAgICAgIDxidXR0b24gbWF0LWJ1dHRvblxyXG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJ1cGxvYWRlci5yZW1vdmVGaWxlKGZpbGVJdGVtKTsgb25GaWxlUmVtb3ZlZChmaWxlSXRlbSlcIj5cclxuICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1jb250cm9sLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZXh0ZW5zaW9ucy9jb250cm9scy9maWxlLWNvbnRyb2wvZmlsZS1jb250cm9sLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZXh0ZW5zaW9ucy9jb250cm9scy9maWxlLWNvbnRyb2wvZmlsZS1jb250cm9sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUNWLHVCQUF1QixHQUMvRCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQXFCLG1CQUFtQixFQUFvQixtQkFBbUIsRUFBbUIsTUFBTSxzQkFBc0IsQ0FBQztBQUV0SSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7Ozs7O0FBU3ZFLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxXQUFtQjtJQWtDM0QsWUFDVSxVQUEyQyxFQUMzQyxpQkFBb0MsRUFDcEMsWUFBMEIsRUFDM0IsY0FBMkI7UUFFbEMsS0FBSyxFQUFFLENBQUM7UUFMQSxlQUFVLEdBQVYsVUFBVSxDQUFpQztRQUMzQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzNCLG1CQUFjLEdBQWQsY0FBYyxDQUFhO1FBN0I3QixXQUFNLEdBQWEsRUFBRSxDQUFDO1FBU3RCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFTbkIsWUFBTyxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBSzNELHFCQUFnQixHQUFzQixFQUFFLENBQUM7UUFVOUMsSUFBSSxDQUFDLE9BQU8sR0FB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c0JBRGpCLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixNQUFNO2dCQUlBLFVBQVU7c0JBRGhCLFNBQVM7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLFxyXG4gIEVsZW1lbnRSZWYsIE9uSW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG5pbXBvcnQgeyBGaWxlU2l6ZVBpcGUgfSBmcm9tIFwibmd4LWZpbGVzaXplXCI7XHJcbmltcG9ydCB7IEZpbGVQaWNrZXJBZGFwdGVyLCBGaWxlUGlja2VyQ29tcG9uZW50LCBGaWxlUHJldmlld01vZGVsLCBGaWxlVmFsaWRhdGlvblR5cGVzLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwibmd4LWF3ZXNvbWUtdXBsb2FkZXJcIjtcclxuXHJcbmltcG9ydCB7IEZpbGVTZXJ2aWNlIH0gZnJvbSBcIi4vZmlsZS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IENvbnRyb2xCYXNlIH0gZnJvbSBcImFuZ3VsYXItZXh0ZW5zaW9ucy9jb250cm9scy9iYXNlLWNvbnRyb2xcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImZpbGUtY29udHJvbFwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vZmlsZS1jb250cm9sLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL2ZpbGUtY29udHJvbC5jb21wb25lbnQuc2Nzc1wiXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBwcm92aWRlcnM6IFtGaWxlU2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIEZpbGVDb250cm9sQ29tcG9uZW50IGV4dGVuZHMgQ29udHJvbEJhc2U8RmlsZVtdPiBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIG11bHRpcGxlOiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IHN0cmluZ1tdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhY2NlcHQ6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIG1heEZpbGVTaXplOiBudW1iZXI7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHRvdGFsRmlsZVNpemU6IG51bWJlcjtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgYXV0b1VwbG9hZCA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBhZGFwdGVyOiBGaWxlUGlja2VyQWRhcHRlcjtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2hvd1ByZXZpZXc6IGJvb2xlYW47XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBjaGFuZ2VzOiBFdmVudEVtaXR0ZXI8RmlsZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVtdPigpO1xyXG5cclxuICBAVmlld0NoaWxkKEZpbGVQaWNrZXJDb21wb25lbnQpXHJcbiAgcHVibGljIGZpbGVQaWNrZXI6IEZpbGVQaWNrZXJDb21wb25lbnQ7XHJcblxyXG4gIHB1YmxpYyB2YWxpZGF0aW9uRXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRmllbGRTZXRFbGVtZW50PixcclxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBmaWxlU2l6ZVBpcGU6IEZpbGVTaXplUGlwZSxcclxuICAgIHB1YmxpYyBkZWZhdWx0QWRhcHRlcjogRmlsZVNlcnZpY2UsXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICAgIHRoaXMuYWRhcHRlciA9IHRoaXMuYWRhcHRlciB8fCBkZWZhdWx0QWRhcHRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgIC8vIHJlcGxhY2UgZmlsZSBpbiBzaW5nbGUgc2VsZWN0IG1vZGVcclxuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgIFwiY2hhbmdlXCIsXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5maWVsZC5jb250cm9sLnNldFZhbHVlKFtdLCB7IGVtaXRFdmVudDogZmFsc2UsIGVtaXRNb2RlbFRvVmlld0NoYW5nZTogZmFsc2UgfSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5maWxlUGlja2VyLmZpbGVzID0gW107XHJcblxyXG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHsgY2FwdHVyZTogdHJ1ZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkRpYWxvZ09wZW4oKSB7XHJcbiAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICBcImZvY3VzXCIsXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICB0aGlzLmZpZWxkLmNvbnRyb2wubWFya0FzVG91Y2hlZCh7IG9ubHlTZWxmOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9LFxyXG4gICAgICB7IGNhcHR1cmU6IHRydWUsIG9uY2U6IHRydWUgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25WYWxpZGF0aW9uRXJyb3IoZXJyb3I6IFZhbGlkYXRpb25FcnJvcikge1xyXG4gICAgY29uc3QgZXJySW5kZXggPSB0aGlzLnZhbGlkYXRpb25FcnJvcnMuZmluZEluZGV4KGUgPT4gZS5maWxlID09IGVycm9yLmZpbGUpO1xyXG4gICAgZXJyb3IuZXJyb3IgPSB0aGlzLmdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UoZXJyb3IuZXJyb3IgYXMgRmlsZVZhbGlkYXRpb25UeXBlcyk7XHJcblxyXG4gICAgaWYgKGVyckluZGV4ICE9IC0xKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9yc1tlcnJJbmRleF0gPSBlcnJvcjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMucHVzaChlcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkZpbGVBZGRlZChmaWxlOiBGaWxlUHJldmlld01vZGVsKSB7XHJcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvcnMgPSBbXTtcclxuXHJcbiAgICB0aGlzLmZpZWxkLnZhbHVlID0gdGhpcy5maWVsZC52YWx1ZVxyXG4gICAgICA/IFsuLi50aGlzLmZpZWxkLnZhbHVlLCBmaWxlLmZpbGUgYXMgRmlsZV1cclxuICAgICAgOiBbZmlsZS5maWxlIGFzIEZpbGVdO1xyXG5cclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25GaWxlUmVtb3ZlZChyZW1vdmVkRmlsZTogRmlsZVByZXZpZXdNb2RlbCkge1xyXG4gICAgdGhpcy52YWxpZGF0aW9uRXJyb3JzID0gW107XHJcblxyXG4gICAgdGhpcy5maWVsZC52YWx1ZSA9IHRoaXMuZmllbGQudmFsdWVcclxuICAgICAgPyB0aGlzLmZpZWxkLnZhbHVlLmZpbHRlcihmaWxlID0+IGZpbGUubmFtZSAhPSByZW1vdmVkRmlsZS5maWxlTmFtZSlcclxuICAgICAgOiBbcmVtb3ZlZEZpbGUuZmlsZSBhcyBGaWxlXTtcclxuXHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKGVycm9yVHlwZTogRmlsZVZhbGlkYXRpb25UeXBlcykge1xyXG4gICAgc3dpdGNoIChlcnJvclR5cGUpIHtcclxuXHJcbiAgICAgIGNhc2UgRmlsZVZhbGlkYXRpb25UeXBlcy51cGxvYWRUeXBlOlxyXG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlID8gXCJTZWxlY3QgbXVsdGlwbGUgZmlsZXNcIiA6IFwiU2VsZWN0IG9ubHkgb25lIGZpbGVcIjtcclxuXHJcbiAgICAgIGNhc2UgRmlsZVZhbGlkYXRpb25UeXBlcy5leHRlbnNpb25zOlxyXG4gICAgICAgIHJldHVybiBgU2VsZWN0ZWQgZmlsZSBzaG91bGQgaGF2ZSAke3RoaXMuYWxsb3dlZEZpbGVFeHRlbnNpb25zfSBleHRlbnNpb25gO1xyXG5cclxuICAgICAgY2FzZSBGaWxlVmFsaWRhdGlvblR5cGVzLmZpbGVNYXhTaXplOlxyXG4gICAgICAgIHJldHVybiBgVGhlIHNpemUgb2Ygc2VsZWN0ZWQgZmlsZSBpcyBsYXJnZXIgdGhhbiAke3RoaXMuZmlsZVNpemVQaXBlLnRyYW5zZm9ybSh0aGlzLm1heEZpbGVTaXplKX1gO1xyXG5cclxuICAgICAgY2FzZSBGaWxlVmFsaWRhdGlvblR5cGVzLnRvdGFsTWF4U2l6ZTpcclxuICAgICAgICByZXR1cm4gYFRoZSB0b3RhbCBzaXplIG9mIHNlbGVjdGVkIGZpbGVzIGlzIGxhcmdlciB0aGFuICR7dGhpcy5maWxlU2l6ZVBpcGUudHJhbnNmb3JtKHRoaXMudG90YWxGaWxlU2l6ZSl9YDtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIFwiVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGFkZGluZyB5b3VyIGZpbGVcIjtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGJhc2UtY29udHJvbCAjYmFzZUNvbnRyb2xcclxuICAgICAgICAgICAgICBbY29udHJvbF09XCJ0aGlzXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZpZWxkLWxhYmVsXCI+XHJcbiAgICA8bmd4LWF3ZXNvbWUtdXBsb2FkZXIgI3VwbG9hZGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2FkYXB0ZXJdPVwiYWRhcHRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dlRHJhZ0Ryb3Bab25lXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZpZWxkQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93UHJldmlld0NvbnRhaW5lcl09XCJzaG93UHJldmlld1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3VwbG9hZFR5cGVdPVwibXVsdGlwbGUgPyAnbXVsdGknIDogJ3NpbmdsZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWxlTWF4U2l6ZV09XCJtYXhGaWxlU2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3RvdGFsTWF4U2l6ZV09XCJ0b3RhbEZpbGVTaXplXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0XT1cImFjY2VwdC50b1N0cmluZygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbVRlbXBsYXRlXT1cImZpbGVJdGVtVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtlbmFibGVBdXRvVXBsb2FkXT1cImF1dG9VcGxvYWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWxlRXh0ZW5zaW9uc109XCJhbGxvd2VkRmlsZUV4dGVuc2lvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh2YWxpZGF0aW9uRXJyb3IpPVwib25WYWxpZGF0aW9uRXJyb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVBZGRlZCk9XCJvbkZpbGVBZGRlZCgkZXZlbnQpXCI+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZHJvcHpvbmVUZW1wbGF0ZVwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGlhbG9nT3BlbigpXCI+e3sgZmllbGQubGFiZWwgfX08L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25neC1hd2Vzb21lLXVwbG9hZGVyPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8bWF0LWVycm9yICpuZ0lmPVwiYmFzZUNvbnRyb2wuaW5pdGlhbGl6ZWQgJiYgZmllbGQuY29udHJvbC50b3VjaGVkXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmFzZUNvbnRyb2wuZXJyb3JzVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2YWxpZGF0aW9uRXJyb3JzXCI+XHJcbiAgICAgIDxtYXQtZXJyb3IgKm5nRm9yPVwibGV0IGVycm9yIG9mIHZhbGlkYXRpb25FcnJvcnNcIj5cclxuICAgICAgICB7eyBlcnJvci5lcnJvciB9fVxyXG4gICAgICA8L21hdC1lcnJvcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvbWF0LWVycm9yPlxyXG48L2Jhc2UtY29udHJvbD5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZmlsZUl0ZW1UZW1wbGF0ZVxyXG4gICAgICAgICAgICAgbGV0LWZpbGVJdGVtPVwiZmlsZUl0ZW1cIlxyXG4gICAgICAgICAgICAgbGV0LXVwbG9hZFByb2dyZXNzPVwidXBsb2FkUHJvZ3Jlc3NcIj5cclxuICA8ZGl2IGNsYXNzPVwidG9vbGJhclwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxlZnRcIj5cclxuICAgICAge3sgZmlsZUl0ZW0uZmlsZU5hbWUgfX1cclxuICAgIDwvc3Bhbj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiZmlsZUl0ZW1cIj5cclxuICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInVwbG9hZGVyLnJlbW92ZUZpbGUoZmlsZUl0ZW0pOyBvbkZpbGVSZW1vdmVkKGZpbGVJdGVtKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==

@@ -104,3 +104,3 @@ import * as i0 from '@angular/core';

FileControlComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.9", ngImport: i0, type: FileControlComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.FileSizePipe }, { token: FileService }], target: i0.ɵɵFactoryTarget.Component });
FileControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.9", type: FileControlComponent, selector: "file-control", inputs: { multiple: "multiple", allowedFileExtensions: "allowedFileExtensions", accept: "accept", maxFileSize: "maxFileSize", totalFileSize: "totalFileSize", autoUpload: "autoUpload", adapter: "adapter", showPreview: "showPreview" }, outputs: { changes: "changes" }, providers: [FileService], viewQueries: [{ propertyName: "filePicker", first: true, predicate: FilePickerComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<base-control #baseControl\r\n [control]=\"this\">\r\n <div class=\"field-label\">\r\n <ngx-awesome-uploader #uploader\r\n [adapter]=\"adapter\"\r\n [showeDragDropZone]=\"true\"\r\n [ngClass]=\"fieldClass\"\r\n [showPreviewContainer]=\"showPreview\"\r\n [uploadType]=\"multiple ? 'multi' : 'single'\"\r\n [fileMaxSize]=\"maxFileSize\"\r\n [totalMaxSize]=\"totalFileSize\"\r\n [accept]=\"accept.toString()\"\r\n [itemTemplate]=\"fileItemTemplate\"\r\n [enableAutoUpload]=\"autoUpload\"\r\n [fileExtensions]=\"allowedFileExtensions\"\r\n (validationError)=\"onValidationError($event)\"\r\n (fileAdded)=\"onFileAdded($event)\">\r\n\r\n <div class=\"dropzoneTemplate\">\r\n <button mat-raised-button\r\n (click)=\"onDialogOpen()\">{{ field.label }}</button>\r\n </div>\r\n </ngx-awesome-uploader>\r\n </div>\r\n\r\n <mat-error *ngIf=\"baseControl.initialized && field.control.touched\">\r\n <ng-container *ngTemplateOutlet=\"baseControl.errorsTemplate\"></ng-container>\r\n <ng-container *ngIf=\"validationErrors\">\r\n <mat-error *ngFor=\"let error of validationErrors\">\r\n {{ error.error }}\r\n </mat-error>\r\n </ng-container>\r\n </mat-error>\r\n</base-control>\r\n\r\n<ng-template #fileItemTemplate\r\n let-fileItem=\"fileItem\"\r\n let-uploadProgress=\"uploadProgress\">\r\n <div class=\"toolbar\">\r\n <span class=\"text-left\">\r\n {{ fileItem.fileName }}\r\n </span>\r\n\r\n <div *ngIf=\"fileItem\">\r\n <button mat-button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"uploader.removeFile(fileItem); onFileRemoved(fileItem)\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host .field-label{width:100%}:host ::ng-deep ngx-awesome-uploader{max-width:none!important}:host ::ng-deep .file-drop-wrapper{width:auto!important;background:none!important;padding-top:0!important}:host ::ng-deep .file-drop-wrapper #dropZone{padding:5px 0;border:none;max-width:none;background:none}:host ::ng-deep .file-drop-wrapper file-drop{padding:0 3px}:host ::ng-deep file-preview-item{position:initial;padding:10px 16px;max-width:none}:host .toolbar{position:relative;display:flex;justify-content:space-between;align-items:center}:host .toolbar mat-icon{cursor:pointer}:host .toolbar .editor-label{padding:8px 14px;display:inline-block;line-height:1em;height:34px}:host .toolbar .form-control{width:auto;display:inline-block;line-height:1em;height:34px;margin-right:.3em}\n"], components: [{ type: i3.BaseControlComponent, selector: "base-control", inputs: ["control"] }, { type: i4.FilePickerComponent, selector: "ngx-awesome-uploader", inputs: ["enableCropper", "showeDragDropZone", "showPreviewContainer", "uploadType", "croppedCanvasOptions", "captions", "enableAutoUpload", "cropperOptions", "customValidator", "itemTemplate", "fileMaxSize", "fileMaxCount", "totalMaxSize", "accept", "fileExtensions", "adapter", "dropzoneTemplate", "fileInputCapture"], outputs: ["uploadSuccess", "uploadFail", "removeSuccess", "validationError", "fileAdded", "fileRemoved"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.MatError, selector: "mat-error", inputs: ["id"] }, { type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
FileControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.9", type: FileControlComponent, selector: "file-control", inputs: { multiple: "multiple", allowedFileExtensions: "allowedFileExtensions", accept: "accept", maxFileSize: "maxFileSize", totalFileSize: "totalFileSize", autoUpload: "autoUpload", adapter: "adapter", showPreview: "showPreview" }, outputs: { changes: "changes" }, providers: [FileService], viewQueries: [{ propertyName: "filePicker", first: true, predicate: FilePickerComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<base-control #baseControl\r\n [control]=\"this\">\r\n <div class=\"field-label\">\r\n <ngx-awesome-uploader #uploader\r\n [adapter]=\"adapter\"\r\n [showeDragDropZone]=\"true\"\r\n [ngClass]=\"fieldClass\"\r\n [showPreviewContainer]=\"showPreview\"\r\n [uploadType]=\"multiple ? 'multi' : 'single'\"\r\n [fileMaxSize]=\"maxFileSize\"\r\n [totalMaxSize]=\"totalFileSize\"\r\n [accept]=\"accept.toString()\"\r\n [itemTemplate]=\"fileItemTemplate\"\r\n [enableAutoUpload]=\"autoUpload\"\r\n [fileExtensions]=\"allowedFileExtensions\"\r\n (validationError)=\"onValidationError($event)\"\r\n (fileAdded)=\"onFileAdded($event)\">\r\n\r\n <div class=\"dropzoneTemplate\">\r\n <button type=\"button\"\r\n mat-raised-button\r\n (click)=\"onDialogOpen()\">{{ field.label }}</button>\r\n </div>\r\n </ngx-awesome-uploader>\r\n </div>\r\n\r\n <mat-error *ngIf=\"baseControl.initialized && field.control.touched\">\r\n <ng-container *ngTemplateOutlet=\"baseControl.errorsTemplate\"></ng-container>\r\n <ng-container *ngIf=\"validationErrors\">\r\n <mat-error *ngFor=\"let error of validationErrors\">\r\n {{ error.error }}\r\n </mat-error>\r\n </ng-container>\r\n </mat-error>\r\n</base-control>\r\n\r\n<ng-template #fileItemTemplate\r\n let-fileItem=\"fileItem\"\r\n let-uploadProgress=\"uploadProgress\">\r\n <div class=\"toolbar\">\r\n <span class=\"text-left\">\r\n {{ fileItem.fileName }}\r\n </span>\r\n\r\n <div *ngIf=\"fileItem\">\r\n <button mat-button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"uploader.removeFile(fileItem); onFileRemoved(fileItem)\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: [":host .field-label{width:100%}:host ::ng-deep ngx-awesome-uploader{max-width:none!important}:host ::ng-deep .file-drop-wrapper{width:auto!important;background:none!important;padding-top:0!important}:host ::ng-deep .file-drop-wrapper #dropZone{padding:5px 0;border:none;max-width:none;background:none}:host ::ng-deep .file-drop-wrapper file-drop{padding:0 3px}:host ::ng-deep file-preview-item{position:initial;padding:10px 16px;max-width:none}:host .toolbar{position:relative;display:flex;justify-content:space-between;align-items:center}:host .toolbar mat-icon{cursor:pointer}:host .toolbar .editor-label{padding:8px 14px;display:inline-block;line-height:1em;height:34px}:host .toolbar .form-control{width:auto;display:inline-block;line-height:1em;height:34px;margin-right:.3em}\n"], components: [{ type: i3.BaseControlComponent, selector: "base-control", inputs: ["control"] }, { type: i4.FilePickerComponent, selector: "ngx-awesome-uploader", inputs: ["enableCropper", "showeDragDropZone", "showPreviewContainer", "uploadType", "croppedCanvasOptions", "captions", "enableAutoUpload", "cropperOptions", "customValidator", "itemTemplate", "fileMaxSize", "fileMaxCount", "totalMaxSize", "accept", "fileExtensions", "adapter", "dropzoneTemplate", "fileInputCapture"], outputs: ["uploadSuccess", "uploadFail", "removeSuccess", "validationError", "fileAdded", "fileRemoved"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.MatError, selector: "mat-error", inputs: ["id"] }, { type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.9", ngImport: i0, type: FileControlComponent, decorators: [{

@@ -107,0 +107,0 @@ type: Component,

{
"name": "angular-extensions",
"version": "1.0.50",
"version": "1.0.51",
"repository": "https://github.com/nazar-kuzo/angular-extensions.git",

@@ -5,0 +5,0 @@ "author": "Nazar Kuzo",

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc