library(tidyverse)
library(readxl)
library(mclust)
    __  ___________    __  _____________
   /  |/  / ____/ /   / / / / ___/_  __/
  / /|_/ / /   / /   / / / /\__ \ / /   
 / /  / / /___/ /___/ /_/ /___/ // /    
/_/  /_/\____/_____/\____//____//_/    version 5.4.9
Type 'citation("mclust")' for citing this R package in publications.

Attaching package: ‘mclust’

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

    map
ankeito <- read_excel("/Users/riku/Dropbox/zemizemi/data/honjiken/ankeitodata_with_correct_ans_2022.xlsx", sheet = "Sheet1")

#ankeito %>% filter(TASK == "MAT", COMPLEXITY == "L")  %>%
#        select("Q1") %>% rename(Q1L = Q1)


Q1L <- ankeito %>% filter(TASK == "MAT", COMPLEXITY == "L")  %>%
  select("Q1") %>% rename(Q1L = Q1)

Q1M <- ankeito %>% filter(TASK == "MAT", COMPLEXITY == "M")  %>%
  select("Q1") %>% rename(Q1M = Q1)

Q1H <- ankeito %>% filter(TASK == "MAT", COMPLEXITY == "H")  %>%
  select("Q1") %>% rename(Q1H = Q1)

Q2L <- ankeito %>% filter(TASK == "MAT", COMPLEXITY == "L")  %>%
  select("Q2") %>% rename(Q2L = Q2)

Q2M <- ankeito %>% filter(TASK == "MAT", COMPLEXITY == "M")  %>%
  select("Q2") %>% rename(Q2M = Q2)

Q2H <- ankeito %>% filter(TASK == "MAT", COMPLEXITY == "H")  %>%
  select("Q2") %>% rename(Q2H = Q2)

Q3L <- ankeito %>% filter(TASK == "MAT", COMPLEXITY == "L")  %>%
  select("Q3") %>% rename(Q3L = Q3)

Q3M <- ankeito %>% filter(TASK == "MAT", COMPLEXITY == "M")  %>%
  select("Q3") %>% rename(Q3M = Q3)

Q3H <- ankeito %>% filter(TASK == "MAT", COMPLEXITY == "H")  %>%
  select("Q3") %>% rename(Q3H = Q3)

Q4L <- ankeito %>% filter(TASK == "MAT", COMPLEXITY == "L")  %>%
  select("Q4") %>% rename(Q4L = Q4)

Q4M <- ankeito %>% filter(TASK == "MAT", COMPLEXITY == "M")  %>%
  select("Q4") %>% rename(Q4M = Q4)

Q4H <- ankeito %>% filter(TASK == "MAT", COMPLEXITY == "H")  %>%
  select("Q4") %>% rename(Q4H = Q4)

#ankeito.frame <- data.frame(Q1L, Q1M, Q1H, Q2L, Q2M, Q2H, Q3L, Q3M, Q3H, Q4L, Q4M, Q4H)
ankeito.frame <- data.frame(Q1L, Q1M, Q1H, Q2L, Q2M, Q2H, Q3L, Q3M, Q3H)

ankeito.frame

ankeito_clustering <- ankeito.frame %>%
  na.omit() 
#%>%
#  mutate_all(list(scale))

BIC <- mclustBIC(ankeito_clustering)
fitting ...

  |                                                                                             
  |                                                                                       |   0%
  |                                                                                             
  |=                                                                                      |   1%
  |                                                                                             
  |=                                                                                      |   2%
  |                                                                                             
  |==                                                                                     |   2%
  |                                                                                             
  |===                                                                                    |   3%
  |                                                                                             
  |===                                                                                    |   4%
  |                                                                                             
  |====                                                                                   |   5%
  |                                                                                             
  |=====                                                                                  |   6%
  |                                                                                             
  |======                                                                                 |   7%
  |                                                                                             
  |=======                                                                                |   8%
  |                                                                                             
  |========                                                                               |   9%
  |                                                                                             
  |=========                                                                              |  10%
  |                                                                                             
  |==========                                                                             |  11%
  |                                                                                             
  |==========                                                                             |  12%
  |                                                                                             
  |===========                                                                            |  13%
  |                                                                                             
  |============                                                                           |  13%
  |                                                                                             
  |============                                                                           |  14%
  |                                                                                             
  |=============                                                                          |  15%
  |                                                                                             
  |==============                                                                         |  16%
  |                                                                                             
  |==============                                                                         |  17%
  |                                                                                             
  |===============                                                                        |  17%
  |                                                                                             
  |================                                                                       |  18%
  |                                                                                             
  |================                                                                       |  19%
  |                                                                                             
  |=================                                                                      |  20%
  |                                                                                             
  |==================                                                                     |  20%
  |                                                                                             
  |==================                                                                     |  21%
  |                                                                                             
  |===================                                                                    |  22%
  |                                                                                             
  |====================                                                                   |  23%
  |                                                                                             
  |=====================                                                                  |  24%
  |                                                                                             
  |======================                                                                 |  25%
  |                                                                                             
  |=======================                                                                |  26%
  |                                                                                             
  |=======================                                                                |  27%
  |                                                                                             
  |========================                                                               |  28%
  |                                                                                             
  |=========================                                                              |  28%
  |                                                                                             
  |=========================                                                              |  29%
  |                                                                                             
  |==========================                                                             |  30%
  |                                                                                             
  |===========================                                                            |  31%
  |                                                                                             
  |============================                                                           |  32%
  |                                                                                             
  |=============================                                                          |  33%
  |                                                                                             
  |=============================                                                          |  34%
  |                                                                                             
  |==============================                                                         |  35%
  |                                                                                             
  |===============================                                                        |  35%
  |                                                                                             
  |================================                                                       |  36%
  |                                                                                             
  |================================                                                       |  37%
  |                                                                                             
  |=================================                                                      |  38%
  |                                                                                             
  |==================================                                                     |  39%
  |                                                                                             
  |===================================                                                    |  40%
  |                                                                                             
  |====================================                                                   |  41%
  |                                                                                             
  |====================================                                                   |  42%
  |                                                                                             
  |=====================================                                                  |  43%
  |                                                                                             
  |======================================                                                 |  43%
  |                                                                                             
  |======================================                                                 |  44%
  |                                                                                             
  |=======================================                                                |  45%
  |                                                                                             
  |========================================                                               |  46%
  |                                                                                             
  |=========================================                                              |  47%
  |                                                                                             
  |==========================================                                             |  48%
  |                                                                                             
  |==========================================                                             |  49%
  |                                                                                             
  |===========================================                                            |  50%
  |                                                                                             
  |============================================                                           |  50%
  |                                                                                             
  |=============================================                                          |  51%
  |                                                                                             
  |=============================================                                          |  52%
  |                                                                                             
  |==============================================                                         |  53%
  |                                                                                             
  |===============================================                                        |  54%
  |                                                                                             
  |================================================                                       |  55%
  |                                                                                             
  |=================================================                                      |  56%
  |                                                                                             
  |=================================================                                      |  57%
  |                                                                                             
  |==================================================                                     |  57%
  |                                                                                             
  |===================================================                                    |  58%
  |                                                                                             
  |===================================================                                    |  59%
  |                                                                                             
  |====================================================                                   |  60%
  |                                                                                             
  |=====================================================                                  |  61%
  |                                                                                             
  |======================================================                                 |  62%
  |                                                                                             
  |=======================================================                                |  63%
  |                                                                                             
  |=======================================================                                |  64%
  |                                                                                             
  |========================================================                               |  65%
  |                                                                                             
  |=========================================================                              |  65%
  |                                                                                             
  |==========================================================                             |  66%
  |                                                                                             
  |==========================================================                             |  67%
  |                                                                                             
  |===========================================================                            |  68%
  |                                                                                             
  |============================================================                           |  69%
  |                                                                                             
  |=============================================================                          |  70%
  |                                                                                             
  |==============================================================                         |  71%
  |                                                                                             
  |==============================================================                         |  72%
  |                                                                                             
  |===============================================================                        |  72%
  |                                                                                             
  |================================================================                       |  73%
  |                                                                                             
  |================================================================                       |  74%
  |                                                                                             
  |=================================================================                      |  75%
  |                                                                                             
  |==================================================================                     |  76%
  |                                                                                             
  |===================================================================                    |  77%
  |                                                                                             
  |====================================================================                   |  78%
  |                                                                                             
  |=====================================================================                  |  79%
  |                                                                                             
  |=====================================================================                  |  80%
  |                                                                                             
  |======================================================================                 |  80%
  |                                                                                             
  |=======================================================================                |  81%
  |                                                                                             
  |=======================================================================                |  82%
  |                                                                                             
  |========================================================================               |  83%
  |                                                                                             
  |=========================================================================              |  83%
  |                                                                                             
  |=========================================================================              |  84%
  |                                                                                             
  |==========================================================================             |  85%
  |                                                                                             
  |===========================================================================            |  86%
  |                                                                                             
  |===========================================================================            |  87%
  |                                                                                             
  |============================================================================           |  87%
  |                                                                                             
  |=============================================================================          |  88%
  |                                                                                             
  |=============================================================================          |  89%
  |                                                                                             
  |==============================================================================         |  90%
  |                                                                                             
  |===============================================================================        |  91%
  |                                                                                             
  |================================================================================       |  92%
  |                                                                                             
  |=================================================================================      |  93%
  |                                                                                             
  |==================================================================================     |  94%
  |                                                                                             
  |===================================================================================    |  95%
  |                                                                                             
  |====================================================================================   |  96%
  |                                                                                             
  |====================================================================================   |  97%
  |                                                                                             
  |=====================================================================================  |  98%
  |                                                                                             
  |====================================================================================== |  98%
  |                                                                                             
  |====================================================================================== |  99%
  |                                                                                             
  |=======================================================================================| 100%
plot(BIC)


summary(BIC)
Best BIC values:
             VEE,2        EEE,1        EEV,1
BIC      -1107.615 -1113.016920 -1113.016920
BIC diff     0.000    -5.402222    -5.402222
mod1 <- Mclust(ankeito_clustering, modelNames = "VEE", G = 2, x = BIC)

summary(mod1)
---------------------------------------------------- 
Gaussian finite mixture model fitted by EM algorithm 
---------------------------------------------------- 

Mclust VEE (ellipsoidal, equal shape and orientation) model with 2 components: 

Clustering table:
 1  2 
19 17 
ICL <- mclustICL(ankeito_clustering)
fitting ...

  |                                                                                             
  |                                                                                       |   0%
  |                                                                                             
  |=                                                                                      |   1%
  |                                                                                             
  |=                                                                                      |   2%
  |                                                                                             
  |==                                                                                     |   2%
  |                                                                                             
  |===                                                                                    |   3%
  |                                                                                             
  |===                                                                                    |   4%
  |                                                                                             
  |====                                                                                   |   5%
  |                                                                                             
  |=====                                                                                  |   6%
  |                                                                                             
  |======                                                                                 |   7%
  |                                                                                             
  |=======                                                                                |   8%
  |                                                                                             
  |========                                                                               |   9%
  |                                                                                             
  |=========                                                                              |  10%
  |                                                                                             
  |==========                                                                             |  11%
  |                                                                                             
  |==========                                                                             |  12%
  |                                                                                             
  |===========                                                                            |  13%
  |                                                                                             
  |============                                                                           |  13%
  |                                                                                             
  |============                                                                           |  14%
  |                                                                                             
  |=============                                                                          |  15%
  |                                                                                             
  |==============                                                                         |  16%
  |                                                                                             
  |==============                                                                         |  17%
  |                                                                                             
  |===============                                                                        |  17%
  |                                                                                             
  |================                                                                       |  18%
  |                                                                                             
  |================                                                                       |  19%
  |                                                                                             
  |=================                                                                      |  20%
  |                                                                                             
  |==================                                                                     |  20%
  |                                                                                             
  |==================                                                                     |  21%
  |                                                                                             
  |===================                                                                    |  22%
  |                                                                                             
  |====================                                                                   |  23%
  |                                                                                             
  |=====================                                                                  |  24%
  |                                                                                             
  |======================                                                                 |  25%
  |                                                                                             
  |=======================                                                                |  26%
  |                                                                                             
  |=======================                                                                |  27%
  |                                                                                             
  |========================                                                               |  28%
  |                                                                                             
  |=========================                                                              |  28%
  |                                                                                             
  |=========================                                                              |  29%
  |                                                                                             
  |==========================                                                             |  30%
  |                                                                                             
  |===========================                                                            |  31%
  |                                                                                             
  |============================                                                           |  32%
  |                                                                                             
  |=============================                                                          |  33%
  |                                                                                             
  |=============================                                                          |  34%
  |                                                                                             
  |==============================                                                         |  35%
  |                                                                                             
  |===============================                                                        |  35%
  |                                                                                             
  |================================                                                       |  36%
  |                                                                                             
  |================================                                                       |  37%
  |                                                                                             
  |=================================                                                      |  38%
  |                                                                                             
  |==================================                                                     |  39%
  |                                                                                             
  |===================================                                                    |  40%
  |                                                                                             
  |====================================                                                   |  41%
  |                                                                                             
  |====================================                                                   |  42%
  |                                                                                             
  |=====================================                                                  |  43%
  |                                                                                             
  |======================================                                                 |  43%
  |                                                                                             
  |======================================                                                 |  44%
  |                                                                                             
  |=======================================                                                |  45%
  |                                                                                             
  |========================================                                               |  46%
  |                                                                                             
  |=========================================                                              |  47%
  |                                                                                             
  |==========================================                                             |  48%
  |                                                                                             
  |==========================================                                             |  49%
  |                                                                                             
  |===========================================                                            |  50%
  |                                                                                             
  |============================================                                           |  50%
  |                                                                                             
  |=============================================                                          |  51%
  |                                                                                             
  |=============================================                                          |  52%
  |                                                                                             
  |==============================================                                         |  53%
  |                                                                                             
  |===============================================                                        |  54%
  |                                                                                             
  |================================================                                       |  55%
  |                                                                                             
  |=================================================                                      |  56%
  |                                                                                             
  |=================================================                                      |  57%
  |                                                                                             
  |==================================================                                     |  57%
  |                                                                                             
  |===================================================                                    |  58%
  |                                                                                             
  |===================================================                                    |  59%
  |                                                                                             
  |====================================================                                   |  60%
  |                                                                                             
  |=====================================================                                  |  61%
  |                                                                                             
  |======================================================                                 |  62%
  |                                                                                             
  |=======================================================                                |  63%
  |                                                                                             
  |=======================================================                                |  64%
  |                                                                                             
  |========================================================                               |  65%
  |                                                                                             
  |=========================================================                              |  65%
  |                                                                                             
  |==========================================================                             |  66%
  |                                                                                             
  |==========================================================                             |  67%
  |                                                                                             
  |===========================================================                            |  68%
  |                                                                                             
  |============================================================                           |  69%
  |                                                                                             
  |=============================================================                          |  70%
  |                                                                                             
  |==============================================================                         |  71%
  |                                                                                             
  |==============================================================                         |  72%
  |                                                                                             
  |===============================================================                        |  72%
  |                                                                                             
  |================================================================                       |  73%
  |                                                                                             
  |================================================================                       |  74%
  |                                                                                             
  |=================================================================                      |  75%
  |                                                                                             
  |==================================================================                     |  76%
  |                                                                                             
  |===================================================================                    |  77%
  |                                                                                             
  |====================================================================                   |  78%
  |                                                                                             
  |=====================================================================                  |  79%
  |                                                                                             
  |=====================================================================                  |  80%
  |                                                                                             
  |======================================================================                 |  80%
  |                                                                                             
  |=======================================================================                |  81%
  |                                                                                             
  |=======================================================================                |  82%
  |                                                                                             
  |========================================================================               |  83%
  |                                                                                             
  |=========================================================================              |  83%
  |                                                                                             
  |=========================================================================              |  84%
  |                                                                                             
  |==========================================================================             |  85%
  |                                                                                             
  |===========================================================================            |  86%
  |                                                                                             
  |===========================================================================            |  87%
  |                                                                                             
  |============================================================================           |  87%
  |                                                                                             
  |=============================================================================          |  88%
  |                                                                                             
  |=============================================================================          |  89%
  |                                                                                             
  |==============================================================================         |  90%
  |                                                                                             
  |===============================================================================        |  91%
  |                                                                                             
  |================================================================================       |  92%
  |                                                                                             
  |=================================================================================      |  93%
  |                                                                                             
  |==================================================================================     |  94%
  |                                                                                             
  |===================================================================================    |  95%
  |                                                                                             
  |====================================================================================   |  96%
  |                                                                                             
  |====================================================================================   |  97%
  |                                                                                             
  |=====================================================================================  |  98%
  |                                                                                             
  |====================================================================================== |  98%
  |                                                                                             
  |====================================================================================== |  99%
  |                                                                                             
  |=======================================================================================| 100%
plot(ICL)


summary(ICL)
Best ICL values:
             VEE,2        EEE,1        EEV,1
ICL      -1108.527 -1113.016920 -1113.016920
ICL diff     0.000    -4.490142    -4.490142
#mclustBootstrapLRT(ankeito_clustering, modelName = "VVE")

means <- data.frame(mod1$parameters$mean) %>%
  rownames_to_column() %>%
  rename(ankeito = rowname) %>%
  pivot_longer(cols = c(X1, X2), names_to = "Profile", values_to = "Mean") %>%
  mutate(Mean = round(Mean, 2),
         Mean = ifelse(Mean > 1, 1, Mean))


#means %>%
#  ggplot(aes(ankeito, Mean, group = Profile, color = Profile)) +
#  geom_point(size = 2.25) +
#  geom_line(size = 1.25) +
#  scale_x_discrete(limits = c("Q1L", "Q1M", "Q1H", "Q2L", "Q2M", "Q2H", "Q3L", "Q3M", "Q3H", #"Q4L", "Q4M", "Q4H")) +
#  labs(x = NULL, y = "Standardized mean interest") +
#  theme_bw(base_size = 14) +
#  theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "top")


p <- means %>%
  mutate(Profile = recode(Profile, 
                          X1 = "Profile A: 50%",
                          X2 = "Profile B: 50%")) %>%
  ggplot(aes(ankeito, Mean, group = Profile, color = Profile)) +
  geom_point(size = 2.25) +
  geom_line(size = 1.25) +
  scale_x_discrete(limits = c("Q1L", "Q1M", "Q1H", "Q2L", "Q2M", "Q2H", "Q3L", "Q3M", "Q3H")) +
  labs(x = NULL, y = "Standardized mean ankeito") +
  theme_bw(base_size = 14) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "top")

#library(plotly)

#ggplotly(p, tooltip = c("Ankeito", "Mean")) %>%
  layout(legend = list(orientation = "h", y = 1.2))
Error in UseMethod("layout") : 
  no applicable method for 'layout' applied to an object of class "list"

Means

ankeito.frame$profile <- as.factor(mod1$classification)

ankeito.frame.means <- sapply(ankeito.frame %>% filter(profile == "1"), mean)
Warning in mean.default(X[[i]], ...) :
  argument is not numeric or logical: returning NA
