Fase 1 [Descripciones Multivariantes]

En la primera etapa del estudio, se llevarán a cabo cálculos, visualizaciones y un análisis detallado del conjunto de datos clínicos, que será descrito en la sección 1.2. Este proceso se abordará desde una perspectiva de estadística descriptiva multivariante, lo que permitirá no solo una visión general de los datos, sino también un análisis más enriquecido de las relaciones entre las diferentes variables involucradas.

Este enfoque facilitará una comprensión más profunda de las relaciones entre las variables, ayudando a identificar patrones y tendencias relevantes para el análisis. Las visualizaciones jugarán un papel clave en la representación gráfica de estas relaciones, brindando una forma clara y accesible de explorar los datos y facilitar su comprensión. Todo esto se llevará a cabo utilizando las herramientas R y RStudio, que permitirán una ejecución eficiente y precisa de los cálculos y la creación de gráficos interactivos para una interpretación más completa de los resultados.

Las técnicas y enfoques utilizados en este estudio se basan en diversas fuentes bibliográficas otorgadas por el profesor al iniciar el curso. Entre ellas se incluyen el libro Análisis estadístico de datos multivariados del profesor Luis Guillermo Díaz Monroy de la Universidad Nacional de Colombia. Se hace implementación del libro de Análisis multivariante aplicado con R, de Joaquín Aldás, en su segunda edición, que proporciona herramientas esenciales para realizar análisis avanzados con este software. Se incorpora la obra Estadística aplicada a los negocios y la economía de Lind (15ª edición), y la Probabilidad y estadística para ingeniería industrial de Devore (séptima edición), Referencias clave para guiar y estructurar el enfoque metodológico del estudio.

1.1. Objetivos

El objetivo de este proyecto es aplicar técnicas de análisis multivariado para gestionar el conjunto de datos aprobado, correspondiente a registros medicos relacionados con el trastorno del sueño. El propósito es organizar y procesar eficazmente la información, desarrollando habilidades en la gestión y análisis de datos. Este trabajo se enmarca dentro del curso de Gestión de Datos, dictado por el Profesor Giancarlo Libreros Londoño en la Universidad del Valle.

1.2. Descripción de los datos

Fuente del conjunto de datos :

El conjunto de datos de trabajo se obtuvo casi totalmente de Kaggle: https://www.kaggle.com/akshaydattatraykhare. Es conveniente anotar que Kaggle es una compañía subsidiaria de Google LLC que mantiene una comunidad online de científicos de datos y profesionales del aprendizaje automático. Esta empresa permite a sus usuarios encontrar y publicar conjuntos de datos, explorar y crear modelos en un entorno de ciencia de datos basado en la web, trabajar con otros científicos de datos e ingenieros de aprendizaje automático y participar en concursos para resolver desafíos de ciencia de datos.

Contexto del conjunto de datos :

El conjunto incluye datos personales y medicos basicos obtenidos de personas al azar en un hospital con el fin de identificar superficialmente su estilo de vida y estado de salud .

Descripcion del conjunto de datos :

El conjunto de datos contiene 13 campos y 374 registros. Uno de los campos es simplemente un identificador numérico secuencial de los registros , otro de naturaleza bicotomica , tres de naturaleza politomica y el resto son numéricos estrictamente positivos. La lista siguiente los describe en el mismo orden, de izquierdda a derecha, como aparecen en el rango de datos que los contiene y se establece para cada campo, excepto el campo “Identificacion de persona”, el tipo de variable y su escala de medición con base en la nomenclatura (tipo_de_variable::escala_de_medición[ordenamiento]):

  • Identificacion de persona (identificador): Registra un número secuenciado a partir de 1 para identificar el registro de cada persona consignado en la base datos de forma única.

  • Genero (cualitativa::nominal): Registra el sexo del estudiante del cual se registraron los datos , en el caso de este campo solo toma dos posibles valores, masculino (representado con un 1)o femenino(representado con un 0).

  • Edad (cuantitativa::razon): Registra la edad medida en años de la persona.

  • Ocupacion (cualitativa::nominal): Registra la ocupacion, trabajo u oficio de cada persona.

  • Duracion de sueño (cuantitativa::razon): Registra la cantidad de tiempo medida en horas que duerme diariamente cada persona, para esto se utilizan meramente numeros decimales .

  • Nivel de actividad fisica (cuantitativa::razon): Registra la cantidad de minutos que la persona realiza actividad física diariamente. Medido en minutos.

  • Nivel de estres (cualitativa::ordinal): Registra una calificación subjetiva del nivel de estrés experimentado por la persona, que va del 1 al 10.

  • IMC (cualitativa::nominal): Registra la categoria del IMC de la persona.

  • Presion arterial (cualitativa::nominal): Registra la medición de la presión arterial de la persona, indicada como presión sistólica sobre presión diastólica.

  • Frecuencia cardiaca (cuantitativa::razon): Registra la frecuencia cardíaca en reposo de la persona en latidos por minuto (lpm).

  • Pasos diarios (cuantitativa::razón): Registra la cantidad de pasos que da la persona por día.

  • Transtorno del sueño (Cualitativa::nominal): Registra la presencia o ausencia de un trastorno del sueño en la persona (Ninguno, Insomnio, Apnea del sueño).

Cabe resaltar que en el conjunto no se presentaron espacios vacíos, incoherencias o errores y las variables bicotomicas y tricotomicas fueron reemplazadas por 1 o 2 y 1, 2 o 3 respectivamente .

Estructura del conjunto de datos original

str(cdd_salud_y_estilos_de_vida_base)
## tibble [374 × 13] (S3: tbl_df/tbl/data.frame)
##  $ Id_personal              : num [1:374] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Genero                   : chr [1:374] "Masculino" "Masculino" "Masculino" "Masculino" ...
##  $ Edad                     : num [1:374] 27 28 28 28 28 28 29 29 29 29 ...
##  $ Ocupacion                : chr [1:374] "Ingenierio_de_software" "Doctor" "Doctor" "Representante_en_ventas" ...
##  $ Duracion_de_sueno        : num [1:374] 6.1 6.2 6.2 5.9 5.9 5.9 6.3 7.8 7.8 7.8 ...
##  $ Calidad_de_sueno         : num [1:374] 6 6 6 4 4 4 6 7 7 7 ...
##  $ Nivel_de_actividad_fisica: num [1:374] 42 60 60 30 30 30 40 75 75 75 ...
##  $ Nivel_de_estrés          : num [1:374] 6 8 8 8 8 8 7 6 6 6 ...
##  $ IMC                      : chr [1:374] "Sobrepeso" "Normal" "Normal" "Obesidad" ...
##  $ Presion_arterial         : chr [1:374] "126/83" "125/80" "125/80" "140/90" ...
##  $ Frecuencia_cardiaca      : num [1:374] 77 75 75 85 85 85 82 70 70 70 ...
##  $ Pasos_diarios            : num [1:374] 4200 10000 10000 3000 3000 3000 3500 8000 8000 8000 ...
##  $ Trastorno_del_sueno      : chr [1:374] "Ninguno" "Ninguno" "Ninguno" "Apnea_del_sueno" ...

Conjunto de datos original

cdd_salud_y_estilos_de_vida_base
## # A tibble: 374 × 13
##    Id_personal Genero     Edad Ocupacion      Duracion_de_sueno Calidad_de_sueno
##          <dbl> <chr>     <dbl> <chr>                      <dbl>            <dbl>
##  1           1 Masculino    27 Ingenierio_de…               6.1                6
##  2           2 Masculino    28 Doctor                       6.2                6
##  3           3 Masculino    28 Doctor                       6.2                6
##  4           4 Masculino    28 Representante…               5.9                4
##  5           5 Masculino    28 Representante…               5.9                4
##  6           6 Masculino    28 Ingenierio_de…               5.9                4
##  7           7 Masculino    29 Profesor                     6.3                6
##  8           8 Masculino    29 Doctor                       7.8                7
##  9           9 Masculino    29 Doctor                       7.8                7
## 10          10 Masculino    29 Doctor                       7.8                7
## # ℹ 364 more rows
## # ℹ 7 more variables: Nivel_de_actividad_fisica <dbl>, Nivel_de_estrés <dbl>,
## #   IMC <chr>, Presion_arterial <chr>, Frecuencia_cardiaca <dbl>,
## #   Pasos_diarios <dbl>, Trastorno_del_sueno <chr>

Estructura del conjunto de datos depurado

str(cdd_salud_y_estilos_de_vida_depurado)
## tibble [374 × 14] (S3: tbl_df/tbl/data.frame)
##  $ Id_personal              : num [1:374] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Genero                   : num [1:374] 1 1 1 1 1 1 1 1 1 1 ...
##  $ Edad                     : num [1:374] 27 28 28 28 28 28 29 29 29 29 ...
##  $ Ocupacion                : chr [1:374] "Ingenierio_de_software" "Doctor" "Doctor" "Representante_en_ventas" ...
##  $ Duracion_de_sueno        : num [1:374] 6.1 6.2 6.2 5.9 5.9 5.9 6.3 7.8 7.8 7.8 ...
##  $ Calidad_de_sueno         : num [1:374] 6 6 6 4 4 4 6 7 7 7 ...
##  $ Nivel_de_actividad_fisica: num [1:374] 42 60 60 30 30 30 40 75 75 75 ...
##  $ Nivel_de_estrés          : num [1:374] 6 8 8 8 8 8 7 6 6 6 ...
##  $ IMC                      : num [1:374] 3 1 1 2 2 2 2 1 1 1 ...
##  $ Presion_sistola          : num [1:374] 126 125 125 140 140 140 140 120 120 120 ...
##  $ Presion_diastola         : num [1:374] 83 80 80 90 90 90 90 80 80 80 ...
##  $ Frecuencia_cardiaca      : num [1:374] 77 75 75 85 85 85 82 70 70 70 ...
##  $ Pasos_diarios            : num [1:374] 4200 10000 10000 3000 3000 3000 3500 8000 8000 8000 ...
##  $ Trastorno_del_sueno      : num [1:374] 3 3 3 1 1 2 2 3 3 3 ...

Conjunto de datos depurado

cdd_salud_y_estilos_de_vida_depurado
## # A tibble: 374 × 14
##    Id_personal Genero  Edad Ocupacion         Duracion_de_sueno Calidad_de_sueno
##          <dbl>  <dbl> <dbl> <chr>                         <dbl>            <dbl>
##  1           1      1    27 Ingenierio_de_so…               6.1                6
##  2           2      1    28 Doctor                          6.2                6
##  3           3      1    28 Doctor                          6.2                6
##  4           4      1    28 Representante_en…               5.9                4
##  5           5      1    28 Representante_en…               5.9                4
##  6           6      1    28 Ingenierio_de_so…               5.9                4
##  7           7      1    29 Profesor                        6.3                6
##  8           8      1    29 Doctor                          7.8                7
##  9           9      1    29 Doctor                          7.8                7
## 10          10      1    29 Doctor                          7.8                7
## # ℹ 364 more rows
## # ℹ 8 more variables: Nivel_de_actividad_fisica <dbl>, Nivel_de_estrés <dbl>,
## #   IMC <dbl>, Presion_sistola <dbl>, Presion_diastola <dbl>,
## #   Frecuencia_cardiaca <dbl>, Pasos_diarios <dbl>, Trastorno_del_sueno <dbl>

1.3. Estimaciones multivariadas

Las medidas de media, varianza y covarianza constituyen un conjunto fundamental para describir el comportamiento posicional, dispersivo y correlacional de variables aleatorias. En el contexto de un conjunto de datos que contiene cinco variables aleatorias numéricas y se representa matricialmente, estas medidas se calculan utilizando vectores y matrices en el análisis descriptivo multivariable.

El vector de medias describe el comportamiento posicional de cada variable en relación con todos sus registros, representando el valor esperado o punto medio para cada variable.

La matriz de varianzas-covarianzas proporciona información sobre las dispersiones de cada variable en relación con sus medias. En su diagonal principal, se encuentran las varianzas de cada variable respecto a su media. Por encima o por debajo de la diagonal principal, se encuentran las covarianzas que estiman las relaciones lineales entre todas las combinaciones posibles de pares de variables en el conjunto de datos.

Planteamiento del Problema

Con base en el cojunto de datos mencionado anteriormente lo que se pretendera es calcular e interpretar este conjunto, para las variables estrictamente numéricas, como: el vector de medias, la varianza-covarianza y la matriz de correlacionadas. Para recordar cuales fueron las variables numéricas (con una escala de medición de razón) son: Edad, Duración_del_sueño, Nivel_de_actividad física, Frecuencia_cardíaca y Pasos_diarios.

Desarrollo del Análisis

En base a la navegación de pestañas que nos permite RStudio se calculó los siguientes tres objetos: Vector de Medias, Matriz de Varianzas-Cobarianzas y Matriz de Correlaciones.

Basándonos en la pestaña Vector de Medias, se observa que en general los datos registrados para cada una de las variables tienden a estar bastantes centradas en sus distribuciones, lo que implica que las medias estimadas sean mas o menos semejantes en comparación de la mediana, solo las variables Frecuencia cardíaca y Pasos diarios muestran un sesgo mas notorio en comparación con las demás. También se ha observado que todos los casos atípicos se encuentran en el extremo superior.

Basandonos en la pestaña Matriz de Varianza-Covarianza Se puede interpretar que en general, las relaciones entre las variables tomadas por pares en su mayoría tienden a ser de proporcionalidad directa y en la diagonal de la matriz podemos observar como varian los datos dentro de su propia clasificación.

Basandonos en la pestaña Matriz de Correlaciones y al considerar los resultados de la Matriz de Varianzas-Covarianzas se puede verificar que los coeficientes de correlación son negativos y positivos entre las variables: Edad, Duración del sueño, Nivel de actividad física, Frecuencia cardíaca y Pasos diarios. Estas correlaciones eran de esperarse en el conjunto estudiado dado la posible relación entre cada una.

###Vector de Medias

apply(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,3,4,9,14)], 2, mean)
##         Duracion_de_sueno          Calidad_de_sueno Nivel_de_actividad_fisica 
##                  7.132086                  7.312834                 59.171123 
##           Nivel_de_estrés           Presion_sistola          Presion_diastola 
##                  5.385027                128.553476                 84.649733 
##       Frecuencia_cardiaca             Pasos_diarios 
##                 70.165775               6816.844920
cdd_salud_y_estilos_de_vida_Reducido = cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,3,4,9,14)]
nombres_boxplots <- c("Duracion_de_sueno", "Calidad_del_sueno", "Nivel_de_actividad_fisica", "Nivel_de_estres", "Presion_sistola","Presion_diastola","Frecuencia_cardiaca","Pasos_diarios")
par(mfrow = c(1, ncol(cdd_salud_y_estilos_de_vida_Reducido)))
invisible(lapply(1:ncol(cdd_salud_y_estilos_de_vida_Reducido), function(i) {boxplot(cdd_salud_y_estilos_de_vida_Reducido[, i],main = nombres_boxplots[i])}))

Matriz de Varianzas-Covarianzas

round(cov(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,3,4,9,14)]),2)
##                           Duracion_de_sueno Calidad_de_sueno
## Duracion_de_sueno                      0.63             0.84
## Calidad_de_sueno                       0.84             1.43
## Nivel_de_actividad_fisica              3.52             4.81
## Nivel_de_estrés                       -1.15            -1.91
## Presion_sistola                       -1.11            -1.13
## Presion_diastola                      -0.82            -0.81
## Frecuencia_cardiaca                   -1.70            -3.27
## Pasos_diarios                        -50.89            32.52
##                           Nivel_de_actividad_fisica Nivel_de_estrés
## Duracion_de_sueno                              3.52           -1.15
## Calidad_de_sueno                               4.81           -1.91
## Nivel_de_actividad_fisica                    433.92           -1.26
## Nivel_de_estrés                               -1.26            3.15
## Presion_sistola                               42.84            1.41
## Presion_diastola                              49.11            1.00
## Frecuencia_cardiaca                           11.80            4.92
## Pasos_diarios                              26042.69          536.39
##                           Presion_sistola Presion_diastola Frecuencia_cardiaca
## Duracion_de_sueno                   -1.11            -0.82               -1.70
## Calidad_de_sueno                    -1.13            -0.81               -3.27
## Nivel_de_actividad_fisica           42.84            49.11               11.80
## Nivel_de_estrés                      1.41             1.00                4.92
## Presion_sistola                     60.03            46.45                9.43
## Presion_diastola                    46.45            37.97                6.91
## Frecuencia_cardiaca                  9.43             6.91               17.10
## Pasos_diarios                     1295.48          2412.35             -202.80
##                           Pasos_diarios
## Duracion_de_sueno                -50.89
## Calidad_de_sueno                  32.52
## Nivel_de_actividad_fisica      26042.69
## Nivel_de_estrés                  536.39
## Presion_sistola                 1295.48
## Presion_diastola                2412.35
## Frecuencia_cardiaca             -202.80
## Pasos_diarios                2617651.14

Matriz de Correlaciones

round(cor(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,3,4,9,14)]),3)
##                           Duracion_de_sueno Calidad_de_sueno
## Duracion_de_sueno                     1.000            0.883
## Calidad_de_sueno                      0.883            1.000
## Nivel_de_actividad_fisica             0.212            0.193
## Nivel_de_estrés                      -0.811           -0.899
## Presion_sistola                      -0.180           -0.122
## Presion_diastola                     -0.167           -0.110
## Frecuencia_cardiaca                  -0.516           -0.660
## Pasos_diarios                        -0.040            0.017
##                           Nivel_de_actividad_fisica Nivel_de_estrés
## Duracion_de_sueno                             0.212          -0.811
## Calidad_de_sueno                              0.193          -0.899
## Nivel_de_actividad_fisica                     1.000          -0.034
## Nivel_de_estrés                              -0.034           1.000
## Presion_sistola                               0.265           0.103
## Presion_diastola                              0.383           0.092
## Frecuencia_cardiaca                           0.137           0.670
## Pasos_diarios                                 0.773           0.187
##                           Presion_sistola Presion_diastola Frecuencia_cardiaca
## Duracion_de_sueno                  -0.180           -0.167              -0.516
## Calidad_de_sueno                   -0.122           -0.110              -0.660
## Nivel_de_actividad_fisica           0.265            0.383               0.137
## Nivel_de_estrés                     0.103            0.092               0.670
## Presion_sistola                     1.000            0.973               0.294
## Presion_diastola                    0.973            1.000               0.271
## Frecuencia_cardiaca                 0.294            0.271               1.000
## Pasos_diarios                       0.103            0.242              -0.030
##                           Pasos_diarios
## Duracion_de_sueno                -0.040
## Calidad_de_sueno                  0.017
## Nivel_de_actividad_fisica         0.773
## Nivel_de_estrés                   0.187
## Presion_sistola                   0.103
## Presion_diastola                  0.242
## Frecuencia_cardiaca              -0.030
## Pasos_diarios                     1.000

1.4. Gráficas multivariadas

En el libro se menciona que, en general, los gráficos multivariados cumplen dos objetivos esenciales: primero, ayudan a comparar el comportamiento de poblaciones de estudio con base en variables categóricas y facilitan la comprensión de la estructura de correlación entre varias variables. En este sentido, el conjunto de datos de trabajo tendrá apoyo descriptivo gráfico a través de tres diagramas: uno conjunto que integra dispersión, distribución y correlaciones; otro basado en la renderización de polígonos; y, por último, uno que recurre a las caras de Chernoff.

Con base en el conjunto de datos descrito en la sección 1.2 se calcularán e intepretarán, para las variables numéricas, las gráficas multivariadas de diagrama de correlaciones, matriz de diagrama de dispersión, diagrama de estrellas y caras de Chernoff. Se recuerda que las variables numéricas (en escalada de medición de razón) son: Edad, Duracion_de_sueno, calidad_de_sueno, Nivel_de_actividad_fisica y Nivel_de_estres ,Presion_sistola , Presion_diatola , frecuencia_cardiaca** ,Pasos_diarios.

Diagrama Conjunto de Dispersión, Distribución y Correlaciones [CA:GE]

cdd_salud_y_estilos_de_vida_depurado$Genero <- factor(cdd_salud_y_estilos_de_vida_base$Genero)
levels= c (0,1)
labels= c ( "F" , "M")
ggpairs(cdd_salud_y_estilos_de_vida_depurado, columns = c(3,5,6,7), aes(color = Genero, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

ggpairs(cdd_salud_y_estilos_de_vida_depurado, columns = c(7,8,10,11,12,13), aes(color = Genero, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama de Estrellas

set.seed(120522)
cdd_salud_y_estilos_de_vida_Muestreado = cdd_salud_y_estilos_de_vida_depurado[sample(1:nrow(cdd_salud_y_estilos_de_vida_base),23),-c(1,2,4,9,14)]
stars(cdd_salud_y_estilos_de_vida_Muestreado, len = 1, cex = 0.4, key.loc = c(10, 2), draw.segments = TRUE)

Caras de Chernoff

set.seed(120522)
cdd_salud_y_estilos_de_vida_base = cdd_salud_y_estilos_de_vida_depurado[sample(1:nrow(cdd_salud_y_estilos_de_vida_base),23),-c(1,2,4,9)]
faces(cdd_salud_y_estilos_de_vida_base)

## effect of variables:
##  modified item       Var                        
##  "height of face   " "Edad"                     
##  "width of face    " "Duracion_de_sueno"        
##  "structure of face" "Calidad_de_sueno"         
##  "height of mouth  " "Nivel_de_actividad_fisica"
##  "width of mouth   " "Nivel_de_estrés"          
##  "smiling          " "Presion_sistola"          
##  "height of eyes   " "Presion_diastola"         
##  "width of eyes    " "Frecuencia_cardiaca"      
##  "height of hair   " "Pasos_diarios"            
##  "width of hair   "  "Trastorno_del_sueno"      
##  "style of hair   "  "Edad"                     
##  "height of nose  "  "Duracion_de_sueno"        
##  "width of nose   "  "Calidad_de_sueno"         
##  "width of ear    "  "Nivel_de_actividad_fisica"
##  "height of ear   "  "Nivel_de_estrés"

1.5. Normalidad multivariada

Para investigar o determinar el tipo de distribución multivariada de un conjunto de datos, se pueden utilizar procedimientos descriptivos, como gráficos, o procedimientos inferenciales, como pruebas estadísticas. En este contexto, se logra una generalización de resultados al emplear estos últimos, aunque los primeros respaldan las interpretaciones.

En esta sección se considera el uso de procedimientos inferenciales para determinar si el conjunto de datos con respecto a sus variables numéricas, sigue una distribución normal multivariada (DNM). Se aplicarán pruebas de normalidad multivariada (PNM) que incluyen las pruebas de Mardia, Henze-Zirkler, Doornik-Hansen y Royston. Estas pruebas de normalidad se llevarán a cabo con un nivel de significancia \(\alpha = 0.05\) y bajo las siguientes hipótesis:\[H_0: \text {El conjunto de datos sigue una distribución normal multivariada.}\] \[H_1: \text {El conjunto de datos NO sigue una distribución normal multivariada.}\]

La prueba de Mardia se fundamenta en extensiones de asimetría y curtosis, el cuadrado de la distancia de Mahalanobis, la cantidad de variables \(p\) en análisis y la cantidad de registros \(n\). En este contexto, la prueba estadística para la asimetría sigue una distribución \(\chi^2\), mientras que la prueba estadística para la curtosis se aproxima a una distribución normal.

La prueba de Henze-Zirkler se fundamenta en la distancia funcional. Si el conjunto de datos sigue una distribución normal multivariada, el estadístico de la prueba se distribuye aproximadamente como una log-normal, con parámetros de media \(\mu\) y varianza \(\sigma^2\).

La prueba de Doornik-Hansen se basa en la asimetría y la curtosis de un conjunto de datos multivariados, los cuales se transforman para asegurar la independencia. Esta prueba se considera más potente que la prueba de Shapiro-Wilk en casos multivariados. El estadístico de prueba está definido como la suma de las transformaciones al cuadrado de la asimetría y la curtosis, y sigue aproximadamente una distribución \(\chi^2\).

La prueba de Royston utiliza las pruebas de Shapiro-Wilk o Shapiro-Francia para evaluar la normalidad multivariada. Si la curtosis es mayor que 3, la prueba de Royston emplea Shapiro-Francia para distribuciones leptocúrticas. Por otro lado, para distribuciones platicúrticas utiliza Shapiro-Wilk. En esta prueba, los parámetros son obtenidos mediante aproximaciones polinomiales.

Planteamiento del Problema

Con base en el conjunto de datos descrito en la fase 1 sección 1.2, se realizará una prueba estadística de normalidad multivariada con un nivel de significancia \(\alpha=0.05\), para determinar si los datos métricos provienen de una población normal multivariada. Las variables numéricas del conjunto de datos (en escala de medición de razón) son: Edad, Duracion_del_sueno, Nivel_de_actividad_fisica, Frecuencia_cardiaca y Pasos_diarios.

Se utilizará una de las pruebas de normalidad multivariada mencionadas anteriormente, como la prueba de Mardia, Henze-Zirkler, Doornik-Hansen o Royston, dependiendo de la distribución de las variables y la curtosis observada. El objetivo es evaluar si estas variables siguen una distribución normal conjunta en el espacio multivariado.

El procedimiento implicará calcular el estadístico de prueba específico (por ejemplo, basado en asimetría y curtosis) y compararlo con su distribución teórica bajo la hipótesis nula de normalidad multivariada. Se establecerá un criterio de rechazo de la hipótesis nula si el valor \(p-value\) asociado al estadístico de prueba es menor que \(\alpha\).

Una conclusión positiva (no rechazo de la hipótesis nula) indicaría evidencia de que las variables analizadas siguen una distribución normal multivariada. Por el contrario, un rechazo de la hipótesis nula sugeriría que al menos una de las variables no sigue una distribución normal, lo que podría tener implicaciones en el análisis posterior de los datos.

Desarrollo del Análisis

La exploración a través de las diferentes pruebas de normalidad multivariada indica que el conjunto de datos, considerando sus variables numéricas, no sigue una distribución normal multivariada. Aquí están los hallazgos clave de cada prueba:

  • Prueba de Mardia: Los valores \(p\) asociados con las pruebas de asimetría (Skewness) y curtosis (Kurtosis) son menores que el nivel de significancia \(\alpha = 0.05\). Esto sugiere que no hay suficiente evidencia para sostener la hipótesis de normalidad multivariada para las variables del conjunto de datos.

  • Prueba de Henze-Zirkler: El estadístico de prueba no se distribuye aproximadamente como log-normal, ya que el valor \(p\) es menor que \(\alpha = 0.05\). Por lo tanto, no hay apoyo para que el conjunto de datos siga una distribución normal multivariada según esta prueba.

  • Prueba de Doornik-Hansen: El estadístico de prueba no sigue una distribución \(\chi^2\) aproximadamente, dado que el valor \(p\) es menor que \(\alpha = 0.05\). Esto sugiere que las evidencias no respaldan la normalidad multivariada del conjunto de datos.

  • Prueba de Royston: El conjunto de datos, reducido a sus variables numéricas, no sigue una distribución normal multivariada según esta prueba, ya que el valor \(p\) es menor que \(\alpha = 0.05\).

En resumen, con un nivel de significancia de \(0.05\), las pruebas indican consistentemente que el conjunto de datos analizado, con respecto a sus variables numéricas, no sigue una distribución normal multivariada esto lo sabemos ya que todos los resultados son menores al nivel de significancia lo cual hace que este hallazgo esa importante para la interpretación y el análisis subsiguiente de los datos.

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

#mvn(cdd_salud_y_estilos_de_vida[,-c(1,3,4,9,14)], mvnTest="mardia")

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

PNM Henze-Zirkler

#mvn(cdd_salud_y_estilos_de_vida[,-c(1,3,4,9,14)], mvnTest="hz")

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

PNM Doornik-Hansen

#mvn(cdd_salud_y_estilos_de_vida[,-c(1,3,4,9,14)], mvnTest="dh")

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

PNM Royston

#mvn(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)], mvnTest="royston")

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Fase 2 [Componentes Principales]

En términos generales, esta segunda etapa de estudio mostrará cálculos, visualizaciones e interpretaciones con base en el conjunto de datos tratado en la fase 1, pero ahora desde un enfoque de análisis de componentes principales sobre las variables cuantitativas, que incluirá: selección, calidad de representación, contribuciones e interpretación.

Recuérdese que el conjunto de datos de trabajo es descrito en la sección 2 y los referentes teóricos en la sección 1.

Por último, este trabajo fue procesado con r R.version.string mediado por RStudio 2022.12.0 Build 353 en una plataforma x86_64-w64-mingw32. Además, por su naturaleza de publicación en línea y para cumplir con el requisito temporal de entrega, será actualizado, como máximo, hasta las 11:59 p.m. del domingo 26 de febrero de 2023.

2.1. Objetivos

2.2. Selección de Componentes

Como es mencionado en el trabajo de (Díaz Morales & Morales Rivera, 2012) el Análisis de Componentes Principales (en adelante ACP) reestructura un conjunto de datos multivariado a través de la reducción de la cantidad de sus variables, en cuyo transfondo es innecesario asumir ninguna distribución de probabilidad de ellas. Esta reducción es lograda a través de combinaciones lineales de las variables originales, que deberán contener la mayor variabilidad posible presente en el conjunto de datos. En este sentido, el ACP logra crear nuevas variables, conocidas como componentes principales, que poseen características estadísticas de independencia (con base en el supuesto de normalidad) y no correlación.

El ACP se logra a lo largo de las siguientes fases: generación de nuevas variables, reducción dimensional del espacio de los datos, eliminación de varaibles de poco aporte e interpretación de los componentes resultantes en el contexto del problema del cual se obtuvieron los datos. Estas fases se desarrollan entre las secciones 7, 8, 9 y 10.

La Matriz ACP muestra seis dimensiones donde solo la primera retiene el \(77.05\) \(\%\), la siguiente el \(10.33\) \(\%\) y las demás solo porcentajes con parte entera de una cifra. En este sentido, la representatividad de la combinación lineal que define a la dimensión 1 es significativamente alta en comparación con las demás. Como esta matriz es muda en relación con las variables originales se sigue indagando la identificación de las variables que más contribuyan a la dimensión de valor propio más alto.

La Matriz de Correlaciones permite continuar con las descripciones de las combinaciones lineales que conforman a la dimensión de mayor interés: la dimensión 1. Así, esta matriz, como se mostró en la sección 3.2., ayuda a verificar que la intensidad de las corelaciones es más alta y siempre positiva entre las variables: TOEFL_Score, GRE_Score, CGPA y Chance_of_Admit, asunto esperado en relación con el fenómeno estudiado, por lo tanto, se podría esperar que estas variables participaran en la combinación lineal que define a la dimensión 1.

La pestaña de Valores y Vectores Propios muestra estos objetos calculados a partir de la matriz de correlaciones del conjunto de datos. En este sentido, se garantiza que la suma de los valores propios sea igual a la dimensión de dicha matriz y a la variabilidad total del conjunto, por lo cual las proporciones de retención de variabilidad son de cálculo inmediato. Además, la matriz de vectores propios define para cada componente, en relación con cada variable del conjunto de datos, los coeficientes de la combinación lineal que la conforman, por ejemplo, con un ajuste a dos cifras decimales, la componente 1 estaría representada por la combinación lineal (donde \(G\) es GRE_Score, \(T\) es TOEFL_Score, \(S\) es SOP, \(L\) es LOR, \(CG\) es CGPA y \(CA\) es Chance_of_Admit y además, son variables estandarizadas):\[Componente_1 = 0.41*G+0.42*T+0.39*S+0.37*L+0.44*CG+0.43*CA\]Hasta este punto, se puede observar que se dispone de un número de dimensiones igual al número de variables tratadas, con la salvedad que las variables nuevas son incorreladas entre sí, ver la pestaña Correlaciones Comparadas.

Por último, el Gráfico de Cattell y el Gráfico de Cattell-Kaiser, de codo y sedimentación, inducen a la elección de una componente en la reducción de dimensión que retiene la cantidad de variabilidad suficiente para tratar el problema. Sin embargo, debe resaltarse que se propone elegir con base en criterios más usados, a cambio de criterios de aceptación universal. El Gráfico de Cattell** muestra que los cambios en la pendiente indican que la capacidad explicativa de la dimensión 1 es alta comparada con el resto. Así, el de Cattell-Kaiser al conjugar el instrumento gráfico anterior con el criterio de Kaiser en la misma gráfica apoya que la cantidad de dimensiones suficientes por retener es una, aclarando que esta elección retenga un porcentaje de variabilidad adecuado para estudiar el problema.

Matriz ACP

get_eigenvalue(PCA(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)], ncp = 6, scale.unit = TRUE, graph = F))
##       eigenvalue variance.percent cumulative.variance.percent
## Dim.1 3.50438335       38.9375927                    38.93759
## Dim.2 2.78774981       30.9749979                    69.91259
## Dim.3 1.55048067       17.2275630                    87.14015
## Dim.4 0.60364551        6.7071724                    93.84733
## Dim.5 0.26733259        2.9703621                    96.81769
## Dim.6 0.13504777        1.5005308                    98.31822
## Dim.7 0.08029490        0.8921656                    99.21038
## Dim.8 0.05798295        0.6442550                    99.85464
## Dim.9 0.01308244        0.1453605                   100.00000

Matriz de Correlaciones

round(cor(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)]),3)
##                             Edad Duracion_de_sueno Calidad_de_sueno
## Edad                       1.000             0.345            0.474
## Duracion_de_sueno          0.345             1.000            0.883
## Calidad_de_sueno           0.474             0.883            1.000
## Nivel_de_actividad_fisica  0.179             0.212            0.193
## Nivel_de_estrés           -0.422            -0.811           -0.899
## Presion_sistola            0.606            -0.180           -0.122
## Presion_diastola           0.594            -0.167           -0.110
## Frecuencia_cardiaca       -0.226            -0.516           -0.660
## Pasos_diarios              0.058            -0.040            0.017
##                           Nivel_de_actividad_fisica Nivel_de_estrés
## Edad                                          0.179          -0.422
## Duracion_de_sueno                             0.212          -0.811
## Calidad_de_sueno                              0.193          -0.899
## Nivel_de_actividad_fisica                     1.000          -0.034
## Nivel_de_estrés                              -0.034           1.000
## Presion_sistola                               0.265           0.103
## Presion_diastola                              0.383           0.092
## Frecuencia_cardiaca                           0.137           0.670
## Pasos_diarios                                 0.773           0.187
##                           Presion_sistola Presion_diastola Frecuencia_cardiaca
## Edad                                0.606            0.594              -0.226
## Duracion_de_sueno                  -0.180           -0.167              -0.516
## Calidad_de_sueno                   -0.122           -0.110              -0.660
## Nivel_de_actividad_fisica           0.265            0.383               0.137
## Nivel_de_estrés                     0.103            0.092               0.670
## Presion_sistola                     1.000            0.973               0.294
## Presion_diastola                    0.973            1.000               0.271
## Frecuencia_cardiaca                 0.294            0.271               1.000
## Pasos_diarios                       0.103            0.242              -0.030
##                           Pasos_diarios
## Edad                              0.058
## Duracion_de_sueno                -0.040
## Calidad_de_sueno                  0.017
## Nivel_de_actividad_fisica         0.773
## Nivel_de_estrés                   0.187
## Presion_sistola                   0.103
## Presion_diastola                  0.242
## Frecuencia_cardiaca              -0.030
## Pasos_diarios                     1.000

Valores y Vectores Propios

princomp(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)], cor = TRUE)$sdev^2
##     Comp.1     Comp.2     Comp.3     Comp.4     Comp.5     Comp.6     Comp.7 
## 3.50438335 2.78774981 1.55048067 0.60364551 0.26733259 0.13504777 0.08029490 
##     Comp.8     Comp.9 
## 0.05798295 0.01308244
princomp(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)], cor = TRUE)$loadings[ ,1:6]
##                                Comp.1      Comp.2      Comp.3      Comp.4
## Edad                       0.23986393  0.41860959  0.29427876  0.16383455
## Duracion_de_sueno          0.48092376  0.01724373 -0.07598034 -0.41950211
## Calidad_de_sueno           0.51625981  0.05846865 -0.04254804 -0.11432066
## Nivel_de_actividad_fisica  0.04675612  0.37718750 -0.56981635 -0.28981872
## Nivel_de_estrés           -0.50219582 -0.01361644 -0.11199340  0.10709399
## Presion_sistola           -0.10462233  0.52834076  0.30825459  0.01533943
## Presion_diastola          -0.09715366  0.55601639  0.20167395  0.05477607
## Frecuencia_cardiaca       -0.41104886  0.11091454  0.02381525 -0.74596023
## Pasos_diarios             -0.03034531  0.27927412 -0.65751276  0.35909694
##                                Comp.5      Comp.6
## Edad                       0.75271176  0.15377282
## Duracion_de_sueno          0.04120430 -0.71198117
## Calidad_de_sueno           0.06112415  0.11759629
## Nivel_de_actividad_fisica -0.12835229  0.24505206
## Nivel_de_estrés            0.34107007 -0.55491502
## Presion_sistola           -0.28804100 -0.18281298
## Presion_diastola          -0.33684001 -0.10657219
## Frecuencia_cardiaca        0.27455686  0.18831766
## Pasos_diarios              0.15289758 -0.08593542

Correlaciones Comparadas

par(mfrow=c(1,2))
corrplot::corrplot(cor(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)]), method = "color", type = "upper", number.cex = 0.4)
corrplot::corrplot(cor(princomp(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)], cor = TRUE)$scores), method = "color", type = "upper", number.cex = 0.4)

Gráfico de Cattell

#fviz_eig(PCA(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)], scale.unit = T, graph = F), addlabels = T, ylim=c(0,90), main = "")

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Gráfico de Cattell-Kaiser

scree(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)],factors = FALSE, pc = TRUE, main ="")

2.3. Calidad de Representación

Círculo de Correlaciones

#fviz_pca_var(PCA(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)], scale.unit = T, graph = F),col.var="#3B83BD", repel = T, col.circle = "#CDCDCD", ggtheme = theme_bw())

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Matriz de Representación

(get_pca_var(PCA(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)], ncp = 6, scale.unit = TRUE, graph = F)))$cos2
##                                 Dim.1        Dim.2       Dim.3        Dim.4
## Edad                      0.201623662 0.4885085236 0.134271609 0.0162029081
## Duracion_de_sueno         0.810520630 0.0008289271 0.008950945 0.1062307573
## Calidad_de_sueno          0.934002948 0.0095301541 0.002806890 0.0078891719
## Nivel_de_actividad_fisica 0.007661055 0.3966143155 0.503426606 0.0507031402
## Nivel_de_estrés           0.883807725 0.0005168696 0.019446937 0.0069232843
## Presion_sistola           0.038358389 0.7781835271 0.147328060 0.0001420366
## Presion_diastola          0.033077289 0.8618446479 0.063061744 0.0018111891
## Frecuencia_cardiaca       0.592104680 0.0342949988 0.000879380 0.3359025670
## Pasos_diarios             0.003226968 0.2174278495 0.670308500 0.0778404574
##                                  Dim.5        Dim.6
## Edad                      0.1514639570 0.0031933507
## Duracion_de_sueno         0.0004538757 0.0684580377
## Calidad_de_sueno          0.0009987978 0.0018675606
## Nivel_de_actividad_fisica 0.0044041201 0.0081096878
## Nivel_de_estrés           0.0310984775 0.0415853534
## Presion_sistola           0.0221799484 0.0045133755
## Presion_diastola          0.0303318732 0.0015338230
## Frecuencia_cardiaca       0.0201519231 0.0047892722
## Pasos_diarios             0.0062496133 0.0009973137

Calidad de Representación

#fviz_pca_var(PCA(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)], ncp = 6, scale.unit = TRUE, graph = F), col.var="cos2", gradient.cols=c("#00AFBB","#E7B800","#FC4E07"), repel = TRUE)

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Coordenadas Individuales

head((PCA(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)], ncp = 6, scale.unit = TRUE, graph = F))$ind$coord, n = 23L)
##          Dim.1       Dim.2      Dim.3      Dim.4       Dim.5        Dim.6
## 1  -2.39548421 -1.72873641 -1.0095042  1.1760799 -0.82387859 -0.670906892
## 2  -2.68256797 -0.75780765  2.0954578 -0.2817105  0.15941875  0.139256384
## 3  -2.68256797 -0.75780765  2.0954578 -0.2817105  0.15941875  0.139256384
## 4  -5.01982282 -0.41964203 -2.6577014  2.1937980 -0.87674106  0.119915863
## 5  -5.01982282 -0.41964203 -2.6577014  2.1937980 -0.87674106  0.119915863
## 6  -5.01982282 -0.41964203 -2.6577014  2.1937980 -0.87674106  0.119915863
## 7  -3.29121513 -0.06994949 -2.1507556  2.1241192 -1.07310076 -0.003726442
## 8  -0.05132819 -1.15987207  1.9486876  0.5209025 -0.43255826  0.657299028
## 9  -0.05132819 -1.15987207  1.9486876  0.5209025 -0.43255826  0.657299028
## 10 -0.05132819 -1.15987207  1.9486876  0.5209025 -0.43255826  0.657299028
## 11 -2.18003914 -2.07696020  0.6443268 -1.2200300  0.09071983  0.388767055
## 12 -0.05132819 -1.15987207  1.9486876  0.5209025 -0.43255826  0.657299028
## 13 -2.18003914 -2.07696020  0.6443268 -1.2200300  0.09071983  0.388767055
## 14 -2.24056373 -2.07913033  0.6347647 -1.2728247  0.08553424  0.299163725
## 15 -2.24056373 -2.07913033  0.6347647 -1.2728247  0.08553424  0.299163725
## 16 -2.24056373 -2.07913033  0.6347647 -1.2728247  0.08553424  0.299163725
## 17 -3.25686230 -0.89913617 -1.5351980  1.7042846 -0.73747680  0.150675974
## 18 -2.24056373 -2.07913033  0.6347647 -1.2728247  0.08553424  0.299163725
## 19 -3.25686230 -0.89913617 -1.5351980  1.7042846 -0.73747680  0.150675974
## 20 -0.14468436 -1.11588260  1.8955879  0.3963981 -0.35602658  0.460338828
## 21 -0.08415977 -1.11371246  1.9051501  0.4491927 -0.35084099  0.549942158
## 22 -0.08415977 -1.11371246  1.9051501  0.4491927 -0.35084099  0.549942158
## 23 -0.08415977 -1.11371246  1.9051501  0.4491927 -0.35084099  0.549942158

2.4. Contribuciones

Matriz de Contribuciones

(get_pca_var(PCA(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)], ncp = 5, scale.unit = TRUE, graph = F)))$contrib
##                                 Dim.1       Dim.2      Dim.3      Dim.4
## Edad                       5.75347048 17.52339902  8.6599989  2.6841760
## Duracion_de_sueno         23.12876616  0.02973463  0.5773013 17.5982021
## Calidad_de_sueno          26.65241944  0.34185830  0.1810336  1.3069213
## Nivel_de_actividad_fisica  0.21861351 14.22704124 32.4690669  8.3994893
## Nivel_de_estrés           25.22006406  0.01854075  1.2542522  1.1469123
## Presion_sistola            1.09458314 27.91439617  9.5020894  0.0235298
## Presion_diastola           0.94388330 30.91542303  4.0672383  0.3000418
## Frecuencia_cardiaca       16.89611613  1.23020361  0.0567166 55.6456663
## Pasos_diarios              0.09208377  7.79940325 43.2323029 12.8950611
##                                Dim.5
## Edad                      56.6574989
## Duracion_de_sueno          0.1697794
## Calidad_de_sueno           0.3736162
## Nivel_de_actividad_fisica  1.6474311
## Nivel_de_estrés           11.6328795
## Presion_sistola            8.2967620
## Presion_diastola          11.3461189
## Frecuencia_cardiaca        7.5381469
## Pasos_diarios              2.3377671

Biplot de Variables y Registros [Total G]

#data_UR <- cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)]
#data_All <- cbind(data_UR, Genero = cdd_salud_y_estilos_de_vida_depurado$Genero)
#data_All$Genero <- as.factor(data_All$Genero)
#levels(data_All$Genero) <- c("Femenino", "Masculino")
#res.pca <- PCA(data_All, ncp = 6, scale.unit = FALSE,quali.sup = ncol(data_All))
#fviz_pca_biplot(res.pca, axes = c(1, 2), repel = TRUE, habillage = ncol(data_All))        

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Biplot de Variables y Registros [filtro:Genero]

#cdd_salud_y_estilos_de_vida_depurado <- read_excel("C:/Gestion de datos [G8]/cdd_salud_y_estilos_de_vida_depurado.xlsx")

#set.seed(288966)
#cdd_salud_y_estilos_de_vida_depurado[sample(1:nrow(cdd_salud_y_estilos_de_vida_depurado),100),-c(1,2,4,9,14)]
#cdd_salud_y_estilos_de_vida_depurado$Genero <- factor(cdd_salud_y_estilos_de_vida_depurado$Genero, levels = c(0, 1), labels = c("Femenino", "Masculino"))
#cdd_salud_y_estilos_de_vida_depurado$Genero <- as.factor(cdd_salud_y_estilos_de_vida_depurado$Genero)
#fviz_pca_biplot(PCA(cdd_salud_y_estilos_de_vida_depurado[,], ncp = 5, scale.unit = TRUE, graph = F, quali.sup = "Genero"), axes = c(1, 2), repel = TRUE, habillage = "Genero")

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Contribuciones a D1

#fviz_contrib(PCA(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 1, top = 10)

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Contribuciones a D2

#fviz_contrib(PCA(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 2, top = 10)

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Contribuciones a D3

#fviz_contrib(PCA(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 3, top = 10)

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Contribuciones a D4

#fviz_contrib(PCA(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 4, top = 10)

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Contribuciones a D5

#fviz_contrib(PCA(cdd_salud_y_estilos_de_vida_depurado[,-c(1,2,4,9,14)], ncp = 6, scale.unit = TRUE, graph = F), choice = "var", axes = 5, top = 10)

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Fase 3 [Correspondencias]

3.1. Objetivos

Explorar y visualizar las relaciones entre categorías de dos variables cualitativas representadas en una tabla de contingencia. Este método permite simplificar datos complejos mediante la reducción de dimensionalidad, facilitando la identificación de patrones, asociaciones y similitudes entre las categorías. Además, genera representaciones gráficas que muestran las relaciones en un espacio de menor dimensión, usualmente en dos ejes, lo que ayuda a interpretar las conexiones y proximidades entre filas y columnas de manera clara y descriptiva. Es una herramienta valiosa para el análisis exploratorio de datos cualitativos antes de aplicar métodos más específicos.

3.2. Correspondencias Simples

Las correspondencias simples son una técnica de análisis multivariado que permite estudiar la relación entre dos variables categóricas a través de una tabla de contingencia. Este método busca identificar patrones de asociación y las interacciones subyacentes entre las categorías de ambas variables, transformando los datos originales en un espacio geométrico donde las filas y columnas se representan como puntos. Esto facilita la interpretación visual y cuantitativa de las relaciones entre categorías.

En este análisis, cada fila y cada columna de la tabla se proyectan en un sistema de ejes principales que resumen la mayor parte de la variabilidad en los datos. Las distancias entre puntos en este espacio representan similitudes o diferencias en las distribuciones de las categorías. Por ejemplo, filas (categorías de la primera variable) cercanas a columnas (categorías de la segunda variable) indican una asociación fuerte entre dichas categorías. Este enfoque es útil para identificar patrones clave que pueden no ser evidentes a simple vista en los datos tabulares.

Las correspondencias simples permiten reducir la complejidad de los datos categóricos, proporcionando una representación gráfica y numérica de las asociaciones. Esto facilita la toma de decisiones informadas y el entendimiento de las relaciones entre variables en contextos como encuestas, estudios de mercado o análisis sociales, donde es esencial comprender cómo se vinculan las diferentes categorías de interés.

analisis de correspondencias

El análisis de correspondencia de un conjunto de datos revela las relaciones y asociaciones entre categorías de variables categóricas, representadas en una tabla de contingencia. Proyecta estas relaciones en un espacio de baja dimensión, donde filas y columnas se muestran como puntos, y sus posiciones reflejan similitudes o asociaciones.

Contingencias
addmargins(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés, cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno))
##      
##         4   5   6   7   8   9 Sum
##   3     0   0   0   0   2  69  71
##   4     0   0   0  25  43   2  70
##   5     0   0   0   7  60   0  67
##   6     0   0   4  38   4   0  46
##   7     0   7  36   7   0   0  50
##   8     5   0  65   0   0   0  70
##   Sum   5   7 105  77 109  71 374
addmargins(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica, cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios))
##      
##       3000 3300 3500 3700 4000 4100 4200 4800 5000 5200 5500 5600 6000 6200
##   30     3    0    0    0    0    0    0    0   57    0    0    0    2    0
##   32     0    0    0    0    0    0    0    0    0    2    0    0    0    0
##   35     0    0    0    0    0    2    0    2    0    0    0    0    0    0
##   40     0    0    1    0    3    0    0    0    0    0    0    2    0    0
##   42     0    0    0    0    0    0    2    0    0    0    0    0    0    0
##   45     0    0    0    0    0    0    0    0    3    0    0    0   63    0
##   47     0    0    0    0    0    0    0    0    0    0    0    0    0    0
##   50     0    0    0    0    0    0    0    0    0    0    3    0    0    0
##   55     0    0    0    0    0    0    0    0    0    0    1    0    3    0
##   60     0    2    0    0    0    0    0    0    6    0    0    0    0    0
##   65     0    0    2    0    0    0    0    0    0    0    0    0    0    0
##   70     0    0    0    0    0    0    0    0    0    0    0    0    0    1
##   75     0    0    0    0    0    0    0    0    2    0    0    0    0    0
##   80     0    0    0    0    0    0    0    0    0    0    0    0    0    0
##   85     0    0    0    2    0    0    0    0    0    0    0    0    0    0
##   90     0    0    0    0    0    0    0    0    0    0    0    0    0    0
##   Sum    3    2    3    2    3    2    2    2   68    2    4    2   68    1
##      
##       6800 7000 7300 7500 8000 10000 Sum
##   30     0    0    0    0    6     0  68
##   32     0    0    0    0    0     0   2
##   35     0    0    0    0    0     0   4
##   40     0    0    0    0    0     0   6
##   42     0    0    0    0    0     0   2
##   45     0    0    0    0    2     0  68
##   47     1    0    0    0    0     0   1
##   50     0    1    0    0    0     0   4
##   55     0    0    2    0    0     0   6
##   60     0   32    0    0   28     2  70
##   65     0    0    0    0    0     0   2
##   70     0    2    0    0    0     0   3
##   75     2   31    0    0   32     0  67
##   80     0    0    0    2    0     0   2
##   85     0    0    0    0    0     0   2
##   90     0    0    0    0   33    34  67
##   Sum    3   66    2    2  101    36 374
addmargins(table(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola, cdd_salud_y_estilos_de_vida_depurado$Presion_diastola))
##      
##        75  76  77  78  79  80  82  83  84  85  86  87  88  90  91  92  95 Sum
##   115  32   0   0   2   0   0   0   0   0   0   0   0   0   0   0   0   0  34
##   117   0   2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   2
##   118   2   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   3
##   119   0   0   2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   2
##   120   0   0   0   0   0  45   0   0   0   0   0   0   0   0   0   0   0  45
##   121   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   1
##   122   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   1
##   125   0   0   0   0   0  65   4   0   0   0   0   0   0   0   0   0   0  69
##   126   0   0   0   0   0   0   0   2   0   0   0   0   0   0   0   0   0   2
##   128   0   0   0   0   0   0   0   0   2   3   0   0   0   0   0   0   0   5
##   129   0   0   0   0   0   0   0   0   2   0   0   0   0   0   0   0   0   2
##   130   0   0   0   0   0   0   0   0   0  99   2   0   0   0   0   0   0 101
##   131   0   0   0   0   0   0   0   0   0   0   2   0   0   0   0   0   0   2
##   132   0   0   0   0   0   0   0   0   0   0   0   3   0   0   0   0   0   3
##   135   0   0   0   0   0   0   0   0   0   0   0   0   2  27   0   0   0  29
##   139   0   0   0   0   0   0   0   0   0   0   0   0   0   0   2   0   0   2
##   140   0   0   0   0   0   0   0   0   0   0   0   0   0   4   0   0  65  69
##   142   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   2   0   2
##   Sum  34   3   2   2   1 111   4   2   4 102   4   3   2  31   2   2  65 374
Probabilidades
addmargins(prop.table(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés, cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno))*100)
##      
##                 4           5           6           7           8           9
##   3     0.0000000   0.0000000   0.0000000   0.0000000   0.5347594  18.4491979
##   4     0.0000000   0.0000000   0.0000000   6.6844920  11.4973262   0.5347594
##   5     0.0000000   0.0000000   0.0000000   1.8716578  16.0427807   0.0000000
##   6     0.0000000   0.0000000   1.0695187  10.1604278   1.0695187   0.0000000
##   7     0.0000000   1.8716578   9.6256684   1.8716578   0.0000000   0.0000000
##   8     1.3368984   0.0000000  17.3796791   0.0000000   0.0000000   0.0000000
##   Sum   1.3368984   1.8716578  28.0748663  20.5882353  29.1443850  18.9839572
##      
##               Sum
##   3    18.9839572
##   4    18.7165775
##   5    17.9144385
##   6    12.2994652
##   7    13.3689840
##   8    18.7165775
##   Sum 100.0000000
addmargins(prop.table(table(cdd_salud_y_estilos_de_vida_depurado$Ocupacion, cdd_salud_y_estilos_de_vida_depurado$Trastorno_del_sueno))*100)
##                          
##                                     1           2           3         Sum
##   Abogado                   0.8021390   0.5347594  11.2299465  12.5668449
##   Cientifico                0.5347594   0.0000000   0.5347594   1.0695187
##   Contador                  0.0000000   1.8716578   8.0213904   9.8930481
##   Doctor                    1.0695187   0.8021390  17.1122995  18.9839572
##   Enfermera                16.3101604   0.8021390   2.4064171  19.5187166
##   Gerente                   0.0000000   0.0000000   0.2673797   0.2673797
##   Ingenierio_de_software    0.0000000   0.2673797   0.8021390   1.0695187
##   Ingeniero                 0.2673797   1.3368984  15.2406417  16.8449198
##   Profesor                  1.0695187   7.2192513   2.4064171  10.6951872
##   Representante_en_ventas   0.5347594   0.0000000   0.0000000   0.5347594
##   Vendedor                  0.2673797   7.7540107   0.5347594   8.5561497
##   Sum                      20.8556150  20.5882353  58.5561497 100.0000000
addmargins(prop.table(table(cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno, cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno))*100)
##      
##                 4           5           6           7           8           9
##   5.8   0.5347594   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
##   5.9   0.8021390   0.0000000   0.2673797   0.0000000   0.0000000   0.0000000
##   6     0.0000000   0.0000000   8.2887701   0.0000000   0.0000000   0.0000000
##   6.1   0.0000000   0.0000000   6.6844920   0.0000000   0.0000000   0.0000000
##   6.2   0.0000000   0.0000000   3.2085561   0.0000000   0.0000000   0.0000000
##   6.3   0.0000000   0.0000000   3.4759358   0.0000000   0.0000000   0.0000000
##   6.4   0.0000000   0.5347594   1.8716578   0.0000000   0.0000000   0.0000000
##   6.5   0.0000000   0.8021390   3.4759358   2.6737968   0.0000000   0.0000000
##   6.6   0.0000000   0.5347594   0.0000000   4.8128342   0.0000000   0.0000000
##   6.7   0.0000000   0.0000000   0.0000000   1.3368984   0.0000000   0.0000000
##   6.8   0.0000000   0.0000000   0.5347594   0.8021390   0.0000000   0.0000000
##   6.9   0.0000000   0.0000000   0.2673797   0.5347594   0.0000000   0.0000000
##   7.1   0.0000000   0.0000000   0.0000000   0.8021390   4.2780749   0.0000000
##   7.2   0.0000000   0.0000000   0.0000000   0.0000000   9.6256684   0.0000000
##   7.3   0.0000000   0.0000000   0.0000000   0.5347594   3.2085561   0.0000000
##   7.4   0.0000000   0.0000000   0.0000000   0.5347594   0.8021390   0.0000000
##   7.5   0.0000000   0.0000000   0.0000000   0.0000000   1.3368984   0.0000000
##   7.6   0.0000000   0.0000000   0.0000000   1.3368984   1.3368984   0.0000000
##   7.7   0.0000000   0.0000000   0.0000000   3.7433155   2.6737968   0.0000000
##   7.8   0.0000000   0.0000000   0.0000000   2.4064171   5.0802139   0.0000000
##   7.9   0.0000000   0.0000000   0.0000000   1.0695187   0.8021390   0.0000000
##   8     0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   3.4759358
##   8.1   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   4.0106952
##   8.2   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   2.9411765
##   8.3   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   1.3368984
##   8.4   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   3.7433155
##   8.5   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000   3.4759358
##   Sum   1.3368984   1.8716578  28.0748663  20.5882353  29.1443850  18.9839572
##      
##               Sum
##   5.8   0.5347594
##   5.9   1.0695187
##   6     8.2887701
##   6.1   6.6844920
##   6.2   3.2085561
##   6.3   3.4759358
##   6.4   2.4064171
##   6.5   6.9518717
##   6.6   5.3475936
##   6.7   1.3368984
##   6.8   1.3368984
##   6.9   0.8021390
##   7.1   5.0802139
##   7.2   9.6256684
##   7.3   3.7433155
##   7.4   1.3368984
##   7.5   1.3368984
##   7.6   2.6737968
##   7.7   6.4171123
##   7.8   7.4866310
##   7.9   1.8716578
##   8     3.4759358
##   8.1   4.0106952
##   8.2   2.9411765
##   8.3   1.3368984
##   8.4   3.7433155
##   8.5   3.4759358
##   Sum 100.0000000
Frecuencias [CPF y CPC]
round(addmargins(prop.table(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés, cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno), 1)*100, 2), 2)
##    
##          4      5      6      7      8      9    Sum
##   3   0.00   0.00   0.00   0.00   2.82  97.18 100.00
##   4   0.00   0.00   0.00  35.71  61.43   2.86 100.00
##   5   0.00   0.00   0.00  10.45  89.55   0.00 100.00
##   6   0.00   0.00   8.70  82.61   8.70   0.00 100.00
##   7   0.00  14.00  72.00  14.00   0.00   0.00 100.00
##   8   7.14   0.00  92.86   0.00   0.00   0.00 100.00
round(addmargins(prop.table(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés, cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno), 2)*100, 1), 2)
##      
##            4      5      6      7      8      9
##   3     0.00   0.00   0.00   0.00   1.83  97.18
##   4     0.00   0.00   0.00  32.47  39.45   2.82
##   5     0.00   0.00   0.00   9.09  55.05   0.00
##   6     0.00   0.00   3.81  49.35   3.67   0.00
##   7     0.00 100.00  34.29   9.09   0.00   0.00
##   8   100.00   0.00  61.90   0.00   0.00   0.00
##   Sum 100.00 100.00 100.00 100.00 100.00 100.00
round(addmargins(prop.table(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica, cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios), 1)*100, 2), 2)
##     
##        3000   3300   3500   3700   4000   4100   4200   4800   5000   5200
##   30   4.41   0.00   0.00   0.00   0.00   0.00   0.00   0.00  83.82   0.00
##   32   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00 100.00
##   35   0.00   0.00   0.00   0.00   0.00  50.00   0.00  50.00   0.00   0.00
##   40   0.00   0.00  16.67   0.00  50.00   0.00   0.00   0.00   0.00   0.00
##   42   0.00   0.00   0.00   0.00   0.00   0.00 100.00   0.00   0.00   0.00
##   45   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   4.41   0.00
##   47   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   50   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   55   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   60   0.00   2.86   0.00   0.00   0.00   0.00   0.00   0.00   8.57   0.00
##   65   0.00   0.00 100.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   70   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   75   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   2.99   0.00
##   80   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   85   0.00   0.00   0.00 100.00   0.00   0.00   0.00   0.00   0.00   0.00
##   90   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##     
##        5500   5600   6000   6200   6800   7000   7300   7500   8000  10000
##   30   0.00   0.00   2.94   0.00   0.00   0.00   0.00   0.00   8.82   0.00
##   32   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   35   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   40   0.00  33.33   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   42   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   45   0.00   0.00  92.65   0.00   0.00   0.00   0.00   0.00   2.94   0.00
##   47   0.00   0.00   0.00   0.00 100.00   0.00   0.00   0.00   0.00   0.00
##   50  75.00   0.00   0.00   0.00   0.00  25.00   0.00   0.00   0.00   0.00
##   55  16.67   0.00  50.00   0.00   0.00   0.00  33.33   0.00   0.00   0.00
##   60   0.00   0.00   0.00   0.00   0.00  45.71   0.00   0.00  40.00   2.86
##   65   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   70   0.00   0.00   0.00  33.33   0.00  66.67   0.00   0.00   0.00   0.00
##   75   0.00   0.00   0.00   0.00   2.99  46.27   0.00   0.00  47.76   0.00
##   80   0.00   0.00   0.00   0.00   0.00   0.00   0.00 100.00   0.00   0.00
##   85   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   90   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00  49.25  50.75
##     
##         Sum
##   30 100.00
##   32 100.00
##   35 100.00
##   40 100.00
##   42 100.00
##   45 100.00
##   47 100.00
##   50 100.00
##   55 100.00
##   60 100.00
##   65 100.00
##   70 100.00
##   75 100.00
##   80 100.00
##   85 100.00
##   90 100.00
round(addmargins(prop.table(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica, cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios), 2)*100, 1), 2)
##      
##         3000   3300   3500   3700   4000   4100   4200   4800   5000   5200
##   30  100.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00  83.82   0.00
##   32    0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00 100.00
##   35    0.00   0.00   0.00   0.00   0.00 100.00   0.00 100.00   0.00   0.00
##   40    0.00   0.00  33.33   0.00 100.00   0.00   0.00   0.00   0.00   0.00
##   42    0.00   0.00   0.00   0.00   0.00   0.00 100.00   0.00   0.00   0.00
##   45    0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   4.41   0.00
##   47    0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   50    0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   55    0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   60    0.00 100.00   0.00   0.00   0.00   0.00   0.00   0.00   8.82   0.00
##   65    0.00   0.00  66.67   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   70    0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   75    0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   2.94   0.00
##   80    0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   85    0.00   0.00   0.00 100.00   0.00   0.00   0.00   0.00   0.00   0.00
##   90    0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   Sum 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
##      
##         5500   5600   6000   6200   6800   7000   7300   7500   8000  10000
##   30    0.00   0.00   2.94   0.00   0.00   0.00   0.00   0.00   5.94   0.00
##   32    0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   35    0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   40    0.00 100.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   42    0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   45    0.00   0.00  92.65   0.00   0.00   0.00   0.00   0.00   1.98   0.00
##   47    0.00   0.00   0.00   0.00  33.33   0.00   0.00   0.00   0.00   0.00
##   50   75.00   0.00   0.00   0.00   0.00   1.52   0.00   0.00   0.00   0.00
##   55   25.00   0.00   4.41   0.00   0.00   0.00 100.00   0.00   0.00   0.00
##   60    0.00   0.00   0.00   0.00   0.00  48.48   0.00   0.00  27.72   5.56
##   65    0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   70    0.00   0.00   0.00 100.00   0.00   3.03   0.00   0.00   0.00   0.00
##   75    0.00   0.00   0.00   0.00  66.67  46.97   0.00   0.00  31.68   0.00
##   80    0.00   0.00   0.00   0.00   0.00   0.00   0.00 100.00   0.00   0.00
##   85    0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00
##   90    0.00   0.00   0.00   0.00   0.00   0.00   0.00   0.00  32.67  94.44
##   Sum 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
round(addmargins(prop.table(table(cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno, cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno), 1)*100, 2), 2)
##      
##            4      5      6      7      8      9    Sum
##   5.8 100.00   0.00   0.00   0.00   0.00   0.00 100.00
##   5.9  75.00   0.00  25.00   0.00   0.00   0.00 100.00
##   6     0.00   0.00 100.00   0.00   0.00   0.00 100.00
##   6.1   0.00   0.00 100.00   0.00   0.00   0.00 100.00
##   6.2   0.00   0.00 100.00   0.00   0.00   0.00 100.00
##   6.3   0.00   0.00 100.00   0.00   0.00   0.00 100.00
##   6.4   0.00  22.22  77.78   0.00   0.00   0.00 100.00
##   6.5   0.00  11.54  50.00  38.46   0.00   0.00 100.00
##   6.6   0.00  10.00   0.00  90.00   0.00   0.00 100.00
##   6.7   0.00   0.00   0.00 100.00   0.00   0.00 100.00
##   6.8   0.00   0.00  40.00  60.00   0.00   0.00 100.00
##   6.9   0.00   0.00  33.33  66.67   0.00   0.00 100.00
##   7.1   0.00   0.00   0.00  15.79  84.21   0.00 100.00
##   7.2   0.00   0.00   0.00   0.00 100.00   0.00 100.00
##   7.3   0.00   0.00   0.00  14.29  85.71   0.00 100.00
##   7.4   0.00   0.00   0.00  40.00  60.00   0.00 100.00
##   7.5   0.00   0.00   0.00   0.00 100.00   0.00 100.00
##   7.6   0.00   0.00   0.00  50.00  50.00   0.00 100.00
##   7.7   0.00   0.00   0.00  58.33  41.67   0.00 100.00
##   7.8   0.00   0.00   0.00  32.14  67.86   0.00 100.00
##   7.9   0.00   0.00   0.00  57.14  42.86   0.00 100.00
##   8     0.00   0.00   0.00   0.00   0.00 100.00 100.00
##   8.1   0.00   0.00   0.00   0.00   0.00 100.00 100.00
##   8.2   0.00   0.00   0.00   0.00   0.00 100.00 100.00
##   8.3   0.00   0.00   0.00   0.00   0.00 100.00 100.00
##   8.4   0.00   0.00   0.00   0.00   0.00 100.00 100.00
##   8.5   0.00   0.00   0.00   0.00   0.00 100.00 100.00
round(addmargins(prop.table(table(cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno, cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno), 2)*100, 1), 2)
##      
##            4      5      6      7      8      9
##   5.8  40.00   0.00   0.00   0.00   0.00   0.00
##   5.9  60.00   0.00   0.95   0.00   0.00   0.00
##   6     0.00   0.00  29.52   0.00   0.00   0.00
##   6.1   0.00   0.00  23.81   0.00   0.00   0.00
##   6.2   0.00   0.00  11.43   0.00   0.00   0.00
##   6.3   0.00   0.00  12.38   0.00   0.00   0.00
##   6.4   0.00  28.57   6.67   0.00   0.00   0.00
##   6.5   0.00  42.86  12.38  12.99   0.00   0.00
##   6.6   0.00  28.57   0.00  23.38   0.00   0.00
##   6.7   0.00   0.00   0.00   6.49   0.00   0.00
##   6.8   0.00   0.00   1.90   3.90   0.00   0.00
##   6.9   0.00   0.00   0.95   2.60   0.00   0.00
##   7.1   0.00   0.00   0.00   3.90  14.68   0.00
##   7.2   0.00   0.00   0.00   0.00  33.03   0.00
##   7.3   0.00   0.00   0.00   2.60  11.01   0.00
##   7.4   0.00   0.00   0.00   2.60   2.75   0.00
##   7.5   0.00   0.00   0.00   0.00   4.59   0.00
##   7.6   0.00   0.00   0.00   6.49   4.59   0.00
##   7.7   0.00   0.00   0.00  18.18   9.17   0.00
##   7.8   0.00   0.00   0.00  11.69  17.43   0.00
##   7.9   0.00   0.00   0.00   5.19   2.75   0.00
##   8     0.00   0.00   0.00   0.00   0.00  18.31
##   8.1   0.00   0.00   0.00   0.00   0.00  21.13
##   8.2   0.00   0.00   0.00   0.00   0.00  15.49
##   8.3   0.00   0.00   0.00   0.00   0.00   7.04
##   8.4   0.00   0.00   0.00   0.00   0.00  19.72
##   8.5   0.00   0.00   0.00   0.00   0.00  18.31
##   Sum 100.00 100.00 100.00 100.00 100.00 100.00
Perfiles [CPF y CPC]
plotct(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés, cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno),"row")

plotct(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés, cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno),"col")

Pruebas de Hipótesis
chisq.test(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés, cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno))
## Warning in
## chisq.test(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés, :
## Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés,     cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)
## X-squared = 847.69, df = 25, p-value < 2.2e-16
chisq.test(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica, cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios))
## Warning in
## chisq.test(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica,
## : Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica,     cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)
## X-squared = 3822.1, df = 285, p-value < 2.2e-16
chisq.test(table(cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno, cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno))
## Warning in
## chisq.test(table(cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno, :
## Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  table(cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno,     cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)
## X-squared = 1228.1, df = 130, p-value < 2.2e-16

AC Pareja Única

La AC (Análisis de Correspondencia) de pareja única examina la relación específica entre dos variables categóricas de un conjunto de datos, ayudando a identificar patrones de asociación que facilitan la interpretación de los datos.

Contingencias y Residuales: La tabla muestra cómo las frecuencias observadas se comparan con las esperadas, las diferencias (residuales) entre estas frecuencias y la magnitud de esas diferencias en términos de desviación estándar. Esto ayuda a determinar si existe una asociación significativa entre las dos variables .

Contribuciones:Esta tabla muestra las contribuciones individuales de cada celda de la tabla de contingencia al valor total del estadístico de chi-cuadrado, lo que ayuda a identificar qué combinaciones de categorías tienen mayor impacto en la prueba de independencia entre las variables .

Correspondencia Simple Unidimensional: La correspondencia simple unidimensional ayuda a identificar qué categorías son más significativas en relación con los componentes principales y cómo se agrupan en función de la variabilidad explicada. Estos resultados proporcionan información clave sobre cómo se distribuyen las categorías de la variable en el espacio reducido y cómo influyen en la estructura global del análisis.

Contingencias y Residuales [R-UR]
chisq.test(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés, cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno))$observed
## Warning in
## chisq.test(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés, :
## Chi-squared approximation may be incorrect
##    
##      4  5  6  7  8  9
##   3  0  0  0  0  2 69
##   4  0  0  0 25 43  2
##   5  0  0  0  7 60  0
##   6  0  0  4 38  4  0
##   7  0  7 36  7  0  0
##   8  5  0 65  0  0  0
chisq.test(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica, cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios))$expected 
## Warning in
## chisq.test(table(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica,
## : Chi-squared approximation may be incorrect
##     
##            3000        3300       3500        3700       4000        4100
##   30 0.54545455 0.363636364 0.54545455 0.363636364 0.54545455 0.363636364
##   32 0.01604278 0.010695187 0.01604278 0.010695187 0.01604278 0.010695187
##   35 0.03208556 0.021390374 0.03208556 0.021390374 0.03208556 0.021390374
##   40 0.04812834 0.032085561 0.04812834 0.032085561 0.04812834 0.032085561
##   42 0.01604278 0.010695187 0.01604278 0.010695187 0.01604278 0.010695187
##   45 0.54545455 0.363636364 0.54545455 0.363636364 0.54545455 0.363636364
##   47 0.00802139 0.005347594 0.00802139 0.005347594 0.00802139 0.005347594
##   50 0.03208556 0.021390374 0.03208556 0.021390374 0.03208556 0.021390374
##   55 0.04812834 0.032085561 0.04812834 0.032085561 0.04812834 0.032085561
##   60 0.56149733 0.374331551 0.56149733 0.374331551 0.56149733 0.374331551
##   65 0.01604278 0.010695187 0.01604278 0.010695187 0.01604278 0.010695187
##   70 0.02406417 0.016042781 0.02406417 0.016042781 0.02406417 0.016042781
##   75 0.53743316 0.358288770 0.53743316 0.358288770 0.53743316 0.358288770
##   80 0.01604278 0.010695187 0.01604278 0.010695187 0.01604278 0.010695187
##   85 0.01604278 0.010695187 0.01604278 0.010695187 0.01604278 0.010695187
##   90 0.53743316 0.358288770 0.53743316 0.358288770 0.53743316 0.358288770
##     
##             4200        4800       5000        5200       5500        5600
##   30 0.363636364 0.363636364 12.3636364 0.363636364 0.72727273 0.363636364
##   32 0.010695187 0.010695187  0.3636364 0.010695187 0.02139037 0.010695187
##   35 0.021390374 0.021390374  0.7272727 0.021390374 0.04278075 0.021390374
##   40 0.032085561 0.032085561  1.0909091 0.032085561 0.06417112 0.032085561
##   42 0.010695187 0.010695187  0.3636364 0.010695187 0.02139037 0.010695187
##   45 0.363636364 0.363636364 12.3636364 0.363636364 0.72727273 0.363636364
##   47 0.005347594 0.005347594  0.1818182 0.005347594 0.01069519 0.005347594
##   50 0.021390374 0.021390374  0.7272727 0.021390374 0.04278075 0.021390374
##   55 0.032085561 0.032085561  1.0909091 0.032085561 0.06417112 0.032085561
##   60 0.374331551 0.374331551 12.7272727 0.374331551 0.74866310 0.374331551
##   65 0.010695187 0.010695187  0.3636364 0.010695187 0.02139037 0.010695187
##   70 0.016042781 0.016042781  0.5454545 0.016042781 0.03208556 0.016042781
##   75 0.358288770 0.358288770 12.1818182 0.358288770 0.71657754 0.358288770
##   80 0.010695187 0.010695187  0.3636364 0.010695187 0.02139037 0.010695187
##   85 0.010695187 0.010695187  0.3636364 0.010695187 0.02139037 0.010695187
##   90 0.358288770 0.358288770 12.1818182 0.358288770 0.71657754 0.358288770
##     
##            6000        6200       6800       7000        7300        7500
##   30 12.3636364 0.181818182 0.54545455 12.0000000 0.363636364 0.363636364
##   32  0.3636364 0.005347594 0.01604278  0.3529412 0.010695187 0.010695187
##   35  0.7272727 0.010695187 0.03208556  0.7058824 0.021390374 0.021390374
##   40  1.0909091 0.016042781 0.04812834  1.0588235 0.032085561 0.032085561
##   42  0.3636364 0.005347594 0.01604278  0.3529412 0.010695187 0.010695187
##   45 12.3636364 0.181818182 0.54545455 12.0000000 0.363636364 0.363636364
##   47  0.1818182 0.002673797 0.00802139  0.1764706 0.005347594 0.005347594
##   50  0.7272727 0.010695187 0.03208556  0.7058824 0.021390374 0.021390374
##   55  1.0909091 0.016042781 0.04812834  1.0588235 0.032085561 0.032085561
##   60 12.7272727 0.187165775 0.56149733 12.3529412 0.374331551 0.374331551
##   65  0.3636364 0.005347594 0.01604278  0.3529412 0.010695187 0.010695187
##   70  0.5454545 0.008021390 0.02406417  0.5294118 0.016042781 0.016042781
##   75 12.1818182 0.179144385 0.53743316 11.8235294 0.358288770 0.358288770
##   80  0.3636364 0.005347594 0.01604278  0.3529412 0.010695187 0.010695187
##   85  0.3636364 0.005347594 0.01604278  0.3529412 0.010695187 0.010695187
##   90 12.1818182 0.179144385 0.53743316 11.8235294 0.358288770 0.358288770
##     
##            8000      10000
##   30 18.3636364 6.54545455
##   32  0.5401070 0.19251337
##   35  1.0802139 0.38502674
##   40  1.6203209 0.57754011
##   42  0.5401070 0.19251337
##   45 18.3636364 6.54545455
##   47  0.2700535 0.09625668
##   50  1.0802139 0.38502674
##   55  1.6203209 0.57754011
##   60 18.9037433 6.73796791
##   65  0.5401070 0.19251337
##   70  0.8101604 0.28877005
##   75 18.0935829 6.44919786
##   80  0.5401070 0.19251337
##   85  0.5401070 0.19251337
##   90 18.0935829 6.44919786
chisq.test(table(cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno, cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno))$residuals
## Warning in
## chisq.test(table(cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno, :
## Chi-squared approximation may be incorrect
##      
##                4          5          6          7          8          9
##   5.8 12.0675904 -0.1934765 -0.7493313 -0.6416889 -0.7634708 -0.6161811
##   5.9 12.7418003 -0.2736171 -0.1160640 -0.9074852 -1.0797108 -0.8714117
##   6   -0.6437690 -0.7617177  7.5579267 -2.5263319 -3.0057876 -2.4259074
##   6.1 -0.5781216 -0.6840427  6.7872185 -2.2687130 -2.6992770 -2.1785292
##   6.2 -0.4005344 -0.4739187  4.7023229 -1.5718105 -1.8701140 -1.5093293
##   6.3 -0.4168894 -0.4932702  4.8943329 -1.6359922 -1.9464763 -1.5709597
##   6.4 -0.3468730  4.4625644  2.8141305 -1.3612278 -1.6195662 -1.3071175
##   6.5 -0.5895707  3.6029344  2.1099399  2.0085467 -2.7527332 -2.2216725
##   6.6 -0.5170877  2.6570747 -2.3695935  6.8412982 -2.4143067 -1.9485357
##   6.7 -0.2585438 -0.3059132 -1.1847967  3.9134545 -1.2071534 -0.9742679
##   6.8 -0.2585438 -0.3059132  0.5032565  1.9422330 -1.2071534 -0.9742679
##   6.9 -0.2002672 -0.2369593  0.1718941  1.7589308 -0.9350570 -0.7546646
##   7.1 -0.5039947 -0.5963346 -2.3095940 -0.4609952  4.4461488 -1.8991977
##   7.2 -0.6937459 -0.8208513 -3.1791433 -2.7224556  7.8749549 -2.6142350
##   7.3 -0.4326266 -0.5118907 -1.9825441 -0.5197192  3.9207756 -1.6302619
##   7.4 -0.2585438 -0.3059132 -1.1847967  0.9566222  1.2780321 -0.9742679
##   7.5 -0.2585438 -0.3059132 -1.1847967 -1.0145993  2.9348224 -0.9742679
##   7.6 -0.3656362 -0.4326266 -1.6755556  2.0498002  1.2216465 -1.3778228
##   7.7 -0.5664412 -0.6702222 -2.5957596  4.0752722  1.1363488 -2.1345139
##   7.8 -0.6118264 -0.7239228 -2.8037408  1.3474889  3.7945098 -2.3055386
##   7.9 -0.3059132 -0.3619614 -1.4018704  2.1314824  0.6720419 -1.1527693
##   8   -0.4168894 -0.4932702 -1.9104273 -1.6359922 -1.9464763  6.7042365
##   8.1 -0.4478111 -0.5298572 -2.0521282 -1.7573376 -2.0908510  7.2015053
##   8.2 -0.3834825 -0.4537426 -1.7573376 -1.5048940 -1.7904978  6.1670007
##   8.3 -0.2585438 -0.3059132 -1.1847967 -1.0145993 -1.2071534  4.1577910
##   8.4 -0.4326266 -0.5118907 -1.9825441 -1.6977494 -2.0199539  6.9573151
##   8.5 -0.4168894 -0.4932702 -1.9104273 -1.6359922 -1.9464763  6.7042365
chisq.test(table(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola, cdd_salud_y_estilos_de_vida_depurado$Presion_diastola))$stdres
## Warning in
## chisq.test(table(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola, :
## Chi-squared approximation may be incorrect
##      
##                75          76          77          78          79          80
##   115 18.08772740 -0.54993261 -0.44841417  4.48414171 -0.31665138 -3.97300779
##   117 -0.44841417 15.76905458 -0.10397355 -0.10397355 -0.07342178 -0.92121912
##   118  3.48290653  6.34210607 -0.12751257 -0.12751257 -0.09004406 -1.12977794
##   119 -0.44841417 -0.12751257 19.33907961 -0.10397355 -0.07342178 -0.92121912
##   120 -2.26174745 -0.64315816 -0.52443013 -0.52443013 -0.37033068 11.00931997
##   121 -0.31665138 -0.09004406 -0.07342178 -0.07342178 19.33907961 -0.65052651
##   122 -0.31665138 -0.09004406 -0.07342178 -0.07342178 -0.05184740  1.54133759
##   125 -2.90877699 -0.82714967 -0.67445652 -0.67445652 -0.47627305 12.99158961
##   126 -0.44841417 -0.12751257 -0.10397355 -0.10397355 -0.07342178 -0.92121912
##   128 -0.71188136 -0.20243299 -0.16506354 -0.16506354 -0.11656098 -1.46248438
##   129 -0.44841417 -0.12751257 -0.10397355 -0.10397355 -0.07342178 -0.92121912
##   130 -3.71976209 -1.05776413 -0.86249918 -0.86249918 -0.60906094 -7.64185477
##   131 -0.44841417 -0.12751257 -0.10397355 -0.10397355 -0.07342178 -0.92121912
##   132 -0.54993261 -0.15638070 -0.12751257 -0.12751257 -0.09004406 -1.12977794
##   135 -1.77306743 -0.50419545 -0.41112017 -0.41112017 -0.29031591 -3.64257806
##   139 -0.44841417 -0.12751257 -0.10397355 -0.10397355 -0.07342178 -0.92121912
##   140 -2.90877699 -0.82714967 -0.67445652 -0.67445652 -0.47627305 -5.97577232
##   142 -0.44841417 -0.12751257 -0.10397355 -0.10397355 -0.07342178 -0.92121912
##      
##                82          83          84          85          86          87
##   115 -0.63586502 -0.44841417 -0.63586502 -3.74499666 -0.63586502 -0.54993261
##   117 -0.14743767 -0.10397355 -0.14743767 -0.86835031 -0.14743767 -0.12751257
##   118 -0.18081673 -0.12751257 -0.18081673 -1.06493992 -0.18081673 -0.15638070
##   119 -0.14743767 -0.10397355 -0.14743767 -0.86835031 -0.14743767 -0.12751257
##   120 -0.74365798 -0.52443013 -0.74365798 -4.37985510 -0.74365798 -0.64315816
##   121 -0.10411433 -0.07342178 -0.10411433 -0.61319276 -0.10411433 -0.09004406
##   122 -0.10411433 -0.07342178 -0.10411433 -0.61319276 -0.10411433 -0.09004406
##   125  4.22756515 -0.67445652 -0.95639998 -5.63282243 -0.95639998 -0.82714967
##   126 -0.14743767 19.33907961 -0.14743767 -0.86835031 -0.14743767 -0.12751257
##   128 -0.23406515 -0.16506354  8.51997141  1.65426279 -0.23406515 -0.20243299
##   129 -0.14743767 -0.10397355 13.63798459 -0.86835031 -0.14743767 -0.12751257
##   130 -1.22305024 -0.86249918 -1.22305024 18.68575782  1.04140912 -1.05776413
##   131 -0.14743767 -0.10397355 -0.14743767 -0.86835031 13.63798459 -0.12751257
##   132 -0.18081673 -0.12751257 -0.18081673 -1.06493992 -0.18081673 19.33907961
##   135 -0.58298098 -0.41112017 -0.58298098 -3.43353032 -0.58298098 -0.50419545
##   139 -0.14743767 -0.10397355 -0.14743767 -0.86835031 -0.14743767 -0.12751257
##   140 -0.95639998 -0.67445652 -0.95639998 -5.63282243 -0.95639998 -0.82714967
##   142 -0.14743767 -0.10397355 -0.14743767 -0.86835031 -0.14743767 -0.12751257
##      
##                88          90          91          92          95
##   115 -0.44841417 -1.83852520 -0.44841417 -0.44841417 -2.80487324
##   117 -0.10397355 -0.42629782 -0.10397355 -0.10397355 -0.65036441
##   118 -0.12751257 -0.52280925 -0.12751257 -0.12751257 -0.79760325
##   119 -0.10397355 -0.42629782 -0.10397355 -0.10397355 -0.65036441
##   120 -0.52443013 -2.15019524 -0.52443013 -0.52443013 -3.28036030
##   121 -0.07342178 -0.30103374 -0.07342178 -0.07342178 -0.45926021
##   122 -0.07342178 -0.30103374 -0.07342178 -0.07342178 -0.45926021
##   125 -0.67445652 -2.76531248 -0.67445652 -0.67445652 -4.21878959
##   126 -0.10397355 -0.42629782 -0.10397355 -0.10397355 -0.65036441
##   128 -0.16506354 -0.67677048 -0.16506354 -0.16506354 -1.03248811
##   129 -0.10397355 -0.42629782 -0.10397355 -0.10397355 -0.65036441
##   130 -0.86249918 -3.53629878 -0.86249918 -0.86249918 -5.39501434
##   131 -0.10397355 -0.42629782 -0.10397355 -0.10397355 -0.65036441
##   132 -0.12751257 -0.52280925 -0.12751257 -0.12751257 -0.79760325
##   135  4.89091232 17.24804857 -0.41112017 -0.41112017 -2.57159570
##   139 -0.10397355 -0.42629782 19.33907961 -0.10397355 -0.65036441
##   140 -0.67445652 -0.83127439 -0.67445652 -0.67445652 18.64827281
##   142 -0.10397355 -0.42629782 -0.10397355 19.33907961 -0.65036441
Contribuciones [R-UR]
#chisq.test(table(cdd_salud_y_estilos_de_vida_depurado$Research, cdd_salud_y_estilos_de_vida_depurado$University_Rating))$residuals^2/chisq.test(table(cdd_salud_y_estilos_de_vida_depurado$Research, cdd_salud_y_estilos_de_vida_depurado$University_Rating))$statistic*100
Correspondencia Simple Unidimensional [R-UR]
#CA(table(cdd_salud_y_estilos_de_vida_depurado$Research, cdd_salud_y_estilos_de_vida_depurado$University_Rating), graph = FALSE)$eig
#CA(table(cdd_salud_y_estilos_de_vida_depurado$Research, cdd_salud_y_estilos_de_vida_depurado$University_Rating), graph = FALSE)$col
#CA(table(cdd_salud_y_estilos_de_vida_depurado$Research, cdd_salud_y_estilos_de_vida_depurado$University_Rating), graph = FALSE)$row

3.3. Correspondencias Múltiples

El análisis de correspondencias múltiples (ACM) es una técnica estadística utilizada para analizar datos categóricos nominales. Su objetivo principal es detectar y representar estructuras subyacentes en un conjunto de datos, permitiendo visualizar las relaciones entre diferentes categorías. Esto se logra representando los datos como puntos en un espacio euclidiano de baja dimensión1.

ACM: La tabla ayuda a entender qué cantidad de información (varianza) se retiene al reducir la dimensionalidad de los datos usando ACP. Se puede observar que la mayor parte de la varianza se concentra en los primeros componentes principales (dim 1, principalmente). Los últimos componentes principales contribuyen muy poco a la varianza total. Esto sugiere que la reducción de la dimensionalidad a un número menor de componentes principales, manteniendo una alta proporción de la varianza, podría ser posible sin una pérdida significativa de información

Biplot ACM: La gráfica de ACM proporciona una visión clara de las relaciones entre las diferentes observaciones (modelos de coches, en este caso) y las variables categóricas analizadas. Al observar la disposición de los puntos y los vectores, se puede concluir que hay patrones significativos en los datos. Los puntos que están agrupados indican que esos modelos de coches comparten características similares, mientras que la dirección y longitud de los vectores sugieren qué variables son más influyentes en la diferenciación entre estos modelos. Por ejemplo, si un vector es largo y apunta hacia un grupo específico de puntos, eso indica que esa variable tiene un papel importante en definir las características de esos modelos.

Contribuciones ACM: esta gráfica permite identificar claramente cuáles variables son clave para la primera dimensión del análisis, lo que puede guiar futuras investigaciones o decisiones estratégicas basadas en estas relaciones.

Biplot con Contribuciones: La gráfica de biplot proporciona una representación visual clara de las relaciones entre diferentes variables categóricas, mostrando cómo se agrupan y se relacionan entre sí en las dos dimensiones principales. Aunque las dimensiones Dim1 y Dim2 explican solo un 5% de la variabilidad total, permiten identificar patrones significativos en los datos.

Las variables color.NA, condition.NA y model.NA destacan por su alta contribución, lo que sugiere que la falta de información sobre estas características tiene un impacto considerable en el análisis. Esto puede indicar que es crucial considerar estos aspectos para obtener una comprensión más completa de los datos.

La proximidad de los modelos de coches en el gráfico indica similitudes en sus características, lo que podría ser útil para segmentar o clasificar los vehículos según sus atributos. En general, el biplot es una herramienta valiosa para explorar la estructura subyacente de los datos y guiar decisiones informadas basadas en las relaciones observadas.

ACM

round(MCA(cdd_salud_y_estilos_de_vida_depurado[1:400, -c(1,2,4,9,14)], graph = FALSE)$eig,2)
##         eigenvalue percentage of variance cumulative percentage of variance
## dim 1         1.00                   5.63                              5.63
## dim 2         0.79                   4.45                             10.08
## dim 3         0.75                   4.24                             14.31
## dim 4         0.71                   3.99                             18.30
## dim 5         0.65                   3.66                             21.96
## dim 6         0.63                   3.56                             25.52
## dim 7         0.63                   3.52                             29.04
## dim 8         0.60                   3.40                             32.44
## dim 9         0.59                   3.32                             35.76
## dim 10        0.59                   3.31                             39.07
## dim 11        0.56                   3.13                             42.20
## dim 12        0.52                   2.90                             45.10
## dim 13        0.50                   2.83                             47.92
## dim 14        0.49                   2.77                             50.69
## dim 15        0.49                   2.74                             53.43
## dim 16        0.46                   2.60                             56.03
## dim 17        0.44                   2.45                             58.48
## dim 18        0.41                   2.30                             60.78
## dim 19        0.40                   2.24                             63.02
## dim 20        0.39                   2.20                             65.22
## dim 21        0.35                   1.97                             67.20
## dim 22        0.31                   1.75                             68.95
## dim 23        0.29                   1.62                             70.57
## dim 24        0.25                   1.43                             72.01
## dim 25        0.24                   1.37                             73.37
## dim 26        0.20                   1.14                             74.51
## dim 27        0.19                   1.09                             75.60
## dim 28        0.19                   1.05                             76.66
## dim 29        0.18                   1.01                             77.67
## dim 30        0.18                   1.00                             78.67
## dim 31        0.17                   0.98                             79.64
## dim 32        0.17                   0.96                             80.60
## dim 33        0.17                   0.93                             81.54
## dim 34        0.16                   0.89                             82.42
## dim 35        0.15                   0.83                             83.25
## dim 36        0.15                   0.82                             84.07
## dim 37        0.14                   0.79                             84.87
## dim 38        0.14                   0.78                             85.65
## dim 39        0.14                   0.76                             86.41
## dim 40        0.13                   0.72                             87.13
## dim 41        0.13                   0.72                             87.85
## dim 42        0.12                   0.70                             88.56
## dim 43        0.11                   0.64                             89.20
## dim 44        0.11                   0.63                             89.83
## dim 45        0.11                   0.60                             90.43
## dim 46        0.11                   0.59                             91.02
## dim 47        0.10                   0.55                             91.57
## dim 48        0.09                   0.53                             92.10
## dim 49        0.09                   0.50                             92.59
## dim 50        0.09                   0.49                             93.08
## dim 51        0.08                   0.46                             93.54
## dim 52        0.08                   0.45                             93.99
## dim 53        0.08                   0.43                             94.41
## dim 54        0.07                   0.41                             94.82
## dim 55        0.07                   0.40                             95.22
## dim 56        0.07                   0.39                             95.61
## dim 57        0.07                   0.37                             95.98
## dim 58        0.06                   0.35                             96.34
## dim 59        0.06                   0.33                             96.66
## dim 60        0.06                   0.32                             96.98
## dim 61        0.06                   0.31                             97.29
## dim 62        0.05                   0.29                             97.58
## dim 63        0.05                   0.28                             97.87
## dim 64        0.05                   0.27                             98.14
## dim 65        0.05                   0.26                             98.40
## dim 66        0.05                   0.25                             98.65
## dim 67        0.03                   0.19                             98.84
## dim 68        0.03                   0.17                             99.01
## dim 69        0.03                   0.15                             99.16
## dim 70        0.03                   0.14                             99.30
## dim 71        0.02                   0.13                             99.43
## dim 72        0.02                   0.11                             99.54
## dim 73        0.02                   0.10                             99.64
## dim 74        0.02                   0.09                             99.72
## dim 75        0.01                   0.07                             99.79
## dim 76        0.01                   0.05                             99.84
## dim 77        0.01                   0.04                             99.88
## dim 78        0.01                   0.04                             99.91
## dim 79        0.01                   0.03                             99.94
## dim 80        0.00                   0.03                             99.97
## dim 81        0.00                   0.02                             99.99
## dim 82        0.00                   0.01                             99.99
## dim 83        0.00                   0.00                            100.00
## dim 84        0.00                   0.00                            100.00
## dim 85        0.00                   0.00                            100.00
## dim 86        0.00                   0.00                            100.00
## dim 87        0.00                   0.00                            100.00
## dim 88        0.00                   0.00                            100.00
## dim 89        0.00                   0.00                            100.00
## dim 90        0.00                   0.00                            100.00
## dim 91        0.00                   0.00                            100.00
## dim 92        0.00                   0.00                            100.00
## dim 93        0.00                   0.00                            100.00
## dim 94        0.00                   0.00                            100.00
## dim 95        0.00                   0.00                            100.00
## dim 96        0.00                   0.00                            100.00
## dim 97        0.00                   0.00                            100.00
## dim 98        0.00                   0.00                            100.00
## dim 99        0.00                   0.00                            100.00
## dim 100       0.00                   0.00                            100.00
## dim 101       0.00                   0.00                            100.00
## dim 102       0.00                   0.00                            100.00
## dim 103       0.00                   0.00                            100.00
## dim 104       0.00                   0.00                            100.00
## dim 105       0.00                   0.00                            100.00
## dim 106       0.00                   0.00                            100.00
## dim 107       0.00                   0.00                            100.00
## dim 108       0.00                   0.00                            100.00
## dim 109       0.00                   0.00                            100.00
## dim 110       0.00                   0.00                            100.00
## dim 111       0.00                   0.00                            100.00
## dim 112       0.00                   0.00                            100.00
## dim 113       0.00                   0.00                            100.00
## dim 114       0.00                   0.00                            100.00
## dim 115       0.00                   0.00                            100.00
## dim 116       0.00                   0.00                            100.00
## dim 117       0.00                   0.00                            100.00
## dim 118       0.00                   0.00                            100.00
## dim 119       0.00                   0.00                            100.00
## dim 120       0.00                   0.00                            100.00
## dim 121       0.00                   0.00                            100.00
## dim 122       0.00                   0.00                            100.00
## dim 123       0.00                   0.00                            100.00
## dim 124       0.00                   0.00                            100.00
## dim 125       0.00                   0.00                            100.00
## dim 126       0.00                   0.00                            100.00
## dim 127       0.00                   0.00                            100.00
## dim 128       0.00                   0.00                            100.00
## dim 129       0.00                   0.00                            100.00
## dim 130       0.00                   0.00                            100.00
## dim 131       0.00                   0.00                            100.00
## dim 132       0.00                   0.00                            100.00
## dim 133       0.00                   0.00                            100.00
## dim 134       0.00                   0.00                            100.00
## dim 135       0.00                   0.00                            100.00
## dim 136       0.00                   0.00                            100.00
## dim 137       0.00                   0.00                            100.00
## dim 138       0.00                   0.00                            100.00
## dim 139       0.00                   0.00                            100.00
## dim 140       0.00                   0.00                            100.00
## dim 141       0.00                   0.00                            100.00
## dim 142       0.00                   0.00                            100.00
## dim 143       0.00                   0.00                            100.00
## dim 144       0.00                   0.00                            100.00
## dim 145       0.00                   0.00                            100.00
## dim 146       0.00                   0.00                            100.00
## dim 147       0.00                   0.00                            100.00
## dim 148       0.00                   0.00                            100.00
## dim 149       0.00                   0.00                            100.00
## dim 150       0.00                   0.00                            100.00
## dim 151       0.00                   0.00                            100.00
## dim 152       0.00                   0.00                            100.00
## dim 153       0.00                   0.00                            100.00
## dim 154       0.00                   0.00                            100.00
## dim 155       0.00                   0.00                            100.00
## dim 156       0.00                   0.00                            100.00
## dim 157       0.00                   0.00                            100.00
## dim 158       0.00                   0.00                            100.00
## dim 159       0.00                   0.00                            100.00
## dim 160       0.00                   0.00                            100.00

Biplot ACM

#fviz_mca_biplot(MCA(cdd_salud_y_estilos_de_vida_depurado[1:400, -c(1,2,4,9,14)], graph = FALSE), repel = TRUE)

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Calidad de Representación

#fviz_mca_var(MCA(cdd_salud_y_estilos_de_vida_depurado[1:400, -c(1,2,4,9,14)], graph = FALSE), col.var ="cos2", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)
#MCA(cdd_salud_y_estilos_de_vida_depurado[1:400, -c(1,2,4,9,14)], graph = FALSE)$var$cos2

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Contribuciones

#fviz_contrib(MCA(cdd_salud_y_estilos_de_vida_depurado[1:300, -c(1,2,4,9,14)], graph = FALSE), choice = "var", axes = 1, top = 15)
#fviz_contrib(MCA(cdd_salud_y_estilos_de_vida_depurado[1:300, -c(1,2,4,9,14)], graph = FALSE), choice = "var", axes = 2, top = 15)
#fviz_contrib(MCA(cdd_salud_y_estilos_de_vida_depurado[1:300, -c(1,2,4,9,14)], graph = FALSE), choice = "var", axes = 3, top = 15)
#fviz_contrib(MCA(cdd_salud_y_estilos_de_vida_depurado[1:300, -c(1,2,4,9,14)], graph = FALSE), choice = "var", axes = 4, top = 15)
#fviz_contrib(MCA(cdd_salud_y_estilos_de_vida_depurado[1:300, -c(1,2,4,9,14)], graph = FALSE), choice = "var", axes = 5, top = 15)

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Biplot con Contribuciones

#duplicados <- duplicated(cdd_salud_y_estilos_de_vida_depurado)

#cdd_salud_y_estilos_de_vida_depurado <- cdd_salud_y_estilos_de_vida_depurado[!duplicados, ]

#rownames(cdd_salud_y_estilos_de_vida_depurado) <- seq_len(nrow(cdd_salud_y_estilos_de_vida_depurado))

#anyDuplicated(cdd_salud_y_estilos_de_vida_depurado)  

#str(cdd_salud_y_estilos_de_vida_depurado[1:10, ])  

#summary(cdd_salud_y_estilos_de_vida_depurado)  

#fviz_mca_var(MCA(cdd_salud_y_estilos_de_vida_depurado[1:400, -c(1, 2, 4, 9, 14)], graph = FALSE), 
             #col.var = "contrib", 
             #gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), 
             #repel = TRUE)

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Fase 4 [Conglomerados]

4.1. Objetivos

La agrupación jerárquica organiza los elementos en un árbol de grupos anidados, conocido como dendrograma, y puede ser aglomerativa (de abajo hacia arriba) o divisiva (de arriba hacia abajo), identificando relaciones jerárquicas entre los datos. En contraste, la agrupación no jerárquica, como el método k-means, agrupa los datos en un número fijo de clústeres para maximizar o minimizar ciertos criterios de evaluación

4.2. Agrupación Jerárquica

La agrupación jerárquica es un método de análisis de datos que organiza elementos en un árbol de grupos anidados, conocido como dendrograma. Este método puede ser aglomerativo (de abajo hacia arriba) o divisivo (de arriba hacia abajo). En el enfoque aglomerativo, cada elemento comienza en su propio grupo y se fusiona con otros grupos basándose en la similitud, hasta que todos los elementos están en un solo grupo. En el enfoque divisivo, todos los elementos comienzan en un solo grupo y se dividen sucesivamente en grupos más pequeños.

El dendrograma resultante de la agrupación jerárquica proporciona una representación visual de las relaciones jerárquicas entre los datos. Cada nodo del árbol representa un grupo de datos similares, y los nodos se agrupan en niveles sucesivos según su similitud. Esto permite identificar patrones y estructuras subyacentes en los datos, facilitando la interpretación y el análisis.

La agrupación jerárquica se utiliza en diversas áreas, como la biología para clasificar especies, la mercadotecnia para segmentar clientes y la informática para organizar grandes volúmenes de datos. Su capacidad para manejar datos complejos y proporcionar una visión clara de las relaciones jerárquicas la convierte en una herramienta valiosa en el análisis de datos.

Campo Clasificatorio

promedio <- read_excel("C:/Gestion de datos [G8]/promedio.xlsx")
str(as.data.frame(promedio))
## 'data.frame':    12 obs. of  8 variables:
##  $ Edad_s01                  : num  0.39 0.2 0.39 0.18 0.77 0.56 0.11 0.58 0.43 0 ...
##  $ Duracion_de_sueno_S01     : num  0.86 0.68 0.78 0.63 0.52 0.13 0.11 0.26 0.13 0 ...
##  $ Calidad_de_sueno_S01      : num  0.78 0.2 0.78 0.53 0.67 0.6 0.5 0.88 0.92 0 ...
##  $ Nivel_actividad_fisica_S01: num  0.67 0.18 0.47 0.42 0.81 0.42 0.3 0.37 0.86 0 ...
##  $ Presion_sistola_S01       : num  0.55 0.54 0.1 0.3 0.94 0.4 0.46 0.44 0.2 0.4 ...
##  $ Presion_distolica_S01     : num  0.5 0.525 0.0959 0.2754 0.9363 ...
##  $ Frecuencia_cardiaca_S01   : num  0.22 0.64 0.18 0.31 0.35 0.5 0.53 0.11 0.11 0.65 ...
##  $ Pasos_diarios_S01         : num  0.67 0.34 0.55 0.54 0.82 0.5 0.56 0.65 0.92 0 ...

Disimilaridad

La gráfica de disimilaridad proporciona una representación clara y visual de las diferencias entre varios colores en el conjunto de datos analizado. Al utilizar una escala de 0 a 5, permite identificar rápidamente cuáles colores son más similares entre sí y cuáles son significativamente diferentes. Los colores con valores bajos indican alta similitud, lo que puede ser útil para tomar decisiones en diseño o marketing, mientras que los colores con valores altos sugieren diferencias marcadas que podrían influir en la percepción o preferencia del consumidor.

Esta matriz es especialmente valiosa para entender relaciones complejas entre categorías, facilitando la identificación de agrupaciones o patrones que pueden no ser evidentes a simple vista.

data_ = as.data.frame(promedio)[, -c(1)]
rownames(data_) = unclass(promedio$Ocupacion)
## Warning: Unknown or uninitialised column: `Ocupacion`.
fviz_dist(get_dist(data_, stand = T, method = "euclidean"), gradient = list(low = "#00AFBB", mid = "white", high = "#FC4E07"))

Optimizacion De Mojena

La optimización de Mojena es una técnica utilizada en el análisis de agrupamiento jerárquico para determinar el número óptimo de clústeres. Se basa en la identificación de un punto de corte en el dendrograma, utilizando un criterio estadístico que maximiza la diferencia entre las distancias de los clústeres fusionados y no fusionados, permitiendo una segmentación más precisa y significativa de los datos

Union simple
hc_single = hclust(get_dist(data_, stand = T, method = "euclidean"), method = "single")

mojena = function(hc){
  n_hd = length(hc$height)
  alp_g = 0 ; alpha = hc$height[n_hd:1]
  for(i in 1:(n_hd-1)){
    alp_g[i] = mean(alpha[(n_hd-i+1):1])+1.25*sd(alpha[(n_hd-i+1):1])
  }
  nog = sum(alp_g<= alpha[-n_hd]) + 1
  plot(alpha[-n_hd], pch=20, col=(alp_g>alpha[-n_hd])+1, main = paste("Optimal number of groups =",nog),
       ylab = expression(alpha[g]), xlab="Nodes")}

mojena(hc_single)

Union Compleja

La gráfica muestra el resultado de un análisis de agrupamiento jerárquico aglomerativo, específicamente utilizando el método de unión simple (single linkage). El objetivo es determinar el número óptimo de grupos (“clusters”) en un conjunto de datos. la gráfica sugiere que la mejor agrupación de los datos se logra con 3 grupos, según el criterio de minimizar la dispersión dentro de los grupos utilizando la unión simple como método de agrupamiento.

hc_complete = hclust(get_dist(data_, stand = T, method = "euclidean"), method = "complete")

mojena = function(hc){
  n_hd = length(hc$height)
  alp_g = 0 ; alpha = hc$height[n_hd:1]
  for(i in 1:(n_hd-1)){
    alp_g[i] = mean(alpha[(n_hd-i+1):1])+1.25*sd(alpha[(n_hd-i+1):1])
  }
  nog = sum(alp_g<= alpha[-n_hd]) + 1
  plot(alpha[-n_hd], pch=20, col=(alp_g>alpha[-n_hd])+1, main = paste("Optimal number of groups =",nog),
       ylab = expression(alpha[g]), xlab="Nodes")}

mojena(hc_complete)

Unión Promedio

La gráfica de optimización para el método de unión promedio indica que el número óptimo de grupos en el conjunto de datos analizado es 4. Esto se basa en la observación de que, después de este punto, la mejora en la métrica αg se vuelve mínima, sugiriendo que agregar más grupos no aporta beneficios significativos en la calidad del agrupamiento. En resumen, agrupar los datos en 4 clústeres permite una representación equilibrada y efectiva, facilitando un análisis más claro y útil de los patrones presentes en los datos.

hc_average = hclust(get_dist(data_, stand = T, method = "euclidean"), method = "average")

mojena = function(hc){
  n_hd = length(hc$height)
  alp_g = 0 ; alpha = hc$height[n_hd:1]
  for(i in 1:(n_hd-1)){
    alp_g[i] = mean(alpha[(n_hd-i+1):1])+1.25*sd(alpha[(n_hd-i+1):1])
  }
  nog = sum(alp_g<= alpha[-n_hd]) + 1
  plot(alpha[-n_hd], pch=20, col=(alp_g>alpha[-n_hd])+1, main = paste("Optimal number of groups =",nog),
       ylab = expression(alpha[g]), xlab="Nodes")}

mojena(hc_average)

Dendogramas optimizados

Los dendrogramas optimizados son representaciones visuales de la agrupación jerárquica que han sido ajustadas para mejorar la claridad y precisión en la interpretación de las relaciones entre los datos. Utilizan técnicas estadísticas y algoritmos para determinar el número óptimo de clústeres y el punto de corte adecuado en el dendrograma, facilitando una segmentación más significativa y precisa de los datos

Enlace Simple

El dendrograma muestra una jerarquía de agrupaciones de colores. Los colores cercanos en la parte inferior están más estrechamente relacionados (más similares) que aquellos que se unen a mayores alturas en el dendrograma. El método de enlace simple se centra en la menor distancia entre puntos de diferentes grupos para realizar las agrupaciones.

#suppressWarnings(fviz_dend(hc_single, k = 3, cex = 0.5, k_colors = "npg", color_labels_by_k = T, rect = T))

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Enlace Completo

La conclusión del dendrograma de enlace completo es que se puede identificar claramente la jerarquía de similitud entre los colores analizados. Los colores que se agrupan a alturas bajas en el dendrograma son más similares entre sí, mientras que aquellos que se unen a mayores alturas presentan una mayor disimilitud. Se observa que los colores como Crimson e Indigo son los más cercanos, formando un grupo compacto, mientras que otros grupos de colores, como los tonos cálidos y fríos, se separan a una distancia significativa. Esto sugiere que hay patrones claros en la relación de similitud entre los colores, lo que puede ser útil para tareas como la segmentación en diseño gráfico, análisis de tendencias o estudios de percepción del color.

#fviz_dend(hc_complete, k = 3, cex = 0.5, k_colors = "npg", color_labels_by_k = T, rect = T)

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Enlace Promedio

Este análisis revela la existencia de al menos tres grupos principales: uno de colores fríos, otro de colores cálidos y un tercero con tonos intermedios o neutros. La estructura del dendrograma permite identificar fácilmente estos patrones, lo que puede ser útil para aplicaciones en diseño, marketing o estudios relacionados con la percepción del color. El dendrograma proporciona una representación visual efectiva de la relación de similitud entre los colores, facilitando la identificación de agrupaciones significativas en el conjunto de datos.

#fviz_dend(hc_average, k = 4, cex = 0.5, k_colors = "npg", color_labels_by_k = T, rect = T)

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

4.3. Agrupación No-Jerárquica

La agrupación no jerárquica es un enfoque de análisis de datos en el que los datos se agrupan en clústeres sin una estructura jerárquica predefinida. A diferencia de los métodos jerárquicos, donde los grupos se forman de manera secuencial y se dividen o fusionan en niveles jerárquicos, en la agrupación no jerárquica cada observación se asigna a un grupo según ciertas características similares, sin un orden o estructura jerárquica. Un ejemplo común de este tipo de agrupación es el algoritmo K-means, que agrupa los datos en un número predefinido de clústeres.

En este proceso, el número de clústeres debe ser especificado antes de iniciar el análisis. El algoritmo busca dividir los datos de manera que los elementos dentro de cada grupo sean lo más similares posible entre sí, y lo más diferentes posible de los elementos de otros grupos. Para ello, se utilizan medidas de distancia, como la distancia euclidiana, para asignar los puntos a los grupos basándose en su proximidad en el espacio de características. A lo largo de varias iteraciones, el algoritmo ajusta la asignación de los puntos a los clústeres para minimizar las diferencias internas dentro de cada grupo.

Una característica importante de la agrupación no jerárquica es que no hay un árbol de decisiones o un enfoque jerárquico en la formación de grupos. En cambio, se busca una segmentación “plana”, donde todos los clústeres tienen el mismo nivel de importancia y no existen subgrupos dentro de los clústeres. Esto hace que los métodos no jerárquicos sean más adecuados para grandes conjuntos de datos, donde una estructura jerárquica sería demasiado compleja o poco práctica.

K-óptimos

Los K-óptimos son el resultado de una selección cuidadosa del número de clústeres que mejor reflejan la estructura subyacente de los datos, mejorando la interpretación y utilidad de los resultados de la agrupación.

Elbow

La tabla muestra cómo se puede elegir el número ideal de grupos o clústeres en un análisis de agrupamiento. La idea es encontrar un equilibrio entre tener suficientes grupos para capturar la diversidad de los datos y no crear demasiados grupos que no aporten información útil. Ayuda a decidir cuántos grupos se deben considerar al analizar los datos, buscando el número que mejor represente las diferencias sin complicar demasiado el análisis.

#fviz_nbclust(data_, kmeans, method = "wss") + geom_vline(xintercept = 3, linetype = 2)

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Silhouette

La tabla de silhouette muestra cómo se agrupan los datos según diferentes números de clústeres. Un mayor ancho de silueta indica un mejor agrupamiento. Los resultados sugieren que el número óptimo de clústeres está entre 4 y 5, con un máximo en 4, lo que indica que los datos se agrupan mejor con ese número.

#fviz_nbclust(data_, kmeans, method = "silhouette")

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Gap Statistic

La gráfica del estadístico Gap se utiliza para ayudar a determinar cuántos grupos o clústeres deberían formarse en un análisis de agrupamiento. La idea es comparar la calidad de agrupamiento de los datos de este conjunto con la de un conjunto de datos aleatorios.

#fviz_nbclust(data_, kmeans, method = "gap_stat")

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Majority Rule

Estas gráficas ayudan a tomar decisiones informadas sobre cuántos grupos establecer en el conjunto de datos, asegurando lograr un equilibrio entre una buena representación y la complejidad del modelo.

#suppressWarnings(NbClust(data = data_, diss = NULL, distance = "euclidean", min.nc = 2, max.nc = 10, method = "kmeans")$Best.nc)
#suppressWarnings(NbClust(data = data_, diss = NULL, distance = "euclidean", min.nc = 2, max.nc = 10, method = "kmeans")$Best.nc)

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

Resultados K-means

Los resultados de K-means describen cómo se agrupan los datos, cuán distintos son los clústeres y cómo se ajusta el modelo a los datos. Esto ayuda a interpretar patrones y relaciones dentro del conjunto de datos.

K-Optimo [wws] elbow

Este análisis K-óptimo proporciona una visión clara sobre cómo se agrupan los datos y qué tan bien se separan esos grupos entre sí. Esto es útil para entender patrones o tendencias en los datos.

set.seed(780728)
print(kmeans(data_, 4, nstart = 25))
## K-means clustering with 4 clusters of sizes 2, 6, 3, 1
## 
## Cluster means:
##   Duracion_de_sueno_S01 Calidad_de_sueno_S01 Nivel_actividad_fisica_S01
## 1             0.0100000            0.0000000                  0.0000000
## 2             0.5216667            0.7583333                  0.5533333
## 3             0.3066667            0.4333333                  0.3000000
## 4             0.5200000            0.6700000                  0.8100000
##   Presion_sistola_S01 Presion_distolica_S01 Frecuencia_cardiaca_S01
## 1           0.2000000             0.1666667               0.3250000
## 2           0.3366667             0.3361307               0.1916667
## 3           0.4666667             0.5138889               0.5566667
## 4           0.9400000             0.9363014               0.3500000
##   Pasos_diarios_S01
## 1         0.0000000
## 2         0.6583333
## 3         0.4666667
## 4         0.8200000
## 
## Clustering vector:
##  [1] 2 3 2 2 4 3 3 2 2 1 1 2
## 
## Within cluster sum of squares by cluster:
## [1] 0.3470056 1.0594097 0.3749907 0.0000000
##  (between_SS / total_SS =  68.6 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
K-Optimo [sil] siluette

Este análisis proporciona una visión clara sobre cómo se agrupan los datos en dos clusters, destacando las diferencias y similitudes dentro y entre esos grupos. Esto ayuda a identificar patrones o comportamientos en los datos que son significativos.

set.seed(780728)
print(kmeans(data_, 2, nstart = 25))
## K-means clustering with 2 clusters of sizes 2, 10
## 
## Cluster means:
##   Duracion_de_sueno_S01 Calidad_de_sueno_S01 Nivel_actividad_fisica_S01
## 1                 0.010                0.000                      0.000
## 2                 0.457                0.652                      0.503
##   Presion_sistola_S01 Presion_distolica_S01 Frecuencia_cardiaca_S01
## 1               0.200             0.1666667                   0.325
## 2               0.436             0.4494752                   0.317
##   Pasos_diarios_S01
## 1             0.000
## 2             0.617
## 
## Clustering vector:
##  [1] 2 2 2 2 2 2 2 2 2 1 1 2
## 
## Within cluster sum of squares by cluster:
## [1] 0.3470056 3.0054361
##  (between_SS / total_SS =  40.9 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Graficos K-means

Los gráficos K-means ayudan a validar visualmente la calidad de la agrupación y a interpretar cómo los datos se dividen en clústeres, facilitando la comprensión de las relaciones y patrones en los datos.

K-Optimo [wws] elbow

En esta gráfica de K-óptimo se visualizan los resultados de un análisis de agrupación K-means, representando los datos distribuidos en tres clústeres, cada uno identificado con un color distinto (azul, amarillo y cian). Muestra cómo se distribuyen y agrupan los datos en tres clústeres óptimos, permitiendo visualizar similitudes y diferencias entre grupos, así como patrones generales en las características de los datos.

#fviz_cluster(kmeans(data_, 3, nstart = 25), data = data_, palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#E7B801"), ellipse.type = "euclid", star.plot = TRUE, repel = TRUE, ggtheme = theme_minimal()

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

K-Optimo [sil] siluette

Esta gráfica de K-óptimo representa la agrupación de datos en dos clústeres (1 y 2), proyectados en dos dimensiones principales (Dim1 y Dim2) .

#fviz_cluster(kmeans(data_, 2, nstart = 25), data = data_, palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#E7B801"), ellipse.type = "euclid", star.plot = TRUE, repel = TRUE, ggtheme = theme_minimal()

Error cardata: este error se presenta al intentar buscar un archivo en una librería inexistente, ya que no fue posible instalarla debido a problemas técnicos internos y dependencias no satisfechas.

** el numero despues del data en los 4 casos de k-optimo es en los grupos que se dividio en los graficos de arriba , para eso puse el nombre del elbow y siluette , para saber con cual me guio**

Fase 5 [Análisis de Regresión]

5.1. Objetivos

Aplicar técnicas de análisis de regresión para modelar y cuantificar las relaciones entre variables, con el fin de realizar predicciones, identificar influencias significativas de variables independientes sobre la variable dependiente, y evaluar la calidad del ajuste del modelo.

5.2. Regresión Lineal Simple

La regresión lineal simple es un método estadístico que se utiliza para modelar la relación entre dos variables: una variable dependiente (o respuesta) y una variable independiente (o predictora). Esta relación se describe mediante una línea recta que mejor ajusta los datos, conocida como la línea de regresión. La regresión lineal simple es una herramienta poderosa para entender y cuantificar relaciones lineales entre dos variables, siendo ampliamente utilizada en diversas áreas, como economía, ciencias sociales y medicina. Permite realizar predicciones, evaluar la dependencia entre variables y determinar si la relación observada es estadísticamente significativa. Sin embargo, es importante verificar las suposiciones del modelo (como la linealidad, independencia de errores, y homocedasticidad) para garantizar la validez de los resultados.

Resumen de Edad

Este gráfico es un diagrama de caja y bigotes (boxplot) que resume la distribución de la variable Edad. Este boxplot proporciona un resumen visual del rango, mediana y dispersión de la variable Edad, mostrando que los datos están distribuidos de forma equilibrada sin valores atípicos evidentes.

summary(cdd_salud_y_estilos_de_vida_depurado$Edad)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   27.00   35.25   43.00   42.18   50.00   59.00
boxplot(cdd_salud_y_estilos_de_vida_depurado$Edad, main = "Diagrama de Caja de Edad", col = c("orange"))

Resumen de IMC

El diagrama indica que la mayoría de los precios se concentran en torno a la mediana, pero hay varios precios mucho más altos que afectan la distribución, como se puede observar por la presencia de los outliers.

summary(cdd_salud_y_estilos_de_vida_depurado$IMC)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   1.000   1.000   1.818   3.000   3.000
boxplot(cdd_salud_y_estilos_de_vida_depurado$IMC, main = "Diagrama de Caja de IMC", col = c("orange"))

Diagrama de Dispersion Edad vs IMC.

El diagrama de dispersión muestra la relación entre la edad de los pacientes y su IMC. Se observa una fuerte concentración de datos en precios bajos y una amplia gama de edades, indicando que la mayoría de los vehículos son relativamente baratos y abarcan un rango amplio de edades de las personas. Hay algunos puntos dispersos a precios más altos, sugiriendo la existencia de vehículos más caros, generalmentede personas mas jóvenes.

plot(cdd_salud_y_estilos_de_vida_depurado$Edad, cdd_salud_y_estilos_de_vida_depurado$IMC, main = "Diagrama de Dispersión Edad vs. IMC")

Diagramas Totales de Dispersión

Los totales de dispersión muestran un diagrama de dispersión de pares que visualiza las relaciones entre cuatro variables: Edad, Precio, Presion sistola y Presion diastola. Cada panel muestra la relación entre dos variables. Los puntos representan las observaciones individuales, y la densidad de los puntos indica la frecuencia de ocurrencia en esa región del espacio. Observamos que hay muchos puntos superpuestos, lo que hace difícil ver todas las relaciones individuales con claridad.

pairs(~Edad + IMC + Presion_sistola + Presion_diastola, data = cdd_salud_y_estilos_de_vida_depurado)

Formulación del modelo de RLS entre las variables de estudio.

La navegación a través de las pestañas muestra los coeficientes del modelo de regresión lineal simple, su resumen estadístico y su tabla ANOVA. Se menciona de nuevo que las variables de interés son: IMC (variable dependiente) y Edad (variable independiente). Al considerar los resultados presentados en la pestaña Coeficientes del Modelo RLS se puede establer que el modelo de regresión lineal simple que relaciona a las variables de interés. Tiene la formulación:

Coeficientes del Modelo RLS

El código ajusta un modelo de regresión lineal simple para predecir la edad en función de su precio IMC. Luego, obtenemos los coeficientes del modelo (el intercepto y la pendiente) que indican la relación matemática entre estas dos variables.

modelo_RL_Simple = lm(cdd_salud_y_estilos_de_vida_depurado$Edad~cdd_salud_y_estilos_de_vida_depurado$IMC)
coef(modelo_RL_Simple)
##                              (Intercept) 
##                                33.675984 
## cdd_salud_y_estilos_de_vida_depurado$IMC 
##                                 4.679679

Resumen Estadístico del Modelo RLS

La tabla sugiere que hay una relación significativa entre la edad y el IMC de los pacientes .

summary(modelo_RL_Simple)
## 
## Call:
## lm(formula = cdd_salud_y_estilos_de_vida_depurado$Edad ~ cdd_salud_y_estilos_de_vida_depurado$IMC)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -20.715  -5.276  -1.356   4.285  17.644 
## 
## Coefficients:
##                                          Estimate Std. Error t value Pr(>|t|)
## (Intercept)                               33.6760     0.8129   41.43   <2e-16
## cdd_salud_y_estilos_de_vida_depurado$IMC   4.6797     0.3945   11.86   <2e-16
##                                             
## (Intercept)                              ***
## cdd_salud_y_estilos_de_vida_depurado$IMC ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.398 on 372 degrees of freedom
## Multiple R-squared:  0.2745, Adjusted R-squared:  0.2725 
## F-statistic: 140.7 on 1 and 372 DF,  p-value: < 2.2e-16

Tabla ANOVA para el Modelo RLS

La tabla ANOVA indica que el modelo no explica significativamente la variación en la edad de los pacientes en función de su IMC. Con un valor p alto y un estadístico F bajo, podemos concluir que hay una relación estadísticamente significativa entre estas dos variables en este conjunto de datos.

anova(modelo_RL_Simple)
## Analysis of Variance Table
## 
## Response: cdd_salud_y_estilos_de_vida_depurado$Edad
##                                           Df  Sum Sq Mean Sq F value    Pr(>F)
## cdd_salud_y_estilos_de_vida_depurado$IMC   1  7700.6  7700.6  140.72 < 2.2e-16
## Residuals                                372 20357.6    54.7                  
##                                             
## cdd_salud_y_estilos_de_vida_depurado$IMC ***
## Residuals                                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Análisis del modelo RLS.

El análisis del modelo RLS muestra que no es muy significativo y en consecuencia aporta poca información relevante para estimar Edad a partir de IMC.:

Intervalo de Confianza para B1

confint(modelo_RL_Simple, level = 0.95)
##                                              2.5 %    97.5 %
## (Intercept)                              32.077537 35.274431
## cdd_salud_y_estilos_de_vida_depurado$IMC  3.903953  5.455406

Predicciones y sus Intervalos de Predicción

predict(modelo_RL_Simple, data.frame(seq(1,400)), interval='prediction', level = 0.95)
## Warning: 'newdata' had 400 rows but variables found have 374 rows
##          fit      lwr      upr
## 1   47.71502 33.12036 62.30968
## 2   38.35566 23.77600 52.93532
## 3   38.35566 23.77600 52.93532
## 4   43.03534 28.46882 57.60186
## 5   43.03534 28.46882 57.60186
## 6   43.03534 28.46882 57.60186
## 7   43.03534 28.46882 57.60186
## 8   38.35566 23.77600 52.93532
## 9   38.35566 23.77600 52.93532
## 10  38.35566 23.77600 52.93532
## 11  38.35566 23.77600 52.93532
## 12  38.35566 23.77600 52.93532
## 13  38.35566 23.77600 52.93532
## 14  38.35566 23.77600 52.93532
## 15  38.35566 23.77600 52.93532
## 16  38.35566 23.77600 52.93532
## 17  38.35566 23.77600 52.93532
## 18  38.35566 23.77600 52.93532
## 19  38.35566 23.77600 52.93532
## 20  38.35566 23.77600 52.93532
## 21  38.35566 23.77600 52.93532
## 22  38.35566 23.77600 52.93532
## 23  38.35566 23.77600 52.93532
## 24  38.35566 23.77600 52.93532
## 25  38.35566 23.77600 52.93532
## 26  38.35566 23.77600 52.93532
## 27  38.35566 23.77600 52.93532
## 28  38.35566 23.77600 52.93532
## 29  38.35566 23.77600 52.93532
## 30  38.35566 23.77600 52.93532
## 31  38.35566 23.77600 52.93532
## 32  38.35566 23.77600 52.93532
## 33  38.35566 23.77600 52.93532
## 34  38.35566 23.77600 52.93532
## 35  38.35566 23.77600 52.93532
## 36  38.35566 23.77600 52.93532
## 37  38.35566 23.77600 52.93532
## 38  38.35566 23.77600 52.93532
## 39  38.35566 23.77600 52.93532
## 40  38.35566 23.77600 52.93532
## 41  38.35566 23.77600 52.93532
## 42  38.35566 23.77600 52.93532
## 43  38.35566 23.77600 52.93532
## 44  38.35566 23.77600 52.93532
## 45  38.35566 23.77600 52.93532
## 46  38.35566 23.77600 52.93532
## 47  38.35566 23.77600 52.93532
## 48  38.35566 23.77600 52.93532
## 49  38.35566 23.77600 52.93532
## 50  38.35566 23.77600 52.93532
## 51  38.35566 23.77600 52.93532
## 52  38.35566 23.77600 52.93532
## 53  38.35566 23.77600 52.93532
## 54  38.35566 23.77600 52.93532
## 55  38.35566 23.77600 52.93532
## 56  38.35566 23.77600 52.93532
## 57  38.35566 23.77600 52.93532
## 58  38.35566 23.77600 52.93532
## 59  38.35566 23.77600 52.93532
## 60  38.35566 23.77600 52.93532
## 61  38.35566 23.77600 52.93532
## 62  38.35566 23.77600 52.93532
## 63  38.35566 23.77600 52.93532
## 64  38.35566 23.77600 52.93532
## 65  38.35566 23.77600 52.93532
## 66  38.35566 23.77600 52.93532
## 67  38.35566 23.77600 52.93532
## 68  38.35566 23.77600 52.93532
## 69  47.71502 33.12036 62.30968
## 70  47.71502 33.12036 62.30968
## 71  38.35566 23.77600 52.93532
## 72  38.35566 23.77600 52.93532
## 73  38.35566 23.77600 52.93532
## 74  38.35566 23.77600 52.93532
## 75  38.35566 23.77600 52.93532
## 76  38.35566 23.77600 52.93532
## 77  38.35566 23.77600 52.93532
## 78  38.35566 23.77600 52.93532
## 79  38.35566 23.77600 52.93532
## 80  38.35566 23.77600 52.93532
## 81  47.71502 33.12036 62.30968
## 82  47.71502 33.12036 62.30968
## 83  47.71502 33.12036 62.30968
## 84  47.71502 33.12036 62.30968
## 85  38.35566 23.77600 52.93532
## 86  38.35566 23.77600 52.93532
## 87  38.35566 23.77600 52.93532
## 88  38.35566 23.77600 52.93532
## 89  38.35566 23.77600 52.93532
## 90  38.35566 23.77600 52.93532
## 91  38.35566 23.77600 52.93532
## 92  38.35566 23.77600 52.93532
## 93  38.35566 23.77600 52.93532
## 94  43.03534 28.46882 57.60186
## 95  38.35566 23.77600 52.93532
## 96  38.35566 23.77600 52.93532
## 97  38.35566 23.77600 52.93532
## 98  38.35566 23.77600 52.93532
## 99  38.35566 23.77600 52.93532
## 100 38.35566 23.77600 52.93532
## 101 38.35566 23.77600 52.93532
## 102 38.35566 23.77600 52.93532
## 103 38.35566 23.77600 52.93532
## 104 47.71502 33.12036 62.30968
## 105 38.35566 23.77600 52.93532
## 106 47.71502 33.12036 62.30968
## 107 47.71502 33.12036 62.30968
## 108 38.35566 23.77600 52.93532
## 109 38.35566 23.77600 52.93532
## 110 38.35566 23.77600 52.93532
## 111 38.35566 23.77600 52.93532
## 112 38.35566 23.77600 52.93532
## 113 38.35566 23.77600 52.93532
## 114 38.35566 23.77600 52.93532
## 115 38.35566 23.77600 52.93532
## 116 38.35566 23.77600 52.93532
## 117 38.35566 23.77600 52.93532
## 118 38.35566 23.77600 52.93532
## 119 38.35566 23.77600 52.93532
## 120 38.35566 23.77600 52.93532
## 121 38.35566 23.77600 52.93532
## 122 38.35566 23.77600 52.93532
## 123 38.35566 23.77600 52.93532
## 124 38.35566 23.77600 52.93532
## 125 38.35566 23.77600 52.93532
## 126 38.35566 23.77600 52.93532
## 127 38.35566 23.77600 52.93532
## 128 38.35566 23.77600 52.93532
## 129 38.35566 23.77600 52.93532
## 130 38.35566 23.77600 52.93532
## 131 38.35566 23.77600 52.93532
## 132 38.35566 23.77600 52.93532
## 133 38.35566 23.77600 52.93532
## 134 38.35566 23.77600 52.93532
## 135 38.35566 23.77600 52.93532
## 136 38.35566 23.77600 52.93532
## 137 38.35566 23.77600 52.93532
## 138 38.35566 23.77600 52.93532
## 139 38.35566 23.77600 52.93532
## 140 38.35566 23.77600 52.93532
## 141 38.35566 23.77600 52.93532
## 142 38.35566 23.77600 52.93532
## 143 38.35566 23.77600 52.93532
## 144 38.35566 23.77600 52.93532
## 145 38.35566 23.77600 52.93532
## 146 43.03534 28.46882 57.60186
## 147 38.35566 23.77600 52.93532
## 148 47.71502 33.12036 62.30968
## 149 38.35566 23.77600 52.93532
## 150 38.35566 23.77600 52.93532
## 151 38.35566 23.77600 52.93532
## 152 38.35566 23.77600 52.93532
## 153 38.35566 23.77600 52.93532
## 154 38.35566 23.77600 52.93532
## 155 38.35566 23.77600 52.93532
## 156 38.35566 23.77600 52.93532
## 157 38.35566 23.77600 52.93532
## 158 38.35566 23.77600 52.93532
## 159 38.35566 23.77600 52.93532
## 160 38.35566 23.77600 52.93532
## 161 38.35566 23.77600 52.93532
## 162 38.35566 23.77600 52.93532
## 163 38.35566 23.77600 52.93532
## 164 38.35566 23.77600 52.93532
## 165 38.35566 23.77600 52.93532
## 166 38.35566 23.77600 52.93532
## 167 38.35566 23.77600 52.93532
## 168 47.71502 33.12036 62.30968
## 169 47.71502 33.12036 62.30968
## 170 38.35566 23.77600 52.93532
## 171 38.35566 23.77600 52.93532
## 172 38.35566 23.77600 52.93532
## 173 38.35566 23.77600 52.93532
## 174 38.35566 23.77600 52.93532
## 175 38.35566 23.77600 52.93532
## 176 38.35566 23.77600 52.93532
## 177 38.35566 23.77600 52.93532
## 178 47.71502 33.12036 62.30968
## 179 38.35566 23.77600 52.93532
## 180 38.35566 23.77600 52.93532
## 181 38.35566 23.77600 52.93532
## 182 38.35566 23.77600 52.93532
## 183 38.35566 23.77600 52.93532
## 184 38.35566 23.77600 52.93532
## 185 47.71502 33.12036 62.30968
## 186 47.71502 33.12036 62.30968
## 187 47.71502 33.12036 62.30968
## 188 47.71502 33.12036 62.30968
## 189 47.71502 33.12036 62.30968
## 190 47.71502 33.12036 62.30968
## 191 47.71502 33.12036 62.30968
## 192 47.71502 33.12036 62.30968
## 193 47.71502 33.12036 62.30968
## 194 47.71502 33.12036 62.30968
## 195 47.71502 33.12036 62.30968
## 196 47.71502 33.12036 62.30968
## 197 47.71502 33.12036 62.30968
## 198 47.71502 33.12036 62.30968
## 199 47.71502 33.12036 62.30968
## 200 47.71502 33.12036 62.30968
## 201 47.71502 33.12036 62.30968
## 202 38.35566 23.77600 52.93532
## 203 38.35566 23.77600 52.93532
## 204 38.35566 23.77600 52.93532
## 205 47.71502 33.12036 62.30968
## 206 38.35566 23.77600 52.93532
## 207 38.35566 23.77600 52.93532
## 208 38.35566 23.77600 52.93532
## 209 38.35566 23.77600 52.93532
## 210 38.35566 23.77600 52.93532
## 211 38.35566 23.77600 52.93532
## 212 38.35566 23.77600 52.93532
## 213 38.35566 23.77600 52.93532
## 214 38.35566 23.77600 52.93532
## 215 38.35566 23.77600 52.93532
## 216 38.35566 23.77600 52.93532
## 217 38.35566 23.77600 52.93532
## 218 38.35566 23.77600 52.93532
## 219 38.35566 23.77600 52.93532
## 220 47.71502 33.12036 62.30968
## 221 47.71502 33.12036 62.30968
## 222 47.71502 33.12036 62.30968
## 223 47.71502 33.12036 62.30968
## 224 47.71502 33.12036 62.30968
## 225 47.71502 33.12036 62.30968
## 226 47.71502 33.12036 62.30968
## 227 47.71502 33.12036 62.30968
## 228 47.71502 33.12036 62.30968
## 229 47.71502 33.12036 62.30968
## 230 47.71502 33.12036 62.30968
## 231 47.71502 33.12036 62.30968
## 232 47.71502 33.12036 62.30968
## 233 47.71502 33.12036 62.30968
## 234 47.71502 33.12036 62.30968
## 235 47.71502 33.12036 62.30968
## 236 47.71502 33.12036 62.30968
## 237 47.71502 33.12036 62.30968
## 238 47.71502 33.12036 62.30968
## 239 47.71502 33.12036 62.30968
## 240 47.71502 33.12036 62.30968
## 241 47.71502 33.12036 62.30968
## 242 47.71502 33.12036 62.30968
## 243 47.71502 33.12036 62.30968
## 244 47.71502 33.12036 62.30968
## 245 47.71502 33.12036 62.30968
## 246 47.71502 33.12036 62.30968
## 247 47.71502 33.12036 62.30968
## 248 47.71502 33.12036 62.30968
## 249 47.71502 33.12036 62.30968
## 250 47.71502 33.12036 62.30968
## 251 47.71502 33.12036 62.30968
## 252 47.71502 33.12036 62.30968
## 253 47.71502 33.12036 62.30968
## 254 47.71502 33.12036 62.30968
## 255 47.71502 33.12036 62.30968
## 256 47.71502 33.12036 62.30968
## 257 47.71502 33.12036 62.30968
## 258 47.71502 33.12036 62.30968
## 259 47.71502 33.12036 62.30968
## 260 47.71502 33.12036 62.30968
## 261 47.71502 33.12036 62.30968
## 262 47.71502 33.12036 62.30968
## 263 47.71502 33.12036 62.30968
## 264 47.71502 33.12036 62.30968
## 265 43.03534 28.46882 57.60186
## 266 47.71502 33.12036 62.30968
## 267 43.03534 28.46882 57.60186
## 268 47.71502 33.12036 62.30968
## 269 47.71502 33.12036 62.30968
## 270 47.71502 33.12036 62.30968
## 271 47.71502 33.12036 62.30968
## 272 47.71502 33.12036 62.30968
## 273 47.71502 33.12036 62.30968
## 274 47.71502 33.12036 62.30968
## 275 47.71502 33.12036 62.30968
## 276 47.71502 33.12036 62.30968
## 277 43.03534 28.46882 57.60186
## 278 43.03534 28.46882 57.60186
## 279 47.71502 33.12036 62.30968
## 280 38.35566 23.77600 52.93532
## 281 47.71502 33.12036 62.30968
## 282 47.71502 33.12036 62.30968
## 283 47.71502 33.12036 62.30968
## 284 47.71502 33.12036 62.30968
## 285 47.71502 33.12036 62.30968
## 286 47.71502 33.12036 62.30968
## 287 47.71502 33.12036 62.30968
## 288 47.71502 33.12036 62.30968
## 289 47.71502 33.12036 62.30968
## 290 47.71502 33.12036 62.30968
## 291 47.71502 33.12036 62.30968
## 292 47.71502 33.12036 62.30968
## 293 47.71502 33.12036 62.30968
## 294 47.71502 33.12036 62.30968
## 295 47.71502 33.12036 62.30968
## 296 47.71502 33.12036 62.30968
## 297 47.71502 33.12036 62.30968
## 298 47.71502 33.12036 62.30968
## 299 38.35566 23.77600 52.93532
## 300 38.35566 23.77600 52.93532
## 301 38.35566 23.77600 52.93532
## 302 38.35566 23.77600 52.93532
## 303 38.35566 23.77600 52.93532
## 304 47.71502 33.12036 62.30968
## 305 47.71502 33.12036 62.30968
## 306 47.71502 33.12036 62.30968
## 307 47.71502 33.12036 62.30968
## 308 47.71502 33.12036 62.30968
## 309 47.71502 33.12036 62.30968
## 310 47.71502 33.12036 62.30968
## 311 47.71502 33.12036 62.30968
## 312 47.71502 33.12036 62.30968
## 313 38.35566 23.77600 52.93532
## 314 38.35566 23.77600 52.93532
## 315 38.35566 23.77600 52.93532
## 316 38.35566 23.77600 52.93532
## 317 38.35566 23.77600 52.93532
## 318 38.35566 23.77600 52.93532
## 319 38.35566 23.77600 52.93532
## 320 38.35566 23.77600 52.93532
## 321 38.35566 23.77600 52.93532
## 322 38.35566 23.77600 52.93532
## 323 38.35566 23.77600 52.93532
## 324 38.35566 23.77600 52.93532
## 325 38.35566 23.77600 52.93532
## 326 38.35566 23.77600 52.93532
## 327 38.35566 23.77600 52.93532
## 328 38.35566 23.77600 52.93532
## 329 38.35566 23.77600 52.93532
## 330 38.35566 23.77600 52.93532
## 331 38.35566 23.77600 52.93532
## 332 38.35566 23.77600 52.93532
## 333 38.35566 23.77600 52.93532
## 334 38.35566 23.77600 52.93532
## 335 38.35566 23.77600 52.93532
## 336 38.35566 23.77600 52.93532
## 337 38.35566 23.77600 52.93532
## 338 38.35566 23.77600 52.93532
## 339 38.35566 23.77600 52.93532
## 340 47.71502 33.12036 62.30968
## 341 47.71502 33.12036 62.30968
## 342 38.35566 23.77600 52.93532
## 343 38.35566 23.77600 52.93532
## 344 47.71502 33.12036 62.30968
## 345 47.71502 33.12036 62.30968
## 346 47.71502 33.12036 62.30968
## 347 47.71502 33.12036 62.30968
## 348 47.71502 33.12036 62.30968
## 349 47.71502 33.12036 62.30968
## 350 47.71502 33.12036 62.30968
## 351 47.71502 33.12036 62.30968
## 352 47.71502 33.12036 62.30968
## 353 47.71502 33.12036 62.30968
## 354 47.71502 33.12036 62.30968
## 355 47.71502 33.12036 62.30968
## 356 47.71502 33.12036 62.30968
## 357 47.71502 33.12036 62.30968
## 358 47.71502 33.12036 62.30968
## 359 47.71502 33.12036 62.30968
## 360 47.71502 33.12036 62.30968
## 361 47.71502 33.12036 62.30968
## 362 47.71502 33.12036 62.30968
## 363 47.71502 33.12036 62.30968
## 364 47.71502 33.12036 62.30968
## 365 47.71502 33.12036 62.30968
## 366 47.71502 33.12036 62.30968
## 367 47.71502 33.12036 62.30968
## 368 47.71502 33.12036 62.30968
## 369 47.71502 33.12036 62.30968
## 370 47.71502 33.12036 62.30968
## 371 47.71502 33.12036 62.30968
## 372 47.71502 33.12036 62.30968
## 373 47.71502 33.12036 62.30968
## 374 47.71502 33.12036 62.30968

Predicciones y sus Intervalos de Confianza

predict(modelo_RL_Simple, data.frame(seq(1,200)), interval='confidence', level = 0.95)
## Warning: 'newdata' had 200 rows but variables found have 374 rows
##          fit      lwr      upr
## 1   47.71502 46.52918 48.90087
## 2   38.35566 37.37149 39.33984
## 3   38.35566 37.37149 39.33984
## 4   43.03534 42.27006 43.80063
## 5   43.03534 42.27006 43.80063
## 6   43.03534 42.27006 43.80063
## 7   43.03534 42.27006 43.80063
## 8   38.35566 37.37149 39.33984
## 9   38.35566 37.37149 39.33984
## 10  38.35566 37.37149 39.33984
## 11  38.35566 37.37149 39.33984
## 12  38.35566 37.37149 39.33984
## 13  38.35566 37.37149 39.33984
## 14  38.35566 37.37149 39.33984
## 15  38.35566 37.37149 39.33984
## 16  38.35566 37.37149 39.33984
## 17  38.35566 37.37149 39.33984
## 18  38.35566 37.37149 39.33984
## 19  38.35566 37.37149 39.33984
## 20  38.35566 37.37149 39.33984
## 21  38.35566 37.37149 39.33984
## 22  38.35566 37.37149 39.33984
## 23  38.35566 37.37149 39.33984
## 24  38.35566 37.37149 39.33984
## 25  38.35566 37.37149 39.33984
## 26  38.35566 37.37149 39.33984
## 27  38.35566 37.37149 39.33984
## 28  38.35566 37.37149 39.33984
## 29  38.35566 37.37149 39.33984
## 30  38.35566 37.37149 39.33984
## 31  38.35566 37.37149 39.33984
## 32  38.35566 37.37149 39.33984
## 33  38.35566 37.37149 39.33984
## 34  38.35566 37.37149 39.33984
## 35  38.35566 37.37149 39.33984
## 36  38.35566 37.37149 39.33984
## 37  38.35566 37.37149 39.33984
## 38  38.35566 37.37149 39.33984
## 39  38.35566 37.37149 39.33984
## 40  38.35566 37.37149 39.33984
## 41  38.35566 37.37149 39.33984
## 42  38.35566 37.37149 39.33984
## 43  38.35566 37.37149 39.33984
## 44  38.35566 37.37149 39.33984
## 45  38.35566 37.37149 39.33984
## 46  38.35566 37.37149 39.33984
## 47  38.35566 37.37149 39.33984
## 48  38.35566 37.37149 39.33984
## 49  38.35566 37.37149 39.33984
## 50  38.35566 37.37149 39.33984
## 51  38.35566 37.37149 39.33984
## 52  38.35566 37.37149 39.33984
## 53  38.35566 37.37149 39.33984
## 54  38.35566 37.37149 39.33984
## 55  38.35566 37.37149 39.33984
## 56  38.35566 37.37149 39.33984
## 57  38.35566 37.37149 39.33984
## 58  38.35566 37.37149 39.33984
## 59  38.35566 37.37149 39.33984
## 60  38.35566 37.37149 39.33984
## 61  38.35566 37.37149 39.33984
## 62  38.35566 37.37149 39.33984
## 63  38.35566 37.37149 39.33984
## 64  38.35566 37.37149 39.33984
## 65  38.35566 37.37149 39.33984
## 66  38.35566 37.37149 39.33984
## 67  38.35566 37.37149 39.33984
## 68  38.35566 37.37149 39.33984
## 69  47.71502 46.52918 48.90087
## 70  47.71502 46.52918 48.90087
## 71  38.35566 37.37149 39.33984
## 72  38.35566 37.37149 39.33984
## 73  38.35566 37.37149 39.33984
## 74  38.35566 37.37149 39.33984
## 75  38.35566 37.37149 39.33984
## 76  38.35566 37.37149 39.33984
## 77  38.35566 37.37149 39.33984
## 78  38.35566 37.37149 39.33984
## 79  38.35566 37.37149 39.33984
## 80  38.35566 37.37149 39.33984
## 81  47.71502 46.52918 48.90087
## 82  47.71502 46.52918 48.90087
## 83  47.71502 46.52918 48.90087
## 84  47.71502 46.52918 48.90087
## 85  38.35566 37.37149 39.33984
## 86  38.35566 37.37149 39.33984
## 87  38.35566 37.37149 39.33984
## 88  38.35566 37.37149 39.33984
## 89  38.35566 37.37149 39.33984
## 90  38.35566 37.37149 39.33984
## 91  38.35566 37.37149 39.33984
## 92  38.35566 37.37149 39.33984
## 93  38.35566 37.37149 39.33984
## 94  43.03534 42.27006 43.80063
## 95  38.35566 37.37149 39.33984
## 96  38.35566 37.37149 39.33984
## 97  38.35566 37.37149 39.33984
## 98  38.35566 37.37149 39.33984
## 99  38.35566 37.37149 39.33984
## 100 38.35566 37.37149 39.33984
## 101 38.35566 37.37149 39.33984
## 102 38.35566 37.37149 39.33984
## 103 38.35566 37.37149 39.33984
## 104 47.71502 46.52918 48.90087
## 105 38.35566 37.37149 39.33984
## 106 47.71502 46.52918 48.90087
## 107 47.71502 46.52918 48.90087
## 108 38.35566 37.37149 39.33984
## 109 38.35566 37.37149 39.33984
## 110 38.35566 37.37149 39.33984
## 111 38.35566 37.37149 39.33984
## 112 38.35566 37.37149 39.33984
## 113 38.35566 37.37149 39.33984
## 114 38.35566 37.37149 39.33984
## 115 38.35566 37.37149 39.33984
## 116 38.35566 37.37149 39.33984
## 117 38.35566 37.37149 39.33984
## 118 38.35566 37.37149 39.33984
## 119 38.35566 37.37149 39.33984
## 120 38.35566 37.37149 39.33984
## 121 38.35566 37.37149 39.33984
## 122 38.35566 37.37149 39.33984
## 123 38.35566 37.37149 39.33984
## 124 38.35566 37.37149 39.33984
## 125 38.35566 37.37149 39.33984
## 126 38.35566 37.37149 39.33984
## 127 38.35566 37.37149 39.33984
## 128 38.35566 37.37149 39.33984
## 129 38.35566 37.37149 39.33984
## 130 38.35566 37.37149 39.33984
## 131 38.35566 37.37149 39.33984
## 132 38.35566 37.37149 39.33984
## 133 38.35566 37.37149 39.33984
## 134 38.35566 37.37149 39.33984
## 135 38.35566 37.37149 39.33984
## 136 38.35566 37.37149 39.33984
## 137 38.35566 37.37149 39.33984
## 138 38.35566 37.37149 39.33984
## 139 38.35566 37.37149 39.33984
## 140 38.35566 37.37149 39.33984
## 141 38.35566 37.37149 39.33984
## 142 38.35566 37.37149 39.33984
## 143 38.35566 37.37149 39.33984
## 144 38.35566 37.37149 39.33984
## 145 38.35566 37.37149 39.33984
## 146 43.03534 42.27006 43.80063
## 147 38.35566 37.37149 39.33984
## 148 47.71502 46.52918 48.90087
## 149 38.35566 37.37149 39.33984
## 150 38.35566 37.37149 39.33984
## 151 38.35566 37.37149 39.33984
## 152 38.35566 37.37149 39.33984
## 153 38.35566 37.37149 39.33984
## 154 38.35566 37.37149 39.33984
## 155 38.35566 37.37149 39.33984
## 156 38.35566 37.37149 39.33984
## 157 38.35566 37.37149 39.33984
## 158 38.35566 37.37149 39.33984
## 159 38.35566 37.37149 39.33984
## 160 38.35566 37.37149 39.33984
## 161 38.35566 37.37149 39.33984
## 162 38.35566 37.37149 39.33984
## 163 38.35566 37.37149 39.33984
## 164 38.35566 37.37149 39.33984
## 165 38.35566 37.37149 39.33984
## 166 38.35566 37.37149 39.33984
## 167 38.35566 37.37149 39.33984
## 168 47.71502 46.52918 48.90087
## 169 47.71502 46.52918 48.90087
## 170 38.35566 37.37149 39.33984
## 171 38.35566 37.37149 39.33984
## 172 38.35566 37.37149 39.33984
## 173 38.35566 37.37149 39.33984
## 174 38.35566 37.37149 39.33984
## 175 38.35566 37.37149 39.33984
## 176 38.35566 37.37149 39.33984
## 177 38.35566 37.37149 39.33984
## 178 47.71502 46.52918 48.90087
## 179 38.35566 37.37149 39.33984
## 180 38.35566 37.37149 39.33984
## 181 38.35566 37.37149 39.33984
## 182 38.35566 37.37149 39.33984
## 183 38.35566 37.37149 39.33984
## 184 38.35566 37.37149 39.33984
## 185 47.71502 46.52918 48.90087
## 186 47.71502 46.52918 48.90087
## 187 47.71502 46.52918 48.90087
## 188 47.71502 46.52918 48.90087
## 189 47.71502 46.52918 48.90087
## 190 47.71502 46.52918 48.90087
## 191 47.71502 46.52918 48.90087
## 192 47.71502 46.52918 48.90087
## 193 47.71502 46.52918 48.90087
## 194 47.71502 46.52918 48.90087
## 195 47.71502 46.52918 48.90087
## 196 47.71502 46.52918 48.90087
## 197 47.71502 46.52918 48.90087
## 198 47.71502 46.52918 48.90087
## 199 47.71502 46.52918 48.90087
## 200 47.71502 46.52918 48.90087
## 201 47.71502 46.52918 48.90087
## 202 38.35566 37.37149 39.33984
## 203 38.35566 37.37149 39.33984
## 204 38.35566 37.37149 39.33984
## 205 47.71502 46.52918 48.90087
## 206 38.35566 37.37149 39.33984
## 207 38.35566 37.37149 39.33984
## 208 38.35566 37.37149 39.33984
## 209 38.35566 37.37149 39.33984
## 210 38.35566 37.37149 39.33984
## 211 38.35566 37.37149 39.33984
## 212 38.35566 37.37149 39.33984
## 213 38.35566 37.37149 39.33984
## 214 38.35566 37.37149 39.33984
## 215 38.35566 37.37149 39.33984
## 216 38.35566 37.37149 39.33984
## 217 38.35566 37.37149 39.33984
## 218 38.35566 37.37149 39.33984
## 219 38.35566 37.37149 39.33984
## 220 47.71502 46.52918 48.90087
## 221 47.71502 46.52918 48.90087
## 222 47.71502 46.52918 48.90087
## 223 47.71502 46.52918 48.90087
## 224 47.71502 46.52918 48.90087
## 225 47.71502 46.52918 48.90087
## 226 47.71502 46.52918 48.90087
## 227 47.71502 46.52918 48.90087
## 228 47.71502 46.52918 48.90087
## 229 47.71502 46.52918 48.90087
## 230 47.71502 46.52918 48.90087
## 231 47.71502 46.52918 48.90087
## 232 47.71502 46.52918 48.90087
## 233 47.71502 46.52918 48.90087
## 234 47.71502 46.52918 48.90087
## 235 47.71502 46.52918 48.90087
## 236 47.71502 46.52918 48.90087
## 237 47.71502 46.52918 48.90087
## 238 47.71502 46.52918 48.90087
## 239 47.71502 46.52918 48.90087
## 240 47.71502 46.52918 48.90087
## 241 47.71502 46.52918 48.90087
## 242 47.71502 46.52918 48.90087
## 243 47.71502 46.52918 48.90087
## 244 47.71502 46.52918 48.90087
## 245 47.71502 46.52918 48.90087
## 246 47.71502 46.52918 48.90087
## 247 47.71502 46.52918 48.90087
## 248 47.71502 46.52918 48.90087
## 249 47.71502 46.52918 48.90087
## 250 47.71502 46.52918 48.90087
## 251 47.71502 46.52918 48.90087
## 252 47.71502 46.52918 48.90087
## 253 47.71502 46.52918 48.90087
## 254 47.71502 46.52918 48.90087
## 255 47.71502 46.52918 48.90087
## 256 47.71502 46.52918 48.90087
## 257 47.71502 46.52918 48.90087
## 258 47.71502 46.52918 48.90087
## 259 47.71502 46.52918 48.90087
## 260 47.71502 46.52918 48.90087
## 261 47.71502 46.52918 48.90087
## 262 47.71502 46.52918 48.90087
## 263 47.71502 46.52918 48.90087
## 264 47.71502 46.52918 48.90087
## 265 43.03534 42.27006 43.80063
## 266 47.71502 46.52918 48.90087
## 267 43.03534 42.27006 43.80063
## 268 47.71502 46.52918 48.90087
## 269 47.71502 46.52918 48.90087
## 270 47.71502 46.52918 48.90087
## 271 47.71502 46.52918 48.90087
## 272 47.71502 46.52918 48.90087
## 273 47.71502 46.52918 48.90087
## 274 47.71502 46.52918 48.90087
## 275 47.71502 46.52918 48.90087
## 276 47.71502 46.52918 48.90087
## 277 43.03534 42.27006 43.80063
## 278 43.03534 42.27006 43.80063
## 279 47.71502 46.52918 48.90087
## 280 38.35566 37.37149 39.33984
## 281 47.71502 46.52918 48.90087
## 282 47.71502 46.52918 48.90087
## 283 47.71502 46.52918 48.90087
## 284 47.71502 46.52918 48.90087
## 285 47.71502 46.52918 48.90087
## 286 47.71502 46.52918 48.90087
## 287 47.71502 46.52918 48.90087
## 288 47.71502 46.52918 48.90087
## 289 47.71502 46.52918 48.90087
## 290 47.71502 46.52918 48.90087
## 291 47.71502 46.52918 48.90087
## 292 47.71502 46.52918 48.90087
## 293 47.71502 46.52918 48.90087
## 294 47.71502 46.52918 48.90087
## 295 47.71502 46.52918 48.90087
## 296 47.71502 46.52918 48.90087
## 297 47.71502 46.52918 48.90087
## 298 47.71502 46.52918 48.90087
## 299 38.35566 37.37149 39.33984
## 300 38.35566 37.37149 39.33984
## 301 38.35566 37.37149 39.33984
## 302 38.35566 37.37149 39.33984
## 303 38.35566 37.37149 39.33984
## 304 47.71502 46.52918 48.90087
## 305 47.71502 46.52918 48.90087
## 306 47.71502 46.52918 48.90087
## 307 47.71502 46.52918 48.90087
## 308 47.71502 46.52918 48.90087
## 309 47.71502 46.52918 48.90087
## 310 47.71502 46.52918 48.90087
## 311 47.71502 46.52918 48.90087
## 312 47.71502 46.52918 48.90087
## 313 38.35566 37.37149 39.33984
## 314 38.35566 37.37149 39.33984
## 315 38.35566 37.37149 39.33984
## 316 38.35566 37.37149 39.33984
## 317 38.35566 37.37149 39.33984
## 318 38.35566 37.37149 39.33984
## 319 38.35566 37.37149 39.33984
## 320 38.35566 37.37149 39.33984
## 321 38.35566 37.37149 39.33984
## 322 38.35566 37.37149 39.33984
## 323 38.35566 37.37149 39.33984
## 324 38.35566 37.37149 39.33984
## 325 38.35566 37.37149 39.33984
## 326 38.35566 37.37149 39.33984
## 327 38.35566 37.37149 39.33984
## 328 38.35566 37.37149 39.33984
## 329 38.35566 37.37149 39.33984
## 330 38.35566 37.37149 39.33984
## 331 38.35566 37.37149 39.33984
## 332 38.35566 37.37149 39.33984
## 333 38.35566 37.37149 39.33984
## 334 38.35566 37.37149 39.33984
## 335 38.35566 37.37149 39.33984
## 336 38.35566 37.37149 39.33984
## 337 38.35566 37.37149 39.33984
## 338 38.35566 37.37149 39.33984
## 339 38.35566 37.37149 39.33984
## 340 47.71502 46.52918 48.90087
## 341 47.71502 46.52918 48.90087
## 342 38.35566 37.37149 39.33984
## 343 38.35566 37.37149 39.33984
## 344 47.71502 46.52918 48.90087
## 345 47.71502 46.52918 48.90087
## 346 47.71502 46.52918 48.90087
## 347 47.71502 46.52918 48.90087
## 348 47.71502 46.52918 48.90087
## 349 47.71502 46.52918 48.90087
## 350 47.71502 46.52918 48.90087
## 351 47.71502 46.52918 48.90087
## 352 47.71502 46.52918 48.90087
## 353 47.71502 46.52918 48.90087
## 354 47.71502 46.52918 48.90087
## 355 47.71502 46.52918 48.90087
## 356 47.71502 46.52918 48.90087
## 357 47.71502 46.52918 48.90087
## 358 47.71502 46.52918 48.90087
## 359 47.71502 46.52918 48.90087
## 360 47.71502 46.52918 48.90087
## 361 47.71502 46.52918 48.90087
## 362 47.71502 46.52918 48.90087
## 363 47.71502 46.52918 48.90087
## 364 47.71502 46.52918 48.90087
## 365 47.71502 46.52918 48.90087
## 366 47.71502 46.52918 48.90087
## 367 47.71502 46.52918 48.90087
## 368 47.71502 46.52918 48.90087
## 369 47.71502 46.52918 48.90087
## 370 47.71502 46.52918 48.90087
## 371 47.71502 46.52918 48.90087
## 372 47.71502 46.52918 48.90087
## 373 47.71502 46.52918 48.90087
## 374 47.71502 46.52918 48.90087

5.3. Regresión Lineal Múltiple

La regresión lineal múltiple es una técnica estadística que extiende la regresión lineal para modelar la relación entre una variable dependiente y múltiples variables independientes. En términos generales, describe cómo la variable dependiente cambia en función de varias variables predictora. El análisis de regresión múltiple permite evaluar cómo las diferentes variables independientes afectan conjuntamente a la variable dependiente. Cada coeficiente de regresión se interpreta como el cambio esperado en la variable dependiente por cada unidad de cambio en la variable independiente correspondiente, manteniendo las demás constantes. Esto permite identificar qué variables tienen un efecto significativo y qué tan fuerte es su influencia en el resultado. También ayuda a entender las relaciones complejas entre las variables y a controlar posibles factores de confusión.

Los resultados de la regresión lineal múltiple incluyen métricas de ajuste como el coeficiente de determinación y el valor ajustado que indican qué proporción de la variabilidad de la variable dependiente es explicada por el modelo. También se evalúan las suposiciones del modelo (linealidad, independencia de errores, homocedasticidad y normalidad) y posibles problemas como la multicolinealidad entre las variables independientes. En resumen, la regresión lineal múltiple proporciona un marco robusto para analizar, predecir y explicar relaciones complejas en un conjunto de datos con múltiples factores influyentes.

Resumen Variables Cuantitativas

La tabla muestra un resumen estadístico de ocho variables cuantitativas de un conjunto de datos de cdd salud y estilos de vida: Edad, Duracion_de_sueno, Calidad_de_sueno , Nivel_de_actividad_fisica, Nivel_de_estres, Presion_sistola, Presion_diastola, Frecuencia_cardiaca, Pasos_diarios. Para cada variable se muestran los siguientes estadísticos: mínimo, primer cuartil, mediana, media, tercer cuartil y máximo. Los valores numéricos representan las medidas de cada estadístico para cada variable.

summary(cdd_salud_y_estilos_de_vida_depurado$Edad)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   27.00   35.25   43.00   42.18   50.00   59.00
summary(cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   5.800   6.400   7.200   7.132   7.800   8.500
summary(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   4.000   6.000   7.000   7.313   8.000   9.000
summary(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   30.00   45.00   60.00   59.17   75.00   90.00
summary(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   3.000   4.000   5.000   5.385   7.000   8.000
summary(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   115.0   125.0   130.0   128.6   135.0   142.0
summary(cdd_salud_y_estilos_de_vida_depurado$Presion_diastola)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   75.00   80.00   85.00   84.65   90.00   95.00
summary(cdd_salud_y_estilos_de_vida_depurado$Frecuencia_cardiaca)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   65.00   68.00   70.00   70.17   72.00   86.00
summary(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    3000    5600    7000    6817    8000   10000

Resumen Variables Cualitativas

El resumen de variables cualitativas muestra la distribución de la variable Genero en el conjunto de datos cdd salud y estilos de vida . Hay 185 observaciones con el valor 0 y 189 con el valor 1. Esto indica que aproximadamente el 49.46% de los datos corresponde al género 0 y el 50.54% al género 1. También se genera un gráfico de barras que visualiza esta distribución.

tabla_genero <- table(na.omit(cdd_salud_y_estilos_de_vida_base$Genero))
## Warning: Unknown or uninitialised column: `Genero`.
if (length(tabla_genero) > 0) {
  print(tabla_genero)
  print(prop.table(tabla_genero))
  barplot(tabla_genero, main = "Distribución de Género")
}

tabla_ocupacion <- table(na.omit(cdd_salud_y_estilos_de_vida_base$Ocupacion))
## Warning: Unknown or uninitialised column: `Ocupacion`.
if (length(tabla_ocupacion) > 0) {
  print(tabla_ocupacion)
  print(prop.table(tabla_ocupacion))
  barplot(tabla_ocupacion, main = "Distribución de Ocupación")
}


tabla_imc <- table(na.omit(cdd_salud_y_estilos_de_vida_base$IMC))
## Warning: Unknown or uninitialised column: `IMC`.
if (length(tabla_imc) > 0) {
  print(tabla_imc)
  print(prop.table(tabla_imc))
  barplot(tabla_imc, main = "Distribución de IMC")
}

tabla_sueno <- table(na.omit(cdd_salud_y_estilos_de_vida_base$Trastorno_del_sueno))
if (length(tabla_sueno) > 0) {
  print(tabla_sueno)
  print(prop.table(tabla_sueno))
  barplot(tabla_sueno, main = "Distribución de Trastornos del Sueño")
}
## 
##  1  2  3 
##  3  5 15 
## 
##         1         2         3 
## 0.1304348 0.2173913 0.6521739

Resumen y ANOVA del Modelo RLM Total

El ANOVA y los coeficientes ayudan a evaluar la relación entre las variables independientes y el IMC, mostrando qué factores son significativos.

summary(lm(cdd_salud_y_estilos_de_vida_depurado$IMC~cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno+cdd_salud_y_estilos_de_vida_depurado$Edad+cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica+as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)+as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)+as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)+as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)))
## 
## Call:
## lm(formula = cdd_salud_y_estilos_de_vida_depurado$IMC ~ cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno + 
##     cdd_salud_y_estilos_de_vida_depurado$Edad + cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica + 
##     as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios) + 
##     as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés) + 
##     as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola) + 
##     as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno))
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.12315 -0.03325 -0.01473  0.01147  1.30974 
## 
## Coefficients: (10 not defined because of singularities)
##                                                                     Estimate
## (Intercept)                                                         2.743183
## cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno             -0.317573
## cdd_salud_y_estilos_de_vida_depurado$Edad                           0.003540
## cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica      0.002834
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3300   0.547984
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3500  -0.975762
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3700   1.414853
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4000   0.789419
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4100  -0.422488
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4200   1.869743
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4800   2.155700
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5000   0.874321
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5200   2.759968
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5500   2.473847
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5600   3.444137
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6000   1.329484
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6200   0.435218
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6800   2.653306
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7000   0.578555
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7300   0.449507
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7500   0.432660
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)8000   0.075576
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)10000  0.588946
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)4   -0.280245
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)5   -0.250636
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)6   -0.136180
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)7   -0.029504
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)8   -0.872251
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)117 -2.275769
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)118 -0.149709
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)119        NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)120  0.380430
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)121        NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)122        NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)125 -0.204229
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)126        NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)128 -1.160131
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)129        NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)130  0.535910
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)131        NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)132        NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)135  0.896338
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)139        NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)140  1.818630
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)142  2.333453
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)5         NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)6   0.228167
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)7   0.113954
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)8  -0.067421
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)9         NA
##                                                                    Std. Error
## (Intercept)                                                          0.797730
## cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno               0.112306
## cdd_salud_y_estilos_de_vida_depurado$Edad                            0.005577
## cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica       0.002375
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3300    0.380052
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3500    0.420161
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3700    0.292251
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4000    0.240306
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4100    0.220333
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4200    0.373034
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4800    0.248693
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5000    0.333856
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5200    0.219887
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5500    0.489125
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5600    0.638438
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6000    0.357047
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6200    0.311611
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6800    0.363957
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7000    0.294573
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7300    0.287539
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7500    0.274981
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)8000    0.327632
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)10000   0.328698
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)4     0.130683
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)5     0.152375
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)6     0.161500
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)7     0.285617
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)8     0.215216
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)117   0.233807
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)118   0.176755
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)119         NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)120   0.132167
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)121         NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)122         NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)125   0.145514
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)126         NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)128   0.306407
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)129         NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)130   0.161237
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)131         NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)132         NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)135   0.185740
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)139         NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)140   0.135328
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)142   0.363692
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)5          NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)6    0.319971
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)7    0.282840
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)8    0.182469
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)9          NA
##                                                                    t value
## (Intercept)                                                          3.439
## cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno              -2.828
## cdd_salud_y_estilos_de_vida_depurado$Edad                            0.635
## cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica       1.193
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3300    1.442
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3500   -2.322
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3700    4.841
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4000    3.285
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4100   -1.917
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4200    5.012
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4800    8.668
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5000    2.619
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5200   12.552
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5500    5.058
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5600    5.395
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6000    3.724
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6200    1.397
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6800    7.290
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7000    1.964
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7300    1.563
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7500    1.573
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)8000    0.231
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)10000   1.792
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)4    -2.144
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)5    -1.645
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)6    -0.843
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)7    -0.103
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)8    -4.053
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)117  -9.734
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)118  -0.847
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)119      NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)120   2.878
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)121      NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)122      NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)125  -1.403
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)126      NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)128  -3.786
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)129      NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)130   3.324
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)131      NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)132      NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)135   4.826
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)139      NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)140  13.439
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)142   6.416
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)5       NA
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)6    0.713
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)7    0.403
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)8   -0.369
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)9       NA
##                                                                    Pr(>|t|)    
## (Intercept)                                                        0.000658 ***
## cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno             0.004970 ** 
## cdd_salud_y_estilos_de_vida_depurado$Edad                          0.526107    
## cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica     0.233579    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3300  0.150278    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3500  0.020815 *  
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3700  1.98e-06 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4000  0.001128 ** 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4100  0.056028 .  
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4200  8.74e-07 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4800   < 2e-16 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5000  0.009225 ** 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5200   < 2e-16 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5500  7.01e-07 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5600  1.30e-07 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6000  0.000230 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6200  0.163440    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6800  2.26e-12 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7000  0.050354 .  
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7300  0.118932    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7500  0.116569    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)8000  0.817709    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)10000 0.074077 .  
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)4   0.032717 *  
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)5   0.100938    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)6   0.399711    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)7   0.917788    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)8   6.30e-05 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)117  < 2e-16 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)118 0.397611    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)119       NA    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)120 0.004254 ** 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)121       NA    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)122       NA    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)125 0.161398    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)126       NA    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)128 0.000181 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)129       NA    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)130 0.000987 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)131       NA    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)132       NA    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)135 2.13e-06 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)139       NA    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)140  < 2e-16 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)142 4.79e-10 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)5        NA    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)6  0.476290    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)7  0.687285    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)8  0.711996    
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)9        NA    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1741 on 334 degrees of freedom
## Multiple R-squared:  0.9712, Adjusted R-squared:  0.9678 
## F-statistic: 288.9 on 39 and 334 DF,  p-value: < 2.2e-16
anova(lm(cdd_salud_y_estilos_de_vida_depurado$IMC~cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno+cdd_salud_y_estilos_de_vida_depurado$Edad+cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica+as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)+as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)+as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)+as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)))
## Analysis of Variance Table
## 
## Response: cdd_salud_y_estilos_de_vida_depurado$IMC
##                                                                   Df  Sum Sq
## cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno             1  50.147
## cdd_salud_y_estilos_de_vida_depurado$Edad                          1 170.711
## cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica     1   2.223
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)     19  72.007
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)    5  21.594
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)    9  24.693
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)   3   0.139
## Residuals                                                        334  10.123
##                                                                  Mean Sq
## cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno            50.147
## cdd_salud_y_estilos_de_vida_depurado$Edad                        170.711
## cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica     2.223
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)      3.790
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)    4.319
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)    2.744
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)   0.046
## Residuals                                                          0.030
##                                                                    F value
## cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno           1654.5307
## cdd_salud_y_estilos_de_vida_depurado$Edad                        5632.3971
## cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica     73.3476
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)     125.0409
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)   142.4906
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)    90.5257
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)    1.5268
## Residuals                                                                 
##                                                                     Pr(>F)    
## cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno           < 2.2e-16 ***
## cdd_salud_y_estilos_de_vida_depurado$Edad                        < 2.2e-16 ***
## cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica   4.053e-16 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)    < 2.2e-16 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)  < 2.2e-16 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)  < 2.2e-16 ***
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)    0.2073    
## Residuals                                                                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Coeficientes del Modelo RLM Total

Estos son los coeficientes de un modelo de regresión lineal múltiple (RLM). La salida muestra el intercepto y los coeficientes para diferentes variables predictoras. Las variables de modelo son factores (variables categóricas). Los números a la derecha de cada variable son sus coeficientes estimados, expresados en notación científica.

coefficients(lm(cdd_salud_y_estilos_de_vida_depurado$IMC~cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno+cdd_salud_y_estilos_de_vida_depurado$Edad+cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica+as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)+as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)+as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)+as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)))
##                                                        (Intercept) 
##                                                        2.743182870 
##             cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno 
##                                                       -0.317573338 
##                          cdd_salud_y_estilos_de_vida_depurado$Edad 
##                                                        0.003539511 
##     cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica 
##                                                        0.002833791 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3300 
##                                                        0.547984090 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3500 
##                                                       -0.975761801 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3700 
##                                                        1.414852896 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4000 
##                                                        0.789418623 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4100 
##                                                       -0.422487709 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4200 
##                                                        1.869743484 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4800 
##                                                        2.155700040 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5000 
##                                                        0.874321279 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5200 
##                                                        2.759968366 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5500 
##                                                        2.473847384 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5600 
##                                                        3.444136693 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6000 
##                                                        1.329484306 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6200 
##                                                        0.435217644 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6800 
##                                                        2.653306497 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7000 
##                                                        0.578554532 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7300 
##                                                        0.449506689 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7500 
##                                                        0.432659624 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)8000 
##                                                        0.075576294 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)10000 
##                                                        0.588946095 
##   as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)4 
##                                                       -0.280244504 
##   as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)5 
##                                                       -0.250636217 
##   as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)6 
##                                                       -0.136179675 
##   as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)7 
##                                                       -0.029503954 
##   as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)8 
##                                                       -0.872250555 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)117 
##                                                       -2.275768754 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)118 
##                                                       -0.149708531 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)119 
##                                                                 NA 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)120 
##                                                        0.380430093 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)121 
##                                                                 NA 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)122 
##                                                                 NA 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)125 
##                                                       -0.204228662 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)126 
##                                                                 NA 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)128 
##                                                       -1.160130665 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)129 
##                                                                 NA 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)130 
##                                                        0.535910145 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)131 
##                                                                 NA 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)132 
##                                                                 NA 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)135 
##                                                        0.896338184 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)139 
##                                                                 NA 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)140 
##                                                        1.818630345 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)142 
##                                                        2.333453415 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)5 
##                                                                 NA 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)6 
##                                                        0.228167113 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)7 
##                                                        0.113954164 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)8 
##                                                       -0.067420791 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)9 
##                                                                 NA

Coeficientes del Modelo RLM Reducido

En este analisis se utilizaron las variables que tienen una coorrelacion positiva mas alta para formular el modelo de una manera reducida. Los coeficientes muestran el efecto de cada variable en el modelo de regresión lineal múltiple.

coefficients(lm(cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno~+as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)+as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)))
##                                                        (Intercept) 
##                                                          5.0064450 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)117 
##                                                          2.3935550 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)118 
##                                                          1.9826745 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)119 
##                                                          2.1935550 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)120 
##                                                          0.2460610 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)121 
##                                                          2.2935550 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)122 
##                                                          2.5935550 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)125 
##                                                          0.7651569 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)126 
##                                                          1.0935550 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)128 
##                                                          0.2984902 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)129 
##                                                          1.5935550 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)130 
##                                                          0.2715740 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)131 
##                                                          0.7935550 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)132 
##                                                          1.4935550 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)135 
##                                                          0.4259373 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)139 
##                                                          3.0935550 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)140 
##                                                          0.8935550 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)142 
##                                                          1.8935550 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3300 
##                                                          1.9676176 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3500 
##                                                          0.4000000 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3700 
##                                                                 NA 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4000 
##                                                                 NA 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4100 
##                                                          1.1219810 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4200 
##                                                                 NA 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4800 
##                                                                 NA 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5000 
##                                                          1.6184562 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5200 
##                                                                 NA 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5500 
##                                                          1.1283981 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5600 
##                                                          1.3950647 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6000 
##                                                          1.1639139 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6200 
##                                                                 NA 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6800 
##                                                                 NA 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7000 
##                                                          2.1560550 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7300 
##                                                                 NA 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7500 
##                                                          2.9935550 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)8000 
##                                                          2.2377934 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)10000 
##                                                          0.2382933

Análisis del modelo RLM.

El análisis del modelo de regresión lineal múltiple (RLM) consiste en examinar la relación entre una variable dependiente y varias variables independientes, evaluando el ajuste y la validez del modelo estadístico ajustado. Este análisis implica verificar cómo las variables independientes contribuyen de manera individual y conjunta a explicar las variaciones en la variable dependiente, utilizando métricas y pruebas estadísticas para interpretar la efectividad del modelo.

Mejor Modelo Iterado según AIC

El AIC (Criterio de Información de Akaike) es una medida de la calidad relativa de los modelos estadísticos para un conjunto dado de datos. Un AIC menor indica un mejor ajuste. La tabla muestra tres iteraciones de un modelo de regresión, con el tercer modelo (AIC=22103.14) mostrando el AIC más bajo, y por lo tanto, el mejor ajuste según este criterio.

modelo_Iterado_STEP = step(lm(cdd_salud_y_estilos_de_vida_depurado$IMC~cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno+cdd_salud_y_estilos_de_vida_depurado$Edad+cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica+as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)+as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)+as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)+as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)))
## Start:  AIC=-1269.93
## cdd_salud_y_estilos_de_vida_depurado$IMC ~ cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno + 
##     cdd_salud_y_estilos_de_vida_depurado$Edad + cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica + 
##     as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios) + 
##     as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés) + 
##     as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola) + 
##     as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)
## 
##                                                                    Df Sum of Sq
## - cdd_salud_y_estilos_de_vida_depurado$Edad                         1    0.0122
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)  3    0.1388
## - cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica    1    0.0432
## <none>                                                                         
## - cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno            1    0.2424
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)   5    1.5728
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)     9    8.2042
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)   9   19.3217
##                                                                       RSS
## - cdd_salud_y_estilos_de_vida_depurado$Edad                        10.135
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno) 10.262
## - cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica   10.166
## <none>                                                             10.123
## - cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno           10.366
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)  11.696
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)    18.327
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)  29.445
##                                                                         AIC
## - cdd_salud_y_estilos_de_vida_depurado$Edad                        -1271.48
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno) -1270.83
## - cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica   -1270.34
## <none>                                                             -1269.93
## - cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno           -1263.08
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)  -1225.92
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)    -1065.93
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)   -888.61
## 
## Step:  AIC=-1271.48
## cdd_salud_y_estilos_de_vida_depurado$IMC ~ cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno + 
##     cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica + 
##     as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios) + 
##     as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés) + 
##     as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola) + 
##     as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)
## 
##                                                                    Df Sum of Sq
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)  3    0.1275
## <none>                                                                         
## - cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica    1    0.0555
## - cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno            1    0.2392
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)   5    1.5636
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)     9   11.4449
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)   9   25.2903
##                                                                       RSS
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno) 10.263
## <none>                                                             10.135
## - cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica   10.191
## - cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno           10.375
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)  11.699
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)    21.580
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)  35.426
##                                                                         AIC
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno) -1272.80
## <none>                                                             -1271.48
## - cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica   -1271.44
## - cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno           -1264.75
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)  -1227.82
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)    -1006.83
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)   -821.45
## 
## Step:  AIC=-1272.8
## cdd_salud_y_estilos_de_vida_depurado$IMC ~ cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno + 
##     cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica + 
##     as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios) + 
##     as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés) + 
##     as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)
## 
##                                                                   Df Sum of Sq
## <none>                                                                        
## - cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica   1     0.130
## - cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno           1     0.509
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)  5     2.056
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)   11    22.408
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)  9    41.486
##                                                                      RSS
## <none>                                                            10.263
## - cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica  10.392
## - cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno          10.772
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés) 12.319
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)   32.670
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola) 51.749
##                                                                        AIC
## <none>                                                            -1272.80
## - cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica  -1270.11
## - cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno          -1256.70
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés) -1214.51
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)    -861.73
## - as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)  -685.71
coefficients(modelo_Iterado_STEP)
##                                                        (Intercept) 
##                                                        2.477829000 
##             cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno 
##                                                       -0.298321959 
##     cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica 
##                                                        0.003432796 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3300 
##                                                        0.849129295 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3500 
##                                                       -0.753663373 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)3700 
##                                                        1.646791185 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4000 
##                                                        0.820975702 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4100 
##                                                       -0.339463007 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4200 
##                                                        2.300994165 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)4800 
##                                                        2.201305213 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5000 
##                                                        1.171693120 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5200 
##                                                        2.811610228 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5500 
##                                                        2.965573101 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)5600 
##                                                        3.983316735 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6000 
##                                                        1.670444398 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6200 
##                                                        0.562862220 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)6800 
##                                                        2.897600146 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7000 
##                                                        0.818576232 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7300 
##                                                        0.584521968 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)7500 
##                                                        0.634122971 
##  as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)8000 
##                                                        0.369454527 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)10000 
##                                                        0.857039844 
##   as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)4 
##                                                       -0.365641977 
##   as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)5 
##                                                       -0.340433141 
##   as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)6 
##                                                       -0.103236658 
##   as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)7 
##                                                        0.169642847 
##   as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)8 
##                                                       -0.669021347 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)117 
##                                                       -2.279247656 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)118 
##                                                       -0.204017057 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)119 
##                                                                 NA 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)120 
##                                                        0.340224408 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)121 
##                                                                 NA 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)122 
##                                                                 NA 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)125 
##                                                       -0.233351237 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)126 
##                                                                 NA 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)128 
##                                                       -1.259267320 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)129 
##                                                                 NA 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)130 
##                                                        0.481103828 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)131 
##                                                                 NA 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)132 
##                                                                 NA 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)135 
##                                                        1.015089567 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)139 
##                                                                 NA 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)140 
##                                                        1.848308017 
## as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)142 
##                                                        2.570886058

Bondades de Ajuste, Significancias y Criterios de Información Comparados.

La tabla muestra las bondades de ajuste, significancias y criterios de información comparados para diferentes modelos de regresión. Esta evalúa cómo cada variable afecta a la variable dependiente y qué tan significativos son esos efectos en varios modelos.

# modelo_RLM_TOTAL = (lm(cdd_salud_y_estilos_de_vida_depurado$IMC~cdd_salud_y_estilos_de_vida_depurado$Duracion_de_sueno+cdd_salud_y_estilos_de_vida_depurado$Edad+cdd_salud_y_estilos_de_vida_depurado$Nivel_de_actividad_fisica+as.factor(cdd_salud_y_estilos_de_vida_depurado$Pasos_diarios)+as.factor(cdd_salud_y_estilos_de_vida_depurado$Nivel_de_estrés)+as.factor(cdd_salud_y_estilos_de_vida_depurado$Presion_sistola)+as.factor(cdd_salud_y_estilos_de_vida_depurado$Calidad_de_sueno)))

# modelo_RLM_REDUCIDO = lm(cdd_salud_y_estilos_de_vida_depurado$age~cdd_salud_y_estilos_de_vida_depurado$km+cdd_salud_y_estilos_de_vida_depurado$price+as.factor(cdd_salud_y_estilos_de_vida_depurado$gender)+as.factor(cdd_salud_y_estilos_de_vida_depurado$condition))

# stargazer(modelo_RLM_TOTAL, modelo_RLM_REDUCIDO, modelo_Iterado_STEP, type = "text", df = TRUE)

# AIC(modelo_RLM_TOTAL, modelo_RLM_REDUCIDO, modelo_Iterado_STEP)

# BIC(modelo_RLM_TOTAL, modelo_RLM_REDUCIDO, modelo_Iterado_STEP)

Este chunk fue omitido ya que no se pudo llegar a su correcta resolucion y aplicación .

5.4. Regresión Logística Simple

El modelo de regresión logística simple utiliza la función logística, también conocida como función sigmoide, para transformar la relación lineal entre las variables en una curva que puede tomar valores entre 0 y 1. Esta transformación permite interpretar los resultados en términos de probabilidades. Por ejemplo, en un estudio sobre la probabilidad de que un paciente tenga una enfermedad en función de su edad, la regresión logística simple puede ayudar a determinar cómo cambia esta probabilidad con la edad del paciente.

Además, la regresión logística simple proporciona coeficientes que indican la dirección y la magnitud de la relación entre la variable independiente y la probabilidad del evento. Estos coeficientes se interpretan en términos de odds ratios, que representan el cambio en las probabilidades de ocurrencia del evento por cada unidad de cambio en la variable independiente. Esta técnica es ampliamente utilizada en campos como la medicina, las ciencias sociales y la economía para tomar decisiones informadas basadas en datos.

Resumen y Boxplot de Edad

el boxplot indica que la edad se distribuye de manera relativamente simétrica, con una mediana de 43 años, y la mayoría de las edades se encuentran entre los 35 y los 47 años.

summary(cdd_salud_y_estilos_de_vida_depurado$Edad)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   27.00   35.25   43.00   42.18   50.00   59.00
boxplot(cdd_salud_y_estilos_de_vida_depurado$Edad, main = "Diagrama de Caja de Edad", col = c("orange"))

Histograma de Edad.

El histograma muestra la distribución de la edad Edad en un conjunto de datos. El eje horizontal representa las edades, agrupadas en intervalos (bins), y el eje vertical representa la frecuencia, o número de observaciones, que caen dentro de cada intervalo de edad.

Observamos que la distribución de las edades es aproximadamente asimetrica , con una concentración de datos entre los 35 y los 47 años. Hay un pico alrededor de los 45 años, indicando que ese rango de edad es el más frecuente en este conjunto de datos. La distribución disminuye gradualmente en ambos extremos, indicando que hay menos personas con edades menores de 30 años o mayores de 47 años.

summary(cdd_salud_y_estilos_de_vida_depurado$Edad)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   27.00   35.25   43.00   42.18   50.00   59.00
hist(cdd_salud_y_estilos_de_vida_depurado$Edad, main = "Histograma de Edad", col = c("gold"))

Resumen y Diagrama de Barras de IMC

La gráfica de barras muestra la distribución del género en el conjunto de datos. El eje x representa el IMC. El eje y representa la frecuencia o conteo de los pacientes en ese IMC (1 = normal , 2 = obesidad , 3 = sobrepeso) .

Se observa que el IMC mas frecuente es el 1 , seguido del 3 y por ulrimo con una gran diferencia respecto a los anteriores nombrados el numero 2.

table(cdd_salud_y_estilos_de_vida_depurado$IMC)
## 
##   1   2   3 
## 216  10 148
prop.table(table(cdd_salud_y_estilos_de_vida_depurado$IMC))
## 
##          1          2          3 
## 0.57754011 0.02673797 0.39572193
barplot(table(cdd_salud_y_estilos_de_vida_depurado$IMC))

Resumen y Diagrama de Cajas Conjunto

El gráfico de caja muestra la distribución de la edad según el IMC .

La caja más grande (naranja) representa una distribución de edades significativamente mayor con una mediana alrededor de 35 a 47 años. La caja muestra una dispersión considerable, con valores atípicos (puntos por encima y por debajo de la caja). La línea horizontal dentro de la caja es la mediana. Las líneas verticales que se extienden desde la caja representan el rango intercuartil (IQR), que abarca desde el primer cuartil (25%) hasta el tercer cuartil (75%).

tapply(cdd_salud_y_estilos_de_vida_depurado$Edad, cdd_salud_y_estilos_de_vida_depurado$IMC, mean)
##        1        2        3 
## 38.47222 38.00000 47.88514
tapply(cdd_salud_y_estilos_de_vida_depurado$Edad, cdd_salud_y_estilos_de_vida_depurado$IMC, median)
##    1    2    3 
## 37.0 36.5 45.0
boxplot(cdd_salud_y_estilos_de_vida_depurado$Edad, cdd_salud_y_estilos_de_vida_depurado$IMC, main = "Boxplot Conjunto: Edad - IMC", col = c("orange", "gold"))

Formulación del modelo de RLogS entre las variables de estudio.

La formulación del modelo de regresión logística simple (RLogS) describe la relación entre una variable dependiente y una variable independiente. En este modelo, la probabilidad de que la variable dependiente tome el valor 1 se expresa como una función de la variable independiente.

Coeficientes del Modelo RLogS

Esta tabla muestra los coeficientes de un modelo de regresión, específicamente el intercepto y el coeficiente para la variable IMC. Los valores numéricos son los estimadores de estos coeficientes. Estos coeficientes ayudan a hacer predicciones y entender mejor cómo influyen las variables en el resultado del modelo.

modelo_RLog_Simple <- lm(Edad ~ IMC, data = cdd_salud_y_estilos_de_vida_depurado)
coef(modelo_RLog_Simple)
## (Intercept)         IMC 
##   33.675984    4.679679

Resumen Estadístico del Modelo RLogS

El resumen estadístico del modelo RLogS proporciona una base para entender y mejorar el análisis en el futuro.

summary(modelo_RLog_Simple)
## 
## Call:
## lm(formula = Edad ~ IMC, data = cdd_salud_y_estilos_de_vida_depurado)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -20.715  -5.276  -1.356   4.285  17.644 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  33.6760     0.8129   41.43   <2e-16 ***
## IMC           4.6797     0.3945   11.86   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.398 on 372 degrees of freedom
## Multiple R-squared:  0.2745, Adjusted R-squared:  0.2725 
## F-statistic: 140.7 on 1 and 372 DF,  p-value: < 2.2e-16

Análisis del modelo RLogS.

El análisis del modelo de regresión logística simple (RLogS) en un conjunto de datos examina cómo una variable independiente afecta la probabilidad de ocurrencia de un evento representado por una variable dependiente gender (que toma valores 0 o 1). Este análisis se centra en entender e interpretar la relación estadística entre las variables y en evaluar el desempeño del modelo para predecir correctamente las categorías de la variable dependiente. El análisis del modelo RLogS permite no solo identificar si existe una relación significativa entre las variables, sino también evaluar qué tan bien el modelo describe y predice los resultados en el conjunto de datos.

Variable Predictora igual a Cero

coef(modelo_RLog_Simple)
## (Intercept)         IMC 
##   33.675984    4.679679
round(exp(coef(modelo_RLog_Simple)),6)
##  (Intercept)          IMC 
## 4.219821e+14 1.077355e+02

Probabilidades Estimadas

Las probabilidades estimadas en un conjunto de datos, obtenidas a través de modelos como la regresión logística, sirven para cuantificar la probabilidad de que ocurra un determinado evento (por ejemplo, éxito/fallo, aceptación/rechazo, o compra/no compra) en función de las variables independientes. Estas probabilidades permiten tomar decisiones basadas en los resultados previstos, ya que ofrecen una representación continua de la probabilidad del evento en lugar de una clasificación binaria fija.

imc_values <- data.frame(IMC = seq(1, 400))


predicciones <- predict(modelo_RLog_Simple, newdata = imc_values, type = "response")


predicciones
##          1          2          3          4          5          6          7 
##   38.35566   43.03534   47.71502   52.39470   57.07438   61.75406   66.43374 
##          8          9         10         11         12         13         14 
##   71.11342   75.79310   80.47278   85.15246   89.83214   94.51182   99.19150 
##         15         16         17         18         19         20         21 
##  103.87118  108.55085  113.23053  117.91021  122.58989  127.26957  131.94925 
##         22         23         24         25         26         27         28 
##  136.62893  141.30861  145.98829  150.66797  155.34765  160.02733  164.70701 
##         29         30         31         32         33         34         35 
##  169.38669  174.06637  178.74605  183.42573  188.10540  192.78508  197.46476 
##         36         37         38         39         40         41         42 
##  202.14444  206.82412  211.50380  216.18348  220.86316  225.54284  230.22252 
##         43         44         45         46         47         48         49 
##  234.90220  239.58188  244.26156  248.94124  253.62092  258.30060  262.98028 
##         50         51         52         53         54         55         56 
##  267.65995  272.33963  277.01931  281.69899  286.37867  291.05835  295.73803 
##         57         58         59         60         61         62         63 
##  300.41771  305.09739  309.77707  314.45675  319.13643  323.81611  328.49579 
##         64         65         66         67         68         69         70 
##  333.17547  337.85515  342.53483  347.21451  351.89418  356.57386  361.25354 
##         71         72         73         74         75         76         77 
##  365.93322  370.61290  375.29258  379.97226  384.65194  389.33162  394.01130 
##         78         79         80         81         82         83         84 
##  398.69098  403.37066  408.05034  412.73002  417.40970  422.08938  426.76906 
##         85         86         87         88         89         90         91 
##  431.44873  436.12841  440.80809  445.48777  450.16745  454.84713  459.52681 
##         92         93         94         95         96         97         98 
##  464.20649  468.88617  473.56585  478.24553  482.92521  487.60489  492.28457 
##         99        100        101        102        103        104        105 
##  496.96425  501.64393  506.32361  511.00328  515.68296  520.36264  525.04232 
##        106        107        108        109        110        111        112 
##  529.72200  534.40168  539.08136  543.76104  548.44072  553.12040  557.80008 
##        113        114        115        116        117        118        119 
##  562.47976  567.15944  571.83912  576.51880  581.19848  585.87816  590.55784 
##        120        121        122        123        124        125        126 
##  595.23751  599.91719  604.59687  609.27655  613.95623  618.63591  623.31559 
##        127        128        129        130        131        132        133 
##  627.99527  632.67495  637.35463  642.03431  646.71399  651.39367  656.07335 
##        134        135        136        137        138        139        140 
##  660.75303  665.43271  670.11239  674.79206  679.47174  684.15142  688.83110 
##        141        142        143        144        145        146        147 
##  693.51078  698.19046  702.87014  707.54982  712.22950  716.90918  721.58886 
##        148        149        150        151        152        153        154 
##  726.26854  730.94822  735.62790  740.30758  744.98726  749.66694  754.34661 
##        155        156        157        158        159        160        161 
##  759.02629  763.70597  768.38565  773.06533  777.74501  782.42469  787.10437 
##        162        163        164        165        166        167        168 
##  791.78405  796.46373  801.14341  805.82309  810.50277  815.18245  819.86213 
##        169        170        171        172        173        174        175 
##  824.54181  829.22149  833.90116  838.58084  843.26052  847.94020  852.61988 
##        176        177        178        179        180        181        182 
##  857.29956  861.97924  866.65892  871.33860  876.01828  880.69796  885.37764 
##        183        184        185        186        187        188        189 
##  890.05732  894.73700  899.41668  904.09636  908.77604  913.45572  918.13539 
##        190        191        192        193        194        195        196 
##  922.81507  927.49475  932.17443  936.85411  941.53379  946.21347  950.89315 
##        197        198        199        200        201        202        203 
##  955.57283  960.25251  964.93219  969.61187  974.29155  978.97123  983.65091 
##        204        205        206        207        208        209        210 
##  988.33059  993.01027  997.68994 1002.36962 1007.04930 1011.72898 1016.40866 
##        211        212        213        214        215        216        217 
## 1021.08834 1025.76802 1030.44770 1035.12738 1039.80706 1044.48674 1049.16642 
##        218        219        220        221        222        223        224 
## 1053.84610 1058.52578 1063.20546 1067.88514 1072.56482 1077.24449 1081.92417 
##        225        226        227        228        229        230        231 
## 1086.60385 1091.28353 1095.96321 1100.64289 1105.32257 1110.00225 1114.68193 
##        232        233        234        235        236        237        238 
## 1119.36161 1124.04129 1128.72097 1133.40065 1138.08033 1142.76001 1147.43969 
##        239        240        241        242        243        244        245 
## 1152.11937 1156.79904 1161.47872 1166.15840 1170.83808 1175.51776 1180.19744 
##        246        247        248        249        250        251        252 
## 1184.87712 1189.55680 1194.23648 1198.91616 1203.59584 1208.27552 1212.95520 
##        253        254        255        256        257        258        259 
## 1217.63488 1222.31456 1226.99424 1231.67392 1236.35360 1241.03327 1245.71295 
##        260        261        262        263        264        265        266 
## 1250.39263 1255.07231 1259.75199 1264.43167 1269.11135 1273.79103 1278.47071 
##        267        268        269        270        271        272        273 
## 1283.15039 1287.83007 1292.50975 1297.18943 1301.86911 1306.54879 1311.22847 
##        274        275        276        277        278        279        280 
## 1315.90815 1320.58782 1325.26750 1329.94718 1334.62686 1339.30654 1343.98622 
##        281        282        283        284        285        286        287 
## 1348.66590 1353.34558 1358.02526 1362.70494 1367.38462 1372.06430 1376.74398 
##        288        289        290        291        292        293        294 
## 1381.42366 1386.10334 1390.78302 1395.46270 1400.14237 1404.82205 1409.50173 
##        295        296        297        298        299        300        301 
## 1414.18141 1418.86109 1423.54077 1428.22045 1432.90013 1437.57981 1442.25949 
##        302        303        304        305        306        307        308 
## 1446.93917 1451.61885 1456.29853 1460.97821 1465.65789 1470.33757 1475.01725 
##        309        310        311        312        313        314        315 
## 1479.69692 1484.37660 1489.05628 1493.73596 1498.41564 1503.09532 1507.77500 
##        316        317        318        319        320        321        322 
## 1512.45468 1517.13436 1521.81404 1526.49372 1531.17340 1535.85308 1540.53276 
##        323        324        325        326        327        328        329 
## 1545.21244 1549.89212 1554.57180 1559.25148 1563.93115 1568.61083 1573.29051 
##        330        331        332        333        334        335        336 
## 1577.97019 1582.64987 1587.32955 1592.00923 1596.68891 1601.36859 1606.04827 
##        337        338        339        340        341        342        343 
## 1610.72795 1615.40763 1620.08731 1624.76699 1629.44667 1634.12635 1638.80603 
##        344        345        346        347        348        349        350 
## 1643.48570 1648.16538 1652.84506 1657.52474 1662.20442 1666.88410 1671.56378 
##        351        352        353        354        355        356        357 
## 1676.24346 1680.92314 1685.60282 1690.28250 1694.96218 1699.64186 1704.32154 
##        358        359        360        361        362        363        364 
## 1709.00122 1713.68090 1718.36058 1723.04025 1727.71993 1732.39961 1737.07929 
##        365        366        367        368        369        370        371 
## 1741.75897 1746.43865 1751.11833 1755.79801 1760.47769 1765.15737 1769.83705 
##        372        373        374        375        376        377        378 
## 1774.51673 1779.19641 1783.87609 1788.55577 1793.23545 1797.91513 1802.59481 
##        379        380        381        382        383        384        385 
## 1807.27448 1811.95416 1816.63384 1821.31352 1825.99320 1830.67288 1835.35256 
##        386        387        388        389        390        391        392 
## 1840.03224 1844.71192 1849.39160 1854.07128 1858.75096 1863.43064 1868.11032 
##        393        394        395        396        397        398        399 
## 1872.79000 1877.46968 1882.14936 1886.82903 1891.50871 1896.18839 1900.86807 
##        400 
## 1905.54775

Gráfica del Modelo RLogS

La gráfica muestra la relación entre la edad y el género según un modelo de regresión logística (RLogS). La línea horizontal alrededor de 0.5 indica que, según este modelo, la probabilidad de pertenecer a cada género es aproximadamente la misma para todas las edades.

Genero <- cdd_salud_y_estilos_de_vida_depurado$Genero
Edad <- cdd_salud_y_estilos_de_vida_depurado$Edad
dataPlot <- data.frame(Edad, Genero)
plot(Genero~Edad, data = dataPlot, main = "Modelo RLogS: Edad - IMC", xlab = "age", ylab = "Genero = 0 | Genero = 1", col = "gold", pch = "I")
curve(predict(glm(Genero~Edad, family = "binomial", data = dataPlot), data.frame(Edad = x), type = "response"), col = "orange", lwd = 3, add = TRUE)

6. Conclusiones

Duracion y calidad de sueño :

Se concluye que en promedio los pacientes tienen una calidad y duracion de sueño relativamente aceptable.

Estrés y sueño:

El nivel de estrés tiene un impacto significativo en la calidad del sueño. Participantes con niveles elevados de estrés reportan una calidad de sueño considerablemente más baja, destacando la necesidad de estrategias de manejo del estrés para mejorar el descanso nocturno.

Actividad física y pasos diarios:

Los participantes realizan en promedio 59 minutos semanales de actividad física, lo cual está por debajo de las recomendaciones de la OMS. Existe una relación positiva entre la actividad física y los pasos diarios, indicando que quienes realizan más ejercicio tienden a tener un estilo de vida más activo en general.

Salud metabólica:

Más del 40% de los participantes tienen un IMC que clasifica como sobrepeso u obesidad, lo que representa un área de mejora crucial para la salud general. Los valores de presión arterial elevados, presentes en una proporción significativa de los participantes, sugieren riesgos cardiovasculares potenciales que requieren atención preventiva.

Trastornos del sueño:

Casi el 40% de los participantes reportan algún tipo de trastorno del sueño, con la apnea del sueño siendo la más común después de “ninguno”. Este hallazgo refuerza la necesidad de promover evaluaciones clínicas regulares para identificar y tratar estas condiciones.

7. Bibliografía

Aldás, J., & Uriel, E. (2017). https://drive.google.com/file/d/1Hj9pNOS7mcwZVNu6O4ridf6eo-he08Z3/view?usp=sharing (2nd ed.). ALFACENTAURO.

https://drive.google.com/file/d/1XcAGp1xrCgWB-ZvQoJLPNWznIcOCSHgk/view?usp=sharing

Estudio de Análisis Multivariado con base en un conjunto de datos de aspirantes extranjeros para ser admitidos en estudios superiores en EE.UU. https://glibrerosl.github.io/Applied-Statistics-FULL/#[Conglomerados]

Estudio de Análisis de Regresión con base en un conjunto de datos de aspirantes extranjeros para ser admitidos en estudios superiores en EE.UU. https://rpubs.com/glibrerosl/Applied-Statistics-FULL

Fuente del conjunto de datos: https://www.kaggle.com/datasets/uom190346a/sleep-health-and-lifestyle-dataset

Díaz Morales, L. G., & Morales Rivera, M. A. (2012). Análisis estadístico de datos multivariados (1st ed.). UNAL.
LS0tDQp0aXRsZTogIioqUk1EX0c4KioiDQpzdWJ0aXRsZTogIkVzdHVkaW8gZGUgQW7DoWxpc2lzIE11bHRpdmFyaWFkbyBjb24gYmFzZSBlbiB1biBjb25qdW50byBkZSBkYXRvcyBzb2JyZSByZWdpc3Ryb3MgZGUgc2FsdWQgeSBlc3RpbG9zIGRlIHZpZGEiDQphdXRob3I6ICJyb21lcm8uam9uYXRoYW46OnBhYmxvLmNhcnZhamFsOjpAY29ycmVvdW5pdmFsbGUuZWR1LmNvIg0KZGF0ZTogIkVzdHVkaW8gaGVjaG8gZHVyYW50ZSBlbCBwZXJpb2RvIGFjYWRlbWljbyBhZ29zdG8tZGljaWVtYnJlIGRlIDIwMjQiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KICAgIHRoZW1lOiBsdW1lbg0KYmlibGlvZ3JhcGh5OiBiaWJsaW9ncmFmaWFfTUUuYmliDQpjc2w6IGFwYS5jc2wNCmxpbmstY2l0YXRpb25zOiB5ZXMNCi0tLQ0KPCEtLSBDb25maWd1cmFjacOzbiBHbG9iYWwgZGUgUiAtLT4NCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGNvcnJwbG90KQ0KbGlicmFyeShHR2FsbHkpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGFuZHJld3MpDQpsaWJyYXJ5KHRjbHRrKQ0KI2xpYnJhcnkoTVZOKQ0KbGlicmFyeShhcGxwYWNrKQ0KbGlicmFyeShncmFwaGljcykNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KEZhY3RvTWluZVIpDQpsaWJyYXJ5KGZhY3RvZXh0cmEpDQpsaWJyYXJ5KHBzeWNoKQ0KbGlicmFyeShGYWN0b0NsYXNzKQ0KbGlicmFyeShjbHVzdGVyKQ0KbGlicmFyeShkZW5kZXh0ZW5kKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkoTmJDbHVzdCkNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89VFJVRSkNCg0KY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2Jhc2UgPC0gcmVhZF9leGNlbCgiQzovR2VzdGlvbiBkZSBkYXRvcyBbRzhdL2NkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9iYXNlLnhsc3giKQ0KVmlldyhjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfYmFzZSkNCg0KY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvIDwtIHJlYWRfZXhjZWwoIkM6L0dlc3Rpb24gZGUgZGF0b3MgW0c4XS9jZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8ueGxzeCIpDQpWaWV3KGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbykNCmBgYA0KDQojIyAqKkZhc2UgMSBbRGVzY3JpcGNpb25lcyBNdWx0aXZhcmlhbnRlc10qKg0KDQpFbiBsYSBwcmltZXJhIGV0YXBhIGRlbCBlc3R1ZGlvLCBzZSBsbGV2YXLDoW4gYSBjYWJvIGPDoWxjdWxvcywgdmlzdWFsaXphY2lvbmVzIHkgdW4gYW7DoWxpc2lzIGRldGFsbGFkbyBkZWwgY29uanVudG8gZGUgZGF0b3MgY2zDrW5pY29zLCBxdWUgc2Vyw6EgZGVzY3JpdG8gZW4gbGEgW3NlY2Npw7NuIDEuMl0oI3NlYzEuMikuIEVzdGUgcHJvY2VzbyBzZSBhYm9yZGFyw6EgZGVzZGUgdW5hIHBlcnNwZWN0aXZhIGRlIGVzdGFkw61zdGljYSBkZXNjcmlwdGl2YSBtdWx0aXZhcmlhbnRlLCBsbyBxdWUgcGVybWl0aXLDoSBubyBzb2xvIHVuYSB2aXNpw7NuIGdlbmVyYWwgZGUgbG9zIGRhdG9zLCBzaW5vIHRhbWJpw6luIHVuIGFuw6FsaXNpcyBtw6FzIGVucmlxdWVjaWRvIGRlIGxhcyByZWxhY2lvbmVzIGVudHJlIGxhcyBkaWZlcmVudGVzIHZhcmlhYmxlcyBpbnZvbHVjcmFkYXMuDQoNCkVzdGUgZW5mb3F1ZSBmYWNpbGl0YXLDoSB1bmEgY29tcHJlbnNpw7NuIG3DoXMgcHJvZnVuZGEgZGUgbGFzIHJlbGFjaW9uZXMgZW50cmUgbGFzIHZhcmlhYmxlcywgYXl1ZGFuZG8gYSBpZGVudGlmaWNhciBwYXRyb25lcyB5IHRlbmRlbmNpYXMgcmVsZXZhbnRlcyBwYXJhIGVsIGFuw6FsaXNpcy4gTGFzIHZpc3VhbGl6YWNpb25lcyBqdWdhcsOhbiB1biBwYXBlbCBjbGF2ZSBlbiBsYSByZXByZXNlbnRhY2nDs24gZ3LDoWZpY2EgZGUgZXN0YXMgcmVsYWNpb25lcywgYnJpbmRhbmRvIHVuYSBmb3JtYSBjbGFyYSB5IGFjY2VzaWJsZSBkZSBleHBsb3JhciBsb3MgZGF0b3MgeSBmYWNpbGl0YXIgc3UgY29tcHJlbnNpw7NuLiBUb2RvIGVzdG8gc2UgbGxldmFyw6EgYSBjYWJvIHV0aWxpemFuZG8gbGFzIGhlcnJhbWllbnRhcyBSIHkgUlN0dWRpbywgcXVlIHBlcm1pdGlyw6FuIHVuYSBlamVjdWNpw7NuIGVmaWNpZW50ZSB5IHByZWNpc2EgZGUgbG9zIGPDoWxjdWxvcyB5IGxhIGNyZWFjacOzbiBkZSBncsOhZmljb3MgaW50ZXJhY3Rpdm9zIHBhcmEgdW5hIGludGVycHJldGFjacOzbiBtw6FzIGNvbXBsZXRhIGRlIGxvcyByZXN1bHRhZG9zLg0KDQpMYXMgdMOpY25pY2FzIHkgZW5mb3F1ZXMgdXRpbGl6YWRvcyBlbiBlc3RlIGVzdHVkaW8gc2UgYmFzYW4gZW4gZGl2ZXJzYXMgZnVlbnRlcyBiaWJsaW9ncsOhZmljYXMgb3RvcmdhZGFzIHBvciBlbCBwcm9mZXNvciBhbCBpbmljaWFyIGVsIGN1cnNvLiBFbnRyZSBlbGxhcyBzZSBpbmNsdXllbiBlbCBsaWJybyBBbsOhbGlzaXMgZXN0YWTDrXN0aWNvIGRlIGRhdG9zIG11bHRpdmFyaWFkb3MgZGVsIHByb2Zlc29yIEx1aXMgR3VpbGxlcm1vIETDrWF6IE1vbnJveSBkZSBsYSBVbml2ZXJzaWRhZCBOYWNpb25hbCBkZSBDb2xvbWJpYS4gU2UgaGFjZSBpbXBsZW1lbnRhY2nDs24gZGVsIGxpYnJvIGRlIEFuw6FsaXNpcyBtdWx0aXZhcmlhbnRlIGFwbGljYWRvIGNvbiBSLCBkZSBKb2FxdcOtbiBBbGTDoXMsIGVuIHN1IHNlZ3VuZGEgZWRpY2nDs24sIHF1ZSBwcm9wb3JjaW9uYSBoZXJyYW1pZW50YXMgZXNlbmNpYWxlcyBwYXJhIHJlYWxpemFyIGFuw6FsaXNpcyBhdmFuemFkb3MgY29uIGVzdGUgc29mdHdhcmUuIFNlIGluY29ycG9yYSBsYSBvYnJhIEVzdGFkw61zdGljYSBhcGxpY2FkYSBhIGxvcyBuZWdvY2lvcyB5IGxhIGVjb25vbcOtYSBkZSBMaW5kICgxNcKqIGVkaWNpw7NuKSwgeSBsYSBQcm9iYWJpbGlkYWQgeSBlc3RhZMOtc3RpY2EgcGFyYSBpbmdlbmllcsOtYSBpbmR1c3RyaWFsIGRlIERldm9yZSAoc8OpcHRpbWEgZWRpY2nDs24pLCBSZWZlcmVuY2lhcyBjbGF2ZSBwYXJhIGd1aWFyIHkgZXN0cnVjdHVyYXIgZWwgZW5mb3F1ZSBtZXRvZG9sw7NnaWNvIGRlbCBlc3R1ZGlvLg0KDQoNCiMjIyAqKjEuMS4gT2JqZXRpdm9zKioNCg0KRWwgb2JqZXRpdm8gZGUgZXN0ZSBwcm95ZWN0byBlcyBhcGxpY2FyIHTDqWNuaWNhcyBkZSBhbsOhbGlzaXMgbXVsdGl2YXJpYWRvIHBhcmEgZ2VzdGlvbmFyIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGFwcm9iYWRvLCBjb3JyZXNwb25kaWVudGUgYSByZWdpc3Ryb3MgbWVkaWNvcyByZWxhY2lvbmFkb3MgY29uIGVsIHRyYXN0b3JubyBkZWwgc3Vlw7FvLiBFbCBwcm9ww7NzaXRvIGVzIG9yZ2FuaXphciB5IHByb2Nlc2FyIGVmaWNhem1lbnRlIGxhIGluZm9ybWFjacOzbiwgZGVzYXJyb2xsYW5kbyBoYWJpbGlkYWRlcyBlbiBsYSBnZXN0acOzbiB5IGFuw6FsaXNpcyBkZSBkYXRvcy4gRXN0ZSB0cmFiYWpvIHNlIGVubWFyY2EgZGVudHJvIGRlbCBjdXJzbyBkZSAqKkdlc3Rpw7NuIGRlIERhdG9zKiosIGRpY3RhZG8gcG9yIGVsIFByb2Zlc29yIEdpYW5jYXJsbyBMaWJyZXJvcyBMb25kb8OxbyBlbiBsYSBVbml2ZXJzaWRhZCBkZWwgVmFsbGUuDQoNCiMjIyAqKjEuMi4gRGVzY3JpcGNpw7NuIGRlIGxvcyBkYXRvcyoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCg0KKipGdWVudGUgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIDoqKg0KDQpFbCBjb25qdW50byBkZSBkYXRvcyBkZSB0cmFiYWpvIHNlIG9idHV2byBjYXNpIHRvdGFsbWVudGUgZGUgS2FnZ2xlOiBodHRwczovL3d3dy5rYWdnbGUuY29tL2Frc2hheWRhdHRhdHJheWtoYXJlLiBFcyBjb252ZW5pZW50ZSBhbm90YXIgcXVlIEthZ2dsZSBlcyB1bmEgY29tcGHDscOtYSBzdWJzaWRpYXJpYSBkZSBHb29nbGUgTExDIHF1ZSBtYW50aWVuZSB1bmEgY29tdW5pZGFkIG9ubGluZSBkZSBjaWVudMOtZmljb3MgZGUgZGF0b3MgeSBwcm9mZXNpb25hbGVzIGRlbCBhcHJlbmRpemFqZSBhdXRvbcOhdGljby4gRXN0YSBlbXByZXNhIHBlcm1pdGUgYSBzdXMgdXN1YXJpb3MgZW5jb250cmFyIHkgcHVibGljYXIgY29uanVudG9zIGRlIGRhdG9zLCBleHBsb3JhciB5IGNyZWFyIG1vZGVsb3MgZW4gdW4gZW50b3JubyBkZSBjaWVuY2lhIGRlIGRhdG9zIGJhc2FkbyBlbiBsYSB3ZWIsIHRyYWJhamFyIGNvbiBvdHJvcyBjaWVudMOtZmljb3MgZGUgZGF0b3MgZSBpbmdlbmllcm9zIGRlIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvIHkgcGFydGljaXBhciBlbiBjb25jdXJzb3MgcGFyYSByZXNvbHZlciBkZXNhZsOtb3MgZGUgY2llbmNpYSBkZSBkYXRvcy4NCg0KKipDb250ZXh0byBkZWwgY29uanVudG8gZGUgZGF0b3MgOioqDQoNCkVsIGNvbmp1bnRvIGluY2x1eWUgZGF0b3MgcGVyc29uYWxlcyB5IG1lZGljb3MgYmFzaWNvcyBvYnRlbmlkb3MgZGUgcGVyc29uYXMgYWwgYXphciBlbiB1biBob3NwaXRhbCBjb24gZWwgZmluIGRlIGlkZW50aWZpY2FyIHN1cGVyZmljaWFsbWVudGUgc3UgZXN0aWxvIGRlIHZpZGEgeSBlc3RhZG8gZGUgc2FsdWQgLg0KDQoqKkRlc2NyaXBjaW9uIGRlbCBjb25qdW50byBkZSBkYXRvcyA6KioNCg0KRWwgY29uanVudG8gZGUgZGF0b3MgY29udGllbmUgMTMgY2FtcG9zIHkgMzc0IHJlZ2lzdHJvcy4gVW5vIGRlIGxvcyBjYW1wb3MgZXMgc2ltcGxlbWVudGUgdW4gaWRlbnRpZmljYWRvciBudW3DqXJpY28gc2VjdWVuY2lhbCBkZSBsb3MgcmVnaXN0cm9zICwgb3RybyBkZSBuYXR1cmFsZXphIGJpY290b21pY2EgLCB0cmVzIGRlIG5hdHVyYWxlemEgcG9saXRvbWljYSB5IGVsIHJlc3RvIHNvbiBudW3DqXJpY29zIGVzdHJpY3RhbWVudGUgcG9zaXRpdm9zLiBMYSBsaXN0YSBzaWd1aWVudGUgbG9zIGRlc2NyaWJlIGVuIGVsIG1pc21vIG9yZGVuLCBkZSBpenF1aWVyZGRhIGEgZGVyZWNoYSwgY29tbyBhcGFyZWNlbiBlbiBlbCByYW5nbyBkZSBkYXRvcyBxdWUgbG9zIGNvbnRpZW5lIHkgc2UgZXN0YWJsZWNlIHBhcmEgY2FkYSBjYW1wbywgZXhjZXB0byBlbCBjYW1wbyAiSWRlbnRpZmljYWNpb24gZGUgcGVyc29uYSIsIGVsIHRpcG8gZGUgdmFyaWFibGUgeSBzdSBlc2NhbGEgZGUgbWVkaWNpw7NuIGNvbiBiYXNlIGVuIGxhIG5vbWVuY2xhdHVyYSAodGlwb19kZV92YXJpYWJsZTo6ZXNjYWxhX2RlX21lZGljacOzbltvcmRlbmFtaWVudG9dKToNCg0KLSAqKklkZW50aWZpY2FjaW9uIGRlIHBlcnNvbmEqKiAoaWRlbnRpZmljYWRvcik6IFJlZ2lzdHJhIHVuIG7Dum1lcm8gc2VjdWVuY2lhZG8gYSBwYXJ0aXIgZGUgMSBwYXJhIGlkZW50aWZpY2FyIGVsIHJlZ2lzdHJvIGRlIGNhZGEgcGVyc29uYSBjb25zaWduYWRvIGVuIGxhIGJhc2UgZGF0b3MgZGUgZm9ybWEgw7puaWNhLg0KDQotICoqR2VuZXJvICoqIChjdWFsaXRhdGl2YTo6bm9taW5hbCk6IFJlZ2lzdHJhIGVsIHNleG8gZGVsIGVzdHVkaWFudGUgZGVsIGN1YWwgc2UgcmVnaXN0cmFyb24gbG9zIGRhdG9zICwgZW4gZWwgY2FzbyBkZSBlc3RlIGNhbXBvIHNvbG8gdG9tYSBkb3MgcG9zaWJsZXMgdmFsb3JlcywgbWFzY3VsaW5vIChyZXByZXNlbnRhZG8gY29uIHVuIDEpbyBmZW1lbmlubyhyZXByZXNlbnRhZG8gY29uIHVuIDApLg0KDQotICoqRWRhZCAqKiAoY3VhbnRpdGF0aXZhOjpyYXpvbik6IFJlZ2lzdHJhIGxhIGVkYWQgbWVkaWRhIGVuIGHDsW9zIGRlIGxhIHBlcnNvbmEuDQoNCi0gKipPY3VwYWNpb24qKiAoY3VhbGl0YXRpdmE6Om5vbWluYWwpOiBSZWdpc3RyYSBsYSBvY3VwYWNpb24sIHRyYWJham8gdSBvZmljaW8gZGUgY2FkYSBwZXJzb25hLg0KDQotICoqRHVyYWNpb24gZGUgc3Vlw7FvKiogKGN1YW50aXRhdGl2YTo6cmF6b24pOiBSZWdpc3RyYSBsYSBjYW50aWRhZCBkZSB0aWVtcG8gbWVkaWRhIGVuIGhvcmFzIHF1ZSBkdWVybWUgZGlhcmlhbWVudGUgY2FkYSBwZXJzb25hLCBwYXJhIGVzdG8gc2UgdXRpbGl6YW4gbWVyYW1lbnRlIG51bWVyb3MgZGVjaW1hbGVzIC4NCg0KLSAqKk5pdmVsIGRlIGFjdGl2aWRhZCBmaXNpY2EqKiAoY3VhbnRpdGF0aXZhOjpyYXpvbik6IFJlZ2lzdHJhIGxhIGNhbnRpZGFkIGRlIG1pbnV0b3MgcXVlIGxhIHBlcnNvbmEgcmVhbGl6YSBhY3RpdmlkYWQgZsOtc2ljYSBkaWFyaWFtZW50ZS4gTWVkaWRvIGVuIG1pbnV0b3MuDQoNCi0gKipOaXZlbCBkZSBlc3RyZXMqKiAoY3VhbGl0YXRpdmE6Om9yZGluYWwpOiBSZWdpc3RyYSB1bmEgY2FsaWZpY2FjacOzbiBzdWJqZXRpdmEgZGVsIG5pdmVsIGRlIGVzdHLDqXMgZXhwZXJpbWVudGFkbyBwb3IgbGEgcGVyc29uYSwgcXVlIHZhIGRlbCAxIGFsIDEwLg0KDQotICoqSU1DKiogKGN1YWxpdGF0aXZhOjpub21pbmFsKTogUmVnaXN0cmEgbGEgY2F0ZWdvcmlhIGRlbCBJTUMgZGUgbGEgcGVyc29uYS4NCg0KLSAqKlByZXNpb24gYXJ0ZXJpYWwqKiAoY3VhbGl0YXRpdmE6Om5vbWluYWwpOiBSZWdpc3RyYSBsYSBtZWRpY2nDs24gZGUgbGEgcHJlc2nDs24gYXJ0ZXJpYWwgZGUgbGEgcGVyc29uYSwgaW5kaWNhZGEgY29tbyBwcmVzacOzbiBzaXN0w7NsaWNhIHNvYnJlIHByZXNpw7NuIGRpYXN0w7NsaWNhLg0KDQotICoqRnJlY3VlbmNpYSBjYXJkaWFjYSoqIChjdWFudGl0YXRpdmE6OnJhem9uKTogUmVnaXN0cmEgbGEgZnJlY3VlbmNpYSBjYXJkw61hY2EgZW4gcmVwb3NvIGRlIGxhIHBlcnNvbmEgZW4gbGF0aWRvcyBwb3IgbWludXRvIChscG0pLg0KDQotICoqUGFzb3MgZGlhcmlvcyoqIChjdWFudGl0YXRpdmE6OnJhesOzbik6IFJlZ2lzdHJhIGxhIGNhbnRpZGFkIGRlIHBhc29zIHF1ZSBkYSBsYSBwZXJzb25hIHBvciBkw61hLg0KDQotICoqVHJhbnN0b3JubyBkZWwgc3Vlw7FvKiogKEN1YWxpdGF0aXZhOjpub21pbmFsKTogUmVnaXN0cmEgbGEgcHJlc2VuY2lhIG8gYXVzZW5jaWEgZGUgdW4gdHJhc3Rvcm5vIGRlbCBzdWXDsW8gZW4gbGEgcGVyc29uYSAoTmluZ3VubywgSW5zb21uaW8sIEFwbmVhIGRlbCBzdWXDsW8pLg0KDQpDYWJlIHJlc2FsdGFyIHF1ZSBlbiBlbCBjb25qdW50byBubyBzZSBwcmVzZW50YXJvbiBlc3BhY2lvcyB2YWPDrW9zLCBpbmNvaGVyZW5jaWFzIG8gZXJyb3JlcyB5IGxhcyB2YXJpYWJsZXMgYmljb3RvbWljYXMgeSB0cmljb3RvbWljYXMgZnVlcm9uIHJlZW1wbGF6YWRhcyBwb3IgMSBvIDIgeSAxLCAyIG8gMyByZXNwZWN0aXZhbWVudGUgLg0KDQojIyMjIEVzdHJ1Y3R1cmEgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIG9yaWdpbmFsDQpgYGB7ciBFc3RydWN0dXJhX2RlbF9jb25qdW50b19kZV9kYXRvc19vcmlnaW5hbCwgZmlnLmFsaWduID0gJ2NlbnRlcid9IA0Kc3RyKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9iYXNlKQ0KYGBgDQoNCiMjIyMgQ29uanVudG8gZGUgZGF0b3Mgb3JpZ2luYWwNCmBgYHtyIENvbmp1bnRvX2RlX2RhdG9zX29yaWdpbmFsLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9iYXNlDQpgYGANCg0KIyMjIyBFc3RydWN0dXJhIGRlbCBjb25qdW50byBkZSBkYXRvcyBkZXB1cmFkbw0KYGBge3IgRXN0cnVjdHVyYV9kZWxfY29uanVudG9fZGVfZGF0b3NfZGVwdXJhZG8sIGZpZy5hbGlnbiA9ICdjZW50ZXInfSANCnN0cihjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8pDQpgYGANCg0KIyMjIyBDb25qdW50byBkZSBkYXRvcyBkZXB1cmFkbw0KYGBge3IgQ29uanVudG9fZGVfZGF0b3NfZGVwdXJhZG8sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvDQpgYGANCg0KIyMjICoqMS4zLiBFc3RpbWFjaW9uZXMgbXVsdGl2YXJpYWRhcyoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkxhcyBtZWRpZGFzIGRlIG1lZGlhLCB2YXJpYW56YSB5IGNvdmFyaWFuemEgY29uc3RpdHV5ZW4gdW4gY29uanVudG8gZnVuZGFtZW50YWwgcGFyYSBkZXNjcmliaXIgZWwgY29tcG9ydGFtaWVudG8gcG9zaWNpb25hbCwgZGlzcGVyc2l2byB5IGNvcnJlbGFjaW9uYWwgZGUgdmFyaWFibGVzIGFsZWF0b3JpYXMuIEVuIGVsIGNvbnRleHRvIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zIHF1ZSBjb250aWVuZSBjaW5jbyB2YXJpYWJsZXMgYWxlYXRvcmlhcyBudW3DqXJpY2FzIHkgc2UgcmVwcmVzZW50YSBtYXRyaWNpYWxtZW50ZSwgZXN0YXMgbWVkaWRhcyBzZSBjYWxjdWxhbiB1dGlsaXphbmRvIHZlY3RvcmVzIHkgbWF0cmljZXMgZW4gZWwgYW7DoWxpc2lzIGRlc2NyaXB0aXZvIG11bHRpdmFyaWFibGUuDQoNCkVsIHZlY3RvciBkZSBtZWRpYXMgZGVzY3JpYmUgZWwgY29tcG9ydGFtaWVudG8gcG9zaWNpb25hbCBkZSBjYWRhIHZhcmlhYmxlIGVuIHJlbGFjacOzbiBjb24gdG9kb3Mgc3VzIHJlZ2lzdHJvcywgcmVwcmVzZW50YW5kbyBlbCB2YWxvciBlc3BlcmFkbyBvIHB1bnRvIG1lZGlvIHBhcmEgY2FkYSB2YXJpYWJsZS4NCg0KTGEgbWF0cml6IGRlIHZhcmlhbnphcy1jb3ZhcmlhbnphcyBwcm9wb3JjaW9uYSBpbmZvcm1hY2nDs24gc29icmUgbGFzIGRpc3BlcnNpb25lcyBkZSBjYWRhIHZhcmlhYmxlIGVuIHJlbGFjacOzbiBjb24gc3VzIG1lZGlhcy4gRW4gc3UgZGlhZ29uYWwgcHJpbmNpcGFsLCBzZSBlbmN1ZW50cmFuIGxhcyB2YXJpYW56YXMgZGUgY2FkYSB2YXJpYWJsZSByZXNwZWN0byBhIHN1IG1lZGlhLiBQb3IgZW5jaW1hIG8gcG9yIGRlYmFqbyBkZSBsYSBkaWFnb25hbCBwcmluY2lwYWwsIHNlIGVuY3VlbnRyYW4gbGFzIGNvdmFyaWFuemFzIHF1ZSBlc3RpbWFuIGxhcyByZWxhY2lvbmVzIGxpbmVhbGVzIGVudHJlIHRvZGFzIGxhcyBjb21iaW5hY2lvbmVzIHBvc2libGVzIGRlIHBhcmVzIGRlIHZhcmlhYmxlcyBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KKipQbGFudGVhbWllbnRvIGRlbCBQcm9ibGVtYSoqDQoNCkNvbiBiYXNlIGVuIGVsIGNvanVudG8gZGUgZGF0b3MgbWVuY2lvbmFkbyBhbnRlcmlvcm1lbnRlIGxvIHF1ZSBzZSBwcmV0ZW5kZXJhIGVzIGNhbGN1bGFyIGUgaW50ZXJwcmV0YXIgZXN0ZSBjb25qdW50bywgcGFyYSBsYXMgdmFyaWFibGVzIGVzdHJpY3RhbWVudGUgbnVtw6lyaWNhcywgY29tbzogZWwgdmVjdG9yIGRlIG1lZGlhcywgbGEgdmFyaWFuemEtY292YXJpYW56YSB5IGxhIG1hdHJpeiBkZSBjb3JyZWxhY2lvbmFkYXMuIFBhcmEgcmVjb3JkYXIgY3VhbGVzIGZ1ZXJvbiBsYXMgdmFyaWFibGVzIG51bcOpcmljYXMgKGNvbiB1bmEgZXNjYWxhIGRlIG1lZGljacOzbiBkZSByYXrDs24pIHNvbjogKipFZGFkKiosICoqRHVyYWNpw7NuX2RlbF9zdWXDsW8qKiwgKipOaXZlbF9kZV9hY3RpdmlkYWQgZsOtc2ljYSoqLCAqKkZyZWN1ZW5jaWFfY2FyZMOtYWNhKiogeSAqKlBhc29zX2RpYXJpb3MqKi4NCg0KKipEZXNhcnJvbGxvIGRlbCBBbsOhbGlzaXMgKioNCg0KRW4gYmFzZSBhIGxhIG5hdmVnYWNpw7NuIGRlIHBlc3Rhw7FhcyBxdWUgbm9zIHBlcm1pdGUgUlN0dWRpbyBzZSBjYWxjdWzDsyBsb3Mgc2lndWllbnRlcyB0cmVzIG9iamV0b3M6ICoqVmVjdG9yIGRlIE1lZGlhcyoqLCAqKk1hdHJpeiBkZSBWYXJpYW56YXMtQ29iYXJpYW56YXMqKiB5ICoqTWF0cml6IGRlIENvcnJlbGFjaW9uZXMqKi4NCg0KQmFzw6FuZG9ub3MgZW4gbGEgcGVzdGHDsWEgKipWZWN0b3IgZGUgTWVkaWFzKiosIHNlIG9ic2VydmEgcXVlIGVuIGdlbmVyYWwgbG9zIGRhdG9zIHJlZ2lzdHJhZG9zIHBhcmEgY2FkYSB1bmEgZGUgbGFzIHZhcmlhYmxlcyB0aWVuZGVuIGEgZXN0YXIgYmFzdGFudGVzIGNlbnRyYWRhcyBlbiBzdXMgZGlzdHJpYnVjaW9uZXMsIGxvIHF1ZSBpbXBsaWNhIHF1ZSBsYXMgbWVkaWFzIGVzdGltYWRhcyBzZWFuIG1hcyBvIG1lbm9zIHNlbWVqYW50ZXMgZW4gY29tcGFyYWNpw7NuIGRlIGxhIG1lZGlhbmEsIHNvbG8gbGFzIHZhcmlhYmxlcyAqKkZyZWN1ZW5jaWEgY2FyZMOtYWNhKiogeSAqKlBhc29zIGRpYXJpb3MqKiBtdWVzdHJhbiB1biBzZXNnbyBtYXMgbm90b3JpbyBlbiBjb21wYXJhY2nDs24gY29uIGxhcyBkZW3DoXMuIFRhbWJpw6luIHNlIGhhIG9ic2VydmFkbyBxdWUgdG9kb3MgbG9zIGNhc29zIGF0w61waWNvcyBzZSBlbmN1ZW50cmFuIGVuIGVsIGV4dHJlbW8gc3VwZXJpb3IuDQoNCkJhc2FuZG9ub3MgZW4gbGEgcGVzdGHDsWEgKipNYXRyaXogZGUgVmFyaWFuemEtQ292YXJpYW56YSoqIFNlIHB1ZWRlIGludGVycHJldGFyIHF1ZSBlbiBnZW5lcmFsLCBsYXMgcmVsYWNpb25lcyBlbnRyZSBsYXMgdmFyaWFibGVzIHRvbWFkYXMgcG9yIHBhcmVzIGVuIHN1IG1heW9yw61hIHRpZW5kZW4gYSBzZXIgZGUgcHJvcG9yY2lvbmFsaWRhZCBkaXJlY3RhIHkgZW4gbGEgZGlhZ29uYWwgZGUgbGEgbWF0cml6IHBvZGVtb3Mgb2JzZXJ2YXIgY29tbyB2YXJpYW4gbG9zIGRhdG9zIGRlbnRybyBkZSBzdSBwcm9waWEgY2xhc2lmaWNhY2nDs24uDQoNCkJhc2FuZG9ub3MgZW4gbGEgcGVzdGHDsWEgKipNYXRyaXogZGUgQ29ycmVsYWNpb25lcyoqIHkgYWwgY29uc2lkZXJhciBsb3MgcmVzdWx0YWRvcyBkZSBsYSAqKk1hdHJpeiBkZSBWYXJpYW56YXMtQ292YXJpYW56YXMqKiBzZSBwdWVkZSB2ZXJpZmljYXIgcXVlIGxvcyBjb2VmaWNpZW50ZXMgZGUgY29ycmVsYWNpw7NuIHNvbiBuZWdhdGl2b3MgeSBwb3NpdGl2b3MgZW50cmUgbGFzIHZhcmlhYmxlczogKipFZGFkKiosICoqRHVyYWNpw7NuIGRlbCBzdWXDsW8qKiwgKipOaXZlbCBkZSBhY3RpdmlkYWQgZsOtc2ljYSoqLCAqKkZyZWN1ZW5jaWEgY2FyZMOtYWNhKiogeSAqKlBhc29zIGRpYXJpb3MqKi4gRXN0YXMgY29ycmVsYWNpb25lcyBlcmFuIGRlIGVzcGVyYXJzZSBlbiBlbCBjb25qdW50byBlc3R1ZGlhZG8gZGFkbyBsYSBwb3NpYmxlIHJlbGFjacOzbiBlbnRyZSBjYWRhIHVuYS4NCg0KIyMjVmVjdG9yIGRlIE1lZGlhcyAgIA0KYGBge3IgdmVjdG9yX21lZGlhcyAsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KYXBwbHkoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWywtYygxLDIsMyw0LDksMTQpXSwgMiwgbWVhbikNCmNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9SZWR1Y2lkbyA9IGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkb1ssLWMoMSwyLDMsNCw5LDE0KV0NCm5vbWJyZXNfYm94cGxvdHMgPC0gYygiRHVyYWNpb25fZGVfc3Vlbm8iLCAiQ2FsaWRhZF9kZWxfc3Vlbm8iLCAiTml2ZWxfZGVfYWN0aXZpZGFkX2Zpc2ljYSIsICJOaXZlbF9kZV9lc3RyZXMiLCAiUHJlc2lvbl9zaXN0b2xhIiwiUHJlc2lvbl9kaWFzdG9sYSIsIkZyZWN1ZW5jaWFfY2FyZGlhY2EiLCJQYXNvc19kaWFyaW9zIikNCnBhcihtZnJvdyA9IGMoMSwgbmNvbChjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfUmVkdWNpZG8pKSkNCmludmlzaWJsZShsYXBwbHkoMTpuY29sKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9SZWR1Y2lkbyksIGZ1bmN0aW9uKGkpIHtib3hwbG90KGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9SZWR1Y2lkb1ssIGldLG1haW4gPSBub21icmVzX2JveHBsb3RzW2ldKX0pKQ0KDQpgYGANCg0KIyMjIyBNYXRyaXogZGUgVmFyaWFuemFzLUNvdmFyaWFuemFzDQpgYGB7ciBtYXRyaXpfZGVfVmFyaWFuemFzX0NvdmFyaWFuemFzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnJvdW5kKGNvdihjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG9bLC1jKDEsMiwzLDQsOSwxNCldKSwyKQ0KDQpgYGANCg0KIyMjIyBNYXRyaXogZGUgQ29ycmVsYWNpb25lcw0KYGBge3IgbWF0cml6X2RlX0NvcnJlbGFjaW9uZXMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kcm91bmQoY29yKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkb1ssLWMoMSwyLDMsNCw5LDE0KV0pLDMpDQpgYGANCg0KDQoNCiMjIyAqKjEuNC4gR3LDoWZpY2FzIG11bHRpdmFyaWFkYXMqKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpFbiBlbCBsaWJybyAgc2UgbWVuY2lvbmEgcXVlLCBlbiBnZW5lcmFsLCBsb3MgZ3LDoWZpY29zIG11bHRpdmFyaWFkb3MgY3VtcGxlbiBkb3Mgb2JqZXRpdm9zIGVzZW5jaWFsZXM6IHByaW1lcm8sIGF5dWRhbiBhIGNvbXBhcmFyIGVsIGNvbXBvcnRhbWllbnRvIGRlIHBvYmxhY2lvbmVzIGRlIGVzdHVkaW8gY29uIGJhc2UgZW4gdmFyaWFibGVzIGNhdGVnw7NyaWNhcyB5IGZhY2lsaXRhbiBsYSBjb21wcmVuc2nDs24gZGUgbGEgZXN0cnVjdHVyYSBkZSBjb3JyZWxhY2nDs24gZW50cmUgdmFyaWFzIHZhcmlhYmxlcy4gRW4gZXN0ZSBzZW50aWRvLCBlbCBjb25qdW50byBkZSBkYXRvcyBkZSB0cmFiYWpvIHRlbmRyw6EgYXBveW8gZGVzY3JpcHRpdm8gZ3LDoWZpY28gYSB0cmF2w6lzIGRlIHRyZXMgZGlhZ3JhbWFzOiB1bm8gY29uanVudG8gcXVlIGludGVncmEgZGlzcGVyc2nDs24sIGRpc3RyaWJ1Y2nDs24geSBjb3JyZWxhY2lvbmVzOyBvdHJvIGJhc2FkbyBlbiBsYSByZW5kZXJpemFjacOzbiBkZSBwb2zDrWdvbm9zOyB5LCBwb3Igw7psdGltbywgdW5vIHF1ZSByZWN1cnJlIGEgbGFzIGNhcmFzIGRlIENoZXJub2ZmLg0KDQpDb24gYmFzZSBlbiBlbCBjb25qdW50byBkZSBkYXRvcyBkZXNjcml0byBlbiBsYSBbc2VjY2nDs24gMS4yXSgjc2VjMS4yKSBzZSBjYWxjdWxhcsOhbiBlIGludGVwcmV0YXLDoW4sIHBhcmEgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzLCBsYXMgZ3LDoWZpY2FzIG11bHRpdmFyaWFkYXMgZGUgZGlhZ3JhbWEgZGUgY29ycmVsYWNpb25lcywgbWF0cml6IGRlIGRpYWdyYW1hIGRlIGRpc3BlcnNpw7NuLCBkaWFncmFtYSBkZSBlc3RyZWxsYXMgeSBjYXJhcyBkZSBDaGVybm9mZi4gU2UgcmVjdWVyZGEgcXVlIGxhcyB2YXJpYWJsZXMgbnVtw6lyaWNhcyAoZW4gZXNjYWxhZGEgZGUgbWVkaWNpw7NuIGRlIHJhesOzbikgc29uOiAqKkVkYWQqKiwgKipEdXJhY2lvbl9kZV9zdWVubyoqLCAqKmNhbGlkYWRfZGVfc3Vlbm8qKiwgKipOaXZlbF9kZV9hY3RpdmlkYWRfZmlzaWNhKiogeSAqKk5pdmVsX2RlX2VzdHJlcyoqICwqKlByZXNpb25fc2lzdG9sYSoqICwgKipQcmVzaW9uX2RpYXRvbGEgLCAqKmZyZWN1ZW5jaWFfY2FyZGlhY2EqKiAsKipQYXNvc19kaWFyaW9zKiouDQoNCg0KIyMjIyBEaWFncmFtYSBDb25qdW50byBkZSBEaXNwZXJzacOzbiwgRGlzdHJpYnVjacOzbiB5IENvcnJlbGFjaW9uZXMgW0NBOkdFXQ0KYGBge3IgRGlhZ3JhbWFfY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX0dlbmRlciAsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJEdlbmVybyA8LSBmYWN0b3IoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2Jhc2UkR2VuZXJvKQ0KbGV2ZWxzPSBjICgwLDEpDQpsYWJlbHM9IGMgKCAiRiIgLCAiTSIpDQpnZ3BhaXJzKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbywgY29sdW1ucyA9IGMoMyw1LDYsNyksIGFlcyhjb2xvciA9IEdlbmVybywgYWxwaGEgPSAwLjUpLCB1cHBlciA9IGxpc3QoY29udGludW91cyA9IHdyYXAoImNvciIsIHNpemUgPSAyLjUpKSkNCmBgYA0KDQpgYGB7ciBEaWFncmFtYV9jZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfR2VuZGVyXzEgLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmdncGFpcnMoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvLCBjb2x1bW5zID0gYyg3LDgsMTAsMTEsMTIsMTMpLCBhZXMoY29sb3IgPSBHZW5lcm8sIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIyBEaWFncmFtYSBkZSBFc3RyZWxsYXMNCmBgYHtyIGRpYWdyYW1hX2RlX0VzdHJlbGxhcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpzZXQuc2VlZCgxMjA1MjIpDQpjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfTXVlc3RyZWFkbyA9IGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkb1tzYW1wbGUoMTpucm93KGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9iYXNlKSwyMyksLWMoMSwyLDQsOSwxNCldDQpzdGFycyhjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfTXVlc3RyZWFkbywgbGVuID0gMSwgY2V4ID0gMC40LCBrZXkubG9jID0gYygxMCwgMiksIGRyYXcuc2VnbWVudHMgPSBUUlVFKQ0KDQoNCmBgYA0KDQojIyMjIENhcmFzIGRlIENoZXJub2ZmDQpgYGB7ciBjYXJhc19kZV9DaGVybm9mZiwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpzZXQuc2VlZCgxMjA1MjIpDQpjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfYmFzZSA9IGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkb1tzYW1wbGUoMTpucm93KGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9iYXNlKSwyMyksLWMoMSwyLDQsOSldDQpmYWNlcyhjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfYmFzZSkNCg0KYGBgDQojIyMgKioxLjUuIE5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhKiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KUGFyYSBpbnZlc3RpZ2FyIG8gZGV0ZXJtaW5hciBlbCB0aXBvIGRlIGRpc3RyaWJ1Y2nDs24gbXVsdGl2YXJpYWRhIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zLCBzZSBwdWVkZW4gdXRpbGl6YXIgcHJvY2VkaW1pZW50b3MgZGVzY3JpcHRpdm9zLCBjb21vIGdyw6FmaWNvcywgbyBwcm9jZWRpbWllbnRvcyBpbmZlcmVuY2lhbGVzLCBjb21vIHBydWViYXMgZXN0YWTDrXN0aWNhcy4gRW4gZXN0ZSBjb250ZXh0bywgc2UgbG9ncmEgdW5hIGdlbmVyYWxpemFjacOzbiBkZSByZXN1bHRhZG9zIGFsIGVtcGxlYXIgZXN0b3Mgw7psdGltb3MsIGF1bnF1ZSBsb3MgcHJpbWVyb3MgcmVzcGFsZGFuIGxhcyBpbnRlcnByZXRhY2lvbmVzLg0KDQpFbiBlc3RhIHNlY2Npw7NuIHNlIGNvbnNpZGVyYSBlbCB1c28gZGUgcHJvY2VkaW1pZW50b3MgaW5mZXJlbmNpYWxlcyBwYXJhIGRldGVybWluYXIgc2kgZWwgY29uanVudG8gZGUgZGF0b3MgY29uIHJlc3BlY3RvIGEgc3VzIHZhcmlhYmxlcyBudW3DqXJpY2FzLCBzaWd1ZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgbXVsdGl2YXJpYWRhIChETk0pLiBTZSBhcGxpY2Fyw6FuIHBydWViYXMgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEgKFBOTSkgcXVlIGluY2x1eWVuIGxhcyBwcnVlYmFzIGRlIE1hcmRpYSwgSGVuemUtWmlya2xlciwgRG9vcm5pay1IYW5zZW4geSBSb3lzdG9uLiBFc3RhcyBwcnVlYmFzIGRlIG5vcm1hbGlkYWQgc2UgbGxldmFyw6FuIGEgY2FibyBjb24gdW4gbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSAkXGFscGhhID0gMC4wNSQgeSBiYWpvIGxhcyBzaWd1aWVudGVzIGhpcMOzdGVzaXM6JCRIXzA6IFx0ZXh0IHtFbCBjb25qdW50byBkZSBkYXRvcyBzaWd1ZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgbXVsdGl2YXJpYWRhLn0kJCAkJEhfMTogXHRleHQge0VsIGNvbmp1bnRvIGRlIGRhdG9zIE5PIHNpZ3VlIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCBtdWx0aXZhcmlhZGEufSQkIA0KDQpMYSBwcnVlYmEgZGUgTWFyZGlhIHNlIGZ1bmRhbWVudGEgZW4gZXh0ZW5zaW9uZXMgZGUgYXNpbWV0csOtYSB5IGN1cnRvc2lzLCBlbCBjdWFkcmFkbyBkZSBsYSBkaXN0YW5jaWEgZGUgTWFoYWxhbm9iaXMsIGxhIGNhbnRpZGFkIGRlIHZhcmlhYmxlcyAkcCQgZW4gYW7DoWxpc2lzIHkgbGEgY2FudGlkYWQgZGUgcmVnaXN0cm9zICRuJC4gRW4gZXN0ZSBjb250ZXh0bywgbGEgcHJ1ZWJhIGVzdGFkw61zdGljYSBwYXJhIGxhIGFzaW1ldHLDrWEgc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gJFxjaGleMiQsIG1pZW50cmFzIHF1ZSBsYSBwcnVlYmEgZXN0YWTDrXN0aWNhIHBhcmEgbGEgY3VydG9zaXMgc2UgYXByb3hpbWEgYSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwuDQoNCkxhIHBydWViYSBkZSBIZW56ZS1aaXJrbGVyIHNlIGZ1bmRhbWVudGEgZW4gbGEgZGlzdGFuY2lhIGZ1bmNpb25hbC4gU2kgZWwgY29uanVudG8gZGUgZGF0b3Mgc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIG11bHRpdmFyaWFkYSwgZWwgZXN0YWTDrXN0aWNvIGRlIGxhIHBydWViYSBzZSBkaXN0cmlidXllIGFwcm94aW1hZGFtZW50ZSBjb21vIHVuYSBsb2ctbm9ybWFsLCBjb24gcGFyw6FtZXRyb3MgZGUgbWVkaWENCiRcbXUkIHkgdmFyaWFuemEgJFxzaWdtYV4yJC4NCg0KTGEgcHJ1ZWJhIGRlIERvb3JuaWstSGFuc2VuIHNlIGJhc2EgZW4gbGEgYXNpbWV0csOtYSB5IGxhIGN1cnRvc2lzIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zIG11bHRpdmFyaWFkb3MsIGxvcyBjdWFsZXMgc2UgdHJhbnNmb3JtYW4gcGFyYSBhc2VndXJhciBsYSBpbmRlcGVuZGVuY2lhLiBFc3RhIHBydWViYSBzZSBjb25zaWRlcmEgbcOhcyBwb3RlbnRlIHF1ZSBsYSBwcnVlYmEgZGUgU2hhcGlyby1XaWxrIGVuIGNhc29zIG11bHRpdmFyaWFkb3MuIEVsIGVzdGFkw61zdGljbyBkZSBwcnVlYmEgZXN0w6EgZGVmaW5pZG8gY29tbyBsYSBzdW1hIGRlIGxhcyB0cmFuc2Zvcm1hY2lvbmVzIGFsIGN1YWRyYWRvIGRlIGxhIGFzaW1ldHLDrWEgeSBsYSBjdXJ0b3NpcywgeSBzaWd1ZSBhcHJveGltYWRhbWVudGUgdW5hIGRpc3RyaWJ1Y2nDs24gJFxjaGleMiQuDQoNCkxhIHBydWViYSBkZSBSb3lzdG9uIHV0aWxpemEgbGFzIHBydWViYXMgZGUgU2hhcGlyby1XaWxrIG8gU2hhcGlyby1GcmFuY2lhIHBhcmEgZXZhbHVhciBsYSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYS4gU2kgbGEgY3VydG9zaXMgZXMgbWF5b3IgcXVlIDMsIGxhIHBydWViYSBkZSBSb3lzdG9uIGVtcGxlYSBTaGFwaXJvLUZyYW5jaWEgcGFyYSBkaXN0cmlidWNpb25lcyBsZXB0b2PDunJ0aWNhcy4gUG9yIG90cm8gbGFkbywgcGFyYSBkaXN0cmlidWNpb25lcyBwbGF0aWPDunJ0aWNhcyB1dGlsaXphIFNoYXBpcm8tV2lsay4gRW4gZXN0YSBwcnVlYmEsIGxvcyBwYXLDoW1ldHJvcyBzb24gb2J0ZW5pZG9zIG1lZGlhbnRlIGFwcm94aW1hY2lvbmVzIHBvbGlub21pYWxlcy4NCg0KKipQbGFudGVhbWllbnRvIGRlbCBQcm9ibGVtYSoqDQoNCkNvbiBiYXNlIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlc2NyaXRvIGVuIGxhIGZhc2UgMSBzZWNjacOzbiAxLjIsIHNlIHJlYWxpemFyw6EgdW5hIHBydWViYSBlc3RhZMOtc3RpY2EgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEgY29uIHVuIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgJFxhbHBoYT0wLjA1JCwgcGFyYSBkZXRlcm1pbmFyIHNpIGxvcyBkYXRvcyBtw6l0cmljb3MgcHJvdmllbmVuIGRlIHVuYSBwb2JsYWNpw7NuIG5vcm1hbCBtdWx0aXZhcmlhZGEuIExhcyB2YXJpYWJsZXMgbnVtw6lyaWNhcyBkZWwgY29uanVudG8gZGUgZGF0b3MgKGVuIGVzY2FsYSBkZSBtZWRpY2nDs24gZGUgcmF6w7NuKSBzb246ICoqRWRhZCoqLCAqKkR1cmFjaW9uX2RlbF9zdWVubyoqLCAqKk5pdmVsX2RlX2FjdGl2aWRhZF9maXNpY2EqKiwgKipGcmVjdWVuY2lhX2NhcmRpYWNhKiogeSAqKlBhc29zX2RpYXJpb3MqKi4NCg0KU2UgdXRpbGl6YXLDoSB1bmEgZGUgbGFzIHBydWViYXMgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEgbWVuY2lvbmFkYXMgYW50ZXJpb3JtZW50ZSwgY29tbyBsYSBwcnVlYmEgZGUgTWFyZGlhLCBIZW56ZS1aaXJrbGVyLCBEb29ybmlrLUhhbnNlbiBvIFJveXN0b24sIGRlcGVuZGllbmRvIGRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGFzIHZhcmlhYmxlcyB5IGxhIGN1cnRvc2lzIG9ic2VydmFkYS4gRWwgb2JqZXRpdm8gZXMgZXZhbHVhciBzaSBlc3RhcyB2YXJpYWJsZXMgc2lndWVuIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCBjb25qdW50YSBlbiBlbCBlc3BhY2lvIG11bHRpdmFyaWFkby4NCg0KRWwgcHJvY2VkaW1pZW50byBpbXBsaWNhcsOhIGNhbGN1bGFyIGVsIGVzdGFkw61zdGljbyBkZSBwcnVlYmEgZXNwZWPDrWZpY28gKHBvciBlamVtcGxvLCBiYXNhZG8gZW4gYXNpbWV0csOtYSB5IGN1cnRvc2lzKSB5IGNvbXBhcmFybG8gY29uIHN1IGRpc3RyaWJ1Y2nDs24gdGXDs3JpY2EgYmFqbyBsYSBoaXDDs3Rlc2lzIG51bGEgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEuIFNlIGVzdGFibGVjZXLDoSB1biBjcml0ZXJpbyBkZSByZWNoYXpvIGRlIGxhIGhpcMOzdGVzaXMgbnVsYSBzaSBlbCB2YWxvciAkcC12YWx1ZSQgYXNvY2lhZG8gYWwgZXN0YWTDrXN0aWNvIGRlIHBydWViYSBlcyBtZW5vciBxdWUgJFxhbHBoYSQuDQoNClVuYSBjb25jbHVzacOzbiBwb3NpdGl2YSAobm8gcmVjaGF6byBkZSBsYSBoaXDDs3Rlc2lzIG51bGEpIGluZGljYXLDrWEgZXZpZGVuY2lhIGRlIHF1ZSBsYXMgdmFyaWFibGVzIGFuYWxpemFkYXMgc2lndWVuIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCBtdWx0aXZhcmlhZGEuIFBvciBlbCBjb250cmFyaW8sIHVuIHJlY2hhem8gZGUgbGEgaGlww7N0ZXNpcyBudWxhIHN1Z2VyaXLDrWEgcXVlIGFsIG1lbm9zIHVuYSBkZSBsYXMgdmFyaWFibGVzIG5vIHNpZ3VlIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCwgbG8gcXVlIHBvZHLDrWEgdGVuZXIgaW1wbGljYWNpb25lcyBlbiBlbCBhbsOhbGlzaXMgcG9zdGVyaW9yIGRlIGxvcyBkYXRvcy4NCg0KKipEZXNhcnJvbGxvIGRlbCBBbsOhbGlzaXMqKg0KDQpMYSBleHBsb3JhY2nDs24gYSB0cmF2w6lzIGRlIGxhcyBkaWZlcmVudGVzIHBydWViYXMgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEgaW5kaWNhIHF1ZSBlbCBjb25qdW50byBkZSBkYXRvcywgY29uc2lkZXJhbmRvIHN1cyB2YXJpYWJsZXMgbnVtw6lyaWNhcywgbm8gc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIG11bHRpdmFyaWFkYS4gQXF1w60gZXN0w6FuIGxvcyBoYWxsYXpnb3MgY2xhdmUgZGUgY2FkYSBwcnVlYmE6DQoNCi0gKipQcnVlYmEgZGUgTWFyZGlhKio6IExvcyB2YWxvcmVzICRwJCBhc29jaWFkb3MgY29uIGxhcyBwcnVlYmFzIGRlIGFzaW1ldHLDrWEgKFNrZXduZXNzKSB5IGN1cnRvc2lzIChLdXJ0b3Npcykgc29uIG1lbm9yZXMgcXVlIGVsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgJFxhbHBoYSA9IDAuMDUkLiBFc3RvIHN1Z2llcmUgcXVlIG5vIGhheSBzdWZpY2llbnRlIGV2aWRlbmNpYSBwYXJhIHNvc3RlbmVyIGxhIGhpcMOzdGVzaXMgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEgcGFyYSBsYXMgdmFyaWFibGVzIGRlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KLSAqKlBydWViYSBkZSBIZW56ZS1aaXJrbGVyKio6IEVsIGVzdGFkw61zdGljbyBkZSBwcnVlYmEgbm8gc2UgZGlzdHJpYnV5ZSBhcHJveGltYWRhbWVudGUgY29tbyBsb2ctbm9ybWFsLCB5YSBxdWUgZWwgdmFsb3IgJHAkIGVzIG1lbm9yIHF1ZSAkXGFscGhhID0gMC4wNSQuIFBvciBsbyB0YW50bywgbm8gaGF5IGFwb3lvIHBhcmEgcXVlIGVsIGNvbmp1bnRvIGRlIGRhdG9zIHNpZ2EgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIG11bHRpdmFyaWFkYSBzZWfDum4gZXN0YSBwcnVlYmEuDQoNCi0gKipQcnVlYmEgZGUgRG9vcm5pay1IYW5zZW4qKjogRWwgZXN0YWTDrXN0aWNvIGRlIHBydWViYSBubyBzaWd1ZSB1bmEgZGlzdHJpYnVjacOzbiAkXGNoaV4yJCBhcHJveGltYWRhbWVudGUsIGRhZG8gcXVlIGVsIHZhbG9yICRwJCBlcyBtZW5vciBxdWUgJFxhbHBoYSA9IDAuMDUkLiBFc3RvIHN1Z2llcmUgcXVlIGxhcyBldmlkZW5jaWFzIG5vIHJlc3BhbGRhbiBsYSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYSBkZWwgY29uanVudG8gZGUgZGF0b3MuDQoNCi0gKipQcnVlYmEgZGUgUm95c3RvbioqOiBFbCBjb25qdW50byBkZSBkYXRvcywgcmVkdWNpZG8gYSBzdXMgdmFyaWFibGVzIG51bcOpcmljYXMsIG5vIHNpZ3VlIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCBtdWx0aXZhcmlhZGEgc2Vnw7puIGVzdGEgcHJ1ZWJhLCB5YSBxdWUgZWwgdmFsb3IgJHAkIGVzIG1lbm9yIHF1ZSAkXGFscGhhID0gMC4wNSQuDQoNCkVuIHJlc3VtZW4sIGNvbiB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGRlICQwLjA1JCwgbGFzIHBydWViYXMgaW5kaWNhbiBjb25zaXN0ZW50ZW1lbnRlIHF1ZSBlbCBjb25qdW50byBkZSBkYXRvcyBhbmFsaXphZG8sIGNvbiByZXNwZWN0byBhIHN1cyB2YXJpYWJsZXMgbnVtw6lyaWNhcywgbm8gc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIG11bHRpdmFyaWFkYSBlc3RvIGxvIHNhYmVtb3MgeWEgcXVlIHRvZG9zIGxvcyByZXN1bHRhZG9zIHNvbiBtZW5vcmVzIGFsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgbG8gY3VhbCBoYWNlIHF1ZSBlc3RlIGhhbGxhemdvIGVzYSBpbXBvcnRhbnRlIHBhcmEgbGEgaW50ZXJwcmV0YWNpw7NuIHkgZWwgYW7DoWxpc2lzIHN1YnNpZ3VpZW50ZSBkZSBsb3MgZGF0b3MuDQoNCkVycm9yIGNhcmRhdGE6IGVzdGUgZXJyb3Igc2UgcHJlc2VudGEgYWwgaW50ZW50YXIgYnVzY2FyIHVuIGFyY2hpdm8gZW4gdW5hIGxpYnJlcsOtYSBpbmV4aXN0ZW50ZSwgeWEgcXVlIG5vIGZ1ZSBwb3NpYmxlIGluc3RhbGFybGEgZGViaWRvIGEgcHJvYmxlbWFzIHTDqWNuaWNvcyBpbnRlcm5vcyB5IGRlcGVuZGVuY2lhcyBub8Kgc2F0aXNmZWNoYXMuDQoNCmBgYHtyIFBOTV9NYXJkaWEsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KI212bihjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFbLC1jKDEsMyw0LDksMTQpXSwgbXZuVGVzdD0ibWFyZGlhIikNCg0KDQpgYGANCg0KRXJyb3IgY2FyZGF0YTogZXN0ZSBlcnJvciBzZSBwcmVzZW50YSBhbCBpbnRlbnRhciBidXNjYXIgdW4gYXJjaGl2byBlbiB1bmEgbGlicmVyw61hIGluZXhpc3RlbnRlLCB5YSBxdWUgbm8gZnVlIHBvc2libGUgaW5zdGFsYXJsYSBkZWJpZG8gYSBwcm9ibGVtYXMgdMOpY25pY29zIGludGVybm9zIHkgZGVwZW5kZW5jaWFzIG5vwqBzYXRpc2ZlY2hhcy4NCg0KIyMjIyBQTk0gSGVuemUtWmlya2xlcg0KYGBge3IgUE5NX0hlbnplX1ppcmtsZXIsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KI212bihjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFbLC1jKDEsMyw0LDksMTQpXSwgbXZuVGVzdD0iaHoiKQ0KYGBgDQoNCkVycm9yIGNhcmRhdGE6IGVzdGUgZXJyb3Igc2UgcHJlc2VudGEgYWwgaW50ZW50YXIgYnVzY2FyIHVuIGFyY2hpdm8gZW4gdW5hIGxpYnJlcsOtYSBpbmV4aXN0ZW50ZSwgeWEgcXVlIG5vIGZ1ZSBwb3NpYmxlIGluc3RhbGFybGEgZGViaWRvIGEgcHJvYmxlbWFzIHTDqWNuaWNvcyBpbnRlcm5vcyB5IGRlcGVuZGVuY2lhcyBub8Kgc2F0aXNmZWNoYXMuDQoNCiMjIyMgUE5NIERvb3JuaWstSGFuc2VuDQpgYGB7ciBQTk1fRG9vcm5pa19IYW5zZW4sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KI212bihjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFbLC1jKDEsMyw0LDksMTQpXSwgbXZuVGVzdD0iZGgiKQ0KYGBgDQoNCkVycm9yIGNhcmRhdGE6IGVzdGUgZXJyb3Igc2UgcHJlc2VudGEgYWwgaW50ZW50YXIgYnVzY2FyIHVuIGFyY2hpdm8gZW4gdW5hIGxpYnJlcsOtYSBpbmV4aXN0ZW50ZSwgeWEgcXVlIG5vIGZ1ZSBwb3NpYmxlIGluc3RhbGFybGEgZGViaWRvIGEgcHJvYmxlbWFzIHTDqWNuaWNvcyBpbnRlcm5vcyB5IGRlcGVuZGVuY2lhcyBub8Kgc2F0aXNmZWNoYXMuDQoNCiMjIyMgUE5NIFJveXN0b24NCmBgYHtyIFBOTV9Sb3lzdG9uLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCiNtdm4oY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWywtYygxLDIsNCw5LDE0KV0sIG12blRlc3Q9InJveXN0b24iKQ0KYGBgDQoNCkVycm9yIGNhcmRhdGE6IGVzdGUgZXJyb3Igc2UgcHJlc2VudGEgYWwgaW50ZW50YXIgYnVzY2FyIHVuIGFyY2hpdm8gZW4gdW5hIGxpYnJlcsOtYSBpbmV4aXN0ZW50ZSwgeWEgcXVlIG5vIGZ1ZSBwb3NpYmxlIGluc3RhbGFybGEgZGViaWRvIGEgcHJvYmxlbWFzIHTDqWNuaWNvcyBpbnRlcm5vcyB5IGRlcGVuZGVuY2lhcyBub8Kgc2F0aXNmZWNoYXMuDQoNCg0KIyMgKipGYXNlIDIgW0NvbXBvbmVudGVzIFByaW5jaXBhbGVzXSoqDQoNCkVuIHTDqXJtaW5vcyBnZW5lcmFsZXMsIGVzdGEgc2VndW5kYSBldGFwYSBkZSBlc3R1ZGlvIG1vc3RyYXLDoSBjw6FsY3Vsb3MsIHZpc3VhbGl6YWNpb25lcyBlIGludGVycHJldGFjaW9uZXMgY29uIGJhc2UgZW4gZWwgY29uanVudG8gZGUgZGF0b3MgdHJhdGFkbyBlbiBsYSBmYXNlIFsxXSgjc2VjMSksIHBlcm8gYWhvcmEgZGVzZGUgdW4gZW5mb3F1ZSBkZSBhbsOhbGlzaXMgZGUgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgc29icmUgbGFzIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzLCBxdWUgaW5jbHVpcsOhOiBzZWxlY2Npw7NuLCBjYWxpZGFkIGRlIHJlcHJlc2VudGFjacOzbiwgY29udHJpYnVjaW9uZXMgZSBpbnRlcnByZXRhY2nDs24uDQoNClJlY3XDqXJkZXNlIHF1ZSBlbCBjb25qdW50byBkZSBkYXRvcyBkZSB0cmFiYWpvIGVzIGRlc2NyaXRvIGVuIGxhIFtzZWNjacOzbiAyXSgjc2VjMikgeSBsb3MgcmVmZXJlbnRlcyB0ZcOzcmljb3MgZW4gbGEgW3NlY2Npw7NuIDFdKCNzZWMxKS4NCg0KUG9yIMO6bHRpbW8sIGVzdGUgdHJhYmFqbyBmdWUgcHJvY2VzYWRvIGNvbiByIFIudmVyc2lvbi5zdHJpbmcgbWVkaWFkbyBwb3IgUlN0dWRpbyAyMDIyLjEyLjAgQnVpbGQgMzUzIGVuIHVuYSBwbGF0YWZvcm1hIHg4Nl82NC13NjQtbWluZ3czMi4gQWRlbcOhcywgcG9yIHN1IG5hdHVyYWxlemEgZGUgcHVibGljYWNpw7NuIGVuIGzDrW5lYSB5IHBhcmEgY3VtcGxpciBjb24gZWwgcmVxdWlzaXRvIHRlbXBvcmFsIGRlIGVudHJlZ2EsIHNlcsOhIGFjdHVhbGl6YWRvLCBjb21vIG3DoXhpbW8sIGhhc3RhIGxhcyAxMTo1OSBwLm0uIGRlbCBkb21pbmdvIDI2IGRlIGZlYnJlcm8gZGUgMjAyMy4NCg0KIyMjICoqMi4xLiBPYmpldGl2b3MqKg0KIyMjICoqMi4yLiBTZWxlY2Npw7NuIGRlIENvbXBvbmVudGVzKiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KQ29tbyBlcyBtZW5jaW9uYWRvIGVuIGVsIHRyYWJham8gZGUgW0BBRURNRGlhei1Nb3JhbGVzMWVkXSBlbCBBbsOhbGlzaXMgZGUgQ29tcG9uZW50ZXMgUHJpbmNpcGFsZXMgKGVuIGFkZWxhbnRlIEFDUCkgcmVlc3RydWN0dXJhIHVuIGNvbmp1bnRvIGRlIGRhdG9zIG11bHRpdmFyaWFkbyBhIHRyYXbDqXMgZGUgbGEgcmVkdWNjacOzbiBkZSBsYSBjYW50aWRhZCBkZSBzdXMgdmFyaWFibGVzLCBlbiBjdXlvIHRyYW5zZm9uZG8gZXMgaW5uZWNlc2FyaW8gYXN1bWlyIG5pbmd1bmEgZGlzdHJpYnVjacOzbiBkZSBwcm9iYWJpbGlkYWQgZGUgZWxsYXMuIEVzdGEgcmVkdWNjacOzbiBlcyBsb2dyYWRhIGEgdHJhdsOpcyBkZSBjb21iaW5hY2lvbmVzIGxpbmVhbGVzIGRlIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcywgcXVlIGRlYmVyw6FuIGNvbnRlbmVyIGxhIG1heW9yIHZhcmlhYmlsaWRhZCBwb3NpYmxlIHByZXNlbnRlIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zLiBFbiBlc3RlIHNlbnRpZG8sIGVsIEFDUCBsb2dyYSBjcmVhciBudWV2YXMgdmFyaWFibGVzLCBjb25vY2lkYXMgY29tbyBjb21wb25lbnRlcyBwcmluY2lwYWxlcywgcXVlIHBvc2VlbiBjYXJhY3RlcsOtc3RpY2FzIGVzdGFkw61zdGljYXMgZGUgaW5kZXBlbmRlbmNpYSAoY29uIGJhc2UgZW4gZWwgc3VwdWVzdG8gZGUgbm9ybWFsaWRhZCkgeSBubyBjb3JyZWxhY2nDs24uDQoNCkVsIEFDUCBzZSBsb2dyYSBhIGxvIGxhcmdvIGRlIGxhcyBzaWd1aWVudGVzIGZhc2VzOiBnZW5lcmFjacOzbiBkZSBudWV2YXMgdmFyaWFibGVzLCByZWR1Y2Npw7NuIGRpbWVuc2lvbmFsIGRlbCBlc3BhY2lvIGRlIGxvcyBkYXRvcywgZWxpbWluYWNpw7NuIGRlIHZhcmFpYmxlcyBkZSBwb2NvIGFwb3J0ZSBlIGludGVycHJldGFjacOzbiBkZSBsb3MgY29tcG9uZW50ZXMgcmVzdWx0YW50ZXMgZW4gZWwgY29udGV4dG8gZGVsIHByb2JsZW1hIGRlbCBjdWFsIHNlIG9idHV2aWVyb24gbG9zIGRhdG9zLiBFc3RhcyBmYXNlcyBzZSBkZXNhcnJvbGxhbiBlbnRyZSBsYXMgc2VjY2lvbmVzIFs3XSgjc2VjNyksIFs4XSgjc2VjOCksIFs5XSgjc2VjOSkgeSBbMTBdKCNzZWMxMCkuDQoNCkxhICoqTWF0cml6IEFDUCoqIG11ZXN0cmEgc2VpcyBkaW1lbnNpb25lcyBkb25kZSBzb2xvIGxhIHByaW1lcmEgcmV0aWVuZSBlbCAkNzcuMDUkICRcJSQsIGxhIHNpZ3VpZW50ZSBlbCAkMTAuMzMkICRcJSQgeSBsYXMgZGVtw6FzIHNvbG8gcG9yY2VudGFqZXMgY29uIHBhcnRlIGVudGVyYSBkZSB1bmEgY2lmcmEuIEVuIGVzdGUgc2VudGlkbywgbGEgcmVwcmVzZW50YXRpdmlkYWQgZGUgbGEgY29tYmluYWNpw7NuIGxpbmVhbCBxdWUgZGVmaW5lIGEgbGEgZGltZW5zacOzbiAxIGVzIHNpZ25pZmljYXRpdmFtZW50ZSBhbHRhIGVuIGNvbXBhcmFjacOzbiBjb24gbGFzIGRlbcOhcy4gQ29tbyBlc3RhIG1hdHJpeiBlcyBtdWRhIGVuIHJlbGFjacOzbiBjb24gbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIHNlIHNpZ3VlIGluZGFnYW5kbyBsYSBpZGVudGlmaWNhY2nDs24gZGUgbGFzIHZhcmlhYmxlcyBxdWUgbcOhcyBjb250cmlidXlhbiBhIGxhIGRpbWVuc2nDs24gZGUgdmFsb3IgcHJvcGlvIG3DoXMgYWx0by4NCg0KTGEgKipNYXRyaXogZGUgQ29ycmVsYWNpb25lcyoqIHBlcm1pdGUgY29udGludWFyIGNvbiBsYXMgZGVzY3JpcGNpb25lcyBkZSBsYXMgY29tYmluYWNpb25lcyBsaW5lYWxlcyBxdWUgY29uZm9ybWFuIGEgbGEgZGltZW5zacOzbiBkZSBtYXlvciBpbnRlcsOpczogbGEgZGltZW5zacOzbiAxLiBBc8OtLCBlc3RhIG1hdHJpeiwgY29tbyBzZSBtb3N0csOzIGVuIGxhIFtzZWNjacOzbiAzLjIuXSgjc2VjM18yKSwgIGF5dWRhIGEgdmVyaWZpY2FyIHF1ZSBsYSBpbnRlbnNpZGFkIGRlIGxhcyBjb3JlbGFjaW9uZXMgZXMgbcOhcyBhbHRhIHkgc2llbXByZSBwb3NpdGl2YSBlbnRyZSBsYXMgdmFyaWFibGVzOiBUT0VGTF9TY29yZSwgR1JFX1Njb3JlLCBDR1BBIHkgQ2hhbmNlX29mX0FkbWl0LCBhc3VudG8gZXNwZXJhZG8gZW4gcmVsYWNpw7NuIGNvbiBlbCBmZW7Ds21lbm8gZXN0dWRpYWRvLCBwb3IgbG8gdGFudG8sIHNlIHBvZHLDrWEgZXNwZXJhciBxdWUgZXN0YXMgdmFyaWFibGVzIHBhcnRpY2lwYXJhbiBlbiBsYSBjb21iaW5hY2nDs24gbGluZWFsIHF1ZSBkZWZpbmUgYSBsYSBkaW1lbnNpw7NuIDEuDQoNCkxhIHBlc3Rhw7FhIGRlICoqVmFsb3JlcyB5IFZlY3RvcmVzIFByb3Bpb3MqKiBtdWVzdHJhIGVzdG9zIG9iamV0b3MgY2FsY3VsYWRvcyBhIHBhcnRpciBkZSBsYSBtYXRyaXogZGUgY29ycmVsYWNpb25lcyBkZWwgY29uanVudG8gZGUgZGF0b3MuIEVuIGVzdGUgc2VudGlkbywgc2UgZ2FyYW50aXphIHF1ZSBsYSBzdW1hIGRlIGxvcyB2YWxvcmVzIHByb3Bpb3Mgc2VhIGlndWFsIGEgbGEgZGltZW5zacOzbiBkZSBkaWNoYSBtYXRyaXogeSBhIGxhIHZhcmlhYmlsaWRhZCB0b3RhbCBkZWwgY29uanVudG8sIHBvciBsbyBjdWFsIGxhcyBwcm9wb3JjaW9uZXMgZGUgcmV0ZW5jacOzbiBkZSB2YXJpYWJpbGlkYWQgc29uIGRlIGPDoWxjdWxvIGlubWVkaWF0by4gQWRlbcOhcywgbGEgbWF0cml6IGRlIHZlY3RvcmVzIHByb3Bpb3MgZGVmaW5lIHBhcmEgY2FkYSBjb21wb25lbnRlLCBlbiByZWxhY2nDs24gY29uIGNhZGEgdmFyaWFibGUgZGVsIGNvbmp1bnRvIGRlIGRhdG9zLCBsb3MgY29lZmljaWVudGVzIGRlIGxhIGNvbWJpbmFjacOzbiBsaW5lYWwgcXVlIGxhIGNvbmZvcm1hbiwgcG9yIGVqZW1wbG8sIGNvbiB1biBhanVzdGUgYSBkb3MgY2lmcmFzIGRlY2ltYWxlcywgbGEgY29tcG9uZW50ZSAxIGVzdGFyw61hIHJlcHJlc2VudGFkYSBwb3IgbGEgY29tYmluYWNpw7NuIGxpbmVhbCAoZG9uZGUgJEckIGVzIEdSRV9TY29yZSwgJFQkIGVzIFRPRUZMX1Njb3JlLCAkUyQgZXMgU09QLCAkTCQgZXMgTE9SLCAkQ0ckIGVzIENHUEEgeSAkQ0EkIGVzIENoYW5jZV9vZl9BZG1pdCB5IGFkZW3DoXMsIHNvbiB2YXJpYWJsZXMgZXN0YW5kYXJpemFkYXMpOiQkQ29tcG9uZW50ZV8xID0gMC40MSpHKzAuNDIqVCswLjM5KlMrMC4zNypMKzAuNDQqQ0crMC40MypDQSQkSGFzdGEgZXN0ZSBwdW50bywgc2UgcHVlZGUgb2JzZXJ2YXIgcXVlIHNlIGRpc3BvbmUgZGUgdW4gbsO6bWVybyBkZSBkaW1lbnNpb25lcyBpZ3VhbCBhbCBuw7ptZXJvIGRlIHZhcmlhYmxlcyB0cmF0YWRhcywgY29uIGxhIHNhbHZlZGFkIHF1ZSBsYXMgdmFyaWFibGVzIG51ZXZhcyBzb24gaW5jb3JyZWxhZGFzIGVudHJlIHPDrSwgdmVyIGxhIHBlc3Rhw7FhICoqQ29ycmVsYWNpb25lcyBDb21wYXJhZGFzKiouDQoNClBvciDDumx0aW1vLCBlbCAqKkdyw6FmaWNvIGRlIENhdHRlbGwqKiB5IGVsICoqR3LDoWZpY28gZGUgQ2F0dGVsbC1LYWlzZXIsIGRlIGNvZG8geSBzZWRpbWVudGFjacOzbiwgaW5kdWNlbiBhIGxhIGVsZWNjacOzbiBkZSB1bmEgY29tcG9uZW50ZSBlbiBsYSByZWR1Y2Npw7NuIGRlIGRpbWVuc2nDs24gcXVlIHJldGllbmUgbGEgY2FudGlkYWQgZGUgdmFyaWFiaWxpZGFkIHN1ZmljaWVudGUgcGFyYSB0cmF0YXIgZWwgcHJvYmxlbWEuIFNpbiBlbWJhcmdvLCBkZWJlIHJlc2FsdGFyc2UgcXVlIHNlIHByb3BvbmUgZWxlZ2lyIGNvbiBiYXNlIGVuIGNyaXRlcmlvcyBtw6FzIHVzYWRvcywgYSBjYW1iaW8gZGUgY3JpdGVyaW9zIGRlIGFjZXB0YWNpw7NuIHVuaXZlcnNhbC4gRWwgKipHcsOhZmljbyBkZSBDYXR0ZWxsKiogbXVlc3RyYSBxdWUgbG9zIGNhbWJpb3MgZW4gbGEgcGVuZGllbnRlIGluZGljYW4gcXVlIGxhIGNhcGFjaWRhZCBleHBsaWNhdGl2YSBkZSBsYSBkaW1lbnNpw7NuIDEgZXMgYWx0YSBjb21wYXJhZGEgY29uIGVsIHJlc3RvLiBBc8OtLCBlbCBkZSAqKkNhdHRlbGwtS2Fpc2VyKiogYWwgY29uanVnYXIgZWwgaW5zdHJ1bWVudG8gZ3LDoWZpY28gYW50ZXJpb3IgY29uIGVsIGNyaXRlcmlvIGRlIEthaXNlciBlbiBsYSBtaXNtYSBncsOhZmljYSBhcG95YSBxdWUgbGEgY2FudGlkYWQgZGUgZGltZW5zaW9uZXMgc3VmaWNpZW50ZXMgcG9yIHJldGVuZXIgZXMgdW5hLCBhY2xhcmFuZG8gcXVlIGVzdGEgZWxlY2Npw7NuIHJldGVuZ2EgdW4gcG9yY2VudGFqZSBkZSB2YXJpYWJpbGlkYWQgYWRlY3VhZG8gcGFyYSBlc3R1ZGlhciBlbCBwcm9ibGVtYS4NCg0KIyMjIyBNYXRyaXogQUNQDQpgYGB7ciBNYXRyaXpfQUNQXzEsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZ2V0X2VpZ2VudmFsdWUoUENBKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkb1ssLWMoMSwyLDQsOSwxNCldLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSkNCmBgYA0KDQojIyMjIE1hdHJpeiBkZSBDb3JyZWxhY2lvbmVzDQpgYGB7ciBNYXRyaXpfZGVfQ29ycmVsYWNpb25lc30NCnJvdW5kKGNvcihjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG9bLC1jKDEsMiw0LDksMTQpXSksMykNCmBgYA0KDQojIyMjIFZhbG9yZXMgeSBWZWN0b3JlcyBQcm9waW9zDQpgYGB7ciBWYWxvcmVzX3lfVmVjdG9yZXNfUHJvcGlvcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpwcmluY29tcChjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG9bLC1jKDEsMiw0LDksMTQpXSwgY29yID0gVFJVRSkkc2Rldl4yDQpwcmluY29tcChjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG9bLC1jKDEsMiw0LDksMTQpXSwgY29yID0gVFJVRSkkbG9hZGluZ3NbICwxOjZdDQpgYGANCg0KIyMjIyBDb3JyZWxhY2lvbmVzIENvbXBhcmFkYXMNCmBgYHtyIENvcnJlbGFjaW9uZXNfQ29tcGFyYWRhcywgZmlnLmFsaWduPSdjZW50ZXInfQ0KcGFyKG1mcm93PWMoMSwyKSkNCmNvcnJwbG90Ojpjb3JycGxvdChjb3IoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWywtYygxLDIsNCw5LDE0KV0pLCBtZXRob2QgPSAiY29sb3IiLCB0eXBlID0gInVwcGVyIiwgbnVtYmVyLmNleCA9IDAuNCkNCmNvcnJwbG90Ojpjb3JycGxvdChjb3IocHJpbmNvbXAoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWywtYygxLDIsNCw5LDE0KV0sIGNvciA9IFRSVUUpJHNjb3JlcyksIG1ldGhvZCA9ICJjb2xvciIsIHR5cGUgPSAidXBwZXIiLCBudW1iZXIuY2V4ID0gMC40KQ0KYGBgDQoNCg0KIyMjIyBHcsOhZmljbyBkZSBDYXR0ZWxsDQpgYGB7ciBHcmFmaWNvX2RlX0NhdHRlbGwsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KI2Z2aXpfZWlnKFBDQShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG9bLC1jKDEsMiw0LDksMTQpXSwgc2NhbGUudW5pdCA9IFQsIGdyYXBoID0gRiksIGFkZGxhYmVscyA9IFQsIHlsaW09YygwLDkwKSwgbWFpbiA9ICIiKQ0KYGBgDQoNCkVycm9yIGNhcmRhdGE6IGVzdGUgZXJyb3Igc2UgcHJlc2VudGEgYWwgaW50ZW50YXIgYnVzY2FyIHVuIGFyY2hpdm8gZW4gdW5hIGxpYnJlcsOtYSBpbmV4aXN0ZW50ZSwgeWEgcXVlIG5vIGZ1ZSBwb3NpYmxlIGluc3RhbGFybGEgZGViaWRvIGEgcHJvYmxlbWFzIHTDqWNuaWNvcyBpbnRlcm5vcyB5IGRlcGVuZGVuY2lhcyBub8Kgc2F0aXNmZWNoYXMuDQoNCiMjIyMgR3LDoWZpY28gZGUgQ2F0dGVsbC1LYWlzZXINCmBgYHtyIEdyYWZpY29fZGVfQ2F0dGVsbF9LYWlzZXIsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kc2NyZWUoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWywtYygxLDIsNCw5LDE0KV0sZmFjdG9ycyA9IEZBTFNFLCBwYyA9IFRSVUUsIG1haW4gPSIiKQ0KYGBgDQoNCiMjIyAqKjIuMy4gQ2FsaWRhZCBkZSBSZXByZXNlbnRhY2nDs24qKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQoNCg0KIyMjIyBDw61yY3VsbyBkZSBDb3JyZWxhY2lvbmVzDQpgYGB7ciBDaXJjdWxvX2RlX0NvcnJlbGFjaW9uZXMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KI2Z2aXpfcGNhX3ZhcihQQ0EoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWywtYygxLDIsNCw5LDE0KV0sIHNjYWxlLnVuaXQgPSBULCBncmFwaCA9IEYpLGNvbC52YXI9IiMzQjgzQkQiLCByZXBlbCA9IFQsIGNvbC5jaXJjbGUgPSAiI0NEQ0RDRCIsIGdndGhlbWUgPSB0aGVtZV9idygpKQ0KYGBgDQoNCkVycm9yIGNhcmRhdGE6IGVzdGUgZXJyb3Igc2UgcHJlc2VudGEgYWwgaW50ZW50YXIgYnVzY2FyIHVuIGFyY2hpdm8gZW4gdW5hIGxpYnJlcsOtYSBpbmV4aXN0ZW50ZSwgeWEgcXVlIG5vIGZ1ZSBwb3NpYmxlIGluc3RhbGFybGEgZGViaWRvIGEgcHJvYmxlbWFzIHTDqWNuaWNvcyBpbnRlcm5vcyB5IGRlcGVuZGVuY2lhcyBub8Kgc2F0aXNmZWNoYXMuDQoNCiMjIyMgTWF0cml6IGRlIFJlcHJlc2VudGFjacOzbg0KYGBge3IgTWF0cml6X2RlX1JlcHJlc3NlbnRhY2lvbl9DT1MyLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCihnZXRfcGNhX3ZhcihQQ0EoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWywtYygxLDIsNCw5LDE0KV0sIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYpKSkkY29zMg0KYGBgDQoNCiMjIyMgQ2FsaWRhZCBkZSBSZXByZXNlbnRhY2nDs24NCmBgYHtyIENhbGlkYWRfZGVfbGFfUmVwcmVzZW50YWNpb24sIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KI2Z2aXpfcGNhX3ZhcihQQ0EoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWywtYygxLDIsNCw5LDE0KV0sIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYpLCBjb2wudmFyPSJjb3MyIiwgZ3JhZGllbnQuY29scz1jKCIjMDBBRkJCIiwiI0U3QjgwMCIsIiNGQzRFMDciKSwgcmVwZWwgPSBUUlVFKQ0KYGBgDQoNCkVycm9yIGNhcmRhdGE6IGVzdGUgZXJyb3Igc2UgcHJlc2VudGEgYWwgaW50ZW50YXIgYnVzY2FyIHVuIGFyY2hpdm8gZW4gdW5hIGxpYnJlcsOtYSBpbmV4aXN0ZW50ZSwgeWEgcXVlIG5vIGZ1ZSBwb3NpYmxlIGluc3RhbGFybGEgZGViaWRvIGEgcHJvYmxlbWFzIHTDqWNuaWNvcyBpbnRlcm5vcyB5IGRlcGVuZGVuY2lhcyBub8Kgc2F0aXNmZWNoYXMuDQoNCiMjIyMgQ29vcmRlbmFkYXMgSW5kaXZpZHVhbGVzDQpgYGB7ciBDb29yZGVuYWRhc19SZWdpc3Ryb3MsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KaGVhZCgoUENBKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkb1ssLWMoMSwyLDQsOSwxNCldLCBuY3AgPSA2LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSkkaW5kJGNvb3JkLCBuID0gMjNMKQ0KYGBgDQoNCiMjIyAqKjIuNC4gQ29udHJpYnVjaW9uZXMqKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQojIyMjIE1hdHJpeiBkZSBDb250cmlidWNpb25lcw0KYGBge3IgTWF0cml6X2RlX0NvbnRyaWJ1Y2lvbmVzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCihnZXRfcGNhX3ZhcihQQ0EoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWywtYygxLDIsNCw5LDE0KV0sIG5jcCA9IDUsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYpKSkkY29udHJpYg0KYGBgDQoNCiMjIyMgQmlwbG90IGRlIFZhcmlhYmxlcyB5IFJlZ2lzdHJvcyBbVG90YWwgR10NCmBgYHtyIEJpcGxvdF9kZV9WYXJpYWJsZXNfeV9SZWdpc3Ryb3NfVG90YWxfRywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQojZGF0YV9VUiA8LSBjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG9bLC1jKDEsMiw0LDksMTQpXQ0KI2RhdGFfQWxsIDwtIGNiaW5kKGRhdGFfVVIsIEdlbmVybyA9IGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRHZW5lcm8pDQojZGF0YV9BbGwkR2VuZXJvIDwtIGFzLmZhY3RvcihkYXRhX0FsbCRHZW5lcm8pDQojbGV2ZWxzKGRhdGFfQWxsJEdlbmVybykgPC0gYygiRmVtZW5pbm8iLCAiTWFzY3VsaW5vIikNCiNyZXMucGNhIDwtIFBDQShkYXRhX0FsbCwgbmNwID0gNiwgc2NhbGUudW5pdCA9IEZBTFNFLHF1YWxpLnN1cCA9IG5jb2woZGF0YV9BbGwpKQ0KI2Z2aXpfcGNhX2JpcGxvdChyZXMucGNhLCBheGVzID0gYygxLCAyKSwgcmVwZWwgPSBUUlVFLCBoYWJpbGxhZ2UgPSBuY29sKGRhdGFfQWxsKSkgICAgICAgIA0KYGBgDQoNCkVycm9yIGNhcmRhdGE6IGVzdGUgZXJyb3Igc2UgcHJlc2VudGEgYWwgaW50ZW50YXIgYnVzY2FyIHVuIGFyY2hpdm8gZW4gdW5hIGxpYnJlcsOtYSBpbmV4aXN0ZW50ZSwgeWEgcXVlIG5vIGZ1ZSBwb3NpYmxlIGluc3RhbGFybGEgZGViaWRvIGEgcHJvYmxlbWFzIHTDqWNuaWNvcyBpbnRlcm5vcyB5IGRlcGVuZGVuY2lhcyBub8Kgc2F0aXNmZWNoYXMuDQoNCg0KIyMjIyBCaXBsb3QgZGUgVmFyaWFibGVzIHkgUmVnaXN0cm9zIFtmaWx0cm86R2VuZXJvXQ0KYGBge3IgQmlwbG90X2RlX1ZhcmlhYmxlc195X1JlZ2lzdHJvc19maWx0cm9fR2VuZXJvfQ0KDQojY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvIDwtIHJlYWRfZXhjZWwoIkM6L0dlc3Rpb24gZGUgZGF0b3MgW0c4XS9jZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8ueGxzeCIpDQoNCiNzZXQuc2VlZCgyODg5NjYpDQojY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvW3NhbXBsZSgxOm5yb3coY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvKSwxMDApLC1jKDEsMiw0LDksMTQpXQ0KI2NkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRHZW5lcm8gPC0gZmFjdG9yKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRHZW5lcm8sIGxldmVscyA9IGMoMCwgMSksIGxhYmVscyA9IGMoIkZlbWVuaW5vIiwgIk1hc2N1bGlubyIpKQ0KI2NkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRHZW5lcm8gPC0gYXMuZmFjdG9yKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRHZW5lcm8pDQojZnZpel9wY2FfYmlwbG90KFBDQShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG9bLF0sIG5jcCA9IDUsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYsIHF1YWxpLnN1cCA9ICJHZW5lcm8iKSwgYXhlcyA9IGMoMSwgMiksIHJlcGVsID0gVFJVRSwgaGFiaWxsYWdlID0gIkdlbmVybyIpDQoNCmBgYA0KDQpFcnJvciBjYXJkYXRhOiBlc3RlIGVycm9yIHNlIHByZXNlbnRhIGFsIGludGVudGFyIGJ1c2NhciB1biBhcmNoaXZvIGVuIHVuYSBsaWJyZXLDrWEgaW5leGlzdGVudGUsIHlhIHF1ZSBubyBmdWUgcG9zaWJsZSBpbnN0YWxhcmxhIGRlYmlkbyBhIHByb2JsZW1hcyB0w6ljbmljb3MgaW50ZXJub3MgeSBkZXBlbmRlbmNpYXMgbm/CoHNhdGlzZmVjaGFzLg0KDQoNCiMjIyMgQ29udHJpYnVjaW9uZXMgYSBEMQ0KYGBge3IgQ29udHJpYnVjaW9uZXNfRElNXzEsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KI2Z2aXpfY29udHJpYihQQ0EoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWywtYygxLDIsNCw5LDE0KV0sIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYpLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDEsIHRvcCA9IDEwKQ0KYGBgDQoNCkVycm9yIGNhcmRhdGE6IGVzdGUgZXJyb3Igc2UgcHJlc2VudGEgYWwgaW50ZW50YXIgYnVzY2FyIHVuIGFyY2hpdm8gZW4gdW5hIGxpYnJlcsOtYSBpbmV4aXN0ZW50ZSwgeWEgcXVlIG5vIGZ1ZSBwb3NpYmxlIGluc3RhbGFybGEgZGViaWRvIGEgcHJvYmxlbWFzIHTDqWNuaWNvcyBpbnRlcm5vcyB5IGRlcGVuZGVuY2lhcyBub8Kgc2F0aXNmZWNoYXMuDQoNCiMjIyMgQ29udHJpYnVjaW9uZXMgYSBEMg0KYGBge3IgQ29udHJpYnVjaW9uZXNfRElNXzIsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KI2Z2aXpfY29udHJpYihQQ0EoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWywtYygxLDIsNCw5LDE0KV0sIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYpLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDIsIHRvcCA9IDEwKQ0KYGBgDQoNCkVycm9yIGNhcmRhdGE6IGVzdGUgZXJyb3Igc2UgcHJlc2VudGEgYWwgaW50ZW50YXIgYnVzY2FyIHVuIGFyY2hpdm8gZW4gdW5hIGxpYnJlcsOtYSBpbmV4aXN0ZW50ZSwgeWEgcXVlIG5vIGZ1ZSBwb3NpYmxlIGluc3RhbGFybGEgZGViaWRvIGEgcHJvYmxlbWFzIHTDqWNuaWNvcyBpbnRlcm5vcyB5IGRlcGVuZGVuY2lhcyBub8Kgc2F0aXNmZWNoYXMuDQoNCiMjIyMgQ29udHJpYnVjaW9uZXMgYSBEMw0KYGBge3IgQ29udHJpYnVjaW9uZXNfRElNXzMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KI2Z2aXpfY29udHJpYihQQ0EoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWywtYygxLDIsNCw5LDE0KV0sIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYpLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDMsIHRvcCA9IDEwKQ0KYGBgDQoNCkVycm9yIGNhcmRhdGE6IGVzdGUgZXJyb3Igc2UgcHJlc2VudGEgYWwgaW50ZW50YXIgYnVzY2FyIHVuIGFyY2hpdm8gZW4gdW5hIGxpYnJlcsOtYSBpbmV4aXN0ZW50ZSwgeWEgcXVlIG5vIGZ1ZSBwb3NpYmxlIGluc3RhbGFybGEgZGViaWRvIGEgcHJvYmxlbWFzIHTDqWNuaWNvcyBpbnRlcm5vcyB5IGRlcGVuZGVuY2lhcyBub8Kgc2F0aXNmZWNoYXMuDQoNCiMjIyMgQ29udHJpYnVjaW9uZXMgYSBENA0KYGBge3IgQ29udHJpYnVjaW9uZXNfRElNXzQsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KI2Z2aXpfY29udHJpYihQQ0EoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWywtYygxLDIsNCw5LDE0KV0sIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYpLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDQsIHRvcCA9IDEwKQ0KYGBgDQoNCkVycm9yIGNhcmRhdGE6IGVzdGUgZXJyb3Igc2UgcHJlc2VudGEgYWwgaW50ZW50YXIgYnVzY2FyIHVuIGFyY2hpdm8gZW4gdW5hIGxpYnJlcsOtYSBpbmV4aXN0ZW50ZSwgeWEgcXVlIG5vIGZ1ZSBwb3NpYmxlIGluc3RhbGFybGEgZGViaWRvIGEgcHJvYmxlbWFzIHTDqWNuaWNvcyBpbnRlcm5vcyB5IGRlcGVuZGVuY2lhcyBub8Kgc2F0aXNmZWNoYXMuDQoNCiMjIyMgQ29udHJpYnVjaW9uZXMgYSBENQ0KYGBge3IgQ29udHJpYnVjaW9uZXNfRElNXzUsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KI2Z2aXpfY29udHJpYihQQ0EoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWywtYygxLDIsNCw5LDE0KV0sIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYpLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDUsIHRvcCA9IDEwKQ0KYGBgDQoNCkVycm9yIGNhcmRhdGE6IGVzdGUgZXJyb3Igc2UgcHJlc2VudGEgYWwgaW50ZW50YXIgYnVzY2FyIHVuIGFyY2hpdm8gZW4gdW5hIGxpYnJlcsOtYSBpbmV4aXN0ZW50ZSwgeWEgcXVlIG5vIGZ1ZSBwb3NpYmxlIGluc3RhbGFybGEgZGViaWRvIGEgcHJvYmxlbWFzIHTDqWNuaWNvcyBpbnRlcm5vcyB5IGRlcGVuZGVuY2lhcyBub8Kgc2F0aXNmZWNoYXMuDQoNCiMjICoqRmFzZSAzIFtDb3JyZXNwb25kZW5jaWFzXSoqDQoNCiMjIyAqKjMuMS4gT2JqZXRpdm9zKioNCg0KRXhwbG9yYXIgeSB2aXN1YWxpemFyIGxhcyByZWxhY2lvbmVzIGVudHJlIGNhdGVnb3LDrWFzIGRlIGRvcyB2YXJpYWJsZXMgY3VhbGl0YXRpdmFzIHJlcHJlc2VudGFkYXMgZW4gdW5hIHRhYmxhIGRlIGNvbnRpbmdlbmNpYS4gRXN0ZSBtw6l0b2RvIHBlcm1pdGUgc2ltcGxpZmljYXIgZGF0b3MgY29tcGxlam9zIG1lZGlhbnRlIGxhIHJlZHVjY2nDs24gZGUgZGltZW5zaW9uYWxpZGFkLCBmYWNpbGl0YW5kbyBsYSBpZGVudGlmaWNhY2nDs24gZGUgcGF0cm9uZXMsIGFzb2NpYWNpb25lcyB5IHNpbWlsaXR1ZGVzIGVudHJlIGxhcyBjYXRlZ29yw61hcy4gQWRlbcOhcywgZ2VuZXJhIHJlcHJlc2VudGFjaW9uZXMgZ3LDoWZpY2FzIHF1ZSBtdWVzdHJhbiBsYXMgcmVsYWNpb25lcyBlbiB1biBlc3BhY2lvIGRlIG1lbm9yIGRpbWVuc2nDs24sIHVzdWFsbWVudGUgZW4gZG9zIGVqZXMsIGxvIHF1ZSBheXVkYSBhIGludGVycHJldGFyIGxhcyBjb25leGlvbmVzIHkgcHJveGltaWRhZGVzIGVudHJlIGZpbGFzIHkgY29sdW1uYXMgZGUgbWFuZXJhIGNsYXJhIHkgZGVzY3JpcHRpdmEuIEVzIHVuYSBoZXJyYW1pZW50YSB2YWxpb3NhIHBhcmEgZWwgYW7DoWxpc2lzIGV4cGxvcmF0b3JpbyBkZSBkYXRvcyBjdWFsaXRhdGl2b3MgYW50ZXMgZGUgYXBsaWNhciBtw6l0b2RvcyBtw6FzIGVzcGVjw61maWNvcy4NCg0KIyMjICoqMy4yLiBDb3JyZXNwb25kZW5jaWFzIFNpbXBsZXMqKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpMYXMgY29ycmVzcG9uZGVuY2lhcyBzaW1wbGVzIHNvbiB1bmEgdMOpY25pY2EgZGUgYW7DoWxpc2lzIG11bHRpdmFyaWFkbyBxdWUgcGVybWl0ZSBlc3R1ZGlhciBsYSByZWxhY2nDs24gZW50cmUgZG9zIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgYSB0cmF2w6lzIGRlIHVuYSB0YWJsYSBkZSBjb250aW5nZW5jaWEuIEVzdGUgbcOpdG9kbyBidXNjYSBpZGVudGlmaWNhciBwYXRyb25lcyBkZSBhc29jaWFjacOzbiB5IGxhcyBpbnRlcmFjY2lvbmVzIHN1YnlhY2VudGVzIGVudHJlIGxhcyBjYXRlZ29yw61hcyBkZSBhbWJhcyB2YXJpYWJsZXMsIHRyYW5zZm9ybWFuZG8gbG9zIGRhdG9zIG9yaWdpbmFsZXMgZW4gdW4gZXNwYWNpbyBnZW9tw6l0cmljbyBkb25kZSBsYXMgZmlsYXMgeSBjb2x1bW5hcyBzZSByZXByZXNlbnRhbiBjb21vIHB1bnRvcy4gRXN0byBmYWNpbGl0YSBsYSBpbnRlcnByZXRhY2nDs24gdmlzdWFsIHkgY3VhbnRpdGF0aXZhIGRlIGxhcyByZWxhY2lvbmVzIGVudHJlIGNhdGVnb3LDrWFzLg0KDQpFbiBlc3RlIGFuw6FsaXNpcywgY2FkYSBmaWxhIHkgY2FkYSBjb2x1bW5hIGRlIGxhIHRhYmxhIHNlIHByb3llY3RhbiBlbiB1biBzaXN0ZW1hIGRlIGVqZXMgcHJpbmNpcGFsZXMgcXVlIHJlc3VtZW4gbGEgbWF5b3IgcGFydGUgZGUgbGEgdmFyaWFiaWxpZGFkIGVuIGxvcyBkYXRvcy4gTGFzIGRpc3RhbmNpYXMgZW50cmUgcHVudG9zIGVuIGVzdGUgZXNwYWNpbyByZXByZXNlbnRhbiBzaW1pbGl0dWRlcyBvIGRpZmVyZW5jaWFzIGVuIGxhcyBkaXN0cmlidWNpb25lcyBkZSBsYXMgY2F0ZWdvcsOtYXMuIFBvciBlamVtcGxvLCBmaWxhcyAoY2F0ZWdvcsOtYXMgZGUgbGEgcHJpbWVyYSB2YXJpYWJsZSkgY2VyY2FuYXMgYSBjb2x1bW5hcyAoY2F0ZWdvcsOtYXMgZGUgbGEgc2VndW5kYSB2YXJpYWJsZSkgaW5kaWNhbiB1bmEgYXNvY2lhY2nDs24gZnVlcnRlIGVudHJlIGRpY2hhcyBjYXRlZ29yw61hcy4gRXN0ZSBlbmZvcXVlIGVzIMO6dGlsIHBhcmEgaWRlbnRpZmljYXIgcGF0cm9uZXMgY2xhdmUgcXVlIHB1ZWRlbiBubyBzZXIgZXZpZGVudGVzIGEgc2ltcGxlIHZpc3RhIGVuIGxvcyBkYXRvcyB0YWJ1bGFyZXMuDQoNCkxhcyBjb3JyZXNwb25kZW5jaWFzIHNpbXBsZXMgcGVybWl0ZW4gcmVkdWNpciBsYSBjb21wbGVqaWRhZCBkZSBsb3MgZGF0b3MgY2F0ZWfDs3JpY29zLCBwcm9wb3JjaW9uYW5kbyB1bmEgcmVwcmVzZW50YWNpw7NuIGdyw6FmaWNhIHkgbnVtw6lyaWNhIGRlIGxhcyBhc29jaWFjaW9uZXMuIEVzdG8gZmFjaWxpdGEgbGEgdG9tYSBkZSBkZWNpc2lvbmVzIGluZm9ybWFkYXMgeSBlbCBlbnRlbmRpbWllbnRvIGRlIGxhcyByZWxhY2lvbmVzIGVudHJlIHZhcmlhYmxlcyBlbiBjb250ZXh0b3MgY29tbyBlbmN1ZXN0YXMsIGVzdHVkaW9zIGRlIG1lcmNhZG8gbyBhbsOhbGlzaXMgc29jaWFsZXMsIGRvbmRlIGVzIGVzZW5jaWFsIGNvbXByZW5kZXIgY8OzbW8gc2UgdmluY3VsYW4gbGFzIGRpZmVyZW50ZXMgY2F0ZWdvcsOtYXPCoGRlwqBpbnRlcsOpcy4NCg0KDQojIyMjIGFuYWxpc2lzIGRlIGNvcnJlc3BvbmRlbmNpYXMgey50YWJzZXQgLnRhYnNldC1waWxsc30NCkVsIGFuw6FsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWEgZGUgdW4gY29uanVudG8gZGUgZGF0b3MgcmV2ZWxhIGxhcyByZWxhY2lvbmVzIHkgYXNvY2lhY2lvbmVzIGVudHJlIGNhdGVnb3LDrWFzIGRlIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMsIHJlcHJlc2VudGFkYXMgZW4gdW5hIHRhYmxhIGRlIGNvbnRpbmdlbmNpYS4gUHJveWVjdGEgZXN0YXMgcmVsYWNpb25lcyBlbiB1biBlc3BhY2lvIGRlIGJhamEgZGltZW5zacOzbiwgZG9uZGUgZmlsYXMgeSBjb2x1bW5hcyBzZSBtdWVzdHJhbiBjb21vIHB1bnRvcywgeSBzdXMgcG9zaWNpb25lcyByZWZsZWphbiBzaW1pbGl0dWRlcyBvIGFzb2NpYWNpb25lcy4NCg0KDQojIyMjIyBDb250aW5nZW5jaWFzDQpgYGB7ciBUYWJsYXNfZGVfQ29udGluZ2VuY2lhLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmFkZG1hcmdpbnModGFibGUoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJE5pdmVsX2RlX2VzdHLDqXMsIGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRDYWxpZGFkX2RlX3N1ZW5vKSkNCmFkZG1hcmdpbnModGFibGUoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJE5pdmVsX2RlX2FjdGl2aWRhZF9maXNpY2EsIGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRQYXNvc19kaWFyaW9zKSkNCmFkZG1hcmdpbnModGFibGUoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJFByZXNpb25fc2lzdG9sYSwgY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJFByZXNpb25fZGlhc3RvbGEpKQ0KYGBgDQoNCiMjIyMjIFByb2JhYmlsaWRhZGVzDQpgYGB7ciBUYWJsYXNfZGVfUHJvYmFiaWxpZGFkZXMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyROaXZlbF9kZV9lc3Ryw6lzLCBjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kQ2FsaWRhZF9kZV9zdWVubykpKjEwMCkNCmFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kT2N1cGFjaW9uLCBjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kVHJhc3Rvcm5vX2RlbF9zdWVubykpKjEwMCkNCmFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kRHVyYWNpb25fZGVfc3Vlbm8sIGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRDYWxpZGFkX2RlX3N1ZW5vKSkqMTAwKQ0KYGBgDQoNCiMjIyMjIEZyZWN1ZW5jaWFzIFtDUEYgeSBDUENdDQpgYGB7ciBUYWJsYXNfZGVfRnJlY3VlbmNpYXNfQ29uZGljaW9uYWRhcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpyb3VuZChhZGRtYXJnaW5zKHByb3AudGFibGUodGFibGUoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJE5pdmVsX2RlX2VzdHLDqXMsIGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRDYWxpZGFkX2RlX3N1ZW5vKSwgMSkqMTAwLCAyKSwgMikNCnJvdW5kKGFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kTml2ZWxfZGVfZXN0csOpcywgY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJENhbGlkYWRfZGVfc3Vlbm8pLCAyKSoxMDAsIDEpLCAyKQ0KDQpyb3VuZChhZGRtYXJnaW5zKHByb3AudGFibGUodGFibGUoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJE5pdmVsX2RlX2FjdGl2aWRhZF9maXNpY2EsIGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRQYXNvc19kaWFyaW9zKSwgMSkqMTAwLCAyKSwgMikNCnJvdW5kKGFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kTml2ZWxfZGVfYWN0aXZpZGFkX2Zpc2ljYSwgY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJFBhc29zX2RpYXJpb3MpLCAyKSoxMDAsIDEpLCAyKQ0KDQpyb3VuZChhZGRtYXJnaW5zKHByb3AudGFibGUodGFibGUoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJER1cmFjaW9uX2RlX3N1ZW5vLCBjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kQ2FsaWRhZF9kZV9zdWVubyksIDEpKjEwMCwgMiksIDIpDQpyb3VuZChhZGRtYXJnaW5zKHByb3AudGFibGUodGFibGUoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJER1cmFjaW9uX2RlX3N1ZW5vLCBjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kQ2FsaWRhZF9kZV9zdWVubyksIDIpKjEwMCwgMSksIDIpDQpgYGANCg0KIyMjIyMgUGVyZmlsZXMgW0NQRiB5IENQQ10NCmBgYHtyIEdyYWZpY29zX2RlX1BlcmZpbGVzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnBsb3RjdCh0YWJsZShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kTml2ZWxfZGVfZXN0csOpcywgY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJENhbGlkYWRfZGVfc3Vlbm8pLCJyb3ciKQ0KcGxvdGN0KHRhYmxlKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyROaXZlbF9kZV9lc3Ryw6lzLCBjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kQ2FsaWRhZF9kZV9zdWVubyksImNvbCIpDQoNCmBgYA0KDQojIyMjIyBQcnVlYmFzIGRlIEhpcMOzdGVzaXMNCmBgYHtyIFBydWViYXNfZGVfQ29ycmVzcG9uZGVuY2lhLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmNoaXNxLnRlc3QodGFibGUoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJE5pdmVsX2RlX2VzdHLDqXMsIGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRDYWxpZGFkX2RlX3N1ZW5vKSkNCmNoaXNxLnRlc3QodGFibGUoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJE5pdmVsX2RlX2FjdGl2aWRhZF9maXNpY2EsIGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRQYXNvc19kaWFyaW9zKSkNCmNoaXNxLnRlc3QodGFibGUoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJER1cmFjaW9uX2RlX3N1ZW5vLCBjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kQ2FsaWRhZF9kZV9zdWVubykpDQpgYGANCg0KIyMjIyBBQyBQYXJlamEgw5puaWNhIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkxhIEFDIChBbsOhbGlzaXMgZGUgQ29ycmVzcG9uZGVuY2lhKSBkZSBwYXJlamEgw7puaWNhIGV4YW1pbmEgbGEgcmVsYWNpw7NuIGVzcGVjw61maWNhIGVudHJlIGRvcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zLCBheXVkYW5kbyBhIGlkZW50aWZpY2FyIHBhdHJvbmVzIGRlIGFzb2NpYWNpw7NuIHF1ZSBmYWNpbGl0YW4gbGEgaW50ZXJwcmV0YWNpw7NuwqBkZcKgbG9zwqBkYXRvcy4NCg0KKipDb250aW5nZW5jaWFzIHkgUmVzaWR1YWxlcyoqOiBMYSB0YWJsYSBtdWVzdHJhIGPDs21vIGxhcyBmcmVjdWVuY2lhcyBvYnNlcnZhZGFzIHNlIGNvbXBhcmFuIGNvbiBsYXMgZXNwZXJhZGFzLCBsYXMgZGlmZXJlbmNpYXMgKHJlc2lkdWFsZXMpIGVudHJlIGVzdGFzIGZyZWN1ZW5jaWFzIHkgbGEgbWFnbml0dWQgZGUgZXNhcyBkaWZlcmVuY2lhcyBlbiB0w6lybWlub3MgZGUgZGVzdmlhY2nDs24gZXN0w6FuZGFyLiBFc3RvIGF5dWRhIGEgZGV0ZXJtaW5hciBzaSBleGlzdGUgdW5hIGFzb2NpYWNpw7NuIHNpZ25pZmljYXRpdmEgZW50cmUgbGFzIGRvcyB2YXJpYWJsZXMgLg0KDQoqKkNvbnRyaWJ1Y2lvbmVzKio6RXN0YSB0YWJsYSBtdWVzdHJhIGxhcyBjb250cmlidWNpb25lcyBpbmRpdmlkdWFsZXMgZGUgY2FkYSBjZWxkYSBkZSBsYSB0YWJsYSBkZSBjb250aW5nZW5jaWEgYWwgdmFsb3IgdG90YWwgZGVsIGVzdGFkw61zdGljbyBkZSBjaGktY3VhZHJhZG8sIGxvIHF1ZSBheXVkYSBhIGlkZW50aWZpY2FyIHF1w6kgY29tYmluYWNpb25lcyBkZSBjYXRlZ29yw61hcyB0aWVuZW4gbWF5b3IgaW1wYWN0byBlbiBsYSBwcnVlYmEgZGUgaW5kZXBlbmRlbmNpYSBlbnRyZSBsYXMgdmFyaWFibGVzIC4NCg0KKipDb3JyZXNwb25kZW5jaWEgU2ltcGxlIFVuaWRpbWVuc2lvbmFsKio6IExhIGNvcnJlc3BvbmRlbmNpYSBzaW1wbGUgdW5pZGltZW5zaW9uYWwgYXl1ZGEgYSBpZGVudGlmaWNhciBxdcOpIGNhdGVnb3LDrWFzIHNvbiBtw6FzIHNpZ25pZmljYXRpdmFzIGVuIHJlbGFjacOzbiBjb24gbG9zIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIHkgY8OzbW8gc2UgYWdydXBhbiBlbiBmdW5jacOzbiBkZSBsYSB2YXJpYWJpbGlkYWQgZXhwbGljYWRhLiBFc3RvcyByZXN1bHRhZG9zIHByb3BvcmNpb25hbiBpbmZvcm1hY2nDs24gY2xhdmUgc29icmUgY8OzbW8gc2UgZGlzdHJpYnV5ZW4gbGFzIGNhdGVnb3LDrWFzIGRlIGxhIHZhcmlhYmxlIGVuIGVsIGVzcGFjaW8gcmVkdWNpZG8geSBjw7NtbyBpbmZsdXllbiBlbiBsYSBlc3RydWN0dXJhIGdsb2JhbMKgZGVswqBhbsOhbGlzaXMuDQoNCiMjIyMjIENvbnRpbmdlbmNpYXMgeSBSZXNpZHVhbGVzIFtSLVVSXQ0KYGBge3IgQ29udGluZ2VuY2lhc195X1Jlc2lkdWFsZXMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KY2hpc3EudGVzdCh0YWJsZShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kTml2ZWxfZGVfZXN0csOpcywgY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJENhbGlkYWRfZGVfc3Vlbm8pKSRvYnNlcnZlZA0KY2hpc3EudGVzdCh0YWJsZShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kTml2ZWxfZGVfYWN0aXZpZGFkX2Zpc2ljYSwgY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJFBhc29zX2RpYXJpb3MpKSRleHBlY3RlZCANCmNoaXNxLnRlc3QodGFibGUoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJER1cmFjaW9uX2RlX3N1ZW5vLCBjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kQ2FsaWRhZF9kZV9zdWVubykpJHJlc2lkdWFscw0KY2hpc3EudGVzdCh0YWJsZShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kUHJlc2lvbl9zaXN0b2xhLCBjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kUHJlc2lvbl9kaWFzdG9sYSkpJHN0ZHJlcw0KYGBgDQoNCiMjIyMjIENvbnRyaWJ1Y2lvbmVzIFtSLVVSXQ0KYGBge3IgQ29udHJpYnVjaW9uZXNfUi1VUiwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQojY2hpc3EudGVzdCh0YWJsZShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kUmVzZWFyY2gsIGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRVbml2ZXJzaXR5X1JhdGluZykpJHJlc2lkdWFsc14yL2NoaXNxLnRlc3QodGFibGUoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJFJlc2VhcmNoLCBjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kVW5pdmVyc2l0eV9SYXRpbmcpKSRzdGF0aXN0aWMqMTAwDQpgYGANCg0KIyMjIyMgQ29ycmVzcG9uZGVuY2lhIFNpbXBsZSBVbmlkaW1lbnNpb25hbCBbUi1VUl0NCmBgYHtyIEJpcGxvdF9Db3JyZXNwb25kZW5jaWFfU2ltcGxlX1ItVVIsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KI0NBKHRhYmxlKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRSZXNlYXJjaCwgY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJFVuaXZlcnNpdHlfUmF0aW5nKSwgZ3JhcGggPSBGQUxTRSkkZWlnDQojQ0EodGFibGUoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJFJlc2VhcmNoLCBjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kVW5pdmVyc2l0eV9SYXRpbmcpLCBncmFwaCA9IEZBTFNFKSRjb2wNCiNDQSh0YWJsZShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kUmVzZWFyY2gsIGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRVbml2ZXJzaXR5X1JhdGluZyksIGdyYXBoID0gRkFMU0UpJHJvdw0KYGBgDQoNCiMjIyAqKjMuMy4gQ29ycmVzcG9uZGVuY2lhcyBNw7psdGlwbGVzKiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KRWwgYW7DoWxpc2lzIGRlIGNvcnJlc3BvbmRlbmNpYXMgbcO6bHRpcGxlcyAoQUNNKSBlcyB1bmEgdMOpY25pY2EgZXN0YWTDrXN0aWNhIHV0aWxpemFkYSBwYXJhIGFuYWxpemFyIGRhdG9zIGNhdGVnw7NyaWNvcyBub21pbmFsZXMuIFN1IG9iamV0aXZvIHByaW5jaXBhbCBlcyBkZXRlY3RhciB5IHJlcHJlc2VudGFyIGVzdHJ1Y3R1cmFzIHN1YnlhY2VudGVzIGVuIHVuIGNvbmp1bnRvIGRlIGRhdG9zLCBwZXJtaXRpZW5kbyB2aXN1YWxpemFyIGxhcyByZWxhY2lvbmVzIGVudHJlIGRpZmVyZW50ZXMgY2F0ZWdvcsOtYXMuIEVzdG8gc2UgbG9ncmEgcmVwcmVzZW50YW5kbyBsb3MgZGF0b3MgY29tbyBwdW50b3MgZW4gdW4gZXNwYWNpbyBldWNsaWRpYW5vIGRlIGJhamEgZGltZW5zacOzbjEuDQoNCioqQUNNKio6IExhIHRhYmxhIGF5dWRhIGEgZW50ZW5kZXIgcXXDqSBjYW50aWRhZCBkZSBpbmZvcm1hY2nDs24gKHZhcmlhbnphKSBzZSByZXRpZW5lIGFsIHJlZHVjaXIgbGEgZGltZW5zaW9uYWxpZGFkIGRlIGxvcyBkYXRvcyB1c2FuZG8gQUNQLiAgU2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGxhIG1heW9yIHBhcnRlIGRlIGxhIHZhcmlhbnphIHNlIGNvbmNlbnRyYSBlbiBsb3MgcHJpbWVyb3MgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgKGRpbSAxLCBwcmluY2lwYWxtZW50ZSkuICBMb3Mgw7psdGltb3MgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgY29udHJpYnV5ZW4gbXV5IHBvY28gYSBsYSB2YXJpYW56YSB0b3RhbC4gIEVzdG8gc3VnaWVyZSBxdWUgbGEgcmVkdWNjacOzbiBkZSBsYSBkaW1lbnNpb25hbGlkYWQgYSB1biBuw7ptZXJvIG1lbm9yIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzLCBtYW50ZW5pZW5kbyB1bmEgYWx0YSBwcm9wb3JjacOzbiBkZSBsYSB2YXJpYW56YSwgcG9kcsOtYSBzZXIgcG9zaWJsZSBzaW4gdW5hIHDDqXJkaWRhIHNpZ25pZmljYXRpdmHCoGRlwqBpbmZvcm1hY2nDs24NCg0KKipCaXBsb3QgQUNNKio6IExhIGdyw6FmaWNhIGRlIEFDTSBwcm9wb3JjaW9uYSB1bmEgdmlzacOzbiBjbGFyYSBkZSBsYXMgcmVsYWNpb25lcyBlbnRyZSBsYXMgZGlmZXJlbnRlcyBvYnNlcnZhY2lvbmVzIChtb2RlbG9zIGRlIGNvY2hlcywgZW4gZXN0ZSBjYXNvKSB5IGxhcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIGFuYWxpemFkYXMuIEFsIG9ic2VydmFyIGxhIGRpc3Bvc2ljacOzbiBkZSBsb3MgcHVudG9zIHkgbG9zIHZlY3RvcmVzLCBzZSBwdWVkZSBjb25jbHVpciBxdWUgaGF5IHBhdHJvbmVzIHNpZ25pZmljYXRpdm9zIGVuIGxvcyBkYXRvcy4gTG9zIHB1bnRvcyBxdWUgZXN0w6FuIGFncnVwYWRvcyBpbmRpY2FuIHF1ZSBlc29zIG1vZGVsb3MgZGUgY29jaGVzIGNvbXBhcnRlbiBjYXJhY3RlcsOtc3RpY2FzIHNpbWlsYXJlcywgbWllbnRyYXMgcXVlIGxhIGRpcmVjY2nDs24geSBsb25naXR1ZCBkZSBsb3MgdmVjdG9yZXMgc3VnaWVyZW4gcXXDqSB2YXJpYWJsZXMgc29uIG3DoXMgaW5mbHV5ZW50ZXMgZW4gbGEgZGlmZXJlbmNpYWNpw7NuIGVudHJlIGVzdG9zIG1vZGVsb3MuIFBvciBlamVtcGxvLCBzaSB1biB2ZWN0b3IgZXMgbGFyZ28geSBhcHVudGEgaGFjaWEgdW4gZ3J1cG8gZXNwZWPDrWZpY28gZGUgcHVudG9zLCBlc28gaW5kaWNhIHF1ZSBlc2EgdmFyaWFibGUgdGllbmUgdW4gcGFwZWwgaW1wb3J0YW50ZSBlbiBkZWZpbmlyIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlwqBlc29zwqBtb2RlbG9zLiANCg0KKipDb250cmlidWNpb25lcyBBQ00qKjogZXN0YSBncsOhZmljYSBwZXJtaXRlIGlkZW50aWZpY2FyIGNsYXJhbWVudGUgY3XDoWxlcyB2YXJpYWJsZXMgc29uIGNsYXZlIHBhcmEgbGEgcHJpbWVyYSBkaW1lbnNpw7NuIGRlbCBhbsOhbGlzaXMsIGxvIHF1ZSBwdWVkZSBndWlhciBmdXR1cmFzIGludmVzdGlnYWNpb25lcyBvIGRlY2lzaW9uZXMgZXN0cmF0w6lnaWNhcyBiYXNhZGFzIGVuIGVzdGFzwqByZWxhY2lvbmVzLg0KDQoqKkJpcGxvdCBjb24gQ29udHJpYnVjaW9uZXMqKjogTGEgZ3LDoWZpY2EgZGUgYmlwbG90IHByb3BvcmNpb25hIHVuYSByZXByZXNlbnRhY2nDs24gdmlzdWFsIGNsYXJhIGRlIGxhcyByZWxhY2lvbmVzIGVudHJlIGRpZmVyZW50ZXMgdmFyaWFibGVzIGNhdGVnw7NyaWNhcywgbW9zdHJhbmRvIGPDs21vIHNlIGFncnVwYW4geSBzZSByZWxhY2lvbmFuIGVudHJlIHPDrSBlbiBsYXMgZG9zIGRpbWVuc2lvbmVzIHByaW5jaXBhbGVzLiBBdW5xdWUgbGFzIGRpbWVuc2lvbmVzIERpbTEgeSBEaW0yIGV4cGxpY2FuIHNvbG8gdW4gNSUgZGUgbGEgdmFyaWFiaWxpZGFkIHRvdGFsLCBwZXJtaXRlbiBpZGVudGlmaWNhciBwYXRyb25lcyBzaWduaWZpY2F0aXZvcyBlbiBsb3MgZGF0b3MuDQoNCkxhcyB2YXJpYWJsZXMgY29sb3IuTkEsIGNvbmRpdGlvbi5OQSB5IG1vZGVsLk5BIGRlc3RhY2FuIHBvciBzdSBhbHRhIGNvbnRyaWJ1Y2nDs24sIGxvIHF1ZSBzdWdpZXJlIHF1ZSBsYSBmYWx0YSBkZSBpbmZvcm1hY2nDs24gc29icmUgZXN0YXMgY2FyYWN0ZXLDrXN0aWNhcyB0aWVuZSB1biBpbXBhY3RvIGNvbnNpZGVyYWJsZSBlbiBlbCBhbsOhbGlzaXMuIEVzdG8gcHVlZGUgaW5kaWNhciBxdWUgZXMgY3J1Y2lhbCBjb25zaWRlcmFyIGVzdG9zIGFzcGVjdG9zIHBhcmEgb2J0ZW5lciB1bmEgY29tcHJlbnNpw7NuIG3DoXMgY29tcGxldGEgZGUgbG9zIGRhdG9zLg0KDQpMYSBwcm94aW1pZGFkIGRlIGxvcyBtb2RlbG9zIGRlIGNvY2hlcyBlbiBlbCBncsOhZmljbyBpbmRpY2Egc2ltaWxpdHVkZXMgZW4gc3VzIGNhcmFjdGVyw61zdGljYXMsIGxvIHF1ZSBwb2Ryw61hIHNlciDDunRpbCBwYXJhIHNlZ21lbnRhciBvIGNsYXNpZmljYXIgbG9zIHZlaMOtY3Vsb3Mgc2Vnw7puIHN1cyBhdHJpYnV0b3MuIEVuIGdlbmVyYWwsIGVsIGJpcGxvdCBlcyB1bmEgaGVycmFtaWVudGEgdmFsaW9zYSBwYXJhIGV4cGxvcmFyIGxhIGVzdHJ1Y3R1cmEgc3VieWFjZW50ZSBkZSBsb3MgZGF0b3MgeSBndWlhciBkZWNpc2lvbmVzIGluZm9ybWFkYXMgYmFzYWRhcyBlbiBsYXMgcmVsYWNpb25lc8Kgb2JzZXJ2YWRhcy4NCg0KIyMjIyBBQ00NCmBgYHtyIEFDTSwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpyb3VuZChNQ0EoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWzE6NDAwLCAtYygxLDIsNCw5LDE0KV0sIGdyYXBoID0gRkFMU0UpJGVpZywyKQ0KYGBgDQoNCiMjIyMgQmlwbG90IEFDTQ0KYGBge3IgQmlwbG90X0FDTSwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQojZnZpel9tY2FfYmlwbG90KE1DQShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG9bMTo0MDAsIC1jKDEsMiw0LDksMTQpXSwgZ3JhcGggPSBGQUxTRSksIHJlcGVsID0gVFJVRSkNCmBgYA0KDQpFcnJvciBjYXJkYXRhOiBlc3RlIGVycm9yIHNlIHByZXNlbnRhIGFsIGludGVudGFyIGJ1c2NhciB1biBhcmNoaXZvIGVuIHVuYSBsaWJyZXLDrWEgaW5leGlzdGVudGUsIHlhIHF1ZSBubyBmdWUgcG9zaWJsZSBpbnN0YWxhcmxhIGRlYmlkbyBhIHByb2JsZW1hcyB0w6ljbmljb3MgaW50ZXJub3MgeSBkZXBlbmRlbmNpYXMgbm/CoHNhdGlzZmVjaGFzLg0KDQojIyMjIENhbGlkYWQgZGUgUmVwcmVzZW50YWNpw7NuDQpgYGB7ciBDYWxpZGFkX2RlX1JlcHJlc2VudGFjaW9uX0FDTSwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQojZnZpel9tY2FfdmFyKE1DQShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG9bMTo0MDAsIC1jKDEsMiw0LDksMTQpXSwgZ3JhcGggPSBGQUxTRSksIGNvbC52YXIgPSJjb3MyIiwgZ3JhZGllbnQuY29scyA9IGMoIiMwMEFGQkIiLCAiI0U3QjgwMCIsICIjRkM0RTA3IiksIHJlcGVsID0gVFJVRSkNCiNNQ0EoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWzE6NDAwLCAtYygxLDIsNCw5LDE0KV0sIGdyYXBoID0gRkFMU0UpJHZhciRjb3MyDQpgYGANCg0KRXJyb3IgY2FyZGF0YTogZXN0ZSBlcnJvciBzZSBwcmVzZW50YSBhbCBpbnRlbnRhciBidXNjYXIgdW4gYXJjaGl2byBlbiB1bmEgbGlicmVyw61hIGluZXhpc3RlbnRlLCB5YSBxdWUgbm8gZnVlIHBvc2libGUgaW5zdGFsYXJsYSBkZWJpZG8gYSBwcm9ibGVtYXMgdMOpY25pY29zIGludGVybm9zIHkgZGVwZW5kZW5jaWFzIG5vwqBzYXRpc2ZlY2hhcy4NCg0KIyMjIyBDb250cmlidWNpb25lcw0KYGBge3IgQ29udHJpYnVjaW9uZXNfQUNNLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCiNmdml6X2NvbnRyaWIoTUNBKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkb1sxOjMwMCwgLWMoMSwyLDQsOSwxNCldLCBncmFwaCA9IEZBTFNFKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAxLCB0b3AgPSAxNSkNCiNmdml6X2NvbnRyaWIoTUNBKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkb1sxOjMwMCwgLWMoMSwyLDQsOSwxNCldLCBncmFwaCA9IEZBTFNFKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAyLCB0b3AgPSAxNSkNCiNmdml6X2NvbnRyaWIoTUNBKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkb1sxOjMwMCwgLWMoMSwyLDQsOSwxNCldLCBncmFwaCA9IEZBTFNFKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAzLCB0b3AgPSAxNSkNCiNmdml6X2NvbnRyaWIoTUNBKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkb1sxOjMwMCwgLWMoMSwyLDQsOSwxNCldLCBncmFwaCA9IEZBTFNFKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSA0LCB0b3AgPSAxNSkNCiNmdml6X2NvbnRyaWIoTUNBKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkb1sxOjMwMCwgLWMoMSwyLDQsOSwxNCldLCBncmFwaCA9IEZBTFNFKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSA1LCB0b3AgPSAxNSkNCmBgYA0KDQpFcnJvciBjYXJkYXRhOiBlc3RlIGVycm9yIHNlIHByZXNlbnRhIGFsIGludGVudGFyIGJ1c2NhciB1biBhcmNoaXZvIGVuIHVuYSBsaWJyZXLDrWEgaW5leGlzdGVudGUsIHlhIHF1ZSBubyBmdWUgcG9zaWJsZSBpbnN0YWxhcmxhIGRlYmlkbyBhIHByb2JsZW1hcyB0w6ljbmljb3MgaW50ZXJub3MgeSBkZXBlbmRlbmNpYXMgbm/CoHNhdGlzZmVjaGFzLg0KDQojIyMjIEJpcGxvdCBjb24gQ29udHJpYnVjaW9uZXMNCmBgYHtyIEJpcGxvdF9jb25fQ29udHJpYnVjaW9uZXNfQUNNLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCg0KI2R1cGxpY2Fkb3MgPC0gZHVwbGljYXRlZChjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8pDQoNCiNjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8gPC0gY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWyFkdXBsaWNhZG9zLCBdDQoNCiNyb3duYW1lcyhjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8pIDwtIHNlcV9sZW4obnJvdyhjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8pKQ0KDQojYW55RHVwbGljYXRlZChjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8pICANCg0KI3N0cihjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG9bMToxMCwgXSkgIA0KDQojc3VtbWFyeShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8pICANCg0KI2Z2aXpfbWNhX3ZhcihNQ0EoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvWzE6NDAwLCAtYygxLCAyLCA0LCA5LCAxNCldLCBncmFwaCA9IEZBTFNFKSwgDQogICAgICAgICAgICAgI2NvbC52YXIgPSAiY29udHJpYiIsIA0KICAgICAgICAgICAgICNncmFkaWVudC5jb2xzID0gYygiIzAwQUZCQiIsICIjRTdCODAwIiwgIiNGQzRFMDciKSwgDQogICAgICAgICAgICAgI3JlcGVsID0gVFJVRSkNCmBgYA0KDQpFcnJvciBjYXJkYXRhOiBlc3RlIGVycm9yIHNlIHByZXNlbnRhIGFsIGludGVudGFyIGJ1c2NhciB1biBhcmNoaXZvIGVuIHVuYSBsaWJyZXLDrWEgaW5leGlzdGVudGUsIHlhIHF1ZSBubyBmdWUgcG9zaWJsZSBpbnN0YWxhcmxhIGRlYmlkbyBhIHByb2JsZW1hcyB0w6ljbmljb3MgaW50ZXJub3MgeSBkZXBlbmRlbmNpYXMgbm/CoHNhdGlzZmVjaGFzLg0KDQojIyAqKkZhc2UgNCBbQ29uZ2xvbWVyYWRvc10qKg0KDQojIyMgKio0LjEuIE9iamV0aXZvcyoqDQpMYSBhZ3J1cGFjacOzbiBqZXLDoXJxdWljYSBvcmdhbml6YSBsb3MgZWxlbWVudG9zIGVuIHVuIMOhcmJvbCBkZSBncnVwb3MgYW5pZGFkb3MsIGNvbm9jaWRvIGNvbW8gZGVuZHJvZ3JhbWEsIHkgcHVlZGUgc2VyIGFnbG9tZXJhdGl2YSAoZGUgYWJham8gaGFjaWEgYXJyaWJhKSBvIGRpdmlzaXZhIChkZSBhcnJpYmEgaGFjaWEgYWJham8pLCBpZGVudGlmaWNhbmRvIHJlbGFjaW9uZXMgamVyw6FycXVpY2FzIGVudHJlIGxvcyBkYXRvcy4gRW4gY29udHJhc3RlLCBsYSBhZ3J1cGFjacOzbiBubyBqZXLDoXJxdWljYSwgY29tbyBlbCBtw6l0b2RvIGstbWVhbnMsIGFncnVwYSBsb3MgZGF0b3MgZW4gdW4gbsO6bWVybyBmaWpvIGRlIGNsw7pzdGVyZXMgcGFyYSBtYXhpbWl6YXIgbyBtaW5pbWl6YXIgY2llcnRvcyBjcml0ZXJpb3PCoGRlwqBldmFsdWFjacOzbg0KDQojIyMgKio0LjIuIEFncnVwYWNpw7NuIEplcsOhcnF1aWNhKiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCkxhIGFncnVwYWNpw7NuIGplcsOhcnF1aWNhIGVzIHVuIG3DqXRvZG8gZGUgYW7DoWxpc2lzIGRlIGRhdG9zIHF1ZSBvcmdhbml6YSBlbGVtZW50b3MgZW4gdW4gw6FyYm9sIGRlIGdydXBvcyBhbmlkYWRvcywgY29ub2NpZG8gY29tbyBkZW5kcm9ncmFtYS4gRXN0ZSBtw6l0b2RvIHB1ZWRlIHNlciBhZ2xvbWVyYXRpdm8gKGRlIGFiYWpvIGhhY2lhIGFycmliYSkgbyBkaXZpc2l2byAoZGUgYXJyaWJhIGhhY2lhIGFiYWpvKS4gRW4gZWwgZW5mb3F1ZSBhZ2xvbWVyYXRpdm8sIGNhZGEgZWxlbWVudG8gY29taWVuemEgZW4gc3UgcHJvcGlvIGdydXBvIHkgc2UgZnVzaW9uYSBjb24gb3Ryb3MgZ3J1cG9zIGJhc8OhbmRvc2UgZW4gbGEgc2ltaWxpdHVkLCBoYXN0YSBxdWUgdG9kb3MgbG9zIGVsZW1lbnRvcyBlc3TDoW4gZW4gdW4gc29sbyBncnVwby4gRW4gZWwgZW5mb3F1ZSBkaXZpc2l2bywgdG9kb3MgbG9zIGVsZW1lbnRvcyBjb21pZW56YW4gZW4gdW4gc29sbyBncnVwbyB5IHNlIGRpdmlkZW4gc3VjZXNpdmFtZW50ZSBlbiBncnVwb3MgbcOhcyBwZXF1ZcOxb3MuDQoNCkVsIGRlbmRyb2dyYW1hIHJlc3VsdGFudGUgZGUgbGEgYWdydXBhY2nDs24gamVyw6FycXVpY2EgcHJvcG9yY2lvbmEgdW5hIHJlcHJlc2VudGFjacOzbiB2aXN1YWwgZGUgbGFzIHJlbGFjaW9uZXMgamVyw6FycXVpY2FzIGVudHJlIGxvcyBkYXRvcy4gQ2FkYSBub2RvIGRlbCDDoXJib2wgcmVwcmVzZW50YSB1biBncnVwbyBkZSBkYXRvcyBzaW1pbGFyZXMsIHkgbG9zIG5vZG9zIHNlIGFncnVwYW4gZW4gbml2ZWxlcyBzdWNlc2l2b3Mgc2Vnw7puIHN1IHNpbWlsaXR1ZC4gRXN0byBwZXJtaXRlIGlkZW50aWZpY2FyIHBhdHJvbmVzIHkgZXN0cnVjdHVyYXMgc3VieWFjZW50ZXMgZW4gbG9zIGRhdG9zLCBmYWNpbGl0YW5kbyBsYSBpbnRlcnByZXRhY2nDs24geSBlbCBhbsOhbGlzaXMuDQoNCkxhIGFncnVwYWNpw7NuIGplcsOhcnF1aWNhIHNlIHV0aWxpemEgZW4gZGl2ZXJzYXMgw6FyZWFzLCBjb21vIGxhIGJpb2xvZ8OtYSBwYXJhIGNsYXNpZmljYXIgZXNwZWNpZXMsIGxhIG1lcmNhZG90ZWNuaWEgcGFyYSBzZWdtZW50YXIgY2xpZW50ZXMgeSBsYSBpbmZvcm3DoXRpY2EgcGFyYSBvcmdhbml6YXIgZ3JhbmRlcyB2b2zDum1lbmVzIGRlIGRhdG9zLiBTdSBjYXBhY2lkYWQgcGFyYSBtYW5lamFyIGRhdG9zIGNvbXBsZWpvcyB5IHByb3BvcmNpb25hciB1bmEgdmlzacOzbiBjbGFyYSBkZSBsYXMgcmVsYWNpb25lcyBqZXLDoXJxdWljYXMgbGEgY29udmllcnRlIGVuIHVuYSBoZXJyYW1pZW50YSB2YWxpb3NhIGVuIGVsIGFuw6FsaXNpc8KgZGXCoGRhdG9zLg0KDQoNCiMjIyMgQ2FtcG8gQ2xhc2lmaWNhdG9yaW8NCmBgYHtyIENhbXBvX2NsYXNpZmljYXRvcmlvLCBmaWcuYWxpZ249J2NlbnRlcid9DQpwcm9tZWRpbyA8LSByZWFkX2V4Y2VsKCJDOi9HZXN0aW9uIGRlIGRhdG9zIFtHOF0vcHJvbWVkaW8ueGxzeCIpDQpzdHIoYXMuZGF0YS5mcmFtZShwcm9tZWRpbykpDQoNCg0KYGBgDQoNCg0KDQojIyMjIERpc2ltaWxhcmlkYWQNCkxhIGdyw6FmaWNhIGRlIGRpc2ltaWxhcmlkYWQgcHJvcG9yY2lvbmEgdW5hIHJlcHJlc2VudGFjacOzbiBjbGFyYSB5IHZpc3VhbCBkZSBsYXMgZGlmZXJlbmNpYXMgZW50cmUgdmFyaW9zIGNvbG9yZXMgZW4gZWwgY29uanVudG8gZGUgZGF0b3MgYW5hbGl6YWRvLiBBbCB1dGlsaXphciB1bmEgZXNjYWxhIGRlIDAgYSA1LCBwZXJtaXRlIGlkZW50aWZpY2FyIHLDoXBpZGFtZW50ZSBjdcOhbGVzIGNvbG9yZXMgc29uIG3DoXMgc2ltaWxhcmVzIGVudHJlIHPDrSB5IGN1w6FsZXMgc29uIHNpZ25pZmljYXRpdmFtZW50ZSBkaWZlcmVudGVzLiBMb3MgY29sb3JlcyBjb24gdmFsb3JlcyBiYWpvcyBpbmRpY2FuIGFsdGEgc2ltaWxpdHVkLCBsbyBxdWUgcHVlZGUgc2VyIMO6dGlsIHBhcmEgdG9tYXIgZGVjaXNpb25lcyBlbiBkaXNlw7FvIG8gbWFya2V0aW5nLCBtaWVudHJhcyBxdWUgbG9zIGNvbG9yZXMgY29uIHZhbG9yZXMgYWx0b3Mgc3VnaWVyZW4gZGlmZXJlbmNpYXMgbWFyY2FkYXMgcXVlIHBvZHLDrWFuIGluZmx1aXIgZW4gbGEgcGVyY2VwY2nDs24gbyBwcmVmZXJlbmNpYSBkZWwgY29uc3VtaWRvci4NCg0KRXN0YSBtYXRyaXogZXMgZXNwZWNpYWxtZW50ZSB2YWxpb3NhIHBhcmEgZW50ZW5kZXIgcmVsYWNpb25lcyBjb21wbGVqYXMgZW50cmUgY2F0ZWdvcsOtYXMsIGZhY2lsaXRhbmRvIGxhIGlkZW50aWZpY2FjacOzbiBkZSBhZ3J1cGFjaW9uZXMgbyBwYXRyb25lcyBxdWUgcHVlZGVuIG5vIHNlciBldmlkZW50ZXPCoGHCoHNpbXBsZcKgdmlzdGEuDQpgYGB7ciBEaXNpbWlsYXJpZGFkLCBmaWcuYWxpZ249J2NlbnRlcid9DQpkYXRhXyA9IGFzLmRhdGEuZnJhbWUocHJvbWVkaW8pWywgLWMoMSldDQpyb3duYW1lcyhkYXRhXykgPSB1bmNsYXNzKHByb21lZGlvJE9jdXBhY2lvbikNCmZ2aXpfZGlzdChnZXRfZGlzdChkYXRhXywgc3RhbmQgPSBULCBtZXRob2QgPSAiZXVjbGlkZWFuIiksIGdyYWRpZW50ID0gbGlzdChsb3cgPSAiIzAwQUZCQiIsIG1pZCA9ICJ3aGl0ZSIsIGhpZ2ggPSAiI0ZDNEUwNyIpKQ0KDQoNCmBgYA0KDQojIyMjIE9wdGltaXphY2lvbiBEZSBNb2plbmEgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KTGEgb3B0aW1pemFjacOzbiBkZSBNb2plbmEgZXMgdW5hIHTDqWNuaWNhIHV0aWxpemFkYSBlbiBlbCBhbsOhbGlzaXMgZGUgYWdydXBhbWllbnRvIGplcsOhcnF1aWNvIHBhcmEgZGV0ZXJtaW5hciBlbCBuw7ptZXJvIMOzcHRpbW8gZGUgY2zDunN0ZXJlcy4gU2UgYmFzYSBlbiBsYSBpZGVudGlmaWNhY2nDs24gZGUgdW4gcHVudG8gZGUgY29ydGUgZW4gZWwgZGVuZHJvZ3JhbWEsIHV0aWxpemFuZG8gdW4gY3JpdGVyaW8gZXN0YWTDrXN0aWNvIHF1ZSBtYXhpbWl6YSBsYSBkaWZlcmVuY2lhIGVudHJlIGxhcyBkaXN0YW5jaWFzIGRlIGxvcyBjbMO6c3RlcmVzIGZ1c2lvbmFkb3MgeSBubyBmdXNpb25hZG9zLCBwZXJtaXRpZW5kbyB1bmEgc2VnbWVudGFjacOzbiBtw6FzIHByZWNpc2EgeSBzaWduaWZpY2F0aXZhwqBkZcKgbG9zwqBkYXRvcw0KDQojIyMjIyBVbmlvbiBzaW1wbGUNCmBgYHtyIFVuaW9uX3NpbXBsZSwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpoY19zaW5nbGUgPSBoY2x1c3QoZ2V0X2Rpc3QoZGF0YV8sIHN0YW5kID0gVCwgbWV0aG9kID0gImV1Y2xpZGVhbiIpLCBtZXRob2QgPSAic2luZ2xlIikNCg0KbW9qZW5hID0gZnVuY3Rpb24oaGMpew0KICBuX2hkID0gbGVuZ3RoKGhjJGhlaWdodCkNCiAgYWxwX2cgPSAwIDsgYWxwaGEgPSBoYyRoZWlnaHRbbl9oZDoxXQ0KICBmb3IoaSBpbiAxOihuX2hkLTEpKXsNCiAgICBhbHBfZ1tpXSA9IG1lYW4oYWxwaGFbKG5faGQtaSsxKToxXSkrMS4yNSpzZChhbHBoYVsobl9oZC1pKzEpOjFdKQ0KICB9DQogIG5vZyA9IHN1bShhbHBfZzw9IGFscGhhWy1uX2hkXSkgKyAxDQogIHBsb3QoYWxwaGFbLW5faGRdLCBwY2g9MjAsIGNvbD0oYWxwX2c+YWxwaGFbLW5faGRdKSsxLCBtYWluID0gcGFzdGUoIk9wdGltYWwgbnVtYmVyIG9mIGdyb3VwcyA9Iixub2cpLA0KICAgICAgIHlsYWIgPSBleHByZXNzaW9uKGFscGhhW2ddKSwgeGxhYj0iTm9kZXMiKX0NCg0KbW9qZW5hKGhjX3NpbmdsZSkNCmBgYA0KDQojIyMjIyBVbmlvbiBDb21wbGVqYQ0KTGEgZ3LDoWZpY2EgbXVlc3RyYSBlbCByZXN1bHRhZG8gZGUgdW4gYW7DoWxpc2lzIGRlIGFncnVwYW1pZW50byBqZXLDoXJxdWljbyBhZ2xvbWVyYXRpdm8sIGVzcGVjw61maWNhbWVudGUgdXRpbGl6YW5kbyBlbCBtw6l0b2RvIGRlIHVuacOzbiBzaW1wbGUgKHNpbmdsZSBsaW5rYWdlKS4gIEVsIG9iamV0aXZvIGVzIGRldGVybWluYXIgZWwgbsO6bWVybyDDs3B0aW1vIGRlIGdydXBvcyAoImNsdXN0ZXJzIikgZW4gdW4gY29uanVudG/CoGRlwqBkYXRvcy4NCmxhIGdyw6FmaWNhIHN1Z2llcmUgcXVlIGxhIG1lam9yIGFncnVwYWNpw7NuIGRlIGxvcyBkYXRvcyBzZSBsb2dyYSBjb24gMyBncnVwb3MsIHNlZ8O6biBlbCBjcml0ZXJpbyBkZSBtaW5pbWl6YXIgbGEgZGlzcGVyc2nDs24gZGVudHJvIGRlIGxvcyBncnVwb3MgdXRpbGl6YW5kbyBsYSB1bmnDs24gc2ltcGxlIGNvbW8gbcOpdG9kbyBkZcKgYWdydXBhbWllbnRvLg0KDQpgYGB7ciBVbmlvbl9Db21wbGVqYSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KaGNfY29tcGxldGUgPSBoY2x1c3QoZ2V0X2Rpc3QoZGF0YV8sIHN0YW5kID0gVCwgbWV0aG9kID0gImV1Y2xpZGVhbiIpLCBtZXRob2QgPSAiY29tcGxldGUiKQ0KDQptb2plbmEgPSBmdW5jdGlvbihoYyl7DQogIG5faGQgPSBsZW5ndGgoaGMkaGVpZ2h0KQ0KICBhbHBfZyA9IDAgOyBhbHBoYSA9IGhjJGhlaWdodFtuX2hkOjFdDQogIGZvcihpIGluIDE6KG5faGQtMSkpew0KICAgIGFscF9nW2ldID0gbWVhbihhbHBoYVsobl9oZC1pKzEpOjFdKSsxLjI1KnNkKGFscGhhWyhuX2hkLWkrMSk6MV0pDQogIH0NCiAgbm9nID0gc3VtKGFscF9nPD0gYWxwaGFbLW5faGRdKSArIDENCiAgcGxvdChhbHBoYVstbl9oZF0sIHBjaD0yMCwgY29sPShhbHBfZz5hbHBoYVstbl9oZF0pKzEsIG1haW4gPSBwYXN0ZSgiT3B0aW1hbCBudW1iZXIgb2YgZ3JvdXBzID0iLG5vZyksDQogICAgICAgeWxhYiA9IGV4cHJlc3Npb24oYWxwaGFbZ10pLCB4bGFiPSJOb2RlcyIpfQ0KDQptb2plbmEoaGNfY29tcGxldGUpDQoNCmBgYA0KDQojIyMjIyBVbmnDs24gUHJvbWVkaW8NCkxhIGdyw6FmaWNhIGRlIG9wdGltaXphY2nDs24gcGFyYSBlbCBtw6l0b2RvIGRlIHVuacOzbiBwcm9tZWRpbyBpbmRpY2EgcXVlIGVsIG7Dum1lcm8gw7NwdGltbyBkZSBncnVwb3MgZW4gZWwgY29uanVudG8gZGUgZGF0b3MgYW5hbGl6YWRvIGVzIDQuIEVzdG8gc2UgYmFzYSBlbiBsYSBvYnNlcnZhY2nDs24gZGUgcXVlLCBkZXNwdcOpcyBkZSBlc3RlIHB1bnRvLCBsYSBtZWpvcmEgZW4gbGEgbcOpdHJpY2EgzrE8c3ViPmc8L3N1Yj4gc2UgdnVlbHZlIG3DrW5pbWEsIHN1Z2lyaWVuZG8gcXVlIGFncmVnYXIgbcOhcyBncnVwb3Mgbm8gYXBvcnRhIGJlbmVmaWNpb3Mgc2lnbmlmaWNhdGl2b3MgZW4gbGEgY2FsaWRhZCBkZWwgYWdydXBhbWllbnRvLiBFbiByZXN1bWVuLCBhZ3J1cGFyIGxvcyBkYXRvcyBlbiA0IGNsw7pzdGVyZXMgcGVybWl0ZSB1bmEgcmVwcmVzZW50YWNpw7NuIGVxdWlsaWJyYWRhIHkgZWZlY3RpdmEsIGZhY2lsaXRhbmRvIHVuIGFuw6FsaXNpcyBtw6FzIGNsYXJvIHkgw7p0aWwgZGUgbG9zIHBhdHJvbmVzIHByZXNlbnRlc8KgZW7CoGxvc8KgZGF0b3MuDQpgYGB7ciBVbmlvbl9Qcm9tZWRpbywgZmlnLmFsaWduPSdjZW50ZXInfQ0KaGNfYXZlcmFnZSA9IGhjbHVzdChnZXRfZGlzdChkYXRhXywgc3RhbmQgPSBULCBtZXRob2QgPSAiZXVjbGlkZWFuIiksIG1ldGhvZCA9ICJhdmVyYWdlIikNCg0KbW9qZW5hID0gZnVuY3Rpb24oaGMpew0KICBuX2hkID0gbGVuZ3RoKGhjJGhlaWdodCkNCiAgYWxwX2cgPSAwIDsgYWxwaGEgPSBoYyRoZWlnaHRbbl9oZDoxXQ0KICBmb3IoaSBpbiAxOihuX2hkLTEpKXsNCiAgICBhbHBfZ1tpXSA9IG1lYW4oYWxwaGFbKG5faGQtaSsxKToxXSkrMS4yNSpzZChhbHBoYVsobl9oZC1pKzEpOjFdKQ0KICB9DQogIG5vZyA9IHN1bShhbHBfZzw9IGFscGhhWy1uX2hkXSkgKyAxDQogIHBsb3QoYWxwaGFbLW5faGRdLCBwY2g9MjAsIGNvbD0oYWxwX2c+YWxwaGFbLW5faGRdKSsxLCBtYWluID0gcGFzdGUoIk9wdGltYWwgbnVtYmVyIG9mIGdyb3VwcyA9Iixub2cpLA0KICAgICAgIHlsYWIgPSBleHByZXNzaW9uKGFscGhhW2ddKSwgeGxhYj0iTm9kZXMiKX0NCg0KbW9qZW5hKGhjX2F2ZXJhZ2UpDQoNCg0KYGBgDQoNCiMjIyMgRGVuZG9ncmFtYXMgb3B0aW1pemFkb3Mgey50YWJzZXQgLnRhYnNldC1waWxsc30NCkxvcyBkZW5kcm9ncmFtYXMgb3B0aW1pemFkb3Mgc29uIHJlcHJlc2VudGFjaW9uZXMgdmlzdWFsZXMgZGUgbGEgYWdydXBhY2nDs24gamVyw6FycXVpY2EgcXVlIGhhbiBzaWRvIGFqdXN0YWRhcyBwYXJhIG1lam9yYXIgbGEgY2xhcmlkYWQgeSBwcmVjaXNpw7NuIGVuIGxhIGludGVycHJldGFjacOzbiBkZSBsYXMgcmVsYWNpb25lcyBlbnRyZSBsb3MgZGF0b3MuIFV0aWxpemFuIHTDqWNuaWNhcyBlc3RhZMOtc3RpY2FzIHkgYWxnb3JpdG1vcyBwYXJhIGRldGVybWluYXIgZWwgbsO6bWVybyDDs3B0aW1vIGRlIGNsw7pzdGVyZXMgeSBlbCBwdW50byBkZSBjb3J0ZSBhZGVjdWFkbyBlbiBlbCBkZW5kcm9ncmFtYSwgZmFjaWxpdGFuZG8gdW5hIHNlZ21lbnRhY2nDs24gbcOhcyBzaWduaWZpY2F0aXZhIHkgcHJlY2lzYcKgZGXCoGxvc8KgZGF0b3MNCg0KIyMjIyMgRW5sYWNlIFNpbXBsZQ0KRWwgZGVuZHJvZ3JhbWEgbXVlc3RyYSB1bmEgamVyYXJxdcOtYSBkZSBhZ3J1cGFjaW9uZXMgZGUgY29sb3Jlcy4gTG9zIGNvbG9yZXMgY2VyY2Fub3MgZW4gbGEgcGFydGUgaW5mZXJpb3IgZXN0w6FuIG3DoXMgZXN0cmVjaGFtZW50ZSByZWxhY2lvbmFkb3MgKG3DoXMgc2ltaWxhcmVzKSBxdWUgYXF1ZWxsb3MgcXVlIHNlIHVuZW4gYSBtYXlvcmVzIGFsdHVyYXMgZW4gZWwgZGVuZHJvZ3JhbWEuIEVsIG3DqXRvZG8gZGUgZW5sYWNlIHNpbXBsZSBzZSBjZW50cmEgZW4gbGEgbWVub3IgZGlzdGFuY2lhIGVudHJlIHB1bnRvcyBkZSBkaWZlcmVudGVzIGdydXBvcyBwYXJhIHJlYWxpemFyIGxhc8KgYWdydXBhY2lvbmVzLg0KDQpgYGB7ciBFbmxhY2VfU2ltcGxlLCBmaWcuYWxpZ249J2NlbnRlcid9DQojc3VwcHJlc3NXYXJuaW5ncyhmdml6X2RlbmQoaGNfc2luZ2xlLCBrID0gMywgY2V4ID0gMC41LCBrX2NvbG9ycyA9ICJucGciLCBjb2xvcl9sYWJlbHNfYnlfayA9IFQsIHJlY3QgPSBUKSkNCg0KYGBgDQoNCkVycm9yIGNhcmRhdGE6IGVzdGUgZXJyb3Igc2UgcHJlc2VudGEgYWwgaW50ZW50YXIgYnVzY2FyIHVuIGFyY2hpdm8gZW4gdW5hIGxpYnJlcsOtYSBpbmV4aXN0ZW50ZSwgeWEgcXVlIG5vIGZ1ZSBwb3NpYmxlIGluc3RhbGFybGEgZGViaWRvIGEgcHJvYmxlbWFzIHTDqWNuaWNvcyBpbnRlcm5vcyB5IGRlcGVuZGVuY2lhcyBub8Kgc2F0aXNmZWNoYXMuDQoNCiMjIyMjIEVubGFjZSBDb21wbGV0bw0KTGEgY29uY2x1c2nDs24gZGVsIGRlbmRyb2dyYW1hIGRlIGVubGFjZSBjb21wbGV0byBlcyBxdWUgc2UgcHVlZGUgaWRlbnRpZmljYXIgY2xhcmFtZW50ZSBsYSBqZXJhcnF1w61hIGRlIHNpbWlsaXR1ZCBlbnRyZSBsb3MgY29sb3JlcyBhbmFsaXphZG9zLiBMb3MgY29sb3JlcyBxdWUgc2UgYWdydXBhbiBhIGFsdHVyYXMgYmFqYXMgZW4gZWwgZGVuZHJvZ3JhbWEgc29uIG3DoXMgc2ltaWxhcmVzIGVudHJlIHPDrSwgbWllbnRyYXMgcXVlIGFxdWVsbG9zIHF1ZSBzZSB1bmVuIGEgbWF5b3JlcyBhbHR1cmFzIHByZXNlbnRhbiB1bmEgbWF5b3IgZGlzaW1pbGl0dWQuIA0KU2Ugb2JzZXJ2YSBxdWUgbG9zIGNvbG9yZXMgY29tbyBDcmltc29uIGUgSW5kaWdvIHNvbiBsb3MgbcOhcyBjZXJjYW5vcywgZm9ybWFuZG8gdW4gZ3J1cG8gY29tcGFjdG8sIG1pZW50cmFzIHF1ZSBvdHJvcyBncnVwb3MgZGUgY29sb3JlcywgY29tbyBsb3MgdG9ub3MgY8OhbGlkb3MgeSBmcsOtb3MsIHNlIHNlcGFyYW4gYSB1bmEgZGlzdGFuY2lhIHNpZ25pZmljYXRpdmEuIEVzdG8gc3VnaWVyZSBxdWUgaGF5IHBhdHJvbmVzIGNsYXJvcyBlbiBsYSByZWxhY2nDs24gZGUgc2ltaWxpdHVkIGVudHJlIGxvcyBjb2xvcmVzLCBsbyBxdWUgcHVlZGUgc2VyIMO6dGlsIHBhcmEgdGFyZWFzIGNvbW8gbGEgc2VnbWVudGFjacOzbiBlbiBkaXNlw7FvIGdyw6FmaWNvLCBhbsOhbGlzaXMgZGUgdGVuZGVuY2lhcyBvIGVzdHVkaW9zIGRlIHBlcmNlcGNpw7NuwqBkZWzCoGNvbG9yLg0KYGBge3IgRW5sYWNlX0NvbXBsZXRvLCBmaWcuYWxpZ249J2NlbnRlcid9DQojZnZpel9kZW5kKGhjX2NvbXBsZXRlLCBrID0gMywgY2V4ID0gMC41LCBrX2NvbG9ycyA9ICJucGciLCBjb2xvcl9sYWJlbHNfYnlfayA9IFQsIHJlY3QgPSBUKQ0KDQpgYGANCg0KRXJyb3IgY2FyZGF0YTogZXN0ZSBlcnJvciBzZSBwcmVzZW50YSBhbCBpbnRlbnRhciBidXNjYXIgdW4gYXJjaGl2byBlbiB1bmEgbGlicmVyw61hIGluZXhpc3RlbnRlLCB5YSBxdWUgbm8gZnVlIHBvc2libGUgaW5zdGFsYXJsYSBkZWJpZG8gYSBwcm9ibGVtYXMgdMOpY25pY29zIGludGVybm9zIHkgZGVwZW5kZW5jaWFzIG5vwqBzYXRpc2ZlY2hhcy4NCg0KIyMjIyMgRW5sYWNlIFByb21lZGlvDQpFc3RlIGFuw6FsaXNpcyByZXZlbGEgbGEgZXhpc3RlbmNpYSBkZSBhbCBtZW5vcyB0cmVzIGdydXBvcyBwcmluY2lwYWxlczogdW5vIGRlIGNvbG9yZXMgZnLDrW9zLCBvdHJvIGRlIGNvbG9yZXMgY8OhbGlkb3MgeSB1biB0ZXJjZXJvIGNvbiB0b25vcyBpbnRlcm1lZGlvcyBvIG5ldXRyb3MuIExhIGVzdHJ1Y3R1cmEgZGVsIGRlbmRyb2dyYW1hIHBlcm1pdGUgaWRlbnRpZmljYXIgZsOhY2lsbWVudGUgZXN0b3MgcGF0cm9uZXMsIGxvIHF1ZSBwdWVkZSBzZXIgw7p0aWwgcGFyYSBhcGxpY2FjaW9uZXMgZW4gZGlzZcOxbywgbWFya2V0aW5nIG8gZXN0dWRpb3MgcmVsYWNpb25hZG9zIGNvbiBsYSBwZXJjZXBjacOzbiBkZWwgY29sb3IuICBFbCBkZW5kcm9ncmFtYSBwcm9wb3JjaW9uYSB1bmEgcmVwcmVzZW50YWNpw7NuIHZpc3VhbCBlZmVjdGl2YSBkZSBsYSByZWxhY2nDs24gZGUgc2ltaWxpdHVkIGVudHJlIGxvcyBjb2xvcmVzLCBmYWNpbGl0YW5kbyBsYSBpZGVudGlmaWNhY2nDs24gZGUgYWdydXBhY2lvbmVzIHNpZ25pZmljYXRpdmFzIGVuIGVsIGNvbmp1bnRvwqBkZcKgZGF0b3MuDQpgYGB7ciBFbmxhY2VfUHJvbWVkaW8sZmlnLmFsaWduPSdjZW50ZXInfQ0KI2Z2aXpfZGVuZChoY19hdmVyYWdlLCBrID0gNCwgY2V4ID0gMC41LCBrX2NvbG9ycyA9ICJucGciLCBjb2xvcl9sYWJlbHNfYnlfayA9IFQsIHJlY3QgPSBUKQ0KDQpgYGANCg0KRXJyb3IgY2FyZGF0YTogZXN0ZSBlcnJvciBzZSBwcmVzZW50YSBhbCBpbnRlbnRhciBidXNjYXIgdW4gYXJjaGl2byBlbiB1bmEgbGlicmVyw61hIGluZXhpc3RlbnRlLCB5YSBxdWUgbm8gZnVlIHBvc2libGUgaW5zdGFsYXJsYSBkZWJpZG8gYSBwcm9ibGVtYXMgdMOpY25pY29zIGludGVybm9zIHkgZGVwZW5kZW5jaWFzIG5vwqBzYXRpc2ZlY2hhcy4NCg0KIyMjICoqNC4zLiBBZ3J1cGFjacOzbiBOby1KZXLDoXJxdWljYSoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkxhIGFncnVwYWNpw7NuIG5vIGplcsOhcnF1aWNhIGVzIHVuIGVuZm9xdWUgZGUgYW7DoWxpc2lzIGRlIGRhdG9zIGVuIGVsIHF1ZSBsb3MgZGF0b3Mgc2UgYWdydXBhbiBlbiBjbMO6c3RlcmVzIHNpbiB1bmEgZXN0cnVjdHVyYSBqZXLDoXJxdWljYSBwcmVkZWZpbmlkYS4gQSBkaWZlcmVuY2lhIGRlIGxvcyBtw6l0b2RvcyBqZXLDoXJxdWljb3MsIGRvbmRlIGxvcyBncnVwb3Mgc2UgZm9ybWFuIGRlIG1hbmVyYSBzZWN1ZW5jaWFsIHkgc2UgZGl2aWRlbiBvIGZ1c2lvbmFuIGVuIG5pdmVsZXMgamVyw6FycXVpY29zLCBlbiBsYSBhZ3J1cGFjacOzbiBubyBqZXLDoXJxdWljYSBjYWRhIG9ic2VydmFjacOzbiBzZSBhc2lnbmEgYSB1biBncnVwbyBzZWfDum4gY2llcnRhcyBjYXJhY3RlcsOtc3RpY2FzIHNpbWlsYXJlcywgc2luIHVuIG9yZGVuIG8gZXN0cnVjdHVyYSBqZXLDoXJxdWljYS4gVW4gZWplbXBsbyBjb23Dum4gZGUgZXN0ZSB0aXBvIGRlIGFncnVwYWNpw7NuIGVzIGVsIGFsZ29yaXRtbyBLLW1lYW5zLCBxdWUgYWdydXBhIGxvcyBkYXRvcyBlbiB1biBuw7ptZXJvIHByZWRlZmluaWRvIGRlIGNsw7pzdGVyZXMuDQoNCkVuIGVzdGUgcHJvY2VzbywgZWwgbsO6bWVybyBkZSBjbMO6c3RlcmVzIGRlYmUgc2VyIGVzcGVjaWZpY2FkbyBhbnRlcyBkZSBpbmljaWFyIGVsIGFuw6FsaXNpcy4gRWwgYWxnb3JpdG1vIGJ1c2NhIGRpdmlkaXIgbG9zIGRhdG9zIGRlIG1hbmVyYSBxdWUgbG9zIGVsZW1lbnRvcyBkZW50cm8gZGUgY2FkYSBncnVwbyBzZWFuIGxvIG3DoXMgc2ltaWxhcmVzIHBvc2libGUgZW50cmUgc8OtLCB5IGxvIG3DoXMgZGlmZXJlbnRlcyBwb3NpYmxlIGRlIGxvcyBlbGVtZW50b3MgZGUgb3Ryb3MgZ3J1cG9zLiBQYXJhIGVsbG8sIHNlIHV0aWxpemFuIG1lZGlkYXMgZGUgZGlzdGFuY2lhLCBjb21vIGxhIGRpc3RhbmNpYSBldWNsaWRpYW5hLCBwYXJhIGFzaWduYXIgbG9zIHB1bnRvcyBhIGxvcyBncnVwb3MgYmFzw6FuZG9zZSBlbiBzdSBwcm94aW1pZGFkIGVuIGVsIGVzcGFjaW8gZGUgY2FyYWN0ZXLDrXN0aWNhcy4gQSBsbyBsYXJnbyBkZSB2YXJpYXMgaXRlcmFjaW9uZXMsIGVsIGFsZ29yaXRtbyBhanVzdGEgbGEgYXNpZ25hY2nDs24gZGUgbG9zIHB1bnRvcyBhIGxvcyBjbMO6c3RlcmVzIHBhcmEgbWluaW1pemFyIGxhcyBkaWZlcmVuY2lhcyBpbnRlcm5hcyBkZW50cm8gZGUgY2FkYSBncnVwby4NCg0KVW5hIGNhcmFjdGVyw61zdGljYSBpbXBvcnRhbnRlIGRlIGxhIGFncnVwYWNpw7NuIG5vIGplcsOhcnF1aWNhIGVzIHF1ZSBubyBoYXkgdW4gw6FyYm9sIGRlIGRlY2lzaW9uZXMgbyB1biBlbmZvcXVlIGplcsOhcnF1aWNvIGVuIGxhIGZvcm1hY2nDs24gZGUgZ3J1cG9zLiBFbiBjYW1iaW8sIHNlIGJ1c2NhIHVuYSBzZWdtZW50YWNpw7NuICJwbGFuYSIsIGRvbmRlIHRvZG9zIGxvcyBjbMO6c3RlcmVzIHRpZW5lbiBlbCBtaXNtbyBuaXZlbCBkZSBpbXBvcnRhbmNpYSB5IG5vIGV4aXN0ZW4gc3ViZ3J1cG9zIGRlbnRybyBkZSBsb3MgY2zDunN0ZXJlcy4gRXN0byBoYWNlIHF1ZSBsb3MgbcOpdG9kb3Mgbm8gamVyw6FycXVpY29zIHNlYW4gbcOhcyBhZGVjdWFkb3MgcGFyYSBncmFuZGVzIGNvbmp1bnRvcyBkZSBkYXRvcywgZG9uZGUgdW5hIGVzdHJ1Y3R1cmEgamVyw6FycXVpY2Egc2Vyw61hIGRlbWFzaWFkbyBjb21wbGVqYSBvwqBwb2NvwqBwcsOhY3RpY2EuDQoNCiMjIyMgSy3Ds3B0aW1vcyB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KTG9zIEstw7NwdGltb3Mgc29uIGVsIHJlc3VsdGFkbyBkZSB1bmEgc2VsZWNjacOzbiBjdWlkYWRvc2EgZGVsIG7Dum1lcm8gZGUgY2zDunN0ZXJlcyBxdWUgbWVqb3IgcmVmbGVqYW4gbGEgZXN0cnVjdHVyYSBzdWJ5YWNlbnRlIGRlIGxvcyBkYXRvcywgbWVqb3JhbmRvIGxhIGludGVycHJldGFjacOzbiB5IHV0aWxpZGFkIGRlIGxvcyByZXN1bHRhZG9zIGRlwqBsYcKgYWdydXBhY2nDs24uDQoNCiMjIyMjIEVsYm93DQpMYSB0YWJsYSBtdWVzdHJhIGPDs21vIHNlIHB1ZWRlIGVsZWdpciBlbCBuw7ptZXJvIGlkZWFsIGRlIGdydXBvcyBvIGNsw7pzdGVyZXMgZW4gdW4gYW7DoWxpc2lzIGRlIGFncnVwYW1pZW50by4gTGEgaWRlYSBlcyBlbmNvbnRyYXIgdW4gZXF1aWxpYnJpbyBlbnRyZSB0ZW5lciBzdWZpY2llbnRlcyBncnVwb3MgcGFyYSBjYXB0dXJhciBsYSBkaXZlcnNpZGFkIGRlIGxvcyBkYXRvcyB5IG5vIGNyZWFyIGRlbWFzaWFkb3MgZ3J1cG9zIHF1ZSBubyBhcG9ydGVuIGluZm9ybWFjacOzbiDDunRpbC4gQXl1ZGEgYSBkZWNpZGlyIGN1w6FudG9zIGdydXBvcyBzZSBkZWJlbiBjb25zaWRlcmFyIGFsIGFuYWxpemFyIGxvcyBkYXRvcywgYnVzY2FuZG8gZWwgbsO6bWVybyBxdWUgbWVqb3IgcmVwcmVzZW50ZSBsYXMgZGlmZXJlbmNpYXMgc2luIGNvbXBsaWNhciBkZW1hc2lhZG/CoGVswqBhbsOhbGlzaXMuDQoNCmBgYHtyIEVsYm93LCBmaWcuYWxpZ249J2NlbnRlcid9DQojZnZpel9uYmNsdXN0KGRhdGFfLCBrbWVhbnMsIG1ldGhvZCA9ICJ3c3MiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDMsIGxpbmV0eXBlID0gMikNCg0KYGBgDQoNCkVycm9yIGNhcmRhdGE6IGVzdGUgZXJyb3Igc2UgcHJlc2VudGEgYWwgaW50ZW50YXIgYnVzY2FyIHVuIGFyY2hpdm8gZW4gdW5hIGxpYnJlcsOtYSBpbmV4aXN0ZW50ZSwgeWEgcXVlIG5vIGZ1ZSBwb3NpYmxlIGluc3RhbGFybGEgZGViaWRvIGEgcHJvYmxlbWFzIHTDqWNuaWNvcyBpbnRlcm5vcyB5IGRlcGVuZGVuY2lhcyBub8Kgc2F0aXNmZWNoYXMuDQoNCiMjIyMjIFNpbGhvdWV0dGUNCkxhIHRhYmxhIGRlIHNpbGhvdWV0dGUgbXVlc3RyYSBjw7NtbyBzZSBhZ3J1cGFuIGxvcyBkYXRvcyBzZWfDum4gZGlmZXJlbnRlcyBuw7ptZXJvcyBkZSBjbMO6c3RlcmVzLiBVbiBtYXlvciBhbmNobyBkZSBzaWx1ZXRhIGluZGljYSB1biBtZWpvciBhZ3J1cGFtaWVudG8uIExvcyByZXN1bHRhZG9zIHN1Z2llcmVuIHF1ZSBlbCBuw7ptZXJvIMOzcHRpbW8gZGUgY2zDunN0ZXJlcyBlc3TDoSBlbnRyZSA0IHkgNSwgY29uIHVuIG3DoXhpbW8gZW4gNCwgbG8gcXVlIGluZGljYSBxdWUgbG9zIGRhdG9zIHNlIGFncnVwYW4gbWVqb3LCoGNvbsKgZXNlwqBuw7ptZXJvLg0KYGBge3IgU2lsaG91ZXR0ZSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KI2Z2aXpfbmJjbHVzdChkYXRhXywga21lYW5zLCBtZXRob2QgPSAic2lsaG91ZXR0ZSIpDQpgYGANCg0KRXJyb3IgY2FyZGF0YTogZXN0ZSBlcnJvciBzZSBwcmVzZW50YSBhbCBpbnRlbnRhciBidXNjYXIgdW4gYXJjaGl2byBlbiB1bmEgbGlicmVyw61hIGluZXhpc3RlbnRlLCB5YSBxdWUgbm8gZnVlIHBvc2libGUgaW5zdGFsYXJsYSBkZWJpZG8gYSBwcm9ibGVtYXMgdMOpY25pY29zIGludGVybm9zIHkgZGVwZW5kZW5jaWFzIG5vwqBzYXRpc2ZlY2hhcy4NCg0KIyMjIyMgR2FwIFN0YXRpc3RpYw0KTGEgZ3LDoWZpY2EgZGVsIGVzdGFkw61zdGljbyBHYXAgc2UgdXRpbGl6YSBwYXJhIGF5dWRhciBhIGRldGVybWluYXIgY3XDoW50b3MgZ3J1cG9zIG8gY2zDunN0ZXJlcyBkZWJlcsOtYW4gZm9ybWFyc2UgZW4gdW4gYW7DoWxpc2lzIGRlIGFncnVwYW1pZW50by4gTGEgaWRlYSBlcyBjb21wYXJhciBsYSBjYWxpZGFkIGRlIGFncnVwYW1pZW50byBkZSBsb3MgZGF0b3MgZGUgZXN0ZSBjb25qdW50byBjb24gbGEgZGUgdW4gY29uanVudG8gZGUgZGF0b3PCoGFsZWF0b3Jpb3MuDQpgYGB7ciBHYXBfc3RhdGlzdGljLCBmaWcuYWxpZ249J2NlbnRlcid9DQojZnZpel9uYmNsdXN0KGRhdGFfLCBrbWVhbnMsIG1ldGhvZCA9ICJnYXBfc3RhdCIpDQpgYGANCg0KRXJyb3IgY2FyZGF0YTogZXN0ZSBlcnJvciBzZSBwcmVzZW50YSBhbCBpbnRlbnRhciBidXNjYXIgdW4gYXJjaGl2byBlbiB1bmEgbGlicmVyw61hIGluZXhpc3RlbnRlLCB5YSBxdWUgbm8gZnVlIHBvc2libGUgaW5zdGFsYXJsYSBkZWJpZG8gYSBwcm9ibGVtYXMgdMOpY25pY29zIGludGVybm9zIHkgZGVwZW5kZW5jaWFzIG5vwqBzYXRpc2ZlY2hhcy4NCg0KIyMjIyMgTWFqb3JpdHkgUnVsZQ0KRXN0YXMgZ3LDoWZpY2FzIGF5dWRhbiBhIHRvbWFyIGRlY2lzaW9uZXMgaW5mb3JtYWRhcyBzb2JyZSBjdcOhbnRvcyBncnVwb3MgZXN0YWJsZWNlciBlbiBlbCBjb25qdW50byBkZSBkYXRvcywgYXNlZ3VyYW5kbyBsb2dyYXIgdW4gZXF1aWxpYnJpbyBlbnRyZSB1bmEgYnVlbmEgcmVwcmVzZW50YWNpw7NuIHkgbGEgY29tcGxlamlkYWTCoGRlbMKgbW9kZWxvLg0KYGBge3IgTWFqb3JpdHlfUnVsZX0NCiNzdXBwcmVzc1dhcm5pbmdzKE5iQ2x1c3QoZGF0YSA9IGRhdGFfLCBkaXNzID0gTlVMTCwgZGlzdGFuY2UgPSAiZXVjbGlkZWFuIiwgbWluLm5jID0gMiwgbWF4Lm5jID0gMTAsIG1ldGhvZCA9ICJrbWVhbnMiKSRCZXN0Lm5jKQ0KI3N1cHByZXNzV2FybmluZ3MoTmJDbHVzdChkYXRhID0gZGF0YV8sIGRpc3MgPSBOVUxMLCBkaXN0YW5jZSA9ICJldWNsaWRlYW4iLCBtaW4ubmMgPSAyLCBtYXgubmMgPSAxMCwgbWV0aG9kID0gImttZWFucyIpJEJlc3QubmMpDQpgYGANCg0KRXJyb3IgY2FyZGF0YTogZXN0ZSBlcnJvciBzZSBwcmVzZW50YSBhbCBpbnRlbnRhciBidXNjYXIgdW4gYXJjaGl2byBlbiB1bmEgbGlicmVyw61hIGluZXhpc3RlbnRlLCB5YSBxdWUgbm8gZnVlIHBvc2libGUgaW5zdGFsYXJsYSBkZWJpZG8gYSBwcm9ibGVtYXMgdMOpY25pY29zIGludGVybm9zIHkgZGVwZW5kZW5jaWFzIG5vwqBzYXRpc2ZlY2hhcy4NCg0KIyMjIyBSZXN1bHRhZG9zIEstbWVhbnMgey50YWJzZXQgLnRhYnNldC1waWxsc30NCkxvcyByZXN1bHRhZG9zIGRlIEstbWVhbnMgZGVzY3JpYmVuIGPDs21vIHNlIGFncnVwYW4gbG9zIGRhdG9zLCBjdcOhbiBkaXN0aW50b3Mgc29uIGxvcyBjbMO6c3RlcmVzIHkgY8OzbW8gc2UgYWp1c3RhIGVsIG1vZGVsbyBhIGxvcyBkYXRvcy4gRXN0byBheXVkYSBhIGludGVycHJldGFyIHBhdHJvbmVzIHkgcmVsYWNpb25lcyBkZW50cm8gZGVsIGNvbmp1bnRvwqBkZcKgZGF0b3MuDQoNCg0KIyMjIyMgSy1PcHRpbW8gW3d3c10gZWxib3cNCkVzdGUgYW7DoWxpc2lzIEstw7NwdGltbyBwcm9wb3JjaW9uYSB1bmEgdmlzacOzbiBjbGFyYSBzb2JyZSBjw7NtbyBzZSBhZ3J1cGFuIGxvcyBkYXRvcyB5IHF1w6kgdGFuIGJpZW4gc2Ugc2VwYXJhbiBlc29zIGdydXBvcyBlbnRyZSBzw60uIEVzdG8gZXMgw7p0aWwgcGFyYSBlbnRlbmRlciBwYXRyb25lcyBvIHRlbmRlbmNpYXPCoGVuwqBsb3PCoGRhdG9zLg0KYGBge3Igay1vcHRpbW9zLCBmaWcuYWxpZ249J2NlbnRlcid9DQpzZXQuc2VlZCg3ODA3MjgpDQpwcmludChrbWVhbnMoZGF0YV8sIDQsIG5zdGFydCA9IDI1KSkNCg0KYGBgDQoNCiMjIyMjIEstT3B0aW1vIFtzaWxdIHNpbHVldHRlDQpFc3RlIGFuw6FsaXNpcyBwcm9wb3JjaW9uYSB1bmEgdmlzacOzbiBjbGFyYSBzb2JyZSBjw7NtbyBzZSBhZ3J1cGFuIGxvcyBkYXRvcyBlbiBkb3MgY2x1c3RlcnMsIGRlc3RhY2FuZG8gbGFzIGRpZmVyZW5jaWFzIHkgc2ltaWxpdHVkZXMgZGVudHJvIHkgZW50cmUgZXNvcyBncnVwb3MuIEVzdG8gYXl1ZGEgYSBpZGVudGlmaWNhciBwYXRyb25lcyBvIGNvbXBvcnRhbWllbnRvcyBlbiBsb3MgZGF0b3MgcXVlIHNvbsKgc2lnbmlmaWNhdGl2b3MuDQpgYGB7ciBrLW9wdGltb19zaWwsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnNldC5zZWVkKDc4MDcyOCkNCnByaW50KGttZWFucyhkYXRhXywgMiwgbnN0YXJ0ID0gMjUpKQ0KYGBgDQoNCiMjIyMgR3JhZmljb3MgSy1tZWFucyB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KTG9zIGdyw6FmaWNvcyBLLW1lYW5zIGF5dWRhbiBhIHZhbGlkYXIgdmlzdWFsbWVudGUgbGEgY2FsaWRhZCBkZSBsYSBhZ3J1cGFjacOzbiB5IGEgaW50ZXJwcmV0YXIgY8OzbW8gbG9zIGRhdG9zIHNlIGRpdmlkZW4gZW4gY2zDunN0ZXJlcywgZmFjaWxpdGFuZG8gbGEgY29tcHJlbnNpw7NuIGRlIGxhcyByZWxhY2lvbmVzIHkgcGF0cm9uZXPCoGVuwqBsb3PCoGRhdG9zLg0KDQojIyMjIyBLLU9wdGltbyBbd3dzXSBlbGJvdw0KRW4gZXN0YSBncsOhZmljYSBkZSBLLcOzcHRpbW8gc2UgdmlzdWFsaXphbiBsb3MgcmVzdWx0YWRvcyBkZSB1biBhbsOhbGlzaXMgZGUgYWdydXBhY2nDs24gSy1tZWFucywgcmVwcmVzZW50YW5kbyBsb3MgZGF0b3MgZGlzdHJpYnVpZG9zIGVuIHRyZXMgY2zDunN0ZXJlcywgY2FkYSB1bm8gaWRlbnRpZmljYWRvIGNvbiB1biBjb2xvciBkaXN0aW50byAoYXp1bCwgYW1hcmlsbG8geSBjaWFuKS4gIE11ZXN0cmEgY8OzbW8gc2UgZGlzdHJpYnV5ZW4geSBhZ3J1cGFuIGxvcyBkYXRvcyBlbiB0cmVzIGNsw7pzdGVyZXMgw7NwdGltb3MsIHBlcm1pdGllbmRvIHZpc3VhbGl6YXIgc2ltaWxpdHVkZXMgeSBkaWZlcmVuY2lhcyBlbnRyZSBncnVwb3MsIGFzw60gY29tbyBwYXRyb25lcyBnZW5lcmFsZXMgZW4gbGFzIGNhcmFjdGVyw61zdGljYXPCoGRlwqBsb3PCoGRhdG9zLg0KDQpgYGB7ciBHcmFmX0VsYl9NYS1SdWwsIGZpZy5hbGlnbj0nY2VudGVyJ30NCiNmdml6X2NsdXN0ZXIoa21lYW5zKGRhdGFfLCAzLCBuc3RhcnQgPSAyNSksIGRhdGEgPSBkYXRhXywgcGFsZXR0ZSA9IGMoIiMyRTlGREYiLCAiIzAwQUZCQiIsICIjRTdCODAwIiwgIiNFN0I4MDEiKSwgZWxsaXBzZS50eXBlID0gImV1Y2xpZCIsIHN0YXIucGxvdCA9IFRSVUUsIHJlcGVsID0gVFJVRSwgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KRXJyb3IgY2FyZGF0YTogZXN0ZSBlcnJvciBzZSBwcmVzZW50YSBhbCBpbnRlbnRhciBidXNjYXIgdW4gYXJjaGl2byBlbiB1bmEgbGlicmVyw61hIGluZXhpc3RlbnRlLCB5YSBxdWUgbm8gZnVlIHBvc2libGUgaW5zdGFsYXJsYSBkZWJpZG8gYSBwcm9ibGVtYXMgdMOpY25pY29zIGludGVybm9zIHkgZGVwZW5kZW5jaWFzIG5vwqBzYXRpc2ZlY2hhcy4NCg0KIyMjIyMgSy1PcHRpbW8gW3NpbF0gc2lsdWV0dGUNCkVzdGEgZ3LDoWZpY2EgZGUgSy3Ds3B0aW1vIHJlcHJlc2VudGEgbGEgYWdydXBhY2nDs24gZGUgZGF0b3MgZW4gZG9zIGNsw7pzdGVyZXMgKDEgeSAyKSwgcHJveWVjdGFkb3MgZW4gZG9zIGRpbWVuc2lvbmVzIHByaW5jaXBhbGVzIChEaW0xIHkgRGltMikgLg0KYGBge3IgR3JhZl9zaWwsIGZpZy5hbGlnbj0nY2VudGVyJ30NCiNmdml6X2NsdXN0ZXIoa21lYW5zKGRhdGFfLCAyLCBuc3RhcnQgPSAyNSksIGRhdGEgPSBkYXRhXywgcGFsZXR0ZSA9IGMoIiMyRTlGREYiLCAiIzAwQUZCQiIsICIjRTdCODAwIiwgIiNFN0I4MDEiKSwgZWxsaXBzZS50eXBlID0gImV1Y2xpZCIsIHN0YXIucGxvdCA9IFRSVUUsIHJlcGVsID0gVFJVRSwgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KRXJyb3IgY2FyZGF0YTogZXN0ZSBlcnJvciBzZSBwcmVzZW50YSBhbCBpbnRlbnRhciBidXNjYXIgdW4gYXJjaGl2byBlbiB1bmEgbGlicmVyw61hIGluZXhpc3RlbnRlLCB5YSBxdWUgbm8gZnVlIHBvc2libGUgaW5zdGFsYXJsYSBkZWJpZG8gYSBwcm9ibGVtYXMgdMOpY25pY29zIGludGVybm9zIHkgZGVwZW5kZW5jaWFzIG5vwqBzYXRpc2ZlY2hhcy4NCg0KKiogZWwgbnVtZXJvIGRlc3B1ZXMgZGVsIGRhdGEgZW4gbG9zIDQgY2Fzb3MgZGUgay1vcHRpbW8gZXMgZW4gbG9zIGdydXBvcyBxdWUgc2UgZGl2aWRpbyBlbiBsb3MgZ3JhZmljb3MgZGUgYXJyaWJhICwgcGFyYSBlc28gcHVzZSBlbCBub21icmUgZGVsIGVsYm93IHkgc2lsdWV0dGUgLCBwYXJhIHNhYmVyIGNvbiBjdWFsIG1lIGd1aW8qKg0KDQoNCg0KDQojIyAqKkZhc2UgNSBbQW7DoWxpc2lzIGRlIFJlZ3Jlc2nDs25dKioNCg0KIyMjICoqNS4xLiBPYmpldGl2b3MqKg0KDQpBcGxpY2FyIHTDqWNuaWNhcyBkZSBhbsOhbGlzaXMgZGUgcmVncmVzacOzbiBwYXJhIG1vZGVsYXIgeSBjdWFudGlmaWNhciBsYXMgcmVsYWNpb25lcyBlbnRyZSB2YXJpYWJsZXMsIGNvbiBlbCBmaW4gZGUgcmVhbGl6YXIgcHJlZGljY2lvbmVzLCBpZGVudGlmaWNhciBpbmZsdWVuY2lhcyBzaWduaWZpY2F0aXZhcyBkZSB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgc29icmUgbGEgdmFyaWFibGUgZGVwZW5kaWVudGUsIHkgZXZhbHVhciBsYSBjYWxpZGFkIGRlbCBhanVzdGUgZGVsIG1vZGVsby4NCg0KIyMjICoqNS4yLiBSZWdyZXNpw7NuIExpbmVhbCBTaW1wbGUqKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KTGEgcmVncmVzacOzbiBsaW5lYWwgc2ltcGxlIGVzIHVuIG3DqXRvZG8gZXN0YWTDrXN0aWNvIHF1ZSBzZSB1dGlsaXphIHBhcmEgbW9kZWxhciBsYSByZWxhY2nDs24gZW50cmUgZG9zIHZhcmlhYmxlczogdW5hIHZhcmlhYmxlIGRlcGVuZGllbnRlIChvIHJlc3B1ZXN0YSkgeSB1bmEgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSAobyBwcmVkaWN0b3JhKS4gRXN0YSByZWxhY2nDs24gc2UgZGVzY3JpYmUgbWVkaWFudGUgdW5hIGzDrW5lYSByZWN0YSBxdWUgbWVqb3IgYWp1c3RhIGxvcyBkYXRvcywgY29ub2NpZGEgY29tbyBsYSBsw61uZWEgZGUgcmVncmVzacOzbi4gTGEgcmVncmVzacOzbiBsaW5lYWwgc2ltcGxlIGVzIHVuYSBoZXJyYW1pZW50YSBwb2Rlcm9zYSBwYXJhIGVudGVuZGVyIHkgY3VhbnRpZmljYXIgcmVsYWNpb25lcyBsaW5lYWxlcyBlbnRyZSBkb3MgdmFyaWFibGVzLCBzaWVuZG8gYW1wbGlhbWVudGUgdXRpbGl6YWRhIGVuIGRpdmVyc2FzIMOhcmVhcywgY29tbyBlY29ub23DrWEsIGNpZW5jaWFzIHNvY2lhbGVzIHkgbWVkaWNpbmEuIFBlcm1pdGUgcmVhbGl6YXIgcHJlZGljY2lvbmVzLCBldmFsdWFyIGxhIGRlcGVuZGVuY2lhIGVudHJlIHZhcmlhYmxlcyB5IGRldGVybWluYXIgc2kgbGEgcmVsYWNpw7NuIG9ic2VydmFkYSBlcyBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhLiBTaW4gZW1iYXJnbywgZXMgaW1wb3J0YW50ZSB2ZXJpZmljYXIgbGFzIHN1cG9zaWNpb25lcyBkZWwgbW9kZWxvIChjb21vIGxhIGxpbmVhbGlkYWQsIGluZGVwZW5kZW5jaWEgZGUgZXJyb3JlcywgeSBob21vY2VkYXN0aWNpZGFkKSBwYXJhIGdhcmFudGl6YXIgbGEgdmFsaWRleiBkZcKgbG9zwqByZXN1bHRhZG9zLg0KDQoNCiMjIyMgUmVzdW1lbiBkZSBFZGFkDQpFc3RlIGdyw6FmaWNvIGVzIHVuIGRpYWdyYW1hIGRlIGNhamEgeSBiaWdvdGVzIChib3hwbG90KSBxdWUgcmVzdW1lIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGEgdmFyaWFibGUgKipFZGFkKiouICBFc3RlIGJveHBsb3QgcHJvcG9yY2lvbmEgdW4gcmVzdW1lbiB2aXN1YWwgZGVsIHJhbmdvLCBtZWRpYW5hIHkgZGlzcGVyc2nDs24gZGUgbGEgdmFyaWFibGUgKipFZGFkKiosIG1vc3RyYW5kbyBxdWUgbG9zIGRhdG9zIGVzdMOhbiBkaXN0cmlidWlkb3MgZGUgZm9ybWEgZXF1aWxpYnJhZGEgc2luIHZhbG9yZXMgYXTDrXBpY29zwqBldmlkZW50ZXMuDQoNCmBgYHtyIFJlc3VtZW5fZGVfRWRhZCwgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc3VtbWFyeShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kRWRhZCkNCmJveHBsb3QoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJEVkYWQsIG1haW4gPSAiRGlhZ3JhbWEgZGUgQ2FqYSBkZSBFZGFkIiwgY29sID0gYygib3JhbmdlIikpDQoNCmBgYA0KDQojIyMjIFJlc3VtZW4gZGUgSU1DDQpFbCBkaWFncmFtYSBpbmRpY2EgcXVlIGxhIG1heW9yw61hIGRlIGxvcyBwcmVjaW9zIHNlIGNvbmNlbnRyYW4gZW4gdG9ybm8gYSBsYSBtZWRpYW5hLCBwZXJvIGhheSB2YXJpb3MgcHJlY2lvcyBtdWNobyBtw6FzIGFsdG9zIHF1ZSBhZmVjdGFuIGxhIGRpc3RyaWJ1Y2nDs24sIGNvbW8gc2UgcHVlZGUgb2JzZXJ2YXIgcG9yIGxhIHByZXNlbmNpYSBkZcKgbG9zwqBvdXRsaWVycy4NCmBgYHtyIFJlc3VtZW5fZGVfSU1DLCBmaWcuYWxpZ249J2NlbnRlcid9DQpzdW1tYXJ5KGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRJTUMpDQpib3hwbG90KGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRJTUMsIG1haW4gPSAiRGlhZ3JhbWEgZGUgQ2FqYSBkZSBJTUMiLCBjb2wgPSBjKCJvcmFuZ2UiKSkNCg0KYGBgDQoNCiMjIyMgRGlhZ3JhbWEgZGUgRGlzcGVyc2lvbiBFZGFkIHZzIElNQy4NCkVsIGRpYWdyYW1hIGRlIGRpc3BlcnNpw7NuIG11ZXN0cmEgbGEgcmVsYWNpw7NuIGVudHJlIGxhIGVkYWQgZGUgbG9zIHBhY2llbnRlcyB5IHN1IElNQy4gIFNlIG9ic2VydmEgdW5hIGZ1ZXJ0ZSBjb25jZW50cmFjacOzbiBkZSBkYXRvcyBlbiBwcmVjaW9zIGJham9zIHkgdW5hIGFtcGxpYSBnYW1hIGRlIGVkYWRlcywgaW5kaWNhbmRvIHF1ZSBsYSBtYXlvcsOtYSBkZSBsb3MgdmVow61jdWxvcyBzb24gcmVsYXRpdmFtZW50ZSBiYXJhdG9zIHkgYWJhcmNhbiB1biByYW5nbyBhbXBsaW8gZGUgZWRhZGVzIGRlIGxhcyBwZXJzb25hcy4gSGF5IGFsZ3Vub3MgcHVudG9zIGRpc3BlcnNvcyBhIHByZWNpb3MgbcOhcyBhbHRvcywgc3VnaXJpZW5kbyBsYSBleGlzdGVuY2lhIGRlIHZlaMOtY3Vsb3MgbcOhcyBjYXJvcywgZ2VuZXJhbG1lbnRlZGUgcGVyc29uYXMgbWFzIGrDs3ZlbmVzLg0KYGBge3IgRGlhZ3JhbWFfZGVfRGlzcGVyc2lvbl9FZGFkX3ZzX0lNQ30NCnBsb3QoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJEVkYWQsIGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRJTUMsIG1haW4gPSAiRGlhZ3JhbWEgZGUgRGlzcGVyc2nDs24gRWRhZCB2cy4gSU1DIikNCmBgYA0KDQojIyMjIERpYWdyYW1hcyBUb3RhbGVzIGRlIERpc3BlcnNpw7NuDQpMb3MgdG90YWxlcyBkZSBkaXNwZXJzacOzbiBtdWVzdHJhbiB1biBkaWFncmFtYSBkZSBkaXNwZXJzacOzbiBkZSBwYXJlcyBxdWUgdmlzdWFsaXphIGxhcyByZWxhY2lvbmVzIGVudHJlIGN1YXRybyB2YXJpYWJsZXM6IEVkYWQsIFByZWNpbywgUHJlc2lvbiBzaXN0b2xhIHkgUHJlc2lvbiBkaWFzdG9sYS4gQ2FkYSBwYW5lbCBtdWVzdHJhIGxhIHJlbGFjacOzbiBlbnRyZSBkb3MgdmFyaWFibGVzLiAgTG9zIHB1bnRvcyByZXByZXNlbnRhbiBsYXMgb2JzZXJ2YWNpb25lcyBpbmRpdmlkdWFsZXMsIHkgbGEgZGVuc2lkYWQgZGUgbG9zIHB1bnRvcyBpbmRpY2EgbGEgZnJlY3VlbmNpYSBkZSBvY3VycmVuY2lhIGVuIGVzYSByZWdpw7NuIGRlbCBlc3BhY2lvLiAgT2JzZXJ2YW1vcyBxdWUgaGF5IG11Y2hvcyBwdW50b3Mgc3VwZXJwdWVzdG9zLCBsbyBxdWUgaGFjZSBkaWbDrWNpbCB2ZXIgdG9kYXMgbGFzIHJlbGFjaW9uZXMgaW5kaXZpZHVhbGVzIGNvbiBjbGFyaWRhZC4NCg0KYGBge3IgRGlhZ3JhbWFzX1RvdGFsZXNfZGVfRGlzcGVyc2nDs24sZmlnLmFsaWduPSdjZW50ZXInfQ0KcGFpcnMofkVkYWQgKyBJTUMgKyBQcmVzaW9uX3Npc3RvbGEgKyBQcmVzaW9uX2RpYXN0b2xhLCBkYXRhID0gY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvKQ0KDQpgYGANCg0KIyMjIEZvcm11bGFjacOzbiBkZWwgbW9kZWxvIGRlIFJMUyBlbnRyZSBsYXMgdmFyaWFibGVzIGRlIGVzdHVkaW8uIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQpMYSBuYXZlZ2FjacOzbiBhIHRyYXbDqXMgZGUgbGFzIHBlc3Rhw7FhcyBtdWVzdHJhIGxvcyBjb2VmaWNpZW50ZXMgZGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBzaW1wbGUsIHN1IHJlc3VtZW4gZXN0YWTDrXN0aWNvIHkgc3UgdGFibGEgQU5PVkEuIFNlIG1lbmNpb25hIGRlIG51ZXZvIHF1ZSBsYXMgdmFyaWFibGVzIGRlIGludGVyw6lzIHNvbjogKipJTUMqKiAodmFyaWFibGUgZGVwZW5kaWVudGUpIHkgKipFZGFkKiogKHZhcmlhYmxlIGluZGVwZW5kaWVudGUpLg0KQWwgY29uc2lkZXJhciBsb3MgcmVzdWx0YWRvcyBwcmVzZW50YWRvcyBlbiBsYSBwZXN0YcOxYSBDb2VmaWNpZW50ZXMgZGVsIE1vZGVsbyBSTFMgc2UgcHVlZGUgZXN0YWJsZXIgcXVlIGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBzaW1wbGUgcXVlIHJlbGFjaW9uYSBhIGxhcyB2YXJpYWJsZXMgZGUgaW50ZXLDqXMuIFRpZW5lIGxhIGZvcm11bGFjacOzbjoNCg0KDQojIyMjIENvZWZpY2llbnRlcyBkZWwgTW9kZWxvIFJMUw0KRWwgY8OzZGlnbyBhanVzdGEgdW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHNpbXBsZSBwYXJhIHByZWRlY2lyIGxhIGVkYWQgZW4gZnVuY2nDs24gZGUgc3UgcHJlY2lvIElNQy4NCkx1ZWdvLCBvYnRlbmVtb3MgbG9zIGNvZWZpY2llbnRlcyBkZWwgbW9kZWxvIChlbCBpbnRlcmNlcHRvIHkgbGEgcGVuZGllbnRlKSBxdWUgaW5kaWNhbiBsYSByZWxhY2nDs24gbWF0ZW3DoXRpY2EgZW50cmUgZXN0YXPCoGRvc8KgdmFyaWFibGVzLg0KYGBge3IgQ29lZmljaWVudGVzX2RlbF9Nb2RlbG8gUkxTfQ0KbW9kZWxvX1JMX1NpbXBsZSA9IGxtKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRFZGFkfmNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRJTUMpDQpjb2VmKG1vZGVsb19STF9TaW1wbGUpDQpgYGANCg0KIyMjIyBSZXN1bWVuIEVzdGFkw61zdGljbyBkZWwgTW9kZWxvIFJMUw0KTGEgdGFibGEgc3VnaWVyZSBxdWUgaGF5IHVuYSByZWxhY2nDs24gc2lnbmlmaWNhdGl2YSBlbnRyZSBsYSBlZGFkIHkgZWwgSU1DIGRlIGxvcyBwYWNpZW50ZXMgLg0KYGBge3IgUmVzdW1lbl9Fc3RhZMOtc3RpY29fZGVsX01vZGVsb19STFN9DQpzdW1tYXJ5KG1vZGVsb19STF9TaW1wbGUpDQpgYGANCg0KIyMjIyBUYWJsYSBBTk9WQSBwYXJhIGVsIE1vZGVsbyBSTFMNCkxhIHRhYmxhIEFOT1ZBIGluZGljYSBxdWUgZWwgbW9kZWxvIG5vIGV4cGxpY2Egc2lnbmlmaWNhdGl2YW1lbnRlIGxhIHZhcmlhY2nDs24gZW4gbGEgZWRhZCBkZSBsb3MgcGFjaWVudGVzIGVuIGZ1bmNpw7NuIGRlIHN1IElNQy4gQ29uIHVuIHZhbG9yIHAgYWx0byB5IHVuIGVzdGFkw61zdGljbyBGIGJham8sIHBvZGVtb3MgY29uY2x1aXIgcXVlIGhheSB1bmEgcmVsYWNpw7NuIGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdmEgZW50cmUgZXN0YXMgZG9zIHZhcmlhYmxlcyBlbiBlc3RlIGNvbmp1bnRvwqBkZcKgZGF0b3MuDQpgYGB7ciBUYWJsYV9BTk9WQV9wYXJhX2VsX01vZGVsbyBSTFN9DQphbm92YShtb2RlbG9fUkxfU2ltcGxlKQ0KYGBgDQoNCiMjIyBBbsOhbGlzaXMgZGVsIG1vZGVsbyBSTFMuey50YWJzZXQgLnRhYnNldC1waWxsc30NCkVsIGFuw6FsaXNpcyBkZWwgbW9kZWxvIFJMUyBtdWVzdHJhIHF1ZSBubyBlcyBtdXkgc2lnbmlmaWNhdGl2byB5IGVuIGNvbnNlY3VlbmNpYSBhcG9ydGEgcG9jYSBpbmZvcm1hY2nDs24gcmVsZXZhbnRlIHBhcmEgZXN0aW1hciAqKkVkYWQqKiBhIHBhcnRpciBkZSAqKklNQyoqLjoNCg0KDQojIyMjIEludGVydmFsbyBkZSBDb25maWFuemEgcGFyYSBCMQ0KDQpgYGB7ciBJbnRlcnZhbG9fZGVfQ29uZmlhbnphX3BhcmEgQjEsZmlnLmFsaWduPSdjZW50ZXInfQ0KY29uZmludChtb2RlbG9fUkxfU2ltcGxlLCBsZXZlbCA9IDAuOTUpDQpgYGANCg0KIyMjIyBQcmVkaWNjaW9uZXMgeSBzdXMgSW50ZXJ2YWxvcyBkZSBQcmVkaWNjacOzbg0KYGBge3IgUHJlZGljY2lvbmVzX3lfc3VzX0ludGVydmFsb3NfZGVfUHJlZGljY2nDs24sZmlnLmFsaWduPSdjZW50ZXInfQ0KcHJlZGljdChtb2RlbG9fUkxfU2ltcGxlLCBkYXRhLmZyYW1lKHNlcSgxLDQwMCkpLCBpbnRlcnZhbD0ncHJlZGljdGlvbicsIGxldmVsID0gMC45NSkNCg0KYGBgDQoNCiMjIyMgUHJlZGljY2lvbmVzIHkgc3VzIEludGVydmFsb3MgZGUgQ29uZmlhbnphDQpgYGB7ciBQcmVkaWNjaW9uZXNfeV9zdXNfSW50ZXJ2YWxvc19kZV9Db25maWFuemF9DQpwcmVkaWN0KG1vZGVsb19STF9TaW1wbGUsIGRhdGEuZnJhbWUoc2VxKDEsMjAwKSksIGludGVydmFsPSdjb25maWRlbmNlJywgbGV2ZWwgPSAwLjk1KQ0KYGBgDQoNCiMjIyAqKjUuMy4gUmVncmVzacOzbiBMaW5lYWwgTcO6bHRpcGxlKiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCkxhIHJlZ3Jlc2nDs24gbGluZWFsIG3Dumx0aXBsZSBlcyB1bmEgdMOpY25pY2EgZXN0YWTDrXN0aWNhIHF1ZSBleHRpZW5kZSBsYSByZWdyZXNpw7NuIGxpbmVhbCBwYXJhIG1vZGVsYXIgbGEgcmVsYWNpw7NuIGVudHJlIHVuYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSB5IG3Dumx0aXBsZXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzLiBFbiB0w6lybWlub3MgZ2VuZXJhbGVzLCBkZXNjcmliZSBjw7NtbyBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSBjYW1iaWEgZW4gZnVuY2nDs24gZGUgdmFyaWFzIHZhcmlhYmxlcyBwcmVkaWN0b3JhLiBFbCBhbsOhbGlzaXMgZGUgcmVncmVzacOzbiBtw7psdGlwbGUgcGVybWl0ZSBldmFsdWFyIGPDs21vIGxhcyBkaWZlcmVudGVzIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcyBhZmVjdGFuIGNvbmp1bnRhbWVudGUgYSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZS4gQ2FkYSBjb2VmaWNpZW50ZSBkZSByZWdyZXNpw7NuIHNlIGludGVycHJldGEgY29tbyBlbCBjYW1iaW8gZXNwZXJhZG8gZW4gbGEgdmFyaWFibGUgZGVwZW5kaWVudGUgcG9yIGNhZGEgdW5pZGFkIGRlIGNhbWJpbyBlbiBsYSB2YXJpYWJsZSBpbmRlcGVuZGllbnRlIGNvcnJlc3BvbmRpZW50ZSwgbWFudGVuaWVuZG8gbGFzIGRlbcOhcyBjb25zdGFudGVzLiBFc3RvIHBlcm1pdGUgaWRlbnRpZmljYXIgcXXDqSB2YXJpYWJsZXMgdGllbmVuIHVuIGVmZWN0byBzaWduaWZpY2F0aXZvIHkgcXXDqSB0YW4gZnVlcnRlIGVzIHN1IGluZmx1ZW5jaWEgZW4gZWwgcmVzdWx0YWRvLiBUYW1iacOpbiBheXVkYSBhIGVudGVuZGVyIGxhcyByZWxhY2lvbmVzIGNvbXBsZWphcyBlbnRyZSBsYXMgdmFyaWFibGVzIHkgYSBjb250cm9sYXIgcG9zaWJsZXMgZmFjdG9yZXMgZGUgY29uZnVzacOzbi4NCg0KTG9zIHJlc3VsdGFkb3MgZGUgbGEgcmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlIGluY2x1eWVuIG3DqXRyaWNhcyBkZSBhanVzdGUgY29tbyBlbCBjb2VmaWNpZW50ZSBkZSBkZXRlcm1pbmFjacOzbiB5IGVsIHZhbG9yIGFqdXN0YWRvIHF1ZSBpbmRpY2FuIHF1w6kgcHJvcG9yY2nDs24gZGUgbGEgdmFyaWFiaWxpZGFkIGRlIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlIGVzIGV4cGxpY2FkYSBwb3IgZWwgbW9kZWxvLiBUYW1iacOpbiBzZSBldmFsw7phbiBsYXMgc3Vwb3NpY2lvbmVzIGRlbCBtb2RlbG8gKGxpbmVhbGlkYWQsIGluZGVwZW5kZW5jaWEgZGUgZXJyb3JlcywgaG9tb2NlZGFzdGljaWRhZCB5IG5vcm1hbGlkYWQpIHkgcG9zaWJsZXMgcHJvYmxlbWFzIGNvbW8gbGEgbXVsdGljb2xpbmVhbGlkYWQgZW50cmUgbGFzIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcy4gRW4gcmVzdW1lbiwgbGEgcmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlIHByb3BvcmNpb25hIHVuIG1hcmNvIHJvYnVzdG8gcGFyYSBhbmFsaXphciwgcHJlZGVjaXIgeSBleHBsaWNhciByZWxhY2lvbmVzIGNvbXBsZWphcyBlbiB1biBjb25qdW50byBkZSBkYXRvcyBjb24gbcO6bHRpcGxlcyBmYWN0b3Jlc8KgaW5mbHV5ZW50ZXMuDQoNCg0KIyMjIyBSZXN1bWVuIFZhcmlhYmxlcyBDdWFudGl0YXRpdmFzDQpMYSB0YWJsYSBtdWVzdHJhIHVuIHJlc3VtZW4gZXN0YWTDrXN0aWNvIGRlIG9jaG8gdmFyaWFibGVzIGN1YW50aXRhdGl2YXMgZGUgdW4gY29uanVudG8gZGUgZGF0b3MgZGUgY2RkIHNhbHVkIHkgZXN0aWxvcyBkZSB2aWRhOiAgKipFZGFkKiosICoqRHVyYWNpb25fZGVfc3Vlbm8qKiwgKipDYWxpZGFkX2RlX3N1ZW5vKiogLCAqKk5pdmVsX2RlX2FjdGl2aWRhZF9maXNpY2EqKiwgKipOaXZlbF9kZV9lc3RyZXMqKiwgKipQcmVzaW9uX3Npc3RvbGEqKiwgKipQcmVzaW9uX2RpYXN0b2xhKiosICoqRnJlY3VlbmNpYV9jYXJkaWFjYSoqLCAqKlBhc29zX2RpYXJpb3MqKi4gIFBhcmEgY2FkYSB2YXJpYWJsZSBzZSBtdWVzdHJhbiBsb3Mgc2lndWllbnRlcyBlc3RhZMOtc3RpY29zOiBtw61uaW1vLCBwcmltZXIgY3VhcnRpbCwgbWVkaWFuYSwgbWVkaWEsIHRlcmNlciBjdWFydGlsIHkgbcOheGltby4gIExvcyB2YWxvcmVzIG51bcOpcmljb3MgcmVwcmVzZW50YW4gbGFzIG1lZGlkYXMgZGUgY2FkYSBlc3RhZMOtc3RpY28gcGFyYcKgY2FkYcKgdmFyaWFibGUuDQoNCmBgYHtyIFJlc3VtZW5fVmFyaWFibGVzX0N1YW50aXRhdGl2YXMsZmlnLmFsaWduPSdjZW50ZXInfQ0KDQpzdW1tYXJ5KGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRFZGFkKQ0Kc3VtbWFyeShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kRHVyYWNpb25fZGVfc3Vlbm8pDQpzdW1tYXJ5KGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRDYWxpZGFkX2RlX3N1ZW5vKQ0Kc3VtbWFyeShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kTml2ZWxfZGVfYWN0aXZpZGFkX2Zpc2ljYSkNCnN1bW1hcnkoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJE5pdmVsX2RlX2VzdHLDqXMpDQpzdW1tYXJ5KGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRQcmVzaW9uX3Npc3RvbGEpDQpzdW1tYXJ5KGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRQcmVzaW9uX2RpYXN0b2xhKQ0Kc3VtbWFyeShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kRnJlY3VlbmNpYV9jYXJkaWFjYSkNCnN1bW1hcnkoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJFBhc29zX2RpYXJpb3MpDQoNCmBgYA0KDQojIyMjIFJlc3VtZW4gVmFyaWFibGVzIEN1YWxpdGF0aXZhcw0KRWwgcmVzdW1lbiBkZSB2YXJpYWJsZXMgY3VhbGl0YXRpdmFzIG11ZXN0cmEgbGEgZGlzdHJpYnVjacOzbiBkZSBsYSB2YXJpYWJsZSBHZW5lcm8gZW4gZWwgY29uanVudG8gZGUgZGF0b3MgY2RkIHNhbHVkIHkgZXN0aWxvcyBkZSB2aWRhIC4gSGF5IDE4NSBvYnNlcnZhY2lvbmVzIGNvbiBlbCB2YWxvciAwIHkgMTg5IGNvbiBlbCB2YWxvciAxLiBFc3RvIGluZGljYSBxdWUgYXByb3hpbWFkYW1lbnRlIGVsIDQ5LjQ2JSBkZSBsb3MgZGF0b3MgY29ycmVzcG9uZGUgYWwgZ8OpbmVybyAwIHkgZWwgNTAuNTQlIGFsIGfDqW5lcm8gMS4gVGFtYmnDqW4gc2UgZ2VuZXJhIHVuIGdyw6FmaWNvIGRlIGJhcnJhcyBxdWUgdmlzdWFsaXphIGVzdGHCoGRpc3RyaWJ1Y2nDs24uDQoNCmBgYHtyIFJlc3VtZW5fVmFyaWFibGVzX0N1YWxpdGF0aXZhcyxmaWcuYWxpZ249J2NlbnRlcid9DQoNCnRhYmxhX2dlbmVybyA8LSB0YWJsZShuYS5vbWl0KGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9iYXNlJEdlbmVybykpDQppZiAobGVuZ3RoKHRhYmxhX2dlbmVybykgPiAwKSB7DQogIHByaW50KHRhYmxhX2dlbmVybykNCiAgcHJpbnQocHJvcC50YWJsZSh0YWJsYV9nZW5lcm8pKQ0KICBiYXJwbG90KHRhYmxhX2dlbmVybywgbWFpbiA9ICJEaXN0cmlidWNpw7NuIGRlIEfDqW5lcm8iKQ0KfQ0KDQp0YWJsYV9vY3VwYWNpb24gPC0gdGFibGUobmEub21pdChjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfYmFzZSRPY3VwYWNpb24pKQ0KaWYgKGxlbmd0aCh0YWJsYV9vY3VwYWNpb24pID4gMCkgew0KICBwcmludCh0YWJsYV9vY3VwYWNpb24pDQogIHByaW50KHByb3AudGFibGUodGFibGFfb2N1cGFjaW9uKSkNCiAgYmFycGxvdCh0YWJsYV9vY3VwYWNpb24sIG1haW4gPSAiRGlzdHJpYnVjacOzbiBkZSBPY3VwYWNpw7NuIikNCn0NCg0KDQp0YWJsYV9pbWMgPC0gdGFibGUobmEub21pdChjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfYmFzZSRJTUMpKQ0KaWYgKGxlbmd0aCh0YWJsYV9pbWMpID4gMCkgew0KICBwcmludCh0YWJsYV9pbWMpDQogIHByaW50KHByb3AudGFibGUodGFibGFfaW1jKSkNCiAgYmFycGxvdCh0YWJsYV9pbWMsIG1haW4gPSAiRGlzdHJpYnVjacOzbiBkZSBJTUMiKQ0KfQ0KDQp0YWJsYV9zdWVubyA8LSB0YWJsZShuYS5vbWl0KGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9iYXNlJFRyYXN0b3Jub19kZWxfc3Vlbm8pKQ0KaWYgKGxlbmd0aCh0YWJsYV9zdWVubykgPiAwKSB7DQogIHByaW50KHRhYmxhX3N1ZW5vKQ0KICBwcmludChwcm9wLnRhYmxlKHRhYmxhX3N1ZW5vKSkNCiAgYmFycGxvdCh0YWJsYV9zdWVubywgbWFpbiA9ICJEaXN0cmlidWNpw7NuIGRlIFRyYXN0b3Jub3MgZGVsIFN1ZcOxbyIpDQp9DQoNCg0KYGBgDQoNCiMjIyMgUmVzdW1lbiB5IEFOT1ZBIGRlbCBNb2RlbG8gUkxNIFRvdGFsDQpFbCBBTk9WQSB5IGxvcyBjb2VmaWNpZW50ZXMgYXl1ZGFuIGEgZXZhbHVhciBsYSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcyB5IGVsIElNQywgbW9zdHJhbmRvIHF1w6kgZmFjdG9yZXMgc29uwqBzaWduaWZpY2F0aXZvcy4NCmBgYHtyIFJlc3VtZW5feV9BTk9WQV9kZWxfTW9kZWxvX1JMTV9Ub3RhbH0NCnN1bW1hcnkobG0oY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJElNQ35jZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kRHVyYWNpb25fZGVfc3Vlbm8rY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJEVkYWQrY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJE5pdmVsX2RlX2FjdGl2aWRhZF9maXNpY2ErYXMuZmFjdG9yKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRQYXNvc19kaWFyaW9zKSthcy5mYWN0b3IoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJE5pdmVsX2RlX2VzdHLDqXMpK2FzLmZhY3RvcihjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kUHJlc2lvbl9zaXN0b2xhKSthcy5mYWN0b3IoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJENhbGlkYWRfZGVfc3Vlbm8pKSkNCg0KYW5vdmEobG0oY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJElNQ35jZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kRHVyYWNpb25fZGVfc3Vlbm8rY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJEVkYWQrY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJE5pdmVsX2RlX2FjdGl2aWRhZF9maXNpY2ErYXMuZmFjdG9yKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRQYXNvc19kaWFyaW9zKSthcy5mYWN0b3IoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJE5pdmVsX2RlX2VzdHLDqXMpK2FzLmZhY3RvcihjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kUHJlc2lvbl9zaXN0b2xhKSthcy5mYWN0b3IoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJENhbGlkYWRfZGVfc3Vlbm8pKSkNCmBgYA0KDQojIyMjIENvZWZpY2llbnRlcyBkZWwgTW9kZWxvIFJMTSBUb3RhbA0KRXN0b3Mgc29uIGxvcyBjb2VmaWNpZW50ZXMgZGUgdW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIG3Dumx0aXBsZSAoUkxNKS4gIExhIHNhbGlkYSBtdWVzdHJhIGVsIGludGVyY2VwdG8geSBsb3MgY29lZmljaWVudGVzIHBhcmEgZGlmZXJlbnRlcyB2YXJpYWJsZXMgcHJlZGljdG9yYXMuICBMYXMgdmFyaWFibGVzIGRlIG1vZGVsbyBzb24gZmFjdG9yZXMgKHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMpLiBMb3MgbsO6bWVyb3MgYSBsYSBkZXJlY2hhIGRlIGNhZGEgdmFyaWFibGUgc29uIHN1cyBjb2VmaWNpZW50ZXMgZXN0aW1hZG9zLCBleHByZXNhZG9zIGVuIG5vdGFjacOzbsKgY2llbnTDrWZpY2EuDQpgYGB7ciBDb2VmaWNpZW50ZXMgZGVsIE1vZGVsbyBSTE0gVG90YWwsZmlnLmFsaWduPSdjZW50ZXInfQ0KY29lZmZpY2llbnRzKGxtKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRJTUN+Y2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJER1cmFjaW9uX2RlX3N1ZW5vK2NkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRFZGFkK2NkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyROaXZlbF9kZV9hY3RpdmlkYWRfZmlzaWNhK2FzLmZhY3RvcihjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kUGFzb3NfZGlhcmlvcykrYXMuZmFjdG9yKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyROaXZlbF9kZV9lc3Ryw6lzKSthcy5mYWN0b3IoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJFByZXNpb25fc2lzdG9sYSkrYXMuZmFjdG9yKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRDYWxpZGFkX2RlX3N1ZW5vKSkpDQpgYGANCg0KIyMjIyBDb2VmaWNpZW50ZXMgZGVsIE1vZGVsbyBSTE0gUmVkdWNpZG8NCkVuIGVzdGUgYW5hbGlzaXMgc2UgdXRpbGl6YXJvbiBsYXMgdmFyaWFibGVzIHF1ZSB0aWVuZW4gdW5hIGNvb3JyZWxhY2lvbiBwb3NpdGl2YSBtYXMgYWx0YSBwYXJhIGZvcm11bGFyIGVsIG1vZGVsbyBkZSB1bmEgbWFuZXJhIHJlZHVjaWRhLg0KTG9zIGNvZWZpY2llbnRlcyBtdWVzdHJhbiBlbCBlZmVjdG8gZGUgY2FkYSB2YXJpYWJsZSBlbiBlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlLiANCmBgYHtyIENvZWZpY2llbnRlc19kZWxfTW9kZWxvX1JMTV9SZWR1Y2lkb30NCmNvZWZmaWNpZW50cyhsbShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kRHVyYWNpb25fZGVfc3Vlbm9+K2FzLmZhY3RvcihjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kUHJlc2lvbl9zaXN0b2xhKSthcy5mYWN0b3IoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJFBhc29zX2RpYXJpb3MpKSkNCmBgYA0KDQojIyMgQW7DoWxpc2lzIGRlbCBtb2RlbG8gUkxNLnsudGFic2V0IC50YWJzZXQtcGlsbHN9DQpFbCBhbsOhbGlzaXMgZGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBtw7psdGlwbGUgKFJMTSkgY29uc2lzdGUgZW4gZXhhbWluYXIgbGEgcmVsYWNpw7NuIGVudHJlIHVuYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSB5IHZhcmlhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMsIGV2YWx1YW5kbyBlbCBhanVzdGUgeSBsYSB2YWxpZGV6IGRlbCBtb2RlbG8gZXN0YWTDrXN0aWNvIGFqdXN0YWRvLiBFc3RlIGFuw6FsaXNpcyBpbXBsaWNhIHZlcmlmaWNhciBjw7NtbyBsYXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGNvbnRyaWJ1eWVuIGRlIG1hbmVyYSBpbmRpdmlkdWFsIHkgY29uanVudGEgYSBleHBsaWNhciBsYXMgdmFyaWFjaW9uZXMgZW4gbGEgdmFyaWFibGUgZGVwZW5kaWVudGUsIHV0aWxpemFuZG8gbcOpdHJpY2FzIHkgcHJ1ZWJhcyBlc3RhZMOtc3RpY2FzIHBhcmEgaW50ZXJwcmV0YXIgbGEgZWZlY3RpdmlkYWTCoGRlbMKgbW9kZWxvLg0KDQojIyMjIE1lam9yIE1vZGVsbyBJdGVyYWRvIHNlZ8O6biBBSUMNCkVsIEFJQyAoQ3JpdGVyaW8gZGUgSW5mb3JtYWNpw7NuIGRlIEFrYWlrZSkgZXMgdW5hIG1lZGlkYSBkZSBsYSBjYWxpZGFkIHJlbGF0aXZhIGRlIGxvcyBtb2RlbG9zIGVzdGFkw61zdGljb3MgcGFyYSB1biBjb25qdW50byBkYWRvIGRlIGRhdG9zLiAgVW4gQUlDIG1lbm9yIGluZGljYSB1biBtZWpvciBhanVzdGUuICBMYSB0YWJsYSBtdWVzdHJhIHRyZXMgaXRlcmFjaW9uZXMgZGUgdW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24sIGNvbiBlbCB0ZXJjZXIgbW9kZWxvIChBSUM9MjIxMDMuMTQpIG1vc3RyYW5kbyBlbCBBSUMgbcOhcyBiYWpvLCB5IHBvciBsbyB0YW50bywgZWwgbWVqb3IgYWp1c3RlIHNlZ8O6biBlc3RlIGNyaXRlcmlvLg0KDQpgYGB7ciBNZWpvcl9Nb2RlbG9fSXRlcmFkb19zZWfDum5fQUlDLCBmaWcuYWxpZ249J2NlbnRlcid9DQptb2RlbG9fSXRlcmFkb19TVEVQID0gc3RlcChsbShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kSU1DfmNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyREdXJhY2lvbl9kZV9zdWVubytjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kRWRhZCtjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kTml2ZWxfZGVfYWN0aXZpZGFkX2Zpc2ljYSthcy5mYWN0b3IoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJFBhc29zX2RpYXJpb3MpK2FzLmZhY3RvcihjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kTml2ZWxfZGVfZXN0csOpcykrYXMuZmFjdG9yKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRQcmVzaW9uX3Npc3RvbGEpK2FzLmZhY3RvcihjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kQ2FsaWRhZF9kZV9zdWVubykpKQ0KY29lZmZpY2llbnRzKG1vZGVsb19JdGVyYWRvX1NURVApDQoNCmBgYA0KDQoNCg0KIyMjIyBCb25kYWRlcyBkZSBBanVzdGUsIFNpZ25pZmljYW5jaWFzIHkgQ3JpdGVyaW9zIGRlIEluZm9ybWFjacOzbiBDb21wYXJhZG9zLg0KTGEgdGFibGEgbXVlc3RyYSBsYXMgYm9uZGFkZXMgZGUgYWp1c3RlLCBzaWduaWZpY2FuY2lhcyB5IGNyaXRlcmlvcyBkZSBpbmZvcm1hY2nDs24gY29tcGFyYWRvcyBwYXJhIGRpZmVyZW50ZXMgbW9kZWxvcyBkZSByZWdyZXNpw7NuLiBFc3RhIGV2YWzDumEgY8OzbW8gY2FkYSB2YXJpYWJsZSBhZmVjdGEgYSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSB5IHF1w6kgdGFuIHNpZ25pZmljYXRpdm9zIHNvbiBlc29zIGVmZWN0b3MgZW7CoHZhcmlvc8KgbW9kZWxvcy4NCmBgYHtyIEJvbmRhZGVzX2RlX0FqdXN0ZSxfU2lnbmlmaWNhbmNpYXNfeV9Dcml0ZXJpb3NfZGVfSW5mb3JtYWNpw7NuIENvbXBhcmFkb3N9DQojIG1vZGVsb19STE1fVE9UQUwgPSAobG0oY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJElNQ35jZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kRHVyYWNpb25fZGVfc3Vlbm8rY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJEVkYWQrY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJE5pdmVsX2RlX2FjdGl2aWRhZF9maXNpY2ErYXMuZmFjdG9yKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRQYXNvc19kaWFyaW9zKSthcy5mYWN0b3IoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJE5pdmVsX2RlX2VzdHLDqXMpK2FzLmZhY3RvcihjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kUHJlc2lvbl9zaXN0b2xhKSthcy5mYWN0b3IoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJENhbGlkYWRfZGVfc3Vlbm8pKSkNCg0KIyBtb2RlbG9fUkxNX1JFRFVDSURPID0gbG0oY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJGFnZX5jZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8ka20rY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJHByaWNlK2FzLmZhY3RvcihjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kZ2VuZGVyKSthcy5mYWN0b3IoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJGNvbmRpdGlvbikpDQoNCiMgc3RhcmdhemVyKG1vZGVsb19STE1fVE9UQUwsIG1vZGVsb19STE1fUkVEVUNJRE8sIG1vZGVsb19JdGVyYWRvX1NURVAsIHR5cGUgPSAidGV4dCIsIGRmID0gVFJVRSkNCg0KIyBBSUMobW9kZWxvX1JMTV9UT1RBTCwgbW9kZWxvX1JMTV9SRURVQ0lETywgbW9kZWxvX0l0ZXJhZG9fU1RFUCkNCg0KIyBCSUMobW9kZWxvX1JMTV9UT1RBTCwgbW9kZWxvX1JMTV9SRURVQ0lETywgbW9kZWxvX0l0ZXJhZG9fU1RFUCkNCmBgYA0KDQpFc3RlIGNodW5rIGZ1ZSBvbWl0aWRvIHlhIHF1ZSBubyBzZSBwdWRvIGxsZWdhciBhIHN1IGNvcnJlY3RhIHJlc29sdWNpb24geSBhcGxpY2FjacOzbiAuDQoNCiMjIyAqKjUuNC4gUmVncmVzacOzbiBMb2fDrXN0aWNhIFNpbXBsZSoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQpFbCBtb2RlbG8gZGUgcmVncmVzacOzbiBsb2fDrXN0aWNhIHNpbXBsZSB1dGlsaXphIGxhIGZ1bmNpw7NuIGxvZ8Otc3RpY2EsIHRhbWJpw6luIGNvbm9jaWRhIGNvbW8gZnVuY2nDs24gc2lnbW9pZGUsIHBhcmEgdHJhbnNmb3JtYXIgbGEgcmVsYWNpw7NuIGxpbmVhbCBlbnRyZSBsYXMgdmFyaWFibGVzIGVuIHVuYSBjdXJ2YSBxdWUgcHVlZGUgdG9tYXIgdmFsb3JlcyBlbnRyZSAwIHkgMS4gRXN0YSB0cmFuc2Zvcm1hY2nDs24gcGVybWl0ZSBpbnRlcnByZXRhciBsb3MgcmVzdWx0YWRvcyBlbiB0w6lybWlub3MgZGUgcHJvYmFiaWxpZGFkZXMuIFBvciBlamVtcGxvLCBlbiB1biBlc3R1ZGlvIHNvYnJlIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgdW4gcGFjaWVudGUgdGVuZ2EgdW5hIGVuZmVybWVkYWQgZW4gZnVuY2nDs24gZGUgc3UgZWRhZCwgbGEgcmVncmVzacOzbiBsb2fDrXN0aWNhIHNpbXBsZSBwdWVkZSBheXVkYXIgYSBkZXRlcm1pbmFyIGPDs21vIGNhbWJpYSBlc3RhIHByb2JhYmlsaWRhZCBjb24gbGEgZWRhZCBkZWwgcGFjaWVudGUuDQoNCkFkZW3DoXMsIGxhIHJlZ3Jlc2nDs24gbG9nw61zdGljYSBzaW1wbGUgcHJvcG9yY2lvbmEgY29lZmljaWVudGVzIHF1ZSBpbmRpY2FuIGxhIGRpcmVjY2nDs24geSBsYSBtYWduaXR1ZCBkZSBsYSByZWxhY2nDs24gZW50cmUgbGEgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSB5IGxhIHByb2JhYmlsaWRhZCBkZWwgZXZlbnRvLiBFc3RvcyBjb2VmaWNpZW50ZXMgc2UgaW50ZXJwcmV0YW4gZW4gdMOpcm1pbm9zIGRlIG9kZHMgcmF0aW9zLCBxdWUgcmVwcmVzZW50YW4gZWwgY2FtYmlvIGVuIGxhcyBwcm9iYWJpbGlkYWRlcyBkZSBvY3VycmVuY2lhIGRlbCBldmVudG8gcG9yIGNhZGEgdW5pZGFkIGRlIGNhbWJpbyBlbiBsYSB2YXJpYWJsZSBpbmRlcGVuZGllbnRlLiBFc3RhIHTDqWNuaWNhIGVzIGFtcGxpYW1lbnRlIHV0aWxpemFkYSBlbiBjYW1wb3MgY29tbyBsYSBtZWRpY2luYSwgbGFzIGNpZW5jaWFzIHNvY2lhbGVzIHkgbGEgZWNvbm9tw61hIHBhcmEgdG9tYXIgZGVjaXNpb25lcyBpbmZvcm1hZGFzIGJhc2FkYXPCoGVuwqBkYXRvcy4NCg0KDQojIyMjIFJlc3VtZW4geSBCb3hwbG90IGRlIEVkYWQNCmVsIGJveHBsb3QgaW5kaWNhIHF1ZSBsYSBlZGFkIHNlIGRpc3RyaWJ1eWUgZGUgbWFuZXJhIHJlbGF0aXZhbWVudGUgc2ltw6l0cmljYSwgY29uIHVuYSBtZWRpYW5hIGRlIDQzIGHDsW9zLCB5IGxhIG1heW9yw61hIGRlIGxhcyBlZGFkZXMgc2UgZW5jdWVudHJhbiBlbnRyZSBsb3MgMzXCoHnCoGxvc8KgNDfCoGHDsW9zLg0KYGBge3IgZXN1bWVuIHkgQm94cGxvdCBkZSBhZ2UsZmlnLmFsaWduPSdjZW50ZXInfQ0Kc3VtbWFyeShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kRWRhZCkNCmJveHBsb3QoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJEVkYWQsIG1haW4gPSAiRGlhZ3JhbWEgZGUgQ2FqYSBkZSBFZGFkIiwgY29sID0gYygib3JhbmdlIikpDQoNCmBgYA0KDQojIyMjIEhpc3RvZ3JhbWEgZGUgRWRhZC4NCkVsIGhpc3RvZ3JhbWEgbXVlc3RyYSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhIGVkYWQgRWRhZCBlbiB1biBjb25qdW50byBkZSBkYXRvcy4gIEVsIGVqZSBob3Jpem9udGFsIHJlcHJlc2VudGEgbGFzIGVkYWRlcywgYWdydXBhZGFzIGVuIGludGVydmFsb3MgKGJpbnMpLCB5IGVsIGVqZSB2ZXJ0aWNhbCByZXByZXNlbnRhIGxhIGZyZWN1ZW5jaWEsIG8gbsO6bWVybyBkZSBvYnNlcnZhY2lvbmVzLCBxdWUgY2FlbiBkZW50cm8gZGUgY2FkYSBpbnRlcnZhbG8gZGUgZWRhZC4NCg0KT2JzZXJ2YW1vcyBxdWUgbGEgZGlzdHJpYnVjacOzbiBkZSBsYXMgZWRhZGVzIGVzIGFwcm94aW1hZGFtZW50ZSBhc2ltZXRyaWNhICwgY29uIHVuYSBjb25jZW50cmFjacOzbiBkZSBkYXRvcyBlbnRyZSBsb3MgMzUgeSBsb3MgNDcgYcOxb3MuICBIYXkgdW4gcGljbyBhbHJlZGVkb3IgZGUgbG9zIDQ1IGHDsW9zLCBpbmRpY2FuZG8gcXVlIGVzZSByYW5nbyBkZSBlZGFkIGVzIGVsIG3DoXMgZnJlY3VlbnRlIGVuIGVzdGUgY29uanVudG8gZGUgZGF0b3MuIExhIGRpc3RyaWJ1Y2nDs24gZGlzbWludXllIGdyYWR1YWxtZW50ZSBlbiBhbWJvcyBleHRyZW1vcywgaW5kaWNhbmRvIHF1ZSBoYXkgbWVub3MgcGVyc29uYXMgY29uIGVkYWRlcyBtZW5vcmVzIGRlIDMwIGHDsW9zIG8gbWF5b3JlcyBkZSA0NyBhw7Fvcy4NCg0KDQpgYGB7ciBIaXN0b2dyYW1hIGRlIEVkYWQsZmlnLmFsaWduPSdjZW50ZXInfQ0Kc3VtbWFyeShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kRWRhZCkNCmhpc3QoY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJEVkYWQsIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBFZGFkIiwgY29sID0gYygiZ29sZCIpKQ0KDQpgYGANCg0KIyMjIyBSZXN1bWVuIHkgRGlhZ3JhbWEgZGUgQmFycmFzIGRlIElNQw0KTGEgZ3LDoWZpY2EgZGUgYmFycmFzIG11ZXN0cmEgbGEgZGlzdHJpYnVjacOzbiBkZWwgZ8OpbmVybyBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4gIEVsIGVqZSB4IHJlcHJlc2VudGEgZWwgSU1DLiBFbCBlamUgeSByZXByZXNlbnRhIGxhIGZyZWN1ZW5jaWEgbyBjb250ZW8gZGUgbG9zIHBhY2llbnRlcyBlbiBlc2UgSU1DICgxID0gbm9ybWFsICwgMiA9IG9iZXNpZGFkICwgMyA9IHNvYnJlcGVzbykgLg0KDQpTZSBvYnNlcnZhIHF1ZSBlbCBJTUMgbWFzIGZyZWN1ZW50ZSBlcyBlbCAxICwgc2VndWlkbyBkZWwgMyB5IHBvciB1bHJpbW8gY29uIHVuYSBncmFuIGRpZmVyZW5jaWEgcmVzcGVjdG8gYSBsb3MgYW50ZXJpb3JlcyBub21icmFkb3MgZWwgbnVtZXJvIDIuDQoNCmBgYHtyIFJlc3VtZW4geSBEaWFncmFtYSBkZSBCYXJyYXMgZGUgSU1DLGZpZy5hbGlnbj0nY2VudGVyJ30NCnRhYmxlKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRJTUMpDQpwcm9wLnRhYmxlKHRhYmxlKGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRJTUMpKQ0KYmFycGxvdCh0YWJsZShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kSU1DKSkNCmBgYA0KDQojIyMjIFJlc3VtZW4geSBEaWFncmFtYSBkZSBDYWphcyBDb25qdW50bw0KRWwgZ3LDoWZpY28gZGUgY2FqYSBtdWVzdHJhIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGEgZWRhZCBzZWfDum4gZWwgSU1DIC4NCg0KTGEgY2FqYSBtw6FzIGdyYW5kZSAobmFyYW5qYSkgcmVwcmVzZW50YSB1bmEgZGlzdHJpYnVjacOzbiBkZSBlZGFkZXMgc2lnbmlmaWNhdGl2YW1lbnRlIG1heW9yIGNvbiB1bmEgbWVkaWFuYSBhbHJlZGVkb3IgZGUgMzUgYSA0NyBhw7Fvcy4gTGEgY2FqYSBtdWVzdHJhIHVuYSBkaXNwZXJzacOzbiBjb25zaWRlcmFibGUsIGNvbiB2YWxvcmVzIGF0w61waWNvcyAocHVudG9zIHBvciBlbmNpbWEgeSBwb3IgZGViYWpvIGRlIGxhIGNhamEpLiAgTGEgbMOtbmVhIGhvcml6b250YWwgZGVudHJvIGRlIGxhIGNhamEgZXMgbGEgbWVkaWFuYS4gTGFzIGzDrW5lYXMgdmVydGljYWxlcyBxdWUgc2UgZXh0aWVuZGVuIGRlc2RlIGxhIGNhamEgcmVwcmVzZW50YW4gZWwgcmFuZ28gaW50ZXJjdWFydGlsIChJUVIpLCBxdWUgYWJhcmNhIGRlc2RlIGVsIHByaW1lciBjdWFydGlsICgyNSUpIGhhc3RhIGVsIHRlcmNlciBjdWFydGlsICg3NSUpLg0KYGBge3IgUmVzdW1lbl95X0RpYWdyYW1hX2RlX0NhamFzX0Nvbmp1bnRvLGZpZy5hbGlnbj0nY2VudGVyJ30NCnRhcHBseShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kRWRhZCwgY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJElNQywgbWVhbikNCnRhcHBseShjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kRWRhZCwgY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJElNQywgbWVkaWFuKQ0KYm94cGxvdChjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8kRWRhZCwgY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJElNQywgbWFpbiA9ICJCb3hwbG90IENvbmp1bnRvOiBFZGFkIC0gSU1DIiwgY29sID0gYygib3JhbmdlIiwgImdvbGQiKSkNCg0KYGBgDQoNCg0KDQoNCg0KIyMjIEZvcm11bGFjacOzbiBkZWwgbW9kZWxvIGRlIFJMb2dTIGVudHJlIGxhcyB2YXJpYWJsZXMgZGUgZXN0dWRpby4gey50YWJzZXQgLnRhYnNldC1waWxsc30NCkxhIGZvcm11bGFjacOzbiBkZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbG9nw61zdGljYSBzaW1wbGUgKFJMb2dTKSBkZXNjcmliZSBsYSByZWxhY2nDs24gZW50cmUgdW5hIHZhcmlhYmxlIGRlcGVuZGllbnRlIHkgdW5hIHZhcmlhYmxlIGluZGVwZW5kaWVudGUuIEVuIGVzdGUgbW9kZWxvLCBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlIHRvbWUgZWwgdmFsb3IgMSBzZSBleHByZXNhIGNvbW8gdW5hIGZ1bmNpw7NuIGRlIGxhIHZhcmlhYmxlwqBpbmRlcGVuZGllbnRlLg0KDQojIyMjIENvZWZpY2llbnRlcyBkZWwgTW9kZWxvIFJMb2dTDQpFc3RhIHRhYmxhIG11ZXN0cmEgbG9zIGNvZWZpY2llbnRlcyBkZSB1biBtb2RlbG8gZGUgcmVncmVzacOzbiwgZXNwZWPDrWZpY2FtZW50ZSBlbCBpbnRlcmNlcHRvIHkgZWwgY29lZmljaWVudGUgcGFyYSBsYSB2YXJpYWJsZSAqKklNQyoqLiAgTG9zIHZhbG9yZXMgbnVtw6lyaWNvcyBzb24gbG9zIGVzdGltYWRvcmVzIGRlIGVzdG9zIGNvZWZpY2llbnRlcy4gRXN0b3MgY29lZmljaWVudGVzIGF5dWRhbiBhIGhhY2VyIHByZWRpY2Npb25lcyB5IGVudGVuZGVyIG1lam9yIGPDs21vIGluZmx1eWVuIGxhcyB2YXJpYWJsZXMgZW4gZWwgcmVzdWx0YWRvwqBkZWzCoG1vZGVsby4NCg0KYGBge3IgQ29lZmljaWVudGVzX2RlbF9Nb2RlbG9fUkxvZ1MsZmlnLmFsaWduPSdjZW50ZXInfQ0KbW9kZWxvX1JMb2dfU2ltcGxlIDwtIGxtKEVkYWQgfiBJTUMsIGRhdGEgPSBjZGRfc2FsdWRfeV9lc3RpbG9zX2RlX3ZpZGFfZGVwdXJhZG8pDQpjb2VmKG1vZGVsb19STG9nX1NpbXBsZSkNCg0KYGBgDQoNCiMjIyMgUmVzdW1lbiBFc3RhZMOtc3RpY28gZGVsIE1vZGVsbyBSTG9nUw0KRWwgcmVzdW1lbiBlc3RhZMOtc3RpY28gZGVsIG1vZGVsbyBSTG9nUyBwcm9wb3JjaW9uYSB1bmEgYmFzZSBwYXJhIGVudGVuZGVyIHkgbWVqb3JhciBlbCBhbsOhbGlzaXPCoGVuwqBlbMKgZnV0dXJvLg0KYGBge3IgUmVzdW1lbl9Fc3RhZGlzdGljb19kZWxfTW9kZWxvX1JMb2dTLCBmaWcuYWxpZ249J2NlbnRlcid9DQpzdW1tYXJ5KG1vZGVsb19STG9nX1NpbXBsZSkNCmBgYA0KDQojIyMgQW7DoWxpc2lzIGRlbCBtb2RlbG8gUkxvZ1MuIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQpFbCBhbsOhbGlzaXMgZGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxvZ8Otc3RpY2Egc2ltcGxlIChSTG9nUykgZW4gdW4gY29uanVudG8gZGUgZGF0b3MgZXhhbWluYSBjw7NtbyB1bmEgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSBhZmVjdGEgbGEgcHJvYmFiaWxpZGFkIGRlIG9jdXJyZW5jaWEgZGUgdW4gZXZlbnRvIHJlcHJlc2VudGFkbyBwb3IgdW5hIHZhcmlhYmxlIGRlcGVuZGllbnRlIGdlbmRlciAocXVlIHRvbWEgdmFsb3JlcyAwIG8gMSkuIEVzdGUgYW7DoWxpc2lzIHNlIGNlbnRyYSBlbiBlbnRlbmRlciBlIGludGVycHJldGFyIGxhIHJlbGFjacOzbiBlc3RhZMOtc3RpY2EgZW50cmUgbGFzIHZhcmlhYmxlcyB5IGVuIGV2YWx1YXIgZWwgZGVzZW1wZcOxbyBkZWwgbW9kZWxvIHBhcmEgcHJlZGVjaXIgY29ycmVjdGFtZW50ZSBsYXMgY2F0ZWdvcsOtYXMgZGUgbGEgdmFyaWFibGUgZGVwZW5kaWVudGUuIEVsIGFuw6FsaXNpcyBkZWwgbW9kZWxvIFJMb2dTIHBlcm1pdGUgbm8gc29sbyBpZGVudGlmaWNhciBzaSBleGlzdGUgdW5hIHJlbGFjacOzbiBzaWduaWZpY2F0aXZhIGVudHJlIGxhcyB2YXJpYWJsZXMsIHNpbm8gdGFtYmnDqW4gZXZhbHVhciBxdcOpIHRhbiBiaWVuIGVsIG1vZGVsbyBkZXNjcmliZSB5IHByZWRpY2UgbG9zIHJlc3VsdGFkb3MgZW4gZWwgY29uanVudG/CoGRlwqBkYXRvcy4NCg0KIyMjIyBWYXJpYWJsZSBQcmVkaWN0b3JhIGlndWFsIGEgQ2Vybw0KDQpgYGB7ciBWYXJpYWJsZV9QcmVkaWN0b3JhX2lndWFsX2FfQ2VybywgZmlnLmFsaWduPSdjZW50ZXInfQ0KY29lZihtb2RlbG9fUkxvZ19TaW1wbGUpDQpyb3VuZChleHAoY29lZihtb2RlbG9fUkxvZ19TaW1wbGUpKSw2KQ0KDQpgYGANCg0KIyMjIyBQcm9iYWJpbGlkYWRlcyBFc3RpbWFkYXMNCkxhcyBwcm9iYWJpbGlkYWRlcyBlc3RpbWFkYXMgZW4gdW4gY29uanVudG8gZGUgZGF0b3MsIG9idGVuaWRhcyBhIHRyYXbDqXMgZGUgbW9kZWxvcyBjb21vIGxhIHJlZ3Jlc2nDs24gbG9nw61zdGljYSwgc2lydmVuIHBhcmEgY3VhbnRpZmljYXIgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBvY3VycmEgdW4gZGV0ZXJtaW5hZG8gZXZlbnRvIChwb3IgZWplbXBsbywgw6l4aXRvL2ZhbGxvLCBhY2VwdGFjacOzbi9yZWNoYXpvLCBvIGNvbXByYS9ubyBjb21wcmEpIGVuIGZ1bmNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMuIEVzdGFzIHByb2JhYmlsaWRhZGVzIHBlcm1pdGVuIHRvbWFyIGRlY2lzaW9uZXMgYmFzYWRhcyBlbiBsb3MgcmVzdWx0YWRvcyBwcmV2aXN0b3MsIHlhIHF1ZSBvZnJlY2VuIHVuYSByZXByZXNlbnRhY2nDs24gY29udGludWEgZGUgbGEgcHJvYmFiaWxpZGFkIGRlbCBldmVudG8gZW4gbHVnYXIgZGUgdW5hIGNsYXNpZmljYWNpw7NuwqBiaW5hcmlhwqBmaWphLg0KYGBge3IgUHJvYmFiaWxpZGFkZXNfRXN0aW1hZGFzLGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KaW1jX3ZhbHVlcyA8LSBkYXRhLmZyYW1lKElNQyA9IHNlcSgxLCA0MDApKQ0KDQoNCnByZWRpY2Npb25lcyA8LSBwcmVkaWN0KG1vZGVsb19STG9nX1NpbXBsZSwgbmV3ZGF0YSA9IGltY192YWx1ZXMsIHR5cGUgPSAicmVzcG9uc2UiKQ0KDQoNCnByZWRpY2Npb25lcw0KDQpgYGANCg0KIyMjIyBHcsOhZmljYSBkZWwgTW9kZWxvIFJMb2dTDQpMYSBncsOhZmljYSBtdWVzdHJhIGxhIHJlbGFjacOzbiBlbnRyZSBsYSBlZGFkIHkgZWwgZ8OpbmVybyBzZWfDum4gdW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbG9nw61zdGljYSAoUkxvZ1MpLiBMYSBsw61uZWEgaG9yaXpvbnRhbCBhbHJlZGVkb3IgZGUgMC41IGluZGljYSBxdWUsIHNlZ8O6biBlc3RlIG1vZGVsbywgbGEgcHJvYmFiaWxpZGFkIGRlIHBlcnRlbmVjZXIgYSBjYWRhIGfDqW5lcm8gZXMgYXByb3hpbWFkYW1lbnRlIGxhIG1pc21hIHBhcmEgdG9kYXPCoGxhc8KgZWRhZGVzLg0KDQpgYGB7ciBHcsOhZmljYV9kZWxfTW9kZWxvX1JMb2dTfQ0KR2VuZXJvIDwtIGNkZF9zYWx1ZF95X2VzdGlsb3NfZGVfdmlkYV9kZXB1cmFkbyRHZW5lcm8NCkVkYWQgPC0gY2RkX3NhbHVkX3lfZXN0aWxvc19kZV92aWRhX2RlcHVyYWRvJEVkYWQNCmRhdGFQbG90IDwtIGRhdGEuZnJhbWUoRWRhZCwgR2VuZXJvKQ0KcGxvdChHZW5lcm9+RWRhZCwgZGF0YSA9IGRhdGFQbG90LCBtYWluID0gIk1vZGVsbyBSTG9nUzogRWRhZCAtIElNQyIsIHhsYWIgPSAiYWdlIiwgeWxhYiA9ICJHZW5lcm8gPSAwIHwgR2VuZXJvID0gMSIsIGNvbCA9ICJnb2xkIiwgcGNoID0gIkkiKQ0KY3VydmUocHJlZGljdChnbG0oR2VuZXJvfkVkYWQsIGZhbWlseSA9ICJiaW5vbWlhbCIsIGRhdGEgPSBkYXRhUGxvdCksIGRhdGEuZnJhbWUoRWRhZCA9IHgpLCB0eXBlID0gInJlc3BvbnNlIiksIGNvbCA9ICJvcmFuZ2UiLCBsd2QgPSAzLCBhZGQgPSBUUlVFKQ0KDQpgYGANCg0KDQojIyAqKjYuIENvbmNsdXNpb25lcyoqDQoNCkR1cmFjaW9uIHkgY2FsaWRhZCBkZSBzdWXDsW8gOg0KDQpTZSBjb25jbHV5ZSBxdWUgZW4gcHJvbWVkaW8gbG9zIHBhY2llbnRlcyB0aWVuZW4gdW5hIGNhbGlkYWQgeSBkdXJhY2lvbiBkZSBzdWXDsW8gcmVsYXRpdmFtZW50ZSBhY2VwdGFibGUuDQoNCkVzdHLDqXMgeSBzdWXDsW86DQoNCkVsIG5pdmVsIGRlIGVzdHLDqXMgdGllbmUgdW4gaW1wYWN0byBzaWduaWZpY2F0aXZvIGVuIGxhIGNhbGlkYWQgZGVsIHN1ZcOxby4gUGFydGljaXBhbnRlcyBjb24gbml2ZWxlcyBlbGV2YWRvcyBkZSBlc3Ryw6lzIHJlcG9ydGFuIHVuYSBjYWxpZGFkIGRlIHN1ZcOxbyBjb25zaWRlcmFibGVtZW50ZSBtw6FzIGJhamEsIGRlc3RhY2FuZG8gbGEgbmVjZXNpZGFkIGRlIGVzdHJhdGVnaWFzIGRlIG1hbmVqbyBkZWwgZXN0csOpcyBwYXJhIG1lam9yYXIgZWwgZGVzY2Fuc28gbm9jdHVybm8uDQoNCkFjdGl2aWRhZCBmw61zaWNhIHkgcGFzb3MgZGlhcmlvczoNCg0KTG9zIHBhcnRpY2lwYW50ZXMgcmVhbGl6YW4gZW4gcHJvbWVkaW8gNTkgbWludXRvcyBzZW1hbmFsZXMgZGUgYWN0aXZpZGFkIGbDrXNpY2EsIGxvIGN1YWwgZXN0w6EgcG9yIGRlYmFqbyBkZSBsYXMgcmVjb21lbmRhY2lvbmVzIGRlIGxhIE9NUy4NCkV4aXN0ZSB1bmEgcmVsYWNpw7NuIHBvc2l0aXZhIGVudHJlIGxhIGFjdGl2aWRhZCBmw61zaWNhIHkgbG9zIHBhc29zIGRpYXJpb3MsIGluZGljYW5kbyBxdWUgcXVpZW5lcyByZWFsaXphbiBtw6FzIGVqZXJjaWNpbyB0aWVuZGVuIGEgdGVuZXIgdW4gZXN0aWxvIGRlIHZpZGEgbcOhcyBhY3Rpdm8gZW4gZ2VuZXJhbC4NCg0KU2FsdWQgbWV0YWLDs2xpY2E6DQoNCk3DoXMgZGVsIDQwJSBkZSBsb3MgcGFydGljaXBhbnRlcyB0aWVuZW4gdW4gSU1DIHF1ZSBjbGFzaWZpY2EgY29tbyBzb2JyZXBlc28gdSBvYmVzaWRhZCwgbG8gcXVlIHJlcHJlc2VudGEgdW4gw6FyZWEgZGUgbWVqb3JhIGNydWNpYWwgcGFyYSBsYSBzYWx1ZCBnZW5lcmFsLg0KTG9zIHZhbG9yZXMgZGUgcHJlc2nDs24gYXJ0ZXJpYWwgZWxldmFkb3MsIHByZXNlbnRlcyBlbiB1bmEgcHJvcG9yY2nDs24gc2lnbmlmaWNhdGl2YSBkZSBsb3MgcGFydGljaXBhbnRlcywgc3VnaWVyZW4gcmllc2dvcyBjYXJkaW92YXNjdWxhcmVzIHBvdGVuY2lhbGVzIHF1ZSByZXF1aWVyZW4gYXRlbmNpw7NuIHByZXZlbnRpdmEuDQoNClRyYXN0b3Jub3MgZGVsIHN1ZcOxbzoNCg0KQ2FzaSBlbCA0MCUgZGUgbG9zIHBhcnRpY2lwYW50ZXMgcmVwb3J0YW4gYWxnw7puIHRpcG8gZGUgdHJhc3Rvcm5vIGRlbCBzdWXDsW8sIGNvbiBsYSBhcG5lYSBkZWwgc3Vlw7FvIHNpZW5kbyBsYSBtw6FzIGNvbcO6biBkZXNwdcOpcyBkZSAibmluZ3VubyIuIEVzdGUgaGFsbGF6Z28gcmVmdWVyemEgbGEgbmVjZXNpZGFkIGRlIHByb21vdmVyIGV2YWx1YWNpb25lcyBjbMOtbmljYXMgcmVndWxhcmVzIHBhcmEgaWRlbnRpZmljYXIgeSB0cmF0YXIgZXN0YXMgY29uZGljaW9uZXMuDQoNCg0KIyMgKio3LiBCaWJsaW9ncmFmw61hKioNCkFsZMOhcywgSi4sICYgVXJpZWwsIEUuICgyMDE3KS4gaHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2ZpbGUvZC8xSGo5cE5PUzdtY3daVk51Nk80cmlkZjZlby1oZTA4WjMvdmlldz91c3A9c2hhcmluZyAoMm5kIGVkLikuIEFMRkFDRU5UQVVSTy4NCg0KaHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2ZpbGUvZC8xWGNBR3AxeHJDZ1dCLVp2UW9KTFBOV3puSWNPQ1NIZ2svdmlldz91c3A9c2hhcmluZw0KIA0KRXN0dWRpbyBkZSBBbsOhbGlzaXMgTXVsdGl2YXJpYWRvIGNvbiBiYXNlIGVuIHVuIGNvbmp1bnRvIGRlIGRhdG9zIGRlIGFzcGlyYW50ZXMgZXh0cmFuamVyb3MgcGFyYSBzZXIgYWRtaXRpZG9zIGVuIGVzdHVkaW9zIHN1cGVyaW9yZXMgZW4gRUUuVVUuIA0KaHR0cHM6Ly9nbGlicmVyb3NsLmdpdGh1Yi5pby9BcHBsaWVkLVN0YXRpc3RpY3MtRlVMTC8jW0Nvbmdsb21lcmFkb3NdDQoNCkVzdHVkaW8gZGUgQW7DoWxpc2lzIGRlIFJlZ3Jlc2nDs24gY29uIGJhc2UgZW4gdW4gY29uanVudG8gZGUgZGF0b3MgZGUgYXNwaXJhbnRlcyBleHRyYW5qZXJvcyBwYXJhIHNlciBhZG1pdGlkb3MgZW4gZXN0dWRpb3Mgc3VwZXJpb3JlcyBlbiBFRS5VVS4NCmh0dHBzOi8vcnB1YnMuY29tL2dsaWJyZXJvc2wvQXBwbGllZC1TdGF0aXN0aWNzLUZVTEwgDQoNCkZ1ZW50ZSBkZWwgY29uanVudG8gZGUgZGF0b3M6IGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvdW9tMTkwMzQ2YS9zbGVlcC1oZWFsdGgtYW5kLWxpZmVzdHlsZS1kYXRhc2V0IA0KDQoNCg0KDQo=