ng-devui
Version:
DevUI components based on Angular
262 lines • 30.9 kB
JavaScript
import { Directive, ElementRef, EventEmitter, forwardRef, HostListener, Input, Output } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { I18nService } from 'ng-devui/i18n';
import { from } from 'rxjs';
import { debounceTime, last, map, mergeMap } from 'rxjs/operators';
import { IFileOptions, IUploadOptions, UploadStatus } from './file-uploader.types';
import { SelectFiles } from './select-files.utils';
import { UploadComponent } from './upload.class';
import * as i0 from "@angular/core";
import * as i1 from "./select-files.utils";
import * as i2 from "ng-devui/i18n";
export class UploadDirective extends UploadComponent {
constructor(selectFiles, i18n, element) {
super();
this.selectFiles = selectFiles;
this.i18n = i18n;
this.uploadedFiles = [];
this.fileUploaders = [];
this.enableDrop = false;
this.fileOver = new EventEmitter();
this.fileDrop = new EventEmitter();
this.successEvent = new EventEmitter();
this.errorEvent = new EventEmitter();
this.alertMsgEvent = new EventEmitter();
this.fileSelect = new EventEmitter();
this.errorMsg = [];
this.onChange = (_) => null;
this.onTouched = () => null;
this.element = element;
this.i18nText = this.i18n.getI18nText().upload;
this.i18nSubscription = this.i18n.langChange().subscribe((data) => {
this.i18nText = data.upload;
});
}
writeValue(files) {
if (files) {
const simulateFiles = from(this.simulateSelectFiles(files)).pipe(mergeMap(file => file));
this._dealFiles(simulateFiles);
}
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
simulateSelectFiles(files) {
return new Promise((resolve) => {
resolve(Array.prototype.slice.call(files));
});
}
onClick() {
this._dealFiles(this.selectFiles.triggerSelectFiles(this.fileOptions, this.uploadOptions));
}
_dealFiles(observale) {
super.resetSameNameFiles();
observale.pipe(map(file => {
let uploadOptions = this.uploadOptions;
if (this.dynamicUploadOptionsFn) {
uploadOptions = this.dynamicUploadOptionsFn(file, this.uploadOptions);
}
super.addFile(file, uploadOptions);
}), debounceTime(100))
.subscribe(() => {
this.checkValid();
this.checkSameName();
const selectedFiles = this.fileUploaders
.filter(fileUploader => fileUploader.status === UploadStatus.preLoad)
.map(fileUploader => fileUploader.file);
this.onFileSelect(selectedFiles);
this.uploadFiles();
}, (error) => {
this.errorMsg = [{ severity: 'warn', detail: error.message }];
this.alertMsgEvent.emit(this.errorMsg);
});
}
checkSameName() {
const sameNameFiles = super.getSameNameFiles();
if (this.uploadOptions.checkSameName && sameNameFiles.length) {
this.errorMsg = [{
severity: 'warn',
detail: this.i18nText.getExistSameNameFilesMsg(sameNameFiles)
}];
this.alertMsgEvent.emit(this.errorMsg);
}
}
// 文件大小、类型是否符合上传条件
checkValid() {
let totalFileSize = 0;
this.fileUploaders.forEach(fileUploader => {
totalFileSize += fileUploader.file.size;
const checkResult = this.selectFiles._validateFiles(this.fileUploaders.length, fileUploader.file, this.fileOptions.accept, fileUploader.uploadOptions);
if (checkResult && checkResult.checkError) {
super.deleteFile(fileUploader.file);
this.errorMsg = [{ severity: 'warn', detail: checkResult.errorMsg }];
this.alertMsgEvent.emit(this.errorMsg);
return;
}
});
}
uploadFiles() {
this.canUpload().then((canUpload) => {
if (!canUpload) {
return;
}
const uploadObservable = super.upload();
uploadObservable
.pipe(last())
.subscribe((results) => {
this.successEvent.emit(results);
results.forEach((result) => {
this.uploadedFiles.push(result.file);
});
}, (error) => {
this.errorEvent.emit(error);
});
});
}
onFileSelect(files) {
this.fileSelect.emit(files);
}
onDrop(event) {
if (!this.enableDrop) {
return;
}
const transfer = this._getTransfer(event);
if (!transfer) {
return;
}
this._preventAndStop(event);
this._dealFiles(this.selectFiles.triggerDropFiles(this.fileOptions, this.uploadOptions, transfer.files));
this.fileDrop.emit(transfer.files);
}
onDragOver(event) {
if (!this.enableDrop) {
return;
}
const transfer = this._getTransfer(event);
if (!this._haveFiles(transfer.types)) {
return;
}
this._preventAndStop(event);
this.fileOver.emit(true);
}
onDragLeave(event) {
if (!this.enableDrop) {
return;
}
if (this.element) {
if (event.currentTarget === this.element[0]) {
return;
}
}
this._preventAndStop(event);
this.fileOver.emit(false);
}
_getTransfer(event) {
return event.dataTransfer ? event.dataTransfer : event.originalEvent.dataTransfer;
}
_preventAndStop(event) {
event.preventDefault();
event.stopPropagation();
}
_haveFiles(types) {
if (!types) {
return false;
}
if (types.indexOf) {
return types.indexOf('Files') !== -1;
}
else if (types.contains) {
return types.contains('Files');
}
else {
return false;
}
}
canUpload() {
let uploadResult = Promise.resolve(true);
if (this.beforeUpload) {
const result = this.beforeUpload(this.fileUploaders);
if (typeof result !== 'undefined') {
if (result.then) {
uploadResult = result;
}
else if (result.subscribe) {
uploadResult = result.toPromise();
}
else {
uploadResult = Promise.resolve(result);
}
}
}
return uploadResult;
}
ngOnDestroy() {
if (this.i18nSubscription) {
this.i18nSubscription.unsubscribe();
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UploadDirective, deps: [{ token: i1.SelectFiles }, { token: i2.I18nService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: UploadDirective, selector: "[dUpload]", inputs: { uploadOptions: "uploadOptions", fileOptions: "fileOptions", uploadedFiles: "uploadedFiles", fileUploaders: "fileUploaders", enableDrop: "enableDrop", dynamicUploadOptionsFn: "dynamicUploadOptionsFn", beforeUpload: "beforeUpload" }, outputs: { fileOver: "fileOver", fileDrop: "fileDrop", successEvent: "successEvent", errorEvent: "errorEvent", alertMsgEvent: "alertMsgEvent", fileSelect: "fileSelect" }, host: { listeners: { "click": "onClick()", "drop": "onDrop($event)", "dragover": "onDragOver($event)", "dragleave": "onDragLeave($event)" } }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => UploadDirective),
multi: true
}
], exportAs: ["dUpload"], usesInheritance: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UploadDirective, decorators: [{
type: Directive,
args: [{
selector: '[dUpload]',
exportAs: 'dUpload',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => UploadDirective),
multi: true
}
],
}]
}], ctorParameters: () => [{ type: i1.SelectFiles }, { type: i2.I18nService }, { type: i0.ElementRef }], propDecorators: { uploadOptions: [{
type: Input
}], fileOptions: [{
type: Input
}], uploadedFiles: [{
type: Input
}], fileUploaders: [{
type: Input
}], enableDrop: [{
type: Input
}], dynamicUploadOptionsFn: [{
type: Input
}], beforeUpload: [{
type: Input
}], fileOver: [{
type: Output
}], fileDrop: [{
type: Output
}], successEvent: [{
type: Output
}], errorEvent: [{
type: Output
}], alertMsgEvent: [{
type: Output
}], fileSelect: [{
type: Output
}], onClick: [{
type: HostListener,
args: ['click']
}], onDrop: [{
type: HostListener,
args: ['drop', ['$event']]
}], onDragOver: [{
type: HostListener,
args: ['dragover', ['$event']]
}], onDragLeave: [{
type: HostListener,
args: ['dragleave', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RldnVpL3VwbG9hZC91cGxvYWQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFpQixXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFFLElBQUksRUFBNEIsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25GLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFZakQsTUFBTSxPQUFPLGVBQWdCLFNBQVEsZUFBZTtJQXFCbEQsWUFBb0IsV0FBd0IsRUFBVSxJQUFpQixFQUFFLE9BQW1CO1FBQzFGLEtBQUssRUFBRSxDQUFDO1FBRFUsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFhO1FBbEI5RCxrQkFBYSxHQUFrQixFQUFFLENBQUM7UUFDbEMsa0JBQWEsR0FBd0IsRUFBRSxDQUFDO1FBQ3hDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFHWCxhQUFRLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFDOUQsYUFBUSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzdELGlC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SyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ0Y7bUlBRVUsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNXLFFBQVE7c0JBQXhCLE1BQU07Z0JBQ1UsUUFBUTtzQkFBeEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQXNDUCxPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTztnQkF3RmQsTUFBTTtzQkFEWixZQUFZO3VCQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFlekIsVUFBVTtzQkFEaEIsWUFBWTt1QkFBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBZTdCLFdBQVc7c0JBRGpCLFlBQVk7dUJBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEkxOG5JbnRlcmZhY2UsIEkxOG5TZXJ2aWNlIH0gZnJvbSAnbmctZGV2dWkvaTE4bic7XG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnbmctZGV2dWkvdG9hc3QnO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGxhc3QsIG1hcCwgbWVyZ2VNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGaWxlVXBsb2FkZXIgfSBmcm9tICcuL2ZpbGUtdXBsb2FkZXIuY2xhc3MnO1xuaW1wb3J0IHsgSUZpbGVPcHRpb25zLCBJVXBsb2FkT3B0aW9ucywgVXBsb2FkU3RhdHVzIH0gZnJvbSAnLi9maWxlLXVwbG9hZGVyLnR5cGVzJztcbmltcG9ydCB7IFNlbGVjdEZpbGVzIH0gZnJvbSAnLi9zZWxlY3QtZmlsZXMudXRpbHMnO1xuaW1wb3J0IHsgVXBsb2FkQ29tcG9uZW50IH0gZnJvbSAnLi91cGxvYWQuY2xhc3MnO1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2RVcGxvYWRdJyxcbiAgZXhwb3J0QXM6ICdkVXBsb2FkJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBVcGxvYWREaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFVwbG9hZERpcmVjdGl2ZSBleHRlbmRzIFVwbG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHVwbG9hZE9wdGlvbnM6IElVcGxvYWRPcHRpb25zO1xuICBASW5wdXQoKSBmaWxlT3B0aW9uczogSUZpbGVPcHRpb25zO1xuICBASW5wdXQoKSB1cGxvYWRlZEZpbGVzOiBBcnJheTxPYmplY3Q+ID0gW107XG4gIEBJbnB1dCgpIGZpbGVVcGxvYWRlcnM6IEFycmF5PEZpbGVVcGxvYWRlcj4gPSBbXTtcbiAgQElucHV0KCkgZW5hYmxlRHJvcCA9IGZhbHNlO1xuICBASW5wdXQoKSBkeW5hbWljVXBsb2FkT3B0aW9uc0ZuOiAoZmlsZXMsIHVwbG9hZE9wdGlvbnMpID0+IElVcGxvYWRPcHRpb25zO1xuICBASW5wdXQoKSBiZWZvcmVVcGxvYWQ6IChmaWxlKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiB8IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIEBPdXRwdXQoKSBwdWJsaWMgZmlsZU92ZXI6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBmaWxlRHJvcDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHN1Y2Nlc3NFdmVudDogRXZlbnRFbWl0dGVyPEFycmF5PHsgZmlsZTogRmlsZTsgcmVzcG9uc2U6IGFueSB9Pj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PHsgZmlsZTogRmlsZTsgcmVzcG9uc2U6IGFueSB9Pj4oKTtcbiAgQE91dHB1dCgpIGVycm9yRXZlbnQ6IEV2ZW50RW1pdHRlcjx7IGZpbGU6IEZpbGU7IHJlc3BvbnNlOiBhbnkgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgZmlsZTogRmlsZTsgcmVzcG9uc2U6IGFueSB9PigpO1xuICBAT3V0cHV0KCkgYWxlcnRNc2dFdmVudDogRXZlbnRFbWl0dGVyPE1lc3NhZ2VbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPE1lc3NhZ2VbXT4oKTtcbiAgQE91dHB1dCgpIGZpbGVTZWxlY3Q6IEV2ZW50RW1pdHRlcjxGaWxlW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlW10+KCk7XG5cbiAgZXJyb3JNc2cgPSBbXTtcbiAgcHJvdGVjdGVkIGVsZW1lbnQ6IEVsZW1lbnRSZWY7XG4gIGkxOG5UZXh0OiBJMThuSW50ZXJmYWNlWyd1cGxvYWQnXTtcbiAgaTE4blN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIG9uQ2hhbmdlID0gKF86IGFueSkgPT4gbnVsbDtcbiAgcHJpdmF0ZSBvblRvdWNoZWQgPSAoKSA9PiBudWxsO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNlbGVjdEZpbGVzOiBTZWxlY3RGaWxlcywgcHJpdmF0ZSBpMThuOiBJMThuU2VydmljZSwgZWxlbWVudDogRWxlbWVudFJlZikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLmkxOG5UZXh0ID0gdGhpcy5pMThuLmdldEkxOG5UZXh0KCkudXBsb2FkO1xuICAgIHRoaXMuaTE4blN1YnNjcmlwdGlvbiA9IHRoaXMuaTE4bi5sYW5nQ2hhbmdlKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLmkxOG5UZXh0ID0gZGF0YS51cGxvYWQ7XG4gICAgfSk7XG4gIH1cbiAgd3JpdGVWYWx1ZShmaWxlczogYW55KTogdm9pZCB7XG4gICAgaWYgKGZpbGVzKSB7XG4gICAgICBjb25zdCBzaW11bGF0ZUZpbGVzID0gZnJvbSh0aGlzLnNpbXVsYXRlU2VsZWN0RmlsZXMoZmlsZXMpKS5waXBlKG1lcmdlTWFwKGZpbGUgPT4gPGFueT5maWxlKSk7XG4gICAgICB0aGlzLl9kZWFsRmlsZXMoc2ltdWxhdGVGaWxlcyk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzaW11bGF0ZVNlbGVjdEZpbGVzKGZpbGVzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICByZXNvbHZlKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZpbGVzKSk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycpXG4gIG9uQ2xpY2soKSB7XG4gICAgdGhpcy5fZGVhbEZpbGVzKHRoaXMuc2VsZWN0RmlsZXMudHJpZ2dlclNlbGVjdEZpbGVzKHRoaXMuZmlsZU9wdGlvbnMsIHRoaXMudXBsb2FkT3B0aW9ucykpO1xuICB9XG5cbiAgX2RlYWxGaWxlcyhvYnNlcnZhbGUpIHtcbiAgICBzdXBlci5yZXNldFNhbWVOYW1lRmlsZXMoKTtcbiAgICBvYnNlcnZhbGUucGlwZShcbiAgICAgIG1hcChmaWxlID0+IHtcbiAgICAgICAgbGV0IHVwbG9hZE9wdGlvbnMgPSB0aGlzLnVwbG9hZE9wdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLmR5bmFtaWNVcGxvYWRPcHRpb25zRm4pIHtcbiAgICAgICAgICB1cGxvYWRPcHRpb25zID0gdGhpcy5keW5hbWljVXBsb2FkT3B0aW9uc0ZuKGZpbGUsIHRoaXMudXBsb2FkT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuYWRkRmlsZShmaWxlLCB1cGxvYWRPcHRpb25zKTtcbiAgICAgIH0pLFxuICAgICAgZGVib3VuY2VUaW1lKDEwMClcbiAgICApXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jaGVja1ZhbGlkKCk7XG4gICAgICAgICAgdGhpcy5jaGVja1NhbWVOYW1lKCk7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRGaWxlcyA9IHRoaXMuZmlsZVVwbG9hZGVyc1xuICAgICAgICAgICAgLmZpbHRlcihmaWxlVXBsb2FkZXIgPT4gZmlsZVVwbG9hZGVyLnN0YXR1cyA9PT0gVXBsb2FkU3RhdHVzLnByZUxvYWQpXG4gICAgICAgICAgICAubWFwKGZpbGVVcGxvYWRlciA9PiBmaWxlVXBsb2FkZXIuZmlsZSk7XG4gICAgICAgICAgdGhpcy5vbkZpbGVTZWxlY3Qoc2VsZWN0ZWRGaWxlcyk7XG4gICAgICAgICAgdGhpcy51cGxvYWRGaWxlcygpO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvck1zZyA9IFt7IHNldmVyaXR5OiAnd2FybicsIGRldGFpbDogZXJyb3IubWVzc2FnZSB9XTtcbiAgICAgICAgICB0aGlzLmFsZXJ0TXNnRXZlbnQuZW1pdCh0aGlzLmVycm9yTXNnKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIGNoZWNrU2FtZU5hbWUoKSB7XG4gICAgY29uc3Qgc2FtZU5hbWVGaWxlcyA9IHN1cGVyLmdldFNhbWVOYW1lRmlsZXMoKTtcbiAgICBpZiAodGhpcy51cGxvYWRPcHRpb25zLmNoZWNrU2FtZU5hbWUgJiYgc2FtZU5hbWVGaWxlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZXJyb3JNc2cgPSBbe1xuICAgICAgICBzZXZlcml0eTogJ3dhcm4nLFxuICAgICAgICBkZXRhaWw6IHRoaXMuaTE4blRleHQuZ2V0RXhpc3RTYW1lTmFtZUZpbGVzTXNnKHNhbWVOYW1lRmlsZXMpXG4gICAgICB9XTtcbiAgICAgIHRoaXMuYWxlcnRNc2dFdmVudC5lbWl0KHRoaXMuZXJyb3JNc2cpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOaWh+S7tuWkp+Wwj+OAgeexu+Wei+aYr+WQpuespuWQiOS4iuS8oOadoeS7tlxuICBjaGVja1ZhbGlkKCkge1xuICAgIGxldCB0b3RhbEZpbGVTaXplID0gMDtcbiAgICB0aGlzLmZpbGVVcGxvYWRlcnMuZm9yRWFjaChmaWxlVXBsb2FkZXIgPT4ge1xuICAgICAgdG90YWxGaWxlU2l6ZSArPSBmaWxlVXBsb2FkZXIuZmlsZS5zaXplO1xuICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSAgdGhpcy5zZWxlY3RGaWxlcy5fdmFsaWRhdGVGaWxlcyh0aGlzLmZpbGVVcGxvYWRlcnMubGVuZ3RoLGZpbGVVcGxvYWRlci5maWxlLCB0aGlzLmZpbGVPcHRpb25zLmFjY2VwdCwgZmlsZVVwbG9hZGVyLnVwbG9hZE9wdGlvbnMpO1xuICAgICAgaWYgKGNoZWNrUmVzdWx0ICYmIGNoZWNrUmVzdWx0LmNoZWNrRXJyb3IpIHtcbiAgICAgICAgc3VwZXIuZGVsZXRlRmlsZShmaWxlVXBsb2FkZXIuZmlsZSk7XG4gICAgICAgIHRoaXMuZXJyb3JNc2cgPSBbeyBzZXZlcml0eTogJ3dhcm4nLCBkZXRhaWw6IGNoZWNrUmVzdWx0LmVycm9yTXNnIH1dO1xuICAgICAgICB0aGlzLmFsZXJ0TXNnRXZlbnQuZW1pdCh0aGlzLmVycm9yTXNnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHVwbG9hZEZpbGVzKCkge1xuICAgIHRoaXMuY2FuVXBsb2FkKCkudGhlbigoY2FuVXBsb2FkKSA9PiB7XG4gICAgICBpZiAoIWNhblVwbG9hZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cGxvYWRPYnNlcnZhYmxlID0gc3VwZXIudXBsb2FkKCk7XG4gICAgICB1cGxvYWRPYnNlcnZhYmxlXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGxhc3QoKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgKHJlc3VsdHM6IEFycmF5PHsgZmlsZTogRmlsZTsgcmVzcG9uc2U6IGFueSB9PikgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdWNjZXNzRXZlbnQuZW1pdChyZXN1bHRzKTtcbiAgICAgICAgICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlcy5wdXNoKHJlc3VsdC5maWxlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVycm9yRXZlbnQuZW1pdChlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgb25GaWxlU2VsZWN0KGZpbGVzKSB7XG4gICAgdGhpcy5maWxlU2VsZWN0LmVtaXQoZmlsZXMpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZHJvcCcsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbkRyb3AoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbmFibGVEcm9wKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zZmVyID0gdGhpcy5fZ2V0VHJhbnNmZXIoZXZlbnQpO1xuICAgIGlmICghdHJhbnNmZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcHJldmVudEFuZFN0b3AoZXZlbnQpO1xuICAgIHRoaXMuX2RlYWxGaWxlcyh0aGlzLnNlbGVjdEZpbGVzLnRyaWdnZXJEcm9wRmlsZXModGhpcy5maWxlT3B0aW9ucywgdGhpcy51cGxvYWRPcHRpb25zLCB0cmFuc2Zlci5maWxlcykpO1xuICAgIHRoaXMuZmlsZURyb3AuZW1pdCh0cmFuc2Zlci5maWxlcyk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkcmFnb3ZlcicsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbkRyYWdPdmVyKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlRHJvcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0cmFuc2ZlciA9IHRoaXMuX2dldFRyYW5zZmVyKGV2ZW50KTtcbiAgICBpZiAoIXRoaXMuX2hhdmVGaWxlcyh0cmFuc2Zlci50eXBlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wcmV2ZW50QW5kU3RvcChldmVudCk7XG4gICAgdGhpcy5maWxlT3Zlci5lbWl0KHRydWUpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZHJhZ2xlYXZlJywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uRHJhZ0xlYXZlKGV2ZW50OiBhbnkpOiBhbnkge1xuICAgIGlmICghdGhpcy5lbmFibGVEcm9wKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgodGhpcyBhcyBhbnkpLmVsZW1lbnQpIHtcbiAgICAgIGlmIChldmVudC5jdXJyZW50VGFyZ2V0ID09PSAodGhpcyBhcyBhbnkpLmVsZW1lbnRbMF0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3ByZXZlbnRBbmRTdG9wKGV2ZW50KTtcbiAgICB0aGlzLmZpbGVPdmVyLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9nZXRUcmFuc2ZlcihldmVudDogYW55KTogYW55IHtcbiAgICByZXR1cm4gZXZlbnQuZGF0YVRyYW5zZmVyID8gZXZlbnQuZGF0YVRyYW5zZmVyIDogZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3ByZXZlbnRBbmRTdG9wKGV2ZW50OiBhbnkpOiBhbnkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2hhdmVGaWxlcyh0eXBlczogYW55KTogYW55IHtcbiAgICBpZiAoIXR5cGVzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVzLmluZGV4T2YpIHtcbiAgICAgIHJldHVybiB0eXBlcy5pbmRleE9mKCdGaWxlcycpICE9PSAtMTtcbiAgICB9IGVsc2UgaWYgKHR5cGVzLmNvbnRhaW5zKSB7XG4gICAgICByZXR1cm4gdHlwZXMuY29udGFpbnMoJ0ZpbGVzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBjYW5VcGxvYWQoKSB7XG4gICAgbGV0IHVwbG9hZFJlc3VsdCA9IFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgICBpZiAodGhpcy5iZWZvcmVVcGxvYWQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0gdGhpcy5iZWZvcmVVcGxvYWQodGhpcy5maWxlVXBsb2FkZXJzKTtcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAocmVzdWx0LnRoZW4pIHtcbiAgICAgICAgICB1cGxvYWRSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnN1YnNjcmliZSkge1xuICAgICAgICAgIHVwbG9hZFJlc3VsdCA9IChyZXN1bHQgYXMgT2JzZXJ2YWJsZTxib29sZWFuPikudG9Qcm9taXNlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXBsb2FkUmVzdWx0ID0gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVwbG9hZFJlc3VsdDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmkxOG5TdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuaTE4blN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxufVxuIl19