UNPKG

nsrtm-gestionarchivo-npm-prueba2

Version:

Proyecto de Libreria Frontend para la Gestión de Archivos

363 lines 54.3 kB
/* tslint:disable */
/* eslint-disable */
import { Injectable } from '@angular/core';
import { HttpResponse } from '@angular/common/http';
import { BaseService } from '../base-service';
import { RequestBuilder } from '../request-builder';
import { map, filter } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "../api-configuration";
import * as i2 from "@angular/common/http";
export class TablaCatalogoControllerService extends BaseService {
    constructor(config, http) {
        super(config, http);
    }
    /**
     * Realiza la actualizacion del registro en la tabla seleccionada.
     *
     * Realiza la actualizacion del registro en la tabla seleccionada
     *
     * This method provides access to the full `HttpResponse`, allowing access to response headers.
     * To access only the response body, use `modificarRegistroDetalle()` instead.
     *
     * This method sends `application/json` and handles request body of type `application/json`.
     */
    modificarRegistroDetalle$Response(params) {
        const rb = new RequestBuilder(this.rootUrl, TablaCatalogoControllerService.ModificarRegistroDetallePath, 'put');
        if (params) {
            rb.path('tabla_catalogo_id', params.tabla_catalogo_id, {});
            rb.path('codigo1', params.codigo1, {});
            rb.path('codigo2', params.codigo2, {});
            rb.body(params.body, 'application/json');
        }
        return this.http.request(rb.build({
            responseType: 'json',
            accept: 'application/json',
            context: params?.context
        })).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
            return r;
        }));
    }
    /**
     * Realiza la actualizacion del registro en la tabla seleccionada.
     *
     * Realiza la actualizacion del registro en la tabla seleccionada
     *
     * This method provides access to only to the response body.
     * To access the full response (for headers, for example), `modificarRegistroDetalle$Response()` instead.
     *
     * This method sends `application/json` and handles request body of type `application/json`.
     */
    modificarRegistroDetalle(params) {
        return this.modificarRegistroDetalle$Response(params).pipe(map((r) => r.body));
    }
    /**
     * Realiza el registro en la tabla seleccionada.
     *
     * Realiza el registro en la tabla seleccionada
     *
     * This method provides access to the full `HttpResponse`, allowing access to response headers.
     * To access only the response body, use `crearRegistroDetalle()` instead.
     *
     * This method sends `application/json` and handles request body of type `application/json`.
     */
    crearRegistroDetalle$Response(params) {
        const rb = new RequestBuilder(this.rootUrl, TablaCatalogoControllerService.CrearRegistroDetallePath, 'post');
        if (params) {
            rb.path('tabla_catalogo_id', params.tabla_catalogo_id, {});
            rb.path('codigo1', params.codigo1, {});
            rb.path('codigo2', params.codigo2, {});
            rb.body(params.body, 'application/json');
        }
        return this.http.request(rb.build({
            responseType: 'json',
            accept: 'application/json',
            context: params?.context
        })).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
            return r;
        }));
    }
    /**
     * Realiza el registro en la tabla seleccionada.
     *
     * Realiza el registro en la tabla seleccionada
     *
     * This method provides access to only to the response body.
     * To access the full response (for headers, for example), `crearRegistroDetalle$Response()` instead.
     *
     * This method sends `application/json` and handles request body of type `application/json`.
     */
    crearRegistroDetalle(params) {
        return this.crearRegistroDetalle$Response(params).pipe(map((r) => r.body));
    }
    /**
     * Permite realizar la busqueda de tablas tipo 1 , 2 , 3.
     *
     * Permite realizar la busqueda de tablas tipo 1 , 2 , 3.
     *
     * This method provides access to the full `HttpResponse`, allowing access to response headers.
     * To access only the response body, use `buscarTablaCatalogo()` instead.
     *
     * This method doesn't expect any request body.
     */
    buscarTablaCatalogo$Response(params) {
        const rb = new RequestBuilder(this.rootUrl, TablaCatalogoControllerService.BuscarTablaCatalogoPath, 'get');
        if (params) {
            rb.query('tabla_catalogo_id', params.tabla_catalogo_id, {});
            rb.query('tabla', params.tabla, {});
            rb.query('descripcion', params.descripcion, {});
            rb.query('tipo', params.tipo, {});
            rb.query('page', params.page, {});
            rb.query('page_size', params.page_size, {});
        }
        return this.http.request(rb.build({
            responseType: 'json',
            accept: 'application/json',
            context: params?.context
        })).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
            return r;
        }));
    }
    /**
     * Permite realizar la busqueda de tablas tipo 1 , 2 , 3.
     *
     * Permite realizar la busqueda de tablas tipo 1 , 2 , 3.
     *
     * This method provides access to only to the response body.
     * To access the full response (for headers, for example), `buscarTablaCatalogo$Response()` instead.
     *
     * This method doesn't expect any request body.
     */
    buscarTablaCatalogo(params) {
        return this.buscarTablaCatalogo$Response(params).pipe(map((r) => r.body));
    }
    /**
     * Permite listar los elementos del formulario de la tabla a dar mantenimiento.
     *
     * Permite listar los elementos del formulario de la tabla a dar mantenimiento
     *
     * This method provides access to the full `HttpResponse`, allowing access to response headers.
     * To access only the response body, use `listarFormElement()` instead.
     *
     * This method doesn't expect any request body.
     */
    listarFormElement$Response(params) {
        const rb = new RequestBuilder(this.rootUrl, TablaCatalogoControllerService.ListarFormElementPath, 'get');
        if (params) {
            rb.path('tabla_catalogo_id', params.tabla_catalogo_id, {});
        }
        return this.http.request(rb.build({
            responseType: 'json',
            accept: 'application/json',
            context: params?.context
        })).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
            return r;
        }));
    }
    /**
     * Permite listar los elementos del formulario de la tabla a dar mantenimiento.
     *
     * Permite listar los elementos del formulario de la tabla a dar mantenimiento
     *
     * This method provides access to only to the response body.
     * To access the full response (for headers, for example), `listarFormElement$Response()` instead.
     *
     * This method doesn't expect any request body.
     */
    listarFormElement(params) {
        return this.listarFormElement$Response(params).pipe(map((r) => r.body));
    }
    /**
     * Permite listar todos los registros de la tabla catalogo a consultar.
     *
     * Permite listar todos los registros de la tabla catalogo a consultar.
     *
     * This method provides access to the full `HttpResponse`, allowing access to response headers.
     * To access only the response body, use `listarDetalleTablaCatalogo()` instead.
     *
     * This method doesn't expect any request body.
     */
    listarDetalleTablaCatalogo$Response(params) {
        const rb = new RequestBuilder(this.rootUrl, TablaCatalogoControllerService.ListarDetalleTablaCatalogoPath, 'get');
        if (params) {
            rb.path('tabla_catalogo_id', params.tabla_catalogo_id, {});
            rb.path('codigo_padre', params.codigo_padre, {});
        }
        return this.http.request(rb.build({
            responseType: 'json',
            accept: 'application/json',
            context: params?.context
        })).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
            return r;
        }));
    }
    /**
     * Permite listar todos los registros de la tabla catalogo a consultar.
     *
     * Permite listar todos los registros de la tabla catalogo a consultar.
     *
     * This method provides access to only to the response body.
     * To access the full response (for headers, for example), `listarDetalleTablaCatalogo$Response()` instead.
     *
     * This method doesn't expect any request body.
     */
    listarDetalleTablaCatalogo(params) {
        return this.listarDetalleTablaCatalogo$Response(params).pipe(map((r) => r.body));
    }
    /**
     * Permite listar los registros de la tabla catalogo a consultar.
     *
     * Permite listar los registros de la tabla catalogo a consultar.
     *
     * This method provides access to the full `HttpResponse`, allowing access to response headers.
     * To access only the response body, use `listarDetalleHistorico()` instead.
     *
     * This method doesn't expect any request body.
     */
    listarDetalleHistorico$Response(params) {
        const rb = new RequestBuilder(this.rootUrl, TablaCatalogoControllerService.ListarDetalleHistoricoPath, 'get');
        if (params) {
            rb.path('tabla_catalogo_id', params.tabla_catalogo_id, {});
            rb.path('codigo1', params.codigo1, {});
            rb.path('codigo2', params.codigo2, {});
        }
        return this.http.request(rb.build({
            responseType: 'json',
            accept: 'application/json',
            context: params?.context
        })).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
            return r;
        }));
    }
    /**
     * Permite listar los registros de la tabla catalogo a consultar.
     *
     * Permite listar los registros de la tabla catalogo a consultar.
     *
     * This method provides access to only to the response body.
     * To access the full response (for headers, for example), `listarDetalleHistorico$Response()` instead.
     *
     * This method doesn't expect any request body.
     */
    listarDetalleHistorico(params) {
        return this.listarDetalleHistorico$Response(params).pipe(map((r) => r.body));
    }
    /**
     * Permite obtener los datos del registro de la tabla seleccionada.
     *
     * Permite obtener los datos del registro de la tabla seleccionada.
     *
     * This method provides access to the full `HttpResponse`, allowing access to response headers.
     * To access only the response body, use `obtenerRegistroDetalle()` instead.
     *
     * This method doesn't expect any request body.
     */
    obtenerRegistroDetalle$Response(params) {
        const rb = new RequestBuilder(this.rootUrl, TablaCatalogoControllerService.ObtenerRegistroDetallePath, 'get');
        if (params) {
            rb.path('tabla_catalogo_id', params.tabla_catalogo_id, {});
            rb.path('codigo1', params.codigo1, {});
            rb.path('codigo2', params.codigo2, {});
        }
        return this.http.request(rb.build({
            responseType: 'json',
            accept: 'application/json',
            context: params?.context
        })).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
            return r;
        }));
    }
    /**
     * Permite obtener los datos del registro de la tabla seleccionada.
     *
     * Permite obtener los datos del registro de la tabla seleccionada.
     *
     * This method provides access to only to the response body.
     * To access the full response (for headers, for example), `obtenerRegistroDetalle$Response()` instead.
     *
     * This method doesn't expect any request body.
     */
    obtenerRegistroDetalle(params) {
        return this.obtenerRegistroDetalle$Response(params).pipe(map((r) => r.body));
    }
    /**
     * Realiza la anulación del registro en la tabla seleccionada.
     *
     * Realiza la anulación del registro en la tabla seleccionada
     *
     * This method provides access to the full `HttpResponse`, allowing access to response headers.
     * To access only the response body, use `anularRegistroDetalle()` instead.
     *
     * This method doesn't expect any request body.
     */
    anularRegistroDetalle$Response(params) {
        const rb = new RequestBuilder(this.rootUrl, TablaCatalogoControllerService.AnularRegistroDetallePath, 'delete');
        if (params) {
            rb.path('tabla_catalogo_id', params.tabla_catalogo_id, {});
            rb.path('codigo1', params.codigo1, {});
            rb.path('codigo2', params.codigo2, {});
            rb.path('terminal', params.terminal, {});
        }
        return this.http.request(rb.build({
            responseType: 'json',
            accept: 'application/json',
            context: params?.context
        })).pipe(filter((r) => r instanceof HttpResponse), map((r) => {
            return r;
        }));
    }
    /**
     * Realiza la anulación del registro en la tabla seleccionada.
     *
     * Realiza la anulación del registro en la tabla seleccionada
     *
     * This method provides access to only to the response body.
     * To access the full response (for headers, for example), `anularRegistroDetalle$Response()` instead.
     *
     * This method doesn't expect any request body.
     */
    anularRegistroDetalle(params) {
        return this.anularRegistroDetalle$Response(params).pipe(map((r) => r.body));
    }
}
/**
 * Path part for operation modificarRegistroDetalle
 */
