Packages

library(ggplot2) 
library(cowplot) 
library(dplyr) 
library(r2symbols)
library(gridExtra)

Calibration curves

DATA

curvas=read.csv("D:\\Armazenamento\\DATA R\\EDXRF\\curva.csv")
curvas
curvas$matriz=as.factor(curvas$matriz)
curvas$marker=as.factor(curvas$marker)
View(curvas)
str(curvas)
'data.frame':   24 obs. of  5 variables:
 $ matriz   : Factor w/ 2 levels "Feces","Hay": 2 2 2 2 2 2 2 2 2 2 ...
 $ marker   : Factor w/ 2 levels "Cr","Ti": 1 1 1 1 1 1 2 2 2 2 ...
 $ add      : num  0 5378 9810 19152 27398 ...
 $ cps.RhKaC: num  0 1.36 2.48 3.9 5.67 ...
 $ cps      : num  0 6.72 11.71 18.94 24.93 ...

1 - Hay Ti - CPS

d1=curvas[c(7:12),]
d1

m1.1=lm(cps~add,data=d1)
summary(m1.1)

Call:
lm(formula = cps ~ add, data = d1)

Residuals:
       7        8        9       10       11       12 
-0.19090 -0.07435  0.19076  0.07520  0.34284 -0.34354 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 1.909e-01  1.874e-01   1.019    0.366    
add         5.586e-04  9.243e-06  60.431 4.49e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2827 on 4 degrees of freedom
Multiple R-squared:  0.9989,    Adjusted R-squared:  0.9986 
F-statistic:  3652 on 1 and 4 DF,  p-value: 4.491e-07
plot1=ggplot(d1,aes(x=add,y=cps))+
  geom_smooth(color='black', method='lm', formula=y ~ x, se=T,size=0.25)+geom_point(size = 1)+
  scale_x_continuous(name=expression(paste("Ti concentration (mg k",g^-1,")")), 
  breaks = seq(0,40000,5000), limits = c(0, 40000))+
  scale_y_continuous(name=expression(paste("Ti K",alpha," intensity (cps  ",mu, "",A^-1,")")),breaks=seq(0,30,2), limits = c(0, 22))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.25),
  axis.title.x = element_text(size = 14, color = "black"),
  axis.title.y = element_text(size = 14, color = "black"),
  axis.text.x = element_text(size = 12,  angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 12, color = "black"))+
  annotate(geom="text", y=8, x=28000, 
  label=expression(paste("y = 0.000559x + 0.19")),size=5,color="black")+
  annotate(geom="text", y=6.5, x=28000,label=expression(paste(R^2, " = 0.998")),size=5,color="black")+
  annotate(geom="text", y=22, x=0,label="A",size=7,color="black")+
  coord_fixed(ratio = 40000/22)
plot1

2- Hay Cr - CPS

d2=curvas[c(1:6),]
d2

m2.1=lm(cps~add,data=d2)
summary(m2.1)

Call:
lm(formula = cps ~ add, data = d2)

Residuals:
      1       2       3       4       5       6 
-2.1530  0.2309  1.6389  1.3394  0.6722 -1.7284 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 2.153e+00  1.191e+00   1.808 0.144886    
add         8.067e-04  5.829e-05  13.840 0.000158 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.775 on 4 degrees of freedom
Multiple R-squared:  0.9795,    Adjusted R-squared:  0.9744 
F-statistic: 191.5 on 1 and 4 DF,  p-value: 0.000158
plot2=ggplot(d2,aes(x=add,y=cps))+
  geom_smooth(color='black', method='lm', formula=y ~ x, se=T, size=0.25)+geom_point(size = 1)+
  scale_x_continuous(name=expression(paste("Cr concentration (mg k",g^-1,")")), 
  breaks = seq(0,40000,5000), limits = c(0, 40000))+
  scale_y_continuous(name=expression(paste("Cr K",alpha," intensity (cps  ",mu, "",A^-1,")")),breaks=seq(0,30,2), limits = c(0, 30))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.25),
  axis.title.x = element_text(size = 14, color = "black"),
  axis.title.y = element_text(size = 14, color = "black"),
  axis.text.x = element_text(size = 12,  angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 12, color = "black"))+
  annotate(geom="text", y=10, x=28000,label=expression(paste("y = 0.00081x + 2.2")),size=5,color="black")+
  annotate(geom="text", y=8.2, x=28000,label=expression(paste(R^2, " = 0.979")),size=5,color="black")+
  annotate(geom="text", y=30, x=0,label="B",size=7,color="black")+
  coord_fixed(ratio = 40000/30)
plot2

Save

a=grid.arrange(plot1,plot2,ncol = 2)

ggsave("Plot hay curves.png", a, width = 10, height = 5, units = "in", dpi = 300)

4 - Hay Ti - CPS Rh Kα Compton

d4=curvas[c(7:12),]
d4

m4=lm(cps.RhKaC~add,data=d4)
summary(m4)

Call:
lm(formula = cps.RhKaC ~ add, data = d4)

Residuals:
        7         8         9        10        11        12 
 0.056223 -0.003403  0.019567 -0.185506  0.083748  0.029372 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -5.622e-02  7.096e-02  -0.792    0.473    
add          1.306e-04  3.501e-06  37.304 3.08e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1071 on 4 degrees of freedom
Multiple R-squared:  0.9971,    Adjusted R-squared:  0.9964 
F-statistic:  1392 on 1 and 4 DF,  p-value: 3.084e-06
plot4=ggplot(d4,aes(x=add,y=cps.RhKaC))+
  geom_smooth(color='black', method='lm', formula=y ~ x, se=T,size=0.25)+geom_point(size = 1)+
  scale_x_continuous(name=expression(paste("Ti concentration (mg k",g^-1,")")), 
  breaks = seq(0,40000,5000), limits = c(0, 40000))+
  scale_y_continuous(name=expression(paste("Ti K",alpha,"  Rh K",alpha," ",Compton^-1,"")),breaks=seq(0,6,1), limits = c(0, 6))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.25),
  axis.title.x = element_text(size = 14, color = "black"),
  axis.title.y = element_text(size = 14, color = "black"),
  axis.text.x = element_text(size = 12,  angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 12, color = "black"))+
  annotate(geom="text", y=1.8, x=30000, 
  label=expression(paste("y = 0.000131x - 0.06")),size=5,color="black")+
  annotate(geom="text", y=1.3, x=30000,label=expression(paste(R^2, " = 0.997")),size=5,color="black")+
  annotate(geom="text", y=6, x=0,label="A",size=7,color="black")+
  coord_fixed(ratio = 40000/6)
plot4

5- Hay Cr - CPS Rh Kα Compton

d5=curvas[c(1:6),]
d5

m5=lm(cps.RhKaC~add,data=d5)
summary(m5)

Call:
lm(formula = cps.RhKaC ~ add, data = d5)

Residuals:
       1        2        3        4        5        6 
-0.29830  0.04736  0.32023 -0.03343  0.18258 -0.21843 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 2.983e-01  1.762e-01   1.693    0.166    
add         1.895e-04  8.623e-06  21.980 2.54e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2626 on 4 degrees of freedom
Multiple R-squared:  0.9918,    Adjusted R-squared:  0.9897 
F-statistic: 483.1 on 1 and 4 DF,  p-value: 2.535e-05
plot5=ggplot(d5,aes(x=add,y=cps.RhKaC))+
  geom_smooth(color='black', method='lm', formula=y ~ x, se=T, size=0.25)+geom_point(size = 1)+
  scale_x_continuous(name=expression(paste("Cr concentration (mg k",g^-1,")")), 
  breaks = seq(0,40000,5000), limits = c(0, 40000))+
  scale_y_continuous(name=expression(paste("Cr K",alpha,"  Rh K",alpha," ",Compton^-1,"")),breaks=seq(0,6,1), limits = c(0, 6))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.25),
  axis.title.x = element_text(size = 14, color = "black"),
  axis.title.y = element_text(size = 14, color = "black"),
  axis.text.x = element_text(size = 12,  angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 12, color = "black"))+
  annotate(geom="text", y=1.8, x=28000,label=expression(paste("y = 0.000190x + 0.30")),size=5,color="black")+
  annotate(geom="text", y=1.3, x=28000,label=expression(paste(R^2, " = 0.992")),size=5,color="black")+
  annotate(geom="text", y=6, x=0,label="B",size=7,color="black")+
  coord_fixed(ratio = 40000/6)
plot5

Save

a=grid.arrange(plot4,plot5,ncol = 2)

ggsave("Plot Hay compton.png", a, width = 10, height = 5, units = "in", dpi = 300)

6- Feces Cr - CPS

d6=curvas[c(13:18),]
d6

m6=lm(cps~add,data=d6)
summary(m6)

Call:
lm(formula = cps ~ add, data = d6)

Residuals:
      13       14       15       16       17       18 
-0.26960 -0.17113 -0.08381  0.22806  0.67945 -0.38298 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 2.696e-01  2.377e-01   1.134     0.32    
add         7.090e-04  2.701e-05  26.252 1.25e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4386 on 4 degrees of freedom
Multiple R-squared:  0.9942,    Adjusted R-squared:  0.9928 
F-statistic: 689.2 on 1 and 4 DF,  p-value: 1.251e-05
plot6=ggplot(d6,aes(x=add,y=cps))+
  geom_smooth(color='black', method='lm', formula=y ~ x, se=T, size=0.25)+geom_point(size = 1)+
  scale_x_continuous(name=expression(paste("Cr concentration (mg k",g^-1,")")), 
  breaks = seq(0,20000,2500), limits = c(0, 20000))+
  scale_y_continuous(name=expression(paste("Cr K",alpha," intensity (cps  ",mu, "",A^-1,")")),breaks=seq(0,14,2),  limits = c(0, 14))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.25),
  axis.title.x = element_text(size = 14, color = "black"),
  axis.title.y = element_text(size = 14, color = "black"),
  axis.text.x = element_text(size = 12,  angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 12, color = "black"))+
  annotate(geom="text", y=5.1, x=14000,label=expression(paste("y = 0.00071x + 0.3")),size=5,color="black")+
  annotate(geom="text", y=4.1, x=14000,label=expression(paste(R^2, " = 0.994")),size=5,color="black")+
  annotate(geom="text", y=14, x=0,label="B",size=7,color="black")+
  coord_fixed(ratio = 20000/14)
plot6

7- Feces Ti - CPS

d7=curvas[c(19:24),]
d7

m7=lm(cps~add,data=d7)
summary(m7)

Call:
lm(formula = cps ~ add, data = d7)

Residuals:
       19        20        21        22        23        24 
-0.014895 -0.001455 -0.002277  0.022987  0.003205 -0.007564 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 1.567e-01  7.832e-03   20.01 3.68e-05 ***
add         3.983e-04  8.779e-07  453.72 1.42e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01436 on 4 degrees of freedom
Multiple R-squared:      1, Adjusted R-squared:      1 
F-statistic: 2.059e+05 on 1 and 4 DF,  p-value: 1.416e-10
plot7=ggplot(d7,aes(x=add,y=cps))+
  geom_smooth(color='black', method='lm', formula=y ~ x, se=T,size=0.25)+geom_point(size = 1)+
  scale_x_continuous(name=expression(paste("Ti concentration (mg k",g^-1,")")), 
  breaks = seq(0,20000,2500), limits = c(0, 20000))+
  scale_y_continuous(name=expression(paste("Ti K",alpha," intensity (cps  ",mu, "",A^-1,")")),breaks=seq(0,8,1), limits = c(0, 8))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.25),
  axis.title.x = element_text(size = 14, color = "black"),
  axis.title.y = element_text(size = 14, color = "black"),
  axis.text.x = element_text(size = 12,  angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 12, color = "black"))+
  annotate(geom="text", y=2.8, x=14000, 
  label=expression(paste("y = 0.0003983x + 0.157")),size=5,color="black")+
  annotate(geom="text", y=2.3, x=14000,label=expression(paste(R^2, " = 0.999")),size=5,color="black")+
  annotate(geom="text", y=8, x=0,label="A",size=7,color="black")+
  coord_fixed(ratio = 20000/8)
plot7

Save

a=grid.arrange(plot7,plot6,ncol = 2)

ggsave("Plot feces curves.png", a, width = 10, height = 5, units = "in", dpi = 300)

3- Hay Cr - CPS polynomial

d3=curvas[c(1:6),]
d3

m3=lm(cps~poly(add, degree = 2,raw=T),data=d3)
summary(m3)

Call:
lm(formula = cps ~ poly(add, degree = 2, raw = T), data = d3)

Residuals:
       1        2        3        4        5        6 
-0.30749  0.18157  0.53694 -0.47459 -0.07232  0.13590 

Coefficients:
                                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)                      3.075e-01  4.036e-01   0.762 0.501542    
poly(add, degree = 2, raw = T)1  1.222e-03  5.864e-05  20.839 0.000242 ***
poly(add, degree = 2, raw = T)2 -1.171e-08  1.595e-09  -7.342 0.005222 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4707 on 3 degrees of freedom
Multiple R-squared:  0.9989,    Adjusted R-squared:  0.9982 
F-statistic:  1389 on 2 and 3 DF,  p-value: 3.542e-05
plot3=ggplot(d3,aes(x=add,y=cps))+
  geom_smooth(color='black', method='lm', formula=y ~ poly(x,2), se=T, size=0.25)+geom_point(size = 1)+
  scale_x_continuous(name=expression(paste("Cr concentration (mg k",g^-1,")")), 
  breaks = seq(0,40000,5000), limits = c(0, 40000))+
  scale_y_continuous(name=expression(paste("Cr K",alpha," intensity (cps  ",mu, "",A^-1,")")),breaks=seq(0,30,2), limits = c(0, 30))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.25),
  axis.title.x = element_text(size = 14, color = "black"),
  axis.title.y = element_text(size = 14, color = "black"),
  axis.text.x = element_text(size = 12,  angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 12, color = "black"))+
  annotate(geom="text", y=8, x=26000,label=expression(paste("y = -0.0000000117",x^2," + 0.00122x + 0.3")),size=4,color="black")+
  annotate(geom="text", y=6, x=26000,label=expression(paste(R^2, " = 0.999")),size=4,color="black")+
  annotate(geom="text", y=30, x=0,label="A",size=7,color="black")+
  coord_fixed(ratio = 40000/30)
