\[\\[0.05cm]\]

The NGFS Climate Scenarios are a set of hypothetical scenarios developed to explore how the physical impacts of climate change and associated climate policy impacts could evolve in the coming century. These scenarios are not designed as forecasts but instead as tools for exploring plausible futures under given assumptions, such as what would happen if the world does nothing for climate mitigation and adapation, and what would be needed in order to achieve climate goals over the 21st century.

This article seeks to explore the NGFS climate scenarios, focusing on the IAM models which are used for their projections. Given the differences in model design and functional structures, an interesting question to explore is how their outputs would differ under the same scenario context and input assumptions.

Following an overview of how NGFS climate scenarios are designed, this article then discusses the three integrated assessment models (IAMs) used by the NGFS with regard to their functional similarities and differences. The exploratory data analysis looks into IAM projections of key climate change and energy transition variables to see where IAM models agree and where they diverge. What consistent messages are communicated through these models despite their differences, and what further areas for study can be found.

Overview of the NGFS Climate Scenarios

Climate scenarios framework

There are six scenarios chosen to reflect different levels of physical risk, which stems from acute weather events and a changing Earth climate, and transition risk, which affects households, businesses and investors through climate policies and technology trends.

\[\\[0.05cm]\]

Key scenario input assumptions

The six transition scenarios are differentiated by design choices relating to:

  • Policy ambition, set as long-term temperature targets and net-zero targets.
  • Policy reaction, reflected in short-term policies
  • Technological change and availability
  • Carbon dioxide removal (CDR) availability and deployment intensity
  • Policy variation or coordination level

\[\\[0.05cm]\] Orderly scenarios: The most optimistic among all scenarios, these scenarios assume climate policies are implemented early on and become increasingly stricter over time. “Net zero 2050” targets a 1.5°C temperature rise limit and reaches global net zero around 2050 while “Below 2°C” allows for a 67% chance of limiting warming to less than 2°C.

Disorderly scenarios: These scenarios are characterized by delayed or divergent policy implementation across countries and sectors. “Divergent Net Zero” reaches global net zero emissions around 2050 but at higher costs than “Net Zero 2050”. “Delayed transition” sets a 2°C temperature target, but projections follow the “Current Policies” trajectory until 2030 before allowing for emission reduction. It assumes limited use of CDR and therefore requires stronger climate policies such as carbon price to cut emissions.

Hot house world: The baseline “Current Policies” scenario assumes no additional strengthening of existing climate policies. “Nationally Determined Contributions (NDCs)” assumes that all currently-pledged NDCs are implemented in full and that current targets on energy and emissions in 2025 and 2030 are reached across countries, but with limited strengthening thereafter. These scenarios indicate that current efforts would be insufficient to achieve Paris Agreement objectives.

Integrated Assessment Models 101

The NGFS transition pathways are generated by three complex IAMs called GCAM, MESSAGEix-GLOBIOM and REMIND-MAgPIE.

Structurally, all three models are similar in that they link different macroeconomic, agriculture, land-use, energy, water and climate modules to produce estimates of cost-minimizing pathways subject to the constraints of scenario design choices. This linkage structure allows complex IAMs to account for cascading or spillover effects between the economy, the energy system and the environment which might otherwise be missed in simple IAMs. By default, the three models do not include internally the impact of physical damages from climate change. The NGFS accounts for this shortcoming by providing two additional REMIND-MAgPIE models with integrated physical damages calculated along the median and 95th percentile warming trajectories.

GCAM

GCAM is an IAM that models the behavior of – and interactions between – five systems: the economy, the climate, energy, agriculture and land-use, and water. The model operates at a global scale with disaggregation into 32 energy and economic regions. Its core operating principle is market equilibrium, which means supply and demand across markets are equilibrated through a process of iterating on prices.

As a dynamic-recursive model, GCAM’s operation is myopic: decisions made by GCAM agents are without knowledge of the future, and each time period is solved based on information from previous and current periods. GCAM’s calculation uses a logit formulation whereby decisions are based on profitability maximization for land-use allocation and on cost minimization for energy system transition. Projections are available in 5-year time steps until 2100.

MESSAGEix-GLOBIOM

MESSAGEix-GLOBIOM combines five models representing different parts of the global system, with disaggregation into 12 regions. Its core model is the energy model MESSAGE, which performs an optimization calculation to estimate minimum energy system costs to satisfy energy demands. MESSAGE is solved iteratively with the aggregated macroeconomic model MACRO, whereby MACRO adjusts useful energy demands based on energy price and cost inputs from MESSAGE until both models reach equilibrium. This iterative process accounts for energy efficiency and GDP responses to changes in price.

The land-use model GLOBIOM provides MESSAGE with projections of land use as well as availability and costs of bioenergy and emission mitigation in agriculture and forestry sectors. Once iteration between MESSAGE and MACRO is complete, outputs on bioenergy demand and carbon prices are fed back into GLOBIOM for a conclusive calculation on the period. MESSAGE also captures the implications of air pollution on energy systems by using technology-specific air pollution coefficients provided by the GAINS model. Lastly, the resulting outputs from MESSAGE and GLOBIOM are passed to the climate model MAGICC for climate projections such as global-mean temperature, atmospheric composition and radiative forcing.

REMIND-MAgPIE

A key similarity between REMIND-MAgPIE and MESSAGEix-GLOBIOM is the formulation of their macroeconomic core, which performs intertemporal optimization calculations with the assumptions that agents in the model have ‘perfect foresight’ of the future. This allows them to account for technology options with high up-front investments and long payback time in their solution for optimal transition pathways.

REMIND-MAgPIE runs on a 12-region global disaggregation and consists of four parts. REMIND operates as an energy-economy general equilibrium model by linking a top-down macroeconomic core with a bottom-up energy system model that accounts for technological learning and adjustment cost constraints. Emission projections from REMIND are fed into MAGICC for climate-related estimates. REMIND is also linked to the partial-equilibrium land-use optimization model MAgPIE, which solves for minimum global costs to meet agricultural demands, including demand for bioenergy. Based on cost-effectiveness, MAgPIE endogenously decide the level of agricultural production, land-use change and production relocation.

REMIND and MAgPIE is linked in an iterative structure whereby MAgPIE takes in emissions prices and bioenergy demand from REMIND and provides REMIND with land-use emissions and bioenergy prices. This structure allows for scenarios with equilibrated bioenergy and emissions markets.

REMIND-MAgPIE with integrated damages

The integrated runs of REMIND-MAgPIE internalize macroeconomic damage calculations by taking into account (1) the guardrail carbon tax effect from temperature targets, and (2) the damages occurring below these targets through their associated social carbon costs.

This is achieved through an iterative process in which the emissions calculated by REMIND are fed to MAGICC for estimates of global mean temperature change. The associated social carbon costs are calculated based on MAGICC estimates and are then fed back into the next iteration of REMIND as a component of the carbon tax, which leads to additional climate mitigation. On the other hand, damages reduce GDP, which then affects levels of emissions, capital accumulation and savings.

\[\\[0.05cm]\]

Comparing IAM projections: Where do they agree and diverge?

For brevity, the MESSAGEix-GLOBIOM will be referred to as “MESSAGE” and REMIND-MAgPIE as “REMIND” in this section.

Emission pathways

The figure below shows the emission pathways projected by the IAMs for each of the NGFS climate scenarios. The strongest divergence can be observed in the two hot-house-world scenarios. MESSAGE has the highest emission projections in both scenarios, with emissions rising rather than decreasing in the last quarter of the century. The NDCs scenario shows emissions gradually decreasing by 2100, while Current Policies does not see a substantial difference between emissions levels in 2020 and 2100. Both scenarios show how global emissions never reaches anywhere close to net zero, indicating that current policies and commitments will not be enough to meet Paris Agreement goals by 2100.

The emission trajectories are more consistent with the remaining four scenarios. In the disorderly Divergent Net Zero and orderly Net Zero 2050 scenarios, emissions peak in 2020 and reaches net zero approximately between 2050 and 2075. Emissions also peak in 2020 in Below 2°C but does not peak in Delayed 2°C until 2030 owing to the scenario’s design. Of note is that in all four scenarios, GCAM’s pathways reach net zero the earliest and are the only pathways to reach net-negative emissions in the Below 2°C scenario.

One key message across the models is that in order to reach the 1.5°C temperature target, emissions must rapidly decline starting in the present, reaches net zero around the third quarter of the century, and approaches net-negative in the years that follow. To limit warming to below 2°C, MESSAGE (in the Delayed 2°C scenario) and GCAM projects that net-negative emissions are required after 2050, while REMIND projects that the temperature target can still be reached without net negative emissions.

Change in composition of primary energy consumption

Another area of agreement between the IAMs is the change in the composition of total primary energy consumption needed to limit global warming to set targets. The figure below shows how the share of fossil fuels, nuclear and renewable energy in total energy consumption changes over time in the * Below 2°C* and Divergent Net Zero scenarios. Renewable energy in this figure includes hydro, wind, geothermal and solar energy as well as bioenergy. Fossil fuels comprise of oil, gas and coal.

In both scenarios, fossil fuel consumption peaks in 2020 and decreases substantially over the course of the century, from around 80% of total primary energy consumption in 2020 to less than 30% in 2100. REMIND model reduces fossil fuel the most, dropping to near 10% by 2100. Renewable energy can be seen as the models’ main replacement for fossil fuels in both pathways, with the pace at which renewable energy use increases mirroring the pace at which fossil fuel use decreases. By 2100, renewable energy is the main source of energy, replacing fossil fuel almost entirely. REMIND projects virtually no role for nuclear energy during the transition while GCAM and MESSAGE projects a stronger role, which results in their lower projection for renewable energy use and higher nuclear energy use.

World energy mix in 2100

A common thread among the IAMs is their shift towards sustainable energy sources by replacing fossil fuel use. Without changes to current policies, fossil fuels will remain a key energy source, as indicated in the Current Policies scenario. On the other hand, in order to limit global warming to below 1.5°C or 2°C by 2100, a strong energy system transition towards renewable energy will be needed. The level of energy consumption differs across models, but MESSAGE projects the highest level of energy consumption while GCAM projects the lowest consumption level. Particularly noteworthy is that both scenarios with temperature targets have lower total energy consumption than the Current Policies scenario. This may be attributed to increases in energy efficiency over time, but also due to the fact that renewable energy has greater generation efficiency – as high as 100% - as compared to fossil fuels, which have only 35% to 40% generation efficiency.

Among the three IAM models, REMIND projects the largest role for renewable energy in the future energy mix, even without changes to current policies. This maybe attributed to the unique “learning-by-doing” feature of the REMIND model in which the costs of renewable energy decreases with increasing deployment, making renewables and biofuels a more cost-effective energy alternative. This suggests that the development of renewable energy will have beneficial effects over the long run both in terms of energy efficiency and in reducing global emissions.

Deployment intensity of CDR measures

IAMs rely significantly on CDR measure to achieve net-negative emissions and limit warming to set targets. The deployment of CDR usually takes place starting around 2050. The reasons for this reliance include the amount of negative emissions required to meet climate targets that may not be feasible through climate policies such as carbon pricing alone. The structure of IAMs also finds such policies to be less cost-effective than CDR measures. The figure below shows the global cumulative amount of carbon dioxide removed from the atmosphere, in gigatons, from 2020 to 2100.

IAMs rely significantly on CDR measure to achieve net-negative emissions and limit warming to set targets. The deployment of CDR usually takes place starting around 2050. The reasons for this reliance include the amount of negative emissions required to meet climate targets that may not be feasible through climate policies such as carbon pricing alone. The structure of IAMs also finds such policies to be less cost-effective than CDR measures. The figure below shows the global cumulative amount of carbon dioxide removed from the atmosphere from 2020 to 2100.

A common thread between the models with temperature targets is their heavy deployment of CDR, mainly due to their need to restrict emissions and achieve strict climate goals. MESSAGE projects the land-based carbon storage to play the largest role in CDR deployment, whereas REMIND sees the largest role for bioenergy with carbon capture and storage (BECCS). GCAM assigns a similarly large role to BECCS in addition to fitting CCS technology to fossil fuel power plants in operation. The scale of deployment does differ notably between models, with GCAM calling for the most CDR deployment and REMIND the least.

Conclusion

An overarching theme from the exploratory analysis conducted points to the fact that while IAM models differ in terms of the details of their projected transition pathways, they do agree on the big picture: the trajectory of emission reduction, the type of energy technology deployment required, and the levels to which the energy system shifts its composition.

Two key shortcomings of current IAMs that can be explored in future research is the fact that they do not account for inefficiencies from political processes and their heavy emphasis on supply-side-driven energy transition. Engaging these avenues will greatly enhance the comprehensiveness of future IAM projections for climate policy decisions.

\[\\[0.5cm]\]

LS0tDQp0aXRsZTogIkV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMgb2YgdGhlIE5HRlMgU2NlbmFyaW9zIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpIA0KbGlicmFyeSh0aWR5cXVhbnQpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoZ2dwbG90MikNCg0KbGlicmFyeShlc3F1aXNzZSkNCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkoZ2d0aGVtZXMpDQoNCmxpYnJhcnkodmlyaWRpc0xpdGUpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkocGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KHNjYWxlcykNCg0KbGlicmFyeShjb3VudHJ5Y29kZSkNCmxpYnJhcnkod2JzdGF0cykNCg0Kb3B0aW9ucyhzY2lwZW49MTApICMgZm9yY2VzIHJlZ3VsYXIgbm90YXRpb24gdnMgc2NpZW50aWZpYyBub3RhdGlvbiAoaWU1KQ0KYGBgDQokJFxcWzAuMDVjbV0kJA0KPCEtLSBJbnRyb2R1Y3Rpb24gcGFyYWdyYXBoLCBzdGF0aW5nIG9iamVjdGl2ZXMgLS0+DQoNClRoZSBOR0ZTIENsaW1hdGUgU2NlbmFyaW9zIGFyZSBhIHNldCBvZiBoeXBvdGhldGljYWwgc2NlbmFyaW9zIGRldmVsb3BlZCB0byBleHBsb3JlIGhvdyB0aGUgcGh5c2ljYWwgaW1wYWN0cyBvZiBjbGltYXRlIGNoYW5nZSBhbmQgYXNzb2NpYXRlZCBjbGltYXRlIHBvbGljeSBpbXBhY3RzIGNvdWxkIGV2b2x2ZSBpbiB0aGUgY29taW5nIGNlbnR1cnkuIFRoZXNlIHNjZW5hcmlvcyBhcmUgbm90IGRlc2lnbmVkIGFzIGZvcmVjYXN0cyBidXQgaW5zdGVhZCBhcyB0b29scyBmb3IgZXhwbG9yaW5nIHBsYXVzaWJsZSBmdXR1cmVzIHVuZGVyIGdpdmVuIGFzc3VtcHRpb25zLCBzdWNoIGFzIHdoYXQgd291bGQgaGFwcGVuIGlmIHRoZSB3b3JsZCBkb2VzIG5vdGhpbmcgZm9yIGNsaW1hdGUgbWl0aWdhdGlvbiBhbmQgYWRhcGF0aW9uLCBhbmQgd2hhdCB3b3VsZCBiZSBuZWVkZWQgaW4gb3JkZXIgdG8gYWNoaWV2ZSBjbGltYXRlIGdvYWxzIG92ZXIgdGhlIDIxXnN0XiBjZW50dXJ5Lg0KDQpUaGlzIGFydGljbGUgc2Vla3MgdG8gZXhwbG9yZSB0aGUgTkdGUyBjbGltYXRlIHNjZW5hcmlvcywgZm9jdXNpbmcgb24gdGhlIElBTSBtb2RlbHMgd2hpY2ggYXJlIHVzZWQgZm9yIHRoZWlyIHByb2plY3Rpb25zLiBHaXZlbiB0aGUgZGlmZmVyZW5jZXMgaW4gbW9kZWwgZGVzaWduIGFuZCBmdW5jdGlvbmFsIHN0cnVjdHVyZXMsIGFuIGludGVyZXN0aW5nIHF1ZXN0aW9uIHRvIGV4cGxvcmUgaXMgaG93IHRoZWlyIG91dHB1dHMgd291bGQgZGlmZmVyIHVuZGVyIHRoZSBzYW1lIHNjZW5hcmlvIGNvbnRleHQgYW5kIGlucHV0IGFzc3VtcHRpb25zLg0KDQo8IS0tIFN0cnVjdHVyZSAtLT4NCg0KRm9sbG93aW5nIGFuIG92ZXJ2aWV3IG9mIGhvdyBOR0ZTIGNsaW1hdGUgc2NlbmFyaW9zIGFyZSBkZXNpZ25lZCwgdGhpcyBhcnRpY2xlIHRoZW4gZGlzY3Vzc2VzIHRoZSB0aHJlZSBpbnRlZ3JhdGVkIGFzc2Vzc21lbnQgbW9kZWxzIChJQU1zKSB1c2VkIGJ5IHRoZSBOR0ZTIHdpdGggcmVnYXJkIHRvIHRoZWlyIGZ1bmN0aW9uYWwgc2ltaWxhcml0aWVzIGFuZCBkaWZmZXJlbmNlcy4gVGhlIGV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMgbG9va3MgaW50byBJQU0gcHJvamVjdGlvbnMgb2Yga2V5IGNsaW1hdGUgY2hhbmdlIGFuZCBlbmVyZ3kgdHJhbnNpdGlvbiB2YXJpYWJsZXMgdG8gc2VlIHdoZXJlIElBTSBtb2RlbHMgYWdyZWUgYW5kIHdoZXJlIHRoZXkgZGl2ZXJnZS4gV2hhdCBjb25zaXN0ZW50IG1lc3NhZ2VzIGFyZSBjb21tdW5pY2F0ZWQgdGhyb3VnaCB0aGVzZSBtb2RlbHMgZGVzcGl0ZSB0aGVpciBkaWZmZXJlbmNlcywgYW5kIHdoYXQgZnVydGhlciBhcmVhcyBmb3Igc3R1ZHkgY2FuIGJlIGZvdW5kLg0KDQoNCjwhLS0gSW50cm9kdWN0aW9uIHBhcmFncmFwaCwgc3RhdGluZyBvYmplY3RpdmVzIC0tPg0KDQojIyBPdmVydmlldyBvZiB0aGUgTkdGUyBDbGltYXRlIFNjZW5hcmlvcw0KDQojIyMgQ2xpbWF0ZSBzY2VuYXJpb3MgZnJhbWV3b3JrDQoNClRoZXJlIGFyZSBzaXggc2NlbmFyaW9zIGNob3NlbiB0byByZWZsZWN0IGRpZmZlcmVudCBsZXZlbHMgb2YgKipwaHlzaWNhbCByaXNrKiosIHdoaWNoIHN0ZW1zIGZyb20gYWN1dGUgd2VhdGhlciBldmVudHMgYW5kIGEgY2hhbmdpbmcgRWFydGggY2xpbWF0ZSwgYW5kICoqdHJhbnNpdGlvbiByaXNrKiosIHdoaWNoIGFmZmVjdHMgaG91c2Vob2xkcywgYnVzaW5lc3NlcyBhbmQgaW52ZXN0b3JzIHRocm91Z2ggY2xpbWF0ZSBwb2xpY2llcyBhbmQgdGVjaG5vbG9neSB0cmVuZHMuIA0KDQo8Y2VudGVyPg0KIVtdKE5HRlMuc2NlbmFyaW8uZnJhbWV3b3JrLnBuZyl7d2lkdGg9IjQwJSJ9DQo8L2NlbnRlcj4NCiQkXFxbMC4wNWNtXSQkDQoNCiMjIyBLZXkgc2NlbmFyaW8gaW5wdXQgYXNzdW1wdGlvbnMNCg0KVGhlIHNpeCB0cmFuc2l0aW9uIHNjZW5hcmlvcyBhcmUgZGlmZmVyZW50aWF0ZWQgYnkgZGVzaWduIGNob2ljZXMgcmVsYXRpbmcgdG86DQoNCiogKlBvbGljeSBhbWJpdGlvbiosIHNldCBhcyBsb25nLXRlcm0gdGVtcGVyYXR1cmUgdGFyZ2V0cyBhbmQgbmV0LXplcm8gdGFyZ2V0cy4gDQoqICpQb2xpY3kgcmVhY3Rpb24qLCByZWZsZWN0ZWQgaW4gc2hvcnQtdGVybSBwb2xpY2llcw0KKiAqVGVjaG5vbG9naWNhbCBjaGFuZ2UqIGFuZCBhdmFpbGFiaWxpdHkNCiogKkNhcmJvbiBkaW94aWRlIHJlbW92YWwgKENEUikqIGF2YWlsYWJpbGl0eSBhbmQgZGVwbG95bWVudCBpbnRlbnNpdHkNCiogKlBvbGljeSB2YXJpYXRpb24qIG9yIGNvb3JkaW5hdGlvbiBsZXZlbA0KDQoNCjxjZW50ZXI+DQohW10oTkdGUy5zY2VuYXJpby5hc3N1bXB0aW9ucy5wbmcpe3dpZHRoPSIxMDAlIn0NCjwvY2VudGVyPg0KJCRcXFswLjA1Y21dJCQNCioqT3JkZXJseSBzY2VuYXJpb3M6KioNClRoZSBtb3N0IG9wdGltaXN0aWMgYW1vbmcgYWxsIHNjZW5hcmlvcywgdGhlc2Ugc2NlbmFyaW9zIGFzc3VtZSBjbGltYXRlIHBvbGljaWVzIGFyZSBpbXBsZW1lbnRlZCBlYXJseSBvbiBhbmQgYmVjb21lIGluY3JlYXNpbmdseSBzdHJpY3RlciBvdmVyIHRpbWUuICoiTmV0IHplcm8gMjA1MCIqIHRhcmdldHMgYSAxLjXCsEMgdGVtcGVyYXR1cmUgcmlzZSBsaW1pdCBhbmQgcmVhY2hlcyBnbG9iYWwgbmV0IHplcm8gYXJvdW5kIDIwNTAgd2hpbGUgKiJCZWxvdyAywrBDIiogYWxsb3dzIGZvciBhIDY3JSBjaGFuY2Ugb2YgbGltaXRpbmcgd2FybWluZyB0byBsZXNzIHRoYW4gMsKwQy4NCg0KKipEaXNvcmRlcmx5IHNjZW5hcmlvczoqKg0KVGhlc2Ugc2NlbmFyaW9zIGFyZSBjaGFyYWN0ZXJpemVkIGJ5IGRlbGF5ZWQgb3IgZGl2ZXJnZW50IHBvbGljeSBpbXBsZW1lbnRhdGlvbiBhY3Jvc3MgY291bnRyaWVzIGFuZCBzZWN0b3JzLiAqIkRpdmVyZ2VudCBOZXQgWmVybyIqIHJlYWNoZXMgZ2xvYmFsIG5ldCB6ZXJvIGVtaXNzaW9ucyBhcm91bmQgMjA1MCBidXQgYXQgaGlnaGVyIGNvc3RzIHRoYW4gKiJOZXQgWmVybyAyMDUwIiouICoiRGVsYXllZCB0cmFuc2l0aW9uIiogc2V0cyBhIDLCsEMgdGVtcGVyYXR1cmUgdGFyZ2V0LCBidXQgcHJvamVjdGlvbnMgZm9sbG93IHRoZSAqIkN1cnJlbnQgUG9saWNpZXMiKiB0cmFqZWN0b3J5IHVudGlsIDIwMzAgYmVmb3JlIGFsbG93aW5nIGZvciBlbWlzc2lvbiByZWR1Y3Rpb24uIEl0IGFzc3VtZXMgbGltaXRlZCB1c2Ugb2YgQ0RSIGFuZCB0aGVyZWZvcmUgcmVxdWlyZXMgc3Ryb25nZXIgY2xpbWF0ZSBwb2xpY2llcyBzdWNoIGFzIGNhcmJvbiBwcmljZSB0byBjdXQgZW1pc3Npb25zLg0KDQoqKkhvdCBob3VzZSB3b3JsZDoqKiANClRoZSBiYXNlbGluZSAqIkN1cnJlbnQgUG9saWNpZXMiKiBzY2VuYXJpbyBhc3N1bWVzIG5vIGFkZGl0aW9uYWwgc3RyZW5ndGhlbmluZyBvZiBleGlzdGluZyBjbGltYXRlIHBvbGljaWVzLiAqIk5hdGlvbmFsbHkgRGV0ZXJtaW5lZCBDb250cmlidXRpb25zIChORENzKSIqIGFzc3VtZXMgdGhhdCBhbGwgY3VycmVudGx5LXBsZWRnZWQgTkRDcyBhcmUgaW1wbGVtZW50ZWQgaW4gZnVsbCBhbmQgdGhhdCBjdXJyZW50IHRhcmdldHMgb24gZW5lcmd5IGFuZCBlbWlzc2lvbnMgaW4gMjAyNSBhbmQgMjAzMCBhcmUgcmVhY2hlZCBhY3Jvc3MgY291bnRyaWVzLCBidXQgd2l0aCBsaW1pdGVkIHN0cmVuZ3RoZW5pbmcgdGhlcmVhZnRlci4gVGhlc2Ugc2NlbmFyaW9zIGluZGljYXRlIHRoYXQgY3VycmVudCBlZmZvcnRzIHdvdWxkIGJlIGluc3VmZmljaWVudCB0byBhY2hpZXZlIFBhcmlzIEFncmVlbWVudCBvYmplY3RpdmVzLg0KDQojIyAgSW50ZWdyYXRlZCBBc3Nlc3NtZW50IE1vZGVscyAxMDENCg0KVGhlIE5HRlMgdHJhbnNpdGlvbiBwYXRod2F5cyBhcmUgZ2VuZXJhdGVkIGJ5IHRocmVlIGNvbXBsZXggSUFNcyBjYWxsZWQgR0NBTSwgTUVTU0FHRWl4LUdMT0JJT00gYW5kIFJFTUlORC1NQWdQSUUuDQoNClN0cnVjdHVyYWxseSwgYWxsIHRocmVlIG1vZGVscyBhcmUgc2ltaWxhciBpbiB0aGF0IHRoZXkgbGluayBkaWZmZXJlbnQgbWFjcm9lY29ub21pYywgYWdyaWN1bHR1cmUsIGxhbmQtdXNlLCBlbmVyZ3ksIHdhdGVyIGFuZCBjbGltYXRlIG1vZHVsZXMgdG8gcHJvZHVjZSBlc3RpbWF0ZXMgb2YgY29zdC1taW5pbWl6aW5nIHBhdGh3YXlzIHN1YmplY3QgdG8gdGhlIGNvbnN0cmFpbnRzIG9mIHNjZW5hcmlvIGRlc2lnbiBjaG9pY2VzLiBUaGlzIGxpbmthZ2Ugc3RydWN0dXJlIGFsbG93cyBjb21wbGV4IElBTXMgdG8gYWNjb3VudCBmb3IgY2FzY2FkaW5nIG9yIHNwaWxsb3ZlciBlZmZlY3RzIGJldHdlZW4gdGhlIGVjb25vbXksIHRoZSBlbmVyZ3kgc3lzdGVtIGFuZCB0aGUgZW52aXJvbm1lbnQgd2hpY2ggbWlnaHQgb3RoZXJ3aXNlIGJlIG1pc3NlZCBpbiBzaW1wbGUgSUFNcy4gDQpCeSBkZWZhdWx0LCB0aGUgdGhyZWUgbW9kZWxzIGRvIG5vdCBpbmNsdWRlIGludGVybmFsbHkgdGhlIGltcGFjdCBvZiBwaHlzaWNhbCBkYW1hZ2VzIGZyb20gY2xpbWF0ZSBjaGFuZ2UuIFRoZSBOR0ZTIGFjY291bnRzIGZvciB0aGlzIHNob3J0Y29taW5nIGJ5IHByb3ZpZGluZyB0d28gYWRkaXRpb25hbCBSRU1JTkQtTUFnUElFIG1vZGVscyB3aXRoIGludGVncmF0ZWQgcGh5c2ljYWwgZGFtYWdlcyBjYWxjdWxhdGVkIGFsb25nIHRoZSBtZWRpYW4gYW5kIDk1XnRoXiBwZXJjZW50aWxlIHdhcm1pbmcgdHJhamVjdG9yaWVzLg0KDQojIyMgR0NBTQ0KDQpHQ0FNIGlzIGFuIElBTSB0aGF0IG1vZGVscyB0aGUgYmVoYXZpb3Igb2Yg4oCTIGFuZCBpbnRlcmFjdGlvbnMgYmV0d2VlbiDigJMgZml2ZSBzeXN0ZW1zOiB0aGUgZWNvbm9teSwgdGhlIGNsaW1hdGUsIGVuZXJneSwgYWdyaWN1bHR1cmUgYW5kIGxhbmQtdXNlLCBhbmQgd2F0ZXIuIFRoZSBtb2RlbCBvcGVyYXRlcyBhdCBhIGdsb2JhbCBzY2FsZSB3aXRoIGRpc2FnZ3JlZ2F0aW9uIGludG8gMzIgZW5lcmd5IGFuZCBlY29ub21pYyByZWdpb25zLiBJdHMgY29yZSBvcGVyYXRpbmcgcHJpbmNpcGxlIGlzIG1hcmtldCBlcXVpbGlicml1bSwgd2hpY2ggbWVhbnMgc3VwcGx5IGFuZCBkZW1hbmQgYWNyb3NzIG1hcmtldHMgYXJlIGVxdWlsaWJyYXRlZCB0aHJvdWdoIGEgcHJvY2VzcyBvZiBpdGVyYXRpbmcgb24gcHJpY2VzLg0KDQpBcyBhIGR5bmFtaWMtcmVjdXJzaXZlIG1vZGVsLCBHQ0FN4oCZcyBvcGVyYXRpb24gaXMgbXlvcGljOiBkZWNpc2lvbnMgbWFkZSBieSBHQ0FNIGFnZW50cyBhcmUgd2l0aG91dCBrbm93bGVkZ2Ugb2YgdGhlIGZ1dHVyZSwgYW5kIGVhY2ggdGltZSBwZXJpb2QgaXMgc29sdmVkIGJhc2VkIG9uIGluZm9ybWF0aW9uIGZyb20gcHJldmlvdXMgYW5kIGN1cnJlbnQgcGVyaW9kcy4gR0NBTeKAmXMgY2FsY3VsYXRpb24gdXNlcyBhIGxvZ2l0IGZvcm11bGF0aW9uIHdoZXJlYnkgZGVjaXNpb25zIGFyZSBiYXNlZCBvbiBwcm9maXRhYmlsaXR5IG1heGltaXphdGlvbiBmb3IgbGFuZC11c2UgYWxsb2NhdGlvbiBhbmQgb24gY29zdCBtaW5pbWl6YXRpb24gZm9yIGVuZXJneSBzeXN0ZW0gdHJhbnNpdGlvbi4gUHJvamVjdGlvbnMgYXJlIGF2YWlsYWJsZSBpbiA1LXllYXIgdGltZSBzdGVwcyB1bnRpbCAyMTAwLg0KDQojIyMgTUVTU0FHRWl4LUdMT0JJT00NCg0KTUVTU0FHRWl4LUdMT0JJT00gY29tYmluZXMgZml2ZSBtb2RlbHMgcmVwcmVzZW50aW5nIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgZ2xvYmFsIHN5c3RlbSwgd2l0aCBkaXNhZ2dyZWdhdGlvbiBpbnRvIDEyIHJlZ2lvbnMuIEl0cyBjb3JlIG1vZGVsIGlzIHRoZSBlbmVyZ3kgbW9kZWwgTUVTU0FHRSwgd2hpY2ggcGVyZm9ybXMgYW4gb3B0aW1pemF0aW9uIGNhbGN1bGF0aW9uIHRvIGVzdGltYXRlIG1pbmltdW0gZW5lcmd5IHN5c3RlbSBjb3N0cyB0byBzYXRpc2Z5IGVuZXJneSBkZW1hbmRzLiBNRVNTQUdFIGlzIHNvbHZlZCBpdGVyYXRpdmVseSB3aXRoIHRoZSBhZ2dyZWdhdGVkIG1hY3JvZWNvbm9taWMgbW9kZWwgTUFDUk8sIHdoZXJlYnkgTUFDUk8gYWRqdXN0cyB1c2VmdWwgZW5lcmd5IGRlbWFuZHMgYmFzZWQgb24gZW5lcmd5IHByaWNlIGFuZCBjb3N0IGlucHV0cyBmcm9tIE1FU1NBR0UgdW50aWwgYm90aCBtb2RlbHMgcmVhY2ggZXF1aWxpYnJpdW0uIFRoaXMgaXRlcmF0aXZlIHByb2Nlc3MgYWNjb3VudHMgZm9yIGVuZXJneSBlZmZpY2llbmN5IGFuZCBHRFAgcmVzcG9uc2VzIHRvIGNoYW5nZXMgaW4gcHJpY2UuDQoNClRoZSBsYW5kLXVzZSBtb2RlbCBHTE9CSU9NIHByb3ZpZGVzIE1FU1NBR0Ugd2l0aCBwcm9qZWN0aW9ucyBvZiBsYW5kIHVzZSBhcyB3ZWxsIGFzIGF2YWlsYWJpbGl0eSBhbmQgY29zdHMgb2YgYmlvZW5lcmd5IGFuZCBlbWlzc2lvbiBtaXRpZ2F0aW9uIGluIGFncmljdWx0dXJlIGFuZCBmb3Jlc3RyeSBzZWN0b3JzLiBPbmNlIGl0ZXJhdGlvbiBiZXR3ZWVuIE1FU1NBR0UgYW5kIE1BQ1JPIGlzIGNvbXBsZXRlLCBvdXRwdXRzIG9uIGJpb2VuZXJneSBkZW1hbmQgYW5kIGNhcmJvbiBwcmljZXMgYXJlIGZlZCBiYWNrIGludG8gR0xPQklPTSBmb3IgYSBjb25jbHVzaXZlIGNhbGN1bGF0aW9uIG9uIHRoZSBwZXJpb2QuIE1FU1NBR0UgYWxzbyBjYXB0dXJlcyB0aGUgaW1wbGljYXRpb25zIG9mIGFpciBwb2xsdXRpb24gb24gZW5lcmd5IHN5c3RlbXMgYnkgdXNpbmcgdGVjaG5vbG9neS1zcGVjaWZpYyBhaXIgcG9sbHV0aW9uIGNvZWZmaWNpZW50cyBwcm92aWRlZCBieSB0aGUgR0FJTlMgbW9kZWwuIExhc3RseSwgdGhlIHJlc3VsdGluZyBvdXRwdXRzIGZyb20gTUVTU0FHRSBhbmQgR0xPQklPTSBhcmUgcGFzc2VkIHRvIHRoZSBjbGltYXRlIG1vZGVsIE1BR0lDQyBmb3IgY2xpbWF0ZSBwcm9qZWN0aW9ucyBzdWNoIGFzIGdsb2JhbC1tZWFuIHRlbXBlcmF0dXJlLCBhdG1vc3BoZXJpYyBjb21wb3NpdGlvbiBhbmQgcmFkaWF0aXZlIGZvcmNpbmcuDQoNCg0KIyMjIFJFTUlORC1NQWdQSUUNCg0KQSBrZXkgc2ltaWxhcml0eSBiZXR3ZWVuIFJFTUlORC1NQWdQSUUgYW5kIE1FU1NBR0VpeC1HTE9CSU9NIGlzIHRoZSBmb3JtdWxhdGlvbiBvZiB0aGVpciBtYWNyb2Vjb25vbWljIGNvcmUsIHdoaWNoIHBlcmZvcm1zIGludGVydGVtcG9yYWwgb3B0aW1pemF0aW9uIGNhbGN1bGF0aW9ucyB3aXRoIHRoZSBhc3N1bXB0aW9ucyB0aGF0IGFnZW50cyBpbiB0aGUgbW9kZWwgaGF2ZSAncGVyZmVjdCBmb3Jlc2lnaHQnIG9mIHRoZSBmdXR1cmUuIFRoaXMgYWxsb3dzIHRoZW0gdG8gYWNjb3VudCBmb3IgdGVjaG5vbG9neSBvcHRpb25zIHdpdGggaGlnaCB1cC1mcm9udCBpbnZlc3RtZW50cyBhbmQgbG9uZyBwYXliYWNrIHRpbWUgaW4gdGhlaXIgc29sdXRpb24gZm9yIG9wdGltYWwgdHJhbnNpdGlvbiBwYXRod2F5cy4gDQoNClJFTUlORC1NQWdQSUUgcnVucyBvbiBhIDEyLXJlZ2lvbiBnbG9iYWwgZGlzYWdncmVnYXRpb24gYW5kIGNvbnNpc3RzIG9mIGZvdXIgcGFydHMuIFJFTUlORCBvcGVyYXRlcyBhcyBhbiBlbmVyZ3ktZWNvbm9teSBnZW5lcmFsIGVxdWlsaWJyaXVtIG1vZGVsIGJ5IGxpbmtpbmcgYSB0b3AtZG93biBtYWNyb2Vjb25vbWljIGNvcmUgd2l0aCBhIGJvdHRvbS11cCBlbmVyZ3kgc3lzdGVtIG1vZGVsIHRoYXQgYWNjb3VudHMgZm9yIHRlY2hub2xvZ2ljYWwgbGVhcm5pbmcgYW5kIGFkanVzdG1lbnQgY29zdCBjb25zdHJhaW50cy4gRW1pc3Npb24gcHJvamVjdGlvbnMgZnJvbSBSRU1JTkQgYXJlIGZlZCBpbnRvIE1BR0lDQyBmb3IgY2xpbWF0ZS1yZWxhdGVkIGVzdGltYXRlcy4gUkVNSU5EIGlzIGFsc28gbGlua2VkIHRvIHRoZSBwYXJ0aWFsLWVxdWlsaWJyaXVtIGxhbmQtdXNlIG9wdGltaXphdGlvbiBtb2RlbCBNQWdQSUUsIHdoaWNoIHNvbHZlcyBmb3IgbWluaW11bSBnbG9iYWwgY29zdHMgdG8gbWVldCBhZ3JpY3VsdHVyYWwgZGVtYW5kcywgaW5jbHVkaW5nIGRlbWFuZCBmb3IgYmlvZW5lcmd5LiBCYXNlZCBvbiBjb3N0LWVmZmVjdGl2ZW5lc3MsIE1BZ1BJRSBlbmRvZ2Vub3VzbHkgZGVjaWRlIHRoZSBsZXZlbCBvZiBhZ3JpY3VsdHVyYWwgcHJvZHVjdGlvbiwgbGFuZC11c2UgY2hhbmdlIGFuZCBwcm9kdWN0aW9uIHJlbG9jYXRpb24uDQoNClJFTUlORCBhbmQgTUFnUElFIGlzIGxpbmtlZCBpbiBhbiBpdGVyYXRpdmUgc3RydWN0dXJlIHdoZXJlYnkgTUFnUElFIHRha2VzIGluIGVtaXNzaW9ucyBwcmljZXMgYW5kIGJpb2VuZXJneSBkZW1hbmQgZnJvbSBSRU1JTkQgYW5kIHByb3ZpZGVzIFJFTUlORCB3aXRoIGxhbmQtdXNlIGVtaXNzaW9ucyBhbmQgYmlvZW5lcmd5IHByaWNlcy4gVGhpcyBzdHJ1Y3R1cmUgYWxsb3dzIGZvciBzY2VuYXJpb3Mgd2l0aCBlcXVpbGlicmF0ZWQgYmlvZW5lcmd5IGFuZCBlbWlzc2lvbnMgbWFya2V0cy4NCg0KDQoqKlJFTUlORC1NQWdQSUUgd2l0aCBpbnRlZ3JhdGVkIGRhbWFnZXMqKg0KDQpUaGUgaW50ZWdyYXRlZCBydW5zIG9mIFJFTUlORC1NQWdQSUUgaW50ZXJuYWxpemUgbWFjcm9lY29ub21pYyBkYW1hZ2UgY2FsY3VsYXRpb25zIGJ5IHRha2luZyBpbnRvIGFjY291bnQgKDEpIHRoZSBndWFyZHJhaWwgY2FyYm9uIHRheCBlZmZlY3QgZnJvbSB0ZW1wZXJhdHVyZSB0YXJnZXRzLCBhbmQgKDIpIHRoZSBkYW1hZ2VzIG9jY3VycmluZyBiZWxvdyB0aGVzZSB0YXJnZXRzIHRocm91Z2ggdGhlaXIgYXNzb2NpYXRlZCBzb2NpYWwgY2FyYm9uIGNvc3RzLg0KDQpUaGlzIGlzIGFjaGlldmVkIHRocm91Z2ggYW4gaXRlcmF0aXZlIHByb2Nlc3MgaW4gd2hpY2ggdGhlIGVtaXNzaW9ucyBjYWxjdWxhdGVkIGJ5IFJFTUlORCBhcmUgZmVkIHRvIE1BR0lDQyBmb3IgZXN0aW1hdGVzIG9mIGdsb2JhbCBtZWFuIHRlbXBlcmF0dXJlIGNoYW5nZS4gVGhlIGFzc29jaWF0ZWQgc29jaWFsIGNhcmJvbiBjb3N0cyBhcmUgY2FsY3VsYXRlZCBiYXNlZCBvbiBNQUdJQ0MgZXN0aW1hdGVzIGFuZCBhcmUgdGhlbiBmZWQgYmFjayBpbnRvIHRoZSBuZXh0IGl0ZXJhdGlvbiBvZiBSRU1JTkQgYXMgYSBjb21wb25lbnQgb2YgdGhlIGNhcmJvbiB0YXgsIHdoaWNoIGxlYWRzIHRvIGFkZGl0aW9uYWwgY2xpbWF0ZSBtaXRpZ2F0aW9uLiBPbiB0aGUgb3RoZXIgaGFuZCwgZGFtYWdlcyByZWR1Y2UgR0RQLCB3aGljaCB0aGVuIGFmZmVjdHMgbGV2ZWxzIG9mIGVtaXNzaW9ucywgY2FwaXRhbCBhY2N1bXVsYXRpb24gYW5kIHNhdmluZ3MuDQoNCjxjZW50ZXI+DQohW10oTkdGUy5SRU1JTkQuaW50ZWdyYXRlZC5wbmcpe3dpZHRoPSI0MCUifQ0KPC9jZW50ZXI+DQokJFxcWzAuMDVjbV0kJA0KDQojIyBDb21wYXJpbmcgSUFNIHByb2plY3Rpb25zOiBXaGVyZSBkbyB0aGV5IGFncmVlIGFuZCBkaXZlcmdlPw0KDQpGb3IgYnJldml0eSwgdGhlIE1FU1NBR0VpeC1HTE9CSU9NIHdpbGwgYmUgcmVmZXJyZWQgdG8gYXMgIk1FU1NBR0UiIGFuZCBSRU1JTkQtTUFnUElFIGFzICJSRU1JTkQiIGluIHRoaXMgc2VjdGlvbi4NCg0KIyMjIEVtaXNzaW9uIHBhdGh3YXlzDQoNClRoZSBmaWd1cmUgYmVsb3cgc2hvd3MgdGhlIGVtaXNzaW9uIHBhdGh3YXlzIHByb2plY3RlZCBieSB0aGUgSUFNcyBmb3IgZWFjaCBvZiB0aGUgTkdGUyBjbGltYXRlIHNjZW5hcmlvcy4gVGhlIHN0cm9uZ2VzdCBkaXZlcmdlbmNlIGNhbiBiZSBvYnNlcnZlZCBpbiB0aGUgdHdvIGhvdC1ob3VzZS13b3JsZCBzY2VuYXJpb3MuIE1FU1NBR0UgaGFzIHRoZSBoaWdoZXN0IGVtaXNzaW9uIHByb2plY3Rpb25zIGluIGJvdGggc2NlbmFyaW9zLCB3aXRoIGVtaXNzaW9ucyByaXNpbmcgcmF0aGVyIHRoYW4gZGVjcmVhc2luZyBpbiB0aGUgbGFzdCBxdWFydGVyIG9mIHRoZSBjZW50dXJ5LiBUaGUgKk5EQ3MqIHNjZW5hcmlvIHNob3dzIGVtaXNzaW9ucyBncmFkdWFsbHkgZGVjcmVhc2luZyBieSAyMTAwLCB3aGlsZSAqQ3VycmVudCBQb2xpY2llcyogZG9lcyBub3Qgc2VlIGEgc3Vic3RhbnRpYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIGVtaXNzaW9ucyBsZXZlbHMgaW4gMjAyMCBhbmQgMjEwMC4gQm90aCBzY2VuYXJpb3Mgc2hvdyBob3cgZ2xvYmFsIGVtaXNzaW9ucyBuZXZlciByZWFjaGVzIGFueXdoZXJlIGNsb3NlIHRvIG5ldCB6ZXJvLCBpbmRpY2F0aW5nIHRoYXQgY3VycmVudCBwb2xpY2llcyBhbmQgY29tbWl0bWVudHMgd2lsbCBub3QgYmUgZW5vdWdoIHRvIG1lZXQgUGFyaXMgQWdyZWVtZW50IGdvYWxzIGJ5IDIxMDAuDQoNClRoZSBlbWlzc2lvbiB0cmFqZWN0b3JpZXMgYXJlIG1vcmUgY29uc2lzdGVudCB3aXRoIHRoZSByZW1haW5pbmcgZm91ciBzY2VuYXJpb3MuIEluIHRoZSBkaXNvcmRlcmx5ICpEaXZlcmdlbnQgTmV0IFplcm8qIGFuZCBvcmRlcmx5ICpOZXQgWmVybyAyMDUwKiBzY2VuYXJpb3MsIGVtaXNzaW9ucyBwZWFrIGluIDIwMjAgYW5kIHJlYWNoZXMgbmV0IHplcm8gYXBwcm94aW1hdGVseSBiZXR3ZWVuIDIwNTAgYW5kIDIwNzUuICBFbWlzc2lvbnMgYWxzbyBwZWFrIGluIDIwMjAgaW4gKkJlbG93IDLCsEMqIGJ1dCBkb2VzIG5vdCBwZWFrIGluICpEZWxheWVkIDLCsEMqIHVudGlsIDIwMzAgb3dpbmcgdG8gdGhlIHNjZW5hcmlv4oCZcyBkZXNpZ24uIE9mIG5vdGUgaXMgdGhhdCBpbiBhbGwgZm91ciBzY2VuYXJpb3MsIEdDQU3igJlzIHBhdGh3YXlzIHJlYWNoIG5ldCB6ZXJvIHRoZSBlYXJsaWVzdCBhbmQgYXJlIHRoZSBvbmx5IHBhdGh3YXlzIHRvIHJlYWNoIG5ldC1uZWdhdGl2ZSBlbWlzc2lvbnMgaW4gdGhlICpCZWxvdyAywrBDKiBzY2VuYXJpby4NCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PSA2LCBmaWcud2lkdGggPSA4fQ0KZW1pc3Npb25zLnBsb3QgPC0gZ2dwbG90KElBTV93b3JsZC5lbWlzc2lvbnMucmVvcmRlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IFllYXIsIHkgPSBHdC5DTzIucGVyeWVhciwgZ3JvdXAgPSBNb2RlbCkpICsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvdXIgPSBNb2RlbCksIHNpemUgPSByZWwoMC45KSkgKw0KICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKGxhYmVscyA9IGMoIkdDQU0iLCJNRVNTQUdFIiwiUkVNSU5EIiwiUkVNSU5EXG45NXRoLWhpZ2ggZGFtYWdlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVNSU5EXG5NZWRpYW4gZGFtYWdlcyIpLCAjcmVuYW1lIGxlZ2VuZCBsYWJlbHMNCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKyAjUmVtb3ZlIGxlZ2VuZCB0aXRsZQ0KICB0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IiwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBzaXplID0gcmVsKDAuOCkpLA0KICAgICAgICBsZWdlbmQudGV4dD0gZWxlbWVudF90ZXh0KCBzaXplID0gcmVsKDEuMjUpKSwNCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDEuNjUsICJjbSIpLA0KICAgICAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpKSsNCiAgeWxhYihleHByZXNzaW9uKCJHdCBDTyJbMl1+InBlciB5ZWFyIikpICsNCiAgeGxhYihOVUxMKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgc2l6ZT0gcmVsKDEuMzUpKSkrDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAyNSwyMTAwLDI1KSkgKw0KICAjcmVsKDAuOCkgbWVhbnMgc2l6ZSBpcyBzZXQgdG8gMC44IHRpbWVzIHRoZSBzaXplIG9mIHRoZSBiYXNlIGZvbnQgc2l6ZSBmb3IgdGhlIHRoZW1lLg0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPSByZWwoMS4yNSkpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMjUpKSkrDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0ibG9uZ2Rhc2giKSArDQogIGZhY2V0X3dyYXAofiBTY2VuYXJpbykgKw0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSksDQogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gIiNFQkVCRUIiKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiI0VCRUJFQiIpKSArDQogIHRoZW1lKHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoMC45LCAibGluZXMiKSwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMjUpKSkgKw0KICBsYWJzKHRpdGxlID0gIkVtaXNzaW9uIHBhdGh3YXlzIGZvciBlYWNoIE5HRlMgc2NlbmFyaW8iLA0KICAgICAgIHN1YnRpdGxlID0gZXhwcmVzc2lvbigiUHJvamVjdGVkIHRvdGFsIGFubnVhbCBDTyJbMl1+ImVtaXNzaW9ucyBmcm9tIDIwMjAgdG8gMjEwMCBieSBOR0ZTIElBTXMuIiksDQogICAgICAgY2FwdGlvbiA9ICJcbkRhdGEgc291cmNlOiBOR0ZTIFBoYXNlIElJSSBDbGltYXRlIFNjZW5hcmlvcyIpICsNCiAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjUpKSwNCiAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQgKHNpemUgPSByZWwoMS4yNSksIGZhY2UgPSAiaXRhbGljIiksDQogICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoIGZhY2UgPSAiaXRhbGljIiwgY29sb3VyID0gImRhcmtncmV5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHJlbCgxLjI1KSkpICsNCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDEpKSkNCg0KZW1pc3Npb25zLnBsb3QNCmBgYA0KDQpPbmUga2V5IG1lc3NhZ2UgYWNyb3NzIHRoZSBtb2RlbHMgaXMgdGhhdCBpbiBvcmRlciB0byByZWFjaCB0aGUgMS41wrBDIHRlbXBlcmF0dXJlIHRhcmdldCwgZW1pc3Npb25zIG11c3QgcmFwaWRseSBkZWNsaW5lIHN0YXJ0aW5nIGluIHRoZSBwcmVzZW50LCByZWFjaGVzIG5ldCB6ZXJvIGFyb3VuZCB0aGUgdGhpcmQgcXVhcnRlciBvZiB0aGUgY2VudHVyeSwgYW5kIGFwcHJvYWNoZXMgbmV0LW5lZ2F0aXZlIGluIHRoZSB5ZWFycyB0aGF0IGZvbGxvdy4gVG8gbGltaXQgd2FybWluZyB0byBiZWxvdyAywrBDLCBNRVNTQUdFIChpbiB0aGUgKkRlbGF5ZWQgMsKwQyogc2NlbmFyaW8pIGFuZCBHQ0FNIHByb2plY3RzIHRoYXQgbmV0LW5lZ2F0aXZlIGVtaXNzaW9ucyBhcmUgcmVxdWlyZWQgYWZ0ZXIgMjA1MCwgd2hpbGUgUkVNSU5EIHByb2plY3RzIHRoYXQgdGhlIHRlbXBlcmF0dXJlIHRhcmdldCBjYW4gc3RpbGwgYmUgcmVhY2hlZCB3aXRob3V0IG5ldCBuZWdhdGl2ZSBlbWlzc2lvbnMuDQoNCiMjIyBDaGFuZ2UgaW4gY29tcG9zaXRpb24gb2YgcHJpbWFyeSBlbmVyZ3kgY29uc3VtcHRpb24NCg0KQW5vdGhlciBhcmVhIG9mIGFncmVlbWVudCBiZXR3ZWVuIHRoZSBJQU1zIGlzIHRoZSBjaGFuZ2UgaW4gdGhlIGNvbXBvc2l0aW9uIG9mIHRvdGFsIHByaW1hcnkgZW5lcmd5IGNvbnN1bXB0aW9uIG5lZWRlZCB0byBsaW1pdCBnbG9iYWwgd2FybWluZyB0byBzZXQgdGFyZ2V0cy4gVGhlIGZpZ3VyZSBiZWxvdyBzaG93cyBob3cgdGhlIHNoYXJlIG9mIGZvc3NpbCBmdWVscywgbnVjbGVhciBhbmQgcmVuZXdhYmxlIGVuZXJneSBpbiB0b3RhbCBlbmVyZ3kgY29uc3VtcHRpb24gY2hhbmdlcyBvdmVyIHRpbWUgaW4gdGhlICogQmVsb3cgMsKwQyogYW5kICpEaXZlcmdlbnQgTmV0IFplcm8qIHNjZW5hcmlvcy4gUmVuZXdhYmxlIGVuZXJneSBpbiB0aGlzIGZpZ3VyZSBpbmNsdWRlcyBoeWRybywgd2luZCwgZ2VvdGhlcm1hbCBhbmQgc29sYXIgZW5lcmd5IGFzIHdlbGwgYXMgYmlvZW5lcmd5LiBGb3NzaWwgZnVlbHMgY29tcHJpc2Ugb2Ygb2lsLCBnYXMgYW5kIGNvYWwuDQoNCg0KYGBge3IgZWNobyA9IEZBTFNFICwgZmlnLmhlaWdodD0gNCwgZmlnLndpZHRoID0gNn0NCmVuZXJneS5zaGFyZS5hbGwgPC0gZW5lcmd5LnNoYXJlICU+JQ0KICBmaWx0ZXIoU2NlbmFyaW8gJWluJSBjKCJCZWxvdyAywrBDIiwiRGl2ZXJnZW50IE5ldCBaZXJvIikpDQoNCmVuZXJneS5zaGFyZS5hbGwkRW5lcmd5LnNvdXJjZVtlbmVyZ3kuc2hhcmUuYWxsJEVuZXJneS5zb3VyY2UgPT0gIkZvc3NpbC5zaGFyZSJdIDwtICJGb3NzaWwgZnVlbHMiDQplbmVyZ3kuc2hhcmUuYWxsJEVuZXJneS5zb3VyY2VbZW5lcmd5LnNoYXJlLmFsbCRFbmVyZ3kuc291cmNlID09ICJOdWNsZWFyLnNoYXJlIl0gPC0gIk51Y2xlYXIgZW5lcmd5Ig0KZW5lcmd5LnNoYXJlLmFsbCRFbmVyZ3kuc291cmNlW2VuZXJneS5zaGFyZS5hbGwkRW5lcmd5LnNvdXJjZSA9PSAiUmVuZXdhYmxlcy5zaGFyZSJdIDwtICJSZW5ld2FibGUgZW5lcmd5Ig0KDQplbmVyZ3kuc2hhcmUuYWxsLnBsb3QgPC0gZ2dwbG90KGVuZXJneS5zaGFyZS5hbGwsIGFlcyh4ID0gWWVhciwgeSA9IFBlcmNlbnQsIGdyb3VwID0gTW9kZWwpKSArDQogIGdlb21fbGluZShhZXMoY29sb3VyID0gTW9kZWwpLCBzaXplID0gcmVsKDAuOCkpICsNCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfZChsYWJlbHMgPSBjKCJHQ0FNIiwiTUVTU0FHRWl4LUdMT0JJT00iLCJSRU1JTkQtTUFnUElFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRU1JTkQtTUFnUElFXG5JbnRlZ3JhdGVkIGRhbWFnZXMsIDk1dGgtaGlnaCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVNSU5ELU1BZ1BJRVxuSW50ZWdyYXRlZCBkYW1hZ2VzLCBtZWRpYW4iKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIsDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgc2l6ZSA9IHJlbCgwLjgpKSwNCiAgICAgICAgbGVnZW5kLnRleHQ9IGVsZW1lbnRfdGV4dChsaW5laGVpZ2h0ID0gMSwgc2l6ZSA9IHJlbCgwLjkpKSwNCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDEsICJjbSIpLA0KICAgICAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpKSsNCiAgeWxhYihleHByZXNzaW9uKCJQZXJjZW50YWdlIHNoYXJlIG9mIHByaW1hcnkgZW5lcmd5IGNvbnN1bXB0aW9uIikpICsNCiAgeGxhYihOVUxMKSArDQogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgc2l6ZSA9IHJlbCgwLjkpKSkrDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAyNSwyMTAwLDI1KSkgKw0KICAjcmVsKDAuOCkgbWVhbnMgc2l6ZSBpcyBzZXQgdG8gMC44IHRpbWVzIHRoZSBzaXplIG9mIHRoZSBiYXNlIGZvbnQgc2l6ZSBmb3IgdGhlIHRoZW1lLg0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPSByZWwoMC44KSksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMC44KSkpKw0KICBmYWNldF9ncmlkKFNjZW5hcmlvIH4gRW5lcmd5LnNvdXJjZSkgKw0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSksDQogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gIiNFQkVCRUIiKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiI0VCRUJFQiIpKSArDQogIHRoZW1lKHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoMC45LCAibGluZXMiKSkgKw0KICBsYWJzKHRpdGxlID0gIlNoYXJlIG9mIGZvc3NpbCBmdWVscywgbnVjbGVhciBhbmQgcmVuZXdhYmxlIGVuZXJneSBpbiBwcmltYXJ5IGVuZXJneSBjb25zdW1wdGlvbiIsDQogICAgICAgc3VidGl0bGUgPSAiXCJCZWxvdyAywrBDXCIgc2NlbmFyaW8gcHJvamVjdGlvbiBmcm9tIDIwMjAgdG8gMjEwMCBieSBOR0ZTIElBTXMuIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBOR0ZTIFBoYXNlIElJSSBDbGltYXRlIFNjZW5hcmlvcyIpICsNCiAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjEpLCBsaW5laGVpZ2h0ID0gMC4xKSwNCiAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQgKHNpemUgPSByZWwoMC45KSksDQogICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoIGZhY2UgPSAiaXRhbGljIiwgY29sb3VyID0gImRhcmtncmV5IikpICsNCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDEpKSkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChzY2FsZSA9IDEwMCkpDQoNCg0KZW5lcmd5LnNoYXJlLmFsbC5wbG90DQpgYGANCg0KSW4gYm90aCBzY2VuYXJpb3MsIGZvc3NpbCBmdWVsIGNvbnN1bXB0aW9uIHBlYWtzIGluIDIwMjAgYW5kIGRlY3JlYXNlcyBzdWJzdGFudGlhbGx5IG92ZXIgdGhlIGNvdXJzZSBvZiB0aGUgY2VudHVyeSwgZnJvbSBhcm91bmQgODAlIG9mIHRvdGFsIHByaW1hcnkgZW5lcmd5IGNvbnN1bXB0aW9uIGluIDIwMjAgdG8gbGVzcyB0aGFuIDMwJSBpbiAyMTAwLiBSRU1JTkQgbW9kZWwgcmVkdWNlcyBmb3NzaWwgZnVlbCB0aGUgbW9zdCwgZHJvcHBpbmcgdG8gbmVhciAxMCUgYnkgMjEwMC4gUmVuZXdhYmxlIGVuZXJneSBjYW4gYmUgc2VlbiBhcyB0aGUgbW9kZWxz4oCZIG1haW4gcmVwbGFjZW1lbnQgZm9yIGZvc3NpbCBmdWVscyBpbiBib3RoIHBhdGh3YXlzLCB3aXRoIHRoZSBwYWNlIGF0IHdoaWNoIHJlbmV3YWJsZSBlbmVyZ3kgdXNlIGluY3JlYXNlcyBtaXJyb3JpbmcgdGhlIHBhY2UgYXQgd2hpY2ggZm9zc2lsIGZ1ZWwgdXNlIGRlY3JlYXNlcy4gQnkgMjEwMCwgcmVuZXdhYmxlIGVuZXJneSBpcyB0aGUgbWFpbiBzb3VyY2Ugb2YgZW5lcmd5LCByZXBsYWNpbmcgZm9zc2lsIGZ1ZWwgYWxtb3N0IGVudGlyZWx5LiBSRU1JTkQgcHJvamVjdHMgdmlydHVhbGx5IG5vIHJvbGUgZm9yIG51Y2xlYXIgZW5lcmd5IGR1cmluZyB0aGUgdHJhbnNpdGlvbiB3aGlsZSBHQ0FNIGFuZCBNRVNTQUdFIHByb2plY3RzIGEgc3Ryb25nZXIgcm9sZSwgd2hpY2ggcmVzdWx0cyBpbiB0aGVpciBsb3dlciBwcm9qZWN0aW9uIGZvciByZW5ld2FibGUgZW5lcmd5IHVzZSBhbmQgaGlnaGVyIG51Y2xlYXIgZW5lcmd5IHVzZS4NCg0KIyMjIFdvcmxkIGVuZXJneSBtaXggaW4gMjEwMA0KDQpgYGB7ciBlY2hvID0gRkFMU0UgLCBmaWcuaGVpZ2h0PSAzLjUsIGZpZy53aWR0aCA9IDUuNX0NCiMgUmVvcmRlcmluZyBFbmVyZ3kgc291cmNlIGZhY3RvciBsZXZlbHMNCklBTV93b3JsZC4yMTAwZW5lcmd5bWl4JFZhcmlhYmxlIDwtIGZhY3RvcihJQU1fd29ybGQuMjEwMGVuZXJneW1peCRWYXJpYWJsZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJDb2FsIiwiR2FzIiwiT2lsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdWNsZWFyIiwiUmVuZXdhYmxlcyIsIkJpb21hc3MiKSkNCg0KZW5lcmd5bWl4LjIxMDAgPC0gZ2dwbG90KElBTV93b3JsZC4yMTAwZW5lcmd5bWl4LA0KICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gTW9kZWwsIHkgPSB2YWx1ZSwgZmlsbCA9IFZhcmlhYmxlKSkgKw0KICBnZW9tX2NvbChjb2xvdXIgPSAid2hpdGUiLA0KICAgICAgICAgICBwb3NpdGlvbiA9IChwb3NpdGlvbl9zdGFjayhyZXZlcnNlID0gVFJVRSkpLA0KICAgICAgICAgICB3aWR0aCA9IHJlbCgwLjgpKSsgDQogIGZhY2V0X3dyYXAoIH5TY2VuYXJpbykgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChuYW1lID0gTlVMTCkgKw0KICB5bGFiKCJFeGFqb3VsZXMgb2YgZW5lcmd5IikgKyB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgwLjkpKSkgKw0KICB4bGFiKE5VTEwpICsNCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpKSArDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiI0VCRUJFQiIpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICIjRUJFQkVCIiksDQogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHRoZW1lKHBhbmVsLnNwYWNpbmcueCA9IHVuaXQoMC45LCAibGluZXMiKSkgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJHQ0FNIiwiTUVTU0FHRSIsIlJFTUlORCIsIlJFTUlORFxuOTV0aC1oaWdoIGRhbWFnZXMiLCJSRU1JTkRcbk1lZGlhbiBkYW1hZ2VzIikpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSxzaXplPSByZWwoMC45KSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMC45KSkpICsNCiAgbGFicyh0aXRsZSA9ICJXb3JsZCBlbmVyZ3kgbWl4IGluIDIxMDAiLA0KICAgICAgIHN1YnRpdGxlID0gIlByb2plY3RlZCB0b3RhbCBlbmVyZ3kgY29uc3VtcHRpb24gaW4gMjEwMCBieSBmaXZlIGVuZXJneSBzb3VyY2VzIGFjcm9zcyBOR0ZTIHNjZW5hcmlvcy4iLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IE5HRlMgUGhhc2UgSUlJIENsaW1hdGUgU2NlbmFyaW9zIikgKw0KICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuMSksIGxpbmVoZWlnaHQgPSAuMSksDQogICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0IChzaXplID0gcmVsKDAuOSkpLA0KICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KCBmYWNlID0gIml0YWxpYyIsIGNvbG91ciA9ICJkYXJrZ3JleSIpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwNCiAgICAgICAgbGVnZW5kLnRleHQ9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDAuOSkpKSArDQogIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAxKSkNCiAgDQplbmVyZ3ltaXguMjEwMA0KDQpgYGANCg0KQSBjb21tb24gdGhyZWFkIGFtb25nIHRoZSBJQU1zIGlzIHRoZWlyIHNoaWZ0IHRvd2FyZHMgc3VzdGFpbmFibGUgZW5lcmd5IHNvdXJjZXMgYnkgcmVwbGFjaW5nIGZvc3NpbCBmdWVsIHVzZS4gV2l0aG91dCBjaGFuZ2VzIHRvIGN1cnJlbnQgcG9saWNpZXMsIGZvc3NpbCBmdWVscyB3aWxsIHJlbWFpbiBhIGtleSBlbmVyZ3kgc291cmNlLCBhcyBpbmRpY2F0ZWQgaW4gdGhlICpDdXJyZW50IFBvbGljaWVzKiBzY2VuYXJpby4gT24gdGhlIG90aGVyIGhhbmQsIGluIG9yZGVyIHRvIGxpbWl0IGdsb2JhbCB3YXJtaW5nIHRvIGJlbG93IDEuNcKwQyBvciAywrBDIGJ5IDIxMDAsIGEgc3Ryb25nIGVuZXJneSBzeXN0ZW0gdHJhbnNpdGlvbiB0b3dhcmRzIHJlbmV3YWJsZSBlbmVyZ3kgd2lsbCBiZSBuZWVkZWQuIFRoZSBsZXZlbCBvZiBlbmVyZ3kgY29uc3VtcHRpb24gZGlmZmVycyBhY3Jvc3MgbW9kZWxzLCBidXQgTUVTU0FHRSBwcm9qZWN0cyB0aGUgaGlnaGVzdCBsZXZlbCBvZiBlbmVyZ3kgY29uc3VtcHRpb24gd2hpbGUgR0NBTSBwcm9qZWN0cyB0aGUgbG93ZXN0IGNvbnN1bXB0aW9uIGxldmVsLiBQYXJ0aWN1bGFybHkgbm90ZXdvcnRoeSBpcyB0aGF0IGJvdGggc2NlbmFyaW9zIHdpdGggdGVtcGVyYXR1cmUgdGFyZ2V0cyBoYXZlIGxvd2VyIHRvdGFsIGVuZXJneSBjb25zdW1wdGlvbiB0aGFuIHRoZSAqQ3VycmVudCBQb2xpY2llcyogc2NlbmFyaW8uIFRoaXMgbWF5IGJlIGF0dHJpYnV0ZWQgdG8gaW5jcmVhc2VzIGluIGVuZXJneSBlZmZpY2llbmN5IG92ZXIgdGltZSwgYnV0IGFsc28gZHVlIHRvIHRoZSBmYWN0IHRoYXQgcmVuZXdhYmxlIGVuZXJneSBoYXMgZ3JlYXRlciBnZW5lcmF0aW9uIGVmZmljaWVuY3kg4oCTIGFzIGhpZ2ggYXMgMTAwJSAtIGFzIGNvbXBhcmVkIHRvIGZvc3NpbCBmdWVscywgd2hpY2ggaGF2ZSBvbmx5IDM1JSB0byA0MCUgZ2VuZXJhdGlvbiBlZmZpY2llbmN5Lg0KDQpBbW9uZyB0aGUgdGhyZWUgSUFNIG1vZGVscywgUkVNSU5EIHByb2plY3RzIHRoZSBsYXJnZXN0IHJvbGUgZm9yIHJlbmV3YWJsZSBlbmVyZ3kgaW4gdGhlIGZ1dHVyZSBlbmVyZ3kgbWl4LCBldmVuIHdpdGhvdXQgY2hhbmdlcyB0byBjdXJyZW50IHBvbGljaWVzLiBUaGlzIG1heWJlIGF0dHJpYnV0ZWQgdG8gdGhlIHVuaXF1ZSDigJxsZWFybmluZy1ieS1kb2luZ+KAnSBmZWF0dXJlIG9mIHRoZSBSRU1JTkQgbW9kZWwgaW4gd2hpY2ggdGhlIGNvc3RzIG9mIHJlbmV3YWJsZSBlbmVyZ3kgZGVjcmVhc2VzIHdpdGggaW5jcmVhc2luZyBkZXBsb3ltZW50LCBtYWtpbmcgcmVuZXdhYmxlcyBhbmQgYmlvZnVlbHMgYSBtb3JlIGNvc3QtZWZmZWN0aXZlIGVuZXJneSBhbHRlcm5hdGl2ZS4gVGhpcyBzdWdnZXN0cyB0aGF0IHRoZSBkZXZlbG9wbWVudCBvZiByZW5ld2FibGUgZW5lcmd5IHdpbGwgaGF2ZSBiZW5lZmljaWFsIGVmZmVjdHMgb3ZlciB0aGUgbG9uZyBydW4gYm90aCBpbiB0ZXJtcyBvZiBlbmVyZ3kgZWZmaWNpZW5jeSBhbmQgaW4gcmVkdWNpbmcgZ2xvYmFsIGVtaXNzaW9ucy4NCg0KIyMjIERlcGxveW1lbnQgaW50ZW5zaXR5IG9mIENEUiBtZWFzdXJlcw0KDQpJQU1zIHJlbHkgc2lnbmlmaWNhbnRseSBvbiBDRFIgbWVhc3VyZSB0byBhY2hpZXZlIG5ldC1uZWdhdGl2ZSBlbWlzc2lvbnMgYW5kIGxpbWl0IHdhcm1pbmcgdG8gc2V0IHRhcmdldHMuIFRoZSBkZXBsb3ltZW50IG9mIENEUiB1c3VhbGx5IHRha2VzIHBsYWNlIHN0YXJ0aW5nIGFyb3VuZCAyMDUwLiBUaGUgcmVhc29ucyBmb3IgdGhpcyByZWxpYW5jZSBpbmNsdWRlIHRoZSBhbW91bnQgb2YgbmVnYXRpdmUgZW1pc3Npb25zIHJlcXVpcmVkIHRvIG1lZXQgY2xpbWF0ZSB0YXJnZXRzIHRoYXQgbWF5IG5vdCBiZSBmZWFzaWJsZSB0aHJvdWdoIGNsaW1hdGUgcG9saWNpZXMgc3VjaCBhcyBjYXJib24gcHJpY2luZyBhbG9uZS4gVGhlIHN0cnVjdHVyZSBvZiBJQU1zIGFsc28gZmluZHMgc3VjaCBwb2xpY2llcyB0byBiZSBsZXNzIGNvc3QtZWZmZWN0aXZlIHRoYW4gQ0RSIG1lYXN1cmVzLiBUaGUgZmlndXJlIGJlbG93IHNob3dzIHRoZSBnbG9iYWwgY3VtdWxhdGl2ZSBhbW91bnQgb2YgY2FyYm9uIGRpb3hpZGUgcmVtb3ZlZCBmcm9tIHRoZSBhdG1vc3BoZXJlLCBpbiBnaWdhdG9ucywgZnJvbSAyMDIwIHRvIDIxMDAuDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCklBTV93b3JsZC5DQ1MgPC0gSUFNX3dvcmxkLkNDUyAlPiUNCiAgZ3JvdXBfYnkoVmFyaWFibGUpDQoNCmdncGxvdChJQU1fd29ybGQuQ0NTLCBhZXMoeCA9IE1vZGVsLCB5ID0gR3QuQ08yLnBlcnllYXIsIGZpbGwgPSBWYXJpYWJsZSkpICsNCiAgI3NjYWxlX2ZpbGxfdmlyaWRpc19kKA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZDhlMjE5IiwiIzM1Yjc3OSIsIiMzMTY4OGUiLCIjNDQwMTU0IiksDQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiQ0RSIG1lYXN1cmVzIixsYWJlbHMgPSBjKCJCaW9lbmVyZ3kgd2l0aCBDQ1MiLCJQb3dlciBwbGFudHNcbmZpdHRlZCB3aXRoIENDUyIsIkluZHVzdHJpYWwgcHJvY2Vzc2VzXG5maXR0ZWQgd2l0aCBDQ1MiLCJMYW5kLWJhc2VkIHNlcXVlc3RyYXRpb24iKSkgKw0KICBmYWNldF93cmFwKH5TY2VuYXJpbykgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IiwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCBzaXplID0gcmVsKDAuNykpLA0KICAgICAgICBsZWdlbmQudGV4dD0gZWxlbWVudF90ZXh0KGxpbmVoZWlnaHQgPSAxLCBzaXplID0gcmVsKDAuNykpLA0KICAgICAgICBsZWdlbmQua2V5LmhlaWdodCA9IHVuaXQoMC45LCAiY20iKSkgKw0KICBnZW9tX2NvbCggd2lkdGggPSByZWwoMC44KSkgKw0KICB5bGFiKGV4cHJlc3Npb24oIkd0IENPIlsyXX4icGVyIHllYXIiKSkgKyB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgwLjgpKSkgKw0KICB4bGFiKE5VTEwpICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICIjRUJFQkVCIiksDQogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gIiNFQkVCRUIiKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgdGhlbWUocGFuZWwuc3BhY2luZy54ID0gdW5pdCgwLjksICJsaW5lcyIpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMC43KSkpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiR0NBTSIsIk1FU1NBR0UiLCJSRU1JTkQiLCJSRU1JTkRcbjk1dGgtaGlnaCBkYW1hZ2VzIiwiUkVNSU5EXG5NZWRpYW4gZGFtYWdlcyIpKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEsc2l6ZT0gcmVsKDAuNykpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDAuNykpKSArDQogIGxhYnModGl0bGUgPSAiQ0RSIGRlcGxveW1lbnQgaW50ZW5zaXR5IiwNCiAgICAgICBzdWJ0aXRsZSA9IGV4cHJlc3Npb24oIlByb2plY3RlZCBjdW11bGF0aXZlIENPIlsyXX4iIHJlbW92YWwgdGhyb3VnaCBDRFIgZnJvbSAyMDIwIHRvIDIxMDAgYnkgTkdGUyBJQU1zLiIpLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IE5HRlMgUGhhc2UgSUlJIENsaW1hdGUgU2NlbmFyaW9zIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS4xKSwgbGluZWhlaWdodCA9IC4xKSwNCiAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQgKHNpemUgPSByZWwoMC45KSksDQogICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoIGZhY2UgPSAiaXRhbGljIiwgY29sb3VyID0gImRhcmtncmV5IikpICsNCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDAuNSkpKQ0KICANCmBgYA0KSUFNcyByZWx5IHNpZ25pZmljYW50bHkgb24gQ0RSIG1lYXN1cmUgdG8gYWNoaWV2ZSBuZXQtbmVnYXRpdmUgZW1pc3Npb25zIGFuZCBsaW1pdCB3YXJtaW5nIHRvIHNldCB0YXJnZXRzLiBUaGUgZGVwbG95bWVudCBvZiBDRFIgdXN1YWxseSB0YWtlcyBwbGFjZSBzdGFydGluZyBhcm91bmQgMjA1MC4gVGhlIHJlYXNvbnMgZm9yIHRoaXMgcmVsaWFuY2UgaW5jbHVkZSB0aGUgYW1vdW50IG9mIG5lZ2F0aXZlIGVtaXNzaW9ucyByZXF1aXJlZCB0byBtZWV0IGNsaW1hdGUgdGFyZ2V0cyB0aGF0IG1heSBub3QgYmUgZmVhc2libGUgdGhyb3VnaCBjbGltYXRlIHBvbGljaWVzIHN1Y2ggYXMgY2FyYm9uIHByaWNpbmcgYWxvbmUuIFRoZSBzdHJ1Y3R1cmUgb2YgSUFNcyBhbHNvIGZpbmRzIHN1Y2ggcG9saWNpZXMgdG8gYmUgbGVzcyBjb3N0LWVmZmVjdGl2ZSB0aGFuIENEUiBtZWFzdXJlcy4gVGhlIGZpZ3VyZSBiZWxvdyBzaG93cyB0aGUgZ2xvYmFsIGN1bXVsYXRpdmUgYW1vdW50IG9mIGNhcmJvbiBkaW94aWRlIHJlbW92ZWQgZnJvbSB0aGUgYXRtb3NwaGVyZSBmcm9tIDIwMjAgdG8gMjEwMC4NCiANCiANCkEgY29tbW9uIHRocmVhZCBiZXR3ZWVuIHRoZSBtb2RlbHMgd2l0aCB0ZW1wZXJhdHVyZSB0YXJnZXRzIGlzIHRoZWlyIGhlYXZ5IGRlcGxveW1lbnQgb2YgQ0RSLCBtYWlubHkgZHVlIHRvIHRoZWlyIG5lZWQgdG8gcmVzdHJpY3QgZW1pc3Npb25zIGFuZCBhY2hpZXZlIHN0cmljdCBjbGltYXRlIGdvYWxzLiBNRVNTQUdFIHByb2plY3RzIHRoZSBsYW5kLWJhc2VkIGNhcmJvbiBzdG9yYWdlIHRvIHBsYXkgdGhlIGxhcmdlc3Qgcm9sZSBpbiBDRFIgZGVwbG95bWVudCwgd2hlcmVhcyBSRU1JTkQgc2VlcyB0aGUgbGFyZ2VzdCByb2xlIGZvciBiaW9lbmVyZ3kgd2l0aCBjYXJib24gY2FwdHVyZSBhbmQgc3RvcmFnZSAoQkVDQ1MpLiBHQ0FNIGFzc2lnbnMgYSBzaW1pbGFybHkgbGFyZ2Ugcm9sZSB0byBCRUNDUyBpbiBhZGRpdGlvbiB0byBmaXR0aW5nIENDUyB0ZWNobm9sb2d5IHRvIGZvc3NpbCBmdWVsIHBvd2VyIHBsYW50cyBpbiBvcGVyYXRpb24uIFRoZSBzY2FsZSBvZiBkZXBsb3ltZW50IGRvZXMgZGlmZmVyIG5vdGFibHkgYmV0d2VlbiBtb2RlbHMsIHdpdGggR0NBTSBjYWxsaW5nIGZvciB0aGUgbW9zdCBDRFIgZGVwbG95bWVudCBhbmQgUkVNSU5EIHRoZSBsZWFzdC4gDQoNCg0KIyMgQ29uY2x1c2lvbg0KDQpBbiBvdmVyYXJjaGluZyB0aGVtZSBmcm9tIHRoZSBleHBsb3JhdG9yeSBhbmFseXNpcyBjb25kdWN0ZWQgcG9pbnRzIHRvIHRoZSBmYWN0IHRoYXQgd2hpbGUgSUFNIG1vZGVscyBkaWZmZXIgaW4gdGVybXMgb2YgdGhlIGRldGFpbHMgb2YgdGhlaXIgcHJvamVjdGVkIHRyYW5zaXRpb24gcGF0aHdheXMsIHRoZXkgZG8gYWdyZWUgb24gdGhlIGJpZyBwaWN0dXJlOiB0aGUgdHJhamVjdG9yeSBvZiBlbWlzc2lvbiByZWR1Y3Rpb24sIHRoZSB0eXBlIG9mIGVuZXJneSB0ZWNobm9sb2d5IGRlcGxveW1lbnQgcmVxdWlyZWQsIGFuZCB0aGUgbGV2ZWxzIHRvIHdoaWNoIHRoZSBlbmVyZ3kgc3lzdGVtIHNoaWZ0cyBpdHMgY29tcG9zaXRpb24uDQoNClR3byBrZXkgc2hvcnRjb21pbmdzIG9mIGN1cnJlbnQgSUFNcyB0aGF0IGNhbiBiZSBleHBsb3JlZCBpbiBmdXR1cmUgcmVzZWFyY2ggaXMgdGhlIGZhY3QgdGhhdCB0aGV5IGRvIG5vdCBhY2NvdW50IGZvciBpbmVmZmljaWVuY2llcyBmcm9tIHBvbGl0aWNhbCBwcm9jZXNzZXMgYW5kIHRoZWlyIGhlYXZ5IGVtcGhhc2lzIG9uIHN1cHBseS1zaWRlLWRyaXZlbiBlbmVyZ3kgdHJhbnNpdGlvbi4gRW5nYWdpbmcgdGhlc2UgYXZlbnVlcyB3aWxsIGdyZWF0bHkgZW5oYW5jZSB0aGUgY29tcHJlaGVuc2l2ZW5lc3Mgb2YgZnV0dXJlIElBTSBwcm9qZWN0aW9ucyBmb3IgY2xpbWF0ZSBwb2xpY3kgZGVjaXNpb25zLg0KDQokJFxcWzAuNWNtXSQkDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K