TablaCatalogoControllerService.ModificarRegistroDetallePath = '/catalogos/{tabla_catalogo_id}/{codigo1}/{codigo2}';
/**
 * Path part for operation crearRegistroDetalle
 */
TablaCatalogoControllerService.CrearRegistroDetallePath = '/catalogos/{tabla_catalogo_id}/{codigo1}/{codigo2}';
/**
 * Path part for operation buscarTablaCatalogo
 */
TablaCatalogoControllerService.BuscarTablaCatalogoPath = '/catalogos';
/**
 * Path part for operation listarFormElement
 */
TablaCatalogoControllerService.ListarFormElementPath = '/catalogos/listar-form-element/{tabla_catalogo_id}';
/**
 * Path part for operation listarDetalleTablaCatalogo
 */
TablaCatalogoControllerService.ListarDetalleTablaCatalogoPath = '/catalogos/listar-detalle/{tabla_catalogo_id}/{codigo_padre}';
/**
 * Path part for operation listarDetalleHistorico
 */
TablaCatalogoControllerService.ListarDetalleHistoricoPath = '/catalogos/listar-detalle-historico/{tabla_catalogo_id}/{codigo1}/{codigo2}';
/**
 * Path part for operation obtenerRegistroDetalle
 */
TablaCatalogoControllerService.ObtenerRegistroDetallePath = '/catalogos/detalle/{tabla_catalogo_id}/{codigo1}/{codigo2}';
/**
 * Path part for operation anularRegistroDetalle
 */
