library(ggplot2)
library(dplyr)
library(tidyr)
library(magrittr)
# Data wrangling done in exp6_setup_nb.Rmd
# Read in data
ratings_data_incl <- read.csv(file = "exp6_ratings.csv")

# Remove excluded participants' data
ratings_data_incl %>%
  subset(!(prolific_id %in% excluded)) %>%
  droplevels -> ratings_data_excl

ratings_data_excl$env <- relevel(ratings_data_excl$env, "vt")
ratings_data_excl$env <- relevel(ratings_data_excl$env, "ee")
ratings_data_excl$env <- relevel(ratings_data_excl$env, "complement")
ratings_data_excl$length <- relevel(ratings_data_excl$length, "short")
ratings_data_excl$structure <- relevel(ratings_data_excl$structure, "non-island")

# Add z-scores (by participant) for use later, INCLUDING burn-in trials
ratings_data_excl %>%
  subset(type == "experimental" | type == "filler" | type == "burn-in" | type == "burn-in_filler") %>%
  droplevels %>%
  group_by(prolific_id) %>%
  mutate(z_rating_all = scale(rating)) -> ratings_data_all

# Add z-scores (by participant) for use later, EXCLUDING burn-in trials
ratings_data_all %>%
  subset(type == "experimental" | type == "filler") %>%
  droplevels %>%
  group_by(prolific_id) %>%
  mutate(z_rating = scale(rating)) -> ratings_data

# Get experiment data
ratings_data %>%
  subset(type == "experimental") %>%
  droplevels -> exp_data

# Get filler data
ratings_data %>%
  subset(type == "filler") %>%
  droplevels -> filler_data

1 Descriptive stats


# Get summary of experiment data
exp_data %>%
  group_by(env,
           structure,
           length) %>%
  summarize(mean_rating = mean(rating),
            sd_rating = sd(rating),
            n = n(),
            se_rating = sd_rating/sqrt(n)) -> summary
print(summary)
# Reorder levels
exp_data$env <- relevel(exp_data$env, "ee")
exp_data$env <- relevel(exp_data$env, "vt")
exp_data$length <- relevel(exp_data$length, "short")
exp_data$structure <- relevel(exp_data$structure, "non-island")

# Get summary of experiment data
exp_data %>%
  group_by(env,
           structure,
           length) %>%
  summarize(mean_rating = mean(rating),
            sd_rating = sd(rating),
            n = n(),
            se_rating = sd_rating/sqrt(n)) -> summary
print(summary)
# Make a descriptive plot
summary_forplot <- summary
summary_forplot[7,] <- summary_forplot[5,]
summary_forplot[8,] <- summary_forplot[6,]
summary_forplot$environment <- summary_forplot$env
summary_forplot$environment[5:6] <- c("vt", "vt")
summary_forplot$environment[7:8] <- c("ee", "ee")
summary_forplot$environment <- recode(summary_forplot$environment, vt = "VT", ee = "EE")

summary_forplot %>%
  ggplot(aes(x = length,
             y = mean_rating,
             ymin = 1,
             ymax = 6,
             color = structure,
             group = structure)) +
  facet_grid(.~environment) +
  geom_errorbar(aes(ymin = mean_rating - se_rating,
                    ymax = mean_rating + se_rating),
                width = 0.15) +
  geom_point(aes(col = structure),
             size = 2) +
  scale_y_continuous(breaks = seq(1:6)) +
  scale_color_discrete("Structure",
                       labels = c("Non-island",
                                  "Island")) +
  labs(x = "Length",
       y = "Mean rating") -> plot_summary
print(plot_summary)


# Make an alternative plot
summary_forplot %>%
  ggplot(aes(x = length,
             y = mean_rating,
             color = env,
             ymin = 1,
             ymax = 6)) +
  geom_point(size = 2) +
  geom_errorbar(aes(ymin = mean_rating - se_rating,
                    ymax = mean_rating + se_rating),
                width = 0.15) + 
  labs(title = "Main items") -> plot_summary_collapsed
print(plot_summary_collapsed)

1.1 Breakdown by verb

exp_data %>%
  subset(structure == "island") %>%
  group_by(length,
           structure,
           verb, env) %>%
  summarize(mean_rating = mean(rating),
            sd_rating = sd(rating),
            n = n(),
            se_rating = sd_rating/sqrt(n)) -> vbv_summary
print(vbv_summary)

for (vb in 1:length(unique(vbv_summary$verb))) {
  which.verb <- unique(vbv_summary$verb)[vb]
  vbv_summary %>%
    subset(verb == which.verb) %>%
    ggplot(aes(x = length,
               y = mean_rating,
               color = structure,
               group = structure,
               ymin = 1,
               ymax = 6)) +
    scale_y_continuous(breaks = seq(1:6)) +
    geom_point(data = subset(summary,
                             structure == "non-island"),
               aes(x = length,
                   y = mean_rating)) +
    geom_errorbar(data = subset(summary,
                                structure == "non-island"),
                  aes(ymin = mean_rating - se_rating,
                      ymax = mean_rating + se_rating),
                  width = 0.15) +
    geom_point(aes(col = structure),
               size = 2) +
    geom_errorbar(aes(ymin = mean_rating - se_rating,
                      ymax = mean_rating + se_rating),
                  width = 0.15) +
    labs(title = paste0(as.character(which.verb), " (", vbv_summary$env[vbv_summary$verb == which.verb], ")"),
         x = "Length",
         y = "Mean rating") -> plot
  print(plot)
}