plot3

8- Feces Cr - CPS polynomial

d8=curvas[c(13:18),]
d8

m8=lm(cps~poly(add, degree = 2,raw=T),data=d8)
summary(m8)

Call:
lm(formula = cps ~ poly(add, degree = 2, raw = T), data = d8)

Residuals:
       13        14        15        16        17        18 
 0.032042 -0.005871  0.030275 -0.147102  0.107113 -0.016456 

Coefficients:
                                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)                     -3.204e-02  7.017e-02  -0.457  0.67896    
poly(add, degree = 2, raw = T)1  8.984e-04  2.491e-05  36.061 4.69e-05 ***
poly(add, degree = 2, raw = T)2 -1.026e-08  1.300e-09  -7.891  0.00424 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1086 on 3 degrees of freedom
Multiple R-squared:  0.9997,    Adjusted R-squared:  0.9996 
F-statistic:  5654 on 2 and 3 DF,  p-value: 4.32e-06
plot8=ggplot(d8,aes(x=add,y=cps))+
  geom_smooth(color='black', method='lm', formula=y ~ poly(x,2), se=T, size=0.25)+geom_point(size = 1)+
  scale_x_continuous(name=expression(paste("Cr concentration (mg k",g^-1,")")), 
  breaks = seq(0,20000,2500), limits = c(0, 20000))+
  scale_y_continuous(name=expression(paste("Cr K",alpha," intensity (cps  ",mu, "",A^-1,")")),breaks=seq(0,14,2), limits = c(0, 14))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.25),
  axis.title.x = element_text(size = 14, color = "black"),
  axis.title.y = element_text(size = 14, color = "black"),
  axis.text.x = element_text(size = 12,  angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 12, color = "black"))+
  annotate(geom="text", y=3.5, x=12500,label=expression(paste("y = -0.0000000103",x^2," + 0.00090x - 0.03")),size=4,color="black")+
  annotate(geom="text", y=2.5, x=12500,label=expression(paste(R^2, " = 0.999")),size=4,color="black")+
  annotate(geom="text", y=14, x=0,label="B",size=7,color="black")+
  coord_fixed(ratio = 20000/14)
plot8

Save

a=grid.arrange(plot3,plot8,ncol = 2)

ggsave("Plot polynomial.png", a, width = 10, height = 5, units = "in", dpi = 300)

9- Feces Cr - CPS Rh Kα Compton

d9=curvas[c(13:18),]
d9
m9=lm(cps.RhKaC~add,data=d9)
summary(m9)

Call:
lm(formula = cps.RhKaC ~ add, data = d9)

Residuals:
      13       14       15       16       17       18 
-0.05201 -0.02844 -0.01984  0.04912  0.12175 -0.07057 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 5.201e-02  4.380e-02   1.188    0.301    
add         1.630e-04  4.977e-06  32.744 5.19e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.08082 on 4 degrees of freedom
Multiple R-squared:  0.9963,    Adjusted R-squared:  0.9954 
F-statistic:  1072 on 1 and 4 DF,  p-value: 5.187e-06
plot9=ggplot(d9,aes(x=add,y=cps.RhKaC))+
  geom_smooth(color='black', method='lm', formula=y ~ x, se=T, size=0.25)+geom_point(size = 1)+
  scale_x_continuous(name=expression(paste("Cr concentration (mg k",g^-1,")")), 
  breaks = seq(0,20000,2500), limits = c(0, 20000))+
  scale_y_continuous(name=expression(paste("Cr K",alpha,"  Rh K",alpha," ",Compton^-1,"")),breaks=seq(0,3.5,0.5), limits = c(0, 3.5))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.25),
  axis.title.x = element_text(size = 14, color = "black"),
  axis.title.y = element_text(size = 14, color = "black"),
  axis.text.x = element_text(size = 12,  angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 12, color = "black"))+
  annotate(geom="text", y=1, x=15000,label=expression(paste("y = 0.000163x + 0.05")),size=5,color="black")+
  annotate(geom="text", y=0.75, x=15000,label=expression(paste(R^2, " = 0.996")),size=5,color="black")+
  annotate(geom="text", y=3.5, x=0,label="B",size=7,color="black")+
  coord_fixed(ratio = 20000/3.5)
plot9

10- Feces Ti - CPS Rh Kα Compton

d10=curvas[c(19:24),]
d10

m10=lm(cps.RhKaC~add,data=d10)
summary(m10)

Call:
lm(formula = cps.RhKaC ~ add, data = d10)

Residuals:
       19        20        21        22        23        24 
 0.001999  0.006018 -0.001838  0.003406 -0.017180  0.007595 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 3.030e-02  5.507e-03   5.502  0.00532 ** 
add         9.159e-05  6.174e-07 148.355 1.24e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.0101 on 4 degrees of freedom
Multiple R-squared:  0.9998,    Adjusted R-squared:  0.9998 
F-statistic: 2.201e+04 on 1 and 4 DF,  p-value: 1.238e-08
plot10=ggplot(d10,aes(x=add,y=cps.RhKaC))+
  geom_smooth(color='black', method='lm', formula=y ~ x, se=T,size=0.25)+geom_point(size = 1)+
  scale_x_continuous(name=expression(paste("Ti concentration (mg k",g^-1,")")), 
  breaks = seq(0,20000,2500), limits = c(0, 20000))+
  scale_y_continuous(name=expression(paste("Ti K",alpha,"  Rh K",alpha," ",Compton^-1,"")),breaks=seq(0,2,0.25), limits = c(0, 2))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.25),
  axis.title.x = element_text(size = 14, color = "black"),
  axis.title.y = element_text(size = 14, color = "black"),
  axis.text.x = element_text(size = 12,  angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 12, color = "black"))+
  annotate(geom="text", y=.6, x=14000, 
  label=expression(paste("y = 0.0000916x + 0.030")),size=5,color="black")+
  annotate(geom="text", y=0.45, x=14000,label=expression(paste(R^2, " = 0.999")),size=5,color="black")+
  annotate(geom="text", y=2, x=0,label="A",size=7,color="black")+
  coord_fixed(ratio = 20000/2)
plot10

Save

a=grid.arrange(plot10,plot9,ncol = 2)

ggsave("Plot feces compton.png", a, width = 10, height = 5, units = "in", dpi = 300)

Validation

DATA

EDXRF=read.csv("D:\\Armazenamento\\DATA R\\EDXRF\\edxrf.csv")
str(EDXRF)
'data.frame':   40 obs. of  6 variables:
 $ marker   : chr  "Cr" "Cr" "Cr" "Cr" ...
 $ spike    : num  0.5 1 1.5 2 0.5 1 1.5 2 0.5 1 ...
 $ sample   : chr  "FecesSheep" "FecesSheep" "FecesSheep" "FecesSheep" ...
 $ observed : num  4846 9294 13849 18788 5922 ...
 $ cps      : num  3.98 7.53 10.09 13.27 6.5 ...
 $ cps.RhKaC: num  0.925 1.711 2.396 3.102 1.488 ...
EDXRF$marker=as.factor(EDXRF$marker)
EDXRF$spike=as.factor(EDXRF$spike)
EDXRF$sample=as.factor(EDXRF$sample)
EDXRF

Sheep feces regression equations

Cr equation

\(Y = (cps.RhKaC – 0.05) / 0.000163\)

1- Sheep Cr

data1=EDXRF[c(1:4),]
data1$predicted=(data1$cps.RhKaC-0.05)/0.000163
data1

mod1=lm(predicted~observed,data=data1)
summary(mod1)

Call:
lm(formula = predicted ~ observed, data = data1)

Residuals:
     1      2      3      4 
-269.9  307.5  170.7 -208.4 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept) 1.017e+03  4.272e+02   2.381  0.14025   
observed    9.536e-01  3.339e-02  28.559  0.00122 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 346.4 on 2 degrees of freedom
Multiple R-squared:  0.9976,    Adjusted R-squared:  0.9963 
F-statistic: 815.6 on 1 and 2 DF,  p-value: 0.001224
p1=ggplot(data1,aes(y=predicted,x=observed))+
  geom_smooth(color='black', method=lm, se=T, size=0.5)+geom_point(size = 2)+
  scale_y_continuous(name=expression(paste("Predicted Cr (mg k",g^-1,")")), breaks = seq(4000,20000,2000), limits = c(4000, 20000))+
  scale_x_continuous(name=expression(paste("Added Cr (mg k",g^-1,")")), breaks=seq(4000,20000,2000), limits = c(4000, 20000))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.5),
  axis.title.x = element_text(size = 16,color = "black"),
  axis.title.y = element_text(size = 16,color = "black"),
  axis.text.x = element_text(size = 15,angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 15,color = "black"))+
  annotate(geom="text", y=10200, x=15000,label="Sheep feces",size=8,color="black")+
  annotate(geom="text", y=8200, x=15000,label=expression(paste(y, " = 0.95x + 1000")),size=6,color="black")+
  annotate(geom="text", y=7000, x=15000,label=expression(paste(R^2, " = 0.998")),size=6,color="black")+
  annotate(geom="text", y=20000, x=4000,label="B",size=8,color="black")+
  coord_fixed(ratio = 20000/20000)
p1

Ti equation

\(Y = (cps.RhKaC – 0.030 / 0.0000916\)

2- Sheep Ti

data2=EDXRF[c(21:24),]
data2$predicted=(data2$cps.RhKaC - 0.030) / 0.0000916
data2

mod2=lm(predicted~observed,data=data2)
summary(mod2)

Call:
lm(formula = predicted ~ observed, data = data2)

Residuals:
    21     22     23     24 
-21.45  17.75  25.15 -21.46 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 2.367e+02  3.776e+01   6.268   0.0245 *  
observed    1.006e+00  2.929e-03 343.548 8.47e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 30.56 on 2 degrees of freedom
Multiple R-squared:      1, Adjusted R-squared:      1 
F-statistic: 1.18e+05 on 1 and 2 DF,  p-value: 8.473e-06
p2=ggplot(data2,aes(y=predicted,x=observed))+
  geom_smooth(color='black', method=lm, se=T, size=0.5)+geom_point(size = 2)+
  scale_y_continuous(name=expression(paste("Predicted Ti (mg k",g^-1,")")), breaks = seq(4000,20000,2000), limits = c(4000, 20000))+
  scale_x_continuous(name=expression(paste("Added Ti (mg k",g^-1,")")), breaks=seq(4000,20000,2000), limits = c(4000, 20000))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.5),
  axis.title.x = element_text(size = 16,color = "black"),
  axis.title.y = element_text(size = 16,color = "black"),
  axis.text.x = element_text(size = 15,angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 15,color = "black"))+
  annotate(geom="text", y=10200, x=15000,label="Sheep feces",size=8,color="black")+
  annotate(geom="text", y=8200, x=15000,label=expression(paste(y, " = 1.006x + 240")),size=6,color="black")+
  annotate(geom="text", y=7000, x=15000,label=expression(paste(R^2, " = 0.999")),size=6,color="black")+
  annotate(geom="text", y=20000, x=4000,label="A",size=8,color="black")+
  coord_fixed(ratio = 20000/20000)
p2

Cr equation

\(Y = (cps.RhKaC – 0.05) / 0.000163\)

3- Cattle Cr

data3=EDXRF[c(5:8),]
data3$predicted=(data3$cps.RhKaC-0.05)/0.000163
data3

mod3=lm(predicted~observed,data=data3)
summary(mod3)

Call:
lm(formula = predicted ~ observed, data = data3)

Residuals:
     5      6      7      8 
 257.9 -575.8  420.3 -102.4 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept) 412.32328  734.82402   0.561  0.63120   
observed      1.37613    0.05585  24.638  0.00164 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 540.9 on 2 degrees of freedom
Multiple R-squared:  0.9967,    Adjusted R-squared:  0.9951 
F-statistic:   607 on 1 and 2 DF,  p-value: 0.001643
p3=ggplot(data3,aes(y=predicted,x=observed))+
  geom_smooth(color='black', method=lm, se=T, size=0.5)+geom_point(size = 2)+
  scale_y_continuous(name=expression(paste("Predicted Cr (mg k",g^-1,")")), breaks = seq(4000,28000,2000), limits = c(4000, 28000))+
  scale_x_continuous(name=expression(paste("Added Cr (mg k",g^-1,")")), breaks=seq(4000,28000,2000), limits = c(4000, 28000))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.5),
  axis.title.x = element_text(size = 16,color = "black"),
  axis.title.y = element_text(size = 16,color = "black"),
  axis.text.x = element_text(size = 14,angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 14,color = "black"))+
  annotate(geom="text", y=12000, x=20000,label="Cattle feces",size=8.5,color="black")+
  annotate(geom="text", y=9000, x=20000,label=expression(paste(y, " = 1.38x + 400")),size=6,color="black")+
  annotate(geom="text", y=7000, x=20000,label=expression(paste(R^2, " = 0.997")),size=6,color="black")+
  annotate(geom="text", y=28000, x=4000,label="D",size=9,color="black")+
  coord_fixed(ratio = 28000/28000)
p3

Ti equation

\(Y = (cps.RhKaC – 0.030 / 0.0000916\)

4- Cattle Ti

data4=EDXRF[c(25:28),]
data4$predicted=(data4$cps.RhKaC - 0.030) / 0.0000916
data4

mod4=lm(predicted~observed,data=data4)
summary(mod4)

Call:
lm(formula = predicted ~ observed, data = data4)

Residuals:
     25      26      27      28 
 445.87 -705.19   11.49  247.82 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)   
