Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+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 Ctrl+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.

Load up packages

library(ape)
library(geiger)
library(nlme)
library(caper)
library(car)

Preparation

Import data and tree

Data=read.csv("data_new.csv", header=TRUE)
TreePrimate=read.nexus("consensusTree_10kTrees_Primates_Version3.nex")
row.names(Data)=Data$Species

Convert into factor or numerical

Data$Brainvol <- as.numeric(Data$Brainvol)
Data$Body.weight<- as.numeric(Data$Body.weight)
Data$Neo<- as.numeric(Data$Neo)
Data$Hippocampus.total<- as.numeric(Data$Hippocampus.total)
Data$HP.HS.fibers<- as.numeric(Data$HP.HS.fibers)
Data$Hippocampus.retrocomm.<- as.numeric(Data$Hippocampus.retrocomm.)
Data$Subiculum<- as.numeric(Data$Subiculum)
Data$CA1<- as.numeric(Data$CA1)
Data$CA2<- as.numeric(Data$CA2)
Data$CA3<- as.numeric(Data$CA3)
Data$Hilus<- as.numeric(Data$Hilus)
Data$Fascia.dentata<- as.numeric(Data$Fascia.dentata)
Data$Terrestriality<- as.factor(Data$Terrestriality)
Data$Diurnality<- as.factor(Data$Diurnality)
Data$X.Fruit<- as.numeric(Data$X.Fruit)
Data$Group.size<- as.numeric(Data$Group.size)
Data$HR.size.avg<- as.numeric(Data$HR.size.avg)
Data$Soc_sys_dec<- as.factor(Data$Soc_sys_dec)
Data$Mat_sys_dec<- as.factor(Data$Mat_sys_dec)
Data$Soc_gr_sz_dec<- as.numeric(Data$Soc_gr_sz_dec)
Data$Group_dunbar<- as.numeric(Data$Group_dunbar)
Data$GroupF_dunbar<- as.numeric(Data$GroupF_dunbar)

Log and min-max stdize

Data$Brainvol <- log(Data$Brainvol)
Data$Body.weight<- log(Data$Body.weight)
Data$Neo<- log(Data$Neo)
Data$Hippocampus.total<- log(Data$Hippocampus.total)
Data$HP.HS.fibers<- log(Data$HP.HS.fibers)
Data$Hippocampus.retrocomm.<- log(Data$Hippocampus.retrocomm.)
Data$Subiculum<- log(Data$Subiculum)
Data$CA1<- log(Data$CA1)
Data$CA2<- log(Data$CA2)
Data$CA3<- log(Data$CA3)
Data$Hilus<- log(Data$Hilus)
Data$Fascia.dentata<- log(Data$Fascia.dentata)
Data$Group.size<- log(Data$Group.size)
Data$HR.size.avg<- log(Data$HR.size.avg)
Data$Soc_gr_sz_dec<- log(Data$Soc_gr_sz_dec)
Data$Group_dunbar<- log(Data$Group_dunbar)
Data$GroupF_dunbar<- log(Data$GroupF_dunbar)
#min-max stdze function
stdize = stdize = function(x, ...) {(x - min(x, ...)) / (max(x, ...) - min(x, ...))}
                        
Data$Brainvol <- stdize(Data$Brainvol, na.rm = T)
Data$Body.weight<- stdize(Data$Body.weight, na.rm = T)
Data$Neo<- stdize(Data$Neo, na.rm = T)
Data$Hippocampus.total<- stdize(Data$Hippocampus.total, na.rm = T)
Data$HP.HS.fibers<- stdize(Data$HP.HS.fibers, na.rm = T)
Data$Hippocampus.retrocomm.<- stdize(Data$Hippocampus.retrocomm., na.rm = T)
Data$Subiculum<- stdize(Data$Subiculum, na.rm = T)
Data$CA1<- stdize(Data$CA1, na.rm = T)
Data$CA2<- stdize(Data$CA2, na.rm = T)
Data$CA3<- stdize(Data$CA3, na.rm = T)
Data$Hilus<- stdize(Data$Hilus, na.rm = T)
Data$Fascia.dentata<- stdize(Data$Fascia.dentata, na.rm = T)
Data$X.Fruit<- stdize(Data$X.Fruit, na.rm = T)
Data$Group.size<- stdize(Data$Group.size, na.rm = T)
Data$HR.size.avg<- stdize(Data$HR.size.avg, na.rm = T)
Data$Soc_gr_sz_dec<- stdize(Data$Soc_gr_sz_dec, na.rm = T)
Data$Group_dunbar<- stdize(Data$Group_dunbar, na.rm = T)
Data$GroupF_dunbar<- stdize(Data$GroupF_dunbar, na.rm = T)

plot all models

p <- ggplot(Data) + 
  theme_bw() +
  geom_jitter(aes(Hippocampus.total,Brainvol)) + geom_smooth(aes(Hippocampus.total,Brainvol), method=lm, colour = "black", se=FALSE) +
  geom_jitter(aes(Hippocampus.total, X.Fruit), colour="red", shape = 15) + geom_smooth(aes(Hippocampus.total, X.Fruit), colour = "red", method=lm, se=FALSE, linetype = "dashed") +
  geom_jitter(aes(Hippocampus.total, HR.size.avg), colour="blue", shape = 17) + geom_smooth(aes(Hippocampus.total, HR.size.avg), method=lm, colour="blue", se=FALSE, linetype = "longdash") +
  geom_jitter(aes(Hippocampus.total, Soc_gr_sz_dec), colour="darkgreen", shape = 3) + geom_smooth(aes(Hippocampus.total, Soc_gr_sz_dec), method=lm, colour="darkgreen", se=FALSE, linetype = "dotted") +
  labs(x = "ln(Hippocampus volume)", y = "ln(Total brain volume)    / Fraction Fruit    / ln(HR)    / Group Size     ")

PGLS

Create comp obj for caper

primate <- comparative.data(phy = TreePrimate, data = Data, names.col = Species, vcv = TRUE, na.omit = FALSE, warn.dropped = TRUE)

Neocortex

model.pglsNeo<-pgls(Hippocampus.total ~ Brainvol+Neo, data = primate, lambda='ML')
sink("neocortex.txt")
summary(model.pglsNeo)
anova(model.pglsNeo)
sink()

Home range

model.pgls1h<-pgls(Hippocampus.total ~ Brainvol+HR.size.avg, data = primate, lambda='ML')
model.pgls2h<-pgls(HP.HS.fibers ~ Brainvol+HR.size.avg, data = primate, lambda='ML')
model.pgls3h<-pgls(Hippocampus.retrocomm. ~ Brainvol+HR.size.avg, data = primate, lambda='ML')
model.pgls4h<-pgls(Subiculum ~ Brainvol+HR.size.avg, data = primate, lambda='ML')
model.pgls5h<-pgls(Hilus ~ Brainvol+HR.size.avg, data = primate, lambda='ML')
model.pgls6h<-pgls(CA1 ~ Brainvol+HR.size.avg, data = primate, lambda='ML')
model.pgls7h<-pgls(CA2 ~ Brainvol+HR.size.avg, data = primate, lambda='ML')
model.pgls8h<-pgls(CA3 ~ Brainvol+HR.size.avg, data = primate, lambda='ML')
model.pgls9h<-pgls(Fascia.dentata ~ Brainvol+HR.size.avg, data = primate, lambda='ML')
sink("model-HR.txt")
options(width=10000)
summary(model.pgls1h)
summary(model.pgls2h)
summary(model.pgls3h)
summary(model.pgls4h)
summary(model.pgls5h)
summary(model.pgls6h)
summary(model.pgls7h)
summary(model.pgls8h)
summary(model.pgls9h)
sink()
sink("model-HR-anova.txt")
options(width=10000)
anova(model.pgls1h)
anova(model.pgls2h)
anova(model.pgls3h)
anova(model.pgls4h)
anova(model.pgls5h)
anova(model.pgls6h)
anova(model.pgls7h)
anova(model.pgls8h)
anova(model.pgls9h)
sink()

