fundamental-ngx
Version:
SAP Fiori Fundamentals, implemented in Angular
280 lines • 17.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
/**
* Tool to facilitate the input of files from the user.
* It supports drag and drop, multiple input, max file size and more.
* The drag events make it very easy to create and style elements like a dropzone.
*/
var FileInputComponent = /** @class */ (function () {
function FileInputComponent() {
/**
* \@Input Whether the file input is disabled.
*/
this.disabled = false;
/**
* \@Input Whether the file input should accept multiple files.
*/
this.multiple = true;
/**
* \@Input Whether the file input accepts drag and dropped files.
*/
this.dragndrop = true;
/**
* \@Output Event fired when files are selected. Passed object is the array of files selected.
*/
this.onSelect = new EventEmitter();
/**
* \@Output Event fired when some invalid files are selected. Passed object is the array of invalid files.
*/
this.onInvalidFiles = new EventEmitter();
/**
* \@Output Event fired when the dragged file enters the component boundaries.
*/
this.onDragEnter = new EventEmitter();
/**
* \@Output Event fired when the dragged file exits the component boundaries.
*/
this.onDragLeave = new EventEmitter();
/**
* @hidden
*/
this.onChange = (/**
* @return {?}
*/
function () { });
/**
* @hidden
*/
this.onTouched = (/**
* @return {?}
*/
function () { });
}
/** @hidden */
/**
* @hidden
* @param {?} fn
* @return {?}
*/
FileInputComponent.prototype.registerOnChange = /**
* @hidden
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/** @hidden */
/**
* @hidden
* @param {?} fn
* @return {?}
*/
FileInputComponent.prototype.registerOnTouched = /**
* @hidden
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/** @hidden */
/**
* @hidden
* @param {?} isDisabled
* @return {?}
*/
FileInputComponent.prototype.setDisabledState = /**
* @hidden
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
this.disabled = isDisabled;
};
/** @hidden */
/**
* @hidden
* @param {?} files
* @return {?}
*/
FileInputComponent.prototype.writeValue = /**
* @hidden
* @param {?} files
* @return {?}
*/
function (files) {
// not needed - should be handled by user.
};
/** @hidden */
/**
* @hidden
* @param {?} event
* @return {?}
*/
FileInputComponent.prototype.selectHandler = /**
* @hidden
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
if (this.maxFileSize) {
/** @type {?} */
var valid_files_1 = [];
/** @type {?} */
var invalid_files_1 = [];
event.forEach((/**
* @param {?} file
* @return {?}
*/
function (file) {
if (file.size < _this.maxFileSize) {
valid_files_1.push(file);
}
else {
invalid_files_1.push(file);
}
}));
if (valid_files_1.length > 0) {
this.onChange(valid_files_1);
this.onSelect.emit(valid_files_1);
}
if (invalid_files_1.length > 0) {
this.onInvalidFiles.emit(invalid_files_1);
}
}
else {
this.onChange(event);
this.onSelect.emit(event);
}
};
/**
* Opens the file selector.
*/
/**
* Opens the file selector.
* @return {?}
*/
FileInputComponent.prototype.open = /**
* Opens the file selector.
* @return {?}
*/
function () {
this.inputRef.nativeElement.click();
};
/**
* Clears the files from the input.
*/
/**
* Clears the files from the input.
* @return {?}
*/
FileInputComponent.prototype.clear = /**
* Clears the files from the input.
* @return {?}
*/
function () {
this.inputRef.nativeElement.value = '';
this.onChange([]);
};
FileInputComponent.decorators = [
{ type: Component, args: [{
selector: 'fd-file-input',
template: "<div style=\"display: block\"\n fdFileDragnDrop\n [accept]=\"accept\"\n [dragndrop]=\"dragndrop\"\n [disabled]=\"disabled\"\n [multiple]=\"multiple\"\n (onFileChange)=\"selectHandler($event)\"\n (onInvalidFiles)=\"onInvalidFiles.emit($event)\"\n (onDragEnter)=\"onDragEnter.emit()\"\n (onDragLeave)=\"onDragLeave.emit()\">\n <ng-content></ng-content>\n</div>\n<input #input\n class=\"hidden-file-input\"\n type=\"file\"\n [attr.accept]=\"accept\"\n (onFileSelect)=\"selectHandler($event)\"\n [multiple]=\"multiple\"\n [disabled]=\"disabled\"\n fdFileSelect>\n\n",
host: {
'(blur)': 'onTouched()'
},
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return FileInputComponent; })),
multi: true,
}],
styles: [":host{display:inline-block}input.hidden-file-input{display:none}"]
}] }
];
FileInputComponent.propDecorators = {
inputRef: [{ type: ViewChild, args: ['input',] }],
disabled: [{ type: Input }],
multiple: [{ type: Input }],
accept: [{ type: Input }],
dragndrop: [{ type: Input }],
maxFileSize: [{ type: Input }],
onSelect: [{ type: Output }],
onInvalidFiles: [{ type: Output }],
onDragEnter: [{ type: Output }],
onDragLeave: [{ type: Output }]
};
return FileInputComponent;
}());
export { FileInputComponent };
if (false) {
/**
* @hidden
* @type {?}
*/
FileInputComponent.prototype.inputRef;
/**
* \@Input Whether the file input is disabled.
* @type {?}
*/
FileInputComponent.prototype.disabled;
/**
* \@Input Whether the file input should accept multiple files.
* @type {?}
*/
FileInputComponent.prototype.multiple;
/**
* \@Input Accepted file extensions. Format: `'.png,.jpg'`.
* @type {?}
*/
FileInputComponent.prototype.accept;
/**
* \@Input Whether the file input accepts drag and dropped files.
* @type {?}
*/
FileInputComponent.prototype.dragndrop;
/**
* \@Input Max file size in bytes that the input will accept.
* @type {?}
*/
FileInputComponent.prototype.maxFileSize;
/**
* \@Output Event fired when files are selected. Passed object is the array of files selected.
* @type {?}
*/
FileInputComponent.prototype.onSelect;
/**
* \@Output Event fired when some invalid files are selected. Passed object is the array of invalid files.
* @type {?}
*/
FileInputComponent.prototype.onInvalidFiles;
/**
* \@Output Event fired when the dragged file enters the component boundaries.
* @type {?}
*/
FileInputComponent.prototype.onDragEnter;
/**
* \@Output Event fired when the dragged file exits the component boundaries.
* @type {?}
*/
FileInputComponent.prototype.onDragLeave;
/**
* @hidden
* @type {?}
*/
FileInputComponent.prototype.onChange;
/**
* @hidden
* @type {?}
*/
FileInputComponent.prototype.onTouched;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mdW5kYW1lbnRhbC1uZ3gvIiwic291cmNlcyI6WyJsaWIvZmlsZS1pbnB1dC9maWxlLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7OztBQU96RTtJQUFBOzs7O1FBcUJJLGFBQVEsR0FBWSxLQUFLLENBQUM7Ozs7UUFJMUIsYUFBUSxHQUFZLElBQUksQ0FBQzs7OztRQVF6QixjQUFTLEdBQVksSUFBSSxDQUFDOzs7O1FBUTFCLGFBQVEsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQzs7OztRQUk1RCxtQkFBYyxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDOzs7O1FBSWxFLGdCQUFXLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7Ozs7UUFJM0QsZ0JBQVcsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQzs7OztRQUczRCxhQUFROzs7UUFBYSxjQUFPLENBQUMsRUFBQzs7OztRQUc5QixjQUFTOzs7UUFBYSxjQUFPLENBQUMsRUFBQztJQThEbkMsQ0FBQztJQTVERyxjQUFjOzs7Ozs7SUFDZCw2Q0FBZ0I7Ozs7O0lBQWhCLFVBQWlCLEVBQU87UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELGNBQWM7Ozs7OztJQUNkLDhDQUFpQjs7Ozs7SUFBakIsVUFBa0IsRUFBTztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsY0FBYzs7Ozs7O0lBQ2QsNkNBQWdCOzs7OztJQUFoQixVQUFpQixVQUFtQjtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQsY0FBYzs7Ozs7O0lBQ2QsdUNBQVU7Ozs7O0lBQVYsVUFBVyxLQUFhO1FBQ3BCLDBDQUEwQztJQUM5QyxDQUFDO0lBRUQsY0FBYzs7Ozs7O0lBQ2QsMENBQWE7Ozs7O0lBQWIsVUFBYyxLQUFhO1FBQTNCLGlCQXNCQztRQXJCRyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7O2dCQUNaLGFBQVcsR0FBVyxFQUFFOztnQkFDeEIsZUFBYSxHQUFXLEVBQUU7WUFDaEMsS0FBSyxDQUFDLE9BQU87Ozs7WUFBQyxVQUFBLElBQUk7Z0JBQ2QsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQzlCLGFBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzFCO3FCQUFNO29CQUNILGVBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzVCO1lBQ0wsQ0FBQyxFQUFDLENBQUM7WUFDSCxJQUFJLGFBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQVcsQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFXLENBQUMsQ0FBQzthQUNuQztZQUNELElBQUksZUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWEsQ0FBQyxDQUFDO2FBQzNDO1NBQ0o7YUFBTTtZQUNILElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0lBRUQ7O09BRUc7Ozs7O0lBQ0ksaUNBQUk7Ozs7SUFBWDtRQUNJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRzs7Ozs7SUFDSSxrQ0FBSzs7OztJQUFaO1FBQ0ksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7O2dCQXZISixTQUFTLFNBQUM7b0JBQ1AsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLDhvQkFBMEM7b0JBRTFDLElBQUksRUFBRTt3QkFDRixRQUFRLEVBQUUsYUFBYTtxQkFDMUI7b0JBQ0QsU0FBUyxFQUFFLENBQUM7NEJBQ1IsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVU7Ozs0QkFBQyxjQUFNLE9BQUEsa0JBQWtCLEVBQWxCLENBQWtCLEVBQUM7NEJBQ2pELEtBQUssRUFBRSxJQUFJO3lCQUNkLENBQUM7O2lCQUNMOzs7MkJBSUksU0FBUyxTQUFDLE9BQU87MkJBSWpCLEtBQUs7MkJBSUwsS0FBSzt5QkFJTCxLQUFLOzRCQUlMLEtBQUs7OEJBSUwsS0FBSzsyQkFJTCxNQUFNO2lDQUlOLE1BQU07OEJBSU4sTUFBTTs4QkFJTixNQUFNOztJQXFFWCx5QkFBQztDQUFBLEFBekhELElBeUhDO1NBNUdZLGtCQUFrQjs7Ozs7O0lBRzNCLHNDQUNxQjs7Ozs7SUFHckIsc0NBQzBCOzs7OztJQUcxQixzQ0FDeUI7Ozs7O0lBR3pCLG9DQUNlOzs7OztJQUdmLHVDQUMwQjs7Ozs7SUFHMUIseUNBQ29COzs7OztJQUdwQixzQ0FDNEQ7Ozs7O0lBRzVELDRDQUNrRTs7Ozs7SUFHbEUseUNBQzJEOzs7OztJQUczRCx5Q0FDMkQ7Ozs7O0lBRzNELHNDQUE4Qjs7Ozs7SUFHOUIsdUNBQStCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG4vKipcbiAqIFRvb2wgdG8gZmFjaWxpdGF0ZSB0aGUgaW5wdXQgb2YgZmlsZXMgZnJvbSB0aGUgdXNlci5cbiAqIEl0IHN1cHBvcnRzIGRyYWcgYW5kIGRyb3AsIG11bHRpcGxlIGlucHV0LCBtYXggZmlsZSBzaXplIGFuZCBtb3JlLlxuICogVGhlIGRyYWcgZXZlbnRzIG1ha2UgaXQgdmVyeSBlYXN5IHRvIGNyZWF0ZSBhbmQgc3R5bGUgZWxlbWVudHMgbGlrZSBhIGRyb3B6b25lLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkLWZpbGUtaW5wdXQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9maWxlLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9maWxlLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaG9zdDoge1xuICAgICAgICAnKGJsdXIpJzogJ29uVG91Y2hlZCgpJ1xuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBbe1xuICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRmlsZUlucHV0Q29tcG9uZW50KSxcbiAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgfV0sXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnKVxuICAgIGlucHV0UmVmOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqIEBJbnB1dCBXaGV0aGVyIHRoZSBmaWxlIGlucHV0IGlzIGRpc2FibGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBASW5wdXQgV2hldGhlciB0aGUgZmlsZSBpbnB1dCBzaG91bGQgYWNjZXB0IG11bHRpcGxlIGZpbGVzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbXVsdGlwbGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIEBJbnB1dCBBY2NlcHRlZCBmaWxlIGV4dGVuc2lvbnMuIEZvcm1hdDogYCcucG5nLC5qcGcnYC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGFjY2VwdDogc3RyaW5nO1xuXG4gICAgLyoqIEBJbnB1dCBXaGV0aGVyIHRoZSBmaWxlIGlucHV0IGFjY2VwdHMgZHJhZyBhbmQgZHJvcHBlZCBmaWxlcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGRyYWduZHJvcDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogQElucHV0IE1heCBmaWxlIHNpemUgaW4gYnl0ZXMgdGhhdCB0aGUgaW5wdXQgd2lsbCBhY2NlcHQuICovXG4gICAgQElucHV0KClcbiAgICBtYXhGaWxlU2l6ZTogbnVtYmVyO1xuXG4gICAgLyoqIEBPdXRwdXQgRXZlbnQgZmlyZWQgd2hlbiBmaWxlcyBhcmUgc2VsZWN0ZWQuIFBhc3NlZCBvYmplY3QgaXMgdGhlIGFycmF5IG9mIGZpbGVzIHNlbGVjdGVkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIG9uU2VsZWN0OiBFdmVudEVtaXR0ZXI8RmlsZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVtdPigpO1xuXG4gICAgLyoqIEBPdXRwdXQgRXZlbnQgZmlyZWQgd2hlbiBzb21lIGludmFsaWQgZmlsZXMgYXJlIHNlbGVjdGVkLiBQYXNzZWQgb2JqZWN0IGlzIHRoZSBhcnJheSBvZiBpbnZhbGlkIGZpbGVzLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIG9uSW52YWxpZEZpbGVzOiBFdmVudEVtaXR0ZXI8RmlsZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVtdPigpO1xuXG4gICAgLyoqIEBPdXRwdXQgRXZlbnQgZmlyZWQgd2hlbiB0aGUgZHJhZ2dlZCBmaWxlIGVudGVycyB0aGUgY29tcG9uZW50IGJvdW5kYXJpZXMuICovXG4gICAgQE91dHB1dCgpXG4gICAgb25EcmFnRW50ZXI6IEV2ZW50RW1pdHRlcjxudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcblxuICAgIC8qKiBAT3V0cHV0IEV2ZW50IGZpcmVkIHdoZW4gdGhlIGRyYWdnZWQgZmlsZSBleGl0cyB0aGUgY29tcG9uZW50IGJvdW5kYXJpZXMuICovXG4gICAgQE91dHB1dCgpXG4gICAgb25EcmFnTGVhdmU6IEV2ZW50RW1pdHRlcjxudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25DaGFuZ2U6IEZ1bmN0aW9uID0gKCkgPT4ge307XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uVG91Y2hlZDogRnVuY3Rpb24gPSAoKSA9PiB7fTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHdyaXRlVmFsdWUoZmlsZXM6IEZpbGVbXSk6IHZvaWQge1xuICAgICAgICAvLyBub3QgbmVlZGVkIC0gc2hvdWxkIGJlIGhhbmRsZWQgYnkgdXNlci5cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHNlbGVjdEhhbmRsZXIoZXZlbnQ6IEZpbGVbXSkge1xuICAgICAgICBpZiAodGhpcy5tYXhGaWxlU2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRfZmlsZXM6IEZpbGVbXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgaW52YWxpZF9maWxlczogRmlsZVtdID0gW107XG4gICAgICAgICAgICBldmVudC5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWxlLnNpemUgPCB0aGlzLm1heEZpbGVTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkX2ZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW52YWxpZF9maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHZhbGlkX2ZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHZhbGlkX2ZpbGVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0LmVtaXQodmFsaWRfZmlsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGludmFsaWRfZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMub25JbnZhbGlkRmlsZXMuZW1pdChpbnZhbGlkX2ZpbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy5vblNlbGVjdC5lbWl0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSBmaWxlIHNlbGVjdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0UmVmLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGZpbGVzIGZyb20gdGhlIGlucHV0LlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoW10pO1xuICAgIH1cblxufVxuIl19