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,589 @@
|
|
|
1
|
+
(function (factory) {
|
|
2
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
3
|
+
var v = factory(require, exports);
|
|
4
|
+
if (v !== undefined) module.exports = v;
|
|
5
|
+
}
|
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
|
7
|
+
define(["require", "exports", "mocha", "expre-parser", "node:assert", "../unlogged/calculos-encuesta", "../unlogged/helpers-casilleros"], factory);
|
|
8
|
+
}
|
|
9
|
+
})(function (require, exports) {
|
|
10
|
+
"use strict";
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const mocha_1 = require("mocha");
|
|
13
|
+
const ExpresionParser = require("expre-parser");
|
|
14
|
+
const assert = require("node:assert");
|
|
15
|
+
const calculos_encuesta_1 = require("../unlogged/calculos-encuesta");
|
|
16
|
+
const helpers_casilleros_1 = require("../unlogged/helpers-casilleros");
|
|
17
|
+
// Evaluador simple para tests: compila la expresión JS con new Function
|
|
18
|
+
const evaluarMock = (condicionJs, valores) => {
|
|
19
|
+
var internalFun = new Function('valores', 'helpers', 'return ' + condicionJs);
|
|
20
|
+
try {
|
|
21
|
+
var result = internalFun(valores, helpers_casilleros_1.helpersCasilleros);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
throw err;
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
};
|
|
28
|
+
const operativo = 'dmencu';
|
|
29
|
+
const uaPrincipalMock = {
|
|
30
|
+
unidad_analisis: 'viviendas',
|
|
31
|
+
padre: undefined,
|
|
32
|
+
pk_agregada: 'vivienda',
|
|
33
|
+
hijas: {
|
|
34
|
+
hogares: { unidad_analisis: 'hogares', padre: 'viviendas', pk_agregada: 'hogar', hijas: {} }
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const uaTresNivelesMock = {
|
|
38
|
+
unidad_analisis: 'viviendas',
|
|
39
|
+
padre: undefined,
|
|
40
|
+
pk_agregada: 'vivienda',
|
|
41
|
+
hijas: {
|
|
42
|
+
hogares: {
|
|
43
|
+
unidad_analisis: 'hogares',
|
|
44
|
+
padre: 'viviendas',
|
|
45
|
+
pk_agregada: 'hogar',
|
|
46
|
+
hijas: {
|
|
47
|
+
personas: {
|
|
48
|
+
unidad_analisis: 'personas',
|
|
49
|
+
padre: 'hogares',
|
|
50
|
+
pk_agregada: 'persona',
|
|
51
|
+
hijas: {}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const uaViviendaConVisitasMock = {
|
|
58
|
+
unidad_analisis: 'viviendas',
|
|
59
|
+
padre: undefined,
|
|
60
|
+
pk_agregada: 'vivienda',
|
|
61
|
+
hijas: {
|
|
62
|
+
hogares: {
|
|
63
|
+
unidad_analisis: 'hogares',
|
|
64
|
+
padre: 'viviendas',
|
|
65
|
+
pk_agregada: 'hogar',
|
|
66
|
+
hijas: {
|
|
67
|
+
personas: {
|
|
68
|
+
unidad_analisis: 'personas',
|
|
69
|
+
padre: 'hogares',
|
|
70
|
+
pk_agregada: 'persona',
|
|
71
|
+
hijas: {}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
//@ts-ignore visitas es una ua
|
|
76
|
+
visitas: {
|
|
77
|
+
unidad_analisis: 'visitas',
|
|
78
|
+
padre: 'viviendas',
|
|
79
|
+
pk_agregada: 'visita',
|
|
80
|
+
hijas: {}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
var funcionesConocidas = {};
|
|
85
|
+
var compiler = new ExpresionParser.Compiler({
|
|
86
|
+
language: 'js',
|
|
87
|
+
varWrapper: (var_name) => `helpers.null2zero(valores.${var_name})`,
|
|
88
|
+
funWrapper: (functionName) => {
|
|
89
|
+
if (!funcionesConocidas[functionName]) {
|
|
90
|
+
funcionesConocidas[functionName] = true;
|
|
91
|
+
}
|
|
92
|
+
return `helpers.funs.${functionName}`;
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
function compilarExpresion(expresion) {
|
|
96
|
+
return compiler.toCode(ExpresionParser.parse(expresion
|
|
97
|
+
.replace(/\bis distinct from\b/gi, ' <> ')
|
|
98
|
+
.replace(/!!/gi, ' '))).replace(/helpers\.funs\.blanco\(helpers.null2zero\(/g, 'helpers.funs.blanco((')
|
|
99
|
+
.replace(/helpers\.funs\.informado\(helpers.null2zero\(/g, 'helpers.funs.informado((');
|
|
100
|
+
}
|
|
101
|
+
function conCondicionJs(input) {
|
|
102
|
+
if (Array.isArray(input)) {
|
|
103
|
+
return input.map((item) => (Object.assign(Object.assign({}, item), { condicion_js: compilarExpresion(item.condicion) })));
|
|
104
|
+
}
|
|
105
|
+
return Object.assign(Object.assign({}, input), { condicion_js: compilarExpresion(input.condicion) });
|
|
106
|
+
}
|
|
107
|
+
// ---- Fixtures de datos ----
|
|
108
|
+
const reasBase = conCondicionJs([
|
|
109
|
+
{ operativo, rea: 1, descripcion: 'Completa', condicion: "v_rea = 1", orden: 1, es_positiva: true, tarea: 'encu' },
|
|
110
|
+
{ operativo, rea: 2, descripcion: 'Incompleta', condicion: "v_rea = 2", orden: 2, es_positiva: false, tarea: 'encu' },
|
|
111
|
+
]);
|
|
112
|
+
const reasSinTarea = conCondicionJs([
|
|
113
|
+
{ operativo, rea: 1, descripcion: 'Global', condicion: "v_rea = 1", orden: 1, es_positiva: true, tarea: null },
|
|
114
|
+
]);
|
|
115
|
+
const reasConMultiplesTareas = conCondicionJs([
|
|
116
|
+
{ operativo, rea: 1, descripcion: 'Encu', condicion: "v_rea = 1", orden: 1, es_positiva: true, tarea: 'encu' },
|
|
117
|
+
{ operativo, rea: 2, descripcion: 'Recu', condicion: "v_rea = 1", orden: 2, es_positiva: true, tarea: 'recu' },
|
|
118
|
+
]);
|
|
119
|
+
const reasSup = conCondicionJs([
|
|
120
|
+
{ operativo, rea_sup: 10, descripcion: 'Sup Completa', condicion: "v_rea_sup = 1", orden: 1, es_positiva: false, tarea: null },
|
|
121
|
+
]);
|
|
122
|
+
const noReas = [
|
|
123
|
+
{ operativo, no_rea: 101, descripcion: 'Ausente', grupo: 'G1', variable: 'v_norea', valor: '1', grupo0: '0', orden: 1 },
|
|
124
|
+
];
|
|
125
|
+
const noReasSup = [
|
|
126
|
+
{ operativo, no_rea_sup: 201, desc_norea_sup: 'Ausente Sup', grupo_sup: 'GS1', variable_sup: 'v_norea_sup', valor_sup: '1', grupo0_sup: '0', orden: 1 },
|
|
127
|
+
];
|
|
128
|
+
// =========================================================
|
|
129
|
+
(0, mocha_1.describe)('dmencu - buscarReaNoReaEnRespuestas', () => {
|
|
130
|
+
// ---- Casos Borde y Listas Vacías ----
|
|
131
|
+
(0, mocha_1.describe)('casos borde y estructuras vacías', () => {
|
|
132
|
+
(0, mocha_1.it)('devuelve { codigo: null, resultado: false } si la lista de REA/NO_REA está vacía', () => {
|
|
133
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, [], 'rea', 'encu', evaluarMock);
|
|
134
|
+
assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
|
|
135
|
+
});
|
|
136
|
+
(0, mocha_1.it)('devuelve { codigo: null, resultado: false } si el objeto respuestas está vacío', () => {
|
|
137
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, {}, reasBase, 'rea', 'encu', evaluarMock);
|
|
138
|
+
assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
|
|
139
|
+
});
|
|
140
|
+
(0, mocha_1.it)('ignora REAs con tarea específica cuando se busca otra tarea distinta', () => {
|
|
141
|
+
const reasSoloRecu = conCondicionJs([
|
|
142
|
+
{ operativo, rea: 9, descripcion: 'Solo Recu', condicion: "v_rea = 1", orden: 1, es_positiva: true, tarea: 'recu' },
|
|
143
|
+
]);
|
|
144
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, reasSoloRecu, 'rea', 'encu', evaluarMock);
|
|
145
|
+
assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
// ---- REA ----
|
|
149
|
+
(0, mocha_1.describe)('rea: evaluación de condición JS', () => {
|
|
150
|
+
(0, mocha_1.it)('encuentra una rea cuando la condición JS es verdadera', () => {
|
|
151
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, reasBase, 'rea', 'encu', evaluarMock);
|
|
152
|
+
assert.deepStrictEqual(resultado, { codigo: 1, resultado: true });
|
|
153
|
+
});
|
|
154
|
+
(0, mocha_1.it)('devuelve resultado=false cuando es_positiva=false', () => {
|
|
155
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '2' }, reasBase, 'rea', 'encu', evaluarMock);
|
|
156
|
+
assert.deepStrictEqual(resultado, { codigo: 2, resultado: false });
|
|
157
|
+
});
|
|
158
|
+
(0, mocha_1.it)('devuelve { codigo: null, resultado: false } si ninguna condición se cumple', () => {
|
|
159
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '99' }, reasBase, 'rea', 'encu', evaluarMock);
|
|
160
|
+
assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
|
|
161
|
+
});
|
|
162
|
+
(0, mocha_1.it)('respeta el orden de prioridad aunque la lista llegue desordenada', () => {
|
|
163
|
+
const listaDesordenada = conCondicionJs([
|
|
164
|
+
{ operativo, rea: 2, descripcion: 'Segundo', condicion: "v_rea = 2", orden: 2, es_positiva: false, tarea: null },
|
|
165
|
+
{ operativo, rea: 1, descripcion: 'Primero', condicion: "v_rea = 1", orden: 1, es_positiva: true, tarea: null },
|
|
166
|
+
]);
|
|
167
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, listaDesordenada, 'rea', 'encu', evaluarMock);
|
|
168
|
+
assert.deepStrictEqual(resultado, { codigo: 1, resultado: true });
|
|
169
|
+
});
|
|
170
|
+
(0, mocha_1.it)('aplica una condición JS compleja con múltiples variables', () => {
|
|
171
|
+
const reasComplejas = conCondicionJs([
|
|
172
|
+
{ operativo, rea: 5, descripcion: 'Doble condición', condicion: "v1 = 1 and v2 = 2", orden: 1, es_positiva: true, tarea: null },
|
|
173
|
+
]);
|
|
174
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v1: '1', v2: '2' }, reasComplejas, 'rea', 'encu', evaluarMock);
|
|
175
|
+
assert.deepStrictEqual(resultado, { codigo: 5, resultado: true });
|
|
176
|
+
});
|
|
177
|
+
(0, mocha_1.it)('no confunde rea de una tarea con la de otra tarea', () => {
|
|
178
|
+
const resultadoEncu = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, reasConMultiplesTareas, 'rea', 'encu', evaluarMock);
|
|
179
|
+
assert.deepStrictEqual(resultadoEncu, { codigo: 1, resultado: true });
|
|
180
|
+
const resultadoRecu = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, reasConMultiplesTareas, 'rea', 'recu', evaluarMock);
|
|
181
|
+
assert.deepStrictEqual(resultadoRecu, { codigo: 2, resultado: true });
|
|
182
|
+
const resultadoSupe = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, reasConMultiplesTareas, 'rea', 'supe', evaluarMock);
|
|
183
|
+
assert.deepStrictEqual(resultadoSupe, { codigo: null, resultado: false });
|
|
184
|
+
});
|
|
185
|
+
(0, mocha_1.it)('una rea sin tarea aplica a cualquier tarea', () => {
|
|
186
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, reasSinTarea, 'rea', 'recu', evaluarMock);
|
|
187
|
+
assert.deepStrictEqual(resultado, { codigo: 1, resultado: true });
|
|
188
|
+
});
|
|
189
|
+
(0, mocha_1.it)('lanza error si condicion_js está definida pero no se pasa evaluarExpresion', () => {
|
|
190
|
+
assert.throws(() => (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea: '1' }, reasBase, 'rea', 'encu'), /Se requiere evaluarExpresion/);
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
// ---- REA_SUP ----
|
|
194
|
+
(0, mocha_1.describe)('rea_sup: evaluación de condición JS', () => {
|
|
195
|
+
(0, mocha_1.it)('encuentra una rea_sup cuando la condición JS es verdadera', () => {
|
|
196
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea_sup: '1' }, reasSup, 'rea_sup', 'encu', evaluarMock);
|
|
197
|
+
assert.deepStrictEqual(resultado, { codigo: 10, resultado: false });
|
|
198
|
+
});
|
|
199
|
+
(0, mocha_1.it)('devuelve { codigo: null, resultado: false } si no cumple', () => {
|
|
200
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_rea_sup: '9' }, reasSup, 'rea_sup', 'encu', evaluarMock);
|
|
201
|
+
assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
// ---- NO_REA ----
|
|
205
|
+
(0, mocha_1.describe)('no_rea: comparación simple variable/valor', () => {
|
|
206
|
+
(0, mocha_1.it)('encuentra una no_rea cuando variable == valor', () => {
|
|
207
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_norea: '1' }, noReas, 'no_rea', 'encu');
|
|
208
|
+
assert.deepStrictEqual(resultado, { codigo: 101, resultado: true });
|
|
209
|
+
});
|
|
210
|
+
(0, mocha_1.it)('devuelve { codigo: null, resultado: false } si el valor no coincide', () => {
|
|
211
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_norea: '9' }, noReas, 'no_rea', 'encu');
|
|
212
|
+
assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
// ---- NO_REA_SUP ----
|
|
216
|
+
(0, mocha_1.describe)('no_rea_sup: comparación simple variable_sup/valor_sup', () => {
|
|
217
|
+
(0, mocha_1.it)('encuentra una no_rea_sup cuando variable_sup == valor_sup', () => {
|
|
218
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_norea_sup: '1' }, noReasSup, 'no_rea_sup', 'encu');
|
|
219
|
+
assert.deepStrictEqual(resultado, { codigo: 201, resultado: true });
|
|
220
|
+
});
|
|
221
|
+
(0, mocha_1.it)('devuelve { codigo: null, resultado: false } si no coincide', () => {
|
|
222
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { v_norea_sup: '9' }, noReasSup, 'no_rea_sup', 'encu');
|
|
223
|
+
assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
// ---- Búsqueda recursiva y Multinivel ----
|
|
227
|
+
(0, mocha_1.describe)('búsqueda recursiva en unidades hijas', () => {
|
|
228
|
+
(0, mocha_1.it)('encuentra una no_rea dentro de un array de unidad hija (hogares)', () => {
|
|
229
|
+
const respuestas = {
|
|
230
|
+
vivienda_id: 1,
|
|
231
|
+
hogares: [
|
|
232
|
+
{ id: 1, v_norea: '9' },
|
|
233
|
+
{ id: 2, v_norea: '1' },
|
|
234
|
+
]
|
|
235
|
+
};
|
|
236
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, noReas, 'no_rea', 'encu');
|
|
237
|
+
assert.deepStrictEqual(resultado, { codigo: 101, resultado: true });
|
|
238
|
+
});
|
|
239
|
+
(0, mocha_1.it)('devuelve nulo si ninguna unidad hija cumple la condición', () => {
|
|
240
|
+
const respuestas = {
|
|
241
|
+
vivienda_id: 1,
|
|
242
|
+
hogares: [{ id: 1, v_norea: '9' }]
|
|
243
|
+
};
|
|
244
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, noReas, 'no_rea', 'encu');
|
|
245
|
+
assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
|
|
246
|
+
});
|
|
247
|
+
(0, mocha_1.it)('maneja de forma segura hogares null, vacíos o undefined', () => {
|
|
248
|
+
const resultadoNull = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { vivienda_id: 1, hogares: null }, noReas, 'no_rea', 'encu');
|
|
249
|
+
assert.deepStrictEqual(resultadoNull, { codigo: null, resultado: false });
|
|
250
|
+
const resultadoVacio = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, { vivienda_id: 1, hogares: [] }, noReas, 'no_rea', 'encu');
|
|
251
|
+
assert.deepStrictEqual(resultadoVacio, { codigo: null, resultado: false });
|
|
252
|
+
});
|
|
253
|
+
(0, mocha_1.it)('encuentra una rea en unidad hija cuando todos cumplen condición JS (es_positiva = true)', () => {
|
|
254
|
+
const respuestas = {
|
|
255
|
+
vivienda_id: 1,
|
|
256
|
+
hogares: [
|
|
257
|
+
{ id: 1, v_rea: '1' },
|
|
258
|
+
{ id: 2, v_rea: '1' },
|
|
259
|
+
]
|
|
260
|
+
};
|
|
261
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, reasBase, 'rea', 'encu', evaluarMock);
|
|
262
|
+
assert.deepStrictEqual(resultado, { codigo: 1, resultado: true });
|
|
263
|
+
});
|
|
264
|
+
(0, mocha_1.it)('evalúa una rea con condición que combina una variable de la UA principal (vivienda) y una de la UA hija (hogar)', () => {
|
|
265
|
+
const reasMultilevel = conCondicionJs([
|
|
266
|
+
{
|
|
267
|
+
operativo,
|
|
268
|
+
rea: 10,
|
|
269
|
+
descripcion: 'Vivienda habitada con hogar completo',
|
|
270
|
+
condicion: "vivienda_habitada = 1 and hogar_completo = 1",
|
|
271
|
+
orden: 1,
|
|
272
|
+
es_positiva: true,
|
|
273
|
+
tarea: 'encu'
|
|
274
|
+
},
|
|
275
|
+
]);
|
|
276
|
+
const respuestas = {
|
|
277
|
+
vivienda_id: 1,
|
|
278
|
+
vivienda_habitada: '1',
|
|
279
|
+
hogares: [
|
|
280
|
+
{ id: 1, hogar_completo: '0' },
|
|
281
|
+
{ id: 2, hogar_completo: '1' },
|
|
282
|
+
]
|
|
283
|
+
};
|
|
284
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, reasMultilevel, 'rea', 'encu', evaluarMock);
|
|
285
|
+
assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
|
|
286
|
+
});
|
|
287
|
+
(0, mocha_1.it)('evalúa una rea_sup con condición que combina una variable de la UA principal y una de la UA hija', () => {
|
|
288
|
+
const reasSupMultilevel = conCondicionJs([
|
|
289
|
+
{
|
|
290
|
+
operativo,
|
|
291
|
+
rea_sup: 20,
|
|
292
|
+
descripcion: 'Supervisión aprobada multinivel',
|
|
293
|
+
condicion: "vivienda_status = 1 and hogar_supervisado = 1",
|
|
294
|
+
orden: 1,
|
|
295
|
+
es_positiva: true,
|
|
296
|
+
tarea: 'encu'
|
|
297
|
+
},
|
|
298
|
+
]);
|
|
299
|
+
const respuestas = {
|
|
300
|
+
vivienda_id: 1,
|
|
301
|
+
vivienda_status: '1',
|
|
302
|
+
hogares: [
|
|
303
|
+
{ id: 1, hogar_supervisado: '1' },
|
|
304
|
+
]
|
|
305
|
+
};
|
|
306
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, reasSupMultilevel, 'rea_sup', 'encu', evaluarMock);
|
|
307
|
+
assert.deepStrictEqual(resultado, { codigo: 20, resultado: true });
|
|
308
|
+
});
|
|
309
|
+
(0, mocha_1.it)('encuentra una no_rea anidada a 3 niveles (Vivienda -> Hogar -> Persona)', () => {
|
|
310
|
+
const respuestas = {
|
|
311
|
+
vivienda_id: 1,
|
|
312
|
+
hogares: [
|
|
313
|
+
{
|
|
314
|
+
hogar_id: 1,
|
|
315
|
+
personas: [
|
|
316
|
+
{ persona_id: 1, v_norea: '9' },
|
|
317
|
+
{ persona_id: 2, v_norea: '1' }
|
|
318
|
+
]
|
|
319
|
+
}
|
|
320
|
+
]
|
|
321
|
+
};
|
|
322
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaTresNivelesMock, respuestas, noReas, 'no_rea', 'encu');
|
|
323
|
+
assert.deepStrictEqual(resultado, { codigo: 101, resultado: true });
|
|
324
|
+
});
|
|
325
|
+
(0, mocha_1.describe)('evaluación de es_positiva en múltiples unidades hijas', () => {
|
|
326
|
+
(0, mocha_1.it)('si es_positiva = true y NO todos los hogares cumplen la condición, NO debe matchear la rea positiva', () => {
|
|
327
|
+
const reasPositiva = conCondicionJs([
|
|
328
|
+
{
|
|
329
|
+
operativo,
|
|
330
|
+
rea: 1,
|
|
331
|
+
descripcion: 'Todos los hogares completos',
|
|
332
|
+
condicion: "hogar_completo = 1",
|
|
333
|
+
orden: 1,
|
|
334
|
+
es_positiva: true,
|
|
335
|
+
tarea: 'encu'
|
|
336
|
+
},
|
|
337
|
+
]);
|
|
338
|
+
const respuestas = {
|
|
339
|
+
vivienda_id: 1,
|
|
340
|
+
hogares: [
|
|
341
|
+
{ id: 1, hogar_completo: '1' },
|
|
342
|
+
{ id: 2, hogar_completo: '0' },
|
|
343
|
+
]
|
|
344
|
+
};
|
|
345
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, reasPositiva, 'rea', 'encu', evaluarMock);
|
|
346
|
+
assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
|
|
347
|
+
});
|
|
348
|
+
(0, mocha_1.it)('si es_positiva = true y una unidad hija anterior no tiene un campo cargado aún (undefined), NO debe matchear la rea positiva', () => {
|
|
349
|
+
const reasPositiva = conCondicionJs([
|
|
350
|
+
{
|
|
351
|
+
operativo,
|
|
352
|
+
rea: 1,
|
|
353
|
+
descripcion: 'Todos los hogares completos',
|
|
354
|
+
condicion: "hogar_completo = 1",
|
|
355
|
+
orden: 1,
|
|
356
|
+
es_positiva: true,
|
|
357
|
+
tarea: 'encu'
|
|
358
|
+
},
|
|
359
|
+
]);
|
|
360
|
+
const respuestas = {
|
|
361
|
+
vivienda_id: 1,
|
|
362
|
+
hogares: [
|
|
363
|
+
{ id: 1 }, // Primer hogar sin 'hogar_completo' cargado aún
|
|
364
|
+
{ id: 2, hogar_completo: '1' }, // Último hogar cumple la condición
|
|
365
|
+
]
|
|
366
|
+
};
|
|
367
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, reasPositiva, 'rea', 'encu', evaluarMock);
|
|
368
|
+
assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
|
|
369
|
+
});
|
|
370
|
+
(0, mocha_1.it)('si es_positiva = true y TODOS los hogares cumplen la condición, debe matchear la rea positiva', () => {
|
|
371
|
+
const reasPositiva = conCondicionJs([
|
|
372
|
+
{
|
|
373
|
+
operativo,
|
|
374
|
+
rea: 1,
|
|
375
|
+
descripcion: 'Todos los hogares completos',
|
|
376
|
+
condicion: "hogar_completo = 1",
|
|
377
|
+
orden: 1,
|
|
378
|
+
es_positiva: true,
|
|
379
|
+
tarea: 'encu'
|
|
380
|
+
},
|
|
381
|
+
]);
|
|
382
|
+
const respuestas = {
|
|
383
|
+
vivienda_id: 1,
|
|
384
|
+
hogares: [
|
|
385
|
+
{ id: 1, hogar_completo: '1' },
|
|
386
|
+
{ id: 2, hogar_completo: '1' },
|
|
387
|
+
]
|
|
388
|
+
};
|
|
389
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, reasPositiva, 'rea', 'encu', evaluarMock);
|
|
390
|
+
assert.deepStrictEqual(resultado, { codigo: 1, resultado: true });
|
|
391
|
+
});
|
|
392
|
+
(0, mocha_1.it)('si es_positiva = false y al menos un hogar cumple la condición, debe matchear la rea negativa', () => {
|
|
393
|
+
const reasNegativa = conCondicionJs([
|
|
394
|
+
{
|
|
395
|
+
operativo,
|
|
396
|
+
rea: 2,
|
|
397
|
+
descripcion: 'Al menos un hogar rechazado',
|
|
398
|
+
condicion: "hogar_rechazado = 1",
|
|
399
|
+
orden: 1,
|
|
400
|
+
es_positiva: false,
|
|
401
|
+
tarea: 'encu'
|
|
402
|
+
},
|
|
403
|
+
]);
|
|
404
|
+
const respuestas = {
|
|
405
|
+
vivienda_id: 1,
|
|
406
|
+
hogares: [
|
|
407
|
+
{ id: 1, hogar_rechazado: '0' },
|
|
408
|
+
{ id: 2, hogar_rechazado: '1' },
|
|
409
|
+
]
|
|
410
|
+
};
|
|
411
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, reasNegativa, 'rea', 'encu', evaluarMock);
|
|
412
|
+
assert.deepStrictEqual(resultado, { codigo: 2, resultado: false });
|
|
413
|
+
});
|
|
414
|
+
(0, mocha_1.it)('evalúa 2 REAs (positiva y negativa): si la positiva no se cumple para todos los hogares pero la negativa sí, devuelve la REA negativa', () => {
|
|
415
|
+
const reasMixtas = conCondicionJs([
|
|
416
|
+
{
|
|
417
|
+
operativo,
|
|
418
|
+
rea: 1,
|
|
419
|
+
descripcion: 'Todos los hogares completos',
|
|
420
|
+
condicion: "hogar_completo = 1",
|
|
421
|
+
orden: 1,
|
|
422
|
+
es_positiva: true,
|
|
423
|
+
tarea: 'encu'
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
operativo,
|
|
427
|
+
rea: 2,
|
|
428
|
+
descripcion: 'Al menos un hogar completo',
|
|
429
|
+
condicion: "hogar_completo = 1",
|
|
430
|
+
orden: 2,
|
|
431
|
+
es_positiva: false,
|
|
432
|
+
tarea: 'encu'
|
|
433
|
+
}
|
|
434
|
+
]);
|
|
435
|
+
const respuestas = {
|
|
436
|
+
vivienda_id: 1,
|
|
437
|
+
hogares: [
|
|
438
|
+
{ id: 1, hogar_completo: '1' },
|
|
439
|
+
{ id: 2, hogar_completo: '0' },
|
|
440
|
+
]
|
|
441
|
+
};
|
|
442
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipalMock, respuestas, reasMixtas, 'rea', 'encu', evaluarMock);
|
|
443
|
+
assert.deepStrictEqual(resultado, { codigo: 2, resultado: false });
|
|
444
|
+
});
|
|
445
|
+
(0, mocha_1.it)('si es_positiva = true y una persona de OTRO hogar (prima) no cumple la condición, NO debe matchear la rea positiva', () => {
|
|
446
|
+
const reasPositiva = conCondicionJs([
|
|
447
|
+
{
|
|
448
|
+
operativo,
|
|
449
|
+
rea: 1,
|
|
450
|
+
descripcion: 'Todas las personas con p2 = 1',
|
|
451
|
+
condicion: "p2 = 1",
|
|
452
|
+
orden: 1,
|
|
453
|
+
es_positiva: true,
|
|
454
|
+
tarea: 'encu'
|
|
455
|
+
},
|
|
456
|
+
]);
|
|
457
|
+
const respuestasConPrimaFallida = {
|
|
458
|
+
vivienda_id: 1,
|
|
459
|
+
hogares: [
|
|
460
|
+
{
|
|
461
|
+
hogar_id: 1,
|
|
462
|
+
personas: [
|
|
463
|
+
{ persona_id: 1, p2: '1' },
|
|
464
|
+
{ persona_id: 2, p2: '1' }
|
|
465
|
+
]
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
hogar_id: 2,
|
|
469
|
+
personas: [
|
|
470
|
+
{ persona_id: 3, p2: '0' } // La "prima" en el Hogar 2 no cumple
|
|
471
|
+
]
|
|
472
|
+
}
|
|
473
|
+
]
|
|
474
|
+
};
|
|
475
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaTresNivelesMock, respuestasConPrimaFallida, reasPositiva, 'rea', 'encu', evaluarMock);
|
|
476
|
+
assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
|
|
477
|
+
});
|
|
478
|
+
(0, mocha_1.it)('si es_positiva = true y hay un segundo hogar sin personas cargadas aún, NO debe matchear la REA positiva', () => {
|
|
479
|
+
const reasPositiva = conCondicionJs([
|
|
480
|
+
{
|
|
481
|
+
operativo,
|
|
482
|
+
rea: 1,
|
|
483
|
+
descripcion: 'Todas las personas completas en vivienda y hogar válidos',
|
|
484
|
+
condicion: "vivienda_habitada = 1 and hogar_valido = 1 and persona_completa = 1",
|
|
485
|
+
orden: 1,
|
|
486
|
+
es_positiva: true,
|
|
487
|
+
tarea: 'encu'
|
|
488
|
+
},
|
|
489
|
+
]);
|
|
490
|
+
const respuestas = {
|
|
491
|
+
vivienda_id: 1,
|
|
492
|
+
vivienda_habitada: '1',
|
|
493
|
+
hogares: [
|
|
494
|
+
{
|
|
495
|
+
hogar_id: 1,
|
|
496
|
+
hogar_valido: '1',
|
|
497
|
+
personas: [
|
|
498
|
+
{ persona_id: 1, persona_completa: '1' }
|
|
499
|
+
]
|
|
500
|
+
},
|
|
501
|
+
{
|
|
502
|
+
hogar_id: 2,
|
|
503
|
+
hogar_valido: '1',
|
|
504
|
+
personas: [] // Sin personas cargadas aún (incompleto)
|
|
505
|
+
}
|
|
506
|
+
]
|
|
507
|
+
};
|
|
508
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaTresNivelesMock, respuestas, reasPositiva, 'rea', 'encu', evaluarMock);
|
|
509
|
+
assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
|
|
510
|
+
});
|
|
511
|
+
(0, mocha_1.it)('si es_positiva = true y hay un segundo hogar sin personas cargadas aún (sin inicializar array), NO debe matchear la REA positiva', () => {
|
|
512
|
+
const reasPositiva = conCondicionJs([
|
|
513
|
+
{
|
|
514
|
+
operativo,
|
|
515
|
+
rea: 1,
|
|
516
|
+
descripcion: 'Todas las personas completas en vivienda y hogar válidos',
|
|
517
|
+
condicion: "vivienda_habitada = 1 and hogar_valido = 1 and persona_completa = 1",
|
|
518
|
+
orden: 1,
|
|
519
|
+
es_positiva: true,
|
|
520
|
+
tarea: 'encu'
|
|
521
|
+
},
|
|
522
|
+
]);
|
|
523
|
+
const respuestas = {
|
|
524
|
+
vivienda_id: 1,
|
|
525
|
+
vivienda_habitada: '1',
|
|
526
|
+
hogares: [
|
|
527
|
+
{
|
|
528
|
+
hogar_id: 1,
|
|
529
|
+
hogar_valido: '1',
|
|
530
|
+
personas: [
|
|
531
|
+
{ persona_id: 1, persona_completa: '1' }
|
|
532
|
+
]
|
|
533
|
+
},
|
|
534
|
+
{
|
|
535
|
+
hogar_id: 2,
|
|
536
|
+
hogar_valido: '1',
|
|
537
|
+
}
|
|
538
|
+
]
|
|
539
|
+
};
|
|
540
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaTresNivelesMock, respuestas, reasPositiva, 'rea', 'encu', evaluarMock);
|
|
541
|
+
assert.deepStrictEqual(resultado, { codigo: null, resultado: false });
|
|
542
|
+
});
|
|
543
|
+
(0, mocha_1.it)('evalúa correctamente una REA positiva multinivel (vivienda + hogar + persona) existiendo ramas independientes de visitas', () => {
|
|
544
|
+
const reasPositiva = conCondicionJs([
|
|
545
|
+
{
|
|
546
|
+
operativo,
|
|
547
|
+
rea: 1,
|
|
548
|
+
descripcion: 'Todas las personas completas en hogares completos de viviendas habitadas',
|
|
549
|
+
condicion: "vivienda_habitada = 1 and hogar_completo = 1 and persona_completa = 1",
|
|
550
|
+
orden: 1,
|
|
551
|
+
es_positiva: true,
|
|
552
|
+
tarea: 'encu'
|
|
553
|
+
},
|
|
554
|
+
]);
|
|
555
|
+
const respuestas = {
|
|
556
|
+
vivienda_id: 1,
|
|
557
|
+
vivienda_habitada: '1', // Nivel Vivienda
|
|
558
|
+
visitas: [
|
|
559
|
+
{ id: 1, fecha: '2026-10-01', resultado_visita: '1' },
|
|
560
|
+
{ id: 2, fecha: '2026-10-05', resultado_visita: '1' }
|
|
561
|
+
],
|
|
562
|
+
hogares: [
|
|
563
|
+
{
|
|
564
|
+
hogar_id: 1,
|
|
565
|
+
hogar_completo: '1', // Nivel Hogar 1
|
|
566
|
+
personas: [
|
|
567
|
+
{ persona_id: 1, persona_completa: '1' }, // Nivel Persona
|
|
568
|
+
{ persona_id: 2, persona_completa: '1' }
|
|
569
|
+
]
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
hogar_id: 2,
|
|
573
|
+
hogar_completo: '1', // Nivel Hogar 2
|
|
574
|
+
personas: [
|
|
575
|
+
{ persona_id: 3, persona_completa: '1' } // Nivel Persona (Prima)
|
|
576
|
+
]
|
|
577
|
+
}
|
|
578
|
+
]
|
|
579
|
+
};
|
|
580
|
+
const resultado = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaViviendaConVisitasMock, respuestas, reasPositiva, 'rea', 'encu', evaluarMock);
|
|
581
|
+
assert.deepStrictEqual(resultado, { codigo: 1, resultado: true });
|
|
582
|
+
const resultado2 = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaViviendaConVisitasMock, respuestas, reasPositiva, 'rea', 'recu', evaluarMock);
|
|
583
|
+
assert.deepStrictEqual(resultado2, { codigo: null, resultado: false });
|
|
584
|
+
});
|
|
585
|
+
});
|
|
586
|
+
});
|
|
587
|
+
});
|
|
588
|
+
});
|
|
589
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1yZWEtbm8tcmVhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvdGVzdC1yZWEtbm8tcmVhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0lBQUEsaUNBQXFDO0lBQ3JDLGdEQUFnRDtJQUVoRCxzQ0FBdUM7SUFFdkMscUVBQStGO0lBQy9GLHVFQUFtRTtJQUduRSx3RUFBd0U7SUFDeEUsTUFBTSxXQUFXLEdBQXVCLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQzdELElBQUksV0FBVyxHQUFHLElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxHQUFHLFdBQVcsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQztZQUNELElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsc0NBQWlCLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNYLE1BQU0sR0FBRyxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUMsQ0FBQTtJQUVELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQztJQUUzQixNQUFNLGVBQWUsR0FBbUI7UUFDcEMsZUFBZSxFQUFFLFdBQVc7UUFDNUIsS0FBSyxFQUFFLFNBQVM7UUFDaEIsV0FBVyxFQUFFLFVBQVU7UUFDdkIsS0FBSyxFQUFFO1lBQ0gsT0FBTyxFQUFFLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtTQUMvRjtLQUNKLENBQUM7SUFFRixNQUFNLGlCQUFpQixHQUFtQjtRQUN0QyxlQUFlLEVBQUUsV0FBVztRQUM1QixLQUFLLEVBQUUsU0FBUztRQUNoQixXQUFXLEVBQUUsVUFBVTtRQUN2QixLQUFLLEVBQUU7WUFDSCxPQUFPLEVBQUU7Z0JBQ0wsZUFBZSxF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QVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQ2pGLENBQUM7b0JBQ0YsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRSxDQUFDLENBQUMsQ0FBQztZQUVQLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBpdCB9IGZyb20gJ21vY2hhJztcbmltcG9ydCAqIGFzIEV4cHJlc2lvblBhcnNlciBmcm9tICdleHByZS1wYXJzZXInO1xuXG5pbXBvcnQgYXNzZXJ0ID0gcmVxdWlyZSgnbm9kZTphc3NlcnQnKTtcblxuaW1wb3J0IHsgYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMsIEV2YWx1YWRvckV4cHJlc2lvbiB9IGZyb20gJy4uL3VubG9nZ2VkL2NhbGN1bG9zLWVuY3Vlc3RhJztcbmltcG9ydCB7IGhlbHBlcnNDYXNpbGxlcm9zIH0gZnJvbSAnLi4vdW5sb2dnZWQvaGVscGVycy1jYXNpbGxlcm9zJztcbmltcG9ydCB0eXBlIHsgTm9SZWEsIE5vUmVhU3VwLCBSZWEsIFJlYVN1cCwgVW5pZGFkQW5hbGlzaXMgfSBmcm9tICcuLi91bmxvZ2dlZC90aXBvcyc7XG5cbi8vIEV2YWx1YWRvciBzaW1wbGUgcGFyYSB0ZXN0czogY29tcGlsYSBsYSBleHByZXNpw7NuIEpTIGNvbiBuZXcgRnVuY3Rpb25cbmNvbnN0IGV2YWx1YXJNb2NrOiBFdmFsdWFkb3JFeHByZXNpb24gPSAoY29uZGljaW9uSnMsIHZhbG9yZXMpID0+IHtcbiAgICB2YXIgaW50ZXJuYWxGdW4gPSBuZXcgRnVuY3Rpb24oJ3ZhbG9yZXMnLCAnaGVscGVycycsICdyZXR1cm4gJyArIGNvbmRpY2lvbkpzKTtcbiAgICB0cnkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gaW50ZXJuYWxGdW4odmFsb3JlcywgaGVscGVyc0Nhc2lsbGVyb3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IG9wZXJhdGl2byA9ICdkbWVuY3UnO1xuXG5jb25zdCB1YVByaW5jaXBhbE1vY2s6IFVuaWRhZEFuYWxpc2lzID0ge1xuICAgIHVuaWRhZF9hbmFsaXNpczogJ3ZpdmllbmRhcycsXG4gICAgcGFkcmU6IHVuZGVmaW5lZCxcbiAgICBwa19hZ3JlZ2FkYTogJ3ZpdmllbmRhJyxcbiAgICBoaWphczoge1xuICAgICAgICBob2dhcmVzOiB7IHVuaWRhZF9hbmFsaXNpczogJ2hvZ2FyZXMnLCBwYWRyZTogJ3ZpdmllbmRhcycsIHBrX2FncmVnYWRhOiAnaG9nYXInLCBoaWphczoge30gfVxuICAgIH1cbn07XG5cbmNvbnN0IHVhVHJlc05pdmVsZXNNb2NrOiBVbmlkYWRBbmFsaXNpcyA9IHtcbiAgICB1bmlkYWRfYW5hbGlzaXM6ICd2aXZpZW5kYXMnLFxuICAgIHBhZHJlOiB1bmRlZmluZWQsXG4gICAgcGtfYWdyZWdhZGE6ICd2aXZpZW5kYScsXG4gICAgaGlqYXM6IHtcbiAgICAgICAgaG9nYXJlczoge1xuICAgICAgICAgICAgdW5pZGFkX2FuYWxpc2lzOiAnaG9nYXJlcycsXG4gICAgICAgICAgICBwYWRyZTogJ3ZpdmllbmRhcycsXG4gICAgICAgICAgICBwa19hZ3JlZ2FkYTogJ2hvZ2FyJyxcbiAgICAgICAgICAgIGhpamFzOiB7XG4gICAgICAgICAgICAgICAgcGVyc29uYXM6IHtcbiAgICAgICAgICAgICAgICAgICAgdW5pZGFkX2FuYWxpc2lzOiAncGVyc29uYXMnLFxuICAgICAgICAgICAgICAgICAgICBwYWRyZTogJ2hvZ2FyZXMnLFxuICAgICAgICAgICAgICAgICAgICBwa19hZ3JlZ2FkYTogJ3BlcnNvbmEnLFxuICAgICAgICAgICAgICAgICAgICBoaWphczoge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5jb25zdCB1YVZpdmllbmRhQ29uVmlzaXRhc01vY2s6IFVuaWRhZEFuYWxpc2lzID0ge1xuICAgIHVuaWRhZF9hbmFsaXNpczogJ3ZpdmllbmRhcycsXG4gICAgcGFkcmU6IHVuZGVmaW5lZCxcbiAgICBwa19hZ3JlZ2FkYTogJ3ZpdmllbmRhJyxcbiAgICBoaWphczoge1xuICAgICAgICBob2dhcmVzOiB7XG4gICAgICAgICAgICB1bmlkYWRfYW5hbGlzaXM6ICdob2dhcmVzJyxcbiAgICAgICAgICAgIHBhZHJlOiAndml2aWVuZGFzJyxcbiAgICAgICAgICAgIHBrX2FncmVnYWRhOiAnaG9nYXInLFxuICAgICAgICAgICAgaGlqYXM6IHtcbiAgICAgICAgICAgICAgICBwZXJzb25hczoge1xuICAgICAgICAgICAgICAgICAgICB1bmlkYWRfYW5hbGlzaXM6ICdwZXJzb25hcycsXG4gICAgICAgICAgICAgICAgICAgIHBhZHJlOiAnaG9nYXJlcycsXG4gICAgICAgICAgICAgICAgICAgIHBrX2FncmVnYWRhOiAncGVyc29uYScsXG4gICAgICAgICAgICAgICAgICAgIGhpamFzOiB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy9AdHMtaWdub3JlIHZpc2l0YXMgZXMgdW5hIHVhXG4gICAgICAgIHZpc2l0YXM6IHtcbiAgICAgICAgICAgIHVuaWRhZF9hbmFsaXNpczogJ3Zpc2l0YXMnLFxuICAgICAgICAgICAgcGFkcmU6ICd2aXZpZW5kYXMnLFxuICAgICAgICAgICAgcGtfYWdyZWdhZGE6ICd2aXNpdGEnLFxuICAgICAgICAgICAgaGlqYXM6IHt9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG52YXIgZnVuY2lvbmVzQ29ub2NpZGFzOiB7IFtrIGluIHN0cmluZ106IGJvb2xlYW4gfSA9IHt9XG5cbnZhciBjb21waWxlciA9IG5ldyBFeHByZXNpb25QYXJzZXIuQ29tcGlsZXIoe1xuICAgIGxhbmd1YWdlOiAnanMnLFxuICAgIHZhcldyYXBwZXI6ICh2YXJfbmFtZTogc3RyaW5nKSA9PiBgaGVscGVycy5udWxsMnplcm8odmFsb3Jlcy4ke3Zhcl9uYW1lfSlgLFxuICAgIGZ1bldyYXBwZXI6IChmdW5jdGlvbk5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIWZ1bmNpb25lc0Nvbm9jaWRhc1tmdW5jdGlvbk5hbWVdKSB7XG4gICAgICAgICAgICBmdW5jaW9uZXNDb25vY2lkYXNbZnVuY3Rpb25OYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBoZWxwZXJzLmZ1bnMuJHtmdW5jdGlvbk5hbWV9YFxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbXBpbGFyRXhwcmVzaW9uKGV4cHJlc2lvbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNvbXBpbGVyLnRvQ29kZShFeHByZXNpb25QYXJzZXIucGFyc2UoXG4gICAgICAgIGV4cHJlc2lvblxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcYmlzIGRpc3RpbmN0IGZyb21cXGIvZ2ksICcgPD4gJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8hIS9naSwgJyAnKVxuICAgICkpLnJlcGxhY2UoL2hlbHBlcnNcXC5mdW5zXFwuYmxhbmNvXFwoaGVscGVycy5udWxsMnplcm9cXCgvZywgJ2hlbHBlcnMuZnVucy5ibGFuY28oKCcpXG4gICAgICAgIC5yZXBsYWNlKC9oZWxwZXJzXFwuZnVuc1xcLmluZm9ybWFkb1xcKGhlbHBlcnMubnVsbDJ6ZXJvXFwoL2csICdoZWxwZXJzLmZ1bnMuaW5mb3JtYWRvKCgnKTtcbn1cblxuLy8gSGVscGVyIHBhcmEgY29tcGlsYXIgZSBpbnllY3RhciBjb25kaWNpb25fanMgYSB1biBvYmpldG8gbyBhcnJheVxuZnVuY3Rpb24gY29uQ29uZGljaW9uSnM8VCBleHRlbmRzIHsgY29uZGljaW9uOiBzdHJpbmcgfT4oaXRlbTogVCk6IFQgJiB7IGNvbmRpY2lvbl9qczogc3RyaW5nIH07XG5mdW5jdGlvbiBjb25Db25kaWNpb25KczxUIGV4dGVuZHMgeyBjb25kaWNpb246IHN0cmluZyB9PihpdGVtczogVFtdKTogKFQgJiB7IGNvbmRpY2lvbl9qczogc3RyaW5nIH0pW107XG5mdW5jdGlvbiBjb25Db25kaWNpb25KcyhpbnB1dDogYW55KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBpbnB1dC5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgY29uZGljaW9uX2pzOiBjb21waWxhckV4cHJlc2lvbihpdGVtLmNvbmRpY2lvbilcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbnB1dCxcbiAgICAgICAgY29uZGljaW9uX2pzOiBjb21waWxhckV4cHJlc2lvbihpbnB1dC5jb25kaWNpb24pXG4gICAgfTtcbn1cblxuLy8gLS0tLSBGaXh0dXJlcyBkZSBkYXRvcyAtLS0tXG5cbmNvbnN0IHJlYXNCYXNlID0gY29uQ29uZGljaW9uSnMoW1xuICAgIHsgb3BlcmF0aXZvLCByZWE6IDEsIGRlc2NyaXBjaW9uOiAnQ29tcGxldGEnLCBjb25kaWNpb246IFwidl9yZWEgPSAxXCIsIG9yZGVuOiAxLCBlc19wb3NpdGl2YTogdHJ1ZSwgdGFyZWE6ICdlbmN1JyB9LFxuICAgIHsgb3BlcmF0aXZvLCByZWE6IDIsIGRlc2NyaXBjaW9uOiAnSW5jb21wbGV0YScsIGNvbmRpY2lvbjogXCJ2X3JlYSA9IDJcIiwgb3JkZW46IDIsIGVzX3Bvc2l0aXZhOiBmYWxzZSwgdGFyZWE6ICdlbmN1JyB9LFxuXSk7XG5cbmNvbnN0IHJlYXNTaW5UYXJlYSA9IGNvbkNvbmRpY2lvbkpzKFtcbiAgICB7IG9wZXJhdGl2bywgcmVhOiAxLCBkZXNjcmlwY2lvbjogJ0dsb2JhbCcsIGNvbmRpY2lvbjogXCJ2X3JlYSA9IDFcIiwgb3JkZW46IDEsIGVzX3Bvc2l0aXZhOiB0cnVlLCB0YXJlYTogbnVsbCB9LFxuXSk7XG5cbmNvbnN0IHJlYXNDb25NdWx0aXBsZXNUYXJlYXMgPSBjb25Db25kaWNpb25KcyhbXG4gICAgeyBvcGVyYXRpdm8sIHJlYTogMSwgZGVzY3JpcGNpb246ICdFbmN1JywgY29uZGljaW9uOiBcInZfcmVhID0gMVwiLCBvcmRlbjogMSwgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiAnZW5jdScgfSxcbiAgICB7IG9wZXJhdGl2bywgcmVhOiAyLCBkZXNjcmlwY2lvbjogJ1JlY3UnLCBjb25kaWNpb246IFwidl9yZWEgPSAxXCIsIG9yZGVuOiAyLCBlc19wb3NpdGl2YTogdHJ1ZSwgdGFyZWE6ICdyZWN1JyB9LFxuXSk7XG5cbmNvbnN0IHJlYXNTdXAgPSBjb25Db25kaWNpb25KcyhbXG4gICAgeyBvcGVyYXRpdm8sIHJlYV9zdXA6IDEwLCBkZXNjcmlwY2lvbjogJ1N1cCBDb21wbGV0YScsIGNvbmRpY2lvbjogXCJ2X3JlYV9zdXAgPSAxXCIsIG9yZGVuOiAxLCBlc19wb3NpdGl2YTogZmFsc2UsIHRhcmVhOiBudWxsIH0sXG5dKTtcblxuY29uc3Qgbm9SZWFzOiBOb1JlYVtdID0gW1xuICAgIHsgb3BlcmF0aXZvLCBub19yZWE6IDEwMSwgZGVzY3JpcGNpb246ICdBdXNlbnRlJywgZ3J1cG86ICdHMScsIHZhcmlhYmxlOiAndl9ub3JlYScsIHZhbG9yOiAnMScsIGdydXBvMDogJzAnLCBvcmRlbjogMSB9LFxuXTtcblxuY29uc3Qgbm9SZWFzU3VwOiBOb1JlYVN1cFtdID0gW1xuICAgIHsgb3BlcmF0aXZvLCBub19yZWFfc3VwOiAyMDEsIGRlc2Nfbm9yZWFfc3VwOiAnQXVzZW50ZSBTdXAnLCBncnVwb19zdXA6ICdHUzEnLCB2YXJpYWJsZV9zdXA6ICd2X25vcmVhX3N1cCcsIHZhbG9yX3N1cDogJzEnLCBncnVwbzBfc3VwOiAnMCcsIG9yZGVuOiAxIH0sXG5dO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmRlc2NyaWJlKCdkbWVuY3UgLSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcycsICgpID0+IHtcblxuICAgIC8vIC0tLS0gQ2Fzb3MgQm9yZGUgeSBMaXN0YXMgVmFjw61hcyAtLS0tXG4gICAgZGVzY3JpYmUoJ2Nhc29zIGJvcmRlIHkgZXN0cnVjdHVyYXMgdmFjw61hcycsICgpID0+IHtcbiAgICAgICAgaXQoJ2RldnVlbHZlIHsgY29kaWdvOiBudWxsLCByZXN1bHRhZG86IGZhbHNlIH0gc2kgbGEgbGlzdGEgZGUgUkVBL05PX1JFQSBlc3TDoSB2YWPDrWEnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHsgdl9yZWE6ICcxJyB9IGFzIGFueSwgW10sICdyZWEnLCAnZW5jdScsIGV2YWx1YXJNb2NrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiBudWxsLCByZXN1bHRhZG86IGZhbHNlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnZGV2dWVsdmUgeyBjb2RpZ286IG51bGwsIHJlc3VsdGFkbzogZmFsc2UgfSBzaSBlbCBvYmpldG8gcmVzcHVlc3RhcyBlc3TDoSB2YWPDrW8nLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHt9IGFzIGFueSwgcmVhc0Jhc2UsICdyZWEnLCAnZW5jdScsIGV2YWx1YXJNb2NrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiBudWxsLCByZXN1bHRhZG86IGZhbHNlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnaWdub3JhIFJFQXMgY29uIHRhcmVhIGVzcGVjw61maWNhIGN1YW5kbyBzZSBidXNjYSBvdHJhIHRhcmVhIGRpc3RpbnRhJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVhc1NvbG9SZWN1ID0gY29uQ29uZGljaW9uSnMoW1xuICAgICAgICAgICAgICAgIHsgb3BlcmF0aXZvLCByZWE6IDksIGRlc2NyaXBjaW9uOiAnU29sbyBSZWN1JywgY29uZGljaW9uOiBcInZfcmVhID0gMVwiLCBvcmRlbjogMSwgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiAncmVjdScgfSxcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHsgdl9yZWE6ICcxJyB9IGFzIGFueSwgcmVhc1NvbG9SZWN1LCAncmVhJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyAtLS0tIFJFQSAtLS0tXG4gICAgZGVzY3JpYmUoJ3JlYTogZXZhbHVhY2nDs24gZGUgY29uZGljacOzbiBKUycsICgpID0+IHtcblxuICAgICAgICBpdCgnZW5jdWVudHJhIHVuYSByZWEgY3VhbmRvIGxhIGNvbmRpY2nDs24gSlMgZXMgdmVyZGFkZXJhJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgdWFQcmluY2lwYWxNb2NrLCB7IHZfcmVhOiAnMScgfSBhcyBhbnksIHJlYXNCYXNlLCAncmVhJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogMSwgcmVzdWx0YWRvOiB0cnVlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnZGV2dWVsdmUgcmVzdWx0YWRvPWZhbHNlIGN1YW5kbyBlc19wb3NpdGl2YT1mYWxzZScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdGFkbyA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgeyB2X3JlYTogJzInIH0gYXMgYW55LCByZWFzQmFzZSwgJ3JlYScsICdlbmN1JywgZXZhbHVhck1vY2tcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IDIsIHJlc3VsdGFkbzogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdkZXZ1ZWx2ZSB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9IHNpIG5pbmd1bmEgY29uZGljacOzbiBzZSBjdW1wbGUnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHsgdl9yZWE6ICc5OScgfSBhcyBhbnksIHJlYXNCYXNlLCAncmVhJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Jlc3BldGEgZWwgb3JkZW4gZGUgcHJpb3JpZGFkIGF1bnF1ZSBsYSBsaXN0YSBsbGVndWUgZGVzb3JkZW5hZGEnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaXN0YURlc29yZGVuYWRhID0gY29uQ29uZGljaW9uSnMoW1xuICAgICAgICAgICAgICAgIHsgb3BlcmF0aXZvLCByZWE6IDIsIGRlc2NyaXBjaW9uOiAnU2VndW5kbycsIGNvbmRpY2lvbjogXCJ2X3JlYSA9IDJcIiwgb3JkZW46IDIsIGVzX3Bvc2l0aXZhOiBmYWxzZSwgdGFyZWE6IG51bGwgfSxcbiAgICAgICAgICAgICAgICB7IG9wZXJhdGl2bywgcmVhOiAxLCBkZXNjcmlwY2lvbjogJ1ByaW1lcm8nLCBjb25kaWNpb246IFwidl9yZWEgPSAxXCIsIG9yZGVuOiAxLCBlc19wb3NpdGl2YTogdHJ1ZSwgdGFyZWE6IG51bGwgfSxcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHsgdl9yZWE6ICcxJyB9IGFzIGFueSwgbGlzdGFEZXNvcmRlbmFkYSwgJ3JlYScsICdlbmN1JywgZXZhbHVhck1vY2tcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IDEsIHJlc3VsdGFkbzogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2FwbGljYSB1bmEgY29uZGljacOzbiBKUyBjb21wbGVqYSBjb24gbcO6bHRpcGxlcyB2YXJpYWJsZXMnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWFzQ29tcGxlamFzID0gY29uQ29uZGljaW9uSnMoW1xuICAgICAgICAgICAgICAgIHsgb3BlcmF0aXZvLCByZWE6IDUsIGRlc2NyaXBjaW9uOiAnRG9ibGUgY29uZGljacOzbicsIGNvbmRpY2lvbjogXCJ2MSA9IDEgYW5kIHYyID0gMlwiLCBvcmRlbjogMSwgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiBudWxsIH0sXG4gICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgdWFQcmluY2lwYWxNb2NrLCB7IHYxOiAnMScsIHYyOiAnMicgfSBhcyBhbnksIHJlYXNDb21wbGVqYXMsICdyZWEnLCAnZW5jdScsIGV2YWx1YXJNb2NrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiA1LCByZXN1bHRhZG86IHRydWUgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdubyBjb25mdW5kZSByZWEgZGUgdW5hIHRhcmVhIGNvbiBsYSBkZSBvdHJhIHRhcmVhJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvRW5jdSA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgeyB2X3JlYTogJzEnIH0gYXMgYW55LCByZWFzQ29uTXVsdGlwbGVzVGFyZWFzLCAncmVhJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvRW5jdSwgeyBjb2RpZ286IDEsIHJlc3VsdGFkbzogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvUmVjdSA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgeyB2X3JlYTogJzEnIH0gYXMgYW55LCByZWFzQ29uTXVsdGlwbGVzVGFyZWFzLCAncmVhJywgJ3JlY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvUmVjdSwgeyBjb2RpZ286IDIsIHJlc3VsdGFkbzogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvU3VwZSA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgeyB2X3JlYTogJzEnIH0gYXMgYW55LCByZWFzQ29uTXVsdGlwbGVzVGFyZWFzLCAncmVhJywgJ3N1cGUnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvU3VwZSwgeyBjb2RpZ286IG51bGwsIHJlc3VsdGFkbzogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCd1bmEgcmVhIHNpbiB0YXJlYSBhcGxpY2EgYSBjdWFscXVpZXIgdGFyZWEnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHsgdl9yZWE6ICcxJyB9IGFzIGFueSwgcmVhc1NpblRhcmVhLCAncmVhJywgJ3JlY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogMSwgcmVzdWx0YWRvOiB0cnVlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbGFuemEgZXJyb3Igc2kgY29uZGljaW9uX2pzIGVzdMOhIGRlZmluaWRhIHBlcm8gbm8gc2UgcGFzYSBldmFsdWFyRXhwcmVzaW9uJywgKCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAgICAgICAoKSA9PiBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3Rhcyh1YVByaW5jaXBhbE1vY2ssIHsgdl9yZWE6ICcxJyB9IGFzIGFueSwgcmVhc0Jhc2UsICdyZWEnLCAnZW5jdScpLFxuICAgICAgICAgICAgICAgIC9TZSByZXF1aWVyZSBldmFsdWFyRXhwcmVzaW9uL1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyAtLS0tIFJFQV9TVVAgLS0tLVxuICAgIGRlc2NyaWJlKCdyZWFfc3VwOiBldmFsdWFjacOzbiBkZSBjb25kaWNpw7NuIEpTJywgKCkgPT4ge1xuXG4gICAgICAgIGl0KCdlbmN1ZW50cmEgdW5hIHJlYV9zdXAgY3VhbmRvIGxhIGNvbmRpY2nDs24gSlMgZXMgdmVyZGFkZXJhJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgdWFQcmluY2lwYWxNb2NrLCB7IHZfcmVhX3N1cDogJzEnIH0gYXMgYW55LCByZWFzU3VwLCAncmVhX3N1cCcsICdlbmN1JywgZXZhbHVhck1vY2tcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IDEwLCByZXN1bHRhZG86IGZhbHNlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnZGV2dWVsdmUgeyBjb2RpZ286IG51bGwsIHJlc3VsdGFkbzogZmFsc2UgfSBzaSBubyBjdW1wbGUnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHsgdl9yZWFfc3VwOiAnOScgfSBhcyBhbnksIHJlYXNTdXAsICdyZWFfc3VwJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyAtLS0tIE5PX1JFQSAtLS0tXG4gICAgZGVzY3JpYmUoJ25vX3JlYTogY29tcGFyYWNpw7NuIHNpbXBsZSB2YXJpYWJsZS92YWxvcicsICgpID0+IHtcblxuICAgICAgICBpdCgnZW5jdWVudHJhIHVuYSBub19yZWEgY3VhbmRvIHZhcmlhYmxlID09IHZhbG9yJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgdWFQcmluY2lwYWxNb2NrLCB7IHZfbm9yZWE6ICcxJyB9IGFzIGFueSwgbm9SZWFzLCAnbm9fcmVhJywgJ2VuY3UnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiAxMDEsIHJlc3VsdGFkbzogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2RldnVlbHZlIHsgY29kaWdvOiBudWxsLCByZXN1bHRhZG86IGZhbHNlIH0gc2kgZWwgdmFsb3Igbm8gY29pbmNpZGUnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHsgdl9ub3JlYTogJzknIH0gYXMgYW55LCBub1JlYXMsICdub19yZWEnLCAnZW5jdSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IG51bGwsIHJlc3VsdGFkbzogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gLS0tLSBOT19SRUFfU1VQIC0tLS1cbiAgICBkZXNjcmliZSgnbm9fcmVhX3N1cDogY29tcGFyYWNpw7NuIHNpbXBsZSB2YXJpYWJsZV9zdXAvdmFsb3Jfc3VwJywgKCkgPT4ge1xuXG4gICAgICAgIGl0KCdlbmN1ZW50cmEgdW5hIG5vX3JlYV9zdXAgY3VhbmRvIHZhcmlhYmxlX3N1cCA9PSB2YWxvcl9zdXAnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHsgdl9ub3JlYV9zdXA6ICcxJyB9IGFzIGFueSwgbm9SZWFzU3VwLCAnbm9fcmVhX3N1cCcsICdlbmN1J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogMjAxLCByZXN1bHRhZG86IHRydWUgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdkZXZ1ZWx2ZSB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9IHNpIG5vIGNvaW5jaWRlJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgdWFQcmluY2lwYWxNb2NrLCB7IHZfbm9yZWFfc3VwOiAnOScgfSBhcyBhbnksIG5vUmVhc1N1cCwgJ25vX3JlYV9zdXAnLCAnZW5jdSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IG51bGwsIHJlc3VsdGFkbzogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gLS0tLSBCw7pzcXVlZGEgcmVjdXJzaXZhIHkgTXVsdGluaXZlbCAtLS0tXG4gICAgZGVzY3JpYmUoJ2LDunNxdWVkYSByZWN1cnNpdmEgZW4gdW5pZGFkZXMgaGlqYXMnLCAoKSA9PiB7XG5cbiAgICAgICAgaXQoJ2VuY3VlbnRyYSB1bmEgbm9fcmVhIGRlbnRybyBkZSB1biBhcnJheSBkZSB1bmlkYWQgaGlqYSAoaG9nYXJlcyknLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNwdWVzdGFzID0ge1xuICAgICAgICAgICAgICAgIHZpdmllbmRhX2lkOiAxLFxuICAgICAgICAgICAgICAgIGhvZ2FyZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBpZDogMSwgdl9ub3JlYTogJzknIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgaWQ6IDIsIHZfbm9yZWE6ICcxJyB9LFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgdWFQcmluY2lwYWxNb2NrLCByZXNwdWVzdGFzLCBub1JlYXMsICdub19yZWEnLCAnZW5jdSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IDEwMSwgcmVzdWx0YWRvOiB0cnVlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnZGV2dWVsdmUgbnVsbyBzaSBuaW5ndW5hIHVuaWRhZCBoaWphIGN1bXBsZSBsYSBjb25kaWNpw7NuJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzcHVlc3RhcyA9IHtcbiAgICAgICAgICAgICAgICB2aXZpZW5kYV9pZDogMSxcbiAgICAgICAgICAgICAgICBob2dhcmVzOiBbeyBpZDogMSwgdl9ub3JlYTogJzknIH1dXG4gICAgICAgICAgICB9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdGFkbyA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgcmVzcHVlc3Rhcywgbm9SZWFzLCAnbm9fcmVhJywgJ2VuY3UnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiBudWxsLCByZXN1bHRhZG86IGZhbHNlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnbWFuZWphIGRlIGZvcm1hIHNlZ3VyYSBob2dhcmVzIG51bGwsIHZhY8Otb3MgbyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG9OdWxsID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgdWFQcmluY2lwYWxNb2NrLCB7IHZpdmllbmRhX2lkOiAxLCBob2dhcmVzOiBudWxsIH0gYXMgYW55LCBub1JlYXMsICdub19yZWEnLCAnZW5jdSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkb051bGwsIHsgY29kaWdvOiBudWxsLCByZXN1bHRhZG86IGZhbHNlIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG9WYWNpbyA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgeyB2aXZpZW5kYV9pZDogMSwgaG9nYXJlczogW10gfSBhcyBhbnksIG5vUmVhcywgJ25vX3JlYScsICdlbmN1J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvVmFjaW8sIHsgY29kaWdvOiBudWxsLCByZXN1bHRhZG86IGZhbHNlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnZW5jdWVudHJhIHVuYSByZWEgZW4gdW5pZGFkIGhpamEgY3VhbmRvIHRvZG9zIGN1bXBsZW4gY29uZGljacOzbiBKUyAoZXNfcG9zaXRpdmEgPSB0cnVlKScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3B1ZXN0YXMgPSB7XG4gICAgICAgICAgICAgICAgdml2aWVuZGFfaWQ6IDEsXG4gICAgICAgICAgICAgICAgaG9nYXJlczogW1xuICAgICAgICAgICAgICAgICAgICB7IGlkOiAxLCB2X3JlYTogJzEnIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgaWQ6IDIsIHZfcmVhOiAnMScgfSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdGFkbyA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgcmVzcHVlc3RhcywgcmVhc0Jhc2UsICdyZWEnLCAnZW5jdScsIGV2YWx1YXJNb2NrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiAxLCByZXN1bHRhZG86IHRydWUgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdldmFsw7phIHVuYSByZWEgY29uIGNvbmRpY2nDs24gcXVlIGNvbWJpbmEgdW5hIHZhcmlhYmxlIGRlIGxhIFVBIHByaW5jaXBhbCAodml2aWVuZGEpIHkgdW5hIGRlIGxhIFVBIGhpamEgKGhvZ2FyKScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYXNNdWx0aWxldmVsID0gY29uQ29uZGljaW9uSnMoW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aXZvLFxuICAgICAgICAgICAgICAgICAgICByZWE6IDEwLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwY2lvbjogJ1ZpdmllbmRhIGhhYml0YWRhIGNvbiBob2dhciBjb21wbGV0bycsXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpY2lvbjogXCJ2aXZpZW5kYV9oYWJpdGFkYSA9IDEgYW5kIGhvZ2FyX2NvbXBsZXRvID0gMVwiLFxuICAgICAgICAgICAgICAgICAgICBvcmRlbjogMSxcbiAgICAgICAgICAgICAgICAgICAgZXNfcG9zaXRpdmE6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRhcmVhOiAnZW5jdSdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3B1ZXN0YXMgPSB7XG4gICAgICAgICAgICAgICAgdml2aWVuZGFfaWQ6IDEsXG4gICAgICAgICAgICAgICAgdml2aWVuZGFfaGFiaXRhZGE6ICcxJyxcbiAgICAgICAgICAgICAgICBob2dhcmVzOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgaWQ6IDEsIGhvZ2FyX2NvbXBsZXRvOiAnMCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBpZDogMiwgaG9nYXJfY29tcGxldG86ICcxJyB9LFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHJlc3B1ZXN0YXMsIHJlYXNNdWx0aWxldmVsLCAncmVhJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2V2YWzDumEgdW5hIHJlYV9zdXAgY29uIGNvbmRpY2nDs24gcXVlIGNvbWJpbmEgdW5hIHZhcmlhYmxlIGRlIGxhIFVBIHByaW5jaXBhbCB5IHVuYSBkZSBsYSBVQSBoaWphJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVhc1N1cE11bHRpbGV2ZWwgPSBjb25Db25kaWNpb25KcyhbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpdm8sXG4gICAgICAgICAgICAgICAgICAgIHJlYV9zdXA6IDIwLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwY2lvbjogJ1N1cGVydmlzacOzbiBhcHJvYmFkYSBtdWx0aW5pdmVsJyxcbiAgICAgICAgICAgICAgICAgICAgY29uZGljaW9uOiBcInZpdmllbmRhX3N0YXR1cyA9IDEgYW5kIGhvZ2FyX3N1cGVydmlzYWRvID0gMVwiLFxuICAgICAgICAgICAgICAgICAgICBvcmRlbjogMSxcbiAgICAgICAgICAgICAgICAgICAgZXNfcG9zaXRpdmE6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRhcmVhOiAnZW5jdSdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3B1ZXN0YXMgPSB7XG4gICAgICAgICAgICAgICAgdml2aWVuZGFfaWQ6IDEsXG4gICAgICAgICAgICAgICAgdml2aWVuZGFfc3RhdHVzOiAnMScsXG4gICAgICAgICAgICAgICAgaG9nYXJlczogW1xuICAgICAgICAgICAgICAgICAgICB7IGlkOiAxLCBob2dhcl9zdXBlcnZpc2FkbzogJzEnIH0sXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSBhcyBhbnk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdGFkbyA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgcmVzcHVlc3RhcywgcmVhc1N1cE11bHRpbGV2ZWwsICdyZWFfc3VwJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogMjAsIHJlc3VsdGFkbzogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2VuY3VlbnRyYSB1bmEgbm9fcmVhIGFuaWRhZGEgYSAzIG5pdmVsZXMgKFZpdmllbmRhIC0+IEhvZ2FyIC0+IFBlcnNvbmEpJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzcHVlc3RhcyA9IHtcbiAgICAgICAgICAgICAgICB2aXZpZW5kYV9pZDogMSxcbiAgICAgICAgICAgICAgICBob2dhcmVzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX2lkOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBlcnNvbmFfaWQ6IDEsIHZfbm9yZWE6ICc5JyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGVyc29uYV9pZDogMiwgdl9ub3JlYTogJzEnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICB1YVRyZXNOaXZlbGVzTW9jaywgcmVzcHVlc3Rhcywgbm9SZWFzLCAnbm9fcmVhJywgJ2VuY3UnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiAxMDEsIHJlc3VsdGFkbzogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVzY3JpYmUoJ2V2YWx1YWNpw7NuIGRlIGVzX3Bvc2l0aXZhIGVuIG3Dumx0aXBsZXMgdW5pZGFkZXMgaGlqYXMnLCAoKSA9PiB7XG5cbiAgICAgICAgICAgIGl0KCdzaSBlc19wb3NpdGl2YSA9IHRydWUgeSBOTyB0b2RvcyBsb3MgaG9nYXJlcyBjdW1wbGVuIGxhIGNvbmRpY2nDs24sIE5PIGRlYmUgbWF0Y2hlYXIgbGEgcmVhIHBvc2l0aXZhJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYXNQb3NpdGl2YSA9IGNvbkNvbmRpY2lvbkpzKFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aXZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcGNpb246ICdUb2RvcyBsb3MgaG9nYXJlcyBjb21wbGV0b3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGljaW9uOiBcImhvZ2FyX2NvbXBsZXRvID0gMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JkZW46IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBlc19wb3NpdGl2YTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhOiAnZW5jdSdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3B1ZXN0YXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHZpdmllbmRhX2lkOiAxLFxuICAgICAgICAgICAgICAgICAgICBob2dhcmVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAxLCBob2dhcl9jb21wbGV0bzogJzEnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAyLCBob2dhcl9jb21wbGV0bzogJzAnIH0sXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9IGFzIGFueTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdGFkbyA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHJlc3B1ZXN0YXMsIHJlYXNQb3NpdGl2YSwgJ3JlYScsICdlbmN1JywgZXZhbHVhck1vY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2kgZXNfcG9zaXRpdmEgPSB0cnVlIHkgdW5hIHVuaWRhZCBoaWphIGFudGVyaW9yIG5vIHRpZW5lIHVuIGNhbXBvIGNhcmdhZG8gYcO6biAodW5kZWZpbmVkKSwgTk8gZGViZSBtYXRjaGVhciBsYSByZWEgcG9zaXRpdmEnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhc1Bvc2l0aXZhID0gY29uQ29uZGljaW9uSnMoW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpdm8sXG4gICAgICAgICAgICAgICAgICAgICAgICByZWE6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwY2lvbjogJ1RvZG9zIGxvcyBob2dhcmVzIGNvbXBsZXRvcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaWNpb246IFwiaG9nYXJfY29tcGxldG8gPSAxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlbjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzX3Bvc2l0aXZhOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWE6ICdlbmN1J1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcHVlc3RhcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdml2aWVuZGFfaWQ6IDEsXG4gICAgICAgICAgICAgICAgICAgIGhvZ2FyZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6IDEgfSwgLy8gUHJpbWVyIGhvZ2FyIHNpbiAnaG9nYXJfY29tcGxldG8nIGNhcmdhZG8gYcO6blxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogMiwgaG9nYXJfY29tcGxldG86ICcxJyB9LCAvLyDDmmx0aW1vIGhvZ2FyIGN1bXBsZSBsYSBjb25kaWNpw7NuXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9IGFzIGFueTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdGFkbyA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgICAgICB1YVByaW5jaXBhbE1vY2ssIHJlc3B1ZXN0YXMsIHJlYXNQb3NpdGl2YSwgJ3JlYScsICdlbmN1JywgZXZhbHVhck1vY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2kgZXNfcG9zaXRpdmEgPSB0cnVlIHkgVE9ET1MgbG9zIGhvZ2FyZXMgY3VtcGxlbiBsYSBjb25kaWNpw7NuLCBkZWJlIG1hdGNoZWFyIGxhIHJlYSBwb3NpdGl2YScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFzUG9zaXRpdmEgPSBjb25Db25kaWNpb25KcyhbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGl2byxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYTogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXBjaW9uOiAnVG9kb3MgbG9zIGhvZ2FyZXMgY29tcGxldG9zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpY2lvbjogXCJob2dhcl9jb21wbGV0byA9IDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVuOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXNfcG9zaXRpdmE6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYTogJ2VuY3UnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwdWVzdGFzID0ge1xuICAgICAgICAgICAgICAgICAgICB2aXZpZW5kYV9pZDogMSxcbiAgICAgICAgICAgICAgICAgICAgaG9nYXJlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogMSwgaG9nYXJfY29tcGxldG86ICcxJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogMiwgaG9nYXJfY29tcGxldG86ICcxJyB9LFxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSBhcyBhbnk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICAgICAgdWFQcmluY2lwYWxNb2NrLCByZXNwdWVzdGFzLCByZWFzUG9zaXRpdmEsICdyZWEnLCAnZW5jdScsIGV2YWx1YXJNb2NrXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IDEsIHJlc3VsdGFkbzogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2kgZXNfcG9zaXRpdmEgPSBmYWxzZSB5IGFsIG1lbm9zIHVuIGhvZ2FyIGN1bXBsZSBsYSBjb25kaWNpw7NuLCBkZWJlIG1hdGNoZWFyIGxhIHJlYSBuZWdhdGl2YScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFzTmVnYXRpdmEgPSBjb25Db25kaWNpb25KcyhbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGl2byxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYTogMixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXBjaW9uOiAnQWwgbWVub3MgdW4gaG9nYXIgcmVjaGF6YWRvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpY2lvbjogXCJob2dhcl9yZWNoYXphZG8gPSAxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlbjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzX3Bvc2l0aXZhOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhOiAnZW5jdSdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3B1ZXN0YXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHZpdmllbmRhX2lkOiAxLFxuICAgICAgICAgICAgICAgICAgICBob2dhcmVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAxLCBob2dhcl9yZWNoYXphZG86ICcwJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogMiwgaG9nYXJfcmVjaGF6YWRvOiAnMScgfSxcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgcmVzcHVlc3RhcywgcmVhc05lZ2F0aXZhLCAncmVhJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiAyLCByZXN1bHRhZG86IGZhbHNlIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGl0KCdldmFsw7phIDIgUkVBcyAocG9zaXRpdmEgeSBuZWdhdGl2YSk6IHNpIGxhIHBvc2l0aXZhIG5vIHNlIGN1bXBsZSBwYXJhIHRvZG9zIGxvcyBob2dhcmVzIHBlcm8gbGEgbmVnYXRpdmEgc8OtLCBkZXZ1ZWx2ZSBsYSBSRUEgbmVnYXRpdmEnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhc01peHRhcyA9IGNvbkNvbmRpY2lvbkpzKFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aXZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcGNpb246ICdUb2RvcyBsb3MgaG9nYXJlcyBjb21wbGV0b3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGljaW9uOiBcImhvZ2FyX2NvbXBsZXRvID0gMVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JkZW46IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBlc19wb3NpdGl2YTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhOiAnZW5jdSdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aXZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhOiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcGNpb246ICdBbCBtZW5vcyB1biBob2dhciBjb21wbGV0bycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaWNpb246IFwiaG9nYXJfY29tcGxldG8gPSAxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlbjogMixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzX3Bvc2l0aXZhOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmVhOiAnZW5jdSdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcHVlc3RhcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdml2aWVuZGFfaWQ6IDEsXG4gICAgICAgICAgICAgICAgICAgIGhvZ2FyZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6IDEsIGhvZ2FyX2NvbXBsZXRvOiAnMScgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6IDIsIGhvZ2FyX2NvbXBsZXRvOiAnMCcgfSxcbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgICAgIHVhUHJpbmNpcGFsTW9jaywgcmVzcHVlc3RhcywgcmVhc01peHRhcywgJ3JlYScsICdlbmN1JywgZXZhbHVhck1vY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogMiwgcmVzdWx0YWRvOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaXQoJ3NpIGVzX3Bvc2l0aXZhID0gdHJ1ZSB5IHVuYSBwZXJzb25hIGRlIE9UUk8gaG9nYXIgKHByaW1hKSBubyBjdW1wbGUgbGEgY29uZGljacOzbiwgTk8gZGViZSBtYXRjaGVhciBsYSByZWEgcG9zaXRpdmEnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhc1Bvc2l0aXZhID0gY29uQ29uZGljaW9uSnMoW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpdm8sXG4gICAgICAgICAgICAgICAgICAgICAgICByZWE6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwY2lvbjogJ1RvZGFzIGxhcyBwZXJzb25hcyBjb24gcDIgPSAxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpY2lvbjogXCJwMiA9IDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVuOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXNfcG9zaXRpdmE6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYTogJ2VuY3UnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwdWVzdGFzQ29uUHJpbWFGYWxsaWRhID0ge1xuICAgICAgICAgICAgICAgICAgICB2aXZpZW5kYV9pZDogMSxcbiAgICAgICAgICAgICAgICAgICAgaG9nYXJlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX2lkOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbmFzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGVyc29uYV9pZDogMSwgcDI6ICcxJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBlcnNvbmFfaWQ6IDIsIHAyOiAnMScgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9nYXJfaWQ6IDIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwZXJzb25hX2lkOiAzLCBwMjogJzAnIH0gLy8gTGEgXCJwcmltYVwiIGVuIGVsIEhvZ2FyIDIgbm8gY3VtcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSBhcyBhbnk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRhZG8gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3RhcyhcbiAgICAgICAgICAgICAgICAgICAgdWFUcmVzTml2ZWxlc01vY2ssIHJlc3B1ZXN0YXNDb25QcmltYUZhbGxpZGEsIHJlYXNQb3NpdGl2YSwgJ3JlYScsICdlbmN1JywgZXZhbHVhck1vY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGNvZGlnbzogbnVsbCwgcmVzdWx0YWRvOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdCgnc2kgZXNfcG9zaXRpdmEgPSB0cnVlIHkgaGF5IHVuIHNlZ3VuZG8gaG9nYXIgc2luIHBlcnNvbmFzIGNhcmdhZGFzIGHDum4sIE5PIGRlYmUgbWF0Y2hlYXIgbGEgUkVBIHBvc2l0aXZhJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYXNQb3NpdGl2YSA9IGNvbkNvbmRpY2lvbkpzKFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aXZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcGNpb246ICdUb2RhcyBsYXMgcGVyc29uYXMgY29tcGxldGFzIGVuIHZpdmllbmRhIHkgaG9nYXIgdsOhbGlkb3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGljaW9uOiBcInZpdmllbmRhX2hhYml0YWRhID0gMSBhbmQgaG9nYXJfdmFsaWRvID0gMSBhbmQgcGVyc29uYV9jb21wbGV0YSA9IDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVuOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXNfcG9zaXRpdmE6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJlYTogJ2VuY3UnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwdWVzdGFzID0ge1xuICAgICAgICAgICAgICAgICAgICB2aXZpZW5kYV9pZDogMSxcbiAgICAgICAgICAgICAgICAgICAgdml2aWVuZGFfaGFiaXRhZGE6ICcxJyxcbiAgICAgICAgICAgICAgICAgICAgaG9nYXJlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX2lkOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX3ZhbGlkbzogJzEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbmFzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGVyc29uYV9pZDogMSwgcGVyc29uYV9jb21wbGV0YTogJzEnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX2lkOiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX3ZhbGlkbzogJzEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNvbmFzOiBbXSAvLyBTaW4gcGVyc29uYXMgY2FyZ2FkYXMgYcO6biAoaW5jb21wbGV0bylcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgICAgIHVhVHJlc05pdmVsZXNNb2NrLCByZXNwdWVzdGFzLCByZWFzUG9zaXRpdmEsICdyZWEnLCAnZW5jdScsIGV2YWx1YXJNb2NrXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IG51bGwsIHJlc3VsdGFkbzogZmFsc2UgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ3NpIGVzX3Bvc2l0aXZhID0gdHJ1ZSB5IGhheSB1biBzZWd1bmRvIGhvZ2FyIHNpbiBwZXJzb25hcyBjYXJnYWRhcyBhw7puIChzaW4gaW5pY2lhbGl6YXIgYXJyYXkpLCBOTyBkZWJlIG1hdGNoZWFyIGxhIFJFQSBwb3NpdGl2YScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFzUG9zaXRpdmEgPSBjb25Db25kaWNpb25KcyhbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGl2byxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYTogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXBjaW9uOiAnVG9kYXMgbGFzIHBlcnNvbmFzIGNvbXBsZXRhcyBlbiB2aXZpZW5kYSB5IGhvZ2FyIHbDoWxpZG9zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpY2lvbjogXCJ2aXZpZW5kYV9oYWJpdGFkYSA9IDEgYW5kIGhvZ2FyX3ZhbGlkbyA9IDEgYW5kIHBlcnNvbmFfY29tcGxldGEgPSAxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlbjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzX3Bvc2l0aXZhOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWE6ICdlbmN1J1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcHVlc3RhcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdml2aWVuZGFfaWQ6IDEsXG4gICAgICAgICAgICAgICAgICAgIHZpdmllbmRhX2hhYml0YWRhOiAnMScsXG4gICAgICAgICAgICAgICAgICAgIGhvZ2FyZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2dhcl9pZDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2dhcl92YWxpZG86ICcxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzb25hczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBlcnNvbmFfaWQ6IDEsIHBlcnNvbmFfY29tcGxldGE6ICcxJyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2dhcl9pZDogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2dhcl92YWxpZG86ICcxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgICAgIHVhVHJlc05pdmVsZXNNb2NrLCByZXNwdWVzdGFzLCByZWFzUG9zaXRpdmEsICdyZWEnLCAnZW5jdScsIGV2YWx1YXJNb2NrXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHJlc3VsdGFkbywgeyBjb2RpZ286IG51bGwsIHJlc3VsdGFkbzogZmFsc2UgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaXQoJ2V2YWzDumEgY29ycmVjdGFtZW50ZSB1bmEgUkVBIHBvc2l0aXZhIG11bHRpbml2ZWwgKHZpdmllbmRhICsgaG9nYXIgKyBwZXJzb25hKSBleGlzdGllbmRvIHJhbWFzIGluZGVwZW5kaWVudGVzIGRlIHZpc2l0YXMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhc1Bvc2l0aXZhID0gY29uQ29uZGljaW9uSnMoW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpdm8sXG4gICAgICAgICAgICAgICAgICAgICAgICByZWE6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwY2lvbjogJ1RvZGFzIGxhcyBwZXJzb25hcyBjb21wbGV0YXMgZW4gaG9nYXJlcyBjb21wbGV0b3MgZGUgdml2aWVuZGFzIGhhYml0YWRhcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaWNpb246IFwidml2aWVuZGFfaGFiaXRhZGEgPSAxIGFuZCBob2dhcl9jb21wbGV0byA9IDEgYW5kIHBlcnNvbmFfY29tcGxldGEgPSAxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmRlbjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzX3Bvc2l0aXZhOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWE6ICdlbmN1J1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcHVlc3RhcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdml2aWVuZGFfaWQ6IDEsXG4gICAgICAgICAgICAgICAgICAgIHZpdmllbmRhX2hhYml0YWRhOiAnMScsIC8vIE5pdmVsIFZpdmllbmRhXG4gICAgICAgICAgICAgICAgICAgIHZpc2l0YXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6IDEsIGZlY2hhOiAnMjAyNi0xMC0wMScsIHJlc3VsdGFkb192aXNpdGE6ICcxJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogMiwgZmVjaGE6ICcyMDI2LTEwLTA1JywgcmVzdWx0YWRvX3Zpc2l0YTogJzEnIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgaG9nYXJlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX2lkOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX2NvbXBsZXRvOiAnMScsIC8vIE5pdmVsIEhvZ2FyIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzb25hczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBlcnNvbmFfaWQ6IDEsIHBlcnNvbmFfY29tcGxldGE6ICcxJyB9LCAvLyBOaXZlbCBQZXJzb25hXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcGVyc29uYV9pZDogMiwgcGVyc29uYV9jb21wbGV0YTogJzEnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX2lkOiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyX2NvbXBsZXRvOiAnMScsIC8vIE5pdmVsIEhvZ2FyIDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzb25hczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHBlcnNvbmFfaWQ6IDMsIHBlcnNvbmFfY29tcGxldGE6ICcxJyB9IC8vIE5pdmVsIFBlcnNvbmEgKFByaW1hKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvID0gYnVzY2FyUmVhTm9SZWFFblJlc3B1ZXN0YXMoXG4gICAgICAgICAgICAgICAgICAgIHVhVml2aWVuZGFDb25WaXNpdGFzTW9jaywgcmVzcHVlc3RhcywgcmVhc1Bvc2l0aXZhLCAncmVhJywgJ2VuY3UnLCBldmFsdWFyTW9ja1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8sIHsgY29kaWdvOiAxLCByZXN1bHRhZG86IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0YWRvMiA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKFxuICAgICAgICAgICAgICAgICAgICB1YVZpdmllbmRhQ29uVmlzaXRhc01vY2ssIHJlc3B1ZXN0YXMsIHJlYXNQb3NpdGl2YSwgJ3JlYScsICdyZWN1JywgZXZhbHVhck1vY2tcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvMiwgeyBjb2RpZ286IG51bGwsIHJlc3VsdGFkbzogZmFsc2UgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICB9KTtcbiAgICB9KTtcbn0pOyJdfQ==
|