Social models

model.pgls1s<-pgls(Hippocampus.total ~ Brainvol+Group.size, data = primate, lambda='ML')
model.pgls2s<-pgls(HP.HS.fibers ~ Brainvol+Group.size, data = primate, lambda='ML')
model.pgls3s<-pgls(Hippocampus.retrocomm. ~ Brainvol+Group.size, data = primate, lambda='ML')
model.pgls4s<-pgls(Subiculum ~ Brainvol+Group.size, data = primate, lambda='ML')
model.pgls5s<-pgls(Hilus ~ Brainvol+Group.size, data = primate, lambda='ML')
model.pgls6s<-pgls(CA1 ~ Brainvol+Group.size, data = primate, lambda='ML')
model.pgls7s<-pgls(CA2 ~ Brainvol+Group.size, data = primate, lambda='ML')
model.pgls8s<-pgls(CA3 ~ Brainvol+Group.size, data = primate, lambda='ML')
model.pgls9s<-pgls(Fascia.dentata ~ Brainvol+Group.size, data = primate, lambda='ML')
sink("model-group.txt")
options(width=10000)
summary(model.pgls1s)
summary(model.pgls2s)
summary(model.pgls3s)
summary(model.pgls4s)
summary(model.pgls5s)
summary(model.pgls6s)
summary(model.pgls7s)
summary(model.pgls8s)
summary(model.pgls9s)
sink()
sink("model-group-anova.txt")
options(width=10000)
anova(model.pgls1s)
anova(model.pgls2s)
anova(model.pgls3s)
anova(model.pgls4s)
anova(model.pgls5s)
anova(model.pgls6s)
anova(model.pgls7s)
anova(model.pgls8s)
anova(model.pgls9s)
sink()
####
model.pgls1sg<-pgls(Hippocampus.total ~ Brainvol+Soc_gr_sz_dec, data = primate, lambda='ML')
model.pgls2sg<-pgls(HP.HS.fibers ~ Brainvol+Soc_gr_sz_dec, data = primate, lambda='ML')
model.pgls3sg<-pgls(Hippocampus.retrocomm. ~ Brainvol+Soc_gr_sz_dec, data = primate, lambda='ML')
model.pgls4sg<-pgls(Subiculum ~ Brainvol+Soc_gr_sz_dec, data = primate, lambda='ML')
model.pgls5sg<-pgls(Hilus ~ Brainvol+Soc_gr_sz_dec, data = primate, lambda='ML')
model.pgls6sg<-pgls(CA1 ~ Brainvol+Soc_gr_sz_dec, data = primate, lambda='ML')
model.pgls7sg<-pgls(CA2 ~ Brainvol+Soc_gr_sz_dec, data = primate, lambda='ML')
model.pgls8sg<-pgls(CA3 ~ Brainvol+Soc_gr_sz_dec, data = primate, lambda='ML')
model.pgls9sg<-pgls(Fascia.dentata ~ Brainvol+Soc_gr_sz_dec, data = primate, lambda='ML')
sink("model-soc-group.txt")
options(width=10000)
summary(model.pgls1sg)
summary(model.pgls2sg)
summary(model.pgls3sg)
summary(model.pgls4sg)
summary(model.pgls5sg)
summary(model.pgls6sg)
summary(model.pgls7sg)
summary(model.pgls8sg)
summary(model.pgls9sg)
sink()
sink("model-soc-group-anova.txt")
options(width=10000)
anova(model.pgls1sg)
anova(model.pgls2sg)
anova(model.pgls3sg)
anova(model.pgls4sg)
anova(model.pgls5sg)
anova(model.pgls6sg)
anova(model.pgls7sg)
anova(model.pgls8sg)
anova(model.pgls9sg)
sink()
###
model.pgls1sd<-pgls(Hippocampus.total ~ Brainvol+Group_dunbar, data = primate, lambda='ML')
model.pgls2sd<-pgls(HP.HS.fibers ~ Brainvol+Group_dunbar, data = primate, lambda='ML')
model.pgls3sd<-pgls(Hippocampus.retrocomm. ~ Brainvol+Group_dunbar, data = primate, lambda='ML')
model.pgls4sd<-pgls(Subiculum ~ Brainvol+Group_dunbar, data = primate, lambda='ML')
model.pgls5sd<-pgls(Hilus ~ Brainvol+Group_dunbar, data = primate, lambda='ML')
model.pgls6sd<-pgls(CA1 ~ Brainvol+Group_dunbar, data = primate, lambda='ML')
model.pgls7sd<-pgls(CA2 ~ Brainvol+Group_dunbar, data = primate, lambda='ML')
model.pgls8sd<-pgls(CA3 ~ Brainvol+Group_dunbar, data = primate, lambda='ML')
model.pgls9sd<-pgls(Fascia.dentata ~ Brainvol+Group_dunbar, data = primate, lambda='ML')
sink("model-soc-group-dun.txt")
options(width=10000)
summary(model.pgls1sd)
summary(model.pgls2sd)
summary(model.pgls3sd)
summary(model.pgls4sd)
summary(model.pgls5sd)
summary(model.pgls6sd)
summary(model.pgls7sd)
summary(model.pgls8sd)
summary(model.pgls9sd)
sink()
sink("model-soc-group-dun-anova.txt")
options(width=10000)
anova(model.pgls1sd)
anova(model.pgls2sd)
anova(model.pgls3sd)
anova(model.pgls4sd)
anova(model.pgls5sd)
anova(model.pgls6sd)
anova(model.pgls7sd)
anova(model.pgls8sd)
anova(model.pgls9sd)
sink()
###
model.pgls1sdf<-pgls(Hippocampus.total ~ Brainvol+GroupF_dunbar, data = primate, lambda='ML')
model.pgls2sdf<-pgls(HP.HS.fibers ~ Brainvol+GroupF_dunbar, data = primate, lambda='ML')
model.pgls3sdf<-pgls(Hippocampus.retrocomm. ~ Brainvol+GroupF_dunbar, data = primate, lambda='ML')
model.pgls4sdf<-pgls(Subiculum ~ Brainvol+GroupF_dunbar, data = primate, lambda='ML')
model.pgls5sdf<-pgls(Hilus ~ Brainvol+GroupF_dunbar, data = primate, lambda='ML')
model.pgls6sdf<-pgls(CA1 ~ Brainvol+GroupF_dunbar, data = primate, lambda='ML')
model.pgls7sdf<-pgls(CA2 ~ Brainvol+GroupF_dunbar, data = primate, lambda='ML')
model.pgls8sdf<-pgls(CA3 ~ Brainvol+GroupF_dunbar, data = primate, lambda='ML')
model.pgls9sdf<-pgls(Fascia.dentata ~ Brainvol+GroupF_dunbar, data = primate, lambda='ML')
sink("model-soc-group-dunF.txt")
options(width=10000)
summary(model.pgls1sdf)
summary(model.pgls2sdf)
summary(model.pgls3sdf)
summary(model.pgls4sdf)
summary(model.pgls5sdf)
summary(model.pgls6sdf)
summary(model.pgls7sdf)
summary(model.pgls8sdf)
summary(model.pgls9sdf)
sink()
sink("model-soc-group-dunF-anova.txt")
options(width=10000)
anova(model.pgls1sdf)
anova(model.pgls2sdf)
anova(model.pgls3sdf)
anova(model.pgls4sdf)
anova(model.pgls5sdf)
anova(model.pgls6sdf)
anova(model.pgls7sdf)
anova(model.pgls8sdf)
anova(model.pgls9sdf)
sink()

Diet model

