Breitwieser et al. (2016) surveyed variegated scallops, Mimachlamys varia, living at several sites along the French Atlantic coast. Four sites were chosen (factor site); three sites were chosen because they were potentially contaminated, with different sources of contaminants, and a fourth site was considered relatively clean (and considered a reference site). The authors sampled scallops at two times of the year (March and September), chosen to correspond to before and at the end of the scallop’s reproductive season. These two times were levels of the factor season (although strictly these levels represent two different sampling times that may or may not reflect seasonal differences). Breitwieser and colleagues measured several variables to assess the condition of scallops, and here we use their data using a biomarker, Malondialdehyde (MDA). MDA is a stress marker and was measured (μM/g fresh tissue) in ten scallops from each combination of site and season. A two-factor linear model (7.3) including the fixed main effects of site and season and their interaction was fitted to these data.

Dugornay Olivier (2020). Ifremer. CC BY-SA 4.0

Breitwieser, M., et al. (2016). Short-term and long-term biological effects of chronic chemical contamination on natural populations of a marine bivalve. PLoS One, 11, e0150184. The paper is here

Preliminaries

First, load the required packages (car, effectsizes, afex) + ggplot2, patchwork

Import breit data file (breit.csv)

breit <- read.csv("../data/breit.csv")
#For convenience, the original data file has one site as Port-Neuf. R dislikes arithmetic operators in characters, so recode site
breit$site <- case_match(
    breit$site,
    "Port-Neuf" ~ "Port Neuf",
    .default = breit$site
    )
head(breit,10)

Initial look at raw data

Start with boxplot

boxplot(mda~group,data=breit)

Fit model to untransformed data and check residuals

breit.aov<-aov(mda~site*season, data=breit)
plot(breit.aov)

Transform response to logs & redo diagnostics

Boxplots

breit$lmda<- log10(breit$mda) 
boxplot(lmda~group,data=breit)

Refit model with log data and check residuals

lbreit.aov<-aov(lmda~site*season, data=breit)
plot(lbreit.aov)

Analysis with untransformed data

Some oddities in the boxplots, but no real improvement when log-transforming, so go with original data

summary(breit.aov)
            Df Sum Sq Mean Sq F value  Pr(>F)   
site         3  13946    4649   3.088 0.03244 * 
season       1  14018   14018   9.313 0.00319 **
site:season  3  13131    4377   2.908 0.04038 * 
Residuals   72 108378    1505                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Get effect size measures (sjstats package)

effectsize(breit.aov)
# Effect Size for ANOVA (Type I)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
site        |           0.11 | [0.01, 1.00]
season      |           0.11 | [0.02, 1.00]
site:season |           0.11 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Interaction plot

interaction.plot(breit$site,breit$season,breit$mda)

afex_plot(breit.aov, "site", "season", dodge=0.1, data_plot=FALSE)+theme_light()
dv column detected: mda
No id column passed. Assuming all rows are independent samples.

Simple main effects - effect of site in March

breitmar.aov <- aov(mda~site, data = breit, subset = c(season == 'march')) 
# Anova() function from car package tests simple main effect against original error term from 2 factor model 
Anova(lm(breitmar.aov), lm(breit.aov), type=3)
Anova Table (Type III tests)

Response: mda
            Sum Sq Df  F value    Pr(>F)    
(Intercept) 157314  1 104.5100 1.153e-15 ***
site          5524  3   1.2232    0.3075    
Residuals   108378 72                       
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Effect of site in September

breitsep.aov <- aov(mda~site, data = breit, subset=c(season == 'sept')) 
Anova(lm(breitsep.aov), lm(breit.aov), type = 3)
Anova Table (Type III tests)

Response: mda
            Sum Sq Df F value    Pr(>F)    
(Intercept)  99509  1 66.1074 8.744e-12 ***
site         21553  3  4.7727  0.004328 ** 
Residuals   108378 72                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Now include contrast between Loix and average of rest

Note that the book has an error and the original code we provided treated Les Palles, rather than Loix, as the reference cite.

breit$site <- factor(breit$site)
contrasts(breit$site)<- c(1,-3,1,1)    #This is a correction from the original listed contrast of -3/1/1/1
contrasts(breit$site)
           [,1]          [,2]          [,3]
