\[\\[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]\]
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