Notes

Methods and materials

Radiocarbon corrections

Although differences were small, radiocarbon data for archived samples were first corrected for decay since the year of collection before assessing treatment effects.

Decay correction formula: \[1000 \cdot \left( (FM \cdot e^{\frac{-year_{sampled} + 1950}{8267}}) - 1 \right)\]

where FM is the fraction modern, and 8267 is the inverse of the product of the natural log of two and the true half life of 14C (5730 y).

Results

Respiration rates

note that the text below was left because statistics were calculated on the fly

Experiment 1 (air-dry + storage treatment)

Among the air-dry + storage samples, respiration rates were more than twice as high in grassland soils than in forest soils, reaching a maximum of 7.1 mg CO2 g soil C-1 d-1 after 0.7 d, followed by a sharp decline. Mean respiration rates in forest sites peaked at 1.5 mg CO2 g soil C-1 d-1 after 6.9 d, followed by a much more gradual decline than in grassland sites. Control samples responded more weakly and more gradually to rewetting, although as in the treatment samples respiration was greater in grassland soils than in forest soils. Peak respiration rates for control incubations were 1.9 and 0.6 mg CO2 g soil C-1 d-1 after 4.8 d for grassland and forest soils, respectively.

Experiment 2 (air-dry treatment, 2019 samples)

Peak respiration rates were not significantly different (p > 0.05) between forest and grassland soils in Experiment 2, peaking at 3.0 and 3.3 mg CO2 g soil C-1 d-1 after 95 h for grassland and forest soils, respectively (Fig. 1).

Fig. 1. Respiration rates for Experiment 1 (air-dry + storage treatment, 2011) and Experiment 2 (air-dry only treatment, 2019)

Caption: Top panel shows data from samples collected in 2011 for Experiment 1 (air-dry + storage treatment), bottom panel shows data from samples collected in 2019 for Experiment 2 (air-dry only treatment). Vertical gray line at day 4 demarcates the end of the pre-incubation period and the start of the equilibrium respiration period. Points show measurements and lines show trends in mean respiration rate. Shaded ribbons represent one standard error. The final measurement points for a few samples which took >18 days to reach CO2 targets are excluded for display reasons; respiration rates for those samples remained flat. Note that headspace CO2 concentrations for Experiment 1 control samples were only measured once during the pre-incubation period (day 4) in contrast to daily measurements for all other samples. Consequently the respiration rate for those samples is the cumulative average rate over the first 4 d.

Supplemental respiration rates figures:

Experiment 3 (storage duration)

Grassland soils from the storage duration treatment group responded rapidly to rewetting and reached target CO2 levels after just 72 h of incubation. Only a single observation was made for the grassland treament samples due to the rapid respiration rates, which peaked at 5.6 mg CO2 g soil C-1 d-1. The mean peak respiration rate for forest treatment samples was lower and lagged in comparison to the grassland soils, reaching 2.2 mg CO2 g soil C-1 d-1 after 97 h.

Control-3 respiration rates peaked after the pre-incubation period (115 h), at 2.3 mg CO2 g soil C-1 d-1. Forest control samples were pre-incubated under various conditions, but respiration rates were only measured during the pre-incubation period for two samples from the Sierra Nevada mountains (USA). In general, respiration rates for forest control samples in Experiment 3 were much lower than in the treatment incubations, peaking at 0.6 mg CO2 g soil C-1 d-1 after 120 h.

Supplemental Fig 1. Respiration rates for Experiment 3

Caption: Experiment 3 storage duration treatment samples were only incubated for a single enclosure period, as the results of Experiment 1 and Experiment 2 showed no significant difference in \(\Delta\)14C-CO2 between the rewetting pulse CO2 released during the pre-incubation period and the CO2 respired during the equilibrium respiration period. The grassland storage duration treatment samples (blue dashed line) respired an equivalent amount of CO2 in just 3 d as the corresponding control-3 samples respired during the pre-incubation period and the equilibrium respiration period combined. Consequently those incubations were stopped after the first CO2 measurement point. Control-3 samples did undergo pre-incubation, but as the CO2 release was not measured nor was \(\Delta\)14C-CO2 for the majority of the samples, all data were averaged by day of measurement.

Preincubation headspace CO2 concentations were only measured once for the control-1 samples, at the end of the four=day preincubation period. In order to compare the control-1 respiration rates more easily with the air-dry + storage treatment samples, Supplemental Figure 2 shows the air-dry + storage pre-incubation respiration rates plotted as a cumulative average for the preincubation period. However, as can be seen in Figure 1, headspace CO2 concentration was measured daily for the air-dry + storage samples.

Supplemental Fig 2. Respiration rates for Experiment 1 and Experiment 2 shown with all pre-incubation data calculated as cumulative averages

Caption: CO2 concentrations for Experiment 1 control samples were only measured once during the pre-incubation period, in contrast to daily measurements for all other samples. Pre-incubation respiration rates are shown here calculated as cumulative averages for the purpose of fair comparison across all treatments.

Radiocarbon data

no non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to max; returning -Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Infno non-missing arguments to min; returning Inf

Pre-incubation versus equilibrium respiration 14C-CO2

Fig. 2. \(\Delta\)14C-CO2 of the rewetting pulse and the equilibrium respiration period

Caption: Points are means of laboratory duplicates and error bars are the min and max (except for Experiment 1 control samples, which were not replicated). Note that rewetting pulse \(\Delta\)14C was not measured for control-1 samples; additionally samples from three of the forest plots of the air-dry + storage samples from Experiment 1 failed to accumulate enough CO2 during the pre-incubation period to measure \(\Delta\)14C. The outlier point with the substantially depleted pre-incubation \(\Delta\)14C is from Experiment 2 (control).

Treatment effect on \(\Delta\)14C-CO2 for all samples (Experiments 1, 2, and 3)

Error in summary.factor(X[[i]], ...) : 
  (list) object cannot be coerced to type 'integer'

Fig. 3. Overall treatment effect on \(\Delta\)14C-CO2

Caption: Points show data from Experiments 1 and 3 (air-dry + storage treatment) and Experiment 2 (air-dry only treatment). Points are the mean of laboratory replicates (for replicated samples); error bars are 2x standard error. Solid line is 1:1. For context, the dashed and dotted lines show differences of ±20‰ and ±$40‰, equivalent to the decline in \(\Delta\)14C in atmospheric CO2 over 4 and 8 y respectively, during the period of 2000 to 2020 (Graven et al. 2017).

Storage duration effect on 14C-CO2 (Experiment 3)

Fig. 4. Change in 14C-CO2 in relation to storage duration

Caption: Data are from both Experiment 1 (in black) and Experiment 3 (all other points), averaged by site and ecosystem type. Points are the mean, error bars are 2x standard error. For context, the dashed and dotted lines are the same is in Fig. 4 and show a difference of 20‰ and 40‰, equivalent to the decline in \(\Delta\)14C in atmospheric CO2 over 4 and 8 y respectively, during the period of 2000 to 2020 (Graven et al. 2017). Position of points jittered to avoid overplotting; storage duration has been rounded down to the nearest whole year.

Fig 5. Time series of control and treatment \(\Delta\)14C-CO2 (Experiments 1 and 2)

Caption: Filled circles show \(\Delta\)14C-CO2 observed for both control-1 and control-2 samples (2011 and 2019 points, respectively). Open symbols show \(\Delta\)14C-CO2 observed for treament samples: open squares = air-dry + storage treatment, Experiment 1; open circles = air-dry only treatment, Experiment 2. Points are means and error bars show the pooled standard deviation. The black line shows \(\Delta\)14C of the atmosphere.

The absolute mean difference in 14C-CO2 between control and treatment samples was greater in grassland samples (21.4‰) than in forest samples (12.1‰) for both Experiment 1 and Experiment 2.

\(\delta\)13C

Supplemental Fig 3. Time series of control and treatment \(\delta\)13C-CO2 (Experiments 1 and 2)

Caption: Filled circles show \(\delta\)13C-CO2 observed for control samples, while open symbols show \(\delta\)13C-CO2 observed for treament samples (open squares = air-dry + storage treatment, Experiment 1, 2011; open circles = air-dry only treatment, Experiment 2, 2019). Points are means and error bars show 2x standard error.

Effect of cumulative respired carbon on 14C-CO2

We looked at the possible effect of the difference in the amount of carbon respired (mg CO2-C g soil C-1) on the differences between control and treatment 14C-CO2 using a linear regression model, but it was not significant overall. When data from Experiment 1 and Experiment 2 were considered separately, we observed a slight positive trend between the difference in respired carbon and the difference in 14C-CO2 within Experiment 2, but it was only marginally significant (p = 0.063).

Supplementary Fig. 4. Change in 14C-CO2 in relation to cumulative soil carbon respired

Caption: Note that pre-incubation \(\Delta\)14C was not measured for the control-1 samples in 2011. Limits exclude outlier point (HEW22 control-2, pre-incubation) for improved legibility. Points are means, error bars show min and max of duplicate samples.

Discussion

Fig 6a. Trajectories of \(\Delta\)14C over time in soil C and respired CO2 for a 2-pool model fit to the Hainich-Dün forest sites in relation to atmospheric \(\Delta\)14C

Caption: Modeled curves derived from a two-pool parallel model parameterized with data from Schrumpf et al. (2015): (kfast = 1/4) and a more slowly cycling pool (kslow = 1/115). Gold points show observed \(\Delta\)14C-CO2 from this study. Solid symbols show control samples, open symbols show treatment samples. Atmospheric \(\Delta\)14C data up to the year 2015 are from Graven et al. (2017), while data points beyond 2015 use the extrapolation method from Sierra (2018). All atmospheric radiocarbon data is for the northern hemisphere (zone 2).

Fig 6b. Potential shifts in \(\Delta\)14C of respired CO2 in response to treatment

Caption: Zooming in on the study period, we can see that the treatment sample \(\Delta\)14C-CO2 shifts in the direction of the slowly cycling soil C pool (blue line), indicating increased contribution from this pool to respiration following air-drying and rewetting. Note that the increased contribution from the slow cycling pool leads to depletion in \(\Delta\)14C-CO2 relative to the controls in 2011, but enrichment in 2019 due to the crossing of the slow and fast cycling pool curves in 2016. Shaded ribbon around the respiration curve shows the model parameterized with the 75th quartile estimates for kfast (1/7) and kslow (1/200).

Change in soil moisture content with moisture adjustment

Supplemental Fig 5. Change in \(\Delta\)14C-CO2 (control - treatment) relative to field moisture

Caption: Data are from Experiment 1 (“arc”) and Experiment 2 (“rewet”). All samples were moisture-adjusted prior to incubation, but control samples were adjusted from field moisture, “whcFresh” (percent of WHC), whereas treatment samples were moisture adjusted after air-drying, i.e. at approximately 0% of WHC.

LS0tCnRpdGxlOiAiQXJjaGl2ZWQgU29pbCBJbmN1YmF0aW9ucyBNYW51c2NyaXB0IEZpZ3VyZXMiCmF1dGhvcjogIkouIEJlZW0tTWlsbGVyIgpkYXRlOiAiMDggT2N0IDIwMjAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMicKICBodG1sX25vdGVib29rOgogICAgY3NzOiAiY3VzdG9tLmNzcyIKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICBwZGZfZG9jdW1lbnQ6CiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgKaGVhZGVyX2luY2x1ZGVzOgotIFx1c2VwYWNrYWdlW3V0Zjhde2lucHV0ZW5jfQotIFx1c2VwYWNrYWdle2Zsb2F0fQotLS0KYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYWxpZ24gPSAnY2VudGVyJywgZGV2ID0gYygnY2Fpcm9fcGRmJywgJ3BuZycpLCBmaWcud2lkdGggPSA2LjUpCmBgYAoKYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KFNvaWxSKQpsaWJyYXJ5KGNvcnJwbG90KQpsaWJyYXJ5KG9wZW54bHN4KQpsaWJyYXJ5KElTUmFEKQpgYGAKIyMgTm90ZXMKKiBUaGlzIHdvcmtib29rIGlzIGludGVuZGVkIHRvIGxvYWQgYW5kIHByZXBhcmUgdGhlIGtleSBkYXRhIGZvciBhbmFseXNpcyBmb3IgdGhlIGFyY2hpdmUgaW5jdWJhdGlvbiBwcm9qZWN0LgoqIFRoaXMgaXMgYW4gdXBkYXRlZCB2ZXJzaW9uIG9mIFJNRCBmaWxlICIuL3NyYy9hcmNfaW5jX2RhdGEtd3JhbmdsaW5nXzIwMjAtMDQtMjAuUm1kIiB3aXRoIHRoZSBleHBsYW5hdG9yeSB0ZXh0IHJlbW92ZWQKKiBhbGwgY29kZSBjaHVuayBvcHRpb25zIGFyZSBzZXQgdG8gImVjaG8gPSBGQUxTRSI7IHNlZSByYXcgLlJtZCBmaWxlIGZvciBkYXRhIHdyYW5nbGluZyBjb2RlLgoKIyBNZXRob2RzIGFuZCBtYXRlcmlhbHMKCipSYWRpb2NhcmJvbiBjb3JyZWN0aW9ucyoKCkFsdGhvdWdoIGRpZmZlcmVuY2VzIHdlcmUgc21hbGwsIHJhZGlvY2FyYm9uIGRhdGEgZm9yIGFyY2hpdmVkIHNhbXBsZXMgd2VyZSBmaXJzdCBjb3JyZWN0ZWQgZm9yIGRlY2F5IHNpbmNlIHRoZSB5ZWFyIG9mIGNvbGxlY3Rpb24gYmVmb3JlIGFzc2Vzc2luZyB0cmVhdG1lbnQgZWZmZWN0cy4KCkRlY2F5IGNvcnJlY3Rpb24gZm9ybXVsYToKJCQxMDAwIFxjZG90IFxsZWZ0KCAoRk0gXGNkb3QgZV57XGZyYWN7LXllYXJfe3NhbXBsZWR9ICsgMTk1MH17ODI2N319KSAtIDEgXHJpZ2h0KSQkCgp3aGVyZSBGTSBpcyB0aGUgZnJhY3Rpb24gbW9kZXJuLCBhbmQgODI2NyBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgcHJvZHVjdCBvZiB0aGUgbmF0dXJhbCBsb2cgb2YgdHdvIGFuZCB0aGUgdHJ1ZSBoYWxmIGxpZmUgb2YgXjE0XkMgKDU3MzAgeSkuCgpgYGB7ciAxNEMgaGVscGVyIGZ4c30KIyA1LiBDcmVhdGUgaGVscGVyIGZ1bmN0aW9ucwojIGRlY2F5IGNvcnJlY3Rpb24gZnVuY3Rpb24gIApkZWNheS5jb3JyLmZ4IDwtIGZ1bmN0aW9uKHllYXJfc2FtcGxlZCwgZnJhY3Rpb25fbW9kZXJuKSB7CiAgaWZlbHNlKGlzLm5hKGZyYWN0aW9uX21vZGVybiksIE5BLCAxMDAwKigoZnJhY3Rpb25fbW9kZXJuKmV4cCgoLXllYXJfc2FtcGxlZCArIDE5NTApLzgyNjcpKS0xKSkKfQoKIyBkMTRDIHRvIGZyYWN0aW9uIG1vZGVybiBmdW5jdGlvbgpkMTRjLmZtLmZ4IDwtIGZ1bmN0aW9uKHllYXJfc2FtcGxlZCwgZDE0YykgewogICgoZDE0YyAvIDEwMDApICsgMSkgLyBleHAoMC4wMDAxMjA5NyAqICgxOTUwIC0geWVhcl9zYW1wbGVkKSkKICB9CgojIGRlZmluZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHN0cmlwcGluZyBvdXQgIk5BIiBhbmQgbm9uLUV4cGxvcmF0b3JpZXMgZGF0YQpleHRyYS5jbGVhbi5meCA8LSBmdW5jdGlvbihkZikgewogIGRmIDwtIGRmW3doaWNoKGdyZXBsKCJIRUciLCBkZiRQcm9iZSkgfAogICAgICAgICAgICAgICAgICAgZ3JlcGwoIkhFVyIsIGRmJFByb2JlKSB8CiAgICAgICAgICAgICAgICAgICBncmVwbCgiU0VHIiwgZGYkUHJvYmUpIHwKICAgICAgICAgICAgICAgICAgIGdyZXBsKCJTRVciLCBkZiRQcm9iZSkpLCBdCiAgaWYobGVuZ3RoKGdyZXAoIkV4cGVyaW1lbnQiLCBuYW1lcyhkZikpKSA+IDApIHsKICAgICBkZiA8LSBkZlt3aGljaChkZiRFeHBlcmltZW50ICE9ICJ0bWUiKSwgXSAKICB9CiAgaXggPC0gd2hpY2goaXMubmEoZGYkRjE0QykgJiBpcy5uYShkZiRgWC4xNEMuLi4uYCkpCiAgaWYobGVuZ3RoKGl4KSA+IDEpIHsKICAgIGRmIDwtIGRmWy1peCwgXQogIH0KICByZXR1cm4oZGYpCn0KCiMgZXh0cmFjdCBzdG9yYWdlIGR1cmF0aW9uIGRhdGEgc2VwYXJhdGVseQp0bWUuMTRjLmZ4IDwtIGZ1bmN0aW9uKGRmKSB7CiAgZGYkU2FtcGxlTmFtZSA8LSBkZiRQcm9iZQogIGRmJFBlcmlvZCA8LSAiaW5jIgogIGlmKGxlbmd0aChncmVwKCJFeHBlcmltZW50IiwgbmFtZXMoZGYpKSkgPiAwKSB7CiAgICAgZGYgPC0gZGZbd2hpY2goZGYkRXhwZXJpbWVudCA9PSAidG1lIiksIF0gCiAgfQogIHJldHVybihkZikKfQpgYGAKCgpgYGB7ciByZWFkIHdpZGUgdHMgZGF0YX0KIyAxLiBMb2FkIGZsdXggZGF0YSBmcm9tIGFpci1kcnkgKyBzdG9yYWdlIChleHBlcmltZW50IDEpIGFuZCBzdG9yYWdlIGR1cmF0aW9uIChleHBlcmltZW50IDMpIGNvbnRyb2wgc2FtcGxlcywgYW5kIGNvbnZlcnQgZnJvbSAid2lkZSIgdG8gImxvbmciIGZvcm1hdCBzbyBhcyB0byBtYXRjaCBvdGhlciBkYXRhLiAKIyBSZWFkIGFpci1kcnkgKyBzdG9yYWdlIHJlc3BpcmF0aW9uIGNvbnRyb2wgZGF0YQphcmNoaXZlLmN0bC50cy53aWRlIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXN0b3JhZ2UtdDEtZmx1eC9hcmMtaW5jX3hwbHJfYXJjLXN0b3JhZ2UtdDEtZmx1eF8yMDIwLTA3LTAzLmNzdiIpCgojIENvbnZlcnQgdGltZSBkYXRhIGZyb20gd2lkZSB0byBsb25nCmFyY2hpdmUuY3RsLnRzLmQgPC0gc2VsZWN0KGFyY2hpdmUuY3RsLnRzLndpZGUsIHN0YXJ0c193aXRoKCJpbmNfdGltZV9kIikpICU+JQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInRpbWVwb2ludF9jbXR2IiwKICAgICAgICAgICAgICAgbmFtZXNfcHJlZml4ID0gImluY190aW1lX2RfIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInRpbWVfZCIpCiMgc29ydCBieSB0aW1lcG9pbnRfY210dgphcmNoaXZlLmN0bC50cy5kIDwtIGRhdGEuZnJhbWUoYXJjaGl2ZS5jdGwudHMuZFtvcmRlcihhcmNoaXZlLmN0bC50cy5kJHRpbWVwb2ludF9jbXR2KSxdKQoKIyBDb252ZXJ0IG1nQ08yIGRhdGEgZnJvbSB3aWRlIHRvIGxvbmcKYXJjaGl2ZS5jdGwudHMuY28yIDwtIHNlbGVjdChhcmNoaXZlLmN0bC50cy53aWRlLCBzdGFydHNfd2l0aCgiaW5jX21nQ08yX2phcl8iKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidGltZXBvaW50X2NtdHYiLAogICAgICAgICAgICAgICBuYW1lc19wcmVmaXggPSAiaW5jX21nQ08yX2phcl8iLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAibWdDTzJfamFyIikKIyBzb3J0IGJ5IHRpbWVwb2ludF9jbXR2CmFyY2hpdmUuY3RsLnRzLmNvMiA8LSBhcmNoaXZlLmN0bC50cy5jbzJbb3JkZXIoYXJjaGl2ZS5jdGwudHMuY28yJHRpbWVwb2ludF9jbXR2KSxdCgojIGFzc2VtYmxlIGluIGxvbmcgZGF0YWZyYW1lIAphcmNoaXZlLmN0bC50cyA8LSBkYXRhLmZyYW1lKElEID0gcmVwKHVuaXF1ZShhcmNoaXZlLmN0bC50cy53aWRlJElEKSwgNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyaW9kID0gImluYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXBvaW50X2NtdHYgPSByZXAoc2VxKGZyb20gPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gPSA1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCA9IGxlbmd0aChhcmNoaXZlLmN0bC50cy53aWRlJElEKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9kID0gYXJjaGl2ZS5jdGwudHMuZCR0aW1lX2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWdDTzJfamFyID0gYXJjaGl2ZS5jdGwudHMuY28yJG1nQ08yX2phcikKCiMgYWRkIHByZWluY3ViYXRpb24gZGF0YQphcmNoaXZlLmN0bC50cy5wcmUgPC0gYXJjaGl2ZS5jdGwudHMud2lkZVsxOmxlbmd0aCh1bmlxdWUoYXJjaGl2ZS5jdGwudHMud2lkZSRJRCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJJRCIsICJwcmVpbmNfdGltZV9kIiwgInByZWluY19tZ0NPMl9qYXIiKV0KYXJjaGl2ZS5jdGwudHMucHJlIDwtIHJlbmFtZShhcmNoaXZlLmN0bC50cy5wcmUsIHRpbWVfZCA9IHByZWluY190aW1lX2QsIG1nQ08yX2phciA9IHByZWluY19tZ0NPMl9qYXIpCmFyY2hpdmUuY3RsLnRzLnByZSR0aW1lcG9pbnRfY210diA8LSAxCmFyY2hpdmUuY3RsLnRzLnByZSRQZXJpb2QgPC0gInByZSIKYXJjaGl2ZS5jdGwudHMucHJlJHRpbWVfZF9jbXR2IDwtIGFyY2hpdmUuY3RsLnRzLnByZSR0aW1lX2QKICAKIyBDYWxjdWxhdGUgdGltZV9kX2NtdHYKYXJjaGl2ZS5jdGwudHMgPC0gYmluZF9yb3dzKAogIGxhcHBseSgKICAgIHNwbGl0KGFyY2hpdmUuY3RsLnRzLCBhcmNoaXZlLmN0bC50cyR0aW1lcG9pbnRfY210diksCiAgICBmdW5jdGlvbih4KSB7CiAgICAgIHgkdGltZV9kX2NtdHYgPC0geCR0aW1lX2QgKyAKICAgICAgICBhcmNoaXZlLmN0bC50cy5wcmVbbWF0Y2goeCRJRCwgYXJjaGl2ZS5jdGwudHMucHJlJElEKSwgInRpbWVfZCJdCiAgICAgIHJldHVybih4KQogICAgfQogICAgKQogICkKCiMgcmJpbmQgcHJlaW5jIGFuZCBpbmMgZGF0YQphcmNoaXZlLmN0bC50cyA8LSByYmluZChhcmNoaXZlLmN0bC50cy5wcmUsIGFyY2hpdmUuY3RsLnRzKQoKIyBhZGQgU2FtcGxlTmFtZSBjb2x1bW4gYW5kIHJlc3RvcmUgRXhwZXJpbWVudCBjb2x1bW4KYXJjaGl2ZS5jdGwudHMkU2FtcGxlTmFtZSA8LSBhcmNoaXZlLmN0bC50cyRJRAphcmNoaXZlLmN0bC50cyRFeHBlcmltZW50IDwtIGFyY2hpdmUuY3RsLnRzLndpZGVbbWF0Y2goYXJjaGl2ZS5jdGwudHMkSUQsIGFyY2hpdmUuY3RsLnRzLndpZGUkSUQpLCAiRXhwZXJpbWVudCJdCgojIHJlbW92ZSBpbnRlcm1lZGlhdGUgZmlsZXMKcm0oYXJjaGl2ZS5jdGwudHMuZCwgYXJjaGl2ZS5jdGwudHMuY28yLCBhcmNoaXZlLmN0bC50cy5wcmUpCmBgYAoKYGBge3IgcmVhZC1sb25nLXRzLWRhdGF9CiMgMi4gTG9hZCBmbHV4IGRhdGEgZnJvbSBhaXItZHJ5ICsgc3RvcmFnZSBzYW1wbGVzIGFuZCBmcm9tIGFpci1kcnkgZXhwZXJpbWVudCAoY3RsICYgdHJlYXRtZW50KSwgQyAmIE4gZGF0YSBmb3IgYWxsIHRoZSBFeHBsb3JhdG9yaWVzIHNhbXBsZXMgKG1lYXN1cmVkIGluIDIwMTEpLCBhbmQgc29pbCBtYXNzIGFuZCBtb2lzdHVyZSBkYXRhIGZvciBhbGwgZXhwZXJpbWVudHMuCiMgUmVhZCBYcGxyIEMgYW5kIE4gZGF0YQp4cGxyLmNuIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2V4dGVybmFsL2V4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ19zb2lsY25fMjAxMS8xNzA0MDdfQ05fY29uY2VudHJhdGlvbnNfRXhwbG9yYXRvcmllc19FUF9QbG90c18yMDExLmNzdiIpCgojIFJlYWQgWHBsciAxNEMgZGF0YSBmb3IgY29udHJvbCBzYW1wbGVzICgidG1lIiBhbmQgImFyYyIgRXhwZXJpbWVudHMpCnhwbHIuY3RsLmlzbyA8LSByZWFkLnhsc3goIi4uL2RhdGEvZXh0ZXJuYWwvZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy1jbzJfMjAxMS8xNzAyMjhfMTRDX1Jlc3BpcmF0aW9uLnhsc3giKQoKIyBSZWFkIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgaW5mbyBmb3IgYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50IHNhbXBsZXMKamFyaW5mby5hcmMgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtc3RvcmFnZS10Mi1qYXJJbmZvL2phcl9pbmZvcm1hdGlvbi5jc3YiKQoKIyBSZWFkIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgaW5mbyBmb3IgYWlyLWRyeSBkYXRhCmphcmluZm8ucmV3ZXQgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9haXItZHJ5LTIwMTktd2hjL2Fpci1kcnktMjAxOS13aGNfMjAyMC0wNy0wMy5jc3YiKQoKIyBSZWFkIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgaW5mbyBmb3Igc3RvcmFnZSBkdXJhdGlvbiB0cmVhdG1lbnQgc2FtcGxlcwojIHJlbW92ZSB1bml0IHJvdyBhbmQgY29udmVydCB0byBhcHByb3ByaWF0ZSB0eXBlcwpqYXJpbmZvLnRtZSA8LSB0eXBlLmNvbnZlcnQocmVhZC54bHN4KCIuLi9kYXRhL3Jhdy9sYWJfamVuYV9yZXN1bHRzLWNvMl8yMDE4LTA3LTMwL0FyY0luY19JbmNEYXRhXzIwMTgueGxzeCIsIHNoZWV0ID0gMSlbLTEsIF0pCgojIFJlYWQgRHVrZSBpc28gYW5kIGZsdXggZGF0YQp0bWUuY3RsLmR1ayA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtZHVrZS9hcmMtdG1lLWR1a2VfMjAyMC0wNC0yOS5jc3YiKQoKIyBSZWFkIFNpZXJyYSBOZXZhZGEgKEp1bidzKSBzb2lsIGRhdGEKdG1lLmN0bC5zb2lsLnNyYSA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtc2llcnJhL2FyYy10bWUtc2llcnJhLXNvaWxfMjAyMC0wNC0yOS5jc3YiKQoKIyBSZWFkIE9hayBSaWRnZSBDIGRhdGEKdG1lLmN0bC5vcm5sIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS1vcm5sL2FyYy10bWUtb3JubF8yMDIwLTA0LTMwLmNzdiIpCgojIFJlYWQgYWlyLWRyeSArIHN0b3JhZ2UgcmVzcGlyYXRpb24gZGF0YQphcmNoaXZlLmFyYy50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy1zdG9yYWdlLXQyLWZsdXgvYXJjaGl2ZS1mbHV4LXQyXzIwMjAtMDQtMjQuY3N2IikKCiMgUmVhZCBjb250cm9sIHJlc3BpcmF0aW9uIGRhdGEgZnJvbSAyMDE5IGFpci1kcnkgZXhwZXJpbWVudApyZXdldC5jdGwudHMgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9mcmVzaC0yMDE5LWZsdXgvZnJlc2gtMjAxOS1mbHV4XzIwMjAtMDQtMjQuY3N2IikKCiMgUmVhZCB0cmVhdG1lbnQgcmVzcGlyYXRpb24gZGF0YSBmcm9tIDIwMTkgYWlyLWRyeSBleHBlcmltZW50CnJld2V0LmRyeS50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2RyaWVkLTIwMTktZmx1eC9kcmllZC0yMDE5LWZsdXhfMjAyMC0wNC0yNC5jc3YiKQoKIyBSZWFkIFNpZXJyYSBOZXZhZGEgKEp1bidzKSBmbHV4IGRhdGEKdG1lLmN0bC5mbHguc3JhIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS1zaWVycmEvYXJjLXRtZS1zaWVycmEtZmx1eF8yMDIwLTA3LTMwLmNzdiIpCgojIFJlYWQgc3RvcmFnZSBkdXJhdGlvbiByZXNwaXJhdGlvbiBkYXRhCnRtZS50cnQudHMgPC0gcmJpbmQocmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtdG1lLXQyLWZsdXgvYXJjLXRtZS10Mi1mbHV4LTFfMjAyMC0wNC0yNy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICAgICAgICByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtdDItZmx1eC9hcmMtdG1lLXQyLWZsdXgtMl8yMDIwLTA0LTI3LmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkpCgojIFJlYWQgbWlzY2VsbGFuZW91cyBzdG9yYWdlIHRyZWF0bWVudCBkYXRhCnRtZS5taXNjIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS1taXNjL2FyYy10bWUtbWlzYy1pc29fMjAyMC0wNC0yOS5jc3YiKQpgYGAKCmBgYHtyIHN1bW1hcml6ZSBkYXRhLCBpbmNsdWRlID0gRkFMU0V9CiMgMy4gQ29tYmluZSBhbmQgc3VtbWFyaXplIGRhdGEgaW4gbG9uZyBmb3JtYXQgdG8gY2FsY3VsYXRlIHJlc3BpcmF0aW9uIHJhdGVzIGFuZCBwbG90IG92ZXIgdGltZQojIE5COiBzZXQgImluY2x1ZGUiIHRvIGZhbHNlIHRvIHN1cHByZXNzIGJpbmRfcm93cyB3YXJuaW5nIGFib3V0IGNvZXJjaW5nIGZhY3RvciB0byBjaGFyCiMgcmVtb3ZlIGZvcm11bGFfY2hlY2sgY29sdW1ucwppbnZpc2libGUobGlzdDJlbnYobGFwcGx5KGxpc3QoYXJjaGl2ZS5hcmMudHMgPSBhcmNoaXZlLmFyYy50cywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXdldC5jdGwudHMgPSByZXdldC5jdGwudHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3ZXQuZHJ5LnRzID0gcmV3ZXQuZHJ5LnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLnRydC50cyA9IHRtZS50cnQudHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgkZm9ybXVsYV9jaGVjayA8LSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgZW52aXIgPSAuR2xvYmFsRW52KQogICAgICAgICAgKQoKIyBBZGQgVHJlYXRtZW50IGNvbHVtbnMgdG8gZWFjaCBkYXRhc2V0CmFyY2hpdmUuYXJjLnRzJFRyZWF0bWVudCA8LSAiYWlyLWRyeSArIHN0b3JhZ2UiCmFyY2hpdmUuY3RsLnRzJFRyZWF0bWVudCA8LSAiY29udHJvbCIKdG1lLnRydC50cyRUcmVhdG1lbnQgPC0gInN0b3JhZ2UgZHVyYXRpb24iCnJld2V0LmN0bC50cyRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCnJld2V0LmRyeS50cyRUcmVhdG1lbnQgPC0gImFpci1kcnkiCgojIGNvbWJpbmUgcmV3ZXQgZGF0YQpyZXdldC50cyA8LSByYmluZChyZXdldC5jdGwudHMsIHJld2V0LmRyeS50cykKcmV3ZXQudHMkRXhwZXJpbWVudCA8LSAicmV3ZXQiCgojIGFkZCBzb2lsIGRyeSB3dCBkYXRhCmFyY2hpdmUuYXJjLnRzJGR3X2cgPC0gamFyaW5mby5hcmNbbWF0Y2goYXJjaGl2ZS5hcmMudHMkU2FtcGxlTmFtZSwgamFyaW5mby5hcmMkU2FtcGxlKSwgIlNvaWwuZHJ5LndlaWdodF8uZy4iXQphcmNoaXZlLmN0bC50cyRkd19nIDwtIGFyY2hpdmUuY3RsLnRzLndpZGVbbWF0Y2goYXJjaGl2ZS5jdGwudHMkSUQsIGFyY2hpdmUuY3RsLnRzLndpZGUkSUQpLCAiZHJ5X3NvaWxfd3RfY29ycmVjdGVkX2ciXQpyZXdldC50cyA8LSBtZXJnZShyZXdldC50cywgamFyaW5mby5yZXdldFsgLCBjKCJJRCIsICJUcmVhdG1lbnQiLCAiZHdfZyIpXSwgYnkgPSBjKCJJRCIsICJUcmVhdG1lbnQiKSkKdG1lLnRydC50cyA8LSBtZXJnZSh0bWUudHJ0LnRzLCBqYXJpbmZvLnRtZVsgLCBjKCJOci4iLCAiZHJ5LnNvaWwiKV0sIGJ5LnggPSAiU2FtcGxlTmFtZSIsIGJ5LnkgPSAiTnIuIikKY29sbmFtZXModG1lLnRydC50cylbd2hpY2gobmFtZXModG1lLnRydC50cykgPT0gImRyeS5zb2lsIildIDwtICJkd19nIgoKIyBhZGQgZXhwZXJpbWVudCBjb2wgdG8gYXJjaGl2ZS5hcmMudHMsIHN0b3JhZ2UudHJ0LnRzCmFyY2hpdmUuYXJjLnRzJEV4cGVyaW1lbnQgPC0gImFyYyIKdG1lLnRydC50cyRFeHBlcmltZW50IDwtICJ0bWUiCgojIGNvbWJpbmUgYXJjaGl2ZSBkYXRhIGFuZCBFeHBsb3JhdG9yaWVzIHN0b3JhZ2UgZHVyYXRpb24gZGF0YQphcmNoaXZlLnRzIDwtIHJiaW5kKGFyY2hpdmUuY3RsLnRzW3doaWNoKGFyY2hpdmUuY3RsLnRzJEV4cGVyaW1lbnQgIT0gInRtZSIpLCBdLCAKICAgICAgICAgICAgICAgICAgICBhcmNoaXZlLmFyYy50c1sgLCBuYW1lcyhhcmNoaXZlLmN0bC50cyldKQp0bWUudHMgPC0gcmJpbmQoYXJjaGl2ZS5jdGwudHNbd2hpY2goYXJjaGl2ZS5jdGwudHMkRXhwZXJpbWVudCA9PSAidG1lIiksIF0sCiAgICAgICAgICAgICAgICB0bWUudHJ0LnRzWyAsIG5hbWVzKGFyY2hpdmUuY3RsLnRzKV0pCgojIGJpbmQgdG1lLmN0bC5mbHguc3JhIGRhdGEgdG8gdG1lLnRzCiMgYWxsIG90aGVyIHRtZS5mbHggZGF0YSBpcyBhbHJlYWR5IHN1bW1hcml6ZWQKdG1lLmN0bC5mbHguc3JhJEV4cGVyaW1lbnQgPC0gInRtZSIKdG1lLmN0bC5mbHguc3JhJFRyZWF0bWVudCA8LSAiY29udHJvbCIKdG1lLmN0bC5mbHguc3JhJGR3X2cgPC0gdG1lLmN0bC5zb2lsLnNyYVttYXRjaCh0bWUuY3RsLmZseC5zcmEkSmFyX0lELCB0bWUuY3RsLnNvaWwuc3JhJEphcl9JRCksICJkd19nIl0KdG1lLnRzIDwtIHJiaW5kKHRtZS50cywgdG1lLmN0bC5mbHguc3JhWyAsIG5hbWVzKHRtZS50cyldKQoKIyBUZXN0IHRoYXQgcmVxdWlyZWQgbmFtZXMgYXJlIHByZXNlbnQKbm1zIDwtIGMoIlNhbXBsZU5hbWUiLCAiSUQiLCAiRXhwZXJpbWVudCIsICJUcmVhdG1lbnQiLCAiUGVyaW9kIiwgInRpbWVwb2ludF9jbXR2IiwgICJ0aW1lX2QiLCAidGltZV9kX2NtdHYiLCAibWdDTzJfamFyIiwgImR3X2ciKQppbnZpc2libGUobGFwcGx5KGxpc3QoYXJjaGl2ZS50cyA9IGFyY2hpdmUudHMsCiAgICAgICAgICAgICAgICAgICAgICByZXdldC50cyA9IHJld2V0LnRzLAogICAgICAgICAgICAgICAgICAgICAgdG1lLnRzKSwKICAgICAgIGZ1bmN0aW9uKHgpIHsKICAgICAgICAgaWZlbHNlKCFpcy5uYShtYXRjaChubXMsIG5hbWVzKHgpKSksICJ5ZXMiLCAibm8iKQogICAgICAgfQogICAgICAgKSkKCiMgY29tYmluZSBhbGwgZGF0YSBhbmQgcmVtb3ZlIHRpbWUgcG9pbnRzIHdpdGhvdXQgQ08yIG1lYXN1cmVtZW50cwp0cyA8LSBiaW5kX3Jvd3MoYXJjaGl2ZS50c1sgLCBubXNdLCByZXdldC50c1sgLCBubXNdLCB0bWUudHNbICwgbm1zXSkKaWYobGVuZ3RoKHdoaWNoKGlzLm5hKHRzJG1nQ08yX2phcikpKSA+IDApIHsKICB0cyA8LSB0c1std2hpY2goaXMubmEodHMkbWdDTzJfamFyKSksIF0KfQoKIyBhZGQgQyBjb250ZW50CiMgeHBscgp0cyRnQ19nUyA8LSB4cGxyLmNuW21hdGNoKHRzJElELCB4cGxyLmNuJEVQX1Bsb3RpZCksICJUb3RhbF9DIl0qMTBeLTMKIyBkdWtlCnRzW3doaWNoKGlzLm5hKHRzJGdDX2dTKSksICJnQ19nUyJdIDwtIHRtZS5jdGwuZHVrW21hdGNoKHRzW3doaWNoKGlzLm5hKHRzJGdDX2dTKSksICJJRCJdLCB0bWUuY3RsLmR1ayRJRCksICJDX2dfa2ciXSoxMF4tMwojIHNpZXJyYXMKdHNbd2hpY2goaXMubmEodHMkZ0NfZ1MpKSwgImdDX2dTIl0gPC0gdG1lLmN0bC5zb2lsLnNyYVttYXRjaCh0c1t3aGljaChpcy5uYSh0cyRnQ19nUykpLCAiSUQiXSwgdG1lLmN0bC5zb2lsLnNyYSRJRCksICJnQ19rZ1MiXSoxMF4tMwojIG9hayByaWRnZQp0c1t3aGljaChpcy5uYSh0cyRnQ19nUykpLCAiZ0NfZ1MiXSA8LSB0bWUuY3RsLm9ybmxbbWF0Y2godHNbd2hpY2goaXMubmEodHMkZ0NfZ1MpKSwgIklEIl0sIHRtZS5jdGwub3JubCRJRCksICJDX2dfa2ciXSAqIDEwXi0zCgojIGFkZCBUeXBlCnRzJFR5cGUgPC0gaWZlbHNlKGdyZXBsKCJHIiwgdHMkSUQpLCAiRyIsICJGIikKCiMgY2FsY3VsYXRlIENPMiByZXNwaXJhdGlvbiBpbiBtZ0NPMi1DIHBlciBnIHNvaWwgQwojIE5COiAxMi80NCA9IG1hc3MgcmF0aW8gb2YgQyBpbiBDTzIKdHMkbWdDTzIuQ19nQyA8LSAodHMkbWdDTzJfamFyKigxMi80NCkpLyh0cyRkd19nKnRzJGdDX2dTKQp0cyRtZ0NPMi5DX2dDX2QgPC0gdHMkbWdDTzIuQ19nQy90cyR0aW1lX2QKIyBzdW1tYXJpemUgQ08yIHJlbGVhc2UgZGF0YSBmb3IgZWFjaCB0aW1lcG9pbnQsIGJ5IGV4cGVyaW1lbnQsIHRyZWF0bWVudCwgYW5kIHR5cGUKdHMuYXZnIDwtIGRhdGEuZnJhbWUobmEub21pdCh0cykgJT4lCiAgc2VsZWN0KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYsIG1nQ08yLkNfZ0NfZCwgdGltZV9kX2NtdHYpICAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIHRpbWVwb2ludF9jbXR2KSAlPiUKICBhZGRfdGFsbHkoKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShzZV9zbG9wZSA9IG1nQ08yLkNfZ0NfZF9zZC9zcXJ0KG5fbWVhbiksCiAgICAgICAgIHNlX3Nsb3BlX2wgPSBtZ0NPMi5DX2dDX2RfbWVhbiAtIHNlX3Nsb3BlLAogICAgICAgICBzZV9zbG9wZV91ID0gbWdDTzIuQ19nQ19kX21lYW4gKyBzZV9zbG9wZSkpCiMgYWRkIHRpbWVwb2ludCB6ZXJvIGRhdGEKdHAwLmYgPC0gZnVuY3Rpb24oZGYpIHsKICB0cDAgPC0gZGZbMSwgXQogIHRwMFsgLCAtd2hpY2gobmFtZXModHAwKSA9PSAiRXhwZXJpbWVudCIgfCBuYW1lcyh0cDApID09ICJUcmVhdG1lbnQiIHwgbmFtZXModHAwKSA9PSAiVHlwZSIgfCBuYW1lcyh0cDApID09ICJuIildIDwtIDAKICByYmluZCh0cDAsIGRmKQp9CnRzLmF2ZyR0cmVhdC5FeHAgPC0gcGFzdGUodHMuYXZnJFRyZWF0bWVudCwgdHMuYXZnJEV4cGVyaW1lbnQpCnRzLmF2ZyA8LSBsYXBwbHkoc3BsaXQodHMuYXZnLCB0cy5hdmckdHJlYXQuRXhwKSwgZnVuY3Rpb24oeCkgewogIGxhcHBseShzcGxpdCh4LCB4JFR5cGUpLCB0cDAuZikKICB9KQp0cy5hdmcgPC0gYmluZF9yb3dzKGxhcHBseSh0cy5hdmcsIGJpbmRfcm93cykpCiMgcmVzdG9yZSBjbGFzc2VzCnRzLmF2ZyA8LSBhcy5kYXRhLmZyYW1lKGxhcHBseSh0cy5hdmcsIHR5cGUuY29udmVydCkpCiMgc2F2ZSBvYmplY3QKc2F2ZSh0cy5hdmcsIGZpbGUgPSAiLi90cy5hdmcuUkRhdGEiKQojIGF2ZXJhZ2UKdHMucHJlIDwtIHRzW3RzJFBlcmlvZCA9PSAicHJlIiwgXQp0cy5wcmUuYXZnIDwtIHRzLnByZSAlPiUKICBmaWx0ZXIodGltZV9kX2NtdHYgPiAzLjUpICU+JQogIHNlbGVjdChFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIHRpbWVwb2ludF9jbXR2LCBTYW1wbGVOYW1lLCBtZ0NPMi5DX2dDLCB0aW1lX2RfY210dikgICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYsIFNhbXBsZU5hbWUpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKG1nQ08yLkNfZ0NfZCA9IG1nQ08yLkNfZ0NfbWVhbi90aW1lX2RfY210dl9tZWFuKSAlPiUKICBzZWxlY3QoLVNhbXBsZU5hbWUsIC1tZ0NPMi5DX2dDX21lYW4sIEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgbWdDTzIuQ19nQ19kLCB0aW1lX2RfY210dl9tZWFuKSAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKHNlX3Nsb3BlID0gbWdDTzIuQ19nQ19kX3NkL3NxcnQobl9tZWFuKSwKICAgICAgICAgc2Vfc2xvcGVfbCA9IG1nQ08yLkNfZ0NfZF9tZWFuIC0gc2Vfc2xvcGUsCiAgICAgICAgIHNlX3Nsb3BlX3UgPSBtZ0NPMi5DX2dDX2RfbWVhbiArIHNlX3Nsb3BlKQp0cy5pbmMuYXZnIDwtIHRzICU+JQogIGZpbHRlcihQZXJpb2QgPT0gImluYyIpICU+JQogIHNlbGVjdChFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIHRpbWVwb2ludF9jbXR2LCBtZ0NPMi5DX2dDX2QsIHRpbWVfZF9jbXR2KSAgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlLCB0aW1lcG9pbnRfY210dikgJT4lCiAgYWRkX3RhbGx5KCkgJT4lCiAgc3VtbWFyaXNlX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoc2Vfc2xvcGUgPSBtZ0NPMi5DX2dDX2Rfc2Qvc3FydChuX21lYW4pLAogICAgICAgICBzZV9zbG9wZV9sID0gbWdDTzIuQ19nQ19kX21lYW4gLSBzZV9zbG9wZSwKICAgICAgICAgc2Vfc2xvcGVfdSA9IG1nQ08yLkNfZ0NfZF9tZWFuICsgc2Vfc2xvcGUpCmNvbG5hbWVzKHRzLnByZS5hdmcpW3doaWNoKG5hbWVzKHRzLnByZS5hdmcpICVpbiUgYygidGltZXBvaW50X2NtdHZfbWVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgInRpbWVfZF9jbXR2X21lYW5fbWVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgInRpbWVfZF9jbXR2X21lYW5fc2QiKSldIDwtIGMoInRpbWVwb2ludF9jbXR2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lX2RfY210dl9tZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lX2RfY210dl9zZCIpCgp0cy5wcmUuYXZnIDwtIHRzLnByZS5hdmdbICwgLXdoaWNoKCFuYW1lcyh0cy5wcmUuYXZnKSAlaW4lIG5hbWVzKHRzLmluYy5hdmcpKV0KCnRzLmF2ZzIgPC0gZGF0YS5mcmFtZShyYmluZCh0cy5wcmUuYXZnLCB0cy5pbmMuYXZnKSkKdHMuYXZnMiA8LSB0cy5hdmcyW2NvbXBsZXRlLmNhc2VzKHRzLmF2ZzIpLCBdCgojIGFkZCB0aW1lcG9pbnQgemVybyBkYXRhCnRzLmF2ZzIkdHJlYXQuRXhwIDwtIHBhc3RlKHRzLmF2ZzIkVHJlYXRtZW50LCB0cy5hdmcyJEV4cGVyaW1lbnQpCnRzLmF2ZzIgPC0gbGFwcGx5KHNwbGl0KHRzLmF2ZzIsIHRzLmF2ZzIkdHJlYXQuRXhwKSwgZnVuY3Rpb24oeCkgewogIGxhcHBseShzcGxpdCh4LCB4JFR5cGUpLCB0cDAuZikKICB9KQp0cy5hdmcyIDwtIGJpbmRfcm93cyhsYXBwbHkodHMuYXZnMiwgYmluZF9yb3dzKSkKCiMgcmVzdG9yZSBjbGFzc2VzCnRzLmF2ZzIgPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkodHMuYXZnMiwgdHlwZS5jb252ZXJ0KSkKc2F2ZSh0cy5hdmcyLCBmaWxlID0gIi4vdHMuYXZnMi5SZGF0YSIpCmBgYAoKIyBSZXN1bHRzCiMjIFJlc3BpcmF0aW9uIHJhdGVzCgoqbm90ZSB0aGF0IHRoZSB0ZXh0IGJlbG93IHdhcyBsZWZ0IGJlY2F1c2Ugc3RhdGlzdGljcyB3ZXJlIGNhbGN1bGF0ZWQgb24gdGhlIGZseSoKCmBgYHtyIHJlc3AtcmF0ZS1zdGF0cywgaW5jbHVkZSA9IEZBTFNFfQojIHJld2V0IG1heCByZXNwIHJhdGVzCnQudGVzdCgKICB0YXBwbHkodHNbdHMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIHRzJFBlcmlvZCA9PSAicHJlIiAmIHRzJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kIl0sIHRzW3RzJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cyRQZXJpb2QgPT0gInByZSIgJiB0cyRUeXBlID09ICJHIiwgIklEIl0sIG1heCwgbmEucm0gPSBUUlVFKSwKICB0YXBwbHkodHNbdHMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIHRzJFBlcmlvZCA9PSAicHJlIiAmIHRzJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kIl0sdHNbdHMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIHRzJFBlcmlvZCA9PSAicHJlIiAmIHRzJFR5cGUgPT0gIkYiLCAiSUQiXSwgbWF4LCBuYS5ybSA9IFRSVUUpKQojIyMgY3RsIHZzLiB0cnQgcHJlLWluYyByZXNwIG1heAojIyBFeHAuMSAKIyBHCnQudGVzdCgKICB1bmxpc3QoCiAgICB0cyAlPiUKICAgICAgZmlsdGVyKEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiBQZXJpb2QgPT0gInByZSIgJiBUeXBlID09ICJHIikgJT4lCiAgICAgIGdyb3VwX2J5KElEKSAlPiUKICAgICAgc3VtbWFyaXplKGFjcm9zcyhtZ0NPMi5DX2dDX2QsIG1heCkpICU+JQogICAgICBzZWxlY3QobWdDTzIuQ19nQ19kKSksCiAgdW5saXN0KAogICAgdHMgJT4lCiAgICAgIGZpbHRlcihFeHBlcmltZW50ID09ICJyZXdldCIgJiBUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgUGVyaW9kID09ICJwcmUiICYgVHlwZSA9PSAiRyIpICU+JQogICAgICBncm91cF9ieShJRCkgJT4lCiAgICAgIHN1bW1hcml6ZShhY3Jvc3MobWdDTzIuQ19nQ19kLCBtYXgpKSAlPiUKICAgICAgc2VsZWN0KG1nQ08yLkNfZ0NfZCkpLAogIHBhaXJlZCA9IFRSVUUpCiMgRgp0LnRlc3QoCiAgdW5saXN0KAogICAgdHMgJT4lCiAgICAgIGZpbHRlcihFeHBlcmltZW50ID09ICJyZXdldCIgJiBUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgUGVyaW9kID09ICJwcmUiICYgVHlwZSA9PSAiRiIpICU+JQogICAgICBncm91cF9ieShJRCkgJT4lCiAgICAgIHN1bW1hcml6ZShhY3Jvc3MobWdDTzIuQ19nQ19kLCBtYXgpKSAlPiUKICAgICAgc2VsZWN0KG1nQ08yLkNfZ0NfZCkpLAogIHVubGlzdCgKICAgIHRzICU+JQogICAgICBmaWx0ZXIoRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgVHJlYXRtZW50ID09ICJjb250cm9sIiAmIFBlcmlvZCA9PSAicHJlIiAmIFR5cGUgPT0gIkYiKSAlPiUKICAgICAgZ3JvdXBfYnkoSUQpICU+JQogICAgICBzdW1tYXJpemUoYWNyb3NzKG1nQ08yLkNfZ0NfZCwgbWF4KSkgJT4lCiAgICAgIHNlbGVjdChtZ0NPMi5DX2dDX2QpKSwKICBwYWlyZWQgPSBUUlVFKQojIyBFeHAuMiAKIyBHCnQudGVzdCgKICB1bmxpc3QoCiAgICB0cyAlPiUKICAgICAgZmlsdGVyKEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiBQZXJpb2QgPT0gInByZSIgJiBUeXBlID09ICJHIikgJT4lCiAgICAgIGdyb3VwX2J5KElEKSAlPiUKICAgICAgc3VtbWFyaXplKGFjcm9zcyhtZ0NPMi5DX2dDX2QsIG1heCkpICU+JQogICAgICBzZWxlY3QobWdDTzIuQ19nQ19kKSksCiAgdW5saXN0KAogICAgdHMgJT4lCiAgICAgIGZpbHRlcihFeHBlcmltZW50ID09ICJyZXdldCIgJiBUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgUGVyaW9kID09ICJwcmUiICYgVHlwZSA9PSAiRyIpICU+JQogICAgICBncm91cF9ieShJRCkgJT4lCiAgICAgIHN1bW1hcml6ZShhY3Jvc3MobWdDTzIuQ19nQ19kLCBtYXgpKSAlPiUKICAgICAgc2VsZWN0KG1nQ08yLkNfZ0NfZCkpLAogIHBhaXJlZCA9IFRSVUUpCiMgRgp0LnRlc3QoCiAgdW5saXN0KAogICAgdHMgJT4lCiAgICAgIGZpbHRlcihFeHBlcmltZW50ID09ICJyZXdldCIgJiBUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgUGVyaW9kID09ICJwcmUiICYgVHlwZSA9PSAiRiIpICU+JQogICAgICBncm91cF9ieShJRCkgJT4lCiAgICAgIHN1bW1hcml6ZShhY3Jvc3MobWdDTzIuQ19nQ19kLCBtYXgpKSAlPiUKICAgICAgc2VsZWN0KG1nQ08yLkNfZ0NfZCkpLAogIHVubGlzdCgKICAgIHRzICU+JQogICAgICBmaWx0ZXIoRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgVHJlYXRtZW50ID09ICJjb250cm9sIiAmIFBlcmlvZCA9PSAicHJlIiAmIFR5cGUgPT0gIkYiKSAlPiUKICAgICAgZ3JvdXBfYnkoSUQpICU+JQogICAgICBzdW1tYXJpemUoYWNyb3NzKG1nQ08yLkNfZ0NfZCwgbWF4KSkgJT4lCiAgICAgIHNlbGVjdChtZ0NPMi5DX2dDX2QpKSwKICBwYWlyZWQgPSBUUlVFKQojIyAKYGBgCgoqRXhwZXJpbWVudCAxIChhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQpKgoKQW1vbmcgdGhlIGFpci1kcnkgKyBzdG9yYWdlIHNhbXBsZXMsIHJlc3BpcmF0aW9uIHJhdGVzIHdlcmUgbW9yZSB0aGFuIHR3aWNlIGFzIGhpZ2ggaW4gZ3Jhc3NsYW5kIHNvaWxzIHRoYW4gaW4gZm9yZXN0IHNvaWxzLCByZWFjaGluZyBhIG1heGltdW0gb2YgYHIge3JvdW5kKG1heCh0cy5hdmdbdHMuYXZnJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmckVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIgJiB0cy5hdmckVHlwZSA9PSAiRyIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIG1nIENPfjJ+IGcgc29pbCBDXi0xXiBkXi0xXiBhZnRlciBgciB7cm91bmQodHMuYXZnW3doaWNoKHRzLmF2ZyRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnW3RzLmF2ZyRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiICYgdHMuYXZnJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdLDEpfWAgZCwgZm9sbG93ZWQgYnkgYSBzaGFycCBkZWNsaW5lLiBNZWFuIHJlc3BpcmF0aW9uIHJhdGVzIGluIGZvcmVzdCBzaXRlcyBwZWFrZWQgYXQgYHIge3JvdW5kKG1heCh0cy5hdmdbdHMuYXZnJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmckVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIgJiB0cy5hdmckVHlwZSA9PSAiRiIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIG1nIENPfjJ+IGcgc29pbCBDXi0xXiBkXi0xXiBhZnRlciBgciB7cm91bmQodHMuYXZnW3doaWNoKHRzLmF2ZyRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnW3RzLmF2ZyRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiICYgdHMuYXZnJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdLDEpfWAgZCwgZm9sbG93ZWQgYnkgYSBtdWNoIG1vcmUgZ3JhZHVhbCBkZWNsaW5lIHRoYW4gaW4gZ3Jhc3NsYW5kIHNpdGVzLiBDb250cm9sIHNhbXBsZXMgcmVzcG9uZGVkIG1vcmUgd2Vha2x5IGFuZCBtb3JlIGdyYWR1YWxseSB0byByZXdldHRpbmcsIGFsdGhvdWdoIGFzIGluIHRoZSB0cmVhdG1lbnQgc2FtcGxlcyByZXNwaXJhdGlvbiB3YXMgZ3JlYXRlciBpbiBncmFzc2xhbmQgc29pbHMgdGhhbiBpbiBmb3Jlc3Qgc29pbHMuIFBlYWsgcmVzcGlyYXRpb24gcmF0ZXMgZm9yIGNvbnRyb2wgaW5jdWJhdGlvbnMgd2VyZSBgciB7cm91bmQobWF4KHRzLmF2Z1t0cy5hdmckRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgdHMuYXZnJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBhbmQgYHIge3JvdW5kKG1heCh0cy5hdmdbdHMuYXZnJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmckVHJlYXRtZW50ID09ICJjb250cm9sIiAmIHRzLmF2ZyRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeIGFmdGVyIGByIHtyb3VuZCh0cy5hdmdbd2hpY2godHMuYXZnJG1nQ08yLkNfZ0NfZF9tZWFuID09IG1heCh0cy5hdmdbdHMuYXZnJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmckVHJlYXRtZW50ID09ICJjb250cm9sIiAmIHRzLmF2ZyRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pKSwgInRpbWVfZF9jbXR2X21lYW4iXSwxKX1gIGQgZm9yIGdyYXNzbGFuZCBhbmQgZm9yZXN0IHNvaWxzLCByZXNwZWN0aXZlbHkuCgoqRXhwZXJpbWVudCAyIChhaXItZHJ5IHRyZWF0bWVudCwgMjAxOSBzYW1wbGVzKSoKClBlYWsgcmVzcGlyYXRpb24gcmF0ZXMgd2VyZSBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgKHAgPiAwLjA1KSBiZXR3ZWVuIGZvcmVzdCBhbmQgZ3Jhc3NsYW5kIHNvaWxzIGluIEV4cGVyaW1lbnQgMiwgcGVha2luZyBhdCBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cy5hdmcyJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YC4wIGFuZCBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4gYWZ0ZXIgYHIge3JvdW5kKHRzLmF2ZzJbd2hpY2godHMuYXZnMiRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIHRzLmF2ZzIkVHlwZSA9PSAiRiIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSksICJ0aW1lX2RfY210dl9tZWFuIl0qMjQsMCl9YCBoIGZvciBncmFzc2xhbmQgYW5kIGZvcmVzdCBzb2lscywgcmVzcGVjdGl2ZWx5ICoqKEZpZy4gMSkqKi4KCmBgYHtyIENPMi1yZXNwLXJhdGVzLCBmaWcuaGVpZ2h0PTR9CiMgcGxvdHRlZCBhcyBtZWFzdXJlZAp0cy5hdmcgJT4lCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIpICU+JQogIGdncGxvdCguLCBhZXModGltZV9kX2NtdHZfbWVhbiwgbWdDTzIuQ19nQ19kX21lYW4pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNCwgY29sb3I9ImdyYXkiKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBzZV9zbG9wZV9sLCB5bWF4ID0gc2Vfc2xvcGVfdSwgZmlsbCA9IFR5cGUsIGxpbmV0eXBlID0gVHJlYXRtZW50LCBhbHBoYSA9IFRyZWF0bWVudCksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IFR5cGUsIHNoYXBlID0gVHJlYXRtZW50KSwgc2l6ZSA9IDIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gVHlwZSwgbGluZXR5cGUgPSBUcmVhdG1lbnQpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhFeHBlcmltZW50KSwKICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoRXhwZXJpbWVudCA9IGMoImFyYyIgPSAiMjAxMSIsICJyZXdldCIgPSAiMjAxOSIpKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTgpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICdTdGFuZGFyZCBlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9hbHBoYV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAuMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAuNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAuMikpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAnZGFzaGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSdzb2xpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gImRvdHRlZCIpLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJhaXItZHJ5IiA9ICJhaXItZHJ5L3Jld2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gImFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAiY29udHJvbC0xICgyMDExKVxuY29udHJvbC0yICgyMDE5KSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAxKSkgKwogIHlsYWIoZXhwcmVzc2lvbignUmVzcGlyYXRpb24gUmF0ZSAobWdDTydbMl0qJy1DIGdDJ14tMSonZCdeLTEqJyknKSkgKwogIHhsYWIoIlRpbWUgKGRheXMpIikgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvcmRlciA9IDEpLAogICAgICAgICBzaGFwZSA9IGd1aWRlX2xlZ2VuZChvcmRlciA9IDMpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgo+KipGaWcuIGByIHsoZmlnLm4gPC0gMSl9YC4gUmVzcGlyYXRpb24gcmF0ZXMgZm9yIEV4cGVyaW1lbnQgMSAoYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50LCAyMDExKSBhbmQgRXhwZXJpbWVudCAyIChhaXItZHJ5IG9ubHkgdHJlYXRtZW50LCAyMDE5KSoqCgo+KkNhcHRpb246KiBUb3AgcGFuZWwgc2hvd3MgZGF0YSBmcm9tIHNhbXBsZXMgY29sbGVjdGVkIGluIDIwMTEgZm9yIEV4cGVyaW1lbnQgMSAoYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50KSwgYm90dG9tIHBhbmVsIHNob3dzIGRhdGEgZnJvbSBzYW1wbGVzIGNvbGxlY3RlZCBpbiAyMDE5IGZvciBFeHBlcmltZW50IDIgKGFpci1kcnkgb25seSB0cmVhdG1lbnQpLiBWZXJ0aWNhbCBncmF5IGxpbmUgYXQgZGF5IDQgZGVtYXJjYXRlcyB0aGUgZW5kIG9mIHRoZSBwcmUtaW5jdWJhdGlvbiBwZXJpb2QgYW5kIHRoZSBzdGFydCBvZiB0aGUgZXF1aWxpYnJpdW0gcmVzcGlyYXRpb24gcGVyaW9kLiBQb2ludHMgc2hvdyBtZWFzdXJlbWVudHMgYW5kIGxpbmVzIHNob3cgdHJlbmRzIGluIG1lYW4gcmVzcGlyYXRpb24gcmF0ZS4gU2hhZGVkIHJpYmJvbnMgcmVwcmVzZW50IG9uZSBzdGFuZGFyZCBlcnJvci4gVGhlIGZpbmFsIG1lYXN1cmVtZW50IHBvaW50cyBmb3IgYSBmZXcgc2FtcGxlcyB3aGljaCB0b29rID4xOCBkYXlzIHRvIHJlYWNoIENPfjJ+IHRhcmdldHMgYXJlIGV4Y2x1ZGVkIGZvciBkaXNwbGF5IHJlYXNvbnM7IHJlc3BpcmF0aW9uIHJhdGVzIGZvciB0aG9zZSBzYW1wbGVzIHJlbWFpbmVkIGZsYXQuIE5vdGUgdGhhdCBoZWFkc3BhY2UgQ09+Mn4gY29uY2VudHJhdGlvbnMgZm9yIEV4cGVyaW1lbnQgMSBjb250cm9sIHNhbXBsZXMgd2VyZSBvbmx5IG1lYXN1cmVkIG9uY2UgZHVyaW5nIHRoZSBwcmUtaW5jdWJhdGlvbiBwZXJpb2QgKGRheSA0KSBpbiBjb250cmFzdCB0byBkYWlseSBtZWFzdXJlbWVudHMgZm9yIGFsbCBvdGhlciBzYW1wbGVzLiBDb25zZXF1ZW50bHkgdGhlIHJlc3BpcmF0aW9uIHJhdGUgZm9yIHRob3NlIHNhbXBsZXMgaXMgdGhlIGN1bXVsYXRpdmUgYXZlcmFnZSByYXRlIG92ZXIgdGhlIGZpcnN0IDQgZC4KCgoqU3VwcGxlbWVudGFsIHJlc3BpcmF0aW9uIHJhdGVzIGZpZ3VyZXM6KgoKKkV4cGVyaW1lbnQgMyAoc3RvcmFnZSBkdXJhdGlvbikqCgpHcmFzc2xhbmQgc29pbHMgZnJvbSB0aGUgc3RvcmFnZSBkdXJhdGlvbiB0cmVhdG1lbnQgZ3JvdXAgcmVzcG9uZGVkIHJhcGlkbHkgdG8gcmV3ZXR0aW5nIGFuZCByZWFjaGVkIHRhcmdldCBDT34yfiBsZXZlbHMgYWZ0ZXIganVzdCBgciB7cm91bmQodHMuYXZnMlt3aGljaCh0cy5hdmcyJG1nQ08yLkNfZ0NfZF9tZWFuID09IG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAidG1lIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJzdG9yYWdlIGR1cmF0aW9uIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRyIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSksICJ0aW1lX2RfY210dl9tZWFuIl0qMjQsMCl9YCBoIG9mIGluY3ViYXRpb24uIE9ubHkgYSBzaW5nbGUgb2JzZXJ2YXRpb24gd2FzIG1hZGUgZm9yIHRoZSBncmFzc2xhbmQgdHJlYW1lbnQgc2FtcGxlcyBkdWUgdG8gdGhlIHJhcGlkIHJlc3BpcmF0aW9uIHJhdGVzLCB3aGljaCBwZWFrZWQgYXQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAidG1lIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJzdG9yYWdlIGR1cmF0aW9uIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRyIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIG1nIENPfjJ+IGcgc29pbCBDXi0xXiBkXi0xXi4gVGhlIG1lYW4gcGVhayByZXNwaXJhdGlvbiByYXRlIGZvciBmb3Jlc3QgdHJlYXRtZW50IHNhbXBsZXMgd2FzIGxvd2VyIGFuZCBsYWdnZWQgaW4gY29tcGFyaXNvbiB0byB0aGUgZ3Jhc3NsYW5kIHNvaWxzLCByZWFjaGluZyBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJ0bWUiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gInN0b3JhZ2UgZHVyYXRpb24iICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeIGFmdGVyIGByIHtyb3VuZCh0cy5hdmcyW3doaWNoKHRzLmF2ZzIkbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJ0bWUiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gInN0b3JhZ2UgZHVyYXRpb24iICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pKSwgInRpbWVfZF9jbXR2X21lYW4iXSoyNCwwKX1gIGguCgpDb250cm9sLTMgcmVzcGlyYXRpb24gcmF0ZXMgcGVha2VkIGFmdGVyIHRoZSBwcmUtaW5jdWJhdGlvbiBwZXJpb2QgKGByIHtyb3VuZCh0cy5hdmcyW3doaWNoKHRzLmF2ZzIkbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJ0bWUiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgdHMuYXZnMiRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pKSwgInRpbWVfZF9jbXR2X21lYW4iXSoyNCwwKX1gIGgpLCBhdCBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJ0bWUiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgdHMuYXZnMiRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeLiBGb3Jlc3QgY29udHJvbCBzYW1wbGVzIHdlcmUgcHJlLWluY3ViYXRlZCB1bmRlciB2YXJpb3VzIGNvbmRpdGlvbnMsIGJ1dCByZXNwaXJhdGlvbiByYXRlcyB3ZXJlIG9ubHkgbWVhc3VyZWQgZHVyaW5nIHRoZSBwcmUtaW5jdWJhdGlvbiBwZXJpb2QgZm9yIHR3byBzYW1wbGVzIGZyb20gdGhlIFNpZXJyYSBOZXZhZGEgbW91bnRhaW5zIChVU0EpLiBJbiBnZW5lcmFsLCByZXNwaXJhdGlvbiByYXRlcyBmb3IgZm9yZXN0IGNvbnRyb2wgc2FtcGxlcyBpbiBFeHBlcmltZW50IDMgd2VyZSBtdWNoIGxvd2VyIHRoYW4gaW4gdGhlIHRyZWF0bWVudCBpbmN1YmF0aW9ucywgcGVha2luZyBhdCBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJ0bWUiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeIGFmdGVyIGByIHtyb3VuZCh0cy5hdmcyW3doaWNoKHRzLmF2ZzIkbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJ0bWUiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pKSwgInRpbWVfZF9jbXR2X21lYW4iXSoyNCwwKX1gIGguCgpgYGB7ciBDTzItZmx1eC1wbG90cy1TSS0xfQojIHJlc3BpcmF0aW9uIHJhdGVzIGZvciBleHBlcmltZW50IDMKdHMuYXZnICU+JQogIGZpbHRlcihFeHBlcmltZW50ID09ICJ0bWUiKSAlPiUKICBtdXRhdGUodGltZV9ocl9jbXR2X21lYW4gPSB0aW1lX2RfY210dl9tZWFuICogMjQsCiAgICAgICAgIG1nQ08yLkNfZ0NfaHJfbWVhbiA9IG1nQ08yLkNfZ0NfZF9tZWFuICogMjQsCiAgICAgICAgIHNlX3Nsb3BlX2wuaHIgPSBzZV9zbG9wZV9sICogMjQsCiAgICAgICAgIHNlX3Nsb3BlX3UuaHIgPSBzZV9zbG9wZV91ICogMjQpICU+JQogIGdncGxvdCguLCBhZXModGltZV9ocl9jbXR2X21lYW4sIG1nQ08yLkNfZ0NfaHJfbWVhbikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA0ICogMjQsIGNvbG9yPSJncmF5IikgKwogIGdlb21fcmliYm9uKGFlcyh5bWluID0gc2Vfc2xvcGVfbC5ociwgeW1heCA9IHNlX3Nsb3BlX3UuaHIsIGZpbGwgPSBUeXBlLCBsaW5ldHlwZSA9IFRyZWF0bWVudCwgYWxwaGEgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBUeXBlLCBzaGFwZSA9IFRyZWF0bWVudCkpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gVHlwZSwgbGluZXR5cGUgPSBUcmVhdG1lbnQpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhFeHBlcmltZW50KSwKICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoRXhwZXJpbWVudCA9IGMoImFyYyIgPSAiMjAxMSIsICJyZXdldCIgPSAiMjAxOSIpKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDQzMCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gJ1N0ZC4gRXJyLicsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9hbHBoYV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAuMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAuNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAuMikpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAnZGFzaGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSdzb2xpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gImRvdHRlZCIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAxKSkgKwogIHlsYWIoZXhwcmVzc2lvbignUmVzcGlyYXRpb24gUmF0ZSAobWdDTydbMl0qJy1DIGdDJ14tMSonaHInXi0xKicpJykpICsKICB4bGFiKCJUaW1lIChob3VycykiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKlN1cHBsZW1lbnRhbCBGaWcgYHIgeyhzZmlnLm4gPC0gMSl9YC4gUmVzcGlyYXRpb24gcmF0ZXMgZm9yIEV4cGVyaW1lbnQgMyoqCgo+KkNhcHRpb246KiBFeHBlcmltZW50IDMgc3RvcmFnZSBkdXJhdGlvbiB0cmVhdG1lbnQgc2FtcGxlcyB3ZXJlIG9ubHkgaW5jdWJhdGVkIGZvciBhIHNpbmdsZSBlbmNsb3N1cmUgcGVyaW9kLCBhcyB0aGUgcmVzdWx0cyBvZiBFeHBlcmltZW50IDEgYW5kIEV4cGVyaW1lbnQgMiBzaG93ZWQgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiAkXERlbHRhJF4xNF5DLUNPfjJ+IGJldHdlZW4gdGhlIHJld2V0dGluZyBwdWxzZSBDT34yfiByZWxlYXNlZCBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCBhbmQgdGhlIENPfjJ+IHJlc3BpcmVkIGR1cmluZyB0aGUgZXF1aWxpYnJpdW0gcmVzcGlyYXRpb24gcGVyaW9kLiBUaGUgZ3Jhc3NsYW5kIHN0b3JhZ2UgZHVyYXRpb24gdHJlYXRtZW50IHNhbXBsZXMgKGJsdWUgZGFzaGVkIGxpbmUpIHJlc3BpcmVkIGFuIGVxdWl2YWxlbnQgYW1vdW50IG9mIENPfjJ+IGluIGp1c3QgMyBkIGFzIHRoZSBjb3JyZXNwb25kaW5nIGNvbnRyb2wtMyBzYW1wbGVzIHJlc3BpcmVkIGR1cmluZyB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIGFuZCB0aGUgZXF1aWxpYnJpdW0gcmVzcGlyYXRpb24gcGVyaW9kIGNvbWJpbmVkLiBDb25zZXF1ZW50bHkgdGhvc2UgaW5jdWJhdGlvbnMgd2VyZSBzdG9wcGVkIGFmdGVyIHRoZSBmaXJzdCBDT34yfiBtZWFzdXJlbWVudCBwb2ludC4gQ29udHJvbC0zIHNhbXBsZXMgZGlkIHVuZGVyZ28gcHJlLWluY3ViYXRpb24sIGJ1dCBhcyB0aGUgQ09+Mn4gcmVsZWFzZSB3YXMgbm90IG1lYXN1cmVkIG5vciB3YXMgJFxEZWx0YSReMTReQy1DT34yfiBmb3IgdGhlIG1ham9yaXR5IG9mIHRoZSBzYW1wbGVzLCBhbGwgZGF0YSB3ZXJlIGF2ZXJhZ2VkIGJ5IGRheSBvZiBtZWFzdXJlbWVudC4gCgpQcmVpbmN1YmF0aW9uIGhlYWRzcGFjZSBDT34yfiBjb25jZW50YXRpb25zIHdlcmUgb25seSBtZWFzdXJlZCBvbmNlIGZvciB0aGUgY29udHJvbC0xIHNhbXBsZXMsIGF0IHRoZSBlbmQgb2YgdGhlIGZvdXI9ZGF5IHByZWluY3ViYXRpb24gcGVyaW9kLiBJbiBvcmRlciB0byBjb21wYXJlIHRoZSBjb250cm9sLTEgcmVzcGlyYXRpb24gcmF0ZXMgbW9yZSBlYXNpbHkgd2l0aCB0aGUgYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50IHNhbXBsZXMsIFN1cHBsZW1lbnRhbCBGaWd1cmUgMiBzaG93cyB0aGUgYWlyLWRyeSArIHN0b3JhZ2UgcHJlLWluY3ViYXRpb24gcmVzcGlyYXRpb24gcmF0ZXMgcGxvdHRlZCBhcyBhIGN1bXVsYXRpdmUgYXZlcmFnZSBmb3IgdGhlIHByZWluY3ViYXRpb24gcGVyaW9kLiBIb3dldmVyLCBhcyBjYW4gYmUgc2VlbiBpbiBGaWd1cmUgMSwgaGVhZHNwYWNlIENPfjJ+IGNvbmNlbnRyYXRpb24gd2FzIG1lYXN1cmVkIGRhaWx5IGZvciB0aGUgYWlyLWRyeSArIHN0b3JhZ2Ugc2FtcGxlcy4KCmBgYHtyIENPMi1mbHV4LXBsb3RzLVNJLTJ9CiMgTm90ZTogdGhpcyBjb2RlIHBsb3RzIGRhdGEgd2l0aCBwcmUtaW5jdWJhdGlvbiBvYnNlcnZhdGlvbnMgYXZlcmFnZWQKIyBQbG90IHJlc3AgcmF0ZXMgb3ZlciB0aW1lCnRzLmF2ZzIgJT4lCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIpICU+JQogIG11dGF0ZSh0aW1lX2hyX2NtdHZfbWVhbiA9IHRpbWVfZF9jbXR2X21lYW4gKiAyNCwKICAgICAgICAgbWdDTzIuQ19nQ19ocl9tZWFuID0gbWdDTzIuQ19nQ19kX21lYW4gKiAyNCwKICAgICAgICAgc2Vfc2xvcGVfbC5ociA9IHNlX3Nsb3BlX2wgKiAyNCwKICAgICAgICAgc2Vfc2xvcGVfdS5ociA9IHNlX3Nsb3BlX3UgKiAyNCkgJT4lCiAgZ2dwbG90KC4sIGFlcyh0aW1lX2hyX2NtdHZfbWVhbiwgbWdDTzIuQ19nQ19ocl9tZWFuKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDQgKiAyNCwgY29sb3I9ImdyYXkiKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBzZV9zbG9wZV9sLmhyLCB5bWF4ID0gc2Vfc2xvcGVfdS5ociwgZmlsbCA9IFR5cGUsIGxpbmV0eXBlID0gVHJlYXRtZW50LCBhbHBoYSA9IFRyZWF0bWVudCkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IFR5cGUsIHNoYXBlID0gVHJlYXRtZW50KSkgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBUeXBlLCBsaW5ldHlwZSA9IFRyZWF0bWVudCkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKEV4cGVyaW1lbnQpLAogICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihFeHBlcmltZW50ID0gYygiYXJjIiA9ICIyMDExIiwgInJld2V0IiA9ICIyMDE5IikpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgNDMwKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAnU3RkLiBFcnIuJywKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9IC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IC40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IC4yKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9ICdkYXNoZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9J3NvbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAiZG90dGVkIikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IDEpKSArCiAgeWxhYihleHByZXNzaW9uKCdSZXNwaXJhdGlvbiBSYXRlIChtZ0NPJ1syXSonLUMgZ0MnXi0xKidocideLTEqJyknKSkgKwogIHhsYWIoIlRpbWUgKGhvdXJzKSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqU3VwcGxlbWVudGFsIEZpZyBgciB7KHNmaWcubiArIDEpfWAuIFJlc3BpcmF0aW9uIHJhdGVzIGZvciBFeHBlcmltZW50IDEgYW5kIEV4cGVyaW1lbnQgMiBzaG93biB3aXRoIGFsbCBwcmUtaW5jdWJhdGlvbiBkYXRhIGNhbGN1bGF0ZWQgYXMgY3VtdWxhdGl2ZSBhdmVyYWdlcyoqCgo+KkNhcHRpb246KiBDT34yfiBjb25jZW50cmF0aW9ucyBmb3IgRXhwZXJpbWVudCAxIGNvbnRyb2wgc2FtcGxlcyB3ZXJlIG9ubHkgbWVhc3VyZWQgb25jZSBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCwgaW4gY29udHJhc3QgdG8gZGFpbHkgbWVhc3VyZW1lbnRzIGZvciBhbGwgb3RoZXIgc2FtcGxlcy4gUHJlLWluY3ViYXRpb24gcmVzcGlyYXRpb24gcmF0ZXMgYXJlIHNob3duIGhlcmUgY2FsY3VsYXRlZCBhcyBjdW11bGF0aXZlIGF2ZXJhZ2VzIGZvciB0aGUgcHVycG9zZSBvZiBmYWlyIGNvbXBhcmlzb24gYWNyb3NzIGFsbCB0cmVhdG1lbnRzLgoKIyMgUmFkaW9jYXJib24gZGF0YQoKYGBge3IgbG9hZCBhbXMtamVuYS1pbmdlc3QgZnh9CiMgMS4gUmVhZCBpbiBpc290b3BlIGRhdGEgZnJvbSB2YXJpb3VzIHNvdXJjZXMKIyBGaXJzdCBsb2FkIGhlbHBlciBmdW5jdGlvbnMgJ3JlYWRfamVuYV9hbXNfcmVzdWx0cy5SJywgJ3JlYWRfamVuYV9pc29fcmVzdWx0cy5SJyAKc291cmNlKCIuL3V0aWxpdGllcy9qZW5hX2Ftc19pbmdlc3QuUiIpCnNvdXJjZSgiLi91dGlsaXRpZXMvamVuYV9pc29faW5nZXN0LlIiKQpgYGAKCmBgYHtyIHJlYWQgaXNvIGRhdGEsIGluY2x1ZGUgPSBGQUxTRX0KIyAyLiBOZXh0IHJlYWQgaW4gZGF0YSBmcm9tIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcmllcyBpbiAnZGF0YS9yYXcnCiMgMTRDCiMgaWRlbnRpZnkgc3ViZGlyZWN0b3JpZXMgaW4gJ3JhdycgZGlyZWN0b3J5IHdpdGggImFtc19qZW5hIiBpbiBuYW1lCmFtc19qZW5hX3Jlc3VsdHNfZGlycyA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiYW1zX2plbmFfcmVzdWx0cyIsIGZ1bGwubmFtZXMgPSBUUlVFKQphbXNfcmVzdWx0c19scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGFtc19qZW5hX3Jlc3VsdHNfZGlycyksIGZ1bmN0aW9uKGkpIHsKICByZWFkX2plbmFfYW1zX3Jlc3VsdHMoYW1zX2plbmFfcmVzdWx0c19kaXJzW2ldKQp9KQpuYW1lcyhhbXNfcmVzdWx0c19scykgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImFtc19qZW5hX3Jlc3VsdHMiKQoKIyAxM0MKIyBpZGVudGlmeSBzdWJkaXJlY3RvcmllcyBpbiAncmF3JyBkaXJlY3Rvcnkgd2l0aCAiaXNvX2plbmEiIGluIG5hbWUKaXNvX2plbmFfcmVzdWx0c19kaXJzIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJpc29famVuYV9yZXN1bHRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpCmlzb19yZXN1bHRzX2xzIDwtIGxhcHBseShzZXFfYWxvbmcoaXNvX2plbmFfcmVzdWx0c19kaXJzKSwgZnVuY3Rpb24oaSkgewogIHJlYWRfamVuYV9pc29fcmVzdWx0cyhpc29famVuYV9yZXN1bHRzX2RpcnNbaV0pCn0pCm5hbWVzKGlzb19yZXN1bHRzX2xzKSA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiaXNvX2plbmFfcmVzdWx0cyIpCmBgYAoKYGBge3IgYXJjIGFuZCByZXdldCBleHBlcmltZW50IHRlbXBsYXRlfQojIDMuIENyZWF0ZSBhICJ0aWR5IiBzdHlsZSB0ZW1wbGF0ZSBmb3IgdGhlIGRhdGEsIGkuZS4gdmFyaWFibGVzIGluIGNvbHVtbnMuIAojIEtleSB2YXJpYWJsZXMgYXJlIGFzIGZvbGxvd3M6CiMgICAqIFNhbXBsZU5hbWUgKGluY29ycG9yYXRlcyBsYWIgcmVwIGFuZCB0cmVhdG1lbnQsIGUuZy4gIkhFRzEwLTFfZHJ5IikKIyAgICogSUQgKHBsb3QgSURzLCBlLmcuIGZvciAiSEVHMTAiIGZvciBFeHBsb3JhdG9yeSBzYW1wbGVzKQojICAgKiBUcmVhdG1lbnQgKDMgdHJlYXRtZW50czogYWlyLWRyeSwgYWlyLWRyeSArIHN0b3JhZ2UsIHN0b3JhZ2UgZHVyYXRpb247ICsgY29udHJvbHMpCiMgICAqIFR5cGUgKDIgbGV2ZWxzOiBGID0gZm9yZXN0LCBHID0gZ3Jhc3NsYW5kKQojICAgKiBQZXJpb2QgKGluY3ViYXRpb24gcGVyaW9kLCAyIGxldmVsczogcHJlID0gcHJlaW5jdWJhdGlvbiwgaW5jID0gZXF1aWxpYnJpdW0gaW5jdWJhdGlvbikKIyAgICogRXhwZXJpbWVudCAoMyBsZXZlbHM6IGFyYyA9IGFpci1kcnkgKyBzdG9yYWdlLCByZXdldCA9IGFpci1kcnkvcmV3ZXQsIHRpbWUgPSBzdG9yYWdlIGR1cmF0aW9uKQojIAojICogT2JzZXJ2YXRpb25hbCBjb2x1bW5zIGluY2x1ZGU6CiMgICAqIGQxNGMgKCRcRGVsdGEkXjE0XkMtQ09+Mn4pCiMgICAqIGQxM2MgKCRcZGVsdGEkXjEzXkMtQ09+Mn4pCiMgICAqIENfZ19rZyAoQyBjb250ZW50KQojICAgKiBkd19nIChkcnkgd2VpZ2h0KQojICAgKiBtZ0NPMi5DX2dTIChtZyBDT34yfi1DIHJlc3BpcmVkIGdeLTFeIHNvaWwgUGVyaW9kXi0xXikKIyAgICogdGltZV9kIChkYXlzIGluIGluY3ViYXRpb24gcGVyaW9kIHByaW9yIHRvIG1lYXN1cmVtZW50KQojICAgKiBkSDJPX2dyYXYgKHBlcmNlbnQgY2hhbmdlIGluIGdyYXZpbWV0cmljIHdhdGVyIGNvbnRlbnQgZHVlIHRvIGxhYm9yYXRvcnkgbW9pc3R1cmUgYWRqdXN0bWVudCkKIyAgICogZEgyT193aGMgKHBlcmNlbnQgY2hhbmdlIGluIHdhdGVyIGhvbGRpbmcgY2FwYWNpdHkgZHVlIHRvIGxhYm9yYXRvcnkgbW9pc3R1cmUgYWRqdXN0bWVudCkKdW5pcXVlLmlkLm4gPC0gYyhsZW5ndGgodW5pcXVlKGFyY2hpdmUudHNbYXJjaGl2ZS50cyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiU2FtcGxlTmFtZSJdKSksCiAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZShhcmNoaXZlLnRzW2FyY2hpdmUudHMkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIsICJTYW1wbGVOYW1lIl0pKSwKICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHJld2V0LmN0bC50cyRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZShyZXdldC5kcnkudHMkU2FtcGxlTmFtZSkpKQpwcmUuMTRjIDwtIGRhdGEuZnJhbWUoU2FtcGxlTmFtZSA9IGMoYXMuY2hhcmFjdGVyKHVuaXF1ZShhcmNoaXZlLnRzW2FyY2hpdmUudHMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgIlNhbXBsZU5hbWUiXSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHVuaXF1ZShhcmNoaXZlLnRzW2FyY2hpdmUudHMkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIsICJTYW1wbGVOYW1lIl0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUocmV3ZXQuY3RsLnRzJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUocmV3ZXQuZHJ5LnRzJFNhbXBsZU5hbWUpKSkpCnByZS4xNGMkSUQgPC0gc3Vic3RyKHByZS4xNGMkU2FtcGxlTmFtZSwgMSwgNSkKcHJlLjE0YyRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIHByZS4xNGMkSUQpLCAiRyIsICJGIikKcHJlLjE0YyRFeHBlcmltZW50IDwtIGMocmVwKCJhcmMiLCB1bmlxdWUuaWQublsxXSArIHVuaXF1ZS5pZC5uWzJdKSwKICAgICAgICAgICAgICAgICAgICAgICByZXAoInJld2V0IiwgdW5pcXVlLmlkLm5bM10gKyB1bmlxdWUuaWQubls0XSkpCnByZS4xNGMkVHJlYXRtZW50IDwtIGMocmVwKCJjb250cm9sIiwgdW5pcXVlLmlkLm5bMV0pLAogICAgICAgICAgICAgICAgICAgICAgIHJlcCgiYWlyLWRyeSArIHN0b3JhZ2UiLCB1bmlxdWUuaWQublsyXSksCiAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJjb250cm9sIiwgdW5pcXVlLmlkLm5bM10pLAogICAgICAgICAgICAgICAgICAgICAgIHJlcCgiYWlyLWRyeSIsIHVuaXF1ZS5pZC5uWzRdKSkKcHJlLjE0YyRQZXJpb2QgPC0gInByZSIKCiMgY3JlYXRlIGluYyBwZXJpb2QgZGYgYXMgZHVwbGljYXRlIG9mIHByZS1pbmMgZGYsIGJ1dCB0ZXN0IHRoYXQgaXQgaXMgdGhlIHJpZ2h0IHNoYXBlIGZpcnN0CmlmKG5yb3cocHJlLjE0YykgPT0gc3VtKHVuaXF1ZS5pZC5uKSAmIG5jb2wocHJlLjE0YykgPT0gNikgewogIGluYy4xNGMgPC0gcHJlLjE0YwogIGluYy4xNGMkUGVyaW9kIDwtICJpbmMiCn0gZWxzZSB7CiAgInByZS4xNGMgZGF0YSBmcmFtZSBtYWxmb3JtZWQiCn0KYWxsLjE0Yy50ZW1wbGF0ZSA8LSByYmluZChwcmUuMTRjLCBpbmMuMTRjKQpgYGAKCmBgYHtyIHRtZSBleHBlcmltZW50IHRlbXBsYXRlfQp1bmlxdWUuaWQudG1lLm4gPC0gYyhsZW5ndGgodW5pcXVlKHRtZS5jdGwuZHVrJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZSh0bWUuY3RsLm9ybmwkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHRtZS5jdGwuZmx4LnNyYSRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUodG1lLm1pc2MkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKGFyY2hpdmUuY3RsLnRzLndpZGVbYXJjaGl2ZS5jdGwudHMud2lkZSRFeHBlcmltZW50ID09ICJ0bWUiLCAiSUQiXSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHRtZS50cnQudHMkU2FtcGxlTmFtZSkpKQpwcmUudG1lLmN0bCA8LSBkYXRhLmZyYW1lKFNhbXBsZU5hbWUgPSBjKGFzLmNoYXJhY3Rlcih1bmlxdWUodG1lLmN0bC5kdWskU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUodG1lLmN0bC5vcm5sJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodW5pcXVlKHRtZS5jdGwuZmx4LnNyYSRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHVuaXF1ZSh0bWUubWlzYyRTYW1wbGVOYW1lKSksICAgYXMuY2hhcmFjdGVyKHVuaXF1ZShhcmNoaXZlLmN0bC50cy53aWRlW2FyY2hpdmUuY3RsLnRzLndpZGUkRXhwZXJpbWVudCA9PSAidG1lIiwgIklEIl0pKSkpCnByZS50bWUuY3RsJFNpdGUgPC0gYyhyZXAoIkR1a2UiLCB1bmlxdWUuaWQudG1lLm5bMV0pLAogICAgICAgICAgICAgICAgICAgICAgcmVwKCJPUk5MIiwgdW5pcXVlLmlkLnRtZS5uWzJdKSwKICAgICAgICAgICAgICAgICAgICAgIHJlcCgiU2llcnJhIiwgdW5pcXVlLmlkLnRtZS5uWzNdKSwKICAgICAgICAgICAgICAgICAgICAgIHJlcCgibWlzYyIsIHVuaXF1ZS5pZC50bWUubls0XSksCiAgICAgICAgICAgICAgICAgICAgICByZXAoIkhhaW5pY2giLCB1bmlxdWUuaWQudG1lLm5bNV0pKQoKCiMgRHVrZSwgT1JOTCwgbWlzYywgYW5kIFhwbHIgSURzCnByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIkR1a2UiIHwgCiAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiIHwKICAgICAgICAgICAgcHJlLnRtZS5jdGwkU2l0ZSA9PSAibWlzYyIgfAogICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJIYWluaWNoIiwgIklEIl0gPC0gYXMuY2hhcmFjdGVyKHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIkR1a2UiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIm1pc2MiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIkhhaW5pY2giLCAiU2FtcGxlTmFtZSJdKQoKIyBTaWVycmEgSURzCnByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIlNpZXJyYSIsICJJRCJdIDwtCiAgc3Vic3RyKHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIlNpZXJyYSIsICJTYW1wbGVOYW1lIl0sIDEwLCAxMSkKCiMgc3ViZGl2aWRlIE9STkwgaW50byBXQiBhbmQgVFZBCnByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiLCAiU2l0ZSJdIDwtIGlmZWxzZShncmVwbCgiVFZBIiwgcHJlLnRtZS5jdGxbcHJlLnRtZS5jdGwkU2l0ZSA9PSAiT1JOTCIsICJJRCJdKSwgIlRlbm5lc3NlZSBWYWxsZXkiLCAiV2Fsa2VyIEJyYW5jaCIpCgojIHN1YmRpdmlkZSBTaWVycmEgaW50byBNdXNpY2sgYW5kIFNoYXZlcgpwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiU2l0ZSJdIDwtIGlmZWxzZShncmVwbCgiTSIsIHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIlNpZXJyYSIsICJJRCJdKSwgIk11c2ljayIsICJTaGF2ZXIiKQoKIyBhZGQgdHJlYXRtZW50IGNvbApwcmUudG1lLmN0bCRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCgpwcmUudG1lLnRydCA8LSBkYXRhLmZyYW1lKFNhbXBsZU5hbWUgPSB1bmlxdWUodG1lLnRydC50cyRTYW1wbGVOYW1lKSkKcHJlLnRtZS50cnQkSUQgPC0gc3Vic3RyKHByZS50bWUudHJ0JFNhbXBsZU5hbWUsIDEsIG5jaGFyKGFzLmNoYXJhY3RlcihwcmUudG1lLnRydCRTYW1wbGVOYW1lKSktMikKcHJlLnRtZS50cnQgPC0gcmJpbmQocHJlLnRtZS50cnQsIHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIm1pc2MiLCBjKCJJRCIsICJTYW1wbGVOYW1lIildKQpwcmUudG1lLnRydCRUcmVhdG1lbnQgPC0gInN0b3JhZ2UgZHVyYXRpb24iCnByZS50bWUudHJ0JFNpdGUgPC0gcHJlLnRtZS5jdGxbbWF0Y2gocHJlLnRtZS50cnQkSUQsIHByZS50bWUuY3RsJElEKSwgIlNpdGUiXQoKcHJlLnRtZS4xNGMgPC0gcmJpbmQocHJlLnRtZS5jdGwsIHByZS50bWUudHJ0KQpwcmUudG1lLjE0YyRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIHByZS50bWUuMTRjJFNhbXBsZU5hbWUpLCAiRyIsICJGIikKcHJlLnRtZS4xNGMkUGVyaW9kIDwtICJwcmUiCnByZS50bWUuMTRjJEV4cGVyaW1lbnQgPC0gInRtZSIKCiMgY3JlYXRlIGluYyBwZXJpb2QgZGYKaW5jLnRtZS4xNGMgPC0gcHJlLnRtZS4xNGMKaW5jLnRtZS4xNGMkUGVyaW9kIDwtICJpbmMiCnRtZS4xNGMudGVtcGxhdGUgPC0gcmJpbmQocHJlLnRtZS4xNGMsIGluYy50bWUuMTRjKQpgYGAKCmBgYHtyIGNvbWJpbmUgc29pbCBvYnMgZGF0YX0KIyA0LiBTdW1tYXJpemUgb2JzZXJ2YXRpb25hbCBkYXRhIGZyb20gdGltZXNlcmllcyBkYXRhIGJ5IHVuaXF1ZSBJRHMgKFNhbXBsZU5hbWUpCiMgc3VtbWFyaXplIHRpbWUgYW5kIGNvMiBkYXRhIGJ5IGV4cGVyaW1lbnQsIHBlcmlvZCwgdHJlYXRtZW50LCBhbmQgc2FtcGxlIG5hbWUKdHMuZXBzbi5hdmcgPC0gdHMgJT4lCiAgc2VsZWN0KEV4cGVyaW1lbnQsIElELCBQZXJpb2QsIFRyZWF0bWVudCwgU2FtcGxlTmFtZSwgZ0NfZ1MsIGR3X2csIG1nQ08yLkNfZ0MsIHRpbWVfZCwgdGltZV9kX2NtdHYpICAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBJRCwgUGVyaW9kLCBUcmVhdG1lbnQsIFNhbXBsZU5hbWUpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtYXggPSBtYXgpLCBuYS5ybSA9IFRSVUUpCnRzLmVwc24uYXZnIDwtIHJlbmFtZV9hdCh0cy5lcHNuLmF2ZywgdmFycyhjb250YWlucygnbWF4JykpLCBsaXN0KH5zdWIoIl9tYXgiLCAiIiwgLikpKQpgYGAKCmBgYHtyIGNsZWFuIHVwIDE0QyBkYXRhfQojIDYuIENsZWFuIHVwIF4xNF5DIGRhdGEgYW5kIGFkZCBleHRlcm5hbCBkYXRhIHBvaW50cyAodG1lIGV4cGVyaW1lbnQsIFhwbHIgY29udHJvbCBzYW1wbGVzKQojIE5lZWQgdG8gYWRkIFNhbXBsZU5hbWUgY29sIGFuZCB2YXJpYWJsZSBjb2x1bW5zIFRyZWF0bWVudCwgUGVyaW9kLCBhbmQgRXhwZXJpbWVudCB0byBhbGwgZGF0YSBmcmFtZXMgaW4gYW1zX3Jlc3VsdHNfbHMgCgojIEZpcnN0IGFkZCAxNEMgYW5kIDEzQyBkYXRhIGZyb20gRXhwbG9yYXRvcmllcyBjb250cm9sIHNhbXBsZXMgdG8gYW1zX3Jlc3VsdHNfbHMKIyBub3RlIHRoYXQgbmVpdGhlciAxM0Mgbm9yIDE0QyB3YXMgbWVhc3VyZWQgZm9yIHRoZSBwcmUtaW5jdWJhdGlvbiBwZXJpb2QgZm9yIHRoZXNlIHNhbXBsZXMKIyBnZXQgbmFtZXMgZm9yIGFtc19yZXN1bHRzIGRhdGEgZnJhbWVzCnJlc3VsdHMuMTRjLm5tcyA8LSBuYW1lcyhhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGApCiMgZ2V0IG5hbWVzIGZvciByZWxldmFudCBFeHBlcmltZW50L1RyZWF0bWVudC9QZXJpb2QgY29tYmluYXRpb24KYXJjX2N0bF9pbmNfU04gPC0gYXMuY2hhcmFjdGVyKGFsbC4xNGMudGVtcGxhdGVbYWxsLjE0Yy50ZW1wbGF0ZSRFeHBlcmltZW50ID09ICJhcmMiICYgYWxsLjE0Yy50ZW1wbGF0ZSRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgYWxsLjE0Yy50ZW1wbGF0ZSRQZXJpb2QgPT0gImluYyIsICJTYW1wbGVOYW1lIl0pCnRtZV9jdGxfaW5jX3hwbHJfU04gPC0gdW5saXN0KGxhcHBseShhbXNfcmVzdWx0c19sc1sxOjJdLCBmdW5jdGlvbih4KSB1bmxpc3QobGFwcGx5KHgsICJbWyIsICJQcm9iZSIpKSkpCnRtZV9jdGxfaW5jX3hwbHJfU04gPC0gdG1lX2N0bF9pbmNfeHBscl9TTltncmVwKCJIRSIsIHRtZV9jdGxfaW5jX3hwbHJfU04pXQppZihsZW5ndGgodG1lX2N0bF9pbmNfeHBscl9TTikgPT0gMTQpIHsKICB0bWVfY3RsX2luY194cGxyX1NOIDwtIHVuaXF1ZShzdWJzdHIodG1lX2N0bF9pbmNfeHBscl9TTiwgMSwgbmNoYXIodG1lX2N0bF9pbmNfeHBscl9TTiktMikpCn0KCiMgYWRkIHN1Ymxpc3QgZm9yIEV4cGxvcmF0b3JpZXMgMjAxMSAoY29udHJvbCkgZGF0YSBhbmQgZGF0YSBmcmFtZXMgZm9yIGFib3ZlIHN1YnNldHMKYW1zX3Jlc3VsdHNfbHMkZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy5jbzJfMjAxMSRhcmNfY3RsX2luYyA8LSBkYXRhLmZyYW1lKG1hdHJpeChucm93ID0gbGVuZ3RoKGFyY19jdGxfaW5jX1NOKSwgbmNvbCA9IGxlbmd0aChyZXN1bHRzLjE0Yy5ubXMpKSkKYW1zX3Jlc3VsdHNfbHMkZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy5jbzJfMjAxMSR0bWVfY3RsX2luY194cGxyIDwtIGRhdGEuZnJhbWUobWF0cml4KG5yb3cgPSBsZW5ndGgodG1lX2N0bF9pbmNfeHBscl9TTiksIG5jb2wgPSBsZW5ndGgocmVzdWx0cy4xNGMubm1zKSkpCgojIGFkZCBuYW1lcyBhbmQgZmlsbCBTYW1wbGVOYW1lcyBmb3IgbmV3IGRhdGEgZnJhbWVzCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEgPC0gbGFwcGx5KAogIGFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEsIGZ1bmN0aW9uKGRmKSB7CiAgICBuYW1lcyhkZikgPC0gcmVzdWx0cy4xNGMubm1zCiAgICBkZiA8LSBkYXRhLmZyYW1lKAogICAgICBtYXBwbHkoRlVOID0gYXMsCiAgICAgICAgICAgICBkZiwgCiAgICAgICAgICAgICBzYXBwbHkoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgLCBjbGFzcyksCiAgICAgICAgICAgICBTSU1QTElGWSA9IEZBTFNFKSwKICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQogIHJldHVybihkZikKfSkKCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkYXJjX2N0bF9pbmNbICwgYygiU2FtcGxlTmFtZSIsIlByb2JlIildIDwtIGFyY19jdGxfaW5jX1NOCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkdG1lX2N0bF9pbmNfeHBsclsgLCBjKCJTYW1wbGVOYW1lIiwiUHJvYmUiKV0gPC0gdG1lX2N0bF9pbmNfeHBscl9TTgoKIyBmaWxsIDE0QyBkYXRhCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEgPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEsIGZ1bmN0aW9uKGRmKSB7CiAgZGYkYFguMTRDLi4uLmAgPC0geHBsci5jdGwuaXNvW21hdGNoKGRmJFByb2JlLCB4cGxyLmN0bC5pc28kRVBfUGxvdGlkKSwgIjE0Y19DTzIiXQogIGRmJFRyZWF0bWVudCA8LSAiY29udHJvbCIKICBkZiRQZXJpb2QgPC0gImluYyIKICByZXR1cm4oZGYpCn0pCgojIGFkZCBFeHBlcmltZW50CmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkYXJjX2N0bF9pbmMkRXhwZXJpbWVudCA8LSAiYXJjIgphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExJHRtZV9jdGxfaW5jX3hwbHIkRXhwZXJpbWVudCA8LSAidG1lIgoKCiMgYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTgtMTAtMTJgIGFuZCBgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOC0xMS0wOWAKIyBgQmVlbS1NaWxsZXJfNC54bHN4YCwgYEJlZW0tTWlsbGVyXzUueGxzeGA7IGBCZWVtLU1pbGxlcl82Lnhsc3hgLCBgQmVlbS1NaWxsZXJfNy54bHN4YAojIEFkZCB0cmVhdG1lbnQsIGV4cGVyaW1lbnQsIHBlcmlvZCBjb2xzCiMgRXhwZXJpbWVudCA9IHRtZQojIFRyZWF0bWVudCA9IHN0b3JhZ2UgZHVyYXRpb24KIyBQZXJpb2QgPSBpbmMKYW1zX3Jlc3VsdHNfbHNbMToyXSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbMToyXSwgZnVuY3Rpb24obHMpIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICBkZiRFeHBlcmltZW50IDwtICJ0bWUiCiAgZGYkVHJlYXRtZW50IDwtICJzdG9yYWdlIGR1cmF0aW9uIgogIGRmJFBlcmlvZCA8LSAiaW5jIgogIHJldHVybihkZikKICB9KQopCgojIGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YAojIGBCZWVtLU1pbGxlcl85Lnhsc3hgCiMgRXhwZXJpbWVudCA9IGFyYwojIFRyZWF0bWVudCA9IGFpci1kcnkgKyBzdG9yYWdlCiMgUGVyaW9kID0gcHJlCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YCRgQmVlbS1NaWxsZXJfOS54bHN4YCRTYW1wbGVOYW1lIDwtIGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YCRgQmVlbS1NaWxsZXJfOS54bHN4YCRQcm9iZQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGAkVHJlYXRtZW50IDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgJFBlcmlvZCA8LSAicHJlIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGAkRXhwZXJpbWVudCA8LSAiYXJjIgoKIyBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkCiMgQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeAojIEV4cGVyaW1lbnQgPSBhcmMKIyBUcmVhdG1lbnQgPSBhaXItZHJ5ICsgc3RvcmFnZQojIFBlcmlvZCA9IGluYwphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeCRTYW1wbGVOYW1lIDwtIHN1YnN0cihhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeCRQcm9iZSwgMSwgOSkKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gkVHJlYXRtZW50IDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gkUGVyaW9kIDwtICJpbmMiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAyLTI1YCRBcmNoaXZlZF9JbmN1YmF0aW9uc18zMC54bHN4JEV4cGVyaW1lbnQgPC0gImFyYyIKCiMgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDQtMzBgCiMgYFJvc3RfMzEtMi54bHN4YAojIEV4cGVyaW1lbnQgPSBhcmMKIyBUcmVhdG1lbnQgPSBhaXItZHJ5ICsgc3RvcmFnZQojIFBlcmlvZCA9IGluYywgcHJlIChTRVcxMS0yLTIpCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgJFNhbXBsZU5hbWUgPC0gc3Vic3RyKGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgJFByb2JlLCAxLCA5KQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YCRUcmVhdG1lbnQgPC0gImFpci1kcnkgKyBzdG9yYWdlIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YCRFeHBlcmltZW50IDwtICJhcmMiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgWzI6OSwgIlBlcmlvZCJdIDwtICJpbmMiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgWzEwLCAiUGVyaW9kIl0gPC0gInByZSIKCiMgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgCiMgUm9zdF80Ny54bHN4IAojIEV4cGVyaW1lbnQgPSByZXdldAojIFRyZWF0bWVudCA9IGNvbnRyb2wKIyBQZXJpb2QgPSBwcmUKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRTYW1wbGVOYW1lIDwtIHN1YnN0cihhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF80Ny54bHN4JFByb2JlLCAxLCA3KQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF80Ny54bHN4JFRyZWF0bWVudCA8LSAiY29udHJvbCIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRFeHBlcmltZW50IDwtICJyZXdldCIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRQZXJpb2QgPC0gInByZSIKIyBSb3N0XzUwLnhsc3gKIyBFeHBlcmltZW50ID0gcmV3ZXQKIyBUcmVhdG1lbnQgPSBjb250cm9sCiMgUGVyaW9kID0gaW5jCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkU2FtcGxlTmFtZSA8LSBzdWJzdHIoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTAueGxzeCRQcm9iZSwgMSwgNykKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTAueGxzeCRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkRXhwZXJpbWVudCA8LSAicmV3ZXQiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkUGVyaW9kIDwtICJpbmMiCiMgUm9zdF81Mi54bHN4CiMgRXhwZXJpbWVudCA9IHJld2V0CiMgVHJlYXRtZW50ID0gYWlyLWRyeQojIFBlcmlvZCA9IHByZSwgaW5jCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3gkU2FtcGxlTmFtZSA8LSBzdWJzdHIoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeCRQcm9iZSwgMSwgMTEpCnByZS5peCA8LSB3aGljaChncmVwbCgiUFJFIiwgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeCRQcm9iZSkpCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3gkVHJlYXRtZW50IDwtICJhaXItZHJ5IgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4JEV4cGVyaW1lbnQgPC0gInJld2V0IgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4W3ByZS5peCwgIlBlcmlvZCJdIDwtICJwcmUiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3hbLXByZS5peCwgIlBlcmlvZCJdIDwtICJpbmMiCmBgYAoKYGBge3IgY29tYmluZSAxNEMgc29pbCBvYnMgZGF0YX0KIyA3LiBDb21iaW5lIGRhdGEuCiMgZmxhdHRlbiBsaXN0IGFuZCByZW1vdmUgQU1TIGJsYW5rcywgTkEgc2FtcGxlcywgYW5kIG5vbi1FeHBsb3JhdG9yeSBkYXRhCmFtc19yZXN1bHRzX2FyY19yZXdldCA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbMzo3XSwgZnVuY3Rpb24oeCkgYmluZF9yb3dzKHgpKQphbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYgPC0gYmluZF9yb3dzKGxhcHBseShhbXNfcmVzdWx0c19hcmNfcmV3ZXQsIGZ1bmN0aW9uKHgpIGV4dHJhLmNsZWFuLmZ4KHgpKSkKCiMgZmxhdHRlbiBleHRlcm5hbCBkYXRhIGxpc3QKYW1zX3Jlc3VsdHNfdG1lIDwtIGxhcHBseShhbXNfcmVzdWx0c19sc1tjKDE6Miw3KV0sIGZ1bmN0aW9uKHgpIGxhcHBseSh4LCB0bWUuMTRjLmZ4KSkKYW1zX3Jlc3VsdHNfdG1lLmRmIDwtIGJpbmRfcm93cyhsYXBwbHkoYW1zX3Jlc3VsdHNfdG1lLCBmdW5jdGlvbih4KSBiaW5kX3Jvd3MoeCkpKQoKIyBjdXQgb3V0IG5vbi1yZWxldmFudCBBTVMgcmVzdWx0cyBjb2x1bW5zCm5tcy5hbXMudmFycyA8LSBjKCJGMTRDIiwgImVyciIsICJYLjE0Qy4uLi4iLCAiZXJyLi4uLiIsCiAgICAgICAgICAgICAgICAgIlNhbXBsZU5hbWUiLCAiVHJlYXRtZW50IiwgIlBlcmlvZCIsICJFeHBlcmltZW50IikKYW1zX3Jlc3VsdHNfYXJjX3Jld2V0LmRmIDwtIGFtc19yZXN1bHRzX2FyY19yZXdldC5kZlsgLCBubXMuYW1zLnZhcnNdCmNvbG5hbWVzKGFtc19yZXN1bHRzX2FyY19yZXdldC5kZikgPC0gYygiZm0iLCAiZm1fZXJyIiwgImQxNGMiLCAiZDE0Y19lcnIiLCBubXMuYW1zLnZhcnNbNTo4XSkKCmFtc19yZXN1bHRzX3RtZS5kZiA8LSBhbXNfcmVzdWx0c190bWUuZGZbICwgbm1zLmFtcy52YXJzXQpjb2xuYW1lcyhhbXNfcmVzdWx0c190bWUuZGYpIDwtIGMoImZtIiwgImZtX2VyciIsICJkMTRjIiwgImQxNGNfZXJyIiwgbm1zLmFtcy52YXJzWzU6OF0pCiAgICAgCiMgY29tcGxpY2F0ZWQsIGJ1dCB0aGUgZm9sbG93aW5nIGNoZWNrcyB0byBzZWUgaWY6CiMgMSkgVGhlIGVuZCBvZiB0aGUgc2FtcGxlIG5hbWUgc3RyaW5nIGlzICItbiIgd2hlcmUgIm4iIGlzIGEgbnVtYmVyCiMgMikgaWYgdHJ1ZSwgdGhlIGZpbmFsIHR3byBjaGFyYWN0ZXJzIGFyZSB0cmltbWVkCiMgMykgaWYgZmFsc2UsIHRoZSBuYW1lIGlzIHJldGFpbmVkIGFzIGlzIChlLmcuIGZvciB0bWUgY3RsIHNhbXBsZXMpCmFtc19yZXN1bHRzX3RtZS5kZiRJRCA8LSBpZmVsc2Uoc3Vic3RyKHN1YnN0cihhbXNfcmVzdWx0c190bWUuZGYkU2FtcGxlTmFtZSwgMSwgbmNoYXIoYW1zX3Jlc3VsdHNfdG1lLmRmJFNhbXBsZU5hbWUpLTEpLAogICAgICAgICAgICAgIG5jaGFyKHN1YnN0cihhbXNfcmVzdWx0c190bWUuZGYkU2FtcGxlTmFtZSwgMSwgbmNoYXIoYW1zX3Jlc3VsdHNfdG1lLmRmJFNhbXBsZU5hbWUpLTEpKSwKICAgICAgICAgICAgICBuY2hhcihzdWJzdHIoYW1zX3Jlc3VsdHNfdG1lLmRmJFNhbXBsZU5hbWUsIDEsIG5jaGFyKGFtc19yZXN1bHRzX3RtZS5kZiRTYW1wbGVOYW1lKS0xKSkpID09ICItIiwKICAgICAgIHN1YnN0cihhbXNfcmVzdWx0c190bWUuZGYkU2FtcGxlTmFtZSwgMSwgbmNoYXIoYW1zX3Jlc3VsdHNfdG1lLmRmJFNhbXBsZU5hbWUpLTIpLAogICAgICAgYW1zX3Jlc3VsdHNfdG1lLmRmJFNhbXBsZU5hbWUpCmFtc19yZXN1bHRzX3RtZS5kZiRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIGFtc19yZXN1bHRzX3RtZS5kZiRJRCksICJHIiwgIkYiKQoKIyBtZXJnZSBhcmMgYW5kIHJld2V0IDE0QyBkYXRhIHdpdGggdGVtcGxhdGUKaWYobnJvdyhtZXJnZShhbGwuMTRjLnRlbXBsYXRlLCBhbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYsIGFsbC54ID0gVFJVRSkpID09IG5yb3coYWxsLjE0Yy50ZW1wbGF0ZSkpIHsKICBhbGwuMTRjIDwtIG1lcmdlKGFsbC4xNGMudGVtcGxhdGUsIGFtc19yZXN1bHRzX2FyY19yZXdldC5kZiwgYWxsLnggPSBUUlVFKQp9IGVsc2UgewogIGNhdCgiZHVwbGljYXRlIHNhbXBsZSBtZXJnZSBlcnJvciIpCn0KCiMgbWVyZ2Ugc29pbCBvYnMgZGF0YSB3aXRoIDE0YyBkYXRhCmlmKG5yb3cobWVyZ2UoYWxsLjE0YywgdHMuZXBzbi5hdmcsIGJ5ID0gYygiU2FtcGxlTmFtZSIsICJQZXJpb2QiKSkpID09IG5yb3coYWxsLjE0YykpIHsKICBhbGwuMTRjIDwtIG1lcmdlKGFsbC4xNGMsIHRzLmVwc24uYXZnLCBhbGwueCA9IFRSVUUpCn0gZWxzZSB7CiAgY2F0KCJkdXBsaWNhdGUgc2FtcGxlIG1lcmdlIGVycm9yIikKfQoKIyBtZXJnZSB0bWUgMTRDIGRhdGEgd2l0aCB0ZW1wbGF0ZSBhbmQgdHMuZXBzbi5hdmcKdG1lLjE0YyA8LSBtZXJnZSh0bWUuMTRjLnRlbXBsYXRlLCBhbXNfcmVzdWx0c190bWUuZGYsIGFsbC54ID0gVFJVRSkKCiMgYWRkIGN0bCBzYW1wbGUgMTRDIGRhdGEgdG8gdG1lLjE0YwojIGZpcnN0IHJlbW92ZSBOQSB2YWx1ZXMKdG1lLjE0Yy5jbGVhbiA8LSB0bWUuMTRjW3doaWNoKCFpcy5uYSh0bWUuMTRjJGQxNGMpIHwgIWlzLm5hKHRtZS4xNGMkZm0pKSwgXQojIGRlZmluZSBtZXJnZSBmeAp0bWUubXJnLmZ4IDwtIGZ1bmN0aW9uKHgsIHkpIHsKICBtcmcubm1zIDwtIGMoIlNhbXBsZU5hbWUiLCAiSUQiLCAiVHJlYXRtZW50IiwgIlBlcmlvZCIpCiAgdmFyLm5tcyA8LSBjKCJZZWFyU2FtcGxlZCIsICJTaXRlIiwgIkhvcml6b24iLCAgImQxNGMiLCAiZm0iKQogIGlmKGxlbmd0aChncmVwKCJmbSIsIG5hbWVzKHkpKSkgPiAwKSB7CiAgICBkZiA8LSBtZXJnZSh4WyAsIG1yZy5ubXNdLCB5WyAsIGMobXJnLm5tcywgdmFyLm5tcyldKQogIH0gZWxzZSB7CiAgICBkZiA8LSBtZXJnZSh4WyAsIG1yZy5ubXNdLCB5WyAsIGMobXJnLm5tcywgdmFyLm5tc1sxOjRdKV0pCiAgICBkZiRmbSA8LSBOQQogIH0KICByZXR1cm4oZGYpCn0KCnRtZS4xNGMuZGYgPC0gc3VwcHJlc3NNZXNzYWdlcyhiaW5kX3Jvd3MobGFwcGx5KGxpc3QodG1lLmN0bC5kdWssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLmN0bC5mbHguc3JhW3doaWNoKCFpcy5uYSh0bWUuY3RsLmZseC5zcmEkZDE0YykpLCBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtZS5jdGwub3JubCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bWUubWlzYyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihpKSB0bWUubXJnLmZ4KHRtZS4xNGMsIGkpKSkpCgojIGFkZCBzdG9yYWdlIGR1cmF0aW9uIGRhdGEgZm9yIHRyZWF0bWVudCBzYW1wbGVzIGFuYWx5emVkIGV4dGVybmFsbHkKdG1lLjE0Yy5kZiRUeXBlIDwtICJGIgoKIyBhZGQgWWVhclNhbXBsZWQgZm9yIHRtZS4xNGMuY2xlYW4gc2FtcGxlcwpmb3IoaSBpbiAxOm5yb3codG1lLjE0Yy5jbGVhbikpIHsKICBpZih0bWUuMTRjLmNsZWFuW2ksICJTaXRlIl0gPT0gIkR1a2UiKSB7CiAgICB0bWUuMTRjLmNsZWFuW2ksICJZZWFyU2FtcGxlZCJdIDwtIDIwMDgKICB9IGVsc2UgaWYodG1lLjE0Yy5jbGVhbltpLCAiU2l0ZSJdID09ICJIYWluaWNoIikgewogICAgdG1lLjE0Yy5jbGVhbltpLCAiWWVhclNhbXBsZWQiXSA8LSAyMDExCiAgfSBlbHNlIGlmKHRtZS4xNGMuY2xlYW5baSwgIlNpdGUiXSA9PSAiTXVzaWNrIiB8IHRtZS4xNGMuY2xlYW5baSwgIlNpdGUiXSA9PSAiU2hhdmVyIikgewogICAgdG1lLjE0Yy5jbGVhbltpLCAiWWVhclNhbXBsZWQiXSA8LSAyMDA5CiAgfSBlbHNlIHsKICAgIHRtZS4xNGMuY2xlYW5baSwgIlllYXJTYW1wbGVkIl0gPC0gMjAwNAogIH0KfQoKIyBBZGQgSG9yaXpvbiB0byB0bWUuMTRjLmNsZWFuCnRtZS4xNGMuY2xlYW4kSG9yaXpvbiA8LSBpZmVsc2UodG1lLjE0Yy5jbGVhbiRJRCA9PSAiTUIiIHwgdG1lLjE0Yy5jbGVhbiRJRCA9PSAiU0IiLCAiQiIsICJBIikKCiMgY29tYmluZSB0bWUgZGF0YQp0bWUuMTRjIDwtIGJpbmRfcm93cyh0bWUuMTRjLmNsZWFuWyAsIG5hbWVzKHRtZS4xNGMuZGYpXSwgdG1lLjE0Yy5kZikKdG1lLjE0YyRFeHBlcmltZW50IDwtICJ0bWUiCgojIHJlbW92ZSBvdXRsaWVyIChNQS0xKQojICoqKiBOZWVkIHRvIGNsYXJpZnkgbWV0aG9kIGZvciBkZXRlcm1pbmluZyB0aGF0IHRoaXMgaXMgYW4gb3V0bGllciAqKiogCnRtZS4xNGMgPC0gdG1lLjE0Y1std2hpY2godG1lLjE0YyRTYW1wbGVOYW1lID09ICJNQS0xIiB8IHRtZS4xNGMkU2FtcGxlTmFtZSA9PSAiSEVXNDktMSIgfCB0bWUuMTRjJFNhbXBsZU5hbWUgPT0gIkhFVzI2LTEiKSwgXQoKCiMgQWRkIG1pc3NpbmcgdmFyaWFibGUgY29sdW1ucyB0byBhbGwuMTRjCiMgYWRkIFllYXJTYW1wbGVkIGNvbHVtbgphbGwuMTRjJFllYXJTYW1wbGVkIDwtIGlmZWxzZShhbGwuMTRjJEV4cGVyaW1lbnQgPT0gImFyYyIsIDIwMTEsIDIwMTkpCgojIGFkZCBTaXRlIGFuZCBIb3Jpem9uIGNvbHVtbnMKYWxsLjE0YyRTaXRlIDwtIGlmZWxzZShncmVwbCgiSEUiLCBhbGwuMTRjJElEKSwgIkhhaW5pY2giLCAiU2Nob3JmaGVpZGUiKQphbGwuMTRjJEhvcml6b24gPC0gIkEiCgoKIyBjb21iaW5lIHRtZS4xNGMgYW5kIGFsbC4xNGMgaW50byBhIGxpc3QgYW5kIGNhbGN1bGF0ZSBmcmFjdGlvbiBtb2Rlcm4gZnJvbSBkMTRDIGFzIG5lZWRlZAphbGwuMTRjLmxzIDwtIGxhcHBseShsaXN0KHRtZS4xNGMsIGFsbC4xNGMpLCBmdW5jdGlvbihkZikgewogIGRmJGZtIDwtIGlmZWxzZShpcy5uYShkZiRmbSksCiAgICAgICAgICAgICAgICAgIGQxNGMuZm0uZngoZGYkWWVhclNhbXBsZWQsIGRmJGQxNGMpLAogICAgICAgICAgICAgICAgICBkZiRmbSkKICBkZiRkMTRjX2NvcnIgPC0gZGVjYXkuY29yci5meChkZiRZZWFyU2FtcGxlZCwgZGYkZm0pCiAgcmV0dXJuKGRmKQp9KQoKYWxsLjE0Yy5zdW0gPC0gbGFwcGx5KGFsbC4xNGMubHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGYuc3VtIDwtIHNlbGVjdChkZiwgLVNhbXBsZU5hbWUpICU+JQogICAgZ3JvdXBfYnkoSUQsIFR5cGUsIFBlcmlvZCwgVHJlYXRtZW50LCBFeHBlcmltZW50LCBTaXRlLCBIb3Jpem9uLCBZZWFyU2FtcGxlZCkgJT4lCiAgICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4sIG1heCA9IG1heCwgbWluID0gbWluLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKQogIGRmLnN1bVttYXBwbHkoaXMuaW5maW5pdGUsIGRmLnN1bSldIDwtIE5BCiAgcmV0dXJuKGRmLnN1bSkKfSkKYWxsLjE0Yy5zdW0gPC0gcmFwcGx5KGFsbC4xNGMuc3VtLCBmID0gZnVuY3Rpb24oeCkgaWZlbHNlKGlzLm5hbih4KSwgTkEgLCB4KSwgaG93ID0gInJlcGxhY2UiKQphbGwuMTRjLnN1bS5kZiA8LSBzdXBwcmVzc01lc3NhZ2VzKGJpbmRfcm93cyhhbGwuMTRjLnN1bSkpCmBgYAoKYGBge3IgcmVhZC1jYWxjLTEzY30KIyBDbGVhbiB1cCAxM0MgZGF0YQojIE5vdGUgdGhhdCBpc28gZGF0YSBJRHMgc2hvdWxkIGJlIHN0b3JlZCBhcyB0aGUgInByZXBhcmF0aW9uIiB2YXJpYWJsZQoKIyBmaXJzdCBjcmVhdGUgYSBsaWJyYXJ5IG9mIHBvc3NpYmxlIElEcwphbGwuaWRzIDwtIHVuaXF1ZShjKGFsbC4xNGMudGVtcGxhdGUkSUQsIHRtZS4xNGMudGVtcGxhdGUkSUQpKQoKIyBmdW5jdGlvbiB0byBzdHJpcCBvdXQgYWxsIHZhbHVlcyBub3QgY29ycmVzcG9uZGluZyB0byBrbm93biBJRHMgYW5kIHJldHVybiBtZWFuIG9mIGR1cGxpY2F0ZXMKY2xlYW4uaXNvIDwtIGZ1bmN0aW9uKGRmKSB7CiAgCiAgIyBzdHJpcCBvdXQgbm9uIGFyYy1pbmMgZGF0YQogIGl4IDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoYWxsLmlkcykpCiAgZm9yKGkgaW4gc2VxX2Fsb25nKGFsbC5pZHMpKSB7CiAgICBpZihhbnkoZ3JlcGwoYWxsLmlkc1tpXSwgZGYkcHJlcGFyYXRpb24pKSkgewogICAgICBpeFtbaV1dIDwtIHdoaWNoKGdyZXBsKGFsbC5pZHNbaV0sIGRmJHByZXBhcmF0aW9uKSkKICAgIH0gCiAgfQogIAogIGl4IDwtIHVubGlzdChpeCkKICAKICAjIGNvbnZlcnQgMTNDIGNvbCB0byBudW1lcmljCiAgZGYgPC0gZGF0YS5mcmFtZShkZltpeCwgXSkKICBkZiRvZmZzZXQuY29yci5zYW1wbGUgPC0gYXMubnVtZXJpYyhkZiRvZmZzZXQuY29yci5zYW1wbGUpCiAgCiAgIyBjb252ZXJ0IHRvIGRhdGEgZnJhbWUgZnJvbSB0aWJibGUKICBkZiA8LSBkYXRhLmZyYW1lKGRmKQogIAogICMgYXZlcmFnZSBkdXBsaWNhdGVzCiAgZDEzYyA8LSB2ZWN0b3IoKQogIGZvcihpIGluIHNlcV9hbG9uZyhkZiRwcmVwYXJhdGlvbikpIHsKICAgICAgICBpZihpICE9IG5yb3coZGYpKSB7CiAgICAgICAgICBkMTNjW2ldIDwtIGlmZWxzZShkZltpLCAicHJlcGFyYXRpb24iXSA9PSBkZltpICsgMSwgInByZXBhcmF0aW9uIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuKGRmW2ksICJvZmZzZXQuY29yci5zYW1wbGUiXSwgZGZbaSsxLCAib2Zmc2V0LmNvcnIuc2FtcGxlIl0sIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkKICAgICAgfQogIH0KICBkZiA8LSBkZltjb21wbGV0ZS5jYXNlcyhkZiRvZmZzZXQuY29yci5zYW1wbGUpLCBdCiAgcmV0dXJuKGRhdGEuZnJhbWUoU2FtcGxlTmFtZSA9IHVuaXF1ZShkZiRwcmVwYXJhdGlvbiksCiAgICAgICAgICAgICAgICAgICAgZDEzYyA9IGQxM2NbY29tcGxldGUuY2FzZXMoZDEzYyldKSkKfQoKaXNvX3Jlc3VsdHNfbHNfY2xlYW4gPC0gbGFwcGx5KGlzb19yZXN1bHRzX2xzLCBmdW5jdGlvbihkZikgewogIGxhcHBseShkZiwgY2xlYW4uaXNvKQp9KQoKIyBhZGQgaW4gRXhwZXJpbWVudCwgdHJlYXRtZW50LCBwZXJpb2QsIGV0Yy4KIyAxLiBpc29famVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTIyCiMjIDEzQ19hcmNoaXZlY0luY19QcmVfMjAxODEyMDctMTQxNjkxLTE0MTc1MS54bHMKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzFdXVtbMV1dWyJQZXJpb2QiXSA8LSAicHJlIgppc29fcmVzdWx0c19sc19jbGVhbltbMV1dW1sxXV1bIkV4cGVyaW1lbnQiXSA8LSAiYXJjIgppc29fcmVzdWx0c19sc19jbGVhbltbMV1dW1sxXV1bIlRyZWF0bWVudCJdIDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKCiMjIDEzQ19hcmNoaXZlZEluY18yMDE5MDExNi0xNDIwMTItMTQyMDcyLnhscwppc29fcmVzdWx0c19sc19jbGVhbltbMV1dW1syXV1bIlBlcmlvZCJdIDwtICJpbmMiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1sxXV1bWzJdXVsiRXhwZXJpbWVudCJdIDwtICJhcmMiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1sxXV1bWzJdXVsiVHJlYXRtZW50Il0gPC0gImFpci1kcnkgKyBzdG9yYWdlIgoKIyAyLiBpc29famVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTIzCiMjIDIwMTkwMTIyLU1hbnVlbFJvc3QtMTQyMDgyLTE0MTU1My54bHNgCmlzb19yZXN1bHRzX2xzX2NsZWFuW1syXV1bWzFdXVsiUGVyaW9kIl0gPC0gImluYyIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzJdXVtbMV1dWyJFeHBlcmltZW50Il0gPC0gImFyYyIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzJdXVtbMV1dWyJUcmVhdG1lbnQiXSA8LSAiYWlyLWRyeSArIHN0b3JhZ2UiCgojIDMuIGlzb19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDktMTAKIyMgMjAxOTA5MDktMldoLUplZmZyZXlfQmVlbS1NaWxsZXItMTM2MTMtMTM2NTgueGxzCmlzb19yZXN1bHRzX2xzX2NsZWFuW1szXV1bWzFdXVsiUGVyaW9kIl0gPC0gInByZSIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzNdXVtbMV1dWyJFeHBlcmltZW50Il0gPC0gInJld2V0Igppc29fcmVzdWx0c19sc19jbGVhbltbM11dW1sxXV1bIlRyZWF0bWVudCJdIDwtICJjb250cm9sIgoKIyA0LiBpc29famVuYV9yZXN1bHRzLWNvMl8yMDE5LTA5LTExCiMjIDIwMTkwOTEwLUplZmZyZXlfQmVlbS1NaWxsZXItMTM2NjQtMTM3MDIueGxzCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s0XV1bWzFdXVsiUGVyaW9kIl0gPC0gImluYyIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzRdXVtbMV1dWyJFeHBlcmltZW50Il0gPC0gInJld2V0Igppc29fcmVzdWx0c19sc19jbGVhbltbNF1dW1sxXV1bIlRyZWF0bWVudCJdIDwtICJjb250cm9sIgoKIyA1LiBpc29famVuYV9yZXN1bHRzLWNvMl8yMDE5LTEyLTA0CiMjIDIwMTkxMTI2LU1Sb3N0LUJlZW1NaWxsZXItMTc1MDktMTc1NTUueGxzCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s1XV1bWzFdXVsiUGVyaW9kIl0gPC0gImluYyIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzVdXVtbMV1dWyJFeHBlcmltZW50Il0gPC0gInJld2V0Igppc29fcmVzdWx0c19sc19jbGVhbltbNV1dW1sxXV1bIlRyZWF0bWVudCJdIDwtICJhaXItZHJ5IgoKIyA2LiBpc29famVuYV9yZXN1bHRzLWNvMl8yMDE5LTEyLTIxCiMjIDIwMTkwMjEzLU1hbnVlbFJvc3QtMTQzMTkyLTE0MzI5NC54bHMKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzZdXVtbMV1dWyJQZXJpb2QiXSA8LSAiaW5jIgppc29fcmVzdWx0c19sc19jbGVhbltbNl1dW1sxXV1bIkV4cGVyaW1lbnQiXSA8LSAiYXJjIgppc29fcmVzdWx0c19sc19jbGVhbltbNl1dW1sxXV1bIlRyZWF0bWVudCJdIDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKCiMjIDIwMTkxMTA2LU1Sb3N0LTE2OTI1LTE2OTUyLnhscwppc29fcmVzdWx0c19sc19jbGVhbltbNl1dW1syXV1bIlBlcmlvZCJdIDwtICJpbmMiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s2XV1bWzJdXVsiRXhwZXJpbWVudCJdIDwtICJyZXdldCIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzZdXVtbMl1dWyJUcmVhdG1lbnQiXSA8LSAiY29udHJvbCIKCiMjIEFyY0luY19kcnlfMTNDLnhscwppc29fcmVzdWx0c19sc19jbGVhbltbNl1dW1szXV1bIlBlcmlvZCJdIDwtICJwcmUiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s2XV1bWzNdXVsiRXhwZXJpbWVudCJdIDwtICJyZXdldCIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzZdXVtbM11dWyJUcmVhdG1lbnQiXSA8LSAiYWlyLWRyeSIKCiMgRmxhdHRlbiBsaXN0Cmlzb19kZiA8LSBzdXBwcmVzc1dhcm5pbmdzKGJpbmRfcm93cyh1bmxpc3QoaXNvX3Jlc3VsdHNfbHNfY2xlYW4sIHJlY3Vyc2l2ZSA9IEZBTFNFKSkpCgojIGV4dHJhY3Qgb3JpZ2luYWwgSURzCm9nLnNuIDwtIHZlY3RvcigpCmZvcihpIGluIHNlcV9hbG9uZyhpc29fZGYkU2FtcGxlTmFtZSkpIHsKICBvZy5zbltpXSA8LSBpZmVsc2UoZ3JlcGwoIkhFIiwgaXNvX2RmJFNhbXBsZU5hbWVbaV0pLAogICAgICAgICAgICAgICAgICAgICBzdWJzdHIoaXNvX2RmJFNhbXBsZU5hbWVbaV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSB1bmxpc3QoZ3JlZ2V4cHIoIkhFIiwgaXNvX2RmJFNhbXBsZU5hbWVbaV0pKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wID0gdW5saXN0KGdyZWdleHByKCJIRSIsIGlzb19kZiRTYW1wbGVOYW1lW2ldKSkgKyA0KSwKICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKGlzb19kZiRTYW1wbGVOYW1lW2ldLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gdW5saXN0KGdyZWdleHByKCJTRSIsIGlzb19kZiRTYW1wbGVOYW1lW2ldKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHVubGlzdChncmVnZXhwcigiU0UiLCBpc29fZGYkU2FtcGxlTmFtZVtpXSkpICsgNCkpCn0KaXNvX2RmJElEIDwtIG9nLnNuCmlzb19kZiRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIGlzb19kZiRJRCksICJHIiwgIkYiKQoKIyBhZGQgY29udHJvbCBzYW1wbGUgMTNDIGZvciBhcmMgZXhwZXJpbWVudAphcmMuY3RsLmluYy5JRHMgPC0gdW5pcXVlKGlzb19kZltpc29fZGYkRXhwZXJpbWVudCA9PSAiYXJjIiAmIGlzb19kZiRQZXJpb2QgPT0gImluYyIsICJJRCJdKQphcmMuY3RsLmluYy4xM2MgPC0gZGF0YS5mcmFtZShJRCA9IGFyYy5jdGwuaW5jLklEcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlTmFtZSA9IGFyYy5jdGwuaW5jLklEcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEzYyA9IHhwbHIuY3RsLmlzb1t3aGljaCghaXMubmEobWF0Y2goeHBsci5jdGwuaXNvJEVQX1Bsb3RpZCwgYXJjLmN0bC5pbmMuSURzKSkpLCAiMTNjX0NPMiJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlcmltZW50ID0gImFyYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmlvZCA9ICJpbmMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVhdG1lbnQgPSAiY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPSBpZmVsc2UoZ3JlcGwoIkciLCBhcmMuY3RsLmluYy5JRHMpLCAiRyIsICJGIikpCmlzb19kZiA8LSByYmluZChpc29fZGYsIGFyYy5jdGwuaW5jLjEzYykKIyBnZ3Bsb3QoaXNvX2RmLCBhZXMoSUQsIGQxM2MsIGNvbG9yID0gVHJlYXRtZW50LCBzaGFwZSA9IFBlcmlvZCkpICsKIyAgICAgZ2VvbV9wb2ludChzaXplID0gMykgKwojICAgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKEV4cGVyaW1lbnQpKSArCiMgICAgIHRoZW1lX2J3KCkKYGBgCgoKYGBge3IgY291bnRzIGZvciBjaGVja2luZyBwbG90cywgaW5jbHVkZSA9IEZBTFNFfQojIDguIENvdW50IG51bWJlciBvZiBeMTReQyBvYnNlcnZhdGlvbnMgZm9yIGNoZWNraW5nIHBsb3RzLgojIGNvdW50ICFpcy5uYSgxNEMpIGNhc2VzIGJ5IFNhbXBsZU5hbWUKYWxsLjE0Y1std2hpY2goaXMubmEoYWxsLjE0YyRkMTRjX2NvcnIpKSxdICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgUGVyaW9kLCBUeXBlKSAlPiUKICBjb3VudCgpCiMgYnkgSUQKYWxsLjE0Y1std2hpY2goaXMubmEoYWxsLjE0YyRkMTRjX2NvcnIpKSxdICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgUGVyaW9kLCBUeXBlKSAlPiUKICBkaXN0aW5jdChJRCkgJT4lCiAgY291bnQoKQpgYGAKCipQcmUtaW5jdWJhdGlvbiB2ZXJzdXMgZXF1aWxpYnJpdW0gcmVzcGlyYXRpb24gXjE0XkMtQ09+Mn4qCgpgYGB7ciBwcmUtaW5jLTE0Yy1wbG90fQphbGwuMTRjLnByZS5pbmMgPC0gbWVyZ2UoYWxsLjE0Yy5zdW0uZGZbYWxsLjE0Yy5zdW0uZGYkUGVyaW9kID09ICJwcmUiLCBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiVHJlYXRtZW50IiwgImQxNGNfY29ycl9tZWFuIiwgImQxNGNfY29ycl9taW4iLCAiZDE0Y19jb3JyX21heCIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGFsbC4xNGMuc3VtLmRmW2FsbC4xNGMuc3VtLmRmJFBlcmlvZCA9PSAiaW5jIiwgYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIsICJkMTRjX2NvcnJfbWVhbiIsICJkMTRjX2NvcnJfbWluIiwgImQxNGNfY29ycl9tYXgiKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoIklEIiwgIkV4cGVyaW1lbnQiLCAiVHlwZSIsICJUcmVhdG1lbnQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeGVzID0gYygiX3ByZSIsICJfaW5jIikpCmFsbC4xNGMucHJlLmluYyR0cmVhdC5iaSA8LSBpZmVsc2UoYWxsLjE0Yy5wcmUuaW5jJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwgInRyZWF0bWVudCIpCgojIHNhdmUKc2F2ZShhbGwuMTRjLnByZS5pbmMsIGZpbGUgPSAiLi9hbGwuMTRjLnByZS5pbmMuUkRhdGEiKQoKYWxsLjE0Yy5wcmUuaW5jICU+JQogIGZpbHRlcihFeHBlcmltZW50ICE9ICJ0bWUiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGNfY29ycl9tZWFuX3ByZSwgZDE0Y19jb3JyX21lYW5faW5jLCBjb2xvciA9IFR5cGUsIHNoYXBlID0gVHJlYXRtZW50KSkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiZ3JheSIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX21pbl9pbmMsIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbWF4X2luYywgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2NvcnJfbWluX3ByZSwgCiAgICAgICAgeG1heCA9IGQxNGNfY29ycl9tYXhfcHJlLCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIGhlaWdodCA9IC45KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiY29udHJvbCIgPSAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCIgPSAiY29udHJvbC0yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAiYWlyLWRyeS9yZXdldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9ICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTYwLCAxMTUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTYwLCAxMTUpKSArCiAgeGxhYihleHByZXNzaW9uKCdSZXdldHRpbmcgcHVsc2UgJypEZWx0YSonJ14xNConQy1DTydbMl0qJyAo4oCwKScpKSArCiAgeWxhYihleHByZXNzaW9uKCdFcXVpbGlicml1bSByZXNwaXJhdGlvbiAnKkRlbHRhKicnXjE0KidDLUNPJ1syXSonICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0PXVuaXQoLjgsICJjbSIpLAogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEpCmBgYAo+KipGaWcuIGByIHtmaWcubiArIDF9YC4gJFxEZWx0YSReMTReQy1DT34yfiBvZiB0aGUgcmV3ZXR0aW5nIHB1bHNlIGFuZCB0aGUgZXF1aWxpYnJpdW0gcmVzcGlyYXRpb24gcGVyaW9kKioKCj4qQ2FwdGlvbjoqIFBvaW50cyBhcmUgbWVhbnMgb2YgbGFib3JhdG9yeSBkdXBsaWNhdGVzIGFuZCBlcnJvciBiYXJzIGFyZSB0aGUgbWluIGFuZCBtYXggKGV4Y2VwdCBmb3IgRXhwZXJpbWVudCAxIGNvbnRyb2wgc2FtcGxlcywgd2hpY2ggd2VyZSBub3QgcmVwbGljYXRlZCkuIE5vdGUgdGhhdCByZXdldHRpbmcgcHVsc2UgJFxEZWx0YSReMTReQyB3YXMgbm90IG1lYXN1cmVkIGZvciBjb250cm9sLTEgc2FtcGxlczsgYWRkaXRpb25hbGx5IHNhbXBsZXMgZnJvbSB0aHJlZSBvZiB0aGUgZm9yZXN0IHBsb3RzIG9mIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSBzYW1wbGVzIGZyb20gRXhwZXJpbWVudCAxIGZhaWxlZCB0byBhY2N1bXVsYXRlIGVub3VnaCBDT34yfiBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCB0byBtZWFzdXJlICRcRGVsdGEkXjE0XkMuIFRoZSBvdXRsaWVyIHBvaW50IHdpdGggdGhlIHN1YnN0YW50aWFsbHkgZGVwbGV0ZWQgcHJlLWluY3ViYXRpb24gJFxEZWx0YSReMTReQyBpcyBmcm9tIEV4cGVyaW1lbnQgMiAoY29udHJvbCkuCgpgYGB7ciBwcmUtaW5jLTEzYy1wbG90LCBpbmNsdWRlID0gRkFMU0V9Cmlzby4xMi5hdmcgPC0gaXNvX2RmICU+JQogIHNlbGVjdChJRCwgRXhwZXJpbWVudCwgUGVyaW9kLCBUcmVhdG1lbnQsIGQxM2MpICU+JQogIGdyb3VwX2J5KElELCBFeHBlcmltZW50LCBQZXJpb2QsIFRyZWF0bWVudCkgJT4lCiAgYWRkX2NvdW50KCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoZDEzY19zZSA9IGQxM2Nfc2Qvbl9tZWFuLAogICAgICAgICAgZDEzY191ID0gZDEzY19tZWFuICsgZDEzY19zZSoyLAogICAgICAgICAgZDEzY19sID0gZDEzY19tZWFuIC0gZDEzY19zZSoyKQoKaXNvLjEyLmF2ZyRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIGlzby4xMi5hdmckSUQpLCAiRyIsICJGIikKaXNvLjEyLmF2ZyA8LSBkYXRhLmZyYW1lKGlzby4xMi5hdmcpCgojIHN0YXRzCiMgYWlyLWRyeSArIHN0b3JhZ2UKIyBmb3Jlc3QKdC50ZXN0KGlzby4xMi5hdmdbaXNvLjEyLmF2ZyRQZXJpb2QgPT0gImluYyIgJiBpc28uMTIuYXZnJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiICYgaXNvLjEyLmF2ZyRUeXBlID09ICJGIiwgImQxM2NfbWVhbiJdLAogICAgICAgaXNvLjEyLmF2Z1tpc28uMTIuYXZnJFBlcmlvZCA9PSAiaW5jIiAmIGlzby4xMi5hdmckRXhwZXJpbWVudCA9PSAiYXJjIiAmIGlzby4xMi5hdmckVHJlYXRtZW50ID09ICJjb250cm9sIiAmIGlzby4xMi5hdmckVHlwZSA9PSAiRiIsICJkMTNjX21lYW4iXSwgCiAgICAgICB0YWlscyA9IDIsIHBhaXJlZCA9IFRSVUUpCgojIGdyYXNzbGFuZAp0LnRlc3QoaXNvLjEyLmF2Z1tpc28uMTIuYXZnJFBlcmlvZCA9PSAiaW5jIiAmIGlzby4xMi5hdmckVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIgJiBpc28uMTIuYXZnJFR5cGUgPT0gIkciLCAiZDEzY19tZWFuIl0sCiAgICAgICBpc28uMTIuYXZnW2lzby4xMi5hdmckUGVyaW9kID09ICJpbmMiICYgaXNvLjEyLmF2ZyRFeHBlcmltZW50ID09ICJhcmMiICYgaXNvLjEyLmF2ZyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgaXNvLjEyLmF2ZyRUeXBlID09ICJHIiwgImQxM2NfbWVhbiJdLAogICAgICAgdGFpbHMgPSAyLCBwYWlyZWQgPSBUUlVFKQoKIyBhaXItZHJ5IG9ubHkKIyBmb3Jlc3QKdC50ZXN0KGlzby4xMi5hdmdbaXNvLjEyLmF2ZyRQZXJpb2QgPT0gImluYyIgJiBpc28uMTIuYXZnJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiBpc28uMTIuYXZnJFR5cGUgPT0gIkYiLCAiZDEzY19tZWFuIl0sCiAgICAgICBpc28uMTIuYXZnW2lzby4xMi5hdmckUGVyaW9kID09ICJpbmMiICYgaXNvLjEyLmF2ZyRFeHBlcmltZW50ID09ICJyZXdldCIgJiBpc28uMTIuYXZnJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiBpc28uMTIuYXZnJFR5cGUgPT0gIkYiLCAiZDEzY19tZWFuIl0sCiAgICAgICB0YWlscyA9IDIsIHBhaXJlZCA9IFRSVUUpCgojIGdyYXNzbGFuZAp0LnRlc3QoaXNvLjEyLmF2Z1tpc28uMTIuYXZnJFBlcmlvZCA9PSAiaW5jIiAmIGlzby4xMi5hdmckVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIGlzby4xMi5hdmckVHlwZSA9PSAiRyIsICJkMTNjX21lYW4iXSwKICAgICAgIGlzby4xMi5hdmdbaXNvLjEyLmF2ZyRQZXJpb2QgPT0gImluYyIgJiBpc28uMTIuYXZnJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIGlzby4xMi5hdmckVHJlYXRtZW50ID09ICJjb250cm9sIiAmIGlzby4xMi5hdmckVHlwZSA9PSAiRyIsICJkMTNjX21lYW4iXSwgCiAgICAgICB0YWlscyA9IDIsIHBhaXJlZCA9IFRSVUUpCgppc28uMTIucHJlLmluYyA8LSBtZXJnZShpc28uMTIuYXZnW2lzby4xMi5hdmckUGVyaW9kID09ICJwcmUiLCBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiVHJlYXRtZW50IiwgImQxM2NfbWVhbiIsICJkMTNjX3UiLCAiZDEzY19sIildLAogICAgICAgICAgICAgICAgICAgICAgICBpc28uMTIuYXZnW2lzby4xMi5hdmckUGVyaW9kID09ICJpbmMiLCBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiVHJlYXRtZW50IiwgImQxM2NfbWVhbiIsICJkMTNjX3UiLCAiZDEzY19sIildLAogICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiVHJlYXRtZW50IiksCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXhlcyA9IGMoIl9wcmUiLCAiX2luYyIpKQppc28uMTIucHJlLmluYyR0cmVhdC5iaSA8LSBpZmVsc2UoaXNvLjEyLnByZS5pbmMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCAidHJlYXRtZW50IikKCiMgcmFuZ2UoYyhpc28uMTIucHJlLmluYyRkMTNjX2xfcHJlLCBpc28uMTIucHJlLmluYyRkMTNjX2xfaW5jLCBpc28uMTIucHJlLmluYyRkMTNjX3VfaW5jLCBpc28uMTIucHJlLmluYyRkMTNjX2xfaW5jKSwgbmEucm0gPSBUUlVFKQppc28uMTIucHJlLmluYyAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxM2NfbWVhbl9wcmUsIGQxM2NfbWVhbl9pbmMsIGNvbG9yID0gVHlwZSwgc2hhcGUgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxM2NfbF9pbmMsIAogICAgICAgIHltYXggPSBkMTNjX3VfaW5jLCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjI1KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxM2NfbF9wcmUsIAogICAgICAgIHhtYXggPSBkMTNjX3VfcHJlLAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjI1KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiY29udHJvbCIgPSAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCIgPSAiY29udHJvbC0xICgyMDExKVxuY29udHJvbC0yICgyMDE5KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gImFpci1kcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAiYWlyLWRyeSArIHN0b3JhZ2UiKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0yOS4xLCAtMjIuMjUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTI5LjEsIC0yMi4yNSkpICsKICB4bGFiKGV4cHJlc3Npb24oJ1ByZS1pbmN1YmF0aW9uICcqZGVsdGEqJydeMTMqJ0MgKOKAsCknKSkgKwogIHlsYWIoZXhwcmVzc2lvbignRXF1aWxpYnJpdW0gcmVzcGlyYXRpb24gJypkZWx0YSonJ14xMyonQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSwKICAgICAgICBhc3BlY3QucmF0aW8gPSAxKQpgYGAKCmBgYHtyIHByZS1lcXUtMTRjLXN0YXRzLCBpbmNsdWRlID0gRkFMU0V9CiMgZ2F0aGVyIHByZSBhbmQgaW5jIGRhdGEgZnJvbSBhbGwgcmVwcywgYXJjIGFuZCByZXdldCBleHAgb25seQpqLnZhcnMgPC0gYygiU2FtcGxlTmFtZSIsICJTaXRlIiwgIklEIiwgIkV4cGVyaW1lbnQiLCAiVHJlYXRtZW50IiwgIlR5cGUiLCAiZDE0Y19jb3JyIiwgIm1nQ08yLkNfZ0MiKQphcmMucmV3ZXQucHJlLjE0YyA8LSBiaW5kX3Jvd3MobGFwcGx5KGFsbC4xNGMubHMsIGZ1bmN0aW9uKGRmKSB7CiAgaWYoIWlzLm51bGwoZGYkbWdDTzIuQ19nQykpIHsKICAgICAgZGYgPC0gZGZbd2hpY2goZGYkUGVyaW9kID09ICJwcmUiICYgZGYkRXhwZXJpbWVudCAhPSAidG1lIiksIGoudmFyc10KICAgICAgZGYkdHJlYXQuYmkgPC0gaWZlbHNlKGRmJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwgInRyZWF0bWVudCIpCiAgcmV0dXJuKGRmKQogIH0KfSkpCmFyYy5yZXdldC5pbmMuMTRjIDwtIGJpbmRfcm93cyhsYXBwbHkoYWxsLjE0Yy5scywgZnVuY3Rpb24oZGYpIHsKICBpZighaXMubnVsbChkZiRtZ0NPMi5DX2dDKSkgewogIGRmIDwtIGRmW3doaWNoKGRmJFBlcmlvZCA9PSAiaW5jIiAmIGRmJEV4cGVyaW1lbnQgIT0gInRtZSIpLCBqLnZhcnNdCiAgZGYkdHJlYXQuYmkgPC0gaWZlbHNlKGRmJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwgInRyZWF0bWVudCIpCiAgcmV0dXJuKGRmKQogIH0KfSkpCmFyYy5yZXdldC4xNGMgPC0gbWVyZ2UoYXJjLnJld2V0LnByZS4xNGMsIGFyYy5yZXdldC5pbmMuMTRjLCAKICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoai52YXJzWzE6Nl0sICJ0cmVhdC5iaSIpLCBzdWZmaXhlcyA9IGMoIl9wcmUiLCAiX2luYyIpKQphcmMucmV3ZXQuMTRjJFllYXJTYW1wbGVkIDwtIGlmZWxzZShncmVwbCgiYXJjIiwgYXJjLnJld2V0LjE0YyRFeHBlcmltZW50KSwgMjAxMSwgMjAxOSkKCiMgbGluZWFyIG1peGVkIG1vZGVsIHcvIHJlcGxpY2F0ZXMKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQphcmMucmV3ZXQuMTRjLnJlcHMgPC0gdW5zcGxpdCgKICBsYXBwbHkoc3BsaXQoYXJjLnJld2V0LjE0YywgYXJjLnJld2V0LjE0YyRFeHBlcmltZW50KSwgZnVuY3Rpb24oZXhwKSB7CiAgICB1bnNwbGl0KGxhcHBseShzcGxpdChleHAsIGV4cCR0cmVhdC5iaSksIGZ1bmN0aW9uKHRydCkgewogICAgICB1bnNwbGl0KGxhcHBseShzcGxpdCh0cnQsIHRydCRJRCksIGZ1bmN0aW9uKGRmKSB7CiAgICAgICAgZGYkcmVwIDwtIHNlcSgxLCBucm93KGRmKSkKICAgICAgICByZXR1cm4oZGYpCiAgICAgIH0pLCB0cnQkSUQpIAogICAgfSksIGV4cCR0cmVhdC5iaSkKICB9KSwgYXJjLnJld2V0LjE0YyRFeHBlcmltZW50KQphcmMucmV3ZXQuMTRjLnJlcHMkcmVwIDwtIGZhY3RvcihhcmMucmV3ZXQuMTRjLnJlcHMkcmVwKQoKIyBwcmUgdnMuIG1haW4gaW5jCiMgMTRDCmFyYy5yZXdldC4xNGMucmVwcy5wcmUgPC0gYXJjLnJld2V0LjE0Yy5yZXBzWy13aGljaChpcy5uYShhcmMucmV3ZXQuMTRjLnJlcHMkZDE0Y19jb3JyX3ByZSkpLCBdCnByZS5pbmMuZGlmIDwtIGxhcHBseSgKICBzcGxpdChhcmMucmV3ZXQuMTRjLnJlcHMucHJlLCBhcmMucmV3ZXQuMTRjLnJlcHMucHJlJEV4cGVyaW1lbnQpLCBmdW5jdGlvbihleHApIHsKICAgIGxhcHBseShzcGxpdChleHAsIGV4cCR0cmVhdC5iaSksIGZ1bmN0aW9uKHRydCkgewogICAgICB0cnQuZGlmIDwtIGJpbmRfcm93cygKICAgICAgICBsYXBwbHkoc3BsaXQodHJ0LCB0cnQkSUQpLCBmdW5jdGlvbihpZCkgewogICAgICAgICAgcHJlIDwtIGRhdGEuZnJhbWUobSA9IG1lYW4oaWQkZDE0Y19jb3JyX3ByZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdmFyKGlkJGQxNGNfY29ycl9wcmUpKQogICAgICAgICAgaW5jIDwtIGRhdGEuZnJhbWUobSA9IG1lYW4oaWQkZDE0Y19jb3JyX2luYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdmFyKGlkJGQxNGNfY29ycl9pbmMpKQogICAgICAgICAgZGlmIDwtIGRhdGEuZnJhbWUoZCA9IHByZSRtIC0gaW5jJG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZCA9IHByZSR2ICsgaW5jJHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0gdW5pcXVlKGlkJFR5cGUpKQogICAgICAgICAgZGlmJHZkIDwtIGlmZWxzZShpcy5uYShkaWYkdmQpLCBtZWFuLnJlcC52YXIsIGRpZiR2ZCkKICAgICAgICAgIHJldHVybihkaWYpCiAgICAgICAgICB9KSwgLmlkID0gIklEIikKICAgICAgdHJ0LmRpZi5wb29sIDwtIGxhcHBseShzcGxpdCh0cnQuZGlmLCB0cnQuZGlmJFR5cGUpLCBmdW5jdGlvbihpZC5zdW0pIHsKICAgICAgICBkZWNvbXAgPC0gc2FtcGxlLmRlY29tcChuID0gcmVwKDIsIGxlbmd0aChpZC5zdW0kZCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS5tZWFuID0gaWQuc3VtJGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLnZhciA9IGlkLnN1bSR2ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkKICAgICAgICBwb29sZWQgPC0gZGVjb21wW25yb3coZGVjb21wKSwgXQogICAgICAgIHBsdXNNaW51cyA8LSBwb29sZWQkc2FtcGxlLnNkIC8gc3FydChwb29sZWQkbikgKiBxdCguOTUsIHBvb2xlZCRuIC0gMSkKICAgICAgICBjaTk1IDwtIGMocG9vbGVkJHNhbXBsZS5tZWFuIC0gcGx1c01pbnVzLCBwb29sZWQkc2FtcGxlLm1lYW4gKyBwbHVzTWludXMpCiAgICAgICAgcmV0dXJuKGxpc3QoZGVjb21wID0gZGVjb21wLCBjaTk1ID0gY2k5NSkpCiAgICAgICAgfSkKICAgICAgcmV0dXJuKHRydC5kaWYucG9vbCkKICAgICAgfSkKICAgIH0pCiMgcmVtb3ZlIEhFVzIyIGZyb20gcmV3ZXQgY29udHJvbApwcmUuaW5jLmRpZiRyZXdldCRjb250cm9sJEYkZGVjb21wIDwtIHByZS5pbmMuZGlmJHJld2V0JGNvbnRyb2wkRiRkZWNvbXBbLTEsIF0KcHJlLmluYy5kaWYuYWxsIDwtIGJpbmRfcm93cyhsYXBwbHkocHJlLmluYy5kaWYsIGZ1bmN0aW9uKGV4cCkgCiAgYmluZF9yb3dzKGxhcHBseShleHAsIGZ1bmN0aW9uKHRydCkgCiAgICBiaW5kX3Jvd3MobGFwcGx5KHRydCwgZnVuY3Rpb24odHlwKQogICAgICB0eXAkZGVjb21wWzE6bnJvdyh0eXAkZGVjb21wKSAtIDEsIF0pLCAKICAgICAgLmlkID0gIlR5cGUiKSksIC5pZCA9ICJ0cmVhdC5iaSIpKSwgLmlkID0gIkV4cGVyaW1lbnQiKQpwcmUuaW5jLmRpZi5hbGwucG9vbGVkIDwtIHNhbXBsZS5kZWNvbXAobiA9IHByZS5pbmMuZGlmLmFsbCRuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLm1lYW4gPSBwcmUuaW5jLmRpZi5hbGwkc2FtcGxlLm1lYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUudmFyID0gcHJlLmluYy5kaWYuYWxsJHNhbXBsZS52YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkKcHJlLmluYy5kaWYuYWxsLnBvb2xlZC5jaSA8LSBjKAogIHByZS5pbmMuZGlmLmFsbC5wb29sZWRbbnJvdyhwcmUuaW5jLmRpZi5hbGwucG9vbGVkKSwgInNhbXBsZS5tZWFuIl0gLQogICAgcHJlLmluYy5kaWYuYWxsLnBvb2xlZFtucm93KHByZS5pbmMuZGlmLmFsbC5wb29sZWQpLCAic2FtcGxlLnNkIl0gLyAKICAgIHNxcnQocHJlLmluYy5kaWYuYWxsLnBvb2xlZFtucm93KHByZS5pbmMuZGlmLmFsbC5wb29sZWQpLCAibiJdKSAqIAogICAgcXQoLjk1LCBwcmUuaW5jLmRpZi5hbGwucG9vbGVkW25yb3cocHJlLmluYy5kaWYuYWxsLnBvb2xlZCksICJuIl0gLSAxKSwKICBwcmUuaW5jLmRpZi5hbGwucG9vbGVkW25yb3cocHJlLmluYy5kaWYuYWxsLnBvb2xlZCksICJzYW1wbGUubWVhbiJdICsKICAgIHByZS5pbmMuZGlmLmFsbC5wb29sZWRbbnJvdyhwcmUuaW5jLmRpZi5hbGwucG9vbGVkKSwgInNhbXBsZS5zZCJdIC8gCiAgICBzcXJ0KHByZS5pbmMuZGlmLmFsbC5wb29sZWRbbnJvdyhwcmUuaW5jLmRpZi5hbGwucG9vbGVkKSwgIm4iXSkgKiAKICAgIHF0KC45NSwgcHJlLmluYy5kaWYuYWxsLnBvb2xlZFtucm93KHByZS5pbmMuZGlmLmFsbC5wb29sZWQpLCAibiJdIC0gMSkpCgojIDE0YyBjdGwtdHJ0CmFyYy5yZXdldC4xNGMuY3RsLnRydC5scyA8LSBsYXBwbHkoCiAgc3BsaXQoYXJjLnJld2V0LjE0Yy5yZXBzLCBhcmMucmV3ZXQuMTRjLnJlcHMkRXhwZXJpbWVudCksIGZ1bmN0aW9uKGV4cCkgewogICAgdHJ0LmRpZiA8LSBiaW5kX3Jvd3MoCiAgICAgICAgbGFwcGx5KHNwbGl0KGV4cCwgZXhwJElEKSwgZnVuY3Rpb24oaWQpIHsKICAgICAgICAgIGN0bC4xNGMgPC0gaWRbaWQkdHJlYXQuYmkgPT0gImNvbnRyb2wiLCAiZDE0Y19jb3JyX2luYyJdCiAgICAgICAgICBjdGwgPC0gZGF0YS5mcmFtZShtID0gbWVhbihjdGwuMTRjKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2YXIoY3RsLjE0YykpCiAgICAgICAgICBpZiAobnJvdyhjdGwpID09IDEpIHsKICAgICAgICAgICAgY3RsJHYgPC0gbWVhbi5yZXAudmFyCiAgICAgICAgICB9CiAgICAgICAgICB0cnQuMTRjIDwtIGlkW2lkJHRyZWF0LmJpID09ICJ0cmVhdG1lbnQiLCAiZDE0Y19jb3JyX2luYyJdCiAgICAgICAgICB0cnQgPC0gZGF0YS5mcmFtZShtID0gbWVhbih0cnQuMTRjKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2YXIodHJ0LjE0YykpCiAgICAgICAgICBpZiAobnJvdyh0cnQpID09IDEpIHsKICAgICAgICAgICAgdHJ0JHYgPC0gbWVhbi5yZXAudmFyCiAgICAgICAgICB9CiAgICAgICAgICBkaWYgPC0gZGF0YS5mcmFtZShkID0gY3RsJG0gLSB0cnQkbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkID0gY3RsJHYgKyB0cnQkdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPSB1bmlxdWUoaWQkVHlwZSkpCiAgICAgICAgICByZXR1cm4oZGlmKQogICAgICAgICAgfSksIC5pZCA9ICJJRCIpCiAgICAgICAgICB0cnQuZGlmLnBvb2wgPC0gbGFwcGx5KHNwbGl0KHRydC5kaWYsIHRydC5kaWYkVHlwZSksIGZ1bmN0aW9uKGlkLnN1bSkgewogICAgICAgICAgICBkZWNvbXAgPC0gc2FtcGxlLmRlY29tcChuID0gcmVwKDIsIGxlbmd0aChpZC5zdW0kZCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUubWVhbiA9IGlkLnN1bSRkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUudmFyID0gaWQuc3VtJHZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkKICAgICAgICAgICAgcG9vbGVkIDwtIGRlY29tcFtucm93KGRlY29tcCksIF0KICAgICAgICAgICAgcGx1c01pbnVzIDwtIHBvb2xlZCRzYW1wbGUuc2QgLyBzcXJ0KHBvb2xlZCRuKSAqIHF0KC45NSwgcG9vbGVkJG4gLSAxKQogICAgICAgICAgICBjaTk1IDwtIGMocG9vbGVkJHNhbXBsZS5tZWFuIC0gcGx1c01pbnVzLCBwb29sZWQkc2FtcGxlLm1lYW4gKyBwbHVzTWludXMpCiAgICAgICAgICAgIHJldHVybihsaXN0KGRlY29tcCA9IGRlY29tcCwgY2k5NSA9IGNpOTUpKQogICAgICAgICAgICB9KQogICAgICAgICAgcmV0dXJuKHRydC5kaWYucG9vbCkKICAgICAgfSkKCiMgMTNDCmlzb19kZiR0cmVhdC5iaSA8LSBpZmVsc2UoaXNvX2RmJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwgInRyZWF0bWVudCIpCm1lYW4ucmVwLnZhci4xM2MgPC0gbWVhbigKICB1bmxpc3QobGFwcGx5KHNwbGl0KGlzb19kZiwgaXNvX2RmJEV4cGVyaW1lbnQpLCBmdW5jdGlvbihleHApCiAgICBsYXBwbHkoc3BsaXQoZXhwLCBleHAkUGVyaW9kKSwgZnVuY3Rpb24ocGVyKQogICAgICBsYXBwbHkoc3BsaXQocGVyLCBwZXIkdHJlYXQuYmkpLCBmdW5jdGlvbih0cnQpCiAgICAgICAgbGFwcGx5KHNwbGl0KHRydCwgdHJ0JElEKSwgZnVuY3Rpb24oaWQpIHsKICAgICAgICAgIHZhcihpZCRkMTNjKQogICAgICAgIH0pCiAgICAgICkKICAgICkKICApKSwgbmEucm0gPSBUKQojIHByZS1pbmMKaXNvX2RmLnByZS5pbmMgPC0gbWVyZ2UoCiAgaXNvX2RmW2lzb19kZiRQZXJpb2QgPT0gInByZSIsIGMoIklEIiwgIkV4cGVyaW1lbnQiLCAidHJlYXQuYmkiLCAiVHlwZSIsICJkMTNjIildLAogIGlzb19kZltpc29fZGYkUGVyaW9kID09ICJpbmMiLCBjKCJJRCIsICJFeHBlcmltZW50IiwgInRyZWF0LmJpIiwgIlR5cGUiLCAiZDEzYyIpXSwKICBieSA9IGMoIklEIiwgIkV4cGVyaW1lbnQiLCAidHJlYXQuYmkiLCAiVHlwZSIpLCBzdWZmaXhlcyA9IGMoIl9wcmUiLCAiX2luYyIpKQppc29fZGYucHJlLmluYy5scyA8LSBsYXBwbHkoCiAgc3BsaXQoaXNvX2RmLnByZS5pbmMsIGlzb19kZi5wcmUuaW5jJEV4cGVyaW1lbnQpLCBmdW5jdGlvbihleHApIHsKICAgIGxhcHBseShzcGxpdChleHAsIGV4cCR0cmVhdC5iaSksIGZ1bmN0aW9uKHRydCkgewogICAgICB0cnQuZGlmIDwtIGJpbmRfcm93cygKICAgICAgICBsYXBwbHkoc3BsaXQodHJ0LCB0cnQkSUQpLCBmdW5jdGlvbihpZCkgewogICAgICAgICAgcHJlIDwtIGRhdGEuZnJhbWUobSA9IG1lYW4oaWQkZDEzY19wcmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHZhcihpZCRkMTNjX3ByZSkpCiAgICAgICAgICBpbmMgPC0gZGF0YS5mcmFtZShtID0gbWVhbihpZCRkMTNjX2luYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdmFyKGlkJGQxM2NfaW5jKSkKICAgICAgICAgIGRpZiA8LSBkYXRhLmZyYW1lKGQgPSBwcmUkbSAtIGluYyRtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmQgPSBwcmUkdiArIGluYyR2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IHVuaXF1ZShpZCRUeXBlKSkKICAgICAgICAgIHJldHVybihkaWYpCiAgICAgICAgICB9KSwgLmlkID0gIklEIikKICAgICAgdHJ0LmRpZi5wb29sIDwtIGxhcHBseShzcGxpdCh0cnQuZGlmLCB0cnQuZGlmJFR5cGUpLCBmdW5jdGlvbihpZC5zdW0pIHsKICAgICAgICBkZWNvbXAgPC0gc2FtcGxlLmRlY29tcChuID0gcmVwKDIsIGxlbmd0aChpZC5zdW0kZCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS5tZWFuID0gaWQuc3VtJGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLnZhciA9IGlkLnN1bSR2ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkKICAgICAgICBwb29sZWQgPC0gZGVjb21wW25yb3coZGVjb21wKSwgXQogICAgICAgIHBsdXNNaW51cyA8LSBwb29sZWQkc2FtcGxlLnNkIC8gc3FydChwb29sZWQkbikgKiBxdCguOTUsIHBvb2xlZCRuIC0gMSkKICAgICAgICBjaTk1IDwtIGMocG9vbGVkJHNhbXBsZS5tZWFuIC0gcGx1c01pbnVzLCBwb29sZWQkc2FtcGxlLm1lYW4gKyBwbHVzTWludXMpCiAgICAgICAgcmV0dXJuKGxpc3QoZGVjb21wID0gZGVjb21wLCBjaTk1ID0gY2k5NSkpCiAgICAgICAgfSkKICAgICAgcmV0dXJuKHRydC5kaWYucG9vbCkKICAgICAgfSkKICAgIH0pCgojIGluYwppc29fZGYuaW5jLmxzIDwtIGxhcHBseSgKICBzcGxpdChpc29fZGZbaXNvX2RmJFBlcmlvZCA9PSAiaW5jIiwgXSwgCiAgICAgICAgaXNvX2RmW2lzb19kZiRQZXJpb2QgPT0gImluYyIsICJFeHBlcmltZW50Il0pLCBmdW5jdGlvbihleHApIHsKICAgICAgICAgIHRydC5kaWYgPC0gYmluZF9yb3dzKAogICAgICAgICAgICBsYXBwbHkoc3BsaXQoZXhwLCBleHAkSUQpLCBmdW5jdGlvbihpZCkgewogICAgICAgICAgICAgIGN0bCA8LSBkYXRhLmZyYW1lKG0gPSBtZWFuKGlkW2lkJHRyZWF0LmJpID09ICJjb250cm9sIiwgImQxM2MiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHZhcihpZFtpZCR0cmVhdC5iaSA9PSAiY29udHJvbCIsICJkMTNjIl0pKQogICAgICAgICAgICAgIGlmIChucm93KGN0bCkgPT0gMSkgewogICAgICAgICAgICAgICAgY3RsJHYgPC0gbWVhbi5yZXAudmFyLjEzYwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0cnQgPC0gZGF0YS5mcmFtZShtID0gbWVhbihpZFtpZCR0cmVhdC5iaSA9PSAidHJlYXRtZW50IiwgImQxM2MiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHZhcihpZFtpZCR0cmVhdC5iaSA9PSAidHJlYXRtZW50IiwgImQxM2MiXSkpCiAgICAgICAgICAgICAgZGlmIDwtIGRhdGEuZnJhbWUoZCA9IGN0bCRtIC0gdHJ0JG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmQgPSBjdGwkdiArIHRydCR2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPSB1bmlxdWUoaWQkVHlwZSkpCiAgICAgICAgICAgICAgcmV0dXJuKGRpZikKICAgICAgICAgICAgICB9KSwgLmlkID0gIklEIikKICAgICAgICAgIHRydC5kaWYucG9vbCA8LSBsYXBwbHkoc3BsaXQodHJ0LmRpZiwgdHJ0LmRpZiRUeXBlKSwgZnVuY3Rpb24oaWQuc3VtKSB7CiAgICAgICAgICAgIGRlY29tcCA8LSBzYW1wbGUuZGVjb21wKG4gPSByZXAoMiwgbGVuZ3RoKGlkLnN1bSRkKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS5tZWFuID0gaWQuc3VtJGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS52YXIgPSBpZC5zdW0kdmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUuc2QgPSBUUlVFKQogICAgICAgICAgICBwb29sZWQgPC0gZGVjb21wW25yb3coZGVjb21wKSwgXQogICAgICAgICAgICBwbHVzTWludXMgPC0gcG9vbGVkJHNhbXBsZS5zZCAvIHNxcnQocG9vbGVkJG4pICogcXQoLjk1LCBwb29sZWQkbiAtIDEpCiAgICAgICAgICAgIGNpOTUgPC0gYyhwb29sZWQkc2FtcGxlLm1lYW4gLSBwbHVzTWludXMsIHBvb2xlZCRzYW1wbGUubWVhbiArIHBsdXNNaW51cykKICAgICAgICAgICAgcmV0dXJuKGxpc3QoZGVjb21wID0gZGVjb21wLCBjaTk1ID0gY2k5NSkpCiAgICAgICAgICAgIH0pCiAgICAgICAgICByZXR1cm4odHJ0LmRpZi5wb29sKQogICAgICB9KQoKIyBsbWVyIGZvciBwcmUvaW5jCmFyYy5yZXdldC4xNGMucmVwcy5wcmUuaW5jIDwtIHJiaW5kKAogIGFyYy5yZXdldC4xNGMucmVwcy5wcmVbICwgYygiSUQiLCAiVHlwZSIsICJFeHBlcmltZW50IiwgInRyZWF0LmJpIiwgImQxNGNfY29ycl9wcmUiKV0gJT4lCiAgICByZW5hbWUoZDE0Y19jb3JyID0gZDE0Y19jb3JyX3ByZSkgJT4lCiAgICBtdXRhdGUoUGVyaW9kID0gInByZSIpLAogIGFyYy5yZXdldC4xNGMucmVwcy5wcmVbICwgYygiSUQiLCAiVHlwZSIsICJFeHBlcmltZW50IiwgInRyZWF0LmJpIiwgImQxNGNfY29ycl9pbmMiKV0gJT4lCiAgICByZW5hbWUoZDE0Y19jb3JyID0gZDE0Y19jb3JyX2luYykgJT4lCiAgICBtdXRhdGUoUGVyaW9kID0gImluYyIpKQpsbWVyLnByZS5pbmMgPC0gbG1lcihkMTRjX2NvcnIgfiBQZXJpb2QgKiBFeHBlcmltZW50ICogdHJlYXQuYmkgKiBUeXBlICsgKDF8SUQpLAogICAgICAgICAgICAgICAgICAgICBkYXRhID0gYXJjLnJld2V0LjE0Yy5yZXBzLnByZS5pbmMpCmxtZXIucHJlLmluYzIgPC0gbG1lcihkMTRjX2NvcnIgfiBQZXJpb2QgKiBFeHBlcmltZW50ICogdHJlYXQuYmkgKiBUeXBlICsgKDF8SUQpLAogICAgICAgICAgICAgICAgICAgICBkYXRhID0gYXJjLnJld2V0LjE0Yy5yZXBzLnByZS5pbmNbLXdoaWNoKGFyYy5yZXdldC4xNGMucmVwcy5wcmUuaW5jJElEID09ICJIRVcyMiIgJmFyYy5yZXdldC4xNGMucmVwcy5wcmUuaW5jJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIGFyYy5yZXdldC4xNGMucmVwcy5wcmUuaW5jJHRyZWF0LmJpID09ICJjb250cm9sIiksIF0pCmxtZXIucHJlLmluYy5lbSA8LSBlbW1lYW5zKGxtZXIucHJlLmluYywgfiBQZXJpb2QgKiB0cmVhdC5iaSAqIEV4cGVyaW1lbnQgKiBUeXBlKQpjb250cmFzdChyZWZfZ3JpZChsbWVyLnByZS5pbmMpLCAicGFpcndpc2UiLCBzaW1wbGUgPSBjKCJQZXJpb2QiKSkKY29udHJhc3QocmVmX2dyaWQobG1lci5wcmUuaW5jMiksICJwYWlyd2lzZSIsIHNpbXBsZSA9IGMoIlBlcmlvZCIpKQoKIyMgU3RvcmFnZSBkdXJhdGlvbgphcmMudG1lLjE0YyA8LSBiaW5kX3Jvd3MobGFwcGx5KGFsbC4xNGMubHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGYgPC0gZGZbd2hpY2goZGYkUGVyaW9kID09ICJpbmMiICYgZGYkRXhwZXJpbWVudCAhPSAicmV3ZXQiICYgZGYkSG9yaXpvbiA9PSAiQSIpLCBdCiAgZGYkdHJlYXQuYmkgPC0gaWZlbHNlKGRmJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwgInRyZWF0bWVudCIpCiAgcmV0dXJuKGRmKQogIH0pKQphcmMudG1lLjE0YyRZZWFyTWVhc3VyZWQgPC0gMjAxOAphcmMudG1lLjE0Y1t3aGljaChhcmMudG1lLjE0YyRJRCAlaW4lIHRtZS5taXNjJElEKSwgIlllYXJNZWFzdXJlZCJdIDwtIDIwMDkKYXJjLnRtZS4xNGNbd2hpY2goYXJjLnRtZS4xNGMkU2l0ZSA9PSAiTXVzaWNrIiB8IGFyYy50bWUuMTRjJFNpdGUgPT0gIlNoYXZlciIpLCAiWWVhclNhbXBsZWQiXSA8LSAyMDA5CmFyYy50bWUuMTRjJGR1ciA8LSBhcmMudG1lLjE0YyRZZWFyTWVhc3VyZWQgLSBhcmMudG1lLjE0YyRZZWFyU2FtcGxlZAphcmMudG1lLjE0YyA8LSBhcmMudG1lLjE0Y1std2hpY2goYXJjLnRtZS4xNGMkSUQgPT0gIkR1MTIzIiksIF0KYXJjLnRtZS4xNGMgPC0gYXJjLnRtZS4xNGNbICwgYygiSUQiLCAidHJlYXQuYmkiLCAiRXhwZXJpbWVudCIsICJkMTRjX2NvcnIiLCAiZHVyIiwgIlNpdGUiKV0KCiMgc3RvcmFnZSBkdXJhdGlvbiBtb2RlbApsbWVyLmFyYy50bWUuMTRjIDwtIGxtZXIoCiAgZDE0Y19jb3JyIH4gdHJlYXQuYmkgKiBkdXIgKyAoMSB8IElEKSwKICBkYXRhID0gYXJjLnRtZS4xNGMpCmxtZXIuYXJjLnRtZS4xNGMuZGYgPC0gZW10cmVuZHMobG1lci5hcmMudG1lLjE0YywgcGFpcndpc2UgfiB0cmVhdC5iaSwgdmFyID0gImR1ciIpCmVtbWlwKGxtZXIuYXJjLnRtZS4xNGMsIHRyZWF0LmJpIH4gZHVyLCBjb3YucmVkdWNlID0gcmFuZ2UpCgojIHcvbyBPYWsgUmlkZ2UKbG1lci5hcmMudG1lLjE0YzIgPC0gbG1lcigKICBkMTRjX2NvcnIgfiB0cmVhdC5iaSAqIGR1ciArICgxIHwgSUQpLAogIGRhdGEgPSBhcmMudG1lLjE0Y1std2hpY2goYXJjLnRtZS4xNGMkU2l0ZSA9PSAiVGVubmVzc2VlIFZhbGxleSIgfCBhcmMudG1lLjE0YyRTaXRlID09ICJXYWxrZXIgQnJhbmNoIiksIF0pCmxtZXIuYXJjLnRtZS4xNGMyLmV0IDwtIGVtdHJlbmRzKGxtZXIuYXJjLnRtZS4xNGMyLCBwYWlyd2lzZSB+IHRyZWF0LmJpLCB2YXIgPSAiZHVyIikKZW1taXAobG1lci5hcmMudG1lLjE0YzIsIHRyZWF0LmJpIH4gZHVyLCBjb3YucmVkdWNlID0gcmFuZ2UpCgojIEZ1bGwgbW9kZWwgKEV4cCAxKzIpCiMgbW9kZWwKbG1lci5hcmNSZXdldC4xNGMgPC0gbG1lcigKICBkMTRjX2NvcnJfaW5jIH4gdHJlYXQuYmkgKiBFeHBlcmltZW50ICogVHlwZSArICgxfElEKSwKICBkYXRhID0gYXJjLnJld2V0LjE0Yy5yZXBzKQpsbWVyLmhhaS4xNGMgPC0gbG1lcigKICBkMTRjX2NvcnJfaW5jIH4gdHJlYXQuYmkgKiBFeHBlcmltZW50ICogVHlwZSArICgxfElEKSwKICBkYXRhID0gYXJjLnJld2V0LjE0Yy5yZXBzW2FyYy5yZXdldC4xNGMucmVwcyRTaXRlID09ICJIYWluaWNoIiwgXSkKbG1lci5hcmNSZXdldC4xNGMuZGYgPC0gZGF0YS5mcmFtZSgKICBlbW1lYW5zKGxtZXIuYXJjUmV3ZXQuMTRjLCB+IHRyZWF0LmJpICogRXhwZXJpbWVudCAqIFR5cGUpKQoKIyBjb250cmFzdHMsIGUuZy4KIyB3aXRoaW4gVHlwZSwgdHJ0IEYgMjAxMSAtIHRydCBGIDIwMTksIGN0bCBGIDIwMTEgLSBjdGwgRiAyMDE5Li4uZXRjLgpsbWVyLmFyY1Jld2V0LjE0Yy5jdCA8LSBjb250cmFzdChyZWZfZ3JpZChsbWVyLmFyY1Jld2V0LjE0YyksICJwYWlyd2lzZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGUgPSBjKCJ0cmVhdC5iaSIsICJFeHBlcmltZW50IikpCmFyYy4xNGMuaW5jLm1lYW5EaWYKIyBIYWluaWNoCmxtZXIuaGFpLjE0Yy5jdCA8LSBjb250cmFzdChyZWZfZ3JpZChsbWVyLmhhaS4xNGMpLCAicGFpcndpc2UiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZSA9IGMoInRyZWF0LmJpIiwgIkV4cGVyaW1lbnQiKSkKY29udHJhc3Qua2V5IDwtIGMoImNvbnRyb2wgYXJjIC0gdHJlYXRtZW50IGFyYyIgPSAiVHJ0IC0gQ3RsIChFeHBlcmltZW50IDEpIiwKICAgICAgICAgICAgICAgICAgImNvbnRyb2wgYXJjIC0gY29udHJvbCByZXdldCIgPSAi4oiGL3QgQ3RsIiwKICAgICAgICAgICAgICAgICAgImNvbnRyb2wgYXJjIC0gdHJlYXRtZW50IHJld2V0IiA9ICLiiIYvdCBFMSBDdGwgLSBFMiBUcnQiLAogICAgICAgICAgICAgICAgICAidHJlYXRtZW50IGFyYyAtIGNvbnRyb2wgcmV3ZXQiID0gIuKIhi90IEUxIFRydCAtIEUyIEN0bCIsCiAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgYXJjIC0gdHJlYXRtZW50IHJld2V0IiA9ICLiiIYvdCBUcnQiLAogICAgICAgICAgICAgICAgICAiY29udHJvbCByZXdldCAtIHRyZWF0bWVudCByZXdldCIgPSAiVHJ0IC0gQ3RsIChFeHBlcmltZW50IDIpIikKIyBwIDwtIGNvbmZpbnQobG1lci5oYWkuMTRjLmN0KSAlPiUKIyAgIGRhdGEuZnJhbWUoLikgJT4lCiMgICBtdXRhdGUoQ29udHJhc3QgPSBmYWN0b3IocmVjb2RlKGNvbnRyYXN0LCAhISFjb250cmFzdC5rZXkpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlRydCAtIEN0bCAoRXhwZXJpbWVudCAxKSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJ0IC0gQ3RsIChFeHBlcmltZW50IDIpIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICLiiIYvdCBDdGwiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIuKIhi90IFRydCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi4oiGL3QgRTEgQ3RsIC0gRTIgVHJ0IiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICLiiIYvdCBFMSBUcnQgLSBFMiBDdGwiKSkpICU+JQojICAgZ2dwbG90KC4sIGFlcyhDb250cmFzdCwgZXN0aW1hdGUsIGNvbG9yID0gVHlwZSkpICsKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKIyAgIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuNSwgcHJlc2VydmUgPSAidG90YWwiKSkgKwojICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGxvd2VyLkNMLCB5bWF4ID0gdXBwZXIuQ0wpLCB3aWR0aCA9IC41LAojICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjUsIHByZXNlcnZlID0gInRvdGFsIikpICsKIyAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiMgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKIyAgIHlsYWIoZXhwcmVzc2lvbignTWVhbiBkaWZmZXJlbmNlIGluICcqRGVsdGFeMTQqJ0MtQ08nWzJdKicgKOKAsCknKSkgKwojICAgZ2d0aXRsZSgiSGFpbmljaCBjb250cmFzdHMiKSArCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKIyAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQojIGdnc2F2ZSgibG1lci5jb250cmFzdHMuaGFpLnBkZiIsIHAsIGRldmljZSA9IGNhaXJvX3BkZikKCiMgcGxvdApsbWVyLmFyY1Jld2V0LjE0Yy5kZiAlPiUKICBtdXRhdGUoeXMgPSBpZmVsc2UoRXhwZXJpbWVudCA9PSAiYXJjIiwgMjAxMSwgMjAxOSksCiAgICAgICAgIFRyZWF0bWVudCA9IGlmZWxzZShFeHBlcmltZW50ID09ICJhcmMiICYgdHJlYXQuYmkgPT0gInRyZWF0bWVudCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHJlYXQuYmkgPT0gInRyZWF0bWVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCIsICJjb250cm9sIikpKSAlPiUKICBtdXRhdGUoWWVhclNhbXBsZWQgPSBpZmVsc2UodHJlYXQuYmkgPT0gInRyZWF0bWVudCIsIHlzICsgLjYsIHlzKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhZZWFyU2FtcGxlZCwgZW1tZWFuLCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBEYXRtLCBhZXMoRGF0ZSwgTkhjMTQsIGxpbmV0eXBlID0gQXRtb3NwaGVyZSksIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50KSwgc2l6ZSA9IDMpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbG93ZXIuQ0wsIHltYXggPSB1cHBlci5DTCksIHdpZHRoID0gLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJjb250cm9sIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0IiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlIiA9IDApLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJjb250cm9sIiA9ICJjb250cm9sLTEgKDIwMTEpXG5jb250cm9sLTIgKDIwMTkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCIgPSAiYWlyLWRyeS9yZXdldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlIiA9ICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMjAxMCwgMjAyMCksIGJyZWFrcyA9IGMoMjAxMSwgMjAxOSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTUsIDExMCkpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFR5cGUpLAogICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihUeXBlID0gYygiRiIgPSAiRm9yZXN0IiwgIkciID0gIkdyYXNzbGFuZCIpKSkgKwogIHlsYWIoZXhwcmVzc2lvbihEZWx0YV4xNConQy1DTydbMl0qJyAo4oCwKScpKSArCiAgeGxhYigiWWVhciBTYW1wbGVkIikgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKYGBge3IgcHJlLWVxdS0xM2Mtc3RhdHMsIGluY2x1ZGUgPSBGQUxTRX0KIyBnYXRoZXIgcHJlIGFuZCBpbmMgZGF0YSBmcm9tIGFsbCByZXBzLCBhcmMgYW5kIHJld2V0IGV4cCBvbmx5CmBgYAoKIyMgVHJlYXRtZW50IGVmZmVjdCBvbiAkXERlbHRhJF4xNF5DLUNPfjJ+IGZvciBhbGwgc2FtcGxlcyAoRXhwZXJpbWVudHMgMSwgMiwgYW5kIDMpCgpgYGB7ciAxNGMtdHJ0LWRpZnN9CiMgRmlsdGVyIGRhdGEgdG8gImluYyIsIHNwbGl0IGJ5IGJpbmFyeSB0cmVhdG1lbnQgdmFyaWFibGUsIHRoZW4gbWVyZ2UKIyBjb2xsYXBzZSB0cmVhdG1lbnQgdmFyaWFibGUgaW50byBiaW5hcnkgY29udHJvbC90cmVhdG1lbnQKYWxsLjE0Yy5zdW0uZGYkdHJlYXQuYmkgPC0gaWZlbHNlKGFsbC4xNGMuc3VtLmRmJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwgInRyZWF0bWVudCIpCgojIGluYyBkYXRhCmFsbC4xNGMuY3RsIDwtIGFsbC4xNGMuc3VtLmRmW2FsbC4xNGMuc3VtLmRmJHRyZWF0LmJpID09ICJjb250cm9sIiAmIGFsbC4xNGMuc3VtLmRmJFBlcmlvZCA9PSAiaW5jIiwgXQphbGwuMTRjLmN0bCA8LSByZW5hbWVfYXQoYWxsLjE0Yy5jdGwsIHZhcnMoY29udGFpbnMoJ2QxNGMnKSksIGxpc3QofnBhc3RlMCguLCAiX2N0bCIpKSkKYWxsLjE0Yy50cnQgPC0gYWxsLjE0Yy5zdW0uZGZbYWxsLjE0Yy5zdW0uZGYkdHJlYXQuYmkgPT0gInRyZWF0bWVudCIgJiBhbGwuMTRjLnN1bS5kZiRQZXJpb2QgPT0gImluYyIsIF0KYWxsLjE0Yy50cnQgPC0gcmVuYW1lX2F0KGFsbC4xNGMudHJ0LCB2YXJzKGNvbnRhaW5zKCdkMTRjJykpLCBsaXN0KH5wYXN0ZTAoLiwgIl90cnQiKSkpCmFsbC4xNGMuY3RsLnRydCA8LSBpbm5lcl9qb2luKGRhdGEuZnJhbWUoYWxsLjE0Yy5jdGwpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoSUQsIEV4cGVyaW1lbnQsIFR5cGUsIFNpdGUsIEhvcml6b24sIGNvbnRhaW5zKCJkMTRjX2NvcnIiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZnJhbWUoYWxsLjE0Yy50cnQpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoSUQsIEV4cGVyaW1lbnQsIFR5cGUsIFNpdGUsIEhvcml6b24sIGNvbnRhaW5zKCJkMTRjX2NvcnIiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgIlNpdGUiLCAiSG9yaXpvbiIpKQoKIyBGaXJzdCBhZGQgWWVhclNhbXBsZWQgYW5kIFllYXJNZWFzdXJlZCBjb2x1bW5zCmFsbC4xNGMuY3RsLnRydCRZZWFyU2FtcGxlZCA8LSB1bmxpc3QoYWxsLjE0Yy5zdW0uZGZbbWF0Y2goYWxsLjE0Yy5jdGwudHJ0JElELCBhbGwuMTRjLnN1bS5kZiRJRCksICJZZWFyU2FtcGxlZCJdKQojIGNvcnJlY3QgYXJjaGl2ZSBzYW1wbGUgWWVhclNhbXBsZWQKYWxsLjE0Yy5jdGwudHJ0W2FsbC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJhcmMiICYgYWxsLjE0Yy5jdGwudHJ0JFNpdGUgPT0gIkhhaW5pY2giLCAiWWVhclNhbXBsZWQiXSA8LSAyMDExCgojIGFkZCB5ZWFyIG1lYXN1cmVkIGNvbHVtbiwgbW9kaWZ5IGZvciB0bWUubWlzYyBzYW1wbGVzLCByZXdldCBzYW1wbGVzCmFsbC4xNGMuY3RsLnRydCRZZWFyTWVhc3VyZWQgPC0gMjAxOAphbGwuMTRjLmN0bC50cnRbYWxsLjE0Yy5jdGwudHJ0JEV4cGVyaW1lbnQgPT0gInJld2V0IiwgIlllYXJNZWFzdXJlZCJdIDwtIDIwMTkKYWxsLjE0Yy5jdGwudHJ0W3doaWNoKGFsbC4xNGMuY3RsLnRydCRJRCAlaW4lIHRtZS5taXNjJElEKSwgIlllYXJNZWFzdXJlZCJdIDwtIDIwMDkKCiMgY2FsY3VsYXRlIHN0b3JhZ2UgZHVyYXRpb24gbnVtZXJpY2FsbHkgYW5kIGFzIGZhY3RvcgphbGwuMTRjLmN0bC50cnQkdG1lIDwtIHVubGlzdChhbGwuMTRjLmN0bC50cnQkWWVhck1lYXN1cmVkIC0gYWxsLjE0Yy5jdGwudHJ0JFllYXJTYW1wbGVkKQphbGwuMTRjLmN0bC50cnQkdG1lLmYgPC0gZmFjdG9yKGFsbC4xNGMuY3RsLnRydCR0bWUpCgojIGFkZCBkaWZmZXJlbmNlIGNvbHVtbgojIChleHByZXNzZWQgYXMgZGlmZmVyZW5jZSBvZiBtZWFucykKYWxsLjE0Yy5jdGwudHJ0JGN0bC50cnQuZDE0IDwtIGFsbC4xNGMuY3RsLnRydCRkMTRjX2NvcnJfbWVhbl9jdGwgLSBhbGwuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW5fdHJ0CiMgdHJ0LWN0bCBtYWtlcyBGaWcuIDQgKDE6MSBsaW5lKSBhbmQgRmlnLiA1IChzdG9yYWdlIGR1cmF0aW9uKSBtb3JlIGNvbXBhdGlibGUKYWxsLjE0Yy5jdGwudHJ0JHRydC5jdGwuZDE0IDwtIGFsbC4xNGMuY3RsLnRydCRkMTRjX2NvcnJfbWVhbl90cnQgLSBhbGwuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW5fY3RsCgojIGFkZCBhdG0gMTRDIGZvciB5ZWFyIHNhbXBsZWQgYW5kIGNhbGN1bGF0ZSBkZWx0YS1kZWx0YQphbGwuMTRjLmN0bC50cnQkYXRtLnlyLnNhbXBsZWQgPC0gRGF0bVttYXRjaChhbGwuMTRjLmN0bC50cnQkWWVhclNhbXBsZWQsIGZsb29yKERhdG0kRGF0ZSkpLCAiTkhjMTQiXQphbGwuMTRjLmN0bC50cnQkZGQuY3RsIDwtIGFsbC4xNGMuY3RsLnRydCRkMTRjX2NvcnJfbWVhbl9jdGwgLSBhbGwuMTRjLmN0bC50cnQkYXRtLnlyLnNhbXBsZWQKYWxsLjE0Yy5jdGwudHJ0JGRkLnRydCA8LSBhbGwuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW5fdHJ0IC0gYWxsLjE0Yy5jdGwudHJ0JGF0bS55ci5zYW1wbGVkCmFsbC4xNGMuY3RsLnRydCRjdGwudHJ0LmRkMTQgPC0gYWxsLjE0Yy5jdGwudHJ0JGRkLmN0bCAtIGFsbC4xNGMuY3RsLnRydCRkZC50cnQKCiMgc2F2ZSBSZGF0IGZpbGUKc2F2ZShhbGwuMTRjLmN0bC50cnQsIGZpbGUgPSAiLi9hbGwuMTRjLmN0bC50cnQuUkRhdGEiKQoKIyBTdGF0cwojIGxpbmVhciBtb2RlbHMKbG0uYWxsLjE0Yy5jdGwudHJ0IDwtIGxhcHBseSgKICBzcGxpdChhbGwuMTRjLmN0bC50cnQsIGFsbC4xNGMuY3RsLnRydCRFeHBlcmltZW50KSwgZnVuY3Rpb24oZXhwKSB7CiAgICBzdW1tYXJ5KGxtKGN0bC50cnQuZDE0IH4gVHlwZSwgZGF0YSA9IGV4cCkpCiAgfSkKIyBsb29rIGF0IHR5cGUgc2VwYXJhdGVseSAobnVsbCBtb2RlbHMpCmxtMi5hbGwuMTRjLmN0bC50cnQgPC0gbGFwcGx5KAogIHNwbGl0KGFsbC4xNGMuY3RsLnRydCwgYWxsLjE0Yy5jdGwudHJ0JEV4cGVyaW1lbnQpLCBmdW5jdGlvbihleHApIHsKICAgIGxhcHBseShzcGxpdChleHAsIGV4cCRUeXBlKSwgZnVuY3Rpb24oeCkgewogICAgICBzdW1tYXJ5KGxtKGN0bC50cnQuZDE0IH4gMSwgZGF0YSA9IHgpKQogICAgfSkKICB9KQojIHdpdGhvdXQgT2FrIFJpZGdlIHNhbXBsZXMgaW4gdG1lIGV4cGVyaW1lbnQKbG0zLmFsbC4xNGMuY3RsLnRydCA8LSBsYXBwbHkoCiAgc3BsaXQoYWxsLjE0Yy5jdGwudHJ0LCBhbGwuMTRjLmN0bC50cnQkRXhwZXJpbWVudCksIGZ1bmN0aW9uKGV4cCkgewogICAgaWYgKGV4cFsxLCAiRXhwZXJpbWVudCJdID09ICJ0bWUiKSB7CiAgICAgIGV4cCAlPiUKICAgICAgICBmaWx0ZXIoU2l0ZSAhPSAiV2Fsa2VyIEJyYW5jaCIgJiBTaXRlICE9ICJUZW5uZXNzZWUgVmFsbGV5IikgJT4lCiAgICAgICAgbG0oY3RsLnRydC5kMTQgfiBUeXBlLCBkYXRhID0gLikgJT4lCiAgICAgICAgc3VtbWFyeSgpCiAgICB9IGVsc2UgewogICAgICBzdW1tYXJ5KGxtKGN0bC50cnQuZDE0IH4gVHlwZSwgZGF0YSA9IGV4cCkpIAogICAgfQogIH0pCiMgY29tYmluZSBleHBlcmltZW50cyAxIGFuZCAzCnN1bW1hcnkobG0oY3RsLnRydC5kMTQgfiBUeXBlLCBkYXRhID0gYWxsLjE0Yy5jdGwudHJ0W2FsbC4xNGMuY3RsLnRydCRFeHBlcmltZW50ICE9ICJyZXdldCIsIF0pKQojIGNvbWJpbmUgZXhwZXJpbWVudHMgMSwgMiwgYW5kIDMKc3VtbWFyeShsbShjdGwudHJ0LmQxNCB+IFR5cGUsIGRhdGEgPSBhbGwuMTRjLmN0bC50cnQpKQoKIyBkaWZzCmUxMi4xNGMuY3RsLnRydC5zdW0gPC0gYWxsLjE0Yy5jdGwudHJ0ICU+JQogIGZpbHRlcihFeHBlcmltZW50ICE9ICJ0bWUiKSAlPiUKICBzZWxlY3QoRXhwZXJpbWVudCwgVHlwZSwgZDE0Y19jb3JyX21lYW5fY3RsLCBkMTRjX2NvcnJfbWVhbl90cnQsIHRydC5jdGwuZDE0LCBkZC5jdGwsIGRkLnRydCwgY3RsLnRydC5kZDE0KSAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUeXBlKSAlPiUKICBhZGRfdGFsbHkoKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpCmUxMi4xNGMuY3RsLnRydC5zdW0kdHJ0LmN0bC5kMTRfc2QgPC0gc3FydChlMTIuMTRjLmN0bC50cnQuc3VtJGQxNGNfY29ycl9tZWFuX2N0bF9zZF4yL2UxMi4xNGMuY3RsLnRydC5zdW0kbl9tZWFuICsgZTEyLjE0Yy5jdGwudHJ0LnN1bSRkMTRjX2NvcnJfbWVhbl90cnRfc2ReMi9lMTIuMTRjLmN0bC50cnQuc3VtJG5fbWVhbikKCiMgY3RsLWN0bCBkaWYgdnMuIHRydC10cnQKIyBkaWZzIGJ5IElECmhhaS5pZC5kZiA8LSBhbGwuMTRjLmN0bC50cnRbYWxsLjE0Yy5jdGwudHJ0JFNpdGUgPT0gIkhhaW5pY2giICYgYWxsLjE0Yy5jdGwudHJ0JEV4cGVyaW1lbnQgIT0gInRtZSIsIF0KaGFpLmN0bC5jdGwudHJ0LnRydCA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KHNwbGl0KGhhaS5pZC5kZiwgaGFpLmlkLmRmJElEKSwgZnVuY3Rpb24oZGYpIHsKICAgIGRpZi5jdGwgPC0gZGZbZGYkWWVhclNhbXBsZWQgPT0gMjAxMSwgImQxNGNfY29ycl9tZWFuX2N0bCJdIC0KICAgICAgZGZbZGYkWWVhclNhbXBsZWQgPT0gMjAxOSwgImQxNGNfY29ycl9tZWFuX2N0bCJdCiAgICBkaWYudHJ0IDwtIGRmW2RmJFllYXJTYW1wbGVkID09IDIwMTEsICJkMTRjX2NvcnJfbWVhbl90cnQiXSAtCiAgICAgIGRmW2RmJFllYXJTYW1wbGVkID09IDIwMTksICJkMTRjX2NvcnJfbWVhbl90cnQiXQogICAgcmV0dXJuKGRhdGEuZnJhbWUoZGlmID0gYyhkaWYuY3RsLCBkaWYudHJ0KSwKICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPSBkZiRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgdHJlYXQgPSBjKCJjdGwiLCAidHJ0IikpKQogIH0pCikKaGFpLmN0bC5jdGwudHJ0LnRydC5kZiA8LSBoYWkuY3RsLmN0bC50cnQudHJ0ICU+JSAKICBncm91cF9ieShUeXBlLCB0cmVhdCkgJT4lCiAgYWRkX3RhbGx5KCkgJT4lCiAgc3VtbWFyaXplKGFjcm9zcyhkaWY6biwgbGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCkpKSAlPiUKICBtdXRhdGUoc2UgPSBkaWZfc2QgLyBuX21lYW4sCiAgICAgICAgIHQgPSBxdChwID0gLjA1LzIsIGRmID0gbl9tZWFuIC0gMSksCiAgICAgICAgIGNpLjk1LnUgPSBkaWZfbWVhbiArIHQgKiBzZSwKICAgICAgICAgY2kuOTUubCA9IGRpZl9tZWFuIC0gdCAqIHNlKQpoYWkuY3RsLmN0bC50cnQudHJ0LmRmICU+JQogIG11dGF0ZShUcmVhdG1lbnQgPSBpZmVsc2UodHJlYXQgPT0gImN0bCIsICJjb250cm9sIiwgImFpci1kcmllZC9yZXdldHRlZCIpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFRyZWF0bWVudCwgZGlmX21lYW4sIGZpbGwgPSBUeXBlLCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBjaS45NS5sLCB5bWF4ID0gY2kuOTUudSksCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpLCAKICAgICAgICAgICAgICAgIHdpZHRoID0gLjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCdGJyA9ICcjYTM1NTEzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycgPSAnIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGJyA9ICdGb3Jlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJyA9ICdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCdGJyA9ICcjYTM1NTEzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJyA9ICcjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRicgPSAnRm9yZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJyA9ICdHcmFzc2xhbmQnKSkgKwogIHlsYWIoZXhwcmVzc2lvbignMjAxMSAnKkRlbHRhKicnXjE0KidDIC0gMjAxOSAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyIHBsb3QtMTRjLWFsbC1jdGwtdHJ0fQojIGxpc3Qgb2YgbG9jYXRpb25zIGZvciByZWNvZGluZwpsb2MgPC0gbGlzdCgKICAgICJEdWtlIiA9ICJEdWtlIEZBQ0UgY29udHJvbCAoIzMpIiwKICAgICJIb3dsYW5kIiA9ICJIb3dsYW5kICgjMykiLAogICAgIkhhcnZhcmQiID0gIkhhcnZhcmQgRm9yZXN0ICgjMykiLAogICAgIkhhaW5pY2giID0gIkNlbnRyYWwgR2VybWFueSIsCiAgICAiU2Nob3JmaGVpZGUiID0gIkNlbnRyYWwgR2VybWFueSIsCiAgICAiTXVzaWNrIiA9ICJTaWVycmEgTmV2YWRhLCBDQSAoIzMpIiwKICAgICJTaGF2ZXIiID0gIlNpZXJyYSBOZXZhZGEsIENBICgjMykiLAogICAgIldhbGtlciBCcmFuY2giID0gIk9hayBSaWRnZSAoIzMpIiwKICAgICJUZW5uZXNzZWUgVmFsbGV5IiA9ICJPYWsgUmlkZ2UgKCMzKSIpCgojIFBsb3Qgb24gMToxIGxpbmUgdy8gZGlhZ29uYWwgbGluZXMgc2hvd2luZyDigLAgb2Zmc2V0cwojIGZpcnN0IGNvbGxhcHNlIHNpdGVzIGZvciBiZXR0ZXIgdmlzdWFscwphbGwuMTRjLmN0bC50cnQgJT4lCiAgZmlsdGVyKEhvcml6b24gPT0gIkEiKSAlPiUKICBtdXRhdGUoTG9jYXRpb24gPSByZWNvZGUoU2l0ZSwgISEhbG9jKSkgJT4lCiAgbXV0YXRlKExvY2F0aW9uID0gaWZlbHNlKExvY2F0aW9uID09ICJDZW50cmFsIEdlcm1hbnkiICYgRXhwZXJpbWVudCA9PSAicmV3ZXQiLCAiQ2VudHJhbCBHZXJtYW55ICgjMikiLCBpZmVsc2UoTG9jYXRpb24gPT0gIkNlbnRyYWwgR2VybWFueSIgJiBFeHBlcmltZW50ID09ICJhcmMiLCAiQ2VudHJhbCBHZXJtYW55ICgjMSkiLCBpZmVsc2UoTG9jYXRpb24gPT0gIkNlbnRyYWwgR2VybWFueSIgJiBFeHBlcmltZW50ID09ICJ0bWUiLCAiQ2VudHJhbCBHZXJtYW55ICgjMykiLCBMb2NhdGlvbikpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX2NvcnJfbWVhbl9jdGwsIGQxNGNfY29ycl9tZWFuX3RydCwgY29sb3IgPSBMb2NhdGlvbiwgc2hhcGUgPSBUeXBlKSkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLTIwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAyMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLTQwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSA0MCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiZ3JheSIpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX21pbl90cnQsIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbWF4X3RydCwgCiAgICAgICAgY29sb3IgPSBMb2NhdGlvbiksIAogICAgd2lkdGggPSAuMjUpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19jb3JyX21pbl9jdGwsIAogICAgICAgIHhtYXggPSBkMTRjX2NvcnJfbWF4X2N0bCwgCiAgICAgICAgY29sb3IgPSBMb2NhdGlvbiksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJMb2NhdGlvbiAoRXhwZXJpbWVudCAjKSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0R1a2UgRkFDRSBjb250cm9sICgjMyknID0gJyMwMUJCOTcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTaWVycmEgTmV2YWRhLCBDQSAoIzMpJyA9ICcjRkZDMTA3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2VudHJhbCBHZXJtYW55ICgjMSknID0gJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2VudHJhbCBHZXJtYW55ICgjMiknID0gJyM5OTk5OTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDZW50cmFsIEdlcm1hbnkgKCMzKScgPSAnI2M2YzZjNicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hhcnZhcmQgRm9yZXN0ICgjMyknID0gJyMxRTg4RTUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPYWsgUmlkZ2UgKCMzKScgPSAnI0Q4MUI2MCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygnRic9IDE3LCdHJyA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICB4bGFiKGV4cHJlc3Npb24oJ0NvbnRyb2wgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYihleHByZXNzaW9uKCdUcmVhdG1lbnQgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSwKICAgICAgICBhc3BlY3QucmF0aW8gPSAxKQoKIyBmb3IgcGxvdHRpbmcgd2l0aCBjb2xvciA9IFR5cGUgKGN1cnJlbnRseSBzdXBwcmVzc2VkKQojIGFsbC4xNGMuY3RsLnRydCAlPiUKIyAgIGZpbHRlcihIb3Jpem9uID09ICJBIikgJT4lCiMgICBtdXRhdGUoTG9jYXRpb24gPSBmYWN0b3IocmVjb2RlKFNpdGUsICEhIWxvYyksIGV4Y2x1ZGUgPSBUUlVFKSkgJT4lCiMgICBnZ3Bsb3QoLiwgYWVzKGQxNGNfY29ycl9tZWFuX2N0bCwgZDE0Y19jb3JyX21lYW5fdHJ0LCBjb2xvciA9IFR5cGUsIHNoYXBlID0gTG9jYXRpb24pKSArCiMgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLTIwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiMgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDIwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiMgICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IC00MCwgbGluZXR5cGUgPSAiZG90ZGFzaCIpICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gNDAsIGxpbmV0eXBlID0gImRvdGRhc2giKSArCiMgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwojICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiZ3JheSIpICsKIyAgIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKIyAgIGdlb21fZXJyb3JiYXIoCiMgICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX21pbl90cnQsIAojICAgICAgICAgeW1heCA9IGQxNGNfY29ycl9tYXhfdHJ0LCAKIyAgICAgICAgIGNvbG9yID0gVHlwZSksIAojICAgICB3aWR0aCA9IC4yNSkgKwojICAgZ2VvbV9lcnJvcmJhcmgoCiMgICAgIGFlcyh4bWluID0gZDE0Y19jb3JyX21pbl9jdGwsIAojICAgICAgICAgeG1heCA9IGQxNGNfY29ycl9tYXhfY3RsLCAKIyAgICAgICAgIGNvbG9yID0gVHlwZSksIAojICAgICBoZWlnaHQgPSAuOSkgKwojICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKIyAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwojICAgeGxhYihleHByZXNzaW9uKCdDb250cm9sICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgeWxhYihleHByZXNzaW9uKCdUcmVhdG1lbnQgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSwKIyAgICAgICAgIGFzcGVjdC5yYXRpbyA9IDEpCmBgYAo+KipGaWcuIGByIHtmaWcubiArIDJ9YC4gT3ZlcmFsbCB0cmVhdG1lbnQgZWZmZWN0IG9uICRcRGVsdGEkXjE0XkMtQ09+Mn4qKgoKPipDYXB0aW9uOiogUG9pbnRzIHNob3cgZGF0YSBmcm9tIEV4cGVyaW1lbnRzIDEgYW5kIDMgKGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCkgYW5kIEV4cGVyaW1lbnQgMiAoYWlyLWRyeSBvbmx5IHRyZWF0bWVudCkuIFBvaW50cyBhcmUgdGhlIG1lYW4gb2YgbGFib3JhdG9yeSByZXBsaWNhdGVzIChmb3IgcmVwbGljYXRlZCBzYW1wbGVzKTsgZXJyb3IgYmFycyBhcmUgMnggc3RhbmRhcmQgZXJyb3IuIFNvbGlkIGxpbmUgaXMgMToxLiBGb3IgY29udGV4dCwgdGhlIGRhc2hlZCBhbmQgZG90dGVkIGxpbmVzIHNob3cgZGlmZmVyZW5jZXMgb2YgwrEyMOKAsCBhbmQgwrEkNDDigLAsIGVxdWl2YWxlbnQgdG8gdGhlIGRlY2xpbmUgaW4gJFxEZWx0YSReMTReQyBpbiBhdG1vc3BoZXJpYyBDT34yfiBvdmVyIDQgYW5kIDggeSByZXNwZWN0aXZlbHksIGR1cmluZyB0aGUgcGVyaW9kIG9mIDIwMDAgdG8gMjAyMCAoR3JhdmVuIGV0IGFsLiAyMDE3KS4KCiMjIFN0b3JhZ2UgZHVyYXRpb24gZWZmZWN0IG9uIF4xNF5DLUNPfjJ+IChFeHBlcmltZW50IDMpCgpgYGB7ciBwbG90LWR1ci1zdG9yLCBmaWcuaGVpZ2h0PTR9CiMgbmV3IGxvY2F0aW9uIGNvZGVzCmxvYzIgPC0gbGlzdCgKICAgICJEdWtlIiA9ICJEdWtlIEZBQ0UgY29udHJvbCIsCiAgICAiSG93bGFuZCIgPSAiSG93bGFuZCIsCiAgICAiSGFydmFyZCIgPSAiSGFydmFyZCBGb3Jlc3QiLAogICAgIkhhaW5pY2giID0gIkNlbnRyYWwgR2VybWFueSIsCiAgICAiU2Nob3JmaGVpZGUiID0gIkNlbnRyYWwgR2VybWFueSIsCiAgICAiTXVzaWNrIiA9ICJTaWVycmEgTmV2YWRhLCBDQSIsCiAgICAiU2hhdmVyIiA9ICJTaWVycmEgTmV2YWRhLCBDQSIsCiAgICAiV2Fsa2VyIEJyYW5jaCIgPSAiT2FrIFJpZGdlIiwKICAgICJUZW5uZXNzZWUgVmFsbGV5IiA9ICJPYWsgUmlkZ2UiKQoKIyBQbG90IHN0b3JhZ2UgZHVyYXRpb24Kc3VwcHJlc3NXYXJuaW5ncygKICBhbGwuMTRjLmN0bC50cnQgJT4lCiAgICBmaWx0ZXIoSG9yaXpvbiA9PSAiQSIpICU+JQogICAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInJld2V0IikgJT4lCiAgICBzZWxlY3QoVHlwZSwgdG1lLmYsIFNpdGUsIHRydC5jdGwuZDE0LCB0bWUpICU+JQogICAgZ3JvdXBfYnkoVHlwZSwgdG1lLmYsIFNpdGUpICU+JQogICAgYWRkX3RhbGx5KCkgJT4lCiAgICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogICAgbXV0YXRlKGRpZl9zZSA9IHRydC5jdGwuZDE0X3NkL25fbWVhbiwKICAgICAgICAgICBkaWZfdSA9IHRydC5jdGwuZDE0X21lYW4gKyBkaWZfc2UqMiwKICAgICAgICAgICBkaWZfbCA9IHRydC5jdGwuZDE0X21lYW4gLSBkaWZfc2UqMikgJT4lCiAgICBtdXRhdGUoTG9jYXRpb24gPSBmYWN0b3IocmVjb2RlKFNpdGUsICEhIWxvYzIpLCBleGNsdWRlID0gVFJVRSkpICU+JQogICAgZ2dwbG90KC4sIGFlcyh0bWVfbWVhbiwgdHJ0LmN0bC5kMTRfbWVhbiwgY29sb3IgPSBMb2NhdGlvbiwgc2hhcGUgPSBUeXBlKSkgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gNDAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC00MCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogICAgZ2VvbV9wb2ludChzaXplID0gMywgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZTIod2lkdGggPSAuNywgcHJlc2VydmUgPSAic2luZ2xlIikpICsKICAgIGdlb21fZXJyb3JiYXIoCiAgICAgIGFlcyh5bWluID0gZGlmX2wsCiAgICAgICAgICB5bWF4ID0gZGlmX3UsIAogICAgICAgICAgY29sb3IgPSBMb2NhdGlvbiksCiAgICAgIHdpZHRoID0gLjcsCiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKHdpZHRoID0gLjcsIHByZXNlcnZlID0gInNpbmdsZSIpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygnRHVrZSBGQUNFIGNvbnRyb2wnID0gJyMwMUJCOTcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NpZXJyYSBOZXZhZGEsIENBJyA9ICcjRkZDMTA3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDZW50cmFsIEdlcm1hbnknID0gJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIYXJ2YXJkIEZvcmVzdCcgPSAnIzFFODhFNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT2FrIFJpZGdlJyA9ICcjRDgxQjYwJykpICsKICAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygnRic9IDE3LCdHJyA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSg1LDEzLDIpKSArCiAgICB5bGFiKGV4cHJlc3Npb24oJ1RyZWF0bWVudCAtIENvbnRyb2wgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgICB4bGFiKCJTdG9yYWdlIGR1cmF0aW9uICh5ZWFycykiKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCiAgKQpgYGAKCj4qKkZpZy4gYHIge2ZpZy5uICsgM31gLiBDaGFuZ2UgaW4gXjE0XkMtQ09+Mn4gaW4gcmVsYXRpb24gdG8gc3RvcmFnZSBkdXJhdGlvbioqCgo+KkNhcHRpb246KiBEYXRhIGFyZSBmcm9tIGJvdGggRXhwZXJpbWVudCAxIChpbiBibGFjaykgYW5kIEV4cGVyaW1lbnQgMyAoYWxsIG90aGVyIHBvaW50cyksIGF2ZXJhZ2VkIGJ5IHNpdGUgYW5kIGVjb3N5c3RlbSB0eXBlLiBQb2ludHMgYXJlIHRoZSBtZWFuLCBlcnJvciBiYXJzIGFyZSAyeCBzdGFuZGFyZCBlcnJvci4gRm9yIGNvbnRleHQsIHRoZSBkYXNoZWQgYW5kIGRvdHRlZCBsaW5lcyBhcmUgdGhlIHNhbWUgaXMgaW4gRmlnLiBgciB7ZmlnLm4gKyAzfWAgYW5kIHNob3cgYSBkaWZmZXJlbmNlIG9mIDIw4oCwIGFuZCA0MOKAsCwgZXF1aXZhbGVudCB0byB0aGUgZGVjbGluZSBpbiAkXERlbHRhJF4xNF5DIGluIGF0bW9zcGhlcmljIENPfjJ+IG92ZXIgNCBhbmQgOCB5IHJlc3BlY3RpdmVseSwgZHVyaW5nIHRoZSBwZXJpb2Qgb2YgMjAwMCB0byAyMDIwIChHcmF2ZW4gZXQgYWwuIDIwMTcpLiBQb3NpdGlvbiBvZiBwb2ludHMgaml0dGVyZWQgdG8gYXZvaWQgb3ZlcnBsb3R0aW5nOyBzdG9yYWdlIGR1cmF0aW9uIGhhcyBiZWVuIHJvdW5kZWQgZG93biB0byB0aGUgbmVhcmVzdCB3aG9sZSB5ZWFyLgoKYGBge3IgdHJlYXRtZW50IGVmZmVjdHMgYnkgdGltZSwgZmlnLmhlaWdodD00fQojICMgY29kZSBmb3IgcGxvdHRpbmcgZGF0YSBieSBJRAojIGFsbC4xNGMuc3VtICU+JQojICAgZmlsdGVyKFBlcmlvZCA9PSAiaW5jIikgJT4lCiMgICBmaWx0ZXIoIWdyZXBsKCJTIiwgSUQpKSAlPiUKIyAgIG11dGF0ZSh5ZWFyLklEID0gcGFzdGUoWWVhclNhbXBsZWQsIElEKSkgJT4lCiMgICBnZ3Bsb3QoLiwgYWVzKFllYXJTYW1wbGVkLCBkMTRjX2NvcnJfbWVhbiwgY29sb3IgPSBUeXBlKSkgKwojICAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBUcmVhdG1lbnQpLCBzaXplID0gMykgKwojICAgZ2VvbV9wYXRoKGFlcyhncm91cCA9IHllYXIuSUQpLCAKIyAgICAgICAgICAgICBhcnJvdyA9IGFycm93KHR5cGUgPSAib3BlbiIsIGxlbmd0aCA9IHVuaXQoLjEsICJpbmNoZXMiKSwgZW5kcyA9ICJsYXN0IiksCiMgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwojICAgZ2VvbV9wYXRoKGRhdGEgPSBEYXRtLCBhZXMoRGF0ZSwgTkhjMTQpLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKIyAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiMgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKIyAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSIgPSAxLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gMTYpKSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyMDEwLCAyMDIwKSwgYnJlYWtzID0gYygyMDEzLCAyMDE2LCAyMDE5KSkgKwojICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTE1LCAxMDApKSArCiMgICB4bGFiKCdZZWFyIHNhbXBsZWQnKSArCiMgICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICBmYWNldF93cmFwKH4gSUQsIG5jb2wgPSAzKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIEFkZCAiVHlwZSIgdG8gRGF0bSB0byBkaXNwbGF5IGxlZ2VuZApEYXRtJEF0bW9zcGhlcmUgPC0gImF0bW9zcGhlcmUiCmF0bS5kMTRjLjIwMTEgPC0gRGF0bVtEYXRtJERhdGUgPT0gMjAxMS41LCAiTkhjMTQiXQphdG0uZDE0Yy4yMDE5IDwtIERhdG1bRGF0bSREYXRlID09IDIwMTkuNSwgIk5IYzE0Il0KCiMgcGxvdCBvdmVyIHRpbWUsIGF2ZXJhZ2VkIGJ5IFR5cGUKIyBmaXJzdCBuZWVkIHRvIGNhbGN1bGF0ZSBncm91cCBtZWFucwphcmMucmV3ZXQuMTRjLmluYy5HTSA8LSBhbGwuMTRjLnN1bS5kZiAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIiAmIFBlcmlvZCA9PSAiaW5jIikgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHlwZSwgWWVhclNhbXBsZWQsIFRyZWF0bWVudCkgJT4lCiAgc3VtbWFyaXplKGFjcm9zcyhkMTRjX2NvcnJfbWVhbiwgbWVhbiwgbmEucm0gPSBUUlVFKSkgJT4lCiAgbXV0YXRlKHllYXIuVHlwZSA9IHBhc3RlKFllYXJTYW1wbGVkLCBUeXBlKSwKICAgICAgICAgZGQxNGMgPSBpZmVsc2UoWWVhclNhbXBsZWQgPT0gMjAxMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXRtLmQxNGMuMjAxMSAtIGQxNGNfY29ycl9tZWFuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBhdG0uZDE0Yy4yMDE5IC0gZDE0Y19jb3JyX21lYW4pKQogIAojICMgb3JpZ2luYWwgcGxvdAojIGFsbC4xNGMuc3VtMiAlPiUKIyAgIGZpbHRlcihQZXJpb2QgPT0gImluYyIpICU+JQojICAgbXV0YXRlKHllYXIuVHlwZSA9IHBhc3RlKFllYXJTYW1wbGVkLCBUeXBlKSwKIyAgICAgICAgICBFY28gPSBpZmVsc2UoVHlwZSA9PSAiRiIsICJGb3Jlc3QiLCAiR3Jhc3NsYW5kIikpICU+JQojICAgZ2dwbG90KC4sIGFlcyhZZWFyU2FtcGxlZCwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSkpICsKIyAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50KSwgc2l6ZSA9IDMsIHN0cm9rZSA9IDEuNSkgKwojICAgZ2VvbV9wYXRoKGFlcyhncm91cCA9IHllYXIuVHlwZSksIAojICAgICAgICAgICAgIGFycm93ID0gYXJyb3codHlwZSA9ICJvcGVuIiwgbGVuZ3RoID0gdW5pdCguMSwgImluY2hlcyIpLCBlbmRzID0gImZpcnN0IiksCiMgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSwKIyAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMiwgcHJlc2VydmUgPSAic2luZ2xlIiksCiMgICAgICAgICAgICAgc2l6ZSA9IDEuMikgKwojICAgZ2VvbV9wYXRoKGRhdGEgPSBEYXRtLCBhZXMoRGF0ZSwgTkhjMTQsIGxpbmV0eXBlID0gQXRtb3NwaGVyZSksIGNvbG9yID0gImJsYWNrIikgKwojICAgZ2VvbV9lcnJvcmJhcigKIyAgICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbCwgCiMgICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX3UsIAojICAgICAgICAgY29sb3IgPSBUeXBlKSwgCiMgICAgIHdpZHRoID0gLjUsCiMgICAgIGFscGhhID0gLjMpICsKIyAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygnRicgPSAnI2EzNTUxMycsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycgPSAnIzEzNjFhMycpLAojICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR3Jhc3NsYW5kJykpICsKIyAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSIgPSAxLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gMTYpLAojICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImFpci1kcnkiID0gImFpci1kcnkiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAiYWlyLWRyeSArIHN0b3JhZ2UiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gImNvbnRyb2wtMSAoMjAxMSlcbmNvbnRyb2wtMiAoMjAxOSkiKSkgKwojICAgZ3VpZGVzKGxpbmV0eXBlID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gTlVMTCkpICsKIyAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDIwMTAsIDIwMjApLCBicmVha3MgPSBjKDIwMTEsIDIwMTkpKSArCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTUsIDEwMCkpICsKIyAgIHhsYWIoJ1llYXIgc2FtcGxlZCcpICsKIyAgIHlsYWIoZXhwcmVzc2lvbignbWVhbiAnKkRlbHRhKicnXjE0KidDLUNPJ1syXSonICjigLApJykpICsKIyAgIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoRWNvKSkgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyBQbG90IGFsbCBwb2ludHMgaW4gYmFja2dyb3VuZAphbGwuMTRjLnN1bS5kZiAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIiAmIFBlcmlvZCA9PSAiaW5jIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhZZWFyU2FtcGxlZCwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSkpICsKICBnZW9tX3BvaW50KGRhdGEgPSBhcmMucmV3ZXQuMTRjLmluYy5HTSwgCiAgICAgICAgICAgICBhZXMoWWVhclNhbXBsZWQsIGQxNGNfY29ycl9tZWFuLCBzaGFwZSA9IFRyZWF0bWVudCksCiAgICAgICAgICAgICBzaXplID0gNCwgc3Ryb2tlID0gMikgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50KSwgCiAgICAgICAgICAgICBzaXplID0gMiwgYWxwaGEgPSAuNSwgCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMS4xMSwgcHJlc2VydmUgPSAic2luZ2xlIiksCiAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX21pbiwgCiAgICAgICAgeW1heCA9IGQxNGNfY29ycl9tYXgpLCAKICAgIHdpZHRoID0gLjQsIGFscGhhID0gLjMsIAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEuMiwgcHJlc2VydmUgPSAic2luZ2xlIikpICsKICBnZW9tX3BhdGgoZGF0YSA9IGFyYy5yZXdldC4xNGMuaW5jLkdNLAogICAgICAgICAgICBhZXMoWWVhclNhbXBsZWQsIGQxNGNfY29ycl9tZWFuLGdyb3VwID0geWVhci5UeXBlKSwKICAgICAgICAgICAgYXJyb3cgPSBhcnJvdyh0eXBlID0gIm9wZW4iLCBsZW5ndGggPSB1bml0KC4xLCAiaW5jaGVzIiksIGVuZHMgPSAiZmlyc3QiKSwKICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC0xLjQsIHByZXNlcnZlID0gInNpbmdsZSIpLAogICAgICAgICAgICBzaXplID0gMS4yKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBEYXRtLCBhZXMoRGF0ZSwgTkhjMTQsIGxpbmV0eXBlID0gQXRtb3NwaGVyZSksIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0YnID0gJyNhMzU1MTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJyA9ICcjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImFpci1kcnkiID0gImFpci1kcnkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gImFpci1kcnkgKyBzdG9yYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAiY29udHJvbC0xICgyMDExKVxuY29udHJvbC0yICgyMDE5KSIpKSArCiAgZ3VpZGVzKGxpbmV0eXBlID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gTlVMTCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyMDEwLCAyMDIwKSwgYnJlYWtzID0gYygyMDExLCAyMDE5KSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0xNSwgMTAwKSkgKwogIHhsYWIoJ1llYXIgc2FtcGxlZCcpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQy1DTydbMl0qJyAo4oCwKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwKICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoVHlwZSA9IGMoIkYiID0gIkZvcmVzdCIsICJHIiA9ICJHcmFzc2xhbmQiKSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyBwbG90IGRkMTRjCmFsbC4xNGMuc3VtLmRmICU+JQogIGZpbHRlcihFeHBlcmltZW50ICE9ICJ0bWUiICYgUGVyaW9kID09ICJpbmMiKSAlPiUKICBtdXRhdGUoYXRtMTRjID0gaWZlbHNlKFllYXJTYW1wbGVkID09IDIwMTEsIGF0bS5kMTRjLjIwMTEsIGF0bS5kMTRjLjIwMTkpKSAlPiUKICBtdXRhdGUoZGQxNGMgPSBhdG0xNGMgLSBkMTRjX2NvcnJfbWVhbiwKICAgICAgICAgZGQxNGNfbWluID0gYXRtMTRjIC0gIGQxNGNfY29ycl9taW4sCiAgICAgICAgIGRkMTRjX21heCA9IGF0bTE0YyAtICBkMTRjX2NvcnJfbWF4KSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFllYXJTYW1wbGVkLCBkZDE0YywgY29sb3IgPSBUeXBlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KGRhdGEgPSBhcmMucmV3ZXQuMTRjLmluYy5HTSwgCiAgICAgICAgICAgICBhZXMoWWVhclNhbXBsZWQsIGRkMTRjLCBzaGFwZSA9IFRyZWF0bWVudCksCiAgICAgICAgICAgICBzaXplID0gNCwgc3Ryb2tlID0gMikgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50KSwgCiAgICAgICAgICAgICBzaXplID0gMiwgYWxwaGEgPSAuNSwgCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMS4xMSwgcHJlc2VydmUgPSAic2luZ2xlIiksCiAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZGQxNGNfbWluLCAKICAgICAgICB5bWF4ID0gZGQxNGNfbWF4KSwgCiAgICB3aWR0aCA9IC40LCBhbHBoYSA9IC4zLCAKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxLjIsIHByZXNlcnZlID0gInNpbmdsZSIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygnRicgPSAnI2EzNTUxMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnID0gJyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5IiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiYWlyLWRyeSIgPSAiYWlyLWRyeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAiYWlyLWRyeSArIHN0b3JhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9ICJjb250cm9sLTEgKDIwMTEpXG5jb250cm9sLTIgKDIwMTkpIikpICsKICBndWlkZXMobGluZXR5cGUgPSBndWlkZV9sZWdlbmQodGl0bGUgPSBOVUxMKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDIwMTAsIDIwMjApLCBicmVha3MgPSBjKDIwMTEsIDIwMTkpKSArCiAgeGxhYignWWVhciBzYW1wbGVkJykgKwogIHlsYWIoZXhwcmVzc2lvbignbWVhbiAnKkRlbHRhKkRlbHRhKicnXjE0KidDLUNPJ1syXSonICjigLApJykpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFR5cGUpLAogICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihUeXBlID0gYygiRiIgPSAiRm9yZXN0IiwgIkciID0gIkdyYXNzbGFuZCIpKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIG9yaWdpbmFsIHBsb3QgYnV0IHdpdGggbWl4ZWQgbW9kZWwgY2FsY3VsYXRlZCBDSXMKZml4ZWYuYXJjLnJld2V0ICU+JQogIG11dGF0ZShZZWFyU2FtcGxlZCA9IGlmZWxzZShFeHBlcmltZW50ID09ICJhcmMiLCAyMDExLCAyMDE5KSkgJT4lCiAgbXV0YXRlKHllYXIuVHlwZSA9IHBhc3RlKFllYXJTYW1wbGVkLCBUeXBlKSwKICAgICAgICAgVHJlYXRtZW50ID0gaWZlbHNlKHRyZWF0LmJpID09ICJ0cmVhdG1lbnQiICYgRXhwZXJpbWVudCA9PSAiYXJjIiwgImFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlIiwgaWZlbHNlKHRyZWF0LmJpID09ICJ0cmVhdG1lbnQiICYgRXhwZXJpbWVudCA9PSAicmV3ZXQiLCAiYWlyLWRyeS9yZXdldCIsICJjb250cm9sIikpLAogICAgICAgICB5cnNtX29mZnNldCA9IGlmZWxzZSh0cmVhdC5iaSA9PSAidHJlYXRtZW50IiwgWWVhclNhbXBsZWQgKyAuMjUsIFllYXJTYW1wbGVkIC0gLjI1KSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh5cnNtX29mZnNldCwgZXN0LCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBUcmVhdG1lbnQpLCAKICAgICAgICAgICAgIHNpemUgPSAzLCBzdHJva2UgPSAxLjUpICsKICBnZW9tX3BhdGgoYWVzKFllYXJTYW1wbGVkLCBlc3QsIGdyb3VwID0geWVhci5UeXBlKSwgCiAgICAgICAgICAgIGFycm93ID0gYXJyb3codHlwZSA9ICJvcGVuIiwgbGVuZ3RoID0gdW5pdCguMSwgImluY2hlcyIpLCBlbmRzID0gImxhc3QiKSwKICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC0xLjUsIHByZXNlcnZlID0gInNpbmdsZSIpLAogICAgICAgICAgICBzaXplID0gMS4yKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBEYXRtLCBhZXMoRGF0ZSwgTkhjMTQsIGxpbmV0eXBlID0gQXRtb3NwaGVyZSksIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGNpOTUubCwgeW1heCA9IGNpOTUudSwgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC41LCBhbHBoYSA9IC4zKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygnRicgPSAnI2EzNTUxMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnID0gJyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5L3Jld2V0IiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiYWlyLWRyeSIgPSAiYWlyLWRyeS9yZXdldCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9ICJjb250cm9sLTEgKDIwMTEpXG5jb250cm9sLTIgKDIwMTkpIikpICsKICBndWlkZXMobGluZXR5cGUgPSBndWlkZV9sZWdlbmQodGl0bGUgPSBOVUxMKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDIwMTAsIDIwMjApLCBicmVha3MgPSBjKDIwMTEsIDIwMTkpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTE1LCAxMDUpKSArCiAgeGxhYignWWVhciBzYW1wbGVkJykgKwogIHlsYWIoZXhwcmVzc2lvbignbWVhbiAnKkRlbHRhKicnXjE0KidDLUNPJ1syXSonICjigLApJykpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFR5cGUpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgUGxvdCBIYWluaWNoIHBvaW50cyBvbmx5LCBubyBhcnJvd3MKYWxsLjE0Yy5zdW0uZGYgJT4lCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIgJiBQZXJpb2QgPT0gImluYyIgJiBTaXRlID09ICJIYWluaWNoIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhZZWFyU2FtcGxlZCwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSkpICsKICBnZW9tX3BvaW50KGRhdGEgPSBhcmMucmV3ZXQuMTRjLmluYy5HTSwgCiAgICAgICAgICAgICBhZXMoWWVhclNhbXBsZWQsIGQxNGNfY29ycl9tZWFuLCBzaGFwZSA9IFRyZWF0bWVudCksCiAgICAgICAgICAgICBzaXplID0gNCwgc3Ryb2tlID0gMiwKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAtLjUsIHByZXNlcnZlID0gInNpbmdsZSIpKSArCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBUcmVhdG1lbnQpLCAKICAgICAgICAgICAgIHNpemUgPSAyLCBhbHBoYSA9IC41LCAKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuNSwgcHJlc2VydmUgPSAic2luZ2xlIiksCiAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX21pbiwgCiAgICAgICAgeW1heCA9IGQxNGNfY29ycl9tYXgpLCAKICAgIHdpZHRoID0gLjUsIGFscGhhID0gLjMsIAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC42LCBwcmVzZXJ2ZSA9ICJzaW5nbGUiKSkgKwogIGdlb21fcGF0aChkYXRhID0gRGF0bSwgYWVzKERhdGUsIE5IYzE0LCBsaW5ldHlwZSA9IEF0bW9zcGhlcmUpLCBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCdGJyA9ICcjYTM1NTEzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycgPSAnIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkiID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gMTYpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJhaXItZHJ5IiA9ICJhaXItZHJ5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9ICJhaXItZHJ5ICsgc3RvcmFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gImNvbnRyb2wtMSAoMjAxMSlcbmNvbnRyb2wtMiAoMjAxOSkiKSkgKwogIGd1aWRlcyhsaW5ldHlwZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9IE5VTEwpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMjAxMCwgMjAyMCksIGJyZWFrcyA9IGMoMjAxMSwgMjAxOSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTUsIDEwMCkpICsKICB4bGFiKCdZZWFyIHNhbXBsZWQnKSArCiAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqRGVsdGEqJydeMTQqJ0MtQ08nWzJdKicgKOKAsCknKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoVHlwZSksCiAgICAgICAgICAgICBsYWJlbGxlciA9IGxhYmVsbGVyKFR5cGUgPSBjKCJGIiA9ICJGb3Jlc3QiLCAiRyIgPSAiR3Jhc3NsYW5kIikpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgcGxvdCB0cmVuZHMgb3ZlciB0aW1lIGJ5IHNhbXBsZSwgdHJlYXRtZW50CmFsbC4xNGMuc3VtLmRmICU+JQogIGZpbHRlcihFeHBlcmltZW50ICE9ICJ0bWUiICYgUGVyaW9kID09ICJpbmMiICYgU2l0ZSA9PSAiSGFpbmljaCIpICU+JQogIG11dGF0ZSh0cmVhdC5JRCA9IHBhc3RlMCh0cmVhdC5iaSwgSUQpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFllYXJTYW1wbGVkLCBkMTRjX2NvcnJfbWVhbiwgY29sb3IgPSBUeXBlKSkgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50KSwgCiAgICAgICAgICAgICBzaXplID0gMiwgYWxwaGEgPSAuNSkgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSB0cmVhdC5JRCwgbGluZXR5cGUgPSB0cmVhdC5iaSkpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbWluLCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heCksIAogICAgd2lkdGggPSAuNSwgYWxwaGEgPSAuMykgKwogIGdlb21fcGF0aChkYXRhID0gRGF0bSwgYWVzKERhdGUsIE5IYzE0KSwgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygnRicgPSAnI2EzNTUxMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnID0gJyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5IiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2KSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiYWlyLWRyeSIgPSAiYWlyLWRyeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAiYWlyLWRyeSArIHN0b3JhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9ICJjb250cm9sLTEgKDIwMTEpXG5jb250cm9sLTIgKDIwMTkpIikpICsKICBndWlkZXMobGluZXR5cGUgPSBndWlkZV9sZWdlbmQodGl0bGUgPSBOVUxMKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDIwMTAsIDIwMjApLCBicmVha3MgPSBjKDIwMTEsIDIwMTkpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTE1LCAxMDApKSArCiAgeGxhYignWWVhciBzYW1wbGVkJykgKwogIHlsYWIoZXhwcmVzc2lvbignbWVhbiAnKkRlbHRhKicnXjE0KidDLUNPJ1syXSonICjigLApJykpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFR5cGUpLAogICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihUeXBlID0gYygiRiIgPSAiRm9yZXN0IiwgIkciID0gIkdyYXNzbGFuZCIpKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIHBsb3QgU0QgaW5zdGVhZCBvZiBTRQphcmMucmV3ZXQucG9vbGVkIDwtIGJpbmRfcm93cyhsYXBwbHkoCiAgc3BsaXQoCiAgICBhbGwuMTRjLnN1bS5kZlthbGwuMTRjLnN1bS5kZiRFeHBlcmltZW50ICE9ICJ0bWUiICYgYWxsLjE0Yy5zdW0uZGYkUGVyaW9kID09ICJpbmMiLCBdLAogICAgYWxsLjE0Yy5zdW0uZGZbYWxsLjE0Yy5zdW0uZGYkRXhwZXJpbWVudCAhPSAidG1lIiAmIGFsbC4xNGMuc3VtLmRmJFBlcmlvZCA9PSAiaW5jIiwgIkV4cGVyaW1lbnQiXSksIGZ1bmN0aW9uKGV4cCkgewogICAgICBiaW5kX3Jvd3MobGFwcGx5KHNwbGl0KGV4cCwgZXhwJFR5cGUpLCBmdW5jdGlvbih0eXApIHsKICAgICAgICBiaW5kX3Jvd3MobGFwcGx5KHNwbGl0KHR5cCwgdHlwJHRyZWF0LmJpKSwgZnVuY3Rpb24odHJ0KSB7CiAgICAgICAgICB0cnQkZDE0Y19jb3JyX3NkIDwtIGlmZWxzZSgKICAgICAgICAgICAgaXMubmEodHJ0JGQxNGNfY29ycl9zZCksIHNxcnQobWVhbi5yZXAudmFyKSwgdHJ0JGQxNGNfY29ycl9zZCkKICAgICAgICAgIHJldHVybihzYW1wbGUuZGVjb21wKG4gPSByZXAoMiwgbnJvdyh0cnQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS5tZWFuID0gdHJ0JGQxNGNfY29ycl9tZWFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLnNkID0gdHJ0JGQxNGNfY29ycl9zZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUuc2QgPSBUUlVFKSkKICAgICAgICB9KSwgLmlkID0gInRyZWF0LmJpIikKICAgICAgfSksIC5pZCA9ICJUeXBlIikKICAgIH0pLCAuaWQgPSAiRXhwZXJpbWVudCIpCnNhdmUoYXJjLnJld2V0LnBvb2xlZCwgZmlsZSA9ICJ0cy5wb29sZWQuUmRhdGEiKQojIHBsb3QKYXJjLnJld2V0LnBvb2xlZFtncmVwKCJwb29sZWQiLCByb3cubmFtZXMoYXJjLnJld2V0LnBvb2xlZCkpLF0gJT4lCiAgbXV0YXRlKFllYXJTYW1wbGVkID0gaWZlbHNlKEV4cGVyaW1lbnQgPT0gImFyYyIsIDIwMTEsIDIwMTkpLAogICAgICAgICBUcmVhdG1lbnQgPSBmYWN0b3IoaWZlbHNlKHRyZWF0LmJpID09ICJ0cmVhdG1lbnQiICYgRXhwZXJpbWVudCA9PSAiYXJjIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0cmVhdC5iaSA9PSAidHJlYXRtZW50IiAmIEV4cGVyaW1lbnQgPT0gInJld2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0IiwgdHJlYXQuYmkpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIsICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIsICJhaXItZHJ5L3Jld2V0IikpLAogICAgICAgICB1cHBlciA9IHNhbXBsZS5tZWFuICsgc2FtcGxlLnNkLAogICAgICAgICBsb3dlciA9IHNhbXBsZS5tZWFuIC0gc2FtcGxlLnNkKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFllYXJTYW1wbGVkLCBzYW1wbGUubWVhbiwgY29sb3IgPSBUeXBlKSkgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50KSwKICAgICAgICAgICAgIHNpemUgPSA0LCBzdHJva2UgPSAxLjUsCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMSkpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSB1cHBlciwgCiAgICAgICAgeW1heCA9IGxvd2VyLAogICAgICAgIGxpbmV0eXBlID0gVHJlYXRtZW50KSwgCiAgICB3aWR0aCA9IC40LCBhbHBoYSA9IC4zLCAKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSwKICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX3BhdGgoZGF0YSA9IERhdG0sIGFlcyhEYXRlLCBOSGMxNCksIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0YnID0gJyNhMzU1MTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJyA9ICcjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeS9yZXdldCIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImFpci1kcnkvcmV3ZXQiID0gImFpci1kcnkvcmV3ZXQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiID0gImFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAiY29udHJvbC0xICgyMDExKVxuY29udHJvbC0yICgyMDE5KSIpKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoImF0bW9zcGhlcmUiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxKSkgKwogIGd1aWRlcyhsaW5ldHlwZSA9ICJub25lIikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDIwMTAsIDIwMjApLCBicmVha3MgPSBjKDIwMTEsIDIwMTkpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTE1LCAxMDUpKSArCiAgeGxhYignWWVhciBzYW1wbGVkJykgKwogIHlsYWIoZXhwcmVzc2lvbignbWVhbiAnKkRlbHRhKicnXjE0KidDLUNPJ1syXSonICjigLApJykpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFR5cGUpLAogICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihUeXBlID0gYygiRiIgPSAiRm9yZXN0IiwgIkciID0gIkdyYXNzbGFuZCIpKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpKQpgYGAKPioqRmlnIGByIHtmaWcubiArIDR9YC4gVGltZSBzZXJpZXMgb2YgY29udHJvbCBhbmQgdHJlYXRtZW50ICRcRGVsdGEkXjE0XkMtQ09+Mn4gKEV4cGVyaW1lbnRzIDEgYW5kIDIpKioKCj4qQ2FwdGlvbjoqIEZpbGxlZCBjaXJjbGVzIHNob3cgJFxEZWx0YSReMTReQy1DT34yfiBvYnNlcnZlZCBmb3IgYm90aCBjb250cm9sLTEgYW5kIGNvbnRyb2wtMiBzYW1wbGVzICgyMDExIGFuZCAyMDE5IHBvaW50cywgcmVzcGVjdGl2ZWx5KS4gT3BlbiBzeW1ib2xzIHNob3cgJFxEZWx0YSReMTReQy1DT34yfiBvYnNlcnZlZCBmb3IgdHJlYW1lbnQgc2FtcGxlczogb3BlbiBzcXVhcmVzID0gYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50LCBFeHBlcmltZW50IDE7IG9wZW4gY2lyY2xlcyA9IGFpci1kcnkgb25seSB0cmVhdG1lbnQsIEV4cGVyaW1lbnQgMi4gUG9pbnRzIGFyZSBtZWFucyBhbmQgZXJyb3IgYmFycyBzaG93IHRoZSBwb29sZWQgc3RhbmRhcmQgZGV2aWF0aW9uLiBUaGUgYmxhY2sgbGluZSBzaG93cyAkXERlbHRhJF4xNF5DIG9mIHRoZSBhdG1vc3BoZXJlLgoKVGhlIGFic29sdXRlIG1lYW4gZGlmZmVyZW5jZSBpbiBeMTReQy1DT34yfiBiZXR3ZWVuIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBzYW1wbGVzIHdhcyBncmVhdGVyIGluIGdyYXNzbGFuZCBzYW1wbGVzIChgciB7cm91bmQobWVhbihhYnModHJ0LmN0bC5kZlt0cnQuY3RsLmRmJFR5cGUgPT0gIkciLCAiZDE0Y19jb3JyX21lYW4uY3RsIl0gLSB0cnQuY3RsLmRmW3RydC5jdGwuZGYkVHlwZSA9PSAiRyIsICJkMTRjX2NvcnJfbWVhbi50cnQiXSkpLCAxKX1g4oCwKSB0aGFuIGluIGZvcmVzdCBzYW1wbGVzIChgciB7cm91bmQobWVhbihhYnModHJ0LmN0bC5kZlt0cnQuY3RsLmRmJFR5cGUgPT0gIkYiLCAiZDE0Y19jb3JyX21lYW4uY3RsIl0gLSB0cnQuY3RsLmRmW3RydC5jdGwuZGYkVHlwZSA9PSAiRiIsICJkMTRjX2NvcnJfbWVhbi50cnQiXSkpLCAxKX1g4oCwKSBmb3IgYm90aCBFeHBlcmltZW50IDEgYW5kIEV4cGVyaW1lbnQgMi4gCgojIyAkXGRlbHRhJF4xM15DCmBgYHtyIGN0bC10cnQtZGlmcy0xM2N9CiMgYXZlcmFnZSBjb250cm9sIGFuZCB0cmVhdG1lbnQgZGF0YQojIG5vdGUgdGhhdCB1cHBlci9sb3dlciBsaW1pdHMgPSAyeFNFCgojIFBsb3Qgc2lkZS1ieS1zaWRlIHcvIDJ4U0UKaXNvLjEyLmF2ZzIgJT4lCiAgZmlsdGVyKFBlcmlvZCA9PSAiaW5jIikgJT4lCiAgbXV0YXRlKFllYXJTYW1wbGVkID0gaWZlbHNlKEV4cGVyaW1lbnQgPT0gImFyYyIsICIyMDExIiwgIjIwMTkiKSkgJT4lCiAgbXV0YXRlKEVjbyA9IGlmZWxzZShUeXBlID09ICJGIiwgIkZvcmVzdCIsICJHcmFzc2xhbmQiKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhZZWFyU2FtcGxlZCwgZDEzY19tZWFuLCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBUcmVhdG1lbnQpLCBzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxM2NfdSwgCiAgICAgICAgeW1heCA9IGQxM2NfbCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4xKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygnRic9JyNhMzU1MTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdmb3Jlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdncmFzc2xhbmQnKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkiID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gMTYpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJhaXItZHJ5IiA9ICJhaXItZHJ5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9ICJhaXItZHJ5ICsgc3RvcmFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gImNvbnRyb2wtMSAoMjAxMSlcbiBjb250cm9sLTIgKDIwMTkpIikpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypkZWx0YSonJ14xMyonQyAo4oCwKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhFY28pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpCgojIGlzby4xMi5hdmcyICU+JQojICAgbXV0YXRlKFllYXJTYW1wbGVkID0gaWZlbHNlKEV4cGVyaW1lbnQgPT0gImFyYyIsICIyMDExIiwgIjIwMTkiKSwKIyAgICAgICAgICB0cmVhdC5wZXJpb2QgPSBwYXN0ZShUcmVhdG1lbnQsIFBlcmlvZCwgc2VwID0gIi4iKSwKIyAgICAgICAgICBFY28gPSBpZmVsc2UoVHlwZSA9PSAiRiIsICJGb3Jlc3QiLCAiR3Jhc3NsYW5kIikpICU+JQojICAgZ2dwbG90KC4sIGFlcyhZZWFyU2FtcGxlZCwgZDEzY19tZWFuLCBjb2xvciA9IFR5cGUpKSArCiMgICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IHRyZWF0LnBlcmlvZCksIHNpemUgPSAzKSArCiMgICBnZW9tX2Vycm9yYmFyKAojICAgICBhZXMoeW1pbiA9IGQxM2NfdSwKIyAgICAgICAgIHltYXggPSBkMTNjX2wsCiMgICAgICAgICBjb2xvciA9IFR5cGUpLAojICAgICB3aWR0aCA9IC4xKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSkgKwojICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5LnByZSIgPSAyLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkuaW5jIiA9IDEsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UuaW5jIiA9IDAsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UucHJlIiA9IDYsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbC5pbmMiID0gMTYsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbC5wcmUiID0gMTcpKSArCiMgICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypkZWx0YSonJ14xMyonQyAo4oCwKScpKSArCiMgICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKEVjbykpICsKIyAgIHRoZW1lX2J3KCkgKwojICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKlN1cHBsZW1lbnRhbCBGaWcgYHIge3NmaWcubiArIDJ9YC4gVGltZSBzZXJpZXMgb2YgY29udHJvbCBhbmQgdHJlYXRtZW50ICRcZGVsdGEkXjEzXkMtQ09+Mn4gKEV4cGVyaW1lbnRzIDEgYW5kIDIpKioKCj4qQ2FwdGlvbjoqIEZpbGxlZCBjaXJjbGVzIHNob3cgJFxkZWx0YSReMTNeQy1DT34yfiBvYnNlcnZlZCBmb3IgY29udHJvbCBzYW1wbGVzLCB3aGlsZSBvcGVuIHN5bWJvbHMgc2hvdyAkXGRlbHRhJF4xM15DLUNPfjJ+IG9ic2VydmVkIGZvciB0cmVhbWVudCBzYW1wbGVzIChvcGVuIHNxdWFyZXMgPSBhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQsIEV4cGVyaW1lbnQgMSwgMjAxMTsgb3BlbiBjaXJjbGVzID0gYWlyLWRyeSBvbmx5IHRyZWF0bWVudCwgRXhwZXJpbWVudCAyLCAyMDE5KS4gUG9pbnRzIGFyZSBtZWFucyBhbmQgZXJyb3IgYmFycyBzaG93IDJ4IHN0YW5kYXJkIGVycm9yLiAKCipFZmZlY3Qgb2YgY3VtdWxhdGl2ZSByZXNwaXJlZCBjYXJib24gb24gXjE0XkMtQ09+Mn4qCgpgYGB7ciBjdGwtdHJ0LXN0YXRzLCBpbmNsdWRlID0gRkFMU0V9CiMgY2FsY3VsYXRlIGRpZnMgY3RsLXRydCwgbG9vayBhdCBlZmZlY3Qgb2YgQyByZXNwCmFyYy5yZXdldC5pbmMuMTRjJHRyZWF0LmJpIDwtIGlmZWxzZShhcmMucmV3ZXQuaW5jLjE0YyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsICJ0cmVhdG1lbnQiKQphcmMucmV3ZXQuaW5jLjE0Yy5zdW0gPC0gYXJjLnJld2V0LmluYy4xNGMgJT4lCiAgZ3JvdXBfYnkoSUQsIEV4cGVyaW1lbnQsIFR5cGUsIHRyZWF0LmJpKSAlPiUKICBhZGRfY291bnQoKSAlPiUKICBzdW1tYXJpc2VfaWYoLnByZWRpY2F0ZSA9IGZ1bmN0aW9uKHgpIGlzLm51bWVyaWMoeCksCiAgICAgICAgICAgICAgIC5mdW5zID0gbGlzdChtZWFuID0gIm1lYW4iLCBzZCA9ICJzZCIpKQogIAphcmMucmV3ZXQuaW5jLjE0Yy5zdW0kbl9zZCA8LSBOVUxMCgpqLnZhcnMgPC0gYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgImQxNGNfY29ycl9tZWFuIiwgIm1nQ08yLkNfZ0NfbWVhbiIsICJkMTRjX2NvcnJfc2QiLCAibWdDTzIuQ19nQ19zZCIpCmFyYy5yZXdldC4xNGMuY3RsLnRydCA8LSBsZWZ0X2pvaW4oCiAgYXJjLnJld2V0LmluYy4xNGMuc3VtW2FyYy5yZXdldC5pbmMuMTRjLnN1bSR0cmVhdC5iaSA9PSAiY29udHJvbCIsIGoudmFyc10sCiAgYXJjLnJld2V0LmluYy4xNGMuc3VtW2FyYy5yZXdldC5pbmMuMTRjLnN1bSR0cmVhdC5iaSAhPSAiY29udHJvbCIsIGoudmFyc10sCiAgYnkgPSBjKGoudmFyc1sxOjNdKSwKICBzdWZmaXggPSBjKCIuY3RsIiwgIi50cnQiKSkKCgphcmMucmV3ZXQuMTRjLmN0bC50cnQkZDE0Y19kaWYgPC0gYXJjLnJld2V0LjE0Yy5jdGwudHJ0JGQxNGNfY29ycl9tZWFuLmN0bCAtIGFyYy5yZXdldC4xNGMuY3RsLnRydCRkMTRjX2NvcnJfbWVhbi50cnQKYXJjLnJld2V0LjE0Yy5jdGwudHJ0JGNfZGlmIDwtIGFyYy5yZXdldC4xNGMuY3RsLnRydCRtZ0NPMi5DX2dDX21lYW4uY3RsIC0gYXJjLnJld2V0LjE0Yy5jdGwudHJ0JG1nQ08yLkNfZ0NfbWVhbi50cnQKCiMgc2F2ZSBSZGF0CnNhdmUoYXJjLnJld2V0LjE0Yy5jdGwudHJ0LCBmaWxlID0gIi4vYXJjLnJld2V0LjE0Yy5jdGwudHJ0LlJkYXRhIikKCiMjIExvb2sgYXQgZWZmZWN0IG9mIGNfZGlmIGJ5IGV4cGVyaW1lbnQgYW5kIGludGVyYWN0aW9uIHdpdGggdHlwZQojIGFpci1kcnkgKyBzdG9yYWdlCnN1bW1hcnkobG0oZDE0Y19kaWYgfiBjX2RpZiAqIFR5cGUsIGFyYy5yZXdldC4xNGMuY3RsLnRydFthcmMucmV3ZXQuMTRjLmN0bC50cnQkRXhwZXJpbWVudCA9PSAiYXJjIiwgXSkpCiMgZWZmZWN0IG9mIGNfZGlmIG9uIGQxNGNfZGlmIG5zOyBpbnRlcmFjdGlvbiBhbHNvIG5zCgojIHJld2V0CnN1bW1hcnkobG0oZDE0Y19kaWYgfiBjX2RpZiAqIFR5cGUsIGFyYy5yZXdldC4xNGMuY3RsLnRydFthcmMucmV3ZXQuMTRjLmN0bC50cnQkRXhwZXJpbWVudCA9PSAicmV3ZXQiLCBdKSkKIyBlZmZlY3Qgb2YgY19kaWYgbWFyZ2luYWxseSBzaWduaWZpY2FudCAocCA9IDAuMDYzMikKCiMgTG9vayBhdCBlZmZlY3Qgb2YgY19kaWYgYW5kIGludGVyYWN0aW9uIHdpdGggdHlwZSBvdmVyYWxsCnN1bW1hcnkobG0oZDE0Y19kaWYgfiBUeXBlICogY19kaWYgKiBFeHBlcmltZW50LCBhcmMucmV3ZXQuMTRjLmN0bC50cnQpKQojIG5vIHNpZ25pZmljYW5jZSBvZiBjX2RpZiBvdmVyYWxsCnJtKGoudmFycykKYGBgCgpgYGB7ciBkMTRjLXN0YXRzLCBpbmNsdWRlID0gRkFMU0V9CiMgYXZlcmFnZSBkdXBsaWNhdGVzIGFuZCBnZXQgdmVjdG9ycyBvZiBleHBlcmltZW50L3R5cGUvdHJlYXRtZW50CmFyYy5yZXdldC4xNGMuc3VtMiA8LSBhbGwuMTRjLmxzW1syXV0gJT4lCiAgZmlsdGVyKFBlcmlvZCA9PSAiaW5jIikgJT4lCiAgc2VsZWN0KElELCBUeXBlLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIGQxNGNfY29ycikgJT4lCiAgZ3JvdXBfYnkoSUQsIFR5cGUsIFRyZWF0bWVudCwgRXhwZXJpbWVudCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKQphcmMucmV3ZXQuMTRjLnN1bTIgPC0gZGF0YS5mcmFtZShhcmMucmV3ZXQuMTRjLnN1bTIpCgoKIyBzdGF0cwojIGFpci1kcnkgKyBzdG9yYWdlCiMgZm9yZXN0CnQudGVzdChhcmMucmV3ZXQuMTRjLnN1bTJbYXJjLnJld2V0LjE0Yy5zdW0yJEV4cGVyaW1lbnQgPT0gImFyYyIgJiBhcmMucmV3ZXQuMTRjLnN1bTIkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIGFyYy5yZXdldC4xNGMuc3VtMiRUeXBlID09ICJGIiwgIm1lYW4iXSwgCiAgICAgICBhcmMucmV3ZXQuMTRjLnN1bTJbYXJjLnJld2V0LjE0Yy5zdW0yJEV4cGVyaW1lbnQgPT0gImFyYyIgJiBhcmMucmV3ZXQuMTRjLnN1bTIkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIgJiBhcmMucmV3ZXQuMTRjLnN1bTIkVHlwZSA9PSAiRiIsICJtZWFuIl0sIHRhaWxzID0gMiwgcGFpcmVkID0gVFJVRSkKCiMgZ3Jhc3NsYW5kCnQudGVzdChhcmMucmV3ZXQuMTRjLnN1bTJbYXJjLnJld2V0LjE0Yy5zdW0yJEV4cGVyaW1lbnQgPT0gImFyYyIgJiBhcmMucmV3ZXQuMTRjLnN1bTIkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIGFyYy5yZXdldC4xNGMuc3VtMiRUeXBlID09ICJHIiwgIm1lYW4iXSwgCiAgICAgICBhcmMucmV3ZXQuMTRjLnN1bTJbYXJjLnJld2V0LjE0Yy5zdW0yJEV4cGVyaW1lbnQgPT0gImFyYyIgJiBhcmMucmV3ZXQuMTRjLnN1bTIkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIgJiBhcmMucmV3ZXQuMTRjLnN1bTIkVHlwZSA9PSAiRyIsICJtZWFuIl0sIHRhaWxzID0gMiwgcGFpcmVkID0gVFJVRSkKCiMgYWlyLWRyeSBvbmx5CiMgZm9yZXN0CnQudGVzdChhcmMucmV3ZXQuMTRjLnN1bTJbYXJjLnJld2V0LjE0Yy5zdW0yJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIGFyYy5yZXdldC4xNGMuc3VtMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgYXJjLnJld2V0LjE0Yy5zdW0yJFR5cGUgPT0gIkYiLCAibWVhbiJdLCAKICAgICAgIGFyYy5yZXdldC4xNGMuc3VtMlthcmMucmV3ZXQuMTRjLnN1bTIkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgYXJjLnJld2V0LjE0Yy5zdW0yJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiBhcmMucmV3ZXQuMTRjLnN1bTIkVHlwZSA9PSAiRiIsICJtZWFuIl0sIHRhaWxzID0gMiwgcGFpcmVkID0gVFJVRSkKCiMgZ3Jhc3NsYW5kCnQudGVzdChhcmMucmV3ZXQuMTRjLnN1bTJbYXJjLnJld2V0LjE0Yy5zdW0yJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIGFyYy5yZXdldC4xNGMuc3VtMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgYXJjLnJld2V0LjE0Yy5zdW0yJFR5cGUgPT0gIkciLCAibWVhbiJdLCAKICAgICAgIGFyYy5yZXdldC4xNGMuc3VtMlthcmMucmV3ZXQuMTRjLnN1bTIkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgYXJjLnJld2V0LjE0Yy5zdW0yJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiBhcmMucmV3ZXQuMTRjLnN1bTIkVHlwZSA9PSAiRyIsICJtZWFuIl0sIHRhaWxzID0gMiwgcGFpcmVkID0gVFJVRSkKYGBgCgoKYGBge3IgcGxvdC1jZGlmLWQxNGMsIGluY2x1ZGUgPSBGQUxTRX0KZ2dwbG90KGFyYy5yZXdldC4xNGMuY3RsLnRydCwgYWVzKGNfZGlmLCBkMTRjX2RpZiwgY29sb3IgPSBUeXBlLCBzaGFwZSA9IEV4cGVyaW1lbnQpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgoKV2UgbG9va2VkIGF0IHRoZSBwb3NzaWJsZSBlZmZlY3Qgb2YgdGhlIGRpZmZlcmVuY2UgaW4gdGhlIGFtb3VudCBvZiBjYXJib24gcmVzcGlyZWQgKG1nIENPfjJ+LUMgZyBzb2lsIENeLTFeKSBvbiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb250cm9sIGFuZCB0cmVhdG1lbnQgXjE0XkMtQ09+Mn4gdXNpbmcgYSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCwgYnV0IGl0IHdhcyBub3Qgc2lnbmlmaWNhbnQgb3ZlcmFsbC4gV2hlbiBkYXRhIGZyb20gRXhwZXJpbWVudCAxIGFuZCBFeHBlcmltZW50IDIgd2VyZSBjb25zaWRlcmVkIHNlcGFyYXRlbHksIHdlIG9ic2VydmVkIGEgc2xpZ2h0IHBvc2l0aXZlIHRyZW5kIGJldHdlZW4gdGhlIGRpZmZlcmVuY2UgaW4gcmVzcGlyZWQgY2FyYm9uIGFuZCB0aGUgZGlmZmVyZW5jZSBpbiBeMTReQy1DT34yfiB3aXRoaW4gRXhwZXJpbWVudCAyLCBidXQgaXQgd2FzIG9ubHkgbWFyZ2luYWxseSBzaWduaWZpY2FudCAocCA9IGByIHtyb3VuZChzdW1tYXJ5KGxtKGQxNGNfZGlmIH4gY19kaWYgKiBUeXBlLCBhcmMucmV3ZXQuMTRjLmN0bC50cnRbYXJjLnJld2V0LjE0Yy5jdGwudHJ0JEV4cGVyaW1lbnQgPT0gInJld2V0IiwgXSkpJGNvZWZbMiw0XSwzKX1gKS4gCgpgYGB7ciBwbG90LTE0Yy1ieS1jLXJlc3B9CiMgMTAuIFBsb3QgJFxEZWx0YSReMTReQyBhZ2FpbnN0IHByb3BvcnRpb24gb2Ygc29pbCBDIHJlc3BpcmVkIGJ5IGV4cGVyaW1lbnQsIGxhbmQgY292ZXIsIGFuZCBzYW1wbGluZyBwZXJpb2QuCgojIEhFVzIyIGNvbnRyb2wgcHJlIHBvaW50IGV4Y2x1ZGVkIHRvIG1ha2UgZmlndXJlIG1vcmUgcmVhZGFibGUgCmFsbC4xNGMuc3VtLmRmICU+JQogIGZpbHRlcihFeHBlcmltZW50ICE9ICJ0bWUiKSAlPiUKICBtdXRhdGUoSUQudHJlYXQgPSBwYXN0ZShJRCwgVHJlYXRtZW50KSkgJT4lCiAgbXV0YXRlKElELnRyZWF0LlBlcmlvZCA9IHBhc3RlKElELnRyZWF0LCBQZXJpb2QpKSAlPiUKICBmaWx0ZXIoSUQudHJlYXQuUGVyaW9kICE9ICJIRVcyMiBjb250cm9sIHByZSIpICU+JQogIG11dGF0ZSh0cmVhdC5QZXJpb2QgPSBwYXN0ZSh0cmVhdC5iaSwgUGVyaW9kKSwKICAgICAgICAgRWNvID0gaWZlbHNlKFR5cGUgPT0gIkYiLCAiRm9yZXN0IiwgIkdyYXNzbGFuZCIpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1nQ08yLkNfZ0NfbWVhbiwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSwgc2hhcGUgPSB0cmVhdC5QZXJpb2QpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSBJRC50cmVhdCkpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbWluLCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBtZ0NPMi5DX2dDX21pbiwgCiAgICAgICAgeG1heCA9IG1nQ08yLkNfZ0NfbWF4LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIGhlaWdodCA9IC45KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnU2FtcGxpbmcgcGVyaW9kICh0cmVhdG1lbnQpJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKDE2LCAxNywgMSwgMiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvbnRyb2wgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGNvbnRyb2wpJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wgaW5jIiA9ICdlcXVpbGlicml1bSByZXNwaXJhdGlvblxuKGNvbnRyb2wpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IHByZSIgPSAncHJlLWluY3ViYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyZWF0bWVudCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oYWlyLWRyeS9haXItZHJ5ICsgc3RvcmFnZSknKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoRWNvKSwgcm93cyA9IHZhcnMoWWVhclNhbXBsZWQpKSArCiAgeGxhYihleHByZXNzaW9uKCdSZXNwaXJlZCBDIChtZyBDTydbMl0qJy1DJyonIGcgc29pbCBDJ14tMSonKScpKSArCiAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIikpCmBgYAoKPioqU3VwcGxlbWVudGFyeSBGaWcuIGByIHtzZmlnLm4gKyAzfWAuIENoYW5nZSBpbiBeMTReQy1DT34yfiBpbiByZWxhdGlvbiB0byBjdW11bGF0aXZlIHNvaWwgY2FyYm9uIHJlc3BpcmVkKioKCj4qQ2FwdGlvbjoqIE5vdGUgdGhhdCBwcmUtaW5jdWJhdGlvbiAkXERlbHRhJF4xNF5DIHdhcyBub3QgbWVhc3VyZWQgZm9yIHRoZSBjb250cm9sLTEgc2FtcGxlcyBpbiAyMDExLiBMaW1pdHMgZXhjbHVkZSBvdXRsaWVyIHBvaW50IChIRVcyMiBjb250cm9sLTIsIHByZS1pbmN1YmF0aW9uKSBmb3IgaW1wcm92ZWQgbGVnaWJpbGl0eS4gUG9pbnRzIGFyZSBtZWFucywgZXJyb3IgYmFycyBzaG93IG1pbiBhbmQgbWF4IG9mIGR1cGxpY2F0ZSBzYW1wbGVzLgoKYGBge3IgcGxvdCBDIHJlc3AgdnMgMTRDIGF2ZXJhZ2VkIGJ5IEVjb3N5c3RlbSBhbmQgdHJlYXRtZW50LCBpbmNsdWRlID0gRkFMU0V9CiMgQWx0ZXJuYXRlIEMtcmVzcCB4IDE0YyBmaWc6IGRhdGEgYXZlcmFnZWQgYnkgRWNvc3lzdGVtIGFuZCB0cmVhdG1lbnQgd2l0aGluIHNhbXBsaW5nIHBlcmlvZHMKYWxsLjE0Yy5zdW0yICU+JQogIG11dGF0ZSh0cmVhdC5QZXJpb2QgPSBwYXN0ZSh0cmVhdC5iaSwgUGVyaW9kKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhtZ0NPMi5DX2dDX21lYW4sIGQxNGNfY29ycl9tZWFuLCBjb2xvciA9IFR5cGUsIHNoYXBlID0gdHJlYXQuUGVyaW9kKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX3BhdGgoYWVzKGdyb3VwID0gVHJlYXRtZW50KSkgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl91LCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX2wsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgd2lkdGggPSAuMjUpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gbWdDTzIuQ19nQ191LCAKICAgICAgICB4bWF4ID0gbWdDTzIuQ19nQ19sLCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIGhlaWdodCA9IC45KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnU2FtcGxpbmcgcGVyaW9kICh0cmVhdG1lbnQpJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKDE2LCAxNywgMSwgMiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvbnRyb2wgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGNvbnRyb2wpJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wgaW5jIiA9ICdlcXVpbGlicml1bSByZXNwaXJhdGlvblxuKGNvbnRyb2wpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IHByZSIgPSAncHJlLWluY3ViYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyZWF0bWVudCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oYWlyLWRyeS9haXItZHJ5ICsgc3RvcmFnZSknKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoVHlwZSksIHJvd3MgPSB2YXJzKFllYXJTYW1wbGVkKSkgKwogIHhsYWIoZXhwcmVzc2lvbignUmVzcGlyZWQgQyAobWdDTydbMl0qJy1DJyonIGcgc29pbCBDJ14tMSonKScpKSArCiAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIikpCmBgYAoKYGBge3IgcGxvdCAxNGMgYnkgYyByZXNwIHdpdGggb3V0bGllciwgaW5jbHVkZSA9IEZBTFNFfQojIENvZGUgZm9yIGEgdGhpcmQgcGxvdCB3aXRoIG91dGxpZXIgZGF0YQojIGF2ZXJhZ2UgY29udHJvbCBhbmQgdHJlYXRtZW50IGRhdGEKYWxsLjE0Yy5zdW0zIDwtIHNlbGVjdChhbGwuMTRjLmxzW1syXV0sIFR5cGUsIFBlcmlvZCwgVHJlYXRtZW50LCBFeHBlcmltZW50LCBZZWFyU2FtcGxlZCwgZDE0Y19jb3JyLCBtZ0NPMi5DX2dDKSAlPiUKICBncm91cF9ieShUeXBlLCBQZXJpb2QsIFRyZWF0bWVudCwgRXhwZXJpbWVudCwgWWVhclNhbXBsZWQpICU+JQogIGFkZF9jb3VudCgpICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKGQxNGNfY29ycl9zZSA9IGQxNGNfY29ycl9zZC9uX21lYW4sCiAgICAgICAgIGQxNGNfY29ycl91ID0gZDE0Y19jb3JyX21lYW4gKyBkMTRjX2NvcnJfc2UqMiwKICAgICAgICAgZDE0Y19jb3JyX2wgPSBkMTRjX2NvcnJfbWVhbiAtIGQxNGNfY29ycl9zZSoyLAogICAgICAgICBtZ0NPMi5DX2dDX3NlID0gbWdDTzIuQ19nQ19zZC9uX21lYW4sCiAgICAgICAgIG1nQ08yLkNfZ0NfdSA9IG1nQ08yLkNfZ0NfbWVhbiArIG1nQ08yLkNfZ0Nfc2UqMiwKICAgICAgICAgbWdDTzIuQ19nQ19sID0gbWdDTzIuQ19nQ19tZWFuIC0gbWdDTzIuQ19nQ19zZSoyKSAKCmFsbC4xNGMuc3VtMyR0cmVhdC5iaSA8LSBpZmVsc2UoYWxsLjE0Yy5zdW0zJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwidHJlYXRtZW50IikKYWxsLjE0Yy5zdW0zICU+JQogIG11dGF0ZSh0cmVhdC5QZXJpb2QgPSBwYXN0ZSh0cmVhdC5iaSwgUGVyaW9kKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhtZ0NPMi5DX2dDX21lYW4sIGQxNGNfY29ycl9tZWFuLCBjb2xvciA9IFR5cGUsIHNoYXBlID0gdHJlYXQuUGVyaW9kKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX3BhdGgoYWVzKGdyb3VwID0gVHJlYXRtZW50KSkgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl91LCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX2wsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgd2lkdGggPSAuMjUpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gbWdDTzIuQ19nQ191LCAKICAgICAgICB4bWF4ID0gbWdDTzIuQ19nQ19sLCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIGhlaWdodCA9IC45KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnU2FtcGxpbmcgcGVyaW9kICh0cmVhdG1lbnQpJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKDE2LCAxNywgMSwgMiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvbnRyb2wgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGNvbnRyb2wpJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wgaW5jIiA9ICdlcXVpbGlicml1bSByZXNwaXJhdGlvblxuKGNvbnRyb2wpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IHByZSIgPSAncHJlLWluY3ViYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyZWF0bWVudCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oYWlyLWRyeS9haXItZHJ5ICsgc3RvcmFnZSknKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoVHlwZSksIHJvd3MgPSB2YXJzKFllYXJTYW1wbGVkKSkgKwogIHhsYWIoZXhwcmVzc2lvbignUmVzcGlyZWQgQyAobWdDTydbMl0qJy1DJyonIGcgc29pbCBDJ14tMSonKScpKSArCiAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIikpCmBgYAoKIyBEaXNjdXNzaW9uCmBgYHtyIGNvbmNlcHR1YWwtbW9kZWwtY2FsY3MsIGluY2x1ZGUgPSBGQUxTRX0KIyBhdG0gMTRDCkRhdG0gPC0gcmJpbmQoZ3JhdmVuLCBmdXR1cmUxNEMpCnNhdmUoRGF0bSwgZmlsZSA9ICJEYXRtLlJEYXRhIikKeXJzIDwtIERhdG0kRGF0ZQoKIyBoZWxwZXIgZnhzCmxhbWJkYSA8LSAoMS84MjY3KQoKayA8LSBmdW5jdGlvbihGbSkgewogIChGbSpsYW1iZGEpLygxLUZtKQp9CmZtIDwtIGZ1bmN0aW9uKGspewogIGsvKGsrbGFtYmRhKQp9CmZtXzE0YyA8LSBmdW5jdGlvbihmbSwgZGF0ZSkgewogIChmbSpleHAobGFtYmRhKigxOTUwIC0gZGF0ZSkpIC0gMSkqMTAwMAp9CgojIGNhbGN1bGF0ZSByZXNwIGZsdXggcG9pbnRzIGF0IDE5OTEgYW5kIDIwMTkgYW5kIHB1dCBpbiBkYXRhIGZyYW1lCmFyYy5yZXdldC5yc3AgPC0gYXJjLnJld2V0LjE0Y1thcmMucmV3ZXQuMTRjJFNpdGUgPT0gIkhhaW5pY2giICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYy5yZXdldC4xNGMkVHlwZSA9PSAiRiIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjLnJld2V0LjE0YyR0cmVhdC5iaSA9PSAiY29udHJvbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgImQxNGNfY29ycl9pbmMiXQp5cnMuc21wIDwtIGFyYy5yZXdldC4xNGNbYXJjLnJld2V0LjE0YyRTaXRlID09ICJIYWluaWNoIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmMucmV3ZXQuMTRjJFR5cGUgPT0gIkYiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYy5yZXdldC4xNGMkdHJlYXQuYmkgPT0gImNvbnRyb2wiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZZWFyU2FtcGxlZCJdICsgLjUKb2JzLnJzcCA8LSBkYXRhLmZyYW1lKHRpbWUgPSB5cnMuc21wLAogICAgICAgICAgICAgICAgICAgICAgcmVzcCA9IGFyYy5yZXdldC5yc3ApCgphcmMucmV3ZXQucnNwLnQgPC0gYXJjLnJld2V0LjE0Y1thcmMucmV3ZXQuMTRjJFNpdGUgPT0gIkhhaW5pY2giICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjLnJld2V0LjE0YyRUeXBlID09ICJGIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYy5yZXdldC4xNGMkdHJlYXQuYmkgPT0gInRyZWF0bWVudCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZDE0Y19jb3JyX2luYyJdCnlycy5zbXAudCA8LSBhcmMucmV3ZXQuMTRjW2FyYy5yZXdldC4xNGMkU2l0ZSA9PSAiSGFpbmljaCIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjLnJld2V0LjE0YyRUeXBlID09ICJGIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICBhcmMucmV3ZXQuMTRjJHRyZWF0LmJpID09ICJ0cmVhdG1lbnQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICJZZWFyU2FtcGxlZCJdICsgLjUKb2JzLnJzcC50IDwtIGRhdGEuZnJhbWUodGltZSA9IHlycy5zbXAudCwKICAgICAgICAgICAgICAgICAgICAgICAgcmVzcCA9IGFyYy5yZXdldC5yc3AudCkKIyMjIyMKIyBtb2QgZml0IGZ4bnMKIyMjIyMKY2dhbSA8LSBmdW5jdGlvbihwYXJzLCBJbiA9IDEsIEMgPSAzOC45NjEwNCwgZnJjID0gLjEpIHsKICAKICAjIGNzdG9jawogIENmYXN0IDwtIGZyYyAqIEMKICBDc2xvdyA8LSBDIC0gQ2Zhc3QKCiAgIyBkZWZpbmUgcGFycwogIGZhc3QuZm0gPC0gZm0ocGFyc1sxXSkKICBzbG93LmZtIDwtIGZtKHBhcnNbMl0pCiAgRjBfRGVsdGExNEMgPC0gZm1fMTRjKGMoZmFzdC5mbSwgc2xvdy5mbSksIGRhdGUgPSBjKDE5MDAsIDE5MDApKQogIGdhbSA8LSAoQyAqIENmYXN0ICogcGFyc1sxXSkvKEMgKiBDZmFzdCAqIHBhcnNbMV0gKyBDICogQ3Nsb3cgKiBwYXJzWzJdKQogIAogICMgbW9kZWwgbWF0cml4CiAgQSA8LSAtZGlhZyhwYXJzWzE6Ml0pCiAgCiAgIyBzdGVhZHktc3RhdGUgQyBzdG9ja3MKICBzcy5jc3RvY2sgPC0gKC0xICogc29sdmUoQSkgJSolIGMoSW4gKiBnYW0sIEluICogKDEgLSBnYW0pKSkKICAKICAjIHJldHVybgogIHJldHVybihsaXN0KGdhbSA9IGdhbSwgc3MuY3N0b2NrID0gc3MuY3N0b2NrKSkKfQoKbW9kRnVuXzJwcCA8LSBmdW5jdGlvbihwYXJzLCBJbiA9IDEsIGxhZyA9IDAsIHBhc3MgPSBUUlVFLCBvdXQgPSAibW9kRml0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgZ2FtID0gRkFMU0UsIHlycyA9IERhdG0kRGF0ZSkgewogICMgY29uc3RhbnRzCiAgY3N0b2NrIDwtIDM4Ljk2MTA0ICMgZm9yZXN0IEMgcG9vbCwgdG90YWwgKG1lYW4gSGFpbmljaCBmb3Jlc3QgQyAgPSAyNCBnIGtnXi0xKTsgbmIgQCBzcyA9IHN1bSgtMSpzb2x2ZShBKSUqJWMoZi5pbipmLmdhbSwgZi5pbiooMS1mLmdhbSkpKQogIGYuaW4gPC0gSW4gIyBpbnB1dHMgKDEyLjU9bWVhbiBlcXVpbGlicml1bSBDIGZsdXgsIGFubnVhbCBleHRyYXBvbGF0aW9uLCBnQyB5ci0xLCAyMDExIGluY3ViYXRpb24gZGF0YSk7IHRyeSBtdWNoIGxlc3MuLi4KICBmLmZyYyA8LSAuMSAjIEMtc3RvY2sgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50IChmcm9tIFNjaHJ1bXBmIDIwMTMsIEhhaW5pY2ggMC01LCBmcmVlIGxpZ2h0KQogIGYuQ2Zhc3QgPC0gZi5mcmMgKiBjc3RvY2sKICBmLkNzbG93IDwtIGNzdG9jayAtIGYuQ2Zhc3QKICAKICAjIGRlZmluZSBwYXJzCiAgZi5rZmFzdCA8LSBwYXJzWzFdICMgdW5rbm93bgogIGYua3Nsb3cgPC0gcGFyc1syXSAjIHVua25vd24KICBmLmZhc3QuZm0gPC0gZm0oZi5rZmFzdCkKICBmLnNsb3cuZm0gPC0gZm0oZi5rc2xvdykKICBmLkYwX0RlbHRhMTRDIDwtIGZtXzE0YyhjKGYuZmFzdC5mbSwgZi5zbG93LmZtKSwgZGF0ZSA9IGMoMTkwMCwgMTkwMCkpCiAgZi5nYW0gPC0gKGNzdG9jaypmLkNmYXN0KmYua2Zhc3QpLyhjc3RvY2sqZi5DZmFzdCpmLmtmYXN0K2NzdG9jaypmLkNzbG93KmYua3Nsb3cpICMgaW5wdXQgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50IChwcm9wb3J0aW9uIHRvIGZhc3QgcG9vbCwgZnVuY3Rpb24gb2Yga3MpCiAgaWYgKGdhbSkgewogICAgZi5nYW0gPC0gcGFyc1szXQogIH0KICAKICAjIG1vZGVsIG1hdHJpeAogIEEgPC0gLWRpYWcocGFyc1sxOjJdKQogIAogICMgc3RlYWR5LXN0YXRlIEMgc3RvY2tzCiAgc3MuY3N0b2NrIDwtICgtMSAqIHNvbHZlKEEpICUqJSBjKEluICogZi5nYW0sIEluICogKDEgLSBmLmdhbSkpKQogIAogICMgdGltZSBpbmRleAogIGl4LnQgPC0gYygobGFnICsgMSk6bGVuZ3RoKHlycykpCiAgCiAgIyBtb2RlbAogIG1vZCA8LSBUd29wUGFyYWxsZWxNb2RlbDE0KHQgPSB5cnNbaXgudF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3MgPSBjKGYua2Zhc3QsIGYua3Nsb3cpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMwID0gYyhmLkNmYXN0LCBmLkNzbG93KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGMF9EZWx0YTE0QyA9IGYuRjBfRGVsdGExNEMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSBmLmluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbSA9IGYuZ2FtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RmMgPSBEYXRtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZyA9IGxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gcGFzcykKCiAgIyBnZXQgbW9kIHZhbHVlcwogIEMxNG0gPC0gZ2V0RjE0Qyhtb2QpCiAgQzE0cCA8LSBnZXRGMTQobW9kKQogIEMxNHIgPC0gZ2V0RjE0Uihtb2QpCiAgQ3RvdCA8LSBnZXRDKG1vZCkKICAgIAogIGlmKG91dCA9PSAibW9kRml0IikgewogICAgIyBkYXRhZnJhbWUgZm9yIG1vZEZpdCBmeAogICAgcmV0dXJuKGRhdGEuZnJhbWUoCiAgICAgIHRpbWUgPSBEYXRtJERhdGVbaXgudF0sIAogICAgICByZXNwID0gQzE0cikpCiAgfSBlbHNlIHsKICAgICMgZGF0YSBmcmFtZSBmb3IgcGxvdHRpbmcKICAgIHJldHVybihkYXRhLmZyYW1lKAogICAgICB5ZWFycyA9IHJlcChEYXRtJERhdGVbaXgudF0sIDUpLAogICAgICBkMTRDID0gYyhDMTRwWywxXSwgCiAgICAgICAgICAgICAgIEMxNHBbLDJdLCAKICAgICAgICAgICAgICAgQzE0bSwKICAgICAgICAgICAgICAgQzE0ciwKICAgICAgICAgICAgICAgRGF0bSROSGMxNFtpeC50XSksCiAgICAgIHBvb2wgPSByZXAoYygiZmFzdCIsICJzbG93IiwgImJ1bGsgQyIsICJyZXNwaXJhdGlvbiIsICJhdG0iKSwgZWFjaCA9IG5yb3coQzE0cCkpKSkKICB9CiAgfQoKIyBVc2UgbWVkaWFuIHZhbHVlcyBmb3Iga3MgYW5kIGxhZyB2YWx1ZSBmcm9tIFNjaHJ1bXBmIDIwMTUKc2NocnVtcGYuMjAxNSA8LSBtb2RGdW5fMnBwKHBhciA9IGMoMS80LCAxLzExNSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCA9ICJwbG90IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbSA9IEZBTFNFKQojIGNoYW5nZSBmYWN0b3IgbGV2ZWxzCnNjaHJ1bXBmLjIwMTUkcG9vbCA8LSBmYWN0b3Ioc2NocnVtcGYuMjAxNSRwb29sLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJhdG0iLCAiYnVsayBDIiwgInJlc3BpcmF0aW9uIiwgImZhc3QiLCAic2xvdyIpKQpjZ2FtKGMoMS80LCAxLzExNSkpCgojIGFsc28gZm9yIG1lZGlhbnMKcGFyLjI1LjI1IDwtIGMoMSwgMS84MCkKcGFyLjI1Ljc1IDwtIGMoMSwgMS8yMDApCnBhci43NS4yNSA8LSBjKDEvNywgMS84MCkKcGFyLjc1Ljc1IDwtIGMoMS83LCAxLzIwMCkKTDguMjUuMjUgPC0gbW9kRnVuXzJwcChwYXIgPSBwYXIuMjUuMjUsCiAgICAgICAgICAgICAgICAgICAgICAgSW4gPSAxLAogICAgICAgICAgICAgICAgICAgICAgIGxhZyA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgb3V0ID0gInBsb3QiLAogICAgICAgICAgICAgICAgICAgICAgIGdhbSA9IEZBTFNFKQpMOC4yNS43NSA8LSBtb2RGdW5fMnBwKHBhciA9IHBhci4yNS43NSwKICAgICAgICAgICAgICAgICAgICAgICBJbiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgbGFnID0gOCwKICAgICAgICAgICAgICAgICAgICAgICBvdXQgPSAicGxvdCIsCiAgICAgICAgICAgICAgICAgICAgICAgZ2FtID0gRkFMU0UpCkw4Ljc1LjI1IDwtIG1vZEZ1bl8ycHAocGFyID0gcGFyLjc1LjI1LAogICAgICAgICAgICAgICAgICAgICAgIEluID0gMSwKICAgICAgICAgICAgICAgICAgICAgICBsYWcgPSA4LAogICAgICAgICAgICAgICAgICAgICAgIG91dCA9ICJwbG90IiwKICAgICAgICAgICAgICAgICAgICAgICBnYW0gPSBGQUxTRSkKTDguNzUuNzUgPC0gbW9kRnVuXzJwcChwYXIgPSBwYXIuNzUuNzUsCiAgICAgICAgICAgICAgICAgICAgICAgSW4gPSAxLAogICAgICAgICAgICAgICAgICAgICAgIGxhZyA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgb3V0ID0gInBsb3QiLAogICAgICAgICAgICAgICAgICAgICAgIGdhbSA9IEZBTFNFKQpzY2hydW1wZi4yMDE1JHEyNS4yNSA8LSBMOC4yNS4yNSRkMTRDIC0gc2NocnVtcGYuMjAxNSRkMTRDCnNjaHJ1bXBmLjIwMTUkcTI1Ljc1IDwtIEw4LjI1Ljc1JGQxNEMgLSBzY2hydW1wZi4yMDE1JGQxNEMKc2NocnVtcGYuMjAxNSRxNzUuMjUgPC0gTDguNzUuMjUkZDE0QyAtIHNjaHJ1bXBmLjIwMTUkZDE0QwpzY2hydW1wZi4yMDE1JHE3NS43NSA8LSBMOC43NS43NSRkMTRDIC0gc2NocnVtcGYuMjAxNSRkMTRDCgojIE9ic2VydmVkIHJlc3BpcmF0aW9uCiMgY3RsCm9icy5yc3AubSA8LSBvYnMucnNwICU+JQogIGdyb3VwX2J5KHRpbWUpICU+JQogIHN1bW1hcml6ZShhY3Jvc3MocmVzcCwgLmZucyA9IGMobWVhbiA9IG1lYW4sIHNkID0gc2QpKSkgJT4lCiAgcmVuYW1lKGQxNEMgPSByZXNwX21lYW4pICU+JQogIG11dGF0ZSh5ZWFycyA9IHRpbWUgLSAuMjUsCiAgICAgICAgIFRyZWF0bWVudCA9ICJjb250cm9sIikKc2F2ZShvYnMucnNwLm0sIGZpbGUgPSAiL1VzZXJzL2plZmYvYXJjLWluYy9zcmMvb2JzLnJzcC5tLlJEYXRhIikKIyB0cnQKb2JzLnJzcC50Lm0gPC0gb2JzLnJzcC50ICU+JQogIGdyb3VwX2J5KHRpbWUpICU+JQogIHN1bW1hcml6ZShhY3Jvc3MocmVzcCwgLmZucyA9IGMobWVhbiA9IG1lYW4sIHNkID0gc2QpKSkgJT4lCiAgcmVuYW1lKGQxNEMgPSByZXNwX21lYW4pICU+JQogIG11dGF0ZSh5ZWFycyA9IHRpbWUgKyAuMjUsCiAgICAgICAgIFRyZWF0bWVudCA9IGlmZWxzZSh0aW1lID09ICIyMDExLjUiLCAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiLCAiYWlyLWRyeS9yZXdldCIpKQpzYXZlKG9icy5yc3AudC5tLCBmaWxlID0gIi9Vc2Vycy9qZWZmL2FyYy1pbmMvc3JjL29icy5yc3AudC5tLlJEYXRhIikKCiMgcGxvdCBtZWRpYW5zIHcvIHBvdGVudGlhbCBlcnJvciByYW5nZXMKc2NocnVtcGYuMjAxNSAlPiUKICBmaWx0ZXIocG9vbCAhPSAiYnVsayBDIikgJT4lCiAgZ2dwbG90KC4sIGFlcyh5ZWFycywgZDE0QykpICsKICBnZW9tX3BhdGgoZGF0YSA9IEw4LjI1LjI1W3doaWNoKEw4LjI1LjI1JHBvb2wgIT0gImJ1bGsgQyIpLCBdLAogICAgICAgICAgICBhZXMoeWVhcnMsIGQxNEMsIGNvbG9yID0gcG9vbCksIHNob3cubGVnZW5kID0gRkFMU0UsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX3BhdGgoZGF0YSA9IEw4LjI1Ljc1W3doaWNoKEw4LjI1Ljc1JHBvb2wgIT0gImJ1bGsgQyIpLCBdLAogICAgICAgICAgICBhZXMoeWVhcnMsIGQxNEMsIGNvbG9yID0gcG9vbCksIHNob3cubGVnZW5kID0gRkFMU0UsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3BhdGgoZGF0YSA9IEw4Ljc1LjI1W3doaWNoKEw4Ljc1LjI1JHBvb2wgIT0gImJ1bGsgQyIpLCBdLAogICAgYWVzKHllYXJzLCBkMTRDLCBjb2xvciA9IHBvb2wpLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBsaW5ldHlwZSA9ICJkb3RkYXNoIikgKwogIGdlb21fcGF0aChkYXRhID0gTDguNzUuNzVbd2hpY2goTDguNzUuNzUkcG9vbCAhPSAiYnVsayBDIiksIF0sCiAgICBhZXMoeWVhcnMsIGQxNEMsIGNvbG9yID0gcG9vbCksIHNob3cubGVnZW5kID0gRkFMU0UsIGxpbmV0eXBlID0gImxvbmdkYXNoIikgKwogIGdlb21fcGF0aChhZXMoY29sb3IgPSBwb29sKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IG9icy5yc3AubSwgYWVzKHllYXJzLCBkMTRDLCBzaGFwZSA9IFRyZWF0bWVudCksIAogICAgICAgICAgICAgY29sb3IgPSAiI0ZGQzEwNyIsIHNpemUgPSAzKSArCiAgZ2VvbV9wb2ludChkYXRhID0gb2JzLnJzcC50Lm0sIGFlcyh5ZWFycywgZDE0Qywgc2hhcGUgPSBUcmVhdG1lbnQpLCAKICAgICAgICAgICAgIGNvbG9yID0gIiNGRkMxMDciLCBzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoZGF0YSA9IG9icy5yc3AubSwgCiAgICAgICAgICAgICAgICBhZXMoeW1pbiA9IGQxNEMgLSByZXNwX3NkLCB5bWF4ID0gZDE0QyArIHJlc3Bfc2QpLAogICAgICAgICAgICAgICAgY29sb3IgPSAiI0ZGQzEwNyIsIHdpZHRoID0gLjIpICsKICBnZW9tX2Vycm9yYmFyKGRhdGEgPSBvYnMucnNwLnQubSwgCiAgICAgICAgICAgICAgICBhZXMoeW1pbiA9IGQxNEMgLSByZXNwX3NkLCB5bWF4ID0gZDE0QyArIHJlc3Bfc2QpLAogICAgICAgICAgICAgICAgY29sb3IgPSAiI0ZGQzEwNyIsIHdpZHRoID0gLjIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICBuYW1lID0gIk1vZGVsIHBvb2wiLAogICAgdmFsdWVzID0gYygiYXRtIiA9ICJibGFjayIsCiAgICAgICAgICAgICAgICJmYXN0IiA9ICIjRDgxQjYwIiwgCiAgICAgICAgICAgICAgICJyZXNwaXJhdGlvbiIgPSAiI0ZGQzEwNyIsIAogICAgICAgICAgICAgICAic2xvdyIgPSAiIzFFODhFNSIpLAogICAgbGFiZWxzID0gYygiYXRtIiA9ICJhdG1vc3BoZXJlXG4obWVhc3VyZWQpIiwKICAgICAgICAgICAgICAgImZhc3QiID0gImZhc3QiLAogICAgICAgICAgICAgICAic2xvdyIgPSAic2xvdyIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKCJhdG0iID0gOCwKICAgICAgICAgICAgICAgImZhc3QiID0gIiNEODFCNjAiLCAKICAgICAgICAgICAgICAgInJlc3BpcmF0aW9uIiA9ICIjRkZDMTA3IiwgCiAgICAgICAgICAgICAgICJzbG93IiA9ICIjMUU4OEU1IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKCJjb250cm9sIiA9IDE2LAogICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCIgPSAxLCAKICAgICAgICAgICAgICAgImFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlIiA9IDApLAogICAgbGFiZWxzID0gYygiY29udHJvbCIgPSAiY29udHJvbC0xICgyMDExKVxuY29udHJvbC0yICgyMDE5KSIsCiAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0IiA9ICJhaXItZHJ5L3Jld2V0IiwgCiAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIgPSAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDIwMDAsIDIwMjIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEwMCwgMTgwKSkgKwogIHhsYWIoIlllYXIiKSArCiAgeWxhYihleHByZXNzaW9uKCcnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyBTYXZlIHcvIGVycm9yIGJhcnMKc2NocnVtcGYuMjAxNSR5bWluIDwtIGlmZWxzZShzY2hydW1wZi4yMDE1JHBvb2wgPT0gInJlc3BpcmF0aW9uIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NocnVtcGYuMjAxNSRkMTRDICsgc2NocnVtcGYuMjAxNSRxMjUuNzUsIE5BKQpzY2hydW1wZi4yMDE1JHltYXggPC0gaWZlbHNlKHNjaHJ1bXBmLjIwMTUkcG9vbCA9PSAicmVzcGlyYXRpb24iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hydW1wZi4yMDE1JGQxNEMgKyBzY2hydW1wZi4yMDE1JHE3NS4yNSwgTkEpCnNhdmUoc2NocnVtcGYuMjAxNSwgZmlsZSA9ICJzY2hydW1wZi4yMDE1Lm1vZC5SRGF0YSIpCmBgYAoKYGBge3IgZmlnNi1zY2hydW1wZjE1LW1lZGlhbn0KIyBwbG90IHdob2xlIGJvbWIgcGVyaW9kCnNjaHJ1bXBmLjIwMTUgJT4lCiAgZmlsdGVyKHBvb2wgIT0gImJ1bGsgQyIpICU+JQogIGdncGxvdCguLCBhZXMoeWVhcnMsIGQxNEMpKSArCiAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IHBvb2wpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gb2JzLnJzcC5tLCBhZXMoeWVhcnMsIGQxNEMsIHNoYXBlID0gVHJlYXRtZW50KSwgCiAgICAgICAgICAgICBjb2xvciA9ICIjRkZDMTA3Iiwgc2l6ZSA9IDMpICsKICBnZW9tX3BvaW50KGRhdGEgPSBvYnMucnNwLnQubSwgYWVzKHllYXJzLCBkMTRDLCBzaGFwZSA9IFRyZWF0bWVudCksIAogICAgICAgICAgICAgY29sb3IgPSAiI0ZGQzEwNyIsIHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcihkYXRhID0gb2JzLnJzcC5tLCAKICAgICAgICAgICAgICAgIGFlcyh5bWluID0gZDE0QyAtIHJlc3Bfc2QsIHltYXggPSBkMTRDICsgcmVzcF9zZCksCiAgICAgICAgICAgICAgICBjb2xvciA9ICIjRkZDMTA3Iiwgd2lkdGggPSAuMikgKwogIGdlb21fZXJyb3JiYXIoZGF0YSA9IG9icy5yc3AudC5tLCAKICAgICAgICAgICAgICAgIGFlcyh5bWluID0gZDE0QyAtIHJlc3Bfc2QsIHltYXggPSBkMTRDICsgcmVzcF9zZCksCiAgICAgICAgICAgICAgICBjb2xvciA9ICIjRkZDMTA3Iiwgd2lkdGggPSAuMikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIG5hbWUgPSAiTW9kZWwgcG9vbCIsCiAgICB2YWx1ZXMgPSBjKCJhdG0iID0gImJsYWNrIiwKICAgICAgICAgICAgICAgImZhc3QiID0gIiNEODFCNjAiLCAKICAgICAgICAgICAgICAgInJlc3BpcmF0aW9uIiA9ICIjRkZDMTA3IiwgCiAgICAgICAgICAgICAgICJzbG93IiA9ICIjMUU4OEU1IiksCiAgICBsYWJlbHMgPSBjKCJhdG0iID0gImF0bW9zcGhlcmVcbihtZWFzdXJlZCkiLAogICAgICAgICAgICAgICAiZmFzdCIgPSAiZmFzdCIsCiAgICAgICAgICAgICAgICJzbG93IiA9ICJzbG93IikpICsKICBzY2FsZV9maWxsX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoImF0bSIgPSA4LAogICAgICAgICAgICAgICAiZmFzdCIgPSAiI0Q4MUI2MCIsIAogICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciLCAKICAgICAgICAgICAgICAgInNsb3ciID0gIiMxRTg4RTUiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoImNvbnRyb2wiID0gMTYsCiAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0IiA9IDEsIAogICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiID0gMCksCiAgICBsYWJlbHMgPSBjKCJjb250cm9sIiA9ICJjb250cm9sLTEgKDIwMTEpXG5jb250cm9sLTIgKDIwMTkpIiwKICAgICAgICAgICAgICAgImFpci1kcnkvcmV3ZXQiID0gImFpci1kcnkvcmV3ZXQiLCAKICAgICAgICAgICAgICAgImFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlIiA9ICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMTk1MCwgMjAyMikpICsKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoZXhwcmVzc2lvbignJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZyBgciB7KGZpZy5uICsgNSl9YGEuIFRyYWplY3RvcmllcyBvZiAkXERlbHRhJF4xNF5DIG92ZXIgdGltZSBpbiBzb2lsIEMgYW5kIHJlc3BpcmVkIENPfjJ+IGZvciBhIDItcG9vbCBtb2RlbCBmaXQgdG8gdGhlIEhhaW5pY2gtRMO8biBmb3Jlc3Qgc2l0ZXMgaW4gcmVsYXRpb24gdG8gYXRtb3NwaGVyaWMgJFxEZWx0YSReMTReQyoqCgo+KkNhcHRpb246KiBNb2RlbGVkIGN1cnZlcyBkZXJpdmVkIGZyb20gYSB0d28tcG9vbCBwYXJhbGxlbCBtb2RlbCBwYXJhbWV0ZXJpemVkIHdpdGggZGF0YSBmcm9tIFNjaHJ1bXBmIGV0IGFsLiAoMjAxNSk6ICgqa35mYXN0fiogPSAxLzQpIGFuZCBhIG1vcmUgc2xvd2x5IGN5Y2xpbmcgcG9vbCAoKmt+c2xvd34qID0gMS8xMTUpLiBHb2xkIHBvaW50cyBzaG93IG9ic2VydmVkICRcRGVsdGEkXjE0XkMtQ09+Mn4gZnJvbSB0aGlzIHN0dWR5LiBTb2xpZCBzeW1ib2xzIHNob3cgY29udHJvbCBzYW1wbGVzLCBvcGVuIHN5bWJvbHMgc2hvdyB0cmVhdG1lbnQgc2FtcGxlcy4gQXRtb3NwaGVyaWMgJFxEZWx0YSReMTReQyBkYXRhIHVwIHRvIHRoZSB5ZWFyIDIwMTUgYXJlIGZyb20gR3JhdmVuIGV0IGFsLiAoMjAxNyksIHdoaWxlIGRhdGEgcG9pbnRzIGJleW9uZCAyMDE1IHVzZSB0aGUgZXh0cmFwb2xhdGlvbiBtZXRob2QgZnJvbSBTaWVycmEgKDIwMTgpLiBBbGwgYXRtb3NwaGVyaWMgcmFkaW9jYXJib24gZGF0YSBpcyBmb3IgdGhlIG5vcnRoZXJuIGhlbWlzcGhlcmUgKHpvbmUgMikuCgpgYGB7ciBjb25jZXB0dWFsLW1vZGVsLWZpZzFifQojIHBsb3Qgem9vbSB3LyAyNXRoLTc1dGggcXVhcnRpbGUgZXJyb3Igb24gcmVzcApzY2hydW1wZi4yMDE1ICU+JQogIGZpbHRlcihwb29sICE9ICJidWxrIEMiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHllYXJzLCBkMTRDKSkgKwogIGdlb21fcmliYm9uKGFlcyh5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSBwb29sKSwKICAgICAgICAgICAgICBhbHBoYSA9IC4xLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IHBvb2wpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gb2JzLnJzcC5tLCBhZXMoeWVhcnMsIGQxNEMsIHNoYXBlID0gVHJlYXRtZW50KSwgCiAgICAgICAgICAgICBjb2xvciA9ICIjRkZDMTA3Iiwgc2l6ZSA9IDMpICsKICBnZW9tX3BvaW50KGRhdGEgPSBvYnMucnNwLnQubSwgYWVzKHllYXJzLCBkMTRDLCBzaGFwZSA9IFRyZWF0bWVudCksIAogICAgICAgICAgICAgY29sb3IgPSAiI0ZGQzEwNyIsIHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcihkYXRhID0gb2JzLnJzcC5tLCAKICAgICAgICAgICAgICAgIGFlcyh5bWluID0gZDE0QyAtIHJlc3Bfc2QsIHltYXggPSBkMTRDICsgcmVzcF9zZCksCiAgICAgICAgICAgICAgICBjb2xvciA9ICIjRkZDMTA3Iiwgd2lkdGggPSAuMikgKwogIGdlb21fZXJyb3JiYXIoZGF0YSA9IG9icy5yc3AudC5tLCAKICAgICAgICAgICAgICAgIGFlcyh5bWluID0gZDE0QyAtIHJlc3Bfc2QsIHltYXggPSBkMTRDICsgcmVzcF9zZCksCiAgICAgICAgICAgICAgICBjb2xvciA9ICIjRkZDMTA3Iiwgd2lkdGggPSAuMikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIG5hbWUgPSAiTW9kZWwgcG9vbCIsCiAgICB2YWx1ZXMgPSBjKCJhdG0iID0gImJsYWNrIiwKICAgICAgICAgICAgICAgImZhc3QiID0gIiNEODFCNjAiLCAKICAgICAgICAgICAgICAgInJlc3BpcmF0aW9uIiA9ICIjRkZDMTA3IiwgCiAgICAgICAgICAgICAgICJzbG93IiA9ICIjMUU4OEU1IiksCiAgICBsYWJlbHMgPSBjKCJhdG0iID0gImF0bW9zcGhlcmVcbihtZWFzdXJlZCkiLAogICAgICAgICAgICAgICAiZmFzdCIgPSAiZmFzdCIsCiAgICAgICAgICAgICAgICJzbG93IiA9ICJzbG93IikpICsKICBzY2FsZV9maWxsX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoImF0bSIgPSA4LAogICAgICAgICAgICAgICAiZmFzdCIgPSAiI0Q4MUI2MCIsIAogICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciLCAKICAgICAgICAgICAgICAgInNsb3ciID0gIiMxRTg4RTUiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoImNvbnRyb2wiID0gMTYsCiAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0IiA9IDEsIAogICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiID0gMCksCiAgICBsYWJlbHMgPSBjKCJjb250cm9sIiA9ICJjb250cm9sLTEgKDIwMTEpXG5jb250cm9sLTIgKDIwMTkpIiwKICAgICAgICAgICAgICAgImFpci1kcnkvcmV3ZXQiID0gImFpci1kcnkvcmV3ZXQiLCAKICAgICAgICAgICAgICAgImFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlIiA9ICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMjAwMCwgMjAyMikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMjUsIDE4MCkpICsKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoZXhwcmVzc2lvbignJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgo+KipGaWcgYHIgeyhmaWcubiArIDUpfWBiLiBQb3RlbnRpYWwgc2hpZnRzIGluICRcRGVsdGEkXjE0XkMgb2YgcmVzcGlyZWQgQ09+Mn4gaW4gcmVzcG9uc2UgdG8gdHJlYXRtZW50KioKCj4qQ2FwdGlvbjoqIFpvb21pbmcgaW4gb24gdGhlIHN0dWR5IHBlcmlvZCwgd2UgY2FuIHNlZSB0aGF0IHRoZSB0cmVhdG1lbnQgc2FtcGxlICRcRGVsdGEkXjE0XkMtQ09+Mn4gc2hpZnRzIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHNsb3dseSBjeWNsaW5nIHNvaWwgQyBwb29sIChibHVlIGxpbmUpLCBpbmRpY2F0aW5nIGluY3JlYXNlZCBjb250cmlidXRpb24gZnJvbSB0aGlzIHBvb2wgdG8gcmVzcGlyYXRpb24gZm9sbG93aW5nIGFpci1kcnlpbmcgYW5kIHJld2V0dGluZy4gTm90ZSB0aGF0IHRoZSBpbmNyZWFzZWQgY29udHJpYnV0aW9uIGZyb20gdGhlIHNsb3cgY3ljbGluZyBwb29sIGxlYWRzIHRvIGRlcGxldGlvbiBpbiAkXERlbHRhJF4xNF5DLUNPfjJ+IHJlbGF0aXZlIHRvIHRoZSBjb250cm9scyBpbiAyMDExLCBidXQgZW5yaWNobWVudCBpbiAyMDE5IGR1ZSB0byB0aGUgY3Jvc3Npbmcgb2YgdGhlIHNsb3cgYW5kIGZhc3QgY3ljbGluZyBwb29sIGN1cnZlcyBpbiAyMDE2LiBTaGFkZWQgcmliYm9uIGFyb3VuZCB0aGUgcmVzcGlyYXRpb24gY3VydmUgc2hvd3MgdGhlIG1vZGVsIHBhcmFtZXRlcml6ZWQgd2l0aCB0aGUgNzV0aCBxdWFydGlsZSBlc3RpbWF0ZXMgZm9yICprfmZhc3R+KiAoMS83KSBhbmQgKmt+c2xvd34qICgxLzIwMCkuCgoKYGBge3IgcmVwLXZhcn0KIyBjYWxjdWxhdGUgdmFyaWFiaWxpdHkgYmV0d2VlbiByZXBzCiMgY2FsYyBkaWZmZXJlbmNlIGJldHdlZW4gcmVwcyBhbmQgY29tcGFyZSB0byBkaWYgYmV0d2VlbiBjdGwgYW5kIHRyZWF0CmUxMi5kMTQgPC0gYWxsLjE0Yy5sc1tbMl1dCmUxMi5kMTQuaW5jIDwtIGUxMi5kMTRbZTEyLmQxNCRQZXJpb2QgPT0gImluYyIsIF0KCiMgc3BsaXQgYnkgRXhwZXJpbWVudCBhbmQgVHlwZSB0byBjb21wYXJlIHdpdGggY3RsLXRydCBkaWZzCmUxMi5kMTQuaW5jLmxzIDwtIGxhcHBseShzcGxpdChlMTIuZDE0LmluYywgZTEyLmQxNC5pbmMkRXhwZXJpbWVudCksIGZ1bmN0aW9uKHgpIHsKICAgIGxhcHBseShzcGxpdCh4LCB4JFR5cGUpLCBmdW5jdGlvbih5KSB7CiAgICAgIHkgPC0gbGFwcGx5KHNwbGl0KHksIHkkVHJlYXRtZW50KSwgZnVuY3Rpb24oeikgewogICAgICAgIHogPC0gbGFwcGx5KHNwbGl0KHosIHokSUQpLCBmdW5jdGlvbihtKSB7CiAgICAgICAgICBpZihucm93KG0pID4gMSkgewogICAgICAgICAgICBtIDwtIGFicyhtWzIsICJkMTRjIl0gLSBtWzEsICJkMTRjIl0pCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtIDwtIE5BCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICBtZWFuIDwtIG1lYW4odW5saXN0KHopKQogICAgICAgIHNkIDwtIHNkKHVubGlzdCh6KSkKICAgICAgICB2YXIgPC0gdmFyKHVubGlzdCh6KSkKICAgICAgICBuIDwtIGxlbmd0aCh6KQogICAgICAgIHoubHMgPC0gbGlzdChtZWFuID0gbWVhbiwKICAgICAgICAgICAgICAgICAgICAgc2QgPSBzZCwKICAgICAgICAgICAgICAgICAgICAgdmFyID0gdmFyLAogICAgICAgICAgICAgICAgICAgICBuID0gbiwKICAgICAgICAgICAgICAgICAgICAgc2UgPSBzZC9zcXJ0KG4pKQogICAgICAgIH0pCiAgfSkKfSkKCiMgcmVkdWNlIGxpc3QKdmFyLm5hbWVzIDwtIGMoIkV4cGVyaW1lbnQiLCAiVHlwZSIsICJUcmVhdG1lbnQiLCAiZGlzcGVyc2lvbiIpCnZhbHVlcyA8LSB1bmxpc3QoZTEyLmQxNC5pbmMubHMpCmUxMi5kMTQuc2RpZi5tYXQgPC0gbWF0cml4KG5jb2wgPSBsZW5ndGgodmFyLm5hbWVzKSArIDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gbGVuZ3RoKHZhbHVlcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbW5hbWVzID0gbGlzdChOVUxMLCBjKHZhci5uYW1lcywgInZhbHVlIikpKQpmb3IoaSBpbiBzZXFfYWxvbmcodmFyLm5hbWVzKSkgewogIGUxMi5kMTQuc2RpZi5tYXRbLCBpXSA8LSB1bmxpc3QobGFwcGx5KHN0cnNwbGl0KG5hbWVzKHZhbHVlcyksICJcXC4iKSwgIltbIiwgaSkpCn0KCmUxMi5kMTQuc2RpZiA8LSBkYXRhLmZyYW1lKGUxMi5kMTQuc2RpZi5tYXQpCmUxMi5kMTQuc2RpZiR2YWx1ZSA8LSB2YWx1ZXMKIAojIHdpZGVuIGFuZCByZW1vdmUgTkFzCmUxMi5kMTQuc2RpZiA8LSBwaXZvdF93aWRlcihlMTIuZDE0LnNkaWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc19mcm9tID0gImRpc3BlcnNpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSAidmFsdWUiKQplMTIuZDE0LnNkaWYgPC0gZTEyLmQxNC5zZGlmWyFpcy5uYShlMTIuZDE0LnNkaWYkbWVhbiksIF0KCiMgbWFrZSBmdXJ0aGVyIHJlZHVjZWQgZGYgKGNvbGxhcHNlIHRyZWF0bWVudCkKZTEyLmQxNC5zZGlmMiA8LSBkYXRhLmZyYW1lKEV4cGVyaW1lbnQgPSByZXAoYygiYXJjIiwgInJld2V0IiksIGVhY2ggPSAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPSByZXAoYygiRiIsICJHIiksIDIpKQplMTIuZDE0LnNkaWYyJG1lYW4gPC0gdW5saXN0KGMoZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJhcmMiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRiIsICJtZWFuIl0sCiAgICAgICAgICAgICAgICAgICAgICAgIGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAiYXJjIiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkciLCAibWVhbiJdLAogICAgICAgICAgICAgICAgICAgICAgICBtZWFuKHVubGlzdChlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkYiLCAibWVhbiJdKSksCiAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4odW5saXN0KGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRyIsICJtZWFuIl0pKSkpCgojIGZ1bmN0aW9uIGZvciBjYWxjdWxhdGluZyBzdGQgZXJyIG9mIGRpZnMKc3RkLmVyci5kaWYgPC0gZnVuY3Rpb24oc2RzLCBucykge3NxcnQoc2RzWzFdXjIvbnNbMV0gKyBzZHNbMl1eMi9uc1syXSl9CiMgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIG1lYW4gc3RkIGRldgpzdGQuZGV2Lm1lYW4gPC0gZnVuY3Rpb24odmFycykge3NxcnQobWVhbih2YXJzKSl9CgplMTIuZDE0LnNkaWYyJHNlIDwtIHVubGlzdChjKGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAiYXJjIiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkYiLCAic2UiXSwKICAgICAgICAgICAgICAgICAgICAgICAgZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJhcmMiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRyIsICJzZSJdLAogICAgICAgICAgICAgICAgICAgICAgc3RkLmVyci5kaWYodW5saXN0KGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRiIsICJzZCJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkYiLCAibiJdKSksCiAgICAgICAgICAgICAgICAgICAgICBzdGQuZXJyLmRpZih1bmxpc3QoZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJyZXdldCIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJHIiwgInNkIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRyIsICJuIl0pKSkpCgojIGNhbGMgbWVhbiB2YXJpYW5jZQplMTIuZDE0LnNkaWYyJHZhciA8LSB1bmxpc3QoYyhlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gImFyYyIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJGIiwgInZhciJdLAogICAgICAgICAgICAgICAgICAgICAgICBlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gImFyYyIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJHIiwgInZhciJdLAogICAgICAgICAgICAgICAgICAgICAgbWVhbih1bmxpc3QoZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJyZXdldCIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJGIiwgInZhciJdKSksCiAgICAgICAgICAgICAgICAgICAgICBtZWFuKHVubGlzdChlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkciLCAidmFyIl0pKSkpCgojICMgbWVhbiBzdGQgZGV2IGZvciBmb3Jlc3RzCiMgc3RkLmRldi5tZWFuKGMoZTEyLmQxNC5zZGlmMltlMTIuZDE0LnNkaWYyJFR5cGUgPT0gIkYiLCAidmFyIl0pKQojICMgbWVhbiBzdGQgZGV2IGZvciBncmFzc2xhbmRzCiMgc3RkLmRldi5tZWFuKGMoZTEyLmQxNC5zZGlmMltlMTIuZDE0LnNkaWYyJFR5cGUgPT0gIkciLCAidmFyIl0pKQoKIyBjb21wYXJlIHRvIGN0bCB0cmVhdCBkaWYKZTEyLjE0Yy5jdGwudHJ0IDwtIGFsbC4xNGMuY3RsLnRydCAlPiUKICBzZWxlY3QoRXhwZXJpbWVudCwgVHlwZSwgY3RsLnRydC5kMTQpICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFR5cGUpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCwgdmFyID0gdmFyKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoY3RsLnRydC5zZSA9IGN0bC50cnQuZDE0X3NkL25fbWVhbikKCiMgY29tYmluZQp2YXIuY2YgPC0gY2JpbmQuZGF0YS5mcmFtZShlMTIuMTRjLmN0bC50cnRbMTo0LCBdLCBlMTIuZDE0LnNkaWYyWyAsIGMoIm1lYW4iLCAic2UiKV0pICU+JQogIHNlbGVjdChjKEV4cGVyaW1lbnQsIFR5cGUsIG5fbWVhbiwgY3RsLnRydC5kMTRfbWVhbiwgY3RsLnRydC5zZSwgbWVhbiwgc2UpKQojIGtuaXRyOjprYWJsZSh2YXIuY2ZbLCBjKCJFeHBlcmltZW50IiwgIlR5cGUiLCAiY3RsLnRydC5kMTRfbWVhbiIsICJjdGwudHJ0LnNlIiwgIm1lYW4iLCAic2UiKV0sCiMgICAgICAgICAgICAgIGNvbC5uYW1lcyA9IGMoIkV4cGVyaW1lbnQiLCAiVHlwZSIsICJDdGwtVHJ0IG1lYW4gZGlmIiwgIkN0bC1UcnQgU0UiLCAiUmVwbGljYXRlIG1lYW4gZGlmIiwgIlJlcGxpY2F0ZSBTRSIpLAojICAgICAgICAgICAgICBjYXB0aW9uID0gIkNvbXBhcmlzb24gb2YgdHJlYXRtZW50IGRpZmZlcmVuY2VzIHZlcnN1cyB2YXJpYWJpbGl0eSBhbW9uZyByZXBsaWNhdGVzIiwKIyAgICAgICAgICAgICAgYWxpZ24gPSAiYyIsCiMgICAgICAgICAgICAgIGRpZ2l0cyA9IDEpCmBgYAoKYGBge3Igc3RhdHMtMjAyMS0wNS0yMX0KIyBjYWxjdWxhdGUgbWVhbnMgYW5kIHZhcmlhbmNlcyB3aXRoaW4gZXhwZXJpbWVudCwgcGVyaW9kLCB0eXBlLCBhbmQgSUQKYWxsLjE0Yy5kZiA8LSByYmluZChhbGwuMTRjLmxzW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgYWxsLjE0Yy5sc1tbMl1dWywgd2hpY2gobmFtZXMoYWxsLjE0Yy5sc1tbMl1dKSAlaW4lIG5hbWVzKGFsbC4xNGMubHNbWzFdXSkpXSkKYWxsLjE0Yy5kZiR0cmVhdC5iaSA8LSBpZmVsc2UoYWxsLjE0Yy5kZiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsICJ0cmVhdG1lbnQiKQoKIyBEdW5uZXR0J3MgdGVzdCAodHJlYXQrcmVwIGNvbXBhcmlzb25zIGFnYWluc3Qgc2luZ2xlIGNvbnRyb2wpCmFsbC4xNGMuZGYuZHVuIDwtIGJpbmRfcm93cyhsYXBwbHkoc3BsaXQoYWxsLjE0Yy5kZiwgYWxsLjE0Yy5kZiRFeHBlcmltZW50KSwgZnVuY3Rpb24oZXhwKQogIGJpbmRfcm93cyhsYXBwbHkoc3BsaXQoZXhwLCBleHAkUGVyaW9kKSwgZnVuY3Rpb24ocGVyKQogICAgYmluZF9yb3dzKGxhcHBseShzcGxpdChwZXIsIHBlciR0cmVhdC5iaSksIGZ1bmN0aW9uKHRydCkKICAgICAgYmluZF9yb3dzKAogICAgICAgIGxhcHBseShzcGxpdCh0cnQsIHRydCRJRCksIGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgaWQkcmVwIDwtIHNlcSgxLCBucm93KGlkKSkKICAgICAgICByZXR1cm4oaWQpCiAgICAgIH0pLCAuaWQgPSAiSUQiKSksIC5pZCA9ICJ0cmVhdC5iaSIpKSwgLmlkID0gIlBlcmlvZCIpKSwgLmlkID0gIkV4cGVyaW1lbnQiKQphbGwuMTRjLmRmLmR1biR0cnRSZXAgPC0gZmFjdG9yKHBhc3RlMChhbGwuMTRjLmRmLmR1biR0cmVhdC5iaSwgYWxsLjE0Yy5kZi5kdW4kcmVwKSkKYXJjLmluYy5GLmFvdiA8LSBhb3YoZDE0YyB+IHRydFJlcCwKICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFsbC4xNGMuZGYuZHVuW2FsbC4xNGMuZGYuZHVuJEV4cGVyaW1lbnQgPT0gImFyYyIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLjE0Yy5kZi5kdW4kUGVyaW9kID09ICJpbmMiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbC4xNGMuZGYuZHVuJFR5cGUgPT0gIkYiLCBdKQphcmMuaW5jLkYuZ2hsdCA8LSBnbGh0KGFyYy5pbmMuRi5hb3YsIGxpbmZjdCA9IG1jcCh0cnRSZXAgPSAiRHVubmV0dCIpKQphcmMuaW5jLkcuYW92IDwtIGFvdihkMTRjIH4gdHJ0UmVwLAogICAgICAgICAgICAgICAgICAgICBkYXRhID0gYWxsLjE0Yy5kZi5kdW5bYWxsLjE0Yy5kZi5kdW4kRXhwZXJpbWVudCA9PSAiYXJjIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwuMTRjLmRmLmR1biRQZXJpb2QgPT0gImluYyIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLjE0Yy5kZi5kdW4kVHlwZSA9PSAiRyIsIF0pCmFyYy5pbmMuRy5naGx0IDwtIGdsaHQoYXJjLmluYy5HLmFvdiwgbGluZmN0ID0gbWNwKHRydFJlcCA9ICJEdW5uZXR0IikpCgoKYWxsLjE0Yy5zdGF0cy5scyA8LSBsYXBwbHkoCiAgIyBzcGxpdCBieSBFeHBlcmltZW50IGFuZCByZXN0cmljdCB0byBBIGhvcml6b24KICBzcGxpdChhbGwuMTRjLmRmW2FsbC4xNGMuZGYkSG9yaXpvbiA9PSAiQSIsIF0sIAogICAgICAgIGFsbC4xNGMuZGZbYWxsLjE0Yy5kZiRIb3Jpem9uID09ICJBIiwgIkV4cGVyaW1lbnQiXSksIGZ1bmN0aW9uKGV4cCkgewogICAgIyBzcGxpdCBieSBQZXJpb2QKICAgICAgICAgICMgZXhjbHVkZSBPYWsgUmlkZ2UKICAgICAgICAgICMgaWYgKGV4cFsxLCAiRXhwZXJpbWVudCJdID09ICJ0bWUiKSB7CiAgICAgICAgICAjICAgZXhwIDwtIGV4cFstd2hpY2goZXhwJFNpdGUgPT0gIlRlbm5lc3NlZSBWYWxsZXkiIHwgZXhwJFNpdGUgPT0gIldhbGtlciBCcmFuY2giKSwgXQogICAgICAgICAgIyB9CiAgICAgICAgICBsYXBwbHkoc3BsaXQoZXhwLCBleHAkUGVyaW9kKSwgZnVuY3Rpb24ocGVyKSB7CiAgICAgICAgICAgICMgc3BsaXQgYnkgVHJlYXRtZW50CiAgICAgICAgICAgIGxhcHBseShzcGxpdChwZXIsIHBlciR0cmVhdC5iaSksIGZ1bmN0aW9uKHRydCkgewogICAgICAgICAgICAjIGNhbGN1bGF0ZSBtZWFuIGFuZCB2YXIgb2YgcmVwcwogICAgICAgICAgICAgIGJpbmRfcm93cygKICAgICAgICAgICAgICAgIGxhcHBseShzcGxpdCh0cnQsIHRydCRJRCksIGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgICAgICAgICAgIGRhdGEuZnJhbWUobSA9IG1lYW4oaWQkZDE0Y19jb3JyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdmFyKGlkJGQxNGNfY29yciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IHVuaXF1ZShpZCRUeXBlKSkKICAgICAgICAgICAgICAgIH0pLCAuaWQgPSAiSUQiKQogICAgICAgICAgICB9KQogICAgICAgIH0pCiAgICAgIH0pCgojIFVzZSBtZWFuIG9mIHJlcGxpY2F0ZSB2YXJpYW5jZXMgYWNyb3NzIGFsbCBleHBlcmltZW50cyBmb3IgbWlzc2luZyB2YXJpYW5jZXMKbWVhbi5yZXAudmFyIDwtIG1lYW4oYyhhbGwuMTRjLnN0YXRzLmxzJHJld2V0JGluYyRGJGNvbnRyb2wkdiwKICAgICAgICAgICAgICAgICAgICAgICBhbGwuMTRjLnN0YXRzLmxzJHJld2V0JGluYyRHJGNvbnRyb2wkdiwKICAgICAgICAgICAgICAgICAgICAgICBhbGwuMTRjLnN0YXRzLmxzJHJld2V0JGluYyRHJHRyZWF0bWVudCR2LAogICAgICAgICAgICAgICAgICAgICAgIGFsbC4xNGMuc3RhdHMubHMkcmV3ZXQkaW5jJEYkdHJlYXRtZW50JHYsCiAgICAgICAgICAgICAgICAgICAgICAgYWxsLjE0Yy5zdGF0cy5scyRhcmMkaW5jJEYkdHJlYXRtZW50JHYsCiAgICAgICAgICAgICAgICAgICAgICAgYWxsLjE0Yy5zdGF0cy5scyRhcmMkaW5jJEckdHJlYXRtZW50JHYsCiAgICAgICAgICAgICAgICAgICAgICAgYWxsLjE0Yy5zdGF0cy5scyR0bWUkaW5jJEYkY29udHJvbCR2LAogICAgICAgICAgICAgICAgICAgICAgIGFsbC4xNGMuc3RhdHMubHMkdG1lJGluYyRGJHRyZWF0bWVudCR2KSwgbmEucm0gPSBUUlVFKQojIGFkZCB2YXIgd2hlcmUgbmVlZGVkCmFsbC4xNGMuc3RhdHMubHMgPC0gbGFwcGx5KGFsbC4xNGMuc3RhdHMubHMsIGZ1bmN0aW9uKGV4cCkgewogIGxhcHBseShleHAsIGZ1bmN0aW9uKHBlcikgewogICAgbGFwcGx5KHBlciwgZnVuY3Rpb24odHJ0KSB7CiAgICAgIHRydCR2IDwtIGlmZWxzZShpcy5uYSh0cnQkdiksIG1lYW4ucmVwLnZhciwgdHJ0JHYpCiAgICAgIHJldHVybih0cnQpCiAgICAgIH0pCiAgICB9KQogIH0pCgojIGNhbGN1bGF0ZSBncmFuZCBtZWFucyBhbmQgcG9vbGVkIHZhcmlhbmNlIHcvaW4gdHJlYXRtZW50IGdyb3VwcyBhbmQgdHlwZXMKYXJjLnJld2V0LjE0Yy5zdGF0cy5pbmMubHMyIDwtIGxhcHBseShhbGwuMTRjLnN0YXRzLmxzWzE6Ml0sIGZ1bmN0aW9uKGV4cCkKICBsYXBwbHkoZXhwLCBmdW5jdGlvbihwZXIpIAogICAgbGFwcGx5KHBlciwgZnVuY3Rpb24odHJ0KQogICAgICBsYXBwbHkoc3BsaXQodHJ0LCB0cnQkVHlwZSksIGZ1bmN0aW9uKGlkLnN1bSkgewogICAgICAgIHNhbXBsZS5kZWNvbXAobiA9IHJlcCgyLCBsZW5ndGgoaWQuc3VtJG0pKSwKICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS5tZWFuID0gaWQuc3VtJG0sCiAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUudmFyID0gaWQuc3VtJHYsCiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkKICAgICAgfSkpKSkKCiMgQ2FsY3VsYXRlIG1lYW4gZGlmZmVyZW5jZXMgZm9yIDJuZCBlbmNsb3N1cmUgcGVyaW9kICgiaW5jIikKYWxsLjE0Yy5zdGF0cy5pbmMuZGlmLmxzIDwtIGxhcHBseShhbGwuMTRjLnN0YXRzLmxzLCBmdW5jdGlvbihleHApIHsKICBpbmMubHMgPC0gdW5saXN0KGV4cFt3aGljaChuYW1lcyhleHApID09ICJpbmMiKV0sIHJlY3Vyc2l2ZSA9IEZBTFNFKSAKICBpbmMuZGYgPC0gbWVyZ2UoaW5jLmxzW1sxXV0sIGluYy5sc1tbMl1dLCBieSA9ICJJRCIsIHN1ZmZpeGVzID0gbmFtZXMoZXhwJGluYykpCiAgIyBjYWxjdWxhdGUgbWVhbiBkaWZmZXJlbmNlCiAgaW5jLmRmJGRpZiA8LSBpbmMuZGYkbXRyZWF0bWVudCAtIGluYy5kZiRtY29udHJvbAogICMgc3VtIHZhcmlhbmNlcwogIGluYy5kZiR2ZGlmIDwtIGluYy5kZiR2Y29udHJvbCArIGluYy5kZiR2dHJlYXRtZW50CiAgaW5jLmRmJFR5cGUgPC0gaW5jLmRmJFR5cGVjb250cm9sCiAgcmV0dXJuKGluYy5kZlsgLCBjKCJJRCIsICJkaWYiLCAidmRpZiIsICJUeXBlIildKQp9KQoKIyBjYWxjdWxhdGUgbWVhbiBvZiBtZWFuIGRpZmZlcmVuY2UgYW5kIHBvb2xlZCB2YXJpYW5jZQojIGFyYywgcmV3ZXQKYXJjLnJld2V0LjE0Yy5zdGF0cy5pbmMubHMgPC0gbGFwcGx5KGFsbC4xNGMuc3RhdHMuaW5jLmRpZi5sc1sxOjJdLCBmdW5jdGlvbihleHApIHsKICBsYXBwbHkoc3BsaXQoZXhwLCBleHAkVHlwZSksIGZ1bmN0aW9uKGlkLnN1bSkgewogICAgc2FtcGxlLmRlY29tcChuID0gcmVwKDIsIGxlbmd0aChpZC5zdW0kZGlmKSksCiAgICAgICAgICAgICAgICAgIHNhbXBsZS5tZWFuID0gaWQuc3VtJGRpZiwKICAgICAgICAgICAgICAgICAgc2FtcGxlLnZhciA9IGlkLnN1bSR2ZGlmLAogICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkKICB9KQp9KQoKIyMgdG1lCiMgYWxsCnRtZS4xNGMuc3RhdHMgPC0gc2FtcGxlLmRlY29tcChuID0gcmVwKDIsIG5yb3coYWxsLjE0Yy5zdGF0cy5pbmMuZGlmLmxzJHRtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLm1lYW4gPSBhbGwuMTRjLnN0YXRzLmluYy5kaWYubHMkdG1lJGRpZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZS52YXIgPSBhbGwuMTRjLnN0YXRzLmluYy5kaWYubHMkdG1lJHZkaWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkKdG1lLmNpOTUuaW50IDwtIHRtZS4xNGMuc3RhdHNbbnJvdyh0bWUuMTRjLnN0YXRzKSwgInNhbXBsZS5zZCJdIC8gc3FydCh0bWUuMTRjLnN0YXRzW25yb3codG1lLjE0Yy5zdGF0cyksICJuIl0pICogcXQoMC45NzUsIHRtZS4xNGMuc3RhdHNbbnJvdyh0bWUuMTRjLnN0YXRzKSwgIm4iXSAtIDEpCnRtZS5jaTk1IDwtIGModG1lLjE0Yy5zdGF0c1tucm93KHRtZS4xNGMuc3RhdHMpLCAic2FtcGxlLm1lYW4iXSAtIHRtZS5jaTk1LmludCwKICAgICAgICAgICAgICB0bWUuMTRjLnN0YXRzW25yb3codG1lLjE0Yy5zdGF0cyksICJzYW1wbGUubWVhbiJdICsgdG1lLmNpOTUuaW50KQoKIyBPYWsgUmlkZ2UKdG1lLk9SIDwtIGFsbC4xNGMuc3RhdHMuaW5jLmRpZi5scyR0bWVbYyh3aGljaChncmVwbCgiV0IiLCBhbGwuMTRjLnN0YXRzLmluYy5kaWYubHMkdG1lJElEKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2goZ3JlcGwoIlRWQSIsIGFsbC4xNGMuc3RhdHMuaW5jLmRpZi5scyR0bWUkSUQpKSksIF0KdG1lLk9SLnN0YXRzIDwtIHNhbXBsZS5kZWNvbXAobiA9IHJlcCgyLCBucm93KHRtZS5PUikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLm1lYW4gPSB0bWUuT1IkZGlmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLnZhciA9IHRtZS5PUiR2ZGlmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS5zZCA9IFRSVUUpCnRtZS5PUi5jaTk1LmludCA8LSB0bWUuT1Iuc3RhdHNbbnJvdyh0bWUuT1Iuc3RhdHMpLCAic2FtcGxlLnNkIl0gLyBzcXJ0KHRtZS5PUi5zdGF0c1tucm93KHRtZS5PUi5zdGF0cyksICJuIl0pICogcXQoMC45NzUsIHRtZS5PUi5zdGF0c1tucm93KHRtZS5PUi5zdGF0cyksICJuIl0gLSAxKQp0bWUuT1IuY2k5NSA8LSBjKHRtZS5PUi5zdGF0c1tucm93KHRtZS5PUi5zdGF0cyksICJzYW1wbGUubWVhbiJdIC0gdG1lLk9SLmNpOTUuaW50LAogICAgICAgICAgICAgICAgIHRtZS5PUi5zdGF0c1tucm93KHRtZS5PUi5zdGF0cyksICJzYW1wbGUubWVhbiJdICsgdG1lLk9SLmNpOTUuaW50KQojIE5vbiBPYWsgUmlkZ2UKdG1lLm5vbk9SIDwtIGFsbC4xNGMuc3RhdHMuaW5jLmRpZi5scyR0bWVbLWFzLm51bWVyaWMocm93Lm5hbWVzKHRtZS5PUikpLCBdCnRtZS5ub25PUi5zdGF0cyA8LSBzYW1wbGUuZGVjb21wKG4gPSByZXAoMiwgbnJvdyh0bWUubm9uT1IpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLm1lYW4gPSB0bWUubm9uT1IkZGlmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUudmFyID0gdG1lLm5vbk9SJHZkaWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUuc2QgPSBUUlVFKQp0bWUubm9uT1IuY2k5NS5pbnQgPC0gdG1lLm5vbk9SLnN0YXRzW25yb3codG1lLm5vbk9SLnN0YXRzKSwgInNhbXBsZS5zZCJdIC8gc3FydCh0bWUubm9uT1Iuc3RhdHNbbnJvdyh0bWUubm9uT1Iuc3RhdHMpLCAibiJdKSAqIHF0KDAuOTc1LCB0bWUubm9uT1Iuc3RhdHNbbnJvdyh0bWUubm9uT1Iuc3RhdHMpLCAibiJdIC0gMSkKdG1lLm5vbk9SLmNpOTUgPC0gYyh0bWUubm9uT1Iuc3RhdHNbbnJvdyh0bWUubm9uT1Iuc3RhdHMpLCAic2FtcGxlLm1lYW4iXSAtIHRtZS5ub25PUi5jaTk1LmludCwKICAgICAgICAgICAgICAgICAgICB0bWUubm9uT1Iuc3RhdHNbbnJvdyh0bWUubm9uT1Iuc3RhdHMpLCAic2FtcGxlLm1lYW4iXSArIHRtZS5ub25PUi5jaTk1LmludCkKIyBub25PUiBGCnRtZS5ub25PUi5GIDwtIHRtZS5ub25PUlt0bWUubm9uT1IkVHlwZSA9PSAiRiIsIF0KdG1lLm5vbk9SLkYuc3RhdHMgPC0gc2FtcGxlLmRlY29tcChuID0gcmVwKDIsIG5yb3codG1lLm5vbk9SLkYpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUubWVhbiA9IHRtZS5ub25PUi5GJGRpZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUudmFyID0gdG1lLm5vbk9SLkYkdmRpZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkKdG1lLm5vbk9SLkYuY2k5NS5pbnQgPC0gdG1lLm5vbk9SLkYuc3RhdHNbbnJvdyh0bWUubm9uT1IuRi5zdGF0cyksICJzYW1wbGUuc2QiXSAvCiAgc3FydCh0bWUubm9uT1IuRi5zdGF0c1tucm93KHRtZS5ub25PUi5GLnN0YXRzKSwgIm4iXSkgKiAKICBxdCgwLjk3NSwgdG1lLm5vbk9SLkYuc3RhdHNbbnJvdyh0bWUubm9uT1IuRi5zdGF0cyksICJuIl0gLSAxKQp0bWUubm9uT1IuRi5jaTk1IDwtIGModG1lLm5vbk9SLkYuc3RhdHNbbnJvdyh0bWUubm9uT1IuRi5zdGF0cyksICJzYW1wbGUubWVhbiJdIC0gdG1lLm5vbk9SLkYuY2k5NS5pbnQsCiAgICAgICAgICAgICAgICAgICAgdG1lLm5vbk9SLkYuc3RhdHNbbnJvdyh0bWUubm9uT1IuRi5zdGF0cyksICJzYW1wbGUubWVhbiJdICsgdG1lLm5vbk9SLkYuY2k5NS5pbnQpCiMgbm9uT1IgRwp0bWUubm9uT1IuRyA8LSB0bWUubm9uT1JbdG1lLm5vbk9SJFR5cGUgPT0gIkciLCBdCnRtZS5ub25PUi5HLnN0YXRzIDwtIHNhbXBsZS5kZWNvbXAobiA9IHJlcCgyLCBucm93KHRtZS5ub25PUi5HKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLm1lYW4gPSB0bWUubm9uT1IuRyRkaWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlLnZhciA9IHRtZS5ub25PUi5HJHZkaWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS5zZCA9IFRSVUUpCnRtZS5ub25PUi5HLmNpOTUuaW50IDwtIHRtZS5ub25PUi5HLnN0YXRzW25yb3codG1lLm5vbk9SLkcuc3RhdHMpLCAic2FtcGxlLnNkIl0gLwogIHNxcnQodG1lLm5vbk9SLkcuc3RhdHNbbnJvdyh0bWUubm9uT1IuRy5zdGF0cyksICJuIl0pICogCiAgcXQoMC45NzUsIHRtZS5ub25PUi5HLnN0YXRzW25yb3codG1lLm5vbk9SLkcuc3RhdHMpLCAibiJdIC0gMSkKdG1lLm5vbk9SLkcuY2k5NSA8LSBjKHRtZS5ub25PUi5HLnN0YXRzW25yb3codG1lLm5vbk9SLkcuc3RhdHMpLCAic2FtcGxlLm1lYW4iXSAtIHRtZS5ub25PUi5HLmNpOTUuaW50LAogICAgICAgICAgICAgICAgICAgIHRtZS5ub25PUi5HLnN0YXRzW25yb3codG1lLm5vbk9SLkcuc3RhdHMpLCAic2FtcGxlLm1lYW4iXSArIHRtZS5ub25PUi5HLmNpOTUuaW50KQoKIyBjYWxjdWxhdGUgZm9yIGFnZ3JlZ2F0ZWQgZGF0YXNldAphcmMucmV3ZXQuMTRjLnN0YXRzLmluYy5sczIgPC0gbGFwcGx5KAogIHNwbGl0KAogICAgYmluZF9yb3dzKGxhcHBseShhbGwuMTRjLnN0YXRzLmluYy5kaWYubHMsIGZ1bmN0aW9uKGRmKSBiaW5kX3Jvd3MoZGYsIC5pZCA9ICJ0eXBlIikpKSwKICAgIGJpbmRfcm93cyhsYXBwbHkoYWxsLjE0Yy5zdGF0cy5pbmMuZGlmLmxzLCBmdW5jdGlvbihkZikgYmluZF9yb3dzKGRmLCAuaWQgPSAidHlwZSIpKSlbWyJ0eXBlIl1dKSwgCiAgZnVuY3Rpb24oaWQuc3VtKQogICAgc2FtcGxlLmRlY29tcChuID0gcmVwKDIsIGxlbmd0aChpZC5zdW0kZGlmKSksCiAgICAgICAgICAgICAgICAgIHNhbXBsZS5tZWFuID0gaWQuc3VtJGRpZiwKICAgICAgICAgICAgICAgICAgc2FtcGxlLnZhciA9IGlkLnN1bSR2ZGlmLAogICAgICAgICAgICAgICAgICBpbmNsdWRlLnNkID0gVFJVRSkpCgojICMgaG9tb2dlbmVpdHkgb2YgdmFyaWFuY2U/CiMgYXJjLnJld2V0LjE0Yy52YXIuaW5jLmxzIDwtIGxhcHBseShhcmMucmV3ZXQuMTRjLnN0YXRzLmluYy5scywgZnVuY3Rpb24oZGYpIHsKIyAgIHZhci5kZiA8LSBiaW5kX3Jvd3MoZGYsIC5pZCA9ICJUeXBlIikKIyAgIHZhci5kZiA8LSB2YXIuZGZbd2hpY2godmFyLmRmJG4gPCAzKSwgXQojICAgdmFyLnRlc3Qoc2FtcGxlLnZhciB+IFR5cGUsIGRhdGEgPSB2YXIuZGYpCiMgfSkKIyAjIGNvbnRyb2wgdnMuIHRyZWF0bWVudCwgRXhwIDIKIyByZXdldC5jdGwudHJ0LnZhciA8LSBsYXBwbHkoYWxsLjE0Yy5zdGF0cy5scyRyZXdldCRpbmMsIGZ1bmN0aW9uKGRmKSB7CiMgICAgIHZhci5kZiA8LSBiaW5kX3Jvd3MoZGYsIC5pZCA9ICJ0cmVhdC5iaSIpCiMgICAgIHJldHVybih2YXIudGVzdCh2IH4gdHJlYXQuYmksIGRhdGEgPSB2YXIuZGYpKQojIH0pCgojIGV4dHJhY3QgbWVhbiBkaWZmZXJlbmNlcwphcmMuMTRjLmluYy5tZWFuRGlmIDwtIGJpbmRfcm93cygKICBsYXBwbHkoYXJjLnJld2V0LjE0Yy5zdGF0cy5pbmMubHMsIGZ1bmN0aW9uKGV4cCkgewogICAgYmluZF9yb3dzKAogICAgICBsYXBwbHkoZXhwLCBmdW5jdGlvbihtZCkgewogICAgICAgIGRmIDwtIHJvdW5kKG1kW25yb3cobWQpLCBjKCJuIiwgInNhbXBsZS5tZWFuIiwgInNhbXBsZS5zZCIpXSwgMSkKICAgICAgICB0IDwtIHF0KC45NzUsIGRmID0gbWF4KGRmJG4pIC0gMSkKICAgICAgICBkZiRzZSA8LSByb3VuZChkZiRzYW1wbGUuc2Qvc3FydChkZiRuKSwgMSkKICAgICAgICBkZiRjaTk1LmwgPC0gcm91bmQoZGYkc2FtcGxlLm1lYW4gLSBkZiRzZSAqIHQsIDEpCiAgICAgICAgZGYkY2k5NS51IDwtIHJvdW5kKGRmJHNhbXBsZS5tZWFuICsgZGYkc2UgKiB0LCAxKQogICAgICAgIHJldHVybihkZikKICAgIH0pLCAuaWQgPSAidHlwZSIpCn0pLCAuaWQgPSAiRXhwZXJpbWVudCIpICU+JQogIG11dGF0ZShUeXBlID0gc3Vic3RyKHR5cGUsIG5jaGFyKHR5cGUpLCBuY2hhcih0eXBlKSkpICU+JQogIHNlbGVjdChjKEV4cGVyaW1lbnQsIFR5cGUsIG4sIHNhbXBsZS5tZWFuLCBjaTk1LmwsIGNpOTUudSwgc2FtcGxlLnNkLCBzZSkpCmdncGxvdChhcmMuMTRjLmluYy5tZWFuRGlmLCBhZXMoVHlwZSwgc2FtcGxlLm1lYW4sIGNvbG9yID0gVHlwZSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBjaTk1LmwsIHltYXggPSBjaTk1LnUpLCB3aWR0aCA9IC4xKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIGNvb3JkX2ZsaXAoKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhFeHBlcmltZW50KSwgCiAgICAgICAgICAgICBsYWJlbGxlciA9IGxhYmVsbGVyKEV4cGVyaW1lbnQgPSBjKCJhcmMiID0gIkV4cGVyaW1lbnQgMSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmV3ZXQiID0gIkV4cGVyaW1lbnQgMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bWUiID0gIkV4cGVyaW1lbnQgMyIpKSkgKwogIHlsYWIoZXhwcmVzc2lvbigiQ29udHJvbCAtIFRyZWF0bWVudCAiKkRlbHRhXjE0KiJDLUNPIlsyXSoiICjigLApIikpICsKICB4bGFiKE5VTEwpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKQoKIyBleHRyYWN0IG1lYW4gZGlmZmVyZW5jZXMgZm9yIG92ZXJhbGwgZGF0YXNldAphcmMuMTRjLmluYy5tZWFuRGlmMiA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KGFyYy5yZXdldC4xNGMuc3RhdHMuaW5jLmxzMiwgZnVuY3Rpb24obWQpIHsKICAgICAgICBkZiA8LSByb3VuZChtZFtucm93KG1kKSwgYygibiIsICJzYW1wbGUubWVhbiIsICJzYW1wbGUuc2QiKV0sIDEpCiAgICAgICAgdCA8LSBxdCguOTc1LCBkZiA9IG1heChkZiRuKSAtIDEpCiAgICAgICAgZGYkc2UgPC0gcm91bmQoZGYkc2FtcGxlLnNkL3NxcnQoZGYkbiksIDEpCiAgICAgICAgZGYkY2k5NS5sIDwtIHJvdW5kKGRmJHNhbXBsZS5tZWFuIC0gZGYkc2UgKiB0LCAxKQogICAgICAgIGRmJGNpOTUudSA8LSByb3VuZChkZiRzYW1wbGUubWVhbiArIGRmJHNlICogdCwgMSkKICAgICAgICByZXR1cm4oZGYpCiAgICB9KSwgLmlkID0gInR5cGUiKSAlPiUKICBtdXRhdGUoVHlwZSA9IHN1YnN0cih0eXBlLCBuY2hhcih0eXBlKSwgbmNoYXIodHlwZSkpKSAlPiUKICBzZWxlY3QoYyhUeXBlLCBuLCBzYW1wbGUubWVhbiwgY2k5NS5sLCBjaTk1LnUsIHNhbXBsZS5zZCwgc2UpKQpgYGAKCmBgYHtyIGRlbHRhLWRlbHRhLXBsb3QsIGluY2x1ZGUgPSBGQUxTRX0KIyBjYWxjdWxhdGUgZGQxNGMKZGQxNGMuc3VtIDwtIGUxMi5kMTQuaW5jCmRkMTRjLnN1bSRhdG0xNGMgPC0gaWZlbHNlKGRkMTRjLnN1bSRZZWFyU2FtcGxlZCA9PSAyMDExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdG1bd2hpY2goRGF0bSREYXRlID09IDIwMTEuNSksICJOSGMxNCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdG1bd2hpY2goRGF0bSREYXRlID09IDIwMTkuNSksICJOSGMxNCJdKQpkZDE0Yy5zdW0kZGQxNGMgPC0gZGQxNGMuc3VtJGQxNGNfY29yciAtIGRkMTRjLnN1bSRhdG0xNGMKZGQxNGMuc3VtIDwtIGRkMTRjLnN1bSAlPiUgCiAgc2VsZWN0KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgZGQxNGMpICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSkgJT4lCiAgYWRkX3RhbGx5KCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoZGQxNGNfc2UgPSBkZDE0Y19zZC9uX21lYW4pCgpkZDE0Yy5zdW0gJT4lCiAgbXV0YXRlKHRyZWF0LmJpID0gaWZlbHNlKFRyZWF0bWVudCAhPSAiY29udHJvbCIsICJ0cmVhdG1lbnQiLCAiY29udHJvbCIpLAogICAgICAgICBkZDE0Y19taW4gPSBkZDE0Y19tZWFuIC0gZGQxNGNfc2UqMiwKICAgICAgICAgZGQxNGNfbWF4ID0gZGQxNGNfbWVhbiArIGRkMTRjX3NlKjIpICU+JQogIGdncGxvdCguLCBhZXModHJlYXQuYmksIGRkMTRjX21lYW4sIGNvbG9yID0gVHlwZSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZGQxNGNfbWluLCAKICAgICAgICB5bWF4ID0gZGQxNGNfbWF4LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjEpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKEV4cGVyaW1lbnQpKSArIAogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKCiMgQ2hhbmdlIGluIHNvaWwgbW9pc3R1cmUgY29udGVudCB3aXRoIG1vaXN0dXJlIGFkanVzdG1lbnQKCmBgYHtyIGRlbHRhLW1vaXN0dXJlLWNhbGN9CiMgY29tcGFyZSB0aGUgY2hhbmdlIGluIG1vaXN0dXJlIHdpdGggY29udHJvbCBzYW1wbGVzIHZlcnN1cyB0cmVhdG1lbnQgc2FtcGxlcwp3aGNGcmVzaCA8LSBtZXJnZShhcmNoaXZlLmN0bC50cy53aWRlW2FyY2hpdmUuY3RsLnRzLndpZGUkRXhwZXJpbWVudCA9PSAiYXJjIiwgYygiSUQiLCAid2hjRnJlc2giKV0sCiAgICAgICAgICAgICAgICAgIGphcmluZm8ucmV3ZXRbamFyaW5mby5yZXdldCRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCBjKCJJRCIsICJ3aGNGcmVzaCIpXSwKICAgICAgICAgICAgICAgICAgYnkgPSAiSUQiLAogICAgICAgICAgICAgICAgICBhbGwueCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgIHN1ZmZpeGVzID0gYygiXzIwMTEiLCAiXzIwMTkiKSkKd2hjRnJlc2gkZGVsdGFXSENfMjAxMSA8LSAuNi13aGNGcmVzaCR3aGNGcmVzaF8yMDExCndoY0ZyZXNoJGRlbHRhV0hDXzIwMTkgPC0gLjYtd2hjRnJlc2gkd2hjRnJlc2hfMjAxOQp3aGNGcmVzaCRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIHdoY0ZyZXNoJElEKSwgIkciLCAiRiIpCgojIHN1bWFtcml6ZQp3aGNGcmVzaF9zdW0gPC0gd2hjRnJlc2ggJT4lCiAgc2VsZWN0KFR5cGUsIGRlbHRhV0hDXzIwMTEsIGRlbHRhV0hDXzIwMTksIHdoY0ZyZXNoXzIwMTEsIHdoY0ZyZXNoXzIwMTkpICU+JQogIGdyb3VwX2J5KFR5cGUpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKGRlbHRhX3NlXzExID0gZGVsdGFXSENfMjAxMV9zZC9uX21lYW4sCiAgICAgICAgIGRlbHRhX3NlXzE5ID0gZGVsdGFXSENfMjAxOV9zZC9uX21lYW4sCiAgICAgICAgIGZyZXNoX3NlXzExID0gd2hjRnJlc2hfMjAxMV9zZC9uX21lYW4sCiAgICAgICAgIGZyZXNoX3NlXzE5ID0gd2hjRnJlc2hfMjAxOV9zZC9uX21lYW4pCgojIHN3aXRjaCB3aGNGcmVzaCB0byBsb25nCndoY0ZyZXNoLjIwMTEgPC0gd2hjRnJlc2hbICwgYygiSUQiLCAid2hjRnJlc2hfMjAxMSIsICJkZWx0YVdIQ18yMDExIildCm5hbWVzKHdoY0ZyZXNoLjIwMTEpIDwtIGMoIklEIiwgIndoY0ZyZXNoIiwgImRlbHRhV0hDIikKd2hjRnJlc2guMjAxMSRFeHBlcmltZW50IDwtICJhcmMiCndoY0ZyZXNoLjIwMTkgPC0gd2hjRnJlc2hbICwgYygiSUQiLCAid2hjRnJlc2hfMjAxOSIsICJkZWx0YVdIQ18yMDE5IildCm5hbWVzKHdoY0ZyZXNoLjIwMTkpIDwtIGMoIklEIiwgIndoY0ZyZXNoIiwgImRlbHRhV0hDIikKd2hjRnJlc2guMjAxOSRFeHBlcmltZW50IDwtICJyZXdldCIKd2hjRnJlc2guMjAxOSA8LSB3aGNGcmVzaC4yMDE5W3doaWNoKGNvbXBsZXRlLmNhc2VzKHdoY0ZyZXNoLjIwMTkpKSwgXQp3aGNGcmVzaC5sb25nIDwtIHJiaW5kKHdoY0ZyZXNoLjIwMTEsIHdoY0ZyZXNoLjIwMTkpCgojIHN0YXRzCndoYy5jdGwudHJ0IDwtIG1lcmdlKGFyYy5yZXdldC4xNGMuY3RsLnRydCwgd2hjRnJlc2gubG9uZywgYnkgPSBjKCJJRCIsICJFeHBlcmltZW50IikpCnNhdmUod2hjLmN0bC50cnQsIGZpbGUgPSAiLi93aGMuY3RsLnRydC5SZGF0YSIpCmdncGxvdCh3aGMuY3RsLnRydCwgYWVzKHdoY0ZyZXNoLCBkMTRjX2RpZiwgY29sb3IgPSBUeXBlLCBzaGFwZSA9IEV4cGVyaW1lbnQpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyBzdW1tYXJ5KGxtKGQxNGNfZGlmIH4gd2hjRnJlc2ggKiBUeXBlLCB3aGMuY3RsLnRydCkpCgojICMgY2FsY3VsYXRlIGF0bSAxNEMgY2hhbmdlCiMgc2xvcGVzIDwtIGRhdGEuZnJhbWUoRGF0bVtEYXRtJERhdGUgPiAyMDAwICYgRGF0bSREYXRlIDwgMjAxNiwgXSwKIyAgICAgICAgICAgICAgICAgICAgICBzbG9wZSA9IE5BKQojIGZvcihpIGluIHNlcV9hbG9uZyhEYXRtW0RhdG0kRGF0ZSA+IDIwMDAgJiBEYXRtJERhdGUgPCAyMDE2LCAiRGF0ZSJdKSkgewojICAgaWYoaSAhPSBucm93KHNsb3BlcykpIHsKIyAgICAgc2xvcGVzJHNsb3BlW2ldIDwtIChEYXRtW0RhdG0kRGF0ZSA+IDIwMDAsICJOSGMxNCJdW2krMV0tRGF0bVtEYXRtJERhdGUgPiAyMDAwLCAiTkhjMTQiXVtpXSkvKERhdG1bRGF0bSREYXRlID4gMjAwMCwgIkRhdGUiXVtpKzFdLURhdG1bRGF0bSREYXRlID4gMjAwMCwgIkRhdGUiXVtpXSkKIyAgIH0KIyB9CiMgbWVhbihzbG9wZXMkc2xvcGUsIG5hLnJtID0gVCkKYGBgCgo+KipTdXBwbGVtZW50YWwgRmlnIGByIHsoc2ZpZy5uICsgNCl9YC4gQ2hhbmdlIGluICRcRGVsdGEkXjE0XkMtQ09+Mn4gKGNvbnRyb2wgLSB0cmVhdG1lbnQpIHJlbGF0aXZlIHRvIGZpZWxkIG1vaXN0dXJlKioKCj4qQ2FwdGlvbjoqIERhdGEgYXJlIGZyb20gRXhwZXJpbWVudCAxICgiYXJjIikgYW5kIEV4cGVyaW1lbnQgMiAoInJld2V0IikuIEFsbCBzYW1wbGVzIHdlcmUgbW9pc3R1cmUtYWRqdXN0ZWQgcHJpb3IgdG8gaW5jdWJhdGlvbiwgYnV0IGNvbnRyb2wgc2FtcGxlcyB3ZXJlIGFkanVzdGVkIGZyb20gZmllbGQgbW9pc3R1cmUsICJ3aGNGcmVzaCIgKHBlcmNlbnQgb2YgV0hDKSwgd2hlcmVhcyB0cmVhdG1lbnQgc2FtcGxlcyB3ZXJlIG1vaXN0dXJlIGFkanVzdGVkIGFmdGVyIGFpci1kcnlpbmcsIGkuZS4gYXQgYXBwcm94aW1hdGVseSAwJSBvZiBXSEMu