(Intercept) -453.53502  774.83805  -0.585  0.61757   
observed       1.33236    0.06163  21.620  0.00213 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 615.5 on 2 degrees of freedom
Multiple R-squared:  0.9957,    Adjusted R-squared:  0.9936 
F-statistic: 467.4 on 1 and 2 DF,  p-value: 0.002132
p4=ggplot(data4,aes(y=predicted,x=observed))+
  geom_smooth(color='black', method=lm, se=T, size=0.5)+geom_point(size = 2)+
  scale_y_continuous(name=expression(paste("Predicted Ti (mg k",g^-1,")")), breaks = seq(4000,28000,2000), limits = c(4000, 28000))+
  scale_x_continuous(name=expression(paste("Added Ti (mg k",g^-1,")")), breaks=seq(4000,28000,2000), limits = c(4000, 28000))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.5),
  axis.title.x = element_text(size = 16,color = "black"),
  axis.title.y = element_text(size = 16,color = "black"),
  axis.text.x = element_text(size = 14,angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 14,color = "black"))+
  annotate(geom="text", y=12000, x=20000,label="Cattle feces",size=8.5,color="black")+
  annotate(geom="text", y=9000, x=20000,label=expression(paste(y, " = 1.33x - 500")),size=6,color="black")+
  annotate(geom="text", y=7000, x=20000,label=expression(paste(R^2, " = 0.996")),size=6,color="black")+
  annotate(geom="text", y=28000, x=4000,label="C",size=9,color="black")+
  coord_fixed(ratio = 28000/28000)
p4

Cr equation

\(Y = (cps.RhKaC – 0.052) / 0.000163\)

5- Horse Cr

data5=EDXRF[c(9:12),]
data5$predicted=(data5$cps.RhKaC-0.05)/0.000163
data5

mod5=lm(predicted~observed,data=data5)
summary(mod5)

Call:
lm(formula = predicted ~ observed, data = data5)

Residuals:
      9      10      11      12 
  95.42 -247.37  246.06  -94.10 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 728.4739   318.4581   2.288  0.14943    
observed      1.2618     0.0246  51.304  0.00038 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 264.3 on 2 degrees of freedom
Multiple R-squared:  0.9992,    Adjusted R-squared:  0.9989 
F-statistic:  2632 on 1 and 2 DF,  p-value: 0.0003797
p5=ggplot(data5,aes(y=predicted,x=observed))+
  geom_smooth(color='black', method=lm, se=T, size=0.5)+geom_point(size = 2)+
  scale_y_continuous(name=expression(paste("Predicted Cr (mg k",g^-1,")")), breaks = seq(4000,26000,2000), limits = c(4000, 26000))+
  scale_x_continuous(name=expression(paste("Added Cr (mg k",g^-1,")")), breaks=seq(4000,26000,2000), limits = c(4000, 26000))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.5),
  axis.title.x = element_text(size = 17,color = "black"),
  axis.title.y = element_text(size = 17,color = "black"),
  axis.text.x = element_text(size = 15,angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 15,color = "black"))+
  annotate(geom="text", y=12000, x=19000,label="Horse feces",size=9,color="black")+
  annotate(geom="text", y=9000, x=19000,label=expression(paste(y, " = 1.26x + 700")),size=7,color="black")+
  annotate(geom="text", y=7000, x=19000,label=expression(paste(R^2, " = 0.999")),size=7,color="black")+
  annotate(geom="text", y=26000, x=4000,label="F",size=10,color="black")+
  coord_fixed(ratio = 26000/26000)
p5

Ti equation

\(Y = (cps.RhKaC – 0.030 / 0.0000916\)

6- Horse Ti

data6=EDXRF[c(29:32),]
data6$predicted=(data6$cps.RhKaC - 0.030) / 0.0000916
data6

mod6=lm(predicted~observed,data=data6)
summary(mod6)

Call:
lm(formula = predicted ~ observed, data = data6)

Residuals:
     29      30      31      32 
 509.78 -795.55  -24.58  310.35 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)   
(Intercept) -551.28195  869.59414  -0.634  0.59095   
observed       1.28156    0.06483  19.767  0.00255 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 703.5 on 2 degrees of freedom
Multiple R-squared:  0.9949,    Adjusted R-squared:  0.9924 
F-statistic: 390.7 on 1 and 2 DF,  p-value: 0.002549
p6=ggplot(data6,aes(y=predicted,x=observed))+
  geom_smooth(color='black', method=lm, se=T, size=0.5)+geom_point(size = 2)+
  scale_y_continuous(name=expression(paste("Predicted Ti (mg k",g^-1,")")), breaks = seq(4000,26000,2000), limits = c(4000, 26000))+
  scale_x_continuous(name=expression(paste("Added Ti (mg k",g^-1,")")), breaks=seq(4000,26000,2000), limits = c(4000, 26000))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.5),
  axis.title.x = element_text(size = 17,color = "black"),
  axis.title.y = element_text(size = 17,color = "black"),
  axis.text.x = element_text(size = 15,angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 14,color = "black"))+
  annotate(geom="text", y=12000, x=19000,label="Horse feces",size=9,color="black")+
  annotate(geom="text", y=9000, x=19000,label=expression(paste(y, " = 1.28x - 600")),size=7,color="black")+
  annotate(geom="text", y=7000, x=19000,label=expression(paste(R^2, " = 0.995")),size=7,color="black")+
  annotate(geom="text", y=26000, x=4000,label="E",size=10,color="black")+
  coord_fixed(ratio = 26000/26000)
p6

Save

a = grid.arrange(p2, p1, p4, p3, p6, p5, ncol = 2, nrow = 3)

ggsave("Plots_feces_validation.png", a, width = 12, height = 18, units = "in", dpi = 300)

Tifton hay regression equations

7- Concentrate Ti

Ti equation

\(y = (cps.RhKaC + 0.06)/0.000131x\)

data7=EDXRF[c(33:36),]
data7$predicted=(data7$cps.RhKaC + 0.06) / 0.000131

data7

mod7=lm(predicted~observed,data=data7)
summary(mod7)

Call:
lm(formula = predicted ~ observed, data = data7)

Residuals:
     33      34      35      36 
  55.58   44.64 -247.58  147.36 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept) 696.29438  258.73555   2.691  0.11479   
observed      0.88105    0.03215  27.402  0.00133 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 209.9 on 2 degrees of freedom
Multiple R-squared:  0.9973,    Adjusted R-squared:  0.996 
F-statistic: 750.9 on 1 and 2 DF,  p-value: 0.001329
p7=ggplot(data7,aes(y=predicted,x=observed))+
  geom_smooth(color='black', method=lm, se=T, size=0.5)+geom_point(size = 2)+
  scale_y_continuous(name=expression(paste("Predicted Ti (mg k",g^-1,")")), breaks = seq(2000,16000,2000), limits = c(2000, 16000))+
  scale_x_continuous(name=expression(paste("Added Ti (mg k",g^-1,")")), breaks=seq(2000,16000,2000), limits = c(2000, 16000))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.5),
  axis.title.x = element_text(size = 17,color = "black"),
  axis.title.y = element_text(size = 17,color = "black"),
  axis.text.x = element_text(size = 15,angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 15,color = "black"))+
  annotate(geom="text", y=6400, x=11000,label="Concentrate",size=8,color="black")+
  annotate(geom="text", y=5000, x=11000,label=expression(paste(y, " = 0.88x + 700")),size=6,color="black")+
  annotate(geom="text", y=4000, x=11000,label=expression(paste(R^2, " = 0.997")),size=6,color="black")+
  annotate(geom="text", y=16000, x=2000,label="A",size=10,color="black")+
  coord_fixed(ratio = 16000/16000)
p7

8- Concentrate Cr

Cr equation

\(Y = (cps.RhKaC – 0.30) / 0.000190\)

data8=EDXRF[c(13:16),]
data8$predicted=(data8$cps.RhKaC - 0.30) / 0.000190

data8



mod8=lm(predicted~observed,data=data8)
summary(mod8)

Call:
lm(formula = predicted ~ observed, data = data8)

Residuals:
     13      14      15      16 
 -85.84  219.33 -170.79   37.30 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -346.87008  255.69438  -1.357 0.307751    
observed       1.08933    0.02786  39.098 0.000654 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 207.4 on 2 degrees of freedom
Multiple R-squared:  0.9987,    Adjusted R-squared:  0.998 
F-statistic:  1529 on 1 and 2 DF,  p-value: 0.0006535
p8=ggplot(data8,aes(y=predicted,x=observed))+
  geom_smooth(color='black', method=lm, se=T, size=0.5)+geom_point(size = 2)+
  scale_y_continuous(name=expression(paste("Predicted Cr (mg k",g^-1,")")), breaks = seq(2000,16000,2000), limits = c(2000, 16000))+
  scale_x_continuous(name=expression(paste("Added Cr (mg k",g^-1,")")), breaks=seq(2000,16000,2000), limits = c(2000, 16000))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.5),
  axis.title.x = element_text(size = 17,color = "black"),
  axis.title.y = element_text(size = 17,color = "black"),
  axis.text.x = element_text(size = 15,angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 15,color = "black"))+
  annotate(geom="text", y=6400, x=11000,label="Concentrate",size=8,color="black")+
  annotate(geom="text", y=5000, x=11000,label=expression(paste(y, " = 1.09x - 300")),size=6,color="black")+
  annotate(geom="text", y=4000, x=11000,label=expression(paste(R^2, " = 0.999")),size=6,color="black")+
  annotate(geom="text", y=16000, x=2000,label="B",size=10,color="black")+
  coord_fixed(ratio = 16000/16000)
p8

9- Mineral salt Ti

Ti equation

\(y = (cps.RhKaC + 0.06)/0.000131x\)

data9=EDXRF[c(37:40),]
data9$predicted=(data9$cps.RhKaC + 0.06) / 0.000131
data9

mod9=lm(predicted~observed,data=data9)
summary(mod9)

Call:
lm(formula = predicted ~ observed, data = data9)

Residuals:
      37       38       39       40 
-144.722  212.371    8.349  -75.998 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept) 838.02560  234.32862   3.576  0.07007 . 
observed      0.75494    0.02915  25.898  0.00149 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 189.6 on 2 degrees of freedom
Multiple R-squared:  0.997, Adjusted R-squared:  0.9955 
F-statistic: 670.7 on 1 and 2 DF,  p-value: 0.001488
p9=ggplot(data9,aes(y=predicted,x=observed))+
  geom_smooth(color='black', method=lm, se=T, size=0.5)+geom_point(size = 2)+
  scale_y_continuous(name=expression(paste("Predicted Ti (mg k",g^-1,")")), breaks = seq(2000,14000,2000), limits = c(2000, 14000))+
  scale_x_continuous(name=expression(paste("Added Ti (mg k",g^-1,")")), breaks=seq(2000,14000,2000), limits = c(2000, 14000))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.5),
  axis.title.x = element_text(size = 17,color = "black"),
  axis.title.y = element_text(size = 17,color = "black"),
  axis.text.x = element_text(size = 15,angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 15,color = "black"))+
  annotate(geom="text", y=5300, x=10000,label="Mineral salt",size=8,color="black")+
  annotate(geom="text", y=4000, x=10000,label=expression(paste(y, " = 0.75x + 800")),size=6,color="black")+
  annotate(geom="text", y=3000, x=10000,label=expression(paste(R^2, " = 0.991")),size=6,color="black")+
  annotate(geom="text", y=14000, x=2000,label="C",size=10,color="black")+
  coord_fixed(ratio = 14000/14000)
p9

10- Mineral salt Cr

Cr equation

\(Y = (cps.RhKaC – 0.30) / 0.000190\)

data10=EDXRF[c(17:20),]
data10$predicted=(data10$cps.RhKaC - 0.30) / 0.000190
data10

mod10=lm(predicted~observed,data=data10)
summary(mod10)

Call:
lm(formula = predicted ~ observed, data = data10)

Residuals:
    17     18     19     20 
-156.0  178.3  121.2 -143.4 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -382.6079   264.2009  -1.448 0.284555    
observed       0.9827     0.0287  34.236 0.000852 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 213.8 on 2 degrees of freedom
Multiple R-squared:  0.9983,    Adjusted R-squared:  0.9974 
F-statistic:  1172 on 1 and 2 DF,  p-value: 0.0008521
p10=ggplot(data10,aes(y=predicted,x=observed))+
  geom_smooth(color='black', method=lm, se=T, size=0.5)+geom_point(size = 2)+
  scale_y_continuous(name=expression(paste("Predicted Cr (mg k",g^-1,")")), breaks = seq(2000,14000,2000), limits = c(2000, 14000))+
  scale_x_continuous(name=expression(paste("Added Cr (mg k",g^-1,")")), breaks=seq(2000,14000,2000), limits = c(2000, 14000))+
  theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
  panel.background = element_rect(fill = "transparent"),
  axis.ticks = element_line(colour = "black", size = 0.5),
  axis.title.x = element_text(size = 17,color = "black"),
  axis.title.y = element_text(size = 17,color = "black"),
  axis.text.x = element_text(size = 15,angle = 25, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 15,color = "black"))+
  annotate(geom="text", y=5300, x=10000,label="Mineral salt",size=8,color="black")+
  annotate(geom="text", y=4000, x=10000,label=expression(paste(y, " = 0.98x - 400")),size=6,color="black")+
  annotate(geom="text", y=3000, x=10000,label=expression(paste(R^2, " = 0.998")),size=6,color="black")+
  annotate(geom="text", y=14000, x=2000,label="D",size=10,color="black")+
  coord_fixed(ratio = 14000/14000)
p10

Save

a = grid.arrange(p7, p8, p9, p10, ncol = 2, nrow = 2)

ggsave("Plots_hay_validation.png", a, width = 12, height = 12, units = "in", dpi = 300)

Recovery