Les Palles    1 -5.773503e-01 -5.773503e-01
Loix         -3 -2.775558e-17  2.775558e-17
Minimes       1  7.886751e-01 -2.113249e-01
Port Neuf     1 -2.113249e-01  7.886751e-01
breit2.aov <- aov(mda~site*season, data = breit)

summary.lm(breit2.aov)

Call:
aov(formula = mda ~ site * season, data = breit)

Residuals:
    Min      1Q  Median      3Q     Max 
-60.828 -24.762  -3.249  14.991 171.602 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)      133.7895     6.1344  21.810  < 2e-16 ***
site1              4.1408     3.5417   1.169  0.24620    
site2             18.3149    12.2689   1.493  0.13986    
site3              3.3449    12.2689   0.273  0.78591    
seasonsept       -26.4748     8.6754  -3.052  0.00319 ** 
site1:seasonsept   0.6624     5.0088   0.132  0.89515    
site2:seasonsept -36.3224    17.3508  -2.093  0.03984 *  
site3:seasonsept  36.0776    17.3508   2.079  0.04115 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 38.8 on 72 degrees of freedom
Multiple R-squared:  0.2749,    Adjusted R-squared:  0.2044 
F-statistic:   3.9 on 7 and 72 DF,  p-value: 0.001176

Figure

Residual plot

p1<-ggplot(breit.aov, aes(x = breit.aov$fitted.values, y = breit.aov$residuals)) +
  geom_point(color=sc) +
  theme_classic(base_size = 10)+
  theme(
    axis.text = element_text(colour = ac),
    axis.line = element_line(color = ac),
    axis.ticks = element_line(color = ac),
        )+labs(x = "Predicted", y = "Residuals"
       )
p1<-p1+ annotate ("text", x=95, y=170, label="Untransformed")
p1

p3<-ggplot(lbreit.aov, aes(x = lbreit.aov$fitted.values, y = lbreit.aov$residuals)) +
  geom_point(color=sc) +
  theme_classic(base_size = 10)+
  theme(
    axis.text = element_text(colour = ac),
    axis.line = element_line(color = ac),
    axis.ticks = element_line(color = ac))+
  labs(x = "Predicted", y = "Residuals"
       )
p3<-p3 + annotate ("text", x=1.96, y=0.35, label="Log-transformed")
p3

Interaction plot

breit2<-summarySE(data=breit,measurevar="mda", groupvars=c("site", "season"))
p5<-ggplot(breit2, aes(x = site, y = mda, fill = season)) +
  geom_errorbar(aes(ymin = mda-se, ymax = mda+se), width=0, position = position_dodge(width=0.6)) +
  geom_bar(stat = "identity", width=.6, position = position_dodge(width=0.6), color=lc) +
  scale_fill_uchicago(na.value = "red",labels = c("March", "September"))+
  scale_y_continuous(expand = c(0,0))+
  scale_x_discrete(labels = str_wrap(c("Les Palles", "Loix", "Minimes", "Port Neuf"), width = 7))+
  labs(x = NULL, y = "MDA")+
    theme_qk()+
    theme(
    axis.text.x = element_text(colour = lc, size=8),
    legend.key.size = unit(0.35, 'cm'), #change legend key size
#        legend.key.height = unit(1, 'cm'), #change legend key height
#        legend.key.width = unit(1, 'cm'), #change legend key width
 #       legend.title = element_text(size=14), #change legend title font size
#        legend.text = element_text(size=10)) #change legend text font size
  legend.position = "right",
  legend.title = element_blank(),
  legend.text=element_text(size=7),
  )+
theme(
  legend.position = c(.5, .95),
  legend.justification = c("right", "top"),
  legend.box.just = "right",
  legend.margin = margin(6, 6, 6, 6),
  legend.title = element_blank()
)
p5

Combine figures

p1+p3+p5+plot_layout(widths = c(1,1,2))

