Notes

Introduction

The laboratory soil incubation is a commonly used technique for understanding soil carbon dynamics. Soil carbon is a heterogeneous mixture of organic matter, some of which persists in the soil for months or years, while some persists for centuries or millenia. The persistence of soil carbon can be understood through the concept of different “pools” of carbon that are defined by the mechanism by which they persist in the soil and are characterized by distinct age distributions.

Natural abundance radiocarbon provides information about carbon dynamics on the scale of centuries to millenia, while insight into decadal scale dynamics can be gained from tracing the pulse of radiocarbon introduced into the biosphere from nuclear weapons testing (“bomb-C”) in the mid-20th century. The bomb-C pulse peaked in the atmosphere in the 1950s (Fig. 1), but due to differential rates of abiotic incorporation and biological processing, the peak is lagged in time and dampened in soils. The relative enrichment in bomb-C in different pools of soil carbon is a useful tool for inferring the relative rate at which carbon enters and leaves the pool, and for a homogenous pool it is functionally equivalent to the intrinsic decomposition rate.

Extracting and measuring the radiocarbon content of specific soil carbon pools is hampered by spatial and temporal heterogeneity of the mechanisms that lead to soil carbon persistence, such as physical occlusion in aggregates, association with minerals, or thermodynamics. Defining soil carbon pools empirically with techniques such as density, size, or resistance to chemical attack can be useful, but these methods also introduce artifacts and likely result in mixtures of pools with different age distributions. In contrast, although they also introduce artifacts due to disturbance and potential alteration of the microbial community, laboratory soil incubations make use of the same fractionation agent as is found in situ: the microbial community. Measuring the radiocarbon signal of CO2 (Δ14C-CO2) released in laboratory incubations of bulk soils is a powerful tool for understanding the relative processing rate of carbon in soil (or transit time) as it provides an integrated measure of the weighted contribution to the release flux from pools of soil carbon with distinct processing rates.

Interpreting Δ14C-CO2 from laboratory soil incubations requires the use of a model. However, parameterizing these models is challenging, both due to the uncertainty of the persistence mechanisms themselves as well as a lack of observational constraints. Radiocarbon observations at a single point in time are very useful, but due to the curvature of the bomb-C peak there are two points in time with the same atmospheric radiocarbon value, leading to multiple model solutions. Adding additional observations of Δ14C-CO2 at multiple points in time can greatly reduce model uncertainty.

Soil archives have already proven to be a valuable source of data for constraining soil carbon models by providing time series of the change in soil carbon 14C content. The promise of improving models further by obtaining 14C-CO2 measurements from archived soils is tantalizing, but first the possible effects of air-drying and rewetting, as well as the effect of the duration of storage, must be quantified.

We designed an experiment to assess these effects, preliminary results of which are presented in the following report.

Hypotheses and conceptual understanding

If the null hypothesis is disproved, i.e. air-drying and rewetting (air-dry) or air-drying, rewetting, and storage (air-dry + storage) have a significant effect on Δ14C-CO2 relative to control samples, there are two possible outcomes: enrichment of the respiration flux or depletion.

In a simple two-pool soil carbon model, the treatment effect can be conceptualized as a relative change in the contribution of “slower” or “faster” cycling carbon to the respiration flux observed in control samples.

Trajectories of the change in Δ14C over time for “slow” and “fast” soil carbon pools are shown below (Fig. 1) in relationship to the Δ14C of the atmosphere and respired CO2 for a theoretical model system.

Fig 1. Modeled trajectories of Δ14C over time in soil carbon pools (fast, slow, respiration flux) in relationship to observed atmospheric Δ14C

Caption: Modeled curves derived from a conceptual two-pool parallel model system in which inputs are partitioned between faster and more slowly cycling pools without any tranfers between the pools. Carbon stocks and pool sizes are based on density fraction data for the Hainich Forest (Schrumpf et al. 2013); decomposition rates are chosen to be realistic but are arbitrary. Atmospheric Δ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 data is for the northern hemisphere (zone 2).

The simplest two-pool model is a parallel system: one in which carbon entering the soil is partitioned between the two pools without any transfers from one pool to the other. However, even in this simple system, the same treatment effect can result in either enrichment or depletion depending on the year the sample was collected. The direction of change will be dependent on system dynamics, specifically the intrinsic decomposition rates of the slow and fast pools, while in more complicated sytems the amount of mixing between the pools will play a role as well. Potential treatment effects for the same parallel two-pool model system shown in Fig. 1 are shown below at two points in time (Fig. 2).

Fig 2. Potential shifts in Δ14C of respired CO2 in response to air-drying and rewetting, or air-drying and rewetting + storage

Caption: Blue and magenta lines show modeled trajectories of Δ14C in fast and slow cycling soil carbon pools (same model as Fig 1), and Δ14C of respired CO2 is shown in yellow. Solid circles show hypothetical observations of 14C or respired CO2 from control incubations, while the open symbols represent two possible scenarios in which 14C-CO2 shifts due to increased contribution from the fast pool (open circles), or shifts due to increassed contribution from the slow pool (open squares). Due to the crossing of the blue and magenta lines in 2009, increased contribution of the slow pool to respiration following treatment leads to relative depletion of 14C-CO2 in 1991, but relative enrichment of 14C-CO2 in 2019, while the opposite is observed for increased fast pool contribution.

In the above plot (Fig. 2), increased contribution from the slow pool leads to depletion in Δ14C of respiration relative to the control observation in 1991 but relative enrichment in 2019.

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((FMeyearsampled+19508267)1)

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

Experiment 1 (air-dry + storage treatment)

Respiration rates increased dramatically following rewetting for the air-dry + storage treatment in comparison to control samples, similar to what has been observed in other air-dry/rewetting studies [cite]. However, the magnitude and timing of the peak in respiration rates was significantly different between grassland and forest sites [statistics; other forest/grassland studies for comparison?] (Fig. 3).

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 3.8 mg CO2 g soil C-1 d-1 after 92 h, followed by a sharp decline. Mean respiration rates in forest sites peaked at 1.5 mg CO2 g soil C-1 d-1 after 166 h, 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 115 h for grassland and forest soils, respectively.

Experiment 2 (air-dry treatment, 2019 samples)

Respiration rates for the air-dry only treatment samples showed a similarly dramatic increase in comparison to the controls as was observed for the air-dry + storage treatment samples in Experiment 1. However, unlike the air-dry + storage treatment, 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. 3).

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

Caption: Top panel shows data from Experiment 1 (air-dry + storage treatment), bottom panel shows data from Experiment 2 (air-dry only treatment). Solid lines show mean respiration rates for control samples and dotted lines show mean respiration rates for treatment samples. Shaded ribbons show the 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. While daily measurements were made during the pre-incubation period for the majority of samples, only the cumulative pre-incubation flux was measued for the 2011 control samples. Consequently, the respiration rate for the pre-incubation period was calculated cumulatively for all samples.

Supplemental respiration rates figure:

Fig 4. Respiration rates (daily pre-incubation period measurements)

Caption: Daily measurements made for the treatment samples in Experiment 1 and for both control and treatment samples in Experiment 2 show that treatment sample respiration rates peaked more rapidly in grassland soils than in forest soils and was of significantly greater magnitude in both experiments. Control sample data not shown for Experiment 1 as only the four day average rate was measured. [Thinking this plot should go in SI, if we decide to include].

Radiocarbon data

Pre-incubation versus equilibrium respiration 14C-CO2

Despite the significant differences in respiration, and in contrast to hypothesis 1, we did not observe significant differences between 14C-CO2 respired during the pre-incubation period and 14C-CO2 respired during the equilibrium respiration period: neither for the air-dry + storage treatment nor for the air-dry treatment alone (Fig. 5). The interactions with land use was not significant nor was the interaction with experiment, so all data were pooled for statistical analysis.

Fig. 5. Pre-incubation period Δ14C against equilibrium respiration period Δ14C

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 pre-incubation Δ14C was not measured for the Experiment 1 control samples; additionally samples from three of the forest plots of the Experiment 1 treatment samples (air-dry + storage) failed to accumulate enough CO2 during the pre-incubation period to measure 14C. The outlier point with the substantially depleted pre-incubation Δ14C is from Experiment 2 (control).

Note the one outlier (forest, control) for which the pre-incubation CO2 was substantially depleted relative to equilibrium period respiration. However, even when this outlier was included in the statistical analysis the difference between pre-incubation 14C-CO2 and equilibrium 14C-CO2 was not significant. For clarity, this point will be excluded from the future plots. Due to lower respiration rates during pre-incubation, only three of the six forest samples in Experiment 1 generated enough CO2 to measure radiocarbon, and additionally, it was not possible to compare pre-incubation and equilibrium respiration 14C-CO2 for the control samples in Experiment 1 since pre-incubation 14C-CO2 was not measured for these samples in 2011.

Treatment effects on observed equilibrium period 14C-CO2

Relative to the controls the air-dry + storage treatment (Experiment 1, open squares in Fig. 6) led to enrichment in grassland samples, but depletion in forest samples. In contrast, the air-dry only treatment (Experiment 2, open circles, Fig. 6) led to enrichment for both forest and grassland samples (2019 points). Treatment effects on 14C-CO2 were signifcant for both forests and grassland soils in Experiment 1 (2011 points, Fig 6), and significant for grassland samples but not forest samples in Experiment 2 (2019 points, Fig. 6). The mean difference in 14C-CO2 between control and treatment samples was greater in grassland samples than in forest samples for both experiments (stats?).

Δ14C of respired CO2 was enriched relative to the atmosphere for all samples in both experiments. Looking across experiments, the decline in 14C-CO2 between 2011 and 2019 paralleled that of atmospheric 14C for forest control samples and both control and treatment grassland samples, but was much smaller for the forest treatment samples.

Fig 6. Treatment effect on observed Δ14C-CO2 over time (Experiments 1 and 2)

Caption: Filled circles show 14C-CO2 observed for control samples, while open symbols show 14C-CO2 observed for treament samples (open squares = air-dry + storage treatment, Experiment 1; open circles = air-dry only treatment, Experiment 2). Arrows show the direction of change in 14C-CO2 relative to the controls. Points are means and error bars show 2x standard error. The gray line shows Δ14C of the atmosphere.

Effect of cumulative respired carbon on 14CO2

[maybe expand with stats for other explanatory factors? e.g. texture, N content, etc…]

We looked at the possible effect of the amount of carbon respired on the differences between control and treatment 14C-CO2 with a linear regression model and found that the difference in respired carbon (mg CO2-C g soil C^-1) was not a significant predictor. This can also be seen by the relatively flat slope of the lines connecting pairs of points in Fig. 7.

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

Caption:

  • First figure shows data averaged by plot
  • (Note that pre-incubation Δ14C was not measured for the 2011 control samples)
  • Limits exclude outlier point (HEW22 control pre-incubation) for improved legibility

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

  1. Show the effect of storage duration by plotting the difference between control and treatment 14C as a function of storage duration. However, the expected Ctl-Trt difference would also likely have a trend over time. Perhaps plot an expected trend…? Not sure how much this matters.
  • As previously, dashed and dotted lines are plotted to give a sense of error introduced by the treatment by showing a difference of 20‰ and 40‰ (roughly equivalent to the atmospheric decline over five and 10 years respectively for the period 2000 to 2020)
  • Position of points jittered to avoid overplotting; storage duration has been rounded down to the nearest whole year
  • In general, the trend in the differences due to treatment for the highly enriched samples from Oak Ridge, TN suggest losses of the most recently fixed carbon over the duration of storage
    • These samples were included primarily because it was assumed that they would be more sensitive to potential losses of recently fixed carbon, as the label should only be present in this pool of soil C
    • However, in contrast, there does not seem to be evidence for a storage duration effect in the samples that only contain bomb-C

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

Caption:

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

Notes: Show overall effect of treatment on whole data set. * Notes: + Control data shown on x-axis, treatment data shown on y-axis + Solid line is 1:1, dashed line is a 20 ‰ offset, and dotted line is a 40‰ offset (roughly equivalent to the atmospheric decline over five and 10 years respectively for the period 2000 to 2020) + Data from all three experiments conducted in this study are shown, as well as a handful of additional data points for which both control and treatment (i.e. after air-drying + storage) incubations were conducted in another laboratory (Harvard points) + Only A horizon data are shown here, as owing to sample availabilityonly three samples were analyzed for organic and B horizons (respectively) + Points are means of replicates and error bars are min and max of replicates (number of replicates varies from 1 to 3); note that error bars are not visible at this scale for most points * Key messages: + Difference between control and treatment samples is within a 5 year range for the majority of points + Grassland samples tend to be above 1:1 line, forest samples below, regardless of site + The three German forest samples above 1:1 line were analyzed in 2019 (air-dry only treatment, this study), lending support to the interpretation that slow and fast soil C pool curves for northern hemisphere forest samples have only recently crossed or may have yet to cross.

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

Caption:

Discussion

Random notes here…

Effect of C respired

Several studies have shown that the radiocarbon signature of respired CO2 changes over the duration of an incubation in relationship to the amount of carbon respired (Bol et al. 2003; Cusack et al. 2010; Schimel et al. 2011; Mueller et al. 2014). Incubations in this study were controlled so that the amount of the total soil C pool respired as CO2 in treatment incubations was as close as possible to what was respired in control incubations, but as respiration rates were much higher in treatment sample incubations, this was only partially feasible.

While both the air-dry + storage (Experiment 1) and air-dry (Experiment 2) treatments had a significant effect on Δ14C-CO2, these changes were not driven by differences in the amount of carbon respired (Fig 7).

LS0tCnRpdGxlOiAiQXJjaGl2ZWQgU29pbCBJbmN1YmF0aW9ucyBQcm9qZWN0IgphdXRob3I6ICJKLiBCZWVtLU1pbGxlciIKZGF0ZTogIjMwIEFwciAyMDIwIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICAgIGNzczogY3VzdG9tLmNzcwogIHBkZl9kb2N1bWVudDoKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAogICAgY3NzOiBjdXN0b20uY3NzCmhlYWRlcl9pbmNsdWRlczoKICAtIFx1c2VwYWNrYWdlW3V0Zjhde2lucHV0ZW5jfQogIC0gXHVzZXBhY2thZ2V7ZmxvYXR9Ci0tLQpgYGB7ciBnbG9iYWxfb3B0aW9ucywgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICdjZW50ZXInLCBkZXYgPSAnY2Fpcm9fcGRmJykKYGBgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoU29pbFIpCmxpYnJhcnkoY29ycnBsb3QpCmxpYnJhcnkob3Blbnhsc3gpCmxpYnJhcnkoSVNSYUQpCmBgYAojIyBOb3RlcwoqIFRoaXMgd29ya2Jvb2sgaXMgaW50ZW5kZWQgdG8gbG9hZCBhbmQgcHJlcGFyZSB0aGUga2V5IGRhdGEgZm9yIGFuYWx5c2lzIGZvciB0aGUgYXJjaGl2ZSBpbmN1YmF0aW9uIHByb2plY3QuCiogaW4gZ2VuZXJhbCwgdGhpcyBpcyBhbiB1cGRhdGVkIHZlcnNpb24gb2Ygc2NyaXB0ICIuL3NyYy9hcmNfaW5jX21hc3Rlci5SIgoqIGFsbCBjb2RlIGNodW5rIG9wdGlvbnMgYXJlIHNldCB0byAiZWNobyA9IEZBTFNFIjsgc2VlIHJhdyAuUm1kIGZpbGUgZm9yIGRhdGEgd3JhbmdsaW5nIGNvZGUuCgojIEludHJvZHVjdGlvbgpUaGUgbGFib3JhdG9yeSBzb2lsIGluY3ViYXRpb24gaXMgYSBjb21tb25seSB1c2VkIHRlY2huaXF1ZSBmb3IgdW5kZXJzdGFuZGluZyBzb2lsIGNhcmJvbiBkeW5hbWljcy4gU29pbCBjYXJib24gaXMgYSBoZXRlcm9nZW5lb3VzIG1peHR1cmUgb2Ygb3JnYW5pYyBtYXR0ZXIsIHNvbWUgb2Ygd2hpY2ggcGVyc2lzdHMgaW4gdGhlIHNvaWwgZm9yIG1vbnRocyBvciB5ZWFycywgd2hpbGUgc29tZSBwZXJzaXN0cyBmb3IgY2VudHVyaWVzIG9yIG1pbGxlbmlhLiBUaGUgcGVyc2lzdGVuY2Ugb2Ygc29pbCBjYXJib24gY2FuIGJlIHVuZGVyc3Rvb2QgdGhyb3VnaCB0aGUgY29uY2VwdCBvZiBkaWZmZXJlbnQgInBvb2xzIiBvZiBjYXJib24gdGhhdCBhcmUgZGVmaW5lZCBieSB0aGUgbWVjaGFuaXNtIGJ5IHdoaWNoIHRoZXkgcGVyc2lzdCBpbiB0aGUgc29pbCBhbmQgYXJlIGNoYXJhY3Rlcml6ZWQgYnkgZGlzdGluY3QgYWdlIGRpc3RyaWJ1dGlvbnMuIAoKTmF0dXJhbCBhYnVuZGFuY2UgcmFkaW9jYXJib24gcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgY2FyYm9uIGR5bmFtaWNzIG9uIHRoZSBzY2FsZSBvZiBjZW50dXJpZXMgdG8gbWlsbGVuaWEsIHdoaWxlIGluc2lnaHQgaW50byBkZWNhZGFsIHNjYWxlIGR5bmFtaWNzIGNhbiBiZSBnYWluZWQgZnJvbSB0cmFjaW5nIHRoZSBwdWxzZSBvZiByYWRpb2NhcmJvbiBpbnRyb2R1Y2VkIGludG8gdGhlIGJpb3NwaGVyZSBmcm9tIG51Y2xlYXIgd2VhcG9ucyB0ZXN0aW5nICgiYm9tYi1DIikgaW4gdGhlIG1pZC0yMF50aF4gY2VudHVyeS4gVGhlIGJvbWItQyBwdWxzZSBwZWFrZWQgaW4gdGhlIGF0bW9zcGhlcmUgaW4gdGhlIDE5NTBzIChGaWcuIDEpLCBidXQgZHVlIHRvIGRpZmZlcmVudGlhbCByYXRlcyBvZiBhYmlvdGljIGluY29ycG9yYXRpb24gYW5kIGJpb2xvZ2ljYWwgcHJvY2Vzc2luZywgdGhlIHBlYWsgaXMgbGFnZ2VkIGluIHRpbWUgYW5kIGRhbXBlbmVkIGluIHNvaWxzLiBUaGUgcmVsYXRpdmUgZW5yaWNobWVudCBpbiBib21iLUMgaW4gZGlmZmVyZW50IHBvb2xzIG9mIHNvaWwgY2FyYm9uIGlzIGEgdXNlZnVsIHRvb2wgZm9yIGluZmVycmluZyB0aGUgcmVsYXRpdmUgcmF0ZSBhdCB3aGljaCBjYXJib24gZW50ZXJzIGFuZCBsZWF2ZXMgdGhlIHBvb2wsIGFuZCBmb3IgYSBob21vZ2Vub3VzIHBvb2wgaXQgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gdGhlIGludHJpbnNpYyBkZWNvbXBvc2l0aW9uIHJhdGUuCgpFeHRyYWN0aW5nIGFuZCBtZWFzdXJpbmcgdGhlIHJhZGlvY2FyYm9uIGNvbnRlbnQgb2Ygc3BlY2lmaWMgc29pbCBjYXJib24gcG9vbHMgaXMgaGFtcGVyZWQgYnkgc3BhdGlhbCBhbmQgdGVtcG9yYWwgaGV0ZXJvZ2VuZWl0eSBvZiB0aGUgbWVjaGFuaXNtcyB0aGF0IGxlYWQgdG8gc29pbCBjYXJib24gcGVyc2lzdGVuY2UsIHN1Y2ggYXMgcGh5c2ljYWwgb2NjbHVzaW9uIGluIGFnZ3JlZ2F0ZXMsIGFzc29jaWF0aW9uIHdpdGggbWluZXJhbHMsIG9yIHRoZXJtb2R5bmFtaWNzLiBEZWZpbmluZyBzb2lsIGNhcmJvbiBwb29scyBlbXBpcmljYWxseSB3aXRoIHRlY2huaXF1ZXMgc3VjaCBhcyBkZW5zaXR5LCBzaXplLCBvciByZXNpc3RhbmNlIHRvIGNoZW1pY2FsIGF0dGFjayBjYW4gYmUgdXNlZnVsLCBidXQgdGhlc2UgbWV0aG9kcyBhbHNvIGludHJvZHVjZSBhcnRpZmFjdHMgYW5kIGxpa2VseSByZXN1bHQgaW4gbWl4dHVyZXMgb2YgcG9vbHMgd2l0aCBkaWZmZXJlbnQgYWdlIGRpc3RyaWJ1dGlvbnMuIEluIGNvbnRyYXN0LCBhbHRob3VnaCB0aGV5IGFsc28gaW50cm9kdWNlIGFydGlmYWN0cyBkdWUgdG8gZGlzdHVyYmFuY2UgYW5kIHBvdGVudGlhbCBhbHRlcmF0aW9uIG9mIHRoZSBtaWNyb2JpYWwgY29tbXVuaXR5LCBsYWJvcmF0b3J5IHNvaWwgaW5jdWJhdGlvbnMgbWFrZSB1c2Ugb2YgdGhlIHNhbWUgZnJhY3Rpb25hdGlvbiBhZ2VudCBhcyBpcyBmb3VuZCAqaW4gc2l0dSo6IHRoZSBtaWNyb2JpYWwgY29tbXVuaXR5LiBNZWFzdXJpbmcgdGhlIHJhZGlvY2FyYm9uIHNpZ25hbCBvZiBDT34yfiAoJFxEZWx0YSReMTReQy1DT34yfikgcmVsZWFzZWQgaW4gbGFib3JhdG9yeSBpbmN1YmF0aW9ucyBvZiBidWxrIHNvaWxzIGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgcmVsYXRpdmUgcHJvY2Vzc2luZyByYXRlIG9mIGNhcmJvbiBpbiBzb2lsIChvciB0cmFuc2l0IHRpbWUpIGFzIGl0IHByb3ZpZGVzIGFuIGludGVncmF0ZWQgbWVhc3VyZSBvZiB0aGUgd2VpZ2h0ZWQgY29udHJpYnV0aW9uIHRvIHRoZSByZWxlYXNlIGZsdXggZnJvbSBwb29scyBvZiBzb2lsIGNhcmJvbiB3aXRoIGRpc3RpbmN0IHByb2Nlc3NpbmcgcmF0ZXMuIAoKSW50ZXJwcmV0aW5nICRcRGVsdGEkXjE0XkMtQ09+Mn4gZnJvbSBsYWJvcmF0b3J5IHNvaWwgaW5jdWJhdGlvbnMgcmVxdWlyZXMgdGhlIHVzZSBvZiBhIG1vZGVsLiBIb3dldmVyLCBwYXJhbWV0ZXJpemluZyB0aGVzZSBtb2RlbHMgaXMgY2hhbGxlbmdpbmcsIGJvdGggZHVlIHRvIHRoZSB1bmNlcnRhaW50eSBvZiB0aGUgcGVyc2lzdGVuY2UgbWVjaGFuaXNtcyB0aGVtc2VsdmVzIGFzIHdlbGwgYXMgYSBsYWNrIG9mIG9ic2VydmF0aW9uYWwgY29uc3RyYWludHMuIFJhZGlvY2FyYm9uIG9ic2VydmF0aW9ucyBhdCBhIHNpbmdsZSBwb2ludCBpbiB0aW1lIGFyZSB2ZXJ5IHVzZWZ1bCwgYnV0IGR1ZSB0byB0aGUgY3VydmF0dXJlIG9mIHRoZSBib21iLUMgcGVhayB0aGVyZSBhcmUgdHdvIHBvaW50cyBpbiB0aW1lIHdpdGggdGhlIHNhbWUgYXRtb3NwaGVyaWMgcmFkaW9jYXJib24gdmFsdWUsIGxlYWRpbmcgdG8gbXVsdGlwbGUgbW9kZWwgc29sdXRpb25zLiBBZGRpbmcgYWRkaXRpb25hbCBvYnNlcnZhdGlvbnMgb2YgJFxEZWx0YSReMTReQy1DT34yfiBhdCBtdWx0aXBsZSBwb2ludHMgaW4gdGltZSBjYW4gZ3JlYXRseSByZWR1Y2UgbW9kZWwgdW5jZXJ0YWludHkuCgpTb2lsIGFyY2hpdmVzIGhhdmUgYWxyZWFkeSBwcm92ZW4gdG8gYmUgYSB2YWx1YWJsZSBzb3VyY2Ugb2YgZGF0YSBmb3IgY29uc3RyYWluaW5nIHNvaWwgY2FyYm9uIG1vZGVscyBieSBwcm92aWRpbmcgdGltZSBzZXJpZXMgb2YgdGhlIGNoYW5nZSBpbiBzb2lsIGNhcmJvbiBeMTReQyBjb250ZW50LiBUaGUgcHJvbWlzZSBvZiBpbXByb3ZpbmcgbW9kZWxzIGZ1cnRoZXIgYnkgb2J0YWluaW5nIF4xNF5DLUNPfjJ+IG1lYXN1cmVtZW50cyBmcm9tIGFyY2hpdmVkIHNvaWxzIGlzIHRhbnRhbGl6aW5nLCBidXQgZmlyc3QgdGhlIHBvc3NpYmxlIGVmZmVjdHMgb2YgYWlyLWRyeWluZyBhbmQgcmV3ZXR0aW5nLCBhcyB3ZWxsIGFzIHRoZSBlZmZlY3Qgb2YgdGhlIGR1cmF0aW9uIG9mIHN0b3JhZ2UsIG11c3QgYmUgcXVhbnRpZmllZC4KCldlIGRlc2lnbmVkIGFuIGV4cGVyaW1lbnQgdG8gYXNzZXNzIHRoZXNlIGVmZmVjdHMsIHByZWxpbWluYXJ5IHJlc3VsdHMgb2Ygd2hpY2ggYXJlIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHJlcG9ydC4KCiMgSHlwb3RoZXNlcyBhbmQgY29uY2VwdHVhbCB1bmRlcnN0YW5kaW5nCklmIHRoZSBudWxsIGh5cG90aGVzaXMgaXMgZGlzcHJvdmVkLCBpLmUuIGFpci1kcnlpbmcgYW5kIHJld2V0dGluZyAoYWlyLWRyeSkgb3IgYWlyLWRyeWluZywgcmV3ZXR0aW5nLCBhbmQgc3RvcmFnZSAoYWlyLWRyeSArIHN0b3JhZ2UpIGhhdmUgYSBzaWduaWZpY2FudCBlZmZlY3Qgb24gJFxEZWx0YSReMTReQy1DT34yfiByZWxhdGl2ZSB0byBjb250cm9sIHNhbXBsZXMsIHRoZXJlIGFyZSB0d28gcG9zc2libGUgb3V0Y29tZXM6IGVucmljaG1lbnQgb2YgdGhlIHJlc3BpcmF0aW9uIGZsdXggb3IgZGVwbGV0aW9uLiAKCkluIGEgc2ltcGxlIHR3by1wb29sIHNvaWwgY2FyYm9uIG1vZGVsLCB0aGUgdHJlYXRtZW50IGVmZmVjdCBjYW4gYmUgY29uY2VwdHVhbGl6ZWQgYXMgYSByZWxhdGl2ZSBjaGFuZ2UgaW4gdGhlIGNvbnRyaWJ1dGlvbiBvZiAic2xvd2VyIiBvciAiZmFzdGVyIiBjeWNsaW5nIGNhcmJvbiB0byB0aGUgcmVzcGlyYXRpb24gZmx1eCBvYnNlcnZlZCBpbiBjb250cm9sIHNhbXBsZXMuCgpUcmFqZWN0b3JpZXMgb2YgdGhlIGNoYW5nZSBpbiAkXERlbHRhJF4xNF5DIG92ZXIgdGltZSBmb3IgInNsb3ciIGFuZCAiZmFzdCIgc29pbCBjYXJib24gcG9vbHMgYXJlIHNob3duIGJlbG93IChGaWcuIDEpIGluIHJlbGF0aW9uc2hpcCB0byB0aGUgJFxEZWx0YSReMTReQyBvZiB0aGUgYXRtb3NwaGVyZSBhbmQgcmVzcGlyZWQgQ09+Mn4gZm9yIGEgdGhlb3JldGljYWwgbW9kZWwgc3lzdGVtLgoKYGBge3IgY29uY2VwdHVhbC1tb2RlbC1jYWxjcywgaW5jbHVkZSA9IEZBTFNFfQojIGluaXRpYWwgcGFyYW1ldGVyIHNldApEYXRtIDwtIHJiaW5kKGdyYXZlbiwgZnV0dXJlMTRDKQpEYXRtIDwtIERhdG1bRGF0bSREYXRlID4gMTkwMCwgYygiRGF0ZSIsICJOSGMxNCIpXQp5cnMgPC0gRGF0bSREYXRlCgojIGhlbHBlciBmeHMKbGFtYmRhIDwtICgxLzgyNjcpCgprIDwtIGZ1bmN0aW9uKEZtKSB7CiAgKEZtKmxhbWJkYSkvKDEtRm0pCn0KZm0gPC0gZnVuY3Rpb24oayl7CiAgay8oaytsYW1iZGEpCn0KZm1fMTRjIDwtIGZ1bmN0aW9uKGZtLCBkYXRlKSB7CiAgKGZtKmV4cChsYW1iZGEqKDE5NTAgLSBkYXRlKSkgLSAxKSoxMDAwCn0KCiMgZm9yZXN0cwpmLmMgPC0gMzguOTYxMDQgIyBmb3Jlc3QgQyBwb29sLCB0b3RhbCAobWVhbiBIYWluaWNoIGZvcmVzdCBDICA9IDI0IGcga2deLTEpOyBuYiBAIHNzID0gc3VtKC0xKnNvbHZlKEEpJSolYyhmLmluKmYuZ2FtLCBmLmluKigxLWYuZ2FtKSkpCmYuaW4gPC0gMSAjIGlucHV0cyAoMTIuNT1tZWFuIGVxdWlsaWJyaXVtIEMgZmx1eCwgYW5udWFsIGV4dHJhcG9sYXRpb24sIGdDIHlyLTEsIDIwMTEgaW5jdWJhdGlvbiBkYXRhKTsgdHJ5IG11Y2ggbGVzcy4uLgpmLmZyYyA8LSAuMSAjIEMtc3RvY2sgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50IChmcm9tIFNjaHJ1bXBmIDIwMTMsIEhhaW5pY2ggMC01LCBmcmVlIGxpZ2h0KQpmLkNmYXN0IDwtIGYuZnJjKmYuYwpmLkNzbG93IDwtIGYuYy1mLkNmYXN0CmYua2Zhc3QgPC0gMS82ICMgdW5rbm93bgpmLmtzbG93IDwtIDEvMTAwICMgdW5rbm93bgpmLmZhc3QuZm0gPC0gZm0oZi5rZmFzdCkKZi5zbG93LmZtIDwtIGZtKGYua3Nsb3cpCmYuRjBfRGVsdGExNEMgPC0gZm1fMTRjKGMoZi5mYXN0LmZtLCBmLnNsb3cuZm0pLCBkYXRlID0gYygxOTAwLCAxOTAwKSkKZi5nYW0gPC0gKGYuYypmLkNmYXN0KmYua2Zhc3QpLyhmLmMqZi5DZmFzdCpmLmtmYXN0K2YuYypmLkNzbG93KmYua3Nsb3cpICMgaW5wdXQgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50IChwcm9wb3J0aW9uIHRvIGZhc3QgcG9vbCwgZnVuY3Rpb24gb2Yga3MpCiAgCiMgZ3Jhc3NsYW5kcwpnLmMgPC0gNDIgIyBDIHBvb2wsIHRvdGFsIChtZWFuIEhhaW5pY2ggZ3Jhc3NsYW5kIEMgZyBrZ14tMSkKZy5pbiA8LSA2My40ICMgaW5wdXRzIChtZWFuIGVxdWlsaWJyaXVtIEMgZmx1eCwgYW5udWFsIGV4dHJhcG9sYXRpb24sIDIwMTEgaW5jdWJhdGlvbiBkYXRhKQpnLmZyYyA8LSAuMyAjIEMtc3RvY2sgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50IChmcm9tIFNjaHJ1bXBmIDIwMTMsIGF2ZXJhZ2Ugb2YgTGFjcXVldmlsbGUsIEVhc3RlciBCdXNoLCBCdWdhYywgMC01LCBmcmVlIGxpZ2h0KQpnLkNmYXN0IDwtIGcuZnJjKmcuYwpnLkNzbG93IDwtIGcuYy1nLkNmYXN0Cmcua2Zhc3QgPC0gMS8xMCAjIHVua25vd24KZy5rc2xvdyA8LSAxLzEwMCAjIHVua25vd24KZy5mYXN0LmZtIDwtIGZtKGcua2Zhc3QpCmcuc2xvdy5mbSA8LSBmbShnLmtzbG93KQpnLkYwX0RlbHRhMTRDIDwtIGZtXzE0YyhjKGcuZmFzdC5mbSwgZy5zbG93LmZtKSwgZGF0ZSA9IGMoMTkwMCwgMTkwMCkpCmcuZ2FtIDwtIChnLmMqZy5DZmFzdCpnLmtmYXN0KS8oZy5jKmcuQ2Zhc3QqZy5rZmFzdCtnLmMqZy5Dc2xvdypnLmtzbG93KSAjIGlucHV0IHBhcnRpdGlvbmluZyBjb2VmZmljaWVudCAocHJvcG9ydGlvbiB0byBmYXN0IHBvb2wsIGZ1bmN0aW9uIG9mIGtzKQoKIyAycG9vbCBwYXJhbGxlbCBtb2RlbApmLjJwIDwtIFR3b3BQYXJhbGxlbE1vZGVsMTQodCA9IHlycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtzID0gYyhmLmtmYXN0LCBmLmtzbG93KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMwID0gYyhmLkNmYXN0LCBmLkNzbG93KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYwX0RlbHRhMTRDID0gZi5GMF9EZWx0YTE0QywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gZi5pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbSA9IGYuZ2FtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGYyA9IERhdG0pCgpmLjJwLkMxNCA8LSBnZXRGMTQoZi4ycCkKZi4ycC5IUiA8LSBnZXRGMTRSKGYuMnApCmYuMnAuQ3RvdCA8LSBnZXRDKGYuMnApCgojIHNvbHZlIGZvciBzdGVhZHktc3RhdGUgQyBzdG9ja3MKQSA8LSAtMSpkaWFnKGMoZi5rZmFzdCwgZi5rc2xvdykpCnN1bSgtMSpzb2x2ZShBKSUqJWMoZi5pbipmLmdhbSwgZi5pbiooMS1mLmdhbSkpKQoKZi4ycC5DMTQuZGYgPC0gZGF0YS5mcmFtZSgKICB5ZWFycyA9IHJlcChEYXRtJERhdGUsIDQpLAogIGQxNEMgPSBjKGYuMnAuQzE0WywxXSwgZi4ycC5DMTRbLDJdLCBmLjJwLkhSLCBEYXRtJE5IYzE0KSwKICBwb29sID0gcmVwKGMoImZhc3QiLCAic2xvdyIsICJyZXNwaXJhdGlvbiIsICJhdG0iKSwgZWFjaCA9IG5yb3coZi4ycC5DMTQpKQogICkKCiMgIyBQbG90IEMgc3RvY2tzIHRvIGNvbmZpcm0gZmxhdAojIHBsb3QoeXJzLCB4bGltID0gYygxOTAwLDIwMjIpLCB5bGltID0gYygwLDYwKSkKIyBsaW5lcyh5cnMsIGYuMnAuQ3RvdFssIDFdLCBjb2wgPSAyKQojIGxpbmVzKHlycywgZi4ycC5DdG90WywgMl0sIGNvbCA9IDQpCgojIGNhbGN1bGF0ZSByZXNwIGZsdXggcG9pbnRzIGF0IDE5OTEgYW5kIDIwMTkgYW5kIHB1dCBpbiBkYXRhIGZyYW1lCm9icy5wdHMgPC0gZGF0YS5mcmFtZShwb29sID0gcmVwKCJyZXNwaXJhdGlvbiIsIDYpLAogICAgICAgICAgICAgICAgICAgICAgeWVhcnMgPSByZXAoYygxOTkxLDIwMTkpLDMpLAogICAgICAgICAgICAgICAgICAgICAgZDE0YyA9IGMobWVhbihmLjJwLkMxNC5kZltmLjJwLkMxNC5kZiR5ZWFycyA+IDE5OTAgJiBmLjJwLkMxNC5kZiR5ZWFycyA8IDE5OTIgJiBmLjJwLkMxNC5kZiRwb29sID09ICJyZXNwaXJhdGlvbiIsICJkMTRDIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbihmLjJwLkMxNC5kZltmLjJwLkMxNC5kZiR5ZWFycyA+IDIwMTggJiBmLjJwLkMxNC5kZiR5ZWFycyA8IDIwMjAgJiBmLjJwLkMxNC5kZiRwb29sID09ICJyZXNwaXJhdGlvbiIsICJkMTRDIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUwLCA2MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MCwgMzApLAogICAgICAgICAgICAgICAgICAgICAgT2JzZXJ2YXRpb24gPSByZXAoYygiY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNyZWFzZWQgc2xvdyBwb29sIGNvbnRyaWJ1dGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNyZWFzZWQgZmFzdCBwb29sIGNvbnRyaWJ1dGlvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCA9IDIpKQpvYnMucHRzLnIgPC0gb2JzLnB0c1tvYnMucHRzJE9ic2VydmF0aW9uID09ICJjb250cm9sIiwgXQpgYGAKCmBgYHtyIGNvbmNlcHR1YWwtbW9kZWwtZmlnMX0KZ2dwbG90KGYuMnAuQzE0LmRmLCBhZXMoeWVhcnMsIGQxNEMsIGNvbG9yID0gcG9vbCkpICsKICBnZW9tX3BhdGgoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgbmFtZSA9ICJNb2RlbCBwb29sIiwKICAgIHZhbHVlcyA9IGMoImF0bSIgPSA4LAogICAgICAgICAgICAgICAiZmFzdCIgPSAiI0Q4MUI2MCIsIAogICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciLCAKICAgICAgICAgICAgICAgInNsb3ciID0gIiMxRTg4RTUiKSwKICAgIGxhYmVscyA9IGMoImF0bSIgPSAiYXRtb3NwaGVyZSIsCiAgICAgICAgICAgICAgICJmYXN0IiA9ICJmYXN0IiwKICAgICAgICAgICAgICAgInNsb3ciID0gInNsb3ciKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDE5NTAsIDIwMjIpKSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKPioqRmlnIGByIHsoZmlnLm4gPC0gMSl9YC4gTW9kZWxlZCB0cmFqZWN0b3JpZXMgb2YgJFxEZWx0YSReMTReQyBvdmVyIHRpbWUgaW4gc29pbCBjYXJib24gcG9vbHMgKGZhc3QsIHNsb3csIHJlc3BpcmF0aW9uIGZsdXgpIGluIHJlbGF0aW9uc2hpcCB0byBvYnNlcnZlZCBhdG1vc3BoZXJpYyAkXERlbHRhJF4xNF5DKioKCj4qQ2FwdGlvbjoqIE1vZGVsZWQgY3VydmVzIGRlcml2ZWQgZnJvbSBhIGNvbmNlcHR1YWwgdHdvLXBvb2wgcGFyYWxsZWwgbW9kZWwgc3lzdGVtIGluIHdoaWNoIGlucHV0cyBhcmUgcGFydGl0aW9uZWQgYmV0d2VlbiBmYXN0ZXIgYW5kIG1vcmUgc2xvd2x5IGN5Y2xpbmcgcG9vbHMgd2l0aG91dCBhbnkgdHJhbmZlcnMgYmV0d2VlbiB0aGUgcG9vbHMuIENhcmJvbiBzdG9ja3MgYW5kIHBvb2wgc2l6ZXMgYXJlIGJhc2VkIG9uIGRlbnNpdHkgZnJhY3Rpb24gZGF0YSBmb3IgdGhlIEhhaW5pY2ggRm9yZXN0IChTY2hydW1wZiBldCBhbC4gMjAxMyk7IGRlY29tcG9zaXRpb24gcmF0ZXMgYXJlIGNob3NlbiB0byBiZSByZWFsaXN0aWMgYnV0IGFyZSBhcmJpdHJhcnkuIEF0bW9zcGhlcmljICRcRGVsdGEkXjE0XkMgZGF0YSB1cCB0byB0aGUgeWVhciAyMDE1IGFyZSBmcm9tIEdyYXZlbiBldCBhbC4gKDIwMTcpLCB3aGlsZSBkYXRhIHBvaW50cyBiZXlvbmQgMjAxNSB1c2UgdGhlIGV4dHJhcG9sYXRpb24gbWV0aG9kIGZyb20gU2llcnJhICgyMDE4KS4gQWxsIGF0bW9zcGhlcmljIGRhdGEgaXMgZm9yIHRoZSBub3J0aGVybiBoZW1pc3BoZXJlICh6b25lIDIpLgoKVGhlIHNpbXBsZXN0IHR3by1wb29sIG1vZGVsIGlzIGEgcGFyYWxsZWwgc3lzdGVtOiBvbmUgaW4gd2hpY2ggY2FyYm9uIGVudGVyaW5nIHRoZSBzb2lsIGlzIHBhcnRpdGlvbmVkIGJldHdlZW4gdGhlIHR3byBwb29scyB3aXRob3V0IGFueSB0cmFuc2ZlcnMgZnJvbSBvbmUgcG9vbCB0byB0aGUgb3RoZXIuIEhvd2V2ZXIsIGV2ZW4gaW4gdGhpcyBzaW1wbGUgc3lzdGVtLCB0aGUgc2FtZSB0cmVhdG1lbnQgZWZmZWN0IGNhbiByZXN1bHQgaW4gZWl0aGVyIGVucmljaG1lbnQgb3IgZGVwbGV0aW9uIGRlcGVuZGluZyBvbiB0aGUgeWVhciB0aGUgc2FtcGxlIHdhcyBjb2xsZWN0ZWQuIFRoZSBkaXJlY3Rpb24gb2YgY2hhbmdlIHdpbGwgYmUgZGVwZW5kZW50IG9uIHN5c3RlbSBkeW5hbWljcywgc3BlY2lmaWNhbGx5IHRoZSBpbnRyaW5zaWMgZGVjb21wb3NpdGlvbiByYXRlcyBvZiB0aGUgc2xvdyBhbmQgZmFzdCBwb29scywgd2hpbGUgaW4gbW9yZSBjb21wbGljYXRlZCBzeXRlbXMgdGhlIGFtb3VudCBvZiBtaXhpbmcgYmV0d2VlbiB0aGUgcG9vbHMgd2lsbCBwbGF5IGEgcm9sZSBhcyB3ZWxsLiBQb3RlbnRpYWwgdHJlYXRtZW50IGVmZmVjdHMgZm9yIHRoZSBzYW1lIHBhcmFsbGVsIHR3by1wb29sIG1vZGVsIHN5c3RlbSBzaG93biBpbiBGaWcuIDEgYXJlIHNob3duIGJlbG93IGF0IHR3byBwb2ludHMgaW4gdGltZSAoRmlnLiAyKS4KCmBgYHtyIGNvbmNlcHR1YWwtbW9kZWwtZmlnMWJ9CiMgem9vbSAody8gYXRtLCB0byAyMDIyKQpmLjJwLkMxNC5kZiAlPiUgCiAgZmlsdGVyKHllYXJzID4gMTk4NykgJT4lCiAgZmlsdGVyKHBvb2wgIT0gImF0bSIpICU+JQogIGdncGxvdCguLCBhZXMoeWVhcnMsIGQxNEMpKSArCiAgZ2VvbV9wYXRoKGFlcyhjb2xvciA9IHBvb2wpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gb2JzLnB0cywgYWVzKHllYXJzLCBkMTRjLCBzaGFwZSA9IE9ic2VydmF0aW9uKSwgY29sb3IgPSAiI0ZGQzEwNyIsIHN0cm9rZSA9IDEsIHNpemUgPSAzKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgbmFtZSA9ICJNb2RlbCBwb29sIiwKICAgIHZhbHVlcyA9IGMoImF0bSIgPSA4LAogICAgICAgICAgICAgICAiZmFzdCIgPSAiI0Q4MUI2MCIsIAogICAgICAgICAgICAgICAicmVzcGlyYXRpb24iID0gIiNGRkMxMDciLCAKICAgICAgICAgICAgICAgInNsb3ciID0gIiMxRTg4RTUiKSwKICAgIGxhYmVscyA9IGMoImF0bSIgPSAiYXRtb3NwaGVyZSIsCiAgICAgICAgICAgICAgICJmYXN0IiA9ICJmYXN0IiwKICAgICAgICAgICAgICAgInNsb3ciID0gInNsb3ciKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCgKICAgIG5hbWUgPSAiT2JzZXJ2ZWQgcmVzcGlyYXRpb24iLAogICAgdmFsdWVzID0gYygiY29udHJvbCIgPSAxNiwKICAgICAgICAgICAgICAgImluY3JlYXNlZCBzbG93IHBvb2wgY29udHJpYnV0aW9uIiA9IDAsCiAgICAgICAgICAgICAgICJpbmNyZWFzZWQgZmFzdCBwb29sIGNvbnRyaWJ1dGlvbiIgPSAxKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDI2NSkpICsKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoZXhwcmVzc2lvbignJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgo+KipGaWcgYHIgeyhmaWcubiArIDEpfWAuIFBvdGVudGlhbCBzaGlmdHMgaW4gJFxEZWx0YSReMTReQyBvZiByZXNwaXJlZCBDT34yfiBpbiByZXNwb25zZSB0byBhaXItZHJ5aW5nIGFuZCByZXdldHRpbmcsIG9yIGFpci1kcnlpbmcgYW5kIHJld2V0dGluZyArIHN0b3JhZ2UqKgoKPipDYXB0aW9uOiogQmx1ZSBhbmQgbWFnZW50YSBsaW5lcyBzaG93IG1vZGVsZWQgdHJhamVjdG9yaWVzIG9mICRcRGVsdGEkXjE0XkMgaW4gZmFzdCBhbmQgc2xvdyBjeWNsaW5nIHNvaWwgY2FyYm9uIHBvb2xzIChzYW1lIG1vZGVsIGFzIEZpZyAxKSwgYW5kICRcRGVsdGEkXjE0XkMgb2YgcmVzcGlyZWQgQ09+Mn4gaXMgc2hvd24gaW4geWVsbG93LiBTb2xpZCBjaXJjbGVzIHNob3cgaHlwb3RoZXRpY2FsIG9ic2VydmF0aW9ucyBvZiBeMTReQyBvciByZXNwaXJlZCBDT34yfiBmcm9tIGNvbnRyb2wgaW5jdWJhdGlvbnMsIHdoaWxlIHRoZSBvcGVuIHN5bWJvbHMgcmVwcmVzZW50IHR3byBwb3NzaWJsZSBzY2VuYXJpb3MgaW4gd2hpY2ggXjE0XkMtQ09+Mn4gc2hpZnRzIGR1ZSB0byBpbmNyZWFzZWQgY29udHJpYnV0aW9uIGZyb20gdGhlIGZhc3QgcG9vbCAob3BlbiBjaXJjbGVzKSwgb3Igc2hpZnRzIGR1ZSB0byBpbmNyZWFzc2VkIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBzbG93IHBvb2wgKG9wZW4gc3F1YXJlcykuIER1ZSB0byB0aGUgY3Jvc3Npbmcgb2YgdGhlIGJsdWUgYW5kIG1hZ2VudGEgbGluZXMgaW4gMjAwOSwgaW5jcmVhc2VkIGNvbnRyaWJ1dGlvbiBvZiB0aGUgc2xvdyBwb29sIHRvIHJlc3BpcmF0aW9uIGZvbGxvd2luZyB0cmVhdG1lbnQgbGVhZHMgdG8gcmVsYXRpdmUgZGVwbGV0aW9uIG9mIF4xNF5DLUNPfjJ+IGluIDE5OTEsIGJ1dCByZWxhdGl2ZSBlbnJpY2htZW50IG9mIF4xNF5DLUNPfjJ+IGluIDIwMTksIHdoaWxlIHRoZSBvcHBvc2l0ZSBpcyBvYnNlcnZlZCBmb3IgaW5jcmVhc2VkIGZhc3QgcG9vbCBjb250cmlidXRpb24uCgpJbiB0aGUgYWJvdmUgcGxvdCAoRmlnLiAyKSwgaW5jcmVhc2VkIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBzbG93IHBvb2wgbGVhZHMgdG8gZGVwbGV0aW9uIGluICRcRGVsdGEkXjE0XkMgb2YgcmVzcGlyYXRpb24gcmVsYXRpdmUgdG8gdGhlIGNvbnRyb2wgb2JzZXJ2YXRpb24gaW4gMTk5MSBidXQgcmVsYXRpdmUgZW5yaWNobWVudCBpbiAyMDE5LgoKIyBNZXRob2RzIGFuZCBtYXRlcmlhbHMKCipSYWRpb2NhcmJvbiBjb3JyZWN0aW9ucyoKCkFsdGhvdWdoIGRpZmZlcmVuY2VzIHdlcmUgc21hbGwsIHJhZGlvY2FyYm9uIGRhdGEgZm9yIGFyY2hpdmVkIHNhbXBsZXMgd2VyZSBmaXJzdCBjb3JyZWN0ZWQgZm9yIGRlY2F5IHNpbmNlIHRoZSB5ZWFyIG9mIGNvbGxlY3Rpb24gYmVmb3JlIGFzc2Vzc2luZyB0cmVhdG1lbnQgZWZmZWN0cy4KCkRlY2F5IGNvcnJlY3Rpb24gZm9ybXVsYToKJCQxMDAwIFxjZG90IFxsZWZ0KCAoRk0gXGNkb3QgZV57XGZyYWN7LXllYXJfe3NhbXBsZWR9ICsgMTk1MH17ODI2N319KSAtIDEgXHJpZ2h0KSQkCgp3aGVyZSBGTSBpcyB0aGUgZnJhY3Rpb24gbW9kZXJuLCBhbmQgODI2NyBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgcHJvZHVjdCBvZiB0aGUgbmF0dXJhbCBsb2cgb2YgdHdvIGFuZCB0aGUgdHJ1ZSBoYWxmIGxpZmUgb2YgXjE0XkMgKDU3MzAgeSkuCgpgYGB7ciAxNEMgaGVscGVyIGZ4c30KIyA1LiBDcmVhdGUgaGVscGVyIGZ1bmN0aW9ucwojIGRlY2F5IGNvcnJlY3Rpb24gZnVuY3Rpb24gIApkZWNheS5jb3JyLmZ4IDwtIGZ1bmN0aW9uKHllYXJfc2FtcGxlZCwgZnJhY3Rpb25fbW9kZXJuKSB7CiAgaWZlbHNlKGlzLm5hKGZyYWN0aW9uX21vZGVybiksIE5BLCAxMDAwKigoZnJhY3Rpb25fbW9kZXJuKmV4cCgoLXllYXJfc2FtcGxlZCArIDE5NTApLzgyNjcpKS0xKSkKfQoKIyBkMTRDIHRvIGZyYWN0aW9uIG1vZGVybiBmdW5jdGlvbgpkMTRjLmZtLmZ4IDwtIGZ1bmN0aW9uKHllYXJfc2FtcGxlZCwgZDE0YykgewogICgoZDE0YyAvIDEwMDApICsgMSkgLyBleHAoMC4wMDAxMjA5NyAqICgxOTUwIC0geWVhcl9zYW1wbGVkKSkKICB9CgojIGRlZmluZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHN0cmlwcGluZyBvdXQgIk5BIiBhbmQgbm9uLUV4cGxvcmF0b3JpZXMgZGF0YQpleHRyYS5jbGVhbi5meCA8LSBmdW5jdGlvbihkZikgewogIGRmIDwtIGRmW3doaWNoKGdyZXBsKCJIRUciLCBkZiRQcm9iZSkgfAogICAgICAgICAgICAgICAgICAgZ3JlcGwoIkhFVyIsIGRmJFByb2JlKSB8CiAgICAgICAgICAgICAgICAgICBncmVwbCgiU0VHIiwgZGYkUHJvYmUpIHwKICAgICAgICAgICAgICAgICAgIGdyZXBsKCJTRVciLCBkZiRQcm9iZSkpLCBdCiAgaWYobGVuZ3RoKGdyZXAoIkV4cGVyaW1lbnQiLCBuYW1lcyhkZikpKSA+IDApIHsKICAgICBkZiA8LSBkZlt3aGljaChkZiRFeHBlcmltZW50ICE9ICJ0bWUiKSwgXSAKICB9CiAgaXggPC0gd2hpY2goaXMubmEoZGYkRjE0QykgJiBpcy5uYShkZiRg4oiGMTRDLijigLApYCkpCiAgaWYobGVuZ3RoKGl4KSA+IDEpIHsKICAgIGRmIDwtIGRmWy1peCwgXQogIH0KICByZXR1cm4oZGYpCn0KCiMgZXh0cmFjdCBzdG9yYWdlIGR1cmF0aW9uIGRhdGEgc2VwYXJhdGVseQp0bWUuMTRjLmZ4IDwtIGZ1bmN0aW9uKGRmKSB7CiAgZGYkU2FtcGxlTmFtZSA8LSBkZiRQcm9iZQogIGRmJFBlcmlvZCA8LSAiaW5jIgogIGlmKGxlbmd0aChncmVwKCJFeHBlcmltZW50IiwgbmFtZXMoZGYpKSkgPiAwKSB7CiAgICAgZGYgPC0gZGZbd2hpY2goZGYkRXhwZXJpbWVudCA9PSAidG1lIiksIF0gCiAgfQogIHJldHVybihkZikKfQpgYGAKCgpgYGB7ciByZWFkIHdpZGUgdHMgZGF0YX0KIyAxLiBMb2FkIGZsdXggZGF0YSBmcm9tIGFpci1kcnkgKyBzdG9yYWdlIChleHBlcmltZW50IDEpIGFuZCBzdG9yYWdlIGR1cmF0aW9uIChleHBlcmltZW50IDMpIGNvbnRyb2wgc2FtcGxlcywgYW5kIGNvbnZlcnQgZnJvbSAid2lkZSIgdG8gImxvbmciIGZvcm1hdCBzbyBhcyB0byBtYXRjaCBvdGhlciBkYXRhLiAKIyBSZWFkIGFpci1kcnkgKyBzdG9yYWdlIHJlc3BpcmF0aW9uIGNvbnRyb2wgZGF0YQphcmNoaXZlLmN0bC50cy53aWRlIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXN0b3JhZ2UtdDEtZmx1eC9hcmMtaW5jX3hwbHJfYXJjLXN0b3JhZ2UtdDEtZmx1eF8yMDIwLTA0LTI5LmNzdiIpCgojIENvbnZlcnQgdGltZSBkYXRhIGZyb20gd2lkZSB0byBsb25nCmFyY2hpdmUuY3RsLnRzLmQgPC0gc2VsZWN0KGFyY2hpdmUuY3RsLnRzLndpZGUsIHN0YXJ0c193aXRoKCJpbmNfdGltZV9kIikpICU+JQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInRpbWVwb2ludF9jbXR2IiwKICAgICAgICAgICAgICAgbmFtZXNfcHJlZml4ID0gImluY190aW1lX2RfIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInRpbWVfZCIpCiMgc29ydCBieSB0aW1lcG9pbnRfY210dgphcmNoaXZlLmN0bC50cy5kIDwtIGRhdGEuZnJhbWUoYXJjaGl2ZS5jdGwudHMuZFtvcmRlcihhcmNoaXZlLmN0bC50cy5kJHRpbWVwb2ludF9jbXR2KSxdKQoKIyBDb252ZXJ0IG1nQ08yIGRhdGEgZnJvbSB3aWRlIHRvIGxvbmcKYXJjaGl2ZS5jdGwudHMuY28yIDwtIHNlbGVjdChhcmNoaXZlLmN0bC50cy53aWRlLCBzdGFydHNfd2l0aCgiaW5jX21nQ08yX2phcl8iKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidGltZXBvaW50X2NtdHYiLAogICAgICAgICAgICAgICBuYW1lc19wcmVmaXggPSAiaW5jX21nQ08yX2phcl8iLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAibWdDTzJfamFyIikKIyBzb3J0IGJ5IHRpbWVwb2ludF9jbXR2CmFyY2hpdmUuY3RsLnRzLmNvMiA8LSBhcmNoaXZlLmN0bC50cy5jbzJbb3JkZXIoYXJjaGl2ZS5jdGwudHMuY28yJHRpbWVwb2ludF9jbXR2KSxdCgojIGFzc2VtYmxlIGluIGxvbmcgZGF0YWZyYW1lIAphcmNoaXZlLmN0bC50cyA8LSBkYXRhLmZyYW1lKElEID0gcmVwKHVuaXF1ZShhcmNoaXZlLmN0bC50cy53aWRlJElEKSwgNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyaW9kID0gImluYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXBvaW50X2NtdHYgPSByZXAoc2VxKGZyb20gPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gPSA1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCA9IGxlbmd0aChhcmNoaXZlLmN0bC50cy53aWRlJElEKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9kID0gYXJjaGl2ZS5jdGwudHMuZCR0aW1lX2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWdDTzJfamFyID0gYXJjaGl2ZS5jdGwudHMuY28yJG1nQ08yX2phcikKCiMgYWRkIHByZWluY3ViYXRpb24gZGF0YQphcmNoaXZlLmN0bC50cy5wcmUgPC0gYXJjaGl2ZS5jdGwudHMud2lkZVsxOmxlbmd0aCh1bmlxdWUoYXJjaGl2ZS5jdGwudHMud2lkZSRJRCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJJRCIsICJwcmVpbmNfdGltZV9kIiwgInByZWluY19tZ0NPMl9qYXIiKV0KYXJjaGl2ZS5jdGwudHMucHJlIDwtIHJlbmFtZShhcmNoaXZlLmN0bC50cy5wcmUsIHRpbWVfZCA9IHByZWluY190aW1lX2QsIG1nQ08yX2phciA9IHByZWluY19tZ0NPMl9qYXIpCmFyY2hpdmUuY3RsLnRzLnByZSR0aW1lcG9pbnRfY210diA8LSAxCmFyY2hpdmUuY3RsLnRzLnByZSRQZXJpb2QgPC0gInByZSIKYXJjaGl2ZS5jdGwudHMucHJlJHRpbWVfZF9jbXR2IDwtIGFyY2hpdmUuY3RsLnRzLnByZSR0aW1lX2QKICAKIyBDYWxjdWxhdGUgdGltZV9kX2NtdHYKYXJjaGl2ZS5jdGwudHMgPC0gYmluZF9yb3dzKAogIGxhcHBseSgKICAgIHNwbGl0KGFyY2hpdmUuY3RsLnRzLCBhcmNoaXZlLmN0bC50cyR0aW1lcG9pbnRfY210diksCiAgICBmdW5jdGlvbih4KSB7CiAgICAgIHgkdGltZV9kX2NtdHYgPC0geCR0aW1lX2QgKyAKICAgICAgICBhcmNoaXZlLmN0bC50cy5wcmVbbWF0Y2goeCRJRCwgYXJjaGl2ZS5jdGwudHMucHJlJElEKSwgInRpbWVfZCJdCiAgICAgIHJldHVybih4KQogICAgfQogICAgKQogICkKCiMgcmJpbmQgcHJlaW5jIGFuZCBpbmMgZGF0YQphcmNoaXZlLmN0bC50cyA8LSByYmluZChhcmNoaXZlLmN0bC50cy5wcmUsIGFyY2hpdmUuY3RsLnRzKQoKIyBhZGQgU2FtcGxlTmFtZSBjb2x1bW4gYW5kIHJlc3RvcmUgRXhwZXJpbWVudCBjb2x1bW4KYXJjaGl2ZS5jdGwudHMkU2FtcGxlTmFtZSA8LSBhcmNoaXZlLmN0bC50cyRJRAphcmNoaXZlLmN0bC50cyRFeHBlcmltZW50IDwtIGFyY2hpdmUuY3RsLnRzLndpZGVbbWF0Y2goYXJjaGl2ZS5jdGwudHMkSUQsIGFyY2hpdmUuY3RsLnRzLndpZGUkSUQpLCAiRXhwZXJpbWVudCJdCgojIHJlbW92ZSBpbnRlcm1lZGlhdGUgZmlsZXMKcm0oYXJjaGl2ZS5jdGwudHMuZCwgYXJjaGl2ZS5jdGwudHMuY28yLCBhcmNoaXZlLmN0bC50cy5wcmUpCmBgYAoKYGBge3IgcmVhZC1sb25nLXRzLWRhdGF9CiMgMi4gTG9hZCBmbHV4IGRhdGEgZnJvbSBhaXItZHJ5ICsgc3RvcmFnZSBzYW1wbGVzIGFuZCBmcm9tIGFpci1kcnkgZXhwZXJpbWVudCAoY3RsICYgdHJlYXRtZW50KSwgQyAmIE4gZGF0YSBmb3IgYWxsIHRoZSBFeHBsb3JhdG9yaWVzIHNhbXBsZXMgKG1lYXN1cmVkIGluIDIwMTEpLCBhbmQgc29pbCBtYXNzIGFuZCBtb2lzdHVyZSBkYXRhIGZvciBhbGwgZXhwZXJpbWVudHMuCiMgUmVhZCBYcGxyIEMgYW5kIE4gZGF0YQp4cGxyLmNuIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2V4dGVybmFsL2V4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ19zb2lsY25fMjAxMS8xNzA0MDdfQ05fY29uY2VudHJhdGlvbnNfRXhwbG9yYXRvcmllc19FUF9QbG90c18yMDExLmNzdiIpCgojIFJlYWQgWHBsciAxNEMgZGF0YSBmb3IgY29udHJvbCBzYW1wbGVzICgidG1lIiBhbmQgImFyYyIgRXhwZXJpbWVudHMpCnhwbHIuY3RsLmlzbyA8LSByZWFkLnhsc3goIi4uL2RhdGEvZXh0ZXJuYWwvZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy1jbzJfMjAxMS8xNzAyMjhfMTRDX1Jlc3BpcmF0aW9uLnhsc3giKQoKIyBSZWFkIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgaW5mbyBmb3IgYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50IHNhbXBsZXMKamFyaW5mby5hcmMgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtc3RvcmFnZS10Mi1qYXJJbmZvL2phcl9pbmZvcm1hdGlvbi5jc3YiKQoKIyBSZWFkIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgaW5mbyBmb3IgYWlyLWRyeSBkYXRhCmphcmluZm8ucmV3ZXQgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9haXItZHJ5LTIwMTktd2hjL2Fpci1kcnktMjAxOS13aGNfMjAyMC0wNC0yOS5jc3YiKQoKIyBSZWFkIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgaW5mbyBmb3Igc3RvcmFnZSBkdXJhdGlvbiB0cmVhdG1lbnQgc2FtcGxlcwojIHJlbW92ZSB1bml0IHJvdyBhbmQgY29udmVydCB0byBhcHByb3ByaWF0ZSB0eXBlcwpqYXJpbmZvLnRtZSA8LSB0eXBlLmNvbnZlcnQocmVhZC54bHN4KCIuLi9kYXRhL3Jhdy9sYWJfamVuYV9yZXN1bHRzLWNvMl8yMDE4LTA3LTMwL0FyY0luY19JbmNEYXRhXzIwMTgueGxzeCIsIHNoZWV0ID0gMSlbLTEsIF0pCgojIFJlYWQgRHVrZSBpc28gYW5kIGZsdXggZGF0YQp0bWUuY3RsLmR1ayA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtZHVrZS9hcmMtdG1lLWR1a2VfMjAyMC0wNC0yOS5jc3YiKQoKIyBSZWFkIFNpZXJyYSBOZXZhZGEgKEp1bidzKSBzb2lsIGRhdGEKdG1lLmN0bC5zb2lsLnNyYSA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtc2llcnJhL2FyYy10bWUtc2llcnJhLXNvaWxfMjAyMC0wNC0yOS5jc3YiKQoKIyBSZWFkIE9hayBSaWRnZSBDIGRhdGEKdG1lLmN0bC5vcm5sIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS1vcm5sL2FyYy10bWUtb3JubF8yMDIwLTA0LTMwLmNzdiIpCgojIFJlYWQgYWlyLWRyeSArIHN0b3JhZ2UgcmVzcGlyYXRpb24gZGF0YQphcmNoaXZlLmFyYy50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy1zdG9yYWdlLXQyLWZsdXgvYXJjaGl2ZS1mbHV4LXQyXzIwMjAtMDQtMjQuY3N2IikKCiMgUmVhZCBjb250cm9sIHJlc3BpcmF0aW9uIGRhdGEgZnJvbSAyMDE5IGFpci1kcnkgZXhwZXJpbWVudApyZXdldC5jdGwudHMgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9mcmVzaC0yMDE5LWZsdXgvZnJlc2gtMjAxOS1mbHV4XzIwMjAtMDQtMjQuY3N2IikKCiMgUmVhZCB0cmVhdG1lbnQgcmVzcGlyYXRpb24gZGF0YSBmcm9tIDIwMTkgYWlyLWRyeSBleHBlcmltZW50CnJld2V0LmRyeS50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2RyaWVkLTIwMTktZmx1eC9kcmllZC0yMDE5LWZsdXhfMjAyMC0wNC0yNC5jc3YiKQoKIyBSZWFkIFNpZXJyYSBOZXZhZGEgKEp1bidzKSBmbHV4IGRhdGEKdG1lLmN0bC5mbHguc3JhIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS1zaWVycmEvYXJjLXRtZS1zaWVycmEtZmx1eF8yMDIwLTA0LTI5LmNzdiIpCgojIFJlYWQgc3RvcmFnZSBkdXJhdGlvbiByZXNwaXJhdGlvbiBkYXRhCnRtZS50cnQudHMgPC0gcmJpbmQocmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtdG1lLXQyLWZsdXgvYXJjLXRtZS10Mi1mbHV4LTFfMjAyMC0wNC0yNy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICAgICAgICByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtdDItZmx1eC9hcmMtdG1lLXQyLWZsdXgtMl8yMDIwLTA0LTI3LmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkpCgojIFJlYWQgbWlzY2VsbGFuZW91cyBzdG9yYWdlIHRyZWF0bWVudCBkYXRhCnRtZS5taXNjIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS1taXNjL2FyYy10bWUtbWlzYy1pc29fMjAyMC0wNC0yOS5jc3YiKQpgYGAKCmBgYHtyIHN1bW1hcml6ZSBkYXRhLCBpbmNsdWRlID0gRkFMU0V9CiMgMy4gQ29tYmluZSBhbmQgc3VtbWFyaXplIGRhdGEgaW4gbG9uZyBmb3JtYXQgdG8gY2FsY3VsYXRlIHJlc3BpcmF0aW9uIHJhdGVzIGFuZCBwbG90IG92ZXIgdGltZQojIE5COiBzZXQgImluY2x1ZGUiIHRvIGZhbHNlIHRvIHN1cHByZXNzIGJpbmRfcm93cyB3YXJuaW5nIGFib3V0IGNvZXJjaW5nIGZhY3RvciB0byBjaGFyCiMgcmVtb3ZlIGZvcm11bGFfY2hlY2sgY29sdW1ucwppbnZpc2libGUobGlzdDJlbnYobGFwcGx5KGxpc3QoYXJjaGl2ZS5hcmMudHMgPSBhcmNoaXZlLmFyYy50cywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXdldC5jdGwudHMgPSByZXdldC5jdGwudHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3ZXQuZHJ5LnRzID0gcmV3ZXQuZHJ5LnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLnRydC50cyA9IHRtZS50cnQudHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgkZm9ybXVsYV9jaGVjayA8LSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgZW52aXIgPSAuR2xvYmFsRW52KQogICAgICAgICAgKQoKIyBBZGQgVHJlYXRtZW50IGNvbHVtbnMgdG8gZWFjaCBkYXRhc2V0CmFyY2hpdmUuYXJjLnRzJFRyZWF0bWVudCA8LSAiYWlyLWRyeSArIHN0b3JhZ2UiCmFyY2hpdmUuY3RsLnRzJFRyZWF0bWVudCA8LSAiY29udHJvbCIKdG1lLnRydC50cyRUcmVhdG1lbnQgPC0gInN0b3JhZ2UgZHVyYXRpb24iCnJld2V0LmN0bC50cyRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCnJld2V0LmRyeS50cyRUcmVhdG1lbnQgPC0gImFpci1kcnkiCgojIGNvbWJpbmUgcmV3ZXQgZGF0YQpyZXdldC50cyA8LSByYmluZChyZXdldC5jdGwudHMsIHJld2V0LmRyeS50cykKcmV3ZXQudHMkRXhwZXJpbWVudCA8LSAicmV3ZXQiCgojIGFkZCBzb2lsIGRyeSB3dCBkYXRhCmFyY2hpdmUuYXJjLnRzJGR3X2cgPC0gamFyaW5mby5hcmNbbWF0Y2goYXJjaGl2ZS5hcmMudHMkU2FtcGxlTmFtZSwgamFyaW5mby5hcmMkU2FtcGxlKSwgIlNvaWwuZHJ5LndlaWdodF8uZy4iXQphcmNoaXZlLmN0bC50cyRkd19nIDwtIGFyY2hpdmUuY3RsLnRzLndpZGVbbWF0Y2goYXJjaGl2ZS5jdGwudHMkSUQsIGFyY2hpdmUuY3RsLnRzLndpZGUkSUQpLCAiZHJ5X3NvaWxfd3RfY29ycmVjdGVkX2ciXQpyZXdldC50cyA8LSBtZXJnZShyZXdldC50cywgamFyaW5mby5yZXdldFsgLCBjKCJJRCIsICJUcmVhdG1lbnQiLCAiZHdfZyIpXSwgYnkgPSBjKCJJRCIsICJUcmVhdG1lbnQiKSkKdG1lLnRydC50cyA8LSBtZXJnZSh0bWUudHJ0LnRzLCBqYXJpbmZvLnRtZVsgLCBjKCJOci4iLCAiZHJ5LnNvaWwiKV0sIGJ5LnggPSAiU2FtcGxlTmFtZSIsIGJ5LnkgPSAiTnIuIikKY29sbmFtZXModG1lLnRydC50cylbd2hpY2gobmFtZXModG1lLnRydC50cykgPT0gImRyeS5zb2lsIildIDwtICJkd19nIgoKIyBhZGQgZXhwZXJpbWVudCBjb2wgdG8gYXJjaGl2ZS5hcmMudHMsIHN0b3JhZ2UudHJ0LnRzCmFyY2hpdmUuYXJjLnRzJEV4cGVyaW1lbnQgPC0gImFyYyIKdG1lLnRydC50cyRFeHBlcmltZW50IDwtICJ0bWUiCgojIGNvbWJpbmUgYXJjaGl2ZSBkYXRhIGFuZCBFeHBsb3JhdG9yaWVzIHN0b3JhZ2UgZHVyYXRpb24gZGF0YQphcmNoaXZlLnRzIDwtIHJiaW5kKGFyY2hpdmUuY3RsLnRzW3doaWNoKGFyY2hpdmUuY3RsLnRzJFRyZWF0bWVudCAhPSAic3RvcmFnZSBkdXJhdGlvbiIpLCBdLCAKICAgICAgICAgICAgICAgICAgICBhcmNoaXZlLmFyYy50c1sgLCBuYW1lcyhhcmNoaXZlLmN0bC50cyldKQp0bWUudHMgPC0gcmJpbmQoYXJjaGl2ZS5jdGwudHNbd2hpY2goYXJjaGl2ZS5jdGwudHMkVHJlYXRtZW50ID09ICJzdG9yYWdlIGR1cmF0aW9uIiksIF0sCiAgICAgICAgICAgICAgICB0bWUudHJ0LnRzWyAsIG5hbWVzKGFyY2hpdmUuY3RsLnRzKV0pCgojIGJpbmQgdG1lLmN0bC5mbHguc3JhIGRhdGEgdG8gdG1lLnRzCiMgYWxsIG90aGVyIHRtZS5mbHggZGF0YSBpcyBhbHJlYWR5IHN1bW1hcml6ZWQKdG1lLmN0bC5mbHguc3JhJEV4cGVyaW1lbnQgPC0gInRtZSIKdG1lLmN0bC5mbHguc3JhJFRyZWF0bWVudCA8LSAiY29udHJvbCIKdG1lLmN0bC5mbHguc3JhJGR3X2cgPC0gdG1lLmN0bC5zb2lsLnNyYVttYXRjaCh0bWUuY3RsLmZseC5zcmEkSmFyX0lELCB0bWUuY3RsLnNvaWwuc3JhJEphcl9JRCksICJkd19nIl0KdG1lLnRzIDwtIHJiaW5kKHRtZS50cywgdG1lLmN0bC5mbHguc3JhWyAsIG5hbWVzKHRtZS50cyldKQoKIyBUZXN0IHRoYXQgcmVxdWlyZWQgbmFtZXMgYXJlIHByZXNlbnQKbm1zIDwtIGMoIlNhbXBsZU5hbWUiLCAiSUQiLCAiRXhwZXJpbWVudCIsICJUcmVhdG1lbnQiLCAiUGVyaW9kIiwgInRpbWVwb2ludF9jbXR2IiwgICJ0aW1lX2QiLCAidGltZV9kX2NtdHYiLCAibWdDTzJfamFyIiwgImR3X2ciKQppbnZpc2libGUobGFwcGx5KGxpc3QoYXJjaGl2ZS50cyA9IGFyY2hpdmUudHMsCiAgICAgICAgICAgICAgICAgICAgICByZXdldC50cyA9IHJld2V0LnRzLAogICAgICAgICAgICAgICAgICAgICAgdG1lLnRzKSwKICAgICAgIGZ1bmN0aW9uKHgpIHsKICAgICAgICAgaWZlbHNlKCFpcy5uYShtYXRjaChubXMsIG5hbWVzKHgpKSksICJ5ZXMiLCAibm8iKQogICAgICAgfQogICAgICAgKSkKCiMgY29tYmluZSBhbGwgZGF0YSBhbmQgcmVtb3ZlIHRpbWUgcG9pbnRzIHdpdGhvdXQgQ08yIG1lYXN1cmVtZW50cwp0cyA8LSBiaW5kX3Jvd3MoYXJjaGl2ZS50c1sgLCBubXNdLCByZXdldC50c1sgLCBubXNdLCB0bWUudHNbICwgbm1zXSkKaWYobGVuZ3RoKHdoaWNoKGlzLm5hKHRzJG1nQ08yX2phcikpKSA+IDApIHsKICB0cyA8LSB0c1std2hpY2goaXMubmEodHMkbWdDTzJfamFyKSksIF0KfQoKIyBhZGQgQyBjb250ZW50CiMgeHBscgp0cyRnQ19nUyA8LSB4cGxyLmNuW21hdGNoKHRzJElELCB4cGxyLmNuJEVQX1Bsb3RpZCksICJUb3RhbF9DIl0qMTBeLTMKIyBkdWtlCnRzW3doaWNoKGlzLm5hKHRzJGdDX2dTKSksICJnQ19nUyJdIDwtIHRtZS5jdGwuZHVrW21hdGNoKHRzW3doaWNoKGlzLm5hKHRzJGdDX2dTKSksICJJRCJdLCB0bWUuY3RsLmR1ayRJRCksICJDX2dfa2ciXSoxMF4tMwojIHNpZXJyYXMKdHNbd2hpY2goaXMubmEodHMkZ0NfZ1MpKSwgImdDX2dTIl0gPC0gdG1lLmN0bC5zb2lsLnNyYVttYXRjaCh0c1t3aGljaChpcy5uYSh0cyRnQ19nUykpLCAiSUQiXSwgdG1lLmN0bC5zb2lsLnNyYSRJRCksICJnQ19rZ1MiXSoxMF4tMwojIG9hayByaWRnZQp0c1t3aGljaChpcy5uYSh0cyRnQ19nUykpLCAiZ0NfZ1MiXSA8LSB0bWUuY3RsLm9ybmxbbWF0Y2godHNbd2hpY2goaXMubmEodHMkZ0NfZ1MpKSwgIklEIl0sIHRtZS5jdGwub3JubCRJRCksICJDX2dfa2ciXSoxMF4tMwoKIyBhZGQgVHlwZQp0cyRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIHRzJElEKSwgIkciLCAiRiIpCgojIGNhbGN1bGF0ZSBDTzIgcmVzcGlyYXRpb24gaW4gbWdDTzItQyBwZXIgZyBzb2lsIEMKIyBOQjogMTIvNDQgPSBtYXNzIHJhdGlvIG9mIEMgaW4gQ08yCnRzJG1nQ08yLkNfZ0MgPC0gKHRzJG1nQ08yX2phciooMTIvNDQpKS8odHMkZHdfZyp0cyRnQ19nUykKdHMkbWdDTzIuQ19nQ19kIDwtIHRzJG1nQ08yLkNfZ0MvdHMkdGltZV9kCgojIHN1bW1hcml6ZSBDTzIgcmVsZWFzZSBkYXRhIGZvciBlYWNoIHRpbWVwb2ludCwgYnkgZXhwZXJpbWVudCwgdHJlYXRtZW50LCBhbmQgdHlwZQp0cy5hdmcgPC0gZGF0YS5mcmFtZShuYS5vbWl0KHRzKSAlPiUKICBzZWxlY3QoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlLCB0aW1lcG9pbnRfY210diwgbWdDTzIuQ19nQ19kLCB0aW1lX2RfY210dikgICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKHNlX3Nsb3BlID0gbWdDTzIuQ19nQ19kX3NkL3NxcnQobl9tZWFuKSwKICAgICAgICAgc2Vfc2xvcGVfbCA9IG1nQ08yLkNfZ0NfZF9tZWFuIC0gc2Vfc2xvcGUsCiAgICAgICAgIHNlX3Nsb3BlX3UgPSBtZ0NPMi5DX2dDX2RfbWVhbiArIHNlX3Nsb3BlKSkKCiMgYWRkIHRpbWVwb2ludCB6ZXJvIGRhdGEKdHAwLmYgPC0gZnVuY3Rpb24oZGYpIHsKICB0cDAgPC0gZGZbMSwgXQogIHRwMFsgLCAtd2hpY2gobmFtZXModHAwKSA9PSAiRXhwZXJpbWVudCIgfCBuYW1lcyh0cDApID09ICJUcmVhdG1lbnQiIHwgbmFtZXModHAwKSA9PSAiVHlwZSIgfCBuYW1lcyh0cDApID09ICJuIildIDwtIDAKICByYmluZCh0cDAsIGRmKQp9CnRzLmF2ZyR0cmVhdC5FeHAgPC0gcGFzdGUodHMuYXZnJFRyZWF0bWVudCwgdHMuYXZnJEV4cGVyaW1lbnQpCnRzLmF2ZyA8LSBsYXBwbHkoc3BsaXQodHMuYXZnLCB0cy5hdmckdHJlYXQuRXhwKSwgZnVuY3Rpb24oeCkgewogIGxhcHBseShzcGxpdCh4LCB4JFR5cGUpLCB0cDAuZikKICB9KQp0cy5hdmcgPC0gYmluZF9yb3dzKGxhcHBseSh0cy5hdmcsIGJpbmRfcm93cykpCgojIHJlc3RvcmUgY2xhc3Nlcwp0cy5hdmcgPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkodHMuYXZnLCB0eXBlLmNvbnZlcnQpKQpgYGAKCiMgUmVzdWx0cwojIyBSZXNwaXJhdGlvbiByYXRlcwoKKkV4cGVyaW1lbnQgMSAoYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50KSoKClJlc3BpcmF0aW9uIHJhdGVzIGluY3JlYXNlZCBkcmFtYXRpY2FsbHkgZm9sbG93aW5nIHJld2V0dGluZyBmb3IgdGhlIGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCBpbiBjb21wYXJpc29uIHRvIGNvbnRyb2wgc2FtcGxlcywgc2ltaWxhciB0byB3aGF0IGhhcyBiZWVuIG9ic2VydmVkIGluIG90aGVyIGFpci1kcnkvcmV3ZXR0aW5nIHN0dWRpZXMgW2NpdGVdLiBIb3dldmVyLCB0aGUgbWFnbml0dWRlIGFuZCB0aW1pbmcgb2YgdGhlIHBlYWsgaW4gcmVzcGlyYXRpb24gcmF0ZXMgd2FzIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGJldHdlZW4gZ3Jhc3NsYW5kIGFuZCBmb3Jlc3Qgc2l0ZXMgW3N0YXRpc3RpY3M7IG90aGVyIGZvcmVzdC9ncmFzc2xhbmQgc3R1ZGllcyBmb3IgY29tcGFyaXNvbj9dICoqKEZpZy4gMykqKi4KCkFtb25nIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSBzYW1wbGVzLCByZXNwaXJhdGlvbiByYXRlcyB3ZXJlIG1vcmUgdGhhbiB0d2ljZSBhcyBoaWdoIGluIGdyYXNzbGFuZCBzb2lscyB0aGFuIGluIGZvcmVzdCBzb2lscywgcmVhY2hpbmcgYSBtYXhpbXVtIG9mIGByIHtyb3VuZChtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiICYgdHMuYXZnMiRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeIGFmdGVyIGByIHtyb3VuZCh0cy5hdmcyW3doaWNoKHRzLmF2ZzIkbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRyIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSksICJ0aW1lX2RfY210dl9tZWFuIl0qMjQsMCl9YCBoLCBmb2xsb3dlZCBieSBhIHNoYXJwIGRlY2xpbmUuIE1lYW4gcmVzcGlyYXRpb24gcmF0ZXMgaW4gZm9yZXN0IHNpdGVzIHBlYWtlZCBhdCBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRiIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIG1nIENPfjJ+IGcgc29pbCBDXi0xXiBkXi0xXiBhZnRlciBgciB7cm91bmQodHMuYXZnMlt3aGljaCh0cy5hdmcyJG1nQ08yLkNfZ0NfZF9tZWFuID09IG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaCwgZm9sbG93ZWQgYnkgYSBtdWNoIG1vcmUgZ3JhZHVhbCBkZWNsaW5lIHRoYW4gaW4gZ3Jhc3NsYW5kIHNpdGVzLiBDb250cm9sIHNhbXBsZXMgcmVzcG9uZGVkIG1vcmUgd2Vha2x5IGFuZCBtb3JlIGdyYWR1YWxseSB0byByZXdldHRpbmcsIGFsdGhvdWdoIGFzIGluIHRoZSB0cmVhdG1lbnQgc2FtcGxlcyByZXNwaXJhdGlvbiB3YXMgZ3JlYXRlciBpbiBncmFzc2xhbmQgc29pbHMgdGhhbiBpbiBmb3Jlc3Qgc29pbHMuIFBlYWsgcmVzcGlyYXRpb24gcmF0ZXMgZm9yIGNvbnRyb2wgaW5jdWJhdGlvbnMgd2VyZSBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgdHMuYXZnMiRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgYW5kIGByIHtyb3VuZChtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4gYWZ0ZXIgYHIge3JvdW5kKHRzLmF2ZzJbd2hpY2godHMuYXZnMiRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaCBmb3IgZ3Jhc3NsYW5kIGFuZCBmb3Jlc3Qgc29pbHMsIHJlc3BlY3RpdmVseS4KCipFeHBlcmltZW50IDIgKGFpci1kcnkgdHJlYXRtZW50LCAyMDE5IHNhbXBsZXMpKgoKUmVzcGlyYXRpb24gcmF0ZXMgZm9yIHRoZSBhaXItZHJ5IG9ubHkgdHJlYXRtZW50IHNhbXBsZXMgc2hvd2VkIGEgc2ltaWxhcmx5IGRyYW1hdGljIGluY3JlYXNlIGluIGNvbXBhcmlzb24gdG8gdGhlIGNvbnRyb2xzIGFzIHdhcyBvYnNlcnZlZCBmb3IgdGhlIGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCBzYW1wbGVzIGluIEV4cGVyaW1lbnQgMS4gSG93ZXZlciwgdW5saWtlIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQsIHBlYWsgcmVzcGlyYXRpb24gcmF0ZXMgd2VyZSBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgKHAgPiAwLjA1KSBiZXR3ZWVuIGZvcmVzdCBhbmQgZ3Jhc3NsYW5kIHNvaWxzIGluIEV4cGVyaW1lbnQgMiwgcGVha2luZyBhdCBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cy5hdmcyJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YC4wIGFuZCBgciB7cm91bmQobWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4gYWZ0ZXIgYHIge3JvdW5kKHRzLmF2ZzJbd2hpY2godHMuYXZnMiRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIHRzLmF2ZzIkVHlwZSA9PSAiRiIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSksICJ0aW1lX2RfY210dl9tZWFuIl0qMjQsMCl9YCBoIGZvciBncmFzc2xhbmQgYW5kIGZvcmVzdCBzb2lscywgcmVzcGVjdGl2ZWx5ICoqKEZpZy4gMykqKi4KCmBgYHtyIENPMi1mbHV4LXBsb3RzfQojIFBsb3QgcmVzcCByYXRlcyBvdmVyIHRpbWUKdHMucHJlIDwtIHRzW3RzJFBlcmlvZCA9PSAicHJlIiwgXQp0cy5wcmUuYXZnIDwtIHRzLnByZSAlPiUKICBmaWx0ZXIodGltZV9kX2NtdHYgPiAzLjUpICU+JQogIHNlbGVjdChFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIHRpbWVwb2ludF9jbXR2LCBTYW1wbGVOYW1lLCBtZ0NPMi5DX2dDLCB0aW1lX2RfY210dikgICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYsIFNhbXBsZU5hbWUpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKG1nQ08yLkNfZ0NfZCA9IG1nQ08yLkNfZ0NfbWVhbi90aW1lX2RfY210dl9tZWFuKSAlPiUKICBzZWxlY3QoLVNhbXBsZU5hbWUsIC1tZ0NPMi5DX2dDX21lYW4sIEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgbWdDTzIuQ19nQ19kLCB0aW1lX2RfY210dl9tZWFuKSAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKHNlX3Nsb3BlID0gbWdDTzIuQ19nQ19kX3NkL3NxcnQobl9tZWFuKSwKICAgICAgICAgc2Vfc2xvcGVfbCA9IG1nQ08yLkNfZ0NfZF9tZWFuIC0gc2Vfc2xvcGUsCiAgICAgICAgIHNlX3Nsb3BlX3UgPSBtZ0NPMi5DX2dDX2RfbWVhbiArIHNlX3Nsb3BlKQoKdHMuaW5jLmF2ZyA8LSB0cyAlPiUKICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKICBzZWxlY3QoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlLCB0aW1lcG9pbnRfY210diwgbWdDTzIuQ19nQ19kLCB0aW1lX2RfY210dikgICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKHNlX3Nsb3BlID0gbWdDTzIuQ19nQ19kX3NkL3NxcnQobl9tZWFuKSwKICAgICAgICAgc2Vfc2xvcGVfbCA9IG1nQ08yLkNfZ0NfZF9tZWFuIC0gc2Vfc2xvcGUsCiAgICAgICAgIHNlX3Nsb3BlX3UgPSBtZ0NPMi5DX2dDX2RfbWVhbiArIHNlX3Nsb3BlKQoKY29sbmFtZXModHMucHJlLmF2Zylbd2hpY2gobmFtZXModHMucHJlLmF2ZykgJWluJSBjKCJ0aW1lcG9pbnRfY210dl9tZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAidGltZV9kX2NtdHZfbWVhbl9tZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAidGltZV9kX2NtdHZfbWVhbl9zZCIpKV0gPC0gYygidGltZXBvaW50X2NtdHYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVfZF9jbXR2X21lYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVfZF9jbXR2X3NkIikKCnRzLnByZS5hdmcgPC0gdHMucHJlLmF2Z1sgLCAtd2hpY2goIW5hbWVzKHRzLnByZS5hdmcpICVpbiUgbmFtZXModHMuaW5jLmF2ZykpXQoKdHMuYXZnMiA8LSBkYXRhLmZyYW1lKHJiaW5kKHRzLnByZS5hdmcsIHRzLmluYy5hdmcpKQp0cy5hdmcyIDwtIHRzLmF2ZzJbY29tcGxldGUuY2FzZXModHMuYXZnMiksIF0KCiMgYWRkIHRpbWVwb2ludCB6ZXJvIGRhdGEKdHMuYXZnMiR0cmVhdC5FeHAgPC0gcGFzdGUodHMuYXZnMiRUcmVhdG1lbnQsIHRzLmF2ZzIkRXhwZXJpbWVudCkKdHMuYXZnMiA8LSBsYXBwbHkoc3BsaXQodHMuYXZnMiwgdHMuYXZnMiR0cmVhdC5FeHApLCBmdW5jdGlvbih4KSB7CiAgbGFwcGx5KHNwbGl0KHgsIHgkVHlwZSksIHRwMC5mKQogIH0pCnRzLmF2ZzIgPC0gYmluZF9yb3dzKGxhcHBseSh0cy5hdmcyLCBiaW5kX3Jvd3MpKQoKIyByZXN0b3JlIGNsYXNzZXMKdHMuYXZnMiA8LSBhcy5kYXRhLmZyYW1lKGxhcHBseSh0cy5hdmcyLCB0eXBlLmNvbnZlcnQpKQoKdHMuYXZnMiAlPiUgCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIpICU+JQogIGdncGxvdCguLCBhZXModGltZV9kX2NtdHZfbWVhbiwgbWdDTzIuQ19nQ19kX21lYW4pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNCwgY29sb3I9ImdyYXkiKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBzZV9zbG9wZV9sLCB5bWF4ID0gc2Vfc2xvcGVfdSwgZmlsbCA9IFR5cGUsIGxpbmV0eXBlID0gVHJlYXRtZW50LCBhbHBoYSA9IFRyZWF0bWVudCkpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gVHlwZSwgbGluZXR5cGUgPSBUcmVhdG1lbnQpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhFeHBlcmltZW50KSwKICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoRXhwZXJpbWVudCA9IGMoImFyYyIgPSAiMjAxMSIsICJyZXdldCIgPSAiMjAxOSIpKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTgpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnTGFuZHVzZScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAnU3RkLiBFcnIuJywKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9IC4yLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAuNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAuMikpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAnZGFzaGVkJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0nc29saWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9ICJkYXNoZWQiKSkgKwogIHlsYWIoZXhwcmVzc2lvbignUmVzcGlyYXRpb24gUmF0ZSAobWdDTydbMl0qJy1DIGdDJ14tMSonZCdeLTEqJyknKSkgKwogIHhsYWIoIlRpbWUgKGRheXMpIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKPioqRmlnLiBgciB7KGZpZy5uICsgMil9YC4gUmVzcGlyYXRpb24gcmF0ZXMgZm9yIEV4cGVyaW1lbnQgMSAoYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50KSBhbmQgRXhwZXJpbWVudCAyIChhaXItZHJ5IG9ubHkgdHJlYXRtZW50KSoqCgo+KkNhcHRpb246KiBUb3AgcGFuZWwgc2hvd3MgZGF0YSBmcm9tIEV4cGVyaW1lbnQgMSAoYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50KSwgYm90dG9tIHBhbmVsIHNob3dzIGRhdGEgZnJvbSBFeHBlcmltZW50IDIgKGFpci1kcnkgb25seSB0cmVhdG1lbnQpLiBTb2xpZCBsaW5lcyBzaG93IG1lYW4gcmVzcGlyYXRpb24gcmF0ZXMgZm9yIGNvbnRyb2wgc2FtcGxlcyBhbmQgZG90dGVkIGxpbmVzIHNob3cgbWVhbiByZXNwaXJhdGlvbiByYXRlcyBmb3IgdHJlYXRtZW50IHNhbXBsZXMuIFNoYWRlZCByaWJib25zIHNob3cgdGhlIHN0YW5kYXJkIGVycm9yLiBUaGUgZmluYWwgbWVhc3VyZW1lbnQgcG9pbnRzIGZvciBhIGZldyBzYW1wbGVzIHdoaWNoIHRvb2sgPjE4IGRheXMgdG8gcmVhY2ggQ09+Mn4gdGFyZ2V0cyBhcmUgZXhjbHVkZWQgZm9yIGRpc3BsYXkgcmVhc29ucy4gUmVzcGlyYXRpb24gcmF0ZXMgZm9yIHRob3NlIHNhbXBsZXMgcmVtYWluZWQgZmxhdC4gV2hpbGUgZGFpbHkgbWVhc3VyZW1lbnRzIHdlcmUgbWFkZSBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCBmb3IgdGhlIG1ham9yaXR5IG9mIHNhbXBsZXMsIG9ubHkgdGhlIGN1bXVsYXRpdmUgcHJlLWluY3ViYXRpb24gZmx1eCB3YXMgbWVhc3VlZCBmb3IgdGhlIDIwMTEgY29udHJvbCBzYW1wbGVzLiBDb25zZXF1ZW50bHksIHRoZSByZXNwaXJhdGlvbiByYXRlIGZvciB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIHdhcyBjYWxjdWxhdGVkIGN1bXVsYXRpdmVseSBmb3IgYWxsIHNhbXBsZXMuCgoqU3VwcGxlbWVudGFsIHJlc3BpcmF0aW9uIHJhdGVzIGZpZ3VyZToqCgpgYGB7ciByZXNwLXJhdGUtc3RhdHMsIGluY2x1ZGUgPSBGQUxTRX0KIyByZXdldCBtYXggcmVzcCByYXRlcwp0LnRlc3QodGFwcGx5KHRzW3RzJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cyRQZXJpb2QgPT0gInByZSIgJiB0cyRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZCJdLHRzW3RzJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cyRQZXJpb2QgPT0gInByZSIgJiB0cyRUeXBlID09ICJHIiwgIlNhbXBsZU5hbWUiXSwgbWF4LCBuYS5ybSA9IFRSVUUpLAp0YXBwbHkodHNbdHMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIHRzJFBlcmlvZCA9PSAicHJlIiAmIHRzJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kIl0sdHNbdHMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIHRzJFBlcmlvZCA9PSAicHJlIiAmIHRzJFR5cGUgPT0gIkYiLCAiU2FtcGxlTmFtZSJdLCBtYXgsIG5hLnJtID0gVFJVRSkpCmBgYAoKYGBge3IgQ08yIGZsdXhlcyBwbG90c30KIyBkYWlseSBwbG90CnRzLmF2ZyAlPiUgCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIpICU+JQogIG11dGF0ZSh0cnRFeHAgPSBwYXN0ZTAoVHJlYXRtZW50LCBFeHBlcmltZW50KSkgJT4lCiAgZmlsdGVyKHRydEV4cCAhPSAiY29udHJvbGFyYyIpICU+JQogIGZpbHRlcih0aW1lX2RfY210dl9tZWFuIDwgNSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh0aW1lX2RfY210dl9tZWFuLCBtZ0NPMi5DX2dDX2RfbWVhbikpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IHNlX3Nsb3BlX2wsIHltYXggPSBzZV9zbG9wZV91LCBmaWxsID0gVHlwZSwgbGluZXR5cGUgPSBUcmVhdG1lbnQsIGFscGhhID0gVHJlYXRtZW50KSkgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBUeXBlLCBsaW5ldHlwZSA9IFRyZWF0bWVudCkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKEV4cGVyaW1lbnQpLAogICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihFeHBlcmltZW50ID0gYygiYXJjIiA9ICIyMDExIiwgInJld2V0IiA9ICIyMDE5IikpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCw0KSkgKwogICMgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwzMCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdMYW5kdXNlJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICdTdGQuIEVyci4nLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gLjIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IC40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IC4yKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9ICdkYXNoZWQnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSdzb2xpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gImRhc2hlZCIpKSArCiAgeWxhYihleHByZXNzaW9uKCdSZXNwaXJhdGlvbiBSYXRlIChtZ0NPJ1syXSonLUMgZ0MnXi0xKidkJ14tMSonKScpKSArCiAgeGxhYigiVGltZSAoZGF5cykiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZyBgciB7KGZpZy5uICsgMyl9YC4gUmVzcGlyYXRpb24gcmF0ZXMgKGRhaWx5IHByZS1pbmN1YmF0aW9uIHBlcmlvZCBtZWFzdXJlbWVudHMpKioKCj4qQ2FwdGlvbjoqIERhaWx5IG1lYXN1cmVtZW50cyBtYWRlIGZvciB0aGUgdHJlYXRtZW50IHNhbXBsZXMgaW4gRXhwZXJpbWVudCAxIGFuZCBmb3IgYm90aCBjb250cm9sIGFuZCB0cmVhdG1lbnQgc2FtcGxlcyBpbiBFeHBlcmltZW50IDIgc2hvdyB0aGF0IHRyZWF0bWVudCBzYW1wbGUgcmVzcGlyYXRpb24gcmF0ZXMgcGVha2VkIG1vcmUgcmFwaWRseSBpbiBncmFzc2xhbmQgc29pbHMgdGhhbiBpbiBmb3Jlc3Qgc29pbHMgYW5kIHdhcyBvZiBzaWduaWZpY2FudGx5IGdyZWF0ZXIgbWFnbml0dWRlIGluIGJvdGggZXhwZXJpbWVudHMuIENvbnRyb2wgc2FtcGxlIGRhdGEgbm90IHNob3duIGZvciBFeHBlcmltZW50IDEgYXMgb25seSB0aGUgZm91ciBkYXkgYXZlcmFnZSByYXRlIHdhcyBtZWFzdXJlZC4gW1RoaW5raW5nIHRoaXMgcGxvdCBzaG91bGQgZ28gaW4gU0ksIGlmIHdlIGRlY2lkZSB0byBpbmNsdWRlXS4KCgojIyBSYWRpb2NhcmJvbiBkYXRhCgpgYGB7ciBsb2FkIGFtcy1qZW5hLWluZ2VzdCBmeH0KIyAxLiBSZWFkIGluIGlzb3RvcGUgZGF0YSBmcm9tIHZhcmlvdXMgc291cmNlcwojIEZpcnN0IGxvYWQgaGVscGVyIGZ1bmN0aW9uICdyZWFkX2plbmFfYW1zX3Jlc3VsdHMuUiIKc291cmNlKCIuL3V0aWxpdGllcy9qZW5hX2Ftc19pbmdlc3QuUiIpCmBgYAoKYGBge3IgcmVhZCBpc28gZGF0YX0KIyAyLiBOZXh0IHJlYWQgaW4gZGF0YSBmcm9tIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcmllcyBpbiAnZGF0YS9yYXcnCiMgaWRlbnRpZnkgc3ViZGlyZWN0b3JpZXMgaW4gJ3JhdycgZGlyZWN0b3J5IHdpdGggImFtc19qZW5hIiBpbiBuYW1lCmFtc19qZW5hX3Jlc3VsdHNfZGlycyA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiYW1zX2plbmFfcmVzdWx0cyIsIGZ1bGwubmFtZXMgPSBUUlVFKQphbXNfcmVzdWx0c19scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGFtc19qZW5hX3Jlc3VsdHNfZGlycyksIGZ1bmN0aW9uKGkpIHsKICByZWFkX2plbmFfYW1zX3Jlc3VsdHMoYW1zX2plbmFfcmVzdWx0c19kaXJzW2ldKQp9KQpuYW1lcyhhbXNfcmVzdWx0c19scykgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImFtc19qZW5hX3Jlc3VsdHMiKQpgYGAKCmBgYHtyIGFyYyBhbmQgcmV3ZXQgZXhwZXJpbWVudCB0ZW1wbGF0ZX0KIyAzLiBDcmVhdGUgYSAidGlkeSIgc3R5bGUgdGVtcGxhdGUgZm9yIHRoZSBkYXRhLCBpLmUuIHZhcmlhYmxlcyBpbiBjb2x1bW5zLiAKIyBLZXkgdmFyaWFibGVzIGFyZSBhcyBmb2xsb3dzOgojICAgKiBTYW1wbGVOYW1lIChpbmNvcnBvcmF0ZXMgbGFiIHJlcCBhbmQgdHJlYXRtZW50LCBlLmcuICJIRUcxMC0xX2RyeSIpCiMgICAqIElEIChwbG90IElEcywgZS5nLiBmb3IgIkhFRzEwIiBmb3IgRXhwbG9yYXRvcnkgc2FtcGxlcykKIyAgICogVHJlYXRtZW50ICgzIHRyZWF0bWVudHM6IGFpci1kcnksIGFpci1kcnkgKyBzdG9yYWdlLCBzdG9yYWdlIGR1cmF0aW9uOyArIGNvbnRyb2xzKQojICAgKiBUeXBlICgyIGxldmVsczogRiA9IGZvcmVzdCwgRyA9IGdyYXNzbGFuZCkKIyAgICogUGVyaW9kIChpbmN1YmF0aW9uIHBlcmlvZCwgMiBsZXZlbHM6IHByZSA9IHByZWluY3ViYXRpb24sIGluYyA9IGVxdWlsaWJyaXVtIGluY3ViYXRpb24pCiMgICAqIEV4cGVyaW1lbnQgKDMgbGV2ZWxzOiBhcmMgPSBhaXItZHJ5ICsgc3RvcmFnZSwgcmV3ZXQgPSBhaXItZHJ5L3Jld2V0LCB0aW1lID0gc3RvcmFnZSBkdXJhdGlvbikKIyAKIyAqIE9ic2VydmF0aW9uYWwgY29sdW1ucyBpbmNsdWRlOgojICAgKiBkMTRjICgkXERlbHRhJF4xNF5DLUNPfjJ+KQojICAgKiBkMTNjICgkXGRlbHRhJF4xM15DLUNPfjJ+KQojICAgKiBDX2dfa2cgKEMgY29udGVudCkKIyAgICogZHdfZyAoZHJ5IHdlaWdodCkKIyAgICogbWdDTzIuQ19nUyAobWcgQ09+Mn4tQyByZXNwaXJlZCBnXi0xXiBzb2lsIFBlcmlvZF4tMV4pCiMgICAqIHRpbWVfZCAoZGF5cyBpbiBpbmN1YmF0aW9uIHBlcmlvZCBwcmlvciB0byBtZWFzdXJlbWVudCkKIyAgICogZEgyT19ncmF2IChwZXJjZW50IGNoYW5nZSBpbiBncmF2aW1ldHJpYyB3YXRlciBjb250ZW50IGR1ZSB0byBsYWJvcmF0b3J5IG1vaXN0dXJlIGFkanVzdG1lbnQpCiMgICAqIGRIMk9fd2hjIChwZXJjZW50IGNoYW5nZSBpbiB3YXRlciBob2xkaW5nIGNhcGFjaXR5IGR1ZSB0byBsYWJvcmF0b3J5IG1vaXN0dXJlIGFkanVzdG1lbnQpCiAgCnVuaXF1ZS5pZC5uIDwtIGMobGVuZ3RoKHVuaXF1ZShhcmNoaXZlLmN0bC50cyRJRCkpLAogICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUoYXJjaGl2ZS5hcmMudHMkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUocmV3ZXQuY3RsLnRzJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHJld2V0LmRyeS50cyRTYW1wbGVOYW1lKSkpCnByZS4xNGMgPC0gZGF0YS5mcmFtZShTYW1wbGVOYW1lID0gYyhhcy5jaGFyYWN0ZXIodW5pcXVlKGFyY2hpdmUuY3RsLnRzJElEKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodW5pcXVlKGFyY2hpdmUuYXJjLnRzJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUocmV3ZXQuY3RsLnRzJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUocmV3ZXQuZHJ5LnRzJFNhbXBsZU5hbWUpKSkpCnByZS4xNGMkSUQgPC0gc3Vic3RyKHByZS4xNGMkU2FtcGxlTmFtZSwgMSwgNSkKcHJlLjE0YyRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIHByZS4xNGMkSUQpLCAiRyIsICJGIikKcHJlLjE0YyRFeHBlcmltZW50IDwtIGMocmVwKCJhcmMiLCB1bmlxdWUuaWQublsxXSArIHVuaXF1ZS5pZC5uWzJdKSwKICAgICAgICAgICAgICAgICAgICAgICByZXAoInJld2V0IiwgdW5pcXVlLmlkLm5bM10gKyB1bmlxdWUuaWQubls0XSkpCnByZS4xNGMkVHJlYXRtZW50IDwtIGMocmVwKCJjb250cm9sIiwgdW5pcXVlLmlkLm5bMV0pLAogICAgICAgICAgICAgICAgICAgICAgIHJlcCgiYWlyLWRyeSArIHN0b3JhZ2UiLCB1bmlxdWUuaWQublsyXSksCiAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJjb250cm9sIiwgdW5pcXVlLmlkLm5bM10pLAogICAgICAgICAgICAgICAgICAgICAgIHJlcCgiYWlyLWRyeSIsIHVuaXF1ZS5pZC5uWzRdKSkKcHJlLjE0YyRQZXJpb2QgPC0gInByZSIKCiMgY3JlYXRlIGluYyBwZXJpb2QgZGYgYXMgZHVwbGljYXRlIG9mIHByZS1pbmMgZGYsIGJ1dCB0ZXN0IHRoYXQgaXQgaXMgdGhlIHJpZ2h0IHNoYXBlIGZpcnN0CmlmKG5yb3cocHJlLjE0YykgPT0gc3VtKHVuaXF1ZS5pZC5uKSAmIG5jb2wocHJlLjE0YykgPT0gNikgewogIGluYy4xNGMgPC0gcHJlLjE0YwogIGluYy4xNGMkUGVyaW9kIDwtICJpbmMiCn0gZWxzZSB7CiAgInByZS4xNGMgZGF0YSBmcmFtZSBtYWxmb3JtZWQiCn0KYWxsLjE0Yy50ZW1wbGF0ZSA8LSByYmluZChwcmUuMTRjLCBpbmMuMTRjKQpgYGAKCmBgYHtyIHRtZSBleHBlcmltZW50IHRlbXBsYXRlfQp1bmlxdWUuaWQudG1lLm4gPC0gYyhsZW5ndGgodW5pcXVlKHRtZS5jdGwuZHVrJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZSh0bWUuY3RsLm9ybmwkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHRtZS5jdGwuZmx4LnNyYSRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUodG1lLm1pc2MkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKGFyY2hpdmUuY3RsLnRzLndpZGVbYXJjaGl2ZS5jdGwudHMud2lkZSRFeHBlcmltZW50ID09ICJ0bWUiLCAiSUQiXSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHRtZS50cnQudHMkU2FtcGxlTmFtZSkpKQpwcmUudG1lLmN0bCA8LSBkYXRhLmZyYW1lKFNhbXBsZU5hbWUgPSBjKGFzLmNoYXJhY3Rlcih1bmlxdWUodG1lLmN0bC5kdWskU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUodG1lLmN0bC5vcm5sJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodW5pcXVlKHRtZS5jdGwuZmx4LnNyYSRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHVuaXF1ZSh0bWUubWlzYyRTYW1wbGVOYW1lKSksICAgYXMuY2hhcmFjdGVyKHVuaXF1ZShhcmNoaXZlLmN0bC50cy53aWRlW2FyY2hpdmUuY3RsLnRzLndpZGUkRXhwZXJpbWVudCA9PSAidG1lIiwgIklEIl0pKSkpCnByZS50bWUuY3RsJFNpdGUgPC0gYyhyZXAoIkR1a2UiLCB1bmlxdWUuaWQudG1lLm5bMV0pLAogICAgICAgICAgICAgICAgICAgICAgcmVwKCJPUk5MIiwgdW5pcXVlLmlkLnRtZS5uWzJdKSwKICAgICAgICAgICAgICAgICAgICAgIHJlcCgiU2llcnJhIiwgdW5pcXVlLmlkLnRtZS5uWzNdKSwKICAgICAgICAgICAgICAgICAgICAgIHJlcCgibWlzYyIsIHVuaXF1ZS5pZC50bWUubls0XSksCiAgICAgICAgICAgICAgICAgICAgICByZXAoIlhwbHIiLCB1bmlxdWUuaWQudG1lLm5bNV0pKQoKCiMgRHVrZSwgT1JOTCwgbWlzYywgYW5kIFhwbHIgSURzCnByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIkR1a2UiIHwgCiAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiIHwKICAgICAgICAgICAgcHJlLnRtZS5jdGwkU2l0ZSA9PSAibWlzYyIgfAogICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJYcGxyIiwgIklEIl0gPC0gYXMuY2hhcmFjdGVyKHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIkR1a2UiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIm1pc2MiIHwKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJYcGxyIiwgIlNhbXBsZU5hbWUiXSkKCiMgU2llcnJhIElEcwpwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiSUQiXSA8LQogIHN1YnN0cihwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiU2FtcGxlTmFtZSJdLCAxMCwgMTEpCgojIHN1YmRpdmlkZSBPUk5MIGludG8gV0IgYW5kIFRWQQpwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJPUk5MIiwgIlNpdGUiXSA8LSBpZmVsc2UoZ3JlcGwoIlRWQSIsIHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiLCAiSUQiXSksICJUZW5uZXNzZWUgVmFsbGV5IiwgIldhbGtlciBCcmFuY2giKQoKIyBzdWJkaXZpZGUgU2llcnJhIGludG8gTXVzaWNrIGFuZCBTaGF2ZXIKcHJlLnRtZS5jdGxbcHJlLnRtZS5jdGwkU2l0ZSA9PSAiU2llcnJhIiwgIlNpdGUiXSA8LSBpZmVsc2UoZ3JlcGwoIk0iLCBwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiSUQiXSksICJNdXNpY2siLCAiU2hhdmVyIikKCiMgYWRkIHRyZWF0bWVudCBjb2wKcHJlLnRtZS5jdGwkVHJlYXRtZW50IDwtICJjb250cm9sIgoKcHJlLnRtZS50cnQgPC0gZGF0YS5mcmFtZShTYW1wbGVOYW1lID0gdW5pcXVlKHRtZS50cnQudHMkU2FtcGxlTmFtZSkpCnByZS50bWUudHJ0JElEIDwtIHN1YnN0cihwcmUudG1lLnRydCRTYW1wbGVOYW1lLCAxLCBuY2hhcihhcy5jaGFyYWN0ZXIocHJlLnRtZS50cnQkU2FtcGxlTmFtZSkpLTIpCnByZS50bWUudHJ0IDwtIHJiaW5kKHByZS50bWUudHJ0LCBwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJtaXNjIiwgYygiSUQiLCAiU2FtcGxlTmFtZSIpXSkKcHJlLnRtZS50cnQkVHJlYXRtZW50IDwtICJzdG9yYWdlIGR1cmF0aW9uIgpwcmUudG1lLnRydCRTaXRlIDwtIHByZS50bWUuY3RsW21hdGNoKHByZS50bWUudHJ0JElELCBwcmUudG1lLmN0bCRJRCksICJTaXRlIl0KCnByZS50bWUuMTRjIDwtIHJiaW5kKHByZS50bWUuY3RsLCBwcmUudG1lLnRydCkKcHJlLnRtZS4xNGMkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCBwcmUudG1lLjE0YyRTYW1wbGVOYW1lKSwgIkciLCAiRiIpCnByZS50bWUuMTRjJFBlcmlvZCA8LSAicHJlIgpwcmUudG1lLjE0YyRFeHBlcmltZW50IDwtICJ0bWUiCgojIGNyZWF0ZSBpbmMgcGVyaW9kIGRmCmluYy50bWUuMTRjIDwtIHByZS50bWUuMTRjCmluYy50bWUuMTRjJFBlcmlvZCA8LSAiaW5jIgp0bWUuMTRjLnRlbXBsYXRlIDwtIHJiaW5kKHByZS50bWUuMTRjLCBpbmMudG1lLjE0YykKYGBgCgpgYGB7ciBjb21iaW5lIHNvaWwgb2JzIGRhdGF9CiMgNC4gU3VtbWFyaXplIG9ic2VydmF0aW9uYWwgZGF0YSBmcm9tIHRpbWVzZXJpZXMgZGF0YSBieSB1bmlxdWUgSURzIChTYW1wbGVOYW1lKQojIHN1bW1hcml6ZSB0aW1lIGFuZCBjbzIgZGF0YSBieSBleHBlcmltZW50LCBwZXJpb2QsIHRyZWF0bWVudCwgYW5kIHNhbXBsZSBuYW1lCnRzLmVwc24uYXZnIDwtIHRzICU+JQogIHNlbGVjdChFeHBlcmltZW50LCBJRCwgUGVyaW9kLCBUcmVhdG1lbnQsIFNhbXBsZU5hbWUsIGdDX2dTLCBkd19nLCBtZ0NPMi5DX2dDLCB0aW1lX2QsIHRpbWVfZF9jbXR2KSAgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgSUQsIFBlcmlvZCwgVHJlYXRtZW50LCBTYW1wbGVOYW1lKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWF4ID0gbWF4KSwgbmEucm0gPSBUUlVFKQp0cy5lcHNuLmF2ZyA8LSByZW5hbWVfYXQodHMuZXBzbi5hdmcsIHZhcnMoY29udGFpbnMoJ21heCcpKSwgbGlzdCh+c3ViKCJfbWF4IiwgIiIsIC4pKSkKYGBgCgpgYGB7ciBjbGVhbiB1cCAxNEMgZGF0YX0KIyA2LiBDbGVhbiB1cCBeMTReQyBkYXRhIGFuZCBhZGQgZXh0ZXJuYWwgZGF0YSBwb2ludHMgKHRtZSBleHBlcmltZW50LCBYcGxyIGNvbnRyb2wgc2FtcGxlcykKIyBOZWVkIHRvIGFkZCBTYW1wbGVOYW1lIGNvbCBhbmQgdmFyaWFibGUgY29sdW1ucyBUcmVhdG1lbnQsIFBlcmlvZCwgYW5kIEV4cGVyaW1lbnQgdG8gYWxsIGRhdGEgZnJhbWVzIGluIGFtc19yZXN1bHRzX2xzIAoKIyBGaXJzdCBhZGQgMTRDIGFuZCAxM0MgZGF0YSBmcm9tIEV4cGxvcmF0b3JpZXMgY29udHJvbCBzYW1wbGVzIHRvIGFtc19yZXN1bHRzX2xzCiMgbm90ZSB0aGF0IG5laXRoZXIgMTNDIG5vciAxNEMgd2FzIG1lYXN1cmVkIGZvciB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIGZvciB0aGVzZSBzYW1wbGVzCiMgZ2V0IG5hbWVzIGZvciBhbXNfcmVzdWx0cyBkYXRhIGZyYW1lcwpyZXN1bHRzLjE0Yy5ubXMgPC0gbmFtZXMoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgKQojIGdldCBuYW1lcyBmb3IgcmVsZXZhbnQgRXhwZXJpbWVudC9UcmVhdG1lbnQvUGVyaW9kIGNvbWJpbmF0aW9uCmFyY19jdGxfaW5jX1NOIDwtIGFzLmNoYXJhY3RlcihhbGwuMTRjLnRlbXBsYXRlW2FsbC4xNGMudGVtcGxhdGUkRXhwZXJpbWVudCA9PSAiYXJjIiAmIGFsbC4xNGMudGVtcGxhdGUkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIGFsbC4xNGMudGVtcGxhdGUkUGVyaW9kID09ICJpbmMiLCAiU2FtcGxlTmFtZSJdKQp0bWVfY3RsX2luY194cGxyX1NOIDwtIHVubGlzdChsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbMToyXSwgZnVuY3Rpb24oeCkgdW5saXN0KGxhcHBseSh4LCAiW1siLCAiUHJvYmUiKSkpKQp0bWVfY3RsX2luY194cGxyX1NOIDwtIHRtZV9jdGxfaW5jX3hwbHJfU05bZ3JlcCgiSEUiLCB0bWVfY3RsX2luY194cGxyX1NOKV0KaWYobGVuZ3RoKHRtZV9jdGxfaW5jX3hwbHJfU04pID09IDE0KSB7CiAgdG1lX2N0bF9pbmNfeHBscl9TTiA8LSB1bmlxdWUoc3Vic3RyKHRtZV9jdGxfaW5jX3hwbHJfU04sIDEsIG5jaGFyKHRtZV9jdGxfaW5jX3hwbHJfU04pLTIpKQp9CgojIGFkZCBzdWJsaXN0IGZvciBFeHBsb3JhdG9yaWVzIDIwMTEgKGNvbnRyb2wpIGRhdGEgYW5kIGRhdGEgZnJhbWVzIGZvciBhYm92ZSBzdWJzZXRzCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkYXJjX2N0bF9pbmMgPC0gZGF0YS5mcmFtZShtYXRyaXgobnJvdyA9IGxlbmd0aChhcmNfY3RsX2luY19TTiksIG5jb2wgPSBsZW5ndGgocmVzdWx0cy4xNGMubm1zKSkpCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkdG1lX2N0bF9pbmNfeHBsciA8LSBkYXRhLmZyYW1lKG1hdHJpeChucm93ID0gbGVuZ3RoKHRtZV9jdGxfaW5jX3hwbHJfU04pLCBuY29sID0gbGVuZ3RoKHJlc3VsdHMuMTRjLm5tcykpKQoKIyBhZGQgbmFtZXMgYW5kIGZpbGwgU2FtcGxlTmFtZXMgZm9yIG5ldyBkYXRhIGZyYW1lcwphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExIDwtIGxhcHBseShhbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExLCBmdW5jdGlvbih4KSB7CiAgbmFtZXMoeCkgPC0gcmVzdWx0cy4xNGMubm1zCiAgcmV0dXJuKHgpCiAgfSkgCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkYXJjX2N0bF9pbmNbICwgYygiU2FtcGxlTmFtZSIsIlByb2JlIildIDwtIGFyY19jdGxfaW5jX1NOCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkdG1lX2N0bF9pbmNfeHBsclsgLCBjKCJTYW1wbGVOYW1lIiwiUHJvYmUiKV0gPC0gdG1lX2N0bF9pbmNfeHBscl9TTgoKIyBmaWxsIDE0QyBkYXRhCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEgPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEsIGZ1bmN0aW9uKGRmKSB7CiAgZGYkYOKIhjE0Qy4o4oCwKWAgPC0geHBsci5jdGwuaXNvW21hdGNoKGRmJFByb2JlLCB4cGxyLmN0bC5pc28kRVBfUGxvdGlkKSwgIjE0Y19DTzIiXQogIGRmJFRyZWF0bWVudCA8LSAiY29udHJvbCIKICBkZiRQZXJpb2QgPC0gImluYyIKICByZXR1cm4oZGYpCn0pCgojIGFkZCBFeHBlcmltZW50CmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkYXJjX2N0bF9pbmMkRXhwZXJpbWVudCA8LSAiYXJjIgphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExJHRtZV9jdGxfaW5jX3hwbHIkRXhwZXJpbWVudCA8LSAidG1lIgoKCiMgYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTgtMTAtMTJgIGFuZCBgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOC0xMS0wOWAKIyBgQmVlbS1NaWxsZXJfNC54bHN4YCwgYEJlZW0tTWlsbGVyXzUueGxzeGA7IGBCZWVtLU1pbGxlcl82Lnhsc3hgLCBgQmVlbS1NaWxsZXJfNy54bHN4YAojIEFkZCB0cmVhdG1lbnQsIGV4cGVyaW1lbnQsIHBlcmlvZCBjb2xzCiMgRXhwZXJpbWVudCA9IHRtZQojIFRyZWF0bWVudCA9IHN0b3JhZ2UgZHVyYXRpb24KIyBQZXJpb2QgPSBpbmMKYW1zX3Jlc3VsdHNfbHNbMToyXSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbMToyXSwgZnVuY3Rpb24obHMpIGxhcHBseShscywgZnVuY3Rpb24oZGYpIHsKICBkZiRFeHBlcmltZW50IDwtICJ0bWUiCiAgZGYkVHJlYXRtZW50IDwtICJzdG9yYWdlIGR1cmF0aW9uIgogIGRmJFBlcmlvZCA8LSAiaW5jIgogIHJldHVybihkZikKICB9KQopCgojIGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YAojIGBCZWVtLU1pbGxlcl85Lnhsc3hgCiMgRXhwZXJpbWVudCA9IGFyYwojIFRyZWF0bWVudCA9IGFpci1kcnkgKyBzdG9yYWdlCiMgUGVyaW9kID0gcHJlCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YCRgQmVlbS1NaWxsZXJfOS54bHN4YCRTYW1wbGVOYW1lIDwtIGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YCRgQmVlbS1NaWxsZXJfOS54bHN4YCRQcm9iZQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGAkVHJlYXRtZW50IDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgJFBlcmlvZCA8LSAicHJlIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGAkRXhwZXJpbWVudCA8LSAiYXJjIgoKIyBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkCiMgQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeAojIEV4cGVyaW1lbnQgPSBhcmMKIyBUcmVhdG1lbnQgPSBhaXItZHJ5ICsgc3RvcmFnZQojIFBlcmlvZCA9IGluYwphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeCRTYW1wbGVOYW1lIDwtIHN1YnN0cihhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeCRQcm9iZSwgMSwgOSkKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gkVHJlYXRtZW50IDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gkUGVyaW9kIDwtICJpbmMiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAyLTI1YCRBcmNoaXZlZF9JbmN1YmF0aW9uc18zMC54bHN4JEV4cGVyaW1lbnQgPC0gImFyYyIKCiMgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDQtMzBgCiMgYFJvc3RfMzEtMi54bHN4YAojIEV4cGVyaW1lbnQgPSBhcmMKIyBUcmVhdG1lbnQgPSBhaXItZHJ5ICsgc3RvcmFnZQojIFBlcmlvZCA9IGluYywgcHJlIChTRVcxMS0yLTIpCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgJFNhbXBsZU5hbWUgPC0gc3Vic3RyKGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgJFByb2JlLCAxLCA5KQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YCRUcmVhdG1lbnQgPC0gImFpci1kcnkgKyBzdG9yYWdlIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YCRFeHBlcmltZW50IDwtICJhcmMiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgWzI6OSwgIlBlcmlvZCJdIDwtICJpbmMiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYCRgUm9zdF8zMS0yLnhsc3hgWzEwLCAiUGVyaW9kIl0gPC0gInByZSIKCiMgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgCiMgUm9zdF80Ny54bHN4IAojIEV4cGVyaW1lbnQgPSByZXdldAojIFRyZWF0bWVudCA9IGNvbnRyb2wKIyBQZXJpb2QgPSBwcmUKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRTYW1wbGVOYW1lIDwtIHN1YnN0cihhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF80Ny54bHN4JFByb2JlLCAxLCA3KQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF80Ny54bHN4JFRyZWF0bWVudCA8LSAiY29udHJvbCIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRFeHBlcmltZW50IDwtICJyZXdldCIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRQZXJpb2QgPC0gInByZSIKIyBSb3N0XzUwLnhsc3gKIyBFeHBlcmltZW50ID0gcmV3ZXQKIyBUcmVhdG1lbnQgPSBjb250cm9sCiMgUGVyaW9kID0gaW5jCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkU2FtcGxlTmFtZSA8LSBzdWJzdHIoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTAueGxzeCRQcm9iZSwgMSwgNykKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTAueGxzeCRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkRXhwZXJpbWVudCA8LSAicmV3ZXQiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkUGVyaW9kIDwtICJpbmMiCiMgUm9zdF81Mi54bHN4CiMgRXhwZXJpbWVudCA9IHJld2V0CiMgVHJlYXRtZW50ID0gYWlyLWRyeQojIFBlcmlvZCA9IHByZSwgaW5jCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3gkU2FtcGxlTmFtZSA8LSBzdWJzdHIoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeCRQcm9iZSwgMSwgMTEpCnByZS5peCA8LSB3aGljaChncmVwbCgiUFJFIiwgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeCRQcm9iZSkpCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3gkVHJlYXRtZW50IDwtICJhaXItZHJ5IgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4JEV4cGVyaW1lbnQgPC0gInJld2V0IgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4W3ByZS5peCwgIlBlcmlvZCJdIDwtICJwcmUiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3hbLXByZS5peCwgIlBlcmlvZCJdIDwtICJpbmMiCmBgYAoKYGBge3IgY29tYmluZSAxNEMgc29pbCBvYnMgZGF0YX0KIyA3LiBDb21iaW5lIGRhdGEuCiMgZmxhdHRlbiBsaXN0IGFuZCByZW1vdmUgQU1TIGJsYW5rcywgTkEgc2FtcGxlcywgYW5kIG5vbi1FeHBsb3JhdG9yeSBkYXRhCmFtc19yZXN1bHRzX2FyY19yZXdldCA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbMzo3XSwgZnVuY3Rpb24oeCkgYmluZF9yb3dzKHgpKQphbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYgPC0gYmluZF9yb3dzKGxhcHBseShhbXNfcmVzdWx0c19hcmNfcmV3ZXQsIGZ1bmN0aW9uKHgpIGV4dHJhLmNsZWFuLmZ4KHgpKSkKCiMgZmxhdHRlbiBleHRlcm5hbCBkYXRhIGxpc3QKYW1zX3Jlc3VsdHNfdG1lIDwtIGxhcHBseShhbXNfcmVzdWx0c19sc1tjKDE6Miw3KV0sIGZ1bmN0aW9uKHgpIGxhcHBseSh4LCB0bWUuMTRjLmZ4KSkKYW1zX3Jlc3VsdHNfdG1lLmRmIDwtIGJpbmRfcm93cyhsYXBwbHkoYW1zX3Jlc3VsdHNfdG1lLCBmdW5jdGlvbih4KSBiaW5kX3Jvd3MoeCkpKQoKIyBjdXQgb3V0IG5vbi1yZWxldmFudCBBTVMgcmVzdWx0cyBjb2x1bW5zCm5tcy5hbXMudmFycyA8LSBjKCJGMTRDIiwgImVyciIsICLiiIYxNEMuKOKAsCkiLCAiZXJyLijigLApIiwKICAgICAgICAgICAgICAgICAiU2FtcGxlTmFtZSIsICJUcmVhdG1lbnQiLCAiUGVyaW9kIiwgIkV4cGVyaW1lbnQiKQphbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYgPC0gYW1zX3Jlc3VsdHNfYXJjX3Jld2V0LmRmWyAsIG5tcy5hbXMudmFyc10KY29sbmFtZXMoYW1zX3Jlc3VsdHNfYXJjX3Jld2V0LmRmKSA8LSBjKCJmbSIsICJmbV9lcnIiLCAiZDE0YyIsICJkMTRjX2VyciIsIG5tcy5hbXMudmFyc1s1OjhdKQoKYW1zX3Jlc3VsdHNfdG1lLmRmIDwtIGFtc19yZXN1bHRzX3RtZS5kZlsgLCBubXMuYW1zLnZhcnNdCmNvbG5hbWVzKGFtc19yZXN1bHRzX3RtZS5kZikgPC0gYygiZm0iLCAiZm1fZXJyIiwgImQxNGMiLCAiZDE0Y19lcnIiLCBubXMuYW1zLnZhcnNbNTo4XSkKYW1zX3Jlc3VsdHNfdG1lLmRmJElEIDwtIHN1YnN0cihhbXNfcmVzdWx0c190bWUuZGYkU2FtcGxlTmFtZSwgMSwgbmNoYXIoYW1zX3Jlc3VsdHNfdG1lLmRmJFNhbXBsZU5hbWUpLTIpCmFtc19yZXN1bHRzX3RtZS5kZiRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIGFtc19yZXN1bHRzX3RtZS5kZiRJRCksICJHIiwgIkYiKQoKIyBtZXJnZSBhcmMgYW5kIHJld2V0IDE0QyBkYXRhIHdpdGggdGVtcGxhdGUKaWYobnJvdyhtZXJnZShhbGwuMTRjLnRlbXBsYXRlLCBhbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYsIGFsbC54ID0gVFJVRSkpID09IG5yb3coYWxsLjE0Yy50ZW1wbGF0ZSkpIHsKICBhbGwuMTRjIDwtIG1lcmdlKGFsbC4xNGMudGVtcGxhdGUsIGFtc19yZXN1bHRzX2FyY19yZXdldC5kZiwgYWxsLnggPSBUUlVFKQp9IGVsc2UgewogIGNhdCgiZHVwbGljYXRlIHNhbXBsZSBtZXJnZSBlcnJvciIpCn0KCiMgbWVyZ2Ugc29pbCBvYnMgZGF0YSB3aXRoIDE0YyBkYXRhCmlmKG5yb3cobWVyZ2UoYWxsLjE0YywgdHMuZXBzbi5hdmcsIGJ5ID0gYygiU2FtcGxlTmFtZSIsICJQZXJpb2QiKSkpID09IG5yb3coYWxsLjE0YykpIHsKICBhbGwuMTRjIDwtIG1lcmdlKGFsbC4xNGMsIHRzLmVwc24uYXZnLCBhbGwueCA9IFRSVUUpCn0gZWxzZSB7CiAgY2F0KCJkdXBsaWNhdGUgc2FtcGxlIG1lcmdlIGVycm9yIikKfQoKIyBtZXJnZSB0bWUgMTRDIGRhdGEgd2l0aCB0ZW1wbGF0ZSBhbmQgdHMuZXBzbi5hdmcKdG1lLjE0YyA8LSBtZXJnZSh0bWUuMTRjLnRlbXBsYXRlLCBhbXNfcmVzdWx0c190bWUuZGYsIGFsbC54ID0gVFJVRSkKCiMgYWRkIGN0bCBzYW1wbGUgMTRDIGRhdGEgdG8gdG1lLjE0YwojIGZpcnN0IHJlbW92ZSBOQSB2YWx1ZXMKdG1lLjE0Yy5jbGVhbiA8LSB0bWUuMTRjW3doaWNoKCFpcy5uYSh0bWUuMTRjJGQxNGMpIHwgIWlzLm5hKHRtZS4xNGMkZm0pKSwgXQojIGRlZmluZSBtZXJnZSBmeAp0bWUubXJnLmZ4IDwtIGZ1bmN0aW9uKHgsIHkpIHsKICBtcmcubm1zIDwtIGMoIlNhbXBsZU5hbWUiLCAiSUQiLCAiVHJlYXRtZW50IiwgIlBlcmlvZCIpCiAgdmFyLm5tcyA8LSBjKCJZZWFyU2FtcGxlZCIsICJTaXRlIiwgIkhvcml6b24iLCAgImQxNGMiLCAiZm0iKQogIGlmKGxlbmd0aChncmVwKCJmbSIsIG5hbWVzKHkpKSkgPiAwKSB7CiAgICBkZiA8LSBtZXJnZSh4WyAsIG1yZy5ubXNdLCB5WyAsIGMobXJnLm5tcywgdmFyLm5tcyldKQogIH0gZWxzZSB7CiAgICBkZiA8LSBtZXJnZSh4WyAsIG1yZy5ubXNdLCB5WyAsIGMobXJnLm5tcywgdmFyLm5tc1sxOjRdKV0pCiAgICBkZiRmbSA8LSBOQQogIH0KICByZXR1cm4oZGYpCn0KCnRtZS4xNGMuZGYgPC0gYmluZF9yb3dzKGxhcHBseShsaXN0KHRtZS5jdGwuZHVrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLmN0bC5mbHguc3JhW3doaWNoKCFpcy5uYSh0bWUuY3RsLmZseC5zcmEkZDE0YykpLCBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLmN0bC5vcm5sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLm1pc2MpLCBmdW5jdGlvbihpKSB0bWUubXJnLmZ4KHRtZS4xNGMsIGkpKSkKCiMgYWRkIHN0b3JhZ2UgZHVyYXRpb24gZGF0YSBmb3IgdHJlYXRtZW50IHNhbXBsZXMgYW5hbHl6ZWQgZXh0ZXJuYWxseQp0bWUuMTRjLmRmJFR5cGUgPC0gIkYiCgojIGFkZCBZZWFyU2FtcGxlZCBmb3IgdG1lLjE0Yy5jbGVhbiBzYW1wbGVzCmZvcihpIGluIDE6bnJvdyh0bWUuMTRjLmNsZWFuKSkgewogIGlmKHRtZS4xNGMuY2xlYW5baSwgIlNpdGUiXSA9PSAiRHVrZSIpIHsKICAgIHRtZS4xNGMuY2xlYW5baSwgIlllYXJTYW1wbGVkIl0gPC0gMjAwOAogIH0gZWxzZSBpZih0bWUuMTRjLmNsZWFuW2ksICJTaXRlIl0gPT0gIlhwbHIiKSB7CiAgICB0bWUuMTRjLmNsZWFuW2ksICJZZWFyU2FtcGxlZCJdIDwtIDIwMTEKICB9IGVsc2UgaWYodG1lLjE0Yy5jbGVhbltpLCAiU2l0ZSJdID09ICJTaWVycmEiKSB7CiAgICB0bWUuMTRjLmNsZWFuW2ksICJZZWFyU2FtcGxlZCJdIDwtIDIwMDkKICB9IGVsc2UgewogICAgdG1lLjE0Yy5jbGVhbltpLCAiWWVhclNhbXBsZWQiXSA8LSAyMDA0CiAgfQp9CgojIEFkZCBIb3Jpem9uIHRvIHRtZS4xNGMuY2xlYW4KdG1lLjE0Yy5jbGVhbiRIb3Jpem9uIDwtIGlmZWxzZSh0bWUuMTRjLmNsZWFuJElEID09ICJNQiIgfCB0bWUuMTRjLmNsZWFuJElEID09ICJTQiIsICJCIiwgIkEiKQoKIyBjb21iaW5lIHRtZSBkYXRhCnRtZS4xNGMgPC0gYmluZF9yb3dzKHRtZS4xNGMuY2xlYW5bICwgbmFtZXModG1lLjE0Yy5kZildLCB0bWUuMTRjLmRmKQp0bWUuMTRjJEV4cGVyaW1lbnQgPC0gInRtZSIKCiMgcmVtb3ZlIG91dGxpZXIgKE1BLTEpCiMgKioqIE5lZWQgdG8gY2xhcmlmeSBtZXRob2QgZm9yIGRldGVybWluaW5nIHRoYXQgdGhpcyBpcyBhbiBvdXRsaWVyICoqKiAKdG1lLjE0YyA8LSB0bWUuMTRjWy13aGljaCh0bWUuMTRjJFNhbXBsZU5hbWUgPT0gIk1BLTEiIHwgdG1lLjE0YyRTYW1wbGVOYW1lID09ICJIRVc0OS0xIiB8IHRtZS4xNGMkU2FtcGxlTmFtZSA9PSAiSEVXMjYtMSIpLCBdCgoKIyBBZGQgbWlzc2luZyB2YXJpYWJsZSBjb2x1bW5zIHRvIGFsbC4xNGMKIyBhZGQgWWVhclNhbXBsZWQgY29sdW1uCmFsbC4xNGMkWWVhclNhbXBsZWQgPC0gaWZlbHNlKGFsbC4xNGMkRXhwZXJpbWVudCA9PSAiYXJjIiwgMjAxMSwgMjAxOSkKCiMgYWRkIFNpdGUgYW5kIEhvcml6b24gY29sdW1ucwphbGwuMTRjJFNpdGUgPC0gaWZlbHNlKGdyZXBsKCJIRSIsIGFsbC4xNGMkSUQpLCAiSGFpbmljaCIsICJTY2hvcmZoZWlkZSIpCmFsbC4xNGMkSG9yaXpvbiA8LSAiQSIKCgojIGNvbWJpbmUgdG1lLjE0YyBhbmQgYWxsLjE0YyBpbnRvIGEgbGlzdCBhbmQgY2FsY3VsYXRlIGZyYWN0aW9uIG1vZGVybiBmcm9tIGQxNEMgYXMgbmVlZGVkCmFsbC4xNGMubHMgPC0gbGFwcGx5KGxpc3QodG1lLjE0YywgYWxsLjE0YyksIGZ1bmN0aW9uKGRmKSB7CiAgZGYkZm0gPC0gaWZlbHNlKGlzLm5hKGRmJGZtKSwKICAgICAgICAgICAgICAgICAgZDE0Yy5mbS5meChkZiRZZWFyU2FtcGxlZCwgZGYkZDE0YyksCiAgICAgICAgICAgICAgICAgIGRmJGZtKQogIGRmJGQxNGNfY29yciA8LSBkZWNheS5jb3JyLmZ4KGRmJFllYXJTYW1wbGVkLCBkZiRmbSkKICByZXR1cm4oZGYpCn0pCgphbGwuMTRjLnN1bSA8LSBsYXBwbHkoYWxsLjE0Yy5scywgZnVuY3Rpb24oZGYpIHsKICBkZi5zdW0gPC0gc2VsZWN0KGRmLCAtU2FtcGxlTmFtZSkgJT4lCiAgICBncm91cF9ieShJRCwgVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIFNpdGUsIEhvcml6b24sIFllYXJTYW1wbGVkKSAlPiUKICAgIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgbWF4ID0gbWF4LCBtaW4gPSBtaW4pLCBuYS5ybSA9IFRSVUUpCiAgZGYuc3VtW21hcHBseShpcy5pbmZpbml0ZSwgZGYuc3VtKV0gPC0gTkEKICByZXR1cm4oZGYuc3VtKQp9KQphbGwuMTRjLnN1bSA8LSByYXBwbHkoYWxsLjE0Yy5zdW0sIGYgPSBmdW5jdGlvbih4KSBpZmVsc2UoaXMubmFuKHgpLCBOQSAsIHgpLCBob3cgPSAicmVwbGFjZSIpCmFsbC4xNGMuc3VtLmRmIDwtIGJpbmRfcm93cyhhbGwuMTRjLnN1bSkKCiMgcmVtb3ZlIHVubmVjZXNzYXJ5IG9iamVjdHMKYGBgCgpgYGB7ciBjb3VudHMgZm9yIGNoZWNraW5nIHBsb3RzLCBpbmNsdWRlID0gRkFMU0V9CiMgOC4gQ291bnQgbnVtYmVyIG9mIF4xNF5DIG9ic2VydmF0aW9ucyBmb3IgY2hlY2tpbmcgcGxvdHMuCiMgY291bnQgIWlzLm5hKDE0QykgY2FzZXMgYnkgU2FtcGxlTmFtZQphbGwuMTRjWy13aGljaChpcy5uYShhbGwuMTRjJGQxNGNfY29ycikpLF0gJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBQZXJpb2QsIFR5cGUpICU+JQogIGNvdW50KCkKIyBieSBJRAphbGwuMTRjWy13aGljaChpcy5uYShhbGwuMTRjJGQxNGNfY29ycikpLF0gJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBQZXJpb2QsIFR5cGUpICU+JQogIGRpc3RpbmN0KElEKSAlPiUKICBjb3VudCgpCmBgYAoKKlByZS1pbmN1YmF0aW9uIHZlcnN1cyBlcXVpbGlicml1bSByZXNwaXJhdGlvbiBeMTReQy1DT34yfioKCkRlc3BpdGUgdGhlIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIHJlc3BpcmF0aW9uLCBhbmQgaW4gY29udHJhc3QgdG8gaHlwb3RoZXNpcyAxLCB3ZSBkaWQgbm90IG9ic2VydmUgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgYmV0d2VlbiBeMTReQy1DT34yfiByZXNwaXJlZCBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCBhbmQgXjE0XkMtQ09+Mn4gcmVzcGlyZWQgZHVyaW5nIHRoZSBlcXVpbGlicml1bSByZXNwaXJhdGlvbiBwZXJpb2Q6IG5laXRoZXIgZm9yIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQgbm9yIGZvciB0aGUgYWlyLWRyeSB0cmVhdG1lbnQgYWxvbmUgKiooRmlnLiA1KSoqLiBUaGUgaW50ZXJhY3Rpb25zIHdpdGggbGFuZCB1c2Ugd2FzIG5vdCBzaWduaWZpY2FudCBub3Igd2FzIHRoZSBpbnRlcmFjdGlvbiB3aXRoIGV4cGVyaW1lbnQsIHNvIGFsbCBkYXRhIHdlcmUgcG9vbGVkIGZvciBzdGF0aXN0aWNhbCBhbmFseXNpcy4KCmBgYHtyIHByZS1pbmMtMTRjLXBsb3R9CmFsbC4xNGMucHJlLmluYyA8LSBtZXJnZShhbGwuMTRjLnN1bS5kZlthbGwuMTRjLnN1bS5kZiRQZXJpb2QgPT0gInByZSIsIGMoIklEIiwgIkV4cGVyaW1lbnQiLCAiVHlwZSIsICJUcmVhdG1lbnQiLCAiZDE0Y19jb3JyX21lYW4iLCAiZDE0Y19jb3JyX21pbiIsICJkMTRjX2NvcnJfbWF4IildLAogICAgICAgICAgICAgICAgICAgICAgICAgYWxsLjE0Yy5zdW0uZGZbYWxsLjE0Yy5zdW0uZGYkUGVyaW9kID09ICJpbmMiLCBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiVHJlYXRtZW50IiwgImQxNGNfY29ycl9tZWFuIiwgImQxNGNfY29ycl9taW4iLCAiZDE0Y19jb3JyX21heCIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ZXMgPSBjKCJfcHJlIiwgIl9pbmMiKSkKYWxsLjE0Yy5wcmUuaW5jJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnByZS5pbmMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCAidHJlYXRtZW50IikKCmFsbC4xNGMucHJlLmluYyAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX2NvcnJfbWVhbl9wcmUsIGQxNGNfY29ycl9tZWFuX2luYywgY29sb3IgPSBUeXBlLCBzaGFwZSA9IFRyZWF0bWVudCkpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW5faW5jLCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heF9pbmMsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgd2lkdGggPSAuMjUpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19jb3JyX21pbl9wcmUsIAogICAgICAgIHhtYXggPSBkMTRjX2NvcnJfbWF4X3ByZSwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICBoZWlnaHQgPSAuOSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmR1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJjb250cm9sIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9IDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTYwLCAxMTUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTYwLCAxMTUpKSArCiAgeGxhYihleHByZXNzaW9uKCdQcmUtaW5jdWJhdGlvbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ0VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIiksCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5uICsgNH1gLiBQcmUtaW5jdWJhdGlvbiBwZXJpb2QgJFxEZWx0YSReMTReQyBhZ2FpbnN0IGVxdWlsaWJyaXVtIHJlc3BpcmF0aW9uIHBlcmlvZCAkXERlbHRhJF4xNF5DKioKCj4qQ2FwdGlvbjoqIFBvaW50cyBhcmUgbWVhbnMgb2YgbGFib3JhdG9yeSBkdXBsaWNhdGVzIGFuZCBlcnJvciBiYXJzIGFyZSB0aGUgbWluIGFuZCBtYXggKGV4Y2VwdCBmb3IgRXhwZXJpbWVudCAxIGNvbnRyb2wgc2FtcGxlcywgd2hpY2ggd2VyZSBub3QgcmVwbGljYXRlZCkuIE5vdGUgdGhhdCBwcmUtaW5jdWJhdGlvbiAkXERlbHRhJF4xNF5DIHdhcyBub3QgbWVhc3VyZWQgZm9yIHRoZSBFeHBlcmltZW50IDEgY29udHJvbCBzYW1wbGVzOyBhZGRpdGlvbmFsbHkgc2FtcGxlcyBmcm9tIHRocmVlIG9mIHRoZSBmb3Jlc3QgcGxvdHMgb2YgdGhlIEV4cGVyaW1lbnQgMSB0cmVhdG1lbnQgc2FtcGxlcyAoYWlyLWRyeSArIHN0b3JhZ2UpIGZhaWxlZCB0byBhY2N1bXVsYXRlIGVub3VnaCBDT34yfiBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCB0byBtZWFzdXJlIF4xNF5DLiBUaGUgb3V0bGllciBwb2ludCB3aXRoIHRoZSBzdWJzdGFudGlhbGx5IGRlcGxldGVkIHByZS1pbmN1YmF0aW9uICRcRGVsdGEkXjE0XkMgaXMgZnJvbSBFeHBlcmltZW50IDIgKGNvbnRyb2wpLgoKTm90ZSB0aGUgb25lIG91dGxpZXIgKGZvcmVzdCwgY29udHJvbCkgZm9yIHdoaWNoIHRoZSBwcmUtaW5jdWJhdGlvbiBDT34yfiB3YXMgc3Vic3RhbnRpYWxseSBkZXBsZXRlZCByZWxhdGl2ZSB0byBlcXVpbGlicml1bSBwZXJpb2QgcmVzcGlyYXRpb24uIEhvd2V2ZXIsIGV2ZW4gd2hlbiB0aGlzIG91dGxpZXIgd2FzIGluY2x1ZGVkIGluIHRoZSBzdGF0aXN0aWNhbCBhbmFseXNpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHByZS1pbmN1YmF0aW9uIF4xNF5DLUNPfjJ+IGFuZCBlcXVpbGlicml1bSBeMTReQy1DT34yfiB3YXMgbm90IHNpZ25pZmljYW50LiBGb3IgY2xhcml0eSwgdGhpcyBwb2ludCB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGZ1dHVyZSBwbG90cy4gRHVlIHRvIGxvd2VyIHJlc3BpcmF0aW9uIHJhdGVzIGR1cmluZyBwcmUtaW5jdWJhdGlvbiwgb25seSB0aHJlZSBvZiB0aGUgc2l4IGZvcmVzdCBzYW1wbGVzIGluIEV4cGVyaW1lbnQgMSBnZW5lcmF0ZWQgZW5vdWdoIENPfjJ+IHRvIG1lYXN1cmUgcmFkaW9jYXJib24sIGFuZCBhZGRpdGlvbmFsbHksIGl0IHdhcyBub3QgcG9zc2libGUgdG8gY29tcGFyZSBwcmUtaW5jdWJhdGlvbiBhbmQgZXF1aWxpYnJpdW0gcmVzcGlyYXRpb24gXjE0XkMtQ09+Mn4gZm9yIHRoZSBjb250cm9sIHNhbXBsZXMgaW4gRXhwZXJpbWVudCAxIHNpbmNlIHByZS1pbmN1YmF0aW9uIF4xNF5DLUNPfjJ+IHdhcyBub3QgbWVhc3VyZWQgZm9yIHRoZXNlIHNhbXBsZXMgaW4gMjAxMS4KCmBgYHtyIHByZS1lcXUtMTRjLXN0YXRzLCBpbmNsdWRlID0gRkFMU0V9CiMgZ2F0aGVyIHByZSBhbmQgaW5jIGRhdGEgZnJvbSBhbGwgcmVwcywgYXJjIGFuZCByZXdldCBleHAgb25seQpqLnZhcnMgPC0gYygiU2FtcGxlTmFtZSIsICJJRCIsICJFeHBlcmltZW50IiwgIlRyZWF0bWVudCIsICJUeXBlIiwgImQxNGNfY29yciIsICJtZ0NPMi5DX2dDIikKYXJjLnJld2V0LnByZS4xNGMgPC0gYmluZF9yb3dzKGxhcHBseShhbGwuMTRjLmxzLCBmdW5jdGlvbihkZikgewogIGlmKCFpcy5udWxsKGRmJG1nQ08yLkNfZ0MpKSB7CiAgICAgIGRmIDwtIGRmW3doaWNoKGRmJFBlcmlvZCA9PSAicHJlIiAmIGRmJEV4cGVyaW1lbnQgIT0gInRtZSIpLCBqLnZhcnNdCiAgcmV0dXJuKGRmKQogIH0KfSkpCmFyYy5yZXdldC5pbmMuMTRjIDwtIGJpbmRfcm93cyhsYXBwbHkoYWxsLjE0Yy5scywgZnVuY3Rpb24oZGYpIHsKICBpZighaXMubnVsbChkZiRtZ0NPMi5DX2dDKSkgewogIGRmIDwtIGRmW3doaWNoKGRmJFBlcmlvZCA9PSAiaW5jIiAmIGRmJEV4cGVyaW1lbnQgIT0gInRtZSIpLCBqLnZhcnNdCiAgcmV0dXJuKGRmKQogIH0KfSkpCmFyYy5yZXdldC4xNGMgPC0gbGVmdF9qb2luKGFyYy5yZXdldC5wcmUuMTRjLCBhcmMucmV3ZXQuaW5jLjE0YywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gai52YXJzWzE6NV0pCmNvbG5hbWVzKGFyYy5yZXdldC4xNGMpIDwtIGMoai52YXJzWzE6NV0sICJkMTRjX2NvcnJfcHJlIiwgImQxNGNfY29ycl9pbmMiLCAibWdDTzIuQ19nQ19wcmUiLCAibWdDTzIuQ19nQ19pbmMiKQoKYXJjLnJld2V0LjE0YyR0cmVhdC5iaSA8LSBpZmVsc2UoYXJjLnJld2V0LjE0YyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsICJ0cmVhdG1lbnQiKQoKIyMgbG9vayBhdCBpbnRlcmFjdGlvbnMKIyBFeHBlcmltZW50IDEKIyBpbnRlcmFjdGlvbiB3aXRoIFR5cGUgbnMKc3VtbWFyeShsbShkMTRjX2NvcnJfaW5jIH4gZDE0Y19jb3JyX3ByZSAqIFR5cGUsIGFyYy5yZXdldC4xNGNbYXJjLnJld2V0LjE0YyRFeHBlcmltZW50ID09ICJhcmMiLCBdKSkKCiMgRXhwZXJpbWVudCAyCiMgaW50ZXJhY3Rpb24gd2l0aCBUeXBlICogVHJlYXRtZW50IHNpZ25pZmljYW50IGR1ZSB0byBvdXRsaWVyCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBUeXBlICogVHJlYXRtZW50LCBhcmMucmV3ZXQuMTRjW2FyYy5yZXdldC4xNGMkRXhwZXJpbWVudCA9PSAicmV3ZXQiLCBdKSkKIyBidXQgZGlzYXBwZWFycyB3aGVuIGV4Y2x1ZGVkCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBUeXBlICogVHJlYXRtZW50LCBhcmMucmV3ZXQuMTRjW3doaWNoKGFyYy5yZXdldC4xNGMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgYXJjLnJld2V0LjE0YyRJRCAhPSAiSEVXMjIiKSwgXSkpCgojIGNvbWJpbmVkCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBFeHBlcmltZW50ICogVHlwZSAqIHRyZWF0LmJpLCBhcmMucmV3ZXQuMTRjKSkgIyBvdXRsaWVyCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBFeHBlcmltZW50ICogVHlwZSAqIHRyZWF0LmJpLCAKICAgICAgICAgICBhcmMucmV3ZXQuMTRjWy13aGljaChhcmMucmV3ZXQuMTRjJElEID09ICJIRVcyMiIpLCBdKSkgIyB3L28gSEVXMjIKCiMgdC50ZXN0CnQudGVzdChhcmMucmV3ZXQuMTRjJGQxNGNfY29ycl9wcmUsIGFyYy5yZXdldC4xNGMkZDE0Y19jb3JyX2luYykgIyB3LyBIRVcyMgp0LnRlc3QoYXJjLnJld2V0LjE0Y1std2hpY2goYXJjLnJld2V0LjE0YyRJRCA9PSAiSEVXMjIiKSwgImQxNGNfY29ycl9wcmUiXSwgCiAgICAgICBhcmMucmV3ZXQuMTRjWy13aGljaChhcmMucmV3ZXQuMTRjJElEID09ICJIRVcyMiIpLCAiZDE0Y19jb3JyX2luYyJdKSAjIHcvbyBIRVcyMgpgYGAKCipUcmVhdG1lbnQgZWZmZWN0cyBvbiBvYnNlcnZlZCBlcXVpbGlicml1bSBwZXJpb2QgXjE0XkMtQ09+Mn4qCgpSZWxhdGl2ZSB0byB0aGUgY29udHJvbHMgdGhlIGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCAoRXhwZXJpbWVudCAxLCBvcGVuIHNxdWFyZXMgaW4gKipGaWcuIDYqKikgbGVkIHRvIGVucmljaG1lbnQgaW4gZ3Jhc3NsYW5kIHNhbXBsZXMsIGJ1dCBkZXBsZXRpb24gaW4gZm9yZXN0IHNhbXBsZXMuIEluIGNvbnRyYXN0LCB0aGUgYWlyLWRyeSBvbmx5IHRyZWF0bWVudCAoRXhwZXJpbWVudCAyLCBvcGVuIGNpcmNsZXMsICoqRmlnLiA2KiopIGxlZCB0byBlbnJpY2htZW50IGZvciBib3RoIGZvcmVzdCBhbmQgZ3Jhc3NsYW5kIHNhbXBsZXMgKDIwMTkgcG9pbnRzKS4gVHJlYXRtZW50IGVmZmVjdHMgb24gXjE0XkMtQ09+Mn4gd2VyZSBzaWduaWZjYW50IGZvciBib3RoIGZvcmVzdHMgYW5kIGdyYXNzbGFuZCBzb2lscyBpbiBFeHBlcmltZW50IDEgKDIwMTEgcG9pbnRzLCAqKkZpZyA2KiopLCBhbmQgc2lnbmlmaWNhbnQgZm9yIGdyYXNzbGFuZCBzYW1wbGVzIGJ1dCBub3QgZm9yZXN0IHNhbXBsZXMgaW4gRXhwZXJpbWVudCAyICgyMDE5IHBvaW50cywgKipGaWcuIDYqKikuIFRoZSBtZWFuIGRpZmZlcmVuY2UgaW4gXjE0XkMtQ09+Mn4gYmV0d2VlbiBjb250cm9sIGFuZCB0cmVhdG1lbnQgc2FtcGxlcyB3YXMgZ3JlYXRlciBpbiBncmFzc2xhbmQgc2FtcGxlcyB0aGFuIGluIGZvcmVzdCBzYW1wbGVzIGZvciBib3RoIGV4cGVyaW1lbnRzIChzdGF0cz8pLiAKCiRcRGVsdGEkXjE0XkMgb2YgcmVzcGlyZWQgQ09+Mn4gd2FzIGVucmljaGVkIHJlbGF0aXZlIHRvIHRoZSBhdG1vc3BoZXJlIGZvciBhbGwgc2FtcGxlcyBpbiBib3RoIGV4cGVyaW1lbnRzLiBMb29raW5nIGFjcm9zcyBleHBlcmltZW50cywgdGhlIGRlY2xpbmUgaW4gXjE0XkMtQ09+Mn4gYmV0d2VlbiAyMDExIGFuZCAyMDE5IHBhcmFsbGVsZWQgdGhhdCBvZiBhdG1vc3BoZXJpYyBeMTReQyBmb3IgZm9yZXN0IGNvbnRyb2wgc2FtcGxlcyBhbmQgYm90aCBjb250cm9sIGFuZCB0cmVhdG1lbnQgZ3Jhc3NsYW5kIHNhbXBsZXMsIGJ1dCB3YXMgbXVjaCBzbWFsbGVyIGZvciB0aGUgZm9yZXN0IHRyZWF0bWVudCBzYW1wbGVzLgoKYGBge3IgdHJlYXRtZW50IGVmZmVjdHMgYnkgdGltZX0KIyBmaXJzdCBsb2FkIGF0bW9zcGhlcmljIGRhdGEgZnJvbSBJU1JhRCBhbmQgYmluZCBmdXR1cmUgcHJvamVjdGlvbgpEYXRtIDwtIHJiaW5kKGdyYXZlbiwgZnV0dXJlMTRDKQpEYXRtIDwtIERhdG1bRGF0bSREYXRlID4gMTkwMCwgYygiRGF0ZSIsICJOSGMxNCIpXQoKIyAjIGNvZGUgZm9yIHBsb3R0aW5nIGRhdGEgYnkgSUQKIyBhbGwuMTRjLnN1bSAlPiUKIyAgIGZpbHRlcihQZXJpb2QgPT0gImluYyIpICU+JQojICAgZmlsdGVyKCFncmVwbCgiUyIsIElEKSkgJT4lCiMgICBtdXRhdGUoeWVhci5JRCA9IHBhc3RlKFllYXJTYW1wbGVkLCBJRCkpICU+JQojICAgZ2dwbG90KC4sIGFlcyhZZWFyU2FtcGxlZCwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSkpICsKIyAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50KSwgc2l6ZSA9IDMpICsKIyAgIGdlb21fcGF0aChhZXMoZ3JvdXAgPSB5ZWFyLklEKSwgCiMgICAgICAgICAgICAgYXJyb3cgPSBhcnJvdyh0eXBlID0gIm9wZW4iLCBsZW5ndGggPSB1bml0KC4xLCAiaW5jaGVzIiksIGVuZHMgPSAibGFzdCIpLAojICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsKIyAgIGdlb21fcGF0aChkYXRhID0gRGF0bSwgYWVzKERhdGUsIE5IYzE0KSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdMYW5kIHVzZScsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiMgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKIyAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSIgPSAxLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gMTYpKSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyMDEwLCAyMDIwKSwgYnJlYWtzID0gYygyMDEzLCAyMDE2LCAyMDE5KSkgKwojICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTE1LCAxMDApKSArCiMgICB4bGFiKCdZZWFyIHNhbXBsZWQnKSArCiMgICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICBmYWNldF93cmFwKH4gSUQsIG5jb2wgPSAzKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIHBsb3Qgb3ZlciB0aW1lLCBhdmVyYWdlZCBieSBUeXBlCmFsbC4xNGMuc3VtMiAlPiUKICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKICBtdXRhdGUoeWVhci5UeXBlID0gcGFzdGUoWWVhclNhbXBsZWQsIFR5cGUpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFllYXJTYW1wbGVkLCBkMTRjX2NvcnJfbWVhbiwgY29sb3IgPSBUeXBlKSkgKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gVHJlYXRtZW50KSwgc2l6ZSA9IDMsIHN0cm9rZSA9IDEuNSkgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSB5ZWFyLlR5cGUpLCAKICAgICAgICAgICAgYXJyb3cgPSBhcnJvdyh0eXBlID0gIm9wZW4iLCBsZW5ndGggPSB1bml0KC4xLCAiaW5jaGVzIiksIGVuZHMgPSAiZmlyc3QiKSwKICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDIsIHByZXNlcnZlID0gInNpbmdsZSIpLAogICAgICAgICAgICBzaXplID0gMS4yKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBEYXRtLCBhZXMoRGF0ZSwgTkhjMTQpLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgeW1heCA9IGQxNGNfY29ycl91LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjUsCiAgICBhbHBoYSA9IC4zKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnTGFuZCB1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5IiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDIwMTAsIDIwMjApLCBicmVha3MgPSBjKDIwMTMsIDIwMTYsIDIwMTkpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTE1LCAxMDApKSArCiAgeGxhYignWWVhciBzYW1wbGVkJykgKwogIHlsYWIoZXhwcmVzc2lvbignbWVhbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFR5cGUpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKIyBGaWcuIDEgc2hvd3MgdGhlIGRpcmVjdGlvbiBvZiBtZWFuIHRyZWF0bWVudCBlZmZlY3RzIG92ZXIgdGltZSBpbiByZWZlcmVuY2UgdG8gdGhlIGF0bW9zcGhlcmUgKGdyYXkgbGluZSkuIFBvaW50cyBhcmUgbWVhbnMgKG4gPSAxMiBmb3IgMjAxMSB0cmVhdG1lbnQgcG9pbnRzLCBuID0gOSBmb3IgMjAxMSBjb250cm9sIHBvaW50czsgbiA9IDYgZm9yIGFsbCAyMDE5IHBvaW50cyk7IGVycm9yIGJhcnMgPSAyeCBzdGQuIGVyci4gb2YgdGhlIG1lYW4uCgpgYGAKPioqRmlnIGByIHtmaWcubiArIDV9YC4gVHJlYXRtZW50IGVmZmVjdCBvbiBvYnNlcnZlZCAkXERlbHRhJF4xNF5DLUNPfjJ+IG92ZXIgdGltZSAoRXhwZXJpbWVudHMgMSBhbmQgMikqKgoKPipDYXB0aW9uOiogRmlsbGVkIGNpcmNsZXMgc2hvdyBeMTReQy1DT34yfiBvYnNlcnZlZCBmb3IgY29udHJvbCBzYW1wbGVzLCB3aGlsZSBvcGVuIHN5bWJvbHMgc2hvdyBeMTReQy1DT34yfiBvYnNlcnZlZCBmb3IgdHJlYW1lbnQgc2FtcGxlcyAob3BlbiBzcXVhcmVzID0gYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50LCBFeHBlcmltZW50IDE7IG9wZW4gY2lyY2xlcyA9IGFpci1kcnkgb25seSB0cmVhdG1lbnQsIEV4cGVyaW1lbnQgMikuIEFycm93cyBzaG93IHRoZSBkaXJlY3Rpb24gb2YgY2hhbmdlIGluIF4xNF5DLUNPfjJ+IHJlbGF0aXZlIHRvIHRoZSBjb250cm9scy4gUG9pbnRzIGFyZSBtZWFucyBhbmQgZXJyb3IgYmFycyBzaG93IDJ4IHN0YW5kYXJkIGVycm9yLiBUaGUgZ3JheSBsaW5lIHNob3dzICRcRGVsdGEkXjE0XkMgb2YgdGhlIGF0bW9zcGhlcmUuCgpgYGB7ciBzaWRlLWJ5LXNpZGUgcGxvdCwgaW5jbHVkZSA9IEZBTFNFfQojIHBsb3QgYXMgc2lkZS1ieS1zaWRlIG1lYW5zIHcvIDJ4U0UKIyB3aWxsIGNoYW5nZSB0byA5NSVDSXMgYXQgc29tZSBwb2ludCwgYnV0IG5lZWQgdG8gY2FsY3VsYXRlIHRlc3Qgc3RhdGlzdGljIHdpdGggYXBwcm9wcmlhdGUgZGYKYWxsLjE0Yy5zdW0yICU+JQogIGZpbHRlcihQZXJpb2QgPT0gImluYyIpICU+JQogIGdncGxvdCguLCBhZXModHJlYXQuYmksIGQxNGNfY29ycl9tZWFuLCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBUcmVhdG1lbnQpLCBzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl91LCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX2wsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgd2lkdGggPSAuMSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmQgdXNlJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNikpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwgcm93cyA9IHZhcnMoWWVhclNhbXBsZWQpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpCgpgYGAKCgoqRWZmZWN0IG9mIGN1bXVsYXRpdmUgcmVzcGlyZWQgY2FyYm9uIG9uIF4xNF5DT34yfioKCmBgYHtyIGMtcmVzcGlyZWQtMTRjLWRpZi1zdGF0cywgaW5jbHVkZSA9IEZBTFNFfQphcmMucmV3ZXQuMTRjLnRydCA8LSBhcmMucmV3ZXQuMTRjW2FyYy5yZXdldC4xNGMkdHJlYXQuYmkgPT0gInRyZWF0bWVudCIsIF0KYXJjLnJld2V0LjE0Yy5jdGwgPC0gYXJjLnJld2V0LjE0Y1thcmMucmV3ZXQuMTRjJHRyZWF0LmJpID09ICJjb250cm9sIiwgXQphcmMucmV3ZXQuMTRjLjIgPC0gYXJjLnJld2V0LjE0Y1ssIGMoMTozLCA0KV0KYXJjLnJld2V0LjE0Yy4yJGRpZi4xNGMgPC0gYXJjLnJld2V0LjE0Yy50cnQkZDE0Y19jb3JyX2luYyAtIGFyYy5yZXdldC4xNGMuY3RsJGQxNGNfY29ycl9pbmMKCmBgYApbbWF5YmUgZXhwYW5kIHdpdGggc3RhdHMgZm9yIG90aGVyIGV4cGxhbmF0b3J5IGZhY3RvcnM/IGUuZy4gdGV4dHVyZSwgTiBjb250ZW50LCBldGMuLi5dCgpXZSBsb29rZWQgYXQgdGhlIHBvc3NpYmxlIGVmZmVjdCBvZiB0aGUgYW1vdW50IG9mIGNhcmJvbiByZXNwaXJlZCBvbiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb250cm9sIGFuZCB0cmVhdG1lbnQgXjE0XkMtQ09+Mn4gd2l0aCBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIGFuZCBmb3VuZCB0aGF0IHRoZSBkaWZmZXJlbmNlIGluIHJlc3BpcmVkIGNhcmJvbiAobWcgQ09+Mn4tQyBnIHNvaWwgQ14tMSkgd2FzIG5vdCBhIHNpZ25pZmljYW50IHByZWRpY3Rvci4gVGhpcyBjYW4gYWxzbyBiZSBzZWVuIGJ5IHRoZSByZWxhdGl2ZWx5IGZsYXQgc2xvcGUgb2YgdGhlIGxpbmVzIGNvbm5lY3RpbmcgcGFpcnMgb2YgcG9pbnRzIGluICoqRmlnLiA3KiouCgpgYGB7ciBwbG90LTE0Yy1ieS1jLXJlc3B9CiMgMTAuIFBsb3QgJFxEZWx0YSReMTReQyBhZ2FpbnN0IHByb3BvcnRpb24gb2Ygc29pbCBDIHJlc3BpcmVkIGJ5IGV4cGVyaW1lbnQsIGxhbmQgY292ZXIsIGFuZCBzYW1wbGluZyBwZXJpb2QuCiMgY29sbGFwc2UgdHJlYXRtZW50IHZhcmlhYmxlIGludG8gYmluYXJ5IGNvbnRyb2wvdHJlYXRtZW50CmFsbC4xNGMuc3VtLmRmJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnN1bS5kZiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsICJ0cmVhdG1lbnQiKQoKIyBIRVcyMiBjb250cm9sIHByZSBwb2ludCBleGNsdWRlZCB0byBtYWtlIGZpZ3VyZSBtb3JlIHJlYWRhYmxlIAphbGwuMTRjLnN1bS5kZiAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIikgJT4lCiAgbXV0YXRlKElELnRyZWF0ID0gcGFzdGUoSUQsIFRyZWF0bWVudCkpICU+JQogIG11dGF0ZShJRC50cmVhdC5QZXJpb2QgPSBwYXN0ZShJRC50cmVhdCwgUGVyaW9kKSkgJT4lCiAgZmlsdGVyKElELnRyZWF0LlBlcmlvZCAhPSAiSEVXMjIgY29udHJvbCBwcmUiKSAlPiUKICBtdXRhdGUodHJlYXQuUGVyaW9kID0gcGFzdGUodHJlYXQuYmksIFBlcmlvZCkpICU+JQogIGdncGxvdCguLCBhZXMobWdDTzIuQ19nQ19tZWFuLCBkMTRjX2NvcnJfbWVhbiwgY29sb3IgPSBUeXBlLCBzaGFwZSA9IHRyZWF0LlBlcmlvZCkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGFlcyhncm91cCA9IElELnRyZWF0KSkgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW4sIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbWF4LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjI1KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IG1nQ08yLkNfZ0NfbWluLCAKICAgICAgICB4bWF4ID0gbWdDTzIuQ19nQ19tYXgsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdMYW5kdXNlJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnU2FtcGxpbmcgcGVyaW9kICh0cmVhdG1lbnQpJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKDE2LCAxNywgMSwgMiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvbnRyb2wgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGNvbnRyb2wpJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wgaW5jIiA9ICdlcXVpbGlicml1bSByZXNwaXJhdGlvblxuKGNvbnRyb2wpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IHByZSIgPSAncHJlLWluY3ViYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyZWF0bWVudCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oYWlyLWRyeS9haXItZHJ5ICsgc3RvcmFnZSknKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoVHlwZSksIHJvd3MgPSB2YXJzKFllYXJTYW1wbGVkKSkgKwogIHhsYWIoZXhwcmVzc2lvbignUmVzcGlyZWQgQyAobWdDTydbMl0qJy1DJyonIGcgc29pbCBDJ14tMSonKScpKSArCiAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIikpCmBgYAoKPioqRmlnLiBgciB7ZmlnLm4gKyA2fWAuIENoYW5nZSBpbiBeMTReQy1DT34yfiBpbiByZWxhdGlvbiB0byBjdW11bGF0aXZlIHNvaWwgY2FyYm9uIHJlc3BpcmVkKioKCj4qQ2FwdGlvbjoqIAoKCiogRmlyc3QgZmlndXJlIHNob3dzIGRhdGEgYXZlcmFnZWQgYnkgcGxvdAoqIChOb3RlIHRoYXQgcHJlLWluY3ViYXRpb24gJFxEZWx0YSReMTReQyB3YXMgbm90IG1lYXN1cmVkIGZvciB0aGUgMjAxMSBjb250cm9sIHNhbXBsZXMpCiogTGltaXRzIGV4Y2x1ZGUgb3V0bGllciBwb2ludCAoSEVXMjIgY29udHJvbCBwcmUtaW5jdWJhdGlvbikgZm9yIGltcHJvdmVkIGxlZ2liaWxpdHkKCmBgYHtyIHBsb3QgQyByZXNwIHZzIDE0QyBhdmVyYWdlZCBieSBsYW5kIHVzZSBhbmQgdHJlYXRtZW50LCBpbmNsdWRlID0gRkFMU0V9CiMgQWx0ZXJuYXRlIEMtcmVzcCB4IDE0YyBmaWc6IGRhdGEgYXZlcmFnZWQgYnkgbGFuZCB1c2UgYW5kIHRyZWF0bWVudCB3aXRoaW4gc2FtcGxpbmcgcGVyaW9kcwoKIyBhdmVyYWdlIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBkYXRhCiMgcmVtb3ZlIEhFVzIyIGNvbnRyb2wgcHJlCiMgbm90ZSB0aGF0IHVwcGVyL2xvd2VyIGxpbWl0cyA9IDJ4U0UKYWxsLjE0Yy5zdW0yIDwtIGFsbC4xNGMubHNbWzJdXSAlPiUKICBtdXRhdGUoSUQudHJlYXQuUGVyaW9kID0gcGFzdGUoSUQsIFRyZWF0bWVudCwgUGVyaW9kKSkgJT4lCiAgZmlsdGVyKElELnRyZWF0LlBlcmlvZCAhPSAiSEVXMjIgY29udHJvbCBwcmUiKSAlPiUKICBzZWxlY3QoVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIFllYXJTYW1wbGVkLCBkMTRjX2NvcnIsIG1nQ08yLkNfZ0MpICU+JQogIGdyb3VwX2J5KFR5cGUsIFBlcmlvZCwgVHJlYXRtZW50LCBFeHBlcmltZW50LCBZZWFyU2FtcGxlZCkgJT4lCiAgYWRkX2NvdW50KCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoZDE0Y19jb3JyX3NlID0gZDE0Y19jb3JyX3NkL25fbWVhbiwKICAgICAgICAgZDE0Y19jb3JyX3UgPSBkMTRjX2NvcnJfbWVhbiArIGQxNGNfY29ycl9zZSoyLAogICAgICAgICBkMTRjX2NvcnJfbCA9IGQxNGNfY29ycl9tZWFuIC0gZDE0Y19jb3JyX3NlKjIsCiAgICAgICAgIG1nQ08yLkNfZ0Nfc2UgPSBtZ0NPMi5DX2dDX3NkL25fbWVhbiwKICAgICAgICAgbWdDTzIuQ19nQ191ID0gbWdDTzIuQ19nQ19tZWFuICsgbWdDTzIuQ19nQ19zZSoyLAogICAgICAgICBtZ0NPMi5DX2dDX2wgPSBtZ0NPMi5DX2dDX21lYW4gLSBtZ0NPMi5DX2dDX3NlKjIpIAoKYWxsLjE0Yy5zdW0yJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnN1bTIkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCJ0cmVhdG1lbnQiKQphbGwuMTRjLnN1bTIgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1nQ08yLkNfZ0NfbWVhbiwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSwgc2hhcGUgPSB0cmVhdC5QZXJpb2QpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogICMgZ2VvbV9wYXRoKGFlcyhncm91cCA9IFRyZWF0bWVudCkpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfdSwgCiAgICAgICAgeW1heCA9IGQxNGNfY29ycl9sLCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjI1KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IG1nQ08yLkNfZ0NfdSwgCiAgICAgICAgeG1heCA9IG1nQ08yLkNfZ0NfbCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICBoZWlnaHQgPSAuOSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0xhbmR1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdTYW1wbGluZyBwZXJpb2QgKHRyZWF0bWVudCknLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoMTYsIDE3LCAxLCAyKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCBwcmUiID0gJ3ByZS1pbmN1YmF0aW9uXG4oY29udHJvbCknLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oY29udHJvbCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGFpci1kcnkvYWlyLWRyeSArIHN0b3JhZ2UpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IGluYyIgPSAnZXF1aWxpYnJpdW0gcmVzcGlyYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwgcm93cyA9IHZhcnMoWWVhclNhbXBsZWQpKSArCiAgeGxhYihleHByZXNzaW9uKCdSZXNwaXJlZCBDIChtZ0NPJ1syXSonLUMnKicgZyBzb2lsIEMnXi0xKicpJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSkKYGBgCgpgYGB7ciBwbG90IDE0YyBieSBjIHJlc3Agd2l0aCBvdXRsaWVyLCBpbmNsdWRlID0gRkFMU0V9CiMgQ29kZSBmb3IgYSB0aGlyZCBwbG90IHdpdGggb3V0bGllciBkYXRhCiMgYXZlcmFnZSBjb250cm9sIGFuZCB0cmVhdG1lbnQgZGF0YQphbGwuMTRjLnN1bTMgPC0gc2VsZWN0KGFsbC4xNGMubHNbWzJdXSwgVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIFllYXJTYW1wbGVkLCBkMTRjX2NvcnIsIG1nQ08yLkNfZ0MpICU+JQogIGdyb3VwX2J5KFR5cGUsIFBlcmlvZCwgVHJlYXRtZW50LCBFeHBlcmltZW50LCBZZWFyU2FtcGxlZCkgJT4lCiAgYWRkX2NvdW50KCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoZDE0Y19jb3JyX3NlID0gZDE0Y19jb3JyX3NkL25fbWVhbiwKICAgICAgICAgZDE0Y19jb3JyX3UgPSBkMTRjX2NvcnJfbWVhbiArIGQxNGNfY29ycl9zZSoyLAogICAgICAgICBkMTRjX2NvcnJfbCA9IGQxNGNfY29ycl9tZWFuIC0gZDE0Y19jb3JyX3NlKjIsCiAgICAgICAgIG1nQ08yLkNfZ0Nfc2UgPSBtZ0NPMi5DX2dDX3NkL25fbWVhbiwKICAgICAgICAgbWdDTzIuQ19nQ191ID0gbWdDTzIuQ19nQ19tZWFuICsgbWdDTzIuQ19nQ19zZSoyLAogICAgICAgICBtZ0NPMi5DX2dDX2wgPSBtZ0NPMi5DX2dDX21lYW4gLSBtZ0NPMi5DX2dDX3NlKjIpIAoKYWxsLjE0Yy5zdW0zJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnN1bTMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCJ0cmVhdG1lbnQiKQphbGwuMTRjLnN1bTMgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1nQ08yLkNfZ0NfbWVhbiwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSwgc2hhcGUgPSB0cmVhdC5QZXJpb2QpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX3UsIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBtZ0NPMi5DX2dDX3UsIAogICAgICAgIHhtYXggPSBtZ0NPMi5DX2dDX2wsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdMYW5kdXNlJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnU2FtcGxpbmcgcGVyaW9kICh0cmVhdG1lbnQpJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKDE2LCAxNywgMSwgMiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvbnRyb2wgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGNvbnRyb2wpJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wgaW5jIiA9ICdlcXVpbGlicml1bSByZXNwaXJhdGlvblxuKGNvbnRyb2wpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IHByZSIgPSAncHJlLWluY3ViYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyZWF0bWVudCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oYWlyLWRyeS9haXItZHJ5ICsgc3RvcmFnZSknKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoVHlwZSksIHJvd3MgPSB2YXJzKFllYXJTYW1wbGVkKSkgKwogIHhsYWIoZXhwcmVzc2lvbignUmVzcGlyZWQgQyAobWdDTydbMl0qJy1DJyonIGcgc29pbCBDJ14tMSonKScpKSArCiAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIikpCmBgYAoKIyMgU3RvcmFnZSBkdXJhdGlvbiBlZmZlY3Qgb24gXjE0XkMtQ09+Mn4gKEV4cGVyaW1lbnQgMykKCjE2LiBTaG93IHRoZSBlZmZlY3Qgb2Ygc3RvcmFnZSBkdXJhdGlvbiBieSBwbG90dGluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBeMTReQyBhcyBhIGZ1bmN0aW9uIG9mIHN0b3JhZ2UgZHVyYXRpb24uIEhvd2V2ZXIsIHRoZSBleHBlY3RlZCBDdGwtVHJ0IGRpZmZlcmVuY2Ugd291bGQgYWxzbyBsaWtlbHkgaGF2ZSBhIHRyZW5kIG92ZXIgdGltZS4gUGVyaGFwcyBwbG90IGFuIGV4cGVjdGVkIHRyZW5kLi4uPyBOb3Qgc3VyZSBob3cgbXVjaCB0aGlzIG1hdHRlcnMuCiogQXMgcHJldmlvdXNseSwgZGFzaGVkIGFuZCBkb3R0ZWQgbGluZXMgYXJlIHBsb3R0ZWQgdG8gZ2l2ZSBhIHNlbnNlIG9mIGVycm9yIGludHJvZHVjZWQgYnkgdGhlIHRyZWF0bWVudCBieSBzaG93aW5nIGEgZGlmZmVyZW5jZSBvZiAyMOKAsCBhbmQgNDDigLAgKHJvdWdobHkgZXF1aXZhbGVudCB0byB0aGUgYXRtb3NwaGVyaWMgZGVjbGluZSBvdmVyIGZpdmUgYW5kIDEwIHllYXJzIHJlc3BlY3RpdmVseSBmb3IgdGhlIHBlcmlvZCAyMDAwIHRvIDIwMjApCiogUG9zaXRpb24gb2YgcG9pbnRzIGppdHRlcmVkIHRvIGF2b2lkIG92ZXJwbG90dGluZzsgc3RvcmFnZSBkdXJhdGlvbiBoYXMgYmVlbiByb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3Qgd2hvbGUgeWVhcgoqIEluIGdlbmVyYWwsIHRoZSB0cmVuZCBpbiB0aGUgZGlmZmVyZW5jZXMgZHVlIHRvIHRyZWF0bWVudCBmb3IgdGhlIGhpZ2hseSBlbnJpY2hlZCBzYW1wbGVzIGZyb20gT2FrIFJpZGdlLCBUTiBzdWdnZXN0IGxvc3NlcyBvZiB0aGUgbW9zdCByZWNlbnRseSBmaXhlZCBjYXJib24gb3ZlciB0aGUgZHVyYXRpb24gb2Ygc3RvcmFnZQogICAgKyBUaGVzZSBzYW1wbGVzIHdlcmUgaW5jbHVkZWQgcHJpbWFyaWx5IGJlY2F1c2UgaXQgd2FzIGFzc3VtZWQgdGhhdCB0aGV5IHdvdWxkIGJlIG1vcmUgc2Vuc2l0aXZlIHRvIHBvdGVudGlhbCBsb3NzZXMgb2YgcmVjZW50bHkgZml4ZWQgY2FyYm9uLCBhcyB0aGUgbGFiZWwgc2hvdWxkIG9ubHkgYmUgcHJlc2VudCBpbiB0aGlzIHBvb2wgb2Ygc29pbCBDCiAgICArIEhvd2V2ZXIsIGluIGNvbnRyYXN0LCB0aGVyZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGV2aWRlbmNlIGZvciBhIHN0b3JhZ2UgZHVyYXRpb24gZWZmZWN0IGluIHRoZSBzYW1wbGVzIHRoYXQgb25seSBjb250YWluIGJvbWItQwpgYGB7cn0KIyBGaXJzdCBhZGQgWWVhclNhbXBsZWQgYW5kIFllYXJNZWFzdXJlZCBjb2x1bW5zCmFsbC4xNGMuY3RsLnRydCRZZWFyU2FtcGxlZCA8LSB1bmxpc3QoYWxsLjE0Yy5zdW0uZGZbbWF0Y2goYWxsLjE0Yy5jdGwudHJ0JElELCBhbGwuMTRjLnN1bS5kZiRJRCksICJZZWFyU2FtcGxlZCJdKQojIGNvcnJlY3QgYXJjaGl2ZSBzYW1wbGUgWWVhclNhbXBsZWQKYWxsLjE0Yy5jdGwudHJ0W2FsbC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJhcmMiICYgYWxsLjE0Yy5jdGwudHJ0JFNpdGUgPT0gIkhhaW5pY2giLCAiWWVhclNhbXBsZWQiXSA8LSAyMDExCgojIGFkZCB5ZWFyIG1lYXN1cmVkIGNvbHVtbiwgbW9kaWZ5IGZvciB0bWUubWlzYyBzYW1wbGVzLCByZXdldCBzYW1wbGVzCmFsbC4xNGMuY3RsLnRydCRZZWFyTWVhc3VyZWQgPC0gMjAxOAphbGwuMTRjLmN0bC50cnRbYWxsLjE0Yy5jdGwudHJ0JEV4cGVyaW1lbnQgPT0gInJld2V0IiwgIlllYXJNZWFzdXJlZCJdIDwtIDIwMTkKYWxsLjE0Yy5jdGwudHJ0W3doaWNoKGFsbC4xNGMuY3RsLnRydCRJRCAlaW4lIHRtZS5taXNjJElEKSwgIlllYXJNZWFzdXJlZCJdIDwtIDIwMDkKCiMgY2FsY3VsYXRlIHN0b3JhZ2UgZHVyYXRpb24gbnVtZXJpY2FsbHkgYW5kIGFzIGZhY3RvcgphbGwuMTRjLmN0bC50cnQkdG1lIDwtIHVubGlzdChhbGwuMTRjLmN0bC50cnQkWWVhck1lYXN1cmVkIC0gYWxsLjE0Yy5jdGwudHJ0JFllYXJTYW1wbGVkKQphbGwuMTRjLmN0bC50cnQkdG1lLmYgPC0gZmFjdG9yKGFsbC4xNGMuY3RsLnRydCR0bWUpCgojIGFkZCBkaWZmZXJlbmNlIGNvbHVtbgojIChleHByZXNzZWQgYXMgZGlmZmVyZW5jZSBvZiBtZWFucykKYWxsLjE0Yy5jdGwudHJ0JGN0bC50cnQuZDE0IDwtIGFsbC4xNGMuY3RsLnRydCRkMTRjX2NvcnJfbWVhbl9jdGwgLSBhbGwuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW5fdHJ0CgojICMgYWRkIGF0bSAxNEMgZm9yIHllYXIgc2FtcGxlZCBhbmQgY2FsY3VsYXRlIGRlbHRhLWRlbHRhCiMgYWxsLjE0Yy5jdGwudHJ0JGF0bS55ci5zYW1wbGVkIDwtIERhdG1bbWF0Y2goYWxsLjE0Yy5jdGwudHJ0JFllYXJTYW1wbGVkLCBmbG9vcihEYXRtJERhdGUpKSwgIk5IYzE0Il0KIyBhbGwuMTRjLmN0bC50cnQkZGQuY3RsIDwtIGFsbC4xNGMuY3RsLnRydCRkMTRjX2NvcnJfbWVhbl9jdGwgLSBhbGwuMTRjLmN0bC50cnQkYXRtLnlyLnNhbXBsZWQKIyBhbGwuMTRjLmN0bC50cnQkZGQudHJ0IDwtIGFsbC4xNGMuY3RsLnRydCRkMTRjX2NvcnJfbWVhbl90cnQgLSBhbGwuMTRjLmN0bC50cnQkYXRtLnlyLnNhbXBsZWQKIyBhbGwuMTRjLmN0bC50cnQkY3RsLnRydC5kZDE0IDwtIGFsbC4xNGMuY3RsLnRydCRkZC5jdGwgLSBhbGwuMTRjLmN0bC50cnQkZGQudHJ0CgojIFBsb3Qgc3RvcmFnZSBkdXJhdGlvbgpzdXBwcmVzc1dhcm5pbmdzKAogIGFsbC4xNGMuY3RsLnRydCAlPiUKICBmaWx0ZXIoSG9yaXpvbiA9PSAiQSIpICU+JQogIGZpbHRlcihFeHBlcmltZW50ICE9ICJyZXdldCIpICU+JQogIHNlbGVjdChUeXBlLCB0bWUuZiwgU2l0ZSwgY3RsLnRydC5kMTQsIHRtZSkgJT4lCiAgZ3JvdXBfYnkoVHlwZSwgdG1lLmYsIFNpdGUpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKGRpZl9zZSA9IGN0bC50cnQuZDE0X3NkL25fbWVhbiwKICAgICAgICAgZGlmX3UgPSBjdGwudHJ0LmQxNF9tZWFuICsgZGlmX3NlKjIsCiAgICAgICAgIGRpZl9sID0gY3RsLnRydC5kMTRfbWVhbiAtIGRpZl9zZSoyKSAlPiUKICBtdXRhdGUoTG9jYXRpb24gPSBmYWN0b3IocmVjb2RlKFNpdGUsICEhIWxvYyksIGV4Y2x1ZGUgPSBUUlVFKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh0bWVfbWVhbiwgY3RsLnRydC5kMTRfbWVhbiwgY29sb3IgPSBMb2NhdGlvbiwgc2hhcGUgPSBUeXBlKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDQwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTQwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMywgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZTIod2lkdGggPSAuNywgcHJlc2VydmUgPSAic2luZ2xlIikpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkaWZfbCwKICAgICAgICB5bWF4ID0gZGlmX3UsIAogICAgICAgIGNvbG9yID0gTG9jYXRpb24pLAogICAgd2lkdGggPSAuNywKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKHdpZHRoID0gLjcsIHByZXNlcnZlID0gInNpbmdsZSIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoJ0R1a2UsIE5DJyA9ICcjMDFCQjk3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2llcnJhIE5ldmFkYSwgQ0EnID0gJyNGRkMxMDcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDZW50cmFsIEdlcm1hbnknID0gJ2JsYWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSGFydmFyZCwgTUEnID0gJyMxRTg4RTUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPYWsgUmlkZ2UsIFROJyA9ICcjRDgxQjYwJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdMYW5kIHVzZScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0YnPSAxNywnRycgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgeWxhYihleHByZXNzaW9uKCdDb250cm9sIC0gVHJlYXRtZW50ICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHhsYWIoIlN0b3JhZ2UgZHVyYXRpb24gKHllYXJzKSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQogICkKYGBgCgo+KipGaWcuIGByIHtmaWcubiArIDd9YC4gQ2hhbmdlIGluIF4xNF5DLUNPfjJ+IGluIHJlbGF0aW9uIHRvIGN1bXVsYXRpdmUgc29pbCBjYXJib24gcmVzcGlyZWQqKgoKPipDYXB0aW9uOiogCgojIyBUcmVhdG1lbnQgZWZmZWN0IG9uIDE0Qy1DTzIgZm9yIGFsbCBzYW1wbGVzIChFeHBlcmltZW50cyAxLCAyLCBhbmQgMykKCk5vdGVzOiAKU2hvdyBvdmVyYWxsIGVmZmVjdCBvZiB0cmVhdG1lbnQgb24gd2hvbGUgZGF0YSBzZXQuCiogTm90ZXM6CiAgICArIENvbnRyb2wgZGF0YSBzaG93biBvbiB4LWF4aXMsIHRyZWF0bWVudCBkYXRhIHNob3duIG9uIHktYXhpcwogICAgKyBTb2xpZCBsaW5lIGlzIDE6MSwgZGFzaGVkIGxpbmUgaXMgYSAyMCDigLAgb2Zmc2V0LCBhbmQgZG90dGVkIGxpbmUgaXMgYSA0MOKAsCBvZmZzZXQgKHJvdWdobHkgZXF1aXZhbGVudCB0byB0aGUgYXRtb3NwaGVyaWMgZGVjbGluZSBvdmVyIGZpdmUgYW5kIDEwIHllYXJzIHJlc3BlY3RpdmVseSBmb3IgdGhlIHBlcmlvZCAyMDAwIHRvIDIwMjApCiAgICArIERhdGEgZnJvbSBhbGwgdGhyZWUgZXhwZXJpbWVudHMgY29uZHVjdGVkIGluIHRoaXMgc3R1ZHkgYXJlIHNob3duLCBhcyB3ZWxsIGFzIGEgaGFuZGZ1bCBvZiBhZGRpdGlvbmFsIGRhdGEgcG9pbnRzIGZvciB3aGljaCBib3RoIGNvbnRyb2wgYW5kIHRyZWF0bWVudCAoaS5lLiBhZnRlciBhaXItZHJ5aW5nICsgc3RvcmFnZSkgaW5jdWJhdGlvbnMgd2VyZSBjb25kdWN0ZWQgaW4gYW5vdGhlciBsYWJvcmF0b3J5IChIYXJ2YXJkIHBvaW50cykKICAgICsgT25seSBBIGhvcml6b24gZGF0YSBhcmUgc2hvd24gaGVyZSwgYXMgb3dpbmcgdG8gc2FtcGxlIGF2YWlsYWJpbGl0eW9ubHkgdGhyZWUgc2FtcGxlcyB3ZXJlIGFuYWx5emVkIGZvciBvcmdhbmljIGFuZCBCIGhvcml6b25zIChyZXNwZWN0aXZlbHkpIAogICAgKyBQb2ludHMgYXJlIG1lYW5zIG9mIHJlcGxpY2F0ZXMgYW5kIGVycm9yIGJhcnMgYXJlIG1pbiBhbmQgbWF4IG9mIHJlcGxpY2F0ZXMgKG51bWJlciBvZiByZXBsaWNhdGVzIHZhcmllcyBmcm9tIDEgdG8gMyk7IG5vdGUgdGhhdCBlcnJvciBiYXJzIGFyZSBub3QgdmlzaWJsZSBhdCB0aGlzIHNjYWxlIGZvciBtb3N0IHBvaW50cyAKKiBLZXkgbWVzc2FnZXM6CiAgICArIERpZmZlcmVuY2UgYmV0d2VlbiBjb250cm9sIGFuZCB0cmVhdG1lbnQgc2FtcGxlcyBpcyB3aXRoaW4gYSA1IHllYXIgcmFuZ2UgZm9yIHRoZSBtYWpvcml0eSBvZiBwb2ludHMKICAgICsgR3Jhc3NsYW5kIHNhbXBsZXMgdGVuZCB0byBiZSBhYm92ZSAxOjEgbGluZSwgZm9yZXN0IHNhbXBsZXMgYmVsb3csIHJlZ2FyZGxlc3Mgb2Ygc2l0ZQogICAgKyBUaGUgdGhyZWUgR2VybWFuIGZvcmVzdCBzYW1wbGVzIGFib3ZlIDE6MSBsaW5lIHdlcmUgYW5hbHl6ZWQgaW4gMjAxOSAoYWlyLWRyeSBvbmx5IHRyZWF0bWVudCwgdGhpcyBzdHVkeSksIGxlbmRpbmcgc3VwcG9ydCB0byB0aGUgaW50ZXJwcmV0YXRpb24gdGhhdCBzbG93IGFuZCBmYXN0IHNvaWwgQyBwb29sIGN1cnZlcyBmb3Igbm9ydGhlcm4gaGVtaXNwaGVyZSBmb3Jlc3Qgc2FtcGxlcyBoYXZlIG9ubHkgcmVjZW50bHkgY3Jvc3NlZCBvciBtYXkgaGF2ZSB5ZXQgdG8gY3Jvc3MuCmBgYHtyIHBsb3QgY3RsIHZzIHRydH0KIyBGaWx0ZXIgdG8gImluYyIsIHNwbGl0IGJ5IGJpbmFyeSB0cmVhdG1lbnQgdmFyaWFibGUsIHRoZW4gbWVyZ2UKYWxsLjE0Yy5jdGwgPC0gYWxsLjE0Yy5zdW0uZGZbYWxsLjE0Yy5zdW0uZGYkdHJlYXQuYmkgPT0gImNvbnRyb2wiICYgYWxsLjE0Yy5zdW0uZGYkUGVyaW9kID09ICJpbmMiLCBdCmFsbC4xNGMuY3RsIDwtIHJlbmFtZV9hdChhbGwuMTRjLmN0bCwgdmFycyhjb250YWlucygnZDE0YycpKSwgbGlzdCh+cGFzdGUwKC4sICJfY3RsIikpKQphbGwuMTRjLnRydCA8LSBhbGwuMTRjLnN1bS5kZlthbGwuMTRjLnN1bS5kZiR0cmVhdC5iaSA9PSAidHJlYXRtZW50IiAmIGFsbC4xNGMuc3VtLmRmJFBlcmlvZCA9PSAiaW5jIiwgXQphbGwuMTRjLnRydCA8LSByZW5hbWVfYXQoYWxsLjE0Yy50cnQsIHZhcnMoY29udGFpbnMoJ2QxNGMnKSksIGxpc3QofnBhc3RlMCguLCAiX3RydCIpKSkKYWxsLjE0Yy5jdGwudHJ0IDwtIGlubmVyX2pvaW4oZGF0YS5mcmFtZShhbGwuMTRjLmN0bCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChJRCwgRXhwZXJpbWVudCwgVHlwZSwgU2l0ZSwgSG9yaXpvbiwgY29udGFpbnMoImQxNGNfY29yciIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mcmFtZShhbGwuMTRjLnRydCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChJRCwgRXhwZXJpbWVudCwgVHlwZSwgU2l0ZSwgSG9yaXpvbiwgY29udGFpbnMoImQxNGNfY29yciIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiU2l0ZSIsICJIb3Jpem9uIikpCgojIFBsb3Qgb24gMToxIGxpbmUgdy8gZGlhZ29uYWwgbGluZXMgc2hvd2luZyDigLAgb2Zmc2V0cwojIGZpcnN0IGNvbGxhcHNlIHNpdGVzIGZvciBiZXR0ZXIgdmlzdWFscwoKbG9jIDwtIGxpc3QoCiAgICAiRHVrZSIgPSAiRHVrZSwgTkMiLAogICAgIkhvd2xhbmQiID0gIkhvd2xhbmQsIE1FIiwKICAgICJIYXJ2YXJkIiA9ICJIYXJ2YXJkLCBNQSIsCiAgICAiSGFpbmljaCIgPSAiQ2VudHJhbCBHZXJtYW55IiwKICAgICJTY2hvcmZoZWlkZSIgPSAiQ2VudHJhbCBHZXJtYW55IiwKICAgICJNdXNpY2siID0gIlNpZXJyYSBOZXZhZGEsIENBIiwKICAgICJTaGF2ZXIiID0gIlNpZXJyYSBOZXZhZGEsIENBIiwKICAgICJXYWxrZXIgQnJhbmNoIiA9ICJPYWsgUmlkZ2UsIFROIiwKICAgICJUZW5uZXNzZWUgVmFsbGV5IiA9ICJPYWsgUmlkZ2UsIFROIikKCmFsbC4xNGMuY3RsLnRydCAlPiUKICBmaWx0ZXIoSG9yaXpvbiA9PSAiQSIpICU+JQogIG11dGF0ZShMb2NhdGlvbiA9IHJlY29kZShTaXRlLCAhISFsb2MpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGNfY29ycl9tZWFuX2N0bCwgZDE0Y19jb3JyX21lYW5fdHJ0LCBjb2xvciA9IExvY2F0aW9uLCBzaGFwZSA9IFR5cGUpKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDIwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtNDAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDQwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiZ3JheSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbWluX3RydCwgCiAgICAgICAgeW1heCA9IGQxNGNfY29ycl9tYXhfdHJ0LCAKICAgICAgICBjb2xvciA9IExvY2F0aW9uKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2NvcnJfbWluX2N0bCwgCiAgICAgICAgeG1heCA9IGQxNGNfY29ycl9tYXhfY3RsLCAKICAgICAgICBjb2xvciA9IExvY2F0aW9uKSwgCiAgICBoZWlnaHQgPSAuOSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCdEdWtlLCBOQycgPSAnIzAxQkI5NycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NpZXJyYSBOZXZhZGEsIENBJyA9ICcjRkZDMTA3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2VudHJhbCBHZXJtYW55JyA9ICdibGFjaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hhcnZhcmQsIE1BJyA9ICcjMUU4OEU1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT2FrIFJpZGdlLCBUTicgPSAnI0Q4MUI2MCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnTGFuZCB1c2UnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCdGJz0gMTcsJ0cnID0gMTYpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHhsYWIoZXhwcmVzc2lvbignQ29udHJvbCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ1RyZWF0bWVudCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0PXVuaXQoLjgsICJjbSIpLAogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEpCgojIGZvciBwbG90dGluZyB3aXRoIGNvbG9yID0gVHlwZSAoY3VycmVudGx5IHN1cHByZXNzZWQpCiMgYWxsLjE0Yy5jdGwudHJ0ICU+JQojICAgZmlsdGVyKEhvcml6b24gPT0gIkEiKSAlPiUKIyAgIG11dGF0ZShMb2NhdGlvbiA9IGZhY3RvcihyZWNvZGUoU2l0ZSwgISEhbG9jKSwgZXhjbHVkZSA9IFRSVUUpKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoZDE0Y19jb3JyX21lYW5fY3RsLCBkMTRjX2NvcnJfbWVhbl90cnQsIGNvbG9yID0gVHlwZSwgc2hhcGUgPSBMb2NhdGlvbikpICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLTQwLCBsaW5ldHlwZSA9ICJkb3RkYXNoIikgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSA0MCwgbGluZXR5cGUgPSAiZG90ZGFzaCIpICsKIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwojICAgZ2VvbV9wb2ludChzaXplID0gMykgKwojICAgZ2VvbV9lcnJvcmJhcigKIyAgICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbWluX3RydCwgCiMgICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heF90cnQsIAojICAgICAgICAgY29sb3IgPSBUeXBlKSwgCiMgICAgIHdpZHRoID0gLjI1KSArCiMgICBnZW9tX2Vycm9yYmFyaCgKIyAgICAgYWVzKHhtaW4gPSBkMTRjX2NvcnJfbWluX2N0bCwgCiMgICAgICAgICB4bWF4ID0gZDE0Y19jb3JyX21heF9jdGwsIAojICAgICAgICAgY29sb3IgPSBUeXBlKSwgCiMgICAgIGhlaWdodCA9IC45KSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdMYW5kIHVzZScsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiMgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKIyAgIHhsYWIoZXhwcmVzc2lvbignQ29udHJvbCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIHlsYWIoZXhwcmVzc2lvbignVHJlYXRtZW50ICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIiksCiMgICAgICAgICBhc3BlY3QucmF0aW8gPSAxKQpgYGAKPioqRmlnLiBgciB7ZmlnLm4gKyA4fWAuIENoYW5nZSBpbiBeMTReQy1DT34yfiBpbiByZWxhdGlvbiB0byBjdW11bGF0aXZlIHNvaWwgY2FyYm9uIHJlc3BpcmVkKioKCj4qQ2FwdGlvbjoqIAoKCiMgRGlzY3Vzc2lvbgoKKlJhbmRvbSBub3RlcyBoZXJlLi4uKgoKKkVmZmVjdCBvZiBDIHJlc3BpcmVkKgoKU2V2ZXJhbCBzdHVkaWVzIGhhdmUgc2hvd24gdGhhdCB0aGUgcmFkaW9jYXJib24gc2lnbmF0dXJlIG9mIHJlc3BpcmVkIENPfjJ+IGNoYW5nZXMgb3ZlciB0aGUgZHVyYXRpb24gb2YgYW4gaW5jdWJhdGlvbiBpbiByZWxhdGlvbnNoaXAgdG8gdGhlIGFtb3VudCBvZiBjYXJib24gcmVzcGlyZWQgKEJvbCBldCBhbC4gMjAwMzsgQ3VzYWNrIGV0IGFsLiAyMDEwOyBTY2hpbWVsIGV0IGFsLiAyMDExOyBNdWVsbGVyIGV0IGFsLiAyMDE0KS4gSW5jdWJhdGlvbnMgaW4gdGhpcyBzdHVkeSB3ZXJlIGNvbnRyb2xsZWQgc28gdGhhdCB0aGUgYW1vdW50IG9mIHRoZSB0b3RhbCBzb2lsIEMgcG9vbCByZXNwaXJlZCBhcyBDT34yfiBpbiB0cmVhdG1lbnQgaW5jdWJhdGlvbnMgd2FzIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHdoYXQgd2FzIHJlc3BpcmVkIGluIGNvbnRyb2wgaW5jdWJhdGlvbnMsIGJ1dCBhcyByZXNwaXJhdGlvbiByYXRlcyB3ZXJlIG11Y2ggaGlnaGVyIGluIHRyZWF0bWVudCBzYW1wbGUgaW5jdWJhdGlvbnMsIHRoaXMgd2FzIG9ubHkgcGFydGlhbGx5IGZlYXNpYmxlLgoKV2hpbGUgYm90aCB0aGUgYWlyLWRyeSArIHN0b3JhZ2UgKEV4cGVyaW1lbnQgMSkgYW5kIGFpci1kcnkgKEV4cGVyaW1lbnQgMikgdHJlYXRtZW50cyBoYWQgYSBzaWduaWZpY2FudCBlZmZlY3Qgb24gJFxEZWx0YSReMTReQy1DT34yfiwgdGhlc2UgY2hhbmdlcyB3ZXJlIG5vdCBkcml2ZW4gYnkgZGlmZmVyZW5jZXMgaW4gdGhlIGFtb3VudCBvZiBjYXJib24gcmVzcGlyZWQgKCoqRmlnIDcqKikuIA==