dmencu 3.2.21 → 3.4.0

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.
Files changed (258) hide show
  1. package/README.md +42 -42
  2. package/ayuda/asignacion.md +16 -0
  3. package/ayuda/circuito-encuesta.md +27 -0
  4. package/ayuda/control.md +13 -0
  5. package/ayuda/dm-cambiar-modo.md +16 -0
  6. package/ayuda/dm-relevamiento.md +20 -0
  7. package/ayuda/dm-sincronizar.md +18 -0
  8. package/ayuda/fin-de-campo.md +14 -0
  9. package/ayuda/metadatos.md +14 -0
  10. package/ayuda/procesar.md +13 -0
  11. package/ayuda/recepcion.md +20 -0
  12. package/ayuda/supervision.md +9 -0
  13. package/ayuda/usuarios.md +12 -0
  14. package/ayuda/varios.md +23 -0
  15. package/dist/client/client/client.js +101 -4
  16. package/dist/client/client/css/menu.styl +29 -0
  17. package/dist/client/unlogged/abrir-formulario.js +1 -1
  18. package/dist/client/unlogged/bypass-formulario.d.ts +6 -42
  19. package/dist/client/unlogged/bypass-formulario.js +84 -219
  20. package/dist/client/unlogged/calculos-encuesta.js +112 -38
  21. package/dist/client/unlogged/css/formulario-react.styl +9 -0
  22. package/dist/client/unlogged/helpers-casilleros.d.ts +1 -1
  23. package/dist/client/unlogged/helpers-casilleros.js +12 -18
  24. package/dist/client/unlogged/helpers-formulario.d.ts +16 -0
  25. package/dist/client/unlogged/helpers-formulario.js +88 -0
  26. package/dist/client/unlogged/redux-formulario.d.ts +1 -2
  27. package/dist/client/unlogged/redux-formulario.js +21 -31
  28. package/dist/client/unlogged/render-config.d.ts +5 -1
  29. package/dist/client/unlogged/render-config.js +14 -1
  30. package/dist/client/unlogged/render-formulario.d.ts +3 -6
  31. package/dist/client/unlogged/render-formulario.js +71 -69
  32. package/dist/client/unlogged/render-formulario.tsx +100 -57
  33. package/dist/client/unlogged/render-general.d.ts +2 -0
  34. package/dist/client/unlogged/render-general.js +2 -1
  35. package/dist/client/unlogged/render-general.tsx +2 -1
  36. package/dist/client/unlogged/render-init.d.ts +1 -0
  37. package/dist/client/unlogged/render-init.js +9 -2
  38. package/dist/client/unlogged/tipos.d.ts +93 -41
  39. package/dist/client/unlogged/tipos.js +1 -1
  40. package/dist/server/app-dmencu.d.ts +1435 -0
  41. package/dist/server/app-dmencu.js +1091 -0
  42. package/dist/server/ayuda.d.ts +19 -0
  43. package/dist/server/ayuda.js +224 -0
  44. package/dist/server/def-config.d.ts +1 -0
  45. package/dist/server/def-config.js +123 -0
  46. package/dist/server/procedures-dmencu.d.ts +43 -0
  47. package/dist/server/procedures-dmencu.js +2313 -0
  48. package/dist/server/server/app-dmencu.d.ts +49 -91
  49. package/dist/server/server/app-dmencu.js +151 -52
  50. package/dist/server/server/ayuda.d.ts +19 -0
  51. package/dist/server/server/ayuda.js +224 -0
  52. package/dist/server/server/procedures-dmencu.d.ts +34 -2
  53. package/dist/server/server/procedures-dmencu.js +93 -51
  54. package/dist/server/server/setters-rea-no-rea.d.ts +13 -0
  55. package/dist/server/server/setters-rea-no-rea.js +35 -0
  56. package/dist/server/server/table-areas.js +4 -4
  57. package/dist/server/server/table-areas_asignacion_general.js +2 -1
  58. package/dist/server/server/table-control_campo.js +4 -4
  59. package/dist/server/server/table-no_rea.js +4 -2
  60. package/dist/server/server/table-no_rea_sup.js +7 -3
  61. package/dist/server/server/table-personal.js +1 -1
  62. package/dist/server/server/table-tareas_tem.js +2 -2
  63. package/dist/server/server/table-tem.js +2 -2
  64. package/dist/server/server/types-dmencu.d.ts +53 -2
  65. package/dist/server/server/types-dmencu.js +2 -1
  66. package/dist/server/setters-rea-no-rea.d.ts +13 -0
  67. package/dist/server/setters-rea-no-rea.js +35 -0
  68. package/dist/server/table-acciones.d.ts +2 -0
  69. package/dist/server/table-acciones.js +45 -0
  70. package/dist/server/table-area_enc_proximas.d.ts +2 -0
  71. package/dist/server/table-area_enc_proximas.js +30 -0
  72. package/dist/server/table-areas.d.ts +4 -0
  73. package/dist/server/table-areas.js +112 -0
  74. package/dist/server/table-areas_asignacion_general.d.ts +2 -0
  75. package/dist/server/table-areas_asignacion_general.js +86 -0
  76. package/dist/server/table-barrios.d.ts +2 -0
  77. package/dist/server/table-barrios.js +35 -0
  78. package/dist/server/table-comunas.d.ts +2 -0
  79. package/dist/server/table-comunas.js +33 -0
  80. package/dist/server/table-control_campo.d.ts +12 -0
  81. package/dist/server/table-control_campo.js +119 -0
  82. package/dist/server/table-control_dias_carga.d.ts +2 -0
  83. package/dist/server/table-control_dias_carga.js +63 -0
  84. package/dist/server/table-control_resumen.d.ts +2 -0
  85. package/dist/server/table-control_resumen.js +19 -0
  86. package/dist/server/table-diccionario.d.ts +2 -0
  87. package/dist/server/table-diccionario.js +32 -0
  88. package/dist/server/table-dictra.d.ts +2 -0
  89. package/dist/server/table-dictra.js +46 -0
  90. package/dist/server/table-dicvar.d.ts +2 -0
  91. package/dist/server/table-dicvar.js +32 -0
  92. package/dist/server/table-encuestadores.d.ts +13 -0
  93. package/dist/server/table-encuestadores.js +75 -0
  94. package/dist/server/table-estados.d.ts +2 -0
  95. package/dist/server/table-estados.js +47 -0
  96. package/dist/server/table-estados_acciones.d.ts +2 -0
  97. package/dist/server/table-estados_acciones.js +40 -0
  98. package/dist/server/table-fracciones.d.ts +2 -0
  99. package/dist/server/table-fracciones.js +37 -0
  100. package/dist/server/table-grilla_hoja_ruta.d.ts +2 -0
  101. package/dist/server/table-grilla_hoja_ruta.js +93 -0
  102. package/dist/server/table-historial_tem.d.ts +2 -0
  103. package/dist/server/table-historial_tem.js +57 -0
  104. package/dist/server/table-hogares.d.ts +2 -0
  105. package/dist/server/table-hogares.js +156 -0
  106. package/dist/server/table-hogares_sup.d.ts +2 -0
  107. package/dist/server/table-hogares_sup.js +191 -0
  108. package/dist/server/table-inconsistencias_cumplen_condicion.d.ts +2 -0
  109. package/dist/server/table-inconsistencias_cumplen_condicion.js +33 -0
  110. package/dist/server/table-manzanas.d.ts +2 -0
  111. package/dist/server/table-manzanas.js +36 -0
  112. package/dist/server/table-mis_encuestadores.d.ts +2 -0
  113. package/dist/server/table-mis_encuestadores.js +77 -0
  114. package/dist/server/table-mis_tareas.d.ts +2 -0
  115. package/dist/server/table-mis_tareas.js +18 -0
  116. package/dist/server/table-mis_tareas_areas.d.ts +2 -0
  117. package/dist/server/table-mis_tareas_areas.js +20 -0
  118. package/dist/server/table-modos_dm.d.ts +2 -0
  119. package/dist/server/table-modos_dm.js +28 -0
  120. package/dist/server/table-no_rea.js +38 -0
  121. package/dist/server/table-no_rea_sup.js +36 -0
  122. package/dist/server/table-operaciones.d.ts +2 -0
  123. package/dist/server/table-operaciones.js +30 -0
  124. package/dist/server/table-parametros.d.ts +2 -0
  125. package/dist/server/table-parametros.js +40 -0
  126. package/dist/server/table-permisos.d.ts +2 -0
  127. package/dist/server/table-permisos.js +31 -0
  128. package/dist/server/table-personal.d.ts +5 -0
  129. package/dist/server/table-personal.js +62 -0
  130. package/dist/server/table-personal_rol.d.ts +2 -0
  131. package/dist/server/table-personal_rol.js +42 -0
  132. package/dist/server/table-personas.d.ts +2 -0
  133. package/dist/server/table-personas.js +448 -0
  134. package/dist/server/table-personas_sup.d.ts +2 -0
  135. package/dist/server/table-personas_sup.js +93 -0
  136. package/dist/server/table-radios.d.ts +2 -0
  137. package/dist/server/table-radios.js +37 -0
  138. package/dist/server/table-rea.d.ts +2 -0
  139. package/dist/server/table-rea.js +38 -0
  140. package/dist/server/table-rea_sup.d.ts +2 -0
  141. package/dist/server/table-rea_sup.js +38 -0
  142. package/dist/server/table-recepcionistas.d.ts +2 -0
  143. package/dist/server/table-recepcionistas.js +18 -0
  144. package/dist/server/table-recuperadores.d.ts +2 -0
  145. package/dist/server/table-recuperadores.js +18 -0
  146. package/dist/server/table-roles.d.ts +2 -0
  147. package/dist/server/table-roles.js +33 -0
  148. package/dist/server/table-roles_permisos.d.ts +2 -0
  149. package/dist/server/table-roles_permisos.js +36 -0
  150. package/dist/server/table-roles_subordinados.d.ts +2 -0
  151. package/dist/server/table-roles_subordinados.js +31 -0
  152. package/dist/server/table-semanas.d.ts +2 -0
  153. package/dist/server/table-semanas.js +42 -0
  154. package/dist/server/table-sincronizaciones.d.ts +2 -0
  155. package/dist/server/table-sincronizaciones.js +30 -0
  156. package/dist/server/table-supervisores.d.ts +2 -0
  157. package/dist/server/table-supervisores.js +18 -0
  158. package/dist/server/table-tareas.d.ts +2 -0
  159. package/dist/server/table-tareas.js +48 -0
  160. package/dist/server/table-tareas_areas.d.ts +7 -0
  161. package/dist/server/table-tareas_areas.js +112 -0
  162. package/dist/server/table-tareas_proximas.d.ts +2 -0
  163. package/dist/server/table-tareas_proximas.js +48 -0
  164. package/dist/server/table-tareas_tem.d.ts +14 -0
  165. package/dist/server/table-tareas_tem.js +206 -0
  166. package/dist/server/table-tareas_tem_analisis_campo.d.ts +2 -0
  167. package/dist/server/table-tareas_tem_analisis_campo.js +31 -0
  168. package/dist/server/table-tareas_tem_fin_campo.d.ts +3 -0
  169. package/dist/server/table-tareas_tem_fin_campo.js +56 -0
  170. package/dist/server/table-tareas_tem_ingreso.d.ts +2 -0
  171. package/dist/server/table-tareas_tem_ingreso.js +31 -0
  172. package/dist/server/table-tareas_tem_procesamiento.d.ts +2 -0
  173. package/dist/server/table-tareas_tem_procesamiento.js +34 -0
  174. package/dist/server/table-tareas_tem_recepcion.d.ts +6 -0
  175. package/dist/server/table-tareas_tem_recepcion.js +59 -0
  176. package/dist/server/table-tem.d.ts +3 -0
  177. package/dist/server/table-tem.js +247 -0
  178. package/dist/server/table-tem_asignacion.d.ts +2 -0
  179. package/dist/server/table-tem_asignacion.js +50 -0
  180. package/dist/server/table-tem_borradas.d.ts +2 -0
  181. package/dist/server/table-tem_borradas.js +35 -0
  182. package/dist/server/table-usuarios.d.ts +2 -0
  183. package/dist/server/table-usuarios.js +63 -0
  184. package/dist/server/table-visitas.d.ts +2 -0
  185. package/dist/server/table-visitas.js +91 -0
  186. package/dist/server/table-visitas_sup.d.ts +2 -0
  187. package/dist/server/table-visitas_sup.js +91 -0
  188. package/dist/server/table-viviendas.d.ts +2 -0
  189. package/dist/server/table-viviendas.js +299 -0
  190. package/dist/server/types-dmencu.d.ts +114 -0
  191. package/dist/server/types-dmencu.js +34 -0
  192. package/dist/server/unlogged/tipos.d.ts +93 -41
  193. package/dist/server/unlogged/tipos.js +1 -1
  194. package/dist/test/app-para-tests.d.ts +1117 -0
  195. package/dist/test/app-para-tests.js +95 -0
  196. package/dist/test/test-ayuda.d.ts +1 -0
  197. package/dist/test/test-ayuda.js +183 -0
  198. package/dist/test/test-caches-rea.d.ts +1 -0
  199. package/dist/test/test-caches-rea.js +243 -0
  200. package/dist/test/test-helpers-casilleros.d.ts +1 -0
  201. package/dist/test/test-helpers-casilleros.js +154 -0
  202. package/dist/test/test-helpers-formulario.d.ts +1 -0
  203. package/dist/test/test-helpers-formulario.js +95 -0
  204. package/dist/test/test-impacto-rea-no-rea-en-bd.d.ts +1 -0
  205. package/dist/test/test-impacto-rea-no-rea-en-bd.js +243 -0
  206. package/dist/test/test-menu-segun-rol.d.ts +1 -0
  207. package/dist/test/test-menu-segun-rol.js +170 -0
  208. package/dist/test/test-setters-rea-no-rea.d.ts +1 -0
  209. package/dist/test/test-setters-rea-no-rea.js +95 -0
  210. package/dist/test/test.d.ts +7 -0
  211. package/dist/test/test.js +9 -2
  212. package/dist/unlogged/helpers-casilleros.d.ts +1 -1
  213. package/dist/unlogged/helpers-casilleros.js +12 -18
  214. package/dist/unlogged/helpers-formulario.d.ts +16 -0
  215. package/dist/unlogged/helpers-formulario.js +88 -0
  216. package/dist/unlogged/tipos.d.ts +20 -2
  217. package/dist/unlogged/tipos.js +1 -1
  218. package/dist/unlogged/unlogged/abrir-formulario.js +1 -1
  219. package/dist/unlogged/unlogged/bypass-formulario.d.ts +6 -42
  220. package/dist/unlogged/unlogged/bypass-formulario.js +84 -219
  221. package/dist/unlogged/unlogged/css/formulario-react.styl +9 -0
  222. package/dist/unlogged/unlogged/helpers-casilleros.js +7 -14
  223. package/dist/unlogged/unlogged/helpers-formulario.d.ts +16 -0
  224. package/dist/unlogged/unlogged/helpers-formulario.js +88 -0
  225. package/dist/unlogged/unlogged/redux-formulario.d.ts +1 -2
  226. package/dist/unlogged/unlogged/redux-formulario.js +21 -31
  227. package/dist/unlogged/unlogged/render-config.d.ts +5 -1
  228. package/dist/unlogged/unlogged/render-config.js +14 -1
  229. package/dist/unlogged/unlogged/render-formulario.d.ts +3 -6
  230. package/dist/unlogged/unlogged/render-formulario.js +71 -69
  231. package/dist/unlogged/unlogged/render-formulario.tsx +100 -57
  232. package/dist/unlogged/unlogged/render-general.d.ts +2 -0
  233. package/dist/unlogged/unlogged/render-general.js +2 -1
  234. package/dist/unlogged/unlogged/render-general.tsx +2 -1
  235. package/dist/unlogged/unlogged/render-init.d.ts +1 -0
  236. package/dist/unlogged/unlogged/render-init.js +9 -2
  237. package/dist/unlogged/unlogged/tipos.d.ts +93 -41
  238. package/dist/unlogged/unlogged/tipos.js +1 -1
  239. package/dist/unlogged/unlogged/unlogged.js +15 -2
  240. package/install/accion_cumple_condicion.sql +1 -1
  241. package/install/generador_accion_cumple_condicion.sql +2 -2
  242. package/install/tarea_cumple_condicion.sql +1 -1
  243. package/install/xcalcular_resultado_trg.sql +1 -1
  244. package/package.json +24 -18
  245. package/dist/server/server/table-no_rea copy.js +0 -38
  246. package/dist/server/server/table-no_rea_sup copy.js +0 -36
  247. package/dist/unlogged/bypass-formulario.d.ts +0 -198
  248. package/dist/unlogged/bypass-formulario.js +0 -1226
  249. package/dist/unlogged/redux-formulario.d.ts +0 -440
  250. package/dist/unlogged/redux-formulario.js +0 -324
  251. package/dist/unlogged/render-config.d.ts +0 -52
  252. package/dist/unlogged/render-config.js +0 -161
  253. package/dist/unlogged/unlogged/bypass-formulario copy.d.ts +0 -198
  254. package/dist/unlogged/unlogged/bypass-formulario copy.js +0 -1226
  255. package/dist/unlogged/unlogged/helpers.d.ts +0 -14
  256. package/dist/unlogged/unlogged/helpers.js +0 -129
  257. /package/dist/server/{server/table-no_rea copy.d.ts → table-no_rea.d.ts} +0 -0
  258. /package/dist/server/{server/table-no_rea_sup copy.d.ts → table-no_rea_sup.d.ts} +0 -0
@@ -13,12 +13,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
13
13
  if (v !== undefined) module.exports = v;
14
14
  }
15
15
  else if (typeof define === "function" && define.amd) {
16
- define(["require", "exports", "like-ar", "row-validator", "best-globals", "cast-error", "./tipos", "./render-config", "./redux-formulario"], factory);
16
+ define(["require", "exports", "like-ar", "row-validator", "best-globals", "cast-error", "./tipos", "./render-config", "./redux-formulario", "./calculos-encuesta", "./helpers-casilleros", "./helpers-formulario"], factory);
17
17
  }
18
18
  })(function (require, exports) {
19
19
  "use strict";
20
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.hayDatosByPassAlmacenados = void 0;
21
+ exports.getResumenEstadoForTarea = exports.calcularPermiteBorrarBF = exports.calcularDisabledBF = exports.calcularActualBF = exports.getFormulariosForValuePkRaiz = exports.buscarFormulariosHijos = exports.getMainFormForVivienda = exports.numberOrStringIncIfArray = exports.defOperativo = exports.getFuncionValorar = exports.getFuncionHabilitar = exports.MAXCP = exports.ultimaVaribleVivienda = exports.NO_CAMBIAR__VERIFICAR_SI_ES_NECESARIO = exports.NO_CAMBIAR__SOLO_TRAER_STATUS = exports.getDatosByPass = exports.intentarBackup = exports.crearEncuesta = exports.hayDatosByPassAlmacenados = void 0;
22
22
  exports.setCalcularComodines = setCalcularComodines;
23
23
  exports.suscribirCambioVariable = suscribirCambioVariable;
24
24
  exports.desuscribirCambioVariable = desuscribirCambioVariable;
@@ -52,10 +52,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
52
52
  exports.dispatchByPass = dispatchByPass;
53
53
  exports.miniCompiladorSQlJs = miniCompiladorSQlJs;
54
54
  exports.getFuncionCompilada = getFuncionCompilada;
55
+ exports.setCalculoReaNoRea = setCalculoReaNoRea;
55
56
  exports.verificarSorteo = verificarSorteo;
56
57
  exports.recalcularTodoElArbol = recalcularTodoElArbol;
57
58
  exports.calcularFeedbackUnidadAnalisis = calcularFeedbackUnidadAnalisis;
58
- exports.numberOrStringIncIfArray = numberOrStringIncIfArray;
59
59
  exports.calcularFeedbackHojaDeRuta = calcularFeedbackHojaDeRuta;
60
60
  exports.calcularFeedbackEncuesta = calcularFeedbackEncuesta;
61
61
  exports.calcularResumenVivienda = calcularResumenVivienda;
@@ -66,6 +66,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
66
66
  const tipos_1 = require("./tipos");
67
67
  const render_config_1 = require("./render-config");
68
68
  const redux_formulario_1 = require("./redux-formulario");
69
+ const calculos_encuesta_1 = require("./calculos-encuesta");
70
+ const helpers_casilleros_1 = require("./helpers-casilleros");
71
+ const helpers_formulario_1 = require("./helpers-formulario");
72
+ Object.defineProperty(exports, "numberOrStringIncIfArray", { enumerable: true, get: function () { return helpers_formulario_1.numberOrStringIncIfArray; } });
69
73
  var comodines = {};
70
74
  function setCalcularComodines(calcularComodines) {
71
75
  comodines.calcularComodines = calcularComodines;
@@ -583,121 +587,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
583
587
  "not": '!',
584
588
  "NOT": '!',
585
589
  };
586
- exports.helpersCasilleros = {
587
- null2zero(posibleNull) {
588
- if (posibleNull == null) {
589
- return 0;
590
- }
591
- return posibleNull;
592
- },
593
- div0err(numerador, denominador, pk) {
594
- if (denominador == 0) {
595
- throw new Error("Error en " + pk + " division por cero de " + numerador);
596
- }
597
- return numerador / denominador;
598
- },
599
- funs: {
600
- blanco(x) {
601
- return x !== 0 && !x;
602
- },
603
- hoy() {
604
- return best_globals_1.date.today().toDmy();
605
- },
606
- fecha_valida(x) {
607
- var formato_valido = /^([1-9]|0[1-9]|[12]\d|3[01])\/([1-9]|0[1-9]|1[012])\/20\d\d$/.test(x);
608
- var xDate;
609
- var conversionOk;
610
- conversionOk = true;
611
- if (formato_valido) {
612
- const [d, m, y] = x.split('/');
613
- try {
614
- xDate = new Date(`${y}/${m}/${d}`);
615
- }
616
- catch (err) {
617
- conversionOk = false;
618
- }
619
- }
620
- ;
621
- //faltaria validar que no sea una fecha futura y que sea una fecha en el rango del operativo
622
- return formato_valido && conversionOk;
623
- },
624
- mesanio_valido(x) {
625
- var formato_valido = /^([1-9]|0[1-9]|1[012])\/(19|20)\d\d$/.test(x);
626
- return formato_valido;
627
- },
628
- informado(x) {
629
- return x !== undefined && x !== null && (!(x instanceof Array) || x.length !== 0)
630
- && (!(x instanceof Object) || Object.keys(x).length !== 0);
631
- },
632
- nsnc(x) {
633
- return x == -9;
634
- },
635
- par(x) {
636
- return x % 2 == 0;
637
- },
638
- edad_mes_annio_valido(edad, mesAnnio, fechaRealizacionDDMMYYYY) {
639
- var mesesDiferencia = (d1, d2) => {
640
- var months;
641
- months = (d2.getFullYear() - d1.getFullYear()) * 12;
642
- months -= d1.getMonth();
643
- months += d2.getMonth();
644
- return months <= 0 ? 0 : months;
645
- };
646
- var partesRealizacion = fechaRealizacionDDMMYYYY.split("/");
647
- //@ts-ignore las partes corresponden a una fecha válida
648
- var today = best_globals_1.date.ymd(Number(partesRealizacion[2]), Number(partesRealizacion[1]), Number(partesRealizacion[0]));
649
- var partesMesAnnio = mesAnnio.split('/');
650
- //@ts-ignore las partes corresponden a una fecha válida
651
- var nacimiento = best_globals_1.date.ymd(Number(partesMesAnnio[1]), Number(partesMesAnnio[0]), 1);
652
- //@ts-ignore RealDate es Date y se puede restar
653
- var diferenciaMeses = mesesDiferencia(nacimiento, today);
654
- var edadDecimales = diferenciaMeses / 12; //ej 36.5
655
- return (Math.floor(edadDecimales) == edad || //misma edad
656
- edadDecimales == edad + 1 //mes de tolerancia
657
- );
658
- },
659
- //copiar_campo_ua_rama(respuestasOrigen:Respuestas[], posicion:number, variableOrigen: IdVariable, camino:string, condicion:boolean){
660
- // return condicion?(respuestasOrigen && respuestasOrigen[posicion-1] && respuestasOrigen[posicion-1][`${camino}`][variableOrigen]):null
661
- // return condicion?eval(`respuestasOrigen[${posicion-1}].`+camino+'.'+variableOrigen):null;
662
- //}
663
- /*
664
- dbo:{
665
- datoFamiliar(encu:string,hog:number,per:number, dato:string){
666
- var xpersonas=personas;
667
- return encu==enc && hog==hogar && informado(xpersonas) && per<= xpersonas.length && per>=1 && !!xpersonas[per-1][dato]? xpersonas[per-1][dato]:null
668
- },
669
- edadfamiliar(encu:string,hog:number,per:number){
670
- var xpersonas=personas;
671
- return datoFamiliar(encu:string,hog:number,per:number,'edad')
672
- },
673
- existeindividual(encu:string,hog:number,per:number){
674
- var xpersonas=personas;
675
- return encu==enc && hog==hogar && !!personas && per<= personas.length && per>=1 && !!personas[per-1]['entreaind']
676
- },
677
- existemiembro(encu:string,hog:number,per:number){
678
- var xpersonas=personas;
679
- return encu==enc && hog==hogar && !!personas && per<= personas.length && per>=1
680
- },
681
- nroconyuges(encu:string,hog:number){
682
- var xpersonas=personas
683
- return xpersonas.filter( per->per.p4==2).length
684
- },
685
- nrojefes(encu:string,hog:number,per:number){
686
- return personas.filter( per->per.p4==1).length
687
- },
688
- parentescofamiliar(encu:string,hog:number,per:number){
689
- return datoFamiliar(encu:string,hog:number,per:number,'p4')
690
- },
691
- sexofamiliar(encu:string,hog:number,per:number){
692
- var xpersonas=personas;
693
- return encu==enc && hog==hogar && !!xpersonas && per<= xpersonas.length && per>=1 && !!xpersonas[per-1].sexo? xpersonas[per-1]['sexo']:null
694
- },
695
- sitconyjefe(encu:string,hog:number){
696
- return datoFamiliar(encu:string,hog:number,1,'p5')
697
- }
698
- } */
699
- }
700
- };
701
590
  var funcionesHabilitar = {};
702
591
  var funcionesValorar = {};
703
592
  function miniCompiladorSQlJs(expresionCasiSQL) {
@@ -729,7 +618,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
729
618
  var internalFun = new Function('valores', 'helpers', 'return ' + cuerpo);
730
619
  conjuntoDeFunciones[nombreFuncionComoExpresionJs] = function (valores) {
731
620
  try {
732
- var result = internalFun(valores, exports.helpersCasilleros);
621
+ var result = internalFun(valores, helpers_casilleros_1.helpersCasilleros);
733
622
  }
734
623
  catch (err) {
735
624
  console.log('ERROR EJECUCCION EXPRESION EXTERNA ', nombreFuncionComoExpresionJs, (0, cast_error_1.expected)(err));
@@ -751,98 +640,78 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
751
640
  }
752
641
  exports.getFuncionHabilitar = getFuncionCompilada(funcionesHabilitar);
753
642
  exports.getFuncionValorar = getFuncionCompilada(funcionesValorar);
643
+ const evaluarExpresionRea = (condicionJs, respuestas) => (0, exports.getFuncionHabilitar)(condicionJs)(respuestas);
754
644
  var rowValidator = (0, row_validator_1.getRowValidator)({ getFuncionHabilitar: exports.getFuncionHabilitar, getFuncionValorar: exports.getFuncionValorar });
755
- var buscarNoReaEnRespuestas = (unidadesARecorrerPrm, unidadAnalisis, respuestas, noReasTarea, nombNoRea) => {
756
- var _a;
757
- var nrcodigo = null;
758
- var esvalor = false;
759
- var rvalor = null;
760
- var rvariable;
761
- var rnorea = null;
762
- // var result={nrcod:String, esval:Boolean};
763
- if (unidadesARecorrerPrm.includes(unidadAnalisis.unidad_analisis)) {
764
- for (let noRea of noReasTarea) { //estructura.noReas, estructura.noReasSup
765
- if (nombNoRea == 'no_rea') {
766
- var { variable, valor, no_rea } = noRea;
767
- rnorea = no_rea;
768
- rvalor = valor;
769
- rvariable = variable;
770
- }
771
- else {
772
- var { variable_sup, valor_sup, no_rea_sup } = noRea;
773
- rnorea = no_rea_sup;
774
- rvalor = valor_sup;
775
- rvariable = variable_sup;
776
- }
777
- if (respuestas[rvariable] == rvalor) {
778
- nrcodigo = rnorea; //no_rea, no_rea_sup
779
- esvalor = true;
780
- return { nrcodigo, esvalor };
781
- }
782
- else {
783
- nrcodigo = null;
784
- esvalor = false;
785
- }
786
- }
787
- }
788
- for (let ua of ((0, like_ar_1.strict)(unidadAnalisis === null || unidadAnalisis === void 0 ? void 0 : unidadAnalisis.hijas).array())) {
789
- if ((ua === null || ua === void 0 ? void 0 : ua.unidad_analisis) && respuestas[ua.unidad_analisis] instanceof Array) {
790
- 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 : [])) {
791
- let result = (0, exports.buscarNoReaEnRespuestas)(unidadesARecorrerPrm, ua, respuestasHijas, noReasTarea, nombNoRea);
792
- if (result.esvalor) {
793
- nrcodigo = result.nrcodigo;
794
- esvalor = result.esvalor;
795
- return { nrcodigo, esvalor };
796
- break;
797
- }
798
- else {
799
- nrcodigo = null;
800
- esvalor = false;
801
- // return {nrcodigo, esvalor}
802
- }
803
- }
804
- }
805
- }
806
- return { nrcodigo, esvalor };
807
- };
808
- exports.buscarNoReaEnRespuestas = buscarNoReaEnRespuestas;
809
645
  exports.defOperativo = {
810
- esNoRea: (_respuestas) => {
811
- //IMPLEMENTAR EN OPERATIVO
812
- var esNoRea = false;
813
- var codNoRea = null;
814
- return { codNoRea, esNoRea };
646
+ esNoRea: (respuestas, tarea) => {
647
+ const estructura = getEstructura();
648
+ const uaPrincipal = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => !ua.padre);
649
+ let result = {
650
+ codNoRea: null,
651
+ esNoRea: false
652
+ };
653
+ const { codigo, resultado } = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipal, respuestas, estructura.noReas, 'no_rea', tarea);
654
+ if (codigo !== null) {
655
+ result.codNoRea = codigo;
656
+ result.esNoRea = resultado;
657
+ }
658
+ return result;
815
659
  },
816
- esNoReaSup: (_respuestas) => {
817
- //IMPLEMENTAR EN OPERATIVO
818
- var esNoReaSup = false;
819
- var codNoReaSup = null;
820
- return { codNoReaSup, esNoReaSup };
660
+ esNoReaSup: (respuestas, tarea) => {
661
+ const estructura = getEstructura();
662
+ const uaPrincipal = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => !ua.padre);
663
+ let result = {
664
+ codNoReaSup: null,
665
+ esNoReaSup: false
666
+ };
667
+ const { codigo, resultado } = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipal, respuestas, estructura.noReasSup, 'no_rea_sup', tarea);
668
+ if (codigo !== null) {
669
+ result.codNoReaSup = codigo;
670
+ result.esNoReaSup = resultado;
671
+ }
672
+ return result;
821
673
  },
822
- esRealizada: (_respuestas) => {
823
- //IMPLEMENTAR EN OPERATIVO
824
- var esRea = false;
825
- var codRea = null;
826
- return { codRea, esRea };
674
+ esRealizada: (respuestas, tarea) => {
675
+ const estructura = getEstructura();
676
+ const uaPrincipal = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => !ua.padre);
677
+ let result = {
678
+ codRea: null,
679
+ esRea: false
680
+ };
681
+ const { codigo, resultado } = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipal, respuestas, estructura.reas, 'rea', tarea, evaluarExpresionRea);
682
+ if (codigo !== null) {
683
+ result.codRea = codigo;
684
+ result.esRea = resultado;
685
+ }
686
+ return result;
827
687
  },
828
- esRealizadaSup: (_respuestas) => {
829
- //IMPLEMENTAR EN OPERATIVO
830
- var esReaSup = false;
831
- var codReaSup = null;
832
- return { codReaSup, esReaSup };
688
+ esRealizadaSup: (respuestas, tarea) => {
689
+ const estructura = getEstructura();
690
+ const uaPrincipal = (0, like_ar_1.strict)(estructura.unidades_analisis).find((ua) => !ua.padre);
691
+ let result = {
692
+ codReaSup: null,
693
+ esReaSup: false
694
+ };
695
+ const { codigo, resultado } = (0, calculos_encuesta_1.buscarReaNoReaEnRespuestas)(uaPrincipal, respuestas, estructura.reasSup, 'rea_sup', tarea, evaluarExpresionRea);
696
+ if (codigo !== null) {
697
+ result.codReaSup = codigo;
698
+ result.esReaSup = resultado;
699
+ }
700
+ return result;
833
701
  },
834
702
  UAprincipal: '',
835
703
  defUA: {},
836
704
  defFor: {}
837
705
  };
838
- ///// ABAJO de esta línea no puede haber otros nombres de variables o formularios o casilleros en general
839
- var setCalculoReaNoRea = (esNoRea, esNoReaSup, esRealizada, esRealizadaSup) => {
840
- exports.defOperativo = Object.assign(Object.assign({}, exports.defOperativo), { esNoRea,
841
- esNoReaSup,
842
- esRealizada,
843
- esRealizadaSup });
844
- };
845
- exports.setCalculoReaNoRea = setCalculoReaNoRea;
706
+ // 3. Implementación unificada
707
+ function setCalculoReaNoRea(esNoReaOrFunciones, _esNoReaSup, _esRealizada, _esRealizadaSup) {
708
+ if (typeof esNoReaOrFunciones === 'function') {
709
+ console.warn("setCalculoReaNoRea: la forma antigua está deprecada, se ignoran sobrescrituras, usar setCalculoReaNoRea({ esNoRea, esNoReaSup, esRealizada, esRealizadaSup })");
710
+ }
711
+ else {
712
+ exports.defOperativo = Object.assign(Object.assign({}, exports.defOperativo), esNoReaOrFunciones);
713
+ }
714
+ }
846
715
  function num(num) {
847
716
  //@ts-ignore la gracia es meter num cuando es string
848
717
  if (isNaN(num - 0))
@@ -1012,7 +881,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
1012
881
  var pkNueva = exports.defOperativo.defUA[UAincluida].pk;
1013
882
  var conjuntoRespuestasUA = respuestas[UAincluida];
1014
883
  (0, like_ar_1.strict)(conjuntoRespuestasUA).forEach((respuestasHijo, valorPkOPosicion) => {
1015
- var valorPk = numberOrStringIncIfArray(valorPkOPosicion, conjuntoRespuestasUA);
884
+ var valorPk = (0, helpers_formulario_1.numberOrStringIncIfArray)(valorPkOPosicion, conjuntoRespuestasUA);
1016
885
  calcularFeedbackUnidadAnalisis(feedbackRowValidator, formularios, respuestasHijo, UAincluida, Object.assign(Object.assign({}, forPk), { [pkNueva]: valorPk }), Object.assign(Object.assign(Object.assign({}, respuestasAumentadas), respuestasHijo), { [pkNueva]: valorPk }), respuestas, opts);
1017
886
  });
1018
887
  }
@@ -1066,13 +935,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
1066
935
  }
1067
936
  }
1068
937
  }
1069
- function numberOrStringIncIfArray(numberOrString, object) {
1070
- // @ts-expect-error estoy usando isNaN para ver si es o no un número sumable
1071
- if (isNaN(numberOrString)) {
1072
- return numberOrString;
1073
- }
1074
- return Number(numberOrString) + (object instanceof Array ? 1 : 0);
1075
- }
1076
938
  var getMainFormForVivienda = (valuePkRaiz) => {
1077
939
  return datosByPass.informacionHdr[valuePkRaiz].tarea.main_form;
1078
940
  };
@@ -1086,7 +948,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
1086
948
  //acá hay que sanitizar porque evidentemente puede venir con hashs de encuestas sin info el datosByPass.respuestas
1087
949
  var conjuntoRespuestasUA = datosByPass.respuestas[uaDef.unidad_analisis];
1088
950
  (0, like_ar_1.beingArray)(conjuntoRespuestasUA).forEach((respuestas, valorPkOPosicion) => {
1089
- var valorPk = numberOrStringIncIfArray(valorPkOPosicion, conjuntoRespuestasUA);
951
+ var valorPk = (0, helpers_formulario_1.numberOrStringIncIfArray)(valorPkOPosicion, conjuntoRespuestasUA);
1090
952
  (0, like_ar_1.strict)(estructura.formularios).filter(f => f.casilleros.unidad_analisis == uaDef.unidad_analisis && esPrincipal(f.casilleros, valorPk)).forEach((_defF, formulario) => {
1091
953
  var forPkRaiz = { formulario, [uaDef.pk_agregada]: valorPk };
1092
954
  calcularFeedback(respuestas, forPkRaiz, {});
@@ -1155,10 +1017,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
1155
1017
  configSorteoFormulario.id_formulario_individual == formulario);
1156
1018
  exports.calcularPermiteBorrarBF = calcularPermiteBorrarBF;
1157
1019
  function calcularResumenVivienda(forPkRaiz, feedbackRowValidator, respuestas) {
1158
- var { codRea, esRea } = exports.defOperativo.esRealizada(respuestas);
1159
- var { codNoRea, esNoRea } = exports.defOperativo.esNoRea(respuestas);
1160
- var { codReaSup, esReaSup } = exports.defOperativo.esRealizadaSup(respuestas);
1161
- var { codNoReaSup, esNoReaSup } = exports.defOperativo.esNoReaSup(respuestas);
1020
+ var tarea = datosByPass.informacionHdr[forPkRaiz[estructura.pkAgregadaUaPpal]].tarea.tarea;
1021
+ var { codRea, esRea } = exports.defOperativo.esRealizada(respuestas, tarea);
1022
+ var { codNoRea, esNoRea } = exports.defOperativo.esNoRea(respuestas, tarea);
1023
+ var { codReaSup, esReaSup } = exports.defOperativo.esRealizadaSup(respuestas, tarea);
1024
+ var { codNoReaSup, esNoReaSup } = exports.defOperativo.esNoReaSup(respuestas, tarea);
1162
1025
  var formsFeedback = (0, exports.getFormulariosForValuePkRaiz)(forPkRaiz[estructura.pkAgregadaUaPpal]);
1163
1026
  var configuracionSorteoFormulario = estructura.configSorteo && estructura.configSorteo[(0, exports.getMainFormForVivienda)(forPkRaiz[estructura.pkAgregadaUaPpal])];
1164
1027
  var habilitacionBotonFormulario = estructura.habilitacionBotonFormulario;
@@ -1214,17 +1077,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
1214
1077
  minResumen = 'incompleto';
1215
1078
  }
1216
1079
  }
1217
- //TODO ARREGLAR ESTE HORROR, GENERALIZAR
1218
1080
  var tarea = datosByPass.informacionHdr[forPkRaiz[estructura.pkAgregadaUaPpal]].tarea.tarea;
1219
1081
  var resumenEstado;
1220
- var resumenEstadoSup = 'vacio';
1082
+ var resumenEstadoSup;
1083
+ //seteo calculo o dejo lo que estaba en respuestas para el otro caso
1221
1084
  if (tarea == 'supe') {
1222
1085
  resumenEstadoSup = esNoReaSup ? 'no rea' : minResumen;
1223
- //para que coloree bien en la hdr del DM (luego en bbdd no se guarda)
1224
- resumenEstado = resumenEstadoSup;
1086
+ resumenEstado = respuestas['resumenEstado'];
1225
1087
  }
1226
1088
  else {
1227
1089
  resumenEstado = esNoRea ? 'no rea' : minResumen;
1090
+ resumenEstadoSup = respuestas['resumenEstadoSup'];
1228
1091
  }
1229
1092
  var resultado = {
1230
1093
  resumenEstado,
@@ -1236,5 +1099,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
1236
1099
  };
1237
1100
  return resultado;
1238
1101
  }
1102
+ const getResumenEstadoForTarea = (respuestasRaiz, tarea) => tarea == 'supe' ? respuestasRaiz.resumenEstadoSup : respuestasRaiz.resumenEstado;
1103
+ exports.getResumenEstadoForTarea = getResumenEstadoForTarea;
1239
1104
  });
1240
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnlwYXNzLWZvcm11bGFyaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdW5sb2dnZWQvYnlwYXNzLWZvcm11bGFyaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBc0NBLG9EQUVDO0lBV0QsMERBWUM7SUFFRCw4REFLQztJQUVELDBEQXFCQztJQU1ELG9EQUVDO0lBRUQsNEZBRUM7SUFzQ0QsMERBRUM7SUFFRCxvREFJQztJQXNCRCw0Q0FJQztJQWdCRCxzQ0FVQztJQUVELHdDQVVDO0lBV0QsMERBS0M7SUFFRCw0QkFFQztJQUVELHNDQUVDO0lBa0NELDhDQUlDO0lBTUQsMENBaURDO0lBRUQsZ0ZBdUNDO0lBRUQsNERBb0VDO0lBRUQsMENBUUM7SUFFRCw0Q0FRQztJQWtCRCxnREFDQztJQWdGRCxnRUFpQ0M7SUFPRCxrRUF1QkM7SUFFRCxzREFHQztJQUVELHNEQUVDO0lBRUQsMERBRUM7SUFFRCxvREFFQztJQUVELDhEQU9DO0lBRUQsMERBT0M7SUFFRCw0REFnQkM7SUFHRCx3Q0FLQztJQW9KRCxrREFnQkM7SUFFRCxrREEwQkM7SUFzSEQsMENBa0lDO0lBaUNELHNEQUlDO0lBRUQsd0VBZ0ZDO0lBRUQsNERBTUM7SUFNRCxnRUFpQkM7SUFFRCw0REFTQztJQXlGRCwwREFnR0M7SUFoOENELHFDQUF1RDtJQUV2RCxpREFBb0c7SUFFcEcsK0NBQStEO0lBQy9ELDJDQUFzQztJQUV0QyxtQ0FzQmlCO0lBRWpCLG1EQUFrRDtJQUNsRCx5REFBdUQ7SUFFdkQsSUFBSSxTQUFTLEdBQUcsRUFFZixDQUFBO0lBRUQsU0FBZ0Isb0JBQW9CLENBQUMsaUJBQXlDO1FBQzFFLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQTtJQUNuRCxDQUFDO0lBU0QsSUFBSSwyQkFBMkIsR0FBZ0MsRUFBRSxDQUFDO0lBRWxFLFNBQWdCLHVCQUF1QixDQUFDLFFBQWdDLEVBQUUsU0FB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LENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBcUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDL0csSUFBSSxhQUE0QixDQUFDO1FBQ2pDLElBQUksZ0JBQWdCLEdBQWtCLE9BQU8sQ0FBQztRQUM5QyxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNsQixnQkFBZ0IsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFBO1lBQ3JELHFFQUFxRTtZQUNyRSxhQUFhLEdBQUcsZ0JBQWdCLENBQUE7UUFDcEMsQ0FBQzthQUFNLENBQUM7WUFDSixhQUFhLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtRQUNuRCxDQUFDO1FBQ0QsSUFBSSxTQUFTLEdBQXFCO1lBQzlCLGFBQWE7WUFDYixnQkFBZ0I7WUFDaEIsTUFBTTtZQUNOLFFBQVE7WUFDUixTQUFTO1lBQ1QsV0FBVztTQUNkLENBQUE7UUFDRCxPQUFPLFNBQVMsQ0FBQTtJQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3RyaWN0IGFzIGxpa2VBciwgYmVpbmdBcnJheSB9IGZyb20gXCJsaWtlLWFyXCI7XHJcblxyXG5pbXBvcnQgeyBnZXRSb3dWYWxpZGF0b3IsIEZvcm1TdHJ1Y3R1cmVTdGF0ZSwgT3BjaW9uZXNSb3dWYWxpZGF0b3IsIEZlZWRiYWNrIH0gZnJvbSBcInJvdy12YWxpZGF0b3JcIjtcclxuXHJcbmltcG9ydCB7IGRhdGUsIGNvbXBhcmVGb3JPcmRlciwgY29hbGVzY2UgfSBmcm9tIFwiYmVzdC1nbG9iYWxzXCI7XHJcbmltcG9ydCB7IGV4cGVjdGVkIH0gZnJvbSBcImNhc3QtZXJyb3JcIjtcclxuXHJcbmltcG9ydCB7XHJcbiAgICBFc3RydWN0dXJhLFxyXG4gICAgRm9yUGssIEZvclBrUmFpeixcclxuICAgIElkRmluLCBJZEZvcm11bGFyaW8sIElkUHJlZ3VudGEsIElkVGFyZWEsIElkVmFyaWFibGUsXHJcbiAgICBJZFVuaWRhZEFuYWxpc2lzLFxyXG4gICAgSW5mb0Zvcm11bGFyaW8sXHJcbiAgICBQbGFpbkZvclBrLCBSZXNwdWVzdGFzLCBSZXNwdWVzdGFzUmFpeiwgUmVzdW1lbkVzdGFkbyxcclxuICAgIFZhbG9yLCBWaXNpdGEsXHJcbiAgICB0b1BsYWluRm9yUGssXHJcbiAgICBVbmlkYWRBbmFsaXNpcyxcclxuICAgIEZvcm11bGFyaW8sXHJcbiAgICBDb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpbyxcclxuICAgIERhdG9zQnlQYXNzUGVyc2lzdGlibGVzLFxyXG4gICAgSWRFbmMsXHJcbiAgICBEZWZPcGVyYXRpdm8sXHJcbiAgICBpdGVyYXRvcixcclxuICAgIENvbmZpZ3VyYWNpb25IYWJpbGl0YXJCb3RvbkZvcm11bGFyaW8sXHJcbiAgICBDYW1wb1BrLFxyXG4gICAgSWRDYXJnYSxcclxuICAgIENhcmdhLFxyXG4gICAgQ2FtcG9Qa1JhaXosXHJcbiAgICBWYWx1ZVBrUmFpelxyXG59IGZyb20gXCIuL3RpcG9zXCI7XHJcblxyXG5pbXBvcnQgeyBnZXRGb3JtUmVuZGVyZXIgfSBmcm9tIFwiLi9yZW5kZXItY29uZmlnXCI7XHJcbmltcG9ydCB7IGFkYXB0YXJFc3RydWN0dXJhIH0gZnJvbSBcIi4vcmVkdXgtZm9ybXVsYXJpb1wiO1xyXG5cclxudmFyIGNvbW9kaW5lcyA9IHt9IGFzIHtcclxuICAgIGNhbGN1bGFyQ29tb2RpbmVzPzogKGZvclBrOiBGb3JQaykgPT4gdm9pZFxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0Q2FsY3VsYXJDb21vZGluZXMoY2FsY3VsYXJDb21vZGluZXM6IChmb3JQazogRm9yUGspID0+IHZvaWQpIHtcclxuICAgIGNvbW9kaW5lcy5jYWxjdWxhckNvbW9kaW5lcyA9IGNhbGN1bGFyQ29tb2RpbmVzXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIExpc3RlbmVyQ2FtYmlvVmFyaWFibGUgPSAodmFyaWFibGU6IHN0cmluZywgdmFsb3I6IGFueSwgZm9yUGs/OiBGb3JQaywgcmVzcHVlc3Rhc0F1bWVudGFkYXM/OiBSZXNwdWVzdGFzKSA9PiB2b2lkO1xyXG5cclxudHlwZSBTdXNjcmlwY2lvbkNhbWJpb1ZhcmlhYmxlID0ge1xyXG4gICAgbGlzdGVuZXI6IExpc3RlbmVyQ2FtYmlvVmFyaWFibGU7XHJcbiAgICB2YXJpYWJsZXM/OiBTZXQ8c3RyaW5nPjtcclxufTtcclxuXHJcbnZhciBzdXNjcmlwY2lvbmVzQ2FtYmlvVmFyaWFibGU6IFN1c2NyaXBjaW9uQ2FtYmlvVmFyaWFibGVbXSA9IFtdO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN1c2NyaWJpckNhbWJpb1ZhcmlhYmxlKGxpc3RlbmVyOiBMaXN0ZW5lckNhbWJpb1ZhcmlhYmxlLCB2YXJpYWJsZXM/OiBzdHJpbmcgfCBzdHJpbmdbXSk6ICgpID0+IHZvaWQge1xyXG4gICAgY29uc3QgdmFyc1NldCA9IHZhcmlhYmxlc1xyXG4gICAgICAgID8gbmV3IFNldChBcnJheS5pc0FycmF5KHZhcmlhYmxlcykgPyB2YXJpYWJsZXMgOiBbdmFyaWFibGVzXSlcclxuICAgICAgICA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHN1YjogU3VzY3JpcGNpb25DYW1iaW9WYXJpYWJsZSA9IHsgbGlzdGVuZXIsIHZhcmlhYmxlczogdmFyc1NldCB9O1xyXG4gICAgc3VzY3JpcGNpb25lc0NhbWJpb1ZhcmlhYmxlLnB1c2goc3ViKTtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBzdXNjcmlwY2lvbmVzQ2FtYmlvVmFyaWFibGUuaW5kZXhPZihzdWIpO1xyXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIHN1c2NyaXBjaW9uZXNDYW1iaW9WYXJpYWJsZS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZXN1c2NyaWJpckNhbWJpb1ZhcmlhYmxlKGxpc3RlbmVyOiBMaXN0ZW5lckNhbWJpb1ZhcmlhYmxlKSB7XHJcbiAgICBjb25zdCBpbmRleCA9IHN1c2NyaXBjaW9uZXNDYW1iaW9WYXJpYWJsZS5maW5kSW5kZXgocyA9PiBzLmxpc3RlbmVyID09PSBsaXN0ZW5lcik7XHJcbiAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHN1c2NyaXBjaW9uZXNDYW1iaW9WYXJpYWJsZS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbm90aWZpY2FyQ2FtYmlvVmFyaWFibGUodmFyaWFibGU6IHN0cmluZywgdmFsb3I6IGFueSwgZm9yUGs/OiBGb3JQaywgcmVzcHVlc3Rhc0F1bWVudGFkYXM/OiBSZXNwdWVzdGFzKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1c2NyaXBjaW9uZXNDYW1iaW9WYXJpYWJsZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHsgbGlzdGVuZXIsIHZhcmlhYmxlcyB9ID0gc3VzY3JpcGNpb25lc0NhbWJpb1ZhcmlhYmxlW2ldO1xyXG4gICAgICAgIGlmICh2YXJpYWJsZXMpIHtcclxuICAgICAgICAgICAgbGV0IGFwbGljYSA9IHZhcmlhYmxlcy5oYXModmFyaWFibGUpO1xyXG4gICAgICAgICAgICBpZiAoIWFwbGljYSAmJiByZXNwdWVzdGFzQXVtZW50YWRhcykge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIHZhcmlhYmxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2IGluIHJlc3B1ZXN0YXNBdW1lbnRhZGFzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwbGljYSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWFwbGljYSkgY29udGludWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxpc3RlbmVyKHZhcmlhYmxlLCB2YWxvciwgZm9yUGssIHJlc3B1ZXN0YXNBdW1lbnRhZGFzKTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZW4gbGlzdGVuZXIgZGUgY2FtYmlvIGRlIHZhcmlhYmxlJywgZXJyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbnZhciBlc3BlY2lhbGVzID0ge30gYXMge1xyXG4gICAgY2FsY3VsYXJWYXJpYWJsZXM/OiAocmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6LCBmb3JQazogRm9yUGspID0+IHZvaWRcclxuICAgIGNhbGN1bGFyVmFyaWFibGVzRXNwZWNpZmljYXNPcGVyYXRpdm8/OiAocmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6LCBmb3JQazogRm9yUGspID0+IHZvaWRcclxufVxyXG5leHBvcnQgZnVuY3Rpb24gc2V0Q2FsY3VsYXJWYXJpYWJsZXMoY2FsY3VsYXJWYXJpYWJsZXM6IChyZXNwdWVzdGFzUmFpejogUmVzcHVlc3Rhc1JhaXosIGZvclBrOiBGb3JQaykgPT4gdm9pZCkge1xyXG4gICAgZXNwZWNpYWxlcy5jYWxjdWxhclZhcmlhYmxlcyA9IGNhbGN1bGFyVmFyaWFibGVzXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWxjdWxhclZhcmlhYmxlc0VzcGVjaWZpY2FzT3BlcmF0aXZvKGNhbGN1bGFyVmFyaWFibGVzRXNwZWNpZmljYXNPcGVyYXRpdm86IChyZXNwdWVzdGFzUmFpejogUmVzcHVlc3Rhc1JhaXosIGZvclBrOiBGb3JQaykgPT4gdm9pZCkge1xyXG4gICAgZXNwZWNpYWxlcy5jYWxjdWxhclZhcmlhYmxlc0VzcGVjaWZpY2FzT3BlcmF0aXZvID0gY2FsY3VsYXJWYXJpYWJsZXNFc3BlY2lmaWNhc09wZXJhdGl2b1xyXG59XHJcblxyXG50eXBlIERhdG9zQnlQYXNzID0gRGF0b3NCeVBhc3NQZXJzaXN0aWJsZXMgJiB7XHJcbiAgICBmZWVkYmFja1Jvd1ZhbGlkYXRvcjogeyAgLy8gbm8gc2UgcGVyc2lzdGVcclxuICAgICAgICBbZm9ybXVsYXJpbyBpbiBQbGFpbkZvclBrXTogRm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsIFZhbG9yLCBJZEZpbj4gLy8gcmVzdWx0YWRvIGRlbCByb3dWYWxpZGF0b3IgcGFyYSBlc3RhZG8uZm9yUGtcclxuICAgIH1cclxuICAgIGRpcnR5OiBib29sZWFuXHJcbn07XHJcblxyXG52YXIgZGF0b3NCeVBhc3MgPSB7fSBhcyBEYXRvc0J5UGFzc1xyXG5cclxuZXhwb3J0IGNvbnN0IGhheURhdG9zQnlQYXNzQWxtYWNlbmFkb3MgPSAoKSA9PiBkYXRvc0J5UGFzcyAmJiBPYmplY3Qua2V5cyhkYXRvc0J5UGFzcykubGVuZ3RoID4gMFxyXG5cclxuaW50ZXJmYWNlIFJlY3Qge1xyXG4gICAgdG9wOiBudW1iZXI7XHJcbiAgICBsZWZ0OiBudW1iZXI7XHJcbiAgICB3aWR0aDogbnVtYmVyO1xyXG4gICAgaGVpZ2h0OiBudW1iZXI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFJlY3QoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBSZWN0IHtcclxuICAgIHZhciByZWN0OiBSZWN0ID0geyB0b3A6IDAsIGxlZnQ6IDAsIHdpZHRoOiBlbGVtZW50Lm9mZnNldFdpZHRoLCBoZWlnaHQ6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0IH07XHJcbiAgICB2YXIgY3VycmVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gZWxlbWVudDtcclxuICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGwpIHtcclxuICAgICAgICByZWN0LnRvcCArPSBjdXJyZW50Lm9mZnNldFRvcDtcclxuICAgICAgICByZWN0LmxlZnQgKz0gY3VycmVudC5vZmZzZXRMZWZ0O1xyXG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm9mZnNldFBhcmVudCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVjdDtcclxufVxyXG5cclxuLy9AdHMtaWdub3JlIGFycmFuY2EgZW4gYmxhbmNvXHJcbnZhciBlc3RydWN0dXJhOiBFc3RydWN0dXJhID0gbnVsbCBhcyBFc3RydWN0dXJhO1xyXG5cclxubGV0IHBlcnNpc3RpckRhdG9zQnlQYXNzSW50ZXJubzogKGRicHA6IERhdG9zQnlQYXNzUGVyc2lzdGlibGVzKSA9PiBQcm9taXNlPGFueT4gPSAoKSA9PiB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3BlcnNpc3RpckRhdG9zQnlQYXNzIFNJTiBERUZJTklSJylcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlcnNpc3RpckRhdG9zQnlQYXNzKHBlcnNpc3RpckRhdG9zQnlQYXNzRnVuOiB0eXBlb2YgcGVyc2lzdGlyRGF0b3NCeVBhc3MpIHtcclxuICAgIHBlcnNpc3RpckRhdG9zQnlQYXNzSW50ZXJubyA9IHBlcnNpc3RpckRhdG9zQnlQYXNzRnVuO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGVyc2lzdGlyRGF0b3NCeVBhc3MoZGJwcDogRGF0b3NCeVBhc3NQZXJzaXN0aWJsZXMpIHtcclxuICAgIGF3YWl0IGdldEZvcm1SZW5kZXJlcigpLnBlcnNpc3RpckRhdG9zKGRicHApO1xyXG4gICAgZGF0b3NCeVBhc3MuZGlydHkgPSBmYWxzZVxyXG4gICAgcmVmcmVzY2FyTWFyY2FEaXJ0eSgpO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgY3JlYXJFbmN1ZXN0YSA9IChpZENhcmdhOiBJZENhcmdhLCBjYWxsQmFjazogKGZvclBrUmFpejogRm9yUGtSYWl6KSA9PiB2b2lkKSA9PiB7XHJcbiAgICBjb25zdCBORVhUX0FVVE9fVkFMVUVfUEtfUkFJWiA9IGdldEZvcm1SZW5kZXJlcigpLmdldFVsdGltb1ZhbG9yUGtSYWl6KCkgfHwgJy0xJztcclxuICAgIGNvbnN0IGVzdHJ1Y3R1cmEgPSBnZXRFc3RydWN0dXJhKCk7XHJcbiAgICBnZXRGb3JtUmVuZGVyZXIoKS5zZXRVbHRpbW9WYWxvclBrUmFpeigoTnVtYmVyKE5FWFRfQVVUT19WQUxVRV9QS19SQUlaKSAtIDEpLnRvU3RyaW5nKCkpO1xyXG4gICAgZGF0b3NCeVBhc3MucmVzcHVlc3Rhc1tlc3RydWN0dXJhLnVhUHBhbF1bTkVYVF9BVVRPX1ZBTFVFX1BLX1JBSVogYXMgdW5rbm93biBhcyBJZEVuY10gPSB7fSBhcyBSZXNwdWVzdGFzUmFpejtcclxuICAgIGRhdG9zQnlQYXNzLmluZm9ybWFjaW9uSGRyW05FWFRfQVVUT19WQUxVRV9QS19SQUlaIGFzIHVua25vd24gYXMgSWRFbmNdID0ge1xyXG4gICAgICAgIC4uLmVzdHJ1Y3R1cmEuZGVmYXVsdEluZm9ybWFjaW9uSGRyLFxyXG4gICAgICAgIHRlbTogeyAuLi5lc3RydWN0dXJhLmRlZmF1bHRJbmZvcm1hY2lvbkhkci50ZW0gfVxyXG4gICAgfTtcclxuICAgIGRhdG9zQnlQYXNzLmluZm9ybWFjaW9uSGRyW05FWFRfQVVUT19WQUxVRV9QS19SQUlaIGFzIHVua25vd24gYXMgSWRFbmNdLnRlbS5jYXJnYSA9IGlkQ2FyZ2E7XHJcbiAgICBjYWxjdWxhckZlZWRiYWNrSG9qYURlUnV0YSgpO1xyXG4gICAgcGVyc2lzdGlyRGF0b3NCeVBhc3MoZGF0b3NCeVBhc3MpLnRoZW4oXHJcbiAgICAgICAgKCkgPT4gY2FsbEJhY2soe1xyXG4gICAgICAgICAgICBmb3JtdWxhcmlvOiBlc3RydWN0dXJhLmRlZmF1bHRJbmZvcm1hY2lvbkhkci50YXJlYS5tYWluX2Zvcm0sXHJcbiAgICAgICAgICAgIFtlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdOiBOdW1iZXIoTkVYVF9BVVRPX1ZBTFVFX1BLX1JBSVopIGFzIFZhbHVlUGtSYWl6XHJcbiAgICAgICAgfSBhcyBGb3JQa1JhaXopXHJcbiAgICApLy9ubyBxdWl0YXIgZWwgY2FzdGVvIHBvcnF1ZSB2aWVuZSBjb21vIHRleHRvIHkgbmVjZXNpdG8gcXVlIHNlYSBuw7ptZXJvXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0RW5jb2xhckJhY2t1cChcclxuICAgIGVuY29sYXJCYWNrdXBGdW46ICh0b2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLCBmb3JQa1JhaXo6IEZvclBrUmFpeiwgcmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXMpID0+IHZvaWRcclxuKSB7XHJcbiAgICBlbmNvbGFyQmFja3VwID0gZW5jb2xhckJhY2t1cEZ1blxyXG59XHJcblxyXG5sZXQgZW5jb2xhckJhY2t1cDogKHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZvclBrUmFpejogRm9yUGtSYWl6LCByZXNwdWVzdGFzUmFpejogUmVzcHVlc3RhcykgPT4gdm9pZCA9ICgpID0+IHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcIlNJTiBFU1BFQ0lGSUNBUiBlbmNvbGFyQmFja3VwXCIpXHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgaW50ZW50YXJCYWNrdXAgPSAoZm9yUGs6IEZvclBrKSA9PiB7XHJcbiAgICB2YXIgeyByZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6IH0gPSByZXNwdWVzdGFzRm9yUGsoZm9yUGssIHRydWUpXHJcbiAgICB2YXIgdG9rZW4gPSBkYXRvc0J5UGFzcy50b2tlbjtcclxuICAgIGlmICh0b2tlbikge1xyXG4gICAgICAgIGVuY29sYXJCYWNrdXAodG9rZW4sIGZvclBrUmFpeiwgcmVzcHVlc3Rhc1JhaXopO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIm5vIGhheSB0b2tlbiwgbm8gc2UgcHVkbyBoYWNlciBlbCBiYWNrdXBcIilcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEVzdHJ1Y3R1cmEoZXN0cnVjdHVyYUFDYXJnYXI6IEVzdHJ1Y3R1cmEpIHtcclxuICAgIGVzdHJ1Y3R1cmEgPSBhZGFwdGFyRXN0cnVjdHVyYShlc3RydWN0dXJhQUNhcmdhcik7XHJcbiAgICBkZWZPcGVyYXRpdm8uVUFwcmluY2lwYWwgPSBsaWtlQXIoZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpcykuZmluZCh1YSA9PiAhIXVhLnByaW5jaXBhbCk/LnVuaWRhZF9hbmFsaXNpcyFcclxuICAgIGRlZk9wZXJhdGl2by5kZWZGb3IgPSBsaWtlQXIoZXN0cnVjdHVyYS5mb3JtdWxhcmlvcykubWFwKGYgPT4gKHsgaGVybWFubzogZi5jYXNpbGxlcm9zLmhlcm1hbm8gfSkpLnBsYWluKClcclxuICAgIGRlZk9wZXJhdGl2by5kZWZVQSA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5tYXAoKHVhRGVmLCB1YSkgPT4gKHtcclxuICAgICAgICBwazogdWFEZWYucGtfYWdyZWdhZGEgYXMgSWRWYXJpYWJsZSxcclxuICAgICAgICBpbmNsdWlkYXM6IGxpa2VBcih1YURlZi5oaWphcykua2V5cygpLFxyXG4gICAgICAgIGlkc0ZvcjogbGlrZUFyKGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3MpLmZpbHRlcihmID0+IGYuY2FzaWxsZXJvcy51bmlkYWRfYW5hbGlzaXMgPT0gdWEpLmtleXMoKVxyXG4gICAgfSkpLnBsYWluKClcclxuICAgIHJldHVybiBlc3RydWN0dXJhO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0RGF0b3NCeVBhc3MoXHJcbiAgICBudWV2b1BhcXVldGU6IERhdG9zQnlQYXNzUGVyc2lzdGlibGVzICYgeyBkaXJ0eT86IGJvb2xlYW4gfVxyXG4pIHtcclxuICAgIGRhdG9zQnlQYXNzID0ge1xyXG4gICAgICAgIGRpcnR5OiBmYWxzZSxcclxuICAgICAgICAuLi5udWV2b1BhcXVldGUsXHJcbiAgICAgICAgZmVlZGJhY2tSb3dWYWxpZGF0b3I6IHt9IGFzIERhdG9zQnlQYXNzW1wiZmVlZGJhY2tSb3dWYWxpZGF0b3JcIl1cclxuICAgIH07XHJcblxyXG4gICAgY2FsY3VsYXJGZWVkYmFja0hvamFEZVJ1dGEoKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBnZXREYXRvc0J5UGFzcyA9ICgpID0+IGRhdG9zQnlQYXNzXHJcblxyXG5mdW5jdGlvbiBvYmpldG9WYWNpbyhvOiBvYmplY3QpIHtcclxuICAgIGZvciAodmFyIGsgaW4gbykge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmVlZGJhY2tSb3dWYWxpZGF0b3IoKSB7XHJcbiAgICBpZiAoIWRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yIHx8IG9iamV0b1ZhY2lvKGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yKSkge1xyXG4gICAgICAgIGNhbGN1bGFyRmVlZGJhY2tIb2phRGVSdXRhKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3I7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREaXJ0eSgpIHtcclxuICAgIHJldHVybiBkYXRvc0J5UGFzcy5kaXJ0eVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXN0cnVjdHVyYSgpIHtcclxuICAgIHJldHVybiBlc3RydWN0dXJhO1xyXG59XHJcblxyXG50eXBlIEVsZW1lbnRvc1JlZ2lzdHJhYmxlcyA9IEhUTUxEaXZFbGVtZW50IHwgSFRNTEJ1dHRvbkVsZW1lbnQgfCBIVE1MSW5wdXRFbGVtZW50O1xyXG5cclxudHlwZSBEaXJlY3RGdW5jdGlvbjxULCBSZXN1bHQ+ID0gKHJlc3B1ZXN0YXNBdW1lbnRhZGFzOiBSZXNwdWVzdGFzLCBmZWVkYmFja0Zvcm06IEZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+LCBlbGVtZW50bzogVCxcclxuICAgIGZlZWRiYWNrQWxsOiB7XHJcbiAgICAgICAgW2Zvcm11bGFyaW8gaW4gUGxhaW5Gb3JQa106IEZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+IC8vIHJlc3VsdGFkbyBkZWwgcm93VmFsaWRhdG9yIHBhcmEgZXN0YWRvLmZvclBrXHJcbiAgICB9LFxyXG4gICAgZXN0cnVjdHVyYTogRXN0cnVjdHVyYVxyXG4pID0+IFJlc3VsdFxyXG5cclxudHlwZSBSZWdpc3Ryb0VsZW1lbnRvPFQgZXh0ZW5kcyBFbGVtZW50b3NSZWdpc3RyYWJsZXM+ID0ge1xyXG4gICAgaWQ6IHN0cmluZyxcclxuICAgIGZ1bjogRGlyZWN0RnVuY3Rpb248VCwgYW55PixcclxuICAgIHZhcmlhYmxlPzogSWRWYXJpYWJsZSxcclxuICAgIGZvclBrPzogRm9yUGssXHJcbn0gJiAoe1xyXG4gICAgcHJvcDoga2V5b2YgVFxyXG4gICAgZnVuOiBEaXJlY3RGdW5jdGlvbjxULCBUW2tleW9mIFRdPiAvLyBMbyBxdWUgcmV0b3JuYSBsYSBmdW4oY2nDs24pIHNlIHVzYSBwYXJhIGxhIHByb3AoZXJ0eSkgZGVsIGVsZW1lbnRvXHJcbn0gfCB7XHJcbiAgICBhdHRyOiBzdHJpbmdcclxuICAgIGZ1bjogRGlyZWN0RnVuY3Rpb248VCwgc3RyaW5nPiAvLyBMbyBxdWUgcmV0b3JuYSBsYSBmdW4oY2nDs24pIHNlIHVzYSBwYXJhIGVsIHZhbG9yIGRlbCBhdHRyKGlidXRvKVxyXG59IHwge1xyXG4gICAgc3R5bGU6IGtleW9mIENTU1N0eWxlRGVjbGFyYXRpb25cclxuICAgIGZ1bjogRGlyZWN0RnVuY3Rpb248VCwgc3RyaW5nPiAvLyBMbyBxdWUgcmV0b3JuYSBsYSBmdW4oY2nDs24pIHNlIHVzYSBwYXJhIGVsIHZhbG9yIGRlbCBzdHlsZVxyXG59IHwge1xyXG4gICAgZGlyZWN0OiB0cnVlXHJcbiAgICBmdW46IERpcmVjdEZ1bmN0aW9uPFQsIHZvaWQ+IC8vIExhIGZ1bmNpw7NuIHZhIGEgdG9jYXIgZGlyZWN0YW1lbnRlIGVsIGVsZW1lbnRvIHkgaGFjZXIgdG9kbyBsbyBxdWUgdGVuZ2EgcXVlIGhhY2VyXHJcbn0pXHJcblxyXG50eXBlIFJlZ2lzdHJvRWxlbWVudG9zPFQgZXh0ZW5kcyBFbGVtZW50b3NSZWdpc3RyYWJsZXM+ID0geyBbaWQ6IHN0cmluZ106IFJlZ2lzdHJvRWxlbWVudG88VD4gJiB7IGVsZW1lbnRvPzogVCB9IH07XHJcblxyXG52YXIgcmVnaXN0cm9FbGVtZW50b3NHbG9iYWwgPSB7fSBhcyBSZWdpc3Ryb0VsZW1lbnRvczxFbGVtZW50b3NSZWdpc3RyYWJsZXM+O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdHJhckVsZW1lbnRvPFQgZXh0ZW5kcyBFbGVtZW50b3NSZWdpc3RyYWJsZXM+KGRlZjogUmVnaXN0cm9FbGVtZW50bzxUPikge1xyXG4gICAgLy8gQHRzLWlnbm9yZSBTw60sIHBvZHLDrWEgc2VyIHF1ZSBsb3MgdGlwb3MgZGUgVCBzZWFuIGRpc3RpbnRvcywgcGVybyB2YW4gYSBzZXIgY29oZXJlbnRlc1xyXG4gICAgdmFyIHJlZ2lzdHJvRWxlbWVudG9zOiBSZWdpc3Ryb0VsZW1lbnRvczxUPiA9IHJlZ2lzdHJvRWxlbWVudG9zR2xvYmFsO1xyXG4gICAgcmVnaXN0cm9FbGVtZW50b3NbZGVmLmlkXSA9IGRlZjtcclxufVxyXG5cclxudHlwZSBSZXNwdWVzdGFzRm9yUGtDb211biA9IHsgcmVzcHVlc3RhczogUmVzcHVlc3RhcywgcmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXo6IEZvclBrUmFpeiwgdW5pZGFkQW5hbGlzaXM6IFVuaWRhZEFuYWxpc2lzIH1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZXNwdWVzdGFzRm9yUGsoZm9yUGs6IEZvclBrKTogUmVzcHVlc3Rhc0ZvclBrQ29tdW5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc3B1ZXN0YXNGb3JQayhmb3JQazogRm9yUGssIGNvbkF1bWVudGFkYXM6IHRydWUsIGFncmVnYXJTaUZhbHRhPzogYm9vbGVhbik6IFJlc3B1ZXN0YXNGb3JQa0NvbXVuICYgeyByZXNwdWVzdGFzQXVtZW50YWRhczogUmVzcHVlc3RhcyB9XHJcbmV4cG9ydCBmdW5jdGlvbiByZXNwdWVzdGFzRm9yUGsoZm9yUGs6IEZvclBrLCBjb25BdW1lbnRhZGFzPzogYm9vbGVhbiwgYWdyZWdhclNpRmFsdGE/OiBib29sZWFuKTogUmVzcHVlc3Rhc0ZvclBrQ29tdW4gJiB7IHJlc3B1ZXN0YXNBdW1lbnRhZGFzPzogUmVzcHVlc3RhcyB9IHtcclxuICAgIHZhciByZXNwdWVzdGFzQXVtZW50YWRhcyA9IHt9IGFzIFJlc3B1ZXN0YXM7XHJcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGxvIHF1ZSBzb2JyYXIgZGUgcmVzcHVlc3RhcyBubyBtZSBpbXBvcnRhLi4uXHJcbiAgICB2YXIgcmVzcHVlc3RhcyA9IGRhdG9zQnlQYXNzLnJlc3B1ZXN0YXMgYXMgUmVzcHVlc3RhcztcclxuICAgIHZhciByZXNwdWVzdGFzUmFpejogUmVzcHVlc3Rhc1JhaXo7XHJcbiAgICB2YXIgZm9yUGtSYWl6OiBGb3JQaztcclxuICAgIHZhciB1bmlkYWRfYW5hbGlzaXM6IElkVW5pZGFkQW5hbGlzaXMgfCB1bmRlZmluZWQgPSBlc3RydWN0dXJhLmZvcm11bGFyaW9zW2ZvclBrLmZvcm11bGFyaW9dLmNhc2lsbGVyb3MudW5pZGFkX2FuYWxpc2lzXHJcbiAgICB2YXIgZm9yUGtBcGlsYWRhID0gZm9yUGs7XHJcbiAgICB2YXIgcGlsYTogW3VuaWRhZF9hbmFsaXNpczogSWRVbmlkYWRBbmFsaXNpcywgdWFEZWY6IFVuaWRhZEFuYWxpc2lzLCBmb3JQazogRm9yUGtdW10gPSBbXTtcclxuICAgIHdoaWxlICh1bmlkYWRfYW5hbGlzaXMpIHtcclxuICAgICAgICB2YXIgdWFEZWY6IFVuaWRhZEFuYWxpc2lzID0gZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpc1t1bmlkYWRfYW5hbGlzaXNdO1xyXG4gICAgICAgIHBpbGEucHVzaChbdW5pZGFkX2FuYWxpc2lzLCB1YURlZiwgZm9yUGtBcGlsYWRhXSk7XHJcbiAgICAgICAgZm9yUGtBcGlsYWRhID0geyAuLi5mb3JQa0FwaWxhZGEgfTtcclxuICAgICAgICBkZWxldGUgZm9yUGtBcGlsYWRhW3VhRGVmLnBrX2FncmVnYWRhXVxyXG4gICAgICAgIHVuaWRhZF9hbmFsaXNpcyA9IHVhRGVmLnBhZHJlXHJcbiAgICB9XHJcbiAgICB3aGlsZSAocGlsYS5sZW5ndGgpIHtcclxuICAgICAgICBbdW5pZGFkX2FuYWxpc2lzLCB1YURlZiwgZm9yUGtBcGlsYWRhXSA9IHBpbGEucG9wKCkhXHJcbiAgICAgICAgdmFyIHZhbG9yUGtPUG9zaWNpb24gPSBmb3JQa0FwaWxhZGFbdWFEZWYucGtfYWdyZWdhZGFdO1xyXG4gICAgICAgIGlmICh2YWxvclBrT1Bvc2ljaW9uID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZhbHRhIHVuIHZhbG9yIHBhcmEgJHtKU09OLnN0cmluZ2lmeSh1YURlZi5wa19hZ3JlZ2FkYSl9YClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlc3B1ZXN0YXNbdW5pZGFkX2FuYWxpc2lzXSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNbdW5pZGFkX2FuYWxpc2lzXSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcmVzcHVlc3Rhc0FudGVyaW9yID0gcmVzcHVlc3RhcztcclxuICAgICAgICBsZXQgcG9zaWNpb24gPSByZXNwdWVzdGFzW3VuaWRhZF9hbmFsaXNpc10gaW5zdGFuY2VvZiBBcnJheSA/IHZhbG9yUGtPUG9zaWNpb24gLSAxIDogdmFsb3JQa09Qb3NpY2lvblxyXG4gICAgICAgIHJlc3B1ZXN0YXMgPSByZXNwdWVzdGFzW3VuaWRhZF9hbmFsaXNpc11bcG9zaWNpb25dO1xyXG4gICAgICAgIGlmIChyZXNwdWVzdGFzID09IG51bGwpIHtcclxuICAgICAgICAgICAgaWYgKGFncmVnYXJTaUZhbHRhKSB7XHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzID0ge30gYXMgUmVzcHVlc3Rhc1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc0FudGVyaW9yW3VuaWRhZF9hbmFsaXNpc11bcG9zaWNpb25dID0gcmVzcHVlc3Rhc1xyXG4gICAgICAgICAgICAgICAgcGVyc2lzdGlyRGF0b3NCeVBhc3MoZGF0b3NCeVBhc3MpOyAvLyBPSk8gQVNZTkMgREVTQ09OVFJPTEFEQVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBleGlzdGUgZWwgZWxlbWVudG8gJyR7cG9zaWNpb259JyBlbiBsYSB1bmlkYWRfYW5hbGlzaXMgJyR7dW5pZGFkX2FuYWxpc2lzfSdgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmb3JQa1JhaXogfHw9IGZvclBrQXBpbGFkYTtcclxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFPDqSBxdWUgZXMgcmHDrXogcG9yIGPDs21vIGVzdG95IHJldm9sdmllbmRvIGxhIHBpbGFcclxuICAgICAgICByZXNwdWVzdGFzUmFpeiB8fD0gcmVzcHVlc3RhcztcclxuICAgICAgICBpZiAoY29uQXVtZW50YWRhcykge1xyXG4gICAgICAgICAgICByZXNwdWVzdGFzQXVtZW50YWRhcyA9IHsgLi4ucmVzcHVlc3Rhc0F1bWVudGFkYXMsIC4uLnJlc3B1ZXN0YXMsIFt1YURlZi5wa19hZ3JlZ2FkYV06IHZhbG9yUGtPUG9zaWNpb24gfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgcmVzcHVlc3RhcywgcmVzcHVlc3Rhc0F1bWVudGFkYXMsXHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBTw6kgcXVlIGxhIHBpbGEgdGllbmUgYWwgbWVub3MgdW4gZWxlbWVudG8gcG9yIGxvIHRhbnRvIGVzdG8gZXN0w6EgbGxlbm8gc2VndXJvLiBcclxuICAgICAgICByZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6LCB1bmlkYWRBbmFsaXNpczogdWFEZWZcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHZvbGNhZG9JbmljaWFsRWxlbWVudG9zUmVnaXN0cmFkb3MoZm9yUGtSYWl6OiBGb3JQa1JhaXopIHtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXNBdW1lbnRhZGFzIH0gPSByZXNwdWVzdGFzRm9yUGsoZm9yUGtSYWl6LCB0cnVlKVxyXG4gICAgdmFyIHJlZ2lzdHJvRWxlbWVudG9zID0gcmVnaXN0cm9FbGVtZW50b3NHbG9iYWw7XHJcbiAgICB2YXIgcGxhaW5Gb3JQayA9IHRvUGxhaW5Gb3JQayhmb3JQa1JhaXopXHJcbiAgICB2YXIgcm93VmFsaWRhdG9yID0gZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3JbcGxhaW5Gb3JQa107XHJcbiAgICBmb3IgKHZhciBpZCBpbiByZWdpc3Ryb0VsZW1lbnRvcykge1xyXG4gICAgICAgIHZhciBkZWYgPSByZWdpc3Ryb0VsZW1lbnRvc1tpZF07XHJcbiAgICAgICAgaWYgKGRlZi5lbGVtZW50bykge1xyXG4gICAgICAgICAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnMoZGVmLmVsZW1lbnRvKSkge1xyXG4gICAgICAgICAgICAgICAgZGVmLmVsZW1lbnRvID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZGVmLmVsZW1lbnRvKSB7XHJcbiAgICAgICAgICAgIGRlZi5lbGVtZW50byA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRlZi5pZCkgYXMgRWxlbWVudG9zUmVnaXN0cmFibGVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWRlZi5lbGVtZW50bykge1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnQlVTQ0FORE8gZWwgZWxlbWVudG8gcmVnaXN0cmFkbyAnLGlkLCdubyBlc3TDoSBlbiBlbCBET00nKVxyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHZhbHVlID0gZGVmLmZ1bihyZXNwdWVzdGFzQXVtZW50YWRhcywgcm93VmFsaWRhdG9yLCBkZWYuZWxlbWVudG8sIGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yLCBlc3RydWN0dXJhKTtcclxuICAgICAgICBpZiAoJ3Byb3AnIGluIGRlZikge1xyXG4gICAgICAgICAgICBzZXRWYWxvckRpc3RpbnRvKGRlZi5lbGVtZW50bywgZGVmLnByb3AsIHZhbHVlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoJ2F0dHInIGluIGRlZikge1xyXG4gICAgICAgICAgICBzZXRBdHRyRGlzdGludG8oZGVmLmVsZW1lbnRvLCBkZWYuYXR0ciwgdmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgnc3R5bGUnIGluIGRlZikge1xyXG4gICAgICAgICAgICBzZXRWYWxvckRpc3RpbnRvKGRlZi5lbGVtZW50by5zdHlsZSwgZGVmLnN0eWxlLCB2YWx1ZSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAocm93VmFsaWRhdG9yLmFjdHVhbCkge1xyXG4gICAgICAgIHZhciB7IHRvcCwgYm90dG9tIH0gPSBjYWxjdWxhckVsZW1lbnRvRW5mb2NhZG8ocm93VmFsaWRhdG9yLmFjdHVhbCk7XHJcbiAgICAgICAgaWYgKHRvcCAhPSBudWxsICYmIGJvdHRvbSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZhYi1hY3Rpdm8tYXJyaWJhJykuZWxUb3BWaXNpYmlsaXphciA9IHRvcDtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmFiLWFjdGl2by1hYmFqbycpLmVsQm90dG9tVmlzaWJpbGl6YXIgPSBib3R0b207XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXJFbGVtZW50b0VuZm9jYWRvKGlkVmFyaWFibGU6IElkVmFyaWFibGUgfCBJZEZpbikge1xyXG4gICAgdmFyIGVsZW1lbnRvVmFyaWFibGVBRW5mb2NhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkVmFyaWFibGUgPT0gJ2ZpbicgPyBgYm90b24tdm9sdmVyLTJgIDogYHZhci0ke2lkVmFyaWFibGV9YClcclxuICAgICAgICB8fCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZFZhcmlhYmxlKTtcclxuICAgIHZhciBlbGVtZW50byA9IGVsZW1lbnRvVmFyaWFibGVBRW5mb2NhcjtcclxuICAgIHZhciBNQVJHRU5fU0NST0xMID0gNjQ7XHJcbiAgICB2YXIgYWx0b1BhbnRhbGxhID0gd2luZG93LmlubmVySGVpZ2h0ICogMC43IC0gTUFSR0VOX1NDUk9MTDtcclxuICAgIHZhciBlbGVtZW50b0VudGVybzogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDsgLy8gZXMgZWwgZWxlbWVudG8gcXVlIHZhIGEgZW50YXIgZW50ZXJvIGVuIHBhbnRhbGxhLCBkZWZpbmUgZWwgYm90dG9tXHJcbiAgICB2YXIgcmVjdEVsZW1lbnRvRW50ZXJvOiBSZWN0IHwgbnVsbCA9IG51bGw7XHJcbiAgICB2YXIgZWxlbWVudG9TdXBlcmlvcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDsgLy8gZXMgZWwgZWxlbWVudG8gcXVlIHZhIGEgbW9zdHJhcnNlIGRlc2RlIGFycmliYSBhdW5xdWUgbm8gZW50cmUgZW50ZXJvLCBkZWZpbmUgZWwgdG9wXHJcbiAgICB2YXIgcmVjdEVsZW1lbnRvU3VwZXJpb3I6IFJlY3R8IG51bGwgPSBudWxsO1xyXG4gICAgd2hpbGUgKGVsZW1lbnRvICE9IG51bGwpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIChlbGVtZW50by5jbGFzc0xpc3QuY29udGFpbnMoJ3ZhcmlhYmxlJylcclxuICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygnbXVsdGlwbGUnKVxyXG4gICAgICAgICAgICAgICAgfHwgZWxlbWVudG8uY2xhc3NMaXN0LmNvbnRhaW5zKCdwcmVndW50YScpXHJcbiAgICAgICAgICAgICAgICB8fCBlbGVtZW50by5jbGFzc0xpc3QuY29udGFpbnMoJ2Nvbmp1bnRvcHJlZ3VudGFzJylcclxuICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygnc2VjY2lvbi1ib3Rvbi1mb3JtdWxhcmlvJylcclxuICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygnYm90b25mb3JtdWxhcmlvJylcclxuICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygnYm90b24tdm9sdmVyJylcclxuICAgICAgICAgICAgKSAmJiBlbGVtZW50by5vZmZzZXRIZWlnaHQgPiAwXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50b1N1cGVyaW9yID09IG51bGwgJiYgZWxlbWVudG8uY2xpZW50SGVpZ2h0IDwgYWx0b1BhbnRhbGxhKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50b0VudGVybyA9IGVsZW1lbnRvO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRvRW50ZXJvID09IG51bGwpIGVsZW1lbnRvRW50ZXJvID0gZWxlbWVudG87XHJcbiAgICAgICAgICAgICAgICBpZiAocmVjdEVsZW1lbnRvRW50ZXJvID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50b1N1cGVyaW9yID0gZWxlbWVudG9FbnRlcm9cclxuICAgICAgICAgICAgICAgICAgICByZWN0RWxlbWVudG9FbnRlcm8gPSBnZXRSZWN0KGVsZW1lbnRvRW50ZXJvISlcclxuICAgICAgICAgICAgICAgICAgICByZWN0RWxlbWVudG9TdXBlcmlvciA9IHJlY3RFbGVtZW50b0VudGVybztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZhciByZWN0ID0gZ2V0UmVjdChlbGVtZW50byk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVjdEVsZW1lbnRvRW50ZXJvLnRvcCArIHJlY3RFbGVtZW50b0VudGVyby5oZWlnaHQgLSByZWN0LnRvcCA8IGFsdG9QYW50YWxsYSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRvU3VwZXJpb3IgPSBlbGVtZW50bztcclxuICAgICAgICAgICAgICAgICAgICByZWN0RWxlbWVudG9TdXBlcmlvciA9IHJlY3Q7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRvID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbGVtZW50byA9IGVsZW1lbnRvPy5wYXJlbnRFbGVtZW50ID8/IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAoZWxlbWVudG9TdXBlcmlvciA9PSBudWxsKSB7XHJcbiAgICAgICAgZWxlbWVudG9TdXBlcmlvciA9IGVsZW1lbnRvRW50ZXJvO1xyXG4gICAgfVxyXG4gICAgdmFyIHJlc3VsdDoge1xyXG4gICAgICAgIGVsZW1lbnRvSW5wdXRWYXJpYWJsZT86IEhUTUxFbGVtZW50IHwgbnVsbFxyXG4gICAgICAgIHRvcD86IG51bWJlciB8IG51bGxcclxuICAgICAgICBib3R0b20/OiBudW1iZXIgfCBudWxsXHJcbiAgICAgICAgZW5mb2NhZG8/OiBib29sZWFuIHwgbnVsbFxyXG4gICAgICAgIGRlc2VuZm9xdWU/OiBzdHJpbmcgfCBudWxsXHJcbiAgICB9ID0ge307XHJcbiAgICBpZiAoZWxlbWVudG9FbnRlcm8gIT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChyZWN0RWxlbWVudG9FbnRlcm8gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZWN0RWxlbWVudG9FbnRlcm8gPSBnZXRSZWN0KGVsZW1lbnRvRW50ZXJvKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHQuZWxlbWVudG9JbnB1dFZhcmlhYmxlID0gZWxlbWVudG9WYXJpYWJsZUFFbmZvY2FyO1xyXG4gICAgICAgIHZhciB0b3AgPSAocmVjdEVsZW1lbnRvU3VwZXJpb3IgPz8gcmVjdEVsZW1lbnRvRW50ZXJvKS50b3AgLSBNQVJHRU5fU0NST0xMO1xyXG4gICAgICAgIHJlc3VsdC50b3AgPSB0b3A7XHJcbiAgICAgICAgcmVzdWx0LmJvdHRvbSA9IHJlY3RFbGVtZW50b0VudGVyby50b3AgKyByZWN0RWxlbWVudG9FbnRlcm8uaGVpZ2h0O1xyXG4gICAgICAgIGlmICh0b3AgPCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5kZXNlbmZvcXVlID0gJ2FycmliYSc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChyZWN0RWxlbWVudG9FbnRlcm8udG9wICsgcmVjdEVsZW1lbnRvRW50ZXJvLmhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgKyBhbHRvUGFudGFsbGEpIHtcclxuICAgICAgICAgICAgcmVzdWx0LmRlc2VuZm9xdWUgPSAnYWJham8nO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5lbmZvY2FkbyA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0QXR0ckRpc3RpbnRvPE4gZXh0ZW5kcyBzdHJpbmc+KFxyXG4gICAgb2JqZXRvOiB7IHNldEF0dHJpYnV0ZTogKG5hbWU6IE4sIHZhbG9yOiBzdHJpbmcpID0+IHZvaWQsIGdldEF0dHJpYnV0ZTogKG5hbWU6IE4pID0+IHN0cmluZyB8IG51bGwgfSxcclxuICAgIG5hbWU6IE4sXHJcbiAgICB2YWxvcjogc3RyaW5nXHJcbikge1xyXG4gICAgaWYgKG9iamV0byAmJiBvYmpldG8uZ2V0QXR0cmlidXRlKG5hbWUpICE9IHZhbG9yKSB7XHJcbiAgICAgICAgb2JqZXRvLnNldEF0dHJpYnV0ZShuYW1lLCB2YWxvcik7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRWYWxvckRpc3RpbnRvPFQgZXh0ZW5kcyB7fSwgTiBleHRlbmRzIGtleW9mIFQ+KFxyXG4gICAgb2JqZXRvOiBULFxyXG4gICAgbmFtZTogTixcclxuICAgIHZhbG9yOiBUW05dXHJcbikge1xyXG4gICAgaWYgKG9iamV0b1tuYW1lXSAhPSB2YWxvcikge1xyXG4gICAgICAgIG9iamV0b1tuYW1lXSA9IHZhbG9yO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjYWxjdWxhclZhcmlhYmxlc0JvdG9uRm9ybXVsYXJpbyhmb3JQazogRm9yUGspIHtcclxuICAgIGlmIChlc3RydWN0dXJhLmhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbyAmJiAhZGF0b3NCeVBhc3M/LnNvbG9MZWN0dXJhKSB7XHJcbiAgICAgICAgdmFyIHsgcmVzcHVlc3RhcyB9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrKTtcclxuICAgICAgICBsaWtlQXIoZXN0cnVjdHVyYS5oYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8pXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKChjb25maWdCb3RvbkZvcm11bGFyaW8sIGlkRm9ybXVsYXJpbykgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3BVQSA9IHJlc3B1ZXN0YXNbZXN0cnVjdHVyYS5oYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW9baWRGb3JtdWxhcmlvXS51bmlkYWRfYW5hbGlzaXNdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BVQSAhPSBudWxsICYmIHJlc3BVQSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25maWdCb3RvbkZvcm11bGFyaW8uaGFiaWxpdGFyX2FncmVnYXJfbGlzdG8pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1snJEIuJyArIGlkRm9ybXVsYXJpbyBhcyBJZFZhcmlhYmxlXSA9ICdvayc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG59O1xyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25faWRfcHJlZ3VudGEoX3BheWxvYWQ6IHsgcHJlZ3VudGE6IElkUHJlZ3VudGEsIGZvclBrOiBGb3JQayB9LCBfZGF0b3NCeVBhc3M6IERhdG9zQnlQYXNzKSB7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBOT19DQU1CSUFSX19TT0xPX1RSQUVSX1NUQVRVUyA9IFN5bWJvbCgnTk9fQ0FNQklBUl9TT0xPX1RSQUVSX1NUQVRVUycpXHJcbmV4cG9ydCBjb25zdCBOT19DQU1CSUFSX19WRVJJRklDQVJfU0lfRVNfTkVDRVNBUklPID0gU3ltYm9sKCdOT19DQU1CSUFSX1ZFUklGSUNBUl9TSV9FU19ORUNFU0FSSU8nKVxyXG5cclxuZnVuY3Rpb24gcmVmcmVzY2FyTWFyY2FEaXJ0eSgpIHtcclxuICAgIHZhciBib3RvbkdyYWJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2F2ZS1idXR0b25cIikgYXMgSFRNTEJ1dHRvbkVsZW1lbnQ7XHJcbiAgICBpZiAoYm90b25HcmFiYXIpIHtcclxuICAgICAgICBpZiAoYm90b25HcmFiYXIuZGlzYWJsZWQgIT09ICFkYXRvc0J5UGFzcy5kaXJ0eSkge1xyXG4gICAgICAgICAgICBib3RvbkdyYWJhci5kaXNhYmxlZCA9ICFkYXRvc0J5UGFzcy5kaXJ0eTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFwbGljYXJDYW1iaW9VbmFSZXNwdWVzdGEoXHJcbiAgICBmb3JQazogRm9yUGssXHJcbiAgICByZXNwdWVzdGFzOiBSZXNwdWVzdGFzLFxyXG4gICAgdmFyaWFibGU6IElkVmFyaWFibGUsXHJcbiAgICByZXNwdWVzdGFJbnB1dDogVmFsb3JcclxuKSB7XHJcbiAgICB2YXIgcmVzcHVlc3RhID0gcmVzcHVlc3RhSW5wdXQ7XHJcbiAgICB2YXIgdmFsb3JBbnRlcmlvciA9IHJlc3B1ZXN0YXNbdmFyaWFibGVdO1xyXG4gICAgaWYgKHJlc3B1ZXN0YSA9PT0gJycpIHtcclxuICAgICAgICByZXNwdWVzdGEgPSBudWxsO1xyXG4gICAgfSBlbHNlIGlmIChlc3RydWN0dXJhLmZvcm11bGFyaW9zW2ZvclBrLmZvcm11bGFyaW9dLmVzdHJ1Y3R1cmFSb3dWYWxpZGF0b3IudmFyaWFibGVzW3ZhcmlhYmxlXT8udGlwbyA9PSAnbnVtZXJvJykge1xyXG4gICAgICAgIGlmIChyZXNwdWVzdGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXNwdWVzdGEgPSBOdW1iZXIocmVzcHVlc3RhKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBzaSBlcyB1biBmYWxzeSAoMCA9PSBmYWxzZSkgdGVuZ28gcXVlIGNvbXBhcmFyIGNvbiAhPT1cclxuICAgIHZhciByZWNlbnRNb2RpZmllZCA9IHJlc3B1ZXN0YSA/IHZhbG9yQW50ZXJpb3IgIT0gcmVzcHVlc3RhIDogdmFsb3JBbnRlcmlvciAhPT0gcmVzcHVlc3RhO1xyXG4gICAgaWYgKHJlY2VudE1vZGlmaWVkKSB7XHJcbiAgICAgICAgcmVzcHVlc3Rhc1t2YXJpYWJsZV0gPSByZXNwdWVzdGEgPz8gbnVsbDsgLy8gY2FtYmlvIHVuZGVmaW5lZCBwb3IgbnVsbFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgcmVjZW50TW9kaWZpZWQsIHZhbG9yQW50ZXJpb3IsIHJlc3B1ZXN0YVByb2Nlc2FkYTogcmVzcHVlc3RhIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlZnJlc2NhcllSZWNhbGN1bGFyQnlwYXNzKFxyXG4gICAgZm9yUGs6IEZvclBrLFxyXG4gICAgcmVzcHVlc3RhczogUmVzcHVlc3RhcyxcclxuICAgIHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpeixcclxuICAgIGZvclBrUmFpejogRm9yUGtSYWl6LFxyXG4gICAgdmFyaWFibGVzTW9kaWZpY2FkYXM6IElkVmFyaWFibGVbXSxcclxuICAgIHJlY2VudE1vZGlmaWVkOiBib29sZWFuXHJcbikge1xyXG4gICAgcmVjYWxjdWxhclRvZG9FbEFyYm9sKHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXopO1xyXG4gICAgcmVjYWxjdWxhckNvbW9kaW5lc0ZvclBrKGZvclBrKTtcclxuICAgIGlmIChlc3RydWN0dXJhLmNvbmZpZ1NvcnRlbyAmJiAhZGF0b3NCeVBhc3M/LnNvbG9MZWN0dXJhKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YXJpYWJsZXNNb2RpZmljYWRhcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2ZXJpZmljYXJTb3J0ZW8oe1xyXG4gICAgICAgICAgICAgICAgY29uZmlndXJhY2lvblNvcnRlbzogZXN0cnVjdHVyYS5jb25maWdTb3J0ZW9bZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYShmb3JQa1tlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdKV0sXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzLFxyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1JhaXosXHJcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUFjdHVhbDogdmFyaWFibGVzTW9kaWZpY2FkYXNbaV0sXHJcbiAgICAgICAgICAgICAgICBmb3JQazogZm9yUGtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZGF0b3NCeVBhc3MuZGlydHkgPSBkYXRvc0J5UGFzcy5kaXJ0eSB8fCByZWNlbnRNb2RpZmllZDtcclxuICAgIHJlc3B1ZXN0YXNSYWl6LiRkaXJ0eSA9IHJlc3B1ZXN0YXNSYWl6LiRkaXJ0eSB8fCByZWNlbnRNb2RpZmllZDtcclxuICAgIHJlZnJlc2Nhck1hcmNhRGlydHkoKTtcclxuICAgIGNhbGN1bGFyRmVlZGJhY2socmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeiwgeyBhdXRvSW5ncmVzbzogdHJ1ZSB9KTtcclxuICAgIHZhciBmZWVkYmFja1JvdyA9IGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yW3RvUGxhaW5Gb3JQayhmb3JQayldO1xyXG4gICAgY2FsY3VsYXJWYXJpYWJsZXNCb3RvbkZvcm11bGFyaW8oZm9yUGspO1xyXG4gICAgdm9sY2Fkb0luaWNpYWxFbGVtZW50b3NSZWdpc3RyYWRvcyhmb3JQayk7XHJcbiAgICBjb25zdCB7IHJlc3B1ZXN0YXNBdW1lbnRhZGFzIH0gPSByZXNwdWVzdGFzRm9yUGsoZm9yUGssIHRydWUpO1xyXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YXJpYWJsZXNNb2RpZmljYWRhcy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIHZhciB2ID0gdmFyaWFibGVzTW9kaWZpY2FkYXNbal07XHJcbiAgICAgICAgbm90aWZpY2FyQ2FtYmlvVmFyaWFibGUodiBhcyBzdHJpbmcsIHJlc3B1ZXN0YXNBdW1lbnRhZGFzW3ZdLCBmb3JQaywgcmVzcHVlc3Rhc0F1bWVudGFkYXMpO1xyXG4gICAgfVxyXG4gICAgcGVyc2lzdGlyRGF0b3NCeVBhc3MoZGF0b3NCeVBhc3MpOyAvLyBPSk8gQVNZTkMgREVTQ09OVFJPTEFEQVxyXG4gICAgcmV0dXJuIGZlZWRiYWNrUm93O1xyXG59XHJcblxyXG5mdW5jdGlvbiByZWNhbGN1bGFyQ29tb2RpbmVzRm9yUGsoZm9yUGs6IEZvclBrKSB7XHJcbiAgICBpZiAoY29tb2RpbmVzLmNhbGN1bGFyQ29tb2RpbmVzKSB7XHJcbiAgICAgICAgY29tb2RpbmVzLmNhbGN1bGFyQ29tb2RpbmVzKGZvclBrKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFjY2lvbl9yZWdpc3RyYXJfcmVzcHVlc3RhKHBheWxvYWQ6IHtcclxuICAgIGZvclBrOiBGb3JQayxcclxuICAgIHZhcmlhYmxlOiBJZFZhcmlhYmxlIHwgdHlwZW9mIE5PX0NBTUJJQVJfX1NPTE9fVFJBRVJfU1RBVFVTLFxyXG4gICAgcmVzcHVlc3RhOiBWYWxvciB8IHR5cGVvZiBOT19DQU1CSUFSX19WRVJJRklDQVJfU0lfRVNfTkVDRVNBUklPXHJcbn0sIF9kYXRvc0J5UGFzczogRGF0b3NCeVBhc3MpIHtcclxuICAgIGxldCB0b2tlbiA9ICdBVkVSSUdVQVIgVE9ETyc7XHJcbiAgICBsZXQgeyBmb3JQaywgcmVzcHVlc3RhLCB2YXJpYWJsZSB9ID0gcGF5bG9hZDtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXMsIHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXogfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQayk7XHJcbiAgICB2YXIgdW5pZGFkX2FuYWxpc2lzID0gZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1tmb3JQay5mb3JtdWxhcmlvXTtcclxuICAgIHZhciByZWNlbnRNb2RpZmllZCA9IGZhbHNlO1xyXG4gICAgdmFyIHZhbG9yQW50ZXJpb3IgPSB2YXJpYWJsZSAhPSBOT19DQU1CSUFSX19TT0xPX1RSQUVSX1NUQVRVUyA/IHJlc3B1ZXN0YXNbdmFyaWFibGVdIDogbnVsbDtcclxuICAgIHZhciBmZWVkYmFja1JvdyA9IGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yW3RvUGxhaW5Gb3JQayhmb3JQayldO1xyXG4gICAgdmFyIHNpZ3VpZW50ZVZhcmlhYmxlOiBJZFZhcmlhYmxlIHwgSWRGaW4gfCBudWxsIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIGlmIChyZXNwdWVzdGEgIT09IE5PX0NBTUJJQVJfX1ZFUklGSUNBUl9TSV9FU19ORUNFU0FSSU8gJiYgdmFyaWFibGUgIT0gTk9fQ0FNQklBUl9fU09MT19UUkFFUl9TVEFUVVMpIHtcclxuICAgICAgICB2YXIgcmVzQ2FtYmlvID0gYXBsaWNhckNhbWJpb1VuYVJlc3B1ZXN0YShmb3JQaywgcmVzcHVlc3RhcywgdmFyaWFibGUsIHJlc3B1ZXN0YSk7XHJcbiAgICAgICAgcmVjZW50TW9kaWZpZWQgPSByZXNDYW1iaW8ucmVjZW50TW9kaWZpZWQ7XHJcbiAgICAgICAgaWYgKCFyZWNlbnRNb2RpZmllZCkge1xyXG4gICAgICAgICAgICBzaWd1aWVudGVWYXJpYWJsZSA9IGZlZWRiYWNrUm93LmZlZWRiYWNrW3ZhcmlhYmxlXT8uc2lndWllbnRlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFyaWFibGUgIT0gTk9fQ0FNQklBUl9fU09MT19UUkFFUl9TVEFUVVMgJiYgKHJlY2VudE1vZGlmaWVkIHx8IE5PX0NBTUJJQVJfX1ZFUklGSUNBUl9TSV9FU19ORUNFU0FSSU8gJiYgZmVlZGJhY2tSb3cuYXV0b0luZ3Jlc2FkYXM/Llt2YXJpYWJsZV0pKSB7XHJcbiAgICAgICAgZmVlZGJhY2tSb3cgPSByZWZyZXNjYXJZUmVjYWxjdWxhckJ5cGFzcyhmb3JQaywgcmVzcHVlc3RhcywgcmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeiwgW3ZhcmlhYmxlXSwgcmVjZW50TW9kaWZpZWQpO1xyXG4gICAgICAgIHNpZ3VpZW50ZVZhcmlhYmxlID0gdmFyaWFibGU7XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBzaWd1aWVudGVWYXJpYWJsZSA9IGZlZWRiYWNrUm93LmZlZWRiYWNrW3NpZ3VpZW50ZVZhcmlhYmxlXT8uc2lndWllbnRlO1xyXG4gICAgICAgIH0gd2hpbGUgKHZhbG9yQW50ZXJpb3IgPT0gbnVsbCAmJiByZWNlbnRNb2RpZmllZCAmJiBzaWd1aWVudGVWYXJpYWJsZSAhPSBudWxsICYmIHNpZ3VpZW50ZVZhcmlhYmxlICE9ICdmaW4nICYmIGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3NbZm9yUGsuZm9ybXVsYXJpb10uZXN0cnVjdHVyYVJvd1ZhbGlkYXRvci52YXJpYWJsZXNbc2lndWllbnRlVmFyaWFibGVdLmZ1bmNpb25BdXRvSW5ncmVzYXIpO1xyXG4gICAgICAgIGlmIChzaWd1aWVudGVWYXJpYWJsZSA9PSBudWxsICYmIGZlZWRiYWNrUm93LmZlZWRiYWNrW3ZhcmlhYmxlXT8uZXN0YWRvID09ICd2YWxpZGEnKSB7XHJcbiAgICAgICAgICAgIHNpZ3VpZW50ZVZhcmlhYmxlID0gJ2Zpbic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgcmVjZW50TW9kaWZpZWQsIHNpZ3VpZW50ZVZhcmlhYmxlLCB2YXJpYWJsZUFjdHVhbDogZmVlZGJhY2tSb3cuYWN0dWFsIH07XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFJlZ2lzdHJvUmVzcHVlc3RhU2ltcGxlID0ge1xyXG4gICAgdmFyaWFibGU6IElkVmFyaWFibGUsXHJcbiAgICByZXNwdWVzdGE6IFZhbG9yXHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX3JlZ2lzdHJhcl9yZXNwdWVzdGFzKHBheWxvYWQ6IHtcclxuICAgIGZvclBrOiBGb3JQayxcclxuICAgIHJlc3B1ZXN0YXM6IFJlZ2lzdHJvUmVzcHVlc3RhU2ltcGxlW11cclxufSwgX2RhdG9zQnlQYXNzOiBEYXRvc0J5UGFzcykge1xyXG4gICAgbGV0IHsgZm9yUGssIHJlc3B1ZXN0YXM6IGxpc3RhUmVzcHVlc3RhcyB9ID0gcGF5bG9hZDtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXMsIHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXogfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQayk7XHJcbiAgICB2YXIgcmVjZW50TW9kaWZpZWRBbnkgPSBmYWxzZTtcclxuICAgIHZhciB2YXJpYWJsZXNNb2RpZmljYWRhczogSWRWYXJpYWJsZVtdID0gW107XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0YVJlc3B1ZXN0YXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YXIgaXRlbSA9IGxpc3RhUmVzcHVlc3Rhc1tpXTtcclxuICAgICAgICB2YXIgcmVzQ2FtYmlvID0gYXBsaWNhckNhbWJpb1VuYVJlc3B1ZXN0YShmb3JQaywgcmVzcHVlc3RhcywgaXRlbS52YXJpYWJsZSwgaXRlbS5yZXNwdWVzdGEpO1xyXG4gICAgICAgIGlmIChyZXNDYW1iaW8ucmVjZW50TW9kaWZpZWQpIHtcclxuICAgICAgICAgICAgcmVjZW50TW9kaWZpZWRBbnkgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YXJpYWJsZXNNb2RpZmljYWRhcy5wdXNoKGl0ZW0udmFyaWFibGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVjZW50TW9kaWZpZWRBbnkgJiYgdmFyaWFibGVzTW9kaWZpY2FkYXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJlZnJlc2NhcllSZWNhbGN1bGFyQnlwYXNzKGZvclBrLCByZXNwdWVzdGFzLCByZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6LCB2YXJpYWJsZXNNb2RpZmljYWRhcywgcmVjZW50TW9kaWZpZWRBbnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHJlY2VudE1vZGlmaWVkOiByZWNlbnRNb2RpZmllZEFueSB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX3JlZ2lzdHJhcl9ub3RhKHBheWxvYWQ6IHsgZm9yUGtSYWl6OiBGb3JQa1JhaXosIHRhcmVhOiBJZFRhcmVhLCBub3RhOiBzdHJpbmcgfCBudWxsIH0sIF9kYXRvc0J5UGFzczogRGF0b3NCeVBhc3MpIHtcclxuICAgIGxldCB7IGZvclBrUmFpeiwgdGFyZWEsIG5vdGEgfSA9IHBheWxvYWQ7XHJcbiAgICBjb25zb2xlLmxvZyhcIkZBTFRBIC8vIFRPRE9cIilcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFjY2lvbl9hZ3JlZ2FyX3Zpc2l0YShwYXlsb2FkOiB7IGZvclBrUmFpejogRm9yUGtSYWl6LCBvYnNlcnZhY2lvbmVzOiBzdHJpbmcgfCBudWxsIH0sIF9kYXRvc0J5UGFzczogRGF0b3NCeVBhc3MpIHtcclxuICAgIGxldCB7IGZvclBrUmFpeiwgb2JzZXJ2YWNpb25lcyB9ID0gcGF5bG9hZDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFjY2lvbl9tb2RpZmljYXJfdmlzaXRhKHBheWxvYWQ6IHsgZm9yUGtSYWl6OiBGb3JQa1JhaXosIGluZGV4OiBudW1iZXIsIG9wY2lvbjoga2V5b2YgVmlzaXRhLCB2YWxvcjogc3RyaW5nIHwgbnVsbCB9LCBfZGF0b3NCeVBhc3M6IERhdG9zQnlQYXNzKSB7XHJcbiAgICBsZXQgeyBmb3JQa1JhaXosIGluZGV4LCBvcGNpb24sIHZhbG9yIH0gPSBwYXlsb2FkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX2JvcnJhcl92aXNpdGEocGF5bG9hZDogeyBmb3JQa1JhaXo6IEZvclBrUmFpeiwgaW5kZXg6IG51bWJlciB9LCBfZGF0b3NCeVBhc3M6IERhdG9zQnlQYXNzKSB7XHJcbiAgICBsZXQgeyBmb3JQa1JhaXosIGluZGV4IH0gPSBwYXlsb2FkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX2FncmVnYXJfZm9ybXVsYXJpbyh7IGZvclBrIH06IHsgZm9yUGs6IEZvclBrIH0sIF9kYXRvc0J5UGFzczogRGF0b3NCeVBhc3MpIHtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXMsIHVuaWRhZEFuYWxpc2lzLCByZXNwdWVzdGFzQXVtZW50YWRhcywgcmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeiB9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrLCB0cnVlLCB0cnVlKTtcclxuICAgIHJlY2FsY3VsYXJUb2RvRWxBcmJvbChyZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6KTtcclxuICAgIHJlY2FsY3VsYXJDb21vZGluZXNGb3JQayhmb3JQayk7XHJcbiAgICBjYWxjdWxhckZlZWRiYWNrVW5pZGFkQW5hbGlzaXMoZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IsIGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3MsIHJlc3B1ZXN0YXMsIHVuaWRhZEFuYWxpc2lzLnVuaWRhZF9hbmFsaXNpcywgZm9yUGssIHJlc3B1ZXN0YXNBdW1lbnRhZGFzLCBudWxsLCB7fSlcclxuICAgIGNhbGN1bGFyVmFyaWFibGVzQm90b25Gb3JtdWxhcmlvKGZvclBrKTtcclxuICAgIHBlcnNpc3RpckRhdG9zQnlQYXNzKGRhdG9zQnlQYXNzKTsgLy8gT0pPIEFTWU5DIERFU0NPTlRST0xBREFcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFjY2lvbl9hYnJpcl9mb3JtdWxhcmlvKHsgZm9yUGsgfTogeyBmb3JQazogRm9yUGsgfSwgX2RhdG9zQnlQYXNzOiBEYXRvc0J5UGFzcykge1xyXG4gICAgdmFyIHsgcmVzcHVlc3RhcywgdW5pZGFkQW5hbGlzaXMsIHJlc3B1ZXN0YXNBdW1lbnRhZGFzLCByZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6IH0gPSByZXNwdWVzdGFzRm9yUGsoZm9yUGssIHRydWUsIHRydWUpO1xyXG4gICAgcmVjYWxjdWxhclRvZG9FbEFyYm9sKHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXopO1xyXG4gICAgcmVjYWxjdWxhckNvbW9kaW5lc0ZvclBrKGZvclBrKTtcclxuICAgIGNhbGN1bGFyRmVlZGJhY2tVbmlkYWRBbmFsaXNpcyhkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvciwgZXN0cnVjdHVyYS5mb3JtdWxhcmlvcywgcmVzcHVlc3RhcywgdW5pZGFkQW5hbGlzaXMudW5pZGFkX2FuYWxpc2lzLCBmb3JQaywgcmVzcHVlc3Rhc0F1bWVudGFkYXMsIG51bGwsIHt9KVxyXG4gICAgY2FsY3VsYXJWYXJpYWJsZXNCb3RvbkZvcm11bGFyaW8oZm9yUGspO1xyXG4gICAgcGVyc2lzdGlyRGF0b3NCeVBhc3MoZGF0b3NCeVBhc3MpOyAvLyBPSk8gQVNZTkMgREVTQ09OVFJPTEFEQVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX2JvcnJhcl9mb3JtdWxhcmlvKHsgZm9yUGssIGZvclBrUGFkcmUgfTogeyBmb3JQazogRm9yUGssIGZvclBrUGFkcmU6IEZvclBrIH0pIHtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXogfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQaywgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICB2YXIgdW5pZGFkX2FuYWxpc2lzOiBJZFVuaWRhZEFuYWxpc2lzIHwgdW5kZWZpbmVkID0gZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1tmb3JQay5mb3JtdWxhcmlvXS5jYXNpbGxlcm9zLnVuaWRhZF9hbmFsaXNpc1xyXG4gICAgdmFyIHVhRGVmOiBVbmlkYWRBbmFsaXNpcyA9IGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXNbdW5pZGFkX2FuYWxpc2lzXTtcclxuICAgIHZhciBpbmRleCA9IGZvclBrW3VhRGVmLnBrX2FncmVnYWRhXSBhcyBudW1iZXI7XHJcbiAgICB2YXIgeyByZXNwdWVzdGFzOiByZXNwdWVzdGFzUGFkcmUgfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQa1BhZHJlLCB0cnVlLCB0cnVlKTtcclxuICAgIChyZXNwdWVzdGFzUGFkcmVbdW5pZGFkX2FuYWxpc2lzXSBhcyBSZXNwdWVzdGFzW10pLnNwbGljZShpbmRleCAtIDEsIDEpO1xyXG4gICAgcmVjYWxjdWxhclRvZG9FbEFyYm9sKHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXopO1xyXG4gICAgcmVjYWxjdWxhckNvbW9kaW5lc0ZvclBrKGZvclBrUGFkcmUpO1xyXG4gICAgZGF0b3NCeVBhc3MuZGlydHkgPSBkYXRvc0J5UGFzcy5kaXJ0eSB8fCB0cnVlO1xyXG4gICAgcmVzcHVlc3Rhc1JhaXouJGRpcnR5ID0gcmVzcHVlc3Rhc1JhaXouJGRpcnR5IHx8IHRydWU7XHJcbiAgICByZWZyZXNjYXJNYXJjYURpcnR5KCk7XHJcbiAgICBjYWxjdWxhckZlZWRiYWNrKHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXosIHsgYXV0b0luZ3Jlc286IHRydWUgfSk7XHJcbiAgICBjYWxjdWxhclZhcmlhYmxlc0JvdG9uRm9ybXVsYXJpbyhmb3JQa1BhZHJlKTtcclxuICAgIHZvbGNhZG9JbmljaWFsRWxlbWVudG9zUmVnaXN0cmFkb3MoZm9yUGtQYWRyZSk7XHJcbiAgICBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYXRvc0J5UGFzcyk7IC8vIE9KTyBBU1lOQyBERVNDT05UUk9MQURBXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGlzcGF0Y2hCeVBhc3M8VCwgUj4oXHJcbiAgICBmdW46IChwYXlsb2FkOiBULCBkYXRvczogdHlwZW9mIGRhdG9zQnlQYXNzKSA9PiBSLFxyXG4gICAgcGF5bG9hZDogVFxyXG4pIHtcclxuICAgIHJldHVybiBmdW4ocGF5bG9hZCwgZGF0b3NCeVBhc3MpO1xyXG59XHJcblxyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG5cclxuXHJcbmV4cG9ydCBjb25zdCB1bHRpbWFWYXJpYmxlVml2aWVuZGEgPSAnTk9fRVNUQV9ERUZJTklEQV9BVU4vL1RPRE8nIGFzIElkVmFyaWFibGU7XHJcblxyXG5leHBvcnQgY29uc3QgTUFYQ1AgPSAyMDtcclxuXHJcbi8qIFJFRFVDRVJTICovXHJcblxyXG52YXIgcmVlbXBsYXpvc0hhYmlsaXRhcjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcclxuICAgIGZhbHNlOiAnZmFsc2UnLFxyXG4gICAgdHJ1ZTogJ3RydWUnLFxyXG4gICAgXCI9XCI6ICc9PScsXHJcbiAgICBcIjw+XCI6ICchPScsXHJcbiAgICBcIiZcIjogJyYmJyxcclxuICAgIFwifFwiOiAnfHwnLFxyXG4gICAgXCJPUlwiOiAnfHwnLFxyXG4gICAgXCJBTkRcIjogJyYmJyxcclxuICAgIFwib3JcIjogJ3x8JyxcclxuICAgIFwiYW5kXCI6ICcmJicsXHJcbiAgICBcIm5vdFwiOiAnIScsXHJcbiAgICBcIk5PVFwiOiAnIScsXHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgaGVscGVyc0Nhc2lsbGVyb3MgPSB7XHJcbiAgICBudWxsMnplcm8ocG9zaWJsZU51bGw6IGFueSkge1xyXG4gICAgICAgIGlmIChwb3NpYmxlTnVsbCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcG9zaWJsZU51bGw7XHJcbiAgICB9LFxyXG4gICAgZGl2MGVycihudW1lcmFkb3I6IG51bWJlciwgZGVub21pbmFkb3I6IG51bWJlciwgcGs6IHN0cmluZykge1xyXG4gICAgICAgIGlmIChkZW5vbWluYWRvciA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIGVuIFwiICsgcGsgKyBcIiBkaXZpc2lvbiBwb3IgY2VybyBkZSBcIiArIG51bWVyYWRvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudW1lcmFkb3IgLyBkZW5vbWluYWRvcjtcclxuICAgIH0sXHJcbiAgICBmdW5zOiB7XHJcbiAgICAgICAgYmxhbmNvKHg6IGFueSkge1xyXG4gICAgICAgICAgICByZXR1cm4geCAhPT0gMCAmJiAheFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaG95KCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0ZS50b2RheSgpLnRvRG15KClcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZlY2hhX3ZhbGlkYSh4OiBzdHJpbmcpIHtcclxuICAgICAgICAgICAgdmFyIGZvcm1hdG9fdmFsaWRvID0gL14oWzEtOV18MFsxLTldfFsxMl1cXGR8M1swMV0pXFwvKFsxLTldfDBbMS05XXwxWzAxMl0pXFwvMjBcXGRcXGQkLy50ZXN0KHgpXHJcbiAgICAgICAgICAgIHZhciB4RGF0ZTogRGF0ZTtcclxuICAgICAgICAgICAgdmFyIGNvbnZlcnNpb25PazogYm9vbGVhbjtcclxuICAgICAgICAgICAgY29udmVyc2lvbk9rID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKGZvcm1hdG9fdmFsaWRvKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBbZCwgbSwgeV0gPSB4LnNwbGl0KCcvJyk7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHhEYXRlID0gbmV3IERhdGUoYCR7eX0vJHttfS8ke2R9YCk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uT2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgLy9mYWx0YXJpYSB2YWxpZGFyIHF1ZSBubyBzZWEgdW5hIGZlY2hhIGZ1dHVyYSB5IHF1ZSBzZWEgdW5hIGZlY2hhIGVuIGVsIHJhbmdvIGRlbCBvcGVyYXRpdm9cclxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdG9fdmFsaWRvICYmIGNvbnZlcnNpb25Pa1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbWVzYW5pb192YWxpZG8oeDogc3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHZhciBmb3JtYXRvX3ZhbGlkbyA9IC9eKFsxLTldfDBbMS05XXwxWzAxMl0pXFwvKDE5fDIwKVxcZFxcZCQvLnRlc3QoeClcclxuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdG9fdmFsaWRvXHJcbiAgICAgICAgfSxcclxuICAgICAgICBpbmZvcm1hZG8oeDogYW55KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB4ICE9PSB1bmRlZmluZWQgJiYgeCAhPT0gbnVsbCAmJiAoISh4IGluc3RhbmNlb2YgQXJyYXkpIHx8IHgubGVuZ3RoICE9PSAwKVxyXG4gICAgICAgICAgICAgICAgJiYgKCEoeCBpbnN0YW5jZW9mIE9iamVjdCkgfHwgT2JqZWN0LmtleXMoeCkubGVuZ3RoICE9PSAwKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbnNuYyh4OiBhbnkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHggPT0gLTlcclxuICAgICAgICB9LFxyXG4gICAgICAgIHBhcih4OiBudW1iZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHggJSAyID09IDBcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVkYWRfbWVzX2FubmlvX3ZhbGlkbyhlZGFkOiBudW1iZXIsIG1lc0FubmlvOiBzdHJpbmcsIGZlY2hhUmVhbGl6YWNpb25ERE1NWVlZWTogc3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHZhciBtZXNlc0RpZmVyZW5jaWEgPSAoZDE6IERhdGUsIGQyOiBEYXRlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbW9udGhzO1xyXG4gICAgICAgICAgICAgICAgbW9udGhzID0gKGQyLmdldEZ1bGxZZWFyKCkgLSBkMS5nZXRGdWxsWWVhcigpKSAqIDEyO1xyXG4gICAgICAgICAgICAgICAgbW9udGhzIC09IGQxLmdldE1vbnRoKCk7XHJcbiAgICAgICAgICAgICAgICBtb250aHMgKz0gZDIuZ2V0TW9udGgoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtb250aHMgPD0gMCA/IDAgOiBtb250aHM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIHBhcnRlc1JlYWxpemFjaW9uID0gZmVjaGFSZWFsaXphY2lvbkRETU1ZWVlZLnNwbGl0KFwiL1wiKTtcclxuICAgICAgICAgICAgLy9AdHMtaWdub3JlIGxhcyBwYXJ0ZXMgY29ycmVzcG9uZGVuIGEgdW5hIGZlY2hhIHbDoWxpZGFcclxuICAgICAgICAgICAgdmFyIHRvZGF5ID0gZGF0ZS55bWQoTnVtYmVyKHBhcnRlc1JlYWxpemFjaW9uWzJdKSwgTnVtYmVyKHBhcnRlc1JlYWxpemFjaW9uWzFdKSwgTnVtYmVyKHBhcnRlc1JlYWxpemFjaW9uWzBdKSlcclxuICAgICAgICAgICAgdmFyIHBhcnRlc01lc0FubmlvID0gbWVzQW5uaW8uc3BsaXQoJy8nKTtcclxuICAgICAgICAgICAgLy9AdHMtaWdub3JlIGxhcyBwYXJ0ZXMgY29ycmVzcG9uZGVuIGEgdW5hIGZlY2hhIHbDoWxpZGFcclxuICAgICAgICAgICAgdmFyIG5hY2ltaWVudG8gPSBkYXRlLnltZChOdW1iZXIocGFydGVzTWVzQW5uaW9bMV0pLCBOdW1iZXIocGFydGVzTWVzQW5uaW9bMF0pLCAxKVxyXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmUgUmVhbERhdGUgZXMgRGF0ZSB5IHNlIHB1ZWRlIHJlc3RhclxyXG4gICAgICAgICAgICB2YXIgZGlmZXJlbmNpYU1lc2VzID0gbWVzZXNEaWZlcmVuY2lhKG5hY2ltaWVudG8sIHRvZGF5KTtcclxuICAgICAgICAgICAgdmFyIGVkYWREZWNpbWFsZXMgPSBkaWZlcmVuY2lhTWVzZXMgLyAxMjsgLy9laiAzNi41XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGVkYWREZWNpbWFsZXMpID09IGVkYWQgfHwgLy9taXNtYSBlZGFkXHJcbiAgICAgICAgICAgICAgICBlZGFkRGVjaW1hbGVzID09IGVkYWQgKyAxIC8vbWVzIGRlIHRvbGVyYW5jaWFcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy9jb3BpYXJfY2FtcG9fdWFfcmFtYShyZXNwdWVzdGFzT3JpZ2VuOlJlc3B1ZXN0YXNbXSwgcG9zaWNpb246bnVtYmVyLCB2YXJpYWJsZU9yaWdlbjogSWRWYXJpYWJsZSwgY2FtaW5vOnN0cmluZywgY29uZGljaW9uOmJvb2xlYW4pe1xyXG4gICAgICAgIC8vICAgIHJldHVybiBjb25kaWNpb24/KHJlc3B1ZXN0YXNPcmlnZW4gJiYgcmVzcHVlc3Rhc09yaWdlbltwb3NpY2lvbi0xXSAmJiByZXNwdWVzdGFzT3JpZ2VuW3Bvc2ljaW9uLTFdW2Ake2NhbWlub31gXVt2YXJpYWJsZU9yaWdlbl0pOm51bGxcclxuICAgICAgICAvLyAgICByZXR1cm4gY29uZGljaW9uP2V2YWwoYHJlc3B1ZXN0YXNPcmlnZW5bJHtwb3NpY2lvbi0xfV0uYCtjYW1pbm8rJy4nK3ZhcmlhYmxlT3JpZ2VuKTpudWxsO1xyXG4gICAgICAgIC8vfVxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgZGJvOntcclxuICAgICAgICAgICAgZGF0b0ZhbWlsaWFyKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIscGVyOm51bWJlciwgZGF0bzpzdHJpbmcpe1xyXG4gICAgICAgICAgICAgICAgdmFyIHhwZXJzb25hcz1wZXJzb25hcztcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbmN1PT1lbmMgJiYgaG9nPT1ob2dhciAmJiBpbmZvcm1hZG8oeHBlcnNvbmFzKSAmJiBwZXI8PSB4cGVyc29uYXMubGVuZ3RoICYmIHBlcj49MSAmJiAhIXhwZXJzb25hc1twZXItMV1bZGF0b10/IHhwZXJzb25hc1twZXItMV1bZGF0b106bnVsbFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlZGFkZmFtaWxpYXIoZW5jdTpzdHJpbmcsaG9nOm51bWJlcixwZXI6bnVtYmVyKXtcclxuICAgICAgICAgICAgICAgIHZhciB4cGVyc29uYXM9cGVyc29uYXM7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0b0ZhbWlsaWFyKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIscGVyOm51bWJlciwnZWRhZCcpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGV4aXN0ZWluZGl2aWR1YWwoZW5jdTpzdHJpbmcsaG9nOm51bWJlcixwZXI6bnVtYmVyKXtcclxuICAgICAgICAgICAgICAgIHZhciB4cGVyc29uYXM9cGVyc29uYXM7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZW5jdT09ZW5jICYmIGhvZz09aG9nYXIgJiYgISFwZXJzb25hcyAmJiBwZXI8PSBwZXJzb25hcy5sZW5ndGggJiYgcGVyPj0xICYmICEhcGVyc29uYXNbcGVyLTFdWydlbnRyZWFpbmQnXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBleGlzdGVtaWVtYnJvKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIscGVyOm51bWJlcil7XHJcbiAgICAgICAgICAgICAgICB2YXIgeHBlcnNvbmFzPXBlcnNvbmFzO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY3U9PWVuYyAmJiBob2c9PWhvZ2FyICYmICEhcGVyc29uYXMgJiYgcGVyPD0gcGVyc29uYXMubGVuZ3RoICYmIHBlcj49MVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBucm9jb255dWdlcyhlbmN1OnN0cmluZyxob2c6bnVtYmVyKXtcclxuICAgICAgICAgICAgICAgIHZhciB4cGVyc29uYXM9cGVyc29uYXNcclxuICAgICAgICAgICAgICAgIHJldHVybiB4cGVyc29uYXMuZmlsdGVyKCBwZXItPnBlci5wND09MikubGVuZ3RoXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5yb2plZmVzKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIscGVyOm51bWJlcil7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGVyc29uYXMuZmlsdGVyKCBwZXItPnBlci5wND09MSkubGVuZ3RoXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHBhcmVudGVzY29mYW1pbGlhcihlbmN1OnN0cmluZyxob2c6bnVtYmVyLHBlcjpudW1iZXIpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdG9GYW1pbGlhcihlbmN1OnN0cmluZyxob2c6bnVtYmVyLHBlcjpudW1iZXIsJ3A0JylcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V4b2ZhbWlsaWFyKGVuY3U6c3RyaW5nLGhvZzpudW1iZXIscGVyOm51bWJlcil7XHJcbiAgICAgICAgICAgICAgICB2YXIgeHBlcnNvbmFzPXBlcnNvbmFzO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY3U9PWVuYyAmJiBob2c9PWhvZ2FyICYmICEheHBlcnNvbmFzICYmIHBlcjw9IHhwZXJzb25hcy5sZW5ndGggJiYgcGVyPj0xICYmICEheHBlcnNvbmFzW3Blci0xXS5zZXhvPyB4cGVyc29uYXNbcGVyLTFdWydzZXhvJ106bnVsbFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzaXRjb255amVmZShlbmN1OnN0cmluZyxob2c6bnVtYmVyKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRvRmFtaWxpYXIoZW5jdTpzdHJpbmcsaG9nOm51bWJlciwxLCdwNScpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ICovXHJcbiAgICB9XHJcbn07XHJcblxyXG50eXBlIEZ1bmNpb25IYWJpbGl0YXIgPSAodmFsb3JlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgPT4gYm9vbGVhbjtcclxudHlwZSBGdW5jaW9uVmFsb3JhciA9ICh2YWxvcmVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA9PiBhbnk7XHJcbnZhciBmdW5jaW9uZXNIYWJpbGl0YXI6IHsgW2tleTogc3RyaW5nXTogRnVuY2lvbkhhYmlsaXRhciB9ID0ge1xyXG59XHJcbnZhciBmdW5jaW9uZXNWYWxvcmFyOiB7IFtrZXk6IHN0cmluZ106IEZ1bmNpb25WYWxvcmFyIH0gPSB7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtaW5pQ29tcGlsYWRvclNRbEpzKGV4cHJlc2lvbkNhc2lTUUw6IHN0cmluZykge1xyXG4gICAgdmFyIGV4cHJlc2lvbiA9IGV4cHJlc2lvbkNhc2lTUUwucmVwbGFjZSgvXFx1MDBBMC9nLCAnICcpO1xyXG4gICAgdmFyIGN1ZXJwbyA9IGV4cHJlc2lvbi5yZXBsYWNlKC9cXGJpcyBkaXN0aW5jdCBmcm9tXFxiL2dpLCAnIT0nKS5yZXBsYWNlKC9cXGIuKz9cXGIvZywgZnVuY3Rpb24gKGVsVG9rZW4pIHtcclxuICAgICAgICB2YXIgZWxUb2tlblRyaW1lYWRvID0gZWxUb2tlbi50cmltKCk7XHJcbiAgICAgICAgaWYgKGVsVG9rZW5UcmltZWFkbyBpbiByZWVtcGxhem9zSGFiaWxpdGFyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZWVtcGxhem9zSGFiaWxpdGFyW2VsVG9rZW5UcmltZWFkb107XHJcbiAgICAgICAgfSBlbHNlIGlmICgvXlxcZCtcXC4/XFxkKiQvLnRlc3QoZWxUb2tlblRyaW1lYWRvKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWxUb2tlblxyXG4gICAgICAgIH0gZWxzZSBpZiAoL15cXFcrJC8udGVzdChlbFRva2VuVHJpbWVhZG8pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbFRva2VuXHJcbiAgICAgICAgfSBlbHNlIGlmICgvXlxccyskLy50ZXN0KGVsVG9rZW4pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbFRva2VuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnaGVscGVycy5udWxsMnplcm8odmFsb3Jlcy4nICsgZWxUb2tlbiArICcpJztcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGN1ZXJwbztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bmNpb25Db21waWxhZGE8VD4oY29uanVudG9EZUZ1bmNpb25lczogeyBba2V5OiBzdHJpbmddOiAodmFsb3JlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkgPT4gVCB9KSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG5vbWJyZUZ1bmNpb25Db21vRXhwcmVzaW9uSnM6IHN0cmluZykge1xyXG4gICAgICAgIGlmICghY29uanVudG9EZUZ1bmNpb25lc1tub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzXSkge1xyXG4gICAgICAgICAgICB2YXIgY3VlcnBvID0gbm9tYnJlRnVuY2lvbkNvbW9FeHByZXNpb25KcztcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIC8vIHZhciBjdWVycG8gPSBtaW5pQ29tcGlsYWRvclNRbEpzKG5vbWJyZUZ1bmNpb25Db21vRXhwcmVzaW9uSnMpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGludGVybmFsRnVuID0gbmV3IEZ1bmN0aW9uKCd2YWxvcmVzJywgJ2hlbHBlcnMnLCAncmV0dXJuICcgKyBjdWVycG8pO1xyXG4gICAgICAgICAgICAgICAgY29uanVudG9EZUZ1bmNpb25lc1tub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzXSA9IGZ1bmN0aW9uICh2YWxvcmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGludGVybmFsRnVuKHZhbG9yZXMsIGhlbHBlcnNDYXNpbGxlcm9zKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SIEVKRUNVQ0NJT04gRVhQUkVTSU9OIEVYVEVSTkEgJywgbm9tYnJlRnVuY2lvbkNvbW9FeHByZXNpb25KcywgZXhwZWN0ZWQoZXJyKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY3VlcnBvKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2codmFsb3Jlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRVJST1IgQ09NUElMQUNJT04gRVhQUkVTSU9OIEVYVEVSTkEgJywgbm9tYnJlRnVuY2lvbkNvbW9FeHByZXNpb25KcywgZXhwZWN0ZWQoZXJyKSlcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGN1ZXJwbyk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbmp1bnRvRGVGdW5jaW9uZXNbbm9tYnJlRnVuY2lvbkNvbW9FeHByZXNpb25Kc107XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRGdW5jaW9uSGFiaWxpdGFyID0gZ2V0RnVuY2lvbkNvbXBpbGFkYShmdW5jaW9uZXNIYWJpbGl0YXIpO1xyXG5leHBvcnQgY29uc3QgZ2V0RnVuY2lvblZhbG9yYXIgPSBnZXRGdW5jaW9uQ29tcGlsYWRhKGZ1bmNpb25lc1ZhbG9yYXIpO1xyXG5cclxuXHJcbnZhciByb3dWYWxpZGF0b3IgPSBnZXRSb3dWYWxpZGF0b3I8SWRWYXJpYWJsZSwgVmFsb3IsIElkRmluPih7IGdldEZ1bmNpb25IYWJpbGl0YXIsIGdldEZ1bmNpb25WYWxvcmFyIH0pXHJcbmV4cG9ydCB2YXIgYnVzY2FyTm9SZWFFblJlc3B1ZXN0YXMgPSAodW5pZGFkZXNBUmVjb3JyZXJQcm06IElkVW5pZGFkQW5hbGlzaXNbXSwgdW5pZGFkQW5hbGlzaXM6IFVuaWRhZEFuYWxpc2lzLCByZXNwdWVzdGFzOiBSZXNwdWVzdGFzLCBub1JlYXNUYXJlYTogYW55W10sIG5vbWJOb1JlYTogc3RyaW5nKVxyXG4gICAgOiB7IG5yY29kaWdvOiBzdHJpbmcgfCBudWxsLCBlc3ZhbG9yOiBib29sZWFuIH0gPT4ge1xyXG4gICAgdmFyIG5yY29kaWdvOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgIHZhciBlc3ZhbG9yID0gZmFsc2U7XHJcbiAgICB2YXIgcnZhbG9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgIHZhciBydmFyaWFibGU6IHN0cmluZztcclxuICAgIHZhciBybm9yZWE6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgLy8gdmFyIHJlc3VsdD17bnJjb2Q6U3RyaW5nLCBlc3ZhbDpCb29sZWFufTtcclxuICAgIGlmICh1bmlkYWRlc0FSZWNvcnJlclBybS5pbmNsdWRlcyh1bmlkYWRBbmFsaXNpcy51bmlkYWRfYW5hbGlzaXMpKSB7XHJcbiAgICAgICAgZm9yIChsZXQgbm9SZWEgb2Ygbm9SZWFzVGFyZWEpIHsgLy9lc3RydWN0dXJhLm5vUmVhcywgZXN0cnVjdHVyYS5ub1JlYXNTdXBcclxuICAgICAgICAgICAgaWYgKG5vbWJOb1JlYSA9PSAnbm9fcmVhJykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHsgdmFyaWFibGUsIHZhbG9yLCBub19yZWEgfSA9IG5vUmVhO1xyXG4gICAgICAgICAgICAgICAgcm5vcmVhID0gbm9fcmVhO1xyXG4gICAgICAgICAgICAgICAgcnZhbG9yID0gdmFsb3I7XHJcbiAgICAgICAgICAgICAgICBydmFyaWFibGUgPSB2YXJpYWJsZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciB7IHZhcmlhYmxlX3N1cCwgdmFsb3Jfc3VwLCBub19yZWFfc3VwIH0gPSBub1JlYTtcclxuICAgICAgICAgICAgICAgIHJub3JlYSA9IG5vX3JlYV9zdXA7XHJcbiAgICAgICAgICAgICAgICBydmFsb3IgPSB2YWxvcl9zdXA7XHJcbiAgICAgICAgICAgICAgICBydmFyaWFibGUgPSB2YXJpYWJsZV9zdXA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHJlc3B1ZXN0YXNbcnZhcmlhYmxlIGFzIElkVmFyaWFibGVdID09IHJ2YWxvcikge1xyXG4gICAgICAgICAgICAgICAgbnJjb2RpZ28gPSBybm9yZWE7ICAvL25vX3JlYSwgbm9fcmVhX3N1cFxyXG4gICAgICAgICAgICAgICAgZXN2YWxvciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBucmNvZGlnbywgZXN2YWxvciB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBucmNvZGlnbyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBlc3ZhbG9yID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCB1YSBvZiAobGlrZUFyKHVuaWRhZEFuYWxpc2lzPy5oaWphcykuYXJyYXkoKSkpIHtcclxuICAgICAgICBpZiAodWE/LnVuaWRhZF9hbmFsaXNpcyAmJiByZXNwdWVzdGFzW3VhLnVuaWRhZF9hbmFsaXNpc10gaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXNwdWVzdGFzSGlqYXMgb2YgaXRlcmF0b3IocmVzcHVlc3Rhc1t1YT8udW5pZGFkX2FuYWxpc2lzXSA/PyBbXSkpIHtcclxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBidXNjYXJOb1JlYUVuUmVzcHVlc3Rhcyh1bmlkYWRlc0FSZWNvcnJlclBybSwgdWEsIHJlc3B1ZXN0YXNIaWphcywgbm9SZWFzVGFyZWEsIG5vbWJOb1JlYSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmVzdmFsb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBucmNvZGlnbyA9IHJlc3VsdC5ucmNvZGlnbztcclxuICAgICAgICAgICAgICAgICAgICBlc3ZhbG9yID0gcmVzdWx0LmVzdmFsb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgbnJjb2RpZ28sIGVzdmFsb3IgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBucmNvZGlnbyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgZXN2YWxvciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB7bnJjb2RpZ28sIGVzdmFsb3J9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyBucmNvZGlnbywgZXN2YWxvciB9XHJcbn1cclxuXHJcblxyXG5cclxuZXhwb3J0IHZhciBkZWZPcGVyYXRpdm86IERlZk9wZXJhdGl2byA9IHtcclxuICAgIGVzTm9SZWE6IChfcmVzcHVlc3RhczogUmVzcHVlc3RhcykgPT4ge1xyXG4gICAgICAgIC8vSU1QTEVNRU5UQVIgRU4gT1BFUkFUSVZPXHJcbiAgICAgICAgdmFyIGVzTm9SZWEgPSBmYWxzZTtcclxuICAgICAgICB2YXIgY29kTm9SZWE6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIHJldHVybiB7IGNvZE5vUmVhLCBlc05vUmVhIH07XHJcbiAgICB9LFxyXG4gICAgZXNOb1JlYVN1cDogKF9yZXNwdWVzdGFzOiBSZXNwdWVzdGFzKSA9PiB7XHJcbiAgICAgICAgLy9JTVBMRU1FTlRBUiBFTiBPUEVSQVRJVk9cclxuICAgICAgICB2YXIgZXNOb1JlYVN1cCA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBjb2ROb1JlYVN1cDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHsgY29kTm9SZWFTdXAsIGVzTm9SZWFTdXAgfVxyXG4gICAgfSxcclxuICAgIGVzUmVhbGl6YWRhOiAoX3Jlc3B1ZXN0YXM6IFJlc3B1ZXN0YXMpID0+IHtcclxuICAgICAgICAvL0lNUExFTUVOVEFSIEVOIE9QRVJBVElWT1xyXG4gICAgICAgIHZhciBlc1JlYSA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBjb2RSZWE6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIHJldHVybiB7IGNvZFJlYSwgZXNSZWEgfVxyXG4gICAgfSxcclxuICAgIGVzUmVhbGl6YWRhU3VwOiAoX3Jlc3B1ZXN0YXM6IFJlc3B1ZXN0YXMpID0+IHtcclxuICAgICAgICAvL0lNUExFTUVOVEFSIEVOIE9QRVJBVElWT1xyXG4gICAgICAgIHZhciBlc1JlYVN1cCA9IGZhbHNlO1xyXG4gICAgICAgIHZhciBjb2RSZWFTdXA6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIHJldHVybiB7IGNvZFJlYVN1cCwgZXNSZWFTdXAgfVxyXG4gICAgfSxcclxuICAgIFVBcHJpbmNpcGFsOiAnJyBhcyBJZFVuaWRhZEFuYWxpc2lzLFxyXG4gICAgZGVmVUE6IHt9IGFzIHsgW2kgaW4gSWRVbmlkYWRBbmFsaXNpc106IHsgcGs6IElkVmFyaWFibGUsIGluY2x1aWRhczogSWRVbmlkYWRBbmFsaXNpc1tdLCBpZHNGb3I6IElkRm9ybXVsYXJpb1tdIH0gfSxcclxuICAgIGRlZkZvcjoge30gYXMgeyBbZiBpbiBJZEZvcm11bGFyaW9dOiB7LyphcmJvbFVBOklkVW5pZGFkQW5hbGlzaXNbXSwgKi8gaGVybWFubz86IHRydWUgfSB9XHJcbn1cclxuLy8vLy8gQUJBSk8gZGUgZXN0YSBsw61uZWEgbm8gcHVlZGUgaGFiZXIgb3Ryb3Mgbm9tYnJlcyBkZSB2YXJpYWJsZXMgbyBmb3JtdWxhcmlvcyBvIGNhc2lsbGVyb3MgZW4gZ2VuZXJhbFxyXG5cclxuZXhwb3J0IHZhciBzZXRDYWxjdWxvUmVhTm9SZWEgPSAoXHJcbiAgICBlc05vUmVhOiAocmVzcHVlc3RhczogUmVzcHVlc3RhcykgPT4geyBjb2ROb1JlYTogc3RyaW5nIHwgbnVsbCwgZXNOb1JlYTogYm9vbGVhbiB9LFxyXG4gICAgZXNOb1JlYVN1cDogKHJlc3B1ZXN0YXM6IFJlc3B1ZXN0YXMpID0+IHsgY29kTm9SZWFTdXA6IHN0cmluZyB8IG51bGwsIGVzTm9SZWFTdXA6IGJvb2xlYW4gfSxcclxuICAgIGVzUmVhbGl6YWRhOiAocmVzcHVlc3RhczogUmVzcHVlc3RhcykgPT4geyBjb2RSZWE6IG51bWJlciB8IG51bGwsIGVzUmVhOiBib29sZWFuIH0sXHJcbiAgICBlc1JlYWxpemFkYVN1cDogKHJlc3B1ZXN0YXM6IFJlc3B1ZXN0YXMpID0+IHsgY29kUmVhU3VwOiBudW1iZXIgfCBudWxsLCBlc1JlYVN1cDogYm9vbGVhbiB9XHJcbikgPT4ge1xyXG4gICAgZGVmT3BlcmF0aXZvID0ge1xyXG4gICAgICAgIC4uLmRlZk9wZXJhdGl2byxcclxuICAgICAgICBlc05vUmVhLFxyXG4gICAgICAgIGVzTm9SZWFTdXAsXHJcbiAgICAgICAgZXNSZWFsaXphZGEsXHJcbiAgICAgICAgZXNSZWFsaXphZGFTdXBcclxuICAgIH1cclxufVxyXG5cclxuLy8gVE9ETzogR0VORVJBTElaQVJcclxudHlwZSBQZXJzb25hID0geyBwMTogc3RyaW5nLCBwMjogbnVtYmVyLCBwMzogbnVtYmVyLCBwNDogbnVtYmVyIHwgbnVsbCwgcDU6IDEgfCBudWxsLCBwNjogMSB8IG51bGwgfVxyXG5cclxuZnVuY3Rpb24gbnVtKG51bTogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCk6IG51bWJlciB7XHJcbiAgICAvL0B0cy1pZ25vcmUgbGEgZ3JhY2lhIGVzIG1ldGVyIG51bSBjdWFuZG8gZXMgc3RyaW5nXHJcbiAgICBpZiAoaXNOYU4obnVtIC0gMCkpIHJldHVybiAwO1xyXG4gICAgLy9AdHMtaWdub3JlIGxhIGdyYWNpYSBlcyBtZXRlciBudW0gY3VhbmRvIGVzIHN0cmluZ1xyXG4gICAgcmV0dXJuIG51bSAtIDA7XHJcbn1cclxuXHJcbnZhciBmdW5jaW9uZXNDb25vY2lkYXM6IHsgW2sgaW4gc3RyaW5nXTogYm9vbGVhbiB9ID0ge31cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZmljYXJTb3J0ZW8ob3B0czoge1xyXG4gICAgY29uZmlndXJhY2lvblNvcnRlbzogQ29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8sXHJcbiAgICByZXNwdWVzdGFzOiBSZXNwdWVzdGFzLFxyXG4gICAgcmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6XHJcbiAgICBmb3JQazogRm9yUGssXHJcbiAgICB2YXJpYWJsZUFjdHVhbDogSWRWYXJpYWJsZVxyXG5cclxufSkge1xyXG4gICAgY29uc3QgcmVzZXRlYXJTb3J0ZW8gPSAob3B0czogeyByZXNwdWVzdGFzOiBSZXNwdWVzdGFzIH0pID0+IHtcclxuICAgICAgICB2YXIgeyByZXNwdWVzdGFzIH0gPSBvcHRzO1xyXG4gICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5yZXN1bHRhZG9dID0gbnVsbDtcclxuICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfc29ydGVhYmxlc10gPSBudWxsO1xyXG4gICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5kaXNwYXJhZG9yXSA9IG51bGw7XHJcbiAgICAgICAgY29uZmlndXJhY2lvblNvcnRlby5zb3J0ZWFkb19tb3N0cmFyPy5mb3JFYWNoKChtb3N0cmFyKSA9PiByZXNwdWVzdGFzW21vc3RyYXIudGFyZ2V0XSA9IG51bGwpO1xyXG4gICAgICAgIGlmICgndmFyX2xldHJhJyBpbiBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kbykge1xyXG4gICAgICAgICAgICBpZiAocmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10gJiYgcmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10gaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgcGVyIG9mIGl0ZXJhdG9yKHJlc3B1ZXN0YXNbdW5pZGFkQW5hbGlzaXNdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBlcltjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kby52YXJfbGV0cmFdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2YXIgeyBjb25maWd1cmFjaW9uU29ydGVvLCB2YXJpYWJsZUFjdHVhbCwgcmVzcHVlc3RhcywgZm9yUGssIHJlc3B1ZXN0YXNSYWl6IH0gPSBvcHRzO1xyXG4gICAgdmFyIGlkRW5jID0gZm9yUGtbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXTtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXNBdW1lbnRhZGFzLCByZXNwdWVzdGFzUmFpeiB9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrLCB0cnVlKTtcclxuICAgIHZhciBleHByX2luY29tcGxldGl0dWRfZnVuID0gZ2V0RnVuY2lvbkhhYmlsaXRhcihjb25maWd1cmFjaW9uU29ydGVvLmV4cHJfaW5jb21wbGV0aXR1ZF9qc1tyZXNwdWVzdGFzQXVtZW50YWRhcy52ZG9taW5pbyBhcyB1bmtub3duIGFzIG51bWJlcl0uZXhwcik7XHJcbiAgICB2YXIgZmlsdHJvX2Z1biA9IGdldEZ1bmNpb25IYWJpbGl0YXIoY29uZmlndXJhY2lvblNvcnRlby5maWx0cm9fanNbcmVzcHVlc3Rhc0F1bWVudGFkYXMudmRvbWluaW8gYXMgdW5rbm93biBhcyBudW1iZXJdLmV4cHIpO1xyXG4gICAgdmFyIHVuaWRhZEFuYWxpc2lzID0gY29uZmlndXJhY2lvblNvcnRlby51bmlkYWRfYW5hbGlzaXM7XHJcblxyXG4gICAgaWYgKGNvbmZpZ3VyYWNpb25Tb3J0ZW8ucGFyYW1ldHJvcy5pbmNsdWRlcyh2YXJpYWJsZUFjdHVhbCkpIHtcclxuICAgICAgICB2YXIgdWFQYWRyZSA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKCh1YSkgPT4gdWEudW5pZGFkX2FuYWxpc2lzID09IHVuaWRhZEFuYWxpc2lzKT8ucGFkcmU7XHJcbiAgICAgICAgdmFyIHBrQWdyZWdhZGFQYWRyZSA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKCh1YSkgPT4gdWEudW5pZGFkX2FuYWxpc2lzID09IHVhUGFkcmUpPy5wa19hZ3JlZ2FkYVxyXG4gICAgICAgIGlmIChlc3RydWN0dXJhLmNvblJlYUhvZ2FyKSB7XHJcbiAgICAgICAgICAgIGlmICh1YVBhZHJlICYmIHJlc3B1ZXN0YXNBdW1lbnRhZGFzW3VhUGFkcmVdKSB7XHJcbiAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmUgcGtBZ3JlZ2FkYVBhZHJlIGV4aXN0ZSBlIGluZGljYSBsYSBwb3NpY2lvbiBkZWwgcGFkcmVcclxuICAgICAgICAgICAgICAgIHZhciBwYWRyZSA9IHJlc3B1ZXN0YXNBdW1lbnRhZGFzW3VhUGFkcmVdW051bWJlcihyZXNwdWVzdGFzQXVtZW50YWRhc1twa0FncmVnYWRhUGFkcmVdKSAtIDFdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlQWN0dWFsICE9IGNvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfdG90YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYWRyZVtjb25maWd1cmFjaW9uU29ydGVvLmNhbnRpZGFkX3RvdGFsXSA9IGxpa2VBcihwYWRyZVt1bmlkYWRBbmFsaXNpc10gfHwgW10pLmFycmF5KCkubGVuZ3RoOyAvL3NpIGFncmVnYSBkZXNkZSBib3RvbiBhZ3JlZ2FyXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNldGVhclNvcnRlbyh7IHJlc3B1ZXN0YXM6IHBhZHJlIH0pO1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3RhcyA9IHBhZHJlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHVhUGFkcmUgJiYgcmVzcHVlc3Rhc1JhaXopIHtcclxuICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZSBwa0FncmVnYWRhUGFkcmUgZXhpc3RlIGUgaW5kaWNhIGxhIHBvc2ljaW9uIGRlbCBwYWRyZVxyXG4gICAgICAgICAgICAgICAgdmFyIHBhZHJlID0gcmVzcHVlc3Rhc1JhaXo7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVBY3R1YWwgIT0gY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF90b3RhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhZHJlW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfdG90YWxdID0gbGlrZUFyKHBhZHJlW3VuaWRhZEFuYWxpc2lzXSB8fCBbXSkuYXJyYXkoKS5sZW5ndGg7IC8vc2kgYWdyZWdhIGRlc2RlIGJvdG9uIGFncmVnYXJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc2V0ZWFyU29ydGVvKHsgcmVzcHVlc3RhczogcGFkcmUgfSk7XHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzID0gcGFkcmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAocmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10gIT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChyZXNwdWVzdGFzW3VuaWRhZEFuYWxpc2lzXSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIHZhciByZXNwdWVzdGFzVUEgPSByZXNwdWVzdGFzW3VuaWRhZEFuYWxpc2lzXSBhcyBSZXNwdWVzdGFzW11cclxuICAgICAgICAgICAgaWYgKHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5kaXNwYXJhZG9yXSAhPSAxKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLmRpc3BhcmFkb3JdID09IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfdG90YWxdID0gcmVzcHVlc3Rhc1VBLmxlbmd0aCArIDFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc2V0ZWFyU29ydGVvKHsgcmVzcHVlc3RhcyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRUb3RhbCA9IE51bWJlcihyZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfdG90YWxdKTtcclxuICAgICAgICAgICAgaWYgKGNhbnRpZGFkVG90YWwgPCByZXNwdWVzdGFzVUEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBkb2JsZSBhc2lnbmFjacOzbiBwYXJhIHF1ZSBsbyBjYXJndWUgZW4gcmVzcHVlc3Rhc1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1VBID0gcmVzcHVlc3Rhc1VBLmZpbHRlcigocCwgaSkgPT5cclxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtZXRyb3Muc29tZSgocGFyYW0pID0+IHBbcGFyYW1dIHx8IGkgPD0gY2FudGlkYWRUb3RhbCAtIDEpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10gPSByZXNwdWVzdGFzVUFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aGlsZSAoY2FudGlkYWRUb3RhbCA+IHJlc3B1ZXN0YXNVQS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNVQS5wdXNoKHt9IGFzIFJlc3B1ZXN0YXMpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5pbmNvbXBsZXRhc10gPSByZXNwdWVzdGFzVUEuZmlsdGVyKHAgPT4gZXhwcl9pbmNvbXBsZXRpdHVkX2Z1bihwKSkubGVuZ3RoO1xyXG4gICAgICAgICAgICB2YXIgdmFyJHAwID0gXCIkcDBcIiBhcyBJZFZhcmlhYmxlXHJcbiAgICAgICAgICAgIGlmIChyZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uZGlzcGFyYWRvcl0gPT0gMSAmJlxyXG4gICAgICAgICAgICAgICAgIXJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5yZXN1bHRhZG9dICYmXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uaW5jb21wbGV0YXNdID09IDBcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc29ydGVhciA9IHJlc3B1ZXN0YXNVQS5maWx0ZXIocCA9PiBmaWx0cm9fZnVuKHApKTtcclxuICAgICAgICAgICAgICAgIGlmIChzb3J0ZWFyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNVQS5mb3JFYWNoKChwZXIsIGkpID0+IHBlclt2YXIkcDBdID0gaSArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWNpb25Tb3J0ZW8ub3JkZW4ucHVzaCh7IHZhcmlhYmxlOiB2YXIkcDAsIG9yZGVuOiAxIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHNvcnRlYXIuc29ydChjb21wYXJlRm9yT3JkZXIoY29uZmlndXJhY2lvblNvcnRlby5vcmRlbi5tYXAoZWxlbSA9PiAoeyBjb2x1bW46IGVsZW0udmFyaWFibGUsIG9yZGVyOiBlbGVtLm9yZGVuIH0pKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwb3NpY2lvblNvcnRlYWRhID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlndXJhY2lvblNvcnRlby5tZXRvZG8gPT0gJ2hhc2gnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTk8gSU1QTEVNRU5UQURPJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qcG9zaWNpb25Tb3J0ZWFkYT0oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kby52YXJfY29lZi5yZWR1Y2UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzdW0sIHBhaXIpPT5zdW0gKyBkYXRvc1ZpdmllbmRhLnRlbVtwYWlyLnZhcl0gKiBwYWlyLmNvZWYpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgJSBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kby5kaXZpc29yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJSBzb3J0ZWFyLmxlbmd0aCovXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxldHJhID0gJ0EnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YXJMZXRyYTogSWRWYXJpYWJsZSA9IGNvbmZpZ3VyYWNpb25Tb3J0ZW8ucGFyYW1fbWV0b2RvLnZhcl9sZXRyYTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcGVyc29uYSBvZiBzb3J0ZWFyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzVUEuZmluZCgoX3BlciwgaSkgPT4gaSA9PSBwZXJzb25hW3ZhciRwMF0gYXMgbnVtYmVyIC0gMSkhW3ZhckxldHJhXSA9IGxldHJhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYVt2YXJMZXRyYV0gPSBsZXRyYTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHJhID0gU3RyaW5nLmZyb21DaGFyQ29kZShsZXRyYS5jaGFyQ29kZUF0KDApICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxhQWxlYXRvcmlhTWllbWJyb3MgPSBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kby50YWJsYS5tYXAoKGxpc3RhKSA9PiBsaXN0YS5zcGxpdCgnJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdG8gPSBpZEVuYyAlIDEwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uYVRhYmxhQWxlYXRvcmlhID0gcmVzdG8gPyByZXN0byAtIDEgOiA5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29ydGVhci5sZW5ndGggPiB0YWJsYUFsZWF0b3JpYU1pZW1icm9zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVhci5zcGxpY2UodGFibGFBbGVhdG9yaWFNaWVtYnJvcy5sZW5ndGgpIC8vZGVzY2FydG8gY2FuZGlkYXRvcyBzaSBzb24gbcOhcyBxdWUgbG8gcXVlIHBlcm1pdGUgbGEgdGFibGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsYVRhYmxhQWxlYXRvcmlhID0gc29ydGVhci5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGV0cmFTZWxlY2Npb25hZGEgPSB0YWJsYUFsZWF0b3JpYU1pZW1icm9zW2ZpbGFUYWJsYUFsZWF0b3JpYV1bY29sdW1uYVRhYmxhQWxlYXRvcmlhXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaWNpb25Tb3J0ZWFkYSA9IHJlc3B1ZXN0YXNVQS5maW5kSW5kZXgoKHA6IFJlc3B1ZXN0YXMpID0+IHBbdmFyTGV0cmFdID09IGxldHJhU2VsZWNjaW9uYWRhKSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5yZXN1bHRhZG9dID0gcG9zaWNpb25Tb3J0ZWFkYTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLmNhbnRpZGFkX3NvcnRlYWJsZXNdID0gc29ydGVhci5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWNpb25Tb3J0ZW8uc29ydGVhZG9fbW9zdHJhcj8uZm9yRWFjaCgobW9zdHJhcikgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNbbW9zdHJhci50YXJnZXRdID0gcmVzcHVlc3Rhc1VBW3Jlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5yZXN1bHRhZG9dIGFzIG51bWJlciAtIDFdW21vc3RyYXIuc291cmNlXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfc29ydGVhYmxlc10gPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF90b3RhbF0gPSByZXNwdWVzdGFzVUEubGVuZ3RoIHx8IG51bGw7IC8vbm8gcXVlcmVtb3MgZWwgdmFsb3IgMFxyXG4gICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8udmFyaWFibGVCb3RvbkZvcm11bGFyaW9VQV0gPSAnb2snO1xyXG4gICAgICAgICAgICBpZiAoY29uZmlndXJhY2lvblNvcnRlby52YXJpYWJsZUJvdG9uRm9ybXVsYXJpb1VBSW5kaXZpZHVhbCkge1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLnZhcmlhYmxlQm90b25Gb3JtdWxhcmlvVUFJbmRpdmlkdWFsXSA9ICdvayc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJhcnJlclN1YkFyYm9sKHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpeiwgbm9kb0FjdHVhbDogUmVzcHVlc3RhcyB8IFJlc3B1ZXN0YXNbXSwgdW5pZGFkX2FuYWxpc2lzOiBJZFVuaWRhZEFuYWxpc2lzLCBmb3JQa0FjdW11bGFkbzogRm9yUGspIHtcclxuICAgIHZhciB1YURlZiA9IGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXNbdW5pZGFkX2FuYWxpc2lzXTtcclxuICAgIHZhciBlc0FycmF5ID0gbm9kb0FjdHVhbCBpbnN0YW5jZW9mIEFycmF5O1xyXG4gICAgdmFyIGNvbmp1bnRvOiBSZXNwdWVzdGFzW10gPSBlc0FycmF5ID8gbm9kb0FjdHVhbCBhcyBSZXNwdWVzdGFzW10gOiBbbm9kb0FjdHVhbCBhcyBSZXNwdWVzdGFzXTtcclxuICAgIFxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25qdW50by5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhciByZXNwID0gY29uanVudG9baV07XHJcbiAgICAgICAgaWYgKCFyZXNwKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgdmFyIG51bSA9IGVzQXJyYXkgPyBpICsgMSA6IChmb3JQa0FjdW11bGFkb1t1YURlZi5wa19hZ3JlZ2FkYV0gfHwgMSk7XHJcbiAgICAgICAgdmFyIGlkRm9ybXVsYXJpb3MgPSBPYmplY3Qua2V5cyhlc3RydWN0dXJhLmZvcm11bGFyaW9zKS5maWx0ZXIoa2V5ID0+IGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3Nba2V5IGFzIElkRm9ybXVsYXJpb10uY2FzaWxsZXJvcy51bmlkYWRfYW5hbGlzaXMgPT09IHVuaWRhZF9hbmFsaXNpcyk7XHJcbiAgICAgICAgZm9yIChjb25zdCBpZEZvcm11bGFyaW8gb2YgaWRGb3JtdWxhcmlvcykge1xyXG4gICAgICAgICAgICB2YXIgbWlGb3JQazogRm9yUGsgPSB7IC4uLmZvclBrQWN1bXVsYWRvLCBbdWFEZWYucGtfYWdyZWdhZGFdOiBudW0sIGZvcm11bGFyaW86IGlkRm9ybXVsYXJpbyBhcyBJZEZvcm11bGFyaW8gfHwgZm9yUGtBY3VtdWxhZG8uZm9ybXVsYXJpbyB9O1xyXG4gICAgICAgICAgICBpZiAoZXNwZWNpYWxlcy5jYWxjdWxhclZhcmlhYmxlcykge1xyXG4gICAgICAgICAgICAgICAgZXNwZWNpYWxlcy5jYWxjdWxhclZhcmlhYmxlcyhyZXNwdWVzdGFzUmFpeiwgbWlGb3JQayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGVzcGVjaWFsZXMuY2FsY3VsYXJWYXJpYWJsZXNFc3BlY2lmaWNhc09wZXJhdGl2bykge1xyXG4gICAgICAgICAgICAgICAgZXNwZWNpYWxlcy5jYWxjdWxhclZhcmlhYmxlc0VzcGVjaWZpY2FzT3BlcmF0aXZvKHJlc3B1ZXN0YXNSYWl6LCBtaUZvclBrKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGhpamFzID0gbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbHRlcih1ID0+IHUucGFkcmUgPT09IHVuaWRhZF9hbmFsaXNpcykua2V5cygpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciB1YUhpamEgb2YgaGlqYXMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBoaWphc1Jlc3AgPSByZXNwW3VhSGlqYSBhcyBJZFVuaWRhZEFuYWxpc2lzXTtcclxuICAgICAgICAgICAgICAgIGlmIChoaWphc1Jlc3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBiYXJyZXJTdWJBcmJvbChyZXNwdWVzdGFzUmFpeiwgaGlqYXNSZXNwIGFzIFJlc3B1ZXN0YXNbXSwgdWFIaWphIGFzIElkVW5pZGFkQW5hbGlzaXMsIG1pRm9yUGspO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVjYWxjdWxhclRvZG9FbEFyYm9sKHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6OiBGb3JQaykge1xyXG4gICAgdmFyIHVhUHBhbCA9IE9iamVjdC5rZXlzKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbmQoa2V5ID0+ICFlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzW2tleSBhcyBJZFVuaWRhZEFuYWxpc2lzXS5wYWRyZSkgYXMgSWRVbmlkYWRBbmFsaXNpcztcclxuICAgIGJhcnJlclN1YkFyYm9sKHJlc3B1ZXN0YXNSYWl6LCByZXNwdWVzdGFzUmFpeiwgdWFQcGFsLCBmb3JQa1JhaXopO1xyXG4gICAgYmFycmVyU3ViQXJib2wocmVzcHVlc3Rhc1JhaXosIHJlc3B1ZXN0YXNSYWl6LCB1YVBwYWwsIGZvclBrUmFpeik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhckZlZWRiYWNrVW5pZGFkQW5hbGlzaXMoXHJcbiAgICBmZWVkYmFja1Jvd1ZhbGlkYXRvcjogeyBbZm9ybXVsYXJpbyBpbiBQbGFpbkZvclBrXTogRm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsIFZhbG9yLCBJZEZpbj4gfSxcclxuICAgIGZvcm11bGFyaW9zOiB7IFtub21icmVGb3JtdWxhcmlvIGluIElkRm9ybXVsYXJpb106IEluZm9Gb3JtdWxhcmlvIH0sXHJcbiAgICByZXNwdWVzdGFzOiBSZXNwdWVzdGFzLFxyXG4gICAgVUE6IElkVW5pZGFkQW5hbGlzaXMsXHJcbiAgICBmb3JQazogRm9yUGssXHJcbiAgICByZXNwdWVzdGFzQXVtZW50YWRhczogUmVzcHVlc3RhcywgLy8gaW5jbHV5ZW4gbGEgZGUgdG9kb3MgbG9zIHBhZHJlcyB5IGFuc2VzdHJvcyxcclxuICAgIHJlc3B1ZXN0YXNQYWRyZTogUmVzcHVlc3RhcyB8IG51bGwsXHJcbiAgICBvcHRzOiBPcGNpb25lc1Jvd1ZhbGlkYXRvcixcclxuKSB7XHJcbiAgICAvLyByZWNvcnJpZW5kIFVBIHBlcnNvbmFzIHkgbWFzY290YXNcclxuICAgIGZvciAodmFyIFVBaW5jbHVpZGEgb2YgZGVmT3BlcmF0aXZvLmRlZlVBW1VBXS5pbmNsdWlkYXMpIHtcclxuICAgICAgICB2YXIgcGtOdWV2YSA9IGRlZk9wZXJhdGl2by5kZWZVQVtVQWluY2x1aWRhXS5waztcclxuICAgICAgICB2YXIgY29uanVudG9SZXNwdWVzdGFzVUEgPSByZXNwdWVzdGFzW1VBaW5jbHVpZGFdO1xyXG4gICAgICAgIGxpa2VBcihjb25qdW50b1Jlc3B1ZXN0YXNVQSkuZm9yRWFjaCgocmVzcHVlc3Rhc0hpam8sIHZhbG9yUGtPUG9zaWNpb24pID0+IHtcclxuICAgICAgICAgICAgdmFyIHZhbG9yUGsgPSBudW1iZXJPclN0cmluZ0luY0lmQXJyYXkodmFsb3JQa09Qb3NpY2lvbiwgY29uanVudG9SZXNwdWVzdGFzVUEpO1xyXG4gICAgICAgICAgICBjYWxjdWxhckZlZWRiYWNrVW5pZGFkQW5hbGlzaXMoXHJcbiAgICAgICAgICAgICAgICBmZWVkYmFja1Jvd1ZhbGlkYXRvcixcclxuICAgICAgICAgICAgICAgIGZvcm11bGFyaW9zLFxyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc0hpam8sXHJcbiAgICAgICAgICAgICAgICBVQWluY2x1aWRhLFxyXG4gICAgICAgICAgICAgICAgeyAuLi5mb3JQaywgW3BrTnVldmFdOiB2YWxvclBrIH0sXHJcbiAgICAgICAgICAgICAgICB7IC4uLnJlc3B1ZXN0YXNBdW1lbnRhZGFzLCAuLi5yZXNwdWVzdGFzSGlqbywgW3BrTnVldmFdOiB2YWxvclBrIH0sXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzLFxyXG4gICAgICAgICAgICAgICAgb3B0c1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICAvLyBTMSAsIEExXHJcbiAgICBmb3IgKHZhciBlc0hlcm1hbm8gb2YgW3RydWUsIGZhbHNlXSkge1xyXG4gICAgICAgIGZvciAodmFyIGZvcm11bGFyaW8gb2YgZGVmT3BlcmF0aXZvLmRlZlVBW1VBXS5pZHNGb3IpIGlmICghIWVzSGVybWFubyA9PSAhIWRlZk9wZXJhdGl2by5kZWZGb3JbZm9ybXVsYXJpb10uaGVybWFubykge1xyXG4gICAgICAgICAgICB2YXIgcGxhaW5Gb3JQazogUGxhaW5Gb3JQayA9IHRvUGxhaW5Gb3JQayh7IC4uLmZvclBrLCBmb3JtdWxhcmlvIH0pXHJcbiAgICAgICAgICAgIHZhciBtYXhQYXNvc0F1dG9pbmdyZXNhZGFzID0gMTA7XHJcbiAgICAgICAgICAgIHZhciB2YXJBdXRvSW5ncmVzYWRhcyA9IFtdO1xyXG4gICAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaHVib0F1dG9pbmdyZXNvcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZmVlZGJhY2tSb3dWYWxpZGF0b3JbcGxhaW5Gb3JQa10gPVxyXG4gICAgICAgICAgICAgICAgICAgIHJvd1ZhbGlkYXRvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyBtYXJjYUZpbjogJ2ZpbicsIC4uLmZvcm11bGFyaW9zW2Zvcm11bGFyaW9dLmVzdHJ1Y3R1cmFSb3dWYWxpZGF0b3IgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc0F1bWVudGFkYXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHNcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB2YXIgeyByZXN1bWVuLCBhdXRvSW5ncmVzYWRhcyB9ID0gZmVlZGJhY2tSb3dWYWxpZGF0b3JbcGxhaW5Gb3JQa107XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFyTmFtZTogSWRWYXJpYWJsZTtcclxuICAgICAgICAgICAgICAgIGlmIChhdXRvSW5ncmVzYWRhcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXJOYW1lIGluIGF1dG9JbmdyZXNhZGFzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYW1iaW8gPSByZXNwdWVzdGFzW3Zhck5hbWVdICE9PSBhdXRvSW5ncmVzYWRhc1t2YXJOYW1lXSBhcyBWYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbWJpbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1t2YXJOYW1lXSA9IGF1dG9JbmdyZXNhZGFzW3Zhck5hbWVdIGFzIFZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc0F1bWVudGFkYXNbdmFyTmFtZV0gPSBhdXRvSW5ncmVzYWRhc1t2YXJOYW1lXSBhcyBWYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhckF1dG9JbmdyZXNhZGFzLnB1c2godmFyTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWJvQXV0b2luZ3Jlc29zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSB3aGlsZSAoaHVib0F1dG9pbmdyZXNvcyAmJiBtYXhQYXNvc0F1dG9pbmdyZXNhZGFzLS0gPiAwKTtcclxuICAgICAgICAgICAgdmFyQXV0b0luZ3Jlc2FkYXMuZm9yRWFjaChfdmFybmFtZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBmZWVkYmFja1Jvd1ZhbGlkYXRvcltwbGFpbkZvclBrXS5lc3RhZG9zW192YXJuYW1lIGFzIElkVmFyaWFibGVdID0gJ2FjdHVhbCc7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHZhciBCRl92YXJuYW1lID0gJyRCLicgKyBmb3JtdWxhcmlvIGFzIElkVmFyaWFibGVcclxuICAgICAgICAgICAgdmFyIGZvcm1QcmluY2lwYWxGb3JWaXZpZW5kYSA9IGdldE1haW5Gb3JtRm9yVml2aWVuZGEoZm9yUGtbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSk7XHJcbiAgICAgICAgICAgIGlmIChlc3RydWN0dXJhLmNvbmZpZ1NvcnRlbyAmJiAhZXN0cnVjdHVyYS5jb25maWdTb3J0ZW9bZm9ybVByaW5jaXBhbEZvclZpdmllbmRhXSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBoYXkgY29uZmlndXJhY2lvbiBkZSBzb3J0ZW8gcGFyYSBlbCBmb3JtdWxhcmlvICR7Zm9ybVByaW5jaXBhbEZvclZpdmllbmRhfWApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8gPSBlc3RydWN0dXJhLmNvbmZpZ1NvcnRlbyAmJiBlc3RydWN0dXJhLmNvbmZpZ1NvcnRlb1tmb3JtUHJpbmNpcGFsRm9yVml2aWVuZGFdO1xyXG4gICAgICAgICAgICB2YXIgcmVzdW1lbk9yTnVsbCA9XHJcbiAgICAgICAgICAgICAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvICYmXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnU29ydGVvRm9ybXVsYXJpby52YXJpYWJsZUJvdG9uRm9ybXVsYXJpb1VBSW5kaXZpZHVhbCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8udmFyaWFibGVCb3RvbkZvcm11bGFyaW9VQUluZGl2aWR1YWwgPT0gQkZfdmFybmFtZSA/XHJcbiAgICAgICAgICAgICAgICAgICAgJ29rJ1xyXG4gICAgICAgICAgICAgICAgICAgIDogcmVzdW1lbiA9PSAndmFjaW8nID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJlc3VtZW5cclxuICAgICAgICAgICAgaWYgKGVzSGVybWFubykge1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1tCRl92YXJuYW1lXSA9IHJlc3VtZW5Pck51bGwgPT0gJ29rJyA/ICdvaycgOiBudWxsO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3B1ZXN0YXNQYWRyZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvL3Jlc3B1ZXN0YXNQYWRyZVtCRl92YXJuYW1lXSA9IHJlc3VtZW5Pck51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJPclN0cmluZ0luY0lmQXJyYXkobnVtYmVyT3JTdHJpbmc6IG51bWJlciB8IHN0cmluZywgb2JqZWN0OiBvYmplY3QgfCBhbnlbXSk6IChudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZXN0b3kgdXNhbmRvIGlzTmFOIHBhcmEgdmVyIHNpIGVzIG8gbm8gdW4gbsO6bWVybyBzdW1hYmxlXHJcbiAgICBpZiAoaXNOYU4obnVtYmVyT3JTdHJpbmcpKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bWJlck9yU3RyaW5nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIE51bWJlcihudW1iZXJPclN0cmluZykgKyAob2JqZWN0IGluc3RhbmNlb2YgQXJyYXkgPyAxIDogMCk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYSA9ICh2YWx1ZVBrUmFpejogVmFsdWVQa1JhaXopOiBJZEZvcm11bGFyaW8gPT4ge1xyXG4gICAgcmV0dXJuIGRhdG9zQnlQYXNzLmluZm9ybWFjaW9uSGRyW3ZhbHVlUGtSYWl6XS50YXJlYS5tYWluX2Zvcm1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGFyRmVlZGJhY2tIb2phRGVSdXRhKCkge1xyXG4gICAgbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbHRlcih1YURlZiA9PiAhdWFEZWYucGFkcmUpLmZvckVhY2godWFEZWYgPT4ge1xyXG4gICAgICAgIHZhciBlc1ByaW5jaXBhbCA9IChmOiBGb3JtdWxhcmlvLCBlbmM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZm9ybXVsYXJpb1ByaW5jaXBhbCA9IGdldE1haW5Gb3JtRm9yVml2aWVuZGEoZW5jKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZvcm11bGFyaW9QcmluY2lwYWwgPyBmb3JtdWxhcmlvUHJpbmNpcGFsID09IGYuaWRfY2FzaWxsZXJvIDogZi5mb3JtdWxhcmlvX3ByaW5jaXBhbFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9hY8OhIGhheSBxdWUgc2FuaXRpemFyIHBvcnF1ZSBldmlkZW50ZW1lbnRlIHB1ZWRlIHZlbmlyIGNvbiBoYXNocyBkZSBlbmN1ZXN0YXMgc2luIGluZm8gZWwgZGF0b3NCeVBhc3MucmVzcHVlc3Rhc1xyXG4gICAgICAgIHZhciBjb25qdW50b1Jlc3B1ZXN0YXNVQSA9IGRhdG9zQnlQYXNzLnJlc3B1ZXN0YXNbdWFEZWYudW5pZGFkX2FuYWxpc2lzXVxyXG4gICAgICAgIGJlaW5nQXJyYXkoY29uanVudG9SZXNwdWVzdGFzVUEpLmZvckVhY2goKHJlc3B1ZXN0YXMsIHZhbG9yUGtPUG9zaWNpb24pID0+IHtcclxuICAgICAgICAgICAgdmFyIHZhbG9yUGsgPSBudW1iZXJPclN0cmluZ0luY0lmQXJyYXkodmFsb3JQa09Qb3NpY2lvbiwgY29uanVudG9SZXNwdWVzdGFzVUEpO1xyXG4gICAgICAgICAgICBsaWtlQXIoZXN0cnVjdHVyYS5mb3JtdWxhcmlvcykuZmlsdGVyKGYgPT4gZi5jYXNpbGxlcm9zLnVuaWRhZF9hbmFsaXNpcyA9PSB1YURlZi51bmlkYWRfYW5hbGlzaXMgJiYgZXNQcmluY2lwYWwoZi5jYXNpbGxlcm9zLCB2YWxvclBrIGFzIG51bWJlcikpLmZvckVhY2goKF9kZWZGLCBmb3JtdWxhcmlvKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZm9yUGtSYWl6ID0geyBmb3JtdWxhcmlvLCBbdWFEZWYucGtfYWdyZWdhZGFdOiB2YWxvclBrIH0gYXMgRm9yUGtSYWl6XHJcbiAgICAgICAgICAgICAgICBjYWxjdWxhckZlZWRiYWNrKHJlc3B1ZXN0YXMsIGZvclBrUmFpeiwge30pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGFyRmVlZGJhY2tFbmN1ZXN0YShcclxuICAgIGZlZWRiYWNrUm93VmFsaWRhdG9yOiB7IFtmb3JtdWxhcmlvIGluIFBsYWluRm9yUGtdOiBGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSwgVmFsb3IsIElkRmluPiB9LFxyXG4gICAgZm9ybXVsYXJpb3M6IHsgW25vbWJyZUZvcm11bGFyaW8gaW4gSWRGb3JtdWxhcmlvXTogSW5mb0Zvcm11bGFyaW8gfSxcclxuICAgIGZvclBrUmFpejogRm9yUGtSYWl6LFxyXG4gICAgcmVzcHVlc3RhczogUmVzcHVlc3RhcyxcclxuICAgIG9wdHM6IE9wY2lvbmVzUm93VmFsaWRhdG9yXHJcbikge1xyXG4gICAgdmFyIGZvclBrOiBGb3JQayA9IHsgLi4uZm9yUGtSYWl6IH07XHJcbiAgICBjYWxjdWxhckZlZWRiYWNrVW5pZGFkQW5hbGlzaXMoZmVlZGJhY2tSb3dWYWxpZGF0b3IsIGZvcm11bGFyaW9zLCByZXNwdWVzdGFzLCBkZWZPcGVyYXRpdm8uVUFwcmluY2lwYWwsIGZvclBrLCByZXNwdWVzdGFzLCBudWxsLCBvcHRzKTtcclxufVxyXG5cclxuZnVuY3Rpb24gY2FsY3VsYXJGZWVkYmFjayhyZXNwdWVzdGFzOiBSZXNwdWVzdGFzLCBmb3JQa1JhaXo6IEZvclBrUmFpeiwgb3B0czogT3BjaW9uZXNSb3dWYWxpZGF0b3IpIHtcclxuICAgIHZhciByZXN1bWVuRXN0YWRvOiBSZXN1bWVuRXN0YWRvO1xyXG4gICAgLy8gQHRzLWlnbm9yZSBQYXJ0aWFsXHJcbiAgICB2YXIgbnVldm9zUm93czogeyBbeCBpbiBQbGFpbkZvclBrXTogRm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsIElkRmluPiB9ID0ge31cclxuICAgIGNhbGN1bGFyRmVlZGJhY2tFbmN1ZXN0YShudWV2b3NSb3dzLCBlc3RydWN0dXJhLmZvcm11bGFyaW9zLCBmb3JQa1JhaXosIHJlc3B1ZXN0YXMsIG9wdHMpO1xyXG4gICAgZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IgPSBsaWtlQXIoZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IpLmZpbHRlcigoX2ZlZWRiYWNrOiBhbnksIHBsYWluUGs6IFBsYWluRm9yUGspID0+IEpTT04ucGFyc2UocGxhaW5QaylbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSAhPSBmb3JQa1JhaXpbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSkucGxhaW4oKTtcclxuICAgIGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yID0geyAuLi5kYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvciwgLi4ubnVldm9zUm93cyB9O1xyXG4gICAgZGF0b3NCeVBhc3MucmVzcHVlc3Rhc1tlc3RydWN0dXJhLnVhUHBhbF1bZm9yUGtSYWl6W2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF1dID0ge1xyXG4gICAgICAgIC4uLmRhdG9zQnlQYXNzLnJlc3B1ZXN0YXNbZXN0cnVjdHVyYS51YVBwYWxdW2ZvclBrUmFpeltlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdXSxcclxuICAgICAgICAuLi5jYWxjdWxhclJlc3VtZW5WaXZpZW5kYShcclxuICAgICAgICAgICAgZm9yUGtSYWl6LFxyXG4gICAgICAgICAgICBudWV2b3NSb3dzLFxyXG4gICAgICAgICAgICByZXNwdWVzdGFzXHJcbiAgICAgICAgKVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBidXNjYXJGb3JtdWxhcmlvc0hpam9zID0gKGlkRm9ybXVsYXJpbzogSWRGb3JtdWxhcmlvIHwgdW5kZWZpbmVkLCBmb3Jtc0ZlZWRiYWNrOiBJZEZvcm11bGFyaW9bXSA9IFtdKSA9PiB7XHJcbiAgICBpZiAoaWRGb3JtdWxhcmlvKSB7XHJcbiAgICAgICAgZm9yIChsZXQgY2FzaWxsZXJvIG9mIGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3NbaWRGb3JtdWxhcmlvXS5jYXNpbGxlcm9zLmNhc2lsbGVyb3MpIHtcclxuICAgICAgICAgICAgaWYgKGNhc2lsbGVyby50aXBvYyA9PSAnQkYnKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZm9ybUhpam8gPSAoY2FzaWxsZXJvLnNhbHRvPy5zdGFydHNXaXRoKCdGOicpID8gY2FzaWxsZXJvLnNhbHRvIDogJ0Y6JyArIGNhc2lsbGVyby5zYWx0bykgYXMgSWRGb3JtdWxhcmlvO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1IaWpvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybXNGZWVkYmFjay5wdXNoKGZvcm1IaWpvKTtcclxuICAgICAgICAgICAgICAgICAgICBidXNjYXJGb3JtdWxhcmlvc0hpam9zKGZvcm1IaWpvLCBmb3Jtc0ZlZWRiYWNrKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmb3Jtc0ZlZWRiYWNrO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIGdldEZvcm11bGFyaW9zRm9yVmFsdWVQa1JhaXogPSAodmFsdWVQa1JhaXo6IFZhbHVlUGtSYWl6KSA9PiB7XHJcbiAgICB2YXIgbWFpbkZvcm1Gb3JWYWx1ZVBrUmFpeiA9IGdldE1haW5Gb3JtRm9yVml2aWVuZGEodmFsdWVQa1JhaXopO1xyXG4gICAgdmFyIGZvcm1zRmVlZGJhY2sgPSBbbWFpbkZvcm1Gb3JWYWx1ZVBrUmFpel07XHJcbiAgICBidXNjYXJGb3JtdWxhcmlvc0hpam9zKG1haW5Gb3JtRm9yVmFsdWVQa1JhaXosIGZvcm1zRmVlZGJhY2spO1xyXG4gICAgcmV0dXJuIGZvcm1zRmVlZGJhY2s7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgY2FsY3VsYXJBY3R1YWxCRiA9IChjb25maWdTb3J0ZW9Gb3JtdWxhcmlvOiBDb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpbyB8IG51bGwsIG51bUVsZW1lbnRvVUE6IG51bWJlciwgbnVtQWN0dWFsOiBudW1iZXIgfCBudWxsLCBmb3JtdWxhcmlvOiBJZEZvcm11bGFyaW8sIHI6IFJlc3B1ZXN0YXMpID0+XHJcbiAgICAhIShjb25maWdTb3J0ZW9Gb3JtdWxhcmlvICYmXHJcbiAgICAgICAgY29uZmlnU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX2luZGl2aWR1YWwgJiZcclxuICAgICAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmlkX2Zvcm11bGFyaW9faW5kaXZpZHVhbCA9PSBmb3JtdWxhcmlvXHJcbiAgICAgICAgP1xyXG4gICAgICAgIG51bUVsZW1lbnRvVUEgPT0gY29hbGVzY2UoXHJcbiAgICAgICAgICAgIHJbY29uZmlnU29ydGVvRm9ybXVsYXJpby5yZXN1bHRhZG9fbWFudWFsXSxcclxuICAgICAgICAgICAgcltjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLnJlc3VsdGFkb11cclxuICAgICAgICApXHJcbiAgICAgICAgOlxyXG4gICAgICAgIG51bUFjdHVhbCA9PSBudW1FbGVtZW50b1VBXHJcbiAgICApXHJcblxyXG5leHBvcnQgdmFyIGNhbGN1bGFyRGlzYWJsZWRCRiA9IChcclxuICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW86IENvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvIHwgbnVsbCxcclxuICAgIGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbzogQ29uZmlndXJhY2lvbkhhYmlsaXRhckJvdG9uRm9ybXVsYXJpbyB8IG51bGwsXHJcbiAgICBudW1FbGVtZW50b1VBOiBudW1iZXIsXHJcbiAgICBmb3JtdWxhcmlvOiBJZEZvcm11bGFyaW8sXHJcbiAgICByOiBSZXNwdWVzdGFzXHJcbikgPT4ge1xyXG4gICAgaWYgKGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbyAmJiBoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW9bZm9ybXVsYXJpb10pIHtcclxuICAgICAgICB2YXIgZXhwcl9oYWJpbGl0YXJfZnVuID0gZ2V0RnVuY2lvbkhhYmlsaXRhcihoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW9bZm9ybXVsYXJpb10uZXhwcl9oYWJpbGl0YXJfYm90b25fanMpO1xyXG4gICAgICAgIHJldHVybiAhZXhwcl9oYWJpbGl0YXJfZnVuKHJbaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvW2Zvcm11bGFyaW9dLnVuaWRhZF9hbmFsaXNpc11bbnVtRWxlbWVudG9VQSAtIDFdKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gISEoY29uZmlnU29ydGVvRm9ybXVsYXJpbyAmJlxyXG4gICAgICAgICAgICAoY29uZmlnU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX2luZGl2aWR1YWwgPT0gZm9ybXVsYXJpbyB8fFxyXG4gICAgICAgICAgICAgICAgYnVzY2FyRm9ybXVsYXJpb3NIaWpvcyhjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmlkX2Zvcm11bGFyaW9faW5kaXZpZHVhbCkuaW5jbHVkZXMoZm9ybXVsYXJpbylcclxuICAgICAgICAgICAgKSAmJlxyXG4gICAgICAgICAgICBudW1FbGVtZW50b1VBICE9IGNvYWxlc2NlKFxyXG4gICAgICAgICAgICAgICAgcltjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLnJlc3VsdGFkb19tYW51YWxdLFxyXG4gICAgICAgICAgICAgICAgcltjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLnJlc3VsdGFkb11cclxuICAgICAgICAgICAgKSlcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBjYWxjdWxhclBlcm1pdGVCb3JyYXJCRiA9IChjb25maWdTb3J0ZW9Gb3JtdWxhcmlvOiBDb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpbyB8IG51bGwsIGZvcm11bGFyaW86IElkRm9ybXVsYXJpbykgPT5cclxuICAgICEoY29uZmlnU29ydGVvRm9ybXVsYXJpbyAmJlxyXG4gICAgICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19pbmRpdmlkdWFsID09IGZvcm11bGFyaW8pXHJcblxyXG50eXBlIFJlc3VsdGFkb1Jlc3VtZW4gPSB7XHJcbiAgICByZXN1bWVuRXN0YWRvOiBSZXN1bWVuRXN0YWRvLFxyXG4gICAgcmVzdW1lbkVzdGFkb1N1cDogUmVzdW1lbkVzdGFkbyxcclxuICAgIGNvZFJlYTogbnVtYmVyIHwgbnVsbCxcclxuICAgIGNvZE5vUmVhOiBzdHJpbmcgfCBudWxsLFxyXG4gICAgY29kUmVhU3VwOiBudW1iZXIgfCBudWxsXHJcbiAgICBjb2ROb1JlYVN1cDogc3RyaW5nIHwgbnVsbCxcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGFyUmVzdW1lblZpdmllbmRhKFxyXG4gICAgZm9yUGtSYWl6OiBGb3JQa1JhaXosXHJcbiAgICBmZWVkYmFja1Jvd1ZhbGlkYXRvcjogeyBbZm9ybXVsYXJpbyBpbiBQbGFpbkZvclBrXTogRm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsIFZhbG9yLCBJZEZpbj4gfSxcclxuICAgIHJlc3B1ZXN0YXM6IFJlc3B1ZXN0YXNcclxuKTogUmVzdWx0YWRvUmVzdW1lbiB7XHJcbiAgICB2YXIgeyBjb2RSZWEsIGVzUmVhIH0gPSBkZWZPcGVyYXRpdm8uZXNSZWFsaXphZGEocmVzcHVlc3RhcylcclxuICAgIHZhciB7IGNvZE5vUmVhLCBlc05vUmVhIH0gPSBkZWZPcGVyYXRpdm8uZXNOb1JlYShyZXNwdWVzdGFzKVxyXG4gICAgdmFyIHsgY29kUmVhU3VwLCBlc1JlYVN1cCB9ID0gZGVmT3BlcmF0aXZvLmVzUmVhbGl6YWRhU3VwKHJlc3B1ZXN0YXMpXHJcbiAgICB2YXIgeyBjb2ROb1JlYVN1cCwgZXNOb1JlYVN1cCB9ID0gZGVmT3BlcmF0aXZvLmVzTm9SZWFTdXAocmVzcHVlc3RhcylcclxuICAgIHZhciBmb3Jtc0ZlZWRiYWNrID0gZ2V0Rm9ybXVsYXJpb3NGb3JWYWx1ZVBrUmFpeihmb3JQa1JhaXpbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSk7XHJcbiAgICB2YXIgY29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8gPSBlc3RydWN0dXJhLmNvbmZpZ1NvcnRlbyAmJiBlc3RydWN0dXJhLmNvbmZpZ1NvcnRlb1tnZXRNYWluRm9ybUZvclZpdmllbmRhKGZvclBrUmFpeltlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdKV1cclxuICAgIHZhciBoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8gPSBlc3RydWN0dXJhLmhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbztcclxuICAgIHZhciBmZWVkQmFja1ZpdmllbmRhID0gbGlrZUFyKGZlZWRiYWNrUm93VmFsaWRhdG9yKS5maWx0ZXIoKF9yb3csIHBsYWluUGspID0+IHtcclxuICAgICAgICB2YXIgdGllbmVJbmRpdmlkdWFsID0gY29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8gJiYgISEoY29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19pbmRpdmlkdWFsICYmIGNvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvLmlkX2Zvcm11bGFyaW9fcGFkcmUpXHJcbiAgICAgICAgdmFyIHRpZW5lQm90b25EZXNIYWJpbGl0YWJsZSA9IGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbyAmJiBoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW9bSlNPTi5wYXJzZShwbGFpblBrKS5mb3JtdWxhcmlvIGFzIElkRm9ybXVsYXJpb107XHJcbiAgICAgICAgdmFyIHBrQWdyZWdhZGEgPSBudWxsO1xyXG4gICAgICAgIGlmICh0aWVuZUJvdG9uRGVzSGFiaWxpdGFibGUpIHtcclxuICAgICAgICAgICAgcGtBZ3JlZ2FkYSA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKCh1YSwgX2lkVUEpID0+XHJcbiAgICAgICAgICAgICAgICB1YS51bmlkYWRfYW5hbGlzaXMgPT0gaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvW0pTT04ucGFyc2UocGxhaW5QaykuZm9ybXVsYXJpbyBhcyBJZEZvcm11bGFyaW9dLnVuaWRhZF9hbmFsaXNpcyk/LnBrX2FncmVnYWRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShwbGFpblBrKVtlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdID09IGZvclBrUmFpeltlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdICYmXHJcbiAgICAgICAgICAgIGZvcm1zRmVlZGJhY2suaW5jbHVkZXMoSlNPTi5wYXJzZShwbGFpblBrKS5mb3JtdWxhcmlvKSAmJlxyXG4gICAgICAgICAgICAodGllbmVCb3RvbkRlc0hhYmlsaXRhYmxlID9cclxuICAgICAgICAgICAgICAgICFjYWxjdWxhckRpc2FibGVkQkYoXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8sXHJcbiAgICAgICAgICAgICAgICAgICAgaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvLFxyXG4gICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2UocGxhaW5QaylbcGtBZ3JlZ2FkYSBhcyBDYW1wb1BrXSxcclxuICAgICAgICAgICAgICAgICAgICBKU09OLnBhcnNlKHBsYWluUGspLmZvcm11bGFyaW8sXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc0ZvclBrKEpTT04ucGFyc2UocGxhaW5QayksIHRydWUpLnJlc3B1ZXN0YXNBdW1lbnRhZGFzXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICA6IHRpZW5lSW5kaXZpZHVhbCA/XHJcbiAgICAgICAgICAgICAgICAgICAgIWNhbGN1bGFyRGlzYWJsZWRCRihcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5wYXJzZShwbGFpblBrKS5wZXJzb25hLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBKU09OLnBhcnNlKHBsYWluUGspLmZvcm11bGFyaW8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzdHJ1Y3R1cmEuY29uUmVhSG9nYXIgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5wYXJzZShwbGFpblBrKS5ob2dhciA/IHJlc3B1ZXN0YXNGb3JQayh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF06IGZvclBrUmFpeltlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm11bGFyaW86IGNvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvLmlkX2Zvcm11bGFyaW9fcGFkcmUhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvZ2FyOiBKU09OLnBhcnNlKHBsYWluUGspLmhvZ2FyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIEZvclBrKS5yZXNwdWVzdGFzIDoge30gYXMgUmVzcHVlc3Rhc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc0ZvclBrKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXTogZm9yUGtSYWl6W2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybXVsYXJpbzogY29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19wYWRyZSEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIEZvclBrKS5yZXNwdWVzdGFzXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIDogdHJ1ZSlcclxuICAgIH0pLmFycmF5KCk7XHJcbiAgICB2YXIgcHJpb3JpZGFkZXM6IHsgW2tleSBpbiBSZXN1bWVuRXN0YWRvXTogeyBwcmlvcmlkYWQ6IG51bWJlciwgY2FudGlkYWQ6IG51bWJlciB9IH0gPSB7XHJcbiAgICAgICAgJ25vIHJlYSc6IHsgcHJpb3JpZGFkOiAxLCBjYW50aWRhZDogMCB9LFxyXG4gICAgICAgICdjb24gcHJvYmxlbWFzJzogeyBwcmlvcmlkYWQ6IDIsIGNhbnRpZGFkOiAwIH0sXHJcbiAgICAgICAgJ2luY29tcGxldG8nOiB7IHByaW9yaWRhZDogMywgY2FudGlkYWQ6IDAgfSxcclxuICAgICAgICAndmFjaW8nOiB7IHByaW9yaWRhZDogNCwgY2FudGlkYWQ6IDAgfSxcclxuICAgICAgICAnY2l0YSBwYWN0YWRhJzogeyBwcmlvcmlkYWQ6IDUsIGNhbnRpZGFkOiAwIH0sXHJcbiAgICAgICAgJ29rJzogeyBwcmlvcmlkYWQ6IDYsIGNhbnRpZGFkOiAwIH1cclxuICAgIH1cclxuICAgIHZhciBtaW4gPSA2O1xyXG4gICAgdmFyIG1pblJlc3VtZW46IFJlc3VtZW5Fc3RhZG8gPSAnb2snO1xyXG4gICAgZm9yICh2YXIgZmVlZGJhY2sgb2YgZmVlZEJhY2tWaXZpZW5kYSkge1xyXG4gICAgICAgIHZhciByZXN1bWVuID0gZmVlZGJhY2sucmVzdW1lbjtcclxuICAgICAgICBwcmlvcmlkYWRlc1tyZXN1bWVuXS5jYW50aWRhZCsrO1xyXG4gICAgICAgIGlmIChwcmlvcmlkYWRlc1tyZXN1bWVuXS5wcmlvcmlkYWQgPCBtaW4pIHtcclxuICAgICAgICAgICAgbWluID0gcHJpb3JpZGFkZXNbcmVzdW1lbl0ucHJpb3JpZGFkO1xyXG4gICAgICAgICAgICBtaW5SZXN1bWVuID0gcmVzdW1lbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAobWluUmVzdW1lbiA9PSAndmFjaW8nICYmIHByaW9yaWRhZGVzWydvayddLmNhbnRpZGFkIHx8IG1pblJlc3VtZW4gPT0gJ2luY29tcGxldG8nKSB7XHJcbiAgICAgICAgaWYgKGZhbHNlIC8qcmVzcHVlc3Rhc1tzcDFdPT0yICYmIHJlc3B1ZXN0YXNbc3A2XT09bnVsbCovKSB7XHJcbiAgICAgICAgICAgIG1pblJlc3VtZW4gPSAnY2l0YSBwYWN0YWRhJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtaW5SZXN1bWVuID0gJ2luY29tcGxldG8nO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL1RPRE8gQVJSRUdMQVIgRVNURSBIT1JST1IsIEdFTkVSQUxJWkFSXHJcbiAgICB2YXIgdGFyZWEgPSBkYXRvc0J5UGFzcy5pbmZvcm1hY2lvbkhkcltmb3JQa1JhaXpbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSBhcyB1bmtub3duIGFzIElkRW5jXS50YXJlYS50YXJlYTtcclxuICAgIHZhciByZXN1bWVuRXN0YWRvOiBSZXN1bWVuRXN0YWRvO1xyXG4gICAgdmFyIHJlc3VtZW5Fc3RhZG9TdXA6IFJlc3VtZW5Fc3RhZG8gPSAndmFjaW8nO1xyXG4gICAgaWYgKHRhcmVhID09ICdzdXBlJykge1xyXG4gICAgICAgIHJlc3VtZW5Fc3RhZG9TdXAgPSBlc05vUmVhU3VwID8gJ25vIHJlYScgOiBtaW5SZXN1bWVuXHJcbiAgICAgICAgLy9wYXJhIHF1ZSBjb2xvcmVlIGJpZW4gZW4gbGEgaGRyIGRlbCBETSAobHVlZ28gZW4gYmJkZCBubyBzZSBndWFyZGEpXHJcbiAgICAgICAgcmVzdW1lbkVzdGFkbyA9IHJlc3VtZW5Fc3RhZG9TdXBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdW1lbkVzdGFkbyA9IGVzTm9SZWEgPyAnbm8gcmVhJyA6IG1pblJlc3VtZW5cclxuICAgIH1cclxuICAgIHZhciByZXN1bHRhZG86IFJlc3VsdGFkb1Jlc3VtZW4gPSB7XHJcbiAgICAgICAgcmVzdW1lbkVzdGFkbyxcclxuICAgICAgICByZXN1bWVuRXN0YWRvU3VwLFxyXG4gICAgICAgIGNvZFJlYSxcclxuICAgICAgICBjb2ROb1JlYSxcclxuICAgICAgICBjb2RSZWFTdXAsXHJcbiAgICAgICAgY29kTm9SZWFTdXBcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHRhZG9cclxufVxyXG4iXX0=
1105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnlwYXNzLWZvcm11bGFyaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdW5sb2dnZWQvYnlwYXNzLWZvcm11bGFyaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBK0NBLG9EQUVDO0lBV0QsMERBWUM7SUFFRCw4REFLQztJQUVELDBEQXFCQztJQU1ELG9EQUVDO0lBRUQsNEZBRUM7SUFzQ0QsMERBRUM7SUFFRCxvREFJQztJQXNCRCw0Q0FJQztJQWdCRCxzQ0FVQztJQUVELHdDQVVDO0lBV0QsMERBS0M7SUFFRCw0QkFFQztJQUVELHNDQUVDO0lBa0NELDhDQUlDO0lBTUQsMENBaURDO0lBRUQsZ0ZBdUNDO0lBRUQsNERBb0VDO0lBRUQsMENBUUM7SUFFRCw0Q0FRQztJQWtCRCxnREFDQztJQWdGRCxnRUFpQ0M7SUFPRCxrRUF1QkM7SUFFRCxzREFHQztJQUVELHNEQUVDO0lBRUQsMERBRUM7SUFFRCxvREFFQztJQUVELDhEQU9DO0lBRUQsMERBT0M7SUFFRCw0REFnQkM7SUFHRCx3Q0FLQztJQWlDRCxrREFnQkM7SUFFRCxrREEwQkM7SUFxR0QsZ0RBaUJDO0lBY0QsMENBa0lDO0lBaUNELHNEQUlDO0lBRUQsd0VBZ0ZDO0lBUUQsZ0VBaUJDO0lBRUQsNERBU0M7SUFnRkQsMERBaUdDO0lBdDFDRCxxQ0FBdUQ7SUFFdkQsaURBQW9HO0lBRXBHLCtDQUF5RDtJQUN6RCwyQ0FBc0M7SUFFdEMsbUNBeUJpQjtJQUVqQixtREFBa0Q7SUFDbEQseURBQXVEO0lBQ3ZELDJEQUc2QjtJQUM3Qiw2REFBeUQ7SUFDekQsNkRBQWdFO0lBMGxDdkQseUdBMWxDQSw2Q0FBd0IsT0EwbENBO0lBeGxDakMsSUFBSSxTQUFTLEdBQUcsRUFFZixDQUFBO0lBRUQsU0FBZ0Isb0JBQW9CLENBQUMsaUJBQXlDO1FBQzFFLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQTtJQUNuRCxDQUFD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O1FBQ3BDLG9FQUFvRTtRQUNwRSxJQUFJLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNsQixnQkFBZ0IsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFBO1lBQ3JELGFBQWEsR0FBRyxVQUFVLENBQUMsZUFBNkIsQ0FBa0IsQ0FBQTtRQUM5RSxDQUFDO2FBQU0sQ0FBQztZQUNKLGFBQWEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFBO1lBQy9DLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxrQkFBZ0MsQ0FBa0IsQ0FBQTtRQUNwRixDQUFDO1FBQ0QsSUFBSSxTQUFTLEdBQXFCO1lBQzlCLGFBQWE7WUFDYixnQkFBZ0I7WUFDaEIsTUFBTTtZQUNOLFFBQVE7WUFDUixTQUFTO1lBQ1QsV0FBVztTQUNkLENBQUE7UUFDRCxPQUFPLFNBQVMsQ0FBQTtJQUNwQixDQUFDO0lBRU0sTUFBTSx3QkFBd0IsR0FBRyxDQUFDLGNBQThCLEVBQUUsS0FBYyxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUM7SUFBaEssUUFBQSx3QkFBd0IsNEJBQXdJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3RyaWN0IGFzIGxpa2VBciwgYmVpbmdBcnJheSB9IGZyb20gXCJsaWtlLWFyXCI7XHJcblxyXG5pbXBvcnQgeyBnZXRSb3dWYWxpZGF0b3IsIEZvcm1TdHJ1Y3R1cmVTdGF0ZSwgT3BjaW9uZXNSb3dWYWxpZGF0b3IsIEZlZWRiYWNrIH0gZnJvbSBcInJvdy12YWxpZGF0b3JcIjtcclxuXHJcbmltcG9ydCB7IGNvbXBhcmVGb3JPcmRlciwgY29hbGVzY2UgfSBmcm9tIFwiYmVzdC1nbG9iYWxzXCI7XHJcbmltcG9ydCB7IGV4cGVjdGVkIH0gZnJvbSBcImNhc3QtZXJyb3JcIjtcclxuXHJcbmltcG9ydCB7XHJcbiAgICBFc3RydWN0dXJhLFxyXG4gICAgRm9yUGssIEZvclBrUmFpeixcclxuICAgIElkRmluLCBJZEZvcm11bGFyaW8sIElkUHJlZ3VudGEsIElkVGFyZWEsIElkVmFyaWFibGUsXHJcbiAgICBJZFVuaWRhZEFuYWxpc2lzLFxyXG4gICAgSW5mb0Zvcm11bGFyaW8sXHJcbiAgICBQbGFpbkZvclBrLCBSZXNwdWVzdGFzLCBSZXNwdWVzdGFzUmFpeiwgUmVzdW1lbkVzdGFkbyxcclxuICAgIFZhbG9yLCBWaXNpdGEsXHJcbiAgICB0b1BsYWluRm9yUGssXHJcbiAgICBVbmlkYWRBbmFsaXNpcyxcclxuICAgIEZvcm11bGFyaW8sXHJcbiAgICBDb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpbyxcclxuICAgIERhdG9zQnlQYXNzUGVyc2lzdGlibGVzLFxyXG4gICAgSWRFbmMsXHJcbiAgICBEZWZPcGVyYXRpdm8sXHJcbiAgICBpdGVyYXRvcixcclxuICAgIENvbmZpZ3VyYWNpb25IYWJpbGl0YXJCb3RvbkZvcm11bGFyaW8sXHJcbiAgICBDYW1wb1BrLFxyXG4gICAgSWRDYXJnYSxcclxuICAgIENhcmdhLFxyXG4gICAgQ2FtcG9Qa1JhaXosXHJcbiAgICBWYWx1ZVBrUmFpeixcclxuICAgIEZ1bmNpb25lc0NhbGN1bG9SZWFOb1JlYSxcclxuICAgIFJlc3VsdGFkb1Jlc3VtZW4sXHJcbiAgICBSZXN1bHRhZG9SZWFOb1JlYSxcclxufSBmcm9tIFwiLi90aXBvc1wiO1xyXG5cclxuaW1wb3J0IHsgZ2V0Rm9ybVJlbmRlcmVyIH0gZnJvbSBcIi4vcmVuZGVyLWNvbmZpZ1wiO1xyXG5pbXBvcnQgeyBhZGFwdGFyRXN0cnVjdHVyYSB9IGZyb20gXCIuL3JlZHV4LWZvcm11bGFyaW9cIjtcclxuaW1wb3J0IHtcclxuICAgIGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzLFxyXG4gICAgRXZhbHVhZG9yRXhwcmVzaW9uXHJcbn0gZnJvbSBcIi4vY2FsY3Vsb3MtZW5jdWVzdGFcIjtcclxuaW1wb3J0IHsgaGVscGVyc0Nhc2lsbGVyb3MgfSBmcm9tIFwiLi9oZWxwZXJzLWNhc2lsbGVyb3NcIjtcclxuaW1wb3J0IHsgbnVtYmVyT3JTdHJpbmdJbmNJZkFycmF5IH0gZnJvbSBcIi4vaGVscGVycy1mb3JtdWxhcmlvXCI7XHJcblxyXG52YXIgY29tb2RpbmVzID0ge30gYXMge1xyXG4gICAgY2FsY3VsYXJDb21vZGluZXM/OiAoZm9yUGs6IEZvclBrKSA9PiB2b2lkXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWxjdWxhckNvbW9kaW5lcyhjYWxjdWxhckNvbW9kaW5lczogKGZvclBrOiBGb3JQaykgPT4gdm9pZCkge1xyXG4gICAgY29tb2RpbmVzLmNhbGN1bGFyQ29tb2RpbmVzID0gY2FsY3VsYXJDb21vZGluZXNcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTGlzdGVuZXJDYW1iaW9WYXJpYWJsZSA9ICh2YXJpYWJsZTogc3RyaW5nLCB2YWxvcjogYW55LCBmb3JQaz86IEZvclBrLCByZXNwdWVzdGFzQXVtZW50YWRhcz86IFJlc3B1ZXN0YXMpID0+IHZvaWQ7XHJcblxyXG50eXBlIFN1c2NyaXBjaW9uQ2FtYmlvVmFyaWFibGUgPSB7XHJcbiAgICBsaXN0ZW5lcjogTGlzdGVuZXJDYW1iaW9WYXJpYWJsZTtcclxuICAgIHZhcmlhYmxlcz86IFNldDxzdHJpbmc+O1xyXG59O1xyXG5cclxudmFyIHN1c2NyaXBjaW9uZXNDYW1iaW9WYXJpYWJsZTogU3VzY3JpcGNpb25DYW1iaW9WYXJpYWJsZVtdID0gW107XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc3VzY3JpYmlyQ2FtYmlvVmFyaWFibGUobGlzdGVuZXI6IExpc3RlbmVyQ2FtYmlvVmFyaWFibGUsIHZhcmlhYmxlcz86IHN0cmluZyB8IHN0cmluZ1tdKTogKCkgPT4gdm9pZCB7XHJcbiAgICBjb25zdCB2YXJzU2V0ID0gdmFyaWFibGVzXHJcbiAgICAgICAgPyBuZXcgU2V0KEFycmF5LmlzQXJyYXkodmFyaWFibGVzKSA/IHZhcmlhYmxlcyA6IFt2YXJpYWJsZXNdKVxyXG4gICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgY29uc3Qgc3ViOiBTdXNjcmlwY2lvbkNhbWJpb1ZhcmlhYmxlID0geyBsaXN0ZW5lciwgdmFyaWFibGVzOiB2YXJzU2V0IH07XHJcbiAgICBzdXNjcmlwY2lvbmVzQ2FtYmlvVmFyaWFibGUucHVzaChzdWIpO1xyXG4gICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHN1c2NyaXBjaW9uZXNDYW1iaW9WYXJpYWJsZS5pbmRleE9mKHN1Yik7XHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgc3VzY3JpcGNpb25lc0NhbWJpb1ZhcmlhYmxlLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRlc3VzY3JpYmlyQ2FtYmlvVmFyaWFibGUobGlzdGVuZXI6IExpc3RlbmVyQ2FtYmlvVmFyaWFibGUpIHtcclxuICAgIGNvbnN0IGluZGV4ID0gc3VzY3JpcGNpb25lc0NhbWJpb1ZhcmlhYmxlLmZpbmRJbmRleChzID0+IHMubGlzdGVuZXIgPT09IGxpc3RlbmVyKTtcclxuICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgc3VzY3JpcGNpb25lc0NhbWJpb1ZhcmlhYmxlLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBub3RpZmljYXJDYW1iaW9WYXJpYWJsZSh2YXJpYWJsZTogc3RyaW5nLCB2YWxvcjogYW55LCBmb3JQaz86IEZvclBrLCByZXNwdWVzdGFzQXVtZW50YWRhcz86IFJlc3B1ZXN0YXMpIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3VzY3JpcGNpb25lc0NhbWJpb1ZhcmlhYmxlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgeyBsaXN0ZW5lciwgdmFyaWFibGVzIH0gPSBzdXNjcmlwY2lvbmVzQ2FtYmlvVmFyaWFibGVbaV07XHJcbiAgICAgICAgaWYgKHZhcmlhYmxlcykge1xyXG4gICAgICAgICAgICBsZXQgYXBsaWNhID0gdmFyaWFibGVzLmhhcyh2YXJpYWJsZSk7XHJcbiAgICAgICAgICAgIGlmICghYXBsaWNhICYmIHJlc3B1ZXN0YXNBdW1lbnRhZGFzKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmFyaWFibGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgaW4gcmVzcHVlc3Rhc0F1bWVudGFkYXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBsaWNhID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghYXBsaWNhKSBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGlzdGVuZXIodmFyaWFibGUsIHZhbG9yLCBmb3JQaywgcmVzcHVlc3Rhc0F1bWVudGFkYXMpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBlbiBsaXN0ZW5lciBkZSBjYW1iaW8gZGUgdmFyaWFibGUnLCBlcnIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxudmFyIGVzcGVjaWFsZXMgPSB7fSBhcyB7XHJcbiAgICBjYWxjdWxhclZhcmlhYmxlcz86IChyZXNwdWVzdGFzUmFpejogUmVzcHVlc3Rhc1JhaXosIGZvclBrOiBGb3JQaykgPT4gdm9pZFxyXG4gICAgY2FsY3VsYXJWYXJpYWJsZXNFc3BlY2lmaWNhc09wZXJhdGl2bz86IChyZXNwdWVzdGFzUmFpejogUmVzcHVlc3Rhc1JhaXosIGZvclBrOiBGb3JQaykgPT4gdm9pZFxyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWxjdWxhclZhcmlhYmxlcyhjYWxjdWxhclZhcmlhYmxlczogKHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpeiwgZm9yUGs6IEZvclBrKSA9PiB2b2lkKSB7XHJcbiAgICBlc3BlY2lhbGVzLmNhbGN1bGFyVmFyaWFibGVzID0gY2FsY3VsYXJWYXJpYWJsZXNcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldENhbGN1bGFyVmFyaWFibGVzRXNwZWNpZmljYXNPcGVyYXRpdm8oY2FsY3VsYXJWYXJpYWJsZXNFc3BlY2lmaWNhc09wZXJhdGl2bzogKHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpeiwgZm9yUGs6IEZvclBrKSA9PiB2b2lkKSB7XHJcbiAgICBlc3BlY2lhbGVzLmNhbGN1bGFyVmFyaWFibGVzRXNwZWNpZmljYXNPcGVyYXRpdm8gPSBjYWxjdWxhclZhcmlhYmxlc0VzcGVjaWZpY2FzT3BlcmF0aXZvXHJcbn1cclxuXHJcbnR5cGUgRGF0b3NCeVBhc3MgPSBEYXRvc0J5UGFzc1BlcnNpc3RpYmxlcyAmIHtcclxuICAgIGZlZWRiYWNrUm93VmFsaWRhdG9yOiB7ICAvLyBubyBzZSBwZXJzaXN0ZVxyXG4gICAgICAgIFtmb3JtdWxhcmlvIGluIFBsYWluRm9yUGtdOiBGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSwgVmFsb3IsIElkRmluPiAvLyByZXN1bHRhZG8gZGVsIHJvd1ZhbGlkYXRvciBwYXJhIGVzdGFkby5mb3JQa1xyXG4gICAgfVxyXG4gICAgZGlydHk6IGJvb2xlYW5cclxufTtcclxuXHJcbnZhciBkYXRvc0J5UGFzcyA9IHt9IGFzIERhdG9zQnlQYXNzXHJcblxyXG5leHBvcnQgY29uc3QgaGF5RGF0b3NCeVBhc3NBbG1hY2VuYWRvcyA9ICgpID0+IGRhdG9zQnlQYXNzICYmIE9iamVjdC5rZXlzKGRhdG9zQnlQYXNzKS5sZW5ndGggPiAwXHJcblxyXG5pbnRlcmZhY2UgUmVjdCB7XHJcbiAgICB0b3A6IG51bWJlcjtcclxuICAgIGxlZnQ6IG51bWJlcjtcclxuICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0UmVjdChlbGVtZW50OiBIVE1MRWxlbWVudCk6IFJlY3Qge1xyXG4gICAgdmFyIHJlY3Q6IFJlY3QgPSB7IHRvcDogMCwgbGVmdDogMCwgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGgsIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQgfTtcclxuICAgIHZhciBjdXJyZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBlbGVtZW50O1xyXG4gICAgd2hpbGUgKGN1cnJlbnQgIT0gbnVsbCkge1xyXG4gICAgICAgIHJlY3QudG9wICs9IGN1cnJlbnQub2Zmc2V0VG9wO1xyXG4gICAgICAgIHJlY3QubGVmdCArPSBjdXJyZW50Lm9mZnNldExlZnQ7XHJcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQub2Zmc2V0UGFyZW50IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiByZWN0O1xyXG59XHJcblxyXG4vL0B0cy1pZ25vcmUgYXJyYW5jYSBlbiBibGFuY29cclxudmFyIGVzdHJ1Y3R1cmE6IEVzdHJ1Y3R1cmEgPSBudWxsIGFzIEVzdHJ1Y3R1cmE7XHJcblxyXG5sZXQgcGVyc2lzdGlyRGF0b3NCeVBhc3NJbnRlcm5vOiAoZGJwcDogRGF0b3NCeVBhc3NQZXJzaXN0aWJsZXMpID0+IFByb21pc2U8YW55PiA9ICgpID0+IHtcclxuICAgIHRocm93IG5ldyBFcnJvcigncGVyc2lzdGlyRGF0b3NCeVBhc3MgU0lOIERFRklOSVInKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0UGVyc2lzdGlyRGF0b3NCeVBhc3MocGVyc2lzdGlyRGF0b3NCeVBhc3NGdW46IHR5cGVvZiBwZXJzaXN0aXJEYXRvc0J5UGFzcykge1xyXG4gICAgcGVyc2lzdGlyRGF0b3NCeVBhc3NJbnRlcm5vID0gcGVyc2lzdGlyRGF0b3NCeVBhc3NGdW47XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYnBwOiBEYXRvc0J5UGFzc1BlcnNpc3RpYmxlcykge1xyXG4gICAgYXdhaXQgZ2V0Rm9ybVJlbmRlcmVyKCkucGVyc2lzdGlyRGF0b3MoZGJwcCk7XHJcbiAgICBkYXRvc0J5UGFzcy5kaXJ0eSA9IGZhbHNlXHJcbiAgICByZWZyZXNjYXJNYXJjYURpcnR5KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBjcmVhckVuY3Vlc3RhID0gKGlkQ2FyZ2E6IElkQ2FyZ2EsIGNhbGxCYWNrOiAoZm9yUGtSYWl6OiBGb3JQa1JhaXopID0+IHZvaWQpID0+IHtcclxuICAgIGNvbnN0IE5FWFRfQVVUT19WQUxVRV9QS19SQUlaID0gZ2V0Rm9ybVJlbmRlcmVyKCkuZ2V0VWx0aW1vVmFsb3JQa1JhaXooKSB8fCAnLTEnO1xyXG4gICAgY29uc3QgZXN0cnVjdHVyYSA9IGdldEVzdHJ1Y3R1cmEoKTtcclxuICAgIGdldEZvcm1SZW5kZXJlcigpLnNldFVsdGltb1ZhbG9yUGtSYWl6KChOdW1iZXIoTkVYVF9BVVRPX1ZBTFVFX1BLX1JBSVopIC0gMSkudG9TdHJpbmcoKSk7XHJcbiAgICBkYXRvc0J5UGFzcy5yZXNwdWVzdGFzW2VzdHJ1Y3R1cmEudWFQcGFsXVtORVhUX0FVVE9fVkFMVUVfUEtfUkFJWiBhcyB1bmtub3duIGFzIElkRW5jXSA9IHt9IGFzIFJlc3B1ZXN0YXNSYWl6O1xyXG4gICAgZGF0b3NCeVBhc3MuaW5mb3JtYWNpb25IZHJbTkVYVF9BVVRPX1ZBTFVFX1BLX1JBSVogYXMgdW5rbm93biBhcyBJZEVuY10gPSB7XHJcbiAgICAgICAgLi4uZXN0cnVjdHVyYS5kZWZhdWx0SW5mb3JtYWNpb25IZHIsXHJcbiAgICAgICAgdGVtOiB7IC4uLmVzdHJ1Y3R1cmEuZGVmYXVsdEluZm9ybWFjaW9uSGRyLnRlbSB9XHJcbiAgICB9O1xyXG4gICAgZGF0b3NCeVBhc3MuaW5mb3JtYWNpb25IZHJbTkVYVF9BVVRPX1ZBTFVFX1BLX1JBSVogYXMgdW5rbm93biBhcyBJZEVuY10udGVtLmNhcmdhID0gaWRDYXJnYTtcclxuICAgIGNhbGN1bGFyRmVlZGJhY2tIb2phRGVSdXRhKCk7XHJcbiAgICBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYXRvc0J5UGFzcykudGhlbihcclxuICAgICAgICAoKSA9PiBjYWxsQmFjayh7XHJcbiAgICAgICAgICAgIGZvcm11bGFyaW86IGVzdHJ1Y3R1cmEuZGVmYXVsdEluZm9ybWFjaW9uSGRyLnRhcmVhLm1haW5fZm9ybSxcclxuICAgICAgICAgICAgW2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF06IE51bWJlcihORVhUX0FVVE9fVkFMVUVfUEtfUkFJWikgYXMgVmFsdWVQa1JhaXpcclxuICAgICAgICB9IGFzIEZvclBrUmFpeilcclxuICAgICkvL25vIHF1aXRhciBlbCBjYXN0ZW8gcG9ycXVlIHZpZW5lIGNvbW8gdGV4dG8geSBuZWNlc2l0byBxdWUgc2VhIG7Dum1lcm9cclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRFbmNvbGFyQmFja3VwKFxyXG4gICAgZW5jb2xhckJhY2t1cEZ1bjogKHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZvclBrUmFpejogRm9yUGtSYWl6LCByZXNwdWVzdGFzUmFpejogUmVzcHVlc3RhcykgPT4gdm9pZFxyXG4pIHtcclxuICAgIGVuY29sYXJCYWNrdXAgPSBlbmNvbGFyQmFja3VwRnVuXHJcbn1cclxuXHJcbmxldCBlbmNvbGFyQmFja3VwOiAodG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCwgZm9yUGtSYWl6OiBGb3JQa1JhaXosIHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzKSA9PiB2b2lkID0gKCkgPT4ge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU0lOIEVTUEVDSUZJQ0FSIGVuY29sYXJCYWNrdXBcIilcclxufVxyXG5cclxuZXhwb3J0IHZhciBpbnRlbnRhckJhY2t1cCA9IChmb3JQazogRm9yUGspID0+IHtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXogfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQaywgdHJ1ZSlcclxuICAgIHZhciB0b2tlbiA9IGRhdG9zQnlQYXNzLnRva2VuO1xyXG4gICAgaWYgKHRva2VuKSB7XHJcbiAgICAgICAgZW5jb2xhckJhY2t1cCh0b2tlbiwgZm9yUGtSYWl6LCByZXNwdWVzdGFzUmFpeik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwibm8gaGF5IHRva2VuLCBubyBzZSBwdWRvIGhhY2VyIGVsIGJhY2t1cFwiKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0RXN0cnVjdHVyYShlc3RydWN0dXJhQUNhcmdhcjogRXN0cnVjdHVyYSkge1xyXG4gICAgZXN0cnVjdHVyYSA9IGFkYXB0YXJFc3RydWN0dXJhKGVzdHJ1Y3R1cmFBQ2FyZ2FyKTtcclxuICAgIGRlZk9wZXJhdGl2by5VQXByaW5jaXBhbCA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKHVhID0+ICEhdWEucHJpbmNpcGFsKT8udW5pZGFkX2FuYWxpc2lzIVxyXG4gICAgZGVmT3BlcmF0aXZvLmRlZkZvciA9IGxpa2VBcihlc3RydWN0dXJhLmZvcm11bGFyaW9zKS5tYXAoZiA9PiAoeyBoZXJtYW5vOiBmLmNhc2lsbGVyb3MuaGVybWFubyB9KSkucGxhaW4oKVxyXG4gICAgZGVmT3BlcmF0aXZvLmRlZlVBID0gbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLm1hcCgodWFEZWYsIHVhKSA9PiAoe1xyXG4gICAgICAgIHBrOiB1YURlZi5wa19hZ3JlZ2FkYSBhcyBJZFZhcmlhYmxlLFxyXG4gICAgICAgIGluY2x1aWRhczogbGlrZUFyKHVhRGVmLmhpamFzKS5rZXlzKCksXHJcbiAgICAgICAgaWRzRm9yOiBsaWtlQXIoZXN0cnVjdHVyYS5mb3JtdWxhcmlvcykuZmlsdGVyKGYgPT4gZi5jYXNpbGxlcm9zLnVuaWRhZF9hbmFsaXNpcyA9PSB1YSkua2V5cygpXHJcbiAgICB9KSkucGxhaW4oKVxyXG4gICAgcmV0dXJuIGVzdHJ1Y3R1cmE7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXREYXRvc0J5UGFzcyhcclxuICAgIG51ZXZvUGFxdWV0ZTogRGF0b3NCeVBhc3NQZXJzaXN0aWJsZXMgJiB7IGRpcnR5PzogYm9vbGVhbiB9XHJcbikge1xyXG4gICAgZGF0b3NCeVBhc3MgPSB7XHJcbiAgICAgICAgZGlydHk6IGZhbHNlLFxyXG4gICAgICAgIC4uLm51ZXZvUGFxdWV0ZSxcclxuICAgICAgICBmZWVkYmFja1Jvd1ZhbGlkYXRvcjoge30gYXMgRGF0b3NCeVBhc3NbXCJmZWVkYmFja1Jvd1ZhbGlkYXRvclwiXVxyXG4gICAgfTtcclxuXHJcbiAgICBjYWxjdWxhckZlZWRiYWNrSG9qYURlUnV0YSgpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIGdldERhdG9zQnlQYXNzID0gKCkgPT4gZGF0b3NCeVBhc3NcclxuXHJcbmZ1bmN0aW9uIG9iamV0b1ZhY2lvKG86IG9iamVjdCkge1xyXG4gICAgZm9yICh2YXIgayBpbiBvKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGZWVkYmFja1Jvd1ZhbGlkYXRvcigpIHtcclxuICAgIGlmICghZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IgfHwgb2JqZXRvVmFjaW8oZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IpKSB7XHJcbiAgICAgICAgY2FsY3VsYXJGZWVkYmFja0hvamFEZVJ1dGEoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERpcnR5KCkge1xyXG4gICAgcmV0dXJuIGRhdG9zQnlQYXNzLmRpcnR5XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFc3RydWN0dXJhKCkge1xyXG4gICAgcmV0dXJuIGVzdHJ1Y3R1cmE7XHJcbn1cclxuXHJcbnR5cGUgRWxlbWVudG9zUmVnaXN0cmFibGVzID0gSFRNTERpdkVsZW1lbnQgfCBIVE1MQnV0dG9uRWxlbWVudCB8IEhUTUxJbnB1dEVsZW1lbnQ7XHJcblxyXG50eXBlIERpcmVjdEZ1bmN0aW9uPFQsIFJlc3VsdD4gPSAocmVzcHVlc3Rhc0F1bWVudGFkYXM6IFJlc3B1ZXN0YXMsIGZlZWRiYWNrRm9ybTogRm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsIFZhbG9yLCBJZEZpbj4sIGVsZW1lbnRvOiBULFxyXG4gICAgZmVlZGJhY2tBbGw6IHtcclxuICAgICAgICBbZm9ybXVsYXJpbyBpbiBQbGFpbkZvclBrXTogRm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsIFZhbG9yLCBJZEZpbj4gLy8gcmVzdWx0YWRvIGRlbCByb3dWYWxpZGF0b3IgcGFyYSBlc3RhZG8uZm9yUGtcclxuICAgIH0sXHJcbiAgICBlc3RydWN0dXJhOiBFc3RydWN0dXJhXHJcbikgPT4gUmVzdWx0XHJcblxyXG50eXBlIFJlZ2lzdHJvRWxlbWVudG88VCBleHRlbmRzIEVsZW1lbnRvc1JlZ2lzdHJhYmxlcz4gPSB7XHJcbiAgICBpZDogc3RyaW5nLFxyXG4gICAgZnVuOiBEaXJlY3RGdW5jdGlvbjxULCBhbnk+LFxyXG4gICAgdmFyaWFibGU/OiBJZFZhcmlhYmxlLFxyXG4gICAgZm9yUGs/OiBGb3JQayxcclxufSAmICh7XHJcbiAgICBwcm9wOiBrZXlvZiBUXHJcbiAgICBmdW46IERpcmVjdEZ1bmN0aW9uPFQsIFRba2V5b2YgVF0+IC8vIExvIHF1ZSByZXRvcm5hIGxhIGZ1bihjacOzbikgc2UgdXNhIHBhcmEgbGEgcHJvcChlcnR5KSBkZWwgZWxlbWVudG9cclxufSB8IHtcclxuICAgIGF0dHI6IHN0cmluZ1xyXG4gICAgZnVuOiBEaXJlY3RGdW5jdGlvbjxULCBzdHJpbmc+IC8vIExvIHF1ZSByZXRvcm5hIGxhIGZ1bihjacOzbikgc2UgdXNhIHBhcmEgZWwgdmFsb3IgZGVsIGF0dHIoaWJ1dG8pXHJcbn0gfCB7XHJcbiAgICBzdHlsZToga2V5b2YgQ1NTU3R5bGVEZWNsYXJhdGlvblxyXG4gICAgZnVuOiBEaXJlY3RGdW5jdGlvbjxULCBzdHJpbmc+IC8vIExvIHF1ZSByZXRvcm5hIGxhIGZ1bihjacOzbikgc2UgdXNhIHBhcmEgZWwgdmFsb3IgZGVsIHN0eWxlXHJcbn0gfCB7XHJcbiAgICBkaXJlY3Q6IHRydWVcclxuICAgIGZ1bjogRGlyZWN0RnVuY3Rpb248VCwgdm9pZD4gLy8gTGEgZnVuY2nDs24gdmEgYSB0b2NhciBkaXJlY3RhbWVudGUgZWwgZWxlbWVudG8geSBoYWNlciB0b2RvIGxvIHF1ZSB0ZW5nYSBxdWUgaGFjZXJcclxufSlcclxuXHJcbnR5cGUgUmVnaXN0cm9FbGVtZW50b3M8VCBleHRlbmRzIEVsZW1lbnRvc1JlZ2lzdHJhYmxlcz4gPSB7IFtpZDogc3RyaW5nXTogUmVnaXN0cm9FbGVtZW50bzxUPiAmIHsgZWxlbWVudG8/OiBUIH0gfTtcclxuXHJcbnZhciByZWdpc3Ryb0VsZW1lbnRvc0dsb2JhbCA9IHt9IGFzIFJlZ2lzdHJvRWxlbWVudG9zPEVsZW1lbnRvc1JlZ2lzdHJhYmxlcz47XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0cmFyRWxlbWVudG88VCBleHRlbmRzIEVsZW1lbnRvc1JlZ2lzdHJhYmxlcz4oZGVmOiBSZWdpc3Ryb0VsZW1lbnRvPFQ+KSB7XHJcbiAgICAvLyBAdHMtaWdub3JlIFPDrSwgcG9kcsOtYSBzZXIgcXVlIGxvcyB0aXBvcyBkZSBUIHNlYW4gZGlzdGludG9zLCBwZXJvIHZhbiBhIHNlciBjb2hlcmVudGVzXHJcbiAgICB2YXIgcmVnaXN0cm9FbGVtZW50b3M6IFJlZ2lzdHJvRWxlbWVudG9zPFQ+ID0gcmVnaXN0cm9FbGVtZW50b3NHbG9iYWw7XHJcbiAgICByZWdpc3Ryb0VsZW1lbnRvc1tkZWYuaWRdID0gZGVmO1xyXG59XHJcblxyXG50eXBlIFJlc3B1ZXN0YXNGb3JQa0NvbXVuID0geyByZXNwdWVzdGFzOiBSZXNwdWVzdGFzLCByZXNwdWVzdGFzUmFpejogUmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpejogRm9yUGtSYWl6LCB1bmlkYWRBbmFsaXNpczogVW5pZGFkQW5hbGlzaXMgfVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc3B1ZXN0YXNGb3JQayhmb3JQazogRm9yUGspOiBSZXNwdWVzdGFzRm9yUGtDb211blxyXG5leHBvcnQgZnVuY3Rpb24gcmVzcHVlc3Rhc0ZvclBrKGZvclBrOiBGb3JQaywgY29uQXVtZW50YWRhczogdHJ1ZSwgYWdyZWdhclNpRmFsdGE/OiBib29sZWFuKTogUmVzcHVlc3Rhc0ZvclBrQ29tdW4gJiB7IHJlc3B1ZXN0YXNBdW1lbnRhZGFzOiBSZXNwdWVzdGFzIH1cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc3B1ZXN0YXNGb3JQayhmb3JQazogRm9yUGssIGNvbkF1bWVudGFkYXM/OiBib29sZWFuLCBhZ3JlZ2FyU2lGYWx0YT86IGJvb2xlYW4pOiBSZXNwdWVzdGFzRm9yUGtDb211biAmIHsgcmVzcHVlc3Rhc0F1bWVudGFkYXM/OiBSZXNwdWVzdGFzIH0ge1xyXG4gICAgdmFyIHJlc3B1ZXN0YXNBdW1lbnRhZGFzID0ge30gYXMgUmVzcHVlc3RhcztcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbG8gcXVlIHNvYnJhciBkZSByZXNwdWVzdGFzIG5vIG1lIGltcG9ydGEuLi5cclxuICAgIHZhciByZXNwdWVzdGFzID0gZGF0b3NCeVBhc3MucmVzcHVlc3RhcyBhcyBSZXNwdWVzdGFzO1xyXG4gICAgdmFyIHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpejtcclxuICAgIHZhciBmb3JQa1JhaXo6IEZvclBrO1xyXG4gICAgdmFyIHVuaWRhZF9hbmFsaXNpczogSWRVbmlkYWRBbmFsaXNpcyB8IHVuZGVmaW5lZCA9IGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3NbZm9yUGsuZm9ybXVsYXJpb10uY2FzaWxsZXJvcy51bmlkYWRfYW5hbGlzaXNcclxuICAgIHZhciBmb3JQa0FwaWxhZGEgPSBmb3JQaztcclxuICAgIHZhciBwaWxhOiBbdW5pZGFkX2FuYWxpc2lzOiBJZFVuaWRhZEFuYWxpc2lzLCB1YURlZjogVW5pZGFkQW5hbGlzaXMsIGZvclBrOiBGb3JQa11bXSA9IFtdO1xyXG4gICAgd2hpbGUgKHVuaWRhZF9hbmFsaXNpcykge1xyXG4gICAgICAgIHZhciB1YURlZjogVW5pZGFkQW5hbGlzaXMgPSBlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzW3VuaWRhZF9hbmFsaXNpc107XHJcbiAgICAgICAgcGlsYS5wdXNoKFt1bmlkYWRfYW5hbGlzaXMsIHVhRGVmLCBmb3JQa0FwaWxhZGFdKTtcclxuICAgICAgICBmb3JQa0FwaWxhZGEgPSB7IC4uLmZvclBrQXBpbGFkYSB9O1xyXG4gICAgICAgIGRlbGV0ZSBmb3JQa0FwaWxhZGFbdWFEZWYucGtfYWdyZWdhZGFdXHJcbiAgICAgICAgdW5pZGFkX2FuYWxpc2lzID0gdWFEZWYucGFkcmVcclxuICAgIH1cclxuICAgIHdoaWxlIChwaWxhLmxlbmd0aCkge1xyXG4gICAgICAgIFt1bmlkYWRfYW5hbGlzaXMsIHVhRGVmLCBmb3JQa0FwaWxhZGFdID0gcGlsYS5wb3AoKSFcclxuICAgICAgICB2YXIgdmFsb3JQa09Qb3NpY2lvbiA9IGZvclBrQXBpbGFkYVt1YURlZi5wa19hZ3JlZ2FkYV07XHJcbiAgICAgICAgaWYgKHZhbG9yUGtPUG9zaWNpb24gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZmFsdGEgdW4gdmFsb3IgcGFyYSAke0pTT04uc3RyaW5naWZ5KHVhRGVmLnBrX2FncmVnYWRhKX1gKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVzcHVlc3Rhc1t1bmlkYWRfYW5hbGlzaXNdID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmVzcHVlc3Rhc1t1bmlkYWRfYW5hbGlzaXNdID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciByZXNwdWVzdGFzQW50ZXJpb3IgPSByZXNwdWVzdGFzO1xyXG4gICAgICAgIGxldCBwb3NpY2lvbiA9IHJlc3B1ZXN0YXNbdW5pZGFkX2FuYWxpc2lzXSBpbnN0YW5jZW9mIEFycmF5ID8gdmFsb3JQa09Qb3NpY2lvbiAtIDEgOiB2YWxvclBrT1Bvc2ljaW9uXHJcbiAgICAgICAgcmVzcHVlc3RhcyA9IHJlc3B1ZXN0YXNbdW5pZGFkX2FuYWxpc2lzXVtwb3NpY2lvbl07XHJcbiAgICAgICAgaWYgKHJlc3B1ZXN0YXMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBpZiAoYWdyZWdhclNpRmFsdGEpIHtcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXMgPSB7fSBhcyBSZXNwdWVzdGFzXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzQW50ZXJpb3JbdW5pZGFkX2FuYWxpc2lzXVtwb3NpY2lvbl0gPSByZXNwdWVzdGFzXHJcbiAgICAgICAgICAgICAgICBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYXRvc0J5UGFzcyk7IC8vIE9KTyBBU1lOQyBERVNDT05UUk9MQURBXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGV4aXN0ZSBlbCBlbGVtZW50byAnJHtwb3NpY2lvbn0nIGVuIGxhIHVuaWRhZF9hbmFsaXNpcyAnJHt1bmlkYWRfYW5hbGlzaXN9J2ApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvclBrUmFpeiB8fD0gZm9yUGtBcGlsYWRhO1xyXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgU8OpIHF1ZSBlcyByYcOteiBwb3IgY8OzbW8gZXN0b3kgcmV2b2x2aWVuZG8gbGEgcGlsYVxyXG4gICAgICAgIHJlc3B1ZXN0YXNSYWl6IHx8PSByZXNwdWVzdGFzO1xyXG4gICAgICAgIGlmIChjb25BdW1lbnRhZGFzKSB7XHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNBdW1lbnRhZGFzID0geyAuLi5yZXNwdWVzdGFzQXVtZW50YWRhcywgLi4ucmVzcHVlc3RhcywgW3VhRGVmLnBrX2FncmVnYWRhXTogdmFsb3JQa09Qb3NpY2lvbiB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICByZXNwdWVzdGFzLCByZXNwdWVzdGFzQXVtZW50YWRhcyxcclxuICAgICAgICAvLyBAdHMtaWdub3JlIFPDqSBxdWUgbGEgcGlsYSB0aWVuZSBhbCBtZW5vcyB1biBlbGVtZW50byBwb3IgbG8gdGFudG8gZXN0byBlc3TDoSBsbGVubyBzZWd1cm8uIFxyXG4gICAgICAgIHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXosIHVuaWRhZEFuYWxpc2lzOiB1YURlZlxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdm9sY2Fkb0luaWNpYWxFbGVtZW50b3NSZWdpc3RyYWRvcyhmb3JQa1JhaXo6IEZvclBrUmFpeikge1xyXG4gICAgdmFyIHsgcmVzcHVlc3Rhc0F1bWVudGFkYXMgfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQa1JhaXosIHRydWUpXHJcbiAgICB2YXIgcmVnaXN0cm9FbGVtZW50b3MgPSByZWdpc3Ryb0VsZW1lbnRvc0dsb2JhbDtcclxuICAgIHZhciBwbGFpbkZvclBrID0gdG9QbGFpbkZvclBrKGZvclBrUmFpeilcclxuICAgIHZhciByb3dWYWxpZGF0b3IgPSBkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvcltwbGFpbkZvclBrXTtcclxuICAgIGZvciAodmFyIGlkIGluIHJlZ2lzdHJvRWxlbWVudG9zKSB7XHJcbiAgICAgICAgdmFyIGRlZiA9IHJlZ2lzdHJvRWxlbWVudG9zW2lkXTtcclxuICAgICAgICBpZiAoZGVmLmVsZW1lbnRvKSB7XHJcbiAgICAgICAgICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyhkZWYuZWxlbWVudG8pKSB7XHJcbiAgICAgICAgICAgICAgICBkZWYuZWxlbWVudG8gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFkZWYuZWxlbWVudG8pIHtcclxuICAgICAgICAgICAgZGVmLmVsZW1lbnRvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVmLmlkKSBhcyBFbGVtZW50b3NSZWdpc3RyYWJsZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghZGVmLmVsZW1lbnRvKSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdCVVNDQU5ETyBlbCBlbGVtZW50byByZWdpc3RyYWRvICcsaWQsJ25vIGVzdMOhIGVuIGVsIERPTScpXHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgdmFsdWUgPSBkZWYuZnVuKHJlc3B1ZXN0YXNBdW1lbnRhZGFzLCByb3dWYWxpZGF0b3IsIGRlZi5lbGVtZW50bywgZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IsIGVzdHJ1Y3R1cmEpO1xyXG4gICAgICAgIGlmICgncHJvcCcgaW4gZGVmKSB7XHJcbiAgICAgICAgICAgIHNldFZhbG9yRGlzdGludG8oZGVmLmVsZW1lbnRvLCBkZWYucHJvcCwgdmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgnYXR0cicgaW4gZGVmKSB7XHJcbiAgICAgICAgICAgIHNldEF0dHJEaXN0aW50byhkZWYuZWxlbWVudG8sIGRlZi5hdHRyLCB2YWx1ZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCdzdHlsZScgaW4gZGVmKSB7XHJcbiAgICAgICAgICAgIHNldFZhbG9yRGlzdGludG8oZGVmLmVsZW1lbnRvLnN0eWxlLCBkZWYuc3R5bGUsIHZhbHVlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChyb3dWYWxpZGF0b3IuYWN0dWFsKSB7XHJcbiAgICAgICAgdmFyIHsgdG9wLCBib3R0b20gfSA9IGNhbGN1bGFyRWxlbWVudG9FbmZvY2Fkbyhyb3dWYWxpZGF0b3IuYWN0dWFsKTtcclxuICAgICAgICBpZiAodG9wICE9IG51bGwgJiYgYm90dG9tICE9IG51bGwpIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmFiLWFjdGl2by1hcnJpYmEnKS5lbFRvcFZpc2liaWxpemFyID0gdG9wO1xyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmYWItYWN0aXZvLWFiYWpvJykuZWxCb3R0b21WaXNpYmlsaXphciA9IGJvdHRvbTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhckVsZW1lbnRvRW5mb2NhZG8oaWRWYXJpYWJsZTogSWRWYXJpYWJsZSB8IElkRmluKSB7XHJcbiAgICB2YXIgZWxlbWVudG9WYXJpYWJsZUFFbmZvY2FyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWRWYXJpYWJsZSA9PSAnZmluJyA/IGBib3Rvbi12b2x2ZXItMmAgOiBgdmFyLSR7aWRWYXJpYWJsZX1gKVxyXG4gICAgICAgIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkVmFyaWFibGUpO1xyXG4gICAgdmFyIGVsZW1lbnRvID0gZWxlbWVudG9WYXJpYWJsZUFFbmZvY2FyO1xyXG4gICAgdmFyIE1BUkdFTl9TQ1JPTEwgPSA2NDtcclxuICAgIHZhciBhbHRvUGFudGFsbGEgPSB3aW5kb3cuaW5uZXJIZWlnaHQgKiAwLjcgLSBNQVJHRU5fU0NST0xMO1xyXG4gICAgdmFyIGVsZW1lbnRvRW50ZXJvOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsOyAvLyBlcyBlbCBlbGVtZW50byBxdWUgdmEgYSBlbnRhciBlbnRlcm8gZW4gcGFudGFsbGEsIGRlZmluZSBlbCBib3R0b21cclxuICAgIHZhciByZWN0RWxlbWVudG9FbnRlcm86IFJlY3QgfCBudWxsID0gbnVsbDtcclxuICAgIHZhciBlbGVtZW50b1N1cGVyaW9yOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsOyAvLyBlcyBlbCBlbGVtZW50byBxdWUgdmEgYSBtb3N0cmFyc2UgZGVzZGUgYXJyaWJhIGF1bnF1ZSBubyBlbnRyZSBlbnRlcm8sIGRlZmluZSBlbCB0b3BcclxuICAgIHZhciByZWN0RWxlbWVudG9TdXBlcmlvcjogUmVjdHwgbnVsbCA9IG51bGw7XHJcbiAgICB3aGlsZSAoZWxlbWVudG8gIT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgKGVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygndmFyaWFibGUnKVxyXG4gICAgICAgICAgICAgICAgfHwgZWxlbWVudG8uY2xhc3NMaXN0LmNvbnRhaW5zKCdtdWx0aXBsZScpXHJcbiAgICAgICAgICAgICAgICB8fCBlbGVtZW50by5jbGFzc0xpc3QuY29udGFpbnMoJ3ByZWd1bnRhJylcclxuICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRvLmNsYXNzTGlzdC5jb250YWlucygnY29uanVudG9wcmVndW50YXMnKVxyXG4gICAgICAgICAgICAgICAgfHwgZWxlbWVudG8uY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWNjaW9uLWJvdG9uLWZvcm11bGFyaW8nKVxyXG4gICAgICAgICAgICAgICAgfHwgZWxlbWVudG8uY2xhc3NMaXN0LmNvbnRhaW5zKCdib3RvbmZvcm11bGFyaW8nKVxyXG4gICAgICAgICAgICAgICAgfHwgZWxlbWVudG8uY2xhc3NMaXN0LmNvbnRhaW5zKCdib3Rvbi12b2x2ZXInKVxyXG4gICAgICAgICAgICApICYmIGVsZW1lbnRvLm9mZnNldEhlaWdodCA+IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnRvU3VwZXJpb3IgPT0gbnVsbCAmJiBlbGVtZW50by5jbGllbnRIZWlnaHQgPCBhbHRvUGFudGFsbGEpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRvRW50ZXJvID0gZWxlbWVudG87XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudG9FbnRlcm8gPT0gbnVsbCkgZWxlbWVudG9FbnRlcm8gPSBlbGVtZW50bztcclxuICAgICAgICAgICAgICAgIGlmIChyZWN0RWxlbWVudG9FbnRlcm8gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRvU3VwZXJpb3IgPSBlbGVtZW50b0VudGVyb1xyXG4gICAgICAgICAgICAgICAgICAgIHJlY3RFbGVtZW50b0VudGVybyA9IGdldFJlY3QoZWxlbWVudG9FbnRlcm8hKVxyXG4gICAgICAgICAgICAgICAgICAgIHJlY3RFbGVtZW50b1N1cGVyaW9yID0gcmVjdEVsZW1lbnRvRW50ZXJvO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdmFyIHJlY3QgPSBnZXRSZWN0KGVsZW1lbnRvKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZWN0RWxlbWVudG9FbnRlcm8udG9wICsgcmVjdEVsZW1lbnRvRW50ZXJvLmhlaWdodCAtIHJlY3QudG9wIDwgYWx0b1BhbnRhbGxhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudG9TdXBlcmlvciA9IGVsZW1lbnRvO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlY3RFbGVtZW50b1N1cGVyaW9yID0gcmVjdDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudG8gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsZW1lbnRvID0gZWxlbWVudG8/LnBhcmVudEVsZW1lbnQgPz8gbnVsbDtcclxuICAgIH1cclxuICAgIGlmIChlbGVtZW50b1N1cGVyaW9yID09IG51bGwpIHtcclxuICAgICAgICBlbGVtZW50b1N1cGVyaW9yID0gZWxlbWVudG9FbnRlcm87XHJcbiAgICB9XHJcbiAgICB2YXIgcmVzdWx0OiB7XHJcbiAgICAgICAgZWxlbWVudG9JbnB1dFZhcmlhYmxlPzogSFRNTEVsZW1lbnQgfCBudWxsXHJcbiAgICAgICAgdG9wPzogbnVtYmVyIHwgbnVsbFxyXG4gICAgICAgIGJvdHRvbT86IG51bWJlciB8IG51bGxcclxuICAgICAgICBlbmZvY2Fkbz86IGJvb2xlYW4gfCBudWxsXHJcbiAgICAgICAgZGVzZW5mb3F1ZT86IHN0cmluZyB8IG51bGxcclxuICAgIH0gPSB7fTtcclxuICAgIGlmIChlbGVtZW50b0VudGVybyAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHJlY3RFbGVtZW50b0VudGVybyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJlY3RFbGVtZW50b0VudGVybyA9IGdldFJlY3QoZWxlbWVudG9FbnRlcm8pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdC5lbGVtZW50b0lucHV0VmFyaWFibGUgPSBlbGVtZW50b1ZhcmlhYmxlQUVuZm9jYXI7XHJcbiAgICAgICAgdmFyIHRvcCA9IChyZWN0RWxlbWVudG9TdXBlcmlvciA/PyByZWN0RWxlbWVudG9FbnRlcm8pLnRvcCAtIE1BUkdFTl9TQ1JPTEw7XHJcbiAgICAgICAgcmVzdWx0LnRvcCA9IHRvcDtcclxuICAgICAgICByZXN1bHQuYm90dG9tID0gcmVjdEVsZW1lbnRvRW50ZXJvLnRvcCArIHJlY3RFbGVtZW50b0VudGVyby5oZWlnaHQ7XHJcbiAgICAgICAgaWYgKHRvcCA8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApIHtcclxuICAgICAgICAgICAgcmVzdWx0LmRlc2VuZm9xdWUgPSAnYXJyaWJhJztcclxuICAgICAgICB9IGVsc2UgaWYgKHJlY3RFbGVtZW50b0VudGVyby50b3AgKyByZWN0RWxlbWVudG9FbnRlcm8uaGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCArIGFsdG9QYW50YWxsYSkge1xyXG4gICAgICAgICAgICByZXN1bHQuZGVzZW5mb3F1ZSA9ICdhYmFqbyc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzdWx0LmVuZm9jYWRvID0gdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRBdHRyRGlzdGludG88TiBleHRlbmRzIHN0cmluZz4oXHJcbiAgICBvYmpldG86IHsgc2V0QXR0cmlidXRlOiAobmFtZTogTiwgdmFsb3I6IHN0cmluZykgPT4gdm9pZCwgZ2V0QXR0cmlidXRlOiAobmFtZTogTikgPT4gc3RyaW5nIHwgbnVsbCB9LFxyXG4gICAgbmFtZTogTixcclxuICAgIHZhbG9yOiBzdHJpbmdcclxuKSB7XHJcbiAgICBpZiAob2JqZXRvICYmIG9iamV0by5nZXRBdHRyaWJ1dGUobmFtZSkgIT0gdmFsb3IpIHtcclxuICAgICAgICBvYmpldG8uc2V0QXR0cmlidXRlKG5hbWUsIHZhbG9yKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldFZhbG9yRGlzdGludG88VCBleHRlbmRzIHt9LCBOIGV4dGVuZHMga2V5b2YgVD4oXHJcbiAgICBvYmpldG86IFQsXHJcbiAgICBuYW1lOiBOLFxyXG4gICAgdmFsb3I6IFRbTl1cclxuKSB7XHJcbiAgICBpZiAob2JqZXRvW25hbWVdICE9IHZhbG9yKSB7XHJcbiAgICAgICAgb2JqZXRvW25hbWVdID0gdmFsb3I7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNhbGN1bGFyVmFyaWFibGVzQm90b25Gb3JtdWxhcmlvKGZvclBrOiBGb3JQaykge1xyXG4gICAgaWYgKGVzdHJ1Y3R1cmEuaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvICYmICFkYXRvc0J5UGFzcz8uc29sb0xlY3R1cmEpIHtcclxuICAgICAgICB2YXIgeyByZXNwdWVzdGFzIH0gPSByZXNwdWVzdGFzRm9yUGsoZm9yUGspO1xyXG4gICAgICAgIGxpa2VBcihlc3RydWN0dXJhLmhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbylcclxuICAgICAgICAgICAgLmZvckVhY2goKGNvbmZpZ0JvdG9uRm9ybXVsYXJpbywgaWRGb3JtdWxhcmlvKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzcFVBID0gcmVzcHVlc3Rhc1tlc3RydWN0dXJhLmhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpb1tpZEZvcm11bGFyaW9dLnVuaWRhZF9hbmFsaXNpc107XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcFVBICE9IG51bGwgJiYgcmVzcFVBIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ0JvdG9uRm9ybXVsYXJpby5oYWJpbGl0YXJfYWdyZWdhcl9saXN0bykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzWyckQi4nICsgaWRGb3JtdWxhcmlvIGFzIElkVmFyaWFibGVdID0gJ29rJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFjY2lvbl9pZF9wcmVndW50YShfcGF5bG9hZDogeyBwcmVndW50YTogSWRQcmVndW50YSwgZm9yUGs6IEZvclBrIH0sIF9kYXRvc0J5UGFzczogRGF0b3NCeVBhc3MpIHtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IE5PX0NBTUJJQVJfX1NPTE9fVFJBRVJfU1RBVFVTID0gU3ltYm9sKCdOT19DQU1CSUFSX1NPTE9fVFJBRVJfU1RBVFVTJylcclxuZXhwb3J0IGNvbnN0IE5PX0NBTUJJQVJfX1ZFUklGSUNBUl9TSV9FU19ORUNFU0FSSU8gPSBTeW1ib2woJ05PX0NBTUJJQVJfVkVSSUZJQ0FSX1NJX0VTX05FQ0VTQVJJTycpXHJcblxyXG5mdW5jdGlvbiByZWZyZXNjYXJNYXJjYURpcnR5KCkge1xyXG4gICAgdmFyIGJvdG9uR3JhYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzYXZlLWJ1dHRvblwiKSBhcyBIVE1MQnV0dG9uRWxlbWVudDtcclxuICAgIGlmIChib3RvbkdyYWJhcikge1xyXG4gICAgICAgIGlmIChib3RvbkdyYWJhci5kaXNhYmxlZCAhPT0gIWRhdG9zQnlQYXNzLmRpcnR5KSB7XHJcbiAgICAgICAgICAgIGJvdG9uR3JhYmFyLmRpc2FibGVkID0gIWRhdG9zQnlQYXNzLmRpcnR5O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gYXBsaWNhckNhbWJpb1VuYVJlc3B1ZXN0YShcclxuICAgIGZvclBrOiBGb3JQayxcclxuICAgIHJlc3B1ZXN0YXM6IFJlc3B1ZXN0YXMsXHJcbiAgICB2YXJpYWJsZTogSWRWYXJpYWJsZSxcclxuICAgIHJlc3B1ZXN0YUlucHV0OiBWYWxvclxyXG4pIHtcclxuICAgIHZhciByZXNwdWVzdGEgPSByZXNwdWVzdGFJbnB1dDtcclxuICAgIHZhciB2YWxvckFudGVyaW9yID0gcmVzcHVlc3Rhc1t2YXJpYWJsZV07XHJcbiAgICBpZiAocmVzcHVlc3RhID09PSAnJykge1xyXG4gICAgICAgIHJlc3B1ZXN0YSA9IG51bGw7XHJcbiAgICB9IGVsc2UgaWYgKGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3NbZm9yUGsuZm9ybXVsYXJpb10uZXN0cnVjdHVyYVJvd1ZhbGlkYXRvci52YXJpYWJsZXNbdmFyaWFibGVdPy50aXBvID09ICdudW1lcm8nKSB7XHJcbiAgICAgICAgaWYgKHJlc3B1ZXN0YSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YSA9IE51bWJlcihyZXNwdWVzdGEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIHNpIGVzIHVuIGZhbHN5ICgwID09IGZhbHNlKSB0ZW5nbyBxdWUgY29tcGFyYXIgY29uICE9PVxyXG4gICAgdmFyIHJlY2VudE1vZGlmaWVkID0gcmVzcHVlc3RhID8gdmFsb3JBbnRlcmlvciAhPSByZXNwdWVzdGEgOiB2YWxvckFudGVyaW9yICE9PSByZXNwdWVzdGE7XHJcbiAgICBpZiAocmVjZW50TW9kaWZpZWQpIHtcclxuICAgICAgICByZXNwdWVzdGFzW3ZhcmlhYmxlXSA9IHJlc3B1ZXN0YSA/PyBudWxsOyAvLyBjYW1iaW8gdW5kZWZpbmVkIHBvciBudWxsXHJcbiAgICB9XHJcbiAgICByZXR1cm4geyByZWNlbnRNb2RpZmllZCwgdmFsb3JBbnRlcmlvciwgcmVzcHVlc3RhUHJvY2VzYWRhOiByZXNwdWVzdGEgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVmcmVzY2FyWVJlY2FsY3VsYXJCeXBhc3MoXHJcbiAgICBmb3JQazogRm9yUGssXHJcbiAgICByZXNwdWVzdGFzOiBSZXNwdWVzdGFzLFxyXG4gICAgcmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6LFxyXG4gICAgZm9yUGtSYWl6OiBGb3JQa1JhaXosXHJcbiAgICB2YXJpYWJsZXNNb2RpZmljYWRhczogSWRWYXJpYWJsZVtdLFxyXG4gICAgcmVjZW50TW9kaWZpZWQ6IGJvb2xlYW5cclxuKSB7XHJcbiAgICByZWNhbGN1bGFyVG9kb0VsQXJib2wocmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeik7XHJcbiAgICByZWNhbGN1bGFyQ29tb2RpbmVzRm9yUGsoZm9yUGspO1xyXG4gICAgaWYgKGVzdHJ1Y3R1cmEuY29uZmlnU29ydGVvICYmICFkYXRvc0J5UGFzcz8uc29sb0xlY3R1cmEpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhcmlhYmxlc01vZGlmaWNhZGFzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZlcmlmaWNhclNvcnRlbyh7XHJcbiAgICAgICAgICAgICAgICBjb25maWd1cmFjaW9uU29ydGVvOiBlc3RydWN0dXJhLmNvbmZpZ1NvcnRlb1tnZXRNYWluRm9ybUZvclZpdmllbmRhKGZvclBrW2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF0pXSxcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXMsXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzUmFpeixcclxuICAgICAgICAgICAgICAgIHZhcmlhYmxlQWN0dWFsOiB2YXJpYWJsZXNNb2RpZmljYWRhc1tpXSxcclxuICAgICAgICAgICAgICAgIGZvclBrOiBmb3JQa1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBkYXRvc0J5UGFzcy5kaXJ0eSA9IGRhdG9zQnlQYXNzLmRpcnR5IHx8IHJlY2VudE1vZGlmaWVkO1xyXG4gICAgcmVzcHVlc3Rhc1JhaXouJGRpcnR5ID0gcmVzcHVlc3Rhc1JhaXouJGRpcnR5IHx8IHJlY2VudE1vZGlmaWVkO1xyXG4gICAgcmVmcmVzY2FyTWFyY2FEaXJ0eSgpO1xyXG4gICAgY2FsY3VsYXJGZWVkYmFjayhyZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6LCB7IGF1dG9JbmdyZXNvOiB0cnVlIH0pO1xyXG4gICAgdmFyIGZlZWRiYWNrUm93ID0gZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3JbdG9QbGFpbkZvclBrKGZvclBrKV07XHJcbiAgICBjYWxjdWxhclZhcmlhYmxlc0JvdG9uRm9ybXVsYXJpbyhmb3JQayk7XHJcbiAgICB2b2xjYWRvSW5pY2lhbEVsZW1lbnRvc1JlZ2lzdHJhZG9zKGZvclBrKTtcclxuICAgIGNvbnN0IHsgcmVzcHVlc3Rhc0F1bWVudGFkYXMgfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQaywgdHJ1ZSk7XHJcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhcmlhYmxlc01vZGlmaWNhZGFzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgdmFyIHYgPSB2YXJpYWJsZXNNb2RpZmljYWRhc1tqXTtcclxuICAgICAgICBub3RpZmljYXJDYW1iaW9WYXJpYWJsZSh2IGFzIHN0cmluZywgcmVzcHVlc3Rhc0F1bWVudGFkYXNbdl0sIGZvclBrLCByZXNwdWVzdGFzQXVtZW50YWRhcyk7XHJcbiAgICB9XHJcbiAgICBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYXRvc0J5UGFzcyk7IC8vIE9KTyBBU1lOQyBERVNDT05UUk9MQURBXHJcbiAgICByZXR1cm4gZmVlZGJhY2tSb3c7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlY2FsY3VsYXJDb21vZGluZXNGb3JQayhmb3JQazogRm9yUGspIHtcclxuICAgIGlmIChjb21vZGluZXMuY2FsY3VsYXJDb21vZGluZXMpIHtcclxuICAgICAgICBjb21vZGluZXMuY2FsY3VsYXJDb21vZGluZXMoZm9yUGspO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX3JlZ2lzdHJhcl9yZXNwdWVzdGEocGF5bG9hZDoge1xyXG4gICAgZm9yUGs6IEZvclBrLFxyXG4gICAgdmFyaWFibGU6IElkVmFyaWFibGUgfCB0eXBlb2YgTk9fQ0FNQklBUl9fU09MT19UUkFFUl9TVEFUVVMsXHJcbiAgICByZXNwdWVzdGE6IFZhbG9yIHwgdHlwZW9mIE5PX0NBTUJJQVJfX1ZFUklGSUNBUl9TSV9FU19ORUNFU0FSSU9cclxufSwgX2RhdG9zQnlQYXNzOiBEYXRvc0J5UGFzcykge1xyXG4gICAgbGV0IHRva2VuID0gJ0FWRVJJR1VBUiBUT0RPJztcclxuICAgIGxldCB7IGZvclBrLCByZXNwdWVzdGEsIHZhcmlhYmxlIH0gPSBwYXlsb2FkO1xyXG4gICAgdmFyIHsgcmVzcHVlc3RhcywgcmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeiB9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrKTtcclxuICAgIHZhciB1bmlkYWRfYW5hbGlzaXMgPSBlc3RydWN0dXJhLmZvcm11bGFyaW9zW2ZvclBrLmZvcm11bGFyaW9dO1xyXG4gICAgdmFyIHJlY2VudE1vZGlmaWVkID0gZmFsc2U7XHJcbiAgICB2YXIgdmFsb3JBbnRlcmlvciA9IHZhcmlhYmxlICE9IE5PX0NBTUJJQVJfX1NPTE9fVFJBRVJfU1RBVFVTID8gcmVzcHVlc3Rhc1t2YXJpYWJsZV0gOiBudWxsO1xyXG4gICAgdmFyIGZlZWRiYWNrUm93ID0gZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3JbdG9QbGFpbkZvclBrKGZvclBrKV07XHJcbiAgICB2YXIgc2lndWllbnRlVmFyaWFibGU6IElkVmFyaWFibGUgfCBJZEZpbiB8IG51bGwgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgaWYgKHJlc3B1ZXN0YSAhPT0gTk9fQ0FNQklBUl9fVkVSSUZJQ0FSX1NJX0VTX05FQ0VTQVJJTyAmJiB2YXJpYWJsZSAhPSBOT19DQU1CSUFSX19TT0xPX1RSQUVSX1NUQVRVUykge1xyXG4gICAgICAgIHZhciByZXNDYW1iaW8gPSBhcGxpY2FyQ2FtYmlvVW5hUmVzcHVlc3RhKGZvclBrLCByZXNwdWVzdGFzLCB2YXJpYWJsZSwgcmVzcHVlc3RhKTtcclxuICAgICAgICByZWNlbnRNb2RpZmllZCA9IHJlc0NhbWJpby5yZWNlbnRNb2RpZmllZDtcclxuICAgICAgICBpZiAoIXJlY2VudE1vZGlmaWVkKSB7XHJcbiAgICAgICAgICAgIHNpZ3VpZW50ZVZhcmlhYmxlID0gZmVlZGJhY2tSb3cuZmVlZGJhY2tbdmFyaWFibGVdPy5zaWd1aWVudGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh2YXJpYWJsZSAhPSBOT19DQU1CSUFSX19TT0xPX1RSQUVSX1NUQVRVUyAmJiAocmVjZW50TW9kaWZpZWQgfHwgTk9fQ0FNQklBUl9fVkVSSUZJQ0FSX1NJX0VTX05FQ0VTQVJJTyAmJiBmZWVkYmFja1Jvdy5hdXRvSW5ncmVzYWRhcz8uW3ZhcmlhYmxlXSkpIHtcclxuICAgICAgICBmZWVkYmFja1JvdyA9IHJlZnJlc2NhcllSZWNhbGN1bGFyQnlwYXNzKGZvclBrLCByZXNwdWVzdGFzLCByZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6LCBbdmFyaWFibGVdLCByZWNlbnRNb2RpZmllZCk7XHJcbiAgICAgICAgc2lndWllbnRlVmFyaWFibGUgPSB2YXJpYWJsZTtcclxuICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgIHNpZ3VpZW50ZVZhcmlhYmxlID0gZmVlZGJhY2tSb3cuZmVlZGJhY2tbc2lndWllbnRlVmFyaWFibGVdPy5zaWd1aWVudGU7XHJcbiAgICAgICAgfSB3aGlsZSAodmFsb3JBbnRlcmlvciA9PSBudWxsICYmIHJlY2VudE1vZGlmaWVkICYmIHNpZ3VpZW50ZVZhcmlhYmxlICE9IG51bGwgJiYgc2lndWllbnRlVmFyaWFibGUgIT0gJ2ZpbicgJiYgZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1tmb3JQay5mb3JtdWxhcmlvXS5lc3RydWN0dXJhUm93VmFsaWRhdG9yLnZhcmlhYmxlc1tzaWd1aWVudGVWYXJpYWJsZV0uZnVuY2lvbkF1dG9JbmdyZXNhcik7XHJcbiAgICAgICAgaWYgKHNpZ3VpZW50ZVZhcmlhYmxlID09IG51bGwgJiYgZmVlZGJhY2tSb3cuZmVlZGJhY2tbdmFyaWFibGVdPy5lc3RhZG8gPT0gJ3ZhbGlkYScpIHtcclxuICAgICAgICAgICAgc2lndWllbnRlVmFyaWFibGUgPSAnZmluJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyByZWNlbnRNb2RpZmllZCwgc2lndWllbnRlVmFyaWFibGUsIHZhcmlhYmxlQWN0dWFsOiBmZWVkYmFja1Jvdy5hY3R1YWwgfTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgUmVnaXN0cm9SZXNwdWVzdGFTaW1wbGUgPSB7XHJcbiAgICB2YXJpYWJsZTogSWRWYXJpYWJsZSxcclxuICAgIHJlc3B1ZXN0YTogVmFsb3JcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25fcmVnaXN0cmFyX3Jlc3B1ZXN0YXMocGF5bG9hZDoge1xyXG4gICAgZm9yUGs6IEZvclBrLFxyXG4gICAgcmVzcHVlc3RhczogUmVnaXN0cm9SZXNwdWVzdGFTaW1wbGVbXVxyXG59LCBfZGF0b3NCeVBhc3M6IERhdG9zQnlQYXNzKSB7XHJcbiAgICBsZXQgeyBmb3JQaywgcmVzcHVlc3RhczogbGlzdGFSZXNwdWVzdGFzIH0gPSBwYXlsb2FkO1xyXG4gICAgdmFyIHsgcmVzcHVlc3RhcywgcmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeiB9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrKTtcclxuICAgIHZhciByZWNlbnRNb2RpZmllZEFueSA9IGZhbHNlO1xyXG4gICAgdmFyIHZhcmlhYmxlc01vZGlmaWNhZGFzOiBJZFZhcmlhYmxlW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RhUmVzcHVlc3Rhcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhciBpdGVtID0gbGlzdGFSZXNwdWVzdGFzW2ldO1xyXG4gICAgICAgIHZhciByZXNDYW1iaW8gPSBhcGxpY2FyQ2FtYmlvVW5hUmVzcHVlc3RhKGZvclBrLCByZXNwdWVzdGFzLCBpdGVtLnZhcmlhYmxlLCBpdGVtLnJlc3B1ZXN0YSk7XHJcbiAgICAgICAgaWYgKHJlc0NhbWJpby5yZWNlbnRNb2RpZmllZCkge1xyXG4gICAgICAgICAgICByZWNlbnRNb2RpZmllZEFueSA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhcmlhYmxlc01vZGlmaWNhZGFzLnB1c2goaXRlbS52YXJpYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZWNlbnRNb2RpZmllZEFueSAmJiB2YXJpYWJsZXNNb2RpZmljYWRhcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgcmVmcmVzY2FyWVJlY2FsY3VsYXJCeXBhc3MoZm9yUGssIHJlc3B1ZXN0YXMsIHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXosIHZhcmlhYmxlc01vZGlmaWNhZGFzLCByZWNlbnRNb2RpZmllZEFueSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHsgcmVjZW50TW9kaWZpZWQ6IHJlY2VudE1vZGlmaWVkQW55IH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25fcmVnaXN0cmFyX25vdGEocGF5bG9hZDogeyBmb3JQa1JhaXo6IEZvclBrUmFpeiwgdGFyZWE6IElkVGFyZWEsIG5vdGE6IHN0cmluZyB8IG51bGwgfSwgX2RhdG9zQnlQYXNzOiBEYXRvc0J5UGFzcykge1xyXG4gICAgbGV0IHsgZm9yUGtSYWl6LCB0YXJlYSwgbm90YSB9ID0gcGF5bG9hZDtcclxuICAgIGNvbnNvbGUubG9nKFwiRkFMVEEgLy8gVE9ET1wiKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX2FncmVnYXJfdmlzaXRhKHBheWxvYWQ6IHsgZm9yUGtSYWl6OiBGb3JQa1JhaXosIG9ic2VydmFjaW9uZXM6IHN0cmluZyB8IG51bGwgfSwgX2RhdG9zQnlQYXNzOiBEYXRvc0J5UGFzcykge1xyXG4gICAgbGV0IHsgZm9yUGtSYWl6LCBvYnNlcnZhY2lvbmVzIH0gPSBwYXlsb2FkO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX21vZGlmaWNhcl92aXNpdGEocGF5bG9hZDogeyBmb3JQa1JhaXo6IEZvclBrUmFpeiwgaW5kZXg6IG51bWJlciwgb3BjaW9uOiBrZXlvZiBWaXNpdGEsIHZhbG9yOiBzdHJpbmcgfCBudWxsIH0sIF9kYXRvc0J5UGFzczogRGF0b3NCeVBhc3MpIHtcclxuICAgIGxldCB7IGZvclBrUmFpeiwgaW5kZXgsIG9wY2lvbiwgdmFsb3IgfSA9IHBheWxvYWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25fYm9ycmFyX3Zpc2l0YShwYXlsb2FkOiB7IGZvclBrUmFpejogRm9yUGtSYWl6LCBpbmRleDogbnVtYmVyIH0sIF9kYXRvc0J5UGFzczogRGF0b3NCeVBhc3MpIHtcclxuICAgIGxldCB7IGZvclBrUmFpeiwgaW5kZXggfSA9IHBheWxvYWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25fYWdyZWdhcl9mb3JtdWxhcmlvKHsgZm9yUGsgfTogeyBmb3JQazogRm9yUGsgfSwgX2RhdG9zQnlQYXNzOiBEYXRvc0J5UGFzcykge1xyXG4gICAgdmFyIHsgcmVzcHVlc3RhcywgdW5pZGFkQW5hbGlzaXMsIHJlc3B1ZXN0YXNBdW1lbnRhZGFzLCByZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6IH0gPSByZXNwdWVzdGFzRm9yUGsoZm9yUGssIHRydWUsIHRydWUpO1xyXG4gICAgcmVjYWxjdWxhclRvZG9FbEFyYm9sKHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXopO1xyXG4gICAgcmVjYWxjdWxhckNvbW9kaW5lc0ZvclBrKGZvclBrKTtcclxuICAgIGNhbGN1bGFyRmVlZGJhY2tVbmlkYWRBbmFsaXNpcyhkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvciwgZXN0cnVjdHVyYS5mb3JtdWxhcmlvcywgcmVzcHVlc3RhcywgdW5pZGFkQW5hbGlzaXMudW5pZGFkX2FuYWxpc2lzLCBmb3JQaywgcmVzcHVlc3Rhc0F1bWVudGFkYXMsIG51bGwsIHt9KVxyXG4gICAgY2FsY3VsYXJWYXJpYWJsZXNCb3RvbkZvcm11bGFyaW8oZm9yUGspO1xyXG4gICAgcGVyc2lzdGlyRGF0b3NCeVBhc3MoZGF0b3NCeVBhc3MpOyAvLyBPSk8gQVNZTkMgREVTQ09OVFJPTEFEQVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWNjaW9uX2FicmlyX2Zvcm11bGFyaW8oeyBmb3JQayB9OiB7IGZvclBrOiBGb3JQayB9LCBfZGF0b3NCeVBhc3M6IERhdG9zQnlQYXNzKSB7XHJcbiAgICB2YXIgeyByZXNwdWVzdGFzLCB1bmlkYWRBbmFsaXNpcywgcmVzcHVlc3Rhc0F1bWVudGFkYXMsIHJlc3B1ZXN0YXNSYWl6LCBmb3JQa1JhaXogfSA9IHJlc3B1ZXN0YXNGb3JQayhmb3JQaywgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICByZWNhbGN1bGFyVG9kb0VsQXJib2wocmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeik7XHJcbiAgICByZWNhbGN1bGFyQ29tb2RpbmVzRm9yUGsoZm9yUGspO1xyXG4gICAgY2FsY3VsYXJGZWVkYmFja1VuaWRhZEFuYWxpc2lzKGRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yLCBlc3RydWN0dXJhLmZvcm11bGFyaW9zLCByZXNwdWVzdGFzLCB1bmlkYWRBbmFsaXNpcy51bmlkYWRfYW5hbGlzaXMsIGZvclBrLCByZXNwdWVzdGFzQXVtZW50YWRhcywgbnVsbCwge30pXHJcbiAgICBjYWxjdWxhclZhcmlhYmxlc0JvdG9uRm9ybXVsYXJpbyhmb3JQayk7XHJcbiAgICBwZXJzaXN0aXJEYXRvc0J5UGFzcyhkYXRvc0J5UGFzcyk7IC8vIE9KTyBBU1lOQyBERVNDT05UUk9MQURBXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhY2Npb25fYm9ycmFyX2Zvcm11bGFyaW8oeyBmb3JQaywgZm9yUGtQYWRyZSB9OiB7IGZvclBrOiBGb3JQaywgZm9yUGtQYWRyZTogRm9yUGsgfSkge1xyXG4gICAgdmFyIHsgcmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeiB9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrLCB0cnVlLCB0cnVlKTtcclxuICAgIHZhciB1bmlkYWRfYW5hbGlzaXM6IElkVW5pZGFkQW5hbGlzaXMgfCB1bmRlZmluZWQgPSBlc3RydWN0dXJhLmZvcm11bGFyaW9zW2ZvclBrLmZvcm11bGFyaW9dLmNhc2lsbGVyb3MudW5pZGFkX2FuYWxpc2lzXHJcbiAgICB2YXIgdWFEZWY6IFVuaWRhZEFuYWxpc2lzID0gZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpc1t1bmlkYWRfYW5hbGlzaXNdO1xyXG4gICAgdmFyIGluZGV4ID0gZm9yUGtbdWFEZWYucGtfYWdyZWdhZGFdIGFzIG51bWJlcjtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXM6IHJlc3B1ZXN0YXNQYWRyZSB9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrUGFkcmUsIHRydWUsIHRydWUpO1xyXG4gICAgKHJlc3B1ZXN0YXNQYWRyZVt1bmlkYWRfYW5hbGlzaXNdIGFzIFJlc3B1ZXN0YXNbXSkuc3BsaWNlKGluZGV4IC0gMSwgMSk7XHJcbiAgICByZWNhbGN1bGFyVG9kb0VsQXJib2wocmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeik7XHJcbiAgICByZWNhbGN1bGFyQ29tb2RpbmVzRm9yUGsoZm9yUGtQYWRyZSk7XHJcbiAgICBkYXRvc0J5UGFzcy5kaXJ0eSA9IGRhdG9zQnlQYXNzLmRpcnR5IHx8IHRydWU7XHJcbiAgICByZXNwdWVzdGFzUmFpei4kZGlydHkgPSByZXNwdWVzdGFzUmFpei4kZGlydHkgfHwgdHJ1ZTtcclxuICAgIHJlZnJlc2Nhck1hcmNhRGlydHkoKTtcclxuICAgIGNhbGN1bGFyRmVlZGJhY2socmVzcHVlc3Rhc1JhaXosIGZvclBrUmFpeiwgeyBhdXRvSW5ncmVzbzogdHJ1ZSB9KTtcclxuICAgIGNhbGN1bGFyVmFyaWFibGVzQm90b25Gb3JtdWxhcmlvKGZvclBrUGFkcmUpO1xyXG4gICAgdm9sY2Fkb0luaWNpYWxFbGVtZW50b3NSZWdpc3RyYWRvcyhmb3JQa1BhZHJlKTtcclxuICAgIHBlcnNpc3RpckRhdG9zQnlQYXNzKGRhdG9zQnlQYXNzKTsgLy8gT0pPIEFTWU5DIERFU0NPTlRST0xBREFcclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkaXNwYXRjaEJ5UGFzczxULCBSPihcclxuICAgIGZ1bjogKHBheWxvYWQ6IFQsIGRhdG9zOiB0eXBlb2YgZGF0b3NCeVBhc3MpID0+IFIsXHJcbiAgICBwYXlsb2FkOiBUXHJcbikge1xyXG4gICAgcmV0dXJuIGZ1bihwYXlsb2FkLCBkYXRvc0J5UGFzcyk7XHJcbn1cclxuXHJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IHVsdGltYVZhcmlibGVWaXZpZW5kYSA9ICdOT19FU1RBX0RFRklOSURBX0FVTi8vVE9ETycgYXMgSWRWYXJpYWJsZTtcclxuXHJcbmV4cG9ydCBjb25zdCBNQVhDUCA9IDIwO1xyXG5cclxuLyogUkVEVUNFUlMgKi9cclxuXHJcbnZhciByZWVtcGxhem9zSGFiaWxpdGFyOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gICAgZmFsc2U6ICdmYWxzZScsXHJcbiAgICB0cnVlOiAndHJ1ZScsXHJcbiAgICBcIj1cIjogJz09JyxcclxuICAgIFwiPD5cIjogJyE9JyxcclxuICAgIFwiJlwiOiAnJiYnLFxyXG4gICAgXCJ8XCI6ICd8fCcsXHJcbiAgICBcIk9SXCI6ICd8fCcsXHJcbiAgICBcIkFORFwiOiAnJiYnLFxyXG4gICAgXCJvclwiOiAnfHwnLFxyXG4gICAgXCJhbmRcIjogJyYmJyxcclxuICAgIFwibm90XCI6ICchJyxcclxuICAgIFwiTk9UXCI6ICchJyxcclxufTtcclxuXHJcbnR5cGUgRnVuY2lvbkhhYmlsaXRhciA9ICh2YWxvcmVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA9PiBib29sZWFuO1xyXG50eXBlIEZ1bmNpb25WYWxvcmFyID0gKHZhbG9yZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0pID0+IGFueTtcclxudmFyIGZ1bmNpb25lc0hhYmlsaXRhcjogeyBba2V5OiBzdHJpbmddOiBGdW5jaW9uSGFiaWxpdGFyIH0gPSB7XHJcbn1cclxudmFyIGZ1bmNpb25lc1ZhbG9yYXI6IHsgW2tleTogc3RyaW5nXTogRnVuY2lvblZhbG9yYXIgfSA9IHtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1pbmlDb21waWxhZG9yU1FsSnMoZXhwcmVzaW9uQ2FzaVNRTDogc3RyaW5nKSB7XHJcbiAgICB2YXIgZXhwcmVzaW9uID0gZXhwcmVzaW9uQ2FzaVNRTC5yZXBsYWNlKC9cXHUwMEEwL2csICcgJyk7XHJcbiAgICB2YXIgY3VlcnBvID0gZXhwcmVzaW9uLnJlcGxhY2UoL1xcYmlzIGRpc3RpbmN0IGZyb21cXGIvZ2ksICchPScpLnJlcGxhY2UoL1xcYi4rP1xcYi9nLCBmdW5jdGlvbiAoZWxUb2tlbikge1xyXG4gICAgICAgIHZhciBlbFRva2VuVHJpbWVhZG8gPSBlbFRva2VuLnRyaW0oKTtcclxuICAgICAgICBpZiAoZWxUb2tlblRyaW1lYWRvIGluIHJlZW1wbGF6b3NIYWJpbGl0YXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlZW1wbGF6b3NIYWJpbGl0YXJbZWxUb2tlblRyaW1lYWRvXTtcclxuICAgICAgICB9IGVsc2UgaWYgKC9eXFxkK1xcLj9cXGQqJC8udGVzdChlbFRva2VuVHJpbWVhZG8pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbFRva2VuXHJcbiAgICAgICAgfSBlbHNlIGlmICgvXlxcVyskLy50ZXN0KGVsVG9rZW5UcmltZWFkbykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVsVG9rZW5cclxuICAgICAgICB9IGVsc2UgaWYgKC9eXFxzKyQvLnRlc3QoZWxUb2tlbikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVsVG9rZW5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICdoZWxwZXJzLm51bGwyemVybyh2YWxvcmVzLicgKyBlbFRva2VuICsgJyknO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY3VlcnBvO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnVuY2lvbkNvbXBpbGFkYTxUPihjb25qdW50b0RlRnVuY2lvbmVzOiB7IFtrZXk6IHN0cmluZ106ICh2YWxvcmVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSA9PiBUIH0pIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAobm9tYnJlRnVuY2lvbkNvbW9FeHByZXNpb25Kczogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCFjb25qdW50b0RlRnVuY2lvbmVzW25vbWJyZUZ1bmNpb25Db21vRXhwcmVzaW9uSnNdKSB7XHJcbiAgICAgICAgICAgIHZhciBjdWVycG8gPSBub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgLy8gdmFyIGN1ZXJwbyA9IG1pbmlDb21waWxhZG9yU1FsSnMobm9tYnJlRnVuY2lvbkNvbW9FeHByZXNpb25Kcyk7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW50ZXJuYWxGdW4gPSBuZXcgRnVuY3Rpb24oJ3ZhbG9yZXMnLCAnaGVscGVycycsICdyZXR1cm4gJyArIGN1ZXJwbyk7XHJcbiAgICAgICAgICAgICAgICBjb25qdW50b0RlRnVuY2lvbmVzW25vbWJyZUZ1bmNpb25Db21vRXhwcmVzaW9uSnNdID0gZnVuY3Rpb24gKHZhbG9yZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gaW50ZXJuYWxGdW4odmFsb3JlcywgaGVscGVyc0Nhc2lsbGVyb3MpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRVJST1IgRUpFQ1VDQ0lPTiBFWFBSRVNJT04gRVhURVJOQSAnLCBub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzLCBleHBlY3RlZChlcnIpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjdWVycG8pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh2YWxvcmVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFUlJPUiBDT01QSUxBQ0lPTiBFWFBSRVNJT04gRVhURVJOQSAnLCBub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzLCBleHBlY3RlZChlcnIpKVxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coY3VlcnBvKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29uanVudG9EZUZ1bmNpb25lc1tub21icmVGdW5jaW9uQ29tb0V4cHJlc2lvbkpzXTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldEZ1bmNpb25IYWJpbGl0YXIgPSBnZXRGdW5jaW9uQ29tcGlsYWRhKGZ1bmNpb25lc0hhYmlsaXRhcik7XHJcbmV4cG9ydCBjb25zdCBnZXRGdW5jaW9uVmFsb3JhciA9IGdldEZ1bmNpb25Db21waWxhZGEoZnVuY2lvbmVzVmFsb3Jhcik7XHJcblxyXG5jb25zdCBldmFsdWFyRXhwcmVzaW9uUmVhOiBFdmFsdWFkb3JFeHByZXNpb24gPSAoY29uZGljaW9uSnMsIHJlc3B1ZXN0YXMpID0+XHJcbiAgICBnZXRGdW5jaW9uSGFiaWxpdGFyKGNvbmRpY2lvbkpzKShyZXNwdWVzdGFzKTtcclxuXHJcbnZhciByb3dWYWxpZGF0b3IgPSBnZXRSb3dWYWxpZGF0b3I8SWRWYXJpYWJsZSwgVmFsb3IsIElkRmluPih7IGdldEZ1bmNpb25IYWJpbGl0YXIsIGdldEZ1bmNpb25WYWxvcmFyIH0pXHJcblxyXG5leHBvcnQgdmFyIGRlZk9wZXJhdGl2bzogRGVmT3BlcmF0aXZvID0ge1xyXG4gICAgZXNOb1JlYTogKHJlc3B1ZXN0YXM6IFJlc3B1ZXN0YXMsIHRhcmVhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjb25zdCBlc3RydWN0dXJhID0gZ2V0RXN0cnVjdHVyYSgpO1xyXG4gICAgICAgIGNvbnN0IHVhUHJpbmNpcGFsID0gbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbmQoKHVhKSA9PiAhdWEucGFkcmUpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCByZXN1bHQ6IFJlc3VsdGFkb1JlYU5vUmVhPCdjb2ROb1JlYScsICdlc05vUmVhJz4gPSB7XHJcbiAgICAgICAgICAgIGNvZE5vUmVhOiBudWxsLFxyXG4gICAgICAgICAgICBlc05vUmVhOiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHtjb2RpZ28sIHJlc3VsdGFkb30gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3Rhcyh1YVByaW5jaXBhbCEsIHJlc3B1ZXN0YXMsIGVzdHJ1Y3R1cmEubm9SZWFzLCAnbm9fcmVhJywgdGFyZWEpO1xyXG4gICAgICAgIGlmKGNvZGlnbyAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXN1bHQuY29kTm9SZWEgPSBjb2RpZ287XHJcbiAgICAgICAgICAgIHJlc3VsdC5lc05vUmVhID0gcmVzdWx0YWRvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0sXHJcblxyXG4gICAgZXNOb1JlYVN1cDogKHJlc3B1ZXN0YXM6IFJlc3B1ZXN0YXMsIHRhcmVhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBjb25zdCBlc3RydWN0dXJhID0gZ2V0RXN0cnVjdHVyYSgpO1xyXG4gICAgICAgIGNvbnN0IHVhUHJpbmNpcGFsID0gbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbmQoKHVhKSA9PiAhdWEucGFkcmUpO1xyXG5cclxuICAgICAgICBsZXQgcmVzdWx0OiBSZXN1bHRhZG9SZWFOb1JlYTwnY29kTm9SZWFTdXAnLCAnZXNOb1JlYVN1cCc+ID0ge1xyXG4gICAgICAgICAgICBjb2ROb1JlYVN1cDogbnVsbCxcclxuICAgICAgICAgICAgZXNOb1JlYVN1cDogZmFsc2VcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHtjb2RpZ28sIHJlc3VsdGFkb30gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3Rhcyh1YVByaW5jaXBhbCEsIHJlc3B1ZXN0YXMsIGVzdHJ1Y3R1cmEubm9SZWFzU3VwLCAnbm9fcmVhX3N1cCcsIHRhcmVhKTtcclxuICAgICAgICBpZiAoY29kaWdvICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5jb2ROb1JlYVN1cCA9IGNvZGlnbztcclxuICAgICAgICAgICAgcmVzdWx0LmVzTm9SZWFTdXAgPSByZXN1bHRhZG87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9LFxyXG5cclxuICAgIGVzUmVhbGl6YWRhOiAocmVzcHVlc3RhczogUmVzcHVlc3RhcywgdGFyZWE6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVzdHJ1Y3R1cmEgPSBnZXRFc3RydWN0dXJhKCk7XHJcbiAgICAgICAgY29uc3QgdWFQcmluY2lwYWwgPSBsaWtlQXIoZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpcykuZmluZCgodWEpID0+ICF1YS5wYWRyZSk7XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ6IFJlc3VsdGFkb1JlYU5vUmVhPCdjb2RSZWEnLCAnZXNSZWEnPiA9IHtcclxuICAgICAgICAgICAgY29kUmVhOiBudWxsLFxyXG4gICAgICAgICAgICBlc1JlYTogZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3Qge2NvZGlnbywgcmVzdWx0YWRvfSA9IGJ1c2NhclJlYU5vUmVhRW5SZXNwdWVzdGFzKHVhUHJpbmNpcGFsISwgcmVzcHVlc3RhcywgZXN0cnVjdHVyYS5yZWFzLCAncmVhJywgdGFyZWEsIGV2YWx1YXJFeHByZXNpb25SZWEpO1xyXG4gICAgICAgIGlmKGNvZGlnbyAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXN1bHQuY29kUmVhID0gY29kaWdvO1xyXG4gICAgICAgICAgICByZXN1bHQuZXNSZWEgPSByZXN1bHRhZG87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9LFxyXG5cclxuICAgIGVzUmVhbGl6YWRhU3VwOiAocmVzcHVlc3RhczogUmVzcHVlc3RhcywgdGFyZWE6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGVzdHJ1Y3R1cmEgPSBnZXRFc3RydWN0dXJhKCk7XHJcbiAgICAgICAgY29uc3QgdWFQcmluY2lwYWwgPSBsaWtlQXIoZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpcykuZmluZCgodWEpID0+ICF1YS5wYWRyZSk7XHJcblxyXG4gICAgICAgIGxldCByZXN1bHQ6IFJlc3VsdGFkb1JlYU5vUmVhPCdjb2RSZWFTdXAnLCAnZXNSZWFTdXAnPiA9IHtcclxuICAgICAgICAgICAgY29kUmVhU3VwOiBudWxsLFxyXG4gICAgICAgICAgICBlc1JlYVN1cDogZmFsc2VcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHtjb2RpZ28sIHJlc3VsdGFkb30gPSBidXNjYXJSZWFOb1JlYUVuUmVzcHVlc3Rhcyh1YVByaW5jaXBhbCEsIHJlc3B1ZXN0YXMsIGVzdHJ1Y3R1cmEucmVhc1N1cCwgJ3JlYV9zdXAnLCB0YXJlYSwgZXZhbHVhckV4cHJlc2lvblJlYSk7XHJcbiAgICAgICAgaWYoY29kaWdvICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5jb2RSZWFTdXAgPSBjb2RpZ287XHJcbiAgICAgICAgICAgIHJlc3VsdC5lc1JlYVN1cCA9IHJlc3VsdGFkbztcclxuICAgICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9LFxyXG5cclxuICAgIFVBcHJpbmNpcGFsOiAnJyBhcyBJZFVuaWRhZEFuYWxpc2lzLFxyXG4gICAgZGVmVUE6IHt9IGFzIHsgW2kgaW4gSWRVbmlkYWRBbmFsaXNpc106IHsgcGs6IElkVmFyaWFibGUsIGluY2x1aWRhczogSWRVbmlkYWRBbmFsaXNpc1tdLCBpZHNGb3I6IElkRm9ybXVsYXJpb1tdIH0gfSxcclxuICAgIGRlZkZvcjoge30gYXMgeyBbZiBpbiBJZEZvcm11bGFyaW9dOiB7IGhlcm1hbm8/OiB0cnVlIH0gfVxyXG59O1xyXG5cclxuXHJcbi8vIDEuIFNvYnJlY2FyZ2EgcGFyYSBsYSBmb3JtYSBhbnRpZ3VhICg0IGZ1bmNpb25lcyBwb3NpY2lvbmFsZXMpXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWxjdWxvUmVhTm9SZWEoXHJcbiAgICBlc05vUmVhOiBGdW5jaW9uZXNDYWxjdWxvUmVhTm9SZWFbJ2VzTm9SZWEnXSxcclxuICAgIGVzTm9SZWFTdXA6IEZ1bmNpb25lc0NhbGN1bG9SZWFOb1JlYVsnZXNOb1JlYVN1cCddLFxyXG4gICAgZXNSZWFsaXphZGE6IEZ1bmNpb25lc0NhbGN1bG9SZWFOb1JlYVsnZXNSZWFsaXphZGEnXSxcclxuICAgIGVzUmVhbGl6YWRhU3VwOiBGdW5jaW9uZXNDYWxjdWxvUmVhTm9SZWFbJ2VzUmVhbGl6YWRhU3VwJ11cclxuKTogdm9pZDtcclxuXHJcbi8vIDIuIFNvYnJlY2FyZ2EgcGFyYSBsYSBmb3JtYSBudWV2YSAob2JqZXRvIHBhcmNpYWwpXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWxjdWxvUmVhTm9SZWEoXHJcbiAgICBmdW5jaW9uZXM6IFBhcnRpYWw8RnVuY2lvbmVzQ2FsY3Vsb1JlYU5vUmVhPlxyXG4pOiB2b2lkO1xyXG5cclxuLy8gMy4gSW1wbGVtZW50YWNpw7NuIHVuaWZpY2FkYVxyXG5leHBvcnQgZnVuY3Rpb24gc2V0Q2FsY3Vsb1JlYU5vUmVhKFxyXG4gICAgZXNOb1JlYU9yRnVuY2lvbmVzOlxyXG4gICAgICAgIHwgRnVuY2lvbmVzQ2FsY3Vsb1JlYU5vUmVhWydlc05vUmVhJ11cclxuICAgICAgICB8IFBhcnRpYWw8RnVuY2lvbmVzQ2FsY3Vsb1JlYU5vUmVhPixcclxuICAgIF9lc05vUmVhU3VwPzogRnVuY2lvbmVzQ2FsY3Vsb1JlYU5vUmVhWydlc05vUmVhU3VwJ10sXHJcbiAgICBfZXNSZWFsaXphZGE/OiBGdW5jaW9uZXNDYWxjdWxvUmVhTm9SZWFbJ2VzUmVhbGl6YWRhJ10sXHJcbiAgICBfZXNSZWFsaXphZGFTdXA/OiBGdW5jaW9uZXNDYWxjdWxvUmVhTm9SZWFbJ2VzUmVhbGl6YWRhU3VwJ11cclxuKTogdm9pZCB7XHJcbiAgICBpZiAodHlwZW9mIGVzTm9SZWFPckZ1bmNpb25lcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihcInNldENhbGN1bG9SZWFOb1JlYTogbGEgZm9ybWEgYW50aWd1YSBlc3TDoSBkZXByZWNhZGEsIHNlIGlnbm9yYW4gc29icmVzY3JpdHVyYXMsIHVzYXIgc2V0Q2FsY3Vsb1JlYU5vUmVhKHsgZXNOb1JlYSwgZXNOb1JlYVN1cCwgZXNSZWFsaXphZGEsIGVzUmVhbGl6YWRhU3VwIH0pXCIpO1xyXG4gICAgICAgIFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBkZWZPcGVyYXRpdm8gPSB7XHJcbiAgICAgICAgICAgIC4uLmRlZk9wZXJhdGl2byxcclxuICAgICAgICAgICAgLi4uZXNOb1JlYU9yRnVuY2lvbmVzXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG5cclxuLy8gVE9ETzogR0VORVJBTElaQVJcclxudHlwZSBQZXJzb25hID0geyBwMTogc3RyaW5nLCBwMjogbnVtYmVyLCBwMzogbnVtYmVyLCBwNDogbnVtYmVyIHwgbnVsbCwgcDU6IDEgfCBudWxsLCBwNjogMSB8IG51bGwgfVxyXG5cclxuZnVuY3Rpb24gbnVtKG51bTogbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCk6IG51bWJlciB7XHJcbiAgICAvL0B0cy1pZ25vcmUgbGEgZ3JhY2lhIGVzIG1ldGVyIG51bSBjdWFuZG8gZXMgc3RyaW5nXHJcbiAgICBpZiAoaXNOYU4obnVtIC0gMCkpIHJldHVybiAwO1xyXG4gICAgLy9AdHMtaWdub3JlIGxhIGdyYWNpYSBlcyBtZXRlciBudW0gY3VhbmRvIGVzIHN0cmluZ1xyXG4gICAgcmV0dXJuIG51bSAtIDA7XHJcbn1cclxuXHJcbnZhciBmdW5jaW9uZXNDb25vY2lkYXM6IHsgW2sgaW4gc3RyaW5nXTogYm9vbGVhbiB9ID0ge31cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZmljYXJTb3J0ZW8ob3B0czoge1xyXG4gICAgY29uZmlndXJhY2lvblNvcnRlbzogQ29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8sXHJcbiAgICByZXNwdWVzdGFzOiBSZXNwdWVzdGFzLFxyXG4gICAgcmVzcHVlc3Rhc1JhaXo6IFJlc3B1ZXN0YXNSYWl6XHJcbiAgICBmb3JQazogRm9yUGssXHJcbiAgICB2YXJpYWJsZUFjdHVhbDogSWRWYXJpYWJsZVxyXG5cclxufSkge1xyXG4gICAgY29uc3QgcmVzZXRlYXJTb3J0ZW8gPSAob3B0czogeyByZXNwdWVzdGFzOiBSZXNwdWVzdGFzIH0pID0+IHtcclxuICAgICAgICB2YXIgeyByZXNwdWVzdGFzIH0gPSBvcHRzO1xyXG4gICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5yZXN1bHRhZG9dID0gbnVsbDtcclxuICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfc29ydGVhYmxlc10gPSBudWxsO1xyXG4gICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5kaXNwYXJhZG9yXSA9IG51bGw7XHJcbiAgICAgICAgY29uZmlndXJhY2lvblNvcnRlby5zb3J0ZWFkb19tb3N0cmFyPy5mb3JFYWNoKChtb3N0cmFyKSA9PiByZXNwdWVzdGFzW21vc3RyYXIudGFyZ2V0XSA9IG51bGwpO1xyXG4gICAgICAgIGlmICgndmFyX2xldHJhJyBpbiBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kbykge1xyXG4gICAgICAgICAgICBpZiAocmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10gJiYgcmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10gaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgcGVyIG9mIGl0ZXJhdG9yKHJlc3B1ZXN0YXNbdW5pZGFkQW5hbGlzaXNdKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBlcltjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kby52YXJfbGV0cmFdID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2YXIgeyBjb25maWd1cmFjaW9uU29ydGVvLCB2YXJpYWJsZUFjdHVhbCwgcmVzcHVlc3RhcywgZm9yUGssIHJlc3B1ZXN0YXNSYWl6IH0gPSBvcHRzO1xyXG4gICAgdmFyIGlkRW5jID0gZm9yUGtbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXTtcclxuICAgIHZhciB7IHJlc3B1ZXN0YXNBdW1lbnRhZGFzLCByZXNwdWVzdGFzUmFpeiB9ID0gcmVzcHVlc3Rhc0ZvclBrKGZvclBrLCB0cnVlKTtcclxuICAgIHZhciBleHByX2luY29tcGxldGl0dWRfZnVuID0gZ2V0RnVuY2lvbkhhYmlsaXRhcihjb25maWd1cmFjaW9uU29ydGVvLmV4cHJfaW5jb21wbGV0aXR1ZF9qc1tyZXNwdWVzdGFzQXVtZW50YWRhcy52ZG9taW5pbyBhcyB1bmtub3duIGFzIG51bWJlcl0uZXhwcik7XHJcbiAgICB2YXIgZmlsdHJvX2Z1biA9IGdldEZ1bmNpb25IYWJpbGl0YXIoY29uZmlndXJhY2lvblNvcnRlby5maWx0cm9fanNbcmVzcHVlc3Rhc0F1bWVudGFkYXMudmRvbWluaW8gYXMgdW5rbm93biBhcyBudW1iZXJdLmV4cHIpO1xyXG4gICAgdmFyIHVuaWRhZEFuYWxpc2lzID0gY29uZmlndXJhY2lvblNvcnRlby51bmlkYWRfYW5hbGlzaXM7XHJcblxyXG4gICAgaWYgKGNvbmZpZ3VyYWNpb25Tb3J0ZW8ucGFyYW1ldHJvcy5pbmNsdWRlcyh2YXJpYWJsZUFjdHVhbCkpIHtcclxuICAgICAgICB2YXIgdWFQYWRyZSA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKCh1YSkgPT4gdWEudW5pZGFkX2FuYWxpc2lzID09IHVuaWRhZEFuYWxpc2lzKT8ucGFkcmU7XHJcbiAgICAgICAgdmFyIHBrQWdyZWdhZGFQYWRyZSA9IGxpa2VBcihlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzKS5maW5kKCh1YSkgPT4gdWEudW5pZGFkX2FuYWxpc2lzID09IHVhUGFkcmUpPy5wa19hZ3JlZ2FkYVxyXG4gICAgICAgIGlmIChlc3RydWN0dXJhLmNvblJlYUhvZ2FyKSB7XHJcbiAgICAgICAgICAgIGlmICh1YVBhZHJlICYmIHJlc3B1ZXN0YXNBdW1lbnRhZGFzW3VhUGFkcmVdKSB7XHJcbiAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmUgcGtBZ3JlZ2FkYVBhZHJlIGV4aXN0ZSBlIGluZGljYSBsYSBwb3NpY2lvbiBkZWwgcGFkcmVcclxuICAgICAgICAgICAgICAgIHZhciBwYWRyZSA9IHJlc3B1ZXN0YXNBdW1lbnRhZGFzW3VhUGFkcmVdW051bWJlcihyZXNwdWVzdGFzQXVtZW50YWRhc1twa0FncmVnYWRhUGFkcmVdKSAtIDFdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlQWN0dWFsICE9IGNvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfdG90YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYWRyZVtjb25maWd1cmFjaW9uU29ydGVvLmNhbnRpZGFkX3RvdGFsXSA9IGxpa2VBcihwYWRyZVt1bmlkYWRBbmFsaXNpc10gfHwgW10pLmFycmF5KCkubGVuZ3RoOyAvL3NpIGFncmVnYSBkZXNkZSBib3RvbiBhZ3JlZ2FyXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNldGVhclNvcnRlbyh7IHJlc3B1ZXN0YXM6IHBhZHJlIH0pO1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3RhcyA9IHBhZHJlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHVhUGFkcmUgJiYgcmVzcHVlc3Rhc1JhaXopIHtcclxuICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZSBwa0FncmVnYWRhUGFkcmUgZXhpc3RlIGUgaW5kaWNhIGxhIHBvc2ljaW9uIGRlbCBwYWRyZVxyXG4gICAgICAgICAgICAgICAgdmFyIHBhZHJlID0gcmVzcHVlc3Rhc1JhaXo7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVBY3R1YWwgIT0gY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF90b3RhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhZHJlW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfdG90YWxdID0gbGlrZUFyKHBhZHJlW3VuaWRhZEFuYWxpc2lzXSB8fCBbXSkuYXJyYXkoKS5sZW5ndGg7IC8vc2kgYWdyZWdhIGRlc2RlIGJvdG9uIGFncmVnYXJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc2V0ZWFyU29ydGVvKHsgcmVzcHVlc3RhczogcGFkcmUgfSk7XHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzID0gcGFkcmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAocmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10gIT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChyZXNwdWVzdGFzW3VuaWRhZEFuYWxpc2lzXSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICAgIHZhciByZXNwdWVzdGFzVUEgPSByZXNwdWVzdGFzW3VuaWRhZEFuYWxpc2lzXSBhcyBSZXNwdWVzdGFzW11cclxuICAgICAgICAgICAgaWYgKHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5kaXNwYXJhZG9yXSAhPSAxKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLmRpc3BhcmFkb3JdID09IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfdG90YWxdID0gcmVzcHVlc3Rhc1VBLmxlbmd0aCArIDFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJlc2V0ZWFyU29ydGVvKHsgcmVzcHVlc3RhcyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgY2FudGlkYWRUb3RhbCA9IE51bWJlcihyZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfdG90YWxdKTtcclxuICAgICAgICAgICAgaWYgKGNhbnRpZGFkVG90YWwgPCByZXNwdWVzdGFzVUEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBkb2JsZSBhc2lnbmFjacOzbiBwYXJhIHF1ZSBsbyBjYXJndWUgZW4gcmVzcHVlc3Rhc1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1VBID0gcmVzcHVlc3Rhc1VBLmZpbHRlcigocCwgaSkgPT5cclxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtZXRyb3Muc29tZSgocGFyYW0pID0+IHBbcGFyYW1dIHx8IGkgPD0gY2FudGlkYWRUb3RhbCAtIDEpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1t1bmlkYWRBbmFsaXNpc10gPSByZXNwdWVzdGFzVUFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB3aGlsZSAoY2FudGlkYWRUb3RhbCA+IHJlc3B1ZXN0YXNVQS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNVQS5wdXNoKHt9IGFzIFJlc3B1ZXN0YXMpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5pbmNvbXBsZXRhc10gPSByZXNwdWVzdGFzVUEuZmlsdGVyKHAgPT4gZXhwcl9pbmNvbXBsZXRpdHVkX2Z1bihwKSkubGVuZ3RoO1xyXG4gICAgICAgICAgICB2YXIgdmFyJHAwID0gXCIkcDBcIiBhcyBJZFZhcmlhYmxlXHJcbiAgICAgICAgICAgIGlmIChyZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uZGlzcGFyYWRvcl0gPT0gMSAmJlxyXG4gICAgICAgICAgICAgICAgIXJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5yZXN1bHRhZG9dICYmXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uaW5jb21wbGV0YXNdID09IDBcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc29ydGVhciA9IHJlc3B1ZXN0YXNVQS5maWx0ZXIocCA9PiBmaWx0cm9fZnVuKHApKTtcclxuICAgICAgICAgICAgICAgIGlmIChzb3J0ZWFyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNVQS5mb3JFYWNoKChwZXIsIGkpID0+IHBlclt2YXIkcDBdID0gaSArIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWNpb25Tb3J0ZW8ub3JkZW4ucHVzaCh7IHZhcmlhYmxlOiB2YXIkcDAsIG9yZGVuOiAxIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHNvcnRlYXIuc29ydChjb21wYXJlRm9yT3JkZXIoY29uZmlndXJhY2lvblNvcnRlby5vcmRlbi5tYXAoZWxlbSA9PiAoeyBjb2x1bW46IGVsZW0udmFyaWFibGUsIG9yZGVyOiBlbGVtLm9yZGVuIH0pKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBwb3NpY2lvblNvcnRlYWRhID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlndXJhY2lvblNvcnRlby5tZXRvZG8gPT0gJ2hhc2gnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTk8gSU1QTEVNRU5UQURPJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qcG9zaWNpb25Tb3J0ZWFkYT0oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kby52YXJfY29lZi5yZWR1Y2UoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzdW0sIHBhaXIpPT5zdW0gKyBkYXRvc1ZpdmllbmRhLnRlbVtwYWlyLnZhcl0gKiBwYWlyLmNvZWYpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgJSBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kby5kaXZpc29yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJSBzb3J0ZWFyLmxlbmd0aCovXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxldHJhID0gJ0EnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YXJMZXRyYTogSWRWYXJpYWJsZSA9IGNvbmZpZ3VyYWNpb25Tb3J0ZW8ucGFyYW1fbWV0b2RvLnZhcl9sZXRyYTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcGVyc29uYSBvZiBzb3J0ZWFyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzVUEuZmluZCgoX3BlciwgaSkgPT4gaSA9PSBwZXJzb25hW3ZhciRwMF0gYXMgbnVtYmVyIC0gMSkhW3ZhckxldHJhXSA9IGxldHJhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc29uYVt2YXJMZXRyYV0gPSBsZXRyYTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldHJhID0gU3RyaW5nLmZyb21DaGFyQ29kZShsZXRyYS5jaGFyQ29kZUF0KDApICsgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxhQWxlYXRvcmlhTWllbWJyb3MgPSBjb25maWd1cmFjaW9uU29ydGVvLnBhcmFtX21ldG9kby50YWJsYS5tYXAoKGxpc3RhKSA9PiBsaXN0YS5zcGxpdCgnJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdG8gPSBpZEVuYyAlIDEwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uYVRhYmxhQWxlYXRvcmlhID0gcmVzdG8gPyByZXN0byAtIDEgOiA5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29ydGVhci5sZW5ndGggPiB0YWJsYUFsZWF0b3JpYU1pZW1icm9zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVhci5zcGxpY2UodGFibGFBbGVhdG9yaWFNaWVtYnJvcy5sZW5ndGgpIC8vZGVzY2FydG8gY2FuZGlkYXRvcyBzaSBzb24gbcOhcyBxdWUgbG8gcXVlIHBlcm1pdGUgbGEgdGFibGFcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsYVRhYmxhQWxlYXRvcmlhID0gc29ydGVhci5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGV0cmFTZWxlY2Npb25hZGEgPSB0YWJsYUFsZWF0b3JpYU1pZW1icm9zW2ZpbGFUYWJsYUFsZWF0b3JpYV1bY29sdW1uYVRhYmxhQWxlYXRvcmlhXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaWNpb25Tb3J0ZWFkYSA9IHJlc3B1ZXN0YXNVQS5maW5kSW5kZXgoKHA6IFJlc3B1ZXN0YXMpID0+IHBbdmFyTGV0cmFdID09IGxldHJhU2VsZWNjaW9uYWRhKSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5yZXN1bHRhZG9dID0gcG9zaWNpb25Tb3J0ZWFkYTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLmNhbnRpZGFkX3NvcnRlYWJsZXNdID0gc29ydGVhci5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWNpb25Tb3J0ZW8uc29ydGVhZG9fbW9zdHJhcj8uZm9yRWFjaCgobW9zdHJhcikgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNbbW9zdHJhci50YXJnZXRdID0gcmVzcHVlc3Rhc1VBW3Jlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5yZXN1bHRhZG9dIGFzIG51bWJlciAtIDFdW21vc3RyYXIuc291cmNlXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8uY2FudGlkYWRfc29ydGVhYmxlc10gPSAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNbY29uZmlndXJhY2lvblNvcnRlby5jYW50aWRhZF90b3RhbF0gPSByZXNwdWVzdGFzVUEubGVuZ3RoIHx8IG51bGw7IC8vbm8gcXVlcmVtb3MgZWwgdmFsb3IgMFxyXG4gICAgICAgICAgICByZXNwdWVzdGFzW2NvbmZpZ3VyYWNpb25Tb3J0ZW8udmFyaWFibGVCb3RvbkZvcm11bGFyaW9VQV0gPSAnb2snO1xyXG4gICAgICAgICAgICBpZiAoY29uZmlndXJhY2lvblNvcnRlby52YXJpYWJsZUJvdG9uRm9ybXVsYXJpb1VBSW5kaXZpZHVhbCkge1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1tjb25maWd1cmFjaW9uU29ydGVvLnZhcmlhYmxlQm90b25Gb3JtdWxhcmlvVUFJbmRpdmlkdWFsXSA9ICdvayc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJhcnJlclN1YkFyYm9sKHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpeiwgbm9kb0FjdHVhbDogUmVzcHVlc3RhcyB8IFJlc3B1ZXN0YXNbXSwgdW5pZGFkX2FuYWxpc2lzOiBJZFVuaWRhZEFuYWxpc2lzLCBmb3JQa0FjdW11bGFkbzogRm9yUGspIHtcclxuICAgIHZhciB1YURlZiA9IGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXNbdW5pZGFkX2FuYWxpc2lzXTtcclxuICAgIHZhciBlc0FycmF5ID0gbm9kb0FjdHVhbCBpbnN0YW5jZW9mIEFycmF5O1xyXG4gICAgdmFyIGNvbmp1bnRvOiBSZXNwdWVzdGFzW10gPSBlc0FycmF5ID8gbm9kb0FjdHVhbCBhcyBSZXNwdWVzdGFzW10gOiBbbm9kb0FjdHVhbCBhcyBSZXNwdWVzdGFzXTtcclxuICAgIFxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25qdW50by5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHZhciByZXNwID0gY29uanVudG9baV07XHJcbiAgICAgICAgaWYgKCFyZXNwKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgdmFyIG51bSA9IGVzQXJyYXkgPyBpICsgMSA6IChmb3JQa0FjdW11bGFkb1t1YURlZi5wa19hZ3JlZ2FkYV0gfHwgMSk7XHJcbiAgICAgICAgdmFyIGlkRm9ybXVsYXJpb3MgPSBPYmplY3Qua2V5cyhlc3RydWN0dXJhLmZvcm11bGFyaW9zKS5maWx0ZXIoa2V5ID0+IGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3Nba2V5IGFzIElkRm9ybXVsYXJpb10uY2FzaWxsZXJvcy51bmlkYWRfYW5hbGlzaXMgPT09IHVuaWRhZF9hbmFsaXNpcyk7XHJcbiAgICAgICAgZm9yIChjb25zdCBpZEZvcm11bGFyaW8gb2YgaWRGb3JtdWxhcmlvcykge1xyXG4gICAgICAgICAgICB2YXIgbWlGb3JQazogRm9yUGsgPSB7IC4uLmZvclBrQWN1bXVsYWRvLCBbdWFEZWYucGtfYWdyZWdhZGFdOiBudW0sIGZvcm11bGFyaW86IGlkRm9ybXVsYXJpbyBhcyBJZEZvcm11bGFyaW8gfHwgZm9yUGtBY3VtdWxhZG8uZm9ybXVsYXJpbyB9O1xyXG4gICAgICAgICAgICBpZiAoZXNwZWNpYWxlcy5jYWxjdWxhclZhcmlhYmxlcykge1xyXG4gICAgICAgICAgICAgICAgZXNwZWNpYWxlcy5jYWxjdWxhclZhcmlhYmxlcyhyZXNwdWVzdGFzUmFpeiwgbWlGb3JQayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGVzcGVjaWFsZXMuY2FsY3VsYXJWYXJpYWJsZXNFc3BlY2lmaWNhc09wZXJhdGl2bykge1xyXG4gICAgICAgICAgICAgICAgZXNwZWNpYWxlcy5jYWxjdWxhclZhcmlhYmxlc0VzcGVjaWZpY2FzT3BlcmF0aXZvKHJlc3B1ZXN0YXNSYWl6LCBtaUZvclBrKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIGhpamFzID0gbGlrZUFyKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbHRlcih1ID0+IHUucGFkcmUgPT09IHVuaWRhZF9hbmFsaXNpcykua2V5cygpO1xyXG4gICAgICAgICAgICBmb3IgKHZhciB1YUhpamEgb2YgaGlqYXMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBoaWphc1Jlc3AgPSByZXNwW3VhSGlqYSBhcyBJZFVuaWRhZEFuYWxpc2lzXTtcclxuICAgICAgICAgICAgICAgIGlmIChoaWphc1Jlc3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBiYXJyZXJTdWJBcmJvbChyZXNwdWVzdGFzUmFpeiwgaGlqYXNSZXNwIGFzIFJlc3B1ZXN0YXNbXSwgdWFIaWphIGFzIElkVW5pZGFkQW5hbGlzaXMsIG1pRm9yUGspO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVjYWxjdWxhclRvZG9FbEFyYm9sKHJlc3B1ZXN0YXNSYWl6OiBSZXNwdWVzdGFzUmFpeiwgZm9yUGtSYWl6OiBGb3JQaykge1xyXG4gICAgdmFyIHVhUHBhbCA9IE9iamVjdC5rZXlzKGVzdHJ1Y3R1cmEudW5pZGFkZXNfYW5hbGlzaXMpLmZpbmQoa2V5ID0+ICFlc3RydWN0dXJhLnVuaWRhZGVzX2FuYWxpc2lzW2tleSBhcyBJZFVuaWRhZEFuYWxpc2lzXS5wYWRyZSkgYXMgSWRVbmlkYWRBbmFsaXNpcztcclxuICAgIGJhcnJlclN1YkFyYm9sKHJlc3B1ZXN0YXNSYWl6LCByZXNwdWVzdGFzUmFpeiwgdWFQcGFsLCBmb3JQa1JhaXopO1xyXG4gICAgYmFycmVyU3ViQXJib2wocmVzcHVlc3Rhc1JhaXosIHJlc3B1ZXN0YXNSYWl6LCB1YVBwYWwsIGZvclBrUmFpeik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhckZlZWRiYWNrVW5pZGFkQW5hbGlzaXMoXHJcbiAgICBmZWVkYmFja1Jvd1ZhbGlkYXRvcjogeyBbZm9ybXVsYXJpbyBpbiBQbGFpbkZvclBrXTogRm9ybVN0cnVjdHVyZVN0YXRlPElkVmFyaWFibGUsIFZhbG9yLCBJZEZpbj4gfSxcclxuICAgIGZvcm11bGFyaW9zOiB7IFtub21icmVGb3JtdWxhcmlvIGluIElkRm9ybXVsYXJpb106IEluZm9Gb3JtdWxhcmlvIH0sXHJcbiAgICByZXNwdWVzdGFzOiBSZXNwdWVzdGFzLFxyXG4gICAgVUE6IElkVW5pZGFkQW5hbGlzaXMsXHJcbiAgICBmb3JQazogRm9yUGssXHJcbiAgICByZXNwdWVzdGFzQXVtZW50YWRhczogUmVzcHVlc3RhcywgLy8gaW5jbHV5ZW4gbGEgZGUgdG9kb3MgbG9zIHBhZHJlcyB5IGFuc2VzdHJvcyxcclxuICAgIHJlc3B1ZXN0YXNQYWRyZTogUmVzcHVlc3RhcyB8IG51bGwsXHJcbiAgICBvcHRzOiBPcGNpb25lc1Jvd1ZhbGlkYXRvcixcclxuKSB7XHJcbiAgICAvLyByZWNvcnJpZW5kIFVBIHBlcnNvbmFzIHkgbWFzY290YXNcclxuICAgIGZvciAodmFyIFVBaW5jbHVpZGEgb2YgZGVmT3BlcmF0aXZvLmRlZlVBW1VBXS5pbmNsdWlkYXMpIHtcclxuICAgICAgICB2YXIgcGtOdWV2YSA9IGRlZk9wZXJhdGl2by5kZWZVQVtVQWluY2x1aWRhXS5waztcclxuICAgICAgICB2YXIgY29uanVudG9SZXNwdWVzdGFzVUEgPSByZXNwdWVzdGFzW1VBaW5jbHVpZGFdO1xyXG4gICAgICAgIGxpa2VBcihjb25qdW50b1Jlc3B1ZXN0YXNVQSkuZm9yRWFjaCgocmVzcHVlc3Rhc0hpam8sIHZhbG9yUGtPUG9zaWNpb24pID0+IHtcclxuICAgICAgICAgICAgdmFyIHZhbG9yUGsgPSBudW1iZXJPclN0cmluZ0luY0lmQXJyYXkodmFsb3JQa09Qb3NpY2lvbiwgY29uanVudG9SZXNwdWVzdGFzVUEpO1xyXG4gICAgICAgICAgICBjYWxjdWxhckZlZWRiYWNrVW5pZGFkQW5hbGlzaXMoXHJcbiAgICAgICAgICAgICAgICBmZWVkYmFja1Jvd1ZhbGlkYXRvcixcclxuICAgICAgICAgICAgICAgIGZvcm11bGFyaW9zLFxyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc0hpam8sXHJcbiAgICAgICAgICAgICAgICBVQWluY2x1aWRhLFxyXG4gICAgICAgICAgICAgICAgeyAuLi5mb3JQaywgW3BrTnVldmFdOiB2YWxvclBrIH0sXHJcbiAgICAgICAgICAgICAgICB7IC4uLnJlc3B1ZXN0YXNBdW1lbnRhZGFzLCAuLi5yZXNwdWVzdGFzSGlqbywgW3BrTnVldmFdOiB2YWxvclBrIH0sXHJcbiAgICAgICAgICAgICAgICByZXNwdWVzdGFzLFxyXG4gICAgICAgICAgICAgICAgb3B0c1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICAvLyBTMSAsIEExXHJcbiAgICBmb3IgKHZhciBlc0hlcm1hbm8gb2YgW3RydWUsIGZhbHNlXSkge1xyXG4gICAgICAgIGZvciAodmFyIGZvcm11bGFyaW8gb2YgZGVmT3BlcmF0aXZvLmRlZlVBW1VBXS5pZHNGb3IpIGlmICghIWVzSGVybWFubyA9PSAhIWRlZk9wZXJhdGl2by5kZWZGb3JbZm9ybXVsYXJpb10uaGVybWFubykge1xyXG4gICAgICAgICAgICB2YXIgcGxhaW5Gb3JQazogUGxhaW5Gb3JQayA9IHRvUGxhaW5Gb3JQayh7IC4uLmZvclBrLCBmb3JtdWxhcmlvIH0pXHJcbiAgICAgICAgICAgIHZhciBtYXhQYXNvc0F1dG9pbmdyZXNhZGFzID0gMTA7XHJcbiAgICAgICAgICAgIHZhciB2YXJBdXRvSW5ncmVzYWRhcyA9IFtdO1xyXG4gICAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaHVib0F1dG9pbmdyZXNvcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZmVlZGJhY2tSb3dWYWxpZGF0b3JbcGxhaW5Gb3JQa10gPVxyXG4gICAgICAgICAgICAgICAgICAgIHJvd1ZhbGlkYXRvcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyBtYXJjYUZpbjogJ2ZpbicsIC4uLmZvcm11bGFyaW9zW2Zvcm11bGFyaW9dLmVzdHJ1Y3R1cmFSb3dWYWxpZGF0b3IgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc0F1bWVudGFkYXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHNcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB2YXIgeyByZXN1bWVuLCBhdXRvSW5ncmVzYWRhcyB9ID0gZmVlZGJhY2tSb3dWYWxpZGF0b3JbcGxhaW5Gb3JQa107XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFyTmFtZTogSWRWYXJpYWJsZTtcclxuICAgICAgICAgICAgICAgIGlmIChhdXRvSW5ncmVzYWRhcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXJOYW1lIGluIGF1dG9JbmdyZXNhZGFzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYW1iaW8gPSByZXNwdWVzdGFzW3Zhck5hbWVdICE9PSBhdXRvSW5ncmVzYWRhc1t2YXJOYW1lXSBhcyBWYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbWJpbykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1t2YXJOYW1lXSA9IGF1dG9JbmdyZXNhZGFzW3Zhck5hbWVdIGFzIFZhbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcHVlc3Rhc0F1bWVudGFkYXNbdmFyTmFtZV0gPSBhdXRvSW5ncmVzYWRhc1t2YXJOYW1lXSBhcyBWYWxvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhckF1dG9JbmdyZXNhZGFzLnB1c2godmFyTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWJvQXV0b2luZ3Jlc29zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSB3aGlsZSAoaHVib0F1dG9pbmdyZXNvcyAmJiBtYXhQYXNvc0F1dG9pbmdyZXNhZGFzLS0gPiAwKTtcclxuICAgICAgICAgICAgdmFyQXV0b0luZ3Jlc2FkYXMuZm9yRWFjaChfdmFybmFtZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBmZWVkYmFja1Jvd1ZhbGlkYXRvcltwbGFpbkZvclBrXS5lc3RhZG9zW192YXJuYW1lIGFzIElkVmFyaWFibGVdID0gJ2FjdHVhbCc7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHZhciBCRl92YXJuYW1lID0gJyRCLicgKyBmb3JtdWxhcmlvIGFzIElkVmFyaWFibGVcclxuICAgICAgICAgICAgdmFyIGZvcm1QcmluY2lwYWxGb3JWaXZpZW5kYSA9IGdldE1haW5Gb3JtRm9yVml2aWVuZGEoZm9yUGtbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSk7XHJcbiAgICAgICAgICAgIGlmIChlc3RydWN0dXJhLmNvbmZpZ1NvcnRlbyAmJiAhZXN0cnVjdHVyYS5jb25maWdTb3J0ZW9bZm9ybVByaW5jaXBhbEZvclZpdmllbmRhXSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBoYXkgY29uZmlndXJhY2lvbiBkZSBzb3J0ZW8gcGFyYSBlbCBmb3JtdWxhcmlvICR7Zm9ybVByaW5jaXBhbEZvclZpdmllbmRhfWApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8gPSBlc3RydWN0dXJhLmNvbmZpZ1NvcnRlbyAmJiBlc3RydWN0dXJhLmNvbmZpZ1NvcnRlb1tmb3JtUHJpbmNpcGFsRm9yVml2aWVuZGFdO1xyXG4gICAgICAgICAgICB2YXIgcmVzdW1lbk9yTnVsbCA9XHJcbiAgICAgICAgICAgICAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvICYmXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnU29ydGVvRm9ybXVsYXJpby52YXJpYWJsZUJvdG9uRm9ybXVsYXJpb1VBSW5kaXZpZHVhbCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8udmFyaWFibGVCb3RvbkZvcm11bGFyaW9VQUluZGl2aWR1YWwgPT0gQkZfdmFybmFtZSA/XHJcbiAgICAgICAgICAgICAgICAgICAgJ29rJ1xyXG4gICAgICAgICAgICAgICAgICAgIDogcmVzdW1lbiA9PSAndmFjaW8nID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJlc3VtZW5cclxuICAgICAgICAgICAgaWYgKGVzSGVybWFubykge1xyXG4gICAgICAgICAgICAgICAgcmVzcHVlc3Rhc1tCRl92YXJuYW1lXSA9IHJlc3VtZW5Pck51bGwgPT0gJ29rJyA/ICdvaycgOiBudWxsO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3B1ZXN0YXNQYWRyZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAvL3Jlc3B1ZXN0YXNQYWRyZVtCRl92YXJuYW1lXSA9IHJlc3VtZW5Pck51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB7IG51bWJlck9yU3RyaW5nSW5jSWZBcnJheSB9O1xyXG5cclxuZXhwb3J0IHZhciBnZXRNYWluRm9ybUZvclZpdmllbmRhID0gKHZhbHVlUGtSYWl6OiBWYWx1ZVBrUmFpeik6IElkRm9ybXVsYXJpbyA9PiB7XHJcbiAgICByZXR1cm4gZGF0b3NCeVBhc3MuaW5mb3JtYWNpb25IZHJbdmFsdWVQa1JhaXpdLnRhcmVhLm1haW5fZm9ybVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXJGZWVkYmFja0hvamFEZVJ1dGEoKSB7XHJcbiAgICBsaWtlQXIoZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpcykuZmlsdGVyKHVhRGVmID0+ICF1YURlZi5wYWRyZSkuZm9yRWFjaCh1YURlZiA9PiB7XHJcbiAgICAgICAgdmFyIGVzUHJpbmNpcGFsID0gKGY6IEZvcm11bGFyaW8sIGVuYzogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBmb3JtdWxhcmlvUHJpbmNpcGFsID0gZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYShlbmMpO1xyXG4gICAgICAgICAgICByZXR1cm4gZm9ybXVsYXJpb1ByaW5jaXBhbCA/IGZvcm11bGFyaW9QcmluY2lwYWwgPT0gZi5pZF9jYXNpbGxlcm8gOiBmLmZvcm11bGFyaW9fcHJpbmNpcGFsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2Fjw6EgaGF5IHF1ZSBzYW5pdGl6YXIgcG9ycXVlIGV2aWRlbnRlbWVudGUgcHVlZGUgdmVuaXIgY29uIGhhc2hzIGRlIGVuY3Vlc3RhcyBzaW4gaW5mbyBlbCBkYXRvc0J5UGFzcy5yZXNwdWVzdGFzXHJcbiAgICAgICAgdmFyIGNvbmp1bnRvUmVzcHVlc3Rhc1VBID0gZGF0b3NCeVBhc3MucmVzcHVlc3Rhc1t1YURlZi51bmlkYWRfYW5hbGlzaXNdXHJcbiAgICAgICAgYmVpbmdBcnJheShjb25qdW50b1Jlc3B1ZXN0YXNVQSkuZm9yRWFjaCgocmVzcHVlc3RhcywgdmFsb3JQa09Qb3NpY2lvbikgPT4ge1xyXG4gICAgICAgICAgICB2YXIgdmFsb3JQayA9IG51bWJlck9yU3RyaW5nSW5jSWZBcnJheSh2YWxvclBrT1Bvc2ljaW9uLCBjb25qdW50b1Jlc3B1ZXN0YXNVQSk7XHJcbiAgICAgICAgICAgIGxpa2VBcihlc3RydWN0dXJhLmZvcm11bGFyaW9zKS5maWx0ZXIoZiA9PiBmLmNhc2lsbGVyb3MudW5pZGFkX2FuYWxpc2lzID09IHVhRGVmLnVuaWRhZF9hbmFsaXNpcyAmJiBlc1ByaW5jaXBhbChmLmNhc2lsbGVyb3MsIHZhbG9yUGsgYXMgbnVtYmVyKSkuZm9yRWFjaCgoX2RlZkYsIGZvcm11bGFyaW8pID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBmb3JQa1JhaXogPSB7IGZvcm11bGFyaW8sIFt1YURlZi5wa19hZ3JlZ2FkYV06IHZhbG9yUGsgfSBhcyBGb3JQa1JhaXpcclxuICAgICAgICAgICAgICAgIGNhbGN1bGFyRmVlZGJhY2socmVzcHVlc3RhcywgZm9yUGtSYWl6LCB7fSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXJGZWVkYmFja0VuY3Vlc3RhKFxyXG4gICAgZmVlZGJhY2tSb3dWYWxpZGF0b3I6IHsgW2Zvcm11bGFyaW8gaW4gUGxhaW5Gb3JQa106IEZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+IH0sXHJcbiAgICBmb3JtdWxhcmlvczogeyBbbm9tYnJlRm9ybXVsYXJpbyBpbiBJZEZvcm11bGFyaW9dOiBJbmZvRm9ybXVsYXJpbyB9LFxyXG4gICAgZm9yUGtSYWl6OiBGb3JQa1JhaXosXHJcbiAgICByZXNwdWVzdGFzOiBSZXNwdWVzdGFzLFxyXG4gICAgb3B0czogT3BjaW9uZXNSb3dWYWxpZGF0b3JcclxuKSB7XHJcbiAgICB2YXIgZm9yUGs6IEZvclBrID0geyAuLi5mb3JQa1JhaXogfTtcclxuICAgIGNhbGN1bGFyRmVlZGJhY2tVbmlkYWRBbmFsaXNpcyhmZWVkYmFja1Jvd1ZhbGlkYXRvciwgZm9ybXVsYXJpb3MsIHJlc3B1ZXN0YXMsIGRlZk9wZXJhdGl2by5VQXByaW5jaXBhbCwgZm9yUGssIHJlc3B1ZXN0YXMsIG51bGwsIG9wdHMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjYWxjdWxhckZlZWRiYWNrKHJlc3B1ZXN0YXM6IFJlc3B1ZXN0YXMsIGZvclBrUmFpejogRm9yUGtSYWl6LCBvcHRzOiBPcGNpb25lc1Jvd1ZhbGlkYXRvcikge1xyXG4gICAgdmFyIHJlc3VtZW5Fc3RhZG86IFJlc3VtZW5Fc3RhZG87XHJcbiAgICAvLyBAdHMtaWdub3JlIFBhcnRpYWxcclxuICAgIHZhciBudWV2b3NSb3dzOiB7IFt4IGluIFBsYWluRm9yUGtdOiBGb3JtU3RydWN0dXJlU3RhdGU8SWRWYXJpYWJsZSwgSWRGaW4+IH0gPSB7fVxyXG4gICAgY2FsY3VsYXJGZWVkYmFja0VuY3Vlc3RhKG51ZXZvc1Jvd3MsIGVzdHJ1Y3R1cmEuZm9ybXVsYXJpb3MsIGZvclBrUmFpeiwgcmVzcHVlc3Rhcywgb3B0cyk7XHJcbiAgICBkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvciA9IGxpa2VBcihkYXRvc0J5UGFzcy5mZWVkYmFja1Jvd1ZhbGlkYXRvcikuZmlsdGVyKChfZmVlZGJhY2s6IGFueSwgcGxhaW5QazogUGxhaW5Gb3JQaykgPT4gSlNPTi5wYXJzZShwbGFpblBrKVtlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdICE9IGZvclBrUmFpeltlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdKS5wbGFpbigpO1xyXG4gICAgZGF0b3NCeVBhc3MuZmVlZGJhY2tSb3dWYWxpZGF0b3IgPSB7IC4uLmRhdG9zQnlQYXNzLmZlZWRiYWNrUm93VmFsaWRhdG9yLCAuLi5udWV2b3NSb3dzIH07XHJcbiAgICBkYXRvc0J5UGFzcy5yZXNwdWVzdGFzW2VzdHJ1Y3R1cmEudWFQcGFsXVtmb3JQa1JhaXpbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXV0gPSB7XHJcbiAgICAgICAgLi4uZGF0b3NCeVBhc3MucmVzcHVlc3Rhc1tlc3RydWN0dXJhLnVhUHBhbF1bZm9yUGtSYWl6W2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF1dLFxyXG4gICAgICAgIC4uLmNhbGN1bGFyUmVzdW1lblZpdmllbmRhKFxyXG4gICAgICAgICAgICBmb3JQa1JhaXosXHJcbiAgICAgICAgICAgIG51ZXZvc1Jvd3MsXHJcbiAgICAgICAgICAgIHJlc3B1ZXN0YXNcclxuICAgICAgICApXHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgdmFyIGJ1c2NhckZvcm11bGFyaW9zSGlqb3MgPSAoaWRGb3JtdWxhcmlvOiBJZEZvcm11bGFyaW8gfCB1bmRlZmluZWQsIGZvcm1zRmVlZGJhY2s6IElkRm9ybXVsYXJpb1tdID0gW10pID0+IHtcclxuICAgIGlmIChpZEZvcm11bGFyaW8pIHtcclxuICAgICAgICBmb3IgKGxldCBjYXNpbGxlcm8gb2YgZXN0cnVjdHVyYS5mb3JtdWxhcmlvc1tpZEZvcm11bGFyaW9dLmNhc2lsbGVyb3MuY2FzaWxsZXJvcykge1xyXG4gICAgICAgICAgICBpZiAoY2FzaWxsZXJvLnRpcG9jID09ICdCRicpIHtcclxuICAgICAgICAgICAgICAgIHZhciBmb3JtSGlqbyA9IChjYXNpbGxlcm8uc2FsdG8/LnN0YXJ0c1dpdGgoJ0Y6JykgPyBjYXNpbGxlcm8uc2FsdG8gOiAnRjonICsgY2FzaWxsZXJvLnNhbHRvKSBhcyBJZEZvcm11bGFyaW87XHJcbiAgICAgICAgICAgICAgICBpZiAoZm9ybUhpam8pIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3Jtc0ZlZWRiYWNrLnB1c2goZm9ybUhpam8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGJ1c2NhckZvcm11bGFyaW9zSGlqb3MoZm9ybUhpam8sIGZvcm1zRmVlZGJhY2spO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZvcm1zRmVlZGJhY2s7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgZ2V0Rm9ybXVsYXJpb3NGb3JWYWx1ZVBrUmFpeiA9ICh2YWx1ZVBrUmFpejogVmFsdWVQa1JhaXopID0+IHtcclxuICAgIHZhciBtYWluRm9ybUZvclZhbHVlUGtSYWl6ID0gZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYSh2YWx1ZVBrUmFpeik7XHJcbiAgICB2YXIgZm9ybXNGZWVkYmFjayA9IFttYWluRm9ybUZvclZhbHVlUGtSYWl6XTtcclxuICAgIGJ1c2NhckZvcm11bGFyaW9zSGlqb3MobWFpbkZvcm1Gb3JWYWx1ZVBrUmFpeiwgZm9ybXNGZWVkYmFjayk7XHJcbiAgICByZXR1cm4gZm9ybXNGZWVkYmFjaztcclxufVxyXG5cclxuZXhwb3J0IHZhciBjYWxjdWxhckFjdHVhbEJGID0gKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW86IENvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvIHwgbnVsbCwgbnVtRWxlbWVudG9VQTogbnVtYmVyLCBudW1BY3R1YWw6IG51bWJlciB8IG51bGwsIGZvcm11bGFyaW86IElkRm9ybXVsYXJpbywgcjogUmVzcHVlc3RhcykgPT5cclxuICAgICEhKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8gJiZcclxuICAgICAgICBjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmlkX2Zvcm11bGFyaW9faW5kaXZpZHVhbCAmJlxyXG4gICAgICAgIGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19pbmRpdmlkdWFsID09IGZvcm11bGFyaW9cclxuICAgICAgICA/XHJcbiAgICAgICAgbnVtRWxlbWVudG9VQSA9PSBjb2FsZXNjZShcclxuICAgICAgICAgICAgcltjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLnJlc3VsdGFkb19tYW51YWxdLFxyXG4gICAgICAgICAgICByW2NvbmZpZ1NvcnRlb0Zvcm11bGFyaW8ucmVzdWx0YWRvXVxyXG4gICAgICAgIClcclxuICAgICAgICA6XHJcbiAgICAgICAgbnVtQWN0dWFsID09IG51bUVsZW1lbnRvVUFcclxuICAgIClcclxuXHJcbmV4cG9ydCB2YXIgY2FsY3VsYXJEaXNhYmxlZEJGID0gKFxyXG4gICAgY29uZmlnU29ydGVvRm9ybXVsYXJpbzogQ29uZmlndXJhY2lvblNvcnRlb0Zvcm11bGFyaW8gfCBudWxsLFxyXG4gICAgaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvOiBDb25maWd1cmFjaW9uSGFiaWxpdGFyQm90b25Gb3JtdWxhcmlvIHwgbnVsbCxcclxuICAgIG51bUVsZW1lbnRvVUE6IG51bWJlcixcclxuICAgIGZvcm11bGFyaW86IElkRm9ybXVsYXJpbyxcclxuICAgIHI6IFJlc3B1ZXN0YXNcclxuKSA9PiB7XHJcbiAgICBpZiAoaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvICYmIGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpb1tmb3JtdWxhcmlvXSkge1xyXG4gICAgICAgIHZhciBleHByX2hhYmlsaXRhcl9mdW4gPSBnZXRGdW5jaW9uSGFiaWxpdGFyKGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpb1tmb3JtdWxhcmlvXS5leHByX2hhYmlsaXRhcl9ib3Rvbl9qcyk7XHJcbiAgICAgICAgcmV0dXJuICFleHByX2hhYmlsaXRhcl9mdW4ocltoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW9bZm9ybXVsYXJpb10udW5pZGFkX2FuYWxpc2lzXVtudW1FbGVtZW50b1VBIC0gMV0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAhIShjb25maWdTb3J0ZW9Gb3JtdWxhcmlvICYmXHJcbiAgICAgICAgICAgIChjb25maWdTb3J0ZW9Gb3JtdWxhcmlvLmlkX2Zvcm11bGFyaW9faW5kaXZpZHVhbCA9PSBmb3JtdWxhcmlvIHx8XHJcbiAgICAgICAgICAgICAgICBidXNjYXJGb3JtdWxhcmlvc0hpam9zKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW8uaWRfZm9ybXVsYXJpb19pbmRpdmlkdWFsKS5pbmNsdWRlcyhmb3JtdWxhcmlvKVxyXG4gICAgICAgICAgICApICYmXHJcbiAgICAgICAgICAgIG51bUVsZW1lbnRvVUEgIT0gY29hbGVzY2UoXHJcbiAgICAgICAgICAgICAgICByW2NvbmZpZ1NvcnRlb0Zvcm11bGFyaW8ucmVzdWx0YWRvX21hbnVhbF0sXHJcbiAgICAgICAgICAgICAgICByW2NvbmZpZ1NvcnRlb0Zvcm11bGFyaW8ucmVzdWx0YWRvXVxyXG4gICAgICAgICAgICApKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIGNhbGN1bGFyUGVybWl0ZUJvcnJhckJGID0gKGNvbmZpZ1NvcnRlb0Zvcm11bGFyaW86IENvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvIHwgbnVsbCwgZm9ybXVsYXJpbzogSWRGb3JtdWxhcmlvKSA9PlxyXG4gICAgIShjb25maWdTb3J0ZW9Gb3JtdWxhcmlvICYmXHJcbiAgICAgICAgY29uZmlnU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX2luZGl2aWR1YWwgPT0gZm9ybXVsYXJpbylcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhclJlc3VtZW5WaXZpZW5kYShcclxuICAgIGZvclBrUmFpejogRm9yUGtSYWl6LFxyXG4gICAgZmVlZGJhY2tSb3dWYWxpZGF0b3I6IHsgW2Zvcm11bGFyaW8gaW4gUGxhaW5Gb3JQa106IEZvcm1TdHJ1Y3R1cmVTdGF0ZTxJZFZhcmlhYmxlLCBWYWxvciwgSWRGaW4+IH0sXHJcbiAgICByZXNwdWVzdGFzOiBSZXNwdWVzdGFzXHJcbik6IFJlc3VsdGFkb1Jlc3VtZW4ge1xyXG4gICAgdmFyIHRhcmVhID0gZGF0b3NCeVBhc3MuaW5mb3JtYWNpb25IZHJbZm9yUGtSYWl6W2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF0gYXMgdW5rbm93biBhcyBJZEVuY10udGFyZWEudGFyZWE7XHJcbiAgICB2YXIgeyBjb2RSZWEsIGVzUmVhIH0gPSBkZWZPcGVyYXRpdm8uZXNSZWFsaXphZGEocmVzcHVlc3RhcywgdGFyZWEpXHJcbiAgICB2YXIgeyBjb2ROb1JlYSwgZXNOb1JlYSB9ID0gZGVmT3BlcmF0aXZvLmVzTm9SZWEocmVzcHVlc3RhcywgdGFyZWEpXHJcbiAgICB2YXIgeyBjb2RSZWFTdXAsIGVzUmVhU3VwIH0gPSBkZWZPcGVyYXRpdm8uZXNSZWFsaXphZGFTdXAocmVzcHVlc3RhcywgdGFyZWEpXHJcbiAgICB2YXIgeyBjb2ROb1JlYVN1cCwgZXNOb1JlYVN1cCB9ID0gZGVmT3BlcmF0aXZvLmVzTm9SZWFTdXAocmVzcHVlc3RhcywgdGFyZWEpXHJcbiAgICB2YXIgZm9ybXNGZWVkYmFjayA9IGdldEZvcm11bGFyaW9zRm9yVmFsdWVQa1JhaXooZm9yUGtSYWl6W2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF0pO1xyXG4gICAgdmFyIGNvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvID0gZXN0cnVjdHVyYS5jb25maWdTb3J0ZW8gJiYgZXN0cnVjdHVyYS5jb25maWdTb3J0ZW9bZ2V0TWFpbkZvcm1Gb3JWaXZpZW5kYShmb3JQa1JhaXpbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSldXHJcbiAgICB2YXIgaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvID0gZXN0cnVjdHVyYS5oYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW87XHJcbiAgICB2YXIgZmVlZEJhY2tWaXZpZW5kYSA9IGxpa2VBcihmZWVkYmFja1Jvd1ZhbGlkYXRvcikuZmlsdGVyKChfcm93LCBwbGFpblBrKSA9PiB7XHJcbiAgICAgICAgdmFyIHRpZW5lSW5kaXZpZHVhbCA9IGNvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvICYmICEhKGNvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvLmlkX2Zvcm11bGFyaW9faW5kaXZpZHVhbCAmJiBjb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX3BhZHJlKVxyXG4gICAgICAgIHZhciB0aWVuZUJvdG9uRGVzSGFiaWxpdGFibGUgPSBoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8gJiYgaGFiaWxpdGFjaW9uQm90b25Gb3JtdWxhcmlvW0pTT04ucGFyc2UocGxhaW5QaykuZm9ybXVsYXJpbyBhcyBJZEZvcm11bGFyaW9dO1xyXG4gICAgICAgIHZhciBwa0FncmVnYWRhID0gbnVsbDtcclxuICAgICAgICBpZiAodGllbmVCb3RvbkRlc0hhYmlsaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHBrQWdyZWdhZGEgPSBsaWtlQXIoZXN0cnVjdHVyYS51bmlkYWRlc19hbmFsaXNpcykuZmluZCgodWEsIF9pZFVBKSA9PlxyXG4gICAgICAgICAgICAgICAgdWEudW5pZGFkX2FuYWxpc2lzID09IGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpb1tKU09OLnBhcnNlKHBsYWluUGspLmZvcm11bGFyaW8gYXMgSWRGb3JtdWxhcmlvXS51bmlkYWRfYW5hbGlzaXMpPy5wa19hZ3JlZ2FkYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocGxhaW5QaylbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSA9PSBmb3JQa1JhaXpbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSAmJlxyXG4gICAgICAgICAgICBmb3Jtc0ZlZWRiYWNrLmluY2x1ZGVzKEpTT04ucGFyc2UocGxhaW5QaykuZm9ybXVsYXJpbykgJiZcclxuICAgICAgICAgICAgKHRpZW5lQm90b25EZXNIYWJpbGl0YWJsZSA/XHJcbiAgICAgICAgICAgICAgICAhY2FsY3VsYXJEaXNhYmxlZEJGKFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhYmlsaXRhY2lvbkJvdG9uRm9ybXVsYXJpbyxcclxuICAgICAgICAgICAgICAgICAgICBKU09OLnBhcnNlKHBsYWluUGspW3BrQWdyZWdhZGEgYXMgQ2FtcG9Qa10sXHJcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5wYXJzZShwbGFpblBrKS5mb3JtdWxhcmlvLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNGb3JQayhKU09OLnBhcnNlKHBsYWluUGspLCB0cnVlKS5yZXNwdWVzdGFzQXVtZW50YWRhc1xyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgOiB0aWVuZUluZGl2aWR1YWwgP1xyXG4gICAgICAgICAgICAgICAgICAgICFjYWxjdWxhckRpc2FibGVkQkYoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoYWJpbGl0YWNpb25Cb3RvbkZvcm11bGFyaW8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2UocGxhaW5QaykucGVyc29uYSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5wYXJzZShwbGFpblBrKS5mb3JtdWxhcmlvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlc3RydWN0dXJhLmNvblJlYUhvZ2FyID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2UocGxhaW5QaykuaG9nYXIgPyByZXNwdWVzdGFzRm9yUGsoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdOiBmb3JQa1JhaXpbZXN0cnVjdHVyYS5wa0FncmVnYWRhVWFQcGFsXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtdWxhcmlvOiBjb25maWd1cmFjaW9uU29ydGVvRm9ybXVsYXJpby5pZF9mb3JtdWxhcmlvX3BhZHJlISxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2dhcjogSlNPTi5wYXJzZShwbGFpblBrKS5ob2dhclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBGb3JQaykucmVzcHVlc3RhcyA6IHt9IGFzIFJlc3B1ZXN0YXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3B1ZXN0YXNGb3JQayh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF06IGZvclBrUmFpeltlc3RydWN0dXJhLnBrQWdyZWdhZGFVYVBwYWxdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm11bGFyaW86IGNvbmZpZ3VyYWNpb25Tb3J0ZW9Gb3JtdWxhcmlvLmlkX2Zvcm11bGFyaW9fcGFkcmUhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBGb3JQaykucmVzcHVlc3Rhc1xyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICA6IHRydWUpXHJcbiAgICB9KS5hcnJheSgpO1xyXG4gICAgdmFyIHByaW9yaWRhZGVzOiB7IFtrZXkgaW4gUmVzdW1lbkVzdGFkb106IHsgcHJpb3JpZGFkOiBudW1iZXIsIGNhbnRpZGFkOiBudW1iZXIgfSB9ID0ge1xyXG4gICAgICAgICdubyByZWEnOiB7IHByaW9yaWRhZDogMSwgY2FudGlkYWQ6IDAgfSxcclxuICAgICAgICAnY29uIHByb2JsZW1hcyc6IHsgcHJpb3JpZGFkOiAyLCBjYW50aWRhZDogMCB9LFxyXG4gICAgICAgICdpbmNvbXBsZXRvJzogeyBwcmlvcmlkYWQ6IDMsIGNhbnRpZGFkOiAwIH0sXHJcbiAgICAgICAgJ3ZhY2lvJzogeyBwcmlvcmlkYWQ6IDQsIGNhbnRpZGFkOiAwIH0sXHJcbiAgICAgICAgJ2NpdGEgcGFjdGFkYSc6IHsgcHJpb3JpZGFkOiA1LCBjYW50aWRhZDogMCB9LFxyXG4gICAgICAgICdvayc6IHsgcHJpb3JpZGFkOiA2LCBjYW50aWRhZDogMCB9XHJcbiAgICB9XHJcbiAgICB2YXIgbWluID0gNjtcclxuICAgIHZhciBtaW5SZXN1bWVuOiBSZXN1bWVuRXN0YWRvID0gJ29rJztcclxuICAgIGZvciAodmFyIGZlZWRiYWNrIG9mIGZlZWRCYWNrVml2aWVuZGEpIHtcclxuICAgICAgICB2YXIgcmVzdW1lbiA9IGZlZWRiYWNrLnJlc3VtZW47XHJcbiAgICAgICAgcHJpb3JpZGFkZXNbcmVzdW1lbl0uY2FudGlkYWQrKztcclxuICAgICAgICBpZiAocHJpb3JpZGFkZXNbcmVzdW1lbl0ucHJpb3JpZGFkIDwgbWluKSB7XHJcbiAgICAgICAgICAgIG1pbiA9IHByaW9yaWRhZGVzW3Jlc3VtZW5dLnByaW9yaWRhZDtcclxuICAgICAgICAgICAgbWluUmVzdW1lbiA9IHJlc3VtZW47XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKG1pblJlc3VtZW4gPT0gJ3ZhY2lvJyAmJiBwcmlvcmlkYWRlc1snb2snXS5jYW50aWRhZCB8fCBtaW5SZXN1bWVuID09ICdpbmNvbXBsZXRvJykge1xyXG4gICAgICAgIGlmIChmYWxzZSAvKnJlc3B1ZXN0YXNbc3AxXT09MiAmJiByZXNwdWVzdGFzW3NwNl09PW51bGwqLykge1xyXG4gICAgICAgICAgICBtaW5SZXN1bWVuID0gJ2NpdGEgcGFjdGFkYSc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWluUmVzdW1lbiA9ICdpbmNvbXBsZXRvJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHRhcmVhID0gZGF0b3NCeVBhc3MuaW5mb3JtYWNpb25IZHJbZm9yUGtSYWl6W2VzdHJ1Y3R1cmEucGtBZ3JlZ2FkYVVhUHBhbF0gYXMgdW5rbm93biBhcyBJZEVuY10udGFyZWEudGFyZWE7XHJcbiAgICB2YXIgcmVzdW1lbkVzdGFkbzogUmVzdW1lbkVzdGFkbztcclxuICAgIHZhciByZXN1bWVuRXN0YWRvU3VwOiBSZXN1bWVuRXN0YWRvO1xyXG4gICAgLy9zZXRlbyBjYWxjdWxvIG8gZGVqbyBsbyBxdWUgZXN0YWJhIGVuIHJlc3B1ZXN0YXMgcGFyYSBlbCBvdHJvIGNhc29cclxuICAgIGlmICh0YXJlYSA9PSAnc3VwZScpIHtcclxuICAgICAgICByZXN1bWVuRXN0YWRvU3VwID0gZXNOb1JlYVN1cCA/ICdubyByZWEnIDogbWluUmVzdW1lblxyXG4gICAgICAgIHJlc3VtZW5Fc3RhZG8gPSByZXNwdWVzdGFzWydyZXN1bWVuRXN0YWRvJyBhcyBJZFZhcmlhYmxlXSBhcyBSZXN1bWVuRXN0YWRvXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VtZW5Fc3RhZG8gPSBlc05vUmVhID8gJ25vIHJlYScgOiBtaW5SZXN1bWVuXHJcbiAgICAgICAgcmVzdW1lbkVzdGFkb1N1cCA9IHJlc3B1ZXN0YXNbJ3Jlc3VtZW5Fc3RhZG9TdXAnIGFzIElkVmFyaWFibGVdIGFzIFJlc3VtZW5Fc3RhZG9cclxuICAgIH1cclxuICAgIHZhciByZXN1bHRhZG86IFJlc3VsdGFkb1Jlc3VtZW4gPSB7XHJcbiAgICAgICAgcmVzdW1lbkVzdGFkbyxcclxuICAgICAgICByZXN1bWVuRXN0YWRvU3VwLFxyXG4gICAgICAgIGNvZFJlYSxcclxuICAgICAgICBjb2ROb1JlYSxcclxuICAgICAgICBjb2RSZWFTdXAsXHJcbiAgICAgICAgY29kTm9SZWFTdXBcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHRhZG9cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldFJlc3VtZW5Fc3RhZG9Gb3JUYXJlYSA9IChyZXNwdWVzdGFzUmFpejogUmVzcHVlc3Rhc1JhaXosIHRhcmVhOiBJZFRhcmVhKSA9PiB0YXJlYSA9PSAnc3VwZScgPyByZXNwdWVzdGFzUmFpei5yZXN1bWVuRXN0YWRvU3VwIDogcmVzcHVlc3Rhc1JhaXoucmVzdW1lbkVzdGFkbzsiXX0=