R packages
##
library(arm)
library(ggbreak)
library(scales)
library(tidyverse)
library(googlesheets4)
library(googledrive)
library(plotly)
library(lme4)
library(fitdistrplus)
library(goft)
library(data.table)
Data
ss= "https://docs.google.com/spreadsheets/d/1dr6LCQJevHdeS08zrdkbeONfhxU7etsojqVvBU7ryfs/edit?usp=sharing"
hoja = 1
rango = "A1:N193"
Descriptive
Proportion of infested pigs

Types of cysts
p <- ggplot(data=df,
aes(x= Host.sex, fill= cyst.type) )
p <- p + geom_bar( stat = "count", color="white") +
scale_fill_brewer(palette = "Blues") +
labs(title="Types of cysts and sex of hosts", y= "n")
ggplotly(p)
## Fertile quistes
p <- ggplot(data=df,
aes(x= Host.sex, fill= as.factor(fertile.bin)))
p <- p + geom_bar(stat = "count", position = "stack", color="white") +
labs(title = "Fertile cysts") +
scale_fill_brewer(palette="Blues") +
labs(title="Fertile cysts and sex of hosts", y= "n")
ggplotly(p)
##
p <- ggplot(data=df,
aes( x= size_cm) )
p <- p + geom_histogram(bins=20, binwidth = 0.2, color="white", fill="darkgrey") +
scale_fill_brewer(palette="Blues") +
labs(title = "Hisrogram for the size of a cyst (cm)")
ggplotly(p)
Generalized Logistic Model
Host individual's Sex &
Cyst size
Call:
glm(formula = fertile.bin ~ size_cm * Host.sex, family = "binomial",
data = df)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -2.941051 0.789402 -3.726 0.000195 ***
size_cm 0.431272 0.390205 1.105 0.269054
Host.sexMale 1.275366 0.892428 1.429 0.152976
size_cm:Host.sexMale -0.001491 0.429234 -0.003 0.997228
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 213.71 on 191 degrees of freedom
Residual deviance: 194.76 on 188 degrees of freedom
AIC: 202.76
Number of Fisher Scoring iterations: 5
Call:
glm(formula = fertile.bin ~ Host.sex + size_cm, family = "binomial",
data = df)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -2.9391 0.5424 -5.418 6.02e-08 ***
Host.sexMale 1.2728 0.5165 2.464 0.01373 *
size_cm 0.4300 0.1626 2.645 0.00817 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 213.71 on 191 degrees of freedom
Residual deviance: 194.76 on 189 degrees of freedom
AIC: 200.76
Number of Fisher Scoring iterations: 5
- Both the sex of the host individual (i.e., Males) and the
size of the cyst itself are good predictors of cyst fertility
(
P= 0.01
).
- The cysts collected from male pigs have 3.6 (CI95% 1.3-9.8)
more times to be fertile than the ones collected from female pigs. This
suggests some factors associated with the host individual explain, at
least partially, the fertility of the cyst
Generalized Logistic Mixed Model [“host individual” as random
effect]
Testing for Random effects at the host individual scale (Baseline
glm Vs. baseline mixed-model )
[1] 160.6177
[1] 215.7116
[1] 4.155105e-14
- The random effect of the host individual is justified. The
basal AIC (null model) with the random effect included is less (P<
0.001) than without including that term. This suggests there are
additional factors at the individual scale (e.g., sex of the animal)
possibly not previously measured or studied, that are associated with
the probability of fertility.
Host's Sex + random Fx
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
Family: binomial ( logit )
Formula: fertile.bin ~ (1 | code) + Host.sex
Data: df
AIC BIC logLik deviance df.resid
162.1 171.9 -78.0 156.1 189
Scaled residuals:
Min 1Q Median 3Q Max
-2.1186 -0.2690 -0.1283 -0.1030 3.7174
Random effects:
Groups Name Variance Std.Dev.
code (Intercept) 5.794 2.407
Number of obs: 192, groups: code, 39
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -4.1193 1.3264 -3.106 0.0019 **
Host.sexMale 0.8578 1.1719 0.732 0.4642
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr)
Host.sexMal -0.561
Cyst size + random Fx
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
Family: binomial ( logit )
Formula: fertile.bin ~ (1 | code) + size_cm
Data: df
AIC BIC logLik deviance df.resid
158.3 168.1 -76.2 152.3 189
Scaled residuals:
Min 1Q Median 3Q Max
-2.3304 -0.2820 -0.1102 -0.0700 3.1833
Random effects:
Groups Name Variance Std.Dev.
code (Intercept) 6.386 2.527
Number of obs: 192, groups: code, 39
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -4.8529 1.3814 -3.513 0.000443 ***
size_cm 0.6644 0.3358 1.979 0.047857 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr)
size_cm -0.592
- After including the animal identifier as random effect, only
the the size of the cyst (unlike the Sex of the host) is an suitable
candidate to explain the probability of fertility of a cyst
(P=0.047).
Cyst fertility~
Cyst's Size [Unimodal]
Call:
glm(formula = fertile.bin ~ size_cm + I(size_cm^2), family = "binomial",
data = df)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -5.5840 1.0450 -5.343 9.12e-08 ***
size_cm 4.0952 0.9329 4.390 1.14e-05 ***
I(size_cm^2) -0.7436 0.1927 -3.859 0.000114 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 213.71 on 191 degrees of freedom
Residual deviance: 177.68 on 189 degrees of freedom
AIC: 183.68
Number of Fisher Scoring iterations: 5
Optimum size for
Cyst Fertility probability
size_cm
2.75
GLM model

- Optimum size= 3.15cm.
- Highest probability range for Cyst fertility (Tolerance)=
2.09cm-4.2cm.
Unimodal Mixed Model - GLMM (Random Effects: Host individual)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
Family: binomial ( logit )
Formula: fertile.bin ~ (1 | code) + size_cm + I(size_cm^2)
Data: df
AIC BIC logLik deviance df.resid
157.2 170.2 -74.6 149.2 188
Scaled residuals:
Min 1Q Median 3Q Max
-2.05398 -0.28319 -0.13012 -0.04482 3.10260
Random effects:
Groups Name Variance Std.Dev.
code (Intercept) 4.422 2.103
Number of obs: 192, groups: code, 39
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -6.2826 1.6063 -3.911 9.18e-05 ***
size_cm 2.8215 1.3012 2.168 0.0301 *
I(size_cm^2) -0.4484 0.2559 -1.752 0.0797 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) siz_cm
size_cm -0.783
I(siz_cm^2) 0.687 -0.968
size_cm
3.15