DATA

EDXRF1 =rbind(data1,data2, data3, data4, data5, data6, data7, data8, data9, data10)

EDXRF1$recovery=(EDXRF1$predicted/EDXRF1$observed)*100
EDXRF1

summary = EDXRF1 %>%
  group_by(sample, marker) %>%
  summarise(
    sd = sd(recovery, na.rm = TRUE),
    recovery = mean(recovery))
`summarise()` has grouped output by 'sample'. You can override using the `.groups` argument.
summary

Feces curves

#Plot
g1=ggplot(summary[c(3:8),], aes(x=sample, y=recovery, fill=marker))+
  geom_col(position = "dodge")+
  geom_errorbar(aes(ymin=recovery-sd, ymax=recovery+sd), width=.2, position=position_dodge(.9))+
  geom_hline(yintercept=100, linetype="dashed", color = "blue")+
  geom_hline(yintercept=110, linetype="dashed", color = "red")+
  geom_hline(yintercept=90, linetype="dashed", color = "red")+
  scale_fill_manual(values = c("grey40","grey80"),name= "Markers")+
  scale_y_continuous(name="Recovery (%)", breaks = seq(0,160,10), limits = c(0, 160))+
  scale_x_discrete(name="", labels=c("FecesCattle" = "Cattle feces","FecesHorse" = "Horse feces",
  "FecesSheep" = "Sheep feces"))
g1

g2=g1+theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
 panel.background = element_rect(fill = "transparent"),
 legend.background = element_rect(fill = "transparent", size=0.5, linetype="solid",colour ="black"),
 legend.position = c(0.50, 0.95),legend.key.size = unit(0.42, 'cm'),
 legend.direction="horizontal",
 axis.ticks = element_line(colour = "black", size = 1),
 legend.text = element_text(size = 23),          
  legend.title = element_text(size = 23),
  axis.title.y = element_text(size = 21, color = "black"),
  axis.text.x = element_text(size = 21, angle = 10, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 19, color = "black"))+
  annotate(geom="text", y=160, x=0.5,label="A",size=11,color="black")
g2

Hay curves

#Plot
g3=ggplot(summary[c(1:2,9:10),], aes(x=sample, y=recovery, fill=marker))+
  geom_col(position = "dodge")+
  geom_errorbar(aes(ymin=recovery-sd, ymax=recovery+sd), width=.2, position=position_dodge(.9))+
   geom_hline(yintercept=100, linetype="dashed", color = "blue")+
  geom_hline(yintercept=110, linetype="dashed", color = "red")+
  geom_hline(yintercept=90, linetype="dashed", color = "red")+
  scale_fill_manual(values = c("grey40","grey80"),name= "Markers")+
  scale_y_continuous(name="Recovery (%)", breaks = seq(0,130,10), limits = c(0, 130))+
  scale_x_discrete(name="", labels=c("Concentrate+Hay" = "Concentrate","Salt+Hay" = "Mineral salt"))
g3

g4=g3+theme(axis.line = element_line(colour = "black", size = 0.5, linetype = "solid"),
 panel.background = element_rect(fill = "transparent"),
 legend.background = element_rect(fill = "transparent", size=0.5, linetype="solid",colour ="black"),
 legend.position = c(0.50, 0.95),legend.key.size = unit(0.42, 'cm'),
 legend.direction="horizontal",
 axis.ticks = element_line(colour = "black", size = 1),
 legend.text = element_text(size = 23),          
  legend.title = element_text(size = 23),
  axis.title.y = element_text(size = 21, color = "black"),
  axis.text.x = element_text(size = 21, angle = 10, hjust = 1, color = "black"),
  axis.text.y = element_text(size = 19, color = "black"))+
  annotate(geom="text", y=130, x=0.5,label="B",size=11,color="black")
g4

Save

a = grid.arrange(g2, g4, ncol = 1, nrow = 2)

