ngx-uploader-may
Version:
Angular file uploader with drag and drop capability and upload progress
536 lines (529 loc) • 46 kB
JavaScript
import { Injectable, Component, ViewChild, Output, EventEmitter, Input, NgModule, defineInjectable } from '@angular/core';
import { HttpClient, HttpRequest, HttpEventType, HttpResponse, HttpClientModule } from '@angular/common/http';
import { CommonModule } from '@angular/common';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NgxUploaderMayService = /** @class */ (function () {
function NgxUploaderMayService() {
}
NgxUploaderMayService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
NgxUploaderMayService.ctorParameters = function () { return []; };
/** @nocollapse */ NgxUploaderMayService.ngInjectableDef = defineInjectable({ factory: function NgxUploaderMayService_Factory() { return new NgxUploaderMayService(); }, token: NgxUploaderMayService, providedIn: "root" });
return NgxUploaderMayService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NgxUploaderMayComponent = /** @class */ (function () {
function NgxUploaderMayComponent(http) {
this.http = http;
this._maxAllowedFiles = 5;
this.onError = new EventEmitter();
this.onUpload = new EventEmitter();
this.onSuccess = new EventEmitter();
this.isFileDragEnter = false;
this.files = [];
this.isUploading = false;
}
Object.defineProperty(NgxUploaderMayComponent.prototype, "allowedExtensions", {
set: /**
* @param {?} extensions
* @return {?}
*/
function (extensions) {
this._allowedExtensions = extensions;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxUploaderMayComponent.prototype, "allowedSize", {
set: /**
* @param {?} size
* @return {?}
*/
function (size) {
this._allowedSize = size;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxUploaderMayComponent.prototype, "maxAllowedFiles", {
set: /**
* @param {?} size
* @return {?}
*/
function (size) {
this._maxAllowedFiles = size;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxUploaderMayComponent.prototype, "formData", {
set: /**
* @param {?} formData
* @return {?}
*/
function (formData) {
this._formData = formData;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxUploaderMayComponent.prototype, "formDataUploadKey", {
set: /**
* @param {?} key
* @return {?}
*/
function (key) {
this._formDataUploadKey = key;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxUploaderMayComponent.prototype, "uploadUrl", {
set: /**
* @param {?} url
* @return {?}
*/
function (url) {
this._uploadUrl = url;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxUploaderMayComponent.prototype, "uploadReqMethod", {
set: /**
* @param {?} method
* @return {?}
*/
function (method) {
this._uploadReqMethod = method;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxUploaderMayComponent.prototype, "isMulti", {
set: /**
* @param {?} multi
* @return {?}
*/
function (multi) {
this._isMulti = multi;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NgxUploaderMayComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
};
/**
* @return {?}
*/
NgxUploaderMayComponent.prototype.onClickUploaderBtn = /**
* @return {?}
*/
function () {
/** @type {?} */
var el = (/** @type {?} */ (this.inputFileField.nativeElement));
el.click();
};
/**
* @param {?} e
* @return {?}
*/
NgxUploaderMayComponent.prototype.onFileDragOverEnter = /**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
e.stopPropagation();
this.setOnFileDragged(true);
};
/**
* @param {?} e
* @return {?}
*/
NgxUploaderMayComponent.prototype.onFileDragLeaveEnd = /**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
e.stopPropagation();
this.setOnFileDragged(false);
};
/**
* @param {?} e
* @return {?}
*/
NgxUploaderMayComponent.prototype.onFileDrop = /**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
e.stopPropagation();
this.setOnFileDragged(false);
this.onAttachedFile(e["dataTransfer"].files);
};
/**
* @param {?} isDragged
* @return {?}
*/
NgxUploaderMayComponent.prototype.setOnFileDragged = /**
* @param {?} isDragged
* @return {?}
*/
function (isDragged) {
this.isFileDragEnter = isDragged;
};
/**
* @param {?} files
* @return {?}
*/
NgxUploaderMayComponent.prototype.onAttachedFile = /**
* @param {?} files
* @return {?}
*/
function (files) {
var _this = this;
this.clearFiles();
console.log(this.files);
if (!this._uploadUrl) {
throw new Error("Upload URL not provided");
}
if (files.length < 1) {
return false;
}
if (this._isMulti && files.length > this._maxAllowedFiles) {
this.onError.emit(["Maximum allowed files count is " + this._maxAllowedFiles]);
return false;
}
if (!this._isMulti && files.length > 1) {
this.onError.emit(["Uploader not configured to upload multiple files"]);
return false;
}
if (this._isMulti) {
for (var i = 0; i < files.length; i++) {
/** @type {?} */
var f = new UploadFile();
f.file = files.item(i);
this.files.push(f);
}
}
else {
/** @type {?} */
var f = new UploadFile();
f.file = files.item(0);
this.files.push(f);
}
//Remove input values after assign
this.clearFileInput();
this.files.forEach(function (uf) {
_this.validate(uf);
});
if (this.files.filter(function (u) { return u.isValid == false; }).length > 0) {
this.onError.emit(this.files.filter(function (u) { return u.isValid == false; }).map(function (u) { return u.invalidMessage; }));
this.clearFiles();
}
else {
this.files.forEach(function (uf) {
_this.uploadFile(uf);
});
}
};
/**
* @param {?} uploadFile
* @return {?}
*/
NgxUploaderMayComponent.prototype.validate = /**
* @param {?} uploadFile
* @return {?}
*/
function (uploadFile) {
var _this = this;
/** @type {?} */
var errors = [];
if (this._allowedExtensions && this._allowedExtensions.filter(function (s) { return s === _this.getFileExtension(uploadFile.file); }).length == 0) {
errors.push("File type not support");
}
if (this._allowedSize && this.getFileSizeMB(uploadFile.file) > this._allowedSize) {
errors.push("File is too large");
}
uploadFile.invalidMessage = errors.join();
if (errors.length > 0) {
uploadFile.isValid = false;
}
else {
uploadFile.isValid = true;
}
};
/**
* @param {?} uploadFile
* @return {?}
*/
NgxUploaderMayComponent.prototype.uploadFile = /**
* @param {?} uploadFile
* @return {?}
*/
function (uploadFile) {
var _this = this;
this.isUploading = true;
uploadFile.fileLabel = uploadFile.file.name;
uploadFile.fileSizeLabel = this.getFileSizeLabel(this.getFileSizeMB(uploadFile.file));
uploadFile.uploadProgress = 0;
/** @type {?} */
var formData = this.createFormData(uploadFile.file);
/** @type {?} */
var req = new HttpRequest(this._uploadReqMethod || "POST", this._uploadUrl, formData, {
reportProgress: true
});
this.http.request(req).subscribe(function (event) {
if (event.type === HttpEventType.UploadProgress) {
/** @type {?} */
var percentDone = Math.round(100 * event.loaded / event.total);
if (percentDone >= 100) {
uploadFile.uploadProgress = 98;
}
else {
uploadFile.uploadProgress = percentDone;
}
}
else if (event instanceof HttpResponse) {
uploadFile.uploadProgress = 100;
if (event.status == 200 || event.status == 201) {
_this.onUploadSuccess(event, uploadFile);
}
}
}, function (error) {
uploadFile.uploadProgress = 100;
_this.onUploadError(error, uploadFile);
});
};
/**
* @param {?} response
* @param {?} uf
* @return {?}
*/
NgxUploaderMayComponent.prototype.onUploadSuccess = /**
* @param {?} response
* @param {?} uf
* @return {?}
*/
function (response, uf) {
uf.isSuccess = true;
uf.serverResponse = response;
this.onUpload.emit(uf.serverResponse);
if (this.isAllFilesUploadDone()) {
this.publishValue();
}
};
/**
* @param {?} error
* @param {?} uf
* @return {?}
*/
NgxUploaderMayComponent.prototype.onUploadError = /**
* @param {?} error
* @param {?} uf
* @return {?}
*/
function (error, uf) {
uf.isSuccess = false;
uf.serverResponse = error.error;
this.onUpload.emit(uf.serverResponse);
if (this.isAllFilesUploadDone()) {
this.publishValue();
}
};
/**
* @return {?}
*/
NgxUploaderMayComponent.prototype.publishValue = /**
* @return {?}
*/
function () {
this.isUploading = false;
this.clearFileInput();
this.onSuccess.emit(this.files.map(function (uf) { return uf.serverResponse; }));
};
/**
* @return {?}
*/
NgxUploaderMayComponent.prototype.isAllFilesUploadDone = /**
* @return {?}
*/
function () {
return !(this.files.filter(function (uf) { return uf.uploadProgress < 100; }).length > 0);
};
/**
* @param {?} file
* @return {?}
*/
NgxUploaderMayComponent.prototype.createFormData = /**
* @param {?} file
* @return {?}
*/
function (file) {
if (!this._formDataUploadKey) {
throw new Error("Empty form data upload key. Please use upload-form-key in your directive.");
}
if (this._formData) {
/** @type {?} */
var formData_1 = new FormData();
this._formData.forEach(function (val, key) {
formData_1.append(key, val);
});
formData_1.append(this._formDataUploadKey, file);
return formData_1;
}
else {
/** @type {?} */
var formData = new FormData();
formData.append(this._formDataUploadKey, file);
return formData;
}
};
/**
* @param {?} file
* @return {?}
*/
NgxUploaderMayComponent.prototype.getFileExtension = /**
* @param {?} file
* @return {?}
*/
function (file) {
return file.name.split(".").pop();
};
/**
* @param {?} file
* @return {?}
*/
NgxUploaderMayComponent.prototype.getFileSizeMB = /**
* @param {?} file
* @return {?}
*/
function (file) {
return file.size / (1e+6);
};
/**
* @param {?} fileSizeMb
* @return {?}
*/
NgxUploaderMayComponent.prototype.getFileSizeLabel = /**
* @param {?} fileSizeMb
* @return {?}
*/
function (fileSizeMb) {
if (fileSizeMb > 1 && fileSizeMb < 1000) {
return fileSizeMb.toFixed(2) + "Mb";
}
else if (fileSizeMb < 1) {
return (fileSizeMb * 1000).toFixed(2) + "Kb";
}
};
/**
* @return {?}
*/
NgxUploaderMayComponent.prototype.clearFileInput = /**
* @return {?}
*/
function () {
this.inputFileField.nativeElement.value = "";
};
/**
* @return {?}
*/
NgxUploaderMayComponent.prototype.clearFiles = /**
* @return {?}
*/
function () {
this.files = [];
};
/**
* @return {?}
*/
NgxUploaderMayComponent.prototype.reset = /**
* @return {?}
*/
function () {
this.clearFiles();
this.clearFileInput();
this.isFileDragEnter = false;
this.isUploading = false;
};
NgxUploaderMayComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-uploader-may',
template: "<div class=\"__ngx-uploader\">\n <div class=\"upload-area\">\n <div class=\"placeholder-area\">\n <img src=\"data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU4Ljk5OSA1OC45OTkiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDU4Ljk5OSA1OC45OTk7IiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTEycHgiIGhlaWdodD0iNTEycHgiPgo8Zz4KCTxwYXRoIGQ9Ik0xOS40NzksMTIuMDE5YzAuMjU2LDAsMC41MTItMC4wOTgsMC43MDctMC4yOTNsOC4zMTMtOC4zMTN2MzUuNTg2YzAsMC41NTMsMC40NDcsMSwxLDFzMS0wLjQ0NywxLTFWMy40MTNsOC4yNzIsOC4yNzIgICBjMC4zOTEsMC4zOTEsMS4wMjMsMC4zOTEsMS40MTQsMHMwLjM5MS0xLjAyMywwLTEuNDE0bC05Ljk3OC05Ljk3OGMtMC4wOTItMC4wOTMtMC4yMDMtMC4xNjYtMC4zMjctMC4yMTcgICBjLTAuMjQ0LTAuMTAxLTAuNTE5LTAuMTAxLTAuNzY0LDBjLTAuMTIzLDAuMDUxLTAuMjM0LDAuMTI1LTAuMzI2LDAuMjE3TDE4Ljc3MiwxMC4zMTJjLTAuMzkxLDAuMzkxLTAuMzkxLDEuMDIzLDAsMS40MTQgICBDMTguOTY3LDExLjkyMiwxOS4yMjMsMTIuMDE5LDE5LjQ3OSwxMi4wMTl6IiBmaWxsPSIjZDVkNWQ1Ii8+Cgk8cGF0aCBkPSJNMzYuNDk5LDE1Ljk5OWMtMC41NTMsMC0xLDAuNDQ3LTEsMXMwLjQ0NywxLDEsMWgxM3YzOWgtNDB2LTM5aDEzYzAuNTUzLDAsMS0wLjQ0NywxLTFzLTAuNDQ3LTEtMS0xaC0xNXY0M2g0NHYtNDNIMzYuNDk5ICAgeiIgZmlsbD0iI2Q1ZDVkNSIvPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+Cjwvc3ZnPgo=\" />\n <p>\n Drag files to upload\n </p>\n </div>\n <button type=\"button\" [disabled]=\"isUploading\" [ngClass]=\"{'on-file-drag': isFileDragEnter}\" (click)=\"onClickUploaderBtn()\" (drop)=\"onFileDrop($event)\" (dragover)=\"onFileDragOverEnter($event)\" (dragenter)=\"onFileDragOverEnter($event)\" (dragleave)=\"onFileDragLeaveEnd($event)\" (dragend)=\"onFileDragLeaveEnd($event)\"></button>\n </div>\n <input #uploadField type=\"file\" (change)=\"onAttachedFile($event.target.files)\" [attr.multiple]=\"_isMulti ? '' : null\">\n <div *ngFor=\"let item of files\" class=\"upload-progress-container\">\n <small>{{item.fileSizeLabel}}</small>\n <div class=\"upload-progress-bar\">\n <div class=\"upload-progress\" [ngStyle]=\"{'width': item.uploadProgress+'%'}\" [ngClass]=\"{'upload-progress-red': item.uploadProgress==100 && !item.isSuccess}\"></div>\n </div>\n <div class=\"progress-text\">\n <small>{{item.uploadProgress}}%</small>\n <small>\n <img *ngIf=\"item.uploadProgress==100 && item.isSuccess\" src=\"data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUxMiA1MTI7IiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4Ij4KPGc+Cgk8Zz4KCQk8cGF0aCBkPSJNNDM3LjAxOSw3NC45OEMzODguNjY3LDI2LjYyOSwzMjQuMzgsMCwyNTYsMEMxODcuNjE5LDAsMTIzLjMzMiwyNi42MjksNzQuOTgsNzQuOThDMjYuNjI5LDEyMy4zMzIsMCwxODcuNjIsMCwyNTYgICAgczI2LjYyOSwxMzIuNjY3LDc0Ljk4LDE4MS4wMTlDMTIzLjMzMiw0ODUuMzcxLDE4Ny42Miw1MTIsMjU2LDUxMnMxMzIuNjY3LTI2LjYyOSwxODEuMDE5LTc0Ljk4ICAgIEM0ODUuMzcxLDM4OC42NjcsNTEyLDMyNC4zOCw1MTIsMjU2UzQ4NS4zNzEsMTIzLjMzMyw0MzcuMDE5LDc0Ljk4eiBNMzc4LjMwNiwxOTUuMDczTDIzNS4yNDEsMzM4LjEzOSAgICBjLTIuOTI5LDIuOTI5LTYuNzY4LDQuMzkzLTEwLjYwNiw0LjM5M2MtMy44MzksMC03LjY3OC0xLjQ2NC0xMC42MDctNC4zOTNsLTgwLjMzNC04MC4zMzNjLTUuODU4LTUuODU3LTUuODU4LTE1LjM1NCwwLTIxLjIxMyAgICBjNS44NTctNS44NTgsMTUuMzU1LTUuODU4LDIxLjIxMywwbDY5LjcyOCw2OS43MjdsMTMyLjQ1OC0xMzIuNDZjNS44NTctNS44NTgsMTUuMzU1LTUuODU4LDIxLjIxMywwICAgIEMzODQuMTY0LDE3OS43MTgsMzg0LjE2NCwxODkuMjE1LDM3OC4zMDYsMTk1LjA3M3oiIGZpbGw9IiMzMmM3NDEiLz4KCTwvZz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K\" />\n <img *ngIf=\"item.uploadProgress==100 && !item.isSuccess\" src=\"data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDUyIDUyIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MiA1MjsiIHhtbDpzcGFjZT0icHJlc2VydmUiIHdpZHRoPSIxNnB4IiBoZWlnaHQ9IjE2cHgiPgo8Zz4KCTxwYXRoIGQ9Ik0yNiwwQzExLjY2NCwwLDAsMTEuNjYzLDAsMjZzMTEuNjY0LDI2LDI2LDI2czI2LTExLjY2MywyNi0yNlM0MC4zMzYsMCwyNiwweiBNMjYsNTBDMTIuNzY3LDUwLDIsMzkuMjMzLDIsMjYgICBTMTIuNzY3LDIsMjYsMnMyNCwxMC43NjcsMjQsMjRTMzkuMjMzLDUwLDI2LDUweiIgZmlsbD0iI0Q4MDAyNyIvPgoJPHBhdGggZD0iTTM1LjcwNywxNi4yOTNjLTAuMzkxLTAuMzkxLTEuMDIzLTAuMzkxLTEuNDE0LDBMMjYsMjQuNTg2bC04LjI5My04LjI5M2MtMC4zOTEtMC4zOTEtMS4wMjMtMC4zOTEtMS40MTQsMCAgIHMtMC4zOTEsMS4wMjMsMCwxLjQxNEwyNC41ODYsMjZsLTguMjkzLDguMjkzYy0wLjM5MSwwLjM5MS0wLjM5MSwxLjAyMywwLDEuNDE0QzE2LjQ4OCwzNS45MDIsMTYuNzQ0LDM2LDE3LDM2ICAgczAuNTEyLTAuMDk4LDAuNzA3LTAuMjkzTDI2LDI3LjQxNGw4LjI5Myw4LjI5M0MzNC40ODgsMzUuOTAyLDM0Ljc0NCwzNiwzNSwzNnMwLjUxMi0wLjA5OCwwLjcwNy0wLjI5MyAgIGMwLjM5MS0wLjM5MSwwLjM5MS0xLjAyMywwLTEuNDE0TDI3LjQxNCwyNmw4LjI5My04LjI5M0MzNi4wOTgsMTcuMzE2LDM2LjA5OCwxNi42ODQsMzUuNzA3LDE2LjI5M3oiIGZpbGw9IiNEODAwMjciLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K\" />\n {{item.fileLabel}}\n </small>\n </div>\n </div>\n</div>",
styles: [".__ngx-uploader input{display:none}.__ngx-uploader .upload-area{padding:5rem;background-color:#fafafa;position:relative;border:1.5px dashed #d5d5d5}.__ngx-uploader .upload-area .placeholder-area{display:flex;align-items:center;justify-content:center;flex-direction:column;position:absolute;top:0;left:0;right:0;bottom:0}.__ngx-uploader .upload-area .placeholder-area img{width:30px;margin-bottom:10px}.__ngx-uploader .upload-area button{position:absolute;top:0;left:0;right:0;bottom:0;background:0 0;border:none;cursor:pointer;width:100%;padding:0}.__ngx-uploader .upload-area button:focus{outline:0}.__ngx-uploader .upload-area button:active{box-shadow:inset 0 1px 20px -3px rgba(16,83,158,.72)}.__ngx-uploader .upload-area button:hover{background:rgba(11,116,150,.1)}.__ngx-uploader .upload-area button.on-file-drag{background:rgba(0,0,0,.5)}.__ngx-uploader .upload-progress-container{margin-top:15px}.__ngx-uploader .upload-progress-container p{margin-bottom:5px}.__ngx-uploader .upload-progress-container .upload-progress-bar{background-color:#e2e7ee;height:5px;margin-bottom:5px;border-radius:4px}.__ngx-uploader .upload-progress-container .upload-progress-bar .upload-progress{height:100%;width:0;background-color:#1991eb;transition:width .6s;border-radius:4px}.__ngx-uploader .upload-progress-container .upload-progress-bar .upload-progress.upload-progress-red{background-color:#c50000}.__ngx-uploader .upload-progress-container .progress-text,.__ngx-uploader .upload-progress-container .progress-text small{display:flex;align-items:center;justify-content:space-between;flex-direction:row}.__ngx-uploader .upload-progress-container .progress-text small img{margin-right:5px}"]
}] }
];
/** @nocollapse */
NgxUploaderMayComponent.ctorParameters = function () { return [
{ type: HttpClient }
]; };
NgxUploaderMayComponent.propDecorators = {
inputFileField: [{ type: ViewChild, args: ['uploadField',] }],
allowedExtensions: [{ type: Input, args: ["allowed-extensions",] }],
allowedSize: [{ type: Input, args: ["allowed-size",] }],
maxAllowedFiles: [{ type: Input, args: ["max-allowed-files",] }],
formData: [{ type: Input, args: ["form-data",] }],
formDataUploadKey: [{ type: Input, args: ["upload-form-key",] }],
uploadUrl: [{ type: Input, args: ["upload-url",] }],
uploadReqMethod: [{ type: Input, args: ["request-method",] }],
isMulti: [{ type: Input, args: ["is-multi",] }],
onError: [{ type: Output, args: ["onError",] }],
onUpload: [{ type: Output, args: ["onUpload",] }],
onSuccess: [{ type: Output, args: ["onSuccess",] }]
};
return NgxUploaderMayComponent;
}());
var UploadFile = /** @class */ (function () {
function UploadFile() {
}
return UploadFile;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NgxUploaderMayModule = /** @class */ (function () {
function NgxUploaderMayModule() {
}
NgxUploaderMayModule.decorators = [
{ type: NgModule, args: [{
declarations: [NgxUploaderMayComponent],
imports: [
CommonModule,
HttpClientModule
],
exports: [NgxUploaderMayComponent]
},] }
];
return NgxUploaderMayModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
export { NgxUploaderMayService, NgxUploaderMayComponent, UploadFile, NgxUploaderMayModule };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXVwbG9hZGVyLW1heS5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmd4LXVwbG9hZGVyLW1heS9saWIvbmd4LXVwbG9hZGVyLW1heS5zZXJ2aWNlLnRzIiwibmc6Ly9uZ3gtdXBsb2FkZXItbWF5L2xpYi9uZ3gtdXBsb2FkZXItbWF5LmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LXVwbG9hZGVyLW1heS9saWIvbmd4LXVwbG9hZGVyLW1heS5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBOZ3hVcGxvYWRlck1heVNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgZm9yd2FyZFJlZiwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBSZXF1ZXN0LCBIdHRwRXZlbnRUeXBlLCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC11cGxvYWRlci1tYXknLFxuICB0ZW1wbGF0ZVVybDogJy4vbmd4LXVwbG9hZGVyLW1heS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25neC11cGxvYWRlci1tYXkuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hVcGxvYWRlck1heUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cblxuICBAVmlld0NoaWxkKCd1cGxvYWRGaWVsZCcpIGlucHV0RmlsZUZpZWxkOiBFbGVtZW50UmVmO1xuXG4gIF9hbGxvd2VkRXh0ZW5zaW9uczogQXJyYXk8c3RyaW5nPjtcbiAgQElucHV0KFwiYWxsb3dlZC1leHRlbnNpb25zXCIpXG4gIHNldCBhbGxvd2VkRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy5fYWxsb3dlZEV4dGVuc2lvbnMgPSBleHRlbnNpb25zO1xuICB9XG5cbiAgX2FsbG93ZWRTaXplOiBudW1iZXI7XG4gIEBJbnB1dChcImFsbG93ZWQtc2l6ZVwiKVxuICBzZXQgYWxsb3dlZFNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fYWxsb3dlZFNpemUgPSBzaXplO1xuICB9XG5cbiAgX21heEFsbG93ZWRGaWxlczogbnVtYmVyID0gNTtcbiAgQElucHV0KFwibWF4LWFsbG93ZWQtZmlsZXNcIilcbiAgc2V0IG1heEFsbG93ZWRGaWxlcyhzaXplOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXhBbGxvd2VkRmlsZXMgPSBzaXplO1xuICB9XG5cbiAgX2Zvcm1EYXRhOiBGb3JtRGF0YTtcbiAgQElucHV0KFwiZm9ybS1kYXRhXCIpXG4gIHNldCBmb3JtRGF0YShmb3JtRGF0YTogRm9ybURhdGEpIHtcbiAgICB0aGlzLl9mb3JtRGF0YSA9IGZvcm1EYXRhO1xuICB9XG5cbiAgX2Zvcm1EYXRhVXBsb2FkS2V5OiBzdHJpbmc7XG4gIEBJbnB1dChcInVwbG9hZC1mb3JtLWtleVwiKVxuICBzZXQgZm9ybURhdGFVcGxvYWRLZXkoa2V5OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9mb3JtRGF0YVVwbG9hZEtleSA9IGtleTtcbiAgfVxuXG4gIF91cGxvYWRVcmw6IHN0cmluZztcbiAgQElucHV0KFwidXBsb2FkLXVybFwiKVxuICBzZXQgdXBsb2FkVXJsKHVybDogc3RyaW5nKSB7XG4gICAgdGhpcy5fdXBsb2FkVXJsID0gdXJsO1xuICB9XG5cbiAgX3VwbG9hZFJlcU1ldGhvZDogc3RyaW5nO1xuICBASW5wdXQoXCJyZXF1ZXN0LW1ldGhvZFwiKVxuICBzZXQgdXBsb2FkUmVxTWV0aG9kKG1ldGhvZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fdXBsb2FkUmVxTWV0aG9kID0gbWV0aG9kO1xuICB9XG5cbiAgX2lzTXVsdGk6IGJvb2xlYW47XG4gIEBJbnB1dChcImlzLW11bHRpXCIpXG4gIHNldCBpc011bHRpKG11bHRpOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNNdWx0aSA9IG11bHRpO1xuICB9XG5cbiAgQE91dHB1dChcIm9uRXJyb3JcIikgb25FcnJvciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dChcIm9uVXBsb2FkXCIpIG9uVXBsb2FkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KFwib25TdWNjZXNzXCIpIG9uU3VjY2VzcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBpc0ZpbGVEcmFnRW50ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZmlsZXM6QXJyYXk8VXBsb2FkRmlsZT4gPSBbXTtcbiAgaXNVcGxvYWRpbmc6Ym9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gIH1cblxuICBvbkNsaWNrVXBsb2FkZXJCdG4oKSB7XG4gICAgbGV0IGVsOiBIVE1MRWxlbWVudCA9IHRoaXMuaW5wdXRGaWxlRmllbGQubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBlbC5jbGljaygpO1xuICB9XG5cbiAgb25GaWxlRHJhZ092ZXJFbnRlcihlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zZXRPbkZpbGVEcmFnZ2VkKHRydWUpO1xuICB9XG5cbiAgb25GaWxlRHJhZ0xlYXZlRW5kKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnNldE9uRmlsZURyYWdnZWQoZmFsc2UpO1xuICB9XG5cbiAgb25GaWxlRHJvcChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zZXRPbkZpbGVEcmFnZ2VkKGZhbHNlKTtcbiAgICB0aGlzLm9uQXR0YWNoZWRGaWxlKGVbXCJkYXRhVHJhbnNmZXJcIl0uZmlsZXMpO1xuICB9XG5cbiAgc2V0T25GaWxlRHJhZ2dlZChpc0RyYWdnZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzRmlsZURyYWdFbnRlciA9IGlzRHJhZ2dlZDtcbiAgfVxuXG5cbiAgb25BdHRhY2hlZEZpbGUoZmlsZXM6IEZpbGVMaXN0KSB7XG4gICAgdGhpcy5jbGVhckZpbGVzKCk7XG4gICAgXG4gICAgY29uc29sZS5sb2codGhpcy5maWxlcyk7XG5cbiAgICBpZiAoIXRoaXMuX3VwbG9hZFVybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVXBsb2FkIFVSTCBub3QgcHJvdmlkZWRcIik7XG4gICAgfVxuXG4gICAgaWYgKGZpbGVzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZih0aGlzLl9pc011bHRpICYmIGZpbGVzLmxlbmd0aCA+IHRoaXMuX21heEFsbG93ZWRGaWxlcyl7XG4gICAgICB0aGlzLm9uRXJyb3IuZW1pdChbXCJNYXhpbXVtIGFsbG93ZWQgZmlsZXMgY291bnQgaXMgXCIrIHRoaXMuX21heEFsbG93ZWRGaWxlc10pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmKCF0aGlzLl9pc011bHRpICYmIGZpbGVzLmxlbmd0aCA+IDEpe1xuICAgICAgdGhpcy5vbkVycm9yLmVtaXQoW1wiVXBsb2FkZXIgbm90IGNvbmZpZ3VyZWQgdG8gdXBsb2FkIG11bHRpcGxlIGZpbGVzXCJdKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgaWYodGhpcy5faXNNdWx0aSl7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBmID0gbmV3IFVwbG9hZEZpbGUoKTtcbiAgICAgICAgZi5maWxlID0gZmlsZXMuaXRlbShpKTtcbiAgICAgICAgdGhpcy5maWxlcy5wdXNoKGYpO1xuICAgICAgfVxuICAgIH1lbHNle1xuICAgICAgbGV0IGYgPSBuZXcgVXBsb2FkRmlsZSgpO1xuICAgICAgZi5maWxlID0gZmlsZXMuaXRlbSgwKTtcbiAgICAgIHRoaXMuZmlsZXMucHVzaChmKTtcbiAgICB9XG4gICAgLy9SZW1vdmUgaW5wdXQgdmFsdWVzIGFmdGVyIGFzc2lnblxuICAgIHRoaXMuY2xlYXJGaWxlSW5wdXQoKTtcblxuICAgIHRoaXMuZmlsZXMuZm9yRWFjaCh1ZiA9PntcbiAgICAgIHRoaXMudmFsaWRhdGUodWYpO1xuICAgIH0pO1xuXG4gICAgaWYodGhpcy5maWxlcy5maWx0ZXIodSA9PiB1LmlzVmFsaWQgPT0gZmFsc2UpLmxlbmd0aCA+IDApe1xuICAgICAgdGhpcy5vbkVycm9yLmVtaXQodGhpcy5maWxlcy5maWx0ZXIodSA9PiB1LmlzVmFsaWQgPT0gZmFsc2UpLm1hcCh1ID0+IHUuaW52YWxpZE1lc3NhZ2UpKTtcbiAgICAgIHRoaXMuY2xlYXJGaWxlcygpO1xuICAgIH1lbHNle1xuICAgICAgdGhpcy5maWxlcy5mb3JFYWNoKHVmID0+e1xuICAgICAgICB0aGlzLnVwbG9hZEZpbGUodWYpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUodXBsb2FkRmlsZTogVXBsb2FkRmlsZSkge1xuICAgIGxldCBlcnJvcnM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBpZiAodGhpcy5fYWxsb3dlZEV4dGVuc2lvbnMgJiYgdGhpcy5fYWxsb3dlZEV4dGVuc2lvbnMuZmlsdGVyKHMgPT4gcyA9PT0gdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKHVwbG9hZEZpbGUuZmlsZSkpLmxlbmd0aCA9PSAwKSB7XG4gICAgICBlcnJvcnMucHVzaChcIkZpbGUgdHlwZSBub3Qgc3VwcG9ydFwiKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYWxsb3dlZFNpemUgJiYgdGhpcy5nZXRGaWxlU2l6ZU1CKHVwbG9hZEZpbGUuZmlsZSkgPiB0aGlzLl9hbGxvd2VkU2l6ZSkge1xuICAgICAgZXJyb3JzLnB1c2goXCJGaWxlIGlzIHRvbyBsYXJnZVwiKTtcbiAgICB9XG4gICAgdXBsb2FkRmlsZS5pbnZhbGlkTWVzc2FnZSA9IGVycm9ycy5qb2luKCk7XG5cbiAgICBpZihlcnJvcnMubGVuZ3RoID4gMCl7XG4gICAgICB1cGxvYWRGaWxlLmlzVmFsaWQgPSBmYWxzZTtcbiAgICB9ZWxzZXtcbiAgICAgIHVwbG9hZEZpbGUuaXNWYWxpZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdXBsb2FkRmlsZSh1cGxvYWRGaWxlOiBVcGxvYWRGaWxlKSB7XG4gICAgdGhpcy5pc1VwbG9hZGluZyA9IHRydWU7XG4gICAgdXBsb2FkRmlsZS5maWxlTGFiZWwgPSAgdXBsb2FkRmlsZS5maWxlLm5hbWU7XG4gICAgdXBsb2FkRmlsZS5maWxlU2l6ZUxhYmVsID0gdGhpcy5nZXRGaWxlU2l6ZUxhYmVsKHRoaXMuZ2V0RmlsZVNpemVNQih1cGxvYWRGaWxlLmZpbGUpKTtcbiAgICB1cGxvYWRGaWxlLnVwbG9hZFByb2dyZXNzID0gMDtcbiAgICBsZXQgZm9ybURhdGEgPSB0aGlzLmNyZWF0ZUZvcm1EYXRhKHVwbG9hZEZpbGUuZmlsZSk7XG5cbiAgICBjb25zdCByZXEgPSBuZXcgSHR0cFJlcXVlc3QodGhpcy5fdXBsb2FkUmVxTWV0aG9kIHx8IFwiUE9TVFwiLCB0aGlzLl91cGxvYWRVcmwsIGZvcm1EYXRhLCB7XG4gICAgICByZXBvcnRQcm9ncmVzczogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdGhpcy5odHRwLnJlcXVlc3QocmVxKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3MpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudERvbmUgPSBNYXRoLnJvdW5kKDEwMCAqIGV2ZW50LmxvYWRlZCAvIGV2ZW50LnRvdGFsKTtcbiAgICAgICAgaWYocGVyY2VudERvbmUgPj0gMTAwKXtcbiAgICAgICAgICB1cGxvYWRGaWxlLnVwbG9hZFByb2dyZXNzID0gOTg7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgIHVwbG9hZEZpbGUudXBsb2FkUHJvZ3Jlc3MgPSBwZXJjZW50RG9uZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSkge1xuICAgICAgICB1cGxvYWRGaWxlLnVwbG9hZFByb2dyZXNzID0gMTAwO1xuICAgICAgICBpZiAoZXZlbnQuc3RhdHVzID09IDIwMCB8fCBldmVudC5zdGF0dXMgPT0gMjAxKSB7XG4gICAgICAgICAgdGhpcy5vblVwbG9hZFN1Y2Nlc3MoZXZlbnQsdXBsb2FkRmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgICAgZXJyb3IgPT4ge1xuICAgICAgICB1cGxvYWRGaWxlLnVwbG9hZFByb2dyZXNzID0gMTAwO1xuICAgICAgICB0aGlzLm9uVXBsb2FkRXJyb3IoZXJyb3IsIHVwbG9hZEZpbGUpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBvblVwbG9hZFN1Y2Nlc3MocmVzcG9uc2U6YW55LCB1ZjpVcGxvYWRGaWxlKXtcbiAgICB1Zi5pc1N1Y2Nlc3MgPSB0cnVlO1xuICAgIHVmLnNlcnZlclJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGhpcy5vblVwbG9hZC5lbWl0KHVmLnNlcnZlclJlc3BvbnNlKTtcbiAgICBpZih0aGlzLmlzQWxsRmlsZXNVcGxvYWREb25lKCkpe1xuICAgICAgdGhpcy5wdWJsaXNoVmFsdWUoKTtcbiAgICB9XG4gIH1cblxuICBvblVwbG9hZEVycm9yKGVycm9yOmFueSwgdWY6VXBsb2FkRmlsZSl7XG4gICAgdWYuaXNTdWNjZXNzID0gZmFsc2U7XG4gICAgdWYuc2VydmVyUmVzcG9uc2UgPSBlcnJvci5lcnJvcjtcbiAgICB0aGlzLm9uVXBsb2FkLmVtaXQodWYuc2VydmVyUmVzcG9uc2UpO1xuICAgIGlmKHRoaXMuaXNBbGxGaWxlc1VwbG9hZERvbmUoKSl7XG4gICAgICB0aGlzLnB1Ymxpc2hWYWx1ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1Ymxpc2hWYWx1ZSgpe1xuICAgIHRoaXMuaXNVcGxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNsZWFyRmlsZUlucHV0KCk7XG4gICAgdGhpcy5vblN1Y2Nlc3MuZW1pdCh0aGlzLmZpbGVzLm1hcCh1ZiA9PiB1Zi5zZXJ2ZXJSZXNwb25zZSkpO1xuICB9XG5cbiAgaXNBbGxGaWxlc1VwbG9hZERvbmUoKXtcbiAgICByZXR1cm4gISh0aGlzLmZpbGVzLmZpbHRlcih1ZiA9PiB1Zi51cGxvYWRQcm9ncmVzcyA8IDEwMCkubGVuZ3RoID4gMCk7XG4gIH1cblxuICBjcmVhdGVGb3JtRGF0YShmaWxlOiBGaWxlKSB7XG4gICAgaWYgKCF0aGlzLl9mb3JtRGF0YVVwbG9hZEtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW1wdHkgZm9ybSBkYXRhIHVwbG9hZCBrZXkuIFBsZWFzZSB1c2UgdXBsb2FkLWZvcm0ta2V5IGluIHlvdXIgZGlyZWN0aXZlLlwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2Zvcm1EYXRhKSB7XG4gICAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIHRoaXMuX2Zvcm1EYXRhLmZvckVhY2goKHZhbCwga2V5KSA9PntcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgdmFsKTtcbiAgICAgIH0pO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMuX2Zvcm1EYXRhVXBsb2FkS2V5LCBmaWxlKTtcbiAgICAgIHJldHVybiBmb3JtRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQodGhpcy5fZm9ybURhdGFVcGxvYWRLZXksIGZpbGUpO1xuICAgICAgcmV0dXJuIGZvcm1EYXRhO1xuICAgIH1cbiAgfVxuXG4gIGdldEZpbGVFeHRlbnNpb24oZmlsZTogRmlsZSkge1xuICAgIHJldHVybiBmaWxlLm5hbWUuc3BsaXQoXCIuXCIpLnBvcCgpO1xuICB9XG5cbiAgZ2V0RmlsZVNpemVNQihmaWxlOiBGaWxlKSB7XG4gICAgcmV0dXJuIGZpbGUuc2l6ZSAvICgxZSs2KTtcbiAgfVxuXG4gIGdldEZpbGVTaXplTGFiZWwoZmlsZVNpemVNYjogbnVtYmVyKSB7XG4gICAgaWYgKGZpbGVTaXplTWIgPiAxICYmIGZpbGVTaXplTWIgPCAxMDAwKSB7XG4gICAgICByZXR1cm4gZmlsZVNpemVNYi50b0ZpeGVkKDIpICsgXCJNYlwiO1xuICAgIH0gZWxzZSBpZiAoZmlsZVNpemVNYiA8IDEpIHtcbiAgICAgIHJldHVybiAoZmlsZVNpemVNYiAqIDEwMDApLnRvRml4ZWQoMikgKyBcIktiXCI7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJGaWxlSW5wdXQoKSB7XG4gICAgdGhpcy5pbnB1dEZpbGVGaWVsZC5uYXRpdmVFbGVtZW50LnZhbHVlID0gXCJcIjtcbiAgfVxuXG4gIGNsZWFyRmlsZXMoKXtcbiAgICB0aGlzLmZpbGVzID0gW107XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKXtcbiAgICB0aGlzLmNsZWFyRmlsZXMoKTtcbiAgICB0aGlzLmNsZWFyRmlsZUlucHV0KCk7XG4gICAgdGhpcy5pc0ZpbGVEcmFnRW50ZXIgPSBmYWxzZTtcbiAgICB0aGlzLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVwbG9hZEZpbGV7XG4gIGZpbGU6RmlsZTtcbiAgdXBsb2FkUHJvZ3Jlc3M6bnVtYmVyO1xuICBmaWxlTGFiZWw6c3RyaW5nO1xuICBmaWxlU2l6ZUxhYmVsOnN0cmluZztcbiAgaXNTdWNjZXNzOmJvb2xlYW47XG4gIGlzVmFsaWQ6Ym9vbGVhbjtcbiAgaW52YWxpZE1lc3NhZ2U6c3RyaW5nO1xuICBzZXJ2ZXJSZXNwb25zZTphbnk7XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd4VXBsb2FkZXJNYXlDb21wb25lbnQgfSBmcm9tICcuL25neC11cGxvYWRlci1tYXkuY29tcG9uZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtOZ3hVcGxvYWRlck1heUNvbXBvbmVudF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgSHR0cENsaWVudE1vZHVsZVxuICBdLFxuICBleHBvcnRzOiBbTmd4VXBsb2FkZXJNYXlDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIE5neFVwbG9hZGVyTWF5TW9kdWxlIHsgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7SUFPRTtLQUFpQjs7Z0JBTGxCLFVBQVUsU0FBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7Ozs7O2dDQUpEO0NBRUE7Ozs7OztBQ0ZBO0lBc0VFLGlDQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBNUNwQyxxQkFBZ0IsR0FBVyxDQUFDLENBQUM7UUFvQ1YsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUIsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDN0IsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFcEQsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMsVUFBSyxHQUFxQixFQUFFLENBQUM7UUFD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