LS0tCnRpdGxlOiAiUUsgQm94IDcuMiIKCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBmbGF0bHkKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCkJyZWl0d2llc2VyIGV0IGFsLiAoMjAxNikgc3VydmV5ZWQgdmFyaWVnYXRlZCBzY2FsbG9wcywgKk1pbWFjaGxhbXlzIHZhcmlhKiwgbGl2aW5nIGF0IHNldmVyYWwgc2l0ZXMgYWxvbmcgdGhlIEZyZW5jaCBBdGxhbnRpYyBjb2FzdC4gRm91ciBzaXRlcyB3ZXJlIGNob3NlbiAoZmFjdG9yIHNpdGUpOyB0aHJlZSBzaXRlcyB3ZXJlIGNob3NlbiBiZWNhdXNlIHRoZXkgd2VyZSBwb3RlbnRpYWxseSBjb250YW1pbmF0ZWQsIHdpdGggZGlmZmVyZW50IHNvdXJjZXMgb2YgY29udGFtaW5hbnRzLCBhbmQgYSBmb3VydGggc2l0ZSB3YXMgY29uc2lkZXJlZCByZWxhdGl2ZWx5IGNsZWFuIChhbmQgY29uc2lkZXJlZCBhIHJlZmVyZW5jZSBzaXRlKS4gVGhlIGF1dGhvcnMgc2FtcGxlZCBzY2FsbG9wcyBhdCB0d28gdGltZXMgb2YgdGhlIHllYXIgKE1hcmNoIGFuZCBTZXB0ZW1iZXIpLCBjaG9zZW4gdG8gY29ycmVzcG9uZCB0byBiZWZvcmUgYW5kIGF0IHRoZSBlbmQgb2YgdGhlIHNjYWxsb3AncyByZXByb2R1Y3RpdmUgc2Vhc29uLiBUaGVzZSB0d28gdGltZXMgd2VyZSBsZXZlbHMgb2YgdGhlIGZhY3RvciBzZWFzb24gKGFsdGhvdWdoIHN0cmljdGx5IHRoZXNlIGxldmVscyByZXByZXNlbnQgdHdvIGRpZmZlcmVudCBzYW1wbGluZyB0aW1lcyB0aGF0IG1heSBvciBtYXkgbm90IHJlZmxlY3Qgc2Vhc29uYWwgZGlmZmVyZW5jZXMpLiBCcmVpdHdpZXNlciBhbmQgY29sbGVhZ3VlcyBtZWFzdXJlZCBzZXZlcmFsIHZhcmlhYmxlcyB0byBhc3Nlc3MgdGhlIGNvbmRpdGlvbiBvZiBzY2FsbG9wcywgYW5kIGhlcmUgd2UgdXNlIHRoZWlyIGRhdGEgdXNpbmcgYSBiaW9tYXJrZXIsIE1hbG9uZGlhbGRlaHlkZSAoTURBKS4gTURBIGlzIGEgc3RyZXNzIG1hcmtlciBhbmQgd2FzIG1lYXN1cmVkICjOvE0vZyBmcmVzaCB0aXNzdWUpIGluIHRlbiBzY2FsbG9wcyBmcm9tIGVhY2ggY29tYmluYXRpb24gb2Ygc2l0ZSBhbmQgc2Vhc29uLiBBIHR3by1mYWN0b3IgbGluZWFyIG1vZGVsICg3LjMpIGluY2x1ZGluZyB0aGUgZml4ZWQgbWFpbiBlZmZlY3RzIG9mIHNpdGUgYW5kIHNlYXNvbiBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gd2FzIGZpdHRlZCB0byB0aGVzZSBkYXRhLgoKIVtdKC4uL21lZGlhLzMxMTQ2LmpwZyl7d2lkdGg9IjYwMCJ9CgpEdWdvcm5heSBPbGl2aWVyICgyMDIwKS4gW0lmcmVtZXJdKGh0dHBzOi8vaW1hZ2UuaWZyZW1lci5mci9kYXRhLzAwNjY0Lzc3NjE5LykuIFtDQyBCWS1TQSA0LjBdKGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjApey51cml9CgoKCkJyZWl0d2llc2VyLCBNLiwgKmV0IGFsLiogKDIwMTYpLiBTaG9ydC10ZXJtIGFuZCBsb25nLXRlcm0gYmlvbG9naWNhbCBlZmZlY3RzIG9mIGNocm9uaWMgY2hlbWljYWwgY29udGFtaW5hdGlvbiBvbiBuYXR1cmFsIHBvcHVsYXRpb25zIG9mIGEgbWFyaW5lIGJpdmFsdmUuICpQTG9TIE9uZSosIDExLCBlMDE1MDE4NC4gVGhlIHBhcGVyIGlzIFtoZXJlXShodHRwczovL2RvaS5vcmcvMTAuMTM3MS9qb3VybmFsLnBvbmUuMDE1MDE4NCkKCiMjIyBQcmVsaW1pbmFyaWVzCgpGaXJzdCwgbG9hZCB0aGUgcmVxdWlyZWQgcGFja2FnZXMgKGNhciwgZWZmZWN0c2l6ZXMsIGFmZXgpICsgZ2dwbG90MiwgcGF0Y2h3b3JrCgpgYGB7ciBpbmNsdWRlPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30Kc291cmNlKCIuLi9SL2xpYnJhcmllcy5SIikgICAjVGhpcyBpcyB0aGUgY29tbW9uIGxpYnJhcnkKYGBgCgpJbXBvcnQgYnJlaXQgZGF0YSBmaWxlIChicmVpdC5jc3YpCgpgYGB7cn0KYnJlaXQgPC0gcmVhZC5jc3YoIi4uL2RhdGEvYnJlaXQuY3N2IikKI0ZvciBjb252ZW5pZW5jZSwgdGhlIG9yaWdpbmFsIGRhdGEgZmlsZSBoYXMgb25lIHNpdGUgYXMgUG9ydC1OZXVmLiBSIGRpc2xpa2VzIGFyaXRobWV0aWMgb3BlcmF0b3JzIGluIGNoYXJhY3RlcnMsIHNvIHJlY29kZSBzaXRlCmJyZWl0JHNpdGUgPC0gY2FzZV9tYXRjaCgKICAgIGJyZWl0JHNpdGUsCiAgICAiUG9ydC1OZXVmIiB+ICJQb3J0IE5ldWYiLAogICAgLmRlZmF1bHQgPSBicmVpdCRzaXRlCiAgICApCmhlYWQoYnJlaXQsMTApCmBgYAoKIyMjIEluaXRpYWwgbG9vayBhdCByYXcgZGF0YQoKU3RhcnQgd2l0aCBib3hwbG90CgpgYGB7ciB9CmJveHBsb3QobWRhfmdyb3VwLGRhdGE9YnJlaXQpCmBgYAoKIyMjIyBGaXQgbW9kZWwgdG8gdW50cmFuc2Zvcm1lZCBkYXRhIGFuZCBjaGVjayByZXNpZHVhbHMKCmBgYHtyIH0KYnJlaXQuYW92PC1hb3YobWRhfnNpdGUqc2Vhc29uLCBkYXRhPWJyZWl0KQpwbG90KGJyZWl0LmFvdikKYGBgCgojIyMgVHJhbnNmb3JtIHJlc3BvbnNlIHRvIGxvZ3MgJiByZWRvIGRpYWdub3N0aWNzCgpCb3hwbG90cwoKYGBge3IgfQpicmVpdCRsbWRhPC0gbG9nMTAoYnJlaXQkbWRhKSAKYm94cGxvdChsbWRhfmdyb3VwLGRhdGE9YnJlaXQpCmBgYAoKIyMjIFJlZml0IG1vZGVsIHdpdGggbG9nIGRhdGEgYW5kIGNoZWNrIHJlc2lkdWFscwoKYGBge3IgfQpsYnJlaXQuYW92PC1hb3YobG1kYX5zaXRlKnNlYXNvbiwgZGF0YT1icmVpdCkKcGxvdChsYnJlaXQuYW92KQpgYGAKCiMjIEFuYWx5c2lzIHdpdGggdW50cmFuc2Zvcm1lZCBkYXRhCgpTb21lIG9kZGl0aWVzIGluIHRoZSBib3hwbG90cywgYnV0IG5vIHJlYWwgaW1wcm92ZW1lbnQgd2hlbiBsb2ctdHJhbnNmb3JtaW5nLCBzbyBnbyB3aXRoIG9yaWdpbmFsIGRhdGEKCmBgYHtyIH0Kc3VtbWFyeShicmVpdC5hb3YpCmBgYAoKR2V0IGVmZmVjdCBzaXplIG1lYXN1cmVzIChzanN0YXRzIHBhY2thZ2UpCgpgYGB7ciB9CmVmZmVjdHNpemUoYnJlaXQuYW92KQpgYGAKCiMjIyBJbnRlcmFjdGlvbiBwbG90CgpgYGB7ciB9CmludGVyYWN0aW9uLnBsb3QoYnJlaXQkc2l0ZSxicmVpdCRzZWFzb24sYnJlaXQkbWRhKQphZmV4X3Bsb3QoYnJlaXQuYW92LCAic2l0ZSIsICJzZWFzb24iLCBkb2RnZT0wLjEsIGRhdGFfcGxvdD1GQUxTRSkrdGhlbWVfbGlnaHQoKQpgYGAKCiMjIyBTaW1wbGUgbWFpbiBlZmZlY3RzIC0gZWZmZWN0IG9mIHNpdGUgaW4gTWFyY2gKCmBgYHtyfQpicmVpdG1hci5hb3YgPC0gYW92KG1kYX5zaXRlLCBkYXRhID0gYnJlaXQsIHN1YnNldCA9IGMoc2Vhc29uID09ICdtYXJjaCcpKSAKIyBBbm92YSgpIGZ1bmN0aW9uIGZyb20gY2FyIHBhY2thZ2UgdGVzdHMgc2ltcGxlIG1haW4gZWZmZWN0IGFnYWluc3Qgb3JpZ2luYWwgZXJyb3IgdGVybSBmcm9tIDIgZmFjdG9yIG1vZGVsIApBbm92YShsbShicmVpdG1hci5hb3YpLCBsbShicmVpdC5hb3YpLCB0eXBlPTMpCmBgYAoKIyMjIEVmZmVjdCBvZiBzaXRlIGluIFNlcHRlbWJlcgoKYGBge3J9CmJyZWl0c2VwLmFvdiA8LSBhb3YobWRhfnNpdGUsIGRhdGEgPSBicmVpdCwgc3Vic2V0PWMoc2Vhc29uID09ICdzZXB0JykpIApBbm92YShsbShicmVpdHNlcC5hb3YpLCBsbShicmVpdC5hb3YpLCB0eXBlID0gMykKYGBgCgojIyMgTm93IGluY2x1ZGUgY29udHJhc3QgYmV0d2VlbiBMb2l4IGFuZCBhdmVyYWdlIG9mIHJlc3QKTm90ZSB0aGF0IHRoZSBib29rIGhhcyBhbiBlcnJvciBhbmQgdGhlIG9yaWdpbmFsIGNvZGUgd2UgcHJvdmlkZWQgdHJlYXRlZCBMZXMgUGFsbGVzLCByYXRoZXIgdGhhbiBMb2l4LCBhcyB0aGUgcmVmZXJlbmNlIGNpdGUuCgpgYGB7ciB9CmJyZWl0JHNpdGUgPC0gZmFjdG9yKGJyZWl0JHNpdGUpCmNvbnRyYXN0cyhicmVpdCRzaXRlKTwtIGMoMSwtMywxLDEpICAgICNUaGlzIGlzIGEgY29ycmVjdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCBsaXN0ZWQgY29udHJhc3Qgb2YgLTMvMS8xLzEKY29udHJhc3RzKGJyZWl0JHNpdGUpCgpicmVpdDIuYW92IDwtIGFvdihtZGF+c2l0ZSpzZWFzb24sIGRhdGEgPSBicmVpdCkKCnN1bW1hcnkubG0oYnJlaXQyLmFvdikKYGBgCgojIyMgRmlndXJlCgpgYGB7ciBpbmNsdWRlID0gRkFMU0UsIHJlc3VsdHMgPSAnaGlkZSd9CnNvdXJjZSgiLi4vUi9hcHBlYXJhbmNlLlIiKSAgICNUaGlzIGlzIHRoZSBjb21tb24gbGlicmFyeSBvZiBncmFwaGljcyB0d2Vha3MsIGRlZmluaW5nIHRoZSBxayB0aGVtZQpgYGAKClJlc2lkdWFsIHBsb3QKCmBgYHtyfQpwMTwtZ2dwbG90KGJyZWl0LmFvdiwgYWVzKHggPSBicmVpdC5hb3YkZml0dGVkLnZhbHVlcywgeSA9IGJyZWl0LmFvdiRyZXNpZHVhbHMpKSArCiAgZ2VvbV9wb2ludChjb2xvcj1zYykgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTApKwogIHRoZW1lKAogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IGFjKSwKICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9IGFjKSwKICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSBhYyksCiAgICAgICAgKStsYWJzKHggPSAiUHJlZGljdGVkIiwgeSA9ICJSZXNpZHVhbHMiCiAgICAgICApCnAxPC1wMSsgYW5ub3RhdGUgKCJ0ZXh0IiwgeD05NSwgeT0xNzAsIGxhYmVsPSJVbnRyYW5zZm9ybWVkIikKcDEKCmBgYAoKYGBge3J9CnAzPC1nZ3Bsb3QobGJyZWl0LmFvdiwgYWVzKHggPSBsYnJlaXQuYW92JGZpdHRlZC52YWx1ZXMsIHkgPSBsYnJlaXQuYW92JHJlc2lkdWFscykpICsKICBnZW9tX3BvaW50KGNvbG9yPXNjKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxMCkrCiAgdGhlbWUoCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gYWMpLAogICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gYWMpLAogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9IGFjKSkrCiAgbGFicyh4ID0gIlByZWRpY3RlZCIsIHkgPSAiUmVzaWR1YWxzIgogICAgICAgKQpwMzwtcDMgKyBhbm5vdGF0ZSAoInRleHQiLCB4PTEuOTYsIHk9MC4zNSwgbGFiZWw9IkxvZy10cmFuc2Zvcm1lZCIpCnAzCmBgYAoKSW50ZXJhY3Rpb24gcGxvdAoKYGBge3J9CmJyZWl0Mjwtc3VtbWFyeVNFKGRhdGE9YnJlaXQsbWVhc3VyZXZhcj0ibWRhIiwgZ3JvdXB2YXJzPWMoInNpdGUiLCAic2Vhc29uIikpCnA1PC1nZ3Bsb3QoYnJlaXQyLCBhZXMoeCA9IHNpdGUsIHkgPSBtZGEsIGZpbGwgPSBzZWFzb24pKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1kYS1zZSwgeW1heCA9IG1kYStzZSksIHdpZHRoPTAsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGg9MC42KSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aD0uNiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjYpLCBjb2xvcj1sYykgKwogIHNjYWxlX2ZpbGxfdWNoaWNhZ28obmEudmFsdWUgPSAicmVkIixsYWJlbHMgPSBjKCJNYXJjaCIsICJTZXB0ZW1iZXIiKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSkrCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBzdHJfd3JhcChjKCJMZXMgUGFsbGVzIiwgIkxvaXgiLCAiTWluaW1lcyIsICJQb3J0IE5ldWYiKSwgd2lkdGggPSA3KSkrCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJNREEiKSsKICAgIHRoZW1lX3FrKCkrCiAgICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9IGxjLCBzaXplPTgpLAogICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjM1LCAnY20nKSwgI2NoYW5nZSBsZWdlbmQga2V5IHNpemUKIyAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDEsICdjbScpLCAjY2hhbmdlIGxlZ2VuZCBrZXkgaGVpZ2h0CiMgICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDEsICdjbScpLCAjY2hhbmdlIGxlZ2VuZCBrZXkgd2lkdGgKICMgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQpLCAjY2hhbmdlIGxlZ2VuZCB0aXRsZSBmb250IHNpemUKIyAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCkpICNjaGFuZ2UgbGVnZW5kIHRleHQgZm9udCBzaXplCiAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwKICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9NyksCiAgKSsKdGhlbWUoCiAgbGVnZW5kLnBvc2l0aW9uID0gYyguNSwgLjk1KSwKICBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoInJpZ2h0IiwgInRvcCIpLAogIGxlZ2VuZC5ib3guanVzdCA9ICJyaWdodCIsCiAgbGVnZW5kLm1hcmdpbiA9IG1hcmdpbig2LCA2LCA2LCA2KSwKICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkKKQpwNQpgYGAKCkNvbWJpbmUgZmlndXJlcwoKYGBge3J9CnAxK3AzK3A1K3Bsb3RfbGF5b3V0KHdpZHRocyA9IGMoMSwxLDIpKQpgYGAK