Redox Lab


Markdown Author: Jessie Bell

Download this Rmd: Top right corner → Code → Download Rmd

1

Where might you expect to see the lowest and highest redox values? Explain your answer.

I anticipated observing elevated glucose levels in the sediments (~1-10 cm) due to the presence of rhizomes in the eelgrass. I thought that with increased glucose concentration, deeper sediment layers would exhibit the lowest redox values, as unused glucose would be pushed further down. Conversely, I expected mudflats, devoid of glucose, to display the highest redox values due to the absence of microbial activity prompted by glucose availability.

However, the data revealed no statistically significant differences among locations in terms of redox reactions. This lack of variance is likely attributable to the limited number of measurements. With a more extensive dataset, I think that my original hypotheses would have been confirmed. Notably, the recorded values ranged from 249 mV at a depth of 15 cm in a mudflat to 165 mV at the same depth beneath Z. japonica. All areas measured electron acceptors of both Manganese III and Iron III.

2

Perform a 2 factor ANOVA (depth x habitat) to determine if there is any significant depth or habitat effect. If there are differences and, if you know how, use a post-hoc test (i.e. Bonferonni), to detect differences between each combination of factors. You can also use multiple t-tests instead of ANOVA, but beware of Type 1 errors. Show you work.

The redox dataset collected by Dr. Rybczyk’s ESCI 522 course on May 9, 2024 at Padilla Bay Estuary shows no evidence that mean reduction/oxidation (eH) differed among either of the 4 habitat types: Mudflat 1 cm depth, Mudflat 15 cm depth, Z. japonica 1 cm depth, and Z. japonica 15 cm depth (\(F_{1, 18}\) = 1.651, p>0.05).

All work can be found below.

redox2 <- read.csv("redox_take2.csv")

redox <- read.csv("redox.csv")


ggplot()+
  geom_boxplot(redox, mapping=aes(Habitat, correctedEH, color=Habitat))
**Figure 1:** Showing redox (mV) for two habitat types, mudflat and eelgrass at Padilla Bay Estuary (5/9/24). A two sample t-test provides insufficient evidence that the mean redox values are different enough and we fail to reject H0 (t2,19.8 = -1.3205; two-tailed P > 0.05) that the μ mudflat is greater than H0: μ = 201.68.

Figure 1: Showing redox (mV) for two habitat types, mudflat and eelgrass at Padilla Bay Estuary (5/9/24). A two sample t-test provides insufficient evidence that the mean redox values are different enough and we fail to reject H0 (t2,19.8 = -1.3205; two-tailed P > 0.05) that the μ mudflat is greater than H0: μ = 201.68.

ggplot(redox2, aes(Habitat, correctedEH, color=Habitat))+
  geom_boxplot()
**Figure 2:** Showing redox (mV) for two habitat types and depths, mudflat and eelgrass at 1 cm and 15 cm for both at Padilla Bay Estuary (5/9/24). The redox dataset shows no evidence that mean reduction/oxidation (EH) differed among either of the 4 habitat types: Mudflat 1 cm depth, Mudflat 15 cm depth, *Z. japonica* 1 cm depth, and *Z. japonica* 15 cm depth ($F_{1, 18}$ = 1.651, p>0.05).

Figure 2: Showing redox (mV) for two habitat types and depths, mudflat and eelgrass at 1 cm and 15 cm for both at Padilla Bay Estuary (5/9/24). The redox dataset shows no evidence that mean reduction/oxidation (EH) differed among either of the 4 habitat types: Mudflat 1 cm depth, Mudflat 15 cm depth, Z. japonica 1 cm depth, and Z. japonica 15 cm depth (\(F_{1, 18}\) = 1.651, p>0.05).

Data Exploration

gt(redox)%>%
  tab_options(table.font.size = px(10L))%>%
  cols_label(
    Habitat=md("**Habitat**"),
    depth_cm = md("**Depth (cm)**"),
    uncorrectedEH = md("**Uncorrected Eh**"),
    correctedEH = md("**Corrected Eh**"))%>%
  opt_table_font("Corbel")%>%
  opt_interactive(
    page_size_default = 5 
  )

Summary Statistics

mudflat <- subset(redox, Habitat=="Mudflat")

japonica <- subset(redox, Habitat=="Zostera japonica")

