Data are organized in two big time points: 2012 and 2017. They are collected from the clinics, and with many explainatory variables.

More women are in the population

Scale for 'x' is already present. Adding another scale for 'x', which will replace the existing scale.

Drug popularity

Some drugs are more popular in 2017, some are in 2012. Interesting to see people take different drugs across 5 years, some gain popularity could due to the prices. Apparently there are a huge different between reported drug usage and acutual, probably due to embarrassing. And reported drug tend to be less leathal.

NAs introduced by coercion

BMI distributiion between M vs. F. between years.

Scale for 'x' is already present. Adding another scale for 'x', which will replace the existing scale.

Death Vs. days stay in hostpital

The long ger you stay, the more chance you will be dead (not causal!!!). Age, gender and year didn’t show significant, so it suggests there could be correlation between the length of staying and death, which makes sense, stay longer could due to more leathal injury.

[1] "Linear Model"

Call:
lm(formula = Death ~ ., data = days_admit_table)

Residuals:
          Min            1Q        Median            3Q           Max 
-0.3007684151 -0.2034820342 -0.1630665482 -0.0908523098  0.9451737841 

Coefficients:
                     Estimate      Std. Error  t value  Pr(>|t|)   
(Intercept)   -16.28717787693  17.03732279629 -0.95597 0.3398110   
Year            0.00816361366   0.00846111330  0.96484 0.3353562   
GenderMale     -0.04513807811   0.04602496076 -0.98073 0.3274689   
Age             0.00205438844   0.00157650561  1.30313 0.1934709   
Days_admitted  -0.00289942642   0.00104439528 -2.77618 0.0058251 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.374348056 on 319 degrees of freedom
Multiple R-squared:  0.0349183969,  Adjusted R-squared:  0.0228170602 
F-statistic: 2.88549916 on 4 and 319 DF,  p-value: 0.0226722786

[1] "Logit Model"

Call:
glm(formula = Death ~ ., family = binomial(link = "logit"), data = days_admit_table)

Deviance Residuals: 
         Min            1Q        Median            3Q           Max  
-0.975320831  -0.682316937  -0.566830256  -0.263549189   2.815453124  

Coefficients:
                     Estimate      Std. Error  z value  Pr(>|z|)   
(Intercept)   -119.8911284794  124.1103588483 -0.96600 0.3340421   
Year             0.0588082230    0.0616253714  0.95429 0.3399389   
GenderMale      -0.4328864896    0.3278110104 -1.32054 0.1866559   
Age              0.0152640507    0.0111389497  1.37033 0.1705835   
Days_admitted   -0.0532811397    0.0185267176 -2.87591 0.0040287 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 298.3133873  on 323  degrees of freedom
Residual deviance: 280.6577174  on 319  degrees of freedom
AIC: 290.6577174

Number of Fisher Scoring iterations: 6

Length of stay Versus Consult reason

  1. Length of stay Vs (x) 1,2,3,4,5 Nominal

THe fallowing show there’s significant between reasons.

Analysis of Variance Table

Response: Days_admitted
                Df      Sum Sq     Mean Sq F value   Pr(>F)  
consult_reason   4   4934.6731 1233.668276 3.17792 0.013973 *
Residuals      319 123835.5831  388.199320                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

The following “Difference in mean levels of consult_reason” is multiple comparison, so between 3 and 1 there’s huge difference, 3 and 2 there’s OK difference. The rest just to hard to tell. So basically the interval cover 0, is not significant different between two reasons. For sure there’s no differece between 2 and 1

Will taking different drug affect death? Some does leath!

NAs introduced by coercion
[1] "Logit Model"

Call:
glm(formula = Death ~ ., family = binomial(link = "logit"), data = drug_detected_tbl)

Deviance Residuals: 
         Min            1Q        Median            3Q           Max  
-1.208921015  -0.635450169  -0.565193813  -0.163354392   2.987922462  

Coefficients:
                                                                 Estimate      Std. Error  z value  Pr(>|z|)    
(Intercept)                                                 -1.4973432764    0.2492951913 -6.00631 1.898e-09 ***
Amphetamines1                                              -17.3705093340 1339.0479485840 -0.01297  0.989650    
Barbiturates1                                               -0.2250443412    1.1336034827 -0.19852  0.842637    
Benzodiazepines.oxazepam..tenazepam..lorazepam..diazepam1    0.3007977735    0.3742515051  0.80373  0.421552    
X9.Carboxy.THC1                                             -0.2560533053    0.3388455599 -0.75566  0.449851    
Cocaine.Benzoylecgonine1                                    -0.7972412124    0.6751247640 -1.18088  0.237650    
Methadone1                                                   0.3941721523    0.6629573351  0.59457  0.552133    
Opiates.Opioids1                                             0.3212416071    0.4753632609  0.67578  0.499180    
Oxycodone1                                                  -1.2575653461    0.7899301891 -1.59200  0.111386    
methamphetamine1                                            18.1002730663 1339.0479910448  0.01352  0.989215    
MDMA1                                                        0.8628675035 4176.6508933671  0.00021  0.999835    
codine1                                                      3.0225964420    1.2563799990  2.40580  0.016137 *  
Hydrocodone1                                                -0.7630088564    1.0159433768 -0.75103  0.452632    
Hydromorphone1                                              -0.0625524485    0.6171946895 -0.10135  0.919273    
morphine1                                                   -2.0007804323    0.8605861411 -2.32490  0.020077 *  
oxymorphone1                                                 0.8020964264    0.9227174512  0.86928  0.384696    
Heroin1                                                      0.1268939147    1.0828987040  0.11718  0.906718    
Fentanyl1                                                   -2.4154149715    1.2199735055 -1.97989  0.047716 *  
Norfentanyl1                                                 2.9200309066    1.2051191807  2.42302  0.015392 *  
Ketamine1                                                  -16.3721588368 3956.1804049720 -0.00414  0.996698    
trazodone1                                                 -16.6438177961 3956.1804007808 -0.00421  0.996643    
dextromethorphan1                                            1.2113782261    1.5553826796  0.77883  0.436080    
norbuprenorphine.buprenorphine1                             -1.6314827912    1.0831083585 -1.50630  0.131991    
Gabapentin.neurontin1                                      -14.4039972947 3956.1806134133 -0.00364  0.997095    
Other1                                                       0.2976352880    0.8136896245  0.36578  0.714526    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 298.3133873  on 323  degrees of freedom
Residual deviance: 262.9125929  on 299  degrees of freedom
AIC: 312.9125929

Number of Fisher Scoring iterations: 16

Will drug and Alcohol affect death? probably not. However, the above results show some drugs more leathal, some are not, so there might be interaction amoung drugs, so we might need to investigate, because I didn’t apply every single drug, I only used the “drug_only” variable.

the condition has length > 1 and only the first element will be used
[1] "Logit Model for Drug and Alcohol"

Call:
glm(formula = Death ~ ., data = drug_alco)

Deviance Residuals: 
         Min            1Q        Median            3Q           Max  
-0.198979592  -0.198979592  -0.145454546  -0.123287671   0.876712329  

Coefficients:
                  Estimate   Std. Error t value  Pr(>|t|)   
(Intercept)   0.1232876712 0.0442901453 2.78364 0.0056939 **
only_drug1    0.0756919206 0.0518865995 1.45880 0.1455993   
only_alcohol1 0.0221668742 0.0675663946 0.32808 0.7430685   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 0.143198038983)

    Null deviance: 46.32098765  on 323  degrees of freedom
Residual deviance: 45.96657051  on 321  degrees of freedom
AIC: 294.7555374

Number of Fisher Scoring iterations: 2

Infection

Drugs vs infection, what drugs?

BUT!! Change to the other infection Drug affect infection.

[1] "Infection vs Drugs"

Call:
lm(formula = Infection ~ ., data = drug_infection)

Residuals:
         Min           1Q       Median           3Q          Max 
-0.158163265 -0.158163265 -0.158163265  0.000000000  0.972602740 

Coefficients:
                   Estimate    Std. Error  t value  Pr(>|t|)   
(Intercept)    0.0273972603  0.0345932737  0.79198 0.4289559   
only_drug1     0.1307660050  0.0405265625  3.22667 0.0013816 **
only_alcohol1 -0.0273972603  0.0527734277 -0.51915 0.6040147   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.29556506 on 321 degrees of freedom
Multiple R-squared:  0.053873296,   Adjusted R-squared:  0.0479784256 
F-statistic: 9.13901275 on 2 and 321 DF,  p-value: 0.000137994799

Death vs Infection, Fracture (The model will have overlapping between the two populations. This means they will be somewhat collinear. You will make a ven-diagram type plot for these two. This will allow us to look at the percentage of each population, you can do this: total/death, infected/death, and fracture(the six values)/death)

[1] "Death vs. infection"

Call:
glm(formula = Death ~ ., family = binomial(link = "logit"), data = death_infect)

Deviance Residuals: 
         Min            1Q        Median            3Q           Max  
-0.627470661  -0.627470661  -0.627470661  -0.508353679   2.054367640  

