ANOVA de medidas repetidas de tres vías

library(tidyverse)
library(ggpubr)
library(rstatix)
library(readxl)
EJERCICIO3 <- read_excel("C:/vale/EJERCICIO3.xlsx")
View(EJERCICIO3)

Cargue los datos y muestre algunas filas aleatorias por grupos:

# Wide format
set.seed(123)
data("EJERCICIO3 ")
Warning: data set ‘EJERCICIO3 ’ not found
EJERCICIO3 %>% sample_n_by(bloque, variedad, size = 1)
# Gather the columns t1, t2 and t3 into long format.
# Convert id and time into factor variables
 EJERCICIO3 <-  EJERCICIO3 %>%
  gather(key = "time", value = "score", X1, X2, X3, X4) %>%
  convert_as_factor(ID, time, variedad, bloque)
# Inspect some random rows of the data by groups
set.seed(123)
 EJERCICIO3 %>% sample_n_by(bloque, variedad, time, size = 1)
NA

Resumen estadístico

Agrupe los datos por bloque, variedad y time, y luego calcule algunas estadísticas resumidas de la scorevariable: media y DE (desviación estándar).

EJERCICIO3 %>%
  group_by(bloque, variedad, time) %>%
  get_summary_stats(score, type = "mean_sd")

Visualización

Crea diagramas de caja:

bxp <- ggboxplot(
EJERCICIO3, x = "variedad", y = "score",
  color = "time", palette = "jco",
  facet.by = "bloque", short.panel.labs = FALSE
  )
bxp

Verifique los supuestos

Valores atípicos

 EJERCICIO3%>%
  group_by(bloque, variedad, time) %>%
  identify_outliers(score)

Si hubo valores atipicos extremos ## Supuesto de normalidad Calcule la prueba de Shapiro-Wilk para cada combinación de niveles de factores:

EJERCICIO3 %>%
  group_by(bloque, variedad, time) %>%
  shapiro_test(score)

Se distribuye normalmente (p>0.05) pero hay una menor

ggqqplot(EJERCICIO3, "score", ggtheme = theme_bw()) +
  facet_grid(bloque + variedad ~ time, labeller = "label_both")

Del gráfico anterior, como todos los puntos caen aproximadamente a lo largo de la línea de referencia, podemos asumir normalidad.

calculo

res.aov <- anova_test(
  data = EJERCICIO3, dv = score, wid = ID,
  within = c(bloque, variedad, time)
  )
get_anova_table(res.aov)
ANOVA Table (type III tests)

                Effect  DFn  DFd        F        p p<.05   ges
1               bloque 1.00  4.0    0.338 5.92e-01       0.027
2             variedad 1.02  4.1   26.842 6.00e-03     * 0.510
3                 time 3.00 12.0 4174.104 2.26e-18     * 0.942
4      bloque:variedad 2.00  8.0    0.108 8.99e-01       0.004
5          bloque:time 3.00 12.0    1.709 2.18e-01       0.008
6        variedad:time 6.00 24.0    2.466 5.30e-02       0.021
7 bloque:variedad:time 6.00 24.0    2.492 5.10e-02       0.016

Del resultado anterior, se puede ver que existen interacciones triples estadísticamente significativas entre el bloque, la variedad y el tiempo, F(6, 24) = 2,492, p = 0,051.

Pruebas post hoc

Calcular interacción bidireccional simple

Usted es libre de decidir qué dos variables formarán las interacciones bidireccionales simples y qué variable actuará como la tercera variable (moderadora). En el siguiente código R, hemos considerado la interacción bidireccional simple de variedad*time en cada nivel de bloque.

Agrupe los datos diety analice la interacción bidireccional simple entre variedad y time:

# Two-way ANOVA at each diet level
two.way <- EJERCICIO3 %>%
  group_by(bloque) %>%
  anova_test(dv = score, wid = ID, within = c(variedad, time))
two.way
# Extract anova table
get_anova_table(two.way)

Los datos que proporcionaste son resultados de un análisis de varianza (ANOVA) y el índice GES (Generalized Eta Squared). Aquí está la interpretación:

Bloque_1:variedad:time

  • DFn (Grados de libertad numerador): 6. Indica los grados de libertad asociados con las diferencias entre los grupos o condiciones en tu estudio.

  • DFd (Grados de libertad denominador): 24. Representa los grados de libertad asociados con la variabilidad dentro de los grupos o condiciones.

  • F (Estadístico F): 1.265. El estadístico F es una relación de varianzas y se utiliza para evaluar si hay diferencias significativas entre las medias de los grupos. En este caso, el valor de F es 1.265.

  • p (Valor p): 3.10e-01. Este es el valor p asociado con el estadístico F. Indica la probabilidad de obtener el estadístico F observado (o uno más extremo) si la hipótesis nula de que no hay diferencias significativas entre los grupos es verdadera. En este caso, el valor p es 0.31, lo que sugiere que no hay evidencia suficiente para rechazar la hipótesis nula a un nivel de significancia convencional de 0.05.

  • ges (Generalized Eta Squared): 0.022. El índice GES es una medida de efecto que indica la proporción de la varianza total explicada por el efecto de interés. En este caso, el valor de GES es 0.022, lo que sugiere que alrededor del 2.2% de la variabilidad total puede atribuirse al efecto de interés.

En resumen, los resultados indican que no hay evidencia significativa para diferencias entre los grupos, y el índice GES proporciona información sobre el tamaño del efecto. Es importante considerar el contexto de tu estudio y la relevancia práctica de estos resultados.

bloque_2: variedad:time En el contexto de un análisis de varianza (ANOVA), los datos que proporcionaste representan resultados estadísticos clave. Aquí está la interpretación:

  • DFn (Grados de libertad numerador): 6. Indica los grados de libertad asociados con las diferencias entre los grupos o condiciones en tu estudio.

  • DFd (Grados de libertad denominador): 24. Representa los grados de libertad asociados con la variabilidad dentro de los grupos o condiciones.

  • F (Estadístico F): 4.022. El estadístico F es una relación de varianzas y se utiliza para evaluar si hay diferencias significativas entre las medias de los grupos. En este caso, el valor de F es 4.022.

  • p (Valor p): 6.00e-03. Este es el valor p asociado con el estadístico F. Indica la probabilidad de obtener el estadístico F observado (o uno más extremo) si la hipótesis nula de que no hay diferencias significativas entre los grupos es verdadera. En este caso, el valor p es 0.006, lo que sugiere que hay evidencia significativa para rechazar la hipótesis nula a un nivel de significancia convencional de 0.05.

  • ges (Generalized Eta Squared): 0.051. El índice GES es una medida de efecto que indica la proporción de la varianza total explicada por el efecto de interés. En este caso, el valor de GES es 0.051, lo que sugiere que alrededor del 5.1% de la variabilidad total puede atribuirse al efecto de interés.

En resumen, los resultados indican que hay evidencia significativa de diferencias entre los grupos, y el índice GES proporciona información sobre el tamaño del efecto, indicando que el efecto tiene un impacto en aproximadamente el 5.1% de la variabilidad total.

Calcular efecto principal simple simple

A una interacción bidireccional simple estadísticamente significativa se le pueden seguir efectos principales simples y simples

# Effect of time at each diet X exercises cells
time.effect <- EJERCICIO3 %>%
  group_by(bloque, variedad) %>%
  anova_test(dv = score, wid = ID, within = time)
time.effect
# Extract anova table
get_anova_table(time.effect) %>%
  filter(bloque == "Bloque_1")

Hubo un efecto principal simple estadísticamente significativo ## Calcular comparaciones simples simples Un efecto principal simple estadísticamente significativo puede ser seguido por múltiples comparaciones por pares para determinar qué medias de grupo son diferentes.

# Pairwise comparisons
pwc <- EJERCICIO3 %>%
  group_by(bloque, variedad) %>%
  pairwise_t_test(score ~ time, paired = TRUE, p.adjust.method = "bonferroni") %>%
  select(-df, -statistic) # Remove details
# Show comparison results for "diet:no,exercises:yes" groups
pwc %>% filter(bloque == "Bloque_1", variedad == "Var_1") %>%
  select(-p)     # remove p columns

Todas las comparaciones simples por pares se realizaron entre los diferentes puntos temporales para la prueba “bloque_1, var_1”. Se aplicó el ajuste de Bonferroni. La puntuación media d fue significativamente diferente en todas las comparaciones de puntos temporales cuando se realizaron ejercicios (p <0,05).

# Visualization: box plots with p-values
pwc <- pwc %>% add_xy_position(x = "variedad")
pwc.filtered <- pwc %>% 
  filter(bloque == "Bloque_1", variedad == "Var_1")