1.1.1 DD scores by verb

# Save baseline data
exp_data %>%
  subset(structure == "non-island") %>%
  droplevels %>%
  group_by(length) %>%
  summarize(mean_z_rating = mean(z_rating)) -> baseline_z_ratings

# Get DD scores for each verb
exp_data %>%
  subset(structure == "island") %>%
  droplevels %>%
  group_by(verb, env) %>%
  summarize(mean_z_rating = mean(z_rating),
            isl_sh = mean(z_rating[length == "short"]),
            isl_l = mean(z_rating[length == "long"]),
            nisl_sh = baseline_z_ratings$mean_z_rating[1],
            nisl_l = baseline_z_ratings$mean_z_rating[2],
            d1 = nisl_l - isl_l,
            d2 = nisl_sh - isl_sh,
            dd = d1 - d2) -> vbv_dd
print(vbv_dd)

# Plot verbs by DD score
vbv_dd %>%
  subset(select = c(verb, env, dd)) %>%
  ggplot(aes(x = reorder(verb, dd),
             y = dd,
             fill = env)) +
  geom_col() + 
  scale_fill_discrete(name = "Environment",
                      labels = c("VT", "EE")) +
  labs(x = "Verb",
       y = "DD score")

1.2 Burn-in items (vs. main items)

ratings_data_excl %>%
  subset(type == "burn-in") %>%
  group_by(env, 
           structure,
           length) %>%
  summarize(mean_rating = mean(rating),
            sd_rating = sd(rating),
            n = n(),
            se_rating = sd_rating/sqrt(n)) -> summary_burn_in

print(summary_burn_in)
summary_burn_in %>%
  ggplot(aes(x = length,
             y = mean_rating,
             color = env,
             ymin = 1,
             ymax = 6)) +
  geom_point(size = 2) +
  geom_errorbar(aes(ymin = mean_rating - se_rating,
                    ymax = mean_rating + se_rating),
                width = 0.15) + 
  labs(title = "Burn-in items") -> plot_summary_burn_in
print(plot_summary_burn_in)

# Compare
print(plot_summary_collapsed)

# Considering burn-in and main items together
ratings_data_excl %>%
  subset(type == "experimental" | type == "burn-in") %>%
  droplevels %>%
  group_by(env,
           structure,
           length) %>%
  summarize(mean_rating = mean(rating),
            sd_rating = sd(rating),
            n = n(),
            se_rating = sd_rating/sqrt(n)) -> summary_combined
print(summary_combined)
# Plot
summary_combined %>%
  ggplot(aes(x = length,
             y = mean_rating,
             color = env,
             ymin = 1,
             ymax = 6)) +
  geom_point(size = 2) +
  geom_errorbar(aes(ymin = mean_rating - se_rating,
                    ymax = mean_rating + se_rating),
                width = 0.15) + 
  labs(title = "Combined burn-in and main items") -> plot_summary_combined
print(plot_summary_combined)

1.3 Trial order effects

ratings_data_excl %>%
  subset(type == "experimental" | type == "burn-in") %>%
  droplevels %>%
  subset(length == "long") %>%
  droplevels -> ratings_data_excl_combined

# Order the data frame by prolific id and trial
ratings_data_excl_combined_ordered <- ratings_data_excl_combined[order(ratings_data_excl_combined$epoch_time,
                                                                       ratings_data_excl_combined$env,
                                                                       ratings_data_excl_combined$trial),]

# Add new col for equalized trial
# Get number of observations per participant
obs <- nrow(ratings_data_excl_combined_ordered[ratings_data_excl_combined_ordered$epoch_time ==  min(ratings_data_excl_combined_ordered$epoch_time),])
ratings_data_excl_combined_ordered$trial_eq <- 1:(obs/3)

# Plot the ratings and draw a line
ratings_data_excl_combined_ordered %>%
  ggplot(aes(x = trial_eq,
             y = z_rating,
             color = env,
             group = env)) +
  geom_jitter() + 
  geom_smooth(method = "lm") -> plot_trial_order
print(plot_trial_order)

2 CLMs

2.1 Simple effects analysis

library(ordinal)

Attaching package: ‘ordinal’

The following object is masked from ‘package:dplyr’:

    slice
# Make sure nominal variables are coded as factors
exp_data$rating %<>% as.factor
exp_data$env %<>% as.factor
exp_data$structure %<>% as.factor
exp_data$length %<>% as.factor

# Sum code structure and length factors
contrasts(exp_data$structure) <- c(-0.5, 0.5)
contrasts(exp_data$length) <- c(-0.5, 0.5)
# Contrasts for env factor should be dummy-coded correctly by default after reordering the factors

clm(data = exp_data,
    formula = rating ~ env * length) -> clm_analysis
