Cargando datos

carlos_raw <- read_csv(here("SEM lavaan/data_sem", 
                            "carlos_2.csv"))

Simulamos los datos

Definimos las variables que vamos a utilizar

segVars <- c("age", "gender", "tiempo_sancion", "drogas", "conducta_agresiva")

Definitmos el tipo de dato de cada variable

segVarType <- c("norm", "binom", "norm", "pois", "norm")

Le ponemos los nombres a los segmentos. En este caso va a ser el tiempo de las diferentes muestras

segNames <- c("aplicacion_1", "aplicacion_2", "aplicacion_3", "aplicacion_4", "aplicacion_5")

Definimos los tamaños de cada segmento

segSize <- c(300, 300, 300, 300, 300)

Definimos el promedio de cada variable para pada segmento

segMeans <- matrix( c(
  18, .5, 100, 1, 4,
  18, .5, 100, 1, 4,
  18, .5, 100, 1, 4,
  18, .5, 100, 1, 4,
  18, .5, 100, 1, 4, ), ncol=length(segVars), byrow=TRUE)
Error in c(18, 0.5, 100, 1, 4, 18, 0.5, 100, 1, 4, 18, 0.5, 100, 1, 4,  : 
  argument 26 is empty

Definimos las desviaciones estándar para cada segmento

segSDs <- matrix( c(
  5, NA, 10, NA, 0.02,
  5, NA, 10, NA, 0.02,
  5, NA, 10, NA, 0.02,
  5, NA, 10, NA, 0.02,
  5, NA, 10, NA, 0.02), ncol=length(segVars), byrow=TRUE)

De acuerdo a los parámetros anteriores, creamos el dataset

seg.df <- NULL
set.seed(02554)

for (i in seq_along(segNames)) {    
  cat(i, segNames[i], "\n")

  # create an empty matrix to hold this particular segment's data
  this.seg <- data.frame(matrix(NA, nrow=segSize[i], ncol=length(segVars)))

  # within a segment, iterate over the variables and draw appropriate random data
  for (j in seq_along(segVars)) {    # and iterate over each variable
    if (segVarType[j] == "norm") {   # draw random normals
      this.seg[, j] <- rnorm(segSize[i], mean=segMeans[i, j], sd=segSDs[i, j])
    } else if (segVarType[j] == "pois") {    # draw counts
      this.seg[, j] <- rpois(segSize[i], lambda=segMeans[i, j])
    } else if (segVarType[j] == "binom") {   # draw binomials
      this.seg[, j] <- rbinom(segSize[i], size=1, prob=segMeans[i, j])
    } else {
      stop("Bad segment data type: ", segVarType[j])
    }
  }
  # add this segment to the total dataset
  seg.df <- rbind(seg.df, this.seg)     
}
1 aplicacion_1 
2 aplicacion_2 
3 aplicacion_3 
4 aplicacion_4 
5 aplicacion_5 

Le asignamos nombres al dataset

names(seg.df) <- segVars

Asignamos los diferentes segmentos

seg.df$Segment   <- factor(rep(segNames, times=segSize))

Organizamos un poco los datos

seg.df <- 
  seg.df %>% 
  mutate(age = round(age, digits = 0),
         gender = factor(gender, labels = c("f", "m")),
         tiempo_sancion = round(tiempo_sancion, digits = 0),
         conducta_agresiva = round(conducta_agresiva, 2))

Adaptar los datos al ejercicio. Solo para intervención amigoniana.

carlos_para <- seg.df

carlos_para <- 
  carlos_para %>% 
  rename(aplic_encuesta = "Segment")

De acuerdo a los datos del promedio de la conducta violenta, la intervención amigoniana está teniendo una influencia positiva en la reducción de la conducta violenta.

Pruebas paramétricas

Parece que la intervención está sirviendo!!! Pero hay que demostrarlo estadísitcamente (inferencial).

El tamaño de los segementos afecta el resultado?

Para determinar si el tamaño puede afectar las comparaciones entre segmentos utilizamos la prueba chi-cuadrado.

chisq.test(table(seg.df$Segment))

    Chi-squared test for given probabilities

data:  table(seg.df$Segment)
X-squared = 0, df = 4, p-value = 1

Normalidad en los datos

Primero verificamos si hay normalidad en los datos con la prueba de Kolmogorov-Smirnov.

Aplicación 1

aplicacion_1 <- 
  carlos_para %>% 
  filter(aplic_encuesta == "aplicacion_1") %>% 
          select(conducta_agresiva)
          

ks.test(aplicacion_1$conducta_agresiva,
        "pnorm", 
        mean(aplicacion_1$conducta_agresiva), 
        sd(aplicacion_1$conducta_agresiva))
ties should not be present for the Kolmogorov-Smirnov test

    One-sample Kolmogorov-Smirnov test

data:  aplicacion_1$conducta_agresiva
D = 0.1206, p-value = 0.0003245
alternative hypothesis: two-sided

Aplicación 2

ks.test(aplicacion_2$conducta_agresiva,
        "pnorm", 
        mean(aplicacion_2$conducta_agresiva), 
        sd(aplicacion_2$conducta_agresiva))
ties should not be present for the Kolmogorov-Smirnov test

    One-sample Kolmogorov-Smirnov test

data:  aplicacion_2$conducta_agresiva
D = 0.13184, p-value = 5.915e-05
alternative hypothesis: two-sided

Aplicación 3

aplicacion_3 <- 
  carlos_para %>% 
  filter(aplic_encuesta == "aplicacion_3") %>% 
          select(conducta_agresiva)
          

ks.test(aplicacion_3$conducta_agresiva,
        "pnorm", 
        mean(aplicacion_3$conducta_agresiva), 
        sd(aplicacion_3$conducta_agresiva))
ties should not be present for the Kolmogorov-Smirnov test

    One-sample Kolmogorov-Smirnov test

data:  aplicacion_3$conducta_agresiva
D = 0.11536, p-value = 0.0006816
alternative hypothesis: two-sided

Aplicación 4

ks.test(aplicacion_4$conducta_agresiva,
        "pnorm", 
        mean(aplicacion_4$conducta_agresiva), 
        sd(aplicacion_4$conducta_agresiva))
ties should not be present for the Kolmogorov-Smirnov test

    One-sample Kolmogorov-Smirnov test

data:  aplicacion_4$conducta_agresiva
D = 0.10366, p-value = 0.003171
alternative hypothesis: two-sided
aplicacion_5 <- 
  carlos_para %>% 
  filter(aplic_encuesta == "aplicacion_5") %>% 
          select(conducta_agresiva)
          

ks.test(aplicacion_5$conducta_agresiva,
        "pnorm", 
        mean(aplicacion_5$conducta_agresiva), 
        sd(aplicacion_5$conducta_agresiva))
ties should not be present for the Kolmogorov-Smirnov test

    One-sample Kolmogorov-Smirnov test

data:  aplicacion_5$conducta_agresiva
D = 0.11373, p-value = 0.000852
alternative hypothesis: two-sided

Todos los p-valor son menores a 0.05, por lo tanto tienen una distribución normal.

Diferencias significativas entre ellos

Procedemos a aplicar una anova para determinar si hay diferencias significativas entre ellos.

Aplicamos una anova.

summary(carlos_para.anova)
                             Df Sum Sq Mean Sq F value Pr(>F)    
carlos_para$aplic_encuesta    4  751.0   187.8  461811 <2e-16 ***
Residuals                  1495    0.6     0.0                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

El p-valor es menor a 0.05, confirmando que la conducta agresiva varía significativamente a través de las intervenciones.

Para determinar entre cuáles tratamientos hay diferencias significativas se palica un post hoc Tukey.

TukeyHSD(carlos_para.anova)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = carlos_para$conducta_agresiva ~ carlos_para$aplic_encuesta)

