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_Wide_Final.” The long dataset format dataset is called “NoDup_PurrbleAnon.”

This dataset includes the N=154 participants who were included in the randomized control trial examining Purrble with a population of university students, with an emphasis on the LGTBQ+ community.

Participation in Each Week 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”.

### **Number of Participants in Each Condition**
Participant Counts by Condition
Condition N
Purrble 76
Waitlist Control 78

### **Completion Counts Over Time**
Number of Participants Completing Each Week
Week Count
1 147
2 149
3 150
4 141
5 139
6 139
7 139
8 142
9 127
10 128
11 128
12 118
13 131

Attrition Analysis by Condition Attrition is defined as dropping out of study prior to Week 11. We checked to examine whether there were differences in drop out for the Waitlist and Treatment groups. Result: No difference in attrition by group

### **Attrition Analysis by Condition (Prior to Week 11)**
Descriptive Statistics for Attrition by Condition
condition N Mean SD
Purrble Treatment 76 0.0921053 0.2910959
Waitlist Control 78 0.0641026 0.2465209

### **T-Test Results**
T-Test Comparing Attrition by Condition
Mean (Condition 1) Mean (Condition 2) t-value p-value Lower CI Upper CI
0.0921053 0.0641026 0.6434268 0.5209519 -0.0580069 0.1140123

Demographics Descriptive Statistics by Condition

Gender and Sexual Identities by Condition

Frequency Table of Gender Identity by Condition
gi_simplified Purrble Waitlist Control
Cisgender 39 37
Transgender/genderdiverse 37 40
NA 0 1
Frequency Table of Sexual Orientation by Condition
so_simplified Purrble Waitlist Control
Asexual 13 9
Bisexual 28 25
Demisexual 2 1
Gay/lesbian 11 18
Heterosexual 1 0
Pansexual 8 10
Queer 13 15

Race and Nationality by Condition*

Frequency Table of Race Variables by Condition
Race_Variable Purrble Waitlist Control
Race_Asian 10 17
Race_Arabic 0 1
Race_Black 1 3
Race_Hispanic 2 0
Race_Pacific 0 0
Race_White 59 55
Race_unknown 9 6
4 people in the Purrble condition reported multiple racial/ethnic identities
4 people in the Waitlist Control condition reported multiple racial/ethnic identities
Frequency Table of Nationality by Condition
Nationality Purrble Waitlist Control
British 35 36
British-Carribean 1 1
British-Indian 1 0
Chinese 1 5
Filipino 1 0
Indian 3 5
Irish 1 1
Irish-American 1 0
Mexican 1 0
NR 28 21
Pakistani 1 0
Polish 2 2
Bangladeshi 0 1
British-Japanese 0 1
British-Pakistani 0 1
Indonesian 0 1
Iranian 0 1
Irish-Carribean 0 1
Malaysian Chinese 0 1

Age by Condition The table below presents age descriptives by condition. A t-test was conducted to determine whether there were baseline differences in age. There were no significant differences between the two conditions.

### **Age by Condition (Baseline)**
Descriptive Statistics for Age by Condition
Condition N Mean SD Min Max
X11 Purrble 76 20.40789 2.281389 16 25
X12 Waitlist Control 78 20.06410 2.456583 16 25

### **T-test for Age by Condition**
T-test Results for Age by Condition
Mean (Waitlist Control) Mean (Purrble) t-value p-value Lower CI Upper CI
20.40789 20.0641 0.9001998 0.3694412 -0.410752 1.098336

### **Cohen's d for Age by Condition**
Effect Size (Cohen’s d) for Age by Condition
Cohen’s d 95% CI Lower 95% CI Upper
0.1449526 -0.1716078 0.4610376

Preliminary Analyses First, we want to check to see if there are any differences in the outcome(s) of interest at baseline, by chance Result:* No difference in baseline pre-test measures- woo!

Baseline differences in study outcomes by condition

### **Pre-Test Descriptive Statistics**
Descriptive Statistics for Pre-Test Data
N Mean SD Min Max Skewness Kurtosis
Pre_DERS8_Sum 153 28.136 4.705 14.333 38.333 -0.413 -0.122
Pre_GAD7_Sum 153 13.715 3.976 3.000 22.000 -0.167 -0.441
Pre_PHQ9_Sum 153 15.031 4.569 3.000 26.667 -0.011 -0.086
Pre_SHS_Pathways 149 13.292 4.284 3.000 24.000 -0.136 -0.403
Pre_SHS_Agency 149 10.708 4.929 3.000 24.000 0.339 -0.645
Pre_SHS_TotalHope 149 24.000 8.325 8.000 46.000 0.282 -0.289
Pre_ucla_Sum 148 7.095 1.618 3.000 9.000 -0.506 -0.662
Pre_pmerq_Focus_Avg 149 2.737 1.059 1.000 6.000 0.421 -0.076
Pre_pmerq_Distract_Avg 149 4.222 1.127 1.000 6.000 -0.833 0.616
Pre_pmerq_AD_Avg 149 3.480 0.923 1.000 6.000 -0.320 0.504

### **Post-Test Descriptive Statistics**
Descriptive Statistics for Post-Test Data
N Mean SD Min Max Skewness Kurtosis
Post_DERS8_Sum 142 26.965 7.318 8 40 -0.264 -0.821
Post_GAD7_Sum 142 12.630 4.980 1 22 -0.080 -0.761
Post_PHQ9_Sum 142 14.326 6.310 0 27 -0.009 -0.682
Post_SHS_Pathways 131 14.664 4.309 3 24 -0.248 -0.455
Post_SHS_Agency 131 12.626 5.213 3 24 -0.004 -0.846
Post_SHS_TotalHope 131 27.290 8.796 6 47 -0.043 -0.488
Post_ucla_Sum 131 6.802 1.703 3 9 -0.415 -0.682
Post_pmerq_Focus_Avg 130 2.992 1.193 1 6 0.282 -0.322
Post_pmerq_Distract_Avg 130 4.337 1.054 1 6 -1.133 1.673
Post_pmerq_AD_Avg 130 3.665 0.951 1 6 -0.316 0.917

### **ANCOVA Results by Outcome**
Analysis of Covariance (ANCOVA) Results by Outcome
Outcome Pre-Test Covariate Mean_Purrble Mean_Waitlist Control SD_Purrble SD_Waitlist Control F-Value p-Value
Post_DERS8_Sum Pre_DERS8_Sum 25.261 28.575 7.799 6.481 13.075 0.000
Post_GAD7_Sum Pre_GAD7_Sum 12.002 13.224 5.465 4.431 3.498 0.064
Post_PHQ9_Sum Pre_PHQ9_Sum 13.442 15.162 6.658 5.886 6.195 0.014
Post_SHS_Pathways Pre_SHS_Pathways 14.468 14.841 4.456 4.196 0.642 0.424
Post_SHS_Agency Pre_SHS_Agency 12.516 12.725 5.416 5.061 0.172 0.679
Post_SHS_TotalHope Pre_SHS_TotalHope 26.984 27.565 9.035 8.632 0.421 0.518
Post_ucla_Sum Pre_ucla_Sum 6.677 6.913 1.845 1.569 1.092 0.298
Post_pmerq_Focus_Avg Pre_pmerq_Focus_Avg 3.105 2.890 1.206 1.181 1.128 0.290
Post_pmerq_Distract_Avg Pre_pmerq_Distract_Avg 4.419 4.262 1.062 1.049 0.770 0.382
Post_pmerq_AD_Avg Pre_pmerq_AD_Avg 3.762 3.576 0.932 0.967 1.492 0.224

Follow-up: Effect Sizes for Significant/Marginal Variables (I’m sorry I don’t know how to make this look pretty! If anyone knows please help!) Cohen’s F For Each Significant/Marginal Outcome: Anxiety: . 0.16 Depression: 0.21 DERS: 0.31


---------------------------------------
ANCOVA for: Post_DERS8_Sum controlling for Pre_DERS8_Sum 
---------------------------------------
               Df Sum Sq Mean Sq F value   Pr(>F)    
condition       1    410   410.4   13.07 0.000419 ***
Pre_DERS8_Sum   1   2779  2778.5   88.53  < 2e-16 ***
Residuals     138   4331    31.4                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
13 observations deleted due to missingness

Partial Eta Squared:
# Effect Size for ANOVA (Type I)

Parameter     | Eta2 (partial) |       95% CI
---------------------------------------------
condition     |           0.09 | [0.03, 1.00]
Pre_DERS8_Sum |           0.39 | [0.29, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
Cohen's f (Partial):
# Effect Size for ANOVA (Type I)

Parameter     | Cohen's f (partial) |      95% CI
-------------------------------------------------
condition     |                0.31 | [0.16, Inf]
Pre_DERS8_Sum |                0.80 | [0.64, Inf]

- One-sided CIs: upper bound fixed at [Inf].
---------------------------------------
ANCOVA for: Post_GAD7_Sum controlling for Pre_GAD7_Sum 
---------------------------------------
              Df Sum Sq Mean Sq F value   Pr(>F)    
condition      1     54    54.0   3.498   0.0636 .  
Pre_GAD7_Sum   1   1311  1311.2  84.884 4.68e-16 ***
Residuals    138   2132    15.4                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
13 observations deleted due to missingness

Partial Eta Squared:
# Effect Size for ANOVA (Type I)

Parameter    | Eta2 (partial) |       95% CI
--------------------------------------------
condition    |           0.02 | [0.00, 1.00]
Pre_GAD7_Sum |           0.38 | [0.28, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
Cohen's f (Partial):
# Effect Size for ANOVA (Type I)

Parameter    | Cohen's f (partial) |      95% CI
------------------------------------------------
condition    |                0.16 | [0.00, Inf]
Pre_GAD7_Sum |                0.78 | [0.62, Inf]

- One-sided CIs: upper bound fixed at [Inf].
---------------------------------------
ANCOVA for: Post_PHQ9_Sum controlling for Pre_PHQ9_Sum 
---------------------------------------
              Df Sum Sq Mean Sq F value Pr(>F)    
condition      1  110.5   110.5   6.195  0.014 *  
Pre_PHQ9_Sum   1 3034.1  3034.1 170.110 <2e-16 ***
Residuals    138 2461.4    17.8                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
13 observations deleted due to missingness

Partial Eta Squared:
# Effect Size for ANOVA (Type I)

Parameter    | Eta2 (partial) |       95% CI
--------------------------------------------
condition    |           0.04 | [0.00, 1.00]
Pre_PHQ9_Sum |           0.55 | [0.46, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
Cohen's f (Partial):
# Effect Size for ANOVA (Type I)

Parameter    | Cohen's f (partial) |      95% CI
------------------------------------------------
condition    |                0.21 | [0.07, Inf]
Pre_PHQ9_Sum |                1.11 | [0.93, Inf]

- One-sided CIs: upper bound fixed at [Inf].

Self-harm Questions

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
OR1,2 SE2 OR1,2 SE2 OR1,2 SE2 OR1,2 SE2
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
1 *p<0.05; **p<0.01; ***p<0.001
2 OR = Odds Ratio, SE = Standard Error

Below, we display a table and graph of the frequency of responses for all self-harm questions. Please note- they are all equal (which is why the lines all overlap and there appears to only be one!)

Number of Responses for Self-Harm Questions Over Time
Week N_SHQ1 N_SHQ2 N_SHQ3
1 147 147 147
2 149 149 149
3 150 150 150
4 141 141 141
5 140 140 140
6 139 139 139
7 141 141 141
8 142 142 142
9 128 128 128
10 128 128 128
11 129 129 129
12 118 118 118
13 131 131 131

Linear Mixed Effects Models Results interpretation:

Overall Summary of Significant Results


Fixed Effects Results

1. Emotional Dysregulation (DERS8_Sum)

  • Interaction Effect: The Waitlist group showed a significantly less steep decline than Purrble (p < 0.001).
  • Interpretation: Emotional dysregulation improved more in the Purrble group compared to Waitlist.

2. Anxiety Symptoms (GAD7_Sum)

  • Interaction Effect: The Waitlist group experienced a significantly smaller improvement than Purrble (p = 0.016).
  • Interpretation: Anxiety symptoms decreased more in the Purrble group than in Waitlist.

3. Depression Symptoms (PHQ9_Sum)

  • Interaction Effect: The Waitlist group showed significantly smaller improvement than Purrble (p < 0.001).
  • Interpretation: The Purrble group experienced a greater reduction in depressive symptoms.

4. Positive Emotion Regulation - Focus (pmerq_Focus_Avg)

  • Interaction Effect: The Purrble group showed a slightly greater improvement than the Waitlist group (p = 0.018).
  • Interpretation: The Purrble group had enhanced emotion regulation strategies focused on positive emotions.

5. Positive Emotion Regulation - Attentional Deployment (pmerq_AD_Avg)

  • Interaction Effect: The Purrble group showed significantly greater improvement compared to the Waitlist group (p = 0.010).
  • Interpretation: The Purrble group improved more in acceptance and dampening strategies.

Non-Significant Interaction Effects

For the following variables, there was no significant difference between groups over time: - Hope Pathways (SHS_Pathways) - Hope Agency (SHS_Agency) - Total Hope (SHS_TotalHope) - Loneliness (UCLA_Sum) - Positive Emotion Regulation - Distraction (pmerq_Distract_Avg) (marginal trend, p = 0.063)


-------------------------------------------------
Fixed Effects for Outcome: DERS8_Sum 
-------------------------------------------------
Estimate Std. Error df t value Pr(>|t|) Variable
28.383 0.674 203.773 42.116 0.000 (Intercept)
-0.283 0.038 1631.002 -7.502 0.000 Week
-0.332 0.947 203.540 -0.351 0.726 conditionWaitlist Control
0.296 0.052 1630.582 5.669 0.000 Week:conditionWaitlist Control

-------------------------------------------------
Fixed Effects for Outcome: GAD7_Sum 
-------------------------------------------------
Estimate Std. Error df t value Pr(>|t|) Variable
13.779 0.497 225.662 27.749 0.000 (Intercept)
-0.161 0.032 1633.666 -5.044 0.000 Week
-0.139 0.697 225.254 -0.199 0.842 conditionWaitlist Control
0.107 0.044 1632.714 2.411 0.016 Week:conditionWaitlist Control

-------------------------------------------------
Fixed Effects for Outcome: PHQ9_Sum 
-------------------------------------------------
Estimate Std. Error df t value Pr(>|t|) Variable
15.778 0.606 198.061 26.027 0.000 (Intercept)
-0.190 0.033 1629.309 -5.835 0.000 Week
-1.288 0.852 197.807 -1.512 0.132 conditionWaitlist Control
0.233 0.045 1628.800 5.182 0.000 Week:conditionWaitlist Control

-------------------------------------------------
Fixed Effects for Outcome: SHS_Pathways 
-------------------------------------------------
Estimate Std. Error df t value Pr(>|t|) Variable
12.271 0.566 351.869 21.692 0.000 (Intercept)
0.178 0.050 274.989 3.587 0.000 Week
0.972 0.799 354.277 1.217 0.224 conditionWaitlist Control
-0.066 0.070 273.258 -0.946 0.345 Week:conditionWaitlist Control

-------------------------------------------------
Fixed Effects for Outcome: SHS_Agency 
-------------------------------------------------
Estimate Std. Error df t value Pr(>|t|) Variable
9.352 0.651 349.587 14.375 0.000 (Intercept)
0.241 0.057 275.121 4.234 0.000 Week
1.060 0.918 352.019 1.154 0.249 conditionWaitlist Control
-0.079 0.080 273.408 -0.999 0.319 Week:conditionWaitlist Control

-------------------------------------------------
Fixed Effects for Outcome: SHS_TotalHope 
-------------------------------------------------
Estimate Std. Error df t value Pr(>|t|) Variable
21.619 1.090 334.610 19.833 0.000 (Intercept)
0.422 0.092 273.920 4.570 0.000 Week
2.025 1.538 337.177 1.316 0.189 conditionWaitlist Control
-0.147 0.129 272.298 -1.139 0.256 Week:conditionWaitlist Control

-------------------------------------------------
Fixed Effects for Outcome: ucla_Sum 
-------------------------------------------------
Estimate Std. Error df t value Pr(>|t|) Variable
7.024 0.214 285.701 32.818 0.000 (Intercept)
-0.028 0.016 269.257 -1.728 0.085 Week
0.322 0.301 287.117 1.069 0.286 conditionWaitlist Control
-0.007 0.022 267.706 -0.333 0.740 Week:conditionWaitlist Control

-------------------------------------------------
Fixed Effects for Outcome: pmerq_Focus_Avg 
-------------------------------------------------
Estimate Std. Error df t value Pr(>|t|) Variable
2.512 0.143 306.792 17.566 0.000 (Intercept)
0.047 0.011 270.346 4.159 0.000 Week
0.276 0.202 309.628 1.370 0.172 conditionWaitlist Control
-0.038 0.016 269.074 -2.378 0.018 Week:conditionWaitlist Control

-------------------------------------------------
Fixed Effects for Outcome: pmerq_Distract_Avg 
-------------------------------------------------
Estimate Std. Error df t value Pr(>|t|) Variable
4.044 0.142 345.894 28.434 0.000 (Intercept)
0.031 0.012 273.095 2.521 0.012 Week
0.251 0.201 348.557 1.249 0.212 conditionWaitlist Control
-0.032 0.017 271.632 -1.864 0.063 Week:conditionWaitlist Control

-------------------------------------------------
Fixed Effects for Outcome: pmerq_AD_Avg 
-------------------------------------------------
Estimate Std. Error df t value Pr(>|t|) Variable
3.278 0.120 311.891 27.366 0.00 (Intercept)
0.039 0.010 271.195 4.094 0.00 Week
0.264 0.169 314.726 1.559 0.12 conditionWaitlist Control
-0.035 0.013 269.901 -2.603 0.01 Week:conditionWaitlist Control
LS0tCnRpdGxlOiAnUHVycmJsZSBSQ1QgRnVsbCBBbmFseXNlczogRGVzY3JpcHRpdmVzIGFuZCBQcmVsaW1pbmFyeSBSZXN1bHRzJwpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpSZWNvcmRpbmcgS2VlcGluZzogClRoZXJlIGFyZSAqdHdvKiBtYXN0ZXIgZmlsZXMgdGhhdCB3ZSBhcmUgdXNpbmcgZm9yIGFuYWx5c2VzLiBUaGV5IGFyZSBlc3NlbnRpYWxseSB0aGUgc2FtZSBmaWxlLCB0aG91Z2ggb25lIGlzIGluIHdpZGUgZm9ybWF0IGFuZCB0aGUgb3RoZXIgaXMgaW4gbG9uZyBmb3JtYXQuIAoKVGhlIHdpZGUgZm9ybWF0IGRhdGFzZXQgaXMgY2FsbGVkICJQdXJyYmxlX1dpZGVfRmluYWwuIgpUaGUgbG9uZyBkYXRhc2V0IGZvcm1hdCBkYXRhc2V0IGlzIGNhbGxlZCAiTm9EdXBfUHVycmJsZUFub24uIiAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBpbmNsdWRlID0gVFJVRSwgIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQoKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoZ3JpZEV4dHJhKSAKbGlicmFyeShwYXRjaHdvcmspICAgICAgCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkobWFya2Rvd24pCmxpYnJhcnkoc3RhcmdhemVyKQpsaWJyYXJ5KE1PVEUpCmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShrbml0cikKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkoYnJvb20ubWl4ZWQpIApsaWJyYXJ5KHRpZHltb2RlbHMpIApsaWJyYXJ5KG11bHRpbGV2ZWxtb2QpIApsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShwc3ljaCkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShyZWFkcikKbGlicmFyeShrbml0cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGVmZmVjdHNpemUpCmxpYnJhcnkoZ3QpCgojI1JlYWQgaW4gdGhlIGRhdGFzZXRzCmxpYnJhcnkocmVhZHIpCnB1cnJibGVfd2lkZV9maW5hbCA8LSByZWFkX2NzdigicHVycmJsZV93aWRlX2ZpbmFsLmNzdiIpCgoKcHVycmJsZV93aWRlX2ZpbmFsIDwtIHB1cnJibGVfd2lkZV9maW5hbCAlPiUKICBtdXRhdGUoY29uZGl0aW9uID0gY2FzZV93aGVuKAogICAgY29uZGl0aW9uX251bSA9PSAwIH4gIldhaXRsaXN0IENvbnRyb2wiLAogICAgY29uZGl0aW9uX251bSA9PSAxIH4gIlB1cnJibGUiLAogICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8KICApKQoKcHVycmJsZV93aWRlX2ZpbmFsIDwtIHB1cnJibGVfd2lkZV9maW5hbCAlPiUKICBtdXRhdGUoYWNyb3NzKHN0YXJ0c193aXRoKCJERVJTOF9TdW1fIiksIAogICAgICAgICAgICAgICAgfiBpZmVsc2UoIWlzLm5hKC4pICYgLiA+PSAxLCAxLCAwKSwgCiAgICAgICAgICAgICAgICAubmFtZXMgPSAiQ29tcGxldGVfey5jb2x9IikpICU+JQogIHJlbmFtZV93aXRoKH4gZ3N1YigiQ29tcGxldGVfREVSUzhfU3VtXyIsICJDb21wbGV0ZV8iLCAuKSwgc3RhcnRzX3dpdGgoIkNvbXBsZXRlX0RFUlM4X1N1bV8iKSkKCgojIERlZmluZSB0aGUgdmVjdG9yIG9mIG91dGNvbWVzIGZvciB3aGljaCB3ZSBuZWVkIHByZS9wb3N0IGxpc3RzCm91dGNvbWVzIDwtIGMoIkRFUlM4X1N1bSIsICJHQUQ3X1N1bSIsIAogICAgICAgICAgICAgICJQSFE5X1N1bSIsICJTSFNfUGF0aHdheXMiLCAiU0hTX0FnZW5jeSIsICJTSFNfVG90YWxIb3BlIiwKICAgICAgICAgICAgICAidWNsYV9TdW0iLCAicG1lcnFfRm9jdXNfQXZnIiwgInBtZXJxX0Rpc3RyYWN0X0F2ZyIsICJwbWVycV9BRF9BdmciKQoKIyBDcmVhdGUgdGhlIHByZXRlc3QgbGlzdCAod2Vla3MgMS0zIGZvciBlYWNoIG91dGNvbWUpCnByZXRlc3RfbGlzdCA8LSB1bmxpc3QobGFwcGx5KG91dGNvbWVzLCBmdW5jdGlvbih4KSBwYXN0ZTAoeCwgIl8iLCAxOjMpKSkKCiMgQ3JlYXRlIHRoZSBwb3N0dGVzdCBsaXN0ICh3ZWVrcyAxMS0xMyBmb3IgZWFjaCBvdXRjb21lKQpwb3N0dGVzdF9saXN0IDwtIHVubGlzdChsYXBwbHkob3V0Y29tZXMsIGZ1bmN0aW9uKHgpIHBhc3RlMCh4LCAiXyIsIDExOjEzKSkpCgpmb3IgKG91dGNvbWUgaW4gb3V0Y29tZXMpIHsKICAjIElkZW50aWZ5IHRoZSBwcmUtdGVzdCBjb2x1bW5zIGZvciB0aGlzIG91dGNvbWUKICBwcmVfY29scyA8LSBwcmV0ZXN0X2xpc3RbZ3JlcGwocGFzdGUwKCJeIiwgb3V0Y29tZSwgIl8iKSwgcHJldGVzdF9saXN0KV0KICAKICAjIElkZW50aWZ5IHRoZSBwb3N0LXRlc3QgY29sdW1ucyBmb3IgdGhpcyBvdXRjb21lCiAgcG9zdF9jb2xzIDwtIHBvc3R0ZXN0X2xpc3RbZ3JlcGwocGFzdGUwKCJeIiwgb3V0Y29tZSwgIl8iKSwgcG9zdHRlc3RfbGlzdCldCiAgCiAgIyBDcmVhdGUgdGhlIG5hbWVzIGZvciB0aGUgbmV3IFByZV8gYW5kIFBvc3RfIGNvbHVtbnMKICBwcmVfY29sbmFtZSA8LSBwYXN0ZTAoIlByZV8iLCBvdXRjb21lKQogIHBvc3RfY29sbmFtZSA8LSBwYXN0ZTAoIlBvc3RfIiwgb3V0Y29tZSkKICAKICAjIENhbGN1bGF0ZSByb3cgbWVhbnMgZm9yIHByZS10ZXN0IGNvbHVtbnMgKHdlZWtzIDEtMykKICBwdXJyYmxlX3dpZGVfZmluYWxbW3ByZV9jb2xuYW1lXV0gPC0gcm93TWVhbnMocHVycmJsZV93aWRlX2ZpbmFsWywgcHJlX2NvbHMsIGRyb3AgPSBGQUxTRV0sIG5hLnJtID0gVFJVRSkKICAKICAjIENhbGN1bGF0ZSByb3cgbWVhbnMgZm9yIHBvc3QtdGVzdCBjb2x1bW5zICh3ZWVrcyAxMS0xMykKICBwdXJyYmxlX3dpZGVfZmluYWxbW3Bvc3RfY29sbmFtZV1dIDwtIHJvd01lYW5zKHB1cnJibGVfd2lkZV9maW5hbFssIHBvc3RfY29scywgZHJvcCA9IEZBTFNFXSwgbmEucm0gPSBUUlVFKQp9CgpWaWV3KHB1cnJibGVfd2lkZV9maW5hbCkKY29sbmFtZXMocHVycmJsZV93aWRlX2ZpbmFsKQoKbGlicmFyeShyZWFkcikKTm9EdXBfUHVycmJsZUFub24gPC0gcmVhZF9jc3YoIn4vTm9EdXBfUHVycmJsZUFub24uY3N2IikKVmlldyhOb0R1cF9QdXJyYmxlQW5vbikKCgpgYGAKCgpUaGlzIGRhdGFzZXQgaW5jbHVkZXMgdGhlIE49MTU0IHBhcnRpY2lwYW50cyB3aG8gd2VyZSBpbmNsdWRlZCBpbiB0aGUgcmFuZG9taXplZCBjb250cm9sIHRyaWFsIGV4YW1pbmluZyBQdXJyYmxlIHdpdGggYSBwb3B1bGF0aW9uIG9mIHVuaXZlcnNpdHkgc3R1ZGVudHMsIHdpdGggYW4gZW1waGFzaXMgb24gdGhlIExHVEJRKyBjb21tdW5pdHkuIAoKKipQYXJ0aWNpcGF0aW9uIGluIEVhY2ggV2VlayBvdmVyIFRpbWUqKiAKTm90ZTogV2Vla3MgMS0zIHdlcmUgY29uc2lkZXJlZCAicHJlLXRlc3QuIiBQdXJyYmxlIHdhcyBnaXZlbiAob3Igbm90KSBhZnRlciB3ZWVrIDMuIFdlZWtzIDExLTEzIGFyZSBjb25zaWRlcmVkICJQb3N0LXRlc3QiLgpgYGB7cn0KY29uZGl0aW9uX2NvdW50cyA8LSBwdXJyYmxlX3dpZGVfZmluYWwgJT4lCiAgY291bnQoY29uZGl0aW9uKSAlPiUKICByZW5hbWUoQ29uZGl0aW9uID0gY29uZGl0aW9uLCBOID0gbikKCiMgRGlzcGxheSB0aGUgZm9ybWF0dGVkIHRhYmxlCmNhdCgiIyMjICoqTnVtYmVyIG9mIFBhcnRpY2lwYW50cyBpbiBFYWNoIENvbmRpdGlvbioqXG4iKQprYWJsZShjb25kaXRpb25fY291bnRzLCBjYXB0aW9uID0gIlBhcnRpY2lwYW50IENvdW50cyBieSBDb25kaXRpb24iKQoKIyBTZWxlY3QgQ29tcGxldGVfWCB2YXJpYWJsZXMKY29tcGxldGVfdmFycyA8LSBwYXN0ZTAoIkNvbXBsZXRlXyIsIDE6MTMpCgojIFN1bW1hcml6ZSBob3cgbWFueSBwZW9wbGUgaGF2ZSBhIDEgZm9yIGVhY2ggQ29tcGxldGVfWCB2YXJpYWJsZQpjb21wbGV0ZV90YWJsZSA8LSBwdXJyYmxlX3dpZGVfZmluYWwgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyhhbGxfb2YoY29tcGxldGVfdmFycyksIHN1bSwgbmEucm0gPSBUUlVFKSkKCiMgUmVzaGFwZSBpbnRvIGxvbmcgZm9ybWF0IGZvciBjbGVhbmVyIGRpc3BsYXkKY29tcGxldGVfdGFibGVfbG9uZyA8LSBjb21wbGV0ZV90YWJsZSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAiV2VlayIsIHZhbHVlc190byA9ICJDb3VudCIpICU+JQogIG11dGF0ZShXZWVrID0gYXMubnVtZXJpYyhnc3ViKCJDb21wbGV0ZV8iLCAiIiwgV2VlaykpKSAlPiUKICBhcnJhbmdlKFdlZWspICMgRW5zdXJlIHByb3BlciBvcmRlcgoKIyBEaXNwbGF5IHRoZSBmb3JtYXR0ZWQgdGFibGUKY2F0KCJcbiMjIyAqKkNvbXBsZXRpb24gQ291bnRzIE92ZXIgVGltZSoqXG4iKQprYWJsZShjb21wbGV0ZV90YWJsZV9sb25nLCBjYXB0aW9uID0gIk51bWJlciBvZiBQYXJ0aWNpcGFudHMgQ29tcGxldGluZyBFYWNoIFdlZWsiKQoKIyBMaW5lIGdyYXBoIHNob3dpbmcgdHJlbmQgb2YgY29tcGxldGlvbiBvdmVyIHRpbWUKIyBDcmVhdGUgdGhlIGxpbmUgZ3JhcGgKZ2dwbG90KGNvbXBsZXRlX3RhYmxlX2xvbmcsIGFlcyh4ID0gV2VlaywgeSA9IENvdW50KSkgKwogIGdlb21fbGluZShjb2xvciA9ICJibHVlIiwgbGluZXdpZHRoID0gMSkgKyAgIyBMaW5lIGNvbG9yIGFuZCB0aGlja25lc3MKICBnZW9tX3BvaW50KHNpemUgPSAzLCBjb2xvciA9ICJibHVlIikgKyAgIyBSZWQgcG9pbnRzIGZvciBlbXBoYXNpcwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDE1NSksIGJyZWFrcyA9IHNlcSgwLCAxNTUsIGJ5ID0gMjUpKSArICAjIFktYXhpcyBsaW1pdHMgYW5kIGludGVydmFscwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjEzKSArICAjIEVuc3VyZSBhbGwgd2Vla3MgKDEgdG8gMTMpIGFwcGVhciBvbiBYLWF4aXMKICBsYWJzKAogICAgdGl0bGUgPSAiQ29tcGxldGlvbiBSYXRlcyBPdmVyIFRpbWUiLAogICAgeCA9ICJXZWVrIiwKICAgIHkgPSAiTnVtYmVyIG9mIFBhcnRpY2lwYW50cyIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAjIE1ha2UgWC1heGlzIGxhYmVscyByZWFkYWJsZQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICAjIE1ha2UgWS1heGlzIGxhYmVscyByZWFkYWJsZQpgYGAKCioqQXR0cml0aW9uIEFuYWx5c2lzIGJ5IENvbmRpdGlvbioqCkF0dHJpdGlvbiBpcyBkZWZpbmVkIGFzIGRyb3BwaW5nIG91dCBvZiBzdHVkeSBwcmlvciB0byBXZWVrIDExLiAKV2UgY2hlY2tlZCB0byBleGFtaW5lIHdoZXRoZXIgdGhlcmUgd2VyZSBkaWZmZXJlbmNlcyBpbiBkcm9wIG91dCBmb3IgdGhlIFdhaXRsaXN0IGFuZCBUcmVhdG1lbnQgZ3JvdXBzLiAKKlJlc3VsdDoqIE5vIGRpZmZlcmVuY2UgaW4gYXR0cml0aW9uIGJ5IGdyb3VwCgpgYGB7cn0KbGlicmFyeShyZWFkcikKcHVycmJsZV93aWRlIDwtIHJlYWRfY3N2KCJwdXJyYmxlX3dpZGUuY3N2IikKVmlldyhwdXJyYmxlX3dpZGUpCgojIENyZWF0ZSBhIHZlY3RvciBvZiB3ZWVrcwp3ZWVrcyA8LSAxOjEzCgojIEZvciBlYWNoIHdlZWssIGNoZWNrIGlmIGFueSBvZiB0aGF0IHdlZWsncyBjb2x1bW5zIGFyZSBub24tTkEuCiMgV2UgdXNlIGByb3dTdW1zKCFpcy5uYShhY3Jvc3MoLi4uKSkpID4gMGAgdG8gY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBhbnkgZGF0YS4KZm9yICh3IGluIHdlZWtzKSB7CiAgcHVycmJsZV93aWRlIDwtIHB1cnJibGVfd2lkZSAlPiUKICAgIG11dGF0ZSghIXBhc3RlMCgiQVRUIiwgdykgOj0gaWZfZWxzZSgKICAgICAgcm93U3VtcyghaXMubmEoYWNyb3NzKGVuZHNfd2l0aChwYXN0ZTAoIl8iLCB3KSkpKSkgPiAwLAogICAgICAxLAogICAgICAwCiAgICApKQp9CgpwdXJyYmxlX3dpZGUgPC0gcHVycmJsZV93aWRlICU+JQogIHJvd3dpc2UoKSAlPiUKICBtdXRhdGUoTGFzdF9TZXNzaW9uID0gewogICAgIyBFeHRyYWN0IHRoZSBhdHRlbmRhbmNlIHZhbHVlcyBmb3IgYWxsIHdlZWtzCiAgICBhdHRfdmFsdWVzIDwtIGNfYWNyb3NzKHN0YXJ0c193aXRoKCJBVFQiKSkKICAgIAogICAgIyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgYXR0ZW5kYW5jZQogICAgaWYgKGFsbChhdHRfdmFsdWVzID09IDAgfCBpcy5uYShhdHRfdmFsdWVzKSkpIHsKICAgICAgIyBJZiBubyBhdHRlbmRhbmNlLCBzZXQgTGFzdF9TZXNzaW9uIHRvIE5BCiAgICAgIE5BX2ludGVnZXJfCiAgICB9IGVsc2UgewogICAgICAjIElmIHRoZXJlIGlzIGF0dGVuZGFuY2UsIGZpbmQgdGhlIGxhc3QgKG1heCkgd2VlayBhdHRlbmRlZAogICAgICBtYXgod2hpY2goYXR0X3ZhbHVlcyA9PSAxKSkKICAgIH0KICB9KSAlPiUKICB1bmdyb3VwKCkKCiMgQ3JlYXRlIGFuIGF0dHJpdGlvbiB2YXJpYWJsZTogMSBpZiBsYXN0IHNlc3Npb24gPD0gMTAsIGVsc2UgMApwdXJyYmxlX3dpZGUgPC0gcHVycmJsZV93aWRlICU+JQogIG11dGF0ZShhdHRyaXRpb24gPSBpZmVsc2UoTGFzdF9TZXNzaW9uIDw9IDEwLCAxLCAwKSkKCiMgSWRlbnRpZnkgY29uZGl0aW9uIGxldmVscwpjb25kX2xldmVscyA8LSB1bmlxdWUocHVycmJsZV93aWRlJGNvbmRpdGlvbikKY29uZF9sZXZlbHMgPC0gY29uZF9sZXZlbHNbIWlzLm5hKGNvbmRfbGV2ZWxzKV0KaWYgKGxlbmd0aChjb25kX2xldmVscykgIT0gMikgewogIHN0b3AoIlRoaXMgY29kZSBleHBlY3RzIGV4YWN0bHkgdHdvIGNvbmRpdGlvbnMgZm9yIHRoZSBjb21wYXJpc29uLiIpCn0KCiMgQ2FsY3VsYXRlIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgYnkgY29uZGl0aW9uCmF0dHJpdGlvbl9zdW1tYXJ5IDwtIHB1cnJibGVfd2lkZSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZSgKICAgIE4gPSBuKCksCiAgICBNZWFuID0gbWVhbihhdHRyaXRpb24sIG5hLnJtID0gVFJVRSksCiAgICBTRCA9IHNkKGF0dHJpdGlvbiwgbmEucm0gPSBUUlVFKQogICkKCiMgVC10ZXN0IGNvbXBhcmluZyBhdHRyaXRpb24gYnkgY29uZGl0aW9uCnR0IDwtIHQudGVzdChhdHRyaXRpb24gfiBjb25kaXRpb24sIGRhdGEgPSBwdXJyYmxlX3dpZGUpCnRfdGVzdF9yZXN1bHRzIDwtIHRpZHkodHQpICU+JQogIHNlbGVjdChlc3RpbWF0ZTEsIGVzdGltYXRlMiwgc3RhdGlzdGljLCBwLnZhbHVlLCBjb25mLmxvdywgY29uZi5oaWdoKSAlPiUKICByZW5hbWUoCiAgICBgTWVhbiAoQ29uZGl0aW9uIDEpYCA9IGVzdGltYXRlMSwKICAgIGBNZWFuIChDb25kaXRpb24gMilgID0gZXN0aW1hdGUyLAogICAgYHQtdmFsdWVgID0gc3RhdGlzdGljLAogICAgYHAtdmFsdWVgID0gcC52YWx1ZSwKICAgIGBMb3dlciBDSWAgPSBjb25mLmxvdywKICAgIGBVcHBlciBDSWAgPSBjb25mLmhpZ2gKICApCgojIERpc3BsYXkgQXR0cml0aW9uIFN1bW1hcnkgVGFibGUKY2F0KCIjIyMgKipBdHRyaXRpb24gQW5hbHlzaXMgYnkgQ29uZGl0aW9uIChQcmlvciB0byBXZWVrIDExKSoqXG4iKQprYWJsZShhdHRyaXRpb25fc3VtbWFyeSwgY2FwdGlvbiA9ICJEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzIGZvciBBdHRyaXRpb24gYnkgQ29uZGl0aW9uIikKCiMgRGlzcGxheSBULVRlc3QgUmVzdWx0cyBUYWJsZQpjYXQoIlxuIyMjICoqVC1UZXN0IFJlc3VsdHMqKlxuIikKa2FibGUodF90ZXN0X3Jlc3VsdHMsIGNhcHRpb24gPSAiVC1UZXN0IENvbXBhcmluZyBBdHRyaXRpb24gYnkgQ29uZGl0aW9uIikKCmBgYAoKCioqRGVtb2dyYXBoaWNzIERlc2NyaXB0aXZlIFN0YXRpc3RpY3MgYnkgQ29uZGl0aW9uKioKCioqKkdlbmRlciBhbmQgU2V4dWFsIElkZW50aXRpZXMgYnkgQ29uZGl0aW9uKioqCmBgYHtyfQojIGdpX3NpbXBsaWZpZWQgYnkgY29uZGl0aW9uCmdpX3RhYmxlIDwtIHB1cnJibGVfd2lkZV9maW5hbCAlPiUKICBjb3VudChjb25kaXRpb24sIGdpX3NpbXBsaWZpZWQpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBjb25kaXRpb24sIHZhbHVlc19mcm9tID0gbiwgdmFsdWVzX2ZpbGwgPSAwKQoKIyBzb19zaW1wbGlmaWVkIGJ5IGNvbmRpdGlvbgpzb190YWJsZSA8LSBwdXJyYmxlX3dpZGVfZmluYWwgJT4lCiAgY291bnQoY29uZGl0aW9uLCBzb19zaW1wbGlmaWVkKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gY29uZGl0aW9uLCB2YWx1ZXNfZnJvbSA9IG4sIHZhbHVlc19maWxsID0gMCkKCiMgRGlzcGxheSB0aGUgdGFibGVzIGluIGEgbmljZWx5IGZvcm1hdHRlZCB3YXkKa2FibGUoZ2lfdGFibGUsIGNhcHRpb24gPSAiRnJlcXVlbmN5IFRhYmxlIG9mIEdlbmRlciBJZGVudGl0eSBieSBDb25kaXRpb24iKQprYWJsZShzb190YWJsZSwgY2FwdGlvbiA9ICJGcmVxdWVuY3kgVGFibGUgb2YgU2V4dWFsIE9yaWVudGF0aW9uIGJ5IENvbmRpdGlvbiIpCmBgYAoqKlJhY2UgYW5kIE5hdGlvbmFsaXR5IGJ5IENvbmRpdGlvbioqKgoKYGBge3J9CiMgTGlzdCBvZiByYWNlIHZhcmlhYmxlcwpyYWNlX3ZhcnMgPC0gYygiUmFjZV9Bc2lhbiIsICJSYWNlX0FyYWJpYyIsICJSYWNlX0JsYWNrIiwgIlJhY2VfSGlzcGFuaWMiLCAKICAgICAgICAgICAgICAgIlJhY2VfUGFjaWZpYyIsICJSYWNlX1doaXRlIiwgIlJhY2VfdW5rbm93biIpCgojIENyZWF0ZSBmcmVxdWVuY3kgdGFibGU6IENvdW50IG9mIDFzIGZvciBlYWNoIHJhY2UgdmFyaWFibGUgYnkgY29uZGl0aW9uCnJhY2VfdGFibGUgPC0gcHVycmJsZV93aWRlX2ZpbmFsICU+JQogIGdyb3VwX2J5KGNvbmRpdGlvbikgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyhhbGxfb2YocmFjZV92YXJzKSwgc3VtLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1jb25kaXRpb24sIG5hbWVzX3RvID0gIlJhY2VfVmFyaWFibGUiLCB2YWx1ZXNfdG8gPSAiQ291bnQiKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gY29uZGl0aW9uLCB2YWx1ZXNfZnJvbSA9IENvdW50LCB2YWx1ZXNfZmlsbCA9IDApCgojIERpc3BsYXkgcmFjZSBmcmVxdWVuY3kgdGFibGUKa2FibGUocmFjZV90YWJsZSwgY2FwdGlvbiA9ICJGcmVxdWVuY3kgVGFibGUgb2YgUmFjZSBWYXJpYWJsZXMgYnkgQ29uZGl0aW9uIikKCiMjIyBDb3VudCBvZiBQYXJ0aWNpcGFudHMgd2l0aCBNdWx0aXBsZSBSYWNpYWwgSWRlbnRpdGllcyBieSBDb25kaXRpb24KCiMgQ2FsY3VsYXRlIHRoZSBzdW0gb2YgYWxsIHJhY2UgdmFyaWFibGVzIGZvciBlYWNoIHBhcnRpY2lwYW50CnB1cnJibGVfd2lkZV9maW5hbCA8LSBwdXJyYmxlX3dpZGVfZmluYWwgJT4lCiAgbXV0YXRlKFJhY2VfU3VtID0gcm93U3VtcyhzZWxlY3QoLiwgYWxsX29mKHJhY2VfdmFycykpLCBuYS5ybSA9IFRSVUUpKQoKIyBDb3VudCBwYXJ0aWNpcGFudHMgd2l0aCBtb3JlIHRoYW4gb25lIHJhY2lhbCBpZGVudGl0eSBpbiBlYWNoIGNvbmRpdGlvbgptdWx0aV9yYWNlX2NvdW50cyA8LSBwdXJyYmxlX3dpZGVfZmluYWwgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpc2UoTXVsdGlwbGVfSWRlbnRpdGllcyA9IHN1bShSYWNlX1N1bSA+IDEsIG5hLnJtID0gVFJVRSkpCgojIERpc3BsYXkgcmVzdWx0cyB3aXRoIGRlc2NyaXB0aXZlIHRleHQKbXVsdGlfcmFjZV9jb3VudHMgJT4lCiAgbXV0YXRlKERlc2NyaXB0aW9uID0gcGFzdGUoTXVsdGlwbGVfSWRlbnRpdGllcywgInBlb3BsZSBpbiB0aGUiLCBjb25kaXRpb24sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25kaXRpb24gcmVwb3J0ZWQgbXVsdGlwbGUgcmFjaWFsL2V0aG5pYyBpZGVudGl0aWVzIikpICU+JQogIHB1bGwoRGVzY3JpcHRpb24pICU+JQogIGNhdChzZXAgPSAiXG4iKQoKCiMgZ2lfc2ltcGxpZmllZCBieSBjb25kaXRpb24KbmF0X3RhYmxlIDwtIHB1cnJibGVfd2lkZV9maW5hbCAlPiUKICBjb3VudChjb25kaXRpb24sIE5hdGlvbmFsaXR5KSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gY29uZGl0aW9uLCB2YWx1ZXNfZnJvbSA9IG4sIHZhbHVlc19maWxsID0gMCkKCgojIERpc3BsYXkgdGhlIHRhYmxlcyBpbiBhIG5pY2VseSBmb3JtYXR0ZWQgd2F5CmthYmxlKG5hdF90YWJsZSwgY2FwdGlvbiA9ICJGcmVxdWVuY3kgVGFibGUgb2YgTmF0aW9uYWxpdHkgYnkgQ29uZGl0aW9uIikKYGBgCgoKKipBZ2UgYnkgQ29uZGl0aW9uKioKVGhlIHRhYmxlIGJlbG93IHByZXNlbnRzIGFnZSBkZXNjcmlwdGl2ZXMgYnkgY29uZGl0aW9uLiAKQSB0LXRlc3Qgd2FzIGNvbmR1Y3RlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSB3ZXJlIGJhc2VsaW5lIGRpZmZlcmVuY2VzIGluIGFnZS4gVGhlcmUgd2VyZSBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gY29uZGl0aW9ucy4gCgpgYGB7cn0KIyAxLiBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzIGZvciBBZ2UgYnkgQ29uZGl0aW9uCmFnZV9kZXNjIDwtIGRlc2NyaWJlQnkocHVycmJsZV93aWRlX2ZpbmFsJGFnZSwgcHVycmJsZV93aWRlX2ZpbmFsJGNvbmRpdGlvbiwgbWF0ID0gVFJVRSkKYWdlX2Rlc2MgPC0gYWdlX2Rlc2MgJT4lCiAgc2VsZWN0KGdyb3VwMSwgbiwgbWVhbiwgc2QsIG1pbiwgbWF4KSAlPiUKICByZW5hbWUoCiAgICBDb25kaXRpb24gPSBncm91cDEsCiAgICBOID0gbiwKICAgIE1lYW4gPSBtZWFuLAogICAgU0QgPSBzZCwKICAgIE1pbiA9IG1pbiwKICAgIE1heCA9IG1heAogICkKCmNhdCgiIyMjICoqQWdlIGJ5IENvbmRpdGlvbiAoQmFzZWxpbmUpKipcbiIpCmthYmxlKGFnZV9kZXNjLCBjYXB0aW9uID0gIkRlc2NyaXB0aXZlIFN0YXRpc3RpY3MgZm9yIEFnZSBieSBDb25kaXRpb24iKQoKIyAyLiBULXRlc3QgZm9yIEFnZSBieSBDb25kaXRpb24KdF9yZXN1bHQgPC0gdC50ZXN0KGFnZSB+IGNvbmRpdGlvbiwgZGF0YSA9IHB1cnJibGVfd2lkZV9maW5hbCkKCiMgQ29udmVydCB0LXRlc3QgcmVzdWx0cyBpbnRvIGEgdGlkeSBkYXRhIGZyYW1lCnRfcmVzdWx0X2RmIDwtIHRpZHkodF9yZXN1bHQpICU+JQogIHNlbGVjdChlc3RpbWF0ZTEsIGVzdGltYXRlMiwgc3RhdGlzdGljLCBwLnZhbHVlLCBjb25mLmxvdywgY29uZi5oaWdoKSAlPiUKICByZW5hbWUoCiAgICBgTWVhbiAoV2FpdGxpc3QgQ29udHJvbClgID0gZXN0aW1hdGUxLAogICAgYE1lYW4gKFB1cnJibGUpYCA9IGVzdGltYXRlMiwKICAgIGB0LXZhbHVlYCA9IHN0YXRpc3RpYywKICAgIGBwLXZhbHVlYCA9IHAudmFsdWUsCiAgICBgTG93ZXIgQ0lgID0gY29uZi5sb3csCiAgICBgVXBwZXIgQ0lgID0gY29uZi5oaWdoCiAgKQoKY2F0KCJcbiMjIyAqKlQtdGVzdCBmb3IgQWdlIGJ5IENvbmRpdGlvbioqXG4iKQprYWJsZSh0X3Jlc3VsdF9kZiwgY2FwdGlvbiA9ICJULXRlc3QgUmVzdWx0cyBmb3IgQWdlIGJ5IENvbmRpdGlvbiIpCgpwdXJyYmxlX3dpZGVfZmluYWwgPC0gcHVycmJsZV93aWRlX2ZpbmFsICU+JQogIG11dGF0ZShjb25kaXRpb24gPSBhcy5mYWN0b3IoY29uZGl0aW9uKSkKCiMgMy4gRWZmZWN0IFNpemUgKENvaGVuJ3MgZCkKY29oZW4gPC0gY29oZW5zX2QoYWdlIH4gY29uZGl0aW9uLCBkYXRhID0gcHVycmJsZV93aWRlX2ZpbmFsKQoKIyBDb252ZXJ0IENvaGVuJ3MgZCByZXN1bHRzIGludG8gYSB0aWR5IGRhdGEgZnJhbWUKY29oZW5fZGYgPC0gdGliYmxlKAogIGBDb2hlbidzIGRgID0gY29oZW4kQ29oZW5zX2QsCiAgYDk1JSBDSSBMb3dlcmAgPSBjb2hlbiRDSV9sb3csCiAgYDk1JSBDSSBVcHBlcmAgPSBjb2hlbiRDSV9oaWdoCikKCiMgRGlzcGxheSByZXN1bHRzIGluIGEgY2xlYW4gdGFibGUKY2F0KCJcbiMjIyAqKkNvaGVuJ3MgZCBmb3IgQWdlIGJ5IENvbmRpdGlvbioqXG4iKQprYWJsZShjb2hlbl9kZiwgY2FwdGlvbiA9ICJFZmZlY3QgU2l6ZSAoQ29oZW4ncyBkKSBmb3IgQWdlIGJ5IENvbmRpdGlvbiIpCmBgYAoqKipQcmVsaW1pbmFyeSBBbmFseXNlcyoqCkZpcnN0LCB3ZSB3YW50IHRvIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGRpZmZlcmVuY2VzIGluIHRoZSBvdXRjb21lKHMpIG9mIGludGVyZXN0IGF0IGJhc2VsaW5lLCBieSBjaGFuY2UKKlJlc3VsdDoqIE5vIGRpZmZlcmVuY2UgaW4gYmFzZWxpbmUgcHJlLXRlc3QgbWVhc3VyZXMtIHdvbyEgCgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocHN5Y2gpCgpwdXJyYmxlX3dpZGVfZmluYWwgPC0gcHVycmJsZV93aWRlX2ZpbmFsICU+JQogIG11dGF0ZShjb25kaXRpb24gPSBhcy5mYWN0b3IoY29uZGl0aW9uKSkKCgojIENyZWF0ZSB2ZWN0b3JzIG9mIHByZS0gYW5kIHBvc3QtdGVzdCB2YXJpYWJsZXMKcHJlX3ZhcnMgPC0gYygiUHJlX0RFUlM4X1N1bSIsICJQcmVfR0FEN19TdW0iLCAiUHJlX1BIUTlfU3VtIiwKICAgICAgICAgICAgICAiUHJlX1NIU19QYXRod2F5cyIsICJQcmVfU0hTX0FnZW5jeSIsICJQcmVfU0hTX1RvdGFsSG9wZSIsCiAgICAgICAgICAgICAgIlByZV91Y2xhX1N1bSIsICJQcmVfcG1lcnFfRm9jdXNfQXZnIiwgIlByZV9wbWVycV9EaXN0cmFjdF9BdmciLCAiUHJlX3BtZXJxX0FEX0F2ZyIpCgpwb3N0X3ZhcnMgPC0gYygiUG9zdF9ERVJTOF9TdW0iLCAiUG9zdF9HQUQ3X1N1bSIsICJQb3N0X1BIUTlfU3VtIiwKICAgICAgICAgICAgICAgIlBvc3RfU0hTX1BhdGh3YXlzIiwgIlBvc3RfU0hTX0FnZW5jeSIsICJQb3N0X1NIU19Ub3RhbEhvcGUiLAogICAgICAgICAgICAgICAiUG9zdF91Y2xhX1N1bSIsICJQb3N0X3BtZXJxX0ZvY3VzX0F2ZyIsICJQb3N0X3BtZXJxX0Rpc3RyYWN0X0F2ZyIsICJQb3N0X3BtZXJxX0FEX0F2ZyIpCgojIElkZW50aWZ5IGNvbmRpdGlvbiBsZXZlbHMgKGFzc3VtaW5nIGV4YWN0bHkgdHdvIGNvbmRpdGlvbnMpCmNvbmRfbGV2ZWxzIDwtIHVuaXF1ZShwdXJyYmxlX3dpZGVfZmluYWwkY29uZGl0aW9uKQpjb25kX2xldmVscyA8LSBjb25kX2xldmVsc1shaXMubmEoY29uZF9sZXZlbHMpXQppZiAobGVuZ3RoKGNvbmRfbGV2ZWxzKSAhPSAyKSB7CiAgc3RvcCgiVGhpcyBjb2RlIGV4cGVjdHMgZXhhY3RseSB0d28gY29uZGl0aW9ucyBmb3IgdGhlIHQtdGVzdHMuIikKfQoKIyBTcGxpdCBkYXRhIGJ5IGNvbmRpdGlvbgpkYXRhX2NvbmQxIDwtIHB1cnJibGVfd2lkZV9maW5hbFtwdXJyYmxlX3dpZGVfZmluYWwkY29uZGl0aW9uID09IGNvbmRfbGV2ZWxzWzFdLCBdCmRhdGFfY29uZDIgPC0gcHVycmJsZV93aWRlX2ZpbmFsW3B1cnJibGVfd2lkZV9maW5hbCRjb25kaXRpb24gPT0gY29uZF9sZXZlbHNbMl0sIF0KCiMgSW5pdGlhbGl6ZSBhIHJlc3VsdHMgZGF0YSBmcmFtZQpyZXN1bHRzIDwtIGRhdGEuZnJhbWUoCiAgT3V0Y29tZSA9IGNoYXJhY3RlcigpLAogIENvbmRpdGlvbjEgPSBjaGFyYWN0ZXIoKSwKICBDb25kaXRpb24xX04gPSBudW1lcmljKCksCiAgQ29uZGl0aW9uMV9NZWFuID0gbnVtZXJpYygpLAogIENvbmRpdGlvbjFfU0QgPSBudW1lcmljKCksCiAgQ29uZGl0aW9uMiA9IGNoYXJhY3RlcigpLAogIENvbmRpdGlvbjJfTiA9IG51bWVyaWMoKSwKICBDb25kaXRpb24yX01lYW4gPSBudW1lcmljKCksCiAgQ29uZGl0aW9uMl9TRCA9IG51bWVyaWMoKSwKICBkZiA9IG51bWVyaWMoKSwKICB0ID0gbnVtZXJpYygpLAogIHAgPSBudW1lcmljKCksCiAgQ0lfTG93ZXIgPSBudW1lcmljKCksCiAgQ0lfVXBwZXIgPSBudW1lcmljKCksCiAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFCikKCiMgTG9vcCB0aHJvdWdoIGVhY2ggcHJlLXRlc3QgdmFyaWFibGUgYW5kIHJ1biBkZXNjcmlwdGl2ZXMgYW5kIHQtdGVzdApmb3IgKHZhciBpbiBwcmVfdmFycykgewogIAogICMgRGVzY3JpYmUgYnkgY29uZGl0aW9uCiAgZGVzYzEgPC0gZGVzY3JpYmUoZGF0YV9jb25kMVtbdmFyXV0pCiAgZGVzYzIgPC0gZGVzY3JpYmUoZGF0YV9jb25kMltbdmFyXV0pCiAgCiAgIyBDaGVjayBpZiB3ZSBoYXZlIHZhbGlkIGRhdGEgZm9yIGJvdGggY29uZGl0aW9ucwogIGlmIChkZXNjMSRuID4gMCAmIGRlc2MyJG4gPiAwKSB7CiAgICAjIHQtdGVzdAogICAgdHQgPC0gdC50ZXN0KHB1cnJibGVfd2lkZV9maW5hbFtbdmFyXV0gfiBwdXJyYmxlX3dpZGVfZmluYWwkY29uZGl0aW9uKQogICAgCiAgICAjIEV4dHJhY3QgaW5mbwogICAgbjEgPC0gZGVzYzEkbgogICAgbWVhbjEgPC0gZGVzYzEkbWVhbgogICAgc2QxIDwtIGRlc2MxJHNkCiAgICAKICAgIG4yIDwtIGRlc2MyJG4KICAgIG1lYW4yIDwtIGRlc2MyJG1lYW4KICAgIHNkMiA8LSBkZXNjMiRzZAogICAgCiAgICBkZl92YWwgPC0gdHQkcGFyYW1ldGVyCiAgICB0X3ZhbCA8LSB0dCRzdGF0aXN0aWMKICAgIHBfdmFsIDwtIHR0JHAudmFsdWUKICAgIGNpX2xvd2VyIDwtIHR0JGNvbmYuaW50WzFdCiAgICBjaV91cHBlciA8LSB0dCRjb25mLmludFsyXQogICAgCiAgICAjIEFkZCByb3cgdG8gcmVzdWx0cwogICAgcmVzdWx0cyA8LSByYmluZChyZXN1bHRzLCBkYXRhLmZyYW1lKAogICAgICBPdXRjb21lID0gdmFyLAogICAgICBDb25kaXRpb24xID0gY29uZF9sZXZlbHNbMV0sCiAgICAgIENvbmRpdGlvbjFfTiA9IG4xLAogICAgICBDb25kaXRpb24xX01lYW4gPSBtZWFuMSwKICAgICAgQ29uZGl0aW9uMV9TRCA9IHNkMSwKICAgICAgQ29uZGl0aW9uMiA9IGNvbmRfbGV2ZWxzWzJdLAogICAgICBDb25kaXRpb24yX04gPSBuMiwKICAgICAgQ29uZGl0aW9uMl9NZWFuID0gbWVhbjIsCiAgICAgIENvbmRpdGlvbjJfU0QgPSBzZDIsCiAgICAgIGRmID0gZGZfdmFsLAogICAgICB0ID0gdF92YWwsCiAgICAgIHAgPSBwX3ZhbCwKICAgICAgQ0lfTG93ZXIgPSBjaV9sb3dlciwKICAgICAgQ0lfVXBwZXIgPSBjaV91cHBlciwKICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFCiAgICApKQogIH0KfQoKY2F0KCJCYXNlbGluZSBkaWZmZXJlbmNlcyBpbiBzdHVkeSBvdXRjb21lcyBieSBjb25kaXRpb25cblxuIikKcHJpbnQocmVzdWx0cykKCmBgYApgYGB7cn0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMKbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKbGlicmFyeShicm9vbSkKCiMgRGVmaW5lIHByZS10ZXN0IGFuZCBwb3N0LXRlc3QgdmFyaWFibGVzCnByZV92YXJzIDwtIGMoIlByZV9ERVJTOF9TdW0iLCAiUHJlX0dBRDdfU3VtIiwgIlByZV9QSFE5X1N1bSIsCiAgICAgICAgICAgICAgIlByZV9TSFNfUGF0aHdheXMiLCAiUHJlX1NIU19BZ2VuY3kiLCAiUHJlX1NIU19Ub3RhbEhvcGUiLAogICAgICAgICAgICAgICJQcmVfdWNsYV9TdW0iLCAiUHJlX3BtZXJxX0ZvY3VzX0F2ZyIsICJQcmVfcG1lcnFfRGlzdHJhY3RfQXZnIiwgIlByZV9wbWVycV9BRF9BdmciKQoKcG9zdF92YXJzIDwtIGMoIlBvc3RfREVSUzhfU3VtIiwgIlBvc3RfR0FEN19TdW0iLCAiUG9zdF9QSFE5X1N1bSIsCiAgICAgICAgICAgICAgICJQb3N0X1NIU19QYXRod2F5cyIsICJQb3N0X1NIU19BZ2VuY3kiLCAiUG9zdF9TSFNfVG90YWxIb3BlIiwKICAgICAgICAgICAgICAgIlBvc3RfdWNsYV9TdW0iLCAiUG9zdF9wbWVycV9Gb2N1c19BdmciLCAiUG9zdF9wbWVycV9EaXN0cmFjdF9BdmciLCAiUG9zdF9wbWVycV9BRF9BdmciKQoKCiMgQ29tcHV0ZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIGZvciBQcmUtVGVzdCBEYXRhCnByZV9kZXNjcmlwdGl2ZXMgPC0gcHVycmJsZV93aWRlX2ZpbmFsICU+JQogIHNlbGVjdChhbGxfb2YocHJlX3ZhcnMpKSAlPiUKICBwc3ljaDo6ZGVzY3JpYmUoKSAlPiUKICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgc2VsZWN0KG4sIG1lYW4sIHNkLCBtaW4sIG1heCwgc2tldywga3VydG9zaXMpICU+JQogIHJlbmFtZShOID0gbiwgTWVhbiA9IG1lYW4sIFNEID0gc2QsIE1pbiA9IG1pbiwgTWF4ID0gbWF4LCBTa2V3bmVzcyA9IHNrZXcsIEt1cnRvc2lzID0ga3VydG9zaXMpCgojIENvbXB1dGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBmb3IgUG9zdC1UZXN0IERhdGEKcG9zdF9kZXNjcmlwdGl2ZXMgPC0gcHVycmJsZV93aWRlX2ZpbmFsICU+JQogIHNlbGVjdChhbGxfb2YocG9zdF92YXJzKSkgJT4lCiAgcHN5Y2g6OmRlc2NyaWJlKCkgJT4lCiAgYXMuZGF0YS5mcmFtZSgpICU+JQogIHNlbGVjdChuLCBtZWFuLCBzZCwgbWluLCBtYXgsIHNrZXcsIGt1cnRvc2lzKSAlPiUKICByZW5hbWUoTiA9IG4sIE1lYW4gPSBtZWFuLCBTRCA9IHNkLCBNaW4gPSBtaW4sIE1heCA9IG1heCwgU2tld25lc3MgPSBza2V3LCBLdXJ0b3NpcyA9IGt1cnRvc2lzKQoKIyBEaXNwbGF5IERlc2NyaXB0aXZlIFRhYmxlcwpjYXQoIlxuIyMjICoqUHJlLVRlc3QgRGVzY3JpcHRpdmUgU3RhdGlzdGljcyoqXG4iKQprYWJsZShwcmVfZGVzY3JpcHRpdmVzLCBjYXB0aW9uID0gIkRlc2NyaXB0aXZlIFN0YXRpc3RpY3MgZm9yIFByZS1UZXN0IERhdGEiLCBkaWdpdHMgPSAzKQoKY2F0KCJcbiMjIyAqKlBvc3QtVGVzdCBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzKipcbiIpCmthYmxlKHBvc3RfZGVzY3JpcHRpdmVzLCBjYXB0aW9uID0gIkRlc2NyaXB0aXZlIFN0YXRpc3RpY3MgZm9yIFBvc3QtVGVzdCBEYXRhIiwgZGlnaXRzID0gMykKCiMgQ3JlYXRlIGFuIGVtcHR5IGRhdGEgZnJhbWUgdG8gc3RvcmUgQU5DT1ZBIHJlc3VsdHMKYW5jb3ZhX3Jlc3VsdHMgPC0gdGliYmxlKCkKCiMgUnVuIEFOQ09WQXMgZm9yIGVhY2ggcG9zdC10ZXN0IHZhcmlhYmxlIGNvbnRyb2xsaW5nIGZvciB0aGUgY29ycmVzcG9uZGluZyBwcmUtdGVzdCB2YXJpYWJsZQpmb3IgKHBvc3RfdmFyIGluIHBvc3RfdmFycykgewogICMgSWRlbnRpZnkgdGhlIGNvcnJlc3BvbmRpbmcgcHJlIHZhcmlhYmxlCiAgcHJlX3ZhciA8LSBzdWIoIl5Qb3N0XyIsICJQcmVfIiwgcG9zdF92YXIpCgogICMgRW5zdXJlIHRoYXQgYm90aCB2YXJpYWJsZXMgZXhpc3QgaW4gdGhlIGRhdGFzZXQKICBpZiAoIShwcmVfdmFyICVpbiUgbmFtZXMocHVycmJsZV93aWRlX2ZpbmFsKSkpIHsKICAgIG5leHQgICMgU2tpcCBpZiBwcmUtdGVzdCB2YXJpYWJsZSBpcyBtaXNzaW5nCiAgfQoKICAjIEZpdCB0aGUgQU5DT1ZBIG1vZGVsCiAgZm9ybXVsYV9zdHIgPC0gcGFzdGUocG9zdF92YXIsICJ+IGNvbmRpdGlvbiArIiwgcHJlX3ZhcikKICBtb2RlbCA8LSBhb3YoYXMuZm9ybXVsYShmb3JtdWxhX3N0ciksIGRhdGEgPSBwdXJyYmxlX3dpZGVfZmluYWwpCgogICMgRXh0cmFjdCBtb2RlbCBzdW1tYXJ5IHN0YXRpc3RpY3MKICBhbmNvdmFfc3VtbWFyeSA8LSB0aWR5KG1vZGVsKSAlPiUKICAgIGZpbHRlcih0ZXJtID09ICJjb25kaXRpb24iKSAlPiUKICAgIHNlbGVjdChzdGF0aXN0aWMsIHAudmFsdWUpICU+JQogICAgcmVuYW1lKGBGLVZhbHVlYCA9IHN0YXRpc3RpYywgYHAtVmFsdWVgID0gcC52YWx1ZSkKCiAgIyBDYWxjdWxhdGUgTWVhbnMgYW5kIFNEcyBieSBjb25kaXRpb24gZm9yIHRoZSBwb3N0LXRlc3QgdmFyaWFibGUKICBjb25kX3N1bW1hcnkgPC0gcHVycmJsZV93aWRlX2ZpbmFsICU+JQogICAgZ3JvdXBfYnkoY29uZGl0aW9uKSAlPiUKICAgIHN1bW1hcmlzZSgKICAgICAgTWVhbiA9IG1lYW4oLmRhdGFbW3Bvc3RfdmFyXV0sIG5hLnJtID0gVFJVRSksCiAgICAgIFNEID0gc2QoLmRhdGFbW3Bvc3RfdmFyXV0sIG5hLnJtID0gVFJVRSkKICAgICkgJT4lCiAgICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gY29uZGl0aW9uLCB2YWx1ZXNfZnJvbSA9IGMoTWVhbiwgU0QpKQoKICAjIENvbWJpbmUgcmVzdWx0cyBpbnRvIGEgc2luZ2xlIHJvdwogIGFuY292YV9yZXN1bHRzIDwtIGJpbmRfcm93cyhhbmNvdmFfcmVzdWx0cywKICAgIHRpYmJsZSgKICAgICAgT3V0Y29tZSA9IHBvc3RfdmFyLAogICAgICBgUHJlLVRlc3QgQ292YXJpYXRlYCA9IHByZV92YXIKICAgICkgJT4lCiAgICAgIGJpbmRfY29scyhjb25kX3N1bW1hcnksIGFuY292YV9zdW1tYXJ5KSAKICApCn0KCiMgRGlzcGxheSB0aGUgc3RydWN0dXJlZCBBTkNPVkEgcmVzdWx0cyB0YWJsZQpjYXQoIlxuIyMjICoqQU5DT1ZBIFJlc3VsdHMgYnkgT3V0Y29tZSoqXG4iKQprYWJsZShhbmNvdmFfcmVzdWx0cywgY2FwdGlvbiA9ICJBbmFseXNpcyBvZiBDb3ZhcmlhbmNlIChBTkNPVkEpIFJlc3VsdHMgYnkgT3V0Y29tZSIsIGRpZ2l0cyA9IDMpCgpgYGAKKipGb2xsb3ctdXA6IEVmZmVjdCBTaXplcyBmb3IgU2lnbmlmaWNhbnQvTWFyZ2luYWwgVmFyaWFibGVzKioKKEknbSBzb3JyeSBJIGRvbid0IGtub3cgaG93IHRvIG1ha2UgdGhpcyBsb29rIHByZXR0eSEgSWYgYW55b25lIGtub3dzIHBsZWFzZSBoZWxwISkKQ29oZW4ncyBGIEZvciBFYWNoIFNpZ25pZmljYW50L01hcmdpbmFsIE91dGNvbWU6IApBbnhpZXR5OiAuIDAuMTYKRGVwcmVzc2lvbjogMC4yMQpERVJTOiAwLjMxCgpgYGB7cn0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMKbGlicmFyeShlZmZlY3RzaXplKQoKIyBEZWZpbmUgdGhlIHBvc3QtdGVzdCB2YXJpYWJsZXMgdG8gYW5hbHl6ZQpwb3N0X3ZhcnMgPC0gYygiUG9zdF9ERVJTOF9TdW0iLCAiUG9zdF9HQUQ3X1N1bSIsICJQb3N0X1BIUTlfU3VtIikKCgpwcmVfdmFycyA8LSBjKCJQcmVfREVSUzhfU3VtIiwgIlByZV9HQUQ3X1N1bSIsICJQcmVfUEhROV9TdW0iKQoKIyBSdW4gQU5DT1ZBcyBmb3IgZWFjaCBwb3N0LXRlc3QgdmFyaWFibGUgY29udHJvbGxpbmcgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHByZS10ZXN0IHZhcmlhYmxlCmZvciAocG9zdF92YXIgaW4gcG9zdF92YXJzKSB7CiAgIyBJZGVudGlmeSB0aGUgY29ycmVzcG9uZGluZyBwcmUgdmFyaWFibGUKICBwcmVfdmFyIDwtIHN1YigiXlBvc3RfIiwgIlByZV8iLCBwb3N0X3ZhcikKCiAgIyBFbnN1cmUgdGhhdCBib3RoIHZhcmlhYmxlcyBleGlzdCBpbiB0aGUgZGF0YXNldAogIGlmICghKHByZV92YXIgJWluJSBuYW1lcyhwdXJyYmxlX3dpZGVfZmluYWwpKSkgewogICAgY2F0KCJObyBjb3JyZXNwb25kaW5nIHByZS10ZXN0IHZhcmlhYmxlIGZvdW5kIGZvcjoiLCBwb3N0X3ZhciwgIlxuIikKICAgIG5leHQKICB9CgogICMgRml0IHRoZSBBTkNPVkEgbW9kZWwKICBmb3JtdWxhX3N0ciA8LSBwYXN0ZShwb3N0X3ZhciwgIn4gY29uZGl0aW9uICsiLCBwcmVfdmFyKQogIG1vZGVsIDwtIGFvdihhcy5mb3JtdWxhKGZvcm11bGFfc3RyKSwgZGF0YSA9IHB1cnJibGVfd2lkZV9maW5hbCkKCiAgIyBQcmludCBhIGhlYWRlciBhbmQgdGhlIG1vZGVsIHN1bW1hcnkKICBjYXQoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKQogIGNhdCgiQU5DT1ZBIGZvcjoiLCBwb3N0X3ZhciwgImNvbnRyb2xsaW5nIGZvciIsIHByZV92YXIsICJcbiIpCiAgY2F0KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpCiAgcHJpbnQoc3VtbWFyeShtb2RlbCkpCiAgCiAgIyBDb21wdXRlIHBhcnRpYWwgZXRhIHNxdWFyZWQKICBldGFfc3FfcmVzdWx0cyA8LSBldGFfc3F1YXJlZChtb2RlbCwgcGFydGlhbCA9IFRSVUUpCiAgCiAgIyBDb21wdXRlIENvaGVuJ3MgZiAocGFydGlhbCkKICBmX3Jlc3VsdHMgPC0gY29oZW5zX2YobW9kZWwsIHBhcnRpYWwgPSBUUlVFKQogIAogIGNhdCgiXG5QYXJ0aWFsIEV0YSBTcXVhcmVkOlxuIikKICBwcmludChldGFfc3FfcmVzdWx0cykKICAKICBjYXQoIlxuQ29oZW4ncyBmIChQYXJ0aWFsKTpcbiIpCiAgcHJpbnQoZl9yZXN1bHRzKQp9CgoKYGBgCgoqKlNlbGYtaGFybSBRdWVzdGlvbnMqKgoKUG9zdC10ZXN0IExvZ2lzdGljIFJlZ3Jlc3Npb24gdG8gSW52ZXN0aWdhdGUgSW50ZXJ2ZW50aW9uIEVmZmVjdHMgb24gU2VsZi1IYXJtIE91dGNvbWVzCipSZXN1bHQ6KiAKQ29uZGl0aW9uIHdhcyBub3QgYSBzaWduaWZpY2FudCBwcmVkaWN0b3Igb2YgYW55IHNlbGYtaGFybSBvdXRjb21lIChjb2RlZCBiaW5hcnkpLgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ3RzdW1tYXJ5KSAgIApsaWJyYXJ5KGJyb29tKSAKCk5vRHVwX1B1cnJibGVBbm9uIDwtIE5vRHVwX1B1cnJibGVBbm9uICU+JQogIG11dGF0ZSgKICAgICMgSWYgbWlzc2luZywgdGhlbiBOQS4gSWYgPD0gMSB0aGVuIDAsIGVsc2UgMQogICAgU0hRMSA9IGlmZWxzZShpcy5uYShzaHFzY3JlZW5lcjEpLCBOQSwgaWZlbHNlKHNocXNjcmVlbmVyMSA8PSAxLCAwLCAxKSksCiAgICBTSFEyID0gaWZlbHNlKGlzLm5hKHNocXNjcmVlbmVyMiksIE5BLCBpZmVsc2Uoc2hxc2NyZWVuZXIyIDw9IDEsIDAsIDEpKSwKICAgIFNIUTMgPSBpZmVsc2UoaXMubmEoc2hxc2NyZWVuZXIzKSwgTkEsIGlmZWxzZShzaHFzY3JlZW5lcjMgPD0gMSwgMCwgMSkpCiAgKSAlPiUKICBtdXRhdGUoCiAgICAjIElmIGFueSBvZiBTSFExLCBTSFEyLCBvciBTSFEzIGlzIG1pc3NpbmcsIFNIUV9BbnkgaXMgbWlzc2luZy4KICAgICMgSWYgYWxsIHRocmVlIGFyZSAwLCBTSFFfQW55IGlzIDAsIGVsc2UgMS4KICAgIFNIUV9BbnkgPSBjYXNlX3doZW4oCiAgICAgIGlzLm5hKFNIUTEpIHwgaXMubmEoU0hRMikgfCBpcy5uYShTSFEzKSB+IE5BX3JlYWxfLAogICAgICBTSFExID09IDAgJiBTSFEyID09IDAgJiBTSFEzID09IDAgfiAwLAogICAgICBUUlVFIH4gMQogICAgKQogICkKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAxKSBMb2dpc3RpYyByZWdyZXNzaW9uIGZvciBTSFExIGF0IFdlZWsgMTIKIyAgICBjb250cm9sbGluZyBmb3IgV2VlayAyIFNIUTEgYW5kIENvbmRpdGlvbgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptb2RlbF9zaHExIDwtIGdsbSgKICBTSFExXzEyIH4gY29uZGl0aW9uICsgU0hRMV8yLCAKICBkYXRhID0gcHVycmJsZV93aWRlLCAKICBmYW1pbHkgPSBiaW5vbWlhbAopCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDIpIExvZ2lzdGljIHJlZ3Jlc3Npb24gZm9yIFNIUTIgYXQgV2VlayAxMgojICAgIGNvbnRyb2xsaW5nIGZvciBXZWVrIDIgU0hRMiBhbmQgQ29uZGl0aW9uCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm1vZGVsX3NocTIgPC0gZ2xtKAogIFNIUTJfMTIgfiBjb25kaXRpb24gKyBTSFEyXzIsIAogIGRhdGEgPSBwdXJyYmxlX3dpZGUsIAogIGZhbWlseSA9IGJpbm9taWFsCikKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMykgTG9naXN0aWMgcmVncmVzc2lvbiBmb3IgU0hRMyBhdCBXZWVrIDEyCiMgICAgY29udHJvbGxpbmcgZm9yIFdlZWsgMiBTSFEzIGFuZCBDb25kaXRpb24KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbW9kZWxfc2hxMyA8LSBnbG0oCiAgU0hRM18xMiB+IGNvbmRpdGlvbiArIFNIUTNfMiwgCiAgZGF0YSA9IHB1cnJibGVfd2lkZSwgCiAgZmFtaWx5ID0gYmlub21pYWwKKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyA0KSBMb2dpc3RpYyByZWdyZXNzaW9uIGZvciBTSFFfQW55IGF0IFdlZWsgMTIKIyAgICBjb250cm9sbGluZyBmb3IgV2VlayAyIFNIUV9BbnkgYW5kIENvbmRpdGlvbgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptb2RlbF9zaHFBbnkgPC0gZ2xtKAogIFNIUV9BbnlfMTIgfiBjb25kaXRpb24gKyBTSFFfQW55XzIsIAogIGRhdGEgPSBwdXJyYmxlX3dpZGUsIAogIGZhbWlseSA9IGJpbm9taWFsCikKCiMgQ3JlYXRlIGd0c3VtbWFyeSB0YWJsZXMgZm9yIGVhY2ggbW9kZWwsIGV4cG9uZW50aWF0aW5nIGZvciBPUgp0Ymxfc2hxMSAgIDwtIHRibF9yZWdyZXNzaW9uKG1vZGVsX3NocTEsIGV4cG9uZW50aWF0ZSA9IFRSVUUpICU+JQogIGJvbGRfbGFiZWxzKCkgJT4lCiAgYWRkX3NpZ25pZmljYW5jZV9zdGFycygpCgp0Ymxfc2hxMiAgIDwtIHRibF9yZWdyZXNzaW9uKG1vZGVsX3NocTIsIGV4cG9uZW50aWF0ZSA9IFRSVUUpICU+JQogIGJvbGRfbGFiZWxzKCkgJT4lCiAgYWRkX3NpZ25pZmljYW5jZV9zdGFycygpCgp0Ymxfc2hxMyAgIDwtIHRibF9yZWdyZXNzaW9uKG1vZGVsX3NocTMsIGV4cG9uZW50aWF0ZSA9IFRSVUUpICU+JQogIGJvbGRfbGFiZWxzKCkgJT4lCiAgYWRkX3NpZ25pZmljYW5jZV9zdGFycygpCgp0Ymxfc2hxQW55IDwtIHRibF9yZWdyZXNzaW9uKG1vZGVsX3NocUFueSwgZXhwb25lbnRpYXRlID0gVFJVRSkgJT4lCiAgYm9sZF9sYWJlbHMoKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlX3N0YXJzKCkKCm1lcmdlZF90YmwgPC0gdGJsX21lcmdlKAogICB0YmxzID0gbGlzdCh0Ymxfc2hxMSwgdGJsX3NocTIsIHRibF9zaHEzLCB0Ymxfc2hxQW55KSwKICAgdGFiX3NwYW5uZXIgPSBjKCJTSFExIE1vZGVsIiwgIlNIUTIgTW9kZWwiLCAiU0hRMyBNb2RlbCIsICJTSFFfQW55IE1vZGVsIikKICkKIG1lcmdlZF90YmwKCmBgYAoKCkJlbG93LCB3ZSBkaXNwbGF5IGEgdGFibGUgYW5kIGdyYXBoIG9mIHRoZSBmcmVxdWVuY3kgb2YgcmVzcG9uc2VzIGZvciBhbGwgc2VsZi1oYXJtIHF1ZXN0aW9ucy4gClBsZWFzZSBub3RlLSB0aGV5IGFyZSBhbGwgZXF1YWwgKHdoaWNoIGlzIHdoeSB0aGUgbGluZXMgYWxsIG92ZXJsYXAgYW5kIHRoZXJlIGFwcGVhcnMgdG8gb25seSBiZSBvbmUhKQpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGd0KQoKc2hxX3N1bW1hcnkgPC0gTm9EdXBfUHVycmJsZUFub24gJT4lCiAgZ3JvdXBfYnkoV2VlaykgJT4lCiAgc3VtbWFyaXNlKAogICAgTl9TSFExID0gc3VtKCFpcy5uYShTSFExKSksCiAgICBOX1NIUTIgPSBzdW0oIWlzLm5hKFNIUTIpKSwKICAgIE5fU0hRMyA9IHN1bSghaXMubmEoU0hRMykpCiAgKSAlPiUKICB1bmdyb3VwKCkKCiMgUmVtb3ZlIHdlZWsgMCBhbmQgTkEgdmFsdWVzCnNocV9zdW1tYXJ5X2NsZWFuIDwtIHNocV9zdW1tYXJ5ICU+JQogIGZpbHRlcighaXMubmEoV2VlaykgJiBXZWVrICE9IDApCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFBsb3Q6IExpbmUgR3JhcGggZm9yIFJlc3BvbnNlIFJhdGUgT3ZlciBUaW1lCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmdncGxvdChzaHFfc3VtbWFyeV9jbGVhbiwgYWVzKHggPSBXZWVrKSkgKwogIGdlb21fbGluZShhZXMoeSA9IE5fU0hRMSwgY29sb3IgPSAiU0hRMSIpLCBzaXplID0gMSkgKwogIGdlb21fbGluZShhZXMoeSA9IE5fU0hRMiwgY29sb3IgPSAiU0hRMiIpLCBzaXplID0gMSkgKwogIGdlb21fbGluZShhZXMoeSA9IE5fU0hRMywgY29sb3IgPSAiU0hRMyIpLCBzaXplID0gMSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJSZXNwb25zZSBSYXRlIE92ZXIgVGltZSBmb3IgU0hRIFZhcmlhYmxlcyIsCiAgICB4ID0gIldlZWsiLAogICAgeSA9ICJOdW1iZXIgb2YgTm9uLU1pc3NpbmcgUmVzcG9uc2VzIiwKICAgIGNvbG9yID0gIlNIUSBWYXJpYWJsZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSB1bmlxdWUoc2hxX3N1bW1hcnlfY2xlYW4kV2VlaykpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiU0hRMSIgPSAiYmx1ZSIsICJTSFEyIiA9ICJyZWQiLCAiU0hRMyIgPSAiZ3JlZW4iKSkKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRGlzcGxheSBUYWJsZTogUmVzcG9uc2UgQ291bnRzIE92ZXIgVGltZQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzaHFfc3VtbWFyeV9jbGVhbiAlPiUKICBndCgpICU+JQogIGd0Ojp0YWJfaGVhZGVyKAogICAgdGl0bGUgPSAiTnVtYmVyIG9mIFJlc3BvbnNlcyBmb3IgU2VsZi1IYXJtIFF1ZXN0aW9ucyBPdmVyIFRpbWUiCiAgKQpgYGAKCgoqKkxpbmVhciBNaXhlZCBFZmZlY3RzIE1vZGVscyoqClJlc3VsdHMgaW50ZXJwcmV0YXRpb246CgoKIyMgKipPdmVyYWxsIFN1bW1hcnkgb2YgU2lnbmlmaWNhbnQgUmVzdWx0cyoqCi0gKipQdXJyYmxlIHNob3dlZCBncmVhdGVyIGltcHJvdmVtZW50IGNvbXBhcmVkIHRvIHRoZSBXYWl0bGlzdCBncm91cCBmb3I6KioKICAtICoqRW1vdGlvbmFsIER5c3JlZ3VsYXRpb24gKERFUlM4KSoqCiAgLSAqKkFueGlldHkgKEdBRDcpKioKICAtICoqRGVwcmVzc2lvbiAoUEhROSkqKgogIC0gKipQb3NpdGl2ZSBFbW90aW9uIFJlZ3VsYXRpb24gLSBGb2N1cyAocG1lcnFfRm9jdXNfQXZnKSoqCiAgLSAqKlBvc2l0aXZlIEVtb3Rpb24gUmVndWxhdGlvbiAtIEF0dGVudGlvbmFsIERlcGxveW1lbnQgKHBtZXJxX0FEX0F2ZykqKgoKLS0tCgojIyAqKkZpeGVkIEVmZmVjdHMgUmVzdWx0cyoqCgojIyMgKioxLiBFbW90aW9uYWwgRHlzcmVndWxhdGlvbiAoREVSUzhfU3VtKSoqCiAgLSAqKkludGVyYWN0aW9uIEVmZmVjdDoqKiBUaGUgV2FpdGxpc3QgZ3JvdXAgc2hvd2VkIGEgc2lnbmlmaWNhbnRseSBsZXNzIHN0ZWVwIGRlY2xpbmUgdGhhbiBQdXJyYmxlICgqcCogPCAwLjAwMSkuCiAgLSAqKkludGVycHJldGF0aW9uOioqIEVtb3Rpb25hbCBkeXNyZWd1bGF0aW9uIGltcHJvdmVkIG1vcmUgaW4gdGhlICoqUHVycmJsZSoqIGdyb3VwIGNvbXBhcmVkIHRvICoqV2FpdGxpc3QqKi4KCiMjIyAqKjIuIEFueGlldHkgU3ltcHRvbXMgKEdBRDdfU3VtKSoqCiAgLSAqKkludGVyYWN0aW9uIEVmZmVjdDoqKiBUaGUgV2FpdGxpc3QgZ3JvdXAgZXhwZXJpZW5jZWQgYSBzaWduaWZpY2FudGx5IHNtYWxsZXIgaW1wcm92ZW1lbnQgdGhhbiBQdXJyYmxlICgqcCogPSAwLjAxNikuCiAgLSAqKkludGVycHJldGF0aW9uOioqIEFueGlldHkgc3ltcHRvbXMgZGVjcmVhc2VkIG1vcmUgaW4gdGhlICoqUHVycmJsZSoqIGdyb3VwIHRoYW4gaW4gKipXYWl0bGlzdCoqLgoKIyMjICoqMy4gRGVwcmVzc2lvbiBTeW1wdG9tcyAoUEhROV9TdW0pKioKICAtICoqSW50ZXJhY3Rpb24gRWZmZWN0OioqIFRoZSBXYWl0bGlzdCBncm91cCBzaG93ZWQgc2lnbmlmaWNhbnRseSBzbWFsbGVyIGltcHJvdmVtZW50IHRoYW4gUHVycmJsZSAoKnAqIDwgMC4wMDEpLgogIC0gKipJbnRlcnByZXRhdGlvbjoqKiBUaGUgKipQdXJyYmxlKiogZ3JvdXAgZXhwZXJpZW5jZWQgYSBncmVhdGVyIHJlZHVjdGlvbiBpbiAqKmRlcHJlc3NpdmUgc3ltcHRvbXMqKi4KCiMjIyAqKjQuIFBvc2l0aXZlIEVtb3Rpb24gUmVndWxhdGlvbiAtIEZvY3VzIChwbWVycV9Gb2N1c19BdmcpKioKICAtICoqSW50ZXJhY3Rpb24gRWZmZWN0OioqIFRoZSBQdXJyYmxlIGdyb3VwIHNob3dlZCBhIHNsaWdodGx5IGdyZWF0ZXIgaW1wcm92ZW1lbnQgdGhhbiB0aGUgV2FpdGxpc3QgZ3JvdXAgKCpwKiA9IDAuMDE4KS4KICAtICoqSW50ZXJwcmV0YXRpb246KiogVGhlICoqUHVycmJsZSoqIGdyb3VwIGhhZCAqKmVuaGFuY2VkIGVtb3Rpb24gcmVndWxhdGlvbiBzdHJhdGVnaWVzKiogZm9jdXNlZCBvbiBwb3NpdGl2ZSBlbW90aW9ucy4KCiMjIyAqKjUuIFBvc2l0aXZlIEVtb3Rpb24gUmVndWxhdGlvbiAtIEF0dGVudGlvbmFsIERlcGxveW1lbnQgKHBtZXJxX0FEX0F2ZykqKgogIC0gKipJbnRlcmFjdGlvbiBFZmZlY3Q6KiogVGhlIFB1cnJibGUgZ3JvdXAgc2hvd2VkIHNpZ25pZmljYW50bHkgZ3JlYXRlciBpbXByb3ZlbWVudCBjb21wYXJlZCB0byB0aGUgV2FpdGxpc3QgZ3JvdXAgKCpwKiA9IDAuMDEwKS4KICAtICoqSW50ZXJwcmV0YXRpb246KiogVGhlICoqUHVycmJsZSoqIGdyb3VwIGltcHJvdmVkIG1vcmUgaW4gKiphY2NlcHRhbmNlIGFuZCBkYW1wZW5pbmcgc3RyYXRlZ2llcyoqLgoKLS0tCgojIyAqKk5vbi1TaWduaWZpY2FudCBJbnRlcmFjdGlvbiBFZmZlY3RzKioKRm9yIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzLCB0aGVyZSB3YXMgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIGdyb3VwcyBvdmVyIHRpbWU6Ci0gKipIb3BlIFBhdGh3YXlzIChTSFNfUGF0aHdheXMpKioKLSAqKkhvcGUgQWdlbmN5IChTSFNfQWdlbmN5KSoqCi0gKipUb3RhbCBIb3BlIChTSFNfVG90YWxIb3BlKSoqCi0gKipMb25lbGluZXNzIChVQ0xBX1N1bSkqKgotICoqUG9zaXRpdmUgRW1vdGlvbiBSZWd1bGF0aW9uIC0gRGlzdHJhY3Rpb24gKHBtZXJxX0Rpc3RyYWN0X0F2ZykqKiAobWFyZ2luYWwgdHJlbmQsICpwKiA9IDAuMDYzKQoKCmBgYHtyfQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcwpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGtuaXRyKQoKIyBEZWZpbmUgb3V0Y29tZSB2YXJpYWJsZXMKb3V0Y29tZXMgPC0gYygKICAiREVSUzhfU3VtIiwgIkdBRDdfU3VtIiwgIlBIUTlfU3VtIiwgIlNIU19QYXRod2F5cyIsICJTSFNfQWdlbmN5IiwgCiAgIlNIU19Ub3RhbEhvcGUiLCAidWNsYV9TdW0iLCAicG1lcnFfRm9jdXNfQXZnIiwgInBtZXJxX0Rpc3RyYWN0X0F2ZyIsICJwbWVycV9BRF9BdmciCikKCiMgRW5zdXJlICdjb25kaXRpb24nIGlzIGEgZmFjdG9yCk5vRHVwX1B1cnJibGVBbm9uIDwtIE5vRHVwX1B1cnJibGVBbm9uICU+JQogIG11dGF0ZShjb25kaXRpb24gPSBhcy5mYWN0b3IoY29uZGl0aW9uKSkKCiMgSW5pdGlhbGl6ZSBhbiBlbXB0eSBsaXN0IHRvIHN0b3JlIG1vZGVscwptb2RlbHNfbGlzdCA8LSBsaXN0KCkKCiMgRml0IGxpbmVhciBtaXhlZCBtb2RlbHMgYW5kIGV4dHJhY3QgcmVzdWx0cwpmb3IgKG91dGNvbWUgaW4gb3V0Y29tZXMpIHsKICBmb3JtdWxhX3N0ciA8LSBwYXN0ZTAob3V0Y29tZSwgIiB+IFdlZWsgKiBjb25kaXRpb24gKyAoMSB8IHBzaWQpIikKICBmaXQgPC0gbG1lcihhcy5mb3JtdWxhKGZvcm11bGFfc3RyKSwgZGF0YSA9IE5vRHVwX1B1cnJibGVBbm9uLCBSRU1MID0gVFJVRSkKICBtb2RlbHNfbGlzdFtbb3V0Y29tZV1dIDwtIGZpdAp9CgojIFByaW50IGVhY2ggbW9kZWwncyBmaXhlZCBlZmZlY3QgZXN0aW1hdGVzIGluIGEgcmVhZGFibGUgZm9ybWF0CmZvciAob3V0Y29tZSBpbiBuYW1lcyhtb2RlbHNfbGlzdCkpIHsKICBjYXQoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIikKICBjYXQoIkZpeGVkIEVmZmVjdHMgZm9yIE91dGNvbWU6Iiwgb3V0Y29tZSwgIlxuIikKICBjYXQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpCiAgCiAgIyBFeHRyYWN0IGZpeGVkIGVmZmVjdHMKICBjb2VmX3RhYmxlIDwtIGFzLmRhdGEuZnJhbWUoc3VtbWFyeShtb2RlbHNfbGlzdFtbb3V0Y29tZV1dKSRjb2VmZmljaWVudHMpCiAgY29lZl90YWJsZSRWYXJpYWJsZSA8LSByb3duYW1lcyhjb2VmX3RhYmxlKQogIHJvd25hbWVzKGNvZWZfdGFibGUpIDwtIE5VTEwgICMgUmVtb3ZlIHJvdyBuYW1lcwoKICAjIERpc3BsYXkgYXMgYSBmb3JtYXR0ZWQgdGFibGUKICBwcmludChrYWJsZShjb2VmX3RhYmxlLCBkaWdpdHMgPSAzLCBmb3JtYXQgPSAibWFya2Rvd24iKSkKfQpgYGAKCgoKCg==