dmencu 3.2.20 → 3.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -42
- package/dist/client/client/client.js +3 -3
- package/dist/client/unlogged/abrir-formulario.js +1 -1
- package/dist/client/unlogged/bypass-formulario.d.ts +6 -42
- package/dist/client/unlogged/bypass-formulario.js +84 -219
- package/dist/client/unlogged/calculos-encuesta.d.ts +7 -0
- package/dist/client/unlogged/calculos-encuesta.js +213 -0
- package/dist/client/unlogged/helpers-casilleros.d.ts +14 -0
- package/dist/client/unlogged/helpers-casilleros.js +123 -0
- package/dist/client/unlogged/helpers-formulario.d.ts +16 -0
- package/dist/client/unlogged/helpers-formulario.js +88 -0
- package/dist/client/unlogged/redux-formulario.d.ts +1 -2
- package/dist/client/unlogged/redux-formulario.js +21 -31
- package/dist/client/unlogged/render-formulario.d.ts +2 -6
- package/dist/client/unlogged/render-formulario.js +29 -68
- package/dist/client/unlogged/render-formulario.tsx +29 -57
- package/dist/client/unlogged/render-general.js +1 -1
- package/dist/client/unlogged/render-general.tsx +1 -1
- package/dist/client/unlogged/tipos.d.ts +74 -40
- package/dist/client/unlogged/tipos.js +1 -1
- package/dist/server/app-dmencu.d.ts +1428 -0
- package/dist/server/app-dmencu.js +1054 -0
- package/dist/server/def-config.d.ts +1 -0
- package/dist/server/def-config.js +123 -0
- package/dist/server/procedures-dmencu.d.ts +43 -0
- package/dist/server/procedures-dmencu.js +2295 -0
- package/dist/server/server/app-dmencu.d.ts +42 -91
- package/dist/server/server/app-dmencu.js +114 -52
- package/dist/server/server/procedures-dmencu.d.ts +34 -2
- package/dist/server/server/procedures-dmencu.js +217 -78
- package/dist/server/server/setters-rea-no-rea.d.ts +13 -0
- package/dist/server/server/setters-rea-no-rea.js +35 -0
- package/dist/server/server/table-areas.js +4 -4
- package/dist/server/server/table-areas_asignacion_general.js +2 -1
- package/dist/server/server/table-control_campo.js +4 -4
- package/dist/server/server/table-no_rea.js +4 -2
- package/dist/server/server/table-no_rea_sup.js +7 -3
- package/dist/server/server/table-personal.js +1 -1
- package/dist/server/server/table-rea.js +9 -5
- package/dist/server/server/table-rea_sup.js +8 -4
- package/dist/server/server/table-tareas_tem.js +2 -2
- package/dist/server/server/table-tem.js +2 -2
- package/dist/server/server/types-dmencu.d.ts +34 -2
- package/dist/server/server/types-dmencu.js +2 -1
- package/dist/server/setters-rea-no-rea.d.ts +13 -0
- package/dist/server/setters-rea-no-rea.js +35 -0
- package/dist/server/table-acciones.d.ts +2 -0
- package/dist/server/table-acciones.js +45 -0
- package/dist/server/table-area_enc_proximas.d.ts +2 -0
- package/dist/server/table-area_enc_proximas.js +30 -0
- package/dist/server/table-areas.d.ts +4 -0
- package/dist/server/table-areas.js +112 -0
- package/dist/server/table-areas_asignacion_general.d.ts +2 -0
- package/dist/server/table-areas_asignacion_general.js +86 -0
- package/dist/server/table-barrios.d.ts +2 -0
- package/dist/server/table-barrios.js +35 -0
- package/dist/server/table-comunas.d.ts +2 -0
- package/dist/server/table-comunas.js +33 -0
- package/dist/server/table-control_campo.d.ts +12 -0
- package/dist/server/table-control_campo.js +119 -0
- package/dist/server/table-control_dias_carga.d.ts +2 -0
- package/dist/server/table-control_dias_carga.js +63 -0
- package/dist/server/table-control_resumen.d.ts +2 -0
- package/dist/server/table-control_resumen.js +19 -0
- package/dist/server/table-diccionario.d.ts +2 -0
- package/dist/server/table-diccionario.js +32 -0
- package/dist/server/table-dictra.d.ts +2 -0
- package/dist/server/table-dictra.js +46 -0
- package/dist/server/table-dicvar.d.ts +2 -0
- package/dist/server/table-dicvar.js +32 -0
- package/dist/server/table-encuestadores.d.ts +13 -0
- package/dist/server/table-encuestadores.js +75 -0
- package/dist/server/table-estados.d.ts +2 -0
- package/dist/server/table-estados.js +47 -0
- package/dist/server/table-estados_acciones.d.ts +2 -0
- package/dist/server/table-estados_acciones.js +40 -0
- package/dist/server/table-fracciones.d.ts +2 -0
- package/dist/server/table-fracciones.js +37 -0
- package/dist/server/table-grilla_hoja_ruta.d.ts +2 -0
- package/dist/server/table-grilla_hoja_ruta.js +93 -0
- package/dist/server/table-historial_tem.d.ts +2 -0
- package/dist/server/table-historial_tem.js +57 -0
- package/dist/server/table-hogares.d.ts +2 -0
- package/dist/server/table-hogares.js +156 -0
- package/dist/server/table-hogares_sup.d.ts +2 -0
- package/dist/server/table-hogares_sup.js +191 -0
- package/dist/server/table-inconsistencias_cumplen_condicion.d.ts +2 -0
- package/dist/server/table-inconsistencias_cumplen_condicion.js +33 -0
- package/dist/server/table-manzanas.d.ts +2 -0
- package/dist/server/table-manzanas.js +36 -0
- package/dist/server/table-mis_encuestadores.d.ts +2 -0
- package/dist/server/table-mis_encuestadores.js +77 -0
- package/dist/server/table-mis_tareas.d.ts +2 -0
- package/dist/server/table-mis_tareas.js +18 -0
- package/dist/server/table-mis_tareas_areas.d.ts +2 -0
- package/dist/server/table-mis_tareas_areas.js +20 -0
- package/dist/server/table-modos_dm.d.ts +2 -0
- package/dist/server/table-modos_dm.js +28 -0
- package/dist/server/table-no_rea.js +38 -0
- package/dist/server/table-no_rea_sup.js +36 -0
- package/dist/server/table-operaciones.d.ts +2 -0
- package/dist/server/table-operaciones.js +30 -0
- package/dist/server/table-parametros.d.ts +2 -0
- package/dist/server/table-parametros.js +40 -0
- package/dist/server/table-permisos.d.ts +2 -0
- package/dist/server/table-permisos.js +31 -0
- package/dist/server/table-personal.d.ts +5 -0
- package/dist/server/table-personal.js +62 -0
- package/dist/server/table-personal_rol.d.ts +2 -0
- package/dist/server/table-personal_rol.js +42 -0
- package/dist/server/table-personas.d.ts +2 -0
- package/dist/server/table-personas.js +448 -0
- package/dist/server/table-personas_sup.d.ts +2 -0
- package/dist/server/table-personas_sup.js +93 -0
- package/dist/server/table-radios.d.ts +2 -0
- package/dist/server/table-radios.js +37 -0
- package/dist/server/table-rea.d.ts +2 -0
- package/dist/server/table-rea.js +38 -0
- package/dist/server/table-rea_sup.d.ts +2 -0
- package/dist/server/table-rea_sup.js +38 -0
- package/dist/server/table-recepcionistas.d.ts +2 -0
- package/dist/server/table-recepcionistas.js +18 -0
- package/dist/server/table-recuperadores.d.ts +2 -0
- package/dist/server/table-recuperadores.js +18 -0
- package/dist/server/table-roles.d.ts +2 -0
- package/dist/server/table-roles.js +33 -0
- package/dist/server/table-roles_permisos.d.ts +2 -0
- package/dist/server/table-roles_permisos.js +36 -0
- package/dist/server/table-roles_subordinados.d.ts +2 -0
- package/dist/server/table-roles_subordinados.js +31 -0
- package/dist/server/table-semanas.d.ts +2 -0
- package/dist/server/table-semanas.js +42 -0
- package/dist/server/table-sincronizaciones.d.ts +2 -0
- package/dist/server/table-sincronizaciones.js +30 -0
- package/dist/server/table-supervisores.d.ts +2 -0
- package/dist/server/table-supervisores.js +18 -0
- package/dist/server/table-tareas.d.ts +2 -0
- package/dist/server/table-tareas.js +48 -0
- package/dist/server/table-tareas_areas.d.ts +7 -0
- package/dist/server/table-tareas_areas.js +112 -0
- package/dist/server/table-tareas_proximas.d.ts +2 -0
- package/dist/server/table-tareas_proximas.js +48 -0
- package/dist/server/table-tareas_tem.d.ts +14 -0
- package/dist/server/table-tareas_tem.js +206 -0
- package/dist/server/table-tareas_tem_analisis_campo.d.ts +2 -0
- package/dist/server/table-tareas_tem_analisis_campo.js +31 -0
- package/dist/server/table-tareas_tem_fin_campo.d.ts +3 -0
- package/dist/server/table-tareas_tem_fin_campo.js +56 -0
- package/dist/server/table-tareas_tem_ingreso.d.ts +2 -0
- package/dist/server/table-tareas_tem_ingreso.js +31 -0
- package/dist/server/table-tareas_tem_procesamiento.d.ts +2 -0
- package/dist/server/table-tareas_tem_procesamiento.js +34 -0
- package/dist/server/table-tareas_tem_recepcion.d.ts +6 -0
- package/dist/server/table-tareas_tem_recepcion.js +59 -0
- package/dist/server/table-tem.d.ts +3 -0
- package/dist/server/table-tem.js +247 -0
- package/dist/server/table-tem_asignacion.d.ts +2 -0
- package/dist/server/table-tem_asignacion.js +50 -0
- package/dist/server/table-tem_borradas.d.ts +2 -0
- package/dist/server/table-tem_borradas.js +35 -0
- package/dist/server/table-usuarios.d.ts +2 -0
- package/dist/server/table-usuarios.js +63 -0
- package/dist/server/table-visitas.d.ts +2 -0
- package/dist/server/table-visitas.js +91 -0
- package/dist/server/table-visitas_sup.d.ts +2 -0
- package/dist/server/table-visitas_sup.js +91 -0
- package/dist/server/table-viviendas.d.ts +2 -0
- package/dist/server/table-viviendas.js +299 -0
- package/dist/server/types-dmencu.d.ts +95 -0
- package/dist/server/types-dmencu.js +34 -0
- package/dist/server/unlogged/tipos.d.ts +74 -40
- package/dist/server/unlogged/tipos.js +1 -1
- package/dist/test/app-para-tests.d.ts +1115 -0
- package/dist/test/app-para-tests.js +95 -0
- package/dist/test/test-caches-rea.d.ts +1 -0
- package/dist/test/test-caches-rea.js +243 -0
- package/dist/test/test-ejemplo.d.ts +1 -0
- package/dist/test/test-ejemplo.js +29 -0
- package/dist/test/test-helpers-casilleros.d.ts +1 -0
- package/dist/test/test-helpers-casilleros.js +154 -0
- package/dist/test/test-helpers-formulario.d.ts +1 -0
- package/dist/test/test-helpers-formulario.js +95 -0
- package/dist/test/test-impacto-rea-no-rea-en-bd.d.ts +1 -0
- package/dist/test/test-impacto-rea-no-rea-en-bd.js +243 -0
- package/dist/test/test-menu-segun-rol.d.ts +1 -0
- package/dist/test/test-menu-segun-rol.js +170 -0
- package/dist/test/test-rea-no-rea.d.ts +1 -0
- package/dist/test/test-rea-no-rea.js +589 -0
- package/dist/test/test-setters-rea-no-rea.d.ts +1 -0
- package/dist/test/test-setters-rea-no-rea.js +95 -0
- package/dist/test/test.d.ts +8 -0
- package/dist/test/test.js +21 -0
- package/dist/unlogged/calculos-encuesta.d.ts +7 -0
- package/dist/unlogged/calculos-encuesta.js +213 -0
- package/dist/unlogged/helpers-casilleros.d.ts +14 -0
- package/dist/unlogged/helpers-casilleros.js +123 -0
- package/dist/unlogged/helpers-formulario.d.ts +16 -0
- package/dist/unlogged/helpers-formulario.js +88 -0
- package/dist/unlogged/tipos.d.ts +575 -0
- package/dist/unlogged/tipos.js +21 -0
- package/dist/unlogged/unlogged/abrir-formulario.js +1 -1
- package/dist/unlogged/unlogged/bypass-formulario.d.ts +6 -42
- package/dist/unlogged/unlogged/bypass-formulario.js +84 -219
- package/dist/unlogged/unlogged/calculos-encuesta.d.ts +7 -0
- package/dist/unlogged/unlogged/calculos-encuesta.js +213 -0
- package/dist/unlogged/unlogged/helpers-casilleros.d.ts +14 -0
- package/dist/unlogged/unlogged/helpers-casilleros.js +123 -0
- package/dist/unlogged/unlogged/helpers-formulario.d.ts +16 -0
- package/dist/unlogged/unlogged/helpers-formulario.js +88 -0
- package/dist/unlogged/unlogged/redux-formulario.d.ts +1 -2
- package/dist/unlogged/unlogged/redux-formulario.js +21 -31
- package/dist/unlogged/unlogged/render-formulario.d.ts +2 -6
- package/dist/unlogged/unlogged/render-formulario.js +29 -68
- package/dist/unlogged/unlogged/render-formulario.tsx +29 -57
- package/dist/unlogged/unlogged/render-general.js +1 -1
- package/dist/unlogged/unlogged/render-general.tsx +1 -1
- package/dist/unlogged/unlogged/tipos.d.ts +74 -40
- package/dist/unlogged/unlogged/tipos.js +1 -1
- package/dist/unlogged/unlogged/unlogged.js +2 -2
- package/install/accion_cumple_condicion.sql +1 -1
- package/install/generador_accion_cumple_condicion.sql +2 -2
- package/install/tarea_cumple_condicion.sql +1 -1
- package/install/xcalcular_resultado_trg.sql +1 -1
- package/package.json +20 -17
- package/dist/server/server/table-no_rea copy.js +0 -38
- package/dist/server/server/table-no_rea_sup copy.js +0 -36
- /package/dist/server/{server/table-no_rea copy.d.ts → table-no_rea.d.ts} +0 -0
- /package/dist/server/{server/table-no_rea_sup copy.d.ts → table-no_rea_sup.d.ts} +0 -0
|
@@ -0,0 +1,2295 @@
|
|
|
1
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
2
|
+
if (k2 === undefined) k2 = k;
|
|
3
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
4
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
5
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
6
|
+
}
|
|
7
|
+
Object.defineProperty(o, k2, desc);
|
|
8
|
+
}) : (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
o[k2] = m[k];
|
|
11
|
+
}));
|
|
12
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
13
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
14
|
+
};
|
|
15
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
16
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
17
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
18
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
19
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
20
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
21
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
(function (factory) {
|
|
25
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
26
|
+
var v = factory(require, exports);
|
|
27
|
+
if (v !== undefined) module.exports = v;
|
|
28
|
+
}
|
|
29
|
+
else if (typeof define === "function" && define.amd) {
|
|
30
|
+
define(["require", "exports", "like-ar", "./types-dmencu", "pg-promise-strict", "best-globals", "fs", "expre-parser", "./table-tareas_tem", "console", "cast-error", "./app-dmencu", "./setters-rea-no-rea"], factory);
|
|
31
|
+
}
|
|
32
|
+
})(function (require, exports) {
|
|
33
|
+
"use strict";
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.ProceduresDmEncu = exports.setHdrQuery = exports.guardarEncuestaEnTem = exports.getOperativoActual = exports.setMaxEncPorArea = exports.setGenerarIdEncFun = void 0;
|
|
36
|
+
exports.consultaUpdateTem = consultaUpdateTem;
|
|
37
|
+
exports.consultaUpdateTareasTemPorDescarga = consultaUpdateTareasTemPorDescarga;
|
|
38
|
+
exports.reasNoReasDelOperativo = reasNoReasDelOperativo;
|
|
39
|
+
exports.pasarEncuestasAProie = pasarEncuestasAProie;
|
|
40
|
+
const likeAr = require("like-ar");
|
|
41
|
+
__exportStar(require("./types-dmencu"), exports);
|
|
42
|
+
const pg_promise_strict_1 = require("pg-promise-strict");
|
|
43
|
+
const best_globals_1 = require("best-globals");
|
|
44
|
+
const fs_1 = require("fs");
|
|
45
|
+
const ExpresionParser = require("expre-parser");
|
|
46
|
+
const table_tareas_tem_1 = require("./table-tareas_tem");
|
|
47
|
+
const console_1 = require("console");
|
|
48
|
+
const cast_error_1 = require("cast-error");
|
|
49
|
+
const app_dmencu_1 = require("./app-dmencu");
|
|
50
|
+
const setters_rea_no_rea_1 = require("./setters-rea-no-rea");
|
|
51
|
+
var Path = require('path');
|
|
52
|
+
var sqlTools = require('sql-tools');
|
|
53
|
+
var discrepances = require('discrepances');
|
|
54
|
+
const formPrincipal = 'F:F1';
|
|
55
|
+
const ESTADO_POSTERIOR_CARGA = 'C';
|
|
56
|
+
const ESTADO_POSTERIOR_DESCARGA = 'D';
|
|
57
|
+
const OPERACION_PREPARAR_CARGA = 'cargar';
|
|
58
|
+
const OPERACION_PREPARAR_DESCARGA = 'descargar';
|
|
59
|
+
const DEFAULT_DOMINIO = 3;
|
|
60
|
+
var generarIdEncFun;
|
|
61
|
+
var maxAEncPorArea = 999;
|
|
62
|
+
const setGenerarIdEncFun = (fun) => generarIdEncFun = fun;
|
|
63
|
+
exports.setGenerarIdEncFun = setGenerarIdEncFun;
|
|
64
|
+
const setMaxEncPorArea = (max) => maxAEncPorArea = max;
|
|
65
|
+
exports.setMaxEncPorArea = setMaxEncPorArea;
|
|
66
|
+
(0, exports.setGenerarIdEncFun)((area, numEnc) => area.toString() + numEnc.toString().padStart(maxAEncPorArea.toString().length, '0'));
|
|
67
|
+
(0, exports.setMaxEncPorArea)(999);
|
|
68
|
+
function generarNuevoIdEnc(context, operativo, area, maxAEncPorArea) {
|
|
69
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
const siguienteNumeroEncuesta = (yield context.client.query(`
|
|
71
|
+
SELECT obtener_siguiente_contador_area($1,$2,$3) AS next_counter;
|
|
72
|
+
`, [operativo, area, maxAEncPorArea]).fetchUniqueValue()).value;
|
|
73
|
+
return generarIdEncFun(area, siguienteNumeroEncuesta);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const getOperativoActual = (context) => __awaiter(void 0, void 0, void 0, function* () {
|
|
77
|
+
var be = context.be;
|
|
78
|
+
var operativo = (yield context.client.query(`select operativo
|
|
79
|
+
from parametros
|
|
80
|
+
where unico_registro`, []).fetchUniqueValue()).value;
|
|
81
|
+
if (operativo) {
|
|
82
|
+
return operativo;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
throw Error('no se configuró un operativo en la tabla parámetros');
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
exports.getOperativoActual = getOperativoActual;
|
|
89
|
+
function getDefaultTarea(context, operativo) {
|
|
90
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
91
|
+
return (yield context.client.query(`
|
|
92
|
+
select *
|
|
93
|
+
from tareas
|
|
94
|
+
where es_inicial and operativo = $1
|
|
95
|
+
`, [operativo]).fetchUniqueRow()).row;
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function getOperativoPermiteGenerarMuestra(client, operativo) {
|
|
99
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
100
|
+
return (yield client.query(`
|
|
101
|
+
select permite_generar_muestra
|
|
102
|
+
from operativos
|
|
103
|
+
where operativo = $1
|
|
104
|
+
`, [operativo]).fetchUniqueValue()).value;
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function persistirEncuestaAutogeneradaEnDM(context, OPERATIVO, area, encAutogeneradoDm, token, respuestasRaiz, recepcionista, asignado, modo_dm, cambia_modo_dm) {
|
|
108
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
109
|
+
let idEnc = null;
|
|
110
|
+
var permite_generar_muestra = yield getOperativoPermiteGenerarMuestra(context.client, OPERATIVO);
|
|
111
|
+
if (permite_generar_muestra) {
|
|
112
|
+
const autogeneradoField = modo_dm == 'produc' ? 'enc_autogenerado_dm' : 'enc_autogenerado_dm_capa';
|
|
113
|
+
const resultUpdate = yield context.client.query(`
|
|
114
|
+
UPDATE tem
|
|
115
|
+
set (json_backup, json_encuesta, fecha_backup) =
|
|
116
|
+
($4, $5, current_timestamp)
|
|
117
|
+
where (operativo = $1 and ${context.be.db.quoteIdent(autogeneradoField)} = $2 and token_autogenerado_dm = $3)
|
|
118
|
+
returning *
|
|
119
|
+
`, [OPERATIVO, encAutogeneradoDm, token, respuestasRaiz, respuestasRaiz]).fetchOneRowIfExists();
|
|
120
|
+
// hago insert porque no existe en tem
|
|
121
|
+
const defaultTarea = yield getDefaultTarea(context, OPERATIVO);
|
|
122
|
+
if (resultUpdate.rowCount == 0) {
|
|
123
|
+
idEnc = yield generarNuevoIdEnc(context, OPERATIVO, area, maxAEncPorArea);
|
|
124
|
+
yield context.client.query(`
|
|
125
|
+
INSERT into tem (
|
|
126
|
+
operativo,
|
|
127
|
+
enc,
|
|
128
|
+
area,
|
|
129
|
+
dominio,
|
|
130
|
+
habilitada,
|
|
131
|
+
${context.be.db.quoteIdent(autogeneradoField)},
|
|
132
|
+
token_autogenerado_dm,
|
|
133
|
+
tarea_actual,
|
|
134
|
+
json_backup,
|
|
135
|
+
json_encuesta,
|
|
136
|
+
fecha_backup
|
|
137
|
+
)
|
|
138
|
+
values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, current_timestamp)
|
|
139
|
+
returning *
|
|
140
|
+
`, [
|
|
141
|
+
OPERATIVO,
|
|
142
|
+
idEnc,
|
|
143
|
+
area,
|
|
144
|
+
DEFAULT_DOMINIO,
|
|
145
|
+
true,
|
|
146
|
+
encAutogeneradoDm,
|
|
147
|
+
token,
|
|
148
|
+
defaultTarea.tarea,
|
|
149
|
+
respuestasRaiz,
|
|
150
|
+
respuestasRaiz,
|
|
151
|
+
]).fetchUniqueRow();
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
idEnc = resultUpdate.row.enc;
|
|
155
|
+
}
|
|
156
|
+
yield generarTareasTemFaltantes(context, OPERATIVO);
|
|
157
|
+
yield context.client.query(`
|
|
158
|
+
update tareas_tem
|
|
159
|
+
set recepcionista = $4, asignado = $5
|
|
160
|
+
where operativo= $1 and enc = $2 and tarea = $3
|
|
161
|
+
returning *
|
|
162
|
+
`, [OPERATIVO, idEnc, defaultTarea.tarea, recepcionista, asignado]).fetchUniqueRow();
|
|
163
|
+
yield context.client.query(`
|
|
164
|
+
update tareas_tem
|
|
165
|
+
set cargado_dm = $4, estado = $5, operacion = $6
|
|
166
|
+
where operativo= $1 and enc = $2 and tarea = $3
|
|
167
|
+
returning *
|
|
168
|
+
`, [OPERATIVO, idEnc, defaultTarea.tarea, token, ESTADO_POSTERIOR_CARGA, cambia_modo_dm ? null : OPERACION_PREPARAR_CARGA]).fetchUniqueRow();
|
|
169
|
+
}
|
|
170
|
+
return idEnc;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
function createStructure(context, tableName) {
|
|
174
|
+
var be = context.be;
|
|
175
|
+
var mainTableDef = be.tableStructures[tableName](context);
|
|
176
|
+
var getPkFromTableDef = function getPkFromTableDef(tableDef) {
|
|
177
|
+
return tableDef.primaryKey.map(function (pk) {
|
|
178
|
+
return { fieldName: pk };
|
|
179
|
+
});
|
|
180
|
+
};
|
|
181
|
+
var getFkFromTableDef = function getFkFromTableDef(tableDef, parentTableName) {
|
|
182
|
+
let parentFk = tableDef.foreignKeys.find(fk => fk.references == parentTableName);
|
|
183
|
+
return parentFk ? parentFk.fields : [];
|
|
184
|
+
};
|
|
185
|
+
var struct = {
|
|
186
|
+
tableName: mainTableDef.name,
|
|
187
|
+
pkFields: getPkFromTableDef(mainTableDef),
|
|
188
|
+
childTables: []
|
|
189
|
+
};
|
|
190
|
+
if (mainTableDef.detailTables && mainTableDef.detailTables.length) {
|
|
191
|
+
mainTableDef.detailTables.forEach(function (detailTable) {
|
|
192
|
+
if (detailTable.table) {
|
|
193
|
+
struct.childTables.push((0, best_globals_1.changing)(createStructure(context, detailTable.table), { fkFields: getFkFromTableDef(be.tableStructures[detailTable.table](context), tableName) }));
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
return struct;
|
|
198
|
+
}
|
|
199
|
+
// graba en la TEM la encuesta y el resultado calculado (resumen, rea y no rea; o sus versiones _sup si la tarea es supe)
|
|
200
|
+
function consultaUpdateTem(operativo, idEnc, respuestasUAPrincipal, tarea) {
|
|
201
|
+
var { params, setters } = (0, setters_rea_no_rea_1.getSettersAndParametersForReaNoReaResumenEstado)({
|
|
202
|
+
tarea,
|
|
203
|
+
respuestasUAPrincipal,
|
|
204
|
+
setters: [`json_encuesta = $3`, `fecha_modif_encuesta = current_timestamp`],
|
|
205
|
+
params: [operativo, idEnc, respuestasUAPrincipal],
|
|
206
|
+
destino: 'tem'
|
|
207
|
+
});
|
|
208
|
+
return {
|
|
209
|
+
sql: `update tem
|
|
210
|
+
set ${setters.join(',')}
|
|
211
|
+
where operativo= $1 and enc = $2
|
|
212
|
+
returning 'ok'`,
|
|
213
|
+
params
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
// cuando el dispositivo devuelve la encuesta: pasa la tarea a descargada y guarda el resultado calculado en el dispositivo (dm_*);
|
|
217
|
+
// sólo si la encuesta sigue cargada con el token del dispositivo
|
|
218
|
+
function consultaUpdateTareasTemPorDescarga(opts) {
|
|
219
|
+
var { params, setters } = (0, setters_rea_no_rea_1.getSettersAndParametersForReaNoReaResumenEstado)({
|
|
220
|
+
tarea: opts.tarea,
|
|
221
|
+
respuestasUAPrincipal: opts.respuestasUAPrincipal,
|
|
222
|
+
setters: [
|
|
223
|
+
`estado = '${ESTADO_POSTERIOR_DESCARGA}'`,
|
|
224
|
+
`cargado_dm=null`
|
|
225
|
+
],
|
|
226
|
+
params: [opts.operativo, opts.idEnc, opts.tarea, opts.token],
|
|
227
|
+
destino: 'tareas_tem'
|
|
228
|
+
});
|
|
229
|
+
if (opts.pasaADescargar) {
|
|
230
|
+
setters.push(`operacion = '${OPERACION_PREPARAR_DESCARGA}'`);
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
sql: `update tareas_tem
|
|
234
|
+
set ${setters.join(',')}
|
|
235
|
+
where operativo= $1 and enc = $2 and tarea = $3 and cargado_dm = $4
|
|
236
|
+
returning 'ok'`,
|
|
237
|
+
params
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
var guardarEncuestaEnTem = (context, operativo, idEnc, respuestasUAPrincipal, tarea) => __awaiter(void 0, void 0, void 0, function* () {
|
|
241
|
+
var { sql, params } = consultaUpdateTem(operativo, idEnc, respuestasUAPrincipal, tarea);
|
|
242
|
+
return yield context.client.query(sql, params).fetchUniqueRow();
|
|
243
|
+
});
|
|
244
|
+
exports.guardarEncuestaEnTem = guardarEncuestaEnTem;
|
|
245
|
+
function registrarPaseTabla(context, operativo, idEnc, respuestasUAPrincipal) {
|
|
246
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
247
|
+
var be = context.be;
|
|
248
|
+
var procedureGuardar = be.procedure.caso_guardar;
|
|
249
|
+
let resultado = `id enc ${idEnc}: `;
|
|
250
|
+
let param_guardar = { operativo: operativo, id_caso: idEnc, datos_caso: respuestasUAPrincipal };
|
|
251
|
+
let savepointName = `sp_guardar_${idEnc}`.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
252
|
+
try {
|
|
253
|
+
yield context.client.query(`SAVEPOINT ${savepointName}`).execute();
|
|
254
|
+
resultado += yield procedureGuardar.coreFunction(context, param_guardar);
|
|
255
|
+
yield context.client.query(`RELEASE SAVEPOINT ${savepointName}`).execute();
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
yield context.client.query(`ROLLBACK TO SAVEPOINT ${savepointName}`).execute();
|
|
259
|
+
var error = (0, cast_error_1.expected)(err);
|
|
260
|
+
let errMessage = resultado + "dm_forpkraiz_descargar. " + error.message;
|
|
261
|
+
resultado = errMessage;
|
|
262
|
+
console.error(errMessage, error);
|
|
263
|
+
}
|
|
264
|
+
return yield context.client.query(`update tem
|
|
265
|
+
set pase_tabla = $3
|
|
266
|
+
where operativo = $1 and enc = $2
|
|
267
|
+
returning 'ok'`, [operativo, idEnc, resultado]).fetchUniqueRow();
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
var simularGuardadoDeEncuestaDesdeAppEscritorio = (context, operativo, enc, tarea, json_encuesta) => __awaiter(void 0, void 0, void 0, function* () {
|
|
271
|
+
var be = context.be;
|
|
272
|
+
const UA_PRINCIPAL = (yield getUAPrincipal(context.client, operativo)).unidad_analisis;
|
|
273
|
+
return yield be.procedure.dm_forpkraiz_descargar.coreFunction(context, {
|
|
274
|
+
operativo: operativo,
|
|
275
|
+
persistentes: {
|
|
276
|
+
respuestas: {
|
|
277
|
+
[UA_PRINCIPAL]: {
|
|
278
|
+
[enc]: json_encuesta
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
informacionHdr: {
|
|
282
|
+
[enc]: {
|
|
283
|
+
tarea: {
|
|
284
|
+
tarea
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
function cargasHdrConFechaDmy(cargas) {
|
|
292
|
+
return cargas.map(carga => (Object.assign(Object.assign({}, carga), { fecha: carga.fecha ? best_globals_1.date.iso(carga.fecha).toDmy() : null })));
|
|
293
|
+
}
|
|
294
|
+
var getHdrQuery = function getHdrQuery(quotedCondViv, context, unidadAnalisisPrincipal, permiteGenerarMuestra, idper) {
|
|
295
|
+
return `
|
|
296
|
+
with ${context.be.db.quoteIdent(unidadAnalisisPrincipal)} as
|
|
297
|
+
(select t.operativo, t.enc, t.json_encuesta as respuestas, t.resumen_estado as "resumenEstado",
|
|
298
|
+
jsonb_build_object(
|
|
299
|
+
'dominio' , dominio ,
|
|
300
|
+
'nomcalle' , nomcalle ,
|
|
301
|
+
'sector' , sector ,
|
|
302
|
+
'edificio' , edificio ,
|
|
303
|
+
'entrada' , entrada ,
|
|
304
|
+
'nrocatastral' , nrocatastral ,
|
|
305
|
+
'piso' , piso ,
|
|
306
|
+
'departamento' , departamento ,
|
|
307
|
+
'habitacion' , habitacion ,
|
|
308
|
+
'casa' , casa ,
|
|
309
|
+
'prioridad' , reserva+1 ,
|
|
310
|
+
'observaciones' , tt.carga_observaciones ,
|
|
311
|
+
'cita' , cita ,
|
|
312
|
+
'carga' , t.area ,
|
|
313
|
+
'semana' , t.semana
|
|
314
|
+
) as tem, t.area,
|
|
315
|
+
--TODO: GENERALIZAR
|
|
316
|
+
jsonb_build_object(
|
|
317
|
+
'tarea', tt.tarea,
|
|
318
|
+
'fecha_asignacion', fecha_asignacion,
|
|
319
|
+
'asignado', asignado,
|
|
320
|
+
'main_form', main_form
|
|
321
|
+
) as tarea,
|
|
322
|
+
min(fecha_asignacion) as fecha_asignacion
|
|
323
|
+
from tem t left join tareas_tem tt on (t.operativo = tt.operativo and t.enc = tt.enc and t.tarea_actual = tt.tarea)
|
|
324
|
+
left join tareas ta on t.tarea_actual = ta.tarea
|
|
325
|
+
where t.habilitada and ${quotedCondViv}
|
|
326
|
+
group by t.operativo, t.enc, t.json_encuesta, t.resumen_estado, dominio, nomcalle,sector,edificio, entrada, nrocatastral, piso,departamento,habitacion,casa,reserva,tt.carga_observaciones, cita, t.area, tt.tarea, fecha_asignacion, asignado, main_form, t.semana
|
|
327
|
+
)
|
|
328
|
+
select jsonb_build_object(
|
|
329
|
+
${context.be.db.quoteLiteral(unidadAnalisisPrincipal)}, ${(0, pg_promise_strict_1.jsono)(`select enc, respuestas, jsonb_build_object('resumenEstado',"resumenEstado") as otras from ${context.be.db.quoteIdent(unidadAnalisisPrincipal)}`, 'enc', `otras || coalesce(respuestas,'{}'::jsonb)`)}
|
|
330
|
+
) as respuestas,
|
|
331
|
+
${(0, pg_promise_strict_1.json)(`
|
|
332
|
+
select a.area as carga, observaciones_hdr as observaciones, min(fecha_asignacion) as fecha, ta.recepcionista,
|
|
333
|
+
${permiteGenerarMuestra ? `case
|
|
334
|
+
when ta.asignado = ${context.be.db.quoteLiteral(idper)}
|
|
335
|
+
then true
|
|
336
|
+
else false
|
|
337
|
+
end` : `false`} as puede_autogenerar
|
|
338
|
+
from ${context.be.db.quoteIdent(unidadAnalisisPrincipal)} aux inner join areas a using (operativo, area) inner join tareas_areas ta on (a.area = ta.area and aux.tarea->>'tarea' = ta.tarea)
|
|
339
|
+
group by a.area, observaciones_hdr, ta.recepcionista, puede_autogenerar
|
|
340
|
+
${permiteGenerarMuestra ? `
|
|
341
|
+
union -- este union permite visualizar areas asignadas sin encuestas generadas
|
|
342
|
+
select area as carga, null as observaciones, null as fecha, recepcionista, true as puede_autogenerar
|
|
343
|
+
from tareas_areas where asignado = ${context.be.db.quoteLiteral(idper)} and tarea = 'encu'` : ''}
|
|
344
|
+
`, 'fecha')} as cargas,
|
|
345
|
+
${(0, pg_promise_strict_1.jsono)(`select enc, jsonb_build_object('tem', tem, 'tarea', tarea) as otras from ${context.be.db.quoteIdent(unidadAnalisisPrincipal)}`, 'enc', `otras ||'{}'::jsonb`)}
|
|
346
|
+
as "informacionHdr"
|
|
347
|
+
`;
|
|
348
|
+
};
|
|
349
|
+
var setHdrQuery = (myFun) => getHdrQuery = myFun;
|
|
350
|
+
exports.setHdrQuery = setHdrQuery;
|
|
351
|
+
const getUAPrincipal = (client, operativo) => __awaiter(void 0, void 0, void 0, function* () {
|
|
352
|
+
return (yield client.query(`select *
|
|
353
|
+
from unidad_analisis
|
|
354
|
+
where operativo= $1 and principal
|
|
355
|
+
`, [operativo]).fetchUniqueRow()).row;
|
|
356
|
+
});
|
|
357
|
+
var funcionesConocidas = {};
|
|
358
|
+
var compiler = new ExpresionParser.Compiler({
|
|
359
|
+
language: 'js',
|
|
360
|
+
varWrapper: (var_name) => `helpers.null2zero(valores.${var_name})`,
|
|
361
|
+
funWrapper: (functionName) => {
|
|
362
|
+
if (!funcionesConocidas[functionName]) {
|
|
363
|
+
console.log(functionName);
|
|
364
|
+
funcionesConocidas[functionName] = true;
|
|
365
|
+
}
|
|
366
|
+
return `helpers.funs.${functionName}`;
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
function compilarExpresion(expresion) {
|
|
370
|
+
return compiler.toCode(ExpresionParser.parse(expresion
|
|
371
|
+
.replace(/\bis distinct from\b/gi, ' <> ')
|
|
372
|
+
.replace(/!!/gi, ' '))).replace(/helpers\.funs\.blanco\(helpers.null2zero\(/g, 'helpers.funs.blanco((')
|
|
373
|
+
.replace(/helpers\.funs\.informado\(helpers.null2zero\(/g, 'helpers.funs.informado((');
|
|
374
|
+
}
|
|
375
|
+
// rea/no rea (y sus versiones _sup) del operativo, tomadas de las caches, para la estructura que se manda al dispositivo.
|
|
376
|
+
// Las condiciones de rea se compilan a js (condicion_js) para evaluarlas en el dispositivo.
|
|
377
|
+
function reasNoReasDelOperativo(tableContent, operativo) {
|
|
378
|
+
var noReasCache = tableContent.no_rea || [];
|
|
379
|
+
var noReasSupCache = tableContent.no_rea_sup || [];
|
|
380
|
+
var reasCache = tableContent.rea || [];
|
|
381
|
+
var reasSupCache = tableContent.rea_sup || [];
|
|
382
|
+
return {
|
|
383
|
+
noReas: noReasCache.filter(noRea => noRea.operativo == operativo),
|
|
384
|
+
noReasSup: noReasSupCache.filter(noReaSup => noReaSup.operativo == operativo),
|
|
385
|
+
reas: reasCache.filter(rea => rea.operativo == operativo)
|
|
386
|
+
.map((rea) => (Object.assign(Object.assign({}, rea), { condicion_js: compilarExpresion(rea.condicion) }))),
|
|
387
|
+
reasSup: reasSupCache.filter(reaSup => reaSup.operativo == operativo)
|
|
388
|
+
.map((reaSup) => (Object.assign(Object.assign({}, reaSup), { condicion_js: compilarExpresion(reaSup.condicion) }))),
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
function compilarExpresiones(casillero) {
|
|
392
|
+
var _a, _b;
|
|
393
|
+
if (!casillero) {
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
if (casillero.data.expresion_habilitar) {
|
|
397
|
+
casillero.data.expresion_habilitar_js = compilarExpresion(casillero.data.expresion_habilitar);
|
|
398
|
+
}
|
|
399
|
+
if ((_a = casillero.data.especial) === null || _a === void 0 ? void 0 : _a.autoing) {
|
|
400
|
+
var partes = (_b = casillero.data.especial) === null || _b === void 0 ? void 0 : _b.autoing.split('=>');
|
|
401
|
+
if (partes.length > 1) {
|
|
402
|
+
var precondicion = partes[0];
|
|
403
|
+
var valor = partes.slice(1).join('=>');
|
|
404
|
+
casillero.data.expresion_autoingresar_js = `(${compilarExpresion(precondicion)})?(${compilarExpresion(valor)}):null`;
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
casillero.data.expresion_autoingresar_js = compilarExpresion(partes[0]);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
for (var casilleroInterno of casillero.childs)
|
|
411
|
+
compilarExpresiones(casilleroInterno);
|
|
412
|
+
}
|
|
413
|
+
const generarEncuestaTem = (context, operativo, idEnc, area, dominio, tarea_actual) => __awaiter(void 0, void 0, void 0, function* () {
|
|
414
|
+
yield context.client.query(`
|
|
415
|
+
INSERT into tem (operativo, enc, area, dominio, habilitada, tarea_actual) values ($1, $2, $3, $4, $5, $6)`, [operativo, idEnc, area, dominio, true, tarea_actual]).execute();
|
|
416
|
+
});
|
|
417
|
+
const generarTareasTemFaltantes = (context, operativo) => __awaiter(void 0, void 0, void 0, function* () {
|
|
418
|
+
yield context.client.query(`
|
|
419
|
+
insert into tareas_tem (operativo, enc, tarea)
|
|
420
|
+
select ta.operativo, ta.enc, ta.tarea
|
|
421
|
+
from (select ta.*, t.enc,t.area from tareas ta, tem t where ta.operativo=t.operativo) ta
|
|
422
|
+
where ta.operativo = $1
|
|
423
|
+
and not (ta.operativo, ta.enc, ta.tarea) in (select operativo, enc, tarea from tareas_tem)
|
|
424
|
+
order by 1,3,2;
|
|
425
|
+
`, [operativo]).execute();
|
|
426
|
+
});
|
|
427
|
+
const buscarEncuestaEnTem = (context, params) => __awaiter(void 0, void 0, void 0, function* () {
|
|
428
|
+
try {
|
|
429
|
+
var result = yield context.client.query(`
|
|
430
|
+
select *
|
|
431
|
+
from tem
|
|
432
|
+
where operativo = $1 and enc = $2 --pk verificada
|
|
433
|
+
`, [params.operativo, params.enc]).fetchUniqueRow();
|
|
434
|
+
}
|
|
435
|
+
catch (err) {
|
|
436
|
+
throw Error(`No se encontró la encuesta ${params.enc} para el operativo ${params.operativo}. ${(0, cast_error_1.expected)(err).message}`);
|
|
437
|
+
}
|
|
438
|
+
return { casoTem: result.row };
|
|
439
|
+
});
|
|
440
|
+
function pasarEncuestasAProie(client) {
|
|
441
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
442
|
+
let parametros = (yield client.query(`
|
|
443
|
+
select * from parametros where unico_registro`, []).fetchUniqueRow()).row;
|
|
444
|
+
var select = `select t.operativo, t.enc, t.tarea_actual, tt.ts_entrada
|
|
445
|
+
from tareas_tem tt join tem t using (operativo,enc)
|
|
446
|
+
where tt.operativo=$1 and tt.tarea= $2 and (${(0, table_tareas_tem_1.getDiasAPasarQuery)('tt')} <= 0 or coalesce(tt.adelantar,false)) and tt.tarea = t.tarea_actual
|
|
447
|
+
`;
|
|
448
|
+
yield client.query(`
|
|
449
|
+
UPDATE tareas_tem tt
|
|
450
|
+
set estado = 'V'
|
|
451
|
+
from (${select}) aux
|
|
452
|
+
where tt.operativo = aux.operativo and tt.enc = aux.enc and tt.tarea = $3
|
|
453
|
+
returning *`, [parametros.operativo, 'finc', 'finc'])
|
|
454
|
+
.fetchAll();
|
|
455
|
+
//TODO asignar en procesamiento
|
|
456
|
+
yield client.query(`
|
|
457
|
+
UPDATE tareas_tem tt
|
|
458
|
+
set estado = 'A'
|
|
459
|
+
from (${select}) aux
|
|
460
|
+
where tt.operativo = aux.operativo and tt.enc = aux.enc and tt.tarea = $3
|
|
461
|
+
returning *`, [parametros.operativo, 'finc', 'proc'])
|
|
462
|
+
.fetchAll();
|
|
463
|
+
yield client.query(`
|
|
464
|
+
update tem t
|
|
465
|
+
set tarea_actual = 'proc'
|
|
466
|
+
from (${select}) aux
|
|
467
|
+
where t.operativo = aux.operativo and t.enc = aux.enc
|
|
468
|
+
returning *`, [parametros.operativo, 'finc']).fetchAll();
|
|
469
|
+
return 'ok';
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
exports.ProceduresDmEncu = [
|
|
473
|
+
{
|
|
474
|
+
action: 'operativo_estructura_completa',
|
|
475
|
+
parameters: [
|
|
476
|
+
{ name: 'operativo', typeName: 'text', references: 'operativos' },
|
|
477
|
+
{ name: 'idper_logueado_tablet', typeName: 'text', defaultValue: null },
|
|
478
|
+
],
|
|
479
|
+
resultOk: 'desplegarFormulario',
|
|
480
|
+
unlogged: true,
|
|
481
|
+
coreFunction: function (context, parameters) {
|
|
482
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
483
|
+
var be = context.be;
|
|
484
|
+
var result = yield context.client.query(`select casilleros_jerarquizados($1) as formularios,
|
|
485
|
+
${(0, pg_promise_strict_1.jsono)(`select unidad_analisis, padre, pk_agregada, '{}'::jsonb as hijas from unidad_analisis where operativo = $2`, 'unidad_analisis')} as unidades_analisis
|
|
486
|
+
`, [parameters.operativo, parameters.operativo]).fetchUniqueRow();
|
|
487
|
+
likeAr(result.row.formularios).forEach(f => compilarExpresiones(f));
|
|
488
|
+
// Hermanos son los formularios que están implantados en otro formulario de la misma UA. Por ejemplo el A1 en el S1
|
|
489
|
+
var resultHermanos = yield context.client.query(`
|
|
490
|
+
select o.id_casillero as id_formulario, o.unidad_analisis, 'BF_'||o.casillero boton, bf.casillero, bf.padre, fp.casillero, fp.unidad_analisis
|
|
491
|
+
from casilleros o left join casilleros bf
|
|
492
|
+
on bf.tipoc='BF'
|
|
493
|
+
and bf.casillero = 'BF_'||o.casillero
|
|
494
|
+
and bf.operativo = o.operativo
|
|
495
|
+
left join casilleros fp
|
|
496
|
+
on fp.id_casillero = bf.padre
|
|
497
|
+
and fp.operativo = bf.operativo
|
|
498
|
+
where o.tipoc = 'F'
|
|
499
|
+
and o.unidad_analisis = fp.unidad_analisis
|
|
500
|
+
and o.operativo = $1`, [parameters.operativo]).fetchAll();
|
|
501
|
+
resultHermanos.rows.forEach(row => {
|
|
502
|
+
result.row.formularios[row.id_formulario].data.hermano = true;
|
|
503
|
+
});
|
|
504
|
+
function completarUA(ua, idUa, uAs) {
|
|
505
|
+
if (ua.padre) {
|
|
506
|
+
uAs[ua.padre].hijas[idUa] = ua;
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
ua.principal = true;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
likeAr(result.row.unidades_analisis).forEach((ua, idUa) => completarUA(ua, idUa, result.row.unidades_analisis));
|
|
513
|
+
var { con_rea_hogar: conReaHogar, config_sorteo: configSorteo, habilitacion_boton_formulario: habilitacionBotonFormulario, } = (yield context.client.query(`
|
|
514
|
+
select config_sorteo, con_rea_hogar, habilitacion_boton_formulario, permite_generar_muestra
|
|
515
|
+
from operativos
|
|
516
|
+
where operativo = $1
|
|
517
|
+
`, [parameters.operativo]).fetchUniqueRow()).row;
|
|
518
|
+
var semanas = (yield context.client.query(`select
|
|
519
|
+
${(0, pg_promise_strict_1.jsono)(`select * from semanas where operativo = $1`, 'semana')} as semanas
|
|
520
|
+
`, [parameters.operativo]).fetchUniqueRow()).row.semanas;
|
|
521
|
+
let compilarExpresionesDominios = (expresionesDominio) => likeAr(expresionesDominio)
|
|
522
|
+
.map((expr, dominio) => ({ dominio, expr: compilarExpresion(expr.expr) }))
|
|
523
|
+
.plain();
|
|
524
|
+
if (configSorteo) {
|
|
525
|
+
likeAr(configSorteo).forEach((configSorteoFormulario) => {
|
|
526
|
+
configSorteoFormulario.expr_incompletitud_js = compilarExpresionesDominios(configSorteoFormulario.expr_incompletitud);
|
|
527
|
+
configSorteoFormulario.filtro_js = compilarExpresionesDominios(configSorteoFormulario.filtro);
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
if (habilitacionBotonFormulario) {
|
|
531
|
+
likeAr(habilitacionBotonFormulario).forEach((form) => {
|
|
532
|
+
form.expr_habilitar_boton_js = compilarExpresion(form.expr_habilitar_boton);
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
var defaultTarea = yield getDefaultTarea(context, parameters.operativo);
|
|
536
|
+
var defaultInformacionHdr = (yield context.client.query(`select
|
|
537
|
+
jsonb_build_object(
|
|
538
|
+
'dominio' , ${context.be.db.quoteLiteral(DEFAULT_DOMINIO)},
|
|
539
|
+
'nomcalle' , null ,
|
|
540
|
+
'sector' , null ,
|
|
541
|
+
'edificio' , null ,
|
|
542
|
+
'entrada' , null ,
|
|
543
|
+
'nrocatastral' , null ,
|
|
544
|
+
'piso' , null ,
|
|
545
|
+
'departamento' , null ,
|
|
546
|
+
'habitacion' , null ,
|
|
547
|
+
'casa' , null ,
|
|
548
|
+
'prioridad' , null ,
|
|
549
|
+
'observaciones' , null ,
|
|
550
|
+
'cita' , null ,
|
|
551
|
+
'carga' , null ,
|
|
552
|
+
'semana' , null
|
|
553
|
+
) as tem,
|
|
554
|
+
jsonb_build_object(
|
|
555
|
+
'tarea', ${context.be.db.quoteLiteral(defaultTarea.tarea)},
|
|
556
|
+
'fecha_asignacion', null,
|
|
557
|
+
'asignado', ${context.be.db.quoteLiteral(parameters.idper_logueado_tablet || context.user.idper)},
|
|
558
|
+
'main_form', ${context.be.db.quoteLiteral(defaultTarea.main_form)}
|
|
559
|
+
) as tarea
|
|
560
|
+
`, []).fetchUniqueRow()).row;
|
|
561
|
+
var { unidad_analisis, pk_agregada } = (yield getUAPrincipal(context.client, parameters.operativo));
|
|
562
|
+
return Object.assign(Object.assign(Object.assign(Object.assign({ timestamp: be.caches.timestampEstructura }, result.row), { operativo: parameters.operativo, conReaHogar,
|
|
563
|
+
configSorteo,
|
|
564
|
+
habilitacionBotonFormulario }), reasNoReasDelOperativo(be.caches.tableContent, parameters.operativo)), { defaultInformacionHdr, uaPpal: unidad_analisis, semanas, pkAgregadaUaPpal: pk_agregada });
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
},
|
|
568
|
+
{
|
|
569
|
+
action: 'generar_formularios',
|
|
570
|
+
parameters: [
|
|
571
|
+
{ name: 'annio', typeName: 'integer', references: 'annio' },
|
|
572
|
+
{ name: 'mes', typeName: 'integer', references: 'mes' },
|
|
573
|
+
{ name: 'lote', typeName: 'integer', references: 'lotes' },
|
|
574
|
+
],
|
|
575
|
+
coreFunction: function (context, parameters) {
|
|
576
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
577
|
+
var be = context.be;
|
|
578
|
+
const OPERATIVO = yield (0, exports.getOperativoActual)(context);
|
|
579
|
+
let uaPpal = yield getUAPrincipal(context.client, OPERATIVO);
|
|
580
|
+
let resultPreguntas = yield be.procedure.preguntas_ua_traer.coreFunction(context, uaPpal);
|
|
581
|
+
var contenedorVacio = {};
|
|
582
|
+
resultPreguntas.forEach(function (defPregunta) {
|
|
583
|
+
contenedorVacio[defPregunta.var_name] = defPregunta.unidad_analisis ? [] : null;
|
|
584
|
+
});
|
|
585
|
+
contenedorVacio.annio = parameters.annio;
|
|
586
|
+
contenedorVacio.mes = parameters.mes;
|
|
587
|
+
contenedorVacio.lote = parameters.lote;
|
|
588
|
+
var result = yield context.client.query(`select debe_haber.id_caso, s as id
|
|
589
|
+
from (select lote, armar_id(annio, mes, lote, s) as id_caso, s
|
|
590
|
+
from (select annio,mes,lote, cant_cues from lotes where (annio,mes,lote)=($2,$3,$4)) r, lateral generate_series(1,cant_cues) s
|
|
591
|
+
) debe_haber left join defgen hay on hay.id_caso = debe_haber.id_caso and hay.operativo=$1
|
|
592
|
+
where hay.id_caso is null`, [OPERATIVO, parameters.annio, parameters.mes, parameters.lote]).fetchAll();
|
|
593
|
+
var params = { operativo: OPERATIVO };
|
|
594
|
+
for (var i = 0; i < (result.rowCount || 0); i++) {
|
|
595
|
+
yield be.procedure.caso_guardar.coreFunction(context, (0, best_globals_1.changing)(params, { id_caso: result.rows[i].id_caso, datos_caso: (0, best_globals_1.changing)(contenedorVacio, { id: result.rows[i].id }) }));
|
|
596
|
+
}
|
|
597
|
+
return { agregadas: result.rowCount };
|
|
598
|
+
});
|
|
599
|
+
}
|
|
600
|
+
},
|
|
601
|
+
{
|
|
602
|
+
action: 'upload_file',
|
|
603
|
+
progress: true,
|
|
604
|
+
parameters: [
|
|
605
|
+
{ name: 'id_adjunto', typeName: 'integer' },
|
|
606
|
+
{ name: 'nombre', typeName: 'text' },
|
|
607
|
+
],
|
|
608
|
+
files: { count: 1 },
|
|
609
|
+
coreFunction: function (context, parameters, files) {
|
|
610
|
+
let be = context.be;
|
|
611
|
+
let client = context.client;
|
|
612
|
+
context.informProgress({ message: be.messages.fileUploaded });
|
|
613
|
+
//@ts-ignore existe
|
|
614
|
+
let file = files[0];
|
|
615
|
+
let ext = Path.extname(file.path).substr(1);
|
|
616
|
+
let originalFilename = file.originalFilename.slice(0, -(ext.length + 1));
|
|
617
|
+
let filename = parameters.nombre || originalFilename;
|
|
618
|
+
let newPath = 'local-attachments/file-';
|
|
619
|
+
var createResponse = function createResponse(adjuntoRow) {
|
|
620
|
+
let resultado = {
|
|
621
|
+
message: 'La subida se realizó correctamente (update)',
|
|
622
|
+
nombre: adjuntoRow.nombre,
|
|
623
|
+
nombre_original: adjuntoRow.nombre_original,
|
|
624
|
+
ext: adjuntoRow.ext,
|
|
625
|
+
fecha: adjuntoRow.fecha,
|
|
626
|
+
hora: adjuntoRow.hora,
|
|
627
|
+
id_adjunto: adjuntoRow.id_adjunto
|
|
628
|
+
};
|
|
629
|
+
return resultado;
|
|
630
|
+
};
|
|
631
|
+
//@ts-ignore
|
|
632
|
+
var moveFile = function moveFile(file, id_adjunto, extension) {
|
|
633
|
+
//@ts-ignore
|
|
634
|
+
fs_1.promises.move(file.path, newPath + id_adjunto + '.' + extension, { overwrite: true });
|
|
635
|
+
};
|
|
636
|
+
return Promise.resolve().then(function () {
|
|
637
|
+
if (parameters.id_adjunto) {
|
|
638
|
+
return context.client.query(`update adjuntos set nombre= $1,nombre_original = $2, ext = $3, ruta = concat('local-attachments/file-',$4::text,'.',$3::text), fecha = now(), hora = date_trunc('seconds',current_timestamp-current_date)
|
|
639
|
+
where id_adjunto = $4 returning *`, [filename, originalFilename, ext, parameters.id_adjunto]).fetchUniqueRow().then(function (result) {
|
|
640
|
+
return createResponse(result.row);
|
|
641
|
+
}).then(function (resultado) {
|
|
642
|
+
moveFile(file, resultado.id_adjunto, resultado.ext);
|
|
643
|
+
return resultado;
|
|
644
|
+
});
|
|
645
|
+
}
|
|
646
|
+
else {
|
|
647
|
+
return context.client.query(`insert into adjuntos (nombre, nombre_original, ext, fecha, hora) values ($1,$2,$3,now(), date_trunc('seconds',current_timestamp-current_date)) returning *`, [filename, originalFilename, ext]).fetchUniqueRow().then(function (result) {
|
|
648
|
+
return context.client.query(`update adjuntos set ruta = concat('local-attachments/file-',id_adjunto::text,'.',ext)
|
|
649
|
+
where id_adjunto = $1 returning *`, [result.row.id_adjunto]).fetchUniqueRow().then(function (result) {
|
|
650
|
+
return createResponse(result.row);
|
|
651
|
+
}).then(function (resultado) {
|
|
652
|
+
moveFile(file, resultado.id_adjunto, resultado.ext);
|
|
653
|
+
return resultado;
|
|
654
|
+
});
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
}).catch(function (err) {
|
|
658
|
+
throw err;
|
|
659
|
+
});
|
|
660
|
+
}
|
|
661
|
+
},
|
|
662
|
+
{
|
|
663
|
+
action: 'caso_guardar',
|
|
664
|
+
parameters: [
|
|
665
|
+
{ name: 'operativo', typeName: 'text', references: 'operativos' },
|
|
666
|
+
{ name: 'id_caso', typeName: 'text' },
|
|
667
|
+
{ name: 'datos_caso', typeName: 'jsonb' },
|
|
668
|
+
],
|
|
669
|
+
definedIn: 'dmencu',
|
|
670
|
+
//@ts-ignore especifico el tipo de los parámetros
|
|
671
|
+
coreFunction: function (context, parameters, newClient) {
|
|
672
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
673
|
+
var { unidad_analisis, pk_agregada } = (yield getUAPrincipal(context.client, parameters.operativo));
|
|
674
|
+
var client = newClient || context.client;
|
|
675
|
+
var datos_json = parameters.datos_caso;
|
|
676
|
+
var be = context.be;
|
|
677
|
+
var tableStructures_app = be.tableStructures;
|
|
678
|
+
var struct_dmencu = createStructure(context, unidad_analisis);
|
|
679
|
+
datos_json['operativo'] = parameters.operativo;
|
|
680
|
+
datos_json[pk_agregada] = parameters.id_caso;
|
|
681
|
+
function completar_ult_pk_en_arr(ult_pk, ua_arr) {
|
|
682
|
+
var con_pk_completa = ua_arr;
|
|
683
|
+
if (ua_arr && ua_arr.length >= 1) {
|
|
684
|
+
con_pk_completa = con_pk_completa.map((una_ua, i) => {
|
|
685
|
+
una_ua[ult_pk] = i + 1;
|
|
686
|
+
return una_ua;
|
|
687
|
+
});
|
|
688
|
+
}
|
|
689
|
+
;
|
|
690
|
+
return con_pk_completa;
|
|
691
|
+
}
|
|
692
|
+
function recorrer_datos_agregando_pks(datosj) {
|
|
693
|
+
for (var keyName in datosj) {
|
|
694
|
+
var datoK = datosj[keyName];
|
|
695
|
+
if (datoK instanceof Array && datoK.length >= 1) {
|
|
696
|
+
var pk = tableStructures_app[keyName](context).primaryKey;
|
|
697
|
+
var ult_pk = pk[pk.length - 1];
|
|
698
|
+
datoK = completar_ult_pk_en_arr(ult_pk, datoK);
|
|
699
|
+
datoK.forEach((elemI) => {
|
|
700
|
+
elemI = recorrer_datos_agregando_pks(elemI);
|
|
701
|
+
});
|
|
702
|
+
}
|
|
703
|
+
;
|
|
704
|
+
if (keyName.startsWith('$') || keyName.startsWith('_') || keyName == 'null') {
|
|
705
|
+
delete datosj[keyName];
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
return datosj;
|
|
709
|
+
}
|
|
710
|
+
datos_json = recorrer_datos_agregando_pks(datos_json);
|
|
711
|
+
delete datos_json.codRea;
|
|
712
|
+
delete datos_json.codNoRea;
|
|
713
|
+
delete datos_json.resumenEstado;
|
|
714
|
+
delete datos_json.codReaSup;
|
|
715
|
+
delete datos_json.codNoReaSup;
|
|
716
|
+
delete datos_json.resumenEstadoSup;
|
|
717
|
+
if (Object.keys(datos_json).length > 2) {
|
|
718
|
+
var queries = sqlTools.structuredData.sqlWrite(datos_json, struct_dmencu);
|
|
719
|
+
return yield queries.reduce(function (promise, query) {
|
|
720
|
+
return promise.then(function () {
|
|
721
|
+
return client.query(query).execute().then(function (_result) {
|
|
722
|
+
return 'ok';
|
|
723
|
+
});
|
|
724
|
+
});
|
|
725
|
+
}, Promise.resolve()).then(function () {
|
|
726
|
+
return "ok";
|
|
727
|
+
}).catch(function (err) {
|
|
728
|
+
console.error("caso_guardar ENTRA EN EL CATCH: ", (0, cast_error_1.expected)(err));
|
|
729
|
+
throw err;
|
|
730
|
+
});
|
|
731
|
+
}
|
|
732
|
+
else {
|
|
733
|
+
return 'vacio';
|
|
734
|
+
}
|
|
735
|
+
});
|
|
736
|
+
}
|
|
737
|
+
},
|
|
738
|
+
{
|
|
739
|
+
action: 'caso_traer',
|
|
740
|
+
parameters: [
|
|
741
|
+
//{name:'formulario' , typeName:'text'},
|
|
742
|
+
{ name: 'operativo', references: 'operativos', typeName: 'text' },
|
|
743
|
+
{ name: 'id_caso', typeName: 'text' },
|
|
744
|
+
],
|
|
745
|
+
resultOk: 'goToEnc',
|
|
746
|
+
definedIn: 'dmencu',
|
|
747
|
+
coreFunction: function (context, parameters) {
|
|
748
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
749
|
+
var { unidad_analisis, pk_agregada } = (yield getUAPrincipal(context.client, parameters.operativo));
|
|
750
|
+
var client = context.client;
|
|
751
|
+
var struct_dmencu = createStructure(context, unidad_analisis);
|
|
752
|
+
var sql = sqlTools.structuredData.sqlRead({ operativo: parameters.operativo, [pk_agregada]: parameters.id_caso }, struct_dmencu);
|
|
753
|
+
var result = yield client.query(sql).fetchUniqueValue();
|
|
754
|
+
var response = {
|
|
755
|
+
operativo: parameters.operativo,
|
|
756
|
+
id_caso: parameters.id_caso,
|
|
757
|
+
datos_caso: result.value,
|
|
758
|
+
//formulario: formPrincipal,
|
|
759
|
+
};
|
|
760
|
+
return response;
|
|
761
|
+
});
|
|
762
|
+
}
|
|
763
|
+
},
|
|
764
|
+
{
|
|
765
|
+
action: 'caso_traer_o_crear',
|
|
766
|
+
parameters: [
|
|
767
|
+
{ name: 'operativo', references: 'operativos', typeName: 'text' },
|
|
768
|
+
{ name: 'id_caso', typeName: 'text' },
|
|
769
|
+
],
|
|
770
|
+
resultOk: 'goToEnc',
|
|
771
|
+
// bitacora:{always:true},
|
|
772
|
+
coreFunction: function (context, parameters) {
|
|
773
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
774
|
+
var be = context.be;
|
|
775
|
+
try {
|
|
776
|
+
var result = yield be.procedure['caso_traer'].coreFunction(context, parameters);
|
|
777
|
+
return result;
|
|
778
|
+
}
|
|
779
|
+
catch (err) {
|
|
780
|
+
var json = yield be.procedure['caso_preparar'].coreFunction(context, parameters);
|
|
781
|
+
yield be.procedure['caso_guardar'].coreFunction(context, (0, best_globals_1.changing)(parameters, { datos_caso: json }));
|
|
782
|
+
return yield be.procedure['caso_traer'].coreFunction(context, parameters);
|
|
783
|
+
}
|
|
784
|
+
});
|
|
785
|
+
}
|
|
786
|
+
},
|
|
787
|
+
{
|
|
788
|
+
action: 'pasar_json2ua',
|
|
789
|
+
parameters: [],
|
|
790
|
+
coreFunction: function (context, _parameters) {
|
|
791
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
792
|
+
/* GENERALIZAR: */
|
|
793
|
+
var be = context.be;
|
|
794
|
+
/* FIN-GENERALIZAR: */
|
|
795
|
+
const OPERATIVO = yield (0, exports.getOperativoActual)(context);
|
|
796
|
+
var { unidad_analisis, pk_agregada } = (yield getUAPrincipal(context.client, OPERATIVO));
|
|
797
|
+
let resultMain = yield context.client.query(`SELECT * from ${be.db.quoteIdent(unidad_analisis)} LIMIT 1`).fetchAll();
|
|
798
|
+
if ((resultMain.rowCount || 0) > 0) {
|
|
799
|
+
console.log('HAY DATOS', resultMain.rows);
|
|
800
|
+
throw new Error('HAY DATOS. NO SE PUEDE INICIAR EL PASAJE');
|
|
801
|
+
}
|
|
802
|
+
let resultJson = yield context.client.query(`SELECT operativo, enc id_caso, json_encuesta datos_caso from tem
|
|
803
|
+
WHERE operativo=$1 and resumen_estado is distinct from 'vacio' and json_encuesta is not null
|
|
804
|
+
order by enc `, [OPERATIVO]).fetchAll();
|
|
805
|
+
var procedureGuardar = be.procedure.caso_guardar;
|
|
806
|
+
if (procedureGuardar.definedIn != 'dmencu') {
|
|
807
|
+
throw new Error('hay que sobreescribir caso_guardar');
|
|
808
|
+
}
|
|
809
|
+
return Promise.all(resultJson.rows.map(function (row) {
|
|
810
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
811
|
+
let resultado = `id caso ${row.id_caso}: `;
|
|
812
|
+
try {
|
|
813
|
+
yield be.inTransaction(null, function (_client) {
|
|
814
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
815
|
+
resultado += yield procedureGuardar.coreFunction(context, row);
|
|
816
|
+
});
|
|
817
|
+
});
|
|
818
|
+
}
|
|
819
|
+
catch (err) {
|
|
820
|
+
var error = (0, cast_error_1.expected)(err);
|
|
821
|
+
let errMessage = resultado + "json2ua error. " + error.message;
|
|
822
|
+
resultado = errMessage;
|
|
823
|
+
console.error(errMessage, error);
|
|
824
|
+
}
|
|
825
|
+
if (resultado.includes('ok')) {
|
|
826
|
+
var { datos_caso, id_caso, operativo } = yield be.procedure.caso_traer.coreFunction(context, { operativo: row.operativo, id_caso: row.id_caso });
|
|
827
|
+
var verQueGrabo = { datos_caso, id_caso, operativo };
|
|
828
|
+
try {
|
|
829
|
+
discrepances.showAndThrow(verQueGrabo, row);
|
|
830
|
+
}
|
|
831
|
+
catch (err) {
|
|
832
|
+
console.error(verQueGrabo, row, (0, cast_error_1.expected)(err));
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
return resultado;
|
|
836
|
+
});
|
|
837
|
+
})).catch(function (err) {
|
|
838
|
+
throw err;
|
|
839
|
+
}).then(function (result) {
|
|
840
|
+
return result;
|
|
841
|
+
});
|
|
842
|
+
});
|
|
843
|
+
}
|
|
844
|
+
},
|
|
845
|
+
{
|
|
846
|
+
action: 'dm_forpkraiz_cargar',
|
|
847
|
+
parameters: [
|
|
848
|
+
{ name: 'operativo', typeName: 'text' },
|
|
849
|
+
{ name: 'pk_raiz_value', typeName: 'text' },
|
|
850
|
+
{ name: 'tarea', typeName: 'text', references: "tareas" },
|
|
851
|
+
],
|
|
852
|
+
coreFunction: function (context, parameters) {
|
|
853
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
854
|
+
var _a, _b, _c, _d;
|
|
855
|
+
const be = context.be;
|
|
856
|
+
const { operativo, pk_raiz_value, tarea } = parameters;
|
|
857
|
+
const { permite_borrar_ua: tareaPermiteBorrarUA, main_form } = (yield context.client.query(`
|
|
858
|
+
select permite_borrar_ua, main_form
|
|
859
|
+
from tareas
|
|
860
|
+
where operativo= $1 and tarea=$2
|
|
861
|
+
`, [operativo, tarea]).fetchUniqueRow()).row;
|
|
862
|
+
const { unidad_analisis } = (yield getUAPrincipal(context.client, parameters.operativo));
|
|
863
|
+
const condviv = ` t.operativo= $1 and t.enc =$2`;
|
|
864
|
+
const usuarioPuedeProcesarEncuestas = ((_b = (_a = context.puede) === null || _a === void 0 ? void 0 : _a.encuestas) === null || _b === void 0 ? void 0 : _b.procesar) || false;
|
|
865
|
+
const soloLectura = (yield context.client.query(`
|
|
866
|
+
select count(*)
|
|
867
|
+
from tareas_tem join tem using(operativo, enc) join estados using (operativo, estado) --pk estado y tem verificada
|
|
868
|
+
where operativo= $1 and enc = $2 and (
|
|
869
|
+
cargado_dm is not null or
|
|
870
|
+
not permite_editar_encuesta and asignado <> ${context.be.db.quoteLiteral(context.user.idper)} or
|
|
871
|
+
tarea = tarea_actual and tarea_actual = 'proc' and $3 or
|
|
872
|
+
tarea = tarea_actual and tarea_actual = 'proc' and estado = 'V'
|
|
873
|
+
)`, [operativo, pk_raiz_value, !usuarioPuedeProcesarEncuestas]).fetchUniqueValue()).value > 0;
|
|
874
|
+
var permiteGenerarMuestra = yield getOperativoPermiteGenerarMuestra(context.client, operativo);
|
|
875
|
+
var { row } = yield context.client.query(getHdrQuery(condviv, context, unidad_analisis, permiteGenerarMuestra, context.user.idper), [operativo, pk_raiz_value]).fetchUniqueRow();
|
|
876
|
+
row.informacionHdr[pk_raiz_value].tarea = {
|
|
877
|
+
tarea,
|
|
878
|
+
main_form
|
|
879
|
+
};
|
|
880
|
+
return Object.assign(Object.assign({}, row), { operativo,
|
|
881
|
+
soloLectura, idper: context.user.idper, cargas: likeAr.createIndex(cargasHdrConFechaDmy(row.cargas), 'carga'), timestampEstructura: be.caches.timestampEstructura, permiteBorrarElementosUA: !!(tareaPermiteBorrarUA && (0, app_dmencu_1.getModoByPolicy)(be) === 'GABINETE' && ((_d = (_c = context.puede) === null || _c === void 0 ? void 0 : _c.encuestas) === null || _d === void 0 ? void 0 : _d.borrar_ua)) });
|
|
882
|
+
});
|
|
883
|
+
}
|
|
884
|
+
},
|
|
885
|
+
{
|
|
886
|
+
action: 'dm_forpkraiz_descargar',
|
|
887
|
+
parameters: [
|
|
888
|
+
{ name: 'operativo', typeName: 'text' },
|
|
889
|
+
{ name: 'persistentes', typeName: 'jsonb' },
|
|
890
|
+
],
|
|
891
|
+
coreFunction: function (context, parameters) {
|
|
892
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
893
|
+
var be = context.be;
|
|
894
|
+
var { operativo, persistentes } = parameters;
|
|
895
|
+
const UA_PRINCIPAL = (yield getUAPrincipal(context.client, operativo)).unidad_analisis;
|
|
896
|
+
var procedureGuardar = be.procedure.caso_guardar;
|
|
897
|
+
const respuestas = persistentes.respuestas[UA_PRINCIPAL] || {};
|
|
898
|
+
for (const idEnc in respuestas) {
|
|
899
|
+
const respuestasUAPrincipal = respuestas[idEnc];
|
|
900
|
+
if (respuestasUAPrincipal.s1a1_obs == '!prueba de error al grabar!') {
|
|
901
|
+
throw new Error('DIO PRUEBA DE ERROR AL GRABAR');
|
|
902
|
+
}
|
|
903
|
+
yield (0, exports.guardarEncuestaEnTem)(context, operativo, idEnc, respuestasUAPrincipal, persistentes.informacionHdr[idEnc].tarea.tarea);
|
|
904
|
+
yield registrarPaseTabla(context, operativo, idEnc, respuestasUAPrincipal);
|
|
905
|
+
}
|
|
906
|
+
return 'ok';
|
|
907
|
+
});
|
|
908
|
+
}
|
|
909
|
+
},
|
|
910
|
+
{
|
|
911
|
+
action: 'dm_sincronizar',
|
|
912
|
+
parameters: [
|
|
913
|
+
{ name: 'persistentes', typeName: 'jsonb' },
|
|
914
|
+
{ name: 'modo_dm', typeName: 'text' },
|
|
915
|
+
{ name: 'cambia_modo_dm', typeName: 'boolean' },
|
|
916
|
+
{ name: 'idper_logueado_tablet', typeName: 'text' },
|
|
917
|
+
],
|
|
918
|
+
unlogged: true,
|
|
919
|
+
coreFunction: function (context, parameters) {
|
|
920
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
921
|
+
const OPERATIVO = yield (0, exports.getOperativoActual)(context);
|
|
922
|
+
const permiteGenerarMuestra = yield getOperativoPermiteGenerarMuestra(context.client, OPERATIVO);
|
|
923
|
+
if (!permiteGenerarMuestra && parameters.cambia_modo_dm) {
|
|
924
|
+
throw Error('No es posible cambiar de modo en este operativo');
|
|
925
|
+
}
|
|
926
|
+
var be = context.be;
|
|
927
|
+
var { persistentes, modo_dm, cambia_modo_dm, idper_logueado_tablet } = parameters;
|
|
928
|
+
const usernameLogueadoTablet = (yield context.client.query(`select usuario from usuarios where idper = $1`, [idper_logueado_tablet]).fetchUniqueValue()).value;
|
|
929
|
+
var token = (persistentes === null || persistentes === void 0 ? void 0 : persistentes.token) || (yield be.procedure.token_get.coreFunction(context, {
|
|
930
|
+
useragent: context.session.req.useragent,
|
|
931
|
+
username: usernameLogueadoTablet
|
|
932
|
+
})).token;
|
|
933
|
+
const num_sincro = (yield context.client.query(`
|
|
934
|
+
INSERT INTO sincronizaciones (token, usuario, datos)
|
|
935
|
+
VALUES ($1,$2,$3)
|
|
936
|
+
RETURNING sincro
|
|
937
|
+
`, [token, usernameLogueadoTablet, persistentes]).fetchUniqueValue()).value;
|
|
938
|
+
var condviv = `
|
|
939
|
+
tt.operativo= $1
|
|
940
|
+
and asignado = $2
|
|
941
|
+
and tt.operacion='cargar'
|
|
942
|
+
and (tt.cargado_dm is null or tt.cargado_dm = ${context.be.db.quoteLiteral(token)})
|
|
943
|
+
`;
|
|
944
|
+
const { unidad_analisis: UA_PRINCIPAL, pk_agregada } = (yield getUAPrincipal(context.client, OPERATIVO));
|
|
945
|
+
if (persistentes) {
|
|
946
|
+
for (let idEnc in persistentes.respuestas[UA_PRINCIPAL]) {
|
|
947
|
+
let respuestasUAPrincipal = persistentes.respuestas[UA_PRINCIPAL][idEnc];
|
|
948
|
+
//TODO AL PARECER ESTÁ RESUELTO, LO DEJO POR LAS DUDAS
|
|
949
|
+
if (Object.keys(respuestasUAPrincipal).length > 0) {
|
|
950
|
+
let carga = persistentes.cargas[persistentes.informacionHdr[idEnc].tem.carga];
|
|
951
|
+
var tarea = persistentes.informacionHdr[idEnc].tarea.tarea;
|
|
952
|
+
const cargaTareasAreas = (yield context.client.query(`select recepcionista
|
|
953
|
+
from tareas_areas
|
|
954
|
+
where operativo= $1 and tarea = $2 and area = $3 --pk verificada
|
|
955
|
+
`, [OPERATIVO, tarea, carga.carga]).fetchUniqueValue()).value;
|
|
956
|
+
if (!cargaTareasAreas && !carga.recepcionista) {
|
|
957
|
+
throw Error(`no se definió un recepcionista para el operativo ${OPERATIVO}, tarea ${tarea}, área ${carga.carga}, por favor comuniquesé con GABINETE para que carguen un recepcionista`);
|
|
958
|
+
}
|
|
959
|
+
if (Number(idEnc) < 0) {
|
|
960
|
+
// idEnc es la clave (texto) de persistentes.respuestas; las funciones que siguen lo reciben como texto
|
|
961
|
+
idEnc = String(yield persistirEncuestaAutogeneradaEnDM(context, OPERATIVO, carga.carga, idEnc, token, respuestasUAPrincipal, carga.recepcionista || cargaTareasAreas, persistentes.idper, modo_dm, cambia_modo_dm));
|
|
962
|
+
}
|
|
963
|
+
var puedoGuardarEnTEM = true;
|
|
964
|
+
var consultaTareasTem = consultaUpdateTareasTemPorDescarga({
|
|
965
|
+
operativo: OPERATIVO, idEnc, tarea, token, respuestasUAPrincipal,
|
|
966
|
+
pasaADescargar: cambia_modo_dm || persistentes.idper != idper_logueado_tablet
|
|
967
|
+
});
|
|
968
|
+
var queryTareasTem = yield context.client.query(consultaTareasTem.sql, consultaTareasTem.params).fetchOneRowIfExists();
|
|
969
|
+
puedoGuardarEnTEM = queryTareasTem.rowCount == 1;
|
|
970
|
+
if (puedoGuardarEnTEM) {
|
|
971
|
+
yield (0, exports.guardarEncuestaEnTem)(context, OPERATIVO, idEnc, respuestasUAPrincipal, tarea);
|
|
972
|
+
yield registrarPaseTabla(context, OPERATIVO, idEnc, respuestasUAPrincipal);
|
|
973
|
+
}
|
|
974
|
+
else {
|
|
975
|
+
yield fs_1.promises.appendFile('local-recibido-sin-token.txt', JSON.stringify({ now: new Date(), idper: persistentes.idper, idCaso: idEnc, [pk_agregada]: respuestasUAPrincipal }) + '\n\n', 'utf8');
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
var { row } = yield context.client.query(getHdrQuery(condviv, context, UA_PRINCIPAL, permiteGenerarMuestra, idper_logueado_tablet), [OPERATIVO, idper_logueado_tablet]).fetchUniqueRow();
|
|
981
|
+
yield context.client.query(`update tareas_tem tt
|
|
982
|
+
set estado = $4, cargado_dm=$3::text
|
|
983
|
+
where ${condviv}
|
|
984
|
+
returning enc`, [OPERATIVO, idper_logueado_tablet, token, ESTADO_POSTERIOR_CARGA]).fetchAll();
|
|
985
|
+
return Object.assign(Object.assign({}, row), { operativo: OPERATIVO, soloLectura: false, token,
|
|
986
|
+
num_sincro, idper: idper_logueado_tablet, cargas: likeAr.createIndex(cargasHdrConFechaDmy(row.cargas).map(carga => (Object.assign(Object.assign({}, carga), { estado_carga: 'relevamiento' }))), 'carga') });
|
|
987
|
+
});
|
|
988
|
+
}
|
|
989
|
+
},
|
|
990
|
+
{
|
|
991
|
+
action: 'dm_backup',
|
|
992
|
+
parameters: [
|
|
993
|
+
{ name: 'token', typeName: 'text' },
|
|
994
|
+
{ name: 'tem', typeName: 'jsonb' },
|
|
995
|
+
{ name: 'modo_dm', typeName: 'text' },
|
|
996
|
+
],
|
|
997
|
+
unlogged: true,
|
|
998
|
+
coreFunction: function (context, parameters) {
|
|
999
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1000
|
+
var { be, client } = context;
|
|
1001
|
+
const OPERATIVO = yield (0, exports.getOperativoActual)(context);
|
|
1002
|
+
var num_sincro = 0;
|
|
1003
|
+
var token = parameters.token;
|
|
1004
|
+
if (token == null) {
|
|
1005
|
+
return { ok: 'ok:N/T' };
|
|
1006
|
+
}
|
|
1007
|
+
else {
|
|
1008
|
+
var { rowCount } = yield client.query(`select 1 from tokens where token = $1`, [token]).fetchOneRowIfExists();
|
|
1009
|
+
if (!rowCount) {
|
|
1010
|
+
return { ok: 'ok:N/T' };
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
var { unidad_analisis, pk_agregada } = (yield getUAPrincipal(context.client, OPERATIVO));
|
|
1014
|
+
if (parameters.tem) {
|
|
1015
|
+
for (let backup of likeAr(parameters.tem).array()) {
|
|
1016
|
+
let area = backup.carga.carga;
|
|
1017
|
+
let respuestasRaiz = backup.respuestasRaiz;
|
|
1018
|
+
let idEncDM = backup.forPkRaiz[pk_agregada].toString();
|
|
1019
|
+
let recepcionista = backup.carga.recepcionista;
|
|
1020
|
+
let asignado = backup.idper;
|
|
1021
|
+
if (Number(idEncDM) < 0) {
|
|
1022
|
+
yield persistirEncuestaAutogeneradaEnDM(context, OPERATIVO, area, idEncDM, token, respuestasRaiz, recepcionista, asignado, parameters.modo_dm, false);
|
|
1023
|
+
}
|
|
1024
|
+
else {
|
|
1025
|
+
let result = yield context.client.query(`update tem
|
|
1026
|
+
set json_backup = $3, fecha_backup = current_timestamp
|
|
1027
|
+
where operativo= $1 and enc = $2 and json_backup is distinct from $4
|
|
1028
|
+
returning 'ok'`, [OPERATIVO, idEncDM, respuestasRaiz, respuestasRaiz]).fetchOneRowIfExists();
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
return {
|
|
1033
|
+
ok: 'ok'
|
|
1034
|
+
};
|
|
1035
|
+
});
|
|
1036
|
+
}
|
|
1037
|
+
},
|
|
1038
|
+
{
|
|
1039
|
+
action: 'consistir_vivienda',
|
|
1040
|
+
parameters: [
|
|
1041
|
+
{ name: 'operativo', references: 'operativos', typeName: 'text' },
|
|
1042
|
+
{ name: 'caso', typeName: 'text' },
|
|
1043
|
+
],
|
|
1044
|
+
coreFunction: function (context, parameters) {
|
|
1045
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1046
|
+
var { be, client } = context;
|
|
1047
|
+
let param_proc = {
|
|
1048
|
+
operativo: parameters.operativo,
|
|
1049
|
+
id_caso: parameters.caso
|
|
1050
|
+
};
|
|
1051
|
+
let errMessage = null;
|
|
1052
|
+
let resultado = null;
|
|
1053
|
+
try {
|
|
1054
|
+
resultado = yield be.procedure.consistir_encuesta.coreFunction(context, param_proc);
|
|
1055
|
+
}
|
|
1056
|
+
catch (err) {
|
|
1057
|
+
var error = (0, cast_error_1.unexpected)(err);
|
|
1058
|
+
errMessage = " consistir_caso. " + error.message;
|
|
1059
|
+
console.error(errMessage, error);
|
|
1060
|
+
}
|
|
1061
|
+
console.log('****** consistir_caso resultado:', resultado);
|
|
1062
|
+
return {
|
|
1063
|
+
ok: 'ok'
|
|
1064
|
+
};
|
|
1065
|
+
});
|
|
1066
|
+
}
|
|
1067
|
+
},
|
|
1068
|
+
{
|
|
1069
|
+
action: 'dm_rescatar',
|
|
1070
|
+
parameters: [
|
|
1071
|
+
{ name: 'localStorageItem', typeName: 'jsonb' },
|
|
1072
|
+
{ name: 'localStorageItemKey', typeName: 'text' },
|
|
1073
|
+
],
|
|
1074
|
+
unlogged: true,
|
|
1075
|
+
coreFunction: function (context, params) {
|
|
1076
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1077
|
+
var { localStorageItemKey, localStorageItem } = params;
|
|
1078
|
+
try {
|
|
1079
|
+
console.log(localStorageItem);
|
|
1080
|
+
yield fs_1.promises.appendFile('local-rescate.txt', JSON.stringify({ now: new Date(), user: context.username, itemKey: localStorageItemKey, itemData: localStorageItem }) + '\n\n', 'utf8');
|
|
1081
|
+
return 'ok';
|
|
1082
|
+
}
|
|
1083
|
+
catch (err) {
|
|
1084
|
+
console.error('ERROR', (0, cast_error_1.expected)(err));
|
|
1085
|
+
throw err;
|
|
1086
|
+
}
|
|
1087
|
+
});
|
|
1088
|
+
}
|
|
1089
|
+
},
|
|
1090
|
+
{
|
|
1091
|
+
action: 'operativo_get',
|
|
1092
|
+
parameters: [],
|
|
1093
|
+
unlogged: true,
|
|
1094
|
+
coreFunction: function (context, _parameters) {
|
|
1095
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1096
|
+
return (0, exports.getOperativoActual)(context);
|
|
1097
|
+
});
|
|
1098
|
+
}
|
|
1099
|
+
},
|
|
1100
|
+
{
|
|
1101
|
+
action: 'get_random_free_case',
|
|
1102
|
+
parameters: [{ name: 'operativo', typeName: 'text' }],
|
|
1103
|
+
coreFunction: function (context, params) {
|
|
1104
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1105
|
+
const minsToExpire = 30;
|
|
1106
|
+
const minsSinceBloqued = `date_part('min', age(current_timestamp, fecha_bloqueo))`;
|
|
1107
|
+
const enc = yield context.client.query(`select enc from tem where operativo=$1 and (libre or ${minsSinceBloqued} > ${minsToExpire}) limit 1;`, [params.operativo]).fetchUniqueValue();
|
|
1108
|
+
yield context.client.query(`UPDATE tem set libre = false, fecha_bloqueo=current_timestamp where operativo=$1 and enc=$2`, [params.operativo, enc.value]).execute();
|
|
1109
|
+
return enc.value;
|
|
1110
|
+
});
|
|
1111
|
+
}
|
|
1112
|
+
},
|
|
1113
|
+
{
|
|
1114
|
+
action: 'muestra_generar',
|
|
1115
|
+
parameters: [
|
|
1116
|
+
{ name: 'operativo', typeName: 'text', references: "operativos" },
|
|
1117
|
+
{ name: 'area', typeName: 'integer', references: "areas" },
|
|
1118
|
+
{ name: 'dominio', typeName: 'integer', defaultValue: 3 },
|
|
1119
|
+
{ name: 'cant_encuestas', typeName: 'integer' },
|
|
1120
|
+
{ name: 'tarea_actual', typeName: 'text', references: 'tareas' },
|
|
1121
|
+
],
|
|
1122
|
+
coreFunction: function (context, params) {
|
|
1123
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1124
|
+
const be = context.be;
|
|
1125
|
+
var permiteGenerarMuestra = yield getOperativoPermiteGenerarMuestra(context.client, params.operativo);
|
|
1126
|
+
if (permiteGenerarMuestra) {
|
|
1127
|
+
let totalActual = (yield context.client.query(`select count(*) as total
|
|
1128
|
+
from tem
|
|
1129
|
+
where operativo= $1 and area = $2`, [params.operativo, params.area]).fetchUniqueValue()).value;
|
|
1130
|
+
for (let i = 1; i < params.cant_encuestas - totalActual; i++) {
|
|
1131
|
+
const enc = yield generarNuevoIdEnc(context, params.operativo, params.area, maxAEncPorArea);
|
|
1132
|
+
yield generarEncuestaTem(context, params.operativo, enc, params.area, params.dominio, params.tarea_actual);
|
|
1133
|
+
}
|
|
1134
|
+
yield generarTareasTemFaltantes(context, params.operativo);
|
|
1135
|
+
return 'ok';
|
|
1136
|
+
}
|
|
1137
|
+
else {
|
|
1138
|
+
throw Error("el operativo no permite generar muestra");
|
|
1139
|
+
}
|
|
1140
|
+
});
|
|
1141
|
+
}
|
|
1142
|
+
},
|
|
1143
|
+
{
|
|
1144
|
+
action: 'muestra_agregar',
|
|
1145
|
+
parameters: [
|
|
1146
|
+
{ name: 'operativo', typeName: 'text', references: "operativos" },
|
|
1147
|
+
{ name: 'area', typeName: 'integer', references: "areas" },
|
|
1148
|
+
{ name: 'dominio', typeName: 'integer', defaultValue: 3 },
|
|
1149
|
+
{ name: 'cant_encuestas', typeName: 'integer' },
|
|
1150
|
+
{ name: 'tarea_actual', typeName: 'text', references: 'tareas' },
|
|
1151
|
+
],
|
|
1152
|
+
coreFunction: function (context, params) {
|
|
1153
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1154
|
+
const be = context.be;
|
|
1155
|
+
var permiteGenerarMuestra = yield getOperativoPermiteGenerarMuestra(context.client, params.operativo);
|
|
1156
|
+
if (permiteGenerarMuestra) {
|
|
1157
|
+
for (let i = 1; i <= params.cant_encuestas; i++) {
|
|
1158
|
+
const enc = yield generarNuevoIdEnc(context, params.operativo, params.area, maxAEncPorArea);
|
|
1159
|
+
yield generarEncuestaTem(context, params.operativo, enc, params.area, params.dominio, params.tarea_actual);
|
|
1160
|
+
}
|
|
1161
|
+
yield generarTareasTemFaltantes(context, params.operativo);
|
|
1162
|
+
return 'ok';
|
|
1163
|
+
}
|
|
1164
|
+
else {
|
|
1165
|
+
throw Error("el operativo no permite generar muestra");
|
|
1166
|
+
}
|
|
1167
|
+
});
|
|
1168
|
+
}
|
|
1169
|
+
},
|
|
1170
|
+
{
|
|
1171
|
+
action: 'encuesta_blanquear_previsualizar',
|
|
1172
|
+
parameters: [
|
|
1173
|
+
{ name: 'operativo', typeName: 'text', references: "operativos" },
|
|
1174
|
+
{ name: 'enc', typeName: 'text' },
|
|
1175
|
+
],
|
|
1176
|
+
roles: ['coor_proc', 'coor_campo', 'admin'],
|
|
1177
|
+
resultOk: 'mostrar_encuesta_a_blanquear_contenido',
|
|
1178
|
+
coreFunction: function (context, params) {
|
|
1179
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1180
|
+
return yield buscarEncuestaEnTem(context, params);
|
|
1181
|
+
});
|
|
1182
|
+
}
|
|
1183
|
+
},
|
|
1184
|
+
{
|
|
1185
|
+
action: 'encuesta_blanquear',
|
|
1186
|
+
parameters: [
|
|
1187
|
+
{ name: 'operativo', typeName: 'text', references: "operativos" },
|
|
1188
|
+
{ name: 'enc', typeName: 'text' },
|
|
1189
|
+
],
|
|
1190
|
+
roles: ['coor_proc', 'subcoor_campo', 'coor_campo', 'admin'],
|
|
1191
|
+
coreFunction: function (context, params) {
|
|
1192
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1193
|
+
var be = context.be;
|
|
1194
|
+
var { unidad_analisis, pk_agregada } = (yield getUAPrincipal(context.client, params.operativo));
|
|
1195
|
+
yield context.client.query(`delete
|
|
1196
|
+
from ${be.db.quoteIdent(unidad_analisis)}
|
|
1197
|
+
where operativo=$1 and ${be.db.quoteIdent(pk_agregada)} = $2
|
|
1198
|
+
`, [params.operativo, params.enc]).execute();
|
|
1199
|
+
//paso a encu para guardar en historial
|
|
1200
|
+
yield context.client.query(`
|
|
1201
|
+
update tem
|
|
1202
|
+
set
|
|
1203
|
+
tarea_actual = 'encu'
|
|
1204
|
+
where operativo = $1 and enc = $2 --pk verificada
|
|
1205
|
+
returning *
|
|
1206
|
+
`, [params.operativo, params.enc]).fetchUniqueRow();
|
|
1207
|
+
yield context.client.query(`
|
|
1208
|
+
delete
|
|
1209
|
+
from tareas_tem
|
|
1210
|
+
where operativo = $1 and enc = $2
|
|
1211
|
+
`, [params.operativo, params.enc]).execute();
|
|
1212
|
+
yield generarTareasTemFaltantes(context, params.operativo);
|
|
1213
|
+
//reseteo tem (no se guarda historial porque tarea_actual es null)
|
|
1214
|
+
//guardo backup por las dudas
|
|
1215
|
+
yield context.client.query(`
|
|
1216
|
+
update tem
|
|
1217
|
+
set
|
|
1218
|
+
json_backup = json_encuesta, json_encuesta = null, tarea_actual = null,
|
|
1219
|
+
fecha_modif_encuesta = null, fecha_backup = current_timestamp, modificado = null,
|
|
1220
|
+
resumen_estado = null, resumen_estado_sup = null, supervision_dirigida = null,
|
|
1221
|
+
pase_tabla = null, rea = null, norea = null, rea_sup = null, norea_sup = null
|
|
1222
|
+
where operativo = $1 and enc = $2 --pk verificada
|
|
1223
|
+
returning *
|
|
1224
|
+
`, [params.operativo, params.enc]).fetchUniqueRow();
|
|
1225
|
+
yield context.client.query(`
|
|
1226
|
+
delete
|
|
1227
|
+
from inconsistencias
|
|
1228
|
+
where operativo = $1 and ${be.db.quoteIdent(pk_agregada)} = $2
|
|
1229
|
+
`, [params.operativo, params.enc]).execute();
|
|
1230
|
+
yield context.client.query(`
|
|
1231
|
+
delete
|
|
1232
|
+
from in_con_var
|
|
1233
|
+
where operativo = $1 and pk_integrada->>${be.db.quoteLiteral(pk_agregada)} = $2
|
|
1234
|
+
`, [params.operativo, params.enc]).execute();
|
|
1235
|
+
yield context.client.query(`
|
|
1236
|
+
delete
|
|
1237
|
+
from inconsistencias_ultimas
|
|
1238
|
+
where operativo = $1 and pk_integrada->>${be.db.quoteLiteral(pk_agregada)} = $2
|
|
1239
|
+
`, [params.operativo, params.enc]).execute();
|
|
1240
|
+
return `la encuesta ${params.enc} se blanqueó correctamente`;
|
|
1241
|
+
});
|
|
1242
|
+
}
|
|
1243
|
+
},
|
|
1244
|
+
{
|
|
1245
|
+
action: 'encuesta_borrar_previsualizar',
|
|
1246
|
+
parameters: [
|
|
1247
|
+
{ name: 'operativo', typeName: 'text', references: "operativos" },
|
|
1248
|
+
{ name: 'enc', typeName: 'text' },
|
|
1249
|
+
],
|
|
1250
|
+
roles: ['coor_proc', 'subcoor_campo', 'coor_campo', 'admin'],
|
|
1251
|
+
resultOk: 'mostrar_encuesta_a_borrar',
|
|
1252
|
+
coreFunction: function (context, params) {
|
|
1253
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1254
|
+
return yield buscarEncuestaEnTem(context, params);
|
|
1255
|
+
});
|
|
1256
|
+
}
|
|
1257
|
+
},
|
|
1258
|
+
{
|
|
1259
|
+
action: 'encuesta_borrar',
|
|
1260
|
+
parameters: [
|
|
1261
|
+
{ name: 'operativo', typeName: 'text', references: "operativos" },
|
|
1262
|
+
{ name: 'enc', typeName: 'text' },
|
|
1263
|
+
],
|
|
1264
|
+
roles: ['coor_proc', 'subcoor_campo', 'coor_campo', 'admin'],
|
|
1265
|
+
coreFunction: function (context, params) {
|
|
1266
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1267
|
+
var be = context.be;
|
|
1268
|
+
var permite_generar_muestra = yield getOperativoPermiteGenerarMuestra(context.client, params.operativo);
|
|
1269
|
+
if (permite_generar_muestra) {
|
|
1270
|
+
var { unidad_analisis, pk_agregada } = (yield getUAPrincipal(context.client, params.operativo));
|
|
1271
|
+
const { casoTem } = yield buscarEncuestaEnTem(context, params);
|
|
1272
|
+
yield context.client.query(`
|
|
1273
|
+
insert into
|
|
1274
|
+
tem_borradas (operativo, enc, cuando, area, cluster, dominio, tarea_actual, json_encuesta, token_autogenerado_dm, enc_autogenerado_dm, enc_autogenerado_dm_capa, proie)
|
|
1275
|
+
values ($1,$2,current_timestamp,$3,$4,$5,$6,$7,$8,$9,$10,$11)
|
|
1276
|
+
returning *
|
|
1277
|
+
`, [
|
|
1278
|
+
casoTem.operativo,
|
|
1279
|
+
casoTem.enc,
|
|
1280
|
+
casoTem.area,
|
|
1281
|
+
casoTem.cluster,
|
|
1282
|
+
casoTem.dominio,
|
|
1283
|
+
casoTem.tarea_actual,
|
|
1284
|
+
casoTem.json_encuesta,
|
|
1285
|
+
casoTem.token_autogenerado_dm,
|
|
1286
|
+
casoTem.enc_autogenerado_dm,
|
|
1287
|
+
casoTem.enc_autogenerado_dm_capa,
|
|
1288
|
+
casoTem.proie
|
|
1289
|
+
]).fetchUniqueRow();
|
|
1290
|
+
yield context.client.query(`delete
|
|
1291
|
+
from ${be.db.quoteIdent(unidad_analisis)}
|
|
1292
|
+
where operativo=$1 and ${be.db.quoteIdent(pk_agregada)} = $2
|
|
1293
|
+
`, [params.operativo, params.enc]).execute();
|
|
1294
|
+
yield context.client.query(`
|
|
1295
|
+
delete
|
|
1296
|
+
from tareas_tem
|
|
1297
|
+
where operativo = $1 and enc = $2
|
|
1298
|
+
returning *
|
|
1299
|
+
`, [params.operativo, params.enc]).fetchAll();
|
|
1300
|
+
yield context.client.query(`
|
|
1301
|
+
delete
|
|
1302
|
+
from tem
|
|
1303
|
+
where operativo = $1 and enc = $2 --pk verificada
|
|
1304
|
+
returning *
|
|
1305
|
+
`, [params.operativo, params.enc]).fetchUniqueRow();
|
|
1306
|
+
yield context.client.query(`
|
|
1307
|
+
delete
|
|
1308
|
+
from historial_tem
|
|
1309
|
+
where operativo = $1 and enc = $2 --pk verificada
|
|
1310
|
+
`, [params.operativo, params.enc]).execute();
|
|
1311
|
+
yield context.client.query(`
|
|
1312
|
+
delete
|
|
1313
|
+
from inconsistencias
|
|
1314
|
+
where operativo = $1 and ${be.db.quoteIdent(pk_agregada)} = $2
|
|
1315
|
+
`, [params.operativo, params.enc]).execute();
|
|
1316
|
+
yield context.client.query(`
|
|
1317
|
+
delete
|
|
1318
|
+
from in_con_var
|
|
1319
|
+
where operativo = $1 and pk_integrada->>${be.db.quoteLiteral(pk_agregada)} = $2
|
|
1320
|
+
`, [params.operativo, params.enc]).execute();
|
|
1321
|
+
yield context.client.query(`
|
|
1322
|
+
delete
|
|
1323
|
+
from inconsistencias_ultimas
|
|
1324
|
+
where operativo = $1 and pk_integrada->>${be.db.quoteLiteral(pk_agregada)} = $2
|
|
1325
|
+
`, [params.operativo, params.enc]).execute();
|
|
1326
|
+
return `la encuesta ${params.enc} se borró correctamente`;
|
|
1327
|
+
}
|
|
1328
|
+
else {
|
|
1329
|
+
throw Error('no se puede borrar la encuesta porque el operativo tiene muestra estática');
|
|
1330
|
+
}
|
|
1331
|
+
});
|
|
1332
|
+
}
|
|
1333
|
+
},
|
|
1334
|
+
{
|
|
1335
|
+
action: 'encuestas_capacitacion_borrar',
|
|
1336
|
+
parameters: [
|
|
1337
|
+
{ name: 'operativo', typeName: 'text', references: "operativos" }
|
|
1338
|
+
],
|
|
1339
|
+
roles: ['admin'],
|
|
1340
|
+
coreFunction: function (context, params) {
|
|
1341
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1342
|
+
var be = context.be;
|
|
1343
|
+
var permite_generar_muestra = yield getOperativoPermiteGenerarMuestra(context.client, params.operativo);
|
|
1344
|
+
if (permite_generar_muestra) {
|
|
1345
|
+
const encsABorrar = (yield context.client.query(`select *
|
|
1346
|
+
from tem
|
|
1347
|
+
where operativo=$1 and enc_autogenerado_dm_capa is not null
|
|
1348
|
+
`, [params.operativo]).fetchAll()).rows;
|
|
1349
|
+
for (let row of encsABorrar) {
|
|
1350
|
+
yield be.procedure.encuesta_borrar.coreFunction(context, { operativo: params.operativo, enc: row.enc });
|
|
1351
|
+
}
|
|
1352
|
+
return 'se borraron las encuestas de capacitación';
|
|
1353
|
+
}
|
|
1354
|
+
else {
|
|
1355
|
+
throw Error('no se puede borrar la encuesta porque el operativo tiene muestra estática');
|
|
1356
|
+
}
|
|
1357
|
+
});
|
|
1358
|
+
}
|
|
1359
|
+
},
|
|
1360
|
+
{
|
|
1361
|
+
action: 'accion_tareas_tem_ejecutar',
|
|
1362
|
+
parameters: [
|
|
1363
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1364
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1365
|
+
{ name: 'enc', typeName: 'text' },
|
|
1366
|
+
{ name: 'condicion', typeName: 'text' },
|
|
1367
|
+
{ name: 'accion', typeName: 'jsonb' },
|
|
1368
|
+
],
|
|
1369
|
+
coreFunction: function (context, params) {
|
|
1370
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1371
|
+
var be = context.be;
|
|
1372
|
+
var accion = params.accion;
|
|
1373
|
+
var cumple = (yield context.client.query(`select accion_cumple_condicion($5, $6, $7, $8, (
|
|
1374
|
+
select condicion
|
|
1375
|
+
from estados_acciones
|
|
1376
|
+
where operativo = $1 and estado = $2 and eaccion = $3 and estado_destino = $4
|
|
1377
|
+
)
|
|
1378
|
+
)`, [
|
|
1379
|
+
params.operativo,
|
|
1380
|
+
accion.estado,
|
|
1381
|
+
accion.eaccion,
|
|
1382
|
+
accion.estado_destino,
|
|
1383
|
+
params.operativo,
|
|
1384
|
+
accion.estado,
|
|
1385
|
+
params.enc,
|
|
1386
|
+
accion.eaccion,
|
|
1387
|
+
]).fetchUniqueValue()).value;
|
|
1388
|
+
if (!cumple) {
|
|
1389
|
+
throw Error(`No se pudo ejecutar la acción, no se cumple la condición "${params.condicion}" o bien el estado está desactualizado, refresque la grilla.`);
|
|
1390
|
+
}
|
|
1391
|
+
var result = yield context.client.query(`
|
|
1392
|
+
UPDATE tareas_tem
|
|
1393
|
+
set estado = $4
|
|
1394
|
+
where operativo=$1
|
|
1395
|
+
and enc=$2
|
|
1396
|
+
and tarea = $3
|
|
1397
|
+
returning *`, [
|
|
1398
|
+
params.operativo,
|
|
1399
|
+
params.enc,
|
|
1400
|
+
params.tarea,
|
|
1401
|
+
accion.estado_destino
|
|
1402
|
+
]).fetchUniqueRow();
|
|
1403
|
+
if (accion.nombre_procedure) {
|
|
1404
|
+
if (be.procedure[accion.nombre_procedure]) {
|
|
1405
|
+
yield be.procedure[accion.nombre_procedure].coreFunction(context, params);
|
|
1406
|
+
}
|
|
1407
|
+
else {
|
|
1408
|
+
throw Error(`No existe el procedure "${accion.nombre_procedure}" definido en la tabla "estados_acciones" para el
|
|
1409
|
+
operativo: ${accion.operativo}, estado: ${accion.estado}, eaccion: ${accion.eaccion}.`);
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
// BUSCO PASE DE TAREA
|
|
1413
|
+
var tareaSiguiente = (yield context.client.query(`select *
|
|
1414
|
+
from tareas_proximas
|
|
1415
|
+
where
|
|
1416
|
+
operativo = $1 and
|
|
1417
|
+
tarea = $2 and estado = $3 and
|
|
1418
|
+
tarea_cumple_condicion($4, $5, $6, $7, condicion)
|
|
1419
|
+
order by orden
|
|
1420
|
+
limit 1`, [
|
|
1421
|
+
params.operativo,
|
|
1422
|
+
params.tarea,
|
|
1423
|
+
accion.estado_destino,
|
|
1424
|
+
params.operativo,
|
|
1425
|
+
params.tarea,
|
|
1426
|
+
accion.estado_destino,
|
|
1427
|
+
params.enc
|
|
1428
|
+
]).fetchOneRowIfExists()).row;
|
|
1429
|
+
if (tareaSiguiente) {
|
|
1430
|
+
yield context.client.query(`
|
|
1431
|
+
update tem
|
|
1432
|
+
set tarea_actual = $3
|
|
1433
|
+
where operativo = $1 and enc = $2
|
|
1434
|
+
returning *`, [params.operativo, params.enc, tareaSiguiente.tarea_destino]).fetchUniqueRow();
|
|
1435
|
+
let autoAsignado = tareaSiguiente.registra_recepcionista ? context.user.idper : null;
|
|
1436
|
+
let q = context.be.db.quoteLiteral;
|
|
1437
|
+
yield context.client.query(`
|
|
1438
|
+
update tareas_tem
|
|
1439
|
+
set ts_entrada = current_timestamp, adelantar = null, estado = $4
|
|
1440
|
+
${autoAsignado ?
|
|
1441
|
+
", recepcionista=" + q(autoAsignado)
|
|
1442
|
+
: ""}
|
|
1443
|
+
where operativo = $1 and enc = $2 and tarea = $3
|
|
1444
|
+
returning *`, [params.operativo, params.enc, tareaSiguiente.tarea_destino, tareaSiguiente.estado_destino]).fetchUniqueRow();
|
|
1445
|
+
if (tareaSiguiente.nombre_procedure) {
|
|
1446
|
+
yield be.procedure[tareaSiguiente.nombre_procedure].coreFunction(context, params);
|
|
1447
|
+
}
|
|
1448
|
+
}
|
|
1449
|
+
// FIN PASE DE TAREA
|
|
1450
|
+
return "ok";
|
|
1451
|
+
});
|
|
1452
|
+
}
|
|
1453
|
+
},
|
|
1454
|
+
{
|
|
1455
|
+
action: 'encuesta_carga_preparar',
|
|
1456
|
+
parameters: [
|
|
1457
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1458
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1459
|
+
{ name: 'enc', typeName: 'text' },
|
|
1460
|
+
],
|
|
1461
|
+
coreFunction: function (context, params) {
|
|
1462
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1463
|
+
yield context.client.query(`
|
|
1464
|
+
UPDATE tareas_tem
|
|
1465
|
+
set operacion = $4
|
|
1466
|
+
where operativo=$1 and tarea= $2 and enc=$3
|
|
1467
|
+
returning *`, [params.operativo, params.tarea, params.enc, OPERACION_PREPARAR_CARGA])
|
|
1468
|
+
.fetchUniqueRow();
|
|
1469
|
+
return 'ok';
|
|
1470
|
+
});
|
|
1471
|
+
}
|
|
1472
|
+
},
|
|
1473
|
+
{
|
|
1474
|
+
action: 'encuesta_disponibilizar',
|
|
1475
|
+
parameters: [
|
|
1476
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1477
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1478
|
+
{ name: 'enc', typeName: 'text' },
|
|
1479
|
+
],
|
|
1480
|
+
coreFunction: function (context, params) {
|
|
1481
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1482
|
+
yield context.client.query(`
|
|
1483
|
+
UPDATE tareas_tem
|
|
1484
|
+
set asignado = null
|
|
1485
|
+
where operativo=$1 and tarea= $2 and enc=$3
|
|
1486
|
+
returning *`, [params.operativo, params.tarea, params.enc])
|
|
1487
|
+
.fetchUniqueRow();
|
|
1488
|
+
return 'ok';
|
|
1489
|
+
});
|
|
1490
|
+
}
|
|
1491
|
+
},
|
|
1492
|
+
{
|
|
1493
|
+
action: 'encuesta_no_cargar',
|
|
1494
|
+
parameters: [
|
|
1495
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1496
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1497
|
+
{ name: 'enc', typeName: 'text' },
|
|
1498
|
+
],
|
|
1499
|
+
coreFunction: function (context, params) {
|
|
1500
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1501
|
+
yield context.client.query(`
|
|
1502
|
+
UPDATE tareas_tem
|
|
1503
|
+
set operacion = null
|
|
1504
|
+
where operativo=$1 and tarea= $2 and enc=$3
|
|
1505
|
+
returning *`, [params.operativo, params.tarea, params.enc])
|
|
1506
|
+
.fetchUniqueRow();
|
|
1507
|
+
return 'ok';
|
|
1508
|
+
});
|
|
1509
|
+
}
|
|
1510
|
+
},
|
|
1511
|
+
{
|
|
1512
|
+
action: 'encuesta_descarga_preparar',
|
|
1513
|
+
parameters: [
|
|
1514
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1515
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1516
|
+
{ name: 'enc', typeName: 'text' },
|
|
1517
|
+
],
|
|
1518
|
+
coreFunction: function (context, params) {
|
|
1519
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1520
|
+
yield context.client.query(`
|
|
1521
|
+
UPDATE tareas_tem
|
|
1522
|
+
set operacion = $4
|
|
1523
|
+
where operativo=$1 and tarea= $2 and enc=$3
|
|
1524
|
+
returning *`, [params.operativo, params.tarea, params.enc, OPERACION_PREPARAR_DESCARGA])
|
|
1525
|
+
.fetchUniqueRow();
|
|
1526
|
+
return 'ok';
|
|
1527
|
+
});
|
|
1528
|
+
}
|
|
1529
|
+
},
|
|
1530
|
+
{
|
|
1531
|
+
action: 'encuesta_no_descargar',
|
|
1532
|
+
parameters: [
|
|
1533
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1534
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1535
|
+
{ name: 'enc', typeName: 'text' },
|
|
1536
|
+
],
|
|
1537
|
+
coreFunction: function (context, params) {
|
|
1538
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1539
|
+
yield context.client.query(`
|
|
1540
|
+
UPDATE tareas_tem
|
|
1541
|
+
set operacion = 'cargar'
|
|
1542
|
+
where operativo=$1 and tarea= $2 and enc=$3
|
|
1543
|
+
returning *`, [params.operativo, params.tarea, params.enc])
|
|
1544
|
+
.fetchUniqueRow();
|
|
1545
|
+
return 'ok';
|
|
1546
|
+
});
|
|
1547
|
+
}
|
|
1548
|
+
},
|
|
1549
|
+
{
|
|
1550
|
+
action: 'encuesta_analizar',
|
|
1551
|
+
parameters: [
|
|
1552
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1553
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1554
|
+
{ name: 'enc', typeName: 'text' },
|
|
1555
|
+
],
|
|
1556
|
+
coreFunction: function (context, params) {
|
|
1557
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1558
|
+
var be = context.be;
|
|
1559
|
+
yield be.procedure.consistir_encuesta.coreFunction(context, { operativo: params.operativo, id_caso: params.enc });
|
|
1560
|
+
return 'ok';
|
|
1561
|
+
});
|
|
1562
|
+
}
|
|
1563
|
+
},
|
|
1564
|
+
{
|
|
1565
|
+
action: 'inconsistencias_encuesta_controlar',
|
|
1566
|
+
parameters: [
|
|
1567
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1568
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1569
|
+
{ name: 'enc', typeName: 'text' },
|
|
1570
|
+
],
|
|
1571
|
+
coreFunction: function (context, params) {
|
|
1572
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1573
|
+
var cantidad = (yield context.client.query(`
|
|
1574
|
+
select count(*) as cumple
|
|
1575
|
+
from inconsistencias i
|
|
1576
|
+
join consistencias c using (operativo, consistencia)
|
|
1577
|
+
join momentos_consistencia mc using (operativo, momento)
|
|
1578
|
+
where
|
|
1579
|
+
operativo = $1 and
|
|
1580
|
+
vivienda = $2 and
|
|
1581
|
+
momento_consistencia_cumple_condicion(
|
|
1582
|
+
mc.operativo,
|
|
1583
|
+
i.vivienda,
|
|
1584
|
+
$3,
|
|
1585
|
+
(select condicion from momentos_consistencia where operativo = mc.operativo and momento = mc.momento)
|
|
1586
|
+
) and
|
|
1587
|
+
i.justificacion is null`, [params.operativo, params.enc, context.username])
|
|
1588
|
+
.fetchUniqueValue()).value;
|
|
1589
|
+
if (cantidad) {
|
|
1590
|
+
throw Error(`no se puede verificar la tarea porque hay inconsistencias, por favor resuélvalas o justifíquelas en caso de ser necesario.`);
|
|
1591
|
+
}
|
|
1592
|
+
return 'ok';
|
|
1593
|
+
});
|
|
1594
|
+
}
|
|
1595
|
+
},
|
|
1596
|
+
{
|
|
1597
|
+
action: 'encuesta_verificar',
|
|
1598
|
+
parameters: [
|
|
1599
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1600
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1601
|
+
{ name: 'enc', typeName: 'text' },
|
|
1602
|
+
],
|
|
1603
|
+
coreFunction: function (context, params) {
|
|
1604
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1605
|
+
var be = context.be;
|
|
1606
|
+
yield be.procedure.inconsistencias_encuesta_controlar.coreFunction(context, params);
|
|
1607
|
+
yield context.client.query(`
|
|
1608
|
+
UPDATE tareas_tem
|
|
1609
|
+
set verificado = '1'
|
|
1610
|
+
where operativo=$1 and tarea= $2 and enc=$3
|
|
1611
|
+
returning *`, [params.operativo, params.tarea, params.enc])
|
|
1612
|
+
.fetchUniqueRow();
|
|
1613
|
+
return 'ok';
|
|
1614
|
+
});
|
|
1615
|
+
}
|
|
1616
|
+
},
|
|
1617
|
+
{
|
|
1618
|
+
action: 'encuesta_no_verificar',
|
|
1619
|
+
parameters: [
|
|
1620
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1621
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1622
|
+
{ name: 'enc', typeName: 'text' },
|
|
1623
|
+
],
|
|
1624
|
+
coreFunction: function (context, params) {
|
|
1625
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1626
|
+
yield context.client.query(`
|
|
1627
|
+
UPDATE tareas_tem
|
|
1628
|
+
set verificado = null
|
|
1629
|
+
where operativo=$1 and tarea= $2 and enc=$3
|
|
1630
|
+
returning *`, [params.operativo, params.tarea, params.enc])
|
|
1631
|
+
.fetchUniqueRow();
|
|
1632
|
+
return 'ok';
|
|
1633
|
+
});
|
|
1634
|
+
}
|
|
1635
|
+
},
|
|
1636
|
+
{
|
|
1637
|
+
action: 'encuesta_cerrar',
|
|
1638
|
+
parameters: [
|
|
1639
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1640
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1641
|
+
{ name: 'enc', typeName: 'text' },
|
|
1642
|
+
],
|
|
1643
|
+
coreFunction: function (context, params) {
|
|
1644
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1645
|
+
yield context.client.query(`
|
|
1646
|
+
UPDATE tareas_tem
|
|
1647
|
+
set verificado = '1', asignado = $4
|
|
1648
|
+
where operativo=$1 and tarea= $2 and enc=$3
|
|
1649
|
+
returning *`, [params.operativo, params.tarea, params.enc, context.user.idper])
|
|
1650
|
+
.fetchUniqueRow();
|
|
1651
|
+
return 'ok';
|
|
1652
|
+
});
|
|
1653
|
+
}
|
|
1654
|
+
},
|
|
1655
|
+
{
|
|
1656
|
+
action: 'encuesta_no_cerrar',
|
|
1657
|
+
parameters: [
|
|
1658
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1659
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1660
|
+
{ name: 'enc', typeName: 'text' },
|
|
1661
|
+
],
|
|
1662
|
+
coreFunction: function (context, params) {
|
|
1663
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1664
|
+
yield context.client.query(`
|
|
1665
|
+
UPDATE tareas_tem
|
|
1666
|
+
set verificado = null
|
|
1667
|
+
where operativo=$1 and tarea= $2 and enc=$3
|
|
1668
|
+
returning *`, [params.operativo, params.tarea, params.enc])
|
|
1669
|
+
.fetchUniqueRow();
|
|
1670
|
+
return 'ok';
|
|
1671
|
+
});
|
|
1672
|
+
}
|
|
1673
|
+
},
|
|
1674
|
+
{
|
|
1675
|
+
action: 'encuesta_supervisar_presencial',
|
|
1676
|
+
parameters: [
|
|
1677
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1678
|
+
{ name: 'enc', typeName: 'text' },
|
|
1679
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1680
|
+
],
|
|
1681
|
+
coreFunction: function (context, params) {
|
|
1682
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1683
|
+
yield context.client.query(`
|
|
1684
|
+
UPDATE tem
|
|
1685
|
+
set tarea_actual = $3, supervision_dirigida = $4
|
|
1686
|
+
where operativo=$1 and enc=$2
|
|
1687
|
+
returning *`, [params.operativo, params.enc, 'supe', 1])
|
|
1688
|
+
.fetchUniqueRow();
|
|
1689
|
+
return 'ok';
|
|
1690
|
+
});
|
|
1691
|
+
}
|
|
1692
|
+
},
|
|
1693
|
+
{
|
|
1694
|
+
action: 'encuesta_supervisar_telefonica',
|
|
1695
|
+
parameters: [
|
|
1696
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1697
|
+
{ name: 'enc', typeName: 'text' },
|
|
1698
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1699
|
+
],
|
|
1700
|
+
coreFunction: function (context, params) {
|
|
1701
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1702
|
+
yield context.client.query(`
|
|
1703
|
+
UPDATE tem
|
|
1704
|
+
set tarea_actual = $3, supervision_dirigida = $4
|
|
1705
|
+
where operativo=$1 and enc=$2
|
|
1706
|
+
returning *`, [params.operativo, params.enc, 'supe', 2])
|
|
1707
|
+
.fetchUniqueRow();
|
|
1708
|
+
return 'ok';
|
|
1709
|
+
});
|
|
1710
|
+
}
|
|
1711
|
+
},
|
|
1712
|
+
{
|
|
1713
|
+
action: 'encuesta_no_supervisar',
|
|
1714
|
+
parameters: [
|
|
1715
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1716
|
+
{ name: 'enc', typeName: 'text' },
|
|
1717
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1718
|
+
],
|
|
1719
|
+
coreFunction: function (context, params) {
|
|
1720
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1721
|
+
yield context.client.query(`
|
|
1722
|
+
UPDATE tem
|
|
1723
|
+
set tarea_actual = $3, supervision_dirigida = null
|
|
1724
|
+
where operativo=$1 and enc=$2
|
|
1725
|
+
returning *`, [params.operativo, params.enc, 'finc'])
|
|
1726
|
+
.fetchUniqueRow();
|
|
1727
|
+
return 'ok';
|
|
1728
|
+
});
|
|
1729
|
+
}
|
|
1730
|
+
},
|
|
1731
|
+
{
|
|
1732
|
+
action: 'encuesta_pasar_a_anac',
|
|
1733
|
+
parameters: [
|
|
1734
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1735
|
+
{ name: 'enc', typeName: 'text' },
|
|
1736
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1737
|
+
],
|
|
1738
|
+
coreFunction: function (context, params) {
|
|
1739
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1740
|
+
yield context.client.query(`
|
|
1741
|
+
UPDATE tareas_tem
|
|
1742
|
+
set estado = 'CC'
|
|
1743
|
+
where operativo=$1 and enc=$2 and tarea in ($3,$4) --quiero pasar las 2 tareas a CC
|
|
1744
|
+
`, [params.operativo, params.enc, 'anac', 'proc'])
|
|
1745
|
+
.execute();
|
|
1746
|
+
yield context.client.query(`
|
|
1747
|
+
UPDATE tem
|
|
1748
|
+
set tarea_actual = $3
|
|
1749
|
+
where operativo=$1 and enc=$2
|
|
1750
|
+
returning *`, [params.operativo, params.enc, 'anac'])
|
|
1751
|
+
.fetchUniqueRow();
|
|
1752
|
+
return 'ok';
|
|
1753
|
+
});
|
|
1754
|
+
}
|
|
1755
|
+
},
|
|
1756
|
+
{
|
|
1757
|
+
action: 'encuesta_no_pasar_a_anac',
|
|
1758
|
+
parameters: [
|
|
1759
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1760
|
+
{ name: 'enc', typeName: 'text' },
|
|
1761
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1762
|
+
],
|
|
1763
|
+
coreFunction: function (context, params) {
|
|
1764
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1765
|
+
yield context.client.query(`
|
|
1766
|
+
UPDATE tareas_tem
|
|
1767
|
+
set estado = 'A'
|
|
1768
|
+
where operativo=$1 and enc=$2 and tarea= $3
|
|
1769
|
+
returning *`, [params.operativo, params.enc, 'proc'])
|
|
1770
|
+
.fetchUniqueRow();
|
|
1771
|
+
yield context.client.query(`
|
|
1772
|
+
UPDATE tareas_tem
|
|
1773
|
+
set estado = '0D'
|
|
1774
|
+
where operativo=$1 and enc=$2 and tarea= $3
|
|
1775
|
+
returning *`, [params.operativo, params.enc, 'anac'])
|
|
1776
|
+
.fetchUniqueRow();
|
|
1777
|
+
yield context.client.query(`
|
|
1778
|
+
UPDATE tem
|
|
1779
|
+
set tarea_actual = $3
|
|
1780
|
+
where operativo=$1 and enc=$2
|
|
1781
|
+
returning *`, [params.operativo, params.enc, 'proc'])
|
|
1782
|
+
.fetchUniqueRow();
|
|
1783
|
+
return 'ok';
|
|
1784
|
+
});
|
|
1785
|
+
}
|
|
1786
|
+
},
|
|
1787
|
+
{
|
|
1788
|
+
action: 'encuesta_devolver_proc_desde_anac',
|
|
1789
|
+
parameters: [
|
|
1790
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1791
|
+
{ name: 'enc', typeName: 'text' },
|
|
1792
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1793
|
+
],
|
|
1794
|
+
coreFunction: function (context, params) {
|
|
1795
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1796
|
+
var be = context.be;
|
|
1797
|
+
yield be.procedure.encuesta_verificar.coreFunction(context, params);
|
|
1798
|
+
yield context.client.query(`
|
|
1799
|
+
UPDATE tareas_tem
|
|
1800
|
+
set estado = 'A'
|
|
1801
|
+
where operativo=$1 and enc=$2 and tarea= $3
|
|
1802
|
+
returning *`, [params.operativo, params.enc, 'proc'])
|
|
1803
|
+
.fetchUniqueRow();
|
|
1804
|
+
yield context.client.query(`
|
|
1805
|
+
UPDATE tem
|
|
1806
|
+
set tarea_actual = $3
|
|
1807
|
+
where operativo=$1 and enc=$2
|
|
1808
|
+
returning *`, [params.operativo, params.enc, 'proc'])
|
|
1809
|
+
.fetchUniqueRow();
|
|
1810
|
+
return 'ok';
|
|
1811
|
+
});
|
|
1812
|
+
}
|
|
1813
|
+
},
|
|
1814
|
+
{
|
|
1815
|
+
action: 'encuesta_no_devolver_proc_desde_anac',
|
|
1816
|
+
parameters: [
|
|
1817
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1818
|
+
{ name: 'enc', typeName: 'text' },
|
|
1819
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1820
|
+
],
|
|
1821
|
+
coreFunction: function (context, params) {
|
|
1822
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1823
|
+
var be = context.be;
|
|
1824
|
+
yield context.client.query(`
|
|
1825
|
+
UPDATE tareas_tem
|
|
1826
|
+
set estado = 'CC'
|
|
1827
|
+
where operativo=$1 and enc=$2 and tarea in ($3,$4) --quiero pasar las 2 tareas a CC
|
|
1828
|
+
`, [params.operativo, params.enc, 'anac', 'proc'])
|
|
1829
|
+
.execute();
|
|
1830
|
+
yield be.procedure.encuesta_no_verificar.coreFunction(context, params);
|
|
1831
|
+
return 'ok';
|
|
1832
|
+
});
|
|
1833
|
+
}
|
|
1834
|
+
},
|
|
1835
|
+
{
|
|
1836
|
+
action: 'encuesta_recuperar_desde_anac',
|
|
1837
|
+
parameters: [
|
|
1838
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1839
|
+
{ name: 'enc', typeName: 'text' },
|
|
1840
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1841
|
+
],
|
|
1842
|
+
coreFunction: function (context, params) {
|
|
1843
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1844
|
+
var be = context.be;
|
|
1845
|
+
var { operativo, enc, tarea } = params;
|
|
1846
|
+
yield be.procedure.encuesta_verificar.coreFunction(context, params);
|
|
1847
|
+
yield context.client.query(`
|
|
1848
|
+
update tem
|
|
1849
|
+
set tarea_actual = $3
|
|
1850
|
+
where operativo = $1 and enc = $2
|
|
1851
|
+
returning *`, [operativo, enc, 'recu'])
|
|
1852
|
+
.fetchUniqueRow();
|
|
1853
|
+
return 'ok';
|
|
1854
|
+
});
|
|
1855
|
+
}
|
|
1856
|
+
},
|
|
1857
|
+
{
|
|
1858
|
+
action: 'encuesta_no_recuperar_desde_anac',
|
|
1859
|
+
parameters: [
|
|
1860
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1861
|
+
{ name: 'enc', typeName: 'text' },
|
|
1862
|
+
{ name: 'tarea', typeName: 'text' },
|
|
1863
|
+
],
|
|
1864
|
+
coreFunction: function (context, params) {
|
|
1865
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1866
|
+
var be = context.be;
|
|
1867
|
+
var { operativo, enc, tarea } = params;
|
|
1868
|
+
yield context.client.query(`
|
|
1869
|
+
update tem
|
|
1870
|
+
set tarea_actual = $4
|
|
1871
|
+
where operativo = $1 and enc = $2 and tarea_actual = $3
|
|
1872
|
+
returning *`, [operativo, enc, 'recu', 'anac'])
|
|
1873
|
+
.fetchUniqueRow();
|
|
1874
|
+
yield be.procedure.encuesta_no_verificar.coreFunction(context, params);
|
|
1875
|
+
return 'ok';
|
|
1876
|
+
});
|
|
1877
|
+
}
|
|
1878
|
+
},
|
|
1879
|
+
{
|
|
1880
|
+
action: 'encuesta_forzar_tarea',
|
|
1881
|
+
parameters: [
|
|
1882
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1883
|
+
{ name: 'enc', typeName: 'text' },
|
|
1884
|
+
{ name: 'tarea_actual', typeName: 'text' },
|
|
1885
|
+
{ name: 'tarea_nueva', typeName: 'text' },
|
|
1886
|
+
],
|
|
1887
|
+
coreFunction: function (context, params) {
|
|
1888
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1889
|
+
var { operativo, enc, tarea_actual, tarea_nueva } = params;
|
|
1890
|
+
yield context.client.query(`
|
|
1891
|
+
update tem
|
|
1892
|
+
set tarea_actual = $4
|
|
1893
|
+
where operativo = $1 and enc = $2 and tarea_actual = $3
|
|
1894
|
+
returning *`, [operativo, enc, tarea_actual, tarea_nueva])
|
|
1895
|
+
.fetchUniqueRow();
|
|
1896
|
+
yield context.client.query(`
|
|
1897
|
+
update tareas_tem
|
|
1898
|
+
set estado = 'V'
|
|
1899
|
+
where operativo = $1 and enc = $2 and tarea = $3
|
|
1900
|
+
returning *`, [operativo, enc, tarea_actual])
|
|
1901
|
+
.fetchUniqueRow();
|
|
1902
|
+
yield context.client.query(`
|
|
1903
|
+
update tareas_tem
|
|
1904
|
+
set estado = '0D'
|
|
1905
|
+
where operativo = $1 and enc = $2 and tarea = $3
|
|
1906
|
+
returning *`, [operativo, enc, tarea_nueva])
|
|
1907
|
+
.fetchUniqueRow();
|
|
1908
|
+
return 'ok';
|
|
1909
|
+
});
|
|
1910
|
+
}
|
|
1911
|
+
},
|
|
1912
|
+
{
|
|
1913
|
+
action: 'encuesta_habilitar_deshabilitar',
|
|
1914
|
+
parameters: [
|
|
1915
|
+
{ name: 'operativo', typeName: 'text' },
|
|
1916
|
+
{ name: 'enc', typeName: 'text' },
|
|
1917
|
+
],
|
|
1918
|
+
coreFunction: function (context, params) {
|
|
1919
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1920
|
+
yield context.client.query(`
|
|
1921
|
+
UPDATE tem
|
|
1922
|
+
set habilitada = not habilitada
|
|
1923
|
+
where operativo=$1 and enc=$2
|
|
1924
|
+
returning *`, [params.operativo, params.enc])
|
|
1925
|
+
.fetchUniqueRow();
|
|
1926
|
+
return 'ok';
|
|
1927
|
+
});
|
|
1928
|
+
}
|
|
1929
|
+
},
|
|
1930
|
+
{
|
|
1931
|
+
action: 'encuestas_procesamiento_pasar',
|
|
1932
|
+
parameters: [],
|
|
1933
|
+
coreFunction: function (context, _params) {
|
|
1934
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1935
|
+
return yield pasarEncuestasAProie(context.client);
|
|
1936
|
+
});
|
|
1937
|
+
}
|
|
1938
|
+
},
|
|
1939
|
+
{
|
|
1940
|
+
action: 'intercambiar_encuestas',
|
|
1941
|
+
parameters: [
|
|
1942
|
+
{ name: 'enc1', references: 'tem', typeName: 'text' },
|
|
1943
|
+
{ name: 'cantHog1', typeName: 'integer' },
|
|
1944
|
+
{ name: 'enc2', typeName: 'text' },
|
|
1945
|
+
{ name: 'cantHog2', typeName: 'integer' },
|
|
1946
|
+
{ name: 'paso', typeName: 'integer' },
|
|
1947
|
+
{ name: 'confirma', typeName: 'boolean', defaultValue: false, label: 'Confirma intercambio de los datos entre las encuestas? ' },
|
|
1948
|
+
],
|
|
1949
|
+
roles: ['coor_proc', 'procesamiento', 'admin'],
|
|
1950
|
+
progress: true,
|
|
1951
|
+
coreFunction: function (context, params) {
|
|
1952
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1953
|
+
/**
|
|
1954
|
+
* Para controlar:
|
|
1955
|
+
* - que las hogares, personas, etc estén intercambiadas
|
|
1956
|
+
* * tanto en el json
|
|
1957
|
+
* * como en las TDs
|
|
1958
|
+
* - cosas que se calculan por la app? cuales? (resumen_estado, rea y norea)
|
|
1959
|
+
*/
|
|
1960
|
+
if (!params.confirma) {
|
|
1961
|
+
throw new Error('No confirmó intercambio');
|
|
1962
|
+
}
|
|
1963
|
+
if (!params.enc1 || !params.enc2) {
|
|
1964
|
+
throw new Error('Error, Falta ingresar un numero de encuesta!');
|
|
1965
|
+
}
|
|
1966
|
+
if (params.enc1 == params.enc2) {
|
|
1967
|
+
throw new Error('Error, enc1 y enc2 deben ser distintos!');
|
|
1968
|
+
}
|
|
1969
|
+
if (!params.cantHog1) {
|
|
1970
|
+
throw new Error('Error, Cantidad de Hogares de enc1, no esta ingresado!');
|
|
1971
|
+
}
|
|
1972
|
+
if (!params.cantHog2) {
|
|
1973
|
+
throw new Error('Error, Cantidad de Hogares de enc2, no esta ingresado!');
|
|
1974
|
+
}
|
|
1975
|
+
// CONTROLAR QUE NINGUNA DE LAS 2 encuestas ESTE CARGADA, ABIERTA FALTA
|
|
1976
|
+
const OPERATIVO = yield (0, exports.getOperativoActual)(context);
|
|
1977
|
+
var { unidad_analisis, pk_agregada } = (yield getUAPrincipal(context.client, OPERATIVO));
|
|
1978
|
+
const cant_hogs = (yield context.client.query(`
|
|
1979
|
+
select vivienda, count(*)nh from hogares where operativo=$1 and (vivienda=$2 or vivienda=$3)
|
|
1980
|
+
group by vivienda order by vivienda
|
|
1981
|
+
`, [OPERATIVO, params.enc1, params.enc2]).fetchAll()).rows;
|
|
1982
|
+
var param_nh = [params.cantHog1, params.cantHog2];
|
|
1983
|
+
cant_hogs.forEach((xe, i) => {
|
|
1984
|
+
if (param_nh[i] !== xe.nh) {
|
|
1985
|
+
const xmens = `Error, no coincide la cantidad de hogares de enc${i + 1}`;
|
|
1986
|
+
throw new Error(xmens);
|
|
1987
|
+
}
|
|
1988
|
+
;
|
|
1989
|
+
});
|
|
1990
|
+
var regEnc = (yield context.client.query(`
|
|
1991
|
+
select enc, tarea_actual, json_encuesta from tem where operativo=$1 and (enc =$2 or enc=$3) order by enc
|
|
1992
|
+
`, [OPERATIVO, params.enc1, params.enc2]).fetchAll()).rows;
|
|
1993
|
+
if (regEnc.length != 2) {
|
|
1994
|
+
throw new Error('Error, No se encontraron 2 encuestas');
|
|
1995
|
+
}
|
|
1996
|
+
else {
|
|
1997
|
+
// limpia las TDs
|
|
1998
|
+
let [enc1, enc2] = [regEnc[0], regEnc[1]];
|
|
1999
|
+
if (params.paso == 1) {
|
|
2000
|
+
yield context.client.query(`delete from ${context.be.db.quoteIdent(unidad_analisis)} where operativo=$1 and (vivienda=$2 OR vivienda=$3)`, [OPERATIVO, enc1.enc, enc2.enc]).execute();
|
|
2001
|
+
}
|
|
2002
|
+
else if (params.paso == 2) {
|
|
2003
|
+
//simula guardado
|
|
2004
|
+
yield simularGuardadoDeEncuestaDesdeAppEscritorio(context, OPERATIVO, enc1.enc, enc1.tarea_actual, enc2.json_encuesta);
|
|
2005
|
+
yield simularGuardadoDeEncuestaDesdeAppEscritorio(context, OPERATIVO, enc2.enc, enc2.tarea_actual, enc1.json_encuesta);
|
|
2006
|
+
}
|
|
2007
|
+
}
|
|
2008
|
+
return (`Listo paso ${params.paso}. Intercambio realizado entre las encuestas ${params.enc1} y ${params.enc2}. Por favor consista la encuesta`);
|
|
2009
|
+
});
|
|
2010
|
+
}
|
|
2011
|
+
},
|
|
2012
|
+
{
|
|
2013
|
+
action: 'encuestador_dms_mostrar',
|
|
2014
|
+
parameters: [
|
|
2015
|
+
{ name: 'operativo', typeName: 'text', references: "operativos" },
|
|
2016
|
+
{ name: 'encuestador', typeName: 'text' },
|
|
2017
|
+
],
|
|
2018
|
+
roles: ['coor_proc', 'coor_campo', 'admin'],
|
|
2019
|
+
resultOk: 'mostrar_encuestas_a_blanquear',
|
|
2020
|
+
coreFunction: function (context, params) {
|
|
2021
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
2022
|
+
var result = yield context.client.query(`
|
|
2023
|
+
select *
|
|
2024
|
+
from tareas_tem
|
|
2025
|
+
where operativo=$1 and asignado = $2 and cargado_dm is not null
|
|
2026
|
+
order by cargado_dm
|
|
2027
|
+
`, [params.operativo, params.encuestador])
|
|
2028
|
+
.fetchAll();
|
|
2029
|
+
if (result.rowCount == 0) {
|
|
2030
|
+
throw Error(`No se encontraron encuestas cargadas en un DM para el operativo ${params.operativo}, encuestador ${params.encuestador}`);
|
|
2031
|
+
}
|
|
2032
|
+
return { rows: result.rows, operativo: params.operativo };
|
|
2033
|
+
});
|
|
2034
|
+
}
|
|
2035
|
+
},
|
|
2036
|
+
{
|
|
2037
|
+
action: 'dm_blanquear',
|
|
2038
|
+
parameters: [
|
|
2039
|
+
{ name: 'operativo', typeName: 'text', references: "operativos" },
|
|
2040
|
+
{ name: 'token', typeName: 'text' },
|
|
2041
|
+
],
|
|
2042
|
+
roles: ['coor_proc', 'coor_campo', 'admin'],
|
|
2043
|
+
coreFunction: function (context, params) {
|
|
2044
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
2045
|
+
var be = context.be;
|
|
2046
|
+
let tareasTemResult = yield context.client.query(`
|
|
2047
|
+
UPDATE tareas_tem
|
|
2048
|
+
set cargado_dm = null, operacion = $3, estado = $4
|
|
2049
|
+
where operativo=$1 and cargado_dm = $2
|
|
2050
|
+
returning *`, [params.operativo, params.token, OPERACION_PREPARAR_DESCARGA, ESTADO_POSTERIOR_DESCARGA])
|
|
2051
|
+
.fetchAll();
|
|
2052
|
+
if (tareasTemResult.rowCount == 0) {
|
|
2053
|
+
throw (0, console_1.error)('No se blanqueó ninguna encuesta');
|
|
2054
|
+
}
|
|
2055
|
+
for (let tt of tareasTemResult.rows) {
|
|
2056
|
+
tt.result_blanqueo = `enc ${tt.enc} se blanqueó correctamente.`;
|
|
2057
|
+
let resultBackup = yield context.client.query(`
|
|
2058
|
+
UPDATE tem
|
|
2059
|
+
set json_encuesta = json_backup, fecha_modif_encuesta = fecha_backup
|
|
2060
|
+
where operativo=$1 and enc=$2 and fecha_backup > coalesce(fecha_modif_encuesta, '1900-01-01') and json_backup is not null
|
|
2061
|
+
returning *`, [tt.operativo, tt.enc])
|
|
2062
|
+
.fetchOneRowIfExists();
|
|
2063
|
+
if (resultBackup.rowCount) {
|
|
2064
|
+
tt.result_blanqueo += ` Se restableció el backup con fecha ${resultBackup.row.fecha_backup.toYmdHms()}.`;
|
|
2065
|
+
var { params: queryParams, setters } = (0, setters_rea_no_rea_1.getSettersAndParametersForReaNoReaResumenEstado)({
|
|
2066
|
+
tarea: tt.tarea,
|
|
2067
|
+
respuestasUAPrincipal: resultBackup.row.json_encuesta,
|
|
2068
|
+
setters: [],
|
|
2069
|
+
params: [tt.operativo, tt.enc, tt.tarea],
|
|
2070
|
+
destino: 'tareas_tem'
|
|
2071
|
+
});
|
|
2072
|
+
yield context.client.query(`update tareas_tem
|
|
2073
|
+
set ${setters.join(',')}
|
|
2074
|
+
where operativo= $1 and enc = $2 and tarea = $3
|
|
2075
|
+
returning 'ok'`, queryParams).fetchUniqueRow();
|
|
2076
|
+
yield simularGuardadoDeEncuestaDesdeAppEscritorio(context, resultBackup.row.operativo, resultBackup.row.enc, tt.tarea, resultBackup.row.json_encuesta);
|
|
2077
|
+
}
|
|
2078
|
+
}
|
|
2079
|
+
return tareasTemResult.rows;
|
|
2080
|
+
});
|
|
2081
|
+
}
|
|
2082
|
+
},
|
|
2083
|
+
{
|
|
2084
|
+
action: 'modo_dm_defecto_obtener',
|
|
2085
|
+
parameters: [],
|
|
2086
|
+
unlogged: true,
|
|
2087
|
+
coreFunction: function (context, _parameters) {
|
|
2088
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
2089
|
+
const { client } = context;
|
|
2090
|
+
const modoDmDefecto = (yield (client.query(`select modo_dm_defecto from parametros where unico_registro`, []).fetchUniqueValue())).value;
|
|
2091
|
+
return modoDmDefecto;
|
|
2092
|
+
});
|
|
2093
|
+
}
|
|
2094
|
+
}, {
|
|
2095
|
+
action: 'modo_app_get',
|
|
2096
|
+
parameters: [],
|
|
2097
|
+
unlogged: true,
|
|
2098
|
+
coreFunction: function (context, _parameters) {
|
|
2099
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
2100
|
+
const { be } = context;
|
|
2101
|
+
return (0, app_dmencu_1.getModoByPolicy)(be);
|
|
2102
|
+
});
|
|
2103
|
+
}
|
|
2104
|
+
},
|
|
2105
|
+
{
|
|
2106
|
+
action: 'operativo_migrar',
|
|
2107
|
+
parameters: [
|
|
2108
|
+
{ name: 'operativo_origen', typeName: 'text', references: 'operativos' },
|
|
2109
|
+
{ name: 'operativo_destino', typeName: 'text' },
|
|
2110
|
+
{ name: 'schema_name', typeName: 'text', label: 'nombre de schema' },
|
|
2111
|
+
],
|
|
2112
|
+
resultOk: 'download_sql',
|
|
2113
|
+
proceedLabel: 'migrar',
|
|
2114
|
+
roles: ['admin'],
|
|
2115
|
+
coreFunction: function (context, params) {
|
|
2116
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
2117
|
+
// 1. Consultamos las tablas base del origen (siempre tienen operativo)
|
|
2118
|
+
const baseTablesResult = yield Promise.all(['operativos', 'tareas', 'unidad_analisis', 'casilleros'].map((tableName) => __awaiter(this, void 0, void 0, function* () {
|
|
2119
|
+
return ({
|
|
2120
|
+
name: tableName,
|
|
2121
|
+
hasOperativo: true,
|
|
2122
|
+
result: yield context.client.query(`select * from ${context.be.db.quoteIdent(tableName)} where operativo = $1`, [params.operativo_origen]).fetchAll()
|
|
2123
|
+
});
|
|
2124
|
+
})));
|
|
2125
|
+
baseTablesResult.forEach((_, i) => baseTablesResult[i].result.rows.forEach(row => row.operativo = params.operativo_destino));
|
|
2126
|
+
//Chequeo y consulta de tablas reas (rea, no_rea, rea_sup, no_rea_sup)
|
|
2127
|
+
const optionalTables = ['rea', 'no_rea', 'rea_sup', 'no_rea_sup'];
|
|
2128
|
+
const tablesExistResult = yield context.client.query(`select table_name
|
|
2129
|
+
from information_schema.tables
|
|
2130
|
+
where table_schema = current_schema()
|
|
2131
|
+
and table_name = any($1)`, [optionalTables]).fetchAll();
|
|
2132
|
+
const existingOptionalTables = tablesExistResult.rows.map(r => r.table_name);
|
|
2133
|
+
const missingOptionalTables = optionalTables.filter(t => !existingOptionalTables.includes(t));
|
|
2134
|
+
const optionalTablesResult = yield Promise.all(existingOptionalTables.map((tableName) => __awaiter(this, void 0, void 0, function* () {
|
|
2135
|
+
const colsResult = yield context.client.query(`select column_name
|
|
2136
|
+
from information_schema.columns
|
|
2137
|
+
where table_schema = current_schema()
|
|
2138
|
+
and table_name = $1`, [tableName]).fetchAll();
|
|
2139
|
+
const hasOperativo = colsResult.rows.some(c => c.column_name === 'operativo');
|
|
2140
|
+
const queryStr = hasOperativo
|
|
2141
|
+
? `select * from ${context.be.db.quoteIdent(tableName)} where operativo = $1`
|
|
2142
|
+
: `select * from ${context.be.db.quoteIdent(tableName)}`;
|
|
2143
|
+
const queryParams = hasOperativo ? [params.operativo_origen] : [];
|
|
2144
|
+
const result = yield context.client.query(queryStr, queryParams).fetchAll();
|
|
2145
|
+
return {
|
|
2146
|
+
name: tableName,
|
|
2147
|
+
hasOperativo,
|
|
2148
|
+
result
|
|
2149
|
+
};
|
|
2150
|
+
})));
|
|
2151
|
+
optionalTablesResult.forEach(t => {
|
|
2152
|
+
if (t.hasOperativo) {
|
|
2153
|
+
t.result.rows.forEach(row => row.operativo = params.operativo_destino);
|
|
2154
|
+
}
|
|
2155
|
+
});
|
|
2156
|
+
// Combinamos base y opcionales encontradas
|
|
2157
|
+
const tablesResult = [...baseTablesResult, ...optionalTablesResult];
|
|
2158
|
+
const disableCasillerosFK = `
|
|
2159
|
+
ALTER TABLE ${context.be.db.quoteIdent(params.schema_name)}.casilleros DISABLE TRIGGER ALL;
|
|
2160
|
+
`;
|
|
2161
|
+
const enableCasillerosFK = `
|
|
2162
|
+
ALTER TABLE ${context.be.db.quoteIdent(params.schema_name)}.casilleros ENABLE TRIGGER ALL;
|
|
2163
|
+
`;
|
|
2164
|
+
const buildInserts = (query) => {
|
|
2165
|
+
let fields = [...query.result.fields];
|
|
2166
|
+
// Si la tabla de rea no tenía la columna operativo, la agregamos al insert
|
|
2167
|
+
if (query.hasOperativo === false && !fields.some((f) => f.name === 'operativo')) {
|
|
2168
|
+
fields.push({ name: 'operativo' });
|
|
2169
|
+
}
|
|
2170
|
+
return query.result.rows.map(row => {
|
|
2171
|
+
if (query.hasOperativo === false) {
|
|
2172
|
+
row.operativo = params.operativo_destino;
|
|
2173
|
+
}
|
|
2174
|
+
return 'insert into ' + context.be.db.quoteIdent(params.schema_name) + '.' + context.be.db.quoteIdent(query.name) +
|
|
2175
|
+
' (' + fields.map((f) => context.be.db.quoteIdent(f.name)).join(', ') + ')' +
|
|
2176
|
+
' values (' + fields.map((f) => context.be.db.quoteNullable(row[f.name])).join(', ') + ');';
|
|
2177
|
+
}).join('\n');
|
|
2178
|
+
};
|
|
2179
|
+
const opOrigenQ = context.be.db.quoteNullable(params.operativo_origen);
|
|
2180
|
+
const opDestinoQ = context.be.db.quoteNullable(params.operativo_destino);
|
|
2181
|
+
const defaultAreas = [
|
|
2182
|
+
1, 1400, 1410, 1420, 1430, 1440, 1450, 1460, 1470, 1480, 1490,
|
|
2183
|
+
1500, 1510, 1520, 1530, 1540, 7400, 7410, 7420, 7430, 7440,
|
|
2184
|
+
7450, 7460, 7470, 7480, 7490, 7500, 7510, 7520, 7530, 7540
|
|
2185
|
+
];
|
|
2186
|
+
// Avisos si alguna tabla opcional no existe en absoluto
|
|
2187
|
+
const noticesSql = missingOptionalTables.length > 0
|
|
2188
|
+
? "DO \$\$\nBEGIN\n" + missingOptionalTables.map(t => ` RAISE NOTICE 'La tabla "%" no existe en el origen, se omite.', '${t}';`).join("\n") + "\nEND \$\$;"
|
|
2189
|
+
: '';
|
|
2190
|
+
// 2. Bloque PL/pgSQL con validación y limpieza exclusiva en el camino por defecto
|
|
2191
|
+
const conditionalAreasTemSql = `
|
|
2192
|
+
DO $$
|
|
2193
|
+
DECLARE
|
|
2194
|
+
v_tiene_onda boolean;
|
|
2195
|
+
BEGIN
|
|
2196
|
+
-- Verificar si las 3 tablas tienen registros simultáneamente en el destino
|
|
2197
|
+
SELECT
|
|
2198
|
+
COALESCE((SELECT count(1) FROM areas WHERE operativo = ${opOrigenQ}), 0) > 0 AND
|
|
2199
|
+
COALESCE((SELECT count(1) FROM tareas_areas WHERE operativo = ${opOrigenQ}), 0) > 0 AND
|
|
2200
|
+
COALESCE((SELECT count(1) FROM tem WHERE operativo = ${opOrigenQ}), 0) > 0
|
|
2201
|
+
INTO v_tiene_onda;
|
|
2202
|
+
|
|
2203
|
+
IF v_tiene_onda THEN
|
|
2204
|
+
-- --- CAMINO A: El destino TIENE onda anterior completa ---
|
|
2205
|
+
INSERT INTO areas (operativo, area)
|
|
2206
|
+
SELECT ${opDestinoQ} AS operativo, area
|
|
2207
|
+
FROM areas WHERE operativo = ${opOrigenQ};
|
|
2208
|
+
|
|
2209
|
+
INSERT INTO tareas_areas (operativo, tarea, area)
|
|
2210
|
+
SELECT ${opDestinoQ} AS operativo, tarea, area
|
|
2211
|
+
FROM tareas_areas WHERE operativo = ${opOrigenQ};
|
|
2212
|
+
|
|
2213
|
+
INSERT INTO tem (operativo, area, enc, dominio, habilitada)
|
|
2214
|
+
SELECT ${opDestinoQ} AS operativo, area, (area || enc::text) enc,
|
|
2215
|
+
CASE WHEN encs.enc < 106 THEN 3 ELSE 5 END AS dominio, TRUE AS habilitada
|
|
2216
|
+
FROM areas
|
|
2217
|
+
JOIN (SELECT generate_series(100, 110) enc) encs ON true
|
|
2218
|
+
WHERE areas.operativo = ${opOrigenQ};
|
|
2219
|
+
ELSE
|
|
2220
|
+
-- --- CAMINO B: Alguna tabla está vacía o incompleta (Limpiamos e insertamos por defecto) ---
|
|
2221
|
+
DELETE FROM tem WHERE operativo = ${opDestinoQ};
|
|
2222
|
+
DELETE FROM tareas_areas WHERE operativo = ${opDestinoQ};
|
|
2223
|
+
DELETE FROM areas WHERE operativo = ${opDestinoQ};
|
|
2224
|
+
|
|
2225
|
+
INSERT INTO areas (operativo, area) VALUES
|
|
2226
|
+
${defaultAreas.map(a => `(${opDestinoQ},${context.be.db.quoteNullable(a)})`).join(', ')};
|
|
2227
|
+
|
|
2228
|
+
INSERT INTO tareas_areas(operativo, tarea, area)
|
|
2229
|
+
SELECT *
|
|
2230
|
+
FROM (
|
|
2231
|
+
SELECT ${opDestinoQ} AS operativo, t.tarea, area
|
|
2232
|
+
FROM areas a, (
|
|
2233
|
+
SELECT t.operativo, t.tarea
|
|
2234
|
+
FROM tareas t
|
|
2235
|
+
) t
|
|
2236
|
+
WHERE a.operativo = ${opDestinoQ}
|
|
2237
|
+
AND t.operativo = ${opDestinoQ}
|
|
2238
|
+
) n
|
|
2239
|
+
ORDER BY 1, 2, 3;
|
|
2240
|
+
INSERT INTO tem (operativo, area, enc, dominio, habilitada)
|
|
2241
|
+
SELECT ${opDestinoQ} AS operativo, area, (area || enc::text) enc,
|
|
2242
|
+
CASE WHEN encs.enc < 106 THEN 3 ELSE 5 END AS dominio, TRUE AS habilitada
|
|
2243
|
+
FROM areas
|
|
2244
|
+
JOIN (SELECT generate_series(100, 110) enc) encs ON true
|
|
2245
|
+
WHERE areas.operativo = ${opDestinoQ};
|
|
2246
|
+
END IF;
|
|
2247
|
+
END $$;
|
|
2248
|
+
`;
|
|
2249
|
+
const deletes = `
|
|
2250
|
+
--deletes if necessary
|
|
2251
|
+
--delete from tareas_areas where operativo = ${opDestinoQ};
|
|
2252
|
+
--delete from casilleros where operativo = ${opDestinoQ};
|
|
2253
|
+
--delete from unidad_analisis where operativo = ${opDestinoQ};
|
|
2254
|
+
--delete from tareas_tem where operativo = ${opDestinoQ};
|
|
2255
|
+
--delete from tem where operativo = ${opDestinoQ};
|
|
2256
|
+
--delete from areas where operativo = ${opDestinoQ};
|
|
2257
|
+
--delete from tareas where operativo = ${opDestinoQ};
|
|
2258
|
+
--delete from operativos where operativo = ${opDestinoQ};
|
|
2259
|
+
--delete from rea where operativo = ${opDestinoQ};
|
|
2260
|
+
--delete from no_rea where operativo = ${opDestinoQ};
|
|
2261
|
+
--delete from rea_sup where operativo = ${opDestinoQ};
|
|
2262
|
+
--delete from no_rea_sup where operativo = ${opDestinoQ};
|
|
2263
|
+
`;
|
|
2264
|
+
const sql = `set search_path = "${params.schema_name}";` + `\n\n`
|
|
2265
|
+
+ disableCasillerosFK
|
|
2266
|
+
+ noticesSql
|
|
2267
|
+
+ '\n\n'
|
|
2268
|
+
+ tablesResult.map(query => buildInserts(query)).join('\n\n')
|
|
2269
|
+
+ '\n\n' + conditionalAreasTemSql
|
|
2270
|
+
+ '\n\n' + enableCasillerosFK
|
|
2271
|
+
+ '\n\n' + deletes;
|
|
2272
|
+
return sql;
|
|
2273
|
+
});
|
|
2274
|
+
}
|
|
2275
|
+
},
|
|
2276
|
+
{
|
|
2277
|
+
action: 'encuesta_capa_a_prod_pasar',
|
|
2278
|
+
parameters: [
|
|
2279
|
+
{ name: 'operativo', typeName: 'text', references: 'operativos' },
|
|
2280
|
+
{ name: 'enc', typeName: 'text' },
|
|
2281
|
+
],
|
|
2282
|
+
roles: ['admin'],
|
|
2283
|
+
coreFunction: function (context, parameters) {
|
|
2284
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
2285
|
+
(yield context.client.query(`update tem
|
|
2286
|
+
set enc_autogenerado_dm = enc_autogenerado_dm_capa, enc_autogenerado_dm_capa = null
|
|
2287
|
+
where operativo = $1 and enc = $2 and enc_autogenerado_dm_capa is not null
|
|
2288
|
+
returning *`, [parameters.operativo, parameters.enc]).fetchUniqueRow()).row;
|
|
2289
|
+
return `se movió la encuesta ${parameters.enc} a producción`;
|
|
2290
|
+
});
|
|
2291
|
+
}
|
|
2292
|
+
}
|
|
2293
|
+
];
|
|
2294
|
+
});
|
|
2295
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2VkdXJlcy1kbWVuY3UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmVyL3Byb2NlZHVyZXMtZG1lbmN1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQUEsWUFBWSxDQUFDOzs7SUFxTWIsOENBZUM7SUFJRCxnRkF3QkM7SUFrTUQsd0RBYUM7SUFrREQsb0RBaUNDO0lBOWdCRCxrQ0FBbUM7SUFDbkMsaURBQStCO0lBSy9CLHlEQUE0RDtJQUU1RCwrQ0FBd0Q7SUFDeEQsMkJBQW9DO0lBRXBDLGdEQUFnRDtJQUdoRCx5REFBd0Q7SUFDeEQscUNBQWdDO0lBRWhDLDJDQUFrRDtJQUNsRCw2Q0FBK0M7SUFDL0MsNkRBQXFHO0lBRXJHLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQixJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFcEMsSUFBSSxZQUFZLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRTNDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQztJQUU3QixNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztJQUNuQyxNQUFNLHlCQUF5QixHQUFHLEdBQUcsQ0FBQztJQUN0QyxNQUFNLHdCQUF3QixHQUFHLFFBQVEsQ0FBQztJQUMxQyxNQUFNLDJCQUEyQixHQUFHLFdBQVcsQ0FBQztJQUNoRCxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFJMUIsSUFBSSxlQUFnQyxDQUFDO0lBQ3JDLElBQUksY0FBYyxHQUFHLEdBQUcsQ0FBQTtJQUVqQixNQUFNLGtCQUFrQixHQUFHLENBQUMsR0FBb0IsRUFBRSxFQUFFLENBQ3ZELGVBQWUsR0FBRyxHQUFHLENBQUM7SUFEYixRQUFBLGtCQUFrQixzQkFDTDtJQUVuQixNQUFNLGdCQUFnQixHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FD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QUV2QixPQUFPLEdBQUcsQ0FBQztnQkFDZixDQUFDO2FBQUE7U0FDSjtRQUNEO1lBQ0ksTUFBTSxFQUFFLDRCQUE0QjtZQUNwQyxVQUFVLEVBQUU7Z0JBQ1IsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRTtnQkFDakUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUU7YUFDcEM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDaEIsWUFBWSxFQUFFLFVBQWdCLE9BQXlCLEVBQUUsVUFBMkU7O29CQUNoSSxDQUFDLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ3ZCOzs7Z0NBR2dCLEVBQ2hCLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQ3pDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBRXhCLE9BQU8sd0JBQXdCLFVBQVUsQ0FBQyxHQUFHLGVBQWUsQ0FBQztnQkFDakUsQ0FBQzthQUFBO1NBQ0o7S0FDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XHJcblxyXG5pbXBvcnQgeyBQcm9jZWR1cmVEZWYsIFRhYmxlRGVmaW5pdGlvbiwgQ2xpZW50LCBUYWJsZURlZmluaXRpb25zLCBBcHBCYWNrZW5kIH0gZnJvbSBcIi4vdHlwZXMtZG1lbmN1XCI7XHJcbmltcG9ydCB7IFByb2NlZHVyZUNvbnRleHQsIENvcmVGdW5jdGlvblBhcmFtZXRlcnMsIEZvcmVpZ25LZXkgfSBmcm9tIFwibWV0YS1lbmNcIjtcclxuaW1wb3J0IGxpa2VBciA9IHJlcXVpcmUoXCJsaWtlLWFyXCIpO1xyXG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy1kbWVuY3VcIjtcclxuaW1wb3J0IHsgSWRVbmlkYWRBbmFsaXNpcywgVW5pZGFkQW5hbGlzaXMsIEVzdGFkb0FjY2lvbiwgSWRFbmMsIElkVGFyZWEsIFJlc3B1ZXN0YXNSYWl6LCBJZE9wZXJhdGl2bywgSWRDYXJnYSwgTW9kb0RNLCBSZWEsIE5vUmVhLCBOb1JlYVN1cCwgUmVhU3VwLCBSZXN1bHRhZG9SZXN1bWVuIH0gZnJvbSBcIi4uL3VubG9nZ2VkL3RpcG9zXCI7XHJcblxyXG5pbXBvcnQgeyBPcGVyYXRpdm9HZW5lcmF0b3IgfSBmcm9tIFwicHJvY2VzYW1pZW50b1wiO1xyXG5cclxuaW1wb3J0IHsganNvbiwganNvbm8sIFJlc3VsdFJvd3MgfSBmcm9tIFwicGctcHJvbWlzZS1zdHJpY3RcIjtcclxuXHJcbmltcG9ydCB7IGNoYW5naW5nLCBkYXRlLCBjb2FsZXNjZSB9IGZyb20gJ2Jlc3QtZ2xvYmFscyc7XHJcbmltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSBcImZzXCI7XHJcblxyXG5pbXBvcnQgKiBhcyBFeHByZXNpb25QYXJzZXIgZnJvbSAnZXhwcmUtcGFyc2VyJztcclxuaW1wb3J0IHsgdGFyZWFzIH0gZnJvbSBcIi4vdGFibGUtdGFyZWFzXCI7XHJcbmltcG9ydCB7IHByZXBlbmRMaXN0ZW5lciB9IGZyb20gXCJwcm9jZXNzXCI7XHJcbmltcG9ydCB7IGdldERpYXNBUGFzYXJRdWVyeSB9IGZyb20gXCIuL3RhYmxlLXRhcmVhc190ZW1cIjtcclxuaW1wb3J0IHsgZXJyb3IgfSBmcm9tIFwiY29uc29sZVwiO1xyXG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcInZtXCI7XHJcbmltcG9ydCB7IGV4cGVjdGVkLCB1bmV4cGVjdGVkIH0gZnJvbSBcImNhc3QtZXJyb3JcIjtcclxuaW1wb3J0IHsgZ2V0TW9kb0J5UG9saWN5IH0gZnJvbSBcIi4vYXBwLWRtZW5jdVwiO1xyXG5pbXBvcnQgeyBnZXRTZXR0ZXJzQW5kUGFyYW1ldGVyc0ZvclJlYU5vUmVhUmVzdW1lbkVzdGFkbywgUGFyYW1ldHJvU3FsIH0gZnJvbSBcIi4vc2V0dGVycy1yZWEtbm8tcmVhXCI7XHJcblxyXG52YXIgUGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcclxudmFyIHNxbFRvb2xzID0gcmVxdWlyZSgnc3FsLXRvb2xzJyk7XHJcblxyXG52YXIgZGlzY3JlcGFuY2VzID0gcmVxdWlyZSgnZGlzY3JlcGFuY2VzJyk7XHJcblxyXG5jb25zdCBmb3JtUHJpbmNpcGFsID0gJ0Y6RjEnO1xyXG5cclxuY29uc3QgRVNUQURPX1BPU1RFUklPUl9DQVJHQSA9ICdDJztcclxuY29uc3QgRVNUQURPX1BPU1RFUklPUl9ERVNDQVJHQSA9ICdEJztcclxuY29uc3QgT1BFUkFDSU9OX1BSRVBBUkFSX0NBUkdBID0gJ2Nhcmdhcic7XHJcbmNvbnN0IE9QRVJBQ0lPTl9QUkVQQVJBUl9ERVNDQVJHQSA9ICdkZXNjYXJnYXInO1xyXG5jb25zdCBERUZBVUxUX0RPTUlOSU8gPSAzO1xyXG5cclxuZXhwb3J0IHR5cGUgZ2VuZXJhcklkRW5jRnVuID0gKGFyZWE6IG51bWJlciwgaW5kZXg6IG51bWJlcikgPT4gSWRFbmNcclxuXHJcbnZhciBnZW5lcmFySWRFbmNGdW46IGdlbmVyYXJJZEVuY0Z1bjtcclxudmFyIG1heEFFbmNQb3JBcmVhID0gOTk5XHJcblxyXG5leHBvcnQgY29uc3Qgc2V0R2VuZXJhcklkRW5jRnVuID0gKGZ1bjogZ2VuZXJhcklkRW5jRnVuKSA9PlxyXG4gICAgZ2VuZXJhcklkRW5jRnVuID0gZnVuO1xyXG5cclxuZXhwb3J0IGNvbnN0IHNldE1heEVuY1BvckFyZWEgPSAobWF4OiBudW1iZXIpID0+XHJcbiAgICBtYXhBRW5jUG9yQXJlYSA9IG1heDtcclxuXHJcbnNldEdlbmVyYXJJZEVuY0Z1bigoYXJlYTogbnVtYmVyLCBudW1FbmM6IG51bWJlcikgPT4gYXJlYS50b1N0cmluZygpICsgbnVtRW5jLnRvU3RyaW5nKCkucGFkU3RhcnQobWF4QUVuY1BvckFyZWEudG9TdHJpbmcoKS5sZW5ndGgsICcwJykgYXMgdW5rbm93biBhcyBJZEVuYyk7XHJcblxyXG5zZXRNYXhFbmNQb3JBcmVhKDk5OSk7XHJcblxyXG5hc3luYyBmdW5jdGlvbiBnZW5lcmFyTnVldm9JZEVuYyhjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBhcmVhOiBudW1iZXIsIG1heEFFbmNQb3JBcmVhOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHNpZ3VpZW50ZU51bWVyb0VuY3Vlc3RhID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICBTRUxFQ1Qgb2J0ZW5lcl9zaWd1aWVudGVfY29udGFkb3JfYXJlYSgkMSwkMiwkMykgQVMgbmV4dF9jb3VudGVyO1xyXG4gICAgYCwgW29wZXJhdGl2bywgYXJlYSwgbWF4QUVuY1BvckFyZWFdKS5mZXRjaFVuaXF1ZVZhbHVlKCkpLnZhbHVlO1xyXG4gICAgcmV0dXJuIGdlbmVyYXJJZEVuY0Z1bihhcmVhLCBzaWd1aWVudGVOdW1lcm9FbmN1ZXN0YSk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRPcGVyYXRpdm9BY3R1YWwgPSBhc3luYyAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCkgPT4ge1xyXG4gICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgIHZhciBvcGVyYXRpdm8gPSAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgYHNlbGVjdCBvcGVyYXRpdm9cclxuICAgICAgICAgICAgZnJvbSBwYXJhbWV0cm9zXHJcbiAgICAgICAgICAgIHdoZXJlIHVuaWNvX3JlZ2lzdHJvYFxyXG4gICAgICAgICwgW11cclxuICAgICkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZVxyXG4gICAgaWYgKG9wZXJhdGl2bykge1xyXG4gICAgICAgIHJldHVybiBvcGVyYXRpdm9cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ25vIHNlIGNvbmZpZ3Vyw7MgdW4gb3BlcmF0aXZvIGVuIGxhIHRhYmxhIHBhcsOhbWV0cm9zJyk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5hc3luYyBmdW5jdGlvbiBnZXREZWZhdWx0VGFyZWEoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bykge1xyXG4gICAgcmV0dXJuIChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgc2VsZWN0ICogXHJcbiAgICAgICAgICAgIGZyb20gdGFyZWFzIFxyXG4gICAgICAgICAgICB3aGVyZSBlc19pbmljaWFsIGFuZCBvcGVyYXRpdm8gPSAkMVxyXG4gICAgYCwgW29wZXJhdGl2b10pLmZldGNoVW5pcXVlUm93KCkpLnJvdztcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0T3BlcmF0aXZvUGVybWl0ZUdlbmVyYXJNdWVzdHJhKGNsaWVudDogQ2xpZW50LCBvcGVyYXRpdm86IElkT3BlcmF0aXZvKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gKGF3YWl0IGNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgc2VsZWN0IHBlcm1pdGVfZ2VuZXJhcl9tdWVzdHJhIFxyXG4gICAgICAgICAgICBmcm9tIG9wZXJhdGl2b3MgXHJcbiAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxXHJcbiAgICBgLCBbb3BlcmF0aXZvXSkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gcGVyc2lzdGlyRW5jdWVzdGFBdXRvZ2VuZXJhZGFFbkRNKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIE9QRVJBVElWTzogSWRPcGVyYXRpdm8sIGFyZWE6IG51bWJlciwgZW5jQXV0b2dlbmVyYWRvRG06IHN0cmluZywgdG9rZW46IHN0cmluZywgcmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6LCByZWNlcGNpb25pc3RhOiBzdHJpbmcsIGFzaWduYWRvOiBzdHJpbmcsIG1vZG9fZG06IE1vZG9ETSwgY2FtYmlhX21vZG9fZG06IGJvb2xlYW4pOiBQcm9taXNlPElkRW5jPiB7XHJcbiAgICBsZXQgaWRFbmMgPSBudWxsO1xyXG4gICAgdmFyIHBlcm1pdGVfZ2VuZXJhcl9tdWVzdHJhID0gYXdhaXQgZ2V0T3BlcmF0aXZvUGVybWl0ZUdlbmVyYXJNdWVzdHJhKGNvbnRleHQuY2xpZW50LCBPUEVSQVRJVk8pO1xyXG4gICAgaWYgKHBlcm1pdGVfZ2VuZXJhcl9tdWVzdHJhKSB7XHJcbiAgICAgICAgY29uc3QgYXV0b2dlbmVyYWRvRmllbGQgPSBtb2RvX2RtID09ICdwcm9kdWMnID8gJ2VuY19hdXRvZ2VuZXJhZG9fZG0nIDogJ2VuY19hdXRvZ2VuZXJhZG9fZG1fY2FwYSc7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0VXBkYXRlID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICBVUERBVEUgdGVtIFxyXG4gICAgICAgICAgICAgICAgc2V0IChqc29uX2JhY2t1cCwganNvbl9lbmN1ZXN0YSwgZmVjaGFfYmFja3VwKSA9IFxyXG4gICAgICAgICAgICAgICAgICAgICgkNCwgJDUsIGN1cnJlbnRfdGltZXN0YW1wKVxyXG4gICAgICAgICAgICAgICAgd2hlcmUgKG9wZXJhdGl2byA9ICQxIGFuZCAke2NvbnRleHQuYmUuZGIucXVvdGVJZGVudChhdXRvZ2VuZXJhZG9GaWVsZCl9ID0gJDIgYW5kIHRva2VuX2F1dG9nZW5lcmFkb19kbSA9ICQzKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuaW5nICpcclxuICAgICAgICBgLCBbT1BFUkFUSVZPLCBlbmNBdXRvZ2VuZXJhZG9EbSwgdG9rZW4sIHJlc3B1ZXN0YXNSYWl6LCByZXNwdWVzdGFzUmFpel0pLmZldGNoT25lUm93SWZFeGlzdHMoKTtcclxuICAgICAgICAvLyBoYWdvIGluc2VydCBwb3JxdWUgbm8gZXhpc3RlIGVuIHRlbVxyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRUYXJlYSA9IGF3YWl0IGdldERlZmF1bHRUYXJlYShjb250ZXh0LCBPUEVSQVRJVk8pO1xyXG4gICAgICAgIGlmIChyZXN1bHRVcGRhdGUucm93Q291bnQgPT0gMCkge1xyXG4gICAgICAgICAgICBpZEVuYyA9IGF3YWl0IGdlbmVyYXJOdWV2b0lkRW5jKGNvbnRleHQsIE9QRVJBVElWTywgYXJlYSwgbWF4QUVuY1BvckFyZWEpXHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIElOU0VSVCBpbnRvIHRlbSAoXHJcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgICAgIGVuYyxcclxuICAgICAgICAgICAgICAgICAgICBhcmVhLFxyXG4gICAgICAgICAgICAgICAgICAgIGRvbWluaW8sXHJcbiAgICAgICAgICAgICAgICAgICAgaGFiaWxpdGFkYSxcclxuICAgICAgICAgICAgICAgICAgICAke2NvbnRleHQuYmUuZGIucXVvdGVJZGVudChhdXRvZ2VuZXJhZG9GaWVsZCl9LFxyXG4gICAgICAgICAgICAgICAgICAgIHRva2VuX2F1dG9nZW5lcmFkb19kbSxcclxuICAgICAgICAgICAgICAgICAgICB0YXJlYV9hY3R1YWwsXHJcbiAgICAgICAgICAgICAgICAgICAganNvbl9iYWNrdXAsXHJcbiAgICAgICAgICAgICAgICAgICAganNvbl9lbmN1ZXN0YSwgXHJcbiAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFja3VwXHJcbiAgICAgICAgICAgICAgICApIFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcyAoJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgJDcsICQ4LCAkOSwgJDEwLCBjdXJyZW50X3RpbWVzdGFtcClcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICBgLCBbXHJcbiAgICAgICAgICAgICAgICBPUEVSQVRJVk8sXHJcbiAgICAgICAgICAgICAgICBpZEVuYyxcclxuICAgICAgICAgICAgICAgIGFyZWEsXHJcbiAgICAgICAgICAgICAgICBERUZBVUxUX0RPTUlOSU8sXHJcbiAgICAgICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICAgICAgZW5jQXV0b2dlbmVyYWRvRG0sXHJcbiAgICAgICAgICAgICAgICB0b2tlbixcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRUYXJlYS50YXJlYSxcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNSYWl6LFxyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1JhaXosXHJcbiAgICAgICAgICAgIF0pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWRFbmMgPSByZXN1bHRVcGRhdGUucm93LmVuY1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCBnZW5lcmFyVGFyZWFzVGVtRmFsdGFudGVzKGNvbnRleHQsIE9QRVJBVElWTyk7XHJcbiAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICB1cGRhdGUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgc2V0IHJlY2VwY2lvbmlzdGEgPSAkNCwgYXNpZ25hZG8gPSAkNVxyXG4gICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhID0gJDNcclxuICAgICAgICAgICAgcmV0dXJuaW5nICpcclxuICAgICAgICBgLCBbT1BFUkFUSVZPLCBpZEVuYywgZGVmYXVsdFRhcmVhLnRhcmVhLCByZWNlcGNpb25pc3RhLCBhc2lnbmFkb10pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICB1cGRhdGUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgc2V0IGNhcmdhZG9fZG0gPSAkNCwgZXN0YWRvID0gJDUsIG9wZXJhY2lvbiA9ICQ2XHJcbiAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBlbmMgPSAkMiBhbmQgdGFyZWEgPSAkM1xyXG4gICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgIGAsIFtPUEVSQVRJVk8sIGlkRW5jLCBkZWZhdWx0VGFyZWEudGFyZWEsIHRva2VuLCBFU1RBRE9fUE9TVEVSSU9SX0NBUkdBLCBjYW1iaWFfbW9kb19kbSA/IG51bGwgOiBPUEVSQUNJT05fUFJFUEFSQVJfQ0FSR0FdXHJcbiAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlkRW5jXHJcbn1cclxuXHJcbi8qZGVmaW5pY2nDs24gZGUgZXN0cnVjdHVyYSBjb21wbGV0YSwgY3VhbmRvIGV4aXN0YSBpbmctZW5jIGhheSBxdWUgcG9uZXJsbyBhaMOtKi9cclxudHlwZSBFc3RydWN0dXJhVGFibGEgPSB7IHRhYmxlTmFtZTogc3RyaW5nLCBwa0ZpZWxkczogeyBmaWVsZE5hbWU6IHN0cmluZyB9W10sIGNoaWxkVGFibGVzOiBFc3RydWN0dXJhVGFibGFbXSB9O1xyXG5mdW5jdGlvbiBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgdGFibGVOYW1lOiBzdHJpbmcpIHtcclxuICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICB2YXIgbWFpblRhYmxlRGVmOiBUYWJsZURlZmluaXRpb24gPSBiZS50YWJsZVN0cnVjdHVyZXNbdGFibGVOYW1lXShjb250ZXh0KTtcclxuICAgIHZhciBnZXRQa0Zyb21UYWJsZURlZiA9IGZ1bmN0aW9uIGdldFBrRnJvbVRhYmxlRGVmKHRhYmxlRGVmOiBUYWJsZURlZmluaXRpb24pIHtcclxuICAgICAgICByZXR1cm4gdGFibGVEZWYucHJpbWFyeUtleS5tYXAoZnVuY3Rpb24gKHBrKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IGZpZWxkTmFtZTogcGsgfTtcclxuICAgICAgICB9KVxyXG4gICAgfTtcclxuICAgIHZhciBnZXRGa0Zyb21UYWJsZURlZiA9IGZ1bmN0aW9uIGdldEZrRnJvbVRhYmxlRGVmKHRhYmxlRGVmOiBUYWJsZURlZmluaXRpb24sIHBhcmVudFRhYmxlTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHBhcmVudEZrID0gKDxGb3JlaWduS2V5W10+dGFibGVEZWYuZm9yZWlnbktleXMpLmZpbmQoZmsgPT4gZmsucmVmZXJlbmNlcyA9PSBwYXJlbnRUYWJsZU5hbWUpO1xyXG4gICAgICAgIHJldHVybiBwYXJlbnRGayA/IHBhcmVudEZrLmZpZWxkcyA6IFtdO1xyXG4gICAgfVxyXG4gICAgdmFyIHN0cnVjdDogRXN0cnVjdHVyYVRhYmxhID0ge1xyXG4gICAgICAgIHRhYmxlTmFtZTogbWFpblRhYmxlRGVmLm5hbWUsXHJcbiAgICAgICAgcGtGaWVsZHM6IGdldFBrRnJvbVRhYmxlRGVmKG1haW5UYWJsZURlZiksXHJcbiAgICAgICAgY2hpbGRUYWJsZXM6IFtdXHJcbiAgICB9O1xyXG4gICAgaWYgKG1haW5UYWJsZURlZi5kZXRhaWxUYWJsZXMgJiYgbWFpblRhYmxlRGVmLmRldGFpbFRhYmxlcy5sZW5ndGgpIHtcclxuICAgICAgICBtYWluVGFibGVEZWYuZGV0YWlsVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKGRldGFpbFRhYmxlKSB7XHJcbiAgICAgICAgICAgIGlmIChkZXRhaWxUYWJsZS50YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgc3RydWN0LmNoaWxkVGFibGVzLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdpbmcoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN0cnVjdHVyZShjb250ZXh0LCBkZXRhaWxUYWJsZS50YWJsZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZmtGaWVsZHM6IGdldEZrRnJvbVRhYmxlRGVmKGJlLnRhYmxlU3RydWN0dXJlc1tkZXRhaWxUYWJsZS50YWJsZV0oY29udGV4dCksIHRhYmxlTmFtZSkgfVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cnVjdDtcclxufVxyXG4vKiBmaW4gZGVmaW5pY2lvbiBlc3RydWN0dXJhIGNvbXBsZXRhICovXHJcblxyXG50eXBlIEFueU9iamVjdCA9IHsgW2s6IHN0cmluZ106IGFueSB9XHJcblxyXG5cclxuZXhwb3J0IHR5cGUgQ29uc3VsdGFTcWwgPSB7IHNxbDogc3RyaW5nLCBwYXJhbXM6IFBhcmFtZXRyb1NxbFtdIH07XHJcblxyXG4vLyBncmFiYSBlbiBsYSBURU0gbGEgZW5jdWVzdGEgeSBlbCByZXN1bHRhZG8gY2FsY3VsYWRvIChyZXN1bWVuLCByZWEgeSBubyByZWE7IG8gc3VzIHZlcnNpb25lcyBfc3VwIHNpIGxhIHRhcmVhIGVzIHN1cGUpXHJcbmV4cG9ydCBmdW5jdGlvbiBjb25zdWx0YVVwZGF0ZVRlbTxSIGV4dGVuZHMgUmVzdWx0YWRvUmVzdW1lbj4ob3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgaWRFbmM6IHN0cmluZywgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsOiBSLCB0YXJlYTogSWRUYXJlYSk6IENvbnN1bHRhU3FsIHtcclxuICAgIHZhciB7IHBhcmFtcywgc2V0dGVycyB9ID0gZ2V0U2V0dGVyc0FuZFBhcmFtZXRlcnNGb3JSZWFOb1JlYVJlc3VtZW5Fc3RhZG8oe1xyXG4gICAgICAgIHRhcmVhLFxyXG4gICAgICAgIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCxcclxuICAgICAgICBzZXR0ZXJzOiBbYGpzb25fZW5jdWVzdGEgPSAkM2AsIGBmZWNoYV9tb2RpZl9lbmN1ZXN0YSA9IGN1cnJlbnRfdGltZXN0YW1wYF0sXHJcbiAgICAgICAgcGFyYW1zOiBbb3BlcmF0aXZvLCBpZEVuYywgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsXSxcclxuICAgICAgICBkZXN0aW5vOiAndGVtJ1xyXG4gICAgfSlcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgc3FsOiBgdXBkYXRlIHRlbVxyXG4gICAgICAgICAgICBzZXQgJHtzZXR0ZXJzLmpvaW4oJywnKX1cclxuICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgcmV0dXJuaW5nICdvaydgLFxyXG4gICAgICAgIHBhcmFtc1xyXG4gICAgfTtcclxufVxyXG5cclxuLy8gY3VhbmRvIGVsIGRpc3Bvc2l0aXZvIGRldnVlbHZlIGxhIGVuY3Vlc3RhOiBwYXNhIGxhIHRhcmVhIGEgZGVzY2FyZ2FkYSB5IGd1YXJkYSBlbCByZXN1bHRhZG8gY2FsY3VsYWRvIGVuIGVsIGRpc3Bvc2l0aXZvIChkbV8qKTtcclxuLy8gc8OzbG8gc2kgbGEgZW5jdWVzdGEgc2lndWUgY2FyZ2FkYSBjb24gZWwgdG9rZW4gZGVsIGRpc3Bvc2l0aXZvXHJcbmV4cG9ydCBmdW5jdGlvbiBjb25zdWx0YVVwZGF0ZVRhcmVhc1RlbVBvckRlc2NhcmdhPFIgZXh0ZW5kcyBSZXN1bHRhZG9SZXN1bWVuPihvcHRzOiB7XHJcbiAgICBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBpZEVuYzogc3RyaW5nLCB0YXJlYTogSWRUYXJlYSwgdG9rZW46IHN0cmluZyxcclxuICAgIHJlc3B1ZXN0YXNVQVByaW5jaXBhbDogUiwgcGFzYUFEZXNjYXJnYXI6IGJvb2xlYW5cclxufSk6IENvbnN1bHRhU3FsIHtcclxuICAgIHZhciB7IHBhcmFtcywgc2V0dGVycyB9ID0gZ2V0U2V0dGVyc0FuZFBhcmFtZXRlcnNGb3JSZWFOb1JlYVJlc3VtZW5Fc3RhZG8oe1xyXG4gICAgICAgIHRhcmVhOiBvcHRzLnRhcmVhLFxyXG4gICAgICAgIHJlc3B1ZXN0YXNVQVByaW5jaXBhbDogb3B0cy5yZXNwdWVzdGFzVUFQcmluY2lwYWwsXHJcbiAgICAgICAgc2V0dGVyczogW1xyXG4gICAgICAgICAgICBgZXN0YWRvID0gJyR7RVNUQURPX1BPU1RFUklPUl9ERVNDQVJHQX0nYCxcclxuICAgICAgICAgICAgYGNhcmdhZG9fZG09bnVsbGBcclxuICAgICAgICBdLFxyXG4gICAgICAgIHBhcmFtczogW29wdHMub3BlcmF0aXZvLCBvcHRzLmlkRW5jLCBvcHRzLnRhcmVhLCBvcHRzLnRva2VuXSxcclxuICAgICAgICBkZXN0aW5vOiAndGFyZWFzX3RlbSdcclxuICAgIH0pXHJcbiAgICBpZiAob3B0cy5wYXNhQURlc2Nhcmdhcikge1xyXG4gICAgICAgIHNldHRlcnMucHVzaChgb3BlcmFjaW9uID0gJyR7T1BFUkFDSU9OX1BSRVBBUkFSX0RFU0NBUkdBfSdgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgc3FsOiBgdXBkYXRlIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgIHNldCAke3NldHRlcnMuam9pbignLCcpfVxyXG4gICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhID0gJDMgYW5kIGNhcmdhZG9fZG0gPSAkNFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuaW5nICdvaydgLFxyXG4gICAgICAgIHBhcmFtc1xyXG4gICAgfTtcclxufVxyXG5cclxuLy8gbG8gcXVlIGd1YXJkYXJFbmN1ZXN0YUVuVGVtIHVzYSBkZWwgY2xpZW50ZSBkZSBiYXNlIChlbCBDbGllbnQgZGUgcGctcHJvbWlzZS1zdHJpY3QgbG8gY3VtcGxlKVxyXG5leHBvcnQgdHlwZSBDbGllbnRlUGFyYVRlbSA9IHtcclxuICAgIHF1ZXJ5KHNxbDogc3RyaW5nLCBwYXJhbXM6IFBhcmFtZXRyb1NxbFtdKTogeyBmZXRjaFVuaXF1ZVJvdygpOiBQcm9taXNlPHsgcm93Q291bnQ6IG51bWJlciB8IG51bGwgfT4gfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIGd1YXJkYXJFbmN1ZXN0YUVuVGVtID0gYXN5bmMgPFIgZXh0ZW5kcyBSZXN1bHRhZG9SZXN1bWVuPihjb250ZXh0OiB7IGNsaWVudDogQ2xpZW50ZVBhcmFUZW0gfSwgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgaWRFbmM6IHN0cmluZywgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsOiBSLCB0YXJlYTogSWRUYXJlYSkgPT4ge1xyXG4gICAgdmFyIHsgc3FsLCBwYXJhbXMgfSA9IGNvbnN1bHRhVXBkYXRlVGVtKG9wZXJhdGl2bywgaWRFbmMsIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCwgdGFyZWEpO1xyXG4gICAgcmV0dXJuIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KHNxbCwgcGFyYW1zKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiByZWdpc3RyYXJQYXNlVGFibGEoXHJcbiAgICBjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LFxyXG4gICAgb3BlcmF0aXZvOiBJZE9wZXJhdGl2byxcclxuICAgIGlkRW5jOiBzdHJpbmcgfCBudW1iZXIsXHJcbiAgICByZXNwdWVzdGFzVUFQcmluY2lwYWw6IGFueVxyXG4pIHtcclxuICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICB2YXIgcHJvY2VkdXJlR3VhcmRhciA9IGJlLnByb2NlZHVyZS5jYXNvX2d1YXJkYXI7XHJcbiAgICBsZXQgcmVzdWx0YWRvID0gYGlkIGVuYyAke2lkRW5jfTogYDtcclxuICAgIGxldCBwYXJhbV9ndWFyZGFyID0geyBvcGVyYXRpdm86IG9wZXJhdGl2bywgaWRfY2FzbzogaWRFbmMsIGRhdG9zX2Nhc286IHJlc3B1ZXN0YXNVQVByaW5jaXBhbCB9O1xyXG4gICAgbGV0IHNhdmVwb2ludE5hbWUgPSBgc3BfZ3VhcmRhcl8ke2lkRW5jfWAucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCAnXycpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFNBVkVQT0lOVCAke3NhdmVwb2ludE5hbWV9YCkuZXhlY3V0ZSgpO1xyXG4gICAgICAgIHJlc3VsdGFkbyArPSBhd2FpdCBwcm9jZWR1cmVHdWFyZGFyLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbV9ndWFyZGFyKTtcclxuICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgUkVMRUFTRSBTQVZFUE9JTlQgJHtzYXZlcG9pbnROYW1lfWApLmV4ZWN1dGUoKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBST0xMQkFDSyBUTyBTQVZFUE9JTlQgJHtzYXZlcG9pbnROYW1lfWApLmV4ZWN1dGUoKTtcclxuICAgICAgICB2YXIgZXJyb3IgPSBleHBlY3RlZChlcnIpO1xyXG4gICAgICAgIGxldCBlcnJNZXNzYWdlID0gcmVzdWx0YWRvICsgXCJkbV9mb3Jwa3JhaXpfZGVzY2FyZ2FyLiBcIiArIGVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgcmVzdWx0YWRvID0gZXJyTWVzc2FnZTtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVyck1lc3NhZ2UsIGVycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgYHVwZGF0ZSB0ZW1cclxuICAgICAgICAgICAgc2V0IHBhc2VfdGFibGEgPSAkM1xyXG4gICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgcmV0dXJuaW5nICdvaydgLFxyXG4gICAgICAgIFtvcGVyYXRpdm8sIGlkRW5jLCByZXN1bHRhZG9dXHJcbiAgICApLmZldGNoVW5pcXVlUm93KCk7XHJcbn1cclxuXHJcbnZhciBzaW11bGFyR3VhcmRhZG9EZUVuY3Vlc3RhRGVzZGVBcHBFc2NyaXRvcmlvID0gYXN5bmMgKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGVuYzogSWRFbmMsIHRhcmVhOiBJZFRhcmVhLCBqc29uX2VuY3Vlc3RhOiBhbnkpID0+IHtcclxuICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICBjb25zdCBVQV9QUklOQ0lQQUwgPSAoYXdhaXQgZ2V0VUFQcmluY2lwYWwoY29udGV4dC5jbGllbnQsIG9wZXJhdGl2bykpLnVuaWRhZF9hbmFsaXNpcztcclxuICAgIHJldHVybiBhd2FpdCBiZS5wcm9jZWR1cmUuZG1fZm9ycGtyYWl6X2Rlc2Nhcmdhci5jb3JlRnVuY3Rpb24oXHJcbiAgICAgICAgY29udGV4dCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG9wZXJhdGl2bzogb3BlcmF0aXZvLFxyXG4gICAgICAgICAgICBwZXJzaXN0ZW50ZXM6IHtcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXM6IHtcclxuICAgICAgICAgICAgICAgICAgICBbVUFfUFJJTkNJUEFMXToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZW5jXToganNvbl9lbmN1ZXN0YVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBpbmZvcm1hY2lvbkhkcjoge1xyXG4gICAgICAgICAgICAgICAgICAgIFtlbmNdOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJlYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgKVxyXG59XHJcblxyXG4vLyBjYWRhIGVsZW1lbnRvIGRlIFwiY2FyZ2FzXCIgcXVlIGFybWEgZ2V0SGRyUXVlcnkgKGZlY2hhIGxsZWdhIGNvbW8gdGV4dG8gaXNvIGRlc2RlIGVsIGpzb24pXHJcbnR5cGUgQ2FyZ2FIZHJEYiA9IHtcclxuICAgIGNhcmdhOiBudW1iZXIgLy8gYXJlYVxyXG4gICAgb2JzZXJ2YWNpb25lczogc3RyaW5nIHwgbnVsbFxyXG4gICAgZmVjaGE6IHN0cmluZyB8IG51bGxcclxuICAgIHJlY2VwY2lvbmlzdGE6IHN0cmluZyB8IG51bGxcclxuICAgIHB1ZWRlX2F1dG9nZW5lcmFyOiBib29sZWFuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhcmdhc0hkckNvbkZlY2hhRG15KGNhcmdhczogQ2FyZ2FIZHJEYltdKSB7XHJcbiAgICByZXR1cm4gY2FyZ2FzLm1hcChjYXJnYSA9PiAoeyAuLi5jYXJnYSwgZmVjaGE6IGNhcmdhLmZlY2hhID8gZGF0ZS5pc28oY2FyZ2EuZmVjaGEpLnRvRG15KCkgOiBudWxsIH0pKTtcclxufVxyXG5cclxudmFyIGdldEhkclF1ZXJ5ID0gZnVuY3Rpb24gZ2V0SGRyUXVlcnkocXVvdGVkQ29uZFZpdjogc3RyaW5nLCBjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCB1bmlkYWRBbmFsaXNpc1ByaW5jaXBhbDogSWRVbmlkYWRBbmFsaXNpcywgcGVybWl0ZUdlbmVyYXJNdWVzdHJhOiBib29sZWFuLCBpZHBlcjpzdHJpbmcpIHtcclxuICAgIHJldHVybiBgXHJcbiAgICB3aXRoICR7Y29udGV4dC5iZS5kYi5xdW90ZUlkZW50KHVuaWRhZEFuYWxpc2lzUHJpbmNpcGFsKX0gYXMgXHJcbiAgICAgICAgKHNlbGVjdCB0Lm9wZXJhdGl2bywgdC5lbmMsIHQuanNvbl9lbmN1ZXN0YSBhcyByZXNwdWVzdGFzLCB0LnJlc3VtZW5fZXN0YWRvIGFzIFwicmVzdW1lbkVzdGFkb1wiLCBcclxuICAgICAgICAgICAganNvbmJfYnVpbGRfb2JqZWN0KFxyXG4gICAgICAgICAgICAgICAgJ2RvbWluaW8nICAgICAgICwgZG9taW5pbyAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAnbm9tY2FsbGUnICAgICAgLCBub21jYWxsZSAgICAgICxcclxuICAgICAgICAgICAgICAgICdzZWN0b3InICAgICAgICAsIHNlY3RvciAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgJ2VkaWZpY2lvJyAgICAgICwgZWRpZmljaW8gICAgICAsXHJcbiAgICAgICAgICAgICAgICAnZW50cmFkYScgICAgICAgLCBlbnRyYWRhICAgICAgICxcclxuICAgICAgICAgICAgICAgICducm9jYXRhc3RyYWwnICAsIG5yb2NhdGFzdHJhbCAgLFxyXG4gICAgICAgICAgICAgICAgJ3Bpc28nICAgICAgICAgICwgcGlzbyAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAnZGVwYXJ0YW1lbnRvJyAgLCBkZXBhcnRhbWVudG8gICxcclxuICAgICAgICAgICAgICAgICdoYWJpdGFjaW9uJyAgICAsIGhhYml0YWNpb24gICAgLFxyXG4gICAgICAgICAgICAgICAgJ2Nhc2EnICAgICAgICAgICwgY2FzYSAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAncHJpb3JpZGFkJyAgICAgLCByZXNlcnZhKzEgICAgICxcclxuICAgICAgICAgICAgICAgICdvYnNlcnZhY2lvbmVzJyAsIHR0LmNhcmdhX29ic2VydmFjaW9uZXMgLFxyXG4gICAgICAgICAgICAgICAgJ2NpdGEnICAgICAgICAgICwgY2l0YSAsXHJcbiAgICAgICAgICAgICAgICAnY2FyZ2EnICAgICAgICAgLCB0LmFyZWEgICAgICAgICxcclxuICAgICAgICAgICAgICAgICdzZW1hbmEnICAgICAgICAsIHQuc2VtYW5hXHJcbiAgICAgICAgICAgICkgYXMgdGVtLCB0LmFyZWEsXHJcbiAgICAgICAgICAgIC0tVE9ETzogR0VORVJBTElaQVJcclxuICAgICAgICAgICAganNvbmJfYnVpbGRfb2JqZWN0KFxyXG4gICAgICAgICAgICAgICAgJ3RhcmVhJywgdHQudGFyZWEsXHJcbiAgICAgICAgICAgICAgICAnZmVjaGFfYXNpZ25hY2lvbicsIGZlY2hhX2FzaWduYWNpb24sXHJcbiAgICAgICAgICAgICAgICAnYXNpZ25hZG8nLCBhc2lnbmFkbyxcclxuICAgICAgICAgICAgICAgICdtYWluX2Zvcm0nLCBtYWluX2Zvcm1cclxuICAgICAgICAgICAgKSBhcyB0YXJlYSxcclxuICAgICAgICAgICAgbWluKGZlY2hhX2FzaWduYWNpb24pIGFzIGZlY2hhX2FzaWduYWNpb25cclxuICAgICAgICAgICAgZnJvbSB0ZW0gdCBsZWZ0IGpvaW4gdGFyZWFzX3RlbSB0dCBvbiAodC5vcGVyYXRpdm8gPSB0dC5vcGVyYXRpdm8gYW5kIHQuZW5jID0gdHQuZW5jIGFuZCB0LnRhcmVhX2FjdHVhbCA9IHR0LnRhcmVhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiB0YXJlYXMgdGEgb24gdC50YXJlYV9hY3R1YWwgPSB0YS50YXJlYVxyXG4gICAgICAgICAgICB3aGVyZSB0LmhhYmlsaXRhZGEgYW5kICR7cXVvdGVkQ29uZFZpdn1cclxuICAgICAgICAgICAgZ3JvdXAgYnkgdC5vcGVyYXRpdm8sIHQuZW5jLCB0Lmpzb25fZW5jdWVzdGEsIHQucmVzdW1lbl9lc3RhZG8sIGRvbWluaW8sIG5vbWNhbGxlLHNlY3RvcixlZGlmaWNpbywgZW50cmFkYSwgbnJvY2F0YXN0cmFsLCBwaXNvLGRlcGFydGFtZW50byxoYWJpdGFjaW9uLGNhc2EscmVzZXJ2YSx0dC5jYXJnYV9vYnNlcnZhY2lvbmVzLCBjaXRhLCB0LmFyZWEsIHR0LnRhcmVhLCBmZWNoYV9hc2lnbmFjaW9uLCBhc2lnbmFkbywgbWFpbl9mb3JtLCB0LnNlbWFuYVxyXG4gICAgICAgIClcclxuICAgICAgICBzZWxlY3QganNvbmJfYnVpbGRfb2JqZWN0KFxyXG4gICAgICAgICAgICAgICAgJHtjb250ZXh0LmJlLmRiLnF1b3RlTGl0ZXJhbCh1bmlkYWRBbmFsaXNpc1ByaW5jaXBhbCl9LCAke2pzb25vKFxyXG4gICAgICAgIGBzZWxlY3QgZW5jLCByZXNwdWVzdGFzLCBqc29uYl9idWlsZF9vYmplY3QoJ3Jlc3VtZW5Fc3RhZG8nLFwicmVzdW1lbkVzdGFkb1wiKSBhcyBvdHJhcyBmcm9tICR7Y29udGV4dC5iZS5kYi5xdW90ZUlkZW50KHVuaWRhZEFuYWxpc2lzUHJpbmNpcGFsKX1gLFxyXG4gICAgICAgICdlbmMnLFxyXG4gICAgICAgIGBvdHJhcyB8fCBjb2FsZXNjZShyZXNwdWVzdGFzLCd7fSc6Ompzb25iKWBcclxuICAgICl9XHJcbiAgICAgICAgICAgICkgYXMgcmVzcHVlc3RhcyxcclxuICAgICAgICAgICAgJHtqc29uKGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCBhLmFyZWEgYXMgY2FyZ2EsIG9ic2VydmFjaW9uZXNfaGRyIGFzIG9ic2VydmFjaW9uZXMsIG1pbihmZWNoYV9hc2lnbmFjaW9uKSBhcyBmZWNoYSwgdGEucmVjZXBjaW9uaXN0YSxcclxuICAgICAgICAgICAgICAgICR7cGVybWl0ZUdlbmVyYXJNdWVzdHJhID8gYGNhc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0YS5hc2lnbmFkbyA9ICR7Y29udGV4dC5iZS5kYi5xdW90ZUxpdGVyYWwoaWRwZXIpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHRydWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGVuZGA6IGBmYWxzZWB9IGFzIHB1ZWRlX2F1dG9nZW5lcmFyXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSAke2NvbnRleHQuYmUuZGIucXVvdGVJZGVudCh1bmlkYWRBbmFsaXNpc1ByaW5jaXBhbCl9IGF1eCBpbm5lciBqb2luIGFyZWFzIGEgdXNpbmcgKG9wZXJhdGl2bywgYXJlYSkgaW5uZXIgam9pbiB0YXJlYXNfYXJlYXMgdGEgb24gKGEuYXJlYSA9IHRhLmFyZWEgYW5kIGF1eC50YXJlYS0+Pid0YXJlYScgPSB0YS50YXJlYSlcclxuICAgICAgICAgICAgICAgICAgICBncm91cCBieSBhLmFyZWEsIG9ic2VydmFjaW9uZXNfaGRyLCB0YS5yZWNlcGNpb25pc3RhLCBwdWVkZV9hdXRvZ2VuZXJhclxyXG4gICAgICAgICAgICAgICAgJHtwZXJtaXRlR2VuZXJhck11ZXN0cmEgPyBgXHJcbiAgICAgICAgICAgICAgICAgICAgdW5pb24gLS0gZXN0ZSB1bmlvbiBwZXJtaXRlIHZpc3VhbGl6YXIgYXJlYXMgYXNpZ25hZGFzIHNpbiBlbmN1ZXN0YXMgZ2VuZXJhZGFzXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0IGFyZWEgYXMgY2FyZ2EsIG51bGwgYXMgb2JzZXJ2YWNpb25lcywgbnVsbCBhcyBmZWNoYSwgcmVjZXBjaW9uaXN0YSwgdHJ1ZSBhcyBwdWVkZV9hdXRvZ2VuZXJhclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhc19hcmVhcyB3aGVyZSBhc2lnbmFkbyA9ICR7Y29udGV4dC5iZS5kYi5xdW90ZUxpdGVyYWwoaWRwZXIpfSBhbmQgdGFyZWEgPSAnZW5jdSdgIDogJyd9XHJcbiAgICAgICAgICAgICAgICBgLCAnZmVjaGEnKX0gYXMgY2FyZ2FzLFxyXG4gICAgICAgICAgICAke2pzb25vKFxyXG4gICAgICAgIGBzZWxlY3QgZW5jLCBqc29uYl9idWlsZF9vYmplY3QoJ3RlbScsIHRlbSwgJ3RhcmVhJywgdGFyZWEpIGFzIG90cmFzIGZyb20gJHtjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQodW5pZGFkQW5hbGlzaXNQcmluY2lwYWwpfWAsXHJcbiAgICAgICAgJ2VuYycsXHJcbiAgICAgICAgYG90cmFzIHx8J3t9Jzo6anNvbmJgXHJcbiAgICApfVxyXG4gICAgICAgICAgICBhcyBcImluZm9ybWFjaW9uSGRyXCJcclxuYFxyXG59XHJcblxyXG5leHBvcnQgdmFyIHNldEhkclF1ZXJ5ID0gKG15RnVuOiAocXVvdGVkQ29uZFZpdjogc3RyaW5nLCBjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCB1bmlkYWRBbmFsaXNpc1ByaW5jaXBhbDogSWRVbmlkYWRBbmFsaXNpcywgcGVybWl0ZUdlbmVyYXJNdWVzdHJhOiBib29sZWFuLCBpZHBlcjogc3RyaW5nKSA9PiBzdHJpbmcpID0+IGdldEhkclF1ZXJ5ID0gbXlGdW5cclxuXHJcbmNvbnN0IGdldFVBUHJpbmNpcGFsID0gYXN5bmMgKGNsaWVudDogQ2xpZW50LCBvcGVyYXRpdm86IElkT3BlcmF0aXZvKSA9PlxyXG4gICAgKGF3YWl0IGNsaWVudC5xdWVyeShcclxuICAgICAgICBgc2VsZWN0ICpcclxuICAgICAgICAgICAgZnJvbSB1bmlkYWRfYW5hbGlzaXNcclxuICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgcHJpbmNpcGFsXHJcbiAgICAgICAgYFxyXG4gICAgICAgICxcclxuICAgICAgICBbb3BlcmF0aXZvXVxyXG4gICAgKS5mZXRjaFVuaXF1ZVJvdygpKS5yb3dcclxuXHJcbnZhciBmdW5jaW9uZXNDb25vY2lkYXM6IHsgW2sgaW4gc3RyaW5nXTogYm9vbGVhbiB9ID0ge31cclxuXHJcbnZhciBjb21waWxlciA9IG5ldyBFeHByZXNpb25QYXJzZXIuQ29tcGlsZXIoe1xyXG4gICAgbGFuZ3VhZ2U6ICdqcycsXHJcbiAgICB2YXJXcmFwcGVyOiAodmFyX25hbWU6IHN0cmluZykgPT4gYGhlbHBlcnMubnVsbDJ6ZXJvKHZhbG9yZXMuJHt2YXJfbmFtZX0pYCxcclxuICAgIGZ1bldyYXBwZXI6IChmdW5jdGlvbk5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlmICghZnVuY2lvbmVzQ29ub2NpZGFzW2Z1bmN0aW9uTmFtZV0pIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZnVuY3Rpb25OYW1lKVxyXG4gICAgICAgICAgICBmdW5jaW9uZXNDb25vY2lkYXNbZnVuY3Rpb25OYW1lXSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBgaGVscGVycy5mdW5zLiR7ZnVuY3Rpb25OYW1lfWBcclxuICAgIH1cclxufSlcclxuXHJcbnR5cGUgQ2FzaWxsZXJvRGVBY2EgPSB7XHJcbiAgICBjaGlsZHM6IENhc2lsbGVyb0RlQWNhW10sXHJcbiAgICBkYXRhOiB7XHJcbiAgICAgICAgZXhwcmVzaW9uX2hhYmlsaXRhcjogc3RyaW5nXHJcbiAgICAgICAgZXhwcmVzaW9uX2hhYmlsaXRhcl9qczogc3RyaW5nXHJcbiAgICAgICAgZXNwZWNpYWw6IGFueVxyXG4gICAgICAgIGV4cHJlc2lvbl9hdXRvaW5ncmVzYXJfanM6IHN0cmluZ1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjb21waWxhckV4cHJlc2lvbihleHByZXNpb246IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGNvbXBpbGVyLnRvQ29kZShFeHByZXNpb25QYXJzZXIucGFyc2UoXHJcbiAgICAgICAgZXhwcmVzaW9uXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGJpcyBkaXN0aW5jdCBmcm9tXFxiL2dpLCAnIDw+ICcpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC8hIS9naSwgJyAnKVxyXG4gICAgKSkucmVwbGFjZSgvaGVscGVyc1xcLmZ1bnNcXC5ibGFuY29cXChoZWxwZXJzLm51bGwyemVyb1xcKC9nLCAnaGVscGVycy5mdW5zLmJsYW5jbygoJylcclxuICAgICAgICAucmVwbGFjZSgvaGVscGVyc1xcLmZ1bnNcXC5pbmZvcm1hZG9cXChoZWxwZXJzLm51bGwyemVyb1xcKC9nLCAnaGVscGVycy5mdW5zLmluZm9ybWFkbygoJyk7XHJcbn1cclxuXHJcbi8vIHJlYS9ubyByZWEgKHkgc3VzIHZlcnNpb25lcyBfc3VwKSBkZWwgb3BlcmF0aXZvLCB0b21hZGFzIGRlIGxhcyBjYWNoZXMsIHBhcmEgbGEgZXN0cnVjdHVyYSBxdWUgc2UgbWFuZGEgYWwgZGlzcG9zaXRpdm8uXHJcbi8vIExhcyBjb25kaWNpb25lcyBkZSByZWEgc2UgY29tcGlsYW4gYSBqcyAoY29uZGljaW9uX2pzKSBwYXJhIGV2YWx1YXJsYXMgZW4gZWwgZGlzcG9zaXRpdm8uXHJcbmV4cG9ydCBmdW5jdGlvbiByZWFzTm9SZWFzRGVsT3BlcmF0aXZvKHRhYmxlQ29udGVudDogQXBwQmFja2VuZFsnY2FjaGVzJ11bJ3RhYmxlQ29udGVudCddLCBvcGVyYXRpdm86IElkT3BlcmF0aXZvKSB7XHJcbiAgICB2YXIgbm9SZWFzQ2FjaGU6IE5vUmVhW10gPSB0YWJsZUNvbnRlbnQubm9fcmVhIHx8IFtdO1xyXG4gICAgdmFyIG5vUmVhc1N1cENhY2hlOiBOb1JlYVN1cFtdID0gdGFibGVDb250ZW50Lm5vX3JlYV9zdXAgfHwgW107XHJcbiAgICB2YXIgcmVhc0NhY2hlOiBPbWl0PFJlYSwgJ2NvbmRpY2lvbl9qcyc+W10gPSB0YWJsZUNvbnRlbnQucmVhIHx8IFtdO1xyXG4gICAgdmFyIHJlYXNTdXBDYWNoZTogT21pdDxSZWFTdXAsICdjb25kaWNpb25fanMnPltdID0gdGFibGVDb250ZW50LnJlYV9zdXAgfHwgW107XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5vUmVhczogbm9SZWFzQ2FjaGUuZmlsdGVyKG5vUmVhID0+IG5vUmVhLm9wZXJhdGl2byA9PSBvcGVyYXRpdm8pLFxyXG4gICAgICAgIG5vUmVhc1N1cDogbm9SZWFzU3VwQ2FjaGUuZmlsdGVyKG5vUmVhU3VwID0+IG5vUmVhU3VwLm9wZXJhdGl2byA9PSBvcGVyYXRpdm8pLFxyXG4gICAgICAgIHJlYXM6IHJlYXNDYWNoZS5maWx0ZXIocmVhID0+IHJlYS5vcGVyYXRpdm8gPT0gb3BlcmF0aXZvKVxyXG4gICAgICAgICAgICAubWFwKChyZWEpOiBSZWEgPT4gKHsgLi4ucmVhLCBjb25kaWNpb25fanM6IGNvbXBpbGFyRXhwcmVzaW9uKHJlYS5jb25kaWNpb24pIH0pKSxcclxuICAgICAgICByZWFzU3VwOiByZWFzU3VwQ2FjaGUuZmlsdGVyKHJlYVN1cCA9PiByZWFTdXAub3BlcmF0aXZvID09IG9wZXJhdGl2bylcclxuICAgICAgICAgICAgLm1hcCgocmVhU3VwKTogUmVhU3VwID0+ICh7IC4uLnJlYVN1cCwgY29uZGljaW9uX2pzOiBjb21waWxhckV4cHJlc2lvbihyZWFTdXAuY29uZGljaW9uKSB9KSksXHJcbiAgICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb21waWxhckV4cHJlc2lvbmVzKGNhc2lsbGVybzogQ2FzaWxsZXJvRGVBY2EpIHtcclxuICAgIGlmICghY2FzaWxsZXJvKSB7IHJldHVybiB9XHJcbiAgICBpZiAoY2FzaWxsZXJvLmRhdGEuZXhwcmVzaW9uX2hhYmlsaXRhcikge1xyXG4gICAgICAgIGNhc2lsbGVyby5kYXRhLmV4cHJlc2lvbl9oYWJpbGl0YXJfanMgPSBjb21waWxhckV4cHJlc2lvbihjYXNpbGxlcm8uZGF0YS5leHByZXNpb25faGFiaWxpdGFyKTtcclxuICAgIH1cclxuICAgIGlmIChjYXNpbGxlcm8uZGF0YS5lc3BlY2lhbD8uYXV0b2luZykge1xyXG4gICAgICAgIHZhciBwYXJ0ZXMgPSBjYXNpbGxlcm8uZGF0YS5lc3BlY2lhbD8uYXV0b2luZy5zcGxpdCgnPT4nKTtcclxuICAgICAgICBpZiAocGFydGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgdmFyIHByZWNvbmRpY2lvbiA9IHBhcnRlc1swXTtcclxuICAgICAgICAgICAgdmFyIHZhbG9yID0gcGFydGVzLnNsaWNlKDEpLmpvaW4oJz0+Jyk7XHJcbiAgICAgICAgICAgIGNhc2lsbGVyby5kYXRhLmV4cHJlc2lvbl9hdXRvaW5ncmVzYXJfanMgPSBgKCR7Y29tcGlsYXJFeHByZXNpb24ocHJlY29uZGljaW9uKX0pPygke2NvbXBpbGFyRXhwcmVzaW9uKHZhbG9yKX0pOm51bGxgO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNhc2lsbGVyby5kYXRhLmV4cHJlc2lvbl9hdXRvaW5ncmVzYXJfanMgPSBjb21waWxhckV4cHJlc2lvbihwYXJ0ZXNbMF0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAodmFyIGNhc2lsbGVyb0ludGVybm8gb2YgY2FzaWxsZXJvLmNoaWxkcykgY29tcGlsYXJFeHByZXNpb25lcyhjYXNpbGxlcm9JbnRlcm5vKTtcclxufVxyXG5cclxuY29uc3QgZ2VuZXJhckVuY3Vlc3RhVGVtID0gYXN5bmMgKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGlkRW5jOiBJZEVuYywgYXJlYTogbnVtYmVyLCBkb21pbmlvOiBudW1iZXIsIHRhcmVhX2FjdHVhbDogSWRUYXJlYSkgPT4ge1xyXG4gICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgIElOU0VSVCBpbnRvIHRlbSAob3BlcmF0aXZvLCBlbmMsIGFyZWEsIGRvbWluaW8sIGhhYmlsaXRhZGEsIHRhcmVhX2FjdHVhbCkgdmFsdWVzICgkMSwgJDIsICQzLCAkNCwgJDUsICQ2KWAsXHJcbiAgICAgICAgW29wZXJhdGl2bywgaWRFbmMsIGFyZWEsIGRvbWluaW8sIHRydWUsIHRhcmVhX2FjdHVhbF0pLmV4ZWN1dGUoKTtcclxufVxyXG5cclxuY29uc3QgZ2VuZXJhclRhcmVhc1RlbUZhbHRhbnRlcyA9IGFzeW5jIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBvcGVyYXRpdm86IElkT3BlcmF0aXZvKSA9PiB7XHJcbiAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgaW5zZXJ0IGludG8gdGFyZWFzX3RlbSAob3BlcmF0aXZvLCBlbmMsIHRhcmVhKVxyXG4gICAgICAgICAgICBzZWxlY3QgdGEub3BlcmF0aXZvLCB0YS5lbmMsIHRhLnRhcmVhXHJcbiAgICAgICAgICAgIGZyb20gKHNlbGVjdCB0YS4qLCB0LmVuYyx0LmFyZWEgZnJvbSB0YXJlYXMgdGEsIHRlbSB0IHdoZXJlIHRhLm9wZXJhdGl2bz10Lm9wZXJhdGl2bykgdGEgXHJcbiAgICAgICAgICAgIHdoZXJlIHRhLm9wZXJhdGl2byA9ICQxIFxyXG4gICAgICAgICAgICAgICAgYW5kIG5vdCAodGEub3BlcmF0aXZvLCB0YS5lbmMsIHRhLnRhcmVhKSBpbiAoc2VsZWN0IG9wZXJhdGl2bywgZW5jLCB0YXJlYSBmcm9tIHRhcmVhc190ZW0pXHJcbiAgICAgICAgICAgIG9yZGVyIGJ5IDEsMywyO1xyXG4gICAgYCwgW29wZXJhdGl2b10pLmV4ZWN1dGUoKTtcclxufVxyXG5cclxuY29uc3QgYnVzY2FyRW5jdWVzdGFFblRlbSA9IGFzeW5jIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8YW55PikgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICBzZWxlY3QgKlxyXG4gICAgICAgICAgICAgICAgZnJvbSB0ZW1cclxuICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCBlbmMgPSAkMiAtLXBrIHZlcmlmaWNhZGFcclxuICAgICAgICBgLCBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICB0aHJvdyBFcnJvcihgTm8gc2UgZW5jb250csOzIGxhIGVuY3Vlc3RhICR7cGFyYW1zLmVuY30gcGFyYSBlbCBvcGVyYXRpdm8gJHtwYXJhbXMub3BlcmF0aXZvfS4gJHtleHBlY3RlZChlcnIpLm1lc3NhZ2V9YClcclxuICAgIH1cclxuICAgIHJldHVybiB7IGNhc29UZW06IHJlc3VsdC5yb3cgfTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhc2FyRW5jdWVzdGFzQVByb2llKGNsaWVudDogQ2xpZW50KSB7XHJcbiAgICBsZXQgcGFyYW1ldHJvcyA9IChhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ICogZnJvbSBwYXJhbWV0cm9zIHdoZXJlIHVuaWNvX3JlZ2lzdHJvYCxcclxuICAgICAgICBbXSkuZmV0Y2hVbmlxdWVSb3coKSkucm93O1xyXG4gICAgdmFyIHNlbGVjdCA9IGBzZWxlY3QgdC5vcGVyYXRpdm8sIHQuZW5jLCB0LnRhcmVhX2FjdHVhbCwgdHQudHNfZW50cmFkYVxyXG4gICAgICAgIGZyb20gdGFyZWFzX3RlbSB0dCBqb2luIHRlbSB0IHVzaW5nIChvcGVyYXRpdm8sZW5jKVxyXG4gICAgICAgIHdoZXJlIHR0Lm9wZXJhdGl2bz0kMSBhbmQgdHQudGFyZWE9ICQyIGFuZCAoJHtnZXREaWFzQVBhc2FyUXVlcnkoJ3R0Jyl9IDw9IDAgb3IgY29hbGVzY2UodHQuYWRlbGFudGFyLGZhbHNlKSkgYW5kIHR0LnRhcmVhID0gdC50YXJlYV9hY3R1YWxcclxuICAgIGA7XHJcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgIFVQREFURSB0YXJlYXNfdGVtIHR0XHJcbiAgICAgICAgICAgIHNldCBlc3RhZG8gPSAnVidcclxuICAgICAgICAgICAgZnJvbSAoJHtzZWxlY3R9KSBhdXhcclxuICAgICAgICAgICAgd2hlcmUgdHQub3BlcmF0aXZvID0gYXV4Lm9wZXJhdGl2byBhbmQgdHQuZW5jID0gYXV4LmVuYyBhbmQgdHQudGFyZWEgPSAkM1xyXG4gICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgW3BhcmFtZXRyb3Mub3BlcmF0aXZvLCAnZmluYycsICdmaW5jJ10pXHJcbiAgICAgICAgLmZldGNoQWxsKCk7XHJcbiAgICAvL1RPRE8gYXNpZ25hciBlbiBwcm9jZXNhbWllbnRvXHJcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgIFVQREFURSB0YXJlYXNfdGVtIHR0XHJcbiAgICAgICAgICAgIHNldCBlc3RhZG8gPSAnQSdcclxuICAgICAgICAgICAgZnJvbSAoJHtzZWxlY3R9KSBhdXhcclxuICAgICAgICAgICAgd2hlcmUgdHQub3BlcmF0aXZvID0gYXV4Lm9wZXJhdGl2byBhbmQgdHQuZW5jID0gYXV4LmVuYyBhbmQgdHQudGFyZWEgPSAkM1xyXG4gICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgW3BhcmFtZXRyb3Mub3BlcmF0aXZvLCAnZmluYycsICdwcm9jJ10pXHJcbiAgICAgICAgLmZldGNoQWxsKCk7XHJcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoYFxyXG4gICAgICAgIHVwZGF0ZSB0ZW0gdFxyXG4gICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJ3Byb2MnXHJcbiAgICAgICAgICAgIGZyb20gKCR7c2VsZWN0fSkgYXV4XHJcbiAgICAgICAgICAgIHdoZXJlIHQub3BlcmF0aXZvID0gYXV4Lm9wZXJhdGl2byBhbmQgdC5lbmMgPSBhdXguZW5jXHJcbiAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICBbcGFyYW1ldHJvcy5vcGVyYXRpdm8sICdmaW5jJ10pLmZldGNoQWxsKCk7XHJcbiAgICByZXR1cm4gJ29rJztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFByb2NlZHVyZXNEbUVuY3U6IFByb2NlZHVyZURlZltdID0gW1xyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ29wZXJhdGl2b19lc3RydWN0dXJhX2NvbXBsZXRhJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcsIHJlZmVyZW5jZXM6ICdvcGVyYXRpdm9zJyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdpZHBlcl9sb2d1ZWFkb190YWJsZXQnLCB0eXBlTmFtZTogJ3RleHQnLCBkZWZhdWx0VmFsdWU6bnVsbCB9LFxyXG5cclxuICAgICAgICBdLFxyXG4gICAgICAgIHJlc3VsdE9rOidkZXNwbGVnYXJGb3JtdWxhcmlvJyxcclxuICAgICAgICB1bmxvZ2dlZDogdHJ1ZSwgXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHtvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBpZHBlcl9sb2d1ZWFkb190YWJsZXQ6IHN0cmluZ3xudWxsfT4pe1xyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgc2VsZWN0IGNhc2lsbGVyb3NfamVyYXJxdWl6YWRvcygkMSkgYXMgZm9ybXVsYXJpb3MsIFxyXG4gICAgICAgICAgICAgICAgICAgICR7anNvbm8oYHNlbGVjdCB1bmlkYWRfYW5hbGlzaXMsIHBhZHJlLCBwa19hZ3JlZ2FkYSwgJ3t9Jzo6anNvbmIgYXMgaGlqYXMgZnJvbSB1bmlkYWRfYW5hbGlzaXMgd2hlcmUgb3BlcmF0aXZvID0gJDJgLCAndW5pZGFkX2FuYWxpc2lzJyl9IGFzIHVuaWRhZGVzX2FuYWxpc2lzXHJcbiAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtZXRlcnMub3BlcmF0aXZvLCBwYXJhbWV0ZXJzLm9wZXJhdGl2b11cclxuICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBsaWtlQXIocmVzdWx0LnJvdy5mb3JtdWxhcmlvcykuZm9yRWFjaChmID0+IGNvbXBpbGFyRXhwcmVzaW9uZXMoZikpO1xyXG4gICAgICAgICAgICAvLyBIZXJtYW5vcyBzb24gbG9zIGZvcm11bGFyaW9zIHF1ZSBlc3TDoW4gaW1wbGFudGFkb3MgZW4gb3RybyBmb3JtdWxhcmlvIGRlIGxhIG1pc21hIFVBLiBQb3IgZWplbXBsbyBlbCBBMSBlbiBlbCBTMVxyXG4gICAgICAgICAgICB2YXIgcmVzdWx0SGVybWFub3MgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbnNlbGVjdCBvLmlkX2Nhc2lsbGVybyBhcyBpZF9mb3JtdWxhcmlvLCBvLnVuaWRhZF9hbmFsaXNpcywgJ0JGXyd8fG8uY2FzaWxsZXJvIGJvdG9uLCBiZi5jYXNpbGxlcm8sIGJmLnBhZHJlLCBmcC5jYXNpbGxlcm8sIGZwLnVuaWRhZF9hbmFsaXNpc1xyXG4gIGZyb20gY2FzaWxsZXJvcyBvIGxlZnQgam9pbiBjYXNpbGxlcm9zIGJmXHJcbiAgICBvbiBiZi50aXBvYz0nQkYnXHJcblx0YW5kIGJmLmNhc2lsbGVybyA9ICdCRl8nfHxvLmNhc2lsbGVyb1xyXG5cdGFuZCBiZi5vcGVyYXRpdm8gPSBvLm9wZXJhdGl2b1xyXG5cdGxlZnQgam9pbiBjYXNpbGxlcm9zIGZwXHJcblx0ICBvbiBmcC5pZF9jYXNpbGxlcm8gPSBiZi5wYWRyZVxyXG5cdCAgYW5kIGZwLm9wZXJhdGl2byA9IGJmLm9wZXJhdGl2b1xyXG4gIHdoZXJlIG8udGlwb2MgPSAnRidcclxuICAgIGFuZCBvLnVuaWRhZF9hbmFsaXNpcyA9IGZwLnVuaWRhZF9hbmFsaXNpc1xyXG5cdGFuZCBvLm9wZXJhdGl2byA9ICQxYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbWV0ZXJzLm9wZXJhdGl2b11cclxuICAgICAgICAgICAgKS5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICByZXN1bHRIZXJtYW5vcy5yb3dzLmZvckVhY2gocm93ID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5yb3cuZm9ybXVsYXJpb3Nbcm93LmlkX2Zvcm11bGFyaW9dLmRhdGEuaGVybWFubyA9IHRydWU7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbXBsZXRhclVBKHVhOiBVbmlkYWRBbmFsaXNpcywgaWRVYTogSWRVbmlkYWRBbmFsaXNpcywgdUFzOiB7IFtrIGluIElkVW5pZGFkQW5hbGlzaXNdOiBVbmlkYWRBbmFsaXNpcyB9KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodWEucGFkcmUpIHtcclxuICAgICAgICAgICAgICAgICAgICB1QXNbdWEucGFkcmVdLmhpamFzW2lkVWFdID0gdWE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHVhLnByaW5jaXBhbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGlrZUFyKHJlc3VsdC5yb3cudW5pZGFkZXNfYW5hbGlzaXMpLmZvckVhY2goKHVhLCBpZFVhKSA9PlxyXG4gICAgICAgICAgICAgICAgY29tcGxldGFyVUEodWEsIGlkVWEgYXMgSWRVbmlkYWRBbmFsaXNpcywgcmVzdWx0LnJvdy51bmlkYWRlc19hbmFsaXNpcylcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICB2YXIge1xyXG4gICAgICAgICAgICAgICAgY29uX3JlYV9ob2dhcjogY29uUmVhSG9nYXIsXHJcbiAgICAgICAgICAgICAgICBjb25maWdfc29ydGVvOiBjb25maWdTb3J0ZW8sXHJcbiAgICAgICAgICAgICAgICBoYWJpbGl0YWNpb25fYm90b25fZm9ybXVsYXJpbzogaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvLFxyXG4gICAgICAgICAgICB9ID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCBjb25maWdfc29ydGVvLCBjb25fcmVhX2hvZ2FyLCBoYWJpbGl0YWNpb25fYm90b25fZm9ybXVsYXJpbywgcGVybWl0ZV9nZW5lcmFyX211ZXN0cmEgXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSBvcGVyYXRpdm9zIFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxXHJcbiAgICAgICAgICAgIGAsIFtwYXJhbWV0ZXJzLm9wZXJhdGl2b10pLmZldGNoVW5pcXVlUm93KCkpLnJvdztcclxuXHJcbiAgICAgICAgICAgIHZhciBzZW1hbmFzID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYHNlbGVjdCAgXHJcbiAgICAgICAgICAgICAgICAgICAgJHtqc29ubyhgc2VsZWN0ICogZnJvbSBzZW1hbmFzIHdoZXJlIG9wZXJhdGl2byA9ICQxYCwgJ3NlbWFuYScpfSBhcyBzZW1hbmFzXHJcbiAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtZXRlcnMub3BlcmF0aXZvXVxyXG4gICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCkpLnJvdy5zZW1hbmFzO1xyXG4gICAgICAgICAgICBsZXQgY29tcGlsYXJFeHByZXNpb25lc0RvbWluaW9zID0gKGV4cHJlc2lvbmVzRG9taW5pbzogYW55KSA9PlxyXG4gICAgICAgICAgICAgICAgbGlrZUFyKGV4cHJlc2lvbmVzRG9taW5pbylcclxuICAgICAgICAgICAgICAgICAgICAubWFwKChleHByLCBkb21pbmlvKSA9PiAoeyBkb21pbmlvLCBleHByOiBjb21waWxhckV4cHJlc2lvbihleHByLmV4cHIpIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgIC5wbGFpbigpO1xyXG4gICAgICAgICAgICBpZiAoY29uZmlnU29ydGVvKSB7XHJcbiAgICAgICAgICAgICAgICBsaWtlQXIoY29uZmlnU29ydGVvKS5mb3JFYWNoKChjb25maWdTb3J0ZW9Gb3JtdWxhcmlvKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnU29ydGVvRm9ybXVsYXJpby5leHByX2luY29tcGxldGl0dWRfanMgPSBjb21waWxhckV4cHJlc2lvbmVzRG9taW5pb3MoY29uZmlnU29ydGVvRm9ybXVsYXJpby5leHByX2luY29tcGxldGl0dWQpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnU29ydGVvRm9ybXVsYXJpby5maWx0cm9fanMgPSBjb21waWxhckV4cHJlc2lvbmVzRG9taW5pb3MoY29uZmlnU29ydGVvRm9ybXVsYXJpby5maWx0cm8pXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8pIHtcclxuICAgICAgICAgICAgICAgIGxpa2VBcihoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8pLmZvckVhY2goKGZvcm0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBmb3JtLmV4cHJfaGFiaWxpdGFyX2JvdG9uX2pzID0gY29tcGlsYXJFeHByZXNpb24oZm9ybS5leHByX2hhYmlsaXRhcl9ib3RvbilcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGRlZmF1bHRUYXJlYSA9IGF3YWl0IGdldERlZmF1bHRUYXJlYShjb250ZXh0LCBwYXJhbWV0ZXJzLm9wZXJhdGl2byk7XHJcbiAgICAgICAgICAgIHZhciBkZWZhdWx0SW5mb3JtYWNpb25IZHIgPSAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgc2VsZWN0ICBcclxuICAgICAgICAgICAgICAgICAgICBqc29uYl9idWlsZF9vYmplY3QoXHJcbiAgICAgICAgICAgICAgICAgICAgJ2RvbWluaW8nICAgICAgICwgJHtjb250ZXh0LmJlLmRiLnF1b3RlTGl0ZXJhbChERUZBVUxUX0RPTUlOSU8pfSxcclxuICAgICAgICAgICAgICAgICAgICAnbm9tY2FsbGUnICAgICAgLCBudWxsICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAnc2VjdG9yJyAgICAgICAgLCBudWxsICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAnZWRpZmljaW8nICAgICAgLCBudWxsICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAnZW50cmFkYScgICAgICAgLCBudWxsICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAnbnJvY2F0YXN0cmFsJyAgLCBudWxsICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAncGlzbycgICAgICAgICAgLCBudWxsICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAnZGVwYXJ0YW1lbnRvJyAgLCBudWxsICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAnaGFiaXRhY2lvbicgICAgLCBudWxsICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAnY2FzYScgICAgICAgICAgLCBudWxsICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAncHJpb3JpZGFkJyAgICAgLCBudWxsICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAnb2JzZXJ2YWNpb25lcycgLCBudWxsICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAnY2l0YScgICAgICAgICAgLCBudWxsICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAnY2FyZ2EnICAgICAgICAgLCBudWxsICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAnc2VtYW5hJyAgICAgICAgLCBudWxsXHJcbiAgICAgICAgICAgICAgICApIGFzIHRlbSxcclxuICAgICAgICAgICAgICAgIGpzb25iX2J1aWxkX29iamVjdChcclxuICAgICAgICAgICAgICAgICAgICAndGFyZWEnLCAke2NvbnRleHQuYmUuZGIucXVvdGVMaXRlcmFsKGRlZmF1bHRUYXJlYS50YXJlYSl9LFxyXG4gICAgICAgICAgICAgICAgICAgICdmZWNoYV9hc2lnbmFjaW9uJywgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAnYXNpZ25hZG8nLCAke2NvbnRleHQuYmUuZGIucXVvdGVMaXRlcmFsKHBhcmFtZXRlcnMuaWRwZXJfbG9ndWVhZG9fdGFibGV0IHx8IGNvbnRleHQudXNlci5pZHBlcil9LFxyXG4gICAgICAgICAgICAgICAgICAgICdtYWluX2Zvcm0nLCAke2NvbnRleHQuYmUuZGIucXVvdGVMaXRlcmFsKGRlZmF1bHRUYXJlYS5tYWluX2Zvcm0pfVxyXG4gICAgICAgICAgICAgICAgKSBhcyB0YXJlYVxyXG4gICAgICAgICAgICAgICAgYCxcclxuICAgICAgICAgICAgICAgIFtdXHJcbiAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKSkucm93O1xyXG4gICAgICAgICAgICB2YXIgeyB1bmlkYWRfYW5hbGlzaXMsIHBrX2FncmVnYWRhIH0gPSAoYXdhaXQgZ2V0VUFQcmluY2lwYWwoY29udGV4dC5jbGllbnQsIHBhcmFtZXRlcnMub3BlcmF0aXZvKSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IGJlLmNhY2hlcy50aW1lc3RhbXBFc3RydWN0dXJhLFxyXG4gICAgICAgICAgICAgICAgLi4ucmVzdWx0LnJvdyxcclxuICAgICAgICAgICAgICAgIG9wZXJhdGl2bzogcGFyYW1ldGVycy5vcGVyYXRpdm8sXHJcbiAgICAgICAgICAgICAgICBjb25SZWFIb2dhcixcclxuICAgICAgICAgICAgICAgIGNvbmZpZ1NvcnRlbyxcclxuICAgICAgICAgICAgICAgIGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbyxcclxuICAgICAgICAgICAgICAgIC4uLnJlYXNOb1JlYXNEZWxPcGVyYXRpdm8oYmUuY2FjaGVzLnRhYmxlQ29udGVudCwgcGFyYW1ldGVycy5vcGVyYXRpdm8pLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdEluZm9ybWFjaW9uSGRyLFxyXG4gICAgICAgICAgICAgICAgdWFQcGFsOiB1bmlkYWRfYW5hbGlzaXMsXHJcbiAgICAgICAgICAgICAgICBzZW1hbmFzLFxyXG4gICAgICAgICAgICAgICAgcGtBZ3JlZ2FkYVVhUHBhbDogcGtfYWdyZWdhZGFcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2dlbmVyYXJfZm9ybXVsYXJpb3MnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnYW5uaW8nLCB0eXBlTmFtZTogJ2ludGVnZXInLCByZWZlcmVuY2VzOiAnYW5uaW8nIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ21lcycsIHR5cGVOYW1lOiAnaW50ZWdlcicsIHJlZmVyZW5jZXM6ICdtZXMnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2xvdGUnLCB0eXBlTmFtZTogJ2ludGVnZXInLCByZWZlcmVuY2VzOiAnbG90ZXMnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOkNvcmVGdW5jdGlvblBhcmFtZXRlcnM8e2FubmlvOm51bWJlciwgbWVzOm51bWJlciwgbG90ZTpudW1iZXJ9Pil7XHJcbiAgICAgICAgICAgIHZhciBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIGxldCB1YVBwYWwgPSBhd2FpdCBnZXRVQVByaW5jaXBhbChjb250ZXh0LmNsaWVudCwgT1BFUkFUSVZPKTtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdFByZWd1bnRhcyA9IGF3YWl0IGJlLnByb2NlZHVyZS5wcmVndW50YXNfdWFfdHJhZXIuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHVhUHBhbClcclxuICAgICAgICAgICAgdmFyIGNvbnRlbmVkb3JWYWNpbzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG4gICAgICAgICAgICByZXN1bHRQcmVndW50YXMuZm9yRWFjaChmdW5jdGlvbiAoZGVmUHJlZ3VudGE6YW55KSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW5lZG9yVmFjaW9bZGVmUHJlZ3VudGEudmFyX25hbWVdID0gZGVmUHJlZ3VudGEudW5pZGFkX2FuYWxpc2lzID8gW10gOiBudWxsO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29udGVuZWRvclZhY2lvLmFubmlvID0gcGFyYW1ldGVycy5hbm5pbztcclxuICAgICAgICAgICAgY29udGVuZWRvclZhY2lvLm1lcyA9IHBhcmFtZXRlcnMubWVzO1xyXG4gICAgICAgICAgICBjb250ZW5lZG9yVmFjaW8ubG90ZSA9IHBhcmFtZXRlcnMubG90ZTtcclxuXHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgZGViZV9oYWJlci5pZF9jYXNvLCBzIGFzIGlkXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSAoc2VsZWN0IGxvdGUsIGFybWFyX2lkKGFubmlvLCBtZXMsIGxvdGUsIHMpIGFzIGlkX2Nhc28sIHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAoc2VsZWN0IGFubmlvLG1lcyxsb3RlLCBjYW50X2N1ZXMgZnJvbSBsb3RlcyB3aGVyZSAoYW5uaW8sbWVzLGxvdGUpPSgkMiwkMywkNCkpIHIsIGxhdGVyYWwgZ2VuZXJhdGVfc2VyaWVzKDEsY2FudF9jdWVzKSBzXHJcbiAgICAgICAgICAgICAgICAgICAgKSBkZWJlX2hhYmVyIGxlZnQgam9pbiBkZWZnZW4gaGF5IG9uIGhheS5pZF9jYXNvID0gZGViZV9oYWJlci5pZF9jYXNvIGFuZCBoYXkub3BlcmF0aXZvPSQxXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgaGF5LmlkX2Nhc28gaXMgbnVsbGAsXHJcbiAgICAgICAgICAgICAgICBbT1BFUkFUSVZPLCBwYXJhbWV0ZXJzLmFubmlvLCBwYXJhbWV0ZXJzLm1lcywgcGFyYW1ldGVycy5sb3RlXVxyXG4gICAgICAgICAgICApLmZldGNoQWxsKCk7XHJcbiAgICAgICAgICAgIHZhciBwYXJhbXMgPSB7IG9wZXJhdGl2bzogT1BFUkFUSVZPIH07XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgKHJlc3VsdC5yb3dDb3VudCB8fCAwKTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmUuY2Fzb19ndWFyZGFyLmNvcmVGdW5jdGlvbihcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGNoYW5naW5nKHBhcmFtcywgeyBpZF9jYXNvOiByZXN1bHQucm93c1tpXS5pZF9jYXNvLCBkYXRvc19jYXNvOiBjaGFuZ2luZyhjb250ZW5lZG9yVmFjaW8sIHsgaWQ6IHJlc3VsdC5yb3dzW2ldLmlkIH0pIH0pXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHsgYWdyZWdhZGFzOiByZXN1bHQucm93Q291bnQgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAndXBsb2FkX2ZpbGUnLFxyXG4gICAgICAgIHByb2dyZXNzOiB0cnVlLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnaWRfYWRqdW50bycsIHR5cGVOYW1lOiAnaW50ZWdlcicgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnbm9tYnJlJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgZmlsZXM6e2NvdW50OjF9LFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjpmdW5jdGlvbihjb250ZXh0OlByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7aWRfYWRqdW50bz86bnVtYmVyLCBub21icmU/OnN0cmluZ30+LCBmaWxlcyl7XHJcbiAgICAgICAgICAgIGxldCBiZT1jb250ZXh0LmJlO1xyXG4gICAgICAgICAgICBsZXQgY2xpZW50PWNvbnRleHQuY2xpZW50O1xyXG4gICAgICAgICAgICBjb250ZXh0LmluZm9ybVByb2dyZXNzKHttZXNzYWdlOmJlLm1lc3NhZ2VzLmZpbGVVcGxvYWRlZH0pO1xyXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmUgZXhpc3RlXHJcbiAgICAgICAgICAgIGxldCBmaWxlID0gZmlsZXNbMF1cclxuICAgICAgICAgICAgbGV0IGV4dCA9IFBhdGguZXh0bmFtZShmaWxlLnBhdGgpLnN1YnN0cigxKTtcclxuICAgICAgICAgICAgbGV0IG9yaWdpbmFsRmlsZW5hbWUgPSBmaWxlLm9yaWdpbmFsRmlsZW5hbWUuc2xpY2UoMCwgLShleHQubGVuZ3RoICsgMSkpO1xyXG4gICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBwYXJhbWV0ZXJzLm5vbWJyZSB8fCBvcmlnaW5hbEZpbGVuYW1lO1xyXG4gICAgICAgICAgICBsZXQgbmV3UGF0aCA9ICdsb2NhbC1hdHRhY2htZW50cy9maWxlLSc7XHJcbiAgICAgICAgICAgIHZhciBjcmVhdGVSZXNwb25zZSA9IGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlKGFkanVudG9Sb3c6YW55KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0YWRvID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdMYSBzdWJpZGEgc2UgcmVhbGl6w7MgY29ycmVjdGFtZW50ZSAodXBkYXRlKScsXHJcbiAgICAgICAgICAgICAgICAgICAgbm9tYnJlOiBhZGp1bnRvUm93Lm5vbWJyZSxcclxuICAgICAgICAgICAgICAgICAgICBub21icmVfb3JpZ2luYWw6IGFkanVudG9Sb3cubm9tYnJlX29yaWdpbmFsLFxyXG4gICAgICAgICAgICAgICAgICAgIGV4dDogYWRqdW50b1Jvdy5leHQsXHJcbiAgICAgICAgICAgICAgICAgICAgZmVjaGE6IGFkanVudG9Sb3cuZmVjaGEsXHJcbiAgICAgICAgICAgICAgICAgICAgaG9yYTogYWRqdW50b1Jvdy5ob3JhLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkX2FkanVudG86IGFkanVudG9Sb3cuaWRfYWRqdW50b1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdGFkb1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICB2YXIgbW92ZUZpbGUgPSBmdW5jdGlvbiBtb3ZlRmlsZShmaWxlLCBpZF9hZGp1bnRvLCBleHRlbnNpb24pIHtcclxuICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICAgICAgZnMubW92ZShmaWxlLnBhdGgsIG5ld1BhdGggKyBpZF9hZGp1bnRvICsgJy4nICsgZXh0ZW5zaW9uLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVycy5pZF9hZGp1bnRvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY2xpZW50LnF1ZXJ5KGB1cGRhdGUgYWRqdW50b3Mgc2V0IG5vbWJyZT0gJDEsbm9tYnJlX29yaWdpbmFsID0gJDIsIGV4dCA9ICQzLCBydXRhID0gY29uY2F0KCdsb2NhbC1hdHRhY2htZW50cy9maWxlLScsJDQ6OnRleHQsJy4nLCQzOjp0ZXh0KSwgZmVjaGEgPSBub3coKSwgaG9yYSA9IGRhdGVfdHJ1bmMoJ3NlY29uZHMnLGN1cnJlbnRfdGltZXN0YW1wLWN1cnJlbnRfZGF0ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgaWRfYWRqdW50byA9ICQ0IHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbGVuYW1lLCBvcmlnaW5hbEZpbGVuYW1lLCBleHQsIHBhcmFtZXRlcnMuaWRfYWRqdW50b11cclxuICAgICAgICAgICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXNwb25zZShyZXN1bHQucm93KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdGFkbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlRmlsZShmaWxlLCByZXN1bHRhZG8uaWRfYWRqdW50bywgcmVzdWx0YWRvLmV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRhZG9cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBpbnNlcnQgaW50byBhZGp1bnRvcyAobm9tYnJlLCBub21icmVfb3JpZ2luYWwsIGV4dCwgZmVjaGEsIGhvcmEpIHZhbHVlcyAoJDEsJDIsJDMsbm93KCksIGRhdGVfdHJ1bmMoJ3NlY29uZHMnLGN1cnJlbnRfdGltZXN0YW1wLWN1cnJlbnRfZGF0ZSkpIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbGVuYW1lLCBvcmlnaW5hbEZpbGVuYW1lLCBleHRdXHJcbiAgICAgICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jbGllbnQucXVlcnkoYHVwZGF0ZSBhZGp1bnRvcyBzZXQgcnV0YSA9IGNvbmNhdCgnbG9jYWwtYXR0YWNobWVudHMvZmlsZS0nLGlkX2FkanVudG86OnRleHQsJy4nLGV4dClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGlkX2FkanVudG8gPSAkMSByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzdWx0LnJvdy5pZF9hZGp1bnRvXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVzcG9uc2UocmVzdWx0LnJvdylcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0YWRvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlRmlsZShmaWxlLCByZXN1bHRhZG8uaWRfYWRqdW50bywgcmVzdWx0YWRvLmV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0YWRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnY2Fzb19ndWFyZGFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcsIHJlZmVyZW5jZXM6ICdvcGVyYXRpdm9zJyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdpZF9jYXNvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdkYXRvc19jYXNvJywgdHlwZU5hbWU6ICdqc29uYicgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGRlZmluZWRJbjogJ2RtZW5jdScsXHJcbiAgICAgICAgLy9AdHMtaWdub3JlIGVzcGVjaWZpY28gZWwgdGlwbyBkZSBsb3MgcGFyw6FtZXRyb3NcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiB7XHJcbiAgICAgICAgICAgIG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sXHJcbiAgICAgICAgICAgIGlkX2Nhc286IHN0cmluZyxcclxuICAgICAgICAgICAgZGF0b3NfY2FzbzogQW55T2JqZWN0XHJcbiAgICAgICAgfSwgbmV3Q2xpZW50OiBDbGllbnQpIHtcclxuICAgICAgICAgICAgdmFyIHsgdW5pZGFkX2FuYWxpc2lzLCBwa19hZ3JlZ2FkYSB9ID0gKGF3YWl0IGdldFVBUHJpbmNpcGFsKGNvbnRleHQuY2xpZW50LCBwYXJhbWV0ZXJzLm9wZXJhdGl2bykpO1xyXG4gICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3Q2xpZW50IHx8IGNvbnRleHQuY2xpZW50O1xyXG4gICAgICAgICAgICB2YXIgZGF0b3NfanNvbiA9IHBhcmFtZXRlcnMuZGF0b3NfY2FzbztcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHRhYmxlU3RydWN0dXJlc19hcHA6IFRhYmxlRGVmaW5pdGlvbnMgPSBiZS50YWJsZVN0cnVjdHVyZXM7XHJcblxyXG4gICAgICAgICAgICB2YXIgc3RydWN0X2RtZW5jdSA9IGNyZWF0ZVN0cnVjdHVyZShjb250ZXh0LCB1bmlkYWRfYW5hbGlzaXMpO1xyXG4gICAgICAgICAgICBkYXRvc19qc29uWydvcGVyYXRpdm8nXSA9IHBhcmFtZXRlcnMub3BlcmF0aXZvO1xyXG5cclxuICAgICAgICAgICAgZGF0b3NfanNvbltwa19hZ3JlZ2FkYV0gPSBwYXJhbWV0ZXJzLmlkX2Nhc287XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbXBsZXRhcl91bHRfcGtfZW5fYXJyKHVsdF9wazphbnksIHVhX2FycjphbnlbXSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNvbl9wa19jb21wbGV0YSA9IHVhX2FycjtcclxuICAgICAgICAgICAgICAgIGlmICh1YV9hcnIgJiYgdWFfYXJyLmxlbmd0aCA+PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uX3BrX2NvbXBsZXRhID0gY29uX3BrX2NvbXBsZXRhLm1hcCgodW5hX3VhLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuYV91YVt1bHRfcGtdID0gaSArIDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuYV91YTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb25fcGtfY29tcGxldGFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmdW5jdGlvbiByZWNvcnJlcl9kYXRvc19hZ3JlZ2FuZG9fcGtzKGRhdG9zajogYW55KSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXlOYW1lIGluIGRhdG9zaikge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRvSyA9IGRhdG9zaltrZXlOYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0b0sgaW5zdGFuY2VvZiBBcnJheSAmJiBkYXRvSy5sZW5ndGggPj0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGsgPSB0YWJsZVN0cnVjdHVyZXNfYXBwW2tleU5hbWVdKGNvbnRleHQpLnByaW1hcnlLZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bHRfcGsgPSBwa1tway5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0b0sgPSBjb21wbGV0YXJfdWx0X3BrX2VuX2Fycih1bHRfcGssIGRhdG9LKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0b0suZm9yRWFjaCgoZWxlbUk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbUkgPSByZWNvcnJlcl9kYXRvc19hZ3JlZ2FuZG9fcGtzKGVsZW1JKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXlOYW1lLnN0YXJ0c1dpdGgoJyQnKSB8fCBrZXlOYW1lLnN0YXJ0c1dpdGgoJ18nKSB8fCBrZXlOYW1lID09ICdudWxsJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGF0b3NqW2tleU5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRvc2o7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGF0b3NfanNvbiA9IHJlY29ycmVyX2RhdG9zX2FncmVnYW5kb19wa3MoZGF0b3NfanNvbik7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLmNvZFJlYTtcclxuICAgICAgICAgICAgZGVsZXRlIGRhdG9zX2pzb24uY29kTm9SZWE7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLnJlc3VtZW5Fc3RhZG87XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLmNvZFJlYVN1cDtcclxuICAgICAgICAgICAgZGVsZXRlIGRhdG9zX2pzb24uY29kTm9SZWFTdXA7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRvc19qc29uLnJlc3VtZW5Fc3RhZG9TdXA7XHJcblxyXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGF0b3NfanNvbikubGVuZ3RoID4gMikge1xyXG4gICAgICAgICAgICAgICAgdmFyIHF1ZXJpZXMgPSBzcWxUb29scy5zdHJ1Y3R1cmVkRGF0YS5zcWxXcml0ZShkYXRvc19qc29uLCBzdHJ1Y3RfZG1lbmN1KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBxdWVyaWVzLnJlZHVjZShmdW5jdGlvbiAocHJvbWlzZTogUHJvbWlzZTxhbnk+LCBxdWVyeTogc3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQucXVlcnkocXVlcnkpLmV4ZWN1dGUoKS50aGVuKGZ1bmN0aW9uIChfcmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSkudGhlbihmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwib2tcIjtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnI6IEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcImNhc29fZ3VhcmRhciBFTlRSQSBFTiBFTCBDQVRDSDogXCIsIGV4cGVjdGVkKGVycikpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICd2YWNpbyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2Nhc29fdHJhZXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgLy97bmFtZTonZm9ybXVsYXJpbycgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWU6J3RleHQnfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgcmVmZXJlbmNlczogJ29wZXJhdGl2b3MnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2lkX2Nhc28nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByZXN1bHRPazogJ2dvVG9FbmMnLFxyXG4gICAgICAgIGRlZmluZWRJbjogJ2RtZW5jdScsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGlkX2Nhc286IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICB2YXIgeyB1bmlkYWRfYW5hbGlzaXMsIHBrX2FncmVnYWRhIH0gPSAoYXdhaXQgZ2V0VUFQcmluY2lwYWwoY29udGV4dC5jbGllbnQsIHBhcmFtZXRlcnMub3BlcmF0aXZvKSk7XHJcbiAgICAgICAgICAgIHZhciBjbGllbnQgPSBjb250ZXh0LmNsaWVudDtcclxuICAgICAgICAgICAgdmFyIHN0cnVjdF9kbWVuY3UgPSBjcmVhdGVTdHJ1Y3R1cmUoY29udGV4dCwgdW5pZGFkX2FuYWxpc2lzKTtcclxuICAgICAgICAgICAgdmFyIHNxbCA9IHNxbFRvb2xzLnN0cnVjdHVyZWREYXRhLnNxbFJlYWQoeyBvcGVyYXRpdm86IHBhcmFtZXRlcnMub3BlcmF0aXZvLCBbcGtfYWdyZWdhZGFdOiBwYXJhbWV0ZXJzLmlkX2Nhc28gfSwgc3RydWN0X2RtZW5jdSk7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQucXVlcnkoc3FsKS5mZXRjaFVuaXF1ZVZhbHVlKCk7XHJcbiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IHtcclxuICAgICAgICAgICAgICAgIG9wZXJhdGl2bzogcGFyYW1ldGVycy5vcGVyYXRpdm8sXHJcbiAgICAgICAgICAgICAgICBpZF9jYXNvOiBwYXJhbWV0ZXJzLmlkX2Nhc28sXHJcbiAgICAgICAgICAgICAgICBkYXRvc19jYXNvOiByZXN1bHQudmFsdWUsXHJcbiAgICAgICAgICAgICAgICAvL2Zvcm11bGFyaW86IGZvcm1QcmluY2lwYWwsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2Nhc29fdHJhZXJfb19jcmVhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCByZWZlcmVuY2VzOiAnb3BlcmF0aXZvcycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnaWRfY2FzbycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJlc3VsdE9rOiAnZ29Ub0VuYycsXHJcbiAgICAgICAgLy8gYml0YWNvcmE6e2Fsd2F5czp0cnVlfSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOkNvcmVGdW5jdGlvblBhcmFtZXRlcnM8e29wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGlkX2Nhc286IHN0cmluZ30+KXtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBiZS5wcm9jZWR1cmVbJ2Nhc29fdHJhZXInXS5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1ldGVycyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGpzb24gPSBhd2FpdCBiZS5wcm9jZWR1cmVbJ2Nhc29fcHJlcGFyYXInXS5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1ldGVycyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmVbJ2Nhc29fZ3VhcmRhciddLmNvcmVGdW5jdGlvbihjb250ZXh0LCBjaGFuZ2luZyhwYXJhbWV0ZXJzLCB7IGRhdG9zX2Nhc286IGpzb24gfSkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGJlLnByb2NlZHVyZVsnY2Fzb190cmFlciddLmNvcmVGdW5jdGlvbihjb250ZXh0LCBwYXJhbWV0ZXJzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAncGFzYXJfanNvbjJ1YScsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgX3BhcmFtZXRlcnM6Q29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7fT4pe1xyXG4gICAgICAgICAgICAvKiBHRU5FUkFMSVpBUjogKi9cclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgLyogRklOLUdFTkVSQUxJWkFSOiAqL1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIHZhciB7IHVuaWRhZF9hbmFsaXNpcywgcGtfYWdyZWdhZGEgfSA9IChhd2FpdCBnZXRVQVByaW5jaXBhbChjb250ZXh0LmNsaWVudCwgT1BFUkFUSVZPKSk7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHRNYWluID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFNFTEVDVCAqIGZyb20gJHtiZS5kYi5xdW90ZUlkZW50KHVuaWRhZF9hbmFsaXNpcyl9IExJTUlUIDFgKS5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICBpZiAoKHJlc3VsdE1haW4ucm93Q291bnQgfHwgMCkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnSEFZIERBVE9TJywgcmVzdWx0TWFpbi5yb3dzKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdIQVkgREFUT1MuIE5PIFNFIFBVRURFIElOSUNJQVIgRUwgUEFTQUpFJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHJlc3VsdEpzb24gPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBTRUxFQ1Qgb3BlcmF0aXZvLCBlbmMgaWRfY2FzbywganNvbl9lbmN1ZXN0YSBkYXRvc19jYXNvIGZyb20gdGVtIFxyXG4gICAgICAgICAgICAgICAgICAgIFdIRVJFIG9wZXJhdGl2bz0kMSBhbmQgcmVzdW1lbl9lc3RhZG8gaXMgZGlzdGluY3QgZnJvbSAndmFjaW8nIGFuZCBqc29uX2VuY3Vlc3RhIGlzIG5vdCBudWxsIFxyXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyIGJ5IGVuYyBgLFxyXG4gICAgICAgICAgICAgICAgW09QRVJBVElWT11cclxuICAgICAgICAgICAgKS5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICB2YXIgcHJvY2VkdXJlR3VhcmRhciA9IGJlLnByb2NlZHVyZS5jYXNvX2d1YXJkYXI7XHJcbiAgICAgICAgICAgIGlmIChwcm9jZWR1cmVHdWFyZGFyLmRlZmluZWRJbiAhPSAnZG1lbmN1Jykge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoYXkgcXVlIHNvYnJlZXNjcmliaXIgY2Fzb19ndWFyZGFyJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlc3VsdEpzb24ucm93cy5tYXAoYXN5bmMgZnVuY3Rpb24gKHJvdykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdGFkbyA9IGBpZCBjYXNvICR7cm93LmlkX2Nhc299OiBgO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBiZS5pblRyYW5zYWN0aW9uKG51bGwsIGFzeW5jIGZ1bmN0aW9uIChfY2xpZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGFkbyArPSBhd2FpdCBwcm9jZWR1cmVHdWFyZGFyLmNvcmVGdW5jdGlvbihjb250ZXh0LCByb3cpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBleHBlY3RlZChlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBlcnJNZXNzYWdlID0gcmVzdWx0YWRvICsgXCJqc29uMnVhIGVycm9yLiBcIiArIGVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0YWRvID0gZXJyTWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTWVzc2FnZSwgZXJyb3IpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0YWRvLmluY2x1ZGVzKCdvaycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHsgZGF0b3NfY2FzbywgaWRfY2Fzbywgb3BlcmF0aXZvIH0gPSBhd2FpdCBiZS5wcm9jZWR1cmUuY2Fzb190cmFlci5jb3JlRnVuY3Rpb24oY29udGV4dCwgeyBvcGVyYXRpdm86IHJvdy5vcGVyYXRpdm8sIGlkX2Nhc286IHJvdy5pZF9jYXNvIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZlclF1ZUdyYWJvID0geyBkYXRvc19jYXNvLCBpZF9jYXNvLCBvcGVyYXRpdm8gfVxyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NyZXBhbmNlcy5zaG93QW5kVGhyb3codmVyUXVlR3JhYm8sIHJvdylcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcih2ZXJRdWVHcmFibywgcm93LCBleHBlY3RlZChlcnIpKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRhZG87XHJcbiAgICAgICAgICAgIH0pKS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2RtX2ZvcnBrcmFpel9jYXJnYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdwa19yYWl6X3ZhbHVlJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcsIHJlZmVyZW5jZXM6IFwidGFyZWFzXCIgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjphc3luYyBmdW5jdGlvbihjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHtvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBwa19yYWl6X3ZhbHVlOiBzdHJpbmcsIHRhcmVhOiBzdHJpbmd9Pil7XHJcbiAgICAgICAgICAgIGNvbnN0IGJlPWNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIGNvbnN0IHtvcGVyYXRpdm8scGtfcmFpel92YWx1ZSwgdGFyZWF9ID0gcGFyYW1ldGVycztcclxuICAgICAgICAgICAgY29uc3Qge3Blcm1pdGVfYm9ycmFyX3VhOiB0YXJlYVBlcm1pdGVCb3JyYXJVQSwgbWFpbl9mb3JtfSA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgcGVybWl0ZV9ib3JyYXJfdWEsIG1haW5fZm9ybSBcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhcyBcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCB0YXJlYT0kMlxyXG4gICAgICAgICAgICBgLCBbb3BlcmF0aXZvLCB0YXJlYV0pLmZldGNoVW5pcXVlUm93KCkpLnJvdztcclxuICAgICAgICAgICAgY29uc3Qge3VuaWRhZF9hbmFsaXNpc30gPSAoYXdhaXQgZ2V0VUFQcmluY2lwYWwoY29udGV4dC5jbGllbnQsIHBhcmFtZXRlcnMub3BlcmF0aXZvKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmR2aXY9IGAgdC5vcGVyYXRpdm89ICQxIGFuZCB0LmVuYyA9JDJgO1xyXG4gICAgICAgICAgICBjb25zdCB1c3VhcmlvUHVlZGVQcm9jZXNhckVuY3Vlc3RhcyA9IGNvbnRleHQucHVlZGU/LmVuY3Vlc3Rhcz8ucHJvY2VzYXIgfHwgZmFsc2U7XHJcbiAgICAgICAgICAgIGNvbnN0IHNvbG9MZWN0dXJhID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIHNlbGVjdCBjb3VudCgqKVxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gdGFyZWFzX3RlbSBqb2luIHRlbSB1c2luZyhvcGVyYXRpdm8sIGVuYykgam9pbiBlc3RhZG9zIHVzaW5nIChvcGVyYXRpdm8sIGVzdGFkbykgLS1wayBlc3RhZG8geSB0ZW0gdmVyaWZpY2FkYVxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIGVuYyA9ICQyIGFuZCAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdhZG9fZG0gaXMgbm90IG51bGwgb3IgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBwZXJtaXRlX2VkaXRhcl9lbmN1ZXN0YSBhbmQgYXNpZ25hZG8gPD4gJHtjb250ZXh0LmJlLmRiLnF1b3RlTGl0ZXJhbChjb250ZXh0LnVzZXIuaWRwZXIpfSBvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYSA9IHRhcmVhX2FjdHVhbCBhbmQgdGFyZWFfYWN0dWFsID0gJ3Byb2MnIGFuZCAkMyBvciBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWEgPSB0YXJlYV9hY3R1YWwgYW5kIHRhcmVhX2FjdHVhbCA9ICdwcm9jJyBhbmQgZXN0YWRvID0gJ1YnXHJcbiAgICAgICAgICAgIClgLCBbb3BlcmF0aXZvLCBwa19yYWl6X3ZhbHVlLCAhdXN1YXJpb1B1ZWRlUHJvY2VzYXJFbmN1ZXN0YXNdKS5mZXRjaFVuaXF1ZVZhbHVlKCkpLnZhbHVlID4gMDtcclxuICAgICAgICAgICAgdmFyIHBlcm1pdGVHZW5lcmFyTXVlc3RyYSA9IGF3YWl0IGdldE9wZXJhdGl2b1Blcm1pdGVHZW5lcmFyTXVlc3RyYShjb250ZXh0LmNsaWVudCwgb3BlcmF0aXZvKTtcclxuICAgICAgICAgICAgdmFyIHsgcm93IH0gPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShnZXRIZHJRdWVyeShjb25kdml2LCBjb250ZXh0LCB1bmlkYWRfYW5hbGlzaXMsIHBlcm1pdGVHZW5lcmFyTXVlc3RyYSwgY29udGV4dC51c2VyLmlkcGVyKSwgW29wZXJhdGl2bywgcGtfcmFpel92YWx1ZV0pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJvdy5pbmZvcm1hY2lvbkhkcltwa19yYWl6X3ZhbHVlXS50YXJlYSA9IHtcclxuICAgICAgICAgICAgICAgIHRhcmVhLFxyXG4gICAgICAgICAgICAgICAgbWFpbl9mb3JtXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAuLi5yb3csXHJcbiAgICAgICAgICAgICAgICBvcGVyYXRpdm8sXHJcbiAgICAgICAgICAgICAgICBzb2xvTGVjdHVyYSxcclxuICAgICAgICAgICAgICAgIGlkcGVyOiBjb250ZXh0LnVzZXIuaWRwZXIsXHJcbiAgICAgICAgICAgICAgICBjYXJnYXM6IGxpa2VBci5jcmVhdGVJbmRleChjYXJnYXNIZHJDb25GZWNoYURteShyb3cuY2FyZ2FzKSwgJ2NhcmdhJyksXHJcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXBFc3RydWN0dXJhOiBiZS5jYWNoZXMudGltZXN0YW1wRXN0cnVjdHVyYSxcclxuICAgICAgICAgICAgICAgIHBlcm1pdGVCb3JyYXJFbGVtZW50b3NVQTogISEodGFyZWFQZXJtaXRlQm9ycmFyVUEgJiYgZ2V0TW9kb0J5UG9saWN5KGJlKSA9PT0gJ0dBQklORVRFJyAmJiBjb250ZXh0LnB1ZWRlPy5lbmN1ZXN0YXM/LmJvcnJhcl91YSlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2RtX2ZvcnBrcmFpel9kZXNjYXJnYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdwZXJzaXN0ZW50ZXMnLCB0eXBlTmFtZTogJ2pzb25iJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIHBlcnNpc3RlbnRlczogQW55T2JqZWN0IH0+KSB7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciB7IG9wZXJhdGl2bywgcGVyc2lzdGVudGVzIH0gPSBwYXJhbWV0ZXJzO1xyXG4gICAgICAgICAgICBjb25zdCBVQV9QUklOQ0lQQUwgPSAoYXdhaXQgZ2V0VUFQcmluY2lwYWwoY29udGV4dC5jbGllbnQsIG9wZXJhdGl2bykpLnVuaWRhZF9hbmFsaXNpcztcclxuICAgICAgICAgICAgdmFyIHByb2NlZHVyZUd1YXJkYXIgPSBiZS5wcm9jZWR1cmUuY2Fzb19ndWFyZGFyO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVzcHVlc3RhcyA9IHBlcnNpc3RlbnRlcy5yZXNwdWVzdGFzW1VBX1BSSU5DSVBBTF0gfHwge307XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWRFbmMgaW4gcmVzcHVlc3Rhcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsID0gcmVzcHVlc3Rhc1tpZEVuY107XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcHVlc3Rhc1VBUHJpbmNpcGFsLnMxYTFfb2JzID09ICchcHJ1ZWJhIGRlIGVycm9yIGFsIGdyYWJhciEnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdESU8gUFJVRUJBIERFIEVSUk9SIEFMIEdSQUJBUicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgZ3VhcmRhckVuY3Vlc3RhRW5UZW0oY29udGV4dCwgb3BlcmF0aXZvLCBpZEVuYywgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsLCBwZXJzaXN0ZW50ZXMuaW5mb3JtYWNpb25IZHJbaWRFbmNdLnRhcmVhLnRhcmVhKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHJlZ2lzdHJhclBhc2VUYWJsYShjb250ZXh0LCBvcGVyYXRpdm8sIGlkRW5jLCByZXNwdWVzdGFzVUFQcmluY2lwYWwpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdkbV9zaW5jcm9uaXphcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdwZXJzaXN0ZW50ZXMnLCB0eXBlTmFtZTogJ2pzb25iJyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdtb2RvX2RtJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdjYW1iaWFfbW9kb19kbScsIHR5cGVOYW1lOiAnYm9vbGVhbicgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnaWRwZXJfbG9ndWVhZG9fdGFibGV0JywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgdW5sb2dnZWQ6dHJ1ZSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1ldGVyczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7cGVyc2lzdGVudGVzOiBBbnlPYmplY3QsIG1vZG9fZG06IHN0cmluZywgY2FtYmlhX21vZG9fZG06IGJvb2xlYW4sIGlkcGVyX2xvZ3VlYWRvX3RhYmxldDogc3RyaW5nfT4pe1xyXG4gICAgICAgICAgICBjb25zdCBPUEVSQVRJVk8gPSBhd2FpdCBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBlcm1pdGVHZW5lcmFyTXVlc3RyYSA9IGF3YWl0IGdldE9wZXJhdGl2b1Blcm1pdGVHZW5lcmFyTXVlc3RyYShjb250ZXh0LmNsaWVudCwgT1BFUkFUSVZPKTtcclxuICAgICAgICAgICAgaWYoIXBlcm1pdGVHZW5lcmFyTXVlc3RyYSAmJiBwYXJhbWV0ZXJzLmNhbWJpYV9tb2RvX2RtKXtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdObyBlcyBwb3NpYmxlIGNhbWJpYXIgZGUgbW9kbyBlbiBlc3RlIG9wZXJhdGl2bycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciB7IHBlcnNpc3RlbnRlcywgbW9kb19kbSwgY2FtYmlhX21vZG9fZG0sIGlkcGVyX2xvZ3VlYWRvX3RhYmxldCB9ID0gcGFyYW1ldGVycztcclxuICAgICAgICAgICAgY29uc3QgdXNlcm5hbWVMb2d1ZWFkb1RhYmxldCA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgc2VsZWN0IHVzdWFyaW8gZnJvbSB1c3VhcmlvcyB3aGVyZSBpZHBlciA9ICQxYCwgW2lkcGVyX2xvZ3VlYWRvX3RhYmxldF0pLmZldGNoVW5pcXVlVmFsdWUoKSkudmFsdWU7IFxyXG4gICAgICAgICAgICB2YXIgdG9rZW46IHN0cmluZyA9IHBlcnNpc3RlbnRlcz8udG9rZW4gfHwgKGF3YWl0IGJlLnByb2NlZHVyZS50b2tlbl9nZXQuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHtcclxuICAgICAgICAgICAgICAgIHVzZXJhZ2VudDogY29udGV4dC5zZXNzaW9uLnJlcS51c2VyYWdlbnQsXHJcbiAgICAgICAgICAgICAgICB1c2VybmFtZTogdXNlcm5hbWVMb2d1ZWFkb1RhYmxldFxyXG4gICAgICAgICAgICB9KSkudG9rZW47XHJcbiAgICAgICAgICAgIGNvbnN0IG51bV9zaW5jcm8gPSAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gc2luY3Jvbml6YWNpb25lcyAodG9rZW4sIHVzdWFyaW8sIGRhdG9zKVxyXG4gICAgICAgICAgICAgICAgICAgIFZBTFVFUyAoJDEsJDIsJDMpIFxyXG4gICAgICAgICAgICAgICAgICAgIFJFVFVSTklORyBzaW5jcm9cclxuICAgICAgICAgICAgICAgIGAsIFt0b2tlbiwgdXNlcm5hbWVMb2d1ZWFkb1RhYmxldCwgcGVyc2lzdGVudGVzXVxyXG4gICAgICAgICAgICApLmZldGNoVW5pcXVlVmFsdWUoKSkudmFsdWU7XHJcbiAgICAgICAgICAgIHZhciBjb25kdml2ID0gYFxyXG4gICAgICAgICAgICAgICAgdHQub3BlcmF0aXZvPSAkMSBcclxuICAgICAgICAgICAgICAgIGFuZCBhc2lnbmFkbyA9ICQyXHJcbiAgICAgICAgICAgICAgICBhbmQgdHQub3BlcmFjaW9uPSdjYXJnYXInIFxyXG4gICAgICAgICAgICAgICAgYW5kICh0dC5jYXJnYWRvX2RtIGlzIG51bGwgb3IgdHQuY2FyZ2Fkb19kbSA9ICR7Y29udGV4dC5iZS5kYi5xdW90ZUxpdGVyYWwodG9rZW4pfSlcclxuICAgICAgICAgICAgYDtcclxuICAgICAgICAgICAgY29uc3QgeyB1bmlkYWRfYW5hbGlzaXM6IFVBX1BSSU5DSVBBTCwgcGtfYWdyZWdhZGEgfSA9IChhd2FpdCBnZXRVQVByaW5jaXBhbChjb250ZXh0LmNsaWVudCwgT1BFUkFUSVZPKSk7XHJcbiAgICAgICAgICAgIGlmIChwZXJzaXN0ZW50ZXMpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGlkRW5jIGluIHBlcnNpc3RlbnRlcy5yZXNwdWVzdGFzW1VBX1BSSU5DSVBBTF0pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsID0gcGVyc2lzdGVudGVzLnJlc3B1ZXN0YXNbVUFfUFJJTkNJUEFMXVtpZEVuY107XHJcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIEFMIFBBUkVDRVIgRVNUw4EgUkVTVUVMVE8sIExPIERFSk8gUE9SIExBUyBEVURBU1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZXNwdWVzdGFzVUFQcmluY2lwYWwpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNhcmdhID0gcGVyc2lzdGVudGVzLmNhcmdhc1twZXJzaXN0ZW50ZXMuaW5mb3JtYWNpb25IZHJbaWRFbmNdLnRlbS5jYXJnYV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJlYSA9IHBlcnNpc3RlbnRlcy5pbmZvcm1hY2lvbkhkcltpZEVuY10udGFyZWEudGFyZWE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmdhVGFyZWFzQXJlYXMgPSAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgc2VsZWN0IHJlY2VwY2lvbmlzdGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRhcmVhc19hcmVhc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0gJDEgYW5kIHRhcmVhID0gJDIgYW5kIGFyZWEgPSAkMyAtLXBrIHZlcmlmaWNhZGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbT1BFUkFUSVZPLCB0YXJlYSwgY2FyZ2EuY2FyZ2FdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXJnYVRhcmVhc0FyZWFzICYmICFjYXJnYS5yZWNlcGNpb25pc3RhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgbm8gc2UgZGVmaW5pw7MgdW4gcmVjZXBjaW9uaXN0YSBwYXJhIGVsIG9wZXJhdGl2byAke09QRVJBVElWT30sIHRhcmVhICR7dGFyZWF9LCDDoXJlYSAke2NhcmdhLmNhcmdhfSwgcG9yIGZhdm9yIGNvbXVuaXF1ZXPDqSBjb24gR0FCSU5FVEUgcGFyYSBxdWUgY2FyZ3VlbiB1biByZWNlcGNpb25pc3RhYClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTnVtYmVyKGlkRW5jKSA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlkRW5jIGVzIGxhIGNsYXZlICh0ZXh0bykgZGUgcGVyc2lzdGVudGVzLnJlc3B1ZXN0YXM7IGxhcyBmdW5jaW9uZXMgcXVlIHNpZ3VlbiBsbyByZWNpYmVuIGNvbW8gdGV4dG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkRW5jID0gU3RyaW5nKGF3YWl0IHBlcnNpc3RpckVuY3Vlc3RhQXV0b2dlbmVyYWRhRW5ETShjb250ZXh0LCBPUEVSQVRJVk8sIGNhcmdhLmNhcmdhLCBpZEVuYywgdG9rZW4sIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCwgY2FyZ2EucmVjZXBjaW9uaXN0YSB8fCBjYXJnYVRhcmVhc0FyZWFzLCBwZXJzaXN0ZW50ZXMuaWRwZXIsIG1vZG9fZG0gYXMgTW9kb0RNLCBjYW1iaWFfbW9kb19kbSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwdWVkb0d1YXJkYXJFblRFTSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25zdWx0YVRhcmVhc1RlbSA9IGNvbnN1bHRhVXBkYXRlVGFyZWFzVGVtUG9yRGVzY2FyZ2Eoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aXZvOiBPUEVSQVRJVk8sIGlkRW5jLCB0YXJlYSwgdG9rZW4sIHJlc3B1ZXN0YXNVQVByaW5jaXBhbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc2FBRGVzY2FyZ2FyOiBjYW1iaWFfbW9kb19kbSB8fCBwZXJzaXN0ZW50ZXMuaWRwZXIgIT0gaWRwZXJfbG9ndWVhZG9fdGFibGV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVlcnlUYXJlYXNUZW0gPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShjb25zdWx0YVRhcmVhc1RlbS5zcWwsIGNvbnN1bHRhVGFyZWFzVGVtLnBhcmFtcykuZmV0Y2hPbmVSb3dJZkV4aXN0cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwdWVkb0d1YXJkYXJFblRFTSA9IHF1ZXJ5VGFyZWFzVGVtLnJvd0NvdW50ID09IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdWVkb0d1YXJkYXJFblRFTSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ3VhcmRhckVuY3Vlc3RhRW5UZW0oY29udGV4dCwgT1BFUkFUSVZPLCBpZEVuYywgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsLCB0YXJlYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWdpc3RyYXJQYXNlVGFibGEoY29udGV4dCwgT1BFUkFUSVZPLCBpZEVuYywgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGZzLmFwcGVuZEZpbGUoJ2xvY2FsLXJlY2liaWRvLXNpbi10b2tlbi50eHQnLCBKU09OLnN0cmluZ2lmeSh7IG5vdzogbmV3IERhdGUoKSwgaWRwZXI6IHBlcnNpc3RlbnRlcy5pZHBlciwgaWRDYXNvOiBpZEVuYywgW3BrX2FncmVnYWRhXTogcmVzcHVlc3Rhc1VBUHJpbmNpcGFsIH0pICsgJ1xcblxcbicsICd1dGY4Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHsgcm93IH0gPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShnZXRIZHJRdWVyeShjb25kdml2LCBjb250ZXh0LCBVQV9QUklOQ0lQQUwsIHBlcm1pdGVHZW5lcmFyTXVlc3RyYSwgaWRwZXJfbG9ndWVhZG9fdGFibGV0KSwgW09QRVJBVElWTywgaWRwZXJfbG9ndWVhZG9fdGFibGV0XSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgdXBkYXRlIHRhcmVhc190ZW0gdHRcclxuICAgICAgICAgICAgICAgICAgICBzZXQgIGVzdGFkbyA9ICQ0LCBjYXJnYWRvX2RtPSQzOjp0ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgJHtjb25kdml2fSBcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgZW5jYFxyXG4gICAgICAgICAgICAgICAgLFxyXG4gICAgICAgICAgICAgICAgW09QRVJBVElWTywgaWRwZXJfbG9ndWVhZG9fdGFibGV0LCB0b2tlbiwgRVNUQURPX1BPU1RFUklPUl9DQVJHQV1cclxuICAgICAgICAgICAgKS5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgLi4ucm93LFxyXG4gICAgICAgICAgICAgICAgb3BlcmF0aXZvOiBPUEVSQVRJVk8sXHJcbiAgICAgICAgICAgICAgICBzb2xvTGVjdHVyYTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB0b2tlbixcclxuICAgICAgICAgICAgICAgIG51bV9zaW5jcm8sXHJcbiAgICAgICAgICAgICAgICBpZHBlcjogaWRwZXJfbG9ndWVhZG9fdGFibGV0LFxyXG4gICAgICAgICAgICAgICAgY2FyZ2FzOiBsaWtlQXIuY3JlYXRlSW5kZXgoY2FyZ2FzSGRyQ29uRmVjaGFEbXkocm93LmNhcmdhcykubWFwKGNhcmdhID0+ICh7IC4uLmNhcmdhLCBlc3RhZG9fY2FyZ2E6ICdyZWxldmFtaWVudG8nIH0pKSwgJ2NhcmdhJylcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdkbV9iYWNrdXAnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAndG9rZW4nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RlbScsIHR5cGVOYW1lOiAnanNvbmInIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ21vZG9fZG0nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICB1bmxvZ2dlZDogdHJ1ZSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbWV0ZXJzOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgdG9rZW46IHN0cmluZyB8IG51bGwsIHRlbTogQW55T2JqZWN0LCBtb2RvX2RtOiBNb2RvRE0gfT4pIHtcclxuICAgICAgICAgICAgdmFyIHsgYmUsIGNsaWVudCB9ID0gY29udGV4dDtcclxuICAgICAgICAgICAgY29uc3QgT1BFUkFUSVZPID0gYXdhaXQgZ2V0T3BlcmF0aXZvQWN0dWFsKGNvbnRleHQpO1xyXG4gICAgICAgICAgICB2YXIgbnVtX3NpbmNybzogbnVtYmVyID0gMDtcclxuICAgICAgICAgICAgdmFyIHRva2VuOiBzdHJpbmcgfCBudWxsID0gcGFyYW1ldGVycy50b2tlbjtcclxuICAgICAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IG9rOiAnb2s6Ti9UJyB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdmFyIHsgcm93Q291bnQgfSA9IGF3YWl0IGNsaWVudC5xdWVyeShgc2VsZWN0IDEgZnJvbSB0b2tlbnMgd2hlcmUgdG9rZW4gPSAkMWAsIFt0b2tlbl0pLmZldGNoT25lUm93SWZFeGlzdHMoKTtcclxuICAgICAgICAgICAgICAgIGlmICghcm93Q291bnQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBvazogJ29rOk4vVCcgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgeyB1bmlkYWRfYW5hbGlzaXMsIHBrX2FncmVnYWRhIH0gPSAoYXdhaXQgZ2V0VUFQcmluY2lwYWwoY29udGV4dC5jbGllbnQsIE9QRVJBVElWTykpO1xyXG4gICAgICAgICAgICBpZiAocGFyYW1ldGVycy50ZW0pIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGJhY2t1cCBvZiBsaWtlQXIocGFyYW1ldGVycy50ZW0pLmFycmF5KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYXJlYSA9IGJhY2t1cC5jYXJnYS5jYXJnYTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcHVlc3Rhc1JhaXogPSBiYWNrdXAucmVzcHVlc3Rhc1JhaXo7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkRW5jRE0gPSBiYWNrdXAuZm9yUGtSYWl6W3BrX2FncmVnYWRhXS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZWNlcGNpb25pc3RhID0gYmFja3VwLmNhcmdhLnJlY2VwY2lvbmlzdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFzaWduYWRvID0gYmFja3VwLmlkcGVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIoaWRFbmNETSkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHBlcnNpc3RpckVuY3Vlc3RhQXV0b2dlbmVyYWRhRW5ETShjb250ZXh0LCBPUEVSQVRJVk8sIGFyZWEsIGlkRW5jRE0sIHRva2VuLCByZXNwdWVzdGFzUmFpeiwgcmVjZXBjaW9uaXN0YSwgYXNpZ25hZG8sIHBhcmFtZXRlcnMubW9kb19kbSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGpzb25fYmFja3VwID0gJDMsIGZlY2hhX2JhY2t1cCA9IGN1cnJlbnRfdGltZXN0YW1wXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDIgYW5kIGpzb25fYmFja3VwIGlzIGRpc3RpbmN0IGZyb20gJDRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgJ29rJ2BcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtPUEVSQVRJVk8sIGlkRW5jRE0sIHJlc3B1ZXN0YXNSYWl6LCByZXNwdWVzdGFzUmFpel1cclxuICAgICAgICAgICAgICAgICAgICAgICAgKS5mZXRjaE9uZVJvd0lmRXhpc3RzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgb2s6ICdvaydcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2NvbnNpc3Rpcl92aXZpZW5kYScsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCByZWZlcmVuY2VzOiAnb3BlcmF0aXZvcycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnY2FzbycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBjYXNvOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgdmFyIHsgYmUsIGNsaWVudCB9ID0gY29udGV4dDtcclxuICAgICAgICAgICAgbGV0IHBhcmFtX3Byb2MgPSB7XHJcbiAgICAgICAgICAgICAgICBvcGVyYXRpdm86IHBhcmFtZXRlcnMub3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgaWRfY2FzbzogcGFyYW1ldGVycy5jYXNvXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGVyck1lc3NhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0YWRvOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdGFkbyA9IGF3YWl0IGJlLnByb2NlZHVyZS5jb25zaXN0aXJfZW5jdWVzdGEuY29yZUZ1bmN0aW9uKGNvbnRleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1fcHJvY1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSB1bmV4cGVjdGVkKGVycik7XHJcbiAgICAgICAgICAgICAgICBlcnJNZXNzYWdlID0gXCIgY29uc2lzdGlyX2Nhc28uIFwiICsgZXJyb3IubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTWVzc2FnZSwgZXJyb3IpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coJyoqKioqKiBjb25zaXN0aXJfY2FzbyByZXN1bHRhZG86JywgcmVzdWx0YWRvKVxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgb2s6ICdvaydcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdkbV9yZXNjYXRhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdsb2NhbFN0b3JhZ2VJdGVtJywgdHlwZU5hbWU6ICdqc29uYicgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnbG9jYWxTdG9yYWdlSXRlbUtleScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHVubG9nZ2VkOiB0cnVlLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IGxvY2FsU3RvcmFnZUl0ZW1LZXk6IHN0cmluZywgbG9jYWxTdG9yYWdlSXRlbTogQW55T2JqZWN0IH0+KSB7XHJcbiAgICAgICAgICAgIHZhciB7IGxvY2FsU3RvcmFnZUl0ZW1LZXksIGxvY2FsU3RvcmFnZUl0ZW0gfSA9IHBhcmFtcztcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxvY2FsU3RvcmFnZUl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZnMuYXBwZW5kRmlsZSgnbG9jYWwtcmVzY2F0ZS50eHQnLCBKU09OLnN0cmluZ2lmeSh7IG5vdzogbmV3IERhdGUoKSwgdXNlcjogY29udGV4dC51c2VybmFtZSwgaXRlbUtleTogbG9jYWxTdG9yYWdlSXRlbUtleSwgaXRlbURhdGE6IGxvY2FsU3RvcmFnZUl0ZW0gfSkgKyAnXFxuXFxuJywgJ3V0ZjgnKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0VSUk9SJywgZXhwZWN0ZWQoZXJyKSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ29wZXJhdGl2b19nZXQnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6W10sXHJcbiAgICAgICAgdW5sb2dnZWQ6dHJ1ZSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246YXN5bmMgZnVuY3Rpb24oY29udGV4dDpQcm9jZWR1cmVDb250ZXh0LCBfcGFyYW1ldGVyczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHt9Pil7XHJcbiAgICAgICAgICAgIHJldHVybiBnZXRPcGVyYXRpdm9BY3R1YWwoY29udGV4dClcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2dldF9yYW5kb21fZnJlZV9jYXNlJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9XSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvIH0+KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbnNUb0V4cGlyZSA9IDMwO1xyXG4gICAgICAgICAgICBjb25zdCBtaW5zU2luY2VCbG9xdWVkID0gYGRhdGVfcGFydCgnbWluJywgYWdlKGN1cnJlbnRfdGltZXN0YW1wLCBmZWNoYV9ibG9xdWVvKSlgO1xyXG4gICAgICAgICAgICBjb25zdCBlbmMgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgc2VsZWN0IGVuYyBmcm9tIHRlbSB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIChsaWJyZSBvciAke21pbnNTaW5jZUJsb3F1ZWR9ID4gJHttaW5zVG9FeHBpcmV9KSBsaW1pdCAxO2AsIFtwYXJhbXMub3BlcmF0aXZvXSkuZmV0Y2hVbmlxdWVWYWx1ZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgVVBEQVRFIHRlbSBzZXQgbGlicmUgPSBmYWxzZSwgZmVjaGFfYmxvcXVlbz1jdXJyZW50X3RpbWVzdGFtcCB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMmAsIFtwYXJhbXMub3BlcmF0aXZvLCBlbmMudmFsdWVdKS5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBlbmMudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdtdWVzdHJhX2dlbmVyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JywgcmVmZXJlbmNlczogXCJvcGVyYXRpdm9zXCIgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnYXJlYScsIHR5cGVOYW1lOiAnaW50ZWdlcicsIHJlZmVyZW5jZXM6IFwiYXJlYXNcIiB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdkb21pbmlvJywgdHlwZU5hbWU6ICdpbnRlZ2VyJywgZGVmYXVsdFZhbHVlOiAzIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2NhbnRfZW5jdWVzdGFzJywgdHlwZU5hbWU6ICdpbnRlZ2VyJyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYV9hY3R1YWwnLCB0eXBlTmFtZTogJ3RleHQnLCByZWZlcmVuY2VzOiAndGFyZWFzJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgYXJlYTogbnVtYmVyLCBkb21pbmlvOiBudW1iZXIsIGNhbnRfZW5jdWVzdGFzOiBudW1iZXIsIHRhcmVhX2FjdHVhbDogSWRUYXJlYSB9Pikge1xyXG4gICAgICAgICAgICBjb25zdCBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciBwZXJtaXRlR2VuZXJhck11ZXN0cmEgPSBhd2FpdCBnZXRPcGVyYXRpdm9QZXJtaXRlR2VuZXJhck11ZXN0cmEoY29udGV4dC5jbGllbnQsIHBhcmFtcy5vcGVyYXRpdm8pO1xyXG4gICAgICAgICAgICBpZiAocGVybWl0ZUdlbmVyYXJNdWVzdHJhKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdG90YWxBY3R1YWwgPSAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgYHNlbGVjdCBjb3VudCgqKSBhcyB0b3RhbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89ICQxIGFuZCBhcmVhID0gJDJgLFxyXG4gICAgICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuYXJlYV1cclxuICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcGFyYW1zLmNhbnRfZW5jdWVzdGFzIC0gdG90YWxBY3R1YWw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuYyA9IGF3YWl0IGdlbmVyYXJOdWV2b0lkRW5jKGNvbnRleHQsIHBhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5hcmVhLCBtYXhBRW5jUG9yQXJlYSlcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBnZW5lcmFyRW5jdWVzdGFUZW0oY29udGV4dCwgcGFyYW1zLm9wZXJhdGl2bywgZW5jLCBwYXJhbXMuYXJlYSwgcGFyYW1zLmRvbWluaW8sIHBhcmFtcy50YXJlYV9hY3R1YWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgZ2VuZXJhclRhcmVhc1RlbUZhbHRhbnRlcyhjb250ZXh0LCBwYXJhbXMub3BlcmF0aXZvKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJlbCBvcGVyYXRpdm8gbm8gcGVybWl0ZSBnZW5lcmFyIG11ZXN0cmFcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ211ZXN0cmFfYWdyZWdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnLCByZWZlcmVuY2VzOiBcIm9wZXJhdGl2b3NcIiB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdhcmVhJywgdHlwZU5hbWU6ICdpbnRlZ2VyJywgcmVmZXJlbmNlczogXCJhcmVhc1wiIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2RvbWluaW8nLCB0eXBlTmFtZTogJ2ludGVnZXInLCBkZWZhdWx0VmFsdWU6IDMgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnY2FudF9lbmN1ZXN0YXMnLCB0eXBlTmFtZTogJ2ludGVnZXInIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhX2FjdHVhbCcsIHR5cGVOYW1lOiAndGV4dCcsIHJlZmVyZW5jZXM6ICd0YXJlYXMnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBhcmVhOiBudW1iZXIsIGRvbWluaW86IG51bWJlciwgY2FudF9lbmN1ZXN0YXM6IG51bWJlciwgdGFyZWFfYWN0dWFsOiBJZFRhcmVhIH0+KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHBlcm1pdGVHZW5lcmFyTXVlc3RyYSA9IGF3YWl0IGdldE9wZXJhdGl2b1Blcm1pdGVHZW5lcmFyTXVlc3RyYShjb250ZXh0LmNsaWVudCwgcGFyYW1zLm9wZXJhdGl2byk7XHJcbiAgICAgICAgICAgIGlmIChwZXJtaXRlR2VuZXJhck11ZXN0cmEpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHBhcmFtcy5jYW50X2VuY3Vlc3RhczsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5jID0gYXdhaXQgZ2VuZXJhck51ZXZvSWRFbmMoY29udGV4dCwgcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmFyZWEsIG1heEFFbmNQb3JBcmVhKVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGdlbmVyYXJFbmN1ZXN0YVRlbShjb250ZXh0LCBwYXJhbXMub3BlcmF0aXZvLCBlbmMsIHBhcmFtcy5hcmVhLCBwYXJhbXMuZG9taW5pbywgcGFyYW1zLnRhcmVhX2FjdHVhbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBnZW5lcmFyVGFyZWFzVGVtRmFsdGFudGVzKGNvbnRleHQsIHBhcmFtcy5vcGVyYXRpdm8pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcImVsIG9wZXJhdGl2byBubyBwZXJtaXRlIGdlbmVyYXIgbXVlc3RyYVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfYmxhbnF1ZWFyX3ByZXZpc3VhbGl6YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JywgcmVmZXJlbmNlczogXCJvcGVyYXRpdm9zXCIgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcm9sZXM6IFsnY29vcl9wcm9jJywgJ2Nvb3JfY2FtcG8nLCAnYWRtaW4nXSxcclxuICAgICAgICByZXN1bHRPazogJ21vc3RyYXJfZW5jdWVzdGFfYV9ibGFucXVlYXJfY29udGVuaWRvJyxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBlbmM6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYnVzY2FyRW5jdWVzdGFFblRlbShjb250ZXh0LCBwYXJhbXMpO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfYmxhbnF1ZWFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcsIHJlZmVyZW5jZXM6IFwib3BlcmF0aXZvc1wiIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHJvbGVzOiBbJ2Nvb3JfcHJvYycsICdzdWJjb29yX2NhbXBvJywgJ2Nvb3JfY2FtcG8nLCAnYWRtaW4nXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBlbmM6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgeyB1bmlkYWRfYW5hbGlzaXMsIHBrX2FncmVnYWRhIH0gPSAoYXdhaXQgZ2V0VUFQcmluY2lwYWwoY29udGV4dC5jbGllbnQsIHBhcmFtcy5vcGVyYXRpdm8pKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gJHtiZS5kYi5xdW90ZUlkZW50KHVuaWRhZF9hbmFsaXNpcyl9IFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgJHtiZS5kYi5xdW90ZUlkZW50KHBrX2FncmVnYWRhKX0gPSAkMlxyXG4gICAgICAgICAgICBgLCBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAvL3Bhc28gYSBlbmN1IHBhcmEgZ3VhcmRhciBlbiBoaXN0b3JpYWxcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWFfYWN0dWFsID0gJ2VuY3UnXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyIC0tcGsgdmVyaWZpY2FkYVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgICAgIGAsIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gdGFyZWFzX3RlbSBcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgYCwgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmNdKS5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGdlbmVyYXJUYXJlYXNUZW1GYWx0YW50ZXMoY29udGV4dCwgcGFyYW1zLm9wZXJhdGl2byk7XHJcbiAgICAgICAgICAgIC8vcmVzZXRlbyB0ZW0gKG5vIHNlIGd1YXJkYSBoaXN0b3JpYWwgcG9ycXVlIHRhcmVhX2FjdHVhbCBlcyBudWxsKVxyXG4gICAgICAgICAgICAvL2d1YXJkbyBiYWNrdXAgcG9yIGxhcyBkdWRhc1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uX2JhY2t1cCA9IGpzb25fZW5jdWVzdGEsIGpzb25fZW5jdWVzdGEgPSBudWxsLCB0YXJlYV9hY3R1YWwgPSBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmZWNoYV9tb2RpZl9lbmN1ZXN0YSA9IG51bGwsIGZlY2hhX2JhY2t1cCA9IGN1cnJlbnRfdGltZXN0YW1wLCBtb2RpZmljYWRvID0gbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lbl9lc3RhZG8gPSBudWxsLCByZXN1bWVuX2VzdGFkb19zdXAgPSBudWxsLCBzdXBlcnZpc2lvbl9kaXJpZ2lkYSA9IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc2VfdGFibGEgPSBudWxsLCByZWEgPSBudWxsLCBub3JlYSA9IG51bGwsIHJlYV9zdXAgPSBudWxsLCBub3JlYV9zdXAgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyIC0tcGsgdmVyaWZpY2FkYVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgICAgIGAsIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gaW5jb25zaXN0ZW5jaWFzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kICR7YmUuZGIucXVvdGVJZGVudChwa19hZ3JlZ2FkYSl9ID0gJDJcclxuICAgICAgICAgICAgYCwgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmNdKS5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBcclxuICAgICAgICAgICAgICAgICAgICBmcm9tIGluX2Nvbl92YXJcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgcGtfaW50ZWdyYWRhLT4+JHtiZS5kYi5xdW90ZUxpdGVyYWwocGtfYWdyZWdhZGEpfSA9ICQyXHJcbiAgICAgICAgICAgIGAsIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBkZWxldGUgXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSBpbmNvbnNpc3RlbmNpYXNfdWx0aW1hc1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCBwa19pbnRlZ3JhZGEtPj4ke2JlLmRiLnF1b3RlTGl0ZXJhbChwa19hZ3JlZ2FkYSl9ID0gJDJcclxuICAgICAgICAgICAgYCwgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmNdKS5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBgbGEgZW5jdWVzdGEgJHtwYXJhbXMuZW5jfSBzZSBibGFucXVlw7MgY29ycmVjdGFtZW50ZWA7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ib3JyYXJfcHJldmlzdWFsaXphcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnLCByZWZlcmVuY2VzOiBcIm9wZXJhdGl2b3NcIiB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByb2xlczpbJ2Nvb3JfcHJvYycsJ3N1YmNvb3JfY2FtcG8nLCdjb29yX2NhbXBvJywnYWRtaW4nXSxcclxuICAgICAgICByZXN1bHRPazonbW9zdHJhcl9lbmN1ZXN0YV9hX2JvcnJhcicsXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOkNvcmVGdW5jdGlvblBhcmFtZXRlcnM8e29wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGVuYzogc3RyaW5nfT4pe1xyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYnVzY2FyRW5jdWVzdGFFblRlbShjb250ZXh0LHBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ib3JyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JywgcmVmZXJlbmNlczogXCJvcGVyYXRpdm9zXCIgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcm9sZXM6IFsnY29vcl9wcm9jJywgJ3N1YmNvb3JfY2FtcG8nLCAnY29vcl9jYW1wbycsICdhZG1pbiddLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGVuYzogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciBwZXJtaXRlX2dlbmVyYXJfbXVlc3RyYSA9IGF3YWl0IGdldE9wZXJhdGl2b1Blcm1pdGVHZW5lcmFyTXVlc3RyYShjb250ZXh0LmNsaWVudCwgcGFyYW1zLm9wZXJhdGl2byk7XHJcbiAgICAgICAgICAgIGlmIChwZXJtaXRlX2dlbmVyYXJfbXVlc3RyYSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHsgdW5pZGFkX2FuYWxpc2lzLCBwa19hZ3JlZ2FkYSB9ID0gKGF3YWl0IGdldFVBUHJpbmNpcGFsKGNvbnRleHQuY2xpZW50LCBwYXJhbXMub3BlcmF0aXZvKSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNhc29UZW0gfSA9IGF3YWl0IGJ1c2NhckVuY3Vlc3RhRW5UZW0oY29udGV4dCwgcGFyYW1zKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICBpbnNlcnQgaW50byBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtX2JvcnJhZGFzIChvcGVyYXRpdm8sIGVuYywgY3VhbmRvLCBhcmVhLCBjbHVzdGVyLCBkb21pbmlvLCB0YXJlYV9hY3R1YWwsIGpzb25fZW5jdWVzdGEsIHRva2VuX2F1dG9nZW5lcmFkb19kbSwgZW5jX2F1dG9nZW5lcmFkb19kbSwgZW5jX2F1dG9nZW5lcmFkb19kbV9jYXBhLCBwcm9pZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzICgkMSwkMixjdXJyZW50X3RpbWVzdGFtcCwkMywkNCwkNSwkNiwkNywkOCwkOSwkMTAsJDExKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKlxyXG4gICAgICAgICAgICAgICAgICAgIGAsIFtcclxuICAgICAgICAgICAgICAgICAgICBjYXNvVGVtLm9wZXJhdGl2byxcclxuICAgICAgICAgICAgICAgICAgICBjYXNvVGVtLmVuYyxcclxuICAgICAgICAgICAgICAgICAgICBjYXNvVGVtLmFyZWEsXHJcbiAgICAgICAgICAgICAgICAgICAgY2Fzb1RlbS5jbHVzdGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIGNhc29UZW0uZG9taW5pbyxcclxuICAgICAgICAgICAgICAgICAgICBjYXNvVGVtLnRhcmVhX2FjdHVhbCxcclxuICAgICAgICAgICAgICAgICAgICBjYXNvVGVtLmpzb25fZW5jdWVzdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgY2Fzb1RlbS50b2tlbl9hdXRvZ2VuZXJhZG9fZG0sXHJcbiAgICAgICAgICAgICAgICAgICAgY2Fzb1RlbS5lbmNfYXV0b2dlbmVyYWRvX2RtLFxyXG4gICAgICAgICAgICAgICAgICAgIGNhc29UZW0uZW5jX2F1dG9nZW5lcmFkb19kbV9jYXBhLFxyXG4gICAgICAgICAgICAgICAgICAgIGNhc29UZW0ucHJvaWVcclxuICAgICAgICAgICAgICAgIF0pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICBgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICR7YmUuZGIucXVvdGVJZGVudCh1bmlkYWRfYW5hbGlzaXMpfSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCAke2JlLmRiLnF1b3RlSWRlbnQocGtfYWdyZWdhZGEpfSA9ICQyXHJcbiAgICAgICAgICAgICAgICBgLCBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGFyZWFzX3RlbSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgICAgICAgICBgLCBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmZldGNoQWxsKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgLS1wayB2ZXJpZmljYWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqXHJcbiAgICAgICAgICAgICAgICBgLCBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGhpc3RvcmlhbF90ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyIC0tcGsgdmVyaWZpY2FkYVxyXG4gICAgICAgICAgICAgICAgYCwgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmNdKS5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGluY29uc2lzdGVuY2lhc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgJHtiZS5kYi5xdW90ZUlkZW50KHBrX2FncmVnYWRhKX0gPSAkMlxyXG4gICAgICAgICAgICAgICAgYCwgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmNdKS5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGluX2Nvbl92YXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIHBrX2ludGVncmFkYS0+PiR7YmUuZGIucXVvdGVMaXRlcmFsKHBrX2FncmVnYWRhKX0gPSAkMlxyXG4gICAgICAgICAgICAgICAgYCwgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmNdKS5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGluY29uc2lzdGVuY2lhc191bHRpbWFzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCBwa19pbnRlZ3JhZGEtPj4ke2JlLmRiLnF1b3RlTGl0ZXJhbChwa19hZ3JlZ2FkYSl9ID0gJDJcclxuICAgICAgICAgICAgICAgIGAsIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jXSkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBsYSBlbmN1ZXN0YSAke3BhcmFtcy5lbmN9IHNlIGJvcnLDsyBjb3JyZWN0YW1lbnRlYDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdubyBzZSBwdWVkZSBib3JyYXIgbGEgZW5jdWVzdGEgcG9ycXVlIGVsIG9wZXJhdGl2byB0aWVuZSBtdWVzdHJhIGVzdMOhdGljYScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YXNfY2FwYWNpdGFjaW9uX2JvcnJhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnLCByZWZlcmVuY2VzOiBcIm9wZXJhdGl2b3NcIiB9XHJcbiAgICAgICAgXSxcclxuICAgICAgICByb2xlczogWydhZG1pbiddLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8gfT4pIHtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgdmFyIHBlcm1pdGVfZ2VuZXJhcl9tdWVzdHJhID0gYXdhaXQgZ2V0T3BlcmF0aXZvUGVybWl0ZUdlbmVyYXJNdWVzdHJhKGNvbnRleHQuY2xpZW50LCBwYXJhbXMub3BlcmF0aXZvKTtcclxuICAgICAgICAgICAgaWYgKHBlcm1pdGVfZ2VuZXJhcl9tdWVzdHJhKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmNzQUJvcnJhciA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgICAgICBgc2VsZWN0ICogXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jX2F1dG9nZW5lcmFkb19kbV9jYXBhIGlzIG5vdCBudWxsXHJcbiAgICAgICAgICAgICAgICBgLCBbcGFyYW1zLm9wZXJhdGl2b10pLmZldGNoQWxsKCkpLnJvd3M7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCByb3cgb2YgZW5jc0FCb3JyYXIpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmUuZW5jdWVzdGFfYm9ycmFyLmNvcmVGdW5jdGlvbihjb250ZXh0LCB7IG9wZXJhdGl2bzogcGFyYW1zLm9wZXJhdGl2bywgZW5jOiByb3cuZW5jIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3NlIGJvcnJhcm9uIGxhcyBlbmN1ZXN0YXMgZGUgY2FwYWNpdGFjacOzbic7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignbm8gc2UgcHVlZGUgYm9ycmFyIGxhIGVuY3Vlc3RhIHBvcnF1ZSBlbCBvcGVyYXRpdm8gdGllbmUgbXVlc3RyYSBlc3TDoXRpY2EnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnYWNjaW9uX3RhcmVhc190ZW1fZWplY3V0YXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdjb25kaWNpb24nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2FjY2lvbicsIHR5cGVOYW1lOiAnanNvbmInIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCB0YXJlYTogc3RyaW5nLCBlbmM6IHN0cmluZywgY29uZGljaW9uOiBzdHJpbmcsIGFjY2lvbjogRXN0YWRvQWNjaW9uIH0+KSB7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIHZhciBhY2Npb24gPSBwYXJhbXMuYWNjaW9uIGFzIEVzdGFkb0FjY2lvbjtcclxuICAgICAgICAgICAgdmFyIGN1bXBsZTogYm9vbGVhbiA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShcclxuICAgICAgICAgICAgICAgIGBzZWxlY3QgYWNjaW9uX2N1bXBsZV9jb25kaWNpb24oJDUsICQ2LCAkNywgJDgsIChcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3QgY29uZGljaW9uIFxyXG4gICAgICAgICAgICAgICAgICAgICAgZnJvbSBlc3RhZG9zX2FjY2lvbmVzIFxyXG4gICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVzdGFkbyA9ICQyIGFuZCBlYWNjaW9uID0gJDMgYW5kIGVzdGFkb19kZXN0aW5vID0gJDRcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKWAsIFtcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5vcGVyYXRpdm8sXHJcbiAgICAgICAgICAgICAgICBhY2Npb24uZXN0YWRvLFxyXG4gICAgICAgICAgICAgICAgYWNjaW9uLmVhY2Npb24sXHJcbiAgICAgICAgICAgICAgICBhY2Npb24uZXN0YWRvX2Rlc3Rpbm8sXHJcbiAgICAgICAgICAgICAgICBwYXJhbXMub3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgYWNjaW9uLmVzdGFkbyxcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5lbmMsXHJcbiAgICAgICAgICAgICAgICBhY2Npb24uZWFjY2lvbixcclxuICAgICAgICAgICAgXSkuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZTtcclxuICAgICAgICAgICAgaWYgKCFjdW1wbGUpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBObyBzZSBwdWRvIGVqZWN1dGFyIGxhIGFjY2nDs24sIG5vIHNlIGN1bXBsZSBsYSBjb25kaWNpw7NuIFwiJHtwYXJhbXMuY29uZGljaW9ufVwiIG8gYmllbiBlbCBlc3RhZG8gZXN0w6EgZGVzYWN0dWFsaXphZG8sIHJlZnJlc3F1ZSBsYSBncmlsbGEuYClcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtIFxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG8gPSAkNFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVuYz0kMiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRhcmVhID0gJDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm9wZXJhdGl2byxcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZW5jLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy50YXJlYSxcclxuICAgICAgICAgICAgICAgICAgICBhY2Npb24uZXN0YWRvX2Rlc3Rpbm9cclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBpZiAoYWNjaW9uLm5vbWJyZV9wcm9jZWR1cmUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChiZS5wcm9jZWR1cmVbYWNjaW9uLm5vbWJyZV9wcm9jZWR1cmVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlW2FjY2lvbi5ub21icmVfcHJvY2VkdXJlXS5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1zKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgTm8gZXhpc3RlIGVsIHByb2NlZHVyZSBcIiR7YWNjaW9uLm5vbWJyZV9wcm9jZWR1cmV9XCIgZGVmaW5pZG8gZW4gbGEgdGFibGEgXCJlc3RhZG9zX2FjY2lvbmVzXCIgcGFyYSBlbFxyXG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdGl2bzogJHthY2Npb24ub3BlcmF0aXZvfSwgZXN0YWRvOiAke2FjY2lvbi5lc3RhZG99LCBlYWNjaW9uOiAke2FjY2lvbi5lYWNjaW9ufS5gKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEJVU0NPIFBBU0UgREUgVEFSRUFcclxuICAgICAgICAgICAgdmFyIHRhcmVhU2lndWllbnRlID0gKGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgYHNlbGVjdCAqXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSB0YXJlYXNfcHJveGltYXNcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aXZvID0gJDEgYW5kIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYSA9ICQyIGFuZCBlc3RhZG8gPSAkMyBhbmQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhX2N1bXBsZV9jb25kaWNpb24oJDQsICQ1LCAkNiwgJDcsIGNvbmRpY2lvbilcclxuICAgICAgICAgICAgICAgICAgICBvcmRlciBieSBvcmRlblxyXG4gICAgICAgICAgICAgICAgICAgIGxpbWl0IDFgXHJcbiAgICAgICAgICAgICAgICAsIFtcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMub3BlcmF0aXZvLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy50YXJlYSxcclxuICAgICAgICAgICAgICAgICAgICBhY2Npb24uZXN0YWRvX2Rlc3Rpbm8sXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm9wZXJhdGl2byxcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMudGFyZWEsXHJcbiAgICAgICAgICAgICAgICAgICAgYWNjaW9uLmVzdGFkb19kZXN0aW5vLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5lbmNcclxuICAgICAgICAgICAgICAgIF0pLmZldGNoT25lUm93SWZFeGlzdHMoKSkucm93O1xyXG4gICAgICAgICAgICBpZiAodGFyZWFTaWd1aWVudGUpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCB0YXJlYV9hY3R1YWwgPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgXHJcbiAgICAgICAgICAgICAgICAgICAgLCBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgdGFyZWFTaWd1aWVudGUudGFyZWFfZGVzdGlub11cclxuICAgICAgICAgICAgICAgICkuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgICAgIGxldCBhdXRvQXNpZ25hZG8gPSB0YXJlYVNpZ3VpZW50ZS5yZWdpc3RyYV9yZWNlcGNpb25pc3RhID8gY29udGV4dC51c2VyLmlkcGVyIDogbnVsbDtcclxuICAgICAgICAgICAgICAgIGxldCBxID0gY29udGV4dC5iZS5kYi5xdW90ZUxpdGVyYWw7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRzX2VudHJhZGEgPSBjdXJyZW50X3RpbWVzdGFtcCwgYWRlbGFudGFyID0gbnVsbCwgZXN0YWRvID0gJDRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7YXV0b0FzaWduYWRvID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIsIHJlY2VwY2lvbmlzdGE9XCIgKyBxKGF1dG9Bc2lnbmFkbylcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcIlwifVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhID0gJDNcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgXHJcbiAgICAgICAgICAgICAgICAgICAgLCBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgdGFyZWFTaWd1aWVudGUudGFyZWFfZGVzdGlubywgdGFyZWFTaWd1aWVudGUuZXN0YWRvX2Rlc3Rpbm9dXHJcbiAgICAgICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGFyZWFTaWd1aWVudGUubm9tYnJlX3Byb2NlZHVyZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZVt0YXJlYVNpZ3VpZW50ZS5ub21icmVfcHJvY2VkdXJlXS5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1zKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBGSU4gUEFTRSBERSBUQVJFQVxyXG4gICAgICAgICAgICByZXR1cm4gXCJva1wiO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfY2FyZ2FfcHJlcGFyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgdGFyZWE6IHN0cmluZywgZW5jOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgb3BlcmFjaW9uID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuYywgT1BFUkFDSU9OX1BSRVBBUkFSX0NBUkdBXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2Rpc3BvbmliaWxpemFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZWEnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIHRhcmVhOiBzdHJpbmcsIGVuYzogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGFzaWduYWRvID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCB0YXJlYTogc3RyaW5nLCBlbmM6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBvcGVyYWNpb24gPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmNdKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfZGVzY2FyZ2FfcHJlcGFyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgdGFyZWE6IHN0cmluZywgZW5jOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgb3BlcmFjaW9uID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuYywgT1BFUkFDSU9OX1BSRVBBUkFSX0RFU0NBUkdBXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX2Rlc2NhcmdhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCB0YXJlYTogc3RyaW5nLCBlbmM6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBvcGVyYWNpb24gPSAnY2FyZ2FyJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2FuYWxpemFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZWEnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIHRhcmVhOiBzdHJpbmcsIGVuYzogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZS5jb25zaXN0aXJfZW5jdWVzdGEuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHsgb3BlcmF0aXZvOiBwYXJhbXMub3BlcmF0aXZvLCBpZF9jYXNvOiBwYXJhbXMuZW5jIH0pXHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnaW5jb25zaXN0ZW5jaWFzX2VuY3Vlc3RhX2NvbnRyb2xhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCB0YXJlYTogc3RyaW5nLCBlbmM6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICB2YXIgY2FudGlkYWQ6IG51bWJlciA9IChhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgY291bnQoKikgYXMgY3VtcGxlXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSBpbmNvbnNpc3RlbmNpYXMgaSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgam9pbiBjb25zaXN0ZW5jaWFzIGMgdXNpbmcgKG9wZXJhdGl2bywgY29uc2lzdGVuY2lhKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgam9pbiBtb21lbnRvc19jb25zaXN0ZW5jaWEgbWMgdXNpbmcgKG9wZXJhdGl2bywgbW9tZW50bylcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aXZvID0gJDEgYW5kIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2aXZpZW5kYSA9ICQyIGFuZCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgbW9tZW50b19jb25zaXN0ZW5jaWFfY3VtcGxlX2NvbmRpY2lvbihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jLm9wZXJhdGl2byxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudml2aWVuZGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMywgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0IGNvbmRpY2lvbiBmcm9tIG1vbWVudG9zX2NvbnNpc3RlbmNpYSB3aGVyZSBvcGVyYXRpdm8gPSBtYy5vcGVyYXRpdm8gYW5kIG1vbWVudG8gPSBtYy5tb21lbnRvKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIGFuZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpLmp1c3RpZmljYWNpb24gaXMgbnVsbGAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgY29udGV4dC51c2VybmFtZV0pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVWYWx1ZSgpKS52YWx1ZVxyXG4gICAgICAgICAgICBpZiAoY2FudGlkYWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBubyBzZSBwdWVkZSB2ZXJpZmljYXIgbGEgdGFyZWEgcG9ycXVlIGhheSBpbmNvbnNpc3RlbmNpYXMsIHBvciBmYXZvciByZXN1w6lsdmFsYXMgbyBqdXN0aWbDrXF1ZWxhcyBlbiBjYXNvIGRlIHNlciBuZWNlc2FyaW8uYClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX3ZlcmlmaWNhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCB0YXJlYTogc3RyaW5nLCBlbmM6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICBhd2FpdCBiZS5wcm9jZWR1cmUuaW5jb25zaXN0ZW5jaWFzX2VuY3Vlc3RhX2NvbnRyb2xhci5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1zKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgdmVyaWZpY2FkbyA9ICcxJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX3ZlcmlmaWNhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCB0YXJlYTogc3RyaW5nLCBlbmM6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB2ZXJpZmljYWRvID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgdGFyZWE9ICQyIGFuZCBlbmM9JDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLnRhcmVhLCBwYXJhbXMuZW5jXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2NlcnJhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCB0YXJlYTogc3RyaW5nLCBlbmM6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB2ZXJpZmljYWRvID0gJzEnLCBhc2lnbmFkbyA9ICQ0XHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCB0YXJlYT0gJDIgYW5kIGVuYz0kM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudGFyZWEsIHBhcmFtcy5lbmMsIGNvbnRleHQudXNlci5pZHBlcl0pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19jZXJyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgdGFyZWE6IHN0cmluZywgZW5jOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgdmVyaWZpY2FkbyA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIHRhcmVhPSAkMiBhbmQgZW5jPSQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy50YXJlYSwgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9zdXBlcnZpc2FyX3ByZXNlbmNpYWwnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgZW5jOiBzdHJpbmcsIHRhcmVhOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB0YXJlYV9hY3R1YWwgPSAkMywgc3VwZXJ2aXNpb25fZGlyaWdpZGEgPSAkNFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdzdXBlJywgMV0pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9zdXBlcnZpc2FyX3RlbGVmb25pY2EnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgZW5jOiBzdHJpbmcsIHRhcmVhOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCB0YXJlYV9hY3R1YWwgPSAkMywgc3VwZXJ2aXNpb25fZGlyaWdpZGEgPSAkNFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdzdXBlJywgMl0pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19zdXBlcnZpc2FyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGVuYzogc3RyaW5nLCB0YXJlYTogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDMsIHN1cGVydmlzaW9uX2RpcmlnaWRhID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdmaW5jJ10pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9wYXNhcl9hX2FuYWMnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOiBhc3luYyBmdW5jdGlvbiAoY29udGV4dDogUHJvY2VkdXJlQ29udGV4dCwgcGFyYW1zOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHsgb3BlcmF0aXZvOiBJZE9wZXJhdGl2bywgZW5jOiBzdHJpbmcsIHRhcmVhOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgVVBEQVRFIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJ0NDJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYSBpbiAoJDMsJDQpIC0tcXVpZXJvIHBhc2FyIGxhcyAyIHRhcmVhcyBhIENDXHJcbiAgICAgICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICAgICAgW3BhcmFtcy5vcGVyYXRpdm8sIHBhcmFtcy5lbmMsICdhbmFjJywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgICAgIC5leGVjdXRlKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDNcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jLCAnYW5hYyddKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfbm9fcGFzYXJfYV9hbmFjJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGVuYzogc3RyaW5nLCB0YXJlYTogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICdBJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYT0gJDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG8gPSAnMEQnXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDIgYW5kIHRhcmVhPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jLCAnYW5hYyddKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDNcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGVuYz0kMlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMuZW5jLCAncHJvYyddKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfZGV2b2x2ZXJfcHJvY19kZXNkZV9hbmFjJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJlYScsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGVuYzogc3RyaW5nLCB0YXJlYTogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIHZhciBiZSA9IGNvbnRleHQuYmU7XHJcbiAgICAgICAgICAgIGF3YWl0IGJlLnByb2NlZHVyZS5lbmN1ZXN0YV92ZXJpZmljYXIuY29yZUZ1bmN0aW9uKGNvbnRleHQsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGVzdGFkbyA9ICdBJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCB0YXJlYT0gJDNcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ3Byb2MnXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICByZXR1cm4gJ29rJztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX25vX2Rldm9sdmVyX3Byb2NfZGVzZGVfYW5hYycsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZWEnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBlbmM6IHN0cmluZywgdGFyZWE6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBVUERBVEUgdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBlc3RhZG8gPSAnQ0MnXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDIgYW5kIHRhcmVhIGluICgkMywkNCkgLS1xdWllcm8gcGFzYXIgbGFzIDIgdGFyZWFzIGEgQ0NcclxuICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuYywgJ2FuYWMnLCAncHJvYyddKVxyXG4gICAgICAgICAgICAgICAgLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlLmVuY3Vlc3RhX25vX3ZlcmlmaWNhci5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1zKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9yZWN1cGVyYXJfZGVzZGVfYW5hYycsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZWEnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBlbmM6IHN0cmluZywgdGFyZWE6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgeyBvcGVyYXRpdm8sIGVuYywgdGFyZWEgfSA9IHBhcmFtcztcclxuICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlLmVuY3Vlc3RhX3ZlcmlmaWNhci5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1zKTtcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRlbSBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDNcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbb3BlcmF0aXZvLCBlbmMsICdyZWN1J10pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9ub19yZWN1cGVyYXJfZGVzZGVfYW5hYycsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZWEnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBlbmM6IHN0cmluZywgdGFyZWE6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICB2YXIgYmUgPSBjb250ZXh0LmJlO1xyXG4gICAgICAgICAgICB2YXIgeyBvcGVyYXRpdm8sIGVuYywgdGFyZWEgfSA9IHBhcmFtcztcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRlbSBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgZW5jLCAncmVjdScsICdhbmFjJ10pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgYXdhaXQgYmUucHJvY2VkdXJlLmVuY3Vlc3RhX25vX3ZlcmlmaWNhci5jb3JlRnVuY3Rpb24oY29udGV4dCwgcGFyYW1zKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YV9mb3J6YXJfdGFyZWEnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmVhX2FjdHVhbCcsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZWFfbnVldmEnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBlbmM6IHN0cmluZywgdGFyZWFfYWN0dWFsOiBzdHJpbmcsIHRhcmVhX251ZXZhOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgdmFyIHsgb3BlcmF0aXZvLCBlbmMsIHRhcmVhX2FjdHVhbCwgdGFyZWFfbnVldmEgfSA9IHBhcmFtcztcclxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlIHRlbSBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgdGFyZWFfYWN0dWFsID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm8gPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhX2FjdHVhbCA9ICQzXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgW29wZXJhdGl2bywgZW5jLCB0YXJlYV9hY3R1YWwsIHRhcmVhX251ZXZhXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICB1cGRhdGUgdGFyZWFzX3RlbSBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJ1YnIFxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCBlbmMgPSAkMiBhbmQgdGFyZWEgPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtvcGVyYXRpdm8sIGVuYywgdGFyZWFfYWN0dWFsXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICB1cGRhdGUgdGFyZWFzX3RlbSBcclxuICAgICAgICAgICAgICAgICAgICBzZXQgZXN0YWRvID0gJzBEJ1xyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2byA9ICQxIGFuZCBlbmMgPSAkMiBhbmQgdGFyZWEgPSAkM1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtvcGVyYXRpdm8sIGVuYywgdGFyZWFfbnVldmFdKVxyXG4gICAgICAgICAgICAgICAgLmZldGNoVW5pcXVlUm93KCk7XHJcbiAgICAgICAgICAgIHJldHVybiAnb2snO1xyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgYWN0aW9uOiAnZW5jdWVzdGFfaGFiaWxpdGFyX2Rlc2hhYmlsaXRhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW1xyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm8nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIGVuYzogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0ZW1cclxuICAgICAgICAgICAgICAgICAgICBzZXQgaGFiaWxpdGFkYSA9IG5vdCBoYWJpbGl0YWRhXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCBlbmM9JDJcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY10pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hVbmlxdWVSb3coKTtcclxuICAgICAgICAgICAgcmV0dXJuICdvayc7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdlbmN1ZXN0YXNfcHJvY2VzYW1pZW50b19wYXNhcicsXHJcbiAgICAgICAgcGFyYW1ldGVyczogW10sXHJcbiAgICAgICAgY29yZUZ1bmN0aW9uOmFzeW5jIGZ1bmN0aW9uKGNvbnRleHQ6UHJvY2VkdXJlQ29udGV4dCwgX3BhcmFtczpDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHt9Pil7XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBwYXNhckVuY3Vlc3Rhc0FQcm9pZShjb250ZXh0LmNsaWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdpbnRlcmNhbWJpYXJfZW5jdWVzdGFzJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuYzEnLCByZWZlcmVuY2VzOiAndGVtJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdjYW50SG9nMScsIHR5cGVOYW1lOiAnaW50ZWdlcicgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnZW5jMicsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnY2FudEhvZzInLCB0eXBlTmFtZTogJ2ludGVnZXInIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ3Bhc28nLCB0eXBlTmFtZTogJ2ludGVnZXInIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2NvbmZpcm1hJywgdHlwZU5hbWU6ICdib29sZWFuJywgZGVmYXVsdFZhbHVlOiBmYWxzZSwgbGFiZWw6ICdDb25maXJtYSBpbnRlcmNhbWJpbyBkZSBsb3MgZGF0b3MgZW50cmUgbGFzIGVuY3Vlc3Rhcz8gJyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcm9sZXM6IFsnY29vcl9wcm9jJywgJ3Byb2Nlc2FtaWVudG8nLCAnYWRtaW4nXSxcclxuICAgICAgICBwcm9ncmVzczogdHJ1ZSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8YW55Pikge1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogUGFyYSBjb250cm9sYXI6XHJcbiAgICAgICAgICAgICAqIC0gcXVlIGxhcyBob2dhcmVzLCBwZXJzb25hcywgZXRjIGVzdMOpbiBpbnRlcmNhbWJpYWRhcyBcclxuICAgICAgICAgICAgICogICogdGFudG8gZW4gZWwganNvblxyXG4gICAgICAgICAgICAgKiAgKiBjb21vIGVuIGxhcyBURHNcclxuICAgICAgICAgICAgICogLSBjb3NhcyBxdWUgc2UgY2FsY3VsYW4gcG9yIGxhIGFwcD8gY3VhbGVzPyAocmVzdW1lbl9lc3RhZG8sIHJlYSB5IG5vcmVhKVxyXG4gICAgICAgICAgICAgKi9cclxuXHJcbiAgICAgICAgICAgIGlmICghcGFyYW1zLmNvbmZpcm1hKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbmZpcm3DsyBpbnRlcmNhbWJpbycpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFwYXJhbXMuZW5jMSB8fCAhcGFyYW1zLmVuYzIpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IsIEZhbHRhIGluZ3Jlc2FyIHVuIG51bWVybyBkZSBlbmN1ZXN0YSEnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmVuYzEgPT0gcGFyYW1zLmVuYzIpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IsIGVuYzEgeSBlbmMyIGRlYmVuIHNlciBkaXN0aW50b3MhJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFwYXJhbXMuY2FudEhvZzEpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IsIENhbnRpZGFkIGRlIEhvZ2FyZXMgZGUgZW5jMSwgbm8gZXN0YSBpbmdyZXNhZG8hJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFwYXJhbXMuY2FudEhvZzIpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IsIENhbnRpZGFkIGRlIEhvZ2FyZXMgZGUgZW5jMiwgbm8gZXN0YSBpbmdyZXNhZG8hJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gQ09OVFJPTEFSIFFVRSBOSU5HVU5BIERFIExBUyAyIGVuY3Vlc3RhcyBFU1RFIENBUkdBREEsIEFCSUVSVEEgRkFMVEFcclxuICAgICAgICAgICAgY29uc3QgT1BFUkFUSVZPID0gYXdhaXQgZ2V0T3BlcmF0aXZvQWN0dWFsKGNvbnRleHQpO1xyXG4gICAgICAgICAgICB2YXIgeyB1bmlkYWRfYW5hbGlzaXMsIHBrX2FncmVnYWRhIH0gPSAoYXdhaXQgZ2V0VUFQcmluY2lwYWwoY29udGV4dC5jbGllbnQsIE9QRVJBVElWTykpO1xyXG4gICAgICAgICAgICBjb25zdCBjYW50X2hvZ3MgPSAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0IHZpdmllbmRhLCBjb3VudCgqKW5oIGZyb20gaG9nYXJlcyB3aGVyZSBvcGVyYXRpdm89JDEgYW5kICh2aXZpZW5kYT0kMiBvciB2aXZpZW5kYT0kMylcclxuICAgICAgICAgICAgICAgIGdyb3VwIGJ5IHZpdmllbmRhIG9yZGVyIGJ5IHZpdmllbmRhXHJcbiAgICAgICAgICAgICAgICBgLCBbT1BFUkFUSVZPLCBwYXJhbXMuZW5jMSwgcGFyYW1zLmVuYzJdKS5mZXRjaEFsbCgpKS5yb3dzO1xyXG5cclxuICAgICAgICAgICAgdmFyIHBhcmFtX25oID0gW3BhcmFtcy5jYW50SG9nMSwgcGFyYW1zLmNhbnRIb2cyXTtcclxuICAgICAgICAgICAgY2FudF9ob2dzLmZvckVhY2goKHhlLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1fbmhbaV0gIT09IHhlLm5oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeG1lbnMgPSBgRXJyb3IsIG5vIGNvaW5jaWRlIGxhIGNhbnRpZGFkIGRlIGhvZ2FyZXMgZGUgZW5jJHtpICsgMX1gO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih4bWVucyk7XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHZhciByZWdFbmMgPSAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoYFxyXG4gICAgICAgICAgICBzZWxlY3QgZW5jLCB0YXJlYV9hY3R1YWwsIGpzb25fZW5jdWVzdGEgZnJvbSB0ZW0gd2hlcmUgb3BlcmF0aXZvPSQxIGFuZCAoZW5jID0kMiBvciBlbmM9JDMpIG9yZGVyIGJ5IGVuY1xyXG4gICAgICAgICAgICBgLCBbT1BFUkFUSVZPLCBwYXJhbXMuZW5jMSwgcGFyYW1zLmVuYzJdKS5mZXRjaEFsbCgpKS5yb3dzO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlZ0VuYy5sZW5ndGggIT0gMikge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciwgTm8gc2UgZW5jb250cmFyb24gMiBlbmN1ZXN0YXMnKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gbGltcGlhIGxhcyBURHMgIFxyXG4gICAgICAgICAgICAgICAgbGV0IFtlbmMxLCBlbmMyXSA9IFtyZWdFbmNbMF0sIHJlZ0VuY1sxXV1cclxuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMucGFzbyA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBkZWxldGUgZnJvbSAke2NvbnRleHQuYmUuZGIucXVvdGVJZGVudCh1bmlkYWRfYW5hbGlzaXMpfSB3aGVyZSBvcGVyYXRpdm89JDEgYW5kICh2aXZpZW5kYT0kMiBPUiB2aXZpZW5kYT0kMylgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICwgW09QRVJBVElWTywgZW5jMS5lbmMsIGVuYzIuZW5jXVxyXG4gICAgICAgICAgICAgICAgICAgICkuZXhlY3V0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1zLnBhc28gPT0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc2ltdWxhIGd1YXJkYWRvXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2ltdWxhckd1YXJkYWRvRGVFbmN1ZXN0YURlc2RlQXBwRXNjcml0b3Jpbyhjb250ZXh0LCBPUEVSQVRJVk8sIGVuYzEuZW5jLCBlbmMxLnRhcmVhX2FjdHVhbCwgZW5jMi5qc29uX2VuY3Vlc3RhKVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNpbXVsYXJHdWFyZGFkb0RlRW5jdWVzdGFEZXNkZUFwcEVzY3JpdG9yaW8oY29udGV4dCwgT1BFUkFUSVZPLCBlbmMyLmVuYywgZW5jMi50YXJlYV9hY3R1YWwsIGVuYzEuanNvbl9lbmN1ZXN0YSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gKGBMaXN0byBwYXNvICR7cGFyYW1zLnBhc299LiBJbnRlcmNhbWJpbyByZWFsaXphZG8gZW50cmUgbGFzIGVuY3Vlc3RhcyAgJHtwYXJhbXMuZW5jMX0geSAke3BhcmFtcy5lbmMyfS4gUG9yIGZhdm9yIGNvbnNpc3RhIGxhIGVuY3Vlc3RhYClcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhZG9yX2Rtc19tb3N0cmFyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcsIHJlZmVyZW5jZXM6IFwib3BlcmF0aXZvc1wiIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ2VuY3Vlc3RhZG9yJywgdHlwZU5hbWU6ICd0ZXh0JyB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcm9sZXM6IFsnY29vcl9wcm9jJywgJ2Nvb3JfY2FtcG8nLCAnYWRtaW4nXSxcclxuICAgICAgICByZXN1bHRPazogJ21vc3RyYXJfZW5jdWVzdGFzX2FfYmxhbnF1ZWFyJyxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBwYXJhbXM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBlbmN1ZXN0YWRvcjogc3RyaW5nIH0+KSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgXHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgKlxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gdGFyZWFzX3RlbVxyXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgYXNpZ25hZG8gPSAkMiBhbmQgY2FyZ2Fkb19kbSBpcyBub3QgbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyIGJ5IGNhcmdhZG9fZG1cclxuICAgICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1zLm9wZXJhdGl2bywgcGFyYW1zLmVuY3Vlc3RhZG9yXSlcclxuICAgICAgICAgICAgICAgIC5mZXRjaEFsbCgpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0LnJvd0NvdW50ID09IDApIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBObyBzZSBlbmNvbnRyYXJvbiBlbmN1ZXN0YXMgY2FyZ2FkYXMgZW4gdW4gRE0gcGFyYSBlbCBvcGVyYXRpdm8gJHtwYXJhbXMub3BlcmF0aXZvfSwgZW5jdWVzdGFkb3IgJHtwYXJhbXMuZW5jdWVzdGFkb3J9YClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4geyByb3dzOiByZXN1bHQucm93cywgb3BlcmF0aXZvOiBwYXJhbXMub3BlcmF0aXZvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBhY3Rpb246ICdkbV9ibGFucXVlYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvJywgdHlwZU5hbWU6ICd0ZXh0JywgcmVmZXJlbmNlczogXCJvcGVyYXRpdm9zXCIgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAndG9rZW4nLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByb2xlczogWydjb29yX3Byb2MnLCAnY29vcl9jYW1wbycsICdhZG1pbiddLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7IG9wZXJhdGl2bzogSWRPcGVyYXRpdm8sIHRva2VuOiBzdHJpbmcgfT4pIHtcclxuICAgICAgICAgICAgdmFyIGJlID0gY29udGV4dC5iZTtcclxuICAgICAgICAgICAgbGV0IHRhcmVhc1RlbVJlc3VsdCA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgIFVQREFURSB0YXJlYXNfdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0IGNhcmdhZG9fZG0gPSBudWxsLCBvcGVyYWNpb24gPSAkMywgZXN0YWRvID0gJDRcclxuICAgICAgICAgICAgICAgICAgICB3aGVyZSBvcGVyYXRpdm89JDEgYW5kIGNhcmdhZG9fZG0gPSAkMlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAqYCxcclxuICAgICAgICAgICAgICAgIFtwYXJhbXMub3BlcmF0aXZvLCBwYXJhbXMudG9rZW4sIE9QRVJBQ0lPTl9QUkVQQVJBUl9ERVNDQVJHQSwgRVNUQURPX1BPU1RFUklPUl9ERVNDQVJHQV0pXHJcbiAgICAgICAgICAgICAgICAuZmV0Y2hBbGwoKTtcclxuICAgICAgICAgICAgaWYgKHRhcmVhc1RlbVJlc3VsdC5yb3dDb3VudCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcignTm8gc2UgYmxhbnF1ZcOzIG5pbmd1bmEgZW5jdWVzdGEnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAobGV0IHR0IG9mIHRhcmVhc1RlbVJlc3VsdC5yb3dzKSB7XHJcbiAgICAgICAgICAgICAgICB0dC5yZXN1bHRfYmxhbnF1ZW8gPSBgZW5jICR7dHQuZW5jfSBzZSBibGFucXVlw7MgY29ycmVjdGFtZW50ZS5gO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdEJhY2t1cCA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KGBcclxuICAgICAgICAgICAgICAgICAgICBVUERBVEUgdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBqc29uX2VuY3Vlc3RhID0ganNvbl9iYWNrdXAsIGZlY2hhX21vZGlmX2VuY3Vlc3RhID0gZmVjaGFfYmFja3VwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG9wZXJhdGl2bz0kMSBhbmQgZW5jPSQyIGFuZCBmZWNoYV9iYWNrdXAgPiBjb2FsZXNjZShmZWNoYV9tb2RpZl9lbmN1ZXN0YSwgJzE5MDAtMDEtMDEnKSBhbmQganNvbl9iYWNrdXAgaXMgbm90IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nICpgLFxyXG4gICAgICAgICAgICAgICAgICAgIFt0dC5vcGVyYXRpdm8sIHR0LmVuY10pXHJcbiAgICAgICAgICAgICAgICAgICAgLmZldGNoT25lUm93SWZFeGlzdHMoKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRCYWNrdXAucm93Q291bnQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0dC5yZXN1bHRfYmxhbnF1ZW8gKz0gYCBTZSByZXN0YWJsZWNpw7MgZWwgYmFja3VwIGNvbiBmZWNoYSAke3Jlc3VsdEJhY2t1cC5yb3cuZmVjaGFfYmFja3VwLnRvWW1kSG1zKCl9LmBcclxuICAgICAgICAgICAgICAgICAgICB2YXIgeyBwYXJhbXM6IHF1ZXJ5UGFyYW1zLCBzZXR0ZXJzIH0gPSBnZXRTZXR0ZXJzQW5kUGFyYW1ldGVyc0ZvclJlYU5vUmVhUmVzdW1lbkVzdGFkbyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhOiB0dC50YXJlYSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1VBUHJpbmNpcGFsOiByZXN1bHRCYWNrdXAucm93Lmpzb25fZW5jdWVzdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlcnM6IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IFt0dC5vcGVyYXRpdm8sIHR0LmVuYywgdHQudGFyZWFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5vOiAndGFyZWFzX3RlbSdcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBgdXBkYXRlIHRhcmVhc190ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCAke3NldHRlcnMuam9pbignLCcpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvPSAkMSBhbmQgZW5jID0gJDIgYW5kIHRhcmVhID0gJDNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAnb2snYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zXHJcbiAgICAgICAgICAgICAgICAgICAgKS5mZXRjaFVuaXF1ZVJvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNpbXVsYXJHdWFyZGFkb0RlRW5jdWVzdGFEZXNkZUFwcEVzY3JpdG9yaW8oY29udGV4dCwgcmVzdWx0QmFja3VwLnJvdy5vcGVyYXRpdm8sIHJlc3VsdEJhY2t1cC5yb3cuZW5jLCB0dC50YXJlYSwgcmVzdWx0QmFja3VwLnJvdy5qc29uX2VuY3Vlc3RhKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0YXJlYXNUZW1SZXN1bHQucm93cztcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ21vZG9fZG1fZGVmZWN0b19vYnRlbmVyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgXSxcclxuICAgICAgICB1bmxvZ2dlZDogdHJ1ZSxcclxuICAgICAgICBjb3JlRnVuY3Rpb246IGFzeW5jIGZ1bmN0aW9uIChjb250ZXh0OiBQcm9jZWR1cmVDb250ZXh0LCBfcGFyYW1ldGVyczogQ29yZUZ1bmN0aW9uUGFyYW1ldGVyczx7fT4pIHtcclxuICAgICAgICAgICAgY29uc3QgeyBjbGllbnQgfSA9IGNvbnRleHQ7XHJcbiAgICAgICAgICAgIGNvbnN0IG1vZG9EbURlZmVjdG8gPSAoYXdhaXQgKGNsaWVudC5xdWVyeShgc2VsZWN0IG1vZG9fZG1fZGVmZWN0byBmcm9tIHBhcmFtZXRyb3Mgd2hlcmUgdW5pY29fcmVnaXN0cm9gLCBbXSkuZmV0Y2hVbmlxdWVWYWx1ZSgpKSkudmFsdWU7XHJcbiAgICAgICAgICAgIHJldHVybiBtb2RvRG1EZWZlY3RvO1xyXG4gICAgICAgIH1cclxuICAgIH0sIHtcclxuICAgICAgICBhY3Rpb246ICdtb2RvX2FwcF9nZXQnLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtdLFxyXG4gICAgICAgIHVubG9nZ2VkOiB0cnVlLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIF9wYXJhbWV0ZXJzOiBDb3JlRnVuY3Rpb25QYXJhbWV0ZXJzPHt9Pikge1xyXG4gICAgICAgICAgICBjb25zdCB7IGJlIH0gPSBjb250ZXh0O1xyXG4gICAgICAgICAgICByZXR1cm4gZ2V0TW9kb0J5UG9saWN5KGJlKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ29wZXJhdGl2b19taWdyYXInLFxyXG4gICAgICAgIHBhcmFtZXRlcnM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnb3BlcmF0aXZvX29yaWdlbicsIHR5cGVOYW1lOiAndGV4dCcsIHJlZmVyZW5jZXM6ICdvcGVyYXRpdm9zJyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdvcGVyYXRpdm9fZGVzdGlubycsIHR5cGVOYW1lOiAndGV4dCcgfSxcclxuICAgICAgICAgICAgeyBuYW1lOiAnc2NoZW1hX25hbWUnLCB0eXBlTmFtZTogJ3RleHQnLCBsYWJlbDogJ25vbWJyZSBkZSBzY2hlbWEnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByZXN1bHRPazogJ2Rvd25sb2FkX3NxbCcsXHJcbiAgICAgICAgcHJvY2VlZExhYmVsOiAnbWlncmFyJyxcclxuICAgICAgICByb2xlczogWydhZG1pbiddLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtczogeyBvcGVyYXRpdm9fb3JpZ2VuOiBzdHJpbmcsIG9wZXJhdGl2b19kZXN0aW5vOiBzdHJpbmcsIHNjaGVtYV9uYW1lOiBzdHJpbmcgfSkge1xyXG4gICAgICAgICAgICAvLyAxLiBDb25zdWx0YW1vcyBsYXMgdGFibGFzIGJhc2UgZGVsIG9yaWdlbiAoc2llbXByZSB0aWVuZW4gb3BlcmF0aXZvKVxyXG4gICAgICAgICAgICBjb25zdCBiYXNlVGFibGVzUmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgICAgICBbJ29wZXJhdGl2b3MnLCAndGFyZWFzJywgJ3VuaWRhZF9hbmFsaXNpcycsICdjYXNpbGxlcm9zJ10ubWFwKGFzeW5jIHRhYmxlTmFtZSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHRhYmxlTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBoYXNPcGVyYXRpdm86IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBhd2FpdCBjb250ZXh0LmNsaWVudC5xdWVyeShgc2VsZWN0ICogZnJvbSAke2NvbnRleHQuYmUuZGIucXVvdGVJZGVudCh0YWJsZU5hbWUpfSB3aGVyZSBvcGVyYXRpdm8gPSAkMWAsIFtwYXJhbXMub3BlcmF0aXZvX29yaWdlbl0pLmZldGNoQWxsKClcclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgYmFzZVRhYmxlc1Jlc3VsdC5mb3JFYWNoKChfLCBpKSA9PiBiYXNlVGFibGVzUmVzdWx0W2ldLnJlc3VsdC5yb3dzLmZvckVhY2gocm93ID0+IHJvdy5vcGVyYXRpdm8gPSBwYXJhbXMub3BlcmF0aXZvX2Rlc3Rpbm8pKTtcclxuXHJcbiAgICAgICAgICAgIC8vQ2hlcXVlbyB5IGNvbnN1bHRhIGRlIHRhYmxhcyByZWFzIChyZWEsIG5vX3JlYSwgcmVhX3N1cCwgbm9fcmVhX3N1cClcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uYWxUYWJsZXMgPSBbJ3JlYScsICdub19yZWEnLCAncmVhX3N1cCcsICdub19yZWFfc3VwJ107XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlc0V4aXN0UmVzdWx0ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgc2VsZWN0IHRhYmxlX25hbWUgXHJcbiAgICAgICAgICAgICAgICAgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFxyXG4gICAgICAgICAgICAgICAgIHdoZXJlIHRhYmxlX3NjaGVtYSA9IGN1cnJlbnRfc2NoZW1hKCkgXHJcbiAgICAgICAgICAgICAgICAgICBhbmQgdGFibGVfbmFtZSA9IGFueSgkMSlgLFxyXG4gICAgICAgICAgICAgICAgW29wdGlvbmFsVGFibGVzXVxyXG4gICAgICAgICAgICApLmZldGNoQWxsKCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ09wdGlvbmFsVGFibGVzID0gdGFibGVzRXhpc3RSZXN1bHQucm93cy5tYXAociA9PiByLnRhYmxlX25hbWUpO1xyXG4gICAgICAgICAgICBjb25zdCBtaXNzaW5nT3B0aW9uYWxUYWJsZXMgPSBvcHRpb25hbFRhYmxlcy5maWx0ZXIodCA9PiAhZXhpc3RpbmdPcHRpb25hbFRhYmxlcy5pbmNsdWRlcyh0KSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25hbFRhYmxlc1Jlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdPcHRpb25hbFRhYmxlcy5tYXAoYXN5bmMgdGFibGVOYW1lID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xzUmVzdWx0ID0gYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGBzZWxlY3QgY29sdW1uX25hbWUgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdGFibGVfc2NoZW1hID0gY3VycmVudF9zY2hlbWEoKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRhYmxlX25hbWUgPSAkMWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJsZU5hbWVdXHJcbiAgICAgICAgICAgICAgICAgICAgKS5mZXRjaEFsbCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNPcGVyYXRpdm8gPSBjb2xzUmVzdWx0LnJvd3Muc29tZShjID0+IGMuY29sdW1uX25hbWUgPT09ICdvcGVyYXRpdm8nKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVlcnlTdHIgPSBoYXNPcGVyYXRpdm9cclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgc2VsZWN0ICogZnJvbSAke2NvbnRleHQuYmUuZGIucXVvdGVJZGVudCh0YWJsZU5hbWUpfSB3aGVyZSBvcGVyYXRpdm8gPSAkMWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgc2VsZWN0ICogZnJvbSAke2NvbnRleHQuYmUuZGIucXVvdGVJZGVudCh0YWJsZU5hbWUpfWA7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gaGFzT3BlcmF0aXZvID8gW3BhcmFtcy5vcGVyYXRpdm9fb3JpZ2VuXSA6IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbnRleHQuY2xpZW50LnF1ZXJ5KHF1ZXJ5U3RyLCBxdWVyeVBhcmFtcykuZmV0Y2hBbGwoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGFibGVOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNPcGVyYXRpdm8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgb3B0aW9uYWxUYWJsZXNSZXN1bHQuZm9yRWFjaCh0ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0Lmhhc09wZXJhdGl2bykge1xyXG4gICAgICAgICAgICAgICAgICAgIHQucmVzdWx0LnJvd3MuZm9yRWFjaChyb3cgPT4gcm93Lm9wZXJhdGl2byA9IHBhcmFtcy5vcGVyYXRpdm9fZGVzdGlubyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gQ29tYmluYW1vcyBiYXNlIHkgb3BjaW9uYWxlcyBlbmNvbnRyYWRhc1xyXG4gICAgICAgICAgICBjb25zdCB0YWJsZXNSZXN1bHQgPSBbLi4uYmFzZVRhYmxlc1Jlc3VsdCwgLi4ub3B0aW9uYWxUYWJsZXNSZXN1bHRdO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGlzYWJsZUNhc2lsbGVyb3NGSyA9IGBcclxuICAgICAgICAgICAgICAgIEFMVEVSIFRBQkxFICR7Y29udGV4dC5iZS5kYi5xdW90ZUlkZW50KHBhcmFtcy5zY2hlbWFfbmFtZSl9LmNhc2lsbGVyb3MgRElTQUJMRSBUUklHR0VSIEFMTDtcclxuICAgICAgICAgICAgYDtcclxuICAgICAgICAgICAgY29uc3QgZW5hYmxlQ2FzaWxsZXJvc0ZLID0gYFxyXG4gICAgICAgICAgICAgICAgQUxURVIgVEFCTEUgJHtjb250ZXh0LmJlLmRiLnF1b3RlSWRlbnQocGFyYW1zLnNjaGVtYV9uYW1lKX0uY2FzaWxsZXJvcyBFTkFCTEUgVFJJR0dFUiBBTEw7XHJcbiAgICAgICAgICAgIGA7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBidWlsZEluc2VydHMgPSAocXVlcnk6IHsgbmFtZTogc3RyaW5nLCBoYXNPcGVyYXRpdm8/OiBib29sZWFuLCByZXN1bHQ6IFJlc3VsdFJvd3MgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpZWxkcyA9IFsuLi5xdWVyeS5yZXN1bHQuZmllbGRzXTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTaSBsYSB0YWJsYSBkZSByZWEgbm8gdGVuw61hIGxhIGNvbHVtbmEgb3BlcmF0aXZvLCBsYSBhZ3JlZ2Ftb3MgYWwgaW5zZXJ0XHJcbiAgICAgICAgICAgICAgICBpZiAocXVlcnkuaGFzT3BlcmF0aXZvID09PSBmYWxzZSAmJiAhZmllbGRzLnNvbWUoKGY6IHsgbmFtZTogc3RyaW5nIH0pID0+IGYubmFtZSA9PT0gJ29wZXJhdGl2bycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmllbGRzLnB1c2goeyBuYW1lOiAnb3BlcmF0aXZvJyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcXVlcnkucmVzdWx0LnJvd3MubWFwKHJvdyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5Lmhhc09wZXJhdGl2byA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93Lm9wZXJhdGl2byA9IHBhcmFtcy5vcGVyYXRpdm9fZGVzdGlubztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnaW5zZXJ0IGludG8gJyArIGNvbnRleHQuYmUuZGIucXVvdGVJZGVudChwYXJhbXMuc2NoZW1hX25hbWUpICsgJy4nICsgY29udGV4dC5iZS5kYi5xdW90ZUlkZW50KHF1ZXJ5Lm5hbWUpICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJyAoJyArIGZpZWxkcy5tYXAoKGY6IHsgbmFtZTogc3RyaW5nIH0pID0+IGNvbnRleHQuYmUuZGIucXVvdGVJZGVudChmLm5hbWUpKS5qb2luKCcsICcpICsgJyknICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJyB2YWx1ZXMgKCcgKyBmaWVsZHMubWFwKChmOiB7IG5hbWU6IHN0cmluZyB9KSA9PiBjb250ZXh0LmJlLmRiLnF1b3RlTnVsbGFibGUocm93W2YubmFtZV0pKS5qb2luKCcsICcpICsgJyk7JztcclxuICAgICAgICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb3BPcmlnZW5RID0gY29udGV4dC5iZS5kYi5xdW90ZU51bGxhYmxlKHBhcmFtcy5vcGVyYXRpdm9fb3JpZ2VuKTtcclxuICAgICAgICAgICAgY29uc3Qgb3BEZXN0aW5vUSA9IGNvbnRleHQuYmUuZGIucXVvdGVOdWxsYWJsZShwYXJhbXMub3BlcmF0aXZvX2Rlc3Rpbm8pO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdEFyZWFzID0gW1xyXG4gICAgICAgICAgICAgICAgMSwgMTQwMCwgMTQxMCwgMTQyMCwgMTQzMCwgMTQ0MCwgMTQ1MCwgMTQ2MCwgMTQ3MCwgMTQ4MCwgMTQ5MCxcclxuICAgICAgICAgICAgICAgIDE1MDAsIDE1MTAsIDE1MjAsIDE1MzAsIDE1NDAsIDc0MDAsIDc0MTAsIDc0MjAsIDc0MzAsIDc0NDAsXHJcbiAgICAgICAgICAgICAgICA3NDUwLCA3NDYwLCA3NDcwLCA3NDgwLCA3NDkwLCA3NTAwLCA3NTEwLCA3NTIwLCA3NTMwLCA3NTQwXHJcbiAgICAgICAgICAgIF07XHJcblxyXG4gICAgICAgICAgICAvLyBBdmlzb3Mgc2kgYWxndW5hIHRhYmxhIG9wY2lvbmFsIG5vIGV4aXN0ZSBlbiBhYnNvbHV0b1xyXG4gICAgICAgICAgICBjb25zdCBub3RpY2VzU3FsID0gbWlzc2luZ09wdGlvbmFsVGFibGVzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgID8gXCJETyBcXCRcXCRcXG5CRUdJTlxcblwiICsgbWlzc2luZ09wdGlvbmFsVGFibGVzLm1hcCh0ID0+IGAgICAgUkFJU0UgTk9USUNFICdMYSB0YWJsYSBcIiVcIiBubyBleGlzdGUgZW4gZWwgb3JpZ2VuLCBzZSBvbWl0ZS4nLCAnJHt0fSc7YCkuam9pbihcIlxcblwiKSArIFwiXFxuRU5EIFxcJFxcJDtcIlxyXG4gICAgICAgICAgICAgICAgOiAnJztcclxuXHJcbiAgICAgICAgICAgIC8vIDIuIEJsb3F1ZSBQTC9wZ1NRTCBjb24gdmFsaWRhY2nDs24geSBsaW1waWV6YSBleGNsdXNpdmEgZW4gZWwgY2FtaW5vIHBvciBkZWZlY3RvXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbmFsQXJlYXNUZW1TcWwgPSBgXHJcbiAgICAgICAgICAgICAgICBETyAkJFxyXG4gICAgICAgICAgICAgICAgREVDTEFSRVxyXG4gICAgICAgICAgICAgICAgICAgIHZfdGllbmVfb25kYSBib29sZWFuO1xyXG4gICAgICAgICAgICAgICAgQkVHSU5cclxuICAgICAgICAgICAgICAgICAgICAtLSBWZXJpZmljYXIgc2kgbGFzIDMgdGFibGFzIHRpZW5lbiByZWdpc3Ryb3Mgc2ltdWx0w6FuZWFtZW50ZSBlbiBlbCBkZXN0aW5vXHJcbiAgICAgICAgICAgICAgICAgICAgU0VMRUNUIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDT0FMRVNDRSgoU0VMRUNUIGNvdW50KDEpIEZST00gYXJlYXMgV0hFUkUgb3BlcmF0aXZvID0gJHtvcE9yaWdlblF9KSwgMCkgPiAwIEFORFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDT0FMRVNDRSgoU0VMRUNUIGNvdW50KDEpIEZST00gdGFyZWFzX2FyZWFzIFdIRVJFIG9wZXJhdGl2byA9ICR7b3BPcmlnZW5RfSksIDApID4gMCBBTkRcclxuICAgICAgICAgICAgICAgICAgICAgICAgQ09BTEVTQ0UoKFNFTEVDVCBjb3VudCgxKSBGUk9NIHRlbSBXSEVSRSBvcGVyYXRpdm8gPSAke29wT3JpZ2VuUX0pLCAwKSA+IDBcclxuICAgICAgICAgICAgICAgICAgICBJTlRPIHZfdGllbmVfb25kYTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgSUYgdl90aWVuZV9vbmRhIFRIRU5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLS0gLS0tIENBTUlOTyBBOiBFbCBkZXN0aW5vIFRJRU5FIG9uZGEgYW50ZXJpb3IgY29tcGxldGEgLS0tXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIElOU0VSVCBJTlRPIGFyZWFzIChvcGVyYXRpdm8sIGFyZWEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgJHtvcERlc3Rpbm9RfSBBUyBvcGVyYXRpdm8sIGFyZWFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZST00gYXJlYXMgV0hFUkUgb3BlcmF0aXZvID0gJHtvcE9yaWdlblF9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gdGFyZWFzX2FyZWFzIChvcGVyYXRpdm8sIHRhcmVhLCBhcmVhKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICR7b3BEZXN0aW5vUX0gQVMgb3BlcmF0aXZvLCB0YXJlYSwgYXJlYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSB0YXJlYXNfYXJlYXMgV0hFUkUgb3BlcmF0aXZvID0gJHtvcE9yaWdlblF9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gdGVtIChvcGVyYXRpdm8sIGFyZWEsIGVuYywgZG9taW5pbywgaGFiaWxpdGFkYSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICR7b3BEZXN0aW5vUX0gQVMgb3BlcmF0aXZvLCBhcmVhLCAoYXJlYSB8fCBlbmM6OnRleHQpIGVuYywgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVNFIFdIRU4gZW5jcy5lbmMgPCAxMDYgVEhFTiAzIEVMU0UgNSBFTkQgQVMgZG9taW5pbywgVFJVRSBBUyBoYWJpbGl0YWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gYXJlYXMgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEpPSU4gKFNFTEVDVCBnZW5lcmF0ZV9zZXJpZXMoMTAwLCAxMTApIGVuYykgZW5jcyBPTiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIGFyZWFzLm9wZXJhdGl2byA9ICR7b3BPcmlnZW5RfTtcclxuICAgICAgICAgICAgICAgICAgICBFTFNFXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC0tIC0tLSBDQU1JTk8gQjogQWxndW5hIHRhYmxhIGVzdMOhIHZhY8OtYSBvIGluY29tcGxldGEgKExpbXBpYW1vcyBlIGluc2VydGFtb3MgcG9yIGRlZmVjdG8pIC0tLVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBERUxFVEUgRlJPTSB0ZW0gV0hFUkUgb3BlcmF0aXZvID0gJHtvcERlc3Rpbm9RfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgREVMRVRFIEZST00gdGFyZWFzX2FyZWFzIFdIRVJFIG9wZXJhdGl2byA9ICR7b3BEZXN0aW5vUX07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERFTEVURSBGUk9NIGFyZWFzIFdIRVJFIG9wZXJhdGl2byA9ICR7b3BEZXN0aW5vUX07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBJTlNFUlQgSU5UTyBhcmVhcyAob3BlcmF0aXZvLCBhcmVhKSBWQUxVRVMgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICR7ZGVmYXVsdEFyZWFzLm1hcChhID0+IGAoJHtvcERlc3Rpbm9RfSwke2NvbnRleHQuYmUuZGIucXVvdGVOdWxsYWJsZShhKX0pYCkuam9pbignLCAnKX07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBJTlNFUlQgSU5UTyB0YXJlYXNfYXJlYXMob3BlcmF0aXZvLCB0YXJlYSwgYXJlYSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICogXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICR7b3BEZXN0aW5vUX0gQVMgb3BlcmF0aXZvLCB0LnRhcmVhLCBhcmVhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUk9NIGFyZWFzIGEsIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgdC5vcGVyYXRpdm8sIHQudGFyZWEgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSB0YXJlYXMgdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBhLm9wZXJhdGl2byA9ICR7b3BEZXN0aW5vUX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EIHQub3BlcmF0aXZvID0gJHtvcERlc3Rpbm9RfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgT1JERVIgQlkgMSwgMiwgMztcclxuICAgICAgICAgICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gdGVtIChvcGVyYXRpdm8sIGFyZWEsIGVuYywgZG9taW5pbywgaGFiaWxpdGFkYSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICR7b3BEZXN0aW5vUX0gQVMgb3BlcmF0aXZvLCBhcmVhLCAoYXJlYSB8fCBlbmM6OnRleHQpIGVuYywgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVNFIFdIRU4gZW5jcy5lbmMgPCAxMDYgVEhFTiAzIEVMU0UgNSBFTkQgQVMgZG9taW5pbywgVFJVRSBBUyBoYWJpbGl0YWRhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gYXJlYXMgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEpPSU4gKFNFTEVDVCBnZW5lcmF0ZV9zZXJpZXMoMTAwLCAxMTApIGVuYykgZW5jcyBPTiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIGFyZWFzLm9wZXJhdGl2byA9ICR7b3BEZXN0aW5vUX07XHJcbiAgICAgICAgICAgICAgICAgICAgRU5EIElGO1xyXG4gICAgICAgICAgICAgICAgRU5EICQkO1xyXG4gICAgICAgICAgICBgO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGVsZXRlcyA9IGBcclxuICAgICAgICAgICAgLS1kZWxldGVzIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICAtLWRlbGV0ZSBmcm9tIHRhcmVhc19hcmVhcyB3aGVyZSBvcGVyYXRpdm8gPSAke29wRGVzdGlub1F9O1xyXG4gICAgICAgICAgICAtLWRlbGV0ZSBmcm9tIGNhc2lsbGVyb3Mgd2hlcmUgb3BlcmF0aXZvID0gJHtvcERlc3Rpbm9RfTtcclxuICAgICAgICAgICAgLS1kZWxldGUgZnJvbSB1bmlkYWRfYW5hbGlzaXMgd2hlcmUgb3BlcmF0aXZvID0gJHtvcERlc3Rpbm9RfTtcclxuICAgICAgICAgICAgLS1kZWxldGUgZnJvbSB0YXJlYXNfdGVtIHdoZXJlIG9wZXJhdGl2byA9ICR7b3BEZXN0aW5vUX07XHJcbiAgICAgICAgICAgIC0tZGVsZXRlIGZyb20gdGVtIHdoZXJlIG9wZXJhdGl2byA9ICR7b3BEZXN0aW5vUX07XHJcbiAgICAgICAgICAgIC0tZGVsZXRlIGZyb20gYXJlYXMgd2hlcmUgb3BlcmF0aXZvID0gJHtvcERlc3Rpbm9RfTtcclxuICAgICAgICAgICAgLS1kZWxldGUgZnJvbSB0YXJlYXMgd2hlcmUgb3BlcmF0aXZvID0gJHtvcERlc3Rpbm9RfTtcclxuICAgICAgICAgICAgLS1kZWxldGUgZnJvbSBvcGVyYXRpdm9zIHdoZXJlIG9wZXJhdGl2byA9ICR7b3BEZXN0aW5vUX07XHJcbiAgICAgICAgICAgIC0tZGVsZXRlIGZyb20gcmVhIHdoZXJlIG9wZXJhdGl2byA9ICR7b3BEZXN0aW5vUX07XHJcbiAgICAgICAgICAgIC0tZGVsZXRlIGZyb20gbm9fcmVhIHdoZXJlIG9wZXJhdGl2byA9ICR7b3BEZXN0aW5vUX07XHJcbiAgICAgICAgICAgIC0tZGVsZXRlIGZyb20gcmVhX3N1cCB3aGVyZSBvcGVyYXRpdm8gPSAke29wRGVzdGlub1F9O1xyXG4gICAgICAgICAgICAtLWRlbGV0ZSBmcm9tIG5vX3JlYV9zdXAgd2hlcmUgb3BlcmF0aXZvID0gJHtvcERlc3Rpbm9RfTtcclxuICAgICAgICAgICAgYDtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNxbCA9IGBzZXQgc2VhcmNoX3BhdGggPSBcIiR7cGFyYW1zLnNjaGVtYV9uYW1lfVwiO2AgKyBgXFxuXFxuYFxyXG4gICAgICAgICAgICAgICAgKyBkaXNhYmxlQ2FzaWxsZXJvc0ZLXHJcbiAgICAgICAgICAgICAgICArIG5vdGljZXNTcWxcclxuICAgICAgICAgICAgICAgICsgJ1xcblxcbidcclxuICAgICAgICAgICAgICAgICsgdGFibGVzUmVzdWx0Lm1hcChxdWVyeSA9PiBidWlsZEluc2VydHMocXVlcnkpKS5qb2luKCdcXG5cXG4nKVxyXG4gICAgICAgICAgICAgICAgKyAnXFxuXFxuJyArIGNvbmRpdGlvbmFsQXJlYXNUZW1TcWxcclxuICAgICAgICAgICAgICAgICsgJ1xcblxcbicgKyBlbmFibGVDYXNpbGxlcm9zRktcclxuICAgICAgICAgICAgICAgICsgJ1xcblxcbicgKyBkZWxldGVzO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHNxbDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIGFjdGlvbjogJ2VuY3Vlc3RhX2NhcGFfYV9wcm9kX3Bhc2FyJyxcclxuICAgICAgICBwYXJhbWV0ZXJzOiBbXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ29wZXJhdGl2bycsIHR5cGVOYW1lOiAndGV4dCcsIHJlZmVyZW5jZXM6ICdvcGVyYXRpdm9zJyB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdlbmMnLCB0eXBlTmFtZTogJ3RleHQnIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICByb2xlczogWydhZG1pbiddLFxyXG4gICAgICAgIGNvcmVGdW5jdGlvbjogYXN5bmMgZnVuY3Rpb24gKGNvbnRleHQ6IFByb2NlZHVyZUNvbnRleHQsIHBhcmFtZXRlcnM6IENvcmVGdW5jdGlvblBhcmFtZXRlcnM8eyBvcGVyYXRpdm86IElkT3BlcmF0aXZvLCBlbmM6IHN0cmluZyB9Pikge1xyXG4gICAgICAgICAgICAoYXdhaXQgY29udGV4dC5jbGllbnQucXVlcnkoXHJcbiAgICAgICAgICAgICAgICBgdXBkYXRlIHRlbVxyXG4gICAgICAgICAgICAgICAgICAgIHNldCBlbmNfYXV0b2dlbmVyYWRvX2RtID0gZW5jX2F1dG9nZW5lcmFkb19kbV9jYXBhLCBlbmNfYXV0b2dlbmVyYWRvX2RtX2NhcGEgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3BlcmF0aXZvID0gJDEgYW5kIGVuYyA9ICQyIGFuZCBlbmNfYXV0b2dlbmVyYWRvX2RtX2NhcGEgaXMgbm90IG51bGxcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5pbmcgKmAsXHJcbiAgICAgICAgICAgICAgICBbcGFyYW1ldGVycy5vcGVyYXRpdm8sIHBhcmFtZXRlcnMuZW5jXVxyXG4gICAgICAgICAgICApLmZldGNoVW5pcXVlUm93KCkpLnJvdztcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBgc2UgbW92acOzIGxhIGVuY3Vlc3RhICR7cGFyYW1ldGVycy5lbmN9IGEgcHJvZHVjY2nDs25gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXTsiXX0=
|