install.packages(“rciplot”) # Recording Keeping:
There are two master files that we are using for analyses. They are
essentially the same file, though one is in wide format and the other is
in long format.
The wide format dataset is called “Purrble_Master_Wide.” The long
dataset format dataset is called “Purrble_Long_Master.” The wide dataset
has all of the pre and posttest variables calculated, while the long
does not. Otherwise, they do not differ.
This dataset includes the N=153 participants who were included in the
randomized control trial examining Purrble with a population of
university students. All participants were members of the LGTBQ+
community.
These analyses were conducted in October by Aubrey Rhodes. We use the
“final” datasets in which we removed participant C72, who had no
information on gender identity.
These analyses remove all of the variables except for emotion
regulation, PHQ, and Anxiety as outcomes.
2.1. Participants
2.1.1 Participant Disposition
Corresponding Text: “resulting in a final sample size of 153
participants: Purrble condition (n=76), and the waitlist control
condition (n=77).”
“Gender identity was evenly distributed across conditions, with 76
participants (49.7%) identifying as cisgender and 77 identifying as
transgender, gender non-conforming, or questioning and or gender diverse
(TGD; (50.3%).”
“Within conditions, the Purrble group consisted of 39 cisgender
participants and 37 TGD participants, while the waitlist control group
consisted of 37 cisgender participants and 40 TGD participants.”
Table 1: Number of Participants by Condition
| Purrble Treatment |
76 |
| Waitlist Control |
77 |
| Total |
153 |
Table 2: Number of Participants by Gender Identity
| Cisgender |
76 |
| Transgender |
77 |
| Total |
153 |
Table 3: Cross-tabulation of Condition by Gender
Identity
| Purrble Treatment |
39 |
37 |
| Waitlist Control |
37 |
40 |
2.1.2 Participant Characteristics
Participants characteristics including sexual orientation,
race/ethnicity, and age are shown reported by condition in Table 1.
Age: Descriptives
Summarizes age (Mean, SD, Min, Max) by condition.
Table: Descriptive Statistics for Age by Condition (APA Format)
condition | Mean | SD | Min | Max |
|---|
Purrble Treatment | 20.42 | 2.29 | 16.00 | 25.00 |
Waitlist Control | 20.09 | 2.46 | 16.00 | 25.00 |
Sexual Orientation- Simplified
Table: Sexual Orientation (so_simplified) by Condition (Counts and Percentages)
| so_simplified |
Purrble Treatment |
Waitlist Control |
Total |
| asexual |
13 (17.1%) |
9 (11.7%) |
22 (14.4%) |
| bisexual |
28 (36.8%) |
25 (32.5%) |
53 (34.6%) |
| demisexual |
2 (2.6%) |
1 (1.3%) |
3 (2%) |
| gay/lesbian |
11 (14.5%) |
18 (23.4%) |
29 (19%) |
| heterosexual |
1 (1.3%) |
0 (0%) |
1 (0.7%) |
| pansexual |
8 (10.5%) |
9 (11.7%) |
17 (11.1%) |
| queer |
13 (17.1%) |
15 (19.5%) |
28 (18.3%) |
Race
Table: Race Counts and Percentages by Condition
Race |
Purrble Treatment |
Waitlist Control |
Total |
| Race |
count_Purrble Treatment |
percentage_Purrble Treatment |
count_Waitlist Control |
percentage_Waitlist Control |
total_count |
total_percentage |
| Race_Arabic |
0 |
0.0 |
1 |
1.3 |
1 |
0.7 |
| Race_Asian |
10 |
13.2 |
17 |
22.1 |
27 |
17.6 |
| Race_Black |
1 |
1.3 |
3 |
3.9 |
4 |
2.6 |
| Race_Hispanic |
2 |
2.6 |
0 |
0.0 |
2 |
1.3 |
| Race_White |
60 |
78.9 |
55 |
71.4 |
115 |
75.2 |
| Race_unknown |
9 |
11.8 |
5 |
6.5 |
14 |
9.2 |
5 people in the Purrble Treatment condition reported multiple racial identities.
4 people in the Waitlist Control condition reported multiple racial identities.
2.1.3 Engagement and Retention
Number of questionnaires
Results Text: Participants completed an average of
12.4 questionnaires in the Purrble and 12.9 questionnaires in the
control condition out of a possible 14 (Baseline [“Week 0”] through
Follow-Up [“Week 13”]).
Table 3: Total Sessions Attended by Condition
| condition |
mean_sessions |
sd_sessions |
n |
| Purrble Treatment |
12.35526 |
2.237284 |
76 |
| Waitlist Control |
12.85714 |
2.056532 |
77 |
Attrition:
Results Text Attrition rates were low overall and
did not differ significantly by condition, χ²(1, N = 153) = 0.11, p =
.75, with 9.2% attrition in the Purrble condition (7 of 76 participants)
and 6.5% attrition in the waitlist control condition (5 of 77
participants).
Table 7: Attrition Rate by Condition
(with Completed and Not Completed counts)
| condition |
n |
Completed |
Not_Completed |
attrition_rate |
attrition_percent |
| Waitlist |
77 |
72 |
5 |
0.0649351 |
6.5 |
| Purrble |
76 |
69 |
7 |
0.0921053 |
9.2 |
Results Text: “Across the full sample, regression
analyses indicated a significant decline in participation over time,
with the average number of weekly respondents decreasing by
approximately 2.14 per week (SE = 0.29, t = –7.36, p < .001). When
examined by condition, participation declined at a rate of –1.46
participants per week in the Purrble group (SE = 0.23, t = –6.22, p <
.001) and –0.69 participants per week in the waitlist control (SE =
0.12, t = –5.82, p < .001). A time × condition interaction (β = 0.77,
SE = 0.26, p = .007) suggested a steeper linear decline in the Purrble
group, though the absolute difference was small.”
Across the full sample, participation declined by -2.16 per week (SE = 0.29, t = -7.39, p = 0.000).
Slope difference (Week × Condition) estimate = 0.76, SE = 0.26, t = 2.86, p = 0.009; 95% CI [0.21, 1.30]
Waitlist decline = -1.46 /week
Purrble decline = -0.70 /week
Participation by Group Over Time
Reviewer’s Comment: “Report the response rate to
weekly surveys over time. Declining engagement is common in mental
health populations and raises risk of selective reporting.”
Response “We agree that reporting response rates
over time is important to assess potential engagement decline and
selective response bias. We have now included a table summarizing weekly
participation rates by condition across the study period.”
Added Text, Results “Weekly response rates are
summarized by condition in Table X and Figure X.”
Table: Weekly Participation Rates (% of Total Randomized) by Condition
| Week |
Purrble Treatment |
Waitlist Control |
| 1 |
97.4 |
94.8 |
| 2 |
97.4 |
96.1 |
| 3 |
98.7 |
96.1 |
| 4 |
94.7 |
90.9 |
| 5 |
89.5 |
92.2 |
| 6 |
88.2 |
92.2 |
| 7 |
89.5 |
93.5 |
| 8 |
90.8 |
94.8 |
| 9 |
80.3 |
87.0 |
| 10 |
82.9 |
85.7 |
| 11 |
81.6 |
85.7 |
| 12 |
65.8 |
87.0 |
| 13 |
81.6 |
88.3 |

Across the full sample, regression analyses indicated a significant
decline in participation over time, with the average number of weekly
respondents decreasing by approximately 2.14 per week (SE = 0.29, t =
–7.36, p < .001). When examined by condition, participation declined
at a rate of –1.46 participants per week in the Purrble group (SE =
0.23, t = –6.22, p < .001) and –0.70 participants per week in the
waitlist control (SE = 0.12, t = –5.82, p < .001). A time × condition
interaction (β = 0.77, SE = 0.26, p = .007) suggested a slightly steeper
linear decline in the Purrble group, though the absolute difference was
small (approximately 0.2–0.3 participants per week).
2.2. Preliminary Analyses
2.2.1 Descriptive Statistics
Reviewer Comment: “Please provide absolute group
means and SDs at baseline and follow-up for all outcomes in the main
text, not only adjusted differences.”
Response: “Thank you for pointing out this omission.
We agree that presenting absolute group means and standard deviations
provides important context for interpreting adjusted effects. We have
now added a table summarizing pre- and post-test descriptive statistics
(means and standard deviations) for all outcomes by condition.”
Added Text: Table X presents pre- and post-test
descriptive statistics (means and standard deviations) for all primary
and secondary outcomes by condition.
Means and standard deviations for each outcome by condition and time point
|
Waitlist |
Purrble |
| Outcome |
Pre |
Post |
Pre |
Post |
| Emotion Regulation |
28.38 (4.32) |
28.61 (6.52) |
27.92 (5.10) |
25.26 (7.80) |
| Anxiety |
13.65 (3.74) |
13.20 (4.46) |
13.78 (4.25) |
12.00 (5.47) |
| Depression |
14.70 (4.24) |
15.15 (5.93) |
15.39 (4.90) |
13.44 (6.66) |
Means and standard deviations (M ± SD) for each outcome by condition, time point, and gender identity
| Outcome |
Identity Group |
Condition |
Pre |
Post |
| Anxiety |
Cisgender |
Purrble |
13.13 (4.11) |
10.50 (5.37) |
| Anxiety |
Cisgender |
Waitlist |
13.41 (3.45) |
13.55 (4.57) |
| Anxiety |
TGD |
Purrble |
14.46 (4.34) |
13.46 (5.22) |
| Anxiety |
TGD |
Waitlist |
13.88 (4.02) |
12.85 (4.37) |
| Depression |
Cisgender |
Purrble |
14.18 (4.67) |
11.65 (6.84) |
| Depression |
Cisgender |
Waitlist |
14.38 (4.32) |
15.71 (6.54) |
| Depression |
TGD |
Purrble |
16.66 (4.87) |
15.18 (6.07) |
| Depression |
TGD |
Waitlist |
15.00 (4.20) |
14.59 (5.27) |
| Emotion Regulation |
Cisgender |
Purrble |
27.31 (5.21) |
23.03 (8.18) |
| Emotion Regulation |
Cisgender |
Waitlist |
28.38 (4.13) |
28.84 (6.97) |
| Emotion Regulation |
TGD |
Purrble |
28.56 (4.97) |
27.42 (6.85) |
| Emotion Regulation |
TGD |
Waitlist |
28.38 (4.55) |
28.38 (6.13) |
2.2.2 Baseline Equivalence
Results Text: Baseline measures of outcome variables and
participant age did not differ significantly between conditions.
### Table. Baseline Equivalence Across Conditions (Independent-Samples t-tests)
Variable | Dependent Variable | t | df | p | d | 95% CI |
|---|
Age | age | 0.86 | 150.51 | .392 | 0.14 | [-0.18, 0.46] |
Emotion Regulation (DERS-8) | Pre_DERS8_Sum | -0.60 | 146.06 | .551 | -0.10 | [-0.41, 0.22] |
Anxiety (GAD-7) | Pre_GAD7_Sum | 0.20 | 147.61 | .840 | 0.03 | [-0.29, 0.35] |
Depression (PHQ-9) | Pre_PHQ9_Sum | 0.93 | 147.00 | .353 | 0.15 | [-0.17, 0.47] |
##2.2.3 Outliers
Methods Text: Second, we performed multivariate outlier
analyses to identify influential data points (63).
Results Text: We examined potential multivariate outliers
among baseline variables (Pre-DERS8, Pre-GAD7, Pre-PHQ9) using
Mahalanobis distance. Distances were compared to the χ² distribution
with 3 degrees of freedom at p < .99 (critical value = 11.34). One
participant exceeded this threshold (D² = 14.57), indicating a somewhat
atypical combination of baseline emotion-regulation, anxiety, and
depression scores. To evaluate influence on model results, we reran all
primary analyses (ANCOVA and linear mixed-effects models) with and
without this participant. The pattern, magnitude, and significance of
results were unchanged. Accordingly, all analyses were reported using
the full sample.
FALSE TRUE
151 1

Outlier participant(s) based on Mahalanobis distance (p < .99):
##2.2.4 Attrition Analysis. Methods Text: Third, we
conducted attrition analyses (64), with attrition operationalised as
participants failing to fill in any follow-up questionnaires (Weeks
11–13). A binary indicator was created to represent follow-up completion
(1 = filled in at least one follow-up questionnaire; 0 = filled in
none). Attrition rates were calculated overall, by condition, and by
gender identity, using chi-square tests to determine whether attrition
differed by condition or gender identity.
Results Text: Chi-square tests indicated that attrition
rates did not differ significantly by condition, χ²(1) = 0.11, p = .75,
or by gender identity, χ²(1) <0.01, p = 1. While and there were no
main or interactive effects of attrition on outcomes.
### Chi-square test for attrition by Condition :
Pearson's Chi-squared test with Yates' continuity correction
data: ct
X-squared = 0.10517, df = 1, p-value = 0.7457
Table: Attrition Rate by Condition (with Completed and Not Completed counts)
| condition |
n |
Completed |
Not_Completed |
attrition_rate |
attrition_percent |
| Purrble Treatment |
76 |
69 |
7 |
0.0921053 |
9.2 |
| Waitlist Control |
77 |
72 |
5 |
0.0649351 |
6.5 |
NULL
### Chi-square test for attrition by Gender Identity :
Pearson's Chi-squared test with Yates' continuity correction
data: ct
X-squared = 1.4323e-30, df = 1, p-value = 1
Table: Attrition Rate by Gender Identity (with Completed and Not Completed counts)
| identity_group |
n |
Completed |
Not_Completed |
attrition_rate |
attrition_percent |
| 0 |
76 |
70 |
6 |
0.0789474 |
7.9 |
| 1 |
77 |
71 |
6 |
0.0779221 |
7.8 |
NULL
Methods Text: Then, to assess potential attrition bias, we
conducted two-way ANOVAs testing for Condition × Attrition Status
effects on each baseline outcome variable.
Results Text: No main or interactive effects of attrition
status were observed on any baseline variable, indicating no evidence of
differential attrition
Table: Two-way ANOVAs for Baseline Outcomes by Condition and Attrition Status
| Variable |
Effect |
df |
F |
p |
| Emotion Regulation (DERS-8) |
Condition |
1 |
0.356 |
0.552 |
| Emotion Regulation (DERS-8) |
Attrition Status |
1 |
1.356 |
0.246 |
| Emotion Regulation (DERS-8) |
Condition × Attrition |
1 |
0.114 |
0.736 |
| Anxiety (GAD-7) |
Condition |
1 |
0.041 |
0.841 |
| Anxiety (GAD-7) |
Attrition Status |
1 |
0.073 |
0.787 |
| Anxiety (GAD-7) |
Condition × Attrition |
1 |
0.000 |
0.994 |
| Depression (PHQ-9) |
Condition |
1 |
0.859 |
0.356 |
| Depression (PHQ-9) |
Attrition Status |
1 |
0.132 |
0.717 |
| Depression (PHQ-9) |
Condition × Attrition |
1 |
0.198 |
0.657 |
#2.3 Program Effects
2.3.1 # Main Effects Analyses
These are the main results for the paper here.
condition_num levels:
[1] 0 1
identity_group levels:
[1] 0 1
Parameter Estimates for Post_DERS8_Sum
| Predictor |
β |
95% CI (Low) |
95% CI (High) |
SE |
t |
p |
Partial η² |
η² 95% CI (Low) |
η² 95% CI (High) |
| (Intercept) |
-0.959 |
-11.072 |
9.155 |
5.114 |
-0.188 |
0.852 |
NA |
NA |
NA |
| condition_num |
-3.039 |
-4.916 |
-1.162 |
0.949 |
-3.202 |
0.002 |
0.090 |
0.027 |
1 |
| Pre_DERS8_Sum |
0.921 |
0.723 |
1.119 |
0.100 |
9.214 |
0.000 |
0.395 |
0.293 |
1 |
| identity_group |
1.693 |
-0.258 |
3.643 |
0.986 |
1.716 |
0.088 |
0.019 |
0.000 |
1 |
| age |
0.127 |
-0.291 |
0.544 |
0.211 |
0.600 |
0.549 |
0.003 |
0.000 |
1 |
Parameter Estimates for Post_GAD7_Sum
| Predictor |
β |
95% CI (Low) |
95% CI (High) |
SE |
t |
p |
Partial η² |
η² 95% CI (Low) |
η² 95% CI (High) |
| (Intercept) |
-2.720 |
-9.151 |
3.711 |
3.252 |
-0.837 |
0.404 |
NA |
NA |
NA |
| condition_num |
-1.350 |
-2.660 |
-0.040 |
0.663 |
-2.037 |
0.044 |
0.024 |
0.000 |
1 |
| Pre_GAD7_Sum |
0.739 |
0.576 |
0.902 |
0.082 |
8.979 |
0.000 |
0.388 |
0.285 |
1 |
| identity_group |
0.750 |
-0.621 |
2.121 |
0.693 |
1.082 |
0.281 |
0.003 |
0.000 |
1 |
| age |
0.271 |
-0.020 |
0.562 |
0.147 |
1.839 |
0.068 |
0.024 |
0.000 |
1 |
Parameter Estimates for Post_PHQ9_Sum
| Predictor |
β |
95% CI (Low) |
95% CI (High) |
SE |
t |
p |
Partial η² |
η² 95% CI (Low) |
η² 95% CI (High) |
| (Intercept) |
-5.618 |
-12.580 |
1.343 |
3.520 |
-1.596 |
0.113 |
NA |
NA |
NA |
| condition_num |
-2.604 |
-4.018 |
-1.191 |
0.715 |
-3.644 |
0.000 |
0.043 |
0.005 |
1 |
| Pre_PHQ9_Sum |
1.002 |
0.849 |
1.155 |
0.077 |
12.961 |
0.000 |
0.559 |
0.471 |
1 |
| identity_group |
0.254 |
-1.222 |
1.731 |
0.746 |
0.341 |
0.734 |
0.000 |
0.000 |
1 |
| age |
0.295 |
-0.018 |
0.607 |
0.158 |
1.864 |
0.064 |
0.025 |
0.000 |
1 |
Outlier Check: Re-run without T42
Results Text: The pattern, magnitude, and
significance of results were unchanged. Accordingly, all analyses were
reported using the full sample.
Main effects with adjusted means put into one neat table
Additionally, runs results with outlier removed (psid-T42)
condition_num levels:
[1] 0 1
identity_group levels:
[1] 0 1
Parameter Estimates for Post_DERS8_Sum
| Predictor |
β |
95% CI (Low) |
95% CI (High) |
SE |
t |
p |
Partial η² |
η² 95% CI (Low) |
η² 95% CI (High) |
| (Intercept) |
-1.019 |
-11.160 |
9.121 |
5.127 |
-0.199 |
0.843 |
NA |
NA |
NA |
| condition_num |
-2.995 |
-4.882 |
-1.107 |
0.954 |
-3.138 |
0.002 |
0.084 |
0.024 |
1 |
| Pre_DERS8_Sum |
0.916 |
0.717 |
1.115 |
0.101 |
9.106 |
0.000 |
0.391 |
0.289 |
1 |
| identity_group |
1.657 |
-0.302 |
3.616 |
0.990 |
1.673 |
0.097 |
0.018 |
0.000 |
1 |
| age |
0.135 |
-0.284 |
0.554 |
0.212 |
0.639 |
0.524 |
0.003 |
0.000 |
1 |
Parameter Estimates for Post_GAD7_Sum
| Predictor |
β |
95% CI (Low) |
95% CI (High) |
SE |
t |
p |
Partial η² |
η² 95% CI (Low) |
η² 95% CI (High) |
| (Intercept) |
-2.657 |
-9.160 |
3.845 |
3.288 |
-0.808 |
0.420 |
NA |
NA |
NA |
| condition_num |
-1.359 |
-2.678 |
-0.039 |
0.667 |
-2.036 |
0.044 |
0.028 |
0.000 |
1 |
| Pre_GAD7_Sum |
0.736 |
0.570 |
0.903 |
0.084 |
8.753 |
0.000 |
0.378 |
0.275 |
1 |
| identity_group |
0.760 |
-0.622 |
2.143 |
0.699 |
1.088 |
0.279 |
0.003 |
0.000 |
1 |
| age |
0.270 |
-0.023 |
0.562 |
0.148 |
1.822 |
0.071 |
0.024 |
0.000 |
1 |
Parameter Estimates for Post_PHQ9_Sum
| Predictor |
β |
95% CI (Low) |
95% CI (High) |
SE |
t |
p |
Partial η² |
η² 95% CI (Low) |
η² 95% CI (High) |
| (Intercept) |
-5.441 |
-12.481 |
1.598 |
3.559 |
-1.529 |
0.129 |
NA |
NA |
NA |
| condition_num |
-2.624 |
-4.045 |
-1.202 |
0.719 |
-3.651 |
0.000 |
0.051 |
0.008 |
1 |
| Pre_PHQ9_Sum |
0.996 |
0.840 |
1.153 |
0.079 |
12.605 |
0.000 |
0.548 |
0.458 |
1 |
| identity_group |
0.282 |
-1.205 |
1.770 |
0.752 |
0.375 |
0.708 |
0.000 |
0.000 |
1 |
| age |
0.291 |
-0.023 |
0.605 |
0.159 |
1.830 |
0.069 |
0.024 |
0.000 |
1 |
Error in select(mutate(broom::tidy(model, conf.int = TRUE), across(where(is.numeric), :
unused arguments (term, estimate, conf.low, conf.high, std.error, statistic, p.value)
Reviewer’s Comment: Report effect sizes with 95% CIs
for adjusted mean differences, standardized mean differences
My Response to Comment:
We thank the reviewer for this helpful suggestion. We have now added
both unstandardized and standardized effect sizes, each reported with
their 95% confidence intervals. Specifically, we:
Computed adjusted mean differences (β) between the Purrble and
waitlist control conditions using estimated marginal means from the
ANCOVA models, along with their 95% CIs.
Calculated standardized mean differences (Cohen’s d) and
corresponding 95% CIs using the emmeans::eff_size() function, based on
the model residual variance.
Added these results in a new summary table following each ANCOVA
table (see Table X).
This table now reports, for each outcome, the adjusted group means,
adjusted mean difference with 95% CI, and standardized mean difference
(Cohen’s d) with 95% CI, as requested.
Error in contrast.emmGrid(object, method, adjust = "none", ...) :
Contrast function 'cohen.emmc' not found
Error in select(effectsize::eta_squared(model, partial = TRUE), Parameter, :
unused arguments (Parameter, Eta2_partial)
Robustness Check using the Benjamini–Hochberg (BH) False Discovery
Rate (FDR) procedure.
This robustness check accounts for multiple statistical tests across
the three primary outcomes by applying the Benjamini–Hochberg procedure,
which controls the false discovery rate (FDR). This method is less
conservative than Bonferroni and is appropriate when outcomes are
conceptually related but not fully independent. All primary outcome
effects remain statistically significant after correction (FDR q <
.05), supporting the robustness of the main findings.
[1] 0.003 0.044 0.000
Reliable Change Indices
How many showed reliable change on all 3 measures?
2.3.1 Moderation Analyses
condition_num levels:
[1] 0 1
identity_group levels:
[1] 0 1
Parameter Estimates for Post_DERS8_Sum
| Predictor |
β |
95% CI (Low) |
95% CI (High) |
SE |
t |
p |
Partial η² |
η² 95% CI (Low) |
η² 95% CI (High) |
| (Intercept) |
0.316 |
-9.746 |
10.378 |
5.087 |
0.062 |
0.951 |
NA |
NA |
NA |
| condition_num |
-5.006 |
-7.629 |
-2.382 |
1.326 |
-3.774 |
0.000 |
0.092 |
0.029 |
1 |
| Pre_DERS8_Sum |
0.913 |
0.717 |
1.108 |
0.099 |
9.238 |
0.000 |
0.403 |
0.301 |
1 |
| identity_group |
-0.242 |
-2.897 |
2.412 |
1.342 |
-0.181 |
0.857 |
0.020 |
0.000 |
1 |
| age |
0.122 |
-0.290 |
0.534 |
0.208 |
0.587 |
0.558 |
0.003 |
0.000 |
1 |
| condition_num:identity_group |
3.924 |
0.220 |
7.628 |
1.873 |
2.095 |
0.038 |
0.032 |
0.001 |
1 |
Parameter Estimates for Post_GAD7_Sum
| Predictor |
β |
95% CI (Low) |
95% CI (High) |
SE |
t |
p |
Partial η² |
η² 95% CI (Low) |
η² 95% CI (High) |
| (Intercept) |
-1.819 |
-8.214 |
4.577 |
3.234 |
-0.562 |
0.575 |
NA |
NA |
NA |
| condition_num |
-2.777 |
-4.606 |
-0.948 |
0.925 |
-3.004 |
0.003 |
0.025 |
0.000 |
1 |
| Pre_GAD7_Sum |
0.728 |
0.567 |
0.889 |
0.081 |
8.946 |
0.000 |
0.396 |
0.294 |
1 |
| identity_group |
-0.651 |
-2.506 |
1.205 |
0.938 |
-0.694 |
0.489 |
0.003 |
0.000 |
1 |
| age |
0.268 |
-0.019 |
0.555 |
0.145 |
1.845 |
0.067 |
0.025 |
0.000 |
1 |
| condition_num:identity_group |
2.857 |
0.267 |
5.446 |
1.309 |
2.182 |
0.031 |
0.034 |
0.002 |
1 |
Parameter Estimates for Post_PHQ9_Sum
| Predictor |
β |
95% CI (Low) |
95% CI (High) |
SE |
t |
p |
Partial η² |
η² 95% CI (Low) |
η² 95% CI (High) |
| (Intercept) |
-4.721 |
-11.697 |
2.255 |
3.527 |
-1.338 |
0.183 |
NA |
NA |
NA |
| condition_num |
-3.864 |
-5.840 |
-1.888 |
0.999 |
-3.868 |
0.000 |
0.044 |
0.005 |
1 |
| Pre_PHQ9_Sum |
0.987 |
0.835 |
1.140 |
0.077 |
12.792 |
0.000 |
0.565 |
0.478 |
1 |
| identity_group |
-0.983 |
-2.987 |
1.021 |
1.013 |
-0.970 |
0.334 |
0.000 |
0.000 |
1 |
| age |
0.291 |
-0.019 |
0.601 |
0.157 |
1.858 |
0.065 |
0.026 |
0.000 |
1 |
| condition_num:identity_group |
2.543 |
-0.267 |
5.353 |
1.421 |
1.790 |
0.076 |
0.023 |
0.000 |
1 |
condition_num levels:
[1] 0 1
identity_group levels:
[1] 0 1
Parameter Estimates for Post_DERS8_Sum
| Predictor |
β |
95% CI (Low) |
95% CI (High) |
SE |
t |
p |
Partial η² |
η² 95% CI (Low) |
η² 95% CI (High) |
| (Intercept) |
0.316 |
-9.746 |
10.378 |
5.087 |
0.062 |
0.951 |
NA |
NA |
NA |
| condition_num |
-5.006 |
-7.629 |
-2.382 |
1.326 |
-3.774 |
0.000 |
0.092 |
0.029 |
1 |
| Pre_DERS8_Sum |
0.913 |
0.717 |
1.108 |
0.099 |
9.238 |
0.000 |
0.403 |
0.301 |
1 |
| identity_group |
-0.242 |
-2.897 |
2.412 |
1.342 |
-0.181 |
0.857 |
0.020 |
0.000 |
1 |
| age |
0.122 |
-0.290 |
0.534 |
0.208 |
0.587 |
0.558 |
0.003 |
0.000 |
1 |
| condition_num:identity_group |
3.924 |
0.220 |
7.628 |
1.873 |
2.095 |
0.038 |
0.032 |
0.001 |
1 |
Parameter Estimates for Post_GAD7_Sum
| Predictor |
β |
95% CI (Low) |
95% CI (High) |
SE |
t |
p |
Partial η² |
η² 95% CI (Low) |
η² 95% CI (High) |
| (Intercept) |
-1.819 |
-8.214 |
4.577 |
3.234 |
-0.562 |
0.575 |
NA |
NA |
NA |
| condition_num |
-2.777 |
-4.606 |
-0.948 |
0.925 |
-3.004 |
0.003 |
0.025 |
0.000 |
1 |
| Pre_GAD7_Sum |
0.728 |
0.567 |
0.889 |
0.081 |
8.946 |
0.000 |
0.396 |
0.294 |
1 |
| identity_group |
-0.651 |
-2.506 |
1.205 |
0.938 |
-0.694 |
0.489 |
0.003 |
0.000 |
1 |
| age |
0.268 |
-0.019 |
0.555 |
0.145 |
1.845 |
0.067 |
0.025 |
0.000 |
1 |
| condition_num:identity_group |
2.857 |
0.267 |
5.446 |
1.309 |
2.182 |
0.031 |
0.034 |
0.002 |
1 |
Parameter Estimates for Post_PHQ9_Sum
| Predictor |
β |
95% CI (Low) |
95% CI (High) |
SE |
t |
p |
Partial η² |
η² 95% CI (Low) |
η² 95% CI (High) |
| (Intercept) |
-4.721 |
-11.697 |
2.255 |
3.527 |
-1.338 |
0.183 |
NA |
NA |
NA |
| condition_num |
-3.864 |
-5.840 |
-1.888 |
0.999 |
-3.868 |
0.000 |
0.044 |
0.005 |
1 |
| Pre_PHQ9_Sum |
0.987 |
0.835 |
1.140 |
0.077 |
12.792 |
0.000 |
0.565 |
0.478 |
1 |
| identity_group |
-0.983 |
-2.987 |
1.021 |
1.013 |
-0.970 |
0.334 |
0.000 |
0.000 |
1 |
| age |
0.291 |
-0.019 |
0.601 |
0.157 |
1.858 |
0.065 |
0.026 |
0.000 |
1 |
| condition_num:identity_group |
2.543 |
-0.267 |
5.353 |
1.421 |
1.790 |
0.076 |
0.023 |
0.000 |
1 |
Simple Slopes for DERS
JOHNSON-NEYMAN INTERVAL
When identity_group is OUTSIDE the interval [0.75, 14.45], the slope of condition_num is p < .05.
Note: The range of observed values of identity_group is [0.00, 1.00]
SIMPLE SLOPES ANALYSIS
Slope of condition_num when identity_group = 0.00 (0):
Est. S.E. t val. p
------- ------ -------- ------
-5.01 1.33 -3.77 0.00
Slope of condition_num when identity_group = 1.00 (1):
Est. S.E. t val. p
------- ------ -------- ------
-1.08 1.32 -0.82 0.42

condition_num identity_group emmean SE df lower.CL upper.CL
0 0 28.6 0.930 134 26.8 30.5
1 0 23.6 0.963 134 21.7 25.5
0 1 28.4 0.949 134 26.5 30.3
1 1 27.3 0.942 134 25.4 29.2
Confidence level used: 0.95
Simple Slopes for GAD
JOHNSON-NEYMAN INTERVAL
When identity_group is OUTSIDE the interval [0.52, 5.77], the slope of condition_num is p < .05.
Note: The range of observed values of identity_group is [0.00, 1.00]
SIMPLE SLOPES ANALYSIS
Slope of condition_num when identity_group = 0.00 (0):
Est. S.E. t val. p
------- ------ -------- ------
-2.78 0.92 -3.00 0.00
Slope of condition_num when identity_group = 1.00 (1):
Est. S.E. t val. p
------ ------ -------- ------
0.08 0.93 0.09 0.93

condition_num identity_group emmean SE df lower.CL upper.CL
0 0 13.6 0.650 134 12.31 14.9
1 0 10.8 0.673 134 9.49 12.2
0 1 12.9 0.662 134 11.64 14.3
1 1 13.0 0.661 134 11.72 14.3
Confidence level used: 0.95
Moderation analysis: Condition × Gender Identity (identity_group_num) interaction effects
| Outcome |
F |
df |
p |
Beta_Int |
95% CI (β) |
η²ₚ |
95% CI (η²ₚ) |
| Post_DERS8_Sum |
4.39 |
1, 134 |
0.038 |
3.92 |
[0.22, 7.63] |
0.032 |
[0.001, 1.000] |
| Post_GAD7_Sum |
4.76 |
1, 134 |
0.031 |
2.86 |
[0.27, 5.45] |
0.034 |
[0.002, 1.000] |
| Post_PHQ9_Sum |
3.20 |
1, 134 |
0.076 |
2.54 |
[-0.27, 5.35] |
0.023 |
[0.000, 1.000] |
MAIN EFFECTS REVIEWER COMMENTS AND FOLLOW UP OUTLIER
“Provide sensitivity analyses to address possible bias from faster
engagement decline in the intervention arm.”
[1] 0.057 0.057 0.076
Anova Table (Type III tests)
Response: Post_DERS8_Sum
Sum Sq Df F value Pr(>F)
condition_num:total_sessions 231.33 1 7.8344 0.005889 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Anova Table (Type III tests)
Response: Post_DERS8_Sum
Sum Sq Df F value Pr(>F)
condition_num:total_sessions 231.33 1 7.8344 0.005889 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
condition_num total_sessions.trend SE df lower.CL upper.CL
0 0.877 0.590 133 -0.289 2.043
1 -1.077 0.374 133 -1.816 -0.338
Results are averaged over the levels of: identity_group_num
Confidence level used: 0.95
[1] "--- GAD-7 Interaction F-Test ---"
Anova Table (Type III tests)
Response: Post_GAD7_Sum
Sum Sq Df F value Pr(>F)
condition_num:total_sessions 7.9472 1 0.5176 0.4731
[1] "--- GAD-7 Simple Slopes ---"
condition_num total_sessions.trend SE df lower.CL upper.CL
0 -0.0155 0.425 133 -0.857 0.826
1 -0.3825 0.277 133 -0.930 0.165
Results are averaged over the levels of: identity_group_num
Confidence level used: 0.95
[1] "--- PHQ-9 Interaction F-Test ---"
Anova Table (Type III tests)
Response: Post_PHQ9_Sum
Sum Sq Df F value Pr(>F)
condition_num:total_sessions 34.323 1 1.9442 0.1655
[1] "--- PHQ-9 Simple Slopes ---"
condition_num total_sessions.trend SE df lower.CL upper.CL
0 0.336 0.455 133 -0.565 1.237
1 -0.424 0.297 133 -1.012 0.165
Results are averaged over the levels of: identity_group_num
Confidence level used: 0.95
Linear Mixed Effects Models
### Outcome: DERS8_Sum
Mixed-Effects Model for DERS8_Sum controlling for identity_group and age
| effect |
group |
term |
estimate |
std.error |
statistic |
df |
p.value |
| fixed |
NA |
(Intercept) |
22.585 |
3.556 |
6.352 |
148.090 |
0.000 |
| fixed |
NA |
Week |
-0.123 |
0.045 |
-2.729 |
148.679 |
0.007 |
| fixed |
NA |
condition1 |
0.051 |
0.414 |
0.122 |
148.816 |
0.903 |
| fixed |
NA |
identity_group1 |
-0.465 |
0.412 |
-1.128 |
148.226 |
0.261 |
| fixed |
NA |
age |
0.277 |
0.174 |
1.586 |
147.702 |
0.115 |
| fixed |
NA |
Week:condition1 |
-0.142 |
0.045 |
-3.137 |
148.680 |
0.002 |
| ran_pars |
psid |
sd__(Intercept) |
4.592 |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
-0.102 |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
sd__Week |
0.468 |
NA |
NA |
NA |
NA |
| ran_pars |
Residual |
sd__Observation |
3.609 |
NA |
NA |
NA |
NA |
### Outcome: GAD7_Sum
Mixed-Effects Model for GAD7_Sum controlling for identity_group and age
| effect |
group |
term |
estimate |
std.error |
statistic |
df |
p.value |
| fixed |
NA |
(Intercept) |
11.475 |
2.753 |
4.168 |
148.984 |
0.000 |
| fixed |
NA |
Week |
-0.106 |
0.032 |
-3.324 |
149.152 |
0.001 |
| fixed |
NA |
condition1 |
0.028 |
0.340 |
0.081 |
149.340 |
0.936 |
| fixed |
NA |
identity_group1 |
-0.625 |
0.319 |
-1.961 |
148.747 |
0.052 |
| fixed |
NA |
age |
0.111 |
0.135 |
0.820 |
148.215 |
0.414 |
| fixed |
NA |
Week:condition1 |
-0.050 |
0.032 |
-1.568 |
149.150 |
0.119 |
| ran_pars |
psid |
sd__(Intercept) |
3.695 |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
-0.234 |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
sd__Week |
0.292 |
NA |
NA |
NA |
NA |
| ran_pars |
Residual |
sd__Observation |
3.220 |
NA |
NA |
NA |
NA |
### Outcome: PHQ9_Sum
Mixed-Effects Model for PHQ9_Sum controlling for identity_group and age
| effect |
group |
term |
estimate |
std.error |
statistic |
df |
p.value |
| fixed |
NA |
(Intercept) |
14.374 |
3.298 |
4.358 |
148.057 |
0.000 |
| fixed |
NA |
Week |
-0.067 |
0.033 |
-2.020 |
148.491 |
0.045 |
| fixed |
NA |
condition1 |
0.604 |
0.377 |
1.603 |
148.673 |
0.111 |
| fixed |
NA |
identity_group1 |
-0.816 |
0.382 |
-2.135 |
148.272 |
0.034 |
| fixed |
NA |
age |
0.037 |
0.162 |
0.227 |
147.820 |
0.821 |
| fixed |
NA |
Week:condition1 |
-0.110 |
0.033 |
-3.287 |
148.491 |
0.001 |
| ran_pars |
psid |
sd__(Intercept) |
4.186 |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
0.058 |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
sd__Week |
0.312 |
NA |
NA |
NA |
NA |
| ran_pars |
Residual |
sd__Observation |
3.262 |
NA |
NA |
NA |
NA |
NA
###Reviewer Comment: Sensitivity Analysis
Reviewer Comment: “Provide sensitivity analyses to address possible
bias from faster engagement decline in the intervention arm.”
My Response to Comment: Because engagement analyses demonstrated a
faster rate of decline in the Purrble arm compared to the waitlist
control, we conducted sensitivity analyses to examine whether the total
number of sessions completed by each participant was associated with
intervention outcomes. The number of sessions participated was added as
a covariate in all ANCOVA models. Across outcomes, inclusion of this
covariate did not alter the pattern, magnitude, or significance of
results, and number of sessions was not a significant predictor in any
model. These findings indicate that differences in the rate of survey
responsiveness did not bias the primary results.
Reviewer Comment: “Include sensitivity analyses addressing
differential engagement between arms.”
My Response to Comment: To further examine potential differences in
engagement between study arms, we compared the total number of sessions
completed across conditions and included this variable as a covariate in
all outcome models. Although participants in the Purrble arm completed
slightly fewer sessions on average than those in the waitlist condition,
this difference did not affect any outcome. Results remained consistent
with primary analyses, suggesting that differential engagement between
arms did not account for the observed intervention effects.
Results Text: Because engagement analyses indicated
a faster rate of decline in the Purrble arm compared to the waitlist
control, we conducted sensitivity analyses to examine whether the total
number of sessions completed by each participant was associated with
intervention outcomes. The number of sessions participated was added as
a covariate in all models. Across outcomes, inclusion of this covariate
did not alter the pattern, magnitude, or significance of results, and
number of sessions was not a significant predictor in any model.
### Sensitivity ANCOVA (including total_sessions) for Post_DERS8_Sum
ANCOVA (Type III) results including all covariates for Post_DERS8_Sum
| Source |
df |
F |
p |
η²ₚ |
95% CI (η²ₚ) |
| (Intercept) |
1 |
0.12 |
0.730 |
NA |
NA |
| condition |
1 |
12.00 |
0.001 |
0.091 |
[0.028, 1.000] |
| Pre_DERS8_Sum |
1 |
83.59 |
0.000 |
0.400 |
[0.298, 1.000] |
| identity_group_num |
1 |
3.58 |
0.061 |
0.019 |
[0.000, 1.000] |
| age |
1 |
0.44 |
0.507 |
0.003 |
[0.000, 1.000] |
| total_sessions |
1 |
2.55 |
0.112 |
0.019 |
[0.000, 1.000] |
| Residuals |
134 |
NA |
NA |
NA |
NA |
**Adjusted Means (Condition Only)**
| Outcome |
AdjMean_WL |
AdjMean_PB |
| Post_DERS8_Sum |
28.65 |
25.32 |
### Sensitivity ANCOVA (including total_sessions) for Post_GAD7_Sum
ANCOVA (Type III) results including all covariates for Post_GAD7_Sum
| Source |
df |
F |
p |
η²ₚ |
95% CI (η²ₚ) |
| (Intercept) |
1 |
0.02 |
0.885 |
NA |
NA |
| condition |
1 |
4.95 |
0.028 |
0.025 |
[0.000, 1.000] |
| Pre_GAD7_Sum |
1 |
74.54 |
0.000 |
0.390 |
[0.288, 1.000] |
| identity_group_num |
1 |
1.51 |
0.222 |
0.003 |
[0.000, 1.000] |
| age |
1 |
3.58 |
0.060 |
0.025 |
[0.000, 1.000] |
| total_sessions |
1 |
1.40 |
0.239 |
0.010 |
[0.000, 1.000] |
| Residuals |
134 |
NA |
NA |
NA |
NA |
**Adjusted Means (Condition Only)**
| Outcome |
AdjMean_WL |
AdjMean_PB |
| Post_GAD7_Sum |
13.36 |
11.86 |
### Sensitivity ANCOVA (including total_sessions) for Post_PHQ9_Sum
ANCOVA (Type III) results including all covariates for Post_PHQ9_Sum
| Source |
df |
F |
p |
η²ₚ |
95% CI (η²ₚ) |
| (Intercept) |
1 |
0.86 |
0.356 |
NA |
NA |
| condition |
1 |
13.84 |
0.000 |
0.044 |
[0.005, 1.000] |
| Pre_PHQ9_Sum |
1 |
156.31 |
0.000 |
0.561 |
[0.472, 1.000] |
| identity_group_num |
1 |
0.20 |
0.658 |
0.000 |
[0.000, 1.000] |
| age |
1 |
3.57 |
0.061 |
0.025 |
[0.000, 1.000] |
| total_sessions |
1 |
0.62 |
0.433 |
0.005 |
[0.000, 1.000] |
| Residuals |
134 |
NA |
NA |
NA |
NA |
**Adjusted Means (Condition Only)**
| Outcome |
AdjMean_WL |
AdjMean_PB |
| Post_PHQ9_Sum |
15.67 |
12.96 |
Anova Table (Type III tests)
Response: Post_DERS8_Sum
Sum Sq Df F value Pr(>F)
condition_num:total_sessions 231.33 1 7.8344 0.005889 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Anova Table (Type III tests)
Response: Post_DERS8_Sum
Sum Sq Df F value Pr(>F)
condition_num:total_sessions 231.33 1 7.8344 0.005889 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
condition_num total_sessions.trend SE df lower.CL upper.CL
0 0.877 0.590 133 -0.289 2.043
1 -1.077 0.374 133 -1.816 -0.338
Results are averaged over the levels of: identity_group_num
Confidence level used: 0.95

Self-Harm Analyses
Frequencies by Condition and Response over Time
Below, we display a table and graph of the frequency of responses for
all self-harm questions, the frequency of flagged responses to each
self-harm question over time, and the frequency of flagged responses to
each self-harm question over time, separated by condition.

| Number of Responses for Self-Harm Questions Over Time |
| Week |
N_SHQ1 |
N_SHQ2 |
N_SHQ3 |
| 1 |
146 |
146 |
146 |
| 2 |
148 |
148 |
148 |
| 3 |
149 |
149 |
149 |
| 4 |
141 |
141 |
141 |
| 5 |
139 |
139 |
139 |
| 6 |
138 |
138 |
138 |
| 7 |
140 |
140 |
140 |
| 8 |
141 |
141 |
141 |
| 9 |
127 |
127 |
127 |
| 10 |
128 |
128 |
128 |
| 11 |
128 |
128 |
128 |
| 12 |
117 |
117 |
117 |
| 13 |
130 |
130 |
130 |
library(dplyr) library(tidyr) library(ggplot2) library(gt)
Count how many selected each category (0 or 1) per SHQ variable per
week
shq_counts <- shq_long %>% group_by(Week, SHQ_Var, Response)
%>% summarise(n = n(), .groups = “drop”)
#———————————————————- # Plot: Line Graph of 1 (flagged) response over
time #———————————————————- ggplot( shq_counts %>% filter(Response ==
“1”), aes(x = Week, y = n, color = SHQ_Var) ) + geom_line(size = 1) +
labs( title = “Number of Flagged SHQ Responses Over Time (Response =
1)”, x = “Week”, y = “Count of Response = 1”, color = “SHQ Variable” ) +
theme_minimal() + scale_x_continuous(breaks =
unique(shq_counts$Week))
#———————————————————- # Table: Count of 0 and 1 Responses per Week
per SHQ #———————————————————- shq_counts %>% pivot_wider(names_from =
Response, values_from = n, values_fill = 0) %>%
rename(Response = 1 = 1,
Response = 0 = 0) %>% gt() %>%
tab_header(title = “Counts of SHQ Responses (0 vs. 1) by Week and
Variable”)
Count how many selected each category (0 or 1) per SHQ variable, per
week, per group
shq_counts_grouped <- shq_long_grouped %>% group_by(Week,
condition, SHQ_Var, Response) %>% summarise(n = n(), .groups =
“drop”)
#———————————————————- # Plot: Line Graph of 1 (flagged) response over
time by group #———————————————————- ggplot( shq_counts_grouped %>%
filter(Response == “1”), aes(x = Week, y = n, color = SHQ_Var) ) +
geom_line(size = 1) + facet_wrap(~ condition) + labs( title = “Number of
Flagged SHQ Responses Over Time (Response = 1)”, subtitle = “Faceted by
Condition”, x = “Week”, y = “Count of Response = 1”, color = “SHQ
Variable” ) + theme_minimal() + scale_x_continuous(breaks =
unique(shq_counts_grouped$Week))
#———————————————————- # Table: Count of 0 and 1 Responses per Week
per SHQ, by Group #———————————————————- shq_counts_grouped %>%
pivot_wider(names_from = Response, values_from = n, values_fill = 0)
%>% rename(Response = 1 = 1,
Response = 0 = 0) %>% arrange(condition,
SHQ_Var, Week) %>% gt() %>% tab_header(title = “Counts of SHQ
Responses (0 vs. 1) by Week, Variable, and Group”)
Self-Harm Logistic Regression
Post-test Logistic Regression to Investigate Intervention Effects on
Self-Harm Outcomes Result: Condition was not a significant
predictor of any self-harm outcome (coded binary).
| Characteristic |
SHQ1 Model
|
SHQ2 Model
|
SHQ3 Model
|
SHQ_Any Model
|
| OR |
SE |
OR |
SE |
OR |
SE |
OR |
SE |
| condition |
|
|
|
|
|
|
|
|
| Purrble Treatment |
1.07 |
0.226 |
0.99 |
0.206 |
0.93 |
0.273 |
1.05 |
0.217 |
| Waitlist Control |
— |
— |
— |
— |
— |
— |
— |
— |
| SHQ1_2 |
11.6*** |
0.484 |
|
|
|
|
|
|
| SHQ2_2 |
|
|
4.36*** |
0.408 |
|
|
|
|
| SHQ3_2 |
|
|
|
|
3.14* |
0.559 |
|
|
| SHQ_Any_2 |
|
|
|
|
|
|
5.83*** |
0.486 |
Self-Harm Proportional Odds Regression
Frequencies Tables
**Frequencies for shqscreener1_w1 **
| 1 |
27 |
18.5 |
| 2 |
47 |
32.2 |
| 3 |
56 |
38.4 |
| 4 |
16 |
11.0 |
**Frequencies for shqscreener1_w12 **
| 1 |
47 |
40.2 |
| 2 |
29 |
24.8 |
| 3 |
34 |
29.1 |
| 4 |
7 |
6.0 |
**Frequencies for shqscreener2_w1 **
| 1 |
78 |
53.4 |
| 2 |
37 |
25.3 |
| 3 |
27 |
18.5 |
| 4 |
4 |
2.7 |
**Frequencies for shqscreener2_w12 **
| 1 |
70 |
59.8 |
| 2 |
27 |
23.1 |
| 3 |
15 |
12.8 |
| 4 |
5 |
4.3 |
**Frequencies for shqscreener3_w1 **
| 1 |
118 |
80.8 |
| 2 |
18 |
12.3 |
| 3 |
10 |
6.8 |
**Frequencies for shqscreener3_w12 **
| 1 |
100 |
85.5 |
| 2 |
12 |
10.3 |
| 3 |
5 |
4.3 |
Proportional Odds Models: Brant Tests
All six Brant tests (one for each screener at Week 1 and Week 12)
produced non‐significant p‐values, indicating that the proportional‐odds
(parallel regression) assumption holds in every case.
--------------------------------------------
Test for X2 df probability
--------------------------------------------
Omnibus 1.8 2 0.41
condition1 1.8 2 0.41
--------------------------------------------
H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 1 at Week 1:"
X2 df probability
Omnibus 1.80303 2 0.4059541
condition1 1.80303 2 0.4059541
--------------------------------------------
Test for X2 df probability
--------------------------------------------
Omnibus 1.03 2 0.6
condition1 1.03 2 0.6
--------------------------------------------
H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 1 at Week 12:"
X2 df probability
Omnibus 1.031749 2 0.5969783
condition1 1.031749 2 0.5969783
--------------------------------------------
Test for X2 df probability
--------------------------------------------
Omnibus 1.3 2 0.52
condition1 1.3 2 0.52
--------------------------------------------
H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 2 at Week 1:"
X2 df probability
Omnibus 1.303816 2 0.5210507
condition1 1.303816 2 0.5210507
--------------------------------------------
Test for X2 df probability
--------------------------------------------
Omnibus 2.49 2 0.29
condition1 2.49 2 0.29
--------------------------------------------
H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 2 at Week 12:"
X2 df probability
Omnibus 2.493925 2 0.2873763
condition1 2.493925 2 0.2873763
--------------------------------------------
Test for X2 df probability
--------------------------------------------
Omnibus 1.42 1 0.23
condition1 1.42 1 0.23
--------------------------------------------
H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 3 at Week 1:"
X2 df probability
Omnibus 1.417486 1 0.2338176
condition1 1.417486 1 0.2338176
--------------------------------------------
Test for X2 df probability
--------------------------------------------
Omnibus 1.01 1 0.32
condition1 1.01 1 0.32
--------------------------------------------
H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 3 at Week 12:"
X2 df probability
Omnibus 1.005784 1 0.315915
condition1 1.005784 1 0.315915
No significant results of Purrble on self-harm using proprtional odds
(ordinal data that maintains frequency)
Proportional Odds Regression Results Controlling for Age and
Baseline Response (Week 1)
| Screener 1 |
condition1 |
0.045 |
0.182 |
1.046 |
0.248 |
0.804 |
| Screener 1 |
age |
0.045 |
0.083 |
1.046 |
0.540 |
0.589 |
| Screener 1 |
identity_group_num |
0.595 |
0.375 |
1.813 |
1.587 |
0.113 |
| Screener 1 |
shqscreener1_w1.L |
1.856 |
0.486 |
6.400 |
3.822 |
0.000 |
| Screener 1 |
shqscreener1_w1.Q |
-0.115 |
0.404 |
0.891 |
-0.284 |
0.776 |
| Screener 1 |
shqscreener1_w1.C |
0.194 |
0.324 |
1.214 |
0.600 |
0.549 |
| Screener 1 |
1|2 |
1.367 |
1.918 |
3.922 |
0.713 |
0.476 |
| Screener 1 |
2|3 |
2.455 |
1.930 |
11.647 |
1.272 |
0.203 |
| Screener 1 |
3|4 |
4.890 |
1.980 |
132.932 |
2.469 |
0.014 |
| Screener 2 |
condition1 |
0.150 |
0.214 |
1.162 |
0.703 |
0.482 |
| Screener 2 |
age |
0.122 |
0.094 |
1.129 |
1.298 |
0.194 |
| Screener 2 |
identity_group_num |
1.406 |
0.448 |
4.082 |
3.138 |
0.002 |
| Screener 2 |
shqscreener2_w1.L |
3.213 |
0.750 |
24.860 |
4.285 |
0.000 |
| Screener 2 |
shqscreener2_w1.Q |
0.593 |
0.599 |
1.809 |
0.989 |
0.323 |
| Screener 2 |
shqscreener2_w1.C |
0.623 |
0.473 |
1.864 |
1.316 |
0.188 |
| Screener 2 |
1|2 |
3.849 |
2.227 |
46.955 |
1.728 |
0.084 |
| Screener 2 |
2|3 |
5.360 |
2.263 |
212.790 |
2.369 |
0.018 |
| Screener 2 |
3|4 |
7.300 |
2.324 |
1479.978 |
3.141 |
0.002 |
| Screener 3 |
condition1 |
0.049 |
0.275 |
1.050 |
0.178 |
0.859 |
| Screener 3 |
age |
0.001 |
0.125 |
1.001 |
0.011 |
0.991 |
| Screener 3 |
identity_group_num |
-0.140 |
0.566 |
0.869 |
-0.248 |
0.804 |
| Screener 3 |
shqscreener3_w1.L |
0.234 |
0.814 |
1.263 |
0.287 |
0.774 |
| Screener 3 |
shqscreener3_w1.Q |
-0.712 |
0.667 |
0.491 |
-1.067 |
0.286 |
| Screener 3 |
1|2 |
1.357 |
2.828 |
3.886 |
0.480 |
0.631 |
| Screener 3 |
2|3 |
2.649 |
2.850 |
14.133 |
0.929 |
0.353 |
Supplementary Materials: Mixed Effects Models
To evaluate how outcomes changed over time and whether these changes
differed by condition, we fit mixed-effects models for each of our
primary outcome variables. These models account for both within-person
change and between-person differences.
For each outcomem we ran a linear mixed-effects model using the
lmer() function.
The models tested: Main effects of Week (time), condition, and their
interaction Covariates: identity group and age A random intercept and
slope for each participant ((Week & psid)), allowing each person to
have their own baseline and rate of change over time
Emotion Reg was significant Depression significant Anxiety not
significant (close to marginal p=.11- more evidence of unstable
effect)
Mixed-Effects Model for DERS8_Sum with 95% CI
| effect |
group |
term |
estimate |
std.error |
statistic |
df |
p.value |
2.5 % |
97.5 % |
| fixed |
NA |
(Intercept) |
22.585 |
3.556 |
6.352 |
148.090 |
0.000 |
15.616 |
29.555 |
| fixed |
NA |
Week |
-0.123 |
0.045 |
-2.729 |
148.679 |
0.007 |
-0.212 |
-0.035 |
| fixed |
NA |
condition1 |
0.051 |
0.414 |
0.122 |
148.816 |
0.903 |
-0.761 |
0.862 |
| fixed |
NA |
identity_group1 |
-0.465 |
0.412 |
-1.128 |
148.226 |
0.261 |
-1.272 |
0.343 |
| fixed |
NA |
age |
0.277 |
0.174 |
1.586 |
147.702 |
0.115 |
-0.065 |
0.618 |
| fixed |
NA |
Week:condition1 |
-0.142 |
0.045 |
-3.137 |
148.680 |
0.002 |
-0.230 |
-0.053 |
| ran_pars |
psid |
sd__(Intercept) |
4.592 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
-0.102 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
sd__Week |
0.468 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
Residual |
sd__Observation |
3.609 |
NA |
NA |
NA |
NA |
NA |
NA |
NULL
# R2 for Mixed Models
Conditional R2: 0.717
Marginal R2: 0.037
Mixed-Effects Model for DERS8_Sum with 95% CI
| effect |
group |
term |
estimate |
std.error |
statistic |
df |
p.value |
2.5 % |
97.5 % |
| fixed |
NA |
(Intercept) |
22.585 |
3.556 |
6.352 |
148.090 |
0.000 |
15.616 |
29.555 |
| fixed |
NA |
Week |
-0.123 |
0.045 |
-2.729 |
148.679 |
0.007 |
-0.212 |
-0.035 |
| fixed |
NA |
condition1 |
0.051 |
0.414 |
0.122 |
148.816 |
0.903 |
-0.761 |
0.862 |
| fixed |
NA |
identity_group1 |
-0.465 |
0.412 |
-1.128 |
148.226 |
0.261 |
-1.272 |
0.343 |
| fixed |
NA |
age |
0.277 |
0.174 |
1.586 |
147.702 |
0.115 |
-0.065 |
0.618 |
| fixed |
NA |
Week:condition1 |
-0.142 |
0.045 |
-3.137 |
148.680 |
0.002 |
-0.230 |
-0.053 |
| ran_pars |
psid |
sd__(Intercept) |
4.592 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
-0.102 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
sd__Week |
0.468 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
Residual |
sd__Observation |
3.609 |
NA |
NA |
NA |
NA |
NA |
NA |
# R2 for Mixed Models
Conditional R2: 0.717
Marginal R2: 0.037
Mixed-Effects Model for GAD7_Sum with 95% CI
| effect |
group |
term |
estimate |
std.error |
statistic |
df |
p.value |
2.5 % |
97.5 % |
| fixed |
NA |
(Intercept) |
11.475 |
2.753 |
4.168 |
148.984 |
0.000 |
6.079 |
16.871 |
| fixed |
NA |
Week |
-0.106 |
0.032 |
-3.324 |
149.152 |
0.001 |
-0.169 |
-0.044 |
| fixed |
NA |
condition1 |
0.028 |
0.340 |
0.081 |
149.340 |
0.936 |
-0.639 |
0.694 |
| fixed |
NA |
identity_group1 |
-0.625 |
0.319 |
-1.961 |
148.747 |
0.052 |
-1.249 |
0.000 |
| fixed |
NA |
age |
0.111 |
0.135 |
0.820 |
148.215 |
0.414 |
-0.154 |
0.375 |
| fixed |
NA |
Week:condition1 |
-0.050 |
0.032 |
-1.568 |
149.150 |
0.119 |
-0.113 |
0.013 |
| ran_pars |
psid |
sd__(Intercept) |
3.695 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
-0.234 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
sd__Week |
0.292 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
Residual |
sd__Observation |
3.220 |
NA |
NA |
NA |
NA |
NA |
NA |
# R2 for Mixed Models
Conditional R2: 0.606
Marginal R2: 0.024
Mixed-Effects Model for PHQ9_Sum with 95% CI
| effect |
group |
term |
estimate |
std.error |
statistic |
df |
p.value |
2.5 % |
97.5 % |
| fixed |
NA |
(Intercept) |
14.374 |
3.298 |
4.358 |
148.057 |
0.000 |
7.909 |
20.839 |
| fixed |
NA |
Week |
-0.067 |
0.033 |
-2.020 |
148.491 |
0.045 |
-0.133 |
-0.002 |
| fixed |
NA |
condition1 |
0.604 |
0.377 |
1.603 |
148.673 |
0.111 |
-0.135 |
1.342 |
| fixed |
NA |
identity_group1 |
-0.816 |
0.382 |
-2.135 |
148.272 |
0.034 |
-1.564 |
-0.067 |
| fixed |
NA |
age |
0.037 |
0.162 |
0.227 |
147.820 |
0.821 |
-0.280 |
0.354 |
| fixed |
NA |
Week:condition1 |
-0.110 |
0.033 |
-3.287 |
148.491 |
0.001 |
-0.175 |
-0.044 |
| ran_pars |
psid |
sd__(Intercept) |
4.186 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
0.058 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
sd__Week |
0.312 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
Residual |
sd__Observation |
3.262 |
NA |
NA |
NA |
NA |
NA |
NA |
# R2 for Mixed Models
Conditional R2: 0.703
Marginal R2: 0.024
New Analyses: Engagement
TWEETS
Methods Text: Perceived engagement with the
intervention was assessed weekly using an averaged composite measure
(Tweets_Avg) that reflected how well participants felt the intervention
fit their needs and goals. To examine changes in engagement quality over
time, we fit a linear mixed-effects model using restricted maximum
likelihood (REML). Week was included as a fixed effect to model linear
change, and participant ID (psid) was included as a random intercept to
account for individual differences in baseline engagement perceptions.
This model structure allowed us to estimate overall trajectories of
perceived engagement while accommodating repeated measures within
participants. Analyses were conducted in R using the lme4 and lmerTest
packages, with degrees of freedom estimated using Satterthwaite’s
method.
Results Text: The linear mixed-effects model
revealed a significant decline in perceived engagement across the
intervention period (b = −0.04, SE = 0.006, t(531) = −6.61, p <
.001).
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Tweets_Avg ~ Week + (1 | psid)
Data: .
REML criterion at convergence: 924.1
Scaled residuals:
Min 1Q Median 3Q Max
-5.3610 -0.4855 0.0114 0.5652 3.1417
Random effects:
Groups Name Variance Std.Dev.
psid (Intercept) 0.5854 0.7651
Residual 0.1732 0.4162
Number of obs: 609, groups: psid, 80
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 2.946915 0.101432 131.706233 29.053 < 2e-16 ***
Week -0.039363 0.005956 531.473885 -6.609 9.44e-11 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr)
Week -0.499

