Section 1: Evolution of Australia’s Electricity Fuel Mix

This stacked area plot shows Australia’s annual electricity
generation by different kinds of fuel from 1999 to 2024. The height of
the stacked areas represents total generation each year. I also use
different color indicating the contributions of coal, natural gas,
hydro, wind, solar and other renewables. The plot shows how the overall
mix has gradually shifted from coal-dominated generation towards a more
diversified and more renewable-based generation mix.
Fuel mix were dominated by coal for a long time, but clearly decrease
in recent years: In early years, coal is a major fuel, which reflects
Australia historically relied on coal power. Over time, the coal area
become smaller year by year, which indicates a structural decrease in
coal generation rather than short-term fluctuations.
Some renewables grow from zero to a significant share: Wind and
especially solar start from zero in early years, but their areas expand
extremely fast from the 2010s. This shows that renewable technologies
have grown from a small role to a major part of generation mix.
So, we want to know why solar power develop so quickly and since
solar power is not available at night, we also want to explore how
Australia’s electricity supply mix differs between day and night.
Section 2: Day vs Night Generation Composition (NSW, last 7
days)

This set of charts clearly shows the evolution of the intraday power
generation structure in New South Wales over the past seven days. Its
visual focus is on showing how renewable energy, especially solar
energy, is reshaping the power system over different time periods.
The stacked area map on the left depicts a typical “average 24-hour
generation curve,” revealing significant differences in the power
generation structure during the day versus night. As the early morning
light intensifies, solar – including rooftop PV and large ground-based
power plants – quickly climbs to a peak between 10 and 16 o’clock,
creating the noticeable mid-section bulge in the image. This shows that
solar energy has become an important pillar of daytime power generation,
and has led to a characteristic “duck curve” at noon for the overall
load, which is a direct reflection of the increasing proportion of
photovoltaics in the power system.
However, as the sun gradually sets westward, the power generation
structure changes rapidly in a short period of time. After 5 p.m., due
to a sharp drop in solar output, coal power and some natural gas units
need to quickly increase output to fill the gap, resulting in a
noticeable ramp-up in the evening, which is also one of the most
challenging times for the current NEM system in terms of scheduling and
stability. After entering the night, solar energy completely exited the
system, and the power generation structure was again dominated by coal
power, indicating that the power supply at night is still highly
dependent on fossil energy.
The two pie charts on the right further reinforce this conclusion.
solar energy has become the main force in the proportion of daytime
power generation, making fossil fuels significantly abdicate during the
day; The power generation structure at night is almost entirely
supported by coal, gas, and a small amount of wind power. This stark
contrast between day and night reveals a key paradox in Australia’s
energy transition: renewable energy penetration is already very high
during the day, but there are not enough fossil-free alternatives at
night, and the energy system still needs to rely on traditional baseload
power sources.
On the one hand, the development of photovoltaics is significantly
changing the power pattern during the day, promoting the marginalization
of coal power during the day. On the other hand, the intermittent nature
of solar energy highlights the need for energy storage, battery
conditioning technology, and flexible gas-electricity.
Section 3: The Rapid Growth of Rooftop Solar in Australia

Australia’s initial growth stage (around 2011 to 2012) saw
substantial growth in rooftop solar adoption in Australia. The
establishment of various incentives such as Solar Homes and Communities
Program (SHCP) and Renewable Energy Target (RET) policy from the
Australian Government, with supplementary support from Feed-in Tariff
subsidies in several Australian States, contributed to such growth.
But with the massive support in 2010-2012, there was tremendous
pressure on state expenditures, such that each state was forced to take
drastic steps to curb its momentum. Withdrawal of such favorable
subsidies caused a short-term slow-down in their installation in the
years that followed (2013-2016).
But perhaps most dramatically, the situation evolved in New South
Wales, with installation costs escalating out of control, far in excess
of expectations. Accordingly, in July 2011, applications for the heavily
subsidized Solar Bonus Scheme were suddenly closed by the government.
But this acted as a catalyst for seizing “the last train out,”
inevitably followed by market collapse. Also, in July 2012, in
Queensland, governments drastically reduced their 44 cents/kWh fee to
just 8 cents. But again, after such drastic changes, with prolonged wait
times, consumers showed less enthusiasm, while in late 2011, in
Victoria, their Premium FiT scheme was suddenly ended. Without these
subsidies, suddenly, there was talk about living with “winter” in the
market (2013–2016), during which consumers had to wait on the
sidelines.

During these years, deprived of substantial subsidies, consumers had
to wait for further declines in the technological costs of solar panels
until systems became economically viable without generous subsidies.
Just when all hopes seemed lost, with the market on the precipice of
reaching its peak, there came a turning point, with innovation being the
new savior, not the government. From 2016 onwards, innovation in the
photovoltaic market reached its maturity, with costs for solar cell
production being significantly reduced to less than half for a 5kW
capacity in a short span, while innovations also increased their
capacity to be utilized on residential scales (average capacity from 4kW
to above 6kW).
But then, people realized: Solar installation was economical, even in
no-subsidy scenarios! And so, again, there was a tremendous growth in
the graphic, increasing steadily, yet reaching levels far exceeding
those in the initial stage. Now, there was no bubble growth based on any
policy, but ‘hard growth’ based on its economic appeal. Of Australia’s
solar panels, finally, there was no need for subsidies, signifying full
maturity.

Although 2025 appears to dip, but it’s just because the year has not
ended yet. Of course, the tale for 2025 has yet to be told, and its
demand looks promising.
Section 4: State-by-State Fuel Mix Changes



