RELATION WITH RETROPOSITION
Cart tree for N_RETROPOSITION_MM
tree<-rpart::rpart(N_POSITION~N_RETROPOSITION_MM,data=retropostion_data,control = rpart.control(minsplit = 15))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
Cart tree for T_RETROPOSITION_MM
tree<-rpart::rpart(T_POSITION~.,data=retropostion_data,control = rpart.control(minsplit = 8))
rpart.plot(tree,type=1,
extra=101, box.palette="GnBu",
branch.lty=3, shadow.col="gray", nn=TRUE
)

rpart.rules(tree)
CHECK DISTRIBUTION for RETROPOSITION
Histogram
postop_data %>% select(N_RETROPOSITION_MM,T_RETROPOSITION_MM) %>% reshape2::melt() %>%
ggplot()+
facet_wrap(~variable)+
geom_histogram(aes(x=value),fill="skyblue",color="gray")+
theme_bw()
No id variables; using all as measure variables

Q-Q Plots
The result of using Shapiro’s Normality test is also annotated in the plots.
shapiro_N_RETRO<-shapiro.test(postop_data$N_RETROPOSITION_MM)
shapiro_T_RETRO <-shapiro.test(postop_data$T_RETROPOSITION_MM)
qq_n_plot<-qplot(sample= postop_data$N_RETROPOSITION_MM,color="", main=paste0("Distribution of N_RETROPOSITION_MM\n","p_value=",shapiro_N_RETRO$p.value))+theme_bw()
qq_t_plot<-qplot(sample= postop_data$T_RETROPOSITION_MM,color="", main=paste0("Distribution of T_RETROPOSITION_MM\n","p_value=",shapiro_T_RETRO$p.value))+theme_bw()
#plotly::ggplotly(qq_n_plot)
#plotly::ggplotly(qq_t_plot)
gridExtra::grid.arrange(qq_n_plot,qq_t_plot,ncol=2,nrow=1)

Discrimnated by Eyes
postop_data %>% select(N_RETROPOSITION_MM,T_RETROPOSITION_MM,EYE) %>% reshape2::melt() %>%
ggplot()+
facet_grid(variable~EYE)+
geom_histogram(aes(x=value),fill="skyblue",color="gray")+
theme_bw()
Using EYE as id variables

nod_data<-postop_data %>% filter (EYE=="OD") %>% select(N_RETROPOSITION_MM) %>% unlist()
nos_data<-postop_data %>% filter (EYE=="OS") %>% select(N_RETROPOSITION_MM) %>% unlist()
tod_data<-postop_data %>% filter (EYE=="OD") %>% select(T_RETROPOSITION_MM) %>% unlist()
tos_data<-postop_data %>% filter (EYE=="OS") %>% select(T_RETROPOSITION_MM) %>% unlist()
shapiro_N_RETRO_OD <- shapiro.test(nod_data)
shapiro_N_RETRO_OS <- shapiro.test(nos_data)
shapiro_T_RETRO_OD <- shapiro.test(tod_data)
shapiro_T_RETRO_OS <- shapiro.test(tos_data)
nod_plot<-qplot(sample= nod_data,
color="",
main= paste0("Distribution of N_RETROPOSITION_MM for OD\n","shapiro p_value=",
shapiro_N_RETRO_OD$p.value))+
theme_bw()
nos_plot<-qplot(sample=nos_data,
color="",
main=paste0("Distribution of N_RETROPOSITION_MM for OS\n","shapiro p_value=",
shapiro_N_RETRO_OS$p.value))+theme_bw()
tod_plot<-qplot(sample=tod_data,
color="",
main= paste0("Distribution of T_RETROPOSITION_MM for OD\n","shapiro p_value=",
shapiro_T_RETRO_OD$p.value))+
theme_bw()
tos_plot<-qplot(sample= tos_data,
color="",
main=paste0("Distribution of T_RETROPOSITION_MM for OS\n","shapiro p_value=",
shapiro_T_RETRO_OS$p.value))+theme_bw()
gridExtra::grid.arrange(tos_plot,tod_plot,nod_plot,nos_plot)

Discriminated by Gender
postop_data %>% select(N_RETROPOSITION_MM,T_RETROPOSITION_MM,SEX) %>% reshape2::melt() %>%
ggplot()+
facet_grid(variable~SEX)+
geom_histogram(aes(x=value),fill="skyblue",color="gray")+
theme_bw()
Using SEX as id variables