$`carlos_para$aplic_encuesta`
                                diff        lwr        upr p adj
aplicacion_2-aplicacion_1 -0.5019667 -0.5064630 -0.4974703     0
aplicacion_3-aplicacion_1 -1.0013000 -1.0057963 -0.9968037     0
aplicacion_4-aplicacion_1 -1.4996333 -1.5041297 -1.4951370     0
aplicacion_5-aplicacion_1 -2.0028667 -2.0073630 -1.9983703     0
aplicacion_3-aplicacion_2 -0.4993333 -0.5038297 -0.4948370     0
aplicacion_4-aplicacion_2 -0.9976667 -1.0021630 -0.9931703     0
aplicacion_5-aplicacion_2 -1.5009000 -1.5053963 -1.4964037     0
aplicacion_4-aplicacion_3 -0.4983333 -0.5028297 -0.4938370     0
aplicacion_5-aplicacion_3 -1.0015667 -1.0060630 -0.9970703     0
aplicacion_5-aplicacion_4 -0.5032333 -0.5077297 -0.4987370     0

Por lo tanto hay diferencias significativas entre todos los tratamientos (p-valor < 0.05).

Volviendo a los promedios

carlos_para %>%
  group_by(aplic_encuesta) %>% 
  summarize(cantidad = n(),
            conducta_agresiva = mean(conducta_agresiva))

Las intervenciones han disminuido significativamente la conducta violenta.

Pruebas no paramétricas

Generamos los datos con distribuciones uniformes (no normales).

carlos_para_no_1 <- 
  tibble(conducta_agresiva = round(runif(300,
                                         min = 4, 
                                         max = 5), 
                                   digits = 2),
         aplic_encuesta = "aplicacion_1")

carlos_para_no_2 <- 
  tibble(conducta_agresiva = round(runif(300,
                                         min = 3, 
                                         max = 4), 
                                   digits = 2),
         aplic_encuesta = "aplicacion_2")

carlos_para_no_3 <- 
  tibble(conducta_agresiva = round(runif(300,
                                         min = 3, 
                                         max = 4), 
                                   digits = 2),
         aplic_encuesta = "aplicacion_3")

carlos_para_no_4 <- 
  tibble(conducta_agresiva = round(runif(300,
                                         min = 2, 
                                         max = 3), 
                                   digits = 2),
         aplic_encuesta = "aplicacion_4")

carlos_para_no_5 <- 
  tibble(conducta_agresiva = round(runif(300,
                                         min = 2, 
                                         max = 3), 
                                   digits = 2),
         aplic_encuesta = "aplicacion_5")

carlos_no_para <- 
  bind_rows(carlos_para_no_1,
            carlos_para_no_2,
            carlos_para_no_3,
            carlos_para_no_4,
            carlos_para_no_5)

Al parecer el tratamiento está teniendo una influencia. Sin embargo, parece que la aplicación 2 y 3 son similares y podría estar mostrando que no hay diferencias entre estas dos aplicaciones.

Normalidad en los datos

Primero verificamos si hay normalidad en los datos con la prueba de Kolmogorov-Smirnov.

Aplicación 1

aplicacion_1_no <- 
  carlos_no_para %>% 
  filter(aplic_encuesta == "aplicacion_1") %>%
  select(conducta_agresiva)

ks.test(aplicacion_1_no$conducta_agresiva,
        "pnorm", 
        mean(aplicacion_1_no$conducta_agresiva), 
        sd(aplicacion_1_no$conducta_agresiva))
ties should not be present for the Kolmogorov-Smirnov test

    One-sample Kolmogorov-Smirnov test

