Food Security Cluster Myanmar homepage


Summary of new achievements

Beneficiaries of humanitarian action formed 51% of the 49,950 beneficiaries in July 2022. The remainder were reached through development interventions.

In this report, when beneficiaries are mentioned, the Food Security Cluster is referring to unique beneficiaries or individuals. This is different from a beneficiary frequency which is an instance of a person receiving aid i.e. a person who receives food distributions, a crop, vegetable and seed kit and farmer training would be counted as three beneficiary frequencies, but as only one beneficiary.

As monthly reporting has just started, the volume of reporting is still lower than the pro-rated quarterly submissions. This means that several partners will hold off on reporting their achievements until the end of the quarter.


In terms of activities, farmer training and food distributions formed the bulk of the activities implemented in July. However, as mentioned earlier, these figure will be revised when new data comes in.



Overall, however, food distribution remains far and away the largest activity.



Food security interventions in July 2022 overwhelmingly targeted persons in host and local communities, this group forms 87.21% of all food distribution support, or 43,562 beneficiary frequencies (this includes if a person had been reached previously and are currently receiving their second or third round of assistance).




1. Geographies



1.1 States

A total of 3,267,194 beneficiaries were reached in July 2022.



Overall, these are year-to-date state-level breakdowns of beneficiaries reached:




July saw much fewer persons reached in Yangon than in previous months. It is hoped that the reallocation of resources out of the affluent urban core has been accelerated. It is also encouraging to see Magway receive the second-most support, after Rakhine.



1.2 Townships

A total of 132 townships have been reached across 16 states/regions as of 31st July 2022. In July alone, 52 townships were reached.

11,182 beneficiaries were reached in Magway township, this was 22% of the total.



When comparing the current footprint to that of the first quarter, the more activity was observed in Mandalay, Magway, Kayah and Kayin.



5 newly-reached townships were added in July 2022. They all in Shan South are are Laikha, Loilen, Mongnai, Mongpan and Nansang. All very traditionally remote and underserved areas.

Of the 2,544 sites reached, 421 had more than one partner present.



The food security cluster’s partners can mostly be found in Yangon, Rakhine and Kachin.





2. Activities

2.1 Progress by activity

The dotted red line shows the end of Q2 2022. The thick line in grey shows the progress in 2021 for the same activity. It should be noted that the 2021 progress lines are just a reference and not meant to be a direct comparison. The scope of the HRP was much different at the start of 2021 and the response only became nationwide in June; the FSC was also much smaller than it is now in 2022. Indeed, with the post-coup crisis affecting both humanitarian and development programming, the need for stronger coordination to adapt food food security programming has pushed many partners to enter the FSC. This type of comparison will be more useful next year.



In July 2022, progress primarily came from multi-purpose cash transfers, farmer training, food distributions and vocational training.



2.2 Agricultural and livelihoods activities

422,315 persons were reached through a combination of crop, vegetable and seed kits, FFS and farmer training, IGA and small grants and livestock kits.




2.3 Delivery modalities

Only HEB and fortified rice, community infrastructure and equipment and kitchen garden kits were delivered entirely through in-kind modalities.



There are also clear differences between the different beneficiary types and the delivery modalities employed with them. Beneficiaries from host/local communities largely received in-kind distributions whilst those from camps and IDP sites mostly received cash-based interventions, indicating that partners mostly worked in the same areas in Q1 and Q2.



Areas with the highest number of IDPs, such as Sagaing, Rakhine and Kachin, reach most of their beneficiaries through cash-based programming.





3. Cash-based programming

3.1 MMK per household

Compared to Q1, beneficiaries in Q2 are much less likely to have received cash transfers of less than USD 10 per household. The most common transfer values were between USD 60 and 70, an increase from the previous quarter.

In July 2022, the most common transfers values were between MMK 100,000 and MMK 200,000,



About 40% of beneficiaries of multi-purpose cash transfers in July 2022 were of quite high value.




3.2 MMK per person

The boxplots below shows the range of cash transfer values (all values are per person, to facilitate comparability) by activity. The average for reach activity is marked by the thick line in the middle of each box. The leftmost and rightmost side of each box indicate the 25th and 75th percentile of transfer values, respectively. The length of each box is a gauge for how much variation there is in the transfer values of each activity.

These plots use data for the entire year, instead of just July.



Each of the bubbles represents an individual intervention, with their position along the x-axis showing the USD per person value of the intervention and the size of each bubble indicating the number of beneficiaries reached.

Food distributions tended to have the tightest range of values, which proves that food assistance is quite standardised amongst partners.





3.3 Food distributions


Beneficiaries in Rakhine are split into two groups, one at around MMK 7,000 and another at MMK 17,000. Kayin has a very large number of persons who received less than MMK 1,000 each.

Distributions in Chin and Ayeyarwady had very consistent values as they were all implemented by the same implementing partner.

The table below compares the different bins for cash transfer values of food distributions with the minimum expenditure basket for food established by the Cash Working Group. They have established a floor of MMK 190,555 (or USD 114.55) for the food security component per household per month.

Overall, 1.86% of food distribution beneficiaries have received at least 100% of the food security MEB and 8.99% have received at least 50% of the food security MEB (MMK 19,056 or USD 11.45 per person).




3.4 Implementing partners

The plots below show the the average cash transfer values by activity for the top 7 partners implementing that activity. The x-axis shows the number of beneficiaries reached and the depth of the colour indicates the value of the cash transfer.





4. Partners

A total of 75 partners have reported into the Food Security Cluster as of July 2022 – there are 66 implementing partners and 28 reporting partners. This first instance of monthly reporting has seen a significant dip in submissions, but response has overall been better than expected.

All this means is that several partners are waiting until the end of the quarter to report in.

This section will mostly only look at year-to-date achievements.




4.1 Implementing partners

There are 16 partners that were involved in direct implementation that have reported achievements in July 2022, in comparison with 66 in the first quarter. These implementing partners corresponded to a total of 28 reporting organisations. The largest reporting organisation, 2690, had 24 implementing partners.

The interactive plot below shows the number of beneficiaries and townships reached by implementing partner.

14 partners (21% of the total) have a presence in more than 5 townships. 11 partners (16% of the total) are present in more than 10 townships.




4.2 Monthly progress by partner

The thick grey line shows an organisation’s progress from last year, which, as mentioned, cannot exactly be used for a straight comparison as the scope of the HRP in 2021 was different until the approval of the IERP, additionally, many partners only joined the cluster late in 2021 or even in 2022. Still, it serves as a reference.



The table below lists the top 15 partners by number of beneficiaries reached in 2022.




4.3 Donors

The table below summarises the reach and scope (in terms of geographic extent and number of organisations supported) of donors who support at least two reporting organisations.



Sagaing, Shan (East), Tanintharyi and Magway have the fewest number of donors present.



However, as shown by the table below, even though the majority of partners reported their donors, the omission of data from three key partners has resulted in the vast majority of reported beneficiaries not being associated with any donor.





5. Beneficiaries

87.21% of all beneficiaries in July 2022 were from host or local communities.





5.1 Beneficiary types

In July 2022, 87.21% of beneficiaries were from host or local communities, in comparison to 75.12% for the whole year. 12.18% of beneficiaries in July 2022 were IDPs, compared to 18.51% for the whole year.





6. Comparison with targets

6.1 Reached vs target by township

The specifics of each township can be reviewed with the interactive plot below. Each point is a township, with the size indicating the number of beneficiaries. The x-axis indicates the target population by township and the y-axis shows the number of beneficiaries reached, as of 31 July 2022.

The red line down the middle represents reaching 100% of the target. Townships above this line have reached more beneficiaries than their target and townships below the line have not met their target yet. The further away a township is from the red line, the further above or below its target it is. Mouse over each of the townships to see more details.

The 13 townships along the extreme left side of the plot have beneficiaries but do not have targets (their targets have just been coded as 1 so that they show up on the plot). 198 townships with targets have not been reached.



In most of the townships where the food security cluster is present, the number of beneficiaries reached is under the cluster target. Townships which have been heavily oversubscribed have been listed in the second quarter 5Ws report.



6.2 Map of beneficiaries reached in Q1 & Q2 2022 vs target




6.3 Interactive reference table

In the interactive table below, is a list of townships sorted by the gap between the targeted population and beneficiaries reached in 2022. Any of the columns can be sorted; the search bars above each column can also be used to filter entries.


