0.1 Integrantes:

Maribel Barría
Ennis Delgado
Linda Yángüez

1 Introducción

Este documento presenta los cinco procedimientos estadísticos asignados al Grupo 3 en una base de datos toxinológica simulada. El objetivo es mostrar, de forma breve y reproducible, la pregunta de investigación, las variables, las hipótesis, la selección de la prueba, los supuestos, los resultados principales, la interpretación estadística, la interpretación toxinológica y la conclusión de cada análisis.

Importante: la base de datos es simulada. Por lo tanto, todas las interpretaciones se presentan únicamente con fines académicos y no deben considerarse evidencia clínica o epidemiológica real.

1.1 Análisis incluidos

  1. Mann–Whitney–Wilcoxon
  2. Kruskal–Wallis
  3. Kaplan–Meier
  4. Log-Rank
  5. Modelo de riesgos proporcionales de Cox

2 1. Mann–Whitney–Wilcoxon

video 1 https://youtu.be/Sbs79_mnXPM

2.1 Pregunta de investigación

¿Los días de hospitalización difieren entre pacientes que presentaron eventos adversos y quienes no los presentaron?

2.2 Variables

  • Respuesta: Hospitalizacion_dias — cuantitativa discreta, escala de razón.
  • Explicativa: Evento_Adverso — cualitativa nominal binaria.

2.3 Hipótesis

H₀: las distribuciones de los días de hospitalización son iguales entre ambos grupos.
H₁: las distribuciones de los días de hospitalización difieren entre ambos grupos.

2.4 ¿Por qué se eligió esta prueba?

Se utilizó Mann–Whitney–Wilcoxon porque se comparan dos grupos independientes y la variable de hospitalización presenta asimetría y valores extremos. Al ser una prueba no paramétrica, no requiere asumir normalidad.

2.5 Supuestos principales

  • Observaciones independientes.
  • Variable respuesta al menos ordinal/cuantitativa.
  • Dos grupos independientes.
  • No se requiere normalidad ni homogeneidad de varianzas.

2.6 Estadística descriptiva

tabla_mw <- Toxinologia_Panama %>%
  group_by(Evento_Adverso) %>%
  summarise(
    n = n(),
    Mediana = median(Hospitalizacion_dias, na.rm = TRUE),
    Q1 = quantile(Hospitalizacion_dias, 0.25, na.rm = TRUE),
    Q3 = quantile(Hospitalizacion_dias, 0.75, na.rm = TRUE),
    RIQ = IQR(Hospitalizacion_dias, na.rm = TRUE),
    .groups = "drop"
  )

knitr::kable(tabla_mw, digits = 2,
             caption = "Días de hospitalización según evento adverso")
Días de hospitalización según evento adverso
Evento_Adverso n Mediana Q1 Q3 RIQ
No 405861 2 1 4 3
94139 4 2 7 5

2.7 Gráfico

ggplot(
  Toxinologia_Panama,
  aes(x = Evento_Adverso, y = Hospitalizacion_dias, fill = Evento_Adverso)
) +
  geom_boxplot(alpha = 0.75, outlier.alpha = 0.25) +
  labs(
    title = "Días de hospitalización según evento adverso",
    x = "Evento adverso",
    y = "Hospitalización (días)"
  ) +
  theme_minimal(base_size = 13) +
  theme(legend.position = "none")

2.8 Ejecución en R y resultado

prueba_mw <- wilcox.test(
  Hospitalizacion_dias ~ Evento_Adverso,
  data = Toxinologia_Panama,
  exact = FALSE
)

data.frame(
  Estadistico_W = unname(prueba_mw$statistic),
  p_valor = prueba_mw$p.value
) |>
  knitr::kable(digits = 4, caption = "Resultado de Mann–Whitney–Wilcoxon")
Resultado de Mann–Whitney–Wilcoxon
Estadistico_W p_valor
11674537918 0

Interpretación estadística. El valor p obtenido es < 2.2e-16.
Se rechaza H₀: existe evidencia estadísticamente significativa de diferencias entre los grupos.

2.9 Interpretación toxinológica

Descriptivamente, los pacientes con evento adverso presentan una estancia hospitalaria mayor que quienes no presentan el evento. En el escenario simulado, esto sugiere una asociación entre la presencia de eventos adversos y una evolución clínica que requiere más tiempo de hospitalización.

2.10 Conclusión

Los días de hospitalización sí difieren entre los grupos cuando la prueba resulta significativa. La comparación debe interpretarse como una asociación, no como demostración de causalidad.


3 2. Kruskal–Wallis

video 2 https://youtu.be/Mu9DuoVwYDY?si=6tLeX9pc3kri77-A

3.1 Pregunta de investigación

¿Existen diferencias en los niveles del biomarcador toxinológico según el agente toxinológico involucrado?

3.2 Variables

  • Respuesta: Biomarcador_UL — cuantitativa continua.
  • Explicativa: Agente — cualitativa nominal con seis grupos.

3.3 Hipótesis

H₀: la distribución del biomarcador es igual entre todos los agentes.
H₁: al menos uno de los agentes presenta una distribución diferente.

3.4 ¿Por qué se eligió esta prueba?

Kruskal–Wallis permite comparar una variable cuantitativa entre más de dos grupos independientes sin exigir normalidad.

3.5 Supuestos principales

  • Observaciones independientes.
  • Variable respuesta al menos ordinal.
  • Grupos mutuamente independientes.
  • La interpretación como comparación de localización es más directa cuando las distribuciones presentan formas semejantes.

3.6 Estadística descriptiva

