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))
ggplot(redox2, aes(Habitat, correctedEH, color=Habitat))+
geom_boxplot()
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
## [1] 201.6818
\(H_0: \mu \leq 201.68\)
\(H_A: \mu > 201.68\)
## [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+