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.
We use the “final” datasets in which we removed participant C72, who
had no information on gender identity.
Preliminary Analyses
Sample Characteristics
These tables report the count of participants by condition, identity
group, and by condition x identity group.
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 |
Age: Descriptives and Check for Baseline differences
Summarizes age (Mean, SD, Min, Max) by condition and runs a t-test
comparing age by condition.
Table: Descriptive Statistics for Age by Condition (APA Format)
condition | Mean | SD | Min | Max |
|---|
Purrble Treatment | 20.44 | 2.29 | 16.00 | 25.00 |
Waitlist Control | 20.09 | 2.46 | 16.00 | 25.00 |
Dependent Variable | t | df | p | d | 95% CI |
|---|
age | 0.92 | 151.17 | .361 | 0.15 | [-0.17, 0.46] |
Race, Nationality, and Sexual Orientation Descriptives
Sexual Orientation- Simplified
Table X. Simplified Sexual Orientation by Condition (n, %)
| Sexual Orientation |
Waitlist (n, %) |
Purrble (n, %) |
Total (n, %) |
| asexual |
9 (11.7%) |
13 (17.1%) |
22 (14.4%) |
| bisexual |
25 (32.5%) |
28 (36.8%) |
53 (34.6%) |
| demisexual |
1 (1.3%) |
2 (2.6%) |
3 (2%) |
| gay/lesbian |
18 (23.4%) |
11 (14.5%) |
29 (19%) |
| heterosexual |
0 (0%) |
1 (1.3%) |
1 (0.7%) |
| pansexual |
9 (11.7%) |
8 (10.5%) |
17 (11.1%) |
| queer |
15 (19.5%) |
13 (17.1%) |
28 (18.3%) |
Nationality
Table: Nationality by Condition (Counts and
Percentages)
| bangladeshi |
1 (1.3%) |
0 (0%) |
1 (0.7%) |
| british |
36 (46.8%) |
34 (44.7%) |
70 (45.8%) |
| british-carribean |
1 (1.3%) |
1 (1.3%) |
2 (1.3%) |
| british-indian |
0 (0%) |
1 (1.3%) |
1 (0.7%) |
| british-japanese |
1 (1.3%) |
0 (0%) |
1 (0.7%) |
| british-pakistani |
1 (1.3%) |
0 (0%) |
1 (0.7%) |
| chinese |
5 (6.5%) |
1 (1.3%) |
6 (3.9%) |
| filipino |
0 (0%) |
1 (1.3%) |
1 (0.7%) |
| indian |
5 (6.5%) |
3 (3.9%) |
8 (5.2%) |
| indonesian |
1 (1.3%) |
0 (0%) |
1 (0.7%) |
| iranian |
1 (1.3%) |
0 (0%) |
1 (0.7%) |
| irish |
1 (1.3%) |
1 (1.3%) |
2 (1.3%) |
| irish-american |
0 (0%) |
1 (1.3%) |
1 (0.7%) |
| irish-carribean |
1 (1.3%) |
0 (0%) |
1 (0.7%) |
| malaysian chinese |
1 (1.3%) |
0 (0%) |
1 (0.7%) |
| mexican |
0 (0%) |
1 (1.3%) |
1 (0.7%) |
| nr |
20 (26%) |
29 (38.2%) |
49 (32%) |
| pakistani |
0 (0%) |
1 (1.3%) |
1 (0.7%) |
| polish |
2 (2.6%) |
2 (2.6%) |
4 (2.6%) |
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.
Participation Over Time
Note: Weeks 1-3 were considered “pre-test.” Purrble was given (or
not) after week 3. Weeks 11-13 are considered “Post-test”. ###
Participation in Each Week over Time Analyses for the entire study and
by treatment condition. Note: Something wonky in the table broken down
by condition where Week 4 appears out of order- I don’t know why. The
data is accurate.
### **Number of Participants in Each Condition**
Participant Counts by Condition
| Purrble |
76 |
| Waitlist Control |
77 |
### **Completion Counts Over Time**
Number of Participants Completing Each Week
| 1 |
146 |
| 2 |
148 |
| 3 |
149 |
| 4 |
141 |
| 5 |
138 |
| 6 |
138 |
| 7 |
138 |
| 8 |
141 |
| 9 |
126 |
| 10 |
128 |
| 11 |
128 |
| 12 |
117 |
| 13 |
130 |

### **Completion Counts by Week and Condition**
Number of Participants Completing Each Week (Columns: Weeks 1–13; Rows: Conditions)
| Condition |
1 |
2 |
3 |
5 |
6 |
7 |
8 |
9 |
10 |
12 |
13 |
4 |
11 |
| Purrble |
73 |
74 |
75 |
68 |
67 |
68 |
68 |
60 |
63 |
50 |
62 |
71 |
62 |
| Waitlist Control |
73 |
74 |
74 |
70 |
71 |
70 |
73 |
66 |
65 |
67 |
68 |
70 |
66 |

Follow-Up: Differences in Slope between the Two Groups Over
Time
We examined whether the rate of decline in weekly completion counts
differed between the Purrble and Waitlist Control groups by fitting a
linear regression on aggregated counts (Count) with predictors Week
(centered at Week 0), Condition (Waitlist Control = 0, Purrble = 1), and
their interaction (Week × Condition). The interaction term (Week ×
Condition) was significant, B = −0.87, SE = 0.31, p = .009, indicating
that the Purrble group’s weekly decline (approximately −1.52
participants per week) was significantly greater than in the Waitlist
Control group (−0.65 participants per week).
### **Linear Model: Count ~ Week × Condition**
Regression Coefficients for Count ~ Week * Condition
| Term |
Estimate |
Std. Error |
p-value |
| (Intercept) |
74.3076923 |
1.7131218 |
0.0000000 |
| Week |
-0.6483516 |
0.2158331 |
0.0065345 |
| conditionPurrble |
2.5769231 |
2.4227201 |
0.2990240 |
| Week:conditionPurrble |
-0.8736264 |
0.3052340 |
0.0090576 |
### **Interaction Term (Difference in Slope)**
Week:conditionPurrble — Slope Difference (Purrble vs Waitlist)
| Term |
Estimate |
Std. Error |
p-value |
| Week:conditionPurrble |
-0.8736264 |
0.305234 |
0.0090576 |
**Interpretation:**
The Week × condition interaction is statistically significant (p = 0.00906 ), indicating that the slope of completion counts over time differs between conditions.
Descriptives in Number of Sessions Attended
Descriptives of number of sessions attended by condition and gender
identity group.
Table 2: Overall Total Sessions Attended
| mean_sessions |
sd_sessions |
| 12.60784 |
2.155883 |
Table 3: Total Sessions Attended by Condition
| condition |
mean_sessions |
sd_sessions |
n |
| 0 |
12.85714 |
2.056532 |
77 |
| 1 |
12.35526 |
2.237284 |
76 |
Table 4: Total Sessions Attended by Gender Identity
| identity_group |
mean_sessions |
sd_sessions |
n |
| 0 |
12.53947 |
2.193571 |
76 |
| 1 |
12.67532 |
2.130243 |
77 |
Table 5: Total Sessions Attended by Condition and Gender Identity
| condition |
identity_group |
mean_sessions |
sd_sessions |
n |
| 0 |
0 |
13.13514 |
1.417395 |
37 |
| 0 |
1 |
12.60000 |
2.499231 |
40 |
| 1 |
0 |
11.97436 |
2.630661 |
39 |
| 1 |
1 |
12.75676 |
1.673410 |
37 |
Attrition Analysis
Attrition is defined here as not having attended any post-test
session (i.e., no attendance during Weeks 11–13). We create a binary
indicator for post-test completion (1 = attended at least one post-test
session, 0 = none) and calculate attrition rates overall, by condition
and by gender identity. We used a chi-square test to determine if
attrition differed by condition; it did not. ### Attrition Analysis by
Condition The conditions did not significantly differ on any of the
baseline measures of outcomes or by age. Attrition rates were low across
both conditions, with 9.2% of participants in the Purrble condition and
6.5% in the Waitlist Control condition not completing the study.
Attrition did not differ by condition, χ²(1) = 0.11, p = .75, or by
gender identity, χ²(1) < 0.01, p = 1.
Chi-square test for differences in attrition by condition:
Pearson's Chi-squared test with Yates' continuity correction
data: attrition_ct
X-squared = 0.10517, df = 1, p-value = 0.7457
Table 7: Attrition Rate by Condition (with Completed and Not Completed counts)
| condition |
n |
Completed |
Not_Completed |
attrition_rate |
attrition_percent |
| 0 |
77 |
72 |
5 |
0.0649351 |
6.5 |
| 1 |
76 |
69 |
7 |
0.0921053 |
9.2 |
Attrition by Gender Identity
No differences!
Chi-square test for differences in attrition by gender identity:
Pearson's Chi-squared test with Yates' continuity correction
data: attrition_ct
X-squared = 1.4323e-30, df = 1, p-value = 1
Table 8: 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 |
Attrition by Baseline Level of the Outcomes
In this section, we examined whether baseline scores on key outcome
measures were associated with either condition or attrition status, or
whether the effects of these two factors interacted. Loneliness was
significant; follow-up below
Two-way ANOVA results for Pre_DERS8_Sum :
Two-way ANOVA for Pre_DERS8_Sum by Condition and Attrition Status
| term |
df |
sumsq |
meansq |
statistic |
p.value |
| condition |
1 |
7.983 |
7.983 |
0.356 |
0.552 |
| attrition_status |
1 |
30.432 |
30.432 |
1.356 |
0.246 |
| condition:attrition_status |
1 |
2.561 |
2.561 |
0.114 |
0.736 |
| Residuals |
148 |
3320.444 |
22.435 |
NA |
NA |
Two-way ANOVA results for Pre_GAD7_Sum :
Two-way ANOVA for Pre_GAD7_Sum by Condition and Attrition Status
| term |
df |
sumsq |
meansq |
statistic |
p.value |
| condition |
1 |
0.658 |
0.658 |
0.041 |
0.841 |
| attrition_status |
1 |
1.190 |
1.190 |
0.073 |
0.787 |
| condition:attrition_status |
1 |
0.001 |
0.001 |
0.000 |
0.994 |
| Residuals |
148 |
2401.630 |
16.227 |
NA |
NA |
Two-way ANOVA results for Pre_PHQ9_Sum :
Two-way ANOVA for Pre_PHQ9_Sum by Condition and Attrition Status
| term |
df |
sumsq |
meansq |
statistic |
p.value |
| condition |
1 |
18.249 |
18.249 |
0.859 |
0.356 |
| attrition_status |
1 |
2.796 |
2.796 |
0.132 |
0.717 |
| condition:attrition_status |
1 |
4.207 |
4.207 |
0.198 |
0.657 |
| Residuals |
148 |
3144.123 |
21.244 |
NA |
NA |
Two-way ANOVA results for Pre_SHS_Pathways :
Two-way ANOVA for Pre_SHS_Pathways by Condition and Attrition Status
| term |
df |
sumsq |
meansq |
statistic |
p.value |
| condition |
1 |
35.106 |
35.106 |
1.907 |
0.169 |
| attrition_status |
1 |
3.918 |
3.918 |
0.213 |
0.645 |
| condition:attrition_status |
1 |
25.587 |
25.587 |
1.390 |
0.240 |
| Residuals |
144 |
2651.435 |
18.413 |
NA |
NA |
Two-way ANOVA results for Pre_SHS_Agency :
Two-way ANOVA for Pre_SHS_Agency by Condition and Attrition Status
| term |
df |
sumsq |
meansq |
statistic |
p.value |
| condition |
1 |
34.935 |
34.935 |
1.450 |
0.231 |
| attrition_status |
1 |
8.541 |
8.541 |
0.354 |
0.553 |
| condition:attrition_status |
1 |
79.905 |
79.905 |
3.315 |
0.071 |
| Residuals |
144 |
3470.489 |
24.101 |
NA |
NA |
Two-way ANOVA results for Pre_SHS_TotalHope :
Two-way ANOVA for Pre_SHS_TotalHope by Condition and Attrition Status
| term |
df |
sumsq |
meansq |
statistic |
p.value |
| condition |
1 |
140.081 |
140.081 |
2.039 |
0.155 |
| attrition_status |
1 |
24.029 |
24.029 |
0.350 |
0.555 |
| condition:attrition_status |
1 |
195.924 |
195.924 |
2.852 |
0.093 |
| Residuals |
144 |
9893.938 |
68.708 |
NA |
NA |
Two-way ANOVA results for Pre_ucla_Sum :
Two-way ANOVA for Pre_ucla_Sum by Condition and Attrition Status
| term |
df |
sumsq |
meansq |
statistic |
p.value |
| condition |
1 |
3.945 |
3.945 |
1.556 |
0.214 |
| attrition_status |
1 |
1.318 |
1.318 |
0.520 |
0.472 |
| condition:attrition_status |
1 |
13.182 |
13.182 |
5.199 |
0.024 |
| Residuals |
143 |
362.575 |
2.535 |
NA |
NA |
Two-way ANOVA results for Pre_pmerq_Focus_Avg :
Two-way ANOVA for Pre_pmerq_Focus_Avg by Condition and Attrition Status
| term |
df |
sumsq |
meansq |
statistic |
p.value |
| condition |
1 |
1.392 |
1.392 |
1.243 |
0.267 |
| attrition_status |
1 |
2.233 |
2.233 |
1.995 |
0.160 |
| condition:attrition_status |
1 |
1.281 |
1.281 |
1.144 |
0.287 |
| Residuals |
144 |
161.212 |
1.120 |
NA |
NA |
Two-way ANOVA results for Pre_pmerq_Distract_Avg :
Two-way ANOVA for Pre_pmerq_Distract_Avg by Condition and Attrition Status
| term |
df |
sumsq |
meansq |
statistic |
p.value |
| condition |
1 |
1.554 |
1.554 |
1.247 |
0.266 |
| attrition_status |
1 |
4.213 |
4.213 |
3.380 |
0.068 |
| condition:attrition_status |
1 |
0.038 |
0.038 |
0.031 |
0.861 |
| Residuals |
144 |
179.482 |
1.246 |
NA |
NA |
Two-way ANOVA results for Pre_pmerq_AD_Avg :
Two-way ANOVA for Pre_pmerq_AD_Avg by Condition and Attrition Status
| term |
df |
sumsq |
meansq |
statistic |
p.value |
| condition |
1 |
1.472 |
1.472 |
1.762 |
0.186 |
| attrition_status |
1 |
3.145 |
3.145 |
3.766 |
0.054 |
| condition:attrition_status |
1 |
0.440 |
0.440 |
0.527 |
0.469 |
| Residuals |
144 |
120.256 |
0.835 |
NA |
NA |
NA
UCLA Loneliess Follow Up:
Results: Among Attriters, baseline loneliness was
significantly higher in the Waitlist Control group compared to the
Purrble group, t(143) = 2.51, p = .013. Among Completers, there was no
significant difference in baseline loneliness scores by condition,
t(143) = 0.58, p = .56.
attrition_status = Attriter:
condition_factor emmean SE df lower.CL upper.CL
Waitlist Control 8.25 0.796 143 6.68 9.82
Purrble 5.67 0.650 143 4.38 6.95
attrition_status = Completer:
condition_factor emmean SE df lower.CL upper.CL
Waitlist Control 7.19 0.192 143 6.81 7.57
Purrble 7.03 0.193 143 6.65 7.41
Confidence level used: 0.95
attrition_status = Attriter:
contrast estimate SE df t.ratio p.value
Waitlist Control - Purrble 2.583 1.030 143 2.513 0.0131
attrition_status = Completer:
contrast estimate SE df t.ratio p.value
Waitlist Control - Purrble 0.159 0.272 143 0.584 0.5599
Cohen's d | 95% CI
-------------------------
0.10 | [-0.24, 0.43]
- Estimated using pooled SD.Cohen's d | 95% CI
------------------------
1.95 | [0.33, 3.48]
- Estimated using pooled SD.
Descriptive Statistics for Pre_ucla_Sum by Condition and Attrition Status |
|---|
condition | attrition_status | N | Mean | SD |
|---|
0 | Attriter | 5 | 8.25 | 0.96 |
0 | Completer | 72 | 7.19 | 1.35 |
1 | Attriter | 7 | 5.67 | 1.51 |
1 | Completer | 69 | 7.03 | 1.83 |
Note. Means and standard deviations for Pre_ucla_Sum across four groups defined by condition (Purrble, Waitlist Control) and attrition status (Completer, Attriter). |
Simple Effects Analysis: Pre_ucla_Sum by Attrition Status within the Purrble Condition
Dependent Variable | t | df | p | d | 95% CI |
|---|
Pre_ucla_Sum | -2.09 | 6.38 | .079 | -0.75 | [-1.60, 0.09] |
Simple Effects Analysis: Pre_ucla_Sum by Attrition Status within the Waitlist Control Condition
Dependent Variable | t | df | p | d | 95% CI |
|---|
Pre_ucla_Sum | 2.10 | 3.73 | .109 | 0.79 | [-0.23, 1.81] |
Baseline Outcome Variables Analyses
Reliability
DERS-8 Cronbach’s α = 0.886
GAD-7 Cronbach’s α = 0.87
PHQ-9 Cronbach’s α = 0.859
SHS Total Cronbach’s α = 0.867
UCLA Loneliness Cronbach’s α = 0.767
PMERQ-Engage Cronbach’s α = 0.869
Descriptive Analyses
The table below shows Pre- and Post-Test Descriptives for Study
Variables
### **Pre-Test Descriptive Statistics**
Descriptive Statistics for Pre-Test Data
| Pre_DERS8_Sum |
152 |
28.148 |
4.718 |
14.333 |
38.333 |
-0.419 |
-0.132 |
| Pre_GAD7_Sum |
152 |
13.715 |
3.990 |
3.000 |
22.000 |
-0.166 |
-0.457 |
| Pre_PHQ9_Sum |
152 |
15.044 |
4.581 |
3.000 |
26.667 |
-0.019 |
-0.098 |
| Pre_SHS_Pathways |
148 |
13.287 |
4.298 |
3.000 |
24.000 |
-0.132 |
-0.420 |
| Pre_SHS_Agency |
148 |
10.699 |
4.945 |
3.000 |
24.000 |
0.343 |
-0.657 |
| Pre_SHS_TotalHope |
148 |
23.986 |
8.352 |
8.000 |
46.000 |
0.286 |
-0.304 |
| Pre_ucla_Sum |
147 |
7.082 |
1.615 |
3.000 |
9.000 |
-0.499 |
-0.663 |
| Pre_pmerq_Focus_Avg |
148 |
2.737 |
1.063 |
1.000 |
6.000 |
0.420 |
-0.095 |
| Pre_pmerq_Distract_Avg |
148 |
4.233 |
1.123 |
1.000 |
6.000 |
-0.857 |
0.698 |
| Pre_pmerq_AD_Avg |
148 |
3.485 |
0.923 |
1.000 |
6.000 |
-0.334 |
0.520 |
### **Post-Test Descriptive Statistics**
Descriptive Statistics for Post-Test Data
| Post_DERS8_Sum |
141 |
26.972 |
7.343 |
8 |
40 |
-0.266 |
-0.835 |
| Post_GAD7_Sum |
141 |
12.613 |
4.994 |
1 |
22 |
-0.071 |
-0.771 |
| Post_PHQ9_Sum |
141 |
14.314 |
6.331 |
0 |
27 |
-0.004 |
-0.696 |
| Post_SHS_Pathways |
130 |
14.700 |
4.305 |
3 |
24 |
-0.266 |
-0.430 |
| Post_SHS_Agency |
130 |
12.646 |
5.228 |
3 |
24 |
-0.015 |
-0.855 |
| Post_SHS_TotalHope |
130 |
27.346 |
8.806 |
6 |
47 |
-0.058 |
-0.483 |
| Post_ucla_Sum |
130 |
6.785 |
1.698 |
3 |
9 |
-0.409 |
-0.678 |
| Post_pmerq_Focus_Avg |
129 |
3.008 |
1.185 |
1 |
6 |
0.289 |
-0.301 |
| Post_pmerq_Distract_Avg |
129 |
4.336 |
1.058 |
1 |
6 |
-1.127 |
1.635 |
| Post_pmerq_AD_Avg |
129 |
3.672 |
0.951 |
1 |
6 |
-0.334 |
0.951 |
Basleine Equivalence of Outcomes (t‑Tests):
We run independent samples t‑tests comparing the two conditions on
each pre‑test variable using nice_t_test from rempsyc. This provides
t‑statistics, degrees of freedom, p‑values, effect sizes (Cohen’s d),
and confidence intervals, all formatted into an APA‑style table.
Result: No differences by chance.
Outlier Detection and Visualization :
We first convert each pre‑test variable to z‑scores and flag any
observations with an absolute z‑score greater than 3 as potential
outliers. A summary table is created that lists the number of outliers
for each variable. We then specifically inspect the outliers for the
Pre_pmerq_Focus_Avg variable, which appears to have two cases exceeding
our threshold. To better understand the distribution of
Pre_pmerq_Focus_Avg, we generate a boxplot (with jittered data points)
that visually highlights the extreme values.
Summary of Potential Outliers (|z| > 3) for Pre-Test Variables:
Summary of Outliers for Pre-Test Variables (|z| >
3)
| Pre_DERS8_Sum |
0 |
| Pre_GAD7_Sum |
0 |
| Pre_PHQ9_Sum |
0 |
| Pre_SHS_Pathways |
0 |
| Pre_SHS_Agency |
0 |
| Pre_SHS_TotalHope |
0 |
| Pre_ucla_Sum |
0 |
| Pre_pmerq_Focus_Avg |
2 |
| Pre_pmerq_Distract_Avg |
0 |
| Pre_pmerq_AD_Avg |
0 |
Outliers for Pre_pmerq_Focus_Avg (|z| > 3):
Outliers for Pre_pmerq_Focus_Avg
| C57 |
6 |
3.069197 |
| C79 |
6 |
3.069197 |

Main Effects Analyses
We fit linear regression models to examine the effect of condition
(coded as 1 = Purrble, 0 = Waitlist Control) on post-test outcomes,
controlling for baseline levels of the outcome, gender identity
(numeric), and age. DERS-8: Participants in the Purrble condition
reported significantly better outcomes at post-test PPMERQ-AD: A
significant positive effect of condition was found PHQ-9: The Purrble
group showed lower depressive symptoms at post-test GAD-7: The condition
effect was also significant, though smaller, favoring Purrble
condition.
Dependent Variable | Predictor | df | b | t | p | sr2 | 95% CI |
|---|
Post_DERS8_Sum | condition_num | 135 | -3.04 | -3.20 | .002** | .04 | [0.00, 0.09] |
Pre_DERS8_Sum | 135 | 0.92 | 9.21 | < .001*** | .35 | [0.23, 0.48] |
identity_group_num | 135 | 1.69 | 1.72 | .088 | .01 | [0.00, 0.04] |
age | 135 | 0.13 | 0.60 | .549 | .00 | [0.00, 0.01] |
Post_pmerq_Focus_Avg | condition_num | 121 | 0.31 | 1.96 | .052 | .02 | [0.00, 0.05] |
Pre_pmerq_Focus_Avg | 121 | 0.73 | 9.40 | < .001*** | .39 | [0.26, 0.52] |
identity_group_num | 121 | -0.27 | -1.61 | .110 | .01 | [0.00, 0.04] |
age | 121 | 0.02 | 0.45 | .654 | .00 | [0.00, 0.01] |
Post_pmerq_Distract_Avg | condition_num | 121 | 0.25 | 1.49 | .138 | .01 | [0.00, 0.05] |
Pre_pmerq_Distract_Avg | 121 | 0.48 | 6.48 | < .001*** | .25 | [0.12, 0.38] |
identity_group_num | 121 | 0.20 | 1.19 | .238 | .01 | [0.00, 0.04] |
age | 121 | 0.02 | 0.64 | .526 | .00 | [0.00, 0.02] |
Post_pmerq_AD_Avg | condition_num | 121 | 0.30 | 2.28 | .024* | .02 | [0.00, 0.06] |
Pre_pmerq_AD_Avg | 121 | 0.70 | 9.54 | < .001*** | .42 | [0.29, 0.55] |
identity_group_num | 121 | -0.04 | -0.32 | .747 | .00 | [0.00, 0.01] |
age | 121 | 0.03 | 1.06 | .290 | .01 | [0.00, 0.02] |
Post_GAD7_Sum | condition_num | 135 | -1.35 | -2.04 | .044* | .02 | [0.00, 0.05] |
Pre_GAD7_Sum | 135 | 0.74 | 8.98 | < .001*** | .35 | [0.23, 0.48] |
identity_group_num | 135 | 0.75 | 1.08 | .281 | .01 | [0.00, 0.02] |
age | 135 | 0.27 | 1.84 | .068 | .01 | [0.00, 0.05] |
Post_PHQ9_Sum | condition_num | 135 | -2.60 | -3.64 | < .001*** | .04 | [0.00, 0.09] |
Pre_PHQ9_Sum | 135 | 1.00 | 12.96 | < .001*** | .53 | [0.42, 0.65] |
identity_group_num | 135 | 0.25 | 0.34 | .734 | .00 | [0.00, 0.00] |
age | 135 | 0.29 | 1.86 | .064 | .01 | [0.00, 0.03] |
Post_SHS_Pathways | condition_num | 122 | 0.09 | 0.14 | .889 | .00 | [0.00, 0.00] |
Pre_SHS_Pathways | 122 | 0.46 | 6.04 | < .001*** | .21 | [0.09, 0.34] |
identity_group_num | 122 | -0.84 | -1.19 | .237 | .01 | [0.00, 0.04] |
age | 122 | -0.28 | -1.86 | .065 | .02 | [0.00, 0.06] |
Post_SHS_Agency | condition_num | 122 | 0.44 | 0.53 | .595 | .00 | [0.00, 0.01] |
Pre_SHS_Agency | 122 | 0.53 | 6.57 | < .001*** | .26 | [0.13, 0.39] |
identity_group_num | 122 | -0.47 | -0.55 | .582 | .00 | [0.00, 0.01] |
age | 122 | -0.17 | -0.96 | .337 | .01 | [0.00, 0.03] |
Post_SHS_TotalHope | condition_num | 122 | 0.62 | 0.46 | .648 | .00 | [0.00, 0.01] |
Pre_SHS_TotalHope | 122 | 0.53 | 6.71 | < .001*** | .26 | [0.13, 0.39] |
identity_group_num | 122 | -1.16 | -0.82 | .414 | .00 | [0.00, 0.02] |
age | 122 | -0.43 | -1.45 | .151 | .01 | [0.00, 0.04] |
Post_ucla_Sum | condition_num | 121 | -0.09 | -0.40 | .688 | .00 | [0.00, 0.01] |
Pre_ucla_Sum | 121 | 0.70 | 10.02 | < .001*** | .43 | [0.30, 0.56] |
identity_group_num | 121 | 0.52 | 2.20 | .030* | .02 | [0.00, 0.06] |
age | 121 | 0.11 | 2.12 | .036* | .02 | [0.00, 0.05] |
Main Effects without outliers
Model Summary (Full Dataset):
Call:
lm(formula = Post_pmerq_Focus_Avg ~ condition_num + Pre_pmerq_Focus_Avg +
identity_group_num + age, data = Purrble_Master_Wide)
Residuals:
Min 1Q Median 3Q Max
-2.16585 -0.64258 -0.05799 0.42448 2.73318
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.67215 0.93052 0.722 0.4715
condition_num 0.31072 0.15864 1.959 0.0525 .
Pre_pmerq_Focus_Avg 0.73177 0.07788 9.396 4.43e-16 ***
identity_group_num -0.27202 0.16888 -1.611 0.1098
age 0.01586 0.03528 0.450 0.6538
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.8845 on 121 degrees of freedom
(27 observations deleted due to missingness)
Multiple R-squared: 0.4612, Adjusted R-squared: 0.4434
F-statistic: 25.89 on 4 and 121 DF, p-value: 1.635e-15
Model Summary (Outliers Removed):
Call:
lm(formula = Post_pmerq_Focus_Avg ~ condition_num + Pre_pmerq_Focus_Avg +
identity_group_num + age, data = Purrble_Master_Wide_no_outliers)
Residuals:
Min 1Q Median 3Q Max
-2.14889 -0.64074 -0.06666 0.43406 2.70464
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.72091 0.95012 0.759 0.4495
condition_num 0.31636 0.16113 1.963 0.0519 .
Pre_pmerq_Focus_Avg 0.71604 0.08537 8.388 1.17e-13 ***
identity_group_num -0.26936 0.17004 -1.584 0.1158
age 0.01469 0.03567 0.412 0.6812
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.8902 on 119 degrees of freedom
(27 observations deleted due to missingness)
Multiple R-squared: 0.4078, Adjusted R-squared: 0.3879
F-statistic: 20.48 on 4 and 119 DF, p-value: 7.335e-13
Influential Observations in the Full Model (Cook's Distance > 0.027):
[1] "C15" "C16" "C17" "C47" "C71" "T15" "T22" "T31" "T48"

Comparison of Model Estimates for Post_pmerq_Focus_Avg
| |
Model Number |
Dependent Variable |
Predictor |
df |
b |
t |
p |
sr2 |
CI_lower |
CI_upper |
| Full1 |
1 |
Post_pmerq_Focus_Avg |
condition_num |
121 |
0.311 |
1.959 |
0.052 |
0.017 |
0.000 |
0.051 |
| Full2 |
1 |
Post_pmerq_Focus_Avg |
Pre_pmerq_Focus_Avg |
121 |
0.732 |
9.396 |
0.000 |
0.393 |
0.263 |
0.523 |
| Full3 |
1 |
Post_pmerq_Focus_Avg |
identity_group_num |
121 |
-0.272 |
-1.611 |
0.110 |
0.012 |
0.000 |
0.039 |
| Full4 |
1 |
Post_pmerq_Focus_Avg |
age |
121 |
0.016 |
0.450 |
0.654 |
0.001 |
0.000 |
0.009 |
| No Outliers1 |
2 |
Post_pmerq_Focus_Avg |
condition_num |
119 |
0.316 |
1.963 |
0.052 |
0.019 |
0.000 |
0.057 |
| No Outliers2 |
2 |
Post_pmerq_Focus_Avg |
Pre_pmerq_Focus_Avg |
119 |
0.716 |
8.388 |
0.000 |
0.350 |
0.218 |
0.483 |
| No Outliers3 |
2 |
Post_pmerq_Focus_Avg |
identity_group_num |
119 |
-0.269 |
-1.584 |
0.116 |
0.012 |
0.000 |
0.043 |
| No Outliers4 |
2 |
Post_pmerq_Focus_Avg |
age |
119 |
0.015 |
0.412 |
0.681 |
0.001 |
0.000 |
0.009 |
Moderation Models for Main Effects
These models look at two questions: (1) Does the impact of condition
depend on participants’ baseline level of that outcome? and (2) Does the
impact of condition differ for TGD vs. cis participants? We find
significant moderation by gender identity for DERS-8 and GAD-7; none for
baseline version of the outcome.
Dependent Variable | Predictor | df | b* | t | p | sr2 | 95% CI |
|---|
Post_DERS8_Sum | condition_num | 134 | -0.21 | -3.17 | .002** | .04 | [0.00, 0.09] |
Pre_DERS8_Sum | 134 | 0.60 | 9.18 | < .001*** | .35 | [0.23, 0.48] |
identity_group_num | 134 | 0.12 | 1.71 | .089 | .01 | [0.00, 0.04] |
age | 134 | 0.04 | 0.53 | .595 | .00 | [0.00, 0.01] |
condition_num × Pre_DERS8_Sum | 134 | -0.04 | -0.65 | .517 | .00 | [0.00, 0.01] |
Dependent Variable | Predictor | df | b* | t | p | sr2 | 95% CI |
|---|
Post_pmerq_Focus_Avg | condition_num | 120 | 0.13 | 1.93 | .056 | .02 | [0.00, 0.05] |
Pre_pmerq_Focus_Avg | 120 | 0.65 | 9.35 | < .001*** | .39 | [0.26, 0.52] |
identity_group_num | 120 | -0.13 | -1.74 | .085 | .01 | [0.00, 0.04] |
age | 120 | 0.03 | 0.49 | .625 | .00 | [0.00, 0.01] |
condition_num × Pre_pmerq_Focus_Avg | 120 | -0.07 | -1.02 | .309 | .00 | [0.00, 0.02] |
Dependent Variable | Predictor | df | b* | t | p | sr2 | 95% CI |
|---|
Post_pmerq_Distract_Avg | condition_num | 120 | 0.11 | 1.45 | .150 | .01 | [0.00, 0.05] |
Pre_pmerq_Distract_Avg | 120 | 0.52 | 6.50 | < .001*** | .25 | [0.12, 0.38] |
identity_group_num | 120 | 0.10 | 1.18 | .241 | .01 | [0.00, 0.04] |
age | 120 | 0.06 | 0.66 | .510 | .00 | [0.00, 0.02] |
condition_num × Pre_pmerq_Distract_Avg | 120 | -0.05 | -0.67 | .505 | .00 | [0.00, 0.02] |
Dependent Variable | Predictor | df | b* | t | p | sr2 | 95% CI |
|---|
Post_pmerq_AD_Avg | condition_num | 120 | 0.15 | 2.24 | .027* | .02 | [0.00, 0.06] |
Pre_pmerq_AD_Avg | 120 | 0.67 | 9.45 | < .001*** | .42 | [0.29, 0.55] |
identity_group_num | 120 | -0.03 | -0.36 | .722 | .00 | [0.00, 0.01] |
age | 120 | 0.08 | 1.07 | .288 | .01 | [0.00, 0.02] |
condition_num × Pre_pmerq_AD_Avg | 120 | -0.03 | -0.38 | .704 | .00 | [0.00, 0.01] |
Dependent Variable | Predictor | df | b* | t | p | sr2 | 95% CI |
|---|
Post_DERS8_Sum | condition_num | 134 | -0.21 | -3.23 | .002** | .04 | [0.00, 0.09] |
identity_group_num | 134 | 0.12 | 1.75 | .082 | .01 | [0.00, 0.04] |
Pre_DERS8_Sum | 134 | 0.59 | 9.24 | < .001*** | .35 | [0.23, 0.47] |
age | 134 | 0.04 | 0.59 | .558 | .00 | [0.00, 0.01] |
condition_num × identity_group_num | 134 | 0.13 | 2.10 | .038* | .02 | [0.00, 0.05] |
Dependent Variable | Predictor | df | b* | t | p | sr2 | 95% CI |
|---|
Post_pmerq_Focus_Avg | condition_num | 120 | 0.13 | 2.01 | .046* | .02 | [0.00, 0.05] |
identity_group_num | 120 | -0.11 | -1.55 | .124 | .01 | [0.00, 0.04] |
Pre_pmerq_Focus_Avg | 120 | 0.68 | 9.65 | < .001*** | .41 | [0.28, 0.54] |
age | 120 | 0.03 | 0.48 | .630 | .00 | [0.00, 0.01] |
condition_num × identity_group_num | 120 | 0.12 | 1.79 | .076 | .01 | [0.00, 0.04] |
Dependent Variable | Predictor | df | b* | t | p | sr2 | 95% CI |
|---|
Post_pmerq_Distract_Avg | condition_num | 120 | 0.12 | 1.49 | .139 | .01 | [0.00, 0.05] |
identity_group_num | 120 | 0.10 | 1.19 | .238 | .01 | [0.00, 0.04] |
Pre_pmerq_Distract_Avg | 120 | 0.51 | 6.46 | < .001*** | .25 | [0.12, 0.38] |
age | 120 | 0.05 | 0.63 | .528 | .00 | [0.00, 0.02] |
condition_num × identity_group_num | 120 | 0.03 | 0.37 | .708 | .00 | [0.00, 0.01] |
Dependent Variable | Predictor | df | b* | t | p | sr2 | 95% CI |
|---|
Post_pmerq_AD_Avg | condition_num | 120 | 0.16 | 2.31 | .023* | .02 | [0.00, 0.06] |
identity_group_num | 120 | -0.02 | -0.30 | .766 | .00 | [0.00, 0.01] |
Pre_pmerq_AD_Avg | 120 | 0.68 | 9.65 | < .001*** | .43 | [0.30, 0.56] |
age | 120 | 0.08 | 1.09 | .279 | .01 | [0.00, 0.02] |
condition_num × identity_group_num | 120 | 0.09 | 1.30 | .197 | .01 | [0.00, 0.03] |
Dependent Variable | Predictor | df | b* | t | p | sr2 | 95% CI |
|---|
Post_GAD7_Sum | condition_num | 134 | -0.14 | -2.03 | .044* | .02 | [0.00, 0.05] |
Pre_GAD7_Sum | 134 | 0.59 | 8.85 | < .001*** | .35 | [0.22, 0.47] |
identity_group_num | 134 | 0.08 | 1.07 | .284 | .01 | [0.00, 0.02] |
age | 134 | 0.13 | 1.83 | .069 | .01 | [0.00, 0.05] |
condition_num × Pre_GAD7_Sum | 134 | 0.00 | 0.07 | .941 | .00 | [0.00, 0.00] |
Dependent Variable | Predictor | df | b* | t | p | sr2 | 95% CI |
|---|
Post_PHQ9_Sum | condition_num | 134 | -0.21 | -3.64 | < .001*** | .04 | [0.00, 0.09] |
Pre_PHQ9_Sum | 134 | 0.73 | 12.94 | < .001*** | .53 | [0.42, 0.64] |
identity_group_num | 134 | 0.02 | 0.40 | .687 | .00 | [0.00, 0.01] |
age | 134 | 0.11 | 1.83 | .070 | .01 | [0.00, 0.03] |
condition_num × Pre_PHQ9_Sum | 134 | -0.05 | -0.88 | .380 | .00 | [0.00, 0.01] |
Dependent Variable | Predictor | df | b* | t | p | sr2 | 95% CI |
|---|
Post_GAD7_Sum | condition_num | 134 | -0.13 | -2.05 | .042* | .02 | [0.00, 0.05] |
identity_group_num | 134 | 0.08 | 1.12 | .263 | .01 | [0.00, 0.02] |
Pre_GAD7_Sum | 134 | 0.58 | 8.95 | < .001*** | .34 | [0.22, 0.47] |
age | 134 | 0.13 | 1.85 | .067 | .01 | [0.00, 0.04] |
condition_num × identity_group_num | 134 | 0.14 | 2.18 | .031* | .02 | [0.00, 0.06] |
Dependent Variable | Predictor | df | b* | t | p | sr2 | 95% CI |
|---|
Post_PHQ9_Sum | condition_num | 134 | -0.20 | -3.64 | < .001*** | .04 | [0.00, 0.09] |
identity_group_num | 134 | 0.02 | 0.38 | .706 | .00 | [0.00, 0.00] |
Pre_PHQ9_Sum | 134 | 0.71 | 12.79 | < .001*** | .51 | [0.39, 0.63] |
age | 134 | 0.11 | 1.86 | .065 | .01 | [0.00, 0.03] |
condition_num × identity_group_num | 134 | 0.10 | 1.79 | .076 | .01 | [0.00, 0.03] |
Follow up: DERS 8
Since the interaction of condition by identity group was signifiacnt,
I have to probe it using simple slopes.
Result:
For cisgender participants, controlling for pre‑test emotion
regulation, condition significantly predicted post‑test scores, with the
intervention yielding lower (i.e., better) scores (b = –4.90, SE = 1.41,
t(67) = –3.47, p = .001, adjusted R² = .47). In contrast, for
transgender/gender diverse participants, condition was not a significant
predictor of post‑test emotion regulation (b = –1.07, SE = 1.23, t(67) =
–0.87, p = .39, adjusted R² = .37). sad.
Call:
lm(formula = Post_DERS8_Sum ~ condition_num + Pre_DERS8_Sum,
data = filter(Purrble_Master_Wide, identity_group == "0"))
Residuals:
Min 1Q Median 3Q Max
-15.085 -3.353 1.433 3.929 14.517
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.8137 4.9268 0.977 0.33206
condition_num -4.9030 1.4137 -3.468 0.00092 ***
Pre_DERS8_Sum 1.0170 0.1502 6.771 3.89e-09 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 5.885 on 67 degrees of freedom
(6 observations deleted due to missingness)
Multiple R-squared: 0.484, Adjusted R-squared: 0.4686
F-statistic: 31.43 on 2 and 67 DF, p-value: 2.361e-10
Call:
lm(formula = Post_DERS8_Sum ~ condition_num + Pre_DERS8_Sum,
data = filter(Purrble_Master_Wide, identity_group == "1"))
Residuals:
Min 1Q Median 3Q Max
-12.1803 -2.3719 0.0348 3.7168 10.4756
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 6.1183 4.1405 1.478 0.144
condition_num -1.0671 1.2265 -0.870 0.387
Pre_DERS8_Sum 0.8226 0.1274 6.456 1.41e-08 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 5.13 on 67 degrees of freedom
(7 observations deleted due to missingness)
Multiple R-squared: 0.3885, Adjusted R-squared: 0.3703
F-statistic: 21.29 on 2 and 67 DF, p-value: 6.971e-08
Follow up: GAD 7
Since the interaction of condition by identity group was signifiacnt,
I have to probe it using simple slopes. 0= Cisgender participants have
significant condition effect 1=Transgender participants have no
significant condition effect
Call:
lm(formula = Post_GAD7_Sum ~ condition_num + Pre_GAD7_Sum, data = filter(Purrble_Master_Wide,
identity_group == "0"))
Residuals:
Min 1Q Median 3Q Max
-9.9382 -2.9558 -0.6394 3.4989 9.1100
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.0008 2.4057 2.910 0.00490 **
condition_num -2.7678 1.0084 -2.745 0.00777 **
Pre_GAD7_Sum 0.6950 0.1314 5.289 1.46e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 4.211 on 67 degrees of freedom
(6 observations deleted due to missingness)
Multiple R-squared: 0.3567, Adjusted R-squared: 0.3375
F-statistic: 18.57 on 2 and 67 DF, p-value: 3.821e-07
Call:
lm(formula = Post_GAD7_Sum ~ condition_num + Pre_GAD7_Sum, data = filter(Purrble_Master_Wide,
identity_group == "1"))
Residuals:
Min 1Q Median 3Q Max
-8.2530 -2.1982 0.0676 2.7371 8.9484
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.0787 1.9095 1.089 0.280
condition_num 0.1055 0.8587 0.123 0.903
Pre_GAD7_Sum 0.7715 0.1018 7.577 1.39e-10 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 3.582 on 67 degrees of freedom
(7 observations deleted due to missingness)
Multiple R-squared: 0.4635, Adjusted R-squared: 0.4475
F-statistic: 28.94 on 2 and 67 DF, p-value: 8.721e-10
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.
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 |
— |
— |
— |
— |
— |
— |
— |
— |
| Waitlist Control |
0.87 |
0.452 |
1.02 |
0.412 |
1.15 |
0.546 |
0.91 |
0.434 |
| 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.090 |
0.363 |
1.094 |
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.412 |
1.917 |
4.102 |
0.736 |
0.462 |
| Screener 1 |
2|3 |
2.500 |
1.929 |
12.184 |
1.296 |
0.195 |
| Screener 1 |
3|4 |
4.935 |
1.980 |
139.059 |
2.493 |
0.013 |
| Screener 2 |
condition1 |
0.300 |
0.427 |
1.350 |
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.862 |
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.999 |
2.230 |
54.559 |
1.794 |
0.073 |
| Screener 2 |
2|3 |
5.510 |
2.266 |
247.255 |
2.432 |
0.015 |
| Screener 2 |
3|4 |
7.450 |
2.328 |
1719.687 |
3.200 |
0.001 |
| Screener 3 |
condition1 |
0.098 |
0.551 |
1.103 |
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.407 |
2.836 |
4.082 |
0.496 |
0.620 |
| Screener 3 |
2|3 |
2.698 |
2.858 |
14.846 |
0.944 |
0.345 |
Self-Harm Moderation Models: Gender Identity
No moderation effect of gender identity in proprtional odds
models.
Proportional Odds Regression Moderation Results (Condition *
Identity_Group_Num Interaction)
| Screener 1 |
condition1 |
0.619 |
1.174 |
1.857 |
0.527 |
0.598 |
| Screener 1 |
identity_group_num |
0.752 |
0.502 |
2.121 |
1.499 |
0.134 |
| Screener 1 |
age |
0.046 |
0.083 |
1.048 |
0.556 |
0.578 |
| Screener 1 |
shqscreener1_w1.L |
1.836 |
0.489 |
6.269 |
3.756 |
0.000 |
| Screener 1 |
shqscreener1_w1.Q |
-0.148 |
0.411 |
0.862 |
-0.360 |
0.719 |
| Screener 1 |
shqscreener1_w1.C |
0.202 |
0.325 |
1.224 |
0.622 |
0.534 |
| Screener 1 |
condition1:identity_group_num |
-0.351 |
0.741 |
0.704 |
-0.474 |
0.636 |
| Screener 1 |
1|2 |
1.687 |
2.007 |
5.404 |
0.840 |
0.401 |
| Screener 1 |
2|3 |
2.777 |
2.020 |
16.071 |
1.375 |
0.169 |
| Screener 1 |
3|4 |
5.207 |
2.066 |
182.494 |
2.520 |
0.012 |
| Screener 2 |
condition1 |
0.214 |
1.369 |
1.239 |
0.157 |
0.876 |
| Screener 2 |
identity_group_num |
1.381 |
0.592 |
3.978 |
2.332 |
0.020 |
| Screener 2 |
age |
0.122 |
0.094 |
1.129 |
1.295 |
0.195 |
| Screener 2 |
shqscreener2_w1.L |
3.215 |
0.751 |
24.905 |
4.280 |
0.000 |
| Screener 2 |
shqscreener2_w1.Q |
0.590 |
0.602 |
1.803 |
0.980 |
0.327 |
| Screener 2 |
shqscreener2_w1.C |
0.619 |
0.477 |
1.857 |
1.296 |
0.195 |
| Screener 2 |
condition1:identity_group_num |
0.055 |
0.838 |
1.057 |
0.066 |
0.947 |
| Screener 2 |
1|2 |
3.954 |
2.332 |
52.120 |
1.696 |
0.090 |
| Screener 2 |
2|3 |
5.464 |
2.368 |
236.111 |
2.308 |
0.021 |
| Screener 2 |
3|4 |
7.403 |
2.432 |
1640.376 |
3.043 |
0.002 |
| Screener 3 |
condition1 |
-0.321 |
1.761 |
0.725 |
-0.182 |
0.855 |
| Screener 3 |
identity_group_num |
-0.264 |
0.752 |
0.768 |
-0.351 |
0.725 |
| Screener 3 |
age |
0.002 |
0.125 |
1.002 |
0.015 |
0.988 |
| Screener 3 |
shqscreener3_w1.L |
0.290 |
0.846 |
1.337 |
0.343 |
0.732 |
| Screener 3 |
shqscreener3_w1.Q |
-0.699 |
0.669 |
0.497 |
-1.044 |
0.296 |
| Screener 3 |
condition1:identity_group_num |
0.290 |
1.155 |
1.336 |
0.251 |
0.802 |
| Screener 3 |
1|2 |
1.212 |
2.940 |
3.360 |
0.412 |
0.680 |
| Screener 3 |
2|3 |
2.504 |
2.960 |
12.233 |
0.846 |
0.398 |
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.165 |
3.733 |
5.937 |
148.275 |
0.000 |
14.848 |
29.481 |
| fixed |
NA |
Week |
-0.265 |
0.064 |
-4.120 |
152.297 |
0.000 |
-0.391 |
-0.139 |
| fixed |
NA |
conditionWaitlist Control |
-0.105 |
0.828 |
-0.127 |
148.835 |
0.899 |
-1.729 |
1.518 |
| fixed |
NA |
identity_groupTGD |
0.930 |
0.824 |
1.129 |
148.251 |
0.261 |
-0.685 |
2.545 |
| fixed |
NA |
age |
0.277 |
0.174 |
1.588 |
147.721 |
0.114 |
-0.065 |
0.619 |
| fixed |
NA |
Week:conditionWaitlist Control |
0.284 |
0.090 |
3.152 |
148.644 |
0.002 |
0.108 |
0.461 |
| ran_pars |
psid |
sd__(Intercept) |
4.594 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
-0.103 |
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.608 |
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.165 |
3.733 |
5.937 |
148.275 |
0.000 |
14.848 |
29.481 |
| fixed |
NA |
Week |
-0.265 |
0.064 |
-4.120 |
152.297 |
0.000 |
-0.391 |
-0.139 |
| fixed |
NA |
conditionWaitlist Control |
-0.105 |
0.828 |
-0.127 |
148.835 |
0.899 |
-1.729 |
1.518 |
| fixed |
NA |
identity_groupTGD |
0.930 |
0.824 |
1.129 |
148.251 |
0.261 |
-0.685 |
2.545 |
| fixed |
NA |
age |
0.277 |
0.174 |
1.588 |
147.721 |
0.114 |
-0.065 |
0.619 |
| fixed |
NA |
Week:conditionWaitlist Control |
0.284 |
0.090 |
3.152 |
148.644 |
0.002 |
0.108 |
0.461 |
| ran_pars |
psid |
sd__(Intercept) |
4.594 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
-0.103 |
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.608 |
NA |
NA |
NA |
NA |
NA |
NA |
# R2 for Mixed Models
Conditional R2: 0.717
Marginal R2: 0.037
Mixed-Effects Model for pmerq_Focus_Avg with 95% CI
| effect |
group |
term |
estimate |
std.error |
statistic |
df |
p.value |
2.5 % |
97.5 % |
| fixed |
NA |
(Intercept) |
3.943 |
0.738 |
5.345 |
149.531 |
0.000 |
2.497 |
5.389 |
| fixed |
NA |
Week |
0.048 |
0.012 |
4.139 |
125.908 |
0.000 |
0.025 |
0.070 |
| fixed |
NA |
conditionWaitlist Control |
0.258 |
0.188 |
1.372 |
143.494 |
0.172 |
-0.111 |
0.628 |
| fixed |
NA |
identity_groupTGD |
-0.476 |
0.163 |
-2.927 |
147.047 |
0.004 |
-0.794 |
-0.157 |
| fixed |
NA |
age |
-0.059 |
0.034 |
-1.705 |
146.966 |
0.090 |
-0.126 |
0.009 |
| fixed |
NA |
Week:conditionWaitlist Control |
-0.035 |
0.016 |
-2.192 |
129.157 |
0.030 |
-0.067 |
-0.004 |
| ran_pars |
psid |
sd__(Intercept) |
0.799 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
0.454 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
sd__Week |
0.021 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
Residual |
sd__Observation |
0.640 |
NA |
NA |
NA |
NA |
NA |
NA |
# R2 for Mixed Models
Conditional R2: 0.680
Marginal R2: 0.060
Mixed-Effects Model for pmerq_Distract_Avg with 95% CI
| effect |
group |
term |
estimate |
std.error |
statistic |
df |
p.value |
2.5 % |
97.5 % |
| fixed |
NA |
(Intercept) |
5.349 |
0.709 |
7.543 |
151.365 |
0.000 |
3.959 |
6.739 |
| fixed |
NA |
Week |
0.031 |
0.013 |
2.307 |
135.818 |
0.023 |
0.005 |
0.057 |
| fixed |
NA |
conditionWaitlist Control |
0.265 |
0.202 |
1.310 |
145.068 |
0.192 |
-0.132 |
0.662 |
| fixed |
NA |
identity_groupTGD |
0.086 |
0.156 |
0.552 |
146.638 |
0.582 |
-0.219 |
0.391 |
| fixed |
NA |
age |
-0.066 |
0.033 |
-2.006 |
146.580 |
0.047 |
-0.131 |
-0.002 |
| fixed |
NA |
Week:conditionWaitlist Control |
-0.035 |
0.019 |
-1.849 |
137.700 |
0.067 |
-0.071 |
0.002 |
| ran_pars |
psid |
sd__(Intercept) |
0.906 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
-0.412 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
sd__Week |
0.057 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
Residual |
sd__Observation |
0.648 |
NA |
NA |
NA |
NA |
NA |
NA |
# R2 for Mixed Models
Conditional R2: 0.650
Marginal R2: 0.031
Mixed-Effects Model for pmerq_AD_Avg with 95% CI
| effect |
group |
term |
estimate |
std.error |
statistic |
df |
p.value |
2.5 % |
97.5 % |
| fixed |
NA |
(Intercept) |
4.685 |
0.625 |
7.501 |
150.411 |
0.000 |
3.461 |
5.909 |
| fixed |
NA |
Week |
0.040 |
0.010 |
4.079 |
252.556 |
0.000 |
0.021 |
0.059 |
| fixed |
NA |
conditionWaitlist Control |
0.261 |
0.161 |
1.622 |
160.864 |
0.107 |
-0.054 |
0.576 |
| fixed |
NA |
identity_groupTGD |
-0.202 |
0.138 |
-1.465 |
147.788 |
0.145 |
-0.471 |
0.068 |
| fixed |
NA |
age |
-0.064 |
0.029 |
-2.205 |
147.697 |
0.029 |
-0.121 |
-0.007 |
| fixed |
NA |
Week:conditionWaitlist Control |
-0.035 |
0.014 |
-2.568 |
254.123 |
0.011 |
-0.062 |
-0.008 |
| ran_pars |
psid |
sd__(Intercept) |
0.674 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
0.999 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
sd__Week |
0.009 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
Residual |
sd__Observation |
0.552 |
NA |
NA |
NA |
NA |
NA |
NA |
# R2 for Mixed Models
Conditional R2: 0.661
Marginal R2: 0.042
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) |
10.890 |
2.892 |
3.766 |
149.580 |
0.000 |
5.222 |
16.558 |
| fixed |
NA |
Week |
-0.156 |
0.046 |
-3.411 |
153.831 |
0.001 |
-0.246 |
-0.066 |
| fixed |
NA |
conditionWaitlist Control |
-0.065 |
0.681 |
-0.095 |
149.312 |
0.924 |
-1.400 |
1.270 |
| fixed |
NA |
identity_groupTGD |
1.253 |
0.637 |
1.967 |
148.699 |
0.051 |
0.004 |
2.502 |
| fixed |
NA |
age |
0.110 |
0.135 |
0.815 |
148.162 |
0.416 |
-0.154 |
0.374 |
| fixed |
NA |
Week:conditionWaitlist Control |
0.103 |
0.064 |
1.608 |
148.732 |
0.110 |
-0.023 |
0.228 |
| ran_pars |
psid |
sd__(Intercept) |
3.702 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
-0.240 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
sd__Week |
0.293 |
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.141 |
3.462 |
4.085 |
148.102 |
0.000 |
7.356 |
20.926 |
| fixed |
NA |
Week |
-0.177 |
0.048 |
-3.705 |
153.199 |
0.000 |
-0.271 |
-0.083 |
| fixed |
NA |
conditionWaitlist Control |
-1.216 |
0.753 |
-1.614 |
148.674 |
0.109 |
-2.692 |
0.261 |
| fixed |
NA |
identity_groupTGD |
1.630 |
0.764 |
2.133 |
148.275 |
0.035 |
0.132 |
3.127 |
| fixed |
NA |
age |
0.038 |
0.162 |
0.234 |
147.817 |
0.816 |
-0.279 |
0.355 |
| fixed |
NA |
Week:conditionWaitlist Control |
0.222 |
0.067 |
3.320 |
148.205 |
0.001 |
0.091 |
0.353 |
| ran_pars |
psid |
sd__(Intercept) |
4.187 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
0.056 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
sd__Week |
0.313 |
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
Mixed-Effects Model for SHS_Pathways with 95% CI
| effect |
group |
term |
estimate |
std.error |
statistic |
df |
p.value |
2.5 % |
97.5 % |
| fixed |
NA |
(Intercept) |
18.228 |
2.760 |
6.604 |
153.499 |
0.000 |
12.818 |
23.638 |
| fixed |
NA |
Week |
0.180 |
0.053 |
3.423 |
139.625 |
0.001 |
0.077 |
0.283 |
| fixed |
NA |
conditionWaitlist Control |
0.879 |
0.807 |
1.088 |
148.196 |
0.278 |
-0.704 |
2.461 |
| fixed |
NA |
identity_groupTGD |
-1.888 |
0.605 |
-3.122 |
148.071 |
0.002 |
-3.074 |
-0.703 |
| fixed |
NA |
age |
-0.246 |
0.128 |
-1.924 |
148.121 |
0.056 |
-0.497 |
0.005 |
| fixed |
NA |
Week:conditionWaitlist Control |
-0.058 |
0.074 |
-0.783 |
141.089 |
0.435 |
-0.202 |
0.087 |
| ran_pars |
psid |
sd__(Intercept) |
3.517 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
-0.431 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
sd__Week |
0.201 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
Residual |
sd__Observation |
2.669 |
NA |
NA |
NA |
NA |
NA |
NA |
# R2 for Mixed Models
Conditional R2: 0.630
Marginal R2: 0.072
Mixed-Effects Model for SHS_Agency with 95% CI
| effect |
group |
term |
estimate |
std.error |
statistic |
df |
p.value |
2.5 % |
97.5 % |
| fixed |
NA |
(Intercept) |
11.036 |
3.221 |
3.426 |
151.999 |
0.001 |
4.723 |
17.350 |
| fixed |
NA |
Week |
0.239 |
0.063 |
3.810 |
135.590 |
0.000 |
0.116 |
0.361 |
| fixed |
NA |
conditionWaitlist Control |
0.986 |
0.897 |
1.099 |
144.887 |
0.274 |
-0.773 |
2.745 |
| fixed |
NA |
identity_groupTGD |
-1.511 |
0.707 |
-2.136 |
147.876 |
0.034 |
-2.897 |
-0.124 |
| fixed |
NA |
age |
-0.045 |
0.150 |
-0.300 |
147.892 |
0.765 |
-0.338 |
0.249 |
| fixed |
NA |
Week:conditionWaitlist Control |
-0.069 |
0.088 |
-0.782 |
136.888 |
0.435 |
-0.240 |
0.103 |
| ran_pars |
psid |
sd__(Intercept) |
3.946 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
-0.349 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
sd__Week |
0.294 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
Residual |
sd__Observation |
2.928 |
NA |
NA |
NA |
NA |
NA |
NA |
# R2 for Mixed Models
Conditional R2: 0.669
Marginal R2: 0.051
Mixed-Effects Model for SHS_TotalHope with 95% CI
| effect |
group |
term |
estimate |
std.error |
statistic |
df |
p.value |
2.5 % |
97.5 % |
| fixed |
NA |
(Intercept) |
29.159 |
5.488 |
5.313 |
152.155 |
0.000 |
18.402 |
39.915 |
| fixed |
NA |
Week |
0.419 |
0.103 |
4.076 |
138.799 |
0.000 |
0.217 |
0.620 |
| fixed |
NA |
conditionWaitlist Control |
1.843 |
1.525 |
1.209 |
146.500 |
0.229 |
-1.146 |
4.831 |
| fixed |
NA |
identity_groupTGD |
-3.422 |
1.205 |
-2.840 |
147.951 |
0.005 |
-5.784 |
-1.060 |
| fixed |
NA |
age |
-0.285 |
0.255 |
-1.118 |
148.046 |
0.265 |
-0.785 |
0.215 |
| fixed |
NA |
Week:conditionWaitlist Control |
-0.125 |
0.144 |
-0.869 |
139.873 |
0.386 |
-0.406 |
0.157 |
| ran_pars |
psid |
sd__(Intercept) |
7.134 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
-0.419 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
sd__Week |
0.522 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
Residual |
sd__Observation |
4.604 |
NA |
NA |
NA |
NA |
NA |
NA |
# R2 for Mixed Models
Conditional R2: 0.714
Marginal R2: 0.070
Mixed-Effects Model for ucla_Sum with 95% CI
| effect |
group |
term |
estimate |
std.error |
statistic |
df |
p.value |
2.5 % |
97.5 % |
| fixed |
NA |
(Intercept) |
6.511 |
1.162 |
5.602 |
150.166 |
0.000 |
4.232 |
8.789 |
| fixed |
NA |
Week |
-0.028 |
0.017 |
-1.668 |
134.259 |
0.098 |
-0.060 |
0.005 |
| fixed |
NA |
conditionWaitlist Control |
0.301 |
0.295 |
1.019 |
144.435 |
0.310 |
-0.278 |
0.880 |
| fixed |
NA |
identity_groupTGD |
0.498 |
0.256 |
1.948 |
146.945 |
0.053 |
-0.003 |
1.000 |
| fixed |
NA |
age |
0.013 |
0.054 |
0.240 |
147.172 |
0.810 |
-0.093 |
0.119 |
| fixed |
NA |
Week:conditionWaitlist Control |
-0.008 |
0.023 |
-0.366 |
136.105 |
0.715 |
-0.054 |
0.037 |
| ran_pars |
psid |
sd__(Intercept) |
1.389 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
cor__(Intercept).Week |
-0.052 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
psid |
sd__Week |
0.045 |
NA |
NA |
NA |
NA |
NA |
NA |
| ran_pars |
Residual |
sd__Observation |
0.888 |
NA |
NA |
NA |
NA |
NA |
NA |
# R2 for Mixed Models
Conditional R2: 0.729
Marginal R2: 0.030
LS0tCnRpdGxlOiAnUHVycmJsZSBSQ1QgRW50aXJlIFJlc3VsdHMgd2l0aCBXcml0ZSBVcCcKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIFJlY29yZGluZyBLZWVwaW5nOiAKClRoZXJlIGFyZSB0d28gbWFzdGVyIGZpbGVzIHRoYXQgd2UgYXJlIHVzaW5nIGZvciBhbmFseXNlcy4gVGhleSBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUgZmlsZSwgdGhvdWdoIG9uZSBpcyBpbiB3aWRlIGZvcm1hdCBhbmQgdGhlIG90aGVyIGlzIGluIGxvbmcgZm9ybWF0LgoKVGhlIHdpZGUgZm9ybWF0IGRhdGFzZXQgaXMgY2FsbGVkIOKAnFB1cnJibGVfTWFzdGVyX1dpZGUu4oCdIFRoZSBsb25nIGRhdGFzZXQgZm9ybWF0IGRhdGFzZXQgaXMgY2FsbGVkIOKAnFB1cnJibGVfTG9uZ19NYXN0ZXIu4oCdIFRoZSB3aWRlIGRhdGFzZXQgaGFzIGFsbCBvZiB0aGUgcHJlIGFuZCBwb3N0dGVzdCB2YXJpYWJsZXMgY2FsY3VsYXRlZCwgd2hpbGUgdGhlIGxvbmcgZG9lcyBub3QuIE90aGVyd2lzZSwgdGhleSBkbyBub3QgZGlmZmVyLiAKClRoaXMgZGF0YXNldCBpbmNsdWRlcyB0aGUgTj0xNTMgcGFydGljaXBhbnRzIHdobyB3ZXJlIGluY2x1ZGVkIGluIHRoZSByYW5kb21pemVkIGNvbnRyb2wgdHJpYWwgZXhhbWluaW5nIFB1cnJibGUgd2l0aCBhIHBvcHVsYXRpb24gb2YgdW5pdmVyc2l0eSBzdHVkZW50cy4gQWxsIHBhcnRpY2lwYW50cyB3ZXJlIG1lbWJlcnMgb2YgdGhlIExHVEJRKyBjb21tdW5pdHkuCgpXZSB1c2UgdGhlICJmaW5hbCIgZGF0YXNldHMgaW4gd2hpY2ggd2UgcmVtb3ZlZCBwYXJ0aWNpcGFudCBDNzIsIHdobyBoYWQgbm8gaW5mb3JtYXRpb24gb24gZ2VuZGVyIGlkZW50aXR5LgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIGluY2x1ZGUgPSBUUlVFLCAgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCgpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShncmlkRXh0cmEpIApsaWJyYXJ5KHBhdGNod29yaykgICAgICAKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobG1lNCkKbGlicmFyeShtYXJrZG93bikKbGlicmFyeShzdGFyZ2F6ZXIpCmxpYnJhcnkoTU9URSkKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShicm9vbSkKbGlicmFyeShicm9vbS5taXhlZCkgCmxpYnJhcnkodGlkeW1vZGVscykgCmxpYnJhcnkobXVsdGlsZXZlbG1vZCkgCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZWZmZWN0c2l6ZSkKbGlicmFyeShndCkKbGlicmFyeShyZW1wc3ljKSAKCiMgUmVtb3ZlIEM3MiBiZWNhdXNlIHRoZXkgaGF2ZSBubyBnZW5kZXLigJBpZGVudGl0eSBpbmZvcm1hdGlvbgpwdXJyYmxlX3dpZGVfZmluYWwgPC0gcHVycmJsZV93aWRlX2ZpbmFsICU+JQogIGZpbHRlcihwc2lkICE9ICJDNzIiKQoKIyAzYSkgT3ZlcndyaXRlIGZpbmFsIGZpbGUKd3JpdGVfY3N2KHB1cnJibGVfd2lkZV9maW5hbCwgInB1cnJibGVfd2lkZV9maW5hbC5jc3YiKQoKYGBgCiMgUHJlbGltaW5hcnkgQW5hbHlzZXMKCiMjIFNhbXBsZSBDaGFyYWN0ZXJpc3RpY3MKVGhlc2UgdGFibGVzIHJlcG9ydCB0aGUgY291bnQgb2YgcGFydGljaXBhbnRzIGJ5IGNvbmRpdGlvbiwgaWRlbnRpdHkgZ3JvdXAsIGFuZCBieSBjb25kaXRpb24geCBpZGVudGl0eSBncm91cC4KYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgVGFibGUgMTogTnVtYmVyIG9mIFBhcnRpY2lwYW50cyBieSBDb25kaXRpb24KY29uZGl0aW9uX2NvdW50cyA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRpc3RpbmN0KHBzaWQsIGNvbmRpdGlvbikgJT4lCiAgY291bnQoY29uZGl0aW9uLCBuYW1lID0gIkNvdW50IikgJT4lCiAgYXJyYW5nZShjb25kaXRpb24pICU+JQogIGFkZF9yb3coY29uZGl0aW9uID0gIlRvdGFsIiwgQ291bnQgPSBzdW0oLiRDb3VudCkpCgojIFRhYmxlIDI6IE51bWJlciBvZiBQYXJ0aWNpcGFudHMgYnkgR2VuZGVyIElkZW50aXR5CmlkZW50aXR5X2NvdW50cyA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRpc3RpbmN0KHBzaWQsIGlkZW50aXR5X2dyb3VwKSAlPiUKICBtdXRhdGUoaWRlbnRpdHlfZ3JvdXAgPSByZWNvZGUoaWRlbnRpdHlfZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDIiA9ICJDaXNnZW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEdEIiA9ICJUcmFuc2dlbmRlciIpKSAlPiUKICBjb3VudChpZGVudGl0eV9ncm91cCwgbmFtZSA9ICJDb3VudCIpICU+JQogIGFycmFuZ2UoaWRlbnRpdHlfZ3JvdXApICU+JQogIGFkZF9yb3coaWRlbnRpdHlfZ3JvdXAgPSAiVG90YWwiLCBDb3VudCA9IHN1bSguJENvdW50KSkKCiMgVGFibGUgMzogQ3Jvc3MtdGFidWxhdGlvbiBvZiBDb25kaXRpb24gYnkgR2VuZGVyIElkZW50aXR5CmNyb3NzX3RhYiA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRpc3RpbmN0KHBzaWQsIGNvbmRpdGlvbiwgaWRlbnRpdHlfZ3JvdXApICU+JQogIG11dGF0ZShpZGVudGl0eV9ncm91cCA9IHJlY29kZShpZGVudGl0eV9ncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkMiID0gIkNpc2dlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUR0IiID0gIlRyYW5zZ2VuZGVyIikpICU+JQogIGNvdW50KGNvbmRpdGlvbiwgaWRlbnRpdHlfZ3JvdXApICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpZGVudGl0eV9ncm91cCwgdmFsdWVzX2Zyb20gPSBuLCB2YWx1ZXNfZmlsbCA9IGxpc3QobiA9IDApKQoKIyBEaXNwbGF5IHRoZSB0YWJsZXMgdXNpbmcga2FibGUKa2FibGUoY29uZGl0aW9uX2NvdW50cywgY2FwdGlvbiA9ICJUYWJsZSAxOiBOdW1iZXIgb2YgUGFydGljaXBhbnRzIGJ5IENvbmRpdGlvbiIsIGZvcm1hdCA9ICJtYXJrZG93biIpCmthYmxlKGlkZW50aXR5X2NvdW50cywgY2FwdGlvbiA9ICJUYWJsZSAyOiBOdW1iZXIgb2YgUGFydGljaXBhbnRzIGJ5IEdlbmRlciBJZGVudGl0eSIsIGZvcm1hdCA9ICJtYXJrZG93biIpCmthYmxlKGNyb3NzX3RhYiwgY2FwdGlvbiA9ICJUYWJsZSAzOiBDcm9zcy10YWJ1bGF0aW9uIG9mIENvbmRpdGlvbiBieSBHZW5kZXIgSWRlbnRpdHkiLCBmb3JtYXQgPSAibWFya2Rvd24iKQpgYGAKIyMgQWdlOiBEZXNjcmlwdGl2ZXMgYW5kIENoZWNrIGZvciBCYXNlbGluZSBkaWZmZXJlbmNlcyAKU3VtbWFyaXplcyBhZ2UgKE1lYW4sIFNELCBNaW4sIE1heCkgYnkgY29uZGl0aW9uIGFuZCBydW5zIGEgdC10ZXN0IGNvbXBhcmluZyBhZ2UgYnkgY29uZGl0aW9uLgpgYGB7cn0KIyBMb2FkIHJlcXVpcmVkIHBhY2thZ2VzCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkocmVtcHN5YykgCiMgaWYgbm90IGluc3RhbGxlZCwgcnVuOiBpbnN0YWxsLnBhY2thZ2VzKCJyZW1wc3ljIikKCiMgUHJlcGFyZSBkYXRhOiBlbnN1cmUgb25lIG9ic2VydmF0aW9uIHBlciBwYXJ0aWNpcGFudAphZ2VfZGF0YSA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JSAKICBkaXN0aW5jdChwc2lkLCBjb25kaXRpb24sIGFnZSkKCiMgQ29tcHV0ZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIChNZWFuLCBTRCwgTWluLCBNYXgpIGJ5IGNvbmRpdGlvbgpkZXNjcmlwdGl2ZV9zdGF0cyA8LSBhZ2VfZGF0YSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZSgKICAgIE1lYW4gPSBtZWFuKGFnZSwgbmEucm0gPSBUUlVFKSwKICAgIFNEICAgPSBzZChhZ2UsIG5hLnJtID0gVFJVRSksCiAgICBNaW4gID0gbWluKGFnZSwgbmEucm0gPSBUUlVFKSwKICAgIE1heCAgPSBtYXgoYWdlLCBuYS5ybSA9IFRSVUUpCiAgKSAlPiUgCiAgdW5ncm91cCgpCgpjYXQoIlRhYmxlOiBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzIGZvciBBZ2UgYnkgQ29uZGl0aW9uIChBUEEgRm9ybWF0KVxuXG4iKQojIERpc3BsYXkgdGhlIEFQQS1mb3JtYXR0ZWQgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyB0YWJsZQpuaWNlX3RhYmxlKGRlc2NyaXB0aXZlX3N0YXRzKQoKIyBFbnN1cmUgb25lIG9ic2VydmF0aW9uIHBlciBwYXJ0aWNpcGFudCBmb3IgYWdlCmFnZV9kYXRhIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lIAogIGRpc3RpbmN0KHBzaWQsIGNvbmRpdGlvbiwgYWdlKQoKIyBSdW4gdGhlIHQtdGVzdCB1c2luZyByZW1wc3ljJ3MgbmljZV90X3Rlc3QoKSBmdW5jdGlvbgphZ2VfdHRlc3RfcmVzdWx0cyA8LSBuaWNlX3RfdGVzdCgKICBkYXRhID0gYWdlX2RhdGEsCiAgcmVzcG9uc2UgPSAiYWdlIiwKICBncm91cCA9ICJjb25kaXRpb24iLAogIHdhcm5pbmcgPSBGQUxTRQopCgojIERpc3BsYXkgYSBwdWJsaWNhdGlvbi1yZWFkeSB0LXRlc3QgdGFibGUKbmljZV90YWJsZShhZ2VfdHRlc3RfcmVzdWx0cykKYGBgCiMjIFJhY2UsIE5hdGlvbmFsaXR5LCBhbmQgU2V4dWFsIE9yaWVudGF0aW9uIERlc2NyaXB0aXZlcwojIyMgU2V4dWFsIE9yaWVudGF0aW9uLSBTaW1wbGlmaWVkCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIDEuIE9uZSByb3cgcGVyIHBhcnRpY2lwYW50LCBwZXIgc2ltcGxpZmllZCBvcmllbnRhdGlvbgpzb19jb3VudHMgPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUKICBkaXN0aW5jdChwc2lkLCBjb25kaXRpb24sIHNvX3NpbXBsaWZpZWQpICU+JQogIG11dGF0ZShzb19zaW1wbGlmaWVkID0gdG9sb3dlcihzb19zaW1wbGlmaWVkKSkgJT4lCiAgY291bnQoc29fc2ltcGxpZmllZCwgY29uZGl0aW9uKSAlPiUKICBwaXZvdF93aWRlcigKICAgIG5hbWVzX2Zyb20gID0gY29uZGl0aW9uLAogICAgdmFsdWVzX2Zyb20gPSBuLAogICAgdmFsdWVzX2ZpbGwgPSBsaXN0KG4gPSAwKQogICkKIyBOb3cgc29fY291bnRzIGhhcyBjb2x1bW5zOiAic29fc2ltcGxpZmllZCIsICJQdXJyYmxlIFRyZWF0bWVudCIsICJXYWl0bGlzdCBDb250cm9sIgoKIyAyLiBBZGQgVG90YWwgdmlhIGFjcm9zcygpIChpLmUuLCBzdW0gdGhlIG51bWVyaWMgY29sdW1ucykKc29fY291bnRzIDwtIHNvX2NvdW50cyAlPiUKICBtdXRhdGUoCiAgICBUb3RhbCA9IHJvd1N1bXMoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpKSkKICApCgojIDMuIERlbm9taW5hdG9ycyBmb3IgcGVyY2VudCBjYWxjdWxhdGlvbgpkZW5vbV9zbyA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRpc3RpbmN0KHBzaWQsIGNvbmRpdGlvbikgJT4lCiAgY291bnQoY29uZGl0aW9uLCBuYW1lID0gInRvdGFsIikKIyBlLmcuLCBkZW5vbV9zbyR0b3RhbFsgZGVub21fc28kY29uZGl0aW9uID09ICJXYWl0bGlzdCBDb250cm9sIiBdIGlzIHRoZSBOIGZvciBXYWl0bGlzdAoKb3ZlcmFsbF9kZW5vbSA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRpc3RpbmN0KHBzaWQpICU+JQogIG5yb3coKQoKIyA0LiBCdWlsZCB0aGUgZGlzcGxheSB0YWJsZSwgcmVmZXJyaW5nIHRvIHRoZSBhY3R1YWwgY29sdW1uIG5hbWVzOgpzb190YWJsZV9maW5hbCA8LSBzb19jb3VudHMgJT4lCiAgbXV0YXRlKAogICAgYFdhaXRsaXN0IChuLCAlKWAgPSBwYXN0ZTAoCiAgICAgIGBXYWl0bGlzdCBDb250cm9sYCwgCiAgICAgICIgKCIsIHJvdW5kKAogICAgICAgICAgICAgYFdhaXRsaXN0IENvbnRyb2xgIC8KICAgICAgICAgICAgIGRlbm9tX3NvJHRvdGFsWyBkZW5vbV9zbyRjb25kaXRpb24gPT0gIldhaXRsaXN0IENvbnRyb2wiIF0gKiAxMDAsIAogICAgICAgICAgIDEpLAogICAgICAiJSkiCiAgICApLAogICAgYFB1cnJibGUgKG4sICUpYCA9IHBhc3RlMCgKICAgICAgYFB1cnJibGUgVHJlYXRtZW50YCwKICAgICAgIiAoIiwgcm91bmQoCiAgICAgICAgICAgICBgUHVycmJsZSBUcmVhdG1lbnRgIC8KICAgICAgICAgICAgIGRlbm9tX3NvJHRvdGFsWyBkZW5vbV9zbyRjb25kaXRpb24gPT0gIlB1cnJibGUgVHJlYXRtZW50IiBdICogMTAwLAogICAgICAgICAgIDEpLAogICAgICAiJSkiCiAgICApLAogICAgYFRvdGFsIChuLCAlKWAgPSBwYXN0ZTAoCiAgICAgIFRvdGFsLAogICAgICAiICgiLCByb3VuZChUb3RhbCAvIG92ZXJhbGxfZGVub20gKiAxMDAsIDEpLCAiJSkiCiAgICApCiAgKSAlPiUKICBzZWxlY3QoCiAgICBgU2V4dWFsIE9yaWVudGF0aW9uYCA9IHNvX3NpbXBsaWZpZWQsCiAgICBgV2FpdGxpc3QgKG4sICUpYCwKICAgIGBQdXJyYmxlIChuLCAlKWAsCiAgICBgVG90YWwgKG4sICUpYAogICkKCiMgNS4gUHJpbnQgd2l0aCBrYWJsZUV4dHJhCnNvX3RhYmxlX2ZpbmFsICU+JQogIGthYmxlKAogICAgY2FwdGlvbiA9ICJUYWJsZSBYLiBTaW1wbGlmaWVkIFNleHVhbCBPcmllbnRhdGlvbiBieSBDb25kaXRpb24gKG4sICUpIiwKICAgIGFsaWduICAgPSBjKCJsIiwiYyIsImMiLCJjIikKICApICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQpgYGAKIyMjIE5hdGlvbmFsaXR5CmBgYHtyfQojIyMgTmF0aW9uYWxpdHkgYnkgQ29uZGl0aW9uCgojIDEuIENyZWF0ZSBhIGNvdW50cyB0YWJsZTogb25lIHJvdyBwZXIgdW5pcXVlIE5hdGlvbmFsaXR5LCB3aXRoIGNvbHVtbnMgZm9yIGVhY2ggY29uZGl0aW9uLgpuYXRpb25hbGl0eV9jb3VudHMgPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUKICBkaXN0aW5jdChwc2lkLCBjb25kaXRpb24sIE5hdGlvbmFsaXR5KSAlPiUgICMgb25lIHJlY29yZCBwZXIgcGFydGljaXBhbnQKICBtdXRhdGUoTmF0aW9uYWxpdHkgPSB0b2xvd2VyKE5hdGlvbmFsaXR5KSkgJT4lICAjIGNvbnZlcnQgdG8gbG93ZXJjYXNlCiAgY291bnQoTmF0aW9uYWxpdHksIGNvbmRpdGlvbikgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGNvbmRpdGlvbiwgCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBuLCAKICAgICAgICAgICAgICB2YWx1ZXNfZmlsbCA9IGxpc3QobiA9IDApKSAlPiUKICBhcnJhbmdlKE5hdGlvbmFsaXR5KQoKIyAyLiBBZGQgYSBUb3RhbCBjb2x1bW4uCm5hdGlvbmFsaXR5X2NvdW50cyA8LSBuYXRpb25hbGl0eV9jb3VudHMgJT4lCiAgbXV0YXRlKFRvdGFsID0gcm93U3VtcyhzZWxlY3QoLiwgLU5hdGlvbmFsaXR5KSkpCgojIDMuIEdldCBkZW5vbWluYXRvcnMgKHNhbWUgYXMgZm9yIHNvKQpkZW5vbV9uYXQgPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUKICBkaXN0aW5jdChwc2lkLCBjb25kaXRpb24pICU+JQogIGNvdW50KGNvbmRpdGlvbiwgbmFtZSA9ICJ0b3RhbCIpCm92ZXJhbGxfZGVub21fbmF0IDwtIG92ZXJhbGxfZGVub20gICMgc2FtZSBvdmVyYWxsIGRlbm9taW5hdG9yCgojIDQuIENvbnZlcnQgY291bnRzIHRvICJjb3VudCAocGVyY2VudGFnZSUpIiBmb3JtYXQuCm5hdGlvbmFsaXR5X3RhYmxlX2ZpbmFsIDwtIG5hdGlvbmFsaXR5X2NvdW50cwpmb3IoY29sIGluIHNldGRpZmYobmFtZXMobmF0aW9uYWxpdHlfY291bnRzKSwgIk5hdGlvbmFsaXR5IikpewogIGlmKGNvbCAhPSAiVG90YWwiKXsKICAgIGRlbm9tX3ZhbCA8LSBkZW5vbV9uYXQkdG90YWxbZGVub21fbmF0JGNvbmRpdGlvbiA9PSBjb2xdCiAgICBuYXRpb25hbGl0eV90YWJsZV9maW5hbFtbY29sXV0gPC0gcGFzdGUwKG5hdGlvbmFsaXR5X2NvdW50c1tbY29sXV0sICIgKCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChuYXRpb25hbGl0eV9jb3VudHNbW2NvbF1dIC8gZGVub21fdmFsICogMTAwLCAxKSwgIiUpIikKICB9IGVsc2UgewogICAgbmF0aW9uYWxpdHlfdGFibGVfZmluYWxbW2NvbF1dIDwtIHBhc3RlMChuYXRpb25hbGl0eV9jb3VudHNbW2NvbF1dLCAiICgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQoYXMubnVtZXJpYyhuYXRpb25hbGl0eV9jb3VudHNbW2NvbF1dKSAvIG92ZXJhbGxfZGVub21fbmF0ICogMTAwLCAxKSwgIiUpIikKICB9Cn0KCnByaW50KGthYmxlKG5hdGlvbmFsaXR5X3RhYmxlX2ZpbmFsLCBjYXB0aW9uID0gIlRhYmxlOiBOYXRpb25hbGl0eSBieSBDb25kaXRpb24gKENvdW50cyBhbmQgUGVyY2VudGFnZXMpIiwgZm9ybWF0ID0gIm1hcmtkb3duIikpCgpgYGAKIyMjIFJhY2UKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgRGVmaW5lIHJhY2UgdmFyaWFibGVzCnJhY2VfdmFycyA8LSBjKCJSYWNlX0FzaWFuIiwgIlJhY2VfQXJhYmljIiwgIlJhY2VfQmxhY2siLCAiUmFjZV9IaXNwYW5pYyIsIAogICAgICAgICAgICAgICAiUmFjZV9QYWNpZmljIiwgIlJhY2VfV2hpdGUiLCAiUmFjZV91bmtub3duIikKCiMgU3RlcCAxOiBDcmVhdGUgcGFydGljaXBhbnQtbGV2ZWwgcmFjZSBkYXRhCnJhY2VfZGF0YSA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIHNlbGVjdChwc2lkLCBjb25kaXRpb24sIGFsbF9vZihyYWNlX3ZhcnMpKSAlPiUgICMgc2VsZWN0IG5lZWRlZCBjb2x1bW5zIGZpcnN0CiAgZGlzdGluY3QoKQoKIyBTdGVwIDI6IFBpdm90IHRvIGxvbmcgZm9ybWF0IHNvIHRoYXQgZWFjaCByb3cgaXMgb25lIHJhY2Ugb3B0aW9uIHBlciBwYXJ0aWNpcGFudCwgdGhlbiBmaWx0ZXIgZm9yIGluZGljYXRvciA9PSAxCnJhY2VfbG9uZyA8LSByYWNlX2RhdGEgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBhbGxfb2YocmFjZV92YXJzKSwgbmFtZXNfdG8gPSAiUmFjZSIsIHZhbHVlc190byA9ICJpbmRpY2F0b3IiKSAlPiUKICBmaWx0ZXIoaW5kaWNhdG9yID09IDEpCgojIFN0ZXAgMzogQ29tcHV0ZSBjb3VudHMgYnkgY29uZGl0aW9uIGZvciBlYWNoIFJhY2Ugb3B0aW9uCnJhY2VfY291bnRzIDwtIHJhY2VfbG9uZyAlPiUKICBncm91cF9ieShSYWNlLCBjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikKCiMgU3RlcCA0OiBDb21wdXRlIGRlbm9taW5hdG9ycyAodG90YWwgcGFydGljaXBhbnRzKSBwZXIgY29uZGl0aW9uCmRlbm9tIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZGlzdGluY3QocHNpZCwgY29uZGl0aW9uKSAlPiUKICBjb3VudChjb25kaXRpb24sIG5hbWUgPSAiZGVub20iKQoKIyBTdGVwIDU6IEpvaW4gZGVub21pbmF0b3JzIGFuZCBjb21wdXRlIHBlcmNlbnRhZ2VzIGZvciBlYWNoIFJhY2Ugb3B0aW9uIHBlciBjb25kaXRpb24KcmFjZV9jb3VudHMgPC0gcmFjZV9jb3VudHMgJT4lCiAgbGVmdF9qb2luKGRlbm9tLCBieSA9ICJjb25kaXRpb24iKSAlPiUKICBtdXRhdGUocGVyY2VudGFnZSA9IHJvdW5kKGNvdW50IC8gZGVub20gKiAxMDAsIDEpKQoKIyBTdGVwIDY6IFBpdm90IHdpZGVyIHNvIHRoYXQgZWFjaCByYWNlIG9wdGlvbiBpcyBvbmUgcm93LgpyYWNlX3dpZGUgPC0gcmFjZV9jb3VudHMgJT4lCiAgcGl2b3Rfd2lkZXIoaWRfY29scyA9IFJhY2UsIAogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSBjb25kaXRpb24sIAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gYyhjb3VudCwgcGVyY2VudGFnZSksCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSBsaXN0KGNvdW50ID0gMCwgcGVyY2VudGFnZSA9IDApLAogICAgICAgICAgICAgIHZhbHVlc19mbiA9IGxpc3QoY291bnQgPSBzdW0sIHBlcmNlbnRhZ2UgPSBzdW0pKQoKIyBTdGVwIDc6IENvbXB1dGUgb3ZlcmFsbCB0b3RhbHMgZm9yIGVhY2ggUmFjZSBvcHRpb24Kb3ZlcmFsbF9kZW5vbSA8LSBucm93KFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lIGRpc3RpbmN0KHBzaWQpKQpvdmVyYWxsX2NvdW50cyA8LSByYWNlX2xvbmcgJT4lCiAgZ3JvdXBfYnkoUmFjZSkgJT4lCiAgc3VtbWFyaXNlKHRvdGFsX2NvdW50ID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBtdXRhdGUodG90YWxfcGVyY2VudGFnZSA9IHJvdW5kKHRvdGFsX2NvdW50IC8gb3ZlcmFsbF9kZW5vbSAqIDEwMCwgMSkpCgojIFN0ZXAgODogTWVyZ2Ugb3ZlcmFsbCB0b3RhbHMgd2l0aCB0aGUgd2lkZSB0YWJsZQpyYWNlX3RhYmxlIDwtIHJhY2Vfd2lkZSAlPiUKICBsZWZ0X2pvaW4ob3ZlcmFsbF9jb3VudHMsIGJ5ID0gIlJhY2UiKQoKIyBTdGVwIDk6IFJlb3JkZXIgY29sdW1ucyBzbyB0aGF0IGZvciBlYWNoIGNvbmRpdGlvbiB0aGUgY291bnQgYW5kIHBlcmNlbnRhZ2UgY29sdW1ucyBhcHBlYXIgc2lkZS1ieS1zaWRlLAojIGFuZCB0aGVuIGFkZCBvdmVyYWxsIChUb3RhbCkgY29sdW1ucy4KY29uZGl0aW9ucyA8LSBzb3J0KHVuaXF1ZShQdXJyYmxlX0xvbmdfTWFzdGVyJGNvbmRpdGlvbikpCm9yZGVyZWRfY29scyA8LSBjKCJSYWNlIikKZm9yIChjb25kIGluIGNvbmRpdGlvbnMpIHsKICBvcmRlcmVkX2NvbHMgPC0gYyhvcmRlcmVkX2NvbHMsIHBhc3RlMCgiY291bnRfIiwgY29uZCksIHBhc3RlMCgicGVyY2VudGFnZV8iLCBjb25kKSkKfQpvcmRlcmVkX2NvbHMgPC0gYyhvcmRlcmVkX2NvbHMsICJ0b3RhbF9jb3VudCIsICJ0b3RhbF9wZXJjZW50YWdlIikKcmFjZV90YWJsZSA8LSByYWNlX3RhYmxlICU+JSBzZWxlY3QoYWxsX29mKG9yZGVyZWRfY29scykpCgojIFN0ZXAgMTA6IENyZWF0ZSBhIHNwYW5uaW5nIGhlYWRlcjoKIyBGaXJzdCBjb2x1bW46ICJSYWNlIiwgdGhlbiBlYWNoIGNvbmRpdGlvbiBzcGFucyAyIGNvbHVtbnMgKENvdW50IGFuZCBQZXJjZW50KSwgdGhlbiAiVG90YWwiIHNwYW5zIDIgY29sdW1ucy4KaGVhZGVyX3ZlYyA8LSBjKCJSYWNlIiA9IDEpCmZvciAoY29uZCBpbiBjb25kaXRpb25zKSB7CiAgaGVhZGVyX3ZlYyA8LSBjKGhlYWRlcl92ZWMsIHNldE5hbWVzKDIsIGNvbmQpKQp9CmhlYWRlcl92ZWMgPC0gYyhoZWFkZXJfdmVjLCAiVG90YWwiID0gMikKCiMgRGlzcGxheSB0aGUgZmluYWwgcmFjZSB0YWJsZSB3aXRoIHRoZSBzcGFubmluZyBoZWFkZXIuCmthYmxlKHJhY2VfdGFibGUsIGNhcHRpb24gPSAiVGFibGU6IFJhY2UgQ291bnRzIGFuZCBQZXJjZW50YWdlcyBieSBDb25kaXRpb24iLCBmb3JtYXQgPSAibWFya2Rvd24iKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShoZWFkZXJfdmVjKQoKCiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFydGljaXBhbnRzIHdpdGggbXVsdGlwbGUgcmFjaWFsIGlkZW50aXRpZXMgcGVyIGNvbmRpdGlvbgptdWx0aXBsZV9yYWNlX2NvdW50cyA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIHNlbGVjdChwc2lkLCBjb25kaXRpb24sIG9uZV9vZihyYWNlX3ZhcnMpKSAlPiUgICMgc2VsZWN0IG5lY2Vzc2FyeSBjb2x1bW5zIGZpcnN0CiAgZGlzdGluY3QoKSAlPiUKICBtdXRhdGUobXVsdGlwbGUgPSByb3dTdW1zKGFjcm9zcyhvbmVfb2YocmFjZV92YXJzKSksIG5hLnJtID0gVFJVRSkgPiAxKSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcml6ZShtdWx0aXBsZV9jb3VudCA9IHN1bShtdWx0aXBsZSksIC5ncm91cHMgPSAiZHJvcCIpCgojIFByaW50IG91dHB1dCBtZXNzYWdlcyBmb3IgZWFjaCBjb25kaXRpb24KbXVsdGlwbGVfcmFjZV9jb3VudHMgJT4lCiAgcm93d2lzZSgpICU+JQogIG11dGF0ZShtZXNzYWdlID0gcGFzdGUwKG11bHRpcGxlX2NvdW50LCAiIHBlb3BsZSBpbiB0aGUgIiwgY29uZGl0aW9uLCAiIGNvbmRpdGlvbiByZXBvcnRlZCBtdWx0aXBsZSByYWNpYWwgaWRlbnRpdGllcy4iKSkgJT4lCiAgcHVsbChtZXNzYWdlKSAlPiUKICBwYXN0ZShjb2xsYXBzZSA9ICJcbiIpICU+JQogIGNhdCgpCgpgYGAKIyMgUGFydGljaXBhdGlvbiBPdmVyIFRpbWUKTm90ZTogV2Vla3MgMS0zIHdlcmUgY29uc2lkZXJlZCAicHJlLXRlc3QuIiBQdXJyYmxlIHdhcyBnaXZlbiAob3Igbm90KSBhZnRlciB3ZWVrIDMuIFdlZWtzIDExLTEzIGFyZSBjb25zaWRlcmVkICJQb3N0LXRlc3QiLgojIyMgUGFydGljaXBhdGlvbiBpbiBFYWNoIFdlZWsgb3ZlciBUaW1lIApBbmFseXNlcyBmb3IgdGhlIGVudGlyZSBzdHVkeSBhbmQgYnkgdHJlYXRtZW50IGNvbmRpdGlvbi4KTm90ZTogU29tZXRoaW5nIHdvbmt5IGluIHRoZSB0YWJsZSBicm9rZW4gZG93biBieSBjb25kaXRpb24gd2hlcmUgV2VlayA0IGFwcGVhcnMgb3V0IG9mIG9yZGVyLSBJIGRvbid0IGtub3cgd2h5LiBUaGUgZGF0YSBpcyBhY2N1cmF0ZS4KYGBge3J9CmxpYnJhcnkoa2FibGVFeHRyYSkKY29uZGl0aW9uX2NvdW50cyA8LSBwdXJyYmxlX3dpZGVfZmluYWwgJT4lCiAgY291bnQoY29uZGl0aW9uKSAlPiUKICByZW5hbWUoQ29uZGl0aW9uID0gY29uZGl0aW9uLCBOID0gbikKCiMgRGlzcGxheSB0aGUgZm9ybWF0dGVkIHRhYmxlCmNhdCgiIyMjICoqTnVtYmVyIG9mIFBhcnRpY2lwYW50cyBpbiBFYWNoIENvbmRpdGlvbioqXG4iKQprYWJsZShjb25kaXRpb25fY291bnRzLCBjYXB0aW9uID0gIlBhcnRpY2lwYW50IENvdW50cyBieSBDb25kaXRpb24iKQoKIyBTZWxlY3QgQ29tcGxldGVfWCB2YXJpYWJsZXMKY29tcGxldGVfdmFycyA8LSBwYXN0ZTAoIkNvbXBsZXRlXyIsIDE6MTMpCgojIFN1bW1hcml6ZSBob3cgbWFueSBwZW9wbGUgaGF2ZSBhIDEgZm9yIGVhY2ggQ29tcGxldGVfWCB2YXJpYWJsZQpjb21wbGV0ZV90YWJsZSA8LSBwdXJyYmxlX3dpZGVfZmluYWwgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyhhbGxfb2YoY29tcGxldGVfdmFycyksIHN1bSwgbmEucm0gPSBUUlVFKSkKCiMgUmVzaGFwZSBpbnRvIGxvbmcgZm9ybWF0IGZvciBjbGVhbmVyIGRpc3BsYXkKY29tcGxldGVfdGFibGVfbG9uZyA8LSBjb21wbGV0ZV90YWJsZSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAiV2VlayIsIHZhbHVlc190byA9ICJDb3VudCIpICU+JQogIG11dGF0ZShXZWVrID0gYXMubnVtZXJpYyhnc3ViKCJDb21wbGV0ZV8iLCAiIiwgV2VlaykpKSAlPiUKICBhcnJhbmdlKFdlZWspICMgRW5zdXJlIHByb3BlciBvcmRlcgoKIyBEaXNwbGF5IHRoZSBmb3JtYXR0ZWQgdGFibGUKY2F0KCJcbiMjIyAqKkNvbXBsZXRpb24gQ291bnRzIE92ZXIgVGltZSoqXG4iKQprYWJsZShjb21wbGV0ZV90YWJsZV9sb25nLCBjYXB0aW9uID0gIk51bWJlciBvZiBQYXJ0aWNpcGFudHMgQ29tcGxldGluZyBFYWNoIFdlZWsiKQoKIyBMaW5lIGdyYXBoIHNob3dpbmcgdHJlbmQgb2YgY29tcGxldGlvbiBvdmVyIHRpbWUKIyBDcmVhdGUgdGhlIGxpbmUgZ3JhcGgKZ2dwbG90KGNvbXBsZXRlX3RhYmxlX2xvbmcsIGFlcyh4ID0gV2VlaywgeSA9IENvdW50KSkgKwogIGdlb21fbGluZShjb2xvciA9ICJibHVlIiwgbGluZXdpZHRoID0gMSkgKyAgIyBMaW5lIGNvbG9yIGFuZCB0aGlja25lc3MKICBnZW9tX3BvaW50KHNpemUgPSAzLCBjb2xvciA9ICJibHVlIikgKyAgIyBSZWQgcG9pbnRzIGZvciBlbXBoYXNpcwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDE1NSksIGJyZWFrcyA9IHNlcSgwLCAxNTUsIGJ5ID0gMjUpKSArICAjIFktYXhpcyBsaW1pdHMgYW5kIGludGVydmFscwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjEzKSArICAjIEVuc3VyZSBhbGwgd2Vla3MgKDEgdG8gMTMpIGFwcGVhciBvbiBYLWF4aXMKICBsYWJzKAogICAgdGl0bGUgPSAiQ29tcGxldGlvbiBSYXRlcyBPdmVyIFRpbWUiLAogICAgeCA9ICJXZWVrIiwKICAgIHkgPSAiTnVtYmVyIG9mIFBhcnRpY2lwYW50cyIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAjIE1ha2UgWC1heGlzIGxhYmVscyByZWFkYWJsZQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICAjIE1ha2UgWS1heGlzIGxhYmVscyByZWFkYWJsZQoKIyAxKSBSZWNvbXB1dGUgc3VtcyBvZiBDb21wbGV0ZV8xOkNvbXBsZXRlXzEzIHNlcGFyYXRlbHkgZm9yIGVhY2ggY29uZGl0aW9uCmNvbXBsZXRlX3RhYmxlX2J5X2NvbmQgPC0gcHVycmJsZV93aWRlX2ZpbmFsICU+JQogIGdyb3VwX2J5KGNvbmRpdGlvbikgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyhzdGFydHNfd2l0aCgiQ29tcGxldGVfIiksIHN1bSwgbmEucm0gPSBUUlVFKSkgJT4lCiAgdW5ncm91cCgpCgojIDIpIFJlbmFtZSB0aGUgQ29tcGxldGVfWCBjb2x1bW5zIHRvIGp1c3QgdGhlIHdlZWsgbnVtYmVyICgx4oCTMTMpCiMgICAgVGhpcyBtYWtlcyBlYWNoIGNvbHVtbiBoZWFkZXIg4oCcMeKAnSwg4oCcMuKAnSwg4oCmLCDigJwxM+KAnQpjb21wbGV0ZV90YWJsZV93aWRlIDwtIGNvbXBsZXRlX3RhYmxlX2J5X2NvbmQgJT4lCiAgcmVuYW1lX3dpdGgofiBnc3ViKCJeQ29tcGxldGVfIiwgIiIsIC54KSwgc3RhcnRzX3dpdGgoIkNvbXBsZXRlXyIpKQoKIyAzKSBEaXNwbGF5IHRoZSB3aWRlIHRhYmxlOiBvbmUgcm93IHBlciBjb25kaXRpb24sIGNvbHVtbnMgMeKAkzEzCmNhdCgiIyMjICoqQ29tcGxldGlvbiBDb3VudHMgYnkgV2VlayBhbmQgQ29uZGl0aW9uKipcbiIpCmNvbXBsZXRlX3RhYmxlX3dpZGUgJT4lCiAgcmVuYW1lKAogICAgQ29uZGl0aW9uID0gY29uZGl0aW9uCiAgKSAlPiUKICBrYWJsZSgKICAgIGNhcHRpb24gPSAiTnVtYmVyIG9mIFBhcnRpY2lwYW50cyBDb21wbGV0aW5nIEVhY2ggV2VlayAoQ29sdW1uczogV2Vla3MgMeKAkzEzOyBSb3dzOiBDb25kaXRpb25zKSIsCiAgICBhbGlnbiAgID0gYygibCIsIHJlcCgiciIsIDEzKSkKICApICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQoKIyA0KSBQbG90IGNvbXBsZXRpb24gY291bnRzIG92ZXIgdGltZSwgd2l0aCBvbmUgbGluZSBwZXIgY29uZGl0aW9uCmdncGxvdChjb21wbGV0ZV9sb25nX2J5X2NvbmQsIGFlcyh4ID0gV2VlaywgeSA9IENvdW50LCBjb2xvciA9IGNvbmRpdGlvbikpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6MTMpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsaW1pdHMgPSBjKDAsIG1heChjb21wbGV0ZV9sb25nX2J5X2NvbmQkQ291bnQpICsgNSksCiAgICBicmVha3MgPSBzZXEoMCwgbWF4KGNvbXBsZXRlX2xvbmdfYnlfY29uZCRDb3VudCkgKyA1LCBieSA9IDI1KQogICkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJDb21wbGV0aW9uIENvdW50cyBPdmVyIFRpbWUgYnkgQ29uZGl0aW9uIiwKICAgIHggICAgID0gIldlZWsiLAogICAgeSAgICAgPSAiTnVtYmVyIG9mIFBhcnRpY2lwYW50cyBDb21wbGV0aW5nIiwKICAgIGNvbG9yID0gIkNvbmRpdGlvbiIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnggICAgID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSksCiAgICBheGlzLnRleHQueSAgICAgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSwKICAgIGxlZ2VuZC50aXRsZSAgICA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iCiAgKQpgYGAKIyMjIyBGb2xsb3ctVXA6IERpZmZlcmVuY2VzIGluIFNsb3BlIGJldHdlZW4gdGhlIFR3byBHcm91cHMgT3ZlciBUaW1lIApXZSBleGFtaW5lZCB3aGV0aGVyIHRoZSByYXRlIG9mIGRlY2xpbmUgaW4gd2Vla2x5IGNvbXBsZXRpb24gY291bnRzIGRpZmZlcmVkIGJldHdlZW4gdGhlIFB1cnJibGUgYW5kIFdhaXRsaXN0IENvbnRyb2wgZ3JvdXBzIGJ5IGZpdHRpbmcgYSBsaW5lYXIgcmVncmVzc2lvbiBvbiBhZ2dyZWdhdGVkIGNvdW50cyAoQ291bnQpIHdpdGggcHJlZGljdG9ycyBXZWVrIChjZW50ZXJlZCBhdCBXZWVrIDApLCBDb25kaXRpb24gKFdhaXRsaXN0IENvbnRyb2wgPSAwLCBQdXJyYmxlID0gMSksIGFuZCB0aGVpciBpbnRlcmFjdGlvbiAoV2VlayDDlyBDb25kaXRpb24pLiBUaGUgaW50ZXJhY3Rpb24gdGVybSAoV2VlayDDlyBDb25kaXRpb24pIHdhcyBzaWduaWZpY2FudCwgQiA9IOKIkjAuODcsIFNFID0gMC4zMSwgcCA9IC4wMDksIGluZGljYXRpbmcgdGhhdCB0aGUgUHVycmJsZSBncm91cOKAmXMgd2Vla2x5IGRlY2xpbmUgKGFwcHJveGltYXRlbHkg4oiSMS41MiBwYXJ0aWNpcGFudHMgcGVyIHdlZWspIHdhcyBzaWduaWZpY2FudGx5IGdyZWF0ZXIgdGhhbiBpbiB0aGUgV2FpdGxpc3QgQ29udHJvbCBncm91cCAo4oiSMC42NSBwYXJ0aWNpcGFudHMgcGVyIHdlZWspLgpgYGB7cn0KCiMgMSkgUmVjb21wdXRlIHN1bXMgb2YgQ29tcGxldGVfMTpDb21wbGV0ZV8xMyBzZXBhcmF0ZWx5IGZvciBlYWNoIGNvbmRpdGlvbgpjb21wbGV0ZV90YWJsZV9ieV9jb25kIDwtIHB1cnJibGVfd2lkZV9maW5hbCAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZShhY3Jvc3Moc3RhcnRzX3dpdGgoIkNvbXBsZXRlXyIpLCBzdW0sIG5hLnJtID0gVFJVRSkpICU+JQogIHVuZ3JvdXAoKQoKIyAyKSBQaXZvdCB0byBsb25nIGZvcm1hdCBmb3Igc2xvcGUgYW5hbHlzaXM6IG9uZSByb3cgcGVyIChjb25kaXRpb24sIFdlZWssIENvdW50KQpjb21wbGV0ZV9sb25nX2J5X2NvbmQgPC0gY29tcGxldGVfdGFibGVfYnlfY29uZCAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzICAgICA9IHN0YXJ0c193aXRoKCJDb21wbGV0ZV8iKSwKICAgIG5hbWVzX3RvID0gIldlZWsiLAogICAgdmFsdWVzX3RvID0gIkNvdW50IgogICkgJT4lCiAgbXV0YXRlKFdlZWsgPSBhcy5pbnRlZ2VyKGdzdWIoIkNvbXBsZXRlXyIsICIiLCBXZWVrKSkpICU+JQogIGFycmFuZ2UoY29uZGl0aW9uLCBXZWVrKQoKIyAzKSBGaXQgYSBsaW5lYXIgbW9kZWw6IENvdW50IH4gV2VlayAqIGNvbmRpdGlvbgojICAgIEVuc3VyZSBjb25kaXRpb24gaXMgYSBmYWN0b3Igd2l0aCBhIHJlZmVyZW5jZSBsZXZlbApjb21wbGV0ZV9sb25nX2J5X2NvbmQgPC0gY29tcGxldGVfbG9uZ19ieV9jb25kICU+JQogIG11dGF0ZShjb25kaXRpb24gPSBmYWN0b3IoY29uZGl0aW9uLCBsZXZlbHMgPSBjKCJXYWl0bGlzdCBDb250cm9sIiwgIlB1cnJibGUiKSkpCgpzbG9wZV9sbSA8LSBsbShDb3VudCB+IFdlZWsgKiBjb25kaXRpb24sIGRhdGEgPSBjb21wbGV0ZV9sb25nX2J5X2NvbmQpCnNsb3BlX3N1bW1hcnkgPC0gYnJvb206OnRpZHkoc2xvcGVfbG0pCgojIDQpIERpc3BsYXkgdGhlIGZ1bGwgc2V0IG9mIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzCmNhdCgiIyMjICoqTGluZWFyIE1vZGVsOiBDb3VudCB+IFdlZWsgw5cgQ29uZGl0aW9uKipcbiIpCnNsb3BlX3N1bW1hcnkgJT4lCiAgc2VsZWN0KHRlcm0sIGVzdGltYXRlLCBzdGQuZXJyb3IsIHAudmFsdWUpICU+JQogIHJlbmFtZSgKICAgIFRlcm0gICAgICAgPSB0ZXJtLAogICAgRXN0aW1hdGUgICA9IGVzdGltYXRlLAogICAgYFN0ZC4gRXJyb3JgID0gc3RkLmVycm9yLAogICAgYHAtdmFsdWVgICA9IHAudmFsdWUKICApICU+JQogIGthYmxlKAogICAgY2FwdGlvbiA9ICJSZWdyZXNzaW9uIENvZWZmaWNpZW50cyBmb3IgQ291bnQgfiBXZWVrICogQ29uZGl0aW9uIiwKICAgIGFsaWduICAgPSBjKCJsIiwgInIiLCAiciIsICJyIikKICApICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQoKIyA1KSBFeHRyYWN0IGFuZCBkaXNwbGF5IGp1c3QgdGhlIGludGVyYWN0aW9uIHRlcm0gKFdlZWs6Y29uZGl0aW9uUHVycmJsZSkKaW50ZXJhY3Rpb25fcm93IDwtIHNsb3BlX3N1bW1hcnkgJT4lCiAgZmlsdGVyKHRlcm0gPT0gIldlZWs6Y29uZGl0aW9uUHVycmJsZSIpCgpjYXQoIlxuIyMjICoqSW50ZXJhY3Rpb24gVGVybSAoRGlmZmVyZW5jZSBpbiBTbG9wZSkqKlxuIikKaW50ZXJhY3Rpb25fcm93ICU+JQogIHNlbGVjdCh0ZXJtLCBlc3RpbWF0ZSwgc3RkLmVycm9yLCBwLnZhbHVlKSAlPiUKICByZW5hbWUoCiAgICBUZXJtICAgICAgICA9IHRlcm0sCiAgICBFc3RpbWF0ZSAgICA9IGVzdGltYXRlLAogICAgYFN0ZC4gRXJyb3JgID0gc3RkLmVycm9yLAogICAgYHAtdmFsdWVgICAgPSBwLnZhbHVlCiAgKSAlPiUKICBrYWJsZSgKICAgIGNhcHRpb24gPSAiV2Vlazpjb25kaXRpb25QdXJyYmxlIOKAlCBTbG9wZSBEaWZmZXJlbmNlIChQdXJyYmxlIHZzIFdhaXRsaXN0KSIsCiAgICBhbGlnbiAgID0gYygibCIsICJyIiwgInIiLCAiciIpCiAgKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKCiMgNikgKE9wdGlvbmFsKSBQcmludCBhIG1lc3NhZ2UgaW50ZXJwcmV0aW5nIHRoZSBpbnRlcmFjdGlvbgpjYXQoIlxuKipJbnRlcnByZXRhdGlvbjoqKlxuIikKaWYgKGludGVyYWN0aW9uX3JvdyRwLnZhbHVlIDwgMC4wNSkgewogIGNhdCgiVGhlIFdlZWsgw5cgY29uZGl0aW9uIGludGVyYWN0aW9uIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgKHAgPSIsIAogICAgICBzaWduaWYoaW50ZXJhY3Rpb25fcm93JHAudmFsdWUsIDMpLCAKICAgICAgIiksIGluZGljYXRpbmcgdGhhdCB0aGUgc2xvcGUgb2YgY29tcGxldGlvbiBjb3VudHMgb3ZlciB0aW1lIGRpZmZlcnMgYmV0d2VlbiBjb25kaXRpb25zLlxuIikKfSBlbHNlIHsKICBjYXQoIlRoZSBXZWVrIMOXIGNvbmRpdGlvbiBpbnRlcmFjdGlvbiBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCAocCA9IiwgCiAgICAgIHNpZ25pZihpbnRlcmFjdGlvbl9yb3ckcC52YWx1ZSwgMyksIAogICAgICAiKSwgc3VnZ2VzdGluZyBubyBldmlkZW5jZSB0aGF0IHRoZSBzbG9wZXMgZGlmZmVyIGJldHdlZW4gY29uZGl0aW9ucy5cbiIpCn0KYGBgCiMjIyBEZXNjcmlwdGl2ZXMgaW4gTnVtYmVyIG9mIFNlc3Npb25zIEF0dGVuZGVkIApEZXNjcmlwdGl2ZXMgb2YgbnVtYmVyIG9mIHNlc3Npb25zIGF0dGVuZGVkIGJ5IGNvbmRpdGlvbiBhbmQgZ2VuZGVyIGlkZW50aXR5IGdyb3VwLiAKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgSWRlbnRpZnkgYXR0ZW5kYW5jZSBjb2x1bW5zICh0aG9zZSBzdGFydGluZyB3aXRoICJXZWVrXyIpCmF0dGVuZGFuY2VfY29scyA8LSBncmVwKCJeV2Vla18iLCBuYW1lcyhQdXJyYmxlX01hc3Rlcl9XaWRlKSwgdmFsdWUgPSBUUlVFKQoKIyBDYWxjdWxhdGUgdG90YWwgc2Vzc2lvbnMgYXR0ZW5kZWQgcGVyIHBhcnRpY2lwYW50ClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUodG90YWxfc2Vzc2lvbnMgPSByb3dTdW1zKGFjcm9zcyhhbGxfb2YoYXR0ZW5kYW5jZV9jb2xzKSkpKQoKIyBPdmVyYWxsIHNlc3Npb25zIGF0dGVuZGVkCm92ZXJhbGxfc2Vzc2lvbnMgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBzdW1tYXJpemUobWVhbl9zZXNzaW9ucyA9IG1lYW4odG90YWxfc2Vzc2lvbnMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHNkX3Nlc3Npb25zID0gc2QodG90YWxfc2Vzc2lvbnMsIG5hLnJtID0gVFJVRSkpCgojIFNlc3Npb25zIGF0dGVuZGVkIGJ5IENvbmRpdGlvbgpzZXNzaW9uc19ieV9jb25kaXRpb24gPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcml6ZShtZWFuX3Nlc3Npb25zID0gbWVhbih0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgc2Rfc2Vzc2lvbnMgPSBzZCh0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbiA9IG4oKSkKCiMgU2Vzc2lvbnMgYXR0ZW5kZWQgYnkgR2VuZGVyIElkZW50aXR5CnNlc3Npb25zX2J5X2lkZW50aXR5IDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgZ3JvdXBfYnkoaWRlbnRpdHlfZ3JvdXApICU+JQogIHN1bW1hcml6ZShtZWFuX3Nlc3Npb25zID0gbWVhbih0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgc2Rfc2Vzc2lvbnMgPSBzZCh0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbiA9IG4oKSkKCiMgU2Vzc2lvbnMgYXR0ZW5kZWQgYnkgQ29uZGl0aW9uIGFuZCBHZW5kZXIgSWRlbnRpdHkKc2Vzc2lvbnNfYnlfYm90aCA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIGdyb3VwX2J5KGNvbmRpdGlvbiwgaWRlbnRpdHlfZ3JvdXApICU+JQogIHN1bW1hcml6ZShtZWFuX3Nlc3Npb25zID0gbWVhbih0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgc2Rfc2Vzc2lvbnMgPSBzZCh0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbiA9IG4oKSkKCiMgQVBBLWZvcm1hdHRlZCB0YWJsZXMKb3ZlcmFsbF9zZXNzaW9ucyAlPiUKICBrYWJsZShjYXB0aW9uID0gIlRhYmxlIDI6IE92ZXJhbGwgVG90YWwgU2Vzc2lvbnMgQXR0ZW5kZWQiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKCnNlc3Npb25zX2J5X2NvbmRpdGlvbiAlPiUKICBrYWJsZShjYXB0aW9uID0gIlRhYmxlIDM6IFRvdGFsIFNlc3Npb25zIEF0dGVuZGVkIGJ5IENvbmRpdGlvbiIpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQoKc2Vzc2lvbnNfYnlfaWRlbnRpdHkgJT4lCiAga2FibGUoY2FwdGlvbiA9ICJUYWJsZSA0OiBUb3RhbCBTZXNzaW9ucyBBdHRlbmRlZCBieSBHZW5kZXIgSWRlbnRpdHkiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKCnNlc3Npb25zX2J5X2JvdGggJT4lCiAga2FibGUoY2FwdGlvbiA9ICJUYWJsZSA1OiBUb3RhbCBTZXNzaW9ucyBBdHRlbmRlZCBieSBDb25kaXRpb24gYW5kIEdlbmRlciBJZGVudGl0eSIpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQoKYGBgCiMjIEF0dHJpdGlvbiBBbmFseXNpcwpBdHRyaXRpb24gaXMgZGVmaW5lZCBoZXJlIGFzIG5vdCBoYXZpbmcgYXR0ZW5kZWQgYW55IHBvc3QtdGVzdCBzZXNzaW9uIChpLmUuLCBubyBhdHRlbmRhbmNlIGR1cmluZyBXZWVrcyAxMeKAkzEzKS4gV2UgY3JlYXRlIGEgYmluYXJ5IGluZGljYXRvciBmb3IgcG9zdC10ZXN0IGNvbXBsZXRpb24gKDEgPSBhdHRlbmRlZCBhdCBsZWFzdCBvbmUgcG9zdC10ZXN0IHNlc3Npb24sIDAgPSBub25lKSBhbmQgY2FsY3VsYXRlIGF0dHJpdGlvbiByYXRlcyBvdmVyYWxsLCBieSBjb25kaXRpb24gYW5kIGJ5IGdlbmRlciBpZGVudGl0eS4gV2UgdXNlZCBhIGNoaS1zcXVhcmUgdGVzdCB0byBkZXRlcm1pbmUgaWYgYXR0cml0aW9uIGRpZmZlcmVkIGJ5IGNvbmRpdGlvbjsgaXQgZGlkIG5vdC4gCiMjIyBBdHRyaXRpb24gQW5hbHlzaXMgYnkgQ29uZGl0aW9uClRoZSBjb25kaXRpb25zIGRpZCBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXIgb24gYW55IG9mIHRoZSBiYXNlbGluZSBtZWFzdXJlcyBvZiBvdXRjb21lcyBvciBieSBhZ2UuIEF0dHJpdGlvbiByYXRlcyB3ZXJlIGxvdyBhY3Jvc3MgYm90aCBjb25kaXRpb25zLCB3aXRoIDkuMiUgb2YgcGFydGljaXBhbnRzIGluIHRoZSBQdXJyYmxlIGNvbmRpdGlvbiBhbmQgNi41JSBpbiB0aGUgV2FpdGxpc3QgQ29udHJvbCBjb25kaXRpb24gbm90IGNvbXBsZXRpbmcgdGhlIHN0dWR5LiAgQXR0cml0aW9uIGRpZCBub3QgZGlmZmVyIGJ5IGNvbmRpdGlvbiwgz4fCsigxKSA9IDAuMTEsIHAgPSAuNzUsIG9yIGJ5IGdlbmRlciBpZGVudGl0eSwgz4fCsigxKSA8IDAuMDEsIHAgPSAxLgpgYGB7cn0KIyBMb2FkIHJlcXVpcmVkIGxpYnJhcmllcwpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIyBSZXZpc2VkIEF0dHJpdGlvbiBBbmFseXNpcyB3aXRoIENvbXBsZXRlZCBhbmQgTm90IENvbXBsZXRlZCBDb3VudHMKCiMgRGVmaW5lIHBvc3QtdGVzdCBhdHRlbmRhbmNlIGNvbHVtbnMgKFdlZWtzIDExLCAxMiwgMTMpCnBvc3RfdGVzdF9jb2xzIDwtIGMoIldlZWtfMTEiLCAiV2Vla18xMiIsICJXZWVrXzEzIikKCiMgQ3JlYXRlIGF0dHJpdGlvbiBpbmRpY2F0b3I6IHBvc3RfdGVzdF9jb21wbGV0ZSA9IDEgaWYgYW55IHBvc3QtdGVzdCBzZXNzaW9uIGF0dGVuZGVkLCAwIG90aGVyd2lzZQpQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKHBvc3RfdGVzdF9jb21wbGV0ZSA9IGlmX2Vsc2Uocm93U3VtcyhhY3Jvc3MoYWxsX29mKHBvc3RfdGVzdF9jb2xzKSkpID4gMCwgMSwgMCkpCgojIC0tLSBTdGF0aXN0aWNhbCBUZXN0cyBmb3IgQXR0cml0aW9uIGJ5IENvbmRpdGlvbiAtLS0KCiMgQ3JlYXRlIGEgY29udGluZ2VuY3kgdGFibGUgZm9yIGNvbmRpdGlvbiBieSBwb3N0LXRlc3QgY29tcGxldGlvbiBzdGF0dXMKYXR0cml0aW9uX2N0IDwtIHRhYmxlKFB1cnJibGVfTWFzdGVyX1dpZGUkY29uZGl0aW9uLCBQdXJyYmxlX01hc3Rlcl9XaWRlJHBvc3RfdGVzdF9jb21wbGV0ZSkKCiMgQ2hpLXNxdWFyZSB0ZXN0IGZvciBkaWZmZXJlbmNlcyBpbiBhdHRyaXRpb24gYnkgY29uZGl0aW9uCmNoaV9yZXN1bHQgPC0gY2hpc3EudGVzdChhdHRyaXRpb25fY3QpCmNhdCgiQ2hpLXNxdWFyZSB0ZXN0IGZvciBkaWZmZXJlbmNlcyBpbiBhdHRyaXRpb24gYnkgY29uZGl0aW9uOlxuIikKcHJpbnQoY2hpX3Jlc3VsdCkKCiMgQXR0cml0aW9uIGJ5IENvbmRpdGlvbiB3aXRoIGFkZGl0aW9uYWwgY29sdW1ucyBmb3IgQ29tcGxldGVkIGFuZCBOb3QgQ29tcGxldGVkIGNvdW50cwphdHRyaXRpb25fYnlfY29uZGl0aW9uIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpemUoCiAgICBuID0gbigpLAogICAgQ29tcGxldGVkID0gc3VtKHBvc3RfdGVzdF9jb21wbGV0ZSwgbmEucm0gPSBUUlVFKSwKICAgIE5vdF9Db21wbGV0ZWQgPSBuIC0gQ29tcGxldGVkLAogICAgYXR0cml0aW9uX3JhdGUgPSAxIC0gbWVhbihwb3N0X3Rlc3RfY29tcGxldGUsIG5hLnJtID0gVFJVRSksCiAgICBhdHRyaXRpb25fcGVyY2VudCA9IHJvdW5kKGF0dHJpdGlvbl9yYXRlICogMTAwLCAxKSwKICAgIC5ncm91cHMgPSAiZHJvcCIKICApCgoKIyBEaXNwbGF5IHRoZSBBUEEtZm9ybWF0dGVkIHRhYmxlcyBmb3IgdGhlIHJldmlzZWQgYXR0cml0aW9uIGFuYWx5c2VzCmF0dHJpdGlvbl9ieV9jb25kaXRpb24gJT4lCiAga2FibGUoY2FwdGlvbiA9ICJUYWJsZSA3OiBBdHRyaXRpb24gUmF0ZSBieSBDb25kaXRpb24gKHdpdGggQ29tcGxldGVkIGFuZCBOb3QgQ29tcGxldGVkIGNvdW50cykiLCBmb3JtYXQgPSAibWFya2Rvd24iKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKYGBgCiMjIyBBdHRyaXRpb24gYnkgR2VuZGVyIElkZW50aXR5Ck5vIGRpZmZlcmVuY2VzIQpgYGB7cn0KIyBMb2FkIHJlcXVpcmVkIGxpYnJhcmllcwpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIyBSZXZpc2VkIEF0dHJpdGlvbiBBbmFseXNpcyB3aXRoIENvbXBsZXRlZCBhbmQgTm90IENvbXBsZXRlZCBDb3VudHMKCiMgRGVmaW5lIHBvc3QtdGVzdCBhdHRlbmRhbmNlIGNvbHVtbnMgKFdlZWtzIDExLCAxMiwgMTMpCnBvc3RfdGVzdF9jb2xzIDwtIGMoIldlZWtfMTEiLCAiV2Vla18xMiIsICJXZWVrXzEzIikKCiMgQ3JlYXRlIGF0dHJpdGlvbiBpbmRpY2F0b3I6IHBvc3RfdGVzdF9jb21wbGV0ZSA9IDEgaWYgYW55IHBvc3QtdGVzdCBzZXNzaW9uIGF0dGVuZGVkLCAwIG90aGVyd2lzZQpQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKHBvc3RfdGVzdF9jb21wbGV0ZSA9IGlmX2Vsc2Uocm93U3VtcyhhY3Jvc3MoYWxsX29mKHBvc3RfdGVzdF9jb2xzKSkpID4gMCwgMSwgMCkpCgojIC0tLSBTdGF0aXN0aWNhbCBUZXN0cyBmb3IgQXR0cml0aW9uIGJ5IENvbmRpdGlvbiAtLS0KCiMgQ3JlYXRlIGEgY29udGluZ2VuY3kgdGFibGUgZm9yIGNvbmRpdGlvbiBieSBwb3N0LXRlc3QgY29tcGxldGlvbiBzdGF0dXMKYXR0cml0aW9uX2N0IDwtIHRhYmxlKFB1cnJibGVfTWFzdGVyX1dpZGUkaWRlbnRpdHlfZ3JvdXAsIFB1cnJibGVfTWFzdGVyX1dpZGUkcG9zdF90ZXN0X2NvbXBsZXRlKQoKIyBDaGktc3F1YXJlIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIGF0dHJpdGlvbiBieSBkbwpjaGlfcmVzdWx0IDwtIGNoaXNxLnRlc3QoYXR0cml0aW9uX2N0KQpjYXQoIkNoaS1zcXVhcmUgdGVzdCBmb3IgZGlmZmVyZW5jZXMgaW4gYXR0cml0aW9uIGJ5IGdlbmRlciBpZGVudGl0eTpcbiIpCnByaW50KGNoaV9yZXN1bHQpCgojIEF0dHJpdGlvbiBieSBHZW5kZXIgSWRlbnRpdHkgd2l0aCBhZGRpdGlvbmFsIGNvdW50cwphdHRyaXRpb25fYnlfaWRlbnRpdHkgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShpZGVudGl0eV9ncm91cCkgJT4lCiAgc3VtbWFyaXplKAogICAgbiA9IG4oKSwKICAgIENvbXBsZXRlZCA9IHN1bShwb3N0X3Rlc3RfY29tcGxldGUsIG5hLnJtID0gVFJVRSksCiAgICBOb3RfQ29tcGxldGVkID0gbiAtIENvbXBsZXRlZCwKICAgIGF0dHJpdGlvbl9yYXRlID0gMSAtIG1lYW4ocG9zdF90ZXN0X2NvbXBsZXRlLCBuYS5ybSA9IFRSVUUpLAogICAgYXR0cml0aW9uX3BlcmNlbnQgPSByb3VuZChhdHRyaXRpb25fcmF0ZSAqIDEwMCwgMSksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKQoKYXR0cml0aW9uX2J5X2lkZW50aXR5ICU+JQogIGthYmxlKGNhcHRpb24gPSAiVGFibGUgODogQXR0cml0aW9uIFJhdGUgYnkgR2VuZGVyIElkZW50aXR5ICh3aXRoIENvbXBsZXRlZCBhbmQgTm90IENvbXBsZXRlZCBjb3VudHMpIiwgZm9ybWF0ID0gIm1hcmtkb3duIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCmBgYAojIyMgQXR0cml0aW9uIGJ5ICBCYXNlbGluZSBMZXZlbCBvZiB0aGUgT3V0Y29tZXMKSW4gdGhpcyBzZWN0aW9uLCB3ZSBleGFtaW5lZCB3aGV0aGVyIGJhc2VsaW5lIHNjb3JlcyBvbiBrZXkgb3V0Y29tZSBtZWFzdXJlcyB3ZXJlIGFzc29jaWF0ZWQgd2l0aCBlaXRoZXIgY29uZGl0aW9uIG9yIGF0dHJpdGlvbiBzdGF0dXMsIG9yIHdoZXRoZXIgdGhlIGVmZmVjdHMgb2YgdGhlc2UgdHdvIGZhY3RvcnMgaW50ZXJhY3RlZC4gTG9uZWxpbmVzcyB3YXMgc2lnbmlmaWNhbnQ7ICBmb2xsb3ctdXAgYmVsb3cKYGBge3J9CgojIExvYWQgcmVxdWlyZWQgbGlicmFyaWVzCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgRGVmaW5lIHByZeKAkXRlc3QgdmFyaWFibGUgbmFtZXMKcHJlX3ZhcnMgIDwtIGMoIlByZV9ERVJTOF9TdW0iLCAiUHJlX0dBRDdfU3VtIiwgIlByZV9QSFE5X1N1bSIsCiAgICAgICAgICAgICAgICJQcmVfU0hTX1BhdGh3YXlzIiwgIlByZV9TSFNfQWdlbmN5IiwgIlByZV9TSFNfVG90YWxIb3BlIiwKICAgICAgICAgICAgICAgIlByZV91Y2xhX1N1bSIsICJQcmVfcG1lcnFfRm9jdXNfQXZnIiwgIlByZV9wbWVycV9EaXN0cmFjdF9BdmciLCAiUHJlX3BtZXJxX0FEX0F2ZyIpCgojIFJ1biB0d28td2F5IEFOT1ZBcyBmb3IgZWFjaCBwcmUtdGVzdCB2YXJpYWJsZSB1c2luZyBjb25kaXRpb24gYW5kIGF0dHJpdGlvbl9zdGF0dXMgYXMgZmFjdG9ycywKIyB0aGVuIHRpZHkgYW5kIGRpc3BsYXkgdGhlIHJlc3VsdHMuCmFub3ZhX3RhYmxlX2xpc3QgPC0gbGFwcGx5KHByZV92YXJzLCBmdW5jdGlvbih2YXIpIHsKICAjIENyZWF0ZSB0aGUgZm9ybXVsYTogZS5nLiwgUHJlX1BIUTlfU3VtIH4gY29uZGl0aW9uICogYXR0cml0aW9uX3N0YXR1cwogIG1vZGVsIDwtIGFvdihhcy5mb3JtdWxhKHBhc3RlKHZhciwgIn4gY29uZGl0aW9uICogYXR0cml0aW9uX3N0YXR1cyIpKSwgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUpCiAgdGlkeShtb2RlbCkKfSkKbmFtZXMoYW5vdmFfdGFibGVfbGlzdCkgPC0gcHJlX3ZhcnMKCiMgUHJpbnQgYSBzZXBhcmF0ZSBBUEEtc3R5bGVkIHRhYmxlIGZvciBlYWNoIHByZS10ZXN0IHZhcmlhYmxlJ3MgQU5PVkEgcmVzdWx0cwpmb3IgKHZhciBpbiBwcmVfdmFycykgewogIGNhdCgiVHdvLXdheSBBTk9WQSByZXN1bHRzIGZvciIsIHZhciwgIjpcbiIpCiAgcHJpbnQoa2FibGUoYW5vdmFfdGFibGVfbGlzdFtbdmFyXV0sIGRpZ2l0cyA9IDMsCiAgICAgICAgICAgICAgY2FwdGlvbiA9IHBhc3RlKCJUd28td2F5IEFOT1ZBIGZvciIsIHZhciwgImJ5IENvbmRpdGlvbiBhbmQgQXR0cml0aW9uIFN0YXR1cyIpLAogICAgICAgICAgICAgIGZvcm1hdCA9ICJtYXJrZG93biIpICU+JQogICAgICAgICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpKQogIGNhdCgiXG5cbiIpCn0KCmBgYAojIyMjIFVDTEEgTG9uZWxpZXNzIEZvbGxvdyBVcDoKKlJlc3VsdHMqOiBBbW9uZyBBdHRyaXRlcnMsIGJhc2VsaW5lIGxvbmVsaW5lc3Mgd2FzIHNpZ25pZmljYW50bHkgaGlnaGVyIGluIHRoZSBXYWl0bGlzdCBDb250cm9sIGdyb3VwIGNvbXBhcmVkIHRvIHRoZSBQdXJyYmxlIGdyb3VwLCB0KDE0MykgPSAyLjUxLCBwID0gLjAxMy4KQW1vbmcgQ29tcGxldGVycywgdGhlcmUgd2FzIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gYmFzZWxpbmUgbG9uZWxpbmVzcyBzY29yZXMgYnkgY29uZGl0aW9uLCB0KDE0MykgPSAwLjU4LCBwID0gLjU2LgpgYGB7cn0KIyBMb2FkIHJlcXVpcmVkIHBhY2thZ2VzCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZW1tZWFucykKbGlicmFyeShlZmZlY3RzaXplKQpsaWJyYXJ5KHJlbXBzeWMpICAgIyBmb3IgbmljZV90YWJsZQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIFN1cHBvc2UgeW91IGhhdmUgYWxyZWFkeSBmaXQgeW91ciBtb2RlbDoKbW9kZWwgPC0gYW92KFByZV91Y2xhX1N1bSB+IGNvbmRpdGlvbl9mYWN0b3IgKiBhdHRyaXRpb25fc3RhdHVzLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKCiMgT2J0YWluIGVzdGltYXRlZCBtYXJnaW5hbCBtZWFucyBmb3IgJ2NvbmRpdGlvbl9mYWN0b3InIGF0IGVhY2ggbGV2ZWwgb2YgJ2F0dHJpdGlvbl9zdGF0dXMnCmVtbV9yZXN1bHRzIDwtIGVtbWVhbnMobW9kZWwsIH4gY29uZGl0aW9uX2ZhY3RvciB8IGF0dHJpdGlvbl9zdGF0dXMpCnByaW50KGVtbV9yZXN1bHRzKQoKIyBQZXJmb3JtIHBhaXJ3aXNlIGNvbXBhcmlzb25zIHdpdGhpbiBlYWNoIGF0dHJpdGlvbiBzdGF0dXMgZ3JvdXAKcGFpcndpc2VfcmVzdWx0cyA8LSBjb250cmFzdChlbW1fcmVzdWx0cywgbWV0aG9kID0gInBhaXJ3aXNlIikKcHJpbnQocGFpcndpc2VfcmVzdWx0cykKCiMgQ2FsY3VsYXRlIENvaGVuJ3MgZCBmb3IgdGhlIGVmZmVjdCBvZiBjb25kaXRpb24gd2l0aGluIGVhY2ggbGV2ZWwgb2YgYXR0cml0aW9uIHN0YXR1cwoKIyBGb3IgQ29tcGxldGVyczoKZGF0YV9jb21wbGV0ZXIgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUgZmlsdGVyKGF0dHJpdGlvbl9zdGF0dXMgPT0gIkNvbXBsZXRlciIpCmRfY29tcGxldGVyIDwtIGNvaGVuc19kKFByZV91Y2xhX1N1bSB+IGNvbmRpdGlvbl9mYWN0b3IsIGRhdGEgPSBkYXRhX2NvbXBsZXRlcikKcHJpbnQoZF9jb21wbGV0ZXIpCgojIEZvciBBdHRyaXRlcnM6CmRhdGFfYXR0cml0ZXIgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUgZmlsdGVyKGF0dHJpdGlvbl9zdGF0dXMgPT0gIkF0dHJpdGVyIikKZF9hdHRyaXRlciA8LSBjb2hlbnNfZChQcmVfdWNsYV9TdW0gfiBjb25kaXRpb25fZmFjdG9yLCBkYXRhID0gZGF0YV9hdHRyaXRlcikKcHJpbnQoZF9hdHRyaXRlcikKCiMgRW5zdXJlIHRoYXQgY29uZGl0aW9uIGFuZCBhdHRyaXRpb25fc3RhdHVzIGFyZSBmYWN0b3JzClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUoY29uZGl0aW9uID0gYXMuZmFjdG9yKGNvbmRpdGlvbiksCiAgICAgICAgIGF0dHJpdGlvbl9zdGF0dXMgPSBhcy5mYWN0b3IoYXR0cml0aW9uX3N0YXR1cykpCgojIENvbXB1dGUgZGVzY3JpcHRpdmVzIGZvciBQcmVfdWNsYV9TdW0gYnkgY29uZGl0aW9uIGFuZCBhdHRyaXRpb25fc3RhdHVzCmdyb3VwX2Rlc2MgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShjb25kaXRpb24sIGF0dHJpdGlvbl9zdGF0dXMpICU+JQogIHN1bW1hcmlzZSgKICAgIE4gPSBuKCksCiAgICBNZWFuID0gcm91bmQobWVhbihQcmVfdWNsYV9TdW0sIG5hLnJtID0gVFJVRSksIDIpLAogICAgU0QgPSByb3VuZChzZChQcmVfdWNsYV9TdW0sIG5hLnJtID0gVFJVRSksIDIpLAogICAgLmdyb3VwcyA9ICJkcm9wIgogICkKCiMgRGlzcGxheSB0aGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyB0YWJsZSB1c2luZyByZW1wc3ljJ3MgbmljZV90YWJsZQpuaWNlX3RhYmxlKGdyb3VwX2Rlc2MsIAogICAgICAgICAgIHRpdGxlID0gIkRlc2NyaXB0aXZlIFN0YXRpc3RpY3MgZm9yIFByZV91Y2xhX1N1bSBieSBDb25kaXRpb24gYW5kIEF0dHJpdGlvbiBTdGF0dXMiLCAKICAgICAgICAgICBub3RlID0gIk1lYW5zIGFuZCBzdGFuZGFyZCBkZXZpYXRpb25zIGZvciBQcmVfdWNsYV9TdW0gYWNyb3NzIGZvdXIgZ3JvdXBzIGRlZmluZWQgYnkgY29uZGl0aW9uIChQdXJyYmxlLCBXYWl0bGlzdCBDb250cm9sKSBhbmQgYXR0cml0aW9uIHN0YXR1cyAoQ29tcGxldGVyLCBBdHRyaXRlcikuIikKCiMgRW5zdXJlIHRoYXQgY29uZGl0aW9uIGFuZCBhdHRyaXRpb25fc3RhdHVzIGFyZSBmYWN0b3JzClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUoY29uZGl0aW9uID0gYXMuZmFjdG9yKGNvbmRpdGlvbiksCiAgICAgICAgIGF0dHJpdGlvbl9zdGF0dXMgPSBhcy5mYWN0b3IoYXR0cml0aW9uX3N0YXR1cykpCgojIFNpbXBsZSBFZmZlY3RzIEFuYWx5c2lzIGZvciBQcmVfdWNsYV9TdW0gYnkgYXR0cml0aW9uX3N0YXR1cyB3aXRoaW4gdGhlIFB1cnJibGUgY29uZGl0aW9uCnB1cnJibGVfdHRlc3QgPC0gbmljZV90X3Rlc3QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lIGZpbHRlcihjb25kaXRpb24gPT0gIjEiKSwKICByZXNwb25zZSA9ICJQcmVfdWNsYV9TdW0iLAogIGdyb3VwID0gImF0dHJpdGlvbl9zdGF0dXMiLAogIHdhcm5pbmcgPSBGQUxTRQopCgojIFNpbXBsZSBFZmZlY3RzIEFuYWx5c2lzIGZvciBQcmVfdWNsYV9TdW0gYnkgYXR0cml0aW9uX3N0YXR1cyB3aXRoaW4gdGhlIFdhaXRsaXN0IENvbnRyb2wgY29uZGl0aW9uCndhaXRsaXN0X3R0ZXN0IDwtIG5pY2VfdF90ZXN0KAogIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JSBmaWx0ZXIoY29uZGl0aW9uID09ICIwIiksCiAgcmVzcG9uc2UgPSAiUHJlX3VjbGFfU3VtIiwKICBncm91cCA9ICJhdHRyaXRpb25fc3RhdHVzIiwKICB3YXJuaW5nID0gRkFMU0UKKQoKIyBEaXNwbGF5IHRoZSByZXN1bHRzIHVzaW5nIHJlbXBzeWMncyBuaWNlX3RhYmxlCmNhdCgiU2ltcGxlIEVmZmVjdHMgQW5hbHlzaXM6IFByZV91Y2xhX1N1bSBieSBBdHRyaXRpb24gU3RhdHVzIHdpdGhpbiB0aGUgUHVycmJsZSBDb25kaXRpb25cbiIpCm5pY2VfdGFibGUocHVycmJsZV90dGVzdCkKCmNhdCgiXG5TaW1wbGUgRWZmZWN0cyBBbmFseXNpczogUHJlX3VjbGFfU3VtIGJ5IEF0dHJpdGlvbiBTdGF0dXMgd2l0aGluIHRoZSBXYWl0bGlzdCBDb250cm9sIENvbmRpdGlvblxuIikKbmljZV90YWJsZSh3YWl0bGlzdF90dGVzdCkKCmBgYAojIyBCYXNlbGluZSBPdXRjb21lIFZhcmlhYmxlcyBBbmFseXNlcwojIyMgUmVsaWFiaWxpdHkKYGBge3J9CiMgTG9hZCBwc3ljaCBmb3IgQ3JvbmJhY2jigJlzIGFscGhhCmxpYnJhcnkocHN5Y2gpCgojIEFzc3VtZSB5b3VyIGRhdGEgZnJhbWUgaXMgbmFtZWQgTm9EdXBfUHVycmJsZUFub24KZGYgPC0gTm9EdXBfUHVycmJsZUFub24KCiMgSGVscGVyIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYW5kIHByaW50IG9ubHkgdGhlIG92ZXJhbGwgQ3JvbmJhY2jigJlzIM6xCmdldF9hbHBoYSA8LSBmdW5jdGlvbihpdGVtc19kZikgewogIGEgPC0gYWxwaGEoaXRlbXNfZGYsIHdhcm5pbmdzID0gRkFMU0UpCiAgcmV0dXJuKGEkdG90YWxbWyJyYXdfYWxwaGEiXV0pCn0KCiMgMSkgREVSU+KAkDggKGRlcnM4XzEgdGhyb3VnaCBkZXJzOF84KQpkZXJzOF9pdGVtcyA8LSBkZlssIGMoImRlcnM4XzEiLCAiZGVyczhfMiIsICJkZXJzOF8zIiwgImRlcnM4XzQiLAogICAgICAgICAgICAgICAgICAgICAgImRlcnM4XzUiLCAiZGVyczhfNiIsICJkZXJzOF83IiwgImRlcnM4XzgiKV0KZGVyczhfYWxwaGEgPC0gZ2V0X2FscGhhKGRlcnM4X2l0ZW1zKQpjYXQoIkRFUlMtOCBDcm9uYmFjaOKAmXMgzrEgPSIsIHJvdW5kKGRlcnM4X2FscGhhLCAzKSwgIlxuIikKCiMgMikgR0FELTcgKGdhZDdfMSB0aHJvdWdoIGdhZDdfNykKZ2FkN19pdGVtcyA8LSBkZlssIGMoImdhZDdfMSIsICJnYWQ3XzIiLCAiZ2FkN18zIiwgImdhZDdfNCIsCiAgICAgICAgICAgICAgICAgICAgICJnYWQ3XzUiLCAiZ2FkN182IiwgImdhZDdfNyIpXQpnYWQ3X2FscGhhIDwtIGdldF9hbHBoYShnYWQ3X2l0ZW1zKQpjYXQoIkdBRC03IENyb25iYWNo4oCZcyDOsSA9Iiwgcm91bmQoZ2FkN19hbHBoYSwgMyksICJcbiIpCgojIDMpIFBIUS05IChwaHE5XzEgdGhyb3VnaCBwaHE5XzkpCnBocTlfaXRlbXMgPC0gZGZbLCBjKCJwaHE5XzEiLCAicGhxOV8yIiwgInBocTlfMyIsICJwaHE5XzQiLAogICAgICAgICAgICAgICAgICAgICAicGhxOV81IiwgInBocTlfNiIsICJwaHE5XzciLCAicGhxOV84IiwgInBocTlfOSIpXQpwaHE5X2FscGhhIDwtIGdldF9hbHBoYShwaHE5X2l0ZW1zKQpjYXQoIlBIUS05IENyb25iYWNo4oCZcyDOsSA9Iiwgcm91bmQocGhxOV9hbHBoYSwgMyksICJcbiIpCgojIDQpIFNIUyAoc2hzXzEgdGhyb3VnaCBzaHNfNikKc2hzX2l0ZW1zIDwtIGRmWywgYygic2hzXzEiLCAic2hzXzIiLCAic2hzXzMiLCAic2hzXzQiLCAic2hzXzUiLCAic2hzXzYiKV0Kc2hzX2FscGhhIDwtIGdldF9hbHBoYShzaHNfaXRlbXMpCmNhdCgiU0hTIFRvdGFsIENyb25iYWNo4oCZcyDOsSA9Iiwgcm91bmQoc2hzX2FscGhhLCAzKSwgIlxuIikKCiMgNSkgVUNMQSAodWNsYTEgdGhyb3VnaCB1Y2xhMykKdWNsYV9pdGVtcyA8LSBkZlssIGMoInVjbGExIiwgInVjbGEyIiwgInVjbGEzIildCnVjbGFfYWxwaGEgPC0gZ2V0X2FscGhhKHVjbGFfaXRlbXMpCmNhdCgiVUNMQSBMb25lbGluZXNzIENyb25iYWNo4oCZcyDOsSA9Iiwgcm91bmQodWNsYV9hbHBoYSwgMyksICJcbiIpCgojIDYpIFBNRVJRLUVuZ2FnZSAocG1lcnFfZW5nYWdlXzEgdGhyb3VnaCBwbWVycV9lbmdhZ2VfOSkKcG1lcnFfaXRlbXMgPC0gZGZbLCBjKCJwbWVycV9lbmdhZ2VfMSIsICJwbWVycV9lbmdhZ2VfMiIsICJwbWVycV9lbmdhZ2VfMyIsCiAgICAgICAgICAgICAgICAgICAgICAicG1lcnFfZW5nYWdlXzQiLCAicG1lcnFfZW5nYWdlXzUiLCAicG1lcnFfZW5nYWdlXzYiLAogICAgICAgICAgICAgICAgICAgICAgInBtZXJxX2VuZ2FnZV83IiwgInBtZXJxX2VuZ2FnZV84IiwgInBtZXJxX2VuZ2FnZV85IildCnBtZXJxX2FscGhhIDwtIGdldF9hbHBoYShwbWVycV9pdGVtcykKY2F0KCJQTUVSUS1FbmdhZ2UgQ3JvbmJhY2jigJlzIM6xID0iLCByb3VuZChwbWVycV9hbHBoYSwgMyksICJcbiIpCmBgYAoKIyMjIERlc2NyaXB0aXZlIEFuYWx5c2VzClRoZSB0YWJsZSBiZWxvdyBzaG93cyBQcmUtIGFuZCBQb3N0LVRlc3QgRGVzY3JpcHRpdmVzIGZvciBTdHVkeSBWYXJpYWJsZXMKYGBge3J9CiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoYnJvb20pCgojIERlZmluZSBwcmUtdGVzdCBhbmQgcG9zdC10ZXN0IHZhcmlhYmxlcwpwcmVfdmFycyA8LSBjKCJQcmVfREVSUzhfU3VtIiwgIlByZV9HQUQ3X1N1bSIsICJQcmVfUEhROV9TdW0iLAogICAgICAgICAgICAgICJQcmVfU0hTX1BhdGh3YXlzIiwgIlByZV9TSFNfQWdlbmN5IiwgIlByZV9TSFNfVG90YWxIb3BlIiwKICAgICAgICAgICAgICAiUHJlX3VjbGFfU3VtIiwgIlByZV9wbWVycV9Gb2N1c19BdmciLCAiUHJlX3BtZXJxX0Rpc3RyYWN0X0F2ZyIsICJQcmVfcG1lcnFfQURfQXZnIikKCnBvc3RfdmFycyA8LSBjKCJQb3N0X0RFUlM4X1N1bSIsICJQb3N0X0dBRDdfU3VtIiwgIlBvc3RfUEhROV9TdW0iLAogICAgICAgICAgICAgICAiUG9zdF9TSFNfUGF0aHdheXMiLCAiUG9zdF9TSFNfQWdlbmN5IiwgIlBvc3RfU0hTX1RvdGFsSG9wZSIsCiAgICAgICAgICAgICAgICJQb3N0X3VjbGFfU3VtIiwgIlBvc3RfcG1lcnFfRm9jdXNfQXZnIiwgIlBvc3RfcG1lcnFfRGlzdHJhY3RfQXZnIiwgIlBvc3RfcG1lcnFfQURfQXZnIikKCgojIENvbXB1dGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBmb3IgUHJlLVRlc3QgRGF0YQpwcmVfZGVzY3JpcHRpdmVzIDwtIHB1cnJibGVfd2lkZV9maW5hbCAlPiUKICBzZWxlY3QoYWxsX29mKHByZV92YXJzKSkgJT4lCiAgcHN5Y2g6OmRlc2NyaWJlKCkgJT4lCiAgYXMuZGF0YS5mcmFtZSgpICU+JQogIHNlbGVjdChuLCBtZWFuLCBzZCwgbWluLCBtYXgsIHNrZXcsIGt1cnRvc2lzKSAlPiUKICByZW5hbWUoTiA9IG4sIE1lYW4gPSBtZWFuLCBTRCA9IHNkLCBNaW4gPSBtaW4sIE1heCA9IG1heCwgU2tld25lc3MgPSBza2V3LCBLdXJ0b3NpcyA9IGt1cnRvc2lzKQoKIyBDb21wdXRlIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgZm9yIFBvc3QtVGVzdCBEYXRhCnBvc3RfZGVzY3JpcHRpdmVzIDwtIHB1cnJibGVfd2lkZV9maW5hbCAlPiUKICBzZWxlY3QoYWxsX29mKHBvc3RfdmFycykpICU+JQogIHBzeWNoOjpkZXNjcmliZSgpICU+JQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICBzZWxlY3QobiwgbWVhbiwgc2QsIG1pbiwgbWF4LCBza2V3LCBrdXJ0b3NpcykgJT4lCiAgcmVuYW1lKE4gPSBuLCBNZWFuID0gbWVhbiwgU0QgPSBzZCwgTWluID0gbWluLCBNYXggPSBtYXgsIFNrZXduZXNzID0gc2tldywgS3VydG9zaXMgPSBrdXJ0b3NpcykKCiMgRGlzcGxheSBEZXNjcmlwdGl2ZSBUYWJsZXMKY2F0KCJcbiMjIyAqKlByZS1UZXN0IERlc2NyaXB0aXZlIFN0YXRpc3RpY3MqKlxuIikKa2FibGUocHJlX2Rlc2NyaXB0aXZlcywgY2FwdGlvbiA9ICJEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzIGZvciBQcmUtVGVzdCBEYXRhIiwgZGlnaXRzID0gMykKCmNhdCgiXG4jIyMgKipQb3N0LVRlc3QgRGVzY3JpcHRpdmUgU3RhdGlzdGljcyoqXG4iKQprYWJsZShwb3N0X2Rlc2NyaXB0aXZlcywgY2FwdGlvbiA9ICJEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzIGZvciBQb3N0LVRlc3QgRGF0YSIsIGRpZ2l0cyA9IDMpCgpgYGAKIyMjIEJhc2xlaW5lIEVxdWl2YWxlbmNlIG9mIE91dGNvbWVzICh04oCRVGVzdHMpOgpXZSBydW4gaW5kZXBlbmRlbnQgc2FtcGxlcyB04oCRdGVzdHMgY29tcGFyaW5nIHRoZSB0d28gY29uZGl0aW9ucyBvbiBlYWNoIHByZeKAkXRlc3QgdmFyaWFibGUgdXNpbmcgbmljZV90X3Rlc3QgZnJvbSByZW1wc3ljLiBUaGlzIHByb3ZpZGVzIHTigJFzdGF0aXN0aWNzLCBkZWdyZWVzIG9mIGZyZWVkb20sIHDigJF2YWx1ZXMsIGVmZmVjdCBzaXplcyAoQ29oZW4ncyBkKSwgYW5kIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLCBhbGwgZm9ybWF0dGVkIGludG8gYW4gQVBB4oCRc3R5bGUgdGFibGUuCipSZXN1bHQqOiBObyBkaWZmZXJlbmNlcyBieSBjaGFuY2UuCmBgYHtyfQpsaWJyYXJ5KHJlbXBzeWMpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgRGVmaW5lIHByZeKAkXRlc3QgdmFyaWFibGUgbmFtZXMgCnByZV92YXJzICA8LSBjKCJQcmVfREVSUzhfU3VtIiwgIlByZV9HQUQ3X1N1bSIsICJQcmVfUEhROV9TdW0iLAogICAgICAgICAgICAgICAiUHJlX1NIU19QYXRod2F5cyIsICJQcmVfU0hTX0FnZW5jeSIsICJQcmVfU0hTX1RvdGFsSG9wZSIsCiAgICAgICAgICAgICAgICJQcmVfdWNsYV9TdW0iLCAiUHJlX3BtZXJxX0ZvY3VzX0F2ZyIsICJQcmVfcG1lcnFfRGlzdHJhY3RfQXZnIiwgIlByZV9wbWVycV9BRF9BdmciKQoKCiMgUnVuIHQtdGVzdHMgZm9yIGFsbCBwcmXigJF0ZXN0IG91dGNvbWVzIGJ5IGNvbmRpdGlvbgpzdGF0cy50YWJsZS5wcmUgPC0gbmljZV90X3Rlc3QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgcmVzcG9uc2UgPSBwcmVfdmFycywKICBncm91cCA9ICJjb25kaXRpb24iLAogIHdhcm5pbmcgPSBGQUxTRQopCgojIERpc3BsYXkgdGhlIHByZeKAkXRlc3QgdC10ZXN0IHRhYmxlIGluIEFQQSBzdHlsZQpuaWNlX3RhYmxlKHN0YXRzLnRhYmxlLnByZSkKYGBgCiMjIyBPdXRsaWVyIERldGVjdGlvbiBhbmQgVmlzdWFsaXphdGlvbiA6CldlIGZpcnN0IGNvbnZlcnQgZWFjaCBwcmXigJF0ZXN0IHZhcmlhYmxlIHRvIHrigJFzY29yZXMgYW5kIGZsYWcgYW55IG9ic2VydmF0aW9ucyB3aXRoIGFuIGFic29sdXRlIHrigJFzY29yZSBncmVhdGVyIHRoYW4gMyBhcyBwb3RlbnRpYWwgb3V0bGllcnMuIEEgc3VtbWFyeSB0YWJsZSBpcyBjcmVhdGVkIHRoYXQgbGlzdHMgdGhlIG51bWJlciBvZiBvdXRsaWVycyBmb3IgZWFjaCB2YXJpYWJsZS4gV2UgdGhlbiBzcGVjaWZpY2FsbHkgaW5zcGVjdCB0aGUgb3V0bGllcnMgZm9yIHRoZSBQcmVfcG1lcnFfRm9jdXNfQXZnIHZhcmlhYmxlLCB3aGljaCBhcHBlYXJzIHRvIGhhdmUgdHdvIGNhc2VzIGV4Y2VlZGluZyBvdXIgdGhyZXNob2xkLgpUbyBiZXR0ZXIgdW5kZXJzdGFuZCB0aGUgZGlzdHJpYnV0aW9uIG9mIFByZV9wbWVycV9Gb2N1c19BdmcsIHdlIGdlbmVyYXRlIGEgYm94cGxvdCAod2l0aCBqaXR0ZXJlZCBkYXRhIHBvaW50cykgdGhhdCB2aXN1YWxseSBoaWdobGlnaHRzIHRoZSBleHRyZW1lIHZhbHVlcy4KYGBge3J9CmxpYnJhcnkocmVtcHN5YykKbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKIyBEZWZpbmUgcHJl4oCRdGVzdCB2YXJpYWJsZSBuYW1lcyAKcHJlX3ZhcnMgIDwtIGMoIlByZV9ERVJTOF9TdW0iLCAiUHJlX0dBRDdfU3VtIiwgIlByZV9QSFE5X1N1bSIsCiAgICAgICAgICAgICAgICJQcmVfU0hTX1BhdGh3YXlzIiwgIlByZV9TSFNfQWdlbmN5IiwgIlByZV9TSFNfVG90YWxIb3BlIiwKICAgICAgICAgICAgICAgIlByZV91Y2xhX1N1bSIsICJQcmVfcG1lcnFfRm9jdXNfQXZnIiwgIlByZV9wbWVycV9EaXN0cmFjdF9BdmciLCAiUHJlX3BtZXJxX0FEX0F2ZyIpCgojIFNldCB0aHJlc2hvbGQgZm9yIG91dGxpZXJzIChjb21tb25seSB8enwgPiAzKQp0aHJlc2hvbGQgPC0gMwoKIyBDb21wdXRlIHotc2NvcmVzIGFuZCBpZGVudGlmeSBvdXRsaWVycyBmb3IgZWFjaCBwcmUtdGVzdCB2YXJpYWJsZQpvdXRsaWVyX2xpc3QgPC0gbGFwcGx5KHByZV92YXJzLCBmdW5jdGlvbih2YXIpIHsKICBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogICAgc2VsZWN0KHBzaWQsIGFsbF9vZih2YXIpKSAlPiUKICAgIG11dGF0ZSh6ID0gYXMubnVtZXJpYyhzY2FsZShnZXQodmFyKSkpKSAlPiUKICAgIGZpbHRlcihhYnMoeikgPiB0aHJlc2hvbGQpCn0pCm5hbWVzKG91dGxpZXJfbGlzdCkgPC0gcHJlX3ZhcnMKCiMgQ3JlYXRlIGEgc3VtbWFyeSB0YWJsZSBvZiB0aGUgbnVtYmVyIG9mIG91dGxpZXJzIHBlciB2YXJpYWJsZQpvdXRsaWVyX3N1bW1hcnkgPC0gc2FwcGx5KG91dGxpZXJfbGlzdCwgbnJvdykKb3V0bGllcl9zdW1tYXJ5X2RmIDwtIGRhdGEuZnJhbWUoVmFyaWFibGUgPSBuYW1lcyhvdXRsaWVyX3N1bW1hcnkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0bGllcl9Db3VudCA9IGFzLnZlY3RvcihvdXRsaWVyX3N1bW1hcnkpKQoKY2F0KCJTdW1tYXJ5IG9mIFBvdGVudGlhbCBPdXRsaWVycyAofHp8ID4gMykgZm9yIFByZS1UZXN0IFZhcmlhYmxlczpcbiIpCnByaW50KGthYmxlKG91dGxpZXJfc3VtbWFyeV9kZiwgY2FwdGlvbiA9ICJTdW1tYXJ5IG9mIE91dGxpZXJzIGZvciBQcmUtVGVzdCBWYXJpYWJsZXMgKHx6fCA+IDMpIiwgZm9ybWF0ID0gIm1hcmtkb3duIikpCgoKY2F0KCJcbk91dGxpZXJzIGZvciBQcmVfcG1lcnFfRm9jdXNfQXZnICh8enwgPiAzKTpcbiIpCnByaW50KGthYmxlKG91dGxpZXJfbGlzdFtbIlByZV9wbWVycV9Gb2N1c19BdmciXV0sIGNhcHRpb24gPSAiT3V0bGllcnMgZm9yIFByZV9wbWVycV9Gb2N1c19BdmciLCBmb3JtYXQgPSAibWFya2Rvd24iKSkKCmxpYnJhcnkoZ2dwbG90MikKCiMgQm94cGxvdCBmb3IgUHJlX3BtZXJxX0ZvY3VzX0F2ZwpnZ3Bsb3QoUHVycmJsZV9NYXN0ZXJfV2lkZSwgYWVzKHggPSAiIiwgeSA9IFByZV9wbWVycV9Gb2N1c19BdmcpKSArCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuY29sb3VyID0gInJlZCIsIG91dGxpZXIuc2hhcGUgPSAxNiwgb3V0bGllci5zaXplID0gMykgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4xLCBhbHBoYSA9IDAuNiwgY29sb3IgPSAiYmx1ZSIpICsKICBsYWJzKHRpdGxlID0gIkJveHBsb3Qgb2YgUHJlX3BtZXJxX0ZvY3VzX0F2ZyIsCiAgICAgICB4ID0gIiIsCiAgICAgICB5ID0gIlByZV9wbWVycV9Gb2N1c19BdmciKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKCiMgTWFpbiBFZmZlY3RzIEFuYWx5c2VzCldlIGZpdCBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbHMgdG8gZXhhbWluZSB0aGUgZWZmZWN0IG9mIGNvbmRpdGlvbiAoY29kZWQgYXMgMSA9IFB1cnJibGUsIDAgPSBXYWl0bGlzdCBDb250cm9sKSBvbiBwb3N0LXRlc3Qgb3V0Y29tZXMsIGNvbnRyb2xsaW5nIGZvciBiYXNlbGluZSBsZXZlbHMgb2YgdGhlIG91dGNvbWUsIGdlbmRlciBpZGVudGl0eSAobnVtZXJpYyksIGFuZCBhZ2UuCkRFUlMtODogUGFydGljaXBhbnRzIGluIHRoZSBQdXJyYmxlIGNvbmRpdGlvbiByZXBvcnRlZCBzaWduaWZpY2FudGx5IGJldHRlciBvdXRjb21lcyBhdCBwb3N0LXRlc3QKUFBNRVJRLUFEOiBBIHNpZ25pZmljYW50IHBvc2l0aXZlIGVmZmVjdCBvZiBjb25kaXRpb24gd2FzIGZvdW5kClBIUS05OiBUaGUgUHVycmJsZSBncm91cCBzaG93ZWQgbG93ZXIgZGVwcmVzc2l2ZSBzeW1wdG9tcyBhdCBwb3N0LXRlc3QKR0FELTc6IFRoZSBjb25kaXRpb24gZWZmZWN0IHdhcyBhbHNvIHNpZ25pZmljYW50LCB0aG91Z2ggc21hbGxlciwgZmF2b3JpbmcgUHVycmJsZSBjb25kaXRpb24uCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJlbXBzeWMpICAgIyBmb3IgbmljZV9sbSBhbmQgbmljZV90YWJsZQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIERlZmluZSBwb3N04oCRdGVzdCBvdXRjb21lcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBwcmXigJF0ZXN0IGNvdmFyaWF0ZXMKcG9zdF92YXJzIDwtIGMoIlBvc3RfREVSUzhfU3VtIiwgIlBvc3RfcG1lcnFfRm9jdXNfQXZnIiwgIlBvc3RfcG1lcnFfRGlzdHJhY3RfQXZnIiwgCiAgICAgICAgICAgICAgICJQb3N0X3BtZXJxX0FEX0F2ZyIsICJQb3N0X0dBRDdfU3VtIiwgIlBvc3RfUEhROV9TdW0iLCAKICAgICAgICAgICAgICAgIlBvc3RfU0hTX1BhdGh3YXlzIiwgIlBvc3RfU0hTX0FnZW5jeSIsICJQb3N0X1NIU19Ub3RhbEhvcGUiLCAiUG9zdF91Y2xhX1N1bSIpCnByZV92YXJzICA8LSBzdWIoIl5Qb3N0XyIsICJQcmVfIiwgcG9zdF92YXJzKQoKIyBDcmVhdGUgYW4gZW1wdHkgbGlzdCB0byBzdG9yZSByZWdyZXNzaW9uIG1vZGVscwptb2RlbF9saXN0IDwtIGxpc3QoKQoKIyBMb29wIHRocm91Z2ggZWFjaCBvdXRjb21lIHBhaXIKZm9yIChpIGluIHNlcV9hbG9uZyhwb3N0X3ZhcnMpKSB7CiAgb3V0Y29tZSA8LSBwb3N0X3ZhcnNbaV0KICBwcmVfdmFyIDwtIHByZV92YXJzW2ldCiAgCiAgIyBGaXQgdGhlIHJlZ3Jlc3Npb24gbW9kZWw6CiAgIyBPdXRjb21lIH4gY29uZGl0aW9uX251bSArIGNvcnJlc3BvbmRpbmcgcHJlLXRlc3Qgb3V0Y29tZSArIGlkZW50aXR5X2dyb3VwX251bSArIGFnZQogIGZvcm11bGFfc3RyIDwtIHBhc3RlKG91dGNvbWUsICJ+IGNvbmRpdGlvbl9udW0gKyIsIHByZV92YXIsICIrIGlkZW50aXR5X2dyb3VwX251bSArIGFnZSIpCiAgbW9kZWxfbGlzdFtbb3V0Y29tZV1dIDwtIGxtKGFzLmZvcm11bGEoZm9ybXVsYV9zdHIpLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKfQoKIyBGb3JtYXQgdGhlIGxpc3Qgb2YgbW9kZWxzIHVzaW5nIHJlbXBzeWMncyBuaWNlX2xtKCkgZnVuY3Rpb24KIyBUaGlzIHdpbGwgcHJvZHVjZSBhIGNvbWJpbmVkIHRhYmxlIGZvciBhbGwgbW9kZWxzLCBoaWdobGlnaHRpbmcgdGhlIGVmZmVjdCBvZiBjb25kaXRpb25fbnVtLgpyZXN1bHRzX3RhYmxlIDwtIG5pY2VfbG0obW9kZWxfbGlzdCkKCiMgRGlzcGxheSB0aGUgdGFibGUgaW4gQVBBIGZvcm1hdCB1c2luZyBuaWNlX3RhYmxlCm5pY2VfdGFibGUocmVzdWx0c190YWJsZSwgaGlnaGxpZ2h0ID0gVFJVRSkKCmBgYAojIyBNYWluIEVmZmVjdHMgd2l0aG91dCBvdXRsaWVycwpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShyZW1wc3ljKSAgICMgZm9yIG5pY2VfbG0gYW5kIG5pY2VfdGFibGUKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDEuIENyZWF0ZSBhIGRhdGFzZXQgd2l0aCB0aGUgb3V0bGllcnMgcmVtb3ZlZAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClB1cnJibGVfTWFzdGVyX1dpZGVfbm9fb3V0bGllcnMgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBmaWx0ZXIoIXBzaWQgJWluJSBjKCJDNTciLCAiQzc5IikpCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMi4gRml0IHRoZSByZWdyZXNzaW9uIG1vZGVscyBmb3IgUG9zdF9wbWVycV9Gb2N1c19BdmcKIyAgICBPdXRjb21lIH4gY29uZGl0aW9uX251bSArIFByZV9wbWVycV9Gb2N1c19BdmcgKyBpZGVudGl0eV9ncm91cF9udW0gKyBhZ2UKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBNb2RlbCB1c2luZyB0aGUgZnVsbCBkYXRhc2V0ICh3aXRoIG91dGxpZXJzKQptb2RlbF9mb2N1c19mdWxsIDwtIGxtKFBvc3RfcG1lcnFfRm9jdXNfQXZnIH4gY29uZGl0aW9uX251bSArIFByZV9wbWVycV9Gb2N1c19BdmcgKyBpZGVudGl0eV9ncm91cF9udW0gKyBhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKCiMgTW9kZWwgdXNpbmcgdGhlIGRhdGFzZXQgd2l0aCBvdXRsaWVycyByZW1vdmVkCm1vZGVsX2ZvY3VzX25vX291dGxpZXJzIDwtIGxtKFBvc3RfcG1lcnFfRm9jdXNfQXZnIH4gY29uZGl0aW9uX251bSArIFByZV9wbWVycV9Gb2N1c19BdmcgKyBpZGVudGl0eV9ncm91cF9udW0gKyBhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlX25vX291dGxpZXJzKQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDMuIENvbXBhcmUgdGhlIG1vZGVsIHN1bW1hcmllcyB0byBhc3Nlc3MgdGhlIGltcGFjdCBvZiBvdXRsaWVycwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmNhdCgiTW9kZWwgU3VtbWFyeSAoRnVsbCBEYXRhc2V0KTpcbiIpCnByaW50KHN1bW1hcnkobW9kZWxfZm9jdXNfZnVsbCkpCgpjYXQoIlxuTW9kZWwgU3VtbWFyeSAoT3V0bGllcnMgUmVtb3ZlZCk6XG4iKQpwcmludChzdW1tYXJ5KG1vZGVsX2ZvY3VzX25vX291dGxpZXJzKSkKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyA0LiBDb21wdXRlIGFuZCBpbnNwZWN0IENvb2sncyBEaXN0YW5jZSBpbiB0aGUgZnVsbCBtb2RlbAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ2FsY3VsYXRlIENvb2sncyBkaXN0YW5jZSBmb3IgdGhlIGZ1bGwgbW9kZWwKY29va3NfZnVsbCA8LSBjb29rcy5kaXN0YW5jZShtb2RlbF9mb2N1c19mdWxsKQoKIyBJZGVudGlmeSBpbmZsdWVudGlhbCBvYnNlcnZhdGlvbnMgdXNpbmcgdGhlIGNvbW1vbiB0aHJlc2hvbGQ6IDQvKG4gLSBrIC0gMSkKbl9mdWxsIDwtIG5yb3coUHVycmJsZV9NYXN0ZXJfV2lkZSkKa19mdWxsIDwtIGxlbmd0aChjb2VmKG1vZGVsX2ZvY3VzX2Z1bGwpKSAtIDEgICMgbnVtYmVyIG9mIHByZWRpY3RvcnMgKGV4Y2x1ZGluZyBpbnRlcmNlcHQpCnRocmVzaG9sZF9jZCA8LSA0IC8gKG5fZnVsbCAtIGtfZnVsbCAtIDEpCgojIEZpbmQgd2hpY2ggb2JzZXJ2YXRpb25zIGV4Y2VlZCB0aGlzIHRocmVzaG9sZAppbmZsdWVudGlhbF9pbmRpY2VzIDwtIHdoaWNoKGNvb2tzX2Z1bGwgPiB0aHJlc2hvbGRfY2QpCmluZmx1ZW50aWFsX2lkcyA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlJHBzaWRbaW5mbHVlbnRpYWxfaW5kaWNlc10KCmNhdCgiXG5JbmZsdWVudGlhbCBPYnNlcnZhdGlvbnMgaW4gdGhlIEZ1bGwgTW9kZWwgKENvb2sncyBEaXN0YW5jZSA+ICIsIHJvdW5kKHRocmVzaG9sZF9jZCwgNCksICIpOlxuIiwgc2VwID0gIiIpCnByaW50KGluZmx1ZW50aWFsX2lkcykKCiMgT3B0aW9uYWxseSwgcGxvdCBDb29rJ3MgZGlzdGFuY2VzIGZvciBhIHZpc3VhbCBjaGVjawpwbG90KG1vZGVsX2ZvY3VzX2Z1bGwsIHdoaWNoID0gNCwgbWFpbiA9ICJDb29rJ3MgRGlzdGFuY2UgLSBGdWxsIE1vZGVsIikKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyA1LiBDcmVhdGUgYSBjb21wYXJpc29uIHRhYmxlIHVzaW5nIHJlbXBzeWMncyBuaWNlX2xtIChpZiBkZXNpcmVkKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm1vZGVsc190b19jb21wYXJlIDwtIGxpc3QoIkZ1bGwiID0gbW9kZWxfZm9jdXNfZnVsbCwgIk5vIE91dGxpZXJzIiA9IG1vZGVsX2ZvY3VzX25vX291dGxpZXJzKQpjb21wYXJpc29uX3RhYmxlIDwtIG5pY2VfbG0obW9kZWxzX3RvX2NvbXBhcmUpCmthYmxlKGNvbXBhcmlzb25fdGFibGUsIGRpZ2l0cyA9IDMsIGNhcHRpb24gPSAiQ29tcGFyaXNvbiBvZiBNb2RlbCBFc3RpbWF0ZXMgZm9yIFBvc3RfcG1lcnFfRm9jdXNfQXZnIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCmBgYAojIyBNb2RlcmF0aW9uIE1vZGVscyBmb3IgTWFpbiBFZmZlY3RzClRoZXNlIG1vZGVscyBsb29rIGF0IHR3byBxdWVzdGlvbnM6ICgxKSBEb2VzIHRoZSBpbXBhY3Qgb2YgY29uZGl0aW9uIGRlcGVuZCBvbiBwYXJ0aWNpcGFudHMnIGJhc2VsaW5lIGxldmVsIG9mIHRoYXQgb3V0Y29tZT8gYW5kICgyKSBEb2VzIHRoZSBpbXBhY3Qgb2YgY29uZGl0aW9uIGRpZmZlciBmb3IgVEdEIHZzLiBjaXMgcGFydGljaXBhbnRzPwpXZSBmaW5kIHNpZ25pZmljYW50IG1vZGVyYXRpb24gYnkgZ2VuZGVyIGlkZW50aXR5IGZvciBERVJTLTggYW5kIEdBRC03OyBub25lIGZvciBiYXNlbGluZSB2ZXJzaW9uIG9mIHRoZSBvdXRjb21lLgpgYGB7cn0KbGlicmFyeShyZW1wc3ljKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZHBseXIpCgojIENvbnZlcnQgaWRlbnRpdHlfZ3JvdXAgZmFjdG9yIHRvIG51bWVyaWMgY29kZXMKUHVycmJsZV9NYXN0ZXJfV2lkZSA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIG11dGF0ZShpZGVudGl0eV9ncm91cF9udW0gPSBhcy5udW1lcmljKGlkZW50aXR5X2dyb3VwKSkKCiMgTW9kZWwgMTogTW9kZXJhdGlvbiBieSBCYXNlbGluZSBjb250cm9sbGluZyBmb3IgaWRlbnRpdHlfZ3JvdXAKbmljZV9tb2QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgcmVzcG9uc2UgPSAiUG9zdF9ERVJTOF9TdW0iLAogIHByZWRpY3RvciA9ICJjb25kaXRpb25fbnVtIiwKICBtb2RlcmF0b3IgPSAiUHJlX0RFUlM4X1N1bSIsCiAgY292YXJpYXRlcyA9IGMoImlkZW50aXR5X2dyb3VwX251bSIsICJhZ2UiKQopIHw+CiAgbmljZV90YWJsZShoaWdobGlnaHQgPSBUUlVFKQoKbmljZV9tb2QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgcmVzcG9uc2UgPSAiUG9zdF9wbWVycV9Gb2N1c19BdmciLAogIHByZWRpY3RvciA9ICJjb25kaXRpb25fbnVtIiwKICBtb2RlcmF0b3IgPSAiUHJlX3BtZXJxX0ZvY3VzX0F2ZyIsCiAgY292YXJpYXRlcyA9IGMoImlkZW50aXR5X2dyb3VwX251bSIsICJhZ2UiKQopIHw+CiAgbmljZV90YWJsZShoaWdobGlnaHQgPSBUUlVFKQoKbmljZV9tb2QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgcmVzcG9uc2UgPSAiUG9zdF9wbWVycV9EaXN0cmFjdF9BdmciLAogIHByZWRpY3RvciA9ICJjb25kaXRpb25fbnVtIiwKICBtb2RlcmF0b3IgPSAiUHJlX3BtZXJxX0Rpc3RyYWN0X0F2ZyIsCiAgY292YXJpYXRlcyA9IGMoImlkZW50aXR5X2dyb3VwX251bSIsICJhZ2UiKQopIHw+CiAgbmljZV90YWJsZShoaWdobGlnaHQgPSBUUlVFKQoKbmljZV9tb2QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgcmVzcG9uc2UgPSAiUG9zdF9wbWVycV9BRF9BdmciLAogIHByZWRpY3RvciA9ICJjb25kaXRpb25fbnVtIiwKICBtb2RlcmF0b3IgPSAiUHJlX3BtZXJxX0FEX0F2ZyIsCiAgY292YXJpYXRlcyA9IGMoImlkZW50aXR5X2dyb3VwX251bSIsICJhZ2UiKQopIHw+CiAgbmljZV90YWJsZShoaWdobGlnaHQgPSBUUlVFKQoKCgojIE1vZGVsIDI6IE1vZGVyYXRpb24gYnkgR2VuZGVyIElkZW50aXR5IGNvbnRyb2xsaW5nIGZvciBiYXNlbGluZQpuaWNlX21vZCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9ICJQb3N0X0RFUlM4X1N1bSIsCiAgcHJlZGljdG9yID0gImNvbmRpdGlvbl9udW0iLAogIG1vZGVyYXRvciA9ICJpZGVudGl0eV9ncm91cF9udW0iLAogIGNvdmFyaWF0ZXMgPSBjKCJQcmVfREVSUzhfU3VtIiwgImFnZSIpCikgfD4KICBuaWNlX3RhYmxlKGhpZ2hsaWdodCA9IFRSVUUpCgpuaWNlX21vZCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9ICJQb3N0X3BtZXJxX0ZvY3VzX0F2ZyIsCiAgcHJlZGljdG9yID0gImNvbmRpdGlvbl9udW0iLAogIG1vZGVyYXRvciA9ICJpZGVudGl0eV9ncm91cF9udW0iLAogIGNvdmFyaWF0ZXMgPSBjKCJQcmVfcG1lcnFfRm9jdXNfQXZnIiwgImFnZSIpCikgfD4KICBuaWNlX3RhYmxlKGhpZ2hsaWdodCA9IFRSVUUpCgpuaWNlX21vZCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9ICJQb3N0X3BtZXJxX0Rpc3RyYWN0X0F2ZyIsCiAgcHJlZGljdG9yID0gImNvbmRpdGlvbl9udW0iLAogIG1vZGVyYXRvciA9ICJpZGVudGl0eV9ncm91cF9udW0iLAogIGNvdmFyaWF0ZXMgPSBjKCJQcmVfcG1lcnFfRGlzdHJhY3RfQXZnIiwgImFnZSIpCikgfD4KICBuaWNlX3RhYmxlKGhpZ2hsaWdodCA9IFRSVUUpCgpuaWNlX21vZCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9ICJQb3N0X3BtZXJxX0FEX0F2ZyIsCiAgcHJlZGljdG9yID0gImNvbmRpdGlvbl9udW0iLAogIG1vZGVyYXRvciA9ICJpZGVudGl0eV9ncm91cF9udW0iLAogIGNvdmFyaWF0ZXMgPSBjKCJQcmVfcG1lcnFfQURfQXZnIiwgImFnZSIpCikgfD4KICBuaWNlX3RhYmxlKGhpZ2hsaWdodCA9IFRSVUUpCmBgYAoKYGBge3J9CmxpYnJhcnkocmVtcHN5YykKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGRwbHlyKQoKIyBDb252ZXJ0IGlkZW50aXR5X2dyb3VwIGZhY3RvciB0byBudW1lcmljIGNvZGVzClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUoaWRlbnRpdHlfZ3JvdXBfbnVtID0gYXMubnVtZXJpYyhpZGVudGl0eV9ncm91cCkpCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2RlbCBTZXQgMTogTW9kZXJhdGlvbiBieSBCYXNlbGluZQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgQW54aWV0eSBtb2RlbDogTW9kZXJhdGlvbiBieSBQcmVfR0FEN19TdW0sIGNvbnRyb2xsaW5nIGZvciBpZGVudGl0eV9ncm91cF9udW0gYW5kIGFnZQpuaWNlX21vZCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9ICJQb3N0X0dBRDdfU3VtIiwKICBwcmVkaWN0b3IgPSAiY29uZGl0aW9uX251bSIsCiAgbW9kZXJhdG9yID0gIlByZV9HQUQ3X1N1bSIsCiAgY292YXJpYXRlcyA9IGMoImlkZW50aXR5X2dyb3VwX251bSIsICJhZ2UiKQopIHw+CiAgbmljZV90YWJsZShoaWdobGlnaHQgPSBUUlVFKQoKIyBEZXByZXNzaW9uIG1vZGVsOiBNb2RlcmF0aW9uIGJ5IFByZV9QSFE5X1N1bSwgY29udHJvbGxpbmcgZm9yIGlkZW50aXR5X2dyb3VwX251bSBhbmQgYWdlCm5pY2VfbW9kKAogIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlLAogIHJlc3BvbnNlID0gIlBvc3RfUEhROV9TdW0iLAogIHByZWRpY3RvciA9ICJjb25kaXRpb25fbnVtIiwKICBtb2RlcmF0b3IgPSAiUHJlX1BIUTlfU3VtIiwKICBjb3ZhcmlhdGVzID0gYygiaWRlbnRpdHlfZ3JvdXBfbnVtIiwgImFnZSIpCikgfD4KICBuaWNlX3RhYmxlKGhpZ2hsaWdodCA9IFRSVUUpCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2RlbCBTZXQgMjogTW9kZXJhdGlvbiBieSBHZW5kZXIgSWRlbnRpdHkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIEFueGlldHkgbW9kZWw6IE1vZGVyYXRpb24gYnkgaWRlbnRpdHlfZ3JvdXBfbnVtLCBjb250cm9sbGluZyBmb3IgUHJlX0dBRDdfU3VtIGFuZCBhZ2UKbmljZV9tb2QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgcmVzcG9uc2UgPSAiUG9zdF9HQUQ3X1N1bSIsCiAgcHJlZGljdG9yID0gImNvbmRpdGlvbl9udW0iLAogIG1vZGVyYXRvciA9ICJpZGVudGl0eV9ncm91cF9udW0iLAogIGNvdmFyaWF0ZXMgPSBjKCJQcmVfR0FEN19TdW0iLCAiYWdlIikKKSB8PgogIG5pY2VfdGFibGUoaGlnaGxpZ2h0ID0gVFJVRSkKCiMgRGVwcmVzc2lvbiBtb2RlbDogTW9kZXJhdGlvbiBieSBpZGVudGl0eV9ncm91cF9udW0sIGNvbnRyb2xsaW5nIGZvciBQcmVfUEhROV9TdW0gYW5kIGFnZQpuaWNlX21vZCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9ICJQb3N0X1BIUTlfU3VtIiwKICBwcmVkaWN0b3IgPSAiY29uZGl0aW9uX251bSIsCiAgbW9kZXJhdG9yID0gImlkZW50aXR5X2dyb3VwX251bSIsCiAgY292YXJpYXRlcyA9IGMoIlByZV9QSFE5X1N1bSIsICJhZ2UiKQopIHw+CiAgbmljZV90YWJsZShoaWdobGlnaHQgPSBUUlVFKQoKYGBgCgojIyMgRm9sbG93IHVwOiBERVJTIDggClNpbmNlIHRoZSBpbnRlcmFjdGlvbiBvZiBjb25kaXRpb24gYnkgaWRlbnRpdHkgZ3JvdXAgd2FzIHNpZ25pZmlhY250LCBJIGhhdmUgdG8gcHJvYmUgaXQgdXNpbmcgc2ltcGxlIHNsb3Blcy4gCgojIyMjIFJlc3VsdDogCgpGb3IgY2lzZ2VuZGVyIHBhcnRpY2lwYW50cywgY29udHJvbGxpbmcgZm9yIHByZeKAkXRlc3QgZW1vdGlvbiByZWd1bGF0aW9uLCBjb25kaXRpb24gc2lnbmlmaWNhbnRseSBwcmVkaWN0ZWQgcG9zdOKAkXRlc3Qgc2NvcmVzLCB3aXRoIHRoZSBpbnRlcnZlbnRpb24geWllbGRpbmcgbG93ZXIgKGkuZS4sIGJldHRlcikgc2NvcmVzIChiID0g4oCTNC45MCwgU0UgPSAxLjQxLCB0KDY3KSA9IOKAkzMuNDcsIHAgPSAuMDAxLCBhZGp1c3RlZCBSwrIgPSAuNDcpLiBJbiBjb250cmFzdCwgZm9yIHRyYW5zZ2VuZGVyL2dlbmRlciBkaXZlcnNlIHBhcnRpY2lwYW50cywgY29uZGl0aW9uIHdhcyBub3QgYSBzaWduaWZpY2FudCBwcmVkaWN0b3Igb2YgcG9zdOKAkXRlc3QgZW1vdGlvbiByZWd1bGF0aW9uIChiID0g4oCTMS4wNywgU0UgPSAxLjIzLCB0KDY3KSA9IOKAkzAuODcsIHAgPSAuMzksIGFkanVzdGVkIFLCsiA9IC4zNykuCnNhZC4KCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCgojIEVuc3VyZSB0aGF0IGlkZW50aXR5X2dyb3VwIGlzIGEgZmFjdG9yICh3aXRoIGxldmVscyAiMCIgZm9yIENpc2dlbmRlciBhbmQgIjEiIGZvciBUR0QpClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUoaWRlbnRpdHlfZ3JvdXAgPSBhcy5mYWN0b3IoaWRlbnRpdHlfZ3JvdXApKQoKIyBSdW4gc2VwYXJhdGUgcmVncmVzc2lvbnMgZm9yIGVhY2ggbGV2ZWwgb2YgaWRlbnRpdHlfZ3JvdXA6CiMgTW9kZWw6IFBvc3RfREVSUzhfU3VtIH4gY29uZGl0aW9uX251bSArIFByZV9ERVJTOF9TdW0KCiMgRm9yIENpc2dlbmRlciAoaWRlbnRpdHlfZ3JvdXAgPT0gMCkKbW9kZWxfY2lzIDwtIGxtKFBvc3RfREVSUzhfU3VtIH4gY29uZGl0aW9uX251bSArIFByZV9ERVJTOF9TdW0sCiAgICAgICAgICAgICAgICBkYXRhID0gZmlsdGVyKFB1cnJibGVfTWFzdGVyX1dpZGUsIGlkZW50aXR5X2dyb3VwID09ICIwIikpCiMgUHJpbnQgc3VtbWFyeSBmb3IgQ2lzZ2VuZGVyIG1vZGVsCnN1bW1hcnkobW9kZWxfY2lzKQoKIyBGb3IgVEdEIChpZGVudGl0eV9ncm91cCA9PSAxKQptb2RlbF90Z2QgPC0gbG0oUG9zdF9ERVJTOF9TdW0gfiBjb25kaXRpb25fbnVtICsgUHJlX0RFUlM4X1N1bSwKICAgICAgICAgICAgICAgIGRhdGEgPSBmaWx0ZXIoUHVycmJsZV9NYXN0ZXJfV2lkZSwgaWRlbnRpdHlfZ3JvdXAgPT0gIjEiKSkKIyBQcmludCBzdW1tYXJ5IGZvciBUR0QgbW9kZWwKc3VtbWFyeShtb2RlbF90Z2QpCgpgYGAKCgojIyMgRm9sbG93IHVwOiBHQUQgNwpTaW5jZSB0aGUgaW50ZXJhY3Rpb24gb2YgY29uZGl0aW9uIGJ5IGlkZW50aXR5IGdyb3VwIHdhcyBzaWduaWZpYWNudCwgSSBoYXZlIHRvIHByb2JlIGl0IHVzaW5nIHNpbXBsZSBzbG9wZXMuCjA9IENpc2dlbmRlciAgcGFydGljaXBhbnRzIGhhdmUgc2lnbmlmaWNhbnQgY29uZGl0aW9uIGVmZmVjdAoxPVRyYW5zZ2VuZGVyIHBhcnRpY2lwYW50cyBoYXZlIG5vIHNpZ25pZmljYW50IGNvbmRpdGlvbiBlZmZlY3QKCmBgYHtyfQoKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQoKIyBFbnN1cmUgdGhhdCBpZGVudGl0eV9ncm91cCBpcyBhIGZhY3RvciAod2l0aCBsZXZlbHMgIjAiIGZvciBDaXNnZW5kZXIgYW5kICIxIiBmb3IgVEdEKQpQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKGlkZW50aXR5X2dyb3VwID0gYXMuZmFjdG9yKGlkZW50aXR5X2dyb3VwKSkKCiMgUnVuIHNlcGFyYXRlIHJlZ3Jlc3Npb25zIGZvciBlYWNoIGxldmVsIG9mIGlkZW50aXR5X2dyb3VwOgoKIyBGb3IgQ2lzZ2VuZGVyIChpZGVudGl0eV9ncm91cCA9PSAwKQptb2RlbF9jaXMgPC0gbG0oUG9zdF9HQUQ3X1N1bSB+IGNvbmRpdGlvbl9udW0gKyBQcmVfR0FEN19TdW0sCiAgICAgICAgICAgICAgICBkYXRhID0gZmlsdGVyKFB1cnJibGVfTWFzdGVyX1dpZGUsIGlkZW50aXR5X2dyb3VwID09ICIwIikpCiMgUHJpbnQgc3VtbWFyeSBmb3IgQ2lzZ2VuZGVyIG1vZGVsCnN1bW1hcnkobW9kZWxfY2lzKQoKIyBGb3IgVEdEIChpZGVudGl0eV9ncm91cCA9PSAxKQptb2RlbF90Z2QgPC0gbG0oUG9zdF9HQUQ3X1N1bSB+IGNvbmRpdGlvbl9udW0gKyBQcmVfR0FEN19TdW0sCiAgICAgICAgICAgICAgICBkYXRhID0gZmlsdGVyKFB1cnJibGVfTWFzdGVyX1dpZGUsIGlkZW50aXR5X2dyb3VwID09ICIxIikpCiMgUHJpbnQgc3VtbWFyeSBmb3IgVEdEIG1vZGVsCnN1bW1hcnkobW9kZWxfdGdkKQoKYGBgCgojIFNlbGYtSGFybSBBbmFseXNlcwojIyBGcmVxdWVuY2llcyBieSBDb25kaXRpb24gYW5kIFJlc3BvbnNlIG92ZXIgVGltZQpCZWxvdywgd2UgZGlzcGxheSBhIHRhYmxlIGFuZCBncmFwaCBvZiB0aGUgZnJlcXVlbmN5IG9mIHJlc3BvbnNlcyBmb3IgYWxsIHNlbGYtaGFybSBxdWVzdGlvbnMsIHRoZSBmcmVxdWVuY3kgb2YgZmxhZ2dlZCByZXNwb25zZXMgdG8gZWFjaCBzZWxmLWhhcm0gcXVlc3Rpb24gb3ZlciB0aW1lLCBhbmQgdGhlIGZyZXF1ZW5jeSBvZiBmbGFnZ2VkIHJlc3BvbnNlcyB0byBlYWNoIHNlbGYtaGFybSBxdWVzdGlvbiBvdmVyIHRpbWUsIHNlcGFyYXRlZCBieSBjb25kaXRpb24uCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ3QpCgpzaHFfc3VtbWFyeSA8LSBOb0R1cF9QdXJyYmxlQW5vbiAlPiUKICBncm91cF9ieShXZWVrKSAlPiUKICBzdW1tYXJpc2UoCiAgICBOX1NIUTEgPSBzdW0oIWlzLm5hKFNIUTEpKSwKICAgIE5fU0hRMiA9IHN1bSghaXMubmEoU0hRMikpLAogICAgTl9TSFEzID0gc3VtKCFpcy5uYShTSFEzKSkKICApICU+JQogIHVuZ3JvdXAoKQoKIyBSZW1vdmUgd2VlayAwIGFuZCBOQSB2YWx1ZXMKc2hxX3N1bW1hcnlfY2xlYW4gPC0gc2hxX3N1bW1hcnkgJT4lCiAgZmlsdGVyKCFpcy5uYShXZWVrKSAmIFdlZWsgIT0gMCkKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUGxvdDogTGluZSBHcmFwaCBmb3IgUmVzcG9uc2UgUmF0ZSBPdmVyIFRpbWUKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZ2dwbG90KHNocV9zdW1tYXJ5X2NsZWFuLCBhZXMoeCA9IFdlZWspKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gTl9TSFExLCBjb2xvciA9ICJTSFExIiksIHNpemUgPSAxKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gTl9TSFEyLCBjb2xvciA9ICJTSFEyIiksIHNpemUgPSAxKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gTl9TSFEzLCBjb2xvciA9ICJTSFEzIiksIHNpemUgPSAxKSArCiAgbGFicygKICAgIHRpdGxlID0gIlJlc3BvbnNlIFJhdGUgT3ZlciBUaW1lIGZvciBTSFEgVmFyaWFibGVzIiwKICAgIHggPSAiV2VlayIsCiAgICB5ID0gIk51bWJlciBvZiBOb24tTWlzc2luZyBSZXNwb25zZXMiLAogICAgY29sb3IgPSAiU0hRIFZhcmlhYmxlIgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHVuaXF1ZShzaHFfc3VtbWFyeV9jbGVhbiRXZWVrKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJTSFExIiA9ICJibHVlIiwgIlNIUTIiID0gInJlZCIsICJTSFEzIiA9ICJncmVlbiIpKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBEaXNwbGF5IFRhYmxlOiBSZXNwb25zZSBDb3VudHMgT3ZlciBUaW1lCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNocV9zdW1tYXJ5X2NsZWFuICU+JQogIGd0KCkgJT4lCiAgZ3Q6OnRhYl9oZWFkZXIoCiAgICB0aXRsZSA9ICJOdW1iZXIgb2YgUmVzcG9uc2VzIGZvciBTZWxmLUhhcm0gUXVlc3Rpb25zIE92ZXIgVGltZSIKICApCgpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ3QpCgojIFJlc2hhcGUgaW50byBsb25nIGZvcm1hdApzaHFfbG9uZyA8LSBOb0R1cF9QdXJyYmxlQW5vbiAlPiUKICBzZWxlY3QoV2VlaywgU0hRMSwgU0hRMiwgU0hRMykgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBzdGFydHNfd2l0aCgiU0hRIiksIG5hbWVzX3RvID0gIlNIUV9WYXIiLCB2YWx1ZXNfdG8gPSAiUmVzcG9uc2UiKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFdlZWspICYgV2VlayAhPSAwKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFJlc3BvbnNlKSkgJT4lCiAgbXV0YXRlKFJlc3BvbnNlID0gZmFjdG9yKFJlc3BvbnNlLCBsZXZlbHMgPSBjKDEsIDApLCBsYWJlbHMgPSBjKCIxIiwgIjAiKSkpCgojIENvdW50IGhvdyBtYW55IHNlbGVjdGVkIGVhY2ggY2F0ZWdvcnkgKDAgb3IgMSkgcGVyIFNIUSB2YXJpYWJsZSBwZXIgd2VlawpzaHFfY291bnRzIDwtIHNocV9sb25nICU+JQogIGdyb3VwX2J5KFdlZWssIFNIUV9WYXIsIFJlc3BvbnNlKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUGxvdDogTGluZSBHcmFwaCBvZiAxIChmbGFnZ2VkKSByZXNwb25zZSBvdmVyIHRpbWUKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZ2dwbG90KAogIHNocV9jb3VudHMgJT4lIGZpbHRlcihSZXNwb25zZSA9PSAiMSIpLCAKICBhZXMoeCA9IFdlZWssIHkgPSBuLCBjb2xvciA9IFNIUV9WYXIpCikgKwogIGdlb21fbGluZShzaXplID0gMSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJOdW1iZXIgb2YgRmxhZ2dlZCBTSFEgUmVzcG9uc2VzIE92ZXIgVGltZSAoUmVzcG9uc2UgPSAxKSIsCiAgICB4ID0gIldlZWsiLAogICAgeSA9ICJDb3VudCBvZiBSZXNwb25zZSA9IDEiLAogICAgY29sb3IgPSAiU0hRIFZhcmlhYmxlIgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHVuaXF1ZShzaHFfY291bnRzJFdlZWspKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUYWJsZTogQ291bnQgb2YgMCBhbmQgMSBSZXNwb25zZXMgcGVyIFdlZWsgcGVyIFNIUQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzaHFfY291bnRzICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBSZXNwb25zZSwgdmFsdWVzX2Zyb20gPSBuLCB2YWx1ZXNfZmlsbCA9IDApICU+JQogIHJlbmFtZShgUmVzcG9uc2UgPSAxYCA9IGAxYCwgYFJlc3BvbnNlID0gMGAgPSBgMGApICU+JQogIGd0KCkgJT4lCiAgdGFiX2hlYWRlcih0aXRsZSA9ICJDb3VudHMgb2YgU0hRIFJlc3BvbnNlcyAoMCB2cy4gMSkgYnkgV2VlayBhbmQgVmFyaWFibGUiKQoKIyBSZXNoYXBlIGludG8gbG9uZyBmb3JtYXQgYW5kIGluY2x1ZGUgY29uZGl0aW9uCnNocV9sb25nX2dyb3VwZWQgPC0gTm9EdXBfUHVycmJsZUFub24gJT4lCiAgc2VsZWN0KHBzaWQsIFdlZWssIGNvbmRpdGlvbiwgU0hRMSwgU0hRMiwgU0hRMykgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBzdGFydHNfd2l0aCgiU0hRIiksIG5hbWVzX3RvID0gIlNIUV9WYXIiLCB2YWx1ZXNfdG8gPSAiUmVzcG9uc2UiKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFdlZWspICYgV2VlayAhPSAwKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFJlc3BvbnNlKSkgJT4lCiAgbXV0YXRlKFJlc3BvbnNlID0gZmFjdG9yKFJlc3BvbnNlLCBsZXZlbHMgPSBjKDEsIDApLCBsYWJlbHMgPSBjKCIxIiwgIjAiKSksCiAgICAgICAgIGNvbmRpdGlvbiA9IGFzLmZhY3Rvcihjb25kaXRpb24pKQoKIyBDb3VudCBob3cgbWFueSBzZWxlY3RlZCBlYWNoIGNhdGVnb3J5ICgwIG9yIDEpIHBlciBTSFEgdmFyaWFibGUsIHBlciB3ZWVrLCBwZXIgZ3JvdXAKc2hxX2NvdW50c19ncm91cGVkIDwtIHNocV9sb25nX2dyb3VwZWQgJT4lCiAgZ3JvdXBfYnkoV2VlaywgY29uZGl0aW9uLCBTSFFfVmFyLCBSZXNwb25zZSkgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFBsb3Q6IExpbmUgR3JhcGggb2YgMSAoZmxhZ2dlZCkgcmVzcG9uc2Ugb3ZlciB0aW1lIGJ5IGdyb3VwCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmdncGxvdCgKICBzaHFfY291bnRzX2dyb3VwZWQgJT4lIGZpbHRlcihSZXNwb25zZSA9PSAiMSIpLCAKICBhZXMoeCA9IFdlZWssIHkgPSBuLCBjb2xvciA9IFNIUV9WYXIpCikgKwogIGdlb21fbGluZShzaXplID0gMSkgKwogIGZhY2V0X3dyYXAofiBjb25kaXRpb24pICsKICBsYWJzKAogICAgdGl0bGUgPSAiTnVtYmVyIG9mIEZsYWdnZWQgU0hRIFJlc3BvbnNlcyBPdmVyIFRpbWUgKFJlc3BvbnNlID0gMSkiLAogICAgc3VidGl0bGUgPSAiRmFjZXRlZCBieSBDb25kaXRpb24iLAogICAgeCA9ICJXZWVrIiwKICAgIHkgPSAiQ291bnQgb2YgUmVzcG9uc2UgPSAxIiwKICAgIGNvbG9yID0gIlNIUSBWYXJpYWJsZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSB1bmlxdWUoc2hxX2NvdW50c19ncm91cGVkJFdlZWspKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUYWJsZTogQ291bnQgb2YgMCBhbmQgMSBSZXNwb25zZXMgcGVyIFdlZWsgcGVyIFNIUSwgYnkgR3JvdXAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc2hxX2NvdW50c19ncm91cGVkICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBSZXNwb25zZSwgdmFsdWVzX2Zyb20gPSBuLCB2YWx1ZXNfZmlsbCA9IDApICU+JQogIHJlbmFtZShgUmVzcG9uc2UgPSAxYCA9IGAxYCwgYFJlc3BvbnNlID0gMGAgPSBgMGApICU+JQogIGFycmFuZ2UoY29uZGl0aW9uLCBTSFFfVmFyLCBXZWVrKSAlPiUKICBndCgpICU+JQogIHRhYl9oZWFkZXIodGl0bGUgPSAiQ291bnRzIG9mIFNIUSBSZXNwb25zZXMgKDAgdnMuIDEpIGJ5IFdlZWssIFZhcmlhYmxlLCBhbmQgR3JvdXAiKQpgYGAKIyMgU2VsZi1IYXJtIExvZ2lzdGljIFJlZ3Jlc3Npb24KUG9zdC10ZXN0IExvZ2lzdGljIFJlZ3Jlc3Npb24gdG8gSW52ZXN0aWdhdGUgSW50ZXJ2ZW50aW9uIEVmZmVjdHMgb24gU2VsZi1IYXJtIE91dGNvbWVzCipSZXN1bHQ6KiBDb25kaXRpb24gd2FzIG5vdCBhIHNpZ25pZmljYW50IHByZWRpY3RvciBvZiBhbnkgc2VsZi1oYXJtIG91dGNvbWUgKGNvZGVkIGJpbmFyeSkuCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGd0c3VtbWFyeSkgICAKbGlicmFyeShicm9vbSkKbGlicmFyeShndHN1bW1hcnkpCgpOb0R1cF9QdXJyYmxlQW5vbiA8LSBOb0R1cF9QdXJyYmxlQW5vbiAlPiUKICBmaWx0ZXIocHNpZCAhPSAiQzcyIikgJT4lCiAgbXV0YXRlKAogICAgIyBJZiBtaXNzaW5nLCB0aGVuIE5BLiBJZiA8PSAxIHRoZW4gMCwgZWxzZSAxCiAgICBTSFExID0gaWZlbHNlKGlzLm5hKHNocXNjcmVlbmVyMSksIE5BLCBpZmVsc2Uoc2hxc2NyZWVuZXIxIDw9IDEsIDAsIDEpKSwKICAgIFNIUTIgPSBpZmVsc2UoaXMubmEoc2hxc2NyZWVuZXIyKSwgTkEsIGlmZWxzZShzaHFzY3JlZW5lcjIgPD0gMSwgMCwgMSkpLAogICAgU0hRMyA9IGlmZWxzZShpcy5uYShzaHFzY3JlZW5lcjMpLCBOQSwgaWZlbHNlKHNocXNjcmVlbmVyMyA8PSAxLCAwLCAxKSkKICApICU+JQogIG11dGF0ZSgKICAgICMgSWYgYW55IG9mIFNIUTEsIFNIUTIsIG9yIFNIUTMgaXMgbWlzc2luZywgU0hRX0FueSBpcyBtaXNzaW5nLgogICAgIyBJZiBhbGwgdGhyZWUgYXJlIDAsIFNIUV9BbnkgaXMgMCwgZWxzZSAxLgogICAgU0hRX0FueSA9IGNhc2Vfd2hlbigKICAgICAgaXMubmEoU0hRMSkgfCBpcy5uYShTSFEyKSB8IGlzLm5hKFNIUTMpIH4gTkFfcmVhbF8sCiAgICAgIFNIUTEgPT0gMCAmIFNIUTIgPT0gMCAmIFNIUTMgPT0gMCB+IDAsCiAgICAgIFRSVUUgfiAxCiAgICApCiAgKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAxKSBMb2dpc3RpYyByZWdyZXNzaW9uIGZvciBTSFExIGF0IFdlZWsgMTIKIyAgICBjb250cm9sbGluZyBmb3IgV2VlayAyIFNIUTEgYW5kIENvbmRpdGlvbgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptb2RlbF9zaHExIDwtIGdsbSgKICBTSFExXzEyIH4gY29uZGl0aW9uICsgU0hRMV8yLCAKICBkYXRhID0gcHVycmJsZV93aWRlLCAKICBmYW1pbHkgPSBiaW5vbWlhbAopCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDIpIExvZ2lzdGljIHJlZ3Jlc3Npb24gZm9yIFNIUTIgYXQgV2VlayAxMgojICAgIGNvbnRyb2xsaW5nIGZvciBXZWVrIDIgU0hRMiBhbmQgQ29uZGl0aW9uCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm1vZGVsX3NocTIgPC0gZ2xtKAogIFNIUTJfMTIgfiBjb25kaXRpb24gKyBTSFEyXzIsIAogIGRhdGEgPSBwdXJyYmxlX3dpZGUsIAogIGZhbWlseSA9IGJpbm9taWFsCikKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMykgTG9naXN0aWMgcmVncmVzc2lvbiBmb3IgU0hRMyBhdCBXZWVrIDEyCiMgICAgY29udHJvbGxpbmcgZm9yIFdlZWsgMiBTSFEzIGFuZCBDb25kaXRpb24KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbW9kZWxfc2hxMyA8LSBnbG0oCiAgU0hRM18xMiB+IGNvbmRpdGlvbiArIFNIUTNfMiwgCiAgZGF0YSA9IHB1cnJibGVfd2lkZSwgCiAgZmFtaWx5ID0gYmlub21pYWwKKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyA0KSBMb2dpc3RpYyByZWdyZXNzaW9uIGZvciBTSFFfQW55IGF0IFdlZWsgMTIKIyAgICBjb250cm9sbGluZyBmb3IgV2VlayAyIFNIUV9BbnkgYW5kIENvbmRpdGlvbgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptb2RlbF9zaHFBbnkgPC0gZ2xtKAogIFNIUV9BbnlfMTIgfiBjb25kaXRpb24gKyBTSFFfQW55XzIsIAogIGRhdGEgPSBwdXJyYmxlX3dpZGUsIAogIGZhbWlseSA9IGJpbm9taWFsCikKCiMgQ3JlYXRlIGd0c3VtbWFyeSB0YWJsZXMgZm9yIGVhY2ggbW9kZWwsIGV4cG9uZW50aWF0aW5nIGZvciBPUgp0Ymxfc2hxMSAgIDwtIHRibF9yZWdyZXNzaW9uKG1vZGVsX3NocTEsIGV4cG9uZW50aWF0ZSA9IFRSVUUpICU+JQogIGJvbGRfbGFiZWxzKCkgJT4lCiAgYWRkX3NpZ25pZmljYW5jZV9zdGFycygpCgp0Ymxfc2hxMiAgIDwtIHRibF9yZWdyZXNzaW9uKG1vZGVsX3NocTIsIGV4cG9uZW50aWF0ZSA9IFRSVUUpICU+JQogIGJvbGRfbGFiZWxzKCkgJT4lCiAgYWRkX3NpZ25pZmljYW5jZV9zdGFycygpCgp0Ymxfc2hxMyAgIDwtIHRibF9yZWdyZXNzaW9uKG1vZGVsX3NocTMsIGV4cG9uZW50aWF0ZSA9IFRSVUUpICU+JQogIGJvbGRfbGFiZWxzKCkgJT4lCiAgYWRkX3NpZ25pZmljYW5jZV9zdGFycygpCgp0Ymxfc2hxQW55IDwtIHRibF9yZWdyZXNzaW9uKG1vZGVsX3NocUFueSwgZXhwb25lbnRpYXRlID0gVFJVRSkgJT4lCiAgYm9sZF9sYWJlbHMoKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlX3N0YXJzKCkKCm1lcmdlZF90YmwgPC0gdGJsX21lcmdlKAogICB0YmxzID0gbGlzdCh0Ymxfc2hxMSwgdGJsX3NocTIsIHRibF9zaHEzLCB0Ymxfc2hxQW55KSwKICAgdGFiX3NwYW5uZXIgPSBjKCJTSFExIE1vZGVsIiwgIlNIUTIgTW9kZWwiLCAiU0hRMyBNb2RlbCIsICJTSFFfQW55IE1vZGVsIikKICkKIG1lcmdlZF90YmwKYGBgCiMjIFNlbGYtSGFybSBQcm9wb3J0aW9uYWwgT2RkcyBSZWdyZXNzaW9uCkZyZXF1ZW5jaWVzIFRhYmxlcwpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKCiMgRGVmaW5lIHRoZSBzaXggb3JkZXJlZOKAkGZhY3RvciB2YXJpYWJsZXMgKHdlZWtzIDEgYW5kIDEyIGZvciBzY3JlZW5lcnMgMeKAkzMpCnNjcmVlbmVyX3ZhcnMgPC0gYygKICAic2hxc2NyZWVuZXIxX3cxIiwgICJzaHFzY3JlZW5lcjFfdzEyIiwKICAic2hxc2NyZWVuZXIyX3cxIiwgICJzaHFzY3JlZW5lcjJfdzEyIiwKICAic2hxc2NyZWVuZXIzX3cxIiwgICJzaHFzY3JlZW5lcjNfdzEyIgopCgojIExvb3Agb3ZlciBlYWNoIHZhcmlhYmxlIGFuZCBwcmludCBhIGZyZXF1ZW5jeSB0YWJsZSAoY291bnQgKyBwZXJjZW50KQpmb3IgKHZhciBpbiBzY3JlZW5lcl92YXJzKSB7CiAgZnJlcV90YmwgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICAgIGZpbHRlcighaXMubmEoLmRhdGFbW3Zhcl1dKSkgJT4lIAogICAgY291bnQocmVzcG9uc2UgPSAuZGF0YVtbdmFyXV0pICU+JQogICAgbXV0YXRlKHBlcmNlbnQgPSByb3VuZChuIC8gc3VtKG4pICogMTAwLCAxKSkKICAKICBjYXQoIlxuXG4qKkZyZXF1ZW5jaWVzIGZvciIsIHZhciwgIioqXG4iKQogIHByaW50KGthYmxlKGZyZXFfdGJsLCBjb2wubmFtZXMgPSBjKCJSZXNwb25zZSIsICJDb3VudCIsICJQZXJjZW50IiksIGRpZ2l0cyA9IDEpKQp9CmBgYAojIyMgUHJvcG9ydGlvbmFsIE9kZHMgTW9kZWxzOiBCcmFudCBUZXN0cwpBbGwgc2l4IEJyYW50IHRlc3RzIChvbmUgZm9yIGVhY2ggc2NyZWVuZXIgYXQgV2VlayAxIGFuZCBXZWVrIDEyKSBwcm9kdWNlZCBub27igJBzaWduaWZpY2FudCBw4oCQdmFsdWVzLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHByb3BvcnRpb25hbOKAkG9kZHMgKHBhcmFsbGVsIHJlZ3Jlc3Npb24pIGFzc3VtcHRpb24gaG9sZHMgaW4gZXZlcnkgY2FzZS4KYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoTUFTUykKbGlicmFyeShicmFudCkKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUHJvcG9ydGlvbmFsIE9kZHMgTW9kZWxzICYgQnJhbnQgVGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgU2NyZWVuZXIgMTogV2VlayAxCm1vZGVsX3MxX3cxIDwtIHBvbHIoc2hxc2NyZWVuZXIxX3cxIH4gY29uZGl0aW9uLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCmJyYW50X3MxX3cxIDwtIGJyYW50KG1vZGVsX3MxX3cxKQpwcmludCgiQnJhbnQgVGVzdCBmb3IgU2NyZWVuZXIgMSBhdCBXZWVrIDE6IikKcHJpbnQoYnJhbnRfczFfdzEpCgojIFNjcmVlbmVyIDE6IFdlZWsgMTIKbW9kZWxfczFfdzEyIDwtIHBvbHIoc2hxc2NyZWVuZXIxX3cxMiB+IGNvbmRpdGlvbiwgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsIEhlc3MgPSBUUlVFKQpicmFudF9zMV93MTIgPC0gYnJhbnQobW9kZWxfczFfdzEyKQpwcmludCgiQnJhbnQgVGVzdCBmb3IgU2NyZWVuZXIgMSBhdCBXZWVrIDEyOiIpCnByaW50KGJyYW50X3MxX3cxMikKCiMgU2NyZWVuZXIgMjogV2VlayAxCm1vZGVsX3MyX3cxIDwtIHBvbHIoc2hxc2NyZWVuZXIyX3cxIH4gY29uZGl0aW9uLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCmJyYW50X3MyX3cxIDwtIGJyYW50KG1vZGVsX3MyX3cxKQpwcmludCgiQnJhbnQgVGVzdCBmb3IgU2NyZWVuZXIgMiBhdCBXZWVrIDE6IikKcHJpbnQoYnJhbnRfczJfdzEpCgojIFNjcmVlbmVyIDI6IFdlZWsgMTIKbW9kZWxfczJfdzEyIDwtIHBvbHIoc2hxc2NyZWVuZXIyX3cxMiB+IGNvbmRpdGlvbiwgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsIEhlc3MgPSBUUlVFKQpicmFudF9zMl93MTIgPC0gYnJhbnQobW9kZWxfczJfdzEyKQpwcmludCgiQnJhbnQgVGVzdCBmb3IgU2NyZWVuZXIgMiBhdCBXZWVrIDEyOiIpCnByaW50KGJyYW50X3MyX3cxMikKCiMgU2NyZWVuZXIgMzogV2VlayAxCm1vZGVsX3MzX3cxIDwtIHBvbHIoc2hxc2NyZWVuZXIzX3cxIH4gY29uZGl0aW9uLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCmJyYW50X3MzX3cxIDwtIGJyYW50KG1vZGVsX3MzX3cxKQpwcmludCgiQnJhbnQgVGVzdCBmb3IgU2NyZWVuZXIgMyBhdCBXZWVrIDE6IikKcHJpbnQoYnJhbnRfczNfdzEpCgojIFNjcmVlbmVyIDM6IFdlZWsgMTIKbW9kZWxfczNfdzEyIDwtIHBvbHIoc2hxc2NyZWVuZXIzX3cxMiB+IGNvbmRpdGlvbiwgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsIEhlc3MgPSBUUlVFKQpicmFudF9zM193MTIgPC0gYnJhbnQobW9kZWxfczNfdzEyKQpwcmludCgiQnJhbnQgVGVzdCBmb3IgU2NyZWVuZXIgMyBhdCBXZWVrIDEyOiIpCnByaW50KGJyYW50X3MzX3cxMikKYGBgCk5vIHNpZ25pZmljYW50IHJlc3VsdHMgb2YgUHVycmJsZSBvbiBzZWxmLWhhcm0gdXNpbmcgcHJvcHJ0aW9uYWwgb2RkcyAob3JkaW5hbCBkYXRhIHRoYXQgbWFpbnRhaW5zIGZyZXF1ZW5jeSkKYGBge3J9CmxpYnJhcnkoTUFTUykKbGlicmFyeShicm9vbSkKbGlicmFyeShrbml0cikKCiMgQ29udmVydCBvdXRjb21lcyB0byBvcmRlcmVkIGZhY3RvcnMgKGFkanVzdCB0aGUgbGV2ZWxzIGlmIG5lZWRlZCkKUHVycmJsZV9NYXN0ZXJfV2lkZSA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIG11dGF0ZSgKICAgIHNocXNjcmVlbmVyMV93MSAgPSBmYWN0b3Ioc2hxc2NyZWVuZXIxX3cxLCBvcmRlcmVkID0gVFJVRSksCiAgICBzaHFzY3JlZW5lcjJfdzEgID0gZmFjdG9yKHNocXNjcmVlbmVyMl93MSwgb3JkZXJlZCA9IFRSVUUpLAogICAgc2hxc2NyZWVuZXIzX3cxICA9IGZhY3RvcihzaHFzY3JlZW5lcjNfdzEsIG9yZGVyZWQgPSBUUlVFKSwKICAgIHNocXNjcmVlbmVyMV93MTIgPSBmYWN0b3Ioc2hxc2NyZWVuZXIxX3cxMiwgb3JkZXJlZCA9IFRSVUUpLAogICAgc2hxc2NyZWVuZXIyX3cxMiA9IGZhY3RvcihzaHFzY3JlZW5lcjJfdzEyLCBvcmRlcmVkID0gVFJVRSksCiAgICBzaHFzY3JlZW5lcjNfdzEyID0gZmFjdG9yKHNocXNjcmVlbmVyM193MTIsIG9yZGVyZWQgPSBUUlVFKQogICkKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRml0IFByb3BvcnRpb25hbCBPZGRzIE1vZGVscyBmb3IgV2VlayAxMiBvdXRjb21lcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIE1vZGVsIGZvciBTY3JlZW5lciAxIGNvbnRyb2xsaW5nIGZvciBjb25kaXRpb24sIGFnZSwgYW5kIGJhc2VsaW5lICh3MSkKbW9kZWxfczEgPC0gcG9scihzaHFzY3JlZW5lcjFfdzEyIH4gY29uZGl0aW9uICsgYWdlICsgaWRlbnRpdHlfZ3JvdXBfbnVtICsgc2hxc2NyZWVuZXIxX3cxLCAKICAgICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCgojIE1vZGVsIGZvciBTY3JlZW5lciAyCm1vZGVsX3MyIDwtIHBvbHIoc2hxc2NyZWVuZXIyX3cxMiB+IGNvbmRpdGlvbiArIGFnZSArIGlkZW50aXR5X2dyb3VwX251bSArICBzaHFzY3JlZW5lcjJfdzEsIAogICAgICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlLCBIZXNzID0gVFJVRSkKCiMgTW9kZWwgZm9yIFNjcmVlbmVyIDMKbW9kZWxfczMgPC0gcG9scihzaHFzY3JlZW5lcjNfdzEyIH4gY29uZGl0aW9uICsgYWdlICsgaWRlbnRpdHlfZ3JvdXBfbnVtICsgc2hxc2NyZWVuZXIzX3cxLCAKICAgICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENyZWF0ZSBhIENvbWJpbmVkIFRhYmxlIG9mIFJlc3VsdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdGlkeV9zMSA8LSB0aWR5KG1vZGVsX3MxKSAlPiUgbXV0YXRlKE1vZGVsID0gIlNjcmVlbmVyIDEiKQp0aWR5X3MyIDwtIHRpZHkobW9kZWxfczIpICU+JSBtdXRhdGUoTW9kZWwgPSAiU2NyZWVuZXIgMiIpCnRpZHlfczMgPC0gdGlkeShtb2RlbF9zMykgJT4lIG11dGF0ZShNb2RlbCA9ICJTY3JlZW5lciAzIikKCiMgQ29tYmluZSB0aGUgcmVzdWx0cwpyZXN1bHRzIDwtIGJpbmRfcm93cyh0aWR5X3MxLCB0aWR5X3MyLCB0aWR5X3MzKQoKbGlicmFyeShkcGx5cikKcmVzdWx0cyA8LSByZXN1bHRzICU+JQogIG11dGF0ZSgKICAgIG9kZHNfcmF0aW8gPSBleHAoZXN0aW1hdGUpLAogICAgcC52YWx1ZSA9IDIgKiBwbm9ybSgtYWJzKHN0YXRpc3RpYykpCiAgKSAlPiUKICBkcGx5cjo6c2VsZWN0KE1vZGVsLCB0ZXJtLCBlc3RpbWF0ZSwgc3RkLmVycm9yLCBvZGRzX3JhdGlvLCBzdGF0aXN0aWMsIHAudmFsdWUpCgojIFByaW50IHRoZSB0YWJsZQprYWJsZShyZXN1bHRzLCBkaWdpdHMgPSAzLCBjYXB0aW9uID0gIlByb3BvcnRpb25hbCBPZGRzIFJlZ3Jlc3Npb24gUmVzdWx0cyBDb250cm9sbGluZyBmb3IgQWdlIGFuZCBCYXNlbGluZSBSZXNwb25zZSAoV2VlayAxKSIpCgpgYGAKIyMjIFNlbGYtSGFybSBNb2RlcmF0aW9uIE1vZGVsczogR2VuZGVyIElkZW50aXR5Ck5vIG1vZGVyYXRpb24gZWZmZWN0IG9mIGdlbmRlciBpZGVudGl0eSBpbiBwcm9wcnRpb25hbCBvZGRzIG1vZGVscy4KYGBge3J9CgojIE1vZGVyYXRpb24gQW5hbHlzaXMgZm9yIEFsbCBUaHJlZSBTY3JlZW5lciBNb2RlbHMgKFdlZWsgMTIpCgojIFNjcmVlbmVyIDEgbW9kZXJhdGlvbiBtb2RlbAptb2RlbF9zMV9tb2QgPC0gcG9scihzaHFzY3JlZW5lcjFfdzEyIH4gY29uZGl0aW9uICogaWRlbnRpdHlfZ3JvdXBfbnVtICsgYWdlICsgc2hxc2NyZWVuZXIxX3cxLCAKICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsIEhlc3MgPSBUUlVFKQoKIyBTY3JlZW5lciAyIG1vZGVyYXRpb24gbW9kZWwKbW9kZWxfczJfbW9kIDwtIHBvbHIoc2hxc2NyZWVuZXIyX3cxMiB+IGNvbmRpdGlvbiAqIGlkZW50aXR5X2dyb3VwX251bSArIGFnZSArIHNocXNjcmVlbmVyMl93MSwgCiAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlLCBIZXNzID0gVFJVRSkKCiMgU2NyZWVuZXIgMyBtb2RlcmF0aW9uIG1vZGVsCm1vZGVsX3MzX21vZCA8LSBwb2xyKHNocXNjcmVlbmVyM193MTIgfiBjb25kaXRpb24gKiBpZGVudGl0eV9ncm91cF9udW0gKyBhZ2UgKyBzaHFzY3JlZW5lcjNfdzEsIAogICAgICAgICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCgojIFRpZHkgYW5kIGxhYmVsIGVhY2ggbW9kZWwncyBvdXRwdXQKdGlkeV9zMV9tb2QgPC0gdGlkeShtb2RlbF9zMV9tb2QpICU+JSBtdXRhdGUoTW9kZWwgPSAiU2NyZWVuZXIgMSIpCnRpZHlfczJfbW9kIDwtIHRpZHkobW9kZWxfczJfbW9kKSAlPiUgbXV0YXRlKE1vZGVsID0gIlNjcmVlbmVyIDIiKQp0aWR5X3MzX21vZCA8LSB0aWR5KG1vZGVsX3MzX21vZCkgJT4lIG11dGF0ZShNb2RlbCA9ICJTY3JlZW5lciAzIikKCiMgQ29tYmluZSB0aGUgcmVzdWx0cyBmcm9tIGFsbCB0aHJlZSBtb2RlbHMKbW9kX3Jlc3VsdHMgPC0gYmluZF9yb3dzKHRpZHlfczFfbW9kLCB0aWR5X3MyX21vZCwgdGlkeV9zM19tb2QpICU+JQogIG11dGF0ZSgKICAgIG9kZHNfcmF0aW8gPSBleHAoZXN0aW1hdGUpLAogICAgcC52YWx1ZSA9IDIgKiBwbm9ybSgtYWJzKHN0YXRpc3RpYykpCiAgKSAlPiUKICBkcGx5cjo6c2VsZWN0KE1vZGVsLCB0ZXJtLCBlc3RpbWF0ZSwgc3RkLmVycm9yLCBvZGRzX3JhdGlvLCBzdGF0aXN0aWMsIHAudmFsdWUpCgojIFByaW50IHRoZSBjb21iaW5lZCB0YWJsZQprYWJsZShtb2RfcmVzdWx0cywgZGlnaXRzID0gMywgCiAgICAgIGNhcHRpb24gPSAiUHJvcG9ydGlvbmFsIE9kZHMgUmVncmVzc2lvbiBNb2RlcmF0aW9uIFJlc3VsdHMgKENvbmRpdGlvbiAqIElkZW50aXR5X0dyb3VwX051bSBJbnRlcmFjdGlvbikiKQoKCmBgYAojIFN1cHBsZW1lbnRhcnkgTWF0ZXJpYWxzOiBNaXhlZCBFZmZlY3RzIE1vZGVscwpUbyBldmFsdWF0ZSBob3cgb3V0Y29tZXMgY2hhbmdlZCBvdmVyIHRpbWUgYW5kIHdoZXRoZXIgdGhlc2UgY2hhbmdlcyBkaWZmZXJlZCBieSBjb25kaXRpb24sIHdlIGZpdCBtaXhlZC1lZmZlY3RzIG1vZGVscyBmb3IgZWFjaCBvZiBvdXIgcHJpbWFyeSBvdXRjb21lIHZhcmlhYmxlcy4gVGhlc2UgbW9kZWxzIGFjY291bnQgZm9yIGJvdGggd2l0aGluLXBlcnNvbiBjaGFuZ2UgYW5kIGJldHdlZW4tcGVyc29uIGRpZmZlcmVuY2VzLgoKRm9yIGVhY2ggb3V0Y29tZW0gd2UgcmFuIGEgbGluZWFyIG1peGVkLWVmZmVjdHMgbW9kZWwgdXNpbmcgdGhlIGxtZXIoKSBmdW5jdGlvbi4KClRoZSBtb2RlbHMgdGVzdGVkOgogIE1haW4gZWZmZWN0cyBvZiBXZWVrICh0aW1lKSwgY29uZGl0aW9uLCBhbmQgdGhlaXIgaW50ZXJhY3Rpb24KICBDb3ZhcmlhdGVzOiBpZGVudGl0eSBncm91cCBhbmQgYWdlCiAgQSByYW5kb20gaW50ZXJjZXB0IGFuZCBzbG9wZSBmb3IgZWFjaCBwYXJ0aWNpcGFudCAoKFdlZWsgJiBwc2lkKSksIGFsbG93aW5nIGVhY2ggcGVyc29uIHRvIGhhdmUgdGhlaXIgb3duIGJhc2VsaW5lIGFuZCByYXRlIG9mIGNoYW5nZSBvdmVyIHRpbWUKICAKICBFbW90aW9uIFJlZyB3YXMgc2lnbmlmaWNhbnQKICBEZXByZXNzaW9uIHNpZ25pZmljYW50CiAgQW54aWV0eSBub3Qgc2lnbmlmaWNhbnQgKGNsb3NlIHRvIG1hcmdpbmFsIHA9LjExLSBtb3JlIGV2aWRlbmNlIG9mIHVuc3RhYmxlIGVmZmVjdCkKYGBge3J9CmxpYnJhcnkobG1lNCkKbGlicmFyeShicm9vbS5taXhlZCkKbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KHBlcmZvcm1hbmNlKSAgIyBGb3IgcjIoKQoKIyBEZWZpbmUgdGhlIHZlY3RvciBvZiBvdXRjb21lcyAoYXMgdGhleSBhcHBlYXIgaW4gdGhlIGxvbmcgZGF0YXNldCkKb3V0Y29tZXMgPC0gYygiREVSUzhfU3VtIiwgInBtZXJxX0ZvY3VzX0F2ZyIsICJwbWVycV9EaXN0cmFjdF9BdmciLCAicG1lcnFfQURfQXZnIiwgCiAgICAgICAgICAgICAgIkdBRDdfU3VtIiwgIlBIUTlfU3VtIiwgIlNIU19QYXRod2F5cyIsICJTSFNfQWdlbmN5IiwgIlNIU19Ub3RhbEhvcGUiLCAidWNsYV9TdW0iKQoKIyBJbml0aWFsaXplIGEgbGlzdCB0byBzdG9yZSBtb2RlbCBzdW1tYXJpZXMgd2l0aCBjb25maWRlbmNlIGludGVydmFscyBhbmQgZWZmZWN0IHNpemVzCnJlc3VsdHNfbGlzdCA8LSBsaXN0KCkKCiMgTG9vcCBvdmVyIGVhY2ggb3V0Y29tZSBhbmQgZml0IHRoZSBtaXhlZC1lZmZlY3RzIG1vZGVsIGNvbnRyb2xsaW5nIGZvciBpZGVudGl0eV9ncm91cF9udW0gYW5kIGFnZQpmb3IgKG91dGNvbWUgaW4gb3V0Y29tZXMpIHsKICBtb2RlbCA8LSBsbWVyKGFzLmZvcm11bGEocGFzdGUob3V0Y29tZSwgIn4gV2VlayAqIGNvbmRpdGlvbiArIGlkZW50aXR5X2dyb3VwICsgYWdlICsgKFdlZWsgfCBwc2lkKSIpKSwKICAgICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX0xvbmdfTWFzdGVyKQogIAogICMgVGlkeSB0aGUgZml4ZWQgZWZmZWN0cyBlc3RpbWF0ZXMKICB0aWR5X21vZGVsIDwtIHRpZHkobW9kZWwpCiAgCiAgIyBPYnRhaW4gOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciBmaXhlZCBlZmZlY3RzIHVzaW5nIHRoZSBXYWxkIG1ldGhvZAogIGNpX21vZGVsIDwtIGNvbmZpbnQobW9kZWwsIG1ldGhvZCA9ICJXYWxkIiwgbGV2ZWwgPSAwLjk1KQogIGNpX2RmIDwtIGFzLmRhdGEuZnJhbWUoY2lfbW9kZWwpCiAgY2lfZGYkdGVybSA8LSByb3duYW1lcyhjaV9kZikKICAKICAjIE1lcmdlIHRoZSB0aWR5IG91dHB1dCB3aXRoIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgdGlkeV9tb2RlbCA8LSBsZWZ0X2pvaW4odGlkeV9tb2RlbCwgY2lfZGYsIGJ5ID0gInRlcm0iKQogIAogICMgQ2FsY3VsYXRlIG1hcmdpbmFsIGFuZCBjb25kaXRpb25hbCBSwrIgYXMgZWZmZWN0IHNpemVzCiAgcjJfdmFscyA8LSByMihtb2RlbCkKICAKICAjIFN0b3JlIHRoZSByZXN1bHRzIGluIHRoZSBsaXN0CiAgcmVzdWx0c19saXN0W1tvdXRjb21lXV0gPC0gbGlzdCgKICAgIG1vZGVsX3N1bW1hcnkgPSB0aWR5X21vZGVsLAogICAgcjIgPSByMl92YWxzCiAgKQp9CgojIE5vdywgZm9yIGRlbW9uc3RyYXRpb24sIGxldCdzIHByaW50IHRoZSBzdW1tYXJ5IGZvciBvbmUgb3V0Y29tZSAoZS5nLiwgREVSUzhfU3VtKQpwcmludChrYWJsZShyZXN1bHRzX2xpc3RbWyJERVJTOF9TdW0iXV1bWyJtb2RlbF9zdW1tYXJ5Il1dLCAKICAgICAgICAgICAgY2FwdGlvbiA9ICJNaXhlZC1FZmZlY3RzIE1vZGVsIGZvciBERVJTOF9TdW0gd2l0aCA5NSUgQ0kiLCAKICAgICAgICAgICAgZGlnaXRzID0gMykgJT4lIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKSkKY2F0KCJcbiIpCnByaW50KHJlc3VsdHNfbGlzdFtbIkRFUlM4X1N1bSJdXVtbInIyIl1dKQoKZm9yIChvdXRjb21lIGluIG5hbWVzKHJlc3VsdHNfbGlzdCkpIHsKICAjIENyZWF0ZSBhIGNhcHRpb24gdGhhdCBpbmNsdWRlcyB0aGUgb3V0Y29tZSBuYW1lCiAgY2FwdGlvbl90ZXh0IDwtIHBhc3RlKCJNaXhlZC1FZmZlY3RzIE1vZGVsIGZvciIsIG91dGNvbWUsICJ3aXRoIDk1JSBDSSIpCiAgCiAgIyBQcmludCB0aGUgbW9kZWwgc3VtbWFyeSB3aXRoIGEgY2FwdGlvbiBhbmQgZm9ybWF0dGVkIHRhYmxlCiAgcHJpbnQoa2FibGUocmVzdWx0c19saXN0W1tvdXRjb21lXV1bWyJtb2RlbF9zdW1tYXJ5Il1dLCAKICAgICAgICAgICAgICBjYXB0aW9uID0gY2FwdGlvbl90ZXh0LCAKICAgICAgICAgICAgICBkaWdpdHMgPSAzKSAlPiUga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpKQogIGNhdCgiXG4iKQogIAogICMgUHJpbnQgdGhlIGNvcnJlc3BvbmRpbmcgUsKyIHZhbHVlKHMpCiAgcHJpbnQocmVzdWx0c19saXN0W1tvdXRjb21lXV1bWyJyMiJdXSkKICBjYXQoIlxuXG4iKSAgIyBleHRyYSBzcGFjaW5nIGJldHdlZW4gb3V0Y29tZXMKfQoKYGBgCgoKCgo=