ankeito.frame.means2 <- as_tibble(as.list(ankeito.frame.means))
ankeito.frame.means3 <- as.data.frame(t(ankeito.frame.means2))
ankeito.frame.means4 <- as_tibble(ankeito.frame.means3) %>% rename(Mean = V1) 
ankeito.frame.means4$Ankeito <- names(ankeito.frame.means)
ankeito.frame.means4$Profile <- "X1"
ankeito.frame.means4 <- ankeito.frame.means4[-13,]

ankeito.frame.means.p1 <- ankeito.frame.means4

ankeito.frame.means <- sapply(ankeito.frame %>% filter(profile == "2"), mean)
Warning in mean.default(X[[i]], ...) :
  argument is not numeric or logical: returning NA
ankeito.frame.means2 <- as_tibble(as.list(ankeito.frame.means))
ankeito.frame.means3 <- as.data.frame(t(ankeito.frame.means2))
ankeito.frame.means4 <- as_tibble(ankeito.frame.means3) %>% rename(Mean = V1) 
ankeito.frame.means4$Ankeito <- names(ankeito.frame.means)
ankeito.frame.means4$Profile <- "X2"
ankeito.frame.means4 <- ankeito.frame.means4[-13,]

ankeito.frame.means.p2 <- ankeito.frame.means4

ankeito.frame.means <- rbind(ankeito.frame.means.p1, ankeito.frame.means.p2)



p <- ankeito.frame.means %>%
  mutate(Profile = recode(Profile, 
                          X1 = "Profile A: 50%",
                          X2 = "Profile B: 50%")) %>%
  ggplot(aes(Ankeito, Mean, group = Profile, color = Profile)) +
  geom_point(size = 2.25) +
  geom_line(size = 1.25) +
  scale_x_discrete(limits = c("Q1L", "Q1M", "Q1H", "Q2L", "Q2M", "Q2H", "Q3L", "Q3M", "Q3H")) +
  labs(x = NULL, y = "Standardized mean ankeito") +
  theme_bw(base_size = 14) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "top")


library(plotly)

ggplotly(p, tooltip = c("Ankeito", "Mean")) %>%
  layout(legend = list(orientation = "h", y = 1.2))

#add mean lisas score

one-way MANOVA

library(rstatix)
library(ggpubr)

mod1_profile <- data.frame(id = c(1:36), profile = mod1$classification)
ankeito_with_profile2 <- cbind(ankeito_clustering, mod1_profile)


# Visualization

ggboxplot(
  ankeito_with_profile2, x = "profile", y = c("Q1L", "Q1M", "Q1H", "Q2L", "Q2M", "Q2H", "Q3L", "Q3M", "Q3H"), 
  merge = TRUE, palette = "jco"
)
Warning: `gather_()` was deprecated in tidyr 1.2.0.
Please use `gather()` instead.
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.

# Summary statistics


ankeito_with_profile2 %>%
  group_by(profile) %>%
  get_summary_stats(Q1L, Q1M, Q1H, Q2L, Q2M, Q2H, Q3L, Q3M, Q3H, type = "mean_sd")

# Check sample size assumption

ankeito_with_profile2 %>%
  group_by(profile) %>%
  summarise(N = n())

# Identify univariate outliers


ankeito_with_profile2 %>%
  group_by(profile) %>%
  identify_outliers(Q1L)

ankeito_with_profile2 %>%
  group_by(profile) %>%
  identify_outliers(Q1M)

ankeito_with_profile2 %>%
  group_by(profile) %>%
  identify_outliers(Q1H)

ankeito_with_profile2 %>%
  group_by(profile) %>%
  identify_outliers(Q2L)

ankeito_with_profile2 %>%
  group_by(profile) %>%
  identify_outliers(Q2M)

ankeito_with_profile2 %>%
  group_by(profile) %>%
  identify_outliers(Q2H)

ankeito_with_profile2 %>%
  group_by(profile) %>%
  identify_outliers(Q3L)

ankeito_with_profile2 %>%
  group_by(profile) %>%
  identify_outliers(Q3M)

ankeito_with_profile2 %>%
  group_by(profile) %>%
  identify_outliers(Q3H)

# Detect multivariate outliers



ankeito_with_profile2 %>%
  group_by(profile) %>%
  mahalanobis_distance(-id) %>%
  filter(is.outlier == TRUE) %>%
  as.data.frame()


# Check univariate normality assumption



ankeito_with_profile2 %>%
  group_by(profile) %>%
  shapiro_test(Q1L, Q1M, Q1H, Q2L, Q2M, Q2H, Q3L, Q3M, Q3H) %>%
  arrange(variable)



# QQplot
ggqqplot(ankeito_with_profile2, "Q1L", facet.by = "profile",
         ylab = "Q1L", ggtheme = theme_bw())


ggqqplot(ankeito_with_profile2, "Q1M", facet.by = "profile",
         ylab = "Q1M", ggtheme = theme_bw())


ggqqplot(ankeito_with_profile2, "Q1H", facet.by = "profile",
         ylab = "Q1H", ggtheme = theme_bw())


ggqqplot(ankeito_with_profile2, "Q2L", facet.by = "profile",
         ylab = "Q2L", ggtheme = theme_bw())


ggqqplot(ankeito_with_profile2, "Q2M", facet.by = "profile",
         ylab = "Q2M", ggtheme = theme_bw())


ggqqplot(ankeito_with_profile2, "Q2H", facet.by = "profile",
         ylab = "Q3M", ggtheme = theme_bw())


ggqqplot(ankeito_with_profile2, "Q3L", facet.by = "profile",
         ylab = "Q3L", ggtheme = theme_bw())


ggqqplot(ankeito_with_profile2, "Q3M", facet.by = "profile",
         ylab = "Q3M", ggtheme = theme_bw())


ggqqplot(ankeito_with_profile2, "Q3H", facet.by = "profile",
         ylab = "Q3H", ggtheme = theme_bw())


# Multivariate normality

ankeito_with_profile2 %>%
  select(Q1L, Q1M, Q1H, Q2L, Q2M, Q2H, Q3L, Q3M, Q3H) %>%
  mshapiro_test()

# Identify multicollinearity


ankeito_with_profile2 %>% cor_mat(Q1L, Q1M, Q1H, Q2L, Q2M, Q2H, Q3L, Q3M, Q3H) %>% 
  cor_get_pval()

# Check linearity assumption

library(GGally)
results <- ankeito_with_profile2 %>%
  select(Q1L, Q1M, Q1H, Q2L, Q2M, Q2H, Q3L, Q3M, Q3H, profile) %>%
  group_by(profile) %>%
  doo(~ggpairs(.) + theme_bw(), result = "plots")
results

results$plots
[[1]]

 plot: [1,1] [>------------------------------------------------------------------]  1% est: 0s 
 plot: [1,2] [=>-----------------------------------------------------------------]  2% est: 1s 
 plot: [1,3] [=>-----------------------------------------------------------------]  4% est: 1s 
 plot: [1,4] [==>----------------------------------------------------------------]  5% est: 1s 
 plot: [1,5] [===>---------------------------------------------------------------]  6% est: 1s 
 plot: [1,6] [====>--------------------------------------------------------------]  7% est: 1s 
 plot: [1,7] [=====>-------------------------------------------------------------]  9% est: 1s 
 plot: [1,8] [======>------------------------------------------------------------] 10% est: 1s 
 plot: [1,9] [======>------------------------------------------------------------] 11% est: 1s 
 plot: [2,1] [=======>-----------------------------------------------------------] 12% est: 1s 
 plot: [2,2] [========>----------------------------------------------------------] 14% est: 1s 
 plot: [2,3] [=========>---------------------------------------------------------] 15% est: 1s 
 plot: [2,4] [==========>--------------------------------------------------------] 16% est: 1s 
 plot: [2,5] [===========>-------------------------------------------------------] 17% est: 1s 
 plot: [2,6] [===========>-------------------------------------------------------] 19% est: 1s 
 plot: [2,7] [============>------------------------------------------------------] 20% est: 1s 
 plot: [2,8] [=============>-----------------------------------------------------] 21% est: 1s 
 plot: [2,9] [==============>----------------------------------------------------] 22% est: 1s 
 plot: [3,1] [===============>---------------------------------------------------] 23% est: 1s 
 plot: [3,2] [================>--------------------------------------------------] 25% est: 1s 
 plot: [3,3] [================>--------------------------------------------------] 26% est: 1s 
 plot: [3,4] [=================>-------------------------------------------------] 27% est: 1s 
 plot: [3,5] [==================>------------------------------------------------] 28% est: 1s 
 plot: [3,6] [===================>-----------------------------------------------] 30% est: 1s 
 plot: [3,7] [====================>----------------------------------------------] 31% est: 1s 
 plot: [3,8] [=====================>---------------------------------------------] 32% est: 1s 
 plot: [3,9] [=====================>---------------------------------------------] 33% est: 1s 
 plot: [4,1] [======================>--------------------------------------------] 35% est: 1s 
 plot: [4,2] [=======================>-------------------------------------------] 36% est: 1s 
 plot: [4,3] [========================>------------------------------------------] 37% est: 1s 
 plot: [4,4] [=========================>-----------------------------------------] 38% est: 1s 
 plot: [4,5] [=========================>-----------------------------------------] 40% est: 1s 
 plot: [4,6] [==========================>----------------------------------------] 41% est: 1s 
 plot: [4,7] [===========================>---------------------------------------] 42% est: 1s 
 plot: [4,8] [============================>--------------------------------------] 43% est: 1s 
 plot: [4,9] [=============================>-------------------------------------] 44% est: 1s 
 plot: [5,1] [==============================>------------------------------------] 46% est: 1s 
 plot: [5,2] [==============================>------------------------------------] 47% est: 1s 
 plot: [5,3] [===============================>-----------------------------------] 48% est: 1s 
 plot: [5,4] [================================>----------------------------------] 49% est: 1s 
 plot: [5,5] [=================================>---------------------------------] 51% est: 1s 
 plot: [5,6] [==================================>--------------------------------] 52% est: 1s 
 plot: [5,7] [===================================>-------------------------------] 53% est: 1s 
 plot: [5,8] [===================================>-------------------------------] 54% est: 1s 
 plot: [5,9] [====================================>------------------------------] 56% est: 1s 
 plot: [6,1] [=====================================>-----------------------------] 57% est: 1s 
 plot: [6,2] [======================================>----------------------------] 58% est: 1s 
 plot: [6,3] [=======================================>---------------------------] 59% est: 1s 
 plot: [6,4] [========================================>--------------------------] 60% est: 1s 
 plot: [6,5] [========================================>--------------------------] 62% est: 1s 
 plot: [6,6] [=========================================>-------------------------] 63% est: 1s 
 plot: [6,7] [==========================================>------------------------] 64% est: 1s 
 plot: [6,8] [===========================================>-----------------------] 65% est: 1s 
 plot: [6,9] [============================================>----------------------] 67% est: 1s 
 plot: [7,1] [============================================>----------------------] 68% est: 1s 
 plot: [7,2] [=============================================>---------------------] 69% est: 0s 
 plot: [7,3] [==============================================>--------------------] 70% est: 0s 
 plot: [7,4] [===============================================>-------------------] 72% est: 0s 
 plot: [7,5] [================================================>------------------] 73% est: 0s 
 plot: [7,6] [=================================================>-----------------] 74% est: 0s 
 plot: [7,7] [=================================================>-----------------] 75% est: 0s 
 plot: [7,8] [==================================================>----------------] 77% est: 0s 
 plot: [7,9] [===================================================>---------------] 78% est: 0s 
 plot: [8,1] [====================================================>--------------] 79% est: 0s 
 plot: [8,2] [=====================================================>-------------] 80% est: 0s 
 plot: [8,3] [======================================================>------------] 81% est: 0s 
 plot: [8,4] [======================================================>------------] 83% est: 0s 
 plot: [8,5] [=======================================================>-----------] 84% est: 0s 
 plot: [8,6] [========================================================>----------] 85% est: 0s 
 plot: [8,7] [=========================================================>---------] 86% est: 0s 
 plot: [8,8] [==========================================================>--------] 88% est: 0s 
 plot: [8,9] [===========================================================>-------] 89% est: 0s 
 plot: [9,1] [===========================================================>-------] 90% est: 0s 
 plot: [9,2] [============================================================>------] 91% est: 0s 
 plot: [9,3] [=============================================================>-----] 93% est: 0s 
 plot: [9,4] [==============================================================>----] 94% est: 0s 
 plot: [9,5] [===============================================================>---] 95% est: 0s 
 plot: [9,6] [================================================================>--] 96% est: 0s 
 plot: [9,7] [================================================================>--] 98% est: 0s 
 plot: [9,8] [=================================================================>-] 99% est: 0s 
 plot: [9,9] [===================================================================]100% est: 0s 
                                                                                               

[[2]]

 plot: [1,1] [>------------------------------------------------------------------]  1% est: 0s 
 plot: [1,2] [=>-----------------------------------------------------------------]  2% est: 1s 
 plot: [1,3] [=>-----------------------------------------------------------------]  4% est: 1s 
 plot: [1,4] [==>----------------------------------------------------------------]  5% est: 1s 
 plot: [1,5] [===>---------------------------------------------------------------]  6% est: 1s 
 plot: [1,6] [====>--------------------------------------------------------------]  7% est: 1s 
 plot: [1,7] [=====>-------------------------------------------------------------]  9% est: 1s 
 plot: [1,8] [======>------------------------------------------------------------] 10% est: 2s 
 plot: [1,9] [======>------------------------------------------------------------] 11% est: 1s 
 plot: [2,1] [=======>-----------------------------------------------------------] 12% est: 1s 
 plot: [2,2] [========>----------------------------------------------------------] 14% est: 1s 
 plot: [2,3] [=========>---------------------------------------------------------] 15% est: 1s 
 plot: [2,4] [==========>--------------------------------------------------------] 16% est: 1s 
 plot: [2,5] [===========>-------------------------------------------------------] 17% est: 1s 
 plot: [2,6] [===========>-------------------------------------------------------] 19% est: 1s 
 plot: [2,7] [============>------------------------------------------------------] 20% est: 1s 
 plot: [2,8] [=============>-----------------------------------------------------] 21% est: 1s 
 plot: [2,9] [==============>----------------------------------------------------] 22% est: 1s 
 plot: [3,1] [===============>---------------------------------------------------] 23% est: 1s 
 plot: [3,2] [================>--------------------------------------------------] 25% est: 1s 
 plot: [3,3] [================>--------------------------------------------------] 26% est: 1s 
 plot: [3,4] [=================>-------------------------------------------------] 27% est: 1s 
 plot: [3,5] [==================>------------------------------------------------] 28% est: 1s 
 plot: [3,6] [===================>-----------------------------------------------] 30% est: 1s 
 plot: [3,7] [====================>----------------------------------------------] 31% est: 1s 
 plot: [3,8] [=====================>---------------------------------------------] 32% est: 1s 
 plot: [3,9] [=====================>---------------------------------------------] 33% est: 1s 
 plot: [4,1] [======================>--------------------------------------------] 35% est: 1s 
 plot: [4,2] [=======================>-------------------------------------------] 36% est: 1s 
 plot: [4,3] [========================>------------------------------------------] 37% est: 1s 
 plot: [4,4] [=========================>-----------------------------------------] 38% est: 1s 
 plot: [4,5] [=========================>-----------------------------------------] 40% est: 1s 
 plot: [4,6] [==========================>----------------------------------------] 41% est: 1s 
 plot: [4,7] [===========================>---------------------------------------] 42% est: 1s 
 plot: [4,8] [============================>--------------------------------------] 43% est: 1s 
 plot: [4,9] [=============================>-------------------------------------] 44% est: 1s 
 plot: [5,1] [==============================>------------------------------------] 46% est: 1s 
 plot: [5,2] [==============================>------------------------------------] 47% est: 1s 
 plot: [5,3] [===============================>-----------------------------------] 48% est: 1s 
 plot: [5,4] [================================>----------------------------------] 49% est: 1s 
 plot: [5,5] [=================================>---------------------------------] 51% est: 1s 
 plot: [5,6] [==================================>--------------------------------] 52% est: 1s 
 plot: [5,7] [===================================>-------------------------------] 53% est: 1s 
 plot: [5,8] [===================================>-------------------------------] 54% est: 1s 
 plot: [5,9] [====================================>------------------------------] 56% est: 1s 
 plot: [6,1] [=====================================>-----------------------------] 57% est: 1s 
 plot: [6,2] [======================================>----------------------------] 58% est: 1s 
 plot: [6,3] [=======================================>---------------------------] 59% est: 1s 
 plot: [6,4] [========================================>--------------------------] 60% est: 1s 
 plot: [6,5] [========================================>--------------------------] 62% est: 1s 
 plot: [6,6] [=========================================>-------------------------] 63% est: 1s 
 plot: [6,7] [==========================================>------------------------] 64% est: 1s 
 plot: [6,8] [===========================================>-----------------------] 65% est: 1s 
 plot: [6,9] [============================================>----------------------] 67% est: 1s 
 plot: [7,1] [============================================>----------------------] 68% est: 1s 
 plot: [7,2] [=============================================>---------------------] 69% est: 1s 
 plot: [7,3] [==============================================>--------------------] 70% est: 1s 
 plot: [7,4] [===============================================>-------------------] 72% est: 0s 
 plot: [7,5] [================================================>------------------] 73% est: 0s 
 plot: [7,6] [=================================================>-----------------] 74% est: 0s 
 plot: [7,7] [=================================================>-----------------] 75% est: 0s 
 plot: [7,8] [==================================================>----------------] 77% est: 0s 
 plot: [7,9] [===================================================>---------------] 78% est: 0s 
 plot: [8,1] [====================================================>--------------] 79% est: 0s 
 plot: [8,2] [=====================================================>-------------] 80% est: 0s 
 plot: [8,3] [======================================================>------------] 81% est: 0s 
 plot: [8,4] [======================================================>------------] 83% est: 0s 
 plot: [8,5] [=======================================================>-----------] 84% est: 0s 
 plot: [8,6] [========================================================>----------] 85% est: 0s 
 plot: [8,7] [=========================================================>---------] 86% est: 0s 
 plot: [8,8] [==========================================================>--------] 88% est: 0s 
 plot: [8,9] [===========================================================>-------] 89% est: 0s 
 plot: [9,1] [===========================================================>-------] 90% est: 0s 
 plot: [9,2] [============================================================>------] 91% est: 0s 
 plot: [9,3] [=============================================================>-----] 93% est: 0s 
 plot: [9,4] [==============================================================>----] 94% est: 0s 
 plot: [9,5] [===============================================================>---] 95% est: 0s 
 plot: [9,6] [================================================================>--] 96% est: 0s 
 plot: [9,7] [================================================================>--] 98% est: 0s 
 plot: [9,8] [=================================================================>-] 99% est: 0s 
 plot: [9,9] [===================================================================]100% est: 0s 
                                                                                               

# Check the homogeneity of covariances assumption
## とりあえず略します


# Computation

model <- lm(cbind(Q1L, Q1M, Q1H, Q2L, Q2M, Q2H, Q3L, Q3M, Q3H) ~ profile, ankeito_with_profile2)
Manova(model, test.statistic = "Pillai")

Type II MANOVA Tests: Pillai test statistic
        Df test stat approx F num Df den Df    Pr(>F)    
profile  1   0.81517   12.741      9     26 1.799e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# Post-hoc tests



