Code initially Written October 15, 2018; finalized on May 5, 2021, and edited for reviewers on March 30, 2022 This contains the R script and results for analysis of mobbing behavior in the lark bunting dataset. There are three major sections. 1) How repeatable are mob-related behaviors, 2) Mobber perspecive - Relationships between traits and fitness with acting as a mobber, 3) Victim perspective - Relationships between traits and fitenss with being a mob victim.
This analysis accompanies the paper published in Behavioral Ecology and Sociobiology by Bruce E. Lyon and Alexis S. Chaine entitled “Mobbing for matings: dynamics, plumage correlates, and fitness impacts of conspicuous group extra-pair behaviors in the lark bunting” (contact: belyon@ucsc.edu; Department of Ecology and Evolutionary Biology, University of California, Santa Cruz, CA 95060, USA;Station d’Ecologie Théorique et Expérimentale du CNRS (UAR2029), 2 route du CNRS, 09200 Moulis, France and Toulouse School of Economics, Institute for Advanced Studies in Toulouse, 31000, Toulouse, France)
R details and packages used
- File creation date: 2022-07-04
- R version 4.0.2 (2020-06-22)
Load packages
Code to load all of the packages listed above
#Load packages and dataset
Warning messages:
1: package ‘lmerTest’ was built under R version 4.0.4
2: package ‘lme4’ was built under R version 4.0.4
library(lme4) #for glmer
library(rptR) #for repeatability
library(lmerTest) #to get p-values from glmer.
library(dplyr) #to manipulate data, center variables
library(sjPlot) #for plotting output of GLMER
library(ggplot2) #for plotting output of GLMER
library(MASS) #to run negative bionomials if quasipoisson does not work in a glmer
library(AER) #to run overdispersion test on glm using dispersiontest(model) function
library(blmeco) #run overdispersion test on glmer using dispersion_glmer(model) function
#create function following BOLKER github from March 1, 2022: https://bbolker.github.io/mixedmodels-misc/glmmFAQ.html#overdispersion
overdisp_fun <- function(model) {
rdf <- df.residual(model)
rp <- residuals(model,type="pearson")
Pearson.chisq <- sum(rp^2)
prat <- Pearson.chisq/rdf
pval <- pchisq(Pearson.chisq, df=rdf, lower.tail=FALSE)
c(chisq=Pearson.chisq,ratio=prat,rdf=rdf,p=pval)
}
library(rmarkdown) #to output the results into word
#set options for not stopping analyses for errors:
knitr::opts_chunk$set(error = FALSE)
#knitr::opts_chunk$set(warning = FALSE)
Load dataset, calculate relative fitness, and create subset databases for specific analyses
#Import male centered dataset
dat<-read.csv("C:/Pyrenees/AlexisLabFiles/Papers n Manuscripts/LKBU_Mobs/MalesForMobs_Export_2.csv",header=T)
#convert to standard data-frame format because dplyr includes classes (tables?) in the dataframe which causes problems in some analyses
dat <- as.data.frame(dat)
#str(dat) #check to make sure that structure is correct
write.csv(dat, "C:/Pyrenees/AlexisLabFiles/Papers n Manuscripts/LKBU_Mobs/MalesForMobs_Export_Final.csv") #exports dataset to have a copy in csv format
#view data headers
#names(dat)
#Import female centered dataset
dat_F<-read.csv("C:/Pyrenees/AlexisLabFiles/Papers n Manuscripts/LKBU_Mobs/FemaleTraits_Vs_Mob_EP.csv",header=T)
#convert to standard data-frame format because dplyr includes classes (tables?) in the dataframe which causes problems in some analyses
dat_F <- as.data.frame(dat_F)
#str(dat_F) #check to make sure that structure is correct
write.csv(dat_F, "C:/Pyrenees/AlexisLabFiles/Papers n Manuscripts/LKBU_Mobs/MalesForMobs_Females_Export_Final.csv") #exports dataset to have a copy in csv format
#view data headers
#names(dat_F)
create subsetting datasets used in particular analyses (using filter from dplyr)
Obs30MinDatsub_F2 <- filter(dat_F, Total.time.min=>30)
Error: unexpected '>' in "Obs30MinDatsub_F2 <- filter(dat_F, Total.time.min=>"
Check distributions
#with(dat, hist(number.obs.was.mobber))
#with(dat, hist(number.victims))
#with(dat, hist(Number.observations.victim.mobbed))
#with(dat, hist(EP.Tot.P.0.15))
#with(dat, hist(X1st.egg.date))
#with(dat, hist(Julian.capture.date))
#with(dat, hist(N.EP.chick.home.0.15))
#with(dat, hist(WP.Tot.P.0.15.fledge))
B) MOBBER PERSPECTIVE
Do plumage and morphology relate to mobbing behavior and fitness?
3) Does plumage color of a mobber relate to his mobbing behavior?
3) Does male plumage relate to the number of vicitims he mobs? [Fig 2b; TABLE S2]
NVictimsPlumage <- with(dat, glmer(number.victims ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition + (1|Year) + (1|Band.Number), family = poisson))
Model failed to converge with max|grad| = 0.00975192 (tol = 0.002, component 1)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
Family: poisson ( log )
Formula: number.victims ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing +
percent.nr + rump + wp.z.average + Condition + (1 | Year) + (1 | Band.Number)
AIC BIC logLik deviance df.resid
1003.5 1042.7 -491.7 983.5 363
Scaled residuals:
Min 1Q Median 3Q Max
-1.3459 -0.6949 -0.4308 0.4243 2.7802
Random effects:
Groups Name Variance Std.Dev.
Band.Number (Intercept) 0.48540 0.6967
Year (Intercept) 0.07453 0.2730
Number of obs: 373, groups: Band.Number, 305; Year, 5
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.46198 0.15586 -2.964 0.003035 **
BeakSize.PC1 -0.03563 0.06962 -0.512 0.608757
BodySize.PC2 0.18593 0.07178 2.590 0.009585 **
body.color.no.wing 0.07969 0.07536 1.057 0.290307
percent.nr 0.34621 0.09197 3.765 0.000167 ***
rump -0.12769 0.08103 -1.576 0.115048
wp.z.average -0.03972 0.07195 -0.552 0.580891
Condition 0.04946 0.02863 1.727 0.084095 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) BS.PC1 BS.PC2 bdy... prcnt. rump wp.z.v
BeakSiz.PC1 -0.019
BodySiz.PC2 -0.062 0.111
bdy.clr.n.w -0.012 -0.097 -0.055
percent.nr -0.111 -0.019 -0.061 -0.271
rump 0.057 -0.057 0.068 0.084 -0.461
wp.z.averag 0.004 -0.072 -0.140 -0.130 -0.031 0.023
Condition -0.021 -0.070 0.044 -0.042 0.003 -0.030 -0.007
optimizer (Nelder_Mead) convergence code: 0 (OK)
Model failed to converge with max|grad| = 0.00975192 (tol = 0.002, component 1)
Analysis of Variance Table
npar Sum Sq Mean Sq F value
BeakSize.PC1 1 0.1157 0.1157 0.1157
BodySize.PC2 1 8.5135 8.5135 8.5135
body.color.no.wing 1 4.7810 4.7810 4.7810
percent.nr 1 11.9505 11.9505 11.9505
rump 1 2.3111 2.3111 2.3111
wp.z.average 1 0.2928 0.2928 0.2928
Condition 1 3.0028 3.0028 3.0028
#check residual distribution
#qqnorm(residuals(NVictimsPlumage))
#qqline(residuals(NVictimsPlumage))
#remove random effects
NVictimsPlumage1 <- with(dat, glmer(number.victims ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition + (1|Band.Number), family = poisson))
NVictimsPlumage2 <- with(dat, glmer(number.victims ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition + (1|Year), family = poisson))
NVictimsPlumage3 <- with(dat, glm(number.victims ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition, family = poisson))
#compare AIC of models with different combinations of random effects
AIC(NVictimsPlumage)
[1] 1003.465
[1] 1010.499
[1] 1054.717
[1] 1073.092
#test for overdispersion of poisson models
dispersion_glmer(NVictimsPlumage)
[1] 1.016808
overdisp_fun(NVictimsPlumage)
chisq ratio rdf p
221.9645840 0.6114727 363.0000000 1.0000000
4) Are the number of times a bird was seen mobing depend on things like how present they were on the site?
4a) Do number of victims increase with number of mobs? Analysis shown includes birds seen even if not seen mobbing.
#Spearman analysis was used in the manuscript as the rho value is more intuitive than estimates from the GLMM; all analyses show the same pattern, though.
with(dat, cor.test(number.victims, number.obs.was.mobber, method = c("spearman")))
Cannot compute exact p-value with ties
Spearman's rank correlation rho
data: number.victims and number.obs.was.mobber
S = 175854, p-value < 2.2e-16
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
0.9804642
4b) Do number of victims increase with number of mobs? Analysis only including birds seen mobbing at least once.
#Spearman analysis was used in the manuscript as the rho value is more intuitive than estimates from the GLMM; all analyses show the same pattern, though.
with(Mobs1Datsub, cor.test(number.victims, number.obs.was.mobber, method = c("spearman")))
Cannot compute exact p-value with ties
Spearman's rank correlation rho
data: number.victims and number.obs.was.mobber
S = 56236, p-value < 2.2e-16
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
0.7838155
4c) Does nesting date influence mob observations - maybe because birds only mob after they get their own nest?
#Spearman analysis was used in the manuscript as the rho value is more intuitive than estimates from the GLMM; all analyses show the same pattern, though.
with(dat, cor.test(number.obs.was.mobber, X1st.egg.date, method = c("spearman")))
Cannot compute exact p-value with ties
Spearman's rank correlation rho
data: number.obs.was.mobber and X1st.egg.date
S = 1646612, p-value = 3.079e-05
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
-0.2922754
4d) Does number of mob victims predict EP chicks (0.15 level)
#Spearman analysis was used in the manuscript as the rho value is more intuitive than estimates from the GLMM; all analyses show the same pattern, though.
with(dat, cor.test(EP.Tot.P.0.15, number.victims, method = c("spearman")))
5) Does plumage predict EP fitness (#EP chicks sired; #EP nests)
5) Does plumage predict the number of EP chicks (paternity assignment at 0.15 level) [Fig2a; TABLE S1]
EPChicks15.Plumage <- with(dat, glmer(EP.Tot.P.0.15 ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition + (1|Year) + (1|Band.Number), family = poisson))
Model failed to converge with max|grad| = 0.00355843 (tol = 0.002, component 1)
#summary(EPChicks15.Plumage)
#anova(EPChicks15.Plumage)
#qqnorm(residuals(EPChicks15.Plumage))
#qqline(residuals(EPChicks15.Plumage))
#Model does not converge
#without year - best model
EPChicks15.PlumageA <- with(dat, glmer(EP.Tot.P.0.15 ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition + (1|Band.Number), family = poisson))
Model failed to converge with max|grad| = 0.010729 (tol = 0.002, component 1)
summary(EPChicks15.PlumageA)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
Family: poisson ( log )
Formula: EP.Tot.P.0.15 ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing +
percent.nr + rump + wp.z.average + Condition + (1 | Band.Number)
AIC BIC logLik deviance df.resid
514.1 549.4 -248.1 496.1 364
Scaled residuals:
Min 1Q Median 3Q Max
-1.3888 -0.3064 -0.2450 -0.1777 2.3130
Random effects:
Groups Name Variance Std.Dev.
Band.Number (Intercept) 2.539 1.593
Number of obs: 373, groups: Band.Number, 305
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -2.49148 0.30513 -8.165 3.2e-16 ***
BeakSize.PC1 0.09229 0.14288 0.646 0.51832
BodySize.PC2 -0.02475 0.13432 -0.184 0.85379
body.color.no.wing -0.04002 0.15388 -0.260 0.79481
percent.nr 0.57681 0.19037 3.030 0.00245 **
rump -0.17658 0.15730 -1.123 0.26162
wp.z.average -0.31710 0.14499 -2.187 0.02874 *
Condition -0.05501 0.06083 -0.904 0.36580
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) BS.PC1 BS.PC2 bdy... prcnt. rump wp.z.v
BeakSiz.PC1 -0.153
BodySiz.PC2 0.046 0.030
bdy.clr.n.w 0.065 -0.108 -0.034
percent.nr -0.301 -0.006 -0.087 -0.204
rump 0.150 -0.038 0.024 0.053 -0.517
wp.z.averag 0.234 -0.105 -0.181 -0.127 -0.152 0.088
Condition 0.151 0.022 0.065 -0.089 -0.050 0.001 0.011
optimizer (Nelder_Mead) convergence code: 0 (OK)
Model failed to converge with max|grad| = 0.010729 (tol = 0.002, component 1)
anova(EPChicks15.PlumageA)
Analysis of Variance Table
npar Sum Sq Mean Sq F value
BeakSize.PC1 1 0.2963 0.2963 0.2963
BodySize.PC2 1 0.1157 0.1157 0.1157
body.color.no.wing 1 0.0080 0.0080 0.0080
percent.nr 1 5.6163 5.6163 5.6163
rump 1 0.7519 0.7519 0.7519
wp.z.average 1 4.1424 4.1424 4.1424
Condition 1 0.6503 0.6503 0.6503
#qqnorm(residuals(EPChicks15.PlumageA))
#qqline(residuals(EPChicks15.PlumageA))
#without ID
EPChicks15.PlumageB <- with(dat, glmer(EP.Tot.P.0.15 ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition + (1|Year), family = poisson))
#No random effects
EPChicks15.PlumageC <- with(dat, glm(EP.Tot.P.0.15 ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition, family = poisson))
AIC(EPChicks15.Plumage)
[1] 516.121
[1] 514.1211
[1] 579.8071
[1] 579.1551
#test for overdispersion of poisson models
dispersion_glmer(EPChicks15.PlumageA)
[1] 0.7587689
overdisp_fun(EPChicks15.PlumageA)
chisq ratio rdf p
114.1937422 0.3137191 364.0000000 1.0000000
6) Does plumage predict EP fitness above its effects on mobbing. So add mobbing effort as covariate
covariates are number obs for total EPY and number victims for total EPNests#
6) Does plumage impact EP Chicks (paternity assignement at 0.15 level) when controlling for effort? [Fig 2c; TABLE S3]
EPChicks15.Plumage.Effort <- with(dat, glmer(EP.Tot.P.0.15 ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition + number.obs.was.mobber + (1|Year) + (1|Band.Number), family = poisson))
Model failed to converge with max|grad| = 0.0629605 (tol = 0.002, component 1)
#summary(EPChicks15.Plumage.Effort)
#anova(EPChicks15.Plumage.Effort)
#qqnorm(residuals(EPChicks15.Plumage.Effort))
#qqline(residuals(EPChicks15.Plumage.Effort))
EPChicks15.Plumage.Effort1 <- with(dat, glmer(EP.Tot.P.0.15 ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition + number.obs.was.mobber + (1|Band.Number), family = poisson))
Model failed to converge with max|grad| = 0.017055 (tol = 0.002, component 1)
summary(EPChicks15.Plumage.Effort1)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
Family: poisson ( log )
Formula: EP.Tot.P.0.15 ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing +
percent.nr + rump + wp.z.average + Condition + number.obs.was.mobber + (1 | Band.Number)
AIC BIC logLik deviance df.resid
506.6 545.8 -243.3 486.6 363
Scaled residuals:
Min 1Q Median 3Q Max
-1.2759 -0.3391 -0.2737 -0.1977 4.6442
Random effects:
Groups Name Variance Std.Dev.
Band.Number (Intercept) 1.787 1.337
Number of obs: 373, groups: Band.Number, 305
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -2.41594 0.27372 -8.826 < 2e-16 ***
BeakSize.PC1 0.06818 0.13227 0.515 0.60622
BodySize.PC2 -0.08504 0.13215 -0.643 0.51993
body.color.no.wing -0.02560 0.14620 -0.175 0.86099
percent.nr 0.48121 0.18029 2.669 0.00761 **
rump -0.21282 0.15495 -1.373 0.16962
wp.z.average -0.36032 0.13828 -2.606 0.00917 **
Condition -0.06247 0.05750 -1.086 0.27730
number.obs.was.mobber 0.07647 0.02395 3.193 0.00141 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) BS.PC1 BS.PC2 bdy... prcnt. rump wp.z.v Condtn
BeakSiz.PC1 -0.098
BodySiz.PC2 0.050 0.043
bdy.clr.n.w 0.058 -0.116 -0.045
percent.nr -0.310 0.002 -0.066 -0.227
rump 0.225 -0.035 0.073 0.086 -0.528
wp.z.averag 0.311 -0.089 -0.151 -0.103 -0.144 0.138
Condition 0.169 0.025 0.058 -0.054 -0.054 0.019 0.027
nmbr.bs.ws. -0.021 -0.022 -0.179 0.034 -0.148 -0.066 -0.119 -0.034
optimizer (Nelder_Mead) convergence code: 0 (OK)
Model failed to converge with max|grad| = 0.017055 (tol = 0.002, component 1)
anova(EPChicks15.Plumage.Effort1)
Analysis of Variance Table
npar Sum Sq Mean Sq F value
BeakSize.PC1 1 0.1835 0.1835 0.1835
BodySize.PC2 1 0.0011 0.0011 0.0011
body.color.no.wing 1 0.0231 0.0231 0.0231
percent.nr 1 6.4047 6.4047 6.4047
rump 1 0.4497 0.4497 0.4497
wp.z.average 1 3.3960 3.3960 3.3960
Condition 1 0.5858 0.5858 0.5858
number.obs.was.mobber 1 10.2675 10.2675 10.2675
#qqnorm(residuals(EPChicks15.Plumage.Effort1))
#qqline(residuals(EPChicks15.Plumage.Effort1))
EPChicks15.Plumage.Effort2 <- with(dat, glmer(EP.Tot.P.0.15 ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition + number.obs.was.mobber + (1|Year), family = poisson))
EPChicks15.Plumage.Effort3 <- with(dat, glm(EP.Tot.P.0.15 ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition + number.obs.was.mobber, family = poisson))
#Without year is best model
AIC(EPChicks15.Plumage.Effort)
[1] 508.6268
AIC(EPChicks15.Plumage.Effort1)
[1] 506.6213
AIC(EPChicks15.Plumage.Effort2)
[1] 535.0355
AIC(EPChicks15.Plumage.Effort3)
[1] 533.0679
#test for overdispersion of poisson models
dispersion_glmer(EPChicks15.Plumage.Effort1)
[1] 0.7804036
overdisp_fun(EPChicks15.Plumage.Effort1)
chisq ratio rdf p
158.0567842 0.4354181 363.0000000 1.0000000
7) Are there costs of mobbing via trade-offs between mobbing effort and increased extra-pair young at home?
7) Are there trade-offs between number of mobs and proportion of EP chicks at home (paternity assignement at 0.15)?
###Using proportion of EP chicks in own nest with “cbind(N.EP, N.WP)” to account for differences in numbers of chicks observed per nest since a larger sample gives a more reliable proportion gives the same result.
NMobs.NestEPChicks15 <- with(dat, glmer(cbind(N.EP.chick.home.0.15, total.genotyped-N.EP.chick.home.0.15) ~ number.obs.was.mobber + (1|Year) + (1|Band.Number), family = binomial))
boundary (singular) fit: see ?isSingular
#summary(NMobs.NestEPChicks15)
#anova(NMobs.NestEPChicks15)
#qqnorm(residuals(NMobs.NestEPChicks15))
#qqline(residuals(NMobs.NestEPChicks15))
#remove random effects
NMobs.NestEPChicks15a <- with(dat, glmer(cbind(N.EP.chick.home.0.15, total.genotyped-N.EP.chick.home.0.15) ~ number.obs.was.mobber + (1|Band.Number), family = binomial))
summary(NMobs.NestEPChicks15a)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
Family: binomial ( logit )
Formula: cbind(N.EP.chick.home.0.15, total.genotyped - N.EP.chick.home.0.15) ~
number.obs.was.mobber + (1 | Band.Number)
AIC BIC logLik deviance df.resid
331.6 340.1 -162.8 325.6 123
Scaled residuals:
Min 1Q Median 3Q Max
-1.3602 -0.6259 -0.3236 0.4491 2.0661
Random effects:
Groups Name Variance Std.Dev.
Band.Number (Intercept) 2.078 1.441
Number of obs: 126, groups: Band.Number, 108
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.48336 0.25059 -5.920 3.23e-09 ***
number.obs.was.mobber -0.03046 0.03307 -0.921 0.357
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr)
nmbr.bs.ws. -0.337
anova(NMobs.NestEPChicks15a)
Analysis of Variance Table
npar Sum Sq Mean Sq F value
number.obs.was.mobber 1 0.8932 0.8932 0.8932
NMobs.NestEPChicks15b <- with(dat, glmer(cbind(N.EP.chick.home.0.15, total.genotyped-N.EP.chick.home.0.15) ~ number.obs.was.mobber + (1|Year), family = binomial))
boundary (singular) fit: see ?isSingular
NMobs.NestEPChicks15c <- with(dat, glm(cbind(N.EP.chick.home.0.15, total.genotyped-N.EP.chick.home.0.15) ~ number.obs.was.mobber, family = binomial))
#qqnorm(residuals(NMobs.NestEPChicks15c))
#qqline(residuals(NMobs.NestEPChicks15c))
#model with only male ID is best and no longer has a singularity
AIC(NMobs.NestEPChicks15)
[1] 333.5933
AIC(NMobs.NestEPChicks15a)
[1] 331.5933
AIC(NMobs.NestEPChicks15b)
[1] 360.9208
AIC(NMobs.NestEPChicks15c)
[1] 358.9208
8) Are there costs of mobbing via trade-offs between mobbing effort and the number of within pair chicks fledged at home?
Focused on number fledged as the cost may not just be in terms of proportion sired, but also other forms of parental care. Did not account for number of chicks in nest - but we don’t want a proportion of chicks that are within pair (analysis above)
8) Is there a trade-off between mobbing effort and number of within pair chicks that actually fledged (paternity assignement at 0.15)
NMobs.NumberOwnWPChicks15 <- with(dat, glmer(WP.Tot.P.0.15.fledge ~ number.obs.was.mobber + (1|Year) + (1|Band.Number), family = poisson))
boundary (singular) fit: see ?isSingular
#summary(NMobs.NumberOwnWPChicks15)
#anova(NMobs.NumberOwnWPChicks15)
#qqnorm(residuals(NMobs.NumberOwnWPChicks15))
#qqline(residuals(NMobs.NumberOwnWPChicks15))
#remove random effects
NMobs.NumberOwnWPChicks15a <- with(dat, glmer(WP.Tot.P.0.15.fledge ~ number.obs.was.mobber + (1|Band.Number), family = poisson))
summary(NMobs.NumberOwnWPChicks15a)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
Family: poisson ( log )
Formula: WP.Tot.P.0.15.fledge ~ number.obs.was.mobber + (1 | Band.Number)
AIC BIC logLik deviance df.resid
615.3 624.5 -304.7 609.3 155
Scaled residuals:
Min 1Q Median 3Q Max
-1.4675 -1.0342 0.1923 0.7525 2.0469
Random effects:
Groups Name Variance Std.Dev.
Band.Number (Intercept) 0.3537 0.5947
Number of obs: 158, groups: Band.Number, 135
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 0.44560 0.10225 4.358 1.31e-05 ***
number.obs.was.mobber 0.02186 0.01440 1.518 0.129
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr)
nmbr.bs.ws. -0.409
anova(NMobs.NumberOwnWPChicks15a)
Analysis of Variance Table
npar Sum Sq Mean Sq F value
number.obs.was.mobber 1 2.2811 2.2811 2.2811
#qqnorm(residuals(NMobs.NumberOwnWPChicks15a))
#qqline(residuals(NMobs.NumberOwnWPChicks15a))
NMobs.NumberOwnWPChicks15b <- with(dat, glmer(WP.Tot.P.0.15.fledge ~ number.obs.was.mobber + (1|Year), family = poisson))
NMobs.NumberOwnWPChicks15c <- with(dat, glm(WP.Tot.P.0.15.fledge ~ number.obs.was.mobber, family = poisson))
#model without year is best
AIC(NMobs.NumberOwnWPChicks15)
[1] 617.3087
AIC(NMobs.NumberOwnWPChicks15a)
[1] 615.3087
AIC(NMobs.NumberOwnWPChicks15b)
[1] 637.4011
AIC(NMobs.NumberOwnWPChicks15c)
[1] 635.4351
#test for overdispersion of poisson models
dispersion_glmer(NMobs.NumberOwnWPChicks15a)
[1] 1.228281
overdisp_fun(NMobs.NumberOwnWPChicks15a)
chisq ratio rdf p
123.3341891 0.7957044 155.0000000 0.9712481
9) Are mobbers more often mated or unmated males? In other words, is it a compliment to within pair fitness, a best of a bad job, or just everyone does it.
9) Do mated vs unmated males mob more (number of times seen in mob) BEL USED A FISHERS EXACT TEST in JMP
#Fisher's Exact test considering if males joined a mob at least once or never for mated and unmated males. Values for each category were gathered in the Excel sheet and transcribed here.
MatedMobber <- as.table(rbind(c(140, 53), c(93, 92)))
dimnames(MatedMobber) <- list(
mobber = c("mobber", "not_mobber"),
mated = c("mated", "unmated")
)
MatedMobber
mated
mobber mated unmated
mobber 140 53
not_mobber 93 92
# fisher's exact test
fisher.test(MatedMobber)
Fisher's Exact Test for Count Data
data: MatedMobber
p-value = 8.835e-06
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
1.667138 4.104847
sample estimates:
odds ratio
2.606245
#could run models that account for time the bird could have been seen if mated males were around longer and the result is the same as without taking into account the time they were observable - or maybe even more striking. The full model has a singular fit, but removing random effects solves this.
NMobs.MatedUnmatedA <- with(dat, lmer(number.obs.was.mobber ~ Mate.vs.Unmate + Julian.capture.date + (1|Band.Number)))
summary(NMobs.MatedUnmatedA)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: number.obs.was.mobber ~ Mate.vs.Unmate + Julian.capture.date + (1 | Band.Number)
REML criterion at convergence: 1990.5
Scaled residuals:
Min 1Q Median 3Q Max
-1.2833 -0.4743 -0.2484 0.1158 6.8193
Random effects:
Groups Name Variance Std.Dev.
Band.Number (Intercept) 0.9384 0.9687
Residual 10.2307 3.1986
Number of obs: 378, groups: Band.Number, 309
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 8.20936 1.55575 374.88078 5.277 2.23e-07 ***
Mate.vs.Unmateunmated -2.15506 0.35829 373.48241 -6.015 4.29e-09 ***
Julian.capture.date -0.03681 0.01016 374.26448 -3.623 0.000332 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) Mt.v.U
Mt.vs.Unmtn -0.229
Jln.cptr.dt -0.990 0.143
anova(NMobs.MatedUnmatedA)
Type III Analysis of Variance Table with Satterthwaite's method
Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
Mate.vs.Unmate 370.13 370.13 1 373.48 36.178 4.294e-09 ***
Julian.capture.date 134.28 134.28 1 374.26 13.125 0.0003315 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#qqnorm(residuals(NMobs.MatedUnmatedA))
#qqline(residuals(NMobs.MatedUnmatedA))
plot_model(NMobs.MatedUnmatedA, type = "pred")
$Mate.vs.Unmate
$Julian.capture.date
C) VICTIM PERSPECTIVE
Is plumage related to being a victim?
We removed individuals followed less than 3 times for number of observations or 30min for total number of mobbers, although this may not be needed if we add number of obs in as a covariate.
10) Do male traits predict his vulnerability to mobbing?
in many of these we use subset data for birds that were seen more than 30min total (Obs30MinDatsub) in the Total.time.min column
10) Is plumage related to the total number of mobbers that a male gets? [Fig 6a; TABLE S4]
TotMobbers.Plumage <- with(Obs30MinDatsub, glmer(Total.different.mobbers ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition + (1|Year) + (1|Band.Number), family = poisson))
boundary (singular) fit: see ?isSingular
#summary(TotMobbers.Plumage)
#anova(TotMobbers.Plumage)
#qqnorm(residuals(TotMobbers.Plumage))
#qqline(residuals(TotMobbers.Plumage))
#remove random effects for singular fit.
TotMobbers.Plumage1 <- with(Obs30MinDatsub, glmer(Total.different.mobbers ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition + (1|Band.Number), family = poisson))
boundary (singular) fit: see ?isSingular
summary(TotMobbers.Plumage1)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
Family: poisson ( log )
Formula: Total.different.mobbers ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing +
percent.nr + rump + wp.z.average + Condition + (1 | Band.Number)
AIC BIC logLik deviance df.resid
394.2 417.9 -188.1 376.2 94
Scaled residuals:
Min 1Q Median 3Q Max
-1.84978 -0.61243 -0.05731 0.46760 3.08389
Random effects:
Groups Name Variance Std.Dev.
Band.Number (Intercept) 0 0
Number of obs: 103, groups: Band.Number, 88
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 0.98191 0.06352 15.458 < 2e-16 ***
BeakSize.PC1 0.03005 0.06707 0.448 0.65414
BodySize.PC2 0.01274 0.06719 0.190 0.84956
body.color.no.wing -0.02166 0.05926 -0.365 0.71477
percent.nr 0.12880 0.07422 1.735 0.08266 .
rump -0.18397 0.07141 -2.576 0.00999 **
wp.z.average -0.10552 0.06087 -1.734 0.08300 .
Condition -0.01056 0.02491 -0.424 0.67170
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) BS.PC1 BS.PC2 bdy... prcnt. rump wp.z.v
BeakSiz.PC1 -0.013
BodySiz.PC2 -0.083 -0.129
bdy.clr.n.w -0.060 -0.106 -0.055
percent.nr -0.280 -0.022 -0.084 -0.183
rump 0.258 -0.071 0.089 0.089 -0.558
wp.z.averag 0.194 -0.063 -0.177 -0.199 -0.046 0.059
Condition 0.014 -0.158 0.175 0.026 -0.048 0.093 -0.106
optimizer (Nelder_Mead) convergence code: 0 (OK)
boundary (singular) fit: see ?isSingular
anova(TotMobbers.Plumage1)
Analysis of Variance Table
npar Sum Sq Mean Sq F value
BeakSize.PC1 1 0.0119 0.0119 0.0119
BodySize.PC2 1 0.0250 0.0250 0.0250
body.color.no.wing 1 0.1794 0.1794 0.1794
percent.nr 1 0.1133 0.1133 0.1133
rump 1 5.8982 5.8982 5.8982
wp.z.average 1 3.1991 3.1991 3.1991
Condition 1 0.1796 0.1796 0.1796
TotMobbers.Plumage2 <- with(Obs30MinDatsub, glmer(Total.different.mobbers ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition + (1|Year), family = poisson))
TotMobbers.Plumage3 <- with(Obs30MinDatsub, glm(Total.different.mobbers ~ BeakSize.PC1 + BodySize.PC2 + body.color.no.wing + percent.nr + rump + wp.z.average + Condition , family = poisson))
summary(TotMobbers.Plumage3)
Call:
glm(formula = Total.different.mobbers ~ BeakSize.PC1 + BodySize.PC2 +
body.color.no.wing + percent.nr + rump + wp.z.average + Condition,
family = poisson)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.61598 -0.65458 -0.05769 0.44618 2.54531
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 0.98191 0.06352 15.458 < 2e-16 ***
BeakSize.PC1 0.03005 0.06707 0.448 0.65414
BodySize.PC2 0.01274 0.06719 0.190 0.84956
body.color.no.wing -0.02166 0.05926 -0.365 0.71477
percent.nr 0.12880 0.07422 1.735 0.08266 .
rump -0.18397 0.07141 -2.576 0.00999 **
wp.z.average -0.10552 0.06087 -1.734 0.08300 .
Condition -0.01056 0.02491 -0.424 0.67170
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for poisson family taken to be 1)
Null deviance: 108.942 on 102 degrees of freedom
Residual deviance: 99.389 on 95 degrees of freedom
AIC: 392.16
Number of Fisher Scoring iterations: 5
anova(TotMobbers.Plumage3)
Analysis of Deviance Table
Model: poisson, link: log
Response: Total.different.mobbers
Terms added sequentially (first to last)
Df Deviance Resid. Df Resid. Dev
NULL 102 108.942
BeakSize.PC1 1 0.0152 101 108.927
BodySize.PC2 1 0.0177 100 108.909
body.color.no.wing 1 0.1316 99 108.778
percent.nr 1 0.1020 98 108.676
rump 1 5.8738 97 102.802
wp.z.average 1 3.2323 96 99.570
Condition 1 0.1806 95 99.389
#qqnorm(residuals(TotMobbers.Plumage3))
#qqline(residuals(TotMobbers.Plumage3))
#model with no random effects has best AIC
AIC(TotMobbers.Plumage)
[1] 395.9821
[1] 394.1597
[1] 393.9821
[1] 392.1597
#test for overdispersion of poisson models
dispersion_glmer(TotMobbers.Plumage2) #check for glmer that has very close to the same AIC as the best model
[1] 0.9736274
overdisp_fun(TotMobbers.Plumage2) #check for glmer that has very close to the same AIC as the best model
chisq ratio rdf p
84.4039605 0.8979145 94.0000000 0.7505219
dispersiontest(TotMobbers.Plumage3) #best model is glm
Overdispersion test
data: TotMobbers.Plumage3
z = -1.1318, p-value = 0.8711
alternative hypothesis: true dispersion is greater than 1
sample estimates:
dispersion
0.8513978
#11) Do male traits predict extra pair paternity in his own nest?
12) Do female traits predict his vulnerability to mobbing?
in many of these we use subset data for birds that were seen more than 30min total (Obs30MinDatsub) in the Total.time.min column
12a) Is female body size related to the total number of mobbers that a female gets? [Fig 6c; TABLE S6]
TotMobbers30.PlumageF <- with(Obs30MinDatsub_F, glmer(Total.different.mobbers ~ BeakSize_PC_F + BodySize_PC2_F + Condition_F + (1|Year) + (1|F_band.number), family = poisson))
#remove random effects for singular fit.
TotMobbers30.PlumageF1 <- with(Obs30MinDatsub_F, glmer(Total.different.mobbers ~ BeakSize_PC_F + BodySize_PC2_F + Condition_F + (1|F_band.number), family = poisson))
summary(TotMobbers30.PlumageF1)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
Family: poisson ( log )
Formula: Total.different.mobbers ~ BeakSize_PC_F + BodySize_PC2_F + Condition_F + (1 | F_band.number)
AIC BIC logLik deviance df.resid
423.4 437.1 -206.7 413.4 109
Scaled residuals:
Min 1Q Median 3Q Max
-1.48492 -0.59445 0.05546 0.49565 1.78853
Random effects:
Groups Name Variance Std.Dev.
F_band.number (Intercept) 0.1437 0.379
Number of obs: 114, groups: F_band.number, 74
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 0.774795 0.086088 9.000 <2e-16 ***
BeakSize_PC_F -0.041321 0.073642 -0.561 0.575
BodySize_PC2_F -0.038666 0.070125 -0.551 0.581
Condition_F 0.001005 0.023247 0.043 0.966
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) BS_PC_ BS_PC2
BeakSz_PC_F -0.035
BdySz_PC2_F 0.051 -0.005
Condition_F 0.216 0.139 0.038
anova(TotMobbers30.PlumageF1)
Analysis of Variance Table
npar Sum Sq Mean Sq F value
BeakSize_PC_F 1 0.33271 0.33271 0.3327
BodySize_PC2_F 1 0.30419 0.30419 0.3042
Condition_F 1 0.00186 0.00186 0.0019
#qqnorm(residuals(TotMobbers30.PlumageF1))
#qqline(residuals(TotMobbers30.PlumageF1))
TotMobbers30.PlumageF2 <- with(Obs30MinDatsub_F, glmer(Total.different.mobbers ~ BeakSize_PC_F + BodySize_PC2_F + Condition_F + (1|Year), family = poisson))
TotMobbers30.PlumageF3 <- with(Obs30MinDatsub_F, glm(Total.different.mobbers ~ BeakSize_PC_F +BodySize_PC2_F + Condition_F, family = poisson))
#model with female ID as a random effect has best AIC
AIC(TotMobbers30.PlumageF)
[1] 424.3245
AIC(TotMobbers30.PlumageF1)
[1] 423.4344
AIC(TotMobbers30.PlumageF2)
[1] 427.7009
AIC(TotMobbers30.PlumageF3)
[1] 428.4997
#test for overdispersion of poisson models
dispersion_glmer(TotMobbers30.PlumageF1)
[1] 1.039576
overdisp_fun(TotMobbers30.PlumageF1)
chisq ratio rdf p
68.8168473 0.6313472 109.0000000 0.9990549
#13) Do female traits predict extra pair paternity in her nest?
13) Does a female’s body size traits predict the proportion of extra pair chicks (paternity assignement at 0.15) in her nest? Using a cbind function to link number EP vs number WP in the nest as the accuracy of estimates of extra-pair paternity depends in part on number of chicks we can genotype. [Fig 6d; TABLE S7]
NEPChicks15.PlumageF <- with(dat_F, glmer(cbind(N.EP.chick.home.0.15, N.WP.chick.home.0.15) ~ BeakSize_PC_F + BodySize_PC2_F + Condition_F + (1|F_band.number) + (1|Year), family = binomial))
boundary (singular) fit: see ?isSingular
#summary(NEPChicks15.PlumageF)
#anova(NEPChicks15.PlumageF)
#qqnorm(residuals(NEPChicks15.PlumageF))
#qqline(residuals(NEPChicks15.PlumageF))
#Lowest AIC is model with just female band number
NEPChicks15.PlumageF1 <- with(dat_F, glmer(cbind(N.EP.chick.home.0.15, N.WP.chick.home.0.15) ~ BeakSize_PC_F + BodySize_PC2_F + Condition_F + (1|F_band.number), family = binomial))
summary(NEPChicks15.PlumageF1)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
Family: binomial ( logit )
Formula: cbind(N.EP.chick.home.0.15, N.WP.chick.home.0.15) ~ BeakSize_PC_F +
BodySize_PC2_F + Condition_F + (1 | F_band.number)
AIC BIC logLik deviance df.resid
329.2 343.8 -159.6 319.2 133
Scaled residuals:
Min 1Q Median 3Q Max
-1.2984 -0.5965 -0.3272 0.4779 2.3296
Random effects:
Groups Name Variance Std.Dev.
F_band.number (Intercept) 1.65 1.285
Number of obs: 138, groups: F_band.number, 117
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.43573 0.21671 -6.625 3.47e-11 ***
BeakSize_PC_F -0.22010 0.19362 -1.137 0.25565
BodySize_PC2_F -0.49828 0.18585 -2.681 0.00734 **
Condition_F 0.04845 0.05580 0.868 0.38526
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) BS_PC_ BS_PC2
BeakSz_PC_F -0.070
BdySz_PC2_F 0.161 -0.008
Condition_F 0.154 0.241 0.027
anova(NEPChicks15.PlumageF1)
Analysis of Variance Table
npar Sum Sq Mean Sq F value
BeakSize_PC_F 1 2.1684 2.1684 2.1684
BodySize_PC2_F 1 7.5802 7.5802 7.5802
Condition_F 1 0.8093 0.8093 0.8093
#qqnorm(residuals(NEPChicks15.PlumageF1))
#qqline(residuals(NEPChicks15.PlumageF1))
NEPChicks15.PlumageF2 <- with(dat_F, glmer(cbind(N.EP.chick.home.0.15, N.WP.chick.home.0.15) ~ BeakSize_PC_F + BodySize_PC2_F + Condition_F + (1|Year), family = binomial))
boundary (singular) fit: see ?isSingular
NEPChicks15.PlumageF3 <- with(dat_F, glm(cbind(N.EP.chick.home.0.15, N.WP.chick.home.0.15) ~ BeakSize_PC_F + BodySize_PC2_F + Condition_F, family = binomial))
AIC(NEPChicks15.PlumageF)
[1] 331.2105
AIC(NEPChicks15.PlumageF1)
[1] 329.2105
AIC(NEPChicks15.PlumageF2)
[1] 351.2883
AIC(NEPChicks15.PlumageF3)
[1] 349.2883
#Quick plot to see what the female body size pattern looks like.
ggplot(dat_F, aes(x=BodySize_PC2_F, y=N.EP.chick.home.0.15/(total.genotyped))) +
geom_point(alpha=.5) +
stat_smooth(method="glm", se=FALSE, method.args = list(family=binomial))
THIS IS THE END…MY FRIEND!
LS0tDQp0aXRsZTogIlIgUmVzdWx0cyBmb3IgTW9iIFBhcGVyIHdpdGggQiBMeW9uIg0Kb3V0cHV0Og0KICB3b3JkX2RvY3VtZW50Og0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICB0b2M6IHllcw0KICBodG1sX25vdGVib29rOg0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIHRvYzogeWVzDQogIHBkZl9kb2N1bWVudDoNCiAgICBmaWdfaGVpZ2h0OiA0DQogICAgZmlnX3dpZHRoOiA0DQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KICAgIGtlZXBfdGV4OiB5ZXMNCiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvYzogeWVzDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6IGNlcnVsZWFuDQogICAgdG9jOiB5ZXMNCmVkaXRvcl9vcHRpb25zOg0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KKioqQ29kZSBpbml0aWFsbHkgV3JpdHRlbiBPY3RvYmVyIDE1LCAyMDE4OyBmaW5hbGl6ZWQgb24gTWF5IDUsIDIwMjEsIGFuZCBlZGl0ZWQgZm9yIHJldmlld2VycyBvbiBNYXJjaCAzMCwgMjAyMioqKg0KVGhpcyBjb250YWlucyB0aGUgUiBzY3JpcHQgYW5kIHJlc3VsdHMgZm9yIGFuYWx5c2lzIG9mIG1vYmJpbmcgYmVoYXZpb3IgaW4gdGhlIGxhcmsgYnVudGluZyBkYXRhc2V0LiBUaGVyZSBhcmUgdGhyZWUgbWFqb3Igc2VjdGlvbnMuIDEpIEhvdyByZXBlYXRhYmxlIGFyZSBtb2ItcmVsYXRlZCBiZWhhdmlvcnMsIDIpIE1vYmJlciBwZXJzcGVjaXZlIC0gUmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRyYWl0cyBhbmQgZml0bmVzcyB3aXRoIGFjdGluZyBhcyBhIG1vYmJlciwgMykgVmljdGltIHBlcnNwZWN0aXZlIC0gUmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRyYWl0cyBhbmQgZml0ZW5zcyB3aXRoIGJlaW5nIGEgbW9iIHZpY3RpbS4NCg0KVGhpcyBhbmFseXNpcyBhY2NvbXBhbmllcyB0aGUgcGFwZXIgcHVibGlzaGVkIGluIEJlaGF2aW9yYWwgRWNvbG9neSBhbmQgU29jaW9iaW9sb2d5IGJ5IEJydWNlIEUuIEx5b24gYW5kIEFsZXhpcyBTLiBDaGFpbmUgZW50aXRsZWQgIk1vYmJpbmcgZm9yIG1hdGluZ3M6IGR5bmFtaWNzLCBwbHVtYWdlIGNvcnJlbGF0ZXMsIGFuZCBmaXRuZXNzIGltcGFjdHMgb2YgY29uc3BpY3VvdXMgZ3JvdXAgZXh0cmEtcGFpciBiZWhhdmlvcnMgaW4gdGhlIGxhcmsgYnVudGluZyIgKGNvbnRhY3Q6IGJlbHlvbkB1Y3NjLmVkdTsgRGVwYXJ0bWVudCBvZiBFY29sb2d5IGFuZCBFdm9sdXRpb25hcnkgQmlvbG9neSwgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBTYW50YSBDcnV6LCBDQSA5NTA2MCwgVVNBO1N0YXRpb24gZOKAmUVjb2xvZ2llIFRow6lvcmlxdWUgZXQgRXhww6lyaW1lbnRhbGUgZHUgQ05SUyAoVUFSMjAyOSksIDIgcm91dGUgZHUgQ05SUywgMDkyMDAgTW91bGlzLCBGcmFuY2UgYW5kIFRvdWxvdXNlIFNjaG9vbCBvZiBFY29ub21pY3MsIEluc3RpdHV0ZSBmb3IgQWR2YW5jZWQgU3R1ZGllcyBpbiBUb3Vsb3VzZSwgMzEwMDAsIFRvdWxvdXNlLCBGcmFuY2UpDQoNCg0KDQojIFIgZGV0YWlscyBhbmQgcGFja2FnZXMgdXNlZA0KICAqIEZpbGUgY3JlYXRpb24gZGF0ZTogYHIgU3lzLkRhdGUoKWANCiAgKiBgciBSLnZlcnNpb24uc3RyaW5nYA0KICANCiMjIyBMb2FkIHBhY2thZ2VzDQpDb2RlIHRvIGxvYWQgYWxsIG9mIHRoZSBwYWNrYWdlcyBsaXN0ZWQgYWJvdmUNCmBgYHtyLCAsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQojTG9hZCBwYWNrYWdlcyBhbmQgZGF0YXNldA0KbGlicmFyeShsbWU0KSAjZm9yIGdsbWVyDQpsaWJyYXJ5KHJwdFIpICNmb3IgcmVwZWF0YWJpbGl0eQ0KbGlicmFyeShsbWVyVGVzdCkgI3RvIGdldCBwLXZhbHVlcyBmcm9tIGdsbWVyLg0KbGlicmFyeShkcGx5cikgI3RvIG1hbmlwdWxhdGUgZGF0YSwgY2VudGVyIHZhcmlhYmxlcw0KbGlicmFyeShzalBsb3QpICNmb3IgcGxvdHRpbmcgb3V0cHV0IG9mIEdMTUVSDQpsaWJyYXJ5KGdncGxvdDIpICNmb3IgcGxvdHRpbmcgb3V0cHV0IG9mIEdMTUVSDQpsaWJyYXJ5KE1BU1MpICN0byBydW4gbmVnYXRpdmUgYmlvbm9taWFscyBpZiBxdWFzaXBvaXNzb24gZG9lcyBub3Qgd29yayBpbiBhIGdsbWVyDQpsaWJyYXJ5KEFFUikgI3RvIHJ1biBvdmVyZGlzcGVyc2lvbiB0ZXN0IG9uIGdsbSB1c2luZyBkaXNwZXJzaW9udGVzdChtb2RlbCkgZnVuY3Rpb24NCmxpYnJhcnkoYmxtZWNvKSAjcnVuIG92ZXJkaXNwZXJzaW9uIHRlc3Qgb24gZ2xtZXIgdXNpbmcgZGlzcGVyc2lvbl9nbG1lcihtb2RlbCkgZnVuY3Rpb24NCg0KI2NyZWF0ZSBmdW5jdGlvbiBmb2xsb3dpbmcgQk9MS0VSIGdpdGh1YiBmcm9tIE1hcmNoIDEsIDIwMjI6IGh0dHBzOi8vYmJvbGtlci5naXRodWIuaW8vbWl4ZWRtb2RlbHMtbWlzYy9nbG1tRkFRLmh0bWwjb3ZlcmRpc3BlcnNpb24NCg0Kb3ZlcmRpc3BfZnVuIDwtIGZ1bmN0aW9uKG1vZGVsKSB7DQpyZGYgPC0gZGYucmVzaWR1YWwobW9kZWwpDQpycCA8LSByZXNpZHVhbHMobW9kZWwsdHlwZT0icGVhcnNvbiIpDQpQZWFyc29uLmNoaXNxIDwtIHN1bShycF4yKQ0KcHJhdCA8LSBQZWFyc29uLmNoaXNxL3JkZg0KcHZhbCA8LSBwY2hpc3EoUGVhcnNvbi5jaGlzcSwgZGY9cmRmLCBsb3dlci50YWlsPUZBTFNFKQ0KYyhjaGlzcT1QZWFyc29uLmNoaXNxLHJhdGlvPXByYXQscmRmPXJkZixwPXB2YWwpDQp9DQoNCmxpYnJhcnkocm1hcmtkb3duKSAjdG8gb3V0cHV0IHRoZSByZXN1bHRzIGludG8gd29yZA0KDQojc2V0IG9wdGlvbnMgZm9yIG5vdCBzdG9wcGluZyBhbmFseXNlcyBmb3IgZXJyb3JzOg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yID0gRkFMU0UpDQoja25pdHI6Om9wdHNfY2h1bmskc2V0KHdhcm5pbmcgPSBGQUxTRSkNCmBgYA0KDQojIyMgTG9hZCBkYXRhc2V0LCBjYWxjdWxhdGUgcmVsYXRpdmUgZml0bmVzcywgYW5kIGNyZWF0ZSBzdWJzZXQgZGF0YWJhc2VzIGZvciBzcGVjaWZpYyBhbmFseXNlcw0KYGBge3J9DQojSW1wb3J0IG1hbGUgY2VudGVyZWQgZGF0YXNldA0KZGF0PC1yZWFkLmNzdigiQzovUHlyZW5lZXMvQWxleGlzTGFiRmlsZXMvUGFwZXJzIG4gTWFudXNjcmlwdHMvTEtCVV9Nb2JzL01hbGVzRm9yTW9ic19FeHBvcnRfMi5jc3YiLGhlYWRlcj1UKQ0KDQojY29udmVydCB0byBzdGFuZGFyZCBkYXRhLWZyYW1lIGZvcm1hdCBiZWNhdXNlIGRwbHlyIGluY2x1ZGVzIGNsYXNzZXMgKHRhYmxlcz8pIGluIHRoZSBkYXRhZnJhbWUgd2hpY2ggY2F1c2VzIHByb2JsZW1zIGluIHNvbWUgYW5hbHlzZXMNCmRhdCA8LSBhcy5kYXRhLmZyYW1lKGRhdCkNCiNzdHIoZGF0KSAjY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgc3RydWN0dXJlIGlzIGNvcnJlY3QNCg0KDQojd3JpdGUuY3N2KGRhdCwgIkM6L1B5cmVuZWVzL0FsZXhpc0xhYkZpbGVzL1BhcGVycyBuIE1hbnVzY3JpcHRzL0xLQlVfTW9icy9NYWxlc0Zvck1vYnNfRXhwb3J0X0ZpbmFsLmNzdiIpICNleHBvcnRzIGRhdGFzZXQgdG8gaGF2ZSBhIGNvcHkgaW4gY3N2IGZvcm1hdA0KDQoNCiN2aWV3IGRhdGEgaGVhZGVycw0KI25hbWVzKGRhdCkNCg0KDQoNCiNJbXBvcnQgZmVtYWxlIGNlbnRlcmVkIGRhdGFzZXQNCmRhdF9GPC1yZWFkLmNzdigiQzovUHlyZW5lZXMvQWxleGlzTGFiRmlsZXMvUGFwZXJzIG4gTWFudXNjcmlwdHMvTEtCVV9Nb2JzL0ZlbWFsZVRyYWl0c19Wc19Nb2JfRVAuY3N2IixoZWFkZXI9VCkNCg0KI2NvbnZlcnQgdG8gc3RhbmRhcmQgZGF0YS1mcmFtZSBmb3JtYXQgYmVjYXVzZSBkcGx5ciBpbmNsdWRlcyBjbGFzc2VzICh0YWJsZXM/KSBpbiB0aGUgZGF0YWZyYW1lIHdoaWNoIGNhdXNlcyBwcm9ibGVtcyBpbiBzb21lIGFuYWx5c2VzDQpkYXRfRiA8LSBhcy5kYXRhLmZyYW1lKGRhdF9GKQ0KI3N0cihkYXRfRikgI2NoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHN0cnVjdHVyZSBpcyBjb3JyZWN0DQoNCg0KI3dyaXRlLmNzdihkYXRfRiwgIkM6L1B5cmVuZWVzL0FsZXhpc0xhYkZpbGVzL1BhcGVycyBuIE1hbnVzY3JpcHRzL0xLQlVfTW9icy9NYWxlc0Zvck1vYnNfRmVtYWxlc19FeHBvcnRfRmluYWwuY3N2IikgI2V4cG9ydHMgZGF0YXNldCB0byBoYXZlIGEgY29weSBpbiBjc3YgZm9ybWF0DQoNCg0KI3ZpZXcgZGF0YSBoZWFkZXJzDQojbmFtZXMoZGF0X0YpDQpgYGANCg0KIyMjIGNyZWF0ZSBzdWJzZXR0aW5nIGRhdGFzZXRzIHVzZWQgaW4gcGFydGljdWxhciBhbmFseXNlcyAodXNpbmcgZmlsdGVyIGZyb20gZHBseXIpDQpgYGB7cn0NCiNzdWJzZXQgaW5jbHVkaW5nIG9ubHkgbWFsZXMgc2VlbiBtb2JiaW5nIGF0IGxlYXN0IG9uY2Ugb3IgdGhhdCBnb3QgRVAgZml0bmVzcyBmb3IgRVAgZml0bmVzcyBhbmFseXNlcw0KRVAgPC0gZmlsdGVyKGRhdCwgbnVtYmVyLm9icy53YXMubW9iYmVyPjAgfCBFUC5Ub3QuUC4wLjE1PjApDQoNCiMjI3N1YnNldCBvYnNlcnZhdGlvbnMgZm9yIGNhc2VzIHdpdGggYXQgbGVhc3QgMzAgbWludXRlcyBmb3IgdmljdGltIGFuYWx5c2VzDQpPYnMzME1pbkRhdHN1YiA8LSBmaWx0ZXIoZGF0LCBUb3RhbC50aW1lLm1pbj4zMCkNCg0KIyMjc3Vic2V0IGRhdGEgdG8gaW5jbHVkZSBvbmx5IG1hbGVzIHNlZW4gbW9iYmluZyBtb3JlIHRoYW4gb25lIHRpbWUNCk1vYnMxRGF0c3ViIDwtIGZpbHRlcihkYXQsIG51bWJlci5vYnMud2FzLm1vYmJlcj4xKQ0KDQojIyNzdWJzZXQgb2JzZXJ2YXRpb25zIGZvciBjYXNlcyB3aXRoIGF0IGxlYXN0IDMwIG1pbnV0ZXMgZm9yIGZlbWFsZSB2aWN0aW0gYW5hbHlzZXMNCk9iczMwTWluRGF0c3ViX0YgPC0gZmlsdGVyKGRhdF9GLCBUb3RhbC50aW1lLm1pbj49MzApDQpgYGANCg0KIyMjIENoZWNrIGRpc3RyaWJ1dGlvbnMNCmBgYHtyfSAgDQojd2l0aChkYXQsIGhpc3QobnVtYmVyLm9icy53YXMubW9iYmVyKSkNCiN3aXRoKGRhdCwgaGlzdChudW1iZXIudmljdGltcykpDQojd2l0aChkYXQsIGhpc3QoTnVtYmVyLm9ic2VydmF0aW9ucy52aWN0aW0ubW9iYmVkKSkNCiN3aXRoKGRhdCwgaGlzdChFUC5Ub3QuUC4wLjE1KSkNCiN3aXRoKGRhdCwgaGlzdChYMXN0LmVnZy5kYXRlKSkNCiN3aXRoKGRhdCwgaGlzdChKdWxpYW4uY2FwdHVyZS5kYXRlKSkNCiN3aXRoKGRhdCwgaGlzdChOLkVQLmNoaWNrLmhvbWUuMC4xNSkpDQojd2l0aChkYXQsIGhpc3QoV1AuVG90LlAuMC4xNS5mbGVkZ2UpKQ0KYGBgDQoNCg0KIyBBKSBSZXBlYXRhYmlsaXR5IG9mIGJlaGF2aW9ycyByZWxhdGVkIHRvIG1vYnMgZm9yIG1hbGVzIHdobyByZXR1cm5lZCBpbiBtdWx0aXBsZSB5ZWFycw0KDQpXZSB1c2UgdGhlIHJwclIgcGFja2FnZSB3aWNoIHJ1bnMgcmVwZWF0YWJpbGl0eSBhbmFseXNpcyBvbiBkaWZmZXJlbnQgZGlzdHJpYnV0aW9ucyBhbmQgd2hpY2ggYWxsb3dzIHlvdSB0byBmaXQgY292YXJpYXRlcyAoZS5nLiB0b3RhbCBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zKS4gQ29uZmlkZW5jZSBpbnRlcnZhbHMgYXJlIG9idGFpbmVkIGJ5IGJvb3RzdHJhcC4NCg0KVEhFU0UgUFJPRFVDRSBFUlJPUlMgKFNJTkdVTEFSIEZJVCkgSU4gUjMuNSBhbmQgbGF0ZXIgQlVUIE5PVCBJTiBSMy4zDQpBbHNvLCBhbGwgbW9iYmVyIHJlcGVhdGFiaWxpdGllcyB3ZXJlIHRyaWVkIHdpdGggYSBkYXRhc2V0IHJlc3RyaWN0ZWQgdG8gbWF0ZWQgbWFsZXMgb25seSwgYnV0IHRoaXMgcmVtb3ZlcyBhIGxhcmdlIG51bWJlciBvZiByZXBlYXQgbWFsZXMgYXMgd2VsbCBhcyBiaXJkcyBzZWVuIGluIG1vYnMgYW5kIG5vdCBtYXRlZCAoaS5lLiBhbW9uZyBpbmRpdmlkdWFsIHZhcmlhbmNlKS4gUmVzdWx0cyBjaGFuZ2UgYSBsb3QsIGJ1dCBzZWVtIGxlc3Mgcm9idXN0IGJlY2F1c2Ugb2YgdGhlIGVsaW1pbmF0aW9uIG9mIGEgbGFyZ2UgbnVtYmVyIG9mIHJldHVybmluZyBpbmRpdmlkdWFscy4gQXMgc3VjaCwgdGhlIGZpbmFsIGFuYWx5c2lzIGluY2x1ZGVzIGFsbCBtYWxlcyBvYnNlcnZlZCBtb3JlIHRoYW4gb25jZSBvbiBzaXRlIChub3QgaW5jbHVkaW5nIGNhcHR1cmUpLg0KDQojIyAxKSBSZXBlYXRhYmlsaXR5IG9mIHRoZSBudW1iZXIgb2YgbW9icyBhbiBpbmRpdmlkdWFsIHBhcnRpY2lwYXRlZCBpbi4gKHBvaXNzb24gZGlzdHJpYnV0aW9uKSAoaW5jbHVkZXMgemVyb3MpDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KbW9iTnJlcCA8LSB3aXRoKGRhdCwgcnB0UG9pc3NvbihudW1iZXIub2JzLndhcy5tb2JiZXIgfiAoMXxCYW5kLk51bWJlciksIGdybmFtZT1jKCJCYW5kLk51bWJlciIpLCBkYXQsIG5ib290PTEwMDAsIG5wZXJtdXQ9MCkpDQptb2JOcmVwDQpgYGANCg0KIyMgMikgUmVwZWF0YWJpbGl0eSBvZiB0aGUgbnVtYmVyIG9mIG1vYiB2aWN0aW1zLiAocG9pc3NvbikNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KTlZpY3RpbXNSZXAgPC0gd2l0aChkYXQsIHJwdFBvaXNzb24obnVtYmVyLnZpY3RpbXMgfiAoMXxCYW5kLk51bWJlciksIGdybmFtZT1jKCJCYW5kLk51bWJlciIpLCBkYXQsIG5ib290PTEwMDAsIG5wZXJtdXQ9MCkpDQpOVmljdGltc1JlcA0KYGBgDQoNCg0KDQoNCg0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCkZvciBhbmFseXNlcyB0aGF0IGZvY3VzIG9uIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtYWxlIHRyYWl0cyBhbmQgYmVoYXZpb3JzIG9yIGZpdG5lc3MgbWVhc3VyZXM6DQpBbGwgbWFsZSB0cmFpdHMgYXJlIHN0YW5kYXJkaXplZCB2YXJpYWJsZXMgKGkuZS4gbWVhbj0wLCBzZD0xKS4gT3RoZXIgdmFyaWFibGVzIGxpa2UgZGF0ZSwgbnVtYmVyIG9mIG1vYnMgYXR0ZW5kZWQsIG51bWJlciBvZiB2aWN0aW1zLCBldGMuLi4gYXJlIG5vdCBzdGFuZGFyZGl6ZWQgYXMgdGhlIGdvYWwgd2FzIG5vdCBuZWNlc3NhcmlseSB0byBsb29rIGF0IHNlbGVjdGlvbiBncmFkaWVudHMgcGVyIHNlLg0KDQpNdWx0aXBsZSByZWdyZXNzaW9ucyBpbmNsdWRlZCBtYWxlIElEIGFzIGEgcmFuZG9tIGVmZmVjdCAoc2luY2Ugc29tZSBtYWxlcyByZXR1cm4pIGFuZCB5ZWFyIGFzIGEgcmFuZG9tIGVmZmVjdCAoc2luY2UgeWVhcnMgbWF5IGRpZmZlciBpbiB0aGUgb2NjdXJyZW5jZSBhbmQgaW50ZW5zaXR5IG9mIG1vYnMpLiBIb3dldmVyIGluIHNvbWUgY2FzZXMgcmFuZG9tIGVmZmVjdHMgY29udHJpYnV0ZWQgbGl0dGxlIHRvIHRoZSBvdmVyYWxsIG1vZGVsIGFuZCBjb3VsZCBjYXVzZSBzaW5ndWxhcml0aWVzIGluIHRoZSBtb2RlbHMgKHN1Z2dlc3RpdmUgb2Ygb3ZlcnBhcmFtZXRlcml6YXRpb24pLiBXZSB0aGVyZWZvcmUgY29tcGFyZWQgbW9kZWxzIHdpdGggYm90aCByYW5kb20gZWZmZWN0cywgd2l0aCBhIHNpbmdsZSByYW5kb20gZWZmZWN0LCBhbmQgd2l0aCBubyByYW5kb20gZWZmZWN0cyBhbmQgdXNlZCB0aGUgbW9kZWwgd2l0aCB0aGUgbG93ZXN0IEFJQyAoaW4gYWxsIGNhc2VzIGRlbHRhLUFJQz4yKSBhcyBzdWdnZXN0ZWQgYnkgWnV1ciBldCBhbCAyMDA5LiBXZSB1c2UgdGhpcyBzaW1wbGlmaWVkIG1vZGVsIGluIGVhY2ggYW5hbHlzaXMgYXMgdGhlIGZpbmFsIG1vZGVsLiBJbiB0aGUgbW9kZWwgb3V0cHV0LCB5b3Ugd2lsbCBmaW5kIHRoZSBBSUMgb2YgZWFjaCBtb2RlbCBhdCB0aGUgYm90dG9tIGFuZCB0aGUgcmVzdWx0cyBwcmludGVkIGFyZSBvbmx5IGZvciB0aGUgYmVzdCBtb2RlbC4NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQoNCg0KIyBCKSBNT0JCRVIgUEVSU1BFQ1RJVkUNCkRvIHBsdW1hZ2UgYW5kIG1vcnBob2xvZ3kgcmVsYXRlIHRvIG1vYmJpbmcgYmVoYXZpb3IgYW5kIGZpdG5lc3M/IA0KDQoNCiMgMykgRG9lcyBwbHVtYWdlIGNvbG9yIG9mIGEgbW9iYmVyIHJlbGF0ZSB0byBoaXMgbW9iYmluZyBiZWhhdmlvcj8NCg0KIyMgMykgRG9lcyBtYWxlIHBsdW1hZ2UgcmVsYXRlIHRvIHRoZSBudW1iZXIgb2YgdmljaXRpbXMgaGUgbW9icz8gW0ZpZyAyYjsgVEFCTEUgUzJdDQpgYGB7ciwgd2FybmluZz1UUlVFLCBtZXNzYWdlPVRSVUV9DQpOVmljdGltc1BsdW1hZ2UgPC0gd2l0aChkYXQsIGdsbWVyKG51bWJlci52aWN0aW1zIH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uICArICgxfFllYXIpICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCnN1bW1hcnkoTlZpY3RpbXNQbHVtYWdlKQ0KYW5vdmEoTlZpY3RpbXNQbHVtYWdlKQ0KI2NoZWNrIHJlc2lkdWFsIGRpc3RyaWJ1dGlvbg0KI3Fxbm9ybShyZXNpZHVhbHMoTlZpY3RpbXNQbHVtYWdlKSkNCiNxcWxpbmUocmVzaWR1YWxzKE5WaWN0aW1zUGx1bWFnZSkpDQoNCiNyZW1vdmUgcmFuZG9tIGVmZmVjdHMNCk5WaWN0aW1zUGx1bWFnZTEgPC0gd2l0aChkYXQsIGdsbWVyKG51bWJlci52aWN0aW1zIH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uICArICgxfEJhbmQuTnVtYmVyKSwgZmFtaWx5ID0gcG9pc3NvbikpDQoNCk5WaWN0aW1zUGx1bWFnZTIgPC0gd2l0aChkYXQsIGdsbWVyKG51bWJlci52aWN0aW1zIH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uICArICgxfFllYXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCg0KTlZpY3RpbXNQbHVtYWdlMyA8LSB3aXRoKGRhdCwgZ2xtKG51bWJlci52aWN0aW1zIH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uLCBmYW1pbHkgPSBwb2lzc29uKSkNCg0KI2NvbXBhcmUgQUlDIG9mIG1vZGVscyB3aXRoIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2YgcmFuZG9tIGVmZmVjdHMNCkFJQyhOVmljdGltc1BsdW1hZ2UpDQpBSUMoTlZpY3RpbXNQbHVtYWdlMSkNCkFJQyhOVmljdGltc1BsdW1hZ2UyKQ0KQUlDKE5WaWN0aW1zUGx1bWFnZTMpDQoNCiN0ZXN0IGZvciBvdmVyZGlzcGVyc2lvbiBvZiBwb2lzc29uIG1vZGVscw0KZGlzcGVyc2lvbl9nbG1lcihOVmljdGltc1BsdW1hZ2UpDQpvdmVyZGlzcF9mdW4oTlZpY3RpbXNQbHVtYWdlKQ0KYGBgDQoNCg0KDQoNCiMgNCkgQXJlIHRoZSBudW1iZXIgb2YgdGltZXMgYSBiaXJkIHdhcyBzZWVuIG1vYmluZyBkZXBlbmQgb24gdGhpbmdzIGxpa2UgaG93IHByZXNlbnQgdGhleSB3ZXJlIG9uIHRoZSBzaXRlPw0KDQojIyA0YSkgRG8gbnVtYmVyIG9mIHZpY3RpbXMgaW5jcmVhc2Ugd2l0aCBudW1iZXIgb2YgbW9icz8gQW5hbHlzaXMgc2hvd24gaW5jbHVkZXMgYmlyZHMgc2VlbiBldmVuIGlmIG5vdCBzZWVuIG1vYmJpbmcuDQpgYGB7ciwgd2FybmluZz1UUlVFLCBtZXNzYWdlPVRSVUV9DQojU3BlYXJtYW4gYW5hbHlzaXMgd2FzIHVzZWQgaW4gdGhlIG1hbnVzY3JpcHQgYXMgdGhlIHJobyB2YWx1ZSBpcyBtb3JlIGludHVpdGl2ZSB0aGFuIGVzdGltYXRlcyBmcm9tIHRoZSBHTE1NOyBhbGwgYW5hbHlzZXMgc2hvdyB0aGUgc2FtZSBwYXR0ZXJuLCB0aG91Z2guDQp3aXRoKGRhdCwgY29yLnRlc3QobnVtYmVyLnZpY3RpbXMsIG51bWJlci5vYnMud2FzLm1vYmJlciwgbWV0aG9kID0gYygic3BlYXJtYW4iKSkpIA0KYGBgDQoNCiMjIDRiKSBEbyBudW1iZXIgb2YgdmljdGltcyBpbmNyZWFzZSB3aXRoIG51bWJlciBvZiBtb2JzPyBBbmFseXNpcyBvbmx5IGluY2x1ZGluZyBiaXJkcyBzZWVuIG1vYmJpbmcgYXQgbGVhc3Qgb25jZS4NCmBgYHtyLCB3YXJuaW5nPVRSVUUsIG1lc3NhZ2U9VFJVRX0NCiNTcGVhcm1hbiBhbmFseXNpcyB3YXMgdXNlZCBpbiB0aGUgbWFudXNjcmlwdCBhcyB0aGUgcmhvIHZhbHVlIGlzIG1vcmUgaW50dWl0aXZlIHRoYW4gZXN0aW1hdGVzIGZyb20gdGhlIEdMTU07IGFsbCBhbmFseXNlcyBzaG93IHRoZSBzYW1lIHBhdHRlcm4sIHRob3VnaC4NCndpdGgoTW9iczFEYXRzdWIsIGNvci50ZXN0KG51bWJlci52aWN0aW1zLCBudW1iZXIub2JzLndhcy5tb2JiZXIsIG1ldGhvZCA9IGMoInNwZWFybWFuIikpKQ0KYGBgDQoNCiMjIDRjKSBEb2VzIG5lc3RpbmcgZGF0ZSBpbmZsdWVuY2UgbW9iIG9ic2VydmF0aW9ucyAtIG1heWJlIGJlY2F1c2UgYmlyZHMgb25seSBtb2IgYWZ0ZXIgdGhleSBnZXQgdGhlaXIgb3duIG5lc3Q/DQpgYGB7ciwgd2FybmluZz1UUlVFLCBtZXNzYWdlPVRSVUV9DQojU3BlYXJtYW4gYW5hbHlzaXMgd2FzIHVzZWQgaW4gdGhlIG1hbnVzY3JpcHQgYXMgdGhlIHJobyB2YWx1ZSBpcyBtb3JlIGludHVpdGl2ZSB0aGFuIGVzdGltYXRlcyBmcm9tIHRoZSBHTE1NOyBhbGwgYW5hbHlzZXMgc2hvdyB0aGUgc2FtZSBwYXR0ZXJuLCB0aG91Z2guDQp3aXRoKGRhdCwgY29yLnRlc3QobnVtYmVyLm9icy53YXMubW9iYmVyLCBYMXN0LmVnZy5kYXRlLCBtZXRob2QgPSBjKCJzcGVhcm1hbiIpKSkNCmBgYA0KDQojIyA0ZCkgRG9lcyBudW1iZXIgb2YgbW9iIHZpY3RpbXMgcHJlZGljdCBFUCBjaGlja3MgKDAuMTUgbGV2ZWwpDQpgYGB7ciwgd2FybmluZz1UUlVFLCBtZXNzYWdlPVRSVUUsIHJlc3VsdHM9ImhpZGUifQ0KI1NwZWFybWFuIGFuYWx5c2lzIHdhcyB1c2VkIGluIHRoZSBtYW51c2NyaXB0IGFzIHRoZSByaG8gdmFsdWUgaXMgbW9yZSBpbnR1aXRpdmUgdGhhbiBlc3RpbWF0ZXMgZnJvbSB0aGUgR0xNTTsgYWxsIGFuYWx5c2VzIHNob3cgdGhlIHNhbWUgcGF0dGVybiwgdGhvdWdoLg0Kd2l0aChkYXQsIGNvci50ZXN0KEVQLlRvdC5QLjAuMTUsIG51bWJlci52aWN0aW1zLCBtZXRob2QgPSBjKCJzcGVhcm1hbiIpKSkNCmBgYA0KDQoNCg0KIyA1KSBEb2VzIHBsdW1hZ2UgcHJlZGljdCBFUCBmaXRuZXNzICgjRVAgY2hpY2tzIHNpcmVkOyAjRVAgbmVzdHMpDQoNCiMjIDUpIERvZXMgcGx1bWFnZSBwcmVkaWN0IHRoZSBudW1iZXIgb2YgRVAgY2hpY2tzIChwYXRlcm5pdHkgYXNzaWdubWVudCBhdCAwLjE1IGxldmVsKSAgW0ZpZzJhOyBUQUJMRSBTMV0NCmBgYHtyLCB3YXJuaW5nPVRSVUUsIG1lc3NhZ2U9VFJVRX0NCkVQQ2hpY2tzMTUuUGx1bWFnZSA8LSB3aXRoKGRhdCwgZ2xtZXIoRVAuVG90LlAuMC4xNSB+ICBCZWFrU2l6ZS5QQzEgKyBCb2R5U2l6ZS5QQzIgKyBib2R5LmNvbG9yLm5vLndpbmcgKyBwZXJjZW50Lm5yICsgcnVtcCArIHdwLnouYXZlcmFnZSArIENvbmRpdGlvbiArICgxfFllYXIpICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCiNzdW1tYXJ5KEVQQ2hpY2tzMTUuUGx1bWFnZSkNCiNhbm92YShFUENoaWNrczE1LlBsdW1hZ2UpDQojcXFub3JtKHJlc2lkdWFscyhFUENoaWNrczE1LlBsdW1hZ2UpKQ0KI3FxbGluZShyZXNpZHVhbHMoRVBDaGlja3MxNS5QbHVtYWdlKSkNCg0KI01vZGVsIGRvZXMgbm90IGNvbnZlcmdlDQoNCiN3aXRob3V0IHllYXIgLSBiZXN0IG1vZGVsDQpFUENoaWNrczE1LlBsdW1hZ2VBIDwtIHdpdGgoZGF0LCBnbG1lcihFUC5Ub3QuUC4wLjE1IH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uICArICgxfEJhbmQuTnVtYmVyKSwgZmFtaWx5ID0gcG9pc3NvbikpDQpzdW1tYXJ5KEVQQ2hpY2tzMTUuUGx1bWFnZUEpDQphbm92YShFUENoaWNrczE1LlBsdW1hZ2VBKQ0KI3Fxbm9ybShyZXNpZHVhbHMoRVBDaGlja3MxNS5QbHVtYWdlQSkpDQojcXFsaW5lKHJlc2lkdWFscyhFUENoaWNrczE1LlBsdW1hZ2VBKSkNCg0KI3dpdGhvdXQgSUQNCkVQQ2hpY2tzMTUuUGx1bWFnZUIgPC0gd2l0aChkYXQsIGdsbWVyKEVQLlRvdC5QLjAuMTUgfiAgQmVha1NpemUuUEMxICsgQm9keVNpemUuUEMyICsgYm9keS5jb2xvci5uby53aW5nICsgcGVyY2VudC5uciArIHJ1bXAgKyB3cC56LmF2ZXJhZ2UgKyBDb25kaXRpb24gICsgKDF8WWVhciksIGZhbWlseSA9IHBvaXNzb24pKQ0KDQojTm8gcmFuZG9tIGVmZmVjdHMNCkVQQ2hpY2tzMTUuUGx1bWFnZUMgPC0gd2l0aChkYXQsIGdsbShFUC5Ub3QuUC4wLjE1IH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uLCBmYW1pbHkgPSBwb2lzc29uKSkNCg0KQUlDKEVQQ2hpY2tzMTUuUGx1bWFnZSkNCkFJQyhFUENoaWNrczE1LlBsdW1hZ2VBKQ0KQUlDKEVQQ2hpY2tzMTUuUGx1bWFnZUIpDQpBSUMoRVBDaGlja3MxNS5QbHVtYWdlQykNCg0KI3Rlc3QgZm9yIG92ZXJkaXNwZXJzaW9uIG9mIHBvaXNzb24gbW9kZWxzDQpkaXNwZXJzaW9uX2dsbWVyKEVQQ2hpY2tzMTUuUGx1bWFnZUEpDQpvdmVyZGlzcF9mdW4oRVBDaGlja3MxNS5QbHVtYWdlQSkNCmBgYA0KDQoNCiMgNikgRG9lcyBwbHVtYWdlIHByZWRpY3QgRVAgZml0bmVzcyBhYm92ZSBpdHMgZWZmZWN0cyBvbiBtb2JiaW5nLiBTbyBhZGQgbW9iYmluZyBlZmZvcnQgYXMgY292YXJpYXRlDQpjb3ZhcmlhdGVzIGFyZSBudW1iZXIgb2JzIGZvciB0b3RhbCBFUFkgYW5kIG51bWJlciB2aWN0aW1zIGZvciB0b3RhbCBFUE5lc3RzIw0KDQojIyA2KSBEb2VzIHBsdW1hZ2UgaW1wYWN0IEVQIENoaWNrcyAocGF0ZXJuaXR5IGFzc2lnbmVtZW50IGF0IDAuMTUgbGV2ZWwpIHdoZW4gY29udHJvbGxpbmcgZm9yIGVmZm9ydD8gW0ZpZyAyYzsgVEFCTEUgUzNdDQpgYGB7ciwgd2FybmluZz1UUlVFLCBtZXNzYWdlPVRSVUV9DQpFUENoaWNrczE1LlBsdW1hZ2UuRWZmb3J0IDwtIHdpdGgoZGF0LCBnbG1lcihFUC5Ub3QuUC4wLjE1IH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uICArIG51bWJlci5vYnMud2FzLm1vYmJlciArICgxfFllYXIpICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCiNzdW1tYXJ5KEVQQ2hpY2tzMTUuUGx1bWFnZS5FZmZvcnQpDQojYW5vdmEoRVBDaGlja3MxNS5QbHVtYWdlLkVmZm9ydCkNCiNxcW5vcm0ocmVzaWR1YWxzKEVQQ2hpY2tzMTUuUGx1bWFnZS5FZmZvcnQpKQ0KI3FxbGluZShyZXNpZHVhbHMoRVBDaGlja3MxNS5QbHVtYWdlLkVmZm9ydCkpDQoNCg0KRVBDaGlja3MxNS5QbHVtYWdlLkVmZm9ydDEgPC0gd2l0aChkYXQsIGdsbWVyKEVQLlRvdC5QLjAuMTUgfiAgQmVha1NpemUuUEMxICsgQm9keVNpemUuUEMyICsgYm9keS5jb2xvci5uby53aW5nICsgcGVyY2VudC5uciArIHJ1bXAgKyB3cC56LmF2ZXJhZ2UgKyBDb25kaXRpb24gICsgbnVtYmVyLm9icy53YXMubW9iYmVyICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCnN1bW1hcnkoRVBDaGlja3MxNS5QbHVtYWdlLkVmZm9ydDEpDQphbm92YShFUENoaWNrczE1LlBsdW1hZ2UuRWZmb3J0MSkNCiNxcW5vcm0ocmVzaWR1YWxzKEVQQ2hpY2tzMTUuUGx1bWFnZS5FZmZvcnQxKSkNCiNxcWxpbmUocmVzaWR1YWxzKEVQQ2hpY2tzMTUuUGx1bWFnZS5FZmZvcnQxKSkNCg0KRVBDaGlja3MxNS5QbHVtYWdlLkVmZm9ydDIgPC0gd2l0aChkYXQsIGdsbWVyKEVQLlRvdC5QLjAuMTUgfiAgQmVha1NpemUuUEMxICsgQm9keVNpemUuUEMyICsgYm9keS5jb2xvci5uby53aW5nICsgcGVyY2VudC5uciArIHJ1bXAgKyB3cC56LmF2ZXJhZ2UgKyBDb25kaXRpb24gICsgbnVtYmVyLm9icy53YXMubW9iYmVyICsgKDF8WWVhciksIGZhbWlseSA9IHBvaXNzb24pKQ0KDQpFUENoaWNrczE1LlBsdW1hZ2UuRWZmb3J0MyA8LSB3aXRoKGRhdCwgZ2xtKEVQLlRvdC5QLjAuMTUgfiAgQmVha1NpemUuUEMxICsgQm9keVNpemUuUEMyICsgYm9keS5jb2xvci5uby53aW5nICsgcGVyY2VudC5uciArIHJ1bXAgKyB3cC56LmF2ZXJhZ2UgKyBDb25kaXRpb24gICsgbnVtYmVyLm9icy53YXMubW9iYmVyLCBmYW1pbHkgPSBwb2lzc29uKSkNCg0KI1dpdGhvdXQgeWVhciBpcyBiZXN0IG1vZGVsDQoNCkFJQyhFUENoaWNrczE1LlBsdW1hZ2UuRWZmb3J0KQ0KQUlDKEVQQ2hpY2tzMTUuUGx1bWFnZS5FZmZvcnQxKQ0KQUlDKEVQQ2hpY2tzMTUuUGx1bWFnZS5FZmZvcnQyKQ0KQUlDKEVQQ2hpY2tzMTUuUGx1bWFnZS5FZmZvcnQzKQ0KDQojdGVzdCBmb3Igb3ZlcmRpc3BlcnNpb24gb2YgcG9pc3NvbiBtb2RlbHMNCmRpc3BlcnNpb25fZ2xtZXIoRVBDaGlja3MxNS5QbHVtYWdlLkVmZm9ydDEpDQpvdmVyZGlzcF9mdW4oRVBDaGlja3MxNS5QbHVtYWdlLkVmZm9ydDEpDQpgYGANCg0KDQoNCg0KIyA3KSBBcmUgdGhlcmUgY29zdHMgb2YgbW9iYmluZyB2aWEgdHJhZGUtb2ZmcyBiZXR3ZWVuIG1vYmJpbmcgZWZmb3J0IGFuZCBpbmNyZWFzZWQgZXh0cmEtcGFpciB5b3VuZyBhdCBob21lPw0KDQojIyMjIDcpIEFyZSB0aGVyZSB0cmFkZS1vZmZzIGJldHdlZW4gbnVtYmVyIG9mIG1vYnMgYW5kIHByb3BvcnRpb24gb2YgRVAgY2hpY2tzIGF0IGhvbWUgKHBhdGVybml0eSBhc3NpZ25lbWVudCBhdCAwLjE1KT8gDQojIyNVc2luZyBwcm9wb3J0aW9uIG9mIEVQIGNoaWNrcyBpbiBvd24gbmVzdCB3aXRoICJjYmluZChOLkVQLCBOLldQKSIgdG8gYWNjb3VudCBmb3IgZGlmZmVyZW5jZXMgaW4gbnVtYmVycyBvZiBjaGlja3Mgb2JzZXJ2ZWQgcGVyIG5lc3Qgc2luY2UgYSBsYXJnZXIgc2FtcGxlIGdpdmVzIGEgbW9yZSByZWxpYWJsZSBwcm9wb3J0aW9uIGdpdmVzIHRoZSBzYW1lIHJlc3VsdC4NCg0KYGBge3IsIHdhcm5pbmc9VFJVRSwgbWVzc2FnZT1UUlVFfQ0KTk1vYnMuTmVzdEVQQ2hpY2tzMTUgPC0gd2l0aChkYXQsIGdsbWVyKGNiaW5kKE4uRVAuY2hpY2suaG9tZS4wLjE1LCB0b3RhbC5nZW5vdHlwZWQtTi5FUC5jaGljay5ob21lLjAuMTUpIH4gbnVtYmVyLm9icy53YXMubW9iYmVyICsgKDF8WWVhcikgKyAoMXxCYW5kLk51bWJlciksIGZhbWlseSA9IGJpbm9taWFsKSkNCiNzdW1tYXJ5KE5Nb2JzLk5lc3RFUENoaWNrczE1KQ0KI2Fub3ZhKE5Nb2JzLk5lc3RFUENoaWNrczE1KQ0KI3Fxbm9ybShyZXNpZHVhbHMoTk1vYnMuTmVzdEVQQ2hpY2tzMTUpKQ0KI3FxbGluZShyZXNpZHVhbHMoTk1vYnMuTmVzdEVQQ2hpY2tzMTUpKQ0KDQojcmVtb3ZlIHJhbmRvbSBlZmZlY3RzDQpOTW9icy5OZXN0RVBDaGlja3MxNWEgPC0gd2l0aChkYXQsIGdsbWVyKGNiaW5kKE4uRVAuY2hpY2suaG9tZS4wLjE1LCB0b3RhbC5nZW5vdHlwZWQtTi5FUC5jaGljay5ob21lLjAuMTUpIH4gbnVtYmVyLm9icy53YXMubW9iYmVyICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBiaW5vbWlhbCkpDQpzdW1tYXJ5KE5Nb2JzLk5lc3RFUENoaWNrczE1YSkNCmFub3ZhKE5Nb2JzLk5lc3RFUENoaWNrczE1YSkNCg0KTk1vYnMuTmVzdEVQQ2hpY2tzMTViIDwtIHdpdGgoZGF0LCBnbG1lcihjYmluZChOLkVQLmNoaWNrLmhvbWUuMC4xNSwgdG90YWwuZ2Vub3R5cGVkLU4uRVAuY2hpY2suaG9tZS4wLjE1KSB+IG51bWJlci5vYnMud2FzLm1vYmJlciArICgxfFllYXIpLCBmYW1pbHkgPSBiaW5vbWlhbCkpDQoNCk5Nb2JzLk5lc3RFUENoaWNrczE1YyA8LSB3aXRoKGRhdCwgZ2xtKGNiaW5kKE4uRVAuY2hpY2suaG9tZS4wLjE1LCB0b3RhbC5nZW5vdHlwZWQtTi5FUC5jaGljay5ob21lLjAuMTUpIH4gbnVtYmVyLm9icy53YXMubW9iYmVyLCBmYW1pbHkgPSBiaW5vbWlhbCkpDQoNCiNxcW5vcm0ocmVzaWR1YWxzKE5Nb2JzLk5lc3RFUENoaWNrczE1YykpDQojcXFsaW5lKHJlc2lkdWFscyhOTW9icy5OZXN0RVBDaGlja3MxNWMpKQ0KDQoNCiNtb2RlbCB3aXRoIG9ubHkgbWFsZSBJRCBpcyBiZXN0IGFuZCBubyBsb25nZXIgaGFzIGEgc2luZ3VsYXJpdHkNCg0KQUlDKE5Nb2JzLk5lc3RFUENoaWNrczE1KQ0KQUlDKE5Nb2JzLk5lc3RFUENoaWNrczE1YSkNCkFJQyhOTW9icy5OZXN0RVBDaGlja3MxNWIpDQpBSUMoTk1vYnMuTmVzdEVQQ2hpY2tzMTVjKQ0KYGBgDQoNCg0KIyA4KSBBcmUgdGhlcmUgY29zdHMgb2YgbW9iYmluZyB2aWEgdHJhZGUtb2ZmcyBiZXR3ZWVuIG1vYmJpbmcgZWZmb3J0IGFuZCB0aGUgbnVtYmVyIG9mIHdpdGhpbiBwYWlyIGNoaWNrcyBmbGVkZ2VkIGF0IGhvbWU/DQpGb2N1c2VkIG9uIG51bWJlciBmbGVkZ2VkIGFzIHRoZSBjb3N0IG1heSBub3QganVzdCBiZSBpbiB0ZXJtcyBvZiBwcm9wb3J0aW9uIHNpcmVkLCBidXQgYWxzbyBvdGhlciBmb3JtcyBvZiBwYXJlbnRhbCBjYXJlLiBEaWQgbm90IGFjY291bnQgZm9yIG51bWJlciBvZiBjaGlja3MgaW4gbmVzdCAtIGJ1dCB3ZSBkb24ndCB3YW50IGEgcHJvcG9ydGlvbiBvZiBjaGlja3MgdGhhdCBhcmUgd2l0aGluIHBhaXIgKGFuYWx5c2lzIGFib3ZlKQ0KDQojIyA4KSBJcyB0aGVyZSBhIHRyYWRlLW9mZiBiZXR3ZWVuIG1vYmJpbmcgZWZmb3J0IGFuZCBudW1iZXIgb2Ygd2l0aGluIHBhaXIgY2hpY2tzIHRoYXQgYWN0dWFsbHkgZmxlZGdlZCAocGF0ZXJuaXR5IGFzc2lnbmVtZW50IGF0IDAuMTUpDQpgYGB7ciwgd2FybmluZz1UUlVFLCBtZXNzYWdlPVRSVUV9DQpOTW9icy5OdW1iZXJPd25XUENoaWNrczE1IDwtIHdpdGgoZGF0LCBnbG1lcihXUC5Ub3QuUC4wLjE1LmZsZWRnZSB+IG51bWJlci5vYnMud2FzLm1vYmJlciArICgxfFllYXIpICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCiNzdW1tYXJ5KE5Nb2JzLk51bWJlck93bldQQ2hpY2tzMTUpDQojYW5vdmEoTk1vYnMuTnVtYmVyT3duV1BDaGlja3MxNSkNCiNxcW5vcm0ocmVzaWR1YWxzKE5Nb2JzLk51bWJlck93bldQQ2hpY2tzMTUpKQ0KI3FxbGluZShyZXNpZHVhbHMoTk1vYnMuTnVtYmVyT3duV1BDaGlja3MxNSkpDQoNCiNyZW1vdmUgcmFuZG9tIGVmZmVjdHMNCk5Nb2JzLk51bWJlck93bldQQ2hpY2tzMTVhIDwtIHdpdGgoZGF0LCBnbG1lcihXUC5Ub3QuUC4wLjE1LmZsZWRnZSB+IG51bWJlci5vYnMud2FzLm1vYmJlciArICgxfEJhbmQuTnVtYmVyKSwgZmFtaWx5ID0gcG9pc3NvbikpDQpzdW1tYXJ5KE5Nb2JzLk51bWJlck93bldQQ2hpY2tzMTVhKQ0KYW5vdmEoTk1vYnMuTnVtYmVyT3duV1BDaGlja3MxNWEpDQojcXFub3JtKHJlc2lkdWFscyhOTW9icy5OdW1iZXJPd25XUENoaWNrczE1YSkpDQojcXFsaW5lKHJlc2lkdWFscyhOTW9icy5OdW1iZXJPd25XUENoaWNrczE1YSkpDQoNCk5Nb2JzLk51bWJlck93bldQQ2hpY2tzMTViIDwtIHdpdGgoZGF0LCBnbG1lcihXUC5Ub3QuUC4wLjE1LmZsZWRnZSB+IG51bWJlci5vYnMud2FzLm1vYmJlciArICgxfFllYXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCg0KTk1vYnMuTnVtYmVyT3duV1BDaGlja3MxNWMgPC0gd2l0aChkYXQsIGdsbShXUC5Ub3QuUC4wLjE1LmZsZWRnZSB+IG51bWJlci5vYnMud2FzLm1vYmJlciwgZmFtaWx5ID0gcG9pc3NvbikpDQoNCiNtb2RlbCB3aXRob3V0IHllYXIgaXMgYmVzdA0KDQpBSUMoTk1vYnMuTnVtYmVyT3duV1BDaGlja3MxNSkNCkFJQyhOTW9icy5OdW1iZXJPd25XUENoaWNrczE1YSkNCkFJQyhOTW9icy5OdW1iZXJPd25XUENoaWNrczE1YikNCkFJQyhOTW9icy5OdW1iZXJPd25XUENoaWNrczE1YykNCg0KI3Rlc3QgZm9yIG92ZXJkaXNwZXJzaW9uIG9mIHBvaXNzb24gbW9kZWxzDQpkaXNwZXJzaW9uX2dsbWVyKE5Nb2JzLk51bWJlck93bldQQ2hpY2tzMTVhKQ0Kb3ZlcmRpc3BfZnVuKE5Nb2JzLk51bWJlck93bldQQ2hpY2tzMTVhKQ0KYGBgDQoNCg0KIyA5KSBBcmUgbW9iYmVycyBtb3JlIG9mdGVuIG1hdGVkIG9yIHVubWF0ZWQgbWFsZXM/IEluIG90aGVyIHdvcmRzLCBpcyBpdCBhIGNvbXBsaW1lbnQgdG8gd2l0aGluIHBhaXIgZml0bmVzcywgYSBiZXN0IG9mIGEgYmFkIGpvYiwgb3IganVzdCBldmVyeW9uZSBkb2VzIGl0Lg0KDQojIyA5KSBEbyBtYXRlZCB2cyB1bm1hdGVkIG1hbGVzIG1vYiBtb3JlIChudW1iZXIgb2YgdGltZXMgc2VlbiBpbiBtb2IpIEJFTCBVU0VEIEEgRklTSEVSUyBFWEFDVCBURVNUIGluIEpNUA0KYGBge3IsIHdhcm5pbmc9VFJVRSwgbWVzc2FnZT1UUlVFfQ0KI0Zpc2hlcidzIEV4YWN0IHRlc3QgY29uc2lkZXJpbmcgaWYgbWFsZXMgam9pbmVkIGEgbW9iIGF0IGxlYXN0IG9uY2Ugb3IgbmV2ZXIgZm9yIG1hdGVkIGFuZCB1bm1hdGVkIG1hbGVzLiBWYWx1ZXMgZm9yIGVhY2ggY2F0ZWdvcnkgd2VyZSBnYXRoZXJlZCBpbiB0aGUgRXhjZWwgc2hlZXQgYW5kIHRyYW5zY3JpYmVkIGhlcmUuDQpNYXRlZE1vYmJlciA8LSBhcy50YWJsZShyYmluZChjKDE0MCwgNTMpLCBjKDkzLCA5MikpKQ0KZGltbmFtZXMoTWF0ZWRNb2JiZXIpIDwtIGxpc3QoDQogIG1vYmJlciA9IGMoIm1vYmJlciIsICJub3RfbW9iYmVyIiksDQogIG1hdGVkID0gYygibWF0ZWQiLCAidW5tYXRlZCIpDQopDQpNYXRlZE1vYmJlcg0KIyBmaXNoZXIncyBleGFjdCB0ZXN0DQpmaXNoZXIudGVzdChNYXRlZE1vYmJlcikNCg0KDQojY291bGQgcnVuIG1vZGVscyB0aGF0IGFjY291bnQgZm9yIHRpbWUgdGhlIGJpcmQgY291bGQgaGF2ZSBiZWVuIHNlZW4gaWYgbWF0ZWQgbWFsZXMgd2VyZSBhcm91bmQgbG9uZ2VyIGFuZCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIHdpdGhvdXQgdGFraW5nIGludG8gYWNjb3VudCB0aGUgdGltZSB0aGV5IHdlcmUgb2JzZXJ2YWJsZSAtIG9yIG1heWJlIGV2ZW4gbW9yZSBzdHJpa2luZy4gVGhlIGZ1bGwgbW9kZWwgaGFzIGEgc2luZ3VsYXIgZml0LCBidXQgcmVtb3ZpbmcgcmFuZG9tIGVmZmVjdHMgc29sdmVzIHRoaXMuDQpOTW9icy5NYXRlZFVubWF0ZWRBIDwtIHdpdGgoZGF0LCBsbWVyKG51bWJlci5vYnMud2FzLm1vYmJlciB+IE1hdGUudnMuVW5tYXRlICsgSnVsaWFuLmNhcHR1cmUuZGF0ZSArICgxfEJhbmQuTnVtYmVyKSkpDQpzdW1tYXJ5KE5Nb2JzLk1hdGVkVW5tYXRlZEEpDQphbm92YShOTW9icy5NYXRlZFVubWF0ZWRBKQ0KI3Fxbm9ybShyZXNpZHVhbHMoTk1vYnMuTWF0ZWRVbm1hdGVkQSkpDQojcXFsaW5lKHJlc2lkdWFscyhOTW9icy5NYXRlZFVubWF0ZWRBKSkNCnBsb3RfbW9kZWwoTk1vYnMuTWF0ZWRVbm1hdGVkQSwgdHlwZSA9ICJwcmVkIikNCmBgYA0KDQoNCg0KDQojIEMpIFZJQ1RJTSBQRVJTUEVDVElWRQ0KSXMgcGx1bWFnZSByZWxhdGVkIHRvIGJlaW5nIGEgdmljdGltPw0KDQpXZSByZW1vdmVkIGluZGl2aWR1YWxzIGZvbGxvd2VkIGxlc3MgdGhhbiAzIHRpbWVzIGZvciBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIG9yIDMwbWluIGZvciB0b3RhbCBudW1iZXIgb2YgbW9iYmVycywgYWx0aG91Z2ggdGhpcyBtYXkgbm90IGJlIG5lZWRlZCBpZiB3ZSBhZGQgbnVtYmVyIG9mIG9icyBpbiBhcyBhIGNvdmFyaWF0ZS4NCg0KDQojIDEwKSBEbyBtYWxlIHRyYWl0cyBwcmVkaWN0IGhpcyB2dWxuZXJhYmlsaXR5IHRvIG1vYmJpbmc/DQppbiBtYW55IG9mIHRoZXNlIHdlIHVzZSBzdWJzZXQgZGF0YSBmb3IgYmlyZHMgdGhhdCB3ZXJlIHNlZW4gbW9yZSB0aGFuIDMwbWluIHRvdGFsIChPYnMzME1pbkRhdHN1YikgaW4gdGhlIFRvdGFsLnRpbWUubWluIGNvbHVtbg0KDQojIyAxMCkgSXMgcGx1bWFnZSByZWxhdGVkIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgbW9iYmVycyB0aGF0IGEgbWFsZSBnZXRzPyBbRmlnIDZhOyBUQUJMRSBTNF0NCmBgYHtyLCB3YXJuaW5nPVRSVUUsIG1lc3NhZ2U9VFJVRX0NClRvdE1vYmJlcnMuUGx1bWFnZSA8LSB3aXRoKE9iczMwTWluRGF0c3ViLCBnbG1lcihUb3RhbC5kaWZmZXJlbnQubW9iYmVycyB+ICBCZWFrU2l6ZS5QQzEgKyBCb2R5U2l6ZS5QQzIgKyBib2R5LmNvbG9yLm5vLndpbmcgKyBwZXJjZW50Lm5yICsgcnVtcCArIHdwLnouYXZlcmFnZSArIENvbmRpdGlvbiAgKyAoMXxZZWFyKSArICgxfEJhbmQuTnVtYmVyKSwgZmFtaWx5ID0gcG9pc3NvbikpDQojc3VtbWFyeShUb3RNb2JiZXJzLlBsdW1hZ2UpDQojYW5vdmEoVG90TW9iYmVycy5QbHVtYWdlKQ0KI3Fxbm9ybShyZXNpZHVhbHMoVG90TW9iYmVycy5QbHVtYWdlKSkNCiNxcWxpbmUocmVzaWR1YWxzKFRvdE1vYmJlcnMuUGx1bWFnZSkpDQoNCiNyZW1vdmUgcmFuZG9tIGVmZmVjdHMgZm9yIHNpbmd1bGFyIGZpdC4NClRvdE1vYmJlcnMuUGx1bWFnZTEgPC0gd2l0aChPYnMzME1pbkRhdHN1YiwgZ2xtZXIoVG90YWwuZGlmZmVyZW50Lm1vYmJlcnMgfiAgQmVha1NpemUuUEMxICsgQm9keVNpemUuUEMyICsgYm9keS5jb2xvci5uby53aW5nICsgcGVyY2VudC5uciArIHJ1bXAgKyB3cC56LmF2ZXJhZ2UgKyBDb25kaXRpb24gICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCnN1bW1hcnkoVG90TW9iYmVycy5QbHVtYWdlMSkNCmFub3ZhKFRvdE1vYmJlcnMuUGx1bWFnZTEpDQoNClRvdE1vYmJlcnMuUGx1bWFnZTIgPC0gd2l0aChPYnMzME1pbkRhdHN1YiwgZ2xtZXIoVG90YWwuZGlmZmVyZW50Lm1vYmJlcnMgfiAgQmVha1NpemUuUEMxICsgQm9keVNpemUuUEMyICsgYm9keS5jb2xvci5uby53aW5nICsgcGVyY2VudC5uciArIHJ1bXAgKyB3cC56LmF2ZXJhZ2UgKyBDb25kaXRpb24gICsgKDF8WWVhciksIGZhbWlseSA9IHBvaXNzb24pKQ0KDQpUb3RNb2JiZXJzLlBsdW1hZ2UzIDwtIHdpdGgoT2JzMzBNaW5EYXRzdWIsIGdsbShUb3RhbC5kaWZmZXJlbnQubW9iYmVycyB+ICBCZWFrU2l6ZS5QQzEgKyBCb2R5U2l6ZS5QQzIgKyBib2R5LmNvbG9yLm5vLndpbmcgKyBwZXJjZW50Lm5yICsgcnVtcCArIHdwLnouYXZlcmFnZSArIENvbmRpdGlvbiAsIGZhbWlseSA9IHBvaXNzb24pKQ0Kc3VtbWFyeShUb3RNb2JiZXJzLlBsdW1hZ2UzKQ0KYW5vdmEoVG90TW9iYmVycy5QbHVtYWdlMykNCiNxcW5vcm0ocmVzaWR1YWxzKFRvdE1vYmJlcnMuUGx1bWFnZTMpKQ0KI3FxbGluZShyZXNpZHVhbHMoVG90TW9iYmVycy5QbHVtYWdlMykpDQoNCiNtb2RlbCB3aXRoIG5vIHJhbmRvbSBlZmZlY3RzIGhhcyBiZXN0IEFJQw0KDQpBSUMoVG90TW9iYmVycy5QbHVtYWdlKQ0KQUlDKFRvdE1vYmJlcnMuUGx1bWFnZTEpDQpBSUMoVG90TW9iYmVycy5QbHVtYWdlMikNCkFJQyhUb3RNb2JiZXJzLlBsdW1hZ2UzKQ0KDQojdGVzdCBmb3Igb3ZlcmRpc3BlcnNpb24gb2YgcG9pc3NvbiBtb2RlbHMNCmRpc3BlcnNpb25fZ2xtZXIoVG90TW9iYmVycy5QbHVtYWdlMikgI2NoZWNrIGZvciBnbG1lciB0aGF0IGhhcyB2ZXJ5IGNsb3NlIHRvIHRoZSBzYW1lIEFJQyBhcyB0aGUgYmVzdCBtb2RlbA0Kb3ZlcmRpc3BfZnVuKFRvdE1vYmJlcnMuUGx1bWFnZTIpICNjaGVjayBmb3IgZ2xtZXIgdGhhdCBoYXMgdmVyeSBjbG9zZSB0byB0aGUgc2FtZSBBSUMgYXMgdGhlIGJlc3QgbW9kZWwNCmRpc3BlcnNpb250ZXN0KFRvdE1vYmJlcnMuUGx1bWFnZTMpICNiZXN0IG1vZGVsIGlzIGdsbQ0KYGBgDQoNCg0KIzExKSBEbyBtYWxlIHRyYWl0cyBwcmVkaWN0IGV4dHJhIHBhaXIgcGF0ZXJuaXR5IGluIGhpcyBvd24gbmVzdD8gDQoNCg0KIyMgMTEpIERvZXMgYSBtYWxlJ3MgcGx1bWFnZSBwcmVkaWN0IHRoZSBwcm9wb3J0aW9uIG9mIGV4dHJhIHBhaXIgY2hpY2tzIChwYXRlcm5pdHkgYXNzaWduZW1lbnQgYXQgMC4xNSkgaW4gaGlzIG5lc3Q/IFVzaW5nIGEgY2JpbmQgZnVuY3Rpb24gdG8gbGluayBudW1iZXIgRVAgdnMgbnVtYmVyIFdQIGluIHRoZSBuZXN0IGFzIHRoZSBhY2N1cmFjeSBvZiBlc3RpbWF0ZXMgb2YgZXh0cmEtcGFpciBwYXRlcm5pdHkgZGVwZW5kcyBpbiBwYXJ0IG9uIG51bWJlciBvZiBjaGlja3Mgd2UgY2FuIGdlbm90eXBlLiBbRmlnIDZiOyBUQUJMRSBTNV0NCmBgYHtyLCB3YXJuaW5nPVRSVUUsIG1lc3NhZ2U9VFJVRX0NCk5FUENoaWNrczE1LlBsdW1hZ2UgPC0gd2l0aChkYXQsIGdsbWVyKGNiaW5kKE4uRVAuY2hpY2suaG9tZS4wLjE1LCB0b3RhbC5nZW5vdHlwZWQtTi5FUC5jaGljay5ob21lLjAuMTUpIH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uICArICgxfFllYXIpICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBiaW5vbWlhbCkpDQojc3VtbWFyeShORVBDaGlja3MxNS5QbHVtYWdlKQ0KI2Fub3ZhKE5FUENoaWNrczE1LlBsdW1hZ2UpDQojcXFub3JtKHJlc2lkdWFscyhORVBDaGlja3MxNS5QbHVtYWdlKSkNCiNxcWxpbmUocmVzaWR1YWxzKE5FUENoaWNrczE1LlBsdW1hZ2UpKQ0KDQojc2luZ3VsYXIgZml0LCBzbyByZW1vdmUgcmFuZG9tIGVmZmVjdHMuIE1vZGVsIHdpdGhvdXQgeWVhciBpcyBiZXN0IGZpdCwgYnV0IHN0aWxsIHNpbmd1bGFyLiBNb2RlbCB3aXRoIG5vIHJhbmRvbSBlZmZlY3RzIGRvZXMgbm90IGhhdmUgYSBzaW5ndWxhcml0eSAoYnV0IGlzIG5vdCBsb3dlc3QgQUlDKSAtIGFsbCBtb2RlbHMgZ2l2ZSB0aGUgc2FtZSByZXN1bHQuDQpORVBDaGlja3MxNS5QbHVtYWdlMSA8LSB3aXRoKGRhdCwgZ2xtZXIoY2JpbmQoTi5FUC5jaGljay5ob21lLjAuMTUsIHRvdGFsLmdlbm90eXBlZC1OLkVQLmNoaWNrLmhvbWUuMC4xNSkgfiAgQmVha1NpemUuUEMxICsgQm9keVNpemUuUEMyICsgYm9keS5jb2xvci5uby53aW5nICsgcGVyY2VudC5uciArIHJ1bXAgKyB3cC56LmF2ZXJhZ2UgKyBDb25kaXRpb24gICsgKDF8QmFuZC5OdW1iZXIpLCBmYW1pbHkgPSBiaW5vbWlhbCkpDQpzdW1tYXJ5KE5FUENoaWNrczE1LlBsdW1hZ2UxKQ0KYW5vdmEoTkVQQ2hpY2tzMTUuUGx1bWFnZTEpDQojcXFub3JtKHJlc2lkdWFscyhORVBDaGlja3MxNS5QbHVtYWdlMSkpDQojcXFsaW5lKHJlc2lkdWFscyhORVBDaGlja3MxNS5QbHVtYWdlMSkpDQoNCk5FUENoaWNrczE1LlBsdW1hZ2UyIDwtIHdpdGgoZGF0LCBnbG1lcihjYmluZChOLkVQLmNoaWNrLmhvbWUuMC4xNSwgdG90YWwuZ2Vub3R5cGVkLU4uRVAuY2hpY2suaG9tZS4wLjE1KSB+ICBCZWFrU2l6ZS5QQzEgKyBCb2R5U2l6ZS5QQzIgKyBib2R5LmNvbG9yLm5vLndpbmcgKyBwZXJjZW50Lm5yICsgcnVtcCArIHdwLnouYXZlcmFnZSArIENvbmRpdGlvbiAgKyAoMXxZZWFyKSwgZmFtaWx5ID0gYmlub21pYWwpKQ0KDQpORVBDaGlja3MxNS5QbHVtYWdlMyA8LSB3aXRoKGRhdCwgZ2xtKGNiaW5kKE4uRVAuY2hpY2suaG9tZS4wLjE1LCB0b3RhbC5nZW5vdHlwZWQtTi5FUC5jaGljay5ob21lLjAuMTUpIH4gIEJlYWtTaXplLlBDMSArIEJvZHlTaXplLlBDMiArIGJvZHkuY29sb3Iubm8ud2luZyArIHBlcmNlbnQubnIgKyBydW1wICsgd3Auei5hdmVyYWdlICsgQ29uZGl0aW9uICwgZmFtaWx5ID0gYmlub21pYWwpKQ0KDQpBSUMoTkVQQ2hpY2tzMTUuUGx1bWFnZSkNCkFJQyhORVBDaGlja3MxNS5QbHVtYWdlMSkNCkFJQyhORVBDaGlja3MxNS5QbHVtYWdlMikNCkFJQyhORVBDaGlja3MxNS5QbHVtYWdlMykNCg0KI0FsbCBtb2RlbHMgc2hvdyBhIHNpbmd1bGFyaXR5IGFzIG5vdGhpbmcgaXMgc2lnbmlmaWNhbnQsIHNvIHdlIGp1c3QgZ28gd2l0aCB0aGUgbW9kZWwgdGhhdCBoYXMgdGhlIGxvd2VzdCBBSUMuDQpgYGANCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpGb3IgYW5hbHlzZXMgdGhhdCBmb2N1cyBvbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZmVtYWxlIHRyYWl0cyBhbmQgaWYgc2hlIHdhcyBtb2JiZWQgb3IgaGFkIEVQIGZpdG5lc3MgaW4gaGVyIG5lc3QuIFRoZSBpZGVhIGlzIHRvIGdldCBhdCBpZiBmZW1hbGVzIGhhdmUgY29udHJvbCBvdmVyIEVQIGFzIGhlciBtYXRlJ3MgdHJhaXRzIGRvIG5vdCBwcmVkaWN0IGlmIHRoZXkgd2lsbCBoYXZlIEVQIGluIHRoZSBuZXN0Lg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIDEyKSBEbyBmZW1hbGUgdHJhaXRzIHByZWRpY3QgaGlzIHZ1bG5lcmFiaWxpdHkgdG8gbW9iYmluZz8NCmluIG1hbnkgb2YgdGhlc2Ugd2UgdXNlIHN1YnNldCBkYXRhIGZvciBiaXJkcyB0aGF0IHdlcmUgc2VlbiBtb3JlIHRoYW4gMzBtaW4gdG90YWwgKE9iczMwTWluRGF0c3ViKSBpbiB0aGUgVG90YWwudGltZS5taW4gY29sdW1uDQoNCiMjIDEyYSkgSXMgZmVtYWxlIGJvZHkgc2l6ZSByZWxhdGVkIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgbW9iYmVycyB0aGF0IGEgZmVtYWxlIGdldHM/IFtGaWcgNmM7IFRBQkxFIFM2XQ0KYGBge3IsIHdhcm5pbmc9VFJVRSwgbWVzc2FnZT1UUlVFfQ0KVG90TW9iYmVyczMwLlBsdW1hZ2VGIDwtIHdpdGgoT2JzMzBNaW5EYXRzdWJfRiwgZ2xtZXIoVG90YWwuZGlmZmVyZW50Lm1vYmJlcnMgfiAgQmVha1NpemVfUENfRiArIEJvZHlTaXplX1BDMl9GICsgQ29uZGl0aW9uX0YgICAgKyAoMXxZZWFyKSArICgxfEZfYmFuZC5udW1iZXIpLCBmYW1pbHkgPSBwb2lzc29uKSkNCg0KDQojcmVtb3ZlIHJhbmRvbSBlZmZlY3RzIGZvciBzaW5ndWxhciBmaXQuDQpUb3RNb2JiZXJzMzAuUGx1bWFnZUYxIDwtIHdpdGgoT2JzMzBNaW5EYXRzdWJfRiwgZ2xtZXIoVG90YWwuZGlmZmVyZW50Lm1vYmJlcnMgfiAgQmVha1NpemVfUENfRiArIEJvZHlTaXplX1BDMl9GICsgQ29uZGl0aW9uX0YgICsgKDF8Rl9iYW5kLm51bWJlciksIGZhbWlseSA9IHBvaXNzb24pKQ0Kc3VtbWFyeShUb3RNb2JiZXJzMzAuUGx1bWFnZUYxKQ0KYW5vdmEoVG90TW9iYmVyczMwLlBsdW1hZ2VGMSkNCiNxcW5vcm0ocmVzaWR1YWxzKFRvdE1vYmJlcnMzMC5QbHVtYWdlRjEpKQ0KI3FxbGluZShyZXNpZHVhbHMoVG90TW9iYmVyczMwLlBsdW1hZ2VGMSkpDQoNClRvdE1vYmJlcnMzMC5QbHVtYWdlRjIgPC0gd2l0aChPYnMzME1pbkRhdHN1Yl9GLCBnbG1lcihUb3RhbC5kaWZmZXJlbnQubW9iYmVycyB+ICBCZWFrU2l6ZV9QQ19GICsgQm9keVNpemVfUEMyX0YgKyBDb25kaXRpb25fRiAgKyAoMXxZZWFyKSwgZmFtaWx5ID0gcG9pc3NvbikpDQoNClRvdE1vYmJlcnMzMC5QbHVtYWdlRjMgPC0gd2l0aChPYnMzME1pbkRhdHN1Yl9GLCBnbG0oVG90YWwuZGlmZmVyZW50Lm1vYmJlcnMgfiAgQmVha1NpemVfUENfRiArQm9keVNpemVfUEMyX0YgKyBDb25kaXRpb25fRiwgZmFtaWx5ID0gcG9pc3NvbikpDQoNCg0KDQojbW9kZWwgd2l0aCBmZW1hbGUgSUQgYXMgYSByYW5kb20gZWZmZWN0IGhhcyBiZXN0IEFJQw0KDQpBSUMoVG90TW9iYmVyczMwLlBsdW1hZ2VGKQ0KQUlDKFRvdE1vYmJlcnMzMC5QbHVtYWdlRjEpDQpBSUMoVG90TW9iYmVyczMwLlBsdW1hZ2VGMikNCkFJQyhUb3RNb2JiZXJzMzAuUGx1bWFnZUYzKQ0KDQojdGVzdCBmb3Igb3ZlcmRpc3BlcnNpb24gb2YgcG9pc3NvbiBtb2RlbHMNCmRpc3BlcnNpb25fZ2xtZXIoVG90TW9iYmVyczMwLlBsdW1hZ2VGMSkNCm92ZXJkaXNwX2Z1bihUb3RNb2JiZXJzMzAuUGx1bWFnZUYxKQ0KYGBgDQoNCiMxMykgRG8gZmVtYWxlIHRyYWl0cyBwcmVkaWN0IGV4dHJhIHBhaXIgcGF0ZXJuaXR5IGluIGhlciBuZXN0PyANCg0KDQojIyAxMykgRG9lcyBhIGZlbWFsZSdzIGJvZHkgc2l6ZSB0cmFpdHMgcHJlZGljdCB0aGUgcHJvcG9ydGlvbiBvZiBleHRyYSBwYWlyIGNoaWNrcyAocGF0ZXJuaXR5IGFzc2lnbmVtZW50IGF0IDAuMTUpIGluIGhlciBuZXN0PyBVc2luZyBhIGNiaW5kIGZ1bmN0aW9uIHRvIGxpbmsgbnVtYmVyIEVQIHZzIG51bWJlciBXUCBpbiB0aGUgbmVzdCBhcyB0aGUgYWNjdXJhY3kgb2YgZXN0aW1hdGVzIG9mIGV4dHJhLXBhaXIgcGF0ZXJuaXR5IGRlcGVuZHMgaW4gcGFydCBvbiBudW1iZXIgb2YgY2hpY2tzIHdlIGNhbiBnZW5vdHlwZS4gW0ZpZyA2ZDsgVEFCTEUgUzddDQpgYGB7ciwgd2FybmluZz1UUlVFLCBtZXNzYWdlPVRSVUV9DQpORVBDaGlja3MxNS5QbHVtYWdlRiA8LSB3aXRoKGRhdF9GLCBnbG1lcihjYmluZChOLkVQLmNoaWNrLmhvbWUuMC4xNSwgTi5XUC5jaGljay5ob21lLjAuMTUpIH4gIEJlYWtTaXplX1BDX0YgKyBCb2R5U2l6ZV9QQzJfRiArIENvbmRpdGlvbl9GICArICgxfEZfYmFuZC5udW1iZXIpICsgKDF8WWVhciksIGZhbWlseSA9IGJpbm9taWFsKSkNCiNzdW1tYXJ5KE5FUENoaWNrczE1LlBsdW1hZ2VGKQ0KI2Fub3ZhKE5FUENoaWNrczE1LlBsdW1hZ2VGKQ0KI3Fxbm9ybShyZXNpZHVhbHMoTkVQQ2hpY2tzMTUuUGx1bWFnZUYpKQ0KI3FxbGluZShyZXNpZHVhbHMoTkVQQ2hpY2tzMTUuUGx1bWFnZUYpKQ0KDQojTG93ZXN0IEFJQyBpcyBtb2RlbCB3aXRoIGp1c3QgZmVtYWxlIGJhbmQgbnVtYmVyDQpORVBDaGlja3MxNS5QbHVtYWdlRjEgPC0gd2l0aChkYXRfRiwgZ2xtZXIoY2JpbmQoTi5FUC5jaGljay5ob21lLjAuMTUsIE4uV1AuY2hpY2suaG9tZS4wLjE1KSB+ICBCZWFrU2l6ZV9QQ19GICsgQm9keVNpemVfUEMyX0YgKyBDb25kaXRpb25fRiAgKyAoMXxGX2JhbmQubnVtYmVyKSwgZmFtaWx5ID0gYmlub21pYWwpKQ0Kc3VtbWFyeShORVBDaGlja3MxNS5QbHVtYWdlRjEpDQphbm92YShORVBDaGlja3MxNS5QbHVtYWdlRjEpDQojcXFub3JtKHJlc2lkdWFscyhORVBDaGlja3MxNS5QbHVtYWdlRjEpKQ0KI3FxbGluZShyZXNpZHVhbHMoTkVQQ2hpY2tzMTUuUGx1bWFnZUYxKSkNCg0KTkVQQ2hpY2tzMTUuUGx1bWFnZUYyIDwtIHdpdGgoZGF0X0YsIGdsbWVyKGNiaW5kKE4uRVAuY2hpY2suaG9tZS4wLjE1LCBOLldQLmNoaWNrLmhvbWUuMC4xNSkgfiAgQmVha1NpemVfUENfRiArIEJvZHlTaXplX1BDMl9GICsgQ29uZGl0aW9uX0YgICsgKDF8WWVhciksIGZhbWlseSA9IGJpbm9taWFsKSkNCg0KTkVQQ2hpY2tzMTUuUGx1bWFnZUYzIDwtIHdpdGgoZGF0X0YsIGdsbShjYmluZChOLkVQLmNoaWNrLmhvbWUuMC4xNSwgTi5XUC5jaGljay5ob21lLjAuMTUpIH4gIEJlYWtTaXplX1BDX0YgKyBCb2R5U2l6ZV9QQzJfRiArIENvbmRpdGlvbl9GLCBmYW1pbHkgPSBiaW5vbWlhbCkpDQoNCkFJQyhORVBDaGlja3MxNS5QbHVtYWdlRikNCkFJQyhORVBDaGlja3MxNS5QbHVtYWdlRjEpDQpBSUMoTkVQQ2hpY2tzMTUuUGx1bWFnZUYyKQ0KQUlDKE5FUENoaWNrczE1LlBsdW1hZ2VGMykNCg0KI1F1aWNrIHBsb3QgdG8gc2VlIHdoYXQgdGhlIGZlbWFsZSBib2R5IHNpemUgcGF0dGVybiBsb29rcyBsaWtlLg0KZ2dwbG90KGRhdF9GLCBhZXMoeD1Cb2R5U2l6ZV9QQzJfRiwgeT1OLkVQLmNoaWNrLmhvbWUuMC4xNS8odG90YWwuZ2Vub3R5cGVkKSkpICsgDQogIGdlb21fcG9pbnQoYWxwaGE9LjUpICsNCiAgc3RhdF9zbW9vdGgobWV0aG9kPSJnbG0iLCBzZT1GQUxTRSwgbWV0aG9kLmFyZ3MgPSBsaXN0KGZhbWlseT1iaW5vbWlhbCkpDQoNCmBgYA0KDQoNCg0KDQojIFRISVMgSVMgVEhFIEVORC4uLk1ZIEZSSUVORCE=