Australia’s energy transition is not uniform around the country,
according to state-level charts. Black coal still dominates NSW and QLD,
but solar and wind power are gaining popularity. With the majority of
its power generated by renewable sources, particularly wind, SA provides
the most advanced transition. VIC has the slowest transition to cleaner
sources, continuing to rely on brown coal.
Black and brown coal together contribute to the majority of
Australia’s energy generation, according to the national mix in 2015.
Natural gas is smaller, and hydro, wind and solar only take a small
share. This shows that the system was still mostly fossil-fuel based at
that time.
By the latest year, the share of renewables increases significantly.
Wind and solar expand their contributions, while coal’s share declines
compared to the earlier period. This shows that Australia is slowly
moving toward more renewable energy.
Section 5 – Key Insights and Outlook
Our visual story links four views of Australia’s electricity
transition and shows some key insights:
• Long-term shift in the fuel mix (Section 1): Australia’s generation
structure has gradually moved away from coal-dominated and now wind and
solar take a larger share.
• Day vs night imbalance (Section 2): In New South Wales, solar has
become a main source of daytime electricity, which replace part of coal
generation during the day. However, at night, the system still relies
heavily on coal and gas, which shows that it is still have a problem to
run a grid with a high share of solar at night.
• Drivers of the rooftop solar boom (Section 3): Annual rooftop solar
installations are very high in 2011–2012, fall to a much lower level in
2013–2016 after policy changes, and then increase again from 2017 and
stay high in recent years. This shows that the rooftop solar market has
moved from a short subsidy boom to a stable stage mainly due to lower
costs.
• Uneven transition across states (Section 4): Some states, such as
SA, already get most of their electricity from renewables. Others, like
NSW and QLD, still rely heavily on coal, so the national transition is
slower overall.
Overall, the visuals describe a system that is moving from
coal-dominated generation to a much more solar-rich mix. The next stage
of Australia’s transition will depend on how effectively it can manage
night-time supply, reduce regional gaps, and combine energy storage with
flexible demand to help the system run with a higher share of
renewables.
LS0tDQp0aXRsZTogIkRBVEE1MDAyIEFzc2lnbm1lbnQgMiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KDQotLS0NCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSkNCmBgYA0KDQojIyBTZWN0aW9uIDE6IEV2b2x1dGlvbiBvZiBBdXN0cmFsaWHigJlzIEVsZWN0cmljaXR5IEZ1ZWwgTWl4DQpgYGB7ciBmaWcud2lkdGg9MTQsIGZpZy5oZWlnaHQ9Nn0NCiMgU2VjdGlvbiAxOiBFdm9sdXRpb24gb2YgQXVzdHJhbGlh4oCZcyBFbGVjdHJpY2l0eSBGdWVsIE1peA0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc2NhbGVzKQ0KDQpkZiA8LSByZWFkLmNzdigiR2VuZXJhdGlvbl9GdWVsTWl4XzE5OTktMjAyNS5jc3YiKQ0KZGYkZGF0ZSA8LSBhcy5EYXRlKGRmJGRhdGUpDQpkZiR5ZWFyIDwtIHllYXIoZGYkZGF0ZSkNCg0KZnVlbF9kYXRhIDwtIGRmICU+JQ0KICBzZWxlY3QoDQogICAgeWVhciwNCiAgICBDb2FsX0Jyb3duID0gYENvYWwuLkJyb3duLi4uLi5HV2hgLA0KICAgIENvYWxfQmxhY2sgPSBgQ29hbC4uQmxhY2suLi4uLkdXaGAsDQogICAgR2FzX0NDR1QgPSBgR2FzLi5DQ0dULi4uLi5HV2hgLA0KICAgIEdhc19TdGVhbSA9IGBHYXMuLlN0ZWFtLi4uLi5HV2hgLA0KICAgIEdhc19PQ0dUID0gYEdhcy4uT0NHVC4uLi4uR1doYCwNCiAgICBHYXNfUmVjaXByb2NhdGluZyA9IGBHYXMuLlJlY2lwcm9jYXRpbmcuLi4uLkdXaGAsDQogICAgSHlkcm8gPSBgSHlkcm8uLi4uR1doYCwNCiAgICBXaW5kID0gYFdpbmQuLi4uR1doYCwNCiAgICBTb2xhcl9VdGlsaXR5ID0gYFNvbGFyLi5VdGlsaXR5Li4uLi5HV2hgLA0KICAgIFNvbGFyX1Jvb2Z0b3AgPSBgU29sYXIuLlJvb2Z0b3AuLi4uLkdXaGAsDQogICAgQmlvZW5lcmd5ID0gYEJpb2VuZXJneS4uQmlvbWFzcy4uLi4uR1doYCwNCiAgICBCYXR0ZXJ5ID0gYEJhdHRlcnkuLkRpc2NoYXJnaW5nLi4uLi5HV2hgDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBDb2FsID0gQ29hbF9Ccm93biArIENvYWxfQmxhY2ssDQogICAgR2FzID0gR2FzX0NDR1QgKyBHYXNfU3RlYW0gKyBHYXNfT0NHVCArIEdhc19SZWNpcHJvY2F0aW5nLA0KICAgIFNvbGFyID0gU29sYXJfVXRpbGl0eSArIFNvbGFyX1Jvb2Z0b3AsDQogICAgT3RoZXIgPSBCaW9lbmVyZ3kgKyBCYXR0ZXJ5DQogICkgJT4lDQogIHNlbGVjdCh5ZWFyLCBDb2FsLCBHYXMsIEh5ZHJvLCBXaW5kLCBTb2xhciwgT3RoZXIpDQoNCnllYXJseV9mdWVsIDwtIGZ1ZWxfZGF0YSAlPiUNCiAgZmlsdGVyKHllYXIgPj0gMTk5OSAmIHllYXIgPD0gMjAyNCkgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gLXllYXIsIG5hbWVzX3RvID0gImZ1ZWxfdHlwZSIsIHZhbHVlc190byA9ICJnZW5lcmF0aW9uIikgJT4lDQogIGdyb3VwX2J5KHllYXIsIGZ1ZWxfdHlwZSkgJT4lDQogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bShnZW5lcmF0aW9uKSwgLmdyb3VwcyA9ICJkcm9wIikNCg0KeWVhcmx5X2Z1ZWwkZnVlbF90eXBlIDwtIGZhY3Rvcih5ZWFybHlfZnVlbCRmdWVsX3R5cGUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiQ29hbCIsICJHYXMiLCAiSHlkcm8iLCAiV2luZCIsICJTb2xhciIsICJPdGhlciIpKQ0KDQpnZ3Bsb3QoeWVhcmx5X2Z1ZWwsIGFlcyh4ID0geWVhciwgeSA9IHRvdGFsLCBmaWxsID0gZnVlbF90eXBlKSkgKw0KICBnZW9tX2FyZWEoYWxwaGEgPSAwLjg1KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKA0KICAgIHZhbHVlcyA9IGMoIkNvYWwiID0gIiMyQzNFNTAiLCAiR2FzIiA9ICIjOTVBNUE2IiwgIkh5ZHJvIiA9ICIjMzQ5OERCIiwgDQogICAgICAgICAgICAgICAiV2luZCIgPSAiIzlCNTlCNiIsICJTb2xhciIgPSAiI0YzOUMxMiIsICJPdGhlciIgPSAiIzI3QUU2MCIpLA0KICAgIG5hbWUgPSAiRnVlbCBUeXBlIiwNCiAgICBsYWJlbHMgPSBjKCJDb2FsIiwgIk5hdHVyYWwgR2FzIiwgIkh5ZHJvIiwgIldpbmQiLCAiU29sYXIiLCAiT3RoZXIgUmVuZXdhYmxlcyIpDQogICkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5OTksIDIwMjQsIGJ5ID0gMSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGxhYnModGl0bGUgPSAiRXZvbHV0aW9uIG9mIEF1c3RyYWxpYSdzIEVsZWN0cmljaXR5IEZ1ZWwgTWl4IiwNCiAgICAgICB4ID0gIlllYXIiLA0KICAgICAgIHkgPSAiQW5udWFsIEdlbmVyYXRpb24gKEdXaCkiKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTUpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjIpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgxLCAiY20iKSwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpDQogICkNCmBgYA0KVGhpcyBzdGFja2VkIGFyZWEgcGxvdCBzaG93cyBBdXN0cmFsaWHigJlzIGFubnVhbCBlbGVjdHJpY2l0eSBnZW5lcmF0aW9uIGJ5IGRpZmZlcmVudCBraW5kcyBvZiBmdWVsIGZyb20gMTk5OSB0byAyMDI0LiBUaGUgaGVpZ2h0IG9mIHRoZSBzdGFja2VkIGFyZWFzIHJlcHJlc2VudHMgdG90YWwgZ2VuZXJhdGlvbiBlYWNoIHllYXIuIEkgYWxzbyB1c2UgZGlmZmVyZW50IGNvbG9yIGluZGljYXRpbmcgdGhlIGNvbnRyaWJ1dGlvbnMgb2YgY29hbCwgbmF0dXJhbCBnYXMsIGh5ZHJvLCB3aW5kLCBzb2xhciBhbmQgb3RoZXIgcmVuZXdhYmxlcy4gVGhlIHBsb3Qgc2hvd3MgaG93IHRoZSBvdmVyYWxsIG1peCBoYXMgZ3JhZHVhbGx5IHNoaWZ0ZWQgZnJvbSBjb2FsLWRvbWluYXRlZCBnZW5lcmF0aW9uIHRvd2FyZHMgYSBtb3JlIGRpdmVyc2lmaWVkIGFuZCBtb3JlIHJlbmV3YWJsZS1iYXNlZCBnZW5lcmF0aW9uIG1peC4NCg0KRnVlbCBtaXggd2VyZSBkb21pbmF0ZWQgYnkgY29hbCBmb3IgYSBsb25nIHRpbWUsIGJ1dCBjbGVhcmx5IGRlY3JlYXNlIGluIHJlY2VudCB5ZWFyczogSW4gZWFybHkgeWVhcnMsIGNvYWwgaXMgYSBtYWpvciBmdWVsLCB3aGljaCByZWZsZWN0cyBBdXN0cmFsaWEgaGlzdG9yaWNhbGx5IHJlbGllZCBvbiBjb2FsIHBvd2VyLiBPdmVyIHRpbWUsIHRoZSBjb2FsIGFyZWEgYmVjb21lIHNtYWxsZXIgeWVhciBieSB5ZWFyLCB3aGljaCBpbmRpY2F0ZXMgYSBzdHJ1Y3R1cmFsIGRlY3JlYXNlIGluIGNvYWwgZ2VuZXJhdGlvbiByYXRoZXIgdGhhbiBzaG9ydC10ZXJtIGZsdWN0dWF0aW9ucy4NCg0KU29tZSByZW5ld2FibGVzIGdyb3cgZnJvbSB6ZXJvIHRvIGEgc2lnbmlmaWNhbnQgc2hhcmU6IFdpbmQgYW5kIGVzcGVjaWFsbHkgc29sYXIgc3RhcnQgZnJvbSB6ZXJvIGluIGVhcmx5IHllYXJzLCBidXQgdGhlaXIgYXJlYXMgZXhwYW5kIGV4dHJlbWVseSBmYXN0IGZyb20gdGhlIDIwMTBzLiBUaGlzIHNob3dzIHRoYXQgcmVuZXdhYmxlIHRlY2hub2xvZ2llcyBoYXZlIGdyb3duIGZyb20gYSBzbWFsbCByb2xlIHRvIGEgbWFqb3IgcGFydCBvZiBnZW5lcmF0aW9uIG1peC4NCg0KU28sIHdlIHdhbnQgdG8ga25vdyB3aHkgc29sYXIgcG93ZXIgZGV2ZWxvcCBzbyBxdWlja2x5IGFuZCBzaW5jZSBzb2xhciBwb3dlciBpcyBub3QgYXZhaWxhYmxlIGF0IG5pZ2h0LCB3ZSBhbHNvIHdhbnQgdG8gZXhwbG9yZSBob3cgQXVzdHJhbGlh4oCZcyBlbGVjdHJpY2l0eSBzdXBwbHkgbWl4IGRpZmZlcnMgYmV0d2VlbiBkYXkgYW5kIG5pZ2h0Lg0KDQojIyBTZWN0aW9uIDI6IERheSB2cyBOaWdodCBHZW5lcmF0aW9uIENvbXBvc2l0aW9uIChOU1csIGxhc3QgNyBkYXlzKQ0KYGBge3J9DQojIFNlY3Rpb24gMjogRGF5IHZzIE5pZ2h0IEdlbmVyYXRpb24gQ29tcG9zaXRpb24gKE5TVywgbGFzdCA3IGRheXMpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShwYXRjaHdvcmspDQoNCnJhdyA8LSByZWFkcjo6cmVhZF9jc3YoIjIwMjUxMTEyIE5ldyBTb3V0aCBXYWxlcy5jc3YiKSAlPiUNCiAgY2xlYW5fbmFtZXMoKSAlPiUNCiAgbXV0YXRlKA0KICAgIHRpbWVfdXRjID0geW1kX2htcyhkYXRlLCB0eiA9ICJVVEMiLCBxdWlldCA9IFRSVUUpDQogICkgJT4lDQogIGZpbHRlcighaXMubmEodGltZV91dGMpKSAlPiUNCiAgbXV0YXRlKA0KICAgIHRpbWUgPSB3aXRoX3R6KHRpbWVfdXRjLCAiQXVzdHJhbGlhL1N5ZG5leSIpLA0KICAgIGhvZCAgPSBob3VyKHRpbWUpICsgbWludXRlKHRpbWUpIC8gNjAgICAjIDB+MjQg5bCP5pe2DQogICkNCg0KZ2VuX2xvbmcgPC0gcmF3ICU+JQ0KICBwaXZvdF9sb25nZXIoDQogICAgY29scyA9IGMoDQogICAgICBjb2FsX2JsYWNrX213LA0KICAgICAgYmlvZW5lcmd5X2Jpb21hc3NfbXcsDQogICAgICBnYXNfY2NndF9tdywNCiAgICAgIGdhc19vY2d0X213LA0KICAgICAgaHlkcm9fbXcsDQogICAgICB3aW5kX213LA0KICAgICAgc29sYXJfdXRpbGl0eV9tdywNCiAgICAgIHNvbGFyX3Jvb2Z0b3BfbXcsDQogICAgICBiYXR0ZXJ5X2Rpc2NoYXJnaW5nX213DQogICAgKSwNCiAgICBuYW1lc190byA9ICJmdWVsIiwNCiAgICB2YWx1ZXNfdG8gPSAibXciDQogICkgJT4lDQogIGZpbHRlcighaXMubmEobXcpKSAlPiUNCiAgbXV0YXRlKA0KICAgIGZ1ZWwgPSByZWNvZGUoDQogICAgICBmdWVsLA0KICAgICAgY29hbF9ibGFja19tdyAgICAgICAgICA9ICJDb2FsIChibGFjaykiLA0KICAgICAgYmlvZW5lcmd5X2Jpb21hc3NfbXcgICA9ICJCaW9lbmVyZ3kiLA0KICAgICAgZ2FzX2NjZ3RfbXcgICAgICAgICAgICA9ICJHYXMgQ0NHVCIsDQogICAgICBnYXNfb2NndF9tdyAgICAgICAgICAgID0gIkdhcyBPQ0dUIiwNCiAgICAgIGh5ZHJvX213ICAgICAgICAgICAgICAgPSAiSHlkcm8iLA0KICAgICAgd2luZF9tdyAgICAgICAgICAgICAgICA9ICJXaW5kIiwNCiAgICAgIHNvbGFyX3V0aWxpdHlfbXcgICAgICAgPSAiU29sYXIgKHV0aWxpdHkpIiwNCiAgICAgIHNvbGFyX3Jvb2Z0b3BfbXcgICAgICAgPSAiU29sYXIgKHJvb2Z0b3ApIiwNCiAgICAgIGJhdHRlcnlfZGlzY2hhcmdpbmdfbXcgPSAiQmF0dGVyeSAoZGlzY2hhcmdlKSINCiAgICApDQogICkNCg0KcHJvZmlsZV9ob3VybHkgPC0gZ2VuX2xvbmcgJT4lDQogIG11dGF0ZShob3VyID0gZmxvb3IoaG9kKSkgJT4lICAgICAgICAjIDAsMSwuLi4sMjMNCiAgZ3JvdXBfYnkoZnVlbCwgaG91cikgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBtdyA9IG1lYW4obXcsIG5hLnJtID0gVFJVRSksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApDQoNCnBfYXJlYSA8LSBnZ3Bsb3QocHJvZmlsZV9ob3VybHksDQogICAgICAgICAgICAgICAgIGFlcyh4ID0gaG91ciwgeSA9IG13LCBmaWxsID0gZnVlbCkpICsNCiAgZ2VvbV9hcmVhKCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDI0LCBieSA9IDIpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQXZlcmFnZSAyNC1ob3VyIGdlbmVyYXRpb24gcHJvZmlsZSBieSBmdWVsXG4oTlNXLCBsYXN0IDcgZGF5cykiLA0KICAgIHggPSAiSG91ciBvZiBkYXkiLA0KICAgIHkgPSAiQXZlcmFnZSBnZW5lcmF0aW9uIChNVykiLA0KICAgIGZpbGwgPSAiRnVlbCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpkYXlfbmlnaHRfbWl4IDwtIGdlbl9sb25nICU+JQ0KICBtdXRhdGUoDQogICAgcGVyaW9kID0gaWZfZWxzZSgNCiAgICAgIGhvZCA+PSA3ICYgaG9kIDwgMTcsDQogICAgICAiRGF5ICgwNzowMOKAkzE3OjAwKSIsDQogICAgICAiTmlnaHQgKDE3OjAw4oCTMDc6MDApIg0KICAgICkNCiAgKSAlPiUNCiAgZ3JvdXBfYnkocGVyaW9kLCBmdWVsKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIGVuZXJneV9td2ggPSBzdW0obXcgKiAwLjUsIG5hLnJtID0gVFJVRSksICAjIDMwbWluID0gMC41aA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KDQpwX3BpZV9kYXkgPC0gZGF5X25pZ2h0X21peCAlPiUNCiAgZmlsdGVyKHBlcmlvZCA9PSAiRGF5ICgwNzowMOKAkzE3OjAwKSIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAiIiwgeSA9IGVuZXJneV9td2gsIGZpbGwgPSBmdWVsKSkgKw0KICBnZW9tX2NvbCh3aWR0aCA9IDEpICsNCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsNCiAgbGFicyh0aXRsZSA9ICJEYXl0aW1lIGdlbmVyYXRpb24gbWl4IikgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCnBfcGllX25pZ2h0IDwtIGRheV9uaWdodF9taXggJT4lDQogIGZpbHRlcihwZXJpb2QgPT0gIk5pZ2h0ICgxNzowMOKAkzA3OjAwKSIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAiIiwgeSA9IGVuZXJneV9td2gsIGZpbGwgPSBmdWVsKSkgKw0KICBnZW9tX2NvbCh3aWR0aCA9IDEpICsNCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsNCiAgbGFicyh0aXRsZSA9ICJOaWdodC10aW1lIGdlbmVyYXRpb24gbWl4IikgKw0KICB0aGVtZV92b2lkKCkNCg0KcF9waWVfZGF5ICA8LSBwX3BpZV9kYXkgICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KcF9waWVfbmlnaHQgPC0gcF9waWVfbmlnaHQgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCihwX2FyZWEgfCAocF9waWVfZGF5IC8gcF9waWVfbmlnaHQpKSArDQogIHBsb3RfbGF5b3V0KHdpZHRocyA9IGMoMiwgMSkpICsNCiAgcGxvdF9hbm5vdGF0aW9uKA0KICAgIHRpdGxlID0gIlNlY3Rpb24gMjogRGF5IHZzIE5pZ2h0IEdlbmVyYXRpb24gQ29tcG9zaXRpb24gKE5TVywgbGFzdCA3IGRheXMpIg0KICApDQoNCmBgYA0KVGhpcyBzZXQgb2YgY2hhcnRzIGNsZWFybHkgc2hvd3MgdGhlIGV2b2x1dGlvbiBvZiB0aGUgaW50cmFkYXkgcG93ZXIgZ2VuZXJhdGlvbiBzdHJ1Y3R1cmUgaW4gTmV3IFNvdXRoIFdhbGVzIG92ZXIgdGhlIHBhc3Qgc2V2ZW4gZGF5cy4gSXRzIHZpc3VhbCBmb2N1cyBpcyBvbiBzaG93aW5nIGhvdyByZW5ld2FibGUgZW5lcmd5LCBlc3BlY2lhbGx5IHNvbGFyIGVuZXJneSwgaXMgcmVzaGFwaW5nIHRoZSBwb3dlciBzeXN0ZW0gb3ZlciBkaWZmZXJlbnQgdGltZSBwZXJpb2RzLg0KDQpUaGUgc3RhY2tlZCBhcmVhIG1hcCBvbiB0aGUgbGVmdCBkZXBpY3RzIGEgdHlwaWNhbCAiYXZlcmFnZSAyNC1ob3VyIGdlbmVyYXRpb24gY3VydmUsIiByZXZlYWxpbmcgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgaW4gdGhlIHBvd2VyIGdlbmVyYXRpb24gc3RydWN0dXJlIGR1cmluZyB0aGUgZGF5IHZlcnN1cyBuaWdodC4gQXMgdGhlIGVhcmx5IG1vcm5pbmcgbGlnaHQgaW50ZW5zaWZpZXMsIHNvbGFyIOKAkyBpbmNsdWRpbmcgcm9vZnRvcCBQViBhbmQgbGFyZ2UgZ3JvdW5kLWJhc2VkIHBvd2VyIHBsYW50cyDigJMgcXVpY2tseSBjbGltYnMgdG8gYSBwZWFrIGJldHdlZW4gMTAgYW5kIDE2IG8nY2xvY2ssIGNyZWF0aW5nIHRoZSBub3RpY2VhYmxlIG1pZC1zZWN0aW9uIGJ1bGdlIGluIHRoZSBpbWFnZS4gVGhpcyBzaG93cyB0aGF0IHNvbGFyIGVuZXJneSBoYXMgYmVjb21lIGFuIGltcG9ydGFudCBwaWxsYXIgb2YgZGF5dGltZSBwb3dlciBnZW5lcmF0aW9uLCBhbmQgaGFzIGxlZCB0byBhIGNoYXJhY3RlcmlzdGljICJkdWNrIGN1cnZlIiBhdCBub29uIGZvciB0aGUgb3ZlcmFsbCBsb2FkLCB3aGljaCBpcyBhIGRpcmVjdCByZWZsZWN0aW9uIG9mIHRoZSBpbmNyZWFzaW5nIHByb3BvcnRpb24gb2YgcGhvdG92b2x0YWljcyBpbiB0aGUgcG93ZXIgc3lzdGVtLg0KDQpIb3dldmVyLCBhcyB0aGUgc3VuIGdyYWR1YWxseSBzZXRzIHdlc3R3YXJkLCB0aGUgcG93ZXIgZ2VuZXJhdGlvbiBzdHJ1Y3R1cmUgY2hhbmdlcyByYXBpZGx5IGluIGEgc2hvcnQgcGVyaW9kIG9mIHRpbWUuIEFmdGVyIDUgcC5tLiwgZHVlIHRvIGEgc2hhcnAgZHJvcCBpbiBzb2xhciBvdXRwdXQsIGNvYWwgcG93ZXIgYW5kIHNvbWUgbmF0dXJhbCBnYXMgdW5pdHMgbmVlZCB0byBxdWlja2x5IGluY3JlYXNlIG91dHB1dCB0byBmaWxsIHRoZSBnYXAsIHJlc3VsdGluZyBpbiBhIG5vdGljZWFibGUgcmFtcC11cCBpbiB0aGUgZXZlbmluZywgd2hpY2ggaXMgYWxzbyBvbmUgb2YgdGhlIG1vc3QgY2hhbGxlbmdpbmcgdGltZXMgZm9yIHRoZSBjdXJyZW50IE5FTSBzeXN0ZW0gaW4gdGVybXMgb2Ygc2NoZWR1bGluZyBhbmQgc3RhYmlsaXR5LiBBZnRlciBlbnRlcmluZyB0aGUgbmlnaHQsIHNvbGFyIGVuZXJneSBjb21wbGV0ZWx5IGV4aXRlZCB0aGUgc3lzdGVtLCBhbmQgdGhlIHBvd2VyIGdlbmVyYXRpb24gc3RydWN0dXJlIHdhcyBhZ2FpbiBkb21pbmF0ZWQgYnkgY29hbCBwb3dlciwgaW5kaWNhdGluZyB0aGF0IHRoZSBwb3dlciBzdXBwbHkgYXQgbmlnaHQgaXMgc3RpbGwgaGlnaGx5IGRlcGVuZGVudCBvbiBmb3NzaWwgZW5lcmd5Lg0KDQpUaGUgdHdvIHBpZSBjaGFydHMgb24gdGhlIHJpZ2h0IGZ1cnRoZXIgcmVpbmZvcmNlIHRoaXMgY29uY2x1c2lvbi4gc29sYXIgZW5lcmd5IGhhcyBiZWNvbWUgdGhlIG1haW4gZm9yY2UgaW4gdGhlIHByb3BvcnRpb24gb2YgZGF5dGltZSBwb3dlciBnZW5lcmF0aW9uLCBtYWtpbmcgZm9zc2lsIGZ1ZWxzIHNpZ25pZmljYW50bHkgYWJkaWNhdGUgZHVyaW5nIHRoZSBkYXk7IFRoZSBwb3dlciBnZW5lcmF0aW9uIHN0cnVjdHVyZSBhdCBuaWdodCBpcyBhbG1vc3QgZW50aXJlbHkgc3VwcG9ydGVkIGJ5IGNvYWwsIGdhcywgYW5kIGEgc21hbGwgYW1vdW50IG9mIHdpbmQgcG93ZXIuIFRoaXMgc3RhcmsgY29udHJhc3QgYmV0d2VlbiBkYXkgYW5kIG5pZ2h0IHJldmVhbHMgYSBrZXkgcGFyYWRveCBpbiBBdXN0cmFsaWEncyBlbmVyZ3kgdHJhbnNpdGlvbjogcmVuZXdhYmxlIGVuZXJneSBwZW5ldHJhdGlvbiBpcyBhbHJlYWR5IHZlcnkgaGlnaCBkdXJpbmcgdGhlIGRheSwgYnV0IHRoZXJlIGFyZSBub3QgZW5vdWdoIGZvc3NpbC1mcmVlIGFsdGVybmF0aXZlcyBhdCBuaWdodCwgYW5kIHRoZSBlbmVyZ3kgc3lzdGVtIHN0aWxsIG5lZWRzIHRvIHJlbHkgb24gdHJhZGl0aW9uYWwgYmFzZWxvYWQgcG93ZXIgc291cmNlcy4NCg0KT24gdGhlIG9uZSBoYW5kLCB0aGUgZGV2ZWxvcG1lbnQgb2YgcGhvdG92b2x0YWljcyBpcyBzaWduaWZpY2FudGx5IGNoYW5naW5nIHRoZSBwb3dlciBwYXR0ZXJuIGR1cmluZyB0aGUgZGF5LCBwcm9tb3RpbmcgdGhlIG1hcmdpbmFsaXphdGlvbiBvZiBjb2FsIHBvd2VyIGR1cmluZyB0aGUgZGF5LiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIGludGVybWl0dGVudCBuYXR1cmUgb2Ygc29sYXIgZW5lcmd5IGhpZ2hsaWdodHMgdGhlIG5lZWQgZm9yIGVuZXJneSBzdG9yYWdlLCBiYXR0ZXJ5IGNvbmRpdGlvbmluZyB0ZWNobm9sb2d5LCBhbmQgZmxleGlibGUgZ2FzLWVsZWN0cmljaXR5Lg0KDQojIyBTZWN0aW9uIDM6IFRoZSBSYXBpZCBHcm93dGggb2YgUm9vZnRvcCBTb2xhciBpbiBBdXN0cmFsaWENCmBgYHtyfQ0KIyBTZWN0aW9uIDMuICBUaGUgUmFwaWQgR3Jvd3RoIG9mIFJvb2Z0b3AgU29sYXIgaW4gQXVzdHJhbGlhIA0KIyBMaW5lIGNoYXJ0IHNob3dpbmcgdG90YWwgcm9vZnRvcCBzb2xhciBpbnN0YWxsYXRpb25zIG92ZXIgdGltZXMgDQoNCiMgMS4gbG9hZCBwYWNrYWdlcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHNjYWxlcykNCg0KIyAyLiBsb2FkIGRhdGENCmZpbGVfcGF0aCA8LSAic2d1LXNvbGFyLWluc3RhbGxhdGlvbnMtMjAxMS10by1wcmVzZW50LWFuZC10b3RhbHMuY3N2Ig0KZGYgPC0gcmVhZF9jc3YoZmlsZV9wYXRoKQ0KDQojIDMuIERhdGEgcHJvY2Vzcw0KeWVhcmx5X2RhdGEgPC0gZGYgJT4lDQogIHNlbGVjdChtYXRjaGVzKCJJbnN0YWxsYXRpb24gUXVhbnRpdHkiKSkgJT4lDQogIHNlbGVjdCgtYFRvdGFsIEluc3RhbGxhdGlvbiBRdWFudGl0eWAsIC1gSGlzdG9yaWMgVG90YWwgSW5zdGFsbGF0aW9uIFF1YW50aXR5ICgyMDAxIC0gMjAxMClgKSAlPiUNCiAgc3VtbWFyaXNlKGFjcm9zcyhldmVyeXRoaW5nKCksIHN1bSwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gZXZlcnl0aGluZygpLCBuYW1lc190byA9ICJQZXJpb2QiLCB2YWx1ZXNfdG8gPSAiTW9udGhseV9Db3VudCIpICU+JQ0KICBtdXRhdGUoWWVhciA9IGFzLm51bWVyaWMoc3RyX2V4dHJhY3QoUGVyaW9kLCAiXFxkezR9IikpKSAlPiUNCiAgZ3JvdXBfYnkoWWVhcikgJT4lDQogIHN1bW1hcmlzZShZZWFybHlfTmV3X0luc3RhbGxhdGlvbnMgPSBzdW0oTW9udGhseV9Db3VudCkpICU+JQ0KICBhcnJhbmdlKFllYXIpICU+JQ0KICB1bmdyb3VwKCkNCg0KIyA0LiBUb3RhbCBuZXcgaW5zdGFsbGF0aW9ucyBwZXIgeWVhcg0KZ2dwbG90KHllYXJseV9kYXRhLCBhZXMoeCA9IGZhY3RvcihZZWFyKSwgeSA9IFllYXJseV9OZXdfSW5zdGFsbGF0aW9ucykpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjMDA3MkIyIikgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKFllYXJseV9OZXdfSW5zdGFsbGF0aW9ucykpLCANCiAgICAgICAgICAgIHZqdXN0ID0gLTAuNSwgDQogICAgICAgICAgICBzaXplID0gMykgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkFubnVhbCBSb29mdG9wIFNvbGFyIEluc3RhbGxhdGlvbnMgaW4gQXVzdHJhbGlhIiwNCiAgICBzdWJ0aXRsZSA9ICJUb3RhbCBuZXcgaW5zdGFsbGF0aW9ucyBwZXIgeWVhciIsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkFubnVhbCBJbnN0YWxsYXRpb25zIg0KICApICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpIA0KICApDQpgYGANCkF1c3RyYWxpYSdzIGluaXRpYWwgZ3Jvd3RoIHN0YWdlIChhcm91bmQgMjAxMSB0byAyMDEyKSBzYXcgc3Vic3RhbnRpYWwgZ3Jvd3RoIGluIHJvb2Z0b3Agc29sYXIgYWRvcHRpb24gaW4gQXVzdHJhbGlhLiBUaGUgZXN0YWJsaXNobWVudCBvZiB2YXJpb3VzIGluY2VudGl2ZXMgc3VjaCBhcyBTb2xhciBIb21lcyBhbmQgQ29tbXVuaXRpZXMgUHJvZ3JhbSAoU0hDUCkgYW5kIFJlbmV3YWJsZSBFbmVyZ3kgVGFyZ2V0IChSRVQpIHBvbGljeSBmcm9tIHRoZSBBdXN0cmFsaWFuIEdvdmVybm1lbnQsIHdpdGggc3VwcGxlbWVudGFyeSBzdXBwb3J0IGZyb20gRmVlZC1pbiBUYXJpZmYgc3Vic2lkaWVzIGluIHNldmVyYWwgQXVzdHJhbGlhbiBTdGF0ZXMsIGNvbnRyaWJ1dGVkIHRvIHN1Y2ggZ3Jvd3RoLg0KDQpCdXQgd2l0aCB0aGUgbWFzc2l2ZSBzdXBwb3J0IGluIDIwMTAtMjAxMiwgdGhlcmUgd2FzIHRyZW1lbmRvdXMgcHJlc3N1cmUgb24gc3RhdGUgZXhwZW5kaXR1cmVzLCBzdWNoIHRoYXQgZWFjaCBzdGF0ZSB3YXMgZm9yY2VkIHRvIHRha2UgZHJhc3RpYyBzdGVwcyB0byBjdXJiIGl0cyBtb21lbnR1bS4gV2l0aGRyYXdhbCBvZiBzdWNoIGZhdm9yYWJsZSBzdWJzaWRpZXMgY2F1c2VkIGEgc2hvcnQtdGVybSBzbG93LWRvd24gaW4gdGhlaXIgaW5zdGFsbGF0aW9uIGluIHRoZSB5ZWFycyB0aGF0IGZvbGxvd2VkICgyMDEzLTIwMTYpLg0KDQpCdXQgcGVyaGFwcyBtb3N0IGRyYW1hdGljYWxseSwgdGhlIHNpdHVhdGlvbiBldm9sdmVkIGluIE5ldyBTb3V0aCBXYWxlcywgd2l0aCBpbnN0YWxsYXRpb24gY29zdHMgZXNjYWxhdGluZyBvdXQgb2YgY29udHJvbCwgZmFyIGluIGV4Y2VzcyBvZiBleHBlY3RhdGlvbnMuIEFjY29yZGluZ2x5LCBpbiBKdWx5IDIwMTEsIGFwcGxpY2F0aW9ucyBmb3IgdGhlIGhlYXZpbHkgc3Vic2lkaXplZCBTb2xhciBCb251cyBTY2hlbWUgd2VyZSBzdWRkZW5seSBjbG9zZWQgYnkgdGhlIGdvdmVybm1lbnQuIEJ1dCB0aGlzIGFjdGVkIGFzIGEgY2F0YWx5c3QgZm9yIHNlaXppbmcgInRoZSBsYXN0IHRyYWluIG91dCwiIGluZXZpdGFibHkgZm9sbG93ZWQgYnkgbWFya2V0IGNvbGxhcHNlLiBBbHNvLCBpbiBKdWx5IDIwMTIsIGluIFF1ZWVuc2xhbmQsIGdvdmVybm1lbnRzIGRyYXN0aWNhbGx5IHJlZHVjZWQgdGhlaXIgNDQgY2VudHMva1doIGZlZSB0byBqdXN0IDggY2VudHMuIEJ1dCBhZ2FpbiwgYWZ0ZXIgc3VjaCBkcmFzdGljIGNoYW5nZXMsIHdpdGggcHJvbG9uZ2VkIHdhaXQgdGltZXMsIGNvbnN1bWVycyBzaG93ZWQgbGVzcyBlbnRodXNpYXNtLCB3aGlsZSBpbiBsYXRlIDIwMTEsIGluIFZpY3RvcmlhLCB0aGVpciBQcmVtaXVtIEZpVCBzY2hlbWUgd2FzIHN1ZGRlbmx5IGVuZGVkLiBXaXRob3V0IHRoZXNlIHN1YnNpZGllcywgc3VkZGVubHksIHRoZXJlIHdhcyB0YWxrIGFib3V0IGxpdmluZyB3aXRoICJ3aW50ZXIiIGluIHRoZSBtYXJrZXQgKDIwMTPigJMyMDE2KSwgZHVyaW5nIHdoaWNoIGNvbnN1bWVycyBoYWQgdG8gd2FpdCBvbiB0aGUgc2lkZWxpbmVzLg0KDQpgYGB7cn0NCiMgNS4gTnVtYmVyIG9mIG5ldyBpbnN0YWxsYXRpb25zIHBlciB5ZWFyDQpnZ3Bsb3QoeWVhcmx5X2RhdGEsIGFlcyh4ID0gWWVhciwgeSA9IFllYXJseV9OZXdfSW5zdGFsbGF0aW9ucykpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gIiMwMDcyQjIiLCBsaW5ld2lkdGggPSAxLjIpICsgDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzAwNzJCMiIsIHNpemUgPSAzKSArICAgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShZZWFybHlfTmV3X0luc3RhbGxhdGlvbnMpKSwgDQogICAgICAgICAgICB2anVzdCA9IC0xLCBzaXplID0gMy41KSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQW5udWFsIFJvb2Z0b3AgU29sYXIgSW5zdGFsbGF0aW9ucyBpbiBBdXN0cmFsaWEgKFRyZW5kKSIsDQogICAgc3VidGl0bGUgPSAiTnVtYmVyIG9mIG5ldyBpbnN0YWxsYXRpb25zIHBlciB5ZWFyIiwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQW5udWFsIEluc3RhbGxhdGlvbnMiDQogICkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKG1pbih5ZWFybHlfZGF0YSRZZWFyKSwgbWF4KHllYXJseV9kYXRhJFllYXIpLCBieSA9IDEpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMSwgMC4xNSkpKSArIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLA0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSANCiAgKQ0KYGBgDQpEdXJpbmcgdGhlc2UgeWVhcnMsIGRlcHJpdmVkIG9mIHN1YnN0YW50aWFsIHN1YnNpZGllcywgY29uc3VtZXJzIGhhZCB0byB3YWl0IGZvciBmdXJ0aGVyIGRlY2xpbmVzIGluIHRoZSB0ZWNobm9sb2dpY2FsIGNvc3RzIG9mIHNvbGFyIHBhbmVscyB1bnRpbCBzeXN0ZW1zIGJlY2FtZSBlY29ub21pY2FsbHkgdmlhYmxlIHdpdGhvdXQgZ2VuZXJvdXMgc3Vic2lkaWVzLg0KDQpKdXN0IHdoZW4gYWxsIGhvcGVzIHNlZW1lZCBsb3N0LCB3aXRoIHRoZSBtYXJrZXQgb24gdGhlIHByZWNpcGljZSBvZiByZWFjaGluZyBpdHMgcGVhaywgdGhlcmUgY2FtZSBhIHR1cm5pbmcgcG9pbnQsIHdpdGggaW5ub3ZhdGlvbiBiZWluZyB0aGUgbmV3IHNhdmlvciwgbm90IHRoZSBnb3Zlcm5tZW50LiBGcm9tIDIwMTYgb253YXJkcywgaW5ub3ZhdGlvbiBpbiB0aGUgcGhvdG92b2x0YWljIG1hcmtldCByZWFjaGVkIGl0cyBtYXR1cml0eSwgd2l0aCBjb3N0cyBmb3Igc29sYXIgY2VsbCBwcm9kdWN0aW9uIGJlaW5nIHNpZ25pZmljYW50bHkgcmVkdWNlZCB0byBsZXNzIHRoYW4gaGFsZiBmb3IgYSA1a1cgY2FwYWNpdHkgaW4gYSBzaG9ydCBzcGFuLCB3aGlsZSBpbm5vdmF0aW9ucyBhbHNvIGluY3JlYXNlZCB0aGVpciBjYXBhY2l0eSB0byBiZSB1dGlsaXplZCBvbiByZXNpZGVudGlhbCBzY2FsZXMgKGF2ZXJhZ2UgY2FwYWNpdHkgZnJvbSA0a1cgdG8gYWJvdmUgNmtXKS4NCg0KQnV0IHRoZW4sIHBlb3BsZSByZWFsaXplZDogU29sYXIgaW5zdGFsbGF0aW9uIHdhcyBlY29ub21pY2FsLCBldmVuIGluIG5vLXN1YnNpZHkgc2NlbmFyaW9zISBBbmQgc28sIGFnYWluLCB0aGVyZSB3YXMgYSB0cmVtZW5kb3VzIGdyb3d0aCBpbiB0aGUgZ3JhcGhpYywgaW5jcmVhc2luZyBzdGVhZGlseSwgeWV0IHJlYWNoaW5nIGxldmVscyBmYXIgZXhjZWVkaW5nIHRob3NlIGluIHRoZSBpbml0aWFsIHN0YWdlLiBOb3csIHRoZXJlIHdhcyBubyBidWJibGUgZ3Jvd3RoIGJhc2VkIG9uIGFueSBwb2xpY3ksIGJ1dCDigJhoYXJkIGdyb3d0aOKAmSBiYXNlZCBvbiBpdHMgZWNvbm9taWMgYXBwZWFsLiBPZiBBdXN0cmFsaWHigJlzIHNvbGFyIHBhbmVscywgZmluYWxseSwgdGhlcmUgd2FzIG5vIG5lZWQgZm9yIHN1YnNpZGllcywgc2lnbmlmeWluZyBmdWxsIG1hdHVyaXR5Lg0KDQpgYGB7cn0NCiMgR3Jvd3RoIG9mIHRvdGFsIGluc3RhbGxlZCB1bml0cyBvdmVyIHRpbWUgKDIwMTAgLSBQcmVzZW50KQ0KaGlzdG9yaWNfdG90YWwgPC0gZGYgJT4lDQogIHB1bGwoYEhpc3RvcmljIFRvdGFsIEluc3RhbGxhdGlvbiBRdWFudGl0eSAoMjAwMSAtIDIwMTApYCkgJT4lDQogIHN1bShuYS5ybSA9IFRSVUUpDQoNCnllYXJseV9jdW11bGF0aXZlX2RhdGEgPC0gZGYgJT4lDQogIHNlbGVjdChtYXRjaGVzKCJJbnN0YWxsYXRpb24gUXVhbnRpdHkiKSkgJT4lDQogIHNlbGVjdCgtYFRvdGFsIEluc3RhbGxhdGlvbiBRdWFudGl0eWAsIC1gSGlzdG9yaWMgVG90YWwgSW5zdGFsbGF0aW9uIFF1YW50aXR5ICgyMDAxIC0gMjAxMClgKSAlPiUNCiAgc3VtbWFyaXNlKGFjcm9zcyhldmVyeXRoaW5nKCksIHN1bSwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gZXZlcnl0aGluZygpLCBuYW1lc190byA9ICJQZXJpb2QiLCB2YWx1ZXNfdG8gPSAiTW9udGhseV9Db3VudCIpICU+JQ0KICBtdXRhdGUoWWVhciA9IGFzLm51bWVyaWMoc3RyX2V4dHJhY3QoUGVyaW9kLCAiXFxkezR9IikpKSAlPiUNCiAgZ3JvdXBfYnkoWWVhcikgJT4lDQogIHN1bW1hcmlzZShZZWFybHlfTmV3ID0gc3VtKE1vbnRobHlfQ291bnQpKSAlPiUNCiAgYXJyYW5nZShZZWFyKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUoVG90YWxfQ3VtdWxhdGl2ZSA9IGhpc3RvcmljX3RvdGFsICsgY3Vtc3VtKFllYXJseV9OZXcpKQ0KDQpzdGFydF9wb2ludCA8LSB0aWJibGUoDQogIFllYXIgPSAyMDEwLA0KICBZZWFybHlfTmV3ID0gMCwNCiAgVG90YWxfQ3VtdWxhdGl2ZSA9IGhpc3RvcmljX3RvdGFsDQopDQoNCmZpbmFsX3Bsb3RfZGF0YSA8LSBiaW5kX3Jvd3Moc3RhcnRfcG9pbnQsIHllYXJseV9jdW11bGF0aXZlX2RhdGEpDQoNCmdncGxvdChmaW5hbF9wbG90X2RhdGEsIGFlcyh4ID0gWWVhciwgeSA9IFRvdGFsX0N1bXVsYXRpdmUpKSArDQogIGdlb21fbGluZShjb2xvciA9ICIjRDU1RTAwIiwgbGluZXdpZHRoID0gMS4yKSArIA0KICBnZW9tX3BvaW50KGNvbG9yID0gIiNENTVFMDAiLCBzaXplID0gMykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoVG90YWxfQ3VtdWxhdGl2ZSkpLCANCiAgICAgICAgICAgIHZqdXN0ID0gLTEsIHNpemUgPSAzLCBjaGVja19vdmVybGFwID0gVFJVRSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRvdGFsIEN1bXVsYXRpdmUgUm9vZnRvcCBTb2xhciBJbnN0YWxsYXRpb25zIGluIEF1c3RyYWxpYSIsDQogICAgc3VidGl0bGUgPSAiR3Jvd3RoIG9mIHRvdGFsIGluc3RhbGxlZCB1bml0cyBvdmVyIHRpbWUgKDIwMTAgLSBQcmVzZW50KSIsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIlRvdGFsIEN1bXVsYXRpdmUgSW5zdGFsbGF0aW9ucyAoVW5pdHMpIg0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDEwLCBtYXgoZmluYWxfcGxvdF9kYXRhJFllYXIpLCBieSA9IDEpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDUsIDAuMTUpKSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLCANCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCkgDQogICkNCmBgYA0KQWx0aG91Z2ggMjAyNSBhcHBlYXJzIHRvIGRpcCwgYnV0IGl0J3MganVzdCBiZWNhdXNlIHRoZSB5ZWFyIGhhcyBub3QgZW5kZWQgeWV0LiBPZiBjb3Vyc2UsIHRoZSB0YWxlIGZvciAyMDI1IGhhcyB5ZXQgdG8gYmUgdG9sZCwgYW5kIGl0cyBkZW1hbmQgbG9va3MgcHJvbWlzaW5nLg0KDQojIyBTZWN0aW9uIDQ6IFN0YXRlLWJ5LVN0YXRlIEZ1ZWwgTWl4IENoYW5nZXMNCmBgYHtyfQ0KIyBTZWN0aW9uIDQ6IFN0YXRlLWJ5LVN0YXRlIEZ1ZWwgTWl4IENoYW5nZXMgDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc2NhbGVzKQ0KDQphZXNfZmlsZSA8LSAiQXVzdHJhbGlhbiBFbmVyZ3kgU3RhdGlzdGljcyAyMDI1IFRhYmxlIE8ueGxzeCINCg0KbG9hZF9zdGF0ZV9jeSA8LSBmdW5jdGlvbihzdGF0ZV9jb2RlKSB7DQogIHNoZWV0X25hbWUgPC0gcGFzdGUoc3RhdGVfY29kZSwgIkNZIikNCiAgcmF3IDwtIHJlYWRfZXhjZWwoYWVzX2ZpbGUsDQogICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gc2hlZXRfbmFtZSwNCiAgICAgICAgICAgICAgICAgICAgc2tpcCA9IDQpDQogIGZ1ZWxfY29sX25hbWUgPC0gbmFtZXMocmF3KVsxXQ0KICBkZiA8LSByYXcgJT4lDQogICAgcmVuYW1lKEZ1ZWwgPSBhbGxfb2YoZnVlbF9jb2xfbmFtZSkpICU+JQ0KICAgIGZpbHRlcighaXMubmEoRnVlbCkpICU+JQ0KICAgIGZpbHRlcighRnVlbCAlaW4lIGMoDQogICAgICAiVG90YWwgbm9uLXJlbmV3YWJsZSIsICJUb3RhbCByZW5ld2FibGUiLCAiVG90YWwiLA0KICAgICAgIk5vbi1yZW5ld2FibGUgZnVlbHMiLCAiUmVuZXdhYmxlIGZ1ZWxzIiwgIk5vdGVzIg0KICAgICkpICU+JQ0KICAgIHBpdm90X2xvbmdlcigNCiAgICAgIGNvbHMgPSAtRnVlbCwNCiAgICAgIG5hbWVzX3RvID0gIlllYXIiLA0KICAgICAgdmFsdWVzX3RvID0gIkdXaCINCiAgICApICU+JQ0KICAgIG11dGF0ZSgNCiAgICAgIFllYXIgPSBnc3ViKCIgLioiLCAiIiwgWWVhciksDQogICAgICBZZWFyID0gYXMuaW50ZWdlcihZZWFyKSwNCiAgICAgIEdXaCA9IGFzLm51bWVyaWMoR1doKSwNCiAgICAgIFN0YXRlID0gc3RhdGVfY29kZQ0KICAgICkgJT4lDQogICAgZmlsdGVyKCFpcy5uYShHV2gpKQ0KICByZXR1cm4oZGYpDQp9DQoNCnN0YXRlcyA8LSBjKCJOU1ciLCAiUUxEIiwgIlNBIiwgIlZJQyIpDQpzdGF0ZV9kYXRhIDwtIGJpbmRfcm93cyhsYXBwbHkoc3RhdGVzLCBsb2FkX3N0YXRlX2N5KSkNCnN0YXRlX3NoYXJlIDwtIHN0YXRlX2RhdGEgJT4lDQogIGdyb3VwX2J5KFN0YXRlLCBZZWFyKSAlPiUNCiAgbXV0YXRlKFNoYXJlID0gR1doIC8gc3VtKEdXaCwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHVuZ3JvdXAoKQ0KDQpwX2FyZWEgPC0gZ2dwbG90KHN0YXRlX3NoYXJlLA0KICAgICAgICAgICAgICAgICBhZXMoeCA9IFllYXIsDQogICAgICAgICAgICAgICAgICAgICB5ID0gU2hhcmUsDQogICAgICAgICAgICAgICAgICAgICBmaWxsID0gRnVlbCkpICsNCiAgZ2VvbV9hcmVhKGFscGhhID0gMC45KSArDQogIGZhY2V0X3dyYXAofiBTdGF0ZSwgbmNvbCA9IDIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwoDQogICAgdmFsdWVzID0gYygNCiAgICAgICJCbGFjayBjb2FsIiA9ICIjMWY3OGI0IiwNCiAgICAgICJCcm93biBjb2FsIiA9ICIjYTZjZWUzIiwNCiAgICAgICJOYXR1cmFsIGdhcyIgPSAiIzMzYTAyYyIsDQogICAgICAiR2FzIiAgICAgICAgPSAiIzMzYTAyYyIsDQogICAgICAiSHlkcm8iICAgICAgPSAiI2IyZGY4YSIsDQogICAgICAiV2luZCIgICAgICAgPSAiIzZhM2Q5YSIsDQogICAgICAiU29sYXIiICAgICAgPSAiI2ZmN2YwMCIsDQogICAgICAiT3RoZXIiICAgICAgPSAiI2ZiOWE5OSINCiAgICApDQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlN0YXRlLWJ5LXN0YXRlIGVsZWN0cmljaXR5IGdlbmVyYXRpb24gbWl4IChDYWxlbmRhciBZZWFyKSIsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIlNoYXJlIG9mIHRvdGFsIGdlbmVyYXRpb24iLA0KICAgIGZpbGwgPSAiRnVlbCB0eXBlIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIiksDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIg0KICApDQoNCnBfYXJlYSAgIA0KDQphdXNfZGF0YSA8LSBsb2FkX3N0YXRlX2N5KCJBVVMiKQ0KDQphdXNfc2hhcmUgPC0gYXVzX2RhdGEgJT4lDQogIGdyb3VwX2J5KFllYXIpICU+JQ0KICBtdXRhdGUoU2hhcmUgPSBHV2ggLyBzdW0oR1doLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgdW5ncm91cCgpDQoNCmVhcmxpZXN0X3llYXIgPC0gbWluKGF1c19zaGFyZSRZZWFyLCBuYS5ybSA9IFRSVUUpDQpsYXRlc3RfeWVhciAgIDwtIG1heChhdXNfc2hhcmUkWWVhciwgbmEucm0gPSBUUlVFKQ0KDQptaXhfZWFybGllc3QgPC0gYXVzX3NoYXJlICU+JSBmaWx0ZXIoWWVhciA9PSBlYXJsaWVzdF95ZWFyKQ0KbWl4X2xhdGVzdCAgIDwtIGF1c19zaGFyZSAlPiUgZmlsdGVyKFllYXIgPT0gbGF0ZXN0X3llYXIpDQoNCnBsb3RfcGllIDwtIGZ1bmN0aW9uKGRmLCB0aXRsZV90ZXh0KSB7DQogIGdncGxvdChkZiwgYWVzKHggPSAiIiwgeSA9IFNoYXJlLCBmaWxsID0gRnVlbCkpICsNCiAgICBnZW9tX2NvbCh3aWR0aCA9IDEsIGNvbG9yID0gIndoaXRlIikgKw0KICAgIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsNCiAgICBzY2FsZV9maWxsX21hbnVhbCgNCiAgICAgIHZhbHVlcyA9IGMoDQogICAgICAgICJCbGFjayBjb2FsIiA9ICIjMWY3OGI0IiwNCiAgICAgICAgIkJyb3duIGNvYWwiID0gIiNhNmNlZTMiLA0KICAgICAgICAiTmF0dXJhbCBnYXMiID0gIiMzM2EwMmMiLA0KICAgICAgICAiR2FzIiAgICAgICAgPSAiIzMzYTAyYyIsDQogICAgICAgICJIeWRybyIgICAgICA9ICIjYjJkZjhhIiwNCiAgICAgICAgIldpbmQiICAgICAgID0gIiM2YTNkOWEiLA0KICAgICAgICAiU29sYXIiICAgICAgPSAiI2ZmN2YwMCIsDQogICAgICAgICJPdGhlciIgICAgICA9ICIjZmI5YTk5Ig0KICAgICAgKQ0KICAgICkgKw0KICAgIGxhYnMoDQogICAgICB0aXRsZSA9IHRpdGxlX3RleHQsDQogICAgICBmaWxsICA9ICJGdWVsIHR5cGUiDQogICAgKSArDQogICAgdGhlbWVfdm9pZCgpICsNCiAgICB0aGVtZSgNCiAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0Ig0KICAgICkNCn0NCg0KcGllX2VhcmxpZXN0IDwtIHBsb3RfcGllKG1peF9lYXJsaWVzdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIkF1c3RyYWxpYW4gZnVlbCBtaXggaW4gIiwgZWFybGllc3RfeWVhcikpDQoNCnBpZV9sYXRlc3QgPC0gcGxvdF9waWUobWl4X2xhdGVzdCwNCiAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJBdXN0cmFsaWFuIGZ1ZWwgbWl4IGluICIsIGxhdGVzdF95ZWFyKSkNCg0KcGllX2VhcmxpZXN0DQpwaWVfbGF0ZXN0DQpgYGANCkF1c3RyYWxpYSdzIGVuZXJneSB0cmFuc2l0aW9uIGlzIG5vdCB1bmlmb3JtIGFyb3VuZCB0aGUgY291bnRyeSwgYWNjb3JkaW5nIHRvIHN0YXRlLWxldmVsIGNoYXJ0cy4gQmxhY2sgY29hbCBzdGlsbCBkb21pbmF0ZXMgTlNXIGFuZCBRTEQsIGJ1dCBzb2xhciBhbmQgd2luZCBwb3dlciBhcmUgZ2FpbmluZyBwb3B1bGFyaXR5LiBXaXRoIHRoZSBtYWpvcml0eSBvZiBpdHMgcG93ZXIgZ2VuZXJhdGVkIGJ5IHJlbmV3YWJsZSBzb3VyY2VzLCBwYXJ0aWN1bGFybHkgd2luZCwgU0EgcHJvdmlkZXMgdGhlIG1vc3QgYWR2YW5jZWQgdHJhbnNpdGlvbi4gVklDIGhhcyB0aGUgc2xvd2VzdCB0cmFuc2l0aW9uIHRvIGNsZWFuZXIgc291cmNlcywgY29udGludWluZyB0byByZWx5IG9uIGJyb3duIGNvYWwuDQoNCkJsYWNrIGFuZCBicm93biBjb2FsIHRvZ2V0aGVyIGNvbnRyaWJ1dGUgdG8gdGhlIG1ham9yaXR5IG9mIEF1c3RyYWxpYSdzIGVuZXJneSBnZW5lcmF0aW9uLCBhY2NvcmRpbmcgdG8gdGhlIG5hdGlvbmFsIG1peCBpbiAyMDE1LiBOYXR1cmFsIGdhcyBpcyBzbWFsbGVyLCBhbmQgaHlkcm8sIHdpbmQgYW5kIHNvbGFyIG9ubHkgdGFrZSBhIHNtYWxsIHNoYXJlLiBUaGlzIHNob3dzIHRoYXQgdGhlIHN5c3RlbSB3YXMgc3RpbGwgbW9zdGx5IGZvc3NpbC1mdWVsIGJhc2VkIGF0IHRoYXQgdGltZS4NCg0KQnkgdGhlIGxhdGVzdCB5ZWFyLCB0aGUgc2hhcmUgb2YgcmVuZXdhYmxlcyBpbmNyZWFzZXMgc2lnbmlmaWNhbnRseS4gV2luZCBhbmQgc29sYXIgZXhwYW5kIHRoZWlyIGNvbnRyaWJ1dGlvbnMsIHdoaWxlIGNvYWzigJlzIHNoYXJlIGRlY2xpbmVzIGNvbXBhcmVkIHRvIHRoZSBlYXJsaWVyIHBlcmlvZC4gVGhpcyBzaG93cyB0aGF0IEF1c3RyYWxpYSBpcyBzbG93bHkgbW92aW5nIHRvd2FyZCBtb3JlIHJlbmV3YWJsZSBlbmVyZ3kuDQoNCiMjIFNlY3Rpb24gNSDigJMgS2V5IEluc2lnaHRzIGFuZCBPdXRsb29rDQpPdXIgdmlzdWFsIHN0b3J5IGxpbmtzIGZvdXIgdmlld3Mgb2YgQXVzdHJhbGlh4oCZcyBlbGVjdHJpY2l0eSB0cmFuc2l0aW9uIGFuZCBzaG93cyBzb21lIGtleSBpbnNpZ2h0czoNCg0K4oCiCUxvbmctdGVybSBzaGlmdCBpbiB0aGUgZnVlbCBtaXggKFNlY3Rpb24gMSk6IEF1c3RyYWxpYeKAmXMgZ2VuZXJhdGlvbiBzdHJ1Y3R1cmUgaGFzIGdyYWR1YWxseSBtb3ZlZCBhd2F5IGZyb20gY29hbC1kb21pbmF0ZWQgYW5kIG5vdyB3aW5kIGFuZCBzb2xhciB0YWtlIGEgbGFyZ2VyIHNoYXJlLg0KDQrigKIJRGF5IHZzIG5pZ2h0IGltYmFsYW5jZSAoU2VjdGlvbiAyKTogSW4gTmV3IFNvdXRoIFdhbGVzLCBzb2xhciBoYXMgYmVjb21lIGEgbWFpbiBzb3VyY2Ugb2YgZGF5dGltZSBlbGVjdHJpY2l0eSwgd2hpY2ggcmVwbGFjZSBwYXJ0IG9mIGNvYWwgZ2VuZXJhdGlvbiBkdXJpbmcgdGhlIGRheS4gSG93ZXZlciwgYXQgbmlnaHQsIHRoZSBzeXN0ZW0gc3RpbGwgcmVsaWVzIGhlYXZpbHkgb24gY29hbCBhbmQgZ2FzLCB3aGljaCBzaG93cyB0aGF0IGl0IGlzIHN0aWxsIGhhdmUgYSBwcm9ibGVtIHRvIHJ1biBhIGdyaWQgd2l0aCBhIGhpZ2ggc2hhcmUgb2Ygc29sYXIgYXQgbmlnaHQuDQoNCuKAoglEcml2ZXJzIG9mIHRoZSByb29mdG9wIHNvbGFyIGJvb20gKFNlY3Rpb24gMyk6IEFubnVhbCByb29mdG9wIHNvbGFyIGluc3RhbGxhdGlvbnMgYXJlIHZlcnkgaGlnaCBpbiAyMDEx4oCTMjAxMiwgZmFsbCB0byBhIG11Y2ggbG93ZXIgbGV2ZWwgaW4gMjAxM+KAkzIwMTYgYWZ0ZXIgcG9saWN5IGNoYW5nZXMsIGFuZCB0aGVuIGluY3JlYXNlIGFnYWluIGZyb20gMjAxNyBhbmQgc3RheSBoaWdoIGluIHJlY2VudCB5ZWFycy4gVGhpcyBzaG93cyB0aGF0IHRoZSByb29mdG9wIHNvbGFyIG1hcmtldCBoYXMgbW92ZWQgZnJvbSBhIHNob3J0IHN1YnNpZHkgYm9vbSB0byBhIHN0YWJsZSBzdGFnZSBtYWlubHkgZHVlIHRvIGxvd2VyIGNvc3RzLg0KDQrigKIJVW5ldmVuIHRyYW5zaXRpb24gYWNyb3NzIHN0YXRlcyAoU2VjdGlvbiA0KTogU29tZSBzdGF0ZXMsIHN1Y2ggYXMgU0EsIGFscmVhZHkgZ2V0IG1vc3Qgb2YgdGhlaXIgZWxlY3RyaWNpdHkgZnJvbSByZW5ld2FibGVzLiBPdGhlcnMsIGxpa2UgTlNXIGFuZCBRTEQsIHN0aWxsIHJlbHkgaGVhdmlseSBvbiBjb2FsLCBzbyB0aGUgbmF0aW9uYWwgdHJhbnNpdGlvbiBpcyBzbG93ZXIgb3ZlcmFsbC4NCg0KT3ZlcmFsbCwgdGhlIHZpc3VhbHMgZGVzY3JpYmUgYSBzeXN0ZW0gdGhhdCBpcyBtb3ZpbmcgZnJvbSBjb2FsLWRvbWluYXRlZCBnZW5lcmF0aW9uIHRvIGEgbXVjaCBtb3JlIHNvbGFyLXJpY2ggbWl4LiBUaGUgbmV4dCBzdGFnZSBvZiBBdXN0cmFsaWHigJlzIHRyYW5zaXRpb24gd2lsbCBkZXBlbmQgb24gaG93IGVmZmVjdGl2ZWx5IGl0IGNhbiBtYW5hZ2UgbmlnaHQtdGltZSBzdXBwbHksIHJlZHVjZSByZWdpb25hbCBnYXBzLCBhbmQgY29tYmluZSBlbmVyZ3kgc3RvcmFnZSB3aXRoIGZsZXhpYmxlIGRlbWFuZCB0byBoZWxwIHRoZSBzeXN0ZW0gcnVuIHdpdGggYSBoaWdoZXIgc2hhcmUgb2YgcmVuZXdhYmxlcy4NCg==