bxp + 
  stat_pvalue_manual(pwc.filtered, tip.length = 0, hide.ns = TRUE) +
  labs(
    subtitle = get_test_label(res.aov, detailed = TRUE),
    caption = get_pwc_label(pwc)
  )

LS0tDQp0aXRsZTogIkRBVE9TIERFIE1FRElEQVMgUkVQRVRJVElWQVMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KIyMgQU5PVkEgZGUgbWVkaWRhcyByZXBldGlkYXMgZGUgdHJlcyB2w61hcw0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeShyc3RhdGl4KQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpFSkVSQ0lDSU8zIDwtIHJlYWRfZXhjZWwoIkM6L3ZhbGUvRUpFUkNJQ0lPMy54bHN4IikNClZpZXcoRUpFUkNJQ0lPMykNCmBgYA0KDQpDYXJndWUgbG9zIGRhdG9zIHkgbXVlc3RyZSBhbGd1bmFzIGZpbGFzIGFsZWF0b3JpYXMgcG9yIGdydXBvczoNCg0KYGBge3J9DQojIFdpZGUgZm9ybWF0DQpzZXQuc2VlZCgxMjMpDQpkYXRhKCJFSkVSQ0lDSU8zICIpDQpFSkVSQ0lDSU8zICU+JSBzYW1wbGVfbl9ieShibG9xdWUsIHZhcmllZGFkLCBzaXplID0gMSkNCmBgYA0KYGBge3J9DQojIEdhdGhlciB0aGUgY29sdW1ucyB0MSwgdDIgYW5kIHQzIGludG8gbG9uZyBmb3JtYXQuDQojIENvbnZlcnQgaWQgYW5kIHRpbWUgaW50byBmYWN0b3IgdmFyaWFibGVzDQogRUpFUkNJQ0lPMyA8LSAgRUpFUkNJQ0lPMyAlPiUNCiAgZ2F0aGVyKGtleSA9ICJ0aW1lIiwgdmFsdWUgPSAic2NvcmUiLCBYMSwgWDIsIFgzLCBYNCkgJT4lDQogIGNvbnZlcnRfYXNfZmFjdG9yKElELCB0aW1lLCB2YXJpZWRhZCwgYmxvcXVlKQ0KIyBJbnNwZWN0IHNvbWUgcmFuZG9tIHJvd3Mgb2YgdGhlIGRhdGEgYnkgZ3JvdXBzDQpzZXQuc2VlZCgxMjMpDQogRUpFUkNJQ0lPMyAlPiUgc2FtcGxlX25fYnkoYmxvcXVlLCB2YXJpZWRhZCwgdGltZSwgc2l6ZSA9IDEpDQoNCmBgYA0KDQojIyBSZXN1bWVuIGVzdGFkw61zdGljbw0KQWdydXBlIGxvcyBkYXRvcyBwb3IgYmxvcXVlLCB2YXJpZWRhZCB5IHRpbWUsIHkgbHVlZ28gY2FsY3VsZSBhbGd1bmFzIGVzdGFkw61zdGljYXMgcmVzdW1pZGFzIGRlIGxhIHNjb3JldmFyaWFibGU6IG1lZGlhIHkgREUgKGRlc3ZpYWNpw7NuIGVzdMOhbmRhcikuDQoNCmBgYHtyfQ0KRUpFUkNJQ0lPMyAlPiUNCiAgZ3JvdXBfYnkoYmxvcXVlLCB2YXJpZWRhZCwgdGltZSkgJT4lDQogIGdldF9zdW1tYXJ5X3N0YXRzKHNjb3JlLCB0eXBlID0gIm1lYW5fc2QiKQ0KYGBgDQojIyBWaXN1YWxpemFjacOzbg0KDQpDcmVhIGRpYWdyYW1hcyBkZSBjYWphOg0KDQpgYGB7cn0NCmJ4cCA8LSBnZ2JveHBsb3QoDQpFSkVSQ0lDSU8zLCB4ID0gInZhcmllZGFkIiwgeSA9ICJzY29yZSIsDQogIGNvbG9yID0gInRpbWUiLCBwYWxldHRlID0gImpjbyIsDQogIGZhY2V0LmJ5ID0gImJsb3F1ZSIsIHNob3J0LnBhbmVsLmxhYnMgPSBGQUxTRQ0KICApDQpieHANCmBgYA0KIyMgVmVyaWZpcXVlIGxvcyBzdXB1ZXN0b3MNCiMjIyBWYWxvcmVzIGF0w61waWNvcw0KYGBge3J9DQogRUpFUkNJQ0lPMyU+JQ0KICBncm91cF9ieShibG9xdWUsIHZhcmllZGFkLCB0aW1lKSAlPiUNCiAgaWRlbnRpZnlfb3V0bGllcnMoc2NvcmUpDQpgYGANClNpIGh1Ym8gdmFsb3JlcyBhdGlwaWNvcyBleHRyZW1vcw0KIyMgU3VwdWVzdG8gZGUgbm9ybWFsaWRhZA0KQ2FsY3VsZSBsYSBwcnVlYmEgZGUgU2hhcGlyby1XaWxrIHBhcmEgY2FkYSBjb21iaW5hY2nDs24gZGUgbml2ZWxlcyBkZSBmYWN0b3JlczoNCmBgYHtyfQ0KRUpFUkNJQ0lPMyAlPiUNCiAgZ3JvdXBfYnkoYmxvcXVlLCB2YXJpZWRhZCwgdGltZSkgJT4lDQogIHNoYXBpcm9fdGVzdChzY29yZSkNCmBgYA0KU2UgZGlzdHJpYnV5ZSBub3JtYWxtZW50ZSAocD4wLjA1KSBwZXJvIGhheSB1bmEgbWVub3IgDQoNCmBgYHtyfQ0KZ2dxcXBsb3QoRUpFUkNJQ0lPMywgInNjb3JlIiwgZ2d0aGVtZSA9IHRoZW1lX2J3KCkpICsNCiAgZmFjZXRfZ3JpZChibG9xdWUgKyB2YXJpZWRhZCB+IHRpbWUsIGxhYmVsbGVyID0gImxhYmVsX2JvdGgiKQ0KYGBgDQpEZWwgZ3LDoWZpY28gYW50ZXJpb3IsIGNvbW8gdG9kb3MgbG9zIHB1bnRvcyBjYWVuIGFwcm94aW1hZGFtZW50ZSBhIGxvIGxhcmdvIGRlIGxhIGzDrW5lYSBkZSByZWZlcmVuY2lhLCBwb2RlbW9zIGFzdW1pciBub3JtYWxpZGFkLg0KDQojIyBjYWxjdWxvDQoNCmBgYHtyfQ0KcmVzLmFvdiA8LSBhbm92YV90ZXN0KA0KICBkYXRhID0gRUpFUkNJQ0lPMywgZHYgPSBzY29yZSwgd2lkID0gSUQsDQogIHdpdGhpbiA9IGMoYmxvcXVlLCB2YXJpZWRhZCwgdGltZSkNCiAgKQ0KZ2V0X2Fub3ZhX3RhYmxlKHJlcy5hb3YpDQpgYGANCkRlbCByZXN1bHRhZG8gYW50ZXJpb3IsIHNlIHB1ZWRlIHZlciBxdWUgZXhpc3RlbiBpbnRlcmFjY2lvbmVzIHRyaXBsZXMgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YXMgZW50cmUgZWwgYmxvcXVlLCBsYSB2YXJpZWRhZCB5IGVsIHRpZW1wbywgRig2LCAyNCkgPSAyLDQ5MiwgcCA9IDAsMDUxLg0KDQojIyBQcnVlYmFzIHBvc3QgaG9jDQojIyMgQ2FsY3VsYXIgaW50ZXJhY2Npw7NuIGJpZGlyZWNjaW9uYWwgc2ltcGxlDQpVc3RlZCBlcyBsaWJyZSBkZSBkZWNpZGlyIHF1w6kgZG9zIHZhcmlhYmxlcyBmb3JtYXLDoW4gbGFzIGludGVyYWNjaW9uZXMgYmlkaXJlY2Npb25hbGVzIHNpbXBsZXMgeSBxdcOpIHZhcmlhYmxlIGFjdHVhcsOhIGNvbW8gbGEgdGVyY2VyYSB2YXJpYWJsZSAobW9kZXJhZG9yYSkuIEVuIGVsIHNpZ3VpZW50ZSBjw7NkaWdvIFIsIGhlbW9zIGNvbnNpZGVyYWRvIGxhIGludGVyYWNjacOzbiBiaWRpcmVjY2lvbmFsIHNpbXBsZSBkZSB2YXJpZWRhZCp0aW1lIGVuIGNhZGEgbml2ZWwgZGUgYmxvcXVlLg0KDQpBZ3J1cGUgbG9zIGRhdG9zIGRpZXR5IGFuYWxpY2UgbGEgaW50ZXJhY2Npw7NuIGJpZGlyZWNjaW9uYWwgc2ltcGxlIGVudHJlIHZhcmllZGFkIHkgdGltZToNCmBgYHtyfQ0KIyBUd28td2F5IEFOT1ZBIGF0IGVhY2ggZGlldCBsZXZlbA0KdHdvLndheSA8LSBFSkVSQ0lDSU8zICU+JQ0KICBncm91cF9ieShibG9xdWUpICU+JQ0KICBhbm92YV90ZXN0KGR2ID0gc2NvcmUsIHdpZCA9IElELCB3aXRoaW4gPSBjKHZhcmllZGFkLCB0aW1lKSkNCnR3by53YXkNCmBgYA0KDQpgYGB7cn0NCiMgRXh0cmFjdCBhbm92YSB0YWJsZQ0KZ2V0X2Fub3ZhX3RhYmxlKHR3by53YXkpDQpgYGANCkxvcyBkYXRvcyBxdWUgcHJvcG9yY2lvbmFzdGUgc29uIHJlc3VsdGFkb3MgZGUgdW4gYW7DoWxpc2lzIGRlIHZhcmlhbnphIChBTk9WQSkgeSBlbCDDrW5kaWNlIEdFUyAoR2VuZXJhbGl6ZWQgRXRhIFNxdWFyZWQpLiBBcXXDrSBlc3TDoSBsYSBpbnRlcnByZXRhY2nDs246DQoNCkJsb3F1ZV8xOnZhcmllZGFkOnRpbWUNCg0KLSAqREZuIChHcmFkb3MgZGUgbGliZXJ0YWQgbnVtZXJhZG9yKToqIDYuIEluZGljYSBsb3MgZ3JhZG9zIGRlIGxpYmVydGFkIGFzb2NpYWRvcyBjb24gbGFzIGRpZmVyZW5jaWFzIGVudHJlIGxvcyBncnVwb3MgbyBjb25kaWNpb25lcyBlbiB0dSBlc3R1ZGlvLg0KDQotICpERmQgKEdyYWRvcyBkZSBsaWJlcnRhZCBkZW5vbWluYWRvcik6KiAyNC4gUmVwcmVzZW50YSBsb3MgZ3JhZG9zIGRlIGxpYmVydGFkIGFzb2NpYWRvcyBjb24gbGEgdmFyaWFiaWxpZGFkIGRlbnRybyBkZSBsb3MgZ3J1cG9zIG8gY29uZGljaW9uZXMuDQoNCi0gKkYgKEVzdGFkw61zdGljbyBGKToqIDEuMjY1LiBFbCBlc3RhZMOtc3RpY28gRiBlcyB1bmEgcmVsYWNpw7NuIGRlIHZhcmlhbnphcyB5IHNlIHV0aWxpemEgcGFyYSBldmFsdWFyIHNpIGhheSBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBsYXMgbWVkaWFzIGRlIGxvcyBncnVwb3MuIEVuIGVzdGUgY2FzbywgZWwgdmFsb3IgZGUgRiBlcyAxLjI2NS4NCg0KLSAqcCAoVmFsb3IgcCk6KiAzLjEwZS0wMS4gRXN0ZSBlcyBlbCB2YWxvciBwIGFzb2NpYWRvIGNvbiBlbCBlc3RhZMOtc3RpY28gRi4gSW5kaWNhIGxhIHByb2JhYmlsaWRhZCBkZSBvYnRlbmVyIGVsIGVzdGFkw61zdGljbyBGIG9ic2VydmFkbyAobyB1bm8gbcOhcyBleHRyZW1vKSBzaSBsYSBoaXDDs3Rlc2lzIG51bGEgZGUgcXVlIG5vIGhheSBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBsb3MgZ3J1cG9zIGVzIHZlcmRhZGVyYS4gRW4gZXN0ZSBjYXNvLCBlbCB2YWxvciBwIGVzIDAuMzEsIGxvIHF1ZSBzdWdpZXJlIHF1ZSBubyBoYXkgZXZpZGVuY2lhIHN1ZmljaWVudGUgcGFyYSByZWNoYXphciBsYSBoaXDDs3Rlc2lzIG51bGEgYSB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGNvbnZlbmNpb25hbCBkZSAwLjA1Lg0KDQotICpnZXMgKEdlbmVyYWxpemVkIEV0YSBTcXVhcmVkKToqIDAuMDIyLiBFbCDDrW5kaWNlIEdFUyBlcyB1bmEgbWVkaWRhIGRlIGVmZWN0byBxdWUgaW5kaWNhIGxhIHByb3BvcmNpw7NuIGRlIGxhIHZhcmlhbnphIHRvdGFsIGV4cGxpY2FkYSBwb3IgZWwgZWZlY3RvIGRlIGludGVyw6lzLiBFbiBlc3RlIGNhc28sIGVsIHZhbG9yIGRlIEdFUyBlcyAwLjAyMiwgbG8gcXVlIHN1Z2llcmUgcXVlIGFscmVkZWRvciBkZWwgMi4yJSBkZSBsYSB2YXJpYWJpbGlkYWQgdG90YWwgcHVlZGUgYXRyaWJ1aXJzZSBhbCBlZmVjdG8gZGUgaW50ZXLDqXMuDQoNCkVuIHJlc3VtZW4sIGxvcyByZXN1bHRhZG9zIGluZGljYW4gcXVlIG5vIGhheSBldmlkZW5jaWEgc2lnbmlmaWNhdGl2YSBwYXJhIGRpZmVyZW5jaWFzIGVudHJlIGxvcyBncnVwb3MsIHkgZWwgw61uZGljZSBHRVMgcHJvcG9yY2lvbmEgaW5mb3JtYWNpw7NuIHNvYnJlIGVsIHRhbWHDsW8gZGVsIGVmZWN0by4gRXMgaW1wb3J0YW50ZSBjb25zaWRlcmFyIGVsIGNvbnRleHRvIGRlIHR1IGVzdHVkaW8geSBsYSByZWxldmFuY2lhIHByw6FjdGljYSBkZSBlc3RvcyByZXN1bHRhZG9zLg0KDQpibG9xdWVfMjogdmFyaWVkYWQ6dGltZSANCkVuIGVsIGNvbnRleHRvIGRlIHVuIGFuw6FsaXNpcyBkZSB2YXJpYW56YSAoQU5PVkEpLCBsb3MgZGF0b3MgcXVlIHByb3BvcmNpb25hc3RlIHJlcHJlc2VudGFuIHJlc3VsdGFkb3MgZXN0YWTDrXN0aWNvcyBjbGF2ZS4gQXF1w60gZXN0w6EgbGEgaW50ZXJwcmV0YWNpw7NuOg0KDQotICpERm4gKEdyYWRvcyBkZSBsaWJlcnRhZCBudW1lcmFkb3IpOiogNi4gSW5kaWNhIGxvcyBncmFkb3MgZGUgbGliZXJ0YWQgYXNvY2lhZG9zIGNvbiBsYXMgZGlmZXJlbmNpYXMgZW50cmUgbG9zIGdydXBvcyBvIGNvbmRpY2lvbmVzIGVuIHR1IGVzdHVkaW8uDQoNCi0gKkRGZCAoR3JhZG9zIGRlIGxpYmVydGFkIGRlbm9taW5hZG9yKToqIDI0LiBSZXByZXNlbnRhIGxvcyBncmFkb3MgZGUgbGliZXJ0YWQgYXNvY2lhZG9zIGNvbiBsYSB2YXJpYWJpbGlkYWQgZGVudHJvIGRlIGxvcyBncnVwb3MgbyBjb25kaWNpb25lcy4NCg0KLSAqRiAoRXN0YWTDrXN0aWNvIEYpOiogNC4wMjIuIEVsIGVzdGFkw61zdGljbyBGIGVzIHVuYSByZWxhY2nDs24gZGUgdmFyaWFuemFzIHkgc2UgdXRpbGl6YSBwYXJhIGV2YWx1YXIgc2kgaGF5IGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGxhcyBtZWRpYXMgZGUgbG9zIGdydXBvcy4gRW4gZXN0ZSBjYXNvLCBlbCB2YWxvciBkZSBGIGVzIDQuMDIyLg0KDQotICpwIChWYWxvciBwKToqIDYuMDBlLTAzLiBFc3RlIGVzIGVsIHZhbG9yIHAgYXNvY2lhZG8gY29uIGVsIGVzdGFkw61zdGljbyBGLiBJbmRpY2EgbGEgcHJvYmFiaWxpZGFkIGRlIG9idGVuZXIgZWwgZXN0YWTDrXN0aWNvIEYgb2JzZXJ2YWRvIChvIHVubyBtw6FzIGV4dHJlbW8pIHNpIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBxdWUgbm8gaGF5IGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGxvcyBncnVwb3MgZXMgdmVyZGFkZXJhLiBFbiBlc3RlIGNhc28sIGVsIHZhbG9yIHAgZXMgMC4wMDYsIGxvIHF1ZSBzdWdpZXJlIHF1ZSBoYXkgZXZpZGVuY2lhIHNpZ25pZmljYXRpdmEgcGFyYSByZWNoYXphciBsYSBoaXDDs3Rlc2lzIG51bGEgYSB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGNvbnZlbmNpb25hbCBkZSAwLjA1Lg0KDQotICpnZXMgKEdlbmVyYWxpemVkIEV0YSBTcXVhcmVkKToqIDAuMDUxLiBFbCDDrW5kaWNlIEdFUyBlcyB1bmEgbWVkaWRhIGRlIGVmZWN0byBxdWUgaW5kaWNhIGxhIHByb3BvcmNpw7NuIGRlIGxhIHZhcmlhbnphIHRvdGFsIGV4cGxpY2FkYSBwb3IgZWwgZWZlY3RvIGRlIGludGVyw6lzLiBFbiBlc3RlIGNhc28sIGVsIHZhbG9yIGRlIEdFUyBlcyAwLjA1MSwgbG8gcXVlIHN1Z2llcmUgcXVlIGFscmVkZWRvciBkZWwgNS4xJSBkZSBsYSB2YXJpYWJpbGlkYWQgdG90YWwgcHVlZGUgYXRyaWJ1aXJzZSBhbCBlZmVjdG8gZGUgaW50ZXLDqXMuDQoNCkVuIHJlc3VtZW4sIGxvcyByZXN1bHRhZG9zIGluZGljYW4gcXVlIGhheSBldmlkZW5jaWEgc2lnbmlmaWNhdGl2YSBkZSBkaWZlcmVuY2lhcyBlbnRyZSBsb3MgZ3J1cG9zLCB5IGVsIMOtbmRpY2UgR0VTIHByb3BvcmNpb25hIGluZm9ybWFjacOzbiBzb2JyZSBlbCB0YW1hw7FvIGRlbCBlZmVjdG8sIGluZGljYW5kbyBxdWUgZWwgZWZlY3RvIHRpZW5lIHVuIGltcGFjdG8gZW4gYXByb3hpbWFkYW1lbnRlIGVsIDUuMSUgZGUgbGEgdmFyaWFiaWxpZGFkIHRvdGFsLg0KDQojIyBDYWxjdWxhciBlZmVjdG8gcHJpbmNpcGFsIHNpbXBsZSBzaW1wbGUNCkEgdW5hIGludGVyYWNjacOzbiBiaWRpcmVjY2lvbmFsIHNpbXBsZSBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIHNlIGxlIHB1ZWRlbiBzZWd1aXIgZWZlY3RvcyBwcmluY2lwYWxlcyBzaW1wbGVzIHkgc2ltcGxlcw0KDQpgYGB7cn0NCiMgRWZmZWN0IG9mIHRpbWUgYXQgZWFjaCBkaWV0IFggZXhlcmNpc2VzIGNlbGxzDQp0aW1lLmVmZmVjdCA8LSBFSkVSQ0lDSU8zICU+JQ0KICBncm91cF9ieShibG9xdWUsIHZhcmllZGFkKSAlPiUNCiAgYW5vdmFfdGVzdChkdiA9IHNjb3JlLCB3aWQgPSBJRCwgd2l0aGluID0gdGltZSkNCnRpbWUuZWZmZWN0DQpgYGANCmBgYHtyfQ0KIyBFeHRyYWN0IGFub3ZhIHRhYmxlDQpnZXRfYW5vdmFfdGFibGUodGltZS5lZmZlY3QpICU+JQ0KICBmaWx0ZXIoYmxvcXVlID09ICJCbG9xdWVfMSIpDQpgYGANCkh1Ym8gdW4gZWZlY3RvIHByaW5jaXBhbCBzaW1wbGUgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2bw0KIyMgQ2FsY3VsYXIgY29tcGFyYWNpb25lcyBzaW1wbGVzIHNpbXBsZXMNClVuIGVmZWN0byBwcmluY2lwYWwgc2ltcGxlIGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdm8gcHVlZGUgc2VyIHNlZ3VpZG8gcG9yIG3Dumx0aXBsZXMgY29tcGFyYWNpb25lcyBwb3IgcGFyZXMgcGFyYSBkZXRlcm1pbmFyIHF1w6kgbWVkaWFzIGRlIGdydXBvIHNvbiBkaWZlcmVudGVzLg0KYGBge3J9DQojIFBhaXJ3aXNlIGNvbXBhcmlzb25zDQpwd2MgPC0gRUpFUkNJQ0lPMyAlPiUNCiAgZ3JvdXBfYnkoYmxvcXVlLCB2YXJpZWRhZCkgJT4lDQogIHBhaXJ3aXNlX3RfdGVzdChzY29yZSB+IHRpbWUsIHBhaXJlZCA9IFRSVUUsIHAuYWRqdXN0Lm1ldGhvZCA9ICJib25mZXJyb25pIikgJT4lDQogIHNlbGVjdCgtZGYsIC1zdGF0aXN0aWMpICMgUmVtb3ZlIGRldGFpbHMNCiMgU2hvdyBjb21wYXJpc29uIHJlc3VsdHMgZm9yICJkaWV0Om5vLGV4ZXJjaXNlczp5ZXMiIGdyb3Vwcw0KcHdjICU+JSBmaWx0ZXIoYmxvcXVlID09ICJCbG9xdWVfMSIsIHZhcmllZGFkID09ICJWYXJfMSIpICU+JQ0KICBzZWxlY3QoLXApICAgICAjIHJlbW92ZSBwIGNvbHVtbnMNCmBgYA0KVG9kYXMgbGFzIGNvbXBhcmFjaW9uZXMgc2ltcGxlcyBwb3IgcGFyZXMgc2UgcmVhbGl6YXJvbiBlbnRyZSBsb3MgZGlmZXJlbnRlcyBwdW50b3MgdGVtcG9yYWxlcyBwYXJhIGxhIHBydWViYSDigJxibG9xdWVfMSwgdmFyXzHigJ0uIFNlIGFwbGljw7MgZWwgYWp1c3RlIGRlIEJvbmZlcnJvbmkuIExhIHB1bnR1YWNpw7NuIG1lZGlhIGQgZnVlIHNpZ25pZmljYXRpdmFtZW50ZSBkaWZlcmVudGUgZW4gdG9kYXMgbGFzIGNvbXBhcmFjaW9uZXMgZGUgcHVudG9zIHRlbXBvcmFsZXMgY3VhbmRvIHNlIHJlYWxpemFyb24gZWplcmNpY2lvcyAocCA8MCwwNSkuDQoNCmBgYHtyfQ0KIyBWaXN1YWxpemF0aW9uOiBib3ggcGxvdHMgd2l0aCBwLXZhbHVlcw0KcHdjIDwtIHB3YyAlPiUgYWRkX3h5X3Bvc2l0aW9uKHggPSAidmFyaWVkYWQiKQ0KcHdjLmZpbHRlcmVkIDwtIHB3YyAlPiUgDQogIGZpbHRlcihibG9xdWUgPT0gIkJsb3F1ZV8xIiwgdmFyaWVkYWQgPT0gIlZhcl8xIikNCmJ4cCArIA0KICBzdGF0X3B2YWx1ZV9tYW51YWwocHdjLmZpbHRlcmVkLCB0aXAubGVuZ3RoID0gMCwgaGlkZS5ucyA9IFRSVUUpICsNCiAgbGFicygNCiAgICBzdWJ0aXRsZSA9IGdldF90ZXN0X2xhYmVsKHJlcy5hb3YsIGRldGFpbGVkID0gVFJVRSksDQogICAgY2FwdGlvbiA9IGdldF9wd2NfbGFiZWwocHdjKQ0KICApDQpgYGANCg0K