UNPKG

nsrtm-gestionarchivo-npm-prueba2

Version:

Proyecto de Libreria Frontend para la Gestión de Archivos

454 lines 77.6 kB
import { Component, Input } from '@angular/core';
import { NgbDate } from '@ng-bootstrap/ng-bootstrap';
import { parseStringDateFormatUser } from '../app/utils/calendar';
import { NsrtmDialogVisorDocumentoComponent } from './nsrtm-dialog-visor-documento/nsrtm-dialog-visor-documento.component';
import { MEGA_BYTES, PESO_MAXIMO_ARCHIVO_MODULO_ID, PESO_MAXIMO_TIPO_PARAMETRO_ID, PROCESO_MODULO_ID, TIPO_ARCHIVO_ID, } from './nsrtm-dialog-upload-files.utils';
import { BehaviorSubject, Subject, finalize, takeUntil, } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "../app/shared/alert/alert.service";
import * as i3 from "@ng-bootstrap/ng-bootstrap";
import * as i4 from "../app/core/services/validation-form.service";
import * as i5 from "../app/shared/dialog-confirm/dialog-confirm.service";
import * as i6 from "../app/shared/spinner/spinner.service";
import * as i7 from "../app/api/comunes-registro/services";
import * as i8 from "../app/api/parametro-comun/services";
import * as i9 from "../app/api/gestionarchivo/services";
import * as i10 from "@ng-select/ng-select";
import * as i11 from "@angular/common";
import * as i12 from "ngx-valdemort";
import * as i13 from "./nsrtm-grupo-botones-documento/nsrtm-grupo-botones-documento.component";
import * as i14 from "./nsrtm-tabla-documento/nsrtm-tabla-documento.component";
export class NsrtmDialogUploadFilesComponent {
    constructor(_fb, _alertService, _modalService, _activeModal, _validationFormService, _dialogConfirm, spinner, comunesRegistroController, parametroController, _gestionArchivoControllerService) {
        this._fb = _fb;
        this._alertService = _alertService;
        this._modalService = _modalService;
        this._activeModal = _activeModal;
        this._validationFormService = _validationFormService;
        this._dialogConfirm = _dialogConfirm;
        this.spinner = spinner;
        this.comunesRegistroController = comunesRegistroController;
        this.parametroController = parametroController;
        this._gestionArchivoControllerService = _gestionArchivoControllerService;
        this.showAgregar = true;
        this.showAnular = true;
        this.idMedioDigital = 0;
        this.pesoMaximoArchivo = 0;
        this.listaDocSustento = [];
        this.datasourceDocumentos = [];
        this.totalItems = 0;
        this._queryFilter = new BehaviorSubject(null);
        this.submitted = false;
        this.loading = false;
        this.onDestroy$ = new Subject();
    }
    ngOnInit() {
        localStorage.setItem("LIBRERIA", "1");
        this.obtenerPesoMaximoAnexo();
        this.obtenerParametroMedioDigital();
        this.obtenerDocSustento();
        this._crearFormulario();
        this.docSustento?.setValue(this.listaIdDocSustento);
        this._queryFilter.subscribe((query) => {
            //if (query) this._obtenerBusqueda(query);
        });
    }
    obtenerDocSustento() {
        this.comunesRegistroController
            .listarDocSustentoTipo({
            arr_tip_doc_sustento_id: this.listaIdDocSustento.toString(),
        })
            .pipe(takeUntil(this.onDestroy$))
            .subscribe({
            next: (response) => {
                if (response) {
                    this.listaDocSustento = response;
                }
            },
        });
    }
    obtenerParametroMedioDigital() {
        this.spinner.show();
        this.parametroController
            .consultar({
            aplicacionId: this.aplicacionId,
            parametroId: this.medioDigitalParametroId,
        })
            .pipe(takeUntil(this.onDestroy$), finalize(() => this.spinner.hide()))
            .subscribe({
            next: (response) => {
                if (response && response?.data) {
                    this.idMedioDigital = response.data?.valorNumerico;
                    this.obtenerDocsLaserfiche();
                }
            },
        });
    }
    obtenerPesoMaximoAnexo() {
        this.spinner.show();
        this.parametroController
            .consultarParametroGlobal({
            moduloId: PESO_MAXIMO_ARCHIVO_MODULO_ID,
            tipoParametroId: PESO_MAXIMO_TIPO_PARAMETRO_ID,
        })
            .pipe(takeUntil(this.onDestroy$), finalize(() => this.spinner.hide()))
            .subscribe({
            next: (response) => {
                if (response && response?.data) {
                    this.pesoMaximoArchivo = response.data?.valorNumerico;
                }
            },
        });
    }
    setFolio(item) {
        this.datasourceDocumentos[item.index - 1] = item;
    }
    obtenerDocsLaserfiche() {
        this.datasourceDocumentos = [];
        this._gestionArchivoControllerService
            .listarArchivos({
            numero_dec_liq: this.idDj,
            medio_digital_id: this.idMedioDigital,
            procesoModuloId: this.procesoModuloId,
            anio: Number(new Date().getFullYear()),
            campo2: this.procesoModuloId == PROCESO_MODULO_ID.DJ_CONDICION
                ? this.contribuyenteNumero.toString()
                : '',
            campo3: this.procesoModuloId == PROCESO_MODULO_ID.DJ_CONDICION
                ? this.condicionContribuyenteId.toString()
                : '',
        })
            .pipe(takeUntil(this.onDestroy$))
            .subscribe({
            next: (response) => {
                response.data?.forEach((it) => {
                    const extension = it.nombreOriginal?.split('.').pop();
                    const anio = Number(it.fecha?.split('/').pop());
                    this.datasourceDocumentos.push({
                        index: this.datasourceDocumentos.length + 1,
                        laserficheId: it.archivoId,
                        nombre: it.nombreOriginal ? it.nombreOriginal : '',
                        fechaUpload: it.fecha ? it.fecha : '',
                        tamanio: it.pesoArchivo ? it.pesoArchivo : 0,
                        anioUpload: anio ? anio : 0,
                        extension: extension ? extension : 'S/E',
                        folio: it.folio,
                    });
                });
                this.totalItems = this.datasourceDocumentos.length;
            },
        });
    }
    _crearFormulario() {
        this.formulario = this._fb.group({
            docSustento: [null],
        });
    }
    ngOnDestroy() {
        this.refSub?.unsubscribe();
    }
    onSubmit() {
        this.submitted = true;
        const data = this.datasourceDocumentos.filter((it) => !it.laserficheId);
        const docsSinFolios = this.datasourceDocumentos.filter((it) => it.folio == null || it.folio == undefined);
        if (!data.length) {
            this._alertService.error('Debe anexar al menos un nuevo documento.');
        }
        else {
            if (docsSinFolios.length) {
                this._alertService.error('Debe ingresar el número de folios.');
            }
            else
                this.guardarDocumentosAplicacion();
        }
    }
    guardarDocumentosAplicacion() {
        this.loading;
        let request = [];
        let listFiles = [];
        this.datasourceDocumentos.forEach((it) => {
            if (!it.laserficheId) {
                const tipoArchivo = TIPO_ARCHIVO_ID.find((tipo) => tipo.key == it.extension);
                request.push({
                    anio: it.anioUpload,
                    directorioId: this.directorioId,
                    tipoProcesoId: this.tipoProcesoId,
                    procesoModuloId: this.procesoModuloId,
                    tipoArchivoId: tipoArchivo?.value,
                    version: this.version,
                    folio: it.folio,
                    idDJ: this.idDj,
                    medioDigitalId: this.idMedioDigital,
                    tipoArchivoDigitalId: this.tipoArchivoDigitalId,
                    campo2: this.procesoModuloId == PROCESO_MODULO_ID.DJ_CONDICION
                        ? this.contribuyenteNumero
                        : null,
                    campo3: this.procesoModuloId == PROCESO_MODULO_ID.DJ_CONDICION
                        ? this.condicionContribuyenteId
                        : null,
                });
                if (it.file)
                    listFiles.push(it.file);
            }
        });
        this.spinner.show();
        this._gestionArchivoControllerService
            .cargarArchivosMasivo({
            body: {
                request: JSON.stringify(request),
                files: listFiles,
            },
        })
            .pipe(finalize(() => this.spinner.hide()), takeUntil(this.onDestroy$))
            .subscribe({
            next: (response) => {
                this.close(this.datasourceDocumentos);
            },
        });
    }
    close(response) {
        this._activeModal.close(response);
    }
    esControlInvalido(input) {
        return (input &&
            this._validationFormService.isControlInvalid(input, this.submitted));
    }
    onSeleccionarDocumento(documento) {
        this.documentoSeleccionado = documento;
    }
    onChangePaginacion(event) {
        const merge = {
            //...this.actualFiltro,
            page: event.page,
            pageSize: event.pageSize,
        };
        this._queryFilter.next(merge);
        this.limpiarItemSeleccionado();
    }
    limpiarItemSeleccionado() {
        this.documentoSeleccionado = undefined;
    }
    onCrearDocumento(file) {
        const extension = file.name.split('.').pop()?.toUpperCase();
        const tipoArchivo = TIPO_ARCHIVO_ID.find((tipo) => tipo.key == extension);
        if (!tipoArchivo) {
            this._alertService.error('Solo se puede anexar archivos con extension PDF, DOCX, DOC, XLSX, XLS, JPEG, ZIP, RAR o JPG.');
            return;
        }
        if (file.size > this.pesoMaximoArchivo * MEGA_BYTES) {
            this._alertService.error('Solo se puede anexar archivos con peso máximo a ' +
                this.pesoMaximoArchivo +
                'Mb.');
            return;
        }
        const reader = new FileReader();
        reader.onload = () => {
            if (reader.result) {
                var blob = new Blob([reader.result]);
                const date = new Date();
                let doc = {
                    index: this.datasourceDocumentos.length + 1,
                    nombre: file.name,
                    contenido: blob,
                    fechaUpload: parseStringDateFormatUser(new NgbDate(date.getFullYear(), date.getMonth(), date.getDay())),
                    anioUpload: date.getFullYear(),
                    tamanio: file.size,
                    extension: extension ? extension.toUpperCase() : 'S/E',
                    file: file,
                };
                this.datasourceDocumentos.push(doc);
                this.totalItems = this.datasourceDocumentos.length;
            }
        };
        if (file) {
            reader.readAsArrayBuffer(file);
        }
    }
    onDescargarDocumento(documento) {
        if (!documento.laserficheId) {
            this.descargarDocumentoMemoria(documento);
        }
        else {
            this.descargarDocumentoLaserfiche(documento);
        }
    }
    descargarDocumentoMemoria(documento) {
        var blob = documento.contenido;
        if (blob) {
            const a = document.createElement('a');
            const objectUrl = URL.createObjectURL(blob);
            a.href = objectUrl;
            a.download = documento.nombre ? documento.nombre : '';
            a.click();
            URL.revokeObjectURL(objectUrl);
        }
    }
    descargarDocumentoLaserfiche(documento) {
        this._gestionArchivoControllerService
            .obtenerContenidoArchivoPorId({
            id_archivo: Number(documento.laserficheId),
            anio: documento.anioUpload,
        })
            .pipe(takeUntil(this.onDestroy$))
            .subscribe({
            next: (response) => {
                if (response) {
                    const a = document.createElement('a');
                    const objectUrl = URL.createObjectURL(response);
                    a.href = objectUrl;
                    a.download = documento.nombre ? documento.nombre : '';
                    a.click();
                    URL.revokeObjectURL(objectUrl);
                }
            },
        });
    }
    onVerDocumento(documento) {
        if (!documento.laserficheId) {
            this.verDocumentoMemoria(documento);
        }
        else {
            this.verDocumentoLaserfiche(documento);
        }
    }
    verDocumentoMemoria(documento) {
        var blob = documento.contenido;
        if (blob) {
            const modalRef = this._modalService.open(NsrtmDialogVisorDocumentoComponent, {
                centered: true,
                backdrop: 'static',
                keyboard: false,
                fullscreen: true,
                scrollable: true,
                size: 'xl',
            });
            modalRef.componentInstance.contenido = blob;
            modalRef.componentInstance.extension = documento.extension;
            modalRef.closed.subscribe({
                next: (response) => {
                    if (response) {
                    }
                },
                error: (error) => {
                    this._alertService.error(error.message);
                },
            });
        }
    }
    verDocumentoLaserfiche(documento) {
        this._gestionArchivoControllerService
            .obtenerContenidoArchivoPorId({
            id_archivo: Number(documento.laserficheId),
            anio: documento.anioUpload,
        })
            .pipe(takeUntil(this.onDestroy$))
            .subscribe({
            next: (response) => {
                if (response) {
                    const modalRef = this._modalService.open(NsrtmDialogVisorDocumentoComponent, {
                        centered: true,
                        backdrop: 'static',
                        keyboard: false,
                        size: 'lg',
                    });
                    modalRef.componentInstance.contenido = response;
                    modalRef.componentInstance.extension = documento.extension;
                    modalRef.closed.subscribe({
                        next: (response) => {
                            if (response) {
                            }
                        },
                        error: (error) => {
                            this._alertService.error(error.message);
                        },
                    });
                }
            },
        });
    }
    onAnularDocumento(documento) {
        this._dialogConfirm
            .confirm({
            title: '¿Cancelar el documento anexo?',
            message: '',
        })
            .closed.subscribe({
            next: (response) => {
                if (response) {
                    if (!documento.laserficheId) {
                        this.anularDocumentoMemoria(documento);
                    }
                    else {
                        this.anularDocumentoLaserfiche(documento);
                    }
                }
            },
        });
    }
    anularDocumentoMemoria(documento) {
        this.datasourceDocumentos.splice(documento.index - 1, 1);
        this.datasourceDocumentos.forEach((it, index) => {
            it.index = index + 1;
        });
        this.documentoSeleccionado = undefined;
    }
    anularDocumentoLaserfiche(documento) {
        this._gestionArchivoControllerService
            .anularArchivo({
            archivoId: Number(documento.laserficheId),
            anio: documento.anioUpload,
        })
            .pipe(takeUntil(this.onDestroy$))
            .subscribe({
            next: (response) => {
                if (response) {
                    this._alertService.success(response.message);
                    this.obtenerDocsLaserfiche();
                }
            },
        });
    }
    get page() {
        return this._queryFilter.value?.page;
    }
    get pageSize() {
        return this._queryFilter.value?.pageSize;
    }
    get docSustento() {
        return this.formulario.get('docSustento');
    }
}
NsrtmDialogUploadFilesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NsrtmDialogUploadFilesComponent, deps: [{ token: i1.FormBuilder }, { token: i2.AlertService }, { token: i3.NgbModal }, { token: i3.NgbActiveModal }, { token: i4.ValidationFormService }, { token: i5.DialogConfirmService }, { token: i6.SpinnerService }, { token: i7.ComunesRegistroControllerService }, { token: i8.ParametroComunControllerService }, { token: i9.GestionArchivoControllerService }], target: i0.ɵɵFactoryTarget.Component });
NsrtmDialogUploadFilesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: NsrtmDialogUploadFilesComponent, selector: "app-nsrtm-dialog-upload-files", inputs: { directorioId: "directorioId", tipoProcesoId: "tipoProcesoId", procesoModuloId: "procesoModuloId", aplicacionId: "aplicacionId", medioDigitalParametroId: "medioDigitalParametroId", version: "version", idDj: "idDj", contribuyenteNumero: "contribuyenteNumero", condicionContribuyenteId: "condicionContribuyenteId", tipoArchivoDigitalId: "tipoArchivoDigitalId", listaIdDocSustento: "listaIdDocSustento", showAgregar: "showAgregar", showAnular: "showAnular" }, ngImport: i0, template: "<div class=\"modal-header\">\r\n\t<h6 class=\"modal-title w-100\" id=\"title\">Documentoooos anexos</h6>\r\n\t<button\r\n\t\ttype=\"button\"\r\n\t\tclass=\"btn-close\"\r\n\t\taria-label=\"Close\"\r\n\t\t(click)=\"close()\"\r\n\t></button>\r\n</div>\r\n<div class=\"modal-body\">\r\n\t<div class=\"siaf-card shadow-none p-0\">\r\n\t\t<div class=\"container-fluid px-0\">\r\n\t\t\t<div class=\"row gx-3 align-items-baseline\"></div>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"siaf-card\">\r\n\t\t<div class=\"p-content d-flex justify-content-between align-items-center\">\r\n\t\t\t<span class=\"title-group-uppercase\">Listado de documentos anexos</span>\r\n\t\t\t<app-nsrtm-grupo-botones-documento\r\n\t\t\t\t[showAgregar]=\"showAgregar\"\r\n\t\t\t\t[showAnular]=\"showAnular\"\r\n\t\t\t\t[itemSeleccionado]=\"documentoSeleccionado\"\r\n\t\t\t\t(crear)=\"onCrearDocumento($event)\"\r\n\t\t\t\t(ver)=\"onVerDocumento($event)\"\r\n\t\t\t\t(descargar)=\"onDescargarDocumento($event)\"\r\n\t\t\t\t(anular)=\"onAnularDocumento($event)\"\r\n\t\t\t>\r\n\t\t\t</app-nsrtm-grupo-botones-documento>\r\n\t\t</div>\r\n\t\t<app-nsrtm-tabla-documento\r\n\t\t\t[datasource]=\"datasourceDocumentos\"\r\n\t\t\t[loading]=\"loading\"\r\n\t\t\t[totalItems]=\"totalItems\"\r\n\t\t\t[page]=\"page!\"\r\n\t\t\t[pageSize]=\"pageSize!\"\r\n\t\t\t[filaSeleccionada]=\"documentoSeleccionado\"\r\n\t\t\t(seleccionar)=\"onSeleccionarDocumento($event)\"\r\n\t\t\t(setFolio)=\"setFolio($event)\"\r\n\t\t\t(paginar)=\"onChangePaginacion($event)\"\r\n\t\t>\r\n\t\t</app-nsrtm-tabla-documento>\r\n\t</div>\r\n\t<br />\r\n\t<div class=\"siaf-card mt-1\">\r\n\t\t<form [formGroup]=\"formulario\" autocomplete=\"off\">\r\n\t\t\t<div class=\"container-fluid px-0\">\r\n\t\t\t\t<ng-container *ngIf=\"listaDocSustento.length > 0\">\r\n\t\t\t\t\t<div class=\"col-12 mb-1\">\r\n\t\t\t\t\t\t<span class=\"title-group-uppercase\"\r\n\t\t\t\t\t\t\t>DOCUMENTOS DE SUSTENTO</span\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"row gx-3 align-items-baseline\">\r\n\t\t\t\t\t\t<div class=\"col-12 col-sm-6 col-md-9\">\r\n\t\t\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t\t\t<label class=\"form-label\" for=\"docSustento\"\r\n\t\t\t\t\t\t\t\t\t>Documento(s) de sustento</label\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<ng-select\r\n\t\t\t\t\t\t\t\t\tid=\"docSustento\"\r\n\t\t\t\t\t\t\t\t\tformControlName=\"docSustento\"\r\n\t\t\t\t\t\t\t\t\tbindValue=\"maestroId\"\r\n\t\t\t\t\t\t\t\t\tbindLabel=\"descripcion\"\r\n\t\t\t\t\t\t\t\t\t[searchable]=\"false\"\r\n\t\t\t\t\t\t\t\t\t[clearable]=\"false\"\r\n\t\t\t\t\t\t\t\t\t[multiple]=\"true\"\r\n\t\t\t\t\t\t\t\t\t[items]=\"listaDocSustento\"\r\n\t\t\t\t\t\t\t\t\t[closeOnSelect]=\"false\"\r\n\t\t\t\t\t\t\t\t\t[readonly]=\"true\"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<ng-template\r\n\t\t\t\t\t\t\t\t\t\tng-option-tmp\r\n\t\t\t\t\t\t\t\t\t\tlet-item=\"item\"\r\n\t\t\t\t\t\t\t\t\t\tlet-item$=\"item$\"\r\n\t\t\t\t\t\t\t\t\t\tlet-index=\"index\"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\t\t\tid=\"item-sustento-{{ index }}\"\r\n\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\r\n\t\t\t\t\t\t\t\t\t\t\t[checked]=\"item$.selected\"\r\n\t\t\t\t\t\t\t\t\t\t\tclass=\"form-check-input\"\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t{{ item.descripcion }}\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-select>\r\n\t\t\t\t\t\t\t\t<val-errors controlName=\"docSustento\"></val-errors>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</ng-container>\r\n\t\t\t</div>\r\n\t\t</form>\r\n\t</div>\r\n</div>\r\n<div class=\"modal-footer\">\r\n\t<button\r\n\t\ttype=\"button\"\r\n\t\tclass=\"btn-cancel\"\r\n\t\tdata-dismiss=\"modal\"\r\n\t\t(click)=\"close()\"\r\n\t>\r\n\t\t<span class=\"feather icon-x me-1\"></span>\r\n\t\tCancelar\r\n\t</button>\r\n\t<button\r\n\t\ttype=\"button\"\r\n\t\tclass=\"btn btn-primary\"\r\n\t\t[disabled]=\"loading\"\r\n\t\tngbAutofocus\r\n\t\t(click)=\"onSubmit()\"\r\n\t>\r\n\t\t<span\r\n\t\t\tclass=\"feather icon-save me-1\"\r\n\t\t\t*ngIf=\"!loading; else iconLoading\"\r\n\t\t></span>\r\n\t\t<ng-template #iconLoading>\r\n\t\t\t<div class=\"spinner-border spinner-border-sm me-2\" role=\"status\"></div>\r\n\t\t</ng-template>\r\n\t\t{{ loading ? \"Grabando...\" : \"Grabar\" }}\r\n\t</button>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "component", type: i10.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i10.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i12.ValidationErrorsComponent, selector: "val-errors", inputs: ["control", "controlName", "label"] }, { kind: "component", type: i13.NsrtmGrupoBotonesDocumentoComponent, selector: "app-nsrtm-grupo-botones-documento", inputs: ["showAgregar", "showAnular", "itemSeleccionado"], outputs: ["crear", "ver", "descargar", "anular"] }, { kind: "component", type: i14.NsrtmTablaDocumentoComponent, selector: "app-nsrtm-tabla-documento", inputs: ["datasource", "loading", "totalItems", "page", "pageSize", "filaSeleccionada"], outputs: ["seleccionar", "paginar", "setFolio"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NsrtmDialogUploadFilesComponent, decorators: [{
            type: Component,
            args: [{ selector: 'app-nsrtm-dialog-upload-files', template: "<div class=\"modal-header\">\r\n\t<h6 class=\"modal-title w-100\" id=\"title\">Documentoooos anexos</h6>\r\n\t<button\r\n\t\ttype=\"button\"\r\n\t\tclass=\"btn-close\"\r\n\t\taria-label=\"Close\"\r\n\t\t(click)=\"close()\"\r\n\t></button>\r\n</div>\r\n<div class=\"modal-body\">\r\n\t<div class=\"siaf-card shadow-none p-0\">\r\n\t\t<div class=\"container-fluid px-0\">\r\n\t\t\t<div class=\"row gx-3 align-items-baseline\"></div>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"siaf-card\">\r\n\t\t<div class=\"p-content d-flex justify-content-between align-items-center\">\r\n\t\t\t<span class=\"title-group-uppercase\">Listado de documentos anexos</span>\r\n\t\t\t<app-nsrtm-grupo-botones-documento\r\n\t\t\t\t[showAgregar]=\"showAgregar\"\r\n\t\t\t\t[showAnular]=\"showAnular\"\r\n\t\t\t\t[itemSeleccionado]=\"documentoSeleccionado\"\r\n\t\t\t\t(crear)=\"onCrearDocumento($event)\"\r\n\t\t\t\t(ver)=\"onVerDocumento($event)\"\r\n\t\t\t\t(descargar)=\"onDescargarDocumento($event)\"\r\n\t\t\t\t(anular)=\"onAnularDocumento($event)\"\r\n\t\t\t>\r\n\t\t\t</app-nsrtm-grupo-botones-documento>\r\n\t\t</div>\r\n\t\t<app-nsrtm-tabla-documento\r\n\t\t\t[datasource]=\"datasourceDocumentos\"\r\n\t\t\t[loading]=\"loading\"\r\n\t\t\t[totalItems]=\"totalItems\"\r\n\t\t\t[page]=\"page!\"\r\n\t\t\t[pageSize]=\"pageSize!\"\r\n\t\t\t[filaSeleccionada]=\"documentoSeleccionado\"\r\n\t\t\t(seleccionar)=\"onSeleccionarDocumento($event)\"\r\n\t\t\t(setFolio)=\"setFolio($event)\"\r\n\t\t\t(paginar)=\"onChangePaginacion($event)\"\r\n\t\t>\r\n\t\t</app-nsrtm-tabla-documento>\r\n\t</div>\r\n\t<br />\r\n\t<div class=\"siaf-card mt-1\">\r\n\t\t<form [formGroup]=\"formulario\" autocomplete=\"off\">\r\n\t\t\t<div class=\"container-fluid px-0\">\r\n\t\t\t\t<ng-container *ngIf=\"listaDocSustento.length > 0\">\r\n\t\t\t\t\t<div class=\"col-12 mb-1\">\r\n\t\t\t\t\t\t<span class=\"title-group-uppercase\"\r\n\t\t\t\t\t\t\t>DOCUMENTOS DE SUSTENTO</span\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"row gx-3 align-items-baseline\">\r\n\t\t\t\t\t\t<div class=\"col-12 col-sm-6 col-md-9\">\r\n\t\t\t\t\t\t\t<div class=\"form-group\">\r\n\t\t\t\t\t\t\t\t<label class=\"form-label\" for=\"docSustento\"\r\n\t\t\t\t\t\t\t\t\t>Documento(s) de sustento</label\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<ng-select\r\n\t\t\t\t\t\t\t\t\tid=\"docSustento\"\r\n\t\t\t\t\t\t\t\t\tformControlName=\"docSustento\"\r\n\t\t\t\t\t\t\t\t\tbindValue=\"maestroId\"\r\n\t\t\t\t\t\t\t\t\tbindLabel=\"descripcion\"\r\n\t\t\t\t\t\t\t\t\t[searchable]=\"false\"\r\n\t\t\t\t\t\t\t\t\t[clearable]=\"false\"\r\n\t\t\t\t\t\t\t\t\t[multiple]=\"true\"\r\n\t\t\t\t\t\t\t\t\t[items]=\"listaDocSustento\"\r\n\t\t\t\t\t\t\t\t\t[closeOnSelect]=\"false\"\r\n\t\t\t\t\t\t\t\t\t[readonly]=\"true\"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<ng-template\r\n\t\t\t\t\t\t\t\t\t\tng-option-tmp\r\n\t\t\t\t\t\t\t\t\t\tlet-item=\"item\"\r\n\t\t\t\t\t\t\t\t\t\tlet-item$=\"item$\"\r\n\t\t\t\t\t\t\t\t\t\tlet-index=\"index\"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<input\r\n\t\t\t\t\t\t\t\t\t\t\tid=\"item-sustento-{{ index }}\"\r\n\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\r\n\t\t\t\t\t\t\t\t\t\t\t[checked]=\"item$.selected\"\r\n\t\t\t\t\t\t\t\t\t\t\tclass=\"form-check-input\"\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t{{ item.descripcion }}\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-select>\r\n\t\t\t\t\t\t\t\t<val-errors controlName=\"docSustento\"></val-errors>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</ng-container>\r\n\t\t\t</div>\r\n\t\t</form>\r\n\t</div>\r\n</div>\r\n<div class=\"modal-footer\">\r\n\t<button\r\n\t\ttype=\"button\"\r\n\t\tclass=\"btn-cancel\"\r\n\t\tdata-dismiss=\"modal\"\r\n\t\t(click)=\"close()\"\r\n\t>\r\n\t\t<span class=\"feather icon-x me-1\"></span>\r\n\t\tCancelar\r\n\t</button>\r\n\t<button\r\n\t\ttype=\"button\"\r\n\t\tclass=\"btn btn-primary\"\r\n\t\t[disabled]=\"loading\"\r\n\t\tngbAutofocus\r\n\t\t(click)=\"onSubmit()\"\r\n\t>\r\n\t\t<span\r\n\t\t\tclass=\"feather icon-save me-1\"\r\n\t\t\t*ngIf=\"!loading; else iconLoading\"\r\n\t\t></span>\r\n\t\t<ng-template #iconLoading>\r\n\t\t\t<div class=\"spinner-border spinner-border-sm me-2\" role=\"status\"></div>\r\n\t\t</ng-template>\r\n\t\t{{ loading ? \"Grabando...\" : \"Grabar\" }}\r\n\t</button>\r\n</div>\r\n" }]
        }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.AlertService }, { type: i3.NgbModal }, { type: i3.NgbActiveModal }, { type: i4.ValidationFormService }, { type: i5.DialogConfirmService }, { type: i6.SpinnerService }, { type: i7.ComunesRegistroControllerService }, { type: i8.ParametroComunControllerService }, { type: i9.GestionArchivoControllerService }]; }, propDecorators: { directorioId: [{
                type: Input
            }], tipoProcesoId: [{
                type: Input
            }], procesoModuloId: [{
                type: Input
            }], aplicacionId: [{
                type: Input
            }], medioDigitalParametroId: [{
                type: Input
            }], version: [{
                type: Input
            }], idDj: [{
                type: Input
            }], contribuyenteNumero: [{
                type: Input
            }], condicionContribuyenteId: [{
                type: Input
            }], tipoArchivoDigitalId: [{
                type: Input
            }], listaIdDocSustento: [{
                type: Input
            }], showAgregar: [{
                type: Input
            }], showAnular: [{
                type: Input
            }] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnNydG0tZGlhbG9nLXVwbG9hZC1maWxlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9hcmNoaXZvL25zcnRtLWdlc3Rpb25hcmNoaXZvLW5wbS9zcmMvbnNydG0tZGlhbG9nLXVwbG9hZC1maWxlcy9uc3J0bS1kaWFsb2ctdXBsb2FkLWZpbGVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL2FyY2hpdm8vbnNydG0tZ2VzdGlvbmFyY2hpdm8tbnBtL3NyYy9uc3J0bS1kaWFsb2ctdXBsb2FkLWZpbGVzL25zcnRtLWRpYWxvZy11cGxvYWQtZmlsZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFekQsT0FBTyxFQUFrQixPQUFPLEVBQVksTUFBTSw0QkFBNEIsQ0FBQztBQVcvRSxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQTtBQUMvRCxPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSx1RUFBdUUsQ0FBQTtBQUN4SCxPQUFPLEVBR04sVUFBVSxFQUNWLDZCQUE2QixFQUM3Qiw2QkFBNkIsRUFDN0IsaUJBQWlCLEVBQ2pCLGVBQWUsR0FDZixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFDTixlQUFlLEVBQ2YsT0FBTyxFQUVQLFFBQVEsRUFDUixTQUFTLEdBQ1QsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZZCxNQUFNLE9BQU8sK0JBQStCO0lBMEQxQyxZQUNVLEdBQWdCLEVBQ2xCLGFBQTJCLEVBQzNCLGFBQXVCLEVBQ3hCLFlBQTRCLEVBQzNCLHNCQUE2QyxFQUM3QyxjQUFvQyxFQUNwQyxPQUF1QixFQUN2Qix5QkFBMkQsRUFDM0QsbUJBQW9ELEVBQ3BELGdDQUFpRTtRQVQvRCxRQUFHLEdBQUgsR0FBRyxDQUFhO1FBQ2xCLGtCQUFhLEdB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O2dCQUN2QixJQUFJLFFBQVEsRUFBRTtvQkFDYixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQzdDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2lCQUM3QjtZQUNGLENBQUM7U0FDRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ1AsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQUksUUFBUTtRQUNYLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDZCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzNDLENBQUM7OzRIQW5nQlcsK0JBQStCO2dIQUEvQiwrQkFBK0IsdWhCQzFDNUMsd3VJQXlIQTsyRkQvRWEsK0JBQStCO2tCQUwzQyxTQUFTOytCQUNFLCtCQUErQjtnYUFPMUMsWUFBWTtzQkFEVixLQUFLO2dCQUlQLGFBQWE7c0JBRFosS0FBSztnQkFJTixlQUFlO3NCQURkLEtBQUs7Z0JBSU4sWUFBWTtzQkFEWCxLQUFLO2dCQUlOLHVCQUF1QjtzQkFEdEIsS0FBSztnQkFJTixPQUFPO3NCQUROLEtBQUs7Z0JBSU4sSUFBSTtzQkFESCxLQUFLO2dCQUlOLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFJTix3QkFBd0I7c0JBRHZCLEtBQUs7Z0JBSU4sb0JBQW9CO3NCQURuQixLQUFLO2dCQUlOLGtCQUFrQjtzQkFEakIsS0FBSztnQkFJTixXQUFXO3NCQURWLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwsIE5nYkRhdGUsIE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi9hcHAvc2hhcmVkL2FsZXJ0L2FsZXJ0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uRm9ybVNlcnZpY2UgfSBmcm9tICcuLi9hcHAvY29yZS9zZXJ2aWNlcy92YWxpZGF0aW9uLWZvcm0uc2VydmljZSc7XHJcbmltcG9ydCB7RGlhbG9nQ29uZmlybVNlcnZpY2V9IGZyb20gJy4uL2FwcC9zaGFyZWQvZGlhbG9nLWNvbmZpcm0vZGlhbG9nLWNvbmZpcm0uc2VydmljZSc7XHJcbmltcG9ydCB7U3Bpbm5lclNlcnZpY2V9IGZyb20gJy4uL2FwcC9zaGFyZWQvc3Bpbm5lci9zcGlubmVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge0NvbXVuZXNSZWdpc3Ryb0NvbnRyb2xsZXJTZXJ2aWNlfSBmcm9tICcuLi9hcHAvYXBpL2NvbXVuZXMtcmVnaXN0cm8vc2VydmljZXMnO1xyXG5pbXBvcnQge1BhcmFtZXRyb0NvbXVuQ29udHJvbGxlclNlcnZpY2V9IGZyb20gJy4uL2FwcC9hcGkvcGFyYW1ldHJvLWNvbXVuL3NlcnZpY2VzJztcclxuaW1wb3J0IHtHZXN0aW9uQXJjaGl2b0NvbnRyb2xsZXJTZXJ2aWNlfSBmcm9tICcuLi9hcHAvYXBpL2dlc3Rpb25hcmNoaXZvL3NlcnZpY2VzJztcclxuaW1wb3J0IHtEb2N1bWVudG9UaXBvUHJvamVjdGlvbn0gZnJvbSAnLi4vYXBwL2FwaS9jb211bmVzLXJlZ2lzdHJvL21vZGVscydcclxuaW1wb3J0IHtDdXN0b21QYWdlRGF0b3NBcmNoaXZvUHJvamVjdGlvbixEYXRvc0FyY2hpdm9Qcm9qZWN0aW9ufSBmcm9tICcuLi9hcHAvYXBpL2dlc3Rpb25hcmNoaXZvL21vZGVscydcclxuaW1wb3J0IHtJQ2hhbmdlUGFnaW5hdGV9IGZyb20gJy4uL2FwcC9zaGFyZWQvdGFibGUtZm9vdGVyLXBhZ2luYXRpb24vdGFibGUtZm9vdGVyLXBhZ2luYXRpb24uY29tcG9uZW50J1xyXG5pbXBvcnQge3BhcnNlU3RyaW5nRGF0ZUZvcm1hdFVzZXJ9IGZyb20gJy4uL2FwcC91dGlscy9jYWxlbmRhcidcclxuaW1wb3J0IHtOc3J0bURpYWxvZ1Zpc29yRG9jdW1lbnRvQ29tcG9uZW50fSBmcm9tICcuL25zcnRtLWRpYWxvZy12aXNvci1kb2N1bWVudG8vbnNydG0tZGlhbG9nLXZpc29yLWRvY3VtZW50by5jb21wb25lbnQnXHJcbmltcG9ydCB7XHJcblx0RG9jU3VzdGVudG9Nb2RlbCxcclxuXHREb2N1bWVudG9UYWJsYSxcclxuXHRNRUdBX0JZVEVTLFxyXG5cdFBFU09fTUFYSU1PX0FSQ0hJVk9fTU9EVUxPX0lELFxyXG5cdFBFU09fTUFYSU1PX1RJUE9fUEFSQU1FVFJPX0lELFxyXG5cdFBST0NFU09fTU9EVUxPX0lELFxyXG5cdFRJUE9fQVJDSElWT19JRCxcclxufSBmcm9tICcuL25zcnRtLWRpYWxvZy11cGxvYWQtZmlsZXMudXRpbHMnO1xyXG5pbXBvcnQge1xyXG5cdEJlaGF2aW9yU3ViamVjdCxcclxuXHRTdWJqZWN0LFxyXG5cdFN1YnNjcmlwdGlvbixcclxuXHRmaW5hbGl6ZSxcclxuXHR0YWtlVW50aWwsXHJcbn0gZnJvbSAncnhqcyc7XHJcblxyXG50eXBlIElRdWVyeUZpbHRlciA9IHt9ICYge1xyXG5cdHBhZ2U6IG51bWJlcjtcclxuXHRwYWdlU2l6ZT86IG51bWJlcjtcclxufTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLW5zcnRtLWRpYWxvZy11cGxvYWQtZmlsZXMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uc3J0bS1kaWFsb2ctdXBsb2FkLWZpbGVzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9uc3J0bS1kaWFsb2ctdXBsb2FkLWZpbGVzLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTnNydG1EaWFsb2dVcGxvYWRGaWxlc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBJbnB1dCgpXHJcblx0ZGlyZWN0b3Jpb0lkITogbnVtYmVyO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHRpcG9Qcm9jZXNvSWQhOiBudW1iZXI7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0cHJvY2Vzb01vZHVsb0lkITogbnVtYmVyO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdGFwbGljYWNpb25JZCE6IG51bWJlcjtcclxuXHJcblx0QElucHV0KClcclxuXHRtZWRpb0RpZ2l0YWxQYXJhbWV0cm9JZCE6IG51bWJlcjtcclxuXHJcblx0QElucHV0KClcclxuXHR2ZXJzaW9uITogbnVtYmVyO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdGlkRGohOiBudW1iZXI7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0Y29udHJpYnV5ZW50ZU51bWVybyE6IG51bWJlcjtcclxuXHJcblx0QElucHV0KClcclxuXHRjb25kaWNpb25Db250cmlidXllbnRlSWQhOiBudW1iZXI7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0dGlwb0FyY2hpdm9EaWdpdGFsSWQhOiBudW1iZXI7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0bGlzdGFJZERvY1N1c3RlbnRvITogbnVtYmVyW107XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0c2hvd0FncmVnYXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHNob3dBbnVsYXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHRpZE1lZGlvRGlnaXRhbDogbnVtYmVyID0gMDtcclxuXHRwZXNvTWF4aW1vQXJjaGl2bzogbnVtYmVyID0gMDtcclxuXHRsaXN0YURvY1N1c3RlbnRvOiBEb2NTdXN0ZW50b01vZGVsW10gPSBbXTtcclxuXHRkYXRhc291cmNlRG9jdW1lbnRvczogRG9jdW1lbnRvVGFibGFbXSA9IFtdO1xyXG5cdGRvY3VtZW50b1NlbGVjY2lvbmFkbz86IERvY3VtZW50b1RhYmxhO1xyXG5cdHRvdGFsSXRlbXMgPSAwO1xyXG5cdHByaXZhdGUgX3F1ZXJ5RmlsdGVyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJUXVlcnlGaWx0ZXIgfCBudWxsPihudWxsKTtcclxuXHJcblx0c3VibWl0dGVkID0gZmFsc2U7XHJcblx0bG9hZGluZyA9IGZhbHNlO1xyXG5cclxuXHRyZWZTdWIhOiBTdWJzY3JpcHRpb247XHJcblxyXG5cdGZvcm11bGFyaW8hOiBGb3JtR3JvdXA7XHJcblxyXG5cdG9uRGVzdHJveSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX2ZiOiBGb3JtQnVpbGRlcixcclxuXHRcdHByaXZhdGUgX2FsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBfbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuXHRcdHB1YmxpYyBfYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxyXG5cdFx0cHJpdmF0ZSBfdmFsaWRhdGlvbkZvcm1TZXJ2aWNlOiBWYWxpZGF0aW9uRm9ybVNlcnZpY2UsXHJcblx0XHRwcml2YXRlIF9kaWFsb2dDb25maXJtOiBEaWFsb2dDb25maXJtU2VydmljZSxcclxuXHRcdHByaXZhdGUgc3Bpbm5lcjogU3Bpbm5lclNlcnZpY2UsXHJcblx0XHRwcml2YXRlIGNvbXVuZXNSZWdpc3Ryb0NvbnRyb2xsZXI6IENvbXVuZXNSZWdpc3Ryb0NvbnRyb2xsZXJTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBwYXJhbWV0cm9Db250cm9sbGVyOiBQYXJhbWV0cm9Db211bkNvbnRyb2xsZXJTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBfZ2VzdGlvbkFyY2hpdm9Db250cm9sbGVyU2VydmljZTogR2VzdGlvbkFyY2hpdm9Db250cm9sbGVyU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG5cdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJMSUJSRVJJQVwiLFwiMVwiKTtcclxuXHRcdHRoaXMub2J0ZW5lclBlc29NYXhpbW9BbmV4bygpO1xyXG5cdFx0dGhpcy5vYnRlbmVyUGFyYW1ldHJvTWVkaW9EaWdpdGFsKCk7XHJcblx0XHR0aGlzLm9idGVuZXJEb2NTdXN0ZW50bygpO1xyXG5cdFx0dGhpcy5fY3JlYXJGb3JtdWxhcmlvKCk7XHJcblx0XHR0aGlzLmRvY1N1c3RlbnRvPy5zZXRWYWx1ZSh0aGlzLmxpc3RhSWREb2NTdXN0ZW50byk7XHJcblx0XHR0aGlzLl9xdWVyeUZpbHRlci5zdWJzY3JpYmUoKHF1ZXJ5OiBhbnkpID0+IHtcclxuXHRcdFx0Ly9pZiAocXVlcnkpIHRoaXMuX29idGVuZXJCdXNxdWVkYShxdWVyeSk7XHJcblx0XHR9KTtcclxuXHRcdFxyXG5cdH1cclxuXHJcblx0b2J0ZW5lckRvY1N1c3RlbnRvKCkge1xyXG5cdFx0dGhpcy5jb211bmVzUmVnaXN0cm9Db250cm9sbGVyXHJcblx0XHRcdC5saXN0YXJEb2NTdXN0ZW50b1RpcG8oe1xyXG5cdFx0XHRcdGFycl90aXBfZG9jX3N1c3RlbnRvX2lkOiB0aGlzLmxpc3RhSWREb2NTdXN0ZW50by50b1N0cmluZygpLFxyXG5cdFx0XHR9KVxyXG5cdFx0XHQucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSlcclxuXHRcdFx0LnN1YnNjcmliZSh7XHJcblx0XHRcdFx0bmV4dDogKHJlc3BvbnNlOiBBcnJheTxEb2N1bWVudG9UaXBvUHJvamVjdGlvbj4pID0+IHtcclxuXHRcdFx0XHRcdGlmIChyZXNwb25zZSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmxpc3RhRG9jU3VzdGVudG8gPSByZXNwb25zZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHR9KTtcclxuXHR9XHJcblxyXG5cdG9idGVuZXJQYXJhbWV0cm9NZWRpb0RpZ2l0YWwoKSB7XHJcblx0XHR0aGlzLnNwaW5uZXIuc2hvdygpO1xyXG5cdFx0dGhpcy5wYXJhbWV0cm9Db250cm9sbGVyXHJcblx0XHRcdC5jb25zdWx0YXIoe1xyXG5cdFx0XHRcdGFwbGljYWNpb25JZDogdGhpcy5hcGxpY2FjaW9uSWQsXHJcblx0XHRcdFx0cGFyYW1ldHJvSWQ6IHRoaXMubWVkaW9EaWdpdGFsUGFyYW1ldHJvSWQsXHJcblx0XHRcdH0pXHJcblx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpLFxyXG5cdFx0XHRcdGZpbmFsaXplKCgpID0+IHRoaXMuc3Bpbm5lci5oaWRlKCkpXHJcblx0XHRcdClcclxuXHRcdFx0LnN1YnNjcmliZSh7XHJcblx0XHRcdFx0bmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuXHRcdFx0XHRcdGlmIChyZXNwb25zZSAmJiByZXNwb25zZT8uZGF0YSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmlkTWVkaW9EaWdpdGFsID0gcmVzcG9uc2UuZGF0YT8udmFsb3JOdW1lcmljbztcclxuXHRcdFx0XHRcdFx0dGhpcy5vYnRlbmVyRG9jc0xhc2VyZmljaGUoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHR9KTtcclxuXHR9XHJcblxyXG5cdG9idGVuZXJQZXNvTWF4aW1vQW5leG8oKSB7XHJcblx0XHR0aGlzLnNwaW5uZXIuc2hvdygpO1xyXG5cdFx0dGhpcy5wYXJhbWV0cm9Db250cm9sbGVyXHJcblx0XHRcdC5jb25zdWx0YXJQYXJhbWV0cm9HbG9iYWwoe1xyXG5cdFx0XHRcdG1vZHVsb0lkOiBQRVNPX01BWElNT19BUkNISVZPX01PRFVMT19JRCxcclxuXHRcdFx0XHR0aXBvUGFyYW1ldHJvSWQ6IFBFU09fTUFYSU1PX1RJUE9fUEFSQU1FVFJPX0lELFxyXG5cdFx0XHR9KVxyXG5cdFx0XHQucGlwZShcclxuXHRcdFx0XHR0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSxcclxuXHRcdFx0XHRmaW5hbGl6ZSgoKSA9PiB0aGlzLnNwaW5uZXIuaGlkZSgpKVxyXG5cdFx0XHQpXHJcblx0XHRcdC5zdWJzY3JpYmUoe1xyXG5cdFx0XHRcdG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XHJcblx0XHRcdFx0XHRpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2U/LmRhdGEpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5wZXNvTWF4aW1vQXJjaGl2byA9IHJlc3BvbnNlLmRhdGE/LnZhbG9yTnVtZXJpY287XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0fSk7XHJcblx0fVxyXG5cclxuXHRzZXRGb2xpbyhpdGVtOiBEb2N1bWVudG9UYWJsYSkge1xyXG5cdFx0dGhpcy5kYXRhc291cmNlRG9jdW1lbnRvc1tpdGVtLmluZGV4IC0gMV0gPSBpdGVtO1xyXG5cdH1cclxuXHRvYnRlbmVyRG9jc0xhc2VyZmljaGUoKSB7XHJcblx0XHR0aGlzLmRhdGFzb3VyY2VEb2N1bWVudG9zID0gW107XHJcblx0XHR0aGlzLl9nZXN0aW9uQXJjaGl2b0NvbnRyb2xsZXJTZXJ2aWNlXHJcblx0XHRcdC5saXN0YXJBcmNoaXZvcyh7XHJcblx0XHRcdFx0bnVtZXJvX2RlY19saXE6IHRoaXMuaWREaixcclxuXHRcdFx0XHRtZWRpb19kaWdpdGFsX2lkOiB0aGlzLmlkTWVkaW9EaWdpdGFsLFxyXG5cdFx0XHRcdHByb2Nlc29Nb2R1bG9JZDogdGhpcy5wcm9jZXNvTW9kdWxvSWQsXHJcblx0XHRcdFx0YW5pbzogTnVtYmVyKG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSksXHJcblx0XHRcdFx0Y2FtcG8yOlxyXG5cdFx0XHRcdFx0dGhpcy5wcm9jZXNvTW9kdWxvSWQgPT0gUFJPQ0VTT19NT0RVTE9fSUQuREpfQ09ORElDSU9OXHJcblx0XHRcdFx0XHRcdD8gdGhpcy5jb250cmlidXllbnRlTnVtZXJvLnRvU3RyaW5nKClcclxuXHRcdFx0XHRcdFx0OiAnJyxcclxuXHRcdFx0XHRjYW1wbzM6XHJcblx0XHRcdFx0XHR0aGlzLnByb2Nlc29Nb2R1bG9JZCA9PSBQUk9DRVNPX01PRFVMT19JRC5ESl9DT05ESUNJT05cclxuXHRcdFx0XHRcdFx0PyB0aGlzLmNvbmRpY2lvbkNvbnRyaWJ1eWVudGVJZC50b1N0cmluZygpXHJcblx0XHRcdFx0XHRcdDogJycsXHJcblx0XHRcdH0pXHJcblx0XHRcdC5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpKVxyXG5cdFx0XHQuc3Vic2NyaWJlKHtcclxuXHRcdFx0XHRuZXh0OiAocmVzcG9uc2U6IEN1c3RvbVBhZ2VEYXRvc0FyY2hpdm9Qcm9qZWN0aW9uKSA9PiB7XHJcblx0XHRcdFx0XHRyZXNwb25zZS5kYXRhPy5mb3JFYWNoKChpdDogRGF0b3NBcmNoaXZvUHJvamVjdGlvbikgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBleHRlbnNpb24gPSBpdC5ub21icmVPcmlnaW5hbD8uc3BsaXQoJy4nKS5wb3AoKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYW5pbyA9IE51bWJlcihpdC5mZWNoYT8uc3BsaXQoJy8nKS5wb3AoKSk7XHJcblxyXG5cdFx0XHRcdFx0XHR0aGlzLmRhdGFzb3VyY2VEb2N1bWVudG9zLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdGluZGV4OiB0aGlzLmRhdGFzb3VyY2VEb2N1bWVudG9zLmxlbmd0aCArIDEsXHJcblx0XHRcdFx0XHRcdFx0bGFzZXJmaWNoZUlkOiBpdC5hcmNoaXZvSWQsXHJcblx0XHRcdFx0XHRcdFx0bm9tYnJlOiBpdC5ub21icmVPcmlnaW5hbCA/IGl0Lm5vbWJyZU9yaWdpbmFsIDogJycsXHJcblx0XHRcdFx0XHRcdFx0ZmVjaGFVcGxvYWQ6IGl0LmZlY2hhID8gaXQuZmVjaGEgOiAnJyxcclxuXHRcdFx0XHRcdFx0XHR0YW1hbmlvOiBpdC5wZXNvQXJjaGl2byA/IGl0LnBlc29BcmNoaXZvIDogMCxcclxuXHRcdFx0XHRcdFx0XHRhbmlvVXBsb2FkOiBhbmlvID8gYW5pbyA6IDAsXHJcblx0XHRcdFx0XHRcdFx0ZXh0ZW5zaW9uOiBleHRlbnNpb24gPyBleHRlbnNpb24gOiAnUy9FJyxcclxuXHRcdFx0XHRcdFx0XHRmb2xpbzogaXQuZm9saW8sXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR0aGlzLnRvdGFsSXRlbXMgPSB0aGlzLmRhdGFzb3VyY2VEb2N1bWVudG9zLmxlbmd0aDtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgX2NyZWFyRm9ybXVsYXJpbygpIHtcclxuXHRcdHRoaXMuZm9ybXVsYXJpbyA9IHRoaXMuX2ZiLmdyb3VwKHtcclxuXHRcdFx0ZG9jU3VzdGVudG86IFtudWxsXSxcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLnJlZlN1Yj8udW5zdWJzY3JpYmUoKTtcclxuXHR9XHJcblxyXG5cdG9uU3VibWl0KCkge1xyXG5cdFx0dGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xyXG5cdFx0Y29uc3QgZGF0YSA9IHRoaXMuZGF0YXNvdXJjZURvY3VtZW50b3MuZmlsdGVyKFxyXG5cdFx0XHQoaXQ6IERvY3VtZW50b1RhYmxhKSA9PiAhaXQubGFzZXJmaWNoZUlkXHJcblx0XHQpO1xyXG5cclxuXHRcdGNvbnN0IGRvY3NTaW5Gb2xpb3MgPSB0aGlzLmRhdGFzb3VyY2VEb2N1bWVudG9zLmZpbHRlcihcclxuXHRcdFx0KGl0OiBEb2N1bWVudG9UYWJsYSkgPT4gaXQuZm9saW8gPT0gbnVsbCB8fCBpdC5mb2xpbyA9PSB1bmRlZmluZWRcclxuXHRcdCk7XHJcblxyXG5cdFx0aWYgKCFkYXRhLmxlbmd0aCkge1xyXG5cdFx0XHR0aGlzLl9hbGVydFNlcnZpY2UuZXJyb3IoJ0RlYmUgYW5leGFyIGFsIG1lbm9zIHVuIG51ZXZvIGRvY3VtZW50by4nKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmIChkb2NzU2luRm9saW9zLmxlbmd0aCkge1xyXG5cdFx0XHRcdHRoaXMuX2FsZXJ0U2VydmljZS5lcnJvcignRGViZSBpbmdyZXNhciBlbCBuw7ptZXJvIGRlIGZvbGlvcy4nKTtcclxuXHRcdFx0fSBlbHNlIHRoaXMuZ3VhcmRhckRvY3VtZW50b3NBcGxpY2FjaW9uKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRndWFyZGFyRG9jdW1lbnRvc0FwbGljYWNpb24oKSB7XHJcblx0XHR0aGlzLmxvYWRpbmc7XHJcblx0XHRsZXQgcmVxdWVzdDogYW55W10gPSBbXTtcclxuXHRcdGxldCBsaXN0RmlsZXM6IEZpbGVbXSA9IFtdO1xyXG5cdFx0dGhpcy5kYXRhc291cmNlRG9jdW1lbnRvcy5mb3JFYWNoKChpdDogRG9jdW1lbnRvVGFibGEpID0+IHtcclxuXHRcdFx0aWYgKCFpdC5sYXNlcmZpY2hlSWQpIHtcclxuXHRcdFx0XHRjb25zdCB0aXBvQXJjaGl2byA9IFRJUE9fQVJDSElWT19JRC5maW5kKFxyXG5cdFx0XHRcdFx0KHRpcG8pID0+IHRpcG8ua2V5ID09IGl0LmV4dGVuc2lvblxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0cmVxdWVzdC5wdXNoKHtcclxuXHRcdFx0XHRcdGFuaW86IGl0LmFuaW9VcGxvYWQsXHJcblx0XHRcdFx0XHRkaXJlY3RvcmlvSWQ6IHRoaXMuZGlyZWN0b3Jpb0lkLFxyXG5cdFx0XHRcdFx0dGlwb1Byb2Nlc29JZDogdGhpcy50aXBvUHJvY2Vzb0lkLFxyXG5cdFx0XHRcdFx0cHJvY2Vzb01vZHVsb0lkOiB0aGlzLnByb2Nlc29Nb2R1bG9JZCxcclxuXHRcdFx0XHRcdHRpcG9BcmNoaXZvSWQ6IHRpcG9BcmNoaXZvPy52YWx1ZSxcclxuXHRcdFx0XHRcdHZlcnNpb246IHRoaXMudmVyc2lvbixcclxuXHRcdFx0XHRcdGZvbGlvOiBpdC5mb2xpbyxcclxuXHRcdFx0XHRcdGlkREo6IHRoaXMuaWREaixcclxuXHRcdFx0XHRcdG1lZGlvRGlnaXRhbElkOiB0aGlzLmlkTWVkaW9EaWdpdGFsLFxyXG5cdFx0XHRcdFx0dGlwb0FyY2hpdm9EaWdpdGFsSWQ6IHRoaXMudGlwb0FyY2hpdm9EaWdpdGFsSWQsXHJcblx0XHRcdFx0XHRjYW1wbzI6XHJcblx0XHRcdFx0XHRcdHRoaXMucHJvY2Vzb01vZHVsb0lkID09IFBST0NFU09fTU9EVUxPX0lELkRKX0NPTkRJQ0lPTlxyXG5cdFx0XHRcdFx0XHRcdD8gdGhpcy5jb250cmlidXllbnRlTnVtZXJvXHJcblx0XHRcdFx0XHRcdFx0OiBudWxsLFxyXG5cdFx0XHRcdFx0Y2FtcG8zOlxyXG5cdFx0XHRcdFx0XHR0aGlzLnByb2Nlc29Nb2R1bG9JZCA9PSBQUk9DRVNPX01PRFVMT19JRC5ESl9DT05ESUNJT05cclxuXHRcdFx0XHRcdFx0XHQ/IHRoaXMuY29uZGljaW9uQ29udHJpYnV5ZW50ZUlkXHJcblx0XHRcdFx0XHRcdFx0OiBudWxsLFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdGlmIChpdC5maWxlKSBsaXN0RmlsZXMucHVzaChpdC5maWxlKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5zcGlubmVyLnNob3coKTtcclxuXHRcdHRoaXMuX2dlc3Rpb25BcmNoaXZvQ29udHJvbGxlclNlcnZpY2VcclxuXHRcdFx0LmNhcmdhckFyY2hpdm9zTWFzaXZvKHtcclxuXHRcdFx0XHRib2R5OiB7XHJcblx0XHRcdFx0XHRyZXF1ZXN0OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KSxcclxuXHRcdFx0XHRcdGZpbGVzOiBsaXN0RmlsZXMsXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0fSlcclxuXHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0ZmluYWxpemUoKCkgPT4gdGhpcy5zcGlubmVyLmhpZGUoKSksXHJcblx0XHRcdFx0dGFrZVVudGlsKHRoaXMub25EZXN0cm95JClcclxuXHRcdFx0KVxyXG5cdFx0XHQuc3Vic2NyaWJlKHtcclxuXHRcdFx0XHRuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5jbG9zZSh0aGlzLmRhdGFzb3VyY2VEb2N1bWVudG9zKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGNsb3NlKHJlc3BvbnNlPzogYW55KSB7XHJcblx0XHR0aGlzLl9hY3RpdmVNb2RhbC5jbG9zZShyZXNwb25zZSk7XHJcblx0fVxyXG5cclxuXHRlc0NvbnRyb2xJbnZhbGlkbyhpbnB1dD86IEFic3RyYWN0Q29udHJvbCB8IG51bGwpIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdGlucHV0ICYmXHJcblx0XHRcdHRoaXMuX3ZhbGlkYXRpb25Gb3JtU2VydmljZS5pc0NvbnRyb2xJbnZhbGlkKGlucHV0LCB0aGlzLnN1Ym1pdHRlZClcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRvblNlbGVjY2lvbmFyRG9jdW1lbnRvKGRvY3VtZW50bzogRG9jdW1lbnRvVGFibGEpIHtcclxuXHRcdHRoaXMuZG9jdW1lbnRvU2VsZWNjaW9uYWRvID0gZG9jdW1lbnRvO1xyXG5cdH1cclxuXHJcblx0b25DaGFuZ2VQYWdpbmFjaW9uKGV2ZW50OiBJQ2hhbmdlUGFnaW5hdGUpIHtcclxuXHRcdGNvbnN0IG1lcmdlID0ge1xyXG5cdFx0XHQvLy4uLnRoaXMuYWN0dWFsRmlsdHJvLFxyXG5cdFx0XHRwYWdlOiBldmVudC5wYWdlLFxyXG5cdFx0XHRwYWdlU2l6ZTogZXZlbnQucGFnZVNpemUsXHJcblx0XHR9O1xyXG5cclxuXHRcdHRoaXMuX3F1ZXJ5RmlsdGVyLm5leHQobWVyZ2UpO1xyXG5cclxuXHRcdHRoaXMubGltcGlhckl0ZW1TZWxlY2Npb25hZG8oKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgbGltcGlhckl0ZW1TZWxlY2Npb25hZG8oKSB7XHJcblx0XHR0aGlzLmRvY3VtZW50b1NlbGVjY2lvbmFkbyA9IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdG9uQ3JlYXJEb2N1bWVudG8oZmlsZTogRmlsZSkge1xyXG5cdFx0Y29uc3QgZXh0ZW5zaW9uID0gZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk/LnRvVXBwZXJDYXNlKCk7XHJcblx0XHRjb25zdCB0aXBvQXJjaGl2byA9IFRJUE9fQVJDSElWT19JRC5maW5kKCh0aXBvKSA9PiB0aXBvLmtleSA9PSBleHRlbnNpb24pO1xyXG5cclxuXHRcdGlmICghdGlwb0FyY2hpdm8pIHtcclxuXHRcdFx0dGhpcy5fYWxlcnRTZXJ2aWNlLmVycm9yKFxyXG5cdFx0XHRcdCdTb2xvIHNlIHB1ZWRlIGFuZXhhciBhcmNoaXZvcyBjb24gZXh0ZW5zaW9uIFBERiwgRE9DWCwgRE9DLCBYTFNYLCBYTFMsIEpQRUcsIFpJUCwgUkFSIG8gSlBHLidcclxuXHRcdFx0KTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChmaWxlLnNpemUgPiB0aGlzLnBlc29NYXhpbW9BcmNoaXZvICogTUVHQV9CWVRFUykge1xyXG5cdFx0XHR0aGlzLl9hbGVydFNlcnZpY2UuZXJyb3IoXHJcblx0XHRcdFx0J1NvbG8gc2UgcHVlZGUgYW5leGFyIGFyY2hpdm9zIGNvbiBwZXNvIG3DoXhpbW8gYSAnICtcclxuXHRcdFx0XHRcdHRoaXMucGVzb01heGltb0FyY2hpdm8gK1xyXG5cdFx0XHRcdFx0J01iLidcclxuXHRcdFx0KTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcblx0XHRyZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG5cdFx0XHRpZiAocmVhZGVyLnJlc3VsdCkge1xyXG5cdFx0XHRcdHZhciBibG9iID0gbmV3IEJsb2IoW3JlYWRlci5yZXN1bHRdKTtcclxuXHRcdFx0XHRjb25zdCBkYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcclxuXHRcdFx0XHRsZXQgZG9jOiBEb2N1bWVudG9UYWJsYSA9IHtcclxuXHRcdFx0XHRcdGluZGV4OiB0aGlzLmRhdGFzb3VyY2VEb2N1bWVudG9zLmxlbmd0aCArIDEsXHJcblx0XHRcdFx0XHRub21icmU6IGZpbGUubmFtZSxcclxuXHRcdFx0XHRcdGNvbnRlbmlkbzogYmxvYixcclxuXHRcdFx0XHRcdGZlY2hhVXBsb2FkOiBwYXJzZVN0cmluZ0RhdGVGb3JtYXRVc2VyKFxyXG5cdFx0XHRcdFx0XHRuZXcgTmdiRGF0ZShcclxuXHRcdFx0XHRcdFx0XHRkYXRlLmdldEZ1bGxZZWFyKCksXHJcblx0XHRcdFx0XHRcdFx0ZGF0ZS5nZXRNb250aCgpLFxyXG5cdFx0XHRcdFx0XHRcdGRhdGUuZ2V0RGF5KClcclxuXHRcdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0KSxcclxuXHRcdFx0XHRcdGFuaW9VcGxvYWQ6IGRhdGUuZ2V0RnVsbFllYXIoKSxcclxuXHRcdFx0XHRcdHRhbWFuaW86IGZpbGUuc2l6ZSxcclxuXHRcdFx0XHRcdGV4dGVuc2lvbjogZXh0ZW5zaW9uID8gZXh0ZW5zaW9uLnRvVXBwZXJDYXNlKCkgOiAnUy9FJyxcclxuXHRcdFx0XHRcdGZpbGU6IGZpbGUsXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHR0aGlzLmRhdGFzb3VyY2VEb2N1bWVudG9zLnB1c2goZG9jKTtcclxuXHRcdFx0XHR0aGlzLnRvdGFsSXRlbXMgPSB0aGlzLmRhdGFzb3VyY2VEb2N1bWVudG9zLmxlbmd0aDtcclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHRcdGlmIChmaWxlKSB7XHJcblx0XHRcdHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdG9uRGVzY2FyZ2FyRG9jdW1lbnRvKGRvY3VtZW50bzogRG9jdW1lbnRvVGFibGEpIHtcclxuXHRcdGlmICghZG9jdW1lbnRvLmxhc2VyZmljaGVJZCkge1xyXG5cdFx0XHR0aGlzLmRlc2NhcmdhckRvY3VtZW50b01lbW9yaWEoZG9jdW1lbnRvKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuZGVzY2FyZ2FyRG9jdW1lbnRvTGFzZXJmaWNoZShkb2N1bWVudG8pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZGVzY2FyZ2FyRG9jdW1lbnRvTWVtb3JpYShkb2N1bWVudG86IERvY3VtZW50b1RhYmxhKSB7XHJcblx0XHR2YXIgYmxvYiA9IGRvY3VtZW50by5jb250ZW5pZG87XHJcblx0XHRpZiAoYmxvYikge1xyXG5cdFx0XHRjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG5cdFx0XHRjb25zdCBvYmplY3RVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cdFx0XHRhLmhyZWYgPSBvYmplY3RVcmw7XHJcblx0XHRcdGEuZG93bmxvYWQgPSBkb2N1bWVudG8ubm9tYnJlID8gZG9jdW1lbnRvLm5vbWJyZSA6ICcnO1xyXG5cdFx0XHRhLmNsaWNrKCk7XHJcblx0XHRcdFVSTC5yZXZva2VPYmplY3RVUkwob2JqZWN0VXJsKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGRlc2NhcmdhckRvY3VtZW50b0xhc2VyZmljaGUoZG9jdW1lbnRvOiBEb2N1bWVudG9UYWJsYSkge1xyXG5cdFx0dGhpcy5fZ2VzdGlvbkFyY2hpdm9Db250cm9sbGVyU2VydmljZVxyXG5cdFx0XHQub2J0ZW5lckNvbnRlbmlkb0FyY2hpdm9Qb3JJZCh7XHJcblx0XHRcdFx0aWRfYXJjaGl2bzogTnVtYmVyKGRvY3VtZW50by5sYXNlcmZpY2hlSWQpLFxyXG5cdFx0XHRcdGFuaW86IGRvY3VtZW50by5hbmlvVXBsb2FkLFxyXG5cdFx0XHR9KVxyXG5cdFx0XHQucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSlcclxuXHRcdFx0LnN1YnNjcmliZSh7XHJcblx0XHRcdFx0bmV4dDogKHJlc3BvbnNlOiBCbG9iKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAocmVzcG9uc2UpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuXHRcdFx0XHRcdFx0Y29uc3Qgb2JqZWN0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChyZXNwb25zZSk7XHJcblx0XHRcdFx0XHRcdGEuaHJlZiA9IG9iamVjdFVybDtcclxuXHRcdFx0XHRcdFx0YS5kb3dubG9hZCA9IGRvY3VtZW50by5ub21icmUgPyBkb2N1bWVudG8ubm9tYnJlIDogJyc7XHJcblx0XHRcdFx0XHRcdGEuY2xpY2soKTtcclxuXHRcdFx0XHRcdFx0VVJMLnJldm9rZU9iamVjdFVSTChvYmplY3RVcmwpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdH0pO1xyXG5cdH1cclxuXHJcblx0b25WZXJEb2N1bWVudG8oZG9jdW1lbnRvOiBEb2N1bWVudG9UYWJsYSkge1xyXG5cdFx0aWYgKCFkb2N1bWVudG8ubGFzZXJmaWNoZUlkKSB7XHJcblx0XHRcdHRoaXMudmVyRG9jdW1lbnRvTWVtb3JpYShkb2N1bWVudG8pO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy52ZXJEb2N1bWVudG9MYXNlcmZpY2hlKGRvY3VtZW50byk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHR2ZXJEb2N1bWVudG9NZW1vcmlhKGRvY3VtZW50bzogRG9jdW1lbnRvVGFibGEpIHtcclxuXHRcdHZhciBibG9iID0gZG9jdW1lbnRvLmNvbnRlbmlkbztcclxuXHRcdGlmIChibG9iKSB7XHJcblx0XHRcdGNvbnN0IG1vZGFsUmVmID0gdGhpcy5fbW9kYWxTZXJ2aWNlLm9wZW4oXHJcblx0XHRcdFx0TnNydG1EaWFsb2dWaXNvckRvY3VtZW50b0NvbXBvbmVudCxcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHRjZW50ZXJlZDogdHJ1ZSxcclxuXHRcdFx0XHRcdGJhY2tkcm9wOiAnc3RhdGljJyxcclxuXHRcdFx0XHRcdGtleWJvYXJkOiBmYWxzZSxcclxuXHRcdFx0XHRcdGZ1bGxzY3JlZW46IHRydWUsXHJcblx0XHRcdFx0XHRzY3JvbGxhYmxlOiB0cnVlLFxyXG5cdFx0XHRcdFx0c2l6ZTogJ3hsJyxcclxuXHRcdFx0XHR9XHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHRtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jb250ZW5pZG8gPSBibG9iO1xyXG5cdFx0XHRtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5leHRlbnNpb24gPSBkb2N1bWVudG8uZXh0ZW5zaW9uO1xyXG5cclxuXHRcdFx0bW9kYWxSZWYuY2xvc2VkLnN1YnNjcmliZSh7XHJcblx0XHRcdFx0bmV4dDogKHJlc3BvbnNlKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAocmVzcG9uc2UpIHtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGVycm9yOiAoZXJyb3IpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMuX2FsZXJ0U2VydmljZS5lcnJvcihlcnJvci5tZXNzYWdlKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHZlckRvY3VtZW50b0xhc2VyZmljaGUoZG9jdW1lbnRvOiBEb2N1bWVudG9UYWJsYSkge1xyXG5cdFx0dGhpcy5fZ2VzdGlvbkFyY2hpdm9Db250cm9sbGVyU2VydmljZVxyXG5cdFx0XHQub2J0ZW5lckNvbnRlbmlkb0FyY2hpdm9Qb3JJZCh7XHJcblx0XHRcdFx0aWRfYXJjaGl2bzogTnVtYmVyKGRvY3VtZW50by5sYXNlcmZpY2hlSWQpLFxyXG5cdFx0XHRcdGFuaW86IGRvY3VtZW50by5hbmlvVXBsb2FkLFxyXG5cdFx0XHR9KVxyXG5cdFx0XHQucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSlcclxuXHRcdFx0LnN1YnNjcmliZSh7XHJcblx0XHRcdFx0bmV4dDogKHJlc3BvbnNlOiBCbG9iKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAocmVzcG9uc2UpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgbW9kYWxSZWYgPSB0aGlzLl9tb2RhbFNlcnZpY2Uub3BlbihcclxuXHRcdFx0XHRcdFx0XHROc3J0bURpYWxvZ1Zpc29yRG9jdW1lbnRvQ29tcG9uZW50LFxyXG5cdFx0XHRcdFx0XHRcdHtcclxuXHRcdFx0XHRcdFx0XHRcdGNlbnRlcmVkOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxyXG5cdFx0XHRcdFx0XHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0c2l6ZTogJ2xnJyxcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdFx0XHRtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jb250ZW5pZG8gPSByZXNwb25zZTtcclxuXHRcdFx0XHRcdFx0bW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZXh0ZW5zaW9uID0gZG9jdW1lbnRvLmV4dGVuc2lvbjtcclxuXHJcblx0XHRcdFx0XHRcdG1vZGFsUmVmLmNsb3NlZC5zdWJzY3JpYmUoe1xyXG5cdFx0XHRcdFx0XHRcdG5leHQ6IChyZXNwb25zZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKHJlc3BvbnNlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHRlcnJvcjogKGVycm9yKSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9hbGVydFNlcnZpY2UuZXJyb3IoZXJyb3IubWVzc2FnZSk7XHJcblx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0fSk7XHJcblx0fVxyXG5cclxuXHRvbkFudWxhckRvY3VtZW50byhkb2N1bWVudG86IERvY3VtZW50b1RhYmxhKSB7XHJcblx0XHR0aGlzLl9kaWFsb2dDb25maXJtXHJcblx0XHRcdC5jb25maXJtKHtcclxuXHRcdFx0XHR0aXRsZTogJ8K/Q2FuY2VsYXIgZWwgZG9jdW1lbnRvIGFuZXhvPycsXHJcblx0XHRcdFx0bWVzc2FnZTogJycsXHJcblx0XHRcdH0pXHJcblx0XHRcdC5jbG9zZWQuc3Vic2NyaWJlKHtcclxuXHRcdFx0XHRuZXh0OiAocmVzcG9uc2UpID0+IHtcclxuXHRcdFx0XHRcdGlmIChyZXNwb25zZSkge1xyXG5cdFx0XHRcdFx0XHRpZiAoIWRvY3VtZW50by5sYXNlcmZpY2hlSWQpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmFudWxhckRvY3VtZW50b01lbW9yaWEoZG9jdW1lbnRvKTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmFudWxhckRvY3VtZW50b0xhc2VyZmljaGUoZG9jdW1lbnRvKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdH0pO1xyXG5cdH1cclxuXHJcblx0YW51bGFyRG9jdW1lbnRvTWVtb3JpYShkb2N1bWVudG86IERvY3VtZW50b1RhYmxhKSB7XHJcblx0XHR0aGlzLmRhdGFzb3VyY2VEb2N1bWVudG9zLnNwbGljZShkb2N1bWVudG8uaW5kZXggLSAxLCAxKTtcclxuXHRcdHRoaXMuZGF0YXNvdXJjZURvY3VtZW50b3MuZm9yRWFjaCgoaXQsIGluZGV4KSA9PiB7XHJcblx0XHRcdGl0LmluZGV4ID0gaW5kZXggKyAxO1xyXG5cdFx0fSk7XHJcblx0XHR0aGlzLmRvY3VtZW50b1NlbGVjY2lvbmFkbyA9IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdGFudWxhckRvY3VtZW50b0xhc2VyZmljaGUoZG9jdW1lbnRvOiBEb2N1bWVudG9UYWJsYSkge1xyXG5cdFx0dGhpcy5fZ2VzdGlvbkFyY2hpdm9Db250cm9sbGVyU2VydmljZVxyXG5cdFx0XHQuYW51bGFyQXJjaGl2byh7XHJcblx0XHRcdFx0YXJjaGl2b0lkOiBOdW1iZXIoZG9jdW1lbnRvLmxhc2VyZmljaGVJZCksXHJcblx0XHRcdFx0YW5pbzogZG9jdW1lbnRvLmFuaW9VcGxvYWQsXHJcblx0XHRcdH0pXHJcblx0XHRcdC5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSQpKVxyXG5cdFx0XHQuc3Vic2NyaWJlKHtcclxuXHRcdFx0XHRuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKHJlc3BvbnNlKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuX2FsZXJ0U2VydmljZS5zdWNjZXNzKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLm9idGVuZXJEb2NzTGFzZXJmaWNoZSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdH0pO1xyXG5cdH1cclxuXHJcblx0Z2V0IHBhZ2UoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcXVlcnlGaWx0ZXIudmFsdWU/LnBhZ2U7XHJcblx0fVxyXG5cclxuXHRnZXQgcGFnZVNpemUoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcXVlcnlGaWx0ZXIudmFsdWU/LnBhZ2VTaXplO1xyXG5cdH1cclxuXHJcblx0Z2V0IGRvY1N1c3RlbnRvKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuZm9ybXVsYXJpby5nZXQoJ2RvY1N1c3RlbnRvJyk7XHJcblx0fVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcblx0PGg2IGNsYXNzPVwibW9kYWwtdGl0bGUgdy0xMDBcIiBpZD1cInRpdGxlXCI+RG9jdW1lbnRvb29vcyBhbmV4b3M8L2g2PlxyXG5cdDxidXR0b25cclxuXHRcdHR5cGU9XCJidXR0b25cIlxyXG5cdFx0Y2xhc3M9XCJidG4tY2xvc2VcIlxyXG5cdFx0YXJpYS1sYWJlbD1cIkNsb3NlXCJcclxuXHRcdChjbGljayk9XCJjbG9zZSgpXCJcclxuXHQ+PC9idXR0b24+XHJcbjwvZGl2PlxyXG48ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG5cdDxkaXYgY2xhc3M9XCJzaWFmLWNhcmQgc2hhZG93LW5vbmUgcC0wXCI+XHJcblx0XHQ8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkIHB4LTBcIj5cclxuXHRcdFx0PGRpdiBjbGFzcz1cInJvdyBneC0zIGFsaWduLWl0ZW1zLWJhc2VsaW5lXCI+PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Rpdj5cclxuXHQ8ZGl2IGNsYXNzPVwic2lhZi1jYXJkXCI+XHJcblx0XHQ8ZGl2IGNsYXNzPVwicC1jb250ZW50IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuXHRcdFx0PHNwYW4gY2xhc3M9XCJ0aXRsZS1ncm91cC11cHBlcmNhc2VcIj5MaXN0YWRvIGRlIGRvY3VtZW50b3MgYW5leG9zPC9zcGFuPlxyXG5cdFx0XHQ8YXBwLW5zcnRtLWdydXBvLWJvdG9uZXMtZG9jdW1lbnRvXHJcblx0XHRcdFx0W3Nob3dBZ3JlZ2FyXT1cInNob3dBZ3JlZ2FyXCJcclxuXHRcdFx0XHRbc2hvd0FudWxhcl09XCJzaG93QW51bGFyXCJcclxuXHRcdFx0XHRbaXRlbVNlbGVjY2lvbmFkb109XCJkb2N1bWVudG9TZWxlY2Npb25hZG9cIlxyXG5cdFx0XHRcdChjcmVhcik9XCJvbkNyZWFyRG9jdW1lbnRvKCRldmVudClcIlxyXG5cdFx0XHRcdCh2ZXIpPVwib25WZXJEb2N1bWVudG8oJGV2ZW50KVwiXHJcblx0XHRcdFx0KGRlc2Nhcmdhcik9XCJvbkRlc2NhcmdhckRvY3VtZW50bygkZXZlbnQpXCJcclxuXHRcdFx0XHQoYW51bGFyKT1cIm9uQW51bGFyRG9jdW1lbnRvKCRldmVudClcIlxyXG5cdFx0XHQ+XHJcblx0XHRcdDwvYXBwLW5zcnRtLWdydXBvLWJvdG9uZXMtZG9jdW1lbnRvPlxyXG5cdFx0PC9kaXY+XHJcblx0XHQ8YXBwLW5zcnRtLXRhYmxhLWRvY3VtZW50b1xyXG5cdFx0XHRbZGF0YXNvdXJjZV09XCJkYXRhc291cmNlRG9jdW1lbnRvc1wiXHJcblx0XHRcdFtsb2FkaW5nXT1cImxvYWRpbmdcIlxyXG5cdFx0XHRbdG90YWxJdGVtc109XCJ0b3RhbEl0ZW1zXCJcclxuXHRcdFx0W3BhZ2VdPVwicGFnZSFcIlxyXG5cdFx0XHRbcGFnZVNpemVdPVwicGFnZVNpemUhXCJcclxuXHRcdFx0W2ZpbGFTZWxlY2Npb25hZGFdPVwiZG9jdW1lbnRvU2VsZWNjaW9uYWRvXCJcclxuXHRcdFx0KHNlbGVjY2lvbmFyKT1cIm9uU2VsZWNjaW9uYXJEb2N1bWVudG8oJGV2ZW50KVwiXHJcblx0XHRcdChzZXRGb2xpbyk9XCJzZXRGb2xpbygkZXZlbnQpXCJcclxuXHRcdFx0KHBhZ2luYXIpPVwib25DaGFuZ2VQYWdpbmFjaW9uKCRldmVudClcIlxyXG5cdFx0PlxyXG5cdFx0PC9hcHAtbnNydG0tdGFibGEtZG9jdW1lbnRvPlxyXG5cdDwvZGl2PlxyXG5cdDxiciAvPlxyXG5cdDxkaXYgY2xhc3M9XCJzaWFmLWNhcmQgbXQtMVwiPlxyXG5cdFx0PGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtdWxhcmlvXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgcHgtMFwiPlxyXG5cdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJsaXN0YURvY1N1c3RlbnRvLmxlbmd0aCA+IDBcIj5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItMVwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInRpdGxlLWdyb3VwLXVwcGVyY2FzZVwiXHJcblx0XHRcdFx0XHRcdFx0PkRPQ1VNRU5UT1MgREUgU1VTVEVOVE88L3NwYW5cclxuXHRcdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicm93IGd4LTMgYWxpZ24taXRlbXMtYmFzZWxpbmVcIj5cclxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtc20tNiBjb2wtbWQtOVwiPlxyXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwiZG9jU3VzdGVudG9cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ+RG9jdW1lbnRvKHMpIGRlIHN1c3RlbnRvPC9sYWJlbFxyXG5cdFx0XHRcdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHRcdFx0PG5nLXNlbGVjdFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZD1cImRvY1N1c3RlbnRvXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9ybUNvbnRyb2xOYW1lPVwiZG9jU3VzdGVudG9cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRiaW5kVmFsdWU9XCJtYWVzdHJvSWRcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRiaW5kTGFiZWw9XCJkZXNjcmlwY2lvblwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFtzZWFyY2hhYmxlXT1cImZhbHNlXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0W2NsZWFyYWJsZV09XCJmYWxzZVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFttdWx0aXBsZV09XCJ0cnVlXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0W2l0ZW1zXT1cImxpc3RhRG9jU3VzdGVudG9cIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRbY2xvc2VPblNlbGVjdF09XCJmYWxzZVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFtyZWFkb25seV09XCJ0cnVlXCJcclxuXHRcdFx0XHRcdFx0XHRcdD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bmctb3B0aW9uLXRtcFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldC1pdGVtPVwiaXRlbVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0LWl0ZW0kPVwiaXRlbSRcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldC1pbmRleD1cImluZGV4XCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWQ9XCJpdGVtLXN1c3RlbnRvLXt7IGluZGV4IH19XCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGU9XCJjaGVja2JveFwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRbY2hlY2tlZF09XCJpdGVtJC5zZWxlY3RlZFwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0e3sgaXRlbS5kZXNjcmlwY2lvbiB9fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1zZWxlY3Q+XHJcblx0XHRcdFx0XHRcdFx0XHQ8dmFsLWVycm9ycyBjb250cm9sTmFtZT1cImRvY1N1c3RlbnRvXCI+PC92YWwtZXJyb3JzPlxyXG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvZm9ybT5cclxuXHQ8L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuXHQ8YnV0dG9uXHJcblx0XHR0eXBlPVwiYnV0dG9uXCJcclxuXHRcdGNsYXNzPVwiYnRuLWNhbmNlbFwiXHJcblx0XHRkYXRhLWRpc21pc3M9XCJtb2RhbFwiXHJcblx0XHQoY2xpY2spPVwiY2xvc2UoKVwiXHJcblx0PlxyXG5cdFx0PHNwYW4gY2xhc3M9XCJmZWF0aGVyIGljb24teCBtZS0xXCI+PC9zcGFuPlxyXG5cdFx0Q2FuY2VsYXJcclxuXHQ8L2J1dHRvbj5cclxuXHQ8YnV0dG9uXHJcblx0XHR0eXBlPVwiYnV0dG9uXCJcclxuXHRcdGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcclxuXHRcdFtkaXNhYmxlZF09XCJsb2FkaW5nXCJcclxuXHRcdG5nYkF1dG9mb2N1c1xyXG5cdFx0KGNsaWNrKT1cIm9uU3VibWl0KClcIlxyXG5cdD5cclxuXHRcdDxzcGFuXHJcblx0XHRcdGNsYXNzPVwiZmVhdGhlciBpY29uLXNhdmUgbWUtMVwiXHJcblx0XHRcdCpuZ0lmPVwiIWxvYWRpbmc7IGVsc2UgaWNvbkxvYWRpbmdcIlxyXG5cdFx0Pjwvc3Bhbj5cclxuXHRcdDxuZy10ZW1wbGF0ZSAjaWNvbkxvYWRpbmc+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlciBzcGlubmVyLWJvcmRlci1zbSBtZS0yXCIgcm9sZT1cInN0YXR1c1wiPjwvZGl2PlxyXG5cdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdHt7IGxvYWRpbmcgPyBcIkdyYWJhbmRvLi4uXCIgOiBcIkdyYWJhclwiIH19XHJcblx0PC9idXR0b24+XHJcbjwvZGl2PlxyXG4iXX0=