LS0tDQp0aXRsZTogIlJlcG9ydCBvbiA1V3MiDQpzdWJ0aXRsZTogIkp1bHkgMjAyMiINCmF1dGhvcjogIk15YW5tYXIgRm9vZCBTZWN1cml0eSBDbHVzdGVyIg0KZGF0ZTogIjIwMjItMDktMDEiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBjb2xsYXBzZWQ6IG5vDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDcwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIk15YW5tYXJfY2x1c3Rlcl9ibHVlLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc3RyaW5naSkNCmxpYnJhcnkocGFuZGVyKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShmdXp6eWpvaW4pDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShza2ltcikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KGJyb29tKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KGdnZm9yY2UpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCg0KdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpDQoNCiMgZGlzYWJsaW5nIHNjaWVudGlmaWMgbm90YXRpb24NCm9wdGlvbnMoc2NpcGVuID0gMTAwKQ0KDQojIHBhbmRlciB0YWJsZXMgYWxsIGluIG9uZSByb3cNCnBhbmRlck9wdGlvbnMoJ3RhYmxlLnNwbGl0LnRhYmxlJywgSW5mKQ0KDQojIHBhbmRlciB0aG91c2FuZHMgc2VwYXJhdG9yDQpwYW5kZXJPcHRpb25zKCJiaWcubWFyayIsICIsIikNCg0KIyByZXBsYWNlIA0Kb3B0cyA8LSBvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gIiIpDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KIyBmdW5jdGlvbiBmb3IgdHJhbnNwb3NpbmcgZGYNCnRyYW5zcG9zZV9kZiA8LSBmdW5jdGlvbihkZikgew0KICB0X2RmIDwtIGRhdGEudGFibGU6OnRyYW5zcG9zZShkZikNCiAgY29sbmFtZXModF9kZikgPC0gcm93bmFtZXMoZGYpDQogIHJvd25hbWVzKHRfZGYpIDwtIGNvbG5hbWVzKGRmKQ0KICB0X2RmIDwtIHRfZGYgJT4lDQogICAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oLmRhdGEgPSAuKSAlPiUNCiAgICB0aWJibGU6OmFzX3RpYmJsZSguKQ0KICByZXR1cm4odF9kZikNCn0NCg0KIyBmdW5jdGlvbiBiZW5lZmljaWFyeSBzdW1tYXJpZXMNCnN1bV9iZW4gPC0gZnVuY3Rpb24oZGYsIGNvbHVtbl92YXIpew0KICANCiAgY29sdW1uX3ZhciA8LSBlbnF1byhjb2x1bW5fdmFyKQ0KICANCiAgZGYgJT4lDQogICAgZ3JvdXBfYnkoISFjb2x1bW5fdmFyKSAlPiUgIyBtdXN0IGFkZCBiYW5nLWJhbmcNCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpIA0KICAgIA0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcywgMiBncm91cGVkIHZhcmlhYmxlcw0Kc3VtX2JlbjIgPC0gZnVuY3Rpb24oZGYsIGNvbHVtbl92YXIxLCBjb2x1bW5fdmFyMil7DQogIA0KICBjb2x1bW5fdmFyMSA8LSBlbnF1byhjb2x1bW5fdmFyMSkNCiAgY29sdW1uX3ZhcjIgPC0gZW5xdW8oY29sdW1uX3ZhcjIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIxLCAhIWNvbHVtbl92YXIyKSAlPiUgIyBtdXN0IGFkZCBiYW5nLWJhbmcNCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpIA0KICAgIA0KfQ0KDQojIHNjYWxpbmcgZnVuY3Rpb25zIA0KcmFuZ2UwMSA8LSBmdW5jdGlvbih4KXsoeC1taW4oeCkpLyhtYXgoeCktbWluKHgpKX0NCnJhbmdlX3duYSA8LSBmdW5jdGlvbih4KXsoeC1taW4oeCwgbmEucm0gPSBUUlVFKSkvKG1heCh4LCBuYS5ybSA9IFRSVUUpLW1pbih4LCBuYS5ybSA9IFRSVUUpKX0NCg0KI21vZGUgZnVuY3Rpb24gDQptb2RlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgdXggPC0gdW5pcXVlKHgpDQogIHV4W3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh4LCB1eCkpKV0NCn0NCmBgYA0KDQoNCmBgYHtyIGRhdGF9DQoNCmZzYyA8LSByZWFkX2NzdigiLi9kYXRhL2ZzYy5jc3YiKSAlPiUgDQogIG11dGF0ZShqdWx5ID0gaWZlbHNlKG1vbnRoX29mX2ltcGxlbWVudGF0aW9uID09ICJKdWx5IDIwMjIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgImp1bHkiLCAiamFuX3RvX2p1biIpKSANCg0KZnNjXzIwMjEgPC0gcmVhZF9jc3YoIi4vZGF0YS9mc2NfMjAyMS5jc3YiKQ0KDQpwaW4gPC0gcmVhZF9jc3YoIi4vZGF0YS9mc19waW4uY3N2IikNCg0KaGRfbGlzdCA8LSBmc2MgJT4lIA0KICBncm91cF9ieShodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQsIGFjdGl2aXR5X3JlZCkgJT4lDQogIG11dGF0ZShoZCA9IGlmZWxzZShodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQgPT0gIkh1bWFuaXRhcmlhbiIgfA0KICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAiSHVtYW5pdGFyaWFuIiwgDQogICAgICAgICAgICAgICAgICAgICAiRGV2ZWxvcG1lbnQiKSkgJT4lIA0KICBtdXRhdGUoaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID0gDQogICAgICAgICAgIGlmZWxzZShhY3Rpdml0eV9yZWQgPT0gIm11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlciIgJg0KICAgICAgICAgICAgICAgICAgICBodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQgPT0gIkRldmVsb3BtZW50IiwNCiAgICAgICAgICAgICAgICAgICJIdW1hbml0YXJpYW4iLCBodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQpDQogICAgICAgICApICU+JQ0KICBncm91cF9ieShoZCkgJT4lIA0KICBzdW1tYXJpc2VfYXQoImJlbmVmaWNpYXJpZXMiLCBzdW0pICU+JQ0KICBtdXRhdGUocGMgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkNCg0KIyBzaGFwZWZpbGVzDQpwY29kZTNfc2hhcGUgPC0gc3RfcmVhZCgiLi9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JSANCiAgcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICBhZG1pbjFfcGNvZGUgPSBTVF9QQ09ERSwNCiAgICAgICAgdG93bnNoaXAgPSBUUywNCiAgICAgICAgYWRtaW4zX3Bjb2RlID0gVFNfUENPREUpICU+JSANCiBtdXRhdGUoYWRtaW4zX3Bjb2RlID0gaWZlbHNlKHN0cl9kZXRlY3QodG93bnNoaXAsICJIbGFpbmd0aGFyeWEiKSwgIk1NUjAxMzAwOCIsIGFkbWluM19wY29kZSkpDQoNCnBjb2RlMV9zaGFwZSA8LSBzdF9yZWFkKCIuL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway9tbXJfcG9sYm5kYTJfYWRtMV9taW11XzI1MGsuc2hwIiwgcXVpZXQgPSBUUlVFKSAlPiUgDQogcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICBhZG1pbjFfcGNvZGUgPSBTVF9QQ09ERSkgJT4lIHN0X2FzX3NmKCkNCg0KYGBgDQoNCg0KW0Zvb2QgU2VjdXJpdHkgQ2x1c3RlciBNeWFubWFyIGhvbWVwYWdlXShodHRwczovL2Zvb2Qtc2VjdXJpdHktY2x1c3Rlci1teWFubWFyLmdpdGh1Yi5pby8pDQoNCjxicj4NCg0KDQojIyBTdW1tYXJ5IG9mIG5ldyBhY2hpZXZlbWVudHMgIA0KDQpgYGB7ciBtYXBzLXRzcC1qdWwsIGZpZy5oZWlnaHQ9OX0NCmZzYyAlPiUgDQogIGZpbHRlcihqdWx5ID09ICJqdWx5IikgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSBjKCJhZG1pbjNfcGNvZGVfb2xkIiA9ICJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGJlbmVmaWNpYXJpZXMpLCBzaXplID0gLjEpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCA1MDAwMDApLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXk5MCIsIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSAuMykgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksIA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgDQogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoLjcsICJjbSIpLCANCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAid2hpdGUiKSkgKyANCiAgbGFicyh0aXRsZSA9ICJCZW5lZmljaWFyaWVzIGJ5IHRvd25zaGlwLCBKdWx5IDIwMjIiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUb3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICsgDQogIA0KZnNjICU+JSANCiAgIyBmaWx0ZXIocXVhcnRlciA9PSAicTIiKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9IGMoImFkbWluM19wY29kZV9vbGQiID0gImFkbWluM19wY29kZSIpKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gYmVuZWZpY2lhcmllcyksIHNpemUgPSAuMSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEsIHRyYW5zID0gImxvZzEwIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgNTAwMDAwKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5OTAiKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCANCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCguNywgImNtIiksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJ3aGl0ZSIpKSArIA0KICBsYWJzKHRpdGxlID0gIkJlbmVmaWNpYXJpZXMgYnkgdG93bnNoaXAsIGFzIG9mIDIwMjItMDctMzEiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUb3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICANCg0KIyBnZ3NhdmUoIi4vbWFwc19xMV9xMi5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDksIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KICANCmBgYA0KDQoNCg0KYGBge3Igb3ZlcmFsbC1wYywgZXZhbD1GQUxTRX0NCmZpbHRlcihmc2MsIGh1bWFuaXRhcmlhbl9vcl9kZXZlbG9wbWVudCA9PSAiSHVtYW5pdGFyaWFuIikgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9IC8gc3VtKHBpbiRmc190YXJnZXRlZCkNCg0Kcm91bmQoZmlsdGVyKGZzYywgaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID09ICJIdW1hbml0YXJpYW4iICYganVseSA9PSAianVseSIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9IC8gZmlsdGVyKGZzYywganVseSA9PSAianVseSIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICogMTAwLCBkaWdpdHMgPSAyKQ0KYGBgDQoNCkJlbmVmaWNpYXJpZXMgb2YgaHVtYW5pdGFyaWFuIGFjdGlvbiBmb3JtZWQgYHIgcm91bmQoZmlsdGVyKGZzYywgaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID09ICJIdW1hbml0YXJpYW4iICYganVseSA9PSAianVseSIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9IC8gZmlsdGVyKGZzYywganVseSA9PSAianVseSIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIHRoZSBgciBmaWx0ZXIoZnNjLCBqdWx5ID09ICJqdWx5IikgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGJlbmVmaWNpYXJpZXMgaW4gSnVseSAyMDIyLiBUaGUgcmVtYWluZGVyIHdlcmUgcmVhY2hlZCB0aHJvdWdoIGRldmVsb3BtZW50IGludGVydmVudGlvbnMuDQoNCkluIHRoaXMgcmVwb3J0LCB3aGVuIGJlbmVmaWNpYXJpZXMgYXJlIG1lbnRpb25lZCwgdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBpcyByZWZlcnJpbmcgdG8gdW5pcXVlIGJlbmVmaWNpYXJpZXMgb3IgaW5kaXZpZHVhbHMuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gYSBiZW5lZmljaWFyeSBmcmVxdWVuY3kgd2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgYSBwZXJzb24gcmVjZWl2aW5nIGFpZCBpLmUuIGEgcGVyc29uIHdobyByZWNlaXZlcyBmb29kIGRpc3RyaWJ1dGlvbnMsIGEgY3JvcCwgdmVnZXRhYmxlIGFuZCBzZWVkIGtpdCBhbmQgZmFybWVyIHRyYWluaW5nIHdvdWxkIGJlIGNvdW50ZWQgYXMgdGhyZWUgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMsIGJ1dCBhcyBvbmx5IG9uZSBiZW5lZmljaWFyeS4gDQoNCkFzIG1vbnRobHkgcmVwb3J0aW5nIGhhcyBqdXN0IHN0YXJ0ZWQsIHRoZSB2b2x1bWUgb2YgcmVwb3J0aW5nIGlzIHN0aWxsIGxvd2VyIHRoYW4gdGhlIHByby1yYXRlZCBxdWFydGVybHkgc3VibWlzc2lvbnMuIFRoaXMgbWVhbnMgdGhhdCBzZXZlcmFsIHBhcnRuZXJzIHdpbGwgaG9sZCBvZmYgb24gcmVwb3J0aW5nIHRoZWlyIGFjaGlldmVtZW50cyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBxdWFydGVyLiANCg0KYGBge3J9DQpmc2MgJT4lICAgDQogIGdyb3VwX2J5KGRhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcmllcyA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICBuZXdfYmVuZWZpY2lhcmllcyA9IGlmZWxzZSgNCiAgICAgICAgICAgaXMubmEoYmVuZWZpY2lhcmllcyAtIGxhZyhiZW5lZmljaWFyaWVzKSksIA0KICAgICAgICAgICBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgYmVuZWZpY2lhcmllcyAtIGxhZyhiZW5lZmljaWFyaWVzKQ0KICAgICAgICAgKSwgDQogICAgICAgICBgJV9pbmNyZWFzZWAgPSByb3VuZCgoYmVuZWZpY2lhcmllcyAtIGxhZyhiZW5lZmljaWFyaWVzKSkgLyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWcoYmVuZWZpY2lhcmllcykgKiAxMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSwgDQogICAgICAgICBkYXRlID0gZm9ybWF0KGFzLkRhdGUoZGF0ZSksICIlYiAlWSIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCBwZXIgbW9udGgiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjcpIA0KYGBgDQoNCjxicj4NCg0KSW4gdGVybXMgb2YgYWN0aXZpdGllcywgZmFybWVyIHRyYWluaW5nIGFuZCBmb29kIGRpc3RyaWJ1dGlvbnMgZm9ybWVkIHRoZSBidWxrIG9mIHRoZSBhY3Rpdml0aWVzIGltcGxlbWVudGVkIGluIEp1bHkuIEhvd2V2ZXIsIGFzIG1lbnRpb25lZCBlYXJsaWVyLCB0aGVzZSBmaWd1cmUgd2lsbCBiZSByZXZpc2VkIHdoZW4gbmV3IGRhdGEgY29tZXMgaW4uIA0KDQo8YnI+DQoNCg0KYGBge3IgYWN0aXZpdHktbGlzdH0NCmFjdGl2aXR5X2xpc3QgPC0gZnNjICU+JSANCiAgc3VtX2JlbjIocXVhcnRlciwgYWN0aXZpdHlfcmVkKSAlPiUgDQogIGdyb3VwX2J5KHF1YXJ0ZXIpICU+JSANCiAgbXV0YXRlKHBjID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpDQpgYGANCg0KDQpgYGB7ciBiYXJwbG90LWFjdGl2aXR5fQ0KDQpmc2MgJT4lIA0KICBmaWx0ZXIoanVseSA9PSAianVseSIpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHkgPSBhY3Rpdml0eV9yZWQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShhY3Rpdml0eSA9IGZjdF9yZW9yZGVyKGFjdGl2aXR5LCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICB5ID0gYWN0aXZpdHksIA0KICAgICAgICAgICAgIGZpbGwgPSBhY3Rpdml0eSkpICsgDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGxhYnMoeCA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIGluIEp1bHkgMjAyMiwgYnkgYWN0aXZpdHkiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KYGBgDQoNCjxicj4NCg0KT3ZlcmFsbCwgaG93ZXZlciwgZm9vZCBkaXN0cmlidXRpb24gcmVtYWlucyBmYXIgYW5kIGF3YXkgdGhlIGxhcmdlc3QgYWN0aXZpdHkuIA0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLWFjdGl2aXR5fQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoanVseSwgYWN0aXZpdHlfcmVkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0ganVseSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IGphbl90b19qdW4gKyBqdWx5LCANCiAgICAgICAgIHBjID0gcm91bmQodG90YWwgLyBzdW0odG90YWwsIG5hLnJtID0gVFJVRSkgKiAxMDAsIA0KICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSwgDQogICAgICAgICBwY19qdWx5ID0gcm91bmQoanVseSAvIHN1bShqdWx5LCBuYS5ybSA9IFRSVUUpICogMTAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMikpICU+JSANCiAgZmlsdGVyKHRvdGFsICE9IDApICU+JSANCiAgYXJyYW5nZShkZXNjKHBjKSkgJT4lIA0KICBzZWxlY3QoYWN0aXZpdHkgPSBhY3Rpdml0eV9yZWQsIA0KICAgICAgICAgamFuX3RvX2p1biwganVseSwgDQogICAgICAgICBgJV9vZl9qdWx5YCA9IHBjX2p1bHksIA0KICAgICAgICAgdG90YWwsIA0KICAgICAgICAgYCVfb2ZfdG90YWxgID0gcGMpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oY2FwdGlvbiA9ICJCZW5lZmljaWFyaWVzIGJ5IGFjaXRpdml0eSwgYXMgb2YgMzEgSnVseSAyMDIyIikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLA0KICAgICAgICAgICAgICB3aWR0aCA9IC44NSkNCg0KDQpgYGANCg0KPGJyPg0KDQoNCmBgYHtyIGJlbi10eXBlLWxpc3R9DQpiZW5fdHlwZV9saXN0IDwtIGZzYyAlPiUNCiAgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgDQogIGdyb3VwX2J5KGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwYyA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKQ0KYGBgDQoNCkZvb2Qgc2VjdXJpdHkgaW50ZXJ2ZW50aW9ucyBpbiBKdWx5IDIwMjIgb3ZlcndoZWxtaW5nbHkgdGFyZ2V0ZWQgcGVyc29ucyBpbiBob3N0IGFuZCBsb2NhbCBjb21tdW5pdGllcywgdGhpcyBncm91cCBmb3JtcyBgciBiZW5fdHlwZV9saXN0ICU+JSBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSA9PSAiSG9zdC9sb2NhbCBDb21tdW5pdHkiKSAlPiUgcHVsbChwYylgJSBvZiBhbGwgZm9vZCBkaXN0cmlidXRpb24gc3VwcG9ydCwgb3IgYHIgYmVuX3R5cGVfbGlzdCAlPiUgZmlsdGVyKGJlbmVmaWNpYXJ5X3R5cGUgPT0gIkhvc3QvbG9jYWwgQ29tbXVuaXR5IikgJT4lIHB1bGwoYmVuZWZpY2lhcmllcykgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzICh0aGlzIGluY2x1ZGVzIGlmIGEgcGVyc29uIGhhZCBiZWVuIHJlYWNoZWQgcHJldmlvdXNseSBhbmQgYXJlIGN1cnJlbnRseSByZWNlaXZpbmcgdGhlaXIgc2Vjb25kIG9yIHRoaXJkIHJvdW5kIG9mIGFzc2lzdGFuY2UpLiANCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMS4gR2VvZ3JhcGhpZXMNCg0KPGJyPjxicj4NCg0KIyMjIDEuMSBTdGF0ZXMNCg0KQSB0b3RhbCBvZiBgciBmb3JtYXQoc3VtKGZzYyRuZXdfYmVuZWZpY2lhcmllcyksIGJpZy5tYXJrID0gIiwiKWAgYmVuZWZpY2lhcmllcyB3ZXJlIHJlYWNoZWQgaW4gSnVseSAyMDIyLiANCg0KPGJyPg0KDQoNCmBgYHtyIHN0YXRlLWp1bHksIGZpZy5oZWlnaHQgPSA2fQ0KDQpmc2MgJT4lIA0KICBmaWx0ZXIoanVseSA9PSAianVseSIpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGZjdF9yZW9yZGVyKHN0YXRlLCBiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAgeCA9IGJlbmVmaWNpYXJpZXMsIA0KICAgICAgICAgICAgIGZpbGwgPSBzdGF0ZSkpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKyANCiAgbGFicyhmaWxsID0gIiIsIA0KICAgICAgIHggPSAiQmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IHN0YXRlLCBvbmx5IEp1bHkgMjAyMiIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCiAgDQpgYGANCg0KPGJyPg0KDQpPdmVyYWxsLCB0aGVzZSBhcmUgeWVhci10by1kYXRlIHN0YXRlLWxldmVsIGJyZWFrZG93bnMgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkOiANCg0KPGJyPg0KDQpgYGB7ciBzdGF0ZS15dGQsIGZpZy5oZWlnaHQgPSA2fQ0KDQpmc2MgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gZmN0X3Jlb3JkZXIoc3RhdGUsIGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgICB4ID0gYmVuZWZpY2lhcmllcywgDQogICAgICAgICAgICAgZmlsbCA9IHN0YXRlKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIA0KICBsYWJzKGZpbGwgPSAiIiwgDQogICAgICAgeCA9ICJCZW5lZmljaWFyaWVzIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJCZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgc3RhdGUsIGFzIG9mIDMxIEp1bHkgMjAyMiIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCiAgDQpgYGANCg0KPGJyPjxicj4NCg0KDQpgYGB7ciBzdGF0ZS1saXN0fQ0Kc3RhdGVfbGlzdCA8LSBmc2MgJT4lIA0KICBzdW1fYmVuMihzdGF0ZSwgcXVhcnRlcikgJT4lIA0KICBncm91cF9ieShxdWFydGVyKSAlPiUgDQogIG11dGF0ZShwYyA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKQ0KDQpgYGANCg0KDQpKdWx5IHNhdyBtdWNoIGZld2VyIHBlcnNvbnMgcmVhY2hlZCBpbiBZYW5nb24gdGhhbiBpbiBwcmV2aW91cyBtb250aHMuIEl0IGlzIGhvcGVkIHRoYXQgdGhlIHJlYWxsb2NhdGlvbiBvZiByZXNvdXJjZXMgb3V0IG9mIHRoZSBhZmZsdWVudCB1cmJhbiBjb3JlIGhhcyBiZWVuIGFjY2VsZXJhdGVkLiBJdCBpcyBhbHNvIGVuY291cmFnaW5nIHRvIHNlZSBNYWd3YXkgcmVjZWl2ZSB0aGUgc2Vjb25kLW1vc3Qgc3VwcG9ydCwgYWZ0ZXIgUmFraGluZS4gDQoNCmBgYHtyIGV2YWw9IEZBTFNFfQ0KZnNjICU+JSANCiAgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyAxLjIgVG93bnNoaXBzDQoNCkEgdG90YWwgb2YgYHIgZGlzdGluY3QoZnNjLCBhZG1pbjNfcGNvZGUpICU+JSBucm93KClgIHRvd25zaGlwcyBoYXZlIGJlZW4gcmVhY2hlZCBhY3Jvc3MgYHIgZGlzdGluY3QoZnNjLCBhZG1pbjFfcGNvZGUpICU+JSBucm93KClgIHN0YXRlcy9yZWdpb25zIGFzIG9mIDMxc3QgSnVseSAyMDIyLiBJbiBKdWx5IGFsb25lLCBgciBmaWx0ZXIoZnNjLCBqdWx5ID09ICJqdWx5IikgJT4lIGRpc3RpbmN0KGFkbWluM19wY29kZSkgJT4lIG5yb3coKWAgdG93bnNoaXBzIHdlcmUgcmVhY2hlZC4gDQoNCmBgYHtyIHRvcC10b3duc2hpcHMtcGMsIGluY2x1ZGU9RkFMU0V9DQpmc2MgJT4lIA0KICBncm91cF9ieShzdGF0ZSwgdG93bnNoaXApICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIG11dGF0ZShwYyA9IGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgYXJyYW5nZShkZXNjKHBjKSkgJT4lIA0KICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDEyMDAwMCkgJT4lIA0KICB7c3VtKC4kcGMpfQ0KYGBgDQoNCjExLDE4MiBiZW5lZmljaWFyaWVzIHdlcmUgcmVhY2hlZCBpbiBNYWd3YXkgdG93bnNoaXAsIHRoaXMgd2FzIDIyJSBvZiB0aGUgdG90YWwuICANCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS10b3AtdG93bnNoaXBzfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUsIHRvd25zaGlwLCBqdWx5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMsIG5hbWVzX2Zyb20gPSBqdWx5LCANCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IGphbl90b19qdW4gKyBqdWx5LCANCiAgICAgICAgIHBjID0gcm91bmQodG90YWwgLyBzdW0odG90YWwpICogMTAwLCANCiAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMiksIA0KICAgICAgICAgcGNfanVseSA9IHJvdW5kKGp1bHkgLyBzdW0oanVseSkgKiAxMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocGNfanVseSkpICU+JSANCiAgaGVhZCgxMikgJT4lIA0KICAjIHN1bW1hcmlzZV9hdCgianVseSIsIHN1bSkNCiAgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgDQogICAgICAgICBqYW5fdG9fanVuLCBqdWx5LCANCiAgICAgICAgIGAlX29mX2p1bHlgID0gcGNfanVseSwgDQogICAgICAgICB0b3RhbCwgDQogICAgICAgICBgJV9vZl90b3RhbGAgPSBwYykgJT4lDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oY2FwdGlvbiA9ICJUb3AgdG93bnNoaXBzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCwgSnVseSAyMDIyIikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgZm9vdG5vdGUocGFydCA9ICJoZWFkZXIiLCANCiAgICAgICAgICAgaSA9IDEsIGogPSA0LA0KICAgICAgICAgICB2YWx1ZSA9IGFzX3BhcmFncmFwaCgoIlRoZXNlIHRvcCAxMiB0b3duc2hpcHMgYXJlIHdoZXJlIDg2JSBvZiBiZW5lZmljaWFyaWVzIHdlcmUgcmVhY2hlZCBpbiBKdWx5IikpKQ0KDQojIGZzYyAlPiUgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgc3VtbWFyaXNlX2F0KCJuZXdfYmVuZWZpY2lhcmllcyIsIHN1bSkNCiAgDQpgYGANCg0KPGJyPg0KDQpXaGVuIGNvbXBhcmluZyB0aGUgY3VycmVudCBmb290cHJpbnQgdG8gdGhhdCBvZiB0aGUgZmlyc3QgcXVhcnRlciwgdGhlIG1vcmUgYWN0aXZpdHkgd2FzIG9ic2VydmVkIGluIE1hbmRhbGF5LCBNYWd3YXksIEtheWFoIGFuZCBLYXlpbi4gDQoNCg0KPGJyPg0KDQpgYGB7ciBtYXBzLWp1bHksIGZpZy5oZWlnaHQ9OX0NCmZzYyAlPiUgDQogIGZpbHRlcihqdWx5ID09ICJqdWx5IikgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSBjKCJhZG1pbjNfcGNvZGVfb2xkIiA9ICJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGJlbmVmaWNpYXJpZXMpLCBzaXplID0gLjEpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKGRpcmVjdGlvbiA9IC0xLA0KICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCA1MDAwMDApLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXk5MCIsIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSAuMykgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksIA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgDQogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoLjcsICJjbSIpLCANCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAid2hpdGUiKSkgKyANCiAgbGFicyh0aXRsZSA9ICJCZW5lZmljaWFyaWVzIGJ5IHRvd25zaGlwLCBKdWx5IDIwMjIiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUb3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICsgDQogIA0KZnNjICU+JSANCiAgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcikpICU+JSANCiAgbXV0YXRlKHBhcnRuZXJzID0gYXMuY2hhcmFjdGVyKHBhcnRuZXJzKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSBjKCJhZG1pbjNfcGNvZGVfb2xkIiA9ICJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IHBhcnRuZXJzKSwgc2l6ZSA9IC4xKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKGRpcmVjdGlvbiA9IC0xLA0KICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAibWFrbyIsDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXk5MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4zKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCANCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCguNywgImNtIiksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJ3aGl0ZSIpKSArIA0KICBsYWJzKHRpdGxlID0gIlBhcnRuZXJzIGJ5IHRvd25zaGlwLCBKdWx5IDIwMjIiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUb3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiUGFydG5lcnMiKSAgDQoNCiMgZ2dzYXZlKCIuL3Bsb3RzL21hcHNfanVsXzIwMjJfYmVuZWZpY2lhcmVpc19wYXJ0bmVycy5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDksIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KICANCmBgYA0KDQo8YnI+DQoNCmBgYHtyIGV2YWwgPSBGQUxTRX0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KHN0YXRlLCB0b3duc2hpcCwganVseSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgcGl2b3Rfd2lkZXIodmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzLCBuYW1lc19mcm9tID0ganVseSwgDQogICAgICAgICAgICAgIHZhbHVlc19maWxsID0gMCkgJT4lIA0KICBmaWx0ZXIoamFuX3RvX2p1biA9PSAwICYganVseSA+IDApICU+JSANCiAgY291bnQoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKG4gPSBzdW0obikpDQpgYGANCg0KNSBuZXdseS1yZWFjaGVkIHRvd25zaGlwcyB3ZXJlIGFkZGVkIGluIEp1bHkgMjAyMi4gVGhleSBhbGwgaW4gU2hhbiBTb3V0aCBhcmUgYXJlIExhaWtoYSwgTG9pbGVuLCBNb25nbmFpLCBNb25ncGFuIGFuZCBOYW5zYW5nLiBBbGwgdmVyeSB0cmFkaXRpb25hbGx5IHJlbW90ZSBhbmQgdW5kZXJzZXJ2ZWQgYXJlYXMuIA0KDQpPZiB0aGUgYHIgZnNjICU+JSBjb3VudChzdGF0ZSwgdG93bnNoaXAsIGxvY2F0aW9uKSAlPiUgbnJvdygpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBzaXRlcyByZWFjaGVkLCA0MjEgaGFkIG1vcmUgdGhhbiBvbmUgcGFydG5lciBwcmVzZW50LiAgDQoNCjxicj4NCg0KYGBge3J9DQpmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGxvY2F0aW9uKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgdG93bnNoaXApICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBtdXRhdGUocGFydG5lcnMgPSByZWNvZGUocGFydG5lcnMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiID0gIjFfcGFydG5lciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIiID0gIjJfcGFydG5lcnMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIiA9ICIzX3BhcnRuZXJzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiNCIgPSAiNF9wYXJ0bmVycyIpKSAlPiUgDQogIGdyb3VwX2J5KHBhcnRuZXJzKSAlPiUgDQogIHN1bW1hcmlzZV9hdCgibG9jYXRpb24iLCBuX2Rpc3RpbmN0KSAlPiUgIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJOdW1iZXIgb2YgcGFydG5lcnMgYnkgbG9jYXRpb24sIGFzIG9mIDMxIEp1bHkgMjAyMiIpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0IikgDQpgYGANCg0KDQo8YnI+DQoNClRoZSBmb29kIHNlY3VyaXR5IGNsdXN0ZXIncyBwYXJ0bmVycyBjYW4gbW9zdGx5IGJlIGZvdW5kIGluIFlhbmdvbiwgUmFraGluZSBhbmQgS2FjaGluLg0KDQo8YnI+DQoNCmBgYHtyIGxvY2F0aW9ucy1wYXJ0bmVycy1zdGF0ZX0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KHN0YXRlLCB0b3duc2hpcCwgbG9jYXRpb25fdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSkgJT4lDQogIGZpbHRlcihsb2NhdGlvbl90eXBlICE9ICJJbmR1c3RyaWFsIHpvbmUiKSAlPiUgDQogIG11dGF0ZShtZWFuX3BhcnRuZXJzID0gbWVhbihwYXJ0bmVycywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwYXJ0bmVycywgeSA9IGZjdF9yZXYoc3RhdGUpLCBmaWxsID0gbG9jYXRpb25fdHlwZSkpICsNCiAgZ2VvbV9jb2woKSArDQogIGZhY2V0X3dyYXAofiBsb2NhdGlvbl90eXBlKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjRjFDNDBGIiwgIiMxQUJDOUMiLCAiI0VDNzA2MyIpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpKSArIA0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycyIsIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycyBieSBzdGF0ZSBhbmQgbG9jYXRpb24gdHlwZSIpDQogIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAyLiBBY3Rpdml0aWVzDQoNCiMjIyAyLjEgUHJvZ3Jlc3MgYnkgYWN0aXZpdHkNCg0KVGhlIGRvdHRlZCByZWQgbGluZSBzaG93cyB0aGUgZW5kIG9mIFEyIDIwMjIuIFRoZSB0aGljayBsaW5lIGluIGdyZXkgc2hvd3MgdGhlIHByb2dyZXNzIGluIDIwMjEgZm9yIHRoZSBzYW1lIGFjdGl2aXR5LiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgMjAyMSBwcm9ncmVzcyBsaW5lcyBhcmUganVzdCBhIHJlZmVyZW5jZSBhbmQgbm90IG1lYW50IHRvIGJlIGEgZGlyZWN0IGNvbXBhcmlzb24uIFRoZSBzY29wZSBvZiB0aGUgSFJQIHdhcyBtdWNoIGRpZmZlcmVudCBhdCB0aGUgc3RhcnQgb2YgMjAyMSBhbmQgdGhlIHJlc3BvbnNlIG9ubHkgYmVjYW1lIG5hdGlvbndpZGUgaW4gSnVuZTsgdGhlIEZTQyB3YXMgYWxzbyBtdWNoIHNtYWxsZXIgdGhhbiBpdCBpcyBub3cgaW4gMjAyMi4gSW5kZWVkLCB3aXRoIHRoZSBwb3N0LWNvdXAgY3Jpc2lzIGFmZmVjdGluZyBib3RoIGh1bWFuaXRhcmlhbiBhbmQgZGV2ZWxvcG1lbnQgcHJvZ3JhbW1pbmcsIHRoZSBuZWVkIGZvciBzdHJvbmdlciBjb29yZGluYXRpb24gdG8gYWRhcHQgZm9vZCBmb29kIHNlY3VyaXR5IHByb2dyYW1taW5nIGhhcyBwdXNoZWQgbWFueSBwYXJ0bmVycyB0byBlbnRlciB0aGUgRlNDLiBUaGlzIHR5cGUgb2YgY29tcGFyaXNvbiB3aWxsIGJlIG1vcmUgdXNlZnVsIG5leHQgeWVhci4gDQoNCjxicj4NCg0KYGBge3IgcHJvZ3Jlc3MtZmFjZXQtbGluZXBsb3R9DQoNCmFjdF9saW5lXzIwMjEgPC0gZnNjXzIwMjEgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JQ0KICBtdXRhdGUoZGF0ZSA9IGRhdGUgKyB5ZWFycygxKSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eV9yZWQpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fYmVuID0gY3Vtc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShhY3Rpdml0eV9yZWQgPSBzdHJfcmVwbGFjZV9hbGwoYWN0aXZpdHlfcmVkLCAicHJvdmlzaW9uIG9mICIsICIiKSkgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfcmVkICVvdXQlIGMoImZpc2hlcnkga2l0cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW11bml0eSBpbmZyYXN0cnVjdHVyZSBhbmQgZXF1aXBtZW50IikpDQoNCmZzYyAlPiUgDQogIGdyb3VwX2J5KGRhdGUsIGFjdGl2aXR5X3JlZCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAjIHJiaW5kKGZzY18yMDIxICU+JSANCiAgIyAgICAgICAgICMgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUNCiAgIyAgICAgICAgIGdyb3VwX2J5KGRhdGUsIGFjdGl2aXR5X3JlZCkgJT4lIA0KICAjICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5X3JlZCkgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9iZW4gPSBjdW1zdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgYXJyYW5nZShhY3Rpdml0eV9yZWQpICU+JSANCiAgbXV0YXRlKGFjdGl2aXR5X3JlZCA9IHN0cl9yZXBsYWNlX2FsbChhY3Rpdml0eV9yZWQsICJwcm92aXNpb24gb2YgIiwgIiIpKSAlPiUNCiAgZmlsdGVyKGFjdGl2aXR5X3JlZCAlb3V0JSBjKCJmaXNoZXJ5IGtpdHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tdW5pdHkgaW5mcmFzdHJ1Y3R1cmUgYW5kIGVxdWlwbWVudCIpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fYmVuLCBjb2xvdXIgPSBhY3Rpdml0eV9yZWQpKSArDQogIGdlb21fc3RlcChkYXRhID0gYWN0X2xpbmVfMjAyMSwgDQogICAgICAgICAgICBhZXMoeCA9IGRhdGUsIA0KICAgICAgICAgICAgICAgIHkgPSBjdW1fYmVuKSwgDQogICAgICAgICAgICBjb2xvdXIgPSAiZ3JleSIsDQogICAgICAgICAgICBzaXplID0gMiwgDQogICAgICAgICAgICBhbHBoYSA9IC40KSArIA0KICBnZW9tX3ZsaW5lKGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyLCB4aW50ZXJjZXB0ID0gYXMubnVtZXJpYyhhcy5EYXRlKCIyMDIyLTA2LTAxIikpLCBhbHBoYSA9IC41KSArDQogICMgZ2VvbV92bGluZShjb2xvdXIgPSAicmVkIiwgbHR5ID0gMiwgeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXMuRGF0ZSgiMjAyMi0wMy0wMSIpKSwgYWxwaGEgPSAuNSkgKw0KICBnZW9tX3N0ZXAoc2l6ZSA9IDEpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWIiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBmYWNldF93cmFwKH4gYWN0aXZpdHlfcmVkLCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1LCBhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSksIA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSkgKyANCiAgbGFicyh4ID0gIk1vbnRoIiwgDQogICAgICAgeSA9ICJDdW11bGF0aXZlIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIiwgDQogICAgICAgdGl0bGUgPSAiTW9udGhseSBwcm9ncmVzcyBieSBhY3Rpdml0eSwgYXMgb2YgSnVseSAyMDIyIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGaWd1cmVzIGFyZSBpbiBjdW11bGF0aXZlIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIHJlYWNoZWQ7IHByZXZpb3VzIHllYXIncyBwcm9ncmVzcyBpcyBpbiBncmV5OyByZWQgbGluZSBtYXJrcyBKdW4gMjAyMiIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSANCiAgDQojIGdnc2F2ZSgiYWN0aXZpdHlfZmFjZXRfbGluZS5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKSAgDQoNCmBgYA0KDQo8YnI+DQoNCkluIEp1bHkgMjAyMiwgcHJvZ3Jlc3MgcHJpbWFyaWx5IGNhbWUgZnJvbSBtdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXJzLCBmYXJtZXIgdHJhaW5pbmcsIGZvb2QgZGlzdHJpYnV0aW9ucyBhbmQgdm9jYXRpb25hbCB0cmFpbmluZy4gDQoNCjxicj48YnI+DQoNCiMjIyAyLjIgQWdyaWN1bHR1cmFsIGFuZCBsaXZlbGlob29kcyBhY3Rpdml0aWVzDQoNCmBgYHtyfQ0KYWdfbGlzdCA8LSBjKCJjcm9wLCB2ZWdldGFibGUgYW5kIHNlZWQga2l0cyIsDQogICAgICAgICAgICAgIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAiSUdBIGFuZCBzbWFsbCBncmFudHMiLA0KICAgICAgICAgICAgICJsaXZlc3RvY2sga2l0cyIpDQoNCg0KYGBgDQoNCmByIGZpbHRlcihmc2MsIGFjdGl2aXR5X3JlZCAlaW4lIGMoYWdfbGlzdCkpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgdGhyb3VnaCBhIGNvbWJpbmF0aW9uIG9mIGNyb3AsIHZlZ2V0YWJsZSBhbmQgc2VlZCBraXRzLCBGRlMgYW5kIGZhcm1lciB0cmFpbmluZywgSUdBIGFuZCBzbWFsbCBncmFudHMgYW5kIGxpdmVzdG9jayBraXRzLiANCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1hZ3JpLWFjdGl2aXRpZXN9DQpmc2MgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfcmVkICVpbiUgYygiY3JvcCwgdmVnZXRhYmxlIGFuZCBzZWVkIGtpdHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRkZTIGFuZCBmYXJtZXIgdHJhaW5pbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUdBIGFuZCBzbWFsbCBncmFudHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGl2ZXN0b2NrIGtpdHMiKSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eV9yZWQsIGp1bHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGp1bHksIA0KICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMsDQogICAgICAgICAgICAgIHZhbHVlc19maWxsID0gMCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUodG90YWwgPSBqYW5fdG9fanVuICsganVseSkgJT4lIA0KICBtdXRhdGUoYCVfdG90YWxgID0gcm91bmQodG90YWwgLyBzdW0odG90YWwpICogMTAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMikpICU+JSAgDQogIGFycmFuZ2UoZGVzYyh0b3RhbCkpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUgDQogIHJlbmFtZShhY3Rpdml0eSA9IGFjdGl2aXR5X3JlZCkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJCZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgYWdyaWN1bHR1cmFsIGFuZCBsaXZlbGlob29kIGFjdGl2aXRpZXMiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBmb290bm90ZShwYXJ0ID0gImhlYWRlciIsIA0KICAgICAgICAgICBpID0gMSwgaiA9IDQsDQogICAgICAgICAgICAgdmFsdWUgPSBhc19wYXJhZ3JhcGgoKCJhcyBvZiAzMSBKdWx5IDIwMjIiKSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMod2lkdGggPSAuOCwgbGF5b3V0ID0gImF1dG9maXQiKQ0KICANCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyAyLjMgRGVsaXZlcnkgbW9kYWxpdGllcw0KDQpPbmx5IEhFQiBhbmQgZm9ydGlmaWVkIHJpY2UsIGNvbW11bml0eSBpbmZyYXN0cnVjdHVyZSBhbmQgZXF1aXBtZW50IGFuZCBraXRjaGVuIGdhcmRlbiBraXRzIHdlcmUgZGVsaXZlcmVkIGVudGlyZWx5IHRocm91Z2ggaW4ta2luZCBtb2RhbGl0aWVzLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShkZWxpdmVyeV9tb2RhbGl0eSkpICU+JSANCiAgbXV0YXRlKGRlbGl2ZXJ5X21vZGFsaXR5ID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJIeWJyaWQiKSB+ICJIeWJyaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJTZXJ2aWNlIikgfiAiU2VydmljZSBkZWxpdmVyeSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eV9yZWQsIGRlbGl2ZXJ5X21vZGFsaXR5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBkZWxpdmVyeV9tb2RhbGl0eSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGFkb3JuX3BlcmNlbnRhZ2VzKCJyb3ciKSAlPiUgDQogIGFkb3JuX3BjdF9mb3JtYXR0aW5nKCkgJT4lIA0KICBsZWZ0X2pvaW4oZnNjICU+JQ0KICAgICAgICAgIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUNCiAgICAgICAgICBtdXRhdGUoZGVsaXZlcnlfbW9kYWxpdHkgPSBjYXNlX3doZW4oc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIkh5YnJpZCIpIH4gIkh5YnJpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIlNlcnZpY2UiKSB+ICJTZXJ2aWNlIGRlbGl2ZXJ5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUNCiAgICAgICAgICBncm91cF9ieShhY3Rpdml0eV9yZWQpICU+JQ0KICAgICAgICAgIHN1bW1hcmlzZShCZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpLCANCiAgICAgICAgICBieSA9ICJhY3Rpdml0eV9yZWQiKSAlPiUNCiAgYXJyYW5nZShkZXNjKEJlbmVmaWNpYXJpZXMpKSAlPiUNCiAgbXV0YXRlKGFjdGl2aXR5X3JlZCA9IGlmZWxzZShhY3Rpdml0eV9yZWQgJWluJSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklHQSBhbmQgc21hbGwgZ3JhbnRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIRUIgYW5kIGZvcnRpZmllZCByaWNlIGZvciBhY3V0ZSBlbWVyZ2VuY2llcyIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9yZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3RvX3NlbnRlbmNlKGFjdGl2aXR5X3JlZCkpKSAlPiUgDQogIHJlbmFtZShBY3Rpdml0eSA9IGFjdGl2aXR5X3JlZCkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhgSW4ta2luZGAsIGBTZXJ2aWNlIGRlbGl2ZXJ5YCwgYENCVC9DVkFgLCBgSHlicmlkYCksIA0KICAgICAgICAgICAgfnJlY29kZSguLCAiLSIgPSBOQV9jaGFyYWN0ZXJfKSkgJT4lDQogIGZpbHRlcihCZW5lZmljaWFyaWVzICE9IDApICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiUGVyY2VudGFnZSBvZiBiZW5maWNpYXJpZXMgcmVhY2hlZCBieSBhY3Rpdml0eSBhbmQgZGVsaXZlcnkgbW9kYWxpdHkiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBmb290bm90ZShwYXJ0ID0gImhlYWRlciIsIA0KICAgICAgICAgICBpID0gMSwgaiA9IDYsIA0KICAgICAgICAgICB2YWx1ZSA9IGFzX3BhcmFncmFwaCgiYXMgb2YgMzEgSnVseSAyMDIyIikpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAuOTUpDQoNCmBgYA0KDQo8YnI+DQoNClRoZXJlIGFyZSBhbHNvIGNsZWFyIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGRpZmZlcmVudCBiZW5lZmljaWFyeSB0eXBlcyBhbmQgdGhlIGRlbGl2ZXJ5IG1vZGFsaXRpZXMgZW1wbG95ZWQgd2l0aCB0aGVtLiBCZW5lZmljaWFyaWVzIGZyb20gaG9zdC9sb2NhbCBjb21tdW5pdGllcyBsYXJnZWx5IHJlY2VpdmVkIGluLWtpbmQgZGlzdHJpYnV0aW9ucyB3aGlsc3QgdGhvc2UgZnJvbSBjYW1wcyBhbmQgSURQIHNpdGVzIG1vc3RseSByZWNlaXZlZCBjYXNoLWJhc2VkIGludGVydmVudGlvbnMsIGluZGljYXRpbmcgdGhhdCBwYXJ0bmVycyBtb3N0bHkgd29ya2VkIGluIHRoZSBzYW1lIGFyZWFzIGluIFExIGFuZCBRMi4gDQoNCjxicj4NCg0KYGBge3IgZmFjZXQtYmVuLXR5cGUsIGZpZy5oZWlnaHQ9Nn0NCg0KZnNjICU+JSAgDQogICBtdXRhdGUoZGVsaXZlcnlfbW9kYWxpdHkgPSBjYXNlX3doZW4oc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIkh5YnJpZCIpIH4gIkh5YnJpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIlNlcnZpY2UiKSB+ICJTZXJ2aWNlIGRlbGl2ZXJ5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUgDQogIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpICYgIWlzLm5hKGxvY2F0aW9uX3R5cGUpKSAlPiUgDQogIHN1bV9iZW4yKGRlbGl2ZXJ5X21vZGFsaXR5LCBsb2NhdGlvbl90eXBlKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRlbGl2ZXJ5X21vZGFsaXR5LCB5ID0gYmVuZWZpY2lhcmllcywgZmlsbCA9IGRlbGl2ZXJ5X21vZGFsaXR5KSkgKw0KICBnZW9tX2NvbCgpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKyANCiAgZmFjZXRfd3JhcCh+bG9jYXRpb25fdHlwZSwgc2NhbGVzID0gImZyZWUiKSArIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDI1LCB2anVzdCA9IC43LCBoanVzdCA9IC41KSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSkgKw0KICBsYWJzKHggPSAiRGVsaXZlcnkgbW9kYWxpdHkiLCB5ID0gIkJlbmVmaWNpYXJpZXMiLA0KICAgICAgIHRpdGxlID0gIkRlbGl2ZXJ5IG1vZGFsaXRpZXMgYnkgbG9jYXRpb24gdHlwZSIpDQogIA0KDQpgYGANCg0KPGJyPg0KDQpBcmVhcyB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiBJRFBzLCBzdWNoIGFzIFNhZ2FpbmcsIFJha2hpbmUgYW5kIEthY2hpbiwgcmVhY2ggbW9zdCBvZiB0aGVpciBiZW5lZmljaWFyaWVzIHRocm91Z2ggY2FzaC1iYXNlZCBwcm9ncmFtbWluZy4NCg0KPGJyPg0KDQpgYGB7ciBkZWxpdmVyeS1tb2RhbGl0aWVzLXN0YWNrZWQtYmFyfQ0Kc3RhdGVfdG90YWxzIDwtIGZzYyAlPiUgDQogIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKHBjID0gMSwgDQogICAgICAgICBzdGF0ZSA9IGZjdF9yZW9yZGVyKHN0YXRlLCB0b3RhbCkpDQoNCmZzYyAlPiUgIA0KICBmaWx0ZXIoIWlzLm5hKGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lICANCiAgIG11dGF0ZShkZWxpdmVyeV9tb2RhbGl0eSA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KGRlbGl2ZXJ5X21vZGFsaXR5LCAiSHlicmlkIikgfiAiSHlicmlkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGRlbGl2ZXJ5X21vZGFsaXR5LCAiU2VydmljZSIpIH4gIlNlcnZpY2UgZGVsaXZlcnkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBkZWxpdmVyeV9tb2RhbGl0eSkpICU+JQ0KICBncm91cF9ieShzdGF0ZSwgZGVsaXZlcnlfbW9kYWxpdHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgbXV0YXRlKHBjID0gYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSwNCiAgICAgICAgIHN0YXRlID0gZmN0X3Jlb3JkZXIoc3RhdGUsIGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBjLCB5ID0gZmN0X3JldihzdGF0ZSksIGZpbGwgPSBkZWxpdmVyeV9tb2RhbGl0eSkpICsgDQogIGdlb21fY29sKCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudCwgYnJlYWtzID0gc2VxKDAsIDEsIGJ5ID0gLjIpKSArIA0KICBnZW9tX3RleHQoYWVzKHkgPSBzdGF0ZSwgeCA9IHBjICsgMC4xMjUsIGxhYmVsID0gY29tbWEodG90YWwsIGFjY3VyYWN5ID0gMSksIGZpbGwgPSBOVUxMKSwgDQogICAgICAgICAgICBkYXRhID0gc3RhdGVfdG90YWxzLCBoanVzdCA9ICJpbndhcmQiLCBzaXplID0gMi41KSArDQogIGxhYnMoeCA9ICIlIG9mIHRvdGFsIiwgeSA9ICIiLCBmaWxsID0gIiIsIA0KICAgICAgIHRpdGxlID0gIlBlcmNlbnRhZ2Ugb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IGRlbGl2ZXJ5IG1vZGFsaXRpZXMiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJCZW5lZmljaWFyaWVzIGFzIG9mIDMxIEp1bHkgMjAyMiBhdCB0aGUgZW5kIG9mIGVhY2ggYmFyIikNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAzLiBDYXNoLWJhc2VkIHByb2dyYW1taW5nDQoNCiMjIyAzLjEgTU1LIHBlciBob3VzZWhvbGQNCg0KQ29tcGFyZWQgdG8gUTEsIGJlbmVmaWNpYXJpZXMgaW4gUTIgYXJlIG11Y2ggbGVzcyBsaWtlbHkgdG8gaGF2ZSByZWNlaXZlZCBjYXNoIHRyYW5zZmVycyBvZiBsZXNzIHRoYW4gVVNEIDEwIHBlciBob3VzZWhvbGQuIFRoZSBtb3N0IGNvbW1vbiB0cmFuc2ZlciB2YWx1ZXMgd2VyZSBiZXR3ZWVuIFVTRCA2MCBhbmQgNzAsIGFuIGluY3JlYXNlIGZyb20gdGhlIHByZXZpb3VzIHF1YXJ0ZXIuDQoNCkluIEp1bHkgMjAyMiwgdGhlIG1vc3QgY29tbW9uIHRyYW5zZmVycyB2YWx1ZXMgd2VyZSBiZXR3ZWVuIE1NSyAxMDAsMDAwIGFuZCBNTUsgMjAwLDAwMCwgDQoNCg0KPGJyPg0KDQpgYGB7ciB1c2QtaGhkLWJpbi1iYXJwbG90LCBmaWcuaGVpZ2h0PTYuNX0NCg0KZnNjICU+JQ0KICBmaWx0ZXIoIWlzLm5hKG1ta19wZXJfaGhkKSAmICFpcy5uYShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgZmlsdGVyKGRlbGl2ZXJ5X21vZGFsaXR5ICVpbiUgYygiQ0JUL0NWQSIsICJIeWJyaWQgKEluLWtpbmQgJiBDQlQvQ1ZBKSIpKSAlPiUNCiAgZ3JvdXBfYnkobW1rX2hoZF9iaW4sIGp1bHkpICU+JSANCiAgc3VtbWFyaXNlKGhvdXNlaG9sZHMgPSBzdW0oaG91c2Vob2xkcykpICU+JSANCiAgZ3JvdXBfYnkoanVseSkgJT4lIA0KICBtdXRhdGUoYCVfb2ZfaGhkYCA9IHJvdW5kKGhvdXNlaG9sZHMgLyBzdW0oaG91c2Vob2xkcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGZpbHRlcihqdWx5ID09ICJqdWx5IikgJT4lIA0KICBtdXRhdGUobW1rX2hoZF9iaW4gPSBmY3RfcmVsZXZlbChtbWtfaGhkX2JpbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCI8MTBLIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTBLXzwzMEsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMEtfPDEwMEsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMDBLXzwyMDBLIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDBLXzwzMDBLIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzAwS188MU0iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+PTFNIikpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1ta19oaGRfYmluLCB5ID0gaG91c2Vob2xkcywgZmlsbCA9IG1ta19oaGRfYmluKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gYCVfb2ZfaGhkYCksIHZqdXN0ID0gLTAuNCwgc2l6ZSA9IDMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgYnJlYWtzID0gc2VxKDAsIDgwMDAwLCBieSA9IDEwMDAwKSkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAwLjgsIHZqdXN0ID0gMC45KSwgDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpKSArDQogIGxhYnMoeCA9ICJNTUsgdmFsdWUgb2YgY2FzaCB0cmFuc2ZlciBwZXIgaG91c2Vob2xkIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBob3VzZWhvbGRzIiwNCiAgICAgICB0aXRsZSA9ICJOdW1iZXIgb2YgaG91c2Vob2xkcyBieSB2YWx1ZSBvZiBjYXNoIHRyYW5zZmVyIHBlciBob3VzZWhvbGQgKEp1bHkgMjAyMikiLA0KICAgICAgIHN1YnRpdGxlID0gIkZpZ3VyZXMgYXQgdGhlIHRvcCBvZiBlYWNoIGJhciBzaG93IHBlcmNlbnRhZ2Ugb2YgaG91c2Vob2xkc1xuT25seSBob3VzZWhvbGRzIHJlYWNoZWQgdGhyb3VnaCB0aGUgY2FzaCwgaHlicmlkIG9yIHZvdWNoZXIgbW9kYWxpdGllcyBhcmUgaW5jbHVkZWQiKQ0KDQpgYGANCg0KPGJyPg0KDQpBYm91dCA0MCUgb2YgYmVuZWZpY2lhcmllcyBvZiBtdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXJzIGluIEp1bHkgMjAyMiB3ZXJlIG9mIHF1aXRlIGhpZ2ggdmFsdWUuIA0KDQo8YnI+DQoNCmBgYHtyfQ0KDQphY3Rpdml0eV90b3RhbHMgPC0gZnNjICU+JQ0KICBmaWx0ZXIoanVseSA9PSAianVseSIpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHlfcmVkKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JQ0KICBmaWx0ZXIoYWN0aXZpdHlfcmVkICE9ICJtaWNyb2ZpbmFuY2UgYWN0aXZpdGllcyIpICU+JSANCiAgbXV0YXRlKHBjID0gMSwgDQogICAgICAgICBhY3Rpdml0eV9yZWQgPSBmY3RfcmVvcmRlcihhY3Rpdml0eV9yZWQsIHRvdGFsKSkNCiAgDQpmc2MgJT4lICANCiAgZmlsdGVyKGp1bHkgPT0gImp1bHkiKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5X3JlZCwgbW1rX2hoZF9iaW4pICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwYyA9IGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3JlZCAhPSAibWljcm9maW5hbmNlIGFjdGl2aXRpZXMiKSAlPiUgDQogIG11dGF0ZShtbWtfaGhkX2JpbiA9IGZjdF9yZWxldmVsKG1ta19oaGRfYmluLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiPDEwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwS188MzBLIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzBLXzwxMDBLIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAwS188MjAwSyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwS188MzAwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMwMEtfPDFNIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0xTSIpKSkgJT4lIA0KICBhcnJhbmdlKG1ta19oaGRfYmluKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBjLCB5ID0gYWN0aXZpdHlfcmVkLA0KICAgICAgICAgICAgIGZpbGwgPSBmY3RfcmVsZXZlbChtbWtfaGhkX2JpbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIjwxMEsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMEtfPDMwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMwS188MTAwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwMEtfPDIwMEsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMEtfPDMwMEsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMDBLXzwxTSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj49MU0iKSkpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50LCBicmVha3MgPSBzZXEoMCwgMSwgYnkgPSAuMikpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5NTAiKSArIA0KICBnZW9tX3RleHQoYWVzKHkgPSBhY3Rpdml0eV9yZWQsIA0KICAgICAgICAgICAgICAgIHggPSBwYyArIC4xMjUsIA0KICAgICAgICAgICAgICAgIGxhYmVsID0gY29tbWEodG90YWwsIGFjY3VyYWN5ID0gMSksIGZpbGwgPSBOVUxMKSwgDQogICAgICAgICAgICBkYXRhID0gYWN0aXZpdHlfdG90YWxzLCBoanVzdCA9ICJpbndhcmQiLCBzaXplID0gMy41KSArIA0KICBsYWJzKHggPSAiJSBvZiBhY3Rpdml0eSB0b3RhbCIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgZmlsbCA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJQZXJjZW50YWdlIG9mIGNhc2ggYmVuZWZpY2lhcmllcyBieSBhY3Rpdml0eSwgSnVseSAyMDIyIiwgDQogICAgICAgc3VidGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIGluIEp1bHkgMjAyMiBhdCB0aGUgZW5kIG9mIGVhY2ggYmFyXG5HcmV5L05BIHNob3dzIGJlbmVmaWNpYXJpZXMgb2Ygbm9uLWNhc2ggaW50ZXJ2ZW50aW9ucyIpDQoNCiAgDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDMuMiBNTUsgcGVyIHBlcnNvbg0KDQpUaGUgYm94cGxvdHMgYmVsb3cgc2hvd3MgdGhlIHJhbmdlIG9mIGNhc2ggdHJhbnNmZXIgdmFsdWVzIChhbGwgdmFsdWVzIGFyZSBwZXIgcGVyc29uLCB0byBmYWNpbGl0YXRlIGNvbXBhcmFiaWxpdHkpIGJ5IGFjdGl2aXR5LiBUaGUgYXZlcmFnZSBmb3IgcmVhY2ggYWN0aXZpdHkgaXMgbWFya2VkIGJ5IHRoZSB0aGljayBsaW5lIGluIHRoZSBtaWRkbGUgb2YgZWFjaCBib3guIFRoZSBsZWZ0bW9zdCBhbmQgcmlnaHRtb3N0IHNpZGUgb2YgZWFjaCBib3ggaW5kaWNhdGUgdGhlIDI1dGggYW5kIDc1dGggcGVyY2VudGlsZSBvZiB0cmFuc2ZlciB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gVGhlIGxlbmd0aCBvZiBlYWNoIGJveCBpcyBhIGdhdWdlIGZvciBob3cgbXVjaCB2YXJpYXRpb24gdGhlcmUgaXMgaW4gdGhlIHRyYW5zZmVyIHZhbHVlcyBvZiBlYWNoIGFjdGl2aXR5Lg0KDQpUaGVzZSBwbG90cyB1c2UgZGF0YSBmb3IgdGhlIGVudGlyZSB5ZWFyLCBpbnN0ZWFkIG9mIGp1c3QgSnVseS4gDQoNCjxicj4NCg0KYGBge3IgYm94cGxvdC1hY3Rpdml0eS11c2QtcGVyLXBlcnNvbn0NCg0KZnNjICU+JSBmaWx0ZXIoIWlzLm5hKHRvdGFsX3ZhbHVlX21taykgJiANCiAgICAgICAgICAgICAgICAgYWN0aXZpdHlfcmVkICVvdXQlIGMoIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIiwgInZvY2F0aW9uYWwgdHJhaW5pbmciKSkgJT4lDQogIG11dGF0ZShhY3Rpdml0eV9yZWQgPSBmY3RfcmV2KGZjdF9yZWxldmVsKGFjdGl2aXR5X3JlZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJmb29kIGRpc3RyaWJ1dGlvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9wLCB2ZWdlbnRhYmxlIGFuZCBzZWVkIGtpdHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVsdGktcHVycG9zZSBjYXNoIHRyYW5zZmVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2RfY2FzaCBmb3Igd29ya19hc3NldHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklHQSBhbmQgc21hbGwgZ3JhbnRzIikpKSkgJT4lIA0KICBhcnJhbmdlKGFjdGl2aXR5X3JlZCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBhY3Rpdml0eV9yZWQsIA0KICAgICAgICAgICAgIHggPSBtbWtfcGVyX3BlcnNvbiwgDQogICAgICAgICAgICAgY29sb3VyID0gYWN0aXZpdHlfcmVkKSkgKyANCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAuMSwgDQogICAgICAgICAgICAgIGFlcyhzaXplID0gYmVuZWZpY2lhcmllcykpICsNCiAgZ2VvbV9ib3hwbG90KGFscGhhID0gLjgsIA0KICAgICAgICAgICAgICAgb3V0bGllci5hbHBoYSA9IC4yKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMTAwMDAsIDMwMDAwLCAxMDAwMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAwMDAsIDEwMDAwMDApLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gLjUsIHZqdXN0ID0gLjUpKSArDQogIGxhYnMoeCA9ICJNTUsgcGVyIHBlcnNvbiIsIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiQm94cGxvdHMgb2YgTU1LIHRyYW5zZmVyIHZhbHVlcyBwZXIgcGVyc29uLCBhcyBvZiBKdWx5IDIwMjIiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUaGljayBsaW5lIGluIGVhY2ggYm94IGlzIHRoZSBhdmVyYWdlO1xuIFBvaW50cyBhcmUgaW5kaXZpZHVhbCBpbnRlcnZlbnRpb25zLCBzaXplcyBpbmRpY2F0ZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyIpDQoNCiANCmBgYA0KDQo8YnI+DQoNCkVhY2ggb2YgdGhlIGJ1YmJsZXMgcmVwcmVzZW50cyBhbiBpbmRpdmlkdWFsIGludGVydmVudGlvbiwgd2l0aCB0aGVpciBwb3NpdGlvbiBhbG9uZyB0aGUgeC1heGlzIHNob3dpbmcgdGhlIFVTRCBwZXIgcGVyc29uIHZhbHVlIG9mIHRoZSBpbnRlcnZlbnRpb24gYW5kIHRoZSBzaXplIG9mIGVhY2ggYnViYmxlIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQuDQoNCkZvb2QgZGlzdHJpYnV0aW9ucyB0ZW5kZWQgdG8gaGF2ZSB0aGUgdGlnaHRlc3QgcmFuZ2Ugb2YgdmFsdWVzLCB3aGljaCBwcm92ZXMgdGhhdCBmb29kIGFzc2lzdGFuY2UgaXMgcXVpdGUgc3RhbmRhcmRpc2VkIGFtb25nc3QgcGFydG5lcnMuIA0KDQo8YnI+DQoNCmBgYHtyIHBsb3RseS10cmFuc2Zlci12YWx1ZS1zY2F0dGVyLCBmaWcuaGVpZ2h0PTZ9DQoNCm1vbmV5X3NjYXR0ZXIgPC0gZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYSh0b3RhbF92YWx1ZV9tbWspICYgDQogICAgICAgICAgIGFjdGl2aXR5X3JlZCAlb3V0JSBjKCJsaXZlc3RvY2sga2l0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2b2NhdGlvbmFsIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIikpICU+JQ0KICBncm91cF9ieShzdGF0ZSwgdG93bnNoaXAsIGxvY2F0aW9uLCANCiAgICAgICAgICAgaW1wbGVtZW50aW5nX3BhcnRuZXIsIA0KICAgICAgICAgICBhY3Rpdml0eV9yZWQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgdG90YWxfdmFsdWUgPSBzdW0odG90YWxfdmFsdWVfbW1rKSwgDQogICAgICAgICAgICByb3VuZHMgPSBuX2Rpc3RpbmN0KGRhdGUpLCANCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbXV0YXRlKHBlcl9wZXJzb24gPSByb3VuZCh0b3RhbF92YWx1ZSAvIGJlbmVmaWNpYXJpZXMsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGZpbHRlcih0b3RhbF92YWx1ZSA+IDApICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICB5ID0gcGVyX3BlcnNvbiwgDQogICAgICAgICAgICAgY29sb3VyID0gYWN0aXZpdHlfcmVkLCANCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKGltcGxlbWVudGluZ19wYXJ0bmVyLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3JlZCwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVuLiBmcmVxdWVuY2llczogIiwgY29tbWEoYmVuZWZpY2lhcmllcywgYWNjdXJhY3kgPSAxKSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJNTUsgcGVyIHBlcnNvbjogIiwgY29tbWEocGVyX3BlcnNvbiwgYWNjdXJhY3kgPSAxKSwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAidG90YWwgTU1LOiAiLCBjb21tYSh0b3RhbF92YWx1ZSwgYWNjdXJhY3kgPSAxKSwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAicm91bmRzOiAiLCByb3VuZHMsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdG93bnNoaXAsICIsICIsIHN0YXRlKSkpICsgDQogIGdlb21faml0dGVyKGFlcyhzaXplID0gdG90YWxfdmFsdWUpLCBhbHBoYSA9IC41KSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgMSwgMywgMTAsIDMwLCAxMDAsIDMwMCksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBkb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsgDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygwLCAxMCwgMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCAzMDAwMDApKSArIA0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoZ3VpZGUgPSAibm9uZSIsIHJhbmdlID0gYygwLjMsIDUpKSArIA0KICBsYWJzKHggPSAiQmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMiLCANCiAgICAgICB5ID0gIk1NSyB2YWx1ZSBwZXIgcGVyc29uIiwgDQogICAgICAgdGl0bGUgPSAiQXZlcmFnZSBNTUsgdHJhbnNmZXIgdmFsdWUgcGVyIHBlcnNvbiBpbiAyMDIyXG5CeSBvcmdhbmlzYXRpb24sIGxvY2F0aW9uIGFuZCBhY3Rpdml0eSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkJ5IG9yZ2FuaXNhdGlvbiwgbG9jYXRpb24gYW5kIGFjdGl2aXR5IiwgDQogICAgICAgY29sb3VyID0gImJ5IG9yZywgbG9jYXRpb24gYW5kIGFjdGl2aXR5XG5kb3VibGUtY2xpY2sgdG8gc2VsZWN0IikgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAxLCBhbHBoYSA9IDEpKSkgDQoNCmdncGxvdGx5KG1vbmV5X3NjYXR0ZXIsIHRvb2x0aXAgPSBjKCJ0ZXh0IiksIHdpZHRoID0gODIwKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUNCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCJBdmVyYWdlIE1NSyB0cmFuc2ZlciB2YWx1ZSBwZXIgcGVyc29uLCBhcyBvZiAzMSBKdWx5IDIwMjIiKSkpDQoNCg0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNCiMjIyAzLjMgRm9vZCBkaXN0cmlidXRpb25zDQoNCmBgYHtyIHBsb3RseS1mb29kLWRpc3QtcmFuZ2V9DQoNCmZvb2RfZGlzdF9yYW5nZSA8LSBmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKG1ta19wZXJfcGVyc29uKSkgJT4lDQogIGZpbHRlcihhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIiAmIG1ta19wZXJfcGVyc29uIDwgNjAwMDAwKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1ta19wZXJfcGVyc29uLCB5ID0gc3RhdGUsIGNvbG91ciA9IHN0YXRlLCANCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKGltcGxlbWVudGluZ19wYXJ0bmVyLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3JlZCwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVuLiBmcmVxdWVuY2llczogIiwgY29tbWEoYmVuZWZpY2lhcmllcywgYWNjdXJhY3kgPSAxKSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJNTUsgcGVyIHBlcnNvbjogIiwgY29tbWEobW1rX3Blcl9wZXJzb24pLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbCBNTUs6ICIsIGNvbW1hKHRvdGFsX3ZhbHVlX21taywgYWNjdXJhY3kgPSAxKSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvd25zaGlwLCAiLCAiLCBzdGF0ZSkpKSArIA0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOTA1NS41LCBsdHkgPSAyLCBjb2xvdXIgPSAicmVkIiwgYWxwaGEgPSAuNSwgc2l6ZSA9IC4zKSArIA0KICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMSwgYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzKSkgKw0KICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKCkgKw0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuMywgMTApKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYV9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgDQogICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIpICsNCiAgbGFicyh4ID0gIk1NSyB2YWx1ZSBwZXIgcGVyc29uIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJGb29kIGRpc3RyaWJ1dGlvbjogcmFuZ2Ugb2YgTU1LIHZhbHVlcyBwZXIgcGVyc29uIGJ5IHN0YXRlIGluIDIwMjIsIGFzIG9mIDMxLTA3LTIwMjIiLA0KICAgICAgIHNpemUgPSAiIiwgY29sb3VyID0gIiIpIA0KDQpnZ3Bsb3RseShmb29kX2Rpc3RfcmFuZ2UsIHRvb2x0aXAgPSBjKCJ0ZXh0IiksIHdpZHRoID0gODIwLCBoZWlnaHQgPSAgNjAwKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUNCiAgbGF5b3V0KHRpdGxlID0gDQogICAgICAgICAgIGxpc3QodGV4dCA9IA0KICAgICAgICAgICAgICAgICAgcGFzdGUwKCJGb29kIGRpc3RyaWJ1dGlvbjogTU1LIHZhbHVlcyBieSBzdGF0ZSwgYXMgb2YgMzEtMDctMjAyMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSByZWQgbGluZSBpcyA1MCUgb2YgMS81IG9mIGZvb2QgTUVCOyBkb3VibGUtY2xpY2sgb24gbGVnZW5kIHRvIHNlbGVjdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIjwvc3VwPiIpKSwgDQogICAgICAgICBsZWdlbmQgPSBsaXN0KGZvbnQgPSBsaXN0KHNpemUgPSA3KSkpIA0KYGBgDQoNCjxicj4NCg0KQmVuZWZpY2lhcmllcyBpbiBSYWtoaW5lIGFyZSBzcGxpdCBpbnRvIHR3byBncm91cHMsIG9uZSBhdCBhcm91bmQgTU1LIDcsMDAwIGFuZCBhbm90aGVyIGF0IE1NSyAxNywwMDAuIEtheWluIGhhcyBhIHZlcnkgbGFyZ2UgbnVtYmVyIG9mIHBlcnNvbnMgd2hvIHJlY2VpdmVkIGxlc3MgdGhhbiBNTUsgMSwwMDAgZWFjaC4gDQoNCkRpc3RyaWJ1dGlvbnMgaW4gQ2hpbiBhbmQgQXlleWFyd2FkeSBoYWQgdmVyeSBjb25zaXN0ZW50IHZhbHVlcyBhcyB0aGV5IHdlcmUgYWxsIGltcGxlbWVudGVkIGJ5IHRoZSBzYW1lIGltcGxlbWVudGluZyBwYXJ0bmVyLg0KDQpUaGUgdGFibGUgYmVsb3cgY29tcGFyZXMgdGhlIGRpZmZlcmVudCBiaW5zIGZvciBjYXNoIHRyYW5zZmVyIHZhbHVlcyBvZiBmb29kIGRpc3RyaWJ1dGlvbnMgd2l0aCB0aGUgbWluaW11bSBleHBlbmRpdHVyZSBiYXNrZXQgZm9yIGZvb2QgZXN0YWJsaXNoZWQgYnkgdGhlIENhc2ggV29ya2luZyBHcm91cC4gVGhleSBoYXZlIGVzdGFibGlzaGVkIGEgZmxvb3Igb2YgTU1LIDE5MCw1NTUgKG9yIFVTRCAxMTQuNTUpIGZvciB0aGUgZm9vZCBzZWN1cml0eSBjb21wb25lbnQgcGVyIGhvdXNlaG9sZCBwZXIgbW9udGguIA0KDQpPdmVyYWxsLCBgciByb3VuZCgoZmlsdGVyKGZzYywgdXNkX3Blcl9wZXJzb24gPj0gKDExNC41NSAvIDUpICYgYWN0aXZpdHlfcmVkID09ICJmb29kIGRpc3RyaWJ1dGlvbiIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSkgLyAoZmlsdGVyKGZzYywgIWlzLm5hKHVzZF9wZXJfcGVyc29uKSAmIGFjdGl2aXR5X3JlZCA9PSAiZm9vZCBkaXN0cmlidXRpb24iKSAlPiUge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0pICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIGZvb2QgZGlzdHJpYnV0aW9uIGJlbmVmaWNpYXJpZXMgaGF2ZSByZWNlaXZlZCBhdCBsZWFzdCAxMDAlIG9mIHRoZSBmb29kIHNlY3VyaXR5IE1FQiBhbmQgYHIgcm91bmQoKGZpbHRlcihmc2MsIHVzZF9wZXJfcGVyc29uID49ICgxMTQuNTUgLyA1IC8gMikgJiBhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIikgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9KSAvIChmaWx0ZXIoZnNjLCAhaXMubmEodXNkX3Blcl9wZXJzb24pICYgYWN0aXZpdHlfcmVkID09ICJmb29kIGRpc3RyaWJ1dGlvbiIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSkgKiAxMDAsIGRpZ2l0cyA9IDIpYCUgaGF2ZSByZWNlaXZlZCBhdCBsZWFzdCA1MCUgb2YgdGhlIGZvb2Qgc2VjdXJpdHkgTUVCIChNTUsgMTksMDU2IG9yIFVTRCAxMS40NSBwZXIgcGVyc29uKS4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1tZWItdXNkLWhoZC1iaW59DQoNCmZvb2RfYmlucyA8LSBmc2MgJT4lIGZpbHRlcihhY3Rpdml0eV9yZWQgJWluJSBjKCJmb29kIGRpc3RyaWJ1dGlvbiIpICYgDQogICAgICAgICAgICAgICAgICFpcy5uYShtbWtfcGVyX3BlcnNvbikgJiANCiAgICAgICAgICAgICAgICAgIWlzLm5hKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBjb3VudChtbWtfcGVyc29uX2Jpbiwgd3QgPSBuZXdfYmVuZWZpY2lhcmllcykgJT4lIA0KICBtdXRhdGUocGNfb2ZfdG90YWwgPSByb3VuZChuIC8gc3VtKG4pICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKG1ta19wZXJzb25fYmluKQ0KDQpmc2MgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfcmVkICVpbiUgYygiZm9vZCBkaXN0cmlidXRpb24iKSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpcy5uYShtbWtfcGVyX3BlcnNvbikgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXMubmEobmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUNCiAgbXV0YXRlKHBjX21lYiA9IG1ta19wZXJfcGVyc29uICogNSAvIDE5MDU1NSkgJT4lIA0KICBncm91cF9ieShtbWtfcGVyc29uX2JpbikgJT4lIA0KICBzdW1tYXJpc2UoYXZnX3BjX29mX21lYiA9IHJvdW5kKG1lYW4ocGNfbWViKSAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICAgICBhdmdfbW1rX21vbnRoID0gcm91bmQobWVhbihtbWtfcGVyX3BlcnNvbiwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gcm91bmQoc3VtKG5ld19iZW5lZmljaWFyaWVzKSkpICU+JSANCiAgbXV0YXRlKHBjX29mX2hoZCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMiksIA0KICAgICAgICAgbW1rX3BlcnNvbl9iaW4gPSBmY3RfcmVsZXZlbChtbWtfcGVyc29uX2JpbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCI8MTBLIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTBLXzwzMEsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMEtfPDYwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYwS188MTAwSyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwMEtfPDIwMEsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMEtfPDMwMEsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMwMEtfPDFNIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0xTSIpKSkgJT4lIA0KICBhcnJhbmdlKG1ta19wZXJzb25fYmluKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIk1NSyB2YWx1ZXMgb2YgZm9vZCBkaXNyaWJ1dGlvbnMgYnkgcGVyY2VudGFnZSBvZiBNRUIgcmVjZWl2ZWQiKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0IikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgZm9vdG5vdGUocGFydCA9ICJoZWFkZXIiLA0KICAgICAgICAgICBpID0gMSwgaiA9IDQsIA0KICAgICAgICAgICB2YWx1ZSA9IGFzX3BhcmFncmFwaCgiT25seSBwZXJzb25zIHJlYWNoZWQgdGhyb3VnaCBDQlQvQ1ZBIG1vZGFsaXRpZXMgYXJlIGluY2x1ZGVkIikpDQoNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAzLjQgSW1wbGVtZW50aW5nIHBhcnRuZXJzDQoNClRoZSBwbG90cyBiZWxvdyBzaG93IHRoZSB0aGUgYXZlcmFnZSBjYXNoIHRyYW5zZmVyIHZhbHVlcyBieSBhY3Rpdml0eSBmb3IgdGhlIHRvcCA3IHBhcnRuZXJzIGltcGxlbWVudGluZyB0aGF0IGFjdGl2aXR5LiBUaGUgeC1heGlzIHNob3dzIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGFuZCB0aGUgZGVwdGggb2YgdGhlIGNvbG91ciBpbmRpY2F0ZXMgdGhlIHZhbHVlIG9mIHRoZSBjYXNoIHRyYW5zZmVyLiANCg0KPGJyPg0KDQpgYGB7ciBwYXJ0bmVyLWNhc2gtdmFsdWVzLCBmaWcuaGVpZ2h0PTYuNX0NCnBhcnRuZXJfbWVhbl9tbWsgPC0gZnVuY3Rpb24odGJsLCBuYW1lKXsNCg0KICB0YmwgJT4lIA0KICAgIGZpbHRlcighaXMubmEobmV3X2JlbmVmaWNpYXJpZXMpICYgIWlzLm5hKG1ta19wZXJfaGhkKSkgJT4lDQogICAgZmlsdGVyKGRlbGl2ZXJ5X21vZGFsaXR5ICVpbiUgYygiQ0JUL0NWQSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkh5YnJpZCAoSW4ta2luZCAmIENCVC9DVkEpIikpICU+JQ0KICAgIGZpbHRlcihhY3Rpdml0eV9yZWQgPT0ge3tuYW1lfX0pICU+JQ0KICAgIG11dGF0ZShob3VzZWhvbGRzID0gaWZlbHNlKGFjdGl2aXR5X3JlZCA9PSAiZm9vZCBkaXN0cmlidXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91c2Vob2xkcykpICU+JSANCiAgICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICAgIHN1bW1hcmlzZSh0b3RhbF92YWx1ZV9tbWsgPSBzdW0odG90YWxfdmFsdWVfbW1rKSwNCiAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgICBob3VzZWhvbGRzID0gc3VtKGhvdXNlaG9sZHMpKSAlPiUgDQogICAgbXV0YXRlKG1lYW5fbW1rID0gdG90YWxfdmFsdWVfbW1rIC8gaG91c2Vob2xkcykgJT4lIA0KICAgIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lICANCiAgICB0b3Bfbig3KSAlPiUgDQogICAgbXV0YXRlKGltcGxlbWVudGluZ19wYXJ0bmVyID0gZmN0X3Jlb3JkZXIoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgDQogICAgICAgICAgICAgICB5ID0gaW1wbGVtZW50aW5nX3BhcnRuZXIsIA0KICAgICAgICAgICAgICAgZmlsbCA9IG1lYW5fbW1rKSkgKyANCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWFfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsgDQogICAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEsIGJlZ2luID0gMC4yLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWFfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsNCiAgICBnZW9tX2NvbCgpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEobWVhbl9tbWspKSwgDQogICAgICAgICAgICAgIHNpemUgPSAzLCANCiAgICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKyANCiAgICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIGZpbGwgPSAiQXZnIE1NSyIpICsNCiAgICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLA0KICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1LjUpLCANCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSkNCn0NCg0KZnNjICU+JSBwYXJ0bmVyX21lYW5fbW1rKCJtdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXIiKSArDQogIGxhYnModGl0bGUgPSAiTXVsdGktcHVycG9zZSBjYXNoIHRyYW5zZmVyIChwZXIgaGhkKSIpICsgDQpmc2MgJT4lIHBhcnRuZXJfbWVhbl9tbWsoImZvb2QgZGlzdHJpYnV0aW9uIikgKw0KICBsYWJzKHRpdGxlID0gIkZvb2QgZGlzdHJpYnV0aW9ucyAocGVyIHBlcnNvbikiKSArDQpmc2MgJT4lIHBhcnRuZXJfbWVhbl9tbWsoImZvb2RfY2FzaCBmb3Igd29ya19hc3NldHMiKSArIA0KICBsYWJzKHRpdGxlID0gIkZvb2QvY2FzaCBmb3Igd29yay9hc3NldHMgKHBlciBoaGQpIikgKyANCmZzYyAlPiUgcGFydG5lcl9tZWFuX21taygiSUdBIGFuZCBzbWFsbCBncmFudHMiKSArDQogIGxhYnModGl0bGUgPSAiSUdBIGFuZCBzbWFsbCBncmFudHMgKHBlciBoaGQpIikgKyANCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIkNhc2ggdHJhbnNmZXIgdmFsdWVzIG9mIHRoZSB0b3AgaW1wbGVtZW50aW5nIHBhcnRuZXJzIChieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQpIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJGYWNldGVkIGJ5IGFjdGl2aXR5IikNCg0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDQuIFBhcnRuZXJzDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0UsIGV2YWw9RkFMU0V9DQoNCmZzYyAlPiUgc2VsZWN0KG9yZ19jb2RlID0gcmVwb3J0aW5nX29yZ2FuaXphdGlvbikgJT4lIA0KICByYmluZCgNCiAgICBmc2MgJT4lIHNlbGVjdChvcmdfY29kZSA9IGltcGxlbWVudGluZ19wYXJ0bmVyKQ0KICApICU+JSANCiAgZGlzdGluY3Qob3JnX2NvZGUpICU+JSBucm93KCkNCg0KZnNjICU+JSBkaXN0aW5jdChyZXBvcnRpbmdfb3JnYW5pemF0aW9uKSAlPiUgbnJvdygpDQoNCmZzYyAlPiUgZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSBucm93KCkNCg0KYGBgDQoNCg0KQSB0b3RhbCBvZiA3NSBwYXJ0bmVycyBoYXZlIHJlcG9ydGVkIGludG8gdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBhcyBvZiBKdWx5IDIwMjIgLS0gdGhlcmUgYXJlIDY2IGltcGxlbWVudGluZyBwYXJ0bmVycyBhbmQgMjggcmVwb3J0aW5nIHBhcnRuZXJzLiBUaGlzIGZpcnN0IGluc3RhbmNlIG9mIG1vbnRobHkgcmVwb3J0aW5nIGhhcyBzZWVuIGEgc2lnbmlmaWNhbnQgZGlwIGluIHN1Ym1pc3Npb25zLCBidXQgcmVzcG9uc2UgaGFzIG92ZXJhbGwgYmVlbiBiZXR0ZXIgdGhhbiBleHBlY3RlZC4gDQoNCkFsbCB0aGlzIG1lYW5zIGlzIHRoYXQgc2V2ZXJhbCBwYXJ0bmVycyBhcmUgd2FpdGluZyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBxdWFydGVyIHRvIHJlcG9ydCBpbi4gDQoNClRoaXMgc2VjdGlvbiB3aWxsIG1vc3RseSBvbmx5IGxvb2sgYXQgeWVhci10by1kYXRlIGFjaGlldmVtZW50cy4gDQoNCjxicj4NCg0KYGBge3IgbGluZXBsb3QtcGFydG5lcnN9DQpmc2MgJT4lIA0KICBncm91cF9ieShkYXRlKSAlPiUgDQogIHN1bW1hcmlzZShpbXBsZW1lbnRpbmcgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICByZXBvcnRpbmcgPSBuX2Rpc3RpbmN0KHJlcG9ydGluZ19vcmdhbml6YXRpb24pKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhpbXBsZW1lbnRpbmcsIHJlcG9ydGluZyksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJwYXJ0bmVyIiwgDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiY291bnQiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGNvdW50LCANCiAgICAgICAgICAgICBjb2xvdXIgPSBwYXJ0bmVyKSkgKyANCiAgZ2VvbV9wb2ludChzaXplID0gMi41KSArDQogIGdlb21fbGluZShzaXplID0gMS41KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb3VudCksIA0KICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgDQogICAgICAgICAgICB2anVzdCA9IC0uMykgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWItJXkiLCANCiAgICAgICAgICAgICAgIGRhdGVfYnJlYWtzID0gIjEgbW9udGgiKSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiI0YzOUMxMiIsICIjMEU2NjU1IikpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiTnVtYmVyIG9mIHBhcnRuZXJzIiwgDQogICAgICAgY29sb3VyID0gIlBhcm50ZXJcbnR5cGUiLA0KICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBwYXJ0bmVycyByZXBvcnRpbmcgYnkgbW9udGgsIDMxIEp1bHkgMjAyMiIpDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNC4xIEltcGxlbWVudGluZyBwYXJ0bmVycw0KDQpUaGVyZSBhcmUgYHIgZnNjICU+JSBmaWx0ZXIoanVseSA9PSAianVseSIpICU+JSBkaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIG5yb3coKWAgcGFydG5lcnMgdGhhdCB3ZXJlIGludm9sdmVkIGluIGRpcmVjdCBpbXBsZW1lbnRhdGlvbiB0aGF0IGhhdmUgcmVwb3J0ZWQgYWNoaWV2ZW1lbnRzIGluIEp1bHkgMjAyMiwgaW4gY29tcGFyaXNvbiB3aXRoIGByIGZzYyAlPiUgZmlsdGVyKGp1bHkgIT0gImp1bHkiKSAlPiUgZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSBucm93KClgIGluIHRoZSBmaXJzdCBxdWFydGVyLiBUaGVzZSBpbXBsZW1lbnRpbmcgcGFydG5lcnMgY29ycmVzcG9uZGVkIHRvIGEgdG90YWwgb2YgYHIgZnNjICU+JSAgZGlzdGluY3QocmVwb3J0aW5nX29yZ2FuaXphdGlvbikgJT4lIG5yb3coKWAgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnMuIFRoZSBsYXJnZXN0IHJlcG9ydGluZyBvcmdhbmlzYXRpb24sIDI2OTAsIGhhZCAyNCBpbXBsZW1lbnRpbmcgcGFydG5lcnMuDQoNClRoZSBpbnRlcmFjdGl2ZSBwbG90IGJlbG93IHNob3dzIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyBhbmQgdG93bnNoaXBzIHJlYWNoZWQgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIuDQoNCmByIGZzYyAlPiUgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSBzdW1tYXJpc2UodG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpKSAlPiUgZmlsdGVyKHRvd25zaGlwcyA+IDUpICU+JSBucm93KClgIHBhcnRuZXJzICgyMSUgb2YgdGhlIHRvdGFsKSBoYXZlIGEgcHJlc2VuY2UgaW4gbW9yZSB0aGFuIDUgdG93bnNoaXBzLiBgciBmc2MgJT4lIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgc3VtbWFyaXNlKHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSkgJT4lIGZpbHRlcih0b3duc2hpcHMgPiAxMCkgJT4lIG5yb3coKWAgcGFydG5lcnMgKDE2JSBvZiB0aGUgdG90YWwpIGFyZSBwcmVzZW50IGluIG1vcmUgdGhhbiAxMCB0b3duc2hpcHMuDQoNCjxicj4NCg0KYGBge3IgcGxvdGx5LXBhcnRuZXItc2NhdHRlcn0NCg0KIyBNZWRpYW4gdmFsdWVzIGFyZSB4ID0gNTY3MSBhbmQgeSA9IDMuIEN1cnJlbnRseSB1c2luZyBtZWFuLiANCnBhcnRuZXJfc2NhdHRlciA8LSBmc2MgJT4lICANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSANCiAgc3VtbWFyaXNlKHN0YXRlcyA9IG5fZGlzdGluY3Qoc3RhdGUpLCANCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSwgDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gdG93bnNoaXBzLCANCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKGltcGxlbWVudGluZ19wYXJ0bmVyLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0ZXM6ICIsIHN0YXRlcywgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAidG93bnNoaXBzOiAiLCB0b3duc2hpcHMsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlbmVmaWNpYXJpZXM6ICIsIGNvbW1hKGJlbmVmaWNpYXJpZXMsIGFjY3VyYWN5ID0gMSkpKSkgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNDgxNDUuMzMsIGx0eSA9IDIsIGNvbG91ciA9ICJyZWQiKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSA0LjU1NTU1NiwgbHR5ID0gMiwgY29sb3VyID0gInJlZCIpICsgDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzKSwgYWxwaGEgPSAuNykgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZyIsIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygwLCAxMDAsIDMwMCwgMTAwMCwgMzAwMCwgMTAwMDAsIDMwMDAwLCAxMDAwMDAsIDMwMDAwMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyNSwgNSkpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiB0b3duc2hpcHMiLA0KICAgICAgIHRpdGxlID0gIlBsb3Qgb2YgYmVuZWZpY2lhcmllcyBhbmQgdG93bnNoaXBzIHJlYWNoZWQsIGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCmdncGxvdGx5KHBhcnRuZXJfc2NhdHRlciwgdG9vbHRpcCA9IGMoInRleHQiKSwgd2lkdGggPSA4MjApICU+JQ0KICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkgJT4lIA0KICBsYXlvdXQodGl0bGUgPSANCiAgICAgICAgICAgbGlzdCgNCiAgICAgICAgICAgICB0ZXh0ID0NCiAgICAgICAgICAgICAgIHBhc3RlMCgNCiAgICAgICAgICAgICAgICAgIkJlbmVmaWNpYXJpZXMgYW5kIHRvd25zaGlwcyByZWFjaGVkLCBieSBpbXBsZW1lbnRpbmcgcGFydG5lciIsDQogICAgICAgICAgICAgICAgICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgIm1vdXNlIG92ZXIgZm9yIGRldGFpbHM7IHNpemVzIGluZGljYXRlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZDsgcmVkIGxpbmVzIGFyZSBtZWFucyIsDQogICAgICAgICAgICAgICAgICI8L3N1cD4iDQogICAgICAgICAgICAgICApDQogICAgICAgICAgICkpDQoNCiMgTWFrZSBhIGNvbXBhcmlzb24gd2l0aCBRMQ0KYGBgDQoNCg0KDQo8YnI+PGJyPg0KDQojIyMgNC4yIE1vbnRobHkgcHJvZ3Jlc3MgYnkgcGFydG5lcg0KDQpUaGUgdGhpY2sgZ3JleSBsaW5lIHNob3dzIGFuIG9yZ2FuaXNhdGlvbidzIHByb2dyZXNzIGZyb20gbGFzdCB5ZWFyLCB3aGljaCwgYXMgbWVudGlvbmVkLCBjYW5ub3QgZXhhY3RseSBiZSB1c2VkIGZvciBhIHN0cmFpZ2h0IGNvbXBhcmlzb24gYXMgdGhlIHNjb3BlIG9mIHRoZSBIUlAgaW4gMjAyMSB3YXMgZGlmZmVyZW50IHVudGlsIHRoZSBhcHByb3ZhbCBvZiB0aGUgSUVSUCwgYWRkaXRpb25hbGx5LCBtYW55IHBhcnRuZXJzIG9ubHkgam9pbmVkIHRoZSBjbHVzdGVyIGxhdGUgaW4gMjAyMSBvciBldmVuIGluIDIwMjIuIFN0aWxsLCBpdCBzZXJ2ZXMgYXMgYSByZWZlcmVuY2UuDQoNCg0KPGJyPg0KDQpgYGB7ciBwYXJ0bmVyLXByb2dyZXNzLWZhY2V0LWxpbmV9DQoNCnBhcnRuZXJfdG9wIDwtIGZzYyAlPiUgDQogIHN1bV9iZW4oaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgIA0KICBtdXRhdGUoaW1wbGVtZW50aW5nX3BhcnRuZXIgPSByZW9yZGVyKGltcGxlbWVudGluZ19wYXJ0bmVyLCAtYmVuZWZpY2lhcmllcykpICU+JSANCiAgcHVsbChpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICBoZWFkKDEyKQ0KDQpsaW5lXzIwMjEgPC0gZnNjXzIwMjEgJT4lIA0KICByZW5hbWUoaW1wbGVtZW50aW5nX3BhcnRuZXIgPSBvcmdfY29kZSkgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JQ0KICBmaWx0ZXIoaW1wbGVtZW50aW5nX3BhcnRuZXIgJWluJSBwYXJ0bmVyX3RvcCkgJT4lIA0KICBzZWxlY3QoZGF0ZSwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGJlbmVmaWNpYXJpZXMsIGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgbXV0YXRlKGRhdGUgPSBkYXRlICsgeWVhcnMoMSkpICU+JSANCiAgZ3JvdXBfYnkobG9jYXRpb24sIGFkbWluM19wY29kZSkgJT4lIA0KICBzbGljZSh3aGljaC5tYXgoYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fYmVuID0gY3Vtc3VtKGJlbmVmaWNpYXJpZXMpKQ0KDQpmc2MgJT4lDQogIGZpbHRlcihpbXBsZW1lbnRpbmdfcGFydG5lciAlaW4lIHBhcnRuZXJfdG9wKSAlPiUNCiAgc2VsZWN0KGRhdGUsIA0KICAgICAgICAgaW1wbGVtZW50aW5nX3BhcnRuZXIsIA0KICAgICAgICAgYmVuZWZpY2lhcmllcyA9IG5ld19iZW5lZmljaWFyaWVzLCANCiAgICAgICAgIGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgIyByYmluZChmc2NfMjAyMSAlPiUgDQogICMgICAgICAgICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgIyAgICAgICAgIGZpbHRlcihvcmdfY29kZSAlaW4lIHBhcnRuZXJfdG9wKSAlPiUgDQogICMgICAgICAgICBzZWxlY3QoZGF0ZSwgb3JnX2NvZGUsIGJlbmVmaWNpYXJpZXMsIGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgc2xpY2Uod2hpY2gubWF4KGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY3VtX2JlbikpICsNCiAgZ2VvbV9zdGVwKGRhdGEgPSBsaW5lXzIwMjEsIA0KICAgICAgICAgICAgYWVzKHggPSBkYXRlLCANCiAgICAgICAgICAgICAgICB5ID0gY3VtX2JlbiksIA0KICAgICAgICAgICAgY29sb3VyID0gImdyZXkiLA0KICAgICAgICAgICAgc2l6ZSA9IDIsIA0KICAgICAgICAgICAgYWxwaGEgPSAuNCkgKyANCiAgZ2VvbV92bGluZShjb2xvdXIgPSAicmVkIiwgDQogICAgICAgICAgICAgbHR5ID0gMiwNCiAgICAgICAgICAgICB4aW50ZXJjZXB0ID0gYXMubnVtZXJpYyhhcy5EYXRlKCIyMDIyLTA2LTAxIikpLCANCiAgICAgICAgICAgICBhbHBoYSA9IC41KSArDQogIGdlb21fdmxpbmUoY29sb3VyID0gInJlZCIsIA0KICAgICAgICAgICAgIGx0eSA9IDIsIA0KICAgICAgICAgICAgIHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMjItMDMtMDEiKSksIA0KICAgICAgICAgICAgIGFscGhhID0gLjUpICsNCiAgZ2VvbV9zdGVwKHNpemUgPSAwLjcpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgDQogICAgICAgICAgICAgICBkYXRlX2xhYmVscyA9ICIlYiIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGZhY2V0X3dyYXAofiBmY3RfcmV2KGZjdF9yZW9yZGVyKGltcGxlbWVudGluZ19wYXJ0bmVyLCBjdW1fYmVuLCBtYXgpKSwgDQogICAgICAgICAgICAgc2NhbGVzID0gImZyZWVfeSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSwgYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSksDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpICsgIyBzZWUgaWYgdGhpcyB3b3JrcyB3aGVuIHlvdSBrbml0LCB0aGVuIGRvIGl0IGZvciB0aGUgb3RoZXIgcGxvdHMgDQogIGxhYnMoeCA9ICJNb250aCIsIA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgdGl0bGUgPSAiTW9udGhseSBwcm9ncmVzcyBvZiB0b3AgMTIgaW1wbGVtZW50aW5nIHBhcnRuZXJzLCBhcyBvZiAzMSBKdWx5IDIwMjIiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJGaWd1cmVzIHNob3cgY3VtdWxhdGl2ZSB1bmlxdWUgYmVuZWZpY2lhcmllczsgcHJldmlvdXMgeWVhcidzIHByb2dyZXNzIGluIGdyZXkiKSANCg0KIyBnZ3NhdmUoInBhcnRuZXJfZmFjZXRfbGluZS5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKSAgDQpgYGANCg0KPGJyPg0KDQpUaGUgdGFibGUgYmVsb3cgbGlzdHMgdGhlIHRvcCAxNSBwYXJ0bmVycyBieSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGluIDIwMjIuDQoNCjxicj4NCg0KYGBge3J9DQpmc2MgJT4lDQogIGdyb3VwX2J5KGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgc2xpY2Uod2hpY2gubWF4KGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHN0YXRlcyA9IG5fZGlzdGluY3QoYWRtaW4xX3Bjb2RlKSwgDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSkpJT4lDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBoZWFkKDE1KSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIlRvcCBpbXBsZW1lbnRpbmcgcGFydG5lcnMgYnkgYmVuZWZpY2lhcmllcyByZWFjaGVkLCBhcyBvZiAzMS0wNy0yMDIyIikgJT4lDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIpDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNC4zIERvbm9ycw0KDQpUaGUgdGFibGUgYmVsb3cgc3VtbWFyaXNlcyB0aGUgcmVhY2ggYW5kIHNjb3BlIChpbiB0ZXJtcyBvZiBnZW9ncmFwaGljIGV4dGVudCBhbmQgbnVtYmVyIG9mIG9yZ2FuaXNhdGlvbnMgc3VwcG9ydGVkKSBvZiBkb25vcnMgd2hvIHN1cHBvcnQgYXQgbGVhc3QgdHdvIHJlcG9ydGluZyBvcmdhbmlzYXRpb25zLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoZG9ub3IpICU+JSANCiAgc3VtbWFyaXNlKHJlcG9ydF9vcmdzID0gbl9kaXN0aW5jdChyZXBvcnRpbmdfb3JnYW5pemF0aW9uKSwgDQogICAgICAgICAgICBpbXBsZW1lbnRpbmdfb3JncyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLCANCiAgICAgICAgICAgIHN0YXRlcyA9IG5fZGlzdGluY3QoYWRtaW4xX3Bjb2RlKSwgDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSkpICU+JSANCiAgZmlsdGVyKCFpcy5uYShkb25vcikgJiByZXBvcnRfb3JncyA+IDEpICU+JSANCiAgYXJyYW5nZShkZXNjKHJlcG9ydF9vcmdzKSkgJT4lDQogIGhlYWQoMTUpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiT3JnYW5pc2F0aW9ucyBzdXBwb3J0ZWQgYW5kIGdlb2dyYXBoaWMgcmVhY2ggYnkgZG9ub3IiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBmb290bm90ZShwYXJ0ID0gImhlYWRlciIsIA0KICAgICAgICAgICBpID0gMSwgaiA9IDEsIA0KICAgICAgICAgICB2YWx1ZSA9IGFzX3BhcmFncmFwaCgiT25seSBzaG93aW5nIGRvbm9ycyBzdXBwb3J0aW5nIG1vcmUgdGhhbiBvbmUgcmVwb3J0aW5nIHBhcnRuZXIiKSkNCg0KYGBgDQoNCjxicj4NCg0KU2FnYWluZywgU2hhbiAoRWFzdCksIFRhbmludGhhcnlpIGFuZCBNYWd3YXkgaGF2ZSB0aGUgZmV3ZXN0IG51bWJlciBvZiBkb25vcnMgcHJlc2VudC4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1kb25vci1zdGF0ZXN9DQpmc2MgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoZG9ub3JzID0gbl9kaXN0aW5jdChkb25vciksIA0KICAgICAgICAgICAgaW1wbGVtZW50aW5nX3BhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcikpICU+JSANCiAgYXJyYW5nZShkZXNjKGRvbm9ycykpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiTnVtYmVyIG9mIGRvbm9ycyBieSBzdGF0ZSIpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkNCg0KYGBgDQoNCjxicj4NCg0KSG93ZXZlciwgYXMgc2hvd24gYnkgdGhlIHRhYmxlIGJlbG93LCBldmVuIHRob3VnaCB0aGUgbWFqb3JpdHkgb2YgcGFydG5lcnMgcmVwb3J0ZWQgdGhlaXIgZG9ub3JzLCB0aGUgb21pc3Npb24gb2YgZGF0YSBmcm9tIHRocmVlIGtleSBwYXJ0bmVycyBoYXMgcmVzdWx0ZWQgaW4gdGhlIHZhc3QgbWFqb3JpdHkgb2YgcmVwb3J0ZWQgYmVuZWZpY2lhcmllcyBub3QgYmVpbmcgYXNzb2NpYXRlZCB3aXRoIGFueSBkb25vci4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1kb25vcnMtYmVuZWZpY2lhcmllc30NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGRvbm9yKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUoZG9ub3IgPSBpZmVsc2UoaXMubmEoZG9ub3IpLCAiTm8gZG9ub3Igc3BlY2lmaWVkIiwgZG9ub3IpLCANCiAgICAgICAgIGRvbm9yID0gaWZlbHNlKGJlbmVmaWNpYXJpZXMgPCAxMDAwLCAiT3RoZXIgZG9ub3JzIiwgZG9ub3IpKSAlPiUgDQogIGdyb3VwX2J5KGRvbm9yKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhgJV9iZW5lZmljaWFyaWVzYCkpICU+JSANCiAgaGVhZCgxNSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJUb3AgZG9ub3JzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCIpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0IikgJT4lIA0KICBmb290bm90ZShwYXJ0ID0gImhlYWRlciIsIA0KICAgICAgICAgICBpID0gMSwgaiA9IDEsIA0KICAgICAgICAgICB2YWx1ZSA9IGFzX3BhcmFncmFwaCgiRG9ub3JzIHN0YXJ0aW5nIHdpdGggJ29yZ194eHh4JyBhcmUgcGFydG5lcnMgdXNpbmcgdGhlaXIgb3duIG9yZ2FuaXNhdGlvbmFsIGZ1bmRzIikpDQogDQpgYGANCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgNS4gQmVuZWZpY2lhcmllcw0KDQpgciByb3VuZCgoZmlsdGVyKGZzYywgYmVuZWZpY2lhcnlfdHlwZSA9PSAiSG9zdC9sb2NhbCBDb21tdW5pdHkiICYganVseSA9PSAianVseSIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSkgLyAoZmlsdGVyKGZzYywganVseSA9PSAianVseSIpICU+JSAge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0pICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIGFsbCBiZW5lZmljaWFyaWVzIGluIEp1bHkgMjAyMiB3ZXJlIGZyb20gaG9zdCBvciBsb2NhbCBjb21tdW5pdGllcy4gDQoNCjxicj48YnI+DQoNCg0KYGBge3J9DQpmc2MgJT4lIA0KICBmaWx0ZXIoanVseSA9PSAianVseSIpICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JQ0KICBzZWxlY3QoYmVuZWZpY2lhcnlfdHlwZSwgYmVuZWZpY2lhcmllcykgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLA0KICAgICAgICAgICAgIHkgPSBmY3RfcmVvcmRlcihiZW5lZmljaWFyeV90eXBlLCBiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAgZmlsbCA9IGJlbmVmaWNpYXJ5X3R5cGUsIA0KICAgICAgICAgICAgIGdyb3VwID0gYmVuZWZpY2lhcnlfdHlwZSkpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgbGFicyh5ID0gIiIsIHggPSAiQmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIkJlbmVmaWNhcmllcyByZWFjaGVkIGJ5IGJlbmVmaWNpYXJ5IHR5cGUiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpgYGANCjxicj48YnI+DQoNCiMjIyA1LjEgQmVuZWZpY2lhcnkgdHlwZXMNCg0KSW4gSnVseSAyMDIyLCBgciByb3VuZChmaWx0ZXIoZnNjLCBiZW5lZmljaWFyeV90eXBlID09ICJIb3N0L2xvY2FsIENvbW11bml0eSIgJiBqdWx5ID09ICJqdWx5IikgJT4lICB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSAvIChmaWx0ZXIoZnNjLCBqdWx5ID09ICJqdWx5IikgJT4lICB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSkgKiAxMDAsIGRpZ2l0cyA9IDIpYCUgb2YgYmVuZWZpY2lhcmllcyB3ZXJlIGZyb20gaG9zdCBvciBsb2NhbCBjb21tdW5pdGllcywgaW4gY29tcGFyaXNvbiB0byBgciByb3VuZChmaWx0ZXIoZnNjLCBiZW5lZmljaWFyeV90eXBlID09ICJIb3N0L2xvY2FsIENvbW11bml0eSIpICU+JSAge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0gLyBzdW0oZnNjJG5ld19iZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMilgJSBmb3IgdGhlIHdob2xlIHllYXIuIGByIHJvdW5kKGZpbHRlcihmc2MsIGJlbmVmaWNpYXJ5X3R5cGUgPT0gIkludGVybmFsbHkgRGlzcGxhY2VkIiAmIGp1bHkgPT0gImp1bHkiKSAlPiUgIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9IC8gZmlsdGVyKGZzYywganVseSA9PSAianVseSIpICU+JSAge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0gKiAxMDAsIGRpZ2l0cyA9IDIpYCUgb2YgYmVuZWZpY2lhcmllcyBpbiBKdWx5IDIwMjIgd2VyZSBJRFBzLCBjb21wYXJlZCB0byBgciByb3VuZChmaWx0ZXIoZnNjLCBiZW5lZmljaWFyeV90eXBlID09ICJJbnRlcm5hbGx5IERpc3BsYWNlZCIpICU+JSAge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0gLyBzdW0oZnNjJG5ld19iZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMilgJSBmb3IgdGhlIHdob2xlIHllYXIuIA0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcnlfdHlwZSwganVseSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcnlfdHlwZSA9IGZjdF9yZW9yZGVyKGJlbmVmaWNpYXJ5X3R5cGUsIGJlbmVmaWNpYXJpZXMpLA0KICAgICAgICAganVseSA9IHJlY29kZShqdWx5LA0KICAgICAgICAgICAgICAgICAgICAgICAibm8iID0gImphbl90b19qdW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAieWVzIiA9ICJqdWx5IiApKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBqdWx5LCANCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IGphbl90b19qdW4gKyBqdWx5LCANCiAgICAgICAgIHBjID0gcm91bmQodG90YWwgLyBzdW0odG90YWwpICogMTAwLCANCiAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMiksIA0KICAgICAgICAgcGNfanVseSA9IHJvdW5kKGp1bHkgLyBzdW0oanVseSkgKiAxMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyKSkgJT4lIA0KICBmaWx0ZXIodG90YWwgIT0gMCkgJT4lIA0KICBhcnJhbmdlKGRlc2MocGMpKSAlPiUgDQogIHNlbGVjdChiZW5lZmljaWFyeV90eXBlLCANCiAgICAgICAgIGphbl90b19qdW4sIGp1bHksIA0KICAgICAgICAgYCVfb2ZfanVseWAgPSBwY19qdWx5LCANCiAgICAgICAgIHRvdGFsLCANCiAgICAgICAgIGAlX29mX3RvdGFsYCA9IHBjKSAlPiUgDQogIGFkb3JuX3RvdGFscygicm93IikgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKHdpZHRoID0gLjg1KSAlPiUgDQogIHNldF9jYXB0aW9uKGNhcHRpb24gPSAiUGVyc29ucyByZWFjaGVkIGJ5IGJlbmVmaWNpYXJ5IHR5cGUsIGFzIG9mIDMxIEp1bHkgMjAyMiIpICU+JSANCiAgdGhlbWVfemVicmEoKQ0KICANCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQoNCiMjIDYuIENvbXBhcmlzb24gd2l0aCB0YXJnZXRzDQoNCiMjIyA2LjEgUmVhY2hlZCB2cyB0YXJnZXQgYnkgdG93bnNoaXANCg0KVGhlIHNwZWNpZmljcyBvZiBlYWNoIHRvd25zaGlwIGNhbiBiZSByZXZpZXdlZCB3aXRoIHRoZSBpbnRlcmFjdGl2ZSBwbG90IGJlbG93LiBFYWNoIHBvaW50IGlzIGEgdG93bnNoaXAsIHdpdGggdGhlIHNpemUgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMuIFRoZSB4LWF4aXMgaW5kaWNhdGVzIHRoZSB0YXJnZXQgcG9wdWxhdGlvbiBieSB0b3duc2hpcCBhbmQgdGhlIHktYXhpcyBzaG93cyB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCwgYXMgb2YgMzEgSnVseSAyMDIyLg0KDQpUaGUgcmVkIGxpbmUgZG93biB0aGUgbWlkZGxlIHJlcHJlc2VudHMgcmVhY2hpbmcgMTAwJSBvZiB0aGUgdGFyZ2V0LiBUb3duc2hpcHMgYWJvdmUgdGhpcyBsaW5lIGhhdmUgcmVhY2hlZCBtb3JlIGJlbmVmaWNpYXJpZXMgdGhhbiB0aGVpciB0YXJnZXQgYW5kIHRvd25zaGlwcyBiZWxvdyB0aGUgbGluZSBoYXZlIG5vdCBtZXQgdGhlaXIgdGFyZ2V0IHlldC4gVGhlIGZ1cnRoZXIgYXdheSBhIHRvd25zaGlwIGlzIGZyb20gdGhlIHJlZCBsaW5lLCB0aGUgZnVydGhlciBhYm92ZSBvciBiZWxvdyBpdHMgdGFyZ2V0IGl0IGlzLiBNb3VzZSBvdmVyIGVhY2ggb2YgdGhlIHRvd25zaGlwcyB0byBzZWUgbW9yZSBkZXRhaWxzLg0KDQpUaGUgMTMgdG93bnNoaXBzIGFsb25nIHRoZSBleHRyZW1lIGxlZnQgc2lkZSBvZiB0aGUgcGxvdCBoYXZlIGJlbmVmaWNpYXJpZXMgYnV0IGRvIG5vdCBoYXZlIHRhcmdldHMgKHRoZWlyIHRhcmdldHMgaGF2ZSBqdXN0IGJlZW4gY29kZWQgYXMgMSBzbyB0aGF0IHRoZXkgc2hvdyB1cCBvbiB0aGUgcGxvdCkuIDE5OCB0b3duc2hpcHMgd2l0aCB0YXJnZXRzIGhhdmUgbm90IGJlZW4gcmVhY2hlZC4NCg0KYGBge3IgZXZhbCA9ICBGQUxTRX0NCjMzMCAtIChmc2MgJT4lIGRpc3RpbmN0KGFkbWluM19wY29kZSkgJT4lIG5yb3coKSkNCg0KDQpgYGANCg0KDQo8YnI+DQoNCmBgYHtyIHBsb3RseS10c3AtY29tcGFyaXNvbi1yZWFjaGVkLXRhcmdldH0NCg0KYmVuX3RhcmdldCA8LSBmc2MgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUgPSBhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwNCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcikpICU+JSANCiAgbGVmdF9qb2luKHBpbiwgYnkgPSBjKCJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICBtdXRhdGUocmVhY2hlZF9wYyA9IGJlbmVmaWNpYXJpZXMgLyBmc190YXJnZXRlZCwNCiAgICAgICAgIHJlYWNoZWRfcGMgPSBpZmVsc2UoaXMuaW5maW5pdGUocmVhY2hlZF9wYyksIDEsIHJlYWNoZWRfcGMpLA0KICAgICAgICAgZnNfdGFyZ2V0ZWQgPSBpZmVsc2UoZnNfdGFyZ2V0ZWQgPT0gMCAmIGJlbmVmaWNpYXJpZXMgPiAwLCAxLCBmc190YXJnZXRlZCksDQogICAgICAgICBmc190YXJnZXRlZCA9IHJvdW5kKGZzX3RhcmdldGVkLCBkaWdpdHMgPSAwKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmVhY2hlZF9wYykpICU+JSANCiAgbGVmdF9qb2luKGZzYyAlPiUgICAgICAgICAgIA0KICAgICAgICAgICAgICBmaWx0ZXIoanVseSA9PSAianVseSIpICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUgPSBhZG1pbjNfcGNvZGVfb2xkKSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKA0KICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcikNCiAgICAgICAgICAgICAgKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKGp1bHkgPSAxKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChqdWx5LCBhZG1pbjNfcGNvZGUpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShqdWx5ID0gaWZlbHNlKGp1bHkgPT0gMSwgImp1bHkiLCAiamFuX3RvX2p1biIpKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChqdWx5ID0gImphbl90b19qdW4iKSkgJT4lIA0KICBzZWxlY3Qoc3RhdGUsIHRvd25zaGlwLCANCiAgICAgICAgIGZzX3BpbiwgZnNfdGFyZ2V0ZWQsIA0KICAgICAgICAgYmVuZWZpY2lhcmllcywgcmVhY2hlZF9wYywgDQogICAgICAgICBwYXJ0bmVycywgDQogICAgICAgICBqdWx5KSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZnNfdGFyZ2V0ZWQsIHkgPSBiZW5lZmljaWFyaWVzLCBjb2xvdXIgPSBqdWx5LCANCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKHRvd25zaGlwLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlbmVmaWNpYXJpZXM6ICIsIGNvbW1hKGJlbmVmaWNpYXJpZXMsIGFjY3VyYWN5ID0gMSksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0OiAiLCBjb21tYShmc190YXJnZXRlZCwgYWNjdXJhY3kgPSAxKSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIG9mIHRhcmdldDogIiwgcGVyY2VudChyZWFjaGVkX3BjLCBhY2N1cmFjeSA9IDIpLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJ0bmVyczogIiwgcGFydG5lcnMpKSkgKyANCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxLCBsdHkgPSAyLCBjb2xvdXIgPSAicmVkIikgKyANCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gLjUsIHNsb3BlID0gMSwgbHR5ID0gMiwgY29sb3VyID0gImdyZXkiLCBzaXplID0gLjQpICsgDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IC0uNSwgc2xvcGUgPSAxLCBsdHkgPSAyLCBjb2xvdXIgPSAiZ3JleSIsIHNpemUgPSAuNCkgKyANCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IGJlbmVmaWNpYXJpZXMpLCBhbHBoYSA9IDAuOCkgKw0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoZ3VpZGUgPSAibm9uZSIpICsgDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIGxhYmVscyA9IGNvbW1hKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBsYWJlbHMgPSBjb21tYSkgKw0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiNBRjdBQzUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjRjFDNDBGIikpICsgDQogIGxhYnMoeCA9ICJUYXJnZXRlZCBwb3B1bGF0aW9uIiwgeSA9ICJCZW5lZmljaWFyaWVzIiwgDQogICAgICAgdGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIHZzIHRhcmdldGVkIHBvcHVsYXRpb24gYnkgdG93bnNoaXAsIGFzIDMxIEp1bHkgMjAyMiIsDQogICAgICAgc3VidGl0bGUgPSAiVGhlIHJlZCBsaW5lIGlzIDEwMCUgb2YgdGFyZ2V0IiwgDQogICAgICAgY29sb3VyID0gIiIpICsgDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpDQoNCmdncGxvdGx5KGJlbl90YXJnZXQsIHRvb2x0aXAgPSBjKCJ0ZXh0IiksIHdpZHRoID0gODIwLCBoZWlnaHQgPSA1MDApICU+JSANCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gDQogICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICJCZW5lZmljaWFyaWVzIHZzIHRhcmdldCBieSB0b3duc2hpcCwgYXMgb2YgMzEgSnVseSAyMDIyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHJlZCBsaW5lIGlzIDEwMCUgb2YgdGFyZ2V0OyBzaXplIHNob3dzIG51bWJlciBvZiBiZW5lZmljaWFyaWVzOyB5ZWxsb3cgdG93bnNoaXBzIHdlcmUgcmVhY2hlZCBpbiBKdWx5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvc3VwPiINCiAgICAgICAgICAgICAgICAgICAgICAgICkpLA0KICAgICAgICAgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNykpKQ0KDQpgYGANCg0KPGJyPg0KDQpJbiBtb3N0IG9mIHRoZSB0b3duc2hpcHMgd2hlcmUgdGhlIGZvb2Qgc2VjdXJpdHkgY2x1c3RlciBpcyBwcmVzZW50LCB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpcyB1bmRlciB0aGUgY2x1c3RlciB0YXJnZXQuIFRvd25zaGlwcyB3aGljaCBoYXZlIGJlZW4gaGVhdmlseSBvdmVyc3Vic2NyaWJlZCBoYXZlIGJlZW4gbGlzdGVkIGluIHRoZSBbc2Vjb25kIHF1YXJ0ZXIgNVdzIHJlcG9ydF0oaHR0cHM6Ly9mb29kLXNlY3VyaXR5LWNsdXN0ZXItbXlhbm1hci5naXRodWIuaW8vZnNjXzV3c19zZWNvbmRfcXVhcnRlcl8yMDIyLykuIA0KDQoNCjxicj48YnI+DQoNCiMjIyA2LjIgTWFwIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiBRMSAmIFEyIDIwMjIgdnMgdGFyZ2V0DQoNCmBgYHtyIG1hcHMtYmVuLXRhcmdldCwgZmlnLmhlaWdodD0xNH0NCmZzYyAlPiUgDQogIGZpbHRlcihqdWx5ID09ICJqdWx5IikgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUgPSBhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9IGMoImFkbWluM19wY29kZSIpKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBiZW5lZmljaWFyaWVzKSwgc2l6ZSA9IDAuMSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgdHJhbnMgPSAibG9nMTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDUwMDAwMCksDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTkwIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGJlZ2luID0gLjMpICsgDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNywgJ2NtJyksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJ3aGl0ZSIpKSArDQogIGxhYnModGl0bGUgPSAiQmVuZWZpY2lhcmllcyBpbiBKdWx5IDIwMjIsIGJ5IHRvd25zaGlwIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJ0b3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICsNCiAgDQpmc2MgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUgPSBhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9IGMoImFkbWluM19wY29kZSIpKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBiZW5lZmljaWFyaWVzKSwgc2l6ZSA9IDAuMSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgdHJhbnMgPSAibG9nMTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDUwMDAwMCksDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTkwIikgKyANCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAnY20nKSwgDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gIndoaXRlIikpICsNCiAgbGFicyh0aXRsZSA9ICJCZW5lZmljaWFyaWVzIFRvdGFsIDIwMjIgYXMgb2YgMzEgSnVseSAyMDIyLCBieSB0b3duc2hpcCIsDQogICAgICAgc3VidGl0bGUgPSAidG93bnNoaXBzIGluIGdyZXkgZG8gbm90IGhhdmUgYW55IHBhcnRuZXJzIHByZXNlbnQiLCANCiAgICAgICBmaWxsID0gIkJlbmVmaWNpYXJpZXMiKSArDQpwaW4gJT4lIA0KICByaWdodF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSAgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2YoYWVzKGZpbGwgPSBmc190YXJnZXRlZCksIHNpemUgPSAuMSkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoZGlyZWN0aW9uID0gLTEsIHRyYW5zID0gImxvZzEwIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgNTAwMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gcmFuZ2UoNTcsIDgwMTc2MCksIA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXk5MCIpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAnY20nKSwgDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gIndoaXRlIikpICsNCiAgICBsYWJzKHRpdGxlID0gIlRhcmdldCBieSB0b3duc2hpcCIsDQogICAgICAgICBzdWJ0aXRsZSA9ICJ0b3duc2hpcHMgaW4gZ3JleSBkbyBub3QgZm9vZCBzZWN1cml0eSB0YXJnZXRzIiwgDQogICAgICAgICBmaWxsID0gInRhcmdldCIpICsgDQogIA0KcGluICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSAgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gZnNfcGluKSwgc2l6ZSA9IC4xKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgdHJhbnMgPSAibG9nMTAiLCAgDQogICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCA1MDAwMDApLA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSByYW5nZSg1NywgODAxNzYwKSwgDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTkwIikgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjcsICdjbScpLCANCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAid2hpdGUiKSkgKw0KICAgIGxhYnModGl0bGUgPSAiUGVvcGxlIGluIE5lZWQgYnkgdG93bnNoaXAiLA0KICAgICAgICAgc3VidGl0bGUgPSAidG93bnNoaXBzIGluIGdyZXkgZG8gbm90IGZvb2Qgc2VjdXJpdHkgdGFyZ2V0cyIsIA0KICAgICAgICAgZmlsbCA9ICJQSU4iKQ0KICANCg0KIyBnZ3NhdmUoInRhcmdldF9ieV90c3AucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSAxOCwgd2lkdGggPSAxMSwgdW5pdHMgPSAiaW4iKQ0KDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgNi4zIEludGVyYWN0aXZlIHJlZmVyZW5jZSB0YWJsZQ0KDQpJbiB0aGUgaW50ZXJhY3RpdmUgdGFibGUgYmVsb3csIGlzIGEgbGlzdCBvZiB0b3duc2hpcHMgc29ydGVkIGJ5IHRoZSBnYXAgYmV0d2VlbiB0aGUgdGFyZ2V0ZWQgcG9wdWxhdGlvbiBhbmQgYmVuZWZpY2lhcmllcyByZWFjaGVkIGluIDIwMjIuIEFueSBvZiB0aGUgY29sdW1ucyBjYW4gYmUgc29ydGVkOyB0aGUgc2VhcmNoIGJhcnMgYWJvdmUgZWFjaCBjb2x1bW4gY2FuIGFsc28gYmUgdXNlZCB0byBmaWx0ZXIgZW50cmllcy4NCg0KPGJyPg0KDQpgYGB7cn0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgICAganVseV9iZW4gPSBzdW0obmV3X2JlbmVmaWNpYXJpZXNbanVseSA9PSAianVseSJdKSwgDQogICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGluLCBieSA9IGMoImFkbWluM19wY29kZV9vbGQiID0gImFkbWluM19wY29kZSIpKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChiZW5lZmljaWFyaWVzID0gMCwgDQogICAgICAgICAgICAgICAgICBqdWx5X2JlbmVmaWNpYXJpZXMgPSAwKSkgJT4lDQogIG11dGF0ZShyZWFjaGVkX3BjID0gYmVuZWZpY2lhcmllcyAvIGZzX3RhcmdldGVkLA0KICAgICAgICAgcmVhY2hlZF9wYyA9IGlmZWxzZShpcy5pbmZpbml0ZShyZWFjaGVkX3BjKSwgMSwgcmVhY2hlZF9wYyksDQogICAgICAgICByZWFjaGVkX3BjID0gcm91bmQocmVhY2hlZF9wYyAqIDEwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgZnNfdGFyZ2V0ZWQgPSByb3VuZChmc190YXJnZXRlZCwgZGlnaXRzID0gMCksIA0KICAgICAgICAgZ2FwID0gZnNfdGFyZ2V0ZWQgLSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGFycmFuZ2UoZ2FwKSAlPiUgDQogIHNlbGVjdChzdGF0ZSwgdG93bnNoaXAsIHRhcmdldCA9IGZzX3RhcmdldGVkLCBiZW5lZmljaWFyaWVzLA0KICAgICAgICAganVseV9iZW4sIA0KICAgICAgICAgZ2FwLCBgJV9yZWFjaGVkYCA9IHJlYWNoZWRfcGMsIHBhcnRuZXJzKSAlPiUgDQogIGRhdGF0YWJsZShvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTUsIHNjcm9sbFggPSBUUlVFKSwgDQogICAgICAgICAgICBmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjpibGFjazsgZm9udC1zaXplOjEyMCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVmZXJlbmNlIHRhYmxlIC0tIHRvd25zaGlwcyIpKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoInRhcmdldCIsICJiZW5lZmljaWFyaWVzIiwgImdhcCIpLCBkaWdpdHMgPSAwKSAlPiUgDQogIGZvcm1hdFN0eWxlKDAsIHRhcmdldCA9ICJyb3ciLCBsaW5lSGVpZ2h0ID0gIjgwJSIsIGZvbnRTaXplID0gIjgwJSIpDQoNCg0KDQpgYGANCg0KDQoNCg0K