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