- Optimum size= 3.15cm.
- Highest probability range for Cyst fertility (Tolerance)=
2.09cm-4.2cm.
LS0tDQp0aXRsZTogIkVjaC5jYW5fcXVpc3RlcyINCmF1dGhvcjogIkZlZGVyaWNvIEouIFZpbGxhdG9ybyINCmRhdGU6ICIyMDIzLTExLTIyIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IEZBTFNFDQogICAgdG9jX2RlcHRoOiA2DQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KGZsZXhkYXNoYm9hcmQpDQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGVjaG8gPSBGQUxTRSwNCgltZXNzYWdlID0gRkFMU0UsDQogIHdhcm5pbmcgPSBGQUxTRSwNCglpbmNsdWRlID0gVFJVRQ0KKQ0KYGBgDQoNCiMjIyBSIHBhY2thZ2VzDQpgYGB7ciBlY2hvPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GfQ0KaWYgKCFyZXF1aXJlKHRpZHl2ZXJzZSkpIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQppZiAoIXJlcXVpcmUoZ29vZ2xlc2hlZXRzNCkpIGluc3RhbGwucGFja2FnZXMoImdvb2dsZXNoZWV0czQiKQ0KaWYgKCFyZXF1aXJlKGdvb2dsZWRyaXZlKSkgaW5zdGFsbC5wYWNrYWdlcygiZ29vZ2xlZHJpdmUiKQ0KaWYgKCFyZXF1aXJlKHBsb3RseSkpIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQppZiAoIXJlcXVpcmUobG1lNCkpIGluc3RhbGwucGFja2FnZXMoImxtZTQiKQ0KaWYgKCFyZXF1aXJlKGZpdGRpc3RycGx1cykpIGluc3RhbGwucGFja2FnZXMoImZpdGRpc3RycGx1cyIpDQppZiAoIXJlcXVpcmUoZ29mdCkpIGluc3RhbGwucGFja2FnZXMoImdvZnQiKQ0KaWYgKCFyZXF1aXJlKGRhdGEudGFibGUpKSBpbnN0YWxsLnBhY2thZ2VzKCJkYXRhLnRhYmxlIikNCmlmICghcmVxdWlyZShzY2FsZXMpKSBpbnN0YWxsLnBhY2thZ2VzKCJzY2FsZXMiKQ0KaWYgKCFyZXF1aXJlKGdnYnJlYWspKSBpbnN0YWxsLnBhY2thZ2VzKCJnZ2JyZWFrIikNCmlmICghcmVxdWlyZShhcm0pKSBpbnN0YWxsLnBhY2thZ2VzKCJhcm0iKQ0KYGBgICAgDQoNCg0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9Rn0NCiMjDQpsaWJyYXJ5KGFybSkNCmxpYnJhcnkoZ2dicmVhaykNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdvb2dsZXNoZWV0czQpDQpsaWJyYXJ5KGdvb2dsZWRyaXZlKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGxtZTQpDQpsaWJyYXJ5KGZpdGRpc3RycGx1cykNCmxpYnJhcnkoZ29mdCkNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmBgYA0KDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpvcHRpb25zKGdhcmdsZV9vYXV0aF9lbWFpbCA9ICJ2aWxsYXRvcm9wYXpmakBkYXRhYW5hbHlzaXNsYWIuY29tIikNCmdzNF9hdXRoKCkNCmBgYA0KDQojIyMgRGF0YQ0KYGBge3IgZWNobz1UUlVFLCBldmFsPUZBTFNFfQ0Kc3M9ICJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xZHI2TENRSmV2SGRlUzA4enJka2JlT05maHhVN2V0c29qcVZ2QlU3cnlmcy9lZGl0P3VzcD1zaGFyaW5nIg0KaG9qYSA9IDENCnJhbmdvID0gIkExOk4xOTMiDQpgYGAgIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0Kc3M9ICJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xZHI2TENRSmV2SGRlUzA4enJka2JlT05maHhVN2V0c29qcVZ2QlU3cnlmcy9lZGl0P3VzcD1zaGFyaW5nIg0KaG9qYSA9IDENCnJhbmdvID0gIkExOk4xOTMiDQpkZiA8LSByZWFkX3NoZWV0KHNzLA0KICAgICAgICAgICAgICAgICAgc2hlZXQgPSBob2phLA0KICAgICAgICAgICAgICAgICAgcmFuZ2UgPSByYW5nbywNCiAgICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IFRSVUUNCiAgICAgICAgICAgICAgICAgICkNCmRmIDwtIGRhdGEuZnJhbWUoZGYpDQpkZiRmZXJ0aWxlLmJpbiA8LSBhcy5udW1lcmljKGRmJGN5c3QuZmVydGlsaXR5PT0iWWVzIikNCmRmJHN0ZXJpbGUuYmluIDwtIGFzLm51bWVyaWMoZGYkc3RlcmlsZT09IlllcyIpDQojIw0KaG9qYSA9IDINCnJhbmdvID0gIkExOkoxMTgiDQpkZjIgPC0gcmVhZF9zaGVldChzcywNCiAgICAgICAgICAgICAgICAgIHNoZWV0ID0gaG9qYSwNCiAgICAgICAgICAgICAgICAgIHJhbmdlID0gcmFuZ28sDQogICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBUUlVFDQogICAgICAgICAgICAgICAgICApDQpkZjIgPC0gZGF0YS5mcmFtZShkZjIpDQpkZjIkb3JpZ2VuIDwtIGFzLmZhY3RvcihkZjIkb3JpZ2VuKQ0KZGYyJGluZmVzdGVkIDwtIGFzLmZhY3RvcihkZjIkaW5mZXN0ZWQpDQpkZjIkVC5oeWRhdGlnZW5hIDwtIGFzLmZhY3RvcihkZjIkVC5oeWRhdGlnZW5hKQ0KZGYyJEVjaGlub2NvY2N1c19zcHAuIDwtIGFzLmZhY3RvcihkZjIkRWNoaW5vY29jY3VzX3NwcC4pDQoNCmBgYCAgDQoNCiMjIyBEZXNjcmlwdGl2ZQ0KIyMjIyBQcm9wb3J0aW9uIG9mIGluZmVzdGVkIHBpZ3MNCmBgYHtyIGVjaG89RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQp0YWJsZShkZjIkaW5mZXN0ZWQpDQpgYGAgIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQppbmZlc3RlZCA8LSBkYXRhLmZyYW1lKA0KICAgIGluZmVzdGVkPWMoIlllcyIsICJObyIpLA0KICAgIG4gPSBjKDQ3LDcwKQ0KKQ0KaW5mZXN0ZWQNCmBgYCAgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojIEJhc2ljIHBpZWNoYXJ0DQpwIDwtIGdncGxvdChpbmZlc3RlZCwgYWVzKHg9IkFuaW1hbHMiLCB5PW4sIGZpbGw9aW5mZXN0ZWQpKSANCnAgPC0gcCArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aD0xLCBjb2xvcj0id2hpdGUiKSArDQogIGxhYnModGl0bGUgPSAiSW5mZXN0ZWQgYW5pbWFscyIpICsgDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IkJsdWVzIikNCiAgIA0KcDIgPC0gcCArDQogIGdlb21fdGV4dChhZXMoeSA9IG4vMiArIGMoMCwgY3Vtc3VtKG4pWy1sZW5ndGgobildKSwNCiAgICAgICAgICAgICAgICBsYWJlbCA9IG4gKSwgc2l6ZT00KQ0KICANCg0KZ2dwbG90bHkocDIpDQoNCiMjIGJsYW5rX3RoZW1lDQoNCmJsYW5rX3RoZW1lIDwtIHRoZW1lX21pbmltYWwoKSsNCiAgdGhlbWUoDQogIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksDQogIHBhbmVsLmdyaWQ9ZWxlbWVudF9ibGFuaygpLA0KICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0LCBmYWNlPSJib2xkIikNCiAgKQ0KDQpwMyA8LSBwICsgbGFicyh0aXRsZSA9ICJQcm9wb3J0aW9uIG9mIGluZmVzdGVkIGFuaW1hbHMiKSArIA0KICAjc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iQmx1ZXMiKQ0KICBjb29yZF9wb2xhcigieSIsIHN0YXJ0PTApICsNCiAgI3NjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IkJsdWVzIikgKyANCiAgYmxhbmtfdGhlbWUgKw0KICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCkpICsNCiAgZ2VvbV90ZXh0KGFlcyh5ID0gbi8yICsgYygwLCBjdW1zdW0obilbLWxlbmd0aChuKV0pLA0KICAgICAgICAgICAgICAgIGxhYmVsID0gcGVyY2VudChuL3N1bShuKSkgKSwgc2l6ZT01KSArDQogICAgdGhlbWVfdm9pZCgpICMgcmVtb3ZlIGJhY2tncm91bmQsIGdyaWQsIG51bWVyaWMgbGFiZWxzDQpwMw0KDQpgYGAgIA0KDQojIyMjIE51bWJlciBvZiBDeXN0cw0KYGBge3IgaW5jbHVkZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KcCA8LSBnZ3Bsb3QoZGF0YT1kZjIsDQogICAgICAgICAgICBhZXMoeD0gSG9zdC5zZXgseT1saXZlcikpDQpwIDwtIHAgKyBnZW9tX3Zpb2xpbigpICsgDQogIGdlb21fcG9pbnQoYWVzKGNvbD1Ib3N0LnNleCksIHNpemU9MC42LCANCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjMsIGhlaWdodD0wLjEpKSArDQogIHN0YXRfc3VtbWFyeShhZXMoZmlsbD0gSG9zdC5zZXgpLA0KICAgICAgICAgICAgICAgZnVuPW1lYW4sIGdlb209InBvaW50Iiwgc2hhcGU9MTgsIA0KICAgICAgICAgICAgICAgc2l6ZT0zLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogICNjb29yZF9mbGlwKCkgKw0KICBsYWJzKHRpdGxlPSJOdW1iZXIgb2YgY3lzdHMgcGVyIGFuaW1hbCIsIHk9Ik51bWJlciBvZiBjeXN0cyBpbiB0aGUgbGl2ZXIiKQ0KZ2dwbG90bHkocCkNCmBgYCAgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwIDwtIGdncGxvdChkYXRhPWRmMiwNCiAgICAgICAgICAgIGFlcyh4PUhvc3Quc2V4LHk9bGl2ZXIpKQ0KcCA8LSBwICsgZ2VvbV92aW9saW4oKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbD0gSG9zdC5zZXgpLCBzaXplPTAuNywgDQogICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4zLCBoZWlnaHQ9MC4xKSkgKw0KICAjc3RhdF9zdW1tYXJ5KGFlcyhmaWxsID0gc2V4byksDQogICAjICAgICAgICAgICAgZnVuPW1lYW4sIGdlb209InBvaW50Iiwgc2hhcGU9MTgsIA0KICAgICMgICAgICAgICAgIHNpemU9Mywgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICAjY29vcmRfZmxpcCgpICsgDQogIGxhYnModGl0bGU9Ik51bWJlciBvZiBjeXN0cyBwZXIgYW5pbWFsIiwgeT0iTnVtYmVyIG9mIGN5c3RzIGluIHRoZSBsaXZlciIpICsNCiAgc2NhbGVfeV9icmVhayhjKDE1LDU2MCkpIA0KcA0KYGBgICANCg0KYGBge3J9DQpwIDwtIGdncGxvdChkYXRhPSBkZjIsDQogICAgICAgICAgICBhZXMoIHg9IGxpdmVyICwgZmlsbD0gSG9zdC5zZXgpKQ0KcCA8LSBwICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjIsIGNvbG9yPSJ3aGl0ZSIsIGZpbGw9ImRhcmtncmV5IikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJibHVlcyIpICsNCiAgbGFicyh0aXRsZSA9ICJIaXNyb2dyYW0gZm9yIHRoZSBhbW1vdW50IG9mIGN5c3RzIHBlciBhbmltYWwiLCANCiAgICAgICB4PSJOdW1iZXIgb2YgY3lzdHMgaW4gdGhlIGxpdmVyIikgKw0KICB4bGltKC0xLDE1KSArIHlsaW0oMCw3MCkNCiNnZ3Bsb3RseShwKQ0KcA0KYGBgICANCg0KYGBge3J9DQpwIDwtIGdncGxvdChkYXRhPWRmMiwNCiAgICAgICAgICAgIGFlcyh4PSBsaXZlciwgZmlsbD0gSG9zdC5zZXgpKQ0KcCA8LSBwICsgDQogIGdlb21fYmFyKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSwgY29sb3I9IndoaXRlIikgKw0KICB4bGltKC0xLDE1KSArIHlsaW0oMCw0MCkgKw0KICBsYWJzKHRpdGxlID0gIkhpc3JvZ3JhbSBmb3IgdGhlIGFtbW91bnQgb2YgY3lzdHMgcGVyIGFuaW1hbCIsDQogICAgICAgeD0iTnVtYmVyIG9mIGN5c3RzIGluIHRoZSBsaXZlciIpDQpnZ3Bsb3RseShwKQ0KYGBgICANCg0KIyMjIyBUeXBlcyBvZiBjeXN0cw0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KcCA8LSBnZ3Bsb3QoZGF0YT1kZiwNCiAgICAgICAgICAgIGFlcyh4PSBIb3N0LnNleCwgZmlsbD0gY3lzdC50eXBlKSApDQpwIDwtIHAgKyBnZW9tX2Jhciggc3RhdCA9ICJjb3VudCIsIGNvbG9yPSJ3aGl0ZSIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJCbHVlcyIpICsNCiAgbGFicyh0aXRsZT0iVHlwZXMgb2YgY3lzdHMgYW5kIHNleCBvZiBob3N0cyIsIHk9ICJuIikNCmdncGxvdGx5KHApDQoNCiMjIEZlcnRpbGUgcXVpc3Rlcw0KcCA8LSBnZ3Bsb3QoZGF0YT1kZiwNCiAgICAgICAgICAgIGFlcyh4PSBIb3N0LnNleCwgZmlsbD0gYXMuZmFjdG9yKGZlcnRpbGUuYmluKSkpDQpwIDwtIHAgKyBnZW9tX2JhcihzdGF0ID0gImNvdW50IiwgcG9zaXRpb24gPSAic3RhY2siLCBjb2xvcj0id2hpdGUiKSArDQogIGxhYnModGl0bGUgPSAiRmVydGlsZSBjeXN0cyIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iQmx1ZXMiKSArDQogIGxhYnModGl0bGU9IkZlcnRpbGUgY3lzdHMgYW5kIHNleCBvZiBob3N0cyIsIHk9ICJuIikNCmdncGxvdGx5KHApDQojIw0KcCA8LSBnZ3Bsb3QoZGF0YT1kZiwNCiAgICAgICAgICAgIGFlcyggeD0gc2l6ZV9jbSkgKQ0KcCA8LSBwICsgZ2VvbV9oaXN0b2dyYW0oYmlucz0yMCwgYmlud2lkdGggPSAwLjIsIGNvbG9yPSJ3aGl0ZSIsIGZpbGw9ImRhcmtncmV5IikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJCbHVlcyIpICsNCiAgbGFicyh0aXRsZSA9ICJIaXNyb2dyYW0gZm9yIHRoZSBzaXplIG9mIGEgY3lzdCAoY20pIikNCmdncGxvdGx5KHApDQpgYGAgIA0KDQoNCiMjIyBBc3NvY2lhdGlvbnMNCmBgYHtyfQ0KcCA8LSBnZ3Bsb3QoZGF0YT1kZiwNCiAgICAgICAgICAgIGFlcyggeT0gc2l6ZV9jbSkgKQ0KcCArIA0KICAjZ2VvbV9ib3hwbG90KGFlcyh4PWFzLmZhY3RvcihmZXJ0aWxlLmJpbikpLA0KICAgIyAgICAgICAgICAgKSArDQogIGdlb21fdmlvbGluKGFlcyh4PWFzLmZhY3RvcihmZXJ0aWxlLmJpbikpKSArDQogIGdlb21fcG9pbnQoYWVzKHg9YXMuZmFjdG9yKGZlcnRpbGUuYmluKSwgY29sPSBIb3N0LnNleCksDQogICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjIsaGVpZ2h0ID0wLjAyKSkgKw0KICAgc3RhdF9zdW1tYXJ5KGFlcyh4ID0gYXMuZmFjdG9yKGZlcnRpbGUuYmluKSksZnVuPW1lYW4sIGdlb209InBvaW50Iiwgc2hhcGU9MTgsIHNpemU9Mywgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcz1jKDAsMSksDQogICAgICAgIGxhYmVscz1jKCJObyIsICJZZXMiKSwNCiAgICAgICAgbmFtZT0gIkZlcnRpbGUiKSArDQogIGxhYnModGl0bGUgPSAiQ3lzdCdzIHNpemUsIGN5c3QncyBmZXJ0aWxpdHkgYW5kIGhvc3QncyBzZXgiKSArDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lPSAiQ3lzdCdzIGRpYW1ldGVyIChjbSkiICkNCg0KcCArIA0KICBnZW9tX2JveHBsb3QoYWVzKHg9YXMuZmFjdG9yKGZlcnRpbGUuYmluKSksIG91dGxpZXIuc2hhcGUgPSAxNywgb3V0bGllci5hbHBoYSA9IDAuNiwgb3V0bGllci5jb2xvciA9ICJibGFjayIpICsNCiAgI2dlb21fdmlvbGluKGFlcyh4PWFzLmZhY3RvcihmZXJ0aWxlLmJpbikpLA0KICAgIyAgICAgICAgICAgKSArDQogIGdlb21fcG9pbnQoYWVzKHg9YXMuZmFjdG9yKGZlcnRpbGUuYmluKSwgY29sPSBIb3N0LnNleCksDQogICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjIsaGVpZ2h0ID0wLjAyKSkgKw0KICBzdGF0X3N1bW1hcnkoYWVzKHggPSBhcy5mYWN0b3IoZmVydGlsZS5iaW4pKSxmdW49bWVhbiwgZ2VvbT0icG9pbnQiLCBzaGFwZT0xOCwgc2l6ZT0zLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoMCwxKSwNCiAgICAgICAgbGFiZWxzPWMoIk5vIiwgIlllcyIpLA0KICAgICAgICBuYW1lPSAiRmVydGlsZSIpICsNCiAgbGFicyh0aXRsZSA9ICJDeXN0J3Mgc2l6ZSwgY3lzdCdzIGZlcnRpbGl0eSBhbmQgaG9zdCdzIHNleCIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9ICJDeXN0J3MgZGlhbWV0ZXIgKGNtKSIgKQ0KDQojDQpwICsgDQogIGdlb21fdmlvbGluKGFlcyh4PUhvc3Quc2V4KSkgKw0KICBnZW9tX3BvaW50KGFlcyh4PUhvc3Quc2V4LCBjb2w9IGFzLmZhY3RvcihmZXJ0aWxlLmJpbikpLA0KICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4yLGhlaWdodCA9MC4wMikpICsNCiAgIHN0YXRfc3VtbWFyeShhZXMoeCA9IEhvc3Quc2V4KSwgZnVuPW1lYW4sIGdlb209InBvaW50Iiwgc2hhcGU9MTgsIHNpemU9Mywgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBzY2FsZV94X2Rpc2NyZXRlKG5hbWU9ICJIb3N0LnNleCIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9ICJDeXN0J3MgZGlhbWV0ZXIgKGNtKSIgKSArDQogIGxhYnModGl0bGUgPSAiQ3lzdCdzIHNpemUsIGN5c3QncyBmZXJ0aWxpdHkgYW5kIGhvc3QncyBzZXgiKSANCiAgDQojIyMNCnAgPC0gZ2dwbG90KGRhdGE9ZGYsDQogICAgICAgICAgICBhZXMoIHk9IGZlcnRpbGUuYmluICkgKQ0KcCArIA0KICBnZW9tX3BvaW50KGFlcyh4PXNpemVfY20sIGNvbD0gUHVydWxlbnQpLA0KICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9MC4wMixoZWlnaHQgPTAuMDIpLA0KICAgICAgICAgICAgIHNob3cubGVnZW5kID0gVFJVRSkgKw0KICBnZW9tX3Ntb290aChhZXMoeD1zaXplX2NtKSwNCiAgICAgICAgICAgICAgbWV0aG9kPSJnbG0iLA0KICAgICAgICAgICAgICBtZXRob2QuYXJncz1saXN0KGZhbWlseT0iYmlub21pYWwiKSkgKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1jKDAsMSksDQogICAgICAgIGxhYmVscz1jKCJObyIsICJZZXMiKSwNCiAgICAgICAgbmFtZT0gIkZlcnRpbGUiKSArDQogIGxhYnModGl0bGUgPSAiQ3lzdCdzIHR5cGUsIHNpemUsIGFuZCBmZXJ0aWxpdHkiKSArDQogIHhsYWIoIkN5c3QncyBkaWFtZXRlciAoY20pIikgDQojDQpwICsgDQogIGdlb21fcG9pbnQoYWVzKHg9c2l6ZV9jbSwgY29sPSBIb3N0LnNleCksDQogICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjAyLGhlaWdodCA9MC4wMiksDQogICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBUUlVFKSArDQogIGdlb21fc21vb3RoKGFlcyh4PXNpemVfY20sIGNvbD0gSG9zdC5zZXgpLA0KICAgICAgICAgICAgICBtZXRob2Q9ImdsbSIsDQogICAgICAgICAgICAgIG1ldGhvZC5hcmdzPWxpc3QoZmFtaWx5PSJiaW5vbWlhbCIpLCBzZSA9IFRSVUUpICsNCiAgbGFicyh0aXRsZT0gIkN5c3QncyBzaXplLCBjeXN0J3MgZmVydGlsaXR5IGFuZCBob3N0J3Mgc2V4IiwgDQogICAgICAgeT0iRmVydGlsZSIsIHg9IkN5c3QncyBkaWFtZXRlciAoY20pIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMCwxKSwNCiAgICAgICAgbGFiZWxzPWMoIk5vIiwgIlllcyIpLA0KICAgICAgICBuYW1lPSAiRmVydGlsZSIpDQpgYGAgIA0KDQojIyMgR2VuZXJhbGl6ZWQgTG9naXN0aWMgTW9kZWwNCg0KIyMjIGBIb3N0IGluZGl2aWR1YWwncyBTZXggJmAgYEN5c3Qgc2l6ZWANCg0KYGBge3J9DQojIyBUZXN0aW5nIGZvciBJbnRlcmFjdGlvbg0KbW9kIDwtIGdsbShkYXRhPWRmLA0KICAgICAgICAgICBmZXJ0aWxlLmJpbiB+IHNpemVfY20gKiBIb3N0LnNleCAsIGZhbWlseSA9ICJiaW5vbWlhbCIpDQpzdW1tYXJ5KG1vZCkgIyBObyBpbnRlcmFjdGlvbg0KIyMgTk8gaW50ZXJhY3Rpb24NCm1vZCA8LSBnbG0oZGF0YT1kZiwNCiAgICAgICAgICAgZmVydGlsZS5iaW4gfiBIb3N0LnNleCArIHNpemVfY20sIGZhbWlseSA9ICJiaW5vbWlhbCIpDQpzdW1tYXJ5KG1vZCkgIyBObyBpbnRlcmFjdGlvbg0KYGBgICANCiogKipCb3RoIHRoZSBzZXggb2YgdGhlIGhvc3QgaW5kaXZpZHVhbCAoaS5lLiwgTWFsZXMpIGFuZCB0aGUgc2l6ZSBvZiB0aGUgY3lzdCBpdHNlbGYgYXJlIGdvb2QgcHJlZGljdG9ycyBvZiBjeXN0IGZlcnRpbGl0eSAoYFA9IDAuMDFgKS4qKg0KDQoNCmBgYHtyIGV2YWw9RkFMU0UsIGVjaG89RkFMU0V9DQojIyMgYEZlcnRpbGl0eSB+IGhvc3QgaW5kaXZpZHVhbCdzIFNleGANCg0KbW9kIDwtIGdsbShkYXRhPWRmLA0KICAgICAgICAgICBmZXJ0aWxlLmJpbiB+IEhvc3Quc2V4ICwgZmFtaWx5ID0gImJpbm9taWFsIikNCnN1bW1hcnkobW9kKSAjIFNleCBhc3NvY2lhdGlvbg0KYGBgICANCg0KYGBge3IgZWNobz1GQUxTRX0NCk9SLm1hbGUgPC0gcm91bmQoZXhwKDEuMjcyOCksIDEpDQpPUi5tYWxlLnVwciA8LSBleHAoMS4yNzI4ICsgKDEuOTYqMC41MTY1KSkNCk9SLm1hbGUudXByIDwtIHJvdW5kKE9SLm1hbGUudXByLDEpDQpPUi5tYWxlLmx3ciA8LSBleHAoMS4yNzI4IC0gKDEuOTYqMC41MTY1KSkNCk9SLm1hbGUubHdyIDwtIHJvdW5kKE9SLm1hbGUubHdyLDEpDQpgYGAgIA0KKiAqKlRoZSBjeXN0cyBjb2xsZWN0ZWQgZnJvbSBtYWxlIHBpZ3MgaGF2ZSBgciBPUi5tYWxlYCAoQ0k5NSUgYHIgT1IubWFsZS5sd3JgLWByIE9SLm1hbGUudXByYCkgbW9yZSB0aW1lcyB0byBiZSBmZXJ0aWxlIHRoYW4gdGhlIG9uZXMgY29sbGVjdGVkIGZyb20gZmVtYWxlIHBpZ3MuIFRoaXMgc3VnZ2VzdHMgc29tZSBmYWN0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9zdCBpbmRpdmlkdWFsIGV4cGxhaW4sIGF0IGxlYXN0IHBhcnRpYWxseSwgdGhlIGZlcnRpbGl0eSBvZiB0aGUgY3lzdCoqICANCg0KIyMjIEdlbmVyYWxpemVkIExvZ2lzdGljIE1peGVkIE1vZGVsIFsiaG9zdCBpbmRpdmlkdWFsIiBhcyByYW5kb20gZWZmZWN0XQ0KDQojIyMjIFRlc3RpbmcgZm9yIFJhbmRvbSBlZmZlY3RzIGF0IHRoZSBob3N0IGluZGl2aWR1YWwgc2NhbGUgKEJhc2VsaW5lIGdsbSAgVnMuIGJhc2VsaW5lIG1peGVkLW1vZGVsICkgIA0KDQpgYGB7cn0NCm0wLmdsbSA8LSBnbG0oZGF0YT0gZGYsDQogICAgICAgICAgICAgZmVydGlsZS5iaW4gfiAxLCBmYW1pbHkgPSAiYmlub21pYWwiKQ0KbTAuZ2xtZXIgPC0gZ2xtZXIoZGF0YT1kZiwNCiAgICAgICAgICAgZmVydGlsZS5iaW4gfiAoMXxjb2RlKSwgZmFtaWx5ID0gImJpbm9taWFsIikNCiMjDQphaWMuZ2xtZXIgPC0gQUlDKGxvZ0xpayhtMC5nbG1lcikpDQphaWMuZ2xtIDwtIEFJQyhsb2dMaWsobTAuZ2xtKSkNCiMjDQphaWMuZ2xtZXINCmFpYy5nbG0NCiMjDQpudWxsLmlkID0gLTIgKiBsb2dMaWsobTAuZ2xtKSArIDIgKiBsb2dMaWsobTAuZ2xtZXIpDQpQIDwtIHBjaGlzcShhcy5udW1lcmljKG51bGwuaWQpLCBkZj0xLCBsb3dlci50YWlsID0gRkFMU0UpDQpQDQpgYGAgIA0KDQoqICoqVGhlIHJhbmRvbSBlZmZlY3Qgb2YgdGhlIGhvc3QgaW5kaXZpZHVhbCBpcyBqdXN0aWZpZWQuIFRoZSBiYXNhbCBBSUMgKG51bGwgbW9kZWwpIHdpdGggdGhlIHJhbmRvbSBlZmZlY3QgaW5jbHVkZWQgaXMgbGVzcyAoUDwgMC4wMDEpIHRoYW4gd2l0aG91dCBpbmNsdWRpbmcgdGhhdCB0ZXJtLiBUaGlzIHN1Z2dlc3RzIHRoZXJlIGFyZSBhZGRpdGlvbmFsIGZhY3RvcnMgYXQgdGhlIGluZGl2aWR1YWwgc2NhbGUgKGUuZy4sIHNleCBvZiB0aGUgYW5pbWFsKSBwb3NzaWJseSBub3QgcHJldmlvdXNseSBtZWFzdXJlZCBvciBzdHVkaWVkLCB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2JhYmlsaXR5IG9mIGZlcnRpbGl0eS4qKg0KDQojIyMgYEhvc3QncyBTZXggKyByYW5kb20gRnhgDQpgYGB7cn0NCiMjIyBTRVggDQptb2QgPC0gZ2xtZXIoZGF0YT1kZiwNCiAgICAgICAgICAgZmVydGlsZS5iaW4gfiAoMXxjb2RlKSArIEhvc3Quc2V4LCBmYW1pbHkgPSAiYmlub21pYWwiKQ0Kc3VtbWFyeShtb2QpDQoNCmBgYCAgDQojIyMgYEN5c3Qgc2l6ZSArIHJhbmRvbSBGeGANCmBgYHtyfQ0KIyMgU2l6ZS1jbSAoSG9zdCBpbmRpdmlkdWFsIHJhbmRvbSBlZmZlY3RzKQ0KbW9kIDwtIGdsbWVyKGRhdGE9ZGYsDQogICAgICAgICAgIGZlcnRpbGUuYmluIH4gKDF8Y29kZSkgKyBzaXplX2NtICwgZmFtaWx5ID0gImJpbm9taWFsIikgIyAiUGlnIiBhcyBgcmFuZG9tIGVmZmVjdGANCnN1bW1hcnkobW9kKQ0KYGBgICANCiogKipBZnRlciBpbmNsdWRpbmcgdGhlIGFuaW1hbCBpZGVudGlmaWVyIGFzIHJhbmRvbSBlZmZlY3QsIG9ubHkgdGhlIHRoZSBzaXplIG9mIHRoZSBjeXN0ICh1bmxpa2UgdGhlIFNleCBvZiB0aGUgaG9zdCkgaXMgYW4gc3VpdGFibGUgY2FuZGlkYXRlIHRvIGV4cGxhaW4gdGhlIHByb2JhYmlsaXR5IG9mIGZlcnRpbGl0eSBvZiBhIGN5c3QgKFA9MC4wNDcpLioqDQoNCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIGVjaG89IEZBTFNFfQ0KcCA8LSBnZ3Bsb3QoZGF0YT1kZiwNCiAgICAgICAgICAgIGFlcyh5PSBmZXJ0aWxlLmJpbikgKQ0KcCA8LSBwICsgDQogIGdlb21fcG9pbnQoYWVzKHg9c2l6ZV9jbSwgY29sPSBIb3N0LnNleCksDQogICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjIsaGVpZ2h0ID0wLjAzKSwNCiAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IFRSVUUpICsNCiAgZ2VvbV9zbW9vdGgoYWVzKHg9c2l6ZV9jbSksDQogICAgICAgICAgICAgIG1ldGhvZD0iZ2xtIiwNCiAgICAgICAgICAgICAgbWV0aG9kLmFyZ3M9bGlzdChmYW1pbHk9ImJpbm9taWFsIiksIHNlID0gVFJVRSkgKw0KICB5bGFiKCJGZXJ0aWxlIikgKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1jKDAsMSksDQogICAgICAgIGxhYmVscz1jKCJObyIsICJZZXMiKSwNCiAgICAgICAgbmFtZT0gIkZlcnRpbGUiKQ0KcA0KYGBgICANCg0KDQpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyMjIEdlbmVyYWxpemVkIExpbmVhciBNb2RlbDogR1JPVVAgY29tcGFyaXNvbg0KbW9kLnNleFhmZXJ0IDwtIGdsbWVyKGRhdGE9ZGYsDQogICAgICAgICAgc2l6ZV9jbSAgfiBhcy5mYWN0b3IoZmVydGlsZS5iaW4pICsgKDF8Y29kZSkgLCBmYW1pbHkgPSAiR2FtbWEiKQ0Kc3VtbWFyeShtb2Quc2V4WGZlcnQpIA0KIyBTZXggb2YgdGhlIHBpZw0KbW9kLnNpemVYc2V4IDwtIGdsbWVyKGRhdGE9ZGYsDQogICAgICAgICAgIHNpemVfY20gfiBIb3N0LnNleCAgKyAoMXxjb2RlKSwgZmFtaWx5ID0gIkdhbW1hIikNCnN1bW1hcnkobW9kLnNpemVYc2V4KSAjIFNleCBhc3NvY2lhdGlvbg0KDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KcHJlZGljdGVkLmZlcnQgPC0gZGF0YS5mcmFtZShjYmluZChkaWFtPWMoMTo1KSkpDQpwcmVkaWN0ZWQuZmVydA0KZXhwKDAuNjY0NCkNCmV4cCgwLjY2NDQpICogcHJlZGljdGVkLmZlcnQkZGlhbQ0KcHJlZGljdGVkLmZlcnQkT1IgPC0gZXhwKDAuNjY0NCkgKiBwcmVkaWN0ZWQuZmVydCRkaWFtDQpleHAoMC42NjQ0ICsgKDEuOTYqMC4zMzU4KSApDQpleHAoMC42NjQ0ICsgKDEuOTYqMC4zMzU4KSApICogcHJlZGljdGVkLmZlcnQkZGlhbQ0KcHJlZGljdGVkLmZlcnQkT1IudXByIDwtIGV4cCgwLjY2NDQgKyAoMS45NiowLjMzNTgpICkgKiBwcmVkaWN0ZWQuZmVydCRkaWFtDQpwcmVkaWN0ZWQuZmVydCRPUi5sd3IgPC0gZXhwKDAuNjY0NCAtICgxLjk2KjAuMzM1OCkgKSAqIHByZWRpY3RlZC5mZXJ0JGRpYW0NCmBgYCAgDQoNCiANCmBgYHtyIGluY2x1ZGU9RkFMU0UsIGVjaG89RkFMU0V9DQojIyMgT1Igb2YgZmVydGlsaXR5IChBc3N1bWluZyBhIGxpbmVhbCBGZXJ0aWxpdHl+U2l6ZSByZWxhdGlvbnNoaXApDQpwIDwtIGdncGxvdChkYXRhPSBkZiwgYWVzKHg9IHNpemVfY20pKSArIA0KICBnZW9tX3BvaW50KHNpemU9MC4zLGRhdGE9IHByZWRpY3RlZC5mZXJ0LCBhZXMoeD0gZGlhbSwgeT0gT1IudXByKSkgKyANCiAgZ2VvbV9wb2ludChzaXplPTAuMyxkYXRhPSBwcmVkaWN0ZWQuZmVydCwgYWVzKHg9IGRpYW0sIHk9IE9SLmx3cikpICsgDQogIGdlb21fcG9pbnQoc2hhcGU9MTcsIHNpemU9IDMsZGF0YT0gcHJlZGljdGVkLmZlcnQsIGFlcyh4PSBkaWFtLCB5PSBPUikpICsgIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxLCBsaW5ldHlwZT0yKSArIA0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLjUsIGxpbmV0eXBlPTMpICsgDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKDEsNSwxMCwxNSkpICsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDAuNSwxLDIsMyw0LDUpLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ3NtYWxsZXN0ICgwLjVjbSknLCcxLjAnLCcyLjAnLCczLjAnLCc0LjAnLCc1LjAnICkpICsNCiAgZ2VvbV9zZWdtZW50KGRhdGE9IHByZWRpY3RlZC5mZXJ0LCBhZXMoeD0gZGlhbSwgeT0gT1IubHdyLCB4ZW5kPSBkaWFtLCB5ZW5kPSBPUi51cHIpKSArIA0KICBnZW9tX2xpbmUoZGF0YT0gcHJlZGljdGVkLmZlcnQsIGFlcyh4PWRpYW0sIHk9T1IpLCBsaW5ldHlwZT0yKSArIA0KICBsYWJzKHRpdGxlPSAnT2RkcyBvZiBjeXN0IGZlcnRpbGl0eSAoQ0kuOTUlKSBkZXBlbmRpbmcgb24gc2l6ZScgLCANCiAgICAgICB4PSAnIlF1aXN0ZSIgc2l6ZSAoY20pJyAgLA0KICAgICAgIHk9Ik9kZHMgUmF0aW8gKGFnYWluc3QgYW55IDwgMWNtKSIpICsNCiAgeGxpbSgwLDUuNSkNCnANCmBgYCAgDQoNCiMjIyBgQ3lzdCBmZXJ0aWxpdHl+YCBgQ3lzdCdzIFNpemUgW1VuaW1vZGFsXWANCmBgYHtyfQ0KIyMgR0xNDQptb2QudW5pbSA8LSBnbG0oZGF0YT1kZiwNCiAgICAgICAgICAgZmVydGlsZS5iaW4gfiAgc2l6ZV9jbSArIEkoc2l6ZV9jbV4yKSwgZmFtaWx5ID0gImJpbm9taWFsIikgDQpzdW1tYXJ5KG1vZC51bmltKQ0KYGBgICANCg0KIyMjIGBPcHRpbXVtIHNpemUgZm9yYCBgQ3lzdCBGZXJ0aWxpdHkgcHJvYmFiaWxpdHlgDQpgYGB7cn0NCiMjIyBVbmltb2RhbCBHTE0NCmIwIDwtIGNvZWYobW9kLnVuaW0pWzFdDQpiMSA8LSBjb2VmKG1vZC51bmltKVsyXQ0KYjIgPC0gY29lZihtb2QudW5pbSlbM10NCiMNCk8gPC0gKC1iMSkgLyAoMipiMikNClQgPC0gMSAvIHNxcnQoLTIqYjIpDQpNIDwtIDEgLyAoMSArIGV4cChiMV4yLyg0KmIyKSAtIGIwKSkNCiMNCk9wdCA8LSByb3VuZChPLCAyKQ0KVC5sd3IgPC0gcm91bmQoTy1ULDIpDQpULnVwciA8LSByb3VuZChPK1QsMikNCk9wdA0KDQpgYGAgIA0KIyMjIEdMTSBtb2RlbA0KYGBge3J9DQpwIDwtIGdncGxvdChkYXRhPSBkZiwgDQogICAgICAgICAgICBhZXMoeT0gZmVydGlsZS5iaW4pKQ0KcCA8LSBwICsNCmdlb21fcG9pbnQoYWVzKHg9c2l6ZV9jbSksDQogICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC4wMiwgaGVpZ2h0ID0gMC4wMDIpLA0KICAgICAgICAgICBzaG93LmxlZ2VuZCA9IFRSVUUpICsNCiAgZ2VvbV9zbW9vdGgoYWVzKHg9IHNpemVfY20pLCANCiAgICAgICAgICAgICAgbWV0aG9kPSJnbG0iLCBmb3JtdWxhID0geSB+IHggKyBJKHheMikgLA0KICAgICAgICAgICAgICBtZXRob2QuYXJncz1saXN0KGZhbWlseT0iYmlub21pYWwiKSwgc2UgPSBUUlVFKSArDQogIHlsYWIoIkZlcnRpbGUiKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3M9YygwLE0sMSksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiTm8iLCJNYXggUHJvYi4iLCAiWWVzIiksDQogICAgICAgICAgICAgICAgICAgICBuYW1lPSAnRmVydGlsaXR5IG9mIGEgY3lzdCAoUHJvYi4pJykgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1jKDEsVC5sd3IsMi43NSwgVC51cHIsIDQsNSksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnMScsYXMuY2hhcmFjdGVyKFQubHdyKSwgYXMuY2hhcmFjdGVyKE9wdCksIGFzLmNoYXJhY3RlcihULnVwciksICc0JywnNScpKSAgKyAgICAgICAgICAgIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9IE0pICsgDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFQudXByLCBsaW5ldHlwZT0yICkgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gVC5sd3IsIGxpbmV0eXBlPTIgKSArIA0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBPcHQgKSArIGxhYnModGl0bGU9ICdDeXN0IGZlcnRpbGl0eSAoVW5pbW9kYWwgcHJvYmFiaWxpdHkpJyAsIHg9ICcoY20pJykNCg0KcA0KYGBgICANCiogKipPcHRpbXVtIHNpemU9IGByIE9wdGBjbS4qKiANCiogKipIaWdoZXN0IHByb2JhYmlsaXR5IHJhbmdlIGZvciBDeXN0IGZlcnRpbGl0eSAoVG9sZXJhbmNlKT0gYHIgVC5sd3JgY20tYHIgVC51cHJgY20uKioNCg0KDQojIyMgVW5pbW9kYWwgTWl4ZWQgTW9kZWwgLSBHTE1NIChSYW5kb20gRWZmZWN0czogSG9zdCBpbmRpdmlkdWFsKSAgDQpgYGB7cn0NCiMjIyBHTE0uTQ0KbW9kLnVuaS5tbSA8LSBnbG1lcihkYXRhPWRmLA0KICAgICAgICAgICBmZXJ0aWxlLmJpbiB+ICgxfGNvZGUpICsgc2l6ZV9jbSArIEkoc2l6ZV9jbV4yKSwgZmFtaWx5ID0gImJpbm9taWFsIikgIyAiUGlnIiBhcyBgcmFuZG9tIGVmZmVjdGANCnN1bW1hcnkobW9kLnVuaS5tbSkNCmBgYCAgDQojIyMNCmBgYHtyfQ0KIyMjIFVuaW1vZGFsIEdMTU0NCmIwIDwtIGZpeGVmKG1vZC51bmkubW0pWzFdDQpiMC5zZSA8LSBzZS5maXhlZihtb2QudW5pLm1tKVsxXQ0KDQpiMSA8LSBmaXhlZihtb2QudW5pLm1tKVsyXQ0KYjEuc2UgPC0gc2UuZml4ZWYobW9kLnVuaS5tbSlbMl0NCg0KYjIgPC0gZml4ZWYobW9kLnVuaS5tbSlbM10NCmIyLnNlIDwtIHNlLmZpeGVmKG1vZC51bmkubW0pWzNdDQoNCk8gPC0gKC1iMSkgLyAoMipiMikNClQgPC0gMSAvIHNxcnQoLTIqYjIpDQpNIDwtIDEgLyAoMSArIGV4cChiMV4yLyg0KmIyKSAtIGIwKSkNCk9wdCA8LSByb3VuZChPLCAyKQ0KVC5sd3IgPC0gcm91bmQoTy1ULDIpDQpULnVwciA8LSByb3VuZChPK1QsMikNCk9wdA0KYGBgICANCg0KIA0KYGBge3J9DQoNCiMjIyBjb2VmZnMgKElDLjkwJSkNCmIwLnVwciA8LSBiMCArICgxLjY0ICpiMC5zZSkNCmIwLmx3ciA8LSBiMCAtICgxLjY0ICpiMC5zZSkNCmIxLnVwciA8LSBiMSArICgxLjY0KmIxLnNlKQ0KYjEubHdyIDwtIGIxIC0gKDEuNjQqYjEuc2UpDQpiMi51cHIgPC0gYjIgKyAoMS42NCpiMi5zZSkNCmIyLmx3ciA8LSBiMiAtICgxLjY0KmIyLnNlKQ0KIyBwcmVkaWN0DQpYIDwtIHNlcSgwLDUsIGxlbmd0aC5vdXQ9MTAwKQ0KWS5wcmVkIDwtIGV4cChiMCArIGIxKiBYICsgYjIqKFheMikgKSAvIA0KICAoMSArIGV4cChiMCArIGIxKlggKyBiMiooWF4yKSApICkgDQpZLnByZWQudXByIDwtIGV4cChiMC51cHIgKyBiMS51cHIqIFggKyBiMi51cHIqKFheMikgKSAvIA0KICAoMSArIGV4cChiMC51cHIgKyBiMS51cHIqWCArIGIyLnVwciooWF4yKSApICkgDQpZLnByZWQubHdyIDwtIGV4cChiMC5sd3IgKyBiMS5sd3IqIFggKyBiMi5sd3IqKFheMikgKSAvIA0KICAoMSArIGV4cChiMC5sd3IgKyBiMS5sd3IqWCArIGIyLmx3ciooWF4yKSApICkNCnByZWRpY3QgPC0gZGF0YS5mcmFtZShjYmluZChYKSkNCnByZWRpY3QkdW5pbW9kLlkgPC0gWS5wcmVkDQpwcmVkaWN0JHVuaW1vZC5ZLnVwciA8LSBZLnByZWQudXByDQpwcmVkaWN0JHVuaW1vZC5ZLmx3ciA8LSBZLnByZWQubHdyDQojIHBsb3QNCnAgPC0gZ2dwbG90KGRhdGE9IHByZWRpY3QsIA0KICAgICAgICAgICAgYWVzKHk9IHVuaW1vZC5ZKSkNCnAgPC0gcCArDQojICBnZW9tX3BvaW50KGFlcyh4PVgpLA0KICMgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IFRSVUUpICsNCiAgZ2VvbV9saW5lKGNvbD0iYmx1ZSIsIGxpbmV3aWR0aD0gMC44LCBkYXRhPSBwcmVkaWN0LA0KICAgICAgICAgICAgYWVzKHg9WCwgeT0gdW5pbW9kLlkpKSArDQogICNnZW9tX2xpbmUoY29sPSJncmF5IiwgbGluZXdpZHRoPSAwLjgsIGRhdGE9IHByZWRpY3QsDQogICAjICAgICAgICAgYWVzKHg9WCwgeT0gdW5pbW9kLlkudXByKSkgKw0KICAjZ2VvbV9saW5lKGNvbD0iZ3JheSIsIGxpbmV3aWR0aD0gMC44LCBkYXRhPSBwcmVkaWN0LA0KICAgIyAgICAgICAgIGFlcyh4PVgsIHk9IHVuaW1vZC5ZLmx3cikpICsNCg0KICAgICNnZW9tX3BvaW50KGNvbD0iYmx1ZSIsIHNpemU9IDAuNSxkYXRhPSBwcmVkaWN0LA0KICAgIyAgICAgICAgIGFlcyh4PVgsIHk9IHVuaW1vZC5ZKSkgKyANCiMgIHNjYWxlX3lfYnJlYWsoYygwLjE0LDAuOTc1KSkgDQogIA0KI2dlb21fc21vb3RoKGFlcyh4PSBzaXplX2NtKSwgbWV0aG9kPSJnbG0iLCBmb3JtdWxhID0geSB+IHggKyBJKHheMikgLA0KICMgICAgICAgICAgIG1ldGhvZC5hcmdzPWxpc3QoZmFtaWx5PSJiaW5vbWlhbCIpLCBzZSA9IFRSVUUpICsNCiAgeWxhYigiRmVydGlsZSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1jKDAsTSwxKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJObyIsIk1heCBQcm9iLiIsICJZZXMiKSwNCiAgICAgICAgICAgICAgICAgICAgIG5hbWU9ICdGZXJ0aWxpdHkgb2YgYSAicXVpc3RlIiAoUHJvYi4pJykgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPWMoMSwgVC5sd3IsT3B0LCBULnVwciw1KSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCcxJyxhcy5jaGFyYWN0ZXIoVC5sd3IpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIoT3B0KSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcihULnVwciksICc1JykpICArDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0gTSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBULmx3ciwgbGluZXR5cGU9MiApICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gVC51cHIsIGxpbmV0eXBlPTIgKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IE8gKSArDQogIGxhYnModGl0bGU9ICdDeXN0IGZlcnRpbGl0eSAoVW5pbW9kYWwgcHJvYmFiaWxpdHkpIG1peGVkIG1vZGVsJyAsIHg9ICcoY20pJykNCiMNCnANCmBgYCAgDQoNCiogKipPcHRpbXVtIHNpemU9IGByIE9wdGBjbS4qKiANCiogKipIaWdoZXN0IHByb2JhYmlsaXR5IHJhbmdlIGZvciBDeXN0IGZlcnRpbGl0eSAoVG9sZXJhbmNlKT0gYHIgVC5sd3JgY20tYHIgVC51cHJgY20uKioNCg==