dmencu 3.2.21 → 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.js +112 -38
- package/dist/client/unlogged/helpers-casilleros.d.ts +1 -1
- package/dist/client/unlogged/helpers-casilleros.js +12 -18
- 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 +77 -51
- 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-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-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-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 +6 -0
- package/dist/test/test.js +8 -2
- package/dist/unlogged/helpers-casilleros.d.ts +1 -1
- package/dist/unlogged/helpers-casilleros.js +12 -18
- package/dist/unlogged/helpers-formulario.d.ts +16 -0
- package/dist/unlogged/helpers-formulario.js +88 -0
- package/dist/unlogged/tipos.d.ts +1 -1
- package/dist/unlogged/tipos.js +1 -1
- 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/helpers-casilleros.js +7 -14
- 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/unlogged/bypass-formulario.d.ts +0 -198
- package/dist/unlogged/bypass-formulario.js +0 -1226
- package/dist/unlogged/redux-formulario.d.ts +0 -440
- package/dist/unlogged/redux-formulario.js +0 -324
- package/dist/unlogged/render-config.d.ts +0 -52
- package/dist/unlogged/render-config.js +0 -161
- package/dist/unlogged/unlogged/bypass-formulario copy.d.ts +0 -198
- package/dist/unlogged/unlogged/bypass-formulario copy.js +0 -1226
- package/dist/unlogged/unlogged/helpers.d.ts +0 -14
- package/dist/unlogged/unlogged/helpers.js +0 -129
- /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,95 @@
|
|
|
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", "node:fs", "node:path", "meta-enc", "procesamiento", "../server/app-dmencu"], factory);
|
|
8
|
+
}
|
|
9
|
+
})(function (require, exports) {
|
|
10
|
+
"use strict";
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AppDmEncuParaTests = void 0;
|
|
13
|
+
exports.crearAppParaTests = crearAppParaTests;
|
|
14
|
+
exports.permisosDeInstalacion = permisosDeInstalacion;
|
|
15
|
+
exports.contextoDelRol = contextoDelRol;
|
|
16
|
+
const fs = require("node:fs");
|
|
17
|
+
const path = require("node:path");
|
|
18
|
+
const meta_enc_1 = require("meta-enc");
|
|
19
|
+
const procesamiento_1 = require("procesamiento");
|
|
20
|
+
const app_dmencu_1 = require("../server/app-dmencu");
|
|
21
|
+
// La app compuesta igual que en server-dmencu.ts, pero sin llamar a start():
|
|
22
|
+
// no se conecta a la base ni levanta el servidor.
|
|
23
|
+
exports.AppDmEncuParaTests = (0, app_dmencu_1.emergeAppDmEncu)((0, procesamiento_1.emergeAppProcesamiento)((0, procesamiento_1.emergeAppConsistencias)((0, procesamiento_1.emergeAppDatosExt)((0, meta_enc_1.emergeAppMetaEnc)((0, meta_enc_1.emergeAppRelEnc)((0, procesamiento_1.emergeAppVarCal)((0, meta_enc_1.emergeAppOperativos)(meta_enc_1.AppBackend))))))));
|
|
24
|
+
// policy 'web' es el modo RELEVAMIENTO (dispositivos), cualquier otra es GABINETE (ver getModoByPolicy)
|
|
25
|
+
function crearAppParaTests(policy = '') {
|
|
26
|
+
var be = new exports.AppDmEncuParaTests();
|
|
27
|
+
// la configuración se carga en start(); se completa sólo la parte del servidor
|
|
28
|
+
be.config.server = {
|
|
29
|
+
'base-url': '',
|
|
30
|
+
port: 3000,
|
|
31
|
+
'session-store': 'memory',
|
|
32
|
+
'ip-replacer': '',
|
|
33
|
+
'silent-startup': true,
|
|
34
|
+
'kill-9': '',
|
|
35
|
+
bitacoraSchema: '',
|
|
36
|
+
bitacoraTableName: '',
|
|
37
|
+
useCors: false,
|
|
38
|
+
allowedHosts: [],
|
|
39
|
+
policy,
|
|
40
|
+
};
|
|
41
|
+
var permisos = permisosDeInstalacion();
|
|
42
|
+
be.caches.permisosRol = permisos.permisosRol;
|
|
43
|
+
be.caches.permisosRolSoloTrue = permisos.permisosRol;
|
|
44
|
+
be.caches.permisosSuperuser = permisos.permisosSuperuser;
|
|
45
|
+
be.caches.permisosParaNadie = permisos.permisosParaNadie;
|
|
46
|
+
return be;
|
|
47
|
+
}
|
|
48
|
+
function leerTab(nombreArchivo) {
|
|
49
|
+
// los tests corren desde dist/test
|
|
50
|
+
var contenido = fs.readFileSync(path.join(__dirname, '../../install', nombreArchivo), 'utf8');
|
|
51
|
+
var [encabezado, ...lineas] = contenido.split(/\r?\n/).filter(linea => linea.trim() != '');
|
|
52
|
+
var columnas = encabezado.split('|').map(columna => columna.trim());
|
|
53
|
+
return lineas.map(linea => {
|
|
54
|
+
var valores = linea.split('|').map(valor => valor.trim());
|
|
55
|
+
var fila = {};
|
|
56
|
+
columnas.forEach((columna, i) => { fila[columna] = valores[i]; });
|
|
57
|
+
return fila;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function puedeDe(filas, habilitado) {
|
|
61
|
+
var puede = {};
|
|
62
|
+
filas.forEach(fila => {
|
|
63
|
+
puede[fila.permiso] = puede[fila.permiso] || {};
|
|
64
|
+
puede[fila.permiso][fila.accion] = habilitado(fila);
|
|
65
|
+
});
|
|
66
|
+
return puede;
|
|
67
|
+
}
|
|
68
|
+
// Arma los permisos como lo hace postConfig en app-dmencu.ts (que los lee de la base),
|
|
69
|
+
// a partir de los .tab con que se instala la base
|
|
70
|
+
function permisosDeInstalacion() {
|
|
71
|
+
var roles = leerTab('roles.tab');
|
|
72
|
+
var rolesPermisos = leerTab('roles_permisos.tab');
|
|
73
|
+
var permisos = leerTab('permisos.tab');
|
|
74
|
+
var permisosRol = {};
|
|
75
|
+
roles.forEach(rol => {
|
|
76
|
+
var filasDelRol = rolesPermisos.filter(rp => rp.rol == rol.rol);
|
|
77
|
+
permisosRol[rol.rol] = {
|
|
78
|
+
superuser: rol.superuser == 'true',
|
|
79
|
+
puede: filasDelRol.length ? puedeDe(filasDelRol, rp => rp.habilitado == 'true') : undefined,
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
return {
|
|
83
|
+
permisosRol,
|
|
84
|
+
permisosSuperuser: puedeDe(permisos, () => true),
|
|
85
|
+
permisosParaNadie: puedeDe(permisos, () => false),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// contexto como el que arma getContext para un usuario con ese rol
|
|
89
|
+
function contextoDelRol(be, rol, idper = 'PER1') {
|
|
90
|
+
var user = { rol, idper, usuario: 'usu_' + rol };
|
|
91
|
+
return Object.assign(Object.assign({}, (0, app_dmencu_1.permisosSegunUsuario)(be.caches, user)), { be,
|
|
92
|
+
user, session: {}, username: user.usuario, machineId: 'test', navigator: 'test' });
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXBhcmEtdGVzdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9hcHAtcGFyYS10ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7SUE4QkEsOENBc0JDO0lBNEJELHNEQWlCQztJQUdELHdDQVdDO0lBL0dELDhCQUE4QjtJQUM5QixrQ0FBa0M7SUFFbEMsdUNBQThGO0lBQzlGLGlEQUFtSDtJQUVuSCxxREFBNkU7SUFHN0UsNkVBQTZFO0lBQzdFLGtEQUFrRDtJQUNyQyxRQUFBLGtCQUFrQixHQUFHLElBQUEsNEJBQWUsRUFDN0MsSUFBQSxzQ0FBc0IsRUFDbEIsSUFBQSxzQ0FBc0IsRUFDbEIsSUFBQSxpQ0FBaUIsRUFDYixJQUFBLDJCQUFnQixFQUNaLElBQUEsMEJBQWUsRUFDWCxJQUFBLCtCQUFlLEVBQ1gsSUFBQSw4QkFBbUIsRUFBQyxxQkFBVSxDQUFDLENBQ2xDLENBQ0osQ0FDSixDQUNKLENBQ0osQ0FDSixDQUNKLENBQUM7SUFJRix3R0FBd0c7SUFDeEcsU0FBZ0IsaUJBQWlCLENBQUMsU0FBaUIsRUFBRTtRQUNqRCxJQUFJLEVBQUUsR0FBRyxJQUFJLDBCQUFrQixFQUFFLENBQUM7UUFDbEMsK0VBQStFO1FBQy9FLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHO1lBQ2YsVUFBVSxFQUFFLEVBQUU7WUFDZCxJQUFJLEVBQUUsSUFBSTtZQUNWLGVBQWUsRUFBRSxRQUFRO1lBQ3pCLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsUUFBUSxFQUFFLEVBQUU7WUFDWixjQUFjLEVBQUUsRUFBRTtZQUNsQixpQkFBaUIsRUFBRSxFQUFFO1lBQ3JCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsWUFBWSxFQUFFLEVBQUU7WUFDaEIsTUFBTTtTQUNULENBQUM7UUFDRixJQUFJLFFBQVEsR0FBRyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3ZDLEVBQUUsQ0FBQyxN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LEdBQUcsQ0FBQyxTQUFTLElBQUksTUFBTTtnQkFDbEMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO2FBQzlGLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU87WUFDSCxXQUFXO1lBQ1gsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDaEQsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7U0FDcEQsQ0FBQztJQUNOLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsU0FBZ0IsY0FBYyxDQUFDLEVBQWdCLEVBQUUsR0FBVyxFQUFFLFFBQWdCLE1BQU07UUFDaEYsSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDakQsdUNBQ08sSUFBQSxpQ0FBb0IsRUFBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUN4QyxFQUFFO1lBQ0YsSUFBSSxFQUNKLE9BQU8sRUFBRSxFQUFFLEVBQ1gsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQ3RCLFNBQVMsRUFBRSxNQUFNLEVBQ2pCLFNBQVMsRUFBRSxNQUFNLElBQ25CO0lBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBBcHBCYWNrZW5kLCBlbWVyZ2VBcHBNZXRhRW5jLCBlbWVyZ2VBcHBPcGVyYXRpdm9zLCBlbWVyZ2VBcHBSZWxFbmMgfSBmcm9tICdtZXRhLWVuYyc7XG5pbXBvcnQgeyBlbWVyZ2VBcHBDb25zaXN0ZW5jaWFzLCBlbWVyZ2VBcHBEYXRvc0V4dCwgZW1lcmdlQXBwUHJvY2VzYW1pZW50bywgZW1lcmdlQXBwVmFyQ2FsIH0gZnJvbSAncHJvY2VzYW1pZW50byc7XG5cbmltcG9ydCB7IGVtZXJnZUFwcERtRW5jdSwgcGVybWlzb3NTZWd1blVzdWFyaW8gfSBmcm9tICcuLi9zZXJ2ZXIvYXBwLWRtZW5jdSc7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQsIFBlcm1pc29zUm9sLCBQdWVkZSB9IGZyb20gJy4uL3NlcnZlci90eXBlcy1kbWVuY3UnO1xuXG4vLyBMYSBhcHAgY29tcHVlc3RhIGlndWFsIHF1ZSBlbiBzZXJ2ZXItZG1lbmN1LnRzLCBwZXJvIHNpbiBsbGFtYXIgYSBzdGFydCgpOlxuLy8gbm8gc2UgY29uZWN0YSBhIGxhIGJhc2UgbmkgbGV2YW50YSBlbCBzZXJ2aWRvci5cbmV4cG9ydCBjb25zdCBBcHBEbUVuY3VQYXJhVGVzdHMgPSBlbWVyZ2VBcHBEbUVuY3UoXG4gICAgZW1lcmdlQXBwUHJvY2VzYW1pZW50byhcbiAgICAgICAgZW1lcmdlQXBwQ29uc2lzdGVuY2lhcyhcbiAgICAgICAgICAgIGVtZXJnZUFwcERhdG9zRXh0KFxuICAgICAgICAgICAgICAgIGVtZXJnZUFwcE1ldGFFbmMoXG4gICAgICAgICAgICAgICAgICAgIGVtZXJnZUFwcFJlbEVuYyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtZXJnZUFwcFZhckNhbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWVyZ2VBcHBPcGVyYXRpdm9zKEFwcEJhY2tlbmQpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICApXG4pO1xuXG5leHBvcnQgdHlwZSBBcHBQYXJhVGVzdHMgPSBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcERtRW5jdVBhcmFUZXN0cz47XG5cbi8vIHBvbGljeSAnd2ViJyBlcyBlbCBtb2RvIFJFTEVWQU1JRU5UTyAoZGlzcG9zaXRpdm9zKSwgY3VhbHF1aWVyIG90cmEgZXMgR0FCSU5FVEUgKHZlciBnZXRNb2RvQnlQb2xpY3kpXG5leHBvcnQgZnVuY3Rpb24gY3JlYXJBcHBQYXJhVGVzdHMocG9saWN5OiBzdHJpbmcgPSAnJyk6IEFwcFBhcmFUZXN0cyB7XG4gICAgdmFyIGJlID0gbmV3IEFwcERtRW5jdVBhcmFUZXN0cygpO1xuICAgIC8vIGxhIGNvbmZpZ3VyYWNpw7NuIHNlIGNhcmdhIGVuIHN0YXJ0KCk7IHNlIGNvbXBsZXRhIHPDs2xvIGxhIHBhcnRlIGRlbCBzZXJ2aWRvclxuICAgIGJlLmNvbmZpZy5zZXJ2ZXIgPSB7XG4gICAgICAgICdiYXNlLXVybCc6ICcnLFxuICAgICAgICBwb3J0OiAzMDAwLFxuICAgICAgICAnc2Vzc2lvbi1zdG9yZSc6ICdtZW1vcnknLFxuICAgICAgICAnaXAtcmVwbGFjZXInOiAnJyxcbiAgICAgICAgJ3NpbGVudC1zdGFydHVwJzogdHJ1ZSxcbiAgICAgICAgJ2tpbGwtOSc6ICcnLFxuICAgICAgICBiaXRhY29yYVNjaGVtYTogJycsXG4gICAgICAgIGJpdGFjb3JhVGFibGVOYW1lOiAnJyxcbiAgICAgICAgdXNlQ29yczogZmFsc2UsXG4gICAgICAgIGFsbG93ZWRIb3N0czogW10sXG4gICAgICAgIHBvbGljeSxcbiAgICB9O1xuICAgIHZhciBwZXJtaXNvcyA9IHBlcm1pc29zRGVJbnN0YWxhY2lvbigpO1xuICAgIGJlLmNhY2hlcy5wZXJtaXNvc1JvbCA9IHBlcm1pc29zLnBlcm1pc29zUm9sO1xuICAgIGJlLmNhY2hlcy5wZXJtaXNvc1JvbFNvbG9UcnVlID0gcGVybWlzb3MucGVybWlzb3NSb2w7XG4gICAgYmUuY2FjaGVzLnBlcm1pc29zU3VwZXJ1c2VyID0gcGVybWlzb3MucGVybWlzb3NTdXBlcnVzZXI7XG4gICAgYmUuY2FjaGVzLnBlcm1pc29zUGFyYU5hZGllID0gcGVybWlzb3MucGVybWlzb3NQYXJhTmFkaWU7XG4gICAgcmV0dXJuIGJlO1xufVxuXG50eXBlIEZpbGFUYWIgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG5mdW5jdGlvbiBsZWVyVGFiKG5vbWJyZUFyY2hpdm86IHN0cmluZyk6IEZpbGFUYWJbXSB7XG4gICAgLy8gbG9zIHRlc3RzIGNvcnJlbiBkZXNkZSBkaXN0L3Rlc3RcbiAgICB2YXIgY29udGVuaWRvID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9pbnN0YWxsJywgbm9tYnJlQXJjaGl2byksICd1dGY4Jyk7XG4gICAgdmFyIFtlbmNhYmV6YWRvLCAuLi5saW5lYXNdID0gY29udGVuaWRvLnNwbGl0KC9cXHI/XFxuLykuZmlsdGVyKGxpbmVhID0+IGxpbmVhLnRyaW0oKSAhPSAnJyk7XG4gICAgdmFyIGNvbHVtbmFzID0gZW5jYWJlemFkby5zcGxpdCgnfCcpLm1hcChjb2x1bW5hID0+IGNvbHVtbmEudHJpbSgpKTtcbiAgICByZXR1cm4gbGluZWFzLm1hcChsaW5lYSA9PiB7XG4gICAgICAgIHZhciB2YWxvcmVzID0gbGluZWEuc3BsaXQoJ3wnKS5tYXAodmFsb3IgPT4gdmFsb3IudHJpbSgpKTtcbiAgICAgICAgdmFyIGZpbGE6IEZpbGFUYWIgPSB7fTtcbiAgICAgICAgY29sdW1uYXMuZm9yRWFjaCgoY29sdW1uYSwgaSkgPT4geyBmaWxhW2NvbHVtbmFdID0gdmFsb3Jlc1tpXTsgfSk7XG4gICAgICAgIHJldHVybiBmaWxhO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBwdWVkZURlKGZpbGFzOiBGaWxhVGFiW10sIGhhYmlsaXRhZG86IChmaWxhOiBGaWxhVGFiKSA9PiBib29sZWFuKTogUHVlZGUge1xuICAgIHZhciBwdWVkZTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4+ID0ge307XG4gICAgZmlsYXMuZm9yRWFjaChmaWxhID0+IHtcbiAgICAgICAgcHVlZGVbZmlsYS5wZXJtaXNvXSA9IHB1ZWRlW2ZpbGEucGVybWlzb10gfHwge307XG4gICAgICAgIHB1ZWRlW2ZpbGEucGVybWlzb11bZmlsYS5hY2Npb25dID0gaGFiaWxpdGFkbyhmaWxhKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcHVlZGU7XG59XG5cbi8vIEFybWEgbG9zIHBlcm1pc29zIGNvbW8gbG8gaGFjZSBwb3N0Q29uZmlnIGVuIGFwcC1kbWVuY3UudHMgKHF1ZSBsb3MgbGVlIGRlIGxhIGJhc2UpLFxuLy8gYSBwYXJ0aXIgZGUgbG9zIC50YWIgY29uIHF1ZSBzZSBpbnN0YWxhIGxhIGJhc2VcbmV4cG9ydCBmdW5jdGlvbiBwZXJtaXNvc0RlSW5zdGFsYWNpb24oKTogeyBwZXJtaXNvc1JvbDogUGVybWlzb3NSb2wsIHBlcm1pc29zU3VwZXJ1c2VyOiBQdWVkZSwgcGVybWlzb3NQYXJhTmFkaWU6IFB1ZWRlIH0ge1xuICAgIHZhciByb2xlcyA9IGxlZXJUYWIoJ3JvbGVzLnRhYicpO1xuICAgIHZhciByb2xlc1Blcm1pc29zID0gbGVlclRhYigncm9sZXNfcGVybWlzb3MudGFiJyk7XG4gICAgdmFyIHBlcm1pc29zID0gbGVlclRhYigncGVybWlzb3MudGFiJyk7XG4gICAgdmFyIHBlcm1pc29zUm9sOiBQZXJtaXNvc1JvbCA9IHt9O1xuICAgIHJvbGVzLmZvckVhY2gocm9sID0+IHtcbiAgICAgICAgdmFyIGZpbGFzRGVsUm9sID0gcm9sZXNQZXJtaXNvcy5maWx0ZXIocnAgPT4gcnAucm9sID09IHJvbC5yb2wpO1xuICAgICAgICBwZXJtaXNvc1JvbFtyb2wucm9sXSA9IHtcbiAgICAgICAgICAgIHN1cGVydXNlcjogcm9sLnN1cGVydXNlciA9PSAndHJ1ZScsXG4gICAgICAgICAgICBwdWVkZTogZmlsYXNEZWxSb2wubGVuZ3RoID8gcHVlZGVEZShmaWxhc0RlbFJvbCwgcnAgPT4gcnAuaGFiaWxpdGFkbyA9PSAndHJ1ZScpIDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIHBlcm1pc29zUm9sLFxuICAgICAgICBwZXJtaXNvc1N1cGVydXNlcjogcHVlZGVEZShwZXJtaXNvcywgKCkgPT4gdHJ1ZSksXG4gICAgICAgIHBlcm1pc29zUGFyYU5hZGllOiBwdWVkZURlKHBlcm1pc29zLCAoKSA9PiBmYWxzZSksXG4gICAgfTtcbn1cblxuLy8gY29udGV4dG8gY29tbyBlbCBxdWUgYXJtYSBnZXRDb250ZXh0IHBhcmEgdW4gdXN1YXJpbyBjb24gZXNlIHJvbFxuZXhwb3J0IGZ1bmN0aW9uIGNvbnRleHRvRGVsUm9sKGJlOiBBcHBQYXJhVGVzdHMsIHJvbDogc3RyaW5nLCBpZHBlcjogc3RyaW5nID0gJ1BFUjEnKTogQ29udGV4dCB7XG4gICAgdmFyIHVzZXIgPSB7IHJvbCwgaWRwZXIsIHVzdWFyaW86ICd1c3VfJyArIHJvbCB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLnBlcm1pc29zU2VndW5Vc3VhcmlvKGJlLmNhY2hlcywgdXNlciksXG4gICAgICAgIGJlLFxuICAgICAgICB1c2VyLFxuICAgICAgICBzZXNzaW9uOiB7fSxcbiAgICAgICAgdXNlcm5hbWU6IHVzZXIudXN1YXJpbyxcbiAgICAgICAgbWFjaGluZUlkOiAndGVzdCcsXG4gICAgICAgIG5hdmlnYXRvcjogJ3Rlc3QnLFxuICAgIH07XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
(function (factory) {
|
|
11
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
12
|
+
var v = factory(require, exports);
|
|
13
|
+
if (v !== undefined) module.exports = v;
|
|
14
|
+
}
|
|
15
|
+
else if (typeof define === "function" && define.amd) {
|
|
16
|
+
define(["require", "exports", "mocha", "node:assert", "../server/app-dmencu", "../server/procedures-dmencu", "../unlogged/helpers-casilleros", "./app-para-tests"], factory);
|
|
17
|
+
}
|
|
18
|
+
})(function (require, exports) {
|
|
19
|
+
"use strict";
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
const mocha_1 = require("mocha");
|
|
22
|
+
const assert = require("node:assert");
|
|
23
|
+
const app_dmencu_1 = require("../server/app-dmencu");
|
|
24
|
+
const procedures_dmencu_1 = require("../server/procedures-dmencu");
|
|
25
|
+
const helpers_casilleros_1 = require("../unlogged/helpers-casilleros");
|
|
26
|
+
const app_para_tests_1 = require("./app-para-tests");
|
|
27
|
+
// se listan acá (y no se importa TABLAS_REA_NO_REA) para que el test falle si alguna deja de tratarse
|
|
28
|
+
const TABLAS_REA_NO_REA = ['rea', 'no_rea', 'rea_sup', 'no_rea_sup'];
|
|
29
|
+
// Base de datos en memoria: cada consulta se resuelve por la tabla del "from"
|
|
30
|
+
class BaseFalsa {
|
|
31
|
+
constructor(tablas) {
|
|
32
|
+
this.tablas = tablas;
|
|
33
|
+
this.consultas = [];
|
|
34
|
+
}
|
|
35
|
+
query(sql) {
|
|
36
|
+
var _a, _b, _c, _d, _e;
|
|
37
|
+
this.consultas.push(sql);
|
|
38
|
+
var tabla = (_b = (_a = /from (\w+)/.exec(sql)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : '';
|
|
39
|
+
var filas = (_c = this.tablas[tabla]) !== null && _c !== void 0 ? _c : [];
|
|
40
|
+
if (/group by grupo0?(_sup)? /.test(sql + ' ')) {
|
|
41
|
+
var campoGrupo = (_e = (_d = /select (\w+)/.exec(sql)) === null || _d === void 0 ? void 0 : _d[1]) !== null && _e !== void 0 ? _e : 'grupo';
|
|
42
|
+
var alias = /as grupo,/.test(sql) ? 'grupo' : campoGrupo;
|
|
43
|
+
var grupos = {};
|
|
44
|
+
filas.forEach(fila => {
|
|
45
|
+
var grupo = String(fila[campoGrupo]);
|
|
46
|
+
grupos[grupo] = grupos[grupo] || [];
|
|
47
|
+
grupos[grupo].push(fila);
|
|
48
|
+
});
|
|
49
|
+
filas = Object.keys(grupos).sort().map(grupo => ({ [alias]: grupo, codigos: grupos[grupo] }));
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
fetchAll: () => __awaiter(this, void 0, void 0, function* () { return ({ rowCount: filas.length, rows: filas, fields: [] }); }),
|
|
53
|
+
fetchUniqueRow: () => __awaiter(this, void 0, void 0, function* () { return ({ rowCount: 1, row: filas[0], fields: [] }); }),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const noReas = [
|
|
58
|
+
{ operativo: 'etoi211', no_rea: 1, descripcion: 'ausente', grupo: 'ausencia', variable: 'v1', valor: '7', grupo0: 'encuestable', orden: 1 },
|
|
59
|
+
{ operativo: 'etoi211', no_rea: 2, descripcion: 'rechazo', grupo: 'rechazo', variable: 'v1', valor: '8', grupo0: 'encuestable', orden: 2 },
|
|
60
|
+
{ operativo: 'eah2022', no_rea: 1, descripcion: 'deshabitada', grupo: 'no encuestable', variable: 'v1', valor: '9', grupo0: 'no encuestable', orden: 1 },
|
|
61
|
+
];
|
|
62
|
+
const noReasSup = [
|
|
63
|
+
{ operativo: 'etoi211', no_rea_sup: 71, desc_norea_sup: 'no contacto', grupo_sup: 'sin contacto', variable_sup: 's1', valor_sup: '2', grupo0_sup: 'sup', orden: 1 },
|
|
64
|
+
{ operativo: 'eah2022', no_rea_sup: 72, desc_norea_sup: 'otro', grupo_sup: 'otro', variable_sup: 's1', valor_sup: '3', grupo0_sup: 'sup', orden: 1 },
|
|
65
|
+
];
|
|
66
|
+
const reas = [
|
|
67
|
+
{ operativo: 'etoi211', rea: 1, descripcion: 'completa', condicion: 'v1 = 1 and v2 > 10', orden: 1, es_positiva: true, tarea: null },
|
|
68
|
+
{ operativo: 'etoi211', rea: 2, descripcion: 'incompleta', condicion: 'v1 = 1', orden: 2, es_positiva: false, tarea: 'encu' },
|
|
69
|
+
{ operativo: 'eah2022', rea: 1, descripcion: 'otra', condicion: 'v3 = 5', orden: 1, es_positiva: true, tarea: null },
|
|
70
|
+
];
|
|
71
|
+
const reasSup = [
|
|
72
|
+
{ operativo: 'etoi211', rea_sup: 1, descripcion: 'supervisada', condicion: 's1 = 1', orden: 1, es_positiva: true, tarea: 'supe' },
|
|
73
|
+
];
|
|
74
|
+
const operativos = [{ con_rea_hogar: true, operativo: 'etoi211', config_sorteo: null }];
|
|
75
|
+
function baseConDatos() {
|
|
76
|
+
return new BaseFalsa({ no_rea: noReas, rea: reas, no_rea_sup: noReasSup, rea_sup: reasSup, operativos });
|
|
77
|
+
}
|
|
78
|
+
// evalúa una condición compilada (condicion_js) como lo hace el dispositivo
|
|
79
|
+
function evaluar(condicionJs, valores) {
|
|
80
|
+
var funcion = new Function('valores', 'helpers', 'return ' + condicionJs);
|
|
81
|
+
return funcion(valores, helpers_casilleros_1.helpersCasilleros);
|
|
82
|
+
}
|
|
83
|
+
(0, mocha_1.describe)('dmencu - caches de rea/no rea', () => {
|
|
84
|
+
(0, mocha_1.describe)('refreshCaches', () => {
|
|
85
|
+
(0, mocha_1.it)('carga rea, no rea y sus versiones _sup', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
86
|
+
var be = (0, app_para_tests_1.crearAppParaTests)();
|
|
87
|
+
yield be.refreshCaches(baseConDatos());
|
|
88
|
+
assert.deepStrictEqual(be.caches.tableContent.no_rea, noReas);
|
|
89
|
+
assert.deepStrictEqual(be.caches.tableContent.rea, reas);
|
|
90
|
+
assert.deepStrictEqual(be.caches.tableContent.no_rea_sup, noReasSup);
|
|
91
|
+
assert.deepStrictEqual(be.caches.tableContent.rea_sup, reasSup);
|
|
92
|
+
}));
|
|
93
|
+
(0, mocha_1.it)('pide a la base las listas ordenadas por operativo y orden (define la prioridad de evaluación)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
94
|
+
var be = (0, app_para_tests_1.crearAppParaTests)();
|
|
95
|
+
var base = baseConDatos();
|
|
96
|
+
yield be.refreshCaches(base);
|
|
97
|
+
for (var tabla of TABLAS_REA_NO_REA) {
|
|
98
|
+
var consulta = base.consultas.find(sql => new RegExp(`from ${tabla} order by`).test(sql));
|
|
99
|
+
assert.ok(consulta, `no se consultó ${tabla}`);
|
|
100
|
+
assert.match(consulta, new RegExp(`order by operativo, orden, ${tabla}`));
|
|
101
|
+
}
|
|
102
|
+
}));
|
|
103
|
+
(0, mocha_1.it)('agrupa los no rea por grupo y por grupo0', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
104
|
+
var be = (0, app_para_tests_1.crearAppParaTests)();
|
|
105
|
+
yield be.refreshCaches(baseConDatos());
|
|
106
|
+
assert.deepStrictEqual(be.caches.tableContent.no_rea_groups.map((g) => g.grupo), ['ausencia', 'no encuestable', 'rechazo']);
|
|
107
|
+
assert.deepStrictEqual(be.caches.tableContent.no_rea_groups0.map((g) => g.grupo), ['encuestable', 'no encuestable']);
|
|
108
|
+
}));
|
|
109
|
+
(0, mocha_1.it)('carga la configuración del operativo actual (con_rea_hogar)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
110
|
+
var be = (0, app_para_tests_1.crearAppParaTests)();
|
|
111
|
+
yield be.refreshCaches(baseConDatos());
|
|
112
|
+
assert.deepStrictEqual(be.caches.tableContent.conReaHogar, operativos[0]);
|
|
113
|
+
}));
|
|
114
|
+
(0, mocha_1.it)('al recargar reemplaza los datos anteriores', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
115
|
+
var be = (0, app_para_tests_1.crearAppParaTests)();
|
|
116
|
+
var base = baseConDatos();
|
|
117
|
+
yield be.refreshCaches(base);
|
|
118
|
+
base.tablas.rea = [reas[0]];
|
|
119
|
+
yield be.refreshCaches(base);
|
|
120
|
+
assert.deepStrictEqual(be.caches.tableContent.rea, [reas[0]]);
|
|
121
|
+
}));
|
|
122
|
+
});
|
|
123
|
+
(0, mocha_1.describe)('refrescarEstructuraAlModificarTabla (envuelve table_record_save y table_record_delete)', () => {
|
|
124
|
+
function prepararRefrescador() {
|
|
125
|
+
var eventos = [];
|
|
126
|
+
var clientesRefrescados = [];
|
|
127
|
+
var be = {
|
|
128
|
+
caches: { timestampEstructura: 0 },
|
|
129
|
+
refreshCaches: (client) => __awaiter(this, void 0, void 0, function* () {
|
|
130
|
+
eventos.push('refrescar');
|
|
131
|
+
clientesRefrescados.push(client);
|
|
132
|
+
}),
|
|
133
|
+
};
|
|
134
|
+
var llamadas = [];
|
|
135
|
+
var guardar = (_context, parameters, extra) => __awaiter(this, void 0, void 0, function* () {
|
|
136
|
+
eventos.push('guardar');
|
|
137
|
+
llamadas.push({ tabla: parameters.table, extra });
|
|
138
|
+
return { guardado: parameters.table };
|
|
139
|
+
});
|
|
140
|
+
return { be, eventos, clientesRefrescados, llamadas, guardar };
|
|
141
|
+
}
|
|
142
|
+
for (const tabla of TABLAS_REA_NO_REA) {
|
|
143
|
+
(0, mocha_1.it)(`al modificar ${tabla} recarga las caches después de guardar y cambia la estructura`, () => __awaiter(void 0, void 0, void 0, function* () {
|
|
144
|
+
var { be, eventos, clientesRefrescados, guardar } = prepararRefrescador();
|
|
145
|
+
var client = new BaseFalsa({});
|
|
146
|
+
var resultado = yield (0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardar)({ client }, { table: tabla });
|
|
147
|
+
assert.deepStrictEqual(resultado, { guardado: tabla });
|
|
148
|
+
assert.deepStrictEqual(eventos, ['guardar', 'refrescar']);
|
|
149
|
+
assert.strictEqual(clientesRefrescados[0], client, 'debe recargar con el mismo cliente (misma transacción)');
|
|
150
|
+
assert.ok(be.caches.timestampEstructura > 0);
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
for (const tabla of ['casilleros', 'semanas']) {
|
|
154
|
+
(0, mocha_1.it)(`al modificar ${tabla} cambia la estructura sin recargar las caches de rea`, () => __awaiter(void 0, void 0, void 0, function* () {
|
|
155
|
+
var { be, eventos, guardar } = prepararRefrescador();
|
|
156
|
+
yield (0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardar)({ client: new BaseFalsa({}) }, { table: tabla });
|
|
157
|
+
assert.deepStrictEqual(eventos, ['guardar']);
|
|
158
|
+
assert.ok(be.caches.timestampEstructura > 0);
|
|
159
|
+
}));
|
|
160
|
+
}
|
|
161
|
+
(0, mocha_1.it)('al modificar otras tablas no toca la estructura ni las caches', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
162
|
+
var { be, eventos, guardar } = prepararRefrescador();
|
|
163
|
+
yield (0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardar)({ client: new BaseFalsa({}) }, { table: 'usuarios' });
|
|
164
|
+
assert.deepStrictEqual(eventos, ['guardar']);
|
|
165
|
+
assert.strictEqual(be.caches.timestampEstructura, 0);
|
|
166
|
+
}));
|
|
167
|
+
(0, mocha_1.it)('si falla el guardado no recarga ni cambia la estructura', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
168
|
+
var { be, eventos } = prepararRefrescador();
|
|
169
|
+
var guardarConError = (_context, _parameters) => __awaiter(void 0, void 0, void 0, function* () {
|
|
170
|
+
eventos.push('guardar');
|
|
171
|
+
throw new Error('error al guardar');
|
|
172
|
+
});
|
|
173
|
+
yield assert.rejects((0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardarConError)({ client: new BaseFalsa({}) }, { table: 'rea' }), /error al guardar/);
|
|
174
|
+
assert.deepStrictEqual(eventos, ['guardar']);
|
|
175
|
+
assert.strictEqual(be.caches.timestampEstructura, 0);
|
|
176
|
+
}));
|
|
177
|
+
(0, mocha_1.it)('pasa a la función original los argumentos extra (files/opts de table_record_save)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
178
|
+
var { be, llamadas, guardar } = prepararRefrescador();
|
|
179
|
+
var extra = { files: [] };
|
|
180
|
+
yield (0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardar)({ client: new BaseFalsa({}) }, { table: 'no_rea' }, extra);
|
|
181
|
+
assert.strictEqual(llamadas[0].extra, extra);
|
|
182
|
+
}));
|
|
183
|
+
});
|
|
184
|
+
(0, mocha_1.describe)('reasNoReasDelOperativo (rea/no rea en la estructura que recibe el dispositivo)', () => {
|
|
185
|
+
const tableContent = { no_rea: noReas, no_rea_sup: noReasSup, rea: reas, rea_sup: reasSup };
|
|
186
|
+
(0, mocha_1.it)('filtra cada lista por operativo', () => {
|
|
187
|
+
var resultado = (0, procedures_dmencu_1.reasNoReasDelOperativo)(tableContent, 'etoi211');
|
|
188
|
+
assert.deepStrictEqual(resultado.noReas, [noReas[0], noReas[1]]);
|
|
189
|
+
assert.deepStrictEqual(resultado.noReasSup, [noReasSup[0]]);
|
|
190
|
+
assert.deepStrictEqual(resultado.reas.map(rea => rea.rea), [1, 2]);
|
|
191
|
+
assert.deepStrictEqual(resultado.reasSup.map(reaSup => reaSup.rea_sup), [1]);
|
|
192
|
+
});
|
|
193
|
+
(0, mocha_1.it)('conserva el orden de las caches (que viene ordenado por orden)', () => {
|
|
194
|
+
var resultado = (0, procedures_dmencu_1.reasNoReasDelOperativo)(Object.assign(Object.assign({}, tableContent), { rea: [reas[1], reas[0]] }), 'etoi211');
|
|
195
|
+
assert.deepStrictEqual(resultado.reas.map(rea => rea.rea), [2, 1]);
|
|
196
|
+
});
|
|
197
|
+
(0, mocha_1.it)('compila las condiciones de rea a js evaluable en el dispositivo', () => {
|
|
198
|
+
var [completa, incompleta] = (0, procedures_dmencu_1.reasNoReasDelOperativo)(tableContent, 'etoi211').reas;
|
|
199
|
+
assert.strictEqual(evaluar(completa.condicion_js, { v1: 1, v2: 11 }), true);
|
|
200
|
+
assert.strictEqual(evaluar(completa.condicion_js, { v1: 1, v2: 5 }), false);
|
|
201
|
+
assert.strictEqual(evaluar(incompleta.condicion_js, { v1: 1 }), true);
|
|
202
|
+
assert.strictEqual(evaluar(incompleta.condicion_js, { v1: 2 }), false);
|
|
203
|
+
});
|
|
204
|
+
(0, mocha_1.it)('compila las condiciones de rea_sup', () => {
|
|
205
|
+
var [supervisada] = (0, procedures_dmencu_1.reasNoReasDelOperativo)(tableContent, 'etoi211').reasSup;
|
|
206
|
+
assert.strictEqual(evaluar(supervisada.condicion_js, { s1: 1 }), true);
|
|
207
|
+
assert.strictEqual(evaluar(supervisada.condicion_js, { s1: 2 }), false);
|
|
208
|
+
});
|
|
209
|
+
(0, mocha_1.it)('las variables sin cargar se toman como 0 (no rompen la evaluación)', () => {
|
|
210
|
+
var [completa] = (0, procedures_dmencu_1.reasNoReasDelOperativo)(tableContent, 'etoi211').reas;
|
|
211
|
+
assert.strictEqual(evaluar(completa.condicion_js, {}), false);
|
|
212
|
+
});
|
|
213
|
+
(0, mocha_1.it)('no modifica las caches', () => {
|
|
214
|
+
var antes = JSON.stringify(tableContent);
|
|
215
|
+
(0, procedures_dmencu_1.reasNoReasDelOperativo)(tableContent, 'etoi211');
|
|
216
|
+
assert.strictEqual(JSON.stringify(tableContent), antes);
|
|
217
|
+
});
|
|
218
|
+
(0, mocha_1.it)('si las caches no se cargaron devuelve listas vacías', () => {
|
|
219
|
+
assert.deepStrictEqual((0, procedures_dmencu_1.reasNoReasDelOperativo)({}, 'etoi211'), { noReas: [], noReasSup: [], reas: [], reasSup: [] });
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
(0, mocha_1.describe)('de punta a punta: modificar una rea llega a la estructura del dispositivo', () => {
|
|
223
|
+
(0, mocha_1.it)('después de guardar una rea, la estructura del operativo la incluye compilada', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
224
|
+
var be = (0, app_para_tests_1.crearAppParaTests)();
|
|
225
|
+
var base = baseConDatos();
|
|
226
|
+
yield be.refreshCaches(base);
|
|
227
|
+
var timestampAnterior = be.caches.timestampEstructura;
|
|
228
|
+
var nuevaRea = { operativo: 'etoi211', rea: 3, descripcion: 'nueva', condicion: 'v4 = 2', orden: 3, es_positiva: true, tarea: null };
|
|
229
|
+
var guardar = (_context, _parameters) => __awaiter(void 0, void 0, void 0, function* () {
|
|
230
|
+
base.tablas.rea = [...reas, nuevaRea];
|
|
231
|
+
return 'ok';
|
|
232
|
+
});
|
|
233
|
+
yield new Promise(resolve => setTimeout(resolve, 2));
|
|
234
|
+
yield (0, app_dmencu_1.refrescarEstructuraAlModificarTabla)(be, guardar)({ client: base }, { table: 'rea' });
|
|
235
|
+
assert.ok(be.caches.timestampEstructura > timestampAnterior, 'los dispositivos deben recibir la estructura nueva');
|
|
236
|
+
var reasOP1 = (0, procedures_dmencu_1.reasNoReasDelOperativo)(be.caches.tableContent, 'etoi211').reas;
|
|
237
|
+
assert.deepStrictEqual(reasOP1.map(rea => rea.rea), [1, 2, 3]);
|
|
238
|
+
assert.strictEqual(evaluar(reasOP1[2].condicion_js, { v4: 2 }), true);
|
|
239
|
+
}));
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1jYWNoZXMtcmVhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvdGVzdC1jYWNoZXMtcmVhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQUEsaUNBQXFDO0lBRXJDLHNDQUF1QztJQUV2QyxxREFBeUg7SUFDekgsbUVBQXFFO0lBQ3JFLHVFQUFtRTtJQUVuRSxxREFBcUQ7SUFFckQsc0dBQXNHO0lBQ3RHLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUlyRSw4RUFBOEU7SUFDOUUsTUFBTSxTQUFTO1FBRVgsWUFBbUIsTUFBbUM7WUFBbkMsV0FBTSxHQUFOLE1BQU0sQ0FBNkI7WUFEdEQsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUNpQyxDQUFDO1FBQzNELEtBQUssQ0FBQyxHQUFXOztZQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksS0FBSyxHQUFHLE1BQUEsTUFBQSxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQywwQ0FBRyxDQUFDLENBQUMsbUNBQUksRUFBRSxDQUFDO1lBQzlDLElBQUksS0FBSyxHQUFHLE1BQUEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUNBQUksRUFBRSxDQUFDO1lBQ3JDLElBQUksMEJBQTBCLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLFVBQVUsR0FBRyxNQUFBLE1BQUEsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsMENBQUcsQ0FBQyxDQUFDLG1DQUFJLE9BQU8sQ0FBQztnQkFDMUQsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FB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QUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBpdCB9IGZyb20gJ21vY2hhJztcblxuaW1wb3J0IGFzc2VydCA9IHJlcXVpcmUoJ25vZGU6YXNzZXJ0Jyk7XG5cbmltcG9ydCB7IENsaWVudGVEYiwgQ29uc3VsdGFEYiwgcmVmcmVzY2FyRXN0cnVjdHVyYUFsTW9kaWZpY2FyVGFibGEsIFJlZnJlc2NhZG9yRXN0cnVjdHVyYSB9IGZyb20gJy4uL3NlcnZlci9hcHAtZG1lbmN1JztcbmltcG9ydCB7IHJlYXNOb1JlYXNEZWxPcGVyYXRpdm8gfSBmcm9tICcuLi9zZXJ2ZXIvcHJvY2VkdXJlcy1kbWVuY3UnO1xuaW1wb3J0IHsgaGVscGVyc0Nhc2lsbGVyb3MgfSBmcm9tICcuLi91bmxvZ2dlZC9oZWxwZXJzLWNhc2lsbGVyb3MnO1xuaW1wb3J0IHR5cGUgeyBOb1JlYSwgTm9SZWFTdXAsIFJlYSwgUmVhU3VwLCBWYWxvciB9IGZyb20gJy4uL3VubG9nZ2VkL3RpcG9zJztcbmltcG9ydCB7IGNyZWFyQXBwUGFyYVRlc3RzIH0gZnJvbSAnLi9hcHAtcGFyYS10ZXN0cyc7XG5cbi8vIHNlIGxpc3RhbiBhY8OhICh5IG5vIHNlIGltcG9ydGEgVEFCTEFTX1JFQV9OT19SRUEpIHBhcmEgcXVlIGVsIHRlc3QgZmFsbGUgc2kgYWxndW5hIGRlamEgZGUgdHJhdGFyc2VcbmNvbnN0IFRBQkxBU19SRUFfTk9fUkVBID0gWydyZWEnLCAnbm9fcmVhJywgJ3JlYV9zdXAnLCAnbm9fcmVhX3N1cCddO1xuXG50eXBlIEZpbGEgPSB7IFtjYW1wbzogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCBGaWxhW10gfTtcblxuLy8gQmFzZSBkZSBkYXRvcyBlbiBtZW1vcmlhOiBjYWRhIGNvbnN1bHRhIHNlIHJlc3VlbHZlIHBvciBsYSB0YWJsYSBkZWwgXCJmcm9tXCJcbmNsYXNzIEJhc2VGYWxzYSBpbXBsZW1lbnRzIENsaWVudGVEYiB7XG4gICAgY29uc3VsdGFzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0YWJsYXM6IHsgW3RhYmxhOiBzdHJpbmddOiBGaWxhW10gfSkgeyB9XG4gICAgcXVlcnkoc3FsOiBzdHJpbmcpOiBDb25zdWx0YURiIHtcbiAgICAgICAgdGhpcy5jb25zdWx0YXMucHVzaChzcWwpO1xuICAgICAgICB2YXIgdGFibGEgPSAvZnJvbSAoXFx3KykvLmV4ZWMoc3FsKT8uWzFdID8/ICcnO1xuICAgICAgICB2YXIgZmlsYXMgPSB0aGlzLnRhYmxhc1t0YWJsYV0gPz8gW107XG4gICAgICAgIGlmICgvZ3JvdXAgYnkgZ3J1cG8wPyhfc3VwKT8gLy50ZXN0KHNxbCArICcgJykpIHtcbiAgICAgICAgICAgIHZhciBjYW1wb0dydXBvID0gL3NlbGVjdCAoXFx3KykvLmV4ZWMoc3FsKT8uWzFdID8/ICdncnVwbyc7XG4gICAgICAgICAgICB2YXIgYWxpYXMgPSAvYXMgZ3J1cG8sLy50ZXN0KHNxbCkgPyAnZ3J1cG8nIDogY2FtcG9HcnVwbztcbiAgICAgICAgICAgIHZhciBncnVwb3M6IHsgW2dydXBvOiBzdHJpbmddOiBGaWxhW10gfSA9IHt9O1xuICAgICAgICAgICAgZmlsYXMuZm9yRWFjaChmaWxhID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgZ3J1cG8gPSBTdHJpbmcoZmlsYVtjYW1wb0dydXBvXSk7XG4gICAgICAgICAgICAgICAgZ3J1cG9zW2dydXBvXSA9IGdydXBvc1tncnVwb10gfHwgW107XG4gICAgICAgICAgICAgICAgZ3J1cG9zW2dydXBvXS5wdXNoKGZpbGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmaWxhcyA9IE9iamVjdC5rZXlzKGdydXBvcykuc29ydCgpLm1hcChncnVwbyA9PiAoeyBbYWxpYXNdOiBncnVwbywgY29kaWdvczogZ3J1cG9zW2dydXBvXSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZldGNoQWxsOiBhc3luYyAoKSA9PiAoeyByb3dDb3VudDogZmlsYXMubGVuZ3RoLCByb3dzOiBmaWxhcywgZmllbGRzOiBbXSB9KSxcbiAgICAgICAgICAgIGZldGNoVW5pcXVlUm93OiBhc3luYyAoKSA9PiAoeyByb3dDb3VudDogMSwgcm93OiBmaWxhc1swXSwgZmllbGRzOiBbXSB9KSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmNvbnN0IG5vUmVhczogTm9SZWFbXSA9IFtcbiAgICB7IG9wZXJhdGl2bzogJ2V0b2kyMTEnLCBub19yZWE6IDEsIGRlc2NyaXBjaW9uOiAnYXVzZW50ZScsIGdydXBvOiAnYXVzZW5jaWEnLCB2YXJpYWJsZTogJ3YxJywgdmFsb3I6ICc3JywgZ3J1cG8wOiAnZW5jdWVzdGFibGUnLCBvcmRlbjogMSB9LFxuICAgIHsgb3BlcmF0aXZvOiAnZXRvaTIxMScsIG5vX3JlYTogMiwgZGVzY3JpcGNpb246ICdyZWNoYXpvJywgZ3J1cG86ICdyZWNoYXpvJywgdmFyaWFibGU6ICd2MScsIHZhbG9yOiAnOCcsIGdydXBvMDogJ2VuY3Vlc3RhYmxlJywgb3JkZW46IDIgfSxcbiAgICB7IG9wZXJhdGl2bzogJ2VhaDIwMjInLCBub19yZWE6IDEsIGRlc2NyaXBjaW9uOiAnZGVzaGFiaXRhZGEnLCBncnVwbzogJ25vIGVuY3Vlc3RhYmxlJywgdmFyaWFibGU6ICd2MScsIHZhbG9yOiAnOScsIGdydXBvMDogJ25vIGVuY3Vlc3RhYmxlJywgb3JkZW46IDEgfSxcbl07XG5jb25zdCBub1JlYXNTdXA6IE5vUmVhU3VwW10gPSBbXG4gICAgeyBvcGVyYXRpdm86ICdldG9pMjExJywgbm9fcmVhX3N1cDogNzEsIGRlc2Nfbm9yZWFfc3VwOiAnbm8gY29udGFjdG8nLCBncnVwb19zdXA6ICdzaW4gY29udGFjdG8nLCB2YXJpYWJsZV9zdXA6ICdzMScsIHZhbG9yX3N1cDogJzInLCBncnVwbzBfc3VwOiAnc3VwJywgb3JkZW46IDEgfSxcbiAgICB7IG9wZXJhdGl2bzogJ2VhaDIwMjInLCBub19yZWFfc3VwOiA3MiwgZGVzY19ub3JlYV9zdXA6ICdvdHJvJywgZ3J1cG9fc3VwOiAnb3RybycsIHZhcmlhYmxlX3N1cDogJ3MxJywgdmFsb3Jfc3VwOiAnMycsIGdydXBvMF9zdXA6ICdzdXAnLCBvcmRlbjogMSB9LFxuXTtcbmNvbnN0IHJlYXM6IE9taXQ8UmVhLCAnY29uZGljaW9uX2pzJz5bXSA9IFtcbiAgICB7IG9wZXJhdGl2bzogJ2V0b2kyMTEnLCByZWE6IDEsIGRlc2NyaXBjaW9uOiAnY29tcGxldGEnLCBjb25kaWNpb246ICd2MSA9IDEgYW5kIHYyID4gMTAnLCBvcmRlbjogMSwgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiBudWxsIH0sXG4gICAgeyBvcGVyYXRpdm86ICdldG9pMjExJywgcmVhOiAyLCBkZXNjcmlwY2lvbjogJ2luY29tcGxldGEnLCBjb25kaWNpb246ICd2MSA9IDEnLCBvcmRlbjogMiwgZXNfcG9zaXRpdmE6IGZhbHNlLCB0YXJlYTogJ2VuY3UnIH0sXG4gICAgeyBvcGVyYXRpdm86ICdlYWgyMDIyJywgcmVhOiAxLCBkZXNjcmlwY2lvbjogJ290cmEnLCBjb25kaWNpb246ICd2MyA9IDUnLCBvcmRlbjogMSwgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiBudWxsIH0sXG5dO1xuY29uc3QgcmVhc1N1cDogT21pdDxSZWFTdXAsICdjb25kaWNpb25fanMnPltdID0gW1xuICAgIHsgb3BlcmF0aXZvOiAnZXRvaTIxMScsIHJlYV9zdXA6IDEsIGRlc2NyaXBjaW9uOiAnc3VwZXJ2aXNhZGEnLCBjb25kaWNpb246ICdzMSA9IDEnLCBvcmRlbjogMSwgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiAnc3VwZScgfSxcbl07XG5jb25zdCBvcGVyYXRpdm9zOiBGaWxhW10gPSBbeyBjb25fcmVhX2hvZ2FyOiB0cnVlLCBvcGVyYXRpdm86ICdldG9pMjExJywgY29uZmlnX3NvcnRlbzogbnVsbCB9XTtcblxuZnVuY3Rpb24gYmFzZUNvbkRhdG9zKCkge1xuICAgIHJldHVybiBuZXcgQmFzZUZhbHNhKHsgbm9fcmVhOiBub1JlYXMsIHJlYTogcmVhcywgbm9fcmVhX3N1cDogbm9SZWFzU3VwLCByZWFfc3VwOiByZWFzU3VwLCBvcGVyYXRpdm9zIH0pO1xufVxuXG4vLyBldmFsw7phIHVuYSBjb25kaWNpw7NuIGNvbXBpbGFkYSAoY29uZGljaW9uX2pzKSBjb21vIGxvIGhhY2UgZWwgZGlzcG9zaXRpdm9cbmZ1bmN0aW9uIGV2YWx1YXIoY29uZGljaW9uSnM6IHN0cmluZywgdmFsb3JlczogUmVjb3JkPHN0cmluZywgVmFsb3I+KTogYm9vbGVhbiB7XG4gICAgdmFyIGZ1bmNpb24gPSBuZXcgRnVuY3Rpb24oJ3ZhbG9yZXMnLCAnaGVscGVycycsICdyZXR1cm4gJyArIGNvbmRpY2lvbkpzKTtcbiAgICByZXR1cm4gZnVuY2lvbih2YWxvcmVzLCBoZWxwZXJzQ2FzaWxsZXJvcyk7XG59XG5cbmRlc2NyaWJlKCdkbWVuY3UgLSBjYWNoZXMgZGUgcmVhL25vIHJlYScsICgpID0+IHtcblxuICAgIGRlc2NyaWJlKCdyZWZyZXNoQ2FjaGVzJywgKCkgPT4ge1xuICAgICAgICBpdCgnY2FyZ2EgcmVhLCBubyByZWEgeSBzdXMgdmVyc2lvbmVzIF9zdXAnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgYmUgPSBjcmVhckFwcFBhcmFUZXN0cygpO1xuICAgICAgICAgICAgYXdhaXQgYmUucmVmcmVzaENhY2hlcyhiYXNlQ29uRGF0b3MoKSk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGJlLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhLCBub1JlYXMpO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChiZS5jYWNoZXMudGFibGVDb250ZW50LnJlYSwgcmVhcyk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGJlLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhX3N1cCwgbm9SZWFzU3VwKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmUuY2FjaGVzLnRhYmxlQ29udGVudC5yZWFfc3VwLCByZWFzU3VwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdwaWRlIGEgbGEgYmFzZSBsYXMgbGlzdGFzIG9yZGVuYWRhcyBwb3Igb3BlcmF0aXZvIHkgb3JkZW4gKGRlZmluZSBsYSBwcmlvcmlkYWQgZGUgZXZhbHVhY2nDs24pJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGJlID0gY3JlYXJBcHBQYXJhVGVzdHMoKTtcbiAgICAgICAgICAgIHZhciBiYXNlID0gYmFzZUNvbkRhdG9zKCk7XG4gICAgICAgICAgICBhd2FpdCBiZS5yZWZyZXNoQ2FjaGVzKGJhc2UpO1xuICAgICAgICAgICAgZm9yICh2YXIgdGFibGEgb2YgVEFCTEFTX1JFQV9OT19SRUEpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29uc3VsdGEgPSBiYXNlLmNvbnN1bHRhcy5maW5kKHNxbCA9PiBuZXcgUmVnRXhwKGBmcm9tICR7dGFibGF9IG9yZGVyIGJ5YCkudGVzdChzcWwpKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQub2soY29uc3VsdGEsIGBubyBzZSBjb25zdWx0w7MgJHt0YWJsYX1gKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQubWF0Y2goY29uc3VsdGEsIG5ldyBSZWdFeHAoYG9yZGVyIGJ5IG9wZXJhdGl2bywgb3JkZW4sICR7dGFibGF9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ2FncnVwYSBsb3Mgbm8gcmVhIHBvciBncnVwbyB5IHBvciBncnVwbzAnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgYmUgPSBjcmVhckFwcFBhcmFUZXN0cygpO1xuICAgICAgICAgICAgYXdhaXQgYmUucmVmcmVzaENhY2hlcyhiYXNlQ29uRGF0b3MoKSk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgICAgICAgICAgICAgIGJlLmNhY2hlcy50YWJsZUNvbnRlbnQubm9fcmVhX2dyb3Vwcy5tYXAoKGc6IEZpbGEpID0+IGcuZ3J1cG8pLFxuICAgICAgICAgICAgICAgIFsnYXVzZW5jaWEnLCAnbm8gZW5jdWVzdGFibGUnLCAncmVjaGF6byddXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgICAgICAgICBiZS5jYWNoZXMudGFibGVDb250ZW50Lm5vX3JlYV9ncm91cHMwLm1hcCgoZzogRmlsYSkgPT4gZy5ncnVwbyksXG4gICAgICAgICAgICAgICAgWydlbmN1ZXN0YWJsZScsICdubyBlbmN1ZXN0YWJsZSddXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ2NhcmdhIGxhIGNvbmZpZ3VyYWNpw7NuIGRlbCBvcGVyYXRpdm8gYWN0dWFsIChjb25fcmVhX2hvZ2FyKScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHZhciBiZSA9IGNyZWFyQXBwUGFyYVRlc3RzKCk7XG4gICAgICAgICAgICBhd2FpdCBiZS5yZWZyZXNoQ2FjaGVzKGJhc2VDb25EYXRvcygpKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmUuY2FjaGVzLnRhYmxlQ29udGVudC5jb25SZWFIb2dhciwgb3BlcmF0aXZvc1swXSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnYWwgcmVjYXJnYXIgcmVlbXBsYXphIGxvcyBkYXRvcyBhbnRlcmlvcmVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGJlID0gY3JlYXJBcHBQYXJhVGVzdHMoKTtcbiAgICAgICAgICAgIHZhciBiYXNlID0gYmFzZUNvbkRhdG9zKCk7XG4gICAgICAgICAgICBhd2FpdCBiZS5yZWZyZXNoQ2FjaGVzKGJhc2UpO1xuICAgICAgICAgICAgYmFzZS50YWJsYXMucmVhID0gW3JlYXNbMF1dO1xuICAgICAgICAgICAgYXdhaXQgYmUucmVmcmVzaENhY2hlcyhiYXNlKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmUuY2FjaGVzLnRhYmxlQ29udGVudC5yZWEsIFtyZWFzWzBdXSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3JlZnJlc2NhckVzdHJ1Y3R1cmFBbE1vZGlmaWNhclRhYmxhIChlbnZ1ZWx2ZSB0YWJsZV9yZWNvcmRfc2F2ZSB5IHRhYmxlX3JlY29yZF9kZWxldGUpJywgKCkgPT4ge1xuICAgICAgICB0eXBlIENvbnRleHRvRmFsc28gPSB7IGNsaWVudDogQ2xpZW50ZURiIH07XG4gICAgICAgIHR5cGUgTGxhbWFkYSA9IHsgdGFibGE6IHN0cmluZywgZXh0cmE6IG9iamVjdCB8IHVuZGVmaW5lZCB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHByZXBhcmFyUmVmcmVzY2Fkb3IoKSB7XG4gICAgICAgICAgICB2YXIgZXZlbnRvczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIHZhciBjbGllbnRlc1JlZnJlc2NhZG9zOiBDbGllbnRlRGJbXSA9IFtdO1xuICAgICAgICAgICAgdmFyIGJlOiBSZWZyZXNjYWRvckVzdHJ1Y3R1cmEgPSB7XG4gICAgICAgICAgICAgICAgY2FjaGVzOiB7IHRpbWVzdGFtcEVzdHJ1Y3R1cmE6IDAgfSxcbiAgICAgICAgICAgICAgICByZWZyZXNoQ2FjaGVzOiBhc3luYyAoY2xpZW50OiBDbGllbnRlRGIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRvcy5wdXNoKCdyZWZyZXNjYXInKTtcbiAgICAgICAgICAgICAgICAgICAgY2xpZW50ZXNSZWZyZXNjYWRvcy5wdXNoKGNsaWVudCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgbGxhbWFkYXM6IExsYW1hZGFbXSA9IFtdO1xuICAgICAgICAgICAgdmFyIGd1YXJkYXIgPSBhc3luYyAoX2NvbnRleHQ6IENvbnRleHRvRmFsc28sIHBhcmFtZXRlcnM6IHsgdGFibGU6IHN0cmluZyB9LCBleHRyYT86IG9iamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50b3MucHVzaCgnZ3VhcmRhcicpO1xuICAgICAgICAgICAgICAgIGxsYW1hZGFzLnB1c2goeyB0YWJsYTogcGFyYW1ldGVycy50YWJsZSwgZXh0cmEgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZ3VhcmRhZG86IHBhcmFtZXRlcnMudGFibGUgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4geyBiZSwgZXZlbnRvcywgY2xpZW50ZXNSZWZyZXNjYWRvcywgbGxhbWFkYXMsIGd1YXJkYXIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgdGFibGEgb2YgVEFCTEFTX1JFQV9OT19SRUEpIHtcbiAgICAgICAgICAgIGl0KGBhbCBtb2RpZmljYXIgJHt0YWJsYX0gcmVjYXJnYSBsYXMgY2FjaGVzIGRlc3B1w6lzIGRlIGd1YXJkYXIgeSBjYW1iaWEgbGEgZXN0cnVjdHVyYWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgeyBiZSwgZXZlbnRvcywgY2xpZW50ZXNSZWZyZXNjYWRvcywgZ3VhcmRhciB9ID0gcHJlcGFyYXJSZWZyZXNjYWRvcigpO1xuICAgICAgICAgICAgICAgIHZhciBjbGllbnQgPSBuZXcgQmFzZUZhbHNhKHt9KTtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0YWRvID0gYXdhaXQgcmVmcmVzY2FyRXN0cnVjdHVyYUFsTW9kaWZpY2FyVGFibGEoYmUsIGd1YXJkYXIpKHsgY2xpZW50IH0sIHsgdGFibGU6IHRhYmxhIH0pO1xuICAgICAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLCB7IGd1YXJkYWRvOiB0YWJsYSB9KTtcbiAgICAgICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGV2ZW50b3MsIFsnZ3VhcmRhcicsICdyZWZyZXNjYXInXSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNsaWVudGVzUmVmcmVzY2Fkb3NbMF0sIGNsaWVudCwgJ2RlYmUgcmVjYXJnYXIgY29uIGVsIG1pc21vIGNsaWVudGUgKG1pc21hIHRyYW5zYWNjacOzbiknKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQub2soYmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmEgPiAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdGFibGEgb2YgWydjYXNpbGxlcm9zJywgJ3NlbWFuYXMnXSkge1xuICAgICAgICAgICAgaXQoYGFsIG1vZGlmaWNhciAke3RhYmxhfSBjYW1iaWEgbGEgZXN0cnVjdHVyYSBzaW4gcmVjYXJnYXIgbGFzIGNhY2hlcyBkZSByZWFgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIHsgYmUsIGV2ZW50b3MsIGd1YXJkYXIgfSA9IHByZXBhcmFyUmVmcmVzY2Fkb3IoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCByZWZyZXNjYXJFc3RydWN0dXJhQWxNb2RpZmljYXJUYWJsYShiZSwgZ3VhcmRhcikoeyBjbGllbnQ6IG5ldyBCYXNlRmFsc2Eoe30pIH0sIHsgdGFibGU6IHRhYmxhIH0pO1xuICAgICAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZXZlbnRvcywgWydndWFyZGFyJ10pO1xuICAgICAgICAgICAgICAgIGFzc2VydC5vayhiZS5jYWNoZXMudGltZXN0YW1wRXN0cnVjdHVyYSA+IDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaXQoJ2FsIG1vZGlmaWNhciBvdHJhcyB0YWJsYXMgbm8gdG9jYSBsYSBlc3RydWN0dXJhIG5pIGxhcyBjYWNoZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgeyBiZSwgZXZlbnRvcywgZ3VhcmRhciB9ID0gcHJlcGFyYXJSZWZyZXNjYWRvcigpO1xuICAgICAgICAgICAgYXdhaXQgcmVmcmVzY2FyRXN0cnVjdHVyYUFsTW9kaWZpY2FyVGFibGEoYmUsIGd1YXJkYXIpKHsgY2xpZW50OiBuZXcgQmFzZUZhbHNhKHt9KSB9LCB7IHRhYmxlOiAndXN1YXJpb3MnIH0pO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChldmVudG9zLCBbJ2d1YXJkYXInXSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmEsIDApO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3NpIGZhbGxhIGVsIGd1YXJkYWRvIG5vIHJlY2FyZ2EgbmkgY2FtYmlhIGxhIGVzdHJ1Y3R1cmEnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgeyBiZSwgZXZlbnRvcyB9ID0gcHJlcGFyYXJSZWZyZXNjYWRvcigpO1xuICAgICAgICAgICAgdmFyIGd1YXJkYXJDb25FcnJvciA9IGFzeW5jIChfY29udGV4dDogQ29udGV4dG9GYWxzbywgX3BhcmFtZXRlcnM6IHsgdGFibGU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnRvcy5wdXNoKCdndWFyZGFyJyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlcnJvciBhbCBndWFyZGFyJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICAgICAgICAgcmVmcmVzY2FyRXN0cnVjdHVyYUFsTW9kaWZpY2FyVGFibGEoYmUsIGd1YXJkYXJDb25FcnJvcikoeyBjbGllbnQ6IG5ldyBCYXNlRmFsc2Eoe30pIH0sIHsgdGFibGU6ICdyZWEnIH0pLFxuICAgICAgICAgICAgICAgIC9lcnJvciBhbCBndWFyZGFyL1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZXZlbnRvcywgWydndWFyZGFyJ10pO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJlLmNhY2hlcy50aW1lc3RhbXBFc3RydWN0dXJhLCAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdwYXNhIGEgbGEgZnVuY2nDs24gb3JpZ2luYWwgbG9zIGFyZ3VtZW50b3MgZXh0cmEgKGZpbGVzL29wdHMgZGUgdGFibGVfcmVjb3JkX3NhdmUpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIHsgYmUsIGxsYW1hZGFzLCBndWFyZGFyIH0gPSBwcmVwYXJhclJlZnJlc2NhZG9yKCk7XG4gICAgICAgICAgICB2YXIgZXh0cmEgPSB7IGZpbGVzOiBbXSB9O1xuICAgICAgICAgICAgYXdhaXQgcmVmcmVzY2FyRXN0cnVjdHVyYUFsTW9kaWZpY2FyVGFibGEoYmUsIGd1YXJkYXIpKHsgY2xpZW50OiBuZXcgQmFzZUZhbHNhKHt9KSB9LCB7IHRhYmxlOiAnbm9fcmVhJyB9LCBleHRyYSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobGxhbWFkYXNbMF0uZXh0cmEsIGV4dHJhKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncmVhc05vUmVhc0RlbE9wZXJhdGl2byAocmVhL25vIHJlYSBlbiBsYSBlc3RydWN0dXJhIHF1ZSByZWNpYmUgZWwgZGlzcG9zaXRpdm8pJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YWJsZUNvbnRlbnQgPSB7IG5vX3JlYTogbm9SZWFzLCBub19yZWFfc3VwOiBub1JlYXNTdXAsIHJlYTogcmVhcywgcmVhX3N1cDogcmVhc1N1cCB9O1xuXG4gICAgICAgIGl0KCdmaWx0cmEgY2FkYSBsaXN0YSBwb3Igb3BlcmF0aXZvJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIHJlc3VsdGFkbyA9IHJlYXNOb1JlYXNEZWxPcGVyYXRpdm8odGFibGVDb250ZW50LCAnZXRvaTIxMScpO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8ubm9SZWFzLCBbbm9SZWFzWzBdLCBub1JlYXNbMV1dKTtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocmVzdWx0YWRvLm5vUmVhc1N1cCwgW25vUmVhc1N1cFswXV0pO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8ucmVhcy5tYXAocmVhID0+IHJlYS5yZWEpLCBbMSwgMl0pO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8ucmVhc1N1cC5tYXAocmVhU3VwID0+IHJlYVN1cC5yZWFfc3VwKSwgWzFdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdjb25zZXJ2YSBlbCBvcmRlbiBkZSBsYXMgY2FjaGVzIChxdWUgdmllbmUgb3JkZW5hZG8gcG9yIG9yZGVuKScsICgpID0+IHtcbiAgICAgICAgICAgIHZhciByZXN1bHRhZG8gPSByZWFzTm9SZWFzRGVsT3BlcmF0aXZvKHsgLi4udGFibGVDb250ZW50LCByZWE6IFtyZWFzWzFdLCByZWFzWzBdXSB9LCAnZXRvaTIxMScpO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZXN1bHRhZG8ucmVhcy5tYXAocmVhID0+IHJlYS5yZWEpLCBbMiwgMV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ2NvbXBpbGEgbGFzIGNvbmRpY2lvbmVzIGRlIHJlYSBhIGpzIGV2YWx1YWJsZSBlbiBlbCBkaXNwb3NpdGl2bycsICgpID0+IHtcbiAgICAgICAgICAgIHZhciBbY29tcGxldGEsIGluY29tcGxldGFdID0gcmVhc05vUmVhc0RlbE9wZXJhdGl2byh0YWJsZUNvbnRlbnQsICdldG9pMjExJykucmVhcztcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChldmFsdWFyKGNvbXBsZXRhLmNvbmRpY2lvbl9qcywgeyB2MTogMSwgdjI6IDExIH0pLCB0cnVlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChldmFsdWFyKGNvbXBsZXRhLmNvbmRpY2lvbl9qcywgeyB2MTogMSwgdjI6IDUgfSksIGZhbHNlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChldmFsdWFyKGluY29tcGxldGEuY29uZGljaW9uX2pzLCB7IHYxOiAxIH0pLCB0cnVlKTtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChldmFsdWFyKGluY29tcGxldGEuY29uZGljaW9uX2pzLCB7IHYxOiAyIH0pLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnY29tcGlsYSBsYXMgY29uZGljaW9uZXMgZGUgcmVhX3N1cCcsICgpID0+IHtcbiAgICAgICAgICAgIHZhciBbc3VwZXJ2aXNhZGFdID0gcmVhc05vUmVhc0RlbE9wZXJhdGl2byh0YWJsZUNvbnRlbnQsICdldG9pMjExJykucmVhc1N1cDtcbiAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChldmFsdWFyKHN1cGVydmlzYWRhLmNvbmRpY2lvbl9qcywgeyBzMTogMSB9KSwgdHJ1ZSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXZhbHVhcihzdXBlcnZpc2FkYS5jb25kaWNpb25fanMsIHsgczE6IDIgfSksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdsYXMgdmFyaWFibGVzIHNpbiBjYXJnYXIgc2UgdG9tYW4gY29tbyAwIChubyByb21wZW4gbGEgZXZhbHVhY2nDs24pJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIFtjb21wbGV0YV0gPSByZWFzTm9SZWFzRGVsT3BlcmF0aXZvKHRhYmxlQ29udGVudCwgJ2V0b2kyMTEnKS5yZWFzO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV2YWx1YXIoY29tcGxldGEuY29uZGljaW9uX2pzLCB7fSksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdubyBtb2RpZmljYSBsYXMgY2FjaGVzJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGFudGVzID0gSlNPTi5zdHJpbmdpZnkodGFibGVDb250ZW50KTtcbiAgICAgICAgICAgIHJlYXNOb1JlYXNEZWxPcGVyYXRpdm8odGFibGVDb250ZW50LCAnZXRvaTIxMScpO1xuICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKEpTT04uc3RyaW5naWZ5KHRhYmxlQ29udGVudCksIGFudGVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaSBsYXMgY2FjaGVzIG5vIHNlIGNhcmdhcm9uIGRldnVlbHZlIGxpc3RhcyB2YWPDrWFzJywgKCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZWFzTm9SZWFzRGVsT3BlcmF0aXZvKHt9LCAnZXRvaTIxMScpLCB7IG5vUmVhczogW10sIG5vUmVhc1N1cDogW10sIHJlYXM6IFtdLCByZWFzU3VwOiBbXSB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZGUgcHVudGEgYSBwdW50YTogbW9kaWZpY2FyIHVuYSByZWEgbGxlZ2EgYSBsYSBlc3RydWN0dXJhIGRlbCBkaXNwb3NpdGl2bycsICgpID0+IHtcbiAgICAgICAgaXQoJ2Rlc3B1w6lzIGRlIGd1YXJkYXIgdW5hIHJlYSwgbGEgZXN0cnVjdHVyYSBkZWwgb3BlcmF0aXZvIGxhIGluY2x1eWUgY29tcGlsYWRhJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIGJlID0gY3JlYXJBcHBQYXJhVGVzdHMoKTtcbiAgICAgICAgICAgIHZhciBiYXNlID0gYmFzZUNvbkRhdG9zKCk7XG4gICAgICAgICAgICBhd2FpdCBiZS5yZWZyZXNoQ2FjaGVzKGJhc2UpO1xuICAgICAgICAgICAgdmFyIHRpbWVzdGFtcEFudGVyaW9yID0gYmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmE7XG4gICAgICAgICAgICB2YXIgbnVldmFSZWE6IE9taXQ8UmVhLCAnY29uZGljaW9uX2pzJz4gPSB7IG9wZXJhdGl2bzogJ2V0b2kyMTEnLCByZWE6IDMsIGRlc2NyaXBjaW9uOiAnbnVldmEnLCBjb25kaWNpb246ICd2NCA9IDInLCBvcmRlbjogMywgZXNfcG9zaXRpdmE6IHRydWUsIHRhcmVhOiBudWxsIH07XG4gICAgICAgICAgICB2YXIgZ3VhcmRhciA9IGFzeW5jIChfY29udGV4dDogeyBjbGllbnQ6IENsaWVudGVEYiB9LCBfcGFyYW1ldGVyczogeyB0YWJsZTogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgICAgICBiYXNlLnRhYmxhcy5yZWEgPSBbLi4ucmVhcywgbnVldmFSZWFdO1xuICAgICAgICAgICAgICAgIHJldHVybiAnb2snO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyKSk7XG4gICAgICAgICAgICBhd2FpdCByZWZyZXNjYXJFc3RydWN0dXJhQWxNb2RpZmljYXJUYWJsYShiZSwgZ3VhcmRhcikoeyBjbGllbnQ6IGJhc2UgfSwgeyB0YWJsZTogJ3JlYScgfSk7XG4gICAgICAgICAgICBhc3NlcnQub2soYmUuY2FjaGVzLnRpbWVzdGFtcEVzdHJ1Y3R1cmEgPiB0aW1lc3RhbXBBbnRlcmlvciwgJ2xvcyBkaXNwb3NpdGl2b3MgZGViZW4gcmVjaWJpciBsYSBlc3RydWN0dXJhIG51ZXZhJyk7XG4gICAgICAgICAgICB2YXIgcmVhc09QMSA9IHJlYXNOb1JlYXNEZWxPcGVyYXRpdm8oYmUuY2FjaGVzLnRhYmxlQ29udGVudCwgJ2V0b2kyMTEnKS5yZWFzO1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChyZWFzT1AxLm1hcChyZWEgPT4gcmVhLnJlYSksIFsxLCAyLCAzXSk7XG4gICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXZhbHVhcihyZWFzT1AxWzJdLmNvbmRpY2lvbl9qcywgeyB2NDogMiB9KSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|