@asi-ngtools/lib
Version:
This project is a little components library, simple to use, which will help you to simplify your project.
333 lines (332 loc) • 22.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { DefaultControlValueAccessor } from './../common/default-control-value-accessor';
import { Component, Input, EventEmitter, Output, forwardRef, ViewChild, ElementRef, Renderer2 } from '@angular/core';
import { AsiFileService } from './../../services/asi-file.service';
import * as nh from '../../native-helper';
var AsiFileChooserComponent = /** @class */ (function (_super) {
tslib_1.__extends(AsiFileChooserComponent, _super);
function AsiFileChooserComponent(fileService, renderer, elementRef) {
var _this = _super.call(this) || this;
_this.fileService = fileService;
_this.renderer = renderer;
_this.elementRef = elementRef;
/**
* Label position
*/
_this.labelPosition = 'top';
/**
* Preload filechooser with an url
*/
_this.fileSrc = null;
/**
* Allow you to force the name of the file
*/
_this.fileName = null;
/**
* By default we dont block the file is the user select a wrong type
*/
_this.blockImport = false;
/**
* Icon to display
*/
_this.icon = 'fa fa-paperclip';
/**
* Event emitted when an error occured with the selected file
*/
_this.onError = new EventEmitter();
_this.acceptAttribute = '';
_this.dragging = false;
_this.loaded = false;
_this.fileLoaded = false;
return _this;
}
/**
* @return {?}
*/
AsiFileChooserComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.renderer.addClass(this.elementRef.nativeElement, 'label-' + this.labelPosition);
if (this.fileSrc != null) {
this.fileService.getFileAsBlob(this.fileSrc).subscribe(function (blob) {
/** @type {?} */
var fileName = _this.fileName || _this.fileSrc.split('/').pop();
/** @type {?} */
var file = new Blob([blob], { type: blob.type });
file.name = fileName;
_this.value = file;
});
}
};
/**
* @return {?}
*/
AsiFileChooserComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
var _this = this;
if (nh.isArray(this.accept)) {
(/** @type {?} */ (this.accept)).forEach(function (accept) {
_this.acceptAttribute += accept.extension + ', ' + accept.mimeType + ',';
});
}
else if (this.accept != null) {
/** @type {?} */
var aAccept = (/** @type {?} */ (this.accept));
this.acceptAttribute = aAccept.extension + ', ' + aAccept.mimeType;
}
};
/**
* @return {?}
*/
AsiFileChooserComponent.prototype.openFileInput = /**
* @return {?}
*/
function () {
this.fileInput.nativeElement.value = null;
this.fileInput.nativeElement.click();
};
/**
* @return {?}
*/
AsiFileChooserComponent.prototype.getFileUrl = /**
* @return {?}
*/
function () {
return this.fileService.getFileUrl(this.value);
};
/**
* @return {?}
*/
AsiFileChooserComponent.prototype.clean = /**
* @return {?}
*/
function () {
this.value = null;
};
/**
* @return {?}
*/
AsiFileChooserComponent.prototype.handleDragEnter = /**
* @return {?}
*/
function () {
this.dragging = true;
};
/**
* @return {?}
*/
AsiFileChooserComponent.prototype.handleDragLeave = /**
* @return {?}
*/
function () {
this.dragging = false;
};
/**
* @param {?} e
* @return {?}
*/
AsiFileChooserComponent.prototype.handleDrop = /**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
this.dragging = false;
this.handleInputChange(e);
};
/**
* @return {?}
*/
AsiFileChooserComponent.prototype.handleFileLoad = /**
* @return {?}
*/
function () {
this.fileLoaded = true;
};
/**
* @param {?} event
* @return {?}
*/
AsiFileChooserComponent.prototype.handleInputChange = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var file = event.dataTransfer ? event.dataTransfer.files[0] : event.target.files[0];
if (this.blockImport && !this.isValideMimeType(file.type)) {
this.onError.emit({
error: 'FORMAT',
file: file
});
return;
}
this.loaded = false;
this.value = file;
};
/**
* @return {?}
*/
AsiFileChooserComponent.prototype.downloadForIE = /**
* @return {?}
*/
function () {
if (navigator.msSaveBlob) {
navigator.msSaveBlob(this.value, this.value.name);
}
};
/**
* @param {?} mimeType
* @return {?}
*/
AsiFileChooserComponent.prototype.isValideMimeType = /**
* @param {?} mimeType
* @return {?}
*/
function (mimeType) {
if (!this.accept) {
return true;
}
if (nh.isArray(this.accept)) {
/** @type {?} */
var accepts = /** @type {?} */ (this.accept);
try {
for (var accepts_1 = tslib_1.__values(accepts), accepts_1_1 = accepts_1.next(); !accepts_1_1.done; accepts_1_1 = accepts_1.next()) {
var accept = accepts_1_1.value;
if (accept.mimeType === mimeType) {
return true;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (accepts_1_1 && !accepts_1_1.done && (_a = accepts_1.return)) _a.call(accepts_1);
}
finally { if (e_1) throw e_1.error; }
}
}
else {
/** @type {?} */
var aAccept = (/** @type {?} */ (this.accept));
return aAccept.mimeType === mimeType;
}
return false;
var e_1, _a;
};
AsiFileChooserComponent.decorators = [
{ type: Component, args: [{
selector: 'asi-file-chooser',
host: { 'class': 'asi-component asi-file-chooser' },
template: "<label class=\"input-label\" *ngIf=\"label != null\">{{label | translate}}</label>\n<div class=\"asi-file-chooser-container\">\n <label ondragover=\"return false;\" [class.loaded]=\"loaded\" (dragenter)=\"handleDragEnter()\" (dragleave)=\"handleDragLeave()\"\n (drop)=\"handleDrop($event)\">\n <asi-button size=\"small\" class=\"asi-focus-error\" (click)=\"openFileInput()\">\n <asi-fa-icon [icon]=\"icon\" size=\"2x\"></asi-fa-icon>\n </asi-button>\n <input #fileInput type=\"file\" [attr.id]=\"id\" [attr.name]=\"name\" [disabled]=\"disabled\" name=\"file\" [accept]=\"acceptAttribute\" (change)=\"handleInputChange($event)\" />\n </label>\n <div class=\"file-link\" *ngIf=\"value != null\">\n <a [title]=\"value.name\" (click)=\"downloadForIE()\" [innerHTML]=\"value.name\" [download]=\"value.name\" [href]=\"getFileUrl()\" target=\"_empty\"></a>\n <asi-fa-icon (onClick)=\"clean()\" icon=\"fas fa-trash-alt\" size=\"lg\"></asi-fa-icon>\n </div>\n</div>\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return AsiFileChooserComponent; }),
multi: true
}
]
}] }
];
/** @nocollapse */
AsiFileChooserComponent.ctorParameters = function () { return [
{ type: AsiFileService },
{ type: Renderer2 },
{ type: ElementRef }
]; };
AsiFileChooserComponent.propDecorators = {
id: [{ type: Input }],
name: [{ type: Input }],
label: [{ type: Input }],
labelPosition: [{ type: Input }],
fileSrc: [{ type: Input }],
fileName: [{ type: Input }],
accept: [{ type: Input }],
blockImport: [{ type: Input }],
icon: [{ type: Input }],
onError: [{ type: Output }],
fileInput: [{ type: ViewChild, args: ['fileInput',] }]
};
return AsiFileChooserComponent;
}(DefaultControlValueAccessor));
export { AsiFileChooserComponent };
if (false) {
/**
* html id
* @type {?}
*/
AsiFileChooserComponent.prototype.id;
/**
* html name
* @type {?}
*/
AsiFileChooserComponent.prototype.name;
/**
* Label to display (is translated)
* @type {?}
*/
AsiFileChooserComponent.prototype.label;
/**
* Label position
* @type {?}
*/
AsiFileChooserComponent.prototype.labelPosition;
/**
* Preload filechooser with an url
* @type {?}
*/
AsiFileChooserComponent.prototype.fileSrc;
/**
* Allow you to force the name of the file
* @type {?}
*/
AsiFileChooserComponent.prototype.fileName;
/**
* Liste of mimetype : "application/pdf" used to display a correct selection view
* @type {?}
*/
AsiFileChooserComponent.prototype.accept;
/**
* By default we dont block the file is the user select a wrong type
* @type {?}
*/
AsiFileChooserComponent.prototype.blockImport;
/**
* Icon to display
* @type {?}
*/
AsiFileChooserComponent.prototype.icon;
/**
* Event emitted when an error occured with the selected file
* @type {?}
*/
AsiFileChooserComponent.prototype.onError;
/** @type {?} */
AsiFileChooserComponent.prototype.acceptAttribute;
/** @type {?} */
AsiFileChooserComponent.prototype.fileInput;
/** @type {?} */
AsiFileChooserComponent.prototype.dragging;
/** @type {?} */
AsiFileChooserComponent.prototype.loaded;
/** @type {?} */
AsiFileChooserComponent.prototype.fileLoaded;
/** @type {?} */
AsiFileChooserComponent.prototype.file;
/** @type {?} */
AsiFileChooserComponent.prototype.fileService;
/** @type {?} */
AsiFileChooserComponent.prototype.renderer;
/** @type {?} */
AsiFileChooserComponent.prototype.elementRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWZpbGUtY2hvb3Nlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYXNpLW5ndG9vbHMvbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYXNpLWZpbGUtY2hvb3Nlci9hc2ktZmlsZS1jaG9vc2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3pGLE9BQU8sRUFDTCxTQUFTLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUN2QyxTQUFTLEVBQVUsVUFBVSxFQUFFLFNBQVMsRUFDcEQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5FLE9BQU8sS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0lBY0csbURBQTJCO0lBa0N0RSxpQ0FBb0IsV0FBMkIsRUFDckMsVUFDQTtRQUZWLFlBR0UsaUJBQU8sU0FDUjtRQUptQixpQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFDckMsY0FBUSxHQUFSLFFBQVE7UUFDUixnQkFBVSxHQUFWLFVBQVU7Ozs7OEJBM0IyRSxLQUFLOzs7O3dCQUV6RSxJQUFJOzs7O3lCQUVILElBQUk7Ozs7NEJBSVQsS0FBSzs7OztxQkFFWixpQkFBaUI7Ozs7d0JBR2IsSUFBSSxZQUFZLEVBQU87Z0NBRXpCLEVBQUU7eUJBSVQsS0FBSzt1QkFDUCxLQUFLOzJCQUNELEtBQUs7O0tBUWpCOzs7O0lBRUQsMENBQVE7OztJQUFSO1FBQUEsaUJBVUM7UUFUQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JG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QUN4RCxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUE7U0FDckM7UUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDOzs7O2dCQTdJaEIsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRTtvQkFDbkQscStCQUFnRDtvQkFDaEQsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsY0FBTSxPQUFBLHVCQUF1QixFQUF2QixDQUF1QixDQUFDOzRCQUN0RCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpQkFDRjs7OztnQkFmUSxjQUFjO2dCQUZxQixTQUFTO2dCQUFyQixVQUFVOzs7cUJBcUJ2QyxLQUFLO3VCQUVMLEtBQUs7d0JBRUwsS0FBSztnQ0FFTCxLQUFLOzBCQUVMLEtBQUs7MkJBRUwsS0FBSzt5QkFFTCxLQUFLOzhCQUVMLEtBQUs7dUJBRUwsS0FBSzswQkFHTCxNQUFNOzRCQUlOLFNBQVMsU0FBQyxXQUFXOztrQ0FsRHhCO0VBd0I2QywyQkFBMkI7U0FBM0QsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXNpTWltZVR5cGUgfSBmcm9tICcuL2FzaS1maWxlLWNob29zZXItY29uc3RhbnRzJztcbmltcG9ydCB7IFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEZWZhdWx0Q29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICcuLy4uL2NvbW1vbi9kZWZhdWx0LWNvbnRyb2wtdmFsdWUtYWNjZXNzb3InO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBJbnB1dCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIGZvcndhcmRSZWYsXG4gIE9uQ2hhbmdlcywgVmlld0NoaWxkLCBPbkluaXQsIEVsZW1lbnRSZWYsIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFzaUZpbGVTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9hc2ktZmlsZS5zZXJ2aWNlJztcblxuaW1wb3J0ICogYXMgbmggZnJvbSAnLi4vLi4vbmF0aXZlLWhlbHBlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FzaS1maWxlLWNob29zZXInLFxuICBob3N0OiB7ICdjbGFzcyc6ICdhc2ktY29tcG9uZW50IGFzaS1maWxlLWNob29zZXInIH0sXG4gIHRlbXBsYXRlVXJsOiAnLi9hc2ktZmlsZS1jaG9vc2VyLmNvbXBvbmVudC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBc2lGaWxlQ2hvb3NlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBBc2lGaWxlQ2hvb3NlckNvbXBvbmVudCBleHRlbmRzIERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0IHtcblxuICAvKiogaHRtbCBpZCAqL1xuICBASW5wdXQoKSBpZDogc3RyaW5nO1xuICAvKiogaHRtbCBuYW1lICovXG4gIEBJbnB1dCgpIG5hbWU6IHN0cmluZztcbiAgIC8qKiBMYWJlbCB0byBkaXNwbGF5IChpcyB0cmFuc2xhdGVkKSAqL1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xuICAvKiogTGFiZWwgcG9zaXRpb24gKi9cbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogJ3RvcCcgfCAnbGVmdCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnYm90dG9tLWNlbnRlcicgfCAndG9wLWNlbnRlcicgPSAndG9wJztcbiAgLyoqIFByZWxvYWQgZmlsZWNob29zZXIgd2l0aCBhbiB1cmwgKi9cbiAgQElucHV0KCkgZmlsZVNyYzogc3RyaW5nID0gbnVsbDtcbiAgLyoqIEFsbG93IHlvdSB0byBmb3JjZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSAqL1xuICBASW5wdXQoKSBmaWxlTmFtZTogc3RyaW5nID0gbnVsbDtcbiAgLyoqIExpc3RlIG9mIG1pbWV0eXBlIDogXCJhcHBsaWNhdGlvbi9wZGZcIiB1c2VkIHRvIGRpc3BsYXkgYSBjb3JyZWN0IHNlbGVjdGlvbiB2aWV3ICovXG4gIEBJbnB1dCgpIGFjY2VwdDogQXJyYXk8QXNpTWltZVR5cGU+IHwgQXNpTWltZVR5cGU7XG4gIC8qKiBCeSBkZWZhdWx0IHdlIGRvbnQgYmxvY2sgdGhlIGZpbGUgaXMgdGhlIHVzZXIgc2VsZWN0IGEgd3JvbmcgdHlwZSAqL1xuICBASW5wdXQoKSBibG9ja0ltcG9ydCA9IGZhbHNlO1xuICAvKiogSWNvbiB0byBkaXNwbGF5ICovXG4gIEBJbnB1dCgpIGljb24gPSAnZmEgZmEtcGFwZXJjbGlwJztcblxuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIGFuIGVycm9yIG9jY3VyZWQgd2l0aCB0aGUgc2VsZWN0ZWQgZmlsZSAqL1xuICBAT3V0cHV0KCkgb25FcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGFjY2VwdEF0dHJpYnV0ZSA9ICcnO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcpIGZpbGVJbnB1dDogYW55O1xuXG4gIGRyYWdnaW5nID0gZmFsc2U7XG4gIGxvYWRlZCA9IGZhbHNlO1xuICBmaWxlTG9hZGVkID0gZmFsc2U7XG5cbiAgZmlsZTogRmlsZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZpbGVTZXJ2aWNlOiBBc2lGaWxlU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdsYWJlbC0nICsgdGhpcy5sYWJlbFBvc2l0aW9uKTtcbiAgICBpZiAodGhpcy5maWxlU3JjICE9IG51bGwpIHtcbiAgICAgIHRoaXMuZmlsZVNlcnZpY2UuZ2V0RmlsZUFzQmxvYih0aGlzLmZpbGVTcmMpLnN1YnNjcmliZShibG9iID0+IHtcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSB0aGlzLmZpbGVOYW1lIHx8IHRoaXMuZmlsZVNyYy5zcGxpdCgnLycpLnBvcCgpO1xuICAgICAgICBjb25zdCBmaWxlOiBhbnkgPSBuZXcgQmxvYihbYmxvYl0sIHsgdHlwZTogYmxvYi50eXBlIH0pO1xuICAgICAgICBmaWxlLm5hbWUgPSBmaWxlTmFtZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGZpbGU7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAobmguaXNBcnJheSh0aGlzLmFjY2VwdCkpIHtcbiAgICAgICg8QXJyYXk8QXNpTWltZVR5cGU+PnRoaXMuYWNjZXB0KS5mb3JFYWNoKChhY2NlcHQpID0+IHtcbiAgICAgICAgdGhpcy5hY2NlcHRBdHRyaWJ1dGUgKz0gYWNjZXB0LmV4dGVuc2lvbiArICcsICcgKyBhY2NlcHQubWltZVR5cGUgKyAnLCc7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWNjZXB0ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGFBY2NlcHQ6IEFzaU1pbWVUeXBlID0gKDxBc2lNaW1lVHlwZT50aGlzLmFjY2VwdCk7XG4gICAgICB0aGlzLmFjY2VwdEF0dHJpYnV0ZSA9IGFBY2NlcHQuZXh0ZW5zaW9uICsgJywgJyArIGFBY2NlcHQubWltZVR5cGU7XG4gICAgfVxuICB9XG5cbiAgb3BlbkZpbGVJbnB1dCgpIHtcbiAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gbnVsbDtcbiAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gIH1cblxuICBnZXRGaWxlVXJsKCk6IFNhZmVSZXNvdXJjZVVybCB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZVNlcnZpY2UuZ2V0RmlsZVVybCh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIGNsZWFuKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICB9XG5cbiAgaGFuZGxlRHJhZ0VudGVyKCkge1xuICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICB9XG5cbiAgaGFuZGxlRHJhZ0xlYXZlKCkge1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGhhbmRsZURyb3AoZTogRXZlbnQpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMuaGFuZGxlSW5wdXRDaGFuZ2UoZSk7XG4gIH1cblxuICBoYW5kbGVGaWxlTG9hZCgpIHtcbiAgICB0aGlzLmZpbGVMb2FkZWQgPSB0cnVlO1xuICB9XG5cbiAgaGFuZGxlSW5wdXRDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhVHJhbnNmZXIgPyBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXNbMF0gOiBldmVudC50YXJnZXQuZmlsZXNbMF07XG5cbiAgICBpZiAodGhpcy5ibG9ja0ltcG9ydCAmJiAhdGhpcy5pc1ZhbGlkZU1pbWVUeXBlKGZpbGUudHlwZSkpIHtcbiAgICAgIHRoaXMub25FcnJvci5lbWl0KHtcbiAgICAgICAgZXJyb3I6ICdGT1JNQVQnLFxuICAgICAgICBmaWxlOiBmaWxlXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLnZhbHVlID0gZmlsZTtcbiAgfVxuXG4gIGRvd25sb2FkRm9ySUUoKSB7XG4gICAgaWYgKG5hdmlnYXRvci5tc1NhdmVCbG9iKSB7XG4gICAgICBuYXZpZ2F0b3IubXNTYXZlQmxvYih0aGlzLnZhbHVlLCB0aGlzLnZhbHVlLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZGVNaW1lVHlwZShtaW1lVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmFjY2VwdCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChuaC5pc0FycmF5KHRoaXMuYWNjZXB0KSkge1xuICAgICAgY29uc3QgYWNjZXB0cyA9IDxBcnJheTxBc2lNaW1lVHlwZT4+dGhpcy5hY2NlcHQ7XG4gICAgICBmb3IgKGxldCBhY2NlcHQgb2YgYWNjZXB0cykge1xuICAgICAgICBpZiAoYWNjZXB0Lm1pbWVUeXBlID09PSBtaW1lVHlwZSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFBY2NlcHQ6IEFzaU1pbWVUeXBlID0gKDxBc2lNaW1lVHlwZT50aGlzLmFjY2VwdCk7XG4gICAgICByZXR1cm4gYUFjY2VwdC5taW1lVHlwZSA9PT0gbWltZVR5cGVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=