mudflat_surface <- subset(mudflat, depth_cm=="1")
mudflat_15 <- subset(mudflat, depth_cm=="15")
japonica_surface <- subset(japonica, depth_cm=="1")
japonica_15 <- subset(japonica, depth_cm=="15")

ms <- mean(mudflat_surface$correctedEH)
sems <- sd(mudflat_surface$correctedEH)/(sqrt(length(mudflat_surface$correctedEH)))
m15 <- mean(mudflat_15$correctedEH)
sem15 <- sd(mudflat_15$correctedEH)/(sqrt(length(mudflat_15$correctedEH)))

js <- mean(japonica_surface$correctedEH)
sejs <- sd(japonica_surface$correctedEH)/(sqrt(length(japonica_surface$correctedEH)))
j15 <- mean(japonica_15$correctedEH)
sej15 <- sd(japonica_15$correctedEH)/(sqrt(length(japonica_15$correctedEH)))

Mean <- rbind(ms, m15, js, j15)
sd <- rbind(sems, sem15, sejs, sej15)
Habitat <- cbind(c("Zostera japonica", "", "Mudflat", ""))

Depth <- cbind(c("1", "15", "1", "15"))

e_acceptor <- rbind("Fe +++", "Fe+++", "Fe+++", "Mn+++")

summarystats <- as.data.frame(cbind(Habitat, Depth, Mean, sd, e_acceptor))
summarystats <- type.convert(summarystats, as.is = TRUE)

colnames(summarystats) <- c("Habitat","Depth (cm)", "Mean Eh", "SE Eh", "e- Acceptor")


gt(summarystats)|>
  tab_options(table.font.size = px(10L))%>%
  opt_table_font("Corbel")%>%
  opt_stylize(style=4)%>%
  fmt_number(columns = where(is.numeric), n_sigfig = 3, drop_trailing_zeros = T)
Habitat Depth (cm) Mean Eh SE Eh e- Acceptor
Zostera japonica 1.00 189 33.9 Fe +++
15.0 165 45.1 Fe+++
Mudflat 1.00 205 38.4 Fe+++
15.0 249 25.5 Mn+++

Assumptions

Normality

Zostera japonica has a left skew and I attempted to do a square root transformation on the data to no avail. I am assuming that if we would have sampled more, our data would follow the assumption of normality better. I think that the mudflat data looks normal enough.

par(mfrow = c(1,2))


hist(mudflat$correctedEH, col="steelblue", main="Mudflat Eh", xlab="Oxidation Reduction Potential (Eh)")

hist((japonica$correctedEH), col="plum", main="Z. japonica Eh", xlab="Oxidation Reduction Potential (Eh)") #skewed left...might need to correct this. 

Homoscedasticity

Data follows the rules and seems to have close to equal variance.

par(mfrow = c(1,2))

boxplot(mudflat$correctedEH, col="steelblue", main="Mudflat Eh", ylab="Oxidation Reduction Potential (Eh)")

boxplot(japonica$correctedEH, col="plum", main="Z. japonica Eh", ylab="Oxidation Reduction Potential (Eh)")

Two-way ANOVA

Statistical Hypotheses

\(H_0\): \(\mu_{mf1}\) = \(\mu_{mf15}\) = \(\mu_{zj1}\) = \(\mu_{zj15}\)

\(H_a\): At least one mean above is not equal to the others.

\(\alpha=0.5\)

#with interaction
redox.aov.interaction <- aov(correctedEH ~Habitat*as.factor(depth_cm), data=redox)
summary(redox.aov.interaction)
##                             Df Sum Sq Mean Sq F value Pr(>F)
## Habitat                      1  12149   12149   1.651  0.215
## as.factor(depth_cm)          1    519     519   0.070  0.794
## Habitat:as.factor(depth_cm)  1   6411    6411   0.871  0.363
## Residuals                   18 132424    7357
#no interaction
redox.aov.nointeraction <- aov(correctedEH ~Habitat+ as.factor(depth_cm), data=redox)
summary(redox.aov.nointeraction)
##                     Df Sum Sq Mean Sq F value Pr(>F)
## Habitat              1  12149   12149   1.663  0.213
## as.factor(depth_cm)  1    519     519   0.071  0.793
## Residuals           19 138835    7307

The redox dataset collected by Dr. Rybczyk’s ESCI 522 course on May 9, 2024 at Padilla Bay Estuary shows no evidence that mean reduction/oxidation (eH) differed among either of the 4 habitat types: Mudflat 1 cm depth, Mudflat 15 cm depth, Z. japonica 1 cm depth, and Z. japonica 15 cm depth (\(F_{1, 18}\) = 1.651, p>0.05).