summary(clm_analysis)
formula: rating ~ env * length
data:    exp_data

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
envee          -1.3305     0.1696  -7.844 4.37e-15 ***
envvt          -1.6752     0.1748  -9.586  < 2e-16 ***
length1         0.2813     0.2370   1.187    0.235    
envee:length1  -2.6726     0.3394  -7.874 3.42e-15 ***
envvt:length1  -2.5573     0.3438  -7.437 1.03e-13 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Threshold coefficients:
    Estimate Std. Error z value
1|2  -3.8944     0.1971 -19.754
2|3  -2.6209     0.1634 -16.044
3|4  -1.5535     0.1411 -11.013
4|5  -0.5841     0.1270  -4.599
5|6   0.5289     0.1263   4.188

2.2 Mixed effects analysis

# Save the ratings data to run on hb.ucsc.edu
saveRDS(exp_data,
        file = "ratings_data_for_clmm.rds")

# Run the following clmm on the cluster:
# clmm(data = exp_data,
#      formula = rating ~ env * length +
#      (1 + env * length | prolific_id) +
#      (1 + env * length | item)) -> clmm_analysis
# saveRDS(clmm_analysis, "exp6_clmm.rds")
 
# Read in RDS from cluster
clmm_analysis <- readRDS(file = "exp6_clmm.rds")
summary(clmm_analysis)
Variance-covariance matrix of the parameters is not defined
Cumulative Link Mixed Model fitted with the Laplace approximation

formula: rating ~ env * length + (1 + env * length | prolific_id) + (1 +      env * length | item)
data:    ratings_data_excl_baselines

Random effects:
 Groups      Name             Variance Std.Dev. Corr                               
 prolific_id (Intercept)      7.2111   2.6854                                      
             envee            0.5457   0.7387   -0.892                             
             envvt            1.5785   1.2564   -0.523  0.840                      
             lengthlong       1.0150   1.0075   -0.856  0.739  0.293               
             envee:lengthlong 2.0579   1.4345   -0.232  0.445  0.658 -0.077        
             envvt:lengthlong 1.5228   1.2340   -0.373  0.262  0.116  0.211  0.702 
 item        (Intercept)      0.3197   0.5654                                      
             envee            0.7320   0.8555   -0.292                             
             envvt            0.2181   0.4670    0.322 -0.677                      
             lengthlong       3.2911   1.8141    0.224 -0.828  0.577               
             envee:lengthlong 0.9801   0.9900   -0.238  0.647 -0.465 -0.961        
             envvt:lengthlong 7.2584   2.6941   -0.418  0.927 -0.497 -0.911  0.808 
Number of groups:  prolific_id 30,  item 24 

Coefficients:
              Estimate Std. Error z value Pr(>|z|)
envee          -2.3324         NA      NA       NA
envvt          -2.8870         NA      NA       NA
length1         0.5469         NA      NA       NA
envee:length1  -4.7146         NA      NA       NA
envvt:length1  -4.3064         NA      NA       NA

Threshold coefficients:
    Estimate Std. Error z value