# Group the data by variable
grouped.data <- ankeito_with_profile2 %>%
  gather(key = "variable", value = "value", Q1L, Q1M, Q1H, Q2L, Q2M, Q2H, Q3L, Q3M, Q3H) %>%
  group_by(variable)

# Do welch one way anova test
grouped.data %>% welch_anova_test(value ~ profile)

pwc <- ankeito_with_profile2 %>%
  gather(key = "variables", value = "value", Q1L, Q1M, Q1H, Q2L, Q2M, Q2H, Q3L, Q3M, Q3H) %>%
  group_by(variables) %>%
  games_howell_test(value ~ profile) %>%
  select(-estimate, -conf.low, -conf.high) # Remove details
pwc

# Visualization: box plots with p-values
pwc <- pwc %>% add_xy_position(x = "profile")
test.label <- create_test_label(
  description = "MANOVA", statistic.text = quote(italic("F")),
  statistic = 12.741, p= "<0.0001", parameter = "9, 26",
  type = "expression", detailed = TRUE
)
ggboxplot(
  ankeito_with_profile2, x = "profile", y = c("Q1L", "Q1M", "Q1H", "Q2L", "Q2M", "Q2H", "Q3L", "Q3M", "Q3H"), 
  merge = TRUE, palette = "jco"
) + 
  stat_pvalue_manual(
    pwc, hide.ns = TRUE, tip.length = 0, 
    step.increase = 0.1, step.group.by = "variables",
    color = "variables"
  ) +
  labs(
    subtitle = test.label,
    caption = get_pwc_label(pwc, type = "expression")
  )

NA
NA

Logstic regression

ankeito_lisas <- read_xlsx("/Users/riku/Dropbox/zemizemi/data/honjiken/ankeitodata_with_correct_ans_202010version.xlsx", sheet = "lisas")

ankeito_lisas_with_profile <- left_join(ankeito_lisas, mod1_profile)
Joining, by = "id"
ankeito_lisas_with_profile$profile <- as.factor(ankeito_lisas_with_profile$profile)


ankeito_all <- ankeito_with_profile2



lisas_M <- as.data.frame(ankeito_lisas_with_profile %>% filter(TASK == "MAT", COMPLEXITY == "M") %>% 
  select(lisas))

ankeito_all$Lisas_M <- lisas_M$lisas



lisas_H <- as.data.frame(ankeito_lisas_with_profile %>% filter(TASK == "MAT", COMPLEXITY == "H") %>% 
                           select(lisas))

ankeito_all$Lisas_H <- lisas_H$lisas

prepare_time_L <- as.data.frame(ankeito %>% filter(TASK == "MAT", COMPLEXITY == "L") %>% 
                                  select(prepare_time))

prepare_time_M <- as.data.frame(ankeito_lisas_with_profile %>% filter(TASK == "MAT", COMPLEXITY == "M") %>% 
                                select(prepare_time))
prepare_time_H <- as.data.frame(ankeito_lisas_with_profile %>% filter(TASK == "MAT", COMPLEXITY == "H") %>% 
                                  select(prepare_time))

ankeito_all$prepare_time_L <- prepare_time_L$prepare_time

ankeito_all$prepare_time_M <- prepare_time_M$prepare_time

ankeito_all$prepare_time_H <- prepare_time_H$prepare_time

Japan_length <- as.data.frame(ankeito %>% filter(TASK == "MAT", COMPLEXITY == "L") %>% 
                                select(length_of_stay_in_Japan))

SPOT90 <- as.data.frame(ankeito %>% filter(TASK == "MAT", COMPLEXITY == "L") %>% 
                          select(SPOT90))

ankeito_all$Japan_length <- Japan_length$length_of_stay_in_Japan
ankeito_all$SPOT90 <- SPOT90$SPOT90

AGE <- as.data.frame(ankeito %>% filter(TASK == "MAT", COMPLEXITY == "L") %>% 
                                       select(birth_year))

AGE$birth_year <- 2020 - AGE$birth_year
ankeito_all$AGE <- AGE$birth_year


ankeito_all$profile2 <- ifelse(ankeito_all$profile == 1, 1, 0)

logit <- glm(profile2 ~ AGE + Lisas_M + Lisas_H + prepare_time_L + prepare_time_M + prepare_time_H + Japan_length + SPOT90, data = ankeito_all, family = "binomial")
summary(logit)

Call:
glm(formula = profile2 ~ AGE + Lisas_M + Lisas_H + prepare_time_L + 
    prepare_time_M + prepare_time_H + Japan_length + SPOT90, 
    family = "binomial", data = ankeito_all)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.7554  -1.0303   0.5446   0.9075   1.9682  

Coefficients:
                 Estimate Std. Error z value Pr(>|z|)
(Intercept)    13.8382503 10.1626950   1.362    0.173
AGE            -0.2843983  0.2880162  -0.987    0.323
Lisas_M        -0.0008948  0.0015798  -0.566    0.571
Lisas_H        -0.0011042  0.0014654  -0.754    0.451
prepare_time_L  0.0044301  0.0174533   0.254    0.800
prepare_time_M  0.0133604  0.0178449   0.749    0.454
prepare_time_H -0.0079313  0.0106826  -0.742    0.458
Japan_length    0.0951881  0.4013859   0.237    0.813
SPOT90         -0.0466264  0.0534844  -0.872    0.383

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 49.795  on 35  degrees of freedom
Residual deviance: 42.841  on 27  degrees of freedom
AIC: 60.841

Number of Fisher Scoring iterations: 4

Significant Test

SPOT 90

library(ggpubr)
library(rstatix)

mod1_profile <- data.frame(id = c(1:36), profile = mod1$classification)

ankeito_with_profile <- inner_join(ankeito, mod1_profile)

SPOT90_p <- ankeito_with_profile %>% filter(TASK == "MAT", COMPLEXITY == "L") %>% 
  select(SPOT90, profile) 

SPOT90_p$profile <- as.factor(SPOT90_p$profile)

#ggplot(SPOT90_p, aes(x = profile, group = profile, y = SPOT90)) + geom_boxplot()
#t.test(select(filter(SPOT90_p, profile == "1"), SPOT90), select(filter(SPOT90_p, profile == "2"), SPOT90))


SPOT90_p %>%
  group_by(profile) %>%
  get_summary_stats(SPOT90, type = "mean_sd")

bxp <- ggboxplot(
  SPOT90_p, x = "profile", y = "SPOT90", 
  ylab = "SPOT90", xlab = "Profile", add = "jitter"
)
bxp

SPOT90_p %>%
  group_by(profile) %>%
  identify_outliers(SPOT90)

SPOT90_p <- SPOT90_p[c(-36),] #id 36 excluded
                    
SPOT90_p %>%
  group_by(profile) %>%
  get_summary_stats(SPOT90, type = "mean_sd")

bxp <- ggboxplot(
  SPOT90_p, x = "profile", y = "SPOT90", 
  ylab = "SPOT90", xlab = "Profile", add = "jitter"
)

bxp


SPOT90_p %>%
  group_by(profile) %>%
  shapiro_test(SPOT90)

ggqqplot(SPOT90_p, x = "SPOT90", facet.by = "profile")


SPOT90_p %>% levene_test(SPOT90 ~ profile)

stat.test <- SPOT90_p %>% 
  t_test(SPOT90 ~ profile, var.equal = TRUE) %>%
  add_significance()
stat.test


stat.test <- stat.test %>% add_xy_position(x = "profile")
bxp + 
  stat_pvalue_manual(stat.test, tip.length = 0) +
  labs(subtitle = get_test_label(stat.test, detailed = TRUE))

LISAS

LISAS MAT M Profile 1, 2


ankeito_lisas <- read_xlsx("/Users/riku/Dropbox/zemizemi/data/honjiken/ankeitodata_with_correct_ans_202010version.xlsx", sheet = "lisas")

ankeito_lisas_with_profile <- left_join(ankeito_lisas, mod1_profile)
Joining, by = "id"
ankeito_lisas_with_profile$profile <- as.factor(ankeito_lisas_with_profile$profile)


LISAS_mat_m <- ankeito_lisas_with_profile %>% filter(TASK == "MAT", COMPLEXITY == "M") %>% 
  select(lisas, profile) 

LISAS_mat_m %>% 
  group_by(profile) %>% 
  get_summary_stats(lisas, type = "mean_sd")

bxp <- ggboxplot(
  LISAS_mat_m, x = "profile", y = "lisas", 
  ylab = "LISAS MAT M", xlab = "PROFILE", add = "jitter"
)
bxp


LISAS_mat_m %>% 
  group_by(profile) %>% 
  identify_outliers(lisas)

LISAS_mat_m %>% 
  group_by(profile) %>% 
  shapiro_test(lisas)


LISAS_mat_m %>% levene_test(lisas ~ profile)

stat.test <- LISAS_mat_m %>% 
  t_test(lisas ~ profile) %>%
  add_significance()
stat.test

stat.test <- stat.test %>% add_xy_position(x = "profile")
bxp + 
  stat_pvalue_manual(stat.test, tip.length = 0) +
  labs(subtitle = get_test_label(stat.test, detailed = TRUE))

LISAS MAT H Profile 1, 2


LISAS_mat_h <- ankeito_lisas_with_profile %>% filter(TASK == "MAT", COMPLEXITY == "H") %>% 
  select(lisas, profile) 

LISAS_mat_h %>% 
  group_by(profile) %>% 
  get_summary_stats(lisas, type = "mean_sd")

bxp <- ggboxplot(
  LISAS_mat_h, x = "profile", y = "lisas", 
  ylab = "LISAS MAT H", xlab = "PROFILE", add = "jitter"
)
bxp


LISAS_mat_h %>% 
  group_by(profile) %>% 
  identify_outliers(lisas)

LISAS_mat_h %>% 
  group_by(profile) %>% 
  shapiro_test(lisas)


LISAS_mat_h %>% levene_test(lisas ~ profile)

stat.test <- LISAS_mat_h %>% 
  t_test(lisas ~ profile, var.equal = TRUE) %>%
  add_significance()
stat.test

stat.test <- stat.test %>% add_xy_position(x = "profile")
bxp + 
  stat_pvalue_manual(stat.test, tip.length = 0) +
  labs(subtitle = get_test_label(stat.test, detailed = TRUE))

MAT M&H within Profile 1

LISAS_mat_m$task <- "MAT_M"
LISAS_mat_h$task <- "MAT_H"

lisas_mat_p <- rbind(LISAS_mat_m, LISAS_mat_h)

lisas_mat_p1 <- filter(lisas_mat_p, lisas_mat_p$profile == "1")
lisas_mat_p2 <- filter(lisas_mat_p, lisas_mat_p$profile == "2")

mat_profile_1 <- inner_join(
ankeito_lisas_with_profile %>% filter(TASK == "MAT", COMPLEXITY == "M", profile == "1") %>% 
  select(id, lisas, profile) %>% rename(MAT_M = lisas),
ankeito_lisas_with_profile %>% filter(TASK == "MAT", COMPLEXITY == "H", profile == "1") %>% 
  select(id, lisas, profile) %>% rename(MAT_H = lisas))
Joining, by = c("id", "profile")
mat_profile_1_long <- mat_profile_1 %>%
  gather(key = "task", value = "lisas", MAT_M, MAT_H)


mat_profile_1_long %>% 
  group_by(task) %>% 
  get_summary_stats(lisas, type = "mean_sd")


bxp <- ggpaired(mat_profile_1_long, x = "task", y = "lisas", 
         order = c("MAT_M", "MAT_H"),
         ylab = "LISAS MAT PROFILE 1", xlab = "TASK")
bxp


mat_profile_1 <- mat_profile_1 %>% mutate(differences = MAT_M - MAT_H)

mat_profile_1 %>% identify_outliers(differences)

mat_profile_1 %>% shapiro_test(differences) 

stat.test <- mat_profile_1_long  %>% 
  wilcox_test(lisas ~ task, paired = TRUE) %>%
  add_significance()
stat.test

stat.test <- stat.test %>% add_xy_position(x = "task")
bxp + 
  stat_pvalue_manual(stat.test, tip.length = 0) +
  labs(subtitle = get_test_label(stat.test, detailed= TRUE))

MAT M&H within Profile 2

mat_profile_2 <- inner_join(
ankeito_lisas_with_profile %>% filter(TASK == "MAT", COMPLEXITY == "M", profile == "2") %>% 
  select(id, lisas, profile) %>% rename(MAT_M = lisas),
ankeito_lisas_with_profile %>% filter(TASK == "MAT", COMPLEXITY == "H", profile == "2") %>% 
  select(id, lisas, profile) %>% rename(MAT_H = lisas))

mat_profile_2_long <- mat_profile_2 %>%
  gather(key = "task", value = "lisas", MAT_M, MAT_H)


mat_profile_2_long %>% 
  group_by(task) %>% 
  get_summary_stats(lisas, type = "mean_sd")


bxp <- ggpaired(mat_profile_2_long, x = "task", y = "lisas", 
         order = c("MAT_M", "MAT_H"),
         ylab = "LISAS MAT PROFILE 2", xlab = "TASK")
bxp

mat_profile_2 <- mat_profile_2 %>% mutate(differences = MAT_M - MAT_H)

mat_profile_2 %>% identify_outliers(differences)

mat_profile_2 %>% shapiro_test(differences) 

stat.test <- mat_profile_2_long  %>% 
  t_test(lisas ~ task, paired = TRUE) %>%
  add_significance()
stat.test

stat.test <- stat.test %>% add_xy_position(x = "task")
bxp + 
  stat_pvalue_manual(stat.test, tip.length = 0) +
  labs(subtitle = get_test_label(stat.test, detailed= TRUE))

SAT M&H within Profile 1


sat_profile_1 <- inner_join(
ankeito_lisas_with_profile %>% filter(TASK == "SAT", COMPLEXITY == "M", profile == "1") %>% 
  select(id, lisas, profile) %>% rename(SAT_M = lisas),
ankeito_lisas_with_profile %>% filter(TASK == "SAT", COMPLEXITY == "H", profile == "1") %>% 
  select(id, lisas, profile) %>% rename(SAT_H = lisas))
Joining, by = c("id", "profile")
sat_profile_1_long <- sat_profile_1 %>%
  gather(key = "task", value = "lisas", SAT_M, SAT_H)


sat_profile_1_long %>% 
  group_by(task) %>% 
  get_summary_stats(lisas, type = "mean_sd")


bxp <- ggpaired(sat_profile_1_long, x = "task", y = "lisas", 
         order = c("SAT_M", "SAT_H"),
         ylab = "LISAS MAT PROFILE 1", xlab = "TASK")
bxp


sat_profile_1 <- sat_profile_1 %>% mutate(differences = SAT_M - SAT_H)

sat_profile_1 %>% identify_outliers(differences)

sat_profile_1 %>% shapiro_test(differences) 

stat.test <- sat_profile_1_long  %>% 
  t_test(lisas ~ task, paired = TRUE) %>%
  add_significance()
stat.test

stat.test <- stat.test %>% add_xy_position(x = "task")
bxp + 
  stat_pvalue_manual(stat.test, tip.length = 0) +
  labs(subtitle = get_test_label(stat.test, detailed= TRUE))

SAT M&H within Profile 2

sat_profile_2 <- inner_join(
ankeito_lisas_with_profile %>% filter(TASK == "SAT", COMPLEXITY == "M", profile == "2") %>% 
  select(id, lisas, profile) %>% rename(SAT_M = lisas),
ankeito_lisas_with_profile %>% filter(TASK == "SAT", COMPLEXITY == "H", profile == "2") %>% 
  select(id, lisas, profile) %>% rename(SAT_H = lisas))

sat_profile_2_long <- sat_profile_2 %>%
  gather(key = "task", value = "lisas", SAT_M, SAT_H)


sat_profile_2_long %>% 
  group_by(task) %>% 
  get_summary_stats(lisas, type = "mean_sd")


bxp <- ggpaired(sat_profile_2_long, x = "task", y = "lisas", 
         order = c("SAT_M", "SAT_H"),
         ylab = "LISAS MAT PROFILE 2", xlab = "TASK")
bxp

sat_profile_2 <- sat_profile_2 %>% mutate(differences = SAT_M - SAT_H)

sat_profile_2 %>% identify_outliers(differences)

sat_profile_2 %>% shapiro_test(differences) 

stat.test <- sat_profile_2_long  %>% 
  t_test(lisas ~ task, paired = TRUE) %>%
  add_significance()
stat.test

stat.test <- stat.test %>% add_xy_position(x = "task")
bxp + 
  stat_pvalue_manual(stat.test, tip.length = 0) +
  labs(subtitle = get_test_label(stat.test, detailed= TRUE))

demographic data

filter(ankeito_lisas_with_profile, TASK == "MAT", COMPLEXITY =="H")
ankeito_lisas_with_profile$Gender <- as.factor(ankeito_lisas_with_profile$Gender)
summary(select(ankeito_lisas_with_profile, Gender, profile))

ankeito_lisas_with_profile %>% 
  filter(TASK == "MAT", COMPLEXITY =="H", profile == 1) %>% 
  select(Gender) %>% 
  summary()

ankeito_lisas_with_profile %>% 
  filter(TASK == "MAT", COMPLEXITY =="H", profile == 2) %>% 
  select(Gender) %>% 
  summary()

ankeito_lisas_with_profile %>% 
  filter(TASK == "MAT", COMPLEXITY =="H", profile == 1) %>% 
  select(length_of_stay_in_Japan) %>% 
  summary()

ankeito_lisas_with_profile %>% 
  filter(TASK == "MAT", COMPLEXITY =="H", profile == 2) %>% 
  select(length_of_stay_in_Japan) %>% 
  summary()

ankeito_lisas_with_profile %>% 
  filter(TASK == "MAT", COMPLEXITY =="H") %>% 
  ggboxplot(x = "profile", y = "Q1", color = "profile",
  ylab = "Q1 MAT H", xlab = "PROFILE", add = "jitter")

Wilcoxon rank sum test

LISAS

LISAS MAT M Profile 1, 2



LISAS_mat_m %>% 
  group_by(profile) %>% 
  get_summary_stats(lisas, type = "mean_sd")

bxp <- ggboxplot(
  LISAS_mat_m, x = "profile", y = "lisas", 
  ylab = "LISAS MAT M", xlab = "PROFILE", add = "jitter"
)
bxp

LISAS_mat_m %>% 
  group_by(profile) %>% 
  identify_outliers(lisas)

LISAS_mat_m %>% 
  group_by(profile) %>% 
  shapiro_test(lisas)


LISAS_mat_m %>% levene_test(lisas ~ profile)

stat.test <- LISAS_mat_m %>% 
  wilcox_test(lisas ~ profile) %>%
  add_significance()
stat.test

stat.test <- stat.test %>% add_xy_position(x = "profile")
bxp + 
  stat_pvalue_manual(stat.test, tip.length = 0) +
  labs(subtitle = get_test_label(stat.test, detailed = TRUE))

LISAS MAT H Profile 1, 2


LISAS_mat_h <- ankeito_lisas_with_profile %>% filter(TASK == "MAT", COMPLEXITY == "H") %>% 
  select(lisas, profile) 

LISAS_mat_h %>% 
  group_by(profile) %>% 
  get_summary_stats(lisas, type = "mean_sd")

bxp <- ggboxplot(
  LISAS_mat_h, x = "profile", y = "lisas", 
  ylab = "LISAS MAT H", xlab = "PROFILE", add = "jitter"
)
bxp