LS0tCnRpdGxlOiAiUHVycmJsZSBSQ1QgQW5hbHlzZXM6IFJldmlzZSBhbmQgUmVzdWJtaXQiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmluc3RhbGwucGFja2FnZXMoInJjaXBsb3QiKQojIFJlY29yZGluZyBLZWVwaW5nOiAKClRoZXJlIGFyZSB0d28gbWFzdGVyIGZpbGVzIHRoYXQgd2UgYXJlIHVzaW5nIGZvciBhbmFseXNlcy4gVGhleSBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUgZmlsZSwgdGhvdWdoIG9uZSBpcyBpbiB3aWRlIGZvcm1hdCBhbmQgdGhlIG90aGVyIGlzIGluIGxvbmcgZm9ybWF0LgoKVGhlIHdpZGUgZm9ybWF0IGRhdGFzZXQgaXMgY2FsbGVkIOKAnFB1cnJibGVfTWFzdGVyX1dpZGUu4oCdIFRoZSBsb25nIGRhdGFzZXQgZm9ybWF0IGRhdGFzZXQgaXMgY2FsbGVkIOKAnFB1cnJibGVfTG9uZ19NYXN0ZXIu4oCdIFRoZSB3aWRlIGRhdGFzZXQgaGFzIGFsbCBvZiB0aGUgcHJlIGFuZCBwb3N0dGVzdCB2YXJpYWJsZXMgY2FsY3VsYXRlZCwgd2hpbGUgdGhlIGxvbmcgZG9lcyBub3QuIE90aGVyd2lzZSwgdGhleSBkbyBub3QgZGlmZmVyLiAKClRoaXMgZGF0YXNldCBpbmNsdWRlcyB0aGUgTj0xNTMgcGFydGljaXBhbnRzIHdobyB3ZXJlIGluY2x1ZGVkIGluIHRoZSByYW5kb21pemVkIGNvbnRyb2wgdHJpYWwgZXhhbWluaW5nIFB1cnJibGUgd2l0aCBhIHBvcHVsYXRpb24gb2YgdW5pdmVyc2l0eSBzdHVkZW50cy4gQWxsIHBhcnRpY2lwYW50cyB3ZXJlIG1lbWJlcnMgb2YgdGhlIExHVEJRKyBjb21tdW5pdHkuCgpUaGVzZSBhbmFseXNlcyB3ZXJlIGNvbmR1Y3RlZCBpbiBPY3RvYmVyIGJ5IEF1YnJleSBSaG9kZXMuIFdlIHVzZSB0aGUgImZpbmFsIiBkYXRhc2V0cyBpbiB3aGljaCB3ZSByZW1vdmVkIHBhcnRpY2lwYW50IEM3Miwgd2hvIGhhZCBubyBpbmZvcm1hdGlvbiBvbiBnZW5kZXIgaWRlbnRpdHkuCgpUaGVzZSBhbmFseXNlcyByZW1vdmUgYWxsIG9mIHRoZSB2YXJpYWJsZXMgZXhjZXB0IGZvciBlbW90aW9uIHJlZ3VsYXRpb24sIFBIUSwgYW5kIEFueGlldHkgYXMgb3V0Y29tZXMuCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgaW5jbHVkZSA9IFRSVUUsICB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkKbGlicmFyeSh0aWR5dmVyc2UpICAgICMgSW5jbHVkZXMgZHBseXIsIHRpZHlyLCBnZ3Bsb3QyLCBwdXJyciwgcmVhZHIsIHRpYmJsZSwgc3RyaW5nciwgZm9yY2F0cwpsaWJyYXJ5KGJyb29tKSAgICAgICAgIyBGb3IgdGlkeWluZyBtb2RlbCBvdXRwdXRzCmxpYnJhcnkoZW1tZWFucykgICAgICAjIEZvciBlc3RpbWF0ZWQgbWFyZ2luYWwgbWVhbnMKbGlicmFyeShrYWJsZUV4dHJhKSAgICMgRm9yIG5pY2UgQVBBIHRhYmxlcwpsaWJyYXJ5KGVmZmVjdHNpemUpICAgIyBGb3IgQ29oZW4ncyBkLCDOt8KyLCBldGMuCmxpYnJhcnkoc3RhcmdhemVyKSAgICAjIEZvciByZWdyZXNzaW9uIHRhYmxlcyAob3B0aW9uYWwpCmxpYnJhcnkoYXBhVGFibGVzKSAgICAjIEZvciBBUEEtZm9ybWF0IHRhYmxlcyAob3B0aW9uYWwpCmxpYnJhcnkoanRvb2xzKSAgICAgICAjIEZvciBpbnRlcmFjdGlvbiBwbG90cyBhbmQgZWZmZWN0IHN1bW1hcmllcwpsaWJyYXJ5KHJlbXBzeWMpCgoKCgojbGlicmFyeShhcGFUYWJsZXMpCiNsaWJyYXJ5KGJyb29tKQojbGlicmFyeShicm9vbS5taXhlZCkKI2xpYnJhcnkoY2xpcHIpCiNsaWJyYXJ5KGNvd3Bsb3QpCiNsaWJyYXJ5KGRwbHlyKQojbGlicmFyeShlZmZlY3RzaXplKQojbGlicmFyeShlbW1lYW5zKQojbGlicmFyeShnZ3Bsb3QyKQojbGlicmFyeShnZ3B1YnIpCiNsaWJyYXJ5KGdyaWRFeHRyYSkKI2xpYnJhcnkoZ3QpCiNsaWJyYXJ5KGludGVyYWN0aW9ucykKI2xpYnJhcnkoanRvb2xzKQojbGlicmFyeShrYWJsZUV4dHJhKQojbGlicmFyeShrbml0cikKI2xpYnJhcnkobG1lNCkKI2xpYnJhcnkobWFya2Rvd24pCiNsaWJyYXJ5KE1PVEUpCiNsaWJyYXJ5KG11bHRpbGV2ZWxtb2QpCiNsaWJyYXJ5KHBhdGNod29yaykKI2xpYnJhcnkocHN5Y2gpCiNsaWJyYXJ5KHB1cnJyKQojbGlicmFyeShyY2lwbG90KQojbGlicmFyeShyZWFkcikKI2xpYnJhcnkocmVhZHhsKQojCiNsaWJyYXJ5KHJzdGF0aXgpCiNsaWJyYXJ5KHNjYWxlcykKI2xpYnJhcnkoc3RhcmdhemVyKQojbGlicmFyeSh0aWJibGUpCiNsaWJyYXJ5KHRpZHltb2RlbHMpCiNsaWJyYXJ5KHRpZHlyKQojbGlicmFyeSh0aWR5dmVyc2UpCgpsaWJyYXJ5KHJlYWRyKQpQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIHJlYWRfY3N2KCJQdXJyYmxlX01hc3Rlcl9XaWRlLmNzdiIpClZpZXcoUHVycmJsZV9NYXN0ZXJfV2lkZSkKClB1cnJibGVfTG9uZ19NYXN0ZXIgPC0gcmVhZF9jc3YoIlB1cnJibGVfTG9uZ19NYXN0ZXIuY3N2IikKVmlldyhQdXJyYmxlX0xvbmdfTWFzdGVyKQoKYGBgCgojIDIuMS4gUGFydGljaXBhbnRzCgojIyAyLjEuMSBQYXJ0aWNpcGFudCBEaXNwb3NpdGlvbgoKQ29ycmVzcG9uZGluZyBUZXh0OiAKInJlc3VsdGluZyBpbiBhIGZpbmFsIHNhbXBsZSBzaXplIG9mIDE1MyBwYXJ0aWNpcGFudHM6IFB1cnJibGUgY29uZGl0aW9uIChuPTc2KSwgYW5kIHRoZSB3YWl0bGlzdCBjb250cm9sIGNvbmRpdGlvbiAobj03NykuIgoKIkdlbmRlciBpZGVudGl0eSB3YXMgZXZlbmx5IGRpc3RyaWJ1dGVkIGFjcm9zcyBjb25kaXRpb25zLCB3aXRoIDc2IHBhcnRpY2lwYW50cyAoNDkuNyUpIGlkZW50aWZ5aW5nIGFzIGNpc2dlbmRlciBhbmQgNzcgaWRlbnRpZnlpbmcgYXMgdHJhbnNnZW5kZXIsIGdlbmRlciBub24tY29uZm9ybWluZywgb3IgcXVlc3Rpb25pbmcgYW5kIG9yIGdlbmRlciBkaXZlcnNlIChUR0Q7ICAoNTAuMyUpLiAiCgoiV2l0aGluIGNvbmRpdGlvbnMsIHRoZSBQdXJyYmxlIGdyb3VwIGNvbnNpc3RlZCBvZiAzOSBjaXNnZW5kZXIgcGFydGljaXBhbnRzIGFuZCAzNyBUR0QgcGFydGljaXBhbnRzLCB3aGlsZSB0aGUgd2FpdGxpc3QgY29udHJvbCBncm91cCBjb25zaXN0ZWQgb2YgMzcgY2lzZ2VuZGVyIHBhcnRpY2lwYW50cyBhbmQgNDAgVEdEIHBhcnRpY2lwYW50cy4iCgpgYGB7ciBzYW1wbGVfY2hhcmFjdGVyaXN0aWNzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyBUYWJsZSAxOiBOdW1iZXIgb2YgUGFydGljaXBhbnRzIGJ5IENvbmRpdGlvbgpjb25kaXRpb25fY291bnRzIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZGlzdGluY3QocHNpZCwgY29uZGl0aW9uKSAlPiUKICBjb3VudChjb25kaXRpb24sIG5hbWUgPSAiQ291bnQiKSAlPiUKICBhcnJhbmdlKGNvbmRpdGlvbikgJT4lCiAgYWRkX3Jvdyhjb25kaXRpb24gPSAiVG90YWwiLCBDb3VudCA9IHN1bSguJENvdW50KSkKCiMgVGFibGUgMjogTnVtYmVyIG9mIFBhcnRpY2lwYW50cyBieSBHZW5kZXIgSWRlbnRpdHkKaWRlbnRpdHlfY291bnRzIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZGlzdGluY3QocHNpZCwgaWRlbnRpdHlfZ3JvdXApICU+JQogIG11dGF0ZShpZGVudGl0eV9ncm91cCA9IGRwbHlyOjpyZWNvZGUoaWRlbnRpdHlfZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQyIgPSAiQ2lzZ2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUR0QiID0gIlRyYW5zZ2VuZGVyIikpICU+JQogIGNvdW50KGlkZW50aXR5X2dyb3VwLCBuYW1lID0gIkNvdW50IikgJT4lCiAgYXJyYW5nZShpZGVudGl0eV9ncm91cCkgJT4lCiAgYWRkX3JvdyhpZGVudGl0eV9ncm91cCA9ICJUb3RhbCIsIENvdW50ID0gc3VtKC4kQ291bnQpKQoKIyBUYWJsZSAzOiBDcm9zcy10YWJ1bGF0aW9uIG9mIENvbmRpdGlvbiBieSBHZW5kZXIgSWRlbnRpdHkKY3Jvc3NfdGFiIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZGlzdGluY3QocHNpZCwgY29uZGl0aW9uLCBpZGVudGl0eV9ncm91cCkgJT4lCiAgbXV0YXRlKGlkZW50aXR5X2dyb3VwID0gZHBseXI6OnJlY29kZShpZGVudGl0eV9ncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDIiA9ICJDaXNnZW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRHRCIgPSAiVHJhbnNnZW5kZXIiKSkgJT4lCiAgY291bnQoY29uZGl0aW9uLCBpZGVudGl0eV9ncm91cCkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGlkZW50aXR5X2dyb3VwLAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gbiwKICAgICAgICAgICAgICB2YWx1ZXNfZmlsbCA9IGxpc3QobiA9IDApKQoKIyBEaXNwbGF5IHRoZSB0YWJsZXMKa2FibGUoY29uZGl0aW9uX2NvdW50cywKICAgICAgY2FwdGlvbiA9ICJUYWJsZSAxOiBOdW1iZXIgb2YgUGFydGljaXBhbnRzIGJ5IENvbmRpdGlvbiIsCiAgICAgIGZvcm1hdCA9ICJtYXJrZG93biIpCgprYWJsZShpZGVudGl0eV9jb3VudHMsCiAgICAgIGNhcHRpb24gPSAiVGFibGUgMjogTnVtYmVyIG9mIFBhcnRpY2lwYW50cyBieSBHZW5kZXIgSWRlbnRpdHkiLAogICAgICBmb3JtYXQgPSAibWFya2Rvd24iKQoKa2FibGUoY3Jvc3NfdGFiLAogICAgICBjYXB0aW9uID0gIlRhYmxlIDM6IENyb3NzLXRhYnVsYXRpb24gb2YgQ29uZGl0aW9uIGJ5IEdlbmRlciBJZGVudGl0eSIsCiAgICAgIGZvcm1hdCA9ICJtYXJrZG93biIpCmBgYAoKCiMjIDIuMS4yIFBhcnRpY2lwYW50IENoYXJhY3RlcmlzdGljcwoKUGFydGljaXBhbnRzIGNoYXJhY3RlcmlzdGljcyBpbmNsdWRpbmcgc2V4dWFsIG9yaWVudGF0aW9uLCByYWNlL2V0aG5pY2l0eSwgYW5kIGFnZSBhcmUgc2hvd24gcmVwb3J0ZWQgYnkgY29uZGl0aW9uIGluIFRhYmxlIDEuIAoKIyMjIEFnZTogRGVzY3JpcHRpdmVzIAoKU3VtbWFyaXplcyBhZ2UgKE1lYW4sIFNELCBNaW4sIE1heCkgYnkgY29uZGl0aW9uLgpgYGB7cn0KZGVzY3JpcHRpdmVfc3RhdHMgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZSgKICAgIE1lYW4gPSBtZWFuKGFnZSwgbmEucm0gPSBUUlVFKSwKICAgIFNEICAgPSBzZChhZ2UsIG5hLnJtID0gVFJVRSksCiAgICBNaW4gID0gbWluKGFnZSwgbmEucm0gPSBUUlVFKSwKICAgIE1heCAgPSBtYXgoYWdlLCBuYS5ybSA9IFRSVUUpLAogICAgLmdyb3VwcyA9ICJkcm9wIgogICkKCmNhdCgiVGFibGU6IERlc2NyaXB0aXZlIFN0YXRpc3RpY3MgZm9yIEFnZSBieSBDb25kaXRpb24gKEFQQSBGb3JtYXQpXG5cbiIpCgojIEFQQS1zdHlsZSB0YWJsZSAocmVxdWlyZXMgcmVtcHN5YykKbmljZV90YWJsZShkZXNjcmlwdGl2ZV9zdGF0cykKCmBgYAoKIyMjIFNleHVhbCBPcmllbnRhdGlvbi0gU2ltcGxpZmllZAoKCmBgYHtyfQoKc29fdGFibGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUoc29fc2ltcGxpZmllZCA9IHRvbG93ZXIoc29fc2ltcGxpZmllZCkpICU+JSAgICAgICAgICAgICAgICAjIHN0YW5kYXJkaXplIHRleHQKICBncm91cF9ieShjb25kaXRpb24sIHNvX3NpbXBsaWZpZWQpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvdW50IGJ5IGNvbmRpdGlvbgogIHN1bW1hcmlzZShuID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBwaXZvdF93aWRlcigKICAgIG5hbWVzX2Zyb20gPSBjb25kaXRpb24sCiAgICB2YWx1ZXNfZnJvbSA9IG4sCiAgICB2YWx1ZXNfZmlsbCA9IDAKICApICU+JQogIG11dGF0ZSgKICAgIFRvdGFsID0gcm93U3VtcyhhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYykpKSAgICAgICAgICAgICAgICAgICAgICAjIGFkZCB0b3RhbCBjb3VudHMKICApCgojIENvbXB1dGUgZGVub21pbmF0b3JzIChwYXJ0aWNpcGFudHMgcGVyIGNvbmRpdGlvbikKZGVub20gPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBjb3VudChjb25kaXRpb24sIG5hbWUgPSAidG90YWwiKQoKb3ZlcmFsbF9kZW5vbSA8LSBucm93KFB1cnJibGVfTWFzdGVyX1dpZGUpCgojIEFkZCBwZXJjZW50YWdlcyB0byBlYWNoIGNvdW50CnNvX3RhYmxlIDwtIHNvX3RhYmxlICU+JQogIG11dGF0ZSgKICAgIGFjcm9zcygKICAgICAgLWMoc29fc2ltcGxpZmllZCwgVG90YWwpLAogICAgICB+IHBhc3RlMCgueCwgIiAoIiwgcm91bmQoLnggLyBkZW5vbSR0b3RhbFtkZW5vbSRjb25kaXRpb24gPT0gY3VyX2NvbHVtbigpXSAqIDEwMCwgMSksICIlKSIpLAogICAgICAubmFtZXMgPSAiey5jb2x9IgogICAgKSwKICAgIFRvdGFsID0gcGFzdGUwKFRvdGFsLCAiICgiLCByb3VuZChUb3RhbCAvIG92ZXJhbGxfZGVub20gKiAxMDAsIDEpLCAiJSkiKQogICkKCiMgRGlzcGxheSB0aGUgZm9ybWF0dGVkIHRhYmxlCmthYmxlKHNvX3RhYmxlLCBjYXB0aW9uID0gIlRhYmxlOiBTZXh1YWwgT3JpZW50YXRpb24gKHNvX3NpbXBsaWZpZWQpIGJ5IENvbmRpdGlvbiAoQ291bnRzIGFuZCBQZXJjZW50YWdlcykiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKYGBgCgoKIyMjIFJhY2UKYGBge3J9CmxpYnJhcnkoZHBseXIpCiMgRGVmaW5lIHJhY2UgdmFyaWFibGVzCnJhY2VfdmFycyA8LSBjKCJSYWNlX0FzaWFuIiwgIlJhY2VfQXJhYmljIiwgIlJhY2VfQmxhY2siLCAiUmFjZV9IaXNwYW5pYyIsIAogICAgICAgICAgICAgICAiUmFjZV9QYWNpZmljIiwgIlJhY2VfV2hpdGUiLCAiUmFjZV91bmtub3duIikKCiMgU3RlcCAxOiBDcmVhdGUgcGFydGljaXBhbnQtbGV2ZWwgcmFjZSBkYXRhCnJhY2VfZGF0YSA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRwbHlyOjpzZWxlY3QocHNpZCwgY29uZGl0aW9uLCBhbGxfb2YocmFjZV92YXJzKSkgJT4lCiAgZGlzdGluY3QoKQoKIyBTdGVwIDI6IFBpdm90IHRvIGxvbmcgZm9ybWF0IHNvIHRoYXQgZWFjaCByb3cgaXMgb25lIHJhY2Ugb3B0aW9uIHBlciBwYXJ0aWNpcGFudCwgdGhlbiBmaWx0ZXIgZm9yIGluZGljYXRvciA9PSAxCnJhY2VfbG9uZyA8LSByYWNlX2RhdGEgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBhbGxfb2YocmFjZV92YXJzKSwgbmFtZXNfdG8gPSAiUmFjZSIsIHZhbHVlc190byA9ICJpbmRpY2F0b3IiKSAlPiUKICBmaWx0ZXIoaW5kaWNhdG9yID09IDEpCgojIFN0ZXAgMzogQ29tcHV0ZSBjb3VudHMgYnkgY29uZGl0aW9uIGZvciBlYWNoIFJhY2Ugb3B0aW9uCnJhY2VfY291bnRzIDwtIHJhY2VfbG9uZyAlPiUKICBncm91cF9ieShSYWNlLCBjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikKCiMgU3RlcCA0OiBDb21wdXRlIGRlbm9taW5hdG9ycyAodG90YWwgcGFydGljaXBhbnRzKSBwZXIgY29uZGl0aW9uCmRlbm9tIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZGlzdGluY3QocHNpZCwgY29uZGl0aW9uKSAlPiUKICBjb3VudChjb25kaXRpb24sIG5hbWUgPSAiZGVub20iKQoKIyBTdGVwIDU6IEpvaW4gZGVub21pbmF0b3JzIGFuZCBjb21wdXRlIHBlcmNlbnRhZ2VzIGZvciBlYWNoIFJhY2Ugb3B0aW9uIHBlciBjb25kaXRpb24KcmFjZV9jb3VudHMgPC0gcmFjZV9jb3VudHMgJT4lCiAgbGVmdF9qb2luKGRlbm9tLCBieSA9ICJjb25kaXRpb24iKSAlPiUKICBtdXRhdGUocGVyY2VudGFnZSA9IHJvdW5kKGNvdW50IC8gZGVub20gKiAxMDAsIDEpKQoKIyBTdGVwIDY6IFBpdm90IHdpZGVyIHNvIHRoYXQgZWFjaCByYWNlIG9wdGlvbiBpcyBvbmUgcm93LgpyYWNlX3dpZGUgPC0gcmFjZV9jb3VudHMgJT4lCiAgcGl2b3Rfd2lkZXIoaWRfY29scyA9IFJhY2UsIAogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSBjb25kaXRpb24sIAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gYyhjb3VudCwgcGVyY2VudGFnZSksCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSBsaXN0KGNvdW50ID0gMCwgcGVyY2VudGFnZSA9IDApLAogICAgICAgICAgICAgIHZhbHVlc19mbiA9IGxpc3QoY291bnQgPSBzdW0sIHBlcmNlbnRhZ2UgPSBzdW0pKQoKIyBTdGVwIDc6IENvbXB1dGUgb3ZlcmFsbCB0b3RhbHMgZm9yIGVhY2ggUmFjZSBvcHRpb24Kb3ZlcmFsbF9kZW5vbSA8LSBucm93KFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lIGRpc3RpbmN0KHBzaWQpKQpvdmVyYWxsX2NvdW50cyA8LSByYWNlX2xvbmcgJT4lCiAgZ3JvdXBfYnkoUmFjZSkgJT4lCiAgc3VtbWFyaXNlKHRvdGFsX2NvdW50ID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBtdXRhdGUodG90YWxfcGVyY2VudGFnZSA9IHJvdW5kKHRvdGFsX2NvdW50IC8gb3ZlcmFsbF9kZW5vbSAqIDEwMCwgMSkpCgojIFN0ZXAgODogTWVyZ2Ugb3ZlcmFsbCB0b3RhbHMgd2l0aCB0aGUgd2lkZSB0YWJsZQpyYWNlX3RhYmxlIDwtIHJhY2Vfd2lkZSAlPiUKICBsZWZ0X2pvaW4ob3ZlcmFsbF9jb3VudHMsIGJ5ID0gIlJhY2UiKQoKIyBTdGVwIDk6IFJlb3JkZXIgY29sdW1ucyBzbyB0aGF0IGZvciBlYWNoIGNvbmRpdGlvbiB0aGUgY291bnQgYW5kIHBlcmNlbnRhZ2UgY29sdW1ucyBhcHBlYXIgc2lkZS1ieS1zaWRlLAojIGFuZCB0aGVuIGFkZCBvdmVyYWxsIChUb3RhbCkgY29sdW1ucy4KY29uZGl0aW9ucyA8LSBzb3J0KHVuaXF1ZShQdXJyYmxlX0xvbmdfTWFzdGVyJGNvbmRpdGlvbikpCm9yZGVyZWRfY29scyA8LSBjKCJSYWNlIikKZm9yIChjb25kIGluIGNvbmRpdGlvbnMpIHsKICBvcmRlcmVkX2NvbHMgPC0gYyhvcmRlcmVkX2NvbHMsIHBhc3RlMCgiY291bnRfIiwgY29uZCksIHBhc3RlMCgicGVyY2VudGFnZV8iLCBjb25kKSkKfQpvcmRlcmVkX2NvbHMgPC0gYyhvcmRlcmVkX2NvbHMsICJ0b3RhbF9jb3VudCIsICJ0b3RhbF9wZXJjZW50YWdlIikKcmFjZV90YWJsZSA8LSByYWNlX3RhYmxlICU+JSBkcGx5cjo6c2VsZWN0KGFsbF9vZihvcmRlcmVkX2NvbHMpKQoKIyBTdGVwIDEwOiBDcmVhdGUgYSBzcGFubmluZyBoZWFkZXI6CiMgRmlyc3QgY29sdW1uOiAiUmFjZSIsIHRoZW4gZWFjaCBjb25kaXRpb24gc3BhbnMgMiBjb2x1bW5zIChDb3VudCBhbmQgUGVyY2VudCksIHRoZW4gIlRvdGFsIiBzcGFucyAyIGNvbHVtbnMuCmhlYWRlcl92ZWMgPC0gYygiUmFjZSIgPSAxKQpmb3IgKGNvbmQgaW4gY29uZGl0aW9ucykgewogIGhlYWRlcl92ZWMgPC0gYyhoZWFkZXJfdmVjLCBzZXROYW1lcygyLCBjb25kKSkKfQpoZWFkZXJfdmVjIDwtIGMoaGVhZGVyX3ZlYywgIlRvdGFsIiA9IDIpCgojIERpc3BsYXkgdGhlIGZpbmFsIHJhY2UgdGFibGUgd2l0aCB0aGUgc3Bhbm5pbmcgaGVhZGVyLgprYWJsZShyYWNlX3RhYmxlLCBjYXB0aW9uID0gIlRhYmxlOiBSYWNlIENvdW50cyBhbmQgUGVyY2VudGFnZXMgYnkgQ29uZGl0aW9uIiwgZm9ybWF0ID0gIm1hcmtkb3duIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoaGVhZGVyX3ZlYykKCgojIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyB3aXRoIG11bHRpcGxlIHJhY2lhbCBpZGVudGl0aWVzIHBlciBjb25kaXRpb24KbXVsdGlwbGVfcmFjZV9jb3VudHMgPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUKICBkcGx5cjo6c2VsZWN0KHBzaWQsIGNvbmRpdGlvbiwgYWxsX29mKHJhY2VfdmFycykpICU+JSAgIyBlbnN1cmUgZHBseXI6OnNlbGVjdCB0byBhdm9pZCBtYXNraW5nCiAgZGlzdGluY3QoKSAlPiUKICBtdXRhdGUoCiAgICBtdWx0aXBsZSA9IHJvd1N1bXMoYWNyb3NzKGFsbF9vZihyYWNlX3ZhcnMpKSwgbmEucm0gPSBUUlVFKSA+IDEKICApICU+JQogIGdyb3VwX2J5KGNvbmRpdGlvbikgJT4lCiAgc3VtbWFyaXNlKG11bHRpcGxlX2NvdW50ID0gc3VtKG11bHRpcGxlKSwgLmdyb3VwcyA9ICJkcm9wIikKICAKIyBQcmludCBvdXRwdXQgbWVzc2FnZXMgZm9yIGVhY2ggY29uZGl0aW9uCm11bHRpcGxlX3JhY2VfY291bnRzICU+JQogIG11dGF0ZShtZXNzYWdlID0gcGFzdGUwKAogICAgbXVsdGlwbGVfY291bnQsICIgcGVvcGxlIGluIHRoZSAiLCBjb25kaXRpb24sCiAgICAiIGNvbmRpdGlvbiByZXBvcnRlZCBtdWx0aXBsZSByYWNpYWwgaWRlbnRpdGllcy4iCiAgKSkgJT4lCiAgcHVsbChtZXNzYWdlKSAlPiUKICBjYXQoc2VwID0gIlxuIikKYGBgCgoKCgoKIyMgMi4xLjMgRW5nYWdlbWVudCBhbmQgUmV0ZW50aW9uCgojIyMgTnVtYmVyIG9mIHF1ZXN0aW9ubmFpcmVzCgoqKlJlc3VsdHMgVGV4dDoqKiBQYXJ0aWNpcGFudHMgY29tcGxldGVkIGFuIGF2ZXJhZ2Ugb2YgMTIuNCBxdWVzdGlvbm5haXJlcyBpbiB0aGUgUHVycmJsZSBhbmQgMTIuOSBxdWVzdGlvbm5haXJlcyBpbiB0aGUgY29udHJvbCBjb25kaXRpb24gb3V0IG9mIGEgcG9zc2libGUgMTQgKEJhc2VsaW5lIFvigJxXZWVrIDDigJ1dIHRocm91Z2ggRm9sbG93LVVwIFvigJxXZWVrIDEz4oCdXSkuIAoKYGBge3J9CgojIElkZW50aWZ5IGF0dGVuZGFuY2UgY29sdW1ucyAodGhvc2Ugc3RhcnRpbmcgd2l0aCAiV2Vla18iKQphdHRlbmRhbmNlX2NvbHMgPC0gZ3JlcCgiXldlZWtfIiwgbmFtZXMoUHVycmJsZV9NYXN0ZXJfV2lkZSksIHZhbHVlID0gVFJVRSkKCiMgQ2FsY3VsYXRlIHRvdGFsIHNlc3Npb25zIGF0dGVuZGVkIHBlciBwYXJ0aWNpcGFudApQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKHRvdGFsX3Nlc3Npb25zID0gcm93U3VtcyhhY3Jvc3MoYWxsX29mKGF0dGVuZGFuY2VfY29scykpKSkKCiMgQVBBLWZvcm1hdHRlZCB0YWJsZQpzZXNzaW9uc19ieV9jb25kaXRpb24gPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZSgKICAgIG1lYW5fc2Vzc2lvbnMgPSBtZWFuKHRvdGFsX3Nlc3Npb25zLCBuYS5ybSA9IFRSVUUpLAogICAgc2Rfc2Vzc2lvbnMgPSBzZCh0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgIG4gPSBuKCksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKQoKc2Vzc2lvbnNfYnlfY29uZGl0aW9uICU+JQogIGthYmxlKGNhcHRpb24gPSAiVGFibGUgMzogVG90YWwgU2Vzc2lvbnMgQXR0ZW5kZWQgYnkgQ29uZGl0aW9uIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCmBgYAoKCiMjIyBBdHRyaXRpb246CgoqKlJlc3VsdHMgVGV4dCoqIEF0dHJpdGlvbiByYXRlcyB3ZXJlIGxvdyBvdmVyYWxsIGFuZCBkaWQgbm90IGRpZmZlciBzaWduaWZpY2FudGx5IGJ5IGNvbmRpdGlvbiwgz4fCsigxLCBOID0gMTUzKSA9IDAuMTEsIHAgPSAuNzUsIHdpdGggOS4yJSBhdHRyaXRpb24gaW4gdGhlIFB1cnJibGUgY29uZGl0aW9uICg3IG9mIDc2IHBhcnRpY2lwYW50cykgYW5kIDYuNSUgYXR0cml0aW9uIGluIHRoZSB3YWl0bGlzdCBjb250cm9sIGNvbmRpdGlvbiAoNSBvZiA3NyBwYXJ0aWNpcGFudHMpLiAKCmBgYHtyfQojIERlZmluZSBwb3N0LXRlc3QgYXR0ZW5kYW5jZSBjb2x1bW5zIChXZWVrcyAxMSwgMTIsIDEzKQpwb3N0X3Rlc3RfY29scyA8LSBjKCJXZWVrXzExIiwgIldlZWtfMTIiLCAiV2Vla18xMyIpCgojIENyZWF0ZSBhdHRyaXRpb24gaW5kaWNhdG9yOiBwb3N0X3Rlc3RfY29tcGxldGUgPSAxIGlmIGFueSBwb3N0LXRlc3Qgc2Vzc2lvbiBhdHRlbmRlZCwgMCBvdGhlcndpc2UKUHVycmJsZV9NYXN0ZXJfV2lkZSA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIG11dGF0ZShwb3N0X3Rlc3RfY29tcGxldGUgPSBpZl9lbHNlKHJvd1N1bXMoYWNyb3NzKGFsbF9vZihwb3N0X3Rlc3RfY29scykpKSA+IDAsIDEsIDApKQoKIyBEaXNwbGF5IHRoZSBBUEEtZm9ybWF0dGVkIHRhYmxlcwphdHRyaXRpb25fYnlfY29uZGl0aW9uICU+JQogIG11dGF0ZSgKICAgIGNvbmRpdGlvbiA9IGRwbHlyOjpyZWNvZGUoYXMuY2hhcmFjdGVyKGNvbmRpdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAwYCA9ICJXYWl0bGlzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxYCA9ICJQdXJyYmxlIikKICApICU+JQogIGthYmxlKGNhcHRpb24gPSAiVGFibGUgNzogQXR0cml0aW9uIFJhdGUgYnkgQ29uZGl0aW9uIAogICAgICAgICh3aXRoIENvbXBsZXRlZCBhbmQgTm90IENvbXBsZXRlZCBjb3VudHMpIiwgZm9ybWF0ID0gIm1hcmtkb3duIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCmBgYAoKCioqUmVzdWx0cyBUZXh0OioqICJBY3Jvc3MgdGhlIGZ1bGwgc2FtcGxlLCByZWdyZXNzaW9uIGFuYWx5c2VzIGluZGljYXRlZCBhIHNpZ25pZmljYW50IGRlY2xpbmUgaW4gcGFydGljaXBhdGlvbiBvdmVyIHRpbWUsIHdpdGggdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHdlZWtseSByZXNwb25kZW50cyBkZWNyZWFzaW5nIGJ5IGFwcHJveGltYXRlbHkgMi4xNCBwZXIgd2VlayAoU0UgPSAwLjI5LCB0ID0g4oCTNy4zNiwgcCA8IC4wMDEpLiBXaGVuIGV4YW1pbmVkIGJ5IGNvbmRpdGlvbiwgcGFydGljaXBhdGlvbiBkZWNsaW5lZCBhdCBhIHJhdGUgb2Yg4oCTMS40NiBwYXJ0aWNpcGFudHMgcGVyIHdlZWsgaW4gdGhlIFB1cnJibGUgZ3JvdXAgKFNFID0gMC4yMywgdCA9IOKAkzYuMjIsIHAgPCAuMDAxKSBhbmQg4oCTMC42OSBwYXJ0aWNpcGFudHMgcGVyIHdlZWsgaW4gdGhlIHdhaXRsaXN0IGNvbnRyb2wgKFNFID0gMC4xMiwgdCA9IOKAkzUuODIsIHAgPCAuMDAxKS4gQSB0aW1lIMOXIGNvbmRpdGlvbiBpbnRlcmFjdGlvbiAozrIgPSAwLjc3LCBTRSA9IDAuMjYsIHAgPSAuMDA3KSBzdWdnZXN0ZWQgYSBzdGVlcGVyIGxpbmVhciBkZWNsaW5lIGluIHRoZSBQdXJyYmxlIGdyb3VwLCB0aG91Z2ggdGhlIGFic29sdXRlIGRpZmZlcmVuY2Ugd2FzIHNtYWxsLiIKCgpgYGB7cn0KCiMgMCkgQnVpbGQgcGVyLWNvbmRpdGlvbiB3ZWVrbHkgY291bnRzIChpbmNsdWRlcyBXZWVrIDApCnBhcnRpY2lwYXRpb25fYnlfY29uZGl0aW9uIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZ3JvdXBfYnkoV2VlaywgY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpemUobl9wYXJ0aWNpcGFudHMgPSBuX2Rpc3RpbmN0KHBzaWQpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBtdXRhdGUoCiAgICBXZWVrID0gYXMubnVtZXJpYyhXZWVrKQogICAgIyBObyBuZWVkIHRvIHJlZmFjdG9yICdjb25kaXRpb24nIGlmIGl0J3MgYWxyZWFkeSBhIHJlYWRhYmxlIHN0cmluZwogICkKCiMgMSkgRlVMTC1TQU1QTEUgZGVjbGluZTogY29sbGFwc2UgYWNyb3NzIGNvbmRpdGlvbiwgdGhlbiByZWdyZXNzCndlZWtseV90b3RhbCA8LSBwYXJ0aWNpcGF0aW9uX2J5X2NvbmRpdGlvbiAlPiUKICBncm91cF9ieShXZWVrKSAlPiUKICBzdW1tYXJpemUobl90b3RhbCA9IHN1bShuX3BhcnRpY2lwYW50cyksIC5ncm91cHMgPSAiZHJvcCIpCgptX292ZXJhbGwgPC0gbG0obl90b3RhbCB+IFdlZWssIGRhdGEgPSB3ZWVrbHlfdG90YWwpCm92ZXJhbGxfdGlkeSA8LSB0aWR5KG1fb3ZlcmFsbCwgY29uZi5pbnQgPSBUUlVFKQpvdmVyYWxsX3JvdyA8LSBvdmVyYWxsX3RpZHkgJT4lIGZpbHRlcih0ZXJtID09ICJXZWVrIikKY2F0KHNwcmludGYoCiAgIkFjcm9zcyB0aGUgZnVsbCBzYW1wbGUsIHBhcnRpY2lwYXRpb24gZGVjbGluZWQgYnkgJS4yZiBwZXIgd2VlayAoU0UgPSAlLjJmLCB0ID0gJS4yZiwgcCA9ICUuM2YpLlxuIiwKICBvdmVyYWxsX3JvdyRlc3RpbWF0ZSwgb3ZlcmFsbF9yb3ckc3RkLmVycm9yLCBvdmVyYWxsX3JvdyRzdGF0aXN0aWMsIG92ZXJhbGxfcm93JHAudmFsdWUKKSkKCiMgMikgV0lUSElOLUdST1VQIGRlY2xpbmVzOiBzZXBhcmF0ZSBtb2RlbHMgcGVyIGNvbmRpdGlvbgpieV9jb25kaXRpb25fc2xvcGVzIDwtIHBhcnRpY2lwYXRpb25fYnlfY29uZGl0aW9uICU+JQogIGdyb3VwX2J5KGNvbmRpdGlvbikgJT4lCiAgZ3JvdXBfbW9kaWZ5KH4gdGlkeShsbShuX3BhcnRpY2lwYW50cyB+IFdlZWssIGRhdGEgPSAueCksIGNvbmYuaW50ID0gVFJVRSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBmaWx0ZXIodGVybSA9PSAiV2VlayIpICU+JQogIGRwbHlyOjpzZWxlY3QoY29uZGl0aW9uLCBlc3RpbWF0ZSwgc3RkLmVycm9yLCBzdGF0aXN0aWMsIHAudmFsdWUsIGNvbmYubG93LCBjb25mLmhpZ2gpCgpwcmludChieV9jb25kaXRpb25fc2xvcGVzKQoKIyAzKSBESUZGRVJFTkNFIElOIFNMT1BFUyAoaW50ZXJhY3Rpb24gbW9kZWwpCiMgQ29udmVydCBjb25kaXRpb24gdG8gZmFjdG9yICpvbmx5IHRlbXBvcmFyaWx5KiBmb3IgcmVncmVzc2lvbiwgbm90IG92ZXJ3cml0aW5nIGl0Cm1faW50IDwtIGxtKG5fcGFydGljaXBhbnRzIH4gV2VlayAqIGZhY3Rvcihjb25kaXRpb24pLCBkYXRhID0gcGFydGljaXBhdGlvbl9ieV9jb25kaXRpb24pCmludF90aWR5IDwtIHRpZHkobV9pbnQsIGNvbmYuaW50ID0gVFJVRSkKCiMgUmVmZXJlbmNlLWdyb3VwIChXYWl0bGlzdCkgc2xvcGUgaXMgdGhlICdXZWVrJyBjb2VmZmljaWVudDoKd2FpdGxpc3Rfcm93IDwtIGludF90aWR5ICU+JSBmaWx0ZXIodGVybSA9PSAiV2VlayIpCgojIFNsb3BlIGRpZmZlcmVuY2UgKFB1cnJibGUg4oCTIFdhaXRsaXN0KSBpcyB0aGUgaW50ZXJhY3Rpb24gdGVybToKZGlmZl9yb3cgPC0gaW50X3RpZHkgJT4lIGZpbHRlcihncmVwbCgiXldlZWs6ZmFjdG9yXFwoY29uZGl0aW9uXFwpIiwgdGVybSkpCgojIFB1cnJibGUgc2xvcGUgPSBXYWl0bGlzdCBzbG9wZSArIGludGVyYWN0aW9uCnB1cnJibGVfc2xvcGUgPC0gd2FpdGxpc3Rfcm93JGVzdGltYXRlICsgZGlmZl9yb3ckZXN0aW1hdGUKCmNhdChzcHJpbnRmKAogICJTbG9wZSBkaWZmZXJlbmNlIChXZWVrIMOXIENvbmRpdGlvbikgZXN0aW1hdGUgPSAlLjJmLCBTRSA9ICUuMmYsIHQgPSAlLjJmLCBwID0gJS4zZjsgOTUlJSBDSSBbJS4yZiwgJS4yZl1cbiIsCiAgZGlmZl9yb3ckZXN0aW1hdGUsIGRpZmZfcm93JHN0ZC5lcnJvciwgZGlmZl9yb3ckc3RhdGlzdGljLCBkaWZmX3JvdyRwLnZhbHVlLCBkaWZmX3JvdyRjb25mLmxvdywgZGlmZl9yb3ckY29uZi5oaWdoCikpCmNhdChzcHJpbnRmKCJXYWl0bGlzdCBkZWNsaW5lID0gJS4yZiAvd2Vla1xuIiwgd2FpdGxpc3Rfcm93JGVzdGltYXRlKSkKY2F0KHNwcmludGYoIlB1cnJibGUgZGVjbGluZSAgPSAlLjJmIC93ZWVrXG4iLCBwdXJyYmxlX3Nsb3BlKSkKYGBgCgoKIyMjIFBhcnRpY2lwYXRpb24gYnkgR3JvdXAgT3ZlciBUaW1lCgoqKlJldmlld2VyJ3MgQ29tbWVudDoqKiAiUmVwb3J0IHRoZSByZXNwb25zZSByYXRlIHRvIHdlZWtseSBzdXJ2ZXlzIG92ZXIgdGltZS4gRGVjbGluaW5nIGVuZ2FnZW1lbnQgaXMgY29tbW9uIGluIG1lbnRhbCBoZWFsdGggcG9wdWxhdGlvbnMgYW5kIHJhaXNlcyByaXNrIG9mIHNlbGVjdGl2ZSByZXBvcnRpbmcuICIKCioqUmVzcG9uc2UqKiAiV2UgYWdyZWUgdGhhdCByZXBvcnRpbmcgcmVzcG9uc2UgcmF0ZXMgb3ZlciB0aW1lIGlzIGltcG9ydGFudCB0byBhc3Nlc3MgcG90ZW50aWFsIGVuZ2FnZW1lbnQgZGVjbGluZSBhbmQgc2VsZWN0aXZlIHJlc3BvbnNlIGJpYXMuIFdlIGhhdmUgbm93IGluY2x1ZGVkIGEgdGFibGUgc3VtbWFyaXppbmcgd2Vla2x5IHBhcnRpY2lwYXRpb24gcmF0ZXMgYnkgY29uZGl0aW9uIGFjcm9zcyB0aGUgc3R1ZHkgcGVyaW9kLiIKCioqQWRkZWQgVGV4dCwgUmVzdWx0cyoqICJXZWVrbHkgcmVzcG9uc2UgcmF0ZXMgYXJlIHN1bW1hcml6ZWQgYnkgY29uZGl0aW9uIGluIFRhYmxlIFggYW5kIEZpZ3VyZSBYLiIKCmBgYHtyfQojIyBQYXJ0aWNpcGF0aW9uIFJhdGUgKFdlZWtzIDHigJMxMykKCiMgU3RlcCAxOiBDYWxjdWxhdGUgcGFydGljaXBhdGlvbiBjb3VudCBwZXIgd2VlayBwZXIgY29uZGl0aW9uCnBhcnRpY2lwYXRpb25fYnlfY29uZGl0aW9uIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZ3JvdXBfYnkoV2VlaywgY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpemUobl9wYXJ0aWNpcGFudHMgPSBuX2Rpc3RpbmN0KHBzaWQpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBmaWx0ZXIoV2VlayA+PSAxICYgV2VlayA8PSAxMykgICMgRXhjbHVkZSBXZWVrIDAKCiMgU3RlcCAyOiBBZGQgZGVub21pbmF0b3JzIGZvciBlYWNoIGNvbmRpdGlvbgpwYXJ0aWNpcGF0aW9uX2J5X2NvbmRpdGlvbiA8LSBwYXJ0aWNpcGF0aW9uX2J5X2NvbmRpdGlvbiAlPiUKICBtdXRhdGUoZGVub21pbmF0b3IgPSBjYXNlX3doZW4oCiAgICBjb25kaXRpb24gPT0gIlB1cnJibGUgVHJlYXRtZW50IiB+IDc2LAogICAgY29uZGl0aW9uID09ICJXYWl0bGlzdCBDb250cm9sIiB+IDc3CiAgKSwKICBwYXJ0aWNpcGF0aW9uX3JhdGUgPSAobl9wYXJ0aWNpcGFudHMgLyBkZW5vbWluYXRvcikgKiAxMDApICAjIENvbnZlcnQgdG8gcGVyY2VudGFnZQoKIyBTdGVwIDM6IFBpdm90IGZvciBhIFdlZWsgw5cgQ29uZGl0aW9uIHRhYmxlCnBhcnRpY2lwYXRpb25fdGFibGUgPC0gcGFydGljaXBhdGlvbl9ieV9jb25kaXRpb24gJT4lCiAgc2VsZWN0KFdlZWssIGNvbmRpdGlvbiwgcGFydGljaXBhdGlvbl9yYXRlKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gY29uZGl0aW9uLCB2YWx1ZXNfZnJvbSA9IHBhcnRpY2lwYXRpb25fcmF0ZSwgdmFsdWVzX2ZpbGwgPSBsaXN0KHBhcnRpY2lwYXRpb25fcmF0ZSA9IDApKSAlPiUKICBhcnJhbmdlKFdlZWspCgojIFN0ZXAgNDogRGlzcGxheSBBUEEtZm9ybWF0dGVkIHRhYmxlCnBhcnRpY2lwYXRpb25fdGFibGUgJT4lCiAga2FibGUoY2FwdGlvbiA9ICJUYWJsZTogV2Vla2x5IFBhcnRpY2lwYXRpb24gUmF0ZXMgKCUgb2YgVG90YWwgUmFuZG9taXplZCkgYnkgQ29uZGl0aW9uIiwgZm9ybWF0ID0gIm1hcmtkb3duIiwgZGlnaXRzID0gMSkgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCgojIFN0ZXAgNTogUGxvdCBwYXJ0aWNpcGF0aW9uIHJhdGVzIG92ZXIgdGltZQpnZ3Bsb3QocGFydGljaXBhdGlvbl9ieV9jb25kaXRpb24sIGFlcyh4ID0gV2VlaywgeSA9IHBhcnRpY2lwYXRpb25fcmF0ZSwgY29sb3IgPSBjb25kaXRpb24pKSArCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArCiAgZ2VvbV9wb2ludChzaXplID0gMikgKwogIGxhYnModGl0bGUgPSAiV2Vla2x5IFBhcnRpY2lwYXRpb24gUmF0ZSAoV2Vla3MgMeKAkzEzKSBieSBDb25kaXRpb24iLAogICAgICAgeCA9ICJXZWVrIiwKICAgICAgIHkgPSAiUGFydGljaXBhdGlvbiBSYXRlICglKSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiKSArCiAgeWxpbSgwLCAxMDApCmBgYAoKCgpBY3Jvc3MgdGhlIGZ1bGwgc2FtcGxlLCByZWdyZXNzaW9uIGFuYWx5c2VzIGluZGljYXRlZCBhIHNpZ25pZmljYW50IGRlY2xpbmUgaW4gcGFydGljaXBhdGlvbiBvdmVyIHRpbWUsIHdpdGggdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHdlZWtseSByZXNwb25kZW50cyBkZWNyZWFzaW5nIGJ5IGFwcHJveGltYXRlbHkgMi4xNCBwZXIgd2VlayAoU0UgPSAwLjI5LCB0ID0g4oCTNy4zNiwgcCA8IC4wMDEpLiBXaGVuIGV4YW1pbmVkIGJ5IGNvbmRpdGlvbiwgcGFydGljaXBhdGlvbiBkZWNsaW5lZCBhdCBhIHJhdGUgb2Yg4oCTMS40NiBwYXJ0aWNpcGFudHMgcGVyIHdlZWsgaW4gdGhlIFB1cnJibGUgZ3JvdXAgKFNFID0gMC4yMywgdCA9IOKAkzYuMjIsIHAgPCAuMDAxKSBhbmQg4oCTMC43MCBwYXJ0aWNpcGFudHMgcGVyIHdlZWsgaW4gdGhlIHdhaXRsaXN0IGNvbnRyb2wgKFNFID0gMC4xMiwgdCA9IOKAkzUuODIsIHAgPCAuMDAxKS4gQSB0aW1lIMOXIGNvbmRpdGlvbiBpbnRlcmFjdGlvbiAozrIgPSAwLjc3LCBTRSA9IDAuMjYsIHAgPSAuMDA3KSBzdWdnZXN0ZWQgYSBzbGlnaHRseSBzdGVlcGVyIGxpbmVhciBkZWNsaW5lIGluIHRoZSBQdXJyYmxlIGdyb3VwLCB0aG91Z2ggdGhlIGFic29sdXRlIGRpZmZlcmVuY2Ugd2FzIHNtYWxsIChhcHByb3hpbWF0ZWx5IDAuMuKAkzAuMyBwYXJ0aWNpcGFudHMgcGVyIHdlZWspLiAgIAoKCgoKCgoKCgoKCiMgMi4yLiBQcmVsaW1pbmFyeSBBbmFseXNlcyAKCiMjIDIuMi4xIERlc2NyaXB0aXZlIFN0YXRpc3RpY3MKCioqUmV2aWV3ZXIgQ29tbWVudDoqKiAiUGxlYXNlIHByb3ZpZGUgYWJzb2x1dGUgZ3JvdXAgbWVhbnMgYW5kIFNEcyBhdCBiYXNlbGluZSBhbmQgZm9sbG93LXVwIGZvciBhbGwgb3V0Y29tZXMgaW4gdGhlIG1haW4gdGV4dCwgbm90IG9ubHkgYWRqdXN0ZWQgZGlmZmVyZW5jZXMuIgoKKipSZXNwb25zZToqKiAiVGhhbmsgeW91IGZvciBwb2ludGluZyBvdXQgdGhpcyBvbWlzc2lvbi4gV2UgYWdyZWUgdGhhdCBwcmVzZW50aW5nIGFic29sdXRlIGdyb3VwIG1lYW5zIGFuZCBzdGFuZGFyZCBkZXZpYXRpb25zIHByb3ZpZGVzIGltcG9ydGFudCBjb250ZXh0IGZvciBpbnRlcnByZXRpbmcgYWRqdXN0ZWQgZWZmZWN0cy4gV2UgaGF2ZSBub3cgYWRkZWQgYSB0YWJsZSBzdW1tYXJpemluZyBwcmUtIGFuZCBwb3N0LXRlc3QgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyAobWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMpIGZvciBhbGwgb3V0Y29tZXMgYnkgY29uZGl0aW9uLiIKCioqQWRkZWQgVGV4dDoqKiBUYWJsZSBYIHByZXNlbnRzIHByZS0gYW5kIHBvc3QtdGVzdCBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIChtZWFucyBhbmQgc3RhbmRhcmQgZGV2aWF0aW9ucykgZm9yIGFsbCBwcmltYXJ5IGFuZCBzZWNvbmRhcnkgb3V0Y29tZXMgYnkgY29uZGl0aW9uLgoKYGBge3J9CmRlc2NfdGJsIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgc3VtbWFyaXNlKAogICAgYWNyb3NzKAogICAgICAuY29scyA9IGMoUHJlX0RFUlM4X1N1bSwgUG9zdF9ERVJTOF9TdW0sCiAgICAgICAgICAgICAgICBQcmVfR0FEN19TdW0sICBQb3N0X0dBRDdfU3VtLAogICAgICAgICAgICAgICAgUHJlX1BIUTlfU3VtLCAgUG9zdF9QSFE5X1N1bSksCiAgICAgIC5mbnMgID0gbGlzdChtZWFuID0gfm1lYW4oLngsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICBzZCAgID0gfnNkKC54LCBuYS5ybSA9IFRSVUUpKSwKICAgICAgLm5hbWVzID0gInsuY29sfV97LmZufSIKICAgICksCiAgICAuYnkgPSBjb25kaXRpb25fbnVtCiAgKSAlPiUKICBwaXZvdF9sb25nZXIoCiAgICAtY29uZGl0aW9uX251bSwKICAgIG5hbWVzX3RvID0gYygiVGltZSIsICJNZWFzdXJlIiwgIi52YWx1ZSIpLAogICAgbmFtZXNfcGF0dGVybiA9ICIoUHJlfFBvc3QpXyhcXHcrKV9TdW1fKG1lYW58c2QpIgogICkgJT4lCiAgbXV0YXRlKAogICAgT3V0Y29tZSA9IGNhc2Vfd2hlbigKICAgICAgTWVhc3VyZSA9PSAiREVSUzgiIH4gIkVtb3Rpb24gUmVndWxhdGlvbiIsCiAgICAgIE1lYXN1cmUgPT0gIkdBRDciICB+ICJBbnhpZXR5IiwKICAgICAgTWVhc3VyZSA9PSAiUEhROSIgIH4gIkRlcHJlc3Npb24iCiAgICApLAogICAgTV9TRCA9IHNwcmludGYoIiUuMmYgKCUuMmYpIiwgbWVhbiwgc2QpCiAgKSAlPiUKICBzZWxlY3QoT3V0Y29tZSwgVGltZSwgY29uZGl0aW9uX251bSwgTV9TRCkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGMoY29uZGl0aW9uX251bSwgVGltZSksIHZhbHVlc19mcm9tID0gTV9TRCkgJT4lCiAgcmVuYW1lKAogICAgIldhaXRsaXN0X1ByZSIgID0gYDBfUHJlYCwKICAgICJXYWl0bGlzdF9Qb3N0IiA9IGAwX1Bvc3RgLAogICAgIlB1cnJibGVfUHJlIiAgID0gYDFfUHJlYCwKICAgICJQdXJyYmxlX1Bvc3QiICA9IGAxX1Bvc3RgCiAgKSAlPiUKICBzZWxlY3QoT3V0Y29tZSwgV2FpdGxpc3RfUHJlLCBXYWl0bGlzdF9Qb3N0LCBQdXJyYmxlX1ByZSwgUHVycmJsZV9Qb3N0KQoKIyBQcmludCBpbiBBUEEtc3R5bGUgd2l0aCBQcmUvUG9zdCBhcyBzdWJjb2x1bW5zCmthYmxlKAogIGRlc2NfdGJsLAogIGNhcHRpb24gPSAiTWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMgZm9yIGVhY2ggb3V0Y29tZSBieSBjb25kaXRpb24gYW5kIHRpbWUgcG9pbnQiLAogIGNvbC5uYW1lcyA9IGMoIk91dGNvbWUiLCAiUHJlIiwgIlBvc3QiLCAiUHJlIiwgIlBvc3QiKSwKICBhbGlnbiA9IGMoImwiLCAiYyIsICJjIiwgImMiLCAiYyIpCikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsICJXYWl0bGlzdCIgPSAyLCAiUHVycmJsZSIgPSAyKSkgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImNlbnRlciIpICU+JQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKQpgYGAKCgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCmRlc2NfdGJsIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uX251bSwgaWRlbnRpdHlfZ3JvdXApICU+JQogIHN1bW1hcmlzZSgKICAgIGFjcm9zcygKICAgICAgYyhQcmVfREVSUzhfU3VtLCBQb3N0X0RFUlM4X1N1bSwKICAgICAgICBQcmVfR0FEN19TdW0sICBQb3N0X0dBRDdfU3VtLAogICAgICAgIFByZV9QSFE5X1N1bSwgIFBvc3RfUEhROV9TdW0pLAogICAgICBsaXN0KG1lYW4gPSB+bWVhbigueCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICBzZCAgID0gfnNkKC54LCBuYS5ybSA9IFRSVUUpKSwKICAgICAgLm5hbWVzID0gInsuY29sfV97LmZufSIKICAgICksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKSAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gLWMoY29uZGl0aW9uX251bSwgaWRlbnRpdHlfZ3JvdXApLAogICAgbmFtZXNfdG8gPSBjKCJUaW1lIiwgIk1lYXN1cmUiLCAiLnZhbHVlIiksCiAgICBuYW1lc19wYXR0ZXJuID0gIihQcmV8UG9zdClfKFxcdyspX1N1bV8obWVhbnxzZCkiCiAgKSAlPiUKICBtdXRhdGUoCiAgICBDb25kaXRpb24gPSBpZmVsc2UoY29uZGl0aW9uX251bSA9PSAwLCAiV2FpdGxpc3QiLCAiUHVycmJsZSIpLAogICAgSWRlbnRpdHkgID0gaWZlbHNlKGlkZW50aXR5X2dyb3VwID09IDAsICJDaXNnZW5kZXIiLCAiVEdEIiksCiAgICBPdXRjb21lID0gcmVjb2RlKE1lYXN1cmUsCiAgICAgICAgICAgICAgICAgICAgICJERVJTOCIgPSAiRW1vdGlvbiBSZWd1bGF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgIkdBRDciICA9ICJBbnhpZXR5IiwKICAgICAgICAgICAgICAgICAgICAgIlBIUTkiICA9ICJEZXByZXNzaW9uIiksCiAgICBNX1NEID0gc3ByaW50ZigiJS4yZiAoJS4yZikiLCBtZWFuLCBzZCkKICApICU+JQogIHNlbGVjdChPdXRjb21lLCBJZGVudGl0eSwgQ29uZGl0aW9uLCBUaW1lLCBNX1NEKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gVGltZSwgdmFsdWVzX2Zyb20gPSBNX1NEKSAlPiUKICBhcnJhbmdlKE91dGNvbWUsIElkZW50aXR5LCBDb25kaXRpb24pCgojIC0tLSBBUEEtc3R5bGUgdGFibGUgLS0tCmthYmxlKAogIGRlc2NfdGJsLAogIGNhcHRpb24gPSAiTWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMgKE0gwrEgU0QpIGZvciBlYWNoIG91dGNvbWUgYnkgY29uZGl0aW9uLCB0aW1lIHBvaW50LCBhbmQgZ2VuZGVyIGlkZW50aXR5IiwKICBjb2wubmFtZXMgPSBjKCJPdXRjb21lIiwgIklkZW50aXR5IEdyb3VwIiwgIkNvbmRpdGlvbiIsICJQcmUiLCAiUG9zdCIpLAogIGFsaWduID0gYygibCIsICJsIiwgImwiLCAiYyIsICJjIikKKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSwgcG9zaXRpb24gPSAiY2VudGVyIikKCmBgYAoKCiMjIDIuMi4yIEJhc2VsaW5lIEVxdWl2YWxlbmNlIAoKKlJlc3VsdHMgVGV4dDoqIEJhc2VsaW5lIG1lYXN1cmVzIG9mIG91dGNvbWUgdmFyaWFibGVzIGFuZCBwYXJ0aWNpcGFudCBhZ2UgZGlkIG5vdCBkaWZmZXIgc2lnbmlmaWNhbnRseSBiZXR3ZWVuIGNvbmRpdGlvbnMuCgpgYGB7ciBiYXNlbGluZV9lcXVpdmFsZW5jZX0KdmFycyA8LSBjKCJhZ2UiLCAiUHJlX0RFUlM4X1N1bSIsICJQcmVfR0FEN19TdW0iLCAiUHJlX1BIUTlfU3VtIikKbGFiZWxzIDwtIGMoIkFnZSIsICJFbW90aW9uIFJlZ3VsYXRpb24gKERFUlMtOCkiLCAiQW54aWV0eSAoR0FELTcpIiwgIkRlcHJlc3Npb24gKFBIUS05KSIpCgojIFQtdGVzdHMKdHRlc3RzX2FsbCA8LSBsYXBwbHkodmFycywgZnVuY3Rpb24odikgewogIG5pY2VfdF90ZXN0KAogICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgICByZXNwb25zZSA9IHYsCiAgICBncm91cCA9ICJjb25kaXRpb24iLAogICAgd2FybmluZyA9IEZBTFNFCiAgKQp9KQoKIyBDb21iaW5lIGludG8gZGF0YWZyYW1lCnR0ZXN0c19jb21iaW5lZCA8LSBiaW5kX3Jvd3ModHRlc3RzX2FsbCwgLmlkID0gIlZhcmlhYmxlIikKdHRlc3RzX2NvbWJpbmVkJFZhcmlhYmxlIDwtIGxhYmVscwoKIyBQcmludCBvbmUgYmVhdXRpZnVsIHRhYmxlIHdvbyEKY2F0KCIjIyMgVGFibGUuIEJhc2VsaW5lIEVxdWl2YWxlbmNlIEFjcm9zcyBDb25kaXRpb25zIChJbmRlcGVuZGVudC1TYW1wbGVzIHQtdGVzdHMpXG4iKQpwcmludChuaWNlX3RhYmxlKHR0ZXN0c19jb21iaW5lZCkpCmBgYAoKCiMjMi4yLjMgT3V0bGllcnMKCipNZXRob2RzIFRleHQ6KiBTZWNvbmQsIHdlIHBlcmZvcm1lZCBtdWx0aXZhcmlhdGUgb3V0bGllciBhbmFseXNlcyB0byBpZGVudGlmeSBpbmZsdWVudGlhbCBkYXRhIHBvaW50cyAoNjMpLgoKKlJlc3VsdHMgVGV4dDoqIFdlIGV4YW1pbmVkIHBvdGVudGlhbCBtdWx0aXZhcmlhdGUgb3V0bGllcnMgYW1vbmcgYmFzZWxpbmUgdmFyaWFibGVzIChQcmUtREVSUzgsIFByZS1HQUQ3LCBQcmUtUEhROSkgdXNpbmcgTWFoYWxhbm9iaXMgZGlzdGFuY2UuIERpc3RhbmNlcyB3ZXJlIGNvbXBhcmVkIHRvIHRoZSDPh8KyIGRpc3RyaWJ1dGlvbiB3aXRoIDMgZGVncmVlcyBvZiBmcmVlZG9tIGF0IHAgPCAuOTkgKGNyaXRpY2FsIHZhbHVlID0gMTEuMzQpLiBPbmUgcGFydGljaXBhbnQgIGV4Y2VlZGVkIHRoaXMgdGhyZXNob2xkIChEwrIgPSAxNC41NyksIGluZGljYXRpbmcgYSBzb21ld2hhdCBhdHlwaWNhbCBjb21iaW5hdGlvbiBvZiBiYXNlbGluZSBlbW90aW9uLXJlZ3VsYXRpb24sIGFueGlldHksIGFuZCBkZXByZXNzaW9uIHNjb3Jlcy4gVG8gZXZhbHVhdGUgaW5mbHVlbmNlIG9uIG1vZGVsIHJlc3VsdHMsIHdlIHJlcmFuIGFsbCBwcmltYXJ5IGFuYWx5c2VzIChBTkNPVkEgYW5kIGxpbmVhciBtaXhlZC1lZmZlY3RzIG1vZGVscykgd2l0aCBhbmQgd2l0aG91dCB0aGlzIHBhcnRpY2lwYW50LiBUaGUgcGF0dGVybiwgbWFnbml0dWRlLCBhbmQgc2lnbmlmaWNhbmNlIG9mIHJlc3VsdHMgd2VyZSB1bmNoYW5nZWQuIEFjY29yZGluZ2x5LCBhbGwgYW5hbHlzZXMgd2VyZSByZXBvcnRlZCB1c2luZyB0aGUgZnVsbCBzYW1wbGUuIAoKYGBge3J9CnByZV92YXJzIDwtIGMoIlByZV9ERVJTOF9TdW0iLCAiUHJlX0dBRDdfU3VtIiwgIlByZV9QSFE5X1N1bSIpCgojIFNlbGVjdCBjb21wbGV0ZSBjYXNlcyBvbiBhbGwgcHJlLXRlc3RzCnByZV9kYXRhIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgc2VsZWN0KHBzaWQsIGFsbF9vZihwcmVfdmFycykpICU+JQogIGRyb3BfbmEoKQoKIyBDb21wdXRlIE1haGFsYW5vYmlzIGRpc3RhbmNlCm1haGFsIDwtIG1haGFsYW5vYmlzKAogIHggPSBwcmVfZGF0YVsgLCBwcmVfdmFyc10sCiAgY2VudGVyID0gY29sTWVhbnMocHJlX2RhdGFbICwgcHJlX3ZhcnNdKSwKICBjb3YgPSBjb3YocHJlX2RhdGFbICwgcHJlX3ZhcnNdKQopCgojIENyaXRpY2FsIGN1dG9mZiBmb3Igz4fCsiB3aXRoIGRmID0gbnVtYmVyIG9mIHZhcmlhYmxlcwpjdXRvZmYgPC0gcWNoaXNxKDAuOTksIGRmID0gbGVuZ3RoKHByZV92YXJzKSkKCiMgSWRlbnRpZnkgbXVsdGl2YXJpYXRlIG91dGxpZXJzCnByZV9kYXRhIDwtIHByZV9kYXRhICU+JQogIG11dGF0ZShtYWhhbCA9IG1haGFsLAogICAgICAgICBpc19vdXRsaWVyID0gbWFoYWwgPiBjdXRvZmYpCgojIFN1bW1hcnkKdGFibGUocHJlX2RhdGEkaXNfb3V0bGllcikKCmxpYnJhcnkoZ2dwbG90MikKCmdncGxvdChwcmVfZGF0YSwgYWVzKHggPSByZW9yZGVyKHBzaWQsIG1haGFsKSwgeSA9IG1haGFsKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY3V0b2ZmLCBjb2xvciA9ICJyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgbGFicygKICAgIHRpdGxlID0gIk1haGFsYW5vYmlzIERpc3RhbmNlIGZvciBQcmUtdGVzdCBWYXJpYWJsZXMiLAogICAgeCA9ICJQYXJ0aWNpcGFudCAob3JkZXJlZCBieSBNYWhhbGFub2JpcyBkaXN0YW5jZSkiLAogICAgeSA9ICJNYWhhbGFub2JpcyBEaXN0YW5jZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGNvb3JkX2ZsaXAoKQoKIyBHZXQgcGFydGljaXBhbnRzIElEIApvdXRsaWVyX3BzaWQgPC0gcHJlX2RhdGEgJT4lCiAgZmlsdGVyKGlzX291dGxpZXIpICU+JQogIHNlbGVjdChwc2lkLCBtYWhhbCkKCmNhdCgiT3V0bGllciBwYXJ0aWNpcGFudChzKSBiYXNlZCBvbiBNYWhhbGFub2JpcyBkaXN0YW5jZSAocCA8IC45OSk6XG4iKQpwcmludChvdXRsaWVyX3BzaWQpCmBgYAoKCiMjMi4yLjQgQXR0cml0aW9uIEFuYWx5c2lzLiAKKk1ldGhvZHMgVGV4dDoqIFRoaXJkLCB3ZSBjb25kdWN0ZWQgYXR0cml0aW9uIGFuYWx5c2VzICg2NCksIHdpdGggYXR0cml0aW9uIG9wZXJhdGlvbmFsaXNlZCBhcyBwYXJ0aWNpcGFudHMgZmFpbGluZyB0byBmaWxsIGluIGFueSBmb2xsb3ctdXAgcXVlc3Rpb25uYWlyZXMgKFdlZWtzIDEx4oCTMTMpLiBBIGJpbmFyeSBpbmRpY2F0b3Igd2FzIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGZvbGxvdy11cCBjb21wbGV0aW9uICgxID0gZmlsbGVkIGluIGF0IGxlYXN0IG9uZSBmb2xsb3ctdXAgcXVlc3Rpb25uYWlyZTsgMCA9IGZpbGxlZCBpbiBub25lKS4gQXR0cml0aW9uIHJhdGVzIHdlcmUgY2FsY3VsYXRlZCBvdmVyYWxsLCBieSBjb25kaXRpb24sIGFuZCBieSBnZW5kZXIgaWRlbnRpdHksIHVzaW5nIGNoaS1zcXVhcmUgdGVzdHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYXR0cml0aW9uIGRpZmZlcmVkIGJ5IGNvbmRpdGlvbiBvciBnZW5kZXIgaWRlbnRpdHkuCgoqUmVzdWx0cyBUZXh0OiogQ2hpLXNxdWFyZSB0ZXN0cyBpbmRpY2F0ZWQgdGhhdCBhdHRyaXRpb24gcmF0ZXMgZGlkIG5vdCBkaWZmZXIgc2lnbmlmaWNhbnRseSBieSBjb25kaXRpb24sIM+HwrIoMSkgPSAwLjExLCBwID0gLjc1LCBvciBieSBnZW5kZXIgaWRlbnRpdHksIM+HwrIoMSkgPDAuMDEsIHAgPSAxLiBXaGlsZSBhbmQgdGhlcmUgd2VyZSBubyBtYWluIG9yIGludGVyYWN0aXZlIGVmZmVjdHMgb2YgYXR0cml0aW9uIG9uIG91dGNvbWVzLiAKCmBgYHtyIGF0dHJpdGlvbl9hbmFseXNpc19maW5hbCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBEZWZpbmUgcG9zdC10ZXN0IGF0dGVuZGFuY2UgY29sdW1ucwpwb3N0X3Rlc3RfY29scyA8LSBjKCJXZWVrXzExIiwgIldlZWtfMTIiLCAiV2Vla18xMyIpCgojIENyZWF0ZSBhdHRyaXRpb24gaW5kaWNhdG9yOiAxID0gY29tcGxldGVkIGFueSBwb3N0LXRlc3Q7IDAgPSBkaWQgbm90IGNvbXBsZXRlIChhdHRyaXRlcikKUHVycmJsZV9NYXN0ZXJfV2lkZSA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIG11dGF0ZShwb3N0X3Rlc3RfY29tcGxldGUgPSBhcy5pbnRlZ2VyKHJvd1N1bXMoYWNyb3NzKGFsbF9vZihwb3N0X3Rlc3RfY29scykpLCBuYS5ybSA9IFRSVUUpID4gMCkpCgojIEhlbHBlciBmdW5jdGlvbiBmb3Igc3VtbWFyaWVzCnN1bW1hcml6ZV9hdHRyaXRpb24gPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXBfdmFyKSB7CiAgZGF0YSAlPiUKICAgIGdyb3VwX2J5KHt7IGdyb3VwX3ZhciB9fSkgJT4lCiAgICBzdW1tYXJpc2UoCiAgICAgIG4gPSBuKCksCiAgICAgIENvbXBsZXRlZCA9IHN1bShwb3N0X3Rlc3RfY29tcGxldGUsIG5hLnJtID0gVFJVRSksCiAgICAgIE5vdF9Db21wbGV0ZWQgPSBuIC0gQ29tcGxldGVkLAogICAgICBhdHRyaXRpb25fcmF0ZSA9IDEgLSBtZWFuKHBvc3RfdGVzdF9jb21wbGV0ZSwgbmEucm0gPSBUUlVFKSwKICAgICAgYXR0cml0aW9uX3BlcmNlbnQgPSByb3VuZChhdHRyaXRpb25fcmF0ZSAqIDEwMCwgMSksCiAgICAgIC5ncm91cHMgPSAiZHJvcCIKICAgICkKfQoKIyBIZWxwZXIgZnVuY3Rpb24KcnVuX2F0dHJpdGlvbl9hbmFseXNpcyA8LSBmdW5jdGlvbihkYXRhLCBncm91cF92YXIsIGdyb3VwX25hbWUpIHsKICAjIENoaS1zcXVhcmUKICBjdCA8LSB0YWJsZShwdWxsKGRhdGEsIHt7IGdyb3VwX3ZhciB9fSksIGRhdGEkcG9zdF90ZXN0X2NvbXBsZXRlKQogIGNoaSA8LSBzdXBwcmVzc1dhcm5pbmdzKGNoaXNxLnRlc3QoY3QpKQogIAogIGNhdCgiXG5cbiMjIyBDaGktc3F1YXJlIHRlc3QgZm9yIGF0dHJpdGlvbiBieSIsIGdyb3VwX25hbWUsICI6XG4iKQogIHByaW50KGNoaSkKICAKIyBTdW1tYXJ5IHRhYmxlCiAgdGJsIDwtIHN1bW1hcml6ZV9hdHRyaXRpb24oZGF0YSwge3sgZ3JvdXBfdmFyIH19KQogIGthYmxlKHRibCwKICAgICAgICBjYXB0aW9uID0gcGFzdGUwKCJUYWJsZTogQXR0cml0aW9uIFJhdGUgYnkgIiwgZ3JvdXBfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICIgKHdpdGggQ29tcGxldGVkIGFuZCBOb3QgQ29tcGxldGVkIGNvdW50cykiKSwKICAgICAgICBmb3JtYXQgPSAibWFya2Rvd24iKSAlPiUKICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKSAlPiUKICAgIHByaW50KCkKfQoKIyBSdW4gYm90aCBjaGlzcXVhcmUKcnVuX2F0dHJpdGlvbl9hbmFseXNpcyhQdXJyYmxlX01hc3Rlcl9XaWRlLCBjb25kaXRpb24sICJDb25kaXRpb24iKQpydW5fYXR0cml0aW9uX2FuYWx5c2lzKFB1cnJibGVfTWFzdGVyX1dpZGUsIGlkZW50aXR5X2dyb3VwLCAiR2VuZGVyIElkZW50aXR5IikKCmBgYAoKCipNZXRob2RzIFRleHQ6KiBUaGVuLCB0byBhc3Nlc3MgcG90ZW50aWFsIGF0dHJpdGlvbiBiaWFzLCB3ZSBjb25kdWN0ZWQgdHdvLXdheSBBTk9WQXMgdGVzdGluZyBmb3IgQ29uZGl0aW9uIMOXIEF0dHJpdGlvbiBTdGF0dXMgZWZmZWN0cyBvbiBlYWNoIGJhc2VsaW5lIG91dGNvbWUgdmFyaWFibGUuCgoqUmVzdWx0cyBUZXh0OiogTm8gbWFpbiBvciBpbnRlcmFjdGl2ZSBlZmZlY3RzIG9mIGF0dHJpdGlvbiBzdGF0dXMgd2VyZSBvYnNlcnZlZCBvbiBhbnkgYmFzZWxpbmUgdmFyaWFibGUsIGluZGljYXRpbmcgbm8gZXZpZGVuY2Ugb2YgZGlmZmVyZW50aWFsIGF0dHJpdGlvbgoKYGBge3IgYmFzZWxpbmVfYXR0cml0aW9uX2Fub3ZhX2NvbWJpbmVkLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIERlZmluZSB5b3VyIHRocmVlIHByZS10ZXN0IHZhcmlhYmxlcwpwcmVfdmFycyA8LSBjKCJQcmVfREVSUzhfU3VtIiwgIlByZV9HQUQ3X1N1bSIsICJQcmVfUEhROV9TdW0iKQoKIyBDb3JyZXNwb25kaW5nIGRlc2NyaXB0aXZlIGxhYmVscyAKbGFiZWxzIDwtIGMoIkVtb3Rpb24gUmVndWxhdGlvbiAoREVSUy04KSIsCiAgICAgICAgICAgICJBbnhpZXR5IChHQUQtNykiLAogICAgICAgICAgICAiRGVwcmVzc2lvbiAoUEhRLTkpIikKCiMgUnVuIHR3by13YXkgQU5PVkFzCmFub3ZhX3Jlc3VsdHMgPC0gbGFwcGx5KHByZV92YXJzLCBmdW5jdGlvbih2YXIpIHsKICBtb2RlbCA8LSBhb3YoYXMuZm9ybXVsYShwYXN0ZSh2YXIsICJ+IGNvbmRpdGlvbiAqIGF0dHJpdGlvbl9zdGF0dXMiKSksIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlKQogIHRpZHkobW9kZWwpICU+JQogICAgbXV0YXRlKFZhcmlhYmxlID0gdmFyKQp9KSAlPiUKICBiaW5kX3Jvd3MoKSAlPiUKICBmaWx0ZXIodGVybSAlaW4lIGMoImNvbmRpdGlvbiIsICJhdHRyaXRpb25fc3RhdHVzIiwgImNvbmRpdGlvbjphdHRyaXRpb25fc3RhdHVzIikpICU+JQogIG11dGF0ZSgKICAgIHRlcm0gPSBkcGx5cjo6cmVjb2RlKHRlcm0sCiAgICAgICJjb25kaXRpb24iID0gIkNvbmRpdGlvbiIsCiAgICAgICJhdHRyaXRpb25fc3RhdHVzIiA9ICJBdHRyaXRpb24gU3RhdHVzIiwKICAgICAgImNvbmRpdGlvbjphdHRyaXRpb25fc3RhdHVzIiA9ICJDb25kaXRpb24gw5cgQXR0cml0aW9uIgogICAgKSwKICAgICMgQWRkIGEgbGFiZWwgY29sdW1uIGJhc2VkIG9uIHRoZSB2YXJpYWJsZSBuYW1lCiAgICBMYWJlbCA9IGNhc2Vfd2hlbigKICAgICAgVmFyaWFibGUgPT0gIlByZV9ERVJTOF9TdW0iIH4gIkVtb3Rpb24gUmVndWxhdGlvbiAoREVSUy04KSIsCiAgICAgIFZhcmlhYmxlID09ICJQcmVfR0FEN19TdW0iICB+ICJBbnhpZXR5IChHQUQtNykiLAogICAgICBWYXJpYWJsZSA9PSAiUHJlX1BIUTlfU3VtIiAgfiAiRGVwcmVzc2lvbiAoUEhRLTkpIiwKICAgICAgVFJVRSB+IFZhcmlhYmxlCiAgICApCiAgKSAlPiUKICBzZWxlY3QoTGFiZWwsIHRlcm0sIGRmLCBzdGF0aXN0aWMsIHAudmFsdWUpCgojIFByZXR0eSB0YWJsZQprYWJsZShhbm92YV9yZXN1bHRzLAogICAgICBjYXB0aW9uID0gIlRhYmxlOiBUd28td2F5IEFOT1ZBcyBmb3IgQmFzZWxpbmUgT3V0Y29tZXMgYnkgQ29uZGl0aW9uIGFuZCBBdHRyaXRpb24gU3RhdHVzIiwKICAgICAgY29sLm5hbWVzID0gYygiVmFyaWFibGUiLCAiRWZmZWN0IiwgImRmIiwgIkYiLCAicCIpLAogICAgICBkaWdpdHMgPSAzLAogICAgICBmb3JtYXQgPSAibWFya2Rvd24iKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKYGBgCgoKIzIuMyBQcm9ncmFtIEVmZmVjdHMgCgoKCiMjIDIuMy4xICMgTWFpbiBFZmZlY3RzIEFuYWx5c2VzCgpUaGVzZSBhcmUgdGhlIG1haW4gcmVzdWx0cyBmb3IgdGhlIHBhcGVyIGhlcmUuIAoKYGBge3J9CmxpYnJhcnkoYnJvb20pCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShlZmZlY3RzaXplKQoKY2F0KCJjb25kaXRpb25fbnVtIGxldmVsczpcbiIpCnByaW50KHVuaXF1ZShQdXJyYmxlX01hc3Rlcl9XaWRlJGNvbmRpdGlvbl9udW0pKQoKY2F0KCJcbmlkZW50aXR5X2dyb3VwIGxldmVsczpcbiIpCnByaW50KHVuaXF1ZShQdXJyYmxlX01hc3Rlcl9XaWRlJGlkZW50aXR5X2dyb3VwKSkKCnBvc3RfdmFycyA8LSBjKCJQb3N0X0RFUlM4X1N1bSIsICJQb3N0X0dBRDdfU3VtIiwgIlBvc3RfUEhROV9TdW0iKQoKZm9yIChkdiBpbiBwb3N0X3ZhcnMpIHsKICBwcmVfdmFyIDwtIHN1YigiXlBvc3RfIiwgIlByZV8iLCBkdikKCiAgIyAtLS0gRml0IEFOQ09WQSBtb2RlbCB1c2luZyBudW1lcmljIGNvbmRpdGlvbl9udW0gKDA9V2FpdGxpc3QsIDE9UHVycmJsZSkgLS0tCiAgbW9kZWwgPC0gbG0ocmVmb3JtdWxhdGUoYygiY29uZGl0aW9uX251bSIsIHByZV92YXIsICJpZGVudGl0eV9ncm91cCIsICJhZ2UiKSwgZHYpLAogICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlKQoKICAjIC0tLSBFeHRyYWN0IHBhcmFtZXRlciBlc3RpbWF0ZXMgLS0tCiAgYmV0YV90YmwgPC0gYnJvb206OnRpZHkobW9kZWwsIGNvbmYuaW50ID0gVFJVRSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfnJvdW5kKC4sIDMpKSkgJT4lCiAgICBkcGx5cjo6c2VsZWN0KHRlcm0sIGVzdGltYXRlLCBjb25mLmxvdywgY29uZi5oaWdoLCBzdGQuZXJyb3IsIHN0YXRpc3RpYywgcC52YWx1ZSkKCiAgIyAtLS0gQ29tcHV0ZSBwYXJ0aWFsIM63wrIgd2l0aCA5NSUgQ0kgLS0tCiAgZXRhX3RibCA8LSBlZmZlY3RzaXplOjpldGFfc3F1YXJlZChtb2RlbCwgcGFydGlhbCA9IFRSVUUsIGNpID0gMC45NSkgJT4lCiAgICBkcGx5cjo6c2VsZWN0KFBhcmFtZXRlciwgRXRhMl9wYXJ0aWFsLCBDSV9sb3csIENJX2hpZ2gpICU+JQogICAgZHBseXI6Om11dGF0ZShhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIH5yb3VuZCguLCAzKSkpCgogICMgLS0tIE1lcmdlIM63wrIgcmVzdWx0cyBpbnRvIGNvZWZmaWNpZW50IHRhYmxlIC0tLQogIGJldGFfdGJsIDwtIGRwbHlyOjpsZWZ0X2pvaW4oYmV0YV90YmwsIGV0YV90YmwsIGJ5ID0gYygidGVybSIgPSAiUGFyYW1ldGVyIikpCgogICMgLS0tIFJlbmFtZSBjb2x1bW5zIGZvciByZWFkYWJpbGl0eSAtLS0KICBjb2xuYW1lcyhiZXRhX3RibCkgPC0gYygKICAgICJQcmVkaWN0b3IiLCAizrIiLCAiOTUlIENJIChMb3cpIiwgIjk1JSBDSSAoSGlnaCkiLAogICAgIlNFIiwgInQiLCAicCIsICJQYXJ0aWFsIM63wrIiLCAizrfCsiA5NSUgQ0kgKExvdykiLCAizrfCsiA5NSUgQ0kgKEhpZ2gpIgogICkKCiAgIyAtLS0gUHJpbnQgZm9ybWF0dGVkIEFQQS1zdHlsZSB0YWJsZSAtLS0KICBwcmludCgKICAgIGtuaXRyOjprYWJsZSgKICAgICAgYmV0YV90YmwsCiAgICAgIGNhcHRpb24gPSBwYXN0ZSgiUGFyYW1ldGVyIEVzdGltYXRlcyBmb3IiLCBkdiksCiAgICAgIGFsaWduID0gYygibCIsIHJlcCgiciIsIDkpKQogICAgKSAlPiUKICAgICAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImNlbnRlciIpCiAgKQp9CgpgYGAKCgoKIyMjIE91dGxpZXIgQ2hlY2s6IFJlLXJ1biB3aXRob3V0IFQ0MgoqKlJlc3VsdHMgVGV4dDoqKiBUaGUgcGF0dGVybiwgbWFnbml0dWRlLCBhbmQgc2lnbmlmaWNhbmNlIG9mIHJlc3VsdHMgd2VyZSB1bmNoYW5nZWQuIEFjY29yZGluZ2x5LCBhbGwgYW5hbHlzZXMgd2VyZSByZXBvcnRlZCB1c2luZyB0aGUgZnVsbCBzYW1wbGUuCgpNYWluIGVmZmVjdHMgd2l0aCBhZGp1c3RlZCBtZWFucyBwdXQgaW50byBvbmUgbmVhdCB0YWJsZSAKCkFkZGl0aW9uYWxseSwgcnVucyByZXN1bHRzIHdpdGggb3V0bGllciByZW1vdmVkIChwc2lkLVQ0MikKCmBgYHtyfQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZWZmZWN0c2l6ZSkKClB1cnJibGVfTWFzdGVyX1dpZGVfbm9UNDIgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBkcGx5cjo6ZmlsdGVyKHBzaWQgIT0gIlQ0MiIpCgpjYXQoImNvbmRpdGlvbl9udW0gbGV2ZWxzOlxuIikKcHJpbnQodW5pcXVlKFB1cnJibGVfTWFzdGVyX1dpZGVfbm9UNDIkY29uZGl0aW9uX251bSkpCgpjYXQoIlxuaWRlbnRpdHlfZ3JvdXAgbGV2ZWxzOlxuIikKcHJpbnQodW5pcXVlKFB1cnJibGVfTWFzdGVyX1dpZGVfbm9UNDIkaWRlbnRpdHlfZ3JvdXApKQoKcG9zdF92YXJzIDwtIGMoIlBvc3RfREVSUzhfU3VtIiwgIlBvc3RfR0FEN19TdW0iLCAiUG9zdF9QSFE5X1N1bSIpCgpmb3IgKGR2IGluIHBvc3RfdmFycykgewogIHByZV92YXIgPC0gc3ViKCJeUG9zdF8iLCAiUHJlXyIsIGR2KQoKICAjIC0tLSBGaXQgQU5DT1ZBIG1vZGVsIHVzaW5nIG51bWVyaWMgY29uZGl0aW9uX251bSAoMD1XYWl0bGlzdCwgMT1QdXJyYmxlKSAtLS0KICBtb2RlbCA8LSBsbShyZWZvcm11bGF0ZShjKCJjb25kaXRpb25fbnVtIiwgcHJlX3ZhciwgImlkZW50aXR5X2dyb3VwIiwgImFnZSIpLCBkdiksCiAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGVfbm9UNDIpCgogICMgLS0tIEV4dHJhY3QgcGFyYW1ldGVyIGVzdGltYXRlcyAtLS0KICBiZXRhX3RibCA8LSBicm9vbTo6dGlkeShtb2RlbCwgY29uZi5pbnQgPSBUUlVFKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+cm91bmQoLiwgMykpKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QodGVybSwgZXN0aW1hdGUsIGNvbmYubG93LCBjb25mLmhpZ2gsIHN0ZC5lcnJvciwgc3RhdGlzdGljLCBwLnZhbHVlKQoKICAjIC0tLSBDb21wdXRlIHBhcnRpYWwgzrfCsiB3aXRoIDk1JSBDSSAtLS0KICBldGFfdGJsIDwtIGVmZmVjdHNpemU6OmV0YV9zcXVhcmVkKG1vZGVsLCBwYXJ0aWFsID0gVFJVRSwgY2kgPSAwLjk1KSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoUGFyYW1ldGVyLCBFdGEyX3BhcnRpYWwsIENJX2xvdywgQ0lfaGlnaCkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfnJvdW5kKC4sIDMpKSkKCiAgIyAtLS0gTWVyZ2UgzrfCsiByZXN1bHRzIGludG8gY29lZmZpY2llbnQgdGFibGUgLS0tCiAgYmV0YV90YmwgPC0gZHBseXI6OmxlZnRfam9pbihiZXRhX3RibCwgZXRhX3RibCwgYnkgPSBjKCJ0ZXJtIiA9ICJQYXJhbWV0ZXIiKSkKCiAgIyAtLS0gUmVuYW1lIGNvbHVtbnMgZm9yIHJlYWRhYmlsaXR5IC0tLQogIGNvbG5hbWVzKGJldGFfdGJsKSA8LSBjKAogICAgIlByZWRpY3RvciIsICLOsiIsICI5NSUgQ0kgKExvdykiLCAiOTUlIENJIChIaWdoKSIsCiAgICAiU0UiLCAidCIsICJwIiwgIlBhcnRpYWwgzrfCsiIsICLOt8KyIDk1JSBDSSAoTG93KSIsICLOt8KyIDk1JSBDSSAoSGlnaCkiCiAgKQoKICAjIC0tLSBQcmludCBmb3JtYXR0ZWQgQVBBLXN0eWxlIHRhYmxlIC0tLQogIHByaW50KAogICAga25pdHI6OmthYmxlKAogICAgICBiZXRhX3RibCwKICAgICAgY2FwdGlvbiA9IHBhc3RlKCJQYXJhbWV0ZXIgRXN0aW1hdGVzIGZvciIsIGR2KSwKICAgICAgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgOSkpCiAgICApICU+JQogICAgICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSwgcG9zaXRpb24gPSAiY2VudGVyIikKICApCn0KCmBgYAoKCgoKCgoKCgpgYGB7cn0KbGlicmFyeShicm9vbSkKbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGVmZmVjdHNpemUpCgpwb3N0X3ZhcnMgPC0gYygiUG9zdF9ERVJTOF9TdW0iLCAiUG9zdF9HQUQ3X1N1bSIsICJQb3N0X1BIUTlfU3VtIikKCmZvciAoZHYgaW4gcG9zdF92YXJzKSB7CiAgcHJlX3ZhciA8LSBzdWIoIl5Qb3N0XyIsICJQcmVfIiwgZHYpCgogICMgLS0tIEZpdCBBTkNPVkEgbW9kZWwgKG5vIGludGVyYWN0aW9uIHRlcm0pIC0tLQogbW9kZWwgPC0gbG0ocmVmb3JtdWxhdGUoYygiY29uZGl0aW9uIiwgcHJlX3ZhciwgImlkZW50aXR5X2dyb3VwIiwgImFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZGl0aW9uOmlkZW50aXR5X2dyb3VwIiksIGR2KSwKICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKCiAgIyAtLS0gRXh0cmFjdCBwYXJhbWV0ZXIgZXN0aW1hdGVzICjOsiwgU0UsIHQsIHAsIENJKSAtLS0KICBiZXRhX3RibCA8LSBicm9vbTo6dGlkeShtb2RlbCwgY29uZi5pbnQgPSBUUlVFKSB8PgogICAgbXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfnJvdW5kKC4sIDMpKSkgfD4KICAgIHNlbGVjdCh0ZXJtLCBlc3RpbWF0ZSwgY29uZi5sb3csIGNvbmYuaGlnaCwgc3RkLmVycm9yLCBzdGF0aXN0aWMsIHAudmFsdWUpCgogICMgLS0tIENvbXB1dGUgcGFydGlhbCDOt8KyIGZvciBlYWNoIHByZWRpY3RvciAtLS0KICBldGFfdGJsIDwtIGVmZmVjdHNpemU6OmV0YV9zcXVhcmVkKG1vZGVsLCBwYXJ0aWFsID0gVFJVRSkgfD4KICAgIHNlbGVjdChQYXJhbWV0ZXIsIEV0YTJfcGFydGlhbCkgfD4KICAgIG11dGF0ZShFdGEyX3BhcnRpYWwgPSByb3VuZChFdGEyX3BhcnRpYWwsIDMpKQoKICAjIC0tLSBNZXJnZSBwYXJ0aWFsIM63wrIgaW50byB0aGUgcGFyYW1ldGVyIHRhYmxlIC0tLQogIGV0YV90YmwgPC0gZWZmZWN0c2l6ZTo6ZXRhX3NxdWFyZWQobW9kZWwsIHBhcnRpYWwgPSBUUlVFKSB8PgogIG11dGF0ZShQYXJhbWV0ZXIgPSBkcGx5cjo6cmVjb2RlKFBhcmFtZXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZGl0aW9uIiA9ICJjb25kaXRpb24xIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZGl0aW9uMSIgPSAiY29uZGl0aW9uMSIpKQogIAogIGJldGFfdGJsIDwtIGxlZnRfam9pbihiZXRhX3RibCwgZXRhX3RibCwgYnkgPSBjKCJ0ZXJtIiA9ICJQYXJhbWV0ZXIiKSkKCiAgIyAtLS0gUmVuYW1lIGNvbHVtbnMgZm9yIGNsYXJpdHkgLS0tCm5hbWVzKGJldGFfdGJsKSA8LSBjKCJQcmVkaWN0b3IiLCAizrIiLCAiOTUlIENJIChMb3cpIiwgIjk1JSBDSSAoSGlnaCkiLAogICAgICAgICAgICAgICAgICAgICAiU0UiLCAidCIsICJwIiwgIlBhcnRpYWwgzrfCsiIsICJDSSB1c2VkIiwgIs63wrIgOTUlIENJIChMb3cpIiwgIs63wrIgOTUlIENJIChIaWdoKSIpCgogICMgLS0tIFByaW50IGZvcm1hdHRlZCB0YWJsZSAtLS0KICBwcmludCgKICAgIGthYmxlKGJldGFfdGJsLAogICAgICAgICAgY2FwdGlvbiA9IHBhc3RlKCJQYXJhbWV0ZXIgRXN0aW1hdGVzIGZvciIsIGR2KSwKICAgICAgICAgIGFsaWduID0gYygibCIsIHJlcCgiciIsIDcpKSkgfD4KICAgICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImNlbnRlciIpCiAgKQp9CmBgYAoKCgoKCgoqKlJldmlld2VyJ3MgQ29tbWVudDoqKiBSZXBvcnQgZWZmZWN0IHNpemVzIHdpdGggOTUlIENJcyBmb3IgYWRqdXN0ZWQgbWVhbiBkaWZmZXJlbmNlcywgc3RhbmRhcmRpemVkIG1lYW4gZGlmZmVyZW5jZXMKCioqTXkgUmVzcG9uc2UgdG8gQ29tbWVudDoqKiAgCldlIHRoYW5rIHRoZSByZXZpZXdlciBmb3IgdGhpcyBoZWxwZnVsIHN1Z2dlc3Rpb24uIFdlIGhhdmUgbm93IGFkZGVkIGJvdGggdW5zdGFuZGFyZGl6ZWQgYW5kIHN0YW5kYXJkaXplZCBlZmZlY3Qgc2l6ZXMsIGVhY2ggcmVwb3J0ZWQgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFNwZWNpZmljYWxseSwgd2U6CgpDb21wdXRlZCBhZGp1c3RlZCBtZWFuIGRpZmZlcmVuY2VzICjOsikgYmV0d2VlbiB0aGUgUHVycmJsZSBhbmQgd2FpdGxpc3QgY29udHJvbCBjb25kaXRpb25zIHVzaW5nIGVzdGltYXRlZCBtYXJnaW5hbCBtZWFucyBmcm9tIHRoZSBBTkNPVkEgbW9kZWxzLCBhbG9uZyB3aXRoIHRoZWlyIDk1JSBDSXMuCgpDYWxjdWxhdGVkIHN0YW5kYXJkaXplZCBtZWFuIGRpZmZlcmVuY2VzIChDb2hlbuKAmXMgZCkgYW5kIGNvcnJlc3BvbmRpbmcgOTUlIENJcyB1c2luZyB0aGUgZW1tZWFuczo6ZWZmX3NpemUoKSBmdW5jdGlvbiwgYmFzZWQgb24gdGhlIG1vZGVsIHJlc2lkdWFsIHZhcmlhbmNlLgoKQWRkZWQgdGhlc2UgcmVzdWx0cyBpbiBhIG5ldyBzdW1tYXJ5IHRhYmxlIGZvbGxvd2luZyBlYWNoIEFOQ09WQSB0YWJsZSAoc2VlIFRhYmxlIFgpLgoKVGhpcyB0YWJsZSBub3cgcmVwb3J0cywgZm9yIGVhY2ggb3V0Y29tZSwgdGhlIGFkanVzdGVkIGdyb3VwIG1lYW5zLCBhZGp1c3RlZCBtZWFuIGRpZmZlcmVuY2Ugd2l0aCA5NSUgQ0ksIGFuZCBzdGFuZGFyZGl6ZWQgbWVhbiBkaWZmZXJlbmNlIChDb2hlbuKAmXMgZCkgd2l0aCA5NSUgQ0ksIGFzIHJlcXVlc3RlZC4KCmBgYHtyfQojIC0tLSBMb2FkIGxpYnJhcmllcyBzYWZlbHkgLS0tCmxpYnJhcnkoZW1tZWFucykKbGlicmFyeShlZmZlY3RzaXplKQoKIyAtLS0gRml0IHlvdXIgQU5DT1ZBIG1vZGVsIC0tLQptb2RlbCA8LSBsbShQb3N0X0RFUlM4X1N1bSB+IFByZV9ERVJTOF9TdW0gKyBjb25kaXRpb25fbnVtICsgaWRlbnRpdHlfZ3JvdXAgKyBhZ2UsCiAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlKQoKIyAtLS0gR2V0IGFkanVzdGVkIG1lYW5zIGZvciBlYWNoIGNvbmRpdGlvbiAtLS0KZW1tIDwtIGVtbWVhbnMobW9kZWwsIH4gY29uZGl0aW9uX251bSkKCiMgLS0tIENvbXB1dGUgdGhlIGFkanVzdGVkIG1lYW4gZGlmZmVyZW5jZSAoUHVycmJsZSDigJMgV2FpdGxpc3QpIC0tLQpjb250cmFzdF9vYmogPC0gY29udHJhc3QoZW1tLCBtZXRob2QgPSAicmV2cGFpcndpc2UiKQoKIyAtLS0gQ2FsY3VsYXRlIENvaGVu4oCZcyBkIGZvciB0aGF0IGRpZmZlcmVuY2Ugd2l0aCA5NSUgQ0kgLS0tCmRfcmVzdWx0IDwtIGVmZl9zaXplKAogIGNvbnRyYXN0X29iaiwKICBzaWdtYSA9IHNpZ21hKG1vZGVsKSwKICBlZGYgICA9IGRmLnJlc2lkdWFsKG1vZGVsKSwKICBtZXRob2QgPSAiY29oZW4iCikKCmRfcmVzdWx0CgpgYGAKCgpgYGB7cn0KCm9wdGlvbnMoY29udHJhc3RzID0gYygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKCnBvc3RfdmFycyA8LSBjKCJQb3N0X0RFUlM4X1N1bSIsICJQb3N0X0dBRDdfU3VtIiwgIlBvc3RfUEhROV9TdW0iKQoKbWFrZV9hbmNvdmFfdGFibGUgPC0gZnVuY3Rpb24ob3V0Y29tZSwgZGF0YSkgewogIHByZV92YXIgPC0gc3ViKCJeUG9zdF8iLCAiUHJlXyIsIG91dGNvbWUpCgogICMgLS0tIEZpdCBBTkNPVkEgbW9kZWwgLS0tCiAgbW9kZWwgPC0gbG0ocmVmb3JtdWxhdGUoYygiY29uZGl0aW9uIiwgcHJlX3ZhciwgImlkZW50aXR5X2dyb3VwIiwgImFnZSIpLCBvdXRjb21lKSwKICAgICAgICAgICAgICBkYXRhID0gZGF0YSkKCiAgIyAtLS0gVHlwZSBJSUkgQU5PVkEgLS0tCiAgYW92X3RibCA8LSBjYXI6OkFub3ZhKG1vZGVsLCB0eXBlID0gMykgfD4gYXMuZGF0YS5mcmFtZSgpCiAgYW92X3RibCRTb3VyY2UgPC0gcm93bmFtZXMoYW92X3RibCkKCiAgYW92X3RibCA8LSBhb3ZfdGJsIHw+CiAgICBtdXRhdGUoYE1lYW4gU3FgID0gYFN1bSBTcWAgLyBEZikgfD4KICAgIHJlbmFtZShgVHlwZSBJSUkgU3VtIG9mIFNxdWFyZXNgID0gYFN1bSBTcWAsCiAgICAgICAgICAgZGYgPSBEZiwKICAgICAgICAgICBGID0gYEYgdmFsdWVgLAogICAgICAgICAgIFNpZy4gPSBgUHIoPkYpYCkKCiAgIyBQYXJ0aWFsIGV0YSBzcXVhcmVkCiAgZXRhX3RibCA8LSBlZmZlY3RzaXplOjpldGFfc3F1YXJlZChtb2RlbCwgcGFydGlhbCA9IFRSVUUpIHw+CiAgICBzZWxlY3QoUGFyYW1ldGVyLCBFdGEyX3BhcnRpYWwpCgogIGFvdl90YmwgPC0gbGVmdF9qb2luKGFvdl90YmwsIGV0YV90YmwsIGJ5ID0gYygiU291cmNlIiA9ICJQYXJhbWV0ZXIiKSkgfD4KICAgIG11dGF0ZShhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIH5yb3VuZCguLCAzKSkpIHw+CiAgICByZW5hbWUoYFBhcnRpYWwgRXRhIFNxdWFyZWRgID0gRXRhMl9wYXJ0aWFsKSB8PgogICAgc2VsZWN0KFNvdXJjZSwgYFR5cGUgSUlJIFN1bSBvZiBTcXVhcmVzYCwgZGYsIGBNZWFuIFNxYCwgRiwgU2lnLiwgYFBhcnRpYWwgRXRhIFNxdWFyZWRgKQoKICAjIC0tLSBBZGp1c3RlZCBtZWFucyAtLS0KICBlbW0gPC0gZW1tZWFuczo6ZW1tZWFucyhtb2RlbCwgfiBjb25kaXRpb24pCiAgYWRqX21lYW5zIDwtIGFzLmRhdGEuZnJhbWUoZW1tKQogIGFkal9XTCA8LSByb3VuZChhZGpfbWVhbnMkZW1tZWFuW2Fkal9tZWFucyRjb25kaXRpb24gPT0gIldhaXRsaXN0IENvbnRyb2wiXSwgMikKICBhZGpfUEIgPC0gcm91bmQoYWRqX21lYW5zJGVtbWVhblthZGpfbWVhbnMkY29uZGl0aW9uID09ICJQdXJyYmxlIFRyZWF0bWVudCJdLCAyKQoKICAjIC0tLSBQYWlyd2lzZSBjb21wYXJpc29uIChQdXJyYmxlIC0gV2FpdGxpc3QpIC0tLQogIGNvbnRyYXN0X29iaiA8LSBjb250cmFzdChlbW0sIG1ldGhvZCA9ICJyZXZwYWlyd2lzZSIpCiAgZGlmZl9lbW0gPC0gc3VtbWFyeShjb25maW50KGNvbnRyYXN0X29iaikpIHw+IGFzLmRhdGEuZnJhbWUoKQogIGJldGEgPC0gcm91bmQoZGlmZl9lbW0kZXN0aW1hdGUsIDIpCiAgY2lfbG93IDwtIHJvdW5kKGRpZmZfZW1tJGxvd2VyLkNMLCAyKQogIGNpX2hpZ2ggPC0gcm91bmQoZGlmZl9lbW0kdXBwZXIuQ0wsIDIpCgogICMgLS0tIENvaGVuJ3MgZCB3aXRoIDk1JSBDSSB2aWEgZW1tZWFuczo6ZWZmX3NpemUgLS0tCiAgZF90YmwgPC0gZWZmX3NpemUoZW1tLCBzaWdtYSA9IHNpZ21hKG1vZGVsKSwgZWRmID0gZGYucmVzaWR1YWwobW9kZWwpKSB8PiBhcy5kYXRhLmZyYW1lKCkKICBkX3ZhbCA8LSByb3VuZChkX3RibCRlZmZlY3Quc2l6ZVsxXSwgMikKICBkX2xvdyA8LSByb3VuZChkX3RibCRsb3dlci5DTFsxXSwgMikKICBkX2hpZ2ggPC0gcm91bmQoZF90YmwkdXBwZXIuQ0xbMV0sIDIpCgogICMgLS0tIFN1bW1hcnkgdGFibGUgLS0tCiAgc3VtbWFyeV90YmwgPC0gdGliYmxlKAogICAgT3V0Y29tZSA9IG91dGNvbWUsCiAgICBBZGpNZWFuX1dMID0gYWRqX1dMLAogICAgQWRqTWVhbl9QQiA9IGFkal9QQiwKICAgIGBBZGouIE1lYW4gRGlmZiAozrIpYCA9IGJldGEsCiAgICBgOTUlIENJICjOsilgID0gcGFzdGUwKCJbIiwgY2lfbG93LCAiLCAiLCBjaV9oaWdoLCAiXSIpLAogICAgYENvaGVuJ3MgZGAgPSBkX3ZhbCwKICAgIGA5NSUgQ0kgKGQpYCA9IHBhc3RlMCgiWyIsIGRfbG93LCAiLCAiLCBkX2hpZ2gsICJdIikKICApCgogICMgLS0tIE91dHB1dCAtLS0KICBjYXQoIlxuXG4jIyMgVGVzdHMgb2YgQmV0d2Vlbi1TdWJqZWN0cyBFZmZlY3RzIGZvciIsIG91dGNvbWUsICJcbiIpCiAgcHJpbnQoCiAgICBrYWJsZSgKICAgICAgYW92X3RibCwKICAgICAgY2FwdGlvbiA9IHBhc3RlKCJBTkNPVkEgdGFibGUgZm9yIiwgb3V0Y29tZSksCiAgICAgIGFsaWduID0gYygibCIsIHJlcCgiciIsIG5jb2woYW92X3RibCkgLSAxKSksCiAgICAgIGRpZ2l0cyA9IDMKICAgICkgfD4ga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImNlbnRlciIpCiAgKQoKICBjYXQoIlxuXG4qKkFkanVzdGVkIE1lYW5zIGFuZCBFZmZlY3QgU2l6ZSBTdW1tYXJ5IGZvciIsIG91dGNvbWUsICIqKlxuIikKICBwcmludCgKICAgIGthYmxlKAogICAgICBzdW1tYXJ5X3RibCwKICAgICAgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgbmNvbChzdW1tYXJ5X3RibCkgLSAxKSksCiAgICAgIGRpZ2l0cyA9IDIKICAgICkgfD4ga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImNlbnRlciIpCiAgKQp9CgojIC0tLSBSdW4gYWNyb3NzIGFsbCBvdXRjb21lcyAtLS0KZm9yIChkdiBpbiBwb3N0X3ZhcnMpIHsKICBtYWtlX2FuY292YV90YWJsZShkdiwgUHVycmJsZV9NYXN0ZXJfV2lkZSkKfQoKYGBgCgoKIyMjIFJvYnVzdG5lc3MgQ2hlY2sgdXNpbmcgdGhlIEJlbmphbWluaeKAk0hvY2hiZXJnIChCSCkgRmFsc2UgRGlzY292ZXJ5IFJhdGUgKEZEUikgcHJvY2VkdXJlLgoKVGhpcyByb2J1c3RuZXNzIGNoZWNrIGFjY291bnRzIGZvciBtdWx0aXBsZSBzdGF0aXN0aWNhbCB0ZXN0cyBhY3Jvc3MgdGhlIHRocmVlIHByaW1hcnkgb3V0Y29tZXMgYnkgYXBwbHlpbmcgdGhlIEJlbmphbWluaeKAk0hvY2hiZXJnIHByb2NlZHVyZSwgd2hpY2ggY29udHJvbHMgdGhlIGZhbHNlIGRpc2NvdmVyeSByYXRlIChGRFIpLiBUaGlzIG1ldGhvZCBpcyBsZXNzIGNvbnNlcnZhdGl2ZSB0aGFuIEJvbmZlcnJvbmkgYW5kIGlzIGFwcHJvcHJpYXRlIHdoZW4gb3V0Y29tZXMgYXJlIGNvbmNlcHR1YWxseSByZWxhdGVkIGJ1dCBub3QgZnVsbHkgaW5kZXBlbmRlbnQuIEFsbCBwcmltYXJ5IG91dGNvbWUgZWZmZWN0cyByZW1haW4gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhZnRlciBjb3JyZWN0aW9uIChGRFIgcSA8IC4wNSksIHN1cHBvcnRpbmcgdGhlIHJvYnVzdG5lc3Mgb2YgdGhlIG1haW4gZmluZGluZ3MuCgpgYGB7cn0KcF9tYWluIDwtIGMoMC4wMDIsIDAuMDQ0LCAwLjAwMCkKcC5hZGp1c3QocF9tYWluLCBtZXRob2QgPSAiQkgiKQpgYGAKCgojIyMjIFJlbGlhYmxlIENoYW5nZSBJbmRpY2VzCgojIyMjIyBERVJTLTggCgpgYGB7cn0KCgojIHNwZWNpZnkgcmVsaWFiaWxpdHkKcmVsX0RFUlM4IDwtIDAuODcKCiMgY29tcHV0ZSBzdGFuZGFyZCBlcnJvciBvZiBkaWZmZXJlbmNlCnNkX3ByZSA8LSBzZChQdXJyYmxlX01hc3Rlcl9XaWRlJFByZV9ERVJTOF9TdW0sIG5hLnJtID0gVFJVRSkKU0VfZGlmZiA8LSBzZF9wcmUgKiBzcXJ0KDIgKiAoMSAtIHJlbF9ERVJTOCkpCgojIGNvbXB1dGUgUkNJIGZvciBlYWNoIHBhcnRpY2lwYW50ClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUoCiAgICBSQ0lfREVSUzggPSAoUHJlX0RFUlM4X1N1bSAtIFBvc3RfREVSUzhfU3VtKSAvIFNFX2RpZmYsICAjIG5lZ2F0aXZlIGNoYW5nZSA9IGltcHJvdmVtZW50CiAgICBSQ0lfREVSUzhfY2xhc3MgPSBjYXNlX3doZW4oCiAgICAgIFJDSV9ERVJTOCA+IDEuOTYgIH4gIlJlbGlhYmxlIGltcHJvdmVtZW50IiwKICAgICAgUkNJX0RFUlM4IDwgLTEuOTYgfiAiUmVsaWFibGUgZGV0ZXJpb3JhdGlvbiIsCiAgICAgIFRSVUUgICAgICAgICAgICAgIH4gIk5vIHJlbGlhYmxlIGNoYW5nZSIKICAgICkKICApCgojIHN1bW1hcml6ZSBieSBjb25kaXRpb24KUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZSgKICAgIG4gPSBuKCksCiAgICBpbXByb3ZlZCA9IHN1bShSQ0lfREVSUzhfY2xhc3MgPT0gIlJlbGlhYmxlIGltcHJvdmVtZW50IiwgbmEucm0gPSBUUlVFKSwKICAgIGRldGVyaW9yYXRlZCA9IHN1bShSQ0lfREVSUzhfY2xhc3MgPT0gIlJlbGlhYmxlIGRldGVyaW9yYXRpb24iLCBuYS5ybSA9IFRSVUUpLAogICAgcGN0X2ltcHJvdmVkID0gbWVhbihSQ0lfREVSUzhfY2xhc3MgPT0gIlJlbGlhYmxlIGltcHJvdmVtZW50IiwgbmEucm0gPSBUUlVFKSAqIDEwMAogICkKYGBgCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKTsgbGlicmFyeSh0aWJibGUpOyBsaWJyYXJ5KGZvcmNhdHMpOyBsaWJyYXJ5KFByb3BDSXMpCgojIC0tLSBoZWxwZXJzIC0tLQpyZF9uZXdjb21iZSA8LSBmdW5jdGlvbih4MSwgbjEsIHgyLCBuMikgewogIG91dCA8LSBQcm9wQ0lzOjpkaWZmc2NvcmVjaSh4MSwgbjEsIHgyLCBuMiwgY29uZi5sZXZlbCA9IDAuOTUpICMgTmV3Y29tYmUgc2NvcmUgQ0kKICBjKHJkID0gKHgxL24xIC0geDIvbjIpLCBsbyA9IG91dCRjb25mLmludFsxXSwgaGkgPSBvdXQkY29uZi5pbnRbMl0pCn0Kb3Jfd2FsZCA8LSBmdW5jdGlvbihhLCBiLCBjLCBkKSB7CiAgb3IgPC0gKGEqZCkvKGIqYykKICBzZSA8LSBzcXJ0KDEvYSArIDEvYiArIDEvYyArIDEvZCkKICB6ICA8LSBsb2cob3IpL3NlCiAgcCAgPC0gMipwbm9ybSgtYWJzKHopKQogIGxvIDwtIGV4cChsb2cob3IpIC0gMS45NipzZSk7IGhpIDwtIGV4cChsb2cob3IpICsgMS45NipzZSkKICBjKG9yID0gb3IsIGxvID0gbG8sIGhpID0gaGksIHAgPSBwKQp9Cm5udF9mcm9tX3JkIDwtIGZ1bmN0aW9uKHJkKSBpZmVsc2UocmQgPT0gMCwgTkEsIDEvYWJzKHJkKSkKCiMgLS0tIDEpIFJDSSBjbGFzc2lmeSBmb3IgREVSUy04IC0tLQpyZWxfREVSUzggPC0gMC44NwpzZF9wcmUgPC0gc2QoUHVycmJsZV9NYXN0ZXJfV2lkZSRQcmVfREVSUzhfU3VtLCBuYS5ybSA9IFRSVUUpClNFX2RpZmYgPC0gc2RfcHJlICogc3FydCgyICogKDEgLSByZWxfREVSUzgpKQoKUHVycmJsZV9NYXN0ZXJfV2lkZSA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIG11dGF0ZSgKICAgICMgcG9zaXRpdmUgeiA9IGltcHJvdmVtZW50IChQcmUgPiBQb3N0KQogICAgUkNJX0RFUlM4X3ogPSAoUHJlX0RFUlM4X1N1bSAtIFBvc3RfREVSUzhfU3VtKSAvIFNFX2RpZmYsCiAgICBSQ0lfREVSUzhfY2xhc3MgPSBjYXNlX3doZW4oCiAgICAgIFJDSV9ERVJTOF96ID49ICAxLjk2IH4gIlJlbGlhYmxlIGltcHJvdmVtZW50IiwKICAgICAgUkNJX0RFUlM4X3ogPD0gLTEuOTYgfiAiUmVsaWFibGUgZGVjbGluZSIsCiAgICAgIFRSVUUgICAgICAgICAgICAgICAgIH4gIk5vIHJlbGlhYmxlIGNoYW5nZSIKICAgICksCiAgICAjIG1hcCBjb25kaXRpb24gZmFjdG9yIHRvIGxhYmVscyB3aXRob3V0IGNoYW5naW5nIGl0cyB1bmRlcmx5aW5nIGNvZGluZyBlbHNld2hlcmUKICAgIGNvbmRpdGlvbl9sYmwgPSBmY3RfcmVjb2RlKGFzLmZhY3Rvcihjb25kaXRpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhaXRsaXN0IENvbnRyb2wiID0gIjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB1cnJibGUgVHJlYXRtZW50IiAgICAgICAgICA9ICIxIikKICApCgojIC0tLSAyKSBQZXItY29uZGl0aW9uIGNvdW50cyB0YWJsZSAobWF0Y2hlcyB5b3VyIG1hbnVzY3JpcHQgdGFibGUpIC0tLQpkZXJzX2NvdW50cyA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIGNvdW50KE91dGNvbWUgPSAiRW1vdGlvbiBSZWd1bGF0aW9uIiwgQ29uZGl0aW9uID0gY29uZGl0aW9uX2xibCwgUkNJX0RFUlM4X2NsYXNzKSAlPiUKICB0aWR5cjo6cGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFJDSV9ERVJTOF9jbGFzcywgdmFsdWVzX2Zyb20gPSBuLCB2YWx1ZXNfZmlsbCA9IDApICU+JQogIHJvd3dpc2UoKSAlPiUgbXV0YXRlKE4gPSBzdW0oY19hY3Jvc3MoYyhgUmVsaWFibGUgaW1wcm92ZW1lbnRgLGBSZWxpYWJsZSBkZWNsaW5lYCxgTm8gcmVsaWFibGUgY2hhbmdlYCkpKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSgKICAgIHJpX3BjdCA9IHNjYWxlczo6cGVyY2VudChgUmVsaWFibGUgaW1wcm92ZW1lbnRgL04sIGFjY3VyYWN5ID0gMC4xKSwKICAgIHJkX3BjdCA9IHNjYWxlczo6cGVyY2VudChgUmVsaWFibGUgZGVjbGluZWAvTiwgICAgIGFjY3VyYWN5ID0gMC4xKQogICkgJT4lCiAgZHBseXI6OnRyYW5zbXV0ZSgKICAgIE91dGNvbWUsIENvbmRpdGlvbiwgTiwKICAgIGBSZWxpYWJsZSBpbXByb3ZlbWVudGAgPSBgUmVsaWFibGUgaW1wcm92ZW1lbnRgLAogICAgYFJlbGlhYmxlIGRlY2xpbmVgICAgICA9IGBSZWxpYWJsZSBkZWNsaW5lYCwKICAgIGBSZWxpYWJsZSBpbXByb3ZlbWVudCAoJSlgID0gcmlfcGN0LAogICAgYFJlbGlhYmxlIGRlY2xpbmUgKCUpYCAgICAgPSByZF9wY3QKICApCgojIC0tLSAzKSAyw5cyIGNvbnRyYXN0czogzpRwcCwgT1IsIDk1JSBDSSwgcCwgTk5UIChpbXByb3ZlbWVudCArIGRlY2xpbmUpIC0tLQojIFB1bGwgY2VsbHMKaW1wX3BiIDwtIGRlcnNfY291bnRzICU+JSBmaWx0ZXIoQ29uZGl0aW9uID09ICJQdXJyYmxlIFRyZWF0bWVudCIpICU+JSBwdWxsKGBSZWxpYWJsZSBpbXByb3ZlbWVudGApCmltcF93bCA8LSBkZXJzX2NvdW50cyAlPiUgZmlsdGVyKENvbmRpdGlvbiA9PSAiV2FpdGxpc3QgQ29udHJvbCIpICU+JSBwdWxsKGBSZWxpYWJsZSBpbXByb3ZlbWVudGApCm5fcGIgICA8LSBkZXJzX2NvdW50cyAlPiUgZmlsdGVyKENvbmRpdGlvbiA9PSAiUHVycmJsZSBUcmVhdG1lbnQiKSAlPiUgcHVsbChOKQpuX3dsICAgPC0gZGVyc19jb3VudHMgJT4lIGZpbHRlcihDb25kaXRpb24gPT0gIldhaXRsaXN0IENvbnRyb2wiKSAlPiUgcHVsbChOKQoKZGVjX3BiIDwtIGRlcnNfY291bnRzICU+JSBmaWx0ZXIoQ29uZGl0aW9uID09ICJQdXJyYmxlIFRyZWF0bWVudCIpICU+JSBwdWxsKGBSZWxpYWJsZSBkZWNsaW5lYCkKZGVjX3dsIDwtIGRlcnNfY291bnRzICU+JSBmaWx0ZXIoQ29uZGl0aW9uID09ICJXYWl0bGlzdCBDb250cm9sIikgJT4lIHB1bGwoYFJlbGlhYmxlIGRlY2xpbmVgKQoKIyBJbXByb3ZlbWVudCBjb250cmFzdApyZF9pbXAgICA8LSByZF9uZXdjb21iZShpbXBfcGIsIG5fcGIsIGltcF93bCwgbl93bCkKb3JfaW1wICAgPC0gb3Jfd2FsZChpbXBfcGIsIG5fcGIgLSBpbXBfcGIsIGltcF93bCwgbl93bCAtIGltcF93bCkKbm50X2ltcCAgPC0gbm50X2Zyb21fcmQocmRfaW1wWyJyZCJdKQoKIyBEZWNsaW5lIGNvbnRyYXN0CnJkX2RlYyA8LSByZF9uZXdjb21iZShkZWNfcGIsIG5fcGIsIGRlY193bCwgbl93bCkKb3JfZGVjIDwtIG9yX3dhbGQoZGVjX3BiLCBuX3BiIC0gZGVjX3BiLCBkZWNfd2wsIG5fd2wgLSBkZWNfd2wpCgojIE5lYXQgc3VtbWFyeSB0aWJibGUgZm9yIHlvdXIgcmVzdWx0cyBzZWN0aW9uCmRlcnNfY3JjX3N1bW1hcnkgPC0gdGliYmxlOjp0aWJibGUoCiAgT3V0Y29tZSA9ICJFbW90aW9uIHJlZ3VsYXRpb24gKERFUlMtOCkiLAogIENvbnRyYXN0ID0gYygiUmVsaWFibGUgaW1wcm92ZW1lbnQiLCAiUmVsaWFibGUgZGVjbGluZSIpLAogIGDOlCAocHApYCA9IGMoMTAwKnJkX2ltcFsicmQiXSwgMTAwKnJkX2RlY1sicmQiXSksCiAgYDk1JSBDSSAozpQpYCA9IGMocGFzdGUwKCJbIiwgcm91bmQoMTAwKnJkX2ltcFsibG8iXSwxKSwgIiwgIiwgcm91bmQoMTAwKnJkX2ltcFsiaGkiXSwxKSwgIl0iKSwKICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiWyIsIHJvdW5kKDEwMCpyZF9kZWNbImxvIl0sMSksICIsICIsIHJvdW5kKDEwMCpyZF9kZWNbImhpIl0sMSksICJdIikpLAogIGBPUiAoOTUlIENJKWAgPSBjKAogICAgc3ByaW50ZigiJS4yZiBbJS4yZiwgJS4yZl0iLCBvcl9pbXBbIm9yIl0sIG9yX2ltcFsibG8iXSwgb3JfaW1wWyJoaSJdKSwKICAgIHNwcmludGYoIiUuMmYgWyUuMmYsICUuMmZdIiwgb3JfZGVjWyJvciJdLCBvcl9kZWNbImxvIl0sIG9yX2RlY1siaGkiXSkKICApLAogIGBwYCA9IGMob3JfaW1wWyJwIl0sIG9yX2RlY1sicCJdKSwKICBgTk5UIChpZiBpbXByb3ZlbWVudClgID0gYyhpZmVsc2UoaXMuZmluaXRlKG5udF9pbXApLCByb3VuZChubnRfaW1wKSwgTkEpLCBOQSkKKQpkZXJzX2NyY19zdW1tYXJ5CgpkZXJzX2NvdW50cyAlPiUgZHBseXI6OmRpc3RpbmN0KENvbmRpdGlvbikKZGVyc19jb3VudHMKYGBgCgoKIyMjIyMgR0FELTcgCgpgYGB7cn0KIyBzcGVjaWZ5IHJlbGlhYmlsaXR5CnJlbF9HQUQ3IDwtIDAuODcKCiMgY29tcHV0ZSBzdGFuZGFyZCBlcnJvciBvZiBkaWZmZXJlbmNlCnNkX3ByZSA8LSBzZChQdXJyYmxlX01hc3Rlcl9XaWRlJFByZV9HQUQ3X1N1bSwgbmEucm0gPSBUUlVFKQpTRV9kaWZmIDwtIHNkX3ByZSAqIHNxcnQoMiAqICgxIC0gcmVsX0dBRDcpKQoKIyBjb21wdXRlIFJDSSBmb3IgZWFjaCBwYXJ0aWNpcGFudApQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKAogICAgUkNJX0dBRDcgPSAoUHJlX0dBRDdfU3VtIC0gUG9zdF9HQUQ3X1N1bSkgLyBTRV9kaWZmLCAgIyBuZWdhdGl2ZSBjaGFuZ2UgPSBpbXByb3ZlbWVudAogICAgUkNJX0dBRDdfY2xhc3MgPSBjYXNlX3doZW4oCiAgICAgIFJDSV9HQUQ3ID4gMS45NiAgfiAiUmVsaWFibGUgaW1wcm92ZW1lbnQiLAogICAgICBSQ0lfR0FENyA8IC0xLjk2IH4gIlJlbGlhYmxlIGRldGVyaW9yYXRpb24iLAogICAgICBUUlVFICAgICAgICAgICAgICB+ICJObyByZWxpYWJsZSBjaGFuZ2UiCiAgICApCiAgKQoKIyBzdW1tYXJpemUgYnkgY29uZGl0aW9uClB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpc2UoCiAgICBuID0gbigpLAogICAgaW1wcm92ZWQgPSBzdW0oUkNJX0dBRDdfY2xhc3MgPT0gIlJlbGlhYmxlIGltcHJvdmVtZW50IiwgbmEucm0gPSBUUlVFKSwKICAgIGRldGVyaW9yYXRlZCA9IHN1bShSQ0lfR0FEN19jbGFzcyA9PSAiUmVsaWFibGUgZGV0ZXJpb3JhdGlvbiIsIG5hLnJtID0gVFJVRSksCiAgICBwY3RfaW1wcm92ZWQgPSBtZWFuKFJDSV9HQUQ3X2NsYXNzID09ICJSZWxpYWJsZSBpbXByb3ZlbWVudCIsIG5hLnJtID0gVFJVRSkgKiAxMDAKICApCmBgYAoKYGBge3J9CmxpYnJhcnkoZHBseXIpOyBsaWJyYXJ5KHRpYmJsZSk7IGxpYnJhcnkoZm9yY2F0cyk7IGxpYnJhcnkoUHJvcENJcyk7IGxpYnJhcnkodGlkeXIpCgojIC0tLSBoZWxwZXJzIChzYW1lIGFzIGJlZm9yZSkgLS0tCnJkX25ld2NvbWJlIDwtIGZ1bmN0aW9uKHgxLCBuMSwgeDIsIG4yKXsKICBvdXQgPC0gUHJvcENJczo6ZGlmZnNjb3JlY2koeDEsIG4xLCB4MiwgbjIsIGNvbmYubGV2ZWwgPSAwLjk1KQogIGMocmQgPSAoeDEvbjEgLSB4Mi9uMiksIGxvID0gb3V0JGNvbmYuaW50WzFdLCBoaSA9IG91dCRjb25mLmludFsyXSkKfQpvcl93YWxkIDwtIGZ1bmN0aW9uKGEsIGIsIGMsIGQpewogIG9yIDwtIChhKmQpLyhiKmMpOyBzZSA8LSBzcXJ0KDEvYSArIDEvYiArIDEvYyArIDEvZCkKICB6IDwtIGxvZyhvcikvc2U7IHAgPC0gMipwbm9ybSgtYWJzKHopKQogIGxvIDwtIGV4cChsb2cob3IpIC0gMS45NipzZSk7IGhpIDwtIGV4cChsb2cob3IpICsgMS45NipzZSkKICBjKG9yID0gb3IsIGxvID0gbG8sIGhpID0gaGksIHAgPSBwKQp9Cm5udF9mcm9tX3JkIDwtIGZ1bmN0aW9uKHJkKSBpZmVsc2UocmQgPT0gMCwgTkEsIDEvYWJzKHJkKSkKCiMgLS0tIDEpIFJDSSBjbGFzc2lmeSBmb3IgR0FELTcgLS0tCnJlbF9HQUQ3IDwtIDAuOTAgICAjIDwtLSBzZXQgdG8geW91ciBjaG9zZW4gcmVsaWFiaWxpdHkgKGUuZy4sIC44OeKAky45MikKc2RfcHJlIDwtIHNkKFB1cnJibGVfTWFzdGVyX1dpZGUkUHJlX0dBRDdfU3VtLCBuYS5ybSA9IFRSVUUpClNFX2RpZmYgPC0gc2RfcHJlICogc3FydCgyICogKDEgLSByZWxfR0FENykpCgpQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKAogICAgUkNJX0dBRDdfeiA9IChQcmVfR0FEN19TdW0gLSBQb3N0X0dBRDdfU3VtKSAvIFNFX2RpZmYsICAjIHBvc2l0aXZlID0gaW1wcm92ZW1lbnQKICAgIFJDSV9HQUQ3X2NsYXNzID0gY2FzZV93aGVuKAogICAgICBSQ0lfR0FEN196ID49ICAxLjk2IH4gIlJlbGlhYmxlIGltcHJvdmVtZW50IiwKICAgICAgUkNJX0dBRDdfeiA8PSAtMS45NiB+ICJSZWxpYWJsZSBkZWNsaW5lIiwKICAgICAgVFJVRSAgICAgICAgICAgICAgICB+ICJObyByZWxpYWJsZSBjaGFuZ2UiCiAgICApLAogICAgIyBrZWVwIHlvdXIgbWFudXNjcmlwdCBsYWJlbHMKICAgIGNvbmRpdGlvbl9sYmwgPSBmY3RfcmVjb2RlKGFzLmZhY3Rvcihjb25kaXRpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhaXRsaXN0IENvbnRyb2wiICAgPSAiMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHVycmJsZSBUcmVhdG1lbnQiICA9ICIxIikKICApCgojIC0tLSAyKSBQZXItY29uZGl0aW9uIGNvdW50cyB0YWJsZSAtLS0KZ2FkX2NvdW50cyA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIGNvdW50KE91dGNvbWUgPSAiQW54aWV0eSIsIENvbmRpdGlvbiA9IGNvbmRpdGlvbl9sYmwsIFJDSV9HQUQ3X2NsYXNzKSAlPiUKICB0aWR5cjo6cGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFJDSV9HQUQ3X2NsYXNzLCB2YWx1ZXNfZnJvbSA9IG4sIHZhbHVlc19maWxsID0gMCkgJT4lCiAgcm93d2lzZSgpICU+JQogIG11dGF0ZShOID0gc3VtKGNfYWNyb3NzKGMoYFJlbGlhYmxlIGltcHJvdmVtZW50YCxgUmVsaWFibGUgZGVjbGluZWAsYE5vIHJlbGlhYmxlIGNoYW5nZWApKSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoCiAgICByaV9wY3QgPSBzY2FsZXM6OnBlcmNlbnQoYFJlbGlhYmxlIGltcHJvdmVtZW50YC9OLCBhY2N1cmFjeSA9IDAuMSksCiAgICByZF9wY3QgPSBzY2FsZXM6OnBlcmNlbnQoYFJlbGlhYmxlIGRlY2xpbmVgL04sICAgICBhY2N1cmFjeSA9IDAuMSkKICApICU+JQogIGRwbHlyOjp0cmFuc211dGUoCiAgICBPdXRjb21lLCBDb25kaXRpb24sIE4sCiAgICBgUmVsaWFibGUgaW1wcm92ZW1lbnRgID0gYFJlbGlhYmxlIGltcHJvdmVtZW50YCwKICAgIGBSZWxpYWJsZSBkZWNsaW5lYCAgICAgPSBgUmVsaWFibGUgZGVjbGluZWAsCiAgICBgUmVsaWFibGUgaW1wcm92ZW1lbnQgKCUpYCA9IHJpX3BjdCwKICAgIGBSZWxpYWJsZSBkZWNsaW5lICglKWAgICAgID0gcmRfcGN0CiAgKQoKIyAtLS0gMykgMsOXMiBjb250cmFzdHM6IM6UcHAsIE9SLCA5NSUgQ0ksIHAsIE5OVCAoaW1wcm92ZW1lbnQgKyBkZWNsaW5lKSAtLS0KaW1wX3BiIDwtIGdhZF9jb3VudHMgJT4lIGZpbHRlcihDb25kaXRpb24gPT0gIlB1cnJibGUgVHJlYXRtZW50IikgJT4lIHB1bGwoYFJlbGlhYmxlIGltcHJvdmVtZW50YCkKaW1wX3dsIDwtIGdhZF9jb3VudHMgJT4lIGZpbHRlcihDb25kaXRpb24gPT0gIldhaXRsaXN0IENvbnRyb2wiKSAgICU+JSBwdWxsKGBSZWxpYWJsZSBpbXByb3ZlbWVudGApCm5fcGIgICA8LSBnYWRfY291bnRzICU+JSBmaWx0ZXIoQ29uZGl0aW9uID09ICJQdXJyYmxlIFRyZWF0bWVudCIpICU+JSBwdWxsKE4pCm5fd2wgICA8LSBnYWRfY291bnRzICU+JSBmaWx0ZXIoQ29uZGl0aW9uID09ICJXYWl0bGlzdCBDb250cm9sIikgICAlPiUgcHVsbChOKQoKZGVjX3BiIDwtIGdhZF9jb3VudHMgJT4lIGZpbHRlcihDb25kaXRpb24gPT0gIlB1cnJibGUgVHJlYXRtZW50IikgJT4lIHB1bGwoYFJlbGlhYmxlIGRlY2xpbmVgKQpkZWNfd2wgPC0gZ2FkX2NvdW50cyAlPiUgZmlsdGVyKENvbmRpdGlvbiA9PSAiV2FpdGxpc3QgQ29udHJvbCIpICAgJT4lIHB1bGwoYFJlbGlhYmxlIGRlY2xpbmVgKQoKIyBJbXByb3ZlbWVudCBjb250cmFzdApyZF9pbXAgIDwtIHJkX25ld2NvbWJlKGltcF9wYiwgbl9wYiwgaW1wX3dsLCBuX3dsKQpvcl9pbXAgIDwtIG9yX3dhbGQoaW1wX3BiLCBuX3BiIC0gaW1wX3BiLCBpbXBfd2wsIG5fd2wgLSBpbXBfd2wpCm5udF9pbXAgPC0gbm50X2Zyb21fcmQocmRfaW1wWyJyZCJdKQoKIyBEZWNsaW5lIGNvbnRyYXN0CnJkX2RlYyA8LSByZF9uZXdjb21iZShkZWNfcGIsIG5fcGIsIGRlY193bCwgbl93bCkKb3JfZGVjIDwtIG9yX3dhbGQoZGVjX3BiLCBuX3BiIC0gZGVjX3BiLCBkZWNfd2wsIG5fd2wgLSBkZWNfd2wpCgpnYWRfY3JjX3N1bW1hcnkgPC0gdGliYmxlKAogIE91dGNvbWUgID0gIkFueGlldHkgKEdBRC03KSIsCiAgQ29udHJhc3QgPSBjKCJSZWxpYWJsZSBpbXByb3ZlbWVudCIsIlJlbGlhYmxlIGRlY2xpbmUiKSwKICBgzpQgKHBwKWAgPSByb3VuZCgxMDAqYyhyZF9pbXBbInJkIl0sIHJkX2RlY1sicmQiXSksIDEpLAogIGA5NSUgQ0kgKM6UKWAgPSBjKAogICAgcGFzdGUwKCJbIiwgcm91bmQoMTAwKnJkX2ltcFsibG8iXSwxKSwgIiwgIiwgcm91bmQoMTAwKnJkX2ltcFsiaGkiXSwxKSwgIl0iKSwKICAgIHBhc3RlMCgiWyIsIHJvdW5kKDEwMCpyZF9kZWNbImxvIl0sMSksICIsICIsIHJvdW5kKDEwMCpyZF9kZWNbImhpIl0sMSksICJdIikKICApLAogIGBPUiAoOTUlIENJKWAgPSBjKAogICAgc3ByaW50ZigiJS4yZiBbJS4yZiwgJS4yZl0iLCBvcl9pbXBbIm9yIl0sIG9yX2ltcFsibG8iXSwgb3JfaW1wWyJoaSJdKSwKICAgIHNwcmludGYoIiUuMmYgWyUuMmYsICUuMmZdIiwgb3JfZGVjWyJvciJdLCBvcl9kZWNbImxvIl0sIG9yX2RlY1siaGkiXSkKICApLAogIHAgICA9IGMob3JfaW1wWyJwIl0sIG9yX2RlY1sicCJdKSwKICBOTlQgPSBjKGlmZWxzZShpcy5maW5pdGUobm50X2ltcCksIHJvdW5kKG5udF9pbXApLCBOQSksIE5BKQopCgojIGluc3BlY3QKZ2FkX2NvdW50cyAlPiUgZHBseXI6OmRpc3RpbmN0KENvbmRpdGlvbikKZ2FkX2NvdW50cwpnYWRfY3JjX3N1bW1hcnkKCmBgYAojIyMjIyBQSFEtOQpgYGB7cn0KIyBzcGVjaWZ5IHJlbGlhYmlsaXR5CnJlbF9QSFE5IDwtIDAuODYKCiMgY29tcHV0ZSBzdGFuZGFyZCBlcnJvciBvZiBkaWZmZXJlbmNlCnNkX3ByZSA8LSBzZChQdXJyYmxlX01hc3Rlcl9XaWRlJFByZV9QSFE5X1N1bSwgbmEucm0gPSBUUlVFKQpTRV9kaWZmIDwtIHNkX3ByZSAqIHNxcnQoMiAqICgxIC0gcmVsX1BIUTkpKQoKIyBjb21wdXRlIFJDSSBmb3IgZWFjaCBwYXJ0aWNpcGFudApQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKAogICAgUkNJX1BIUTkgPSAoUHJlX1BIUTlfU3VtIC0gUG9zdF9QSFE5X1N1bSkgLyBTRV9kaWZmLCAgIyBuZWdhdGl2ZSBjaGFuZ2UgPSBpbXByb3ZlbWVudAogICAgUkNJX1BIUTlfY2xhc3MgPSBjYXNlX3doZW4oCiAgICAgIFJDSV9QSFE5ID4gMS45NiAgfiAiUmVsaWFibGUgaW1wcm92ZW1lbnQiLAogICAgICBSQ0lfUEhROSA8IC0xLjk2IH4gIlJlbGlhYmxlIGRldGVyaW9yYXRpb24iLAogICAgICBUUlVFICAgICAgICAgICAgICB+ICJObyByZWxpYWJsZSBjaGFuZ2UiCiAgICApCiAgKQoKIyBzdW1tYXJpemUgYnkgY29uZGl0aW9uClB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpc2UoCiAgICBuID0gbigpLAogICAgaW1wcm92ZWQgPSBzdW0oUkNJX1BIUTlfY2xhc3MgPT0gIlJlbGlhYmxlIGltcHJvdmVtZW50IiwgbmEucm0gPSBUUlVFKSwKICAgIGRldGVyaW9yYXRlZCA9IHN1bShSQ0lfUEhROV9jbGFzcyA9PSAiUmVsaWFibGUgZGV0ZXJpb3JhdGlvbiIsIG5hLnJtID0gVFJVRSksCiAgICBwY3RfaW1wcm92ZWQgPSBtZWFuKFJDSV9QSFE5X2NsYXNzID09ICJSZWxpYWJsZSBpbXByb3ZlbWVudCIsIG5hLnJtID0gVFJVRSkgKiAxMDAKICApCgpgYGAKCmBgYHtyfQojIGFzc3VtZXMgbGlicmFyaWVzICsgaGVscGVycyAocmRfbmV3Y29tYmUsIG9yX3dhbGQsIG5udF9mcm9tX3JkKSBhcmUgYWxyZWFkeSBsb2FkZWQKCiMgLS0tIDEpIFJDSSBjbGFzc2lmeSBmb3IgUEhRLTkgLS0tCnJlbF9QSFE5IDwtIDAuODkgICMgc2V0IHRvIHlvdXIgY2hvc2VuIHJlbGlhYmlsaXR5CnNkX3ByZSA8LSBzZChQdXJyYmxlX01hc3Rlcl9XaWRlJFByZV9QSFE5X1N1bSwgbmEucm0gPSBUUlVFKQpTRV9kaWZmIDwtIHNkX3ByZSAqIHNxcnQoMiAqICgxIC0gcmVsX1BIUTkpKQoKUHVycmJsZV9NYXN0ZXJfV2lkZSA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIG11dGF0ZSgKICAgIFJDSV9QSFE5X3ogPSAoUHJlX1BIUTlfU3VtIC0gUG9zdF9QSFE5X1N1bSkgLyBTRV9kaWZmLCAgIyBwb3NpdGl2ZSA9IGltcHJvdmVtZW50CiAgICBSQ0lfUEhROV9jbGFzcyA9IGNhc2Vfd2hlbigKICAgICAgUkNJX1BIUTlfeiA+PSAgMS45NiB+ICJSZWxpYWJsZSBpbXByb3ZlbWVudCIsCiAgICAgIFJDSV9QSFE5X3ogPD0gLTEuOTYgfiAiUmVsaWFibGUgZGVjbGluZSIsCiAgICAgIFRSVUUgICAgICAgICAgICAgICAgfiAiTm8gcmVsaWFibGUgY2hhbmdlIgogICAgKSwKICAgICMga2VlcCBtYW51c2NyaXB0IGxhYmVscyBjb25zaXN0ZW50CiAgICBjb25kaXRpb25fbGJsID0gZm9yY2F0czo6ZmN0X3JlY29kZShhcy5mYWN0b3IoY29uZGl0aW9uKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYWl0bGlzdCBDb250cm9sIiAgID0gIjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB1cnJibGUgVHJlYXRtZW50IiAgPSAiMSIpCiAgKQoKIyAtLS0gMikgUGVyLWNvbmRpdGlvbiBjb3VudHMgdGFibGUgLS0tCnBocV9jb3VudHMgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBkcGx5cjo6Y291bnQoT3V0Y29tZSA9ICJEZXByZXNzaW9uIiwgQ29uZGl0aW9uID0gY29uZGl0aW9uX2xibCwgUkNJX1BIUTlfY2xhc3MpICU+JQogIHRpZHlyOjpwaXZvdF93aWRlcihuYW1lc19mcm9tID0gUkNJX1BIUTlfY2xhc3MsIHZhbHVlc19mcm9tID0gbiwgdmFsdWVzX2ZpbGwgPSAwKSAlPiUKICBkcGx5cjo6cm93d2lzZSgpICU+JQogIGRwbHlyOjptdXRhdGUoTiA9IHN1bShjX2Fjcm9zcyhjKGBSZWxpYWJsZSBpbXByb3ZlbWVudGAsYFJlbGlhYmxlIGRlY2xpbmVgLGBObyByZWxpYWJsZSBjaGFuZ2VgKSkpKSAlPiUKICBkcGx5cjo6dW5ncm91cCgpICU+JQogIGRwbHlyOjptdXRhdGUoCiAgICByaV9wY3QgPSBzY2FsZXM6OnBlcmNlbnQoYFJlbGlhYmxlIGltcHJvdmVtZW50YC9OLCBhY2N1cmFjeSA9IDAuMSksCiAgICByZF9wY3QgPSBzY2FsZXM6OnBlcmNlbnQoYFJlbGlhYmxlIGRlY2xpbmVgL04sICAgICBhY2N1cmFjeSA9IDAuMSkKICApICU+JQogIGRwbHlyOjp0cmFuc211dGUoCiAgICBPdXRjb21lLCBDb25kaXRpb24sIE4sCiAgICBgUmVsaWFibGUgaW1wcm92ZW1lbnRgID0gYFJlbGlhYmxlIGltcHJvdmVtZW50YCwKICAgIGBSZWxpYWJsZSBkZWNsaW5lYCAgICAgPSBgUmVsaWFibGUgZGVjbGluZWAsCiAgICBgUmVsaWFibGUgaW1wcm92ZW1lbnQgKCUpYCA9IHJpX3BjdCwKICAgIGBSZWxpYWJsZSBkZWNsaW5lICglKWAgICAgID0gcmRfcGN0CiAgKQoKIyAtLS0gMykgMsOXMiBjb250cmFzdHM6IM6UcHAsIE9SLCA5NSUgQ0ksIHAsIE5OVCAoaW1wcm92ZW1lbnQgKyBkZWNsaW5lKSAtLS0KaW1wX3BiIDwtIHBocV9jb3VudHMgJT4lIGRwbHlyOjpmaWx0ZXIoQ29uZGl0aW9uID09ICJQdXJyYmxlIFRyZWF0bWVudCIpICU+JSBkcGx5cjo6cHVsbChgUmVsaWFibGUgaW1wcm92ZW1lbnRgKQppbXBfd2wgPC0gcGhxX2NvdW50cyAlPiUgZHBseXI6OmZpbHRlcihDb25kaXRpb24gPT0gIldhaXRsaXN0IENvbnRyb2wiKSAgICU+JSBkcGx5cjo6cHVsbChgUmVsaWFibGUgaW1wcm92ZW1lbnRgKQpuX3BiICAgPC0gcGhxX2NvdW50cyAlPiUgZHBseXI6OmZpbHRlcihDb25kaXRpb24gPT0gIlB1cnJibGUgVHJlYXRtZW50IikgJT4lIGRwbHlyOjpwdWxsKE4pCm5fd2wgICA8LSBwaHFfY291bnRzICU+JSBkcGx5cjo6ZmlsdGVyKENvbmRpdGlvbiA9PSAiV2FpdGxpc3QgQ29udHJvbCIpICAgJT4lIGRwbHlyOjpwdWxsKE4pCgpkZWNfcGIgPC0gcGhxX2NvdW50cyAlPiUgZHBseXI6OmZpbHRlcihDb25kaXRpb24gPT0gIlB1cnJibGUgVHJlYXRtZW50IikgJT4lIGRwbHlyOjpwdWxsKGBSZWxpYWJsZSBkZWNsaW5lYCkKZGVjX3dsIDwtIHBocV9jb3VudHMgJT4lIGRwbHlyOjpmaWx0ZXIoQ29uZGl0aW9uID09ICJXYWl0bGlzdCBDb250cm9sIikgICAlPiUgZHBseXI6OnB1bGwoYFJlbGlhYmxlIGRlY2xpbmVgKQoKIyBJbXByb3ZlbWVudCBjb250cmFzdApyZF9pbXAgIDwtIHJkX25ld2NvbWJlKGltcF9wYiwgbl9wYiwgaW1wX3dsLCBuX3dsKQpvcl9pbXAgIDwtIG9yX3dhbGQoaW1wX3BiLCBuX3BiIC0gaW1wX3BiLCBpbXBfd2wsIG5fd2wgLSBpbXBfd2wpCm5udF9pbXAgPC0gbm50X2Zyb21fcmQocmRfaW1wWyJyZCJdKQoKIyBEZWNsaW5lIGNvbnRyYXN0CnJkX2RlYyA8LSByZF9uZXdjb21iZShkZWNfcGIsIG5fcGIsIGRlY193bCwgbl93bCkKb3JfZGVjIDwtIG9yX3dhbGQoZGVjX3BiLCBuX3BiIC0gZGVjX3BiLCBkZWNfd2wsIG5fd2wgLSBkZWNfd2wpCgpwaHFfY3JjX3N1bW1hcnkgPC0gdGliYmxlOjp0aWJibGUoCiAgT3V0Y29tZSAgPSAiRGVwcmVzc2lvbiAoUEhRLTkpIiwKICBDb250cmFzdCA9IGMoIlJlbGlhYmxlIGltcHJvdmVtZW50IiwiUmVsaWFibGUgZGVjbGluZSIpLAogIGDOlCAocHApYCA9IHJvdW5kKDEwMCpjKHJkX2ltcFsicmQiXSwgcmRfZGVjWyJyZCJdKSwgMSksCiAgYDk1JSBDSSAozpQpYCA9IGMoCiAgICBwYXN0ZTAoIlsiLCByb3VuZCgxMDAqcmRfaW1wWyJsbyJdLDEpLCAiLCAiLCByb3VuZCgxMDAqcmRfaW1wWyJoaSJdLDEpLCAiXSIpLAogICAgcGFzdGUwKCJbIiwgcm91bmQoMTAwKnJkX2RlY1sibG8iXSwxKSwgIiwgIiwgcm91bmQoMTAwKnJkX2RlY1siaGkiXSwxKSwgIl0iKQogICksCiAgYE9SICg5NSUgQ0kpYCA9IGMoCiAgICBzcHJpbnRmKCIlLjJmIFslLjJmLCAlLjJmXSIsIG9yX2ltcFsib3IiXSwgb3JfaW1wWyJsbyJdLCBvcl9pbXBbImhpIl0pLAogICAgc3ByaW50ZigiJS4yZiBbJS4yZiwgJS4yZl0iLCBvcl9kZWNbIm9yIl0sIG9yX2RlY1sibG8iXSwgb3JfZGVjWyJoaSJdKQogICksCiAgcCAgID0gYyhvcl9pbXBbInAiXSwgb3JfZGVjWyJwIl0pLAogIE5OVCA9IGMoaWZlbHNlKGlzLmZpbml0ZShubnRfaW1wKSwgcm91bmQobm50X2ltcCksIE5BKSwgTkEpCikKCiMgaW5zcGVjdApwaHFfY291bnRzICU+JSBkcGx5cjo6ZGlzdGluY3QoQ29uZGl0aW9uKQpwaHFfY291bnRzCnBocV9jcmNfc3VtbWFyeQoKYGBgCgojIyMjIyBIb3cgbWFueSBzaG93ZWQgcmVsaWFibGUgY2hhbmdlIG9uIGFsbCAzIG1lYXN1cmVzPyAKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQoKUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZSgKICAgIG4gPSBuKCksCiAgICBpbXByb3ZlZF9hbGwzID0gc3VtKAogICAgICBSQ0lfREVSUzhfY2xhc3MgPT0gIlJlbGlhYmxlIGltcHJvdmVtZW50IiAmCiAgICAgIFJDSV9HQUQ3X2NsYXNzICA9PSAiUmVsaWFibGUgaW1wcm92ZW1lbnQiICYKICAgICAgUkNJX1BIUTlfY2xhc3MgID09ICJSZWxpYWJsZSBpbXByb3ZlbWVudCIsCiAgICAgIG5hLnJtID0gVFJVRQogICAgKSwKICAgIHBjdF9pbXByb3ZlZF9hbGwzID0gaW1wcm92ZWRfYWxsMyAvIG4gKiAxMDAKICApCmBgYAoKCgoKCgoKCiMjIDIuMy4xIE1vZGVyYXRpb24gQW5hbHlzZXMKCmBgYHtyfQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZWZmZWN0c2l6ZSkKCiMgLS0tIFF1aWNrIGNoZWNrIG9mIGNvZGluZyAtLS0KY2F0KCJjb25kaXRpb25fbnVtIGxldmVsczpcbiIpCnByaW50KHVuaXF1ZShQdXJyYmxlX01hc3Rlcl9XaWRlJGNvbmRpdGlvbl9udW0pKQoKY2F0KCJcbmlkZW50aXR5X2dyb3VwIGxldmVsczpcbiIpCnByaW50KHVuaXF1ZShQdXJyYmxlX01hc3Rlcl9XaWRlJGlkZW50aXR5X2dyb3VwKSkKCiMgLS0tIE91dGNvbWVzIC0tLQpwb3N0X3ZhcnMgPC0gYygiUG9zdF9ERVJTOF9TdW0iLCAiUG9zdF9HQUQ3X1N1bSIsICJQb3N0X1BIUTlfU3VtIikKCmZvciAoZHYgaW4gcG9zdF92YXJzKSB7CiAgcHJlX3ZhciA8LSBzdWIoIl5Qb3N0XyIsICJQcmVfIiwgZHYpCgogICMgLS0tIEZpdCBBTkNPVkEgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbiAoMCA9IFdhaXRsaXN0LCAxID0gUHVycmJsZSkgLS0tCiAgbW9kZWwgPC0gbG0ocmVmb3JtdWxhdGUoCiAgICBjKCJjb25kaXRpb25fbnVtIiwgcHJlX3ZhciwgImlkZW50aXR5X2dyb3VwIiwgImFnZSIsICJjb25kaXRpb25fbnVtOmlkZW50aXR5X2dyb3VwIiksCiAgICBkdgogICksIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlKQoKICAjIC0tLSBFeHRyYWN0IHBhcmFtZXRlciBlc3RpbWF0ZXMgLS0tCiAgYmV0YV90YmwgPC0gYnJvb206OnRpZHkobW9kZWwsIGNvbmYuaW50ID0gVFJVRSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfiByb3VuZCguLCAzKSkpICU+JQogICAgZHBseXI6OnNlbGVjdCh0ZXJtLCBlc3RpbWF0ZSwgY29uZi5sb3csIGNvbmYuaGlnaCwgc3RkLmVycm9yLCBzdGF0aXN0aWMsIHAudmFsdWUpCgogICMgLS0tIENvbXB1dGUgcGFydGlhbCDOt8KyIHdpdGggOTUlIENJIC0tLQogIGV0YV90YmwgPC0gZWZmZWN0c2l6ZTo6ZXRhX3NxdWFyZWQobW9kZWwsIHBhcnRpYWwgPSBUUlVFLCBjaSA9IDAuOTUpICU+JQogICAgZHBseXI6OnNlbGVjdChQYXJhbWV0ZXIsIEV0YTJfcGFydGlhbCwgQ0lfbG93LCBDSV9oaWdoKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+IHJvdW5kKC4sIDMpKSkKCiAgIyAtLS0gTWVyZ2UgzrfCsiByZXN1bHRzIGludG8gY29lZmZpY2llbnQgdGFibGUgLS0tCiAgYmV0YV90YmwgPC0gZHBseXI6OmxlZnRfam9pbihiZXRhX3RibCwgZXRhX3RibCwgYnkgPSBjKCJ0ZXJtIiA9ICJQYXJhbWV0ZXIiKSkKCiAgIyAtLS0gUmVuYW1lIGNvbHVtbnMgZm9yIHJlYWRhYmlsaXR5IC0tLQogIGNvbG5hbWVzKGJldGFfdGJsKSA8LSBjKAogICAgIlByZWRpY3RvciIsICLOsiIsICI5NSUgQ0kgKExvdykiLCAiOTUlIENJIChIaWdoKSIsCiAgICAiU0UiLCAidCIsICJwIiwgIlBhcnRpYWwgzrfCsiIsICLOt8KyIDk1JSBDSSAoTG93KSIsICLOt8KyIDk1JSBDSSAoSGlnaCkiCiAgKQoKICAjIC0tLSBQcmludCBmb3JtYXR0ZWQgQVBBLXN0eWxlIHRhYmxlIC0tLQogIHByaW50KAogICAga25pdHI6OmthYmxlKAogICAgICBiZXRhX3RibCwKICAgICAgY2FwdGlvbiA9IHBhc3RlKCJQYXJhbWV0ZXIgRXN0aW1hdGVzIGZvciIsIGR2KSwKICAgICAgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgOSkpCiAgICApICU+JQogICAgICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSwgcG9zaXRpb24gPSAiY2VudGVyIikKICApCn0KCmBgYAoKCmBgYHtyfQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZWZmZWN0c2l6ZSkKCmNhdCgiY29uZGl0aW9uX251bSBsZXZlbHM6XG4iKQpwcmludCh1bmlxdWUoUHVycmJsZV9NYXN0ZXJfV2lkZSRjb25kaXRpb25fbnVtKSkKCmNhdCgiXG5pZGVudGl0eV9ncm91cCBsZXZlbHM6XG4iKQpwcmludCh1bmlxdWUoUHVycmJsZV9NYXN0ZXJfV2lkZSRpZGVudGl0eV9ncm91cCkpCgpwb3N0X3ZhcnMgPC0gYygiUG9zdF9ERVJTOF9TdW0iLCAiUG9zdF9HQUQ3X1N1bSIsICJQb3N0X1BIUTlfU3VtIikKCmZvciAoZHYgaW4gcG9zdF92YXJzKSB7CiAgcHJlX3ZhciA8LSBzdWIoIl5Qb3N0XyIsICJQcmVfIiwgZHYpCgogICMgLS0tIEZpdCBBTkNPVkEgbW9kZWwgdXNpbmcgbnVtZXJpYyBjb25kaXRpb25fbnVtICgwPVdhaXRsaXN0LCAxPVB1cnJibGUpIC0tLQogIG1vZGVsIDwtIGxtKHJlZm9ybXVsYXRlKGMoImNvbmRpdGlvbl9udW0iLCBwcmVfdmFyLCAiaWRlbnRpdHlfZ3JvdXAiLCAiYWdlIiwgImNvbmRpdGlvbl9udW06aWRlbnRpdHlfZ3JvdXAiKSwgZHYpLAogICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlKQoKICAjIC0tLSBFeHRyYWN0IHBhcmFtZXRlciBlc3RpbWF0ZXMgLS0tCiAgYmV0YV90YmwgPC0gYnJvb206OnRpZHkobW9kZWwsIGNvbmYuaW50ID0gVFJVRSkgJT4lCiAgICBkcGx5cjo6bXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfnJvdW5kKC4sIDMpKSkgJT4lCiAgICBkcGx5cjo6c2VsZWN0KHRlcm0sIGVzdGltYXRlLCBjb25mLmxvdywgY29uZi5oaWdoLCBzdGQuZXJyb3IsIHN0YXRpc3RpYywgcC52YWx1ZSkKCiAgIyAtLS0gQ29tcHV0ZSBwYXJ0aWFsIM63wrIgd2l0aCA5NSUgQ0kgLS0tCiAgZXRhX3RibCA8LSBlZmZlY3RzaXplOjpldGFfc3F1YXJlZChtb2RlbCwgcGFydGlhbCA9IFRSVUUsIGNpID0gMC45NSkgJT4lCiAgICBkcGx5cjo6c2VsZWN0KFBhcmFtZXRlciwgRXRhMl9wYXJ0aWFsLCBDSV9sb3csIENJX2hpZ2gpICU+JQogICAgZHBseXI6Om11dGF0ZShhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIH5yb3VuZCguLCAzKSkpCgogICMgLS0tIE1lcmdlIM63wrIgcmVzdWx0cyBpbnRvIGNvZWZmaWNpZW50IHRhYmxlIC0tLQogIGJldGFfdGJsIDwtIGRwbHlyOjpsZWZ0X2pvaW4oYmV0YV90YmwsIGV0YV90YmwsIGJ5ID0gYygidGVybSIgPSAiUGFyYW1ldGVyIikpCgogICMgLS0tIFJlbmFtZSBjb2x1bW5zIGZvciByZWFkYWJpbGl0eSAtLS0KICBjb2xuYW1lcyhiZXRhX3RibCkgPC0gYygKICAgICJQcmVkaWN0b3IiLCAizrIiLCAiOTUlIENJIChMb3cpIiwgIjk1JSBDSSAoSGlnaCkiLAogICAgIlNFIiwgInQiLCAicCIsICJQYXJ0aWFsIM63wrIiLCAizrfCsiA5NSUgQ0kgKExvdykiLCAizrfCsiA5NSUgQ0kgKEhpZ2gpIgogICkKCiAgIyAtLS0gUHJpbnQgZm9ybWF0dGVkIEFQQS1zdHlsZSB0YWJsZSAtLS0KICBwcmludCgKICAgIGtuaXRyOjprYWJsZSgKICAgICAgYmV0YV90YmwsCiAgICAgIGNhcHRpb24gPSBwYXN0ZSgiUGFyYW1ldGVyIEVzdGltYXRlcyBmb3IiLCBkdiksCiAgICAgIGFsaWduID0gYygibCIsIHJlcCgiciIsIDkpKQogICAgKSAlPiUKICAgICAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImNlbnRlciIpCiAgKQp9CgpgYGAKCgoKCgoKIyMjIyBTaW1wbGUgU2xvcGVzIGZvciBERVJTCgpgYGB7cn0KbGlicmFyeShpbnRlcmFjdGlvbnMpCgptb2RfZGVycyA8LSBsbShQb3N0X0RFUlM4X1N1bSB+IFByZV9ERVJTOF9TdW0gKyBhZ2UgKyBjb25kaXRpb25fbnVtICogaWRlbnRpdHlfZ3JvdXAsCiAgICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlKQoKc2ltX3Nsb3Blcyhtb2RfZGVycywgcHJlZCA9IGNvbmRpdGlvbl9udW0sIG1vZHggPSBpZGVudGl0eV9ncm91cCkKCmludGVyYWN0X3Bsb3QobW9kX2RlcnMsCiAgICAgICAgICAgICAgcHJlZCA9IGNvbmRpdGlvbl9udW0sCiAgICAgICAgICAgICAgbW9keCA9IGlkZW50aXR5X2dyb3VwLAogICAgICAgICAgICAgIHBsb3QucG9pbnRzID0gVFJVRSwKICAgICAgICAgICAgICBpbnRlcnZhbCA9IFRSVUUsCiAgICAgICAgICAgICAgbW9keC5sYWJlbHMgPSBjKCJDaXNnZW5kZXIiLCAiVHJhbnNnZW5kZXIgYW5kIEdlbmRlciBEaXZlcnNlIiksCiAgICAgICAgICAgICAgcHJlZC5sYWJlbHMgPSBjKCJXYWl0bGlzdCIsICJQdXJyYmxlIiksCiAgICAgICAgICAgICAgeC5sYWJlbCA9ICJDb25kaXRpb24iLAogICAgICAgICAgICAgIHkubGFiZWwgPSAiUG9zdCBERVJTLTggKEFkai4gZm9yIFByZSBhbmQgQWdlKSIsCiAgICAgICAgICAgICAgbWFpbi50aXRsZSA9ICJDb25kaXRpb24gw5cgR2VuZGVyIElkZW50aXR5IEludGVyYWN0aW9uIChERVJTLTgpIiwKICAgICAgICAgICAgICBjb2xvcnMgPSAiUXVhbDIiKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkKCmVtbWVhbnMobW9kX2RlcnMsIH4gY29uZGl0aW9uX251bSAqIGlkZW50aXR5X2dyb3VwLCBjb3YucmVkdWNlID0gbWVhbikKYGBgCgoKCiMjIyMgU2ltcGxlIFNsb3BlcyBmb3IgR0FECgpgYGB7cn0KbGlicmFyeShpbnRlcmFjdGlvbnMpCgptb2RfZ2FkIDwtIGxtKFBvc3RfR0FEN19TdW0gfiBQcmVfR0FEN19TdW0gKyBhZ2UgKyBjb25kaXRpb25fbnVtICogaWRlbnRpdHlfZ3JvdXAsCiAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUpCgojIEdBRCBtb2RlcmF0aW9uCnNpbV9zbG9wZXMobW9kX2dhZCwgcHJlZCA9IGNvbmRpdGlvbl9udW0sIG1vZHggPSBpZGVudGl0eV9ncm91cCkKCmludGVyYWN0X3Bsb3QobW9kX2dhZCwKICAgICAgICAgICAgICBwcmVkID0gY29uZGl0aW9uX251bSwKICAgICAgICAgICAgICBtb2R4ID0gaWRlbnRpdHlfZ3JvdXAsCiAgICAgICAgICAgICAgcGxvdC5wb2ludHMgPSBUUlVFLAogICAgICAgICAgICAgIGludGVydmFsID0gVFJVRSwKICAgICAgICAgICAgICBtb2R4LmxhYmVscyA9IGMoIkNpc2dlbmRlciIsICJUcmFuc2dlbmRlciBhbmQgR2VuZGVyIERpdmVyc2UiKSwKICAgICAgICAgICAgICBwcmVkLmxhYmVscyA9IGMoIldhaXRsaXN0IiwgIlB1cnJibGUiKSwKICAgICAgICAgICAgICB4LmxhYmVsID0gIkNvbmRpdGlvbiIsCiAgICAgICAgICAgICAgeS5sYWJlbCA9ICJQb3N0IEdBRC03IChBZGouIGZvciBQcmUgYW5kIEFnZSkiLAogICAgICAgICAgICAgIG1haW4udGl0bGUgPSAiQ29uZGl0aW9uIMOXIEdlbmRlciBJZGVudGl0eSBJbnRlcmFjdGlvbiAoR0FELTcpIiwKICAgICAgICAgICAgICBjb2xvcnMgPSAiUXVhbDIiKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxNCkKCmVtbWVhbnMobW9kX2dhZCwgfiBjb25kaXRpb25fbnVtICogaWRlbnRpdHlfZ3JvdXAsIGNvdi5yZWR1Y2UgPSBtZWFuKQoKYGBgCgoKCgoKCmBgYHtyfQoKb3B0aW9ucyhjb250cmFzdHMgPSBjKCJjb250ci5zdW0iLCAiY29udHIucG9seSIpKQoKIyBGaXQgbW9kZXJhdGlvbiBtb2RlbCBmb3IgREVSUy04Cm1vZF9ERVJTOCA8LSBsbShQb3N0X0RFUlM4X1N1bSB+IGNvbmRpdGlvbl9udW0gKiBpZGVudGl0eV9ncm91cF9udW0gKyBQcmVfREVSUzhfU3VtLAogICAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUpCgojIC0tLSBFeHRyYWN0IHJlc3VsdHMgLS0tCgojIDEuIENvZWZmaWNpZW50cyAozrIgYW5kIDk1JSBDSSkKdGlkeV9tb2QgPC0gYnJvb206OnRpZHkobW9kX0RFUlM4LCBjb25mLmludCA9IFRSVUUpCgojIDIuIFR5cGUgSUlJIEFOT1ZBIGZvciBGIC8gcAphb3ZfdGFiIDwtIGNhcjo6QW5vdmEobW9kX0RFUlM4LCB0eXBlID0gMykKCiMgMy4gUGFydGlhbCDOt8KyIHdpdGggOTUlIENJCmV0YV90YWIgPC0gZWZmZWN0c2l6ZTo6ZXRhX3NxdWFyZWQobW9kX0RFUlM4LCBwYXJ0aWFsID0gVFJVRSwgY2kgPSAwLjk1KQoKIyAtLS0gQnVpbGQgdGlkeSBzdW1tYXJ5IHRhYmxlIGZvciBDb25kaXRpb24gYW5kIEludGVyYWN0aW9uIC0tLQoKcHVsbF9lZmZlY3QgPC0gZnVuY3Rpb24odGVybV9sYWJlbCwgcHJldHR5X25hbWUpIHsKICBiZXRhX3JvdyA8LSB0aWR5X21vZCAlPiUgZHBseXI6OmZpbHRlcih0ZXJtID09IHRlcm1fbGFiZWwpCiAgYW92X3JvdyAgPC0gYW92X3RhYlt0ZXJtX2xhYmVsLCBdCiAgZXRhX3JvdyAgPC0gZXRhX3RhYiAlPiUgZHBseXI6OmZpbHRlcihQYXJhbWV0ZXIgPT0gdGVybV9sYWJlbCkKICAKICB0aWJibGU6OnRpYmJsZSgKICAgIEVmZmVjdCAgPSBwcmV0dHlfbmFtZSwKICAgIEJldGEgICAgPSByb3VuZChiZXRhX3JvdyRlc3RpbWF0ZSwgMiksCiAgICBgOTUlIENJICjOsilgID0gc3ByaW50ZigiWyUuMmYsICUuMmZdIiwgYmV0YV9yb3ckY29uZi5sb3csIGJldGFfcm93JGNvbmYuaGlnaCksCiAgICBGICAgICAgID0gcm91bmQoYXMubnVtZXJpYyhhb3Zfcm93W1siRiB2YWx1ZSJdXSksIDIpLAogICAgZGYgICAgICA9IHBhc3RlMChhb3Zfcm93W1siRGYiXV0sICIsICIsIGRmLnJlc2lkdWFsKG1vZF9ERVJTOCkpLAogICAgcCAgICAgICA9IGZvcm1hdEMoYXMubnVtZXJpYyhhb3Zfcm93W1siUHIoPkYpIl1dKSwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAzKSwKICAgIGDOt8Ky4oKaYCAgID0gcm91bmQoZXRhX3JvdyRFdGEyX3BhcnRpYWwsIDMpLAogICAgYDk1JSBDSSAozrfCsuKCmilgID0gc3ByaW50ZigiWyUuM2YsICUuM2ZdIiwgZXRhX3JvdyRDSV9sb3csIGV0YV9yb3ckQ0lfaGlnaCkKICApCn0KCnJlc3VsdHNfREVSUzggPC0gZHBseXI6OmJpbmRfcm93cygKICBwdWxsX2VmZmVjdCgiY29uZGl0aW9uX251bSIsICJDb25kaXRpb24gKG1haW4pIiksCiAgcHVsbF9lZmZlY3QoImNvbmRpdGlvbl9udW06aWRlbnRpdHlfZ3JvdXBfbnVtIiwgIkNvbmRpdGlvbiDDlyBHZW5kZXIiKQopCgojIC0tLSBQcmludCBBUEEtc3R5bGUgdGFibGUgLS0tCmthYmxlKAogIHJlc3VsdHNfREVSUzgsCiAgY2FwdGlvbiA9ICJNb2RlcmF0aW9uIEFOQ09WQSBmb3IgREVSUy04IChDb25kaXRpb24gw5cgR2VuZGVyIElkZW50aXR5LCBjb250cm9sbGluZyBmb3IgUHJlLURFUlMtOCkiCikgfD4KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKYGBgCgoKCgoKCgpgYGB7cn0KIyBNb2RlcmF0aW9uIEFuYWx5c2VzOiBDb25kaXRpb24gw5cgR2VuZGVyIElkZW50aXR5IChpZGVudGl0eV9ncm91cF9udW0pCm9wdGlvbnMoY29udHJhc3RzID0gYygiY29udHIuc3VtIiwgImNvbnRyLnBvbHkiKSkKCmZpdF9tb2RlcmF0aW9uIDwtIGZ1bmN0aW9uKG91dGNvbWUsIGRhdGEpIHsKICBwcmVfdmFyIDwtIHN1YigiXlBvc3RfIiwgIlByZV8iLCBvdXRjb21lKQogIAogIG1vZCA8LSBsbShyZWZvcm11bGF0ZSgKICAgIGMoImNvbmRpdGlvbl9udW0iLCAiaWRlbnRpdHlfZ3JvdXBfbnVtIiwgCiAgICAgICJjb25kaXRpb25fbnVtOmlkZW50aXR5X2dyb3VwX251bSIsIHByZV92YXIsICJhZ2UiKSwgCiAgICBvdXRjb21lKSwKICAgIGRhdGEgPSBkYXRhCiAgKQogIAogICMgQWRqdXN0ZWQgbWVhbnMgZm9yIGVhY2ggY29uZGl0aW9uIMOXIGdlbmRlciBjb21iaW5hdGlvbgogIGVtbSA8LSBlbW1lYW5zKG1vZCwgfiBjb25kaXRpb25fbnVtICogaWRlbnRpdHlfZ3JvdXBfbnVtKSB8PiBhcy5kYXRhLmZyYW1lKCkKICAKICAjIEV4dHJhY3QgaW50ZXJhY3Rpb24gZWZmZWN0IChDb25kaXRpb24gw5cgR2VuZGVyKQogIGludGVyX3JvdyA8LSBicm9vbTo6dGlkeShtb2QsIGNvbmYuaW50ID0gVFJVRSkgfD4gCiAgICBmaWx0ZXIodGVybSA9PSAiY29uZGl0aW9uX251bTppZGVudGl0eV9ncm91cF9udW0iKQogIAogIGJldGFfaW50IDwtIGludGVyX3JvdyRlc3RpbWF0ZQogIGNpX2ludCAgIDwtIHNwcmludGYoIlslLjJmLCAlLjJmXSIsIGludGVyX3JvdyRjb25mLmxvdywgaW50ZXJfcm93JGNvbmYuaGlnaCkKICBwX2ludCAgICA8LSBpbnRlcl9yb3ckcC52YWx1ZQogIAogICMgRi10ZXN0IGZvciBpbnRlcmFjdGlvbgogIGFvdl9yb3cgPC0gY2FyOjpBbm92YShtb2QsIHR5cGUgPSAzKVsiY29uZGl0aW9uX251bTppZGVudGl0eV9ncm91cF9udW0iLCBdCiAgRl92YWwgICA8LSBhcy5udW1lcmljKGFvdl9yb3ckYEYgdmFsdWVgKQogIHBfdmFsICAgPC0gYXMubnVtZXJpYyhhb3Zfcm93JGBQcig+RilgKQogIAogICMgUGFydGlhbCDOt8KyIGZvciBpbnRlcmFjdGlvbgogIGV0YV9yb3cgPC0gZWZmZWN0c2l6ZTo6ZXRhX3NxdWFyZWQobW9kLCBwYXJ0aWFsID0gVFJVRSwgY2kgPSAwLjk1KSB8PgogICAgZmlsdGVyKFBhcmFtZXRlciA9PSAiY29uZGl0aW9uX251bTppZGVudGl0eV9ncm91cF9udW0iKQogIGV0YV9wICA8LSBldGFfcm93JEV0YTJfcGFydGlhbAogIGNpX2V0YSA8LSBzcHJpbnRmKCJbJS4zZiwgJS4zZl0iLCBldGFfcm93JENJX2xvdywgZXRhX3JvdyRDSV9oaWdoKQogIAogIHRpYmJsZSgKICAgIE91dGNvbWUgID0gb3V0Y29tZSwKICAgIEYgICAgICAgID0gcm91bmQoRl92YWwsIDIpLAogICAgZGYgICAgICAgPSBwYXN0ZTAoIjEsICIsIGRmLnJlc2lkdWFsKG1vZCkpLAogICAgcCAgICAgICAgPSBmb3JtYXRDKHBfdmFsLCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDMpLAogICAgQmV0YV9JbnQgPSByb3VuZChiZXRhX2ludCwgMiksCiAgICBgOTUlIENJICjOsilgID0gY2lfaW50LAogICAgYM63wrLigppgID0gcm91bmQoZXRhX3AsIDMpLAogICAgYDk1JSBDSSAozrfCsuKCmilgID0gY2lfZXRhCiAgKQp9CgojIFJ1biBmb3IgYWxsIHBvc3Qgb3V0Y29tZXMKcmVzdWx0c19tb2RlcmF0aW9uIDwtIG1hcF9kZnIocG9zdF92YXJzLCBmaXRfbW9kZXJhdGlvbiwgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUpCgojIERpc3BsYXkgdGFibGUKa2FibGUoCiAgcmVzdWx0c19tb2RlcmF0aW9uLAogIGFsaWduID0gYygibCIsInIiLCJjIiwiciIsInIiLCJyIiwiciIsImMiKSwKICBjYXB0aW9uID0gIk1vZGVyYXRpb24gYW5hbHlzaXM6IENvbmRpdGlvbiDDlyBHZW5kZXIgSWRlbnRpdHkgKGlkZW50aXR5X2dyb3VwX251bSkgaW50ZXJhY3Rpb24gZWZmZWN0cyIKKSB8PiAKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKYGBgCgoKCgoKCgoKCgoKCk1BSU4gRUZGRUNUUyBSRVZJRVdFUiBDT01NRU5UUyBBTkQgRk9MTE9XIFVQCk9VVExJRVIKCiJQcm92aWRlIHNlbnNpdGl2aXR5IGFuYWx5c2VzIHRvIGFkZHJlc3MgcG9zc2libGUgYmlhcyBmcm9tIGZhc3RlciBlbmdhZ2VtZW50IGRlY2xpbmUgaW4gdGhlIGludGVydmVudGlvbiBhcm0uICIKCgoKYGBge3J9CnBfbW9kIDwtIGMoMC4wMzgsIDAuMDMxLCAwLjA3NikKcC5hZGp1c3QocF9tb2QsIG1ldGhvZCA9ICJCSCIpCmBgYAoKCgoKYGBge3J9Cm1vZF9pbnQgPC0gbG0oUG9zdF9ERVJTOF9TdW0gfiBQcmVfREVSUzhfU3VtICsgaWRlbnRpdHlfZ3JvdXBfbnVtICsgYWdlICsKICAgICAgICAgICAgICAgIGNvbmRpdGlvbl9udW0gKiB0b3RhbF9zZXNzaW9ucywKICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKY2FyOjpBbm92YShtb2RfaW50LCB0eXBlID0gMylbImNvbmRpdGlvbl9udW06dG90YWxfc2Vzc2lvbnMiLCBdCgptb2RfaW50IDwtIGxtKFBvc3RfREVSUzhfU3VtIH4gUHJlX0RFUlM4X1N1bSArIGlkZW50aXR5X2dyb3VwX251bSArIGFnZSArCiAgICAgICAgICAgICAgICBjb25kaXRpb25fbnVtICogdG90YWxfc2Vzc2lvbnMsCiAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUpCmNhcjo6QW5vdmEobW9kX2ludCwgdHlwZSA9IDMpWyJjb25kaXRpb25fbnVtOnRvdGFsX3Nlc3Npb25zIiwgXQoKIyBNYWtlIHN1cmUgeW91IGhhdmUgdGhlIGxpYnJhcnkgbG9hZGVkCmxpYnJhcnkoZW1tZWFucykKCiMgWW91ciBpbnRlcmFjdGlvbiBtb2RlbCAod2hpY2ggeW91J3ZlIGFscmVhZHkgcnVuKQptb2RfaW50IDwtIGxtKFBvc3RfREVSUzhfU3VtIH4gUHJlX0RFUlM4X1N1bSArIGlkZW50aXR5X2dyb3VwX251bSArIGFnZSArCiAgICAgICAgICAgICAgICBjb25kaXRpb25fbnVtICogdG90YWxfc2Vzc2lvbnMsCiAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUpCgojIFRoaXMgaXMgdGhlIHByb2JlIQojIEl0IGFza3M6ICJXaGF0IGlzIHRoZSB0cmVuZC9zbG9wZSBvZiB0b3RhbF9zZXNzaW9ucyBmb3IgZWFjaCBjb25kaXRpb25fbnVtPyIKc2ltcGxlX3Nsb3BlcyA8LSBlbXRyZW5kcyhtb2RfaW50LCB+IGNvbmRpdGlvbl9udW0sIHZhciA9ICJ0b3RhbF9zZXNzaW9ucyIpCgojIFByaW50IHRoZSByZXN1bHRzCnByaW50KHNpbXBsZV9zbG9wZXMpCmBgYApgYGB7cn0KIyBNYWtlIHN1cmUgbGlicmFyaWVzIGFyZSBsb2FkZWQKbGlicmFyeShjYXIpCmxpYnJhcnkoZW1tZWFucykKCiMgLS0tIEFuYWx5c2lzIGZvciBHQUQtNyAtLS0KCiMgMS4gRml0IHRoZSBpbnRlcmFjdGlvbiBtb2RlbCBmb3IgR0FELTcKbW9kX2ludF9nYWQgPC0gbG0oUG9zdF9HQUQ3X1N1bSB+IFByZV9HQUQ3X1N1bSArIGlkZW50aXR5X2dyb3VwX251bSArIGFnZSArCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uX251bSAqIHRvdGFsX3Nlc3Npb25zLAogICAgICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKCiMgMi4gR2V0IHRoZSBGLXRlc3QgZm9yIHRoZSBHQUQtNyBpbnRlcmFjdGlvbgojICAgIFRoaXMgaXMgeW91ciBGSVJTVCBrZXkgZmluZGluZyAocC12YWx1ZSBmb3IgdGhlIGludGVyYWN0aW9uKQpwcmludCgiLS0tIEdBRC03IEludGVyYWN0aW9uIEYtVGVzdCAtLS0iKQpnYWRfaW50ZXJhY3Rpb25fdGVzdCA8LSBjYXI6OkFub3ZhKG1vZF9pbnRfZ2FkLCB0eXBlID0gMylbImNvbmRpdGlvbl9udW06dG90YWxfc2Vzc2lvbnMiLCBdCnByaW50KGdhZF9pbnRlcmFjdGlvbl90ZXN0KQoKCiMgMy4gUHJvYmUgdGhlIEdBRC03IGludGVyYWN0aW9uCiMgICAgVGhpcyBpcyB5b3VyIFNFQ09ORCBrZXkgZmluZGluZyAodGhlIHNpbXBsZSBzbG9wZXMpCnByaW50KCItLS0gR0FELTcgU2ltcGxlIFNsb3BlcyAtLS0iKQpzaW1wbGVfc2xvcGVzX2dhZCA8LSBlbXRyZW5kcyhtb2RfaW50X2dhZCwgfiBjb25kaXRpb25fbnVtLCB2YXIgPSAidG90YWxfc2Vzc2lvbnMiKQpwcmludChzaW1wbGVfc2xvcGVzX2dhZCkKCgojIC0tLSBBbmFseXNpcyBmb3IgUEhRLTkgLS0tCgojIDEuIEZpdCB0aGUgaW50ZXJhY3Rpb24gbW9kZWwgZm9yIFBIUS05Cm1vZF9pbnRfcGhxIDwtIGxtKFBvc3RfUEhROV9TdW0gfiBQcmVfUEhROV9TdW0gKyBpZGVudGl0eV9ncm91cF9udW0gKyBhZ2UgKwogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbl9udW0gKiB0b3RhbF9zZXNzaW9ucywKICAgICAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUpCgojIDIuIEdldCB0aGUgRi10ZXN0IGZvciB0aGUgUEhRLTkgaW50ZXJhY3Rpb24KIyAgICBUaGlzIGlzIHlvdXIgRklSU1Qga2V5IGZpbmRpbmcgKHAtdmFsdWUgZm9yIHRoZSBpbnRlcmFjdGlvbikKcHJpbnQoIi0tLSBQSFEtOSBJbnRlcmFjdGlvbiBGLVRlc3QgLS0tIikKcGhxX2ludGVyYWN0aW9uX3Rlc3QgPC0gY2FyOjpBbm92YShtb2RfaW50X3BocSwgdHlwZSA9IDMpWyJjb25kaXRpb25fbnVtOnRvdGFsX3Nlc3Npb25zIiwgXQpwcmludChwaHFfaW50ZXJhY3Rpb25fdGVzdCkKCiMgMy4gUHJvYmUgdGhlIFBIUS05IGludGVyYWN0aW9uCiMgICAgVGhpcyBpcyB5b3VyIFNFQ09ORCBrZXkgZmluZGluZyAodGhlIHNpbXBsZSBzbG9wZXMpCnByaW50KCItLS0gUEhRLTkgU2ltcGxlIFNsb3BlcyAtLS0iKQpzaW1wbGVfc2xvcGVzX3BocSA8LSBlbXRyZW5kcyhtb2RfaW50X3BocSwgfiBjb25kaXRpb25fbnVtLCB2YXIgPSAidG90YWxfc2Vzc2lvbnMiKQpwcmludChzaW1wbGVfc2xvcGVzX3BocSkKYGBgCgoKCgoKCgoKCgoKCgoKCiMjIExpbmVhciBNaXhlZCBFZmZlY3RzIE1vZGVscyAKCmBgYHtyfQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkoYnJvb20ubWl4ZWQpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCm91dGNvbWVzIDwtIGMoIkRFUlM4X1N1bSIsICAiR0FEN19TdW0iLCAiUEhROV9TdW0iKQoKIyBJbml0aWFsaXplIGFuIGVtcHR5IGxpc3QgdG8gc3RvcmUgbW9kZWwgc3VtbWFyaWVzCnJlc3VsdHNfbGlzdCA8LSBsaXN0KCkKCiMgTG9vcCBvdmVyIGVhY2ggb3V0Y29tZSBhbmQgZml0IHRoZSBtaXhlZC1lZmZlY3RzIG1vZGVsIGNvbnRyb2xsaW5nIGZvciBpZGVudGl0eV9ncm91cF9udW0gYW5kIGFnZQpmb3IgKG91dGNvbWUgaW4gb3V0Y29tZXMpIHsKICBtb2RlbCA8LSBsbWVyKGFzLmZvcm11bGEocGFzdGUob3V0Y29tZSwgIn4gV2VlayAqIGNvbmRpdGlvbiArIGlkZW50aXR5X2dyb3VwICsgYWdlICsgKFdlZWsgfCBwc2lkKSIpKSwKICAgICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX0xvbmdfTWFzdGVyKQogICMgVGlkeSB0aGUgbW9kZWwgb3V0cHV0IGFuZCBzdG9yZSBpdCBpbiB0aGUgbGlzdAogIHJlc3VsdHNfbGlzdFtbb3V0Y29tZV1dIDwtIHRpZHkobW9kZWwpCn0KCiMgTG9vcCB0byBwcmludCBlYWNoIG1vZGVsIHN1bW1hcnkgaW4gQVBBLXN0eWxlIHRhYmxlcwpmb3IgKG91dGNvbWUgaW4gbmFtZXMocmVzdWx0c19saXN0KSkgewogIGNhdCgiIyMjIE91dGNvbWU6Iiwgb3V0Y29tZSwgIlxuXG4iKQogIGthYmxlKHJlc3VsdHNfbGlzdFtbb3V0Y29tZV1dLCAKICAgICAgICBjYXB0aW9uID0gcGFzdGUoIk1peGVkLUVmZmVjdHMgTW9kZWwgZm9yIiwgb3V0Y29tZSwgImNvbnRyb2xsaW5nIGZvciBpZGVudGl0eV9ncm91cCBhbmQgYWdlIiksIAogICAgICAgIGRpZ2l0cyA9IDMpICU+JQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpICU+JQogICAgcHJpbnQoKQogIGNhdCgiXG5cbiIpCn0KCmBgYAoKCgoKIyMjUmV2aWV3ZXIgQ29tbWVudDogU2Vuc2l0aXZpdHkgQW5hbHlzaXMKClJldmlld2VyIENvbW1lbnQ6CiJQcm92aWRlIHNlbnNpdGl2aXR5IGFuYWx5c2VzIHRvIGFkZHJlc3MgcG9zc2libGUgYmlhcyBmcm9tIGZhc3RlciBlbmdhZ2VtZW50IGRlY2xpbmUgaW4gdGhlIGludGVydmVudGlvbiBhcm0uIgoKTXkgUmVzcG9uc2UgdG8gQ29tbWVudDoKQmVjYXVzZSBlbmdhZ2VtZW50IGFuYWx5c2VzIGRlbW9uc3RyYXRlZCBhIGZhc3RlciByYXRlIG9mIGRlY2xpbmUgaW4gdGhlIFB1cnJibGUgYXJtIGNvbXBhcmVkIHRvIHRoZSB3YWl0bGlzdCBjb250cm9sLCB3ZSBjb25kdWN0ZWQgc2Vuc2l0aXZpdHkgYW5hbHlzZXMgdG8gZXhhbWluZSB3aGV0aGVyIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2Vzc2lvbnMgY29tcGxldGVkIGJ5IGVhY2ggcGFydGljaXBhbnQgd2FzIGFzc29jaWF0ZWQgd2l0aCBpbnRlcnZlbnRpb24gb3V0Y29tZXMuIFRoZSBudW1iZXIgb2Ygc2Vzc2lvbnMgcGFydGljaXBhdGVkIHdhcyBhZGRlZCBhcyBhIGNvdmFyaWF0ZSBpbiBhbGwgQU5DT1ZBIG1vZGVscy4gQWNyb3NzIG91dGNvbWVzLCBpbmNsdXNpb24gb2YgdGhpcyBjb3ZhcmlhdGUgZGlkIG5vdCBhbHRlciB0aGUgcGF0dGVybiwgbWFnbml0dWRlLCBvciBzaWduaWZpY2FuY2Ugb2YgcmVzdWx0cywgYW5kIG51bWJlciBvZiBzZXNzaW9ucyB3YXMgbm90IGEgc2lnbmlmaWNhbnQgcHJlZGljdG9yIGluIGFueSBtb2RlbC4gVGhlc2UgZmluZGluZ3MgaW5kaWNhdGUgdGhhdCBkaWZmZXJlbmNlcyBpbiB0aGUgcmF0ZSBvZiBzdXJ2ZXkgcmVzcG9uc2l2ZW5lc3MgZGlkIG5vdCBiaWFzIHRoZSBwcmltYXJ5IHJlc3VsdHMuCgpSZXZpZXdlciBDb21tZW50OgoiSW5jbHVkZSBzZW5zaXRpdml0eSBhbmFseXNlcyBhZGRyZXNzaW5nIGRpZmZlcmVudGlhbCBlbmdhZ2VtZW50IGJldHdlZW4gYXJtcy4iCgpNeSBSZXNwb25zZSB0byBDb21tZW50OgpUbyBmdXJ0aGVyIGV4YW1pbmUgcG90ZW50aWFsIGRpZmZlcmVuY2VzIGluIGVuZ2FnZW1lbnQgYmV0d2VlbiBzdHVkeSBhcm1zLCB3ZSBjb21wYXJlZCB0aGUgdG90YWwgbnVtYmVyIG9mIHNlc3Npb25zIGNvbXBsZXRlZCBhY3Jvc3MgY29uZGl0aW9ucyBhbmQgaW5jbHVkZWQgdGhpcyB2YXJpYWJsZSBhcyBhIGNvdmFyaWF0ZSBpbiBhbGwgb3V0Y29tZSBtb2RlbHMuIEFsdGhvdWdoIHBhcnRpY2lwYW50cyBpbiB0aGUgUHVycmJsZSBhcm0gY29tcGxldGVkIHNsaWdodGx5IGZld2VyIHNlc3Npb25zIG9uIGF2ZXJhZ2UgdGhhbiB0aG9zZSBpbiB0aGUgd2FpdGxpc3QgY29uZGl0aW9uLCB0aGlzIGRpZmZlcmVuY2UgZGlkIG5vdCBhZmZlY3QgYW55IG91dGNvbWUuIFJlc3VsdHMgcmVtYWluZWQgY29uc2lzdGVudCB3aXRoIHByaW1hcnkgYW5hbHlzZXMsIHN1Z2dlc3RpbmcgdGhhdCBkaWZmZXJlbnRpYWwgZW5nYWdlbWVudCBiZXR3ZWVuIGFybXMgZGlkIG5vdCBhY2NvdW50IGZvciB0aGUgb2JzZXJ2ZWQgaW50ZXJ2ZW50aW9uIGVmZmVjdHMuCgoKKipSZXN1bHRzIFRleHQ6KiogQmVjYXVzZSBlbmdhZ2VtZW50IGFuYWx5c2VzIGluZGljYXRlZCBhIGZhc3RlciByYXRlIG9mIGRlY2xpbmUgaW4gdGhlIFB1cnJibGUgYXJtIGNvbXBhcmVkIHRvIHRoZSB3YWl0bGlzdCBjb250cm9sLCB3ZSBjb25kdWN0ZWQgc2Vuc2l0aXZpdHkgYW5hbHlzZXMgdG8gZXhhbWluZSB3aGV0aGVyIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2Vzc2lvbnMgY29tcGxldGVkIGJ5IGVhY2ggcGFydGljaXBhbnQgd2FzIGFzc29jaWF0ZWQgd2l0aCBpbnRlcnZlbnRpb24gb3V0Y29tZXMuIFRoZSBudW1iZXIgb2Ygc2Vzc2lvbnMgcGFydGljaXBhdGVkIHdhcyBhZGRlZCBhcyBhIGNvdmFyaWF0ZSBpbiBhbGwgbW9kZWxzLiBBY3Jvc3Mgb3V0Y29tZXMsIGluY2x1c2lvbiBvZiB0aGlzIGNvdmFyaWF0ZSBkaWQgbm90IGFsdGVyIHRoZSBwYXR0ZXJuLCBtYWduaXR1ZGUsIG9yIHNpZ25pZmljYW5jZSBvZiByZXN1bHRzLCBhbmQgbnVtYmVyIG9mIHNlc3Npb25zIHdhcyBub3QgYSBzaWduaWZpY2FudCBwcmVkaWN0b3IgaW4gYW55IG1vZGVsLgoKYGBge3J9CmZpdF9vbmVfc2Vuc19mdWxsIDwtIGZ1bmN0aW9uKG91dGNvbWUsIGRhdGEpIHsKICBwcmVfdmFyIDwtIHN1YigiXlBvc3RfIiwgIlByZV8iLCBvdXRjb21lKQogIAogICMgLS0tIEZpdCBtb2RlbCBpbmNsdWRpbmcgdG90YWxfc2Vzc2lvbnMgLS0tCiAgbW9kIDwtIGxtKHJlZm9ybXVsYXRlKAogICAgYygiY29uZGl0aW9uIiwgcHJlX3ZhciwgImlkZW50aXR5X2dyb3VwX251bSIsICJhZ2UiLCAidG90YWxfc2Vzc2lvbnMiKSwKICAgIG91dGNvbWUpLAogICAgZGF0YSA9IGRhdGEKICApCiAgCiAgIyAtLS0gVHlwZSBJSUkgQU5PVkEgKGFsbCBwcmVkaWN0b3JzKSAtLS0KICBhb3ZfdGJsIDwtIGNhcjo6QW5vdmEobW9kLCB0eXBlID0gMykgfD4gYXMuZGF0YS5mcmFtZSgpCiAgYW92X3RibCRTb3VyY2UgPC0gcm93bmFtZXMoYW92X3RibCkKICAKICAjIC0tLSBQYXJ0aWFsIM63wrIgKyA5NSUgQ0kgZm9yIGFsbCB0ZXJtcyAtLS0KICBldGFfdGJsIDwtIGVmZmVjdHNpemU6OmV0YV9zcXVhcmVkKG1vZCwgcGFydGlhbCA9IFRSVUUsIGNpID0gMC45NSkKICBhb3ZfdGJsIDwtIGRwbHlyOjpsZWZ0X2pvaW4oYW92X3RibCwgZXRhX3RibCwgYnkgPSBjKCJTb3VyY2UiID0gIlBhcmFtZXRlciIpKQogIAogICMgLS0tIFJvdW5kIGFuZCB0aWR5IC0tLQogIGFvdl90YmwgPC0gYW92X3RibCB8PgogICAgZHBseXI6Om11dGF0ZSgKICAgICAgRiA9IHJvdW5kKGBGIHZhbHVlYCwgMiksCiAgICAgIHAgPSBmb3JtYXRDKGBQcig+RilgLCBkaWdpdHMgPSAzLCBmb3JtYXQgPSAiZiIpLAogICAgICBgzrfCsuKCmmAgPSByb3VuZChFdGEyX3BhcnRpYWwsIDMpLAogICAgICBgOTUlIENJICjOt8Ky4oKaKWAgPSBpZmVsc2UoCiAgICAgICAgIWlzLm5hKENJX2xvdyksCiAgICAgICAgc3ByaW50ZigiWyUuM2YsICUuM2ZdIiwgQ0lfbG93LCBDSV9oaWdoKSwKICAgICAgICBOQQogICAgICApCiAgICApIHw+CiAgICBkcGx5cjo6c2VsZWN0KFNvdXJjZSwgRGYsIEYsIHAsIGDOt8Ky4oKaYCwgYDk1JSBDSSAozrfCsuKCmilgKSB8PgogICAgZHBseXI6OnJlbmFtZShkZiA9IERmKQogIAogICMgLS0tIEFkanVzdGVkIG1lYW5zIGZvciBjb25kaXRpb24gKGZhY3RvcikgLS0tCiAgZW1tIDwtIGVtbWVhbnM6OmVtbWVhbnMobW9kLCB+IGNvbmRpdGlvbikKICBhZGpfbWVhbnMgPC0gYXMuZGF0YS5mcmFtZShlbW0pCiAgYWRqX1dMIDwtIHJvdW5kKGFkal9tZWFucyRlbW1lYW5bYWRqX21lYW5zJGNvbmRpdGlvbiA9PSAiV2FpdGxpc3QgQ29udHJvbCJdLCAyKQogIGFkal9QQiA8LSByb3VuZChhZGpfbWVhbnMkZW1tZWFuW2Fkal9tZWFucyRjb25kaXRpb24gPT0gIlB1cnJibGUgVHJlYXRtZW50Il0sIDIpCiAgCiAgIyAtLS0gQ29tYmluZSBhZGp1c3RlZCBtZWFucyArIHN1bW1hcnkgLS0tCiAgc3VtbWFyeV90YmwgPC0gdGliYmxlOjp0aWJibGUoCiAgICBPdXRjb21lID0gb3V0Y29tZSwKICAgIEFkak1lYW5fV0wgPSBhZGpfV0wsCiAgICBBZGpNZWFuX1BCID0gYWRqX1BCCiAgKQogIAogICMgLS0tIFByaW50IHRhYmxlcyAtLS0KICBjYXQoIlxuXG4jIyMgU2Vuc2l0aXZpdHkgQU5DT1ZBIChpbmNsdWRpbmcgdG90YWxfc2Vzc2lvbnMpIGZvciIsIG91dGNvbWUsICJcbiIpCiAgCiAgcHJpbnQoCiAgICBrbml0cjo6a2FibGUoCiAgICAgIGFvdl90YmwsCiAgICAgIGNhcHRpb24gPSBwYXN0ZSgiQU5DT1ZBIChUeXBlIElJSSkgcmVzdWx0cyBpbmNsdWRpbmcgYWxsIGNvdmFyaWF0ZXMgZm9yIiwgb3V0Y29tZSksCiAgICAgIGFsaWduID0gImxycnJyciIsCiAgICAgIGRpZ2l0cyA9IDMKICAgICkgfD4ga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImNlbnRlciIpCiAgKQogIAogIGNhdCgiXG5cbioqQWRqdXN0ZWQgTWVhbnMgKENvbmRpdGlvbiBPbmx5KSoqXG4iKQogIHByaW50KAogICAga25pdHI6OmthYmxlKAogICAgICBzdW1tYXJ5X3RibCwKICAgICAgYWxpZ24gPSBjKCJsIiwgInIiLCAiciIpLAogICAgICBkaWdpdHMgPSAyCiAgICApIHw+IGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJjZW50ZXIiKQogICkKICAKICByZXR1cm4oYW92X3RibCkKfQoKIyAtLS0gUnVuIGFjcm9zcyBhbGwgb3V0Y29tZXMgLS0tCnJlc3VsdHNfc2Vuc2l0aXZpdHlfYWxsIDwtIGxhcHBseShwb3N0X3ZhcnMsIGZpdF9vbmVfc2Vuc19mdWxsLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKCmBgYAoKCgpgYGB7cn0KbW9kX2ludCA8LSBsbShQb3N0X0RFUlM4X1N1bSB+IFByZV9ERVJTOF9TdW0gKyBpZGVudGl0eV9ncm91cF9udW0gKyBhZ2UgKwogICAgICAgICAgICAgICAgY29uZGl0aW9uX251bSAqIHRvdGFsX3Nlc3Npb25zLAogICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlKQpjYXI6OkFub3ZhKG1vZF9pbnQsIHR5cGUgPSAzKVsiY29uZGl0aW9uX251bTp0b3RhbF9zZXNzaW9ucyIsIF0KCm1vZF9pbnQgPC0gbG0oUG9zdF9ERVJTOF9TdW0gfiBQcmVfREVSUzhfU3VtICsgaWRlbnRpdHlfZ3JvdXBfbnVtICsgYWdlICsKICAgICAgICAgICAgICAgIGNvbmRpdGlvbl9udW0gKiB0b3RhbF9zZXNzaW9ucywKICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKY2FyOjpBbm92YShtb2RfaW50LCB0eXBlID0gMylbImNvbmRpdGlvbl9udW06dG90YWxfc2Vzc2lvbnMiLCBdCmBgYAoKCgoKYGBge3J9CmxpYnJhcnkoZW1tZWFucykKCmVtdHJlbmRzKG1vZF9pbnQsIH4gY29uZGl0aW9uX251bSwgdmFyID0gInRvdGFsX3Nlc3Npb25zIikKCmxpYnJhcnkoZ2dwbG90MikKCmdncGxvdChQdXJyYmxlX01hc3Rlcl9XaWRlLCBhZXMoeCA9IHRvdGFsX3Nlc3Npb25zLCB5ID0gUG9zdF9ERVJTOF9TdW0sIGNvbG9yID0gYXMuZmFjdG9yKGNvbmRpdGlvbl9udW0pKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSArCiAgbGFicyhjb2xvciA9ICJDb25kaXRpb24iLCB4ID0gIlRvdGFsIFNlc3Npb25zIENvbXBsZXRlZCIsIHkgPSAiUG9zdCBERVJTLTgiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKCgojIFNlbGYtSGFybSBBbmFseXNlcwoKIyMgRnJlcXVlbmNpZXMgYnkgQ29uZGl0aW9uIGFuZCBSZXNwb25zZSBvdmVyIFRpbWUKQmVsb3csIHdlIGRpc3BsYXkgYSB0YWJsZSBhbmQgZ3JhcGggb2YgdGhlIGZyZXF1ZW5jeSBvZiByZXNwb25zZXMgZm9yIGFsbCBzZWxmLWhhcm0gcXVlc3Rpb25zLCB0aGUgZnJlcXVlbmN5IG9mIGZsYWdnZWQgcmVzcG9uc2VzIHRvIGVhY2ggc2VsZi1oYXJtIHF1ZXN0aW9uIG92ZXIgdGltZSwgYW5kIHRoZSBmcmVxdWVuY3kgb2YgZmxhZ2dlZCByZXNwb25zZXMgdG8gZWFjaCBzZWxmLWhhcm0gcXVlc3Rpb24gb3ZlciB0aW1lLCBzZXBhcmF0ZWQgYnkgY29uZGl0aW9uLgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGd0KQoKc2hxX3N1bW1hcnkgPC0gTm9EdXBfUHVycmJsZUFub24gJT4lCiAgZ3JvdXBfYnkoV2VlaykgJT4lCiAgc3VtbWFyaXNlKAogICAgTl9TSFExID0gc3VtKCFpcy5uYShTSFExKSksCiAgICBOX1NIUTIgPSBzdW0oIWlzLm5hKFNIUTIpKSwKICAgIE5fU0hRMyA9IHN1bSghaXMubmEoU0hRMykpCiAgKSAlPiUKICB1bmdyb3VwKCkKCiMgUmVtb3ZlIHdlZWsgMCBhbmQgTkEgdmFsdWVzCnNocV9zdW1tYXJ5X2NsZWFuIDwtIHNocV9zdW1tYXJ5ICU+JQogIGZpbHRlcighaXMubmEoV2VlaykgJiBXZWVrICE9IDApCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFBsb3Q6IExpbmUgR3JhcGggZm9yIFJlc3BvbnNlIFJhdGUgT3ZlciBUaW1lCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmdncGxvdChzaHFfc3VtbWFyeV9jbGVhbiwgYWVzKHggPSBXZWVrKSkgKwogIGdlb21fbGluZShhZXMoeSA9IE5fU0hRMSwgY29sb3IgPSAiU0hRMSIpLCBzaXplID0gMSkgKwogIGdlb21fbGluZShhZXMoeSA9IE5fU0hRMiwgY29sb3IgPSAiU0hRMiIpLCBzaXplID0gMSkgKwogIGdlb21fbGluZShhZXMoeSA9IE5fU0hRMywgY29sb3IgPSAiU0hRMyIpLCBzaXplID0gMSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJSZXNwb25zZSBSYXRlIE92ZXIgVGltZSBmb3IgU0hRIFZhcmlhYmxlcyIsCiAgICB4ID0gIldlZWsiLAogICAgeSA9ICJOdW1iZXIgb2YgTm9uLU1pc3NpbmcgUmVzcG9uc2VzIiwKICAgIGNvbG9yID0gIlNIUSBWYXJpYWJsZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSB1bmlxdWUoc2hxX3N1bW1hcnlfY2xlYW4kV2VlaykpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiU0hRMSIgPSAiYmx1ZSIsICJTSFEyIiA9ICJyZWQiLCAiU0hRMyIgPSAiZ3JlZW4iKSkKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRGlzcGxheSBUYWJsZTogUmVzcG9uc2UgQ291bnRzIE92ZXIgVGltZQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzaHFfc3VtbWFyeV9jbGVhbiAlPiUKICBndCgpICU+JQogIGd0Ojp0YWJfaGVhZGVyKAogICAgdGl0bGUgPSAiTnVtYmVyIG9mIFJlc3BvbnNlcyBmb3IgU2VsZi1IYXJtIFF1ZXN0aW9ucyBPdmVyIFRpbWUiCiAgKQpgYGAKCgpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ3QpCgojIFJlc2hhcGUgaW50byBsb25nIGZvcm1hdApzaHFfbG9uZyA8LSBOb0R1cF9QdXJyYmxlQW5vbiAlPiUKICBzZWxlY3QoV2VlaywgU0hRMSwgU0hRMiwgU0hRMykgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBzdGFydHNfd2l0aCgiU0hRIiksIG5hbWVzX3RvID0gIlNIUV9WYXIiLCB2YWx1ZXNfdG8gPSAiUmVzcG9uc2UiKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFdlZWspICYgV2VlayAhPSAwKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFJlc3BvbnNlKSkgJT4lCiAgbXV0YXRlKFJlc3BvbnNlID0gZmFjdG9yKFJlc3BvbnNlLCBsZXZlbHMgPSBjKDEsIDApLCBsYWJlbHMgPSBjKCIxIiwgIjAiKSkpCgojIENvdW50IGhvdyBtYW55IHNlbGVjdGVkIGVhY2ggY2F0ZWdvcnkgKDAgb3IgMSkgcGVyIFNIUSB2YXJpYWJsZSBwZXIgd2VlawpzaHFfY291bnRzIDwtIHNocV9sb25nICU+JQogIGdyb3VwX2J5KFdlZWssIFNIUV9WYXIsIFJlc3BvbnNlKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUGxvdDogTGluZSBHcmFwaCBvZiAxIChmbGFnZ2VkKSByZXNwb25zZSBvdmVyIHRpbWUKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZ2dwbG90KAogIHNocV9jb3VudHMgJT4lIGZpbHRlcihSZXNwb25zZSA9PSAiMSIpLCAKICBhZXMoeCA9IFdlZWssIHkgPSBuLCBjb2xvciA9IFNIUV9WYXIpCikgKwogIGdlb21fbGluZShzaXplID0gMSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJOdW1iZXIgb2YgRmxhZ2dlZCBTSFEgUmVzcG9uc2VzIE92ZXIgVGltZSAoUmVzcG9uc2UgPSAxKSIsCiAgICB4ID0gIldlZWsiLAogICAgeSA9ICJDb3VudCBvZiBSZXNwb25zZSA9IDEiLAogICAgY29sb3IgPSAiU0hRIFZhcmlhYmxlIgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHVuaXF1ZShzaHFfY291bnRzJFdlZWspKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUYWJsZTogQ291bnQgb2YgMCBhbmQgMSBSZXNwb25zZXMgcGVyIFdlZWsgcGVyIFNIUQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzaHFfY291bnRzICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBSZXNwb25zZSwgdmFsdWVzX2Zyb20gPSBuLCB2YWx1ZXNfZmlsbCA9IDApICU+JQogIHJlbmFtZShgUmVzcG9uc2UgPSAxYCA9IGAxYCwgYFJlc3BvbnNlID0gMGAgPSBgMGApICU+JQogIGd0KCkgJT4lCiAgdGFiX2hlYWRlcih0aXRsZSA9ICJDb3VudHMgb2YgU0hRIFJlc3BvbnNlcyAoMCB2cy4gMSkgYnkgV2VlayBhbmQgVmFyaWFibGUiKQoKIyBSZXNoYXBlIGludG8gbG9uZyBmb3JtYXQgYW5kIGluY2x1ZGUgY29uZGl0aW9uCnNocV9sb25nX2dyb3VwZWQgPC0gTm9EdXBfUHVycmJsZUFub24gJT4lCiAgc2VsZWN0KHBzaWQsIFdlZWssIGNvbmRpdGlvbiwgU0hRMSwgU0hRMiwgU0hRMykgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBzdGFydHNfd2l0aCgiU0hRIiksIG5hbWVzX3RvID0gIlNIUV9WYXIiLCB2YWx1ZXNfdG8gPSAiUmVzcG9uc2UiKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFdlZWspICYgV2VlayAhPSAwKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFJlc3BvbnNlKSkgJT4lCiAgbXV0YXRlKFJlc3BvbnNlID0gZmFjdG9yKFJlc3BvbnNlLCBsZXZlbHMgPSBjKDEsIDApLCBsYWJlbHMgPSBjKCIxIiwgIjAiKSksCiAgICAgICAgIGNvbmRpdGlvbiA9IGFzLmZhY3Rvcihjb25kaXRpb24pKQoKIyBDb3VudCBob3cgbWFueSBzZWxlY3RlZCBlYWNoIGNhdGVnb3J5ICgwIG9yIDEpIHBlciBTSFEgdmFyaWFibGUsIHBlciB3ZWVrLCBwZXIgZ3JvdXAKc2hxX2NvdW50c19ncm91cGVkIDwtIHNocV9sb25nX2dyb3VwZWQgJT4lCiAgZ3JvdXBfYnkoV2VlaywgY29uZGl0aW9uLCBTSFFfVmFyLCBSZXNwb25zZSkgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFBsb3Q6IExpbmUgR3JhcGggb2YgMSAoZmxhZ2dlZCkgcmVzcG9uc2Ugb3ZlciB0aW1lIGJ5IGdyb3VwCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmdncGxvdCgKICBzaHFfY291bnRzX2dyb3VwZWQgJT4lIGZpbHRlcihSZXNwb25zZSA9PSAiMSIpLCAKICBhZXMoeCA9IFdlZWssIHkgPSBuLCBjb2xvciA9IFNIUV9WYXIpCikgKwogIGdlb21fbGluZShzaXplID0gMSkgKwogIGZhY2V0X3dyYXAofiBjb25kaXRpb24pICsKICBsYWJzKAogICAgdGl0bGUgPSAiTnVtYmVyIG9mIEZsYWdnZWQgU0hRIFJlc3BvbnNlcyBPdmVyIFRpbWUgKFJlc3BvbnNlID0gMSkiLAogICAgc3VidGl0bGUgPSAiRmFjZXRlZCBieSBDb25kaXRpb24iLAogICAgeCA9ICJXZWVrIiwKICAgIHkgPSAiQ291bnQgb2YgUmVzcG9uc2UgPSAxIiwKICAgIGNvbG9yID0gIlNIUSBWYXJpYWJsZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSB1bmlxdWUoc2hxX2NvdW50c19ncm91cGVkJFdlZWspKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUYWJsZTogQ291bnQgb2YgMCBhbmQgMSBSZXNwb25zZXMgcGVyIFdlZWsgcGVyIFNIUSwgYnkgR3JvdXAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc2hxX2NvdW50c19ncm91cGVkICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBSZXNwb25zZSwgdmFsdWVzX2Zyb20gPSBuLCB2YWx1ZXNfZmlsbCA9IDApICU+JQogIHJlbmFtZShgUmVzcG9uc2UgPSAxYCA9IGAxYCwgYFJlc3BvbnNlID0gMGAgPSBgMGApICU+JQogIGFycmFuZ2UoY29uZGl0aW9uLCBTSFFfVmFyLCBXZWVrKSAlPiUKICBndCgpICU+JQogIHRhYl9oZWFkZXIodGl0bGUgPSAiQ291bnRzIG9mIFNIUSBSZXNwb25zZXMgKDAgdnMuIDEpIGJ5IFdlZWssIFZhcmlhYmxlLCBhbmQgR3JvdXAiKQoKCgojIyBTZWxmLUhhcm0gTG9naXN0aWMgUmVncmVzc2lvbgpQb3N0LXRlc3QgTG9naXN0aWMgUmVncmVzc2lvbiB0byBJbnZlc3RpZ2F0ZSBJbnRlcnZlbnRpb24gRWZmZWN0cyBvbiBTZWxmLUhhcm0gT3V0Y29tZXMKKlJlc3VsdDoqIENvbmRpdGlvbiB3YXMgbm90IGEgc2lnbmlmaWNhbnQgcHJlZGljdG9yIG9mIGFueSBzZWxmLWhhcm0gb3V0Y29tZSAoY29kZWQgYmluYXJ5KS4KYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ3RzdW1tYXJ5KSAgIApsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGd0c3VtbWFyeSkKCk5vRHVwX1B1cnJibGVBbm9uIDwtIE5vRHVwX1B1cnJibGVBbm9uICU+JQogIGZpbHRlcihwc2lkICE9ICJDNzIiKSAlPiUKICBtdXRhdGUoCiAgICAjIElmIG1pc3NpbmcsIHRoZW4gTkEuIElmIDw9IDEgdGhlbiAwLCBlbHNlIDEKICAgIFNIUTEgPSBpZmVsc2UoaXMubmEoc2hxc2NyZWVuZXIxKSwgTkEsIGlmZWxzZShzaHFzY3JlZW5lcjEgPD0gMSwgMCwgMSkpLAogICAgU0hRMiA9IGlmZWxzZShpcy5uYShzaHFzY3JlZW5lcjIpLCBOQSwgaWZlbHNlKHNocXNjcmVlbmVyMiA8PSAxLCAwLCAxKSksCiAgICBTSFEzID0gaWZlbHNlKGlzLm5hKHNocXNjcmVlbmVyMyksIE5BLCBpZmVsc2Uoc2hxc2NyZWVuZXIzIDw9IDEsIDAsIDEpKQogICkgJT4lCiAgbXV0YXRlKAogICAgIyBJZiBhbnkgb2YgU0hRMSwgU0hRMiwgb3IgU0hRMyBpcyBtaXNzaW5nLCBTSFFfQW55IGlzIG1pc3NpbmcuCiAgICAjIElmIGFsbCB0aHJlZSBhcmUgMCwgU0hRX0FueSBpcyAwLCBlbHNlIDEuCiAgICBTSFFfQW55ID0gY2FzZV93aGVuKAogICAgICBpcy5uYShTSFExKSB8IGlzLm5hKFNIUTIpIHwgaXMubmEoU0hRMykgfiBOQV9yZWFsXywKICAgICAgU0hRMSA9PSAwICYgU0hRMiA9PSAwICYgU0hRMyA9PSAwIH4gMCwKICAgICAgVFJVRSB+IDEKICAgICkKICApCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDEpIExvZ2lzdGljIHJlZ3Jlc3Npb24gZm9yIFNIUTEgYXQgV2VlayAxMgojICAgIGNvbnRyb2xsaW5nIGZvciBXZWVrIDIgU0hRMSBhbmQgQ29uZGl0aW9uCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm1vZGVsX3NocTEgPC0gZ2xtKAogIFNIUTFfMTIgfiBjb25kaXRpb24gKyBTSFExXzIsIAogIGRhdGEgPSBwdXJyYmxlX3dpZGUsIAogIGZhbWlseSA9IGJpbm9taWFsCikKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMikgTG9naXN0aWMgcmVncmVzc2lvbiBmb3IgU0hRMiBhdCBXZWVrIDEyCiMgICAgY29udHJvbGxpbmcgZm9yIFdlZWsgMiBTSFEyIGFuZCBDb25kaXRpb24KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbW9kZWxfc2hxMiA8LSBnbG0oCiAgU0hRMl8xMiB+IGNvbmRpdGlvbiArIFNIUTJfMiwgCiAgZGF0YSA9IHB1cnJibGVfd2lkZSwgCiAgZmFtaWx5ID0gYmlub21pYWwKKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAzKSBMb2dpc3RpYyByZWdyZXNzaW9uIGZvciBTSFEzIGF0IFdlZWsgMTIKIyAgICBjb250cm9sbGluZyBmb3IgV2VlayAyIFNIUTMgYW5kIENvbmRpdGlvbgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptb2RlbF9zaHEzIDwtIGdsbSgKICBTSFEzXzEyIH4gY29uZGl0aW9uICsgU0hRM18yLCAKICBkYXRhID0gcHVycmJsZV93aWRlLCAKICBmYW1pbHkgPSBiaW5vbWlhbAopCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDQpIExvZ2lzdGljIHJlZ3Jlc3Npb24gZm9yIFNIUV9BbnkgYXQgV2VlayAxMgojICAgIGNvbnRyb2xsaW5nIGZvciBXZWVrIDIgU0hRX0FueSBhbmQgQ29uZGl0aW9uCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm1vZGVsX3NocUFueSA8LSBnbG0oCiAgU0hRX0FueV8xMiB+IGNvbmRpdGlvbiArIFNIUV9BbnlfMiwgCiAgZGF0YSA9IHB1cnJibGVfd2lkZSwgCiAgZmFtaWx5ID0gYmlub21pYWwKKQoKIyBDcmVhdGUgZ3RzdW1tYXJ5IHRhYmxlcyBmb3IgZWFjaCBtb2RlbCwgZXhwb25lbnRpYXRpbmcgZm9yIE9SCnRibF9zaHExICAgPC0gdGJsX3JlZ3Jlc3Npb24obW9kZWxfc2hxMSwgZXhwb25lbnRpYXRlID0gVFJVRSkgJT4lCiAgYm9sZF9sYWJlbHMoKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlX3N0YXJzKCkKCnRibF9zaHEyICAgPC0gdGJsX3JlZ3Jlc3Npb24obW9kZWxfc2hxMiwgZXhwb25lbnRpYXRlID0gVFJVRSkgJT4lCiAgYm9sZF9sYWJlbHMoKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlX3N0YXJzKCkKCnRibF9zaHEzICAgPC0gdGJsX3JlZ3Jlc3Npb24obW9kZWxfc2hxMywgZXhwb25lbnRpYXRlID0gVFJVRSkgJT4lCiAgYm9sZF9sYWJlbHMoKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlX3N0YXJzKCkKCnRibF9zaHFBbnkgPC0gdGJsX3JlZ3Jlc3Npb24obW9kZWxfc2hxQW55LCBleHBvbmVudGlhdGUgPSBUUlVFKSAlPiUKICBib2xkX2xhYmVscygpICU+JQogIGFkZF9zaWduaWZpY2FuY2Vfc3RhcnMoKQoKbWVyZ2VkX3RibCA8LSB0YmxfbWVyZ2UoCiAgIHRibHMgPSBsaXN0KHRibF9zaHExLCB0Ymxfc2hxMiwgdGJsX3NocTMsIHRibF9zaHFBbnkpLAogICB0YWJfc3Bhbm5lciA9IGMoIlNIUTEgTW9kZWwiLCAiU0hRMiBNb2RlbCIsICJTSFEzIE1vZGVsIiwgIlNIUV9BbnkgTW9kZWwiKQogKQogbWVyZ2VkX3RibApgYGAKCiMjIFNlbGYtSGFybSBQcm9wb3J0aW9uYWwgT2RkcyBSZWdyZXNzaW9uCkZyZXF1ZW5jaWVzIFRhYmxlcwpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKCiMgRGVmaW5lIHRoZSBzaXggb3JkZXJlZOKAkGZhY3RvciB2YXJpYWJsZXMgKHdlZWtzIDEgYW5kIDEyIGZvciBzY3JlZW5lcnMgMeKAkzMpCnNjcmVlbmVyX3ZhcnMgPC0gYygKICAic2hxc2NyZWVuZXIxX3cxIiwgICJzaHFzY3JlZW5lcjFfdzEyIiwKICAic2hxc2NyZWVuZXIyX3cxIiwgICJzaHFzY3JlZW5lcjJfdzEyIiwKICAic2hxc2NyZWVuZXIzX3cxIiwgICJzaHFzY3JlZW5lcjNfdzEyIgopCgojIExvb3Agb3ZlciBlYWNoIHZhcmlhYmxlIGFuZCBwcmludCBhIGZyZXF1ZW5jeSB0YWJsZSAoY291bnQgKyBwZXJjZW50KQpmb3IgKHZhciBpbiBzY3JlZW5lcl92YXJzKSB7CiAgZnJlcV90YmwgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICAgIGZpbHRlcighaXMubmEoLmRhdGFbW3Zhcl1dKSkgJT4lIAogICAgY291bnQocmVzcG9uc2UgPSAuZGF0YVtbdmFyXV0pICU+JQogICAgbXV0YXRlKHBlcmNlbnQgPSByb3VuZChuIC8gc3VtKG4pICogMTAwLCAxKSkKICAKICBjYXQoIlxuXG4qKkZyZXF1ZW5jaWVzIGZvciIsIHZhciwgIioqXG4iKQogIHByaW50KGthYmxlKGZyZXFfdGJsLCBjb2wubmFtZXMgPSBjKCJSZXNwb25zZSIsICJDb3VudCIsICJQZXJjZW50IiksIGRpZ2l0cyA9IDEpKQp9CmBgYAoKCiMjIyBQcm9wb3J0aW9uYWwgT2RkcyBNb2RlbHM6IEJyYW50IFRlc3RzCkFsbCBzaXggQnJhbnQgdGVzdHMgKG9uZSBmb3IgZWFjaCBzY3JlZW5lciBhdCBXZWVrIDEgYW5kIFdlZWsgMTIpIHByb2R1Y2VkIG5vbuKAkHNpZ25pZmljYW50IHDigJB2YWx1ZXMsIGluZGljYXRpbmcgdGhhdCB0aGUgcHJvcG9ydGlvbmFs4oCQb2RkcyAocGFyYWxsZWwgcmVncmVzc2lvbikgYXNzdW1wdGlvbiBob2xkcyBpbiBldmVyeSBjYXNlLgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShrbml0cikKbGlicmFyeShNQVNTKQpsaWJyYXJ5KGJyYW50KQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcm9wb3J0aW9uYWwgT2RkcyBNb2RlbHMgJiBCcmFudCBUZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBTY3JlZW5lciAxOiBXZWVrIDEKbW9kZWxfczFfdzEgPC0gcG9scihzaHFzY3JlZW5lcjFfdzEgfiBjb25kaXRpb24sIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlLCBIZXNzID0gVFJVRSkKYnJhbnRfczFfdzEgPC0gYnJhbnQobW9kZWxfczFfdzEpCnByaW50KCJCcmFudCBUZXN0IGZvciBTY3JlZW5lciAxIGF0IFdlZWsgMToiKQpwcmludChicmFudF9zMV93MSkKCiMgU2NyZWVuZXIgMTogV2VlayAxMgptb2RlbF9zMV93MTIgPC0gcG9scihzaHFzY3JlZW5lcjFfdzEyIH4gY29uZGl0aW9uLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCmJyYW50X3MxX3cxMiA8LSBicmFudChtb2RlbF9zMV93MTIpCnByaW50KCJCcmFudCBUZXN0IGZvciBTY3JlZW5lciAxIGF0IFdlZWsgMTI6IikKcHJpbnQoYnJhbnRfczFfdzEyKQoKIyBTY3JlZW5lciAyOiBXZWVrIDEKbW9kZWxfczJfdzEgPC0gcG9scihzaHFzY3JlZW5lcjJfdzEgfiBjb25kaXRpb24sIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlLCBIZXNzID0gVFJVRSkKYnJhbnRfczJfdzEgPC0gYnJhbnQobW9kZWxfczJfdzEpCnByaW50KCJCcmFudCBUZXN0IGZvciBTY3JlZW5lciAyIGF0IFdlZWsgMToiKQpwcmludChicmFudF9zMl93MSkKCiMgU2NyZWVuZXIgMjogV2VlayAxMgptb2RlbF9zMl93MTIgPC0gcG9scihzaHFzY3JlZW5lcjJfdzEyIH4gY29uZGl0aW9uLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCmJyYW50X3MyX3cxMiA8LSBicmFudChtb2RlbF9zMl93MTIpCnByaW50KCJCcmFudCBUZXN0IGZvciBTY3JlZW5lciAyIGF0IFdlZWsgMTI6IikKcHJpbnQoYnJhbnRfczJfdzEyKQoKIyBTY3JlZW5lciAzOiBXZWVrIDEKbW9kZWxfczNfdzEgPC0gcG9scihzaHFzY3JlZW5lcjNfdzEgfiBjb25kaXRpb24sIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlLCBIZXNzID0gVFJVRSkKYnJhbnRfczNfdzEgPC0gYnJhbnQobW9kZWxfczNfdzEpCnByaW50KCJCcmFudCBUZXN0IGZvciBTY3JlZW5lciAzIGF0IFdlZWsgMToiKQpwcmludChicmFudF9zM193MSkKCiMgU2NyZWVuZXIgMzogV2VlayAxMgptb2RlbF9zM193MTIgPC0gcG9scihzaHFzY3JlZW5lcjNfdzEyIH4gY29uZGl0aW9uLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCmJyYW50X3MzX3cxMiA8LSBicmFudChtb2RlbF9zM193MTIpCnByaW50KCJCcmFudCBUZXN0IGZvciBTY3JlZW5lciAzIGF0IFdlZWsgMTI6IikKcHJpbnQoYnJhbnRfczNfdzEyKQpgYGAKCgpObyBzaWduaWZpY2FudCByZXN1bHRzIG9mIFB1cnJibGUgb24gc2VsZi1oYXJtIHVzaW5nIHByb3BydGlvbmFsIG9kZHMgKG9yZGluYWwgZGF0YSB0aGF0IG1haW50YWlucyBmcmVxdWVuY3kpCmBgYHtyfQpsaWJyYXJ5KE1BU1MpCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkoa25pdHIpCgojIENvbnZlcnQgb3V0Y29tZXMgdG8gb3JkZXJlZCBmYWN0b3JzIChhZGp1c3QgdGhlIGxldmVscyBpZiBuZWVkZWQpClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUoCiAgICBzaHFzY3JlZW5lcjFfdzEgID0gZmFjdG9yKHNocXNjcmVlbmVyMV93MSwgb3JkZXJlZCA9IFRSVUUpLAogICAgc2hxc2NyZWVuZXIyX3cxICA9IGZhY3RvcihzaHFzY3JlZW5lcjJfdzEsIG9yZGVyZWQgPSBUUlVFKSwKICAgIHNocXNjcmVlbmVyM193MSAgPSBmYWN0b3Ioc2hxc2NyZWVuZXIzX3cxLCBvcmRlcmVkID0gVFJVRSksCiAgICBzaHFzY3JlZW5lcjFfdzEyID0gZmFjdG9yKHNocXNjcmVlbmVyMV93MTIsIG9yZGVyZWQgPSBUUlVFKSwKICAgIHNocXNjcmVlbmVyMl93MTIgPSBmYWN0b3Ioc2hxc2NyZWVuZXIyX3cxMiwgb3JkZXJlZCA9IFRSVUUpLAogICAgc2hxc2NyZWVuZXIzX3cxMiA9IGZhY3RvcihzaHFzY3JlZW5lcjNfdzEyLCBvcmRlcmVkID0gVFJVRSkKICApCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEZpdCBQcm9wb3J0aW9uYWwgT2RkcyBNb2RlbHMgZm9yIFdlZWsgMTIgb3V0Y29tZXMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2RlbCBmb3IgU2NyZWVuZXIgMSBjb250cm9sbGluZyBmb3IgY29uZGl0aW9uLCBhZ2UsIGFuZCBiYXNlbGluZSAodzEpCm1vZGVsX3MxIDwtIHBvbHIoc2hxc2NyZWVuZXIxX3cxMiB+IGNvbmRpdGlvbiArIGFnZSArIGlkZW50aXR5X2dyb3VwX251bSArIHNocXNjcmVlbmVyMV93MSwgCiAgICAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsIEhlc3MgPSBUUlVFKQoKIyBNb2RlbCBmb3IgU2NyZWVuZXIgMgptb2RlbF9zMiA8LSBwb2xyKHNocXNjcmVlbmVyMl93MTIgfiBjb25kaXRpb24gKyBhZ2UgKyBpZGVudGl0eV9ncm91cF9udW0gKyAgc2hxc2NyZWVuZXIyX3cxLCAKICAgICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCgojIE1vZGVsIGZvciBTY3JlZW5lciAzCm1vZGVsX3MzIDwtIHBvbHIoc2hxc2NyZWVuZXIzX3cxMiB+IGNvbmRpdGlvbiArIGFnZSArIGlkZW50aXR5X2dyb3VwX251bSArIHNocXNjcmVlbmVyM193MSwgCiAgICAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsIEhlc3MgPSBUUlVFKQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDcmVhdGUgYSBDb21iaW5lZCBUYWJsZSBvZiBSZXN1bHRzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRpZHlfczEgPC0gdGlkeShtb2RlbF9zMSkgJT4lIG11dGF0ZShNb2RlbCA9ICJTY3JlZW5lciAxIikKdGlkeV9zMiA8LSB0aWR5KG1vZGVsX3MyKSAlPiUgbXV0YXRlKE1vZGVsID0gIlNjcmVlbmVyIDIiKQp0aWR5X3MzIDwtIHRpZHkobW9kZWxfczMpICU+JSBtdXRhdGUoTW9kZWwgPSAiU2NyZWVuZXIgMyIpCgojIENvbWJpbmUgdGhlIHJlc3VsdHMKcmVzdWx0cyA8LSBiaW5kX3Jvd3ModGlkeV9zMSwgdGlkeV9zMiwgdGlkeV9zMykKCmxpYnJhcnkoZHBseXIpCnJlc3VsdHMgPC0gcmVzdWx0cyAlPiUKICBtdXRhdGUoCiAgICBvZGRzX3JhdGlvID0gZXhwKGVzdGltYXRlKSwKICAgIHAudmFsdWUgPSAyICogcG5vcm0oLWFicyhzdGF0aXN0aWMpKQogICkgJT4lCiAgZHBseXI6OnNlbGVjdChNb2RlbCwgdGVybSwgZXN0aW1hdGUsIHN0ZC5lcnJvciwgb2Rkc19yYXRpbywgc3RhdGlzdGljLCBwLnZhbHVlKQoKIyBQcmludCB0aGUgdGFibGUKa2FibGUocmVzdWx0cywgZGlnaXRzID0gMywgY2FwdGlvbiA9ICJQcm9wb3J0aW9uYWwgT2RkcyBSZWdyZXNzaW9uIFJlc3VsdHMgQ29udHJvbGxpbmcgZm9yIEFnZSBhbmQgQmFzZWxpbmUgUmVzcG9uc2UgKFdlZWsgMSkiKQoKYGBgCgoKIyBTdXBwbGVtZW50YXJ5IE1hdGVyaWFsczogTWl4ZWQgRWZmZWN0cyBNb2RlbHMKVG8gZXZhbHVhdGUgaG93IG91dGNvbWVzIGNoYW5nZWQgb3ZlciB0aW1lIGFuZCB3aGV0aGVyIHRoZXNlIGNoYW5nZXMgZGlmZmVyZWQgYnkgY29uZGl0aW9uLCB3ZSBmaXQgbWl4ZWQtZWZmZWN0cyBtb2RlbHMgZm9yIGVhY2ggb2Ygb3VyIHByaW1hcnkgb3V0Y29tZSB2YXJpYWJsZXMuIFRoZXNlIG1vZGVscyBhY2NvdW50IGZvciBib3RoIHdpdGhpbi1wZXJzb24gY2hhbmdlIGFuZCBiZXR3ZWVuLXBlcnNvbiBkaWZmZXJlbmNlcy4KCkZvciBlYWNoIG91dGNvbWVtIHdlIHJhbiBhIGxpbmVhciBtaXhlZC1lZmZlY3RzIG1vZGVsIHVzaW5nIHRoZSBsbWVyKCkgZnVuY3Rpb24uCgpUaGUgbW9kZWxzIHRlc3RlZDoKICBNYWluIGVmZmVjdHMgb2YgV2VlayAodGltZSksIGNvbmRpdGlvbiwgYW5kIHRoZWlyIGludGVyYWN0aW9uCiAgQ292YXJpYXRlczogaWRlbnRpdHkgZ3JvdXAgYW5kIGFnZQogIEEgcmFuZG9tIGludGVyY2VwdCBhbmQgc2xvcGUgZm9yIGVhY2ggcGFydGljaXBhbnQgKChXZWVrICYgcHNpZCkpLCBhbGxvd2luZyBlYWNoIHBlcnNvbiB0byBoYXZlIHRoZWlyIG93biBiYXNlbGluZSBhbmQgcmF0ZSBvZiBjaGFuZ2Ugb3ZlciB0aW1lCiAgCiAgRW1vdGlvbiBSZWcgd2FzIHNpZ25pZmljYW50CiAgRGVwcmVzc2lvbiBzaWduaWZpY2FudAogIEFueGlldHkgbm90IHNpZ25pZmljYW50IChjbG9zZSB0byBtYXJnaW5hbCBwPS4xMS0gbW9yZSBldmlkZW5jZSBvZiB1bnN0YWJsZSBlZmZlY3QpCiAgCmBgYHtyfQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkoYnJvb20ubWl4ZWQpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShwZXJmb3JtYW5jZSkgICMgRm9yIHIyKCkKCiMgRGVmaW5lIHRoZSB2ZWN0b3Igb2Ygb3V0Y29tZXMgKGFzIHRoZXkgYXBwZWFyIGluIHRoZSBsb25nIGRhdGFzZXQpCm91dGNvbWVzIDwtIGMoIkRFUlM4X1N1bSIsICJHQUQ3X1N1bSIsICJQSFE5X1N1bSIpCgojIEluaXRpYWxpemUgYSBsaXN0IHRvIHN0b3JlIG1vZGVsIHN1bW1hcmllcyB3aXRoIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGFuZCBlZmZlY3Qgc2l6ZXMKcmVzdWx0c19saXN0IDwtIGxpc3QoKQoKIyBMb29wIG92ZXIgZWFjaCBvdXRjb21lIGFuZCBmaXQgdGhlIG1peGVkLWVmZmVjdHMgbW9kZWwgY29udHJvbGxpbmcgZm9yIGlkZW50aXR5X2dyb3VwX251bSBhbmQgYWdlCmZvciAob3V0Y29tZSBpbiBvdXRjb21lcykgewogIG1vZGVsIDwtIGxtZXIoYXMuZm9ybXVsYShwYXN0ZShvdXRjb21lLCAifiBXZWVrICogY29uZGl0aW9uICsgaWRlbnRpdHlfZ3JvdXAgKyBhZ2UgKyAoV2VlayB8IHBzaWQpIikpLAogICAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTG9uZ19NYXN0ZXIpCiAgCiAgIyBUaWR5IHRoZSBmaXhlZCBlZmZlY3RzIGVzdGltYXRlcwogIHRpZHlfbW9kZWwgPC0gdGlkeShtb2RlbCkKICAKICAjIE9idGFpbiA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIGZpeGVkIGVmZmVjdHMgdXNpbmcgdGhlIFdhbGQgbWV0aG9kCiAgY2lfbW9kZWwgPC0gY29uZmludChtb2RlbCwgbWV0aG9kID0gIldhbGQiLCBsZXZlbCA9IDAuOTUpCiAgY2lfZGYgPC0gYXMuZGF0YS5mcmFtZShjaV9tb2RlbCkKICBjaV9kZiR0ZXJtIDwtIHJvd25hbWVzKGNpX2RmKQogIAogICMgTWVyZ2UgdGhlIHRpZHkgb3V0cHV0IHdpdGggY29uZmlkZW5jZSBpbnRlcnZhbHMKICB0aWR5X21vZGVsIDwtIGxlZnRfam9pbih0aWR5X21vZGVsLCBjaV9kZiwgYnkgPSAidGVybSIpCiAgCiAgIyBDYWxjdWxhdGUgbWFyZ2luYWwgYW5kIGNvbmRpdGlvbmFsIFLCsiBhcyBlZmZlY3Qgc2l6ZXMKICByMl92YWxzIDwtIHIyKG1vZGVsKQogIAogICMgU3RvcmUgdGhlIHJlc3VsdHMgaW4gdGhlIGxpc3QKICByZXN1bHRzX2xpc3RbW291dGNvbWVdXSA8LSBsaXN0KAogICAgbW9kZWxfc3VtbWFyeSA9IHRpZHlfbW9kZWwsCiAgICByMiA9IHIyX3ZhbHMKICApCn0KCiMgTm93LCBmb3IgZGVtb25zdHJhdGlvbiwgbGV0J3MgcHJpbnQgdGhlIHN1bW1hcnkgZm9yIG9uZSBvdXRjb21lIChlLmcuLCBERVJTOF9TdW0pCnByaW50KGthYmxlKHJlc3VsdHNfbGlzdFtbIkRFUlM4X1N1bSJdXVtbIm1vZGVsX3N1bW1hcnkiXV0sIAogICAgICAgICAgICBjYXB0aW9uID0gIk1peGVkLUVmZmVjdHMgTW9kZWwgZm9yIERFUlM4X1N1bSB3aXRoIDk1JSBDSSIsIAogICAgICAgICAgICBkaWdpdHMgPSAzKSAlPiUga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpKQpjYXQoIlxuIikKcHJpbnQocmVzdWx0c19saXN0W1siREVSUzhfU3VtIl1dW1sicjIiXV0pCgpmb3IgKG91dGNvbWUgaW4gbmFtZXMocmVzdWx0c19saXN0KSkgewogICMgQ3JlYXRlIGEgY2FwdGlvbiB0aGF0IGluY2x1ZGVzIHRoZSBvdXRjb21lIG5hbWUKICBjYXB0aW9uX3RleHQgPC0gcGFzdGUoIk1peGVkLUVmZmVjdHMgTW9kZWwgZm9yIiwgb3V0Y29tZSwgIndpdGggOTUlIENJIikKICAKICAjIFByaW50IHRoZSBtb2RlbCBzdW1tYXJ5IHdpdGggYSBjYXB0aW9uIGFuZCBmb3JtYXR0ZWQgdGFibGUKICBwcmludChrYWJsZShyZXN1bHRzX2xpc3RbW291dGNvbWVdXVtbIm1vZGVsX3N1bW1hcnkiXV0sIAogICAgICAgICAgICAgIGNhcHRpb24gPSBjYXB0aW9uX3RleHQsIAogICAgICAgICAgICAgIGRpZ2l0cyA9IDMpICU+JSBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkpCiAgY2F0KCJcbiIpCiAgCiAgIyBQcmludCB0aGUgY29ycmVzcG9uZGluZyBSwrIgdmFsdWUocykKICBwcmludChyZXN1bHRzX2xpc3RbW291dGNvbWVdXVtbInIyIl1dKQogIGNhdCgiXG5cbiIpICAjIGV4dHJhIHNwYWNpbmcgYmV0d2VlbiBvdXRjb21lcwp9CgpgYGAKIyMjIE5ldyBBbmFseXNlczogRW5nYWdlbWVudAoKVFdFRVRTCgoqKk1ldGhvZHMgVGV4dDoqKiBQZXJjZWl2ZWQgZW5nYWdlbWVudCB3aXRoIHRoZSBpbnRlcnZlbnRpb24gd2FzIGFzc2Vzc2VkIHdlZWtseSB1c2luZyBhbiBhdmVyYWdlZCBjb21wb3NpdGUgbWVhc3VyZSAoVHdlZXRzX0F2ZykgdGhhdCByZWZsZWN0ZWQgaG93IHdlbGwgcGFydGljaXBhbnRzIGZlbHQgdGhlIGludGVydmVudGlvbiBmaXQgdGhlaXIgbmVlZHMgYW5kIGdvYWxzLiBUbyBleGFtaW5lIGNoYW5nZXMgaW4gZW5nYWdlbWVudCBxdWFsaXR5IG92ZXIgdGltZSwgd2UgZml0IGEgbGluZWFyIG1peGVkLWVmZmVjdHMgbW9kZWwgdXNpbmcgcmVzdHJpY3RlZCBtYXhpbXVtIGxpa2VsaWhvb2QgKFJFTUwpLiBXZWVrIHdhcyBpbmNsdWRlZCBhcyBhIGZpeGVkIGVmZmVjdCB0byBtb2RlbCBsaW5lYXIgY2hhbmdlLCBhbmQgcGFydGljaXBhbnQgSUQgKHBzaWQpIHdhcyBpbmNsdWRlZCBhcyBhIHJhbmRvbSBpbnRlcmNlcHQgdG8gYWNjb3VudCBmb3IgaW5kaXZpZHVhbCBkaWZmZXJlbmNlcyBpbiBiYXNlbGluZSBlbmdhZ2VtZW50IHBlcmNlcHRpb25zLiBUaGlzIG1vZGVsIHN0cnVjdHVyZSBhbGxvd2VkIHVzIHRvIGVzdGltYXRlIG92ZXJhbGwgdHJhamVjdG9yaWVzIG9mIHBlcmNlaXZlZCBlbmdhZ2VtZW50IHdoaWxlIGFjY29tbW9kYXRpbmcgcmVwZWF0ZWQgbWVhc3VyZXMgd2l0aGluIHBhcnRpY2lwYW50cy4gQW5hbHlzZXMgd2VyZSBjb25kdWN0ZWQgaW4gUiB1c2luZyB0aGUgbG1lNCBhbmQgbG1lclRlc3QgcGFja2FnZXMsIHdpdGggZGVncmVlcyBvZiBmcmVlZG9tIGVzdGltYXRlZCB1c2luZyBTYXR0ZXJ0aHdhaXRl4oCZcyBtZXRob2QuCgoqKlJlc3VsdHMgVGV4dDoqKiBUaGUgbGluZWFyIG1peGVkLWVmZmVjdHMgbW9kZWwgcmV2ZWFsZWQgYSBzaWduaWZpY2FudCBkZWNsaW5lIGluIHBlcmNlaXZlZCBlbmdhZ2VtZW50IGFjcm9zcyB0aGUgaW50ZXJ2ZW50aW9uIHBlcmlvZCAoYiA9IOKIkjAuMDQsIFNFID0gMC4wMDYsIHQoNTMxKSA9IOKIkjYuNjEsIHAgPCAuMDAxKS4gCgpgYGB7cn0KCnR3ZWV0c19kZXNjX2xvbmcgPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUKICBmaWx0ZXIoV2VlayA+PSA0KSAlPiUKICBncm91cF9ieShXZWVrKSAlPiUKICBzdW1tYXJpc2UoCiAgICBuID0gc3VtKCFpcy5uYShUd2VldHNfQXZnKSksCiAgICBtZWFuID0gbWVhbihUd2VldHNfQXZnLCBuYS5ybSA9IFRSVUUpLAogICAgc2QgPSBzZChUd2VldHNfQXZnLCBuYS5ybSA9IFRSVUUpLAogICAgc2UgPSBzZCAvIHNxcnQobiksCiAgICBtaW4gPSBtaW4oVHdlZXRzX0F2ZywgbmEucm0gPSBUUlVFKSwKICAgIG1heCA9IG1heChUd2VldHNfQXZnLCBuYS5ybSA9IFRSVUUpCiAgKSAlPiUKICBhcnJhbmdlKFdlZWspCgp0d2VldHNfZGVzY19sb25nCgpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkobG1lclRlc3QpCgp0d2VldHNfbW9kZWwgPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUKICBmaWx0ZXIoV2VlayA+PSA0LCAhaXMubmEoVHdlZXRzX0F2ZykpICU+JQogIGxtZXIoVHdlZXRzX0F2ZyB+IFdlZWsgKyAoMSB8IHBzaWQpLCBkYXRhID0gLikKCnN1bW1hcnkodHdlZXRzX21vZGVsKQoKZ2dwbG90KHR3ZWV0c19kZXNjLCBhZXMoeCA9IFdlZWssIHkgPSBtZWFuKSkgKwogIGdlb21fbGluZShzaXplID0gMSwgY29sb3IgPSAiIzMzNjY5OSIpICsKICBnZW9tX3BvaW50KHNpemUgPSAyLCBjb2xvciA9ICIjMzM2Njk5IikgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuIC0gc2UsIHltYXggPSBtZWFuICsgc2UpLAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjIsIGNvbG9yID0gIiMzMzY2OTkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgNCksIGJyZWFrcyA9IDA6NCkgKyAgIyA8LS0gc2V0cyB5LWF4aXMgMOKAkzQKICBsYWJzKAogICAgdGl0bGUgPSAiQXZlcmFnZSBFbmdhZ2VtZW50IChUV0VFVFMpIE92ZXIgVGltZSAoV2Vla3MgNOKAkzEzKSIsCiAgICB4ID0gIldlZWsiLAogICAgeSA9ICJNZWFuIFRXRUVUUyBTY29yZSAoMOKAkzQpIgogICkgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpCgoKYGBgCiMjIyMgTW9kZXJhdGlvbiBvZiBHZW5kZXIgSWRlbnRpdHkgd2l0aCBUV0VFVFMKCioqUmVzdWx0cyBUZXh0OioqIFRvIGV4cGxvcmUgd2hldGhlciBwZXJjZWl2ZWQgZW5nYWdlbWVudCB0cmFqZWN0b3JpZXMgZGlmZmVyZWQgYnkgZ2VuZGVyIGlkZW50aXR5LCB3ZSBleHRlbmRlZCB0aGUgbGluZWFyIG1peGVkLWVmZmVjdHMgbW9kZWwgdG8gaW5jbHVkZSBnZW5kZXIgaWRlbnRpdHkgKFRHRCB2cy4gY2lzZ2VuZGVyKSBhbmQgaXRzIGludGVyYWN0aW9uIHdpdGggV2Vlay4gVGhpcyBhbGxvd2VkIHVzIHRvIHRlc3QgYm90aCBiYXNlbGluZSBkaWZmZXJlbmNlcyBpbiBwZXJjZWl2ZWQgZml0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgcmF0ZSBvZiBjaGFuZ2Ugb3ZlciB0aW1lLgpUaGVyZSB3ZXJlIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIGluaXRpYWwgcGVyY2VwdGlvbnMgb2YgaW50ZXJ2ZW50aW9uIGZpdCBieSBnZW5kZXIgaWRlbnRpdHkgKGIgPSDiiJIwLjA2LCBTRSA9IDAuMTAsIHQoMTMwKSA9IOKIkjAuNjIsIHAgPSAuNTQpLiBIb3dldmVyLCBhIHNpZ25pZmljYW50IFdlZWsgw5cgR2VuZGVyIElkZW50aXR5IGludGVyYWN0aW9uIGVtZXJnZWQgKGIgPSAwLjAxNywgU0UgPSAwLjAwNiwgdCg1MzEpID0gMi45MywgcCA9IC4wMDM1KS4KU2ltcGxlIHNsb3BlcyBpbmRpY2F0ZWQgdGhhdCBib3RoIGdyb3VwcyBleHBlcmllbmNlZCBhIGRlY2xpbmUgaW4gZW5nYWdlbWVudCBvdmVyIHRpbWUsIGJ1dCB0aGUgZGVjbGluZSB3YXMgc3RlZXBlciBhbW9uZyBUR0QgcGFydGljaXBhbnRzIChiID0g4oiSMC4wNTYsIDk1JSBDSSBb4oiSMC4wNzMsIOKIkjAuMDQwXSkgdGhhbiBhbW9uZyBjaXNnZW5kZXIgcGFydGljaXBhbnRzIChiID0g4oiSMC4wMjIsIDk1JSBDSSBb4oiSMC4wMzgsIOKIkjAuMDA1XSkuCgoKYGBge3J9CnR3ZWV0c19wYiA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGZpbHRlcihXZWVrID49IDQsICFpcy5uYShUd2VldHNfQXZnKSwgIWlzLm5hKGlkZW50aXR5X2dyb3VwKSkKCmxpYnJhcnkobG1lNCkKbGlicmFyeShsbWVyVGVzdCkKCnR3ZWV0c19tb2RlbF9pZCA8LSBsbWVyKAogIFR3ZWV0c19BdmcgfiBXZWVrICogaWRlbnRpdHlfZ3JvdXAgKyAoMSB8IHBzaWQpLAogIGRhdGEgPSB0d2VldHNfcGIKKQoKc3VtbWFyeSh0d2VldHNfbW9kZWxfaWQpCgpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZW1tZWFucykKCiMgQ29tcHV0ZSBlc3RpbWF0ZWQgbWFyZ2luYWwgbWVhbnMgb3ZlciBXZWVrIGJ5IGlkZW50aXR5IGdyb3VwCmVtbV90d2VldHMgPC0gZW1tZWFucyh0d2VldHNfbW9kZWxfaWQsIH4gV2VlayAqIGlkZW50aXR5X2dyb3VwKQoKIyBQbG90IHByZWRpY3RlZCBsaW5lcyBmb3IgZWFjaCBncm91cAplbW1pcCh0d2VldHNfbW9kZWxfaWQsIGlkZW50aXR5X2dyb3VwIH4gV2VlaywKICAgICAgQ0lzID0gVFJVRSwKICAgICAgY292LnJlZHVjZSA9IHJhbmdlKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgNCksIGJyZWFrcyA9IDA6NCkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJFbmdhZ2VtZW50IChUV0VFVFMpIE92ZXIgVGltZSBieSBHZW5kZXIgSWRlbnRpdHkiLAogICAgeCA9ICJXZWVrIiwKICAgIHkgPSAiUHJlZGljdGVkIFRXRUVUUyBTY29yZSAoMOKAkzQpIiwKICAgIGNvbG9yID0gIkdlbmRlciBJZGVudGl0eSIKICApICsKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE0KQoKIyBTaW1wbGUgc2xvcGVzIGZvciBXZWVrIGF0IGVhY2ggaWRlbnRpdHkgZ3JvdXAKZW10cmVuZHModHdlZXRzX21vZGVsX2lkLCBwYWlyd2lzZSB+IGlkZW50aXR5X2dyb3VwLCB2YXIgPSAiV2VlayIpCgpsaWJyYXJ5KGVtbWVhbnMpCmxpYnJhcnkoZ2dwbG90MikKCiMgTWFrZSBzdXJlIFdlZWsgaXMgbnVtZXJpYyBpbiB0aGUgbW9kZWwgZGF0YQp0d2VldHNfcGIkV2VlayA8LSBhcy5udW1lcmljKHR3ZWV0c19wYiRXZWVrKQoKIyBHZXQgZXN0aW1hdGVkIG1hcmdpbmFsIG1lYW5zIGFjcm9zcyB0aGUgb2JzZXJ2ZWQgd2VlayByYW5nZQplbW1fdHdlZXRzIDwtIGVtbWVhbnMoCiAgdHdlZXRzX21vZGVsX2lkLAogIH4gV2VlayAqIGlkZW50aXR5X2dyb3VwLAogIGF0ID0gbGlzdChXZWVrID0gc2VxKDQsIDEzLCAxKSkgICMgZXhwbGljaXRseSBzZXQgd2VlayBwb2ludHMgNOKAkzEzCikKCmVtbV9kZiA8LSBhcy5kYXRhLmZyYW1lKGVtbV90d2VldHMpCgojIE5vdyBwbG90CmdncGxvdChlbW1fZGYsIGFlcyh4ID0gV2VlaywgeSA9IGVtbWVhbiwgY29sb3IgPSBpZGVudGl0eV9ncm91cCwgZmlsbCA9IGlkZW50aXR5X2dyb3VwKSkgKwogIGdlb21fbGluZShzaXplID0gMS4zKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBsb3dlci5DTCwgeW1heCA9IHVwcGVyLkNMKSwgYWxwaGEgPSAwLjE1LCBjb2xvciA9IE5BKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgNCksIGJyZWFrcyA9IDA6NCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSA0OjEzKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMzMzY2OTkiLCAiI0NDMzM2NiIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzMzNjY5OSIsICIjQ0MzMzY2IikpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRW5nYWdlbWVudCAoVFdFRVRTKSBPdmVyIFRpbWUgYnkgR2VuZGVyIElkZW50aXR5IiwKICAgIHN1YnRpdGxlID0gIlByZWRpY3RlZCBNYXJnaW5hbCBNZWFucyB3aXRoIDk1JSBDb25maWRlbmNlIEludGVydmFscyAoV2Vla3MgNOKAkzEzKSIsCiAgICB4ID0gIldlZWsiLAogICAgeSA9ICJQcmVkaWN0ZWQgVFdFRVRTIFNjb3JlICgw4oCTNCkiLAogICAgY29sb3IgPSAiR2VuZGVyIElkZW50aXR5IiwKICAgIGZpbGwgPSAiR2VuZGVyIElkZW50aXR5IgogICkgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTQpICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKQogICkKYGBgCg==