@ngez/core
Version:
A collection of minimalistic, easy-to-use and fully customizable Angular components, directives and services
263 lines • 23 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { DOCUMENT, isPlatformBrowser } from '@angular/common';
import { Directive, ElementRef, EventEmitter, forwardRef, HostListener, Inject, Optional, Output, PLATFORM_ID, Renderer2, } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { fromEvent } from 'rxjs';
import { NgEzFileBase } from './file';
export class NgEzFileInputDirective extends NgEzFileBase {
/**
* @param {?} element
* @param {?} platformId
* @param {?} document
* @param {?} renderer
*/
constructor(element, platformId, document, renderer) {
super();
this.element = element;
this.platformId = platformId;
this.document = document;
this.renderer = renderer;
this.selected = new EventEmitter();
this.isDisabled = false;
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (!isPlatformBrowser(this.platformId))
return;
const { currentValue: accept = null, previousValue: prevAccept = null } = changes.accept || {};
const { currentValue: multiple = null, previousValue: prevMultiple = null } = changes.multiple || {};
if ((multiple != prevMultiple) || (accept != prevAccept))
this.appendFileInput();
}
/**
* @return {?}
*/
ngOnInit() {
if (!isPlatformBrowser(this.platformId))
return;
if (!this.fileInput)
this.appendFileInput();
this.subscription = fromEvent(this.element.nativeElement, this.isInputOrTextarea() ? 'focus' : 'click')
.subscribe(e => this.browse());
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.subscription)
this.subscription.unsubscribe();
this.removeFileInput();
}
/**
* @private
* @return {?}
*/
onBlur() {
if (this.onTouched)
this.onTouched();
}
/**
* @return {?}
*/
browse() {
if (this.isDisabled)
return;
if (this.isInputOrTextarea())
this.element.nativeElement.blur();
this.fileInput.click();
}
/**
* @return {?}
*/
clear() {
this.setValueAndUpdate(null);
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
/** @type {?} */
let file = null;
if (value) {
if (value instanceof File || (Array.isArray(value) && value.every(value => value instanceof File)))
file = value;
else if (value instanceof FileList)
file = Array.from(value);
else
return console.warn('Expected value of type File, FileList or File[], instead got: ', value);
}
this.setValue(file);
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.onChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* @param {?} isDisabled
* @return {?}
*/
setDisabledState(isDisabled) {
this.renderer.setProperty(this.element.nativeElement, 'disabled', isDisabled);
this.isDisabled = isDisabled;
}
/**
* @private
* @param {?} value
* @return {?}
*/
setValue(value) {
/** @type {?} */
const text = value ? this.getText(value) : '';
this.renderer.setProperty(this.element.nativeElement, 'value', text);
}
/**
* @private
* @param {?} value
* @return {?}
*/
setValueAndUpdate(value) {
/** @type {?} */
const fileValue = value instanceof FileList ? Array.from(value) : value;
if (this.onChange)
this.onChange(fileValue);
this.setValue(fileValue);
this.selected.emit(fileValue);
}
/**
* @private
* @return {?}
*/
appendFileInput() {
if (this.fileInput)
this.clear();
this.removeFileInput();
this.fileInput = this.createFileInput();
this.renderer.appendChild(this.document.body, this.fileInput);
this.listener = this.renderer.listen(this.fileInput, 'change', e => {
/** @type {?} */
const files = e.target.files;
/** @type {?} */
const value = this.multiple ? files : files.item(0);
this.setValueAndUpdate(value);
});
}
/**
* @private
* @return {?}
*/
createFileInput() {
/** @type {?} */
const input = this.renderer.createElement('input');
this.renderer.setAttribute(input, 'type', 'file');
this.renderer.setAttribute(input, 'aria-hidden', 'true');
this.renderer.setProperty(input, 'hidden', true);
this.renderer.setProperty(input, 'multiple', this.multiple ? true : false);
if (this.accept)
this.renderer.setAttribute(input, 'accept', this.accept);
return input;
}
/**
* @private
* @return {?}
*/
removeFileInput() {
if (this.fileInput)
this.renderer.removeChild(this.document.body, this.fileInput);
if (this.listener)
this.listener();
}
/**
* @private
* @param {?} value
* @return {?}
*/
getText(value) {
/** @type {?} */
const files = value instanceof File ? [value] : value;
return files.reduce((text, file, index) => `${text}${index > 0 ? ', ' : ''}${file.name}`, '');
}
/**
* @private
* @return {?}
*/
isInputOrTextarea() {
/** @type {?} */
const element = this.element.nativeElement;
return element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement;
}
}
NgEzFileInputDirective.decorators = [
{ type: Directive, args: [{
selector: ':not([type="file"])[ngezFileInput]',
exportAs: 'ngezFileInput',
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NgEzFileInputDirective),
multi: true
}]
},] }
];
/** @nocollapse */
NgEzFileInputDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] },
{ type: Renderer2 }
];
NgEzFileInputDirective.propDecorators = {
selected: [{ type: Output }],
onBlur: [{ type: HostListener, args: ['blur',] }]
};
if (false) {
/** @type {?} */
NgEzFileInputDirective.prototype.selected;
/** @type {?} */
NgEzFileInputDirective.prototype.onChange;
/** @type {?} */
NgEzFileInputDirective.prototype.onTouched;
/** @type {?} */
NgEzFileInputDirective.prototype.isDisabled;
/**
* @type {?}
* @private
*/
NgEzFileInputDirective.prototype.subscription;
/**
* @type {?}
* @private
*/
NgEzFileInputDirective.prototype.element;
/**
* @type {?}
* @private
*/
NgEzFileInputDirective.prototype.platformId;
/**
* @type {?}
* @private
*/
NgEzFileInputDirective.prototype.document;
/**
* @type {?}
* @private
*/
NgEzFileInputDirective.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1pbnB1dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmdlei9jb3JlLyIsInNvdXJjZXMiOlsiZmlsZS9maWxlLWlucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFLTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEdBRVosTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBRS9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFXdEMsTUFBTSxPQUFPLHNCQUF1QixTQUFRLFlBQVk7Ozs7Ozs7SUFZcEQsWUFDWSxPQUFtQixFQUNFLFVBQWtCLEVBQ1QsUUFBYSxFQUMzQyxRQUFtQjtRQUFJLEtBQUssRUFBRSxDQUFDO1FBSC9CLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDRSxlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ1QsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQUMzQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBZHJCLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQU12RCxlQUFVLEdBQUcsS0FBSyxDQUFDO0lBUXlCLENBQUM7Ozs7O0lBRTdDLFdBQVcsQ0FBQyxPQUFzQjtRQUM5QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU87Y0FFMUMsRUFBRSxZQUFZLEVBQUUsTUFBTSxHQUFHLElBQUksRUFBRSxhQUFhLEVBQUUsVUFBVSxHQUFHLElBQUksRUFB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ImltcG9ydCB7IERPQ1VNRU5ULCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgICBEaXJlY3RpdmUsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgZm9yd2FyZFJlZixcclxuICAgIEhvc3RMaXN0ZW5lcixcclxuICAgIEluamVjdCxcclxuICAgIElucHV0LFxyXG4gICAgT25DaGFuZ2VzLFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgT25Jbml0LFxyXG4gICAgT3B0aW9uYWwsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBQTEFURk9STV9JRCxcclxuICAgIFJlbmRlcmVyMixcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IE5nRXpGaWxlQmFzZSB9IGZyb20gJy4vZmlsZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiAnOm5vdChbdHlwZT1cImZpbGVcIl0pW25nZXpGaWxlSW5wdXRdJyxcclxuICAgIGV4cG9ydEFzOiAnbmdlekZpbGVJbnB1dCcsXHJcbiAgICBwcm92aWRlcnM6IFt7XHJcbiAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmdFekZpbGVJbnB1dERpcmVjdGl2ZSksXHJcbiAgICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ0V6RmlsZUlucHV0RGlyZWN0aXZlIGV4dGVuZHMgTmdFekZpbGVCYXNlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICAgIEBPdXRwdXQoKSBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZSB8IEZpbGVbXT4oKTtcclxuICAgIFxyXG4gICAgb25DaGFuZ2U6IEZ1bmN0aW9uO1xyXG5cclxuICAgIG9uVG91Y2hlZDogRnVuY3Rpb247XHJcblxyXG4gICAgaXNEaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLFxyXG4gICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxyXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHsgc3VwZXIoKTsgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWU6IGFjY2VwdCA9IG51bGwsIHByZXZpb3VzVmFsdWU6IHByZXZBY2NlcHQgPSBudWxsIH0gPSBjaGFuZ2VzLmFjY2VwdCB8fCB7fTtcclxuICAgICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZTogbXVsdGlwbGUgPSBudWxsLCBwcmV2aW91c1ZhbHVlOiBwcmV2TXVsdGlwbGUgPSBudWxsIH0gPSBjaGFuZ2VzLm11bHRpcGxlIHx8IHt9O1xyXG5cclxuICAgICAgICBpZiAoKG11bHRpcGxlICE9IHByZXZNdWx0aXBsZSkgfHwgKGFjY2VwdCAhPSBwcmV2QWNjZXB0KSlcclxuICAgICAgICAgICAgdGhpcy5hcHBlbmRGaWxlSW5wdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmZpbGVJbnB1dClcclxuICAgICAgICAgICAgdGhpcy5hcHBlbmRGaWxlSW5wdXQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBmcm9tRXZlbnQodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMuaXNJbnB1dE9yVGV4dGFyZWEoKSA/ICdmb2N1cycgOiAnY2xpY2snKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGUgPT4gdGhpcy5icm93c2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRmlsZUlucHV0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignYmx1cicpXHJcbiAgICBwcml2YXRlIG9uQmx1cigpIHtcclxuICAgICAgICBpZiAodGhpcy5vblRvdWNoZWQpXHJcbiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYnJvd3NlKCkge1xyXG4gICAgICAgIGlmKHRoaXMuaXNEaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0lucHV0T3JUZXh0YXJlYSgpKVxyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5ibHVyKCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIHRoaXMuZmlsZUlucHV0LmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXIoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZUFuZFVwZGF0ZShudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBsZXQgZmlsZTogRmlsZSB8IEZpbGVbXSA9IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSh2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpKSlcclxuICAgICAgICAgICAgICAgIGZpbGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlTGlzdClcclxuICAgICAgICAgICAgICAgIGZpbGUgPSBBcnJheS5mcm9tKHZhbHVlKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignRXhwZWN0ZWQgdmFsdWUgb2YgdHlwZSBGaWxlLCBGaWxlTGlzdCBvciBGaWxlW10sIGluc3RlYWQgZ290OiAnLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldFZhbHVlKGZpbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogYW55KSA9PiB7fSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4ge30pIHtcclxuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpO1xyXG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRWYWx1ZSh2YWx1ZTogRmlsZSB8IEZpbGVbXSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSB2YWx1ZSA/IHRoaXMuZ2V0VGV4dCh2YWx1ZSkgOiAnJztcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB0ZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldFZhbHVlQW5kVXBkYXRlKHZhbHVlOiBGaWxlIHwgRmlsZUxpc3QpIHtcclxuICAgICAgICBjb25zdCBmaWxlVmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIEZpbGVMaXN0ID8gQXJyYXkuZnJvbSh2YWx1ZSkgOiB2YWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5vbkNoYW5nZSlcclxuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShmaWxlVmFsdWUpO1xyXG4gICAgICAgIHRoaXMuc2V0VmFsdWUoZmlsZVZhbHVlKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoZmlsZVZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFwcGVuZEZpbGVJbnB1dCgpIHtcclxuICAgICAgICBpZiAodGhpcy5maWxlSW5wdXQpXHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZW1vdmVGaWxlSW5wdXQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5maWxlSW5wdXQgPSB0aGlzLmNyZWF0ZUZpbGVJbnB1dCgpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5kb2N1bWVudC5ib2R5LCB0aGlzLmZpbGVJbnB1dCk7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZmlsZUlucHV0LCAnY2hhbmdlJywgZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzOiBGaWxlTGlzdCA9IGUudGFyZ2V0LmZpbGVzO1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMubXVsdGlwbGUgPyBmaWxlcyA6IGZpbGVzLml0ZW0oMCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWVBbmRVcGRhdGUodmFsdWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlRmlsZUlucHV0KCk6IEhUTUxJbnB1dEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGlucHV0LCAndHlwZScsICdmaWxlJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoaW5wdXQsICdhcmlhLWhpZGRlbicsICd0cnVlJyk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShpbnB1dCwgJ2hpZGRlbicsIHRydWUpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoaW5wdXQsICdtdWx0aXBsZScsIHRoaXMubXVsdGlwbGUgPyB0cnVlIDogZmFsc2UpO1xyXG4gICAgICAgIGlmICh0aGlzLmFjY2VwdClcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoaW5wdXQsICdhY2NlcHQnLCB0aGlzLmFjY2VwdCk7XHJcbiAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVtb3ZlRmlsZUlucHV0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmZpbGVJbnB1dClcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLmRvY3VtZW50LmJvZHksIHRoaXMuZmlsZUlucHV0KTtcclxuICAgICAgICBpZiAodGhpcy5saXN0ZW5lcilcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VGV4dCh2YWx1ZTogRmlsZSB8IEZpbGVbXSk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgZmlsZXMgPSB2YWx1ZSBpbnN0YW5jZW9mIEZpbGUgPyBbdmFsdWVdIDogdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIGZpbGVzLnJlZHVjZSgodGV4dCwgZmlsZSwgaW5kZXgpID0+IGAke3RleHR9JHtpbmRleCA+IDAgPyAnLCAnIDogJyd9JHtmaWxlLm5hbWV9YCwgJycpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNJbnB1dE9yVGV4dGFyZWEoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudDtcclxuICAgIH1cclxufSJdfQ==