LISAS_mat_h %>% 
  group_by(profile) %>% 
  identify_outliers(lisas)

LISAS_mat_h %>% 
  group_by(profile) %>% 
  shapiro_test(lisas)


LISAS_mat_h %>% levene_test(lisas ~ profile)

stat.test <- LISAS_mat_h %>% 
  wilcox_test(lisas ~ profile) %>%
  add_significance()
stat.test

stat.test <- stat.test %>% add_xy_position(x = "profile")
bxp + 
  stat_pvalue_manual(stat.test, tip.length = 0) +
  labs(subtitle = get_test_label(stat.test, detailed = TRUE))

MAT M&H within Profile 1

LISAS_mat_m$task <- "MAT_M"
LISAS_mat_h$task <- "MAT_H"

lisas_mat_p <- rbind(LISAS_mat_m, LISAS_mat_h)

lisas_mat_p1 <- filter(lisas_mat_p, lisas_mat_p$profile == "1")
lisas_mat_p2 <- filter(lisas_mat_p, lisas_mat_p$profile == "2")

mat_profile_1 <- inner_join(
ankeito_lisas_with_profile %>% filter(TASK == "MAT", COMPLEXITY == "M", profile == "1") %>% 
  select(id, lisas, profile) %>% rename(MAT_M = lisas),
ankeito_lisas_with_profile %>% filter(TASK == "MAT", COMPLEXITY == "H", profile == "1") %>% 
  select(id, lisas, profile) %>% rename(MAT_H = lisas))

mat_profile_1_long <- mat_profile_1 %>%
  gather(key = "task", value = "lisas", MAT_M, MAT_H)


mat_profile_1_long %>% 
  group_by(task) %>% 
  get_summary_stats(lisas, type = "mean_sd")


bxp <- ggpaired(mat_profile_1_long, x = "task", y = "lisas", 
         order = c("MAT_M", "MAT_H"),
         ylab = "LISAS MAT PROFILE 1", xlab = "TASK")
bxp

mat_profile_1 <- mat_profile_1 %>% mutate(differences = MAT_M - MAT_H)

mat_profile_1 %>% identify_outliers(differences)

mat_profile_1 %>% shapiro_test(differences) 

stat.test <- mat_profile_1_long  %>% 
  wilcox_test(lisas ~ task, paired = TRUE) %>%
  add_significance()
stat.test

stat.test <- stat.test %>% add_xy_position(x = "task")
bxp + 
  stat_pvalue_manual(stat.test, tip.length = 0) +
  labs(subtitle = get_test_label(stat.test, detailed= TRUE))

MAT M&H within Profile 2

mat_profile_2 <- inner_join(
ankeito_lisas_with_profile %>% filter(TASK == "MAT", COMPLEXITY == "M", profile == "2") %>% 
  select(id, lisas, profile) %>% rename(MAT_M = lisas),
ankeito_lisas_with_profile %>% filter(TASK == "MAT", COMPLEXITY == "H", profile == "2") %>% 
  select(id, lisas, profile) %>% rename(MAT_H = lisas))

mat_profile_2_long <- mat_profile_2 %>%
  gather(key = "task", value = "lisas", MAT_M, MAT_H)


mat_profile_2_long %>% 
  group_by(task) %>% 
  get_summary_stats(lisas, type = "mean_sd")


bxp <- ggpaired(mat_profile_2_long, x = "task", y = "lisas", 
         order = c("MAT_M", "MAT_H"),
         ylab = "LISAS MAT PROFILE 2", xlab = "TASK")
bxp

mat_profile_2 <- mat_profile_2 %>% mutate(differences = MAT_M - MAT_H)

mat_profile_2 %>% identify_outliers(differences)

mat_profile_2 %>% shapiro_test(differences) 

stat.test <- mat_profile_2_long  %>% 
  wilcox_test(lisas ~ task, paired = TRUE) %>%
  add_significance()
stat.test

stat.test <- stat.test %>% add_xy_position(x = "task")
bxp + 
  stat_pvalue_manual(stat.test, tip.length = 0) +
  labs(subtitle = get_test_label(stat.test, detailed= TRUE))

SAT LPA


Q1L <- ankeito %>% filter(TASK == "SAT", COMPLEXITY == "L")  %>%
  select("Q1") %>% rename(Q1L = Q1)

Q1M <- ankeito %>% filter(TASK == "SAT", COMPLEXITY == "M")  %>%
  select("Q1") %>% rename(Q1M = Q1)

Q1H <- ankeito %>% filter(TASK == "SAT", COMPLEXITY == "H")  %>%
  select("Q1") %>% rename(Q1H = Q1)

Q2L <- ankeito %>% filter(TASK == "SAT", COMPLEXITY == "L")  %>%
  select("Q2") %>% rename(Q2L = Q2)

Q2M <- ankeito %>% filter(TASK == "SAT", COMPLEXITY == "M")  %>%
  select("Q2") %>% rename(Q2M = Q2)

Q2H <- ankeito %>% filter(TASK == "SAT", COMPLEXITY == "H")  %>%
  select("Q2") %>% rename(Q2H = Q2)

Q3L <- ankeito %>% filter(TASK == "SAT", COMPLEXITY == "L")  %>%
  select("Q3") %>% rename(Q3L = Q3)

Q3M <- ankeito %>% filter(TASK == "SAT", COMPLEXITY == "M")  %>%
  select("Q3") %>% rename(Q3M = Q3)

Q3H <- ankeito %>% filter(TASK == "SAT", COMPLEXITY == "H")  %>%
  select("Q3") %>% rename(Q3H = Q3)

Q4L <- ankeito %>% filter(TASK == "SAT", COMPLEXITY == "L")  %>%
  select("Q4") %>% rename(Q4L = Q4)

Q4M <- ankeito %>% filter(TASK == "SAT", COMPLEXITY == "M")  %>%
  select("Q4") %>% rename(Q4M = Q4)

Q4H <- ankeito %>% filter(TASK == "SAT", COMPLEXITY == "H")  %>%
  select("Q4") %>% rename(Q4H = Q4)

ankeito.frame <- data.frame(Q1L, Q1M, Q1H, Q2L, Q2M, Q2H, Q3L, Q3M, Q3H, Q4L, Q4M, Q4H)

ankeito.frame
summary(mod3)
---------------------------------------------------- 
Gaussian finite mixture model fitted by EM algorithm 
---------------------------------------------------- 

Mclust EVE (ellipsoidal, equal volume and orientation) model with 2
components: 

Clustering table:
 1  2 
17 19 

SAT M&H within Profile 1


sat_profile_1 <- inner_join(
ankeito_lisas_with_profile %>% filter(TASK == "SAT", COMPLEXITY == "M", profile == "1") %>% 
  select(id, lisas, profile) %>% rename(SAT_M = lisas),
ankeito_lisas_with_profile %>% filter(TASK == "SAT", COMPLEXITY == "H", profile == "1") %>% 
  select(id, lisas, profile) %>% rename(SAT_H = lisas))
Joining, by = c("id", "profile")
sat_profile_1_long <- sat_profile_1 %>%
  gather(key = "task", value = "lisas", SAT_M, SAT_H)


sat_profile_1_long %>% 
  group_by(task) %>% 
  get_summary_stats(lisas, type = "mean_sd")


bxp <- ggpaired(sat_profile_1_long, x = "task", y = "lisas", 
         order = c("SAT_M", "SAT_H"),
         ylab = "LISAS MAT PROFILE 1", xlab = "TASK")
bxp


sat_profile_1 <- sat_profile_1 %>% mutate(differences = SAT_M - SAT_H)

sat_profile_1 %>% identify_outliers(differences)

sat_profile_1 %>% shapiro_test(differences) 

stat.test <- sat_profile_1_long  %>% 
  wilcox_test(lisas ~ task, paired = TRUE) %>%
  add_significance()
stat.test

stat.test <- stat.test %>% add_xy_position(x = "task")
bxp + 
  stat_pvalue_manual(stat.test, tip.length = 0) +
  labs(subtitle = get_test_label(stat.test, detailed= TRUE))

SAT M&H within Profile 2

sat_profile_2 <- inner_join(
ankeito_lisas_with_profile %>% filter(TASK == "SAT", COMPLEXITY == "M", profile == "2") %>% 
  select(id, lisas, profile) %>% rename(SAT_M = lisas),
ankeito_lisas_with_profile %>% filter(TASK == "SAT", COMPLEXITY == "H", profile == "2") %>% 
  select(id, lisas, profile) %>% rename(SAT_H = lisas))
Joining, by = c("id", "profile")
sat_profile_2_long <- sat_profile_2 %>%
  gather(key = "task", value = "lisas", SAT_M, SAT_H)


sat_profile_2_long %>% 
  group_by(task) %>% 
  get_summary_stats(lisas, type = "mean_sd")


bxp <- ggpaired(sat_profile_2_long, x = "task", y = "lisas", 
         order = c("SAT_M", "SAT_H"),
         ylab = "LISAS MAT PROFILE 2", xlab = "TASK")
bxp


sat_profile_2 <- sat_profile_2 %>% mutate(differences = SAT_M - SAT_H)

sat_profile_2 %>% identify_outliers(differences)

sat_profile_2 %>% shapiro_test(differences) 

stat.test <- sat_profile_2_long  %>% 
  wilcox_test(lisas ~ task, paired = TRUE) %>%
  add_significance()
stat.test

stat.test <- stat.test %>% add_xy_position(x = "task")
bxp + 
  stat_pvalue_manual(stat.test, tip.length = 0) +
  labs(subtitle = get_test_label(stat.test, detailed= TRUE))

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiTFBBIHJlcG9ydCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShtY2x1c3QpCgphbmtlaXRvIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9yaWt1L0Ryb3Bib3gvemVtaXplbWkvZGF0YS9ob25qaWtlbi9hbmtlaXRvZGF0YV93aXRoX2NvcnJlY3RfYW5zXzIwMjIueGxzeCIsIHNoZWV0ID0gIlNoZWV0MSIpCgojYW5rZWl0byAlPiUgZmlsdGVyKFRBU0sgPT0gIk1BVCIsIENPTVBMRVhJVFkgPT0gIkwiKSAgJT4lCiMgICAgICAgIHNlbGVjdCgiUTEiKSAlPiUgcmVuYW1lKFExTCA9IFExKQoKClExTCA8LSBhbmtlaXRvICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiTCIpICAlPiUKICBzZWxlY3QoIlExIikgJT4lIHJlbmFtZShRMUwgPSBRMSkKClExTSA8LSBhbmtlaXRvICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiTSIpICAlPiUKICBzZWxlY3QoIlExIikgJT4lIHJlbmFtZShRMU0gPSBRMSkKClExSCA8LSBhbmtlaXRvICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiSCIpICAlPiUKICBzZWxlY3QoIlExIikgJT4lIHJlbmFtZShRMUggPSBRMSkKClEyTCA8LSBhbmtlaXRvICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiTCIpICAlPiUKICBzZWxlY3QoIlEyIikgJT4lIHJlbmFtZShRMkwgPSBRMikKClEyTSA8LSBhbmtlaXRvICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiTSIpICAlPiUKICBzZWxlY3QoIlEyIikgJT4lIHJlbmFtZShRMk0gPSBRMikKClEySCA8LSBhbmtlaXRvICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiSCIpICAlPiUKICBzZWxlY3QoIlEyIikgJT4lIHJlbmFtZShRMkggPSBRMikKClEzTCA8LSBhbmtlaXRvICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiTCIpICAlPiUKICBzZWxlY3QoIlEzIikgJT4lIHJlbmFtZShRM0wgPSBRMykKClEzTSA8LSBhbmtlaXRvICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiTSIpICAlPiUKICBzZWxlY3QoIlEzIikgJT4lIHJlbmFtZShRM00gPSBRMykKClEzSCA8LSBhbmtlaXRvICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiSCIpICAlPiUKICBzZWxlY3QoIlEzIikgJT4lIHJlbmFtZShRM0ggPSBRMykKClE0TCA8LSBhbmtlaXRvICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiTCIpICAlPiUKICBzZWxlY3QoIlE0IikgJT4lIHJlbmFtZShRNEwgPSBRNCkKClE0TSA8LSBhbmtlaXRvICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiTSIpICAlPiUKICBzZWxlY3QoIlE0IikgJT4lIHJlbmFtZShRNE0gPSBRNCkKClE0SCA8LSBhbmtlaXRvICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiSCIpICAlPiUKICBzZWxlY3QoIlE0IikgJT4lIHJlbmFtZShRNEggPSBRNCkKCiNhbmtlaXRvLmZyYW1lIDwtIGRhdGEuZnJhbWUoUTFMLCBRMU0sIFExSCwgUTJMLCBRMk0sIFEySCwgUTNMLCBRM00sIFEzSCwgUTRMLCBRNE0sIFE0SCkKYW5rZWl0by5mcmFtZSA8LSBkYXRhLmZyYW1lKFExTCwgUTFNLCBRMUgsIFEyTCwgUTJNLCBRMkgsIFEzTCwgUTNNLCBRM0gpCgphbmtlaXRvLmZyYW1lCmBgYAoKYGBge3J9CgphbmtlaXRvX2NsdXN0ZXJpbmcgPC0gYW5rZWl0by5mcmFtZSAlPiUKICBuYS5vbWl0KCkgCiMlPiUKIyAgbXV0YXRlX2FsbChsaXN0KHNjYWxlKSkKCkJJQyA8LSBtY2x1c3RCSUMoYW5rZWl0b19jbHVzdGVyaW5nKQoKcGxvdChCSUMpCgpzdW1tYXJ5KEJJQykKCm1vZDEgPC0gTWNsdXN0KGFua2VpdG9fY2x1c3RlcmluZywgbW9kZWxOYW1lcyA9ICJWRUUiLCBHID0gMiwgeCA9IEJJQykKCnN1bW1hcnkobW9kMSkKCklDTCA8LSBtY2x1c3RJQ0woYW5rZWl0b19jbHVzdGVyaW5nKQoKcGxvdChJQ0wpCgpzdW1tYXJ5KElDTCkKCiNtY2x1c3RCb290c3RyYXBMUlQoYW5rZWl0b19jbHVzdGVyaW5nLCBtb2RlbE5hbWUgPSAiVlZFIikKYGBgCgpgYGB7cn0KCm1lYW5zIDwtIGRhdGEuZnJhbWUobW9kMSRwYXJhbWV0ZXJzJG1lYW4pICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigpICU+JQogIHJlbmFtZShhbmtlaXRvID0gcm93bmFtZSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKFgxLCBYMiksIG5hbWVzX3RvID0gIlByb2ZpbGUiLCB2YWx1ZXNfdG8gPSAiTWVhbiIpICU+JQogIG11dGF0ZShNZWFuID0gcm91bmQoTWVhbiwgMiksCiAgICAgICAgIE1lYW4gPSBpZmVsc2UoTWVhbiA+IDEsIDEsIE1lYW4pKQoKCiNtZWFucyAlPiUKIyAgZ2dwbG90KGFlcyhhbmtlaXRvLCBNZWFuLCBncm91cCA9IFByb2ZpbGUsIGNvbG9yID0gUHJvZmlsZSkpICsKIyAgZ2VvbV9wb2ludChzaXplID0gMi4yNSkgKwojICBnZW9tX2xpbmUoc2l6ZSA9IDEuMjUpICsKIyAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJRMUwiLCAiUTFNIiwgIlExSCIsICJRMkwiLCAiUTJNIiwgIlEySCIsICJRM0wiLCAiUTNNIiwgIlEzSCIsICMiUTRMIiwgIlE0TSIsICJRNEgiKSkgKwojICBsYWJzKHggPSBOVUxMLCB5ID0gIlN0YW5kYXJkaXplZCBtZWFuIGludGVyZXN0IikgKwojICB0aGVtZV9idyhiYXNlX3NpemUgPSAxNCkgKwojICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLCBsZWdlbmQucG9zaXRpb24gPSAidG9wIikKCgpwIDwtIG1lYW5zICU+JQogIG11dGF0ZShQcm9maWxlID0gcmVjb2RlKFByb2ZpbGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgIFgxID0gIlByb2ZpbGUgQTogNTAlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBYMiA9ICJQcm9maWxlIEI6IDUwJSIpKSAlPiUKICBnZ3Bsb3QoYWVzKGFua2VpdG8sIE1lYW4sIGdyb3VwID0gUHJvZmlsZSwgY29sb3IgPSBQcm9maWxlKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIuMjUpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDEuMjUpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIlExTCIsICJRMU0iLCAiUTFIIiwgIlEyTCIsICJRMk0iLCAiUTJIIiwgIlEzTCIsICJRM00iLCAiUTNIIikpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gIlN0YW5kYXJkaXplZCBtZWFuIGFua2VpdG8iKSArCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTQpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLCBsZWdlbmQucG9zaXRpb24gPSAidG9wIikKCiNsaWJyYXJ5KHBsb3RseSkKCiNnZ3Bsb3RseShwLCB0b29sdGlwID0gYygiQW5rZWl0byIsICJNZWFuIikpICU+JQojICBsYXlvdXQobGVnZW5kID0gbGlzdChvcmllbnRhdGlvbiA9ICJoIiwgeSA9IDEuMikpCmBgYAoKIyBNZWFucwoKYGBge3J9CmFua2VpdG8uZnJhbWUkcHJvZmlsZSA8LSBhcy5mYWN0b3IobW9kMSRjbGFzc2lmaWNhdGlvbikKCmFua2VpdG8uZnJhbWUubWVhbnMgPC0gc2FwcGx5KGFua2VpdG8uZnJhbWUgJT4lIGZpbHRlcihwcm9maWxlID09ICIxIiksIG1lYW4pCmFua2VpdG8uZnJhbWUubWVhbnMyIDwtIGFzX3RpYmJsZShhcy5saXN0KGFua2VpdG8uZnJhbWUubWVhbnMpKQphbmtlaXRvLmZyYW1lLm1lYW5zMyA8LSBhcy5kYXRhLmZyYW1lKHQoYW5rZWl0by5mcmFtZS5tZWFuczIpKQphbmtlaXRvLmZyYW1lLm1lYW5zNCA8LSBhc190aWJibGUoYW5rZWl0by5mcmFtZS5tZWFuczMpICU+JSByZW5hbWUoTWVhbiA9IFYxKSAKYW5rZWl0by5mcmFtZS5tZWFuczQkQW5rZWl0byA8LSBuYW1lcyhhbmtlaXRvLmZyYW1lLm1lYW5zKQphbmtlaXRvLmZyYW1lLm1lYW5zNCRQcm9maWxlIDwtICJYMSIKYW5rZWl0by5mcmFtZS5tZWFuczQgPC0gYW5rZWl0by5mcmFtZS5tZWFuczRbLTEzLF0KCmFua2VpdG8uZnJhbWUubWVhbnMucDEgPC0gYW5rZWl0by5mcmFtZS5tZWFuczQKCmFua2VpdG8uZnJhbWUubWVhbnMgPC0gc2FwcGx5KGFua2VpdG8uZnJhbWUgJT4lIGZpbHRlcihwcm9maWxlID09ICIyIiksIG1lYW4pCmFua2VpdG8uZnJhbWUubWVhbnMyIDwtIGFzX3RpYmJsZShhcy5saXN0KGFua2VpdG8uZnJhbWUubWVhbnMpKQphbmtlaXRvLmZyYW1lLm1lYW5zMyA8LSBhcy5kYXRhLmZyYW1lKHQoYW5rZWl0by5mcmFtZS5tZWFuczIpKQphbmtlaXRvLmZyYW1lLm1lYW5zNCA8LSBhc190aWJibGUoYW5rZWl0by5mcmFtZS5tZWFuczMpICU+JSByZW5hbWUoTWVhbiA9IFYxKSAKYW5rZWl0by5mcmFtZS5tZWFuczQkQW5rZWl0byA8LSBuYW1lcyhhbmtlaXRvLmZyYW1lLm1lYW5zKQphbmtlaXRvLmZyYW1lLm1lYW5zNCRQcm9maWxlIDwtICJYMiIKYW5rZWl0by5mcmFtZS5tZWFuczQgPC0gYW5rZWl0by5mcmFtZS5tZWFuczRbLTEzLF0KCmFua2VpdG8uZnJhbWUubWVhbnMucDIgPC0gYW5rZWl0by5mcmFtZS5tZWFuczQKCmFua2VpdG8uZnJhbWUubWVhbnMgPC0gcmJpbmQoYW5rZWl0by5mcmFtZS5tZWFucy5wMSwgYW5rZWl0by5mcmFtZS5tZWFucy5wMikKCgoKcCA8LSBhbmtlaXRvLmZyYW1lLm1lYW5zICU+JQogIG11dGF0ZShQcm9maWxlID0gcmVjb2RlKFByb2ZpbGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgIFgxID0gIlByb2ZpbGUgQTogNTAlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBYMiA9ICJQcm9maWxlIEI6IDUwJSIpKSAlPiUKICBnZ3Bsb3QoYWVzKEFua2VpdG8sIE1lYW4sIGdyb3VwID0gUHJvZmlsZSwgY29sb3IgPSBQcm9maWxlKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIuMjUpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDEuMjUpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIlExTCIsICJRMU0iLCAiUTFIIiwgIlEyTCIsICJRMk0iLCAiUTJIIiwgIlEzTCIsICJRM00iLCAiUTNIIikpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gIlN0YW5kYXJkaXplZCBtZWFuIGFua2VpdG8iKSArCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTQpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLCBsZWdlbmQucG9zaXRpb24gPSAidG9wIikKCgpsaWJyYXJ5KHBsb3RseSkKCmdncGxvdGx5KHAsIHRvb2x0aXAgPSBjKCJBbmtlaXRvIiwgIk1lYW4iKSkgJT4lCiAgbGF5b3V0KGxlZ2VuZCA9IGxpc3Qob3JpZW50YXRpb24gPSAiaCIsIHkgPSAxLjIpKQoKI2FkZCBtZWFuIGxpc2FzIHNjb3JlCgoKYGBgCgojIG9uZS13YXkgTUFOT1ZBCgpgYGB7cn0KbGlicmFyeShyc3RhdGl4KQpsaWJyYXJ5KGdncHVicikKCm1vZDFfcHJvZmlsZSA8LSBkYXRhLmZyYW1lKGlkID0gYygxOjM2KSwgcHJvZmlsZSA9IG1vZDEkY2xhc3NpZmljYXRpb24pCmFua2VpdG9fd2l0aF9wcm9maWxlMiA8LSBjYmluZChhbmtlaXRvX2NsdXN0ZXJpbmcsIG1vZDFfcHJvZmlsZSkKCgojIFZpc3VhbGl6YXRpb24KCmdnYm94cGxvdCgKICBhbmtlaXRvX3dpdGhfcHJvZmlsZTIsIHggPSAicHJvZmlsZSIsIHkgPSBjKCJRMUwiLCAiUTFNIiwgIlExSCIsICJRMkwiLCAiUTJNIiwgIlEySCIsICJRM0wiLCAiUTNNIiwgIlEzSCIpLCAKICBtZXJnZSA9IFRSVUUsIHBhbGV0dGUgPSAiamNvIgopCgojIFN1bW1hcnkgc3RhdGlzdGljcwoKCmFua2VpdG9fd2l0aF9wcm9maWxlMiAlPiUKICBncm91cF9ieShwcm9maWxlKSAlPiUKICBnZXRfc3VtbWFyeV9zdGF0cyhRMUwsIFExTSwgUTFILCBRMkwsIFEyTSwgUTJILCBRM0wsIFEzTSwgUTNILCB0eXBlID0gIm1lYW5fc2QiKQoKIyBDaGVjayBzYW1wbGUgc2l6ZSBhc3N1bXB0aW9uCgphbmtlaXRvX3dpdGhfcHJvZmlsZTIgJT4lCiAgZ3JvdXBfYnkocHJvZmlsZSkgJT4lCiAgc3VtbWFyaXNlKE4gPSBuKCkpCgojIElkZW50aWZ5IHVuaXZhcmlhdGUgb3V0bGllcnMKCgphbmtlaXRvX3dpdGhfcHJvZmlsZTIgJT4lCiAgZ3JvdXBfYnkocHJvZmlsZSkgJT4lCiAgaWRlbnRpZnlfb3V0bGllcnMoUTFMKQoKYW5rZWl0b193aXRoX3Byb2ZpbGUyICU+JQogIGdyb3VwX2J5KHByb2ZpbGUpICU+JQogIGlkZW50aWZ5X291dGxpZXJzKFExTSkKCmFua2VpdG9fd2l0aF9wcm9maWxlMiAlPiUKICBncm91cF9ieShwcm9maWxlKSAlPiUKICBpZGVudGlmeV9vdXRsaWVycyhRMUgpCgphbmtlaXRvX3dpdGhfcHJvZmlsZTIgJT4lCiAgZ3JvdXBfYnkocHJvZmlsZSkgJT4lCiAgaWRlbnRpZnlfb3V0bGllcnMoUTJMKQoKYW5rZWl0b193aXRoX3Byb2ZpbGUyICU+JQogIGdyb3VwX2J5KHByb2ZpbGUpICU+JQogIGlkZW50aWZ5X291dGxpZXJzKFEyTSkKCmFua2VpdG9fd2l0aF9wcm9maWxlMiAlPiUKICBncm91cF9ieShwcm9maWxlKSAlPiUKICBpZGVudGlmeV9vdXRsaWVycyhRMkgpCgphbmtlaXRvX3dpdGhfcHJvZmlsZTIgJT4lCiAgZ3JvdXBfYnkocHJvZmlsZSkgJT4lCiAgaWRlbnRpZnlfb3V0bGllcnMoUTNMKQoKYW5rZWl0b193aXRoX3Byb2ZpbGUyICU+JQogIGdyb3VwX2J5KHByb2ZpbGUpICU+JQogIGlkZW50aWZ5X291dGxpZXJzKFEzTSkKCmFua2VpdG9fd2l0aF9wcm9maWxlMiAlPiUKICBncm91cF9ieShwcm9maWxlKSAlPiUKICBpZGVudGlmeV9vdXRsaWVycyhRM0gpCgojIERldGVjdCBtdWx0aXZhcmlhdGUgb3V0bGllcnMKCgoKYW5rZWl0b193aXRoX3Byb2ZpbGUyICU+JQogIGdyb3VwX2J5KHByb2ZpbGUpICU+JQogIG1haGFsYW5vYmlzX2Rpc3RhbmNlKC1pZCkgJT4lCiAgZmlsdGVyKGlzLm91dGxpZXIgPT0gVFJVRSkgJT4lCiAgYXMuZGF0YS5mcmFtZSgpCgoKIyBDaGVjayB1bml2YXJpYXRlIG5vcm1hbGl0eSBhc3N1bXB0aW9uCgoKCmFua2VpdG9fd2l0aF9wcm9maWxlMiAlPiUKICBncm91cF9ieShwcm9maWxlKSAlPiUKICBzaGFwaXJvX3Rlc3QoUTFMLCBRMU0sIFExSCwgUTJMLCBRMk0sIFEySCwgUTNMLCBRM00sIFEzSCkgJT4lCiAgYXJyYW5nZSh2YXJpYWJsZSkKCgoKIyBRUXBsb3QKZ2dxcXBsb3QoYW5rZWl0b193aXRoX3Byb2ZpbGUyLCAiUTFMIiwgZmFjZXQuYnkgPSAicHJvZmlsZSIsCiAgICAgICAgIHlsYWIgPSAiUTFMIiwgZ2d0aGVtZSA9IHRoZW1lX2J3KCkpCgpnZ3FxcGxvdChhbmtlaXRvX3dpdGhfcHJvZmlsZTIsICJRMU0iLCBmYWNldC5ieSA9ICJwcm9maWxlIiwKICAgICAgICAgeWxhYiA9ICJRMU0iLCBnZ3RoZW1lID0gdGhlbWVfYncoKSkKCmdncXFwbG90KGFua2VpdG9fd2l0aF9wcm9maWxlMiwgIlExSCIsIGZhY2V0LmJ5ID0gInByb2ZpbGUiLAogICAgICAgICB5bGFiID0gIlExSCIsIGdndGhlbWUgPSB0aGVtZV9idygpKQoKZ2dxcXBsb3QoYW5rZWl0b193aXRoX3Byb2ZpbGUyLCAiUTJMIiwgZmFjZXQuYnkgPSAicHJvZmlsZSIsCiAgICAgICAgIHlsYWIgPSAiUTJMIiwgZ2d0aGVtZSA9IHRoZW1lX2J3KCkpCgpnZ3FxcGxvdChhbmtlaXRvX3dpdGhfcHJvZmlsZTIsICJRMk0iLCBmYWNldC5ieSA9ICJwcm9maWxlIiwKICAgICAgICAgeWxhYiA9ICJRMk0iLCBnZ3RoZW1lID0gdGhlbWVfYncoKSkKCmdncXFwbG90KGFua2VpdG9fd2l0aF9wcm9maWxlMiwgIlEySCIsIGZhY2V0LmJ5ID0gInByb2ZpbGUiLAogICAgICAgICB5bGFiID0gIlEzTSIsIGdndGhlbWUgPSB0aGVtZV9idygpKQoKZ2dxcXBsb3QoYW5rZWl0b193aXRoX3Byb2ZpbGUyLCAiUTNMIiwgZmFjZXQuYnkgPSAicHJvZmlsZSIsCiAgICAgICAgIHlsYWIgPSAiUTNMIiwgZ2d0aGVtZSA9IHRoZW1lX2J3KCkpCgpnZ3FxcGxvdChhbmtlaXRvX3dpdGhfcHJvZmlsZTIsICJRM00iLCBmYWNldC5ieSA9ICJwcm9maWxlIiwKICAgICAgICAgeWxhYiA9ICJRM00iLCBnZ3RoZW1lID0gdGhlbWVfYncoKSkKCmdncXFwbG90KGFua2VpdG9fd2l0aF9wcm9maWxlMiwgIlEzSCIsIGZhY2V0LmJ5ID0gInByb2ZpbGUiLAogICAgICAgICB5bGFiID0gIlEzSCIsIGdndGhlbWUgPSB0aGVtZV9idygpKQoKIyBNdWx0aXZhcmlhdGUgbm9ybWFsaXR5CgphbmtlaXRvX3dpdGhfcHJvZmlsZTIgJT4lCiAgc2VsZWN0KFExTCwgUTFNLCBRMUgsIFEyTCwgUTJNLCBRMkgsIFEzTCwgUTNNLCBRM0gpICU+JQogIG1zaGFwaXJvX3Rlc3QoKQoKIyBJZGVudGlmeSBtdWx0aWNvbGxpbmVhcml0eQoKCmFua2VpdG9fd2l0aF9wcm9maWxlMiAlPiUgY29yX21hdChRMUwsIFExTSwgUTFILCBRMkwsIFEyTSwgUTJILCBRM0wsIFEzTSwgUTNIKSAlPiUgCiAgY29yX2dldF9wdmFsKCkKCiMgQ2hlY2sgbGluZWFyaXR5IGFzc3VtcHRpb24KCmxpYnJhcnkoR0dhbGx5KQpyZXN1bHRzIDwtIGFua2VpdG9fd2l0aF9wcm9maWxlMiAlPiUKICBzZWxlY3QoUTFMLCBRMU0sIFExSCwgUTJMLCBRMk0sIFEySCwgUTNMLCBRM00sIFEzSCwgcHJvZmlsZSkgJT4lCiAgZ3JvdXBfYnkocHJvZmlsZSkgJT4lCiAgZG9vKH5nZ3BhaXJzKC4pICsgdGhlbWVfYncoKSwgcmVzdWx0ID0gInBsb3RzIikKcmVzdWx0cwoKcmVzdWx0cyRwbG90cwoKCiMgQ2hlY2sgdGhlIGhvbW9nZW5laXR5IG9mIGNvdmFyaWFuY2VzIGFzc3VtcHRpb24KIyMg44Go44KK44GC44GI44Ga55Wl44GX44G+44GZCgoKIyBDb21wdXRhdGlvbgoKbW9kZWwgPC0gbG0oY2JpbmQoUTFMLCBRMU0sIFExSCwgUTJMLCBRMk0sIFEySCwgUTNMLCBRM00sIFEzSCkgfiBwcm9maWxlLCBhbmtlaXRvX3dpdGhfcHJvZmlsZTIpCk1hbm92YShtb2RlbCwgdGVzdC5zdGF0aXN0aWMgPSAiUGlsbGFpIikKCgojIFBvc3QtaG9jIHRlc3RzCgoKCiMgR3JvdXAgdGhlIGRhdGEgYnkgdmFyaWFibGUKZ3JvdXBlZC5kYXRhIDwtIGFua2VpdG9fd2l0aF9wcm9maWxlMiAlPiUKICBnYXRoZXIoa2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsdWUiLCBRMUwsIFExTSwgUTFILCBRMkwsIFEyTSwgUTJILCBRM0wsIFEzTSwgUTNIKSAlPiUKICBncm91cF9ieSh2YXJpYWJsZSkKCiMgRG8gd2VsY2ggb25lIHdheSBhbm92YSB0ZXN0Cmdyb3VwZWQuZGF0YSAlPiUgd2VsY2hfYW5vdmFfdGVzdCh2YWx1ZSB+IHByb2ZpbGUpCgpwd2MgPC0gYW5rZWl0b193aXRoX3Byb2ZpbGUyICU+JQogIGdhdGhlcihrZXkgPSAidmFyaWFibGVzIiwgdmFsdWUgPSAidmFsdWUiLCBRMUwsIFExTSwgUTFILCBRMkwsIFEyTSwgUTJILCBRM0wsIFEzTSwgUTNIKSAlPiUKICBncm91cF9ieSh2YXJpYWJsZXMpICU+JQogIGdhbWVzX2hvd2VsbF90ZXN0KHZhbHVlIH4gcHJvZmlsZSkgJT4lCiAgc2VsZWN0KC1lc3RpbWF0ZSwgLWNvbmYubG93LCAtY29uZi5oaWdoKSAjIFJlbW92ZSBkZXRhaWxzCnB3YwoKIyBWaXN1YWxpemF0aW9uOiBib3ggcGxvdHMgd2l0aCBwLXZhbHVlcwpwd2MgPC0gcHdjICU+JSBhZGRfeHlfcG9zaXRpb24oeCA9ICJwcm9maWxlIikKdGVzdC5sYWJlbCA8LSBjcmVhdGVfdGVzdF9sYWJlbCgKICBkZXNjcmlwdGlvbiA9ICJNQU5PVkEiLCBzdGF0aXN0aWMudGV4dCA9IHF1b3RlKGl0YWxpYygiRiIpKSwKICBzdGF0aXN0aWMgPSAxMi43NDEsIHA9ICI8MC4wMDAxIiwgcGFyYW1ldGVyID0gIjksIDI2IiwKICB0eXBlID0gImV4cHJlc3Npb24iLCBkZXRhaWxlZCA9IFRSVUUKKQpnZ2JveHBsb3QoCiAgYW5rZWl0b193aXRoX3Byb2ZpbGUyLCB4ID0gInByb2ZpbGUiLCB5ID0gYygiUTFMIiwgIlExTSIsICJRMUgiLCAiUTJMIiwgIlEyTSIsICJRMkgiLCAiUTNMIiwgIlEzTSIsICJRM0giKSwgCiAgbWVyZ2UgPSBUUlVFLCBwYWxldHRlID0gImpjbyIKKSArIAogIHN0YXRfcHZhbHVlX21hbnVhbCgKICAgIHB3YywgaGlkZS5ucyA9IFRSVUUsIHRpcC5sZW5ndGggPSAwLCAKICAgIHN0ZXAuaW5jcmVhc2UgPSAwLjEsIHN0ZXAuZ3JvdXAuYnkgPSAidmFyaWFibGVzIiwKICAgIGNvbG9yID0gInZhcmlhYmxlcyIKICApICsKICBsYWJzKAogICAgc3VidGl0bGUgPSB0ZXN0LmxhYmVsLAogICAgY2FwdGlvbiA9IGdldF9wd2NfbGFiZWwocHdjLCB0eXBlID0gImV4cHJlc3Npb24iKQogICkKCgpgYGAKCgojIExvZ3N0aWMgcmVncmVzc2lvbgpgYGB7cn0KYW5rZWl0b19saXNhcyA8LSByZWFkX3hsc3goIi9Vc2Vycy9yaWt1L0Ryb3Bib3gvemVtaXplbWkvZGF0YS9ob25qaWtlbi9hbmtlaXRvZGF0YV93aXRoX2NvcnJlY3RfYW5zXzIwMjAxMHZlcnNpb24ueGxzeCIsIHNoZWV0ID0gImxpc2FzIikKCmFua2VpdG9fbGlzYXNfd2l0aF9wcm9maWxlIDwtIGxlZnRfam9pbihhbmtlaXRvX2xpc2FzLCBtb2QxX3Byb2ZpbGUpCgphbmtlaXRvX2xpc2FzX3dpdGhfcHJvZmlsZSRwcm9maWxlIDwtIGFzLmZhY3RvcihhbmtlaXRvX2xpc2FzX3dpdGhfcHJvZmlsZSRwcm9maWxlKQoKCmFua2VpdG9fYWxsIDwtIGFua2VpdG9fd2l0aF9wcm9maWxlMgoKCgpsaXNhc19NIDwtIGFzLmRhdGEuZnJhbWUoYW5rZWl0b19saXNhc193aXRoX3Byb2ZpbGUgJT4lIGZpbHRlcihUQVNLID09ICJNQVQiLCBDT01QTEVYSVRZID09ICJNIikgJT4lIAogIHNlbGVjdChsaXNhcykpCgphbmtlaXRvX2FsbCRMaXNhc19NIDwtIGxpc2FzX00kbGlzYXMKCgoKbGlzYXNfSCA8LSBhcy5kYXRhLmZyYW1lKGFua2VpdG9fbGlzYXNfd2l0aF9wcm9maWxlICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiSCIpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGxpc2FzKSkKCmFua2VpdG9fYWxsJExpc2FzX0ggPC0gbGlzYXNfSCRsaXNhcwoKcHJlcGFyZV90aW1lX0wgPC0gYXMuZGF0YS5mcmFtZShhbmtlaXRvICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiTCIpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChwcmVwYXJlX3RpbWUpKQoKcHJlcGFyZV90aW1lX00gPC0gYXMuZGF0YS5mcmFtZShhbmtlaXRvX2xpc2FzX3dpdGhfcHJvZmlsZSAlPiUgZmlsdGVyKFRBU0sgPT0gIk1BVCIsIENPTVBMRVhJVFkgPT0gIk0iKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHByZXBhcmVfdGltZSkpCnByZXBhcmVfdGltZV9IIDwtIGFzLmRhdGEuZnJhbWUoYW5rZWl0b19saXNhc193aXRoX3Byb2ZpbGUgJT4lIGZpbHRlcihUQVNLID09ICJNQVQiLCBDT01QTEVYSVRZID09ICJIIikgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHByZXBhcmVfdGltZSkpCgphbmtlaXRvX2FsbCRwcmVwYXJlX3RpbWVfTCA8LSBwcmVwYXJlX3RpbWVfTCRwcmVwYXJlX3RpbWUKCmFua2VpdG9fYWxsJHByZXBhcmVfdGltZV9NIDwtIHByZXBhcmVfdGltZV9NJHByZXBhcmVfdGltZQoKYW5rZWl0b19hbGwkcHJlcGFyZV90aW1lX0ggPC0gcHJlcGFyZV90aW1lX0gkcHJlcGFyZV90aW1lCgpKYXBhbl9sZW5ndGggPC0gYXMuZGF0YS5mcmFtZShhbmtlaXRvICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiTCIpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QobGVuZ3RoX29mX3N0YXlfaW5fSmFwYW4pKQoKU1BPVDkwIDwtIGFzLmRhdGEuZnJhbWUoYW5rZWl0byAlPiUgZmlsdGVyKFRBU0sgPT0gIk1BVCIsIENPTVBMRVhJVFkgPT0gIkwiKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KFNQT1Q5MCkpCgphbmtlaXRvX2FsbCRKYXBhbl9sZW5ndGggPC0gSmFwYW5fbGVuZ3RoJGxlbmd0aF9vZl9zdGF5X2luX0phcGFuCmFua2VpdG9fYWxsJFNQT1Q5MCA8LSBTUE9UOTAkU1BPVDkwCgpBR0UgPC0gYXMuZGF0YS5mcmFtZShhbmtlaXRvICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiTCIpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGJpcnRoX3llYXIpKQoKQUdFJGJpcnRoX3llYXIgPC0gMjAyMCAtIEFHRSRiaXJ0aF95ZWFyCmFua2VpdG9fYWxsJEFHRSA8LSBBR0UkYmlydGhfeWVhcgoKCmFua2VpdG9fYWxsJHByb2ZpbGUyIDwtIGlmZWxzZShhbmtlaXRvX2FsbCRwcm9maWxlID09IDEsIDEsIDApCgpsb2dpdCA8LSBnbG0ocHJvZmlsZTIgfiBBR0UgKyBMaXNhc19NICsgTGlzYXNfSCArIHByZXBhcmVfdGltZV9MICsgcHJlcGFyZV90aW1lX00gKyBwcmVwYXJlX3RpbWVfSCArIEphcGFuX2xlbmd0aCArIFNQT1Q5MCwgZGF0YSA9IGFua2VpdG9fYWxsLCBmYW1pbHkgPSAiYmlub21pYWwiKQpzdW1tYXJ5KGxvZ2l0KQpgYGAKCgoKIyBTaWduaWZpY2FudCBUZXN0CgojIyBTUE9UIDkwCgpgYGB7cn0KbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkocnN0YXRpeCkKCm1vZDFfcHJvZmlsZSA8LSBkYXRhLmZyYW1lKGlkID0gYygxOjM2KSwgcHJvZmlsZSA9IG1vZDEkY2xhc3NpZmljYXRpb24pCgphbmtlaXRvX3dpdGhfcHJvZmlsZSA8LSBpbm5lcl9qb2luKGFua2VpdG8sIG1vZDFfcHJvZmlsZSkKClNQT1Q5MF9wIDwtIGFua2VpdG9fd2l0aF9wcm9maWxlICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiTCIpICU+JSAKICBzZWxlY3QoU1BPVDkwLCBwcm9maWxlKSAKClNQT1Q5MF9wJHByb2ZpbGUgPC0gYXMuZmFjdG9yKFNQT1Q5MF9wJHByb2ZpbGUpCgojZ2dwbG90KFNQT1Q5MF9wLCBhZXMoeCA9IHByb2ZpbGUsIGdyb3VwID0gcHJvZmlsZSwgeSA9IFNQT1Q5MCkpICsgZ2VvbV9ib3hwbG90KCkKI3QudGVzdChzZWxlY3QoZmlsdGVyKFNQT1Q5MF9wLCBwcm9maWxlID09ICIxIiksIFNQT1Q5MCksIHNlbGVjdChmaWx0ZXIoU1BPVDkwX3AsIHByb2ZpbGUgPT0gIjIiKSwgU1BPVDkwKSkKCgpTUE9UOTBfcCAlPiUKICBncm91cF9ieShwcm9maWxlKSAlPiUKICBnZXRfc3VtbWFyeV9zdGF0cyhTUE9UOTAsIHR5cGUgPSAibWVhbl9zZCIpCgpieHAgPC0gZ2dib3hwbG90KAogIFNQT1Q5MF9wLCB4ID0gInByb2ZpbGUiLCB5ID0gIlNQT1Q5MCIsIAogIHlsYWIgPSAiU1BPVDkwIiwgeGxhYiA9ICJQcm9maWxlIiwgYWRkID0gImppdHRlciIKKQpieHAKClNQT1Q5MF9wICU+JQogIGdyb3VwX2J5KHByb2ZpbGUpICU+JQogIGlkZW50aWZ5X291dGxpZXJzKFNQT1Q5MCkKClNQT1Q5MF9wIDwtIFNQT1Q5MF9wW2MoLTM2KSxdICNpZCAzNiBleGNsdWRlZAogICAgICAgICAgICAgICAgICAgIApTUE9UOTBfcCAlPiUKICBncm91cF9ieShwcm9maWxlKSAlPiUKICBnZXRfc3VtbWFyeV9zdGF0cyhTUE9UOTAsIHR5cGUgPSAibWVhbl9zZCIpCgpieHAgPC0gZ2dib3hwbG90KAogIFNQT1Q5MF9wLCB4ID0gInByb2ZpbGUiLCB5ID0gIlNQT1Q5MCIsIAogIHlsYWIgPSAiU1BPVDkwIiwgeGxhYiA9ICJQcm9maWxlIiwgYWRkID0gImppdHRlciIKKQoKYnhwCgoKU1BPVDkwX3AgJT4lCiAgZ3JvdXBfYnkocHJvZmlsZSkgJT4lCiAgc2hhcGlyb190ZXN0KFNQT1Q5MCkKCmdncXFwbG90KFNQT1Q5MF9wLCB4ID0gIlNQT1Q5MCIsIGZhY2V0LmJ5ID0gInByb2ZpbGUiKQoKClNQT1Q5MF9wICU+JSBsZXZlbmVfdGVzdChTUE9UOTAgfiBwcm9maWxlKQoKc3RhdC50ZXN0IDwtIFNQT1Q5MF9wICU+JSAKICB0X3Rlc3QoU1BPVDkwIH4gcHJvZmlsZSwgdmFyLmVxdWFsID0gVFJVRSkgJT4lCiAgYWRkX3NpZ25pZmljYW5jZSgpCnN0YXQudGVzdAoKCnN0YXQudGVzdCA8LSBzdGF0LnRlc3QgJT4lIGFkZF94eV9wb3NpdGlvbih4ID0gInByb2ZpbGUiKQpieHAgKyAKICBzdGF0X3B2YWx1ZV9tYW51YWwoc3RhdC50ZXN0LCB0aXAubGVuZ3RoID0gMCkgKwogIGxhYnMoc3VidGl0bGUgPSBnZXRfdGVzdF9sYWJlbChzdGF0LnRlc3QsIGRldGFpbGVkID0gVFJVRSkpCmBgYAoKIyMgTElTQVMKCiMjIyBMSVNBUyBNQVQgTSBQcm9maWxlIDEsIDIKCmBgYHtyfQoKYW5rZWl0b19saXNhcyA8LSByZWFkX3hsc3goIi9Vc2Vycy9yaWt1L0Ryb3Bib3gvemVtaXplbWkvZGF0YS9ob25qaWtlbi9hbmtlaXRvZGF0YV93aXRoX2NvcnJlY3RfYW5zXzIwMjAxMHZlcnNpb24ueGxzeCIsIHNoZWV0ID0gImxpc2FzIikKCmFua2VpdG9fbGlzYXNfd2l0aF9wcm9maWxlIDwtIGxlZnRfam9pbihhbmtlaXRvX2xpc2FzLCBtb2QxX3Byb2ZpbGUpCgphbmtlaXRvX2xpc2FzX3dpdGhfcHJvZmlsZSRwcm9maWxlIDwtIGFzLmZhY3RvcihhbmtlaXRvX2xpc2FzX3dpdGhfcHJvZmlsZSRwcm9maWxlKQoKCkxJU0FTX21hdF9tIDwtIGFua2VpdG9fbGlzYXNfd2l0aF9wcm9maWxlICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiTSIpICU+JSAKICBzZWxlY3QobGlzYXMsIHByb2ZpbGUpIAoKTElTQVNfbWF0X20gJT4lIAogIGdyb3VwX2J5KHByb2ZpbGUpICU+JSAKICBnZXRfc3VtbWFyeV9zdGF0cyhsaXNhcywgdHlwZSA9ICJtZWFuX3NkIikKCmJ4cCA8LSBnZ2JveHBsb3QoCiAgTElTQVNfbWF0X20sIHggPSAicHJvZmlsZSIsIHkgPSAibGlzYXMiLCAKICB5bGFiID0gIkxJU0FTIE1BVCBNIiwgeGxhYiA9ICJQUk9GSUxFIiwgYWRkID0gImppdHRlciIKKQpieHAKCkxJU0FTX21hdF9tICU+JSAKICBncm91cF9ieShwcm9maWxlKSAlPiUgCiAgaWRlbnRpZnlfb3V0bGllcnMobGlzYXMpCgpMSVNBU19tYXRfbSAlPiUgCiAgZ3JvdXBfYnkocHJvZmlsZSkgJT4lIAogIHNoYXBpcm9fdGVzdChsaXNhcykKCgpMSVNBU19tYXRfbSAlPiUgbGV2ZW5lX3Rlc3QobGlzYXMgfiBwcm9maWxlKQoKc3RhdC50ZXN0IDwtIExJU0FTX21hdF9tICU+JSAKICB0X3Rlc3QobGlzYXMgfiBwcm9maWxlKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlKCkKc3RhdC50ZXN0CgpzdGF0LnRlc3QgPC0gc3RhdC50ZXN0ICU+JSBhZGRfeHlfcG9zaXRpb24oeCA9ICJwcm9maWxlIikKYnhwICsgCiAgc3RhdF9wdmFsdWVfbWFudWFsKHN0YXQudGVzdCwgdGlwLmxlbmd0aCA9IDApICsKICBsYWJzKHN1YnRpdGxlID0gZ2V0X3Rlc3RfbGFiZWwoc3RhdC50ZXN0LCBkZXRhaWxlZCA9IFRSVUUpKQoKYGBgCgojIyMgTElTQVMgTUFUIEggUHJvZmlsZSAxLCAyCgpgYGB7cn0KCkxJU0FTX21hdF9oIDwtIGFua2VpdG9fbGlzYXNfd2l0aF9wcm9maWxlICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiSCIpICU+JSAKICBzZWxlY3QobGlzYXMsIHByb2ZpbGUpIAoKTElTQVNfbWF0X2ggJT4lIAogIGdyb3VwX2J5KHByb2ZpbGUpICU+JSAKICBnZXRfc3VtbWFyeV9zdGF0cyhsaXNhcywgdHlwZSA9ICJtZWFuX3NkIikKCmJ4cCA8LSBnZ2JveHBsb3QoCiAgTElTQVNfbWF0X2gsIHggPSAicHJvZmlsZSIsIHkgPSAibGlzYXMiLCAKICB5bGFiID0gIkxJU0FTIE1BVCBIIiwgeGxhYiA9ICJQUk9GSUxFIiwgYWRkID0gImppdHRlciIKKQpieHAKCkxJU0FTX21hdF9oICU+JSAKICBncm91cF9ieShwcm9maWxlKSAlPiUgCiAgaWRlbnRpZnlfb3V0bGllcnMobGlzYXMpCgpMSVNBU19tYXRfaCAlPiUgCiAgZ3JvdXBfYnkocHJvZmlsZSkgJT4lIAogIHNoYXBpcm9fdGVzdChsaXNhcykKCgpMSVNBU19tYXRfaCAlPiUgbGV2ZW5lX3Rlc3QobGlzYXMgfiBwcm9maWxlKQoKc3RhdC50ZXN0IDwtIExJU0FTX21hdF9oICU+JSAKICB0X3Rlc3QobGlzYXMgfiBwcm9maWxlLCB2YXIuZXF1YWwgPSBUUlVFKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlKCkKc3RhdC50ZXN0CgpzdGF0LnRlc3QgPC0gc3RhdC50ZXN0ICU+JSBhZGRfeHlfcG9zaXRpb24oeCA9ICJwcm9maWxlIikKYnhwICsgCiAgc3RhdF9wdmFsdWVfbWFudWFsKHN0YXQudGVzdCwgdGlwLmxlbmd0aCA9IDApICsKICBsYWJzKHN1YnRpdGxlID0gZ2V0X3Rlc3RfbGFiZWwoc3RhdC50ZXN0LCBkZXRhaWxlZCA9IFRSVUUpKQpgYGAKCiMjIyBNQVQgTSZIIHdpdGhpbiBQcm9maWxlIDEKCmBgYHtyIGRhdGEgcHJlcGFyZX0KTElTQVNfbWF0X20kdGFzayA8LSAiTUFUX00iCkxJU0FTX21hdF9oJHRhc2sgPC0gIk1BVF9IIgoKbGlzYXNfbWF0X3AgPC0gcmJpbmQoTElTQVNfbWF0X20sIExJU0FTX21hdF9oKQoKbGlzYXNfbWF0X3AxIDwtIGZpbHRlcihsaXNhc19tYXRfcCwgbGlzYXNfbWF0X3AkcHJvZmlsZSA9PSAiMSIpCmxpc2FzX21hdF9wMiA8LSBmaWx0ZXIobGlzYXNfbWF0X3AsIGxpc2FzX21hdF9wJHByb2ZpbGUgPT0gIjIiKQpgYGAKCmBgYHtyfQoKbWF0X3Byb2ZpbGVfMSA8LSBpbm5lcl9qb2luKAphbmtlaXRvX2xpc2FzX3dpdGhfcHJvZmlsZSAlPiUgZmlsdGVyKFRBU0sgPT0gIk1BVCIsIENPTVBMRVhJVFkgPT0gIk0iLCBwcm9maWxlID09ICIxIikgJT4lIAogIHNlbGVjdChpZCwgbGlzYXMsIHByb2ZpbGUpICU+JSByZW5hbWUoTUFUX00gPSBsaXNhcyksCmFua2VpdG9fbGlzYXNfd2l0aF9wcm9maWxlICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiSCIsIHByb2ZpbGUgPT0gIjEiKSAlPiUgCiAgc2VsZWN0KGlkLCBsaXNhcywgcHJvZmlsZSkgJT4lIHJlbmFtZShNQVRfSCA9IGxpc2FzKSkKCm1hdF9wcm9maWxlXzFfbG9uZyA8LSBtYXRfcHJvZmlsZV8xICU+JQogIGdhdGhlcihrZXkgPSAidGFzayIsIHZhbHVlID0gImxpc2FzIiwgTUFUX00sIE1BVF9IKQoKCm1hdF9wcm9maWxlXzFfbG9uZyAlPiUgCiAgZ3JvdXBfYnkodGFzaykgJT4lIAogIGdldF9zdW1tYXJ5X3N0YXRzKGxpc2FzLCB0eXBlID0gIm1lYW5fc2QiKQoKCmJ4cCA8LSBnZ3BhaXJlZChtYXRfcHJvZmlsZV8xX2xvbmcsIHggPSAidGFzayIsIHkgPSAibGlzYXMiLCAKICAgICAgICAgb3JkZXIgPSBjKCJNQVRfTSIsICJNQVRfSCIpLAogICAgICAgICB5bGFiID0gIkxJU0FTIE1BVCBQUk9GSUxFIDEiLCB4bGFiID0gIlRBU0siKQpieHAKCm1hdF9wcm9maWxlXzEgPC0gbWF0X3Byb2ZpbGVfMSAlPiUgbXV0YXRlKGRpZmZlcmVuY2VzID0gTUFUX00gLSBNQVRfSCkKCm1hdF9wcm9maWxlXzEgJT4lIGlkZW50aWZ5X291dGxpZXJzKGRpZmZlcmVuY2VzKQoKbWF0X3Byb2ZpbGVfMSAlPiUgc2hhcGlyb190ZXN0KGRpZmZlcmVuY2VzKSAKCnN0YXQudGVzdCA8LSBtYXRfcHJvZmlsZV8xX2xvbmcgICU+JSAKICB3aWxjb3hfdGVzdChsaXNhcyB+IHRhc2ssIHBhaXJlZCA9IFRSVUUpICU+JQogIGFkZF9zaWduaWZpY2FuY2UoKQpzdGF0LnRlc3QKCnN0YXQudGVzdCA8LSBzdGF0LnRlc3QgJT4lIGFkZF94eV9wb3NpdGlvbih4ID0gInRhc2siKQpieHAgKyAKICBzdGF0X3B2YWx1ZV9tYW51YWwoc3RhdC50ZXN0LCB0aXAubGVuZ3RoID0gMCkgKwogIGxhYnMoc3VidGl0bGUgPSBnZXRfdGVzdF9sYWJlbChzdGF0LnRlc3QsIGRldGFpbGVkPSBUUlVFKSkKYGBgCgojIyMgTUFUIE0mSCB3aXRoaW4gUHJvZmlsZSAyCgpgYGB7cn0KbWF0X3Byb2ZpbGVfMiA8LSBpbm5lcl9qb2luKAphbmtlaXRvX2xpc2FzX3dpdGhfcHJvZmlsZSAlPiUgZmlsdGVyKFRBU0sgPT0gIk1BVCIsIENPTVBMRVhJVFkgPT0gIk0iLCBwcm9maWxlID09ICIyIikgJT4lIAogIHNlbGVjdChpZCwgbGlzYXMsIHByb2ZpbGUpICU+JSByZW5hbWUoTUFUX00gPSBsaXNhcyksCmFua2VpdG9fbGlzYXNfd2l0aF9wcm9maWxlICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiSCIsIHByb2ZpbGUgPT0gIjIiKSAlPiUgCiAgc2VsZWN0KGlkLCBsaXNhcywgcHJvZmlsZSkgJT4lIHJlbmFtZShNQVRfSCA9IGxpc2FzKSkKCm1hdF9wcm9maWxlXzJfbG9uZyA8LSBtYXRfcHJvZmlsZV8yICU+JQogIGdhdGhlcihrZXkgPSAidGFzayIsIHZhbHVlID0gImxpc2FzIiwgTUFUX00sIE1BVF9IKQoKCm1hdF9wcm9maWxlXzJfbG9uZyAlPiUgCiAgZ3JvdXBfYnkodGFzaykgJT4lIAogIGdldF9zdW1tYXJ5X3N0YXRzKGxpc2FzLCB0eXBlID0gIm1lYW5fc2QiKQoKCmJ4cCA8LSBnZ3BhaXJlZChtYXRfcHJvZmlsZV8yX2xvbmcsIHggPSAidGFzayIsIHkgPSAibGlzYXMiLCAKICAgICAgICAgb3JkZXIgPSBjKCJNQVRfTSIsICJNQVRfSCIpLAogICAgICAgICB5bGFiID0gIkxJU0FTIE1BVCBQUk9GSUxFIDIiLCB4bGFiID0gIlRBU0siKQpieHAKCm1hdF9wcm9maWxlXzIgPC0gbWF0X3Byb2ZpbGVfMiAlPiUgbXV0YXRlKGRpZmZlcmVuY2VzID0gTUFUX00gLSBNQVRfSCkKCm1hdF9wcm9maWxlXzIgJT4lIGlkZW50aWZ5X291dGxpZXJzKGRpZmZlcmVuY2VzKQoKbWF0X3Byb2ZpbGVfMiAlPiUgc2hhcGlyb190ZXN0KGRpZmZlcmVuY2VzKSAKCnN0YXQudGVzdCA8LSBtYXRfcHJvZmlsZV8yX2xvbmcgICU+JSAKICB0X3Rlc3QobGlzYXMgfiB0YXNrLCBwYWlyZWQgPSBUUlVFKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlKCkKc3RhdC50ZXN0CgpzdGF0LnRlc3QgPC0gc3RhdC50ZXN0ICU+JSBhZGRfeHlfcG9zaXRpb24oeCA9ICJ0YXNrIikKYnhwICsgCiAgc3RhdF9wdmFsdWVfbWFudWFsKHN0YXQudGVzdCwgdGlwLmxlbmd0aCA9IDApICsKICBsYWJzKHN1YnRpdGxlID0gZ2V0X3Rlc3RfbGFiZWwoc3RhdC50ZXN0LCBkZXRhaWxlZD0gVFJVRSkpCmBgYAoKIyMjIFNBVCBNJkggd2l0aGluIFByb2ZpbGUgMQoKYGBge3J9CgpzYXRfcHJvZmlsZV8xIDwtIGlubmVyX2pvaW4oCmFua2VpdG9fbGlzYXNfd2l0aF9wcm9maWxlICU+JSBmaWx0ZXIoVEFTSyA9PSAiU0FUIiwgQ09NUExFWElUWSA9PSAiTSIsIHByb2ZpbGUgPT0gIjEiKSAlPiUgCiAgc2VsZWN0KGlkLCBsaXNhcywgcHJvZmlsZSkgJT4lIHJlbmFtZShTQVRfTSA9IGxpc2FzKSwKYW5rZWl0b19saXNhc193aXRoX3Byb2ZpbGUgJT4lIGZpbHRlcihUQVNLID09ICJTQVQiLCBDT01QTEVYSVRZID09ICJIIiwgcHJvZmlsZSA9PSAiMSIpICU+JSAKICBzZWxlY3QoaWQsIGxpc2FzLCBwcm9maWxlKSAlPiUgcmVuYW1lKFNBVF9IID0gbGlzYXMpKQoKc2F0X3Byb2ZpbGVfMV9sb25nIDwtIHNhdF9wcm9maWxlXzEgJT4lCiAgZ2F0aGVyKGtleSA9ICJ0YXNrIiwgdmFsdWUgPSAibGlzYXMiLCBTQVRfTSwgU0FUX0gpCgoKc2F0X3Byb2ZpbGVfMV9sb25nICU+JSAKICBncm91cF9ieSh0YXNrKSAlPiUgCiAgZ2V0X3N1bW1hcnlfc3RhdHMobGlzYXMsIHR5cGUgPSAibWVhbl9zZCIpCgoKYnhwIDwtIGdncGFpcmVkKHNhdF9wcm9maWxlXzFfbG9uZywgeCA9ICJ0YXNrIiwgeSA9ICJsaXNhcyIsIAogICAgICAgICBvcmRlciA9IGMoIlNBVF9NIiwgIlNBVF9IIiksCiAgICAgICAgIHlsYWIgPSAiTElTQVMgTUFUIFBST0ZJTEUgMSIsIHhsYWIgPSAiVEFTSyIpCmJ4cAoKc2F0X3Byb2ZpbGVfMSA8LSBzYXRfcHJvZmlsZV8xICU+JSBtdXRhdGUoZGlmZmVyZW5jZXMgPSBTQVRfTSAtIFNBVF9IKQoKc2F0X3Byb2ZpbGVfMSAlPiUgaWRlbnRpZnlfb3V0bGllcnMoZGlmZmVyZW5jZXMpCgpzYXRfcHJvZmlsZV8xICU+JSBzaGFwaXJvX3Rlc3QoZGlmZmVyZW5jZXMpIAoKc3RhdC50ZXN0IDwtIHNhdF9wcm9maWxlXzFfbG9uZyAgJT4lIAogIHRfdGVzdChsaXNhcyB+IHRhc2ssIHBhaXJlZCA9IFRSVUUpICU+JQogIGFkZF9zaWduaWZpY2FuY2UoKQpzdGF0LnRlc3QKCnN0YXQudGVzdCA8LSBzdGF0LnRlc3QgJT4lIGFkZF94eV9wb3NpdGlvbih4ID0gInRhc2siKQpieHAgKyAKICBzdGF0X3B2YWx1ZV9tYW51YWwoc3RhdC50ZXN0LCB0aXAubGVuZ3RoID0gMCkgKwogIGxhYnMoc3VidGl0bGUgPSBnZXRfdGVzdF9sYWJlbChzdGF0LnRlc3QsIGRldGFpbGVkPSBUUlVFKSkKYGBgCgojIyMgU0FUIE0mSCB3aXRoaW4gUHJvZmlsZSAyCgpgYGB7cn0Kc2F0X3Byb2ZpbGVfMiA8LSBpbm5lcl9qb2luKAphbmtlaXRvX2xpc2FzX3dpdGhfcHJvZmlsZSAlPiUgZmlsdGVyKFRBU0sgPT0gIlNBVCIsIENPTVBMRVhJVFkgPT0gIk0iLCBwcm9maWxlID09ICIyIikgJT4lIAogIHNlbGVjdChpZCwgbGlzYXMsIHByb2ZpbGUpICU+JSByZW5hbWUoU0FUX00gPSBsaXNhcyksCmFua2VpdG9fbGlzYXNfd2l0aF9wcm9maWxlICU+JSBmaWx0ZXIoVEFTSyA9PSAiU0FUIiwgQ09NUExFWElUWSA9PSAiSCIsIHByb2ZpbGUgPT0gIjIiKSAlPiUgCiAgc2VsZWN0KGlkLCBsaXNhcywgcHJvZmlsZSkgJT4lIHJlbmFtZShTQVRfSCA9IGxpc2FzKSkKCnNhdF9wcm9maWxlXzJfbG9uZyA8LSBzYXRfcHJvZmlsZV8yICU+JQogIGdhdGhlcihrZXkgPSAidGFzayIsIHZhbHVlID0gImxpc2FzIiwgU0FUX00sIFNBVF9IKQoKCnNhdF9wcm9maWxlXzJfbG9uZyAlPiUgCiAgZ3JvdXBfYnkodGFzaykgJT4lIAogIGdldF9zdW1tYXJ5X3N0YXRzKGxpc2FzLCB0eXBlID0gIm1lYW5fc2QiKQoKCmJ4cCA8LSBnZ3BhaXJlZChzYXRfcHJvZmlsZV8yX2xvbmcsIHggPSAidGFzayIsIHkgPSAibGlzYXMiLCAKICAgICAgICAgb3JkZXIgPSBjKCJTQVRfTSIsICJTQVRfSCIpLAogICAgICAgICB5bGFiID0gIkxJU0FTIE1BVCBQUk9GSUxFIDIiLCB4bGFiID0gIlRBU0siKQpieHAKCnNhdF9wcm9maWxlXzIgPC0gc2F0X3Byb2ZpbGVfMiAlPiUgbXV0YXRlKGRpZmZlcmVuY2VzID0gU0FUX00gLSBTQVRfSCkKCnNhdF9wcm9maWxlXzIgJT4lIGlkZW50aWZ5X291dGxpZXJzKGRpZmZlcmVuY2VzKQoKc2F0X3Byb2ZpbGVfMiAlPiUgc2hhcGlyb190ZXN0KGRpZmZlcmVuY2VzKSAKCnN0YXQudGVzdCA8LSBzYXRfcHJvZmlsZV8yX2xvbmcgICU+JSAKICB0X3Rlc3QobGlzYXMgfiB0YXNrLCBwYWlyZWQgPSBUUlVFKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlKCkKc3RhdC50ZXN0CgpzdGF0LnRlc3QgPC0gc3RhdC50ZXN0ICU+JSBhZGRfeHlfcG9zaXRpb24oeCA9ICJ0YXNrIikKYnhwICsgCiAgc3RhdF9wdmFsdWVfbWFudWFsKHN0YXQudGVzdCwgdGlwLmxlbmd0aCA9IDApICsKICBsYWJzKHN1YnRpdGxlID0gZ2V0X3Rlc3RfbGFiZWwoc3RhdC50ZXN0LCBkZXRhaWxlZD0gVFJVRSkpCmBgYAoKIyBkZW1vZ3JhcGhpYyBkYXRhCgpgYGB7cn0KZmlsdGVyKGFua2VpdG9fbGlzYXNfd2l0aF9wcm9maWxlLCBUQVNLID09ICJNQVQiLCBDT01QTEVYSVRZID09IkgiKQphbmtlaXRvX2xpc2FzX3dpdGhfcHJvZmlsZSRHZW5kZXIgPC0gYXMuZmFjdG9yKGFua2VpdG9fbGlzYXNfd2l0aF9wcm9maWxlJEdlbmRlcikKc3VtbWFyeShzZWxlY3QoYW5rZWl0b19saXNhc193aXRoX3Byb2ZpbGUsIEdlbmRlciwgcHJvZmlsZSkpCgphbmtlaXRvX2xpc2FzX3dpdGhfcHJvZmlsZSAlPiUgCiAgZmlsdGVyKFRBU0sgPT0gIk1BVCIsIENPTVBMRVhJVFkgPT0iSCIsIHByb2ZpbGUgPT0gMSkgJT4lIAogIHNlbGVjdChHZW5kZXIpICU+JSAKICBzdW1tYXJ5KCkKCmFua2VpdG9fbGlzYXNfd2l0aF9wcm9maWxlICU+JSAKICBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSJIIiwgcHJvZmlsZSA9PSAyKSAlPiUgCiAgc2VsZWN0KEdlbmRlcikgJT4lIAogIHN1bW1hcnkoKQoKYW5rZWl0b19saXNhc193aXRoX3Byb2ZpbGUgJT4lIAogIGZpbHRlcihUQVNLID09ICJNQVQiLCBDT01QTEVYSVRZID09IkgiLCBwcm9maWxlID09IDEpICU+JSAKICBzZWxlY3QobGVuZ3RoX29mX3N0YXlfaW5fSmFwYW4pICU+JSAKICBzdW1tYXJ5KCkKCmFua2VpdG9fbGlzYXNfd2l0aF9wcm9maWxlICU+JSAKICBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSJIIiwgcHJvZmlsZSA9PSAyKSAlPiUgCiAgc2VsZWN0KGxlbmd0aF9vZl9zdGF5X2luX0phcGFuKSAlPiUgCiAgc3VtbWFyeSgpCgpgYGAKCmBgYHtyfQoKYW5rZWl0b19saXNhc193aXRoX3Byb2ZpbGUgJT4lIAogIGZpbHRlcihUQVNLID09ICJNQVQiLCBDT01QTEVYSVRZID09IkgiKSAlPiUgCiAgZ2dib3hwbG90KHggPSAicHJvZmlsZSIsIHkgPSAiUTEiLCBjb2xvciA9ICJwcm9maWxlIiwKICB5bGFiID0gIlExIE1BVCBIIiwgeGxhYiA9ICJQUk9GSUxFIiwgYWRkID0gImppdHRlciIpCgpgYGAKCiMgV2lsY294b24gcmFuayBzdW0gdGVzdAoKIyMgTElTQVMKCiMjIyBMSVNBUyBNQVQgTSBQcm9maWxlIDEsIDIKCmBgYHtyfQoKCkxJU0FTX21hdF9tICU+JSAKICBncm91cF9ieShwcm9maWxlKSAlPiUgCiAgZ2V0X3N1bW1hcnlfc3RhdHMobGlzYXMsIHR5cGUgPSAibWVhbl9zZCIpCgpieHAgPC0gZ2dib3hwbG90KAogIExJU0FTX21hdF9tLCB4ID0gInByb2ZpbGUiLCB5ID0gImxpc2FzIiwgCiAgeWxhYiA9ICJMSVNBUyBNQVQgTSIsIHhsYWIgPSAiUFJPRklMRSIsIGFkZCA9ICJqaXR0ZXIiCikKYnhwCgpMSVNBU19tYXRfbSAlPiUgCiAgZ3JvdXBfYnkocHJvZmlsZSkgJT4lIAogIGlkZW50aWZ5X291dGxpZXJzKGxpc2FzKQoKTElTQVNfbWF0X20gJT4lIAogIGdyb3VwX2J5KHByb2ZpbGUpICU+JSAKICBzaGFwaXJvX3Rlc3QobGlzYXMpCgoKTElTQVNfbWF0X20gJT4lIGxldmVuZV90ZXN0KGxpc2FzIH4gcHJvZmlsZSkKCnN0YXQudGVzdCA8LSBMSVNBU19tYXRfbSAlPiUgCiAgd2lsY294X3Rlc3QobGlzYXMgfiBwcm9maWxlKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlKCkKc3RhdC50ZXN0CgpzdGF0LnRlc3QgPC0gc3RhdC50ZXN0ICU+JSBhZGRfeHlfcG9zaXRpb24oeCA9ICJwcm9maWxlIikKYnhwICsgCiAgc3RhdF9wdmFsdWVfbWFudWFsKHN0YXQudGVzdCwgdGlwLmxlbmd0aCA9IDApICsKICBsYWJzKHN1YnRpdGxlID0gZ2V0X3Rlc3RfbGFiZWwoc3RhdC50ZXN0LCBkZXRhaWxlZCA9IFRSVUUpKQoKYGBgCgojIyMgTElTQVMgTUFUIEggUHJvZmlsZSAxLCAyCgpgYGB7cn0KCkxJU0FTX21hdF9oIDwtIGFua2VpdG9fbGlzYXNfd2l0aF9wcm9maWxlICU+JSBmaWx0ZXIoVEFTSyA9PSAiTUFUIiwgQ09NUExFWElUWSA9PSAiSCIpICU+JSAKICBzZWxlY3QobGlzYXMsIHByb2ZpbGUpIAoKTElTQVNfbWF0X2ggJT4lIAogIGdyb3VwX2J5KHByb2ZpbGUpICU+JSAKICBnZXRfc3VtbWFyeV9zdGF0cyhsaXNhcywgdHlwZSA9ICJtZWFuX3NkIikKCmJ4cCA8LSBnZ2JveHBsb3QoCiAgTElTQVNfbWF0X2gsIHggPSAicHJvZmlsZSIsIHkgPSAibGlzYXMiLCAKICB5bGFiID0gIkxJU0FTIE1BVCBIIiwgeGxhYiA9ICJQUk9GSUxFIiwgYWRkID0gImppdHRlciIKKQpieHAKCkxJU0FTX21hdF9oICU+JSAKICBncm91cF9ieShwcm9maWxlKSAlPiUgCiAgaWRlbnRpZnlfb3V0bGllcnMobGlzYXMpCgpMSVNBU19tYXRfaCAlPiUgCiAgZ3JvdXBfYnkocHJvZmlsZSkgJT4lIAogIHNoYXBpcm9fdGVzdChsaXNhcykKCgpMSVNBU19tYXRfaCAlPiUgbGV2ZW5lX3Rlc3QobGlzYXMgfiBwcm9maWxlKQoKc3RhdC50ZXN0IDwtIExJU0FTX21hdF9oICU+JSAKICB3aWxjb3hfdGVzdChsaXNhcyB+IHByb2ZpbGUpICU+JQogIGFkZF9zaWduaWZpY2FuY2UoKQpzdGF0LnRlc3QKCnN0YXQudGVzdCA8LSBzdGF0LnRlc3QgJT4lIGFkZF94eV9wb3NpdGlvbih4ID0gInByb2ZpbGUiKQpieHAgKyAKICBzdGF0X3B2YWx1ZV9tYW51YWwoc3RhdC50ZXN0LCB0aXAubGVuZ3RoID0gMCkgKwogIGxhYnMoc3VidGl0bGUgPSBnZXRfdGVzdF9sYWJlbChzdGF0LnRlc3QsIGRldGFpbGVkID0gVFJVRSkpCmBgYAoKIyMjIE1BVCBNJkggd2l0aGluIFByb2ZpbGUgMQoKYGBge3J9CkxJU0FTX21hdF9tJHRhc2sgPC0gIk1BVF9NIgpMSVNBU19tYXRfaCR0YXNrIDwtICJNQVRfSCIKCmxpc2FzX21hdF9wIDwtIHJiaW5kKExJU0FTX21hdF9tLCBMSVNBU19tYXRfaCkKCmxpc2FzX21hdF9wMSA8LSBmaWx0ZXIobGlzYXNfbWF0X3AsIGxpc2FzX21hdF9wJHByb2ZpbGUgPT0gIjEiKQpsaXNhc19tYXRfcDIgPC0gZmlsdGVyKGxpc2FzX21hdF9wLCBsaXNhc19tYXRfcCRwcm9maWxlID09ICIyIikKYGBgCgpgYGB7cn0KCm1hdF9wcm9maWxlXzEgPC0gaW5uZXJfam9pbigKYW5rZWl0b19saXNhc193aXRoX3Byb2ZpbGUgJT4lIGZpbHRlcihUQVNLID09ICJNQVQiLCBDT01QTEVYSVRZID09ICJNIiwgcHJvZmlsZSA9PSAiMSIpICU+JSAKICBzZWxlY3QoaWQsIGxpc2FzLCBwcm9maWxlKSAlPiUgcmVuYW1lKE1BVF9NID0gbGlzYXMpLAphbmtlaXRvX2xpc2FzX3dpdGhfcHJvZmlsZSAlPiUgZmlsdGVyKFRBU0sgPT0gIk1BVCIsIENPTVBMRVhJVFkgPT0gIkgiLCBwcm9maWxlID09ICIxIikgJT4lIAogIHNlbGVjdChpZCwgbGlzYXMsIHByb2ZpbGUpICU+JSByZW5hbWUoTUFUX0ggPSBsaXNhcykpCgptYXRfcHJvZmlsZV8xX2xvbmcgPC0gbWF0X3Byb2ZpbGVfMSAlPiUKICBnYXRoZXIoa2V5ID0gInRhc2siLCB2YWx1ZSA9ICJsaXNhcyIsIE1BVF9NLCBNQVRfSCkKCgptYXRfcHJvZmlsZV8xX2xvbmcgJT4lIAogIGdyb3VwX2J5KHRhc2spICU+JSAKICBnZXRfc3VtbWFyeV9zdGF0cyhsaXNhcywgdHlwZSA9ICJtZWFuX3NkIikKCgpieHAgPC0gZ2dwYWlyZWQobWF0X3Byb2ZpbGVfMV9sb25nLCB4ID0gInRhc2siLCB5ID0gImxpc2FzIiwgCiAgICAgICAgIG9yZGVyID0gYygiTUFUX00iLCAiTUFUX0giKSwKICAgICAgICAgeWxhYiA9ICJMSVNBUyBNQVQgUFJPRklMRSAxIiwgeGxhYiA9ICJUQVNLIikKYnhwCgptYXRfcHJvZmlsZV8xIDwtIG1hdF9wcm9maWxlXzEgJT4lIG11dGF0ZShkaWZmZXJlbmNlcyA9IE1BVF9NIC0gTUFUX0gpCgptYXRfcHJvZmlsZV8xICU+JSBpZGVudGlmeV9vdXRsaWVycyhkaWZmZXJlbmNlcykKCm1hdF9wcm9maWxlXzEgJT4lIHNoYXBpcm9fdGVzdChkaWZmZXJlbmNlcykgCgpzdGF0LnRlc3QgPC0gbWF0X3Byb2ZpbGVfMV9sb25nICAlPiUgCiAgd2lsY294X3Rlc3QobGlzYXMgfiB0YXNrLCBwYWlyZWQgPSBUUlVFKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlKCkKc3RhdC50ZXN0CgpzdGF0LnRlc3QgPC0gc3RhdC50ZXN0ICU+JSBhZGRfeHlfcG9zaXRpb24oeCA9ICJ0YXNrIikKYnhwICsgCiAgc3RhdF9wdmFsdWVfbWFudWFsKHN0YXQudGVzdCwgdGlwLmxlbmd0aCA9IDApICsKICBsYWJzKHN1YnRpdGxlID0gZ2V0X3Rlc3RfbGFiZWwoc3RhdC50ZXN0LCBkZXRhaWxlZD0gVFJVRSkpCmBgYAoKIyMjIE1BVCBNJkggd2l0aGluIFByb2ZpbGUgMgoKYGBge3J9Cm1hdF9wcm9maWxlXzIgPC0gaW5uZXJfam9pbigKYW5rZWl0b19saXNhc193aXRoX3Byb2ZpbGUgJT4lIGZpbHRlcihUQVNLID09ICJNQVQiLCBDT01QTEVYSVRZID09ICJNIiwgcHJvZmlsZSA9PSAiMiIpICU+JSAKICBzZWxlY3QoaWQsIGxpc2FzLCBwcm9maWxlKSAlPiUgcmVuYW1lKE1BVF9NID0gbGlzYXMpLAphbmtlaXRvX2xpc2FzX3dpdGhfcHJvZmlsZSAlPiUgZmlsdGVyKFRBU0sgPT0gIk1BVCIsIENPTVBMRVhJVFkgPT0gIkgiLCBwcm9maWxlID09ICIyIikgJT4lIAogIHNlbGVjdChpZCwgbGlzYXMsIHByb2ZpbGUpICU+JSByZW5hbWUoTUFUX0ggPSBsaXNhcykpCgptYXRfcHJvZmlsZV8yX2xvbmcgPC0gbWF0X3Byb2ZpbGVfMiAlPiUKICBnYXRoZXIoa2V5ID0gInRhc2siLCB2YWx1ZSA9ICJsaXNhcyIsIE1BVF9NLCBNQVRfSCkKCgptYXRfcHJvZmlsZV8yX2xvbmcgJT4lIAogIGdyb3VwX2J5KHRhc2spICU+JSAKICBnZXRfc3VtbWFyeV9zdGF0cyhsaXNhcywgdHlwZSA9ICJtZWFuX3NkIikKCgpieHAgPC0gZ2dwYWlyZWQobWF0X3Byb2ZpbGVfMl9sb25nLCB4ID0gInRhc2siLCB5ID0gImxpc2FzIiwgCiAgICAgICAgIG9yZGVyID0gYygiTUFUX00iLCAiTUFUX0giKSwKICAgICAgICAgeWxhYiA9ICJMSVNBUyBNQVQgUFJPRklMRSAyIiwgeGxhYiA9ICJUQVNLIikKYnhwCgptYXRfcHJvZmlsZV8yIDwtIG1hdF9wcm9maWxlXzIgJT4lIG11dGF0ZShkaWZmZXJlbmNlcyA9IE1BVF9NIC0gTUFUX0gpCgptYXRfcHJvZmlsZV8yICU+JSBpZGVudGlmeV9vdXRsaWVycyhkaWZmZXJlbmNlcykKCm1hdF9wcm9maWxlXzIgJT4lIHNoYXBpcm9fdGVzdChkaWZmZXJlbmNlcykgCgpzdGF0LnRlc3QgPC0gbWF0X3Byb2ZpbGVfMl9sb25nICAlPiUgCiAgd2lsY294X3Rlc3QobGlzYXMgfiB0YXNrLCBwYWlyZWQgPSBUUlVFKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlKCkKc3RhdC50ZXN0CgpzdGF0LnRlc3QgPC0gc3RhdC50ZXN0ICU+JSBhZGRfeHlfcG9zaXRpb24oeCA9ICJ0YXNrIikKYnhwICsgCiAgc3RhdF9wdmFsdWVfbWFudWFsKHN0YXQudGVzdCwgdGlwLmxlbmd0aCA9IDApICsKICBsYWJzKHN1YnRpdGxlID0gZ2V0X3Rlc3RfbGFiZWwoc3RhdC50ZXN0LCBkZXRhaWxlZD0gVFJVRSkpCmBgYAoKCgojIyBTQVQgTFBBCmBgYHtyfQoKUTFMIDwtIGFua2VpdG8gJT4lIGZpbHRlcihUQVNLID09ICJTQVQiLCBDT01QTEVYSVRZID09ICJMIikgICU+JQogIHNlbGVjdCgiUTEiKSAlPiUgcmVuYW1lKFExTCA9IFExKQoKUTFNIDwtIGFua2VpdG8gJT4lIGZpbHRlcihUQVNLID09ICJTQVQiLCBDT01QTEVYSVRZID09ICJNIikgICU+JQogIHNlbGVjdCgiUTEiKSAlPiUgcmVuYW1lKFExTSA9IFExKQoKUTFIIDwtIGFua2VpdG8gJT4lIGZpbHRlcihUQVNLID09ICJTQVQiLCBDT01QTEVYSVRZID09ICJIIikgICU+JQogIHNlbGVjdCgiUTEiKSAlPiUgcmVuYW1lKFExSCA9IFExKQoKUTJMIDwtIGFua2VpdG8gJT4lIGZpbHRlcihUQVNLID09ICJTQVQiLCBDT01QTEVYSVRZID09ICJMIikgICU+JQogIHNlbGVjdCgiUTIiKSAlPiUgcmVuYW1lKFEyTCA9IFEyKQoKUTJNIDwtIGFua2VpdG8gJT4lIGZpbHRlcihUQVNLID09ICJTQVQiLCBDT01QTEVYSVRZID09ICJNIikgICU+JQogIHNlbGVjdCgiUTIiKSAlPiUgcmVuYW1lKFEyTSA9IFEyKQoKUTJIIDwtIGFua2VpdG8gJT4lIGZpbHRlcihUQVNLID09ICJTQVQiLCBDT01QTEVYSVRZID09ICJIIikgICU+JQogIHNlbGVjdCgiUTIiKSAlPiUgcmVuYW1lKFEySCA9IFEyKQoKUTNMIDwtIGFua2VpdG8gJT4lIGZpbHRlcihUQVNLID09ICJTQVQiLCBDT01QTEVYSVRZID09ICJMIikgICU+JQogIHNlbGVjdCgiUTMiKSAlPiUgcmVuYW1lKFEzTCA9IFEzKQoKUTNNIDwtIGFua2VpdG8gJT4lIGZpbHRlcihUQVNLID09ICJTQVQiLCBDT01QTEVYSVRZID09ICJNIikgICU+JQogIHNlbGVjdCgiUTMiKSAlPiUgcmVuYW1lKFEzTSA9IFEzKQoKUTNIIDwtIGFua2VpdG8gJT4lIGZpbHRlcihUQVNLID09ICJTQVQiLCBDT01QTEVYSVRZID09ICJIIikgICU+JQogIHNlbGVjdCgiUTMiKSAlPiUgcmVuYW1lKFEzSCA9IFEzKQoKUTRMIDwtIGFua2VpdG8gJT4lIGZpbHRlcihUQVNLID09ICJTQVQiLCBDT01QTEVYSVRZID09ICJMIikgICU+JQogIHNlbGVjdCgiUTQiKSAlPiUgcmVuYW1lKFE0TCA9IFE0KQoKUTRNIDwtIGFua2VpdG8gJT4lIGZpbHRlcihUQVNLID09ICJTQVQiLCBDT01QTEVYSVRZID09ICJNIikgICU+JQogIHNlbGVjdCgiUTQiKSAlPiUgcmVuYW1lKFE0TSA9IFE0KQoKUTRIIDwtIGFua2VpdG8gJT4lIGZpbHRlcihUQVNLID09ICJTQVQiLCBDT01QTEVYSVRZID09ICJIIikgICU+JQogIHNlbGVjdCgiUTQiKSAlPiUgcmVuYW1lKFE0SCA9IFE0KQoKYW5rZWl0by5mcmFtZSA8LSBkYXRhLmZyYW1lKFExTCwgUTFNLCBRMUgsIFEyTCwgUTJNLCBRMkgsIFEzTCwgUTNNLCBRM0gsIFE0TCwgUTRNLCBRNEgpCgphbmtlaXRvLmZyYW1lCmBgYApgYGB7cn0KCmFua2VpdG9fY2x1c3RlcmluZyA8LSBhbmtlaXRvLmZyYW1lICU+JQogIG5hLm9taXQoKSAKIyU+JQojICBtdXRhdGVfYWxsKGxpc3Qoc2NhbGUpKQoKQklDIDwtIG1jbHVzdEJJQyhhbmtlaXRvX2NsdXN0ZXJpbmcpCgpwbG90KEJJQykKCnN1bW1hcnkoQklDKQoKbW9kMyA8LSBNY2x1c3QoYW5rZWl0b19jbHVzdGVyaW5nLCBtb2RlbE5hbWVzID0gIkVWRSIsIEcgPSAyLCB4ID0gQklDKQoKc3VtbWFyeShtb2QzKQoKSUNMIDwtIG1jbHVzdElDTChhbmtlaXRvX2NsdXN0ZXJpbmcpCgpwbG90KElDTCkKCnN1bW1hcnkoSUNMKQoKCnJlcyA8LSBkYXRhLmZyYW1lKG1vZDEkY2xhc3NpZmljYXRpb24sIG1vZDMkY2xhc3NpZmljYXRpb24pCnJlc19tb2QxMyA8LSByZXMgJT4lIG11dGF0ZSgiQ29ycmVjdE9yTm90IiA9IGlmZWxzZShtb2QxLmNsYXNzaWZpY2F0aW9uID09IG1vZDMuY2xhc3NpZmljYXRpb24sICJDb3JyZWN0IiwiSW5jb3JyZWN0IikpCnJlc19tb2QxMwoKCmBgYAoKIyMjIFNBVCBNJkggd2l0aGluIFByb2ZpbGUgMQoKYGBge3J9CgpzYXRfcHJvZmlsZV8xIDwtIGlubmVyX2pvaW4oCmFua2VpdG9fbGlzYXNfd2l0aF9wcm9maWxlICU+JSBmaWx0ZXIoVEFTSyA9PSAiU0FUIiwgQ09NUExFWElUWSA9PSAiTSIsIHByb2ZpbGUgPT0gIjEiKSAlPiUgCiAgc2VsZWN0KGlkLCBsaXNhcywgcHJvZmlsZSkgJT4lIHJlbmFtZShTQVRfTSA9IGxpc2FzKSwKYW5rZWl0b19saXNhc193aXRoX3Byb2ZpbGUgJT4lIGZpbHRlcihUQVNLID09ICJTQVQiLCBDT01QTEVYSVRZID09ICJIIiwgcHJvZmlsZSA9PSAiMSIpICU+JSAKICBzZWxlY3QoaWQsIGxpc2FzLCBwcm9maWxlKSAlPiUgcmVuYW1lKFNBVF9IID0gbGlzYXMpKQoKc2F0X3Byb2ZpbGVfMV9sb25nIDwtIHNhdF9wcm9maWxlXzEgJT4lCiAgZ2F0aGVyKGtleSA9ICJ0YXNrIiwgdmFsdWUgPSAibGlzYXMiLCBTQVRfTSwgU0FUX0gpCgoKc2F0X3Byb2ZpbGVfMV9sb25nICU+JSAKICBncm91cF9ieSh0YXNrKSAlPiUgCiAgZ2V0X3N1bW1hcnlfc3RhdHMobGlzYXMsIHR5cGUgPSAibWVhbl9zZCIpCgoKYnhwIDwtIGdncGFpcmVkKHNhdF9wcm9maWxlXzFfbG9uZywgeCA9ICJ0YXNrIiwgeSA9ICJsaXNhcyIsIAogICAgICAgICBvcmRlciA9IGMoIlNBVF9NIiwgIlNBVF9IIiksCiAgICAgICAgIHlsYWIgPSAiTElTQVMgTUFUIFBST0ZJTEUgMSIsIHhsYWIgPSAiVEFTSyIpCmJ4cAoKc2F0X3Byb2ZpbGVfMSA8LSBzYXRfcHJvZmlsZV8xICU+JSBtdXRhdGUoZGlmZmVyZW5jZXMgPSBTQVRfTSAtIFNBVF9IKQoKc2F0X3Byb2ZpbGVfMSAlPiUgaWRlbnRpZnlfb3V0bGllcnMoZGlmZmVyZW5jZXMpCgpzYXRfcHJvZmlsZV8xICU+JSBzaGFwaXJvX3Rlc3QoZGlmZmVyZW5jZXMpIAoKc3RhdC50ZXN0IDwtIHNhdF9wcm9maWxlXzFfbG9uZyAgJT4lIAogIHdpbGNveF90ZXN0KGxpc2FzIH4gdGFzaywgcGFpcmVkID0gVFJVRSkgJT4lCiAgYWRkX3NpZ25pZmljYW5jZSgpCnN0YXQudGVzdAoKc3RhdC50ZXN0IDwtIHN0YXQudGVzdCAlPiUgYWRkX3h5X3Bvc2l0aW9uKHggPSAidGFzayIpCmJ4cCArIAogIHN0YXRfcHZhbHVlX21hbnVhbChzdGF0LnRlc3QsIHRpcC5sZW5ndGggPSAwKSArCiAgbGFicyhzdWJ0aXRsZSA9IGdldF90ZXN0X2xhYmVsKHN0YXQudGVzdCwgZGV0YWlsZWQ9IFRSVUUpKQpgYGAKCgojIyMgU0FUIE0mSCB3aXRoaW4gUHJvZmlsZSAyCgpgYGB7cn0Kc2F0X3Byb2ZpbGVfMiA8LSBpbm5lcl9qb2luKAphbmtlaXRvX2xpc2FzX3dpdGhfcHJvZmlsZSAlPiUgZmlsdGVyKFRBU0sgPT0gIlNBVCIsIENPTVBMRVhJVFkgPT0gIk0iLCBwcm9maWxlID09ICIyIikgJT4lIAogIHNlbGVjdChpZCwgbGlzYXMsIHByb2ZpbGUpICU+JSByZW5hbWUoU0FUX00gPSBsaXNhcyksCmFua2VpdG9fbGlzYXNfd2l0aF9wcm9maWxlICU+JSBmaWx0ZXIoVEFTSyA9PSAiU0FUIiwgQ09NUExFWElUWSA9PSAiSCIsIHByb2ZpbGUgPT0gIjIiKSAlPiUgCiAgc2VsZWN0KGlkLCBsaXNhcywgcHJvZmlsZSkgJT4lIHJlbmFtZShTQVRfSCA9IGxpc2FzKSkKCnNhdF9wcm9maWxlXzJfbG9uZyA8LSBzYXRfcHJvZmlsZV8yICU+JQogIGdhdGhlcihrZXkgPSAidGFzayIsIHZhbHVlID0gImxpc2FzIiwgU0FUX00sIFNBVF9IKQoKCnNhdF9wcm9maWxlXzJfbG9uZyAlPiUgCiAgZ3JvdXBfYnkodGFzaykgJT4lIAogIGdldF9zdW1tYXJ5X3N0YXRzKGxpc2FzLCB0eXBlID0gIm1lYW5fc2QiKQoKCmJ4cCA8LSBnZ3BhaXJlZChzYXRfcHJvZmlsZV8yX2xvbmcsIHggPSAidGFzayIsIHkgPSAibGlzYXMiLCAKICAgICAgICAgb3JkZXIgPSBjKCJTQVRfTSIsICJTQVRfSCIpLAogICAgICAgICB5bGFiID0gIkxJU0FTIE1BVCBQUk9GSUxFIDIiLCB4bGFiID0gIlRBU0siKQpieHAKCnNhdF9wcm9maWxlXzIgPC0gc2F0X3Byb2ZpbGVfMiAlPiUgbXV0YXRlKGRpZmZlcmVuY2VzID0gU0FUX00gLSBTQVRfSCkKCnNhdF9wcm9maWxlXzIgJT4lIGlkZW50aWZ5X291dGxpZXJzKGRpZmZlcmVuY2VzKQoKc2F0X3Byb2ZpbGVfMiAlPiUgc2hhcGlyb190ZXN0KGRpZmZlcmVuY2VzKSAKCnN0YXQudGVzdCA8LSBzYXRfcHJvZmlsZV8yX2xvbmcgICU+JSAKICB3aWxjb3hfdGVzdChsaXNhcyB+IHRhc2ssIHBhaXJlZCA9IFRSVUUpICU+JQogIGFkZF9zaWduaWZpY2FuY2UoKQpzdGF0LnRlc3QKCnN0YXQudGVzdCA8LSBzdGF0LnRlc3QgJT4lIGFkZF94eV9wb3NpdGlvbih4ID0gInRhc2siKQpieHAgKyAKICBzdGF0X3B2YWx1ZV9tYW51YWwoc3RhdC50ZXN0LCB0aXAubGVuZ3RoID0gMCkgKwogIGxhYnMoc3VidGl0bGUgPSBnZXRfdGVzdF9sYWJlbChzdGF0LnRlc3QsIGRldGFpbGVkPSBUUlVFKSkKYGBgCgpBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ21kK09wdGlvbitJKi4KCldoZW4geW91IHNhdmUgdGhlIG5vdGVib29rLCBhbiBIVE1MIGZpbGUgY29udGFpbmluZyB0aGUgY29kZSBhbmQgb3V0cHV0IHdpbGwgYmUgc2F2ZWQgYWxvbmdzaWRlIGl0IChjbGljayB0aGUgKlByZXZpZXcqIGJ1dHRvbiBvciBwcmVzcyAqQ21kK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCg==