rm(list = ls())
library(dplyr)
Warning: package ‘dplyr’ was built under R version 4.1.2
Attaching package: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
library(ggplot2)
Warning: package ‘ggplot2’ was built under R version 4.1.2
library(tidyr)
library(ggpubr)
Registered S3 method overwritten by 'data.table':
method from
print.data.table
library(ggthemes)
filter <- dplyr::filter
select <- dplyr::select
rename <- dplyr::rename
dp<-read.csv("/Users/sarenseeley/Dropbox/Postdoc/nwtc_study/data/_cleaned/DotProbe_wide.csv")
cov<-read.csv("/Users/sarenseeley/Dropbox/Postdoc/nwtc_study/data/_cleaned/DotProbe_covars.csv") %>% filter(!record_id == "NWTC-032") %>% select(record_id,starts_with("dem")|starts_with("clin_")|starts_with("tot"),exposures_count)
dp<-left_join(dp,cov,by="record_id")
dp<- dp %>% mutate(threat_bias = neutral_threat-threat_neutral,
ptsd = as.factor(if_else(group=="PTSD", "PTSD", "nonPTSD"))) # positive number = faster to respond to probe when it appears where the threat word was
# negative number = slower to respond to probe when it appears where the neutral probe was, ON trials where the other word is a threat word
# check out the data:
plot(dp$threat_bias,dp$overall_accuracy)

# remove low accuracy ppt:
dp <- dp %>% filter(overall_accuracy>=.5)
# so now we have removed 2 ppts for low accuracy, and 1 who was falling asleep and his data wasn't reliable (e.g., RT of 17 seconds)
plot(dp$threat_bias,dp$overall_accuracy)

# this looks better!
In total, we dropped data from 3 of 51 ppts (2 very low accuracy, 1 falling asleep with ridiculous RTs like 17 seconds), leaving n = 48.
Section A
Q1: Is there a difference in prevalence of PTSD in traditional vs. non-traditional responders?
Here is the breakdown of people in each of the 4 categories (trad vs. non-trad; PTSD vs. resilient):
tab1<-dp %>% select(ptsd,traditional_responder) %>% table()
c1<-chisq.test(tab1, simulate.p.value = TRUE)
c1$observed
traditional_responder
ptsd Non-traditional Traditional (e.g., police, fire, EMS)
nonPTSD 2 28
PTSD 11 7
We do a chi square test to see whether the actual number of people we have in each group differs significantly from what would be expected if there was no difference between groups:
c1
Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)
data: tab1
X-squared = 16.886, df = NA, p-value = 0.0004998
c1$expected
traditional_responder
ptsd Non-traditional Traditional (e.g., police, fire, EMS)
nonPTSD 8.125 21.875
PTSD 4.875 13.125
We see that PTSD prevalence is higher in non-traditional responders, chi square X = 16.89, p <.001. Compared to the actual data, the chi square test would expect (1) more resilient people to be non-traditional responders and (2) more PTSD people to be traditional responders.
Q2: Is there a difference in perceived social support and social networks between PTSD and resilient groups?
We used independent samples T tests:
t.test(dp$tot_mos_overallSup ~ dp$ptsd, paired = FALSE )
Welch Two Sample t-test
data: dp$tot_mos_overallSup by dp$ptsd
t = 6.5063, df = 24.799, p-value = 8.489e-07
alternative hypothesis: true difference in means between group nonPTSD and group PTSD is not equal to 0
95 percent confidence interval:
22.43777 43.23475
sample estimates:
mean in group nonPTSD mean in group PTSD
88.02632 55.19006
The groups ARE significantly different in terms of their overall perceived social support, T = 6.51, p < .001. The mean score for overall social support in the resilient group is 88.02 and the mean in the PTSD group is 55.20. This means the PTSD group perceives themselves to have less social support.
t.test(dp$tot_sni_netDiv ~ dp$ptsd, paired = FALSE )
Welch Two Sample t-test
data: dp$tot_sni_netDiv by dp$ptsd
t = 1.9844, df = 32.196, p-value = 0.05578
alternative hypothesis: true difference in means between group nonPTSD and group PTSD is not equal to 0
95 percent confidence interval:
-0.02998941 2.31887830
sample estimates:
mean in group nonPTSD mean in group PTSD
6.033333 4.888889
The groups are different in terms of their social network diversity, T = 1.98, though p < .056 (so not quite statistically significant at a threshold of p <.05). The mean network diversity score was 6.03 in the resilient group and 4.89 in the PTSD group. This means the PTSD group has a less diverse social network.
t.test(dp$tot_sni_numPpl ~ dp$ptsd, paired = FALSE )
Welch Two Sample t-test
data: dp$tot_sni_numPpl by dp$ptsd
t = 1.7757, df = 25.476, p-value = 0.08773
alternative hypothesis: true difference in means between group nonPTSD and group PTSD is not equal to 0
95 percent confidence interval:
-1.188949 16.166727
sample estimates:
mean in group nonPTSD mean in group PTSD
21.76667 14.27778
The groups ARE different in terms of the number of people in their social network, T = 1.78, though p < .088 (so not statistically significant at a threshold of p <.05). The mean number of people was 21.77 in the resilient group and 14.28 in the PTSD group. This means the PTSD group has a smaller social network.
Here’s what that looks like in a plot:
pl <- dp %>% select(ptsd,starts_with("tot_sni"), tot_mos_overallSup) %>% pivot_longer(names_to = "measure", values_to = "social", cols=c(2,3,4))
ggplot(pl, aes(ptsd, social, fill=ptsd)) +
stat_summary(geom = "col", fun = mean, position = "dodge", color="black") +
stat_summary(geom = "errorbar", fun.data = mean_se, position=position_dodge(.9), width = 0.25, color="black") + labs(title="social support measures (MOS, SNI)") + theme_clean(base_size = 16) + theme(legend.position = "none") +
scale_fill_manual(values=c("#2eb4e7","#291d6d", "#d4148d" )) + scale_color_manual(values=c("#2eb4e7", "#291d6d", "#d4148d" )) + xlab("") + ylab("score") +
scale_x_discrete(labels = c('Resilient', 'PTSD')) + facet_wrap(scales = "free_y", ~measure)

Q3: Is there a difference in personality traits between trad vs. non-trad responders?
Risk-taking & impulsivity
We chose these measures because we thought that perhaps people drawn to traditional responder careers might have more of an affinity for high-adrenaline situations, perceiving them as more exciting than threatening, and perhaps this might be why we see more PTSD in the non-traditional responders.
t.test(dp$tot_bis ~ dp$traditional_responder, paired = FALSE )
Welch Two Sample t-test
data: dp$tot_bis by dp$traditional_responder
t = 1.1243, df = 11.621, p-value = 0.2836
alternative hypothesis: true difference in means between group Non-traditional and group Traditional (e.g., police, fire, EMS) is not equal to 0
95 percent confidence interval:
-2.519983 7.853316
sample estimates:
mean in group Non-traditional
66.33333
mean in group Traditional (e.g., police, fire, EMS)
63.66667
t.test(dp$tot_drs ~ dp$traditional_responder, paired = FALSE )
Welch Two Sample t-test
data: dp$tot_drs by dp$traditional_responder
t = -0.11384, df = 11.185, p-value = 0.9114
alternative hypothesis: true difference in means between group Non-traditional and group Traditional (e.g., police, fire, EMS) is not equal to 0
95 percent confidence interval:
-15.10918 13.62029
sample estimates:
mean in group Non-traditional
88.22222
mean in group Traditional (e.g., police, fire, EMS)
88.96667
Contrary to our hypothesis, we did NOT see differences in traditional vs. non-traditional responders in terms of scores on the impulsivity and risk taking questionnaires.
pl1 <- dp %>% select(traditional_responder,tot_drs,tot_bis) %>% pivot_longer(names_to = "measure", values_to = "score", cols=c(2:3) )
ggplot(pl1, aes(traditional_responder, score, fill=traditional_responder)) +
stat_summary(geom = "col", fun = mean, position = "dodge", color="black") +
stat_summary(geom = "errorbar", fun.data = mean_se, position=position_dodge(.9), width = 0.25, color="black") + theme_clean(base_size = 16) + theme(legend.position = "none", axis.text.x = element_text(
vjust = 0,
hjust = 0,
angle = -35)) + labs(title="Impulsivity and Risk-taking") +
scale_fill_manual(values=c("#2dc8f8","#d4148d" )) + xlab("") + ylab("score") + facet_wrap(scales = "free_y", ~measure)
Warning: Removed 18 rows containing non-finite values (`stat_summary()`).
Warning: Removed 18 rows containing non-finite values (`stat_summary()`).

Positive and negative affect
We chose these measures because we thought that perhaps people drawn to traditional responder careers might have a greater tendency to be positive and less neurotic (i.e., prone to negative emotions) – and this could help them be resilient to PTSD.
t.test(dp$tot_panas_pos ~ dp$traditional_responder, paired = FALSE )
Welch Two Sample t-test
data: dp$tot_panas_pos by dp$traditional_responder
t = -3.0561, df = 24.762, p-value = 0.00531
alternative hypothesis: true difference in means between group Non-traditional and group Traditional (e.g., police, fire, EMS) is not equal to 0
95 percent confidence interval:
-11.090403 -2.157948
sample estimates:
mean in group Non-traditional
29.46154
mean in group Traditional (e.g., police, fire, EMS)
36.08571
t.test(dp$tot_panas_neg ~ dp$traditional_responder, paired = FALSE )
Welch Two Sample t-test
data: dp$tot_panas_neg by dp$traditional_responder
t = 4.1237, df = 15.166, p-value = 0.0008828
alternative hypothesis: true difference in means between group Non-traditional and group Traditional (e.g., police, fire, EMS) is not equal to 0
95 percent confidence interval:
5.069954 15.897079
sample estimates:
mean in group Non-traditional
24.76923
mean in group Traditional (e.g., police, fire, EMS)
14.28571
Yes, the traditional responders are, on average, higher in positive and lower in negative affectivity, vs. the non-traditional responders.
However, we noted that this result could be confounded by PTSD: with significantly more proportion of non-traditional responders having PTSD, we don’t know if being more negative/less positive is a consequence of having PTSD or were there prior to 9/11 attacks.
pl2 <- dp %>% select(traditional_responder,starts_with("tot_panas")) %>% pivot_longer(names_to = "measure", values_to = "score", cols=c(2:3) )
ggplot(pl2, aes(traditional_responder, score, fill=traditional_responder)) +
stat_summary(geom = "col", fun = mean, position = "dodge", color="black") +
stat_summary(geom = "errorbar", fun.data = mean_se, position=position_dodge(.9), width = 0.25, color="black") + labs(title="Positive and Negative Affect Scale") + theme_clean(base_size = 16) + theme(legend.position = "none", axis.text.x = element_text(
angle = -35,
vjust = 0,
hjust = 0)) + xlab("") +
scale_fill_manual(values=c("#2dc8f8","#d4148d" )) + xlab("") + ylab("score") +
facet_wrap(~measure)

Section B
Q1: Does attention bias (selective attention for threat) differ between PTSD and resilient groups?
Accuracy
t.test(dp$overall_accuracy ~ dp$ptsd, paired = FALSE )
Welch Two Sample t-test
data: dp$overall_accuracy by dp$ptsd
t = 2.7384, df = 24.168, p-value = 0.01141
alternative hypothesis: true difference in means between group nonPTSD and group PTSD is not equal to 0
95 percent confidence interval:
0.005496675 0.039086659
sample estimates:
mean in group nonPTSD mean in group PTSD
0.9535417 0.9312500
Yes, the resilient group is more accurate than the PTSD group, overall, though the difference is not that large (95% vs. 93%)
ggplot(dp, aes(ptsd, overall_accuracy, fill=ptsd)) +
stat_summary(geom = "col", fun = mean, position = "dodge", color="black") +
stat_summary(geom = "errorbar", fun.data = mean_se, position=position_dodge(.9), width = 0.25, color="black") + labs(title="Overall task accuracy") + theme_clean(base_size = 14) + theme(legend.position = "none", axis.text.x = element_text(
angle = 0,
vjust = 0,
hjust = 0)) + xlab("")+
scale_fill_manual(values=c("#2eb4e7","#291d6d", "#d4148d")) + xlab("") + ylab("% correct responses") +scale_x_discrete(labels = c('Resilient', 'PTSD'))
Threat Bias
We calculated threat bias by subtracting RTs in the “probe in threat location” condition from RTs in the “probe in neutral location (+ other word is threat)” condition: threat_bias = neutral_threat minus threat_neutral).
Positive numbers = selective attention for threat (threat bias; essentially, faster to threat than neutral). Negative numbers indicate threat avoidance bias (essentially, faster to neutral than threat).
t.test(dp$threat_bias ~ dp$ptsd, paired = FALSE )
Welch Two Sample t-test
data: dp$threat_bias by dp$ptsd
t = 0.6363, df = 26.458, p-value = 0.53
alternative hypothesis: true difference in means between group nonPTSD and group PTSD is not equal to 0
95 percent confidence interval:
-11.47128 21.76988
sample estimates:
mean in group nonPTSD mean in group PTSD
1.306432 -3.842869
ggplot(dp, aes(ptsd, threat_bias, fill=ptsd)) +
stat_summary(geom = "col", fun = mean, position = "dodge", color="black") +
stat_summary(geom = "errorbar", fun.data = mean_se, position=position_dodge(.9), width = 0.25, color="black") + labs(title="Threat Bias") + theme_clean(base_size = 16) + theme(legend.position = "none", axis.text.x = element_text(
angle = 0,
vjust = 0,
hjust = 0)) + xlab("")+
scale_fill_manual(values=c("#2eb4e7","#291d6d", "#d4148d")) + xlab("") + ylab("RT difference") +scale_x_discrete(labels = c('Resilient', 'PTSD'))

There is NOT a significant difference in threat bias between groups. Note that the Iacovelli paper you read similarly did not find a difference in threat bias, only threat bias variability.
So, what do we make of this?
LS0tCnRpdGxlOiAiU1BJQ0UgMjAyMyBkb3QgcHJvYmUgcHJvamVjdCIKYXV0aG9yOiAiVHZpc2hhIFZhbnRlcnUgJiBTYXJlbiBTZWVsZXkiCmRhdGU6ICJMYXN0IHVwZGF0ZWQgMDgtMTAtMjMiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKLS0tCiAgCgpgYGB7ciBzZXR1cH0Kcm0obGlzdCA9IGxzKCkpCgpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KGdndGhlbWVzKQoKZmlsdGVyIDwtIGRwbHlyOjpmaWx0ZXIKc2VsZWN0IDwtIGRwbHlyOjpzZWxlY3QKcmVuYW1lIDwtIGRwbHlyOjpyZW5hbWUKYGBgCgpgYGB7cn0KZHA8LXJlYWQuY3N2KCIvVXNlcnMvc2FyZW5zZWVsZXkvRHJvcGJveC9Qb3N0ZG9jL253dGNfc3R1ZHkvZGF0YS9fY2xlYW5lZC9Eb3RQcm9iZV93aWRlLmNzdiIpCmNvdjwtcmVhZC5jc3YoIi9Vc2Vycy9zYXJlbnNlZWxleS9Ecm9wYm94L1Bvc3Rkb2Mvbnd0Y19zdHVkeS9kYXRhL19jbGVhbmVkL0RvdFByb2JlX2NvdmFycy5jc3YiKSAlPiUgZmlsdGVyKCFyZWNvcmRfaWQgPT0gIk5XVEMtMDMyIikgJT4lIHNlbGVjdChyZWNvcmRfaWQsc3RhcnRzX3dpdGgoImRlbSIpfHN0YXJ0c193aXRoKCJjbGluXyIpfHN0YXJ0c193aXRoKCJ0b3QiKSxleHBvc3VyZXNfY291bnQpIApkcDwtbGVmdF9qb2luKGRwLGNvdixieT0icmVjb3JkX2lkIikKCgpkcDwtIGRwICU+JSBtdXRhdGUodGhyZWF0X2JpYXMgPSBuZXV0cmFsX3RocmVhdC10aHJlYXRfbmV1dHJhbCwKICAgICAgICAgICAgICAgICAgIHB0c2QgPSBhcy5mYWN0b3IoaWZfZWxzZShncm91cD09IlBUU0QiLCAiUFRTRCIsICJub25QVFNEIikpKSAjIHBvc2l0aXZlIG51bWJlciA9IGZhc3RlciB0byByZXNwb25kIHRvIHByb2JlIHdoZW4gaXQgYXBwZWFycyB3aGVyZSB0aGUgdGhyZWF0IHdvcmQgd2FzCiMgbmVnYXRpdmUgbnVtYmVyID0gc2xvd2VyIHRvIHJlc3BvbmQgdG8gcHJvYmUgd2hlbiBpdCBhcHBlYXJzIHdoZXJlIHRoZSBuZXV0cmFsIHByb2JlIHdhcywgT04gdHJpYWxzIHdoZXJlIHRoZSBvdGhlciB3b3JkIGlzIGEgdGhyZWF0IHdvcmQKCiMgY2hlY2sgb3V0IHRoZSBkYXRhOgpwbG90KGRwJHRocmVhdF9iaWFzLGRwJG92ZXJhbGxfYWNjdXJhY3kpCgojIHJlbW92ZSBsb3cgYWNjdXJhY3kgcHB0OgpkcCA8LSBkcCAlPiUgZmlsdGVyKG92ZXJhbGxfYWNjdXJhY3k+PS41KQoKIyBzbyBub3cgd2UgaGF2ZSByZW1vdmVkIDIgcHB0cyBmb3IgbG93IGFjY3VyYWN5LCBhbmQgMSB3aG8gd2FzIGZhbGxpbmcgYXNsZWVwIGFuZCBoaXMgZGF0YSB3YXNuJ3QgcmVsaWFibGUgKGUuZy4sIFJUIG9mIDE3IHNlY29uZHMpCnBsb3QoZHAkdGhyZWF0X2JpYXMsZHAkb3ZlcmFsbF9hY2N1cmFjeSkKIyB0aGlzIGxvb2tzIGJldHRlciEKCmBgYAoKSW4gdG90YWwsIHdlIGRyb3BwZWQgZGF0YSBmcm9tIDMgb2YgNTEgcHB0cyAoMiB2ZXJ5IGxvdyBhY2N1cmFjeSwgMSBmYWxsaW5nIGFzbGVlcCB3aXRoIHJpZGljdWxvdXMgUlRzIGxpa2UgMTcgc2Vjb25kcyksIGxlYXZpbmcgbiA9IDQ4LiAKCgojIFNlY3Rpb24gQQojIyBRMTogSXMgdGhlcmUgYSBkaWZmZXJlbmNlIGluIHByZXZhbGVuY2Ugb2YgUFRTRCBpbiB0cmFkaXRpb25hbCB2cy4gbm9uLXRyYWRpdGlvbmFsIHJlc3BvbmRlcnM/CgpIZXJlIGlzIHRoZSBicmVha2Rvd24gb2YgcGVvcGxlIGluIGVhY2ggb2YgdGhlIDQgY2F0ZWdvcmllcyAodHJhZCB2cy4gbm9uLXRyYWQ7IFBUU0QgdnMuIHJlc2lsaWVudCk6CmBgYHtyfQp0YWIxPC1kcCAlPiUgc2VsZWN0KHB0c2QsdHJhZGl0aW9uYWxfcmVzcG9uZGVyKSAgJT4lIHRhYmxlKCkKYzE8LWNoaXNxLnRlc3QodGFiMSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUpCmMxJG9ic2VydmVkCmBgYAoKV2UgZG8gYSBjaGkgc3F1YXJlIHRlc3QgdG8gc2VlIHdoZXRoZXIgdGhlICphY3R1YWwqIG51bWJlciBvZiBwZW9wbGUgd2UgaGF2ZSBpbiBlYWNoIGdyb3VwIGRpZmZlcnMgc2lnbmlmaWNhbnRseSBmcm9tIHdoYXQgd291bGQgYmUgZXhwZWN0ZWQgaWYgdGhlcmUgd2FzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBncm91cHM6CgpgYGB7cn0KYzEKYzEkZXhwZWN0ZWQKCmBgYAoKPldlIHNlZSB0aGF0IFBUU0QgcHJldmFsZW5jZSBpcyBoaWdoZXIgaW4gbm9uLXRyYWRpdGlvbmFsIHJlc3BvbmRlcnMsIGNoaSBzcXVhcmUgWCA9IDE2Ljg5LCBwIDwuMDAxLiBDb21wYXJlZCB0byB0aGUgYWN0dWFsIGRhdGEsIHRoZSBjaGkgc3F1YXJlIHRlc3Qgd291bGQgZXhwZWN0ICgxKSBtb3JlIHJlc2lsaWVudCBwZW9wbGUgdG8gYmUgbm9uLXRyYWRpdGlvbmFsIHJlc3BvbmRlcnMgYW5kICgyKSBtb3JlIFBUU0QgcGVvcGxlIHRvIGJlIHRyYWRpdGlvbmFsIHJlc3BvbmRlcnMuCgojIyBBcmUgdGhlIHNlbGYtcmVwb3J0cyBtZWFzdXJlcyB3ZSdyZSBsb29raW5nIGF0IHJlbGF0ZWQgdG8gZWFjaCBvdGhlcj8KCkNvcnJlbGF0aW9uIG1hdHJpeCBzaG93cyB0aGUgY29ycmVsYXRpb24gc3RhdGlzdGljcyBmb3IgYW55IHNpZ25pZmljYW50IHJlbGF0aW9uc2hpcHMgKHAgPCAuMDUpLgoKUmVkIHNxdWFyZXMgPSBpbnZlcnNlbHkgcmVsYXRlZCAoaS5lLiwgaGlnaGVyIHNjb3JlIG9uIG9uZSA9ICpsb3dlciogc2NvcmUgb24gdGhlIG90aGVyKQoKQmx1ZSBzcXVhcmVzID0gcG9zaXRpdmVseSByZWxhdGVkIChoaWdoZXIgc2NvcmUgb24gb25lID0gaGlnaGVyIHNjb3JlIG9uIHRoZSBvdGhlciwgdG9vKQoKYGBge3J9CnZhcnM8LSBjb3YgJT4lIHNlbGVjdCh0b3RfcGFuYXNfcG9zLHRvdF9wYW5hc19uZWcsdG90X2Rycyx0b3RfYmlzLGNsaW5fdG90X2NhcHM1X3BtLHRvdF9zbmlfbmV0RGl2LHRvdF9zbmlfbnVtUHBsLHRvdF9tb3Nfb3ZlcmFsbFN1cCkKY29yLm1hdCA8LSB2YXJzICU+JSByc3RhdGl4Ojpjb3JfbWF0KCkKY29yLm1hdCAlPiUKICByc3RhdGl4OjpwdWxsX2xvd2VyX3RyaWFuZ2xlKCkgJT4lCiAgcnN0YXRpeDo6Y29yX3Bsb3QobGFiZWwgPSBUUlVFLCBpbnNpZ25pZmljYW50ID0gImJsYW5rIiwgbWV0aG9kPSJjb2xvciIpIApgYGAKCj4gQXJlIHRoZSB0aGluZ3Mgd2UgZXhwZWN0IHRvIGJlIGNvcnJlbGF0ZWQgYWN0dWFsbHkgY29ycmVsYXRlZCAoYW5kIGluIHRoZSBkaXJlY3Rpb24gd2UgcHJlZGljdGVkKT8KCj4gQW55IGNvcnJlbGF0aW9ucyB3ZSBleHBlY3RlZCB0byBzZWUgdGhhdCB3ZXJlIE5PVCBzaWduaWZpY2FudD8KCiogYHRvdF9wYW5hc19wb3NgIGFuZCBgdG90X3BhbmFzX25lZ2AgPSBnZW5lcmFsIHBvc2l0aXZlL25lZ2F0aXZlIGFmZmVjdGl2aXR5IChhIHBlcnNvbidzIGdlbmVyYWwgdGVuZGVuY3kgdG8gZmVlbCBwb3NpdGl2ZSBlbW90aW9ucyBvciBuZWdhdGl2ZSBlbW90aW9ucykgfCAqUG9zaXRpdmUgYW5kIE5lZ2F0aXZlIEFmZmVjdCBTY2FsZSoKCiogYGNsaW5fdG90X2NhcHM1X3BtYCA9IFBUU0Qgc3ltcHRvbXMgaW4gcGFzdCBtb250aCB8ICpDbGluaWNhbCBBc3Nlc3NtZW50IG9mIERTTS01IFBUU0QgU3ltcHRvbXMqCgoqIGB0b3RfYmlzYCA9IHRvdGFsIHNlbGYtcmVwb3J0ZWQgaW1wdWxzaXZpdHkgfCAqQmFycmV0dCBJbXB1bHNpdmVseSBTY2FsZSoKCiogYHRvdF9kcnNgID0gdG90YWwgc2VsZi1yZXBvcnRlZCByaXNrLXRha2luZyB8ICpEb3NwZXJ0IFJpc2sgU2NhbGUqCgoqIGB0b3Rfc25pX25ldERpdmAgPSBzb2NpYWwgbmV0d29yayBkaXZlcnNpdHkgKGRvIHlvdSBrbm93IHBlb3BsZSBhY3Jvc3MgYSBsb3Qgb2YgZGlmZmVyZW50IGNvbnRleHRzL3JlbGF0aW9uc2hpcCB0eXBlcyBbaGlnaCBkaXZlcnNpdHldIG9yIG1vc3RseSB3aXRoaW4gYSBmZXcgdHlwZXMgb2YgcmVsYXRpb25zaGlwcyBbbG93IGRpdmVyc2l0eV0/KSB8ICpTb2NpYWwgTmV0d29yayBJbmRleCoKCiogYHRvdF9zbmlfbnVtUHBsYCA9IG51bWJlciBvZiBwZW9wbGUgdGhhdCB5b3UgdGFsayB0byBhdCBsZWFzdCBvbmNlIGV2ZXJ5IDIgd2Vla3MgfCAqU29jaWFsIE5ldHdvcmsgSW5kZXgqCgoqIGB0b3RfbW9zX292ZXJhbGxTdXBgID0gb3ZlcmFsbCBwZXJjZWl2ZWQgc3VwcG9ydCBmcm9tIHBlb3BsZSBpbiB5b3VyIGxpZmUgaW4gZ2VuZXJhbCB8ICpNT1MgU29jaWFsIFN1cHBvcnQgU3VydmV5KiAKCgoKCiMjIFEyOiBJcyB0aGVyZSBhIGRpZmZlcmVuY2UgaW4gcGVyY2VpdmVkIHNvY2lhbCBzdXBwb3J0IGFuZCBzb2NpYWwgbmV0d29ya3MgYmV0d2VlbiBQVFNEIGFuZCByZXNpbGllbnQgZ3JvdXBzPwoKV2UgdXNlZCBpbmRlcGVuZGVudCBzYW1wbGVzIFQgdGVzdHM6CgpgYGB7cn0KCnQudGVzdChkcCR0b3RfbW9zX292ZXJhbGxTdXAgfiBkcCRwdHNkLCBwYWlyZWQgPSBGQUxTRSApCmBgYAoKPlRoZSBncm91cHMgQVJFIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGluIHRlcm1zIG9mIHRoZWlyIG92ZXJhbGwgcGVyY2VpdmVkIHNvY2lhbCBzdXBwb3J0LCBUID0gNi41MSwgcCA8IC4wMDEuIFRoZSBtZWFuIHNjb3JlIGZvciBvdmVyYWxsIHNvY2lhbCBzdXBwb3J0ICBpbiB0aGUgcmVzaWxpZW50IGdyb3VwIGlzIDg4LjAyIGFuZCB0aGUgbWVhbiBpbiB0aGUgUFRTRCBncm91cCBpcyA1NS4yMC4gVGhpcyBtZWFucyB0aGUgUFRTRCBncm91cCBwZXJjZWl2ZXMgdGhlbXNlbHZlcyB0byBoYXZlICpsZXNzKiBzb2NpYWwgc3VwcG9ydC4KCmBgYHtyfQp0LnRlc3QoZHAkdG90X3NuaV9uZXREaXYgfiBkcCRwdHNkLCBwYWlyZWQgPSBGQUxTRSApCmBgYAo+VGhlIGdyb3VwcyBhcmUgZGlmZmVyZW50IGluIHRlcm1zIG9mIHRoZWlyIHNvY2lhbCBuZXR3b3JrIGRpdmVyc2l0eSwgVCA9IDEuOTgsIHRob3VnaCBwIDwgLjA1NiAoc28gbm90IHF1aXRlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYXQgYSB0aHJlc2hvbGQgb2YgcCA8LjA1KS4gVGhlIG1lYW4gbmV0d29yayBkaXZlcnNpdHkgc2NvcmUgd2FzIDYuMDMgaW4gdGhlIHJlc2lsaWVudCBncm91cCBhbmQgNC44OSBpbiB0aGUgUFRTRCBncm91cC4gVGhpcyBtZWFucyB0aGUgUFRTRCBncm91cCBoYXMgYSBsZXNzIGRpdmVyc2Ugc29jaWFsIG5ldHdvcmsuCgpgYGB7cn0KdC50ZXN0KGRwJHRvdF9zbmlfbnVtUHBsIH4gZHAkcHRzZCwgcGFpcmVkID0gRkFMU0UgKQoKYGBgCj5UaGUgZ3JvdXBzIEFSRSBkaWZmZXJlbnQgaW4gdGVybXMgb2YgdGhlIG51bWJlciBvZiBwZW9wbGUgaW4gdGhlaXIgc29jaWFsIG5ldHdvcmssIFQgPSAxLjc4LCB0aG91Z2ggcCA8IC4wODggKHNvIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGF0IGEgdGhyZXNob2xkIG9mIHAgPC4wNSkuIFRoZSBtZWFuIG51bWJlciBvZiBwZW9wbGUgd2FzIDIxLjc3IGluIHRoZSByZXNpbGllbnQgZ3JvdXAgYW5kIDE0LjI4IGluIHRoZSBQVFNEIGdyb3VwLiBUaGlzIG1lYW5zIHRoZSBQVFNEIGdyb3VwIGhhcyBhIHNtYWxsZXIgc29jaWFsIG5ldHdvcmsuCgpIZXJlJ3Mgd2hhdCB0aGF0IGxvb2tzIGxpa2UgaW4gYSBwbG90OgoKYGBge3J9CgpwbCA8LSBkcCAlPiUgc2VsZWN0KHB0c2Qsc3RhcnRzX3dpdGgoInRvdF9zbmkiKSwgdG90X21vc19vdmVyYWxsU3VwKSAgJT4lIHBpdm90X2xvbmdlcihuYW1lc190byA9ICJtZWFzdXJlIiwgdmFsdWVzX3RvID0gInNvY2lhbCIsIGNvbHM9YygyLDMsNCkpIAoKZ2dwbG90KHBsLCBhZXMocHRzZCwgc29jaWFsLCBmaWxsPXB0c2QpKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiY29sIiwgZnVuID0gbWVhbiwgcG9zaXRpb24gPSAiZG9kZ2UiLCBjb2xvcj0iYmxhY2siKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiZXJyb3JiYXIiLCBmdW4uZGF0YSA9IG1lYW5fc2UsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSwgd2lkdGggPSAwLjI1LCBjb2xvcj0iYmxhY2siKSArIGxhYnModGl0bGU9InNvY2lhbCBzdXBwb3J0IG1lYXN1cmVzIChNT1MsIFNOSSkiKSAgKyB0aGVtZV9jbGVhbihiYXNlX3NpemUgPSAxNikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzJlYjRlNyIsIiMyOTFkNmQiLCAiI2Q0MTQ4ZCIgKSkgKyAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjMmViNGU3IiwgIiMyOTFkNmQiLCAgIiNkNDE0OGQiICkpICsgeGxhYigiIikgKyB5bGFiKCJzY29yZSIpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoJ1Jlc2lsaWVudCcsICdQVFNEJykpICsgZmFjZXRfd3JhcChzY2FsZXMgPSAiZnJlZV95Iiwgfm1lYXN1cmUpCmBgYAoKIyMgUTM6IElzIHRoZXJlIGEgZGlmZmVyZW5jZSBpbiBwZXJzb25hbGl0eSB0cmFpdHMgYmV0d2VlbiB0cmFkIHZzLiBub24tdHJhZCByZXNwb25kZXJzPyAKCgojIyMgUmlzay10YWtpbmcgJiBpbXB1bHNpdml0eQoKV2UgY2hvc2UgdGhlc2UgbWVhc3VyZXMgYmVjYXVzZSB3ZSB0aG91Z2h0IHRoYXQgcGVyaGFwcyBwZW9wbGUgZHJhd24gdG8gdHJhZGl0aW9uYWwgcmVzcG9uZGVyIGNhcmVlcnMgbWlnaHQgaGF2ZSBtb3JlIG9mIGFuIGFmZmluaXR5IGZvciBoaWdoLWFkcmVuYWxpbmUgc2l0dWF0aW9ucywgcGVyY2VpdmluZyB0aGVtIGFzIG1vcmUgZXhjaXRpbmcgdGhhbiB0aHJlYXRlbmluZywgYW5kIHBlcmhhcHMgdGhpcyBtaWdodCBiZSB3aHkgd2Ugc2VlIG1vcmUgUFRTRCBpbiB0aGUgbm9uLXRyYWRpdGlvbmFsIHJlc3BvbmRlcnMuCmBgYHtyfQp0LnRlc3QoZHAkdG90X2JpcyB+IGRwJHRyYWRpdGlvbmFsX3Jlc3BvbmRlciwgcGFpcmVkID0gRkFMU0UgKQp0LnRlc3QoZHAkdG90X2RycyB+IGRwJHRyYWRpdGlvbmFsX3Jlc3BvbmRlciwgcGFpcmVkID0gRkFMU0UgKQoKYGBgCgo+Q29udHJhcnkgdG8gb3VyIGh5cG90aGVzaXMsIHdlIGRpZCBOT1Qgc2VlIGRpZmZlcmVuY2VzIGluIHRyYWRpdGlvbmFsIHZzLiBub24tdHJhZGl0aW9uYWwgcmVzcG9uZGVycyBpbiB0ZXJtcyBvZiBzY29yZXMgb24gdGhlIGltcHVsc2l2aXR5IGFuZCByaXNrIHRha2luZyBxdWVzdGlvbm5haXJlcy4KCmBgYHtyfQpwbDEgPC0gZHAgJT4lIHNlbGVjdCh0cmFkaXRpb25hbF9yZXNwb25kZXIsdG90X2Rycyx0b3RfYmlzKSAlPiUgcGl2b3RfbG9uZ2VyKG5hbWVzX3RvID0gIm1lYXN1cmUiLCB2YWx1ZXNfdG8gPSAic2NvcmUiLCBjb2xzPWMoMjozKSApCgpnZ3Bsb3QocGwxLCBhZXModHJhZGl0aW9uYWxfcmVzcG9uZGVyLCBzY29yZSwgZmlsbD10cmFkaXRpb25hbF9yZXNwb25kZXIpKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiY29sIiwgZnVuID0gbWVhbiwgcG9zaXRpb24gPSAiZG9kZ2UiLCBjb2xvcj0iYmxhY2siKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiZXJyb3JiYXIiLCBmdW4uZGF0YSA9IG1lYW5fc2UsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSwgd2lkdGggPSAwLjI1LCBjb2xvcj0iYmxhY2siKSArIHRoZW1lX2NsZWFuKGJhc2Vfc2l6ZSA9IDE2KSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICB2anVzdCA9IDAsCiAgICBoanVzdCA9IDAsCiAgICBhbmdsZSA9IC0zNSkpICsgbGFicyh0aXRsZT0iSW1wdWxzaXZpdHkgYW5kIFJpc2stdGFraW5nIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMmRjOGY4IiwiI2Q0MTQ4ZCIgKSkgKyB4bGFiKCIiKSArIHlsYWIoInNjb3JlIikgKyBmYWNldF93cmFwKHNjYWxlcyA9ICJmcmVlX3kiLCB+bWVhc3VyZSkKCmBgYAoKIyMjIFBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBhZmZlY3QKCldlIGNob3NlIHRoZXNlIG1lYXN1cmVzIGJlY2F1c2Ugd2UgdGhvdWdodCB0aGF0IHBlcmhhcHMgcGVvcGxlIGRyYXduIHRvIHRyYWRpdGlvbmFsIHJlc3BvbmRlciBjYXJlZXJzIG1pZ2h0IGhhdmUgYSBncmVhdGVyIHRlbmRlbmN5IHRvIGJlIHBvc2l0aXZlIGFuZCBsZXNzIG5ldXJvdGljIChpLmUuLCBwcm9uZSB0byBuZWdhdGl2ZSBlbW90aW9ucykgLS0gYW5kIHRoaXMgY291bGQgaGVscCB0aGVtIGJlIHJlc2lsaWVudCB0byBQVFNELiAKYGBge3J9CnQudGVzdChkcCR0b3RfcGFuYXNfcG9zIH4gZHAkdHJhZGl0aW9uYWxfcmVzcG9uZGVyLCBwYWlyZWQgPSBGQUxTRSApCnQudGVzdChkcCR0b3RfcGFuYXNfbmVnIH4gZHAkdHJhZGl0aW9uYWxfcmVzcG9uZGVyLCBwYWlyZWQgPSBGQUxTRSApCmBgYAoKCgoKPlllcywgdGhlIHRyYWRpdGlvbmFsIHJlc3BvbmRlcnMgYXJlLCBvbiBhdmVyYWdlLCBoaWdoZXIgaW4gcG9zaXRpdmUgYW5kIGxvd2VyIGluIG5lZ2F0aXZlIGFmZmVjdGl2aXR5LCB2cy4gdGhlIG5vbi10cmFkaXRpb25hbCByZXNwb25kZXJzLgoKSG93ZXZlciwgd2Ugbm90ZWQgdGhhdCB0aGlzIHJlc3VsdCBjb3VsZCBiZSBjb25mb3VuZGVkIGJ5IFBUU0Q6IHdpdGggc2lnbmlmaWNhbnRseSBtb3JlIHByb3BvcnRpb24gb2Ygbm9uLXRyYWRpdGlvbmFsIHJlc3BvbmRlcnMgaGF2aW5nIFBUU0QsIHdlIGRvbid0IGtub3cgaWYgYmVpbmcgbW9yZSBuZWdhdGl2ZS9sZXNzIHBvc2l0aXZlIGlzIGEgY29uc2VxdWVuY2Ugb2YgaGF2aW5nIFBUU0Qgb3Igd2VyZSB0aGVyZSBwcmlvciB0byA5LzExIGF0dGFja3MuCgpgYGB7cn0KCnBsMiA8LSBkcCAlPiUgc2VsZWN0KHRyYWRpdGlvbmFsX3Jlc3BvbmRlcixzdGFydHNfd2l0aCgidG90X3BhbmFzIikpICU+JSBwaXZvdF9sb25nZXIobmFtZXNfdG8gPSAibWVhc3VyZSIsIHZhbHVlc190byA9ICJzY29yZSIsIGNvbHM9YygyOjMpICkgCgpnZ3Bsb3QocGwyLCBhZXModHJhZGl0aW9uYWxfcmVzcG9uZGVyLCBzY29yZSwgZmlsbD10cmFkaXRpb25hbF9yZXNwb25kZXIpKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiY29sIiwgZnVuID0gbWVhbiwgcG9zaXRpb24gPSAiZG9kZ2UiLCBjb2xvcj0iYmxhY2siKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiZXJyb3JiYXIiLCBmdW4uZGF0YSA9IG1lYW5fc2UsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSwgd2lkdGggPSAwLjI1LCBjb2xvcj0iYmxhY2siKSArIGxhYnModGl0bGU9IlBvc2l0aXZlIGFuZCBOZWdhdGl2ZSBBZmZlY3QgU2NhbGUiKSAgKyB0aGVtZV9jbGVhbihiYXNlX3NpemUgPSAxNikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgYW5nbGUgPSAtMzUsCiAgICB2anVzdCA9IDAsCiAgICBoanVzdCA9IDApKSArIHhsYWIoIiIpICsKICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiMyZGM4ZjgiLCIjZDQxNDhkIiApKSArIHhsYWIoIiIpICsgeWxhYigic2NvcmUiKSArCiAgZmFjZXRfd3JhcCh+bWVhc3VyZSkKYGBgCgojIFNlY3Rpb24gQgojIyBRMToJRG9lcyBhdHRlbnRpb24gYmlhcyAoc2VsZWN0aXZlIGF0dGVudGlvbiBmb3IgdGhyZWF0KSBkaWZmZXIgYmV0d2VlbiBQVFNEIGFuZCByZXNpbGllbnQgZ3JvdXBzPwoKCiMjIyBUYXNrIFBlcmZvcm1hbmNlIE92ZXJhbGwKYGBge3J9CgpwbDMgPC0gZHAgJT4lIHNlbGVjdChyZWNvcmRfaWQscHRzZCxuZXV0cmFsX25ldXRyYWwsbmV1dHJhbF90aHJlYXQsdGhyZWF0X25ldXRyYWwpICU+JSBwaXZvdF9sb25nZXIobmFtZXNfdG8gPSAiY29uZGl0aW9uIiwgdmFsdWVzX3RvID0gIm1lYW5fUlQiLCBjb2xzPWMoMzo1KSApIAoKcGwzICU+JSBncm91cF9ieShwdHNkLGNvbmRpdGlvbikgJT4lIHN1bW1hcml6ZShtZWFuKG1lYW5fUlQpKQpgYGAKCgo+IFdoZW4gYm90aCBzdGltdWxpIGFyZSBuZXV0cmFsIHdvcmRzLCB0aGUgbWVhbiByZWFjdGlvbiB0aW1lIGluIHRoZSBQVFNEIGdyb3VwIGlzIDU5OSBtaWxsaXNlY29uZHMgYW5kIHRoZSBtZWFuIHJlYWN0aW9uIHRpbWUgaW4gdGhlIHJlc2lsaWVudC9ub24gUFRTRCBwYXJ0aWNpcGFudHMgaXMgNTU0IG1pbGxpc2Vjb25kcy4KCj4gV2hlbiB0aGVyZSBpcyBhIGJvdGggdGhyZWF0IGFuZCBuZXV0cmFsIHdvcmRzICphbmQqIHRoZSBwcm9iZSBhcHBlYXJzIGluIHRoZSBwbGFjZSBvZiB0aGUgdGhyZWF0IHdvcmQsIHRoZSBtZWFuIHJlYWN0aW9uIHRpbWUgaW4gdGhlIFBUU0QgZ3JvdXAgaXMgNTc1IG1pbGxpc2Vjb25kcyBhbmQgdGhlIG1lYW4gcmVhY3Rpb24gdGltZSBpbiB0aGUgcmVzaWxpZW50L25vbiBQVFNEIHBhcnRpY2lwYW50cyBpcyA1NTIgbWlsbGlzZWNvbmRzLgoKPiBXaGVuIHRoZXJlIGlzIGEgYm90aCB0aHJlYXQgYW5kIG5ldXRyYWwgd29yZHMgKmFuZCogdGhlIHByb2JlIGFwcGVhcnMgaW4gdGhlIHBsYWNlIG9mIHRoZSBuZXV0cmFsIHdvcmQsIHRoZSBtZWFuIHJlYWN0aW9uIHRpbWUgaW4gdGhlIFBUU0QgZ3JvdXAgaXMgNTcxIG1pbGxpc2Vjb25kcyBhbmQgdGhlIG1lYW4gcmVhY3Rpb24gdGltZSBpbiB0aGUgcmVzaWxpZW50L25vbiBQVFNEIHBhcnRpY2lwYW50cyBpcyA1NTQgbWlsbGlzZWNvbmRzLgoKYGBge3J9CgpnZ3Bsb3QocGwzLCBhZXMoY29uZGl0aW9uLCBtZWFuX1JULCBmaWxsPWNvbmRpdGlvbikpICsgCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiY29sIiwgZnVuID0gbWVhbiwgcG9zaXRpb24gPSAiZG9kZ2UiLCBjb2xvcj0iYmxhY2siKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiZXJyb3JiYXIiLCBmdW4uZGF0YSA9IG1lYW5fc2UsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSwgd2lkdGggPSAwLjI1LCBjb2xvcj0iYmxhY2siKSArIGxhYnModGl0bGU9Ik1lYW4gcmVhY3Rpb24gdGltZSIpICArIHRoZW1lX2NsZWFuKGJhc2Vfc2l6ZSA9IDE0KSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICBhbmdsZSA9IC00NSwKICAgIHZqdXN0ID0gMSwKICAgIGhqdXN0ID0gMCkpICsgeGxhYigiIikgKwogICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZGFya2dyZXkiLCJibHVlIiAsInJlZCIpKSArIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkJvdGggd29yZHMgXG5OZXV0cmFsIiwiVGhyZWF0IFxuKHByb2JlIGxvY2F0aW9uKVxuIHcvIE5ldXRyYWwiLCJOZXV0cmFsIFxuKHByb2JlIGxvY2F0aW9uKVxuIHcvIFRocmVhdCIpKSArIHhsYWIoIiIpICsgeWxhYigibWVhblJUIikgKwogIGZhY2V0X3dyYXAofnB0c2QpIApgYGAKCiMjIyBBY2N1cmFjeQoKYGBge3J9CnQudGVzdChkcCRvdmVyYWxsX2FjY3VyYWN5IH4gZHAkcHRzZCwgcGFpcmVkID0gRkFMU0UgKQpgYGAKCj5ZZXMsIHRoZSByZXNpbGllbnQgZ3JvdXAgaXMgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBQVFNEIGdyb3VwLCBvdmVyYWxsLCB0aG91Z2ggdGhlIGRpZmZlcmVuY2UgaXMgbm90IHRoYXQgbGFyZ2UgKDk1JSB2cy4gOTMlKQoKYGBge3IsZXZhbD1GQUxTRX0KZ2dwbG90KGRwLCBhZXMocHRzZCwgb3ZlcmFsbF9hY2N1cmFjeSwgZmlsbD1wdHNkKSkgKyAKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICJjb2wiLCBmdW4gPSBtZWFuLCBwb3NpdGlvbiA9ICJkb2RnZSIsIGNvbG9yPSJibGFjayIpICsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICJlcnJvcmJhciIsIGZ1bi5kYXRhID0gbWVhbl9zZSwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpLCB3aWR0aCA9IDAuMjUsIGNvbG9yPSJibGFjayIpICsgbGFicyh0aXRsZT0iT3ZlcmFsbCB0YXNrIGFjY3VyYWN5IikgKyB0aGVtZV9jbGVhbihiYXNlX3NpemUgPSAxNCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgYW5nbGUgPSAwLAogICAgdmp1c3QgPSAwLAogICAgaGp1c3QgPSAwKSkgKyB4bGFiKCIiKSsgCnNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMmViNGU3IiwiIzI5MWQ2ZCIsICIjZDQxNDhkIikpICsgeGxhYigiIikgKyB5bGFiKCIlIGNvcnJlY3QgcmVzcG9uc2VzIikgK3NjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygnUmVzaWxpZW50JywgJ1BUU0QnKSkgCmBgYAoKCgoKIyMjIFRocmVhdCBCaWFzCldlIGNhbGN1bGF0ZWQgdGhyZWF0IGJpYXMgYnkgc3VidHJhY3RpbmcgUlRzIGluIHRoZSAicHJvYmUgaW4gdGhyZWF0IGxvY2F0aW9uIiBjb25kaXRpb24gZnJvbSBSVHMgaW4gdGhlICJwcm9iZSBpbiBuZXV0cmFsIGxvY2F0aW9uICgrIG90aGVyIHdvcmQgaXMgdGhyZWF0KSIgY29uZGl0aW9uOiBgdGhyZWF0X2JpYXMgPSBuZXV0cmFsX3RocmVhdCBtaW51cyB0aHJlYXRfbmV1dHJhbGApLgoKUG9zaXRpdmUgbnVtYmVycyA9IHNlbGVjdGl2ZSBhdHRlbnRpb24gZm9yIHRocmVhdCAodGhyZWF0IGJpYXM7IGVzc2VudGlhbGx5LCBmYXN0ZXIgdG8gdGhyZWF0IHRoYW4gbmV1dHJhbCkuIE5lZ2F0aXZlIG51bWJlcnMgaW5kaWNhdGUgdGhyZWF0IGF2b2lkYW5jZSBiaWFzIChlc3NlbnRpYWxseSwgZmFzdGVyIHRvIG5ldXRyYWwgdGhhbiB0aHJlYXQpLgoKYGBge3J9CnQudGVzdChkcCR0aHJlYXRfYmlhcyB+IGRwJHB0c2QsIHBhaXJlZCA9IEZBTFNFICkKYGBgCgpgYGB7cn0KZ2dwbG90KGRwLCBhZXMocHRzZCwgdGhyZWF0X2JpYXMsIGZpbGw9cHRzZCkpICsgCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiY29sIiwgZnVuID0gbWVhbiwgcG9zaXRpb24gPSAiZG9kZ2UiLCBjb2xvcj0iYmxhY2siKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiZXJyb3JiYXIiLCBmdW4uZGF0YSA9IG1lYW5fc2UsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSwgd2lkdGggPSAwLjI1LCBjb2xvcj0iYmxhY2siKSArIGxhYnModGl0bGU9IlRocmVhdCBCaWFzIikgKyB0aGVtZV9jbGVhbihiYXNlX3NpemUgPSAxNikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgYW5nbGUgPSAwLAogICAgdmp1c3QgPSAwLAogICAgaGp1c3QgPSAwKSkgKyB4bGFiKCIiKSsgCnNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMmViNGU3IiwiIzI5MWQ2ZCIsICIjZDQxNDhkIikpICsgeGxhYigiIikgKyB5bGFiKCJSVCBkaWZmZXJlbmNlIikgK3NjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygnUmVzaWxpZW50JywgJ1BUU0QnKSkgCmBgYAoKPiBUaGVyZSBpcyBOT1QgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIHRocmVhdCBiaWFzIGJldHdlZW4gZ3JvdXBzLiBOb3RlIHRoYXQgdGhlIElhY292ZWxsaSBwYXBlciB5b3UgcmVhZCBzaW1pbGFybHkgZGlkIG5vdCBmaW5kIGEgZGlmZmVyZW5jZSBpbiB0aHJlYXQgYmlhcywgb25seSB0aHJlYXQgYmlhcyAqdmFyaWFiaWxpdHkqLgoKPiBTbywgd2hhdCBkbyB3ZSBtYWtlIG9mIHRoaXM/