T-test

I am using a one-sided two sample t-test because if we expect that there is a higher EH in the mudflats, there is increased power and we can assume that EH will be greater under the mudflats. Especially if our goal is to determine whether eelgrass is better for redox reactions than mudflats.

Statistical Hypotheses

mean(redox$correctedEH)
## [1] 201.6818

\(H_0: \mu \leq 201.68\)

\(H_A: \mu > 201.68\)

var(mudflat$correctedEH)
## [1] 7673.764
var(japonica$correctedEH)
## [1] 6261.564
x = mudflat$correctedEH
y = japonica$correctedEH
t.test(x, 
       y, 
       alternative = "greater",
       var.equal = F)
## 
##  Welch Two Sample t-test
## 
## data:  x and y
## t = -1.3205, df = 19.797, p-value = 0.8991
## alternative hypothesis: true difference in means is greater than 0
## 95 percent confidence interval:
##  -108.4182       Inf
## sample estimates:
## mean of x mean of y 
##  178.1818  225.1818

Again, we fail to reject \(H_0\) and there is not enough evidence (\(t_{2, 19.8}\) = -1.3205; two-tailed P > 0.05) that the \(\mu\) mudflat is greater than \(H_0\): \(\mu\) = 201.68.

LS0tDQp0aXRsZTogIiAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgaGlnaGxpZ2h0OiB6ZW5idXJuDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNzczogc3R5bGUuY3NzDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGLCBjYWNoZSA9IFQsIHNpemU9InNtYWxsIikNCmxpYnJhcnkoZ3N0YXQpDQpsaWJyYXJ5KHNwKQ0KbGlicmFyeShndEV4dHJhcykNCmxpYnJhcnkoc3ZnbGl0ZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh0ZXJyYSkNCmxpYnJhcnkodGlkeXRlcnJhKQ0KbGlicmFyeShzZikNCmxpYnJhcnkocnNwYXQpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0bWFwKQ0KbGlicmFyeShndCkNCmBgYA0KDQojIyBSZWRveCBMYWINCg0KPGJyPg0KDQoqKk1hcmtkb3duIEF1dGhvcjoqKiBKZXNzaWUgQmVsbA0KDQp8IA0KDQoqKkRvd25sb2FkIHRoaXMgUm1kOioqIFRvcCByaWdodCBjb3JuZXIg4oaSIENvZGUg4oaSIERvd25sb2FkIFJtZA0KDQojIyAxIA0KDQoqKldoZXJlIG1pZ2h0IHlvdSBleHBlY3QgdG8gc2VlIHRoZSBsb3dlc3QgYW5kIGhpZ2hlc3QgcmVkb3ggdmFsdWVzPyAgRXhwbGFpbiB5b3VyIGFuc3dlci4qKg0KDQpJIGFudGljaXBhdGVkIG9ic2VydmluZyBlbGV2YXRlZCBnbHVjb3NlIGxldmVscyBpbiB0aGUgc2VkaW1lbnRzICh+MS0xMCBjbSkgZHVlIHRvIHRoZSBwcmVzZW5jZSBvZiByaGl6b21lcyBpbiB0aGUgZWVsZ3Jhc3MuIEkgdGhvdWdodCB0aGF0IHdpdGggaW5jcmVhc2VkIGdsdWNvc2UgY29uY2VudHJhdGlvbiwgZGVlcGVyIHNlZGltZW50IGxheWVycyB3b3VsZCBleGhpYml0IHRoZSBsb3dlc3QgcmVkb3ggdmFsdWVzLCBhcyB1bnVzZWQgZ2x1Y29zZSB3b3VsZCBiZSBwdXNoZWQgZnVydGhlciBkb3duLiBDb252ZXJzZWx5LCBJIGV4cGVjdGVkIG11ZGZsYXRzLCBkZXZvaWQgb2YgZ2x1Y29zZSwgdG8gZGlzcGxheSB0aGUgaGlnaGVzdCByZWRveCB2YWx1ZXMgZHVlIHRvIHRoZSBhYnNlbmNlIG9mIG1pY3JvYmlhbCBhY3Rpdml0eSBwcm9tcHRlZCBieSBnbHVjb3NlIGF2YWlsYWJpbGl0eS4NCg0KSG93ZXZlciwgdGhlIGRhdGEgcmV2ZWFsZWQgbm8gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBhbW9uZyBsb2NhdGlvbnMgaW4gdGVybXMgb2YgcmVkb3ggcmVhY3Rpb25zLiBUaGlzIGxhY2sgb2YgdmFyaWFuY2UgaXMgbGlrZWx5IGF0dHJpYnV0YWJsZSB0byB0aGUgbGltaXRlZCBudW1iZXIgb2YgbWVhc3VyZW1lbnRzLiBXaXRoIGEgbW9yZSBleHRlbnNpdmUgZGF0YXNldCwgSSB0aGluayB0aGF0IG15IG9yaWdpbmFsIGh5cG90aGVzZXMgd291bGQgaGF2ZSBiZWVuIGNvbmZpcm1lZC4gTm90YWJseSwgdGhlIHJlY29yZGVkIHZhbHVlcyByYW5nZWQgZnJvbSAyNDkgbVYgYXQgYSBkZXB0aCBvZiAxNSBjbSBpbiBhIG11ZGZsYXQgdG8gMTY1IG1WIGF0IHRoZSBzYW1lIGRlcHRoIGJlbmVhdGggKlouIGphcG9uaWNhKi4gQWxsIGFyZWFzIG1lYXN1cmVkIGVsZWN0cm9uIGFjY2VwdG9ycyBvZiBib3RoIE1hbmdhbmVzZSBJSUkgYW5kIElyb24gSUlJLiANCg0KIA0KIyMgMg0KDQoqKlBlcmZvcm0gYSAyIGZhY3RvciBBTk9WQSAoZGVwdGggeCBoYWJpdGF0KSB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYW55IHNpZ25pZmljYW50IGRlcHRoIG9yIGhhYml0YXQgZWZmZWN0LiAgSWYgdGhlcmUgYXJlIGRpZmZlcmVuY2VzIGFuZCwgaWYgeW91IGtub3cgaG93LCB1c2UgYSBwb3N0LWhvYyB0ZXN0IChpLmUuIEJvbmZlcm9ubmkpLCB0byBkZXRlY3QgZGlmZmVyZW5jZXMgYmV0d2VlbiBlYWNoIGNvbWJpbmF0aW9uIG9mIGZhY3RvcnMuICBZb3UgY2FuIGFsc28gdXNlIG11bHRpcGxlIHQtdGVzdHMgaW5zdGVhZCBvZiBBTk9WQSwgYnV0IGJld2FyZSBvZiBUeXBlIDEgZXJyb3JzLiBTaG93IHlvdSB3b3JrLioqIA0KDQpUaGUgcmVkb3ggZGF0YXNldCBjb2xsZWN0ZWQgYnkgRHIuIFJ5YmN6eWsncyBFU0NJIDUyMiBjb3Vyc2Ugb24gTWF5IDksIDIwMjQgYXQgUGFkaWxsYSBCYXkgRXN0dWFyeSAgc2hvd3Mgbm8gZXZpZGVuY2UgdGhhdCBtZWFuIHJlZHVjdGlvbi9veGlkYXRpb24gKGVIKSBkaWZmZXJlZCBhbW9uZyBlaXRoZXIgb2YgdGhlIDQgaGFiaXRhdCB0eXBlczogTXVkZmxhdCAxIGNtIGRlcHRoLCBNdWRmbGF0IDE1IGNtIGRlcHRoLCAqWi4gamFwb25pY2EqIDEgY20gZGVwdGgsIGFuZCAqWi4gamFwb25pY2EqIDE1IGNtIGRlcHRoICgkRl97MSwgMTh9JCA9IDEuNjUxLCBwPjAuMDUpLiANCg0KQWxsIHdvcmsgY2FuIGJlIGZvdW5kIGJlbG93Lg0KDQpgYGB7ciBmaWcsIGZpZy5jYXA9IioqRmlndXJlIDE6KiogU2hvd2luZyByZWRveCAobVYpIGZvciB0d28gaGFiaXRhdCB0eXBlcywgbXVkZmxhdCBhbmQgZWVsZ3Jhc3MgYXQgUGFkaWxsYSBCYXkgRXN0dWFyeSAoNS85LzI0KS4gQSB0d28gc2FtcGxlIHQtdGVzdCBwcm92aWRlcyBpbnN1ZmZpY2llbnQgZXZpZGVuY2UgdGhhdCB0aGUgbWVhbiByZWRveCB2YWx1ZXMgYXJlIGRpZmZlcmVudCBlbm91Z2ggYW5kIHdlIGZhaWwgdG8gcmVqZWN0IEgwICh0MiwxOS44ID0gLTEuMzIwNTsgdHdvLXRhaWxlZCBQID4gMC4wNSkgdGhhdCB0aGUgzrwgbXVkZmxhdCBpcyBncmVhdGVyIHRoYW4gSDA6IM68ID0gMjAxLjY4LiJ9DQoNCnJlZG94MiA8LSByZWFkLmNzdigicmVkb3hfdGFrZTIuY3N2IikNCg0KcmVkb3ggPC0gcmVhZC5jc3YoInJlZG94LmNzdiIpDQoNCg0KZ2dwbG90KCkrDQogIGdlb21fYm94cGxvdChyZWRveCwgbWFwcGluZz1hZXMoSGFiaXRhdCwgY29ycmVjdGVkRUgsIGNvbG9yPUhhYml0YXQpKQ0KDQpgYGANCg0KYGBge3IgYW5vdmEsIGZpZy5jYXA9IioqRmlndXJlIDI6KiogU2hvd2luZyByZWRveCAobVYpIGZvciB0d28gaGFiaXRhdCB0eXBlcyBhbmQgZGVwdGhzLCBtdWRmbGF0IGFuZCBlZWxncmFzcyBhdCAxIGNtIGFuZCAxNSBjbSBmb3IgYm90aCBhdCBQYWRpbGxhIEJheSBFc3R1YXJ5ICg1LzkvMjQpLiBUaGUgcmVkb3ggZGF0YXNldCBzaG93cyBubyBldmlkZW5jZSB0aGF0IG1lYW4gcmVkdWN0aW9uL294aWRhdGlvbiAoRUgpIGRpZmZlcmVkIGFtb25nIGVpdGhlciBvZiB0aGUgNCBoYWJpdGF0IHR5cGVzOiBNdWRmbGF0IDEgY20gZGVwdGgsIE11ZGZsYXQgMTUgY20gZGVwdGgsICpaLiBqYXBvbmljYSogMSBjbSBkZXB0aCwgYW5kICpaLiBqYXBvbmljYSogMTUgY20gZGVwdGggKCRGX3sxLCAxOH0kID0gMS42NTEsIHA+MC4wNSkuIn0NCg0KZ2dwbG90KHJlZG94MiwgYWVzKEhhYml0YXQsIGNvcnJlY3RlZEVILCBjb2xvcj1IYWJpdGF0KSkrDQogIGdlb21fYm94cGxvdCgpDQpgYGANCg0KIyMjIERhdGEgRXhwbG9yYXRpb24NCg0KYGBge3IgZGF0YX0NCg0KDQpndChyZWRveCklPiUNCiAgdGFiX29wdGlvbnModGFibGUuZm9udC5zaXplID0gcHgoMTBMKSklPiUNCiAgY29sc19sYWJlbCgNCiAgICBIYWJpdGF0PW1kKCIqKkhhYml0YXQqKiIpLA0KICAgIGRlcHRoX2NtID0gbWQoIioqRGVwdGggKGNtKSoqIiksDQogICAgdW5jb3JyZWN0ZWRFSCA9IG1kKCIqKlVuY29ycmVjdGVkIEVoKioiKSwNCiAgICBjb3JyZWN0ZWRFSCA9IG1kKCIqKkNvcnJlY3RlZCBFaCoqIikpJT4lDQogIG9wdF90YWJsZV9mb250KCJDb3JiZWwiKSU+JQ0KICBvcHRfaW50ZXJhY3RpdmUoDQogICAgcGFnZV9zaXplX2RlZmF1bHQgPSA1IA0KICApDQoNCmBgYA0KDQojIyMgU3VtbWFyeSBTdGF0aXN0aWNzDQoNCmBgYHtyIHN1bW1hcnl9DQptdWRmbGF0IDwtIHN1YnNldChyZWRveCwgSGFiaXRhdD09Ik11ZGZsYXQiKQ0KDQpqYXBvbmljYSA8LSBzdWJzZXQocmVkb3gsIEhhYml0YXQ9PSJab3N0ZXJhIGphcG9uaWNhIikNCg0KbXVkZmxhdF9zdXJmYWNlIDwtIHN1YnNldChtdWRmbGF0LCBkZXB0aF9jbT09IjEiKQ0KbXVkZmxhdF8xNSA8LSBzdWJzZXQobXVkZmxhdCwgZGVwdGhfY209PSIxNSIpDQpqYXBvbmljYV9zdXJmYWNlIDwtIHN1YnNldChqYXBvbmljYSwgZGVwdGhfY209PSIxIikNCmphcG9uaWNhXzE1IDwtIHN1YnNldChqYXBvbmljYSwgZGVwdGhfY209PSIxNSIpDQoNCm1zIDwtIG1lYW4obXVkZmxhdF9zdXJmYWNlJGNvcnJlY3RlZEVIKQ0Kc2VtcyA8LSBzZChtdWRmbGF0X3N1cmZhY2UkY29ycmVjdGVkRUgpLyhzcXJ0KGxlbmd0aChtdWRmbGF0X3N1cmZhY2UkY29ycmVjdGVkRUgpKSkNCm0xNSA8LSBtZWFuKG11ZGZsYXRfMTUkY29ycmVjdGVkRUgpDQpzZW0xNSA8LSBzZChtdWRmbGF0XzE1JGNvcnJlY3RlZEVIKS8oc3FydChsZW5ndGgobXVkZmxhdF8xNSRjb3JyZWN0ZWRFSCkpKQ0KDQpqcyA8LSBtZWFuKGphcG9uaWNhX3N1cmZhY2UkY29ycmVjdGVkRUgpDQpzZWpzIDwtIHNkKGphcG9uaWNhX3N1cmZhY2UkY29ycmVjdGVkRUgpLyhzcXJ0KGxlbmd0aChqYXBvbmljYV9zdXJmYWNlJGNvcnJlY3RlZEVIKSkpDQpqMTUgPC0gbWVhbihqYXBvbmljYV8xNSRjb3JyZWN0ZWRFSCkNCnNlajE1IDwtIHNkKGphcG9uaWNhXzE1JGNvcnJlY3RlZEVIKS8oc3FydChsZW5ndGgoamFwb25pY2FfMTUkY29ycmVjdGVkRUgpKSkNCg0KTWVhbiA8LSByYmluZChtcywgbTE1LCBqcywgajE1KQ0Kc2QgPC0gcmJpbmQoc2Vtcywgc2VtMTUsIHNlanMsIHNlajE1KQ0KSGFiaXRhdCA8LSBjYmluZChjKCJab3N0ZXJhIGphcG9uaWNhIiwgIiIsICJNdWRmbGF0IiwgIiIpKQ0KDQpEZXB0aCA8LSBjYmluZChjKCIxIiwgIjE1IiwgIjEiLCAiMTUiKSkNCg0KZV9hY2NlcHRvciA8LSByYmluZCgiRmUgKysrIiwgIkZlKysrIiwgIkZlKysrIiwgIk1uKysrIikNCg0Kc3VtbWFyeXN0YXRzIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQoSGFiaXRhdCwgRGVwdGgsIE1lYW4sIHNkLCBlX2FjY2VwdG9yKSkNCnN1bW1hcnlzdGF0cyA8LSB0eXBlLmNvbnZlcnQoc3VtbWFyeXN0YXRzLCBhcy5pcyA9IFRSVUUpDQoNCmNvbG5hbWVzKHN1bW1hcnlzdGF0cykgPC0gYygiSGFiaXRhdCIsIkRlcHRoIChjbSkiLCAiTWVhbiBFaCIsICJTRSBFaCIsICJlLSBBY2NlcHRvciIpDQoNCg0KZ3Qoc3VtbWFyeXN0YXRzKXw+DQogIHRhYl9vcHRpb25zKHRhYmxlLmZvbnQuc2l6ZSA9IHB4KDEwTCkpJT4lDQogIG9wdF90YWJsZV9mb250KCJDb3JiZWwiKSU+JQ0KICBvcHRfc3R5bGl6ZShzdHlsZT00KSU+JQ0KICBmbXRfbnVtYmVyKGNvbHVtbnMgPSB3aGVyZShpcy5udW1lcmljKSwgbl9zaWdmaWcgPSAzLCBkcm9wX3RyYWlsaW5nX3plcm9zID0gVCkNCg0KDQpgYGANCg0KIyMjIEFzc3VtcHRpb25zDQoNCiMjIyMgTm9ybWFsaXR5DQoNCipab3N0ZXJhIGphcG9uaWNhKiBoYXMgYSBsZWZ0IHNrZXcgYW5kIEkgYXR0ZW1wdGVkIHRvIGRvIGEgc3F1YXJlIHJvb3QgdHJhbnNmb3JtYXRpb24gb24gdGhlIGRhdGEgdG8gbm8gYXZhaWwuIEkgYW0gYXNzdW1pbmcgdGhhdCBpZiB3ZSB3b3VsZCBoYXZlIHNhbXBsZWQgbW9yZSwgb3VyIGRhdGEgd291bGQgZm9sbG93IHRoZSBhc3N1bXB0aW9uIG9mIG5vcm1hbGl0eSBiZXR0ZXIuIEkgdGhpbmsgdGhhdCB0aGUgYGBgbXVkZmxhdGBgYCBkYXRhIGxvb2tzIG5vcm1hbCBlbm91Z2guIA0KDQoNCmBgYHtyIG5vcm1hbGl0eX0NCg0KcGFyKG1mcm93ID0gYygxLDIpKQ0KDQoNCmhpc3QobXVkZmxhdCRjb3JyZWN0ZWRFSCwgY29sPSJzdGVlbGJsdWUiLCBtYWluPSJNdWRmbGF0IEVoIiwgeGxhYj0iT3hpZGF0aW9uIFJlZHVjdGlvbiBQb3RlbnRpYWwgKEVoKSIpDQoNCmhpc3QoKGphcG9uaWNhJGNvcnJlY3RlZEVIKSwgY29sPSJwbHVtIiwgbWFpbj0iWi4gamFwb25pY2EgRWgiLCB4bGFiPSJPeGlkYXRpb24gUmVkdWN0aW9uIFBvdGVudGlhbCAoRWgpIikgI3NrZXdlZCBsZWZ0Li4ubWlnaHQgbmVlZCB0byBjb3JyZWN0IHRoaXMuIA0KDQoNCg0KYGBgDQoNCiMjIyMgSG9tb3NjZWRhc3RpY2l0eQ0KDQpEYXRhIGZvbGxvd3MgdGhlIHJ1bGVzIGFuZCBzZWVtcyB0byBoYXZlIGNsb3NlIHRvIGVxdWFsIHZhcmlhbmNlLiANCg0KYGBge3IgaG9tb3NjZWR9DQoNCnBhcihtZnJvdyA9IGMoMSwyKSkNCg0KYm94cGxvdChtdWRmbGF0JGNvcnJlY3RlZEVILCBjb2w9InN0ZWVsYmx1ZSIsIG1haW49Ik11ZGZsYXQgRWgiLCB5bGFiPSJPeGlkYXRpb24gUmVkdWN0aW9uIFBvdGVudGlhbCAoRWgpIikNCg0KYm94cGxvdChqYXBvbmljYSRjb3JyZWN0ZWRFSCwgY29sPSJwbHVtIiwgbWFpbj0iWi4gamFwb25pY2EgRWgiLCB5bGFiPSJPeGlkYXRpb24gUmVkdWN0aW9uIFBvdGVudGlhbCAoRWgpIikNCmBgYA0KDQoNCiMjIyBUd28td2F5IEFOT1ZBDQoNCiMjIyMgU3RhdGlzdGljYWwgSHlwb3RoZXNlcw0KDQokSF8wJDogJFxtdV97bWYxfSQgPSAkXG11X3ttZjE1fSQgPSAkXG11X3t6ajF9JCA9ICRcbXVfe3pqMTV9JA0KDQokSF9hJDogQXQgbGVhc3Qgb25lIG1lYW4gYWJvdmUgaXMgbm90IGVxdWFsIHRvIHRoZSBvdGhlcnMuDQoNCiRcYWxwaGE9MC41JA0KDQoNCg0KYGBge3IgdHdvIHdheX0NCiN3aXRoIGludGVyYWN0aW9uDQpyZWRveC5hb3YuaW50ZXJhY3Rpb24gPC0gYW92KGNvcnJlY3RlZEVIIH5IYWJpdGF0KmFzLmZhY3RvcihkZXB0aF9jbSksIGRhdGE9cmVkb3gpDQpzdW1tYXJ5KHJlZG94LmFvdi5pbnRlcmFjdGlvbikNCg0KI25vIGludGVyYWN0aW9uDQpyZWRveC5hb3Yubm9pbnRlcmFjdGlvbiA8LSBhb3YoY29ycmVjdGVkRUggfkhhYml0YXQrIGFzLmZhY3RvcihkZXB0aF9jbSksIGRhdGE9cmVkb3gpDQpzdW1tYXJ5KHJlZG94LmFvdi5ub2ludGVyYWN0aW9uKQ0KDQoNCmBgYA0KDQpUaGUgcmVkb3ggZGF0YXNldCBjb2xsZWN0ZWQgYnkgRHIuIFJ5YmN6eWsncyBFU0NJIDUyMiBjb3Vyc2Ugb24gTWF5IDksIDIwMjQgYXQgUGFkaWxsYSBCYXkgRXN0dWFyeSAgc2hvd3Mgbm8gZXZpZGVuY2UgdGhhdCBtZWFuIHJlZHVjdGlvbi9veGlkYXRpb24gKGVIKSBkaWZmZXJlZCBhbW9uZyBlaXRoZXIgb2YgdGhlIDQgaGFiaXRhdCB0eXBlczogTXVkZmxhdCAxIGNtIGRlcHRoLCBNdWRmbGF0IDE1IGNtIGRlcHRoLCAqWi4gamFwb25pY2EqIDEgY20gZGVwdGgsIGFuZCAqWi4gamFwb25pY2EqIDE1IGNtIGRlcHRoICgkRl97MSwgMTh9JCA9IDEuNjUxLCBwPjAuMDUpLg0KDQoNCiMjIyBULXRlc3QNCg0KSSBhbSB1c2luZyBhIG9uZS1zaWRlZCB0d28gc2FtcGxlIHQtdGVzdCBiZWNhdXNlIGlmIHdlIGV4cGVjdCB0aGF0IHRoZXJlIGlzIGEgaGlnaGVyIEVIIGluIHRoZSBtdWRmbGF0cywgdGhlcmUgaXMgaW5jcmVhc2VkIHBvd2VyIGFuZCB3ZSBjYW4gYXNzdW1lIHRoYXQgRUggd2lsbCBiZSBncmVhdGVyIHVuZGVyIHRoZSBtdWRmbGF0cy4gRXNwZWNpYWxseSBpZiBvdXIgZ29hbCBpcyB0byBkZXRlcm1pbmUgd2hldGhlciBlZWxncmFzcyBpcyBiZXR0ZXIgZm9yIHJlZG94IHJlYWN0aW9ucyB0aGFuIG11ZGZsYXRzLg0KDQojIyMjIFN0YXRpc3RpY2FsIEh5cG90aGVzZXMNCg0KYGBge3IgbWVhbn0NCg0KbWVhbihyZWRveCRjb3JyZWN0ZWRFSCkNCg0KYGBgDQoNCg0KJEhfMDogXG11IFxsZXEgMjAxLjY4JCANCg0KJEhfQTogXG11ID4gIDIwMS42OCQNCg0KYGBge3IgdHRlc3R9DQp2YXIobXVkZmxhdCRjb3JyZWN0ZWRFSCkNCnZhcihqYXBvbmljYSRjb3JyZWN0ZWRFSCkNCg0KeCA9IG11ZGZsYXQkY29ycmVjdGVkRUgNCnkgPSBqYXBvbmljYSRjb3JyZWN0ZWRFSA0KdC50ZXN0KHgsIA0KICAgICAgIHksIA0KICAgICAgIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLA0KICAgICAgIHZhci5lcXVhbCA9IEYpDQoNCmBgYA0KDQpBZ2Fpbiwgd2UgZmFpbCB0byByZWplY3QgJEhfMCQgYW5kIHRoZXJlIGlzIG5vdCBlbm91Z2ggZXZpZGVuY2UgKCR0X3syLCAxOS44fSQgPSAtMS4zMjA1OyB0d28tdGFpbGVkIFAgPiAwLjA1KSB0aGF0IHRoZSAkXG11JCBtdWRmbGF0IGlzIGdyZWF0ZXIgdGhhbiAkSF8wJDogJFxtdSQgPSAyMDEuNjguDQoNCg0KPGRpdiBjbGFzcz0idG9jaWZ5LWV4dGVuZC1wYWdlIiBkYXRhLXVuaXF1ZT0idG9jaWZ5LWV4dGVuZC1wYWdlIiBzdHlsZT0iaGVpZ2h0OiAwOyI+PC9kaXY+