This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

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

Loading libraries

library(vegan)
library(ggplot2)
library(ggsci)
library(gplots)
library(iNEXT)
library(nlme)
library(rcompanion)
library(car)
set.seed(4321)

Loading datasets

library(vegan)
 要求されたパッケージ permute をロード中です 
 要求されたパッケージ lattice をロード中です 
This is vegan 2.5-7
library(ggplot2)
library(ggsci)
library(gplots)

 次のパッケージを付け加えます: ‘gplots’ 

 以下のオブジェクトは ‘package:stats’ からマスクされています: 

     lowess 
library(iNEXT)
library(nlme)
library(rcompanion)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'DescTools':
  method         from  
  reorder.factor gplots
library(car)
 要求されたパッケージ carData をロード中です 
set.seed(4321)

Note for symbols to represent plant initial conditions

Basic Analysis of the time evolution (succession) of the abundant species (for supporting information)

Data pretreatment

uds_data5.temp <- read.csv("monthly-for-R3.csv",header=T)  #for 2 or 3 continuous sampling at day 10, 32, and 60

uds_data_all_day <-uds_data5.temp[,c(-1)]
uds_data_all_day2 <-uds_data5.temp

#converting treatment to chamber
chamber <- uds_data_all_day2$treatment
chamber[chamber == "N"] <- "C1"
chamber[chamber == "W"] <- "C2"
chamber[chamber == "T"] <- "C2"
uds_data_all_day2 <- cbind.data.frame(uds_data_all_day2, chamber)

uds_data_all_LBa <- read.csv("leaf_beetle_adult_summary.csv", header=T) #for leaf beetle adult data
uds_dataLB <- uds_data_all_day[, c(3)]
head(uds_data_all_LBa)
head(uds_data_all_day2)

Time evolution of the rank 1-10 taxa

SAD_total <- data.frame(abundance=apply(uds_data_all_day2[,4:76], 2, sum))
SAD_rank <- order(SAD_total[,1], decreasing=T)
SAD_total2 <- data.frame(rank=c(1:73), ID=rownames(SAD_total)[SAD_rank], abundance=SAD_total[SAD_rank,1])
#how many species?
sum(SAD_total2$abundance>0)
[1] 48
plot(SAD_total2$rank, log10(SAD_total2$abundance)) #SAD, including the rank 1 speices (wl) but with log10 scale

plot(SAD_total2$rank[-1], SAD_total2$abundance[-1]) #SAD, excluding the rank 1 speices (wl)

plot(SAD_total2$rank[2:10], SAD_total2$abundance[2:10]) #SAD, from rank 2 to rank 10

#text(SAD_total2$rank[2:10], SAD_total2$abundance[2:10], labels=SAD_total2$ID[2:10])
ggplot(SAD_total2, aes(x=rank, y=log10(abundance))) + geom_point()

SAD_total2_sub <- SAD_total2[2:10,]
sad_plot <- ggplot(SAD_total2_sub, aes(x=rank, y=abundance)) + geom_point()
sad_plot <- sad_plot + geom_text(aes(label=ID), size=3,vjust=-1)
plot(sad_plot)

Leaf beetle population dynamics analysis (Fig.1)

Incorporating nested structure

#Taxon (species) identity
SAD_total2_sub$ID
[1] "spider3"     "lep9"        "lep7"        "lep10"       "aphi5"       "spider4"     "parasitoid3"
[8] "lep12"       "lep13"      
uds_data_all_day_SI <- uds_data_all_day2  #copy for SI only
uds_data_all_day_SI$treatment[uds_data_all_day_SI$treatment=="N"] <- "U"
uds_data_all_day_SI$treatment[uds_data_all_day_SI$treatment=="W"] <- "D"
uds_data_all_day_SI$treatment[uds_data_all_day_SI$treatment=="T"] <- "E"
treatment_day <- as.factor(paste(uds_data_all_day_SI$treatment,uds_data_all_day_SI$day))
uds_data_all_day_SI <- cbind.data.frame(uds_data_all_day_SI, treatment_day)
plot(uds_data_all_day_SI$treatment_day ,uds_data_all_day_SI$wl)


#rank 1
ggplot(uds_data_all_day_SI, aes(x=treatment_day, y=wl, fill=treatment)) + geom_boxplot(outlier.shape = NA) + geom_point(alpha=0.2) + ggtitle("Plagiodera versicolora")


#rank 2
ggplot(uds_data_all_day_SI, aes(x=treatment_day, y=spider3, fill=treatment))  + geom_boxplot(outlier.shape = NA) + geom_point(alpha=0.1, size=2) + ggtitle("spider group 3 (< 5mm with spiderweb)")


#rank 3
ggplot(uds_data_all_day_SI, aes(x=treatment_day, y=lep9, fill=treatment))  + geom_boxplot(outlier.shape = NA) + geom_point(alpha=0.1, size=2) + ggtitle("Caloptilia sp.2")


#rank 4
ggplot(uds_data_all_day_SI, aes(x=treatment_day, y=lep7, fill=treatment))  + geom_boxplot(outlier.shape = NA) + geom_point(alpha=0.1, size=2) + ggtitle("Saliciphaga caesia")


#rank 5
ggplot(uds_data_all_day_SI, aes(x=treatment_day, y=lep10, fill=treatment))  + geom_boxplot(outlier.shape = NA) + geom_point(alpha=0.1, size=2) + ggtitle("Phyllocolpa sp")


#rank 6
ggplot(uds_data_all_day_SI, aes(x=treatment_day, y=aphi5, fill=treatment))  + geom_boxplot(outlier.shape = NA) + geom_point(alpha=0.1, size=2) + ggtitle("Cavariella salicicola")


#rank 7
ggplot(uds_data_all_day_SI, aes(x=treatment_day, y=lep12, fill=treatment))  + geom_boxplot(outlier.shape = NA) + geom_point(alpha=0.1, size=2) + ggtitle("spider group 4 (< 5mm without spiderweb)")


#rank 8
ggplot(uds_data_all_day_SI, aes(x=treatment_day, y=parasitoid3, fill=treatment))  + geom_boxplot(outlier.shape = NA) + geom_point(alpha=0.1, size=2) + ggtitle("Tachinidae sp.1 (host: P. versicolora)")


#rank 9
ggplot(uds_data_all_day_SI, aes(x=treatment_day, y=lep12, fill=treatment))  + geom_boxplot(outlier.shape = NA) + geom_point(alpha=0.1, size=2) + ggtitle("Microleon longipalpis")


#rank 10
ggplot(uds_data_all_day_SI, aes(x=treatment_day, y=lep13, fill=treatment))  + geom_boxplot(outlier.shape = NA) + geom_point(alpha=0.1, size=2) + ggtitle("Monema flavescens")


#rank 11
ggplot(uds_data_all_day_SI, aes(x=treatment_day, y=grasshopper1, fill=treatment))  + geom_boxplot(outlier.shape = NA) + geom_point(alpha=0.1, size=2) + ggtitle("Orthoptera sp.1")

NA
NA

Repeated ANOVA with autoregression

Ref: http://rcompanion.org/handbook/I_09.html

chamber <- append(rep("C1",16),rep("C2",32))
uds_data_all_LBa <- cbind.data.frame(uds_data_all_LBa, chamber)
uds_data_all_LBa

hour scale (Fig.1a)

#Data decomposition
uds_data_LBa24h <- subset(uds_data_all_LBa, uds_data_all_LBa$day==1)
uds_data_LBa2_7d <- subset(uds_data_all_LBa, (uds_data_all_LBa$day >= 2 & uds_data_all_LBa$day <= 7))
uds_data_LBa10_60d <- subset(uds_data_all_LBa, (uds_data_all_LBa$day >= 10 & uds_data_all_LBa$day <= 60))

Summary of hour scale results (Fig.1a)

  • There were statistically significant differences bet. U vs (S + D), i.e., chamber effect.
  • By the add-hoc test,
    • there were differences bet. U vs (S + D) at 12 h and 24 h
    • but no differences bet. S vs D either.

a week scale (Fig.1b)

#short (Fig.1a)
model24h_0 = gls(adult ~ chamber + hour + chamber*hour,data=uds_data_LBa24h)
#Anova(model24h_0)
ACF_s <- ACF(model24h_0, form = ~ hour|id)
head(ACF_s)
model24h = gls(adult ~ chamber + hour + chamber*hour, correlation = corAR1(form = ~ hour|id, value = ACF_s$ACF[2]),data=uds_data_LBa24h)
Anova(model24h)
Analysis of Deviance Table (Type II tests)

Response: adult
             Df  Chisq Pr(>Chisq)  
chamber       1 4.7975    0.02850 *
hour          1 5.9301    0.01488 *
chamber:hour  1 5.8661    0.01544 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#Post-hoc test
data12h<-subset(uds_data_LBa24h, hour==12)
pairwise.t.test(data12h$adult, data12h$chamber,p.adjust.method="holm")

    Pairwise comparisons using t tests with pooled SD 

data:  data12h$adult and data12h$chamber 

   C1   
C2 0.015

P value adjustment method: holm 
pairwise.t.test(data12h$adult[-c(1:16)],data12h$treatment[-c(1:16)],p.adjust.method="holm")

    Pairwise comparisons using t tests with pooled SD 

data:  data12h$adult[-c(1:16)] and data12h$treatment[-c(1:16)] 

  D   
S 0.33

P value adjustment method: holm 
data24h<-subset(uds_data_LBa24h, hour==24)
pairwise.t.test(data24h$adult, data24h$chamber,p.adjust.method="holm")

    Pairwise comparisons using t tests with pooled SD 

data:  data24h$adult and data24h$chamber 

   C1   
C2 0.027

P value adjustment method: holm 
pairwise.t.test(data12h$adult[-c(1:16)], data12h$treatment[-c(1:16)],p.adjust.method="holm")

    Pairwise comparisons using t tests with pooled SD 

data:  data12h$adult[-c(1:16)] and data12h$treatment[-c(1:16)] 

  D   
S 0.33

P value adjustment method: holm 
#Summary statistics for graph
sum24h = groupwiseMean(adult ~ treatment + hour, data = uds_data_LBa24h, conf = 0.95, digits = 3,traditional = FALSE, percentile  = TRUE)
sum24h

#shortest graph (Fig.1a)
pd = position_dodge(1)
g_line<-ggplot(sum24h, aes(y=Mean, x=hour)) + xlim(0,25) + ylim(0,1.1) + coord_fixed(25/1.1)
g_line<-g_line+geom_line(aes(colour=treatment),size=1,position=pd) 
g_line<- g_line+ geom_errorbar(aes(ymin=Percentile.lower, ymax = Percentile.upper, colour=treatment),alpha=0.9,size=1, width=0, position=pd)
g_line<-g_line+geom_point(aes(colour=treatment, shape=treatment),size=3,alpha=1.0, position=pd) 
print(g_line)

Summary of a week scale results (Fig.1b)

  • There was no statistically significant difference bet. U vs (S + D), i.e., chamber effect.
  • By the add-hoc test,
    • there was no difference bet. U vs (S + D) at 7d
    • but no differences bet. S vs D either.

monthly scale (Fig.1c)

#middle (Fig.1b)
model2_7d0 = gls(adult ~ chamber + day + chamber*day,data=uds_data_LBa2_7d)
#Anova(model2_7d0)
ACF_m <- ACF(model2_7d0, form = ~ day|id)
head(ACF_m)
model2_7d = gls(adult ~ chamber + day + chamber*day, correlation = corAR1(form = ~ day|id, value = ACF_m$ACF[2]),data=uds_data_LBa2_7d)
Anova(model2_7d)
Analysis of Deviance Table (Type II tests)

Response: adult
            Df   Chisq Pr(>Chisq)    
chamber      1  0.1239   0.724869    
day          1 16.9347  3.869e-05 ***
chamber:day  1  6.6496   0.009918 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#Post-hoc test
data7d<-subset(uds_data_LBa2_7d, day==7)
pairwise.t.test(data7d$adult, data7d$chamber,p.adjust.method="holm")

    Pairwise comparisons using t tests with pooled SD 

data:  data7d$adult and data7d$chamber 

   C1  
C2 0.21

P value adjustment method: holm 
pairwise.t.test(data7d$adult[-c(1:16)], data7d$treatment[-c(1:16)],p.adjust.method="holm")

    Pairwise comparisons using t tests with pooled SD 

data:  data7d$adult[-c(1:16)] and data7d$treatment[-c(1:16)] 

  D   
S 0.94

P value adjustment method: holm 
#Summary statistics for graph
sum2_7d = groupwiseMean(adult ~ treatment + day, data = uds_data_LBa2_7d, conf = 0.95, digits = 3,traditional = FALSE, percentile  = TRUE)

#a week scale graph (Fig.1b)
pd = position_dodge(0.3)
g_line<-ggplot(sum2_7d, aes(y=Mean, x=day)) + xlim(1,8) + ylim(0,1.1) + coord_fixed(7/2.0)
g_line<-g_line+geom_line(aes(colour=treatment),size=1, position=pd) 
g_line<- g_line+ geom_errorbar(aes(ymin=Percentile.lower, ymax = Percentile.upper, colour=treatment),alpha=0.9,size=1, width=0, position=pd)
g_line<-g_line+geom_point(aes(colour=treatment, shape=treatment),size=3,alpha=1.0, position=pd) 
print(g_line)

Summary of monthly scale results (Fig.1c)

  • There was no statistically significant difference bet. U vs (S + D), i.e., chamber effect.
  • By the add-hoc test,
    • there was no difference bet. U vs (S + D) at 10d
    • but a difference bet. S vs D at 10d.

Ordinations for community composition

Preparing the function for Fig.2 & Fig.S1

model10_60d0 = gls(adult ~ chamber + day + chamber*day, data=uds_data_LBa10_60d)
#Anova(model10_60d0)
ACF_l <- ACF(model10_60d0, form = ~ day|id)
head(ACF_l)
model10_60d = gls(adult ~ chamber + day + chamber*day, correlation = corAR1(form = ~ day|id, value = ACF_l$ACF[2]),data=uds_data_LBa10_60d)
Anova(model10_60d)
Analysis of Deviance Table (Type II tests)

Response: adult
            Df   Chisq Pr(>Chisq)    
chamber      1  2.2242    0.13586    
day          1 41.4459  1.212e-10 ***
chamber:day  1  2.8322    0.09239 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#Post-hoc test
data10d<-subset(uds_data_LBa10_60d, day==10)
pairwise.t.test(data10d$adult, data10d$chamber,p.adjust.method="holm")

    Pairwise comparisons using t tests with pooled SD 

data:  data10d$adult and data10d$chamber 

   C1  
C2 0.14

P value adjustment method: holm 
pairwise.t.test(data10d$adult[-c(1:16)], data10d$treatment[-c(1:16)],p.adjust.method="holm")

    Pairwise comparisons using t tests with pooled SD 

data:  data10d$adult[-c(1:16)] and data10d$treatment[-c(1:16)] 

  D    
S 0.041

P value adjustment method: holm 
#Summary statistics for graph
sum10_60d = groupwiseMean(adult ~ treatment + day, data = uds_data_LBa10_60d, conf = 0.95, digits = 3,traditional = FALSE, percentile  = TRUE)

#graphics
pd = position_dodge(3)
g_line<-ggplot(sum10_60d, aes(y=Mean, x=day)) + xlim(5,65) + ylim(0,4) + coord_fixed(ratio = 60/4)
g_line<-g_line+geom_line(aes(colour=treatment),size=1, position=pd) 
g_line<- g_line+geom_errorbar(aes(ymin=Percentile.lower, ymax = Percentile.upper, colour=treatment),alpha=0.9,size=1, width=0, position=pd)
g_line<-g_line+geom_point(aes(colour=treatment, shape=treatment),size=3,alpha=1.0, position=pd) 
print(g_line)

Figure 2a & 2b

  • With excluding leaf beetle and using chao distance
disper_uds_centroid_graph <- function(data_name, c_LB, meth, adj=NULL, type="violin", lim_min=-0.6, lim_max=0.4) {
  if(c_LB == "wLB") {
    uds_data1 <-subset(data_name, abundance > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    uds_each<-uds_data1[,c(-1,-2,-3, -77,-78, -79, -80)]
  }  #When leaf beele is included
  if(c_LB == "woLB") {
    uds_data1 <-subset(data_name, abundance2 > 0) #OR, delete the sampling when species other than leaf beetle does not exist
    uds_each<-uds_data1[,c(-1,-2,-3,-4,-77,-78,-79, -80)]
  }  #When leaf beele is NOT included
  if(c_LB == "LBonly") {
    uds_data1 <- subset(data_name, abundance2 > 0)
    uds_each <- subset(uds_data1, day==date)[, c(4)]  #picking up LB only
  }
  
  sample_each <- uds_data1$sample
  #meth="chao"
  uds_bray_each0.d<-vegdist(uds_each, method=meth)
  if(c_LB == "LBonly") tp <- "centroid"
  else tp <- "median"
  uds_dist_each0 <-betadisper(uds_bray_each0.d, sample_each, type=tp, bias.adjust = TRUE)
  uds_median <- data.frame(uds_dist_each0$centroids)  #calculate the centroid (spatial median) for repeated measures
  
  sample <- row.names(uds_median)
  #sample <- sample_each
  #Replace the sample name into the treatment
  sample[grep("1n", sample)]<- "U10"
  sample[grep("2n", sample)]<- "U32"
  sample[grep("3n", sample)]<- "U60"
  sample[grep("1t", sample)]<- "S10"
  sample[grep("2t", sample)]<- "S32"
  sample[grep("3t", sample)]<- "S60"
  sample[grep("1w", sample)]<- "D10"
  sample[grep("2w", sample)]<- "D32"
  sample[grep("3w", sample)]<- "D60"
  
  treatment_each <- as.factor(sample) #just conversion

  uds_each.d<-vegdist(uds_median, method="euclidean")

  uds_dist_each <-betadisper(uds_each.d, treatment_each, type="centroid", bias.adjust = TRUE)  #Choose centroid because of euclidean distance
  #Plot
  if(c_LB == "LBonly") boxplot(uds_dist_each)
  else {
    #boxplot(uds_dist_each)
    #ordiplot(uds_dist_each$centroids, type="text", choices=c(1,2), cex=1, xlim=c(-0.6,0.4), ylim=c(-0.6, 0.5))
    #par(new=T)

    if(type == "violin") {
      #boxplot(uds_dist_each)
      ##from ggplot2
      #convert to data.frame (which is necessary for ggplot2)
      
      uds_dist_each2 <- cbind.data.frame(uds_dist_each$distances, as.character(uds_dist_each$group))
      
      treatment<-as.character(uds_dist_each$group)
      #Replace the sample name into the treatment
      treatment[grep("U", treatment)]<- "U"
      treatment[grep("D", treatment)]<- "D"
      treatment[grep("S", treatment)]<- "S"
      
      uds_dist_each2<-cbind.data.frame(uds_dist_each2, treatment)  
      colnames(uds_dist_each2) <- c("distances", "group", "treatment")
      uds_dist_each2$distances <- as.numeric(as.character(uds_dist_each2$distances))
      
      g_box<-ggplot(uds_dist_each2, aes(y=distances, x=group,colour=treatment))
      g_box<-g_box + geom_violin()
      g_box<-g_box + geom_boxplot(fill="black", width=0.1) 
      g_box<-g_box + coord_fixed(ratio = 15/1)
      print(g_box)
    }      
      else if(type == "PCoA") {
        #PCoA 
        test0<-capscale(uds_each.d~1)  
        test<-cmdscale(uds_each.d, eig=FALSE, k = 2)
        #prepare dataframe for each point
        test2<-summary(test)
        #uds_dist_each_test<-data.frame(PCoA1=-test2$sites[,1], PCoA2=-test2$sites[,2])
        uds_dist_each_test<-as.data.frame(test)
        uds_dist_each_test<-cbind.data.frame(sample, uds_dist_each_test)
        treatment<-as.character(sample)
        day<-as.character(sample)
        #Replace the sample name into the treatment & day
        treatment[grep("U", treatment)]<- "U"
        treatment[grep("D", treatment)]<- "D"
        treatment[grep("S", treatment)]<- "S"
        day[grep("10", day)]<-"Day10"
        day[grep("32", day)]<-"Day32"
        day[grep("60", day)]<-"Day60"
        
        uds_dist_each_test<-cbind.data.frame(cbind.data.frame(treatment, day), uds_dist_each_test)
        colnames(uds_dist_each_test)<-c("treatment", "day", "group", "PCoA1", "PCoA2")
        class(uds_dist_each_test$day)
        #prepare dataframe for centroid
        uds_dist_each_centr<-as.data.frame(uds_dist_each$centroids)
        treatment<-as.character(rownames(uds_dist_each_centr))
        day<-as.character(rownames(uds_dist_each_centr))
        #Replace the sample name into the treatment & day
        treatment[grep("U", treatment)]<- "U"
        treatment[grep("D", treatment)]<- "D"
        treatment[grep("S", treatment)]<- "S"
        day[grep("10", day)]<-"Day10"
        day[grep("32", day)]<-"Day32"
        day[grep("60", day)]<-"Day60"
        
        uds_dist_each_centr<-cbind.data.frame(uds_dist_each_centr, data.frame(treatment=treatment, day=day, group=rownames(uds_dist_each_centr)))
        
        g_PCoA <- ggplot(uds_dist_each_test, aes(x=PCoA1,y=PCoA2))
        g_PCoA <- g_PCoA + geom_point(aes(colour=treatment, shape=day), size=3, alpha=0.5)
        g_PCoA <- g_PCoA + xlim(lim_min, lim_max) + ylim(lim_min,lim_max) + coord_fixed(ratio = 1/1)
        #Add the centroid information
        g_PCoA <- g_PCoA + layer(
          data=uds_dist_each_centr, 
          mapping=aes(x=PCoA1, y=PCoA2, colour=treatment, shape=day), 
          params=list(size=5),
          geom="point", 
          stat="identity", 
          position="identity"
        )
        print(g_PCoA)
       
        #Performance of PCoA  http://d.hatena.ne.jp/hoxo_m/20120313/p1
        summary(test0)
    }
  }
  
  #Performance of PCoA  http://d.hatena.ne.jp/hoxo_m/20120313/p1
  #summary(test0)
  
  if(type == "NMDS") {
    uds_each.mds<-metaMDS(uds_median, distance="euclidean")
    rownames(uds_each.mds$points)<-treatment_each
    ordiplot(uds_each.mds$points, type='points', xlim=c(-1.0, 1.0))
    text(uds_each.mds$points,labels=treatment_each, col=unclass(treatment_each),cex=0.8)
  }

}

Figure S1

    1. Using bray-curtis dissimilarity w/o LB
    1. Using Chao dissimilarity w/ LB
#Figure 2a
disper_uds_centroid_graph(data_name=uds_data_all_day2, c_LB="woLB", meth="chao", type="violin")
 警告:  some squared distances are negative and changed to zero

#Figure 2b
disper_uds_centroid_graph(data_name=uds_data_all_day2, c_LB="woLB", meth="chao", type="PCoA")
 警告:  some squared distances are negative and changed to zero

Statistical tests corresponding to the results shown in Fig.2

Definitions of functions fot statistical test

####For Figure S1a
disper_uds_centroid_graph(data_name=uds_data_all_day2, c_LB="woLB", meth="bray", type="PCoA", lim_min=-0.75, lim_max=0.5) 
 警告:  some squared distances are negative and changed to zero

####For Figure S1b
disper_uds_centroid_graph(data_name=uds_data_all_day2, c_LB="wLB", meth="chao", type="PCoA", lim_min=-0.75, lim_max=0.5)   
 警告:  some squared distances are negative and changed to zero

Statistical tests for Fig.2

For PERMDISP: comparison between dates (Fig.2A)
#///////////////////////Pre-Evaluation of effectiveness of PERMANOVA (or can be used for assessing beta diversity) through PERMDISP for each of 10d, 32d, 60d/////////////////////
disper_uds_centroid <- function(data_name, date, c_LB, meth, adj=NULL, plot="box", dist_out=FALSE) {
    
    if(c_LB == "wLB") {
      uds_data1 <-subset(data_name, abundance > 0)  #delete the sampling data with 0 total abundance when leaf beetle
      uds_each<-subset(uds_data1, day==date)[,c(-1,-2,-3, -77,-78, -79, -80)]
    }  #When leaf beetle is included
    if(c_LB == "woLB") {
      uds_data1 <-subset(data_name, abundance2 > 0) #OR, delete the sampling when species other than leaf beetle does not exist
      uds_each<-subset(uds_data1, day==date)[,c(-1,-2,-3,-4,-77,-78,-79, -80)]
    }  #When leaf beetle is NOT included 
  
    if(c_LB == "LBonly") {  #For leaf beetle only but consider the case with other insects only
      uds_data1 <- subset(data_name, abundance2 > 0)
      #uds_data1 <-data_name
      uds_each <- subset(uds_data1, day==date)[, c(4)]  #picking up LB only
    }
    
    sample_each <- subset(uds_data1, day==date)$sample
    #length(uds_each)
    #length(sample_each)
    
    ##In case of leaf beetle only, different calculation
    if(c_LB == "LBonly") {
      sample_ID<-as.factor(sample_each)
      LB_average<-tapply(uds_each, sample_ID, mean)  #calculate the average of short-term repeated measurement
      LB_average2<-LB_average #just copy
      sample <- row.names(LB_average2)
      sample2 <- row.names(LB_average2)
      #Replace the sample name into the treatment
      sample[grep("n", sample)]<- "U" #undamaged
      sample[grep("t", sample)]<- "S" #Signaled
      sample[grep("w", sample)]<- "D" #Damaged
      treatment_each <- as.factor(sample) #just conversion
      #print(treatment_each)
      
      #Replace the sample name into the chamber
      sample2[grep("n", sample2)]<- "C1" #undamaged
      sample2[grep("t", sample2)]<- "C2" #Signaled
      sample2[grep("w", sample2)]<- "C2" #Damaged
      chamber_each <- as.factor(sample2) #just conversion
      
      average_treatment<-tapply(LB_average, treatment_each, mean)   #calculate the average of U, D, S, respectively
      average_chamber<-tapply(LB_average2, chamber_each, mean)   #calculate the average of C1 amd C2
      #print(average_treatment)
      for(i in 1: length(LB_average)) {  #normalizing the original data to exclude the effect of average on the distance to centroid
        if(treatment_each[i] == "D" && average_treatment[1] > 0.0) LB_average[i] = LB_average[i]/average_treatment[1] 
        if(treatment_each[i] == "S" && average_treatment[2] > 0.0) LB_average[i] = LB_average[i]/average_treatment[2]
        if(treatment_each[i] == "U" && average_treatment[3] > 0.0) LB_average[i] = LB_average[i]/average_treatment[3]
      }
      
      for(i in 1: length(LB_average)) {  #normalizing the original data to exclude the effect of average on the distance to centroid
        if(chamber_each[i] == "C1" && average_chamber[1] > 0.0) LB_average2[i] = LB_average2[i]/average_chamber[1] 
        if(chamber_each[i] == "C2" && average_chamber[2] > 0.0) LB_average2[i] = LB_average2[i]/average_chamber[2]
      }
      
    uds_median<-LB_average  #send the data for further analysis, distinguishing D,S,and U
    uds_median2<-LB_average2  #send the data for further analysis, distinguishing C1 and C2
    #print(uds_median)
    if(dist_out == "C1") uds_median <- subset(uds_median, chamber_each=="C1")
    else if(dist_out == "C2") uds_median <- subset(uds_median, chamber_each=="C2")
    #print(uds_median)
    }
    
    else {
      uds_bray_each0.d<-vegdist(uds_each, method=meth)
      
      tp <- "median"
      uds_dist_each0 <-betadisper(uds_bray_each0.d, sample_each, type=tp, bias.adjust = TRUE)
      uds_median <- data.frame(uds_dist_each0$centroids)  #calculate the centroid (spatial median) for repeated measures
      
      sample <- row.names(uds_median)
      sample2 <- sample #just copy
      #Replace the sample name into the treatment
      sample[grep("n", sample)]<- "U" #undamaged
      sample[grep("t", sample)]<- "S" #Signaled
      sample[grep("w", sample)]<- "D" #Damaged
      treatment_each <- as.factor(sample) #just conversion
      #Replace the sample name into the chamber
      sample2[grep("n", sample2)]<- "C1" #undamaged
      sample2[grep("t", sample2)]<- "C2" #Signaled
      sample2[grep("w", sample2)]<- "C2" #Damaged
      chamber_each <- as.factor(sample2) #just conversion
      
      if(dist_out == "C1") uds_median <- uds_median[chamber_each=="C1",]
      else if(dist_out == "C2") uds_median <- uds_median[chamber_each=="C2",]
      #print(uds_median)
    }
    
    
    uds_each.d<-vegdist(uds_median, method="euclidean")
    if(dist_out!= FALSE) return(uds_each.d)
    
    #treatment_each
    uds_dist_each <-betadisper(uds_each.d, treatment_each, type="centroid", bias.adjust = TRUE)  #Choose centroid because of euclidean distance
    #chamber_each
    uds_dist_each_C <-betadisper(uds_each.d, chamber_each, type="centroid", bias.adjust = TRUE)  
    #Plot
    if(c_LB == "LBonly") boxplot(uds_dist_each)
    else {
      if(plot=="box") {
        boxplot(uds_dist_each_C)
        boxplot(uds_dist_each)
      }
      else{
        plot(uds_dist_each)
        ordilabel(scores(uds_dist_each, "centroids"))
        plot(uds_dist_each_C)
        ordilabel(scores(uds_dist_each_C, "centroids"))
        
      }
    }
    
    #PERDISP & permutation 
    perm_result_C <- permutest(uds_dist_each_C, pairwise=FALSE, permutations=9999)
    perm_result <- permutest(uds_dist_each, pairwise=TRUE, permutations=9999)
    
    cat("Sampling day was\n")
    print(subset(uds_data1, day==date)$day[1])
    cat("Comparison between chambers\n")
    print(perm_result_C)
    cat("Comparison between treatments\n")
    print(perm_result)
    
    #In fact, the adjustment is not necessary because permutest.betadisper does not repeat permutation for each pair
    if(!is.null(adj)) {
      pairwise_adj<-p.adjust(perm_result$pairwise$permuted, method = adj , n = length(perm_result$pairwise$permuted))
      cat("Pairwise comparision by permutation, adjusted by")
      print(as.character(adj))
      print(pairwise_adj[1])
      print(pairwise_adj[2])
      print(pairwise_adj[3])
    }

    
}

#///PERMANOVA for each initial conditions, based on the spatial median for repeated measures
com_div_uds_centroid <- function(data_name, date, c_LB, meth, adj)
{
  if(c_LB == "wLB") {
    uds_data1 <-subset(data_name, abundance > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    uds_each<-subset(uds_data1, day==date)[,c(-1,-2,-3,-77,-78, -79, -80)]
  }  #When leaf beele is included
  if(c_LB == "woLB") {
    uds_data1 <-subset(data_name, abundance2 > 0) #OR, delete the sampling when species other than leaf beetle does not exist
    uds_each<-subset(uds_data1, day==date)[,c(-1,-2,-3,-4,-77,-78, -79, -80)]
    uds_each_LB<-subset(uds_data1, day==date)[,c(4)]  #extract leaf beetle abundance
  }  #When leaf beele is NOTincluded
  
  sample_each <- subset(uds_data1, day==date)$sample

  uds_each.d<-vegdist(uds_each, method=meth)
  uds_dist_each <-betadisper(uds_each.d, sample_each, type="median", bias.adjust = TRUE)
  uds_median <- data.frame(uds_dist_each$centroids)  #calculate the centroid (spatial median) for repeasted measures
  

  sample <- row.names(uds_median)
  sample2 <- row.names(uds_median)
  #Replace the sample name into the treatment
  sample[grep("n", sample)]<- "U"
  sample[grep("t", sample)]<- "S"
  sample[grep("w", sample)]<- "D"
  treatment_each <- as.factor(sample) #just conversion
  
  #Replace the sample name into the chamber
  sample2[grep("n", sample2)]<- "C1" #undamaged
  sample2[grep("t", sample2)]<- "C2" #Signaled
  sample2[grep("w", sample2)]<- "C2" #Damaged
  chamber_each <- as.factor(sample2) #just conversion
      
  
  adonis_result_C<-adonis(uds_median ~ chamber_each, method="euclidean", permutations=9999)
  adonis_result_T<-adonis(uds_median ~ treatment_each, method="euclidean", permutations=9999)

  print(adonis_result_C) #Chamber effect
  print(adonis_result_T) #Treatment effect
  
  #For pairwise comparison (only between D and S)
  cat("The pairwise PERMANOVA (adonis) analysis:\n")
  uds_dataDS0<-subset(data_name,  treatment != "N") #We still need the symbols N, W, and T because it is used in the raw data files
  uds_dataSU0<-subset(data_name,  treatment != "W")
  uds_dataUD0<-subset(data_name,  treatment != "T")
  if(c_LB == "wLB") {
    uds_dataDS1 <-subset(uds_dataDS0, abundance > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    DS_each<-subset(uds_dataDS1, day==date)[,c(-1,-2,-3,-77,-78,-79,-80)]
    uds_dataSU1 <-subset(uds_dataSU0, abundance > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    SU_each<-subset(uds_dataSU1, day==date)[,c(-1,-2,-3,-77,-78,-79,-80)]
    uds_dataUD1 <-subset(uds_dataUD0, abundance > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    UD_each<-subset(uds_dataUD1, day==date)[,c(-1,-2,-3,-77,-78,-79,-80)]
  }  #When leaf beele is included
  if(c_LB == "woLB") {
    uds_dataDS1 <-subset(uds_dataDS0, abundance2 > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    DS_each<-subset(uds_dataDS1, day==date)[,c(-1,-2,-3,-4,-77,-78, -79, -80)]
    uds_dataSU1 <-subset(uds_dataSU0, abundance2 > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    SU_each<-subset(uds_dataSU1, day==date)[,c(-1,-2,-3,-4,-77,-78, -79,-80)]
    uds_dataUD1 <-subset(uds_dataUD0, abundance2 > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    UD_each<-subset(uds_dataUD1, day==date)[,c(-1,-2,-3,-4,-77,-78, -79,-80)]
  }  #When leaf beetle is NO Tincluded
  
  sample_DS <- subset(uds_dataDS1, day==date)$sample
  sample_SU <- subset(uds_dataSU1, day==date)$sample
  sample_UD <- subset(uds_dataUD1, day==date)$sample
  
  DS_bray_each.d<-vegdist(DS_each, method=meth)
  SU_bray_each.d<-vegdist(SU_each, method=meth)
  UD_bray_each.d<-vegdist(UD_each, method=meth)
  
  DS_dist_each <-betadisper(DS_bray_each.d, sample_DS, type="median", bias.adjust = TRUE)
  SU_dist_each <-betadisper(SU_bray_each.d, sample_SU, type="median", bias.adjust = TRUE)
  UD_dist_each <-betadisper(UD_bray_each.d, sample_UD, type="median", bias.adjust = TRUE)
  
  DS_median <- data.frame(DS_dist_each$centroids)  #calculate the centroid (spatial median) for repeasted measures
  SU_median <- data.frame(SU_dist_each$centroids)  #calculate the centroid (spatial median) for repeasted measures
  UD_median <- data.frame(UD_dist_each$centroids)  #calculate the centroid (spatial median) for repeasted measures
  
  DS_sample <- row.names(DS_median)
  SU_sample <- row.names(SU_median)
  UD_sample <- row.names(UD_median)
  
  #Replace the sample name into the treatment
  DS_sample[grep("n", DS_sample)]<- "U"
  DS_sample[grep("t", DS_sample)]<- "S"
  DS_sample[grep("w", DS_sample)]<- "D"
  treatment_DS <- as.factor(DS_sample) #just conversion
  SU_sample[grep("n", SU_sample)]<- "U"
  SU_sample[grep("t", SU_sample)]<- "S"
  SU_sample[grep("w", SU_sample)]<- "D"
  treatment_SU <- as.factor(SU_sample) #just conversion
  UD_sample[grep("n", UD_sample)]<- "U"
  UD_sample[grep("t", UD_sample)]<- "S"
  UD_sample[grep("w", UD_sample)]<- "D"
  treatment_UD <- as.factor(UD_sample) #just conversion

  adonis_resultDS<-adonis(DS_median ~ treatment_DS, method="euclidean", permutations=9999)
  adonis_resultSU<-adonis(SU_median ~ treatment_SU, method="euclidean", permutations=9999)
  adonis_resultUD<-adonis(UD_median ~ treatment_UD, method="euclidean", permutations=9999)
  
  p_list <- c(adonis_resultDS$aov$Pr[1], adonis_resultSU$aov$Pr[1], adonis_resultUD$aov$Pr[1])
  
  cat("The comparision between D and S is:\n")
  print(adonis_resultDS)
  
  pairwise_adj<-p.adjust(p_list, method = adj , n = length(p_list))
  
  #cat("Pairwise comparision by permutation, adjusted by")
  #print(adj)
  #cat("The adjusted  P-value for S vs D was\n")
  #print(pairwise_adj[1])
  #cat("The adjusted  P-value for U vs S was\n")
  #print(pairwise_adj[2])
  #cat("The adjusted  P-value for D vs U was\n")
  #print(pairwise_adj[3])
  
}

#///PERMANOVA for each date, based on the spatial median for repeated measures
com_div_DAY_centroid <- function(data_name, treat, c_LB, meth, adj=NULL) {
  
  #data_name <-uds_data_all_day2
  #treat <- "T"
  #meth="chao"
  #date <- "10d","32d", or "60d", or any
  if(c_LB == "wLB") {
    uds_data1 <-subset(data_name, abundance > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    uds_each<-subset(uds_data1, treatment==treat)[,c(-1,-2,-3, -77,-78, -79,-80)]
  }  #When leaf beele is included
  if(c_LB == "woLB") {
    uds_data1 <-subset(data_name, abundance2 > 0) #OR, delete the sampling when species other than leaf beetle does not exist
    uds_each<-subset(uds_data1, treatment==treat)[,c(-1,-2,-3,-4,-77,-78,-79,-80)]
  }  #When leaf beele is NOTincluded
  if(c_LB == "LBonly") {
    uds_data1 <- subset(data_name, abundance2 > 0)
    uds_each <- subset(uds_data1, treatment==treat)[, c(4)]  #picking up LB only
  }
  
  sample_each <- subset(uds_data1, treatment==treat)$sample
  day_each <- subset(uds_data1, treatment==treat)$day

  uds_bray_each0.d<-vegdist(uds_each, method=meth)
  if(c_LB == "LBonly") tp <- "centroid"
  else tp <- "median"
  uds_dist_each0 <-betadisper(uds_bray_each0.d, sample_each, type=tp, bias.adjust = TRUE)
  uds_median <- data.frame(uds_dist_each0$centroids)  #calculate the centroid (spatial median) for repeasted measures

  sample <- row.names(uds_median)
  
  #Replace the sample name into the date
  sample[grep("^1", sample)]<- "day10"
  sample[grep("^2", sample)]<- "day32"
  sample[grep("^3", sample)]<- "day60"
  
  day_each <- as.factor(sample) #just conversion
  
  adonis_result<-adonis(uds_median ~ day_each, method="euclidean", permutations=9999)
  
  print(adonis_result)
  
  #For pairwise comarison (with Bonferroni adjustment)
  cat("The pairwise PERMANOVA (adonis) analysis:\n")
  uds_dataDay1032_0<-subset(data_name,  day != "60d")
  uds_dataDay1060_0<-subset(data_name,  day != "32d")
  uds_dataDay3260_0<-subset(data_name,  day != "10d")
  
  if(c_LB == "wLB") {
    uds_dataDay1032_1 <-subset(uds_dataDay1032_0, abundance2 > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    Day1032_each<-subset(uds_dataDay1032_1, treatment==treat)[,c(-1,-2,-3,-77,-78,-79,-80)]
    uds_dataDay1060_1 <-subset(uds_dataDay1060_0, abundance2 > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    Day1060_each<-subset(uds_dataDay1060_1, treatment==treat)[,c(-1,-2,-3,-77,-78,-79,-80)]
    uds_dataDay3260_1 <-subset(uds_dataDay3260_0, abundance2 > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    Day3260_each<-subset(uds_dataDay3260_1, treatment==treat)[,c(-1,-2,-3,-77,-78,-79,-80)]
  }  #When leaf beele is included
  if(c_LB == "woLB") {
    uds_dataDay1032_1 <-subset(uds_dataDay1032_0, abundance2 > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    Day1032_each<-subset(uds_dataDay1032_1, treatment==treat)[,c(-1,-2,-3,-4,-77,-78,-79,-80)]
    uds_dataDay1060_1 <-subset(uds_dataDay1060_0, abundance2 > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    Day1060_each<-subset(uds_dataDay1060_1, treatment==treat)[,c(-1,-2,-3,-4,-77,-78,-79,-80)]
    uds_dataDay3260_1 <-subset(uds_dataDay3260_0, abundance2 > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    Day3260_each<-subset(uds_dataDay3260_1, treatment==treat)[,c(-1,-2,-3,-4,-77,-78,-79,-80)]
  }  #When leaf beele is NOTincluded
  
  sample_1032 <- subset(uds_dataDay1032_1, treatment==treat)$sample
  sample_1060 <- subset(uds_dataDay1060_1, treatment==treat)$sample
  sample_3260 <- subset(uds_dataDay3260_1, treatment==treat)$sample

  Day1032_each.d<-vegdist(Day1032_each, method=meth)
  Day1060_each.d<-vegdist(Day1060_each, method=meth)
  Day3260_each.d<-vegdist(Day3260_each, method=meth)
  
  Day1032_dist_each <-betadisper(Day1032_each.d, sample_1032, type="median", bias.adjust = TRUE)
  Day1060_dist_each <-betadisper(Day1060_each.d, sample_1060, type="median", bias.adjust = TRUE)
  Day3260_dist_each <-betadisper(Day3260_each.d, sample_3260, type="median", bias.adjust = TRUE)

  Day1032_median <- data.frame(Day1032_dist_each$centroids)  #calculate the centroid (spatial median) for repeasted measures
  Day1060_median <- data.frame(Day1060_dist_each$centroids)  #calculate the centroid (spatial median) for repeasted measures
  Day3260_median <- data.frame(Day3260_dist_each$centroids)  #calculate the centroid (spatial median) for repeasted measures
  
  Day1032_sample <- row.names(Day1032_median)
  Day1060_sample <- row.names(Day1060_median)
  Day3260_sample <- row.names(Day3260_median)
  
  #Replace the sample name into the day
  Day1032_sample[grep("^1", Day1032_sample)]<- "day10"
  Day1032_sample[grep("^2", Day1032_sample)]<- "day32"
  day_Day1032 <- as.factor(Day1032_sample) #just conversion
  Day1060_sample[grep("^1", Day1060_sample)]<- "day10"
  Day1060_sample[grep("^3", Day1060_sample)]<- "day60"
  day_Day1060 <- as.factor(Day1060_sample) #just conversion
  Day3260_sample[grep("^2", Day3260_sample)]<- "day32"
  Day3260_sample[grep("^3", Day3260_sample)]<- "day60"
  day_Day3260 <- as.factor(Day3260_sample) #just conversion

  adonis_resultDay1032<-adonis(Day1032_median ~ day_Day1032, method="euclidian", permutations=9999)
  adonis_resultDay1060<-adonis(Day1060_median ~ day_Day1060, method="euclidian", permutations=9999)
  adonis_resultDay3260<-adonis(Day3260_median ~ day_Day3260, method="euclidian", permutations=9999)
  
  p_list <- c(adonis_resultDay1032$aov$Pr[1], adonis_resultDay1060$aov$Pr[1], adonis_resultDay3260$aov$Pr[1])
  
  
  pairwise_adj<-p.adjust(p_list, method = adj , n = length(p_list))
  
  cat("Pairwise comparision by permutation, adjusted by")
  print(adj)
  cat("The adjusted  P-value for day10 vs day32 was\n")
  print(pairwise_adj[1])
  cat("The adjusted  P-value for day10 vs day60 was\n")
  print(pairwise_adj[2])
  cat("The adjusted  P-value for day32 vs day60 was\n")
  print(pairwise_adj[3])
}


#///PERMDISP or each date, based on the spatial median for repeated measures
disper_DAY_centroid <- function(data_name, treat, c_LB, meth, adj=NULL) {
  
  #resolving inconsistency of the symbols to represent the treatments (and chamber)
  if(treat == "U") treat <- "N"
  else if(treat == "E") treat <- "T"
  else if(treat == "D") treat <- "W"
  else if(treat == "S") treat <- "T"
  
  if(c_LB == "wLB") {
    uds_data1 <-subset(data_name, abundance > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    uds_each<-subset(uds_data1, treatment==treat)[,c(-1,-2,-3, -77,-78, -79,-80)]
  }  #When leaf beele is included
  if(c_LB == "woLB") {
    uds_data1 <-subset(data_name, abundance2 > 0) #OR, delete the sampling when species other than leaf beetle does not exist
    uds_each<-subset(uds_data1, treatment==treat)[,c(-1,-2,-3,-4,-77,-78,-79,-80)]
  }  #When leaf beele is NOTincluded
  if(c_LB == "LBonly") {
    uds_data1 <- subset(data_name, abundance2 > 0)
    uds_each <- subset(uds_data1, treatment==treat)[, c(4)]  #picking up LB only
  }
  
  sample_each <- subset(uds_data1, treatment==treat)$sample
  day_each <- subset(uds_data1, treatment==treat)$day
  
  
  uds_bray_each0.d<-vegdist(uds_each, method=meth)
  if(c_LB == "LBonly") tp <- "centroid"
  else tp <- "median"
  uds_dist_each0 <-betadisper(uds_bray_each0.d, sample_each, type=tp, bias.adjust = TRUE)
  uds_median <- data.frame(uds_dist_each0$centroids)  #calculate the centroid (spatial median) for repeasted measures
  
  sample <- row.names(uds_median)
  
  #Replace the sample name into the date
  sample[grep("^1", sample)]<- "day10"
  sample[grep("^2", sample)]<- "day32"
  sample[grep("^3", sample)]<- "day60"
  
  day_each <- as.factor(sample) #just conversion
  
  #treatment_each
  uds_each.d<-vegdist(uds_median, method="euclidean")
  uds_dist_each <-betadisper(uds_each.d, day_each, type="centroid", bias.adjust = TRUE)  #Choose centroid becasue of euclidean distance
  #Plot
  if(c_LB == "LBonly") boxplot(uds_dist_each)
  else {
    boxplot(uds_dist_each)
    ordilabel(scores(uds_dist_each, "centroids"))
  }
  #PERDISP & ANOVA & MULTIPLE COMPARISON
  #anova_dist <- anova(uds_dist_each)
  #TukeyHSD(uds_dist_each, which = "group", ordered = FALSE, conf.levels = 0.95)
  
  #PERDIPST & permutation 
  perm_result <- permutest(uds_dist_each, pairwise=TRUE, permutations=9999)
  #perm_result
  
  #print (anova_dist$Pr[1]) 
  cat("Target treatment was\n")
  print(treat)
 
  print(uds_dist_each)
  print(perm_result)
  #In fact, the adjustment is not necessary because permutest.betadisper does not repeat permutation for each pair
  if(!is.null(adj)) {
    pairwise_adj<-p.adjust(perm_result$pairwise$permuted, method = adj, n = length(perm_result$pairwise$permuted))
    cat("Pairwise comparision by permutation, adjusted by")
    print(as.character(adj))
    print(pairwise_adj[1])
    print(pairwise_adj[2])
    print(pairwise_adj[3])
  }
  
  #TukeyHSD(uds_dist_each)
  
}

#####For PERMDISP: comparison between chambers and treatments (Fig.2a)

#Temporal variability in beta diversity for manuscript
disper_DAY_centroid(data_name=uds_data_all_day2, treat="U", c_LB="woLB", meth="chao")
 警告:  some squared distances are negative and changed to zero
Target treatment was
[1] "N"

    Homogeneity of multivariate dispersions

Call: betadisper(d = uds_each.d, group = day_each, type = "centroid", bias.adjust = TRUE)

No. of Positive Eigenvalues: 32
No. of Negative Eigenvalues: 0

Average distance to centroid:
 day10  day32  day60 
0.7089 0.6904 0.5292 

Eigenvalues for PCoA axes:
(Showing 8 of 32 eigenvalues)
PCoA1 PCoA2 PCoA3 PCoA4 PCoA5 PCoA6 PCoA7 PCoA8 
2.881 2.155 1.684 1.528 1.387 1.347 1.037 1.003 

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df  Sum Sq  Mean Sq      F N.Perm Pr(>F)   
Groups     2 0.23186 0.115929 7.1717   9999 0.0024 **
Residuals 36 0.58193 0.016165                        
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
          day10     day32  day60
day10           0.4429000 0.0065
day32 0.4385478           0.0163
day60 0.0068012 0.0161265       

disper_DAY_centroid(data_name=uds_data_all_day2, treat="S", c_LB="woLB", meth="chao")
 警告:  some squared distances are negative and changed to zero
Target treatment was
[1] "T"

    Homogeneity of multivariate dispersions

Call: betadisper(d = uds_each.d, group = day_each, type = "centroid", bias.adjust = TRUE)

No. of Positive Eigenvalues: 35
No. of Negative Eigenvalues: 0

Average distance to centroid:
 day10  day32  day60 
0.6462 0.6452 0.6937 

Eigenvalues for PCoA axes:
(Showing 8 of 35 eigenvalues)
 PCoA1  PCoA2  PCoA3  PCoA4  PCoA5  PCoA6  PCoA7  PCoA8 
2.9445 2.0693 1.7712 1.4165 1.3933 1.1933 0.9916 0.8363 

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df  Sum Sq  Mean Sq      F N.Perm Pr(>F)
Groups     2 0.02078 0.010389 1.1044   9999 0.3316
Residuals 36 0.33865 0.009407                     

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
        day10   day32  day60
day10         0.98260 0.2935
day32 0.98237         0.1310
day60 0.30142 0.13155       

disper_DAY_centroid(data_name=uds_data_all_day2, treat="D", c_LB="woLB", meth="chao")
 警告:  some squared distances are negative and changed to zero
Target treatment was
[1] "W"

    Homogeneity of multivariate dispersions

Call: betadisper(d = uds_each.d, group = day_each, type = "centroid", bias.adjust = TRUE)

No. of Positive Eigenvalues: 38
No. of Negative Eigenvalues: 0

Average distance to centroid:
 day10  day32  day60 
0.6880 0.6697 0.6604 

Eigenvalues for PCoA axes:
(Showing 8 of 38 eigenvalues)
 PCoA1  PCoA2  PCoA3  PCoA4  PCoA5  PCoA6  PCoA7  PCoA8 
2.8219 2.1875 2.0501 1.6154 1.2362 1.0316 0.9482 0.8815 

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df  Sum Sq   Mean Sq      F N.Perm Pr(>F)
Groups     2 0.00529 0.0026448 0.3821   9999 0.6883
Residuals 40 0.27685 0.0069213                     

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
        day10   day32  day60
day10         0.51180 0.3856
day32 0.50939         0.7932
day60 0.38878 0.78578       

For PERMANOVA (Fig.2b)
#Results from 2-3 times measurement in 10d, 32d, and 60d without leaf beetle through spatial median
#With the recommended measure (Chao index) (for Fig.2b)
disper_uds_centroid(data_name=uds_data_all_day2, date="10d", c_LB="woLB", meth="chao")

Sampling day was
[1] "10d"
Comparison between chambers

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df   Sum Sq   Mean Sq      F N.Perm Pr(>F)
Groups     1 0.001891 0.0018907 0.6307   9999 0.4249
Residuals 34 0.101927 0.0029979                     
Comparison between treatments

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df   Sum Sq   Mean Sq     F N.Perm Pr(>F)
Groups     2 0.015571 0.0077853 1.599   9999 0.2128
Residuals 33 0.160670 0.0048688                    

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
        D       S      U
D         0.17600 0.8996
S 0.17609         0.1955
U 0.90043 0.19124       

disper_uds_centroid(data_name=uds_data_all_day2, date="32d", c_LB="woLB", meth="chao")
 警告:  some squared distances are negative and changed to zero

Sampling day was
[1] "32d"
Comparison between chambers

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df   Sum Sq   Mean Sq      F N.Perm Pr(>F)
Groups     1 0.002424 0.0024237 0.4006   9999 0.5329
Residuals 44 0.266220 0.0060504                     
Comparison between treatments

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df  Sum Sq   Mean Sq      F N.Perm Pr(>F)
Groups     2 0.01282 0.0064087 0.7447   9999 0.4736
Residuals 43 0.37004 0.0086056                     

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
        D       S      U
D         0.64410 0.4333
S 0.64677         0.2309
U 0.43762 0.22977       

disper_uds_centroid(data_name=uds_data_all_day2, date="60d", c_LB="woLB", meth="chao")
 警告:  some squared distances are negative and changed to zero

Sampling day was
[1] "60d"
Comparison between chambers

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df  Sum Sq  Mean Sq      F N.Perm Pr(>F)   
Groups     1 0.15801 0.158009 7.9115   9999 0.0079 **
Residuals 37 0.73897 0.019972                        
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Comparison between treatments

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df  Sum Sq  Mean Sq      F N.Perm Pr(>F)  
Groups     2 0.15157 0.075784 3.6986   9999 0.0324 *
Residuals 36 0.73764 0.020490                       
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
         D        S      U
D          0.434700 0.0852
S 0.432947          0.0289
U 0.084784 0.027949       

PERMANOVA (for Supplementary Material)
com_div_uds_centroid(data_name=uds_data_all_day2, date="10d", c_LB="woLB", meth="chao", adj="holm")

Call:
adonis(formula = uds_median ~ chamber_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)
chamber_each  1    0.2694 0.26937 0.55504 0.01606 0.9468
Residuals    34   16.5006 0.48531         0.98394       
Total        35   16.7699                 1.00000       

Call:
adonis(formula = uds_median ~ treatment_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

               Df SumsOfSqs MeanSqs F.Model    R2 Pr(>F)
treatment_each  2    0.7546 0.37732 0.77748 0.045 0.8075
Residuals      33   16.0153 0.48531         0.955       
Total          35   16.7699                 1.000       
The pairwise PERMANOVA (adonis) analysis:
The comparision between D and S is:

Call:
adonis(formula = DS_median ~ treatment_DS, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)
treatment_DS  1    0.4758 0.47578  1.0316 0.04905 0.3875
Residuals    20    9.2242 0.46121         0.95095       
Total        21    9.7000                 1.00000       
com_div_uds_centroid(data_name=uds_data_all_day2, date="32d", c_LB="woLB", meth="chao", adj="holm")
 警告:  some squared distances are negative and changed to zero

Call:
adonis(formula = uds_median ~ chamber_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)
chamber_each  1    0.4108 0.41082 0.80329 0.01793 0.6873
Residuals    44   22.5024 0.51142         0.98207       
Total        45   22.9132                 1.00000       

Call:
adonis(formula = uds_median ~ treatment_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

               Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)  
treatment_each  2    1.5462 0.77311  1.5558 0.06748  0.031 *
Residuals      43   21.3670 0.49691         0.93252         
Total          45   22.9132                 1.00000         
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
The pairwise PERMANOVA (adonis) analysis:
 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero
The comparision between D and S is:

Call:
adonis(formula = DS_median ~ treatment_DS, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)   
treatment_DS  1    1.1096 1.10957  2.4132 0.07445 0.0052 **
Residuals    30   13.7936 0.45979         0.92555          
Total        31   14.9031                 1.00000          
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
com_div_uds_centroid(data_name=uds_data_all_day2, date="60d", c_LB="woLB", meth="chao", adj="holm")
 警告:  some squared distances are negative and changed to zero

Call:
adonis(formula = uds_median ~ chamber_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)  
chamber_each  1    0.8018 0.80177  1.8611 0.04789 0.0397 *
Residuals    37   15.9400 0.43081         0.95211         
Total        38   16.7418                 1.00000         
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Call:
adonis(formula = uds_median ~ treatment_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

               Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)  
treatment_each  2     1.468 0.73398    1.73 0.08768 0.0218 *
Residuals      36    15.274 0.42427         0.91232         
Total          38    16.742                 1.00000         
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
The pairwise PERMANOVA (adonis) analysis:
 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero
The comparision between D and S is:

Call:
adonis(formula = DS_median ~ treatment_DS, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)
treatment_DS  1    0.6575 0.65750  1.4895 0.05418 0.1079
Residuals    26   11.4773 0.44144         0.94582       
Total        27   12.1348                 1.00000       

Summary for the statistical tests on Figure 2

  • Dispersion with time
    • Dispersion of U (Chamber 1) decreased with time (day10=day32, but day10 > day60)
    • No differences in dispersion bet. dates in S(E) and D treatments
  • Dispersion between chambers and treatment
    • Dispersion of U (Chamber 1) was smaller than chamber 2 (D+S) at 60d (P=0.0075).
    • No differences in dispersion bet. S(E) and D treatments at 60d
  • PERMANOVA (with PERMDISP) results tell that:
    • the centroid community composition was not different between U vs (D + S) (no chamber effects).
    • the difference between D and E at 32d (F = 2.4132, df=2, P = 0.0036)
  • Temporal dynamics of centroid within each treatment
    • For all U, D, and E, all pairwise PERMANOVA resulted in P < 0.001
    • But due to heterogeneous dispersion day10 day32 > day60 for U, we cannot conclude the centroid of U at day 60 is difference from day 10 not day 32.

Statistical tests for Figure S1

For PERMDISP: comparision between chambers and treatments with bray-curtis measure
com_div_DAY_centroid(data_name=uds_data_all_day2, treat="N", c_LB="woLB", meth="chao", adj="holm")
 警告:  some squared distances are negative and changed to zero

Call:
adonis(formula = uds_median ~ day_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

          Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)    
day_each   2     3.028 1.51401  3.3933 0.15862  1e-04 ***
Residuals 36    16.062 0.44617         0.84138           
Total     38    19.090                 1.00000           
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
The pairwise PERMANOVA (adonis) analysis:
 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero
Pairwise comparision by permutation, adjusted by[1] "holm"
The adjusted  P-value for day10 vs day32 was
[1] 0.0019
The adjusted  P-value for day10 vs day60 was
[1] 3e-04
The adjusted  P-value for day32 vs day60 was
[1] 3e-04
com_div_DAY_centroid(data_name=uds_data_all_day2, treat="T", c_LB="woLB", meth="chao", adj="holm")
 警告:  some squared distances are negative and changed to zero

Call:
adonis(formula = uds_median ~ day_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

          Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)    
day_each   2    2.8635 1.43177  3.1913 0.15059  1e-04 ***
Residuals 36   16.1514 0.44865         0.84941           
Total     38   19.0149                 1.00000           
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
The pairwise PERMANOVA (adonis) analysis:
 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero
Pairwise comparision by permutation, adjusted by[1] "holm"
The adjusted  P-value for day10 vs day32 was
[1] 3e-04
The adjusted  P-value for day10 vs day60 was
[1] 0.0016
The adjusted  P-value for day32 vs day60 was
[1] 3e-04
com_div_DAY_centroid(data_name=uds_data_all_day2, treat="W", c_LB="woLB", meth="chao", adj="holm")
 警告:  some squared distances are negative and changed to zero

Call:
adonis(formula = uds_median ~ day_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

          Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)    
day_each   2    2.3439 1.17194  2.5569 0.11335  1e-04 ***
Residuals 40   18.3339 0.45835         0.88665           
Total     42   20.6778                 1.00000           
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
The pairwise PERMANOVA (adonis) analysis:
 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero
Pairwise comparision by permutation, adjusted by[1] "holm"
The adjusted  P-value for day10 vs day32 was
[1] 9e-04
The adjusted  P-value for day10 vs day60 was
[1] 9e-04
The adjusted  P-value for day32 vs day60 was
[1] 0.0035
For PERMANOVA: comparision between chambers and treatments with bray-curtis measure
disper_uds_centroid(data_name=uds_data_all_day2, date="10d", c_LB="woLB", meth="bray")

Sampling day was
[1] "10d"
Comparison between chambers

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df   Sum Sq   Mean Sq      F N.Perm Pr(>F)
Groups     1 0.006804 0.0068039 1.9548   9999 0.1736
Residuals 34 0.118340 0.0034806                     
Comparison between treatments

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df   Sum Sq   Mean Sq      F N.Perm Pr(>F)
Groups     2 0.017357 0.0086784 1.9915   9999 0.1473
Residuals 33 0.143806 0.0043578                     

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
        D       S      U
D         0.19600 0.5771
S 0.19320         0.1024
U 0.56666 0.10418       

disper_uds_centroid(data_name=uds_data_all_day2, date="32d", c_LB="woLB", meth="bray")
 警告:  some squared distances are negative and changed to zero

Sampling day was
[1] "32d"
Comparison between chambers

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df   Sum Sq   Mean Sq      F N.Perm Pr(>F)
Groups     1 0.006626 0.0066260 1.0004   9999 0.3207
Residuals 44 0.291426 0.0066233                     
Comparison between treatments

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df  Sum Sq   Mean Sq      F N.Perm Pr(>F)
Groups     2 0.03321 0.0166063 1.9505   9999 0.1571
Residuals 43 0.36609 0.0085137                     

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
         D        S      U
D          0.224300 0.4531
S 0.223032          0.0832
U 0.453786 0.080459       

disper_uds_centroid(data_name=uds_data_all_day2, date="60d", c_LB="woLB", meth="bray")
 警告:  some squared distances are negative and changed to zero

Sampling day was
[1] "60d"
Comparison between chambers

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df  Sum Sq  Mean Sq      F N.Perm Pr(>F)  
Groups     1 0.15997 0.159968 6.6985   9999 0.0139 *
Residuals 37 0.88360 0.023881                       
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Comparison between treatments

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df  Sum Sq  Mean Sq      F N.Perm Pr(>F)  
Groups     2 0.15006 0.075028 3.1041   9999 0.0558 .
Residuals 36 0.87015 0.024171                       
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
         D        S      U
D          0.662300 0.0904
S 0.665325          0.0440
U 0.089952 0.043258       

For PERMDISP: comparision between chambers and treatments with Chao measure but with leaf beetle
com_div_uds_centroid(data_name=uds_data_all_day2, date="10d", c_LB="woLB", meth="bray", adj="holm")

Call:
adonis(formula = uds_median ~ chamber_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)
chamber_each  1    0.3591 0.35914 0.70982 0.02045 0.8327
Residuals    34   17.2023 0.50595         0.97955       
Total        35   17.5615                 1.00000       

Call:
adonis(formula = uds_median ~ treatment_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

               Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)
treatment_each  2    0.8157 0.40785 0.80373 0.04645   0.81
Residuals      33   16.7458 0.50745         0.95355       
Total          35   17.5615                 1.00000       
The pairwise PERMANOVA (adonis) analysis:
The comparision between D and S is:

Call:
adonis(formula = DS_median ~ treatment_DS, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)
treatment_DS  1    0.4289 0.42887 0.91093 0.04356 0.5466
Residuals    20    9.4161 0.47080         0.95644       
Total        21    9.8449                 1.00000       
com_div_uds_centroid(data_name=uds_data_all_day2, date="32d", c_LB="woLB", meth="bray", adj="holm")
 警告:  some squared distances are negative and changed to zero

Call:
adonis(formula = uds_median ~ chamber_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)
chamber_each  1    0.4391 0.43915 0.83573 0.01864 0.6478
Residuals    44   23.1206 0.52547         0.98136       
Total        45   23.5597                 1.00000       

Call:
adonis(formula = uds_median ~ treatment_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

               Df SumsOfSqs MeanSqs F.Model     R2 Pr(>F)  
treatment_each  2    1.6115 0.80577  1.5786 0.0684 0.0244 *
Residuals      43   21.9482 0.51042         0.9316         
Total          45   23.5597                 1.0000         
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
The pairwise PERMANOVA (adonis) analysis:
 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero
The comparision between D and S is:

Call:
adonis(formula = DS_median ~ treatment_DS, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model     R2 Pr(>F)   
treatment_DS  1    1.1362 1.13619  2.4501 0.0755 0.0033 **
Residuals    30   13.9117 0.46372         0.9245          
Total        31   15.0479                 1.0000          
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
com_div_uds_centroid(data_name=uds_data_all_day2, date="60d", c_LB="woLB", meth="bray", adj="holm")
 警告:  some squared distances are negative and changed to zero

Call:
adonis(formula = uds_median ~ chamber_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)  
chamber_each  1    0.8212 0.82119  1.7852 0.04603 0.0472 *
Residuals    37   17.0200 0.46000         0.95397         
Total        38   17.8412                 1.00000         
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Call:
adonis(formula = uds_median ~ treatment_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

               Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)  
treatment_each  2    1.5345 0.76726  1.6939 0.08601 0.0255 *
Residuals      36   16.3066 0.45296         0.91399         
Total          38   17.8412                 1.00000         
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
The pairwise PERMANOVA (adonis) analysis:
 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero
The comparision between D and S is:

Call:
adonis(formula = DS_median ~ treatment_DS, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)  
treatment_DS  1    0.7021 0.70206  1.5148 0.05506 0.0958 .
Residuals    26   12.0498 0.46345         0.94494         
Total        27   12.7519                 1.00000         
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
For PERMANOVA: comparision between chambers and treatments with bray-curtis measure
disper_uds_centroid(data_name=uds_data_all_day2, date="10d", c_LB="wLB", meth="chao")

Sampling day was
[1] "10d"
Comparison between chambers

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df  Sum Sq  Mean Sq      F N.Perm Pr(>F)
Groups     1 0.00423 0.004225 0.0875   9999 0.7699
Residuals 42 2.02866 0.048301                     
Comparison between treatments

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df  Sum Sq  Mean Sq      F N.Perm Pr(>F)   
Groups     2 0.52667 0.263337 6.4684   9999 0.0042 **
Residuals 41 1.66917 0.040712                        
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
          D         S      U
D           0.0026000 0.1386
S 0.0014055           0.0463
U 0.1382685 0.0443417       

disper_uds_centroid(data_name=uds_data_all_day2, date="32d", c_LB="wLB", meth="chao")
 警告:  some squared distances are negative and changed to zero

Sampling day was
[1] "32d"
Comparison between chambers

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df  Sum Sq  Mean Sq      F N.Perm Pr(>F)
Groups     1 0.04387 0.043871 1.8568   9999  0.176
Residuals 46 1.08683 0.023627                     
Comparison between treatments

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df  Sum Sq  Mean Sq      F N.Perm Pr(>F)
Groups     2 0.03582 0.017910 0.7201   9999 0.4965
Residuals 45 1.11917 0.024871                     

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
        D       S      U
D         0.62540 0.5226
S 0.62872         0.2060
U 0.52614 0.20338       

disper_uds_centroid(data_name=uds_data_all_day2, date="60d", c_LB="wLB", meth="chao")
 警告:  some squared distances are negative and changed to zero

Sampling day was
[1] "60d"
Comparison between chambers

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df  Sum Sq  Mean Sq      F N.Perm Pr(>F)  
Groups     1 0.09148 0.091485 6.4648   9999 0.0169 *
Residuals 41 0.58020 0.014151                       
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Comparison between treatments

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 9999

Response: Distances
          Df  Sum Sq  Mean Sq      F N.Perm Pr(>F)  
Groups     2 0.08619 0.043094 2.8724   9999 0.0737 .
Residuals 40 0.60010 0.015003                       
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
         D        S      U
D          0.606000 0.1055
S 0.606209          0.0581
U 0.107893 0.050774       

Temporal divergence on each willow tree (Decided not to present)

Preparation of functions to calculate/visualize temporal divergence

com_div_uds_centroid(data_name=uds_data_all_day2, date="10d", c_LB="wLB", meth="chao", adj="holm")

Call:
adonis(formula = uds_median ~ chamber_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)
chamber_each  1    0.1711 0.17113 0.45554 0.01073 0.9935
Residuals    42   15.7776 0.37566         0.98927       
Total        43   15.9487                 1.00000       

Call:
adonis(formula = uds_median ~ treatment_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

               Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)
treatment_each  2    0.7672 0.38361   1.036 0.04811 0.3699
Residuals      41   15.1815 0.37028         0.95189       
Total          43   15.9487                 1.00000       
The pairwise PERMANOVA (adonis) analysis:
The comparision between D and S is:

Call:
adonis(formula = DS_median ~ treatment_DS, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)  
treatment_DS  1    0.5947 0.59473  1.7606 0.06342 0.0572 .
Residuals    26    8.7825 0.33779         0.93658         
Total        27    9.3772                 1.00000         
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
com_div_uds_centroid(data_name=uds_data_all_day2, date="32d", c_LB="wLB", meth="chao", adj="holm")
 警告:  some squared distances are negative and changed to zero

Call:
adonis(formula = uds_median ~ chamber_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)
chamber_each  1    0.3734 0.37342 0.91069 0.01941 0.4693
Residuals    46   18.8616 0.41003         0.98059       
Total        47   19.2350                 1.00000       

Call:
adonis(formula = uds_median ~ treatment_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

               Df SumsOfSqs MeanSqs F.Model     R2 Pr(>F)  
treatment_each  2    1.1599 0.57994  1.4438 0.0603 0.0904 .
Residuals      45   18.0751 0.40167         0.9397         
Total          47   19.2350                 1.0000         
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
The pairwise PERMANOVA (adonis) analysis:
 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero
The comparision between D and S is:

Call:
adonis(formula = DS_median ~ treatment_DS, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model     R2 Pr(>F)  
treatment_DS  1    0.7938 0.79381  1.9693 0.0616 0.0474 *
Residuals    30   12.0926 0.40309         0.9384         
Total        31   12.8864                 1.0000         
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
com_div_uds_centroid(data_name=uds_data_all_day2, date="60d", c_LB="wLB", meth="chao", adj="holm")
 警告:  some squared distances are negative and changed to zero

Call:
adonis(formula = uds_median ~ chamber_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)  
chamber_each  1     0.699 0.69904  1.5518 0.03647 0.0877 .
Residuals    41    18.469 0.45047         0.96353         
Total        42    19.168                 1.00000         
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Call:
adonis(formula = uds_median ~ treatment_each, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

               Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)  
treatment_each  2    1.3211 0.66053  1.4804 0.06892 0.0596 .
Residuals      40   17.8472 0.44618         0.93108         
Total          42   19.1683                 1.00000         
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
The pairwise PERMANOVA (adonis) analysis:
 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero 警告:  some squared distances are negative and changed to zero
The comparision between D and S is:

Call:
adonis(formula = DS_median ~ treatment_DS, permutations = 9999,      method = "euclidean") 

Permutation: free
Number of permutations: 9999

Terms added sequentially (first to last)

             Df SumsOfSqs MeanSqs F.Model      R2 Pr(>F)
treatment_DS  1    0.6081 0.60811  1.3234 0.04513 0.1711
Residuals    28   12.8664 0.45952         0.95487       
Total        29   13.4745                 1.00000       

####Calculate/Visualize within day turnover (which is not used in the manuscript)

turnover_comparison_short <- function(data_name, date, c_LB, meth, output = NULL)
{
 
 #data_name <- uds_data_all_day2
 #date <- "10d"
 #meth<-"chao"
 #date <- "10d","32d", or "60d", or any
 if(c_LB == "wLB") {
   uds_data1 <-subset(data_name, abundance > 0)  #delete the sampling data with 0 total abundance when leaf beetle
   uds_data2 <-subset(uds_data1, day==date)
   uds_each<-uds_data2[,c(-1,-2,-3, -77,-78, -79,-80)]
 }  #When leaf beetle is included
 if(c_LB == "woLB") {
   uds_data1 <-subset(data_name, abundance2 > 0) #OR, delete the sampling when species other than leaf beetle does not exist
   uds_data2 <-subset(uds_data1, day==date)
   uds_each<-uds_data2[,c(-1,-2,-3,-4,-77,-78,-79,-80)]
 }  #When leaf beetle is NOT included
 
 sample_each <- subset(uds_data1, day==date)$sample
 treatment_each <- subset(uds_data1, day==date)$treatment
 chamber_each <- subset(uds_data1, day==date)$chamber
 #View(chamber_each)
 time_each <- subset(uds_data1, day==date)$time
 
 #prepare dummy vectors
 sample_n <- NULL
 distance_n <-NULL
 treatment_n <-NULL
 chamber_n <-NULL
 timei_n <-NULL
 timej_n <-NULL
 
 #calculate distance between 1P, 2P, and 3P
 for(i in 1:(length(sample_each) - 1)) {
   for(j in (i + 1): length(sample_each)) {
     if(sample_each[i] == sample_each[j]) {
       sample_n <- append(sample_n, as.character(sample_each[i]))
       distance_n <- append(distance_n, as.numeric(vegdist(rbind(uds_each[i,], uds_each[j,])), method=meth))
       treatment_n <-append(treatment_n, as.character(treatment_each[i]))
       chamber_n <- append(chamber_n, as.character(chamber_each[i]))
       timei_n <-append(timei_n, as.character(time_each[i]))
       timej_n <-append(timej_n, as.character(time_each[j]))
     }
    }
 }
 turnover<- data.frame(sample=sample_n, distance=distance_n, treatment=treatment_n, chamber=chamber_n, timei=timei_n, timej=timej_n)

 turnover2 <-subset(turnover, !(timei == "1P" & timej=="3P"))  #exclude the combination of 1P & 3P (redundant)
 
 #turnoverN <- subset(turnover2, treatment=="N")  #separate data by treatment
 turnoverT <- subset(turnover2, treatment=="T")  #separate data by treatment
 turnoverW <- subset(turnover2, treatment=="W")  #separate data by treatment
 turnoverC1 <- subset(turnover2, chamber=="C1") #separate data by chamber
 turnoverC2 <- subset(turnover2, chamber=="C2") #separate data by chamber
 
 #calculate average of 1P vs 2P & 2P vs 3P if any
 #average_turnoverN<-by(as.numeric(turnoverN$distance), turnoverN$sample, mean)
 average_turnoverT<-by(as.numeric(turnoverT$distance), turnoverT$sample, mean)
 average_turnoverW<-by(as.numeric(turnoverW$distance), turnoverW$sample, mean)
 average_turnoverC1<-by(as.numeric(turnoverC1$distance), turnoverC1$sample, mean)
 average_turnoverC2<-by(as.numeric(turnoverC2$distance), turnoverC2$sample, mean)

 #average_N<-subset(average_turnoverN, average_turnoverN>=0)
 average_T<-subset(average_turnoverT, average_turnoverT>=0)
 average_W<-subset(average_turnoverW, average_turnoverW>=0)
 average_C1<-subset(average_turnoverC1, average_turnoverC1>=0)
 average_C2<-subset(average_turnoverC2, average_turnoverC2>=0)
 
 length(average_T)
 #trN<-NULL
 trT<-NULL
 trW<-NULL
 trC1<-NULL
 trC2<-NULL
 #for(i in 1:length(average_N)) trN <-append(trN, "N")
 for(i in 1:length(average_T)) trT <-append(trT, "E")
 for(i in 1:length(average_W)) trW <-append(trW, "D")
 for(i in 1:length(average_C1)) trC1 <-append(trC1, "C1")
 for(i in 1:length(average_C2)) trC2 <-append(trC2, "C2")
 
 #av_N<-data.frame(treatment=trN, distance=average_N)
 av_T<-data.frame(treatment=trT, distance=average_T)
 av_W<-data.frame(treatment=trW, distance=average_W)
 av_C1<-data.frame(chamber=trC1, distance=average_C1)
 av_C2<-data.frame(chamber=trC2, distance=average_C2)
 
 #summary dataframe
 turnover_short <- rbind.data.frame(av_T, av_W)
 turnover_shortC <- rbind.data.frame(av_C1, av_C2)
 
 #print(turnover_shortC$distance)
 #View(turnover_shortC)
 #View(turnover_short)
 #print(distance_n)
 
 g_box<-ggplot(turnover_shortC, aes(y=distance, x=chamber))
 g_box<-g_box + geom_violin()
 g_box<-g_box + geom_boxplot(width=0.1) 
 g_box<-g_box + coord_fixed(ratio = 5/1) + coord_cartesian(ylim = c(0, 1))
 print(g_box)
 g_box2<-ggplot(turnover_short, aes(y=distance, x=treatment))
 g_box2<-g_box2 + geom_violin()
 g_box2<-g_box2 + geom_boxplot(width=0.1) 
 g_box2<-g_box2 + coord_fixed(ratio = 5/1) + coord_cartesian(ylim = c(0, 1))
 print(g_box2)
 
 #plotmeans(turnover_shortC$distance~turnover_shortC$chamber)
 #plotmeans(turnover_short$distance~turnover_short$treatment)

 print(bartlett.test(turnover_shortC$distance~turnover_shortC$chamber))
 #One-way ANOVA with unequal-variance
 print(oneway.test(turnover_shortC$distance~turnover_shortC$chamber,var.equal=FALSE)) 
 
 print(bartlett.test(turnover_short$distance~turnover_short$treatment))
 #One-way ANOVA with unequal-variance
 print(oneway.test(turnover_short$distance~turnover_short$treatment,var.equal=FALSE))
 #Pairwise comparison with Welch's t test
 #print(pairwise.t.test(turnover_short$distance, turnover_short$treatment, p.adj="holm"))
 
 #if(output==TRUE) return(turnover_short)
 
}  

turnover_comparison_long <- function(data_name, from_date, c_LB, meth="chao", output = NULL)
{
  
  if(c_LB == "wLB") {
    uds_data1 <-subset(data_name, abundance > 0)  #delete the sampling data with 0 total abundance when leaf beetle
    uds_each<-uds_data1[,c(-1,-2,-3, -77,-78,-79,-80)]
  }  #When leaf beetle is included
  if(c_LB == "woLB") {
    uds_data1 <-subset(data_name, abundance2 > 0) #OR, delete the sampling when species other than leaf beetle does not exist
    uds_each<-uds_data1[,c(-1,-2,-3,-4,-77,-78,-79,-80)]
  }  #When leaf beetle is NOT included
  
  sample_each <- uds_data1$sample
  chamber_each <- uds_data1$chamber
  treatment_each <- uds_data1$treatment
  time_each <- uds_data1$time
  
  uds_time.d<-vegdist(uds_each, method=meth)
  uds_dist_time <-betadisper(uds_time.d, sample_each, type="median", bias.adjust = TRUE)
  
  uds_day.median <- data.frame(uds_dist_time$centroids)  #calculate the centroid (spatial median) for repeated measures
 
  #Replace the sample name into the treatment & day 
  sample0 <- row.names(uds_day.median)
  sample1 <- sample0
  sample2 <- sample0
  sample3 <- sample0
 
  sample0<-gsub("1n", "n", sample0)
  sample0<-gsub("2n", "n", sample0)
  sample0<-gsub("3n", "n", sample0)
  sample0<-gsub("1t", "t", sample0)
  sample0<-gsub("2t", "t", sample0)
  sample0<-gsub("3t", "t", sample0)
  sample0<-gsub("1w", "w", sample0)
  sample0<-gsub("2w", "w", sample0)
  sample0<-gsub("3w", "w", sample0)
  
  sample1[grep("n", sample1)]<- "C1"
  sample1[grep("t", sample1)]<- "C2"
  sample1[grep("w", sample1)]<- "C2"
  
  sample2[grep("n", sample2)]<- "U"
  sample2[grep("t", sample2)]<- "E"
  sample2[grep("w", sample2)]<- "D"
  
  sample3[grep("1n", sample3)] <-"10d"
  sample3[grep("2n", sample3)] <-"32d"
  sample3[grep("3n", sample3)] <-"60d"
  sample3[grep("1t", sample3)] <-"10d"
  sample3[grep("2t", sample3)] <-"32d"
  sample3[grep("3t", sample3)] <-"60d"
  sample3[grep("1w", sample3)] <-"10d"
  sample3[grep("2w", sample3)] <-"32d"
  sample3[grep("3w", sample3)] <-"60d"
  
  sample_each <- as.factor(sample0)
  chamber_each <- as.factor(sample1)
  treatment_each <- as.factor(sample2) #just conversion
  day_each <- as.factor(sample3) #just conversion
  
  uds_day.median2<-cbind(chamber=chamber_each, uds_day.median)
  uds_day.median2<-cbind(treatment=treatment_each, uds_day.median2)
  uds_day.median2<-cbind(day=day_each, uds_day.median2)
  uds_day.median2<-cbind(sample_each, uds_day.median2)
  
  
  uds_day.median2[1,c(-1,-2,-3)] 
  uds_day.median2$sample_each[2]
  #View(uds_day.median2)
  
  #prepare dummy vectors
  sample_n <- NULL
  distance_n <-NULL
  chamber_n <-NULL
  treatment_n <-NULL
  dayi_n <-NULL
  dayj_n <-NULL
  
  #calculate distance between 10d, 32d, and 60d
  for(i in 1:(length(sample_each) - 1)) {
    for(j in (i + 1): length(sample_each)) {
      if(sample_each[i] == sample_each[j]) {
        sample_n <- append(sample_n, as.character(sample_each[i]))
        distance_n <- append(distance_n, as.numeric(vegdist(rbind.data.frame(uds_day.median2[i,c(-1,-2,-3,-4)], uds_day.median2[j,c(-1,-2,-3,-4)]), method="euclidean")))
        chamber_n <-append(chamber_n, as.character(chamber_each[i]))
        treatment_n <-append(treatment_n, as.character(treatment_each[i]))
        dayi_n <-append(dayi_n, as.character(day_each[i]))
        dayj_n <-append(dayj_n, as.character(day_each[j]))
      }
    }
  }
  turnover<- data.frame(sample=sample_n, distance=distance_n, chamber=chamber_n, treatment=treatment_n, dayi=dayi_n, dayj=dayj_n)
  
  if(from_date == "10d") turnover_long <-subset(turnover, (dayi == "10d" & dayj=="32d"))  
  #turnover_10d60d <-subset(turnover, (dayi == "10d" & dayj=="60d"))  #not used excluding the combination of 10d & 60d (redundanct)
  if(from_date == "32d") turnover_long <-subset(turnover, (dayi == "32d" & dayj=="60d"))  
 
  turnover_long_tr <- subset(turnover_long, chamber == "C2")
  
  View(turnover_long)
  View(turnover_long_tr)
  
  g_box<-ggplot(turnover_long, aes(y=distance, x=chamber))
  g_box<-g_box + geom_violin()
  g_box<-g_box + geom_boxplot(width=0.1) 
  g_box<-g_box + coord_fixed(ratio = 5/1)
  print(g_box)
  g_box2<-ggplot(turnover_long_tr, aes(y=distance, x=treatment))
  g_box2<-g_box2 + geom_violin()
  g_box2<-g_box2 + geom_boxplot(width=0.1) 
  g_box2<-g_box2 + coord_fixed(ratio = 5/1)
  print(g_box2)
  #plotmeans(turnover_long$distance~turnover_long$chamber)
  #plotmeans(turnover_long_tr$distance~turnover_long_tr$treatment)
  
  print(bartlett.test(turnover_long$distance~turnover_long$chamber))
  print(bartlett.test(turnover_long_tr$distance~turnover_long_tr$treatment))
  #One-way ANOVA with unequal-variance
  print(oneway.test(turnover_long$distance~turnover_long$chamber,var.equal=FALSE))
  print(oneway.test(turnover_long_tr$distance~turnover_long_tr$treatment,var.equal=FALSE))
  
}

####Calculate/Visualize between dates turnover (not used)

#(No difference at all @ 10 day between time)  ####For Fig. S1
#turnover_comparison_short(data_name=uds_data_all_day2, date="10d", c_LB="woLB", meth="chao")  #error due to lack of replication within day
turnover_comparison_short(data_name=uds_data_all_day2, date="32d", c_LB="woLB", meth="chao")
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

    Bartlett test of homogeneity of variances

data:  turnover_shortC$distance by turnover_shortC$chamber
Bartlett's K-squared = 0.59528, df = 1, p-value = 0.4404


    One-way analysis of means (not assuming equal variances)

data:  turnover_shortC$distance and turnover_shortC$chamber
F = 0.77285, num df = 1.000, denom df = 21.334, p-value = 0.3891


    Bartlett test of homogeneity of variances

data:  turnover_short$distance by turnover_short$treatment
Bartlett's K-squared = 1.1809, df = 1, p-value = 0.2772


    One-way analysis of means (not assuming equal variances)

data:  turnover_short$distance and turnover_short$treatment
F = 0.34211, num df = 1.000, denom df = 27.826, p-value = 0.5633

turnover_comparison_short(data_name=uds_data_all_day2, date="60d", c_LB="woLB", meth="chao")
Coordinate system already present. Adding new coordinate system, which will replace the existing one.

    Bartlett test of homogeneity of variances

data:  turnover_shortC$distance by turnover_shortC$chamber
Bartlett's K-squared = 1.396, df = 1, p-value = 0.2374


    One-way analysis of means (not assuming equal variances)

data:  turnover_shortC$distance and turnover_shortC$chamber
F = 2.5418, num df = 1.000, denom df = 13.773, p-value = 0.1335


    Bartlett test of homogeneity of variances

data:  turnover_short$distance by turnover_short$treatment
Bartlett's K-squared = 0.38892, df = 1, p-value = 0.5329


    One-way analysis of means (not assuming equal variances)

data:  turnover_short$distance and turnover_short$treatment
F = 0.024992, num df = 1.000, denom df = 15.321, p-value = 0.8765

Summary of the species turnover analysis (Decided not to use)

  • No differences between Chambers
  • No differences between E and D

Relationship between leaf beetle population size and community composition

Preparation for Mantel test


#(No difference at all @ 10 day between time) ####For Fig. S1
turnover_comparison_long(data_name=uds_data_all_day2, from_date="10d", c_LB="woLB", meth="chao")
 警告:  some squared distances are negative and changed to zero

    Bartlett test of homogeneity of variances

data:  turnover_long$distance by turnover_long$chamber
Bartlett's K-squared = 3.6943, df = 1, p-value = 0.0546


    Bartlett test of homogeneity of variances

data:  turnover_long_tr$distance by turnover_long_tr$treatment
Bartlett's K-squared = 3.5787, df = 1, p-value = 0.05852


    One-way analysis of means (not assuming equal variances)

data:  turnover_long$distance and turnover_long$chamber
F = 0.46726, num df = 1.000, denom df = 15.545, p-value = 0.5043


    One-way analysis of means (not assuming equal variances)

data:  turnover_long_tr$distance and turnover_long_tr$treatment
F = 0.040366, num df = 1.000, denom df = 11.225, p-value = 0.8444

turnover_comparison_long(data_name=uds_data_all_day2, from_date="32d", c_LB="woLB", meth="chao")
 警告:  some squared distances are negative and changed to zero

    Bartlett test of homogeneity of variances

data:  turnover_long$distance by turnover_long$chamber
Bartlett's K-squared = 4.5976, df = 1, p-value = 0.03202


    Bartlett test of homogeneity of variances

data:  turnover_long_tr$distance by turnover_long_tr$treatment
Bartlett's K-squared = 0.0072188, df = 1, p-value = 0.9323


    One-way analysis of means (not assuming equal variances)

data:  turnover_long$distance and turnover_long$chamber
F = 0.15229, num df = 1.00, denom df = 28.73, p-value = 0.6992


    One-way analysis of means (not assuming equal variances)

data:  turnover_long_tr$distance and turnover_long_tr$treatment
F = 1.0881, num df = 1.000, denom df = 25.985, p-value = 0.3065

Mantel test and simple plots

LB_diff_C1_d10.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="10d", c_LB="LBonly", meth="euclidean",dist_out="C1")
LB_diff_C2_d10.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="10d", c_LB="LBonly", meth="euclidean",dist_out="C2")
LB_diff_C12_d10.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="10d", c_LB="LBonly", meth="euclidean",dist_out="C12")
LB_diff_C1_d32.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="32d", c_LB="LBonly", meth="euclidean",dist_out="C1")
LB_diff_C2_d32.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="32d", c_LB="LBonly", meth="euclidean",dist_out="C2")
LB_diff_C12_d32.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="32d", c_LB="LBonly", meth="euclidean",dist_out="C12")
LB_diff_C1_d60.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="60d", c_LB="LBonly", meth="euclidean",dist_out="C1")
LB_diff_C2_d60.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="60d", c_LB="LBonly", meth="euclidean",dist_out="C2")
LB_diff_C12_d60.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="60d", c_LB="LBonly", meth="euclidean",dist_out="C12")

comm_diff_C1_d10.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="10d", c_LB="woLB", meth="chao",dist_out="C1")
comm_diff_C2_d10.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="10d", c_LB="woLB", meth="chao",dist_out="C2")
comm_diff_C12_d10.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="10d", c_LB="woLB", meth="chao",dist_out="C12")
comm_diff_C1_d32.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="32d", c_LB="woLB", meth="chao",dist_out="C1")
 警告:  some squared distances are negative and changed to zero
comm_diff_C2_d32.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="32d", c_LB="woLB", meth="chao",dist_out="C2")
 警告:  some squared distances are negative and changed to zero
comm_diff_C12_d32.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="32d", c_LB="woLB", meth="chao",dist_out="C12")
 警告:  some squared distances are negative and changed to zero
comm_diff_C1_d60.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="60d", c_LB="woLB", meth="chao",dist_out="C1")
 警告:  some squared distances are negative and changed to zero
comm_diff_C2_d60.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="60d", c_LB="woLB", meth="chao",dist_out="C2")
 警告:  some squared distances are negative and changed to zero
comm_diff_C12_d60.d<-disper_uds_centroid(data_name=uds_data_all_day2, date="60d", c_LB="woLB", meth="chao",dist_out="C12")
 警告:  some squared distances are negative and changed to zero

ggplot for mantel test

Only for day 32

plot(LB_diff_C1_d10.d, comm_diff_C1_d10.d)

mantel(LB_diff_C1_d10.d, comm_diff_C1_d10.d, method="pearson", permutations=9999)

Mantel statistic based on Pearson's product-moment correlation 

Call:
mantel(xdis = LB_diff_C1_d10.d, ydis = comm_diff_C1_d10.d, method = "pearson",      permutations = 9999) 

Mantel statistic r: -0.1332 
      Significance: 0.8255 

Upper quantiles of permutations (null model):
  90%   95% 97.5%   99% 
0.141 0.168 0.190 0.214 
Permutation: free
Number of permutations: 9999
plot(LB_diff_C2_d10.d, comm_diff_C2_d10.d)

mantel(LB_diff_C2_d10.d, comm_diff_C2_d10.d, method="pearson", permutations=9999)

Mantel statistic based on Pearson's product-moment correlation 

Call:
mantel(xdis = LB_diff_C2_d10.d, ydis = comm_diff_C2_d10.d, method = "pearson",      permutations = 9999) 

Mantel statistic r: -0.07778 
      Significance: 0.8019 

Upper quantiles of permutations (null model):
  90%   95% 97.5%   99% 
0.114 0.150 0.178 0.209 
Permutation: free
Number of permutations: 9999
plot(LB_diff_C12_d10.d, comm_diff_C12_d10.d)

mantel(LB_diff_C12_d10.d, comm_diff_C12_d10.d, method="pearson", permutations=9999)

Mantel statistic based on Pearson's product-moment correlation 

Call:
mantel(xdis = LB_diff_C12_d10.d, ydis = comm_diff_C12_d10.d,      method = "pearson", permutations = 9999) 

Mantel statistic r: -0.09194 
      Significance: 0.9521 

Upper quantiles of permutations (null model):
   90%    95%  97.5%    99% 
0.0771 0.0999 0.1190 0.1402 
Permutation: free
Number of permutations: 9999
plot(LB_diff_C1_d32.d, comm_diff_C1_d32.d)

mantel(LB_diff_C1_d32.d, comm_diff_C1_d32.d, method="pearson", permutations=9999)

Mantel statistic based on Pearson's product-moment correlation 

Call:
mantel(xdis = LB_diff_C1_d32.d, ydis = comm_diff_C1_d32.d, method = "pearson",      permutations = 9999) 

Mantel statistic r: -0.01861 
      Significance: 0.5386 

Upper quantiles of permutations (null model):
  90%   95% 97.5%   99% 
0.154 0.199 0.239 0.285 
Permutation: free
Number of permutations: 9999
plot(LB_diff_C2_d32.d, comm_diff_C2_d32.d)

mantel(LB_diff_C2_d32.d, comm_diff_C2_d32.d, method="pearson", permutations=9999)

Mantel statistic based on Pearson's product-moment correlation 

Call:
mantel(xdis = LB_diff_C2_d32.d, ydis = comm_diff_C2_d32.d, method = "pearson",      permutations = 9999) 

Mantel statistic r: 0.1698 
      Significance: 0.0151 

Upper quantiles of permutations (null model):
  90%   95% 97.5%   99% 
0.117 0.139 0.158 0.179 
Permutation: free
Number of permutations: 9999
plot(LB_diff_C12_d32.d, comm_diff_C12_d32.d)

mantel(LB_diff_C12_d32.d, comm_diff_C12_d32.d, method="pearson", permutations=9999)

Mantel statistic based on Pearson's product-moment correlation 

Call:
mantel(xdis = LB_diff_C12_d32.d, ydis = comm_diff_C12_d32.d,      method = "pearson", permutations = 9999) 

Mantel statistic r: 0.128 
      Significance: 0.026 

Upper quantiles of permutations (null model):
   90%    95%  97.5%    99% 
0.0936 0.1136 0.1288 0.1465 
Permutation: free
Number of permutations: 9999
plot(LB_diff_C1_d60.d, comm_diff_C1_d60.d)

#mantel(LB_diff_C1_d60.d, comm_diff_C1_d60.d, method="pearson", permutations=9999)
plot(LB_diff_C2_d60.d, comm_diff_C2_d60.d)

mantel(LB_diff_C2_d60.d, comm_diff_C2_d60.d, method="pearson", permutations=9999)

Mantel statistic based on Pearson's product-moment correlation 

Call:
mantel(xdis = LB_diff_C2_d60.d, ydis = comm_diff_C2_d60.d, method = "pearson",      permutations = 9999) 

Mantel statistic r: -0.007227 
      Significance: 0.5256 

Upper quantiles of permutations (null model):
  90%   95% 97.5%   99% 
0.149 0.183 0.206 0.232 
Permutation: free
Number of permutations: 9999
plot(LB_diff_C12_d60.d, comm_diff_C12_d60.d)

mantel(LB_diff_C12_d60.d, comm_diff_C12_d60.d, method="pearson", permutations=9999)

Mantel statistic based on Pearson's product-moment correlation 

Call:
mantel(xdis = LB_diff_C12_d60.d, ydis = comm_diff_C12_d60.d,      method = "pearson", permutations = 9999) 

Mantel statistic r: 0.02801 
      Significance: 0.4126 

Upper quantiles of permutations (null model):
  90%   95% 97.5%   99% 
0.135 0.161 0.180 0.198 
Permutation: free
Number of permutations: 9999

Summary of mantel test

  • Positive relationship between LB population size and community composition at day 32 for the whole data
  • Positive relationship between LB population size and community composition at day 32 for C2 chamber
  • No relationship between LB population size and community composition at day 32 for C1 chamber

Species richness analysis (Fig.3 & Fig.S3)

Preparation of functions with iNEXT package

library(reshape)
#C1 only
m_LB <- as.matrix(LB_diff_C1_d32.d)
m2_LB <- melt(m_LB)[melt(upper.tri(m_LB))$value,]
 警告:  'as.is' should be specified by the caller; using TRUE 警告:  'as.is' should be specified by the caller; using TRUE
names(m2_LB) <- c("t1", "t2", "distance_LB")
#View(m2_LB)
m_com <- as.matrix(comm_diff_C1_d32.d)
m2_com <- melt(m_com)[melt(upper.tri(m_com))$value,]
 警告:  'as.is' should be specified by the caller; using TRUE 警告:  'as.is' should be specified by the caller; using TRUE
names(m2_com) <- c("tt1", "tt2", "distance_com")
m2_LB_com <- cbind.data.frame(m2_LB, m2_com)
#View(m2_LB_com)

g_points<-ggplot(m2_LB_com, aes(y=distance_com, x=distance_LB)) + xlim(0,8) + ylim(0,1.5) + coord_fixed(8/1.5) + ggtitle("C1 only")
g_points<-g_points+geom_point(size=2,alpha=0.3) 
result<-lm(m2_LB_com$distance_com~m2_LB_com$distance_LB)
summary(result)

Call:
lm(formula = m2_LB_com$distance_com ~ m2_LB_com$distance_LB)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.01101 -0.02574  0.06248  0.10782  0.19192 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)            1.015442   0.033019  30.754   <2e-16 ***
m2_LB_com$distance_LB -0.004041   0.023008  -0.176    0.861    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1831 on 89 degrees of freedom
Multiple R-squared:  0.0003464, Adjusted R-squared:  -0.01089 
F-statistic: 0.03084 on 1 and 89 DF,  p-value: 0.861
result$coefficients[1]
(Intercept) 
   1.015442 
g_points<-g_points+geom_abline(slope = result$coefficients[2],intercept = result$coefficients[1],size=1,linetype=2,colour="blue") # slope
print(g_points)


#C2 only
m_LB <- as.matrix(LB_diff_C2_d32.d)
m2_LB <- melt(m_LB)[melt(upper.tri(m_LB))$value,]
 警告:  'as.is' should be specified by the caller; using TRUE 警告:  'as.is' should be specified by the caller; using TRUE
names(m2_LB) <- c("t1", "t2", "distance_LB")
#View(m2_LB)
m_com <- as.matrix(comm_diff_C2_d32.d)
m2_com <- melt(m_com)[melt(upper.tri(m_com))$value,]
 警告:  'as.is' should be specified by the caller; using TRUE 警告:  'as.is' should be specified by the caller; using TRUE
names(m2_com) <- c("tt1", "tt2", "distance_com")
m2_LB_com <- cbind.data.frame(m2_LB, m2_com)
#View(m2_LB_com)

g_points<-ggplot(m2_LB_com, aes(y=distance_com, x=distance_LB)) + xlim(0,8) + ylim(0,1.5) + coord_fixed(8/1.5) + ggtitle("C2 only")
g_points<-g_points+geom_point(size=2,alpha=0.3) 
result<-lm(m2_LB_com$distance_com~m2_LB_com$distance_LB)
summary(result)

Call:
lm(formula = m2_LB_com$distance_com ~ m2_LB_com$distance_LB)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.98366 -0.06532  0.03618  0.10218  0.32866 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)           0.971440   0.008921 108.892  < 2e-16 ***
m2_LB_com$distance_LB 0.013777   0.003598   3.829 0.000145 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1607 on 494 degrees of freedom
Multiple R-squared:  0.02882,   Adjusted R-squared:  0.02685 
F-statistic: 14.66 on 1 and 494 DF,  p-value: 0.0001454
result$coefficients[1]
(Intercept) 
  0.9714401 
g_points<-g_points+geom_abline(slope = result$coefficients[2],intercept = result$coefficients[1],size=1,linetype=1,colour="blue") # slope
print(g_points)


#C1 + C2 
m_LB <- as.matrix(LB_diff_C12_d32.d)
m2_LB <- melt(m_LB)[melt(upper.tri(m_LB))$value,]
 警告:  'as.is' should be specified by the caller; using TRUE 警告:  'as.is' should be specified by the caller; using TRUE
names(m2_LB) <- c("t1", "t2", "distance_LB")
#View(m2_LB)
m_com <- as.matrix(comm_diff_C12_d32.d)
m2_com <- melt(m_com)[melt(upper.tri(m_com))$value,]
 警告:  'as.is' should be specified by the caller; using TRUE 警告:  'as.is' should be specified by the caller; using TRUE
names(m2_com) <- c("tt1", "tt2", "distance_com")
m2_LB_com <- cbind.data.frame(m2_LB, m2_com)
#View(m2_LB_com)

g_points<-ggplot(m2_LB_com, aes(y=distance_com, x=distance_LB)) + xlim(0,8) + ylim(0,1.5) + coord_fixed(8/1.5) + ggtitle("C1 + C2")
g_points<-g_points+geom_point(size=2,alpha=0.3) 
result<-lm(m2_LB_com$distance_com~m2_LB_com$distance_LB)
result$coefficients[1]
(Intercept) 
  0.9765874 
g_points<-g_points+geom_abline(slope = result$coefficients[2],intercept = result$coefficients[1],size=1,linetype=1,colour="blue") # slope
print(g_points)

Temporal dynamics of species richness

Observed species richness per plant individuals (Fig.S2)


alpha_hill_number <- function(data_name, date, q)
{
  #data_name <-uds_data_all_day2
  #date <- "32d"
  #Including leaf_beetle
  
  uds_data1 <-subset(data_name, abundance2 >= 0) #OR, delete the sampling when species other than leaf beetle does not exist
  uds_data2 <-subset(uds_data1, day==date)
  
  #if excluding leaf beetle
  #uds_each<-uds_data2[,c(-1,-2,-3,-4,-77,-78,-79)]
  #OR inclcding leaf beetle
  uds_each<-uds_data2[,c(-1,-2,-3,-77,-78,-79,-80)]
  
  
  #Hill number q = 0, 1, 2
  uds_hill<-renyi(uds_each, scales=c(0,1,2), hill=TRUE)
  uds_hill2<-cbind(uds_hill, uds_data2[,c(77,78,79,80)])
  colnames(uds_hill2) <-c("H0", "H1", "H2", "day", "treatment", "time", "chamber")
  
  #convert NA to 0
  uds_hill2$H0[is.na(uds_hill2$H0)] <- 0 
  
  
  uds_hill3 <- subset(uds_hill2,chamber=="C2")
  uds_hill3$treatment[uds_hill3$treatment=="T"] <- "E"
  uds_hill3$treatment[uds_hill3$treatment=="W"] <- "D"
  #View(uds_hill2)
  if(q == 0) {
     g_box<-ggplot(uds_hill2, aes(y=H0, x=chamber))
     g_box<-g_box + geom_violin()
     g_box<-g_box + geom_boxplot(width=0.1) 
     g_box<-g_box + coord_fixed(ratio = 1/2)
     print(g_box)
     g_box2<-ggplot(uds_hill3, aes(y=H0, x=treatment))
     g_box2<-g_box2 + geom_violin()
     g_box2<-g_box2 + geom_boxplot(width=0.1) 
     g_box2<-g_box2 + coord_fixed(ratio = 1/2)
     print(g_box2)
     
     plotmeans(uds_hill2$H0~uds_hill2$chamber) 
     
     View(uds_hill2)
    
    #homogeneity of variance
    print(bartlett.test(uds_hill2$H0~uds_hill2$chamber))
    print(bartlett.test(uds_hill3$H0~uds_hill3$treatment))
    #One-way ANOVA with unequal-variance between chambers
    print(oneway.test(uds_hill2$H0~uds_hill2$chamber,var.equal=FALSE))
    print(oneway.test(uds_hill3$H0~uds_hill3$treatment,var.equal=FALSE))
    #Pairwise comparison with Welch's t test
    #print(pairwise.t.test(uds_hill2$H0, uds_hill2$treatment, p.adj="holm"))
  }
  if(q == 1) {
    g_box<-ggplot(uds_hill2, aes(y=H1, x=chamber))
     g_box<-g_box + geom_violin()
     g_box<-g_box + geom_boxplot(width=0.1) 
     g_box<-g_box + coord_fixed(ratio = 1/2)
     print(g_box)
     g_box2<-ggplot(uds_hill3, aes(y=H1, x=treatment))
     g_box2<-g_box2 + geom_violin()
     g_box2<-g_box2 + geom_boxplot(width=0.1) 
     g_box2<-g_box2 + coord_fixed(ratio = 1/2)
     print(g_box2)
     
     plotmeans(uds_hill2$H1~uds_hill2$chamber) 
     
     View(uds_hill2)
    
    #homogeneity of variance
    print(bartlett.test(uds_hill2$H1~uds_hill2$chamber))
    print(bartlett.test(uds_hill3$H1~uds_hill3$treatment))
    #One-way ANOVA with unequal-variance between chambers
    print(oneway.test(uds_hill2$H1~uds_hill2$chamber,var.equal=FALSE))
    print(oneway.test(uds_hill3$H1~uds_hill3$treatment,var.equal=FALSE))
    
  }
  if(q == 2) {
    g_box<-ggplot(uds_hill2, aes(y=H2, x=chamber))
     g_box<-g_box + geom_violin()
     g_box<-g_box + geom_boxplot(width=0.1) 
     g_box<-g_box + coord_fixed(ratio = 1/2)
     print(g_box)
     g_box2<-ggplot(uds_hill3, aes(y=H2, x=treatment))
     g_box2<-g_box2 + geom_violin()
     g_box2<-g_box2 + geom_boxplot(width=0.1) 
     g_box2<-g_box2 + coord_fixed(ratio = 1/2)
     print(g_box2)
     
     plotmeans(uds_hill2$H1~uds_hill2$chamber) 
     
     View(uds_hill2)
    
    #homogeneity of variance
    print(bartlett.test(uds_hill2$H2~uds_hill2$chamber))
    print(bartlett.test(uds_hill3$H2~uds_hill3$treatment))
    #One-way ANOVA with unequal-variance between chambers
    print(oneway.test(uds_hill2$H2~uds_hill2$chamber,var.equal=FALSE))
    print(oneway.test(uds_hill3$H2~uds_hill3$treatment,var.equal=FALSE))
    
  }
  
    
}

Summary of observerd richness

  • There were significant differences bet.chambers (C1 < C2) at day 32 and day 60 but the difference is minor
  • There were no differences bet. D and E at any days

Species richness estimates analyzed by iNEXT (Fig.3)

Loading data for iNEXT analyses

#all samplings are treated as independent, used in the manuscript 
####For Figure S2
alpha_hill_number(uds_data_all_day2, date="10d", q=0)


    Bartlett test of homogeneity of variances

data:  uds_hill2$H0 by uds_hill2$chamber
Bartlett's K-squared = 1.3053, df = 1, p-value = 0.2532


    Bartlett test of homogeneity of variances

data:  uds_hill3$H0 by uds_hill3$treatment
Bartlett's K-squared = 0.095202, df = 1, p-value = 0.7577


    One-way analysis of means (not assuming equal variances)

data:  uds_hill2$H0 and uds_hill2$chamber
F = 0.74438, num df = 1.000, denom df = 38.077, p-value = 0.3937


    One-way analysis of means (not assuming equal variances)

data:  uds_hill3$H0 and uds_hill3$treatment
F = 0.57447, num df = 1.000, denom df = 29.805, p-value = 0.4544

alpha_hill_number(uds_data_all_day2, date="32d", q=0)


    Bartlett test of homogeneity of variances

data:  uds_hill2$H0 by uds_hill2$chamber
Bartlett's K-squared = 0.81835, df = 1, p-value = 0.3657


    Bartlett test of homogeneity of variances

data:  uds_hill3$H0 by uds_hill3$treatment
Bartlett's K-squared = 0.49807, df = 1, p-value = 0.4803


    One-way analysis of means (not assuming equal variances)

data:  uds_hill2$H0 and uds_hill2$chamber
F = 6.7446, num df = 1.000, denom df = 85.245, p-value = 0.01107


    One-way analysis of means (not assuming equal variances)

data:  uds_hill3$H0 and uds_hill3$treatment
F = 0.032126, num df = 1.000, denom df = 93.009, p-value = 0.8581

alpha_hill_number(uds_data_all_day2, date="60d", q=0)


    Bartlett test of homogeneity of variances

data:  uds_hill2$H0 by uds_hill2$chamber
Bartlett's K-squared = 8.5728, df = 1, p-value = 0.003412


    Bartlett test of homogeneity of variances

data:  uds_hill3$H0 by uds_hill3$treatment
Bartlett's K-squared = 1.1076, df = 1, p-value = 0.2926


    One-way analysis of means (not assuming equal variances)

data:  uds_hill2$H0 and uds_hill2$chamber
F = 9.2244, num df = 1.00, denom df = 129.39, p-value = 0.002889


    One-way analysis of means (not assuming equal variances)

data:  uds_hill3$H0 and uds_hill3$treatment
F = 0.21631, num df = 1.000, denom df = 91.839, p-value = 0.643

Estimating the coverage-based standardized richness (Fig.3a) & asymptotic richness (Fig.3b)

For standardized richness (Results for Fig.3a)

incidence_whole <- read.csv("monthly-for-R_iNEXT.csv", header=T)  #for incidence data calculated by Excel

For asymptotic richness (Results for Fig.3b)

####This is code for graphics in the manuscript (Fig.3)
stat_test<-DataInfo(incidence_whole, datatype = "incidence")  ##This is necessary to find the minimum value of the coverage
estimateD(incidence_whole, datatype="incidence_freq", base="coverage", level=min(stat_test$SC))

Loading data for graphics

The above iNEXT results were manually summarized in excel and csv.

#When Short-term repeated measurement is assumed to be independent
ChaoRichness(incidence_whole, datatype="incidence")  #It is OK to use dataframe, this is from iNEXT

Figure 3a

diversity_summary <- read.csv("iNEXT_summary.csv",header=T)
class(diversity_summary)
[1] "data.frame"
View(diversity_summary)
diversity_summary2<-diversity_summary[1:20,]
class(diversity_summary2$day)
[1] "character"

Figure 3b

#colours <- c("#F8766D", "#EE55B7", "#00BA38", "#619CFF", "#E76BF3")
g_div_a <- ggplot(data=diversity_summary2, aes(x=ID,y=SR))
g_div_a <- g_div_a + geom_errorbar(aes(ymax = Hconf, ymin = Lconf, colour=treatment), width = 0.0,size=5, alpha=0.5) #+ scale_colour_manual("Group", values = colours)
g_div_a <- g_div_a + geom_point(aes(colour=treatment), size=3) #+ scale_colour_manual("Group", values = colours)
g_div_a <- g_div_a +  geom_point(aes(y=Observed), size=3) + coord_fixed(ratio = 1/5) #+ scale_colour_manual("Group", values = colours) 
print(g_div_a)

Summary for richness analysis

  • Observed richness (Fig.3a)

    • the whole richness at each day was greater than any of single treatment or single chamber
    • the richness in the whole period was greater than any of single date for every treatment and chamber
  • Standardized richness (Fig.3a)

  • Asymptotic richness (Fig.3b)

    • Chamber 2 (E&D) had a greater richness than Chamber 1 (U)
    • Chamber 2 had a greater richness than D
    • The whole richness (UED) was greater than Chamber 1 and D

Species richness partitioning (Table S2, Fig. S3, and Fig.3C)

#Plot Asymptotic richness (Chao index)(Fig3b)
diversity_summary3<-diversity_summary[16:20,]
diversity_summary3$ID <- c("1U", "2ED", "3E", "4D", "5UED")
#colours <- c("#F8766D", "#00BA38", "#619CFF", "#E76BF3", "#00B6EB", "#A58AFF", "#FB61D7")
g_div_b <- ggplot(data=diversity_summary3, aes(x=ID,y=AsyEST))
g_div_b <- g_div_b + geom_errorbar(aes(ymax = Hconf_asy, ymin = Lconf_asy, colour=treatment), width = 0.0,size=5, alpha=1.0) #+ scale_colour_manual("Group", values = colours)
g_div_b <- g_div_b + geom_point(size=5) 
print(g_div_b)

LS0tIA0KdGl0bGU6ICJmcm9udGllcl9jaGVtaWNhbF9lY29sb2d5X3lvbmV5YTIwMjIgdjMgKGZpbmFsKSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rLiBXaGVuIHlvdSBleGVjdXRlIGNvZGUgd2l0aGluIHRoZSBub3RlYm9vaywgdGhlIHJlc3VsdHMgYXBwZWFyIGJlbmVhdGggdGhlIGNvZGUuIA0KDQpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ3RybCtTaGlmdCtFbnRlciouIA0KDQojIyBMb2FkaW5nIGxpYnJhcmllcw0KYGBge3J9DQpsaWJyYXJ5KHZlZ2FuKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3NjaSkNCmxpYnJhcnkoZ3Bsb3RzKQ0KbGlicmFyeShpTkVYVCkNCmxpYnJhcnkobmxtZSkNCmxpYnJhcnkocmNvbXBhbmlvbikNCmxpYnJhcnkoY2FyKQ0Kc2V0LnNlZWQoNDMyMSkNCmBgYA0KIyMgTG9hZGluZyBkYXRhc2V0cw0KYGBge3J9DQp1ZHNfZGF0YTUudGVtcCA8LSByZWFkLmNzdigibW9udGhseS1mb3ItUjMuY3N2IixoZWFkZXI9VCkgICNmb3IgMiBvciAzIGNvbnRpbnVvdXMgc2FtcGxpbmcgYXQgZGF5IDEwLCAzMiwgYW5kIDYwDQoNCnVkc19kYXRhX2FsbF9kYXkgPC11ZHNfZGF0YTUudGVtcFssYygtMSldDQp1ZHNfZGF0YV9hbGxfZGF5MiA8LXVkc19kYXRhNS50ZW1wDQoNCiNjb252ZXJ0aW5nIHRyZWF0bWVudCB0byBjaGFtYmVyDQpjaGFtYmVyIDwtIHVkc19kYXRhX2FsbF9kYXkyJHRyZWF0bWVudA0KY2hhbWJlcltjaGFtYmVyID09ICJOIl0gPC0gIkMxIg0KY2hhbWJlcltjaGFtYmVyID09ICJXIl0gPC0gIkMyIg0KY2hhbWJlcltjaGFtYmVyID09ICJUIl0gPC0gIkMyIg0KdWRzX2RhdGFfYWxsX2RheTIgPC0gY2JpbmQuZGF0YS5mcmFtZSh1ZHNfZGF0YV9hbGxfZGF5MiwgY2hhbWJlcikNCg0KdWRzX2RhdGFfYWxsX0xCYSA8LSByZWFkLmNzdigibGVhZl9iZWV0bGVfYWR1bHRfc3VtbWFyeS5jc3YiLCBoZWFkZXI9VCkgI2ZvciBsZWFmIGJlZXRsZSBhZHVsdCBkYXRhDQp1ZHNfZGF0YUxCIDwtIHVkc19kYXRhX2FsbF9kYXlbLCBjKDMpXQ0KaGVhZCh1ZHNfZGF0YV9hbGxfTEJhKQ0KaGVhZCh1ZHNfZGF0YV9hbGxfZGF5MikNCmBgYA0KIyMgTm90ZSBmb3Igc3ltYm9scyB0byByZXByZXNlbnQgcGxhbnQgaW5pdGlhbCBjb25kaXRpb25zDQotICJVIiBhbmQgIk4iIHdlcmUgaW50ZXJjaGFuZ2VhYmx5IHVzZWQgdG8gcmVwcmVzZW50ICJVbmluZmVzdGVkIHBsYW50cyIgaW4gY2hhbWJlciBDMQ0KLSAiRSIsICJTIiwgYW5kICJUIiB3ZXJlIGludGVyY2hhbmdlYWJseSB1c2VkIHRvIHJlcHJlc2VudCAiRXhwb3NlZCBwbGFudHMiIGluIGNoYW1iZXIgQzINCi0gIkQiIGFuZCAiVyIgd2VyZSBpbnRlcmNoYW5nZWFibHkgdXNlZCB0byByZXByZXNlbnQgIkRhbWFnZWQgcGxhbnRzIiBpbiBjaGFtYmVyIEMyDQoNCiMjIEJhc2ljIEFuYWx5c2lzIG9mIHRoZSB0aW1lIGV2b2x1dGlvbiAoc3VjY2Vzc2lvbikgb2YgdGhlIGFidW5kYW50IHNwZWNpZXMgKGZvciBzdXBwb3J0aW5nIGluZm9ybWF0aW9uKQ0KIyMjIERhdGEgcHJldHJlYXRtZW50DQpgYGB7cn0NClNBRF90b3RhbCA8LSBkYXRhLmZyYW1lKGFidW5kYW5jZT1hcHBseSh1ZHNfZGF0YV9hbGxfZGF5MlssNDo3Nl0sIDIsIHN1bSkpDQpTQURfcmFuayA8LSBvcmRlcihTQURfdG90YWxbLDFdLCBkZWNyZWFzaW5nPVQpDQpTQURfdG90YWwyIDwtIGRhdGEuZnJhbWUocmFuaz1jKDE6NzMpLCBJRD1yb3duYW1lcyhTQURfdG90YWwpW1NBRF9yYW5rXSwgYWJ1bmRhbmNlPVNBRF90b3RhbFtTQURfcmFuaywxXSkNCiNob3cgbWFueSBzcGVjaWVzPw0Kc3VtKFNBRF90b3RhbDIkYWJ1bmRhbmNlPjApDQoNCnBsb3QoU0FEX3RvdGFsMiRyYW5rLCBsb2cxMChTQURfdG90YWwyJGFidW5kYW5jZSkpICNTQUQsIGluY2x1ZGluZyB0aGUgcmFuayAxIHNwZWljZXMgKHdsKSBidXQgd2l0aCBsb2cxMCBzY2FsZQ0KcGxvdChTQURfdG90YWwyJHJhbmtbLTFdLCBTQURfdG90YWwyJGFidW5kYW5jZVstMV0pICNTQUQsIGV4Y2x1ZGluZyB0aGUgcmFuayAxIHNwZWljZXMgKHdsKQ0KcGxvdChTQURfdG90YWwyJHJhbmtbMjoxMF0sIFNBRF90b3RhbDIkYWJ1bmRhbmNlWzI6MTBdKSAjU0FELCBmcm9tIHJhbmsgMiB0byByYW5rIDEwDQojdGV4dChTQURfdG90YWwyJHJhbmtbMjoxMF0sIFNBRF90b3RhbDIkYWJ1bmRhbmNlWzI6MTBdLCBsYWJlbHM9U0FEX3RvdGFsMiRJRFsyOjEwXSkNCmdncGxvdChTQURfdG90YWwyLCBhZXMoeD1yYW5rLCB5PWxvZzEwKGFidW5kYW5jZSkpKSArIGdlb21fcG9pbnQoKQ0KU0FEX3RvdGFsMl9zdWIgPC0gU0FEX3RvdGFsMlsyOjEwLF0NCnNhZF9wbG90IDwtIGdncGxvdChTQURfdG90YWwyX3N1YiwgYWVzKHg9cmFuaywgeT1hYnVuZGFuY2UpKSArIGdlb21fcG9pbnQoKQ0Kc2FkX3Bsb3QgPC0gc2FkX3Bsb3QgKyBnZW9tX3RleHQoYWVzKGxhYmVsPUlEKSwgc2l6ZT0zLHZqdXN0PS0xKQ0KcGxvdChzYWRfcGxvdCkNCmBgYA0KIyMjIFRpbWUgZXZvbHV0aW9uIG9mIHRoZSByYW5rIDEtMTAgdGF4YQ0KYGBge3J9DQojVGF4b24gKHNwZWNpZXMpIGlkZW50aXR5DQpTQURfdG90YWwyX3N1YiRJRA0KdWRzX2RhdGFfYWxsX2RheV9TSSA8LSB1ZHNfZGF0YV9hbGxfZGF5MiAgI2NvcHkgZm9yIFNJIG9ubHkNCnVkc19kYXRhX2FsbF9kYXlfU0kkdHJlYXRtZW50W3Vkc19kYXRhX2FsbF9kYXlfU0kkdHJlYXRtZW50PT0iTiJdIDwtICJVIg0KdWRzX2RhdGFfYWxsX2RheV9TSSR0cmVhdG1lbnRbdWRzX2RhdGFfYWxsX2RheV9TSSR0cmVhdG1lbnQ9PSJXIl0gPC0gIkQiDQp1ZHNfZGF0YV9hbGxfZGF5X1NJJHRyZWF0bWVudFt1ZHNfZGF0YV9hbGxfZGF5X1NJJHRyZWF0bWVudD09IlQiXSA8LSAiRSINCnRyZWF0bWVudF9kYXkgPC0gYXMuZmFjdG9yKHBhc3RlKHVkc19kYXRhX2FsbF9kYXlfU0kkdHJlYXRtZW50LHVkc19kYXRhX2FsbF9kYXlfU0kkZGF5KSkNCnVkc19kYXRhX2FsbF9kYXlfU0kgPC0gY2JpbmQuZGF0YS5mcmFtZSh1ZHNfZGF0YV9hbGxfZGF5X1NJLCB0cmVhdG1lbnRfZGF5KQ0KcGxvdCh1ZHNfZGF0YV9hbGxfZGF5X1NJJHRyZWF0bWVudF9kYXkgLHVkc19kYXRhX2FsbF9kYXlfU0kkd2wpDQoNCiNyYW5rIDENCmdncGxvdCh1ZHNfZGF0YV9hbGxfZGF5X1NJLCBhZXMoeD10cmVhdG1lbnRfZGF5LCB5PXdsLCBmaWxsPXRyZWF0bWVudCkpICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKyBnZW9tX3BvaW50KGFscGhhPTAuMikgKyBnZ3RpdGxlKCJQbGFnaW9kZXJhIHZlcnNpY29sb3JhIikNCg0KI3JhbmsgMg0KZ2dwbG90KHVkc19kYXRhX2FsbF9kYXlfU0ksIGFlcyh4PXRyZWF0bWVudF9kYXksIHk9c3BpZGVyMywgZmlsbD10cmVhdG1lbnQpKSAgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArIGdlb21fcG9pbnQoYWxwaGE9MC4xLCBzaXplPTIpICsgZ2d0aXRsZSgic3BpZGVyIGdyb3VwIDMgKDwgNW1tIHdpdGggc3BpZGVyd2ViKSIpDQoNCiNyYW5rIDMNCmdncGxvdCh1ZHNfZGF0YV9hbGxfZGF5X1NJLCBhZXMoeD10cmVhdG1lbnRfZGF5LCB5PWxlcDksIGZpbGw9dHJlYXRtZW50KSkgICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKyBnZW9tX3BvaW50KGFscGhhPTAuMSwgc2l6ZT0yKSArIGdndGl0bGUoIkNhbG9wdGlsaWEgc3AuMiIpDQoNCiNyYW5rIDQNCmdncGxvdCh1ZHNfZGF0YV9hbGxfZGF5X1NJLCBhZXMoeD10cmVhdG1lbnRfZGF5LCB5PWxlcDcsIGZpbGw9dHJlYXRtZW50KSkgICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKyBnZW9tX3BvaW50KGFscGhhPTAuMSwgc2l6ZT0yKSArIGdndGl0bGUoIlNhbGljaXBoYWdhIGNhZXNpYSIpDQoNCiNyYW5rIDUNCmdncGxvdCh1ZHNfZGF0YV9hbGxfZGF5X1NJLCBhZXMoeD10cmVhdG1lbnRfZGF5LCB5PWxlcDEwLCBmaWxsPXRyZWF0bWVudCkpICArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgZ2VvbV9wb2ludChhbHBoYT0wLjEsIHNpemU9MikgKyBnZ3RpdGxlKCJQaHlsbG9jb2xwYSBzcCIpDQoNCiNyYW5rIDYNCmdncGxvdCh1ZHNfZGF0YV9hbGxfZGF5X1NJLCBhZXMoeD10cmVhdG1lbnRfZGF5LCB5PWFwaGk1LCBmaWxsPXRyZWF0bWVudCkpICArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgZ2VvbV9wb2ludChhbHBoYT0wLjEsIHNpemU9MikgKyBnZ3RpdGxlKCJDYXZhcmllbGxhIHNhbGljaWNvbGEiKQ0KDQojcmFuayA3DQpnZ3Bsb3QodWRzX2RhdGFfYWxsX2RheV9TSSwgYWVzKHg9dHJlYXRtZW50X2RheSwgeT1sZXAxMiwgZmlsbD10cmVhdG1lbnQpKSAgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArIGdlb21fcG9pbnQoYWxwaGE9MC4xLCBzaXplPTIpICsgZ2d0aXRsZSgic3BpZGVyIGdyb3VwIDQgKDwgNW1tIHdpdGhvdXQgc3BpZGVyd2ViKSIpDQoNCiNyYW5rIDgNCmdncGxvdCh1ZHNfZGF0YV9hbGxfZGF5X1NJLCBhZXMoeD10cmVhdG1lbnRfZGF5LCB5PXBhcmFzaXRvaWQzLCBmaWxsPXRyZWF0bWVudCkpICArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgZ2VvbV9wb2ludChhbHBoYT0wLjEsIHNpemU9MikgKyBnZ3RpdGxlKCJUYWNoaW5pZGFlIHNwLjEgKGhvc3Q6IFAuIHZlcnNpY29sb3JhKSIpDQoNCiNyYW5rIDkNCmdncGxvdCh1ZHNfZGF0YV9hbGxfZGF5X1NJLCBhZXMoeD10cmVhdG1lbnRfZGF5LCB5PWxlcDEyLCBmaWxsPXRyZWF0bWVudCkpICArIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgZ2VvbV9wb2ludChhbHBoYT0wLjEsIHNpemU9MikgKyBnZ3RpdGxlKCJNaWNyb2xlb24gbG9uZ2lwYWxwaXMiKQ0KDQojcmFuayAxMA0KZ2dwbG90KHVkc19kYXRhX2FsbF9kYXlfU0ksIGFlcyh4PXRyZWF0bWVudF9kYXksIHk9bGVwMTMsIGZpbGw9dHJlYXRtZW50KSkgICsgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKyBnZW9tX3BvaW50KGFscGhhPTAuMSwgc2l6ZT0yKSArIGdndGl0bGUoIk1vbmVtYSBmbGF2ZXNjZW5zIikNCg0KI3JhbmsgMTENCmdncGxvdCh1ZHNfZGF0YV9hbGxfZGF5X1NJLCBhZXMoeD10cmVhdG1lbnRfZGF5LCB5PWdyYXNzaG9wcGVyMSwgZmlsbD10cmVhdG1lbnQpKSAgKyBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BKSArIGdlb21fcG9pbnQoYWxwaGE9MC4xLCBzaXplPTIpICsgZ2d0aXRsZSgiT3J0aG9wdGVyYSBzcC4xIikNCg0KDQpgYGANCg0KDQoNCiMjIExlYWYgYmVldGxlIHBvcHVsYXRpb24gZHluYW1pY3MgYW5hbHlzaXMgKEZpZy4xKQ0KIyMjIEluY29ycG9yYXRpbmcgbmVzdGVkIHN0cnVjdHVyZQ0KYGBge3J9DQpjaGFtYmVyIDwtIGFwcGVuZChyZXAoIkMxIiwxNikscmVwKCJDMiIsMzIpKQ0KdWRzX2RhdGFfYWxsX0xCYSA8LSBjYmluZC5kYXRhLmZyYW1lKHVkc19kYXRhX2FsbF9MQmEsIGNoYW1iZXIpDQp1ZHNfZGF0YV9hbGxfTEJhDQpgYGANCiMjIyBSZXBlYXRlZCBBTk9WQSB3aXRoIGF1dG9yZWdyZXNzaW9uDQpSZWY6IGh0dHA6Ly9yY29tcGFuaW9uLm9yZy9oYW5kYm9vay9JXzA5Lmh0bWwNCmBgYHtyfQ0KI0RhdGEgZGVjb21wb3NpdGlvbg0KdWRzX2RhdGFfTEJhMjRoIDwtIHN1YnNldCh1ZHNfZGF0YV9hbGxfTEJhLCB1ZHNfZGF0YV9hbGxfTEJhJGRheT09MSkNCnVkc19kYXRhX0xCYTJfN2QgPC0gc3Vic2V0KHVkc19kYXRhX2FsbF9MQmEsICh1ZHNfZGF0YV9hbGxfTEJhJGRheSA+PSAyICYgdWRzX2RhdGFfYWxsX0xCYSRkYXkgPD0gNykpDQp1ZHNfZGF0YV9MQmExMF82MGQgPC0gc3Vic2V0KHVkc19kYXRhX2FsbF9MQmEsICh1ZHNfZGF0YV9hbGxfTEJhJGRheSA+PSAxMCAmIHVkc19kYXRhX2FsbF9MQmEkZGF5IDw9IDYwKSkNCmBgYA0KIyMjIyBob3VyIHNjYWxlIChGaWcuMWEpDQpgYGB7cn0NCiNzaG9ydCAoRmlnLjFhKQ0KbW9kZWwyNGhfMCA9IGdscyhhZHVsdCB+IGNoYW1iZXIgKyBob3VyICsgY2hhbWJlcipob3VyLGRhdGE9dWRzX2RhdGFfTEJhMjRoKQ0KI0Fub3ZhKG1vZGVsMjRoXzApDQpBQ0ZfcyA8LSBBQ0YobW9kZWwyNGhfMCwgZm9ybSA9IH4gaG91cnxpZCkNCmhlYWQoQUNGX3MpDQptb2RlbDI0aCA9IGdscyhhZHVsdCB+IGNoYW1iZXIgKyBob3VyICsgY2hhbWJlcipob3VyLCBjb3JyZWxhdGlvbiA9IGNvckFSMShmb3JtID0gfiBob3VyfGlkLCB2YWx1ZSA9IEFDRl9zJEFDRlsyXSksZGF0YT11ZHNfZGF0YV9MQmEyNGgpDQpBbm92YShtb2RlbDI0aCkNCiNQb3N0LWhvYyB0ZXN0DQpkYXRhMTJoPC1zdWJzZXQodWRzX2RhdGFfTEJhMjRoLCBob3VyPT0xMikNCnBhaXJ3aXNlLnQudGVzdChkYXRhMTJoJGFkdWx0LCBkYXRhMTJoJGNoYW1iZXIscC5hZGp1c3QubWV0aG9kPSJob2xtIikNCnBhaXJ3aXNlLnQudGVzdChkYXRhMTJoJGFkdWx0Wy1jKDE6MTYpXSxkYXRhMTJoJHRyZWF0bWVudFstYygxOjE2KV0scC5hZGp1c3QubWV0aG9kPSJob2xtIikNCg0KZGF0YTI0aDwtc3Vic2V0KHVkc19kYXRhX0xCYTI0aCwgaG91cj09MjQpDQpwYWlyd2lzZS50LnRlc3QoZGF0YTI0aCRhZHVsdCwgZGF0YTI0aCRjaGFtYmVyLHAuYWRqdXN0Lm1ldGhvZD0iaG9sbSIpDQpwYWlyd2lzZS50LnRlc3QoZGF0YTEyaCRhZHVsdFstYygxOjE2KV0sIGRhdGExMmgkdHJlYXRtZW50Wy1jKDE6MTYpXSxwLmFkanVzdC5tZXRob2Q9ImhvbG0iKQ0KDQojU3VtbWFyeSBzdGF0aXN0aWNzIGZvciBncmFwaA0Kc3VtMjRoID0gZ3JvdXB3aXNlTWVhbihhZHVsdCB+IHRyZWF0bWVudCArIGhvdXIsIGRhdGEgPSB1ZHNfZGF0YV9MQmEyNGgsIGNvbmYgPSAwLjk1LCBkaWdpdHMgPSAzLHRyYWRpdGlvbmFsID0gRkFMU0UsIHBlcmNlbnRpbGUgID0gVFJVRSkNCnN1bTI0aA0KDQojc2hvcnRlc3QgZ3JhcGggKEZpZy4xYSkNCnBkID0gcG9zaXRpb25fZG9kZ2UoMSkNCmdfbGluZTwtZ2dwbG90KHN1bTI0aCwgYWVzKHk9TWVhbiwgeD1ob3VyKSkgKyB4bGltKDAsMjUpICsgeWxpbSgwLDEuMSkgKyBjb29yZF9maXhlZCgyNS8xLjEpDQpnX2xpbmU8LWdfbGluZStnZW9tX2xpbmUoYWVzKGNvbG91cj10cmVhdG1lbnQpLHNpemU9MSxwb3NpdGlvbj1wZCkgDQpnX2xpbmU8LSBnX2xpbmUrIGdlb21fZXJyb3JiYXIoYWVzKHltaW49UGVyY2VudGlsZS5sb3dlciwgeW1heCA9IFBlcmNlbnRpbGUudXBwZXIsIGNvbG91cj10cmVhdG1lbnQpLGFscGhhPTAuOSxzaXplPTEsIHdpZHRoPTAsIHBvc2l0aW9uPXBkKQ0KZ19saW5lPC1nX2xpbmUrZ2VvbV9wb2ludChhZXMoY29sb3VyPXRyZWF0bWVudCwgc2hhcGU9dHJlYXRtZW50KSxzaXplPTMsYWxwaGE9MS4wLCBwb3NpdGlvbj1wZCkgDQpwcmludChnX2xpbmUpDQpgYGANCiMjIyMgU3VtbWFyeSBvZiBob3VyIHNjYWxlIHJlc3VsdHMgKEZpZy4xYSkNCi0gVGhlcmUgd2VyZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGJldC4gVSB2cyAoUyArIEQpLCBpLmUuLCBjaGFtYmVyIGVmZmVjdC4NCi0gQnkgdGhlIGFkZC1ob2MgdGVzdCwNCiAgLSB0aGVyZSB3ZXJlIGRpZmZlcmVuY2VzIGJldC4gVSB2cyAoUyArIEQpIGF0IDEyIGggYW5kIDI0IGggDQogIC0gYnV0IG5vIGRpZmZlcmVuY2VzIGJldC4gUyB2cyBEIGVpdGhlci4gDQoNCiMjIyMgYSB3ZWVrIHNjYWxlIChGaWcuMWIpDQpgYGB7cn0NCiNtaWRkbGUgKEZpZy4xYikNCm1vZGVsMl83ZDAgPSBnbHMoYWR1bHQgfiBjaGFtYmVyICsgZGF5ICsgY2hhbWJlcipkYXksZGF0YT11ZHNfZGF0YV9MQmEyXzdkKQ0KI0Fub3ZhKG1vZGVsMl83ZDApDQpBQ0ZfbSA8LSBBQ0YobW9kZWwyXzdkMCwgZm9ybSA9IH4gZGF5fGlkKQ0KaGVhZChBQ0ZfbSkNCm1vZGVsMl83ZCA9IGdscyhhZHVsdCB+IGNoYW1iZXIgKyBkYXkgKyBjaGFtYmVyKmRheSwgY29ycmVsYXRpb24gPSBjb3JBUjEoZm9ybSA9IH4gZGF5fGlkLCB2YWx1ZSA9IEFDRl9tJEFDRlsyXSksZGF0YT11ZHNfZGF0YV9MQmEyXzdkKQ0KQW5vdmEobW9kZWwyXzdkKQ0KI1Bvc3QtaG9jIHRlc3QNCmRhdGE3ZDwtc3Vic2V0KHVkc19kYXRhX0xCYTJfN2QsIGRheT09NykNCnBhaXJ3aXNlLnQudGVzdChkYXRhN2QkYWR1bHQsIGRhdGE3ZCRjaGFtYmVyLHAuYWRqdXN0Lm1ldGhvZD0iaG9sbSIpDQpwYWlyd2lzZS50LnRlc3QoZGF0YTdkJGFkdWx0Wy1jKDE6MTYpXSwgZGF0YTdkJHRyZWF0bWVudFstYygxOjE2KV0scC5hZGp1c3QubWV0aG9kPSJob2xtIikNCg0KI1N1bW1hcnkgc3RhdGlzdGljcyBmb3IgZ3JhcGgNCnN1bTJfN2QgPSBncm91cHdpc2VNZWFuKGFkdWx0IH4gdHJlYXRtZW50ICsgZGF5LCBkYXRhID0gdWRzX2RhdGFfTEJhMl83ZCwgY29uZiA9IDAuOTUsIGRpZ2l0cyA9IDMsdHJhZGl0aW9uYWwgPSBGQUxTRSwgcGVyY2VudGlsZSAgPSBUUlVFKQ0KDQojYSB3ZWVrIHNjYWxlIGdyYXBoIChGaWcuMWIpDQpwZCA9IHBvc2l0aW9uX2RvZGdlKDAuMykNCmdfbGluZTwtZ2dwbG90KHN1bTJfN2QsIGFlcyh5PU1lYW4sIHg9ZGF5KSkgKyB4bGltKDEsOCkgKyB5bGltKDAsMS4xKSArIGNvb3JkX2ZpeGVkKDcvMi4wKQ0KZ19saW5lPC1nX2xpbmUrZ2VvbV9saW5lKGFlcyhjb2xvdXI9dHJlYXRtZW50KSxzaXplPTEsIHBvc2l0aW9uPXBkKSANCmdfbGluZTwtIGdfbGluZSsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1QZXJjZW50aWxlLmxvd2VyLCB5bWF4ID0gUGVyY2VudGlsZS51cHBlciwgY29sb3VyPXRyZWF0bWVudCksYWxwaGE9MC45LHNpemU9MSwgd2lkdGg9MCwgcG9zaXRpb249cGQpDQpnX2xpbmU8LWdfbGluZStnZW9tX3BvaW50KGFlcyhjb2xvdXI9dHJlYXRtZW50LCBzaGFwZT10cmVhdG1lbnQpLHNpemU9MyxhbHBoYT0xLjAsIHBvc2l0aW9uPXBkKSANCnByaW50KGdfbGluZSkNCmBgYA0KDQojIyMjIFN1bW1hcnkgb2YgYSB3ZWVrIHNjYWxlIHJlc3VsdHMgKEZpZy4xYikNCi0gVGhlcmUgd2FzIG5vIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXQuIFUgdnMgKFMgKyBEKSwgaS5lLiwgY2hhbWJlciBlZmZlY3QuDQotIEJ5IHRoZSBhZGQtaG9jIHRlc3QsDQogIC0gdGhlcmUgd2FzIG5vIGRpZmZlcmVuY2UgYmV0LiBVIHZzIChTICsgRCkgYXQgN2QNCiAgLSBidXQgbm8gZGlmZmVyZW5jZXMgYmV0LiBTIHZzIEQgZWl0aGVyLiANCg0KIyMjIyBtb250aGx5IHNjYWxlIChGaWcuMWMpDQpgYGB7cn0NCm1vZGVsMTBfNjBkMCA9IGdscyhhZHVsdCB+IGNoYW1iZXIgKyBkYXkgKyBjaGFtYmVyKmRheSwgZGF0YT11ZHNfZGF0YV9MQmExMF82MGQpDQojQW5vdmEobW9kZWwxMF82MGQwKQ0KQUNGX2wgPC0gQUNGKG1vZGVsMTBfNjBkMCwgZm9ybSA9IH4gZGF5fGlkKQ0KaGVhZChBQ0ZfbCkNCm1vZGVsMTBfNjBkID0gZ2xzKGFkdWx0IH4gY2hhbWJlciArIGRheSArIGNoYW1iZXIqZGF5LCBjb3JyZWxhdGlvbiA9IGNvckFSMShmb3JtID0gfiBkYXl8aWQsIHZhbHVlID0gQUNGX2wkQUNGWzJdKSxkYXRhPXVkc19kYXRhX0xCYTEwXzYwZCkNCkFub3ZhKG1vZGVsMTBfNjBkKQ0KI1Bvc3QtaG9jIHRlc3QNCmRhdGExMGQ8LXN1YnNldCh1ZHNfZGF0YV9MQmExMF82MGQsIGRheT09MTApDQpwYWlyd2lzZS50LnRlc3QoZGF0YTEwZCRhZHVsdCwgZGF0YTEwZCRjaGFtYmVyLHAuYWRqdXN0Lm1ldGhvZD0iaG9sbSIpDQpwYWlyd2lzZS50LnRlc3QoZGF0YTEwZCRhZHVsdFstYygxOjE2KV0sIGRhdGExMGQkdHJlYXRtZW50Wy1jKDE6MTYpXSxwLmFkanVzdC5tZXRob2Q9ImhvbG0iKQ0KDQojU3VtbWFyeSBzdGF0aXN0aWNzIGZvciBncmFwaA0Kc3VtMTBfNjBkID0gZ3JvdXB3aXNlTWVhbihhZHVsdCB+IHRyZWF0bWVudCArIGRheSwgZGF0YSA9IHVkc19kYXRhX0xCYTEwXzYwZCwgY29uZiA9IDAuOTUsIGRpZ2l0cyA9IDMsdHJhZGl0aW9uYWwgPSBGQUxTRSwgcGVyY2VudGlsZSAgPSBUUlVFKQ0KDQojZ3JhcGhpY3MNCnBkID0gcG9zaXRpb25fZG9kZ2UoMykNCmdfbGluZTwtZ2dwbG90KHN1bTEwXzYwZCwgYWVzKHk9TWVhbiwgeD1kYXkpKSArIHhsaW0oNSw2NSkgKyB5bGltKDAsNCkgKyBjb29yZF9maXhlZChyYXRpbyA9IDYwLzQpDQpnX2xpbmU8LWdfbGluZStnZW9tX2xpbmUoYWVzKGNvbG91cj10cmVhdG1lbnQpLHNpemU9MSwgcG9zaXRpb249cGQpIA0KZ19saW5lPC0gZ19saW5lK2dlb21fZXJyb3JiYXIoYWVzKHltaW49UGVyY2VudGlsZS5sb3dlciwgeW1heCA9IFBlcmNlbnRpbGUudXBwZXIsIGNvbG91cj10cmVhdG1lbnQpLGFscGhhPTAuOSxzaXplPTEsIHdpZHRoPTAsIHBvc2l0aW9uPXBkKQ0KZ19saW5lPC1nX2xpbmUrZ2VvbV9wb2ludChhZXMoY29sb3VyPXRyZWF0bWVudCwgc2hhcGU9dHJlYXRtZW50KSxzaXplPTMsYWxwaGE9MS4wLCBwb3NpdGlvbj1wZCkgDQpwcmludChnX2xpbmUpDQpgYGANCg0KIyMjIyBTdW1tYXJ5IG9mIG1vbnRobHkgc2NhbGUgcmVzdWx0cyAoRmlnLjFjKQ0KLSBUaGVyZSB3YXMgbm8gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldC4gVSB2cyAoUyArIEQpLCBpLmUuLCBjaGFtYmVyIGVmZmVjdC4NCi0gQnkgdGhlIGFkZC1ob2MgdGVzdCwNCiAgLSB0aGVyZSB3YXMgbm8gZGlmZmVyZW5jZSBiZXQuIFUgdnMgKFMgKyBEKSBhdCAxMGQNCiAgLSBidXQgYSBkaWZmZXJlbmNlIGJldC4gUyB2cyBEIGF0IDEwZC4gDQoNCiMjIE9yZGluYXRpb25zIGZvciBjb21tdW5pdHkgY29tcG9zaXRpb24NCiMjIyBQcmVwYXJpbmcgdGhlIGZ1bmN0aW9uIGZvciBGaWcuMiAmIEZpZy5TMQ0KYGBge3J9DQpkaXNwZXJfdWRzX2NlbnRyb2lkX2dyYXBoIDwtIGZ1bmN0aW9uKGRhdGFfbmFtZSwgY19MQiwgbWV0aCwgYWRqPU5VTEwsIHR5cGU9InZpb2xpbiIsIGxpbV9taW49LTAuNiwgbGltX21heD0wLjQpIHsNCiAgaWYoY19MQiA9PSAid0xCIikgew0KICAgIHVkc19kYXRhMSA8LXN1YnNldChkYXRhX25hbWUsIGFidW5kYW5jZSA+IDApICAjZGVsZXRlIHRoZSBzYW1wbGluZyBkYXRhIHdpdGggMCB0b3RhbCBhYnVuZGFuY2Ugd2hlbiBsZWFmIGJlZXRsZQ0KICAgIHVkc19lYWNoPC11ZHNfZGF0YTFbLGMoLTEsLTIsLTMsIC03NywtNzgsIC03OSwgLTgwKV0NCiAgfSAgI1doZW4gbGVhZiBiZWVsZSBpcyBpbmNsdWRlZA0KICBpZihjX0xCID09ICJ3b0xCIikgew0KICAgIHVkc19kYXRhMSA8LXN1YnNldChkYXRhX25hbWUsIGFidW5kYW5jZTIgPiAwKSAjT1IsIGRlbGV0ZSB0aGUgc2FtcGxpbmcgd2hlbiBzcGVjaWVzIG90aGVyIHRoYW4gbGVhZiBiZWV0bGUgZG9lcyBub3QgZXhpc3QNCiAgICB1ZHNfZWFjaDwtdWRzX2RhdGExWyxjKC0xLC0yLC0zLC00LC03NywtNzgsLTc5LCAtODApXQ0KICB9ICAjV2hlbiBsZWFmIGJlZWxlIGlzIE5PVCBpbmNsdWRlZA0KICBpZihjX0xCID09ICJMQm9ubHkiKSB7DQogICAgdWRzX2RhdGExIDwtIHN1YnNldChkYXRhX25hbWUsIGFidW5kYW5jZTIgPiAwKQ0KICAgIHVkc19lYWNoIDwtIHN1YnNldCh1ZHNfZGF0YTEsIGRheT09ZGF0ZSlbLCBjKDQpXSAgI3BpY2tpbmcgdXAgTEIgb25seQ0KICB9DQogIA0KICBzYW1wbGVfZWFjaCA8LSB1ZHNfZGF0YTEkc2FtcGxlDQogICNtZXRoPSJjaGFvIg0KICB1ZHNfYnJheV9lYWNoMC5kPC12ZWdkaXN0KHVkc19lYWNoLCBtZXRob2Q9bWV0aCkNCiAgaWYoY19MQiA9PSAiTEJvbmx5IikgdHAgPC0gImNlbnRyb2lkIg0KICBlbHNlIHRwIDwtICJtZWRpYW4iDQogIHVkc19kaXN0X2VhY2gwIDwtYmV0YWRpc3Blcih1ZHNfYnJheV9lYWNoMC5kLCBzYW1wbGVfZWFjaCwgdHlwZT10cCwgYmlhcy5hZGp1c3QgPSBUUlVFKQ0KICB1ZHNfbWVkaWFuIDwtIGRhdGEuZnJhbWUodWRzX2Rpc3RfZWFjaDAkY2VudHJvaWRzKSAgI2NhbGN1bGF0ZSB0aGUgY2VudHJvaWQgKHNwYXRpYWwgbWVkaWFuKSBmb3IgcmVwZWF0ZWQgbWVhc3VyZXMNCiAgDQogIHNhbXBsZSA8LSByb3cubmFtZXModWRzX21lZGlhbikNCiAgI3NhbXBsZSA8LSBzYW1wbGVfZWFjaA0KICAjUmVwbGFjZSB0aGUgc2FtcGxlIG5hbWUgaW50byB0aGUgdHJlYXRtZW50DQogIHNhbXBsZVtncmVwKCIxbiIsIHNhbXBsZSldPC0gIlUxMCINCiAgc2FtcGxlW2dyZXAoIjJuIiwgc2FtcGxlKV08LSAiVTMyIg0KICBzYW1wbGVbZ3JlcCgiM24iLCBzYW1wbGUpXTwtICJVNjAiDQogIHNhbXBsZVtncmVwKCIxdCIsIHNhbXBsZSldPC0gIlMxMCINCiAgc2FtcGxlW2dyZXAoIjJ0Iiwgc2FtcGxlKV08LSAiUzMyIg0KICBzYW1wbGVbZ3JlcCgiM3QiLCBzYW1wbGUpXTwtICJTNjAiDQogIHNhbXBsZVtncmVwKCIxdyIsIHNhbXBsZSldPC0gIkQxMCINCiAgc2FtcGxlW2dyZXAoIjJ3Iiwgc2FtcGxlKV08LSAiRDMyIg0KICBzYW1wbGVbZ3JlcCgiM3ciLCBzYW1wbGUpXTwtICJENjAiDQogIA0KICB0cmVhdG1lbnRfZWFjaCA8LSBhcy5mYWN0b3Ioc2FtcGxlKSAjanVzdCBjb252ZXJzaW9uDQoNCiAgdWRzX2VhY2guZDwtdmVnZGlzdCh1ZHNfbWVkaWFuLCBtZXRob2Q9ImV1Y2xpZGVhbiIpDQoNCiAgdWRzX2Rpc3RfZWFjaCA8LWJldGFkaXNwZXIodWRzX2VhY2guZCwgdHJlYXRtZW50X2VhY2gsIHR5cGU9ImNlbnRyb2lkIiwgYmlhcy5hZGp1c3QgPSBUUlVFKSAgI0Nob29zZSBjZW50cm9pZCBiZWNhdXNlIG9mIGV1Y2xpZGVhbiBkaXN0YW5jZQ0KICAjUGxvdA0KICBpZihjX0xCID09ICJMQm9ubHkiKSBib3hwbG90KHVkc19kaXN0X2VhY2gpDQogIGVsc2Ugew0KICAgICNib3hwbG90KHVkc19kaXN0X2VhY2gpDQogICAgI29yZGlwbG90KHVkc19kaXN0X2VhY2gkY2VudHJvaWRzLCB0eXBlPSJ0ZXh0IiwgY2hvaWNlcz1jKDEsMiksIGNleD0xLCB4bGltPWMoLTAuNiwwLjQpLCB5bGltPWMoLTAuNiwgMC41KSkNCiAgICAjcGFyKG5ldz1UKQ0KDQogICAgaWYodHlwZSA9PSAidmlvbGluIikgew0KICAgICAgI2JveHBsb3QodWRzX2Rpc3RfZWFjaCkNCiAgICAgICMjZnJvbSBnZ3Bsb3QyDQogICAgICAjY29udmVydCB0byBkYXRhLmZyYW1lICh3aGljaCBpcyBuZWNlc3NhcnkgZm9yIGdncGxvdDIpDQogICAgICANCiAgICAgIHVkc19kaXN0X2VhY2gyIDwtIGNiaW5kLmRhdGEuZnJhbWUodWRzX2Rpc3RfZWFjaCRkaXN0YW5jZXMsIGFzLmNoYXJhY3Rlcih1ZHNfZGlzdF9lYWNoJGdyb3VwKSkNCiAgICAgIA0KICAgICAgdHJlYXRtZW50PC1hcy5jaGFyYWN0ZXIodWRzX2Rpc3RfZWFjaCRncm91cCkNCiAgICAgICNSZXBsYWNlIHRoZSBzYW1wbGUgbmFtZSBpbnRvIHRoZSB0cmVhdG1lbnQNCiAgICAgIHRyZWF0bWVudFtncmVwKCJVIiwgdHJlYXRtZW50KV08LSAiVSINCiAgICAgIHRyZWF0bWVudFtncmVwKCJEIiwgdHJlYXRtZW50KV08LSAiRCINCiAgICAgIHRyZWF0bWVudFtncmVwKCJTIiwgdHJlYXRtZW50KV08LSAiUyINCiAgICAgIA0KICAgICAgdWRzX2Rpc3RfZWFjaDI8LWNiaW5kLmRhdGEuZnJhbWUodWRzX2Rpc3RfZWFjaDIsIHRyZWF0bWVudCkgIA0KICAgICAgY29sbmFtZXModWRzX2Rpc3RfZWFjaDIpIDwtIGMoImRpc3RhbmNlcyIsICJncm91cCIsICJ0cmVhdG1lbnQiKQ0KICAgICAgdWRzX2Rpc3RfZWFjaDIkZGlzdGFuY2VzIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHVkc19kaXN0X2VhY2gyJGRpc3RhbmNlcykpDQogICAgICANCiAgICAgIGdfYm94PC1nZ3Bsb3QodWRzX2Rpc3RfZWFjaDIsIGFlcyh5PWRpc3RhbmNlcywgeD1ncm91cCxjb2xvdXI9dHJlYXRtZW50KSkNCiAgICAgIGdfYm94PC1nX2JveCArIGdlb21fdmlvbGluKCkNCiAgICAgIGdfYm94PC1nX2JveCArIGdlb21fYm94cGxvdChmaWxsPSJibGFjayIsIHdpZHRoPTAuMSkgDQogICAgICBnX2JveDwtZ19ib3ggKyBjb29yZF9maXhlZChyYXRpbyA9IDE1LzEpDQogICAgICBwcmludChnX2JveCkNCiAgICB9ICAgICAgDQogICAgICBlbHNlIGlmKHR5cGUgPT0gIlBDb0EiKSB7DQogICAgICAgICNQQ29BIA0KICAgICAgICB0ZXN0MDwtY2Fwc2NhbGUodWRzX2VhY2guZH4xKSAgDQogICAgICAgIHRlc3Q8LWNtZHNjYWxlKHVkc19lYWNoLmQsIGVpZz1GQUxTRSwgayA9IDIpDQogICAgICAgICNwcmVwYXJlIGRhdGFmcmFtZSBmb3IgZWFjaCBwb2ludA0KICAgICAgICB0ZXN0Mjwtc3VtbWFyeSh0ZXN0KQ0KICAgICAgICAjdWRzX2Rpc3RfZWFjaF90ZXN0PC1kYXRhLmZyYW1lKFBDb0ExPS10ZXN0MiRzaXRlc1ssMV0sIFBDb0EyPS10ZXN0MiRzaXRlc1ssMl0pDQogICAgICAgIHVkc19kaXN0X2VhY2hfdGVzdDwtYXMuZGF0YS5mcmFtZSh0ZXN0KQ0KICAgICAgICB1ZHNfZGlzdF9lYWNoX3Rlc3Q8LWNiaW5kLmRhdGEuZnJhbWUoc2FtcGxlLCB1ZHNfZGlzdF9lYWNoX3Rlc3QpDQogICAgICAgIHRyZWF0bWVudDwtYXMuY2hhcmFjdGVyKHNhbXBsZSkNCiAgICAgICAgZGF5PC1hcy5jaGFyYWN0ZXIoc2FtcGxlKQ0KICAgICAgICAjUmVwbGFjZSB0aGUgc2FtcGxlIG5hbWUgaW50byB0aGUgdHJlYXRtZW50ICYgZGF5DQogICAgICAgIHRyZWF0bWVudFtncmVwKCJVIiwgdHJlYXRtZW50KV08LSAiVSINCiAgICAgICAgdHJlYXRtZW50W2dyZXAoIkQiLCB0cmVhdG1lbnQpXTwtICJEIg0KICAgICAgICB0cmVhdG1lbnRbZ3JlcCgiUyIsIHRyZWF0bWVudCldPC0gIlMiDQogICAgICAgIGRheVtncmVwKCIxMCIsIGRheSldPC0iRGF5MTAiDQogICAgICAgIGRheVtncmVwKCIzMiIsIGRheSldPC0iRGF5MzIiDQogICAgICAgIGRheVtncmVwKCI2MCIsIGRheSldPC0iRGF5NjAiDQogICAgICAgIA0KICAgICAgICB1ZHNfZGlzdF9lYWNoX3Rlc3Q8LWNiaW5kLmRhdGEuZnJhbWUoY2JpbmQuZGF0YS5mcmFtZSh0cmVhdG1lbnQsIGRheSksIHVkc19kaXN0X2VhY2hfdGVzdCkNCiAgICAgICAgY29sbmFtZXModWRzX2Rpc3RfZWFjaF90ZXN0KTwtYygidHJlYXRtZW50IiwgImRheSIsICJncm91cCIsICJQQ29BMSIsICJQQ29BMiIpDQogICAgICAgIGNsYXNzKHVkc19kaXN0X2VhY2hfdGVzdCRkYXkpDQogICAgICAgICNwcmVwYXJlIGRhdGFmcmFtZSBmb3IgY2VudHJvaWQNCiAgICAgICAgdWRzX2Rpc3RfZWFjaF9jZW50cjwtYXMuZGF0YS5mcmFtZSh1ZHNfZGlzdF9lYWNoJGNlbnRyb2lkcykNCiAgICAgICAgdHJlYXRtZW50PC1hcy5jaGFyYWN0ZXIocm93bmFtZXModWRzX2Rpc3RfZWFjaF9jZW50cikpDQogICAgICAgIGRheTwtYXMuY2hhcmFjdGVyKHJvd25hbWVzKHVkc19kaXN0X2VhY2hfY2VudHIpKQ0KICAgICAgICAjUmVwbGFjZSB0aGUgc2FtcGxlIG5hbWUgaW50byB0aGUgdHJlYXRtZW50ICYgZGF5DQogICAgICAgIHRyZWF0bWVudFtncmVwKCJVIiwgdHJlYXRtZW50KV08LSAiVSINCiAgICAgICAgdHJlYXRtZW50W2dyZXAoIkQiLCB0cmVhdG1lbnQpXTwtICJEIg0KICAgICAgICB0cmVhdG1lbnRbZ3JlcCgiUyIsIHRyZWF0bWVudCldPC0gIlMiDQogICAgICAgIGRheVtncmVwKCIxMCIsIGRheSldPC0iRGF5MTAiDQogICAgICAgIGRheVtncmVwKCIzMiIsIGRheSldPC0iRGF5MzIiDQogICAgICAgIGRheVtncmVwKCI2MCIsIGRheSldPC0iRGF5NjAiDQogICAgICAgIA0KICAgICAgICB1ZHNfZGlzdF9lYWNoX2NlbnRyPC1jYmluZC5kYXRhLmZyYW1lKHVkc19kaXN0X2VhY2hfY2VudHIsIGRhdGEuZnJhbWUodHJlYXRtZW50PXRyZWF0bWVudCwgZGF5PWRheSwgZ3JvdXA9cm93bmFtZXModWRzX2Rpc3RfZWFjaF9jZW50cikpKQ0KICAgICAgICANCiAgICAgICAgZ19QQ29BIDwtIGdncGxvdCh1ZHNfZGlzdF9lYWNoX3Rlc3QsIGFlcyh4PVBDb0ExLHk9UENvQTIpKQ0KICAgICAgICBnX1BDb0EgPC0gZ19QQ29BICsgZ2VvbV9wb2ludChhZXMoY29sb3VyPXRyZWF0bWVudCwgc2hhcGU9ZGF5KSwgc2l6ZT0zLCBhbHBoYT0wLjUpDQogICAgICAgIGdfUENvQSA8LSBnX1BDb0EgKyB4bGltKGxpbV9taW4sIGxpbV9tYXgpICsgeWxpbShsaW1fbWluLGxpbV9tYXgpICsgY29vcmRfZml4ZWQocmF0aW8gPSAxLzEpDQogICAgICAgICNBZGQgdGhlIGNlbnRyb2lkIGluZm9ybWF0aW9uDQogICAgICAgIGdfUENvQSA8LSBnX1BDb0EgKyBsYXllcigNCiAgICAgICAgICBkYXRhPXVkc19kaXN0X2VhY2hfY2VudHIsIA0KICAgICAgICAgIG1hcHBpbmc9YWVzKHg9UENvQTEsIHk9UENvQTIsIGNvbG91cj10cmVhdG1lbnQsIHNoYXBlPWRheSksIA0KICAgICAgICAgIHBhcmFtcz1saXN0KHNpemU9NSksDQogICAgICAgICAgZ2VvbT0icG9pbnQiLCANCiAgICAgICAgICBzdGF0PSJpZGVudGl0eSIsIA0KICAgICAgICAgIHBvc2l0aW9uPSJpZGVudGl0eSINCiAgICAgICAgKQ0KICAgICAgICBwcmludChnX1BDb0EpDQogICAgICAgDQogICAgICAgICNQZXJmb3JtYW5jZSBvZiBQQ29BICBodHRwOi8vZC5oYXRlbmEubmUuanAvaG94b19tLzIwMTIwMzEzL3AxDQogICAgICAgIHN1bW1hcnkodGVzdDApDQogICAgfQ0KICB9DQogIA0KICAjUGVyZm9ybWFuY2Ugb2YgUENvQSAgaHR0cDovL2QuaGF0ZW5hLm5lLmpwL2hveG9fbS8yMDEyMDMxMy9wMQ0KICAjc3VtbWFyeSh0ZXN0MCkNCiAgDQogIGlmKHR5cGUgPT0gIk5NRFMiKSB7DQogICAgdWRzX2VhY2gubWRzPC1tZXRhTURTKHVkc19tZWRpYW4sIGRpc3RhbmNlPSJldWNsaWRlYW4iKQ0KICAgIHJvd25hbWVzKHVkc19lYWNoLm1kcyRwb2ludHMpPC10cmVhdG1lbnRfZWFjaA0KICAgIG9yZGlwbG90KHVkc19lYWNoLm1kcyRwb2ludHMsIHR5cGU9J3BvaW50cycsIHhsaW09YygtMS4wLCAxLjApKQ0KICAgIHRleHQodWRzX2VhY2gubWRzJHBvaW50cyxsYWJlbHM9dHJlYXRtZW50X2VhY2gsIGNvbD11bmNsYXNzKHRyZWF0bWVudF9lYWNoKSxjZXg9MC44KQ0KICB9DQoNCn0NCmBgYA0KIyMjIEZpZ3VyZSAyYSAmIDJiDQotIFdpdGggZXhjbHVkaW5nIGxlYWYgYmVldGxlIGFuZCB1c2luZyBjaGFvIGRpc3RhbmNlDQpgYGB7cn0NCiNGaWd1cmUgMmENCmRpc3Blcl91ZHNfY2VudHJvaWRfZ3JhcGgoZGF0YV9uYW1lPXVkc19kYXRhX2FsbF9kYXkyLCBjX0xCPSJ3b0xCIiwgbWV0aD0iY2hhbyIsIHR5cGU9InZpb2xpbiIpDQojRmlndXJlIDJiDQpkaXNwZXJfdWRzX2NlbnRyb2lkX2dyYXBoKGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgY19MQj0id29MQiIsIG1ldGg9ImNoYW8iLCB0eXBlPSJQQ29BIikNCmBgYA0KIyMjIEZpZ3VyZSBTMQ0KLSAoYSkgVXNpbmcgYnJheS1jdXJ0aXMgZGlzc2ltaWxhcml0eSB3L28gTEINCi0gKGIpIFVzaW5nIENoYW8gZGlzc2ltaWxhcml0eSB3LyBMQg0KYGBge3J9DQojIyMjRm9yIEZpZ3VyZSBTMWENCmRpc3Blcl91ZHNfY2VudHJvaWRfZ3JhcGgoZGF0YV9uYW1lPXVkc19kYXRhX2FsbF9kYXkyLCBjX0xCPSJ3b0xCIiwgbWV0aD0iYnJheSIsIHR5cGU9IlBDb0EiLCBsaW1fbWluPS0wLjc1LCBsaW1fbWF4PTAuNSkgDQojIyMjRm9yIEZpZ3VyZSBTMWINCmRpc3Blcl91ZHNfY2VudHJvaWRfZ3JhcGgoZGF0YV9uYW1lPXVkc19kYXRhX2FsbF9kYXkyLCBjX0xCPSJ3TEIiLCBtZXRoPSJjaGFvIiwgdHlwZT0iUENvQSIsIGxpbV9taW49LTAuNzUsIGxpbV9tYXg9MC41KSAgIA0KYGBgDQoNCiMjIyBTdGF0aXN0aWNhbCB0ZXN0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXN1bHRzIHNob3duIGluIEZpZy4yDQojIyMjIERlZmluaXRpb25zIG9mIGZ1bmN0aW9ucyBmb3Qgc3RhdGlzdGljYWwgdGVzdA0KYGBge3J9DQojLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9QcmUtRXZhbHVhdGlvbiBvZiBlZmZlY3RpdmVuZXNzIG9mIFBFUk1BTk9WQSAob3IgY2FuIGJlIHVzZWQgZm9yIGFzc2Vzc2luZyBiZXRhIGRpdmVyc2l0eSkgdGhyb3VnaCBQRVJNRElTUCBmb3IgZWFjaCBvZiAxMGQsIDMyZCwgNjBkLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQpkaXNwZXJfdWRzX2NlbnRyb2lkIDwtIGZ1bmN0aW9uKGRhdGFfbmFtZSwgZGF0ZSwgY19MQiwgbWV0aCwgYWRqPU5VTEwsIHBsb3Q9ImJveCIsIGRpc3Rfb3V0PUZBTFNFKSB7DQogICAgDQogICAgaWYoY19MQiA9PSAid0xCIikgew0KICAgICAgdWRzX2RhdGExIDwtc3Vic2V0KGRhdGFfbmFtZSwgYWJ1bmRhbmNlID4gMCkgICNkZWxldGUgdGhlIHNhbXBsaW5nIGRhdGEgd2l0aCAwIHRvdGFsIGFidW5kYW5jZSB3aGVuIGxlYWYgYmVldGxlDQogICAgICB1ZHNfZWFjaDwtc3Vic2V0KHVkc19kYXRhMSwgZGF5PT1kYXRlKVssYygtMSwtMiwtMywgLTc3LC03OCwgLTc5LCAtODApXQ0KICAgIH0gICNXaGVuIGxlYWYgYmVldGxlIGlzIGluY2x1ZGVkDQogICAgaWYoY19MQiA9PSAid29MQiIpIHsNCiAgICAgIHVkc19kYXRhMSA8LXN1YnNldChkYXRhX25hbWUsIGFidW5kYW5jZTIgPiAwKSAjT1IsIGRlbGV0ZSB0aGUgc2FtcGxpbmcgd2hlbiBzcGVjaWVzIG90aGVyIHRoYW4gbGVhZiBiZWV0bGUgZG9lcyBub3QgZXhpc3QNCiAgICAgIHVkc19lYWNoPC1zdWJzZXQodWRzX2RhdGExLCBkYXk9PWRhdGUpWyxjKC0xLC0yLC0zLC00LC03NywtNzgsLTc5LCAtODApXQ0KICAgIH0gICNXaGVuIGxlYWYgYmVldGxlIGlzIE5PVCBpbmNsdWRlZCANCiAgDQogICAgaWYoY19MQiA9PSAiTEJvbmx5IikgeyAgI0ZvciBsZWFmIGJlZXRsZSBvbmx5IGJ1dCBjb25zaWRlciB0aGUgY2FzZSB3aXRoIG90aGVyIGluc2VjdHMgb25seQ0KICAgICAgdWRzX2RhdGExIDwtIHN1YnNldChkYXRhX25hbWUsIGFidW5kYW5jZTIgPiAwKQ0KICAgICAgI3Vkc19kYXRhMSA8LWRhdGFfbmFtZQ0KICAgICAgdWRzX2VhY2ggPC0gc3Vic2V0KHVkc19kYXRhMSwgZGF5PT1kYXRlKVssIGMoNCldICAjcGlja2luZyB1cCBMQiBvbmx5DQogICAgfQ0KICAgIA0KICAgIHNhbXBsZV9lYWNoIDwtIHN1YnNldCh1ZHNfZGF0YTEsIGRheT09ZGF0ZSkkc2FtcGxlDQogICAgI2xlbmd0aCh1ZHNfZWFjaCkNCiAgICAjbGVuZ3RoKHNhbXBsZV9lYWNoKQ0KICAgIA0KICAgICMjSW4gY2FzZSBvZiBsZWFmIGJlZXRsZSBvbmx5LCBkaWZmZXJlbnQgY2FsY3VsYXRpb24NCiAgICBpZihjX0xCID09ICJMQm9ubHkiKSB7DQogICAgICBzYW1wbGVfSUQ8LWFzLmZhY3RvcihzYW1wbGVfZWFjaCkNCiAgICAgIExCX2F2ZXJhZ2U8LXRhcHBseSh1ZHNfZWFjaCwgc2FtcGxlX0lELCBtZWFuKSAgI2NhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiBzaG9ydC10ZXJtIHJlcGVhdGVkIG1lYXN1cmVtZW50DQogICAgICBMQl9hdmVyYWdlMjwtTEJfYXZlcmFnZSAjanVzdCBjb3B5DQogICAgICBzYW1wbGUgPC0gcm93Lm5hbWVzKExCX2F2ZXJhZ2UyKQ0KICAgICAgc2FtcGxlMiA8LSByb3cubmFtZXMoTEJfYXZlcmFnZTIpDQogICAgICAjUmVwbGFjZSB0aGUgc2FtcGxlIG5hbWUgaW50byB0aGUgdHJlYXRtZW50DQogICAgICBzYW1wbGVbZ3JlcCgibiIsIHNhbXBsZSldPC0gIlUiICN1bmRhbWFnZWQNCiAgICAgIHNhbXBsZVtncmVwKCJ0Iiwgc2FtcGxlKV08LSAiUyIgI1NpZ25hbGVkDQogICAgICBzYW1wbGVbZ3JlcCgidyIsIHNhbXBsZSldPC0gIkQiICNEYW1hZ2VkDQogICAgICB0cmVhdG1lbnRfZWFjaCA8LSBhcy5mYWN0b3Ioc2FtcGxlKSAjanVzdCBjb252ZXJzaW9uDQogICAgICAjcHJpbnQodHJlYXRtZW50X2VhY2gpDQogICAgICANCiAgICAgICNSZXBsYWNlIHRoZSBzYW1wbGUgbmFtZSBpbnRvIHRoZSBjaGFtYmVyDQogICAgICBzYW1wbGUyW2dyZXAoIm4iLCBzYW1wbGUyKV08LSAiQzEiICN1bmRhbWFnZWQNCiAgICAgIHNhbXBsZTJbZ3JlcCgidCIsIHNhbXBsZTIpXTwtICJDMiIgI1NpZ25hbGVkDQogICAgICBzYW1wbGUyW2dyZXAoInciLCBzYW1wbGUyKV08LSAiQzIiICNEYW1hZ2VkDQogICAgICBjaGFtYmVyX2VhY2ggPC0gYXMuZmFjdG9yKHNhbXBsZTIpICNqdXN0IGNvbnZlcnNpb24NCiAgICAgIA0KICAgICAgYXZlcmFnZV90cmVhdG1lbnQ8LXRhcHBseShMQl9hdmVyYWdlLCB0cmVhdG1lbnRfZWFjaCwgbWVhbikgICAjY2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIFUsIEQsIFMsIHJlc3BlY3RpdmVseQ0KICAgICAgYXZlcmFnZV9jaGFtYmVyPC10YXBwbHkoTEJfYXZlcmFnZTIsIGNoYW1iZXJfZWFjaCwgbWVhbikgICAjY2FsY3VsYXRlIHRoZSBhdmVyYWdlIG9mIEMxIGFtZCBDMg0KICAgICAgI3ByaW50KGF2ZXJhZ2VfdHJlYXRtZW50KQ0KICAgICAgZm9yKGkgaW4gMTogbGVuZ3RoKExCX2F2ZXJhZ2UpKSB7ICAjbm9ybWFsaXppbmcgdGhlIG9yaWdpbmFsIGRhdGEgdG8gZXhjbHVkZSB0aGUgZWZmZWN0IG9mIGF2ZXJhZ2Ugb24gdGhlIGRpc3RhbmNlIHRvIGNlbnRyb2lkDQogICAgICAgIGlmKHRyZWF0bWVudF9lYWNoW2ldID09ICJEIiAmJiBhdmVyYWdlX3RyZWF0bWVudFsxXSA+IDAuMCkgTEJfYXZlcmFnZVtpXSA9IExCX2F2ZXJhZ2VbaV0vYXZlcmFnZV90cmVhdG1lbnRbMV0gDQogICAgICAgIGlmKHRyZWF0bWVudF9lYWNoW2ldID09ICJTIiAmJiBhdmVyYWdlX3RyZWF0bWVudFsyXSA+IDAuMCkgTEJfYXZlcmFnZVtpXSA9IExCX2F2ZXJhZ2VbaV0vYXZlcmFnZV90cmVhdG1lbnRbMl0NCiAgICAgICAgaWYodHJlYXRtZW50X2VhY2hbaV0gPT0gIlUiICYmIGF2ZXJhZ2VfdHJlYXRtZW50WzNdID4gMC4wKSBMQl9hdmVyYWdlW2ldID0gTEJfYXZlcmFnZVtpXS9hdmVyYWdlX3RyZWF0bWVudFszXQ0KICAgICAgfQ0KICAgICAgDQogICAgICBmb3IoaSBpbiAxOiBsZW5ndGgoTEJfYXZlcmFnZSkpIHsgICNub3JtYWxpemluZyB0aGUgb3JpZ2luYWwgZGF0YSB0byBleGNsdWRlIHRoZSBlZmZlY3Qgb2YgYXZlcmFnZSBvbiB0aGUgZGlzdGFuY2UgdG8gY2VudHJvaWQNCiAgICAgICAgaWYoY2hhbWJlcl9lYWNoW2ldID09ICJDMSIgJiYgYXZlcmFnZV9jaGFtYmVyWzFdID4gMC4wKSBMQl9hdmVyYWdlMltpXSA9IExCX2F2ZXJhZ2UyW2ldL2F2ZXJhZ2VfY2hhbWJlclsxXSANCiAgICAgICAgaWYoY2hhbWJlcl9lYWNoW2ldID09ICJDMiIgJiYgYXZlcmFnZV9jaGFtYmVyWzJdID4gMC4wKSBMQl9hdmVyYWdlMltpXSA9IExCX2F2ZXJhZ2UyW2ldL2F2ZXJhZ2VfY2hhbWJlclsyXQ0KICAgICAgfQ0KICAgICAgDQogICAgdWRzX21lZGlhbjwtTEJfYXZlcmFnZSAgI3NlbmQgdGhlIGRhdGEgZm9yIGZ1cnRoZXIgYW5hbHlzaXMsIGRpc3Rpbmd1aXNoaW5nIEQsUyxhbmQgVQ0KICAgIHVkc19tZWRpYW4yPC1MQl9hdmVyYWdlMiAgI3NlbmQgdGhlIGRhdGEgZm9yIGZ1cnRoZXIgYW5hbHlzaXMsIGRpc3Rpbmd1aXNoaW5nIEMxIGFuZCBDMg0KICAgICNwcmludCh1ZHNfbWVkaWFuKQ0KICAgIGlmKGRpc3Rfb3V0ID09ICJDMSIpIHVkc19tZWRpYW4gPC0gc3Vic2V0KHVkc19tZWRpYW4sIGNoYW1iZXJfZWFjaD09IkMxIikNCiAgICBlbHNlIGlmKGRpc3Rfb3V0ID09ICJDMiIpIHVkc19tZWRpYW4gPC0gc3Vic2V0KHVkc19tZWRpYW4sIGNoYW1iZXJfZWFjaD09IkMyIikNCiAgICAjcHJpbnQodWRzX21lZGlhbikNCiAgICB9DQogICAgDQogICAgZWxzZSB7DQogICAgICB1ZHNfYnJheV9lYWNoMC5kPC12ZWdkaXN0KHVkc19lYWNoLCBtZXRob2Q9bWV0aCkNCiAgICAgIA0KICAgICAgdHAgPC0gIm1lZGlhbiINCiAgICAgIHVkc19kaXN0X2VhY2gwIDwtYmV0YWRpc3Blcih1ZHNfYnJheV9lYWNoMC5kLCBzYW1wbGVfZWFjaCwgdHlwZT10cCwgYmlhcy5hZGp1c3QgPSBUUlVFKQ0KICAgICAgdWRzX21lZGlhbiA8LSBkYXRhLmZyYW1lKHVkc19kaXN0X2VhY2gwJGNlbnRyb2lkcykgICNjYWxjdWxhdGUgdGhlIGNlbnRyb2lkIChzcGF0aWFsIG1lZGlhbikgZm9yIHJlcGVhdGVkIG1lYXN1cmVzDQogICAgICANCiAgICAgIHNhbXBsZSA8LSByb3cubmFtZXModWRzX21lZGlhbikNCiAgICAgIHNhbXBsZTIgPC0gc2FtcGxlICNqdXN0IGNvcHkNCiAgICAgICNSZXBsYWNlIHRoZSBzYW1wbGUgbmFtZSBpbnRvIHRoZSB0cmVhdG1lbnQNCiAgICAgIHNhbXBsZVtncmVwKCJuIiwgc2FtcGxlKV08LSAiVSIgI3VuZGFtYWdlZA0KICAgICAgc2FtcGxlW2dyZXAoInQiLCBzYW1wbGUpXTwtICJTIiAjU2lnbmFsZWQNCiAgICAgIHNhbXBsZVtncmVwKCJ3Iiwgc2FtcGxlKV08LSAiRCIgI0RhbWFnZWQNCiAgICAgIHRyZWF0bWVudF9lYWNoIDwtIGFzLmZhY3RvcihzYW1wbGUpICNqdXN0IGNvbnZlcnNpb24NCiAgICAgICNSZXBsYWNlIHRoZSBzYW1wbGUgbmFtZSBpbnRvIHRoZSBjaGFtYmVyDQogICAgICBzYW1wbGUyW2dyZXAoIm4iLCBzYW1wbGUyKV08LSAiQzEiICN1bmRhbWFnZWQNCiAgICAgIHNhbXBsZTJbZ3JlcCgidCIsIHNhbXBsZTIpXTwtICJDMiIgI1NpZ25hbGVkDQogICAgICBzYW1wbGUyW2dyZXAoInciLCBzYW1wbGUyKV08LSAiQzIiICNEYW1hZ2VkDQogICAgICBjaGFtYmVyX2VhY2ggPC0gYXMuZmFjdG9yKHNhbXBsZTIpICNqdXN0IGNvbnZlcnNpb24NCiAgICAgIA0KICAgICAgaWYoZGlzdF9vdXQgPT0gIkMxIikgdWRzX21lZGlhbiA8LSB1ZHNfbWVkaWFuW2NoYW1iZXJfZWFjaD09IkMxIixdDQogICAgICBlbHNlIGlmKGRpc3Rfb3V0ID09ICJDMiIpIHVkc19tZWRpYW4gPC0gdWRzX21lZGlhbltjaGFtYmVyX2VhY2g9PSJDMiIsXQ0KICAgICAgI3ByaW50KHVkc19tZWRpYW4pDQogICAgfQ0KICAgIA0KICAgIA0KICAgIHVkc19lYWNoLmQ8LXZlZ2Rpc3QodWRzX21lZGlhbiwgbWV0aG9kPSJldWNsaWRlYW4iKQ0KICAgIGlmKGRpc3Rfb3V0IT0gRkFMU0UpIHJldHVybih1ZHNfZWFjaC5kKQ0KICAgIA0KICAgICN0cmVhdG1lbnRfZWFjaA0KICAgIHVkc19kaXN0X2VhY2ggPC1iZXRhZGlzcGVyKHVkc19lYWNoLmQsIHRyZWF0bWVudF9lYWNoLCB0eXBlPSJjZW50cm9pZCIsIGJpYXMuYWRqdXN0ID0gVFJVRSkgICNDaG9vc2UgY2VudHJvaWQgYmVjYXVzZSBvZiBldWNsaWRlYW4gZGlzdGFuY2UNCiAgICAjY2hhbWJlcl9lYWNoDQogICAgdWRzX2Rpc3RfZWFjaF9DIDwtYmV0YWRpc3Blcih1ZHNfZWFjaC5kLCBjaGFtYmVyX2VhY2gsIHR5cGU9ImNlbnRyb2lkIiwgYmlhcy5hZGp1c3QgPSBUUlVFKSAgDQogICAgI1Bsb3QNCiAgICBpZihjX0xCID09ICJMQm9ubHkiKSBib3hwbG90KHVkc19kaXN0X2VhY2gpDQogICAgZWxzZSB7DQogICAgICBpZihwbG90PT0iYm94Iikgew0KICAgICAgICBib3hwbG90KHVkc19kaXN0X2VhY2hfQykNCiAgICAgICAgYm94cGxvdCh1ZHNfZGlzdF9lYWNoKQ0KICAgICAgfQ0KICAgICAgZWxzZXsNCiAgICAgICAgcGxvdCh1ZHNfZGlzdF9lYWNoKQ0KICAgICAgICBvcmRpbGFiZWwoc2NvcmVzKHVkc19kaXN0X2VhY2gsICJjZW50cm9pZHMiKSkNCiAgICAgICAgcGxvdCh1ZHNfZGlzdF9lYWNoX0MpDQogICAgICAgIG9yZGlsYWJlbChzY29yZXModWRzX2Rpc3RfZWFjaF9DLCAiY2VudHJvaWRzIikpDQogICAgICAgIA0KICAgICAgfQ0KICAgIH0NCiAgICANCiAgICAjUEVSRElTUCAmIHBlcm11dGF0aW9uIA0KICAgIHBlcm1fcmVzdWx0X0MgPC0gcGVybXV0ZXN0KHVkc19kaXN0X2VhY2hfQywgcGFpcndpc2U9RkFMU0UsIHBlcm11dGF0aW9ucz05OTk5KQ0KICAgIHBlcm1fcmVzdWx0IDwtIHBlcm11dGVzdCh1ZHNfZGlzdF9lYWNoLCBwYWlyd2lzZT1UUlVFLCBwZXJtdXRhdGlvbnM9OTk5OSkNCiAgICANCiAgICBjYXQoIlNhbXBsaW5nIGRheSB3YXNcbiIpDQogICAgcHJpbnQoc3Vic2V0KHVkc19kYXRhMSwgZGF5PT1kYXRlKSRkYXlbMV0pDQogICAgY2F0KCJDb21wYXJpc29uIGJldHdlZW4gY2hhbWJlcnNcbiIpDQogICAgcHJpbnQocGVybV9yZXN1bHRfQykNCiAgICBjYXQoIkNvbXBhcmlzb24gYmV0d2VlbiB0cmVhdG1lbnRzXG4iKQ0KICAgIHByaW50KHBlcm1fcmVzdWx0KQ0KICAgIA0KICAgICNJbiBmYWN0LCB0aGUgYWRqdXN0bWVudCBpcyBub3QgbmVjZXNzYXJ5IGJlY2F1c2UgcGVybXV0ZXN0LmJldGFkaXNwZXIgZG9lcyBub3QgcmVwZWF0IHBlcm11dGF0aW9uIGZvciBlYWNoIHBhaXINCiAgICBpZighaXMubnVsbChhZGopKSB7DQogICAgICBwYWlyd2lzZV9hZGo8LXAuYWRqdXN0KHBlcm1fcmVzdWx0JHBhaXJ3aXNlJHBlcm11dGVkLCBtZXRob2QgPSBhZGogLCBuID0gbGVuZ3RoKHBlcm1fcmVzdWx0JHBhaXJ3aXNlJHBlcm11dGVkKSkNCiAgICAgIGNhdCgiUGFpcndpc2UgY29tcGFyaXNpb24gYnkgcGVybXV0YXRpb24sIGFkanVzdGVkIGJ5IikNCiAgICAgIHByaW50KGFzLmNoYXJhY3RlcihhZGopKQ0KICAgICAgcHJpbnQocGFpcndpc2VfYWRqWzFdKQ0KICAgICAgcHJpbnQocGFpcndpc2VfYWRqWzJdKQ0KICAgICAgcHJpbnQocGFpcndpc2VfYWRqWzNdKQ0KICAgIH0NCg0KICAgIA0KfQ0KDQojLy8vUEVSTUFOT1ZBIGZvciBlYWNoIGluaXRpYWwgY29uZGl0aW9ucywgYmFzZWQgb24gdGhlIHNwYXRpYWwgbWVkaWFuIGZvciByZXBlYXRlZCBtZWFzdXJlcw0KY29tX2Rpdl91ZHNfY2VudHJvaWQgPC0gZnVuY3Rpb24oZGF0YV9uYW1lLCBkYXRlLCBjX0xCLCBtZXRoLCBhZGopDQp7DQogIGlmKGNfTEIgPT0gIndMQiIpIHsNCiAgICB1ZHNfZGF0YTEgPC1zdWJzZXQoZGF0YV9uYW1lLCBhYnVuZGFuY2UgPiAwKSAgI2RlbGV0ZSB0aGUgc2FtcGxpbmcgZGF0YSB3aXRoIDAgdG90YWwgYWJ1bmRhbmNlIHdoZW4gbGVhZiBiZWV0bGUNCiAgICB1ZHNfZWFjaDwtc3Vic2V0KHVkc19kYXRhMSwgZGF5PT1kYXRlKVssYygtMSwtMiwtMywtNzcsLTc4LCAtNzksIC04MCldDQogIH0gICNXaGVuIGxlYWYgYmVlbGUgaXMgaW5jbHVkZWQNCiAgaWYoY19MQiA9PSAid29MQiIpIHsNCiAgICB1ZHNfZGF0YTEgPC1zdWJzZXQoZGF0YV9uYW1lLCBhYnVuZGFuY2UyID4gMCkgI09SLCBkZWxldGUgdGhlIHNhbXBsaW5nIHdoZW4gc3BlY2llcyBvdGhlciB0aGFuIGxlYWYgYmVldGxlIGRvZXMgbm90IGV4aXN0DQogICAgdWRzX2VhY2g8LXN1YnNldCh1ZHNfZGF0YTEsIGRheT09ZGF0ZSlbLGMoLTEsLTIsLTMsLTQsLTc3LC03OCwgLTc5LCAtODApXQ0KICAgIHVkc19lYWNoX0xCPC1zdWJzZXQodWRzX2RhdGExLCBkYXk9PWRhdGUpWyxjKDQpXSAgI2V4dHJhY3QgbGVhZiBiZWV0bGUgYWJ1bmRhbmNlDQogIH0gICNXaGVuIGxlYWYgYmVlbGUgaXMgTk9UaW5jbHVkZWQNCiAgDQogIHNhbXBsZV9lYWNoIDwtIHN1YnNldCh1ZHNfZGF0YTEsIGRheT09ZGF0ZSkkc2FtcGxlDQoNCiAgdWRzX2VhY2guZDwtdmVnZGlzdCh1ZHNfZWFjaCwgbWV0aG9kPW1ldGgpDQogIHVkc19kaXN0X2VhY2ggPC1iZXRhZGlzcGVyKHVkc19lYWNoLmQsIHNhbXBsZV9lYWNoLCB0eXBlPSJtZWRpYW4iLCBiaWFzLmFkanVzdCA9IFRSVUUpDQogIHVkc19tZWRpYW4gPC0gZGF0YS5mcmFtZSh1ZHNfZGlzdF9lYWNoJGNlbnRyb2lkcykgICNjYWxjdWxhdGUgdGhlIGNlbnRyb2lkIChzcGF0aWFsIG1lZGlhbikgZm9yIHJlcGVhc3RlZCBtZWFzdXJlcw0KICANCg0KICBzYW1wbGUgPC0gcm93Lm5hbWVzKHVkc19tZWRpYW4pDQogIHNhbXBsZTIgPC0gcm93Lm5hbWVzKHVkc19tZWRpYW4pDQogICNSZXBsYWNlIHRoZSBzYW1wbGUgbmFtZSBpbnRvIHRoZSB0cmVhdG1lbnQNCiAgc2FtcGxlW2dyZXAoIm4iLCBzYW1wbGUpXTwtICJVIg0KICBzYW1wbGVbZ3JlcCgidCIsIHNhbXBsZSldPC0gIlMiDQogIHNhbXBsZVtncmVwKCJ3Iiwgc2FtcGxlKV08LSAiRCINCiAgdHJlYXRtZW50X2VhY2ggPC0gYXMuZmFjdG9yKHNhbXBsZSkgI2p1c3QgY29udmVyc2lvbg0KICANCiAgI1JlcGxhY2UgdGhlIHNhbXBsZSBuYW1lIGludG8gdGhlIGNoYW1iZXINCiAgc2FtcGxlMltncmVwKCJuIiwgc2FtcGxlMildPC0gIkMxIiAjdW5kYW1hZ2VkDQogIHNhbXBsZTJbZ3JlcCgidCIsIHNhbXBsZTIpXTwtICJDMiIgI1NpZ25hbGVkDQogIHNhbXBsZTJbZ3JlcCgidyIsIHNhbXBsZTIpXTwtICJDMiIgI0RhbWFnZWQNCiAgY2hhbWJlcl9lYWNoIDwtIGFzLmZhY3RvcihzYW1wbGUyKSAjanVzdCBjb252ZXJzaW9uDQogICAgICANCiAgDQogIGFkb25pc19yZXN1bHRfQzwtYWRvbmlzKHVkc19tZWRpYW4gfiBjaGFtYmVyX2VhY2gsIG1ldGhvZD0iZXVjbGlkZWFuIiwgcGVybXV0YXRpb25zPTk5OTkpDQogIGFkb25pc19yZXN1bHRfVDwtYWRvbmlzKHVkc19tZWRpYW4gfiB0cmVhdG1lbnRfZWFjaCwgbWV0aG9kPSJldWNsaWRlYW4iLCBwZXJtdXRhdGlvbnM9OTk5OSkNCg0KICBwcmludChhZG9uaXNfcmVzdWx0X0MpICNDaGFtYmVyIGVmZmVjdA0KICBwcmludChhZG9uaXNfcmVzdWx0X1QpICNUcmVhdG1lbnQgZWZmZWN0DQogIA0KICAjRm9yIHBhaXJ3aXNlIGNvbXBhcmlzb24gKG9ubHkgYmV0d2VlbiBEIGFuZCBTKQ0KICBjYXQoIlRoZSBwYWlyd2lzZSBQRVJNQU5PVkEgKGFkb25pcykgYW5hbHlzaXM6XG4iKQ0KICB1ZHNfZGF0YURTMDwtc3Vic2V0KGRhdGFfbmFtZSwgIHRyZWF0bWVudCAhPSAiTiIpICNXZSBzdGlsbCBuZWVkIHRoZSBzeW1ib2xzIE4sIFcsIGFuZCBUIGJlY2F1c2UgaXQgaXMgdXNlZCBpbiB0aGUgcmF3IGRhdGEgZmlsZXMNCiAgdWRzX2RhdGFTVTA8LXN1YnNldChkYXRhX25hbWUsICB0cmVhdG1lbnQgIT0gIlciKQ0KICB1ZHNfZGF0YVVEMDwtc3Vic2V0KGRhdGFfbmFtZSwgIHRyZWF0bWVudCAhPSAiVCIpDQogIGlmKGNfTEIgPT0gIndMQiIpIHsNCiAgICB1ZHNfZGF0YURTMSA8LXN1YnNldCh1ZHNfZGF0YURTMCwgYWJ1bmRhbmNlID4gMCkgICNkZWxldGUgdGhlIHNhbXBsaW5nIGRhdGEgd2l0aCAwIHRvdGFsIGFidW5kYW5jZSB3aGVuIGxlYWYgYmVldGxlDQogICAgRFNfZWFjaDwtc3Vic2V0KHVkc19kYXRhRFMxLCBkYXk9PWRhdGUpWyxjKC0xLC0yLC0zLC03NywtNzgsLTc5LC04MCldDQogICAgdWRzX2RhdGFTVTEgPC1zdWJzZXQodWRzX2RhdGFTVTAsIGFidW5kYW5jZSA+IDApICAjZGVsZXRlIHRoZSBzYW1wbGluZyBkYXRhIHdpdGggMCB0b3RhbCBhYnVuZGFuY2Ugd2hlbiBsZWFmIGJlZXRsZQ0KICAgIFNVX2VhY2g8LXN1YnNldCh1ZHNfZGF0YVNVMSwgZGF5PT1kYXRlKVssYygtMSwtMiwtMywtNzcsLTc4LC03OSwtODApXQ0KICAgIHVkc19kYXRhVUQxIDwtc3Vic2V0KHVkc19kYXRhVUQwLCBhYnVuZGFuY2UgPiAwKSAgI2RlbGV0ZSB0aGUgc2FtcGxpbmcgZGF0YSB3aXRoIDAgdG90YWwgYWJ1bmRhbmNlIHdoZW4gbGVhZiBiZWV0bGUNCiAgICBVRF9lYWNoPC1zdWJzZXQodWRzX2RhdGFVRDEsIGRheT09ZGF0ZSlbLGMoLTEsLTIsLTMsLTc3LC03OCwtNzksLTgwKV0NCiAgfSAgI1doZW4gbGVhZiBiZWVsZSBpcyBpbmNsdWRlZA0KICBpZihjX0xCID09ICJ3b0xCIikgew0KICAgIHVkc19kYXRhRFMxIDwtc3Vic2V0KHVkc19kYXRhRFMwLCBhYnVuZGFuY2UyID4gMCkgICNkZWxldGUgdGhlIHNhbXBsaW5nIGRhdGEgd2l0aCAwIHRvdGFsIGFidW5kYW5jZSB3aGVuIGxlYWYgYmVldGxlDQogICAgRFNfZWFjaDwtc3Vic2V0KHVkc19kYXRhRFMxLCBkYXk9PWRhdGUpWyxjKC0xLC0yLC0zLC00LC03NywtNzgsIC03OSwgLTgwKV0NCiAgICB1ZHNfZGF0YVNVMSA8LXN1YnNldCh1ZHNfZGF0YVNVMCwgYWJ1bmRhbmNlMiA+IDApICAjZGVsZXRlIHRoZSBzYW1wbGluZyBkYXRhIHdpdGggMCB0b3RhbCBhYnVuZGFuY2Ugd2hlbiBsZWFmIGJlZXRsZQ0KICAgIFNVX2VhY2g8LXN1YnNldCh1ZHNfZGF0YVNVMSwgZGF5PT1kYXRlKVssYygtMSwtMiwtMywtNCwtNzcsLTc4LCAtNzksLTgwKV0NCiAgICB1ZHNfZGF0YVVEMSA8LXN1YnNldCh1ZHNfZGF0YVVEMCwgYWJ1bmRhbmNlMiA+IDApICAjZGVsZXRlIHRoZSBzYW1wbGluZyBkYXRhIHdpdGggMCB0b3RhbCBhYnVuZGFuY2Ugd2hlbiBsZWFmIGJlZXRsZQ0KICAgIFVEX2VhY2g8LXN1YnNldCh1ZHNfZGF0YVVEMSwgZGF5PT1kYXRlKVssYygtMSwtMiwtMywtNCwtNzcsLTc4LCAtNzksLTgwKV0NCiAgfSAgI1doZW4gbGVhZiBiZWV0bGUgaXMgTk8gVGluY2x1ZGVkDQogIA0KICBzYW1wbGVfRFMgPC0gc3Vic2V0KHVkc19kYXRhRFMxLCBkYXk9PWRhdGUpJHNhbXBsZQ0KICBzYW1wbGVfU1UgPC0gc3Vic2V0KHVkc19kYXRhU1UxLCBkYXk9PWRhdGUpJHNhbXBsZQ0KICBzYW1wbGVfVUQgPC0gc3Vic2V0KHVkc19kYXRhVUQxLCBkYXk9PWRhdGUpJHNhbXBsZQ0KICANCiAgRFNfYnJheV9lYWNoLmQ8LXZlZ2Rpc3QoRFNfZWFjaCwgbWV0aG9kPW1ldGgpDQogIFNVX2JyYXlfZWFjaC5kPC12ZWdkaXN0KFNVX2VhY2gsIG1ldGhvZD1tZXRoKQ0KICBVRF9icmF5X2VhY2guZDwtdmVnZGlzdChVRF9lYWNoLCBtZXRob2Q9bWV0aCkNCiAgDQogIERTX2Rpc3RfZWFjaCA8LWJldGFkaXNwZXIoRFNfYnJheV9lYWNoLmQsIHNhbXBsZV9EUywgdHlwZT0ibWVkaWFuIiwgYmlhcy5hZGp1c3QgPSBUUlVFKQ0KICBTVV9kaXN0X2VhY2ggPC1iZXRhZGlzcGVyKFNVX2JyYXlfZWFjaC5kLCBzYW1wbGVfU1UsIHR5cGU9Im1lZGlhbiIsIGJpYXMuYWRqdXN0ID0gVFJVRSkNCiAgVURfZGlzdF9lYWNoIDwtYmV0YWRpc3BlcihVRF9icmF5X2VhY2guZCwgc2FtcGxlX1VELCB0eXBlPSJtZWRpYW4iLCBiaWFzLmFkanVzdCA9IFRSVUUpDQogIA0KICBEU19tZWRpYW4gPC0gZGF0YS5mcmFtZShEU19kaXN0X2VhY2gkY2VudHJvaWRzKSAgI2NhbGN1bGF0ZSB0aGUgY2VudHJvaWQgKHNwYXRpYWwgbWVkaWFuKSBmb3IgcmVwZWFzdGVkIG1lYXN1cmVzDQogIFNVX21lZGlhbiA8LSBkYXRhLmZyYW1lKFNVX2Rpc3RfZWFjaCRjZW50cm9pZHMpICAjY2FsY3VsYXRlIHRoZSBjZW50cm9pZCAoc3BhdGlhbCBtZWRpYW4pIGZvciByZXBlYXN0ZWQgbWVhc3VyZXMNCiAgVURfbWVkaWFuIDwtIGRhdGEuZnJhbWUoVURfZGlzdF9lYWNoJGNlbnRyb2lkcykgICNjYWxjdWxhdGUgdGhlIGNlbnRyb2lkIChzcGF0aWFsIG1lZGlhbikgZm9yIHJlcGVhc3RlZCBtZWFzdXJlcw0KICANCiAgRFNfc2FtcGxlIDwtIHJvdy5uYW1lcyhEU19tZWRpYW4pDQogIFNVX3NhbXBsZSA8LSByb3cubmFtZXMoU1VfbWVkaWFuKQ0KICBVRF9zYW1wbGUgPC0gcm93Lm5hbWVzKFVEX21lZGlhbikNCiAgDQogICNSZXBsYWNlIHRoZSBzYW1wbGUgbmFtZSBpbnRvIHRoZSB0cmVhdG1lbnQNCiAgRFNfc2FtcGxlW2dyZXAoIm4iLCBEU19zYW1wbGUpXTwtICJVIg0KICBEU19zYW1wbGVbZ3JlcCgidCIsIERTX3NhbXBsZSldPC0gIlMiDQogIERTX3NhbXBsZVtncmVwKCJ3IiwgRFNfc2FtcGxlKV08LSAiRCINCiAgdHJlYXRtZW50X0RTIDwtIGFzLmZhY3RvcihEU19zYW1wbGUpICNqdXN0IGNvbnZlcnNpb24NCiAgU1Vfc2FtcGxlW2dyZXAoIm4iLCBTVV9zYW1wbGUpXTwtICJVIg0KICBTVV9zYW1wbGVbZ3JlcCgidCIsIFNVX3NhbXBsZSldPC0gIlMiDQogIFNVX3NhbXBsZVtncmVwKCJ3IiwgU1Vfc2FtcGxlKV08LSAiRCINCiAgdHJlYXRtZW50X1NVIDwtIGFzLmZhY3RvcihTVV9zYW1wbGUpICNqdXN0IGNvbnZlcnNpb24NCiAgVURfc2FtcGxlW2dyZXAoIm4iLCBVRF9zYW1wbGUpXTwtICJVIg0KICBVRF9zYW1wbGVbZ3JlcCgidCIsIFVEX3NhbXBsZSldPC0gIlMiDQogIFVEX3NhbXBsZVtncmVwKCJ3IiwgVURfc2FtcGxlKV08LSAiRCINCiAgdHJlYXRtZW50X1VEIDwtIGFzLmZhY3RvcihVRF9zYW1wbGUpICNqdXN0IGNvbnZlcnNpb24NCg0KICBhZG9uaXNfcmVzdWx0RFM8LWFkb25pcyhEU19tZWRpYW4gfiB0cmVhdG1lbnRfRFMsIG1ldGhvZD0iZXVjbGlkZWFuIiwgcGVybXV0YXRpb25zPTk5OTkpDQogIGFkb25pc19yZXN1bHRTVTwtYWRvbmlzKFNVX21lZGlhbiB+IHRyZWF0bWVudF9TVSwgbWV0aG9kPSJldWNsaWRlYW4iLCBwZXJtdXRhdGlvbnM9OTk5OSkNCiAgYWRvbmlzX3Jlc3VsdFVEPC1hZG9uaXMoVURfbWVkaWFuIH4gdHJlYXRtZW50X1VELCBtZXRob2Q9ImV1Y2xpZGVhbiIsIHBlcm11dGF0aW9ucz05OTk5KQ0KICANCiAgcF9saXN0IDwtIGMoYWRvbmlzX3Jlc3VsdERTJGFvdiRQclsxXSwgYWRvbmlzX3Jlc3VsdFNVJGFvdiRQclsxXSwgYWRvbmlzX3Jlc3VsdFVEJGFvdiRQclsxXSkNCiAgDQogIGNhdCgiVGhlIGNvbXBhcmlzaW9uIGJldHdlZW4gRCBhbmQgUyBpczpcbiIpDQogIHByaW50KGFkb25pc19yZXN1bHREUykNCiAgDQogIHBhaXJ3aXNlX2FkajwtcC5hZGp1c3QocF9saXN0LCBtZXRob2QgPSBhZGogLCBuID0gbGVuZ3RoKHBfbGlzdCkpDQogIA0KICAjY2F0KCJQYWlyd2lzZSBjb21wYXJpc2lvbiBieSBwZXJtdXRhdGlvbiwgYWRqdXN0ZWQgYnkiKQ0KICAjcHJpbnQoYWRqKQ0KICAjY2F0KCJUaGUgYWRqdXN0ZWQgIFAtdmFsdWUgZm9yIFMgdnMgRCB3YXNcbiIpDQogICNwcmludChwYWlyd2lzZV9hZGpbMV0pDQogICNjYXQoIlRoZSBhZGp1c3RlZCAgUC12YWx1ZSBmb3IgVSB2cyBTIHdhc1xuIikNCiAgI3ByaW50KHBhaXJ3aXNlX2FkalsyXSkNCiAgI2NhdCgiVGhlIGFkanVzdGVkICBQLXZhbHVlIGZvciBEIHZzIFUgd2FzXG4iKQ0KICAjcHJpbnQocGFpcndpc2VfYWRqWzNdKQ0KICANCn0NCg0KIy8vL1BFUk1BTk9WQSBmb3IgZWFjaCBkYXRlLCBiYXNlZCBvbiB0aGUgc3BhdGlhbCBtZWRpYW4gZm9yIHJlcGVhdGVkIG1lYXN1cmVzDQpjb21fZGl2X0RBWV9jZW50cm9pZCA8LSBmdW5jdGlvbihkYXRhX25hbWUsIHRyZWF0LCBjX0xCLCBtZXRoLCBhZGo9TlVMTCkgew0KICANCiAgI2RhdGFfbmFtZSA8LXVkc19kYXRhX2FsbF9kYXkyDQogICN0cmVhdCA8LSAiVCINCiAgI21ldGg9ImNoYW8iDQogICNkYXRlIDwtICIxMGQiLCIzMmQiLCBvciAiNjBkIiwgb3IgYW55DQogIGlmKGNfTEIgPT0gIndMQiIpIHsNCiAgICB1ZHNfZGF0YTEgPC1zdWJzZXQoZGF0YV9uYW1lLCBhYnVuZGFuY2UgPiAwKSAgI2RlbGV0ZSB0aGUgc2FtcGxpbmcgZGF0YSB3aXRoIDAgdG90YWwgYWJ1bmRhbmNlIHdoZW4gbGVhZiBiZWV0bGUNCiAgICB1ZHNfZWFjaDwtc3Vic2V0KHVkc19kYXRhMSwgdHJlYXRtZW50PT10cmVhdClbLGMoLTEsLTIsLTMsIC03NywtNzgsIC03OSwtODApXQ0KICB9ICAjV2hlbiBsZWFmIGJlZWxlIGlzIGluY2x1ZGVkDQogIGlmKGNfTEIgPT0gIndvTEIiKSB7DQogICAgdWRzX2RhdGExIDwtc3Vic2V0KGRhdGFfbmFtZSwgYWJ1bmRhbmNlMiA+IDApICNPUiwgZGVsZXRlIHRoZSBzYW1wbGluZyB3aGVuIHNwZWNpZXMgb3RoZXIgdGhhbiBsZWFmIGJlZXRsZSBkb2VzIG5vdCBleGlzdA0KICAgIHVkc19lYWNoPC1zdWJzZXQodWRzX2RhdGExLCB0cmVhdG1lbnQ9PXRyZWF0KVssYygtMSwtMiwtMywtNCwtNzcsLTc4LC03OSwtODApXQ0KICB9ICAjV2hlbiBsZWFmIGJlZWxlIGlzIE5PVGluY2x1ZGVkDQogIGlmKGNfTEIgPT0gIkxCb25seSIpIHsNCiAgICB1ZHNfZGF0YTEgPC0gc3Vic2V0KGRhdGFfbmFtZSwgYWJ1bmRhbmNlMiA+IDApDQogICAgdWRzX2VhY2ggPC0gc3Vic2V0KHVkc19kYXRhMSwgdHJlYXRtZW50PT10cmVhdClbLCBjKDQpXSAgI3BpY2tpbmcgdXAgTEIgb25seQ0KICB9DQogIA0KICBzYW1wbGVfZWFjaCA8LSBzdWJzZXQodWRzX2RhdGExLCB0cmVhdG1lbnQ9PXRyZWF0KSRzYW1wbGUNCiAgZGF5X2VhY2ggPC0gc3Vic2V0KHVkc19kYXRhMSwgdHJlYXRtZW50PT10cmVhdCkkZGF5DQoNCiAgdWRzX2JyYXlfZWFjaDAuZDwtdmVnZGlzdCh1ZHNfZWFjaCwgbWV0aG9kPW1ldGgpDQogIGlmKGNfTEIgPT0gIkxCb25seSIpIHRwIDwtICJjZW50cm9pZCINCiAgZWxzZSB0cCA8LSAibWVkaWFuIg0KICB1ZHNfZGlzdF9lYWNoMCA8LWJldGFkaXNwZXIodWRzX2JyYXlfZWFjaDAuZCwgc2FtcGxlX2VhY2gsIHR5cGU9dHAsIGJpYXMuYWRqdXN0ID0gVFJVRSkNCiAgdWRzX21lZGlhbiA8LSBkYXRhLmZyYW1lKHVkc19kaXN0X2VhY2gwJGNlbnRyb2lkcykgICNjYWxjdWxhdGUgdGhlIGNlbnRyb2lkIChzcGF0aWFsIG1lZGlhbikgZm9yIHJlcGVhc3RlZCBtZWFzdXJlcw0KDQogIHNhbXBsZSA8LSByb3cubmFtZXModWRzX21lZGlhbikNCiAgDQogICNSZXBsYWNlIHRoZSBzYW1wbGUgbmFtZSBpbnRvIHRoZSBkYXRlDQogIHNhbXBsZVtncmVwKCJeMSIsIHNhbXBsZSldPC0gImRheTEwIg0KICBzYW1wbGVbZ3JlcCgiXjIiLCBzYW1wbGUpXTwtICJkYXkzMiINCiAgc2FtcGxlW2dyZXAoIl4zIiwgc2FtcGxlKV08LSAiZGF5NjAiDQogIA0KICBkYXlfZWFjaCA8LSBhcy5mYWN0b3Ioc2FtcGxlKSAjanVzdCBjb252ZXJzaW9uDQogIA0KICBhZG9uaXNfcmVzdWx0PC1hZG9uaXModWRzX21lZGlhbiB+IGRheV9lYWNoLCBtZXRob2Q9ImV1Y2xpZGVhbiIsIHBlcm11dGF0aW9ucz05OTk5KQ0KICANCiAgcHJpbnQoYWRvbmlzX3Jlc3VsdCkNCiAgDQogICNGb3IgcGFpcndpc2UgY29tYXJpc29uICh3aXRoIEJvbmZlcnJvbmkgYWRqdXN0bWVudCkNCiAgY2F0KCJUaGUgcGFpcndpc2UgUEVSTUFOT1ZBIChhZG9uaXMpIGFuYWx5c2lzOlxuIikNCiAgdWRzX2RhdGFEYXkxMDMyXzA8LXN1YnNldChkYXRhX25hbWUsICBkYXkgIT0gIjYwZCIpDQogIHVkc19kYXRhRGF5MTA2MF8wPC1zdWJzZXQoZGF0YV9uYW1lLCAgZGF5ICE9ICIzMmQiKQ0KICB1ZHNfZGF0YURheTMyNjBfMDwtc3Vic2V0KGRhdGFfbmFtZSwgIGRheSAhPSAiMTBkIikNCiAgDQogIGlmKGNfTEIgPT0gIndMQiIpIHsNCiAgICB1ZHNfZGF0YURheTEwMzJfMSA8LXN1YnNldCh1ZHNfZGF0YURheTEwMzJfMCwgYWJ1bmRhbmNlMiA+IDApICAjZGVsZXRlIHRoZSBzYW1wbGluZyBkYXRhIHdpdGggMCB0b3RhbCBhYnVuZGFuY2Ugd2hlbiBsZWFmIGJlZXRsZQ0KICAgIERheTEwMzJfZWFjaDwtc3Vic2V0KHVkc19kYXRhRGF5MTAzMl8xLCB0cmVhdG1lbnQ9PXRyZWF0KVssYygtMSwtMiwtMywtNzcsLTc4LC03OSwtODApXQ0KICAgIHVkc19kYXRhRGF5MTA2MF8xIDwtc3Vic2V0KHVkc19kYXRhRGF5MTA2MF8wLCBhYnVuZGFuY2UyID4gMCkgICNkZWxldGUgdGhlIHNhbXBsaW5nIGRhdGEgd2l0aCAwIHRvdGFsIGFidW5kYW5jZSB3aGVuIGxlYWYgYmVldGxlDQogICAgRGF5MTA2MF9lYWNoPC1zdWJzZXQodWRzX2RhdGFEYXkxMDYwXzEsIHRyZWF0bWVudD09dHJlYXQpWyxjKC0xLC0yLC0zLC03NywtNzgsLTc5LC04MCldDQogICAgdWRzX2RhdGFEYXkzMjYwXzEgPC1zdWJzZXQodWRzX2RhdGFEYXkzMjYwXzAsIGFidW5kYW5jZTIgPiAwKSAgI2RlbGV0ZSB0aGUgc2FtcGxpbmcgZGF0YSB3aXRoIDAgdG90YWwgYWJ1bmRhbmNlIHdoZW4gbGVhZiBiZWV0bGUNCiAgICBEYXkzMjYwX2VhY2g8LXN1YnNldCh1ZHNfZGF0YURheTMyNjBfMSwgdHJlYXRtZW50PT10cmVhdClbLGMoLTEsLTIsLTMsLTc3LC03OCwtNzksLTgwKV0NCiAgfSAgI1doZW4gbGVhZiBiZWVsZSBpcyBpbmNsdWRlZA0KICBpZihjX0xCID09ICJ3b0xCIikgew0KICAgIHVkc19kYXRhRGF5MTAzMl8xIDwtc3Vic2V0KHVkc19kYXRhRGF5MTAzMl8wLCBhYnVuZGFuY2UyID4gMCkgICNkZWxldGUgdGhlIHNhbXBsaW5nIGRhdGEgd2l0aCAwIHRvdGFsIGFidW5kYW5jZSB3aGVuIGxlYWYgYmVldGxlDQogICAgRGF5MTAzMl9lYWNoPC1zdWJzZXQodWRzX2RhdGFEYXkxMDMyXzEsIHRyZWF0bWVudD09dHJlYXQpWyxjKC0xLC0yLC0zLC00LC03NywtNzgsLTc5LC04MCldDQogICAgdWRzX2RhdGFEYXkxMDYwXzEgPC1zdWJzZXQodWRzX2RhdGFEYXkxMDYwXzAsIGFidW5kYW5jZTIgPiAwKSAgI2RlbGV0ZSB0aGUgc2FtcGxpbmcgZGF0YSB3aXRoIDAgdG90YWwgYWJ1bmRhbmNlIHdoZW4gbGVhZiBiZWV0bGUNCiAgICBEYXkxMDYwX2VhY2g8LXN1YnNldCh1ZHNfZGF0YURheTEwNjBfMSwgdHJlYXRtZW50PT10cmVhdClbLGMoLTEsLTIsLTMsLTQsLTc3LC03OCwtNzksLTgwKV0NCiAgICB1ZHNfZGF0YURheTMyNjBfMSA8LXN1YnNldCh1ZHNfZGF0YURheTMyNjBfMCwgYWJ1bmRhbmNlMiA+IDApICAjZGVsZXRlIHRoZSBzYW1wbGluZyBkYXRhIHdpdGggMCB0b3RhbCBhYnVuZGFuY2Ugd2hlbiBsZWFmIGJlZXRsZQ0KICAgIERheTMyNjBfZWFjaDwtc3Vic2V0KHVkc19kYXRhRGF5MzI2MF8xLCB0cmVhdG1lbnQ9PXRyZWF0KVssYygtMSwtMiwtMywtNCwtNzcsLTc4LC03OSwtODApXQ0KICB9ICAjV2hlbiBsZWFmIGJlZWxlIGlzIE5PVGluY2x1ZGVkDQogIA0KICBzYW1wbGVfMTAzMiA8LSBzdWJzZXQodWRzX2RhdGFEYXkxMDMyXzEsIHRyZWF0bWVudD09dHJlYXQpJHNhbXBsZQ0KICBzYW1wbGVfMTA2MCA8LSBzdWJzZXQodWRzX2RhdGFEYXkxMDYwXzEsIHRyZWF0bWVudD09dHJlYXQpJHNhbXBsZQ0KICBzYW1wbGVfMzI2MCA8LSBzdWJzZXQodWRzX2RhdGFEYXkzMjYwXzEsIHRyZWF0bWVudD09dHJlYXQpJHNhbXBsZQ0KDQogIERheTEwMzJfZWFjaC5kPC12ZWdkaXN0KERheTEwMzJfZWFjaCwgbWV0aG9kPW1ldGgpDQogIERheTEwNjBfZWFjaC5kPC12ZWdkaXN0KERheTEwNjBfZWFjaCwgbWV0aG9kPW1ldGgpDQogIERheTMyNjBfZWFjaC5kPC12ZWdkaXN0KERheTMyNjBfZWFjaCwgbWV0aG9kPW1ldGgpDQogIA0KICBEYXkxMDMyX2Rpc3RfZWFjaCA8LWJldGFkaXNwZXIoRGF5MTAzMl9lYWNoLmQsIHNhbXBsZV8xMDMyLCB0eXBlPSJtZWRpYW4iLCBiaWFzLmFkanVzdCA9IFRSVUUpDQogIERheTEwNjBfZGlzdF9lYWNoIDwtYmV0YWRpc3BlcihEYXkxMDYwX2VhY2guZCwgc2FtcGxlXzEwNjAsIHR5cGU9Im1lZGlhbiIsIGJpYXMuYWRqdXN0ID0gVFJVRSkNCiAgRGF5MzI2MF9kaXN0X2VhY2ggPC1iZXRhZGlzcGVyKERheTMyNjBfZWFjaC5kLCBzYW1wbGVfMzI2MCwgdHlwZT0ibWVkaWFuIiwgYmlhcy5hZGp1c3QgPSBUUlVFKQ0KDQogIERheTEwMzJfbWVkaWFuIDwtIGRhdGEuZnJhbWUoRGF5MTAzMl9kaXN0X2VhY2gkY2VudHJvaWRzKSAgI2NhbGN1bGF0ZSB0aGUgY2VudHJvaWQgKHNwYXRpYWwgbWVkaWFuKSBmb3IgcmVwZWFzdGVkIG1lYXN1cmVzDQogIERheTEwNjBfbWVkaWFuIDwtIGRhdGEuZnJhbWUoRGF5MTA2MF9kaXN0X2VhY2gkY2VudHJvaWRzKSAgI2NhbGN1bGF0ZSB0aGUgY2VudHJvaWQgKHNwYXRpYWwgbWVkaWFuKSBmb3IgcmVwZWFzdGVkIG1lYXN1cmVzDQogIERheTMyNjBfbWVkaWFuIDwtIGRhdGEuZnJhbWUoRGF5MzI2MF9kaXN0X2VhY2gkY2VudHJvaWRzKSAgI2NhbGN1bGF0ZSB0aGUgY2VudHJvaWQgKHNwYXRpYWwgbWVkaWFuKSBmb3IgcmVwZWFzdGVkIG1lYXN1cmVzDQogIA0KICBEYXkxMDMyX3NhbXBsZSA8LSByb3cubmFtZXMoRGF5MTAzMl9tZWRpYW4pDQogIERheTEwNjBfc2FtcGxlIDwtIHJvdy5uYW1lcyhEYXkxMDYwX21lZGlhbikNCiAgRGF5MzI2MF9zYW1wbGUgPC0gcm93Lm5hbWVzKERheTMyNjBfbWVkaWFuKQ0KICANCiAgI1JlcGxhY2UgdGhlIHNhbXBsZSBuYW1lIGludG8gdGhlIGRheQ0KICBEYXkxMDMyX3NhbXBsZVtncmVwKCJeMSIsIERheTEwMzJfc2FtcGxlKV08LSAiZGF5MTAiDQogIERheTEwMzJfc2FtcGxlW2dyZXAoIl4yIiwgRGF5MTAzMl9zYW1wbGUpXTwtICJkYXkzMiINCiAgZGF5X0RheTEwMzIgPC0gYXMuZmFjdG9yKERheTEwMzJfc2FtcGxlKSAjanVzdCBjb252ZXJzaW9uDQogIERheTEwNjBfc2FtcGxlW2dyZXAoIl4xIiwgRGF5MTA2MF9zYW1wbGUpXTwtICJkYXkxMCINCiAgRGF5MTA2MF9zYW1wbGVbZ3JlcCgiXjMiLCBEYXkxMDYwX3NhbXBsZSldPC0gImRheTYwIg0KICBkYXlfRGF5MTA2MCA8LSBhcy5mYWN0b3IoRGF5MTA2MF9zYW1wbGUpICNqdXN0IGNvbnZlcnNpb24NCiAgRGF5MzI2MF9zYW1wbGVbZ3JlcCgiXjIiLCBEYXkzMjYwX3NhbXBsZSldPC0gImRheTMyIg0KICBEYXkzMjYwX3NhbXBsZVtncmVwKCJeMyIsIERheTMyNjBfc2FtcGxlKV08LSAiZGF5NjAiDQogIGRheV9EYXkzMjYwIDwtIGFzLmZhY3RvcihEYXkzMjYwX3NhbXBsZSkgI2p1c3QgY29udmVyc2lvbg0KDQogIGFkb25pc19yZXN1bHREYXkxMDMyPC1hZG9uaXMoRGF5MTAzMl9tZWRpYW4gfiBkYXlfRGF5MTAzMiwgbWV0aG9kPSJldWNsaWRpYW4iLCBwZXJtdXRhdGlvbnM9OTk5OSkNCiAgYWRvbmlzX3Jlc3VsdERheTEwNjA8LWFkb25pcyhEYXkxMDYwX21lZGlhbiB+IGRheV9EYXkxMDYwLCBtZXRob2Q9ImV1Y2xpZGlhbiIsIHBlcm11dGF0aW9ucz05OTk5KQ0KICBhZG9uaXNfcmVzdWx0RGF5MzI2MDwtYWRvbmlzKERheTMyNjBfbWVkaWFuIH4gZGF5X0RheTMyNjAsIG1ldGhvZD0iZXVjbGlkaWFuIiwgcGVybXV0YXRpb25zPTk5OTkpDQogIA0KICBwX2xpc3QgPC0gYyhhZG9uaXNfcmVzdWx0RGF5MTAzMiRhb3YkUHJbMV0sIGFkb25pc19yZXN1bHREYXkxMDYwJGFvdiRQclsxXSwgYWRvbmlzX3Jlc3VsdERheTMyNjAkYW92JFByWzFdKQ0KICANCiAgDQogIHBhaXJ3aXNlX2FkajwtcC5hZGp1c3QocF9saXN0LCBtZXRob2QgPSBhZGogLCBuID0gbGVuZ3RoKHBfbGlzdCkpDQogIA0KICBjYXQoIlBhaXJ3aXNlIGNvbXBhcmlzaW9uIGJ5IHBlcm11dGF0aW9uLCBhZGp1c3RlZCBieSIpDQogIHByaW50KGFkaikNCiAgY2F0KCJUaGUgYWRqdXN0ZWQgIFAtdmFsdWUgZm9yIGRheTEwIHZzIGRheTMyIHdhc1xuIikNCiAgcHJpbnQocGFpcndpc2VfYWRqWzFdKQ0KICBjYXQoIlRoZSBhZGp1c3RlZCAgUC12YWx1ZSBmb3IgZGF5MTAgdnMgZGF5NjAgd2FzXG4iKQ0KICBwcmludChwYWlyd2lzZV9hZGpbMl0pDQogIGNhdCgiVGhlIGFkanVzdGVkICBQLXZhbHVlIGZvciBkYXkzMiB2cyBkYXk2MCB3YXNcbiIpDQogIHByaW50KHBhaXJ3aXNlX2FkalszXSkNCn0NCg0KDQojLy8vUEVSTURJU1Agb3IgZWFjaCBkYXRlLCBiYXNlZCBvbiB0aGUgc3BhdGlhbCBtZWRpYW4gZm9yIHJlcGVhdGVkIG1lYXN1cmVzDQpkaXNwZXJfREFZX2NlbnRyb2lkIDwtIGZ1bmN0aW9uKGRhdGFfbmFtZSwgdHJlYXQsIGNfTEIsIG1ldGgsIGFkaj1OVUxMKSB7DQogIA0KICAjcmVzb2x2aW5nIGluY29uc2lzdGVuY3kgb2YgdGhlIHN5bWJvbHMgdG8gcmVwcmVzZW50IHRoZSB0cmVhdG1lbnRzIChhbmQgY2hhbWJlcikNCiAgaWYodHJlYXQgPT0gIlUiKSB0cmVhdCA8LSAiTiINCiAgZWxzZSBpZih0cmVhdCA9PSAiRSIpIHRyZWF0IDwtICJUIg0KICBlbHNlIGlmKHRyZWF0ID09ICJEIikgdHJlYXQgPC0gIlciDQogIGVsc2UgaWYodHJlYXQgPT0gIlMiKSB0cmVhdCA8LSAiVCINCiAgDQogIGlmKGNfTEIgPT0gIndMQiIpIHsNCiAgICB1ZHNfZGF0YTEgPC1zdWJzZXQoZGF0YV9uYW1lLCBhYnVuZGFuY2UgPiAwKSAgI2RlbGV0ZSB0aGUgc2FtcGxpbmcgZGF0YSB3aXRoIDAgdG90YWwgYWJ1bmRhbmNlIHdoZW4gbGVhZiBiZWV0bGUNCiAgICB1ZHNfZWFjaDwtc3Vic2V0KHVkc19kYXRhMSwgdHJlYXRtZW50PT10cmVhdClbLGMoLTEsLTIsLTMsIC03NywtNzgsIC03OSwtODApXQ0KICB9ICAjV2hlbiBsZWFmIGJlZWxlIGlzIGluY2x1ZGVkDQogIGlmKGNfTEIgPT0gIndvTEIiKSB7DQogICAgdWRzX2RhdGExIDwtc3Vic2V0KGRhdGFfbmFtZSwgYWJ1bmRhbmNlMiA+IDApICNPUiwgZGVsZXRlIHRoZSBzYW1wbGluZyB3aGVuIHNwZWNpZXMgb3RoZXIgdGhhbiBsZWFmIGJlZXRsZSBkb2VzIG5vdCBleGlzdA0KICAgIHVkc19lYWNoPC1zdWJzZXQodWRzX2RhdGExLCB0cmVhdG1lbnQ9PXRyZWF0KVssYygtMSwtMiwtMywtNCwtNzcsLTc4LC03OSwtODApXQ0KICB9ICAjV2hlbiBsZWFmIGJlZWxlIGlzIE5PVGluY2x1ZGVkDQogIGlmKGNfTEIgPT0gIkxCb25seSIpIHsNCiAgICB1ZHNfZGF0YTEgPC0gc3Vic2V0KGRhdGFfbmFtZSwgYWJ1bmRhbmNlMiA+IDApDQogICAgdWRzX2VhY2ggPC0gc3Vic2V0KHVkc19kYXRhMSwgdHJlYXRtZW50PT10cmVhdClbLCBjKDQpXSAgI3BpY2tpbmcgdXAgTEIgb25seQ0KICB9DQogIA0KICBzYW1wbGVfZWFjaCA8LSBzdWJzZXQodWRzX2RhdGExLCB0cmVhdG1lbnQ9PXRyZWF0KSRzYW1wbGUNCiAgZGF5X2VhY2ggPC0gc3Vic2V0KHVkc19kYXRhMSwgdHJlYXRtZW50PT10cmVhdCkkZGF5DQogIA0KICANCiAgdWRzX2JyYXlfZWFjaDAuZDwtdmVnZGlzdCh1ZHNfZWFjaCwgbWV0aG9kPW1ldGgpDQogIGlmKGNfTEIgPT0gIkxCb25seSIpIHRwIDwtICJjZW50cm9pZCINCiAgZWxzZSB0cCA8LSAibWVkaWFuIg0KICB1ZHNfZGlzdF9lYWNoMCA8LWJldGFkaXNwZXIodWRzX2JyYXlfZWFjaDAuZCwgc2FtcGxlX2VhY2gsIHR5cGU9dHAsIGJpYXMuYWRqdXN0ID0gVFJVRSkNCiAgdWRzX21lZGlhbiA8LSBkYXRhLmZyYW1lKHVkc19kaXN0X2VhY2gwJGNlbnRyb2lkcykgICNjYWxjdWxhdGUgdGhlIGNlbnRyb2lkIChzcGF0aWFsIG1lZGlhbikgZm9yIHJlcGVhc3RlZCBtZWFzdXJlcw0KICANCiAgc2FtcGxlIDwtIHJvdy5uYW1lcyh1ZHNfbWVkaWFuKQ0KICANCiAgI1JlcGxhY2UgdGhlIHNhbXBsZSBuYW1lIGludG8gdGhlIGRhdGUNCiAgc2FtcGxlW2dyZXAoIl4xIiwgc2FtcGxlKV08LSAiZGF5MTAiDQogIHNhbXBsZVtncmVwKCJeMiIsIHNhbXBsZSldPC0gImRheTMyIg0KICBzYW1wbGVbZ3JlcCgiXjMiLCBzYW1wbGUpXTwtICJkYXk2MCINCiAgDQogIGRheV9lYWNoIDwtIGFzLmZhY3RvcihzYW1wbGUpICNqdXN0IGNvbnZlcnNpb24NCiAgDQogICN0cmVhdG1lbnRfZWFjaA0KICB1ZHNfZWFjaC5kPC12ZWdkaXN0KHVkc19tZWRpYW4sIG1ldGhvZD0iZXVjbGlkZWFuIikNCiAgdWRzX2Rpc3RfZWFjaCA8LWJldGFkaXNwZXIodWRzX2VhY2guZCwgZGF5X2VhY2gsIHR5cGU9ImNlbnRyb2lkIiwgYmlhcy5hZGp1c3QgPSBUUlVFKSAgI0Nob29zZSBjZW50cm9pZCBiZWNhc3VlIG9mIGV1Y2xpZGVhbiBkaXN0YW5jZQ0KICAjUGxvdA0KICBpZihjX0xCID09ICJMQm9ubHkiKSBib3hwbG90KHVkc19kaXN0X2VhY2gpDQogIGVsc2Ugew0KICAgIGJveHBsb3QodWRzX2Rpc3RfZWFjaCkNCiAgICBvcmRpbGFiZWwoc2NvcmVzKHVkc19kaXN0X2VhY2gsICJjZW50cm9pZHMiKSkNCiAgfQ0KICAjUEVSRElTUCAmIEFOT1ZBICYgTVVMVElQTEUgQ09NUEFSSVNPTg0KICAjYW5vdmFfZGlzdCA8LSBhbm92YSh1ZHNfZGlzdF9lYWNoKQ0KICAjVHVrZXlIU0QodWRzX2Rpc3RfZWFjaCwgd2hpY2ggPSAiZ3JvdXAiLCBvcmRlcmVkID0gRkFMU0UsIGNvbmYubGV2ZWxzID0gMC45NSkNCiAgDQogICNQRVJESVBTVCAmIHBlcm11dGF0aW9uIA0KICBwZXJtX3Jlc3VsdCA8LSBwZXJtdXRlc3QodWRzX2Rpc3RfZWFjaCwgcGFpcndpc2U9VFJVRSwgcGVybXV0YXRpb25zPTk5OTkpDQogICNwZXJtX3Jlc3VsdA0KICANCiAgI3ByaW50IChhbm92YV9kaXN0JFByWzFdKSANCiAgY2F0KCJUYXJnZXQgdHJlYXRtZW50IHdhc1xuIikNCiAgcHJpbnQodHJlYXQpDQogDQogIHByaW50KHVkc19kaXN0X2VhY2gpDQogIHByaW50KHBlcm1fcmVzdWx0KQ0KICAjSW4gZmFjdCwgdGhlIGFkanVzdG1lbnQgaXMgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIHBlcm11dGVzdC5iZXRhZGlzcGVyIGRvZXMgbm90IHJlcGVhdCBwZXJtdXRhdGlvbiBmb3IgZWFjaCBwYWlyDQogIGlmKCFpcy5udWxsKGFkaikpIHsNCiAgICBwYWlyd2lzZV9hZGo8LXAuYWRqdXN0KHBlcm1fcmVzdWx0JHBhaXJ3aXNlJHBlcm11dGVkLCBtZXRob2QgPSBhZGosIG4gPSBsZW5ndGgocGVybV9yZXN1bHQkcGFpcndpc2UkcGVybXV0ZWQpKQ0KICAgIGNhdCgiUGFpcndpc2UgY29tcGFyaXNpb24gYnkgcGVybXV0YXRpb24sIGFkanVzdGVkIGJ5IikNCiAgICBwcmludChhcy5jaGFyYWN0ZXIoYWRqKSkNCiAgICBwcmludChwYWlyd2lzZV9hZGpbMV0pDQogICAgcHJpbnQocGFpcndpc2VfYWRqWzJdKQ0KICAgIHByaW50KHBhaXJ3aXNlX2FkalszXSkNCiAgfQ0KICANCiAgI1R1a2V5SFNEKHVkc19kaXN0X2VhY2gpDQogIA0KfQ0KDQoNCmBgYA0KDQojIyMjIFN0YXRpc3RpY2FsIHRlc3RzIGZvciBGaWcuMg0KIyMjIyMgRm9yIFBFUk1ESVNQOiBjb21wYXJpc29uIGJldHdlZW4gZGF0ZXMgKEZpZy4yQSlcDQpgYGB7cn0NCiNUZW1wb3JhbCB2YXJpYWJpbGl0eSBpbiBiZXRhIGRpdmVyc2l0eSBmb3IgbWFudXNjcmlwdA0KZGlzcGVyX0RBWV9jZW50cm9pZChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIHRyZWF0PSJVIiwgY19MQj0id29MQiIsIG1ldGg9ImNoYW8iKQ0KZGlzcGVyX0RBWV9jZW50cm9pZChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIHRyZWF0PSJTIiwgY19MQj0id29MQiIsIG1ldGg9ImNoYW8iKQ0KZGlzcGVyX0RBWV9jZW50cm9pZChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIHRyZWF0PSJEIiwgY19MQj0id29MQiIsIG1ldGg9ImNoYW8iKQ0KDQpgYGANCiMjIyMjRm9yIFBFUk1ESVNQOiBjb21wYXJpc29uIGJldHdlZW4gY2hhbWJlcnMgYW5kIHRyZWF0bWVudHMgKEZpZy4yYSlcDQpgYGB7cn0NCiNSZXN1bHRzIGZyb20gMi0zIHRpbWVzIG1lYXN1cmVtZW50IGluIDEwZCwgMzJkLCBhbmQgNjBkIHdpdGhvdXQgbGVhZiBiZWV0bGUgdGhyb3VnaCBzcGF0aWFsIG1lZGlhbg0KI1dpdGggdGhlIHJlY29tbWVuZGVkIG1lYXN1cmUgKENoYW8gaW5kZXgpIChmb3IgRmlnLjJiKQ0KZGlzcGVyX3Vkc19jZW50cm9pZChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIGRhdGU9IjEwZCIsIGNfTEI9IndvTEIiLCBtZXRoPSJjaGFvIikNCmRpc3Blcl91ZHNfY2VudHJvaWQoZGF0YV9uYW1lPXVkc19kYXRhX2FsbF9kYXkyLCBkYXRlPSIzMmQiLCBjX0xCPSJ3b0xCIiwgbWV0aD0iY2hhbyIpDQpkaXNwZXJfdWRzX2NlbnRyb2lkKGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgZGF0ZT0iNjBkIiwgY19MQj0id29MQiIsIG1ldGg9ImNoYW8iKQ0KYGBgDQoNCiMjIyMjIEZvciBQRVJNQU5PVkEgKEZpZy4yYilcDQpgYGB7cn0NCmNvbV9kaXZfdWRzX2NlbnRyb2lkKGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgZGF0ZT0iMTBkIiwgY19MQj0id29MQiIsIG1ldGg9ImNoYW8iLCBhZGo9ImhvbG0iKQ0KY29tX2Rpdl91ZHNfY2VudHJvaWQoZGF0YV9uYW1lPXVkc19kYXRhX2FsbF9kYXkyLCBkYXRlPSIzMmQiLCBjX0xCPSJ3b0xCIiwgbWV0aD0iY2hhbyIsIGFkaj0iaG9sbSIpDQpjb21fZGl2X3Vkc19jZW50cm9pZChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIGRhdGU9IjYwZCIsIGNfTEI9IndvTEIiLCBtZXRoPSJjaGFvIiwgYWRqPSJob2xtIikNCmBgYA0KDQojIyMjIyBQRVJNQU5PVkEgKGZvciBTdXBwbGVtZW50YXJ5IE1hdGVyaWFsKQ0KYGBge3J9DQpjb21fZGl2X0RBWV9jZW50cm9pZChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIHRyZWF0PSJOIiwgY19MQj0id29MQiIsIG1ldGg9ImNoYW8iLCBhZGo9ImhvbG0iKQ0KY29tX2Rpdl9EQVlfY2VudHJvaWQoZGF0YV9uYW1lPXVkc19kYXRhX2FsbF9kYXkyLCB0cmVhdD0iVCIsIGNfTEI9IndvTEIiLCBtZXRoPSJjaGFvIiwgYWRqPSJob2xtIikNCmNvbV9kaXZfREFZX2NlbnRyb2lkKGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgdHJlYXQ9IlciLCBjX0xCPSJ3b0xCIiwgbWV0aD0iY2hhbyIsIGFkaj0iaG9sbSIpDQpgYGANCg0KDQojIyMjIFN1bW1hcnkgZm9yIHRoZSBzdGF0aXN0aWNhbCB0ZXN0cyBvbiBGaWd1cmUgMg0KLSBEaXNwZXJzaW9uIHdpdGggdGltZQ0KICAtIERpc3BlcnNpb24gb2YgVSAoQ2hhbWJlciAxKSBkZWNyZWFzZWQgd2l0aCB0aW1lIChkYXkxMD1kYXkzMiwgYnV0IGRheTEwID4gZGF5NjApDQogIC0gTm8gZGlmZmVyZW5jZXMgaW4gZGlzcGVyc2lvbiBiZXQuIGRhdGVzIGluIFMoRSkgYW5kIEQgdHJlYXRtZW50cw0KLSBEaXNwZXJzaW9uIGJldHdlZW4gY2hhbWJlcnMgYW5kIHRyZWF0bWVudFwNCiAgLSBEaXNwZXJzaW9uIG9mIFUgKENoYW1iZXIgMSkgd2FzIHNtYWxsZXIgdGhhbiBjaGFtYmVyIDIgKEQrUykgYXQgNjBkIChQPTAuMDA3NSkuDQogIC0gTm8gZGlmZmVyZW5jZXMgaW4gZGlzcGVyc2lvbiBiZXQuIFMoRSkgYW5kIEQgdHJlYXRtZW50cyBhdCA2MGQNCi0gUEVSTUFOT1ZBICh3aXRoIFBFUk1ESVNQKSByZXN1bHRzIHRlbGwgdGhhdDoNCiAgLSB0aGUgY2VudHJvaWQgY29tbXVuaXR5IGNvbXBvc2l0aW9uIHdhcyBub3QgZGlmZmVyZW50IGJldHdlZW4gVSB2cyAoRCArIFMpIChubyBjaGFtYmVyIGVmZmVjdHMpLg0KICAtIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gRCBhbmQgRSBhdCAzMmQgKEYgPSAyLjQxMzIsIGRmPTIsIFAgPSAwLjAwMzYpDQotIFRlbXBvcmFsIGR5bmFtaWNzIG9mIGNlbnRyb2lkIHdpdGhpbiBlYWNoIHRyZWF0bWVudA0KICAtIEZvciBhbGwgVSwgRCwgYW5kIEUsIGFsbCBwYWlyd2lzZSBQRVJNQU5PVkEgcmVzdWx0ZWQgaW4gUCA8IDAuMDAxDQogIC0gQnV0IGR1ZSB0byBoZXRlcm9nZW5lb3VzIGRpc3BlcnNpb24gZGF5MTAgZGF5MzIgPiBkYXk2MCBmb3IgVSwgd2UgY2Fubm90IGNvbmNsdWRlIHRoZSBjZW50cm9pZCBvZiBVIGF0IGRheSA2MCBpcyBkaWZmZXJlbmNlIGZyb20gZGF5IDEwIG5vdCBkYXkgMzIuDQogIA0KIyMjIyBTdGF0aXN0aWNhbCB0ZXN0cyBmb3IgRmlndXJlIFMxDQojIyMjIyBGb3IgUEVSTURJU1A6IGNvbXBhcmlzaW9uIGJldHdlZW4gY2hhbWJlcnMgYW5kIHRyZWF0bWVudHMgd2l0aCBicmF5LWN1cnRpcyBtZWFzdXJlDQpgYGB7cn0NCmRpc3Blcl91ZHNfY2VudHJvaWQoZGF0YV9uYW1lPXVkc19kYXRhX2FsbF9kYXkyLCBkYXRlPSIxMGQiLCBjX0xCPSJ3b0xCIiwgbWV0aD0iYnJheSIpDQpkaXNwZXJfdWRzX2NlbnRyb2lkKGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgZGF0ZT0iMzJkIiwgY19MQj0id29MQiIsIG1ldGg9ImJyYXkiKQ0KZGlzcGVyX3Vkc19jZW50cm9pZChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIGRhdGU9IjYwZCIsIGNfTEI9IndvTEIiLCBtZXRoPSJicmF5IikNCmBgYA0KIyMjIyMgRm9yIFBFUk1BTk9WQTogY29tcGFyaXNpb24gYmV0d2VlbiBjaGFtYmVycyBhbmQgdHJlYXRtZW50cyB3aXRoIGJyYXktY3VydGlzIG1lYXN1cmUNCmBgYHtyfQ0KY29tX2Rpdl91ZHNfY2VudHJvaWQoZGF0YV9uYW1lPXVkc19kYXRhX2FsbF9kYXkyLCBkYXRlPSIxMGQiLCBjX0xCPSJ3b0xCIiwgbWV0aD0iYnJheSIsIGFkaj0iaG9sbSIpDQpjb21fZGl2X3Vkc19jZW50cm9pZChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIGRhdGU9IjMyZCIsIGNfTEI9IndvTEIiLCBtZXRoPSJicmF5IiwgYWRqPSJob2xtIikNCmNvbV9kaXZfdWRzX2NlbnRyb2lkKGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgZGF0ZT0iNjBkIiwgY19MQj0id29MQiIsIG1ldGg9ImJyYXkiLCBhZGo9ImhvbG0iKQ0KYGBgDQoNCiMjIyMjIEZvciBQRVJNRElTUDogY29tcGFyaXNpb24gYmV0d2VlbiBjaGFtYmVycyBhbmQgdHJlYXRtZW50cyB3aXRoIENoYW8gbWVhc3VyZSBidXQgd2l0aCBsZWFmIGJlZXRsZQ0KYGBge3J9DQpkaXNwZXJfdWRzX2NlbnRyb2lkKGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgZGF0ZT0iMTBkIiwgY19MQj0id0xCIiwgbWV0aD0iY2hhbyIpDQpkaXNwZXJfdWRzX2NlbnRyb2lkKGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgZGF0ZT0iMzJkIiwgY19MQj0id0xCIiwgbWV0aD0iY2hhbyIpDQpkaXNwZXJfdWRzX2NlbnRyb2lkKGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgZGF0ZT0iNjBkIiwgY19MQj0id0xCIiwgbWV0aD0iY2hhbyIpDQpgYGANCiMjIyMjIEZvciBQRVJNQU5PVkE6IGNvbXBhcmlzaW9uIGJldHdlZW4gY2hhbWJlcnMgYW5kIHRyZWF0bWVudHMgd2l0aCBicmF5LWN1cnRpcyBtZWFzdXJlDQpgYGB7cn0NCmNvbV9kaXZfdWRzX2NlbnRyb2lkKGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgZGF0ZT0iMTBkIiwgY19MQj0id0xCIiwgbWV0aD0iY2hhbyIsIGFkaj0iaG9sbSIpDQpjb21fZGl2X3Vkc19jZW50cm9pZChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIGRhdGU9IjMyZCIsIGNfTEI9IndMQiIsIG1ldGg9ImNoYW8iLCBhZGo9ImhvbG0iKQ0KY29tX2Rpdl91ZHNfY2VudHJvaWQoZGF0YV9uYW1lPXVkc19kYXRhX2FsbF9kYXkyLCBkYXRlPSI2MGQiLCBjX0xCPSJ3TEIiLCBtZXRoPSJjaGFvIiwgYWRqPSJob2xtIikNCmBgYA0KDQojIyMgVGVtcG9yYWwgZGl2ZXJnZW5jZSBvbiBlYWNoIHdpbGxvdyB0cmVlIChEZWNpZGVkIG5vdCB0byBwcmVzZW50KQ0KIyMjIyBQcmVwYXJhdGlvbiBvZiBmdW5jdGlvbnMgdG8gY2FsY3VsYXRlL3Zpc3VhbGl6ZSB0ZW1wb3JhbCBkaXZlcmdlbmNlDQpgYGB7cn0NCnR1cm5vdmVyX2NvbXBhcmlzb25fc2hvcnQgPC0gZnVuY3Rpb24oZGF0YV9uYW1lLCBkYXRlLCBjX0xCLCBtZXRoLCBvdXRwdXQgPSBOVUxMKQ0Kew0KIA0KICNkYXRhX25hbWUgPC0gdWRzX2RhdGFfYWxsX2RheTINCiAjZGF0ZSA8LSAiMTBkIg0KICNtZXRoPC0iY2hhbyINCiAjZGF0ZSA8LSAiMTBkIiwiMzJkIiwgb3IgIjYwZCIsIG9yIGFueQ0KIGlmKGNfTEIgPT0gIndMQiIpIHsNCiAgIHVkc19kYXRhMSA8LXN1YnNldChkYXRhX25hbWUsIGFidW5kYW5jZSA+IDApICAjZGVsZXRlIHRoZSBzYW1wbGluZyBkYXRhIHdpdGggMCB0b3RhbCBhYnVuZGFuY2Ugd2hlbiBsZWFmIGJlZXRsZQ0KICAgdWRzX2RhdGEyIDwtc3Vic2V0KHVkc19kYXRhMSwgZGF5PT1kYXRlKQ0KICAgdWRzX2VhY2g8LXVkc19kYXRhMlssYygtMSwtMiwtMywgLTc3LC03OCwgLTc5LC04MCldDQogfSAgI1doZW4gbGVhZiBiZWV0bGUgaXMgaW5jbHVkZWQNCiBpZihjX0xCID09ICJ3b0xCIikgew0KICAgdWRzX2RhdGExIDwtc3Vic2V0KGRhdGFfbmFtZSwgYWJ1bmRhbmNlMiA+IDApICNPUiwgZGVsZXRlIHRoZSBzYW1wbGluZyB3aGVuIHNwZWNpZXMgb3RoZXIgdGhhbiBsZWFmIGJlZXRsZSBkb2VzIG5vdCBleGlzdA0KICAgdWRzX2RhdGEyIDwtc3Vic2V0KHVkc19kYXRhMSwgZGF5PT1kYXRlKQ0KICAgdWRzX2VhY2g8LXVkc19kYXRhMlssYygtMSwtMiwtMywtNCwtNzcsLTc4LC03OSwtODApXQ0KIH0gICNXaGVuIGxlYWYgYmVldGxlIGlzIE5PVCBpbmNsdWRlZA0KIA0KIHNhbXBsZV9lYWNoIDwtIHN1YnNldCh1ZHNfZGF0YTEsIGRheT09ZGF0ZSkkc2FtcGxlDQogdHJlYXRtZW50X2VhY2ggPC0gc3Vic2V0KHVkc19kYXRhMSwgZGF5PT1kYXRlKSR0cmVhdG1lbnQNCiBjaGFtYmVyX2VhY2ggPC0gc3Vic2V0KHVkc19kYXRhMSwgZGF5PT1kYXRlKSRjaGFtYmVyDQogI1ZpZXcoY2hhbWJlcl9lYWNoKQ0KIHRpbWVfZWFjaCA8LSBzdWJzZXQodWRzX2RhdGExLCBkYXk9PWRhdGUpJHRpbWUNCiANCiAjcHJlcGFyZSBkdW1teSB2ZWN0b3JzDQogc2FtcGxlX24gPC0gTlVMTA0KIGRpc3RhbmNlX24gPC1OVUxMDQogdHJlYXRtZW50X24gPC1OVUxMDQogY2hhbWJlcl9uIDwtTlVMTA0KIHRpbWVpX24gPC1OVUxMDQogdGltZWpfbiA8LU5VTEwNCiANCiAjY2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4gMVAsIDJQLCBhbmQgM1ANCiBmb3IoaSBpbiAxOihsZW5ndGgoc2FtcGxlX2VhY2gpIC0gMSkpIHsNCiAgIGZvcihqIGluIChpICsgMSk6IGxlbmd0aChzYW1wbGVfZWFjaCkpIHsNCiAgICAgaWYoc2FtcGxlX2VhY2hbaV0gPT0gc2FtcGxlX2VhY2hbal0pIHsNCiAgICAgICBzYW1wbGVfbiA8LSBhcHBlbmQoc2FtcGxlX24sIGFzLmNoYXJhY3RlcihzYW1wbGVfZWFjaFtpXSkpDQogICAgICAgZGlzdGFuY2VfbiA8LSBhcHBlbmQoZGlzdGFuY2VfbiwgYXMubnVtZXJpYyh2ZWdkaXN0KHJiaW5kKHVkc19lYWNoW2ksXSwgdWRzX2VhY2hbaixdKSksIG1ldGhvZD1tZXRoKSkNCiAgICAgICB0cmVhdG1lbnRfbiA8LWFwcGVuZCh0cmVhdG1lbnRfbiwgYXMuY2hhcmFjdGVyKHRyZWF0bWVudF9lYWNoW2ldKSkNCiAgICAgICBjaGFtYmVyX24gPC0gYXBwZW5kKGNoYW1iZXJfbiwgYXMuY2hhcmFjdGVyKGNoYW1iZXJfZWFjaFtpXSkpDQogICAgICAgdGltZWlfbiA8LWFwcGVuZCh0aW1laV9uLCBhcy5jaGFyYWN0ZXIodGltZV9lYWNoW2ldKSkNCiAgICAgICB0aW1lal9uIDwtYXBwZW5kKHRpbWVqX24sIGFzLmNoYXJhY3Rlcih0aW1lX2VhY2hbal0pKQ0KICAgICB9DQogICAgfQ0KIH0NCiB0dXJub3ZlcjwtIGRhdGEuZnJhbWUoc2FtcGxlPXNhbXBsZV9uLCBkaXN0YW5jZT1kaXN0YW5jZV9uLCB0cmVhdG1lbnQ9dHJlYXRtZW50X24sIGNoYW1iZXI9Y2hhbWJlcl9uLCB0aW1laT10aW1laV9uLCB0aW1laj10aW1lal9uKQ0KDQogdHVybm92ZXIyIDwtc3Vic2V0KHR1cm5vdmVyLCAhKHRpbWVpID09ICIxUCIgJiB0aW1laj09IjNQIikpICAjZXhjbHVkZSB0aGUgY29tYmluYXRpb24gb2YgMVAgJiAzUCAocmVkdW5kYW50KQ0KIA0KICN0dXJub3Zlck4gPC0gc3Vic2V0KHR1cm5vdmVyMiwgdHJlYXRtZW50PT0iTiIpICAjc2VwYXJhdGUgZGF0YSBieSB0cmVhdG1lbnQNCiB0dXJub3ZlclQgPC0gc3Vic2V0KHR1cm5vdmVyMiwgdHJlYXRtZW50PT0iVCIpICAjc2VwYXJhdGUgZGF0YSBieSB0cmVhdG1lbnQNCiB0dXJub3ZlclcgPC0gc3Vic2V0KHR1cm5vdmVyMiwgdHJlYXRtZW50PT0iVyIpICAjc2VwYXJhdGUgZGF0YSBieSB0cmVhdG1lbnQNCiB0dXJub3ZlckMxIDwtIHN1YnNldCh0dXJub3ZlcjIsIGNoYW1iZXI9PSJDMSIpICNzZXBhcmF0ZSBkYXRhIGJ5IGNoYW1iZXINCiB0dXJub3ZlckMyIDwtIHN1YnNldCh0dXJub3ZlcjIsIGNoYW1iZXI9PSJDMiIpICNzZXBhcmF0ZSBkYXRhIGJ5IGNoYW1iZXINCiANCiAjY2FsY3VsYXRlIGF2ZXJhZ2Ugb2YgMVAgdnMgMlAgJiAyUCB2cyAzUCBpZiBhbnkNCiAjYXZlcmFnZV90dXJub3Zlck48LWJ5KGFzLm51bWVyaWModHVybm92ZXJOJGRpc3RhbmNlKSwgdHVybm92ZXJOJHNhbXBsZSwgbWVhbikNCiBhdmVyYWdlX3R1cm5vdmVyVDwtYnkoYXMubnVtZXJpYyh0dXJub3ZlclQkZGlzdGFuY2UpLCB0dXJub3ZlclQkc2FtcGxlLCBtZWFuKQ0KIGF2ZXJhZ2VfdHVybm92ZXJXPC1ieShhcy5udW1lcmljKHR1cm5vdmVyVyRkaXN0YW5jZSksIHR1cm5vdmVyVyRzYW1wbGUsIG1lYW4pDQogYXZlcmFnZV90dXJub3ZlckMxPC1ieShhcy5udW1lcmljKHR1cm5vdmVyQzEkZGlzdGFuY2UpLCB0dXJub3ZlckMxJHNhbXBsZSwgbWVhbikNCiBhdmVyYWdlX3R1cm5vdmVyQzI8LWJ5KGFzLm51bWVyaWModHVybm92ZXJDMiRkaXN0YW5jZSksIHR1cm5vdmVyQzIkc2FtcGxlLCBtZWFuKQ0KDQogI2F2ZXJhZ2VfTjwtc3Vic2V0KGF2ZXJhZ2VfdHVybm92ZXJOLCBhdmVyYWdlX3R1cm5vdmVyTj49MCkNCiBhdmVyYWdlX1Q8LXN1YnNldChhdmVyYWdlX3R1cm5vdmVyVCwgYXZlcmFnZV90dXJub3ZlclQ+PTApDQogYXZlcmFnZV9XPC1zdWJzZXQoYXZlcmFnZV90dXJub3ZlclcsIGF2ZXJhZ2VfdHVybm92ZXJXPj0wKQ0KIGF2ZXJhZ2VfQzE8LXN1YnNldChhdmVyYWdlX3R1cm5vdmVyQzEsIGF2ZXJhZ2VfdHVybm92ZXJDMT49MCkNCiBhdmVyYWdlX0MyPC1zdWJzZXQoYXZlcmFnZV90dXJub3ZlckMyLCBhdmVyYWdlX3R1cm5vdmVyQzI+PTApDQogDQogbGVuZ3RoKGF2ZXJhZ2VfVCkNCiAjdHJOPC1OVUxMDQogdHJUPC1OVUxMDQogdHJXPC1OVUxMDQogdHJDMTwtTlVMTA0KIHRyQzI8LU5VTEwNCiAjZm9yKGkgaW4gMTpsZW5ndGgoYXZlcmFnZV9OKSkgdHJOIDwtYXBwZW5kKHRyTiwgIk4iKQ0KIGZvcihpIGluIDE6bGVuZ3RoKGF2ZXJhZ2VfVCkpIHRyVCA8LWFwcGVuZCh0clQsICJFIikNCiBmb3IoaSBpbiAxOmxlbmd0aChhdmVyYWdlX1cpKSB0clcgPC1hcHBlbmQodHJXLCAiRCIpDQogZm9yKGkgaW4gMTpsZW5ndGgoYXZlcmFnZV9DMSkpIHRyQzEgPC1hcHBlbmQodHJDMSwgIkMxIikNCiBmb3IoaSBpbiAxOmxlbmd0aChhdmVyYWdlX0MyKSkgdHJDMiA8LWFwcGVuZCh0ckMyLCAiQzIiKQ0KIA0KICNhdl9OPC1kYXRhLmZyYW1lKHRyZWF0bWVudD10ck4sIGRpc3RhbmNlPWF2ZXJhZ2VfTikNCiBhdl9UPC1kYXRhLmZyYW1lKHRyZWF0bWVudD10clQsIGRpc3RhbmNlPWF2ZXJhZ2VfVCkNCiBhdl9XPC1kYXRhLmZyYW1lKHRyZWF0bWVudD10clcsIGRpc3RhbmNlPWF2ZXJhZ2VfVykNCiBhdl9DMTwtZGF0YS5mcmFtZShjaGFtYmVyPXRyQzEsIGRpc3RhbmNlPWF2ZXJhZ2VfQzEpDQogYXZfQzI8LWRhdGEuZnJhbWUoY2hhbWJlcj10ckMyLCBkaXN0YW5jZT1hdmVyYWdlX0MyKQ0KIA0KICNzdW1tYXJ5IGRhdGFmcmFtZQ0KIHR1cm5vdmVyX3Nob3J0IDwtIHJiaW5kLmRhdGEuZnJhbWUoYXZfVCwgYXZfVykNCiB0dXJub3Zlcl9zaG9ydEMgPC0gcmJpbmQuZGF0YS5mcmFtZShhdl9DMSwgYXZfQzIpDQogDQogI3ByaW50KHR1cm5vdmVyX3Nob3J0QyRkaXN0YW5jZSkNCiAjVmlldyh0dXJub3Zlcl9zaG9ydEMpDQogI1ZpZXcodHVybm92ZXJfc2hvcnQpDQogI3ByaW50KGRpc3RhbmNlX24pDQogDQogZ19ib3g8LWdncGxvdCh0dXJub3Zlcl9zaG9ydEMsIGFlcyh5PWRpc3RhbmNlLCB4PWNoYW1iZXIpKQ0KIGdfYm94PC1nX2JveCArIGdlb21fdmlvbGluKCkNCiBnX2JveDwtZ19ib3ggKyBnZW9tX2JveHBsb3Qod2lkdGg9MC4xKSANCiBnX2JveDwtZ19ib3ggKyBjb29yZF9maXhlZChyYXRpbyA9IDUvMSkgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMSkpDQogcHJpbnQoZ19ib3gpDQogZ19ib3gyPC1nZ3Bsb3QodHVybm92ZXJfc2hvcnQsIGFlcyh5PWRpc3RhbmNlLCB4PXRyZWF0bWVudCkpDQogZ19ib3gyPC1nX2JveDIgKyBnZW9tX3Zpb2xpbigpDQogZ19ib3gyPC1nX2JveDIgKyBnZW9tX2JveHBsb3Qod2lkdGg9MC4xKSANCiBnX2JveDI8LWdfYm94MiArIGNvb3JkX2ZpeGVkKHJhdGlvID0gNS8xKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxKSkNCiBwcmludChnX2JveDIpDQogDQogI3Bsb3RtZWFucyh0dXJub3Zlcl9zaG9ydEMkZGlzdGFuY2V+dHVybm92ZXJfc2hvcnRDJGNoYW1iZXIpDQogI3Bsb3RtZWFucyh0dXJub3Zlcl9zaG9ydCRkaXN0YW5jZX50dXJub3Zlcl9zaG9ydCR0cmVhdG1lbnQpDQoNCiBwcmludChiYXJ0bGV0dC50ZXN0KHR1cm5vdmVyX3Nob3J0QyRkaXN0YW5jZX50dXJub3Zlcl9zaG9ydEMkY2hhbWJlcikpDQogI09uZS13YXkgQU5PVkEgd2l0aCB1bmVxdWFsLXZhcmlhbmNlDQogcHJpbnQob25ld2F5LnRlc3QodHVybm92ZXJfc2hvcnRDJGRpc3RhbmNlfnR1cm5vdmVyX3Nob3J0QyRjaGFtYmVyLHZhci5lcXVhbD1GQUxTRSkpIA0KIA0KIHByaW50KGJhcnRsZXR0LnRlc3QodHVybm92ZXJfc2hvcnQkZGlzdGFuY2V+dHVybm92ZXJfc2hvcnQkdHJlYXRtZW50KSkNCiAjT25lLXdheSBBTk9WQSB3aXRoIHVuZXF1YWwtdmFyaWFuY2UNCiBwcmludChvbmV3YXkudGVzdCh0dXJub3Zlcl9zaG9ydCRkaXN0YW5jZX50dXJub3Zlcl9zaG9ydCR0cmVhdG1lbnQsdmFyLmVxdWFsPUZBTFNFKSkNCiAjUGFpcndpc2UgY29tcGFyaXNvbiB3aXRoIFdlbGNoJ3MgdCB0ZXN0DQogI3ByaW50KHBhaXJ3aXNlLnQudGVzdCh0dXJub3Zlcl9zaG9ydCRkaXN0YW5jZSwgdHVybm92ZXJfc2hvcnQkdHJlYXRtZW50LCBwLmFkaj0iaG9sbSIpKQ0KIA0KICNpZihvdXRwdXQ9PVRSVUUpIHJldHVybih0dXJub3Zlcl9zaG9ydCkNCiANCn0gIA0KDQp0dXJub3Zlcl9jb21wYXJpc29uX2xvbmcgPC0gZnVuY3Rpb24oZGF0YV9uYW1lLCBmcm9tX2RhdGUsIGNfTEIsIG1ldGg9ImNoYW8iLCBvdXRwdXQgPSBOVUxMKQ0Kew0KICANCiAgaWYoY19MQiA9PSAid0xCIikgew0KICAgIHVkc19kYXRhMSA8LXN1YnNldChkYXRhX25hbWUsIGFidW5kYW5jZSA+IDApICAjZGVsZXRlIHRoZSBzYW1wbGluZyBkYXRhIHdpdGggMCB0b3RhbCBhYnVuZGFuY2Ugd2hlbiBsZWFmIGJlZXRsZQ0KICAgIHVkc19lYWNoPC11ZHNfZGF0YTFbLGMoLTEsLTIsLTMsIC03NywtNzgsLTc5LC04MCldDQogIH0gICNXaGVuIGxlYWYgYmVldGxlIGlzIGluY2x1ZGVkDQogIGlmKGNfTEIgPT0gIndvTEIiKSB7DQogICAgdWRzX2RhdGExIDwtc3Vic2V0KGRhdGFfbmFtZSwgYWJ1bmRhbmNlMiA+IDApICNPUiwgZGVsZXRlIHRoZSBzYW1wbGluZyB3aGVuIHNwZWNpZXMgb3RoZXIgdGhhbiBsZWFmIGJlZXRsZSBkb2VzIG5vdCBleGlzdA0KICAgIHVkc19lYWNoPC11ZHNfZGF0YTFbLGMoLTEsLTIsLTMsLTQsLTc3LC03OCwtNzksLTgwKV0NCiAgfSAgI1doZW4gbGVhZiBiZWV0bGUgaXMgTk9UIGluY2x1ZGVkDQogIA0KICBzYW1wbGVfZWFjaCA8LSB1ZHNfZGF0YTEkc2FtcGxlDQogIGNoYW1iZXJfZWFjaCA8LSB1ZHNfZGF0YTEkY2hhbWJlcg0KICB0cmVhdG1lbnRfZWFjaCA8LSB1ZHNfZGF0YTEkdHJlYXRtZW50DQogIHRpbWVfZWFjaCA8LSB1ZHNfZGF0YTEkdGltZQ0KICANCiAgdWRzX3RpbWUuZDwtdmVnZGlzdCh1ZHNfZWFjaCwgbWV0aG9kPW1ldGgpDQogIHVkc19kaXN0X3RpbWUgPC1iZXRhZGlzcGVyKHVkc190aW1lLmQsIHNhbXBsZV9lYWNoLCB0eXBlPSJtZWRpYW4iLCBiaWFzLmFkanVzdCA9IFRSVUUpDQogIA0KICB1ZHNfZGF5Lm1lZGlhbiA8LSBkYXRhLmZyYW1lKHVkc19kaXN0X3RpbWUkY2VudHJvaWRzKSAgI2NhbGN1bGF0ZSB0aGUgY2VudHJvaWQgKHNwYXRpYWwgbWVkaWFuKSBmb3IgcmVwZWF0ZWQgbWVhc3VyZXMNCiANCiAgI1JlcGxhY2UgdGhlIHNhbXBsZSBuYW1lIGludG8gdGhlIHRyZWF0bWVudCAmIGRheSANCiAgc2FtcGxlMCA8LSByb3cubmFtZXModWRzX2RheS5tZWRpYW4pDQogIHNhbXBsZTEgPC0gc2FtcGxlMA0KICBzYW1wbGUyIDwtIHNhbXBsZTANCiAgc2FtcGxlMyA8LSBzYW1wbGUwDQogDQogIHNhbXBsZTA8LWdzdWIoIjFuIiwgIm4iLCBzYW1wbGUwKQ0KICBzYW1wbGUwPC1nc3ViKCIybiIsICJuIiwgc2FtcGxlMCkNCiAgc2FtcGxlMDwtZ3N1YigiM24iLCAibiIsIHNhbXBsZTApDQogIHNhbXBsZTA8LWdzdWIoIjF0IiwgInQiLCBzYW1wbGUwKQ0KICBzYW1wbGUwPC1nc3ViKCIydCIsICJ0Iiwgc2FtcGxlMCkNCiAgc2FtcGxlMDwtZ3N1YigiM3QiLCAidCIsIHNhbXBsZTApDQogIHNhbXBsZTA8LWdzdWIoIjF3IiwgInciLCBzYW1wbGUwKQ0KICBzYW1wbGUwPC1nc3ViKCIydyIsICJ3Iiwgc2FtcGxlMCkNCiAgc2FtcGxlMDwtZ3N1YigiM3ciLCAidyIsIHNhbXBsZTApDQogIA0KICBzYW1wbGUxW2dyZXAoIm4iLCBzYW1wbGUxKV08LSAiQzEiDQogIHNhbXBsZTFbZ3JlcCgidCIsIHNhbXBsZTEpXTwtICJDMiINCiAgc2FtcGxlMVtncmVwKCJ3Iiwgc2FtcGxlMSldPC0gIkMyIg0KICANCiAgc2FtcGxlMltncmVwKCJuIiwgc2FtcGxlMildPC0gIlUiDQogIHNhbXBsZTJbZ3JlcCgidCIsIHNhbXBsZTIpXTwtICJFIg0KICBzYW1wbGUyW2dyZXAoInciLCBzYW1wbGUyKV08LSAiRCINCiAgDQogIHNhbXBsZTNbZ3JlcCgiMW4iLCBzYW1wbGUzKV0gPC0iMTBkIg0KICBzYW1wbGUzW2dyZXAoIjJuIiwgc2FtcGxlMyldIDwtIjMyZCINCiAgc2FtcGxlM1tncmVwKCIzbiIsIHNhbXBsZTMpXSA8LSI2MGQiDQogIHNhbXBsZTNbZ3JlcCgiMXQiLCBzYW1wbGUzKV0gPC0iMTBkIg0KICBzYW1wbGUzW2dyZXAoIjJ0Iiwgc2FtcGxlMyldIDwtIjMyZCINCiAgc2FtcGxlM1tncmVwKCIzdCIsIHNhbXBsZTMpXSA8LSI2MGQiDQogIHNhbXBsZTNbZ3JlcCgiMXciLCBzYW1wbGUzKV0gPC0iMTBkIg0KICBzYW1wbGUzW2dyZXAoIjJ3Iiwgc2FtcGxlMyldIDwtIjMyZCINCiAgc2FtcGxlM1tncmVwKCIzdyIsIHNhbXBsZTMpXSA8LSI2MGQiDQogIA0KICBzYW1wbGVfZWFjaCA8LSBhcy5mYWN0b3Ioc2FtcGxlMCkNCiAgY2hhbWJlcl9lYWNoIDwtIGFzLmZhY3RvcihzYW1wbGUxKQ0KICB0cmVhdG1lbnRfZWFjaCA8LSBhcy5mYWN0b3Ioc2FtcGxlMikgI2p1c3QgY29udmVyc2lvbg0KICBkYXlfZWFjaCA8LSBhcy5mYWN0b3Ioc2FtcGxlMykgI2p1c3QgY29udmVyc2lvbg0KICANCiAgdWRzX2RheS5tZWRpYW4yPC1jYmluZChjaGFtYmVyPWNoYW1iZXJfZWFjaCwgdWRzX2RheS5tZWRpYW4pDQogIHVkc19kYXkubWVkaWFuMjwtY2JpbmQodHJlYXRtZW50PXRyZWF0bWVudF9lYWNoLCB1ZHNfZGF5Lm1lZGlhbjIpDQogIHVkc19kYXkubWVkaWFuMjwtY2JpbmQoZGF5PWRheV9lYWNoLCB1ZHNfZGF5Lm1lZGlhbjIpDQogIHVkc19kYXkubWVkaWFuMjwtY2JpbmQoc2FtcGxlX2VhY2gsIHVkc19kYXkubWVkaWFuMikNCiAgDQogIA0KICB1ZHNfZGF5Lm1lZGlhbjJbMSxjKC0xLC0yLC0zKV0gDQogIHVkc19kYXkubWVkaWFuMiRzYW1wbGVfZWFjaFsyXQ0KICAjVmlldyh1ZHNfZGF5Lm1lZGlhbjIpDQogIA0KICAjcHJlcGFyZSBkdW1teSB2ZWN0b3JzDQogIHNhbXBsZV9uIDwtIE5VTEwNCiAgZGlzdGFuY2VfbiA8LU5VTEwNCiAgY2hhbWJlcl9uIDwtTlVMTA0KICB0cmVhdG1lbnRfbiA8LU5VTEwNCiAgZGF5aV9uIDwtTlVMTA0KICBkYXlqX24gPC1OVUxMDQogIA0KICAjY2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4gMTBkLCAzMmQsIGFuZCA2MGQNCiAgZm9yKGkgaW4gMToobGVuZ3RoKHNhbXBsZV9lYWNoKSAtIDEpKSB7DQogICAgZm9yKGogaW4gKGkgKyAxKTogbGVuZ3RoKHNhbXBsZV9lYWNoKSkgew0KICAgICAgaWYoc2FtcGxlX2VhY2hbaV0gPT0gc2FtcGxlX2VhY2hbal0pIHsNCiAgICAgICAgc2FtcGxlX24gPC0gYXBwZW5kKHNhbXBsZV9uLCBhcy5jaGFyYWN0ZXIoc2FtcGxlX2VhY2hbaV0pKQ0KICAgICAgICBkaXN0YW5jZV9uIDwtIGFwcGVuZChkaXN0YW5jZV9uLCBhcy5udW1lcmljKHZlZ2Rpc3QocmJpbmQuZGF0YS5mcmFtZSh1ZHNfZGF5Lm1lZGlhbjJbaSxjKC0xLC0yLC0zLC00KV0sIHVkc19kYXkubWVkaWFuMltqLGMoLTEsLTIsLTMsLTQpXSksIG1ldGhvZD0iZXVjbGlkZWFuIikpKQ0KICAgICAgICBjaGFtYmVyX24gPC1hcHBlbmQoY2hhbWJlcl9uLCBhcy5jaGFyYWN0ZXIoY2hhbWJlcl9lYWNoW2ldKSkNCiAgICAgICAgdHJlYXRtZW50X24gPC1hcHBlbmQodHJlYXRtZW50X24sIGFzLmNoYXJhY3Rlcih0cmVhdG1lbnRfZWFjaFtpXSkpDQogICAgICAgIGRheWlfbiA8LWFwcGVuZChkYXlpX24sIGFzLmNoYXJhY3RlcihkYXlfZWFjaFtpXSkpDQogICAgICAgIGRheWpfbiA8LWFwcGVuZChkYXlqX24sIGFzLmNoYXJhY3RlcihkYXlfZWFjaFtqXSkpDQogICAgICB9DQogICAgfQ0KICB9DQogIHR1cm5vdmVyPC0gZGF0YS5mcmFtZShzYW1wbGU9c2FtcGxlX24sIGRpc3RhbmNlPWRpc3RhbmNlX24sIGNoYW1iZXI9Y2hhbWJlcl9uLCB0cmVhdG1lbnQ9dHJlYXRtZW50X24sIGRheWk9ZGF5aV9uLCBkYXlqPWRheWpfbikNCiAgDQogIGlmKGZyb21fZGF0ZSA9PSAiMTBkIikgdHVybm92ZXJfbG9uZyA8LXN1YnNldCh0dXJub3ZlciwgKGRheWkgPT0gIjEwZCIgJiBkYXlqPT0iMzJkIikpICANCiAgI3R1cm5vdmVyXzEwZDYwZCA8LXN1YnNldCh0dXJub3ZlciwgKGRheWkgPT0gIjEwZCIgJiBkYXlqPT0iNjBkIikpICAjbm90IHVzZWQgZXhjbHVkaW5nIHRoZSBjb21iaW5hdGlvbiBvZiAxMGQgJiA2MGQgKHJlZHVuZGFuY3QpDQogIGlmKGZyb21fZGF0ZSA9PSAiMzJkIikgdHVybm92ZXJfbG9uZyA8LXN1YnNldCh0dXJub3ZlciwgKGRheWkgPT0gIjMyZCIgJiBkYXlqPT0iNjBkIikpICANCiANCiAgdHVybm92ZXJfbG9uZ190ciA8LSBzdWJzZXQodHVybm92ZXJfbG9uZywgY2hhbWJlciA9PSAiQzIiKQ0KICANCiAgVmlldyh0dXJub3Zlcl9sb25nKQ0KICBWaWV3KHR1cm5vdmVyX2xvbmdfdHIpDQogIA0KICBnX2JveDwtZ2dwbG90KHR1cm5vdmVyX2xvbmcsIGFlcyh5PWRpc3RhbmNlLCB4PWNoYW1iZXIpKQ0KICBnX2JveDwtZ19ib3ggKyBnZW9tX3Zpb2xpbigpDQogIGdfYm94PC1nX2JveCArIGdlb21fYm94cGxvdCh3aWR0aD0wLjEpIA0KICBnX2JveDwtZ19ib3ggKyBjb29yZF9maXhlZChyYXRpbyA9IDUvMSkNCiAgcHJpbnQoZ19ib3gpDQogIGdfYm94MjwtZ2dwbG90KHR1cm5vdmVyX2xvbmdfdHIsIGFlcyh5PWRpc3RhbmNlLCB4PXRyZWF0bWVudCkpDQogIGdfYm94MjwtZ19ib3gyICsgZ2VvbV92aW9saW4oKQ0KICBnX2JveDI8LWdfYm94MiArIGdlb21fYm94cGxvdCh3aWR0aD0wLjEpIA0KICBnX2JveDI8LWdfYm94MiArIGNvb3JkX2ZpeGVkKHJhdGlvID0gNS8xKQ0KICBwcmludChnX2JveDIpDQogICNwbG90bWVhbnModHVybm92ZXJfbG9uZyRkaXN0YW5jZX50dXJub3Zlcl9sb25nJGNoYW1iZXIpDQogICNwbG90bWVhbnModHVybm92ZXJfbG9uZ190ciRkaXN0YW5jZX50dXJub3Zlcl9sb25nX3RyJHRyZWF0bWVudCkNCiAgDQogIHByaW50KGJhcnRsZXR0LnRlc3QodHVybm92ZXJfbG9uZyRkaXN0YW5jZX50dXJub3Zlcl9sb25nJGNoYW1iZXIpKQ0KICBwcmludChiYXJ0bGV0dC50ZXN0KHR1cm5vdmVyX2xvbmdfdHIkZGlzdGFuY2V+dHVybm92ZXJfbG9uZ190ciR0cmVhdG1lbnQpKQ0KICAjT25lLXdheSBBTk9WQSB3aXRoIHVuZXF1YWwtdmFyaWFuY2UNCiAgcHJpbnQob25ld2F5LnRlc3QodHVybm92ZXJfbG9uZyRkaXN0YW5jZX50dXJub3Zlcl9sb25nJGNoYW1iZXIsdmFyLmVxdWFsPUZBTFNFKSkNCiAgcHJpbnQob25ld2F5LnRlc3QodHVybm92ZXJfbG9uZ190ciRkaXN0YW5jZX50dXJub3Zlcl9sb25nX3RyJHRyZWF0bWVudCx2YXIuZXF1YWw9RkFMU0UpKQ0KICANCn0NCmBgYA0KIyMjI0NhbGN1bGF0ZS9WaXN1YWxpemUgd2l0aGluIGRheSB0dXJub3ZlciAod2hpY2ggaXMgbm90IHVzZWQgaW4gdGhlIG1hbnVzY3JpcHQpDQpgYGB7cn0NCiMoTm8gZGlmZmVyZW5jZSBhdCBhbGwgQCAxMCBkYXkgYmV0d2VlbiB0aW1lKSAgIyMjI0ZvciBGaWcuIFMxDQojdHVybm92ZXJfY29tcGFyaXNvbl9zaG9ydChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIGRhdGU9IjEwZCIsIGNfTEI9IndvTEIiLCBtZXRoPSJjaGFvIikgICNlcnJvciBkdWUgdG8gbGFjayBvZiByZXBsaWNhdGlvbiB3aXRoaW4gZGF5DQp0dXJub3Zlcl9jb21wYXJpc29uX3Nob3J0KGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgZGF0ZT0iMzJkIiwgY19MQj0id29MQiIsIG1ldGg9ImNoYW8iKQ0KdHVybm92ZXJfY29tcGFyaXNvbl9zaG9ydChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIGRhdGU9IjYwZCIsIGNfTEI9IndvTEIiLCBtZXRoPSJjaGFvIikNCmBgYA0KDQojIyMjQ2FsY3VsYXRlL1Zpc3VhbGl6ZSBiZXR3ZWVuIGRhdGVzIHR1cm5vdmVyIChub3QgdXNlZCkNCmBgYHtyfQ0KDQojKE5vIGRpZmZlcmVuY2UgYXQgYWxsIEAgMTAgZGF5IGJldHdlZW4gdGltZSkgIyMjI0ZvciBGaWcuIFMxDQp0dXJub3Zlcl9jb21wYXJpc29uX2xvbmcoZGF0YV9uYW1lPXVkc19kYXRhX2FsbF9kYXkyLCBmcm9tX2RhdGU9IjEwZCIsIGNfTEI9IndvTEIiLCBtZXRoPSJjaGFvIikNCnR1cm5vdmVyX2NvbXBhcmlzb25fbG9uZyhkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIGZyb21fZGF0ZT0iMzJkIiwgY19MQj0id29MQiIsIG1ldGg9ImNoYW8iKQ0KYGBgDQojIyMjIFN1bW1hcnkgb2YgdGhlIHNwZWNpZXMgdHVybm92ZXIgYW5hbHlzaXMgKERlY2lkZWQgbm90IHRvIHVzZSkNCi0gTm8gZGlmZmVyZW5jZXMgYmV0d2VlbiBDaGFtYmVycw0KLSBObyBkaWZmZXJlbmNlcyBiZXR3ZWVuIEUgYW5kIEQNCg0KIyMjIFJlbGF0aW9uc2hpcCBiZXR3ZWVuIGxlYWYgYmVldGxlIHBvcHVsYXRpb24gc2l6ZSBhbmQgY29tbXVuaXR5IGNvbXBvc2l0aW9uDQojIyMjIFByZXBhcmF0aW9uIGZvciBNYW50ZWwgdGVzdA0KYGBge3J9DQpMQl9kaWZmX0MxX2QxMC5kPC1kaXNwZXJfdWRzX2NlbnRyb2lkKGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgZGF0ZT0iMTBkIiwgY19MQj0iTEJvbmx5IiwgbWV0aD0iZXVjbGlkZWFuIixkaXN0X291dD0iQzEiKQ0KTEJfZGlmZl9DMl9kMTAuZDwtZGlzcGVyX3Vkc19jZW50cm9pZChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIGRhdGU9IjEwZCIsIGNfTEI9IkxCb25seSIsIG1ldGg9ImV1Y2xpZGVhbiIsZGlzdF9vdXQ9IkMyIikNCkxCX2RpZmZfQzEyX2QxMC5kPC1kaXNwZXJfdWRzX2NlbnRyb2lkKGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgZGF0ZT0iMTBkIiwgY19MQj0iTEJvbmx5IiwgbWV0aD0iZXVjbGlkZWFuIixkaXN0X291dD0iQzEyIikNCkxCX2RpZmZfQzFfZDMyLmQ8LWRpc3Blcl91ZHNfY2VudHJvaWQoZGF0YV9uYW1lPXVkc19kYXRhX2FsbF9kYXkyLCBkYXRlPSIzMmQiLCBjX0xCPSJMQm9ubHkiLCBtZXRoPSJldWNsaWRlYW4iLGRpc3Rfb3V0PSJDMSIpDQpMQl9kaWZmX0MyX2QzMi5kPC1kaXNwZXJfdWRzX2NlbnRyb2lkKGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgZGF0ZT0iMzJkIiwgY19MQj0iTEJvbmx5IiwgbWV0aD0iZXVjbGlkZWFuIixkaXN0X291dD0iQzIiKQ0KTEJfZGlmZl9DMTJfZDMyLmQ8LWRpc3Blcl91ZHNfY2VudHJvaWQoZGF0YV9uYW1lPXVkc19kYXRhX2FsbF9kYXkyLCBkYXRlPSIzMmQiLCBjX0xCPSJMQm9ubHkiLCBtZXRoPSJldWNsaWRlYW4iLGRpc3Rfb3V0PSJDMTIiKQ0KTEJfZGlmZl9DMV9kNjAuZDwtZGlzcGVyX3Vkc19jZW50cm9pZChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIGRhdGU9IjYwZCIsIGNfTEI9IkxCb25seSIsIG1ldGg9ImV1Y2xpZGVhbiIsZGlzdF9vdXQ9IkMxIikNCkxCX2RpZmZfQzJfZDYwLmQ8LWRpc3Blcl91ZHNfY2VudHJvaWQoZGF0YV9uYW1lPXVkc19kYXRhX2FsbF9kYXkyLCBkYXRlPSI2MGQiLCBjX0xCPSJMQm9ubHkiLCBtZXRoPSJldWNsaWRlYW4iLGRpc3Rfb3V0PSJDMiIpDQpMQl9kaWZmX0MxMl9kNjAuZDwtZGlzcGVyX3Vkc19jZW50cm9pZChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIGRhdGU9IjYwZCIsIGNfTEI9IkxCb25seSIsIG1ldGg9ImV1Y2xpZGVhbiIsZGlzdF9vdXQ9IkMxMiIpDQoNCmNvbW1fZGlmZl9DMV9kMTAuZDwtZGlzcGVyX3Vkc19jZW50cm9pZChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIGRhdGU9IjEwZCIsIGNfTEI9IndvTEIiLCBtZXRoPSJjaGFvIixkaXN0X291dD0iQzEiKQ0KY29tbV9kaWZmX0MyX2QxMC5kPC1kaXNwZXJfdWRzX2NlbnRyb2lkKGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgZGF0ZT0iMTBkIiwgY19MQj0id29MQiIsIG1ldGg9ImNoYW8iLGRpc3Rfb3V0PSJDMiIpDQpjb21tX2RpZmZfQzEyX2QxMC5kPC1kaXNwZXJfdWRzX2NlbnRyb2lkKGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgZGF0ZT0iMTBkIiwgY19MQj0id29MQiIsIG1ldGg9ImNoYW8iLGRpc3Rfb3V0PSJDMTIiKQ0KY29tbV9kaWZmX0MxX2QzMi5kPC1kaXNwZXJfdWRzX2NlbnRyb2lkKGRhdGFfbmFtZT11ZHNfZGF0YV9hbGxfZGF5MiwgZGF0ZT0iMzJkIiwgY19MQj0id29MQiIsIG1ldGg9ImNoYW8iLGRpc3Rfb3V0PSJDMSIpDQpjb21tX2RpZmZfQzJfZDMyLmQ8LWRpc3Blcl91ZHNfY2VudHJvaWQoZGF0YV9uYW1lPXVkc19kYXRhX2FsbF9kYXkyLCBkYXRlPSIzMmQiLCBjX0xCPSJ3b0xCIiwgbWV0aD0iY2hhbyIsZGlzdF9vdXQ9IkMyIikNCmNvbW1fZGlmZl9DMTJfZDMyLmQ8LWRpc3Blcl91ZHNfY2VudHJvaWQoZGF0YV9uYW1lPXVkc19kYXRhX2FsbF9kYXkyLCBkYXRlPSIzMmQiLCBjX0xCPSJ3b0xCIiwgbWV0aD0iY2hhbyIsZGlzdF9vdXQ9IkMxMiIpDQpjb21tX2RpZmZfQzFfZDYwLmQ8LWRpc3Blcl91ZHNfY2VudHJvaWQoZGF0YV9uYW1lPXVkc19kYXRhX2FsbF9kYXkyLCBkYXRlPSI2MGQiLCBjX0xCPSJ3b0xCIiwgbWV0aD0iY2hhbyIsZGlzdF9vdXQ9IkMxIikNCmNvbW1fZGlmZl9DMl9kNjAuZDwtZGlzcGVyX3Vkc19jZW50cm9pZChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIGRhdGU9IjYwZCIsIGNfTEI9IndvTEIiLCBtZXRoPSJjaGFvIixkaXN0X291dD0iQzIiKQ0KY29tbV9kaWZmX0MxMl9kNjAuZDwtZGlzcGVyX3Vkc19jZW50cm9pZChkYXRhX25hbWU9dWRzX2RhdGFfYWxsX2RheTIsIGRhdGU9IjYwZCIsIGNfTEI9IndvTEIiLCBtZXRoPSJjaGFvIixkaXN0X291dD0iQzEyIikNCg0KYGBgDQojIyMjIE1hbnRlbCB0ZXN0IGFuZCBzaW1wbGUgcGxvdHMNCmBgYHtyfQ0KcGxvdChMQl9kaWZmX0MxX2QxMC5kLCBjb21tX2RpZmZfQzFfZDEwLmQpDQptYW50ZWwoTEJfZGlmZl9DMV9kMTAuZCwgY29tbV9kaWZmX0MxX2QxMC5kLCBtZXRob2Q9InBlYXJzb24iLCBwZXJtdXRhdGlvbnM9OTk5OSkNCnBsb3QoTEJfZGlmZl9DMl9kMTAuZCwgY29tbV9kaWZmX0MyX2QxMC5kKQ0KbWFudGVsKExCX2RpZmZfQzJfZDEwLmQsIGNvbW1fZGlmZl9DMl9kMTAuZCwgbWV0aG9kPSJwZWFyc29uIiwgcGVybXV0YXRpb25zPTk5OTkpDQpwbG90KExCX2RpZmZfQzEyX2QxMC5kLCBjb21tX2RpZmZfQzEyX2QxMC5kKQ0KbWFudGVsKExCX2RpZmZfQzEyX2QxMC5kLCBjb21tX2RpZmZfQzEyX2QxMC5kLCBtZXRob2Q9InBlYXJzb24iLCBwZXJtdXRhdGlvbnM9OTk5OSkNCg0KcGxvdChMQl9kaWZmX0MxX2QzMi5kLCBjb21tX2RpZmZfQzFfZDMyLmQpDQptYW50ZWwoTEJfZGlmZl9DMV9kMzIuZCwgY29tbV9kaWZmX0MxX2QzMi5kLCBtZXRob2Q9InBlYXJzb24iLCBwZXJtdXRhdGlvbnM9OTk5OSkNCnBsb3QoTEJfZGlmZl9DMl9kMzIuZCwgY29tbV9kaWZmX0MyX2QzMi5kKQ0KbWFudGVsKExCX2RpZmZfQzJfZDMyLmQsIGNvbW1fZGlmZl9DMl9kMzIuZCwgbWV0aG9kPSJwZWFyc29uIiwgcGVybXV0YXRpb25zPTk5OTkpDQpwbG90KExCX2RpZmZfQzEyX2QzMi5kLCBjb21tX2RpZmZfQzEyX2QzMi5kKQ0KbWFudGVsKExCX2RpZmZfQzEyX2QzMi5kLCBjb21tX2RpZmZfQzEyX2QzMi5kLCBtZXRob2Q9InBlYXJzb24iLCBwZXJtdXRhdGlvbnM9OTk5OSkNCg0KcGxvdChMQl9kaWZmX0MxX2Q2MC5kLCBjb21tX2RpZmZfQzFfZDYwLmQpDQojbWFudGVsKExCX2RpZmZfQzFfZDYwLmQsIGNvbW1fZGlmZl9DMV9kNjAuZCwgbWV0aG9kPSJwZWFyc29uIiwgcGVybXV0YXRpb25zPTk5OTkpDQpwbG90KExCX2RpZmZfQzJfZDYwLmQsIGNvbW1fZGlmZl9DMl9kNjAuZCkNCm1hbnRlbChMQl9kaWZmX0MyX2Q2MC5kLCBjb21tX2RpZmZfQzJfZDYwLmQsIG1ldGhvZD0icGVhcnNvbiIsIHBlcm11dGF0aW9ucz05OTk5KQ0KcGxvdChMQl9kaWZmX0MxMl9kNjAuZCwgY29tbV9kaWZmX0MxMl9kNjAuZCkNCm1hbnRlbChMQl9kaWZmX0MxMl9kNjAuZCwgY29tbV9kaWZmX0MxMl9kNjAuZCwgbWV0aG9kPSJwZWFyc29uIiwgcGVybXV0YXRpb25zPTk5OTkpDQoNCmBgYA0KIyMjIyBnZ3Bsb3QgZm9yIG1hbnRlbCB0ZXN0DQpPbmx5IGZvciBkYXkgMzINCmBgYHtyfQ0KbGlicmFyeShyZXNoYXBlKQ0KI0MxIG9ubHkNCm1fTEIgPC0gYXMubWF0cml4KExCX2RpZmZfQzFfZDMyLmQpDQptMl9MQiA8LSBtZWx0KG1fTEIpW21lbHQodXBwZXIudHJpKG1fTEIpKSR2YWx1ZSxdDQpuYW1lcyhtMl9MQikgPC0gYygidDEiLCAidDIiLCAiZGlzdGFuY2VfTEIiKQ0KI1ZpZXcobTJfTEIpDQptX2NvbSA8LSBhcy5tYXRyaXgoY29tbV9kaWZmX0MxX2QzMi5kKQ0KbTJfY29tIDwtIG1lbHQobV9jb20pW21lbHQodXBwZXIudHJpKG1fY29tKSkkdmFsdWUsXQ0KbmFtZXMobTJfY29tKSA8LSBjKCJ0dDEiLCAidHQyIiwgImRpc3RhbmNlX2NvbSIpDQptMl9MQl9jb20gPC0gY2JpbmQuZGF0YS5mcmFtZShtMl9MQiwgbTJfY29tKQ0KI1ZpZXcobTJfTEJfY29tKQ0KDQpnX3BvaW50czwtZ2dwbG90KG0yX0xCX2NvbSwgYWVzKHk9ZGlzdGFuY2VfY29tLCB4PWRpc3RhbmNlX0xCKSkgKyB4bGltKDAsOCkgKyB5bGltKDAsMS41KSArIGNvb3JkX2ZpeGVkKDgvMS41KSArIGdndGl0bGUoIkMxIG9ubHkiKQ0KZ19wb2ludHM8LWdfcG9pbnRzK2dlb21fcG9pbnQoc2l6ZT0yLGFscGhhPTAuMykgDQpyZXN1bHQ8LWxtKG0yX0xCX2NvbSRkaXN0YW5jZV9jb21+bTJfTEJfY29tJGRpc3RhbmNlX0xCKQ0Kc3VtbWFyeShyZXN1bHQpDQpyZXN1bHQkY29lZmZpY2llbnRzWzFdDQpnX3BvaW50czwtZ19wb2ludHMrZ2VvbV9hYmxpbmUoc2xvcGUgPSByZXN1bHQkY29lZmZpY2llbnRzWzJdLGludGVyY2VwdCA9IHJlc3VsdCRjb2VmZmljaWVudHNbMV0sc2l6ZT0xLGxpbmV0eXBlPTIsY29sb3VyPSJibHVlIikgIyBzbG9wZQ0KcHJpbnQoZ19wb2ludHMpDQoNCiNDMiBvbmx5DQptX0xCIDwtIGFzLm1hdHJpeChMQl9kaWZmX0MyX2QzMi5kKQ0KbTJfTEIgPC0gbWVsdChtX0xCKVttZWx0KHVwcGVyLnRyaShtX0xCKSkkdmFsdWUsXQ0KbmFtZXMobTJfTEIpIDwtIGMoInQxIiwgInQyIiwgImRpc3RhbmNlX0xCIikNCiNWaWV3KG0yX0xCKQ0KbV9jb20gPC0gYXMubWF0cml4KGNvbW1fZGlmZl9DMl9kMzIuZCkNCm0yX2NvbSA8LSBtZWx0KG1fY29tKVttZWx0KHVwcGVyLnRyaShtX2NvbSkpJHZhbHVlLF0NCm5hbWVzKG0yX2NvbSkgPC0gYygidHQxIiwgInR0MiIsICJkaXN0YW5jZV9jb20iKQ0KbTJfTEJfY29tIDwtIGNiaW5kLmRhdGEuZnJhbWUobTJfTEIsIG0yX2NvbSkNCiNWaWV3KG0yX0xCX2NvbSkNCg0KZ19wb2ludHM8LWdncGxvdChtMl9MQl9jb20sIGFlcyh5PWRpc3RhbmNlX2NvbSwgeD1kaXN0YW5jZV9MQikpICsgeGxpbSgwLDgpICsgeWxpbSgwLDEuNSkgKyBjb29yZF9maXhlZCg4LzEuNSkgKyBnZ3RpdGxlKCJDMiBvbmx5IikNCmdfcG9pbnRzPC1nX3BvaW50cytnZW9tX3BvaW50KHNpemU9MixhbHBoYT0wLjMpIA0KcmVzdWx0PC1sbShtMl9MQl9jb20kZGlzdGFuY2VfY29tfm0yX0xCX2NvbSRkaXN0YW5jZV9MQikNCnN1bW1hcnkocmVzdWx0KQ0KcmVzdWx0JGNvZWZmaWNpZW50c1sxXQ0KZ19wb2ludHM8LWdfcG9pbnRzK2dlb21fYWJsaW5lKHNsb3BlID0gcmVzdWx0JGNvZWZmaWNpZW50c1syXSxpbnRlcmNlcHQgPSByZXN1bHQkY29lZmZpY2llbnRzWzFdLHNpemU9MSxsaW5ldHlwZT0xLGNvbG91cj0iYmx1ZSIpICMgc2xvcGUNCnByaW50KGdfcG9pbnRzKQ0KDQojQzEgKyBDMiANCm1fTEIgPC0gYXMubWF0cml4KExCX2RpZmZfQzEyX2QzMi5kKQ0KbTJfTEIgPC0gbWVsdChtX0xCKVttZWx0KHVwcGVyLnRyaShtX0xCKSkkdmFsdWUsXQ0KbmFtZXMobTJfTEIpIDwtIGMoInQxIiwgInQyIiwgImRpc3RhbmNlX0xCIikNCiNWaWV3KG0yX0xCKQ0KbV9jb20gPC0gYXMubWF0cml4KGNvbW1fZGlmZl9DMTJfZDMyLmQpDQptMl9jb20gPC0gbWVsdChtX2NvbSlbbWVsdCh1cHBlci50cmkobV9jb20pKSR2YWx1ZSxdDQpuYW1lcyhtMl9jb20pIDwtIGMoInR0MSIsICJ0dDIiLCAiZGlzdGFuY2VfY29tIikNCm0yX0xCX2NvbSA8LSBjYmluZC5kYXRhLmZyYW1lKG0yX0xCLCBtMl9jb20pDQojVmlldyhtMl9MQl9jb20pDQoNCmdfcG9pbnRzPC1nZ3Bsb3QobTJfTEJfY29tLCBhZXMoeT1kaXN0YW5jZV9jb20sIHg9ZGlzdGFuY2VfTEIpKSArIHhsaW0oMCw4KSArIHlsaW0oMCwxLjUpICsgY29vcmRfZml4ZWQoOC8xLjUpICsgZ2d0aXRsZSgiQzEgKyBDMiIpDQpnX3BvaW50czwtZ19wb2ludHMrZ2VvbV9wb2ludChzaXplPTIsYWxwaGE9MC4zKSANCnJlc3VsdDwtbG0obTJfTEJfY29tJGRpc3RhbmNlX2NvbX5tMl9MQl9jb20kZGlzdGFuY2VfTEIpDQpyZXN1bHQkY29lZmZpY2llbnRzWzFdDQpnX3BvaW50czwtZ19wb2ludHMrZ2VvbV9hYmxpbmUoc2xvcGUgPSByZXN1bHQkY29lZmZpY2llbnRzWzJdLGludGVyY2VwdCA9IHJlc3VsdCRjb2VmZmljaWVudHNbMV0sc2l6ZT0xLGxpbmV0eXBlPTEsY29sb3VyPSJibHVlIikgIyBzbG9wZQ0KcHJpbnQoZ19wb2ludHMpDQoNCmBgYA0KDQoNCiMjIyMgU3VtbWFyeSBvZiBtYW50ZWwgdGVzdA0KLSBQb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBMQiBwb3B1bGF0aW9uIHNpemUgYW5kIGNvbW11bml0eSBjb21wb3NpdGlvbiBhdCBkYXkgMzIgZm9yIHRoZSB3aG9sZSBkYXRhDQotIFBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIExCIHBvcHVsYXRpb24gc2l6ZSBhbmQgY29tbXVuaXR5IGNvbXBvc2l0aW9uIGF0IGRheSAzMiBmb3IgQzIgY2hhbWJlcg0KLSBObyByZWxhdGlvbnNoaXAgYmV0d2VlbiBMQiBwb3B1bGF0aW9uIHNpemUgYW5kIGNvbW11bml0eSBjb21wb3NpdGlvbiBhdCBkYXkgMzIgZm9yIEMxIGNoYW1iZXINCg0KDQojIyBTcGVjaWVzIHJpY2huZXNzIGFuYWx5c2lzIChGaWcuMyAmIEZpZy5TMykNCiMjIyBQcmVwYXJhdGlvbiBvZiBmdW5jdGlvbnMgd2l0aCBpTkVYVCBwYWNrYWdlDQpgYGB7cn0NCg0KYWxwaGFfaGlsbF9udW1iZXIgPC0gZnVuY3Rpb24oZGF0YV9uYW1lLCBkYXRlLCBxKQ0Kew0KICAjZGF0YV9uYW1lIDwtdWRzX2RhdGFfYWxsX2RheTINCiAgI2RhdGUgPC0gIjMyZCINCiAgI0luY2x1ZGluZyBsZWFmX2JlZXRsZQ0KICANCiAgdWRzX2RhdGExIDwtc3Vic2V0KGRhdGFfbmFtZSwgYWJ1bmRhbmNlMiA+PSAwKSAjT1IsIGRlbGV0ZSB0aGUgc2FtcGxpbmcgd2hlbiBzcGVjaWVzIG90aGVyIHRoYW4gbGVhZiBiZWV0bGUgZG9lcyBub3QgZXhpc3QNCiAgdWRzX2RhdGEyIDwtc3Vic2V0KHVkc19kYXRhMSwgZGF5PT1kYXRlKQ0KICANCiAgI2lmIGV4Y2x1ZGluZyBsZWFmIGJlZXRsZQ0KICAjdWRzX2VhY2g8LXVkc19kYXRhMlssYygtMSwtMiwtMywtNCwtNzcsLTc4LC03OSldDQogICNPUiBpbmNsY2RpbmcgbGVhZiBiZWV0bGUNCiAgdWRzX2VhY2g8LXVkc19kYXRhMlssYygtMSwtMiwtMywtNzcsLTc4LC03OSwtODApXQ0KICANCiAgDQogICNIaWxsIG51bWJlciBxID0gMCwgMSwgMg0KICB1ZHNfaGlsbDwtcmVueWkodWRzX2VhY2gsIHNjYWxlcz1jKDAsMSwyKSwgaGlsbD1UUlVFKQ0KICB1ZHNfaGlsbDI8LWNiaW5kKHVkc19oaWxsLCB1ZHNfZGF0YTJbLGMoNzcsNzgsNzksODApXSkNCiAgY29sbmFtZXModWRzX2hpbGwyKSA8LWMoIkgwIiwgIkgxIiwgIkgyIiwgImRheSIsICJ0cmVhdG1lbnQiLCAidGltZSIsICJjaGFtYmVyIikNCiAgDQogICNjb252ZXJ0IE5BIHRvIDANCiAgdWRzX2hpbGwyJEgwW2lzLm5hKHVkc19oaWxsMiRIMCldIDwtIDAgDQogIA0KICANCiAgdWRzX2hpbGwzIDwtIHN1YnNldCh1ZHNfaGlsbDIsY2hhbWJlcj09IkMyIikNCiAgdWRzX2hpbGwzJHRyZWF0bWVudFt1ZHNfaGlsbDMkdHJlYXRtZW50PT0iVCJdIDwtICJFIg0KICB1ZHNfaGlsbDMkdHJlYXRtZW50W3Vkc19oaWxsMyR0cmVhdG1lbnQ9PSJXIl0gPC0gIkQiDQogICNWaWV3KHVkc19oaWxsMikNCiAgaWYocSA9PSAwKSB7DQogICAgIGdfYm94PC1nZ3Bsb3QodWRzX2hpbGwyLCBhZXMoeT1IMCwgeD1jaGFtYmVyKSkNCiAgICAgZ19ib3g8LWdfYm94ICsgZ2VvbV92aW9saW4oKQ0KICAgICBnX2JveDwtZ19ib3ggKyBnZW9tX2JveHBsb3Qod2lkdGg9MC4xKSANCiAgICAgZ19ib3g8LWdfYm94ICsgY29vcmRfZml4ZWQocmF0aW8gPSAxLzIpDQogICAgIHByaW50KGdfYm94KQ0KICAgICBnX2JveDI8LWdncGxvdCh1ZHNfaGlsbDMsIGFlcyh5PUgwLCB4PXRyZWF0bWVudCkpDQogICAgIGdfYm94MjwtZ19ib3gyICsgZ2VvbV92aW9saW4oKQ0KICAgICBnX2JveDI8LWdfYm94MiArIGdlb21fYm94cGxvdCh3aWR0aD0wLjEpIA0KICAgICBnX2JveDI8LWdfYm94MiArIGNvb3JkX2ZpeGVkKHJhdGlvID0gMS8yKQ0KICAgICBwcmludChnX2JveDIpDQogICAgIA0KICAgICBwbG90bWVhbnModWRzX2hpbGwyJEgwfnVkc19oaWxsMiRjaGFtYmVyKSANCiAgICAgDQogICAgIFZpZXcodWRzX2hpbGwyKQ0KICAgIA0KICAgICNob21vZ2VuZWl0eSBvZiB2YXJpYW5jZQ0KICAgIHByaW50KGJhcnRsZXR0LnRlc3QodWRzX2hpbGwyJEgwfnVkc19oaWxsMiRjaGFtYmVyKSkNCiAgICBwcmludChiYXJ0bGV0dC50ZXN0KHVkc19oaWxsMyRIMH51ZHNfaGlsbDMkdHJlYXRtZW50KSkNCiAgICAjT25lLXdheSBBTk9WQSB3aXRoIHVuZXF1YWwtdmFyaWFuY2UgYmV0d2VlbiBjaGFtYmVycw0KICAgIHByaW50KG9uZXdheS50ZXN0KHVkc19oaWxsMiRIMH51ZHNfaGlsbDIkY2hhbWJlcix2YXIuZXF1YWw9RkFMU0UpKQ0KICAgIHByaW50KG9uZXdheS50ZXN0KHVkc19oaWxsMyRIMH51ZHNfaGlsbDMkdHJlYXRtZW50LHZhci5lcXVhbD1GQUxTRSkpDQogICAgI1BhaXJ3aXNlIGNvbXBhcmlzb24gd2l0aCBXZWxjaCdzIHQgdGVzdA0KICAgICNwcmludChwYWlyd2lzZS50LnRlc3QodWRzX2hpbGwyJEgwLCB1ZHNfaGlsbDIkdHJlYXRtZW50LCBwLmFkaj0iaG9sbSIpKQ0KICB9DQogIGlmKHEgPT0gMSkgew0KICAgIGdfYm94PC1nZ3Bsb3QodWRzX2hpbGwyLCBhZXMoeT1IMSwgeD1jaGFtYmVyKSkNCiAgICAgZ19ib3g8LWdfYm94ICsgZ2VvbV92aW9saW4oKQ0KICAgICBnX2JveDwtZ19ib3ggKyBnZW9tX2JveHBsb3Qod2lkdGg9MC4xKSANCiAgICAgZ19ib3g8LWdfYm94ICsgY29vcmRfZml4ZWQocmF0aW8gPSAxLzIpDQogICAgIHByaW50KGdfYm94KQ0KICAgICBnX2JveDI8LWdncGxvdCh1ZHNfaGlsbDMsIGFlcyh5PUgxLCB4PXRyZWF0bWVudCkpDQogICAgIGdfYm94MjwtZ19ib3gyICsgZ2VvbV92aW9saW4oKQ0KICAgICBnX2JveDI8LWdfYm94MiArIGdlb21fYm94cGxvdCh3aWR0aD0wLjEpIA0KICAgICBnX2JveDI8LWdfYm94MiArIGNvb3JkX2ZpeGVkKHJhdGlvID0gMS8yKQ0KICAgICBwcmludChnX2JveDIpDQogICAgIA0KICAgICBwbG90bWVhbnModWRzX2hpbGwyJEgxfnVkc19oaWxsMiRjaGFtYmVyKSANCiAgICAgDQogICAgIFZpZXcodWRzX2hpbGwyKQ0KICAgIA0KICAgICNob21vZ2VuZWl0eSBvZiB2YXJpYW5jZQ0KICAgIHByaW50KGJhcnRsZXR0LnRlc3QodWRzX2hpbGwyJEgxfnVkc19oaWxsMiRjaGFtYmVyKSkNCiAgICBwcmludChiYXJ0bGV0dC50ZXN0KHVkc19oaWxsMyRIMX51ZHNfaGlsbDMkdHJlYXRtZW50KSkNCiAgICAjT25lLXdheSBBTk9WQSB3aXRoIHVuZXF1YWwtdmFyaWFuY2UgYmV0d2VlbiBjaGFtYmVycw0KICAgIHByaW50KG9uZXdheS50ZXN0KHVkc19oaWxsMiRIMX51ZHNfaGlsbDIkY2hhbWJlcix2YXIuZXF1YWw9RkFMU0UpKQ0KICAgIHByaW50KG9uZXdheS50ZXN0KHVkc19oaWxsMyRIMX51ZHNfaGlsbDMkdHJlYXRtZW50LHZhci5lcXVhbD1GQUxTRSkpDQogICAgDQogIH0NCiAgaWYocSA9PSAyKSB7DQogICAgZ19ib3g8LWdncGxvdCh1ZHNfaGlsbDIsIGFlcyh5PUgyLCB4PWNoYW1iZXIpKQ0KICAgICBnX2JveDwtZ19ib3ggKyBnZW9tX3Zpb2xpbigpDQogICAgIGdfYm94PC1nX2JveCArIGdlb21fYm94cGxvdCh3aWR0aD0wLjEpIA0KICAgICBnX2JveDwtZ19ib3ggKyBjb29yZF9maXhlZChyYXRpbyA9IDEvMikNCiAgICAgcHJpbnQoZ19ib3gpDQogICAgIGdfYm94MjwtZ2dwbG90KHVkc19oaWxsMywgYWVzKHk9SDIsIHg9dHJlYXRtZW50KSkNCiAgICAgZ19ib3gyPC1nX2JveDIgKyBnZW9tX3Zpb2xpbigpDQogICAgIGdfYm94MjwtZ19ib3gyICsgZ2VvbV9ib3hwbG90KHdpZHRoPTAuMSkgDQogICAgIGdfYm94MjwtZ19ib3gyICsgY29vcmRfZml4ZWQocmF0aW8gPSAxLzIpDQogICAgIHByaW50KGdfYm94MikNCiAgICAgDQogICAgIHBsb3RtZWFucyh1ZHNfaGlsbDIkSDF+dWRzX2hpbGwyJGNoYW1iZXIpIA0KICAgICANCiAgICAgVmlldyh1ZHNfaGlsbDIpDQogICAgDQogICAgI2hvbW9nZW5laXR5IG9mIHZhcmlhbmNlDQogICAgcHJpbnQoYmFydGxldHQudGVzdCh1ZHNfaGlsbDIkSDJ+dWRzX2hpbGwyJGNoYW1iZXIpKQ0KICAgIHByaW50KGJhcnRsZXR0LnRlc3QodWRzX2hpbGwzJEgyfnVkc19oaWxsMyR0cmVhdG1lbnQpKQ0KICAgICNPbmUtd2F5IEFOT1ZBIHdpdGggdW5lcXVhbC12YXJpYW5jZSBiZXR3ZWVuIGNoYW1iZXJzDQogICAgcHJpbnQob25ld2F5LnRlc3QodWRzX2hpbGwyJEgyfnVkc19oaWxsMiRjaGFtYmVyLHZhci5lcXVhbD1GQUxTRSkpDQogICAgcHJpbnQob25ld2F5LnRlc3QodWRzX2hpbGwzJEgyfnVkc19oaWxsMyR0cmVhdG1lbnQsdmFyLmVxdWFsPUZBTFNFKSkNCiAgICANCiAgfQ0KICANCiAgICANCn0NCg0KYGBgDQojIyMgVGVtcG9yYWwgZHluYW1pY3Mgb2Ygc3BlY2llcyByaWNobmVzcw0KIyMjIyBPYnNlcnZlZCBzcGVjaWVzIHJpY2huZXNzIHBlciBwbGFudCBpbmRpdmlkdWFscyAoRmlnLlMyKQ0KYGBge3J9DQojYWxsIHNhbXBsaW5ncyBhcmUgdHJlYXRlZCBhcyBpbmRlcGVuZGVudCwgdXNlZCBpbiB0aGUgbWFudXNjcmlwdCANCiMjIyNGb3IgRmlndXJlIFMyDQphbHBoYV9oaWxsX251bWJlcih1ZHNfZGF0YV9hbGxfZGF5MiwgZGF0ZT0iMTBkIiwgcT0wKQ0KYWxwaGFfaGlsbF9udW1iZXIodWRzX2RhdGFfYWxsX2RheTIsIGRhdGU9IjMyZCIsIHE9MCkNCmFscGhhX2hpbGxfbnVtYmVyKHVkc19kYXRhX2FsbF9kYXkyLCBkYXRlPSI2MGQiLCBxPTApDQoNCmBgYA0KIyMjIyBTdW1tYXJ5IG9mIG9ic2VydmVyZCByaWNobmVzcw0KLSBUaGVyZSB3ZXJlIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGJldC5jaGFtYmVycyAoQzEgPCBDMikgYXQgZGF5IDMyIGFuZCBkYXkgNjAgYnV0IHRoZSBkaWZmZXJlbmNlIGlzIG1pbm9yIA0KLSBUaGVyZSB3ZXJlIG5vIGRpZmZlcmVuY2VzIGJldC4gRCBhbmQgRSBhdCBhbnkgZGF5cw0KDQojIyMgU3BlY2llcyByaWNobmVzcyBlc3RpbWF0ZXMgYW5hbHl6ZWQgYnkgaU5FWFQgKEZpZy4zKQ0KIyMjIyBMb2FkaW5nIGRhdGEgZm9yIGlORVhUIGFuYWx5c2VzDQpgYGB7cn0NCmluY2lkZW5jZV93aG9sZSA8LSByZWFkLmNzdigibW9udGhseS1mb3ItUl9pTkVYVC5jc3YiLCBoZWFkZXI9VCkgICNmb3IgaW5jaWRlbmNlIGRhdGEgY2FsY3VsYXRlZCBieSBFeGNlbA0KYGBgDQojIyMjIEVzdGltYXRpbmcgdGhlIGNvdmVyYWdlLWJhc2VkIHN0YW5kYXJkaXplZCByaWNobmVzcyAoRmlnLjNhKSAmIGFzeW1wdG90aWMgcmljaG5lc3MgKEZpZy4zYikNCkZvciBzdGFuZGFyZGl6ZWQgcmljaG5lc3MgKFJlc3VsdHMgZm9yIEZpZy4zYSlcDQpgYGB7cn0NCiMjIyNUaGlzIGlzIGNvZGUgZm9yIGdyYXBoaWNzIGluIHRoZSBtYW51c2NyaXB0IChGaWcuMykNCnN0YXRfdGVzdDwtRGF0YUluZm8oaW5jaWRlbmNlX3dob2xlLCBkYXRhdHlwZSA9ICJpbmNpZGVuY2UiKSAgIyNUaGlzIGlzIG5lY2Vzc2FyeSB0byBmaW5kIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSBjb3ZlcmFnZQ0KZXN0aW1hdGVEKGluY2lkZW5jZV93aG9sZSwgZGF0YXR5cGU9ImluY2lkZW5jZV9mcmVxIiwgYmFzZT0iY292ZXJhZ2UiLCBsZXZlbD1taW4oc3RhdF90ZXN0JFNDKSkNCmBgYA0KRm9yIGFzeW1wdG90aWMgcmljaG5lc3MgKFJlc3VsdHMgZm9yIEZpZy4zYilcDQpgYGB7cn0NCiNXaGVuIFNob3J0LXRlcm0gcmVwZWF0ZWQgbWVhc3VyZW1lbnQgaXMgYXNzdW1lZCB0byBiZSBpbmRlcGVuZGVudA0KQ2hhb1JpY2huZXNzKGluY2lkZW5jZV93aG9sZSwgZGF0YXR5cGU9ImluY2lkZW5jZSIpICAjSXQgaXMgT0sgdG8gdXNlIGRhdGFmcmFtZSwgdGhpcyBpcyBmcm9tIGlORVhUDQpgYGANCg0KIyMjIyBMb2FkaW5nIGRhdGEgZm9yIGdyYXBoaWNzDQpUaGUgYWJvdmUgaU5FWFQgcmVzdWx0cyB3ZXJlIG1hbnVhbGx5IHN1bW1hcml6ZWQgaW4gZXhjZWwgYW5kIGNzdi5cDQpgYGB7cn0NCmRpdmVyc2l0eV9zdW1tYXJ5IDwtIHJlYWQuY3N2KCJpTkVYVF9zdW1tYXJ5LmNzdiIsaGVhZGVyPVQpDQpjbGFzcyhkaXZlcnNpdHlfc3VtbWFyeSkNClZpZXcoZGl2ZXJzaXR5X3N1bW1hcnkpDQpkaXZlcnNpdHlfc3VtbWFyeTI8LWRpdmVyc2l0eV9zdW1tYXJ5WzE6MjAsXQ0KY2xhc3MoZGl2ZXJzaXR5X3N1bW1hcnkyJGRheSkNCmBgYA0KDQojIyMjIEZpZ3VyZSAzYQ0KYGBge3J9DQojY29sb3VycyA8LSBjKCIjRjg3NjZEIiwgIiNFRTU1QjciLCAiIzAwQkEzOCIsICIjNjE5Q0ZGIiwgIiNFNzZCRjMiKQ0KZ19kaXZfYSA8LSBnZ3Bsb3QoZGF0YT1kaXZlcnNpdHlfc3VtbWFyeTIsIGFlcyh4PUlELHk9U1IpKQ0KZ19kaXZfYSA8LSBnX2Rpdl9hICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1heCA9IEhjb25mLCB5bWluID0gTGNvbmYsIGNvbG91cj10cmVhdG1lbnQpLCB3aWR0aCA9IDAuMCxzaXplPTUsIGFscGhhPTAuNSkgIysgc2NhbGVfY29sb3VyX21hbnVhbCgiR3JvdXAiLCB2YWx1ZXMgPSBjb2xvdXJzKQ0KZ19kaXZfYSA8LSBnX2Rpdl9hICsgZ2VvbV9wb2ludChhZXMoY29sb3VyPXRyZWF0bWVudCksIHNpemU9MykgIysgc2NhbGVfY29sb3VyX21hbnVhbCgiR3JvdXAiLCB2YWx1ZXMgPSBjb2xvdXJzKQ0KZ19kaXZfYSA8LSBnX2Rpdl9hICsgIGdlb21fcG9pbnQoYWVzKHk9T2JzZXJ2ZWQpLCBzaXplPTMpICsgY29vcmRfZml4ZWQocmF0aW8gPSAxLzUpICMrIHNjYWxlX2NvbG91cl9tYW51YWwoIkdyb3VwIiwgdmFsdWVzID0gY29sb3VycykgDQpwcmludChnX2Rpdl9hKQ0KYGBgDQoNCiMjIyMgRmlndXJlIDNiDQpgYGB7cn0NCiNQbG90IEFzeW1wdG90aWMgcmljaG5lc3MgKENoYW8gaW5kZXgpKEZpZzNiKQ0KZGl2ZXJzaXR5X3N1bW1hcnkzPC1kaXZlcnNpdHlfc3VtbWFyeVsxNjoyMCxdDQpkaXZlcnNpdHlfc3VtbWFyeTMkSUQgPC0gYygiMVUiLCAiMkVEIiwgIjNFIiwgIjREIiwgIjVVRUQiKQ0KI2NvbG91cnMgPC0gYygiI0Y4NzY2RCIsICIjMDBCQTM4IiwgIiM2MTlDRkYiLCAiI0U3NkJGMyIsICIjMDBCNkVCIiwgIiNBNThBRkYiLCAiI0ZCNjFENyIpDQpnX2Rpdl9iIDwtIGdncGxvdChkYXRhPWRpdmVyc2l0eV9zdW1tYXJ5MywgYWVzKHg9SUQseT1Bc3lFU1QpKQ0KZ19kaXZfYiA8LSBnX2Rpdl9iICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1heCA9IEhjb25mX2FzeSwgeW1pbiA9IExjb25mX2FzeSwgY29sb3VyPXRyZWF0bWVudCksIHdpZHRoID0gMC4wLHNpemU9NSwgYWxwaGE9MS4wKSAjKyBzY2FsZV9jb2xvdXJfbWFudWFsKCJHcm91cCIsIHZhbHVlcyA9IGNvbG91cnMpDQpnX2Rpdl9iIDwtIGdfZGl2X2IgKyBnZW9tX3BvaW50KHNpemU9NSkgDQpwcmludChnX2Rpdl9iKQ0KYGBgDQoNCiMjIyMgU3VtbWFyeSBmb3IgcmljaG5lc3MgYW5hbHlzaXMNCi0gT2JzZXJ2ZWQgcmljaG5lc3MgKEZpZy4zYSkNCiAgLSB0aGUgd2hvbGUgcmljaG5lc3MgYXQgZWFjaCBkYXkgd2FzIGdyZWF0ZXIgdGhhbiBhbnkgb2Ygc2luZ2xlIHRyZWF0bWVudCBvciBzaW5nbGUgY2hhbWJlcg0KICAtIHRoZSByaWNobmVzcyBpbiB0aGUgd2hvbGUgcGVyaW9kIHdhcyBncmVhdGVyIHRoYW4gYW55IG9mIHNpbmdsZSBkYXRlIGZvciBldmVyeSB0cmVhdG1lbnQgYW5kIGNoYW1iZXINCi0gU3RhbmRhcmRpemVkIHJpY2huZXNzIChGaWcuM2EpDQoNCi0gQXN5bXB0b3RpYyByaWNobmVzcyAoRmlnLjNiKQ0KICAtIENoYW1iZXIgMiAoRSZEKSBoYWQgYSBncmVhdGVyIHJpY2huZXNzIHRoYW4gQ2hhbWJlciAxIChVKQ0KICAtIENoYW1iZXIgMiBoYWQgYSBncmVhdGVyIHJpY2huZXNzIHRoYW4gRA0KICAtIFRoZSB3aG9sZSByaWNobmVzcyAoVUVEKSB3YXMgZ3JlYXRlciB0aGFuIENoYW1iZXIgMSBhbmQgRA0KICANCiMjIyMgU3BlY2llcyByaWNobmVzcyBwYXJ0aXRpb25pbmcgKFRhYmxlIFMyLCBGaWcuIFMzLCBhbmQgRmlnLjNDKQ0KYGBge3J9DQpwYXJ0aXRpb25pbmdfc3VtbWFyeSA8LSByZWFkLmNzdigicmljaG5lc3NfcGFydGl0aW9uaW5nLmNzdiIsaGVhZGVyPVQpDQoNCmcgPC0gZ2dwbG90KHBhcnRpdGlvbmluZ19zdW1tYXJ5LCBhZXMoeCA9IHBhcnRpdGlvbiwgeSA9IHJpY2huZXNzLCBmaWxsID0gZnJhY3Rpb24pKQ0KZyA8LSBnICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpDQpnIDwtIGcgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gcmljaG5lc3MpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSkNCnBsb3QoZykNCg0KYGBgDQoNCg0K