model.pgls1d<-pgls(Hippocampus.total ~ Brainvol+X.Fruit, data = primate, lambda='ML')
model.pgls2d<-pgls(HP.HS.fibers ~ Brainvol+X.Fruit, data = primate, lambda='ML')
model.pgls3d<-pgls(Hippocampus.retrocomm. ~ Brainvol+X.Fruit, data = primate, lambda='ML')
model.pgls4d<-pgls(Subiculum ~ Brainvol+X.Fruit, data = primate, lambda='ML')
model.pgls5d<-pgls(Hilus ~ Brainvol+X.Fruit, data = primate, lambda='ML')
model.pgls6d<-pgls(CA1 ~ Brainvol+X.Fruit, data = primate, lambda='ML')
model.pgls7d<-pgls(CA2 ~ Brainvol+X.Fruit, data = primate, lambda='ML')
model.pgls8d<-pgls(CA3 ~ Brainvol+X.Fruit, data = primate, lambda='ML')
model.pgls9d<-pgls(Fascia.dentata ~ Brainvol+X.Fruit, data = primate, lambda='ML')
sink("model-diet.txt")
options(width=10000)
summary(model.pgls1d)
summary(model.pgls2d)
summary(model.pgls3d)
summary(model.pgls4d)
summary(model.pgls5d)
summary(model.pgls6d)
summary(model.pgls7d)
summary(model.pgls8d)
summary(model.pgls9d)
sink()
sink("model-diet-anova.txt")
options(width=10000)
anova(model.pgls1d)
anova(model.pgls2d)
anova(model.pgls3d)
anova(model.pgls4d)
anova(model.pgls5d)
anova(model.pgls6d)
anova(model.pgls7d)
anova(model.pgls8d)
anova(model.pgls9d)
sink()

Estimate ancestral states

#loading data
data=read.csv("data_new.csv", header=TRUE)
row.names(data)=data$Species
tree=read.nexus("consensusTree_10kTrees_Primates_Version3.nex")

#obraining residuals
primate <- comparative.data(phy = tree, data = data, names.col = Species, vcv = TRUE, na.omit = FALSE, warn.dropped = TRUE)
model.pgls.res<-pgls(log(Hippocampus.total) ~ log(Brainvol), data = primate, lambda='ML')

dat.rel <- residuals(model.pgls.res)
dat.abs <- as.matrix(log(data$Hippocampus.total), row.names=1)[,1]

#preparing data

dat.abs <- as.data.frame(dat.abs)
dat.rel <- as.data.frame(dat.rel)


rownames(dat.abs)<-data$Species
rownames(dat.rel)<-data$Species

names(dat.abs)[names(dat.abs) == 'dat.abs'] <- 'Absolute'
names(dat.rel)[names(dat.rel) == 'V1'] <- 'Relative'

dat.abs <- as.matrix(dat.abs)
dat.rel <- as.matrix(dat.rel)

dat.rel.vector <- as.vector(dat.rel)
names(dat.rel.vector) <- rownames(dat.rel)

dat.abs.vector <- as.vector(dat.abs)
names(dat.abs.vector) <- rownames(dat.abs)

#performing ANC

anc.abs <- fastAnc(tree, dat.abs, vars=TRUE,CI=TRUE, REML = 1)
anc.rel <- fastAnc(tree, dat.rel, vars=TRUE,CI=TRUE, REML = 1)

pdf(file = "ANC.pdf", width = 6, height = 6 , onefile = T)

fancyTree(tree,type="scattergram",
          X=as.matrix(dat.rel),A=as.matrix(anc.rel),control=list(spin=FALSE),label="horizontal")
fancyTree(tree,type="scattergram",
          X=as.matrix(dat.abs),A=as.matrix(anc.rel),control=list(spin=FALSE),label="horizontal")

dev.off ()

Dimorphism

Data1=read.csv("dimorphdata.csv", header=TRUE)
row.names(Data1)=Data1$Species

TreeDimorph=read.tree("dimorphdata.txt")
plot(TreeDimorph, cex=0.5)

primate1 <- comparative.data(phy = TreeDimorph, data = Data1, names.col = Species, vcv = TRUE, na.omit = FALSE, warn.dropped = TRUE)

#sig
model.pgls1<-pgls(BoW ~ HIP, data = primate1, lambda='ML')
model.pgls2<-pgls(BoW ~ NET, data = primate1, lambda='ML')
model.pgls3<-pgls(BoW ~ OBL, data = primate1, lambda='ML')
model.pgls4<-pgls(BoW ~ CER, data = primate1, lambda='ML')
#sig
model.pgls5<-pgls(BoW ~  MES, data = primate1, lambda='ML')
model.pgls6<-pgls(BoW ~  DIE, data = primate1, lambda='ML')
model.pgls7<-pgls(BoW ~  TEL, data = primate1, lambda='ML')
model.pgls8<-pgls(BoW ~  BOL, data = primate1, lambda='ML')
#sig
model.pgls9<-pgls(BoW ~  PAL, data = primate1, lambda='ML')
model.pgls10<-pgls(BoW ~  SEP, data = primate1, lambda='ML')
model.pgls11<-pgls(BoW ~  STR, data = primate1, lambda='ML')
model.pgls12<-pgls(BoW ~  SCH, data = primate1, lambda='ML')
model.pgls13<-pgls(BoW ~  NEO, data = primate1, lambda='ML')
model.pgls14<-pgls(BoW ~  TOT, data = primate1, lambda='ML')

