dmencu 0.1.5
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/dist/client/client/client.js +372 -0
- package/dist/client/client/css/form-data-signals-2.styl +11 -0
- package/dist/client/client/css/form-data-signals.styl +68 -0
- package/dist/client/client/css/menu.styl +6 -0
- package/dist/client/client/img/ba_etiqueta.jpg +0 -0
- package/dist/client/client/img/logo_etiqueta.jpg +0 -0
- package/dist/client/client/img/mandatory.png +0 -0
- package/dist/client/client/img/optativo.png +0 -0
- package/dist/client/client/img/pk-mandatory.png +0 -0
- package/dist/client/client/img/wait4this.png +0 -0
- package/dist/client/client/menu.js +3 -0
- package/dist/client/client/tsconfig.json +14 -0
- package/dist/client/unlogged/abrir-formulario.js +99 -0
- package/dist/client/unlogged/bypass-formulario.js +1141 -0
- package/dist/client/unlogged/css/Roboto-Regular.ttf +0 -0
- package/dist/client/unlogged/css/bootstrap.min.css +7 -0
- package/dist/client/unlogged/css/formulario-react.styl +756 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-192.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-192_capa.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-192_test.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-32.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-32_capa.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-32_test.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-48.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-48_capa.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-48_test.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-512.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-512_capa.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-512_test.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-64.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-64_capa.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-64_test.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-72.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-72_capa.png +0 -0
- package/dist/client/unlogged/img/PREJU_2022-logo-dm-72_test.png +0 -0
- package/dist/client/unlogged/img/_login-logo-icon.png +0 -0
- package/dist/client/unlogged/img/_logo-128.png +0 -0
- package/dist/client/unlogged/img/_logo.png +0 -0
- package/dist/client/unlogged/img/borrar-valor.pdn +0 -0
- package/dist/client/unlogged/img/borrar-valor.png +0 -0
- package/dist/client/unlogged/img/fondo-salteado-crudo.pdn +0 -0
- package/dist/client/unlogged/img/fondo-salteado-error.png +0 -0
- package/dist/client/unlogged/img/fondo-salteado.pdn +0 -0
- package/dist/client/unlogged/img/fondo-salteado.png +0 -0
- package/dist/client/unlogged/img/img-logo-dgeyc_blanco.png +0 -0
- package/dist/client/unlogged/img/login-logo-icon.png +0 -0
- package/dist/client/unlogged/img/logo-128.png +0 -0
- package/dist/client/unlogged/img/logo.png +0 -0
- package/dist/client/unlogged/img/logos-gcbs-blanco-150x57.png +0 -0
- package/dist/client/unlogged/offline.jade +10 -0
- package/dist/client/unlogged/redux-formulario.js +315 -0
- package/dist/client/unlogged/render-formulario.tsx +2103 -0
- package/dist/client/unlogged/render-general.tsx +228 -0
- package/dist/client/unlogged/tipos.js +19 -0
- package/dist/client/unlogged/tsconfig.json +15 -0
- package/dist/server/server/app-dmencu.js +641 -0
- package/dist/server/server/def-config.js +108 -0
- package/dist/server/server/procedures-dmencu.js +759 -0
- package/dist/server/server/server-dmencu.js +23 -0
- package/dist/server/server/table-areas.js +121 -0
- package/dist/server/server/table-comunas.js +29 -0
- package/dist/server/server/table-control_campo.js +100 -0
- package/dist/server/server/table-control_resumen.js +19 -0
- package/dist/server/server/table-encuestadores.js +19 -0
- package/dist/server/server/table-hogares.js +157 -0
- package/dist/server/server/table-hogares_sup.js +192 -0
- package/dist/server/server/table-lotes.js +44 -0
- package/dist/server/server/table-mis_encuestadores.js +78 -0
- package/dist/server/server/table-mis_tareas.js +19 -0
- package/dist/server/server/table-mis_tareas_areas.js +19 -0
- package/dist/server/server/table-mis_tareas_tem.js +19 -0
- package/dist/server/server/table-no_rea.js +33 -0
- package/dist/server/server/table-no_rea_sup.js +33 -0
- package/dist/server/server/table-operaciones.js +31 -0
- package/dist/server/server/table-parametros.js +40 -0
- package/dist/server/server/table-permisos.js +32 -0
- package/dist/server/server/table-personal.js +63 -0
- package/dist/server/server/table-personal_rol.js +43 -0
- package/dist/server/server/table-personas.js +449 -0
- package/dist/server/server/table-personas_sup.js +94 -0
- package/dist/server/server/table-recepcionistas.js +19 -0
- package/dist/server/server/table-recuperadores.js +19 -0
- package/dist/server/server/table-resultados_tarea.js +29 -0
- package/dist/server/server/table-roles.js +33 -0
- package/dist/server/server/table-roles_permisos.js +36 -0
- package/dist/server/server/table-roles_subordinados.js +33 -0
- package/dist/server/server/table-semanas.js +42 -0
- package/dist/server/server/table-sincronizaciones.js +31 -0
- package/dist/server/server/table-supervisores.js +19 -0
- package/dist/server/server/table-tareas.js +47 -0
- package/dist/server/server/table-tareas_areas.js +68 -0
- package/dist/server/server/table-tareas_tem.js +148 -0
- package/dist/server/server/table-tem.js +187 -0
- package/dist/server/server/table-tem_recepcion.js +19 -0
- package/dist/server/server/table-usuarios.js +59 -0
- package/dist/server/server/table-visitas.js +92 -0
- package/dist/server/server/table-visitas_sup.js +92 -0
- package/dist/server/server/table-viviendas.js +300 -0
- package/dist/server/server/types-dmencu.js +24 -0
- package/dist/server/unlogged/tipos.js +19 -0
- package/dist/unlogged/unlogged/abrir-formulario.js +99 -0
- package/dist/unlogged/unlogged/adapt.js +8 -0
- package/dist/unlogged/unlogged/bypass-formulario.js +1141 -0
- package/dist/unlogged/unlogged/css/Roboto-Regular.ttf +0 -0
- package/dist/unlogged/unlogged/css/bootstrap.min.css +7 -0
- package/dist/unlogged/unlogged/css/formulario-react.styl +756 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-192.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-192_capa.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-192_test.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-32.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-32_capa.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-32_test.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-48.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-48_capa.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-48_test.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-512.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-512_capa.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-512_test.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-64.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-64_capa.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-64_test.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-72.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-72_capa.png +0 -0
- package/dist/unlogged/unlogged/img/PREJU_2022-logo-dm-72_test.png +0 -0
- package/dist/unlogged/unlogged/img/_login-logo-icon.png +0 -0
- package/dist/unlogged/unlogged/img/_logo-128.png +0 -0
- package/dist/unlogged/unlogged/img/_logo.png +0 -0
- package/dist/unlogged/unlogged/img/borrar-valor.pdn +0 -0
- package/dist/unlogged/unlogged/img/borrar-valor.png +0 -0
- package/dist/unlogged/unlogged/img/fondo-salteado-crudo.pdn +0 -0
- package/dist/unlogged/unlogged/img/fondo-salteado-error.png +0 -0
- package/dist/unlogged/unlogged/img/fondo-salteado.pdn +0 -0
- package/dist/unlogged/unlogged/img/fondo-salteado.png +0 -0
- package/dist/unlogged/unlogged/img/img-logo-dgeyc_blanco.png +0 -0
- package/dist/unlogged/unlogged/img/login-logo-icon.png +0 -0
- package/dist/unlogged/unlogged/img/logo-128.png +0 -0
- package/dist/unlogged/unlogged/img/logo.png +0 -0
- package/dist/unlogged/unlogged/img/logos-gcbs-blanco-150x57.png +0 -0
- package/dist/unlogged/unlogged/offline.jade +10 -0
- package/dist/unlogged/unlogged/redux-formulario.js +315 -0
- package/dist/unlogged/unlogged/render-formulario.js +1485 -0
- package/dist/unlogged/unlogged/render-formulario.tsx +2103 -0
- package/dist/unlogged/unlogged/render-general.js +185 -0
- package/dist/unlogged/unlogged/render-general.tsx +228 -0
- package/dist/unlogged/unlogged/tipos.js +19 -0
- package/dist/unlogged/unlogged/tsconfig.json +15 -0
- package/dist/unlogged/unlogged/unlogged.js +180 -0
- package/package.json +91 -0
|
@@ -0,0 +1,1141 @@
|
|
|
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", "like-ar", "row-validator", "best-globals", "./tipos"], factory);
|
|
17
|
+
}
|
|
18
|
+
})(function (require, exports) {
|
|
19
|
+
"use strict";
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.calcularResumenVivienda = exports.calcularPermiteBorrarBF = exports.calcularDisabledBF = exports.calcularActualBF = exports.getFormulariosForIdVivienda = exports.calcularFeedbackEncuesta = exports.calcularFeedbackHojaDeRuta = exports.getMainFormForVivienda = exports.numberOrStringIncIfArray = exports.calcularFeedbackUnidadAnalisis = exports.verificarSorteo = exports.defOperativo = exports.getFuncionValorar = exports.getFuncionHabilitar = exports.getFuncionCompilada = exports.miniCompiladorSQlJs = exports.MAXCP = exports.ultimaVaribleVivienda = exports.dispatchByPass = exports.accion_borrar_formulario = exports.accion_abrir_formulario = exports.accion_agregar_formulario = exports.accion_borrar_visita = exports.accion_modificar_visita = exports.accion_agregar_visita = exports.accion_registrar_nota = exports.accion_registrar_respuesta = exports.NO_CAMBIAR__VERIFICAR_SI_ES_NECESARIO = exports.NO_CAMBIAR__SOLO_TRAER_STATUS = exports.accion_id_pregunta = exports.setValorDistinto = exports.setAttrDistinto = exports.calcularElementoEnfocado = exports.volcadoInicialElementosRegistrados = exports.registrarElemento = exports.getEstructura = exports.getDirty = exports.getFeedbackRowValidator = exports.getDatosByPass = exports.setDatosByPass = exports.setEstructura = exports.intentarBackup = exports.setEncolarBackup = exports.setPersistirDatosByPass = exports.setCalcularVariables = void 0;
|
|
22
|
+
const like_ar_1 = require("like-ar");
|
|
23
|
+
const row_validator_1 = require("row-validator");
|
|
24
|
+
const best_globals_1 = require("best-globals");
|
|
25
|
+
const tipos_1 = require("./tipos");
|
|
26
|
+
var especiales = {};
|
|
27
|
+
function setCalcularVariables(calcularVariables) {
|
|
28
|
+
especiales.calcularVariables = calcularVariables;
|
|
29
|
+
}
|
|
30
|
+
exports.setCalcularVariables = setCalcularVariables;
|
|
31
|
+
var datosByPass = {};
|
|
32
|
+
//@ts-ignore arranca en blanco
|
|
33
|
+
var estructura = null;
|
|
34
|
+
let persistirDatosByPassInterno = () => {
|
|
35
|
+
throw new Error('persistirDatosByPass SIN DEFINIR');
|
|
36
|
+
};
|
|
37
|
+
function setPersistirDatosByPass(persistirDatosByPassFun) {
|
|
38
|
+
persistirDatosByPassInterno = persistirDatosByPassFun;
|
|
39
|
+
}
|
|
40
|
+
exports.setPersistirDatosByPass = setPersistirDatosByPass;
|
|
41
|
+
function persistirDatosByPass(dbpp) {
|
|
42
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
+
yield persistirDatosByPassInterno(dbpp);
|
|
44
|
+
datosByPass.dirty = false;
|
|
45
|
+
refrescarMarcaDirty();
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function setEncolarBackup(encolarBackupFun) {
|
|
49
|
+
encolarBackup = encolarBackupFun;
|
|
50
|
+
}
|
|
51
|
+
exports.setEncolarBackup = setEncolarBackup;
|
|
52
|
+
let encolarBackup = () => {
|
|
53
|
+
throw new Error("SIN ESPECIFICAR encolarBackup");
|
|
54
|
+
};
|
|
55
|
+
var intentarBackup = (forPk) => {
|
|
56
|
+
var { respuestasRaiz, forPkRaiz } = respuestasForPk(forPk, true);
|
|
57
|
+
var token = datosByPass.token;
|
|
58
|
+
if (token) {
|
|
59
|
+
encolarBackup(token, forPkRaiz, respuestasRaiz);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
console.log("no hay token, no se pudo hacer el backup");
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
exports.intentarBackup = intentarBackup;
|
|
66
|
+
function setEstructura(estructuraACargar) {
|
|
67
|
+
var _a;
|
|
68
|
+
estructura = estructuraACargar;
|
|
69
|
+
exports.defOperativo.UAprincipal = (_a = (0, like_ar_1.strict)(estructura.unidades_analisis).find(ua => !!ua.principal)) === null || _a === void 0 ? void 0 : _a.unidad_analisis;
|
|
70
|
+
exports.defOperativo.defFor = (0, like_ar_1.strict)(estructura.formularios).map(f => ({ hermano: f.casilleros.hermano })).plain();
|
|
71
|
+
exports.defOperativo.defUA = (0, like_ar_1.strict)(estructura.unidades_analisis).map((uaDef, ua) => ({
|
|
72
|
+
pk: uaDef.pk_agregada,
|
|
73
|
+
incluidas: (0, like_ar_1.strict)(uaDef.hijas).keys(),
|
|
74
|
+
idsFor: (0, like_ar_1.strict)(estructura.formularios).filter(f => f.casilleros.unidad_analisis == ua).keys()
|
|
75
|
+
})).plain();
|
|
76
|
+
return estructura;
|
|
77
|
+
}
|
|
78
|
+
exports.setEstructura = setEstructura;
|
|
79
|
+
function setDatosByPass(dbpp) {
|
|
80
|
+
datosByPass = Object.assign(Object.assign({ dirty: false }, dbpp), { feedbackRowValidator: {} });
|
|
81
|
+
calcularFeedbackHojaDeRuta();
|
|
82
|
+
}
|
|
83
|
+
exports.setDatosByPass = setDatosByPass;
|
|
84
|
+
var getDatosByPass = () => datosByPass;
|
|
85
|
+
exports.getDatosByPass = getDatosByPass;
|
|
86
|
+
function objetoVacio(o) {
|
|
87
|
+
for (var k in o) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
function getFeedbackRowValidator() {
|
|
93
|
+
if (!datosByPass.feedbackRowValidator || objetoVacio(datosByPass.feedbackRowValidator)) {
|
|
94
|
+
calcularFeedbackHojaDeRuta();
|
|
95
|
+
}
|
|
96
|
+
return datosByPass.feedbackRowValidator;
|
|
97
|
+
}
|
|
98
|
+
exports.getFeedbackRowValidator = getFeedbackRowValidator;
|
|
99
|
+
function getDirty() {
|
|
100
|
+
return datosByPass.dirty;
|
|
101
|
+
}
|
|
102
|
+
exports.getDirty = getDirty;
|
|
103
|
+
function getEstructura() {
|
|
104
|
+
return estructura;
|
|
105
|
+
}
|
|
106
|
+
exports.getEstructura = getEstructura;
|
|
107
|
+
var registroElementosGlobal = {};
|
|
108
|
+
function registrarElemento(def) {
|
|
109
|
+
// @ts-ignore Sí, podría ser que los tipos de T sean distintos, pero van a ser coherentes
|
|
110
|
+
var registroElementos = registroElementosGlobal;
|
|
111
|
+
registroElementos[def.id] = def;
|
|
112
|
+
}
|
|
113
|
+
exports.registrarElemento = registrarElemento;
|
|
114
|
+
function respuestasForPk(forPk, conAumentadas, agregarSiFalta) {
|
|
115
|
+
var respuestasAumentadas = {};
|
|
116
|
+
// @ts-expect-error lo que sobrar de respuestas no me importa...
|
|
117
|
+
var respuestas = datosByPass.respuestas;
|
|
118
|
+
var respuestasRaiz;
|
|
119
|
+
var forPkRaiz;
|
|
120
|
+
var unidad_analisis = estructura.formularios[forPk.formulario].casilleros.unidad_analisis;
|
|
121
|
+
var forPkApilada = forPk;
|
|
122
|
+
var pila = [];
|
|
123
|
+
while (unidad_analisis) {
|
|
124
|
+
var uaDef = estructura.unidades_analisis[unidad_analisis];
|
|
125
|
+
pila.push([unidad_analisis, uaDef, forPkApilada]);
|
|
126
|
+
forPkApilada = Object.assign({}, forPkApilada);
|
|
127
|
+
delete forPkApilada[uaDef.pk_agregada];
|
|
128
|
+
unidad_analisis = uaDef.padre;
|
|
129
|
+
}
|
|
130
|
+
while (pila.length) {
|
|
131
|
+
[unidad_analisis, uaDef, forPkApilada] = pila.pop();
|
|
132
|
+
var valorPkOPosicion = forPkApilada[uaDef.pk_agregada];
|
|
133
|
+
if (valorPkOPosicion == undefined) {
|
|
134
|
+
throw new Error(`falta un valor para ${JSON.stringify(uaDef.pk_agregada)}`);
|
|
135
|
+
}
|
|
136
|
+
if (respuestas[unidad_analisis] == null) {
|
|
137
|
+
respuestas[unidad_analisis] = [];
|
|
138
|
+
}
|
|
139
|
+
var respuestasAnterior = respuestas;
|
|
140
|
+
let posicion = respuestas[unidad_analisis] instanceof Array ? valorPkOPosicion - 1 : valorPkOPosicion;
|
|
141
|
+
respuestas = respuestas[unidad_analisis][posicion];
|
|
142
|
+
if (respuestas == null) {
|
|
143
|
+
if (agregarSiFalta) {
|
|
144
|
+
respuestas = {};
|
|
145
|
+
respuestasAnterior[unidad_analisis][posicion] = respuestas;
|
|
146
|
+
persistirDatosByPass(datosByPass); // OJO ASYNC DESCONTROLADA
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
throw new Error(`No existe el elemento '${posicion}' en la unidad_analisis '${unidad_analisis}'`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
forPkRaiz || (forPkRaiz = forPkApilada);
|
|
153
|
+
// @ts-expect-error Sé que es raíz por cómo estoy revolviendo la pila
|
|
154
|
+
respuestasRaiz || (respuestasRaiz = respuestas);
|
|
155
|
+
if (conAumentadas) {
|
|
156
|
+
respuestasAumentadas = Object.assign(Object.assign(Object.assign({}, respuestasAumentadas), respuestas), { [uaDef.pk_agregada]: valorPkOPosicion });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
respuestas, respuestasAumentadas,
|
|
161
|
+
// @ts-ignore Sé que la pila tiene al menos un elemento por lo tanto esto está lleno seguro.
|
|
162
|
+
respuestasRaiz, forPkRaiz, unidadAnalisis: uaDef
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function volcadoInicialElementosRegistrados(forPkRaiz) {
|
|
166
|
+
var { respuestasAumentadas } = respuestasForPk(forPkRaiz, true);
|
|
167
|
+
var registroElementos = registroElementosGlobal;
|
|
168
|
+
var plainForPk = (0, tipos_1.toPlainForPk)(forPkRaiz);
|
|
169
|
+
var rowValidator = datosByPass.feedbackRowValidator[plainForPk];
|
|
170
|
+
for (var id in registroElementos) {
|
|
171
|
+
var def = registroElementos[id];
|
|
172
|
+
if (def.elemento) {
|
|
173
|
+
if (!document.body.contains(def.elemento)) {
|
|
174
|
+
def.elemento = undefined;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (!def.elemento) {
|
|
178
|
+
def.elemento = document.getElementById(def.id);
|
|
179
|
+
}
|
|
180
|
+
if (!def.elemento) {
|
|
181
|
+
// console.log('BUSCANDO el elemento registrado ',id,'no está en el DOM')
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
var value = def.fun(respuestasAumentadas, rowValidator, def.elemento, datosByPass.feedbackRowValidator, estructura);
|
|
185
|
+
if ('prop' in def) {
|
|
186
|
+
setValorDistinto(def.elemento, def.prop, value);
|
|
187
|
+
}
|
|
188
|
+
if ('attr' in def) {
|
|
189
|
+
setAttrDistinto(def.elemento, def.attr, value);
|
|
190
|
+
}
|
|
191
|
+
if ('style' in def) {
|
|
192
|
+
setValorDistinto(def.elemento.style, def.style, value);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (rowValidator.actual) {
|
|
196
|
+
var { top, bottom } = calcularElementoEnfocado(rowValidator.actual);
|
|
197
|
+
if (top != null && bottom != null) {
|
|
198
|
+
// @ts-ignore
|
|
199
|
+
document.getElementById('fab-activo-arriba').elTopVisibilizar = top;
|
|
200
|
+
// @ts-ignore
|
|
201
|
+
document.getElementById('fab-activo-abajo').elBottomVisibilizar = bottom;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
exports.volcadoInicialElementosRegistrados = volcadoInicialElementosRegistrados;
|
|
206
|
+
function calcularElementoEnfocado(idVariable) {
|
|
207
|
+
var _a;
|
|
208
|
+
var elementoVariableAEnfocar = document.getElementById(idVariable == 'fin' ? `boton-volver-2` : `var-${idVariable}`)
|
|
209
|
+
|| document.getElementById(`seccion-boton-formulario-${idVariable}`);
|
|
210
|
+
var elemento = elementoVariableAEnfocar;
|
|
211
|
+
var MARGEN_SCROLL = 64;
|
|
212
|
+
var altoPantalla = window.innerHeight * 0.7 - MARGEN_SCROLL;
|
|
213
|
+
var elementoEntero = elemento; // es el elemento que va a entar entero en pantalla, define el bottom
|
|
214
|
+
var rectElementoEntero = null;
|
|
215
|
+
var elementoSuperior = null; // es el elemento que va a mostrarse desde arriba aunque no entre entero, define el top
|
|
216
|
+
var rectElementoSuperior = null;
|
|
217
|
+
while (elemento != null) {
|
|
218
|
+
if (elemento.classList.contains('variable')
|
|
219
|
+
|| elemento.classList.contains('multiple')
|
|
220
|
+
|| elemento.classList.contains('pregunta')
|
|
221
|
+
|| elemento.classList.contains('conjuntopreguntas')
|
|
222
|
+
|| elemento.classList.contains('seccion-boton-formulario')
|
|
223
|
+
|| elemento.classList.contains('botonformulario')) {
|
|
224
|
+
if (elementoSuperior == null && elemento.clientHeight < altoPantalla) {
|
|
225
|
+
elementoEntero = elemento;
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
if (rectElementoEntero == null) {
|
|
229
|
+
elementoSuperior = elementoEntero;
|
|
230
|
+
rectElementoEntero = myOwn.getRect(elementoEntero);
|
|
231
|
+
rectElementoSuperior = rectElementoEntero;
|
|
232
|
+
}
|
|
233
|
+
var rect = myOwn.getRect(elemento);
|
|
234
|
+
if (rectElementoEntero.top + rectElementoEntero.height - rect.top < altoPantalla) {
|
|
235
|
+
elementoSuperior = elemento;
|
|
236
|
+
rectElementoSuperior = rect;
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
elemento = null;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
elemento = (_a = elemento === null || elemento === void 0 ? void 0 : elemento.parentElement) !== null && _a !== void 0 ? _a : null;
|
|
244
|
+
}
|
|
245
|
+
if (elementoSuperior == null) {
|
|
246
|
+
elementoSuperior = elementoEntero;
|
|
247
|
+
}
|
|
248
|
+
var result = {};
|
|
249
|
+
if (elementoEntero != null) {
|
|
250
|
+
if (rectElementoEntero == null) {
|
|
251
|
+
rectElementoEntero = myOwn.getRect(elementoEntero);
|
|
252
|
+
}
|
|
253
|
+
result.elementoInputVariable = elementoVariableAEnfocar;
|
|
254
|
+
var top = (rectElementoSuperior !== null && rectElementoSuperior !== void 0 ? rectElementoSuperior : rectElementoEntero).top - MARGEN_SCROLL;
|
|
255
|
+
result.top = top;
|
|
256
|
+
result.bottom = rectElementoEntero.top + rectElementoEntero.height;
|
|
257
|
+
if (top < document.documentElement.scrollTop) {
|
|
258
|
+
result.desenfoque = 'arriba';
|
|
259
|
+
}
|
|
260
|
+
else if (rectElementoEntero.top + rectElementoEntero.height > document.documentElement.scrollTop + altoPantalla) {
|
|
261
|
+
result.desenfoque = 'abajo';
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
result.enfocado = true;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return result;
|
|
268
|
+
}
|
|
269
|
+
exports.calcularElementoEnfocado = calcularElementoEnfocado;
|
|
270
|
+
function setAttrDistinto(objeto, name, valor) {
|
|
271
|
+
if (objeto && objeto.getAttribute(name) != valor) {
|
|
272
|
+
objeto.setAttribute(name, valor);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
exports.setAttrDistinto = setAttrDistinto;
|
|
276
|
+
function setValorDistinto(objeto, name, valor) {
|
|
277
|
+
if (objeto[name] != valor) {
|
|
278
|
+
objeto[name] = valor;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
exports.setValorDistinto = setValorDistinto;
|
|
282
|
+
function calcularVariablesBotonFormulario(_forPk) {
|
|
283
|
+
}
|
|
284
|
+
;
|
|
285
|
+
function accion_id_pregunta(_payload, _datosByPass) {
|
|
286
|
+
}
|
|
287
|
+
exports.accion_id_pregunta = accion_id_pregunta;
|
|
288
|
+
exports.NO_CAMBIAR__SOLO_TRAER_STATUS = Symbol('NO_CAMBIAR_SOLO_TRAER_STATUS');
|
|
289
|
+
exports.NO_CAMBIAR__VERIFICAR_SI_ES_NECESARIO = Symbol('NO_CAMBIAR_VERIFICAR_SI_ES_NECESARIO');
|
|
290
|
+
function refrescarMarcaDirty() {
|
|
291
|
+
var botonGrabar = document.getElementById("save-button");
|
|
292
|
+
if (botonGrabar) {
|
|
293
|
+
if (botonGrabar.disabled !== !datosByPass.dirty) {
|
|
294
|
+
botonGrabar.disabled = !datosByPass.dirty;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
function accion_registrar_respuesta(payload, _datosByPass) {
|
|
299
|
+
var _a;
|
|
300
|
+
let token = 'AVERIGUAR TODO';
|
|
301
|
+
let { forPk, respuesta, variable } = payload;
|
|
302
|
+
var { respuestas, respuestasRaiz, forPkRaiz } = respuestasForPk(forPk);
|
|
303
|
+
var unidad_analisis = estructura.formularios[forPk.formulario];
|
|
304
|
+
var recentModified = false;
|
|
305
|
+
var valorAnterior = variable != exports.NO_CAMBIAR__SOLO_TRAER_STATUS ? respuestas[variable] : null;
|
|
306
|
+
if (respuesta !== exports.NO_CAMBIAR__VERIFICAR_SI_ES_NECESARIO && variable != exports.NO_CAMBIAR__SOLO_TRAER_STATUS) {
|
|
307
|
+
if (respuesta === '') {
|
|
308
|
+
respuesta = null;
|
|
309
|
+
}
|
|
310
|
+
else if (estructura.formularios[forPk.formulario].estructuraRowValidator.variables[variable].tipo == 'numero') {
|
|
311
|
+
if (respuesta != null) {
|
|
312
|
+
respuesta = Number(respuesta);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
// si es un falsy (0 == false) tengo que comparar con !==
|
|
316
|
+
recentModified = respuesta ? valorAnterior != respuesta : valorAnterior !== respuesta;
|
|
317
|
+
if (recentModified) {
|
|
318
|
+
respuestas[variable] = respuesta !== null && respuesta !== void 0 ? respuesta : null; // cambio undefined por null
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
var feedbackRow = datosByPass.feedbackRowValidator[(0, tipos_1.toPlainForPk)(forPk)];
|
|
322
|
+
var siguienteVariable;
|
|
323
|
+
if (variable != exports.NO_CAMBIAR__SOLO_TRAER_STATUS && (recentModified || exports.NO_CAMBIAR__VERIFICAR_SI_ES_NECESARIO && ((_a = feedbackRow.autoIngresadas) === null || _a === void 0 ? void 0 : _a[variable]))) {
|
|
324
|
+
variablesCalculadas(respuestasRaiz, forPk);
|
|
325
|
+
if (estructura.configSorteo && !(datosByPass === null || datosByPass === void 0 ? void 0 : datosByPass.soloLectura)) {
|
|
326
|
+
verificarSorteo({
|
|
327
|
+
configuracionSorteo: estructura.configSorteo[(0, exports.getMainFormForVivienda)(forPk.vivienda)],
|
|
328
|
+
respuestas,
|
|
329
|
+
respuestasRaiz,
|
|
330
|
+
variableActual: variable,
|
|
331
|
+
forPk: forPk
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
datosByPass.dirty = datosByPass.dirty || recentModified;
|
|
335
|
+
respuestasRaiz.$dirty = respuestasRaiz.$dirty || recentModified;
|
|
336
|
+
refrescarMarcaDirty();
|
|
337
|
+
calcularFeedback(respuestasRaiz, forPkRaiz, { autoIngreso: true });
|
|
338
|
+
feedbackRow = datosByPass.feedbackRowValidator[(0, tipos_1.toPlainForPk)(forPk)];
|
|
339
|
+
calcularVariablesBotonFormulario(forPk);
|
|
340
|
+
volcadoInicialElementosRegistrados(forPk);
|
|
341
|
+
persistirDatosByPass(datosByPass); // OJO ASYNC DESCONTROLADA
|
|
342
|
+
siguienteVariable = variable;
|
|
343
|
+
do {
|
|
344
|
+
siguienteVariable = feedbackRow.feedback[siguienteVariable].siguiente;
|
|
345
|
+
} while (valorAnterior == null && recentModified && siguienteVariable != null && siguienteVariable != 'fin' && estructura.formularios[forPk.formulario].estructuraRowValidator.variables[siguienteVariable].funcionAutoIngresar);
|
|
346
|
+
if (siguienteVariable == null && feedbackRow.feedback[variable].estado == 'valida') {
|
|
347
|
+
siguienteVariable = 'fin';
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return { recentModified, siguienteVariable, variableActual: feedbackRow.actual };
|
|
351
|
+
}
|
|
352
|
+
exports.accion_registrar_respuesta = accion_registrar_respuesta;
|
|
353
|
+
function accion_registrar_nota(payload, _datosByPass) {
|
|
354
|
+
let { forPkRaiz, tarea, nota } = payload;
|
|
355
|
+
console.log("FALTA // TODO");
|
|
356
|
+
}
|
|
357
|
+
exports.accion_registrar_nota = accion_registrar_nota;
|
|
358
|
+
function accion_agregar_visita(payload, _datosByPass) {
|
|
359
|
+
let { forPkRaiz, observaciones } = payload;
|
|
360
|
+
/*
|
|
361
|
+
if(!datosByPass.hojaDeRuta[vivienda].visitas){
|
|
362
|
+
datosByPass.hojaDeRuta[vivienda].visitas = [];
|
|
363
|
+
}
|
|
364
|
+
var visitas = datosByPass.hojaDeRuta[vivienda].visitas;
|
|
365
|
+
visitas.push({
|
|
366
|
+
fecha: datetime.now().toYmd(),
|
|
367
|
+
hora: datetime.now().toHm(),
|
|
368
|
+
idper: null, // TODO: VER DE DONDE SE SACA EL IDPER state.datos.idper,
|
|
369
|
+
observaciones:observaciones
|
|
370
|
+
})
|
|
371
|
+
*/
|
|
372
|
+
}
|
|
373
|
+
exports.accion_agregar_visita = accion_agregar_visita;
|
|
374
|
+
function accion_modificar_visita(payload, _datosByPass) {
|
|
375
|
+
let { forPkRaiz, index, opcion, valor } = payload;
|
|
376
|
+
// var visitas = datosByPass.hojaDeRuta[vivienda].visitas;
|
|
377
|
+
// visitas[index][opcion] = valor;
|
|
378
|
+
}
|
|
379
|
+
exports.accion_modificar_visita = accion_modificar_visita;
|
|
380
|
+
function accion_borrar_visita(payload, _datosByPass) {
|
|
381
|
+
let { forPkRaiz, index } = payload;
|
|
382
|
+
// var visitas = datosByPass.hojaDeRuta[vivienda].visitas;
|
|
383
|
+
// visitas.splice(index, 1);
|
|
384
|
+
}
|
|
385
|
+
exports.accion_borrar_visita = accion_borrar_visita;
|
|
386
|
+
function accion_agregar_formulario({ forPk }, _datosByPass) {
|
|
387
|
+
var { respuestas, unidadAnalisis, respuestasAumentadas, respuestasRaiz } = respuestasForPk(forPk, true, true);
|
|
388
|
+
variablesCalculadas(respuestasRaiz, forPk);
|
|
389
|
+
calcularFeedbackUnidadAnalisis(datosByPass.feedbackRowValidator, estructura.formularios, respuestas, unidadAnalisis.unidad_analisis, forPk, respuestasAumentadas, null, {});
|
|
390
|
+
calcularVariablesBotonFormulario(forPk);
|
|
391
|
+
}
|
|
392
|
+
exports.accion_agregar_formulario = accion_agregar_formulario;
|
|
393
|
+
function accion_abrir_formulario({ forPk }, _datosByPass) {
|
|
394
|
+
var { respuestas, unidadAnalisis, respuestasAumentadas, respuestasRaiz } = respuestasForPk(forPk, true, true);
|
|
395
|
+
variablesCalculadas(respuestasRaiz, forPk);
|
|
396
|
+
calcularFeedbackUnidadAnalisis(datosByPass.feedbackRowValidator, estructura.formularios, respuestas, unidadAnalisis.unidad_analisis, forPk, respuestasAumentadas, null, {});
|
|
397
|
+
calcularVariablesBotonFormulario(forPk);
|
|
398
|
+
}
|
|
399
|
+
exports.accion_abrir_formulario = accion_abrir_formulario;
|
|
400
|
+
function accion_borrar_formulario({ forPk, forPkPadre }) {
|
|
401
|
+
var { respuestas, unidadAnalisis, respuestasAumentadas, respuestasRaiz, forPkRaiz } = respuestasForPk(forPk, true, true);
|
|
402
|
+
var unidad_analisis = estructura.formularios[forPk.formulario].casilleros.unidad_analisis;
|
|
403
|
+
var uaDef = estructura.unidades_analisis[unidad_analisis];
|
|
404
|
+
var index = forPk[uaDef.pk_agregada];
|
|
405
|
+
respuestasAumentadas[unidad_analisis].pop();
|
|
406
|
+
variablesCalculadas(respuestasRaiz, forPkPadre);
|
|
407
|
+
datosByPass.dirty = datosByPass.dirty || true;
|
|
408
|
+
respuestasRaiz.$dirty = respuestasRaiz.$dirty || true;
|
|
409
|
+
refrescarMarcaDirty();
|
|
410
|
+
calcularFeedback(respuestasRaiz, forPkRaiz, { autoIngreso: true });
|
|
411
|
+
calcularVariablesBotonFormulario(forPkPadre);
|
|
412
|
+
volcadoInicialElementosRegistrados(forPkPadre);
|
|
413
|
+
persistirDatosByPass(datosByPass); // OJO ASYNC DESCONTROLADA
|
|
414
|
+
}
|
|
415
|
+
exports.accion_borrar_formulario = accion_borrar_formulario;
|
|
416
|
+
function dispatchByPass(fun, payload) {
|
|
417
|
+
return fun(payload, datosByPass);
|
|
418
|
+
}
|
|
419
|
+
exports.dispatchByPass = dispatchByPass;
|
|
420
|
+
//////////////////////////////////////////////////////////////////////////
|
|
421
|
+
exports.ultimaVaribleVivienda = 'NO_ESTA_DEFINIDA_AUN//TODO';
|
|
422
|
+
exports.MAXCP = 20;
|
|
423
|
+
/* REDUCERS */
|
|
424
|
+
var reemplazosHabilitar = {
|
|
425
|
+
false: 'false',
|
|
426
|
+
true: 'true',
|
|
427
|
+
"=": '==',
|
|
428
|
+
"<>": '!=',
|
|
429
|
+
"&": '&&',
|
|
430
|
+
"|": '||',
|
|
431
|
+
"OR": '||',
|
|
432
|
+
"AND": '&&',
|
|
433
|
+
"or": '||',
|
|
434
|
+
"and": '&&',
|
|
435
|
+
"not": '!',
|
|
436
|
+
"NOT": '!',
|
|
437
|
+
};
|
|
438
|
+
const helpersCasilleros = {
|
|
439
|
+
null2zero(posibleNull) {
|
|
440
|
+
if (posibleNull == null) {
|
|
441
|
+
return 0;
|
|
442
|
+
}
|
|
443
|
+
return posibleNull;
|
|
444
|
+
},
|
|
445
|
+
div0err(numerador, denominador, pk) {
|
|
446
|
+
if (denominador == 0) {
|
|
447
|
+
throw new Error("Error en " + pk + " division por cero de " + numerador);
|
|
448
|
+
}
|
|
449
|
+
return numerador / denominador;
|
|
450
|
+
},
|
|
451
|
+
funs: {
|
|
452
|
+
blanco(x) {
|
|
453
|
+
return x !== 0 && !x;
|
|
454
|
+
},
|
|
455
|
+
hoy() {
|
|
456
|
+
return best_globals_1.date.today().toDmy();
|
|
457
|
+
},
|
|
458
|
+
fecha_valida(x) {
|
|
459
|
+
var formato_valido = /^([1-9]|0[1-9]|[12]\d|3[01])\/([1-9]|0[1-9]|1[012])\/20\d\d$/.test(x);
|
|
460
|
+
var xDate;
|
|
461
|
+
var conversionOk;
|
|
462
|
+
conversionOk = true;
|
|
463
|
+
if (formato_valido) {
|
|
464
|
+
const [d, m, y] = x.split('/');
|
|
465
|
+
try {
|
|
466
|
+
xDate = new Date(`${y}/${m}/${d}`);
|
|
467
|
+
}
|
|
468
|
+
catch (err) {
|
|
469
|
+
conversionOk = false;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
;
|
|
473
|
+
//faltaria validar que no sea una fecha futura y que sea una fecha en el rango del operativo
|
|
474
|
+
return formato_valido && conversionOk;
|
|
475
|
+
},
|
|
476
|
+
informado(x) {
|
|
477
|
+
return x !== undefined && x !== null && (!(x instanceof Array) || x.length !== 0)
|
|
478
|
+
&& (!(x instanceof Object) || Object.keys(x).length !== 0);
|
|
479
|
+
},
|
|
480
|
+
nsnc(x) {
|
|
481
|
+
return x == -9;
|
|
482
|
+
},
|
|
483
|
+
par(x) {
|
|
484
|
+
return x % 2 == 0;
|
|
485
|
+
},
|
|
486
|
+
/*
|
|
487
|
+
dbo:{
|
|
488
|
+
datoFamiliar(encu:string,hog:number,per:number, dato:string){
|
|
489
|
+
var xpersonas=personas;
|
|
490
|
+
return encu==enc && hog==hogar && informado(xpersonas) && per<= xpersonas.length && per>=1 && !!xpersonas[per-1][dato]? xpersonas[per-1][dato]:null
|
|
491
|
+
},
|
|
492
|
+
edadfamiliar(encu:string,hog:number,per:number){
|
|
493
|
+
var xpersonas=personas;
|
|
494
|
+
return datoFamiliar(encu:string,hog:number,per:number,'edad')
|
|
495
|
+
},
|
|
496
|
+
existeindividual(encu:string,hog:number,per:number){
|
|
497
|
+
var xpersonas=personas;
|
|
498
|
+
return encu==enc && hog==hogar && !!personas && per<= personas.length && per>=1 && !!personas[per-1]['entreaind']
|
|
499
|
+
},
|
|
500
|
+
existemiembro(encu:string,hog:number,per:number){
|
|
501
|
+
var xpersonas=personas;
|
|
502
|
+
return encu==enc && hog==hogar && !!personas && per<= personas.length && per>=1
|
|
503
|
+
},
|
|
504
|
+
nroconyuges(encu:string,hog:number){
|
|
505
|
+
var xpersonas=personas
|
|
506
|
+
return xpersonas.filter( per->per.p4==2).length
|
|
507
|
+
},
|
|
508
|
+
nrojefes(encu:string,hog:number,per:number){
|
|
509
|
+
return personas.filter( per->per.p4==1).length
|
|
510
|
+
},
|
|
511
|
+
parentescofamiliar(encu:string,hog:number,per:number){
|
|
512
|
+
return datoFamiliar(encu:string,hog:number,per:number,'p4')
|
|
513
|
+
},
|
|
514
|
+
sexofamiliar(encu:string,hog:number,per:number){
|
|
515
|
+
var xpersonas=personas;
|
|
516
|
+
return encu==enc && hog==hogar && !!xpersonas && per<= xpersonas.length && per>=1 && !!xpersonas[per-1].sexo? xpersonas[per-1]['sexo']:null
|
|
517
|
+
},
|
|
518
|
+
sitconyjefe(encu:string,hog:number){
|
|
519
|
+
return datoFamiliar(encu:string,hog:number,1,'p5')
|
|
520
|
+
}
|
|
521
|
+
} */
|
|
522
|
+
}
|
|
523
|
+
};
|
|
524
|
+
var funcionesHabilitar = {};
|
|
525
|
+
var funcionesValorar = {};
|
|
526
|
+
function miniCompiladorSQlJs(expresionCasiSQL) {
|
|
527
|
+
var expresion = expresionCasiSQL.replace(/\u00A0/g, ' ');
|
|
528
|
+
var cuerpo = expresion.replace(/\bis distinct from\b/gi, '!=').replace(/\b.+?\b/g, function (elToken) {
|
|
529
|
+
var elTokenTrimeado = elToken.trim();
|
|
530
|
+
if (elTokenTrimeado in reemplazosHabilitar) {
|
|
531
|
+
return reemplazosHabilitar[elTokenTrimeado];
|
|
532
|
+
}
|
|
533
|
+
else if (/^\d+\.?\d*$/.test(elTokenTrimeado)) {
|
|
534
|
+
return elToken;
|
|
535
|
+
}
|
|
536
|
+
else if (/^\W+$/.test(elTokenTrimeado)) {
|
|
537
|
+
return elToken;
|
|
538
|
+
}
|
|
539
|
+
else if (/^\s+$/.test(elToken)) {
|
|
540
|
+
return elToken;
|
|
541
|
+
}
|
|
542
|
+
return 'helpers.null2zero(valores.' + elToken + ')';
|
|
543
|
+
});
|
|
544
|
+
return cuerpo;
|
|
545
|
+
}
|
|
546
|
+
exports.miniCompiladorSQlJs = miniCompiladorSQlJs;
|
|
547
|
+
function getFuncionCompilada(conjuntoDeFunciones) {
|
|
548
|
+
return function (nombreFuncionComoExpresionJs) {
|
|
549
|
+
if (!conjuntoDeFunciones[nombreFuncionComoExpresionJs]) {
|
|
550
|
+
var cuerpo = nombreFuncionComoExpresionJs;
|
|
551
|
+
try {
|
|
552
|
+
// var cuerpo = miniCompiladorSQlJs(nombreFuncionComoExpresionJs);
|
|
553
|
+
var internalFun = new Function('valores', 'helpers', 'return ' + cuerpo);
|
|
554
|
+
conjuntoDeFunciones[nombreFuncionComoExpresionJs] = function (valores) {
|
|
555
|
+
try {
|
|
556
|
+
var result = internalFun(valores, helpersCasilleros);
|
|
557
|
+
}
|
|
558
|
+
catch (err) {
|
|
559
|
+
console.log('ERROR EJECUCCION EXPRESION EXTERNA ', nombreFuncionComoExpresionJs);
|
|
560
|
+
console.log(cuerpo);
|
|
561
|
+
console.log(valores);
|
|
562
|
+
throw err;
|
|
563
|
+
}
|
|
564
|
+
return result;
|
|
565
|
+
};
|
|
566
|
+
}
|
|
567
|
+
catch (err) {
|
|
568
|
+
console.log('ERROR COMPILACION EXPRESION EXTERNA ', nombreFuncionComoExpresionJs);
|
|
569
|
+
console.log(cuerpo);
|
|
570
|
+
throw err;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
return conjuntoDeFunciones[nombreFuncionComoExpresionJs];
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
exports.getFuncionCompilada = getFuncionCompilada;
|
|
577
|
+
exports.getFuncionHabilitar = getFuncionCompilada(funcionesHabilitar);
|
|
578
|
+
exports.getFuncionValorar = getFuncionCompilada(funcionesValorar);
|
|
579
|
+
var rowValidator = (0, row_validator_1.getRowValidator)({ getFuncionHabilitar: exports.getFuncionHabilitar, getFuncionValorar: exports.getFuncionValorar });
|
|
580
|
+
var buscarNoReaEnRespuestas = (unidadesARecorrerPrm, unidadAnalisis, respuestas, noReasTarea, nombNoRea) => {
|
|
581
|
+
var nrcodigo = null;
|
|
582
|
+
var esvalor = false;
|
|
583
|
+
var rvalor = null;
|
|
584
|
+
var rvariable;
|
|
585
|
+
var rnorea = null;
|
|
586
|
+
// var result={nrcod:String, esval:Boolean};
|
|
587
|
+
if (unidadesARecorrerPrm.includes(unidadAnalisis.unidad_analisis)) {
|
|
588
|
+
for (let noRea of noReasTarea) { //estructura.noReas, estructura.noReasSup
|
|
589
|
+
if (nombNoRea == 'no_rea') {
|
|
590
|
+
var { variable, valor, no_rea } = noRea;
|
|
591
|
+
rnorea = no_rea;
|
|
592
|
+
rvalor = valor;
|
|
593
|
+
rvariable = variable;
|
|
594
|
+
}
|
|
595
|
+
else {
|
|
596
|
+
var { variable_sup, valor_sup, no_rea_sup } = noRea;
|
|
597
|
+
rnorea = no_rea_sup;
|
|
598
|
+
rvalor = valor_sup;
|
|
599
|
+
rvariable = variable_sup;
|
|
600
|
+
}
|
|
601
|
+
if (respuestas[rvariable] == rvalor) {
|
|
602
|
+
nrcodigo = rnorea; //no_rea, no_rea_sup
|
|
603
|
+
esvalor = true;
|
|
604
|
+
return { nrcodigo, esvalor };
|
|
605
|
+
}
|
|
606
|
+
else {
|
|
607
|
+
nrcodigo = null;
|
|
608
|
+
esvalor = false;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
for (let ua of ((0, like_ar_1.strict)(unidadAnalisis === null || unidadAnalisis === void 0 ? void 0 : unidadAnalisis.hijas).array())) {
|
|
613
|
+
if ((ua === null || ua === void 0 ? void 0 : ua.unidad_analisis) && respuestas[ua.unidad_analisis] instanceof Array) {
|
|
614
|
+
for (let respuestasHijas of respuestas[ua === null || ua === void 0 ? void 0 : ua.unidad_analisis]) {
|
|
615
|
+
let result = buscarNoReaEnRespuestas(unidadesARecorrerPrm, ua, respuestasHijas, noReasTarea, nombNoRea);
|
|
616
|
+
if (result.esvalor) {
|
|
617
|
+
nrcodigo = result.nrcodigo;
|
|
618
|
+
esvalor = result.esvalor;
|
|
619
|
+
return { nrcodigo, esvalor };
|
|
620
|
+
break;
|
|
621
|
+
}
|
|
622
|
+
else {
|
|
623
|
+
nrcodigo = null;
|
|
624
|
+
esvalor = false;
|
|
625
|
+
// return {nrcodigo, esvalor}
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
return { nrcodigo, esvalor };
|
|
631
|
+
};
|
|
632
|
+
////// TODOS LOS NOMBRES DE variables o formularios o casilleros deben estar en el objeto operativo
|
|
633
|
+
//// QUITARLO Y REEMPLAZARLO por buscar en estructura.unidad_analisis y estructura.formulario
|
|
634
|
+
exports.defOperativo = {
|
|
635
|
+
//TODO: GENERALIZAR
|
|
636
|
+
//esNorea:(respuestas:Respuestas)=>{
|
|
637
|
+
// const NO_REA_VAR = 'entreav' as IdVariable;
|
|
638
|
+
// return respuestas[NO_REA_VAR] && respuestas[NO_REA_VAR]!=1
|
|
639
|
+
//},
|
|
640
|
+
esNorea: (respuestas) => {
|
|
641
|
+
//TODO GENERALIZAR
|
|
642
|
+
var unidadesARecorrer = ['viviendas', 'hogares', 'personas'];
|
|
643
|
+
var uaPrincipal = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => !ua.padre);
|
|
644
|
+
var esNoRea = false;
|
|
645
|
+
var codNoRea = null;
|
|
646
|
+
/*
|
|
647
|
+
var buscarNoReaEnRespuestas = (unidadAnalisis:UnidadAnalisis, respuestas:Respuestas)=>{
|
|
648
|
+
if(unidadesARecorrer.includes(unidadAnalisis.unidad_analisis)){
|
|
649
|
+
for(let noRea of estructura.noReas){
|
|
650
|
+
var {variable, valor, no_rea} = noRea;
|
|
651
|
+
if(respuestas[variable as IdVariable]==valor){
|
|
652
|
+
codNoRea = no_rea;
|
|
653
|
+
esNoRea = true;
|
|
654
|
+
return true
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
for(let ua of (likeAr(unidadAnalisis?.hijas).array())){
|
|
659
|
+
if(ua?.unidad_analisis && respuestas[ua.unidad_analisis] instanceof Array){
|
|
660
|
+
for(let respuestasHijas of respuestas[ua?.unidad_analisis]){
|
|
661
|
+
let result = buscarNoReaEnRespuestas(ua,respuestasHijas);
|
|
662
|
+
if(result){
|
|
663
|
+
break;
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
return false
|
|
669
|
+
}
|
|
670
|
+
buscarNoReaEnRespuestas(uaPrincipal!,respuestas);
|
|
671
|
+
return {codNoRea,esNoRea}
|
|
672
|
+
*/
|
|
673
|
+
let resnorea = buscarNoReaEnRespuestas(unidadesARecorrer, uaPrincipal, respuestas, estructura.noReas, 'no_rea');
|
|
674
|
+
codNoRea = resnorea.nrcodigo;
|
|
675
|
+
esNoRea = resnorea.esvalor;
|
|
676
|
+
return { codNoRea, esNoRea };
|
|
677
|
+
},
|
|
678
|
+
esNoreaSup: (respuestas) => {
|
|
679
|
+
//TODO GENERALIZAR buscarNoreaRespuestas
|
|
680
|
+
var unidadesARecorrerSup = ['viviendas', 'hogares_sup', 'personas_sup'];
|
|
681
|
+
var uaPrincipal = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => !ua.padre);
|
|
682
|
+
var esNoReaSup = false;
|
|
683
|
+
var codNoReaSup = null;
|
|
684
|
+
let resnorea = buscarNoReaEnRespuestas(unidadesARecorrerSup, uaPrincipal, respuestas, estructura.noReasSup, 'no_rea_sup'); //con los parametros que necesitariamos para generalizar
|
|
685
|
+
codNoReaSup = resnorea.nrcodigo;
|
|
686
|
+
esNoReaSup = resnorea.esvalor;
|
|
687
|
+
return { codNoReaSup, esNoReaSup };
|
|
688
|
+
},
|
|
689
|
+
esRealizada: (respuestas) => {
|
|
690
|
+
//TODO GENERALIZAR
|
|
691
|
+
var esRea = false;
|
|
692
|
+
var codRea = null;
|
|
693
|
+
if (!respuestas['identif']) {
|
|
694
|
+
return { codRea, esRea };
|
|
695
|
+
}
|
|
696
|
+
else if (respuestas['identif'] == 2 || respuestas['resid_hog'] == 2 || respuestas['contact'] == 2) {
|
|
697
|
+
codRea = 2;
|
|
698
|
+
esRea = false;
|
|
699
|
+
}
|
|
700
|
+
else {
|
|
701
|
+
var reahs = [];
|
|
702
|
+
var respuestasHs = respuestas['hogares'];
|
|
703
|
+
if (respuestasHs) {
|
|
704
|
+
for (let respuestasH of respuestasHs) {
|
|
705
|
+
var reah;
|
|
706
|
+
var selec;
|
|
707
|
+
if (respuestasH['entrea'] != 1 || respuestasH['prejue1'] == 2 || respuestasH['tp'] == 0) {
|
|
708
|
+
reah = 2;
|
|
709
|
+
}
|
|
710
|
+
else {
|
|
711
|
+
selec = respuestasH['cr_num_miembro'];
|
|
712
|
+
if (respuestasH['personas'] && respuestasH.personas[selec - 1]) {
|
|
713
|
+
var respuestasP = respuestasH.personas[selec - 1];
|
|
714
|
+
var resp_entrea_ind = respuestasP['entreaind'];
|
|
715
|
+
if (resp_entrea_ind == null) { //queremos contemplar el undefined
|
|
716
|
+
reah = 3;
|
|
717
|
+
}
|
|
718
|
+
else {
|
|
719
|
+
reah = Number(resp_entrea_ind);
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
else {
|
|
723
|
+
reah = 3;
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
reahs.push(reah);
|
|
727
|
+
}
|
|
728
|
+
if (reahs.every(rh => rh == 1)) {
|
|
729
|
+
codRea = 1;
|
|
730
|
+
esRea = true;
|
|
731
|
+
}
|
|
732
|
+
else if (reahs.every(rh => rh == 2)) {
|
|
733
|
+
codRea = 2;
|
|
734
|
+
esRea = false;
|
|
735
|
+
}
|
|
736
|
+
else if (reahs.every(rh => rh == 1 || rh == 3)) {
|
|
737
|
+
codRea = 3;
|
|
738
|
+
esRea = false;
|
|
739
|
+
}
|
|
740
|
+
else {
|
|
741
|
+
codRea = 4;
|
|
742
|
+
esRea = false;
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
else {
|
|
746
|
+
codRea = 3;
|
|
747
|
+
esRea = false;
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
return { codRea, esRea };
|
|
751
|
+
},
|
|
752
|
+
esRealizadaSup: (respuestas) => {
|
|
753
|
+
//TODO GENERALIZAR
|
|
754
|
+
var esReaSup = false;
|
|
755
|
+
var codReaSup = null;
|
|
756
|
+
if (!respuestas['confir_tel_sup'] && !respuestas['sp1a']) {
|
|
757
|
+
return { codReaSup, esReaSup };
|
|
758
|
+
}
|
|
759
|
+
else if (respuestas['confir_tel_sup'] == 2 || respuestas['confir_dom_sup'] == 2 || respuestas['sp1a'] == 2 || respuestas['sp1b'] == 2 || respuestas['sp1c'] == 2) {
|
|
760
|
+
codReaSup = 2;
|
|
761
|
+
esReaSup = false;
|
|
762
|
+
}
|
|
763
|
+
else {
|
|
764
|
+
var reahs = [];
|
|
765
|
+
var respuestasHs = respuestas['hogares_sup'];
|
|
766
|
+
if (respuestasHs) {
|
|
767
|
+
for (let respuestasH of respuestasHs) {
|
|
768
|
+
var reah;
|
|
769
|
+
var selec;
|
|
770
|
+
if (respuestasH['entrea_sup'] == 2 || respuestasH['spr1_sup'] == 2 || respuestasH['sp4'] == 3 || respuestasH['total_rango_sup'] == 0) {
|
|
771
|
+
reah = 2;
|
|
772
|
+
}
|
|
773
|
+
else {
|
|
774
|
+
if (respuestasH['entrea_sup']) {
|
|
775
|
+
reah = 1;
|
|
776
|
+
}
|
|
777
|
+
else {
|
|
778
|
+
reah = 3;
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
reahs.push(reah);
|
|
782
|
+
}
|
|
783
|
+
if (reahs.every(rh => rh == 1)) {
|
|
784
|
+
codReaSup = 1;
|
|
785
|
+
esReaSup = true;
|
|
786
|
+
}
|
|
787
|
+
else if (reahs.every(rh => rh == 2)) {
|
|
788
|
+
codReaSup = 2;
|
|
789
|
+
esReaSup = false;
|
|
790
|
+
}
|
|
791
|
+
else if (reahs.every(rh => rh == 1 || rh == 3)) {
|
|
792
|
+
codReaSup = 3;
|
|
793
|
+
esReaSup = false;
|
|
794
|
+
}
|
|
795
|
+
else {
|
|
796
|
+
codReaSup = 4;
|
|
797
|
+
esReaSup = false;
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
else {
|
|
801
|
+
codReaSup = 3;
|
|
802
|
+
esReaSup = false;
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
return { codReaSup, esReaSup };
|
|
806
|
+
},
|
|
807
|
+
UAprincipal: '',
|
|
808
|
+
defUA: {},
|
|
809
|
+
defFor: {}
|
|
810
|
+
};
|
|
811
|
+
function num(num) {
|
|
812
|
+
//@ts-ignore la gracia es meter num cuando es string
|
|
813
|
+
if (isNaN(num - 0))
|
|
814
|
+
return 0;
|
|
815
|
+
//@ts-ignore la gracia es meter num cuando es string
|
|
816
|
+
return num - 0;
|
|
817
|
+
}
|
|
818
|
+
var funcionesConocidas = {};
|
|
819
|
+
function verificarSorteo(opts) {
|
|
820
|
+
var _a, _b, _c;
|
|
821
|
+
const resetearSorteo = (opts) => {
|
|
822
|
+
var _a;
|
|
823
|
+
var { respuestas } = opts;
|
|
824
|
+
respuestas[configuracionSorteo.resultado] = null;
|
|
825
|
+
respuestas[configuracionSorteo.cantidad_sorteables] = null;
|
|
826
|
+
respuestas[configuracionSorteo.disparador] = null;
|
|
827
|
+
(_a = configuracionSorteo.sorteado_mostrar) === null || _a === void 0 ? void 0 : _a.forEach((mostrar) => respuestas[mostrar.target] = null);
|
|
828
|
+
if ('var_letra' in configuracionSorteo.param_metodo) {
|
|
829
|
+
if (respuestas[unidadAnalisis] && respuestas[unidadAnalisis] instanceof Array) {
|
|
830
|
+
for (var per of respuestas[unidadAnalisis]) {
|
|
831
|
+
per[configuracionSorteo.param_metodo.var_letra] = null;
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
};
|
|
836
|
+
var { configuracionSorteo, variableActual, respuestas, forPk, respuestasRaiz } = opts;
|
|
837
|
+
var idEnc = forPk.vivienda;
|
|
838
|
+
var { respuestasAumentadas } = respuestasForPk(forPk, true);
|
|
839
|
+
var expr_incompletitud_fun = (0, exports.getFuncionHabilitar)(configuracionSorteo.expr_incompletitud_js[respuestasAumentadas.vdominio].expr);
|
|
840
|
+
var filtro_fun = (0, exports.getFuncionHabilitar)(configuracionSorteo.filtro_js[respuestasAumentadas.vdominio].expr);
|
|
841
|
+
var unidadAnalisis = configuracionSorteo.unidad_analisis;
|
|
842
|
+
if (configuracionSorteo.parametros.includes(variableActual)) {
|
|
843
|
+
var uaPadre = (_a = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => ua.unidad_analisis == unidadAnalisis)) === null || _a === void 0 ? void 0 : _a.padre;
|
|
844
|
+
var pkAgregadaPadre = (_b = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => ua.unidad_analisis == uaPadre)) === null || _b === void 0 ? void 0 : _b.pk_agregada;
|
|
845
|
+
if (uaPadre && respuestasAumentadas[uaPadre]) {
|
|
846
|
+
//@ts-ignore pkAgregadaPadre existe e indica la posicion del padre
|
|
847
|
+
var padre = respuestasAumentadas[uaPadre][Number(respuestasAumentadas[pkAgregadaPadre]) - 1];
|
|
848
|
+
if (variableActual != configuracionSorteo.cantidad_total) {
|
|
849
|
+
padre[configuracionSorteo.cantidad_total] = padre[unidadAnalisis].length; //si agrega desde boton agregar
|
|
850
|
+
}
|
|
851
|
+
resetearSorteo({ respuestas: padre });
|
|
852
|
+
respuestas = padre;
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
if (respuestas[unidadAnalisis] != null) {
|
|
856
|
+
if (respuestas[unidadAnalisis] instanceof Array) {
|
|
857
|
+
var respuestasUA = respuestas[unidadAnalisis];
|
|
858
|
+
if (respuestas[configuracionSorteo.disparador] != 1) {
|
|
859
|
+
if (respuestas[configuracionSorteo.disparador] == 2) {
|
|
860
|
+
respuestas[configuracionSorteo.cantidad_total] = respuestasUA.length + 1;
|
|
861
|
+
}
|
|
862
|
+
resetearSorteo({ respuestas });
|
|
863
|
+
}
|
|
864
|
+
let cantidadTotal = Number(respuestas[configuracionSorteo.cantidad_total]);
|
|
865
|
+
if (cantidadTotal < respuestasUA.length) {
|
|
866
|
+
// doble asignación para que lo cargue en respuestas
|
|
867
|
+
respuestasUA = respuestasUA.filter((p, i) => configuracionSorteo.parametros.some((param) => p[param] || i <= cantidadTotal - 1));
|
|
868
|
+
respuestas[unidadAnalisis] = respuestasUA;
|
|
869
|
+
}
|
|
870
|
+
while (cantidadTotal > respuestasUA.length) {
|
|
871
|
+
respuestasUA.push({});
|
|
872
|
+
}
|
|
873
|
+
respuestas[configuracionSorteo.incompletas] = respuestasUA.filter(p => expr_incompletitud_fun(p)).length;
|
|
874
|
+
if (respuestas[configuracionSorteo.disparador] == 1 &&
|
|
875
|
+
!respuestas[configuracionSorteo.resultado] &&
|
|
876
|
+
respuestas[configuracionSorteo.incompletas] == 0) {
|
|
877
|
+
var sortear = respuestasUA.filter(p => filtro_fun(p));
|
|
878
|
+
if (sortear.length) {
|
|
879
|
+
respuestasUA.forEach((per, i) => per.$p0 = i + 1);
|
|
880
|
+
configuracionSorteo.orden.push({ variable: "$p0", orden: 1 });
|
|
881
|
+
sortear.sort((0, best_globals_1.compareForOrder)(configuracionSorteo.orden.map(elem => ({ column: elem.variable, order: elem.orden }))));
|
|
882
|
+
var posicionSorteada = null;
|
|
883
|
+
if (configuracionSorteo.metodo == 'hash') {
|
|
884
|
+
throw new Error('NO IMPLEMENTADO');
|
|
885
|
+
/*posicionSorteada=(
|
|
886
|
+
configuracionSorteo.param_metodo.var_coef.reduce(
|
|
887
|
+
((sum, pair)=>sum + datosVivienda.tem[pair.var] * pair.coef),
|
|
888
|
+
0
|
|
889
|
+
) % configuracionSorteo.param_metodo.divisor
|
|
890
|
+
) % sortear.length*/
|
|
891
|
+
}
|
|
892
|
+
else {
|
|
893
|
+
var letra = 'A';
|
|
894
|
+
const varLetra = configuracionSorteo.param_metodo.var_letra;
|
|
895
|
+
for (var persona of sortear) {
|
|
896
|
+
respuestasUA.find((_per, i) => i == persona.$p0 - 1)[varLetra] = letra;
|
|
897
|
+
persona[varLetra] = letra;
|
|
898
|
+
letra = String.fromCharCode(letra.charCodeAt(0) + 1);
|
|
899
|
+
}
|
|
900
|
+
var tablaAleatoriaMiembros = configuracionSorteo.param_metodo.tabla.map((lista) => lista.split(''));
|
|
901
|
+
var resto = idEnc % 10;
|
|
902
|
+
var columnaTablaAleatoria = resto ? resto - 1 : 9;
|
|
903
|
+
if (sortear.length > tablaAleatoriaMiembros.length) {
|
|
904
|
+
sortear.splice(tablaAleatoriaMiembros.length); //descarto candidatos si son más que lo que permite la tabla
|
|
905
|
+
}
|
|
906
|
+
var filaTablaAleatoria = sortear.length - 1;
|
|
907
|
+
var letraSeleccionada = tablaAleatoriaMiembros[filaTablaAleatoria][columnaTablaAleatoria];
|
|
908
|
+
posicionSorteada = respuestasUA.findIndex((p) => p[varLetra] == letraSeleccionada) + 1;
|
|
909
|
+
respuestas[configuracionSorteo.resultado] = posicionSorteada;
|
|
910
|
+
respuestas[configuracionSorteo.cantidad_sorteables] = sortear.length;
|
|
911
|
+
(_c = configuracionSorteo.sorteado_mostrar) === null || _c === void 0 ? void 0 : _c.forEach((mostrar) => respuestas[mostrar.target] = respuestasUA[respuestas[configuracionSorteo.resultado] - 1][mostrar.source]);
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
else {
|
|
915
|
+
respuestas[configuracionSorteo.cantidad_sorteables] = 0;
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
respuestas[configuracionSorteo.cantidad_total] = respuestasUA.length || null; //no queremos el valor 0
|
|
919
|
+
respuestas[configuracionSorteo.variableBotonFormularioUA] = 'ok';
|
|
920
|
+
if (configuracionSorteo.variableBotonFormularioUAIndividual) {
|
|
921
|
+
respuestas[configuracionSorteo.variableBotonFormularioUAIndividual] = 'ok';
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
exports.verificarSorteo = verificarSorteo;
|
|
927
|
+
function variablesCalculadas(respuestasRaiz, forPk) {
|
|
928
|
+
if (especiales.calcularVariables) {
|
|
929
|
+
especiales.calcularVariables(respuestasRaiz, forPk);
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
function calcularFeedbackUnidadAnalisis(feedbackRowValidator, formularios, respuestas, UA, forPk, respuestasAumentadas, // incluyen la de todos los padres y ansestros,
|
|
933
|
+
respuestasPadre, opts) {
|
|
934
|
+
// recorriend UA personas y mascotas
|
|
935
|
+
for (var UAincluida of exports.defOperativo.defUA[UA].incluidas) {
|
|
936
|
+
var pkNueva = exports.defOperativo.defUA[UAincluida].pk;
|
|
937
|
+
var conjuntoRespuestasUA = respuestas[UAincluida];
|
|
938
|
+
(0, like_ar_1.strict)(conjuntoRespuestasUA).forEach((respuestasHijo, valorPkOPosicion) => {
|
|
939
|
+
var valorPk = numberOrStringIncIfArray(valorPkOPosicion, conjuntoRespuestasUA);
|
|
940
|
+
calcularFeedbackUnidadAnalisis(feedbackRowValidator, formularios, respuestasHijo, UAincluida, Object.assign(Object.assign({}, forPk), { [pkNueva]: valorPk }), Object.assign(Object.assign(Object.assign({}, respuestasAumentadas), respuestasHijo), { [pkNueva]: valorPk }), respuestas, opts);
|
|
941
|
+
});
|
|
942
|
+
}
|
|
943
|
+
// S1 , A1
|
|
944
|
+
for (var esHermano of [true, false]) {
|
|
945
|
+
for (var formulario of exports.defOperativo.defUA[UA].idsFor)
|
|
946
|
+
if (!!esHermano == !!exports.defOperativo.defFor[formulario].hermano) {
|
|
947
|
+
var plainForPk = (0, tipos_1.toPlainForPk)(Object.assign(Object.assign({}, forPk), { formulario }));
|
|
948
|
+
var maxPasosAutoingresadas = 10;
|
|
949
|
+
var varAutoIngresadas = [];
|
|
950
|
+
do {
|
|
951
|
+
var huboAutoingresos = false;
|
|
952
|
+
feedbackRowValidator[plainForPk] =
|
|
953
|
+
rowValidator(Object.assign({ marcaFin: 'fin' }, formularios[formulario].estructuraRowValidator), respuestasAumentadas, opts);
|
|
954
|
+
var { resumen, autoIngresadas } = feedbackRowValidator[plainForPk];
|
|
955
|
+
var varName;
|
|
956
|
+
if (autoIngresadas != null) {
|
|
957
|
+
for (varName in autoIngresadas) {
|
|
958
|
+
var cambio = respuestas[varName] !== autoIngresadas[varName];
|
|
959
|
+
if (cambio) {
|
|
960
|
+
respuestas[varName] = autoIngresadas[varName];
|
|
961
|
+
respuestasAumentadas[varName] = autoIngresadas[varName];
|
|
962
|
+
varAutoIngresadas.push(varName);
|
|
963
|
+
huboAutoingresos = true;
|
|
964
|
+
}
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
} while (huboAutoingresos && maxPasosAutoingresadas-- > 0);
|
|
968
|
+
varAutoIngresadas.forEach(varname => {
|
|
969
|
+
// feedbackRowValidator[plainForPk].estados[varname as IdVariable] = 'actual';
|
|
970
|
+
});
|
|
971
|
+
var BF_varname = '$B.' + formulario;
|
|
972
|
+
var formPrincipalForVivienda = (0, exports.getMainFormForVivienda)(forPk.vivienda);
|
|
973
|
+
if (estructura.configSorteo && !estructura.configSorteo[formPrincipalForVivienda]) {
|
|
974
|
+
throw new Error(`no hay configuracion de sorteo para el formulario ${formPrincipalForVivienda}`);
|
|
975
|
+
}
|
|
976
|
+
var configSorteoFormulario = estructura.configSorteo && estructura.configSorteo[formPrincipalForVivienda];
|
|
977
|
+
var resumenOrNull = configSorteoFormulario &&
|
|
978
|
+
configSorteoFormulario.variableBotonFormularioUAIndividual &&
|
|
979
|
+
configSorteoFormulario.variableBotonFormularioUAIndividual == BF_varname ?
|
|
980
|
+
'ok'
|
|
981
|
+
: resumen == 'vacio' ?
|
|
982
|
+
null
|
|
983
|
+
: resumen;
|
|
984
|
+
if (esHermano) {
|
|
985
|
+
respuestas[BF_varname] = resumenOrNull;
|
|
986
|
+
}
|
|
987
|
+
else if (respuestasPadre != null) {
|
|
988
|
+
respuestasPadre[BF_varname] = resumenOrNull;
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
exports.calcularFeedbackUnidadAnalisis = calcularFeedbackUnidadAnalisis;
|
|
994
|
+
function numberOrStringIncIfArray(numberOrString, object) {
|
|
995
|
+
// @ts-expect-error estoy usando isNaN para ver si es o no un número sumable
|
|
996
|
+
if (isNaN(numberOrString)) {
|
|
997
|
+
return numberOrString;
|
|
998
|
+
}
|
|
999
|
+
return Number(numberOrString) + (object instanceof Array ? 1 : 0);
|
|
1000
|
+
}
|
|
1001
|
+
exports.numberOrStringIncIfArray = numberOrStringIncIfArray;
|
|
1002
|
+
var getMainFormForVivienda = (vivienda) => {
|
|
1003
|
+
//@ts-ignore la vivienda es el parametro correcto
|
|
1004
|
+
return datosByPass.informacionHdr[vivienda].tarea.main_form;
|
|
1005
|
+
};
|
|
1006
|
+
exports.getMainFormForVivienda = getMainFormForVivienda;
|
|
1007
|
+
function calcularFeedbackHojaDeRuta() {
|
|
1008
|
+
(0, like_ar_1.strict)(estructura.unidades_analisis).filter(uaDef => !uaDef.padre).forEach(uaDef => {
|
|
1009
|
+
var esPrincipal = (f, enc) => {
|
|
1010
|
+
let formularioPrincipal = (0, exports.getMainFormForVivienda)(enc);
|
|
1011
|
+
return formularioPrincipal ? formularioPrincipal == f.id_casillero : f.formulario_principal;
|
|
1012
|
+
};
|
|
1013
|
+
var conjuntoRespuestasUA = datosByPass.respuestas[uaDef.unidad_analisis];
|
|
1014
|
+
(0, like_ar_1.beingArray)(conjuntoRespuestasUA).forEach((respuestas, valorPkOPosicion) => {
|
|
1015
|
+
var valorPk = numberOrStringIncIfArray(valorPkOPosicion, conjuntoRespuestasUA);
|
|
1016
|
+
(0, like_ar_1.strict)(estructura.formularios).filter(f => f.casilleros.unidad_analisis == uaDef.unidad_analisis && esPrincipal(f.casilleros, valorPk)).forEach((_defF, formulario) => {
|
|
1017
|
+
var forPkRaiz = { formulario, [uaDef.pk_agregada]: valorPk };
|
|
1018
|
+
calcularFeedback(respuestas, forPkRaiz, {});
|
|
1019
|
+
});
|
|
1020
|
+
});
|
|
1021
|
+
});
|
|
1022
|
+
}
|
|
1023
|
+
exports.calcularFeedbackHojaDeRuta = calcularFeedbackHojaDeRuta;
|
|
1024
|
+
function calcularFeedbackEncuesta(feedbackRowValidator, formularios, forPkRaiz, respuestas, opts) {
|
|
1025
|
+
var forPk = Object.assign({}, forPkRaiz);
|
|
1026
|
+
calcularFeedbackUnidadAnalisis(feedbackRowValidator, formularios, respuestas, exports.defOperativo.UAprincipal, forPk, respuestas, null, opts);
|
|
1027
|
+
}
|
|
1028
|
+
exports.calcularFeedbackEncuesta = calcularFeedbackEncuesta;
|
|
1029
|
+
function calcularFeedback(respuestas, forPkRaiz, opts) {
|
|
1030
|
+
var resumenEstado;
|
|
1031
|
+
// @ts-ignore Partial
|
|
1032
|
+
var nuevosRows = {};
|
|
1033
|
+
calcularFeedbackEncuesta(nuevosRows, estructura.formularios, forPkRaiz, respuestas, opts);
|
|
1034
|
+
datosByPass.feedbackRowValidator = (0, like_ar_1.strict)(datosByPass.feedbackRowValidator).filter((_feedback, plainPk) => JSON.parse(plainPk).vivienda != forPkRaiz.vivienda).plain();
|
|
1035
|
+
datosByPass.feedbackRowValidator = Object.assign(Object.assign({}, datosByPass.feedbackRowValidator), nuevosRows);
|
|
1036
|
+
datosByPass.respuestas.viviendas[forPkRaiz.vivienda] = Object.assign(Object.assign({}, datosByPass.respuestas.viviendas[forPkRaiz.vivienda]), calcularResumenVivienda(forPkRaiz, nuevosRows, respuestas));
|
|
1037
|
+
}
|
|
1038
|
+
var getFormulariosForIdVivienda = (idVivienda) => {
|
|
1039
|
+
var mainFormForVivienda = (0, exports.getMainFormForVivienda)(idVivienda);
|
|
1040
|
+
var formsFeedback = [mainFormForVivienda];
|
|
1041
|
+
var buscarFormulariosHijos = (idFormulario) => {
|
|
1042
|
+
estructura.formularios[idFormulario].casilleros.casilleros.forEach((casillero) => {
|
|
1043
|
+
var _a;
|
|
1044
|
+
if (casillero.tipoc == 'BF') {
|
|
1045
|
+
var formHijo = (((_a = casillero.salto) === null || _a === void 0 ? void 0 : _a.startsWith('F:')) ? casillero.salto : 'F:' + casillero.salto);
|
|
1046
|
+
if (formHijo) {
|
|
1047
|
+
formsFeedback.push(formHijo);
|
|
1048
|
+
buscarFormulariosHijos(formHijo);
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
});
|
|
1052
|
+
};
|
|
1053
|
+
buscarFormulariosHijos(mainFormForVivienda);
|
|
1054
|
+
return formsFeedback;
|
|
1055
|
+
};
|
|
1056
|
+
exports.getFormulariosForIdVivienda = getFormulariosForIdVivienda;
|
|
1057
|
+
var calcularActualBF = (configSorteoFormulario, numElementoUA, numActual, formulario, r) => !!(configSorteoFormulario &&
|
|
1058
|
+
configSorteoFormulario.id_formulario_individual &&
|
|
1059
|
+
configSorteoFormulario.id_formulario_individual == formulario
|
|
1060
|
+
?
|
|
1061
|
+
numElementoUA == (0, best_globals_1.coalesce)(r[configSorteoFormulario.resultado_manual], r[configSorteoFormulario.resultado])
|
|
1062
|
+
:
|
|
1063
|
+
numActual == numElementoUA);
|
|
1064
|
+
exports.calcularActualBF = calcularActualBF;
|
|
1065
|
+
var calcularDisabledBF = (configSorteoFormulario, numElementoUA, formulario, r) => !!(configSorteoFormulario &&
|
|
1066
|
+
configSorteoFormulario.id_formulario_individual == formulario &&
|
|
1067
|
+
numElementoUA != (0, best_globals_1.coalesce)(r[configSorteoFormulario.resultado_manual], r[configSorteoFormulario.resultado]));
|
|
1068
|
+
exports.calcularDisabledBF = calcularDisabledBF;
|
|
1069
|
+
var calcularPermiteBorrarBF = (configSorteoFormulario, formulario) => !(configSorteoFormulario &&
|
|
1070
|
+
configSorteoFormulario.id_formulario_individual == formulario);
|
|
1071
|
+
exports.calcularPermiteBorrarBF = calcularPermiteBorrarBF;
|
|
1072
|
+
function calcularResumenVivienda(forPkRaiz, feedbackRowValidator, respuestas) {
|
|
1073
|
+
var { codRea, esRea } = exports.defOperativo.esRealizada(respuestas);
|
|
1074
|
+
var { codNoRea, esNoRea } = exports.defOperativo.esNorea(respuestas);
|
|
1075
|
+
var { codReaSup, esReaSup } = exports.defOperativo.esRealizadaSup(respuestas);
|
|
1076
|
+
var { codNoReaSup, esNoReaSup } = exports.defOperativo.esNoreaSup(respuestas);
|
|
1077
|
+
var formsFeedback = (0, exports.getFormulariosForIdVivienda)(forPkRaiz.vivienda);
|
|
1078
|
+
var configuracionSorteoFormulario = estructura.configSorteo && estructura.configSorteo[(0, exports.getMainFormForVivienda)(forPkRaiz.vivienda)];
|
|
1079
|
+
var feedBackVivienda = (0, like_ar_1.strict)(feedbackRowValidator).filter((_row, plainPk) => {
|
|
1080
|
+
var tieneIndividual = configuracionSorteoFormulario && !!(configuracionSorteoFormulario.id_formulario_individual && configuracionSorteoFormulario.id_formulario_padre);
|
|
1081
|
+
return JSON.parse(plainPk).vivienda == forPkRaiz.vivienda &&
|
|
1082
|
+
formsFeedback.includes(JSON.parse(plainPk).formulario) &&
|
|
1083
|
+
(tieneIndividual ?
|
|
1084
|
+
!(0, exports.calcularDisabledBF)(configuracionSorteoFormulario, JSON.parse(plainPk).persona, JSON.parse(plainPk).formulario, JSON.parse(plainPk).hogar ? respuestasForPk({
|
|
1085
|
+
vivienda: forPkRaiz.vivienda,
|
|
1086
|
+
formulario: configuracionSorteoFormulario.id_formulario_padre,
|
|
1087
|
+
hogar: JSON.parse(plainPk).hogar
|
|
1088
|
+
}).respuestas : {})
|
|
1089
|
+
: true);
|
|
1090
|
+
}).array();
|
|
1091
|
+
var prioridades = {
|
|
1092
|
+
'no rea': { prioridad: 1, cantidad: 0 },
|
|
1093
|
+
'con problemas': { prioridad: 2, cantidad: 0 },
|
|
1094
|
+
'incompleto': { prioridad: 3, cantidad: 0 },
|
|
1095
|
+
'vacio': { prioridad: 4, cantidad: 0 },
|
|
1096
|
+
'cita pactada': { prioridad: 5, cantidad: 0 },
|
|
1097
|
+
'ok': { prioridad: 6, cantidad: 0 }
|
|
1098
|
+
};
|
|
1099
|
+
var min = 6;
|
|
1100
|
+
var minResumen = 'ok';
|
|
1101
|
+
for (var feedback of feedBackVivienda) {
|
|
1102
|
+
var resumen = feedback.resumen;
|
|
1103
|
+
prioridades[resumen].cantidad++;
|
|
1104
|
+
if (prioridades[resumen].prioridad < min) {
|
|
1105
|
+
min = prioridades[resumen].prioridad;
|
|
1106
|
+
minResumen = resumen;
|
|
1107
|
+
}
|
|
1108
|
+
}
|
|
1109
|
+
if (minResumen == 'vacio' && prioridades['ok'].cantidad || minResumen == 'incompleto') {
|
|
1110
|
+
if (false /*respuestas[sp1]==2 && respuestas[sp6]==null*/) {
|
|
1111
|
+
minResumen = 'cita pactada';
|
|
1112
|
+
}
|
|
1113
|
+
else {
|
|
1114
|
+
minResumen = 'incompleto';
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
//TODO ARREGLAR ESTE HORROR, GENERALIZAR
|
|
1118
|
+
var tarea = datosByPass.informacionHdr[forPkRaiz.vivienda].tarea.tarea;
|
|
1119
|
+
var resumenEstado;
|
|
1120
|
+
var resumenEstadoSup;
|
|
1121
|
+
if (tarea == 'supe') {
|
|
1122
|
+
resumenEstadoSup = esNoReaSup ? 'no rea' : minResumen;
|
|
1123
|
+
//para que coloree bien en la hdr del DM (luego en bbdd no se guarda)
|
|
1124
|
+
resumenEstado = resumenEstadoSup;
|
|
1125
|
+
}
|
|
1126
|
+
else {
|
|
1127
|
+
resumenEstado = esNoRea ? 'no rea' : minResumen;
|
|
1128
|
+
}
|
|
1129
|
+
var resultado = {
|
|
1130
|
+
resumenEstado,
|
|
1131
|
+
resumenEstadoSup,
|
|
1132
|
+
codRea,
|
|
1133
|
+
codNoRea,
|
|
1134
|
+
codReaSup,
|
|
1135
|
+
codNoReaSup
|
|
1136
|
+
};
|
|
1137
|
+
return resultado;
|
|
1138
|
+
}
|
|
1139
|
+
exports.calcularResumenVivienda = calcularResumenVivienda;
|
|
1140
|
+
});
|
|
1141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnlwYXNzLWZvcm11bGFyaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdW5sb2dnZWQvYnlwYXNzLWZvcm11bGFyaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQUEscUNBQXVEO0lBRXZELGlEQUFvRztJQUVwRywrQ0FBK0Q7SUFFL0QsbUNBY2lCO0lBRWpCLElBQUksVUFBVSxHQUFHLEVBRWhCLENBQUE7SUFDRCxTQUFnQixvQkFBb0IsQ0FBQyxpQkFBbUU7UUFDcEcsVUFBVSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFBO0lBQ3BELENBQUM7SUFGRCxvREFFQztJQVNELElBQUksV0FBVyxHQUFHLEVBQWlCLENBQUE7SUFFbkMsOEJBQThCO0lBQzlCLElBQUksVUFBVSxHQUFjLElBQWtCLENBQUM7SUFFL0MsSUFBSSwyQkFBMkIsR0FBZ0QsR0FBRSxFQUFFO1FBQy9FLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtJQUN2RCxDQUFDLENBQUE7SUFFRCxTQUFnQix1QkFBdUIsQ0FBQyx1QkFBbUQ7UUFDdkYsMkJBQTJCLEdBQUcsdUJBQXVCLENBQUM7SUFDMUQsQ0FBQztJQUZELDBEQUVDO0lBRUQsU0FBZSxvQkFBb0IsQ0FBQyxJQUE0Qjs7WUFDNUQsTUFBTSwyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxXQUFXLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtZQUN6QixtQkFBbUIsRUFBRSxDQUFDO1FBQzFCLENBQUM7S0FBQTtJQUVELFNBQWdCLGdCQUFnQixDQUM1QixnQkFBK0Y7UUFFL0YsYUFBYSxHQUFHLGdCQUFnQixDQUFBO0lBQ3BDLENBQUM7SUFKRCw0Q0FJQztJQUVELElBQUksYUFBYSxHQUFrRixHQUFFLEVBQUU7UUFDbkcsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO0lBQ3BELENBQUMsQ0FBQTtJ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QVUsSUFBRSxZQUFZLEVBQUM7WUFDNUUsSUFBRyxLQUFLLENBQUMsK0NBQStDLEVBQUM7Z0JBQ3JELFVBQVUsR0FBQyxjQUFjLENBQUM7YUFDN0I7aUJBQUk7Z0JBQ0QsVUFBVSxHQUFDLFlBQVksQ0FBQzthQUMzQjtTQUNKO1FBRUQsd0NBQXdDO1FBQ3hDLElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFFBQTRCLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzNGLElBQUksYUFBMkIsQ0FBQztRQUNoQyxJQUFJLGdCQUE4QixDQUFDO1FBQ25DLElBQUcsS0FBSyxJQUFFLE1BQU0sRUFBQztZQUNiLGdCQUFnQixHQUFHLFVBQVUsQ0FBQSxDQUFDLENBQUEsUUFBUSxDQUFBLENBQUMsQ0FBQSxVQUFVLENBQUE7WUFDakQscUVBQXFFO1lBQ3JFLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQTtTQUNuQzthQUFJO1lBQ0QsYUFBYSxHQUFHLE9BQU8sQ0FBQSxDQUFDLENBQUEsUUFBUSxDQUFBLENBQUMsQ0FBQSxVQUFVLENBQUE7U0FDOUM7UUFDRCxJQUFJLFNBQVMsR0FBb0I7WUFDN0IsYUFBYTtZQUNiLGdCQUFnQjtZQUNoQixNQUFNO1lBQ04sUUFBUTtZQUNSLFNBQVM7WUFDVCxXQUFXO1NBQ2QsQ0FBQTtRQUNELE9BQU8sU0FBUyxDQUFBO0lBQ3BCLENBQUM7SUExRUQsMERBMEVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3RyaWN0IGFzIGxpa2VBciwgYmVpbmdBcnJheSB9IGZyb20gXCJsaWtlLWFyXCI7XHJcblxyXG5pbXBvcnQgeyBnZXRSb3dWYWxpZGF0b3IsIEZvcm1TdHJ1Y3R1cmVTdGF0ZSwgT3BjaW9uZXNSb3dWYWxpZGF0b3IsIEZlZWRiYWNrIH0gZnJvbSBcInJvdy12YWxpZGF0b3JcIjtcclxuXHJcbmltcG9ydCB7IGRhdGUsIGNvbXBhcmVGb3JPcmRlciwgY29hbGVzY2UgfSBmcm9tIFwiYmVzdC1nbG9iYWxzXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgRXN0cnVjdHVyYSwgXHJcbiAgICBGb3JQaywgRm9yUGtSYWl6LFxyXG4gICAgSWRGaW4sIElkRm9ybXVsYXJpbywgSWRQcmVndW50YSwgSWRUYXJlYSwgSWRWYXJpYWJsZSwgXHJcbiAgICBJZFVuaWRhZEFuYWxpc2lzLFxyXG4gICAgSW5mb0Zvcm11bGFyaW8sIFxyXG4gICAgUGxhaW5Gb3JQaywgUmVzcHVlc3RhcywgUmVzcHVlc3Rhc1JhaXosIFJlc3VtZW5Fc3RhZG8sXHJcbiAgICBWYWxvciwgVmlzaXRhLCBcclxuICAgIHRvUGxhaW5Gb3JQayxcclxuICAgIFVuaWRhZEFuYWxpc2lzLFxyXG4gICAgRm9ybXVsYXJpbyxcclxuICAgIENvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvLFxyXG4gICAgRGF0b3NCeVBhc3NQZXJzaXN0aWJsZXMsXHJcbiAgICBJZEVuY1xyXG59IGZyb20gXCIuL3RpcG9zXCI7XHJcblxyXG52YXIgZXNwZWNpYWxlcyA9IHt9IGFzIHtcclxuICAgIGNhbGN1bGFyVmFyaWFibGVzPzoocmVzcHVlc3Rhc1JhaXo6UmVzcHVlc3Rhc1JhaXosIGZvclBrOkZvclBrKT0+dm9pZFxyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWxjdWxhclZhcmlhYmxlcyhjYWxjdWxhclZhcmlhYmxlczoocmVzcHVlc3Rhc1JhaXo6UmVzcHVlc3Rhc1JhaXosZm9yUGs6Rm9yUGspPT52b2lkKXtcclxuICAgIGVzcGVjaWFsZXMuY2FsY3VsYXJWYXJpYWJsZXMgPSBjYWxjdWxhclZhcmlhYmxlc1xyXG59XHJcblxyXG50eXBlIERhdG9zQnlQYXNzID0gRGF0b3NCeVBhc3NQZXJzaXN0aWJsZXMgJiB7XHJcbiAgICBmZWVkYmFja1Jvd1ZhbGlkYXRvcjp7ICAvLyBubyBzZSBwZXJzaXN0ZVxyXG4gICAgICAgIFtmb3JtdWxhcmlvIGluIFBsYWluRm9yUGtdOkZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+IC8vIHJlc3VsdGFkbyBkZWwgcm93VmFsaWRhdG9yIHBhcmEgZXN0YWRvLmZvclBrXHJcbiAgICB9XHJcbiAgICBkaXJ0eTpib29sZWFuXHJcbn07XHJcblxyXG52YXIgZGF0b3NCeVBhc3MgPSB7fSBhcyBEYXRvc0J5UGFzc1xyXG5cclxuLy9AdHMtaWdub3JlIGFycmFuY2EgZW4gYmxhbmNvXHJcbnZhciBlc3RydWN0dXJhOkVzdHJ1Y3R1cmEgPSBudWxsIGFzIEVzdHJ1Y3R1cmE7XHJcblxyXG5sZXQgcGVyc2lzdGlyRGF0b3NCeVBhc3NJbnRlcm5vOihkYnBwOkRhdG9zQnlQYXNzUGVyc2lzdGlibGVzKT0+UHJvbWlzZTxhbnk+ID0gKCk9PntcclxuICAgIHRocm93IG5ldyBFcnJvcigncGVyc2lzdGlyRGF0b3NCeVBhc3MgU0lOIERFRklOSVInKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0UGVyc2lzdGlyRGF0b3NCeVBhc3MocGVyc2lzdGlyRGF0b3NCeVBhc3NGdW46dHlwZW9mIHBlcnNpc3RpckRhdG9zQnlQYXNzKXtcclxuICAgIHBlcnNpc3RpckRhdG9zQnlQYXNzSW50ZXJubyA9IHBlcnNpc3RpckRhdG9zQnlQYXNzRnVuO1xyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYnBwOkRhdG9zQnlQYXNzUGVyc2lzdGlibGVzKXtcclxuICAgIGF3YWl0IHBlcnNpc3RpckRhdG9zQnlQYXNzSW50ZXJubyhkYnBwKTtcclxuICAgIGRhdG9zQnlQYXNzLmRpcnR5ID0gZmFsc2VcclxuICAgIHJlZnJlc2Nhck1hcmNhRGlydHkoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEVuY29sYXJCYWNrdXAoXHJcbiAgICBlbmNvbGFyQmFja3VwRnVuOih0b2tlbjpzdHJpbmd8dW5kZWZpbmVkLCBmb3JQa1JhaXo6Rm9yUGtSYWl6LCByZXNwdWVzdGFzUmFpejpSZXNwdWVzdGFzKT0+dm9pZFxyXG4pe1xyXG4gICAgZW5jb2xhckJhY2t1cCA9IGVuY29sYXJCYWNrdXBGdW5cclxufVxyXG5cclxubGV0IGVuY29sYXJCYWNrdXA6KHRva2VuOnN0cmluZ3x1bmRlZmluZWQsIGZvclBrUmFpejpGb3JQa1JhaXosIHJlc3B1ZXN0YXNSYWl6OlJlc3B1ZXN0YXMpPT52b2lkID0gKCk9PntcclxuICAgIHRocm93IG5ldyBFcnJvcihcIlNJTiBFU1BFQ0lGSUNBUiBlbmNvbGFyQmFja3VwXCIpXHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgaW50ZW50YXJCYWNrdXAgPSAoZm9yUGs6Rm9yUGspPT57XHJcbiAgICB2YXIge3Jlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXp9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrLCB0cnVlKVxyXG4gICAgdmFyIHRva2VuID0gZGF0b3NCeVBhc3MudG9rZW47XHJcbiAgICBpZih0b2tlbil7XHJcbiAgICAgICAgZW5jb2xhckJhY2t1cCh0b2tlbiwgZm9yUGtSYWl6LCByZXNwdWVzdGFzUmFpeilcclxuICAgIH1lbHNle1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwibm8gaGF5IHRva2VuLCBubyBzZSBwdWRvIGhhY2VyIGVsIGJhY2t1cFwiKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0RXN0cnVjdHVyYShlc3RydWN0dXJhQUNhcmdhcjpFc3RydWN0dXJhKXtcclxuICAgIGVzdHJ1Y3R1cmEgPSBlc3RydWN0dXJhQUNhcmdhcjtcclxuICAgIGRlZk9wZXJhdGl2by5VQXByaW5jaXBhbCA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKHVhPT4hIXVhLnByaW5jaXBhbCk/LnVuaWRhZF9hbmFsaXNpcyFcclxuICAgIGRlZk9wZXJhdGl2by5kZWZGb3IgPSBsaWtlQXIoZXN0cnVjdHVyYS5mb3JtdWxhcmlvcykubWFwKGY9Pih7aGVybWFubzogZi5jYXNpbGxlcm9zLmhlcm1hbm99KSkucGxhaW4oKVxyXG4gICAgZGVmT3BlcmF0aXZvLmRlZlVBID0gbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLm1hcCgodWFEZWYsIHVhKT0+KHtcclxuICAgICAgICBwazp1YURlZi5wa19hZ3JlZ2FkYSBhcyBJZFZhcmlhYmxlLCBcclxuICAgICAgICBpbmNsdWlkYXM6IGxpa2VBcih1YURlZi5oaWphcykua2V5cygpLFxyXG4gICAgICAgIGlkc0ZvcjogbGlrZUFyKGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3MpLmZpbHRlcihmPT5mLmNhc2lsbGVyb3MudW5pZGFkX2FuYWxpc2lzID09IHVhKS5rZXlzKClcclxuICAgIH0pKS5wbGFpbigpXHJcbiAgICByZXR1cm4gZXN0cnVjdHVyYTsgXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXREYXRvc0J5UGFzcyhkYnBwOkRhdG9zQnlQYXNzUGVyc2lzdGlibGVzICYge2RpcnR5Pzpib29sZWFufSl7XHJcbiAgICBkYXRvc0J5UGFzcyA9IHtcclxuICAgICAgICBkaXJ0eTpmYWxzZSxcclxuICAgICAgICAuLi5kYnBwLFxyXG4gICAgICAgIGZlZWRiYWNrUm93VmFsaWRhdG9yOnt9IGFzIERhdG9zQnlQYXNzW1wiZmVlZGJhY2tSb3dWYWxpZGF0b3JcIl1cclxuICAgIH1cclxuICAgIGNhbGN1bGFyRmVlZGJhY2tIb2phRGVSdXRhKCk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgZ2V0RGF0b3NCeVBhc3MgPSAoKT0+IGRhdG9zQnlQYXNzXHJcblxyXG5mdW5jdGlvbiBvYmpldG9WYWNpbyhvOm9iamVjdCl7XHJcbiAgICBmb3IodmFyIGsgaW4gbyl7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGZWVkYmFja1Jvd1ZhbGlkYXRvcigpe1xyXG4gICAgaWYoIWRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yIHx8IG9iamV0b1ZhY2lvKGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yKSl7XHJcbiAgICAgICAgY2FsY3VsYXJGZWVkYmFja0hvamFEZVJ1dGEoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERpcnR5KCl7XHJcbiAgICByZXR1cm4gZGF0b3NCeVBhc3MuZGlydHlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEVzdHJ1Y3R1cmEoKXtcclxuICAgIHJldHVybiBlc3RydWN0dXJhO1xyXG59XHJcblxyXG50eXBlIEVsZW1lbnRvc1JlZ2lzdHJhYmxlcyA9IEhUTUxEaXZFbGVtZW50fEhUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnQ7XHJcblxyXG50eXBlIERpcmVjdEZ1bmN0aW9uPFQsIFJlc3VsdD4gPSAocmVzcHVlc3Rhc0F1bWVudGFkYXM6UmVzcHVlc3RhcywgZmVlZGJhY2tGb3JtOiBGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSxWYWxvcixJZEZpbj4sIGVsZW1lbnRvOlQsXHJcbiAgICBmZWVkYmFja0FsbDp7XHJcbiAgICAgICAgW2Zvcm11bGFyaW8gaW4gUGxhaW5Gb3JQa106Rm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsVmFsb3IsSWRGaW4+IC8vIHJlc3VsdGFkbyBkZWwgcm93VmFsaWRhdG9yIHBhcmEgZXN0YWRvLmZvclBrXHJcbiAgICB9LFxyXG4gICAgZXN0cnVjdHVyYTpFc3RydWN0dXJhXHJcbikgPT4gUmVzdWx0XHJcblxyXG50eXBlIFJlZ2lzdHJvRWxlbWVudG88VCBleHRlbmRzIEVsZW1lbnRvc1JlZ2lzdHJhYmxlcz4gPSB7XHJcbiAgICBpZDogc3RyaW5nLCBcclxuICAgIGZ1bjogRGlyZWN0RnVuY3Rpb248VCwgYW55PlxyXG59ICYgKHtcclxuICAgIHByb3A6a2V5b2YgVFxyXG4gICAgZnVuOiBEaXJlY3RGdW5jdGlvbjxULCBUW2tleW9mIFRdPlxyXG59fHtcclxuICAgIGF0dHI6c3RyaW5nXHJcbiAgICBmdW46IERpcmVjdEZ1bmN0aW9uPFQsIHN0cmluZz5cclxufXx7XHJcbiAgICBzdHlsZTprZXlvZiBDU1NTdHlsZURlY2xhcmF0aW9uXHJcbiAgICBmdW46IERpcmVjdEZ1bmN0aW9uPFQsIHN0cmluZz5cclxufXx7XHJcbiAgICBkaXJlY3Q6dHJ1ZVxyXG4gICAgZnVuOiBEaXJlY3RGdW5jdGlvbjxULCB2b2lkPlxyXG59KVxyXG5cclxudHlwZSBSZWdpc3Ryb0VsZW1lbnRvczxUIGV4dGVuZHMgRWxlbWVudG9zUmVnaXN0cmFibGVzPiA9IHsgW2lkOnN0cmluZ106IFJlZ2lzdHJvRWxlbWVudG88VD4gJiB7ZWxlbWVudG8/OlR9IH07XHJcblxyXG52YXIgcmVnaXN0cm9FbGVtZW50b3NHbG9iYWwgPSB7fSBhcyBSZWdpc3Ryb0VsZW1lbnRvczxFbGVtZW50b3NSZWdpc3RyYWJsZXM+O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdHJhckVsZW1lbnRvPFQgZXh0ZW5kcyBFbGVtZW50b3NSZWdpc3RyYWJsZXM+KGRlZjpSZWdpc3Ryb0VsZW1lbnRvPFQ+KXtcclxuICAgIC8vIEB0cy1pZ25vcmUgU8OtLCBwb2Ryw61hIHNlciBxdWUgbG9zIHRpcG9zIGRlIFQgc2VhbiBkaXN0aW50b3MsIHBlcm8gdmFuIGEgc2VyIGNvaGVyZW50ZXNcclxuICAgIHZhciByZWdpc3Ryb0VsZW1lbnRvczpSZWdpc3Ryb0VsZW1lbnRvczxUPiA9IHJlZ2lzdHJvRWxlbWVudG9zR2xvYmFsO1xyXG4gICAgcmVnaXN0cm9FbGVtZW50b3NbZGVmLmlkXSA9IGRlZjtcclxufVxyXG5cclxudHlwZSBSZXNwdWVzdGFzRm9yUGtDb211biA9IHtyZXNwdWVzdGFzOlJlc3B1ZXN0YXMsIHJlc3B1ZXN0YXNSYWl6OlJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXo6Rm9yUGtSYWl6LCB1bmlkYWRBbmFsaXNpczpVbmlkYWRBbmFsaXNpc31cclxuXHJcbmZ1bmN0aW9uIHJlc3B1ZXN0YXNGb3JQayhmb3JQazpGb3JQayk6UmVzcHVlc3Rhc0ZvclBrQ29tdW5cclxuZnVuY3Rpb24gcmVzcHVlc3Rhc0ZvclBrKGZvclBrOkZvclBrLCBjb25BdW1lbnRhZGFzOnRydWUsIGFncmVnYXJTaUZhbHRhPzpib29sZWFuKTpSZXNwdWVzdGFzRm9yUGtDb211biAmIHtyZXNwdWVzdGFzQXVtZW50YWRhczpSZXNwdWVzdGFzfVxyXG5mdW5jdGlvbiByZXNwdWVzdGFzRm9yUGsoZm9yUGs6Rm9yUGssIGNvbkF1bWVudGFkYXM/OmJvb2xlYW4sIGFncmVnYXJTaUZhbHRhPzpib29sZWFuKTpSZXNwdWVzdGFzRm9yUGtDb211biAmIHtyZXNwdWVzdGFzQXVtZW50YWRhcz86UmVzcHVlc3Rhc30ge1xyXG4gICAgdmFyIHJlc3B1ZXN0YXNBdW1lbnRhZGFzID0ge30gYXMgUmVzcHVlc3RhcztcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbG8gcXVlIHNvYnJhciBkZSByZXNwdWVzdGFzIG5vIG1lIGltcG9ydGEuLi5cclxuICAgIHZhciByZXNwdWVzdGFzID0gZGF0b3NCeVBhc3MucmVzcHVlc3RhcyBhcyBSZXNwdWVzdGFzO1xyXG4gICAgdmFyIHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpejsgXHJcbiAgICB2YXIgZm9yUGtSYWl6OiBGb3JQazsgXHJcbiAgICB2YXIgdW5pZGFkX2FuYWxpc2lzOklkVW5pZGFkQW5hbGlzaXN8dW5kZWZpbmVkID0gZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1tmb3JQay5mb3JtdWxhcmlvXS5jYXNpbGxlcm9zLnVuaWRhZF9hbmFsaXNpc1xyXG4gICAgdmFyIGZvclBrQXBpbGFkYSA9IGZvclBrO1xyXG4gICAgdmFyIHBpbGE6W3VuaWRhZF9hbmFsaXNpczpJZFVuaWRhZEFuYWxpc2lzLCB1YURlZjpVbmlkYWRBbmFsaXNpcywgZm9yUGs6Rm9yUGtdW10gPSBbXTtcclxuICAgIHdoaWxlKHVuaWRhZF9hbmFsaXNpcyl7XHJcbiAgICAgICAgdmFyIHVhRGVmOlVuaWRhZEFuYWxpc2lzID0gZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpc1t1bmlkYWRfYW5hbGlzaXNdO1xyXG4gICAgICAgIHBpbGEucHVzaChbdW5pZGFkX2FuYWxpc2lzLCB1YURlZiwgZm9yUGtBcGlsYWRhXSk7XHJcbiAgICAgICAgZm9yUGtBcGlsYWRhPXsuLi5mb3JQa0FwaWxhZGF9O1xyXG4gICAgICAgIGRlbGV0ZSBmb3JQa0FwaWxhZGFbdWFEZWYucGtfYWdyZWdhZGFdXHJcbiAgICAgICAgdW5pZGFkX2FuYWxpc2lzPXVhRGVmLnBhZHJlXHJcbiAgICB9XHJcbiAgICB3aGlsZShwaWxhLmxlbmd0aCl7XHJcbiAgICAgICAgW3VuaWRhZF9hbmFsaXNpcywgdWFEZWYsIGZvclBrQXBpbGFkYV0gPSBwaWxhLnBvcCgpIVxyXG4gICAgICAgIHZhciB2YWxvclBrT1Bvc2ljaW9uID0gZm9yUGtBcGlsYWRhW3VhRGVmLnBrX2FncmVnYWRhXTtcclxuICAgICAgICBpZih2YWxvclBrT1Bvc2ljaW9uID09IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZmFsdGEgdW4gdmFsb3IgcGFyYSAke0pTT04uc3RyaW5naWZ5KHVhRGVmLnBrX2FncmVnYWRhKX1gKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihyZXNwdWVzdGFzW3VuaWRhZF9hbmFsaXNpc10gPT0gbnVsbCl7XHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNbdW5pZGFkX2FuYWxpc2lzXSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmVzcHVlc3Rhc0FudGVyaW9yPXJlc3B1ZXN0YXM7XHJcbiAgICAgICAgbGV0IHBvc2ljaW9uID0gcmVzcHVlc3Rhc1t1bmlkYWRfYW5hbGlzaXNdIGluc3RhbmNlb2YgQXJyYXk/dmFsb3JQa09Qb3NpY2lvbiAtIDE6dmFsb3JQa09Qb3NpY2lvblxyXG4gICAgICAgIHJlc3B1ZXN0YXMgPSByZXNwdWVzdGFzW3VuaWRhZF9hbmFsaXNpc11bcG9zaWNpb25dO1xyXG4gICAgICAgIGlmKHJlc3B1ZXN0YXMgPT0gbnVsbCl7XHJcbiAgICAgICAgICAgIGlmKGFncmVnYXJTaUZhbHRhKXtcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXMgPSB7fSBhcyBSZXNwdWVzdGFzXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzQW50ZXJpb3JbdW5pZGFkX2FuYWxpc2lzXVtwb3NpY2lvbl0gPSByZXNwdWVzdGFzXHJcbiAgICAgICAgICAgICAgICBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYXRvc0J5UGFzcyk7IC8vIE9KTyBBU1lOQyBERVNDT05UUk9MQURBXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBleGlzdGUgZWwgZWxlbWVudG8gJyR7cG9zaWNpb259JyBlbiBsYSB1bmlkYWRfYW5hbGlzaXMgJyR7dW5pZGFkX2FuYWxpc2lzfSdgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3JQa1JhaXogfHw9IGZvclBrQXBpbGFkYTtcclxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFPDqSBxdWUgZXMgcmHDrXogcG9yIGPDs21vIGVzdG95IHJldm9sdmllbmRvIGxhIHBpbGFcclxuICAgICAgICByZXNwdWVzdGFzUmFpeiB8fD0gcmVzcHVlc3RhcztcclxuICAgICAgICBpZihjb25BdW1lbnRhZGFzKXtcclxuICAgICAgICAgICAgcmVzcHVlc3Rhc0F1bWVudGFkYXMgPSB7Li4ucmVzcHVlc3Rhc0F1bWVudGFkYXMsIC4uLnJlc3B1ZXN0YXMsIFt1YURlZi5wa19hZ3JlZ2FkYV06dmFsb3JQa09Qb3NpY2lvbn1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHJlc3B1ZXN0YXMsIHJlc3B1ZXN0YXNBdW1lbnRhZGFzLCBcclxuICAgICAgICAvLyBAdHMtaWdub3JlIFPDqSBxdWUgbGEgcGlsYSB0aWVuZSBhbCBtZW5vcyB1biBlbGVtZW50byBwb3IgbG8gdGFudG8gZXN0byBlc3TDoSBsbGVubyBzZWd1cm8uIFxyXG4gICAgICAgIHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXosIHVuaWRhZEFuYWxpc2lzOiB1YURlZlxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdm9sY2Fkb0luaWNpYWxFbGVtZW50b3NSZWdpc3RyYWRvcyhmb3JQa1JhaXo6Rm9yUGtSYWl6KXtcclxuICAgIHZhciB7cmVzcHVlc3Rhc0F1bWVudGFkYXN9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrUmFpeiwgdHJ1ZSlcclxuICAgIHZhciByZWdpc3Ryb0VsZW1lbnRvcyA9IHJlZ2lzdHJvRWxlbWVudG9zR2xvYmFsO1xyXG4gICAgdmFyIHBsYWluRm9yUGsgPSB0b1BsYWluRm9yUGsoZm9yUGtSYWl6KVxyXG4gICAgdmFyIHJvd1ZhbGlkYXRvciA9ICBkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvcltwbGFpbkZvclBrXTtcclxuICAgIGZvcih2YXIgaWQgaW4gcmVnaXN0cm9FbGVtZW50b3Mpe1xyXG4gICAgICAgIHZhciBkZWYgPSByZWdpc3Ryb0VsZW1lbnRvc1tpZF07XHJcbiAgICAgICAgaWYoZGVmLmVsZW1lbnRvKXtcclxuICAgICAgICAgICAgaWYoIWRvY3VtZW50LmJvZHkuY29udGFpbnMoZGVmLmVsZW1lbnRvKSl7XHJcbiAgICAgICAgICAgICAgICBkZWYuZWxlbWVudG8gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIWRlZi5lbGVtZW50byl7XHJcbiAgICAgICAgICAgIGRlZi5lbGVtZW50byA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRlZi5pZCkgYXMgRWxlbWVudG9zUmVnaXN0cmFibGVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZighZGVmLmVsZW1lbnRvKXtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0JVU0NBTkRPIGVsIGVsZW1lbnRvIHJlZ2lzdHJhZG8gJyxpZCwnbm8gZXN0w6EgZW4gZWwgRE9NJylcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB2YWx1ZSA9IGRlZi5mdW4ocmVzcHVlc3Rhc0F1bWVudGFkYXMsIHJvd1ZhbGlkYXRvciwgZGVmLmVsZW1lbnRvLCBkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvciwgZXN0cnVjdHVyYSk7XHJcbiAgICAgICAgaWYoJ3Byb3AnIGluIGRlZil7XHJcbiAgICAgICAgICAgIHNldFZhbG9yRGlzdGludG8oZGVmLmVsZW1lbnRvLCBkZWYucHJvcCwgdmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCdhdHRyJyBpbiBkZWYpe1xyXG4gICAgICAgICAgICBzZXRBdHRyRGlzdGludG8oZGVmLmVsZW1lbnRvLCBkZWYuYXR0ciwgdmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCdzdHlsZScgaW4gZGVmKXtcclxuICAgICAgICAgICAgc2V0VmFsb3JEaXN0aW50byhkZWYuZWxlbWVudG8uc3R5bGUsIGRlZi5zdHlsZSwgdmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYocm93VmFsaWRhdG9yLmFjdHVhbCl7XHJcbiAgICAgICAgdmFyIHt0b3AsIGJvdHRvbX0gPSBjYWxjdWxhckVsZW1lbnRvRW5mb2NhZG8ocm93VmFsaWRhdG9yLmFjdHVhbCk7XHJcbiAgICAgICAgaWYodG9wICE9IG51bGwgJiYgYm90dG9tICE9bnVsbCl7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZhYi1hY3Rpdm8tYXJyaWJhJykuZWxUb3BWaXNpYmlsaXphciA9IHRvcDtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmFiLWFjdGl2by1hYmFqbycpLmVsQm90dG9tVmlzaWJpbGl6YXIgPSBib3R0b207XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXJFbGVtZW50b0VuZm9jYWRvKGlkVmFyaWFibGU6SWRWYXJpYWJsZXxJZEZpbil7XHJcbiAgICB2YXIgZWxlbWVudG9WYXJpYWJsZUFFbmZvY2FyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWRWYXJpYWJsZT09J2Zpbic/YGJvdG9uLXZvbHZlci0yYDpgdmFyLSR7aWRWYXJpYWJsZX1gKVxyXG4gICAgICAgIHx8ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHNlY2Npb24tYm90b24tZm9ybXVsYXJpby0ke2lkVmFyaWFibGV9YCk7XHJcbiAgICB2YXIgZWxlbWVudG8gPSBlbGVtZW50b1ZhcmlhYmxlQUVuZm9jYXI7XHJcbiAgICB2YXIgTUFSR0VOX1NDUk9MTCA9IDY0O1xyXG4gICAgdmFyIGFsdG9QYW50YWxsYSA9IHdpbmRvdy5pbm5lckhlaWdodCowLjcgLSBNQVJHRU5fU0NST0xMO1xyXG4gICAgdmFyIGVsZW1lbnRvRW50ZXJvOkhUTUxFbGVtZW50fG51bGwgPSBlbGVtZW50bzsgLy8gZXMgZWwgZWxlbWVudG8gcXVlIHZhIGEgZW50YXIgZW50ZXJvIGVuIHBhbnRhbGxhLCBkZWZpbmUgZWwgYm90dG9tXHJcbiAgICB2YXIgcmVjdEVsZW1lbnRvRW50ZXJvOlJldHVyblR5cGU8dHlwZW9mIG15T3duLmdldFJlY3Q+fG51bGwgPSBudWxsO1xyXG4gICAgdmFyIGVsZW1lbnRvU3VwZXJpb3I6SFRNTEVsZW1lbnR8bnVsbCA9IG51bGw7IC8vIGVzIGVsIGVsZW1lbnRvIHF1ZSB2YSBhIG1vc3RyYXJzZSBkZXNkZSBhcnJpYmEgYXVucXVlIG5vIGVudHJlIGVudGVybywgZGVmaW5lIGVsIHRvcFxyXG4gICAgdmFyIHJlY3RFbGVtZW50b1N1cGVyaW9yOlJldHVyblR5cGU8dHlwZW9mIG15T3duLmdldFJlY3Q+fG51bGwgPSBudWxsO1xyXG4gICAgd2hpbGUoZWxlbWVudG8gIT0gbnVsbCl7XHJcbiAgICAgICAgaWYoZWxlbWVudG8uY2xhc3NMaXN0LmNvbnRhaW5zKCd2YXJpYWJsZScpIFxyXG4gICAgICAgIHx8IGVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygnbXVsdGlwbGUnKSBcclxuICAgICAgICB8fCBlbGVtZW50by5jbGFzc0xpc3QuY29udGFpbnMoJ3ByZWd1bnRhJykgXHJcbiAgICAgICAgfHwgZWxlbWVudG8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjb25qdW50b3ByZWd1bnRhcycpIFxyXG4gICAgICAgIHx8IGVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygnc2VjY2lvbi1ib3Rvbi1mb3JtdWxhcmlvJykgXHJcbiAgICAgICAgfHwgZWxlbWVudG8uY2xhc3NMaXN0LmNvbnRhaW5zKCdib3RvbmZvcm11bGFyaW8nKSBcclxuICAgICAgICApe1xyXG4gICAgICAgICAgICBpZihlbGVtZW50b1N1cGVyaW9yID09IG51bGwgJiYgZWxlbWVudG8uY2xpZW50SGVpZ2h0IDwgYWx0b1BhbnRhbGxhKXtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRvRW50ZXJvID0gZWxlbWVudG87XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgaWYocmVjdEVsZW1lbnRvRW50ZXJvID09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRvU3VwZXJpb3IgPSBlbGVtZW50b0VudGVyb1xyXG4gICAgICAgICAgICAgICAgICAgIHJlY3RFbGVtZW50b0VudGVybyA9IG15T3duLmdldFJlY3QoZWxlbWVudG9FbnRlcm8hKVxyXG4gICAgICAgICAgICAgICAgICAgIHJlY3RFbGVtZW50b1N1cGVyaW9yID0gcmVjdEVsZW1lbnRvRW50ZXJvO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIHJlY3QgPSBteU93bi5nZXRSZWN0KGVsZW1lbnRvKTtcclxuICAgICAgICAgICAgICAgIGlmKHJlY3RFbGVtZW50b0VudGVyby50b3AgKyByZWN0RWxlbWVudG9FbnRlcm8uaGVpZ2h0IC0gcmVjdC50b3AgPCBhbHRvUGFudGFsbGEpe1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRvU3VwZXJpb3IgPSBlbGVtZW50bztcclxuICAgICAgICAgICAgICAgICAgICByZWN0RWxlbWVudG9TdXBlcmlvciA9IHJlY3Q7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50byA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudG8gPSBlbGVtZW50bz8ucGFyZW50RWxlbWVudCA/PyBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYoZWxlbWVudG9TdXBlcmlvciA9PSBudWxsKXtcclxuICAgICAgICBlbGVtZW50b1N1cGVyaW9yID0gZWxlbWVudG9FbnRlcm87XHJcbiAgICB9XHJcbiAgICB2YXIgcmVzdWx0OntcclxuICAgICAgICBlbGVtZW50b0lucHV0VmFyaWFibGU/OkhUTUxFbGVtZW50fG51bGxcclxuICAgICAgICB0b3A/Om51bWJlcnxudWxsXHJcbiAgICAgICAgYm90dG9tPzpudW1iZXJ8bnVsbFxyXG4gICAgICAgIGVuZm9jYWRvPzpib29sZWFufG51bGxcclxuICAgICAgICBkZXNlbmZvcXVlPzpzdHJpbmd8bnVsbFxyXG4gICAgfSA9IHt9O1xyXG4gICAgaWYoZWxlbWVudG9FbnRlcm8gIT0gbnVsbCl7XHJcbiAgICAgICAgaWYocmVjdEVsZW1lbnRvRW50ZXJvID09IG51bGwpe1xyXG4gICAgICAgICAgICByZWN0RWxlbWVudG9FbnRlcm8gPSBteU93bi5nZXRSZWN0KGVsZW1lbnRvRW50ZXJvKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHQuZWxlbWVudG9JbnB1dFZhcmlhYmxlID0gZWxlbWVudG9WYXJpYWJsZUFFbmZvY2FyO1xyXG4gICAgICAgIHZhciB0b3AgPSAocmVjdEVsZW1lbnRvU3VwZXJpb3I/P3JlY3RFbGVtZW50b0VudGVybykudG9wIC0gTUFSR0VOX1NDUk9MTDtcclxuICAgICAgICByZXN1bHQudG9wID0gdG9wO1xyXG4gICAgICAgIHJlc3VsdC5ib3R0b20gPSByZWN0RWxlbWVudG9FbnRlcm8udG9wK3JlY3RFbGVtZW50b0VudGVyby5oZWlnaHQ7XHJcbiAgICAgICAgaWYodG9wPGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3Ape1xyXG4gICAgICAgICAgICByZXN1bHQuZGVzZW5mb3F1ZT0nYXJyaWJhJztcclxuICAgICAgICB9ZWxzZSBpZihyZWN0RWxlbWVudG9FbnRlcm8udG9wK3JlY3RFbGVtZW50b0VudGVyby5oZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wICsgYWx0b1BhbnRhbGxhKXtcclxuICAgICAgICAgICAgcmVzdWx0LmRlc2VuZm9xdWU9J2FiYWpvJztcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgcmVzdWx0LmVuZm9jYWRvPXRydWVcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0QXR0ckRpc3RpbnRvPE4gZXh0ZW5kcyBzdHJpbmc+KFxyXG4gICAgb2JqZXRvOntzZXRBdHRyaWJ1dGU6KG5hbWU6TiwgdmFsb3I6c3RyaW5nKT0+dm9pZCwgZ2V0QXR0cmlidXRlOihuYW1lOk4pPT5zdHJpbmd8bnVsbH0sXHJcbiAgICBuYW1lOk4sXHJcbiAgICB2YWxvcjpzdHJpbmdcclxuKXtcclxuICAgIGlmKG9iamV0byAmJiBvYmpldG8uZ2V0QXR0cmlidXRlKG5hbWUpICE9IHZhbG9yKXtcclxuICAgICAgICBvYmpldG8uc2V0QXR0cmlidXRlKG5hbWUsIHZhbG9yKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFZhbG9yRGlzdGludG88VCBleHRlbmRzIHt9LCBOIGV4dGVuZHMga2V5b2YgVD4oXHJcbiAgICBvYmpldG86VCxcclxuICAgIG5hbWU6TixcclxuICAgIHZhbG9yOlRbTl1cclxuKXtcclxuICAgIGlmKG9iamV0b1tuYW1lXSAhPSB2YWxvcil7XHJcbiAgICAgICAgb2JqZXRvW25hbWVdID0gdmFsb3I7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGFyVmFyaWFibGVzQm90b25Gb3JtdWxhcmlvKF9mb3JQazpGb3JQayl7XHJcbiAgICBcclxufTtcclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX2lkX3ByZWd1bnRhKF9wYXlsb2FkOntwcmVndW50YTogSWRQcmVndW50YSwgZm9yUGs6IEZvclBrfSwgX2RhdG9zQnlQYXNzOkRhdG9zQnlQYXNzKXtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IE5PX0NBTUJJQVJfX1NPTE9fVFJBRVJfU1RBVFVTID0gU3ltYm9sKCdOT19DQU1CSUFSX1NPTE9fVFJBRVJfU1RBVFVTJylcclxuZXhwb3J0IGNvbnN0IE5PX0NBTUJJQVJfX1ZFUklGSUNBUl9TSV9FU19ORUNFU0FSSU8gPSBTeW1ib2woJ05PX0NBTUJJQVJfVkVSSUZJQ0FSX1NJX0VTX05FQ0VTQVJJTycpXHJcblxyXG5mdW5jdGlvbiByZWZyZXNjYXJNYXJjYURpcnR5KCl7XHJcbiAgICB2YXIgYm90b25HcmFiYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNhdmUtYnV0dG9uXCIpIGFzIEhUTUxCdXR0b25FbGVtZW50O1xyXG4gICAgaWYoYm90b25HcmFiYXIpe1xyXG4gICAgICAgIGlmKGJvdG9uR3JhYmFyLmRpc2FibGVkICE9PSAhZGF0b3NCeVBhc3MuZGlydHkpe1xyXG4gICAgICAgICAgICBib3RvbkdyYWJhci5kaXNhYmxlZCA9ICFkYXRvc0J5UGFzcy5kaXJ0eTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25fcmVnaXN0cmFyX3Jlc3B1ZXN0YShwYXlsb2FkOntcclxuICAgIGZvclBrOkZvclBrLCBcclxuICAgIHZhcmlhYmxlOklkVmFyaWFibGV8dHlwZW9mIE5PX0NBTUJJQVJfX1NPTE9fVFJBRVJfU1RBVFVTLCBcclxuICAgIHJlc3B1ZXN0YTpWYWxvcnx0eXBlb2YgTk9fQ0FNQklBUl9fVkVSSUZJQ0FSX1NJX0VTX05FQ0VTQVJJT1xyXG59LCBfZGF0b3NCeVBhc3M6RGF0b3NCeVBhc3Mpe1xyXG4gICAgbGV0IHRva2VuID0gJ0FWRVJJR1VBUiBUT0RPJ1xyXG4gICAgbGV0IHsgZm9yUGssIHJlc3B1ZXN0YSwgdmFyaWFibGUgfSA9IHBheWxvYWQ7XHJcbiAgICB2YXIge3Jlc3B1ZXN0YXMsIHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXp9ICA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQayk7XHJcbiAgICB2YXIgdW5pZGFkX2FuYWxpc2lzID0gZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1tmb3JQay5mb3JtdWxhcmlvXTtcclxuICAgIHZhciByZWNlbnRNb2RpZmllZCA9IGZhbHNlO1xyXG4gICAgdmFyIHZhbG9yQW50ZXJpb3IgPSB2YXJpYWJsZSAhPSBOT19DQU1CSUFSX19TT0xPX1RSQUVSX1NUQVRVUyA/IHJlc3B1ZXN0YXNbdmFyaWFibGVdIDogbnVsbDtcclxuICAgIGlmKHJlc3B1ZXN0YSAhPT0gTk9fQ0FNQklBUl9fVkVSSUZJQ0FSX1NJX0VTX05FQ0VTQVJJTyAmJiB2YXJpYWJsZSAhPSBOT19DQU1CSUFSX19TT0xPX1RSQUVSX1NUQVRVUyl7XHJcbiAgICAgICAgaWYocmVzcHVlc3RhID09PSAnJyl7XHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YSA9IG51bGw7XHJcbiAgICAgICAgfWVsc2UgaWYoZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1tmb3JQay5mb3JtdWxhcmlvXS5lc3RydWN0dXJhUm93VmFsaWRhdG9yLnZhcmlhYmxlc1t2YXJpYWJsZV0udGlwbz09J251bWVybycpe1xyXG4gICAgICAgICAgICBpZihyZXNwdWVzdGEgIT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGEgPSBOdW1iZXIocmVzcHVlc3RhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzaSBlcyB1biBmYWxzeSAoMCA9PSBmYWxzZSkgdGVuZ28gcXVlIGNvbXBhcmFyIGNvbiAhPT1cclxuICAgICAgICByZWNlbnRNb2RpZmllZCA9IHJlc3B1ZXN0YSA/IHZhbG9yQW50ZXJpb3IgIT0gcmVzcHVlc3RhIDogdmFsb3JBbnRlcmlvciAhPT0gcmVzcHVlc3RhXHJcbiAgICAgICAgaWYocmVjZW50TW9kaWZpZWQpe1xyXG4gICAgICAgICAgICByZXNwdWVzdGFzW3ZhcmlhYmxlXSA9IHJlc3B1ZXN0YSA/PyBudWxsOyAvLyBjYW1iaW8gdW5kZWZpbmVkIHBvciBudWxsXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgdmFyIGZlZWRiYWNrUm93ID0gZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3JbdG9QbGFpbkZvclBrKGZvclBrKV07XHJcbiAgICB2YXIgc2lndWllbnRlVmFyaWFibGU6SWRWYXJpYWJsZXxJZEZpbnxudWxsfHVuZGVmaW5lZDtcclxuICAgIGlmKHZhcmlhYmxlICE9IE5PX0NBTUJJQVJfX1NPTE9fVFJBRVJfU1RBVFVTICYmIChyZWNlbnRNb2RpZmllZCB8fCBOT19DQU1CSUFSX19WRVJJRklDQVJfU0lfRVNfTkVDRVNBUklPICYmIGZlZWRiYWNrUm93LmF1dG9JbmdyZXNhZGFzPy5bdmFyaWFibGVdKSl7XHJcbiAgICAgICAgdmFyaWFibGVzQ2FsY3VsYWRhcyhyZXNwdWVzdGFzUmFpeiwgZm9yUGspO1xyXG4gICAgICAgIGlmKGVzdHJ1Y3R1cmEuY29uZmlnU29ydGVvICYmICFkYXRvc0J5UGFzcz8uc29sb0xlY3R1cmEpe1xyXG4gICAgICAgICAgICB2ZXJpZmljYXJTb3J0ZW8oe1xyXG4gICAgICAgICAgICAgICAgY29uZmlndXJhY2lvblNvcnRlbzogZXN0cnVjdHVyYS5jb25maWdTb3J0ZW9bZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYShmb3JQay52aXZpZW5kYSEpXSwgXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzLFxyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1JhaXosXHJcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUFjdHVhbDogdmFyaWFibGUsIFxyXG4gICAgICAgICAgICAgICAgZm9yUGs6IGZvclBrXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdG9zQnlQYXNzLmRpcnR5ID0gZGF0b3NCeVBhc3MuZGlydHkgfHwgcmVjZW50TW9kaWZpZWQ7XHJcbiAgICAgICAgcmVzcHVlc3Rhc1JhaXouJGRpcnR5ID0gcmVzcHVlc3Rhc1JhaXouJGRpcnR5IHx8IHJlY2VudE1vZGlmaWVkO1xyXG4gICAgICAgIHJlZnJlc2Nhck1hcmNhRGlydHkoKTtcclxuICAgICAgICBjYWxjdWxhckZlZWRiYWNrKHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXosIHthdXRvSW5ncmVzbzogdHJ1ZX0pO1xyXG4gICAgICAgIGZlZWRiYWNrUm93ID0gZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3JbdG9QbGFpbkZvclBrKGZvclBrKV07XHJcbiAgICAgICAgY2FsY3VsYXJWYXJpYWJsZXNCb3RvbkZvcm11bGFyaW8oZm9yUGspO1xyXG4gICAgICAgIHZvbGNhZG9JbmljaWFsRWxlbWVudG9zUmVnaXN0cmFkb3MoZm9yUGspO1xyXG4gICAgICAgIHBlcnNpc3RpckRhdG9zQnlQYXNzKGRhdG9zQnlQYXNzKTsgLy8gT0pPIEFTWU5DIERFU0NPTlRST0xBREFcclxuICAgICAgICBzaWd1aWVudGVWYXJpYWJsZSA9IHZhcmlhYmxlO1xyXG4gICAgICAgIGRve1xyXG4gICAgICAgICAgICBzaWd1aWVudGVWYXJpYWJsZSA9IGZlZWRiYWNrUm93LmZlZWRiYWNrW3NpZ3VpZW50ZVZhcmlhYmxlXS5zaWd1aWVudGU7XHJcbiAgICAgICAgfXdoaWxlKHZhbG9yQW50ZXJpb3IgPT0gbnVsbCAmJiByZWNlbnRNb2RpZmllZCAmJiBzaWd1aWVudGVWYXJpYWJsZSAhPSBudWxsICYmIHNpZ3VpZW50ZVZhcmlhYmxlICE9ICdmaW4nICYmIGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3NbZm9yUGsuZm9ybXVsYXJpb10uZXN0cnVjdHVyYVJvd1ZhbGlkYXRvci52YXJpYWJsZXNbc2lndWllbnRlVmFyaWFibGVdLmZ1bmNpb25BdXRvSW5ncmVzYXIpXHJcbiAgICAgICAgaWYoc2lndWllbnRlVmFyaWFibGUgPT0gbnVsbCAmJiBmZWVkYmFja1Jvdy5mZWVkYmFja1t2YXJpYWJsZV0uZXN0YWRvID09ICd2YWxpZGEnKXtcclxuICAgICAgICAgICAgc2lndWllbnRlVmFyaWFibGUgPSAnZmluJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge3JlY2VudE1vZGlmaWVkLCBzaWd1aWVudGVWYXJpYWJsZSwgdmFyaWFibGVBY3R1YWw6IGZlZWRiYWNrUm93LmFjdHVhbH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25fcmVnaXN0cmFyX25vdGEocGF5bG9hZDp7Zm9yUGtSYWl6OkZvclBrUmFpeiwgdGFyZWE6SWRUYXJlYSwgbm90YTpzdHJpbmd8bnVsbH0sIF9kYXRvc0J5UGFzczpEYXRvc0J5UGFzcyl7XHJcbiAgICBsZXQgeyBmb3JQa1JhaXosIHRhcmVhLCBub3RhIH0gPSBwYXlsb2FkO1xyXG4gICAgY29uc29sZS5sb2coXCJGQUxUQSAvLyBUT0RPXCIpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25fYWdyZWdhcl92aXNpdGEocGF5bG9hZDp7Zm9yUGtSYWl6OkZvclBrUmFpeiwgb2JzZXJ2YWNpb25lczpzdHJpbmd8bnVsbH0sIF9kYXRvc0J5UGFzczpEYXRvc0J5UGFzcyl7XHJcbiAgICBsZXQgeyBmb3JQa1JhaXosIG9ic2VydmFjaW9uZXMgfSA9IHBheWxvYWQ7XHJcbiAgICAvKlxyXG4gICAgaWYoIWRhdG9zQnlQYXNzLmhvamFEZVJ1dGFbdml2aWVuZGFdLnZpc2l0YXMpe1xyXG4gICAgICAgIGRhdG9zQnlQYXNzLmhvamFEZVJ1dGFbdml2aWVuZGFdLnZpc2l0YXMgPSBbXTtcclxuICAgIH1cclxuICAgIHZhciB2aXNpdGFzID0gZGF0b3NCeVBhc3MuaG9qYURlUnV0YVt2aXZpZW5kYV0udmlzaXRhcztcclxuICAgIHZpc2l0YXMucHVzaCh7XHJcbiAgICAgICAgZmVjaGE6IGRhdGV0aW1lLm5vdygpLnRvWW1kKCksXHJcbiAgICAgICAgaG9yYTogZGF0ZXRpbWUubm93KCkudG9IbSgpLFxyXG4gICAgICAgIGlkcGVyOiBudWxsLCAvLyBUT0RPOiBWRVIgREUgRE9OREUgU0UgU0FDQSBFTCBJRFBFUiBzdGF0ZS5kYXRvcy5pZHBlcixcclxuICAgICAgICBvYnNlcnZhY2lvbmVzOm9ic2VydmFjaW9uZXNcclxuICAgIH0pXHJcbiAgICAqL1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX21vZGlmaWNhcl92aXNpdGEocGF5bG9hZDoge2ZvclBrUmFpejpGb3JQa1JhaXosIGluZGV4Om51bWJlciwgb3BjaW9uOmtleW9mIFZpc2l0YSAsIHZhbG9yOnN0cmluZ3xudWxsfSwgX2RhdG9zQnlQYXNzOkRhdG9zQnlQYXNzKXtcclxuICAgIGxldCB7IGZvclBrUmFpeiwgaW5kZXgsIG9wY2lvbiwgdmFsb3J9ID0gcGF5bG9hZDtcclxuICAgIC8vIHZhciB2aXNpdGFzID0gZGF0b3NCeVBhc3MuaG9qYURlUnV0YVt2aXZpZW5kYV0udmlzaXRhcztcclxuICAgIC8vIHZpc2l0YXNbaW5kZXhdW29wY2lvbl0gPSB2YWxvcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFjY2lvbl9ib3JyYXJfdmlzaXRhKHBheWxvYWQ6IHtmb3JQa1JhaXo6Rm9yUGtSYWl6LCBpbmRleDpudW1iZXJ9LCBfZGF0b3NCeVBhc3M6RGF0b3NCeVBhc3Mpe1xyXG4gICAgbGV0IHsgZm9yUGtSYWl6LCBpbmRleH0gPSBwYXlsb2FkO1xyXG4gICAgLy8gdmFyIHZpc2l0YXMgPSBkYXRvc0J5UGFzcy5ob2phRGVSdXRhW3ZpdmllbmRhXS52aXNpdGFzO1xyXG4gICAgLy8gdmlzaXRhcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX2FncmVnYXJfZm9ybXVsYXJpbyh7Zm9yUGt9OiB7Zm9yUGs6Rm9yUGt9LCBfZGF0b3NCeVBhc3M6RGF0b3NCeVBhc3Mpe1xyXG4gICAgdmFyIHtyZXNwdWVzdGFzLCB1bmlkYWRBbmFsaXNpcywgcmVzcHVlc3Rhc0F1bWVudGFkYXMsIHJlc3B1ZXN0YXNSYWl6fSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQaywgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICB2YXJpYWJsZXNDYWxjdWxhZGFzKHJlc3B1ZXN0YXNSYWl6LCBmb3JQayk7XHJcbiAgICBjYWxjdWxhckZlZWRiYWNrVW5pZGFkQW5hbGlzaXMoZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IsIGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3MsIHJlc3B1ZXN0YXMsIHVuaWRhZEFuYWxpc2lzLnVuaWRhZF9hbmFsaXNpcywgZm9yUGssIHJlc3B1ZXN0YXNBdW1lbnRhZGFzLCBudWxsLCB7fSlcclxuICAgIGNhbGN1bGFyVmFyaWFibGVzQm90b25Gb3JtdWxhcmlvKGZvclBrKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFjY2lvbl9hYnJpcl9mb3JtdWxhcmlvKHtmb3JQa306IHtmb3JQazpGb3JQa30sIF9kYXRvc0J5UGFzczpEYXRvc0J5UGFzcyl7XHJcbiAgICB2YXIge3Jlc3B1ZXN0YXMsIHVuaWRhZEFuYWxpc2lzLCByZXNwdWVzdGFzQXVtZW50YWRhcywgcmVzcHVlc3Rhc1JhaXp9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrLCB0cnVlLCB0cnVlKTtcclxuICAgIHZhcmlhYmxlc0NhbGN1bGFkYXMocmVzcHVlc3Rhc1JhaXosIGZvclBrKTtcclxuICAgIGNhbGN1bGFyRmVlZGJhY2tVbmlkYWRBbmFsaXNpcyhkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvciwgZXN0cnVjdHVyYS5mb3JtdWxhcmlvcywgcmVzcHVlc3RhcywgdW5pZGFkQW5hbGlzaXMudW5pZGFkX2FuYWxpc2lzLCBmb3JQaywgcmVzcHVlc3Rhc0F1bWVudGFkYXMsIG51bGwsIHt9KVxyXG4gICAgY2FsY3VsYXJWYXJpYWJsZXNCb3RvbkZvcm11bGFyaW8oZm9yUGspO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX2JvcnJhcl9mb3JtdWxhcmlvKHtmb3JQaywgZm9yUGtQYWRyZX06IHtmb3JQazpGb3JQaywgZm9yUGtQYWRyZTpGb3JQa30pe1xyXG4gICAgdmFyIHtyZXNwdWVzdGFzLCB1bmlkYWRBbmFsaXNpcywgcmVzcHVlc3Rhc0F1bWVudGFkYXMsIHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXp9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrLCB0cnVlLCB0cnVlKTtcclxuICAgIHZhciB1bmlkYWRfYW5hbGlzaXM6SWRVbmlkYWRBbmFsaXNpc3x1bmRlZmluZWQgPSBlc3RydWN0dXJhLmZvcm11bGFyaW9zW2ZvclBrLmZvcm11bGFyaW9dLmNhc2lsbGVyb3MudW5pZGFkX2FuYWxpc2lzXHJcbiAgICB2YXIgdWFEZWY6VW5pZGFkQW5hbGlzaXMgPSBlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzW3VuaWRhZF9hbmFsaXNpc107XHJcbiAgICB2YXIgaW5kZXggPSBmb3JQa1t1YURlZi5wa19hZ3JlZ2FkYV07XHJcbiAgICByZXNwdWVzdGFzQXVtZW50YWRhc1t1bmlkYWRfYW5hbGlzaXNdLnBvcCgpO1xyXG4gICAgdmFyaWFibGVzQ2FsY3VsYWRhcyhyZXNwdWVzdGFzUmFpeiwgZm9yUGtQYWRyZSk7XHJcbiAgICBkYXRvc0J5UGFzcy5kaXJ0eSA9IGRhdG9zQnlQYXNzLmRpcnR5IHx8IHRydWU7XHJcbiAgICByZXNwdWVzdGFzUmFpei4kZGlydHkgPSByZXNwdWVzdGFzUmFpei4kZGlydHkgfHwgdHJ1ZTtcclxuICAgIHJlZnJlc2Nhck1hcmNhRGlydHkoKTtcclxuICAgIGNhbGN1bGFyRmVlZGJhY2socmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeiwge2F1dG9JbmdyZXNvOiB0cnVlfSk7XHJcbiAgICBjYWxjdWxhclZhcmlhYmxlc0JvdG9uRm9ybXVsYXJpbyhmb3JQa1BhZHJlKTtcclxuICAgIHZvbGNhZG9JbmljaWFsRWxlbWVudG9zUmVnaXN0cmFkb3MoZm9yUGtQYWRyZSk7XHJcbiAgICBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYXRvc0J5UGFzcyk7IC8vIE9KTyBBU1lOQyBERVNDT05UUk9MQURBXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGlzcGF0Y2hCeVBhc3M8VCwgUj4oXHJcbiAgICBmdW46KHBheWxvYWQ6VCwgZGF0b3M6dHlwZW9mIGRhdG9zQnlQYXNzKT0+UixcclxuICAgIHBheWxvYWQ6VFxyXG4pe1xyXG4gICAgcmV0dXJuIGZ1bihwYXlsb2FkLCBkYXRvc0J5UGFzcyk7XHJcbn1cclxuXHJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IHVsdGltYVZhcmlibGVWaXZpZW5kYSA9ICdOT19FU1RBX0RFRklOSURBX0FVTi8vVE9ETycgYXMgSWRWYXJpYWJsZTtcclxuXHJcbmV4cG9ydCBjb25zdCBNQVhDUD0yMDtcclxuXHJcbi8qIFJFRFVDRVJTICovXHJcblxyXG52YXIgcmVlbXBsYXpvc0hhYmlsaXRhcjp7W2tleTpzdHJpbmddOnN0cmluZ309e1xyXG4gICAgZmFsc2U6ICdmYWxzZScsXHJcbiAgICB0cnVlOiAndHJ1ZScsXHJcbiAgICBcIj1cIjogJz09JyxcclxuICAgIFwiPD5cIjogJyE9JyxcclxuICAgIFwiJlwiOiAnJiYnLFxyXG4gICAgXCJ8XCI6ICd8fCcsXHJcbiAgICBcIk9SXCI6ICd8fCcsXHJcbiAgICBcIkFORFwiOiAnJiYnLFxyXG4gICAgXCJvclwiOiAnfHwnLFxyXG4gICAgXCJhbmRcIjogJyYmJyxcclxuICAgIFwibm90XCI6ICchJyxcclxuICAgIFwiTk9UXCI6ICchJyxcclxufTtcclxuXHJcbmNvbnN0IGhlbHBlcnNDYXNpbGxlcm9zPXtcclxuICAgIG51bGwyemVybyhwb3NpYmxlTnVsbDphbnkpe1xyXG4gICAgICAgIGlmKHBvc2libGVOdWxsPT1udWxsKXtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwb3NpYmxlTnVsbDtcclxuICAgIH0sXHJcbiAgICBkaXYwZXJyKG51bWVyYWRvcjpudW1iZXIsIGRlbm9taW5hZG9yOm51bWJlciwgcGs6c3RyaW5nKXtcclxuICAgICAgICBpZihkZW5vbWluYWRvcj09MCl7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIGVuIFwiK3BrK1wiIGRpdmlzaW9uIHBvciBjZXJvIGRlIFwiK251bWVyYWRvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudW1lcmFkb3IvZGVub21pbmFkb3I7XHJcbiAgICB9LFxyXG4gICAgZnVuczp7XHJcbiAgICAgICAgYmxhbmNvKHg6YW55KXtcclxuICAgICAgICAgICAgcmV0dXJuIHghPT0wICYmICF4XHJcbiAgICAgICAgfSxcclxuICAgICAgICBob3koKXtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9kYXkoKS50b0RteSgpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBmZWNoYV92YWxpZGEoeDpzdHJpbmcpe1xyXG4gICAgICAgICAgICB2YXIgZm9ybWF0b192YWxpZG89L14oWzEtOV18MFsxLTldfFsxMl1cXGR8M1swMV0pXFwvKFsxLTldfDBbMS05XXwxWzAxMl0pXFwvMjBcXGRcXGQkLy50ZXN0KHgpXHJcbiAgICAgICAgICAgIHZhciB4RGF0ZTogRGF0ZTtcclxuICAgICAgICAgICAgdmFyIGNvbnZlcnNpb25PazogYm9vbGVhbjtcclxuICAgICAgICAgICAgY29udmVyc2lvbk9rID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGZvcm1hdG9fdmFsaWRvKXtcclxuICAgICAgICAgICAgICAgIGNvbnN0IFtkLCBtLCB5XSA9IHguc3BsaXQoJy8nKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeERhdGUgPSBuZXcgRGF0ZShgJHt5fS8ke219LyR7ZH1gKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uT2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgLy9mYWx0YXJpYSB2YWxpZGFyIHF1ZSBubyBzZWEgdW5hIGZlY2hhIGZ1dHVyYSB5IHF1ZSBzZWEgdW5hIGZlY2hhIGVuIGVsIHJhbmdvIGRlbCBvcGVyYXRpdm9cclxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdG9fdmFsaWRvICYmIGNvbnZlcnNpb25Pa1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaW5mb3JtYWRvKHg6YW55KXtcclxuICAgICAgICAgICAgcmV0dXJuIHghPT11bmRlZmluZWQgJiYgeCE9PW51bGwgJiYgKCEoeCBpbnN0YW5jZW9mIEFycmF5KXx8IHgubGVuZ3RoIT09MCApXHJcbiAgICAgICAgICAgICYmICghKHggaW5zdGFuY2VvZiBPYmplY3QpfHwgT2JqZWN0LmtleXMoeCkubGVuZ3RoICE9PSAwIClcclxuICAgICAgICB9LFxyXG4gICAgICAgIG5zbmMoeDphbnkpe1xyXG4gICAgICAgICAgICByZXR1cm4geCA9PSAtOVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcGFyKHg6bnVtYmVyKXtcclxuICAgICAgICAgICAgcmV0dXJuIHggJSAyPT0wXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvKlxyXG4gICAgICAgIGRibzp7XHJcbiAgICAgICAgICAgIGRhdG9GYW1pbGlhcihlbmN1OnN0cmluZyxob2c6bnVtYmVyLHBlcjpudW1iZXIsIGRhdG86c3RyaW5nKXtcclxuICAgICAgICAgICAgICAgIHZhciB4cGVyc29uYXM9cGVyc29uYXM7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5jdT09ZW5jICYmIGhvZz09aG9nYXIgJiYgaW5mb3JtYWRvKHhwZXJzb25hcykgJiYgcGVyPD0geHBlcnNvbmFzLmxlbmd0aCAmJiBwZXI+PTEgJiYgISF4cGVyc29uYXNbcGVyLTFdW2RhdG9dPyB4cGVyc29uYXNbcGVyLTFdW2RhdG9dOm51bGxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZWRhZGZhbWlsaWFyKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIscGVyOm51bWJlcil7XHJcbiAgICAgICAgICAgICAgICB2YXIgeHBlcnNvbmFzPXBlcnNvbmFzO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdG9GYW1pbGlhcihlbmN1OnN0cmluZyxob2c6bnVtYmVyLHBlcjpudW1iZXIsJ2VkYWQnKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBleGlzdGVpbmRpdmlkdWFsKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIscGVyOm51bWJlcil7XHJcbiAgICAgICAgICAgICAgICB2YXIgeHBlcnNvbmFzPXBlcnNvbmFzO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY3U9PWVuYyAmJiBob2c9PWhvZ2FyICYmICEhcGVyc29uYXMgJiYgcGVyPD0gcGVyc29uYXMubGVuZ3RoICYmIHBlcj49MSAmJiAhIXBlcnNvbmFzW3Blci0xXVsnZW50cmVhaW5kJ11cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXhpc3RlbWllbWJybyhlbmN1OnN0cmluZyxob2c6bnVtYmVyLHBlcjpudW1iZXIpe1xyXG4gICAgICAgICAgICAgICAgdmFyIHhwZXJzb25hcz1wZXJzb25hcztcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbmN1PT1lbmMgJiYgaG9nPT1ob2dhciAmJiAhIXBlcnNvbmFzICYmIHBlcjw9IHBlcnNvbmFzLmxlbmd0aCAmJiBwZXI+PTFcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbnJvY29ueXVnZXMoZW5jdTpzdHJpbmcsaG9nOm51bWJlcil7XHJcbiAgICAgICAgICAgICAgICB2YXIgeHBlcnNvbmFzPXBlcnNvbmFzXHJcbiAgICAgICAgICAgICAgICByZXR1cm4geHBlcnNvbmFzLmZpbHRlciggcGVyLT5wZXIucDQ9PTIpLmxlbmd0aFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBucm9qZWZlcyhlbmN1OnN0cmluZyxob2c6bnVtYmVyLHBlcjpudW1iZXIpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBlcnNvbmFzLmZpbHRlciggcGVyLT5wZXIucDQ9PTEpLmxlbmd0aFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwYXJlbnRlc2NvZmFtaWxpYXIoZW5jdTpzdHJpbmcsaG9nOm51bWJlcixwZXI6bnVtYmVyKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRvRmFtaWxpYXIoZW5jdTpzdHJpbmcsaG9nOm51bWJlcixwZXI6bnVtYmVyLCdwNCcpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHNleG9mYW1pbGlhcihlbmN1OnN0cmluZyxob2c6bnVtYmVyLHBlcjpudW1iZXIpe1xyXG4gICAgICAgICAgICAgICAgdmFyIHhwZXJzb25hcz1wZXJzb25hcztcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbmN1PT1lbmMgJiYgaG9nPT1ob2dhciAmJiAhIXhwZXJzb25hcyAmJiBwZXI8PSB4cGVyc29uYXMubGVuZ3RoICYmIHBlcj49MSAmJiAhIXhwZXJzb25hc1twZXItMV0uc2V4bz8geHBlcnNvbmFzW3Blci0xXVsnc2V4byddOm51bGxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2l0Y29ueWplZmUoZW5jdTpzdHJpbmcsaG9nOm51bWJlcil7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0b0ZhbWlsaWFyKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIsMSwncDUnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSAqLyAgICAgICBcclxuICAgIH1cclxufTtcclxuXHJcbnR5cGUgRnVuY2lvbkhhYmlsaXRhciA9ICh2YWxvcmVzOntba2V5OnN0cmluZ106YW55fSk9PmJvb2xlYW47XHJcbnR5cGUgRnVuY2lvblZhbG9yYXIgPSAodmFsb3Jlczp7W2tleTpzdHJpbmddOmFueX0pPT5hbnk7XHJcbnZhciBmdW5jaW9uZXNIYWJpbGl0YXI6e1trZXk6c3RyaW5nXTpGdW5jaW9uSGFiaWxpdGFyfT17XHJcbn1cclxudmFyIGZ1bmNpb25lc1ZhbG9yYXI6e1trZXk6c3RyaW5nXTpGdW5jaW9uVmFsb3Jhcn09e1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWluaUNvbXBpbGFkb3JTUWxKcyhleHByZXNpb25DYXNpU1FMOnN0cmluZyl7XHJcbiAgICB2YXIgZXhwcmVzaW9uID0gZXhwcmVzaW9uQ2FzaVNRTC5yZXBsYWNlKC9cXHUwMEEwL2csJyAnKTtcclxuICAgIHZhciBjdWVycG8gPSBleHByZXNpb24ucmVwbGFjZSgvXFxiaXMgZGlzdGluY3QgZnJvbVxcYi9naSwnIT0nKS5yZXBsYWNlKC9cXGIuKz9cXGIvZywgZnVuY3Rpb24oZWxUb2tlbil7XHJcbiAgICAgICAgdmFyIGVsVG9rZW5UcmltZWFkbz1lbFRva2VuLnRyaW0oKTtcclxuICAgICAgICBpZihlbFRva2VuVHJpbWVhZG8gaW4gcmVlbXBsYXpvc0hhYmlsaXRhcil7XHJcbiAgICAgICAgICAgIHJldHVybiByZWVtcGxhem9zSGFiaWxpdGFyW2VsVG9rZW5UcmltZWFkb107XHJcbiAgICAgICAgfWVsc2UgaWYoL15cXGQrXFwuP1xcZCokLy50ZXN0KGVsVG9rZW5UcmltZWFkbykpe1xyXG4gICAgICAgICAgICByZXR1cm4gZWxUb2tlblxyXG4gICAgICAgIH1lbHNlIGlmKC9eXFxXKyQvLnRlc3QoZWxUb2tlblRyaW1lYWRvKSl7XHJcbiAgICAgICAgICAgIHJldHVybiBlbFRva2VuXHJcbiAgICAgICAgfWVsc2UgaWYoL15cXHMrJC8udGVzdChlbFRva2VuKSl7XHJcbiAgICAgICAgICAgIHJldHVybiBlbFRva2VuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnaGVscGVycy5udWxsMnplcm8odmFsb3Jlcy4nK2VsVG9rZW4rJyknO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY3VlcnBvO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnVuY2lvbkNvbXBpbGFkYTxUPihjb25qdW50b0RlRnVuY2lvbmVzOntba2V5OnN0cmluZ106KHZhbG9yZXM6e1trZXk6c3RyaW5nXTphbnl9KT0+VH0pe1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKG5vbWJyZUZ1bmNpb25Db21vRXhwcmVzaW9uSnM6c3RyaW5nKXtcclxuICAgICAgICBpZighY29uanVudG9EZUZ1bmNpb25lc1tub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzXSl7XHJcbiAgICAgICAgICAgIHZhciBjdWVycG8gPSBub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzO1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAvLyB2YXIgY3VlcnBvID0gbWluaUNvbXBpbGFkb3JTUWxKcyhub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzKTtcclxuICAgICAgICAgICAgICAgIHZhciBpbnRlcm5hbEZ1biA9ICBuZXcgRnVuY3Rpb24oJ3ZhbG9yZXMnLCAnaGVscGVycycsICdyZXR1cm4gJytjdWVycG8pO1xyXG4gICAgICAgICAgICAgICAgY29uanVudG9EZUZ1bmNpb25lc1tub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzXSA9IGZ1bmN0aW9uKHZhbG9yZXMpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGludGVybmFsRnVuKHZhbG9yZXMsIGhlbHBlcnNDYXNpbGxlcm9zKTtcclxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SIEVKRUNVQ0NJT04gRVhQUkVTSU9OIEVYVEVSTkEgJyxub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjdWVycG8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh2YWxvcmVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUiBDT01QSUxBQ0lPTiBFWFBSRVNJT04gRVhURVJOQSAnLG5vbWJyZUZ1bmNpb25Db21vRXhwcmVzaW9uSnMpXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjdWVycG8pO1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb25qdW50b0RlRnVuY2lvbmVzW25vbWJyZUZ1bmNpb25Db21vRXhwcmVzaW9uSnNdO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RnVuY2lvbkhhYmlsaXRhciA9IGdldEZ1bmNpb25Db21waWxhZGEoZnVuY2lvbmVzSGFiaWxpdGFyKTtcclxuZXhwb3J0IGNvbnN0IGdldEZ1bmNpb25WYWxvcmFyICAgPSBnZXRGdW5jaW9uQ29tcGlsYWRhKGZ1bmNpb25lc1ZhbG9yYXIpO1xyXG5cclxuXHJcbnZhciByb3dWYWxpZGF0b3IgPSBnZXRSb3dWYWxpZGF0b3I8SWRWYXJpYWJsZSwgVmFsb3IsIElkRmluPih7Z2V0RnVuY2lvbkhhYmlsaXRhciwgZ2V0RnVuY2lvblZhbG9yYXJ9KVxyXG52YXIgYnVzY2FyTm9SZWFFblJlc3B1ZXN0YXMgPSAodW5pZGFkZXNBUmVjb3JyZXJQcm06SWRVbmlkYWRBbmFsaXNpc1tdLHVuaWRhZEFuYWxpc2lzOlVuaWRhZEFuYWxpc2lzLCByZXNwdWVzdGFzOlJlc3B1ZXN0YXMsbm9SZWFzVGFyZWE6e31bXSxub21iTm9SZWE6c3RyaW5nKT0+e1xyXG4gICAgdmFyIG5yY29kaWdvOnN0cmluZ3xudWxsPSBudWxsO1xyXG4gICAgdmFyIGVzdmFsb3I9ZmFsc2U7XHJcbiAgICB2YXIgcnZhbG9yOnN0cmluZ3xudWxsPW51bGw7XHJcbiAgICB2YXIgcnZhcmlhYmxlOnN0cmluZztcclxuICAgIHZhciBybm9yZWE6c3RyaW5nfG51bGw9bnVsbDtcclxuICAgLy8gdmFyIHJlc3VsdD17bnJjb2Q6U3RyaW5nLCBlc3ZhbDpCb29sZWFufTtcclxuICAgIGlmKHVuaWRhZGVzQVJlY29ycmVyUHJtLmluY2x1ZGVzKHVuaWRhZEFuYWxpc2lzLnVuaWRhZF9hbmFsaXNpcykpe1xyXG4gICAgICAgIGZvcihsZXQgbm9SZWEgb2Ygbm9SZWFzVGFyZWEpeyAvL2VzdHJ1Y3R1cmEubm9SZWFzLCBlc3RydWN0dXJhLm5vUmVhc1N1cFxyXG4gICAgICAgICAgICBpZiAobm9tYk5vUmVhPT0nbm9fcmVhJyl7XHJcbiAgICAgICAgICAgICAgICB2YXIge3ZhcmlhYmxlICwgdmFsb3IsIG5vX3JlYX0gPSBub1JlYTtcclxuICAgICAgICAgICAgICAgIHJub3JlYT1ub19yZWE7XHJcbiAgICAgICAgICAgICAgICBydmFsb3I9dmFsb3I7XHJcbiAgICAgICAgICAgICAgICBydmFyaWFibGU9dmFyaWFibGU7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgdmFyIHt2YXJpYWJsZV9zdXAgLCB2YWxvcl9zdXAsIG5vX3JlYV9zdXB9ID0gbm9SZWE7XHJcbiAgICAgICAgICAgICAgICBybm9yZWE9bm9fcmVhX3N1cDtcclxuICAgICAgICAgICAgICAgIHJ2YWxvcj12YWxvcl9zdXA7XHJcbiAgICAgICAgICAgICAgICBydmFyaWFibGU9dmFyaWFibGVfc3VwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHJlc3B1ZXN0YXNbcnZhcmlhYmxlIGFzIElkVmFyaWFibGVdPT1ydmFsb3Ipe1xyXG4gICAgICAgICAgICAgICAgbnJjb2RpZ28gPXJub3JlYTsgIC8vbm9fcmVhLCBub19yZWFfc3VwXHJcbiAgICAgICAgICAgICAgICBlc3ZhbG9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7bnJjb2RpZ28sZXN2YWxvcn1cclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBucmNvZGlnbz1udWxsO1xyXG4gICAgICAgICAgICAgICAgZXN2YWxvcj1mYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGZvcihsZXQgdWEgb2YgKGxpa2VBcih1bmlkYWRBbmFsaXNpcz8uaGlqYXMpLmFycmF5KCkpKXtcclxuICAgICAgICBpZih1YT8udW5pZGFkX2FuYWxpc2lzICYmIHJlc3B1ZXN0YXNbdWEudW5pZGFkX2FuYWxpc2lzXSBpbnN0YW5jZW9mIEFycmF5KXtcclxuICAgICAgICAgICAgZm9yKGxldCByZXNwdWVzdGFzSGlqYXMgb2YgcmVzcHVlc3Rhc1t1YT8udW5pZGFkX2FuYWxpc2lzXSl7XHJcbiAgICAgICAgICAgICAgIGxldCByZXN1bHQ9IGJ1c2Nhck5vUmVhRW5SZXNwdWVzdGFzKHVuaWRhZGVzQVJlY29ycmVyUHJtLHVhLHJlc3B1ZXN0YXNIaWphcyxub1JlYXNUYXJlYSxub21iTm9SZWEpO1xyXG4gICAgICAgICAgICAgICAgaWYocmVzdWx0LmVzdmFsb3IgKXtcclxuICAgICAgICAgICAgICAgICAgICBucmNvZGlnbz1yZXN1bHQubnJjb2RpZ287XHJcbiAgICAgICAgICAgICAgICAgICAgZXN2YWxvcj1yZXN1bHQuZXN2YWxvcjtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge25yY29kaWdvLGVzdmFsb3J9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbnJjb2RpZ289bnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBlc3ZhbG9yPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHtucmNvZGlnbywgZXN2YWxvcn1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICByZXR1cm4ge25yY29kaWdvLCBlc3ZhbG9yfVxyXG4gfVxyXG5cclxuLy8vLy8vIFRPRE9TIExPUyBOT01CUkVTIERFIHZhcmlhYmxlcyBvIGZvcm11bGFyaW9zIG8gY2FzaWxsZXJvcyBkZWJlbiBlc3RhciBlbiBlbCBvYmpldG8gb3BlcmF0aXZvXHJcbi8vLy8gUVVJVEFSTE8gWSBSRUVNUExBWkFSTE8gcG9yIGJ1c2NhciBlbiBlc3RydWN0dXJhLnVuaWRhZF9hbmFsaXNpcyB5IGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb1xyXG5leHBvcnQgdmFyIGRlZk9wZXJhdGl2byA9IHtcclxuICAgIC8vVE9ETzogR0VORVJBTElaQVJcclxuICAgIC8vZXNOb3JlYToocmVzcHVlc3RhczpSZXNwdWVzdGFzKT0+e1xyXG4gICAgLy8gICAgY29uc3QgTk9fUkVBX1ZBUiA9ICdlbnRyZWF2JyBhcyBJZFZhcmlhYmxlOyBcclxuICAgIC8vICAgIHJldHVybiByZXNwdWVzdGFzW05PX1JFQV9WQVJdICYmIHJlc3B1ZXN0YXNbTk9fUkVBX1ZBUl0hPTFcclxuICAgIC8vfSxcclxuICAgIFxyXG4gICAgZXNOb3JlYToocmVzcHVlc3RhczpSZXNwdWVzdGFzKT0+e1xyXG4gICAgICAgIC8vVE9ETyBHRU5FUkFMSVpBUlxyXG4gICAgICAgIHZhciB1bmlkYWRlc0FSZWNvcnJlciA9IFsndml2aWVuZGFzJywnaG9nYXJlcycsJ3BlcnNvbmFzJ10gYXMgSWRVbmlkYWRBbmFsaXNpc1tdO1xyXG4gICAgICAgIHZhciB1YVByaW5jaXBhbCA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKCh1YSk9PiF1YS5wYWRyZSk7XHJcbiAgICAgICAgdmFyIGVzTm9SZWEgPSBmYWxzZTtcclxuICAgICAgICB2YXIgY29kTm9SZWE6c3RyaW5nfG51bGw9IG51bGw7XHJcbiAgLypcclxuICAgICAgICB2YXIgYnVzY2FyTm9SZWFFblJlc3B1ZXN0YXMgPSAodW5pZGFkQW5hbGlzaXM6VW5pZGFkQW5hbGlzaXMsIHJlc3B1ZXN0YXM6UmVzcHVlc3Rhcyk9PntcclxuICAgICAgICAgICAgaWYodW5pZGFkZXNBUmVjb3JyZXIuaW5jbHVkZXModW5pZGFkQW5hbGlzaXMudW5pZGFkX2FuYWxpc2lzKSl7XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IG5vUmVhIG9mIGVzdHJ1Y3R1cmEubm9SZWFzKXtcclxuICAgICAgICAgICAgICAgICAgICB2YXIge3ZhcmlhYmxlLCB2YWxvciwgbm9fcmVhfSA9IG5vUmVhO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHJlc3B1ZXN0YXNbdmFyaWFibGUgYXMgSWRWYXJpYWJsZV09PXZhbG9yKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29kTm9SZWEgPSBub19yZWE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzTm9SZWEgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmb3IobGV0IHVhIG9mIChsaWtlQXIodW5pZGFkQW5hbGlzaXM/LmhpamFzKS5hcnJheSgpKSl7XHJcbiAgICAgICAgICAgICAgICBpZih1YT8udW5pZGFkX2FuYWxpc2lzICYmIHJlc3B1ZXN0YXNbdWEudW5pZGFkX2FuYWxpc2lzXSBpbnN0YW5jZW9mIEFycmF5KXtcclxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHJlc3B1ZXN0YXNIaWphcyBvZiByZXNwdWVzdGFzW3VhPy51bmlkYWRfYW5hbGlzaXNdKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGJ1c2Nhck5vUmVhRW5SZXNwdWVzdGFzKHVhLHJlc3B1ZXN0YXNIaWphcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3VsdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgYnVzY2FyTm9SZWFFblJlc3B1ZXN0YXModWFQcmluY2lwYWwhLHJlc3B1ZXN0YXMpO1xyXG4gICAgICAgIHJldHVybiB7Y29kTm9SZWEsZXNOb1JlYX1cclxuICovXHJcbiAgICAgICAgbGV0IHJlc25vcmVhID0gYnVzY2FyTm9SZWFFblJlc3B1ZXN0YXMoIHVuaWRhZGVzQVJlY29ycmVyLHVhUHJpbmNpcGFsISxyZXNwdWVzdGFzLGVzdHJ1Y3R1cmEubm9SZWFzLCdub19yZWEnKTtcclxuICAgICAgICBjb2ROb1JlYT1yZXNub3JlYS5ucmNvZGlnbztcclxuICAgICAgICBlc05vUmVhPXJlc25vcmVhLmVzdmFsb3I7XHJcbiAgICAgICAgcmV0dXJuIHtjb2ROb1JlYSwgZXNOb1JlYX07XHJcbiAgICB9LFxyXG4gICBlc05vcmVhU3VwOihyZXNwdWVzdGFzOlJlc3B1ZXN0YXMpPT57XHJcbiAgICAgICAgLy9UT0RPIEdFTkVSQUxJWkFSIGJ1c2Nhck5vcmVhUmVzcHVlc3Rhc1xyXG4gICAgICAgdmFyIHVuaWRhZGVzQVJlY29ycmVyU3VwID0gWyd2aXZpZW5kYXMnLCdob2dhcmVzX3N1cCcsJ3BlcnNvbmFzX3N1cCddIGFzIElkVW5pZGFkQW5hbGlzaXNbXTtcclxuICAgICAgIHZhciB1YVByaW5jaXBhbCA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKCh1YSk9PiF1YS5wYWRyZSk7XHJcbiAgICAgICB2YXIgZXNOb1JlYVN1cCA9IGZhbHNlO1xyXG4gICAgICAgdmFyIGNvZE5vUmVhU3VwOnN0cmluZ3xudWxsPSBudWxsO1xyXG4gICAgICAgbGV0IHJlc25vcmVhID1idXNjYXJOb1JlYUVuUmVzcHVlc3RhcyggdW5pZGFkZXNBUmVjb3JyZXJTdXAsdWFQcmluY2lwYWwhLHJlc3B1ZXN0YXMsZXN0cnVjdHVyYS5ub1JlYXNTdXAsJ25vX3JlYV9zdXAnKTsvL2NvbiBsb3MgcGFyYW1ldHJvcyBxdWUgbmVjZXNpdGFyaWFtb3MgcGFyYSBnZW5lcmFsaXphclxyXG4gICAgICAgICBjb2ROb1JlYVN1cD1yZXNub3JlYS5ucmNvZGlnbztcclxuICAgICAgICAgZXNOb1JlYVN1cD1yZXNub3JlYS5lc3ZhbG9yO1xyXG4gICAgICAgcmV0dXJuIHtjb2ROb1JlYVN1cCxlc05vUmVhU3VwfVxyXG4gICAgfSxcclxuICAgIGVzUmVhbGl6YWRhOihyZXNwdWVzdGFzOlJlc3B1ZXN0YXMpPT57XHJcbiAgICAgICAgLy9UT0RPIEdFTkVSQUxJWkFSXHJcbiAgICAgICAgdmFyIGVzUmVhID0gZmFsc2U7XHJcbiAgICAgICAgdmFyIGNvZFJlYTpudW1iZXJ8bnVsbD0gbnVsbDtcclxuICAgICAgICBpZighcmVzcHVlc3Rhc1snaWRlbnRpZicgYXMgSWRWYXJpYWJsZV0pe1xyXG4gICAgICAgICAgICByZXR1cm4ge2NvZFJlYSwgZXNSZWF9XHJcbiAgICAgICAgfWVsc2UgaWYocmVzcHVlc3Rhc1snaWRlbnRpZicgYXMgSWRWYXJpYWJsZV09PTIgfHxyZXNwdWVzdGFzWydyZXNpZF9ob2cnIGFzIElkVmFyaWFibGVdPT0yfHxyZXNwdWVzdGFzWydjb250YWN0JyBhcyBJZFZhcmlhYmxlXT09Mil7XHJcbiAgICAgICAgICAgIGNvZFJlYSA9IDI7XHJcbiAgICAgICAgICAgIGVzUmVhID0gZmFsc2U7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHZhciByZWFoczogbnVtYmVyW109W10gO1xyXG4gICAgICAgICAgICB2YXIgcmVzcHVlc3Rhc0hzID0gcmVzcHVlc3Rhc1snaG9nYXJlcyddO1xyXG4gICAgICAgICAgICBpZihyZXNwdWVzdGFzSHMpe1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCByZXNwdWVzdGFzSCBvZiByZXNwdWVzdGFzSHMpe1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZWFoOm51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWM6bnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHJlc3B1ZXN0YXNIWydlbnRyZWEnIF0gIT0gMXx8cmVzcHVlc3Rhc0hbJ3ByZWp1ZTEnXT09Mnx8cmVzcHVlc3Rhc0hbJ3RwJ109PTApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFoPTI7XHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjPXJlc3B1ZXN0YXNIWydjcl9udW1fbWllbWJybyddXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3B1ZXN0YXNIWydwZXJzb25hcyddICYmIHJlc3B1ZXN0YXNILnBlcnNvbmFzW3NlbGVjLTFdICl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcHVlc3Rhc1AgPSByZXNwdWVzdGFzSC5wZXJzb25hc1tzZWxlYy0xXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNwX2VudHJlYV9pbmQgPSByZXNwdWVzdGFzUFsnZW50cmVhaW5kJyBhcyBJZFZhcmlhYmxlIF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwX2VudHJlYV9pbmQ9PW51bGwpeyAvL3F1ZXJlbW9zIGNvbnRlbXBsYXIgZWwgdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhaCA9IDM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFoID0gTnVtYmVyKHJlc3BfZW50cmVhX2luZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhaCA9IDM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmVhaHMucHVzaChyZWFoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChyZWFocy5ldmVyeShyaD0+cmg9PTEpKXtcclxuICAgICAgICAgICAgICAgICAgICBjb2RSZWEgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGVzUmVhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHJlYWhzLmV2ZXJ5KHJoPT5yaD09Mikpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvZFJlYSA9IDI7XHJcbiAgICAgICAgICAgICAgICAgICAgZXNSZWEgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHJlYWhzLmV2ZXJ5KHJoPT5yaD09MXx8cmg9PTMpKXtcclxuICAgICAgICAgICAgICAgICAgICBjb2RSZWEgPSAzO1xyXG4gICAgICAgICAgICAgICAgICAgIGVzUmVhID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBjb2RSZWEgPSA0O1xyXG4gICAgICAgICAgICAgICAgICAgIGVzUmVhID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZXtcclxuICAgICAgICAgICAgICAgIGNvZFJlYSA9IDM7XHJcbiAgICAgICAgICAgICAgICBlc1JlYSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7Y29kUmVhLGVzUmVhfVxyXG4gICAgfSxcclxuICAgIGVzUmVhbGl6YWRhU3VwOihyZXNwdWVzdGFzOlJlc3B1ZXN0YXMpPT57XHJcbiAgICAgICAgLy9UT0RPIEdFTkVSQUxJWkFSIFxyXG4gICAgICAgIHZhciBlc1JlYVN1cCA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBjb2RSZWFTdXA6bnVtYmVyfG51bGw9IG51bGw7XHJcbiAgICAgICAgaWYoIXJlc3B1ZXN0YXNbJ2NvbmZpcl90ZWxfc3VwJyBhcyBJZFZhcmlhYmxlXSAmJiAhcmVzcHVlc3Rhc1snc3AxYScgYXMgSWRWYXJpYWJsZV0pe1xyXG4gICAgICAgICAgICByZXR1cm4ge2NvZFJlYVN1cCwgZXNSZWFTdXB9XHJcbiAgICAgICAgfWVsc2UgaWYoIHJlc3B1ZXN0YXNbJ2NvbmZpcl90ZWxfc3VwJyBhcyBJZFZhcmlhYmxlXT09MiB8fCByZXNwdWVzdGFzWydjb25maXJfZG9tX3N1cCcgYXMgSWRWYXJpYWJsZV09PTJ8fHJlc3B1ZXN0YXNbJ3NwMWEnIGFzIElkVmFyaWFibGVdPT0yIHx8cmVzcHVlc3Rhc1snc3AxYicgYXMgSWRWYXJpYWJsZV09PTJ8fHJlc3B1ZXN0YXNbJ3NwMWMnIGFzIElkVmFyaWFibGVdPT0yKXtcclxuICAgICAgICAgICAgY29kUmVhU3VwID0gMjtcclxuICAgICAgICAgICAgZXNSZWFTdXAgPSBmYWxzZTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgdmFyIHJlYWhzOiBudW1iZXJbXT1bXSA7XHJcbiAgICAgICAgICAgIHZhciByZXNwdWVzdGFzSHMgPSByZXNwdWVzdGFzWydob2dhcmVzX3N1cCddO1xyXG4gICAgICAgICAgICBpZihyZXNwdWVzdGFzSHMpe1xyXG4gICAgICAgICAgICAgICAgZm9yKGxldCByZXNwdWVzdGFzSCBvZiByZXNwdWVzdGFzSHMpe1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByZWFoOm51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWM6bnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHJlc3B1ZXN0YXNIWydlbnRyZWFfc3VwJyBdID09IDJ8fHJlc3B1ZXN0YXNIWydzcHIxX3N1cCddPT0yfHxyZXNwdWVzdGFzSFsnc3A0J109PTN8fHJlc3B1ZXN0YXNIWyd0b3RhbF9yYW5nb19zdXAnXT09MCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWg9MjtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzcHVlc3Rhc0hbJ2VudHJlYV9zdXAnIF0pe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZWFoID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZWFoPTM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZWFocy5wdXNoKHJlYWgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlYWhzLmV2ZXJ5KHJoPT5yaD09MSkpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvZFJlYVN1cCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgZXNSZWFTdXAgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYocmVhaHMuZXZlcnkocmg9PnJoPT0yKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29kUmVhU3VwID0gMjtcclxuICAgICAgICAgICAgICAgICAgICBlc1JlYVN1cCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYocmVhaHMuZXZlcnkocmg9PnJoPT0xfHxyaD09Mykpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvZFJlYVN1cCA9IDM7XHJcbiAgICAgICAgICAgICAgICAgICAgZXNSZWFTdXAgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIGNvZFJlYVN1cCA9IDQ7XHJcbiAgICAgICAgICAgICAgICAgICAgZXNSZWFTdXAgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNle1xyXG4gICAgICAgICAgICAgICAgY29kUmVhU3VwID0gMztcclxuICAgICAgICAgICAgICAgIGVzUmVhU3VwID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtjb2RSZWFTdXAsZXNSZWFTdXB9XHJcbiAgICB9LFxyXG4gICAgVUFwcmluY2lwYWw6JycgYXMgSWRVbmlkYWRBbmFsaXNpcyxcclxuICAgIGRlZlVBOnt9IGFzIHtbaSBpbiBJZFVuaWRhZEFuYWxpc2lzXTp7cGs6SWRWYXJpYWJsZSwgaW5jbHVpZGFzOklkVW5pZGFkQW5hbGlzaXNbXSwgaWRzRm9yOklkRm9ybXVsYXJpb1tdfX0sXHJcbiAgICBkZWZGb3I6e30gYXMge1tmIGluIElkRm9ybXVsYXJpb106ey8qYXJib2xVQTpJZFVuaWRhZEFuYWxpc2lzW10sICovIGhlcm1hbm8/OnRydWV9fVxyXG59XHJcbi8vLy8vIEFCQUpPIGRlIGVzdGEgbMOtbmVhIG5vIHB1ZWRlIGhhYmVyIG90cm9zIG5vbWJyZXMgZGUgdmFyaWFibGVzIG8gZm9ybXVsYXJpb3MgbyBjYXNpbGxlcm9zIGVuIGdlbmVyYWxcclxuXHJcbi8vIFRPRE86IEdFTkVSQUxJWkFSXHJcbnR5cGUgUGVyc29uYT17cDE6c3RyaW5nLCBwMjpudW1iZXIsIHAzOm51bWJlciwgcDQ6bnVtYmVyfG51bGwsIHA1OjF8bnVsbCwgcDY6MXxudWxsfVxyXG5cclxuZnVuY3Rpb24gbnVtKG51bTpudW1iZXJ8c3RyaW5nfG51bGwpOm51bWJlcntcclxuICAgIC8vQHRzLWlnbm9yZSBsYSBncmFjaWEgZXMgbWV0ZXIgbnVtIGN1YW5kbyBlcyBzdHJpbmdcclxuICAgIGlmKGlzTmFOKG51bS0wKSkgcmV0dXJuIDA7XHJcbiAgICAvL0B0cy1pZ25vcmUgbGEgZ3JhY2lhIGVzIG1ldGVyIG51bSBjdWFuZG8gZXMgc3RyaW5nXHJcbiAgICByZXR1cm4gbnVtLTA7XHJcbn1cclxuXHJcbnZhciBmdW5jaW9uZXNDb25vY2lkYXM6e1trIGluIHN0cmluZ106Ym9vbGVhbn0gPSB7fVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmaWNhclNvcnRlbyhvcHRzOntcclxuICAgIGNvbmZpZ3VyYWNpb25Tb3J0ZW86Q29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8sIFxyXG4gICAgcmVzcHVlc3RhczpSZXNwdWVzdGFzLFxyXG4gICAgcmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6XHJcbiAgICBmb3JQazpGb3JQayxcclxuICAgIHZhcmlhYmxlQWN0dWFsOklkVmFyaWFibGVcclxuXHJcbn0pe1xyXG4gICAgY29uc3QgcmVzZXRlYXJTb3J0ZW8gPSAob3B0czp7cmVzcHVlc3RhczpSZXNwdWVzdGFzfSk9PntcclxuICAgICAgICB2YXIge3Jlc3B1ZXN0YXN9ID0gb3B0cztcclxuICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8ucmVzdWx0YWRvXT1udWxsO1xyXG4gICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF9zb3J0ZWFibGVzXT1udWxsO1xyXG4gICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5kaXNwYXJhZG9yXSA9IG51bGw7XHJcbiAgICAgICAgY29uZmlndXJhY2lvblNvcnRlby5zb3J0ZWFkb19tb3N0cmFyPy5mb3JFYWNoKChtb3N0cmFyKT0+cmVzcHVlc3Rhc1ttb3N0cmFyLnRhcmdldF09bnVsbCk7XHJcbiAgICAgICAgaWYoJ3Zhcl9sZXRyYScgaW4gY29uZmlndXJhY2lvblNvcnRlby5wYXJhbV9tZXRvZG8pe1xyXG4gICAgICAgICAgICBpZihyZXNwdWVzdGFzW3VuaWRhZEFuYWxpc2lzXSAmJiByZXNwdWVzdGFzW3VuaWRhZEFuYWxpc2lzXSBpbnN0YW5jZW9mIEFycmF5KXtcclxuICAgICAgICAgICAgICAgIGZvcih2YXIgcGVyIG9mIHJlc3B1ZXN0YXNbdW5pZGFkQW5hbGlzaXNdKXtcclxuICAgICAgICAgICAgICAgICAgICBwZXJbY29uZmlndXJhY2lvblNvcnRlby5wYXJhbV9tZXRvZG8udmFyX2xldHJhXSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHtjb25maWd1cmFjaW9uU29ydGVvLCB2YXJpYWJsZUFjdHVhbCwgcmVzcHVlc3RhcywgZm9yUGssIHJlc3B1ZXN0YXNSYWl6fSA9IG9wdHM7XHJcbiAgICB2YXIgaWRFbmMgPSBmb3JQay52aXZpZW5kYSE7XHJcbiAgICB2YXIge3Jlc3B1ZXN0YXNBdW1lbnRhZGFzfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQaywgdHJ1ZSk7XHJcbiAgICB2YXIgZXhwcl9pbmNvbXBsZXRpdHVkX2Z1biA9IGdldEZ1bmNpb25IYWJpbGl0YXIoY29uZmlndXJhY2lvblNvcnRlby5leHByX2luY29tcGxldGl0dWRfanNbcmVzcHVlc3Rhc0F1bWVudGFkYXMudmRvbWluaW9dLmV4cHIpO1xyXG4gICAgdmFyIGZpbHRyb19mdW4gPSAgZ2V0RnVuY2lvbkhhYmlsaXRhcihjb25maWd1cmFjaW9uU29ydGVvLmZpbHRyb19qc1tyZXNwdWVzdGFzQXVtZW50YWRhcy52ZG9taW5pb10uZXhwcik7XHJcbiAgICB2YXIgdW5pZGFkQW5hbGlzaXMgPSBjb25maWd1cmFjaW9uU29ydGVvLnVuaWRhZF9hbmFsaXNpcztcclxuXHJcbiAgICBpZihjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtZXRyb3MuaW5jbHVkZXModmFyaWFibGVBY3R1YWwpKXtcclxuICAgICAgICB2YXIgdWFQYWRyZSA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKCh1YSk9PnVhLnVuaWRhZF9hbmFsaXNpcz09dW5pZGFkQW5hbGlzaXMpPy5wYWRyZTtcclxuICAgICAgICB2YXIgcGtBZ3JlZ2FkYVBhZHJlID0gbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbmQoKHVhKT0+dWEudW5pZGFkX2FuYWxpc2lzPT11YVBhZHJlKT8ucGtfYWdyZWdhZGFcclxuICAgICAgICBpZih1YVBhZHJlICYmIHJlc3B1ZXN0YXNBdW1lbnRhZGFzW3VhUGFkcmVdKXtcclxuICAgICAgICAgICAgLy9AdHMtaWdub3JlIHBrQWdyZWdhZGFQYWRyZSBleGlzdGUgZSBpbmRpY2EgbGEgcG9zaWNpb24gZGVsIHBhZHJlXHJcbiAgICAgICAgICAgIHZhciBwYWRyZSA9IHJlc3B1ZXN0YXNBdW1lbnRhZGFzW3VhUGFkcmVdW051bWJlcihyZXNwdWVzdGFzQXVtZW50YWRhc1twa0FncmVnYWRhUGFkcmVdKS0xXTtcclxuICAgICAgICAgICAgaWYodmFyaWFibGVBY3R1YWwgIT0gY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF90b3RhbCl7XHJcbiAgICAgICAgICAgICAgICBwYWRyZVtjb25maWd1cmFjaW9uU29ydGVvLmNhbnRpZGFkX3RvdGFsXT1wYWRyZVt1bmlkYWRBbmFsaXNpc10ubGVuZ3RoOyAvL3NpIGFncmVnYSBkZXNkZSBib3RvbiBhZ3JlZ2FyXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzZXRlYXJTb3J0ZW8oe3Jlc3B1ZXN0YXM6cGFkcmV9KTtcclxuICAgICAgICAgICAgcmVzcHVlc3RhcyA9IHBhZHJlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmKHJlc3B1ZXN0YXNbdW5pZGFkQW5hbGlzaXNdICE9IG51bGwpe1xyXG4gICAgICAgIGlmKHJlc3B1ZXN0YXNbdW5pZGFkQW5hbGlzaXNdIGluc3RhbmNlb2YgQXJyYXkpe1xyXG4gICAgICAgICAgICB2YXIgcmVzcHVlc3Rhc1VBID0gcmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10gYXMgUmVzcHVlc3Rhc1tdXHJcbiAgICAgICAgICAgIGlmKHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5kaXNwYXJhZG9yXSE9MSl7XHJcbiAgICAgICAgICAgICAgICBpZihyZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uZGlzcGFyYWRvcl09PTIpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF90b3RhbF09cmVzcHVlc3Rhc1VBLmxlbmd0aCArIDFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc2V0ZWFyU29ydGVvKHtyZXNwdWVzdGFzfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGNhbnRpZGFkVG90YWwgPSBOdW1iZXIocmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLmNhbnRpZGFkX3RvdGFsXSk7XHJcbiAgICAgICAgICAgIGlmKGNhbnRpZGFkVG90YWw8cmVzcHVlc3Rhc1VBLmxlbmd0aCl7XHJcbiAgICAgICAgICAgICAgICAvLyBkb2JsZSBhc2lnbmFjacOzbiBwYXJhIHF1ZSBsbyBjYXJndWUgZW4gcmVzcHVlc3Rhc1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1VBID0gcmVzcHVlc3Rhc1VBLmZpbHRlcigocCxpKT0+XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhY2lvblNvcnRlby5wYXJhbWV0cm9zLnNvbWUoKHBhcmFtKT0+cFtwYXJhbV0gfHwgaSA8PSBjYW50aWRhZFRvdGFsLTEpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10gPSByZXNwdWVzdGFzVUFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aGlsZShjYW50aWRhZFRvdGFsPnJlc3B1ZXN0YXNVQS5sZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1VBLnB1c2goe30gYXMgUmVzcHVlc3RhcylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLmluY29tcGxldGFzXSA9IHJlc3B1ZXN0YXNVQS5maWx0ZXIocD0+ZXhwcl9pbmNvbXBsZXRpdHVkX2Z1bihwKSkubGVuZ3RoO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYocmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLmRpc3BhcmFkb3JdPT0xICYmXHJcbiAgICAgICAgICAgICAgICAhcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLnJlc3VsdGFkb10gJiZcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5pbmNvbXBsZXRhc109PTBcclxuICAgICAgICAgICAgKXtcclxuICAgICAgICAgICAgICAgIHZhciBzb3J0ZWFyPXJlc3B1ZXN0YXNVQS5maWx0ZXIocD0+ZmlsdHJvX2Z1bihwKSk7XHJcbiAgICAgICAgICAgICAgICBpZihzb3J0ZWFyLmxlbmd0aCl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1VBLmZvckVhY2goKHBlciwgaSk9PnBlci4kcDA9aSsxKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFjaW9uU29ydGVvLm9yZGVuLnB1c2goe3ZhcmlhYmxlOlwiJHAwXCIgYXMgSWRWYXJpYWJsZSwgb3JkZW46MX0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHNvcnRlYXIuc29ydChjb21wYXJlRm9yT3JkZXIoY29uZmlndXJhY2lvblNvcnRlby5vcmRlbi5tYXAoZWxlbSA9PiAoe2NvbHVtbjplbGVtLnZhcmlhYmxlLCBvcmRlcjplbGVtLm9yZGVufSkpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvc2ljaW9uU29ydGVhZGEgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGNvbmZpZ3VyYWNpb25Tb3J0ZW8ubWV0b2RvPT0naGFzaCcpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05PIElNUExFTUVOVEFETycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvKnBvc2ljaW9uU29ydGVhZGE9KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhY2lvblNvcnRlby5wYXJhbV9tZXRvZG8udmFyX2NvZWYucmVkdWNlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3VtLCBwYWlyKT0+c3VtICsgZGF0b3NWaXZpZW5kYS50ZW1bcGFpci52YXJdICogcGFpci5jb2VmKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApICUgY29uZmlndXJhY2lvblNvcnRlby5wYXJhbV9tZXRvZG8uZGl2aXNvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICApICUgc29ydGVhci5sZW5ndGgqL1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGV0cmEgPSAnQSc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhckxldHJhOklkVmFyaWFibGUgPSBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kby52YXJfbGV0cmE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgcGVyc29uYSBvZiBzb3J0ZWFyKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNVQS5maW5kKChfcGVyLGkpPT5pPT1wZXJzb25hLiRwMC0xKSFbdmFyTGV0cmFdID0gbGV0cmE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzb25hW3ZhckxldHJhXT1sZXRyYTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHJhID0gU3RyaW5nLmZyb21DaGFyQ29kZShsZXRyYS5jaGFyQ29kZUF0KDApKzEpOyAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJsYUFsZWF0b3JpYU1pZW1icm9zID0gY29uZmlndXJhY2lvblNvcnRlby5wYXJhbV9tZXRvZG8udGFibGEubWFwKChsaXN0YSk9Pmxpc3RhLnNwbGl0KCcnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN0byA9IGlkRW5jICUgMTA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5hVGFibGFBbGVhdG9yaWEgPSByZXN0bz9yZXN0byAtIDE6OTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc29ydGVhci5sZW5ndGggPiB0YWJsYUFsZWF0b3JpYU1pZW1icm9zLmxlbmd0aCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWFyLnNwbGljZSh0YWJsYUFsZWF0b3JpYU1pZW1icm9zLmxlbmd0aCkgLy9kZXNjYXJ0byBjYW5kaWRhdG9zIHNpIHNvbiBtw6FzIHF1ZSBsbyBxdWUgcGVybWl0ZSBsYSB0YWJsYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxhVGFibGFBbGVhdG9yaWEgPSBzb3J0ZWFyLmxlbmd0aCAtIDEgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGV0cmFTZWxlY2Npb25hZGEgPSB0YWJsYUFsZWF0b3JpYU1pZW1icm9zW2ZpbGFUYWJsYUFsZWF0b3JpYV1bY29sdW1uYVRhYmxhQWxlYXRvcmlhXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaWNpb25Tb3J0ZWFkYSA9IHJlc3B1ZXN0YXNVQS5maW5kSW5kZXgoKHA6UmVzcHVlc3Rhcyk9PnBbdmFyTGV0cmFdPT1sZXRyYVNlbGVjY2lvbmFkYSkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8ucmVzdWx0YWRvXT1wb3NpY2lvblNvcnRlYWRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfc29ydGVhYmxlc109c29ydGVhci5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWNpb25Tb3J0ZW8uc29ydGVhZG9fbW9zdHJhcj8uZm9yRWFjaCgobW9zdHJhcik9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1ttb3N0cmFyLnRhcmdldF09cmVzcHVlc3Rhc1VBW3Jlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5yZXN1bHRhZG9dIGFzIG51bWJlciAtMV1bbW9zdHJhci5zb3VyY2VdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfc29ydGVhYmxlc109MDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfdG90YWxdPSByZXNwdWVzdGFzVUEubGVuZ3RoIHx8IG51bGw7IC8vbm8gcXVlcmVtb3MgZWwgdmFsb3IgMFxyXG4gICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8udmFyaWFibGVCb3RvbkZvcm11bGFyaW9VQV09J29rJztcclxuICAgICAgICAgICAgaWYoY29uZmlndXJhY2lvblNvcnRlby52YXJpYWJsZUJvdG9uRm9ybXVsYXJpb1VBSW5kaXZpZHVhbCl7XHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8udmFyaWFibGVCb3RvbkZvcm11bGFyaW9VQUluZGl2aWR1YWxdPSdvayc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHZhcmlhYmxlc0NhbGN1bGFkYXMocmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6LCBmb3JQazpGb3JQayl7XHJcbiAgICBpZihlc3BlY2lhbGVzLmNhbGN1bGFyVmFyaWFibGVzKXtcclxuICAgICAgICBlc3BlY2lhbGVzLmNhbGN1bGFyVmFyaWFibGVzKHJlc3B1ZXN0YXNSYWl6LCBmb3JQayk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhckZlZWRiYWNrVW5pZGFkQW5hbGlzaXMoXHJcbiAgICBmZWVkYmFja1Jvd1ZhbGlkYXRvcjp7IFtmb3JtdWxhcmlvIGluIFBsYWluRm9yUGtdOkZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+IH0sXHJcbiAgICBmb3JtdWxhcmlvczp7IFtub21icmVGb3JtdWxhcmlvIGluIElkRm9ybXVsYXJpb106SW5mb0Zvcm11bGFyaW8gfSwgXHJcbiAgICByZXNwdWVzdGFzOlJlc3B1ZXN0YXMsIFxyXG4gICAgVUE6SWRVbmlkYWRBbmFsaXNpcywgXHJcbiAgICBmb3JQazpGb3JQayxcclxuICAgIHJlc3B1ZXN0YXNBdW1lbnRhZGFzOlJlc3B1ZXN0YXMsIC8vIGluY2x1eWVuIGxhIGRlIHRvZG9zIGxvcyBwYWRyZXMgeSBhbnNlc3Ryb3MsXHJcbiAgICByZXNwdWVzdGFzUGFkcmU6UmVzcHVlc3Rhc3xudWxsLCBcclxuICAgIG9wdHM6T3BjaW9uZXNSb3dWYWxpZGF0b3IsXHJcbil7XHJcbiAgICAvLyByZWNvcnJpZW5kIFVBIHBlcnNvbmFzIHkgbWFzY290YXNcclxuICAgIGZvcih2YXIgVUFpbmNsdWlkYSBvZiBkZWZPcGVyYXRpdm8uZGVmVUFbVUFdLmluY2x1aWRhcyl7XHJcbiAgICAgICAgdmFyIHBrTnVldmEgPSBkZWZPcGVyYXRpdm8uZGVmVUFbVUFpbmNsdWlkYV0ucGs7XHJcbiAgICAgICAgdmFyIGNvbmp1bnRvUmVzcHVlc3Rhc1VBID0gcmVzcHVlc3Rhc1tVQWluY2x1aWRhXTtcclxuICAgICAgICBsaWtlQXIoY29uanVudG9SZXNwdWVzdGFzVUEpLmZvckVhY2goKHJlc3B1ZXN0YXNIaWpvLCB2YWxvclBrT1Bvc2ljaW9uKT0+e1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JQayA9IG51bWJlck9yU3RyaW5nSW5jSWZBcnJheSh2YWxvclBrT1Bvc2ljaW9uLCBjb25qdW50b1Jlc3B1ZXN0YXNVQSk7XHJcbiAgICAgICAgICAgIGNhbGN1bGFyRmVlZGJhY2tVbmlkYWRBbmFsaXNpcyhcclxuICAgICAgICAgICAgICAgIGZlZWRiYWNrUm93VmFsaWRhdG9yLCBcclxuICAgICAgICAgICAgICAgIGZvcm11bGFyaW9zLCBcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNIaWpvLCBcclxuICAgICAgICAgICAgICAgIFVBaW5jbHVpZGEsIFxyXG4gICAgICAgICAgICAgICAgey4uLmZvclBrLCBbcGtOdWV2YV06dmFsb3JQa30sXHJcbiAgICAgICAgICAgICAgICB7Li4ucmVzcHVlc3Rhc0F1bWVudGFkYXMsIC4uLnJlc3B1ZXN0YXNIaWpvLCBbcGtOdWV2YV06dmFsb3JQa30sXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzLFxyXG4gICAgICAgICAgICAgICAgb3B0c1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICAvLyBTMSAsIEExXHJcbiAgICBmb3IodmFyIGVzSGVybWFubyBvZiBbdHJ1ZSwgZmFsc2VdKXtcclxuICAgICAgICBmb3IodmFyIGZvcm11bGFyaW8gb2YgZGVmT3BlcmF0aXZvLmRlZlVBW1VBXS5pZHNGb3IpIGlmKCEhZXNIZXJtYW5vID09ICEhZGVmT3BlcmF0aXZvLmRlZkZvcltmb3JtdWxhcmlvXS5oZXJtYW5vKXtcclxuICAgICAgICAgICAgdmFyIHBsYWluRm9yUGs6UGxhaW5Gb3JQayA9IHRvUGxhaW5Gb3JQayh7Li4uZm9yUGssIGZvcm11bGFyaW99KVxyXG4gICAgICAgICAgICB2YXIgbWF4UGFzb3NBdXRvaW5ncmVzYWRhcyA9IDEwO1xyXG4gICAgICAgICAgICB2YXIgdmFyQXV0b0luZ3Jlc2FkYXMgPSBbXTtcclxuICAgICAgICAgICAgZG97XHJcbiAgICAgICAgICAgICAgICB2YXIgaHVib0F1dG9pbmdyZXNvcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZmVlZGJhY2tSb3dWYWxpZGF0b3JbcGxhaW5Gb3JQa109XHJcbiAgICAgICAgICAgICAgICAgICAgcm93VmFsaWRhdG9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7bWFyY2FGaW46J2ZpbicsIC4uLmZvcm11bGFyaW9zW2Zvcm11bGFyaW9dLmVzdHJ1Y3R1cmFSb3dWYWxpZGF0b3J9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc0F1bWVudGFkYXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHNcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB2YXIge3Jlc3VtZW4sIGF1dG9JbmdyZXNhZGFzfSA9IGZlZWRiYWNrUm93VmFsaWRhdG9yW3BsYWluRm9yUGtdO1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhck5hbWU6SWRWYXJpYWJsZTtcclxuICAgICAgICAgICAgICAgIGlmKGF1dG9JbmdyZXNhZGFzIT1udWxsKXtcclxuICAgICAgICAgICAgICAgICAgICBmb3IodmFyTmFtZSBpbiBhdXRvSW5ncmVzYWRhcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYW1iaW8gPSByZXNwdWVzdGFzW3Zhck5hbWVdICE9PSBhdXRvSW5ncmVzYWRhc1t2YXJOYW1lXSBhcyBWYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2FtYmlvKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNbdmFyTmFtZV0gPSBhdXRvSW5ncmVzYWRhc1t2YXJOYW1lXSBhcyBWYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNBdW1lbnRhZGFzW3Zhck5hbWVdID0gYXV0b0luZ3Jlc2FkYXNbdmFyTmFtZV0gYXMgVmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJBdXRvSW5ncmVzYWRhcy5wdXNoKHZhck5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVib0F1dG9pbmdyZXNvcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gd2hpbGUoaHVib0F1dG9pbmdyZXNvcyAmJiBtYXhQYXNvc0F1dG9pbmdyZXNhZGFzLS0+MCk7XHJcbiAgICAgICAgICAgIHZhckF1dG9JbmdyZXNhZGFzLmZvckVhY2godmFybmFtZT0+e1xyXG4gICAgICAgICAgICAgICAgLy8gZmVlZGJhY2tSb3dWYWxpZGF0b3JbcGxhaW5Gb3JQa10uZXN0YWRvc1t2YXJuYW1lIGFzIElkVmFyaWFibGVdID0gJ2FjdHVhbCc7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHZhciBCRl92YXJuYW1lID0gJyRCLicrZm9ybXVsYXJpbyBhcyBJZFZhcmlhYmxlXHJcbiAgICAgICAgICAgIHZhciBmb3JtUHJpbmNpcGFsRm9yVml2aWVuZGEgPSBnZXRNYWluRm9ybUZvclZpdmllbmRhKGZvclBrLnZpdmllbmRhISk7XHJcbiAgICAgICAgICAgIGlmKGVzdHJ1Y3R1cmEuY29uZmlnU29ydGVvICYmICFlc3RydWN0dXJhLmNvbmZpZ1NvcnRlb1tmb3JtUHJpbmNpcGFsRm9yVml2aWVuZGFdKXtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gaGF5IGNvbmZpZ3VyYWNpb24gZGUgc29ydGVvIHBhcmEgZWwgZm9ybXVsYXJpbyAke2Zvcm1QcmluY2lwYWxGb3JWaXZpZW5kYX1gKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvID0gZXN0cnVjdHVyYS5jb25maWdTb3J0ZW8gJiYgZXN0cnVjdHVyYS5jb25maWdTb3J0ZW9bZm9ybVByaW5jaXBhbEZvclZpdmllbmRhXTtcclxuICAgICAgICAgICAgdmFyIHJlc3VtZW5Pck51bGwgPSBcclxuICAgICAgICAgICAgICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8gJiZcclxuICAgICAgICAgICAgICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8udmFyaWFibGVCb3RvbkZvcm11bGFyaW9VQUluZGl2aWR1YWwgJiYgXHJcbiAgICAgICAgICAgICAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLnZhcmlhYmxlQm90b25Gb3JtdWxhcmlvVUFJbmRpdmlkdWFsID09IEJGX3Zhcm5hbWU/XHJcbiAgICAgICAgICAgICAgICAgICAgJ29rJ1xyXG4gICAgICAgICAgICAgICAgOnJlc3VtZW4gPT0gJ3ZhY2lvJyA/IFxyXG4gICAgICAgICAgICAgICAgICAgIG51bGxcclxuICAgICAgICAgICAgICAgIDpyZXN1bWVuXHJcbiAgICAgICAgICAgIGlmKGVzSGVybWFubyl7XHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzW0JGX3Zhcm5hbWVdID0gcmVzdW1lbk9yTnVsbDtcclxuICAgICAgICAgICAgfWVsc2UgaWYocmVzcHVlc3Rhc1BhZHJlICE9IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1BhZHJlW0JGX3Zhcm5hbWVdID0gcmVzdW1lbk9yTnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlck9yU3RyaW5nSW5jSWZBcnJheShudW1iZXJPclN0cmluZzpudW1iZXJ8c3RyaW5nLCBvYmplY3Q6b2JqZWN0fGFueVtdKToobnVtYmVyfHN0cmluZyl7XHJcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGVzdG95IHVzYW5kbyBpc05hTiBwYXJhIHZlciBzaSBlcyBvIG5vIHVuIG7Dum1lcm8gc3VtYWJsZVxyXG4gICAgaWYoaXNOYU4obnVtYmVyT3JTdHJpbmcpKXtcclxuICAgICAgICByZXR1cm4gbnVtYmVyT3JTdHJpbmc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTnVtYmVyKG51bWJlck9yU3RyaW5nKSsob2JqZWN0IGluc3RhbmNlb2YgQXJyYXk/MTowKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBnZXRNYWluRm9ybUZvclZpdmllbmRhID0gKHZpdmllbmRhOm51bWJlcik6SWRGb3JtdWxhcmlvPT57XHJcbiAgICAvL0B0cy1pZ25vcmUgbGEgdml2aWVuZGEgZXMgZWwgcGFyYW1ldHJvIGNvcnJlY3RvXHJcbiAgICByZXR1cm4gZGF0b3NCeVBhc3MuaW5mb3JtYWNpb25IZHJbdml2aWVuZGFdLnRhcmVhLm1haW5fZm9ybVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXJGZWVkYmFja0hvamFEZVJ1dGEoKXtcclxuICAgIGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maWx0ZXIodWFEZWY9PiF1YURlZi5wYWRyZSkuZm9yRWFjaCh1YURlZj0+e1xyXG4gICAgICAgIHZhciBlc1ByaW5jaXBhbCA9IChmOkZvcm11bGFyaW8sIGVuYzphbnkpPT4ge1xyXG4gICAgICAgICAgICBsZXQgZm9ybXVsYXJpb1ByaW5jaXBhbCA9IGdldE1haW5Gb3JtRm9yVml2aWVuZGEoZW5jKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZvcm11bGFyaW9QcmluY2lwYWw/Zm9ybXVsYXJpb1ByaW5jaXBhbD09Zi5pZF9jYXNpbGxlcm86Zi5mb3JtdWxhcmlvX3ByaW5jaXBhbFxyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY29uanVudG9SZXNwdWVzdGFzVUEgPSBkYXRvc0J5UGFzcy5yZXNwdWVzdGFzW3VhRGVmLnVuaWRhZF9hbmFsaXNpc11cclxuICAgICAgICBiZWluZ0FycmF5KGNvbmp1bnRvUmVzcHVlc3Rhc1VBKS5mb3JFYWNoKChyZXNwdWVzdGFzLCB2YWxvclBrT1Bvc2ljaW9uKT0+e1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JQayA9IG51bWJlck9yU3RyaW5nSW5jSWZBcnJheSh2YWxvclBrT1Bvc2ljaW9uLCBjb25qdW50b1Jlc3B1ZXN0YXNVQSk7XHJcbiAgICAgICAgICAgIGxpa2VBcihlc3RydWN0dXJhLmZvcm11bGFyaW9zKS5maWx0ZXIoZj0+Zi5jYXNpbGxlcm9zLnVuaWRhZF9hbmFsaXNpcyA9PSB1YURlZi51bmlkYWRfYW5hbGlzaXMgJiYgZXNQcmluY2lwYWwoZi5jYXNpbGxlcm9zLCB2YWxvclBrIGFzIG51bWJlcikpLmZvckVhY2goKF9kZWZGLCBmb3JtdWxhcmlvKT0+e1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvclBrUmFpeiA9IHtmb3JtdWxhcmlvLCBbdWFEZWYucGtfYWdyZWdhZGFdOnZhbG9yUGt9XHJcbiAgICAgICAgICAgICAgICBjYWxjdWxhckZlZWRiYWNrKHJlc3B1ZXN0YXMsIGZvclBrUmFpeiwge30pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGFyRmVlZGJhY2tFbmN1ZXN0YShcclxuICAgIGZlZWRiYWNrUm93VmFsaWRhdG9yOnsgW2Zvcm11bGFyaW8gaW4gUGxhaW5Gb3JQa106Rm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsIFZhbG9yLCBJZEZpbj4gfSxcclxuICAgIGZvcm11bGFyaW9zOnsgW25vbWJyZUZvcm11bGFyaW8gaW4gSWRGb3JtdWxhcmlvXTpJbmZvRm9ybXVsYXJpbyB9LCBcclxuICAgIGZvclBrUmFpejogRm9yUGtSYWl6LCBcclxuICAgIHJlc3B1ZXN0YXM6UmVzcHVlc3RhcywgXHJcbiAgICBvcHRzOk9wY2lvbmVzUm93VmFsaWRhdG9yXHJcbil7XHJcbiAgICB2YXIgZm9yUGs6Rm9yUGsgPXsuLi5mb3JQa1JhaXp9O1xyXG4gICAgY2FsY3VsYXJGZWVkYmFja1VuaWRhZEFuYWxpc2lzKGZlZWRiYWNrUm93VmFsaWRhdG9yLCBmb3JtdWxhcmlvcywgcmVzcHVlc3RhcywgZGVmT3BlcmF0aXZvLlVBcHJpbmNpcGFsLCBmb3JQaywgcmVzcHVlc3RhcywgbnVsbCwgb3B0cyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGFyRmVlZGJhY2socmVzcHVlc3RhczogUmVzcHVlc3RhcywgZm9yUGtSYWl6OkZvclBrUmFpeiwgb3B0czpPcGNpb25lc1Jvd1ZhbGlkYXRvcil7XHJcbiAgICB2YXIgcmVzdW1lbkVzdGFkbzpSZXN1bWVuRXN0YWRvO1xyXG4gICAgLy8gQHRzLWlnbm9yZSBQYXJ0aWFsXHJcbiAgICB2YXIgbnVldm9zUm93cyA6IHtbeCBpbiBQbGFpbkZvclBrXTpGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSxJZEZpbj59PXt9XHJcbiAgICBjYWxjdWxhckZlZWRiYWNrRW5jdWVzdGEobnVldm9zUm93cywgZXN0cnVjdHVyYS5mb3JtdWxhcmlvcywgZm9yUGtSYWl6LCByZXNwdWVzdGFzLCBvcHRzKTtcclxuICAgIGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yID0gbGlrZUFyKGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yKS5maWx0ZXIoKF9mZWVkYmFjazphbnksIHBsYWluUGs6UGxhaW5Gb3JQayk9PkpTT04ucGFyc2UocGxhaW5Qaykudml2aWVuZGEgIT0gZm9yUGtSYWl6LnZpdmllbmRhKS5wbGFpbigpO1xyXG4gICAgZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IgPSB7Li4uZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IsIC4uLm51ZXZvc1Jvd3N9O1xyXG4gICAgZGF0b3NCeVBhc3MucmVzcHVlc3Rhcy52aXZpZW5kYXNbZm9yUGtSYWl6LnZpdmllbmRhIV0gPSB7XHJcbiAgICAgICAgLi4uZGF0b3NCeVBhc3MucmVzcHVlc3Rhcy52aXZpZW5kYXNbZm9yUGtSYWl6LnZpdmllbmRhIV0sXHJcbiAgICAgICAgLi4uY2FsY3VsYXJSZXN1bWVuVml2aWVuZGEoXHJcbiAgICAgICAgICAgIGZvclBrUmFpeiwgXHJcbiAgICAgICAgICAgIG51ZXZvc1Jvd3MsXHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNcclxuICAgICAgICApXHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgdmFyIGdldEZvcm11bGFyaW9zRm9ySWRWaXZpZW5kYSA9IChpZFZpdmllbmRhOm51bWJlcik9PntcclxuICAgIHZhciBtYWluRm9ybUZvclZpdmllbmRhID0gZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYShpZFZpdmllbmRhKTtcclxuICAgIHZhciBmb3Jtc0ZlZWRiYWNrID0gW21haW5Gb3JtRm9yVml2aWVuZGFdO1xyXG4gICAgdmFyIGJ1c2NhckZvcm11bGFyaW9zSGlqb3MgPSAoaWRGb3JtdWxhcmlvOklkRm9ybXVsYXJpbyk9PntcclxuICAgICAgICBlc3RydWN0dXJhLmZvcm11bGFyaW9zW2lkRm9ybXVsYXJpb10uY2FzaWxsZXJvcy5jYXNpbGxlcm9zLmZvckVhY2goKGNhc2lsbGVybyk9PntcclxuICAgICAgICAgICAgaWYoY2FzaWxsZXJvLnRpcG9jID09ICdCRicpe1xyXG4gICAgICAgICAgICAgICAgdmFyIGZvcm1IaWpvID0gKGNhc2lsbGVyby5zYWx0bz8uc3RhcnRzV2l0aCgnRjonKT9jYXNpbGxlcm8uc2FsdG86J0Y6JyArIGNhc2lsbGVyby5zYWx0bykgYXMgSWRGb3JtdWxhcmlvO1xyXG4gICAgICAgICAgICAgICAgaWYoZm9ybUhpam8pe1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1zRmVlZGJhY2sucHVzaChmb3JtSGlqbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnVzY2FyRm9ybXVsYXJpb3NIaWpvcyhmb3JtSGlqbyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgYnVzY2FyRm9ybXVsYXJpb3NIaWpvcyhtYWluRm9ybUZvclZpdmllbmRhKTtcclxuICAgIHJldHVybiBmb3Jtc0ZlZWRiYWNrO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIGNhbGN1bGFyQWN0dWFsQkYgPSAoY29uZmlnU29ydGVvRm9ybXVsYXJpbzpDb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpb3xudWxsLCBudW1FbGVtZW50b1VBOiBudW1iZXIsIG51bUFjdHVhbDpudW1iZXJ8bnVsbCwgZm9ybXVsYXJpbzpJZEZvcm11bGFyaW8sIHI6UmVzcHVlc3Rhcyk9PlxyXG4gICAgISEoY29uZmlnU29ydGVvRm9ybXVsYXJpbyAmJiBcclxuICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19pbmRpdmlkdWFsICYmXHJcbiAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmlkX2Zvcm11bGFyaW9faW5kaXZpZHVhbCA9PSBmb3JtdWxhcmlvXHJcbiAgICA/IFxyXG4gICAgICAgIG51bUVsZW1lbnRvVUEgPT0gY29hbGVzY2UoXHJcbiAgICAgICAgICAgIHJbY29uZmlnU29ydGVvRm9ybXVsYXJpby5yZXN1bHRhZG9fbWFudWFsXSxcclxuICAgICAgICAgICAgcltjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLnJlc3VsdGFkb11cclxuICAgICAgICApXHJcbiAgICA6XHJcbiAgICAgICAgbnVtQWN0dWFsID09IG51bUVsZW1lbnRvVUFcclxuICAgIClcclxuXHJcbmV4cG9ydCB2YXIgY2FsY3VsYXJEaXNhYmxlZEJGID0gKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW86Q29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW98bnVsbCwgbnVtRWxlbWVudG9VQTogbnVtYmVyLCBmb3JtdWxhcmlvOklkRm9ybXVsYXJpbywgcjpSZXNwdWVzdGFzKT0+XHJcbiAgICAhIShjb25maWdTb3J0ZW9Gb3JtdWxhcmlvICYmIFxyXG4gICAgY29uZmlnU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX2luZGl2aWR1YWwgPT0gZm9ybXVsYXJpbyAmJlxyXG4gICAgbnVtRWxlbWVudG9VQSAhPSBjb2FsZXNjZShcclxuICAgICAgICByW2NvbmZpZ1NvcnRlb0Zvcm11bGFyaW8ucmVzdWx0YWRvX21hbnVhbF0sXHJcbiAgICAgICAgcltjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLnJlc3VsdGFkb11cclxuICAgICkpXHJcblxyXG5leHBvcnQgdmFyIGNhbGN1bGFyUGVybWl0ZUJvcnJhckJGID0gKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW86Q29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW98bnVsbCwgZm9ybXVsYXJpbzpJZEZvcm11bGFyaW8pPT5cclxuICAgICEoY29uZmlnU29ydGVvRm9ybXVsYXJpbyAmJiBcclxuICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19pbmRpdmlkdWFsID09IGZvcm11bGFyaW8pXHJcblxyXG50eXBlIFJlc3VsdGFkb1Jlc3VtZW4gPSB7XHJcbiAgICByZXN1bWVuRXN0YWRvOlJlc3VtZW5Fc3RhZG8sXHJcbiAgICByZXN1bWVuRXN0YWRvU3VwOlJlc3VtZW5Fc3RhZG8sXHJcbiAgICBjb2RSZWE6bnVtYmVyfG51bGwsXHJcbiAgICBjb2ROb1JlYTpzdHJpbmd8bnVsbCxcclxuICAgIGNvZFJlYVN1cDpudW1iZXJ8bnVsbFxyXG4gICAgY29kTm9SZWFTdXA6c3RyaW5nfG51bGwsXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhclJlc3VtZW5WaXZpZW5kYShcclxuICAgIGZvclBrUmFpejpGb3JQa1JhaXosIFxyXG4gICAgZmVlZGJhY2tSb3dWYWxpZGF0b3I6e1tmb3JtdWxhcmlvIGluIFBsYWluRm9yUGtdOkZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+fSwgXHJcbiAgICByZXNwdWVzdGFzOlJlc3B1ZXN0YXNcclxuKTpSZXN1bHRhZG9SZXN1bWVue1xyXG4gICAgdmFyIHtjb2RSZWEsIGVzUmVhfSA9IGRlZk9wZXJhdGl2by5lc1JlYWxpemFkYShyZXNwdWVzdGFzKVxyXG4gICAgdmFyIHtjb2ROb1JlYSwgZXNOb1JlYX0gPSBkZWZPcGVyYXRpdm8uZXNOb3JlYShyZXNwdWVzdGFzKVxyXG4gICAgdmFyIHtjb2RSZWFTdXAsZXNSZWFTdXB9ID0gZGVmT3BlcmF0aXZvLmVzUmVhbGl6YWRhU3VwKHJlc3B1ZXN0YXMpXHJcbiAgICB2YXIge2NvZE5vUmVhU3VwLCBlc05vUmVhU3VwfSA9IGRlZk9wZXJhdGl2by5lc05vcmVhU3VwKHJlc3B1ZXN0YXMpXHJcbiAgICB2YXIgZm9ybXNGZWVkYmFjayA9IGdldEZvcm11bGFyaW9zRm9ySWRWaXZpZW5kYShmb3JQa1JhaXoudml2aWVuZGEhKTtcclxuICAgIHZhciBjb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpbyA9IGVzdHJ1Y3R1cmEuY29uZmlnU29ydGVvICYmIGVzdHJ1Y3R1cmEuY29uZmlnU29ydGVvW2dldE1haW5Gb3JtRm9yVml2aWVuZGEoZm9yUGtSYWl6LnZpdmllbmRhISldXHJcbiAgICB2YXIgZmVlZEJhY2tWaXZpZW5kYSA9IGxpa2VBcihmZWVkYmFja1Jvd1ZhbGlkYXRvcikuZmlsdGVyKChfcm93LCBwbGFpblBrKT0+e1xyXG4gICAgICAgIHZhciB0aWVuZUluZGl2aWR1YWwgPSBjb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpbyAmJiAhIShjb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX2luZGl2aWR1YWwgJiYgY29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19wYWRyZSlcclxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShwbGFpblBrKS52aXZpZW5kYT09Zm9yUGtSYWl6LnZpdmllbmRhICYmIFxyXG4gICAgICAgICAgICBmb3Jtc0ZlZWRiYWNrLmluY2x1ZGVzKEpTT04ucGFyc2UocGxhaW5QaykuZm9ybXVsYXJpbykgJiZcclxuICAgICAgICAgICAgKHRpZW5lSW5kaXZpZHVhbD9cclxuICAgICAgICAgICAgICAgICFjYWxjdWxhckRpc2FibGVkQkYoXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8sIFxyXG4gICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2UocGxhaW5QaykucGVyc29uYSwgXHJcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5wYXJzZShwbGFpblBrKS5mb3JtdWxhcmlvLCBcclxuICAgICAgICAgICAgICAgICAgICBKU09OLnBhcnNlKHBsYWluUGspLmhvZ2FyP3Jlc3B1ZXN0YXNGb3JQayh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpdmllbmRhOmZvclBrUmFpei52aXZpZW5kYSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm11bGFyaW86Y29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19wYWRyZSEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyOkpTT04ucGFyc2UocGxhaW5QaykuaG9nYXIgXHJcbiAgICAgICAgICAgICAgICAgICAgfSkucmVzcHVlc3Rhczp7fSBhcyBSZXNwdWVzdGFzXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIDp0cnVlKVxyXG4gICAgfSkuYXJyYXkoKTtcclxuICAgIHZhciBwcmlvcmlkYWRlczp7W2tleSBpbiBSZXN1bWVuRXN0YWRvXToge3ByaW9yaWRhZDpudW1iZXIsIGNhbnRpZGFkOm51bWJlcn19ID0ge1xyXG4gICAgICAgICdubyByZWEnOntwcmlvcmlkYWQ6IDEsIGNhbnRpZGFkOjB9LFxyXG4gICAgICAgICdjb24gcHJvYmxlbWFzJzp7cHJpb3JpZGFkOiAyLCBjYW50aWRhZDowfSxcclxuICAgICAgICAnaW5jb21wbGV0byc6e3ByaW9yaWRhZDogMywgY2FudGlkYWQ6MH0sXHJcbiAgICAgICAgJ3ZhY2lvJzp7cHJpb3JpZGFkOiA0LCBjYW50aWRhZDowfSxcclxuICAgICAgICAnY2l0YSBwYWN0YWRhJzp7cHJpb3JpZGFkOiA1LCBjYW50aWRhZDowfSxcclxuICAgICAgICAnb2snOntwcmlvcmlkYWQ6IDYsIGNhbnRpZGFkOjB9XHJcbiAgICB9XHJcbiAgICB2YXIgbWluID0gNjtcclxuICAgIHZhciBtaW5SZXN1bWVuOiBSZXN1bWVuRXN0YWRvID0gJ29rJztcclxuICAgIGZvcih2YXIgZmVlZGJhY2sgb2YgZmVlZEJhY2tWaXZpZW5kYSl7XHJcbiAgICAgICAgdmFyIHJlc3VtZW4gPSBmZWVkYmFjay5yZXN1bWVuO1xyXG4gICAgICAgIHByaW9yaWRhZGVzW3Jlc3VtZW5dLmNhbnRpZGFkKys7XHJcbiAgICAgICAgaWYocHJpb3JpZGFkZXNbcmVzdW1lbl0ucHJpb3JpZGFkPG1pbil7XHJcbiAgICAgICAgICAgIG1pbj1wcmlvcmlkYWRlc1tyZXN1bWVuXS5wcmlvcmlkYWQ7XHJcbiAgICAgICAgICAgIG1pblJlc3VtZW49cmVzdW1lbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZihtaW5SZXN1bWVuPT0ndmFjaW8nJiYgcHJpb3JpZGFkZXNbJ29rJ10uY2FudGlkYWQgfHwgbWluUmVzdW1lbj09J2luY29tcGxldG8nKXtcclxuICAgICAgICBpZihmYWxzZSAvKnJlc3B1ZXN0YXNbc3AxXT09MiAmJiByZXNwdWVzdGFzW3NwNl09PW51bGwqLyl7XHJcbiAgICAgICAgICAgIG1pblJlc3VtZW49J2NpdGEgcGFjdGFkYSc7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIG1pblJlc3VtZW49J2luY29tcGxldG8nO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLy9UT0RPIEFSUkVHTEFSIEVTVEUgSE9SUk9SLCBHRU5FUkFMSVpBUlxyXG4gICAgdmFyIHRhcmVhID0gZGF0b3NCeVBhc3MuaW5mb3JtYWNpb25IZHJbZm9yUGtSYWl6LnZpdmllbmRhIGFzIHVua25vd24gYXMgSWRFbmNdLnRhcmVhLnRhcmVhO1xyXG4gICAgdmFyIHJlc3VtZW5Fc3RhZG86UmVzdW1lbkVzdGFkbztcclxuICAgIHZhciByZXN1bWVuRXN0YWRvU3VwOlJlc3VtZW5Fc3RhZG87XHJcbiAgICBpZih0YXJlYT09J3N1cGUnKXtcclxuICAgICAgICByZXN1bWVuRXN0YWRvU3VwID0gZXNOb1JlYVN1cD8nbm8gcmVhJzptaW5SZXN1bWVuXHJcbiAgICAgICAgLy9wYXJhIHF1ZSBjb2xvcmVlIGJpZW4gZW4gbGEgaGRyIGRlbCBETSAobHVlZ28gZW4gYmJkZCBubyBzZSBndWFyZGEpXHJcbiAgICAgICAgcmVzdW1lbkVzdGFkbyA9IHJlc3VtZW5Fc3RhZG9TdXBcclxuICAgIH1lbHNle1xyXG4gICAgICAgIHJlc3VtZW5Fc3RhZG8gPSBlc05vUmVhPydubyByZWEnOm1pblJlc3VtZW5cclxuICAgIH1cclxuICAgIHZhciByZXN1bHRhZG86UmVzdWx0YWRvUmVzdW1lbiA9IHtcclxuICAgICAgICByZXN1bWVuRXN0YWRvLFxyXG4gICAgICAgIHJlc3VtZW5Fc3RhZG9TdXAsXHJcbiAgICAgICAgY29kUmVhLFxyXG4gICAgICAgIGNvZE5vUmVhLFxyXG4gICAgICAgIGNvZFJlYVN1cCxcclxuICAgICAgICBjb2ROb1JlYVN1cFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdGFkb1xyXG59XHJcbiJdfQ==
|