estadisticas_agente <- Toxinologia_Panama %>%
  group_by(Agente) %>%
  summarise(
    n = n(),
    Mediana = median(Biomarcador_UL, na.rm = TRUE),
    Q1 = quantile(Biomarcador_UL, 0.25, na.rm = TRUE),
    Q3 = quantile(Biomarcador_UL, 0.75, na.rm = TRUE),
    RIQ = IQR(Biomarcador_UL, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  arrange(desc(Mediana))

knitr::kable(
  estadisticas_agente,
  digits = 2,
  caption = "Biomarcador según agente toxinológico"
)
Biomarcador según agente toxinológico
Agente n Mediana Q1 Q3 RIQ
Bothrops asper 169809 78.96 64.37 94.82 30.45
Crotalus simus 34947 77.11 62.55 92.85 30.30
Micrurus spp. 39780 72.98 58.51 88.78 30.27
Escorpión 100172 71.06 56.46 86.97 30.51
Animal marino 55254 69.02 54.36 85.11 30.75
Hymenoptera 100038 66.90 52.43 82.79 30.36

3.7 Gráfico

ggplot(Toxinologia_Panama, aes(x = Agente, y = Biomarcador_UL)) +
  geom_boxplot() +
  labs(
    title = "Niveles del biomarcador según agente toxinológico",
    x = "Agente toxinológico",
    y = "Biomarcador (UL)"
  ) +
  theme_minimal(base_size = 13) +
  theme(axis.text.x = element_text(angle = 35, hjust = 1))

3.8 Prueba global

prueba_kw <- kruskal.test(
  Biomarcador_UL ~ Agente,
  data = Toxinologia_Panama
)

data.frame(
  H = unname(prueba_kw$statistic),
  gl = unname(prueba_kw$parameter),
  p_valor = prueba_kw$p.value
) |>
  knitr::kable(digits = 4, caption = "Resultado de Kruskal–Wallis")
Resultado de Kruskal–Wallis
H gl p_valor
20612.6 5 0

3.9 Comparaciones post hoc

if (!requireNamespace("FSA", quietly = TRUE)) {
  stop("Instala el paquete FSA con install.packages('FSA') antes de tejer el documento.")
}

posthoc_dunn <- FSA::dunnTest(
  Biomarcador_UL ~ Agente,
  data = Toxinologia_Panama,
  method = "holm"
)

posthoc_dunn$res |>
  knitr::kable(
    digits = 4,
    caption = "Comparaciones post hoc de Dunn con ajuste de Holm"
  )
Comparaciones post hoc de Dunn con ajuste de Holm
Comparison Z P.unadj P.adj
Animal marino - Bothrops asper -85.4369 0 0
Animal marino - Crotalus simus -49.6226 0 0
Bothrops asper - Crotalus simus 13.4980 0 0
Animal marino - Escorpión -15.4558 0 0
Bothrops asper - Escorpión 84.4739 0 0
Crotalus simus - Escorpión 41.4075 0 0
Animal marino - Hymenoptera 17.0495 0 0
Bothrops asper - Hymenoptera 127.6618 0 0
Crotalus simus - Hymenoptera 69.1246 0 0
Escorpión - Hymenoptera 38.5415 0 0
Animal marino - Micrurus spp. -24.9726 0 0
Bothrops asper - Micrurus spp. 45.6422 0 0
Crotalus simus - Micrurus spp. 23.8622 0 0
Escorpión - Micrurus spp. -13.8877 0 0
Hymenoptera - Micrurus spp. -42.9486 0 0

Interpretación estadística. Kruskal–Wallis produjo H = 2.0612601^{4}, gl = 5 y p = < 2.2e-16.
Se rechaza H₀: existen diferencias estadísticamente significativas entre los agentes. Las comparaciones de Dunn permiten identificar entre qué pares se encuentran esas diferencias.

3.10 Interpretación toxinológica

En la base simulada, el comportamiento del biomarcador varía según el agente toxinológico. Las medianas y las comparaciones post hoc permiten describir qué agentes presentan niveles relativamente mayores o menores, sin atribuir causalidad.

3.11 Conclusión

La prueba global determina si existen diferencias entre agentes y, cuando es significativa, el post hoc de Dunn con ajuste de Holm identifica los pares que difieren.


4 3. Kaplan–Meier

video 3 https://youtu.be/q6o_cmBQ8Jo

4.1 Pregunta de investigación

¿Cómo cambia la probabilidad de permanecer sin presentar el evento durante el seguimiento según la severidad clínica del caso toxinológico?

4.2 Variables

  • Tiempo: Tiempo_Supervivencia_dias — cuantitativa, escala de razón.
  • Estado: Estado_Evento — binaria; 0 = censura y 1 = evento.
  • Agrupación: Severidad — cualitativa ordinal.

4.3 Propósito del análisis

Kaplan–Meier es principalmente descriptivo: estima la función de supervivencia a lo largo del tiempo considerando la censura. La comparación formal entre curvas se realiza posteriormente con Log-Rank.

4.4 Conceptos que deben explicarse

  • Tiempo al evento: período observado hasta el evento o la censura.
  • Censura: el evento no se observó durante el período de seguimiento disponible.
  • Individuos en riesgo: pacientes que continúan en seguimiento y aún pueden presentar el evento.
  • Función de supervivencia S(t): probabilidad estimada de permanecer sin el evento más allá del tiempo \(t\).

4.5 Estadística descriptiva

tabla_km <- Toxinologia_Panama %>%
  group_by(Severidad) %>%
  summarise(
    n = n(),
    Eventos = sum(Estado_Evento == 1, na.rm = TRUE),
    Censurados = sum(Estado_Evento == 0, na.rm = TRUE),
    Porcentaje_eventos = round(100 * Eventos / n, 2),
    .groups = "drop"
  )

knitr::kable(
  tabla_km,
  caption = "Eventos y censuras según severidad"
)
Eventos y censuras según severidad
Severidad n Eventos Censurados Porcentaje_eventos
Leve 164378 3964 160414 2.41
Moderada 184473 7147 177326 3.87
Severa 106469 7072 99397 6.64
Crítica 44680 6953 37727 15.56

4.6 Supuestos principales

  • Tiempo de seguimiento correctamente definido.
  • Evento correctamente identificado.
  • Observaciones independientes.
  • Censura no informativa.

4.7 Estimación Kaplan–Meier

modelo_km <- survfit(
  Surv(Tiempo_Supervivencia_dias, Estado_Evento) ~ Severidad,
  data = Toxinologia_Panama
)

modelo_km
## Call: survfit(formula = Surv(Tiempo_Supervivencia_dias, Estado_Evento) ~ 
##     Severidad, data = Toxinologia_Panama)
## 
##                         n events median 0.95LCL 0.95UCL
## Severidad=Leve     164378   3964     NA      NA      NA
## Severidad=Moderada 184473   7147     NA      NA      NA
## Severidad=Severa   106469   7072     NA      NA      NA
## Severidad=Crítica   44680   6953     NA      NA      NA

4.8 Curvas de supervivencia y pacientes en riesgo

ggsurvplot(
  modelo_km,
  data = Toxinologia_Panama,
  censor = TRUE,
  conf.int = FALSE,
  risk.table = TRUE,
  risk.table.height = 0.30,
  risk.table.title = "Pacientes en riesgo",
  title = "Curvas de Kaplan–Meier según severidad",
  xlab = "Tiempo de seguimiento (días)",
  ylab = "Probabilidad de permanecer sin el evento",
  legend.title = "Severidad",
  ggtheme = theme_minimal(base_size = 12)
)

Cómo leer la gráfica: una curva más alta representa una mayor probabilidad estimada de permanecer sin el evento. Cada descenso refleja la ocurrencia de eventos y las marcas de censura representan pacientes cuyo evento no fue observado durante el seguimiento.

4.9 Interpretación estadística

Las curvas permiten comparar visualmente el patrón de supervivencia entre niveles de severidad. La mediana de supervivencia solo puede reportarse si alguna curva alcanza una probabilidad de 0.50 durante el seguimiento.

4.10 Interpretación toxinológica

En el escenario simulado, una curva más baja indica un patrón menos favorable de permanencia sin evento. La lectura debe centrarse en la separación y el descenso de las curvas, sin inferir todavía significancia estadística entre ellas.

4.11 Conclusión

Kaplan–Meier describe cómo cambia la probabilidad de permanecer sin el evento a lo largo del tiempo y permite visualizar el efecto de la censura y el número de pacientes en riesgo.


5 4. Log-Rank

video 4 https://www.youtube.com/watch?v=i2cypwpmJew

5.1 Pregunta de investigación

¿Existen diferencias entre las curvas de supervivencia de los pacientes que reciben diferentes tratamientos?

5.2 Variables

  • Tiempo: Tiempo_Supervivencia_dias.
  • Evento: Estado_Evento.
  • Grupo: Tratamiento.

5.3 Hipótesis

H₀: las funciones de supervivencia son iguales entre todos los tratamientos.
H₁: al menos una función de supervivencia difiere de las demás.

5.4 ¿Por qué se eligió esta prueba?

Log-Rank compara formalmente curvas de supervivencia de grupos independientes y utiliza adecuadamente la información de observaciones censuradas.

5.5 Supuestos principales

  • Observaciones independientes.
  • Tiempo y evento bien definidos.
  • Censura no informativa.
  • Grupos independientes.
  • La prueba es especialmente interpretable cuando las diferencias entre curvas son relativamente consistentes durante el seguimiento.

5.6 Estadística descriptiva

tabla_logrank <- Toxinologia_Panama %>%
  group_by(Tratamiento) %>%
  summarise(
    n = n(),
    Eventos = sum(Estado_Evento == 1, na.rm = TRUE),
    Censurados = sum(Estado_Evento == 0, na.rm = TRUE),
    Porcentaje_eventos = round(100 * Eventos / n, 2),
    .groups = "drop"
  )

knitr::kable(
  tabla_logrank,
  caption = "Eventos y censuras según tratamiento"
)
Eventos y censuras según tratamiento
Tratamiento n Eventos Censurados Porcentaje_eventos
Antiveneno tardío 124823 7457 117366 5.97
Antiveneno temprano 225579 8641 216938 3.83
Soporte 149598 9038 140560 6.04

5.7 Kaplan–Meier por tratamiento y prueba Log-Rank

supervivencia_logrank <- Surv(
  Toxinologia_Panama$Tiempo_Supervivencia_dias,
  Toxinologia_Panama$Estado_Evento
)

km_tratamiento <- survfit(
  supervivencia_logrank ~ Tratamiento,
  data = Toxinologia_Panama
)

logrank <- survdiff(
  supervivencia_logrank ~ Tratamiento,
  data = Toxinologia_Panama
)

gl_logrank <- length(logrank$n) - 1
p_logrank <- pchisq(
  logrank$chisq,
  df = gl_logrank,
  lower.tail = FALSE
)

data.frame(
  Chi_cuadrado = logrank$chisq,
  gl = gl_logrank,
  p_valor = p_logrank
) |>
  knitr::kable(digits = 4, caption = "Resultado de la prueba Log-Rank")
Resultado de la prueba Log-Rank
Chi_cuadrado gl p_valor
1247.261 2 0

5.8 Gráfico

ggsurvplot(
  km_tratamiento,
  data = Toxinologia_Panama,
  conf.int = TRUE,
  censor = TRUE,
  risk.table = TRUE,
  risk.table.height = 0.28,
  risk.table.title = "Número de pacientes en riesgo",
  pval = TRUE,
  pval.method = TRUE,
  title = "Curvas de supervivencia según tratamiento",
  xlab = "Tiempo de seguimiento (días)",
  ylab = "Probabilidad de permanecer sin el evento",
  legend.title = "Tratamiento",
  legend = "top",
  ggtheme = theme_classic()
)

Interpretación estadística. La prueba Log-Rank produjo χ² = 1247.261, gl = 2 y p = < 2.2e-16.
Se rechaza H₀: existen diferencias globales estadísticamente significativas entre las curvas de supervivencia de los tratamientos.

5.9 Interpretación toxinológica

Las curvas permiten observar cuál tratamiento mantiene una mayor o menor probabilidad estimada de permanecer sin el evento. La prueba Log-Rank indica si la diferencia global entre curvas es estadísticamente significativa, pero no identifica por sí sola qué pares de tratamientos difieren.

5.10 Conclusión

Log-Rank responde directamente si las curvas de supervivencia de los tratamientos son iguales o diferentes durante el seguimiento.


6 5. Modelo de riesgos proporcionales de Cox

video 5 https://youtu.be/_sOtLTSDMF4?si=GcwhYYVoOAwjQqMz

6.1 Pregunta de investigación

¿Existe una asociación entre el tratamiento administrado y el riesgo instantáneo de presentar el evento durante el seguimiento, después de ajustar por edad, sexo, agente toxinológico, dosis, severidad y biomarcador?

6.2 Variables

  • Tiempo: Tiempo_Supervivencia_dias.
  • Evento: Estado_Evento.
  • Predictor principal: Tratamiento.
  • Covariables: Edad, Sexo, Agente, Dosis_mgkg, Severidad, Biomarcador_UL.

6.3 Hipótesis

H₀: el tratamiento no se asocia con el hazard del evento después del ajuste por las covariables.
H₁: el tratamiento se asocia con el hazard del evento después del ajuste.

6.4 ¿Por qué se eligió este modelo?

El modelo de Cox permite estudiar simultáneamente el tiempo hasta el evento, la censura y múltiples variables explicativas. Su medida principal es el Hazard Ratio (HR).

Cómo interpretar un HR: HR = 1 indica ausencia de diferencia en el hazard respecto a la categoría de referencia; HR > 1 indica mayor hazard; HR < 1 indica menor hazard, manteniendo constantes las demás variables del modelo.

6.5 Supuestos principales

  • Tiempo y evento correctamente definidos.
  • Observaciones independientes.
  • Censura no informativa.
  • Riesgos proporcionales.
  • Relación adecuada entre covariables continuas y el log-hazard.
  • Ausencia de multicolinealidad importante.

6.6 Preparación del modelo

# Se deja Severidad como factor no ordenado para obtener HR
# de categorías frente a una referencia clara.
Toxinologia_Panama$Severidad <- factor(
  Toxinologia_Panama$Severidad,
  levels = c("Leve", "Moderada", "Severa", "Crítica"),
  ordered = FALSE
)

Toxinologia_Panama$Severidad <- relevel(
  Toxinologia_Panama$Severidad,
  ref = "Leve"
)

6.7 Modelo ajustado

modelo_cox_ajustado <- coxph(
  Surv(Tiempo_Supervivencia_dias, Estado_Evento) ~
    Tratamiento +
    Edad +
    Sexo +
    Agente +
    Dosis_mgkg +
    Severidad +
    Biomarcador_UL,
  data = Toxinologia_Panama
)

summary(modelo_cox_ajustado)
## Call:
## coxph(formula = Surv(Tiempo_Supervivencia_dias, Estado_Evento) ~ 
##     Tratamiento + Edad + Sexo + Agente + Dosis_mgkg + Severidad + 
##         Biomarcador_UL, data = Toxinologia_Panama)
## 
##   n= 500000, number of events= 25136 
## 
##                                      coef  exp(coef)   se(coef)       z
## TratamientoAntiveneno temprano -0.4675243  0.6265515  0.0162550 -28.762
## TratamientoSoporte              0.0194581  1.0196487  0.0158517   1.228
## Edad                            0.0077568  1.0077870  0.0003610  21.485
## SexoMasculino                  -0.0067848  0.9932381  0.0126779  -0.535
## AgenteBothrops asper           -0.0011165  0.9988841  0.0222177  -0.050
## AgenteCrotalus simus            0.0029874  1.0029918  0.0307480   0.097
## AgenteEscorpión                 0.0088366  1.0088758  0.0235900   0.375
## AgenteHymenoptera              -0.0098862  0.9901625  0.0236821  -0.417
## AgenteMicrurus spp.             0.0091619  1.0092040  0.0292362   0.313
## Dosis_mgkg                      0.1792348  1.1963016  0.0040977  43.740
## SeveridadModerada               0.2404427  1.2718121  0.0202068  11.899
## SeveridadSevera                 0.4859017  1.6256403  0.0218858  22.202
## SeveridadCrítica                0.8454649  2.3290604  0.0276724  30.553
## Biomarcador_UL                  0.0001738  1.0001738  0.0004203   0.413
##                                Pr(>|z|)    
## TratamientoAntiveneno temprano   <2e-16 ***
## TratamientoSoporte                0.220    
## Edad                             <2e-16 ***
## SexoMasculino                     0.593    
## AgenteBothrops asper              0.960    
## AgenteCrotalus simus              0.923    
## AgenteEscorpión                   0.708    
## AgenteHymenoptera                 0.676    
## AgenteMicrurus spp.               0.754    
## Dosis_mgkg                       <2e-16 ***
## SeveridadModerada                <2e-16 ***
## SeveridadSevera                  <2e-16 ***
## SeveridadCrítica                 <2e-16 ***
## Biomarcador_UL                    0.679    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##                                exp(coef) exp(-coef) lower .95 upper .95
## TratamientoAntiveneno temprano    0.6266     1.5960    0.6069    0.6468
## TratamientoSoporte                1.0196     0.9807    0.9885    1.0518
## Edad                              1.0078     0.9923    1.0071    1.0085
## SexoMasculino                     0.9932     1.0068    0.9689    1.0182
## AgenteBothrops asper              0.9989     1.0011    0.9563    1.0433
## AgenteCrotalus simus              1.0030     0.9970    0.9443    1.0653
## AgenteEscorpión                   1.0089     0.9912    0.9633    1.0566
## AgenteHymenoptera                 0.9902     1.0099    0.9453    1.0372
## AgenteMicrurus spp.               1.0092     0.9909    0.9530    1.0687
## Dosis_mgkg                        1.1963     0.8359    1.1867    1.2059
## SeveridadModerada                 1.2718     0.7863    1.2224    1.3232
## SeveridadSevera                   1.6256     0.6151    1.5574    1.6969
## SeveridadCrítica                  2.3291     0.4294    2.2061    2.4589
## Biomarcador_UL                    1.0002     0.9998    0.9994    1.0010
## 
## Concordance= 0.705  (se = 0.002 )
## Likelihood ratio test= 16327  on 14 df,   p=<2e-16
## Wald test            = 19027  on 14 df,   p=<2e-16
## Score (logrank) test = 21798  on 14 df,   p=<2e-16

6.8 Hazard Ratios e intervalos de confianza

s_cox <- summary(modelo_cox_ajustado)

tabla_hr <- data.frame(
  Variable = rownames(s_cox$coefficients),
  HR = s_cox$coefficients[, "exp(coef)"],
  IC95_inf = s_cox$conf.int[, "lower .95"],
  IC95_sup = s_cox$conf.int[, "upper .95"],
  p_valor = s_cox$coefficients[, "Pr(>|z|)"],
  row.names = NULL
)

knitr::kable(
  tabla_hr,
  digits = 4,
  caption = "Hazard Ratios ajustados del modelo de Cox"
)
Hazard Ratios ajustados del modelo de Cox
Variable HR IC95_inf IC95_sup p_valor
TratamientoAntiveneno temprano 0.6266 0.6069 0.6468 0.0000
TratamientoSoporte 1.0196 0.9885 1.0518 0.2196
Edad 1.0078 1.0071 1.0085 0.0000
SexoMasculino 0.9932 0.9689 1.0182 0.5925
AgenteBothrops asper 0.9989 0.9563 1.0433 0.9599
AgenteCrotalus simus 1.0030 0.9443 1.0653 0.9226
AgenteEscorpión 1.0089 0.9633 1.0566 0.7080
AgenteHymenoptera 0.9902 0.9453 1.0372 0.6763
AgenteMicrurus spp. 1.0092 0.9530 1.0687 0.7540
Dosis_mgkg 1.1963 1.1867 1.2059 0.0000
SeveridadModerada 1.2718 1.2224 1.3232 0.0000
SeveridadSevera 1.6256 1.5574 1.6969 0.0000
SeveridadCrítica 2.3291 2.2061 2.4589 0.0000
Biomarcador_UL 1.0002 0.9994 1.0010 0.6793

6.9 Efecto global del tratamiento

modelo_sin_trat <- update(
  modelo_cox_ajustado,
  . ~ . - Tratamiento
)

comparacion_trat <- anova(
  modelo_sin_trat,
  modelo_cox_ajustado,
  test = "LRT"
)

comparacion_trat
## Analysis of Deviance Table
##  Cox model: response is  Surv(Tiempo_Supervivencia_dias, Estado_Evento)
##  Model 1: ~ Edad + Sexo + Agente + Dosis_mgkg + Severidad + Biomarcador_UL
##  Model 2: ~ Tratamiento + Edad + Sexo + Agente + Dosis_mgkg + Severidad + Biomarcador_UL
##    loglik  Chisq Df Pr(>|Chi|)    
## 1 -310548                         
## 2 -309967 1161.7  2  < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

El p-valor global del modelo no debe confundirse con el efecto específico del tratamiento. Para evaluar el tratamiento como conjunto se compara el modelo completo con otro modelo idéntico pero sin Tratamiento.

6.10 Supuesto de riesgos proporcionales

supuesto_PH <- cox.zph(modelo_cox_ajustado)

supuesto_PH
##                 chisq df       p
## Tratamiento     1.139  2    0.57
## Edad            0.926  1    0.34
## Sexo            0.269  1    0.60
## Agente          2.860  5    0.72
## Dosis_mgkg     45.989  1 1.2e-11
## Severidad      21.628  3 7.8e-05
## Biomarcador_UL 37.490  1 9.2e-10
## GLOBAL         56.250 14 5.3e-07

Interpretación del supuesto: en cox.zph, H₀ establece que el supuesto de riesgos proporcionales se cumple. Un p > 0.05 indica que no hay evidencia estadística de violación; un p < 0.05 indica evidencia de posible incumplimiento. Debe revisarse tanto cada covariable como la fila GLOBAL.

6.11 Gráfico de Hazard Ratios

ggforest(
  modelo_cox_ajustado,
  data = Toxinologia_Panama,
  main = "Hazard Ratios ajustados",
  cpositions = c(0.02, 0.22, 0.40),
  fontsize = 0.8
)

6.12 Interpretación estadística

El modelo de Cox estima el cambio relativo en el hazard instantáneo asociado con cada predictor, manteniendo constantes las demás variables. Los HR deben interpretarse siempre respecto a su categoría de referencia y junto con su intervalo de confianza del 95 % y su valor p.

Cuando un intervalo de confianza del 95 % para un HR no incluye 1, existe evidencia de asociación estadísticamente significativa para ese contraste, siempre que los supuestos del modelo sean razonables.

6.13 Interpretación toxinológica

Dentro del escenario simulado, el modelo permite identificar qué características se asocian con un mayor o menor hazard de presentar el evento durante el seguimiento, después de considerar simultáneamente las demás covariables.

Debe utilizarse lenguaje de asociación y no de causalidad: por ejemplo, “se asocia con un menor hazard” en lugar de “protege” o “evita” el evento.

6.14 Conclusión

El modelo de Cox complementa a Kaplan–Meier y Log-Rank porque no solo compara grupos, sino que permite cuantificar asociaciones ajustadas mediante Hazard Ratios y evaluar múltiples covariables al mismo tiempo. La conclusión final debe considerar tanto los HR e intervalos de confianza como la verificación del supuesto de riesgos proporcionales.


7 Conclusión general

Las cinco pruebas responden a preguntas diferentes y complementarias:

  • Mann–Whitney–Wilcoxon compara dos grupos independientes.
  • Kruskal–Wallis compara más de dos grupos independientes y puede complementarse con Dunn.
  • Kaplan–Meier describe la probabilidad de permanecer sin el evento a lo largo del tiempo.
  • Log-Rank contrasta formalmente si varias curvas de supervivencia difieren.
  • Cox cuantifica la asociación entre predictores y el hazard del evento mediante Hazard Ratios ajustados.

En conjunto, el documento muestra el flujo completo solicitado: planteamiento de la pregunta, identificación de variables, hipótesis, selección de la prueba, supuestos, ejecución en R, visualización, interpretación estadística, interpretación toxinológica y conclusión.

Para la exposición: no es necesario explicar el código línea por línea. Utiliza el HTML como guía visual y céntrate en la pregunta, por qué escogiste la prueba, qué muestra la gráfica, cuál fue el resultado principal y qué significa dentro del escenario toxinológico simulado.

LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBCaW9lc3RhZMOtc3RpY28gQXBsaWNhZG8gYSBsYSBUb3hpbm9sb2fDrWEiDQphdXRob3I6ICJHcnVwbyAzIg0KZGF0ZTogIjIwMjYtMDgtMzEiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0aGVtZTogZmxhdGx5DQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KLS0tDQojIyBJbnRlZ3JhbnRlczoNCg0KTWFyaWJlbCBCYXJyw61hICANCkVubmlzIERlbGdhZG8gIA0KTGluZGEgWcOhbmfDvGV6DQoNCjxzdHlsZT4NCmJvZHkgew0KICBmb250LXNpemU6IDE2cHg7DQogIGxpbmUtaGVpZ2h0OiAxLjY1Ow0KfQ0KaDEsIGgyLCBoMyB7DQogIGZvbnQtd2VpZ2h0OiA3MDA7DQp9DQpoMSB7DQogIGJvcmRlci1ib3R0b206IDNweCBzb2xpZCAjMmMzZTUwOw0KICBwYWRkaW5nLWJvdHRvbTogOHB4Ow0KICBtYXJnaW4tdG9wOiA0MnB4Ow0KfQ0KaDIgew0KICBtYXJnaW4tdG9wOiAzMHB4Ow0KfQ0KYmxvY2txdW90ZSB7DQogIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzJjM2U1MDsNCiAgYmFja2dyb3VuZDogI2Y3ZjlmYjsNCiAgcGFkZGluZzogMTJweCAxOHB4Ow0KICBib3JkZXItcmFkaXVzOiA2cHg7DQp9DQoubm90ZSB7DQogIGJhY2tncm91bmQ6ICNlZWY2ZmY7DQogIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzNiODJmNjsNCiAgcGFkZGluZzogMTRweCAxOHB4Ow0KICBib3JkZXItcmFkaXVzOiA4cHg7DQogIG1hcmdpbjogMThweCAwOw0KfQ0KLnJlc3VsdCB7DQogIGJhY2tncm91bmQ6ICNmMmZiZjU7DQogIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzJlOGI1NzsNCiAgcGFkZGluZzogMTRweCAxOHB4Ow0KICBib3JkZXItcmFkaXVzOiA4cHg7DQogIG1hcmdpbjogMThweCAwOw0KfQ0KLndhcm5pbmcgew0KICBiYWNrZ3JvdW5kOiAjZmZmOGU4Ow0KICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNlNmE3MDA7DQogIHBhZGRpbmc6IDE0cHggMThweDsNCiAgYm9yZGVyLXJhZGl1czogOHB4Ow0KICBtYXJnaW46IDE4cHggMDsNCn0NCnRhYmxlIHsNCiAgd2lkdGg6IDEwMCU7DQp9DQo8L3N0eWxlPg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgZWNobyA9IFRSVUUsDQogIG1lc3NhZ2UgPSBGQUxTRSwNCiAgd2FybmluZyA9IEZBTFNFLA0KICBmaWcuYWxpZ24gPSAiY2VudGVyIiwNCiAgb3V0LndpZHRoID0gIjkyJSINCikNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc3Vydml2YWwpDQpsaWJyYXJ5KHN1cnZtaW5lcikNCg0KIyBMYSBiYXNlIHNlIGdlbmVyYS9jYXJnYSBkZXNkZSBlbCBzY3JpcHQgb3JpZ2luYWwgZGUgbGEgYXNpZ25hY2nDs24uDQpzb3VyY2UoIkJBU0UgKDIpLlIiKQ0KYGBgDQoNCiMgSW50cm9kdWNjacOzbg0KDQpFc3RlIGRvY3VtZW50byBwcmVzZW50YSBsb3MgKipjaW5jbyBwcm9jZWRpbWllbnRvcyBlc3RhZMOtc3RpY29zIGFzaWduYWRvcyBhbCBHcnVwbyAzKiogZW4gdW5hIGJhc2UgZGUgZGF0b3MgdG94aW5vbMOzZ2ljYSBzaW11bGFkYS4gRWwgb2JqZXRpdm8gZXMgbW9zdHJhciwgZGUgZm9ybWEgYnJldmUgeSByZXByb2R1Y2libGUsIGxhIHByZWd1bnRhIGRlIGludmVzdGlnYWNpw7NuLCBsYXMgdmFyaWFibGVzLCBsYXMgaGlww7N0ZXNpcywgbGEgc2VsZWNjacOzbiBkZSBsYSBwcnVlYmEsIGxvcyBzdXB1ZXN0b3MsIGxvcyByZXN1bHRhZG9zIHByaW5jaXBhbGVzLCBsYSBpbnRlcnByZXRhY2nDs24gZXN0YWTDrXN0aWNhLCBsYSBpbnRlcnByZXRhY2nDs24gdG94aW5vbMOzZ2ljYSB5IGxhIGNvbmNsdXNpw7NuIGRlIGNhZGEgYW7DoWxpc2lzLg0KDQo8ZGl2IGNsYXNzPSJ3YXJuaW5nIj4NCioqSW1wb3J0YW50ZToqKiBsYSBiYXNlIGRlIGRhdG9zIGVzIHNpbXVsYWRhLiBQb3IgbG8gdGFudG8sIHRvZGFzIGxhcyBpbnRlcnByZXRhY2lvbmVzIHNlIHByZXNlbnRhbiDDum5pY2FtZW50ZSBjb24gZmluZXMgYWNhZMOpbWljb3MgeSBubyBkZWJlbiBjb25zaWRlcmFyc2UgZXZpZGVuY2lhIGNsw61uaWNhIG8gZXBpZGVtaW9sw7NnaWNhIHJlYWwuDQo8L2Rpdj4NCg0KIyMgQW7DoWxpc2lzIGluY2x1aWRvcw0KDQoxLiBNYW5u4oCTV2hpdG5leeKAk1dpbGNveG9uICANCjIuIEtydXNrYWzigJNXYWxsaXMgIA0KMy4gS2FwbGFu4oCTTWVpZXIgIA0KNC4gTG9nLVJhbmsgIA0KNS4gTW9kZWxvIGRlIHJpZXNnb3MgcHJvcG9yY2lvbmFsZXMgZGUgQ294ICANCg0KLS0tDQoNCiMgMS4gTWFubuKAk1doaXRuZXnigJNXaWxjb3hvbg0KDQp2aWRlbyAxIGh0dHBzOi8veW91dHUuYmUvU2JzNzlfbW5YUE0NCg0KIyMgUHJlZ3VudGEgZGUgaW52ZXN0aWdhY2nDs24NCg0KKirCv0xvcyBkw61hcyBkZSBob3NwaXRhbGl6YWNpw7NuIGRpZmllcmVuIGVudHJlIHBhY2llbnRlcyBxdWUgcHJlc2VudGFyb24gZXZlbnRvcyBhZHZlcnNvcyB5IHF1aWVuZXMgbm8gbG9zIHByZXNlbnRhcm9uPyoqDQoNCiMjIFZhcmlhYmxlcw0KDQotICoqUmVzcHVlc3RhOioqIGBIb3NwaXRhbGl6YWNpb25fZGlhc2Ag4oCUIGN1YW50aXRhdGl2YSBkaXNjcmV0YSwgZXNjYWxhIGRlIHJhesOzbi4NCi0gKipFeHBsaWNhdGl2YToqKiBgRXZlbnRvX0FkdmVyc29gIOKAlCBjdWFsaXRhdGl2YSBub21pbmFsIGJpbmFyaWEuDQoNCiMjIEhpcMOzdGVzaXMNCg0KKipI4oKAOioqIGxhcyBkaXN0cmlidWNpb25lcyBkZSBsb3MgZMOtYXMgZGUgaG9zcGl0YWxpemFjacOzbiBzb24gaWd1YWxlcyBlbnRyZSBhbWJvcyBncnVwb3MuICANCioqSOKCgToqKiBsYXMgZGlzdHJpYnVjaW9uZXMgZGUgbG9zIGTDrWFzIGRlIGhvc3BpdGFsaXphY2nDs24gZGlmaWVyZW4gZW50cmUgYW1ib3MgZ3J1cG9zLg0KDQojIyDCv1BvciBxdcOpIHNlIGVsaWdpw7MgZXN0YSBwcnVlYmE/DQoNClNlIHV0aWxpesOzIE1hbm7igJNXaGl0bmV54oCTV2lsY294b24gcG9ycXVlIHNlIGNvbXBhcmFuICoqZG9zIGdydXBvcyBpbmRlcGVuZGllbnRlcyoqIHkgbGEgdmFyaWFibGUgZGUgaG9zcGl0YWxpemFjacOzbiBwcmVzZW50YSBhc2ltZXRyw61hIHkgdmFsb3JlcyBleHRyZW1vcy4gQWwgc2VyIHVuYSBwcnVlYmEgbm8gcGFyYW3DqXRyaWNhLCBubyByZXF1aWVyZSBhc3VtaXIgbm9ybWFsaWRhZC4NCg0KIyMgU3VwdWVzdG9zIHByaW5jaXBhbGVzDQoNCi0gT2JzZXJ2YWNpb25lcyBpbmRlcGVuZGllbnRlcy4NCi0gVmFyaWFibGUgcmVzcHVlc3RhIGFsIG1lbm9zIG9yZGluYWwvY3VhbnRpdGF0aXZhLg0KLSBEb3MgZ3J1cG9zIGluZGVwZW5kaWVudGVzLg0KLSBObyBzZSByZXF1aWVyZSBub3JtYWxpZGFkIG5pIGhvbW9nZW5laWRhZCBkZSB2YXJpYW56YXMuDQoNCiMjIEVzdGFkw61zdGljYSBkZXNjcmlwdGl2YQ0KDQpgYGB7ciBtdy1kZXNjcmlwdGl2b3N9DQp0YWJsYV9tdyA8LSBUb3hpbm9sb2dpYV9QYW5hbWEgJT4lDQogIGdyb3VwX2J5KEV2ZW50b19BZHZlcnNvKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgTWVkaWFuYSA9IG1lZGlhbihIb3NwaXRhbGl6YWNpb25fZGlhcywgbmEucm0gPSBUUlVFKSwNCiAgICBRMSA9IHF1YW50aWxlKEhvc3BpdGFsaXphY2lvbl9kaWFzLCAwLjI1LCBuYS5ybSA9IFRSVUUpLA0KICAgIFEzID0gcXVhbnRpbGUoSG9zcGl0YWxpemFjaW9uX2RpYXMsIDAuNzUsIG5hLnJtID0gVFJVRSksDQogICAgUklRID0gSVFSKEhvc3BpdGFsaXphY2lvbl9kaWFzLCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KDQprbml0cjo6a2FibGUodGFibGFfbXcsIGRpZ2l0cyA9IDIsDQogICAgICAgICAgICAgY2FwdGlvbiA9ICJEw61hcyBkZSBob3NwaXRhbGl6YWNpw7NuIHNlZ8O6biBldmVudG8gYWR2ZXJzbyIpDQpgYGANCg0KIyMgR3LDoWZpY28NCg0KYGBge3IgbXctZ3JhZmljb30NCmdncGxvdCgNCiAgVG94aW5vbG9naWFfUGFuYW1hLA0KICBhZXMoeCA9IEV2ZW50b19BZHZlcnNvLCB5ID0gSG9zcGl0YWxpemFjaW9uX2RpYXMsIGZpbGwgPSBFdmVudG9fQWR2ZXJzbykNCikgKw0KICBnZW9tX2JveHBsb3QoYWxwaGEgPSAwLjc1LCBvdXRsaWVyLmFscGhhID0gMC4yNSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkTDrWFzIGRlIGhvc3BpdGFsaXphY2nDs24gc2Vnw7puIGV2ZW50byBhZHZlcnNvIiwNCiAgICB4ID0gIkV2ZW50byBhZHZlcnNvIiwNCiAgICB5ID0gIkhvc3BpdGFsaXphY2nDs24gKGTDrWFzKSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KYGBgDQoNCiMjIEVqZWN1Y2nDs24gZW4gUiB5IHJlc3VsdGFkbw0KDQpgYGB7ciBtdy1wcnVlYmF9DQpwcnVlYmFfbXcgPC0gd2lsY294LnRlc3QoDQogIEhvc3BpdGFsaXphY2lvbl9kaWFzIH4gRXZlbnRvX0FkdmVyc28sDQogIGRhdGEgPSBUb3hpbm9sb2dpYV9QYW5hbWEsDQogIGV4YWN0ID0gRkFMU0UNCikNCg0KZGF0YS5mcmFtZSgNCiAgRXN0YWRpc3RpY29fVyA9IHVubmFtZShwcnVlYmFfbXckc3RhdGlzdGljKSwNCiAgcF92YWxvciA9IHBydWViYV9tdyRwLnZhbHVlDQopIHw+DQogIGtuaXRyOjprYWJsZShkaWdpdHMgPSA0LCBjYXB0aW9uID0gIlJlc3VsdGFkbyBkZSBNYW5u4oCTV2hpdG5leeKAk1dpbGNveG9uIikNCmBgYA0KDQo8ZGl2IGNsYXNzPSJyZXN1bHQiPg0KKipJbnRlcnByZXRhY2nDs24gZXN0YWTDrXN0aWNhLioqIEVsIHZhbG9yIHAgb2J0ZW5pZG8gZXMgYHIgZm9ybWF0LnB2YWwocHJ1ZWJhX213JHAudmFsdWUsIGRpZ2l0cyA9IDQpYC4gIA0KYHIgaWYgKHBydWViYV9tdyRwLnZhbHVlIDwgMC4wNSkgIlNlIHJlY2hhemEgSOKCgDogZXhpc3RlIGV2aWRlbmNpYSBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIGRlIGRpZmVyZW5jaWFzIGVudHJlIGxvcyBncnVwb3MuIiBlbHNlICJObyBzZSByZWNoYXphIEjigoA6IG5vIGV4aXN0ZSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YSBkZSBkaWZlcmVuY2lhcyBlbnRyZSBsb3MgZ3J1cG9zLiJgDQo8L2Rpdj4NCg0KIyMgSW50ZXJwcmV0YWNpw7NuIHRveGlub2zDs2dpY2ENCg0KRGVzY3JpcHRpdmFtZW50ZSwgbG9zIHBhY2llbnRlcyBjb24gZXZlbnRvIGFkdmVyc28gcHJlc2VudGFuIHVuYSBlc3RhbmNpYSBob3NwaXRhbGFyaWEgbWF5b3IgcXVlIHF1aWVuZXMgbm8gcHJlc2VudGFuIGVsIGV2ZW50by4gRW4gZWwgZXNjZW5hcmlvIHNpbXVsYWRvLCBlc3RvIHN1Z2llcmUgdW5hIGFzb2NpYWNpw7NuIGVudHJlIGxhIHByZXNlbmNpYSBkZSBldmVudG9zIGFkdmVyc29zIHkgdW5hIGV2b2x1Y2nDs24gY2zDrW5pY2EgcXVlIHJlcXVpZXJlIG3DoXMgdGllbXBvIGRlIGhvc3BpdGFsaXphY2nDs24uDQoNCiMjIENvbmNsdXNpw7NuDQoNCkxvcyBkw61hcyBkZSBob3NwaXRhbGl6YWNpw7NuICoqc8OtIGRpZmllcmVuIGVudHJlIGxvcyBncnVwb3MqKiBjdWFuZG8gbGEgcHJ1ZWJhIHJlc3VsdGEgc2lnbmlmaWNhdGl2YS4gTGEgY29tcGFyYWNpw7NuIGRlYmUgaW50ZXJwcmV0YXJzZSBjb21vIHVuYSAqKmFzb2NpYWNpw7NuKiosIG5vIGNvbW8gZGVtb3N0cmFjacOzbiBkZSBjYXVzYWxpZGFkLg0KDQotLS0NCg0KIyAyLiBLcnVza2Fs4oCTV2FsbGlzDQoNCnZpZGVvIDIgaHR0cHM6Ly95b3V0dS5iZS9NdTlEdW9Wd1lEWT9zaT02dExlWDlwYzNrcmk3Ny1BDQoNCiMjIFByZWd1bnRhIGRlIGludmVzdGlnYWNpw7NuDQoNCioqwr9FeGlzdGVuIGRpZmVyZW5jaWFzIGVuIGxvcyBuaXZlbGVzIGRlbCBiaW9tYXJjYWRvciB0b3hpbm9sw7NnaWNvIHNlZ8O6biBlbCBhZ2VudGUgdG94aW5vbMOzZ2ljbyBpbnZvbHVjcmFkbz8qKg0KDQojIyBWYXJpYWJsZXMNCg0KLSAqKlJlc3B1ZXN0YToqKiBgQmlvbWFyY2Fkb3JfVUxgIOKAlCBjdWFudGl0YXRpdmEgY29udGludWEuDQotICoqRXhwbGljYXRpdmE6KiogYEFnZW50ZWAg4oCUIGN1YWxpdGF0aXZhIG5vbWluYWwgY29uIHNlaXMgZ3J1cG9zLg0KDQojIyBIaXDDs3Rlc2lzDQoNCioqSOKCgDoqKiBsYSBkaXN0cmlidWNpw7NuIGRlbCBiaW9tYXJjYWRvciBlcyBpZ3VhbCBlbnRyZSB0b2RvcyBsb3MgYWdlbnRlcy4gIA0KKipI4oKBOioqIGFsIG1lbm9zIHVubyBkZSBsb3MgYWdlbnRlcyBwcmVzZW50YSB1bmEgZGlzdHJpYnVjacOzbiBkaWZlcmVudGUuDQoNCiMjIMK/UG9yIHF1w6kgc2UgZWxpZ2nDsyBlc3RhIHBydWViYT8NCg0KS3J1c2thbOKAk1dhbGxpcyBwZXJtaXRlIGNvbXBhcmFyIHVuYSB2YXJpYWJsZSBjdWFudGl0YXRpdmEgZW50cmUgKiptw6FzIGRlIGRvcyBncnVwb3MgaW5kZXBlbmRpZW50ZXMqKiBzaW4gZXhpZ2lyIG5vcm1hbGlkYWQuDQoNCiMjIFN1cHVlc3RvcyBwcmluY2lwYWxlcw0KDQotIE9ic2VydmFjaW9uZXMgaW5kZXBlbmRpZW50ZXMuDQotIFZhcmlhYmxlIHJlc3B1ZXN0YSBhbCBtZW5vcyBvcmRpbmFsLg0KLSBHcnVwb3MgbXV0dWFtZW50ZSBpbmRlcGVuZGllbnRlcy4NCi0gTGEgaW50ZXJwcmV0YWNpw7NuIGNvbW8gY29tcGFyYWNpw7NuIGRlIGxvY2FsaXphY2nDs24gZXMgbcOhcyBkaXJlY3RhIGN1YW5kbyBsYXMgZGlzdHJpYnVjaW9uZXMgcHJlc2VudGFuIGZvcm1hcyBzZW1lamFudGVzLg0KDQojIyBFc3RhZMOtc3RpY2EgZGVzY3JpcHRpdmENCg0KYGBge3Iga3ctZGVzY3JpcHRpdm9zfQ0KZXN0YWRpc3RpY2FzX2FnZW50ZSA8LSBUb3hpbm9sb2dpYV9QYW5hbWEgJT4lDQogIGdyb3VwX2J5KEFnZW50ZSkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBuID0gbigpLA0KICAgIE1lZGlhbmEgPSBtZWRpYW4oQmlvbWFyY2Fkb3JfVUwsIG5hLnJtID0gVFJVRSksDQogICAgUTEgPSBxdWFudGlsZShCaW9tYXJjYWRvcl9VTCwgMC4yNSwgbmEucm0gPSBUUlVFKSwNCiAgICBRMyA9IHF1YW50aWxlKEJpb21hcmNhZG9yX1VMLCAwLjc1LCBuYS5ybSA9IFRSVUUpLA0KICAgIFJJUSA9IElRUihCaW9tYXJjYWRvcl9VTCwgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkgJT4lDQogIGFycmFuZ2UoZGVzYyhNZWRpYW5hKSkNCg0Ka25pdHI6OmthYmxlKA0KICBlc3RhZGlzdGljYXNfYWdlbnRlLA0KICBkaWdpdHMgPSAyLA0KICBjYXB0aW9uID0gIkJpb21hcmNhZG9yIHNlZ8O6biBhZ2VudGUgdG94aW5vbMOzZ2ljbyINCikNCmBgYA0KDQojIyBHcsOhZmljbw0KDQpgYGB7ciBrdy1ncmFmaWNvfQ0KZ2dwbG90KFRveGlub2xvZ2lhX1BhbmFtYSwgYWVzKHggPSBBZ2VudGUsIHkgPSBCaW9tYXJjYWRvcl9VTCkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIk5pdmVsZXMgZGVsIGJpb21hcmNhZG9yIHNlZ8O6biBhZ2VudGUgdG94aW5vbMOzZ2ljbyIsDQogICAgeCA9ICJBZ2VudGUgdG94aW5vbMOzZ2ljbyIsDQogICAgeSA9ICJCaW9tYXJjYWRvciAoVUwpIg0KICApICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDM1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCiMjIFBydWViYSBnbG9iYWwNCg0KYGBge3Iga3ctcHJ1ZWJhfQ0KcHJ1ZWJhX2t3IDwtIGtydXNrYWwudGVzdCgNCiAgQmlvbWFyY2Fkb3JfVUwgfiBBZ2VudGUsDQogIGRhdGEgPSBUb3hpbm9sb2dpYV9QYW5hbWENCikNCg0KZGF0YS5mcmFtZSgNCiAgSCA9IHVubmFtZShwcnVlYmFfa3ckc3RhdGlzdGljKSwNCiAgZ2wgPSB1bm5hbWUocHJ1ZWJhX2t3JHBhcmFtZXRlciksDQogIHBfdmFsb3IgPSBwcnVlYmFfa3ckcC52YWx1ZQ0KKSB8Pg0KICBrbml0cjo6a2FibGUoZGlnaXRzID0gNCwgY2FwdGlvbiA9ICJSZXN1bHRhZG8gZGUgS3J1c2thbOKAk1dhbGxpcyIpDQpgYGANCg0KIyMgQ29tcGFyYWNpb25lcyBwb3N0IGhvYw0KDQpgYGB7ciBrdy1wb3N0aG9jfQ0KaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJGU0EiLCBxdWlldGx5ID0gVFJVRSkpIHsNCiAgc3RvcCgiSW5zdGFsYSBlbCBwYXF1ZXRlIEZTQSBjb24gaW5zdGFsbC5wYWNrYWdlcygnRlNBJykgYW50ZXMgZGUgdGVqZXIgZWwgZG9jdW1lbnRvLiIpDQp9DQoNCnBvc3Rob2NfZHVubiA8LSBGU0E6OmR1bm5UZXN0KA0KICBCaW9tYXJjYWRvcl9VTCB+IEFnZW50ZSwNCiAgZGF0YSA9IFRveGlub2xvZ2lhX1BhbmFtYSwNCiAgbWV0aG9kID0gImhvbG0iDQopDQoNCnBvc3Rob2NfZHVubiRyZXMgfD4NCiAga25pdHI6OmthYmxlKA0KICAgIGRpZ2l0cyA9IDQsDQogICAgY2FwdGlvbiA9ICJDb21wYXJhY2lvbmVzIHBvc3QgaG9jIGRlIER1bm4gY29uIGFqdXN0ZSBkZSBIb2xtIg0KICApDQpgYGANCg0KPGRpdiBjbGFzcz0icmVzdWx0Ij4NCioqSW50ZXJwcmV0YWNpw7NuIGVzdGFkw61zdGljYS4qKiBLcnVza2Fs4oCTV2FsbGlzIHByb2R1am8gSCA9IGByIHJvdW5kKHVubmFtZShwcnVlYmFfa3ckc3RhdGlzdGljKSwgMylgLCBnbCA9IGByIHVubmFtZShwcnVlYmFfa3ckcGFyYW1ldGVyKWAgeSBwID0gYHIgZm9ybWF0LnB2YWwocHJ1ZWJhX2t3JHAudmFsdWUsIGRpZ2l0cyA9IDQpYC4gIA0KYHIgaWYgKHBydWViYV9rdyRwLnZhbHVlIDwgMC4wNSkgIlNlIHJlY2hhemEgSOKCgDogZXhpc3RlbiBkaWZlcmVuY2lhcyBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhcyBlbnRyZSBsb3MgYWdlbnRlcy4gTGFzIGNvbXBhcmFjaW9uZXMgZGUgRHVubiBwZXJtaXRlbiBpZGVudGlmaWNhciBlbnRyZSBxdcOpIHBhcmVzIHNlIGVuY3VlbnRyYW4gZXNhcyBkaWZlcmVuY2lhcy4iIGVsc2UgIk5vIHNlIHJlY2hhemEgSOKCgDogbm8gc2UgZGV0ZWN0YXJvbiBkaWZlcmVuY2lhcyBnbG9iYWxlcyBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhcy4iYA0KPC9kaXY+DQoNCiMjIEludGVycHJldGFjacOzbiB0b3hpbm9sw7NnaWNhDQoNCkVuIGxhIGJhc2Ugc2ltdWxhZGEsIGVsIGNvbXBvcnRhbWllbnRvIGRlbCBiaW9tYXJjYWRvciB2YXLDrWEgc2Vnw7puIGVsIGFnZW50ZSB0b3hpbm9sw7NnaWNvLiBMYXMgbWVkaWFuYXMgeSBsYXMgY29tcGFyYWNpb25lcyBwb3N0IGhvYyBwZXJtaXRlbiBkZXNjcmliaXIgcXXDqSBhZ2VudGVzIHByZXNlbnRhbiBuaXZlbGVzIHJlbGF0aXZhbWVudGUgbWF5b3JlcyBvIG1lbm9yZXMsIHNpbiBhdHJpYnVpciBjYXVzYWxpZGFkLg0KDQojIyBDb25jbHVzacOzbg0KDQpMYSBwcnVlYmEgZ2xvYmFsIGRldGVybWluYSBzaSBleGlzdGVuIGRpZmVyZW5jaWFzIGVudHJlIGFnZW50ZXMgeSwgY3VhbmRvIGVzIHNpZ25pZmljYXRpdmEsIGVsIHBvc3QgaG9jIGRlIER1bm4gY29uIGFqdXN0ZSBkZSBIb2xtIGlkZW50aWZpY2EgbG9zIHBhcmVzIHF1ZSBkaWZpZXJlbi4NCg0KLS0tDQoNCiMgMy4gS2FwbGFu4oCTTWVpZXINCnZpZGVvIDMgaHR0cHM6Ly95b3V0dS5iZS9xNm9fY21CUThKbw0KDQojIyBQcmVndW50YSBkZSBpbnZlc3RpZ2FjacOzbg0KDQoqKsK/Q8OzbW8gY2FtYmlhIGxhIHByb2JhYmlsaWRhZCBkZSBwZXJtYW5lY2VyIHNpbiBwcmVzZW50YXIgZWwgZXZlbnRvIGR1cmFudGUgZWwgc2VndWltaWVudG8gc2Vnw7puIGxhIHNldmVyaWRhZCBjbMOtbmljYSBkZWwgY2FzbyB0b3hpbm9sw7NnaWNvPyoqDQoNCiMjIFZhcmlhYmxlcw0KDQotICoqVGllbXBvOioqIGBUaWVtcG9fU3VwZXJ2aXZlbmNpYV9kaWFzYCDigJQgY3VhbnRpdGF0aXZhLCBlc2NhbGEgZGUgcmF6w7NuLg0KLSAqKkVzdGFkbzoqKiBgRXN0YWRvX0V2ZW50b2Ag4oCUIGJpbmFyaWE7IDAgPSBjZW5zdXJhIHkgMSA9IGV2ZW50by4NCi0gKipBZ3J1cGFjacOzbjoqKiBgU2V2ZXJpZGFkYCDigJQgY3VhbGl0YXRpdmEgb3JkaW5hbC4NCg0KIyMgUHJvcMOzc2l0byBkZWwgYW7DoWxpc2lzDQoNCkthcGxhbuKAk01laWVyIGVzIHByaW5jaXBhbG1lbnRlICoqZGVzY3JpcHRpdm8qKjogZXN0aW1hIGxhIGZ1bmNpw7NuIGRlIHN1cGVydml2ZW5jaWEgYSBsbyBsYXJnbyBkZWwgdGllbXBvIGNvbnNpZGVyYW5kbyBsYSBjZW5zdXJhLiBMYSBjb21wYXJhY2nDs24gZm9ybWFsIGVudHJlIGN1cnZhcyBzZSByZWFsaXphIHBvc3Rlcmlvcm1lbnRlIGNvbiBMb2ctUmFuay4NCg0KIyMgQ29uY2VwdG9zIHF1ZSBkZWJlbiBleHBsaWNhcnNlDQoNCi0gKipUaWVtcG8gYWwgZXZlbnRvOioqIHBlcsOtb2RvIG9ic2VydmFkbyBoYXN0YSBlbCBldmVudG8gbyBsYSBjZW5zdXJhLg0KLSAqKkNlbnN1cmE6KiogZWwgZXZlbnRvIG5vIHNlIG9ic2VydsOzIGR1cmFudGUgZWwgcGVyw61vZG8gZGUgc2VndWltaWVudG8gZGlzcG9uaWJsZS4NCi0gKipJbmRpdmlkdW9zIGVuIHJpZXNnbzoqKiBwYWNpZW50ZXMgcXVlIGNvbnRpbsO6YW4gZW4gc2VndWltaWVudG8geSBhw7puIHB1ZWRlbiBwcmVzZW50YXIgZWwgZXZlbnRvLg0KLSAqKkZ1bmNpw7NuIGRlIHN1cGVydml2ZW5jaWEgUyh0KToqKiBwcm9iYWJpbGlkYWQgZXN0aW1hZGEgZGUgcGVybWFuZWNlciBzaW4gZWwgZXZlbnRvIG3DoXMgYWxsw6EgZGVsIHRpZW1wbyBcKHRcKS4NCg0KIyMgRXN0YWTDrXN0aWNhIGRlc2NyaXB0aXZhDQoNCmBgYHtyIGttLWRlc2NyaXB0aXZvc30NCnRhYmxhX2ttIDwtIFRveGlub2xvZ2lhX1BhbmFtYSAlPiUNCiAgZ3JvdXBfYnkoU2V2ZXJpZGFkKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIG4gPSBuKCksDQogICAgRXZlbnRvcyA9IHN1bShFc3RhZG9fRXZlbnRvID09IDEsIG5hLnJtID0gVFJVRSksDQogICAgQ2Vuc3VyYWRvcyA9IHN1bShFc3RhZG9fRXZlbnRvID09IDAsIG5hLnJtID0gVFJVRSksDQogICAgUG9yY2VudGFqZV9ldmVudG9zID0gcm91bmQoMTAwICogRXZlbnRvcyAvIG4sIDIpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KDQprbml0cjo6a2FibGUoDQogIHRhYmxhX2ttLA0KICBjYXB0aW9uID0gIkV2ZW50b3MgeSBjZW5zdXJhcyBzZWfDum4gc2V2ZXJpZGFkIg0KKQ0KYGBgDQoNCiMjIFN1cHVlc3RvcyBwcmluY2lwYWxlcw0KDQotIFRpZW1wbyBkZSBzZWd1aW1pZW50byBjb3JyZWN0YW1lbnRlIGRlZmluaWRvLg0KLSBFdmVudG8gY29ycmVjdGFtZW50ZSBpZGVudGlmaWNhZG8uDQotIE9ic2VydmFjaW9uZXMgaW5kZXBlbmRpZW50ZXMuDQotIENlbnN1cmEgbm8gaW5mb3JtYXRpdmEuDQoNCiMjIEVzdGltYWNpw7NuIEthcGxhbuKAk01laWVyDQoNCmBgYHtyIGttLW1vZGVsb30NCm1vZGVsb19rbSA8LSBzdXJ2Zml0KA0KICBTdXJ2KFRpZW1wb19TdXBlcnZpdmVuY2lhX2RpYXMsIEVzdGFkb19FdmVudG8pIH4gU2V2ZXJpZGFkLA0KICBkYXRhID0gVG94aW5vbG9naWFfUGFuYW1hDQopDQoNCm1vZGVsb19rbQ0KYGBgDQoNCiMjIEN1cnZhcyBkZSBzdXBlcnZpdmVuY2lhIHkgcGFjaWVudGVzIGVuIHJpZXNnbw0KDQpgYGB7ciBrbS1ncmFmaWNvLCBmaWcuaGVpZ2h0PTd9DQpnZ3N1cnZwbG90KA0KICBtb2RlbG9fa20sDQogIGRhdGEgPSBUb3hpbm9sb2dpYV9QYW5hbWEsDQogIGNlbnNvciA9IFRSVUUsDQogIGNvbmYuaW50ID0gRkFMU0UsDQogIHJpc2sudGFibGUgPSBUUlVFLA0KICByaXNrLnRhYmxlLmhlaWdodCA9IDAuMzAsDQogIHJpc2sudGFibGUudGl0bGUgPSAiUGFjaWVudGVzIGVuIHJpZXNnbyIsDQogIHRpdGxlID0gIkN1cnZhcyBkZSBLYXBsYW7igJNNZWllciBzZWfDum4gc2V2ZXJpZGFkIiwNCiAgeGxhYiA9ICJUaWVtcG8gZGUgc2VndWltaWVudG8gKGTDrWFzKSIsDQogIHlsYWIgPSAiUHJvYmFiaWxpZGFkIGRlIHBlcm1hbmVjZXIgc2luIGVsIGV2ZW50byIsDQogIGxlZ2VuZC50aXRsZSA9ICJTZXZlcmlkYWQiLA0KICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMikNCikNCmBgYA0KDQo8ZGl2IGNsYXNzPSJub3RlIj4NCioqQ8OzbW8gbGVlciBsYSBncsOhZmljYToqKiB1bmEgY3VydmEgbcOhcyBhbHRhIHJlcHJlc2VudGEgdW5hIG1heW9yIHByb2JhYmlsaWRhZCBlc3RpbWFkYSBkZSBwZXJtYW5lY2VyIHNpbiBlbCBldmVudG8uIENhZGEgZGVzY2Vuc28gcmVmbGVqYSBsYSBvY3VycmVuY2lhIGRlIGV2ZW50b3MgeSBsYXMgbWFyY2FzIGRlIGNlbnN1cmEgcmVwcmVzZW50YW4gcGFjaWVudGVzIGN1eW8gZXZlbnRvIG5vIGZ1ZSBvYnNlcnZhZG8gZHVyYW50ZSBlbCBzZWd1aW1pZW50by4NCjwvZGl2Pg0KDQojIyBJbnRlcnByZXRhY2nDs24gZXN0YWTDrXN0aWNhDQoNCkxhcyBjdXJ2YXMgcGVybWl0ZW4gY29tcGFyYXIgdmlzdWFsbWVudGUgZWwgcGF0csOzbiBkZSBzdXBlcnZpdmVuY2lhIGVudHJlIG5pdmVsZXMgZGUgc2V2ZXJpZGFkLiBMYSBtZWRpYW5hIGRlIHN1cGVydml2ZW5jaWEgc29sbyBwdWVkZSByZXBvcnRhcnNlIHNpIGFsZ3VuYSBjdXJ2YSBhbGNhbnphIHVuYSBwcm9iYWJpbGlkYWQgZGUgMC41MCBkdXJhbnRlIGVsIHNlZ3VpbWllbnRvLg0KDQojIyBJbnRlcnByZXRhY2nDs24gdG94aW5vbMOzZ2ljYQ0KDQpFbiBlbCBlc2NlbmFyaW8gc2ltdWxhZG8sIHVuYSBjdXJ2YSBtw6FzIGJhamEgaW5kaWNhIHVuIHBhdHLDs24gbWVub3MgZmF2b3JhYmxlIGRlIHBlcm1hbmVuY2lhIHNpbiBldmVudG8uIExhIGxlY3R1cmEgZGViZSBjZW50cmFyc2UgZW4gbGEgc2VwYXJhY2nDs24geSBlbCBkZXNjZW5zbyBkZSBsYXMgY3VydmFzLCBzaW4gaW5mZXJpciB0b2RhdsOtYSBzaWduaWZpY2FuY2lhIGVzdGFkw61zdGljYSBlbnRyZSBlbGxhcy4NCg0KIyMgQ29uY2x1c2nDs24NCg0KS2FwbGFu4oCTTWVpZXIgZGVzY3JpYmUgKipjw7NtbyBjYW1iaWEgbGEgcHJvYmFiaWxpZGFkIGRlIHBlcm1hbmVjZXIgc2luIGVsIGV2ZW50byBhIGxvIGxhcmdvIGRlbCB0aWVtcG8qKiB5IHBlcm1pdGUgdmlzdWFsaXphciBlbCBlZmVjdG8gZGUgbGEgY2Vuc3VyYSB5IGVsIG7Dum1lcm8gZGUgcGFjaWVudGVzIGVuIHJpZXNnby4NCg0KLS0tDQoNCiMgNC4gTG9nLVJhbmsNCg0KdmlkZW8gNCBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWkyY3lwd3BtSmV3DQoNCiMjIFByZWd1bnRhIGRlIGludmVzdGlnYWNpw7NuDQoNCioqwr9FeGlzdGVuIGRpZmVyZW5jaWFzIGVudHJlIGxhcyBjdXJ2YXMgZGUgc3VwZXJ2aXZlbmNpYSBkZSBsb3MgcGFjaWVudGVzIHF1ZSByZWNpYmVuIGRpZmVyZW50ZXMgdHJhdGFtaWVudG9zPyoqDQoNCiMjIFZhcmlhYmxlcw0KDQotICoqVGllbXBvOioqIGBUaWVtcG9fU3VwZXJ2aXZlbmNpYV9kaWFzYC4NCi0gKipFdmVudG86KiogYEVzdGFkb19FdmVudG9gLg0KLSAqKkdydXBvOioqIGBUcmF0YW1pZW50b2AuDQoNCiMjIEhpcMOzdGVzaXMNCg0KKipI4oKAOioqIGxhcyBmdW5jaW9uZXMgZGUgc3VwZXJ2aXZlbmNpYSBzb24gaWd1YWxlcyBlbnRyZSB0b2RvcyBsb3MgdHJhdGFtaWVudG9zLiAgDQoqKkjigoE6KiogYWwgbWVub3MgdW5hIGZ1bmNpw7NuIGRlIHN1cGVydml2ZW5jaWEgZGlmaWVyZSBkZSBsYXMgZGVtw6FzLg0KDQojIyDCv1BvciBxdcOpIHNlIGVsaWdpw7MgZXN0YSBwcnVlYmE/DQoNCkxvZy1SYW5rIGNvbXBhcmEgZm9ybWFsbWVudGUgY3VydmFzIGRlIHN1cGVydml2ZW5jaWEgZGUgZ3J1cG9zIGluZGVwZW5kaWVudGVzIHkgdXRpbGl6YSBhZGVjdWFkYW1lbnRlIGxhIGluZm9ybWFjacOzbiBkZSBvYnNlcnZhY2lvbmVzIGNlbnN1cmFkYXMuDQoNCiMjIFN1cHVlc3RvcyBwcmluY2lwYWxlcw0KDQotIE9ic2VydmFjaW9uZXMgaW5kZXBlbmRpZW50ZXMuDQotIFRpZW1wbyB5IGV2ZW50byBiaWVuIGRlZmluaWRvcy4NCi0gQ2Vuc3VyYSBubyBpbmZvcm1hdGl2YS4NCi0gR3J1cG9zIGluZGVwZW5kaWVudGVzLg0KLSBMYSBwcnVlYmEgZXMgZXNwZWNpYWxtZW50ZSBpbnRlcnByZXRhYmxlIGN1YW5kbyBsYXMgZGlmZXJlbmNpYXMgZW50cmUgY3VydmFzIHNvbiByZWxhdGl2YW1lbnRlIGNvbnNpc3RlbnRlcyBkdXJhbnRlIGVsIHNlZ3VpbWllbnRvLg0KDQojIyBFc3RhZMOtc3RpY2EgZGVzY3JpcHRpdmENCg0KYGBge3IgbG9ncmFuay1kZXNjcmlwdGl2b3N9DQp0YWJsYV9sb2dyYW5rIDwtIFRveGlub2xvZ2lhX1BhbmFtYSAlPiUNCiAgZ3JvdXBfYnkoVHJhdGFtaWVudG8pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbiA9IG4oKSwNCiAgICBFdmVudG9zID0gc3VtKEVzdGFkb19FdmVudG8gPT0gMSwgbmEucm0gPSBUUlVFKSwNCiAgICBDZW5zdXJhZG9zID0gc3VtKEVzdGFkb19FdmVudG8gPT0gMCwgbmEucm0gPSBUUlVFKSwNCiAgICBQb3JjZW50YWplX2V2ZW50b3MgPSByb3VuZCgxMDAgKiBFdmVudG9zIC8gbiwgMiksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApDQoNCmtuaXRyOjprYWJsZSgNCiAgdGFibGFfbG9ncmFuaywNCiAgY2FwdGlvbiA9ICJFdmVudG9zIHkgY2Vuc3VyYXMgc2Vnw7puIHRyYXRhbWllbnRvIg0KKQ0KYGBgDQoNCiMjIEthcGxhbuKAk01laWVyIHBvciB0cmF0YW1pZW50byB5IHBydWViYSBMb2ctUmFuaw0KDQpgYGB7ciBsb2dyYW5rLW1vZGVsb30NCnN1cGVydml2ZW5jaWFfbG9ncmFuayA8LSBTdXJ2KA0KICBUb3hpbm9sb2dpYV9QYW5hbWEkVGllbXBvX1N1cGVydml2ZW5jaWFfZGlhcywNCiAgVG94aW5vbG9naWFfUGFuYW1hJEVzdGFkb19FdmVudG8NCikNCg0Ka21fdHJhdGFtaWVudG8gPC0gc3VydmZpdCgNCiAgc3VwZXJ2aXZlbmNpYV9sb2dyYW5rIH4gVHJhdGFtaWVudG8sDQogIGRhdGEgPSBUb3hpbm9sb2dpYV9QYW5hbWENCikNCg0KbG9ncmFuayA8LSBzdXJ2ZGlmZigNCiAgc3VwZXJ2aXZlbmNpYV9sb2dyYW5rIH4gVHJhdGFtaWVudG8sDQogIGRhdGEgPSBUb3hpbm9sb2dpYV9QYW5hbWENCikNCg0KZ2xfbG9ncmFuayA8LSBsZW5ndGgobG9ncmFuayRuKSAtIDENCnBfbG9ncmFuayA8LSBwY2hpc3EoDQogIGxvZ3JhbmskY2hpc3EsDQogIGRmID0gZ2xfbG9ncmFuaywNCiAgbG93ZXIudGFpbCA9IEZBTFNFDQopDQoNCmRhdGEuZnJhbWUoDQogIENoaV9jdWFkcmFkbyA9IGxvZ3JhbmskY2hpc3EsDQogIGdsID0gZ2xfbG9ncmFuaywNCiAgcF92YWxvciA9IHBfbG9ncmFuaw0KKSB8Pg0KICBrbml0cjo6a2FibGUoZGlnaXRzID0gNCwgY2FwdGlvbiA9ICJSZXN1bHRhZG8gZGUgbGEgcHJ1ZWJhIExvZy1SYW5rIikNCmBgYA0KDQojIyBHcsOhZmljbw0KDQpgYGB7ciBsb2dyYW5rLWdyYWZpY28sIGZpZy5oZWlnaHQ9N30NCmdnc3VydnBsb3QoDQogIGttX3RyYXRhbWllbnRvLA0KICBkYXRhID0gVG94aW5vbG9naWFfUGFuYW1hLA0KICBjb25mLmludCA9IFRSVUUsDQogIGNlbnNvciA9IFRSVUUsDQogIHJpc2sudGFibGUgPSBUUlVFLA0KICByaXNrLnRhYmxlLmhlaWdodCA9IDAuMjgsDQogIHJpc2sudGFibGUudGl0bGUgPSAiTsO6bWVybyBkZSBwYWNpZW50ZXMgZW4gcmllc2dvIiwNCiAgcHZhbCA9IFRSVUUsDQogIHB2YWwubWV0aG9kID0gVFJVRSwNCiAgdGl0bGUgPSAiQ3VydmFzIGRlIHN1cGVydml2ZW5jaWEgc2Vnw7puIHRyYXRhbWllbnRvIiwNCiAgeGxhYiA9ICJUaWVtcG8gZGUgc2VndWltaWVudG8gKGTDrWFzKSIsDQogIHlsYWIgPSAiUHJvYmFiaWxpZGFkIGRlIHBlcm1hbmVjZXIgc2luIGVsIGV2ZW50byIsDQogIGxlZ2VuZC50aXRsZSA9ICJUcmF0YW1pZW50byIsDQogIGxlZ2VuZCA9ICJ0b3AiLA0KICBnZ3RoZW1lID0gdGhlbWVfY2xhc3NpYygpDQopDQpgYGANCg0KPGRpdiBjbGFzcz0icmVzdWx0Ij4NCioqSW50ZXJwcmV0YWNpw7NuIGVzdGFkw61zdGljYS4qKiBMYSBwcnVlYmEgTG9nLVJhbmsgcHJvZHVqbyDPh8KyID0gYHIgcm91bmQobG9ncmFuayRjaGlzcSwgMylgLCBnbCA9IGByIGdsX2xvZ3JhbmtgIHkgcCA9IGByIGZvcm1hdC5wdmFsKHBfbG9ncmFuaywgZGlnaXRzID0gNClgLiAgDQpgciBpZiAocF9sb2dyYW5rIDwgMC4wNSkgIlNlIHJlY2hhemEgSOKCgDogZXhpc3RlbiBkaWZlcmVuY2lhcyBnbG9iYWxlcyBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhcyBlbnRyZSBsYXMgY3VydmFzIGRlIHN1cGVydml2ZW5jaWEgZGUgbG9zIHRyYXRhbWllbnRvcy4iIGVsc2UgIk5vIHNlIHJlY2hhemEgSOKCgDogbm8gc2UgZW5jb250cmFyb24gZGlmZXJlbmNpYXMgZ2xvYmFsZXMgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YXMgZW50cmUgbGFzIGN1cnZhcy4iYA0KPC9kaXY+DQoNCiMjIEludGVycHJldGFjacOzbiB0b3hpbm9sw7NnaWNhDQoNCkxhcyBjdXJ2YXMgcGVybWl0ZW4gb2JzZXJ2YXIgY3XDoWwgdHJhdGFtaWVudG8gbWFudGllbmUgdW5hIG1heW9yIG8gbWVub3IgcHJvYmFiaWxpZGFkIGVzdGltYWRhIGRlIHBlcm1hbmVjZXIgc2luIGVsIGV2ZW50by4gTGEgcHJ1ZWJhIExvZy1SYW5rIGluZGljYSBzaSBsYSBkaWZlcmVuY2lhIGdsb2JhbCBlbnRyZSBjdXJ2YXMgZXMgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YSwgcGVybyAqKm5vIGlkZW50aWZpY2EgcG9yIHPDrSBzb2xhIHF1w6kgcGFyZXMgZGUgdHJhdGFtaWVudG9zIGRpZmllcmVuKiouDQoNCiMjIENvbmNsdXNpw7NuDQoNCkxvZy1SYW5rIHJlc3BvbmRlIGRpcmVjdGFtZW50ZSBzaSBsYXMgY3VydmFzIGRlIHN1cGVydml2ZW5jaWEgZGUgbG9zIHRyYXRhbWllbnRvcyBzb24gaWd1YWxlcyBvIGRpZmVyZW50ZXMgZHVyYW50ZSBlbCBzZWd1aW1pZW50by4NCg0KLS0tDQoNCiMgNS4gTW9kZWxvIGRlIHJpZXNnb3MgcHJvcG9yY2lvbmFsZXMgZGUgQ294DQoNCnZpZGVvIDUgaHR0cHM6Ly95b3V0dS5iZS9fc090TFRTRE1GND9zaT1HY3doWVlWb09Bd2pRcU16DQoNCiMjIFByZWd1bnRhIGRlIGludmVzdGlnYWNpw7NuDQoNCioqwr9FeGlzdGUgdW5hIGFzb2NpYWNpw7NuIGVudHJlIGVsIHRyYXRhbWllbnRvIGFkbWluaXN0cmFkbyB5IGVsIHJpZXNnbyBpbnN0YW50w6FuZW8gZGUgcHJlc2VudGFyIGVsIGV2ZW50byBkdXJhbnRlIGVsIHNlZ3VpbWllbnRvLCBkZXNwdcOpcyBkZSBhanVzdGFyIHBvciBlZGFkLCBzZXhvLCBhZ2VudGUgdG94aW5vbMOzZ2ljbywgZG9zaXMsIHNldmVyaWRhZCB5IGJpb21hcmNhZG9yPyoqDQoNCiMjIFZhcmlhYmxlcw0KDQotICoqVGllbXBvOioqIGBUaWVtcG9fU3VwZXJ2aXZlbmNpYV9kaWFzYC4NCi0gKipFdmVudG86KiogYEVzdGFkb19FdmVudG9gLg0KLSAqKlByZWRpY3RvciBwcmluY2lwYWw6KiogYFRyYXRhbWllbnRvYC4NCi0gKipDb3ZhcmlhYmxlczoqKiBgRWRhZGAsIGBTZXhvYCwgYEFnZW50ZWAsIGBEb3Npc19tZ2tnYCwgYFNldmVyaWRhZGAsIGBCaW9tYXJjYWRvcl9VTGAuDQoNCiMjIEhpcMOzdGVzaXMNCg0KKipI4oKAOioqIGVsIHRyYXRhbWllbnRvIG5vIHNlIGFzb2NpYSBjb24gZWwgaGF6YXJkIGRlbCBldmVudG8gZGVzcHXDqXMgZGVsIGFqdXN0ZSBwb3IgbGFzIGNvdmFyaWFibGVzLiAgDQoqKkjigoE6KiogZWwgdHJhdGFtaWVudG8gc2UgYXNvY2lhIGNvbiBlbCBoYXphcmQgZGVsIGV2ZW50byBkZXNwdcOpcyBkZWwgYWp1c3RlLg0KDQojIyDCv1BvciBxdcOpIHNlIGVsaWdpw7MgZXN0ZSBtb2RlbG8/DQoNCkVsIG1vZGVsbyBkZSBDb3ggcGVybWl0ZSBlc3R1ZGlhciBzaW11bHTDoW5lYW1lbnRlIGVsICoqdGllbXBvIGhhc3RhIGVsIGV2ZW50byoqLCBsYSAqKmNlbnN1cmEqKiB5IG3Dumx0aXBsZXMgdmFyaWFibGVzIGV4cGxpY2F0aXZhcy4gU3UgbWVkaWRhIHByaW5jaXBhbCBlcyBlbCAqKkhhemFyZCBSYXRpbyAoSFIpKiouDQoNCjxkaXYgY2xhc3M9Im5vdGUiPg0KKipDw7NtbyBpbnRlcnByZXRhciB1biBIUjoqKiBIUiA9IDEgaW5kaWNhIGF1c2VuY2lhIGRlIGRpZmVyZW5jaWEgZW4gZWwgaGF6YXJkIHJlc3BlY3RvIGEgbGEgY2F0ZWdvcsOtYSBkZSByZWZlcmVuY2lhOyBIUiAmZ3Q7IDEgaW5kaWNhIG1heW9yIGhhemFyZDsgSFIgJmx0OyAxIGluZGljYSBtZW5vciBoYXphcmQsIG1hbnRlbmllbmRvIGNvbnN0YW50ZXMgbGFzIGRlbcOhcyB2YXJpYWJsZXMgZGVsIG1vZGVsby4NCjwvZGl2Pg0KDQojIyBTdXB1ZXN0b3MgcHJpbmNpcGFsZXMNCg0KLSBUaWVtcG8geSBldmVudG8gY29ycmVjdGFtZW50ZSBkZWZpbmlkb3MuDQotIE9ic2VydmFjaW9uZXMgaW5kZXBlbmRpZW50ZXMuDQotIENlbnN1cmEgbm8gaW5mb3JtYXRpdmEuDQotIFJpZXNnb3MgcHJvcG9yY2lvbmFsZXMuDQotIFJlbGFjacOzbiBhZGVjdWFkYSBlbnRyZSBjb3ZhcmlhYmxlcyBjb250aW51YXMgeSBlbCBsb2ctaGF6YXJkLg0KLSBBdXNlbmNpYSBkZSBtdWx0aWNvbGluZWFsaWRhZCBpbXBvcnRhbnRlLg0KDQojIyBQcmVwYXJhY2nDs24gZGVsIG1vZGVsbw0KDQpgYGB7ciBjb3gtcHJlcGFyYWNpb259DQojIFNlIGRlamEgU2V2ZXJpZGFkIGNvbW8gZmFjdG9yIG5vIG9yZGVuYWRvIHBhcmEgb2J0ZW5lciBIUg0KIyBkZSBjYXRlZ29yw61hcyBmcmVudGUgYSB1bmEgcmVmZXJlbmNpYSBjbGFyYS4NClRveGlub2xvZ2lhX1BhbmFtYSRTZXZlcmlkYWQgPC0gZmFjdG9yKA0KICBUb3hpbm9sb2dpYV9QYW5hbWEkU2V2ZXJpZGFkLA0KICBsZXZlbHMgPSBjKCJMZXZlIiwgIk1vZGVyYWRhIiwgIlNldmVyYSIsICJDcsOtdGljYSIpLA0KICBvcmRlcmVkID0gRkFMU0UNCikNCg0KVG94aW5vbG9naWFfUGFuYW1hJFNldmVyaWRhZCA8LSByZWxldmVsKA0KICBUb3hpbm9sb2dpYV9QYW5hbWEkU2V2ZXJpZGFkLA0KICByZWYgPSAiTGV2ZSINCikNCmBgYA0KDQojIyBNb2RlbG8gYWp1c3RhZG8NCg0KYGBge3IgY294LW1vZGVsb30NCm1vZGVsb19jb3hfYWp1c3RhZG8gPC0gY294cGgoDQogIFN1cnYoVGllbXBvX1N1cGVydml2ZW5jaWFfZGlhcywgRXN0YWRvX0V2ZW50bykgfg0KICAgIFRyYXRhbWllbnRvICsNCiAgICBFZGFkICsNCiAgICBTZXhvICsNCiAgICBBZ2VudGUgKw0KICAgIERvc2lzX21na2cgKw0KICAgIFNldmVyaWRhZCArDQogICAgQmlvbWFyY2Fkb3JfVUwsDQogIGRhdGEgPSBUb3hpbm9sb2dpYV9QYW5hbWENCikNCg0Kc3VtbWFyeShtb2RlbG9fY294X2FqdXN0YWRvKQ0KYGBgDQoNCiMjIEhhemFyZCBSYXRpb3MgZSBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YQ0KDQpgYGB7ciBjb3gtaHJ9DQpzX2NveCA8LSBzdW1tYXJ5KG1vZGVsb19jb3hfYWp1c3RhZG8pDQoNCnRhYmxhX2hyIDwtIGRhdGEuZnJhbWUoDQogIFZhcmlhYmxlID0gcm93bmFtZXMoc19jb3gkY29lZmZpY2llbnRzKSwNCiAgSFIgPSBzX2NveCRjb2VmZmljaWVudHNbLCAiZXhwKGNvZWYpIl0sDQogIElDOTVfaW5mID0gc19jb3gkY29uZi5pbnRbLCAibG93ZXIgLjk1Il0sDQogIElDOTVfc3VwID0gc19jb3gkY29uZi5pbnRbLCAidXBwZXIgLjk1Il0sDQogIHBfdmFsb3IgPSBzX2NveCRjb2VmZmljaWVudHNbLCAiUHIoPnx6fCkiXSwNCiAgcm93Lm5hbWVzID0gTlVMTA0KKQ0KDQprbml0cjo6a2FibGUoDQogIHRhYmxhX2hyLA0KICBkaWdpdHMgPSA0LA0KICBjYXB0aW9uID0gIkhhemFyZCBSYXRpb3MgYWp1c3RhZG9zIGRlbCBtb2RlbG8gZGUgQ294Ig0KKQ0KYGBgDQoNCiMjIEVmZWN0byBnbG9iYWwgZGVsIHRyYXRhbWllbnRvDQoNCmBgYHtyIGNveC10cmF0YW1pZW50by1nbG9iYWx9DQptb2RlbG9fc2luX3RyYXQgPC0gdXBkYXRlKA0KICBtb2RlbG9fY294X2FqdXN0YWRvLA0KICAuIH4gLiAtIFRyYXRhbWllbnRvDQopDQoNCmNvbXBhcmFjaW9uX3RyYXQgPC0gYW5vdmEoDQogIG1vZGVsb19zaW5fdHJhdCwNCiAgbW9kZWxvX2NveF9hanVzdGFkbywNCiAgdGVzdCA9ICJMUlQiDQopDQoNCmNvbXBhcmFjaW9uX3RyYXQNCmBgYA0KDQo8ZGl2IGNsYXNzPSJub3RlIj4NCkVsICoqcC12YWxvciBnbG9iYWwgZGVsIG1vZGVsbyoqIG5vIGRlYmUgY29uZnVuZGlyc2UgY29uIGVsIGVmZWN0byBlc3BlY8OtZmljbyBkZWwgdHJhdGFtaWVudG8uIFBhcmEgZXZhbHVhciBlbCB0cmF0YW1pZW50byBjb21vIGNvbmp1bnRvIHNlIGNvbXBhcmEgZWwgbW9kZWxvIGNvbXBsZXRvIGNvbiBvdHJvIG1vZGVsbyBpZMOpbnRpY28gcGVybyBzaW4gYFRyYXRhbWllbnRvYC4NCjwvZGl2Pg0KDQojIyBTdXB1ZXN0byBkZSByaWVzZ29zIHByb3BvcmNpb25hbGVzDQoNCmBgYHtyIGNveC1waH0NCnN1cHVlc3RvX1BIIDwtIGNveC56cGgobW9kZWxvX2NveF9hanVzdGFkbykNCg0Kc3VwdWVzdG9fUEgNCmBgYA0KDQo8ZGl2IGNsYXNzPSJyZXN1bHQiPg0KKipJbnRlcnByZXRhY2nDs24gZGVsIHN1cHVlc3RvOioqIGVuIGBjb3guenBoYCwgSOKCgCBlc3RhYmxlY2UgcXVlIGVsIHN1cHVlc3RvIGRlIHJpZXNnb3MgcHJvcG9yY2lvbmFsZXMgc2UgY3VtcGxlLiBVbiBwICZndDsgMC4wNSBpbmRpY2EgcXVlIG5vIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIGRlIHZpb2xhY2nDs247IHVuIHAgJmx0OyAwLjA1IGluZGljYSBldmlkZW5jaWEgZGUgcG9zaWJsZSBpbmN1bXBsaW1pZW50by4gRGViZSByZXZpc2Fyc2UgdGFudG8gY2FkYSBjb3ZhcmlhYmxlIGNvbW8gbGEgZmlsYSAqKkdMT0JBTCoqLg0KPC9kaXY+DQoNCiMjIEdyw6FmaWNvIGRlIEhhemFyZCBSYXRpb3MNCg0KYGBge3IgY294LWZvcmVzdCwgZmlnLmhlaWdodD03fQ0KZ2dmb3Jlc3QoDQogIG1vZGVsb19jb3hfYWp1c3RhZG8sDQogIGRhdGEgPSBUb3hpbm9sb2dpYV9QYW5hbWEsDQogIG1haW4gPSAiSGF6YXJkIFJhdGlvcyBhanVzdGFkb3MiLA0KICBjcG9zaXRpb25zID0gYygwLjAyLCAwLjIyLCAwLjQwKSwNCiAgZm9udHNpemUgPSAwLjgNCikNCmBgYA0KDQojIyBJbnRlcnByZXRhY2nDs24gZXN0YWTDrXN0aWNhDQoNCkVsIG1vZGVsbyBkZSBDb3ggZXN0aW1hIGVsIGNhbWJpbyByZWxhdGl2byBlbiBlbCAqKmhhemFyZCBpbnN0YW50w6FuZW8qKiBhc29jaWFkbyBjb24gY2FkYSBwcmVkaWN0b3IsIG1hbnRlbmllbmRvIGNvbnN0YW50ZXMgbGFzIGRlbcOhcyB2YXJpYWJsZXMuIExvcyBIUiBkZWJlbiBpbnRlcnByZXRhcnNlIHNpZW1wcmUgcmVzcGVjdG8gYSBzdSBjYXRlZ29yw61hIGRlIHJlZmVyZW5jaWEgeSBqdW50byBjb24gc3UgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZWwgOTUgJSB5IHN1IHZhbG9yIHAuDQoNCkN1YW5kbyB1biBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGRlbCA5NSAlIHBhcmEgdW4gSFIgKipubyBpbmNsdXllIDEqKiwgZXhpc3RlIGV2aWRlbmNpYSBkZSBhc29jaWFjacOzbiBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIHBhcmEgZXNlIGNvbnRyYXN0ZSwgc2llbXByZSBxdWUgbG9zIHN1cHVlc3RvcyBkZWwgbW9kZWxvIHNlYW4gcmF6b25hYmxlcy4NCg0KIyMgSW50ZXJwcmV0YWNpw7NuIHRveGlub2zDs2dpY2ENCg0KRGVudHJvIGRlbCBlc2NlbmFyaW8gc2ltdWxhZG8sIGVsIG1vZGVsbyBwZXJtaXRlIGlkZW50aWZpY2FyIHF1w6kgY2FyYWN0ZXLDrXN0aWNhcyBzZSBhc29jaWFuIGNvbiB1biBtYXlvciBvIG1lbm9yIGhhemFyZCBkZSBwcmVzZW50YXIgZWwgZXZlbnRvIGR1cmFudGUgZWwgc2VndWltaWVudG8sIGRlc3B1w6lzIGRlIGNvbnNpZGVyYXIgc2ltdWx0w6FuZWFtZW50ZSBsYXMgZGVtw6FzIGNvdmFyaWFibGVzLg0KDQpEZWJlIHV0aWxpemFyc2UgbGVuZ3VhamUgZGUgKiphc29jaWFjacOzbioqIHkgbm8gZGUgY2F1c2FsaWRhZDogcG9yIGVqZW1wbG8sIOKAnHNlIGFzb2NpYSBjb24gdW4gbWVub3IgaGF6YXJk4oCdIGVuIGx1Z2FyIGRlIOKAnHByb3RlZ2XigJ0gbyDigJxldml0YeKAnSBlbCBldmVudG8uDQoNCiMjIENvbmNsdXNpw7NuDQoNCkVsIG1vZGVsbyBkZSBDb3ggY29tcGxlbWVudGEgYSBLYXBsYW7igJNNZWllciB5IExvZy1SYW5rIHBvcnF1ZSBubyBzb2xvIGNvbXBhcmEgZ3J1cG9zLCBzaW5vIHF1ZSBwZXJtaXRlICoqY3VhbnRpZmljYXIgYXNvY2lhY2lvbmVzIGFqdXN0YWRhcyBtZWRpYW50ZSBIYXphcmQgUmF0aW9zKiogeSBldmFsdWFyIG3Dumx0aXBsZXMgY292YXJpYWJsZXMgYWwgbWlzbW8gdGllbXBvLiBMYSBjb25jbHVzacOzbiBmaW5hbCBkZWJlIGNvbnNpZGVyYXIgdGFudG8gbG9zIEhSIGUgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEgY29tbyBsYSB2ZXJpZmljYWNpw7NuIGRlbCBzdXB1ZXN0byBkZSByaWVzZ29zIHByb3BvcmNpb25hbGVzLg0KDQotLS0NCg0KIyBDb25jbHVzacOzbiBnZW5lcmFsDQoNCkxhcyBjaW5jbyBwcnVlYmFzIHJlc3BvbmRlbiBhIHByZWd1bnRhcyBkaWZlcmVudGVzIHkgY29tcGxlbWVudGFyaWFzOg0KDQotICoqTWFubuKAk1doaXRuZXnigJNXaWxjb3hvbioqIGNvbXBhcmEgZG9zIGdydXBvcyBpbmRlcGVuZGllbnRlcy4NCi0gKipLcnVza2Fs4oCTV2FsbGlzKiogY29tcGFyYSBtw6FzIGRlIGRvcyBncnVwb3MgaW5kZXBlbmRpZW50ZXMgeSBwdWVkZSBjb21wbGVtZW50YXJzZSBjb24gRHVubi4NCi0gKipLYXBsYW7igJNNZWllcioqIGRlc2NyaWJlIGxhIHByb2JhYmlsaWRhZCBkZSBwZXJtYW5lY2VyIHNpbiBlbCBldmVudG8gYSBsbyBsYXJnbyBkZWwgdGllbXBvLg0KLSAqKkxvZy1SYW5rKiogY29udHJhc3RhIGZvcm1hbG1lbnRlIHNpIHZhcmlhcyBjdXJ2YXMgZGUgc3VwZXJ2aXZlbmNpYSBkaWZpZXJlbi4NCi0gKipDb3gqKiBjdWFudGlmaWNhIGxhIGFzb2NpYWNpw7NuIGVudHJlIHByZWRpY3RvcmVzIHkgZWwgaGF6YXJkIGRlbCBldmVudG8gbWVkaWFudGUgSGF6YXJkIFJhdGlvcyBhanVzdGFkb3MuDQoNCkVuIGNvbmp1bnRvLCBlbCBkb2N1bWVudG8gbXVlc3RyYSBlbCBmbHVqbyBjb21wbGV0byBzb2xpY2l0YWRvOiBwbGFudGVhbWllbnRvIGRlIGxhIHByZWd1bnRhLCBpZGVudGlmaWNhY2nDs24gZGUgdmFyaWFibGVzLCBoaXDDs3Rlc2lzLCBzZWxlY2Npw7NuIGRlIGxhIHBydWViYSwgc3VwdWVzdG9zLCBlamVjdWNpw7NuIGVuIFIsIHZpc3VhbGl6YWNpw7NuLCBpbnRlcnByZXRhY2nDs24gZXN0YWTDrXN0aWNhLCBpbnRlcnByZXRhY2nDs24gdG94aW5vbMOzZ2ljYSB5IGNvbmNsdXNpw7NuLg0KDQo8ZGl2IGNsYXNzPSJub3RlIj4NCioqUGFyYSBsYSBleHBvc2ljacOzbjoqKiBubyBlcyBuZWNlc2FyaW8gZXhwbGljYXIgZWwgY8OzZGlnbyBsw61uZWEgcG9yIGzDrW5lYS4gVXRpbGl6YSBlbCBIVE1MIGNvbW8gZ3XDrWEgdmlzdWFsIHkgY8OpbnRyYXRlIGVuIGxhIHByZWd1bnRhLCBwb3IgcXXDqSBlc2NvZ2lzdGUgbGEgcHJ1ZWJhLCBxdcOpIG11ZXN0cmEgbGEgZ3LDoWZpY2EsIGN1w6FsIGZ1ZSBlbCByZXN1bHRhZG8gcHJpbmNpcGFsIHkgcXXDqSBzaWduaWZpY2EgZGVudHJvIGRlbCBlc2NlbmFyaW8gdG94aW5vbMOzZ2ljbyBzaW11bGFkby4NCjwvZGl2Pg0KDQoNCg==