summary/anova
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNClRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgb3IgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbnNpZGUgaXQgYW5kIHByZXNzaW5nICpDdHJsK1NoaWZ0K0VudGVyKi4gDQoNCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDdHJsK0FsdCtJKi4NCg0KV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDdHJsK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuDQoNClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4NCg0KI0xvYWQgdXAgcGFja2FnZXMNCmBgYHtyfQ0KbGlicmFyeShhcGUpDQpsaWJyYXJ5KGdlaWdlcikNCmxpYnJhcnkobmxtZSkNCmxpYnJhcnkoY2FwZXIpDQpsaWJyYXJ5KGNhcikNCmBgYA0KDQojUHJlcGFyYXRpb24NCg0KIyNJbXBvcnQgZGF0YSBhbmQgdHJlZQ0KYGBge3J9DQpEYXRhPXJlYWQuY3N2KCJkYXRhX25ldy5jc3YiLCBoZWFkZXI9VFJVRSkNClRyZWVQcmltYXRlPXJlYWQubmV4dXMoImNvbnNlbnN1c1RyZWVfMTBrVHJlZXNfUHJpbWF0ZXNfVmVyc2lvbjMubmV4IikNCnJvdy5uYW1lcyhEYXRhKT1EYXRhJFNwZWNpZXMNCmBgYA0KDQojI0NvbnZlcnQgaW50byBmYWN0b3Igb3IgbnVtZXJpY2FsDQpgYGB7cn0NCkRhdGEkQnJhaW52b2wgPC0gYXMubnVtZXJpYyhEYXRhJEJyYWludm9sKQ0KRGF0YSRCb2R5LndlaWdodDwtIGFzLm51bWVyaWMoRGF0YSRCb2R5LndlaWdodCkNCkRhdGEkTmVvPC0gYXMubnVtZXJpYyhEYXRhJE5lbykNCkRhdGEkSGlwcG9jYW1wdXMudG90YWw8LSBhcy5udW1lcmljKERhdGEkSGlwcG9jYW1wdXMudG90YWwpDQpEYXRhJEhQLkhTLmZpYmVyczwtIGFzLm51bWVyaWMoRGF0YSRIUC5IUy5maWJlcnMpDQpEYXRhJEhpcHBvY2FtcHVzLnJldHJvY29tbS48LSBhcy5udW1lcmljKERhdGEkSGlwcG9jYW1wdXMucmV0cm9jb21tLikNCkRhdGEkU3ViaWN1bHVtPC0gYXMubnVtZXJpYyhEYXRhJFN1YmljdWx1bSkNCkRhdGEkQ0ExPC0gYXMubnVtZXJpYyhEYXRhJENBMSkNCkRhdGEkQ0EyPC0gYXMubnVtZXJpYyhEYXRhJENBMikNCkRhdGEkQ0EzPC0gYXMubnVtZXJpYyhEYXRhJENBMykNCkRhdGEkSGlsdXM8LSBhcy5udW1lcmljKERhdGEkSGlsdXMpDQpEYXRhJEZhc2NpYS5kZW50YXRhPC0gYXMubnVtZXJpYyhEYXRhJEZhc2NpYS5kZW50YXRhKQ0KRGF0YSRUZXJyZXN0cmlhbGl0eTwtIGFzLmZhY3RvcihEYXRhJFRlcnJlc3RyaWFsaXR5KQ0KRGF0YSREaXVybmFsaXR5PC0gYXMuZmFjdG9yKERhdGEkRGl1cm5hbGl0eSkNCkRhdGEkWC5GcnVpdDwtIGFzLm51bWVyaWMoRGF0YSRYLkZydWl0KQ0KRGF0YSRHcm91cC5zaXplPC0gYXMubnVtZXJpYyhEYXRhJEdyb3VwLnNpemUpDQpEYXRhJEhSLnNpemUuYXZnPC0gYXMubnVtZXJpYyhEYXRhJEhSLnNpemUuYXZnKQ0KRGF0YSRTb2Nfc3lzX2RlYzwtIGFzLmZhY3RvcihEYXRhJFNvY19zeXNfZGVjKQ0KRGF0YSRNYXRfc3lzX2RlYzwtIGFzLmZhY3RvcihEYXRhJE1hdF9zeXNfZGVjKQ0KRGF0YSRTb2NfZ3Jfc3pfZGVjPC0gYXMubnVtZXJpYyhEYXRhJFNvY19ncl9zel9kZWMpDQpEYXRhJEdyb3VwX2R1bmJhcjwtIGFzLm51bWVyaWMoRGF0YSRHcm91cF9kdW5iYXIpDQpEYXRhJEdyb3VwRl9kdW5iYXI8LSBhcy5udW1lcmljKERhdGEkR3JvdXBGX2R1bmJhcikNCmBgYA0KDQojI0xvZyBhbmQgbWluLW1heCBzdGRpemUNCmBgYHtyfQ0KRGF0YSRCcmFpbnZvbCA8LSBsb2coRGF0YSRCcmFpbnZvbCkNCkRhdGEkQm9keS53ZWlnaHQ8LSBsb2coRGF0YSRCb2R5LndlaWdodCkNCkRhdGEkTmVvPC0gbG9nKERhdGEkTmVvKQ0KRGF0YSRIaXBwb2NhbXB1cy50b3RhbDwtIGxvZyhEYXRhJEhpcHBvY2FtcHVzLnRvdGFsKQ0KRGF0YSRIUC5IUy5maWJlcnM8LSBsb2coRGF0YSRIUC5IUy5maWJlcnMpDQpEYXRhJEhpcHBvY2FtcHVzLnJldHJvY29tbS48LSBsb2coRGF0YSRIaXBwb2NhbXB1cy5yZXRyb2NvbW0uKQ0KRGF0YSRTdWJpY3VsdW08LSBsb2coRGF0YSRTdWJpY3VsdW0pDQpEYXRhJENBMTwtIGxvZyhEYXRhJENBMSkNCkRhdGEkQ0EyPC0gbG9nKERhdGEkQ0EyKQ0KRGF0YSRDQTM8LSBsb2coRGF0YSRDQTMpDQpEYXRhJEhpbHVzPC0gbG9nKERhdGEkSGlsdXMpDQpEYXRhJEZhc2NpYS5kZW50YXRhPC0gbG9nKERhdGEkRmFzY2lhLmRlbnRhdGEpDQpEYXRhJEdyb3VwLnNpemU8LSBsb2coRGF0YSRHcm91cC5zaXplKQ0KRGF0YSRIUi5zaXplLmF2ZzwtIGxvZyhEYXRhJEhSLnNpemUuYXZnKQ0KRGF0YSRTb2NfZ3Jfc3pfZGVjPC0gbG9nKERhdGEkU29jX2dyX3N6X2RlYykNCkRhdGEkR3JvdXBfZHVuYmFyPC0gbG9nKERhdGEkR3JvdXBfZHVuYmFyKQ0KRGF0YSRHcm91cEZfZHVuYmFyPC0gbG9nKERhdGEkR3JvdXBGX2R1bmJhcikNCg0KDQojbWluLW1heCBzdGR6ZSBmdW5jdGlvbg0Kc3RkaXplID0gc3RkaXplID0gZnVuY3Rpb24oeCwgLi4uKSB7KHggLSBtaW4oeCwgLi4uKSkgLyAobWF4KHgsIC4uLikgLSBtaW4oeCwgLi4uKSl9DQogICAgICAgICAgICAgICAgICAgICAgICANCkRhdGEkQnJhaW52b2wgPC0gc3RkaXplKERhdGEkQnJhaW52b2wsIG5hLnJtID0gVCkNCkRhdGEkQm9keS53ZWlnaHQ8LSBzdGRpemUoRGF0YSRCb2R5LndlaWdodCwgbmEucm0gPSBUKQ0KRGF0YSROZW88LSBzdGRpemUoRGF0YSROZW8sIG5hLnJtID0gVCkNCkRhdGEkSGlwcG9jYW1wdXMudG90YWw8LSBzdGRpemUoRGF0YSRIaXBwb2NhbXB1cy50b3RhbCwgbmEucm0gPSBUKQ0KRGF0YSRIUC5IUy5maWJlcnM8LSBzdGRpemUoRGF0YSRIUC5IUy5maWJlcnMsIG5hLnJtID0gVCkNCkRhdGEkSGlwcG9jYW1wdXMucmV0cm9jb21tLjwtIHN0ZGl6ZShEYXRhJEhpcHBvY2FtcHVzLnJldHJvY29tbS4sIG5hLnJtID0gVCkNCkRhdGEkU3ViaWN1bHVtPC0gc3RkaXplKERhdGEkU3ViaWN1bHVtLCBuYS5ybSA9IFQpDQpEYXRhJENBMTwtIHN0ZGl6ZShEYXRhJENBMSwgbmEucm0gPSBUKQ0KRGF0YSRDQTI8LSBzdGRpemUoRGF0YSRDQTIsIG5hLnJtID0gVCkNCkRhdGEkQ0EzPC0gc3RkaXplKERhdGEkQ0EzLCBuYS5ybSA9IFQpDQpEYXRhJEhpbHVzPC0gc3RkaXplKERhdGEkSGlsdXMsIG5hLnJtID0gVCkNCkRhdGEkRmFzY2lhLmRlbnRhdGE8LSBzdGRpemUoRGF0YSRGYXNjaWEuZGVudGF0YSwgbmEucm0gPSBUKQ0KRGF0YSRYLkZydWl0PC0gc3RkaXplKERhdGEkWC5GcnVpdCwgbmEucm0gPSBUKQ0KRGF0YSRHcm91cC5zaXplPC0gc3RkaXplKERhdGEkR3JvdXAuc2l6ZSwgbmEucm0gPSBUKQ0KRGF0YSRIUi5zaXplLmF2ZzwtIHN0ZGl6ZShEYXRhJEhSLnNpemUuYXZnLCBuYS5ybSA9IFQpDQpEYXRhJFNvY19ncl9zel9kZWM8LSBzdGRpemUoRGF0YSRTb2NfZ3Jfc3pfZGVjLCBuYS5ybSA9IFQpDQpEYXRhJEdyb3VwX2R1bmJhcjwtIHN0ZGl6ZShEYXRhJEdyb3VwX2R1bmJhciwgbmEucm0gPSBUKQ0KRGF0YSRHcm91cEZfZHVuYmFyPC0gc3RkaXplKERhdGEkR3JvdXBGX2R1bmJhciwgbmEucm0gPSBUKQ0KDQpgYGANCg0KI3Bsb3QgYWxsIG1vZGVscw0KYGBge3J9DQpwIDwtIGdncGxvdChEYXRhKSArIA0KICB0aGVtZV9idygpICsNCiAgZ2VvbV9qaXR0ZXIoYWVzKEhpcHBvY2FtcHVzLnRvdGFsLEJyYWludm9sKSkgKyBnZW9tX3Ntb290aChhZXMoSGlwcG9jYW1wdXMudG90YWwsQnJhaW52b2wpLCBtZXRob2Q9bG0sIGNvbG91ciA9ICJibGFjayIsIHNlPUZBTFNFKSArDQogIGdlb21faml0dGVyKGFlcyhIaXBwb2NhbXB1cy50b3RhbCwgWC5GcnVpdCksIGNvbG91cj0icmVkIiwgc2hhcGUgPSAxNSkgKyBnZW9tX3Ntb290aChhZXMoSGlwcG9jYW1wdXMudG90YWwsIFguRnJ1aXQpLCBjb2xvdXIgPSAicmVkIiwgbWV0aG9kPWxtLCBzZT1GQUxTRSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2ppdHRlcihhZXMoSGlwcG9jYW1wdXMudG90YWwsIEhSLnNpemUuYXZnKSwgY29sb3VyPSJibHVlIiwgc2hhcGUgPSAxNykgKyBnZW9tX3Ntb290aChhZXMoSGlwcG9jYW1wdXMudG90YWwsIEhSLnNpemUuYXZnKSwgbWV0aG9kPWxtLCBjb2xvdXI9ImJsdWUiLCBzZT1GQUxTRSwgbGluZXR5cGUgPSAibG9uZ2Rhc2giKSArDQogIGdlb21faml0dGVyKGFlcyhIaXBwb2NhbXB1cy50b3RhbCwgU29jX2dyX3N6X2RlYyksIGNvbG91cj0iZGFya2dyZWVuIiwgc2hhcGUgPSAzKSArIGdlb21fc21vb3RoKGFlcyhIaXBwb2NhbXB1cy50b3RhbCwgU29jX2dyX3N6X2RlYyksIG1ldGhvZD1sbSwgY29sb3VyPSJkYXJrZ3JlZW4iLCBzZT1GQUxTRSwgbGluZXR5cGUgPSAiZG90dGVkIikgKw0KICBsYWJzKHggPSAibG4oSGlwcG9jYW1wdXMgdm9sdW1lKSIsIHkgPSAibG4oVG90YWwgYnJhaW4gdm9sdW1lKSAgICAvIEZyYWN0aW9uIEZydWl0ICAgIC8gbG4oSFIpICAgIC8gR3JvdXAgU2l6ZSAgICAgIikNCmBgYA0KDQoNCiNQR0xTDQoNCg0KI0NyZWF0ZSBjb21wIG9iaiBmb3IgY2FwZXINCmBgYHtyfQ0KcHJpbWF0ZSA8LSBjb21wYXJhdGl2ZS5kYXRhKHBoeSA9IFRyZWVQcmltYXRlLCBkYXRhID0gRGF0YSwgbmFtZXMuY29sID0gU3BlY2llcywgdmN2ID0gVFJVRSwgbmEub21pdCA9IEZBTFNFLCB3YXJuLmRyb3BwZWQgPSBUUlVFKQ0KYGBgDQoNCiMjI05lb2NvcnRleA0KYGBge3J9DQptb2RlbC5wZ2xzTmVvPC1wZ2xzKEhpcHBvY2FtcHVzLnRvdGFsIH4gQnJhaW52b2wrTmVvLCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQpzaW5rKCJuZW9jb3J0ZXgudHh0IikNCnN1bW1hcnkobW9kZWwucGdsc05lbykNCmFub3ZhKG1vZGVsLnBnbHNOZW8pDQpzaW5rKCkNCmBgYA0KDQojI0hvbWUgcmFuZ2UNCmBgYHtyfQ0KbW9kZWwucGdsczFoPC1wZ2xzKEhpcHBvY2FtcHVzLnRvdGFsIH4gQnJhaW52b2wrSFIuc2l6ZS5hdmcsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHMyaDwtcGdscyhIUC5IUy5maWJlcnMgfiBCcmFpbnZvbCtIUi5zaXplLmF2ZywgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczNoPC1wZ2xzKEhpcHBvY2FtcHVzLnJldHJvY29tbS4gfiBCcmFpbnZvbCtIUi5zaXplLmF2ZywgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczRoPC1wZ2xzKFN1YmljdWx1bSB+IEJyYWludm9sK0hSLnNpemUuYXZnLCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzNWg8LXBnbHMoSGlsdXMgfiBCcmFpbnZvbCtIUi5zaXplLmF2ZywgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczZoPC1wZ2xzKENBMSB+IEJyYWludm9sK0hSLnNpemUuYXZnLCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzN2g8LXBnbHMoQ0EyIH4gQnJhaW52b2wrSFIuc2l6ZS5hdmcsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHM4aDwtcGdscyhDQTMgfiBCcmFpbnZvbCtIUi5zaXplLmF2ZywgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczloPC1wZ2xzKEZhc2NpYS5kZW50YXRhIH4gQnJhaW52b2wrSFIuc2l6ZS5hdmcsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCg0Kc2luaygibW9kZWwtSFIudHh0IikNCm9wdGlvbnMod2lkdGg9MTAwMDApDQoNCnN1bW1hcnkobW9kZWwucGdsczFoKQ0Kc3VtbWFyeShtb2RlbC5wZ2xzMmgpDQpzdW1tYXJ5KG1vZGVsLnBnbHMzaCkNCnN1bW1hcnkobW9kZWwucGdsczRoKQ0Kc3VtbWFyeShtb2RlbC5wZ2xzNWgpDQpzdW1tYXJ5KG1vZGVsLnBnbHM2aCkNCnN1bW1hcnkobW9kZWwucGdsczdoKQ0Kc3VtbWFyeShtb2RlbC5wZ2xzOGgpDQpzdW1tYXJ5KG1vZGVsLnBnbHM5aCkNCg0Kc2luaygpDQoNCnNpbmsoIm1vZGVsLUhSLWFub3ZhLnR4dCIpDQpvcHRpb25zKHdpZHRoPTEwMDAwKQ0KDQphbm92YShtb2RlbC5wZ2xzMWgpDQphbm92YShtb2RlbC5wZ2xzMmgpDQphbm92YShtb2RlbC5wZ2xzM2gpDQphbm92YShtb2RlbC5wZ2xzNGgpDQphbm92YShtb2RlbC5wZ2xzNWgpDQphbm92YShtb2RlbC5wZ2xzNmgpDQphbm92YShtb2RlbC5wZ2xzN2gpDQphbm92YShtb2RlbC5wZ2xzOGgpDQphbm92YShtb2RlbC5wZ2xzOWgpDQoNCnNpbmsoKQ0KYGBgDQoNCiMjU29jaWFsIG1vZGVscw0KYGBge3J9DQptb2RlbC5wZ2xzMXM8LXBnbHMoSGlwcG9jYW1wdXMudG90YWwgfiBCcmFpbnZvbCtHcm91cC5zaXplLCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzMnM8LXBnbHMoSFAuSFMuZmliZXJzIH4gQnJhaW52b2wrR3JvdXAuc2l6ZSwgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczNzPC1wZ2xzKEhpcHBvY2FtcHVzLnJldHJvY29tbS4gfiBCcmFpbnZvbCtHcm91cC5zaXplLCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzNHM8LXBnbHMoU3ViaWN1bHVtIH4gQnJhaW52b2wrR3JvdXAuc2l6ZSwgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczVzPC1wZ2xzKEhpbHVzIH4gQnJhaW52b2wrR3JvdXAuc2l6ZSwgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczZzPC1wZ2xzKENBMSB+IEJyYWludm9sK0dyb3VwLnNpemUsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHM3czwtcGdscyhDQTIgfiBCcmFpbnZvbCtHcm91cC5zaXplLCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzOHM8LXBnbHMoQ0EzIH4gQnJhaW52b2wrR3JvdXAuc2l6ZSwgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczlzPC1wZ2xzKEZhc2NpYS5kZW50YXRhIH4gQnJhaW52b2wrR3JvdXAuc2l6ZSwgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KDQpzaW5rKCJtb2RlbC1ncm91cC50eHQiKQ0Kb3B0aW9ucyh3aWR0aD0xMDAwMCkNCg0Kc3VtbWFyeShtb2RlbC5wZ2xzMXMpDQpzdW1tYXJ5KG1vZGVsLnBnbHMycykNCnN1bW1hcnkobW9kZWwucGdsczNzKQ0Kc3VtbWFyeShtb2RlbC5wZ2xzNHMpDQpzdW1tYXJ5KG1vZGVsLnBnbHM1cykNCnN1bW1hcnkobW9kZWwucGdsczZzKQ0Kc3VtbWFyeShtb2RlbC5wZ2xzN3MpDQpzdW1tYXJ5KG1vZGVsLnBnbHM4cykNCnN1bW1hcnkobW9kZWwucGdsczlzKQ0KDQpzaW5rKCkNCg0Kc2luaygibW9kZWwtZ3JvdXAtYW5vdmEudHh0IikNCm9wdGlvbnMod2lkdGg9MTAwMDApDQoNCmFub3ZhKG1vZGVsLnBnbHMxcykNCmFub3ZhKG1vZGVsLnBnbHMycykNCmFub3ZhKG1vZGVsLnBnbHMzcykNCmFub3ZhKG1vZGVsLnBnbHM0cykNCmFub3ZhKG1vZGVsLnBnbHM1cykNCmFub3ZhKG1vZGVsLnBnbHM2cykNCmFub3ZhKG1vZGVsLnBnbHM3cykNCmFub3ZhKG1vZGVsLnBnbHM4cykNCmFub3ZhKG1vZGVsLnBnbHM5cykNCg0Kc2luaygpDQoNCiMjIyMNCg0KbW9kZWwucGdsczFzZzwtcGdscyhIaXBwb2NhbXB1cy50b3RhbCB+IEJyYWludm9sK1NvY19ncl9zel9kZWMsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHMyc2c8LXBnbHMoSFAuSFMuZmliZXJzIH4gQnJhaW52b2wrU29jX2dyX3N6X2RlYywgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczNzZzwtcGdscyhIaXBwb2NhbXB1cy5yZXRyb2NvbW0uIH4gQnJhaW52b2wrU29jX2dyX3N6X2RlYywgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczRzZzwtcGdscyhTdWJpY3VsdW0gfiBCcmFpbnZvbCtTb2NfZ3Jfc3pfZGVjLCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzNXNnPC1wZ2xzKEhpbHVzIH4gQnJhaW52b2wrU29jX2dyX3N6X2RlYywgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczZzZzwtcGdscyhDQTEgfiBCcmFpbnZvbCtTb2NfZ3Jfc3pfZGVjLCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzN3NnPC1wZ2xzKENBMiB+IEJyYWludm9sK1NvY19ncl9zel9kZWMsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHM4c2c8LXBnbHMoQ0EzIH4gQnJhaW52b2wrU29jX2dyX3N6X2RlYywgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczlzZzwtcGdscyhGYXNjaWEuZGVudGF0YSB+IEJyYWludm9sK1NvY19ncl9zel9kZWMsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCg0Kc2luaygibW9kZWwtc29jLWdyb3VwLnR4dCIpDQpvcHRpb25zKHdpZHRoPTEwMDAwKQ0KDQpzdW1tYXJ5KG1vZGVsLnBnbHMxc2cpDQpzdW1tYXJ5KG1vZGVsLnBnbHMyc2cpDQpzdW1tYXJ5KG1vZGVsLnBnbHMzc2cpDQpzdW1tYXJ5KG1vZGVsLnBnbHM0c2cpDQpzdW1tYXJ5KG1vZGVsLnBnbHM1c2cpDQpzdW1tYXJ5KG1vZGVsLnBnbHM2c2cpDQpzdW1tYXJ5KG1vZGVsLnBnbHM3c2cpDQpzdW1tYXJ5KG1vZGVsLnBnbHM4c2cpDQpzdW1tYXJ5KG1vZGVsLnBnbHM5c2cpDQoNCnNpbmsoKQ0KDQpzaW5rKCJtb2RlbC1zb2MtZ3JvdXAtYW5vdmEudHh0IikNCm9wdGlvbnMod2lkdGg9MTAwMDApDQoNCmFub3ZhKG1vZGVsLnBnbHMxc2cpDQphbm92YShtb2RlbC5wZ2xzMnNnKQ0KYW5vdmEobW9kZWwucGdsczNzZykNCmFub3ZhKG1vZGVsLnBnbHM0c2cpDQphbm92YShtb2RlbC5wZ2xzNXNnKQ0KYW5vdmEobW9kZWwucGdsczZzZykNCmFub3ZhKG1vZGVsLnBnbHM3c2cpDQphbm92YShtb2RlbC5wZ2xzOHNnKQ0KYW5vdmEobW9kZWwucGdsczlzZykNCg0Kc2luaygpDQoNCg0KIyMjDQoNCm1vZGVsLnBnbHMxc2Q8LXBnbHMoSGlwcG9jYW1wdXMudG90YWwgfiBCcmFpbnZvbCtHcm91cF9kdW5iYXIsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHMyc2Q8LXBnbHMoSFAuSFMuZmliZXJzIH4gQnJhaW52b2wrR3JvdXBfZHVuYmFyLCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzM3NkPC1wZ2xzKEhpcHBvY2FtcHVzLnJldHJvY29tbS4gfiBCcmFpbnZvbCtHcm91cF9kdW5iYXIsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHM0c2Q8LXBnbHMoU3ViaWN1bHVtIH4gQnJhaW52b2wrR3JvdXBfZHVuYmFyLCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzNXNkPC1wZ2xzKEhpbHVzIH4gQnJhaW52b2wrR3JvdXBfZHVuYmFyLCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzNnNkPC1wZ2xzKENBMSB+IEJyYWludm9sK0dyb3VwX2R1bmJhciwgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczdzZDwtcGdscyhDQTIgfiBCcmFpbnZvbCtHcm91cF9kdW5iYXIsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHM4c2Q8LXBnbHMoQ0EzIH4gQnJhaW52b2wrR3JvdXBfZHVuYmFyLCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzOXNkPC1wZ2xzKEZhc2NpYS5kZW50YXRhIH4gQnJhaW52b2wrR3JvdXBfZHVuYmFyLCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQoNCnNpbmsoIm1vZGVsLXNvYy1ncm91cC1kdW4udHh0IikNCm9wdGlvbnMod2lkdGg9MTAwMDApDQoNCnN1bW1hcnkobW9kZWwucGdsczFzZCkNCnN1bW1hcnkobW9kZWwucGdsczJzZCkNCnN1bW1hcnkobW9kZWwucGdsczNzZCkNCnN1bW1hcnkobW9kZWwucGdsczRzZCkNCnN1bW1hcnkobW9kZWwucGdsczVzZCkNCnN1bW1hcnkobW9kZWwucGdsczZzZCkNCnN1bW1hcnkobW9kZWwucGdsczdzZCkNCnN1bW1hcnkobW9kZWwucGdsczhzZCkNCnN1bW1hcnkobW9kZWwucGdsczlzZCkNCg0Kc2luaygpDQoNCnNpbmsoIm1vZGVsLXNvYy1ncm91cC1kdW4tYW5vdmEudHh0IikNCm9wdGlvbnMod2lkdGg9MTAwMDApDQoNCmFub3ZhKG1vZGVsLnBnbHMxc2QpDQphbm92YShtb2RlbC5wZ2xzMnNkKQ0KYW5vdmEobW9kZWwucGdsczNzZCkNCmFub3ZhKG1vZGVsLnBnbHM0c2QpDQphbm92YShtb2RlbC5wZ2xzNXNkKQ0KYW5vdmEobW9kZWwucGdsczZzZCkNCmFub3ZhKG1vZGVsLnBnbHM3c2QpDQphbm92YShtb2RlbC5wZ2xzOHNkKQ0KYW5vdmEobW9kZWwucGdsczlzZCkNCg0Kc2luaygpDQoNCiMjIw0KDQptb2RlbC5wZ2xzMXNkZjwtcGdscyhIaXBwb2NhbXB1cy50b3RhbCB+IEJyYWludm9sK0dyb3VwRl9kdW5iYXIsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHMyc2RmPC1wZ2xzKEhQLkhTLmZpYmVycyB+IEJyYWludm9sK0dyb3VwRl9kdW5iYXIsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHMzc2RmPC1wZ2xzKEhpcHBvY2FtcHVzLnJldHJvY29tbS4gfiBCcmFpbnZvbCtHcm91cEZfZHVuYmFyLCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzNHNkZjwtcGdscyhTdWJpY3VsdW0gfiBCcmFpbnZvbCtHcm91cEZfZHVuYmFyLCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzNXNkZjwtcGdscyhIaWx1cyB+IEJyYWludm9sK0dyb3VwRl9kdW5iYXIsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHM2c2RmPC1wZ2xzKENBMSB+IEJyYWludm9sK0dyb3VwRl9kdW5iYXIsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHM3c2RmPC1wZ2xzKENBMiB+IEJyYWludm9sK0dyb3VwRl9kdW5iYXIsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHM4c2RmPC1wZ2xzKENBMyB+IEJyYWludm9sK0dyb3VwRl9kdW5iYXIsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHM5c2RmPC1wZ2xzKEZhc2NpYS5kZW50YXRhIH4gQnJhaW52b2wrR3JvdXBGX2R1bmJhciwgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KDQpzaW5rKCJtb2RlbC1zb2MtZ3JvdXAtZHVuRi50eHQiKQ0Kb3B0aW9ucyh3aWR0aD0xMDAwMCkNCg0Kc3VtbWFyeShtb2RlbC5wZ2xzMXNkZikNCnN1bW1hcnkobW9kZWwucGdsczJzZGYpDQpzdW1tYXJ5KG1vZGVsLnBnbHMzc2RmKQ0Kc3VtbWFyeShtb2RlbC5wZ2xzNHNkZikNCnN1bW1hcnkobW9kZWwucGdsczVzZGYpDQpzdW1tYXJ5KG1vZGVsLnBnbHM2c2RmKQ0Kc3VtbWFyeShtb2RlbC5wZ2xzN3NkZikNCnN1bW1hcnkobW9kZWwucGdsczhzZGYpDQpzdW1tYXJ5KG1vZGVsLnBnbHM5c2RmKQ0KDQpzaW5rKCkNCg0Kc2luaygibW9kZWwtc29jLWdyb3VwLWR1bkYtYW5vdmEudHh0IikNCm9wdGlvbnMod2lkdGg9MTAwMDApDQoNCmFub3ZhKG1vZGVsLnBnbHMxc2RmKQ0KYW5vdmEobW9kZWwucGdsczJzZGYpDQphbm92YShtb2RlbC5wZ2xzM3NkZikNCmFub3ZhKG1vZGVsLnBnbHM0c2RmKQ0KYW5vdmEobW9kZWwucGdsczVzZGYpDQphbm92YShtb2RlbC5wZ2xzNnNkZikNCmFub3ZhKG1vZGVsLnBnbHM3c2RmKQ0KYW5vdmEobW9kZWwucGdsczhzZGYpDQphbm92YShtb2RlbC5wZ2xzOXNkZikNCg0Kc2luaygpDQpgYGANCg0KDQojI0RpZXQgbW9kZWwNCmBgYHtyfQ0KDQptb2RlbC5wZ2xzMWQ8LXBnbHMoSGlwcG9jYW1wdXMudG90YWwgfiBCcmFpbnZvbCtYLkZydWl0LCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzMmQ8LXBnbHMoSFAuSFMuZmliZXJzIH4gQnJhaW52b2wrWC5GcnVpdCwgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczNkPC1wZ2xzKEhpcHBvY2FtcHVzLnJldHJvY29tbS4gfiBCcmFpbnZvbCtYLkZydWl0LCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzNGQ8LXBnbHMoU3ViaWN1bHVtIH4gQnJhaW52b2wrWC5GcnVpdCwgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczVkPC1wZ2xzKEhpbHVzIH4gQnJhaW52b2wrWC5GcnVpdCwgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczZkPC1wZ2xzKENBMSB+IEJyYWludm9sK1guRnJ1aXQsIGRhdGEgPSBwcmltYXRlLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHM3ZDwtcGdscyhDQTIgfiBCcmFpbnZvbCtYLkZydWl0LCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzOGQ8LXBnbHMoQ0EzIH4gQnJhaW52b2wrWC5GcnVpdCwgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczlkPC1wZ2xzKEZhc2NpYS5kZW50YXRhIH4gQnJhaW52b2wrWC5GcnVpdCwgZGF0YSA9IHByaW1hdGUsIGxhbWJkYT0nTUwnKQ0KDQoNCnNpbmsoIm1vZGVsLWRpZXQudHh0IikNCm9wdGlvbnMod2lkdGg9MTAwMDApDQoNCnN1bW1hcnkobW9kZWwucGdsczFkKQ0Kc3VtbWFyeShtb2RlbC5wZ2xzMmQpDQpzdW1tYXJ5KG1vZGVsLnBnbHMzZCkNCnN1bW1hcnkobW9kZWwucGdsczRkKQ0Kc3VtbWFyeShtb2RlbC5wZ2xzNWQpDQpzdW1tYXJ5KG1vZGVsLnBnbHM2ZCkNCnN1bW1hcnkobW9kZWwucGdsczdkKQ0Kc3VtbWFyeShtb2RlbC5wZ2xzOGQpDQpzdW1tYXJ5KG1vZGVsLnBnbHM5ZCkNCg0Kc2luaygpDQoNCnNpbmsoIm1vZGVsLWRpZXQtYW5vdmEudHh0IikNCm9wdGlvbnMod2lkdGg9MTAwMDApDQoNCmFub3ZhKG1vZGVsLnBnbHMxZCkNCmFub3ZhKG1vZGVsLnBnbHMyZCkNCmFub3ZhKG1vZGVsLnBnbHMzZCkNCmFub3ZhKG1vZGVsLnBnbHM0ZCkNCmFub3ZhKG1vZGVsLnBnbHM1ZCkNCmFub3ZhKG1vZGVsLnBnbHM2ZCkNCmFub3ZhKG1vZGVsLnBnbHM3ZCkNCmFub3ZhKG1vZGVsLnBnbHM4ZCkNCmFub3ZhKG1vZGVsLnBnbHM5ZCkNCg0Kc2luaygpDQpgYGANCg0KDQoNCiNFc3RpbWF0ZSBhbmNlc3RyYWwgc3RhdGVzDQpgYGB7cn0NCiNsb2FkaW5nIGRhdGENCmRhdGE9cmVhZC5jc3YoImRhdGFfbmV3LmNzdiIsIGhlYWRlcj1UUlVFKQ0Kcm93Lm5hbWVzKGRhdGEpPWRhdGEkU3BlY2llcw0KdHJlZT1yZWFkLm5leHVzKCJjb25zZW5zdXNUcmVlXzEwa1RyZWVzX1ByaW1hdGVzX1ZlcnNpb24zLm5leCIpDQoNCiNvYnJhaW5pbmcgcmVzaWR1YWxzDQpwcmltYXRlIDwtIGNvbXBhcmF0aXZlLmRhdGEocGh5ID0gdHJlZSwgZGF0YSA9IGRhdGEsIG5hbWVzLmNvbCA9IFNwZWNpZXMsIHZjdiA9IFRSVUUsIG5hLm9taXQgPSBGQUxTRSwgd2Fybi5kcm9wcGVkID0gVFJVRSkNCm1vZGVsLnBnbHMucmVzPC1wZ2xzKGxvZyhIaXBwb2NhbXB1cy50b3RhbCkgfiBsb2coQnJhaW52b2wpLCBkYXRhID0gcHJpbWF0ZSwgbGFtYmRhPSdNTCcpDQoNCmRhdC5yZWwgPC0gcmVzaWR1YWxzKG1vZGVsLnBnbHMucmVzKQ0KZGF0LmFicyA8LSBhcy5tYXRyaXgobG9nKGRhdGEkSGlwcG9jYW1wdXMudG90YWwpLCByb3cubmFtZXM9MSlbLDFdDQoNCiNwcmVwYXJpbmcgZGF0YQ0KDQpkYXQuYWJzIDwtIGFzLmRhdGEuZnJhbWUoZGF0LmFicykNCmRhdC5yZWwgPC0gYXMuZGF0YS5mcmFtZShkYXQucmVsKQ0KDQoNCnJvd25hbWVzKGRhdC5hYnMpPC1kYXRhJFNwZWNpZXMNCnJvd25hbWVzKGRhdC5yZWwpPC1kYXRhJFNwZWNpZXMNCg0KbmFtZXMoZGF0LmFicylbbmFtZXMoZGF0LmFicykgPT0gJ2RhdC5hYnMnXSA8LSAnQWJzb2x1dGUnDQpuYW1lcyhkYXQucmVsKVtuYW1lcyhkYXQucmVsKSA9PSAnVjEnXSA8LSAnUmVsYXRpdmUnDQoNCmRhdC5hYnMgPC0gYXMubWF0cml4KGRhdC5hYnMpDQpkYXQucmVsIDwtIGFzLm1hdHJpeChkYXQucmVsKQ0KDQpkYXQucmVsLnZlY3RvciA8LSBhcy52ZWN0b3IoZGF0LnJlbCkNCm5hbWVzKGRhdC5yZWwudmVjdG9yKSA8LSByb3duYW1lcyhkYXQucmVsKQ0KDQpkYXQuYWJzLnZlY3RvciA8LSBhcy52ZWN0b3IoZGF0LmFicykNCm5hbWVzKGRhdC5hYnMudmVjdG9yKSA8LSByb3duYW1lcyhkYXQuYWJzKQ0KDQojcGVyZm9ybWluZyBBTkMNCg0KYW5jLmFicyA8LSBmYXN0QW5jKHRyZWUsIGRhdC5hYnMsIHZhcnM9VFJVRSxDST1UUlVFLCBSRU1MID0gMSkNCmFuYy5yZWwgPC0gZmFzdEFuYyh0cmVlLCBkYXQucmVsLCB2YXJzPVRSVUUsQ0k9VFJVRSwgUkVNTCA9IDEpDQoNCnBkZihmaWxlID0gIkFOQy5wZGYiLCB3aWR0aCA9IDYsIGhlaWdodCA9IDYgLCBvbmVmaWxlID0gVCkNCg0KZmFuY3lUcmVlKHRyZWUsdHlwZT0ic2NhdHRlcmdyYW0iLA0KICAgICAgICAgIFg9YXMubWF0cml4KGRhdC5yZWwpLEE9YXMubWF0cml4KGFuYy5yZWwpLGNvbnRyb2w9bGlzdChzcGluPUZBTFNFKSxsYWJlbD0iaG9yaXpvbnRhbCIpDQpmYW5jeVRyZWUodHJlZSx0eXBlPSJzY2F0dGVyZ3JhbSIsDQogICAgICAgICAgWD1hcy5tYXRyaXgoZGF0LmFicyksQT1hcy5tYXRyaXgoYW5jLnJlbCksY29udHJvbD1saXN0KHNwaW49RkFMU0UpLGxhYmVsPSJob3Jpem9udGFsIikNCg0KZGV2Lm9mZiAoKQ0KYGBgDQoNCiNEaW1vcnBoaXNtDQpgYGB7cn0NCkRhdGExPXJlYWQuY3N2KCJkaW1vcnBoZGF0YS5jc3YiLCBoZWFkZXI9VFJVRSkNCnJvdy5uYW1lcyhEYXRhMSk9RGF0YTEkU3BlY2llcw0KDQpUcmVlRGltb3JwaD1yZWFkLnRyZWUoImRpbW9ycGhkYXRhLnR4dCIpDQpwbG90KFRyZWVEaW1vcnBoLCBjZXg9MC41KQ0KDQpwcmltYXRlMSA8LSBjb21wYXJhdGl2ZS5kYXRhKHBoeSA9IFRyZWVEaW1vcnBoLCBkYXRhID0gRGF0YTEsIG5hbWVzLmNvbCA9IFNwZWNpZXMsIHZjdiA9IFRSVUUsIG5hLm9taXQgPSBGQUxTRSwgd2Fybi5kcm9wcGVkID0gVFJVRSkNCg0KI3NpZw0KbW9kZWwucGdsczE8LXBnbHMoQm9XIH4gSElQLCBkYXRhID0gcHJpbWF0ZTEsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczI8LXBnbHMoQm9XIH4gTkVULCBkYXRhID0gcHJpbWF0ZTEsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczM8LXBnbHMoQm9XIH4gT0JMLCBkYXRhID0gcHJpbWF0ZTEsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczQ8LXBnbHMoQm9XIH4gQ0VSLCBkYXRhID0gcHJpbWF0ZTEsIGxhbWJkYT0nTUwnKQ0KI3NpZw0KbW9kZWwucGdsczU8LXBnbHMoQm9XIH4gIE1FUywgZGF0YSA9IHByaW1hdGUxLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHM2PC1wZ2xzKEJvVyB+ICBESUUsIGRhdGEgPSBwcmltYXRlMSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzNzwtcGdscyhCb1cgfiAgVEVMLCBkYXRhID0gcHJpbWF0ZTEsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczg8LXBnbHMoQm9XIH4gIEJPTCwgZGF0YSA9IHByaW1hdGUxLCBsYW1iZGE9J01MJykNCiNzaWcNCm1vZGVsLnBnbHM5PC1wZ2xzKEJvVyB+ICBQQUwsIGRhdGEgPSBwcmltYXRlMSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzMTA8LXBnbHMoQm9XIH4gIFNFUCwgZGF0YSA9IHByaW1hdGUxLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHMxMTwtcGdscyhCb1cgfiAgU1RSLCBkYXRhID0gcHJpbWF0ZTEsIGxhbWJkYT0nTUwnKQ0KbW9kZWwucGdsczEyPC1wZ2xzKEJvVyB+ICBTQ0gsIGRhdGEgPSBwcmltYXRlMSwgbGFtYmRhPSdNTCcpDQptb2RlbC5wZ2xzMTM8LXBnbHMoQm9XIH4gIE5FTywgZGF0YSA9IHByaW1hdGUxLCBsYW1iZGE9J01MJykNCm1vZGVsLnBnbHMxNDwtcGdscyhCb1cgfiAgVE9ULCBkYXRhID0gcHJpbWF0ZTEsIGxhbWJkYT0nTUwnKQ0KDQpzdW1tYXJ5L2Fub3ZhDQpgYGANCg0K