@infordata-web/portal-common-component-lib
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.14.
110 lines • 25.8 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { NewFile } from '../new-file';
import { BehaviorSubject, combineLatest, Subject } from 'rxjs';
import { debounceTime, map, shareReplay, tap, withLatestFrom } from 'rxjs/operators';
import { MessageService } from '../../../services/message.service';
import { ValidationService } from "../../../services/validation.service";
import { InfoTipService } from '../../../../info-tip/info-tip.service';
export class CaricaDocumentiComponent {
constructor(msg, infoTipService) {
this.msg = msg;
this.infoTipService = infoTipService;
this.onFileAdded = new EventEmitter();
this.maxDate = new Date();
this.validitaForm$ = new Subject();
/* Stream files caricati */
this.files$ = new BehaviorSubject(null);
}
ngOnInit() {
// //TODO
// if (!this.tipologieEmittente) {
// this.tipologieEmittente = [{ codice: "TIPOLOGIE_EMITTENTE_1", descrizione: "tipologieEmittente1", id: "1", codiceLingua: "it_IT" }]
// }
this.form = new FormGroup({});
const tipoDocumento = new FormControl({ value: null, disabled: false }, [Validators.required]);
const soggettoEmittente = new FormControl({ value: "", disabled: false }, [Validators.required]);
const dataDocumento = new FormControl({ value: "", disabled: false }, [Validators.required, ValidationService.ValidateDate]);
const numeroDocumento = new FormControl({ value: "", disabled: false }, [Validators.required]);
const tipologiaEmittente = new FormControl({ value: null, disabled: false }, []);
const note = new FormControl({ value: "", disabled: false }, []);
this.form.addControl('tipoDocumento', tipoDocumento);
this.form.addControl('soggettoEmittente', soggettoEmittente);
this.form.addControl('dataDocumento', dataDocumento);
this.form.addControl('numeroDocumento', numeroDocumento);
this.form.addControl('tipologiaEmittente', tipologiaEmittente);
this.form.addControl('note', note);
this.tipoDocumento$ = tipoDocumento.valueChanges.pipe(shareReplay());
this.soggettoEmittente$ = soggettoEmittente.valueChanges.pipe(shareReplay());
this.dataDocumento$ = dataDocumento.valueChanges.pipe(shareReplay());
this.numeroDocumento$ = numeroDocumento.valueChanges
.pipe(debounceTime(800), shareReplay());
this.addFiles$ = new Subject();
this.note$ = new Subject();
this.tipologieEmittente$ = new Subject();
const dtos$ = combineLatest([this.tipoDocumento$, this.files$, this.soggettoEmittente$, this.dataDocumento$, this.numeroDocumento$, this.tipologieEmittente$, this.note$])
.pipe(map(([tipDocumento, file, soggettoEmittente, dataDocumento, numeroDocumento, codiceTipoEmittente, nota]) => {
return new NewFile(new Date().getTime().toString(), file, tipDocumento, soggettoEmittente, dataDocumento, numeroDocumento, codiceTipoEmittente, nota);
}));
this.addFiles$.pipe(debounceTime(300), withLatestFrom(dtos$), tap(([_, dto]) => {
this.onFileAdded.emit(dto);
this.validitaForm$.next(true);
this.pulisciForm();
})).subscribe();
this.infoTipService.getInfo$('numero-documento').subscribe(info => {
this.numeroDocumentoCaption = info.tooltip;
});
}
sfoglia(_) {
if (this.fileInput.nativeElement) {
this.fileInput.nativeElement.click();
}
}
filesChanged() {
const file = this.fileInput.nativeElement.files[0];
this.files$.next(file);
this.nameFileTruncated = this.formatFunction(file.name);
}
aggiungiFile(event) {
this.tipologieEmittente$.next(this.form.value["tipologiaEmittente"]);
this.note$.next(this.form.value["note"]);
this.addFiles$.next(event);
this.fileInput.nativeElement.value = '';
//this.form.reset();
}
resetForm() {
this.form.reset();
}
ngOnDistory() {
this.subscription.unsubscribe();
}
formatFunction(nomeFile) {
return nomeFile.length > 18 ? nomeFile.substring(0, 18) + '...' + nomeFile.substring(nomeFile.length, nomeFile.length - 4) : nomeFile;
}
pulisciForm() {
Object.keys(this.form.value)
.forEach(campo => {
this.form.get(campo).setValue('');
});
this.files$.next(null);
}
}
CaricaDocumentiComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-carica-documenti',
template: "<div class=\"row d-flex align-items-center\" [formGroup]=\"form\">\r\n\t<div class=\"col-12 col-md-6 my-2\">\r\n\t\t<mat-form-field>\r\n\t\t\t<mat-label>{{'tipo-documento' | traduzione}} {{' *'}}</mat-label>\r\n\t\t\t<mat-select formControlName=\"tipoDocumento\">\r\n\t\t\t\t<mat-option *ngFor=\"let tipoDocumento of tipologieDocumento\" [value]=\"tipoDocumento\">\r\n\t\t\t\t\t{{tipoDocumento.descrizione}}\r\n\t\t\t\t</mat-option>\r\n\t\t\t</mat-select>\r\n\t\t\t<mat-error *ngIf=\"form.controls['tipoDocumento'].invalid\">\r\n\t\t\t\t{{msg.produceMessage('obbligatorio', form.controls['tipoDocumento']) | traduzione}}\r\n\t\t\t</mat-error>\r\n\t\t\t<mat-hint *infoTip=\"'tipo-documento'\"></mat-hint>\r\n\t\t</mat-form-field>\r\n\t</div>\r\n\t<div class=\"col-12 col-md-6 my-2\">\r\n\t\t<mat-form-field>\r\n\t\t\t<mat-label>{{'soggetto-emittente' | traduzione}}{{' *'}}</mat-label>\r\n\t\t\t<input matInput formControlName=\"soggettoEmittente\">\r\n\t\t\t<mat-error *ngIf=\"form.controls['soggettoEmittente'].invalid\">\r\n\t\t\t\t{{ msg.produceMessage('obbligatorio', form.controls['soggettoEmittente']) | traduzione}}\r\n\t\t\t</mat-error>\r\n\t\t\t<mat-hint *infoTip=\"'soggetto-emittente'\"></mat-hint>\r\n\t\t</mat-form-field>\r\n\t</div>\r\n\r\n\t<div class=\"col-12 col-md-6 col-lg-3 my-2\">\r\n\t\t<mat-form-field>\r\n\t\t\t<mat-label>{{'data-documento' | traduzione}}{{' *'}}</mat-label>\r\n\t\t\t<input matInput [matDatepicker]=\"picker\" formControlName=\"dataDocumento\" [max]=\"maxDate\">\r\n\t\t\t<mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n\t\t\t<mat-datepicker #picker></mat-datepicker>\r\n\t\t\t<mat-error *ngIf=\"form.controls['dataDocumento'].invalid\">\r\n\t\t\t\t{{ msg.getErrorData(form.controls[\"dataDocumento\"]) | traduzione }}\r\n\t\t\t</mat-error>\r\n\t\t\t<mat-hint *infoTip=\"'data-documento'\"></mat-hint>\r\n\t\t</mat-form-field>\r\n\r\n\t</div>\r\n\t<div class=\"col-12 col-md-6 col-lg-3 my-2\">\r\n\t\t<mat-form-field appearance=\"\"> \r\n\t\t\t<mat-label>{{'numero-documento' | traduzione}}{{'*'}}</mat-label>\r\n\t\t\t<input matInput formControlName=\"numeroDocumento\" #numeroDoc maxlength=\"49\">\r\n\t\t\t<mat-error *ngIf=\"form.controls['numeroDocumento'].invalid\">\r\n\t\t\t\t{{msg.produceMessage('obbligatorio', form.controls['numeroDocumento']) | traduzione}}\r\n\t\t\t</mat-error>\r\n\t\t\t<mat-hint align=\"start\" style=\"max-width: 70%!important;color: black!important;\">{{numeroDocumentoCaption}}</mat-hint>\r\n\t\t\t<mat-hint align=\"end\">{{numeroDoc.value.length}} / 49</mat-hint>\r\n\t\t</mat-form-field>\r\n\t</div>\r\n\r\n\r\n\t<div class=\"col-12 col-md-9 col-lg-3 my-2\">\r\n\t\t<mat-form-field>\r\n\t\t\t<mat-label>{{'tipologia-emittente' | traduzione}}</mat-label>\r\n\t\t\t<!-- TODO -->\r\n\t\t\t<!-- <mat-select formControlName=\"tipologiaEmittente\">\r\n\t\t\t\t<mat-option [value]=\"null\">-- {{ 'placeholder' | traduzione }} --</mat-option>\r\n\t\t\t\t<mat-option *ngFor=\"let tipologiaEmittente of tipologieEmittente\" [value]=\"tipologiaEmittente\">\r\n\t\t\t\t\t{{tipologiaEmittente.descrizione}}\r\n\t\t\t\t</mat-option>\r\n\t\t\t</mat-select> -->\r\n\t\t\t<mat-select placeholder=\"{{'seleziona' | traduzione}}\" formControlName=\"tipologiaEmittente\">\r\n\t\t\t\t<mat-option \r\n\t\t\t\t\t*ngFor=\"let tipoEmittente of tipologieTipiEmittenti$ | async\"\r\n\t\t\t\t\t[value]=\"tipoEmittente.codice\"\r\n\t\t\t\t>\r\n\t\t\t\t{{ tipoEmittente.descrizione }}\r\n\t\t\t\t</mat-option>\r\n\t\t\t</mat-select>\r\n\t\t\t<mat-hint *infoTip=\"'tipologia-emittente'\"></mat-hint>\r\n\t\t</mat-form-field>\r\n\t</div>\r\n\t<div class=\"col-12 col-md-3 col-lg-3 my-2\">\r\n\t\t<button mat-stroked-button color=\"primary\" class=\"text-uppercase mb-2\" (click)=\"sfoglia($event)\">\r\n\t\t\t<i class=\"fas fa-upload\"></i> {{'upload-file' | traduzione}}\r\n\t\t</button>\r\n\r\n\t\t<p *ngIf=\"files$ | async as files\" class=\"position-absolute mb-0 mt-2 text-muted file-upl\">\r\n\t\t\t<i class=\"far fa-file-alt text-primary mr-1\" aria-hidden=\"true\"></i>\r\n\t\t\t{{nameFileTruncated}}\r\n\t\t\t<!-- <a href=\"#\" (click)=\"files$.next(null)\"><span class=\" ml-1 sr-only\">{{'scarta_il_file' |\r\n\t\t\t\t\ttraduzione}}</span><i class=\"fas fa-times-circle ml-2 text-danger\"></i></a> -->\r\n\t\t</p>\r\n\t</div>\r\n\t<div class=\"col-12 my-2\">\r\n\t\t<mat-form-field class=\"example-full-width\">\r\n\t\t\t<mat-label>{{'note' | traduzione}}</mat-label>\r\n\t\t\t<textarea matInput \r\n\t\t\tplaceholder=\"Lorem ipsum...\" \r\n\t\t\tformControlName=\"note\"\r\n\t\t\tmaxlength=\"511\"\r\n\t\t\t#testo\r\n\t\t\t></textarea>\r\n\t\t\t<mat-hint *infoTip=\"'note'\"></mat-hint>\r\n\t\t\t<mat-hint align=\"end\">{{testo.value.length}} / 511</mat-hint>\r\n\t\t</mat-form-field>\r\n\r\n\t</div>\r\n\t<div class=\"col-12 text-right my-2\">\r\n\t\t<button type=\"button\" mat-flat-button color=\"primary\" class=\"text-uppercase mb-2\" (click)=\"aggiungiFile($event)\"\r\n\t\t\t[disabled]=\"form.invalid || (files$ | async) == null\">\r\n\t\t\t{{'aggiungi' | traduzione}}\r\n\t\t</button>\r\n\t</div>\r\n\t<input #fileInput *ngIf=\"(tipoDocumento$ | async) != null\" type=\"file\" class=\"hidden\"\r\n\t\t(change)=\"filesChanged($event)\" accept=\".pdf\">\r\n</div>",
styles: ["button#buttoneCarica{display:none}.file-upl{white-space:nowrap}"]
},] }
];
CaricaDocumentiComponent.ctorParameters = () => [
{ type: MessageService },
{ type: InfoTipService }
];
CaricaDocumentiComponent.propDecorators = {
tipologieDocumento: [{ type: Input }],
tipologieEmittente: [{ type: Input }],
tipologieTipiEmittenti$: [{ type: Input }],
onFileAdded: [{ type: Output }],
fileInput: [{ type: ViewChild, args: ['fileInput',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyaWNhLWRvY3VtZW50aS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiRDovUHJvZ2V0dGkvREFHL3NvcmdlbnRpL2dpdGxhYi10ZXJuaS9jb21tb24tY29tcG9uZW50LWxpYi9wcm9qZWN0cy9wb3J0YWwtY29tbW9uLWNvbXBvbmVudC1saWIvc3JjLyIsInNvdXJjZXMiOlsibGliL2RlcG9zaXRpL2NvbXBvbmVudHMvZG9jdW1lbnRhemlvbmUvY2FyaWNhLWRvY3VtZW50aS9jYXJpY2EtZG9jdW1lbnRpLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVwRyxPQUFPLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFjLE9BQU8sRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUN2RixPQUFPLEVBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRW5GLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFRckUsTUFBTSxPQUFPLHdCQUF3QjtJQXlDcEMsWUFBbUIsR0FBbUIsRUFBVSxjQUE4QjtRQUEzRCxRQUFHLEdBQUgsR0FBRyxDQUFnQjtRQUFVLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQTNCOUUsZ0JBQVcsR0FBMEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUl4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QjtRQUM5QixPQUFPLFFBQVEsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQTtJQUN0SSxDQUFDO0lBRUQsV0FBVztRQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7YUFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNsQyxDQUFDLENBQUMsQ0FBQztRQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7OztZQXZKRCxTQUFTLFNBQUM7Z0JBQ1YsUUFBUSxFQUFFLHNCQUFzQjtnQkFDaEMsc3BLQUFnRDs7YUFFaEQ7OztZQVRPLGNBQWM7WUFFZCxjQUFjOzs7aUNBVXBCLEtBQUs7aUNBR0wsS0FBSztzQ0FHTCxLQUFLOzBCQUtMLE1BQU07d0JBR04sU0FBUyxTQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7VGlwb0RvY3VtZW50b30gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3RpcG8tZG9jdW1lbnRvJztcclxuaW1wb3J0IHtGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7TmV3RmlsZX0gZnJvbSAnLi4vbmV3LWZpbGUnO1xyXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIG1hcCwgc2hhcmVSZXBsYXksIHRhcCwgd2l0aExhdGVzdEZyb219IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtUaXBvbG9naWNhRFRPfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvdGlwb2xvZ2ljYS1kLXQtbyc7XHJcbmltcG9ydCB7TWVzc2FnZVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21lc3NhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7VmFsaWRhdGlvblNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtJbmZvVGlwU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vLi4vaW5mby10aXAvaW5mby10aXAuc2VydmljZSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdsaWItY2FyaWNhLWRvY3VtZW50aScsXHJcblx0dGVtcGxhdGVVcmw6ICcuL2NhcmljYS1kb2N1bWVudGkuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWycuL2NhcmljYS1kb2N1bWVudGkuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYXJpY2FEb2N1bWVudGlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHRpcG9sb2dpZURvY3VtZW50bzogQXJyYXk8VGlwb2xvZ2ljYURUTz47XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0dGlwb2xvZ2llRW1pdHRlbnRlOiBBcnJheTxUaXBvbG9naWNhRFRPPjtcclxuXHJcblx0QElucHV0KClcclxuXHR0aXBvbG9naWVUaXBpRW1pdHRlbnRpJDogT2JzZXJ2YWJsZTxBcnJheTxUaXBvbG9naWNhRFRPPj47XHJcblxyXG5cdGZvcm06IEZvcm1Hcm91cDtcclxuXHJcblx0QE91dHB1dCgpXHJcblx0b25GaWxlQWRkZWQ6IEV2ZW50RW1pdHRlcjxOZXdGaWxlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcblx0QFZpZXdDaGlsZCgnZmlsZUlucHV0JylcclxuXHRmaWxlSW5wdXQ6IEVsZW1lbnRSZWY7XHJcblx0bWF4RGF0ZSA9IG5ldyBEYXRlKCk7XHJcblxyXG5cdC8qIFN0cmVhbSBjYW1waSBpbnB1dCAqL1xyXG5cdHRpcG9Eb2N1bWVudG8kOiBPYnNlcnZhYmxlPFRpcG9Eb2N1bWVudG8+O1xyXG5cdHNvZ2dldHRvRW1pdHRlbnRlJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xyXG5cdGRhdGFEb2N1bWVudG8kOiBPYnNlcnZhYmxlPERhdGU+O1xyXG5cdG51bWVyb0RvY3VtZW50byQ6IE9ic2VydmFibGU8c3RyaW5nPjtcclxuXHRub3RlJDogU3ViamVjdDxzdHJpbmc+O1xyXG5cdHRpcG9sb2dpZUVtaXR0ZW50ZSQ6IFN1YmplY3Q8VGlwb2xvZ2ljYURUTz47XHJcblx0dmFsaWRpdGFGb3JtJDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcblx0bmFtZUZpbGVUcnVuY2F0ZWQ6IHN0cmluZztcclxuXHJcblx0LyogU3RyZWFtIGZpbGVzIGNhcmljYXRpICovXHJcblx0ZmlsZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGaWxlPihudWxsKTtcclxuXHJcblx0LyogU3RyZWFtIGNsaWNrIGJvdHRvbmUgYWdnaXVuZ2kgZmlsZXMgKi9cclxuXHRhZGRGaWxlcyQ6IFN1YmplY3Q8YW55PjtcclxuXHJcblx0c3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG5cdG51bWVyb0RvY3VtZW50b0NhcHRpb246IHN0cmluZztcclxuXHJcblxyXG5cdGNvbnN0cnVjdG9yKHB1YmxpYyBtc2c6IE1lc3NhZ2VTZXJ2aWNlLCBwcml2YXRlIGluZm9UaXBTZXJ2aWNlOiBJbmZvVGlwU2VydmljZSkgeyB9XHJcblxyXG5cdG5nT25Jbml0KCkge1xyXG5cdFx0Ly8gLy9UT0RPXHJcblx0XHQvLyBpZiAoIXRoaXMudGlwb2xvZ2llRW1pdHRlbnRlKSB7XHJcblx0XHQvLyBcdHRoaXMudGlwb2xvZ2llRW1pdHRlbnRlID0gW3sgY29kaWNlOiBcIlRJUE9MT0dJRV9FTUlUVEVOVEVfMVwiLCBkZXNjcml6aW9uZTogXCJ0aXBvbG9naWVFbWl0dGVudGUxXCIsIGlkOiBcIjFcIiwgY29kaWNlTGluZ3VhOiBcIml0X0lUXCIgfV1cclxuXHRcdC8vIH1cclxuXHRcdHRoaXMuZm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG5cdFx0Y29uc3QgdGlwb0RvY3VtZW50byA9IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiBudWxsLCBkaXNhYmxlZDogZmFsc2UgfSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcclxuXHRcdGNvbnN0IHNvZ2dldHRvRW1pdHRlbnRlID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IFwiXCIsIGRpc2FibGVkOiBmYWxzZSB9LCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xyXG5cdFx0Y29uc3QgZGF0YURvY3VtZW50byA9IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiBcIlwiLCBkaXNhYmxlZDogZmFsc2UgfSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRpb25TZXJ2aWNlLlZhbGlkYXRlRGF0ZV0pO1xyXG5cdFx0Y29uc3QgbnVtZXJvRG9jdW1lbnRvID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IFwiXCIsIGRpc2FibGVkOiBmYWxzZSB9LCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xyXG5cdFx0Y29uc3QgdGlwb2xvZ2lhRW1pdHRlbnRlID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IG51bGwsIGRpc2FibGVkOiBmYWxzZSB9LCBbXSk7XHJcblx0XHRjb25zdCBub3RlID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IFwiXCIsIGRpc2FibGVkOiBmYWxzZSB9LCBbXSk7XHJcblxyXG5cdFx0dGhpcy5mb3JtLmFkZENvbnRyb2woJ3RpcG9Eb2N1bWVudG8nLCB0aXBvRG9jdW1lbnRvKTtcclxuXHRcdHRoaXMuZm9ybS5hZGRDb250cm9sKCdzb2dnZXR0b0VtaXR0ZW50ZScsIHNvZ2dldHRvRW1pdHRlbnRlKTtcclxuXHRcdHRoaXMuZm9ybS5hZGRDb250cm9sKCdkYXRhRG9jdW1lbnRvJywgZGF0YURvY3VtZW50byk7XHJcblx0XHR0aGlzLmZvcm0uYWRkQ29udHJvbCgnbnVtZXJvRG9jdW1lbnRvJywgbnVtZXJvRG9jdW1lbnRvKTtcclxuXHRcdHRoaXMuZm9ybS5hZGRDb250cm9sKCd0aXBvbG9naWFFbWl0dGVudGUnLCB0aXBvbG9naWFFbWl0dGVudGUpO1xyXG5cdFx0dGhpcy5mb3JtLmFkZENvbnRyb2woJ25vdGUnLCBub3RlKTtcclxuXHJcblx0XHR0aGlzLnRpcG9Eb2N1bWVudG8kID0gdGlwb0RvY3VtZW50by52YWx1ZUNoYW5nZXMucGlwZShzaGFyZVJlcGxheSgpKTtcclxuXHRcdHRoaXMuc29nZ2V0dG9FbWl0dGVudGUkID0gc29nZ2V0dG9FbWl0dGVudGUudmFsdWVDaGFuZ2VzLnBpcGUoc2hhcmVSZXBsYXkoKSk7XHJcblx0XHR0aGlzLmRhdGFEb2N1bWVudG8kID0gZGF0YURvY3VtZW50by52YWx1ZUNoYW5nZXMucGlwZShzaGFyZVJlcGxheSgpKTtcclxuXHJcblx0XHR0aGlzLm51bWVyb0RvY3VtZW50byQgPSBudW1lcm9Eb2N1bWVudG8udmFsdWVDaGFuZ2VzXHJcblx0XHRcdC5waXBlKGRlYm91bmNlVGltZSg4MDApLCBzaGFyZVJlcGxheSgpKTtcclxuXHJcblx0XHR0aGlzLmFkZEZpbGVzJCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuXHJcblx0XHR0aGlzLm5vdGUkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG5cdFx0dGhpcy50aXBvbG9naWVFbWl0dGVudGUkID0gbmV3IFN1YmplY3Q8VGlwb2xvZ2ljYURUTz4oKTtcclxuXHJcblxyXG5cdFx0Y29uc3QgZHRvcyQ6IE9ic2VydmFibGU8TmV3RmlsZT4gPSBjb21iaW5lTGF0ZXN0KFxyXG5cdFx0XHRbdGhpcy50aXBvRG9jdW1lbnRvJCwgdGhpcy5maWxlcyQsIHRoaXMuc29nZ2V0dG9FbWl0dGVudGUkLCB0aGlzLmRhdGFEb2N1bWVudG8kLCB0aGlzLm51bWVyb0RvY3VtZW50byQsIHRoaXMudGlwb2xvZ2llRW1pdHRlbnRlJCwgdGhpcy5ub3RlJF0pXHJcblx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdG1hcCgoW3RpcERvY3VtZW50bywgZmlsZSwgc29nZ2V0dG9FbWl0dGVudGUsIGRhdGFEb2N1bWVudG8sIG51bWVyb0RvY3VtZW50bywgY29kaWNlVGlwb0VtaXR0ZW50ZSwgbm90YV0pID0+IHtcclxuXHRcdFx0XHRcdHJldHVybiBuZXcgTmV3RmlsZShcclxuXHRcdFx0XHRcdFx0bmV3IERhdGUoKS5nZXRUaW1lKCkudG9TdHJpbmcoKSxcclxuXHRcdFx0XHRcdFx0ZmlsZSBhcyBGaWxlLFxyXG5cdFx0XHRcdFx0XHR0aXBEb2N1bWVudG8gYXMgVGlwb0RvY3VtZW50byxcclxuXHRcdFx0XHRcdFx0c29nZ2V0dG9FbWl0dGVudGUgYXMgc3RyaW5nLFxyXG5cdFx0XHRcdFx0XHRkYXRhRG9jdW1lbnRvIGFzIERhdGUsXHJcblx0XHRcdFx0XHRcdG51bWVyb0RvY3VtZW50byBhcyBzdHJpbmcsXHJcblx0XHRcdFx0XHRcdGNvZGljZVRpcG9FbWl0dGVudGUgYXMgc3RyaW5nLFxyXG5cdFx0XHRcdFx0XHRub3RhIGFzIHN0cmluZyk7XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0KTtcclxuXHJcblx0XHR0aGlzLmFkZEZpbGVzJC5waXBlKFxyXG5cdFx0XHRkZWJvdW5jZVRpbWUoMzAwKSxcclxuXHRcdFx0d2l0aExhdGVzdEZyb20oZHRvcyQpLFxyXG5cdFx0XHR0YXAoKFtfLCBkdG9dKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5vbkZpbGVBZGRlZC5lbWl0KGR0byk7XHJcblx0XHRcdFx0dGhpcy52YWxpZGl0YUZvcm0kLm5leHQodHJ1ZSk7XHJcblx0XHRcdFx0dGhpcy5wdWxpc2NpRm9ybSgpO1xyXG5cdFx0XHR9KVxyXG5cdFx0KS5zdWJzY3JpYmUoKTtcclxuXHJcblx0XHR0aGlzLmluZm9UaXBTZXJ2aWNlLmdldEluZm8kKCdudW1lcm8tZG9jdW1lbnRvJykuc3Vic2NyaWJlKGluZm8gPT4ge1xyXG5cdFx0XHR0aGlzLm51bWVyb0RvY3VtZW50b0NhcHRpb24gPSBpbmZvLnRvb2x0aXA7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHNmb2dsaWEoXykge1xyXG5cdFx0aWYgKHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQpIHtcclxuXHRcdFx0dGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC5jbGljaygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZmlsZXNDaGFuZ2VkKCkge1xyXG5cdFx0Y29uc3QgZmlsZTogRmlsZSA9IHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQuZmlsZXNbMF07XHJcblx0XHR0aGlzLmZpbGVzJC5uZXh0KGZpbGUpO1xyXG5cdFx0dGhpcy5uYW1lRmlsZVRydW5jYXRlZCA9IHRoaXMuZm9ybWF0RnVuY3Rpb24oZmlsZS5uYW1lKTtcclxuXHJcblx0fVxyXG5cclxuXHRhZ2dpdW5naUZpbGUoZXZlbnQpIHtcclxuXHRcdHRoaXMudGlwb2xvZ2llRW1pdHRlbnRlJC5uZXh0KHRoaXMuZm9ybS52YWx1ZVtcInRpcG9sb2dpYUVtaXR0ZW50ZVwiXSk7XHJcblx0XHR0aGlzLm5vdGUkLm5leHQodGhpcy5mb3JtLnZhbHVlW1wibm90ZVwiXSk7XHJcblx0XHR0aGlzLmFkZEZpbGVzJC5uZXh0KGV2ZW50KTtcclxuXHRcdHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuXHRcdC8vdGhpcy5mb3JtLnJlc2V0KCk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgcmVzZXRGb3JtKCkge1xyXG5cdFx0dGhpcy5mb3JtLnJlc2V0KCk7XHJcblx0fVxyXG5cclxuXHRuZ09uRGlzdG9yeSgpIHtcclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcclxuXHR9XHJcblxyXG5cdGZvcm1hdEZ1bmN0aW9uKG5vbWVGaWxlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIG5vbWVGaWxlLmxlbmd0aCA+IDE4ID8gbm9tZUZpbGUuc3Vic3RyaW5nKDAsIDE4KSArICcuLi4nICsgbm9tZUZpbGUuc3Vic3RyaW5nKG5vbWVGaWxlLmxlbmd0aCwgbm9tZUZpbGUubGVuZ3RoIC0gNCkgOiBub21lRmlsZVxyXG5cdH1cclxuXHJcblx0cHVsaXNjaUZvcm0oKSB7XHJcblx0XHRPYmplY3Qua2V5cyh0aGlzLmZvcm0udmFsdWUpXHJcblx0XHRcdC5mb3JFYWNoKGNhbXBvID0+IHtcclxuXHRcdFx0XHR0aGlzLmZvcm0uZ2V0KGNhbXBvKS5zZXRWYWx1ZSgnJylcclxuXHRcdFx0fSk7XHJcblx0XHR0aGlzLmZpbGVzJC5uZXh0KG51bGwpO1xyXG5cdH1cclxufVxyXG4iXX0=