TablaCatalogoControllerService.AnularRegistroDetallePath = '/catalogos/{tabla_catalogo_id}/{codigo1}/{codigo2}/{terminal}';
TablaCatalogoControllerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TablaCatalogoControllerService, deps: [{ token: i1.ApiConfiguration }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
TablaCatalogoControllerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TablaCatalogoControllerService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TablaCatalogoControllerService, decorators: [{
            type: Injectable,
            args: [{
                    providedIn: 'root',
                }]
        }], ctorParameters: function () { return [{ type: i1.ApiConfiguration }, { type: i2.HttpClient }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGEtY2F0YWxvZ28tY29udHJvbGxlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vYXJjaGl2by9uc3J0bS1nZXN0aW9uYXJjaGl2by1ucG0vc3JjL2FwcC9hcGkvY29tdW5lcy1yZWdpc3Ryby9zZXJ2aWNlcy90YWJsYS1jYXRhbG9nby1jb250cm9sbGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBYyxZQUFZLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFZN0MsTUFBTSxPQUFPLDhCQUErQixTQUFRLFdBQVc7SUFDN0QsWUFDRSxNQUF3QixFQUN4QixJQUFnQjtRQUVoQixLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFPRDs7Ozs7Ozs7O09BU0c7SUFDSCxpQ0FBaUMsQ0FBQyxNQU1qQztRQUlDLE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsOEJBQThCLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEgsSUFBSSxNQUFNLEVBQUU7WUFDVixFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzRCxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FB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QkFBOEI7K0hBQTlCLDhCQUE4QixjQUY3QixNQUFNOzJGQUVQLDhCQUE4QjtrQkFIMUMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBSZXNwb25zZSwgSHR0cENvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vYmFzZS1zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXBpQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL2FwaS1jb25maWd1cmF0aW9uJztcclxuaW1wb3J0IHsgU3RyaWN0SHR0cFJlc3BvbnNlIH0gZnJvbSAnLi4vc3RyaWN0LWh0dHAtcmVzcG9uc2UnO1xyXG5pbXBvcnQgeyBSZXF1ZXN0QnVpbGRlciB9IGZyb20gJy4uL3JlcXVlc3QtYnVpbGRlcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBDdXN0b21QYWdlVGFibGFDYXRhbG9nb0J1c2NhclByb2plY3Rpb24gfSBmcm9tICcuLi9tb2RlbHMvY3VzdG9tLXBhZ2UtdGFibGEtY2F0YWxvZ28tYnVzY2FyLXByb2plY3Rpb24nO1xyXG5pbXBvcnQgeyBGb3JtRWxlbWVudFByb2plY3Rpb24gfSBmcm9tICcuLi9tb2RlbHMvZm9ybS1lbGVtZW50LXByb2plY3Rpb24nO1xyXG5pbXBvcnQgeyBNb3ZIaXNSZWdpc3Ryb3NUYWJsYUNhdGFsb2dvUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvbW92LWhpcy1yZWdpc3Ryb3MtdGFibGEtY2F0YWxvZ28tcmVzcG9uc2UnO1xyXG5pbXBvcnQgeyBUYWJsYUNhdGFsb2dvRGV0YWxsZVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3RhYmxhLWNhdGFsb2dvLWRldGFsbGUtcmVzcG9uc2UnO1xyXG5pbXBvcnQgeyBUYWJsYUNhdGFsb2dvUmVnaXN0cm9SZXNwb25zZSB9IGZyb20gJy4uL21vZGVscy90YWJsYS1jYXRhbG9nby1yZWdpc3Ryby1yZXNwb25zZSc7XHJcbmltcG9ydCB7IFRhYmxhQ2F0YWxvZ29SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWxzL3RhYmxhLWNhdGFsb2dvLXJlcXVlc3QnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRhYmxhQ2F0YWxvZ29Db250cm9sbGVyU2VydmljZSBleHRlbmRzIEJhc2VTZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGNvbmZpZzogQXBpQ29uZmlndXJhdGlvbixcclxuICAgIGh0dHA6IEh0dHBDbGllbnRcclxuICApIHtcclxuICAgIHN1cGVyKGNvbmZpZywgaHR0cCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBtb2RpZmljYXJSZWdpc3Ryb0RldGFsbGVcclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTW9kaWZpY2FyUmVnaXN0cm9EZXRhbGxlUGF0aCA9ICcvY2F0YWxvZ29zL3t0YWJsYV9jYXRhbG9nb19pZH0ve2NvZGlnbzF9L3tjb2RpZ28yfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlYWxpemEgbGEgYWN0dWFsaXphY2lvbiBkZWwgcmVnaXN0cm8gZW4gbGEgdGFibGEgc2VsZWNjaW9uYWRhLlxyXG4gICAqXHJcbiAgICogUmVhbGl6YSBsYSBhY3R1YWxpemFjaW9uIGRlbCByZWdpc3RybyBlbiBsYSB0YWJsYSBzZWxlY2Npb25hZGFcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbW9kaWZpY2FyUmVnaXN0cm9EZXRhbGxlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBzZW5kcyBgYXBwbGljYXRpb24vanNvbmAgYW5kIGhhbmRsZXMgcmVxdWVzdCBib2R5IG9mIHR5cGUgYGFwcGxpY2F0aW9uL2pzb25gLlxyXG4gICAqL1xyXG4gIG1vZGlmaWNhclJlZ2lzdHJvRGV0YWxsZSRSZXNwb25zZShwYXJhbXM6IHtcclxuICAgIHRhYmxhX2NhdGFsb2dvX2lkOiBudW1iZXI7XHJcbiAgICBjb2RpZ28xOiBudW1iZXI7XHJcbiAgICBjb2RpZ28yOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICAgIGJvZHk6IFRhYmxhQ2F0YWxvZ29SZXF1ZXN0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTx7XHJcbn0+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBUYWJsYUNhdGFsb2dvQ29udHJvbGxlclNlcnZpY2UuTW9kaWZpY2FyUmVnaXN0cm9EZXRhbGxlUGF0aCwgJ3B1dCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCd0YWJsYV9jYXRhbG9nb19pZCcsIHBhcmFtcy50YWJsYV9jYXRhbG9nb19pZCwge30pO1xyXG4gICAgICByYi5wYXRoKCdjb2RpZ28xJywgcGFyYW1zLmNvZGlnbzEsIHt9KTtcclxuICAgICAgcmIucGF0aCgnY29kaWdvMicsIHBhcmFtcy5jb2RpZ28yLCB7fSk7XHJcbiAgICAgIHJiLmJvZHkocGFyYW1zLmJvZHksICdhcHBsaWNhdGlvbi9qc29uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8e1xyXG4gICAgICAgIH0+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlYWxpemEgbGEgYWN0dWFsaXphY2lvbiBkZWwgcmVnaXN0cm8gZW4gbGEgdGFibGEgc2VsZWNjaW9uYWRhLlxyXG4gICAqXHJcbiAgICogUmVhbGl6YSBsYSBhY3R1YWxpemFjaW9uIGRlbCByZWdpc3RybyBlbiBsYSB0YWJsYSBzZWxlY2Npb25hZGFcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byBvbmx5IHRvIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAqIFRvIGFjY2VzcyB0aGUgZnVsbCByZXNwb25zZSAoZm9yIGhlYWRlcnMsIGZvciBleGFtcGxlKSwgYG1vZGlmaWNhclJlZ2lzdHJvRGV0YWxsZSRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2Qgc2VuZHMgYGFwcGxpY2F0aW9uL2pzb25gIGFuZCBoYW5kbGVzIHJlcXVlc3QgYm9keSBvZiB0eXBlIGBhcHBsaWNhdGlvbi9qc29uYC5cclxuICAgKi9cclxuICBtb2RpZmljYXJSZWdpc3Ryb0RldGFsbGUocGFyYW1zOiB7XHJcbiAgICB0YWJsYV9jYXRhbG9nb19pZDogbnVtYmVyO1xyXG4gICAgY29kaWdvMTogbnVtYmVyO1xyXG4gICAgY29kaWdvMjogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgICBib2R5OiBUYWJsYUNhdGFsb2dvUmVxdWVzdFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTx7XHJcbn0+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5tb2RpZmljYXJSZWdpc3Ryb0RldGFsbGUkUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTx7XHJcbn0+KSA9PiByLmJvZHkgYXMge1xyXG59KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhdGggcGFydCBmb3Igb3BlcmF0aW9uIGNyZWFyUmVnaXN0cm9EZXRhbGxlXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IENyZWFyUmVnaXN0cm9EZXRhbGxlUGF0aCA9ICcvY2F0YWxvZ29zL3t0YWJsYV9jYXRhbG9nb19pZH0ve2NvZGlnbzF9L3tjb2RpZ28yfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlYWxpemEgZWwgcmVnaXN0cm8gZW4gbGEgdGFibGEgc2VsZWNjaW9uYWRhLlxyXG4gICAqXHJcbiAgICogUmVhbGl6YSBlbCByZWdpc3RybyBlbiBsYSB0YWJsYSBzZWxlY2Npb25hZGFcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgY3JlYXJSZWdpc3Ryb0RldGFsbGUoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHNlbmRzIGBhcHBsaWNhdGlvbi9qc29uYCBhbmQgaGFuZGxlcyByZXF1ZXN0IGJvZHkgb2YgdHlwZSBgYXBwbGljYXRpb24vanNvbmAuXHJcbiAgICovXHJcbiAgY3JlYXJSZWdpc3Ryb0RldGFsbGUkUmVzcG9uc2UocGFyYW1zOiB7XHJcbiAgICB0YWJsYV9jYXRhbG9nb19pZDogbnVtYmVyO1xyXG4gICAgY29kaWdvMTogbnVtYmVyO1xyXG4gICAgY29kaWdvMjogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgICBib2R5OiBUYWJsYUNhdGFsb2dvUmVxdWVzdFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8e1xyXG59Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgVGFibGFDYXRhbG9nb0NvbnRyb2xsZXJTZXJ2aWNlLkNyZWFyUmVnaXN0cm9EZXRhbGxlUGF0aCwgJ3Bvc3QnKTtcclxuICAgIGlmIChwYXJhbXMpIHtcclxuICAgICAgcmIucGF0aCgndGFibGFfY2F0YWxvZ29faWQnLCBwYXJhbXMudGFibGFfY2F0YWxvZ29faWQsIHt9KTtcclxuICAgICAgcmIucGF0aCgnY29kaWdvMScsIHBhcmFtcy5jb2RpZ28xLCB7fSk7XHJcbiAgICAgIHJiLnBhdGgoJ2NvZGlnbzInLCBwYXJhbXMuY29kaWdvMiwge30pO1xyXG4gICAgICByYi5ib2R5KHBhcmFtcy5ib2R5LCAnYXBwbGljYXRpb24vanNvbicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChyYi5idWlsZCh7XHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2pzb24nLFxyXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgY29udGV4dDogcGFyYW1zPy5jb250ZXh0XHJcbiAgICB9KSkucGlwZShcclxuICAgICAgZmlsdGVyKChyOiBhbnkpID0+IHIgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpLFxyXG4gICAgICBtYXAoKHI6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHIgYXMgU3RyaWN0SHR0cFJlc3BvbnNlPHtcclxuICAgICAgICB9PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWFsaXphIGVsIHJlZ2lzdHJvIGVuIGxhIHRhYmxhIHNlbGVjY2lvbmFkYS5cclxuICAgKlxyXG4gICAqIFJlYWxpemEgZWwgcmVnaXN0cm8gZW4gbGEgdGFibGEgc2VsZWNjaW9uYWRhXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBjcmVhclJlZ2lzdHJvRGV0YWxsZSRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2Qgc2VuZHMgYGFwcGxpY2F0aW9uL2pzb25gIGFuZCBoYW5kbGVzIHJlcXVlc3QgYm9keSBvZiB0eXBlIGBhcHBsaWNhdGlvbi9qc29uYC5cclxuICAgKi9cclxuICBjcmVhclJlZ2lzdHJvRGV0YWxsZShwYXJhbXM6IHtcclxuICAgIHRhYmxhX2NhdGFsb2dvX2lkOiBudW1iZXI7XHJcbiAgICBjb2RpZ28xOiBudW1iZXI7XHJcbiAgICBjb2RpZ28yOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICAgIGJvZHk6IFRhYmxhQ2F0YWxvZ29SZXF1ZXN0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPHtcclxufT4ge1xyXG5cclxuICAgIHJldHVybiB0aGlzLmNyZWFyUmVnaXN0cm9EZXRhbGxlJFJlc3BvbnNlKHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKChyOiBTdHJpY3RIdHRwUmVzcG9uc2U8e1xyXG59PikgPT4gci5ib2R5IGFzIHtcclxufSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXRoIHBhcnQgZm9yIG9wZXJhdGlvbiBidXNjYXJUYWJsYUNhdGFsb2dvXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IEJ1c2NhclRhYmxhQ2F0YWxvZ29QYXRoID0gJy9jYXRhbG9nb3MnO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIHJlYWxpemFyIGxhIGJ1c3F1ZWRhIGRlIHRhYmxhcyB0aXBvIDEgLCAyICwgMy5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgcmVhbGl6YXIgbGEgYnVzcXVlZGEgZGUgdGFibGFzIHRpcG8gMSAsIDIgLCAzLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmdWxsIGBIdHRwUmVzcG9uc2VgLCBhbGxvd2luZyBhY2Nlc3MgdG8gcmVzcG9uc2UgaGVhZGVycy5cclxuICAgKiBUbyBhY2Nlc3Mgb25seSB0aGUgcmVzcG9uc2UgYm9keSwgdXNlIGBidXNjYXJUYWJsYUNhdGFsb2dvKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGJ1c2NhclRhYmxhQ2F0YWxvZ28kUmVzcG9uc2UocGFyYW1zPzoge1xyXG4gICAgdGFibGFfY2F0YWxvZ29faWQ/OiBudW1iZXI7XHJcbiAgICB0YWJsYT86IHN0cmluZztcclxuICAgIGRlc2NyaXBjaW9uPzogc3RyaW5nO1xyXG4gICAgdGlwbz86IG51bWJlcjtcclxuICAgIHBhZ2U/OiBudW1iZXI7XHJcbiAgICBwYWdlX3NpemU/OiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8U3RyaWN0SHR0cFJlc3BvbnNlPEN1c3RvbVBhZ2VUYWJsYUNhdGFsb2dvQnVzY2FyUHJvamVjdGlvbj4+IHtcclxuXHJcbiAgICBjb25zdCByYiA9IG5ldyBSZXF1ZXN0QnVpbGRlcih0aGlzLnJvb3RVcmwsIFRhYmxhQ2F0YWxvZ29Db250cm9sbGVyU2VydmljZS5CdXNjYXJUYWJsYUNhdGFsb2dvUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5xdWVyeSgndGFibGFfY2F0YWxvZ29faWQnLCBwYXJhbXMudGFibGFfY2F0YWxvZ29faWQsIHt9KTtcclxuICAgICAgcmIucXVlcnkoJ3RhYmxhJywgcGFyYW1zLnRhYmxhLCB7fSk7XHJcbiAgICAgIHJiLnF1ZXJ5KCdkZXNjcmlwY2lvbicsIHBhcmFtcy5kZXNjcmlwY2lvbiwge30pO1xyXG4gICAgICByYi5xdWVyeSgndGlwbycsIHBhcmFtcy50aXBvLCB7fSk7XHJcbiAgICAgIHJiLnF1ZXJ5KCdwYWdlJywgcGFyYW1zLnBhZ2UsIHt9KTtcclxuICAgICAgcmIucXVlcnkoJ3BhZ2Vfc2l6ZScsIHBhcmFtcy5wYWdlX3NpemUsIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxDdXN0b21QYWdlVGFibGFDYXRhbG9nb0J1c2NhclByb2plY3Rpb24+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgcmVhbGl6YXIgbGEgYnVzcXVlZGEgZGUgdGFibGFzIHRpcG8gMSAsIDIgLCAzLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSByZWFsaXphciBsYSBidXNxdWVkYSBkZSB0YWJsYXMgdGlwbyAxICwgMiAsIDMuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBidXNjYXJUYWJsYUNhdGFsb2dvJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGJ1c2NhclRhYmxhQ2F0YWxvZ28ocGFyYW1zPzoge1xyXG4gICAgdGFibGFfY2F0YWxvZ29faWQ/OiBudW1iZXI7XHJcbiAgICB0YWJsYT86IHN0cmluZztcclxuICAgIGRlc2NyaXBjaW9uPzogc3RyaW5nO1xyXG4gICAgdGlwbz86IG51bWJlcjtcclxuICAgIHBhZ2U/OiBudW1iZXI7XHJcbiAgICBwYWdlX3NpemU/OiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8Q3VzdG9tUGFnZVRhYmxhQ2F0YWxvZ29CdXNjYXJQcm9qZWN0aW9uPiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYnVzY2FyVGFibGFDYXRhbG9nbyRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEN1c3RvbVBhZ2VUYWJsYUNhdGFsb2dvQnVzY2FyUHJvamVjdGlvbj4pID0+IHIuYm9keSBhcyBDdXN0b21QYWdlVGFibGFDYXRhbG9nb0J1c2NhclByb2plY3Rpb24pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyRm9ybUVsZW1lbnRcclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTGlzdGFyRm9ybUVsZW1lbnRQYXRoID0gJy9jYXRhbG9nb3MvbGlzdGFyLWZvcm0tZWxlbWVudC97dGFibGFfY2F0YWxvZ29faWR9JztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIGVsZW1lbnRvcyBkZWwgZm9ybXVsYXJpbyBkZSBsYSB0YWJsYSBhIGRhciBtYW50ZW5pbWllbnRvLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIGVsZW1lbnRvcyBkZWwgZm9ybXVsYXJpbyBkZSBsYSB0YWJsYSBhIGRhciBtYW50ZW5pbWllbnRvXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZ1bGwgYEh0dHBSZXNwb25zZWAsIGFsbG93aW5nIGFjY2VzcyB0byByZXNwb25zZSBoZWFkZXJzLlxyXG4gICAqIFRvIGFjY2VzcyBvbmx5IHRoZSByZXNwb25zZSBib2R5LCB1c2UgYGxpc3RhckZvcm1FbGVtZW50KClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhckZvcm1FbGVtZW50JFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgdGFibGFfY2F0YWxvZ29faWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8Rm9ybUVsZW1lbnRQcm9qZWN0aW9uPj4+IHtcclxuXHJcbiAgICBjb25zdCByYiA9IG5ldyBSZXF1ZXN0QnVpbGRlcih0aGlzLnJvb3RVcmwsIFRhYmxhQ2F0YWxvZ29Db250cm9sbGVyU2VydmljZS5MaXN0YXJGb3JtRWxlbWVudFBhdGgsICdnZXQnKTtcclxuICAgIGlmIChwYXJhbXMpIHtcclxuICAgICAgcmIucGF0aCgndGFibGFfY2F0YWxvZ29faWQnLCBwYXJhbXMudGFibGFfY2F0YWxvZ29faWQsIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxGb3JtRWxlbWVudFByb2plY3Rpb24+PjtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsb3MgZWxlbWVudG9zIGRlbCBmb3JtdWxhcmlvIGRlIGxhIHRhYmxhIGEgZGFyIG1hbnRlbmltaWVudG8uXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsb3MgZWxlbWVudG9zIGRlbCBmb3JtdWxhcmlvIGRlIGxhIHRhYmxhIGEgZGFyIG1hbnRlbmltaWVudG9cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byBvbmx5IHRvIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAqIFRvIGFjY2VzcyB0aGUgZnVsbCByZXNwb25zZSAoZm9yIGhlYWRlcnMsIGZvciBleGFtcGxlKSwgYGxpc3RhckZvcm1FbGVtZW50JFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhckZvcm1FbGVtZW50KHBhcmFtczoge1xyXG4gICAgdGFibGFfY2F0YWxvZ29faWQ6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxGb3JtRWxlbWVudFByb2plY3Rpb24+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubGlzdGFyRm9ybUVsZW1lbnQkUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxGb3JtRWxlbWVudFByb2plY3Rpb24+PikgPT4gci5ib2R5IGFzIEFycmF5PEZvcm1FbGVtZW50UHJvamVjdGlvbj4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyRGV0YWxsZVRhYmxhQ2F0YWxvZ29cclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgTGlzdGFyRGV0YWxsZVRhYmxhQ2F0YWxvZ29QYXRoID0gJy9jYXRhbG9nb3MvbGlzdGFyLWRldGFsbGUve3RhYmxhX2NhdGFsb2dvX2lkfS97Y29kaWdvX3BhZHJlfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRvZG9zIGxvcyByZWdpc3Ryb3MgZGUgbGEgdGFibGEgY2F0YWxvZ28gYSBjb25zdWx0YXIuXHJcbiAgICpcclxuICAgKiBQZXJtaXRlIGxpc3RhciB0b2RvcyBsb3MgcmVnaXN0cm9zIGRlIGxhIHRhYmxhIGNhdGFsb2dvIGEgY29uc3VsdGFyLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmdWxsIGBIdHRwUmVzcG9uc2VgLCBhbGxvd2luZyBhY2Nlc3MgdG8gcmVzcG9uc2UgaGVhZGVycy5cclxuICAgKiBUbyBhY2Nlc3Mgb25seSB0aGUgcmVzcG9uc2UgYm9keSwgdXNlIGBsaXN0YXJEZXRhbGxlVGFibGFDYXRhbG9nbygpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJEZXRhbGxlVGFibGFDYXRhbG9nbyRSZXNwb25zZShwYXJhbXM6IHtcclxuICAgIHRhYmxhX2NhdGFsb2dvX2lkOiBudW1iZXI7XHJcbiAgICBjb2RpZ29fcGFkcmU6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8VGFibGFDYXRhbG9nb0RldGFsbGVSZXNwb25zZT4+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBUYWJsYUNhdGFsb2dvQ29udHJvbGxlclNlcnZpY2UuTGlzdGFyRGV0YWxsZVRhYmxhQ2F0YWxvZ29QYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgIHJiLnBhdGgoJ3RhYmxhX2NhdGFsb2dvX2lkJywgcGFyYW1zLnRhYmxhX2NhdGFsb2dvX2lkLCB7fSk7XHJcbiAgICAgIHJiLnBhdGgoJ2NvZGlnb19wYWRyZScsIHBhcmFtcy5jb2RpZ29fcGFkcmUsIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxUYWJsYUNhdGFsb2dvRGV0YWxsZVJlc3BvbnNlPj47XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgdG9kb3MgbG9zIHJlZ2lzdHJvcyBkZSBsYSB0YWJsYSBjYXRhbG9nbyBhIGNvbnN1bHRhci5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIHRvZG9zIGxvcyByZWdpc3Ryb3MgZGUgbGEgdGFibGEgY2F0YWxvZ28gYSBjb25zdWx0YXIuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJEZXRhbGxlVGFibGFDYXRhbG9nbyRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJEZXRhbGxlVGFibGFDYXRhbG9nbyhwYXJhbXM6IHtcclxuICAgIHRhYmxhX2NhdGFsb2dvX2lkOiBudW1iZXI7XHJcbiAgICBjb2RpZ29fcGFkcmU6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxBcnJheTxUYWJsYUNhdGFsb2dvRGV0YWxsZVJlc3BvbnNlPj4ge1xyXG5cclxuICAgIHJldHVybiB0aGlzLmxpc3RhckRldGFsbGVUYWJsYUNhdGFsb2dvJFJlc3BvbnNlKHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKChyOiBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8VGFibGFDYXRhbG9nb0RldGFsbGVSZXNwb25zZT4+KSA9PiByLmJvZHkgYXMgQXJyYXk8VGFibGFDYXRhbG9nb0RldGFsbGVSZXNwb25zZT4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gbGlzdGFyRGV0YWxsZUhpc3Rvcmljb1xyXG4gICAqL1xyXG4gIHN0YXRpYyByZWFkb25seSBMaXN0YXJEZXRhbGxlSGlzdG9yaWNvUGF0aCA9ICcvY2F0YWxvZ29zL2xpc3Rhci1kZXRhbGxlLWhpc3Rvcmljby97dGFibGFfY2F0YWxvZ29faWR9L3tjb2RpZ28xfS97Y29kaWdvMn0nO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtaXRlIGxpc3RhciBsb3MgcmVnaXN0cm9zIGRlIGxhIHRhYmxhIGNhdGFsb2dvIGEgY29uc3VsdGFyLlxyXG4gICAqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIHJlZ2lzdHJvcyBkZSBsYSB0YWJsYSBjYXRhbG9nbyBhIGNvbnN1bHRhci5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgbGlzdGFyRGV0YWxsZUhpc3RvcmljbygpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBsaXN0YXJEZXRhbGxlSGlzdG9yaWNvJFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgdGFibGFfY2F0YWxvZ29faWQ6IG51bWJlcjtcclxuICAgIGNvZGlnbzE6IG51bWJlcjtcclxuICAgIGNvZGlnbzI6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8TW92SGlzUmVnaXN0cm9zVGFibGFDYXRhbG9nb1Jlc3BvbnNlPj4+IHtcclxuXHJcbiAgICBjb25zdCByYiA9IG5ldyBSZXF1ZXN0QnVpbGRlcih0aGlzLnJvb3RVcmwsIFRhYmxhQ2F0YWxvZ29Db250cm9sbGVyU2VydmljZS5MaXN0YXJEZXRhbGxlSGlzdG9yaWNvUGF0aCwgJ2dldCcpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCd0YWJsYV9jYXRhbG9nb19pZCcsIHBhcmFtcy50YWJsYV9jYXRhbG9nb19pZCwge30pO1xyXG4gICAgICByYi5wYXRoKCdjb2RpZ28xJywgcGFyYW1zLmNvZGlnbzEsIHt9KTtcclxuICAgICAgcmIucGF0aCgnY29kaWdvMicsIHBhcmFtcy5jb2RpZ28yLCB7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8TW92SGlzUmVnaXN0cm9zVGFibGFDYXRhbG9nb1Jlc3BvbnNlPj47XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWl0ZSBsaXN0YXIgbG9zIHJlZ2lzdHJvcyBkZSBsYSB0YWJsYSBjYXRhbG9nbyBhIGNvbnN1bHRhci5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgbGlzdGFyIGxvcyByZWdpc3Ryb3MgZGUgbGEgdGFibGEgY2F0YWxvZ28gYSBjb25zdWx0YXIuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gb25seSB0byB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKiBUbyBhY2Nlc3MgdGhlIGZ1bGwgcmVzcG9uc2UgKGZvciBoZWFkZXJzLCBmb3IgZXhhbXBsZSksIGBsaXN0YXJEZXRhbGxlSGlzdG9yaWNvJFJlc3BvbnNlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGxpc3RhckRldGFsbGVIaXN0b3JpY28ocGFyYW1zOiB7XHJcbiAgICB0YWJsYV9jYXRhbG9nb19pZDogbnVtYmVyO1xyXG4gICAgY29kaWdvMTogbnVtYmVyO1xyXG4gICAgY29kaWdvMjogbnVtYmVyO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPEFycmF5PE1vdkhpc1JlZ2lzdHJvc1RhYmxhQ2F0YWxvZ29SZXNwb25zZT4+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5saXN0YXJEZXRhbGxlSGlzdG9yaWNvJFJlc3BvbnNlKHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKChyOiBTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8TW92SGlzUmVnaXN0cm9zVGFibGFDYXRhbG9nb1Jlc3BvbnNlPj4pID0+IHIuYm9keSBhcyBBcnJheTxNb3ZIaXNSZWdpc3Ryb3NUYWJsYUNhdGFsb2dvUmVzcG9uc2U+KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhdGggcGFydCBmb3Igb3BlcmF0aW9uIG9idGVuZXJSZWdpc3Ryb0RldGFsbGVcclxuICAgKi9cclxuICBzdGF0aWMgcmVhZG9ubHkgT2J0ZW5lclJlZ2lzdHJvRGV0YWxsZVBhdGggPSAnL2NhdGFsb2dvcy9kZXRhbGxlL3t0YWJsYV9jYXRhbG9nb19pZH0ve2NvZGlnbzF9L3tjb2RpZ28yfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgb2J0ZW5lciBsb3MgZGF0b3MgZGVsIHJlZ2lzdHJvIGRlIGxhIHRhYmxhIHNlbGVjY2lvbmFkYS5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgb2J0ZW5lciBsb3MgZGF0b3MgZGVsIHJlZ2lzdHJvIGRlIGxhIHRhYmxhIHNlbGVjY2lvbmFkYS5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgb2J0ZW5lclJlZ2lzdHJvRGV0YWxsZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBvYnRlbmVyUmVnaXN0cm9EZXRhbGxlJFJlc3BvbnNlKHBhcmFtczoge1xyXG4gICAgdGFibGFfY2F0YWxvZ29faWQ6IG51bWJlcjtcclxuICAgIGNvZGlnbzE6IG51bWJlcjtcclxuICAgIGNvZGlnbzI6IG51bWJlcjtcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxTdHJpY3RIdHRwUmVzcG9uc2U8QXJyYXk8VGFibGFDYXRhbG9nb1JlZ2lzdHJvUmVzcG9uc2U+Pj4ge1xyXG5cclxuICAgIGNvbnN0IHJiID0gbmV3IFJlcXVlc3RCdWlsZGVyKHRoaXMucm9vdFVybCwgVGFibGFDYXRhbG9nb0NvbnRyb2xsZXJTZXJ2aWNlLk9idGVuZXJSZWdpc3Ryb0RldGFsbGVQYXRoLCAnZ2V0Jyk7XHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgIHJiLnBhdGgoJ3RhYmxhX2NhdGFsb2dvX2lkJywgcGFyYW1zLnRhYmxhX2NhdGFsb2dvX2lkLCB7fSk7XHJcbiAgICAgIHJiLnBhdGgoJ2NvZGlnbzEnLCBwYXJhbXMuY29kaWdvMSwge30pO1xyXG4gICAgICByYi5wYXRoKCdjb2RpZ28yJywgcGFyYW1zLmNvZGlnbzIsIHt9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmIuYnVpbGQoe1xyXG4gICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcclxuICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgIGNvbnRleHQ6IHBhcmFtcz8uY29udGV4dFxyXG4gICAgfSkpLnBpcGUoXHJcbiAgICAgIGZpbHRlcigocjogYW55KSA9PiByIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSxcclxuICAgICAgbWFwKChyOiBIdHRwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgIHJldHVybiByIGFzIFN0cmljdEh0dHBSZXNwb25zZTxBcnJheTxUYWJsYUNhdGFsb2dvUmVnaXN0cm9SZXNwb25zZT4+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1pdGUgb2J0ZW5lciBsb3MgZGF0b3MgZGVsIHJlZ2lzdHJvIGRlIGxhIHRhYmxhIHNlbGVjY2lvbmFkYS5cclxuICAgKlxyXG4gICAqIFBlcm1pdGUgb2J0ZW5lciBsb3MgZGF0b3MgZGVsIHJlZ2lzdHJvIGRlIGxhIHRhYmxhIHNlbGVjY2lvbmFkYS5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byBvbmx5IHRvIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAqIFRvIGFjY2VzcyB0aGUgZnVsbCByZXNwb25zZSAoZm9yIGhlYWRlcnMsIGZvciBleGFtcGxlKSwgYG9idGVuZXJSZWdpc3Ryb0RldGFsbGUkUmVzcG9uc2UoKWAgaW5zdGVhZC5cclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhwZWN0IGFueSByZXF1ZXN0IGJvZHkuXHJcbiAgICovXHJcbiAgb2J0ZW5lclJlZ2lzdHJvRGV0YWxsZShwYXJhbXM6IHtcclxuICAgIHRhYmxhX2NhdGFsb2dvX2lkOiBudW1iZXI7XHJcbiAgICBjb2RpZ28xOiBudW1iZXI7XHJcbiAgICBjb2RpZ28yOiBudW1iZXI7XHJcbiAgICBjb250ZXh0PzogSHR0cENvbnRleHRcclxuICB9XHJcbik6IE9ic2VydmFibGU8QXJyYXk8VGFibGFDYXRhbG9nb1JlZ2lzdHJvUmVzcG9uc2U+PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMub2J0ZW5lclJlZ2lzdHJvRGV0YWxsZSRSZXNwb25zZShwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcCgocjogU3RyaWN0SHR0cFJlc3BvbnNlPEFycmF5PFRhYmxhQ2F0YWxvZ29SZWdpc3Ryb1Jlc3BvbnNlPj4pID0+IHIuYm9keSBhcyBBcnJheTxUYWJsYUNhdGFsb2dvUmVnaXN0cm9SZXNwb25zZT4pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBwYXJ0IGZvciBvcGVyYXRpb24gYW51bGFyUmVnaXN0cm9EZXRhbGxlXHJcbiAgICovXHJcbiAgc3RhdGljIHJlYWRvbmx5IEFudWxhclJlZ2lzdHJvRGV0YWxsZVBhdGggPSAnL2NhdGFsb2dvcy97dGFibGFfY2F0YWxvZ29faWR9L3tjb2RpZ28xfS97Y29kaWdvMn0ve3Rlcm1pbmFsfSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlYWxpemEgbGEgYW51bGFjacOzbiBkZWwgcmVnaXN0cm8gZW4gbGEgdGFibGEgc2VsZWNjaW9uYWRhLlxyXG4gICAqXHJcbiAgICogUmVhbGl6YSBsYSBhbnVsYWNpw7NuIGRlbCByZWdpc3RybyBlbiBsYSB0YWJsYSBzZWxlY2Npb25hZGFcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnVsbCBgSHR0cFJlc3BvbnNlYCwgYWxsb3dpbmcgYWNjZXNzIHRvIHJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICogVG8gYWNjZXNzIG9ubHkgdGhlIHJlc3BvbnNlIGJvZHksIHVzZSBgYW51bGFyUmVnaXN0cm9EZXRhbGxlKClgIGluc3RlYWQuXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGV4cGVjdCBhbnkgcmVxdWVzdCBib2R5LlxyXG4gICAqL1xyXG4gIGFudWxhclJlZ2lzdHJvRGV0YWxsZSRSZXNwb25zZShwYXJhbXM6IHtcclxuICAgIHRhYmxhX2NhdGFsb2dvX2lkOiBudW1iZXI7XHJcbiAgICBjb2RpZ28xOiBudW1iZXI7XHJcbiAgICBjb2RpZ28yOiBudW1iZXI7XHJcbiAgICB0ZXJtaW5hbDogc3RyaW5nO1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0XHJcbiAgfVxyXG4pOiBPYnNlcnZhYmxlPFN0cmljdEh0dHBSZXNwb25zZTx7XHJcbn0+PiB7XHJcblxyXG4gICAgY29uc3QgcmIgPSBuZXcgUmVxdWVzdEJ1aWxkZXIodGhpcy5yb290VXJsLCBUYWJsYUNhdGFsb2dvQ29udHJvbGxlclNlcnZpY2UuQW51bGFyUmVnaXN0cm9EZXRhbGxlUGF0aCwgJ2RlbGV0ZScpO1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICByYi5wYXRoKCd0YWJsYV9jYXRhbG9nb19pZCcsIHBhcmFtcy50YWJsYV9jYXRhbG9nb19pZCwge30pO1xyXG4gICAgICByYi5wYXRoKCdjb2RpZ28xJywgcGFyYW1zLmNvZGlnbzEsIHt9KTtcclxuICAgICAgcmIucGF0aCgnY29kaWdvMicsIHBhcmFtcy5jb2RpZ28yLCB7fSk7XHJcbiAgICAgIHJiLnBhdGgoJ3Rlcm1pbmFsJywgcGFyYW1zLnRlcm1pbmFsLCB7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJiLmJ1aWxkKHtcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXHJcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICBjb250ZXh0OiBwYXJhbXM/LmNvbnRleHRcclxuICAgIH0pKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoKHI6IGFueSkgPT4gciBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSksXHJcbiAgICAgIG1hcCgocjogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgICByZXR1cm4gciBhcyBTdHJpY3RIdHRwUmVzcG9uc2U8e1xyXG4gICAgICAgIH0+O1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlYWxpemEgbGEgYW51bGFjacOzbiBkZWwgcmVnaXN0cm8gZW4gbGEgdGFibGEgc2VsZWNjaW9uYWRhLlxyXG4gICAqXHJcbiAgICogUmVhbGl6YSBsYSBhbnVsYWNpw7NuIGRlbCByZWdpc3RybyBlbiBsYSB0YWJsYSBzZWxlY2Npb25hZGFcclxuICAgKlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byBvbmx5IHRvIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAqIFRvIGFjY2VzcyB0aGUgZnVsbCByZXNwb25zZSAoZm9yIGhlYWRlcnMsIGZvciBleGFtcGxlKSwgYGFudWxhclJlZ2lzdHJvRGV0YWxsZSRSZXNwb25zZSgpYCBpbnN0ZWFkLlxyXG4gICAqXHJcbiAgICogVGhpcyBtZXRob2QgZG9lc24ndCBleHBlY3QgYW55IHJlcXVlc3QgYm9keS5cclxuICAgKi9cclxuICBhbnVsYXJSZWdpc3Ryb0RldGFsbGUocGFyYW1zOiB7XHJcbiAgICB0YWJsYV9jYXRhbG9nb19pZDogbnVtYmVyO1xyXG4gICAgY29kaWdvMTogbnVtYmVyO1xyXG4gICAgY29kaWdvMjogbnVtYmVyO1xyXG4gICAgdGVybWluYWw6IHN0cmluZztcclxuICAgIGNvbnRleHQ/OiBIdHRwQ29udGV4dFxyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTx7XHJcbn0+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5hbnVsYXJSZWdpc3Ryb0RldGFsbGUkUmVzcG9uc2UocGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAoKHI6IFN0cmljdEh0dHBSZXNwb25zZTx7XHJcbn0+KSA9PiByLmJvZHkgYXMge1xyXG59KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==