Coefficients:
                Estimate   Std. Error  z value Pr(>|z|)    
(Intercept) -1.525219833  0.153019177 -9.96751  < 2e-16 ***
Infection1  -0.455781635  0.554881801 -0.82140  0.41142    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 298.3133873  on 323  degrees of freedom
Residual deviance: 297.5712030  on 322  degrees of freedom
AIC: 301.571203

Number of Fisher Scoring iterations: 4

Death vs Fracture not working

Variable names: “Spine.Fracture.and.Skull.fracture”, “Spine.fracture.and.skull.bleeding”, “Spine.fracture..skull.fracture..and.skull.bleed”.

The first and second are all 0s. Model doesn’t make sense.

[1] "Death vs. Fracture"

Call:
glm(formula = Death ~ ., family = binomial(link = "logit"), data = death_fracture, 
    na.action = na.omit)

Deviance Residuals: 
        Min           1Q       Median           3Q          Max  
-0.61815085  -0.61815085  -0.61815085  -0.61815085   1.87040095  

Coefficients: (2 not defined because of singularities)
                                                      Estimate     Std. Error   z value Pr(>|z|)    
(Intercept)                                       -1.558144618    0.147025649 -10.59777  < 2e-16 ***
Spine.Fracture.and.Skull.fracture                           NA             NA        NA       NA    
Spine.fracture.and.skull.bleeding                -14.007923631 1029.121475000  -0.01361  0.98914    
Spine.fracture..skull.fracture..and.skull.bleed             NA             NA        NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 298.3133873  on 323  degrees of freedom
Residual deviance: 297.5517704  on 322  degrees of freedom
AIC: 301.5517704

Number of Fisher Scoring iterations: 14

Fractures vs Death:

INFECTION (Brain and/or Spine) Check on these variables. If they have less than the power you need, just throw them out! Spine Fracture Only Skull Fracture Only Skull Bleeding Only Spine Fracture and Skull fracture Spine fracture and skull bleeding Skull Fracture and skull bleeding

Spine fracture, skull fracture, and skull bleed

What I want to know is: How many (%) people with infection die, how many people (%) with fractures or bleeds die, and how those things stack up against each other.

Here the NA shows that category is all 0.

[1] "Death vs. Fracture"

Call:
glm(formula = Death ~ ., family = binomial(link = "logit"), data = fracture_dat, 
    na.action = na.omit)

Deviance Residuals: 
          Min             1Q         Median             3Q            Max  
-0.7408601025  -0.6980287711  -0.6038568651  -0.0001315057   1.8930184728  

Coefficients: (3 not defined because of singularities)
                                                      Estimate     Std. Error  z value  Pr(>|z|)    
(Intercept)                                       -1.609437912    0.223606798 -7.19763 6.127e-13 ***
Brain.Bleed                                        0.321583624    0.457692865  0.70262   0.48229    
Spine.Fracture.Only                              -16.956630597 1331.428048160 -0.01274   0.98984    
Skull.Fracture.Only                              -16.956630597 1581.972246138 -0.01072   0.99145    
Skull.Bleeding.Only                                0.135174778    0.462933386  0.29200   0.77029    
Spine.Fracture.and.Skull.fracture                           NA             NA       NA        NA    
Spine.fracture.and.skull.bleeding                -17.278214222 4612.202004318 -0.00375   0.99701    
Skull.Fracture.and.skull.bleeding                           NA             NA       NA        NA    
Spine.fracture..skull.fracture..and.skull.bleed             NA             NA       NA        NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 298.3133873  on 323  degrees of freedom
Residual deviance: 278.6113172  on 318  degrees of freedom
AIC: 290.6113172

Number of Fisher Scoring iterations: 17

Counting:

If a patient can give history, then death is looming, but doesn’t mean he will be infected easily.

Death vs. Given History


Call:
glm(formula = Death ~ Given_Hist, family = binomial(link = "logit"), 
    data = death_hist)

Deviance Residuals: 
         Min            1Q        Median            3Q           Max  
-0.864926485  -0.864926485  -0.368300411  -0.368300411   2.334343378  

Coefficients:
                Estimate   Std. Error  z value   Pr(>|z|)    
(Intercept) -2.656756907  0.298631194 -8.89645 < 2.22e-16 ***
Given_Hist2  1.866235562  0.349595682  5.33827 9.3839e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 298.3133873  on 323  degrees of freedom
Residual deviance: 263.6329075  on 322  degrees of freedom
AIC: 267.6329075

Number of Fisher Scoring iterations: 5

Infection vs. Given History Yes the longer you stay you tend to get infected


Call:
glm(formula = Infection ~ Given_Hist, family = binomial(link = "logit"), 
    data = death_hist)

Deviance Residuals: 
         Min            1Q        Median            3Q           Max  
-0.620010187  -0.620010187  -0.119310250  -0.119310250   3.146032380  

Coefficients:
                Estimate   Std. Error  z value   Pr(>|z|)    
(Intercept) -1.551543934  0.194608624 -7.97264 1.5532e-15 ***
Given_Hist2 -3.390098467  1.022158080 -3.31661 0.00091117 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 213.2781577  on 323  degrees of freedom
Residual deviance: 181.5367342  on 322  degrees of freedom
AIC: 185.5367342

Number of Fisher Scoring iterations: 7

Days of admission vs. Infection

The longer you stay, the more chance you could get infected, here shows the correlation, whcih is very significant!!!


Call:
glm(formula = Infection ~ Days_admitted, family = binomial(link = "logit"), 
    data = days_admit_vs_infection_table)

Deviance Residuals: 
         Min            1Q        Median            3Q           Max  
-2.175532488  -0.428515275  -0.397595075  -0.381722277   2.312434633  

Coefficients:
                    Estimate     Std. Error   z value   Pr(>|z|)    
(Intercept)   -2.62822661614  0.24066528508 -10.92067 < 2.22e-16 ***
Days_admitted  0.02604356272  0.00741333491   3.51307 0.00044296 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 213.2781577  on 323  degrees of freedom
Residual deviance: 199.7581270  on 322  degrees of freedom
AIC: 203.758127

Number of Fisher Scoring iterations: 5

Drugs vs Infection


Call:
glm(formula = death_infect.Infection ~ ., family = binomial(link = "logit"), 
    data = drug_detected_vs_Infection_tbl)

Deviance Residuals: 
          Min             1Q         Median             3Q            Max  
-1.3918138582  -0.5031080366  -0.2945449506  -0.0498081816   2.7682742814  

Coefficients:
                                                                Estimate     Std. Error  z value   Pr(>|z|)    
(Intercept)                                                 -2.003101160    0.313149229 -6.39663 1.5884e-10 ***
Amphetamines1                                               -1.473333763    2.293630546 -0.64236 0.52064024    
Barbiturates1                                              -15.126621917 1897.791071010 -0.00797 0.99364041    
Benzodiazepines.oxazepam..tenazepam..lorazepam..diazepam1   -2.192354002    0.815805171 -2.68735 0.00720214 ** 
X9.Carboxy.THC1                                             -0.997642802    0.553448506 -1.80259 0.07145204 .  
Cocaine.Benzoylecgonine1                                     0.544146668    0.656865929  0.82840 0.40744493    
Methadone1                                                   1.919809146    0.997169516  1.92526 0.05419702 .  
Opiates.Opioids1                                            -4.408092286    1.530219602 -2.88069 0.00396802 ** 
Oxycodone1                                                   3.764431530    1.037302935  3.62906 0.00028446 ***
methamphetamine1                                             2.166478575    2.267246364  0.95555 0.33929711    
MDMA1                                                      -13.819445930 6522.639111036 -0.00212 0.99830953    
codine1                                                    -15.618263240 2190.820319448 -0.00713 0.99431196    
Hydrocodone1                                                -1.393475306    1.273632894 -1.09409 0.27391334    
Hydromorphone1                                               1.506385165    0.884054574  1.70395 0.08839035 .  
morphine1                                                   -1.844818213    0.936341936 -1.97024 0.04881089 *  
oxymorphone1                                                -3.572404321    1.367790332 -2.61181 0.00900651 ** 
Heroin1                                                      1.246424875    1.380802094  0.90268 0.36669482    
Fentanyl1                                                    0.263292605    1.205897582  0.21834 0.82716620    
Norfentanyl1                                                -0.610534234    1.221428532 -0.49985 0.61717887    
Ketamine1                                                   26.660873598 6522.638885991  0.00409 0.99673871    
trazodone1                                                 -15.255785370 6522.638751213 -0.00234 0.99813383    
dextromethorphan1                                            1.622038533    1.699241944  0.95457 0.33979723    
norbuprenorphine.buprenorphine1                              2.258498955    0.744987753  3.03159 0.00243268 ** 
Gabapentin.neurontin1                                       19.011001211 6522.638744598  0.00291 0.99767447    
Other1                                                      -0.123046768    1.456922311 -0.08446 0.93269337    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 213.2781577  on 323  degrees of freedom
Residual deviance: 153.1785245  on 299  degrees of freedom
AIC: 203.1785245

Number of Fisher Scoring iterations: 17
LS0tCnRpdGxlOiAiQW5hbHlzaXMgTWFyY2ggMywgMjAxOSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKRGF0YSBhcmUgb3JnYW5pemVkIGluIHR3byBiaWcgdGltZSBwb2ludHM6IDIwMTIgYW5kIDIwMTcuIFRoZXkgYXJlIGNvbGxlY3RlZCBmcm9tIHRoZSBjbGluaWNzLCBhbmQgd2l0aCBtYW55IGV4cGxhaW5hdG9yeSB2YXJpYWJsZXMuIAoKYGBge3IsIGVjaG89RkFMU0V9CmxpYnJhcnkocmVhZHhsKQpJVkRBIDwtIHJlYWRfZXhjZWwoIklWREEgU1RVRFkvSVZEQS54bHN4IikKCmNvbHVtX2Rlc2MgPC0gZGF0YS5mcmFtZSh1bmxpc3QoY29sbmFtZXMoSVZEQSkpLCB1bmxpc3QoSVZEQVsxLF0sIHVzZS5uYW1lcyA9IEZBTFNFKSkKY29sbmFtZXMoY29sdW1fZGVzYykgPC0gYygiVmFyaWFibGUiLCAiRGVzY3JpcHRpb24iKQoKZGF0IDwtIElWREFbLTEsXQoKZGF0JGAwYCA8LSBmYWN0b3IoZGF0JGAwYCkKaGVhZChkYXQpCgpzdHIoZGF0KQp5ZWFyX2NvbCA8LSBkYXQkYDBgCgp0ZW1wIDwtIGNvbG5hbWVzKGRhdCkKCmRhdF9yZW1vdmFsIDwtIGRhdAojY29sbmFtZXMoZGF0X3JlbW92YWwpCmRhdF9yZW1vdmFsCmBgYAoKIyMjIE1vcmUgd29tZW4gYXJlIGluIHRoZSBwb3B1bGF0aW9uCmBgYHtyIGdlbmRlciwgZWNobz1GQUxTRX0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KHBseXIpCgpkYXRfcmVtb3ZhbCRhZ2UgPSBhcy5udW1lcmljKGRhdF9yZW1vdmFsJGFnZSkKZGF0X3JlbW92YWwkc2V4W2RhdF9yZW1vdmFsJHNleD09IjEiXSA8LSAiTWFsZSIgCmRhdF9yZW1vdmFsJHNleFtkYXRfcmVtb3ZhbCRzZXg9PSIwIl0gPC0gIkZlbWFsZSIKZGF0X3JlbW92YWwkYDBgW2RhdF9yZW1vdmFsJGAwYD09MTJdIDwtIDIwMTIKZGF0X3JlbW92YWwkYDBgW2RhdF9yZW1vdmFsJGAwYD09MTddIDwtIDIwMTcKCmdlbmRlcl90YWJsZSA9IGRhdGEuZnJhbWUoWWVhcj0gZmFjdG9yKGRhdF9yZW1vdmFsJGAwYCksIEdlbmRlciA9IGRhdF9yZW1vdmFsJHNleCwgQWdlID0gZGF0X3JlbW92YWwkYWdlKQoKZ2dwbG90KGRhdGEgPSBnZW5kZXJfdGFibGUsIGFlcyh4ID0gQWdlLCBmaWxsID0gR2VuZGVyKSkgKwogICAgICAgICMgZ2VvbV9iYXIoZGF0YT1zdWJzZXQoZ2VuZGVyX3RhYmxlLEdlbmRlcj09IkZlbWFsZSIpKSArIAogICAgICAgICMgZ2VvbV9iYXIoZGF0YT1zdWJzZXQoZ2VuZGVyX3RhYmxlLEdlbmRlcj09Ik1hbGUiKSxhZXMoeT0uLmNvdW50Li4qKC0xKSkpICsgCiAgICAgICAgZ2VvbV9oaXN0b2dyYW0oZGF0YT1zdWJzZXQoZ2VuZGVyX3RhYmxlLEdlbmRlcj09Ik1hbGUiKSwgYnJlYWtzPXNlcSgxMCwgODUsIGJ5PTEwKSwgY29sPSJibGFjayIpICsgCiAgICAgICAgZ2VvbV9oaXN0b2dyYW0oZGF0YT1zdWJzZXQoZ2VuZGVyX3RhYmxlLEdlbmRlcj09IkZlbWFsZSIpLCBicmVha3M9c2VxKDEwLCA4NSwgYnk9MTApLCBjb2w9ImJsYWNrIiwgYWVzKHk9Li5jb3VudC4uKigtMSkpKSArIAogICAgICAgIHNjYWxlX3hfZGlzY3JldGUoKSArCiAgICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTApICsKICAgICAgICB4bGFiKCJBZ2UiKSArIHlsYWIoIkNvdW50IikgKwogICAgICAgIGNvb3JkX2ZsaXAoKSArCiAgICAgICAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkgKwogICAgICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3M9c2VxKC05MCw5MCw1KSxsYWJlbHM9YWJzKHNlcSgtOTAsOTAsNSkpKSArIAogICAgICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKC05MCw5MCwxMCksbGFiZWxzPWFicyhzZXEoLTkwLDkwLDEwKSkpICsKICAgICAgICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJEYXJrMiIpICsKICAgICAgICBmYWNldF93cmFwKH5ZZWFyKQoKYGBgCgojIyMgRHJ1ZyBwb3B1bGFyaXR5ClNvbWUgZHJ1Z3MgYXJlIG1vcmUgcG9wdWxhciBpbiAyMDE3LCBzb21lIGFyZSBpbiAyMDEyLiBJbnRlcmVzdGluZyB0byBzZWUgcGVvcGxlIHRha2UgZGlmZmVyZW50IGRydWdzIGFjcm9zcyA1IHllYXJzLCBzb21lIGdhaW4gcG9wdWxhcml0eSBjb3VsZCBkdWUgdG8gdGhlIHByaWNlcy4gQXBwYXJlbnRseSB0aGVyZSBhcmUgYSBodWdlIGRpZmZlcmVudCBiZXR3ZWVuIHJlcG9ydGVkIGRydWcgdXNhZ2UgYW5kIGFjdXR1YWwsIHByb2JhYmx5IGR1ZSB0byBlbWJhcnJhc3NpbmcuIEFuZCByZXBvcnRlZCBkcnVnIHRlbmQgdG8gYmUgbGVzcyBsZWF0aGFsLgoKYGBge3IgZWNobz1GQUxTRX0KbGlicmFyeSh0aWR5cikKIyAiZHJ1Z3NfYWJ1c2VkIgpkcnVnc19yZXBvcnRlZCA8LSBzYXBwbHkoY29sdW1fZGVzYyREZXNjcmlwdGlvblt3aGljaChncmVwbCgiZHJ1Z3NfYWJ1c2VkIiwgY29sdW1fZGVzYyRWYXJpYWJsZSkpXSwgZnVuY3Rpb24oeCkgewogICAgICAgIGEgPSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksIHNwbGl0ID0gIj0iKVtbMV1dWzJdCiAgICAgICAgYSA9IGdzdWIoIlxcKXxcXCgiLCAiIiwgYSkKICAgICAgICByZXR1cm4oYSkKfSkKCmRydWdzX2RldGVjdGVkPC0gc2FwcGx5KGNvbHVtX2Rlc2MkRGVzY3JpcHRpb25bd2hpY2goZ3JlcGwoImRvYV91cmluZSIsIGNvbHVtX2Rlc2MkVmFyaWFibGUpKV0sIGZ1bmN0aW9uKHgpIHsKICAgICAgICBhID0gc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCBzcGxpdCA9ICI9IilbWzFdXVsyXQogICAgICAgIGEgPSBnc3ViKCJcXCl8XFwoIiwgIiIsIGEpCiAgICAgICAgcmV0dXJuKGEpCn0pCiMgUmVwZXRlZCAyMSBhbmQgMjIgZm9yIEZlbnRhbnlsCiNkYXRbLGMoNjMsNjQpXQojSVZEQVssYyg2Myw2NCldCmBgYAoKCgpgYGB7ciBlY2hvPUZBTFNFfQojIHJlbW92ZSBjb2x1bW4gImZlbnRhbnlsIiAKZGF0X3JlbW92ZV9mZW50YW55bCAgPC0gZGF0X3JlbW92YWxbLC02NF0KZHJ1Z3NfZGV0ZWN0ZWQgPC0gZHJ1Z3NfZGV0ZWN0ZWRbLTIyXQoKCmRydWdfcmVwb3J0ZWRfdGJsIDwtIGRhdF9yZW1vdmVfZmVudGFueWxbLGdyZXBsKCJkcnVnc19hYnVzZWQiLCBjb2xuYW1lcyhkYXRfcmVtb3ZlX2ZlbnRhbnlsKSldCmRydWdfZGV0ZWN0ZWRfdGJsIDwtIGRhdF9yZW1vdmVfZmVudGFueWxbLGdyZXBsKCJkb2FfdXJpbmUiLCBjb2xuYW1lcyhkYXRfcmVtb3ZlX2ZlbnRhbnlsKSldCgoKY29sbmFtZXMoZHJ1Z19yZXBvcnRlZF90YmwpID0gZHJ1Z3NfcmVwb3J0ZWQKY29sbmFtZXMoZHJ1Z19kZXRlY3RlZF90YmwpID0gZHJ1Z3NfZGV0ZWN0ZWQKCmRydWdfcmVwb3J0ZWRfY29sIDwtIGFwcGx5KGRydWdfcmVwb3J0ZWRfdGJsLCAyLCBhcy5udW1lcmljKQpkcnVnX3JlcG9ydGVkX3RibCA8LSBkYXRhLmZyYW1lKFllYXI9ZGF0X3JlbW92ZV9mZW50YW55bCRgMGAsIEdlbmRlciA9IGRhdF9yZW1vdmFsJHNleCwgQWdlID0gZGF0X3JlbW92YWwkYWdlLCBkcnVnX3JlcG9ydGVkX2NvbCkKCmRydWdfcmVwb3J0ZWRfc3VtXzIwMTIgPC1hcHBseShkcnVnX3JlcG9ydGVkX2NvbFt3aGljaChkcnVnX3JlcG9ydGVkX3RibCRZZWFyPT0yMDEyKSxdLCAyLCBzdW0pCmRydWdfcmVwb3J0ZWRfc3VtXzIwMTIgPC0gZGF0YS5mcmFtZShOYW1lID0gbmFtZXMoZHJ1Z19yZXBvcnRlZF9zdW1fMjAxMiksIENvdW50PWFzLm51bWVyaWMoZHJ1Z19yZXBvcnRlZF9zdW1fMjAxMiksIFllYXI9IjIwMTIiKQpkcnVnX3JlcG9ydGVkX3N1bV8yMDEyIDwtIG5hLm9taXQoZHJ1Z19yZXBvcnRlZF9zdW1fMjAxMikKCmRydWdfcmVwb3J0ZWRfc3VtXzIwMTcgPC1hcHBseShkcnVnX3JlcG9ydGVkX2NvbFt3aGljaChkcnVnX3JlcG9ydGVkX3RibCRZZWFyPT0yMDE3KSxdLCAyLCBzdW0pCmRydWdfcmVwb3J0ZWRfc3VtXzIwMTcgPC0gZGF0YS5mcmFtZShOYW1lID0gbmFtZXMoZHJ1Z19yZXBvcnRlZF9zdW1fMjAxNyksIENvdW50PWFzLm51bWVyaWMoZHJ1Z19yZXBvcnRlZF9zdW1fMjAxNyksIFllYXI9IjIwMTciKQpkcnVnX3JlcG9ydGVkX3N1bV8yMDE3IDwtIG5hLm9taXQoZHJ1Z19yZXBvcnRlZF9zdW1fMjAxNykKCmRydWdfcmVwb3J0ZWRfc3VtIDwtIHJiaW5kKGRydWdfcmVwb3J0ZWRfc3VtXzIwMTIsIGRydWdfcmVwb3J0ZWRfc3VtXzIwMTcpCmBgYAoKYGBge3IgZWNobz1GQUxTRX0KZHJ1Z19kZXRlY3RlZF9jb2wgPC0gYXBwbHkoZHJ1Z19kZXRlY3RlZF90YmwsIDIsIGFzLm51bWVyaWMpCmRydWdfZGV0ZWN0ZWRfdGJsIDwtIGRhdGEuZnJhbWUoWWVhcj1kYXRfcmVtb3ZlX2ZlbnRhbnlsJGAwYCwgR2VuZGVyID0gZGF0X3JlbW92YWwkc2V4LCBBZ2UgPSBkYXRfcmVtb3ZhbCRhZ2UsIGRydWdfZGV0ZWN0ZWRfY29sKQoKIyBkcnVnX2RldGVjdGVkX3N1bSA8LSBkYXRhLmZyYW1lKFllYXI9ZGF0JGAwYCwgZHJ1Z19kZXRlY3RlZF9jb2wpCmRydWdfZGV0ZWN0ZWRfc3VtXzIwMTIgPC1hcHBseShkcnVnX2RldGVjdGVkX2NvbFt3aGljaChkcnVnX3JlcG9ydGVkX3RibCRZZWFyPT0yMDEyKSxdLCAyLCBzdW0pCmRydWdfZGV0ZWN0ZWRfc3VtXzIwMTIgPC0gZGF0YS5mcmFtZShOYW1lID0gbmFtZXMoZHJ1Z19kZXRlY3RlZF9zdW1fMjAxMiksIENvdW50PWFzLm51bWVyaWMoZHJ1Z19kZXRlY3RlZF9zdW1fMjAxMiksIFllYXI9IjIwMTIiKQpkcnVnX2RldGVjdGVkX3N1bV8yMDEyIDwtIG5hLm9taXQoZHJ1Z19kZXRlY3RlZF9zdW1fMjAxMikKCmRydWdfZGV0ZWN0ZWRfc3VtXzIwMTcgPC1hcHBseShkcnVnX2RldGVjdGVkX2NvbFt3aGljaChkcnVnX3JlcG9ydGVkX3RibCRZZWFyPT0yMDE3KSxdLCAyLCBzdW0pCmRydWdfZGV0ZWN0ZWRfc3VtXzIwMTcgPC0gZGF0YS5mcmFtZShOYW1lID0gbmFtZXMoZHJ1Z19kZXRlY3RlZF9zdW1fMjAxNyksIENvdW50PWFzLm51bWVyaWMoZHJ1Z19kZXRlY3RlZF9zdW1fMjAxNyksIFllYXI9IjIwMTciKQpkcnVnX2RldGVjdGVkX3N1bV8yMDE3IDwtIG5hLm9taXQoZHJ1Z19kZXRlY3RlZF9zdW1fMjAxNykKCmRydWdfZGV0ZWN0ZWRfc3VtIDwtIHJiaW5kKGRydWdfZGV0ZWN0ZWRfc3VtXzIwMTIsIGRydWdfZGV0ZWN0ZWRfc3VtXzIwMTcpCmRydWdfZGV0ZWN0ZWRfc3VtIDwtIGRydWdfZGV0ZWN0ZWRfc3VtWy0xLF0KIyBkcnVnX2RldGVjdGVkX3N1bSA8LSBkYXRhLmZyYW1lKFllYXIgPSBjKCIyMDEyIiwgIjIwMTciKSwgZHJ1Z19kZXRlY3RlZF9zdW0pCgojc3VtKGRydWdfZGV0ZWN0ZWRfc3VtXzIwMTIsIG5hLnJtID0gVCkKCmdncGxvdChkcnVnX2RldGVjdGVkX3N1bSwgYWVzKHggPSBDb3VudCwgeSA9IHJlb3JkZXIoTmFtZSwgQ291bnQpLCBjb2xvdXI9WWVhcikpICsKICBnZW9tX3BvaW50KHNpemU9MykgKyAgIyBVc2UgYSBsYXJnZXIgZG90CiAgdGhlbWVfYncoKSArCiAgICAgICAgZ2d0aXRsZSgiRGV0ZWN0ZWQgU3Vic3RhbmNlIGluIEJsb29kIG9yIFVyaW5lIikgKyAKICB0aGVtZSgKICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleTYwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikKICApCmBgYAoKYGBge3IsIGVjaG89IEZBTFNFfQpnZ3Bsb3QoZHJ1Z19yZXBvcnRlZF9zdW0sIGFlcyh4ID0gQ291bnQsIHkgPSByZW9yZGVyKE5hbWUsIENvdW50KSwgY29sb3VyPVllYXIpKSArCiAgZ2VvbV9wb2ludChzaXplPTMpICsgICMgVXNlIGEgbGFyZ2VyIGRvdAogIHRoZW1lX2J3KCkgKwogICAgICAgIGdndGl0bGUoIlN1YnN0YW5jZSBpbiBSZXBvcnRzIikgKyAKICB0aGVtZSgKICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleTYwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikKICApCgoKYGBgCiMjIyBCTUkgZGlzdHJpYnV0aWlvbiBiZXR3ZWVuIE0gdnMuIEYuIGJldHdlZW4geWVhcnMuIApgYGB7ciBCTUksIGVjaG89RkFMU0V9CiMgZGF0X3JlbW92YWwkYWdlID0gYXMubnVtZXJpYyhkYXRfcmVtb3ZhbCRhZ2UpCiMgZGF0X3JlbW92YWwkc2V4W2RhdF9yZW1vdmFsJHNleD09IjEiXSA8LSAiTWFsZSIgCiMgZGF0X3JlbW92YWwkc2V4W2RhdF9yZW1vdmFsJHNleD09IjAiXSA8LSAiRmVtYWxlIgojIGRhdF9yZW1vdmFsJGAwYFtkYXRfcmVtb3ZhbCRgMGA9PTEyXSA8LSAyMDEyCiMgZGF0X3JlbW92YWwkYDBgW2RhdF9yZW1vdmFsJGAwYD09MTddIDwtIDIwMTcKCmJtaV90YWJsZSA9IGRhdGEuZnJhbWUoWWVhcj0gZGF0X3JlbW92YWwkYDBgLCBHZW5kZXIgPSBkYXRfcmVtb3ZhbCRzZXgsIEJNSSA9IGFzLm51bWVyaWMoZGF0X3JlbW92YWwkYm1pKSwgQWdlID0gZGF0X3JlbW92YWwkYWdlKQpibWlfdGFibGUgPC0gYm1pX3RhYmxlWy13aGljaChibWlfdGFibGUkQk1JPT0wKSxdCm9wdGlvbnMoZGlnaXRzID0gMTIpCgojIGdncGxvdChkYXRhID0gYm1pX3RhYmxlLCBhZXMoeCA9IEJNSSwgZmlsbCA9IEdlbmRlcikpICsKIyAgICAgICAgIGdlb21faGlzdG9ncmFtKGRhdGE9c3Vic2V0KGJtaV90YWJsZSxHZW5kZXI9PSJGZW1hbGUiKSwgY29sPSJibGFjayIpICsgCiMgICAgICAgICBnZW9tX2hpc3RvZ3JhbShkYXRhPXN1YnNldChibWlfdGFibGUsR2VuZGVyPT0iTWFsZSIpLCBjb2w9ImJsYWNrIiwgYWVzKHk9Li5jb3VudC4uKigtMSkpKSArIAojICAgICAgICAgc2NhbGVfeF9kaXNjcmV0ZSgpICsKIyAgICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdD0wKSArCiMgICAgICAgICB4bGFiKCJCTUkiKSArIHlsYWIoIkNvdW50IikgKwojICAgICAgICAgY29vcmRfZmxpcCgpICsKIyAgICAgICAgIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCkpICsKIyAgICAgICAgIHNjYWxlX3lfY29udGludW91cyhicmVha3M9c2VxKC05MCw5MCw1KSxsYWJlbHM9YWJzKHNlcSgtOTAsOTAsNSkpKSArIAojICAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoLTkwLDkwLDEwKSxsYWJlbHM9YWJzKHNlcSgtOTAsOTAsMTApKSkgKwojICAgICAgICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iRGFyazIiKSArCiMgICAgICAgICBmYWNldF93cmFwKH5ZZWFyKQoKCgoKZ2VuZGVyX3RhYmxlID0gZGF0YS5mcmFtZShZZWFyPSBmYWN0b3IoZGF0X3JlbW92YWwkYDBgKSwgR2VuZGVyID0gZGF0X3JlbW92YWwkc2V4LCBBZ2UgPSBkYXRfcmVtb3ZhbCRhZ2UpCgpnZ3Bsb3QoZGF0YSA9IGdlbmRlcl90YWJsZSwgYWVzKHggPSBBZ2UsIGZpbGwgPSBHZW5kZXIpKSArCiAgICAgICAgIyBnZW9tX2JhcihkYXRhPXN1YnNldChnZW5kZXJfdGFibGUsR2VuZGVyPT0iRmVtYWxlIikpICsgCiAgICAgICAgIyBnZW9tX2JhcihkYXRhPXN1YnNldChnZW5kZXJfdGFibGUsR2VuZGVyPT0iTWFsZSIpLGFlcyh5PS4uY291bnQuLiooLTEpKSkgKyAKICAgICAgICBnZW9tX2hpc3RvZ3JhbShkYXRhPXN1YnNldChnZW5kZXJfdGFibGUsR2VuZGVyPT0iTWFsZSIpLCBicmVha3M9c2VxKDEwLCA4NSwgYnk9MTApLCBjb2w9ImJsYWNrIikgKyAKICAgICAgICBnZW9tX2hpc3RvZ3JhbShkYXRhPXN1YnNldChnZW5kZXJfdGFibGUsR2VuZGVyPT0iRmVtYWxlIiksIGJyZWFrcz1zZXEoMTAsIDg1LCBieT0xMCksIGNvbD0iYmxhY2siLCBhZXMoeT0uLmNvdW50Li4qKC0xKSkpICsgCiAgICAgICAgc2NhbGVfeF9kaXNjcmV0ZSgpICsKICAgICAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCkgKwogICAgICAgIHhsYWIoIkFnZSIpICsgeWxhYigiQ291bnQiKSArCiAgICAgICAgY29vcmRfZmxpcCgpICsKICAgICAgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApKSArCiAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1zZXEoLTkwLDkwLDUpLGxhYmVscz1hYnMoc2VxKC05MCw5MCw1KSkpICsgCiAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoLTkwLDkwLDEwKSxsYWJlbHM9YWJzKHNlcSgtOTAsOTAsMTApKSkgKwogICAgICAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IkRhcmsyIikgKwogICAgICAgIGZhY2V0X3dyYXAoflllYXIpCgoKCmBgYAojIyMgRGVhdGggVnMuIGRheXMgc3RheSBpbiBob3N0cGl0YWwKVGhlIGxvbmcgZ2VyIHlvdSBzdGF5LCB0aGUgbW9yZSBjaGFuY2UgeW91IHdpbGwgYmUgZGVhZCAobm90IGNhdXNhbCEhISkuCkFnZSwgZ2VuZGVyIGFuZCB5ZWFyIGRpZG4ndCBzaG93IHNpZ25pZmljYW50LCBzbyBpdCBzdWdnZXN0cyB0aGVyZSBjb3VsZCBiZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBsZW5ndGggb2Ygc3RheWluZyBhbmQgZGVhdGgsIHdoaWNoIG1ha2VzIHNlbnNlLCBzdGF5IGxvbmdlciBjb3VsZCBkdWUgdG8gbW9yZSBsZWF0aGFsIGluanVyeS4KYGBge3IgZGF5c19hZG1pdCwgZWNobz1GQUxTRX0KIyBkYXRfcmVtb3ZhbCRhZ2UgPSBhcy5udW1lcmljKGRhdF9yZW1vdmFsJGFnZSkKIyBkYXRfcmVtb3ZhbCRzZXhbZGF0X3JlbW92YWwkc2V4PT0iMSJdIDwtICJNYWxlIiAKIyBkYXRfcmVtb3ZhbCRzZXhbZGF0X3JlbW92YWwkc2V4PT0iMCJdIDwtICJGZW1hbGUiCiMgZGF0X3JlbW92YWwkYDBgW2RhdF9yZW1vdmFsJGAwYD09MTJdIDwtIDIwMTIKIyBkYXRfcmVtb3ZhbCRgMGBbZGF0X3JlbW92YWwkYDBgPT0xN10gPC0gMjAxNwpkZWF0aF90YWJsZSA8LSBkYXRfcmVtb3ZhbFssd2hpY2goZ3JlcGwoImRlYXRoIiwgY29sbmFtZXMoZGF0X3JlbW92YWwpKSldWywxOjJdCmRlYXRoX2NvbCA8LSBzYXBwbHkoYygxOm5yb3coZGVhdGhfdGFibGUpKSwgZnVuY3Rpb24oaSl7CiAgICAgICAgaWYoYW55KGFzLm51bWVyaWMoZGVhdGhfdGFibGVbaSxdKT4wKSl7CiAgICAgICAgICAgICAgICByZXR1cm4oMSkKICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgIHJldHVybigwKQogICAgICAgIH0KfSkKCmRheXNfYWRtaXRfdGFibGUgPSBkYXRhLmZyYW1lKFllYXI9IGRhdF9yZW1vdmFsJGAwYCwgR2VuZGVyID0gZGF0X3JlbW92YWwkc2V4LCBBZ2UgPSBhcy5udW1lcmljKGRhdF9yZW1vdmFsJGFnZSksIERheXNfYWRtaXR0ZWQgPSBhcy5udW1lcmljKGRhdF9yZW1vdmFsJGRheXNfYWRtaXQpLCBEZWF0aCA9IGRlYXRoX2NvbCkKCm1vZGVsID0gbG0oRGVhdGh+LiwgZGF0YSA9IGRheXNfYWRtaXRfdGFibGUpCnByaW50KCJMaW5lYXIgTW9kZWwiKQpwcmludChzdW1tYXJ5KG1vZGVsKSkKCgoKbW9kZWwgPSBnbG0oRGVhdGh+LiwgZGF0YSA9IGRheXNfYWRtaXRfdGFibGUsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkKcHJpbnQoIkxvZ2l0IE1vZGVsIikKc3VtbWFyeShtb2RlbCkKYGBgCgoKIyMjIExlbmd0aCBvZiBzdGF5IFZlcnN1cyBDb25zdWx0IHJlYXNvbgooeSkgTGVuZ3RoIG9mIHN0YXkgVnMgKHgpIDEsMiwzLDQsNQpOb21pbmFsCmBgYHtyICwgZWNobz1GQUxTRX0KIyBkYXRfcmVtb3ZhbCRhZ2UgPSBhcy5udW1lcmljKGRhdF9yZW1vdmFsJGFnZSkKIyBkYXRfcmVtb3ZhbCRzZXhbZGF0X3JlbW92YWwkc2V4PT0iMSJdIDwtICJNYWxlIiAKIyBkYXRfcmVtb3ZhbCRzZXhbZGF0X3JlbW92YWwkc2V4PT0iMCJdIDwtICJGZW1hbGUiCiMgZGF0X3JlbW92YWwkYDBgW2RhdF9yZW1vdmFsJGAwYD09MTJdIDwtIDIwMTIKIyBkYXRfcmVtb3ZhbCRgMGBbZGF0X3JlbW92YWwkYDBgPT0xN10gPC0gMjAxNwoKc3RheV92c19jb25zdWx0IDwtIGRhdGEuZnJhbWUoQ29uc3VsdF9SZWFzb24gPSBkYXRfcmVtb3ZhbFssd2hpY2goZ3JlcGwoImNvbnN1bHRfcmVhc29uIiwgY29sbmFtZXMoZGF0X3JlbW92YWwpKSldWywxXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERheXNfYWRtaXR0ZWQgPSBhcy5udW1lcmljKGRhdF9yZW1vdmFsJGRheXNfYWRtaXQpKQoKZ2dwbG90KHN0YXlfdnNfY29uc3VsdCwgYWVzKHk9RGF5c19hZG1pdHRlZCwgeD1jb25zdWx0X3JlYXNvbikpICsgCiAgZ2VvbV9ib3hwbG90KCkgKwogIHN0YXRfc3VtbWFyeShmdW4uZGF0YT1tZWFuX2NsX2Jvb3QsIGdlb209ImVycm9yYmFyIiwgY29sb3VyPSJyZWQiLCB3aWR0aD0wLjEpICsKICBzdGF0X3N1bW1hcnkoZnVuLnk9bWVhbiwgZ2VvbT0icG9pbnQiLCBjb2xvdXI9InJlZCIpCmBgYAoKVEhlIGZhbGxvd2luZyBzaG93IHRoZXJlJ3Mgc2lnbmlmaWNhbnQgYmV0d2VlbiByZWFzb25zLgpgYGB7ciwgZWNobz1GQUxTRX0KbW9kZWwgPSBhb3YoRGF5c19hZG1pdHRlZH4uLCBkYXRhID0gc3RheV92c19jb25zdWx0KQphbm92YShtb2RlbCkKCmBgYAoKCgoKCgoKIyMjIyBUaGUgZm9sbG93aW5nICJEaWZmZXJlbmNlIGluIG1lYW4gbGV2ZWxzIG9mIGNvbnN1bHRfcmVhc29uIiBpcyBtdWx0aXBsZSBjb21wYXJpc29uLCBzbyBiZXR3ZWVuIDMgYW5kIDEgdGhlcmUncyBodWdlIGRpZmZlcmVuY2UsICAzIGFuZCAyIHRoZXJlJ3MgT0sgZGlmZmVyZW5jZS4gVGhlIHJlc3QganVzdCB0byBoYXJkIHRvIHRlbGwuIFNvIGJhc2ljYWxseSB0aGUgaW50ZXJ2YWwgY292ZXIgMCwgaXMgbm90IHNpZ25pZmljYW50IGRpZmZlcmVudCBiZXR3ZWVuIHR3byByZWFzb25zLiBGb3Igc3VyZSB0aGVyZSdzIG5vIGRpZmZlcmVjZSBiZXR3ZWVuIDIgYW5kIDEKYGBge3IsIGVjaG89RkFMU0V9CiMgVFVLRVkgPC0gVHVrZXlIU0QobW9kZWwpCiMgcGxvdChUVUtFWSAsIGxhcz0xICwgY29sPSJicm93biIgKQoKdGt5ID0gYXMuZGF0YS5mcmFtZShUdWtleUhTRChtb2RlbCkkY29uc3VsdF9yZWFzb24pCnRreSRwYWlyID0gcm93bmFtZXModGt5KQoKIyBQbG90IHBhaXJ3aXNlIFR1a2V5SFNEIGNvbXBhcmlzb25zIGFuZCBjb2xvciBieSBzaWduaWZpY2FuY2UgbGV2ZWwKZ2dwbG90KHRreSwgYWVzKGNvbG91cj1jdXQoYHAgYWRqYCwgYygwLCAwLjAxLCAwLjA1LCAxKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPWMoInA8MC4wMSIsInA8MC4wNSIsIk5vbi1TaWciKSkpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGx0eT0iMTEiLCBjb2xvdXI9ImdyZXkzMCIpICsKICBnZW9tX2Vycm9yYmFyKGFlcyhwYWlyLCB5bWluPWx3ciwgeW1heD11cHIpLCB3aWR0aD0wLjIpICsKICBnZW9tX3BvaW50KGFlcyhwYWlyLCBkaWZmKSkgKwogIGxhYnMoY29sb3VyPSIiKQpgYGAKCgojIyMgV2lsbCB0YWtpbmcgZGlmZmVyZW50IGRydWcgYWZmZWN0IGRlYXRoPyBTb21lIGRvZXMgbGVhdGghCgoKYGBge3IsIGVjaG89RkFMU0V9CiMgZGVhdGhfdGFibGUgPC0gZGF0X3JlbW92YWxbLHdoaWNoKGdyZXBsKCJkZWF0aCIsIGNvbG5hbWVzKGRhdF9yZW1vdmFsKSkpXVssMToyXQojIGRlYXRoX2NvbCA8LSBzYXBwbHkoYygxOm5yb3coZGVhdGhfdGFibGUpKSwgZnVuY3Rpb24oaSl7CiMgICAgICAgICBpZihhbnkoYXMubnVtZXJpYyhkZWF0aF90YWJsZVtpLF0pPjApKXsKIyAgICAgICAgICAgICAgICAgcmV0dXJuKDEpCiMgICAgICAgICB9CiMgICAgICAgICBlbHNlewojICAgICAgICAgICAgICAgICByZXR1cm4oMCkKIyAgICAgICAgIH0KIyB9KQoKZHJ1Z19yZXBvcnRlZF90YmwgPC0gZGF0X3JlbW92ZTY0WyxncmVwbCgiZHJ1Z3NfYWJ1c2VkIiwgY29sbmFtZXMoZGF0X3JlbW92ZTY0KSldCmRydWdfZGV0ZWN0ZWRfdGJsIDwtIGRhdF9yZW1vdmU2NFssZ3JlcGwoImRvYV91cmluZSIsIGNvbG5hbWVzKGRhdF9yZW1vdmU2NCkpXQoKCmNvbG5hbWVzKGRydWdfcmVwb3J0ZWRfdGJsKSA9IGRydWdzX3JlcG9ydGVkCmNvbG5hbWVzKGRydWdfZGV0ZWN0ZWRfdGJsKSA9IGRydWdzX2RldGVjdGVkCgpkcnVnX3JlcG9ydGVkX3RibCA8LSBhcHBseShkcnVnX3JlcG9ydGVkX3RibCwgMiwgYXMubnVtZXJpYykKZHJ1Z19yZXBvcnRlZF90YmwgPC0gZHJ1Z19yZXBvcnRlZF90YmxbLC1jKHdoaWNoKGFzLnZlY3RvcihhcHBseShkcnVnX3JlcG9ydGVkX3RibCwgMiwgc3VtKSk9PTApKV0KI2RydWdfcmVwb3J0ZWRfdGJsIDwtIGFwcGx5KGRydWdfcmVwb3J0ZWRfdGJsLCAyLCBhcy5mYWN0b3IpCiMgCmRydWdfZGV0ZWN0ZWRfdGJsIDwtIGFwcGx5KGRydWdfZGV0ZWN0ZWRfdGJsLCAyLCBhcy5udW1lcmljKQoKZHJ1Z19kZXRlY3RlZF90YmwgPC0gZHJ1Z19kZXRlY3RlZF90YmxbLC1jKHdoaWNoKGFzLnZlY3RvcihhcHBseShkcnVnX2RldGVjdGVkX3RibCwgMiwgc3VtKSk9PTApLCBuY29sKGRydWdfZGV0ZWN0ZWRfdGJsKSldCmRydWdfZGV0ZWN0ZWRfdGJsIDwtIGFwcGx5KGRydWdfZGV0ZWN0ZWRfdGJsLCAyLCBhcy5mYWN0b3IpCgpkcnVnX3JlcG9ydGVkX3RibCA9IG5hLm9taXQoZGF0YS5mcmFtZShEZWF0aCA9IGRlYXRoX2NvbCwgZHJ1Z19yZXBvcnRlZF90YmwpKQpkcnVnX2RldGVjdGVkX3RibCA9IG5hLm9taXQoZGF0YS5mcmFtZShEZWF0aCA9IGRlYXRoX2NvbCwgZHJ1Z19kZXRlY3RlZF90YmwpKQoKbW9kZWwgPSBnbG0oRGVhdGh+LiwgZGF0YSA9IGRydWdfZGV0ZWN0ZWRfdGJsLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikpCnByaW50KCJMb2dpdCBNb2RlbCIpCnN1bW1hcnkobW9kZWwpICAgICAgICAgICAgICAgICAgCgpgYGAKV2lsbCBkcnVnIGFuZCBBbGNvaG9sIGFmZmVjdCBkZWF0aD8gcHJvYmFibHkgbm90LiBIb3dldmVyLCB0aGUgYWJvdmUgcmVzdWx0cyBzaG93IHNvbWUgZHJ1Z3MgbW9yZSBsZWF0aGFsLCBzb21lIGFyZSBub3QsIHNvIHRoZXJlIG1pZ2h0IGJlIGludGVyYWN0aW9uIGFtb3VuZyBkcnVncywgc28gd2UgbWlnaHQgbmVlZCB0byBpbnZlc3RpZ2F0ZSwgYmVjYXVzZSBJIGRpZG4ndCBhcHBseSBldmVyeSBzaW5nbGUgZHJ1ZywgSSBvbmx5IHVzZWQgdGhlICJkcnVnX29ubHkiIHZhcmlhYmxlLgpgYGB7ciBkcnVnX2FsY28sIGVjaG89RkFMU0V9Cm9ubHlfZHJ1ZyA8LSBkYXRfcmVtb3ZlNjRbLGdyZXBsKCJvbmx5X2RydWciLCBjb2xuYW1lcyhkYXRfcmVtb3ZlNjQpKV0Kb25seV9hbGNvaG9sIDwtIGRhdF9yZW1vdmU2NFssZ3JlcGwoIm9ubHlfYWxjb2hvbCIsIGNvbG5hbWVzKGRhdF9yZW1vdmU2NCkpXQpib3RoX2RydWdfYWxjb2hvIDwtIGRhdF9yZW1vdmU2NFssZ3JlcGwoImJvdGhfZHJ1Z19hbGNvaG8iLCBjb2xuYW1lcyhkYXRfcmVtb3ZlNjQpKV0KCmZvcihpIGluIGMoMTpsZW5ndGgoYm90aF9kcnVnX2FsY29obykpKXsKICAgICAgICBpZihib3RoX2RydWdfYWxjb2hvW2ldPT0xKXsKICAgICAgICAgICAgICBvbmx5X2RydWdbaV0gPSAxCiAgICAgICAgICAgICAgb25seV9hbGNvaG9sW2ldPTEKICAgICAgICB9Cn0KCmRydWdfYWxjbyA8LSBuYS5vbWl0KGRhdGEuZnJhbWUoRGVhdGggPSBkZWF0aF9jb2wsIERydWdfT25seSA9IG9ubHlfZHJ1ZywgQWxjb19Pbmx5ID0gb25seV9hbGNvaG9sKSkKCiNtb2RlbCA9IGdsbShEZWF0aH5EcnVnX09ubHkrQWxjb19Pbmx5K0RydWdfT25seTpBbGNvX09ubHksIGRhdGEgPSBkcnVnX2FsY28sIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkKbW9kZWwgPSBnbG0oRGVhdGh+LiwgZGF0YSA9IGRydWdfYWxjbykKcHJpbnQoIkxvZ2l0IE1vZGVsIGZvciBEcnVnIGFuZCBBbGNvaG9sIikKc3VtbWFyeShtb2RlbCkgICAgICAgICAgCgpgYGAKCiMjIEluZmVjdGlvbgoKCkRydWdzIHZzIGluZmVjdGlvbiwgd2hhdCBkcnVncz8KCkJVVCEhIENoYW5nZSB0byB0aGUgb3RoZXIgaW5mZWN0aW9uIERydWcgYWZmZWN0IGluZmVjdGlvbi4gCmBgYHtyLCBlY2hvPUZBTFNFfQoKaW5mZWN0X2RhdCA8LSBkYXRfcmVtb3ZhbFssd2hpY2goZ3JlcGwoIklORkVDVElPTiIsIGNvbG5hbWVzKGRhdF9yZW1vdmFsKSkpXQojaW5mZWN0X2RhdCA8LSBpbmZlY3RfZGF0WywtYygxLDgpXQoKY29sbmFtZXMoaW5mZWN0X2RhdCkgPC0gYygiSW5mZWN0aW9uIikKZHJ1Z19pbmZlY3Rpb24gPC0gZGF0YS5mcmFtZShJbmZlY3Rpb24gPSBpbmZlY3RfZGF0LCBEcnVnX09ubHkgPSBvbmx5X2RydWcsIEFsY29fT25seSA9IG9ubHlfYWxjb2hvbCkKCiNtb2RlbCA9IGdsbShEZWF0aH5EcnVnX09ubHkrQWxjb19Pbmx5K0RydWdfT25seTpBbGNvX09ubHksIGRhdGEgPSBkcnVnX2FsY28sIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkKbW9kZWwgPSBsbShJbmZlY3Rpb25+LiwgZGF0YSA9IGRydWdfaW5mZWN0aW9uKQpwcmludCgiSW5mZWN0aW9uIHZzIERydWdzIikKc3VtbWFyeShtb2RlbCkgICAgICAgCgpgYGAKCgoKCkRlYXRoIHZzIEluZmVjdGlvbiwgRnJhY3R1cmUgKFRoZSBtb2RlbCB3aWxsIGhhdmUgb3ZlcmxhcHBpbmcgYmV0d2VlbiB0aGUgdHdvIHBvcHVsYXRpb25zLiBUaGlzIG1lYW5zCnRoZXkgd2lsbCBiZSBzb21ld2hhdCBjb2xsaW5lYXIuIFlvdSB3aWxsIG1ha2UgYSB2ZW4tZGlhZ3JhbSB0eXBlIHBsb3QgZm9yIHRoZXNlIHR3by4gVGhpcyB3aWxsIGFsbG93IHVzCnRvIGxvb2sgYXQgdGhlIHBlcmNlbnRhZ2Ugb2YgZWFjaCBwb3B1bGF0aW9uLCB5b3UgY2FuIGRvIHRoaXM6IHRvdGFsL2RlYXRoLCBpbmZlY3RlZC9kZWF0aCwgYW5kCmZyYWN0dXJlKHRoZSBzaXggdmFsdWVzKS9kZWF0aCkKCgpgYGB7ciBpbmZlY3Rpb24sIGVjaG89RkFMU0V9CiNpbmZlY3RfY29sX25hbWUgPC0gYygiSGVhcnQiLCAiTHVuZyIsICJTa2luIiwgIkpvaW50X2JvbmUiLCAiU2Vwc2lzIiwgIk90aGVyIikKCiNjb2x1bV9kZXNjCmluZmVjdF9kYXQgPC0gZGF0X3JlbW92YWxbLHdoaWNoKGdyZXBsKCJJTkZFQ1RJT04iLCBjb2xuYW1lcyhkYXRfcmVtb3ZhbCkpKV0KI2luZmVjdF9kYXQgPC0gaW5mZWN0X2RhdFssLWMoMSw4KV0KCmNvbG5hbWVzKGluZmVjdF9kYXQpIDwtIGMoIkluZmVjdGlvbiIpCgpkZWF0aF9pbmZlY3QgPC0gZGF0YS5mcmFtZShEZWF0aCA9IGRlYXRoX2NvbCwgaW5mZWN0X2RhdCkKCm1vZGVsIDwtIGdsbShEZWF0aH4uLCBkYXRhID0gZGVhdGhfaW5mZWN0LCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikpCnByaW50KCJEZWF0aCB2cy4gaW5mZWN0aW9uIikKc3VtbWFyeShtb2RlbCkKYGBgCgojIyMgRGVhdGggdnMgRnJhY3R1cmUgbm90IHdvcmtpbmcgCgpWYXJpYWJsZSBuYW1lczogIlNwaW5lLkZyYWN0dXJlLmFuZC5Ta3VsbC5mcmFjdHVyZSIsICJTcGluZS5mcmFjdHVyZS5hbmQuc2t1bGwuYmxlZWRpbmciLCAiU3BpbmUuZnJhY3R1cmUuLnNrdWxsLmZyYWN0dXJlLi5hbmQuc2t1bGwuYmxlZWQiLiAKClRoZSBmaXJzdCBhbmQgc2Vjb25kIGFyZSBhbGwgMHMuIE1vZGVsIGRvZXNuJ3QgbWFrZSBzZW5zZS4KCmBgYHtyLCBlY2hvPUZBTFNFfQojIGdyZXBsKCJmcmFjdHVyZSIsIGNvbHVtX2Rlc2MkVmFyaWFibGUpCmZyYWN0dXJlX2RhdCA8LSBkYXRfcmVtb3ZhbFssd2hpY2goZ3JlcGwoImZyYWN0dXJlIiwgY29sbmFtZXMoZGF0X3JlbW92YWwpKSldCiMgaW5mZWN0X2RhdCA8LSBpbmZlY3RfZGF0WywtYygxLDgpXQojIGNvbG5hbWVzKGZyYWN0dXJlX2RhdCkgPC0gYygiRnJhY3R1cmUiKQoKZGVhdGhfZnJhY3R1cmUgPC0gZGF0YS5mcmFtZShEZWF0aCA9IGRlYXRoX2NvbCwgZnJhY3R1cmVfZGF0KQojIGNvbG5hbWVzKGRlYXRoX2ZyYWN0dXJlKQojIHN1bShmcmFjdHVyZV9kYXRbLDFdKQoKbW9kZWwgPC0gZ2xtKERlYXRofi4sIGRhdGEgPSBkZWF0aF9mcmFjdHVyZSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpLCBuYS5hY3Rpb24gPSBuYS5vbWl0KQpwcmludCgiRGVhdGggdnMuIEZyYWN0dXJlIikKc3VtbWFyeShtb2RlbCkKCmBgYAoKIyMgRnJhY3R1cmVzIHZzIERlYXRoOiAKSU5GRUNUSU9OIChCcmFpbiBhbmQvb3IgU3BpbmUpCkNoZWNrIG9uIHRoZXNlIHZhcmlhYmxlcy4gSWYgdGhleSBoYXZlIGxlc3MgdGhhbiB0aGUgcG93ZXIgeW91IG5lZWQsIGp1c3QgdGhyb3cgdGhlbSBvdXQhClNwaW5lIEZyYWN0dXJlIE9ubHkKU2t1bGwgRnJhY3R1cmUgT25seQpTa3VsbCBCbGVlZGluZyBPbmx5ClNwaW5lIEZyYWN0dXJlIGFuZCBTa3VsbCBmcmFjdHVyZQpTcGluZSBmcmFjdHVyZSBhbmQgc2t1bGwgYmxlZWRpbmcKU2t1bGwgRnJhY3R1cmUgYW5kIHNrdWxsIGJsZWVkaW5nCgpTcGluZSBmcmFjdHVyZSwgc2t1bGwgZnJhY3R1cmUsIGFuZCBza3VsbCBibGVlZAoKV2hhdCBJIHdhbnQgdG8ga25vdyBpczogSG93IG1hbnkgKCUpIHBlb3BsZSB3aXRoIGluZmVjdGlvbiBkaWUsIGhvdyBtYW55IHBlb3BsZSAoJSkKd2l0aCBmcmFjdHVyZXMgb3IgYmxlZWRzIGRpZSwgYW5kIGhvdyB0aG9zZSB0aGluZ3Mgc3RhY2sgdXAgYWdhaW5zdCBlYWNoIG90aGVyLgoKIyMjIEhlcmUgdGhlIE5BIHNob3dzIHRoYXQgY2F0ZWdvcnkgaXMgYWxsIDAuIApgYGB7ciwgZWNobz1GQUxTRX0KZnJhY3R1cmVfZGF0IDwtIGRhdF9yZW1vdmFsWyxjKDExMToxMTgpXQpmcmFjdHVyZV9kYXQgPC0gZGF0YS5mcmFtZShEZWF0aCA9IGRlYXRoX2NvbCwgZnJhY3R1cmVfZGF0KQoKbW9kZWwgPC0gZ2xtKERlYXRofi4sIGRhdGEgPSBmcmFjdHVyZV9kYXQsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSwgbmEuYWN0aW9uID0gbmEub21pdCkKcHJpbnQoIkRlYXRoIHZzLiBGcmFjdHVyZSIpCnN1bW1hcnkobW9kZWwpCgpgYGAKIyMjIENvdW50aW5nOgpgYGB7ciwgZWNobz1GQUxTRX0KCmFnZ3JlZ2F0ZShEZWF0aCB+IEJyYWluLkJsZWVkICsgU3BpbmUuRnJhY3R1cmUuT25seSArIFNrdWxsLkZyYWN0dXJlLk9ubHkgKyBTa3VsbC5CbGVlZGluZy5Pbmx5ICsgU3BpbmUuRnJhY3R1cmUuYW5kLlNrdWxsLmZyYWN0dXJlCiAgICAgICAgICArIFNwaW5lLmZyYWN0dXJlLmFuZC5za3VsbC5ibGVlZGluZywgZGF0YT1mcmFjdHVyZV9kYXQsIEZVTj1mdW5jdGlvbih4KSB7c3VtKHgpL2xlbmd0aCh4KX0pCgoKYGBgCgpgYGB7ciwgZWNobz1GQUxTRX0KCmFnZ3JlZ2F0ZShEZWF0aCB+IC4sIGRhdGE9ZGVhdGhfaW5mZWN0LCBGVU49ZnVuY3Rpb24oeCkge3N1bSh4KS9sZW5ndGgoeCl9KQoKCmBgYAoKCiMjIyBJZiBhIHBhdGllbnQgY2FuIGdpdmUgaGlzdG9yeSwgdGhlbiBkZWF0aCBpcyBsb29taW5nLCBidXQgZG9lc24ndCBtZWFuIGhlIHdpbGwgYmUgaW5mZWN0ZWQgZWFzaWx5LgoKRGVhdGggdnMuIEdpdmVuIEhpc3RvcnkKCmBgYHtyIGdpdmVfaGlzdG9yeSwgZWNobz1GQUxTRX0KZ2l2ZV9oaXN0IDwtIGRhdF9yZW1vdmFsWyx3aGljaChncmVwbCgiY29uc2Npb3VzIiwgY29sbmFtZXMoZGF0X3JlbW92YWwpKSldCgpkZWF0aF9oaXN0IDwtIGRhdGEuZnJhbWUoRGVhdGggPSBkZWF0aF9jb2wsIEluZmVjdCA9IGRlYXRoX2luZmVjdCRJbmZlY3Rpb24sIEdpdmVuX0hpc3QgPSBnaXZlX2hpc3QpCgpjb2xuYW1lcyhkZWF0aF9oaXN0KSA8LSBjKCJEZWF0aCIsICJJbmZlY3Rpb24iLCAiR2l2ZW5fSGlzdCIpCgptb2RlbCA8LSBnbG0oRGVhdGh+R2l2ZW5fSGlzdCwgZGF0YSA9IGRlYXRoX2hpc3QsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkKc3VtbWFyeShtb2RlbCkKCmBgYAoKSW5mZWN0aW9uIHZzLiBHaXZlbiBIaXN0b3J5ClllcyB0aGUgbG9uZ2VyIHlvdSBzdGF5IHlvdSB0ZW5kIHRvIGdldCBpbmZlY3RlZApgYGB7ciwgZWNobz1GQUxTRX0KCm1vZGVsIDwtIGdsbShJbmZlY3Rpb25+R2l2ZW5fSGlzdCwgZGF0YSA9IGRlYXRoX2hpc3QsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkKc3VtbWFyeShtb2RlbCkKCmBgYAoKCiMjIyBEYXlzIG9mIGFkbWlzc2lvbiB2cy4gSW5mZWN0aW9uCgpUaGUgbG9uZ2VyIHlvdSBzdGF5LCB0aGUgbW9yZSBjaGFuY2UgeW91IGNvdWxkIGdldCBpbmZlY3RlZCwgaGVyZSBzaG93cyB0aGUgY29ycmVsYXRpb24sIHdoY2loIGlzIHZlcnkgc2lnbmlmaWNhbnQhISEKCmBgYHtyLCBlY2hvPUZBTFNFfQoKRGF5c19hZG1pdHRlZCA8LSBkYXlzX2FkbWl0X3RhYmxlJERheXNfYWRtaXR0ZWQKSW5mZWN0aW9uIDwtIGRlYXRoX2hpc3QkSW5mZWN0aW9uCmRheXNfYWRtaXRfdnNfaW5mZWN0aW9uX3RhYmxlIDwtIGRhdGEuZnJhbWUoRGF5c19hZG1pdHRlZCwgSW5mZWN0aW9uKQptb2RlbCA8LSBnbG0oSW5mZWN0aW9ufkRheXNfYWRtaXR0ZWQsIGRhdGEgPSBkYXlzX2FkbWl0X3ZzX2luZmVjdGlvbl90YWJsZSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpKQpzdW1tYXJ5KG1vZGVsKQoKCmBgYAojIyMgRHJ1Z3MgdnMgSW5mZWN0aW9uCgoKYGBge3IsIGVjaG89RkFMU0V9CgpkcnVnX2RldGVjdGVkX3ZzX0luZmVjdGlvbl90YmwgPC0gZGF0YS5mcmFtZShkZWF0aF9pbmZlY3QkSW5mZWN0aW9uLCBkcnVnX2RldGVjdGVkX3RibFssLTFdKQptb2RlbCA8LSBnbG0oZGVhdGhfaW5mZWN0LkluZmVjdGlvbn4uLCBkYXRhID0gZHJ1Z19kZXRlY3RlZF92c19JbmZlY3Rpb25fdGJsLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikpCnN1bW1hcnkobW9kZWwpCmBgYAoK