nf_data<-postop_data %>% filter (SEX=="F") %>% select(N_RETROPOSITION_MM) %>% unlist()
nm_data<-postop_data %>% filter (SEX=="M") %>% select(N_RETROPOSITION_MM) %>% unlist()
tf_data<-postop_data %>% filter (SEX=="F") %>% select(T_RETROPOSITION_MM) %>% unlist()
tm_data<-postop_data %>% filter (SEX=="M") %>% select(T_RETROPOSITION_MM) %>% unlist()
shapiro_N_RETRO_F <- shapiro.test(nf_data)
shapiro_N_RETRO_M <- shapiro.test(nm_data)
shapiro_T_RETRO_F <- shapiro.test(tf_data)
shapiro_T_RETRO_M <- shapiro.test(tm_data)
nf_plot<-qplot(sample= nf_data,
color="",
main= paste0("Distribution of N_RETROPOSITION_MM for F\n","shapiro p_value=",
shapiro_N_RETRO_F$p.value))+
theme_bw()
nm_plot<-qplot(sample= nm_data,
color="",
main=paste0("Distribution of N_RETROPOSITION_MM for M\n","shapiro p_value=",
shapiro_N_RETRO_M$p.value))+theme_bw()
tf_plot<-qplot(sample= tf_data,
color="",
main= paste0("Distribution of T_RETROPOSITION_MM for F\n","shapiro p_value=",
shapiro_T_RETRO_F$p.value))+
theme_bw()
tm_plot<-qplot(sample= tm_data,
color="",
main=paste0("Distribution of T_RETROPOSITION_MM for M\n","shapiro p_value=",
shapiro_T_RETRO_M$p.value))+theme_bw()
gridExtra::grid.arrange(tf_plot,tm_plot,nf_plot,nm_plot)

Discriminated by IOL MODEL
postop_data %>% select(N_RETROPOSITION_MM,T_RETROPOSITION_MM,IOL_MODEL_NEW) %>% reshape2::melt() %>%
ggplot()+
facet_grid(variable~IOL_MODEL_NEW)+
geom_histogram(aes(x=value),fill="skyblue",color="gray")+
theme_bw()
Using IOL_MODEL_NEW as id variables

postop_data %>% select(N_RETROPOSITION_MM,T_RETROPOSITION_MM,IOL_MODEL_NEW) %>% reshape2::melt() %>%
ggplot()+
facet_grid(variable~IOL_MODEL_NEW)+
geom_qq(aes(sample=value),fill="skyblue",color="red")+
theme_bw()
Using IOL_MODEL_NEW as id variables

Saphiro_test for T_RETROPOSITION_NN
postop_data %>% select(T_RETROPOSITION_MM,IOL_MODEL_NEW) %>%
group_by(IOL_MODEL_NEW) %>%
nest() %>%
mutate(saphiro_test=purrr::map(data, ~{shapiro.test(.x$T_RETROPOSITION_MM)%>% broom::tidy()} ) ) %>% select(-data)%>% unnest(cols = c("saphiro_test"))
Saphiro_test for N_RETROPOSITION_NN
postop_data %>% select(N_RETROPOSITION_MM,IOL_MODEL_NEW) %>%
group_by(IOL_MODEL_NEW) %>%
nest() %>%
mutate(saphiro_test=purrr::map(data, ~{shapiro.test(.x$N_RETROPOSITION_MM)%>% broom::tidy()} ) ) %>% select(-data)%>% unnest(cols = c("saphiro_test"))
HYPOTHESIS TESTING
By EYES
Check if significant differences exist between OD and OS for N_RETROPOSITION_MM and T_RETROPOSITION_MM
rbind(
t.test(tos_data,tod_data) %>% broom::tidy() %>% mutate(RETROPOSITION="T"),
t.test(nos_data,nod_data) %>% broom::tidy() %>% mutate(RETROPOSITION="N")
) %>% select(RETROPOSITION,p.value,method, alternative, conf.low, conf.high)
By GENDER
Check if significant differences exist between F and M for N_RETROPOSITION_MM and T_RETROPOSITION_MM
rbind(
t.test(tf_data,tm_data) %>% broom::tidy() %>% mutate(RETROPOSITION="T"),
t.test(nf_data,nm_data) %>% broom::tidy() %>% mutate(RETROPOSITION="N")
) %>% select(RETROPOSITION,p.value,method, alternative, conf.low, conf.high)
By IOL MODELS
We use ONE WAY ANOVA instead of T-test paired
nretro_model<-postop_data %>% select(N_RETROPOSITION_MM,IOL_MODEL_NEW) %>%
group_by(IOL_MODEL_NEW)
anova_nretro<-oneway.test(N_RETROPOSITION_MM~IOL_MODEL_NEW,data=nretro_model) %>% broom::tidy()
Multiple parameters; naming those columns num.df, denom.df
anova_nretro$RETROPOSITION_MM <- "N"
tretro_model<-postop_data %>% select(T_RETROPOSITION_MM,IOL_MODEL_NEW) %>%
group_by(IOL_MODEL_NEW)
anova_tretro<-oneway.test(T_RETROPOSITION_MM~IOL_MODEL_NEW,data=tretro_model) %>%broom::tidy()
Multiple parameters; naming those columns num.df, denom.df
anova_tretro$RETROPOSITION_MM <- "T"
rbind(anova_nretro,anova_tretro) %>% select(RETROPOSITION_MM,method,p.value)
LS0tCnRpdGxlOiAiSVogSUNMIFBPU0lUSU9OIEFOQUxZU0lTIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jX2NvbGxhcHNlZDogdHJ1ZQotLS0KCgpgYGB7cn0KcG9zdG9wX2RhdGE8LXJlYWRyOjpyZWFkX2NzdihmaWxlID0gInBvc3RvcF9kYXRhX2NsZWFuZWQuY3N2IikKYGBgCgpgYGB7cn0KcmV0cm9wb3N0aW9uX2RhdGE8LXBvc3RvcF9kYXRhICU+JSBzZWxlY3QoTl9SRVRST1BPU0lUSU9OX01NLFRfUkVUUk9QT1NJVElPTl9NTSxQT1NJVElPTikgJT4lIHNlcGFyYXRlKFBPU0lUSU9OLGludG89YygiTl9QT1NJVElPTiIsIlRfUE9TSVRJT04iKSxzZXA9Jy0nKQpgYGAKIyAgUkVMQVRJT04gV0lUSCBSRVRST1BPU0lUSU9OCiMjIENhcnQgdHJlZSBmb3IgTl9SRVRST1BPU0lUSU9OX01NCgpgYGB7cn0KdHJlZTwtcnBhcnQ6OnJwYXJ0KE5fUE9TSVRJT05+Tl9SRVRST1BPU0lUSU9OX01NLGRhdGE9cmV0cm9wb3N0aW9uX2RhdGEsY29udHJvbCA9IHJwYXJ0LmNvbnRyb2wobWluc3BsaXQgPSAxNSkpCnJwYXJ0LnBsb3QodHJlZSx0eXBlPTEsCiAgICAgICAgICAgZXh0cmE9MTAxLCBib3gucGFsZXR0ZT0iR25CdSIsCiAgICAgICAgICAgYnJhbmNoLmx0eT0zLCBzaGFkb3cuY29sPSJncmF5Iiwgbm49VFJVRQogICAgICAgICkKcnBhcnQucnVsZXModHJlZSkKYGBgCgojIyBDYXJ0IHRyZWUgZm9yIFRfUkVUUk9QT1NJVElPTl9NTQpgYGB7cn0KdHJlZTwtcnBhcnQ6OnJwYXJ0KFRfUE9TSVRJT05+LixkYXRhPXJldHJvcG9zdGlvbl9kYXRhLGNvbnRyb2wgPSBycGFydC5jb250cm9sKG1pbnNwbGl0ID0gOCkpCnJwYXJ0LnBsb3QodHJlZSx0eXBlPTEsCiAgICAgICAgICAgZXh0cmE9MTAxLCBib3gucGFsZXR0ZT0iR25CdSIsCiAgICAgICAgICAgYnJhbmNoLmx0eT0zLCBzaGFkb3cuY29sPSJncmF5Iiwgbm49VFJVRQogICAgICAgICkKcnBhcnQucnVsZXModHJlZSkKYGBgCgoKCiMgQ0hFQ0sgRElTVFJJQlVUSU9OIGZvciBSRVRST1BPU0lUSU9OCiMjIE1lZGlhIGFuZCBTdGFuZGFyZCBkZXZpYXRpb24gYW5kIDk1JSBDSQoKCmBgYHtyfQoKZXN0aW1hdGVfcG9zaXRpb248LXBvc3RvcF9kYXRhICU+JSBzZWxlY3QoVF9SRVRST1BPU0lUSU9OX01NLE5fUkVUUk9QT1NJVElPTl9NTSkgJT4lIAogIHJlc2hhcGUyOjptZWx0KCkgJT4lIAogIGdyb3VwX2J5KHZhcmlhYmxlKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW49bWVhbih2YWx1ZSksc2Q9c2QodmFsdWUpKQoKY2lfdF9wb3NpdGlvbjwtdC50ZXN0KHBvc3RvcF9kYXRhJFRfUkVUUk9QT1NJVElPTl9NTSwpICU+JSBicm9vbTo6dGlkeSgpICU+JSBzZWxlY3QoY29uZi5sb3csY29uZi5oaWdoKQpjaV9uX3Bvc2l0aW9uPC10LnRlc3QocG9zdG9wX2RhdGEkTl9SRVRST1BPU0lUSU9OX01NLCkgJT4lIGJyb29tOjp0aWR5KCkgJT4lIHNlbGVjdChjb25mLmxvdyxjb25mLmhpZ2gpCgpjYmluZChlc3RpbWF0ZV9wb3NpdGlvbixyYmluZChjaV90X3Bvc2l0aW9uLGNpX25fcG9zaXRpb24pKQpgYGAKCiMjIEhpc3RvZ3JhbSAKCmBgYHtyfQpwb3N0b3BfZGF0YSAlPiUgc2VsZWN0KE5fUkVUUk9QT1NJVElPTl9NTSxUX1JFVFJPUE9TSVRJT05fTU0pICU+JSByZXNoYXBlMjo6bWVsdCgpICU+JQogIGdncGxvdCgpKwogIGZhY2V0X3dyYXAofnZhcmlhYmxlKSsKICBnZW9tX2hpc3RvZ3JhbShhZXMoeD12YWx1ZSksZmlsbD0ic2t5Ymx1ZSIsY29sb3I9ImdyYXkiKSsKICB0aGVtZV9idygpCmBgYAojIyBRLVEgUGxvdHMKClRoZSByZXN1bHQgb2YgdXNpbmcgU2hhcGlybydzIE5vcm1hbGl0eSB0ZXN0IGlzIGFsc28gYW5ub3RhdGVkIGluIHRoZSBwbG90cy4KCmBgYHtyfQpzaGFwaXJvX05fUkVUUk88LXNoYXBpcm8udGVzdChwb3N0b3BfZGF0YSROX1JFVFJPUE9TSVRJT05fTU0pIApzaGFwaXJvX1RfUkVUUk8gPC1zaGFwaXJvLnRlc3QocG9zdG9wX2RhdGEkVF9SRVRST1BPU0lUSU9OX01NKSAKCnFxX25fcGxvdDwtcXBsb3Qoc2FtcGxlPSBwb3N0b3BfZGF0YSROX1JFVFJPUE9TSVRJT05fTU0sY29sb3I9IiIsIG1haW49cGFzdGUwKCJEaXN0cmlidXRpb24gb2YgTl9SRVRST1BPU0lUSU9OX01NXG4iLCJwX3ZhbHVlPSIsc2hhcGlyb19OX1JFVFJPJHAudmFsdWUpKSt0aGVtZV9idygpCgpxcV90X3Bsb3Q8LXFwbG90KHNhbXBsZT0gcG9zdG9wX2RhdGEkVF9SRVRST1BPU0lUSU9OX01NLGNvbG9yPSIiLCBtYWluPXBhc3RlMCgiRGlzdHJpYnV0aW9uIG9mIFRfUkVUUk9QT1NJVElPTl9NTVxuIiwicF92YWx1ZT0iLHNoYXBpcm9fVF9SRVRSTyRwLnZhbHVlKSkrdGhlbWVfYncoKQoKI3Bsb3RseTo6Z2dwbG90bHkocXFfbl9wbG90KQojcGxvdGx5OjpnZ3Bsb3RseShxcV90X3Bsb3QpCgpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShxcV9uX3Bsb3QscXFfdF9wbG90LG5jb2w9Mixucm93PTEpCmBgYAoKIyMgRGlzY3JpbW5hdGVkIGJ5IEV5ZXMKYGBge3J9CnBvc3RvcF9kYXRhICU+JSBzZWxlY3QoTl9SRVRST1BPU0lUSU9OX01NLFRfUkVUUk9QT1NJVElPTl9NTSxFWUUpICU+JSByZXNoYXBlMjo6bWVsdCgpICU+JQogIGdncGxvdCgpKwogIGZhY2V0X2dyaWQodmFyaWFibGV+RVlFKSsKICBnZW9tX2hpc3RvZ3JhbShhZXMoeD12YWx1ZSksZmlsbD0ic2t5Ymx1ZSIsY29sb3I9ImdyYXkiKSsKICB0aGVtZV9idygpCmBgYApgYGB7ciBmaWcud2lkdGg9MTJ9Cgpub2RfZGF0YTwtcG9zdG9wX2RhdGEgJT4lIGZpbHRlciAoRVlFPT0iT0QiKSAlPiUgc2VsZWN0KE5fUkVUUk9QT1NJVElPTl9NTSkgJT4lIHVubGlzdCgpCm5vc19kYXRhPC1wb3N0b3BfZGF0YSAlPiUgZmlsdGVyIChFWUU9PSJPUyIpICU+JSBzZWxlY3QoTl9SRVRST1BPU0lUSU9OX01NKSAlPiUgdW5saXN0KCkKdG9kX2RhdGE8LXBvc3RvcF9kYXRhICU+JSBmaWx0ZXIgKEVZRT09Ik9EIikgJT4lIHNlbGVjdChUX1JFVFJPUE9TSVRJT05fTU0pICU+JSB1bmxpc3QoKQp0b3NfZGF0YTwtcG9zdG9wX2RhdGEgJT4lIGZpbHRlciAoRVlFPT0iT1MiKSAlPiUgc2VsZWN0KFRfUkVUUk9QT1NJVElPTl9NTSkgJT4lIHVubGlzdCgpCgpzaGFwaXJvX05fUkVUUk9fT0QgPC0gc2hhcGlyby50ZXN0KG5vZF9kYXRhKSAKc2hhcGlyb19OX1JFVFJPX09TIDwtIHNoYXBpcm8udGVzdChub3NfZGF0YSkgCnNoYXBpcm9fVF9SRVRST19PRCA8LSBzaGFwaXJvLnRlc3QodG9kX2RhdGEpIApzaGFwaXJvX1RfUkVUUk9fT1MgPC0gc2hhcGlyby50ZXN0KHRvc19kYXRhKSAKCm5vZF9wbG90PC1xcGxvdChzYW1wbGU9IG5vZF9kYXRhLCAKICAgICAgY29sb3I9IiIsIAogICAgICBtYWluPSBwYXN0ZTAoIkRpc3RyaWJ1dGlvbiBvZiBOX1JFVFJPUE9TSVRJT05fTU0gZm9yIE9EXG4iLCJzaGFwaXJvIHBfdmFsdWU9IiwKICAgICAgICAgICAgICAgc2hhcGlyb19OX1JFVFJPX09EJHAudmFsdWUpKSsKICAgICAgICB0aGVtZV9idygpCgpub3NfcGxvdDwtcXBsb3Qoc2FtcGxlPW5vc19kYXRhLAogICAgICBjb2xvcj0iIiwgCiAgICAgIG1haW49cGFzdGUwKCJEaXN0cmlidXRpb24gb2YgTl9SRVRST1BPU0lUSU9OX01NIGZvciBPU1xuIiwic2hhcGlybyBwX3ZhbHVlPSIsCiAgICAgICAgICAgICAgICAgIHNoYXBpcm9fTl9SRVRST19PUyRwLnZhbHVlKSkrdGhlbWVfYncoKQoKdG9kX3Bsb3Q8LXFwbG90KHNhbXBsZT10b2RfZGF0YSwgCiAgICAgIGNvbG9yPSIiLCAKICAgICAgbWFpbj0gcGFzdGUwKCJEaXN0cmlidXRpb24gb2YgVF9SRVRST1BPU0lUSU9OX01NIGZvciBPRFxuIiwic2hhcGlybyBwX3ZhbHVlPSIsCiAgICAgICAgICAgICAgIHNoYXBpcm9fVF9SRVRST19PRCRwLnZhbHVlKSkrCiAgICAgICAgdGhlbWVfYncoKQoKdG9zX3Bsb3Q8LXFwbG90KHNhbXBsZT0gdG9zX2RhdGEsCiAgICAgIGNvbG9yPSIiLCAKICAgICAgbWFpbj1wYXN0ZTAoIkRpc3RyaWJ1dGlvbiBvZiBUX1JFVFJPUE9TSVRJT05fTU0gZm9yIE9TXG4iLCJzaGFwaXJvIHBfdmFsdWU9IiwKICAgICAgICAgICAgICAgICAgc2hhcGlyb19UX1JFVFJPX09TJHAudmFsdWUpKSt0aGVtZV9idygpCgpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZSh0b3NfcGxvdCx0b2RfcGxvdCxub2RfcGxvdCxub3NfcGxvdCkKCmBgYAoKIyMgRGlzY3JpbWluYXRlZCBieSBHZW5kZXIKYGBge3J9CnBvc3RvcF9kYXRhICU+JSBzZWxlY3QoTl9SRVRST1BPU0lUSU9OX01NLFRfUkVUUk9QT1NJVElPTl9NTSxTRVgpICU+JSByZXNoYXBlMjo6bWVsdCgpICU+JQogIGdncGxvdCgpKwogIGZhY2V0X2dyaWQodmFyaWFibGV+U0VYKSsKICBnZW9tX2hpc3RvZ3JhbShhZXMoeD12YWx1ZSksZmlsbD0ic2t5Ymx1ZSIsY29sb3I9ImdyYXkiKSsKICB0aGVtZV9idygpCmBgYAoKYGBge3IgZmlnLndpZHRoPTEyfQpuZl9kYXRhPC1wb3N0b3BfZGF0YSAlPiUgZmlsdGVyIChTRVg9PSJGIikgJT4lIHNlbGVjdChOX1JFVFJPUE9TSVRJT05fTU0pICU+JSB1bmxpc3QoKQpubV9kYXRhPC1wb3N0b3BfZGF0YSAlPiUgZmlsdGVyIChTRVg9PSJNIikgJT4lIHNlbGVjdChOX1JFVFJPUE9TSVRJT05fTU0pICU+JSB1bmxpc3QoKQp0Zl9kYXRhPC1wb3N0b3BfZGF0YSAlPiUgZmlsdGVyIChTRVg9PSJGIikgJT4lIHNlbGVjdChUX1JFVFJPUE9TSVRJT05fTU0pICU+JSB1bmxpc3QoKQp0bV9kYXRhPC1wb3N0b3BfZGF0YSAlPiUgZmlsdGVyIChTRVg9PSJNIikgJT4lIHNlbGVjdChUX1JFVFJPUE9TSVRJT05fTU0pICU+JSB1bmxpc3QoKQoKc2hhcGlyb19OX1JFVFJPX0YgPC0gc2hhcGlyby50ZXN0KG5mX2RhdGEpIApzaGFwaXJvX05fUkVUUk9fTSA8LSBzaGFwaXJvLnRlc3Qobm1fZGF0YSkgCnNoYXBpcm9fVF9SRVRST19GIDwtIHNoYXBpcm8udGVzdCh0Zl9kYXRhKSAKc2hhcGlyb19UX1JFVFJPX00gPC0gc2hhcGlyby50ZXN0KHRtX2RhdGEpIAoKCm5mX3Bsb3Q8LXFwbG90KHNhbXBsZT0gbmZfZGF0YSwgCiAgICAgIGNvbG9yPSIiLCAKICAgICAgbWFpbj0gcGFzdGUwKCJEaXN0cmlidXRpb24gb2YgTl9SRVRST1BPU0lUSU9OX01NIGZvciBGXG4iLCJzaGFwaXJvIHBfdmFsdWU9IiwKICAgICAgICAgICAgICAgc2hhcGlyb19OX1JFVFJPX0YkcC52YWx1ZSkpKwogICAgICAgIHRoZW1lX2J3KCkKCm5tX3Bsb3Q8LXFwbG90KHNhbXBsZT0gbm1fZGF0YSwKICAgICAgY29sb3I9IiIsIAogICAgICBtYWluPXBhc3RlMCgiRGlzdHJpYnV0aW9uIG9mIE5fUkVUUk9QT1NJVElPTl9NTSBmb3IgTVxuIiwic2hhcGlybyBwX3ZhbHVlPSIsCiAgICAgICAgICAgICAgICAgIHNoYXBpcm9fTl9SRVRST19NJHAudmFsdWUpKSt0aGVtZV9idygpCgp0Zl9wbG90PC1xcGxvdChzYW1wbGU9IHRmX2RhdGEsIAogICAgICBjb2xvcj0iIiwgCiAgICAgIG1haW49IHBhc3RlMCgiRGlzdHJpYnV0aW9uIG9mIFRfUkVUUk9QT1NJVElPTl9NTSBmb3IgRlxuIiwic2hhcGlybyBwX3ZhbHVlPSIsCiAgICAgICAgICAgICAgIHNoYXBpcm9fVF9SRVRST19GJHAudmFsdWUpKSsKICAgICAgICB0aGVtZV9idygpCgp0bV9wbG90PC1xcGxvdChzYW1wbGU9IHRtX2RhdGEsCiAgICAgIGNvbG9yPSIiLCAKICAgICAgbWFpbj1wYXN0ZTAoIkRpc3RyaWJ1dGlvbiBvZiBUX1JFVFJPUE9TSVRJT05fTU0gZm9yIE1cbiIsInNoYXBpcm8gcF92YWx1ZT0iLAogICAgICAgICAgICAgICAgICBzaGFwaXJvX1RfUkVUUk9fTSRwLnZhbHVlKSkrdGhlbWVfYncoKQoKZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UodGZfcGxvdCx0bV9wbG90LG5mX3Bsb3Qsbm1fcGxvdCkKCmBgYAoKIyMgRGlzY3JpbWluYXRlZCBieSBJT0wgTU9ERUwKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTJ9Cgpwb3N0b3BfZGF0YSAlPiUgc2VsZWN0KE5fUkVUUk9QT1NJVElPTl9NTSxUX1JFVFJPUE9TSVRJT05fTU0sSU9MX01PREVMX05FVykgJT4lIHJlc2hhcGUyOjptZWx0KCkgJT4lCiAgZ2dwbG90KCkrCiAgZmFjZXRfZ3JpZCh2YXJpYWJsZX5JT0xfTU9ERUxfTkVXKSsKICBnZW9tX2hpc3RvZ3JhbShhZXMoeD12YWx1ZSksZmlsbD0ic2t5Ymx1ZSIsY29sb3I9ImdyYXkiKSsKICB0aGVtZV9idygpCgpgYGAKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTJ9CnBvc3RvcF9kYXRhICU+JSBzZWxlY3QoTl9SRVRST1BPU0lUSU9OX01NLFRfUkVUUk9QT1NJVElPTl9NTSxJT0xfTU9ERUxfTkVXKSAlPiUgcmVzaGFwZTI6Om1lbHQoKSAlPiUKICBnZ3Bsb3QoKSsKICBmYWNldF9ncmlkKHZhcmlhYmxlfklPTF9NT0RFTF9ORVcpKwogIGdlb21fcXEoYWVzKHNhbXBsZT12YWx1ZSksZmlsbD0ic2t5Ymx1ZSIsY29sb3I9InJlZCIpKwogIHRoZW1lX2J3KCkKYGBgCgojIyMgU2FwaGlyb190ZXN0IGZvciBUX1JFVFJPUE9TSVRJT05fTk4KYGBge3J9CnBvc3RvcF9kYXRhICU+JSBzZWxlY3QoVF9SRVRST1BPU0lUSU9OX01NLElPTF9NT0RFTF9ORVcpICU+JSAKICBncm91cF9ieShJT0xfTU9ERUxfTkVXKSAlPiUgCiAgbmVzdCgpICAlPiUKICBtdXRhdGUoc2FwaGlyb190ZXN0PXB1cnJyOjptYXAoZGF0YSwgfntzaGFwaXJvLnRlc3QoLngkVF9SRVRST1BPU0lUSU9OX01NKSU+JSBicm9vbTo6dGlkeSgpfSApICApICU+JSBzZWxlY3QoLWRhdGEpJT4lIHVubmVzdChjb2xzID0gYygic2FwaGlyb190ZXN0IikpCmBgYAojIyMgU2FwaGlyb190ZXN0IGZvciBOX1JFVFJPUE9TSVRJT05fTk4KYGBge3J9CnBvc3RvcF9kYXRhICU+JSBzZWxlY3QoTl9SRVRST1BPU0lUSU9OX01NLElPTF9NT0RFTF9ORVcpICU+JSAKICBncm91cF9ieShJT0xfTU9ERUxfTkVXKSAlPiUgCiAgbmVzdCgpICAlPiUKICBtdXRhdGUoc2FwaGlyb190ZXN0PXB1cnJyOjptYXAoZGF0YSwgfntzaGFwaXJvLnRlc3QoLngkTl9SRVRST1BPU0lUSU9OX01NKSU+JSBicm9vbTo6dGlkeSgpfSApICApICU+JSBzZWxlY3QoLWRhdGEpJT4lIHVubmVzdChjb2xzID0gYygic2FwaGlyb190ZXN0IikpCmBgYAoKCiMgSFlQT1RIRVNJUyBURVNUSU5HCiMjIEJ5IEVZRVMKQ2hlY2sgaWYgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgZXhpc3QgYmV0d2VlbiBPRCBhbmQgT1MgZm9yIE5fUkVUUk9QT1NJVElPTl9NTSBhbmQgVF9SRVRST1BPU0lUSU9OX01NCmBgYHtyfQpyYmluZCgKICB0LnRlc3QodG9zX2RhdGEsdG9kX2RhdGEpICU+JSBicm9vbTo6dGlkeSgpICU+JSBtdXRhdGUoUkVUUk9QT1NJVElPTj0iVCIpLCAKICB0LnRlc3Qobm9zX2RhdGEsbm9kX2RhdGEpICU+JSBicm9vbTo6dGlkeSgpICU+JSBtdXRhdGUoUkVUUk9QT1NJVElPTj0iTiIpCikgJT4lIHNlbGVjdChSRVRST1BPU0lUSU9OLHAudmFsdWUsbWV0aG9kLCBhbHRlcm5hdGl2ZSwgY29uZi5sb3csIGNvbmYuaGlnaCkKYGBgCgojIyBCeSBHRU5ERVIKCkNoZWNrIGlmIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGV4aXN0IGJldHdlZW4gRiBhbmQgTSBmb3IgTl9SRVRST1BPU0lUSU9OX01NIGFuZCBUX1JFVFJPUE9TSVRJT05fTU0KYGBge3J9CnJiaW5kKAogIHQudGVzdCh0Zl9kYXRhLHRtX2RhdGEpICU+JSBicm9vbTo6dGlkeSgpICU+JSBtdXRhdGUoUkVUUk9QT1NJVElPTj0iVCIpLCAKICB0LnRlc3QobmZfZGF0YSxubV9kYXRhKSAlPiUgYnJvb206OnRpZHkoKSAlPiUgbXV0YXRlKFJFVFJPUE9TSVRJT049Ik4iKQopICU+JSBzZWxlY3QoUkVUUk9QT1NJVElPTixwLnZhbHVlLG1ldGhvZCwgYWx0ZXJuYXRpdmUsIGNvbmYubG93LCBjb25mLmhpZ2gpCmBgYAojIyBCeSBJT0wgTU9ERUxTCldlIHVzZSBPTkUgV0FZIEFOT1ZBIGluc3RlYWQgb2YgVC10ZXN0IHBhaXJlZApgYGB7cn0KbnJldHJvX21vZGVsPC1wb3N0b3BfZGF0YSAlPiUgc2VsZWN0KE5fUkVUUk9QT1NJVElPTl9NTSxJT0xfTU9ERUxfTkVXKSAlPiUgCiAgZ3JvdXBfYnkoSU9MX01PREVMX05FVykKCmFub3ZhX25yZXRybzwtb25ld2F5LnRlc3QoTl9SRVRST1BPU0lUSU9OX01NfklPTF9NT0RFTF9ORVcsZGF0YT1ucmV0cm9fbW9kZWwpICU+JSBicm9vbTo6dGlkeSgpCmFub3ZhX25yZXRybyRSRVRST1BPU0lUSU9OX01NIDwtICJOIgoKdHJldHJvX21vZGVsPC1wb3N0b3BfZGF0YSAlPiUgc2VsZWN0KFRfUkVUUk9QT1NJVElPTl9NTSxJT0xfTU9ERUxfTkVXKSAlPiUgCiAgZ3JvdXBfYnkoSU9MX01PREVMX05FVykKCmFub3ZhX3RyZXRybzwtb25ld2F5LnRlc3QoVF9SRVRST1BPU0lUSU9OX01NfklPTF9NT0RFTF9ORVcsZGF0YT10cmV0cm9fbW9kZWwpICU+JWJyb29tOjp0aWR5KCkKYW5vdmFfdHJldHJvJFJFVFJPUE9TSVRJT05fTU0gPC0gIlQiCgpyYmluZChhbm92YV9ucmV0cm8sYW5vdmFfdHJldHJvKSAlPiUgc2VsZWN0KFJFVFJPUE9TSVRJT05fTU0sbWV0aG9kLHAudmFsdWUpCmBgYAojIENPTkNMVVNJT05TCgoxLiBOX1JFVFJPUE9TSVRJT05fTU0gKE5fUkVUUk8pIEFORCBUX1JFVFJPUE9TSVRJT05fTU0gKFRfUkVUUk8pIHZhcmlhYmxlcyBhcmUgY2xlYXJseSByZWxhdGVkIHdpdGggdGhlIFBPU0lUSU9OIHZhcmlhYmxlIGluIHRoZSBkYXRhc2V0LiBBIHZhbHVlLiAoU2VlIENBUlQgVHJlZXMpLiBBIHZhbHVlIG9mIE5fUkVUUk8gPiAwLjQxIGFuZCBUX1JFVFJPID4wLjM4IGlzIHJlbGF0ZWQgd2l0aCBDUCBjbGFzcyBpbiBQT1NJVElPTi4KMi4gQm90aCBOX1JFVFJPIGFuZCBUX1JFVFJPIGZvbGxvdyBhIG5vcm1hbCBkaXN0cmlidXRpb24gd2l0aCBtZWFuIDAuNDMgYW5kIDAuNDIsIHJlc3BlY3RpdmVseS4gKHNlZSBtZWRpYSwgc2QgYW5kIENJKQozLiBHcm91cGluZyBieSBHRU5ERVIsIEVZRVMgYW5kIElPTF9NT0RFTCBhbHNvIHNob3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uIGFjY29yZGluZyB0byBxcXBsb3RzLCBoaXN0b2dyYW1zIGFuZCBTYXBoaXJvIHRlc3RzLgo0LiBUIGFuZCBvbmUtd2F5IEFOT1ZBIHRlc3RzIGNhcnJpZWQgb3V0IG92ZXIgYWxsIHRoZSBncm91cHMgc2hvdyB0aGVyZSBpcyBubyBlbm91Z2ggZXZpZGVuY2UgaW4gdGhlIGRhdGEgdGhhdCBpbmRpY2F0ZSBHRU5ERVIsIEVZRVMgYW5kIElPTF9NT0RFTCBoYXZlIGluZmx1ZW5jZSBpbiB0aGUgdmFsdWUgb2YgVF9SRVRSTyBhbmQgTl9SRVRSTy4gKHNlZSBwLnZhbHVlKSBhbmQgY29uc2VxdWVudGx5IHRoZSBQT1NUSU9OLgo1LiBNb3JlIGV4cGVyaW1lbnRzIHNob3VsZCBiZSBjb25kdWN0ZWQgdG8gZ2V0IG1vcmUgZXZpZGVuY2UuCg==