data:  aplicacion_1_no$conducta_agresiva
D = 0.079397, p-value = 0.04554
alternative hypothesis: two-sided

Aplicación 2

aplicacion_2_no <- 
  carlos_no_para %>% 
  filter(aplic_encuesta == "aplicacion_2") %>%
  select(conducta_agresiva)

ks.test(aplicacion_2_no$conducta_agresiva,
        "pnorm", 
        mean(aplicacion_2_no$conducta_agresiva), 
        sd(aplicacion_2_no$conducta_agresiva))
ties should not be present for the Kolmogorov-Smirnov test

    One-sample Kolmogorov-Smirnov test

data:  aplicacion_2_no$conducta_agresiva
D = 0.07492, p-value = 0.06893
alternative hypothesis: two-sided

Aplicación 3

aplicacion_3_no <- 
  carlos_no_para %>% 
  filter(aplic_encuesta == "aplicacion_3") %>%
  select(conducta_agresiva)

ks.test(aplicacion_3_no$conducta_agresiva,
        "pnorm", 
        mean(aplicacion_3_no$conducta_agresiva), 
        sd(aplicacion_3_no$conducta_agresiva))
ties should not be present for the Kolmogorov-Smirnov test

    One-sample Kolmogorov-Smirnov test

data:  aplicacion_3_no$conducta_agresiva
D = 0.063481, p-value = 0.1781
alternative hypothesis: two-sided

Aplicación 4

aplicacion_4_no <- 
  carlos_no_para %>% 
  filter(aplic_encuesta == "aplicacion_4") %>%
  select(conducta_agresiva)

ks.test(aplicacion_4_no$conducta_agresiva,
        "pnorm", 
        mean(aplicacion_4_no$conducta_agresiva), 
        sd(aplicacion_4_no$conducta_agresiva))
ties should not be present for the Kolmogorov-Smirnov test

    One-sample Kolmogorov-Smirnov test

data:  aplicacion_4_no$conducta_agresiva
D = 0.077714, p-value = 0.05337
alternative hypothesis: two-sided

Aplicación 5

aplicacion_5_no <- 
  carlos_no_para %>% 
  filter(aplic_encuesta == "aplicacion_5") %>%
  select(conducta_agresiva)

ks.test(aplicacion_5_no$conducta_agresiva,
        "pnorm", 
        mean(aplicacion_5_no$conducta_agresiva), 
        sd(aplicacion_5_no$conducta_agresiva))
ties should not be present for the Kolmogorov-Smirnov test

    One-sample Kolmogorov-Smirnov test

data:  aplicacion_5_no$conducta_agresiva
D = 0.090427, p-value = 0.0148
alternative hypothesis: two-sided
kruskal.test(aplic_encuesta ~ conducta_agresiva,
             carlos_no_para)

    Kruskal-Wallis rank sum test

data:  aplic_encuesta by conducta_agresiva
Kruskal-Wallis chi-squared = 1372.7, df = 299, p-value < 2.2e-16

Como el p-valor es menor a 0.05 hay diferencias significativas.

Pos hoc - Wilcox

pairwise.wilcox.test(carlos_no_para$conducta_agresiva,
                     carlos_no_para$aplic_encuesta,
                     p.adjust.method = "BH")

    Pairwise comparisons using Wilcoxon rank sum test with continuity correction 

data:  carlos_no_para$conducta_agresiva and carlos_no_para$aplic_encuesta 

             aplicacion_1 aplicacion_2 aplicacion_3 aplicacion_4
aplicacion_2 <2e-16       -            -            -           
aplicacion_3 <2e-16       0.106        -            -           
aplicacion_4 <2e-16       <2e-16       <2e-16       -           
aplicacion_5 <2e-16       <2e-16       <2e-16       0.067       

P value adjustment method: BH 

Se encontró que la aplicación 2 no tiene diferencia significativa con la aplicación 3 y también la aplicación 4 no tiene diferencia significativa con la aplicación 5. Esto quiere decir que no hay necesidad de hacer 5 aplicaciones sino 3, una al principio otra al final y otra en el medio.