1|2  -6.5216         NA      NA
2|3  -4.5322         NA      NA
3|4  -2.8098         NA      NA
4|5  -1.1472         NA      NA
5|6   0.9454         NA      NA
LS0tCnRpdGxlOiAiUkMgc3ViZXh0cmFjdGlvbiBpbiBFbmdsaXNoOiBFeHBlcmltZW50IDYgbm90ZWJvb2siCmF1dGhvcjogIkpha2UgVy4gVmluY2VudCAoJiMxMDY7JiMxMTk7JiMxMTg7JiMxMDU7JiMxMTA7JiM5OTsmIzEwMTtuJiM2NDsmIzExNztjJiMxMTU7Yy5lJiMxMDA7dSkiCm91dHB1dDoKICBodG1sX25vdGVib29rOiAKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0aGVtZTogZmxhdGx5CiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGNzczogc3R5bGUuY3NzCiAgICB0b2M6IHRydWUKICBwZGZfZG9jdW1lbnQ6IAogICAga2VlcF90ZXg6IHllcwpiaWJsaW9ncmFwaHk6IH4vRG9jdW1lbnRzL2xpYnJhcnkuYmliCi0tLQpgYGB7ciBzZXR1cH0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KG1hZ3JpdHRyKQpgYGAKCmBgYHtyfQojIERhdGEgd3JhbmdsaW5nIGRvbmUgaW4gZXhwNl9zZXR1cF9uYi5SbWQKIyBSZWFkIGluIGRhdGEKcmF0aW5nc19kYXRhX2luY2wgPC0gcmVhZC5jc3YoZmlsZSA9ICJleHA2X3JhdGluZ3MuY3N2IikKCiMgUmVtb3ZlIGV4Y2x1ZGVkIHBhcnRpY2lwYW50cycgZGF0YQpyYXRpbmdzX2RhdGFfaW5jbCAlPiUKICBzdWJzZXQoIShwcm9saWZpY19pZCAlaW4lIGV4Y2x1ZGVkKSkgJT4lCiAgZHJvcGxldmVscyAtPiByYXRpbmdzX2RhdGFfZXhjbAoKcmF0aW5nc19kYXRhX2V4Y2wkZW52IDwtIHJlbGV2ZWwocmF0aW5nc19kYXRhX2V4Y2wkZW52LCAidnQiKQpyYXRpbmdzX2RhdGFfZXhjbCRlbnYgPC0gcmVsZXZlbChyYXRpbmdzX2RhdGFfZXhjbCRlbnYsICJlZSIpCnJhdGluZ3NfZGF0YV9leGNsJGVudiA8LSByZWxldmVsKHJhdGluZ3NfZGF0YV9leGNsJGVudiwgImNvbXBsZW1lbnQiKQpyYXRpbmdzX2RhdGFfZXhjbCRsZW5ndGggPC0gcmVsZXZlbChyYXRpbmdzX2RhdGFfZXhjbCRsZW5ndGgsICJzaG9ydCIpCnJhdGluZ3NfZGF0YV9leGNsJHN0cnVjdHVyZSA8LSByZWxldmVsKHJhdGluZ3NfZGF0YV9leGNsJHN0cnVjdHVyZSwgIm5vbi1pc2xhbmQiKQoKIyBBZGQgei1zY29yZXMgKGJ5IHBhcnRpY2lwYW50KSBmb3IgdXNlIGxhdGVyLCBJTkNMVURJTkcgYnVybi1pbiB0cmlhbHMKcmF0aW5nc19kYXRhX2V4Y2wgJT4lCiAgc3Vic2V0KHR5cGUgPT0gImV4cGVyaW1lbnRhbCIgfCB0eXBlID09ICJmaWxsZXIiIHwgdHlwZSA9PSAiYnVybi1pbiIgfCB0eXBlID09ICJidXJuLWluX2ZpbGxlciIpICU+JQogIGRyb3BsZXZlbHMgJT4lCiAgZ3JvdXBfYnkocHJvbGlmaWNfaWQpICU+JQogIG11dGF0ZSh6X3JhdGluZ19hbGwgPSBzY2FsZShyYXRpbmcpKSAtPiByYXRpbmdzX2RhdGFfYWxsCgojIEFkZCB6LXNjb3JlcyAoYnkgcGFydGljaXBhbnQpIGZvciB1c2UgbGF0ZXIsIEVYQ0xVRElORyBidXJuLWluIHRyaWFscwpyYXRpbmdzX2RhdGFfYWxsICU+JQogIHN1YnNldCh0eXBlID09ICJleHBlcmltZW50YWwiIHwgdHlwZSA9PSAiZmlsbGVyIikgJT4lCiAgZHJvcGxldmVscyAlPiUKICBncm91cF9ieShwcm9saWZpY19pZCkgJT4lCiAgbXV0YXRlKHpfcmF0aW5nID0gc2NhbGUocmF0aW5nKSkgLT4gcmF0aW5nc19kYXRhCgojIEdldCBleHBlcmltZW50IGRhdGEKcmF0aW5nc19kYXRhICU+JQogIHN1YnNldCh0eXBlID09ICJleHBlcmltZW50YWwiKSAlPiUKICBkcm9wbGV2ZWxzIC0+IGV4cF9kYXRhCgojIEdldCBmaWxsZXIgZGF0YQpyYXRpbmdzX2RhdGEgJT4lCiAgc3Vic2V0KHR5cGUgPT0gImZpbGxlciIpICU+JQogIGRyb3BsZXZlbHMgLT4gZmlsbGVyX2RhdGEKYGBgCgojIERlc2NyaXB0aXZlIHN0YXRzCgpgYGB7ciBkZXNjcmlwdGl2ZV9zdW1tYXJ5fQojIEdldCBzdW1tYXJ5IG9mIGV4cGVyaW1lbnQgZGF0YQpleHBfZGF0YSAlPiUKICBncm91cF9ieShlbnYsCiAgICAgICAgICAgc3RydWN0dXJlLAogICAgICAgICAgIGxlbmd0aCkgJT4lCiAgc3VtbWFyaXplKG1lYW5fcmF0aW5nID0gbWVhbihyYXRpbmcpLAogICAgICAgICAgICBzZF9yYXRpbmcgPSBzZChyYXRpbmcpLAogICAgICAgICAgICBuID0gbigpLAogICAgICAgICAgICBzZV9yYXRpbmcgPSBzZF9yYXRpbmcvc3FydChuKSkgLT4gc3VtbWFyeQpwcmludChzdW1tYXJ5KQpgYGAKCmBgYHtyIGRlc2NyaXB0aXZlX3Bsb3R9CiMgTWFrZSBhIGRlc2NyaXB0aXZlIHBsb3QKc3VtbWFyeV9mb3JwbG90IDwtIHN1bW1hcnkKc3VtbWFyeV9mb3JwbG90WzcsXSA8LSBzdW1tYXJ5X2ZvcnBsb3RbNSxdCnN1bW1hcnlfZm9ycGxvdFs4LF0gPC0gc3VtbWFyeV9mb3JwbG90WzYsXQpzdW1tYXJ5X2ZvcnBsb3QkZW52aXJvbm1lbnQgPC0gc3VtbWFyeV9mb3JwbG90JGVudgpzdW1tYXJ5X2ZvcnBsb3QkZW52aXJvbm1lbnRbNTo2XSA8LSBjKCJ2dCIsICJ2dCIpCnN1bW1hcnlfZm9ycGxvdCRlbnZpcm9ubWVudFs3OjhdIDwtIGMoImVlIiwgImVlIikKc3VtbWFyeV9mb3JwbG90JGVudmlyb25tZW50IDwtIHJlY29kZShzdW1tYXJ5X2ZvcnBsb3QkZW52aXJvbm1lbnQsIHZ0ID0gIlZUIiwgZWUgPSAiRUUiKQoKc3VtbWFyeV9mb3JwbG90ICU+JQogIGdncGxvdChhZXMoeCA9IGxlbmd0aCwKICAgICAgICAgICAgIHkgPSBtZWFuX3JhdGluZywKICAgICAgICAgICAgIHltaW4gPSAxLAogICAgICAgICAgICAgeW1heCA9IDYsCiAgICAgICAgICAgICBjb2xvciA9IHN0cnVjdHVyZSwKICAgICAgICAgICAgIGdyb3VwID0gc3RydWN0dXJlKSkgKwogIGZhY2V0X2dyaWQoLn5lbnZpcm9ubWVudCkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuX3JhdGluZyAtIHNlX3JhdGluZywKICAgICAgICAgICAgICAgICAgICB5bWF4ID0gbWVhbl9yYXRpbmcgKyBzZV9yYXRpbmcpLAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjE1KSArCiAgZ2VvbV9wb2ludChhZXMoY29sID0gc3RydWN0dXJlKSwKICAgICAgICAgICAgIHNpemUgPSAyKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxOjYpKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUoIlN0cnVjdHVyZSIsCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTm9uLWlzbGFuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSXNsYW5kIikpICsKICBsYWJzKHggPSAiTGVuZ3RoIiwKICAgICAgIHkgPSAiTWVhbiByYXRpbmciKSAtPiBwbG90X3N1bW1hcnkKcHJpbnQocGxvdF9zdW1tYXJ5KQoKIyBNYWtlIGFuIGFsdGVybmF0aXZlIHBsb3QKc3VtbWFyeV9mb3JwbG90ICU+JQogIGdncGxvdChhZXMoeCA9IGxlbmd0aCwKICAgICAgICAgICAgIHkgPSBtZWFuX3JhdGluZywKICAgICAgICAgICAgIGNvbG9yID0gZW52LAogICAgICAgICAgICAgeW1pbiA9IDEsCiAgICAgICAgICAgICB5bWF4ID0gNikpICsKICBnZW9tX3BvaW50KHNpemUgPSAyKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1lYW5fcmF0aW5nIC0gc2VfcmF0aW5nLAogICAgICAgICAgICAgICAgICAgIHltYXggPSBtZWFuX3JhdGluZyArIHNlX3JhdGluZyksCiAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMTUpICsgCiAgbGFicyh0aXRsZSA9ICJNYWluIGl0ZW1zIikgLT4gcGxvdF9zdW1tYXJ5X2NvbGxhcHNlZApwcmludChwbG90X3N1bW1hcnlfY29sbGFwc2VkKQpgYGAKCiMjIEJyZWFrZG93biBieSB2ZXJiCgpgYGB7ciB2ZXJiX2JyZWFrZG93bn0KZXhwX2RhdGEgJT4lCiAgc3Vic2V0KHN0cnVjdHVyZSA9PSAiaXNsYW5kIikgJT4lCiAgZ3JvdXBfYnkobGVuZ3RoLAogICAgICAgICAgIHN0cnVjdHVyZSwKICAgICAgICAgICB2ZXJiLCBlbnYpICU+JQogIHN1bW1hcml6ZShtZWFuX3JhdGluZyA9IG1lYW4ocmF0aW5nKSwKICAgICAgICAgICAgc2RfcmF0aW5nID0gc2QocmF0aW5nKSwKICAgICAgICAgICAgbiA9IG4oKSwKICAgICAgICAgICAgc2VfcmF0aW5nID0gc2RfcmF0aW5nL3NxcnQobikpIC0+IHZidl9zdW1tYXJ5CnByaW50KHZidl9zdW1tYXJ5KQoKZm9yICh2YiBpbiAxOmxlbmd0aCh1bmlxdWUodmJ2X3N1bW1hcnkkdmVyYikpKSB7CiAgd2hpY2gudmVyYiA8LSB1bmlxdWUodmJ2X3N1bW1hcnkkdmVyYilbdmJdCiAgdmJ2X3N1bW1hcnkgJT4lCiAgICBzdWJzZXQodmVyYiA9PSB3aGljaC52ZXJiKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IGxlbmd0aCwKICAgICAgICAgICAgICAgeSA9IG1lYW5fcmF0aW5nLAogICAgICAgICAgICAgICBjb2xvciA9IHN0cnVjdHVyZSwKICAgICAgICAgICAgICAgZ3JvdXAgPSBzdHJ1Y3R1cmUsCiAgICAgICAgICAgICAgIHltaW4gPSAxLAogICAgICAgICAgICAgICB5bWF4ID0gNikpICsKICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMTo2KSkgKwogICAgZ2VvbV9wb2ludChkYXRhID0gc3Vic2V0KHN1bW1hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlID09ICJub24taXNsYW5kIiksCiAgICAgICAgICAgICAgIGFlcyh4ID0gbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgeSA9IG1lYW5fcmF0aW5nKSkgKwogICAgZ2VvbV9lcnJvcmJhcihkYXRhID0gc3Vic2V0KHN1bW1hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlID09ICJub24taXNsYW5kIiksCiAgICAgICAgICAgICAgICAgIGFlcyh5bWluID0gbWVhbl9yYXRpbmcgLSBzZV9yYXRpbmcsCiAgICAgICAgICAgICAgICAgICAgICB5bWF4ID0gbWVhbl9yYXRpbmcgKyBzZV9yYXRpbmcpLAogICAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMTUpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbCA9IHN0cnVjdHVyZSksCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArCiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbWVhbl9yYXRpbmcgLSBzZV9yYXRpbmcsCiAgICAgICAgICAgICAgICAgICAgICB5bWF4ID0gbWVhbl9yYXRpbmcgKyBzZV9yYXRpbmcpLAogICAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMTUpICsKICAgIGxhYnModGl0bGUgPSBwYXN0ZTAoYXMuY2hhcmFjdGVyKHdoaWNoLnZlcmIpLCAiICgiLCB2YnZfc3VtbWFyeSRlbnZbdmJ2X3N1bW1hcnkkdmVyYiA9PSB3aGljaC52ZXJiXSwgIikiKSwKICAgICAgICAgeCA9ICJMZW5ndGgiLAogICAgICAgICB5ID0gIk1lYW4gcmF0aW5nIikgLT4gcGxvdAogIHByaW50KHBsb3QpCn0KYGBgCgojIyMgREQgc2NvcmVzIGJ5IHZlcmIKCmBgYHtyIHZidl9kZF9zY29yZXN9CiMgU2F2ZSBiYXNlbGluZSBkYXRhCmV4cF9kYXRhICU+JQogIHN1YnNldChzdHJ1Y3R1cmUgPT0gIm5vbi1pc2xhbmQiKSAlPiUKICBkcm9wbGV2ZWxzICU+JQogIGdyb3VwX2J5KGxlbmd0aCkgJT4lCiAgc3VtbWFyaXplKG1lYW5fel9yYXRpbmcgPSBtZWFuKHpfcmF0aW5nKSkgLT4gYmFzZWxpbmVfel9yYXRpbmdzCgojIEdldCBERCBzY29yZXMgZm9yIGVhY2ggdmVyYgpleHBfZGF0YSAlPiUKICBzdWJzZXQoc3RydWN0dXJlID09ICJpc2xhbmQiKSAlPiUKICBkcm9wbGV2ZWxzICU+JQogIGdyb3VwX2J5KHZlcmIsIGVudikgJT4lCiAgc3VtbWFyaXplKG1lYW5fel9yYXRpbmcgPSBtZWFuKHpfcmF0aW5nKSwKICAgICAgICAgICAgaXNsX3NoID0gbWVhbih6X3JhdGluZ1tsZW5ndGggPT0gInNob3J0Il0pLAogICAgICAgICAgICBpc2xfbCA9IG1lYW4oel9yYXRpbmdbbGVuZ3RoID09ICJsb25nIl0pLAogICAgICAgICAgICBuaXNsX3NoID0gYmFzZWxpbmVfel9yYXRpbmdzJG1lYW5fel9yYXRpbmdbMV0sCiAgICAgICAgICAgIG5pc2xfbCA9IGJhc2VsaW5lX3pfcmF0aW5ncyRtZWFuX3pfcmF0aW5nWzJdLAogICAgICAgICAgICBkMSA9IG5pc2xfbCAtIGlzbF9sLAogICAgICAgICAgICBkMiA9IG5pc2xfc2ggLSBpc2xfc2gsCiAgICAgICAgICAgIGRkID0gZDEgLSBkMikgLT4gdmJ2X2RkCnByaW50KHZidl9kZCkKCiMgUGxvdCB2ZXJicyBieSBERCBzY29yZQp2YnZfZGQgJT4lCiAgc3Vic2V0KHNlbGVjdCA9IGModmVyYiwgZW52LCBkZCkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIodmVyYiwgZGQpLAogICAgICAgICAgICAgeSA9IGRkLAogICAgICAgICAgICAgZmlsbCA9IGVudikpICsKICBnZW9tX2NvbCgpICsgCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lID0gIkVudmlyb25tZW50IiwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlZUIiwgIkVFIikpICsKICBsYWJzKHggPSAiVmVyYiIsCiAgICAgICB5ID0gIkREIHNjb3JlIikKYGBgCgojIyBCdXJuLWluIGl0ZW1zICh2cy4gbWFpbiBpdGVtcykKYGBge3IgYnVybi1pbn0KcmF0aW5nc19kYXRhX2V4Y2wgJT4lCiAgc3Vic2V0KHR5cGUgPT0gImJ1cm4taW4iKSAlPiUKICBncm91cF9ieShlbnYsIAogICAgICAgICAgIHN0cnVjdHVyZSwKICAgICAgICAgICBsZW5ndGgpICU+JQogIHN1bW1hcml6ZShtZWFuX3JhdGluZyA9IG1lYW4ocmF0aW5nKSwKICAgICAgICAgICAgc2RfcmF0aW5nID0gc2QocmF0aW5nKSwKICAgICAgICAgICAgbiA9IG4oKSwKICAgICAgICAgICAgc2VfcmF0aW5nID0gc2RfcmF0aW5nL3NxcnQobikpIC0+IHN1bW1hcnlfYnVybl9pbgoKcHJpbnQoc3VtbWFyeV9idXJuX2luKQpgYGAKCmBgYHtyIHBsb3RfYnVybl9pbl9zdW1tYXJ5fQpzdW1tYXJ5X2J1cm5faW4gJT4lCiAgZ2dwbG90KGFlcyh4ID0gbGVuZ3RoLAogICAgICAgICAgICAgeSA9IG1lYW5fcmF0aW5nLAogICAgICAgICAgICAgY29sb3IgPSBlbnYsCiAgICAgICAgICAgICB5bWluID0gMSwKICAgICAgICAgICAgIHltYXggPSA2KSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbWVhbl9yYXRpbmcgLSBzZV9yYXRpbmcsCiAgICAgICAgICAgICAgICAgICAgeW1heCA9IG1lYW5fcmF0aW5nICsgc2VfcmF0aW5nKSwKICAgICAgICAgICAgICAgIHdpZHRoID0gMC4xNSkgKyAKICBsYWJzKHRpdGxlID0gIkJ1cm4taW4gaXRlbXMiKSAtPiBwbG90X3N1bW1hcnlfYnVybl9pbgpwcmludChwbG90X3N1bW1hcnlfYnVybl9pbikKIyBDb21wYXJlCnByaW50KHBsb3Rfc3VtbWFyeV9jb2xsYXBzZWQpCmBgYAoKYGBge3J9CiMgQ29uc2lkZXJpbmcgYnVybi1pbiBhbmQgbWFpbiBpdGVtcyB0b2dldGhlcgpyYXRpbmdzX2RhdGFfZXhjbCAlPiUKICBzdWJzZXQodHlwZSA9PSAiZXhwZXJpbWVudGFsIiB8IHR5cGUgPT0gImJ1cm4taW4iKSAlPiUKICBkcm9wbGV2ZWxzICU+JQogIGdyb3VwX2J5KGVudiwKICAgICAgICAgICBzdHJ1Y3R1cmUsCiAgICAgICAgICAgbGVuZ3RoKSAlPiUKICBzdW1tYXJpemUobWVhbl9yYXRpbmcgPSBtZWFuKHJhdGluZyksCiAgICAgICAgICAgIHNkX3JhdGluZyA9IHNkKHJhdGluZyksCiAgICAgICAgICAgIG4gPSBuKCksCiAgICAgICAgICAgIHNlX3JhdGluZyA9IHNkX3JhdGluZy9zcXJ0KG4pKSAtPiBzdW1tYXJ5X2NvbWJpbmVkCnByaW50KHN1bW1hcnlfY29tYmluZWQpCiMgUGxvdApzdW1tYXJ5X2NvbWJpbmVkICU+JQogIGdncGxvdChhZXMoeCA9IGxlbmd0aCwKICAgICAgICAgICAgIHkgPSBtZWFuX3JhdGluZywKICAgICAgICAgICAgIGNvbG9yID0gZW52LAogICAgICAgICAgICAgeW1pbiA9IDEsCiAgICAgICAgICAgICB5bWF4ID0gNikpICsKICBnZW9tX3BvaW50KHNpemUgPSAyKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1lYW5fcmF0aW5nIC0gc2VfcmF0aW5nLAogICAgICAgICAgICAgICAgICAgIHltYXggPSBtZWFuX3JhdGluZyArIHNlX3JhdGluZyksCiAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMTUpICsgCiAgbGFicyh0aXRsZSA9ICJDb21iaW5lZCBidXJuLWluIGFuZCBtYWluIGl0ZW1zIikgLT4gcGxvdF9zdW1tYXJ5X2NvbWJpbmVkCnByaW50KHBsb3Rfc3VtbWFyeV9jb21iaW5lZCkKYGBgCgojIyBUcmlhbCBvcmRlciBlZmZlY3RzCmBgYHtyfQpyYXRpbmdzX2RhdGFfZXhjbCAlPiUKICBzdWJzZXQodHlwZSA9PSAiZXhwZXJpbWVudGFsIiB8IHR5cGUgPT0gImJ1cm4taW4iKSAlPiUKICBkcm9wbGV2ZWxzICU+JQogIHN1YnNldChsZW5ndGggPT0gImxvbmciKSAlPiUKICBkcm9wbGV2ZWxzIC0+IHJhdGluZ3NfZGF0YV9leGNsX2NvbWJpbmVkCgojIE9yZGVyIHRoZSBkYXRhIGZyYW1lIGJ5IHByb2xpZmljIGlkIGFuZCB0cmlhbApyYXRpbmdzX2RhdGFfZXhjbF9jb21iaW5lZF9vcmRlcmVkIDwtIHJhdGluZ3NfZGF0YV9leGNsX2NvbWJpbmVkW29yZGVyKHJhdGluZ3NfZGF0YV9leGNsX2NvbWJpbmVkJGVwb2NoX3RpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW5nc19kYXRhX2V4Y2xfY29tYmluZWQkZW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGluZ3NfZGF0YV9leGNsX2NvbWJpbmVkJHRyaWFsKSxdCgojIEFkZCBuZXcgY29sIGZvciBlcXVhbGl6ZWQgdHJpYWwKIyBHZXQgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyBwZXIgcGFydGljaXBhbnQKb2JzIDwtIG5yb3cocmF0aW5nc19kYXRhX2V4Y2xfY29tYmluZWRfb3JkZXJlZFtyYXRpbmdzX2RhdGFfZXhjbF9jb21iaW5lZF9vcmRlcmVkJGVwb2NoX3RpbWUgPT0gIG1pbihyYXRpbmdzX2RhdGFfZXhjbF9jb21iaW5lZF9vcmRlcmVkJGVwb2NoX3RpbWUpLF0pCnJhdGluZ3NfZGF0YV9leGNsX2NvbWJpbmVkX29yZGVyZWQkdHJpYWxfZXEgPC0gMToob2JzLzMpCgojIFBsb3QgdGhlIHJhdGluZ3MgYW5kIGRyYXcgYSBsaW5lCnJhdGluZ3NfZGF0YV9leGNsX2NvbWJpbmVkX29yZGVyZWQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdHJpYWxfZXEsCiAgICAgICAgICAgICB5ID0gel9yYXRpbmcsCiAgICAgICAgICAgICBjb2xvciA9IGVudiwKICAgICAgICAgICAgIGdyb3VwID0gZW52KSkgKwogIGdlb21faml0dGVyKCkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSAtPiBwbG90X3RyaWFsX29yZGVyCnByaW50KHBsb3RfdHJpYWxfb3JkZXIpCmBgYAoKIyBDTE1zCgojIyBTaW1wbGUgZWZmZWN0cyBhbmFseXNpcwoKYGBge3J9CmxpYnJhcnkob3JkaW5hbCkKCiMgTWFrZSBzdXJlIG5vbWluYWwgdmFyaWFibGVzIGFyZSBjb2RlZCBhcyBmYWN0b3JzCmV4cF9kYXRhJHJhdGluZyAlPD4lIGFzLmZhY3RvcgpleHBfZGF0YSRlbnYgJTw+JSBhcy5mYWN0b3IKZXhwX2RhdGEkc3RydWN0dXJlICU8PiUgYXMuZmFjdG9yCmV4cF9kYXRhJGxlbmd0aCAlPD4lIGFzLmZhY3RvcgoKIyBTdW0gY29kZSBzdHJ1Y3R1cmUgYW5kIGxlbmd0aCBmYWN0b3JzCmNvbnRyYXN0cyhleHBfZGF0YSRzdHJ1Y3R1cmUpIDwtIGMoLTAuNSwgMC41KQpjb250cmFzdHMoZXhwX2RhdGEkbGVuZ3RoKSA8LSBjKC0wLjUsIDAuNSkKIyBDb250cmFzdHMgZm9yIGVudiBmYWN0b3Igc2hvdWxkIGJlIGR1bW15LWNvZGVkIGNvcnJlY3RseSBieSBkZWZhdWx0IGFmdGVyIHJlb3JkZXJpbmcgdGhlIGZhY3RvcnMKCmNsbShkYXRhID0gZXhwX2RhdGEsCiAgICBmb3JtdWxhID0gcmF0aW5nIH4gZW52ICogbGVuZ3RoKSAtPiBjbG1fYW5hbHlzaXMKc3VtbWFyeShjbG1fYW5hbHlzaXMpCmBgYAoKIyMgTWl4ZWQgZWZmZWN0cyBhbmFseXNpcwpgYGB7cn0KIyBTYXZlIHRoZSByYXRpbmdzIGRhdGEgdG8gcnVuIG9uIGhiLnVjc2MuZWR1CnNhdmVSRFMoZXhwX2RhdGEsCiAgICAgICAgZmlsZSA9ICJyYXRpbmdzX2RhdGFfZm9yX2NsbW0ucmRzIikKCiMgUnVuIHRoZSBmb2xsb3dpbmcgY2xtbSBvbiB0aGUgY2x1c3RlcjoKIyBjbG1tKGRhdGEgPSBleHBfZGF0YSwKIyAgICAgIGZvcm11bGEgPSByYXRpbmcgfiBlbnYgKiBsZW5ndGggKwojICAgICAgKDEgKyBlbnYgKiBsZW5ndGggfCBwcm9saWZpY19pZCkgKwojICAgICAgKDEgKyBlbnYgKiBsZW5ndGggfCBpdGVtKSkgLT4gY2xtbV9hbmFseXNpcwojIHNhdmVSRFMoY2xtbV9hbmFseXNpcywgImV4cDZfY2xtbS5yZHMiKQogCiMgUmVhZCBpbiBSRFMgZnJvbSBjbHVzdGVyCmNsbW1fYW5hbHlzaXMgPC0gcmVhZFJEUyhmaWxlID0gImV4cDZfY2xtbS5yZHMiKQpzdW1tYXJ5KGNsbW1fYW5hbHlzaXMpCmBgYAoK