ggsave("Plot_recovery.png", a, width = 10, height = 12, units = "in", dpi = 300)
LS0tDQp0aXRsZTogIlVzZSBvZiBlbmVyZ3kgZGlzcGVyc2l2ZSBYLXJheSBmbHVvcmVzY2VuY2UgKEVEWFJGKSBzcGVjdHJvbWV0cnkgdG8gZGV0ZXJtaW5lIGV4dGVybmFsIG1hcmtlcnMgaW4gYW5pbWFsIGludGFrZSBlc3RpbWF0aW9uIHRyaWFscyINCmF1dGhvcjogIlZhZ25lciBPdmFuaSINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IFRydWUNCiAgICB0b2NfZGVwdGg6IDMNCi0tLQ0KDQoqKioNCiMgKipQYWNrYWdlcyoqDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpIA0KbGlicmFyeShjb3dwbG90KSANCmxpYnJhcnkoZHBseXIpIA0KbGlicmFyeShyMnN5bWJvbHMpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmBgYA0KDQojICoqQ2FsaWJyYXRpb24gY3VydmVzKioNCg0KIyMgKipEQVRBKioNCg0KYGBge3J9DQpjdXJ2YXM9cmVhZC5jc3YoIkQ6XFxBcm1hemVuYW1lbnRvXFxEQVRBIFJcXEVEWFJGXFxjdXJ2YS5jc3YiKQ0KY3VydmFzDQpjdXJ2YXMkbWF0cml6PWFzLmZhY3RvcihjdXJ2YXMkbWF0cml6KQ0KY3VydmFzJG1hcmtlcj1hcy5mYWN0b3IoY3VydmFzJG1hcmtlcikNClZpZXcoY3VydmFzKQ0Kc3RyKGN1cnZhcykNCmBgYA0KDQojIyMgXyoqMSAtIEhheSBUaSAtIENQUyoqXw0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KZDE9Y3VydmFzW2MoNzoxMiksXQ0KZDENCg0KbTEuMT1sbShjcHN+YWRkLGRhdGE9ZDEpDQpzdW1tYXJ5KG0xLjEpDQoNCnBsb3QxPWdncGxvdChkMSxhZXMoeD1hZGQseT1jcHMpKSsNCiAgZ2VvbV9zbW9vdGgoY29sb3I9J2JsYWNrJywgbWV0aG9kPSdsbScsIGZvcm11bGE9eSB+IHgsIHNlPVQsc2l6ZT0wLjI1KStnZW9tX3BvaW50KHNpemUgPSAxKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWU9ZXhwcmVzc2lvbihwYXN0ZSgiVGkgY29uY2VudHJhdGlvbiAobWcgayIsZ14tMSwiKSIpKSwgDQogIGJyZWFrcyA9IHNlcSgwLDQwMDAwLDUwMDApLCBsaW1pdHMgPSBjKDAsIDQwMDAwKSkrDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lPWV4cHJlc3Npb24ocGFzdGUoIlRpIEsiLGFscGhhLCIgaW50ZW5zaXR5IChjcHMgICIsbXUsICIiLEFeLTEsIikiKSksYnJlYWtzPXNlcSgwLDMwLDIpLCBsaW1pdHMgPSBjKDAsIDIyKSkrDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpLA0KICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwNCiAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC4yNSksDQogIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgIGFuZ2xlID0gMjUsIGhqdXN0ID0gMSwgY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBjb2xvciA9ICJibGFjayIpKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9OCwgeD0yODAwMCwgDQogIGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoInkgPSAwLjAwMDU1OXggKyAwLjE5IikpLHNpemU9NSxjb2xvcj0iYmxhY2siKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9Ni41LCB4PTI4MDAwLGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoUl4yLCAiID0gMC45OTgiKSksc2l6ZT01LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0yMiwgeD0wLGxhYmVsPSJBIixzaXplPTcsY29sb3I9ImJsYWNrIikrDQogIGNvb3JkX2ZpeGVkKHJhdGlvID0gNDAwMDAvMjIpDQpwbG90MQ0KYGBgDQoNCiMjIyBfKioyLSBIYXkgQ3IgLSBDUFMqKl8NCg0KYGBge3IgbWVzc2FnZT1GQUxTRX0NCmQyPWN1cnZhc1tjKDE6NiksXQ0KZDINCg0KbTIuMT1sbShjcHN+YWRkLGRhdGE9ZDIpDQpzdW1tYXJ5KG0yLjEpDQoNCnBsb3QyPWdncGxvdChkMixhZXMoeD1hZGQseT1jcHMpKSsNCiAgZ2VvbV9zbW9vdGgoY29sb3I9J2JsYWNrJywgbWV0aG9kPSdsbScsIGZvcm11bGE9eSB+IHgsIHNlPVQsIHNpemU9MC4yNSkrZ2VvbV9wb2ludChzaXplID0gMSkrDQogIHNjYWxlX3hfY29udGludW91cyhuYW1lPWV4cHJlc3Npb24ocGFzdGUoIkNyIGNvbmNlbnRyYXRpb24gKG1nIGsiLGdeLTEsIikiKSksIA0KICBicmVha3MgPSBzZXEoMCw0MDAwMCw1MDAwKSwgbGltaXRzID0gYygwLCA0MDAwMCkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT1leHByZXNzaW9uKHBhc3RlKCJDciBLIixhbHBoYSwiIGludGVuc2l0eSAoY3BzICAiLG11LCAiIixBXi0xLCIpIikpLGJyZWFrcz1zZXEoMCwzMCwyKSwgbGltaXRzID0gYygwLCAzMCkpKw0KICB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiKSwNCiAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksDQogIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuMjUpLA0KICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsICBhbmdsZSA9IDI1LCBoanVzdCA9IDEsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiYmxhY2siKSkrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTEwLCB4PTI4MDAwLGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoInkgPSAwLjAwMDgxeCArIDIuMiIpKSxzaXplPTUsY29sb3I9ImJsYWNrIikrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTguMiwgeD0yODAwMCxsYWJlbD1leHByZXNzaW9uKHBhc3RlKFJeMiwgIiA9IDAuOTc5IikpLHNpemU9NSxjb2xvcj0iYmxhY2siKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9MzAsIHg9MCxsYWJlbD0iQiIsc2l6ZT03LGNvbG9yPSJibGFjayIpKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDQwMDAwLzMwKQ0KcGxvdDINCmBgYA0KDQojIyMgXypTYXZlKl8NCg0KYGBge3J9DQphPWdyaWQuYXJyYW5nZShwbG90MSxwbG90MixuY29sID0gMikNCmdnc2F2ZSgiUGxvdCBoYXkgY3VydmVzLnBuZyIsIGEsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUsIHVuaXRzID0gImluIiwgZHBpID0gMzAwKQ0KYGBgDQoNCiMjIyBfKio0IC0gSGF5IFRpIC0gQ1BTIFJoIEvOsSBDb21wdG9uKipfDQoNCmBgYHtyfQ0KZDQ9Y3VydmFzW2MoNzoxMiksXQ0KZDQNCg0KbTQ9bG0oY3BzLlJoS2FDfmFkZCxkYXRhPWQ0KQ0Kc3VtbWFyeShtNCkNCg0KcGxvdDQ9Z2dwbG90KGQ0LGFlcyh4PWFkZCx5PWNwcy5SaEthQykpKw0KICBnZW9tX3Ntb290aChjb2xvcj0nYmxhY2snLCBtZXRob2Q9J2xtJywgZm9ybXVsYT15IH4geCwgc2U9VCxzaXplPTAuMjUpK2dlb21fcG9pbnQoc2l6ZSA9IDEpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT1leHByZXNzaW9uKHBhc3RlKCJUaSBjb25jZW50cmF0aW9uIChtZyBrIixnXi0xLCIpIikpLCANCiAgYnJlYWtzID0gc2VxKDAsNDAwMDAsNTAwMCksIGxpbWl0cyA9IGMoMCwgNDAwMDApKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9ZXhwcmVzc2lvbihwYXN0ZSgiVGkgSyIsYWxwaGEsIiAgUmggSyIsYWxwaGEsIiAiLENvbXB0b25eLTEsIiIpKSxicmVha3M9c2VxKDAsNiwxKSwgbGltaXRzID0gYygwLCA2KSkrDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpLA0KICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwNCiAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC4yNSksDQogIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgIGFuZ2xlID0gMjUsIGhqdXN0ID0gMSwgY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBjb2xvciA9ICJibGFjayIpKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9MS44LCB4PTMwMDAwLCANCiAgbGFiZWw9ZXhwcmVzc2lvbihwYXN0ZSgieSA9IDAuMDAwMTMxeCAtIDAuMDYiKSksc2l6ZT01LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0xLjMsIHg9MzAwMDAsbGFiZWw9ZXhwcmVzc2lvbihwYXN0ZShSXjIsICIgPSAwLjk5NyIpKSxzaXplPTUsY29sb3I9ImJsYWNrIikrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTYsIHg9MCxsYWJlbD0iQSIsc2l6ZT03LGNvbG9yPSJibGFjayIpKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDQwMDAwLzYpDQpwbG90NA0KYGBgDQoNCiMjIyBfKio1LSBIYXkgQ3IgLSBDUFMgUmggS86xIENvbXB0b24gKipfDQoNCmBgYHtyfQ0KZDU9Y3VydmFzW2MoMTo2KSxdDQpkNQ0KDQptNT1sbShjcHMuUmhLYUN+YWRkLGRhdGE9ZDUpDQpzdW1tYXJ5KG01KQ0KDQpwbG90NT1nZ3Bsb3QoZDUsYWVzKHg9YWRkLHk9Y3BzLlJoS2FDKSkrDQogIGdlb21fc21vb3RoKGNvbG9yPSdibGFjaycsIG1ldGhvZD0nbG0nLCBmb3JtdWxhPXkgfiB4LCBzZT1ULCBzaXplPTAuMjUpK2dlb21fcG9pbnQoc2l6ZSA9IDEpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT1leHByZXNzaW9uKHBhc3RlKCJDciBjb25jZW50cmF0aW9uIChtZyBrIixnXi0xLCIpIikpLCANCiAgYnJlYWtzID0gc2VxKDAsNDAwMDAsNTAwMCksIGxpbWl0cyA9IGMoMCwgNDAwMDApKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9ZXhwcmVzc2lvbihwYXN0ZSgiQ3IgSyIsYWxwaGEsIiAgUmggSyIsYWxwaGEsIiAiLENvbXB0b25eLTEsIiIpKSxicmVha3M9c2VxKDAsNiwxKSwgbGltaXRzID0gYygwLCA2KSkrDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpLA0KICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwNCiAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC4yNSksDQogIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgIGFuZ2xlID0gMjUsIGhqdXN0ID0gMSwgY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBjb2xvciA9ICJibGFjayIpKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9MS44LCB4PTI4MDAwLGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoInkgPSAwLjAwMDE5MHggKyAwLjMwIikpLHNpemU9NSxjb2xvcj0iYmxhY2siKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9MS4zLCB4PTI4MDAwLGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoUl4yLCAiID0gMC45OTIiKSksc2l6ZT01LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT02LCB4PTAsbGFiZWw9IkIiLHNpemU9Nyxjb2xvcj0iYmxhY2siKSsNCiAgY29vcmRfZml4ZWQocmF0aW8gPSA0MDAwMC82KQ0KcGxvdDUNCmBgYA0KDQojIyMgXypTYXZlKl8NCg0KYGBge3J9DQphPWdyaWQuYXJyYW5nZShwbG90NCxwbG90NSxuY29sID0gMikNCmdnc2F2ZSgiUGxvdCBIYXkgY29tcHRvbi5wbmciLCBhLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1LCB1bml0cyA9ICJpbiIsIGRwaSA9IDMwMCkNCmBgYA0KDQojIyMgXyoqNi0gRmVjZXMgQ3IgLSBDUFMqKl8NCg0KYGBge3J9DQpkNj1jdXJ2YXNbYygxMzoxOCksXQ0KZDYNCg0KbTY9bG0oY3BzfmFkZCxkYXRhPWQ2KQ0Kc3VtbWFyeShtNikNCg0KcGxvdDY9Z2dwbG90KGQ2LGFlcyh4PWFkZCx5PWNwcykpKw0KICBnZW9tX3Ntb290aChjb2xvcj0nYmxhY2snLCBtZXRob2Q9J2xtJywgZm9ybXVsYT15IH4geCwgc2U9VCwgc2l6ZT0wLjI1KStnZW9tX3BvaW50KHNpemUgPSAxKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWU9ZXhwcmVzc2lvbihwYXN0ZSgiQ3IgY29uY2VudHJhdGlvbiAobWcgayIsZ14tMSwiKSIpKSwgDQogIGJyZWFrcyA9IHNlcSgwLDIwMDAwLDI1MDApLCBsaW1pdHMgPSBjKDAsIDIwMDAwKSkrDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lPWV4cHJlc3Npb24ocGFzdGUoIkNyIEsiLGFscGhhLCIgaW50ZW5zaXR5IChjcHMgICIsbXUsICIiLEFeLTEsIikiKSksYnJlYWtzPXNlcSgwLDE0LDIpLCAgbGltaXRzID0gYygwLCAxNCkpKw0KICB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiKSwNCiAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksDQogIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuMjUpLA0KICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsICBhbmdsZSA9IDI1LCBoanVzdCA9IDEsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiYmxhY2siKSkrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTUuMSwgeD0xNDAwMCxsYWJlbD1leHByZXNzaW9uKHBhc3RlKCJ5ID0gMC4wMDA3MXggKyAwLjMiKSksc2l6ZT01LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT00LjEsIHg9MTQwMDAsbGFiZWw9ZXhwcmVzc2lvbihwYXN0ZShSXjIsICIgPSAwLjk5NCIpKSxzaXplPTUsY29sb3I9ImJsYWNrIikrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTE0LCB4PTAsbGFiZWw9IkIiLHNpemU9Nyxjb2xvcj0iYmxhY2siKSsNCiAgY29vcmRfZml4ZWQocmF0aW8gPSAyMDAwMC8xNCkNCnBsb3Q2DQpgYGANCg0KIyMjIF8qKjctIEZlY2VzIFRpIC0gQ1BTKipfDQoNCmBgYHtyfQ0KZDc9Y3VydmFzW2MoMTk6MjQpLF0NCmQ3DQoNCm03PWxtKGNwc35hZGQsZGF0YT1kNykNCnN1bW1hcnkobTcpDQoNCnBsb3Q3PWdncGxvdChkNyxhZXMoeD1hZGQseT1jcHMpKSsNCiAgZ2VvbV9zbW9vdGgoY29sb3I9J2JsYWNrJywgbWV0aG9kPSdsbScsIGZvcm11bGE9eSB+IHgsIHNlPVQsc2l6ZT0wLjI1KStnZW9tX3BvaW50KHNpemUgPSAxKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWU9ZXhwcmVzc2lvbihwYXN0ZSgiVGkgY29uY2VudHJhdGlvbiAobWcgayIsZ14tMSwiKSIpKSwgDQogIGJyZWFrcyA9IHNlcSgwLDIwMDAwLDI1MDApLCBsaW1pdHMgPSBjKDAsIDIwMDAwKSkrDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lPWV4cHJlc3Npb24ocGFzdGUoIlRpIEsiLGFscGhhLCIgaW50ZW5zaXR5IChjcHMgICIsbXUsICIiLEFeLTEsIikiKSksYnJlYWtzPXNlcSgwLDgsMSksIGxpbWl0cyA9IGMoMCwgOCkpKw0KICB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiKSwNCiAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksDQogIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuMjUpLA0KICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsICBhbmdsZSA9IDI1LCBoanVzdCA9IDEsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiYmxhY2siKSkrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTIuOCwgeD0xNDAwMCwgDQogIGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoInkgPSAwLjAwMDM5ODN4ICsgMC4xNTciKSksc2l6ZT01LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0yLjMsIHg9MTQwMDAsbGFiZWw9ZXhwcmVzc2lvbihwYXN0ZShSXjIsICIgPSAwLjk5OSIpKSxzaXplPTUsY29sb3I9ImJsYWNrIikrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTgsIHg9MCxsYWJlbD0iQSIsc2l6ZT03LGNvbG9yPSJibGFjayIpKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDIwMDAwLzgpDQpwbG90Nw0KYGBgDQoNCiMjIyBfKlNhdmUqXw0KDQpgYGB7cn0NCmE9Z3JpZC5hcnJhbmdlKHBsb3Q3LHBsb3Q2LG5jb2wgPSAyKQ0KZ2dzYXZlKCJQbG90IGZlY2VzIGN1cnZlcy5wbmciLCBhLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1LCB1bml0cyA9ICJpbiIsIGRwaSA9IDMwMCkNCmBgYA0KDQojIyMgXyoqMy0gSGF5IENyIC0gQ1BTIHBvbHlub21pYWwqKl8NCg0KYGBge3J9DQpkMz1jdXJ2YXNbYygxOjYpLF0NCmQzDQoNCm0zPWxtKGNwc35wb2x5KGFkZCwgZGVncmVlID0gMixyYXc9VCksZGF0YT1kMykNCnN1bW1hcnkobTMpDQoNCnBsb3QzPWdncGxvdChkMyxhZXMoeD1hZGQseT1jcHMpKSsNCiAgZ2VvbV9zbW9vdGgoY29sb3I9J2JsYWNrJywgbWV0aG9kPSdsbScsIGZvcm11bGE9eSB+IHBvbHkoeCwyKSwgc2U9VCwgc2l6ZT0wLjI1KStnZW9tX3BvaW50KHNpemUgPSAxKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWU9ZXhwcmVzc2lvbihwYXN0ZSgiQ3IgY29uY2VudHJhdGlvbiAobWcgayIsZ14tMSwiKSIpKSwgDQogIGJyZWFrcyA9IHNlcSgwLDQwMDAwLDUwMDApLCBsaW1pdHMgPSBjKDAsIDQwMDAwKSkrDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lPWV4cHJlc3Npb24ocGFzdGUoIkNyIEsiLGFscGhhLCIgaW50ZW5zaXR5IChjcHMgICIsbXUsICIiLEFeLTEsIikiKSksYnJlYWtzPXNlcSgwLDMwLDIpLCBsaW1pdHMgPSBjKDAsIDMwKSkrDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpLA0KICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwNCiAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC4yNSksDQogIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgIGFuZ2xlID0gMjUsIGhqdXN0ID0gMSwgY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBjb2xvciA9ICJibGFjayIpKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9OCwgeD0yNjAwMCxsYWJlbD1leHByZXNzaW9uKHBhc3RlKCJ5ID0gLTAuMDAwMDAwMDExNyIseF4yLCIgKyAwLjAwMTIyeCArIDAuMyIpKSxzaXplPTQsY29sb3I9ImJsYWNrIikrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTYsIHg9MjYwMDAsbGFiZWw9ZXhwcmVzc2lvbihwYXN0ZShSXjIsICIgPSAwLjk5OSIpKSxzaXplPTQsY29sb3I9ImJsYWNrIikrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTMwLCB4PTAsbGFiZWw9IkEiLHNpemU9Nyxjb2xvcj0iYmxhY2siKSsNCiAgY29vcmRfZml4ZWQocmF0aW8gPSA0MDAwMC8zMCkNCnBsb3QzDQpgYGANCg0KIyMjIF8qKjgtIEZlY2VzIENyIC0gQ1BTIHBvbHlub21pYWwqKl8NCg0KYGBge3J9DQpkOD1jdXJ2YXNbYygxMzoxOCksXQ0KZDgNCg0KbTg9bG0oY3BzfnBvbHkoYWRkLCBkZWdyZWUgPSAyLHJhdz1UKSxkYXRhPWQ4KQ0Kc3VtbWFyeShtOCkNCg0KcGxvdDg9Z2dwbG90KGQ4LGFlcyh4PWFkZCx5PWNwcykpKw0KICBnZW9tX3Ntb290aChjb2xvcj0nYmxhY2snLCBtZXRob2Q9J2xtJywgZm9ybXVsYT15IH4gcG9seSh4LDIpLCBzZT1ULCBzaXplPTAuMjUpK2dlb21fcG9pbnQoc2l6ZSA9IDEpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT1leHByZXNzaW9uKHBhc3RlKCJDciBjb25jZW50cmF0aW9uIChtZyBrIixnXi0xLCIpIikpLCANCiAgYnJlYWtzID0gc2VxKDAsMjAwMDAsMjUwMCksIGxpbWl0cyA9IGMoMCwgMjAwMDApKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9ZXhwcmVzc2lvbihwYXN0ZSgiQ3IgSyIsYWxwaGEsIiBpbnRlbnNpdHkgKGNwcyAgIixtdSwgIiIsQV4tMSwiKSIpKSxicmVha3M9c2VxKDAsMTQsMiksIGxpbWl0cyA9IGMoMCwgMTQpKSsNCiAgdGhlbWUoYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjUsIGxpbmV0eXBlID0gInNvbGlkIiksDQogIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLA0KICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjI1KSwNCiAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCAgYW5nbGUgPSAyNSwgaGp1c3QgPSAxLCBjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGNvbG9yID0gImJsYWNrIikpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0zLjUsIHg9MTI1MDAsbGFiZWw9ZXhwcmVzc2lvbihwYXN0ZSgieSA9IC0wLjAwMDAwMDAxMDMiLHheMiwiICsgMC4wMDA5MHggLSAwLjAzIikpLHNpemU9NCxjb2xvcj0iYmxhY2siKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9Mi41LCB4PTEyNTAwLGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoUl4yLCAiID0gMC45OTkiKSksc2l6ZT00LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0xNCwgeD0wLGxhYmVsPSJCIixzaXplPTcsY29sb3I9ImJsYWNrIikrDQogIGNvb3JkX2ZpeGVkKHJhdGlvID0gMjAwMDAvMTQpDQpwbG90OA0KYGBgDQoNCiMjIyBfKlNhdmUqXw0KDQpgYGB7cn0NCmE9Z3JpZC5hcnJhbmdlKHBsb3QzLHBsb3Q4LG5jb2wgPSAyKQ0KZ2dzYXZlKCJQbG90IHBvbHlub21pYWwucG5nIiwgYSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAiaW4iLCBkcGkgPSAzMDApDQpgYGANCg0KIyMjIF8qKjktIEZlY2VzIENyIC0gQ1BTIFJoIEvOsSBDb21wdG9uICoqXw0KDQpgYGB7cn0NCmQ5PWN1cnZhc1tjKDEzOjE4KSxdDQpkOQ0KbTk9bG0oY3BzLlJoS2FDfmFkZCxkYXRhPWQ5KQ0Kc3VtbWFyeShtOSkNCg0KcGxvdDk9Z2dwbG90KGQ5LGFlcyh4PWFkZCx5PWNwcy5SaEthQykpKw0KICBnZW9tX3Ntb290aChjb2xvcj0nYmxhY2snLCBtZXRob2Q9J2xtJywgZm9ybXVsYT15IH4geCwgc2U9VCwgc2l6ZT0wLjI1KStnZW9tX3BvaW50KHNpemUgPSAxKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWU9ZXhwcmVzc2lvbihwYXN0ZSgiQ3IgY29uY2VudHJhdGlvbiAobWcgayIsZ14tMSwiKSIpKSwgDQogIGJyZWFrcyA9IHNlcSgwLDIwMDAwLDI1MDApLCBsaW1pdHMgPSBjKDAsIDIwMDAwKSkrDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lPWV4cHJlc3Npb24ocGFzdGUoIkNyIEsiLGFscGhhLCIgIFJoIEsiLGFscGhhLCIgIixDb21wdG9uXi0xLCIiKSksYnJlYWtzPXNlcSgwLDMuNSwwLjUpLCBsaW1pdHMgPSBjKDAsIDMuNSkpKw0KICB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiKSwNCiAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksDQogIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuMjUpLA0KICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsICBhbmdsZSA9IDI1LCBoanVzdCA9IDEsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiYmxhY2siKSkrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTEsIHg9MTUwMDAsbGFiZWw9ZXhwcmVzc2lvbihwYXN0ZSgieSA9IDAuMDAwMTYzeCArIDAuMDUiKSksc2l6ZT01LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0wLjc1LCB4PTE1MDAwLGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoUl4yLCAiID0gMC45OTYiKSksc2l6ZT01LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0zLjUsIHg9MCxsYWJlbD0iQiIsc2l6ZT03LGNvbG9yPSJibGFjayIpKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDIwMDAwLzMuNSkNCnBsb3Q5DQpgYGANCg0KIyMjIF8qKjEwLSBGZWNlcyBUaSAtIENQUyBSaCBLzrEgQ29tcHRvbioqXw0KDQpgYGB7cn0NCmQxMD1jdXJ2YXNbYygxOToyNCksXQ0KZDEwDQoNCm0xMD1sbShjcHMuUmhLYUN+YWRkLGRhdGE9ZDEwKQ0Kc3VtbWFyeShtMTApDQoNCg0KcGxvdDEwPWdncGxvdChkMTAsYWVzKHg9YWRkLHk9Y3BzLlJoS2FDKSkrDQogIGdlb21fc21vb3RoKGNvbG9yPSdibGFjaycsIG1ldGhvZD0nbG0nLCBmb3JtdWxhPXkgfiB4LCBzZT1ULHNpemU9MC4yNSkrZ2VvbV9wb2ludChzaXplID0gMSkrDQogIHNjYWxlX3hfY29udGludW91cyhuYW1lPWV4cHJlc3Npb24ocGFzdGUoIlRpIGNvbmNlbnRyYXRpb24gKG1nIGsiLGdeLTEsIikiKSksIA0KICBicmVha3MgPSBzZXEoMCwyMDAwMCwyNTAwKSwgbGltaXRzID0gYygwLCAyMDAwMCkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT1leHByZXNzaW9uKHBhc3RlKCJUaSBLIixhbHBoYSwiICBSaCBLIixhbHBoYSwiICIsQ29tcHRvbl4tMSwiIikpLGJyZWFrcz1zZXEoMCwyLDAuMjUpLCBsaW1pdHMgPSBjKDAsIDIpKSsNCiAgdGhlbWUoYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjUsIGxpbmV0eXBlID0gInNvbGlkIiksDQogIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLA0KICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjI1KSwNCiAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCAgYW5nbGUgPSAyNSwgaGp1c3QgPSAxLCBjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGNvbG9yID0gImJsYWNrIikpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0uNiwgeD0xNDAwMCwgDQogIGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoInkgPSAwLjAwMDA5MTZ4ICsgMC4wMzAiKSksc2l6ZT01LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0wLjQ1LCB4PTE0MDAwLGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoUl4yLCAiID0gMC45OTkiKSksc2l6ZT01LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0yLCB4PTAsbGFiZWw9IkEiLHNpemU9Nyxjb2xvcj0iYmxhY2siKSsNCiAgY29vcmRfZml4ZWQocmF0aW8gPSAyMDAwMC8yKQ0KcGxvdDEwDQpgYGANCg0KIyMjIF8qU2F2ZSpfDQoNCmBgYHtyfQ0KYT1ncmlkLmFycmFuZ2UocGxvdDEwLHBsb3Q5LG5jb2wgPSAyKQ0KZ2dzYXZlKCJQbG90IGZlY2VzIGNvbXB0b24ucG5nIiwgYSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAiaW4iLCBkcGkgPSAzMDApDQpgYGANCg0KIyAqKlZhbGlkYXRpb24qKg0KDQojIyAqKkRBVEEqKg0KDQpgYGB7cn0NCkVEWFJGPXJlYWQuY3N2KCJEOlxcQXJtYXplbmFtZW50b1xcREFUQSBSXFxFRFhSRlxcZWR4cmYuY3N2IikNCnN0cihFRFhSRikNCkVEWFJGJG1hcmtlcj1hcy5mYWN0b3IoRURYUkYkbWFya2VyKQ0KRURYUkYkc3Bpa2U9YXMuZmFjdG9yKEVEWFJGJHNwaWtlKQ0KRURYUkYkc2FtcGxlPWFzLmZhY3RvcihFRFhSRiRzYW1wbGUpDQpFRFhSRg0KYGBgDQoNCiMjIyBfKipTaGVlcCBmZWNlcyByZWdyZXNzaW9uIGVxdWF0aW9ucyoqXw0KDQo+ICoqQ3IgZXF1YXRpb24qKiANCg0KJFkgPSAoY3BzLlJoS2FDIOKAkyAwLjA1KSAvIDAuMDAwMTYzJA0KDQojIyMgXyoqMS0gU2hlZXAgQ3IqKl8NCg0KYGBge3J9DQpkYXRhMT1FRFhSRltjKDE6NCksXQ0KZGF0YTEkcHJlZGljdGVkPShkYXRhMSRjcHMuUmhLYUMtMC4wNSkvMC4wMDAxNjMNCmRhdGExDQoNCm1vZDE9bG0ocHJlZGljdGVkfm9ic2VydmVkLGRhdGE9ZGF0YTEpDQpzdW1tYXJ5KG1vZDEpDQoNCnAxPWdncGxvdChkYXRhMSxhZXMoeT1wcmVkaWN0ZWQseD1vYnNlcnZlZCkpKw0KICBnZW9tX3Ntb290aChjb2xvcj0nYmxhY2snLCBtZXRob2Q9bG0sIHNlPVQsIHNpemU9MC41KStnZW9tX3BvaW50KHNpemUgPSAyKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9ZXhwcmVzc2lvbihwYXN0ZSgiUHJlZGljdGVkIENyIChtZyBrIixnXi0xLCIpIikpLCBicmVha3MgPSBzZXEoNDAwMCwyMDAwMCwyMDAwKSwgbGltaXRzID0gYyg0MDAwLCAyMDAwMCkpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT1leHByZXNzaW9uKHBhc3RlKCJBZGRlZCBDciAobWcgayIsZ14tMSwiKSIpKSwgYnJlYWtzPXNlcSg0MDAwLDIwMDAwLDIwMDApLCBsaW1pdHMgPSBjKDQwMDAsIDIwMDAwKSkrDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpLA0KICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwNCiAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41KSwNCiAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNixjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSxhbmdsZSA9IDI1LCBoanVzdCA9IDEsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSxjb2xvciA9ICJibGFjayIpKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9MTAyMDAsIHg9MTUwMDAsbGFiZWw9IlNoZWVwIGZlY2VzIixzaXplPTgsY29sb3I9ImJsYWNrIikrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTgyMDAsIHg9MTUwMDAsbGFiZWw9ZXhwcmVzc2lvbihwYXN0ZSh5LCAiID0gMC45NXggKyAxMDAwIikpLHNpemU9Nixjb2xvcj0iYmxhY2siKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9NzAwMCwgeD0xNTAwMCxsYWJlbD1leHByZXNzaW9uKHBhc3RlKFJeMiwgIiA9IDAuOTk4IikpLHNpemU9Nixjb2xvcj0iYmxhY2siKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9MjAwMDAsIHg9NDAwMCxsYWJlbD0iQiIsc2l6ZT04LGNvbG9yPSJibGFjayIpKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDIwMDAwLzIwMDAwKQ0KcDENCmBgYA0KDQo+ICoqVGkgZXF1YXRpb24qKiAgDQoNCiRZID0gKGNwcy5SaEthQyDigJMgMC4wMzAgLyAwLjAwMDA5MTYkIA0KDQojIyMgXyoqMi0gU2hlZXAgVGkqKl8NCg0KYGBge3J9DQpkYXRhMj1FRFhSRltjKDIxOjI0KSxdDQpkYXRhMiRwcmVkaWN0ZWQ9KGRhdGEyJGNwcy5SaEthQyAtIDAuMDMwKSAvIDAuMDAwMDkxNg0KZGF0YTINCg0KbW9kMj1sbShwcmVkaWN0ZWR+b2JzZXJ2ZWQsZGF0YT1kYXRhMikNCnN1bW1hcnkobW9kMikNCg0KcDI9Z2dwbG90KGRhdGEyLGFlcyh5PXByZWRpY3RlZCx4PW9ic2VydmVkKSkrDQogIGdlb21fc21vb3RoKGNvbG9yPSdibGFjaycsIG1ldGhvZD1sbSwgc2U9VCwgc2l6ZT0wLjUpK2dlb21fcG9pbnQoc2l6ZSA9IDIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT1leHByZXNzaW9uKHBhc3RlKCJQcmVkaWN0ZWQgVGkgKG1nIGsiLGdeLTEsIikiKSksIGJyZWFrcyA9IHNlcSg0MDAwLDIwMDAwLDIwMDApLCBsaW1pdHMgPSBjKDQwMDAsIDIwMDAwKSkrDQogIHNjYWxlX3hfY29udGludW91cyhuYW1lPWV4cHJlc3Npb24ocGFzdGUoIkFkZGVkIFRpIChtZyBrIixnXi0xLCIpIikpLCBicmVha3M9c2VxKDQwMDAsMjAwMDAsMjAwMCksIGxpbWl0cyA9IGMoNDAwMCwgMjAwMDApKSsNCiAgdGhlbWUoYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjUsIGxpbmV0eXBlID0gInNvbGlkIiksDQogIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLA0KICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjUpLA0KICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LGFuZ2xlID0gMjUsIGhqdXN0ID0gMSwgY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LGNvbG9yID0gImJsYWNrIikpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0xMDIwMCwgeD0xNTAwMCxsYWJlbD0iU2hlZXAgZmVjZXMiLHNpemU9OCxjb2xvcj0iYmxhY2siKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9ODIwMCwgeD0xNTAwMCxsYWJlbD1leHByZXNzaW9uKHBhc3RlKHksICIgPSAxLjAwNnggKyAyNDAiKSksc2l6ZT02LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT03MDAwLCB4PTE1MDAwLGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoUl4yLCAiID0gMC45OTkiKSksc2l6ZT02LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0yMDAwMCwgeD00MDAwLGxhYmVsPSJBIixzaXplPTgsY29sb3I9ImJsYWNrIikrDQogIGNvb3JkX2ZpeGVkKHJhdGlvID0gMjAwMDAvMjAwMDApDQpwMg0KYGBgDQoNCj4gKipDciBlcXVhdGlvbioqIA0KDQokWSA9IChjcHMuUmhLYUMg4oCTIDAuMDUpIC8gMC4wMDAxNjMkDQoNCiMjIyBfKiozLSBDYXR0bGUgQ3IqKl8NCg0KYGBge3J9DQpkYXRhMz1FRFhSRltjKDU6OCksXQ0KZGF0YTMkcHJlZGljdGVkPShkYXRhMyRjcHMuUmhLYUMtMC4wNSkvMC4wMDAxNjMNCmRhdGEzDQoNCm1vZDM9bG0ocHJlZGljdGVkfm9ic2VydmVkLGRhdGE9ZGF0YTMpDQpzdW1tYXJ5KG1vZDMpDQoNCnAzPWdncGxvdChkYXRhMyxhZXMoeT1wcmVkaWN0ZWQseD1vYnNlcnZlZCkpKw0KICBnZW9tX3Ntb290aChjb2xvcj0nYmxhY2snLCBtZXRob2Q9bG0sIHNlPVQsIHNpemU9MC41KStnZW9tX3BvaW50KHNpemUgPSAyKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9ZXhwcmVzc2lvbihwYXN0ZSgiUHJlZGljdGVkIENyIChtZyBrIixnXi0xLCIpIikpLCBicmVha3MgPSBzZXEoNDAwMCwyODAwMCwyMDAwKSwgbGltaXRzID0gYyg0MDAwLCAyODAwMCkpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT1leHByZXNzaW9uKHBhc3RlKCJBZGRlZCBDciAobWcgayIsZ14tMSwiKSIpKSwgYnJlYWtzPXNlcSg0MDAwLDI4MDAwLDIwMDApLCBsaW1pdHMgPSBjKDQwMDAsIDI4MDAwKSkrDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpLA0KICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwNCiAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41KSwNCiAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNixjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCxhbmdsZSA9IDI1LCBoanVzdCA9IDEsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCxjb2xvciA9ICJibGFjayIpKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9MTIwMDAsIHg9MjAwMDAsbGFiZWw9IkNhdHRsZSBmZWNlcyIsc2l6ZT04LjUsY29sb3I9ImJsYWNrIikrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTkwMDAsIHg9MjAwMDAsbGFiZWw9ZXhwcmVzc2lvbihwYXN0ZSh5LCAiID0gMS4zOHggKyA0MDAiKSksc2l6ZT02LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT03MDAwLCB4PTIwMDAwLGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoUl4yLCAiID0gMC45OTciKSksc2l6ZT02LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0yODAwMCwgeD00MDAwLGxhYmVsPSJEIixzaXplPTksY29sb3I9ImJsYWNrIikrDQogIGNvb3JkX2ZpeGVkKHJhdGlvID0gMjgwMDAvMjgwMDApDQpwMw0KYGBgDQoNCj4gKipUaSBlcXVhdGlvbioqICANCg0KJFkgPSAoY3BzLlJoS2FDIOKAkyAwLjAzMCAvIDAuMDAwMDkxNiQNCg0KIyMjIF8qKjQtIENhdHRsZSBUaSoqXw0KDQpgYGB7cn0NCmRhdGE0PUVEWFJGW2MoMjU6MjgpLF0NCmRhdGE0JHByZWRpY3RlZD0oZGF0YTQkY3BzLlJoS2FDIC0gMC4wMzApIC8gMC4wMDAwOTE2DQpkYXRhNA0KDQptb2Q0PWxtKHByZWRpY3RlZH5vYnNlcnZlZCxkYXRhPWRhdGE0KQ0Kc3VtbWFyeShtb2Q0KQ0KDQpwND1nZ3Bsb3QoZGF0YTQsYWVzKHk9cHJlZGljdGVkLHg9b2JzZXJ2ZWQpKSsNCiAgZ2VvbV9zbW9vdGgoY29sb3I9J2JsYWNrJywgbWV0aG9kPWxtLCBzZT1ULCBzaXplPTAuNSkrZ2VvbV9wb2ludChzaXplID0gMikrDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lPWV4cHJlc3Npb24ocGFzdGUoIlByZWRpY3RlZCBUaSAobWcgayIsZ14tMSwiKSIpKSwgYnJlYWtzID0gc2VxKDQwMDAsMjgwMDAsMjAwMCksIGxpbWl0cyA9IGMoNDAwMCwgMjgwMDApKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWU9ZXhwcmVzc2lvbihwYXN0ZSgiQWRkZWQgVGkgKG1nIGsiLGdeLTEsIikiKSksIGJyZWFrcz1zZXEoNDAwMCwyODAwMCwyMDAwKSwgbGltaXRzID0gYyg0MDAwLCAyODAwMCkpKw0KICB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiKSwNCiAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksDQogIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSksDQogIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNixjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsYW5nbGUgPSAyNSwgaGp1c3QgPSAxLCBjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsY29sb3IgPSAiYmxhY2siKSkrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTEyMDAwLCB4PTIwMDAwLGxhYmVsPSJDYXR0bGUgZmVjZXMiLHNpemU9OC41LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT05MDAwLCB4PTIwMDAwLGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoeSwgIiA9IDEuMzN4IC0gNTAwIikpLHNpemU9Nixjb2xvcj0iYmxhY2siKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9NzAwMCwgeD0yMDAwMCxsYWJlbD1leHByZXNzaW9uKHBhc3RlKFJeMiwgIiA9IDAuOTk2IikpLHNpemU9Nixjb2xvcj0iYmxhY2siKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9MjgwMDAsIHg9NDAwMCxsYWJlbD0iQyIsc2l6ZT05LGNvbG9yPSJibGFjayIpKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDI4MDAwLzI4MDAwKQ0KcDQNCmBgYA0KDQo+ICoqQ3IgZXF1YXRpb24qKiANCg0KJFkgPSAoY3BzLlJoS2FDIOKAkyAwLjA1MikgLyAwLjAwMDE2MyQNCg0KIyMjIF8qKjUtIEhvcnNlIENyKipfDQoNCmBgYHtyfQ0KZGF0YTU9RURYUkZbYyg5OjEyKSxdDQpkYXRhNSRwcmVkaWN0ZWQ9KGRhdGE1JGNwcy5SaEthQy0wLjA1KS8wLjAwMDE2Mw0KZGF0YTUNCg0KbW9kNT1sbShwcmVkaWN0ZWR+b2JzZXJ2ZWQsZGF0YT1kYXRhNSkNCnN1bW1hcnkobW9kNSkNCg0KcDU9Z2dwbG90KGRhdGE1LGFlcyh5PXByZWRpY3RlZCx4PW9ic2VydmVkKSkrDQogIGdlb21fc21vb3RoKGNvbG9yPSdibGFjaycsIG1ldGhvZD1sbSwgc2U9VCwgc2l6ZT0wLjUpK2dlb21fcG9pbnQoc2l6ZSA9IDIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT1leHByZXNzaW9uKHBhc3RlKCJQcmVkaWN0ZWQgQ3IgKG1nIGsiLGdeLTEsIikiKSksIGJyZWFrcyA9IHNlcSg0MDAwLDI2MDAwLDIwMDApLCBsaW1pdHMgPSBjKDQwMDAsIDI2MDAwKSkrDQogIHNjYWxlX3hfY29udGludW91cyhuYW1lPWV4cHJlc3Npb24ocGFzdGUoIkFkZGVkIENyIChtZyBrIixnXi0xLCIpIikpLCBicmVha3M9c2VxKDQwMDAsMjYwMDAsMjAwMCksIGxpbWl0cyA9IGMoNDAwMCwgMjYwMDApKSsNCiAgdGhlbWUoYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjUsIGxpbmV0eXBlID0gInNvbGlkIiksDQogIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLA0KICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjUpLA0KICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3LGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcsY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LGFuZ2xlID0gMjUsIGhqdXN0ID0gMSwgY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LGNvbG9yID0gImJsYWNrIikpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0xMjAwMCwgeD0xOTAwMCxsYWJlbD0iSG9yc2UgZmVjZXMiLHNpemU9OSxjb2xvcj0iYmxhY2siKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9OTAwMCwgeD0xOTAwMCxsYWJlbD1leHByZXNzaW9uKHBhc3RlKHksICIgPSAxLjI2eCArIDcwMCIpKSxzaXplPTcsY29sb3I9ImJsYWNrIikrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTcwMDAsIHg9MTkwMDAsbGFiZWw9ZXhwcmVzc2lvbihwYXN0ZShSXjIsICIgPSAwLjk5OSIpKSxzaXplPTcsY29sb3I9ImJsYWNrIikrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTI2MDAwLCB4PTQwMDAsbGFiZWw9IkYiLHNpemU9MTAsY29sb3I9ImJsYWNrIikrDQogIGNvb3JkX2ZpeGVkKHJhdGlvID0gMjYwMDAvMjYwMDApDQpwNQ0KYGBgDQoNCj4gKipUaSBlcXVhdGlvbioqICANCg0KJFkgPSAoY3BzLlJoS2FDIOKAkyAwLjAzMCAvIDAuMDAwMDkxNiQNCg0KIyMjIF8qKjYtIEhvcnNlIFRpKipfDQoNCmBgYHtyfQ0KZGF0YTY9RURYUkZbYygyOTozMiksXQ0KZGF0YTYkcHJlZGljdGVkPShkYXRhNiRjcHMuUmhLYUMgLSAwLjAzMCkgLyAwLjAwMDA5MTYNCmRhdGE2DQoNCm1vZDY9bG0ocHJlZGljdGVkfm9ic2VydmVkLGRhdGE9ZGF0YTYpDQpzdW1tYXJ5KG1vZDYpDQoNCnA2PWdncGxvdChkYXRhNixhZXMoeT1wcmVkaWN0ZWQseD1vYnNlcnZlZCkpKw0KICBnZW9tX3Ntb290aChjb2xvcj0nYmxhY2snLCBtZXRob2Q9bG0sIHNlPVQsIHNpemU9MC41KStnZW9tX3BvaW50KHNpemUgPSAyKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9ZXhwcmVzc2lvbihwYXN0ZSgiUHJlZGljdGVkIFRpIChtZyBrIixnXi0xLCIpIikpLCBicmVha3MgPSBzZXEoNDAwMCwyNjAwMCwyMDAwKSwgbGltaXRzID0gYyg0MDAwLCAyNjAwMCkpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT1leHByZXNzaW9uKHBhc3RlKCJBZGRlZCBUaSAobWcgayIsZ14tMSwiKSIpKSwgYnJlYWtzPXNlcSg0MDAwLDI2MDAwLDIwMDApLCBsaW1pdHMgPSBjKDQwMDAsIDI2MDAwKSkrDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpLA0KICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwNCiAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41KSwNCiAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyxjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3LGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSxhbmdsZSA9IDI1LCBoanVzdCA9IDEsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCxjb2xvciA9ICJibGFjayIpKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9MTIwMDAsIHg9MTkwMDAsbGFiZWw9IkhvcnNlIGZlY2VzIixzaXplPTksY29sb3I9ImJsYWNrIikrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTkwMDAsIHg9MTkwMDAsbGFiZWw9ZXhwcmVzc2lvbihwYXN0ZSh5LCAiID0gMS4yOHggLSA2MDAiKSksc2l6ZT03LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT03MDAwLCB4PTE5MDAwLGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoUl4yLCAiID0gMC45OTUiKSksc2l6ZT03LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0yNjAwMCwgeD00MDAwLGxhYmVsPSJFIixzaXplPTEwLGNvbG9yPSJibGFjayIpKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDI2MDAwLzI2MDAwKQ0KcDYNCmBgYA0KDQojIyMgXypTYXZlKl8NCg0KYGBge3J9DQphID0gZ3JpZC5hcnJhbmdlKHAyLCBwMSwgcDQsIHAzLCBwNiwgcDUsIG5jb2wgPSAyLCBucm93ID0gMykNCmdnc2F2ZSgiUGxvdHNfZmVjZXNfdmFsaWRhdGlvbi5wbmciLCBhLCB3aWR0aCA9IDEyLCBoZWlnaHQgPSAxOCwgdW5pdHMgPSAiaW4iLCBkcGkgPSAzMDApDQpgYGANCg0KIyMjIF8qKlRpZnRvbiBoYXkgcmVncmVzc2lvbiBlcXVhdGlvbnMqKl8NCg0KIyMgXyoqNy0gQ29uY2VudHJhdGUgVGkqKl8NCg0KPiAqKlRpIGVxdWF0aW9uKiogDQoNCiR5ID0gKGNwcy5SaEthQyArIDAuMDYpLzAuMDAwMTMxeCQNCg0KYGBge3J9DQpkYXRhNz1FRFhSRltjKDMzOjM2KSxdDQpkYXRhNyRwcmVkaWN0ZWQ9KGRhdGE3JGNwcy5SaEthQyArIDAuMDYpIC8gMC4wMDAxMzENCg0KZGF0YTcNCg0KbW9kNz1sbShwcmVkaWN0ZWR+b2JzZXJ2ZWQsZGF0YT1kYXRhNykNCnN1bW1hcnkobW9kNykNCg0KcDc9Z2dwbG90KGRhdGE3LGFlcyh5PXByZWRpY3RlZCx4PW9ic2VydmVkKSkrDQogIGdlb21fc21vb3RoKGNvbG9yPSdibGFjaycsIG1ldGhvZD1sbSwgc2U9VCwgc2l6ZT0wLjUpK2dlb21fcG9pbnQoc2l6ZSA9IDIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT1leHByZXNzaW9uKHBhc3RlKCJQcmVkaWN0ZWQgVGkgKG1nIGsiLGdeLTEsIikiKSksIGJyZWFrcyA9IHNlcSgyMDAwLDE2MDAwLDIwMDApLCBsaW1pdHMgPSBjKDIwMDAsIDE2MDAwKSkrDQogIHNjYWxlX3hfY29udGludW91cyhuYW1lPWV4cHJlc3Npb24ocGFzdGUoIkFkZGVkIFRpIChtZyBrIixnXi0xLCIpIikpLCBicmVha3M9c2VxKDIwMDAsMTYwMDAsMjAwMCksIGxpbWl0cyA9IGMoMjAwMCwgMTYwMDApKSsNCiAgdGhlbWUoYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjUsIGxpbmV0eXBlID0gInNvbGlkIiksDQogIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLA0KICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjUpLA0KICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3LGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcsY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LGFuZ2xlID0gMjUsIGhqdXN0ID0gMSwgY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LGNvbG9yID0gImJsYWNrIikpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT02NDAwLCB4PTExMDAwLGxhYmVsPSJDb25jZW50cmF0ZSIsc2l6ZT04LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT01MDAwLCB4PTExMDAwLGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoeSwgIiA9IDAuODh4ICsgNzAwIikpLHNpemU9Nixjb2xvcj0iYmxhY2siKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9NDAwMCwgeD0xMTAwMCxsYWJlbD1leHByZXNzaW9uKHBhc3RlKFJeMiwgIiA9IDAuOTk3IikpLHNpemU9Nixjb2xvcj0iYmxhY2siKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9MTYwMDAsIHg9MjAwMCxsYWJlbD0iQSIsc2l6ZT0xMCxjb2xvcj0iYmxhY2siKSsNCiAgY29vcmRfZml4ZWQocmF0aW8gPSAxNjAwMC8xNjAwMCkNCnA3DQpgYGANCg0KIyMjIF8qKjgtIENvbmNlbnRyYXRlIENyKipfDQoNCj4gKipDciBlcXVhdGlvbioqDQoNCiRZID0gKGNwcy5SaEthQyDigJMgMC4zMCkgLyAwLjAwMDE5MCQNCg0KYGBge3J9DQpkYXRhOD1FRFhSRltjKDEzOjE2KSxdDQpkYXRhOCRwcmVkaWN0ZWQ9KGRhdGE4JGNwcy5SaEthQyAtIDAuMzApIC8gMC4wMDAxOTANCg0KZGF0YTgNCg0KDQoNCm1vZDg9bG0ocHJlZGljdGVkfm9ic2VydmVkLGRhdGE9ZGF0YTgpDQpzdW1tYXJ5KG1vZDgpDQoNCnA4PWdncGxvdChkYXRhOCxhZXMoeT1wcmVkaWN0ZWQseD1vYnNlcnZlZCkpKw0KICBnZW9tX3Ntb290aChjb2xvcj0nYmxhY2snLCBtZXRob2Q9bG0sIHNlPVQsIHNpemU9MC41KStnZW9tX3BvaW50KHNpemUgPSAyKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9ZXhwcmVzc2lvbihwYXN0ZSgiUHJlZGljdGVkIENyIChtZyBrIixnXi0xLCIpIikpLCBicmVha3MgPSBzZXEoMjAwMCwxNjAwMCwyMDAwKSwgbGltaXRzID0gYygyMDAwLCAxNjAwMCkpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT1leHByZXNzaW9uKHBhc3RlKCJBZGRlZCBDciAobWcgayIsZ14tMSwiKSIpKSwgYnJlYWtzPXNlcSgyMDAwLDE2MDAwLDIwMDApLCBsaW1pdHMgPSBjKDIwMDAsIDE2MDAwKSkrDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpLA0KICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwNCiAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41KSwNCiAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyxjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3LGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSxhbmdsZSA9IDI1LCBoanVzdCA9IDEsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSxjb2xvciA9ICJibGFjayIpKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9NjQwMCwgeD0xMTAwMCxsYWJlbD0iQ29uY2VudHJhdGUiLHNpemU9OCxjb2xvcj0iYmxhY2siKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9NTAwMCwgeD0xMTAwMCxsYWJlbD1leHByZXNzaW9uKHBhc3RlKHksICIgPSAxLjA5eCAtIDMwMCIpKSxzaXplPTYsY29sb3I9ImJsYWNrIikrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTQwMDAsIHg9MTEwMDAsbGFiZWw9ZXhwcmVzc2lvbihwYXN0ZShSXjIsICIgPSAwLjk5OSIpKSxzaXplPTYsY29sb3I9ImJsYWNrIikrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTE2MDAwLCB4PTIwMDAsbGFiZWw9IkIiLHNpemU9MTAsY29sb3I9ImJsYWNrIikrDQogIGNvb3JkX2ZpeGVkKHJhdGlvID0gMTYwMDAvMTYwMDApDQpwOA0KYGBgDQoNCiMjIyBfKio5LSBNaW5lcmFsIHNhbHQgVGkqKl8NCg0KPiAqKlRpIGVxdWF0aW9uKiogDQoNCiR5ID0gKGNwcy5SaEthQyArIDAuMDYpLzAuMDAwMTMxeCQNCg0KYGBge3J9DQpkYXRhOT1FRFhSRltjKDM3OjQwKSxdDQpkYXRhOSRwcmVkaWN0ZWQ9KGRhdGE5JGNwcy5SaEthQyArIDAuMDYpIC8gMC4wMDAxMzENCmRhdGE5DQoNCm1vZDk9bG0ocHJlZGljdGVkfm9ic2VydmVkLGRhdGE9ZGF0YTkpDQpzdW1tYXJ5KG1vZDkpDQoNCnA5PWdncGxvdChkYXRhOSxhZXMoeT1wcmVkaWN0ZWQseD1vYnNlcnZlZCkpKw0KICBnZW9tX3Ntb290aChjb2xvcj0nYmxhY2snLCBtZXRob2Q9bG0sIHNlPVQsIHNpemU9MC41KStnZW9tX3BvaW50KHNpemUgPSAyKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9ZXhwcmVzc2lvbihwYXN0ZSgiUHJlZGljdGVkIFRpIChtZyBrIixnXi0xLCIpIikpLCBicmVha3MgPSBzZXEoMjAwMCwxNDAwMCwyMDAwKSwgbGltaXRzID0gYygyMDAwLCAxNDAwMCkpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT1leHByZXNzaW9uKHBhc3RlKCJBZGRlZCBUaSAobWcgayIsZ14tMSwiKSIpKSwgYnJlYWtzPXNlcSgyMDAwLDE0MDAwLDIwMDApLCBsaW1pdHMgPSBjKDIwMDAsIDE0MDAwKSkrDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpLA0KICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSwNCiAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41KSwNCiAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyxjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3LGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSxhbmdsZSA9IDI1LCBoanVzdCA9IDEsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSxjb2xvciA9ICJibGFjayIpKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9NTMwMCwgeD0xMDAwMCxsYWJlbD0iTWluZXJhbCBzYWx0IixzaXplPTgsY29sb3I9ImJsYWNrIikrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTQwMDAsIHg9MTAwMDAsbGFiZWw9ZXhwcmVzc2lvbihwYXN0ZSh5LCAiID0gMC43NXggKyA4MDAiKSksc2l6ZT02LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0zMDAwLCB4PTEwMDAwLGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoUl4yLCAiID0gMC45OTEiKSksc2l6ZT02LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0xNDAwMCwgeD0yMDAwLGxhYmVsPSJDIixzaXplPTEwLGNvbG9yPSJibGFjayIpKw0KICBjb29yZF9maXhlZChyYXRpbyA9IDE0MDAwLzE0MDAwKQ0KcDkNCmBgYA0KDQojIyMgXyoqMTAtIE1pbmVyYWwgc2FsdCBDcioqXw0KDQo+ICoqQ3IgZXF1YXRpb24qKg0KDQokWSA9IChjcHMuUmhLYUMg4oCTIDAuMzApIC8gMC4wMDAxOTAkDQoNCmBgYHtyfQ0KZGF0YTEwPUVEWFJGW2MoMTc6MjApLF0NCmRhdGExMCRwcmVkaWN0ZWQ9KGRhdGExMCRjcHMuUmhLYUMgLSAwLjMwKSAvIDAuMDAwMTkwDQpkYXRhMTANCg0KbW9kMTA9bG0ocHJlZGljdGVkfm9ic2VydmVkLGRhdGE9ZGF0YTEwKQ0Kc3VtbWFyeShtb2QxMCkNCg0KcDEwPWdncGxvdChkYXRhMTAsYWVzKHk9cHJlZGljdGVkLHg9b2JzZXJ2ZWQpKSsNCiAgZ2VvbV9zbW9vdGgoY29sb3I9J2JsYWNrJywgbWV0aG9kPWxtLCBzZT1ULCBzaXplPTAuNSkrZ2VvbV9wb2ludChzaXplID0gMikrDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lPWV4cHJlc3Npb24ocGFzdGUoIlByZWRpY3RlZCBDciAobWcgayIsZ14tMSwiKSIpKSwgYnJlYWtzID0gc2VxKDIwMDAsMTQwMDAsMjAwMCksIGxpbWl0cyA9IGMoMjAwMCwgMTQwMDApKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWU9ZXhwcmVzc2lvbihwYXN0ZSgiQWRkZWQgQ3IgKG1nIGsiLGdeLTEsIikiKSksIGJyZWFrcz1zZXEoMjAwMCwxNDAwMCwyMDAwKSwgbGltaXRzID0gYygyMDAwLCAxNDAwMCkpKw0KICB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiKSwNCiAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksDQogIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSksDQogIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcsY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyxjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsYW5nbGUgPSAyNSwgaGp1c3QgPSAxLCBjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsY29sb3IgPSAiYmxhY2siKSkrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTUzMDAsIHg9MTAwMDAsbGFiZWw9Ik1pbmVyYWwgc2FsdCIsc2l6ZT04LGNvbG9yPSJibGFjayIpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT00MDAwLCB4PTEwMDAwLGxhYmVsPWV4cHJlc3Npb24ocGFzdGUoeSwgIiA9IDAuOTh4IC0gNDAwIikpLHNpemU9Nixjb2xvcj0iYmxhY2siKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9MzAwMCwgeD0xMDAwMCxsYWJlbD1leHByZXNzaW9uKHBhc3RlKFJeMiwgIiA9IDAuOTk4IikpLHNpemU9Nixjb2xvcj0iYmxhY2siKSsNCiAgYW5ub3RhdGUoZ2VvbT0idGV4dCIsIHk9MTQwMDAsIHg9MjAwMCxsYWJlbD0iRCIsc2l6ZT0xMCxjb2xvcj0iYmxhY2siKSsNCiAgY29vcmRfZml4ZWQocmF0aW8gPSAxNDAwMC8xNDAwMCkNCnAxMA0KYGBgDQoNCiMjIyBfKlNhdmUqXw0KDQpgYGB7cn0NCmEgPSBncmlkLmFycmFuZ2UocDcsIHA4LCBwOSwgcDEwLCBuY29sID0gMiwgbnJvdyA9IDIpDQpnZ3NhdmUoIlBsb3RzX2hheV92YWxpZGF0aW9uLnBuZyIsIGEsIHdpZHRoID0gMTIsIGhlaWdodCA9IDEyLCB1bml0cyA9ICJpbiIsIGRwaSA9IDMwMCkNCmBgYA0KDQojICoqUmVjb3ZlcnkqKg0KDQojIyAqKkRBVEEqKg0KDQpgYGB7cn0NCkVEWFJGMSA9cmJpbmQoZGF0YTEsZGF0YTIsIGRhdGEzLCBkYXRhNCwgZGF0YTUsIGRhdGE2LCBkYXRhNywgZGF0YTgsIGRhdGE5LCBkYXRhMTApDQoNCkVEWFJGMSRyZWNvdmVyeT0oRURYUkYxJHByZWRpY3RlZC9FRFhSRjEkb2JzZXJ2ZWQpKjEwMA0KRURYUkYxDQoNCnN1bW1hcnkgPSBFRFhSRjEgJT4lDQogIGdyb3VwX2J5KHNhbXBsZSwgbWFya2VyKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIHNkID0gc2QocmVjb3ZlcnksIG5hLnJtID0gVFJVRSksDQogICAgcmVjb3ZlcnkgPSBtZWFuKHJlY292ZXJ5KSkNCnN1bW1hcnkNCmBgYA0KDQojIyMgXyoqRmVjZXMgY3VydmVzKipfDQoNCmBgYHtyfQ0KI1Bsb3QNCmcxPWdncGxvdChzdW1tYXJ5W2MoMzo4KSxdLCBhZXMoeD1zYW1wbGUsIHk9cmVjb3ZlcnksIGZpbGw9bWFya2VyKSkrDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49cmVjb3Zlcnktc2QsIHltYXg9cmVjb3Zlcnkrc2QpLCB3aWR0aD0uMiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEwMCwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yID0gImJsdWUiKSsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTExMCwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yID0gInJlZCIpKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9OTAsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvciA9ICJyZWQiKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZ3JleTQwIiwiZ3JleTgwIiksbmFtZT0gIk1hcmtlcnMiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9IlJlY292ZXJ5ICglKSIsIGJyZWFrcyA9IHNlcSgwLDE2MCwxMCksIGxpbWl0cyA9IGMoMCwgMTYwKSkrDQogIHNjYWxlX3hfZGlzY3JldGUobmFtZT0iIiwgbGFiZWxzPWMoIkZlY2VzQ2F0dGxlIiA9ICJDYXR0bGUgZmVjZXMiLCJGZWNlc0hvcnNlIiA9ICJIb3JzZSBmZWNlcyIsDQogICJGZWNlc1NoZWVwIiA9ICJTaGVlcCBmZWNlcyIpKQ0KZzENCmcyPWcxK3RoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpLA0KIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLA0KIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiLCBzaXplPTAuNSwgbGluZXR5cGU9InNvbGlkIixjb2xvdXIgPSJibGFjayIpLA0KIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC41MCwgMC45NSksbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjQyLCAnY20nKSwNCiBsZWdlbmQuZGlyZWN0aW9uPSJob3Jpem9udGFsIiwNCiBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAxKSwNCiBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjMpLCAgICAgICAgICANCiAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMyksDQogIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjEsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMSwgYW5nbGUgPSAxMCwgaGp1c3QgPSAxLCBjb2xvciA9ICJibGFjayIpLA0KICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTksIGNvbG9yID0gImJsYWNrIikpKw0KICBhbm5vdGF0ZShnZW9tPSJ0ZXh0IiwgeT0xNjAsIHg9MC41LGxhYmVsPSJBIixzaXplPTExLGNvbG9yPSJibGFjayIpDQpnMg0KYGBgDQoNCiMjIyBfKipIYXkgY3VydmVzKipfDQoNCmBgYHtyfQ0KI1Bsb3QNCmczPWdncGxvdChzdW1tYXJ5W2MoMToyLDk6MTApLF0sIGFlcyh4PXNhbXBsZSwgeT1yZWNvdmVyeSwgZmlsbD1tYXJrZXIpKSsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1yZWNvdmVyeS1zZCwgeW1heD1yZWNvdmVyeStzZCksIHdpZHRoPS4yLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSkpKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEwMCwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yID0gImJsdWUiKSsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTExMCwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yID0gInJlZCIpKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9OTAsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvciA9ICJyZWQiKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZ3JleTQwIiwiZ3JleTgwIiksbmFtZT0gIk1hcmtlcnMiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9IlJlY292ZXJ5ICglKSIsIGJyZWFrcyA9IHNlcSgwLDEzMCwxMCksIGxpbWl0cyA9IGMoMCwgMTMwKSkrDQogIHNjYWxlX3hfZGlzY3JldGUobmFtZT0iIiwgbGFiZWxzPWMoIkNvbmNlbnRyYXRlK0hheSIgPSAiQ29uY2VudHJhdGUiLCJTYWx0K0hheSIgPSAiTWluZXJhbCBzYWx0IikpDQpnMw0KZzQ9ZzMrdGhlbWUoYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjUsIGxpbmV0eXBlID0gInNvbGlkIiksDQogcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IiksDQogbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIsIHNpemU9MC41LCBsaW5ldHlwZT0ic29saWQiLGNvbG91ciA9ImJsYWNrIiksDQogbGVnZW5kLnBvc2l0aW9uID0gYygwLjUwLCAwLjk1KSxsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNDIsICdjbScpLA0KIGxlZ2VuZC5kaXJlY3Rpb249Imhvcml6b250YWwiLA0KIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpLA0KIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMyksICAgICAgICAgIA0KICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIzKSwNCiAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMSwgY29sb3IgPSAiYmxhY2siKSwNCiAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIxLCBhbmdsZSA9IDEwLCBoanVzdCA9IDEsIGNvbG9yID0gImJsYWNrIiksDQogIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOSwgY29sb3IgPSAiYmxhY2siKSkrDQogIGFubm90YXRlKGdlb209InRleHQiLCB5PTEzMCwgeD0wLjUsbGFiZWw9IkIiLHNpemU9MTEsY29sb3I9ImJsYWNrIikNCmc0DQpgYGANCg0KIyAqKlNhdmUqKg0KDQpgYGB7cn0NCmEgPSBncmlkLmFycmFuZ2UoZzIsIGc0LCBuY29sID0gMSwgbnJvdyA9IDIpDQpnZ3NhdmUoIlBsb3RfcmVjb3ZlcnkucG5nIiwgYSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTIsIHVuaXRzID0gImluIiwgZHBpID0gMzAwKQ0KYGBgDQo=