Contrastarlos con otros estudios.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBDYXJnYW5kbyBkYXRvcwoKYGBge3J9CmNhcmxvc19yYXcgPC0gcmVhZF9jc3YoaGVyZSgiU0VNIGxhdmFhbi9kYXRhX3NlbSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhcmxvc18yLmNzdiIpKQpgYGAKCiMgU2ltdWxhbW9zIGxvcyBkYXRvcwoKRGVmaW5pbW9zIGxhcyB2YXJpYWJsZXMgcXVlIHZhbW9zIGEgdXRpbGl6YXIKCmBgYHtyfQpzZWdWYXJzIDwtIGMoImFnZSIsICJnZW5kZXIiLCAidGllbXBvX3NhbmNpb24iLCAiZHJvZ2FzIiwgImNvbmR1Y3RhX2FncmVzaXZhIikKYGBgCgpEZWZpbml0bW9zIGVsIHRpcG8gZGUgZGF0byBkZSBjYWRhIHZhcmlhYmxlCgpgYGB7cn0Kc2VnVmFyVHlwZSA8LSBjKCJub3JtIiwgImJpbm9tIiwgIm5vcm0iLCAicG9pcyIsICJub3JtIikKYGBgCgpMZSBwb25lbW9zIGxvcyBub21icmVzIGEgbG9zIHNlZ21lbnRvcy4gRW4gZXN0ZSBjYXNvIHZhIGEgc2VyIGVsIHRpZW1wbyBkZSBsYXMgZGlmZXJlbnRlcyBtdWVzdHJhcwoKYGBge3J9CnNlZ05hbWVzIDwtIGMoImFwbGljYWNpb25fMSIsICJhcGxpY2FjaW9uXzIiLCAiYXBsaWNhY2lvbl8zIiwgImFwbGljYWNpb25fNCIsICJhcGxpY2FjaW9uXzUiKQpgYGAKCkRlZmluaW1vcyBsb3MgdGFtYcOxb3MgZGUgY2FkYSBzZWdtZW50bwoKYGBge3J9CnNlZ1NpemUgPC0gYygzMDAsIDMwMCwgMzAwLCAzMDAsIDMwMCkKYGBgCgpEZWZpbmltb3MgZWwgcHJvbWVkaW8gZGUgY2FkYSB2YXJpYWJsZSBwYXJhIHBhZGEgc2VnbWVudG8KCmBgYHtyfQpzZWdNZWFucyA8LSBtYXRyaXgoIGMoCiAgMTgsIC41LCAxMDAsIDEsIDQsCiAgMTgsIC41LCAxMDAsIDEsIDMuNSwKICAxOCwgLjUsIDEwMCwgMSwgMywKICAxOCwgLjUsIDEwMCwgMSwgMi41LAogIDE4LCAuNSwgMTAwLCAxLCAyICksIG5jb2w9bGVuZ3RoKHNlZ1ZhcnMpLCBieXJvdz1UUlVFKQoKCnNlZ1ZhcnMgPC0gYygiYWdlIiwgImdlbmRlciIsICJ0aWVtcG9fc2FuY2lvbiIsICJkcm9nYXMiLCAiY29uZHVjdGFfYWdyZXNpdmEiKQpgYGAKRGVmaW5pbW9zIGxhcyBkZXN2aWFjaW9uZXMgZXN0w6FuZGFyIHBhcmEgY2FkYSBzZWdtZW50bwoKYGBge3J9CnNlZ1NEcyA8LSBtYXRyaXgoIGMoCiAgNSwgTkEsIDEwLCBOQSwgMC4wMiwKICA1LCBOQSwgMTAsIE5BLCAwLjAyLAogIDUsIE5BLCAxMCwgTkEsIDAuMDIsCiAgNSwgTkEsIDEwLCBOQSwgMC4wMiwKICA1LCBOQSwgMTAsIE5BLCAwLjAyKSwgbmNvbD1sZW5ndGgoc2VnVmFycyksIGJ5cm93PVRSVUUpCmBgYAoKRGUgYWN1ZXJkbyBhIGxvcyBwYXLDoW1ldHJvcyBhbnRlcmlvcmVzLCBjcmVhbW9zIGVsIGRhdGFzZXQgCgpgYGB7cn0Kc2VnLmRmIDwtIE5VTEwKc2V0LnNlZWQoMDI1NTQpCgpmb3IgKGkgaW4gc2VxX2Fsb25nKHNlZ05hbWVzKSkgeyAgICAKICBjYXQoaSwgc2VnTmFtZXNbaV0sICJcbiIpCiAgCiAgIyBjcmVhdGUgYW4gZW1wdHkgbWF0cml4IHRvIGhvbGQgdGhpcyBwYXJ0aWN1bGFyIHNlZ21lbnQncyBkYXRhCiAgdGhpcy5zZWcgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsIG5yb3c9c2VnU2l6ZVtpXSwgbmNvbD1sZW5ndGgoc2VnVmFycykpKQogIAogICMgd2l0aGluIGEgc2VnbWVudCwgaXRlcmF0ZSBvdmVyIHRoZSB2YXJpYWJsZXMgYW5kIGRyYXcgYXBwcm9wcmlhdGUgcmFuZG9tIGRhdGEKICBmb3IgKGogaW4gc2VxX2Fsb25nKHNlZ1ZhcnMpKSB7ICAgICMgYW5kIGl0ZXJhdGUgb3ZlciBlYWNoIHZhcmlhYmxlCiAgICBpZiAoc2VnVmFyVHlwZVtqXSA9PSAibm9ybSIpIHsgICAjIGRyYXcgcmFuZG9tIG5vcm1hbHMKICAgICAgdGhpcy5zZWdbLCBqXSA8LSBybm9ybShzZWdTaXplW2ldLCBtZWFuPXNlZ01lYW5zW2ksIGpdLCBzZD1zZWdTRHNbaSwgal0pCiAgICB9IGVsc2UgaWYgKHNlZ1ZhclR5cGVbal0gPT0gInBvaXMiKSB7ICAgICMgZHJhdyBjb3VudHMKICAgICAgdGhpcy5zZWdbLCBqXSA8LSBycG9pcyhzZWdTaXplW2ldLCBsYW1iZGE9c2VnTWVhbnNbaSwgal0pCiAgICB9IGVsc2UgaWYgKHNlZ1ZhclR5cGVbal0gPT0gImJpbm9tIikgeyAgICMgZHJhdyBiaW5vbWlhbHMKICAgICAgdGhpcy5zZWdbLCBqXSA8LSByYmlub20oc2VnU2l6ZVtpXSwgc2l6ZT0xLCBwcm9iPXNlZ01lYW5zW2ksIGpdKQogICAgfSBlbHNlIHsKICAgICAgc3RvcCgiQmFkIHNlZ21lbnQgZGF0YSB0eXBlOiAiLCBzZWdWYXJUeXBlW2pdKQogICAgfQogIH0KICAjIGFkZCB0aGlzIHNlZ21lbnQgdG8gdGhlIHRvdGFsIGRhdGFzZXQKICBzZWcuZGYgPC0gcmJpbmQoc2VnLmRmLCB0aGlzLnNlZykgICAgIAp9CmBgYAoKTGUgYXNpZ25hbW9zIG5vbWJyZXMgYWwgZGF0YXNldAoKYGBge3J9Cm5hbWVzKHNlZy5kZikgPC0gc2VnVmFycwoKYGBgCgpBc2lnbmFtb3MgbG9zIGRpZmVyZW50ZXMgc2VnbWVudG9zCgpgYGB7cn0Kc2VnLmRmJFNlZ21lbnQgICA8LSBmYWN0b3IocmVwKHNlZ05hbWVzLCB0aW1lcz1zZWdTaXplKSkKYGBgCgpPcmdhbml6YW1vcyB1biBwb2NvIGxvcyBkYXRvcwoKYGBge3J9CnNlZy5kZiA8LSAKICBzZWcuZGYgJT4lIAogIG11dGF0ZShhZ2UgPSByb3VuZChhZ2UsIGRpZ2l0cyA9IDApLAogICAgICAgICBnZW5kZXIgPSBmYWN0b3IoZ2VuZGVyLCBsYWJlbHMgPSBjKCJmIiwgIm0iKSksCiAgICAgICAgIHRpZW1wb19zYW5jaW9uID0gcm91bmQodGllbXBvX3NhbmNpb24sIGRpZ2l0cyA9IDApLAogICAgICAgICBjb25kdWN0YV9hZ3Jlc2l2YSA9IHJvdW5kKGNvbmR1Y3RhX2FncmVzaXZhLCAyKSkKCmBgYAoKQWRhcHRhciBsb3MgZGF0b3MgYWwgZWplcmNpY2lvLiBTb2xvIHBhcmEgaW50ZXJ2ZW5jacOzbiBhbWlnb25pYW5hLiAKCmBgYHtyfQpjYXJsb3NfcGFyYSA8LSBzZWcuZGYKCmNhcmxvc19wYXJhIDwtIAogIGNhcmxvc19wYXJhICU+JSAKICByZW5hbWUoYXBsaWNfZW5jdWVzdGEgPSAiU2VnbWVudCIpCmBgYAoKYGBge3J9CmNhcmxvc19wYXJhICU+JSBjb3VudChhcGxpY19lbmN1ZXN0YSkKYGBgCgpgYGB7cn0Kc2VnLmRmICU+JQogIGdyb3VwX2J5KFNlZ21lbnQpICU+JSAKICBzdW1tYXJpemUoY2FudGlkYWQgPSBuKCksCiAgICAgICAgICAgIGNvbmR1Y3RhX2FncmVzaXZhID0gbWVhbihjb25kdWN0YV9hZ3Jlc2l2YSkpCmBgYAoKRGUgYWN1ZXJkbyBhIGxvcyBkYXRvcyBkZWwgcHJvbWVkaW8gZGUgbGEgY29uZHVjdGEgdmlvbGVudGEsIGxhIGludGVydmVuY2nDs24gYW1pZ29uaWFuYSBlc3TDoSB0ZW5pZW5kbyB1bmEgaW5mbHVlbmNpYSBwb3NpdGl2YSBlbiBsYSByZWR1Y2Npw7NuIGRlIGxhIGNvbmR1Y3RhIHZpb2xlbnRhLiAKCiMgUHJ1ZWJhcyBwYXJhbcOpdHJpY2FzCgoKUGFyZWNlIHF1ZSBsYSBpbnRlcnZlbmNpw7NuIGVzdMOhIHNpcnZpZW5kbyEhISBQZXJvIGhheSBxdWUgZGVtb3N0cmFybG8gZXN0YWTDrXNpdGNhbWVudGUgKGluZmVyZW5jaWFsKS4gCgojIyBFbCB0YW1hw7FvIGRlIGxvcyBzZWdlbWVudG9zIGFmZWN0YSBlbCByZXN1bHRhZG8/CgpQYXJhIGRldGVybWluYXIgc2kgZWwgdGFtYcOxbyBwdWVkZSBhZmVjdGFyIGxhcyBjb21wYXJhY2lvbmVzIGVudHJlIHNlZ21lbnRvcyB1dGlsaXphbW9zIGxhIHBydWViYSBjaGktY3VhZHJhZG8uCgpgYGB7cn0KY2hpc3EudGVzdCh0YWJsZShzZWcuZGYkU2VnbWVudCkpCmBgYAoKCiMjIE5vcm1hbGlkYWQgZW4gbG9zIGRhdG9zCgpQcmltZXJvIHZlcmlmaWNhbW9zIHNpIGhheSBub3JtYWxpZGFkIGVuIGxvcyBkYXRvcyBjb24gbGEgcHJ1ZWJhIGRlIEtvbG1vZ29yb3YtU21pcm5vdi4gCgpBcGxpY2FjacOzbiAxCgpgYGB7cn0KYXBsaWNhY2lvbl8xIDwtIAogIGNhcmxvc19wYXJhICU+JSAKICBmaWx0ZXIoYXBsaWNfZW5jdWVzdGEgPT0gImFwbGljYWNpb25fMSIpICU+JSAKICAgICAgICAgIHNlbGVjdChjb25kdWN0YV9hZ3Jlc2l2YSkKICAgICAgICAgIAoKa3MudGVzdChhcGxpY2FjaW9uXzEkY29uZHVjdGFfYWdyZXNpdmEsCiAgICAgICAgInBub3JtIiwgCiAgICAgICAgbWVhbihhcGxpY2FjaW9uXzEkY29uZHVjdGFfYWdyZXNpdmEpLCAKICAgICAgICBzZChhcGxpY2FjaW9uXzEkY29uZHVjdGFfYWdyZXNpdmEpKQpgYGAKCkFwbGljYWNpw7NuIDIKCmBgYHtyfQphcGxpY2FjaW9uXzIgPC0gCiAgY2FybG9zX3BhcmEgJT4lIAogIGZpbHRlcihhcGxpY19lbmN1ZXN0YSA9PSAiYXBsaWNhY2lvbl8yIikgJT4lIAogICAgICAgICAgc2VsZWN0KGNvbmR1Y3RhX2FncmVzaXZhKQogICAgICAgICAgCgprcy50ZXN0KGFwbGljYWNpb25fMiRjb25kdWN0YV9hZ3Jlc2l2YSwKICAgICAgICAicG5vcm0iLCAKICAgICAgICBtZWFuKGFwbGljYWNpb25fMiRjb25kdWN0YV9hZ3Jlc2l2YSksIAogICAgICAgIHNkKGFwbGljYWNpb25fMiRjb25kdWN0YV9hZ3Jlc2l2YSkpCmBgYAoKQXBsaWNhY2nDs24gMwoKYGBge3J9CmFwbGljYWNpb25fMyA8LSAKICBjYXJsb3NfcGFyYSAlPiUgCiAgZmlsdGVyKGFwbGljX2VuY3Vlc3RhID09ICJhcGxpY2FjaW9uXzMiKSAlPiUgCiAgICAgICAgICBzZWxlY3QoY29uZHVjdGFfYWdyZXNpdmEpCiAgICAgICAgICAKCmtzLnRlc3QoYXBsaWNhY2lvbl8zJGNvbmR1Y3RhX2FncmVzaXZhLAogICAgICAgICJwbm9ybSIsIAogICAgICAgIG1lYW4oYXBsaWNhY2lvbl8zJGNvbmR1Y3RhX2FncmVzaXZhKSwgCiAgICAgICAgc2QoYXBsaWNhY2lvbl8zJGNvbmR1Y3RhX2FncmVzaXZhKSkKYGBgCgoKQXBsaWNhY2nDs24gNAoKYGBge3J9CmFwbGljYWNpb25fNCA8LSAKICBjYXJsb3NfcGFyYSAlPiUgCiAgZmlsdGVyKGFwbGljX2VuY3Vlc3RhID09ICJhcGxpY2FjaW9uXzQiKSAlPiUgCiAgICAgICAgICBzZWxlY3QoY29uZHVjdGFfYWdyZXNpdmEpCiAgICAgICAgICAKCmtzLnRlc3QoYXBsaWNhY2lvbl80JGNvbmR1Y3RhX2FncmVzaXZhLAogICAgICAgICJwbm9ybSIsIAogICAgICAgIG1lYW4oYXBsaWNhY2lvbl80JGNvbmR1Y3RhX2FncmVzaXZhKSwgCiAgICAgICAgc2QoYXBsaWNhY2lvbl80JGNvbmR1Y3RhX2FncmVzaXZhKSkKYGBgCgpgYGB7cn0KYXBsaWNhY2lvbl81IDwtIAogIGNhcmxvc19wYXJhICU+JSAKICBmaWx0ZXIoYXBsaWNfZW5jdWVzdGEgPT0gImFwbGljYWNpb25fNSIpICU+JSAKICAgICAgICAgIHNlbGVjdChjb25kdWN0YV9hZ3Jlc2l2YSkKICAgICAgICAgIAoKa3MudGVzdChhcGxpY2FjaW9uXzUkY29uZHVjdGFfYWdyZXNpdmEsCiAgICAgICAgInBub3JtIiwgCiAgICAgICAgbWVhbihhcGxpY2FjaW9uXzUkY29uZHVjdGFfYWdyZXNpdmEpLCAKICAgICAgICBzZChhcGxpY2FjaW9uXzUkY29uZHVjdGFfYWdyZXNpdmEpKQpgYGAKClRvZG9zIGxvcyBwLXZhbG9yIHNvbiBtZW5vcmVzIGEgMC4wNSwgcG9yIGxvIHRhbnRvIHRpZW5lbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwuIAoKIyMgRGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgZWxsb3MKClByb2NlZGVtb3MgYSBhcGxpY2FyIHVuYSBhbm92YSBwYXJhIGRldGVybWluYXIgc2kgaGF5IGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGVsbG9zLgoKQXBsaWNhbW9zIHVuYSBhbm92YS4gCgpgYGB7cn0KY2FybG9zX3BhcmEuYW5vdmEgPC0gKGFvdihjYXJsb3NfcGFyYSRjb25kdWN0YV9hZ3Jlc2l2YSB+IGNhcmxvc19wYXJhJGFwbGljX2VuY3Vlc3RhKSkKCnN1bW1hcnkoY2FybG9zX3BhcmEuYW5vdmEpCmBgYAoKRWwgcC12YWxvciBlcyBtZW5vciBhIDAuMDUsIGNvbmZpcm1hbmRvIHF1ZSBsYSBjb25kdWN0YSBhZ3Jlc2l2YSB2YXLDrWEgc2lnbmlmaWNhdGl2YW1lbnRlIGEgdHJhdsOpcyBkZSBsYXMgaW50ZXJ2ZW5jaW9uZXMuIAoKClBhcmEgZGV0ZXJtaW5hciBlbnRyZSBjdcOhbGVzIHRyYXRhbWllbnRvcyBoYXkgZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgc2UgcGFsaWNhIHVuIHBvc3QgaG9jIFR1a2V5LgoKYGBge3J9ClR1a2V5SFNEKGNhcmxvc19wYXJhLmFub3ZhKQpgYGAKClBvciBsbyB0YW50byBoYXkgZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgdG9kb3MgbG9zIHRyYXRhbWllbnRvcyAocC12YWxvciA8IDAuMDUpLiAKClZvbHZpZW5kbyBhIGxvcyBwcm9tZWRpb3MKCgpgYGB7cn0KY2FybG9zX3BhcmEgJT4lCiAgZ3JvdXBfYnkoYXBsaWNfZW5jdWVzdGEpICU+JSAKICBzdW1tYXJpemUoY2FudGlkYWQgPSBuKCksCiAgICAgICAgICAgIGNvbmR1Y3RhX2FncmVzaXZhID0gbWVhbihjb25kdWN0YV9hZ3Jlc2l2YSkpCmBgYAoKTGFzIGludGVydmVuY2lvbmVzIGhhbiBkaXNtaW51aWRvIHNpZ25pZmljYXRpdmFtZW50ZSBsYSBjb25kdWN0YSB2aW9sZW50YS4gCgojIFBydWViYXMgbm8gcGFyYW3DqXRyaWNhcwoKR2VuZXJhbW9zIGxvcyBkYXRvcyBjb24gZGlzdHJpYnVjaW9uZXMgdW5pZm9ybWVzIChubyBub3JtYWxlcykuIAoKYGBge3J9CmNhcmxvc19wYXJhX25vXzEgPC0gCiAgdGliYmxlKGNvbmR1Y3RhX2FncmVzaXZhID0gcm91bmQocnVuaWYoMzAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IDQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IDUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSwKICAgICAgICAgYXBsaWNfZW5jdWVzdGEgPSAiYXBsaWNhY2lvbl8xIikKCmNhcmxvc19wYXJhX25vXzIgPC0gCiAgdGliYmxlKGNvbmR1Y3RhX2FncmVzaXZhID0gcm91bmQocnVuaWYoMzAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IDMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IDQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSwKICAgICAgICAgYXBsaWNfZW5jdWVzdGEgPSAiYXBsaWNhY2lvbl8yIikKCmNhcmxvc19wYXJhX25vXzMgPC0gCiAgdGliYmxlKGNvbmR1Y3RhX2FncmVzaXZhID0gcm91bmQocnVuaWYoMzAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IDMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IDQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSwKICAgICAgICAgYXBsaWNfZW5jdWVzdGEgPSAiYXBsaWNhY2lvbl8zIikKCmNhcmxvc19wYXJhX25vXzQgPC0gCiAgdGliYmxlKGNvbmR1Y3RhX2FncmVzaXZhID0gcm91bmQocnVuaWYoMzAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IDMpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSwKICAgICAgICAgYXBsaWNfZW5jdWVzdGEgPSAiYXBsaWNhY2lvbl80IikKCmNhcmxvc19wYXJhX25vXzUgPC0gCiAgdGliYmxlKGNvbmR1Y3RhX2FncmVzaXZhID0gcm91bmQocnVuaWYoMzAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IDMpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSwKICAgICAgICAgYXBsaWNfZW5jdWVzdGEgPSAiYXBsaWNhY2lvbl81IikKCmNhcmxvc19ub19wYXJhIDwtIAogIGJpbmRfcm93cyhjYXJsb3NfcGFyYV9ub18xLAogICAgICAgICAgICBjYXJsb3NfcGFyYV9ub18yLAogICAgICAgICAgICBjYXJsb3NfcGFyYV9ub18zLAogICAgICAgICAgICBjYXJsb3NfcGFyYV9ub180LAogICAgICAgICAgICBjYXJsb3NfcGFyYV9ub181KQpgYGAKCmBgYHtyfQpjYXJsb3Nfbm9fcGFyYSAlPiUgCiAgZ3JvdXBfYnkoYXBsaWNfZW5jdWVzdGEpICU+JSAKICBzdW1tYXJpemUodG90YWwgPSBuKCksCiAgICAgICAgICAgIG1lZGlhID0gbWVhbihjb25kdWN0YV9hZ3Jlc2l2YSksCiAgICAgICAgICAgIG1lZGlhbmEgPSBtZWRpYW4oY29uZHVjdGFfYWdyZXNpdmEpKQpgYGAKQWwgcGFyZWNlciBlbCB0cmF0YW1pZW50byBlc3TDoSB0ZW5pZW5kbyB1bmEgaW5mbHVlbmNpYS4gU2luIGVtYmFyZ28sIHBhcmVjZSBxdWUgbGEgYXBsaWNhY2nDs24gMiB5IDMgc29uIHNpbWlsYXJlcyB5IHBvZHLDrWEgZXN0YXIgbW9zdHJhbmRvIHF1ZSBubyBoYXkgZGlmZXJlbmNpYXMgZW50cmUgZXN0YXMgZG9zIGFwbGljYWNpb25lcy4gCgojIyBOb3JtYWxpZGFkIGVuIGxvcyBkYXRvcwoKUHJpbWVybyB2ZXJpZmljYW1vcyBzaSBoYXkgbm9ybWFsaWRhZCBlbiBsb3MgZGF0b3MgY29uIGxhIHBydWViYSBkZSBLb2xtb2dvcm92LVNtaXJub3YuIAoKQXBsaWNhY2nDs24gMQoKYGBge3J9CmFwbGljYWNpb25fMV9ubyA8LSAKICBjYXJsb3Nfbm9fcGFyYSAlPiUgCiAgZmlsdGVyKGFwbGljX2VuY3Vlc3RhID09ICJhcGxpY2FjaW9uXzEiKSAlPiUKICBzZWxlY3QoY29uZHVjdGFfYWdyZXNpdmEpCgprcy50ZXN0KGFwbGljYWNpb25fMV9ubyRjb25kdWN0YV9hZ3Jlc2l2YSwKICAgICAgICAicG5vcm0iLCAKICAgICAgICBtZWFuKGFwbGljYWNpb25fMV9ubyRjb25kdWN0YV9hZ3Jlc2l2YSksIAogICAgICAgIHNkKGFwbGljYWNpb25fMV9ubyRjb25kdWN0YV9hZ3Jlc2l2YSkpCmBgYAoKQXBsaWNhY2nDs24gMgoKYGBge3J9CmFwbGljYWNpb25fMl9ubyA8LSAKICBjYXJsb3Nfbm9fcGFyYSAlPiUgCiAgZmlsdGVyKGFwbGljX2VuY3Vlc3RhID09ICJhcGxpY2FjaW9uXzIiKSAlPiUKICBzZWxlY3QoY29uZHVjdGFfYWdyZXNpdmEpCgprcy50ZXN0KGFwbGljYWNpb25fMl9ubyRjb25kdWN0YV9hZ3Jlc2l2YSwKICAgICAgICAicG5vcm0iLCAKICAgICAgICBtZWFuKGFwbGljYWNpb25fMl9ubyRjb25kdWN0YV9hZ3Jlc2l2YSksIAogICAgICAgIHNkKGFwbGljYWNpb25fMl9ubyRjb25kdWN0YV9hZ3Jlc2l2YSkpCmBgYAoKQXBsaWNhY2nDs24gMwoKYGBge3J9CmFwbGljYWNpb25fM19ubyA8LSAKICBjYXJsb3Nfbm9fcGFyYSAlPiUgCiAgZmlsdGVyKGFwbGljX2VuY3Vlc3RhID09ICJhcGxpY2FjaW9uXzMiKSAlPiUKICBzZWxlY3QoY29uZHVjdGFfYWdyZXNpdmEpCgprcy50ZXN0KGFwbGljYWNpb25fM19ubyRjb25kdWN0YV9hZ3Jlc2l2YSwKICAgICAgICAicG5vcm0iLCAKICAgICAgICBtZWFuKGFwbGljYWNpb25fM19ubyRjb25kdWN0YV9hZ3Jlc2l2YSksIAogICAgICAgIHNkKGFwbGljYWNpb25fM19ubyRjb25kdWN0YV9hZ3Jlc2l2YSkpCmBgYAoKCkFwbGljYWNpw7NuIDQKCmBgYHtyfQphcGxpY2FjaW9uXzRfbm8gPC0gCiAgY2FybG9zX25vX3BhcmEgJT4lIAogIGZpbHRlcihhcGxpY19lbmN1ZXN0YSA9PSAiYXBsaWNhY2lvbl80IikgJT4lCiAgc2VsZWN0KGNvbmR1Y3RhX2FncmVzaXZhKQoKa3MudGVzdChhcGxpY2FjaW9uXzRfbm8kY29uZHVjdGFfYWdyZXNpdmEsCiAgICAgICAgInBub3JtIiwgCiAgICAgICAgbWVhbihhcGxpY2FjaW9uXzRfbm8kY29uZHVjdGFfYWdyZXNpdmEpLCAKICAgICAgICBzZChhcGxpY2FjaW9uXzRfbm8kY29uZHVjdGFfYWdyZXNpdmEpKQpgYGAKCkFwbGljYWNpw7NuIDUKCmBgYHtyfQphcGxpY2FjaW9uXzVfbm8gPC0gCiAgY2FybG9zX25vX3BhcmEgJT4lIAogIGZpbHRlcihhcGxpY19lbmN1ZXN0YSA9PSAiYXBsaWNhY2lvbl81IikgJT4lCiAgc2VsZWN0KGNvbmR1Y3RhX2FncmVzaXZhKQoKa3MudGVzdChhcGxpY2FjaW9uXzVfbm8kY29uZHVjdGFfYWdyZXNpdmEsCiAgICAgICAgInBub3JtIiwgCiAgICAgICAgbWVhbihhcGxpY2FjaW9uXzVfbm8kY29uZHVjdGFfYWdyZXNpdmEpLCAKICAgICAgICBzZChhcGxpY2FjaW9uXzVfbm8kY29uZHVjdGFfYWdyZXNpdmEpKQpgYGAKCmBgYHtyfQprcnVza2FsLnRlc3QoYXBsaWNfZW5jdWVzdGEgfiBjb25kdWN0YV9hZ3Jlc2l2YSwKICAgICAgICAgICAgIGNhcmxvc19ub19wYXJhKQpgYGAKCkNvbW8gZWwgcC12YWxvciBlcyBtZW5vciBhIDAuMDUgaGF5IGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzLiAKClBvcyBob2MgLSBXaWxjb3ggCgpgYGB7cn0KcGFpcndpc2Uud2lsY294LnRlc3QoY2FybG9zX25vX3BhcmEkY29uZHVjdGFfYWdyZXNpdmEsCiAgICAgICAgICAgICAgICAgICAgIGNhcmxvc19ub19wYXJhJGFwbGljX2VuY3Vlc3RhLAogICAgICAgICAgICAgICAgICAgICBwLmFkanVzdC5tZXRob2QgPSAiQkgiKQpgYGAKClNlIGVuY29udHLDsyBxdWUgbGEgYXBsaWNhY2nDs24gMiBubyB0aWVuZSBkaWZlcmVuY2lhIHNpZ25pZmljYXRpdmEgY29uIGxhIGFwbGljYWNpw7NuIDMgeSB0YW1iacOpbiBsYSBhcGxpY2FjacOzbiA0IG5vIHRpZW5lIGRpZmVyZW5jaWEgc2lnbmlmaWNhdGl2YSBjb24gbGEgYXBsaWNhY2nDs24gNS4gRXN0byBxdWllcmUgZGVjaXIgcXVlIG5vIGhheSBuZWNlc2lkYWQgZGUgaGFjZXIgNSBhcGxpY2FjaW9uZXMgc2lubyAzLCB1bmEgYWwgcHJpbmNpcGlvIG90cmEgYWwgZmluYWwgeSBvdHJhIGVuIGVsIG1lZGlvLiAKCkNvbnRyYXN0YXJsb3MgY29uIG90cm9zIGVzdHVkaW9zLgo=