Food Security Cluster Myanmar homepage


Summary of achievements

Beneficiaries of humanitarian action formed 90.57% of the 3,033,156 beneficiaries in the first quarter of 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.

To recall, the Food Security Cluster’s strategic objectives for 2022 are:

  • SO1: 556,000 IDPs have equitable access to sufficient, safe and nutritious food (either in-kind or through food assistance).
  • SO2: 2.9 million vulnerable persons (excl. IDPs) have equitable access to sufficient, safe and nutritious food (either in-kind or through food assistance).
  • SO3: Restore, protect and improve livelihoods and resilience for 850,000 persons.

Overall, 91.12% of the food security cluster’s beneficiaries were from humanitarian activities.


2022 humanitarian beneficiaries
SO Q1 Q2 Total_Jun22 %_of_total %_increase
SO1 193,154 341,050 534,204 19.32 176.57
SO2 1,560,453 588,488 2,148,941 77.72 37.71
SO3 34,116 47,702 81,818 2.96 139.82
Total 1,787,723 977,240 2,764,963 100.00 54.66


A total of 8.88% beneficiaries were from development activities and actors.


2022 development beneficiaries
SO Q1 Q2 Total_Jun22 %_of_total %_increase
SO3 220,587 47,606 268,193 100 21.58
Total 220,587 47,606 268,193 100 21.58


Pertaining to the humanitarian response under the HRP, the increase between beneficiaries reached in SO1 and SO3 were 177% and 140% respectively. This is in comparison with SO2, which saw an increase of only 38% from Q1. This demonstrates that:

  • The food security response to non-IDP vulnerable groups (SO2) is a well-established activity which is largely repeating the same pattern that it did in 2021. The limited number of new beneficiaries highlights that this is a routine activity mainly providing addition rounds of food assistance to persons already served in Q1.

  • The very significant progress in the number of IDPs reached by food assistance (SO1) is largely to due to FSC partners reaching many more IDPs in Rakhine State.

  • Regarding SO3 and development activities (achievements have been transferred to UNDP for reporting under the SERRP), 21.3% of development projects have been in place since Q1. The limited financial support from development donors is major constraint to developing new projects and reaching new beneficiaries.



Beneficiaries by activity, as of 30 June 2022
Activity Q1 Q2 %_change Total %total
Food distribution 1,723,250 851,483 -50.59 2,574,733 84.89
FFS and farmer training 195,839 1,003 -99.49 196,842 6.49
Crop, vegetable and seed kits 48,046 60,912 26.78 108,958 3.59
Multi-purpose cash transfer 31,357 76,365 143.53 107,722 3.55
Food_cash for work_assets 7,352 26,362 258.57 33,714 1.11
Community infrastructure and equipment 0 4,770 100.00 4,770 0.16
IGA and small grants 2,048 462 -77.44 2,510 0.08
Heb and fortfied rice 0 1,706 100.00 1,706 0.06
Vocational training 327 1,306 299.39 1,633 0.05
Kitchen garden kits 0 475 100.00 475 0.02
Livestock kits 91 2 -97.80 93 0.00


Food distributions overwhelmingly target persons in host and local communities, this group forms 75.04% of all beneficiaries of food distributions or 1,932,135 persons. However, as will be seen in section 5, the food insecurity status of beneficiaries is often reported incorrectly.


Food distributions by type food insecurity status and beneficiary type
beneficiary_type Moderate Severe Total
Host/local Community 1,913,480 18,655 1,932,135
Internally Displaced 260,257 182,793 443,050
Rakhine Stateless 3,618 189,405 193,023
Resettled 2,977 0 2,977
Returnees 2,413 1,135 3,548
Total 2,182,745 391,988 2,574,733


45% of beneficiaries were reached by activities where nutrition had been mainstreamed.


Beneficiaries by status of nutrition mainstreaming
was_nutrition_mainstreamed_in_activity SO1 SO2 SO3 total_beneficiaries %_beneficiaries
Yes 327,046 957,282 90,490 1,374,818 45.33
No 207,158 1,192,675 258,505 1,658,338 54.67




1. Geographies

A total of 3,033,156 beneficiaries were reached in the first half of 2022. The plot below shows cumulative beneficiaries over time.




1.1 States

Though new beneficiaries reached remained biased towards Yangon and Rakhine in Q2, figures were less skewed than they were in Q1. Overall 66.24% of beneficiaries in Q2 came from Yangon or Rakhine, whereas it was 78.83% in Q1. Kayah saw the largest quarter-to-quarter increase in number of persons reached.



A total of 123 townships have been reached across 16 states/regions as of 30th June 2022.



1.2 Townships

The top 7 townships – Hlaingtharya East and West, Shwepyithar, North Okkalapa, Buthidaung, Dala and Sittwe – by total number of beneficiaries reached as of 30th June 2022, are all from Yangon or Rakhine and contained 68% of all beneficiaries. There is, overall, still quite a significant skew in where the food security cluster is reaching its beneficiaries.


Top townships by beneficiaries reached
state township Q1 Q2 Total_Jun_2022 %total
Yangon Hlaingtharya (West) 433,074 36,195 469,269 15.47
Yangon Hlaingtharya (East) 270,646 128,461 399,107 13.16
Yangon Shwepyithar 380,512 0 380,512 12.55
Yangon North Okkalapa 168,400 172,559 340,959 11.24
Rakhine Buthidaung 147,534 18,314 165,848 5.47
Yangon Dala 81,125 81,390 162,515 5.36
Rakhine Sittwe 22,484 130,281 152,765 5.04
Kayah Loikaw 815 107,473 108,288 3.57
Mandalay Nyaung-U 71,547 0 71,547 2.36
Rakhine Maungdaw 44,625 22,757 67,382 2.22
Mandalay Myingyan 46,087 3 46,090 1.52
Kayin Hpapun 12,477 29,561 42,038 1.39
Kayah Hpruso 26,507 7,557 34,064 1.12
Kachin Waingmaw 19,249 14,292 33,541 1.11
Rakhine Pauktaw 76 31,597 31,673 1.04
Only showing townships with >1% of total beneficiaries


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



31 new townships were added in the second quarter of 2022. 6 of the new townships were from Shan, 5 were from Ayeyarwady; Magway, Mandalay and Tanintharyi each added 3; Kayah, Mon, Rakhine and Sagaing each added 2; and Bago, Chin and Kayin added 1.



1.3 Locations

A location refers to either a village, ward, IDP site or industrial zone.

The vast amount of project locations have only one food security activity.

This first plot below is a histogram of intervention locations, by the number of beneficiaries reached in each of them. he vast majority of loations only have on acticity occuring in them. THis is something to be monitored over the course of the years, as it is assumed that a range og activities are required to comprehensively meet the food security and livelihoods needs of targeted communities. As it currently stands, the response is very broad, with little depth.



The same is true for the number of partners, with the majority of locations having one partner.



Of the 2,197 sites reached, 359 had more than one partner present.


Number of partners by location, as of 30 June 2022
partners location
1_partner 1,838
2_partners 332
3_partners 24
4_partners 3


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





2. Activities

2.1 Progress by activity

The first dotted red line shows the end of Q1 and the second shows the end of Q2. 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.



Newly implemented in Q2 of 2022 was the provision of HEB and fortified rice, largely in Chin state. Food distributions continued to be the largest activity, followed by the provision of crop, vegetable and seed kits.



2.2 Agricultural and livelihoods activities

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


Beneficiaries reached by agricultural and livelihood activities
activity beneficiaries %beneficiaries
FFS and farmer training 196,842 63.83
crop, vegetable and seed kits 108,958 35.33
IGA and small grants 2,510 0.81
livestock kits 93 0.03
Total 308,403 100.00
as of 30 June 2022


The plot below shows the beneficiary frequencies reached. The percentage of beneficiaries reached by agriculture and livelihoods activities (crops, vegetable and seed kits; FFS and farmer training; IGA and small grants; livestock kits) slightly in Q2 2022, compared to Q1.




2.3 Delivery modalities

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


Percentage of beneficiaries reached by activity and delivery modality
Activity In-kind CBT/CVA Hybrid Service delivery Beneficiaries
Food distribution 86.1% 12.3% 1.6% 2,574,733
FFS and farmer training 15.0% 24.7% 60.3% 196,842
Crop, vegetable and seed kits 83.3% 0.5% 16.2% 0.0% 108,958
Multi-purpose cash transfer 89.3% 10.7% 107,722
Food_cash for work_assets 17.3% 82.7% 33,714
Community infrastructure and equipment 100.0% 4,770
IGA and small grants 10.4% 87.4% 1.2% 1.0% 2,510
Heb and fortfied rice 100.0% 1,706
Vocational training 0.0% 23.1% 76.9% 1,633
Kitchen garden kits 100.0% 475
Livestock kits 97.8% 0.0% 0.0% 2.2% 93
Beneficiary totals are as of 30 June 2022


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 USD 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.




3.2 USD 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.



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.



Cash transfer values tended to be higher in Q2 as compared to Q1 largely due to increases in the per-household package of multi-purpose cash transfers. This may be explained by the implementation of new 2022 projects that have integrated the inflation in their budgeting.




3.3 Food distributions


Kachin, Rakhine and Shan notably have several extreme outliers much higher than the average for that state. Kayin, however, has a very large number of beneficiaries who received less the USD 1/person. 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.86% have received at least 50% of the food security MEB (USD 11.45 per person).


USD values of food distributions by percentage of MEB received
usd_person_bin avg_pc_of_meb avg_usd_month beneficiaries pc_of_hhd
<$2 6.14 1.41 23,892 5.44
>=$2_<$4 14.44 3.31 46,648 10.62
>=$4_<$6 22.76 5.21 30,454 6.93
>=$6_<$8 32.15 7.36 60,380 13.75
>=$8_<$10 40.60 9.30 223,906 50.99
>=$10_<$12 47.98 10.99 19,185 4.37
>=$12_<$14 54.60 12.51 5,090 1.16
>=$14_<$16 64.92 14.87 1,741 0.40
>=$16_<$18 74.43 17.05 6,941 1.58
>=$18_<$20 84.51 19.36 12,730 2.90
>=$20 187.95 43.06 8,179 1.86
Only persons reached through CBT/CVA/hybrid modalities are included



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 showws the number of beneficiaries reached and the depth of the colour indicates the value of the cash transfer.





4. Partners

A total of 71 partners have reported into the Food Security Cluster as of Q2 2022 – there are 48 implementing partners and 23 reporting partners.




4.1 Implementing partner

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


Reporting organisations with the most implementing partners
report_org_code implementing_partners
org_2690 24
org_3536 7
org_8415 7
org_2625 4
org_3422 4
org_2214 3
org_5369 3
All others had 1 or 2 implementing partners


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

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



As a reference, in Q1, only 6 partners (17% of the total) have a presence in more than 5 townships. This highlights that:

  • The expansion of the FSC members help to collect data on food security programming that was not on the FSC’s radar.

  • FSC partners are making efforts to reach vulnerable groups in new areas.

Overall, this positive change underlines the expansion of the geographic coverage of the FSC.



4.2 Monthly progress by partner

Organisations 6197, 2690 and 5722 have implemented the majority of their activities in the second quarter of 2022.

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.


Top implementing partners by beneficiaries reached in 2022, as of 30 June 2022
org_code ben_q1 rank_q1 ben_q2 rank_q2 total_ben
org_8540 380,478 1 4,502 25 384,980
org_5722 207,512 2 77,743 5 285,255
org_9693 122,397 6 78,569 4 200,966
org_4933 85,627 11 95,475 3 181,102
org_5440 116,142 7 52,944 10 169,086
org_6827 159,724 3 159,724
org_1206 156,433 4 156,433
org_2690 24,753 16 124,142 1 148,895
org_9566 89,365 10 57,723 9 147,088
org_3315 131,861 5 441 43 132,302
org_5677 95,835 9 23,473 13 119,308
org_6197 113,704 2 113,704
org_8004 69,918 12 40,490 11 110,408
org_6792 105,410 8 105,410
org_6130 35,385 15 61,280 8 96,665



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.


Organisations supported and geographic reach by donor
donor report_orgs implementing_orgs states townships
FCDO 6 8 6 19
LIFT 6 10 6 15
MHF 5 6 4 7
ECHO 3 4 3 5
BHA 2 5 4 11
GIZ 2 2 2 7
org_5677 2 2 6 15
org_6793 2 3 3 9
org_7904 2 3 2 7
org_8415 2 2 3 15
Only showing donors supporting more than one reporting partner.


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


Number of donors by state
state donors implementing_partners
Kayin 14 13
Kachin 13 14
Rakhine 11 18
Kayah 10 5
Mon 7 6
Shan (South) 7 8
Mandalay 5 3
Shan (North) 5 8
Bago (East) 4 3
Chin 4 4
Yangon 4 14
Magway 3 3
Tanintharyi 3 3
Ayeyarwady 2 4
Sagaing 2 3
Shan (East) 2 2


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.


Top donors by beneficiaries reached
donor beneficiaries %_beneficiaries
No donor specified 2,397,314 79.04
org_6793 156,303 5.15
FCDO 94,653 3.12
CERF 71,253 2.35
AICS 63,986 2.11
org_5677 49,279 1.62
BPRM 31,640 1.04
org_7904 20,213 0.67
DFAT 17,329 0.57
BHA 16,356 0.54
org_7002 13,851 0.46
AAP 12,392 0.41
MHF 12,303 0.41
NZMFAT 10,791 0.36
ECHO 7,854 0.26
Donors starting with ‘org_xxxx’ are partners using their own organisational funds


Below is a table of beneficiaries who are missing donors, grouped by state.


Reported beneficiaries with missing donor data
state beneficiaries partners
Yangon 1,752,158 9
Rakhine 421,076 9
Kayah 98,394 1
Kachin 69,031 3
Shan (North) 18,420 5
Chin 16,389 2
Shan (South) 9,416 2
Sagaing 7,650 2
Kayin 4,505 2
Shan (East) 275 1




5. Beneficiaries

75.5% of all beneficiaries in the first half of 2022 were from host or local communities.





5.1 Beneficiary types

In Q2 2022, 65.66% of beneficiaries were from host or local communities, in comparison to 53.31% for round 1. 33.35% of beneficiaries in Q2 were IDPs, compared to 9.63% for Q1.




5.2 Evidence of food insecurity status

Of the food security activities reported, very few provided details about the food insecurity status of beneficiaries. This makes it difficult ot determine whether interventions are truly reaching those most in need.

In general, the food insecurity status of the beneficiaries of multi-purpose cash transfers were much better documented than the statuses of those who received food distributions.


Missing food insecurity data of beneficiaries, as of 30 June 2022
activity food_insecurity_status beneficiaries %_of_group
food distributions, moderate NA 1,895,565 86.84
food distributions, severe NA 296,787 75.71
multi-purpose cash transfer, moderate NA 4,695 13.25
multi-purpose cash transfer, severe NA 16 0.02


Evidence of beneficiaries’ food insecurity status provided to the cluster include:


Evidence of food insecurity status, as of 30 June 2022
evidence beneficiaries %_beneficiaries
No evidence 2,757,212 90.90
Armed conflict 147,088 4.85
community-based beneficiary selection 34,407 1.13
Post-distribution monitoring 31,347 1.03
Acceptable FCS 29,071 0.96
Beneficiary list and distribution list 19,279 0.64
Regular reporting 8,984 0.30
assessment, meeting minutes, payment 3,020 0.10
Village Profile 1,683 0.06
Based on Vulnerable Score (Vulnerable Criteria) 608 0.02
Food distribution certificate 308 0.01
Food Security and Livelihood Baseline Survey 119 0.00
Provision grants of women led micro business activities 30 0.00


The general lack of evidence of evidence of beneficiaries’ food insecurity status makes it difficult to justify to affected communities and donors that the Food Security Cluster is reaching the most in need. This highlights the need to promote a shared understanding of the response through the development of a common prioritisation tool for food security partners.




5.3 Beneficiary disaggregation

In this section, a test is applied to determine if the disaggregated numbers of beneficiaries reach have been copied and pasted – a somewhat common practice that sullies the quality of the data. To do this, the proportions of each disaggregation group by partner have been compared to how close they were to the mean for the entire group. To explain: if partner A reported that 40% of beneficiaries in an activity were adult females, this percentage was then compared to the average percentage of adult females for all other activities reported by that partner. This measure whether or not the same proportions were copied and pasted throughout the 5W form.

It is extremely unlikely that these percentages would be similar across activities as implementing partners worked in an average of 42 locations.

In the plot below, the closer a value is to 0% on the x-axis, the more likely it is that it was copied and pasted. It is estimated that 73% of beneficiary disaggregation values were copied and pasted. All entries on the left side of the red line are considered similar enough to other rows to be treated as having been copied and pasted.



The plot on the below-left shows the breakdown of beneficiaries by disaggregation group with the copy-pasted values removed. The plot on the below-right shows a breakdown of the “fake” copy-pasted values.





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 Q2 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). 209 townships with targets have not been reached.



When compared to the results for Q1 2022, it is clear that the areas which already have exceeded their targets (above the red line) have actually received even more assistance in the second quarter of 2022.



The table below shows the top townships in terms of overreach.


Top 15 most overreached townships
state township Q1 Q2 beneficiaries target gap
Yangon Hlaingtharya 703,720 164,656 868,376 227,976 -640,400
Yangon Shwepyithar 380,512 0 380,512 111,938 -268,574
Yangon North Okkalapa 168,400 172,559 340,959 108,603 -232,356
Rakhine Buthidaung 147,534 18,314 165,848 25,001 -140,847
Yangon Dala 81,125 81,390 162,515 56,325 -106,190
Kayah Loikaw 815 107,473 108,288 25,000 -83,288
Rakhine Sittwe 22,484 130,281 152,765 79,999 -72,766
Mandalay Nyaung-U 71,547 0 71,547 3,016 -68,531
Rakhine Maungdaw 44,625 22,757 67,382 16,889 -50,493
Mandalay Myingyan 46,087 3 46,090 3,470 -42,620
Rakhine Pauktaw 76 31,597 31,673 0 -31,673
Kayah Hpruso 26,507 7,557 34,064 4,000 -30,064
Kachin Momauk 14,601 15,144 29,745 9,311 -20,434
Kachin Waingmaw 19,249 14,292 33,541 14,284 -19,257
Kayin Myawaddy 20,843 3,341 24,184 5,000 -19,184


In most of the townships where the food security cluster is present, the number of beneficiaries reached is under the cluster target. Not encouragingly, the fastest growing group of townships are those where the target has been exceeded. Townships such as Hlaingtharya, which were already far over their target in Q1, continued to add beneficiaries in Q2, and now stands at 381% of target. Similar areas include Shwepyithar (340% of target), Dala (289%), North Okkalapa (314%) and Buthidaung (663%).


Townships by percentage of target reached
category range townships_Q1 townships_as_of_Q2_2022
under <90% of target 76 105
on_target >=90% and < 110% of target 4 6
overreach >= 110% of target 18 27
not_reached 0% of target 106 78


The number of towships with food security targets not reached has reduced from 106 in Q1 to 78 in Q2.



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 sort; the search bars above each column can also assist in filtering.


LS0tDQp0aXRsZTogIlJlcG9ydCBvbiA1V3MiDQpzdWJ0aXRsZTogIlNlY29uZCBxdWFydGVyIDIwMjIiDQphdXRob3I6ICJNeWFubWFyIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciINCmRhdGU6ICIyMDIyLTA3LTIxIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQogICAgY29sbGFwc2VkOiBubw0KYWx3YXlzX2FsbG93X2h0bWw6IHllcw0KLS0tDQoNCjxzY3JpcHQ+DQogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7DQogICAgICAkaXRlbXMgPSAkKCdkaXYjVE9DIGxpJyk7DQogICAgICAkaXRlbXMuZWFjaChmdW5jdGlvbihpZHgpIHsNCiAgICAgICAgbnVtX3VsID0gJCh0aGlzKS5wYXJlbnRzVW50aWwoJyNUT0MnKS5sZW5ndGg7DQogICAgICAgICQodGhpcykuY3NzKHsndGV4dC1pbmRlbnQnOiBudW1fdWwgKiAxMCwgJ3BhZGRpbmctbGVmdCc6IDB9KTsNCiAgICAgIH0pOw0KDQogICAgfSk7DQo8L3NjcmlwdD4NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDcwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIk15YW5tYXJfY2x1c3Rlcl9ibHVlLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc3RyaW5naSkNCmxpYnJhcnkocGFuZGVyKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShmdXp6eWpvaW4pDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShza2ltcikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KGJyb29tKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KGdnZm9yY2UpDQoNCnRoZW1lX3NldCh0aGVtZV9saWdodCgpKQ0KDQojIGRpc2FibGluZyBzY2llbnRpZmljIG5vdGF0aW9uDQpvcHRpb25zKHNjaXBlbiA9IDEwMCkNCg0KIyBwYW5kZXIgdGFibGVzIGFsbCBpbiBvbmUgcm93DQpwYW5kZXJPcHRpb25zKCd0YWJsZS5zcGxpdC50YWJsZScsIEluZikNCg0KIyBwYW5kZXIgdGhvdXNhbmRzIHNlcGFyYXRvcg0KcGFuZGVyT3B0aW9ucygiYmlnLm1hcmsiLCAiLCIpDQoNCiMgcmVwbGFjZSANCm9wdHMgPC0gb3B0aW9ucyhrbml0ci5rYWJsZS5OQSA9ICIiKQ0KDQpgJW91dCVgIDwtIE5lZ2F0ZShgJWluJWApDQoNCiMgZnVuY3Rpb24gZm9yIHRyYW5zcG9zaW5nIGRmDQp0cmFuc3Bvc2VfZGYgPC0gZnVuY3Rpb24oZGYpIHsNCiAgdF9kZiA8LSBkYXRhLnRhYmxlOjp0cmFuc3Bvc2UoZGYpDQogIGNvbG5hbWVzKHRfZGYpIDwtIHJvd25hbWVzKGRmKQ0KICByb3duYW1lcyh0X2RmKSA8LSBjb2xuYW1lcyhkZikNCiAgdF9kZiA8LSB0X2RmICU+JQ0KICAgIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKC5kYXRhID0gLikgJT4lDQogICAgdGliYmxlOjphc190aWJibGUoLikNCiAgcmV0dXJuKHRfZGYpDQp9DQoNCiMgZnVuY3Rpb24gYmVuZWZpY2lhcnkgc3VtbWFyaWVzDQpzdW1fYmVuIDwtIGZ1bmN0aW9uKGRmLCBjb2x1bW5fdmFyKXsNCiAgDQogIGNvbHVtbl92YXIgPC0gZW5xdW8oY29sdW1uX3ZhcikNCiAgDQogIGRmICU+JQ0KICAgIGdyb3VwX2J5KCEhY29sdW1uX3ZhcikgJT4lICMgbXVzdCBhZGQgYmFuZy1iYW5nDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSANCiAgICANCn0NCg0KIyBmdW5jdGlvbiBiZW5lZmljaWFyeSBzdW1tYXJpZXMsIDIgZ3JvdXBlZCB2YXJpYWJsZXMNCnN1bV9iZW4yIDwtIGZ1bmN0aW9uKGRmLCBjb2x1bW5fdmFyMSwgY29sdW1uX3ZhcjIpew0KICANCiAgY29sdW1uX3ZhcjEgPC0gZW5xdW8oY29sdW1uX3ZhcjEpDQogIGNvbHVtbl92YXIyIDwtIGVucXVvKGNvbHVtbl92YXIyKQ0KICANCiAgZGYgJT4lDQogICAgZ3JvdXBfYnkoISFjb2x1bW5fdmFyMSwgISFjb2x1bW5fdmFyMikgJT4lICMgbXVzdCBhZGQgYmFuZy1iYW5nDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSANCiAgICANCn0NCg0KIyBzY2FsaW5nIGZ1bmN0aW9ucyANCnJhbmdlMDEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSl9DQpyYW5nZV93bmEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgsIG5hLnJtID0gVFJVRSkpLyhtYXgoeCwgbmEucm0gPSBUUlVFKS1taW4oeCwgbmEucm0gPSBUUlVFKSl9DQoNCiNtb2RlIGZ1bmN0aW9uIA0KbW9kZSA8LSBmdW5jdGlvbih4KSB7DQogIHV4IDwtIHVuaXF1ZSh4KQ0KICB1eFt3aGljaC5tYXgodGFidWxhdGUobWF0Y2goeCwgdXgpKSldDQp9DQpgYGANCg0KYGBge3IgZGF0YX0NCg0KZnNjIDwtIHJlYWRfY3N2KCIuL2RhdGEvZnNjLmNzdiIpIA0KDQpmc2NfMjAyMSA8LSByZWFkX2NzdigiLi9kYXRhL2ZzY18yMDIxLmNzdiIpDQoNCnBpbiA8LSByZWFkX2NzdigiLi9kYXRhL2ZzX3Bpbi5jc3YiKQ0KDQpoZF9saXN0IDwtIGZzYyAlPiUgDQogIGdyb3VwX2J5KGh1bWFuaXRhcmlhbl9vcl9kZXZlbG9wbWVudCwgYWN0aXZpdHlfcmVkKSAlPiUNCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShoZCA9IGlmZWxzZShodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQgPT0gIkh1bWFuaXRhcmlhbiIgfA0KICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAiSHVtYW5pdGFyaWFuIiwgDQogICAgICAgICAgICAgICAgICAgICAiRGV2ZWxvcG1lbnQiKSkgJT4lIA0KICBtdXRhdGUoaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID0gDQogICAgICAgICAgIGlmZWxzZShhY3Rpdml0eV9yZWQgPT0gIm11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlciIgJg0KICAgICAgICAgICAgICAgICAgICBodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQgPT0gIkRldmVsb3BtZW50IiwNCiAgICAgICAgICAgICAgICAgICJIdW1hbml0YXJpYW4iLCBodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQpDQogICAgICAgICApICU+JQ0KICBncm91cF9ieShoZCkgJT4lIA0KICBzdW1tYXJpc2VfYXQoImJlbmVmaWNpYXJpZXMiLCBzdW0pICU+JQ0KICBtdXRhdGUocGMgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkNCg0KIyBzaGFwZWZpbGVzDQpwY29kZTNfc2hhcGUgPC0gc3RfcmVhZCgiLi9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JQ0KICByZW5hbWUoc3RhdGUgPSBTVCwgDQogICAgICAgIGFkbWluMV9wY29kZSA9IFNUX1BDT0RFLA0KICAgICAgICB0b3duc2hpcCA9IFRTLA0KICAgICAgICBhZG1pbjNfcGNvZGUgPSBUU19QQ09ERSkgJT4lIA0KIG11dGF0ZShhZG1pbjNfcGNvZGUgPSBpZmVsc2Uoc3RyX2RldGVjdCh0b3duc2hpcCwgIkhsYWluZ3RoYXJ5YSIpLCAiTU1SMDEzMDA4IiwgYWRtaW4zX3Bjb2RlKSkNCg0KcGNvZGUxX3NoYXBlIDwtIHN0X3JlYWQoIi4vbW1yX3BvbGJuZGEyX2FkbTFfbWltdV8yNTBrL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JSANCiByZW5hbWUoc3RhdGUgPSBTVCwgDQogICAgICAgIGFkbWluMV9wY29kZSA9IFNUX1BDT0RFKSAlPiUgc3RfYXNfc2YoKQ0KDQpgYGANCg0KDQpbRm9vZCBTZWN1cml0eSBDbHVzdGVyIE15YW5tYXIgaG9tZXBhZ2VdKGh0dHBzOi8vZm9vZC1zZWN1cml0eS1jbHVzdGVyLW15YW5tYXIuZ2l0aHViLmlvLykNCg0KPGJyPg0KDQoNCg0KIyMgU3VtbWFyeSBvZiBhY2hpZXZlbWVudHMgDQoNCmBgYHtyIG92ZXJhbGwtcGMsIGV2YWw9RkFMU0V9DQpmaWx0ZXIoZnNjLCBodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQgPT0gIkh1bWFuaXRhcmlhbiIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSAvIHN1bShwaW4kZnNfdGFyZ2V0ZWQpDQpgYGANCg0KQmVuZWZpY2lhcmllcyBvZiBodW1hbml0YXJpYW4gYWN0aW9uIGZvcm1lZCBgciByb3VuZChmaWx0ZXIoZnNjLCBodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQgPT0gIkh1bWFuaXRhcmlhbiIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9IC8gc3VtKGZzYyRuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSAqIDEwMCwgZGlnaXRzID0gMilgJSBvZiB0aGUgYHIgc3VtKGZzYyRuZXdfYmVuZWZpY2lhcmllcykgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGJlbmVmaWNpYXJpZXMgaW4gdGhlIGZpcnN0IHF1YXJ0ZXIgb2YgMjAyMi4gVGhlIHJlbWFpbmRlciB3ZXJlIHJlYWNoZWQgdGhyb3VnaCBkZXZlbG9wbWVudCBpbnRlcnZlbnRpb25zLg0KDQpJbiB0aGlzIHJlcG9ydCwgd2hlbiBiZW5lZmljaWFyaWVzIGFyZSBtZW50aW9uZWQsIHRoZSBGb29kIFNlY3VyaXR5IENsdXN0ZXIgaXMgcmVmZXJyaW5nIHRvIHVuaXF1ZSBiZW5lZmljaWFyaWVzIG9yIGluZGl2aWR1YWxzLiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIGEgYmVuZWZpY2lhcnkgZnJlcXVlbmN5IHdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIGEgcGVyc29uIHJlY2VpdmluZyBhaWQgaS5lLiBhIHBlcnNvbiB3aG8gcmVjZWl2ZXMgZm9vZCBkaXN0cmlidXRpb25zLCBhIGNyb3AsIHZlZ2V0YWJsZSBhbmQgc2VlZCBraXQgYW5kIGZhcm1lciB0cmFpbmluZyB3b3VsZCBiZSBjb3VudGVkIGFzIHRocmVlIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzLCBidXQgYXMgb25seSBvbmUgYmVuZWZpY2lhcnkuIA0KDQpUbyByZWNhbGwsIHRoZSBGb29kIFNlY3VyaXR5IENsdXN0ZXIncyBzdHJhdGVnaWMgb2JqZWN0aXZlcyBmb3IgMjAyMiBhcmU6DQoNCi0gICBTTzE6IDU1NiwwMDAgSURQcyBoYXZlIGVxdWl0YWJsZSBhY2Nlc3MgdG8gc3VmZmljaWVudCwgc2FmZSBhbmQgbnV0cml0aW91cyBmb29kIChlaXRoZXIgaW4ta2luZCBvciB0aHJvdWdoIGZvb2QgYXNzaXN0YW5jZSkuDQotICAgU08yOiAyLjkgbWlsbGlvbiB2dWxuZXJhYmxlIHBlcnNvbnMgKGV4Y2wuIElEUHMpIGhhdmUgZXF1aXRhYmxlIGFjY2VzcyB0byBzdWZmaWNpZW50LCBzYWZlIGFuZCBudXRyaXRpb3VzIGZvb2QgKGVpdGhlciBpbi1raW5kIG9yIHRocm91Z2ggZm9vZCBhc3Npc3RhbmNlKS4NCi0gICBTTzM6IFJlc3RvcmUsIHByb3RlY3QgYW5kIGltcHJvdmUgbGl2ZWxpaG9vZHMgYW5kIHJlc2lsaWVuY2UgZm9yIDg1MCwwMDAgcGVyc29ucy4NCg0KT3ZlcmFsbCwgYHIgaGRfbGlzdCAlPiUgZmlsdGVyKGhkID09ICJIdW1hbml0YXJpYW4iKSAlPiUgcHVsbChwYylgJSBvZiB0aGUgZm9vZCBzZWN1cml0eSBjbHVzdGVyJ3MgYmVuZWZpY2lhcmllcyB3ZXJlIGZyb20gaHVtYW5pdGFyaWFuIGFjdGl2aXRpZXMuDQoNCjxicj4NCg0KYGBge3IgdGFibGUtc28taHVtYW5pdGFyaWFufQ0KZnNjICU+JSAgDQogIG11dGF0ZShzbyA9IA0KICAgICAgICAgICBpZmVsc2UoYWN0aXZpdHlfcmVkID09ICJtdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXIiICYNCiAgICAgICAgICAgICAgICAgICAgaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID09ICJEZXZlbG9wbWVudCIsDQogICAgICAgICAgICAgICAgICAiU08zIiwgc28pLA0KICAgICAgICAgaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID0gDQogICAgICAgICAgIGlmZWxzZShhY3Rpdml0eV9yZWQgPT0gIm11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlciIgJg0KICAgICAgICAgICAgICAgICAgICBodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQgPT0gIkRldmVsb3BtZW50IiwNCiAgICAgICAgICAgICAgICAgICJIdW1hbml0YXJpYW4iLCBodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQpDQogICAgICAgICApICU+JQ0KICBmaWx0ZXIoaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID09ICJIdW1hbml0YXJpYW4iIHwgYWN0aXZpdHlfcmVkID09ICJmb29kIGRpc3RyaWJ1dGlvbiIpICU+JSANCiAgZ3JvdXBfYnkoc28sIHF1YXJ0ZXIpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBxdWFydGVyLCANCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUNCiAgbXV0YXRlKHRvdGFsID0gcTEgKyBxMikgJT4lIA0KICByZW5hbWVfYWxsKC5mdW5zID0gbGlzdChzdHJfdG9fdGl0bGUpKSAlPiUgDQogIHJlbmFtZShTTyA9IFNvKSAlPiUgIA0KICBtdXRhdGUodG90YWxfcGMgPSBUb3RhbCAvIHN1bShUb3RhbCkpICU+JSANCiAgbXV0YXRlX2F0KHZhcnModG90YWxfcGMpLCB+IHJvdW5kKC54ICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBzZWxlY3QoU08sIFExLCBRMiwgDQogICAgICAgICBUb3RhbF9KdW4yMiA9IFRvdGFsLA0KICAgICAgICAgYCVfb2ZfdG90YWxgID0gdG90YWxfcGMpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUgIA0KICBtdXRhdGUoYCVfaW5jcmVhc2VgID0gcm91bmQoKFRvdGFsX0p1bjIyIC0gUTEpIC9RMSAqIDEwMCwgZGlnaXRzID0gMikpICU+JQ0KICBrYWJsZShjYXB0aW9uID0gIjIwMjIgaHVtYW5pdGFyaWFuIGJlbmVmaWNpYXJpZXMiLCANCiAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSwgDQogICAgICAgIGZvcm1hdCA9ICJodG1sIiwgDQogICAgICAgIHRhYmxlLmF0dHIgPSAic3R5bGU9J3dpZHRoOjYwJTsnIikgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKQ0KDQpgYGANCg0KPGJyPg0KDQpBIHRvdGFsIG9mIGByIGhkX2xpc3QgJT4lIGZpbHRlcihoZCA9PSAiRGV2ZWxvcG1lbnQiKSAlPiUgcHVsbChwYylgJSBiZW5lZmljaWFyaWVzIHdlcmUgZnJvbSBkZXZlbG9wbWVudCBhY3Rpdml0aWVzIGFuZCBhY3RvcnMuDQoNCjxicj4NCg0KDQpgYGB7ciB0YWJsZS1zby1kZXZlbG9wbWVudH0NCg0KZnNjICU+JSAgDQogIG11dGF0ZShzbyA9IA0KICAgICAgICAgICBpZmVsc2UoYWN0aXZpdHlfcmVkID09ICJtdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXIiICYNCiAgICAgICAgICAgICAgICAgICAgaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID09ICJEZXZlbG9wbWVudCIsDQogICAgICAgICAgICAgICAgICAiU08zIiwgc28pLA0KICAgICAgICAgaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID0gDQogICAgICAgICAgIGlmZWxzZShhY3Rpdml0eV9yZWQgPT0gIm11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlciIgJg0KICAgICAgICAgICAgICAgICAgICBodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQgPT0gIkRldmVsb3BtZW50IiwNCiAgICAgICAgICAgICAgICAgICJIdW1hbml0YXJpYW4iLCBodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQpDQogICAgICAgICApICU+JSANCiAgZmlsdGVyKGh1bWFuaXRhcmlhbl9vcl9kZXZlbG9wbWVudCA9PSAiRGV2ZWxvcG1lbnQiICYgYWN0aXZpdHlfcmVkICE9ICJmb29kIGRpc3RyaWJ1dGlvbiIpICU+JSANCiAgZ3JvdXBfYnkoc28sIHF1YXJ0ZXIpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBxdWFydGVyLCANCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUNCiAgbXV0YXRlKHRvdGFsID0gcTEgKyBxMikgJT4lIA0KICByZW5hbWVfYWxsKC5mdW5zID0gbGlzdChzdHJfdG9fdGl0bGUpKSAlPiUgDQogIHJlbmFtZShTTyA9IFNvKSAlPiUgIA0KICBtdXRhdGUodG90YWxfcGMgPSBUb3RhbCAvIHN1bShUb3RhbCkpICU+JSANCiAgbXV0YXRlX2F0KHZhcnModG90YWxfcGMpLCB+IHJvdW5kKC54ICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBzZWxlY3QoU08sIFExLCBRMiwgDQogICAgICAgICBUb3RhbF9KdW4yMiA9IFRvdGFsLA0KICAgICAgICAgYCVfb2ZfdG90YWxgID0gdG90YWxfcGMpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUgDQogIG11dGF0ZShgJV9pbmNyZWFzZWAgPSByb3VuZCgoVG90YWxfSnVuMjIgLSBRMSkgL1ExICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lDQogIGthYmxlKGNhcHRpb24gPSAiMjAyMiBkZXZlbG9wbWVudCBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIiksIA0KICAgICAgICBmb3JtYXQgPSAiaHRtbCIsIA0KICAgICAgICB0YWJsZS5hdHRyID0gInN0eWxlPSd3aWR0aDo2MCU7JyIpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikNCg0KYGBgDQoNCjxicj4NCg0KUGVydGFpbmluZyB0byB0aGUgaHVtYW5pdGFyaWFuIHJlc3BvbnNlIHVuZGVyIHRoZSBIUlAsIHRoZSBpbmNyZWFzZSBiZXR3ZWVuIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiBTTzEgYW5kIFNPMyB3ZXJlIDE3NyUgYW5kIDE0MCUgcmVzcGVjdGl2ZWx5LiBUaGlzIGlzIGluIGNvbXBhcmlzb24gd2l0aCBTTzIsIHdoaWNoIHNhdyBhbiBpbmNyZWFzZSBvZiBvbmx5IDM4JSBmcm9tIFExLiBUaGlzIGRlbW9uc3RyYXRlcyB0aGF0OiANCg0KKiBUaGUgZm9vZCBzZWN1cml0eSByZXNwb25zZSB0byBub24tSURQIHZ1bG5lcmFibGUgZ3JvdXBzIChTTzIpIGlzIGEgd2VsbC1lc3RhYmxpc2hlZCBhY3Rpdml0eSB3aGljaCBpcyBsYXJnZWx5IHJlcGVhdGluZyB0aGUgc2FtZSBwYXR0ZXJuIHRoYXQgaXQgZGlkIGluIDIwMjEuIFRoZSBsaW1pdGVkIG51bWJlciBvZiBuZXcgYmVuZWZpY2lhcmllcyBoaWdobGlnaHRzIHRoYXQgdGhpcyBpcyBhIHJvdXRpbmUgYWN0aXZpdHkgbWFpbmx5IHByb3ZpZGluZyBhZGRpdGlvbiByb3VuZHMgb2YgZm9vZCBhc3Npc3RhbmNlIHRvIHBlcnNvbnMgYWxyZWFkeSBzZXJ2ZWQgaW4gUTEuIA0KDQoqIFRoZSB2ZXJ5IHNpZ25pZmljYW50IHByb2dyZXNzIGluIHRoZSBudW1iZXIgb2YgSURQcyByZWFjaGVkIGJ5IGZvb2QgYXNzaXN0YW5jZSAoU08xKSBpcyBsYXJnZWx5IHRvIGR1ZSB0byBGU0MgcGFydG5lcnMgcmVhY2hpbmcgbWFueSBtb3JlIElEUHMgaW4gUmFraGluZSBTdGF0ZS4gDQoNCiogUmVnYXJkaW5nIFNPMyBhbmQgZGV2ZWxvcG1lbnQgYWN0aXZpdGllcyAoYWNoaWV2ZW1lbnRzIGhhdmUgYmVlbiB0cmFuc2ZlcnJlZCB0byBVTkRQIGZvciByZXBvcnRpbmcgdW5kZXIgdGhlIFNFUlJQKSwgMjEuMyUgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMgaGF2ZSBiZWVuIGluIHBsYWNlIHNpbmNlIFExLiBUaGUgbGltaXRlZCBmaW5hbmNpYWwgc3VwcG9ydCBmcm9tIGRldmVsb3BtZW50IGRvbm9ycyBpcyBtYWpvciBjb25zdHJhaW50IHRvIGRldmVsb3BpbmcgbmV3IHByb2plY3RzIGFuZCByZWFjaGluZyBuZXcgYmVuZWZpY2lhcmllcy4gDQoNCjxicj4NCg0KDQpgYGB7ciBhY3Rpdml0eS1saXN0fQ0KYWN0aXZpdHlfbGlzdCA8LSBmc2MgJT4lIA0KICBzdW1fYmVuMihxdWFydGVyLCBhY3Rpdml0eV9yZWQpICU+JSANCiAgZ3JvdXBfYnkocXVhcnRlcikgJT4lIA0KICBtdXRhdGUocGMgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkNCmBgYA0KDQoNCjxicj4NCg0KYGBge3IgdGFibGUtYWN0aXZpdHl9DQpmc2MgJT4lIA0KICBncm91cF9ieShxdWFydGVyLCBhY3Rpdml0eV9yZWQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgIA0KICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMsIG5hbWVzX2Zyb20gPSBxdWFydGVyLCB2YWx1ZXNfZmlsbCA9IDApICU+JSANCiAgbXV0YXRlKGAlX2NoYW5nZWAgPSByb3VuZCgocTIgLSBxMSkgLyBxMSAqIDEwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgYCVfY2hhbmdlYCA9IGlmZWxzZShpcy5pbmZpbml0ZShgJV9jaGFuZ2VgKSwgMTAwLCBgJV9jaGFuZ2VgKSwgDQogICAgICAgICBhY3Rpdml0eV9yZWQgPSBpZmVsc2UoYWN0aXZpdHlfcmVkICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJGRlMgYW5kIGZhcm1lciB0cmFpbmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJR0EgYW5kIHNtYWxsIGdyYW50cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSEVCIGFuZCBmb3J0aWZpZWQgcmljZSBmb3IgYWN1dGUgZW1lcmdlbmNpZXMiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfcmVkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl90b19zZW50ZW5jZShhY3Rpdml0eV9yZWQpKSkgJT4lIA0KICByZW5hbWUoUTEgPSBxMSwgUTIgPSBxMiwgDQogICAgICAgICBBY3Rpdml0eSA9IGFjdGl2aXR5X3JlZCkgJT4lDQogIG11dGF0ZShUb3RhbCA9IFExICsgUTIsIA0KICAgICAgICAgYCV0b3RhbGAgPSByb3VuZChUb3RhbCAvIHN1bShUb3RhbCkgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhUb3RhbCkpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJCZW5lZmljaWFyaWVzIGJ5IGFjdGl2aXR5LCBhcyAgb2YgMzAgSnVuZSAyMDIyIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKQ0KDQoNCmBgYA0KDQo8YnI+DQoNCmBgYHtyIGJlbi10eXBlLWxpc3R9DQpiZW5fdHlwZV9saXN0IDwtIGZzYyAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoYWN0aXZpdHksICJmb29kIGRpc3RyaWJ1dGlvbiIpKSAlPiUgDQogIGdyb3VwX2J5KGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwYyA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKQ0KYGBgDQoNCkZvb2QgZGlzdHJpYnV0aW9ucyBvdmVyd2hlbG1pbmdseSB0YXJnZXQgcGVyc29ucyBpbiBob3N0IGFuZCBsb2NhbCBjb21tdW5pdGllcywgdGhpcyBncm91cCBmb3JtcyBgciBiZW5fdHlwZV9saXN0ICU+JSBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSA9PSAiSG9zdC9sb2NhbCBDb21tdW5pdHkiKSAlPiUgcHVsbChwYylgJSBvZiBhbGwgYmVuZWZpY2lhcmllcyBvZiBmb29kIGRpc3RyaWJ1dGlvbnMgb3IgYHIgYmVuX3R5cGVfbGlzdCAlPiUgZmlsdGVyKGJlbmVmaWNpYXJ5X3R5cGUgPT0gIkhvc3QvbG9jYWwgQ29tbXVuaXR5IikgJT4lIHB1bGwoYmVuZWZpY2lhcmllcykgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMuIEhvd2V2ZXIsIGFzIHdpbGwgYmUgc2VlbiBpbiBzZWN0aW9uIDUsIHRoZSBmb29kIGluc2VjdXJpdHkgc3RhdHVzIG9mIGJlbmVmaWNpYXJpZXMgaXMgb2Z0ZW4gcmVwb3J0ZWQgaW5jb3JyZWN0bHkuIA0KDQo8YnI+DQoNCmBgYHtyIGZvb2QtZGlzdHJpYnV0aW9ucy1mcy1zdGF0dXN9DQoNCmZzYyAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGFjdGl2aXR5LCAiZm9vZCBkaXN0cmlidXRpb24iKSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eSwgYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBtdXRhdGUoYWN0aXZpdHkgPSBzdHJfZXh0cmFjdChhY3Rpdml0eSwgIlxcLCBcXHcrJCIpLCANCiAgICAgICAgIGFjdGl2aXR5ID0gc3RyX3RvX3RpdGxlKHN0cl9yZXBsYWNlKGFjdGl2aXR5LCAiLCAiLCAiIikpKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gYWN0aXZpdHksIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcywgdmFsdWVzX2ZpbGwgPSAwKSAlPiUgDQogIGFkb3JuX3RvdGFscyhjKCJyb3ciLCAiY29sIikpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJGb29kIGRpc3RyaWJ1dGlvbnMgYnkgdHlwZSBmb29kIGluc2VjdXJpdHkgc3RhdHVzIGFuZCBiZW5lZmljaWFyeSB0eXBlIiwgDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikNCg0KYGBgDQoNCjxicj4NCg0KNDUlIG9mIGJlbmVmaWNpYXJpZXMgd2VyZSByZWFjaGVkIGJ5IGFjdGl2aXRpZXMgd2hlcmUgbnV0cml0aW9uIGhhZCBiZWVuIG1haW5zdHJlYW1lZC4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1udXRyaXRpb24tbWFpbnN0cmVhbWluZ30NCmZzYyAlPiUgDQogIG11dGF0ZShzbyA9IHN0cl90b191cHBlcihzbykpICU+JSANCiAgbXV0YXRlKHdhc19udXRyaXRpb25fbWFpbnN0cmVhbWVkX2luX2FjdGl2aXR5ID0gaWZlbHNlKGlzLm5hKHdhc19udXRyaXRpb25fbWFpbnN0cmVhbWVkX2luX2FjdGl2aXR5KSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8iLCB3YXNfbnV0cml0aW9uX21haW5zdHJlYW1lZF9pbl9hY3Rpdml0eSksIA0KICAgICAgICAgd2FzX251dHJpdGlvbl9tYWluc3RyZWFtZWRfaW5fYWN0aXZpdHkgPSBmY3RfcmVsZXZlbCh3YXNfbnV0cml0aW9uX21haW5zdHJlYW1lZF9pbl9hY3Rpdml0eSwgbGV2ZWxzID0gYygiWWVzIiwgIk5vIikpKSAlPiUgDQogIHN1bV9iZW4yKHNvLCB3YXNfbnV0cml0aW9uX21haW5zdHJlYW1lZF9pbl9hY3Rpdml0eSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gc28sIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICBtdXRhdGUodG90YWxfYmVuZWZpY2lhcmllcyA9IFNPMSArIFNPMiArIFNPMywgDQogICAgICAgICBgJV9iZW5lZmljaWFyaWVzYCA9IHJvdW5kKHRvdGFsX2JlbmVmaWNpYXJpZXMgLyBzdW0odG90YWxfYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiQmVuZWZpY2lhcmllcyBieSBzdGF0dXMgb2YgbnV0cml0aW9uIG1haW5zdHJlYW1pbmciLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpDQogIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAxLiBHZW9ncmFwaGllcw0KDQpBIHRvdGFsIG9mIGByIGZvcm1hdChzdW0oZnNjJG5ld19iZW5lZmljaWFyaWVzKSwgYmlnLm1hcmsgPSAiLCIpYCBiZW5lZmljaWFyaWVzIHdlcmUgcmVhY2hlZCBpbiB0aGUgZmlyc3QgaGFsZiBvZiAyMDIyLiBUaGUgcGxvdCBiZWxvdyBzaG93cyBjdW11bGF0aXZlIGJlbmVmaWNpYXJpZXMgb3ZlciB0aW1lLiANCg0KPGJyPg0KDQoNCmBgYHtyIGN1bS1iZW4tYXJlYSwgZmlnLmhlaWdodCA9IDZ9DQoNCmZzYyAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBmY3RfcmVvcmRlcihzdGF0ZSwgYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgIHggPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICBmaWxsID0gc3RhdGUpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSksIA0KICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQogIGxhYnMoZmlsbCA9ICIiLCANCiAgICAgICB4ID0gIkJlbmVmaWNpYXJpZXMiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCBieSBzdGF0ZSwgYXMgb2YgUTIgMjAyMiIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCiAgDQpgYGANCjxicj48YnI+DQoNCiMjIyAxLjEgU3RhdGVzDQoNCmBgYHtyIHN0YXRlLWxpc3R9DQpzdGF0ZV9saXN0IDwtIGZzYyAlPiUgDQogIHN1bV9iZW4yKHN0YXRlLCBxdWFydGVyKSAlPiUgDQogIGdyb3VwX2J5KHF1YXJ0ZXIpICU+JSANCiAgbXV0YXRlKHBjID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpDQoNCmBgYA0KDQpUaG91Z2ggbmV3IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCByZW1haW5lZCBiaWFzZWQgdG93YXJkcyBZYW5nb24gYW5kIFJha2hpbmUgaW4gUTIsIGZpZ3VyZXMgd2VyZSBsZXNzIHNrZXdlZCB0aGFuIHRoZXkgd2VyZSBpbiBRMS4gT3ZlcmFsbCBgciBzdGF0ZV9saXN0ICU+JSBmaWx0ZXIocXVhcnRlciA9PSAicTIiICYgc3RhdGUgJWluJSBjKCJZYW5nb24iLCAiUmFraGluZSIpKSAlPiUgc3VtbWFyaXNlX2F0KCJwYyIsIHN1bSkgJT4lIHB1bGwocGMpYCUgb2YgYmVuZWZpY2lhcmllcyBpbiBRMiBjYW1lIGZyb20gWWFuZ29uIG9yIFJha2hpbmUsIHdoZXJlYXMgaXQgd2FzIGByIHN0YXRlX2xpc3QgJT4lIGZpbHRlcihxdWFydGVyID09ICJxMSIgJiBzdGF0ZSAlaW4lIGMoIllhbmdvbiIsICJSYWtoaW5lIikpICU+JSBzdW1tYXJpc2VfYXQoInBjIiwgc3VtKSAlPiUgcHVsbChwYylgJSBpbiBRMS4gS2F5YWggc2F3IHRoZSBsYXJnZXN0IHF1YXJ0ZXItdG8tcXVhcnRlciBpbmNyZWFzZSBpbiBudW1iZXIgb2YgcGVyc29ucyByZWFjaGVkLg0KDQo8YnI+DQoNCmBgYHtyIGZhY2V0LXN0YXRlLXF1YXJ0ZXIsIGZpZy5oZWlnaHQgPSA2LjV9DQpxMV9hZG1pbjMgPC0gZnNjICU+JSANCiAgZmlsdGVyKHF1YXJ0ZXIgPT0gInExIikgJT4lIA0KICBkaXN0aW5jdChhZG1pbjNfcGNvZGUpICU+JSANCiAgYXMubGlzdCgpDQoNCg0KZnNjICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUsIHF1YXJ0ZXIpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShxdWFydGVyID0gcmVjb2RlKHF1YXJ0ZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAicTEiID0gIlF1YXJ0ZXJfMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAicTIiID0gIlF1YXJ0ZXJfMiIpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSBmY3RfcmVvcmRlcihzdGF0ZSwgYmVuZWZpY2lhcmllcykpKSArIA0KICBnZW9tX2NvbChhZXMoZmlsbCA9IHN0YXRlKSkgKyANCiAgZmFjZXRfcm93KHZhcnMocXVhcnRlciksIHNjYWxlcyA9ICJmcmVlX3giLCBzcGFjZSA9ICJmcmVlIikgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IG51bWJlcl9mb3JtYXQoc2NhbGUgPSAxIC8gMTAwMCwgc3VmZml4ID0gIksiKSkgKyANCiAgZ3VpZGVzKGZpbGwgPSAibm9uZSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpKSwgaGp1c3QgPSAiaW53YXJkIiwgc2l6ZSA9IDMuNSkgKyANCiAgbGFicyh4ID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCBieSBxdWFydGVyIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIikpDQogIA0KDQpgYGANCg0KPGJyPg0KDQpBIHRvdGFsIG9mIGByIGRpc3RpbmN0KGZzYywgYWRtaW4zX3Bjb2RlKSAlPiUgbnJvdygpYCB0b3duc2hpcHMgaGF2ZSBiZWVuIHJlYWNoZWQgYWNyb3NzIGByIGRpc3RpbmN0KGZzYywgYWRtaW4xX3Bjb2RlKSAlPiUgbnJvdygpYCBzdGF0ZXMvcmVnaW9ucyBhcyBvZiAzMHRoIEp1bmUgMjAyMi4NCg0KPGJyPjxicj4NCg0KIyMjIDEuMiBUb3duc2hpcHMNCg0KYGBge3IgdG9wLXRvd25zaGlwcy1wYywgaW5jbHVkZT1GQUxTRX0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KHN0YXRlLCB0b3duc2hpcCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbXV0YXRlKHBjID0gYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocGMpKSAlPiUgDQogIGZpbHRlcihiZW5lZmljaWFyaWVzID4gMTUwMDAwKSAlPiUgDQogIHtzdW0oLiRwYyl9DQpgYGANCg0KVGhlIHRvcCA3IHRvd25zaGlwcyAtLSBIbGFpbmd0aGFyeWEgRWFzdCBhbmQgV2VzdCwgU2h3ZXB5aXRoYXIsIE5vcnRoIE9ra2FsYXBhLCBCdXRoaWRhdW5nLCBEYWxhIGFuZCBTaXR0d2UgLS0gYnkgdG90YWwgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBhcyBvZiAzMHRoIEp1bmUgMjAyMiwgYXJlIGFsbCBmcm9tIFlhbmdvbiBvciBSYWtoaW5lIGFuZCBjb250YWluZWQgNjglIG9mIGFsbCBiZW5lZmljaWFyaWVzLiBUaGVyZSBpcywgb3ZlcmFsbCwgc3RpbGwgcXVpdGUgYSBzaWduaWZpY2FudCBza2V3IGluIHdoZXJlIHRoZSBmb29kIHNlY3VyaXR5IGNsdXN0ZXIgaXMgcmVhY2hpbmcgaXRzIGJlbmVmaWNpYXJpZXMuIA0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLXRvcC10b3duc2hpcHN9DQpmc2MgJT4lIA0KICBncm91cF9ieShzdGF0ZSwgdG93bnNoaXAsIHF1YXJ0ZXIpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIHBpdm90X3dpZGVyKHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcywgbmFtZXNfZnJvbSA9IHF1YXJ0ZXIsIA0KICAgICAgICAgICAgICB2YWx1ZXNfZmlsbCA9IDApICU+JSANCiAgbXV0YXRlKHRvdGFsID0gcTEgKyBxMiwgDQogICAgICAgICBwY190b3RhbCA9IHRvdGFsIC8gc3VtKHRvdGFsKSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhtYXRjaGVzKCJwYyIpKSwgfiByb3VuZCgueCAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKHBjX3RvdGFsKSkgJT4lIA0KICBmaWx0ZXIocGNfdG90YWwgPj0gMSkgJT4lIA0KICBzZWxlY3Qoc3RhdGUsIHRvd25zaGlwLCBRMSA9IHExLCBRMiA9IHEyLCANCiAgICAgICAgIFRvdGFsX0p1bl8yMDIyID0gdG90YWwsIGAldG90YWxgID0gcGNfdG90YWwpICU+JQ0KICBrYWJsZShjYXB0aW9uID0gIlRvcCB0b3duc2hpcHMgYnkgYmVuZWZpY2lhcmllcyByZWFjaGVkIiwgDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikgJT4lIA0KICBmb290bm90ZSgiT25seSBzaG93aW5nIHRvd25zaGlwcyB3aXRoID4xJSBvZiB0b3RhbCBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCmBgYA0KDQo8YnI+DQoNCldoZW4gY29tcGFyaW5nIHRoZSBjdXJyZW50IGZvb3RwcmludCB0byB0aGF0IG9mIHRoZSBmaXJzdCBxdWFydGVyLCB0aGUgbW9zdCBzaWduaWZpY2FudCBuZXcgYWN0aXZpdHkgd2FzIG9ic2VydmVkIGluIE1hbmRhbGF5LCBNYWd3YXksIEtheWFoIGFuZCBLYXlpbi4gDQoNCg0KPGJyPg0KDQpgYGB7ciBtYXBzLWJlbi1xdWFydGVyLCBmaWcuaGVpZ2h0PTl9DQpmc2MgJT4lIA0KICBmaWx0ZXIocXVhcnRlciA9PSAicTEiKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9IGMoImFkbWluM19wY29kZV9vbGQiID0gImFkbWluM19wY29kZSIpKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gYmVuZWZpY2lhcmllcyksIHNpemUgPSAuMSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEsIHRyYW5zID0gImxvZzEwIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgNTAwMDAwKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5OTAiKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCANCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCguNywgImNtIiksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJ3aGl0ZSIpKSArIA0KICBsYWJzKHRpdGxlID0gIkJlbmVmaWNpYXJpZXMgYnkgdG93bnNoaXAsIGFzIG9mIDIwMjItMDMtMzEiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUb3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICsgDQogIA0KZnNjICU+JSANCiAgIyBmaWx0ZXIocXVhcnRlciA9PSAicTIiKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9IGMoImFkbWluM19wY29kZV9vbGQiID0gImFkbWluM19wY29kZSIpKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gYmVuZWZpY2lhcmllcyksIHNpemUgPSAuMSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEsIHRyYW5zID0gImxvZzEwIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgNTAwMDAwKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5OTAiKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCANCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCguNywgImNtIiksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJ3aGl0ZSIpKSArIA0KICBsYWJzKHRpdGxlID0gIkJlbmVmaWNpYXJpZXMgYnkgdG93bnNoaXAsIGFzIG9mIDIwMjItMDYtMzAiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUb3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICANCg0KIyBnZ3NhdmUoIi4vbWFwc19xMV9xMi5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDksIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KICANCmBgYA0KDQo8YnI+DQoNCmBgYHtyIGV2YWwgPSBGQUxTRX0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KHN0YXRlLCB0b3duc2hpcCwgcXVhcnRlcikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgcGl2b3Rfd2lkZXIodmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzLCBuYW1lc19mcm9tID0gcXVhcnRlciwgDQogICAgICAgICAgICAgIHZhbHVlc19maWxsID0gMCkgJT4lIA0KICBmaWx0ZXIocTEgPT0gMCAmIHEyID4gMCkgJT4lIA0KICBjb3VudChzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UobiA9IHN1bShuKSkNCmBgYA0KDQoNCjMxIG5ldyB0b3duc2hpcHMgd2VyZSBhZGRlZCBpbiB0aGUgc2Vjb25kIHF1YXJ0ZXIgb2YgMjAyMi4gNiBvZiB0aGUgbmV3IHRvd25zaGlwcyB3ZXJlIGZyb20gU2hhbiwgNSB3ZXJlIGZyb20gQXlleWFyd2FkeTsgTWFnd2F5LCBNYW5kYWxheSBhbmQgVGFuaW50aGFyeWkgZWFjaCBhZGRlZCAzOyBLYXlhaCwgTW9uLCBSYWtoaW5lIGFuZCBTYWdhaW5nIGVhY2ggYWRkZWQgMjsgYW5kIEJhZ28sIENoaW4gYW5kIEtheWluIGFkZGVkIDEuICANCg0KPGJyPjxicj4NCg0KIyMjIDEuMyBMb2NhdGlvbnMNCg0KQSBsb2NhdGlvbiByZWZlcnMgdG8gZWl0aGVyIGEgdmlsbGFnZSwgd2FyZCwgSURQIHNpdGUgb3IgaW5kdXN0cmlhbCB6b25lLg0KDQpUaGUgdmFzdCBhbW91bnQgb2YgcHJvamVjdCBsb2NhdGlvbnMgaGF2ZSBvbmx5IG9uZSBmb29kIHNlY3VyaXR5IGFjdGl2aXR5Lg0KDQpUaGlzIGZpcnN0IHBsb3QgYmVsb3cgaXMgYSBoaXN0b2dyYW0gb2YgaW50ZXJ2ZW50aW9uIGxvY2F0aW9ucywgYnkgdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gZWFjaCBvZiB0aGVtLiBoZSB2YXN0IG1ham9yaXR5IG9mIGxvYXRpb25zIG9ubHkgaGF2ZSBvbiBhY3RpY2l0eSBvY2N1cmluZyBpbiB0aGVtLiBUSGlzIGlzIHNvbWV0aGluZyB0byBiZSBtb25pdG9yZWQgb3ZlciB0aGUgY291cnNlIG9mIHRoZSB5ZWFycywgYXMgaXQgaXMgYXNzdW1lZCB0aGF0IGEgcmFuZ2Ugb2cgYWN0aXZpdGllcyBhcmUgcmVxdWlyZWQgdG8gY29tcHJlaGVuc2l2ZWx5IG1lZXQgdGhlIGZvb2Qgc2VjdXJpdHkgYW5kIGxpdmVsaWhvb2RzIG5lZWRzIG9mIHRhcmdldGVkIGNvbW11bml0aWVzLiBBcyBpdCBjdXJyZW50bHkgc3RhbmRzLCB0aGUgcmVzcG9uc2UgaXMgdmVyeSBicm9hZCwgd2l0aCBsaXR0bGUgZGVwdGguIA0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShsb2NhdGlvbikpICU+JSANCiAgZ3JvdXBfYnkobG9jYXRpb24sIHRvd25zaGlwLCBxdWFydGVyKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGFjdGl2aXR5KSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIG11dGF0ZShhY3Rpdml0aWVzID0gaWZlbHNlKGFjdGl2aXRpZXMgPj0gMywgIj49MyIsIGFjdGl2aXRpZXMpLCANCiAgICAgICAgIGFjdGl2aXRpZXMgPSBmY3RfcmVsZXZlbChhY3Rpdml0aWVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCIxIiwgIjIiLCAiPj0zIikpLA0KICAgICAgICAgYWN0aXZpdGllcyA9IHJlY29kZShhY3Rpdml0aWVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiID0gIjFfYWN0aXZpdHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIiID0gIjJfYWN0aXZpdGllcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0zIiA9ICI+PTNfYWN0aXZpdGllcyIpLCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAuMSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIHRyYW5zID0gImxvZzEwIikgKyANCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXRpZXMpICsgDQogIGxhYnMoeSA9ICJOdW1iZXIgb2YgbG9jYXRpb25zIiwgDQogICAgICAgeCA9ICJCZW5lZmljaWFyeSBmcmVxdWVuY2llcyBieSBsb2NhdGlvbiIsIA0KICAgICAgIHRpdGxlID0gIlByb2plY3QgbG9jYXRpb25zIGFuZCBiZW5lZmljaWFyaWVzLCBmYWNldGVkIGJ5IG51bWJlciBvZiBhY3Rpdml0aWVzIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIikpDQpgYGANCg0KPGJyPg0KDQpUaGUgc2FtZSBpcyB0cnVlIGZvciB0aGUgbnVtYmVyIG9mIHBhcnRuZXJzLCB3aXRoIHRoZSBtYWpvcml0eSBvZiBsb2NhdGlvbnMgaGF2aW5nIG9uZSBwYXJ0bmVyLiANCg0KPGJyPg0KDQpgYGB7ciBoaXN0b2dyYW0tbG9jYXRpb25zLWJ5LXBhcnRuZXIsIGZpZy5oZWlnaHQ9Ny41fQ0KDQpmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGxvY2F0aW9uKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgdG93bnNoaXApICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChvcmdfY29kZSksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBtdXRhdGUocGFydG5lcnMgPSByZWNvZGUocGFydG5lcnMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiID0gIjFfcGFydG5lciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIiID0gIjJfcGFydG5lcnMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIiA9ICIzX3BhcnRuZXJzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiNCIgPSAiNF9wYXJ0bmVycyIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhwYXJ0bmVycykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjEpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hLCB0cmFucyA9ICJsb2cxMCIpICsNCiAgZmFjZXRfd3JhcCh+IHBhcnRuZXJzKSArDQogIGxhYnMoeSA9ICJudW1iZXIgb2YgbG9jYXRpb25zIiwNCiAgICAgICB4ID0gImJlbmVmaWNpYXJpZXMgcGVyIGxvY2F0aW9uIiwgDQogICAgICAgdGl0bGUgPSAiSGlzdG9ncmFtcyBvZiBiZW5lZmljaWFyaWVzIGJ5IGxvY2F0aW9uIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGYWNldGVkIGJ5IG51bWJlciBvZiBwYXJ0bmVycyBwZXIgbG9jYXRpb24iKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIikpDQoNCmBgYA0KDQoNCjxicj4NCg0KT2YgdGhlIDIsMTk3IHNpdGVzIHJlYWNoZWQsIDM1OSBoYWQgbW9yZSB0aGFuIG9uZSBwYXJ0bmVyIHByZXNlbnQuICANCg0KPGJyPg0KDQpgYGB7cn0NCmZzYyAlPiUgDQogIGZpbHRlcighaXMubmEobG9jYXRpb24pKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uLCB0b3duc2hpcCkgJT4lICANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgcGFydG5lcnMgPSBuX2Rpc3RpbmN0KG9yZ19jb2RlKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIG11dGF0ZShwYXJ0bmVycyA9IHJlY29kZShwYXJ0bmVycywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiMSIgPSAiMV9wYXJ0bmVyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiMiIgPSAiMl9wYXJ0bmVycyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMiID0gIjNfcGFydG5lcnMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IiA9ICI0X3BhcnRuZXJzIikpICU+JSANCiAgZ3JvdXBfYnkocGFydG5lcnMpICU+JSANCiAgc3VtbWFyaXNlX2F0KCJsb2NhdGlvbiIsIG5fZGlzdGluY3QpICU+JSAgDQogIGthYmxlKGNhcHRpb24gPSAiTnVtYmVyIG9mIHBhcnRuZXJzIGJ5IGxvY2F0aW9uLCBhcyBvZiAzMCBKdW5lIDIwMjIiLCANCiAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSwgDQogICAgICAgIGZvcm1hdCA9ICJodG1sIiwgDQogICAgICAgIHRhYmxlLmF0dHIgPSAic3R5bGU9J3dpZHRoOjM1JTsnIikgJT4lDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpDQpgYGANCg0KDQo8YnI+DQoNClRoZSBmb29kIHNlY3VyaXR5IGNsdXN0ZXIncyBwYXJ0bmVycyBjYW4gbW9zdGx5IGJlIGZvdW5kIGluIFlhbmdvbiwgUmFraGluZSBhbmQgS2FjaGluLg0KDQo8YnI+DQoNCmBgYHtyIGxvY2F0aW9ucy1wYXJ0bmVycy1zdGF0ZX0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KHN0YXRlLCB0b3duc2hpcCwgbG9jYXRpb25fdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KG9yZ19jb2RlKSkgJT4lDQogIGZpbHRlcihsb2NhdGlvbl90eXBlICE9ICJJbmR1c3RyaWFsIHpvbmUiKSAlPiUgDQogIG11dGF0ZShtZWFuX3BhcnRuZXJzID0gbWVhbihwYXJ0bmVycywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwYXJ0bmVycywgeSA9IGZjdF9yZXYoc3RhdGUpLCBmaWxsID0gbG9jYXRpb25fdHlwZSkpICsNCiAgZ2VvbV9jb2woKSArDQogIGZhY2V0X3dyYXAofiBsb2NhdGlvbl90eXBlKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjRjFDNDBGIiwgIiMxQUJDOUMiLCAiI0VDNzA2MyIpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpKSArIA0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycyIsIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycyBieSBzdGF0ZSBhbmQgbG9jYXRpb24gdHlwZSIpDQogIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAyLiBBY3Rpdml0aWVzDQoNCiMjIyAyLjEgUHJvZ3Jlc3MgYnkgYWN0aXZpdHkNCg0KVGhlIGZpcnN0IGRvdHRlZCByZWQgbGluZSBzaG93cyB0aGUgZW5kIG9mIFExIGFuZCB0aGUgc2Vjb25kIHNob3dzIHRoZSBlbmQgb2YgUTIuIFRoZSB0aGljayBsaW5lIGluIGdyZXkgc2hvd3MgdGhlIHByb2dyZXNzIGluIDIwMjEgZm9yIHRoZSBzYW1lIGFjdGl2aXR5LiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgMjAyMSBwcm9ncmVzcyBsaW5lcyBhcmUganVzdCBhIHJlZmVyZW5jZSBhbmQgbm90IG1lYW50IHRvIGJlIGEgZGlyZWN0IGNvbXBhcmlzb24uIFRoZSBzY29wZSBvZiB0aGUgSFJQIHdhcyBtdWNoIGRpZmZlcmVudCBhdCB0aGUgc3RhcnQgb2YgMjAyMSBhbmQgdGhlIHJlc3BvbnNlIG9ubHkgYmVjYW1lIG5hdGlvbndpZGUgaW4gSnVuZTsgdGhlIEZTQyB3YXMgYWxzbyBtdWNoIHNtYWxsZXIgdGhhbiBpdCBpcyBub3cgaW4gMjAyMi4gSW5kZWVkLCB3aXRoIHRoZSBwb3N0LWNvdXAgY3Jpc2lzIGFmZmVjdGluZyBib3RoIGh1bWFuaXRhcmlhbiBhbmQgZGV2ZWxvcG1lbnQgcHJvZ3JhbW1pbmcsIHRoZSBuZWVkIGZvciBzdHJvbmdlciBjb29yZGluYXRpb24gdG8gYWRhcHQgZm9vZCBmb29kIHNlY3VyaXR5IHByb2dyYW1taW5nIGhhcyBwdXNoZWQgbWFueSBwYXJ0bmVycyB0byBlbnRlciB0aGUgRlNDLlRoaXMgdHlwZSBvZiBjb21wYXJpc29uIHdpbGwgYmUgbW9yZSB1c2VmdWwgbmV4dCB5ZWFyLiANCg0KPGJyPg0KDQpgYGB7ciBwcm9ncmVzcy1mYWNldC1saW5lcGxvdH0NCg0KYWN0X2xpbmVfMjAyMSA8LSBmc2NfMjAyMSAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lDQogIG11dGF0ZShkYXRlID0gZGF0ZSArIHllYXJzKDEpKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5X3JlZCkgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9iZW4gPSBjdW1zdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKGFjdGl2aXR5X3JlZCA9IHN0cl9yZXBsYWNlX2FsbChhY3Rpdml0eV9yZWQsICJwcm92aXNpb24gb2YgIiwgIiIpKSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9yZWQgJW91dCUgYygiZmlzaGVyeSBraXRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbXVuaXR5IGluZnJhc3RydWN0dXJlIGFuZCBlcXVpcG1lbnQiKSkNCg0KZnNjICU+JSANCiAgZ3JvdXBfYnkoZGF0ZSwgYWN0aXZpdHlfcmVkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICMgcmJpbmQoZnNjXzIwMjEgJT4lIA0KICAjICAgICAgICAgIyBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JQ0KICAjICAgICAgICAgZ3JvdXBfYnkoZGF0ZSwgYWN0aXZpdHlfcmVkKSAlPiUgDQogICMgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHlfcmVkKSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBhcnJhbmdlKGFjdGl2aXR5X3JlZCkgJT4lIA0KICBtdXRhdGUoYWN0aXZpdHlfcmVkID0gc3RyX3JlcGxhY2VfYWxsKGFjdGl2aXR5X3JlZCwgInByb3Zpc2lvbiBvZiAiLCAiIikpICU+JQ0KICBmaWx0ZXIoYWN0aXZpdHlfcmVkICVvdXQlIGMoImZpc2hlcnkga2l0cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW11bml0eSBpbmZyYXN0cnVjdHVyZSBhbmQgZXF1aXBtZW50IikpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGN1bV9iZW4sIGNvbG91ciA9IGFjdGl2aXR5X3JlZCkpICsNCiAgZ2VvbV9zdGVwKGRhdGEgPSBhY3RfbGluZV8yMDIxLCANCiAgICAgICAgICAgIGFlcyh4ID0gZGF0ZSwgDQogICAgICAgICAgICAgICAgeSA9IGN1bV9iZW4pLCANCiAgICAgICAgICAgIGNvbG91ciA9ICJncmV5IiwNCiAgICAgICAgICAgIHNpemUgPSAyLCANCiAgICAgICAgICAgIGFscGhhID0gLjQpICsgDQogIGdlb21fdmxpbmUoY29sb3VyID0gInJlZCIsIGx0eSA9IDIsIHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMjItMDYtMDEiKSksIGFscGhhID0gLjUpICsNCiAgZ2VvbV92bGluZShjb2xvdXIgPSAicmVkIiwgbHR5ID0gMiwgeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXMuRGF0ZSgiMjAyMi0wMy0wMSIpKSwgYWxwaGEgPSAuNSkgKw0KICBnZW9tX3N0ZXAoc2l6ZSA9IDEpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWIiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBmYWNldF93cmFwKH4gYWN0aXZpdHlfcmVkLCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1LCBhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSksIA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSkgKyANCiAgbGFicyh4ID0gIk1vbnRoIiwgDQogICAgICAgeSA9ICJDdW11bGF0aXZlIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIiwgDQogICAgICAgdGl0bGUgPSAiTW9udGhseSBwcm9ncmVzcyBieSBhY3Rpdml0eSwgMjAyMiBRMSAmIFEyIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGaWd1cmVzIGFyZSBpbiBjdW11bGF0aXZlIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIHJlYWNoZWQ7IHByZXZpb3VzIHllYXIncyBwcm9ncmVzcyBpcyBpbiBncmV5IikgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSANCiAgDQojIGdnc2F2ZSgiYWN0aXZpdHlfZmFjZXRfbGluZS5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKSAgDQoNCmBgYA0KDQo8YnI+DQoNCk5ld2x5IGltcGxlbWVudGVkIGluIFEyIG9mIDIwMjIgd2FzIHRoZSBwcm92aXNpb24gb2YgSEVCIGFuZCBmb3J0aWZpZWQgcmljZSwgbGFyZ2VseSBpbiBDaGluIHN0YXRlLiBGb29kIGRpc3RyaWJ1dGlvbnMgY29udGludWVkIHRvIGJlIHRoZSBsYXJnZXN0IGFjdGl2aXR5LCBmb2xsb3dlZCBieSB0aGUgcHJvdmlzaW9uIG9mIGNyb3AsIHZlZ2V0YWJsZSBhbmQgc2VlZCBraXRzLg0KDQo8YnI+PGJyPg0KDQojIyMgMi4yIEFncmljdWx0dXJhbCBhbmQgbGl2ZWxpaG9vZHMgYWN0aXZpdGllcw0KDQpgYGB7cn0NCmFnX2xpc3QgPC0gYygiY3JvcCwgdmVnZXRhYmxlIGFuZCBzZWVkIGtpdHMiLA0KICAgICAgICAgICAgICJGRlMgYW5kIGZhcm1lciB0cmFpbmluZyIsDQogICAgICAgICAgICAgIklHQSBhbmQgc21hbGwgZ3JhbnRzIiwNCiAgICAgICAgICAgICAibGl2ZXN0b2NrIGtpdHMiKQ0KDQoNCmBgYA0KYHIgZmlsdGVyKGZzYywgYWN0aXZpdHlfcmVkICVpbiUgYyhhZ19saXN0KSkgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCB0aHJvdWdoIGEgY29tYmluYXRpb24gb2YgY3JvcCwgdmVnZXRhYmxlIGFuZCBzZWVkIGtpdHMsIEZGUyBhbmQgZmFybWVyIHRyYWluaW5nLCBJR0EgYW5kIHNtYWxsIGdyYW50cyBhbmQgbGl2ZXN0b2NrIGtpdHMuIA0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLWFncmktYWN0aXZpdGllc30NCmZzYyAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9yZWQgJWluJSBjKCJjcm9wLCB2ZWdldGFibGUgYW5kIHNlZWQga2l0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGRlMgYW5kIGZhcm1lciB0cmFpbmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJR0EgYW5kIHNtYWxsIGdyYW50cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXZlc3RvY2sga2l0cyIpKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5X3JlZCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKGAlYmVuZWZpY2lhcmllc2AgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUgDQogIHJlbmFtZShhY3Rpdml0eSA9IGFjdGl2aXR5X3JlZCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCBieSBhZ3JpY3VsdHVyYWwgYW5kIGxpdmVsaWhvb2QgYWN0aXZpdGllcyIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpLCANCiAgICAgICAgZm9ybWFsID0gImh0bWwiLCANCiAgICAgICAgdGFibGUuYXR0ciA9ICJzdHlsZT0nd2lkdGg6NDUlOyciKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJhcyBvZiAzMCBKdW5lIDIwMjIiLCBnZW5lcmFsX3RpdGxlID0gIiIpDQpgYGANCg0KPGJyPg0KDQpUaGUgcGxvdCBiZWxvdyBzaG93cyB0aGUgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgcmVhY2hlZC4gVGhlIHBlcmNlbnRhZ2Ugb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IGFncmljdWx0dXJlIGFuZCBsaXZlbGlob29kcyBhY3Rpdml0aWVzIChjcm9wcywgdmVnZXRhYmxlIGFuZCBzZWVkIGtpdHM7IEZGUyBhbmQgZmFybWVyIHRyYWluaW5nOyBJR0EgYW5kIHNtYWxsIGdyYW50czsgbGl2ZXN0b2NrIGtpdHMpIHNsaWdodGx5IGluIFEyIDIwMjIsIGNvbXBhcmVkIHRvIFExLg0KDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1mYWNldC1hZy1hY3Rpdml0aWVzfQ0KZnNjICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3JlZCAlaW4lIGMoImNyb3AsIHZlZ2V0YWJsZSBhbmQgc2VlZCBraXRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklHQSBhbmQgc21hbGwgZ3JhbnRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpdmVzdG9jayBraXRzIikpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHlfcmVkLCBxdWFydGVyKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdyb3VwX2J5KHF1YXJ0ZXIpICU+JSANCiAgbXV0YXRlKGAlYmVuZWZpY2lhcmllc2AgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBxdWFydGVyID0gcmVjb2RlKHF1YXJ0ZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAicTEiID0gIlF1YXJ0ZXJfMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAicTIiID0gIlF1YXJ0ZXJfMiIpLCANCiAgICAgICAgICkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICB5ID0gZmN0X3Jlb3JkZXIoYWN0aXZpdHlfcmVkLCBiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAgZmlsbCA9IGFjdGl2aXR5X3JlZCkpICsgDQogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSkpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSksIA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArDQogIGZhY2V0X3Jvdyh2YXJzKHF1YXJ0ZXIpLCBzY2FsZXMgPSAiZnJlZV94Iiwgc3BhY2UgPSAiZnJlZSIpICsgDQogIGxhYnMoeCA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIGZpbGwgPSAiYWdyaWN1bHR1cmFsXG5hY3Rpdml0eSIsDQogICAgICAgdGl0bGUgPSAiQmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgcmVhY2hlZCBieSBhZ3JpY3VsdHVyZSBhbmQgbGl2ZWxpaG9vZHMgYWN0aXZpdGllcywgYnkgcXVhcnRlciIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IG51bWJlcl9mb3JtYXQoc2NhbGUgPSAxIC8gMTAwMCwgc3VmZml4ID0gIksiKSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIikpDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgMi4zIERlbGl2ZXJ5IG1vZGFsaXRpZXMNCg0KT25seSBIRUIgYW5kIGZvcnRpZmllZCByaWNlIGFuZCBraXRjaGVuIGdhcmRlbiBraXRzIHdlcmUgZGVsaXZlcmVkIGVudGlyZWx5IHRocm91Z2ggaW4ta2luZCBtb2RhbGl0aWVzLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShkZWxpdmVyeV9tb2RhbGl0eSkpICU+JSANCiAgbXV0YXRlKGRlbGl2ZXJ5X21vZGFsaXR5ID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJIeWJyaWQiKSB+ICJIeWJyaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJTZXJ2aWNlIikgfiAiU2VydmljZSBkZWxpdmVyeSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eV9yZWQsIGRlbGl2ZXJ5X21vZGFsaXR5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBkZWxpdmVyeV9tb2RhbGl0eSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGFkb3JuX3BlcmNlbnRhZ2VzKCJyb3ciKSAlPiUgDQogIGFkb3JuX3BjdF9mb3JtYXR0aW5nKCkgJT4lIA0KICBsZWZ0X2pvaW4oZnNjICU+JQ0KICAgICAgICAgIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUNCiAgICAgICAgICBtdXRhdGUoZGVsaXZlcnlfbW9kYWxpdHkgPSBjYXNlX3doZW4oc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIkh5YnJpZCIpIH4gIkh5YnJpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIlNlcnZpY2UiKSB+ICJTZXJ2aWNlIGRlbGl2ZXJ5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUNCiAgICAgICAgICBncm91cF9ieShhY3Rpdml0eV9yZWQpICU+JQ0KICAgICAgICAgIHN1bW1hcmlzZShCZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpLCANCiAgICAgICAgICBieSA9ICJhY3Rpdml0eV9yZWQiKSAlPiUNCiAgYXJyYW5nZShkZXNjKEJlbmVmaWNpYXJpZXMpKSAlPiUNCiAgbXV0YXRlKGFjdGl2aXR5X3JlZCA9IGlmZWxzZShhY3Rpdml0eV9yZWQgJWluJSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklHQSBhbmQgc21hbGwgZ3JhbnRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIRUIgYW5kIGZvcnRpZmllZCByaWNlIGZvciBhY3V0ZSBlbWVyZ2VuY2llcyIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9yZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3RvX3NlbnRlbmNlKGFjdGl2aXR5X3JlZCkpKSAlPiUgDQogIHJlbmFtZShBY3Rpdml0eSA9IGFjdGl2aXR5X3JlZCkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhgSW4ta2luZGAsIGBTZXJ2aWNlIGRlbGl2ZXJ5YCwgYENCVC9DVkFgLCBgSHlicmlkYCksIA0KICAgICAgICAgICAgfnJlY29kZSguLCAiLSIgPSBOQV9jaGFyYWN0ZXJfKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlBlcmNlbnRhZ2Ugb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IGFjdGl2aXR5IGFuZCBkZWxpdmVyeSBtb2RhbGl0eSIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJCZW5lZmljaWFyeSB0b3RhbHMgYXJlIGFzIG9mIDMwIEp1bmUgMjAyMiIsIA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQpgYGANCg0KPGJyPg0KDQpUaGVyZSBhcmUgYWxzbyBjbGVhciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgYmVuZWZpY2lhcnkgdHlwZXMgYW5kIHRoZSBkZWxpdmVyeSBtb2RhbGl0aWVzIGVtcGxveWVkIHdpdGggdGhlbS4gQmVuZWZpY2lhcmllcyBmcm9tIGhvc3QvbG9jYWwgY29tbXVuaXRpZXMgbGFyZ2VseSByZWNlaXZlZCBpbi1raW5kIGRpc3RyaWJ1dGlvbnMgd2hpbHN0IHRob3NlIGZyb20gY2FtcHMgYW5kIElEUCBzaXRlcyBtb3N0bHkgcmVjZWl2ZWQgY2FzaC1iYXNlZCBpbnRlcnZlbnRpb25zLCBpbmRpY2F0aW5nIHRoYXQgcGFydG5lcnMgbW9zdGx5IHdvcmtlZCBpbiB0aGUgc2FtZSBhcmVhcyBpbiBRMSBhbmQgUTIuIA0KDQo8YnI+DQoNCmBgYHtyIGZhY2V0LWJlbi10eXBlLCBmaWcuaGVpZ2h0PTZ9DQoNCmZzYyAlPiUgIA0KICAgbXV0YXRlKGRlbGl2ZXJ5X21vZGFsaXR5ID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJIeWJyaWQiKSB+ICJIeWJyaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJTZXJ2aWNlIikgfiAiU2VydmljZSBkZWxpdmVyeSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGRlbGl2ZXJ5X21vZGFsaXR5KSAmICFpcy5uYShsb2NhdGlvbl90eXBlKSkgJT4lIA0KICBzdW1fYmVuMihkZWxpdmVyeV9tb2RhbGl0eSwgbG9jYXRpb25fdHlwZSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkZWxpdmVyeV9tb2RhbGl0eSwgeSA9IGJlbmVmaWNpYXJpZXMsIGZpbGwgPSBkZWxpdmVyeV9tb2RhbGl0eSkpICsNCiAgZ2VvbV9jb2woKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQogIGZhY2V0X3dyYXAofmxvY2F0aW9uX3R5cGUsIHNjYWxlcyA9ICJmcmVlIikgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAyNSwgdmp1c3QgPSAuNywgaGp1c3QgPSAuNSksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIikpICsNCiAgbGFicyh4ID0gIkRlbGl2ZXJ5IG1vZGFsaXR5IiwgeSA9ICJCZW5lZmljaWFyaWVzIiwNCiAgICAgICB0aXRsZSA9ICJEZWxpdmVyeSBtb2RhbGl0aWVzIGJ5IGxvY2F0aW9uIHR5cGUiKQ0KICANCg0KYGBgDQoNCjxicj4NCg0KQXJlYXMgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgSURQcywgc3VjaCBhcyBTYWdhaW5nLCBSYWtoaW5lIGFuZCBLYWNoaW4sIHJlYWNoIG1vc3Qgb2YgdGhlaXIgYmVuZWZpY2lhcmllcyB0aHJvdWdoIGNhc2gtYmFzZWQgcHJvZ3JhbW1pbmcuDQoNCjxicj4NCg0KYGBge3IgZGVsaXZlcnktbW9kYWxpdGllcy1zdGFja2VkLWJhcn0NCnN0YXRlX3RvdGFscyA8LSBmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UodG90YWwgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShwYyA9IDEsIA0KICAgICAgICAgc3RhdGUgPSBmY3RfcmVvcmRlcihzdGF0ZSwgdG90YWwpKQ0KDQpmc2MgJT4lICANCiAgZmlsdGVyKCFpcy5uYShkZWxpdmVyeV9tb2RhbGl0eSkpICU+JSAgDQogICBtdXRhdGUoZGVsaXZlcnlfbW9kYWxpdHkgPSBjYXNlX3doZW4oc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIkh5YnJpZCIpIH4gIkh5YnJpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIlNlcnZpY2UiKSB+ICJTZXJ2aWNlIGRlbGl2ZXJ5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUNCiAgZ3JvdXBfYnkoc3RhdGUsIGRlbGl2ZXJ5X21vZGFsaXR5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIG11dGF0ZShwYyA9IGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcyksDQogICAgICAgICBzdGF0ZSA9IGZjdF9yZW9yZGVyKHN0YXRlLCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwYywgeSA9IGZjdF9yZXYoc3RhdGUpLCBmaWxsID0gZGVsaXZlcnlfbW9kYWxpdHkpKSArIA0KICBnZW9tX2NvbCgpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQsIGJyZWFrcyA9IHNlcSgwLCAxLCBieSA9IC4yKSkgKyANCiAgZ2VvbV90ZXh0KGFlcyh5ID0gc3RhdGUsIHggPSBwYyArIDAuMTI1LCBsYWJlbCA9IGNvbW1hKHRvdGFsLCBhY2N1cmFjeSA9IDEpLCBmaWxsID0gTlVMTCksIA0KICAgICAgICAgICAgZGF0YSA9IHN0YXRlX3RvdGFscywgaGp1c3QgPSAiaW53YXJkIiwgc2l6ZSA9IDIuNSkgKw0KICBsYWJzKHggPSAiJSBvZiB0b3RhbCIsIHkgPSAiIiwgZmlsbCA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJQZXJjZW50YWdlIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBieSBkZWxpdmVyeSBtb2RhbGl0aWVzIiwgDQogICAgICAgc3VidGl0bGUgPSAiQmVuZWZpY2lhcmllcyBhcyBvZiAzMCBKdW5lIDIwMjIgYXQgdGhlIGVuZCBvZiBlYWNoIGJhciIpDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMy4gQ2FzaC1iYXNlZCBwcm9ncmFtbWluZw0KDQojIyMgMy4xIFVTRCBwZXIgaG91c2Vob2xkDQoNCkNvbXBhcmVkIHRvIFExLCBiZW5lZmljaWFyaWVzIGluIFEyIGFyZSBtdWNoIGxlc3MgbGlrZWx5IHRvIGhhdmUgcmVjZWl2ZWQgY2FzaCB0cmFuc2ZlcnMgb2YgbGVzcyB0aGFuIFVTRCAxMCBwZXIgaG91c2Vob2xkLiBUaGUgbW9zdCBjb21tb24gdHJhbnNmZXIgdmFsdWVzIHdlcmUgYmV0d2VlbiBVU0QgNjAgYW5kIDcwLCBhbiBpbmNyZWFzZSBmcm9tIHRoZSBwcmV2aW91cyBxdWFydGVyLg0KDQo8YnI+DQoNCmBgYHtyIHVzZC1oaGQtYmluLWJhcnBsb3QsIGZpZy5oZWlnaHQ9NX0NCg0KZnNjICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHVzZF9wZXJfaGhkKSAmICFpcy5uYShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgZmlsdGVyKGRlbGl2ZXJ5X21vZGFsaXR5ICVpbiUgYygiQ0JUL0NWQSIsICJIeWJyaWQgKEluLWtpbmQgJiBDQlQvQ1ZBKSIpKSAlPiUNCiAgZ3JvdXBfYnkodXNkX2hoZF9iaW4sIHF1YXJ0ZXIpICU+JSANCiAgc3VtbWFyaXNlKGhvdXNlaG9sZHMgPSBzdW0oaG91c2Vob2xkcykpICU+JSANCiAgZ3JvdXBfYnkocXVhcnRlcikgJT4lIA0KICBtdXRhdGUoYCVfb2ZfaGhkYCA9IHJvdW5kKGhvdXNlaG9sZHMgLyBzdW0oaG91c2Vob2xkcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShxdWFydGVyID0gcmVjb2RlKHF1YXJ0ZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJxMSIgPSAiUXVhcnRlcl8xIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJxMiIgPSAiUXVhcnRlcl8yIikpICU+JSAgDQogIG11dGF0ZSh1c2RfaGhkX2JpbiA9IGZjdF9yZWxldmVsKHVzZF9oaGRfYmluLCBjKCI8JDEwIiwgIj49JDEwXzwkMjAiLCAiPj0kMjBfPCQzMCIsICI+PSQzMF88JDQwIiwgIj49JDQwXzwkNTAiLCI+PSQ1MF88JDYwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+PSQ2MF88JDcwIiwgIj49JDcwXzwkODAiLCAiPj0kODBfPCQ5MCIsIj49JDkwXzwkMTAwIiwiPj0kMTAwIikpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHVzZF9oaGRfYmluLCB5ID0gaG91c2Vob2xkcywgZmlsbCA9IHVzZF9oaGRfYmluKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gYCVfb2ZfaGhkYCksIHZqdXN0ID0gLTAuNCwgc2l6ZSA9IDMpICsgDQogIGZhY2V0X3dyYXAofiBxdWFydGVyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAibWFrbyIsIGRpcmVjdGlvbiA9IC0xKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIGJyZWFrcyA9IHNlcSgwLCA4MDAwMCwgYnkgPSAxMDAwMCkpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMC44LCB2anVzdCA9IDAuOSksIA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSkgKw0KICBsYWJzKHggPSAiVVNEIHZhbHVlIG9mIGNhc2ggdHJhbnNmZXIgcGVyIGhvdXNlaG9sZCBwZXIgbW9udGgiLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIGhvdXNlaG9sZHMiLA0KICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBob3VzZWhvbGRzIGJ5IHZhbHVlIG9mIGNhc2ggdHJhbnNmZXIgcGVyIGhvdXNlaG9sZCAoMjAyMi9RMSkiLA0KICAgICAgIHN1YnRpdGxlID0gIkZpZ3VyZXMgYXQgdGhlIHRvcCBvZiBlYWNoIGJhciBzaG93IHBlcmNlbnRhZ2Ugb2YgaG91c2Vob2xkc1xuT25seSBob3VzZWhvbGRzIHJlYWNoZWQgdGhyb3VnaCB0aGUgY2FzaCwgaHlicmlkIG9yIHZvdWNoZXIgbW9kYWxpdGllcyBhcmUgaW5jbHVkZWQiKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAzLjIgVVNEIHBlciBwZXJzb24NCg0KVGhlIGJveHBsb3RzIGJlbG93IHNob3dzIHRoZSByYW5nZSBvZiBjYXNoIHRyYW5zZmVyIHZhbHVlcyAoYWxsIHZhbHVlcyBhcmUgcGVyIHBlcnNvbiwgdG8gZmFjaWxpdGF0ZSBjb21wYXJhYmlsaXR5KSBieSBhY3Rpdml0eS4gVGhlIGF2ZXJhZ2UgZm9yIHJlYWNoIGFjdGl2aXR5IGlzIG1hcmtlZCBieSB0aGUgdGhpY2sgbGluZSBpbiB0aGUgbWlkZGxlIG9mIGVhY2ggYm94LiBUaGUgbGVmdG1vc3QgYW5kIHJpZ2h0bW9zdCBzaWRlIG9mIGVhY2ggYm94IGluZGljYXRlIHRoZSAyNXRoIGFuZCA3NXRoIHBlcmNlbnRpbGUgb2YgdHJhbnNmZXIgdmFsdWVzLCByZXNwZWN0aXZlbHkuIFRoZSBsZW5ndGggb2YgZWFjaCBib3ggaXMgYSBnYXVnZSBmb3IgaG93IG11Y2ggdmFyaWF0aW9uIHRoZXJlIGlzIGluIHRoZSB0cmFuc2ZlciB2YWx1ZXMgb2YgZWFjaCBhY3Rpdml0eS4NCg0KPGJyPg0KDQpgYGB7ciBib3hwbG90LWFjdGl2aXR5LXVzZC1wZXItcGVyc29ufQ0KDQpmc2MgJT4lIGZpbHRlcighaXMubmEodG90YWxfdmFsdWVfdXNkKSAmIGFjdGl2aXR5X3JlZCAlb3V0JSBjKCJGRlMgYW5kIGZhcm1lciB0cmFpbmluZyIsICJ2b2NhdGlvbmFsIHRyYWluaW5nIikpICU+JQ0KICBtdXRhdGUoYWN0aXZpdHlfcmVkID0gZmN0X3JlbGV2ZWwoYWN0aXZpdHlfcmVkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoImZvb2QgZGlzdHJpYnV0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2RfY2FzaCBmb3Igd29ya19hc3NldHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGl2ZXN0b2NrIGtpdHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JvcCwgdmVnZXRhYmxlIGFuZCBzZWVkIGtpdHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUdBIGFuZCBzbWFsbCBncmFudHMiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGFjdGl2aXR5X3JlZCwgeCA9IHVzZF9wZXJfcGVyc29uLCBjb2xvdXIgPSBhY3Rpdml0eV9yZWQpKSArIA0KICBnZW9tX2ppdHRlcihhbHBoYSA9IC4xLCBhZXMoc2l6ZSA9IGJlbmVmaWNpYXJpZXMpKSArDQogIGdlb21fYm94cGxvdChhbHBoYSA9IC44LCBvdXRsaWVyLmFscGhhID0gLjIpICsgDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIGJyZWFrcyA9IGMoMCwgMSwgMywgMTAsIDMwLCAxMDAsIDMwMCwgMTAwMCksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gZG9sbGFyX2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBsYWJzKHggPSAiVVNEIHBlciBwZXJzb24iLCB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIkJveHBsb3RzIG9mIFVTRCB0cmFuc2ZlciB2YWx1ZXMgcGVyIHBlcnNvbiBpbiAyMDIyIChRMSAmIFEyKSIsIA0KICAgICAgIHN1YnRpdGxlID0gIlRoaWNrIGxpbmUgaW4gZWFjaCBib3ggaXMgdGhlIG1lYW47XG4gUG9pbnRzIGFyZSBpbmRpdmlkdWFsIGRpc3RyaWJ1dGlvbnMsIHNpemVzIGluZGljYXRlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIikNCg0KIA0KYGBgDQoNCjxicj4NCg0KRWFjaCBvZiB0aGUgYnViYmxlcyByZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgaW50ZXJ2ZW50aW9uLCB3aXRoIHRoZWlyIHBvc2l0aW9uIGFsb25nIHRoZSB4LWF4aXMgc2hvd2luZyB0aGUgVVNEIHBlciBwZXJzb24gdmFsdWUgb2YgdGhlIGludGVydmVudGlvbiBhbmQgdGhlIHNpemUgb2YgZWFjaCBidWJibGUgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZC4NCg0KRm9vZCBkaXN0cmlidXRpb25zIHRlbmRlZCB0byBoYXZlIHRoZSB0aWdodGVzdCByYW5nZSBvZiB2YWx1ZXMsIHdoaWNoIHByb3ZlcyB0aGF0IGZvb2QgYXNzaXN0YW5jZSBpcyBxdWl0ZSBzdGFuZGFyZGlzZWQgYW1vbmdzdCBwYXJ0bmVycy4gDQoNCjxicj4NCg0KYGBge3IgcGxvdGx5LXRyYW5zZmVyLXZhbHVlLXNjYXR0ZXIsIGZpZy5oZWlnaHQ9Nn0NCg0KbW9uZXlfc2NhdHRlciA8LSBmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHRvdGFsX3ZhbHVlX3VzZCkgJiBhY3Rpdml0eV9yZWQgJW91dCUgYygibGl2ZXN0b2NrIGtpdHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZvY2F0aW9uYWwgdHJhaW5pbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIikpICU+JQ0KICBncm91cF9ieShzdGF0ZSwgdG93bnNoaXAsIGxvY2F0aW9uLCBvcmdfY29kZSwgYWN0aXZpdHlfcmVkLCBxdWFydGVyKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHRvdGFsX3ZhbHVlX3VzZCA9IHN1bSh0b3RhbF92YWx1ZV91c2QpLCANCiAgICAgICAgICAgIHJvdW5kcyA9IG5fZGlzdGluY3QoZGF0ZSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBtdXRhdGUocXVhcnRlciA9IHJlY29kZShxdWFydGVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAicTEiID0gIlF1YXJ0ZXJfMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAicTIiID0gIlF1YXJ0ZXJfMiIpKSAlPiUgDQogIG11dGF0ZShwZXJfcGVyc29uID0gcm91bmQodG90YWxfdmFsdWVfdXNkIC8gYmVuZWZpY2lhcmllcywgZGlnaXRzID0gMikpICU+JSANCiAgZmlsdGVyKHRvdGFsX3ZhbHVlX3VzZCA+IDApICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gcGVyX3BlcnNvbiwgY29sb3VyID0gYWN0aXZpdHlfcmVkLCANCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKG9yZ19jb2RlLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3JlZCwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVuLiBmcmVxdWVuY2llczogIiwgY29tbWEoYmVuZWZpY2lhcmllcywgYWNjdXJhY3kgPSAxKSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJVU0QgcGVyIHBlcnNvbjogIiwgZG9sbGFyKHBlcl9wZXJzb24pLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbCB2YWx1ZTogIiwgZG9sbGFyKHRvdGFsX3ZhbHVlX3VzZCwgYWNjdXJhY3kgPSAxKSwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAicm91bmRzOiAiLCByb3VuZHMsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdG93bnNoaXAsICIsICIsIHN0YXRlKSkpICsgDQogIGdlb21faml0dGVyKGFlcyhzaXplID0gdG90YWxfdmFsdWVfdXNkKSwgYWxwaGEgPSAuNSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgYnJlYWtzID0gYygwLCAxLCAzLCAxMCwgMzAsIDEwMCwgMzAwKSwgbGFiZWxzID0gZG9sbGFyX2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBsYWJlbHMgPSBjb21tYSwgYnJlYWtzID0gYygwLCAxMCwgMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCAzMDAwMDApKSArIA0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoZ3VpZGUgPSAibm9uZSIsIHJhbmdlID0gYygwLjMsIDUpKSArIA0KICBsYWJzKHggPSAiQmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMiLCANCiAgICAgICB5ID0gIlVTRCB2YWx1ZSBwZXIgcGVyc29uIiwgDQogICAgICAgdGl0bGUgPSAiQXZlcmFnZSBVU0QgdHJhbnNmZXIgdmFsdWUgcGVyIHBlcnNvbiBpbiAyMDIyIChRMSAmIFEyKVxuQnkgb3JnYW5pc2F0aW9uLCBsb2NhdGlvbiBhbmQgYWN0aXZpdHkiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJCeSBvcmdhbmlzYXRpb24sIGxvY2F0aW9uIGFuZCBhY3Rpdml0eSIsIA0KICAgICAgIGNvbG91ciA9ICJieSBvcmcsIGxvY2F0aW9uIGFuZCBhY3Rpdml0eVxuZG91YmxlLWNsaWNrIHRvIHNlbGVjdCIpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIikpICsgDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMSwgYWxwaGEgPSAxKSkpICsgDQogIGZhY2V0X3dyYXAofiBxdWFydGVyKQ0KDQpnZ3Bsb3RseShtb25leV9zY2F0dGVyLCB0b29sdGlwID0gYygidGV4dCIpLCB3aWR0aCA9IDgyMCkgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkF2ZXJhZ2UgVVNEIHRyYW5zZmVyIHZhbHVlIHBlciBwZXJzb24gaW4gMjAyMiAoUTEgJiBRMikiKSkpDQoNCg0KYGBgDQoNCjxicj4NCg0KQ2FzaCB0cmFuc2ZlciB2YWx1ZXMgdGVuZGVkIHRvIGJlIGhpZ2hlciBpbiBRMiBhcyBjb21wYXJlZCB0byBRMSBsYXJnZWx5IGR1ZSB0byBpbmNyZWFzZXMgaW4gdGhlIHBlci1ob3VzZWhvbGQgcGFja2FnZSBvZiBtdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXJzLiBUaGlzIG1heSBiZSBleHBsYWluZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIG5ldyAyMDIyIHByb2plY3RzIHRoYXQgaGF2ZSBpbnRlZ3JhdGVkIHRoZSBpbmZsYXRpb24gaW4gdGhlaXIgYnVkZ2V0aW5nLiANCg0KPGJyPjxicj48YnI+DQoNCiMjIyAzLjMgRm9vZCBkaXN0cmlidXRpb25zDQoNCmBgYHtyIHBsb3RseS1mb29kLWRpc3QtcmFuZ2V9DQoNCmZvb2RfZGlzdF9yYW5nZSA8LSBmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHVzZF9wZXJfcGVyc29uKSkgJT4lDQogIGZpbHRlcihhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIiAmIHVzZF9wZXJfcGVyc29uIDwgNjApICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gdXNkX3Blcl9wZXJzb24sIHkgPSBzdGF0ZSwgY29sb3VyID0gc3RhdGUsIA0KICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAob3JnX2NvZGUsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfcmVkLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW4uIGZyZXF1ZW5jaWVzOiAiLCBjb21tYShiZW5lZmljaWFyaWVzLCBhY2N1cmFjeSA9IDEpLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVTRCBwZXIgcGVyc29uOiAiLCBkb2xsYXIodXNkX3Blcl9wZXJzb24pLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbCB2YWx1ZTogIiwgZG9sbGFyKHRvdGFsX3ZhbHVlX3VzZCwgYWNjdXJhY3kgPSAxKSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvd25zaGlwLCAiLCAiLCBzdGF0ZSkpKSArIA0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxMS40NTUsIGx0eSA9IDIsIGNvbG91ciA9ICJyZWQiLCBhbHBoYSA9IC41LCBzaXplID0gLjMpICsgDQogIGdlb21faml0dGVyKGFscGhhID0gMC4zLCBhZXMoc2l6ZSA9IGJlbmVmaWNpYXJpZXMpKSArDQogIHNjYWxlX2NvbG91cl92aXJpZGlzX2QoKSArDQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC4zLCAxMCkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoMCwgMywgMTAsIDIwLCAzMCwgNTApLCBsYWJlbHMgPSBkb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gMSksIA0KICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiKSArDQogIGxhYnMoeCA9ICJVU0QgdmFsdWUgcGVyIHBlcnNvbiIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiRm9vZCBkaXN0cmlidXRpb246IHJhbmdlIG9mIFVTRCB2YWx1ZXMgcGVyIHBlcnNvbiBieSBzdGF0ZSBpbiAyMDIyL1ExIiwNCiAgICAgICBzaXplID0gIiIsIGNvbG91ciA9ICIiKSANCg0KZ2dwbG90bHkoZm9vZF9kaXN0X3JhbmdlLCB0b29sdGlwID0gYygidGV4dCIpLCB3aWR0aCA9IDgyMCwgaGVpZ2h0ID0gIDYwMCkgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkZvb2QgZGlzdHJpYnV0aW9uOiByYW5nZSBvZiBVU0QgdmFsdWVzIHBlciBwZXJzb24gYnkgc3RhdGUgaW4gMjAyMiAoUTEgJiBRMikiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgcmVkIGxpbmUgaXMgNTAlIG9mIDEvNSBvZiBmb29kIE1FQjsgZG91YmxlLWNsaWNrIG9uIGxlZ2VuZCB0byBzZWxlY3QiLCI8L3N1cD4iKSksIA0KICAgICAgICAgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNykpKSANCmBgYA0KDQo8YnI+DQoNCkthY2hpbiwgUmFraGluZSBhbmQgU2hhbiBub3RhYmx5IGhhdmUgc2V2ZXJhbCBleHRyZW1lIG91dGxpZXJzIG11Y2ggaGlnaGVyIHRoYW4gdGhlIGF2ZXJhZ2UgZm9yIHRoYXQgc3RhdGUuIEtheWluLCBob3dldmVyLCBoYXMgYSB2ZXJ5IGxhcmdlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHdobyByZWNlaXZlZCBsZXNzIHRoZSBVU0QgMS9wZXJzb24uIERpc3RyaWJ1dGlvbnMgaW4gQ2hpbiBhbmQgQXlleWFyd2FkeSBoYWQgdmVyeSBjb25zaXN0ZW50IHZhbHVlcyBhcyB0aGV5IHdlcmUgYWxsIGltcGxlbWVudGVkIGJ5IHRoZSBzYW1lIGltcGxlbWVudGluZyBwYXJ0bmVyLg0KDQpUaGUgdGFibGUgYmVsb3cgY29tcGFyZXMgdGhlIGRpZmZlcmVudCBiaW5zIGZvciBjYXNoIHRyYW5zZmVyIHZhbHVlcyBvZiBmb29kIGRpc3RyaWJ1dGlvbnMgd2l0aCB0aGUgbWluaW11bSBleHBlbmRpdHVyZSBiYXNrZXQgZm9yIGZvb2QgZXN0YWJsaXNoZWQgYnkgdGhlIENhc2ggV29ya2luZyBHcm91cC4gVGhleSBoYXZlIGVzdGFibGlzaGVkIGEgZmxvb3Igb2YgTU1LIDE5MCw1NTUgKG9yIFVTRCAxMTQuNTUpIGZvciB0aGUgZm9vZCBzZWN1cml0eSBjb21wb25lbnQgcGVyIGhvdXNlaG9sZCBwZXIgbW9udGguIA0KDQpPdmVyYWxsLCBgciByb3VuZCgoZmlsdGVyKGZzYywgdXNkX3Blcl9wZXJzb24gPj0gKDExNC41NSAvIDUpICYgYWN0aXZpdHlfcmVkID09ICJmb29kIGRpc3RyaWJ1dGlvbiIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSkgLyAoZmlsdGVyKGZzYywgIWlzLm5hKHVzZF9wZXJfcGVyc29uKSAmIGFjdGl2aXR5X3JlZCA9PSAiZm9vZCBkaXN0cmlidXRpb24iKSAlPiUge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0pICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIGZvb2QgZGlzdHJpYnV0aW9uIGJlbmVmaWNpYXJpZXMgaGF2ZSByZWNlaXZlZCBhdCBsZWFzdCAxMDAlIG9mIHRoZSBmb29kIHNlY3VyaXR5IE1FQiBhbmQgYHIgcm91bmQoKGZpbHRlcihmc2MsIHVzZF9wZXJfcGVyc29uID49ICgxMTQuNTUgLyA1IC8gMikgJiBhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIikgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9KSAvIChmaWx0ZXIoZnNjLCAhaXMubmEodXNkX3Blcl9wZXJzb24pICYgYWN0aXZpdHlfcmVkID09ICJmb29kIGRpc3RyaWJ1dGlvbiIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSkgKiAxMDAsIGRpZ2l0cyA9IDIpYCUgaGF2ZSByZWNlaXZlZCBhdCBsZWFzdCA1MCUgb2YgdGhlIGZvb2Qgc2VjdXJpdHkgTUVCIChVU0QgMTEuNDUgcGVyIHBlcnNvbikuDQoNCjxicj4NCg0KYGBge3IgdGFibGUtbWViLXVzZC1oaGQtYmlufQ0KDQpmb29kX2JpbnMgPC0gZnNjICU+JSBmaWx0ZXIoYWN0aXZpdHlfcmVkICVpbiUgYygiZm9vZCBkaXN0cmlidXRpb24iKSAmIA0KICAgICAgICAgICAgICAgICAhaXMubmEodXNkX3Blcl9wZXJzb24pICYgDQogICAgICAgICAgICAgICAgICFpcy5uYShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgY291bnQodXNkX3BlcnNvbl9iaW4sIHd0ID0gbmV3X2JlbmVmaWNpYXJpZXMpICU+JSANCiAgbXV0YXRlKHBjX29mX3RvdGFsID0gcm91bmQobiAvIHN1bShuKSAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICB1c2RfcGVyc29uX2JpbiA9IGZjdF9yZWxldmVsKHVzZF9wZXJzb25fYmluLCBjKCI8JDIiLCAiPj0kMl88JDQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj49JDRfPCQ2IiwgIj49JDZfPCQ4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+PSQ4XzwkMTAiLCI+PSQxMF88JDEyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj49JDEyXzwkMTQiLCAiPj0kMTRfPCQxNiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0kMTZfPCQxOCIsICI+PSQxOF88JDIwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj49MjAiKSkpICU+JSANCiAgYXJyYW5nZSh1c2RfcGVyc29uX2JpbikNCg0KZnNjICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3JlZCAlaW4lIGMoImZvb2QgZGlzdHJpYnV0aW9uIikgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXMubmEodXNkX3Blcl9wZXJzb24pICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzLm5hKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lDQogIG11dGF0ZShwY19tZWIgPSB1c2RfcGVyX3BlcnNvbiAqIDUgLyAxMTQuNTUsIA0KICAgICAgICAgdXNkX3BlcnNvbl9iaW4gPSBmY3RfcmVsZXZlbCh1c2RfcGVyc29uX2JpbiwgYygiPCQyIiwgIj49JDJfPCQ0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+PSQ0XzwkNiIsICI+PSQ2XzwkOCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0kOF88JDEwIiwiPj0kMTBfPCQxMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+PSQxMl88JDE0IiwgIj49JDE0XzwkMTYiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj49JDE2XzwkMTgiLCAiPj0kMThfPCQyMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+PTIwIikpKSAlPiUgDQogIGdyb3VwX2J5KHVzZF9wZXJzb25fYmluKSAlPiUgDQogIHN1bW1hcmlzZShhdmdfcGNfb2ZfbWViID0gcm91bmQobWVhbihwY19tZWIpICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgICAgIGF2Z191c2RfbW9udGggPSByb3VuZChtZWFuKHVzZF9wZXJfcGVyc29uLCBuYS5ybSA9IFRSVUUpLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSByb3VuZChzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSkgJT4lIA0KICBtdXRhdGUocGNfb2ZfaGhkID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJVU0QgdmFsdWVzIG9mIGZvb2QgZGlzdHJpYnV0aW9ucyBieSBwZXJjZW50YWdlIG9mIE1FQiByZWNlaXZlZCIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikgJT4lIA0KICBjb2x1bW5fc3BlYyg1LCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBzcGVjX2NvbG9yKGZvb2RfYmlucyRwY19vZl90b3RhbFsxOjExXSwgZW5kID0gMC45LCBkaXJlY3Rpb24gPSAtMSkpICU+JQ0KICBmb290bm90ZShnZW5lcmFsID0gIk9ubHkgcGVyc29ucyByZWFjaGVkIHRocm91Z2ggQ0JUL0NWQS9oeWJyaWQgbW9kYWxpdGllcyBhcmUgaW5jbHVkZWQiLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQojIHBhbmRlcihjYXB0aW9uID0gIk1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlciB2YWx1ZXMgYnkgcGVyY2VudGFnZSBvZiBNRUIgcmVjZWl2ZWQiKQ0KDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDMuNCBJbXBsZW1lbnRpbmcgcGFydG5lcnMNCg0KVGhlIHBsb3RzIGJlbG93IHNob3cgdGhlIHRoZSBhdmVyYWdlIGNhc2ggdHJhbnNmZXIgdmFsdWVzIGJ5IGFjdGl2aXR5IGZvciB0aGUgdG9wIDcgcGFydG5lcnMgaW1wbGVtZW50aW5nIHRoYXQgYWN0aXZpdHkuIFRIZSB4LWF4aXMgc2hvd3dzIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGFuZCB0aGUgZGVwdGggb2YgdGhlIGNvbG91ciBpbmRpY2F0ZXMgdGhlIHZhbHVlIG9mIHRoZSBjYXNoIHRyYW5zZmVyLiANCg0KPGJyPg0KDQpgYGB7ciBwYXJ0bmVyLWNhc2gtdmFsdWVzLCBmaWcuaGVpZ2h0PTYuNX0NCnBhcnRuZXJfbWVhbl91c2QgPC0gZnVuY3Rpb24odGJsLCBuYW1lKXsNCg0KICB0YmwgJT4lIA0KICAgIGZpbHRlcighaXMubmEobmV3X2JlbmVmaWNpYXJpZXMpICYgIWlzLm5hKHVzZF9wZXJfaGhkKSkgJT4lDQogICAgZmlsdGVyKGRlbGl2ZXJ5X21vZGFsaXR5ICVpbiUgYygiQ0JUL0NWQSIsICJIeWJyaWQgKEluLWtpbmQgJiBDQlQvQ1ZBKSIpKSAlPiUNCiAgICBmaWx0ZXIoYWN0aXZpdHlfcmVkID09IHt7bmFtZX19KSAlPiUNCiAgICBtdXRhdGUoaG91c2Vob2xkcyA9IGlmZWxzZShhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXNlaG9sZHMpKSAlPiUgDQogICAgZ3JvdXBfYnkob3JnX2NvZGUpICU+JSANCiAgICBzdW1tYXJpc2UodG90YWxfdmFsdWVfdXNkID0gc3VtKHRvdGFsX3ZhbHVlX3VzZCksDQogICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgICAgaG91c2Vob2xkcyA9IHN1bShob3VzZWhvbGRzKSkgJT4lIA0KICAgIG11dGF0ZShtZWFuX3VzZCA9IHRvdGFsX3ZhbHVlX3VzZCAvIGhvdXNlaG9sZHMpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSAgDQogICAgdG9wX24oNykgJT4lIA0KICAgIG11dGF0ZShvcmdfY29kZSA9IGZjdF9yZW9yZGVyKG9yZ19jb2RlLCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSBvcmdfY29kZSwgZmlsbCA9IG1lYW5fdXNkKSkgKyANCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWFfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsgDQogICAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEsIGJlZ2luID0gMC4yLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gZG9sbGFyX2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArDQogICAgZ2VvbV9jb2woKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGRvbGxhcihtZWFuX3VzZCkpLCBzaXplID0gMywgaGp1c3QgPSAiaW53YXJkIikgKyANCiAgICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIGZpbGwgPSAiQXZnIFVTRCIpICsNCiAgICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLA0KICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1LjUpLCANCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSkNCn0NCg0KZnNjICU+JSBwYXJ0bmVyX21lYW5fdXNkKCJtdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXIiKSArDQogIGxhYnModGl0bGUgPSAiTXVsdGktcHVycG9zZSBjYXNoIHRyYW5zZmVyIChwZXIgaGhkKSIpICsgDQpmc2MgJT4lIHBhcnRuZXJfbWVhbl91c2QoImZvb2QgZGlzdHJpYnV0aW9uIikgKw0KICBsYWJzKHRpdGxlID0gIkZvb2QgZGlzdHJpYnV0aW9ucyAocGVyIHBlcnNvbikiKSArDQpmc2MgJT4lIHBhcnRuZXJfbWVhbl91c2QoImZvb2RfY2FzaCBmb3Igd29ya19hc3NldHMiKSArIA0KICBsYWJzKHRpdGxlID0gIkZvb2QvY2FzaCBmb3Igd29yay9hc3NldHMgKHBlciBoaGQpIikgKyANCmZzYyAlPiUgcGFydG5lcl9tZWFuX3VzZCgiSUdBIGFuZCBzbWFsbCBncmFudHMiKSArDQogIGxhYnModGl0bGUgPSAiSUdBIGFuZCBzbWFsbCBncmFudHMgKHBlciBoaGQpIikgKyANCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIkNhc2ggdHJhbnNmZXIgdmFsdWVzIG9mIHRoZSB0b3AgaW1wbGVtZW50aW5nIHBhcnRuZXJzIChieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQpIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJGYWNldGVkIGJ5IGFjdGl2aXR5IikNCiMjIz1pLQ0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyA0LiBQYXJ0bmVycw0KDQpBIHRvdGFsIG9mIDcxIHBhcnRuZXJzIGhhdmUgcmVwb3J0ZWQgaW50byB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyIGFzIG9mIFEyIDIwMjIgLS0gdGhlcmUgYXJlIDQ4IGltcGxlbWVudGluZyBwYXJ0bmVycyBhbmQgMjMgcmVwb3J0aW5nIHBhcnRuZXJzLiANCg0KPGJyPg0KDQpgYGB7ciBiYXJwbG90LWJlZW5lZmljaWFyeS10eXBlfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoaW1wbGVtZW50aW5nID0gbl9kaXN0aW5jdChvcmdfY29kZSksIA0KICAgICAgICAgICAgcmVwb3J0aW5nID0gbl9kaXN0aW5jdChyZXBvcnRfb3JnX2NvZGUpKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhpbXBsZW1lbnRpbmcsIHJlcG9ydGluZyksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJwYXJ0bmVyIiwgDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiY291bnQiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGNvdW50LCANCiAgICAgICAgICAgICBjb2xvdXIgPSBwYXJ0bmVyKSkgKyANCiAgZ2VvbV9wb2ludChzaXplID0gMi41KSArDQogIGdlb21fbGluZShzaXplID0gMS41KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb3VudCksIA0KICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgDQogICAgICAgICAgICB2anVzdCA9IC0uMykgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWItJXkiKSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiI0YzOUMxMiIsICIjMEU2NjU1IikpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiTnVtYmVyIG9mIHBhcnRuZXJzIiwgDQogICAgICAgY29sb3VyID0gIlBhcm50ZXJcbnR5cGUiLA0KICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBwYXJ0bmVycyByZXBvcnRpbmcgYnkgbW9udGgsIGFzIG9mIFEyIDIwMjIiKQ0KDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDQuMSBJbXBsZW1lbnRpbmcgcGFydG5lcg0KDQpUaGVyZSBhcmUgYHIgZnNjICU+JSBmaWx0ZXIocXVhcnRlciA9PSAicTIiKSAlPiUgZGlzdGluY3Qob3JnX2NvZGUpICU+JSBucm93KClgIHBhcnRuZXJzIHRoYXQgd2VyZSBpbnZvbHZlZCBpbiBkaXJlY3QgaW1wbGVtZW50YXRpb24gdGhhdCBoYXZlIHJlcG9ydGVkIGFjaGlldmVtZW50cyBpbiBzZWNvbmQgcXVhcnRlciBvZiAyMDIyLCBpbiBjb21wYXJpc29uIHdpdGggYHIgZnNjICU+JSBmaWx0ZXIocXVhcnRlciA9PSAicTEiKSAlPiUgZGlzdGluY3Qob3JnX2NvZGUpICU+JSBucm93KClgIGluIHRoZSBmaXJzdCBxdWFydGVyLiBUaGVzZSBpbXBsZW1lbnRpbmcgcGFydG5lcnMgY29ycmVzcG9uZGVkIHRvIGEgdG90YWwgb2YgYHIgZnNjICU+JSAgZGlzdGluY3QocmVwb3J0X29yZ19jb2RlKSAlPiUgbnJvdygpYCByZXBvcnRpbmcgb3JnYW5pc2F0aW9ucy4gVGhlIGxhcmdlc3QgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbiwgMjY5MCwgaGFkIDI0IGltcGxlbWVudGluZyBwYXJ0bmVycy4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1yZXBvcnRpbmctb3Jnc30NCmZzYyAlPiUgZ3JvdXBfYnkocmVwb3J0X29yZ19jb2RlKSAlPiUgDQogIHN1bW1hcmlzZShjb3VudCA9IG5fZGlzdGluY3Qob3JnX2NvZGUpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhjb3VudCkpICU+JSANCiAgcmVuYW1lKGltcGxlbWVudGluZ19wYXJ0bmVycyA9IGNvdW50KSAlPiUgDQogIGZpbHRlcihpbXBsZW1lbnRpbmdfcGFydG5lcnMgPiAyKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiUmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnMgd2l0aCB0aGUgbW9zdCBpbXBsZW1lbnRpbmcgcGFydG5lcnMiLCANCiAgICAgICAgZm9ybWF0ID0gImh0bWwiLCANCiAgICAgICAgdGFibGUuYXR0ciA9ICJzdHlsZT0nd2lkdGg6NDUlOyciKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJBbGwgb3RoZXJzIGhhZCAxIG9yIDIgaW1wbGVtZW50aW5nIHBhcnRuZXJzIiwgDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCmBgYA0KDQo8YnI+DQoNClRoZSBpbnRlcmFjdGl2ZSBwbG90IGJlbG93IHNob3dzIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyBhbmQgdG93bnNoaXBzIHJlYWNoZWQgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIuDQoNCmByIGZzYyAlPiUgZ3JvdXBfYnkob3JnX2NvZGUpICU+JSBzdW1tYXJpc2UodG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpKSAlPiUgZmlsdGVyKHRvd25zaGlwcyA+IDUpICU+JSBucm93KClgIHBhcnRuZXJzICgyMSUgb2YgdGhlIHRvdGFsKSBoYXZlIGEgcHJlc2VuY2UgaW4gbW9yZSB0aGFuIDUgdG93bnNoaXBzLiBgciBmc2MgJT4lIGdyb3VwX2J5KG9yZ19jb2RlKSAlPiUgc3VtbWFyaXNlKHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSkgJT4lIGZpbHRlcih0b3duc2hpcHMgPiAxMCkgJT4lIG5yb3coKWAgcGFydG5lcnMgKDE2JSBvZiB0aGUgdG90YWwpIGFyZSBwcmVzZW50IGluIG1vcmUgdGhhbiAxMCB0b3duc2hpcHMuDQoNCjxicj4NCg0KYGBge3IgcGxvdGx5LXBhcnRuZXItc2NhdHRlcn0NCg0KIyBNZWRpYW4gdmFsdWVzIGFyZSB4ID0gNTY3MSBhbmQgeSA9IDMuIEN1cnJlbnRseSB1c2luZyBtZWFuLiANCnBhcnRuZXJfc2NhdHRlciA8LSBmc2MgJT4lICANCiAgZ3JvdXBfYnkob3JnX2NvZGUpICU+JSANCiAgc3VtbWFyaXNlKHN0YXRlcyA9IG5fZGlzdGluY3Qoc3RhdGUpLCANCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSwgDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gdG93bnNoaXBzLCANCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKG9yZ19jb2RlLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0ZXM6ICIsIHN0YXRlcywgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAidG93bnNoaXBzOiAiLCB0b3duc2hpcHMsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlbmVmaWNpYXJpZXM6ICIsIGNvbW1hKGJlbmVmaWNpYXJpZXMsIGFjY3VyYWN5ID0gMSkpKSkgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNDgxNDUuMzMsIGx0eSA9IDIsIGNvbG91ciA9ICJyZWQiKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSA0LjU1NTU1NiwgbHR5ID0gMiwgY29sb3VyID0gInJlZCIpICsgDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzKSwgYWxwaGEgPSAuNykgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZyIsIGxhYmVscyA9IGNvbW1hLCBicmVha3MgPSBjKDAsIDEwMCwgMzAwLCAxMDAwLCAzMDAwLCAxMDAwMCwgMzAwMDAsIDEwMDAwMCwgMzAwMDAwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDI1LCA1KSkgKw0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMiLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIHRvd25zaGlwcyIsDQogICAgICAgdGl0bGUgPSAiUGxvdCBvZiBiZW5lZmljaWFyaWVzIGFuZCB0b3duc2hpcHMgcmVhY2hlZCwgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KZ2dwbG90bHkocGFydG5lcl9zY2F0dGVyLCB0b29sdGlwID0gYygidGV4dCIpLCB3aWR0aCA9IDgyMCkgJT4lDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiQmVuZWZpY2lhcmllcyBhbmQgdG93bnNoaXBzIHJlYWNoZWQsIGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdXNlIG92ZXIgZm9yIGRldGFpbHM7IHNpemVzIGluZGljYXRlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZDsgcmVkIGxpbmVzIGFyZSBtZWFucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9zdXA+IikpKQ0KDQojIE1ha2UgYSBjb21wYXJpc29uIHdpdGggUTENCmBgYA0KDQoNCjxicj4NCg0KQXMgYSByZWZlcmVuY2UsIGluIFExLCBvbmx5IDYgcGFydG5lcnMgKDE3JSBvZiB0aGUgdG90YWwpIGhhdmUgYSBwcmVzZW5jZSBpbiBtb3JlIHRoYW4gNSB0b3duc2hpcHMuIFRoaXMgaGlnaGxpZ2h0cyB0aGF0OiANCg0KKiBUaGUgZXhwYW5zaW9uIG9mIHRoZSBGU0MgbWVtYmVycyBoZWxwIHRvIGNvbGxlY3QgZGF0YSBvbiBmb29kIHNlY3VyaXR5IHByb2dyYW1taW5nIHRoYXQgd2FzIG5vdCBvbiB0aGUgRlNDJ3MgcmFkYXIuIA0KDQoqIEZTQyBwYXJ0bmVycyBhcmUgbWFraW5nIGVmZm9ydHMgdG8gcmVhY2ggdnVsbmVyYWJsZSBncm91cHMgaW4gbmV3IGFyZWFzLiANCg0KT3ZlcmFsbCwgdGhpcyBwb3NpdGl2ZSBjaGFuZ2UgdW5kZXJsaW5lcyB0aGUgZXhwYW5zaW9uIG9mIHRoZSBnZW9ncmFwaGljIGNvdmVyYWdlIG9mIHRoZSBGU0MuIA0KDQo8YnI+PGJyPg0KDQojIyMgNC4yIE1vbnRobHkgcHJvZ3Jlc3MgYnkgcGFydG5lcg0KDQpPcmdhbmlzYXRpb25zIDYxOTcsIDI2OTAgYW5kIDU3MjIgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgbWFqb3JpdHkgb2YgdGhlaXIgYWN0aXZpdGllcyBpbiB0aGUgc2Vjb25kIHF1YXJ0ZXIgb2YgMjAyMi4gDQoNClRoZSB0aGljayBncmV5IGxpbmUgc2hvd3MgYW4gb3JnYW5pc2F0aW9uJ3MgcHJvZ3Jlc3MgZnJvbSBsYXN0IHllYXIsIHdoaWNoLCBhcyBtZW50aW9uZWQsIGNhbm5vdCBleGFjdGx5IGJlIHVzZWQgZm9yIGEgc3RyYWlnaHQgY29tcGFyaXNvbiBhcyB0aGUgc2NvcGUgb2YgdGhlIEhSUCBpbiAyMDIxIHdhcyBkaWZmZXJlbnQgdW50aWwgdGhlIGFwcHJvdmFsIG9mIHRoZSBJRVJQLCBhZGRpdGlvbmFsbHksIG1hbnkgcGFydG5lcnMgb25seSBqb2luZWQgdGhlIGNsdXN0ZXIgbGF0ZSBpbiAyMDIxIG9yIGV2ZW4gaW4gMjAyMi4gU3RpbGwsIGl0IHNlcnZlcyBhcyBhIHJlZmVyZW5jZS4gDQoNCjxicj4NCg0KYGBge3IgcGFydG5lci1wcm9ncmVzcy1mYWNldC1saW5lfQ0KDQpwYXJ0bmVyX3RvcCA8LSBmc2MgJT4lIA0KICBzdW1fYmVuKG9yZ19jb2RlKSAlPiUgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgIG11dGF0ZShvcmdfY29kZSA9IHJlb3JkZXIob3JnX2NvZGUsIC1iZW5lZmljaWFyaWVzKSkgJT4lIHB1bGwob3JnX2NvZGUpICU+JSBoZWFkKDEyKQ0KDQpsaW5lXzIwMjEgPC0gZnNjXzIwMjEgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JQ0KICBmaWx0ZXIob3JnX2NvZGUgJWluJSBwYXJ0bmVyX3RvcCkgJT4lIA0KICBzZWxlY3QoZGF0ZSwgb3JnX2NvZGUsIGJlbmVmaWNpYXJpZXMsIGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgbXV0YXRlKGRhdGUgPSBkYXRlICsgeWVhcnMoMSkpICU+JSANCiAgZ3JvdXBfYnkobG9jYXRpb24sIGFkbWluM19wY29kZSkgJT4lIA0KICBzbGljZSh3aGljaC5tYXgoYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ3JvdXBfYnkob3JnX2NvZGUpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fYmVuID0gY3Vtc3VtKGJlbmVmaWNpYXJpZXMpKQ0KDQpmc2MgJT4lDQogIGZpbHRlcihvcmdfY29kZSAlaW4lIHBhcnRuZXJfdG9wKSAlPiUNCiAgc2VsZWN0KGRhdGUsIG9yZ19jb2RlLCBiZW5lZmljaWFyaWVzID0gbmV3X2JlbmVmaWNpYXJpZXMsIGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgIyByYmluZChmc2NfMjAyMSAlPiUgDQogICMgICAgICAgICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgIyAgICAgICAgIGZpbHRlcihvcmdfY29kZSAlaW4lIHBhcnRuZXJfdG9wKSAlPiUgDQogICMgICAgICAgICBzZWxlY3QoZGF0ZSwgb3JnX2NvZGUsIGJlbmVmaWNpYXJpZXMsIGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgc2xpY2Uod2hpY2gubWF4KGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdyb3VwX2J5KG9yZ19jb2RlKSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY3VtX2JlbikpICsNCiAgZ2VvbV9zdGVwKGRhdGEgPSBsaW5lXzIwMjEsIA0KICAgICAgICAgICAgYWVzKHggPSBkYXRlLCANCiAgICAgICAgICAgICAgICB5ID0gY3VtX2JlbiksIA0KICAgICAgICAgICAgY29sb3VyID0gImdyZXkiLA0KICAgICAgICAgICAgc2l6ZSA9IDIsIA0KICAgICAgICAgICAgYWxwaGEgPSAuNCkgKyANCiAgZ2VvbV92bGluZShjb2xvdXIgPSAicmVkIiwgbHR5ID0gMiwgeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXMuRGF0ZSgiMjAyMi0wNi0wMSIpKSwgYWxwaGEgPSAuNSkgKw0KICBnZW9tX3ZsaW5lKGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyLCB4aW50ZXJjZXB0ID0gYXMubnVtZXJpYyhhcy5EYXRlKCIyMDIyLTAzLTAxIikpLCBhbHBoYSA9IC41KSArDQogIGdlb21fc3RlcChzaXplID0gMC43KSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgZmFjZXRfd3JhcCh+IGZjdF9yZXYoZmN0X3Jlb3JkZXIob3JnX2NvZGUsIGN1bV9iZW4sIG1heCkpLCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1LCBhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIiksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSkgKyAjIHNlZSBpZiB0aGlzIHdvcmtzIHdoZW4geW91IGtuaXQsIHRoZW4gZG8gaXQgZm9yIHRoZSBvdGhlciBwbG90cyANCiAgbGFicyh4ID0gIk1vbnRoIiwgDQogICAgICAgeSA9ICJDdW11bGF0aXZlIGJlbmVmaWNpYXJpZXMiLCANCiAgICAgICB0aXRsZSA9ICJNb250aGx5IHByb2dyZXNzIG9mIHRvcCAxMiBpbXBsZW1lbnRpbmcgcGFydG5lcnMsIDIwMjIgUTEgJiBRMiIsIA0KICAgICAgIHN1YnRpdGxlID0gIkZpZ3VyZXMgc2hvdyBjdW11bGF0aXZlIHVuaXF1ZSBiZW5lZmljaWFyaWVzOyBwcmV2aW91cyB5ZWFyJ3MgcHJvZ3Jlc3MgaW4gZ3JleSIpIA0KDQojIGdnc2F2ZSgicGFydG5lcl9mYWNldF9saW5lLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gNSwgd2lkdGggPSA4LCB1bml0cyA9ICJpbiIpICANCmBgYA0KDQo8YnI+DQoNClRoZSB0YWJsZSBiZWxvdyBsaXN0cyB0aGUgdG9wIDE1IHBhcnRuZXJzIGJ5IG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gMjAyMi4NCg0KPGJyPg0KDQpgYGB7cn0NCmZzYyAlPiUNCiAgZ3JvdXBfYnkobG9jYXRpb24sIGFkbWluM19wY29kZSkgJT4lIA0KICBzbGljZSh3aGljaC5tYXgoYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ3JvdXBfYnkob3JnX2NvZGUsIHF1YXJ0ZXIpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gcXVhcnRlciwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzLCBuYW1lc19wcmVmaXggPSAiYmVuXyIpICU+JSANCiAgcm93d2lzZSgpICU+JSANCiAgbXV0YXRlKHRvdGFsX2JlbiA9IHN1bShiZW5fcTEsIGJlbl9xMiwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUocmFua19xMSA9IGRlbnNlX3JhbmsoLWJlbl9xMSksIA0KICAgICAgICAgcmFua19xMiA9IGRlbnNlX3JhbmsoLWJlbl9xMikpICU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX2JlbikpICU+JSANCiAgc2VsZWN0KG9yZ19jb2RlLCBiZW5fcTEsIHJhbmtfcTEsIGJlbl9xMiwgcmFua19xMiwgdG90YWxfYmVuKSAlPiUgDQogIGhlYWQoMTUpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3AgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiAyMDIyLCBhcyBvZiAzMCBKdW5lIDIwMjIiLCANCiAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKSANCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNC4zIERvbm9ycw0KDQpUaGUgdGFibGUgYmVsb3cgc3VtbWFyaXNlcyB0aGUgcmVhY2ggYW5kIHNjb3BlIChpbiB0ZXJtcyBvZiBnZW9ncmFwaGljIGV4dGVudCBhbmQgbnVtYmVyIG9mIG9yZ2FuaXNhdGlvbnMgc3VwcG9ydGVkKSBvZiBkb25vcnMgd2hvIHN1cHBvcnQgYXQgbGVhc3QgdHdvIHJlcG9ydGluZyBvcmdhbmlzYXRpb25zLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoZG9ub3IpICU+JSANCiAgc3VtbWFyaXNlKHJlcG9ydF9vcmdzID0gbl9kaXN0aW5jdChyZXBvcnRfb3JnX2NvZGUpLCANCiAgICAgICAgICAgIGltcGxlbWVudGluZ19vcmdzID0gbl9kaXN0aW5jdChvcmdfY29kZSksIA0KICAgICAgICAgICAgc3RhdGVzID0gbl9kaXN0aW5jdChhZG1pbjFfcGNvZGUpLCANCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGRvbm9yKSAmIHJlcG9ydF9vcmdzID4gMSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmVwb3J0X29yZ3MpKSAlPiUNCiAgaGVhZCgxNSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIk9yZ2FuaXNhdGlvbnMgc3VwcG9ydGVkIGFuZCBnZW9ncmFwaGljIHJlYWNoIGJ5IGRvbm9yIiwgDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiT25seSBzaG93aW5nIGRvbm9ycyBzdXBwb3J0aW5nIG1vcmUgdGhhbiBvbmUgcmVwb3J0aW5nIHBhcnRuZXIuIiwgDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCiANCmBgYA0KDQo8YnI+DQoNClNhZ2FpbmcsIFNoYW4gKEVhc3QpIGFuZCBBeWV5YXJ3YWR5IGhhdmUgdGhlIGZld2VzdCBudW1iZXIgb2YgZG9ub3JzIHByZXNlbnQuDQoNCjxicj4NCg0KYGBge3IgdGFibGUtZG9ub3Itc3RhdGVzfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGRvbm9ycyA9IG5fZGlzdGluY3QoZG9ub3IpLCANCiAgICAgICAgICAgIGltcGxlbWVudGluZ19wYXJ0bmVycyA9IG5fZGlzdGluY3Qob3JnX2NvZGUpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhkb25vcnMpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiTnVtYmVyIG9mIGRvbm9ycyBieSBzdGF0ZSIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkgDQoNCmBgYA0KDQo8YnI+DQoNCkhvd2V2ZXIsIGFzIHNob3duIGJ5IHRoZSB0YWJsZSBiZWxvdywgZXZlbiB0aG91Z2ggdGhlIG1ham9yaXR5IG9mIHBhcnRuZXJzIHJlcG9ydGVkIHRoZWlyIGRvbm9ycywgdGhlIG9taXNzaW9uIG9mIGRhdGEgZnJvbSB0aHJlZSBrZXkgcGFydG5lcnMgaGFzIHJlc3VsdGVkIGluIHRoZSB2YXN0IG1ham9yaXR5IG9mIHJlcG9ydGVkIGJlbmVmaWNpYXJpZXMgbm90IGJlaW5nIGFzc29jaWF0ZWQgd2l0aCBhbnkgZG9ub3IuDQoNCjxicj4NCg0KYGBge3IgdGFibGUtZG9ub3JzLWJlbmVmaWNpYXJpZXN9DQpmc2MgJT4lIA0KICBncm91cF9ieShkb25vcikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKGRvbm9yID0gaWZlbHNlKGlzLm5hKGRvbm9yKSwgIk5vIGRvbm9yIHNwZWNpZmllZCIsIGRvbm9yKSwgDQogICAgICAgICBkb25vciA9IGlmZWxzZShiZW5lZmljaWFyaWVzIDwgMTAwMCwgIk90aGVyIGRvbm9ycyIsIGRvbm9yKSkgJT4lIA0KICBncm91cF9ieShkb25vcikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUoYCVfYmVuZWZpY2lhcmllc2AgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYCVfYmVuZWZpY2lhcmllc2ApKSAlPiUgDQogIGhlYWQoMTUpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3AgZG9ub3JzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lIA0KICBmb290bm90ZSgiRG9ub3JzIHN0YXJ0aW5nIHdpdGggJ29yZ194eHh4JyBhcmUgcGFydG5lcnMgdXNpbmcgdGhlaXIgb3duIG9yZ2FuaXNhdGlvbmFsIGZ1bmRzIiwgDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIiwNCiAgICAgICAgICAgdGhyZWVwYXJ0dGFibGUgPSBUUlVFKQ0KIA0KYGBgDQoNCjxicj4NCg0KQmVsb3cgaXMgYSB0YWJsZSBvZiBiZW5lZmljaWFyaWVzIHdobyBhcmUgbWlzc2luZyBkb25vcnMsIGdyb3VwZWQgYnkgc3RhdGUuDQoNCjxicj4NCg0KYGBge3IgbWlzc2luZy1kb25vcn0NCmZzYyAlPiUgDQogIGZpbHRlcihpcy5uYShkb25vcikpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChvcmdfY29kZSkpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGZpbHRlcihiZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlJlcG9ydGVkIGJlbmVmaWNpYXJpZXMgd2l0aCBtaXNzaW5nIGRvbm9yIGRhdGEiLCANCiAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDUuIEJlbmVmaWNpYXJpZXMNCg0KYHIgcm91bmQoKGZpbHRlcihmc2MsIGJlbmVmaWNpYXJ5X3R5cGUgPT0gIkhvc3QvbG9jYWwgQ29tbXVuaXR5IikgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9KSAvIChzdW0oZnNjJG5ld19iZW5lZmljaWFyaWVzKSkgKiAxMDAsIGRpZ2l0cyA9IDIpYCUgb2YgYWxsIGJlbmVmaWNpYXJpZXMgaW4gdGhlIGZpcnN0IGhhbGYgb2YgMjAyMiB3ZXJlIGZyb20gaG9zdCBvciBsb2NhbCBjb21tdW5pdGllcy4gDQoNCjxicj48YnI+DQoNCg0KDQpgYGB7cn0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUNCiAgc2VsZWN0KGJlbmVmaWNpYXJ5X3R5cGUsIGJlbmVmaWNpYXJpZXMpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywNCiAgICAgICAgICAgICB5ID0gZmN0X3Jlb3JkZXIoYmVuZWZpY2lhcnlfdHlwZSwgYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgIGZpbGwgPSBiZW5lZmljaWFyeV90eXBlLCANCiAgICAgICAgICAgICBncm91cCA9IGJlbmVmaWNpYXJ5X3R5cGUpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSksIA0KICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGxhYnMoeSA9ICIiLCB4ID0gIkJlbmVmaWNpYXJpZXMiLCANCiAgICAgICB0aXRsZSA9ICJCZW5lZmljYXJpZXMgcmVhY2hlZCBieSBiZW5lZmljaWFyeSB0eXBlIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KYGBgDQo8YnI+PGJyPg0KDQojIyMgNS4xIEJlbmVmaWNpYXJ5IHR5cGVzDQoNCkluIFEyIDIwMjIsIGByIHJvdW5kKGZpbHRlcihmc2MsIGJlbmVmaWNpYXJ5X3R5cGUgPT0gIkhvc3QvbG9jYWwgQ29tbXVuaXR5IiAmIHF1YXJ0ZXIgPT0gInEyIikgJT4lICB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSAvIChmaWx0ZXIoZnNjLCBxdWFydGVyID09ICJxMiIpICU+JSAge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0pICogMTAwLCBkaWdpdHMgPSAyKWAlIG9mIGJlbmVmaWNpYXJpZXMgd2VyZSBmcm9tIGhvc3Qgb3IgbG9jYWwgY29tbXVuaXRpZXMsIGluIGNvbXBhcmlzb24gdG8gYHIgcm91bmQoZmlsdGVyKGZzYywgYmVuZWZpY2lhcnlfdHlwZSA9PSAiSG9zdC9sb2NhbCBDb21tdW5pdHkiICYgcXVhcnRlciA9PSAicTEiKSAlPiUgIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9IC8gc3VtKGZzYyRuZXdfYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpYCUgZm9yIHJvdW5kIDEuIGByIHJvdW5kKGZpbHRlcihmc2MsIGJlbmVmaWNpYXJ5X3R5cGUgPT0gIkludGVybmFsbHkgRGlzcGxhY2VkIiAmIHF1YXJ0ZXIgPT0gInEyIikgJT4lICB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSAvIGZpbHRlcihmc2MsIHF1YXJ0ZXIgPT0gInEyIikgJT4lICB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSAqIDEwMCwgZGlnaXRzID0gMilgJSBvZiBiZW5lZmljaWFyaWVzIGluIFEyIHdlcmUgSURQcywgY29tcGFyZWQgdG8gYHIgcm91bmQoZmlsdGVyKGZzYywgYmVuZWZpY2lhcnlfdHlwZSA9PSAiSW50ZXJuYWxseSBEaXNwbGFjZWQiICYgcXVhcnRlciA9PSAicTEiKSAlPiUgIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9IC8gZmlsdGVyKGZzYywgcXVhcnRlciA9PSAicTEiKSAlPiUgIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9ICogMTAwLCBkaWdpdHMgPSAyKWAlIGZvciBRMS4NCg0KPGJyPg0KDQpgYGB7cn0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGJlbmVmaWNpYXJ5X3R5cGUsIHF1YXJ0ZXIpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbXV0YXRlKGJlbmVmaWNpYXJ5X3R5cGUgPSBmY3RfcmVvcmRlcihiZW5lZmljaWFyeV90eXBlLCBiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICBxdWFydGVyID0gcmVjb2RlKHF1YXJ0ZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAicTEiID0gIlF1YXJ0ZXJfMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAicTIiID0gIlF1YXJ0ZXJfMiIpKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGJlbmVmaWNpYXJ5X3R5cGUsIHggPSBiZW5lZmljaWFyaWVzLCBmaWxsID0gZmN0X3JldihiZW5lZmljaWFyeV90eXBlKSkpICsgDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCBzaXplID0gMywgdmp1c3QgPSAtMC41LCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IG51bWJlcl9mb3JtYXQoc2NhbGUgPSAxIC8gMTAwMCwgc3VmZml4ID0gIksiKSkgKw0KICBzY2FsZV9maWxsX2Rpc2NyZXRlKGd1aWRlID0gIm5vbmUiKSArDQogIGZhY2V0X3Jvdyh2YXJzKHF1YXJ0ZXIpLCBzY2FsZXMgPSAiZnJlZV94Iiwgc3BhY2UgPSAiZnJlZSIpICsgDQogIGxhYnMoeSA9ICIiLA0KICAgICAgIHggPSAiTnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMiLCANCiAgICAgICB0aXRsZSA9ICJQZXJzb25zIHJlYWNoZWQgYnkgYmVuZWZpY2lhcnkgdHlwZSBpbiBRMSAmIFEyIDIwMjIiKSArDQogIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpKQ0KICANCg0KIyBnZ3NhdmUoImJlbmVmaWNpYXJ5X3R5cGVfcTFfMjAyMi5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA1LjIgRXZpZGVuY2Ugb2YgZm9vZCBpbnNlY3VyaXR5IHN0YXR1cw0KDQpPZiB0aGUgZm9vZCBzZWN1cml0eSBhY3Rpdml0aWVzIHJlcG9ydGVkLCB2ZXJ5IGZldyBwcm92aWRlZCBkZXRhaWxzIGFib3V0IHRoZSBmb29kIGluc2VjdXJpdHkgc3RhdHVzIG9mIGJlbmVmaWNpYXJpZXMuIFRoaXMgbWFrZXMgaXQgZGlmZmljdWx0IG90IGRldGVybWluZSB3aGV0aGVyIGludGVydmVudGlvbnMgYXJlIHRydWx5IHJlYWNoaW5nIHRob3NlIG1vc3QgaW4gbmVlZC4NCg0KSW4gZ2VuZXJhbCwgdGhlIGZvb2QgaW5zZWN1cml0eSBzdGF0dXMgb2YgdGhlIGJlbmVmaWNpYXJpZXMgb2YgbXVsdGktcHVycG9zZSBjYXNoIHRyYW5zZmVycyB3ZXJlIG11Y2ggYmV0dGVyIGRvY3VtZW50ZWQgdGhhbiB0aGUgc3RhdHVzZXMgb2YgdGhvc2Ugd2hvIHJlY2VpdmVkIGZvb2QgZGlzdHJpYnV0aW9ucy4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1mb29kLWluc2VjdXJpdHktc3RhdHVzfQ0KZnNjICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoYWN0aXZpdHksICJtb2RlcmF0ZXxzZXZlcmUiKSkgJT4lIA0KICBtdXRhdGUoaGFzX2V2aWRlbmNlID0gaWZlbHNlKGlzLm5hKGV2aWRlbmNlKSwgIm5vIiwgInllcyIpLCANCiAgICAgICAgIGZvb2RfaW5zZWN1cml0eV9zdGF0dXMgPSBpZmVsc2UoaXMubmEoZm9vZF9pbnNlY3VyaXR5X3N0YXR1cyksICJOQSIsIGZvb2RfaW5zZWN1cml0eV9zdGF0dXMpLCANCiAgICAgICAgIGZvb2RfaW5zZWN1cml0eV9zdGF0dXMgPSBmY3RfcmVsZXZlbChmb29kX2luc2VjdXJpdHlfc3RhdHVzLCAiTkEiLCBhZnRlciA9IEluZikpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHksIGZvb2RfaW5zZWN1cml0eV9zdGF0dXMpICU+JQ0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgbXV0YXRlKGFjdGl2aXR5ID0gc3RyX3JlcGxhY2VfYWxsKGFjdGl2aXR5LCAiXFwoaW4ga2luZC92b3VjaGVyL2Nhc2hcXCkiLCAiIiksIA0KICAgICAgICAgYWN0aXZpdHkgPSBzdHJfcmVwbGFjZV9hbGwoYWN0aXZpdHksICJcXChNUENcXCkiLCAiIiksIA0KICAgICAgICAgYWN0aXZpdHkgPSBzdHJfcmVwbGFjZV9hbGwoYWN0aXZpdHksICIgLCAiLCAiLCAiKSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eSkgJT4lIA0KICBtdXRhdGUoYCVfb2ZfZ3JvdXBgID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgZmlsdGVyKGZvb2RfaW5zZWN1cml0eV9zdGF0dXMgPT0gIk5BIikgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIk1pc3NpbmcgZm9vZCBpbnNlY3VyaXR5IGRhdGEgb2YgYmVuZWZpY2lhcmllcywgYXMgb2YgMzAgSnVuZSAyMDIyIiwgDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIiksIA0KICAgICAgICBmb3JtYXQgPSAiaHRtbCIsIA0KICAgICAgICB0YWJsZS5hdHRyID0gInN0eWxlPSd3aWR0aDo4MCU7JyIpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikNCmBgYA0KDQo8YnI+DQoNCkV2aWRlbmNlIG9mIGJlbmVmaWNpYXJpZXMnIGZvb2QgaW5zZWN1cml0eSBzdGF0dXMgcHJvdmlkZWQgdG8gdGhlIGNsdXN0ZXIgaW5jbHVkZToNCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1mcy1ldmlkZW5jZX0NCmZzYyAlPiUgDQogIG11dGF0ZShldmlkZW5jZSA9IGNhc2Vfd2hlbihldmlkZW5jZSAlaW4lIGMoIjAuOTciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOTglIG9mIEhIIGhhdmUgQWNjZXB0YWJsZSBGQ1MiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOTklIG9mIGhvdXNlaG9sZHMgaGF2ZSBhY2NlcHRhYmxlIEZDUyIpIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY2NlcHRhYmxlIEZDUyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZpZGVuY2UgJWluJSBjKCJQRE0gcmVwb3J0IiwgIlBvc3QgRGlzdHJpYnV0aW9uIE1vbml0b3JpbmciKSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9zdC1kaXN0cmlidXRpb24gbW9uaXRvcmluZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChldmlkZW5jZSwgImNvbnN1bXB0aW9ufGludGFrZSIpIH4gIkFjY2VwdGFibGUgRkNTIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmlkZW5jZSAlaW4lIGMoIlByb3Zpc2lvbi9TdXBwb3J0IFJlcG9ydCIsICJNRFIiKSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVndWxhciByZXBvcnRpbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoZXZpZGVuY2UpIH4gIk5vIGV2aWRlbmNlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gZXZpZGVuY2UpLCANCiAgICAgICAgIGV2aWRlbmNlID0gZmN0X3JlbGV2ZWwoZXZpZGVuY2UsICJObyBldmlkZW5jZSIsIGFmdGVyID0gSW5mKSkgJT4lIA0KICBncm91cF9ieShldmlkZW5jZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKGAlX2JlbmVmaWNpYXJpZXNgID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiRXZpZGVuY2Ugb2YgZm9vZCBpbnNlY3VyaXR5IHN0YXR1cywgYXMgb2YgMzAgSnVuZSAyMDIyIiwgDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQoNCjxicj4NCg0KVGhlIGdlbmVyYWwgbGFjayBvZiBldmlkZW5jZSBvZiBldmlkZW5jZSBvZiBiZW5lZmljaWFyaWVzJyBmb29kIGluc2VjdXJpdHkgc3RhdHVzIG1ha2VzIGl0IGRpZmZpY3VsdCB0byBqdXN0aWZ5IHRvIGFmZmVjdGVkIGNvbW11bml0aWVzIGFuZCBkb25vcnMgdGhhdCB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyIGlzIHJlYWNoaW5nIHRoZSBtb3N0IGluIG5lZWQuIFRoaXMgaGlnaGxpZ2h0cyB0aGUgbmVlZCB0byBwcm9tb3RlIGEgc2hhcmVkIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHJlc3BvbnNlIHRocm91Z2ggdGhlIGRldmVsb3BtZW50IG9mIGEgY29tbW9uIHByaW9yaXRpc2F0aW9uIHRvb2wgZm9yIGZvb2Qgc2VjdXJpdHkgcGFydG5lcnMuDQoNCjxicj48YnI+PGJyPg0KDQojIyMgNS4zIEJlbmVmaWNpYXJ5IGRpc2FnZ3JlZ2F0aW9uDQoNCkluIHRoaXMgc2VjdGlvbiwgYSB0ZXN0IGlzIGFwcGxpZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBkaXNhZ2dyZWdhdGVkIG51bWJlcnMgb2YgYmVuZWZpY2lhcmllcyByZWFjaCBoYXZlIGJlZW4gY29waWVkIGFuZCBwYXN0ZWQgLS0gYSBzb21ld2hhdCBjb21tb24gcHJhY3RpY2UgdGhhdCBzdWxsaWVzIHRoZSBxdWFsaXR5IG9mIHRoZSBkYXRhLiBUbyBkbyB0aGlzLCB0aGUgcHJvcG9ydGlvbnMgb2YgZWFjaCBkaXNhZ2dyZWdhdGlvbiBncm91cCBieSBwYXJ0bmVyIGhhdmUgYmVlbiBjb21wYXJlZCB0byBob3cgY2xvc2UgdGhleSB3ZXJlIHRvIHRoZSBtZWFuIGZvciB0aGUgZW50aXJlIGdyb3VwLiBUbyBleHBsYWluOiBpZiBwYXJ0bmVyIEEgcmVwb3J0ZWQgdGhhdCA0MCUgb2YgYmVuZWZpY2lhcmllcyBpbiBhbiBhY3Rpdml0eSB3ZXJlIGFkdWx0IGZlbWFsZXMsIHRoaXMgcGVyY2VudGFnZSB3YXMgdGhlbiBjb21wYXJlZCB0byB0aGUgYXZlcmFnZSBwZXJjZW50YWdlIG9mIGFkdWx0IGZlbWFsZXMgZm9yIGFsbCBvdGhlciBhY3Rpdml0aWVzIHJlcG9ydGVkIGJ5IHRoYXQgcGFydG5lci4gVGhpcyBtZWFzdXJlIHdoZXRoZXIgb3Igbm90IHRoZSBzYW1lIHByb3BvcnRpb25zIHdlcmUgY29waWVkIGFuZCBwYXN0ZWQgdGhyb3VnaG91dCB0aGUgNVcgZm9ybS4NCg0KSXQgaXMgZXh0cmVtZWx5IHVubGlrZWx5IHRoYXQgdGhlc2UgcGVyY2VudGFnZXMgd291bGQgYmUgc2ltaWxhciBhY3Jvc3MgYWN0aXZpdGllcyBhcyBpbXBsZW1lbnRpbmcgcGFydG5lcnMgd29ya2VkIGluIGFuIGF2ZXJhZ2Ugb2YgYHIgcm91bmQoZnNjICU+JSBncm91cF9ieShvcmdfY29kZSkgJT4lIHN1bW1hcmlzZShsb2NhdGlvbnMgPSBuX2Rpc3RpbmN0KGxvY2F0aW9uKSkgJT4lIHttZWFuKC4kbG9jYXRpb25zKX0sIGRpZ2l0cyA9IDIpYCBsb2NhdGlvbnMuDQoNCkluIHRoZSBwbG90IGJlbG93LCB0aGUgY2xvc2VyIGEgdmFsdWUgaXMgdG8gMCUgb24gdGhlIHgtYXhpcywgdGhlIG1vcmUgbGlrZWx5IGl0IGlzIHRoYXQgaXQgd2FzIGNvcGllZCBhbmQgcGFzdGVkLiBJdCBpcyBlc3RpbWF0ZWQgdGhhdCA3MyUgb2YgYmVuZWZpY2lhcnkgZGlzYWdncmVnYXRpb24gdmFsdWVzIHdlcmUgY29waWVkIGFuZCBwYXN0ZWQuIEFsbCBlbnRyaWVzIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHJlZCBsaW5lIGFyZSBjb25zaWRlcmVkIHNpbWlsYXIgZW5vdWdoIHRvIG90aGVyIHJvd3MgdG8gYmUgdHJlYXRlZCBhcyBoYXZpbmcgYmVlbiBjb3BpZWQgYW5kIHBhc3RlZC4gDQoNCjxicj4NCg0KYGBge3J9DQpmc2NfZGlzYWdnIDwtIGZzYyAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhjaGlsZF9tYWxlOmVsZGVybHlfZmVtYWxlKSwgbmFtZXNfdG8gPSAiZGlzYWdnIiwgdmFsdWVzX3RvID0gImJlbl9zdWIiKSAlPiUgDQogIGxlZnRfam9pbih0cmliYmxlKA0KICAgIH5hZ2UsIH5zZXgsIH5kaXNhZ2csIH52YWx1ZSwgDQogICAgImNoaWxkIiwgIm1hbGUiLCAiY2hpbGRfbWFsZSIsIDAuMTYyOTg5OTg5LA0KICAgICJjaGlsZCIsICJmZW1hbGUiLCAiY2hpbGRfZmVtYWxlIiwgMC4xNTg5MDA4ODMsDQogICAgImFkdWx0IiwgIm1hbGUiLCAiYWR1bHRfbWFsZSIsIDAuMjcxNDUwODMxLA0KICAgICJhZHVsdCIsICJmZW1hbGUiLCAiYWR1bHRfZmVtYWxlIiwgMC4zMDA0NDQ1ODUsDQogICAgImVsZGVybHkiLCAibWFsZSIsICJlbGRlcmx5X21hbGUiLCAwLjA0NDAyOTQyMywNCiAgICAiZWxkZXJseSIsICJmZW1hbGUiLCAiZWxkZXJseV9mZW1hbGUiLCAwLjA2MjE4NDI5DQogICAgKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChkaXNhZ2csIGNlbnN1c19wcm9wID0gdmFsdWUpLCBieSA9ICJkaXNhZ2ciKSAlPiUNCiAgZmlsdGVyKGJlbl9zdWIgIT0gMCkgJT4lIA0KICBtdXRhdGUoYmVuX3Byb3AgPSBiZW5fc3ViIC8gYmVuZWZpY2lhcmllcywgDQogICAgICAgICBiZW5fcHJvcF9jb21wYXJlID0gYWJzKGNlbnN1c19wcm9wIC0gYmVuX3Byb3ApIC8gY2Vuc3VzX3Byb3AsDQogICAgICAgICBzYW1lX2FzX2NlbnN1cyA9IGlmZWxzZShiZW5fcHJvcF9jb21wYXJlIDwgMC4wNSwgImJhY2tmaWxsZWQiLCAicmVhbCIpKQ0KDQpmc2NfZGlzYWdnX3ZhbHVlcyA8LSBmc2NfZGlzYWdnICU+JSANCiAgZmlsdGVyKG5ld19iZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICBncm91cF9ieShzYW1lX2FzX2NlbnN1cykgJT4lIA0KICBzdW1tYXJpc2UoYmVuX3N1YiA9IHN1bShiZW5fc3ViKSkgJT4lIA0KICBhZG9ybl9wZXJjZW50YWdlcygiY29sIikgJT4lICANCiAgbXV0YXRlKGJlbl9zdWIgPSByb3VuZChiZW5fc3ViICogMTAwLCBkaWdpdHMgPSAyKSkNCmBgYA0KDQoNCmBgYHtyIGRpc2FnZy1oaXN0b2dyYW19DQpmc2NfZGlzYWdnICU+JSANCiAgZmlsdGVyKG5ld19iZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICBtdXRhdGUocGNfZGlzYWdnID0gYmVuX3N1YiAvIGJlbmVmaWNpYXJpZXMpICU+JSANCiAgZ3JvdXBfYnkob3JnX2NvZGUsIGRpc2FnZykgJT4lIA0KICBtdXRhdGUobWVhbiA9IG1lYW4ocGNfZGlzYWdnKSwgDQogICAgICAgICAgICBzZCA9IHNkKHBjX2Rpc2FnZywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIGJlbl9zdWIgPSBzdW0oYmVuX3N1YiwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUoY2F0ID0gaWZlbHNlKHNkID49IC4wNSwgInJlYWwiLCAiZmFrZSIpLCANCiAgICAgICAgIGNhdCA9IGlmZWxzZShpcy5uYShjYXQpLCAicmVhbCIsIGNhdCkpICU+JSANCiAgIyBncm91cF9ieShjYXQpICU+JSANCiAgIyBzdW1tYXJpc2VfYXQoIm5ld19iZW5lZmljaWFyaWVzIiwgc3VtKSAlPiUgDQogICMgbXV0YXRlKHBjICA9IG5ld19iZW5lZmljaWFyaWVzIC8gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkNCiAgZmlsdGVyKHNkIDw9IDEpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gc2QpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IC4wMikgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLjA1LCBsdHkgPSAyLCBjb2xvdXIgPSAicmVkIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMCwgMSwgYnkgPSAuMikpICsNCiAgbGFicyh4ID0gIlBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBmcm9tIGdyb3VwIG1lYW4iLCANCiAgICAgICB0aXRsZSA9ICJIaXN0b2dyYW0gb2Ygc3RhbmRhcmQgZGV2aWF0aW9ucyBhY3Jvc3MgYmVuZWZpY2lhcnkgZGlzYWdncmVnYXRpb25zIiwgDQogICAgICAgc3VidGl0bGUgPSAiVGhlIGxvd2VyIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24sIHRoZSBtb3JlIGxpa2VseSB0aGUgdmFsdWUgaXMgdG8gYmUgY29weS9wYXN0ZWQuXG5DdXQtb2ZmIGlzIHRoZSByZWQgbGluZS4iKSANCg0KYGBgDQoNCjxicj4NCg0KVGhlIHBsb3Qgb24gdGhlIGJlbG93LWxlZnQgc2hvd3MgdGhlIGJyZWFrZG93biBvZiBiZW5lZmljaWFyaWVzIGJ5IGRpc2FnZ3JlZ2F0aW9uIGdyb3VwIHdpdGggdGhlIGNvcHktcGFzdGVkIHZhbHVlcyByZW1vdmVkLiBUaGUgcGxvdCBvbiB0aGUgYmVsb3ctcmlnaHQgc2hvd3MgYSBicmVha2Rvd24gb2YgdGhlICJmYWtlIiBjb3B5LXBhc3RlZCB2YWx1ZXMuIA0KDQo8YnI+DQoNCmBgYHtyIGJhcnBsb3QtZGlzYWdnfQ0KZnNjX2Rpc2FnZyAlPiUgDQogIGZpbHRlcihuZXdfYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgbXV0YXRlKHBjX2Rpc2FnZyA9IGJlbl9zdWIgLyBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGdyb3VwX2J5KG9yZ19jb2RlLCBkaXNhZ2cpICU+JSANCiAgbXV0YXRlKG1lYW4gPSBtZWFuKHBjX2Rpc2FnZyksIA0KICAgICAgICAgICAgc2QgPSBzZChwY19kaXNhZ2csIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBiZW5fc3ViID0gc3VtKGJlbl9zdWIsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbXV0YXRlKGNhdCA9IGlmZWxzZShzZCA+PSAuMDUsICJyZWFsIiwgImZha2UiKSwgDQogICAgICAgICBjYXQgPSBpZmVsc2UoaXMubmEoY2F0KSwgInJlYWwiLCBjYXQpKSAlPiUgDQogIGZpbHRlcihjYXQgPT0gInJlYWwiKSAlPiUNCiAgZ3JvdXBfYnkoZGlzYWdnKSAlPiUgDQogIHN1bW1hcmlzZV9hdCgiYmVuX3N1YiIsIHN1bSkgJT4lIA0KICBtdXRhdGUocGMgPSBiZW5fc3ViIC8gc3VtKGJlbl9zdWIpLCANCiAgICAgICAgIGRpc2FnZyA9IGZjdF9yZWxldmVsKGRpc2FnZywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJjaGlsZF9tYWxlIiwgImNoaWxkX2ZlbWFsZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR1bHRfbWFsZSIsICJhZHVsdF9mZW1hbGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVsZGVybHlfbWFsZSIsICJlbGRlcmx5X2ZlbWFsZSIpKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGRpc2FnZywgeSA9IHBjLCBmaWxsID0gZGlzYWdnKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChwYywgYWNjdXJhY3kgPSAuMSkpLCB2anVzdCA9IC0uMSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsgDQogIGxhYnMoeCA9ICJEaXNhZ2dyZWdhdGlvbiBncm91cCIsIA0KICAgICAgIHkgPSAiUGVyY2VudGFnZSBvZiBhbGwgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIlJlYWwgdmFsdWVzIC0tIGFnZSBhbmQgc2V4IGJyZWFrZG93biIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKyANCiAgDQpmc2NfZGlzYWdnICU+JSANCiAgZmlsdGVyKG5ld19iZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICBtdXRhdGUocGNfZGlzYWdnID0gYmVuX3N1YiAvIGJlbmVmaWNpYXJpZXMpICU+JSANCiAgZ3JvdXBfYnkob3JnX2NvZGUsIGRpc2FnZykgJT4lIA0KICBtdXRhdGUobWVhbiA9IG1lYW4ocGNfZGlzYWdnKSwgDQogICAgICAgICAgICBzZCA9IHNkKHBjX2Rpc2FnZywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIGJlbl9zdWIgPSBzdW0oYmVuX3N1YiwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUoY2F0ID0gaWZlbHNlKHNkID49IC4wNSwgInJlYWwiLCAiZmFrZSIpLCANCiAgICAgICAgIGNhdCA9IGlmZWxzZShpcy5uYShjYXQpLCAicmVhbCIsIGNhdCkpICU+JSANCiAgZmlsdGVyKGNhdCA9PSAiZmFrZSIpICU+JQ0KICBncm91cF9ieShkaXNhZ2cpICU+JSANCiAgc3VtbWFyaXNlX2F0KCJiZW5fc3ViIiwgc3VtKSAlPiUgDQogIG11dGF0ZShwYyA9IGJlbl9zdWIgLyBzdW0oYmVuX3N1YiksIA0KICAgICAgICAgZGlzYWdnID0gZmN0X3JlbGV2ZWwoZGlzYWdnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoImNoaWxkX21hbGUiLCAiY2hpbGRfZmVtYWxlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHVsdF9tYWxlIiwgImFkdWx0X2ZlbWFsZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWxkZXJseV9tYWxlIiwgImVsZGVybHlfZmVtYWxlIikpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZGlzYWdnLCB5ID0gcGMsIGZpbGwgPSBkaXNhZ2cpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KHBjLCBhY2N1cmFjeSA9IC4xKSksIHZqdXN0ID0gLS4xKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKyANCiAgbGFicyh4ID0gIkRpc2FnZ3JlZ2F0aW9uIGdyb3VwIiwgDQogICAgICAgeSA9ICJQZXJjZW50YWdlIG9mIGFsbCBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgdGl0bGUgPSAiRmFrZSB2YWx1ZXMgLS0gYWdlIGFuZCBzZXggYnJlYWtkb3duIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpIA0KDQpgYGANCg0KDQoNCjxicj48YnI+PGJyPg0KDQoNCiMjIDYuIENvbXBhcmlzb24gd2l0aCB0YXJnZXRzDQoNCiMjIyA2LjEgUmVhY2hlZCB2cyB0YXJnZXQgYnkgdG93bnNoaXANCg0KVGhlIHNwZWNpZmljcyBvZiBlYWNoIHRvd25zaGlwIGNhbiBiZSByZXZpZXdlZCB3aXRoIHRoZSBpbnRlcmFjdGl2ZSBwbG90IGJlbG93LiBFYWNoIHBvaW50IGlzIGEgdG93bnNoaXAsIHdpdGggdGhlIHNpemUgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMuIFRoZSB4LWF4aXMgaW5kaWNhdGVzIHRoZSB0YXJnZXQgcG9wdWxhdGlvbiBieSB0b3duc2hpcCBhbmQgdGhlIHktYXhpcyBzaG93cyB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCwgYXMgb2YgUTIgMjAyMi4NCg0KVGhlIHJlZCBsaW5lIGRvd24gdGhlIG1pZGRsZSByZXByZXNlbnRzIHJlYWNoaW5nIDEwMCUgb2YgdGhlIHRhcmdldC4gVG93bnNoaXBzIGFib3ZlIHRoaXMgbGluZSBoYXZlIHJlYWNoZWQgbW9yZSBiZW5lZmljaWFyaWVzIHRoYW4gdGhlaXIgdGFyZ2V0IGFuZCB0b3duc2hpcHMgYmVsb3cgdGhlIGxpbmUgaGF2ZSBub3QgbWV0IHRoZWlyIHRhcmdldCB5ZXQuIFRoZSBmdXJ0aGVyIGF3YXkgYSB0b3duc2hpcCBpcyBmcm9tIHRoZSByZWQgbGluZSwgdGhlIGZ1cnRoZXIgYWJvdmUgb3IgYmVsb3cgaXRzIHRhcmdldCBpdCBpcy4gTW91c2Ugb3ZlciBlYWNoIG9mIHRoZSB0b3duc2hpcHMgdG8gc2VlIG1vcmUgZGV0YWlscy4NCg0KVGhlIDEzIHRvd25zaGlwcyBhbG9uZyB0aGUgZXh0cmVtZSBsZWZ0IHNpZGUgb2YgdGhlIHBsb3QgaGF2ZSBiZW5lZmljaWFyaWVzIGJ1dCBkbyBub3QgaGF2ZSB0YXJnZXRzICh0aGVpciB0YXJnZXRzIGhhdmUganVzdCBiZWVuIGNvZGVkIGFzIDEgc28gdGhhdCB0aGV5IHNob3cgdXAgb24gdGhlIHBsb3QpLiAyMDkgdG93bnNoaXBzIHdpdGggdGFyZ2V0cyBoYXZlIG5vdCBiZWVuIHJlYWNoZWQuDQoNCg0KPGJyPg0KDQpgYGB7ciBwbG90bHktdHNwLWNvbXBhcmlzb24tcmVhY2hlZC10YXJnZXR9DQoNCmJlbl90YXJnZXQgPC0gZnNjICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlX29sZCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3Qob3JnX2NvZGUpKSAlPiUgDQogIGxlZnRfam9pbihwaW4sIGJ5ID0gYygiYWRtaW4zX3Bjb2RlX29sZCIgPSAiYWRtaW4zX3Bjb2RlIikpICU+JSANCiAgbXV0YXRlKHJlYWNoZWRfcGMgPSBiZW5lZmljaWFyaWVzIC8gZnNfdGFyZ2V0ZWQsDQogICAgICAgICByZWFjaGVkX3BjID0gaWZlbHNlKGlzLmluZmluaXRlKHJlYWNoZWRfcGMpLCAxLCByZWFjaGVkX3BjKSwNCiAgICAgICAgIGZzX3RhcmdldGVkID0gaWZlbHNlKGZzX3RhcmdldGVkID09IDAgJiBiZW5lZmljaWFyaWVzID4gMCwgMSwgZnNfdGFyZ2V0ZWQpLA0KICAgICAgICAgZnNfdGFyZ2V0ZWQgPSByb3VuZChmc190YXJnZXRlZCwgZGlnaXRzID0gMCkpICU+JSANCiAgYXJyYW5nZShkZXNjKHJlYWNoZWRfcGMpKSAlPiUgDQogIHNlbGVjdChzdGF0ZSwgdG93bnNoaXAsIGZzX3BpbiwgZnNfdGFyZ2V0ZWQsIGJlbmVmaWNpYXJpZXMsIHJlYWNoZWRfcGMsIHBhcnRuZXJzKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZnNfdGFyZ2V0ZWQsIHkgPSBiZW5lZmljaWFyaWVzLCBjb2xvdXIgPSBwYXJ0bmVycywgDQogICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCh0b3duc2hpcCwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzOiAiLCBjb21tYShiZW5lZmljaWFyaWVzLCBhY2N1cmFjeSA9IDEpLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDogIiwgY29tbWEoZnNfdGFyZ2V0ZWQsIGFjY3VyYWN5ID0gMSksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiJSBvZiB0YXJnZXQ6ICIsIHBlcmNlbnQocmVhY2hlZF9wYywgYWNjdXJhY3kgPSAyKSwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAicGFydG5lcnM6ICIsIHBhcnRuZXJzKSkpICsgDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSwgbHR5ID0gMiwgY29sb3VyID0gInJlZCIpICsgDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IC41LCBzbG9wZSA9IDEsIGx0eSA9IDIsIGNvbG91ciA9ICJncmV5Iiwgc2l6ZSA9IC40KSArIA0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAtLjUsIHNsb3BlID0gMSwgbHR5ID0gMiwgY29sb3VyID0gImdyZXkiLCBzaXplID0gLjQpICsgDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzKSwgYWxwaGEgPSAwLjgpICsNCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKGd1aWRlID0gIm5vbmUiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBsYWJlbHMgPSBjb21tYSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbGFiZWxzID0gY29tbWEpICsNCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEsIGJyZWFrcyA9IGMoMCwgMiwgNSwgOCwgMTApKSArDQogIGxhYnMoeCA9ICJUYXJnZXRlZCBwb3B1bGF0aW9uIiwgeSA9ICJCZW5lZmljaWFyaWVzIiwgDQogICAgICAgdGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIHZzIHRhcmdldGVkIHBvcHVsYXRpb24gYnkgdG93bnNoaXAsIFExIDIwMjIiLA0KICAgICAgIHN1YnRpdGxlID0gIlRoZSByZWQgbGluZSBpcyAxMDAlIG9mIHRhcmdldCIpICsgDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpDQoNCmdncGxvdGx5KGJlbl90YXJnZXQsIHRvb2x0aXAgPSBjKCJ0ZXh0IiksIHdpZHRoID0gODIwLCBoZWlnaHQgPSA1MDApICU+JSANCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCJCZW5lZmljaWFyaWVzIHZzIHRhcmdldCBieSB0b3duc2hpcCwgYXMgb2YgUTIgMjAyMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSByZWQgbGluZSBpcyAxMDAlIG9mIHRhcmdldDsgc2l6ZSBpbmRpY2F0ZXMgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMiLCI8L3N1cD4iKSksIA0KICAgICAgICAgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNykpKQ0KDQpgYGANCg0KDQo8YnI+DQoNCldoZW4gY29tcGFyZWQgdG8gdGhlIHJlc3VsdHMgZm9yIFExIDIwMjIsIGl0IGlzIGNsZWFyIHRoYXQgdGhlIGFyZWFzIHdoaWNoIGFscmVhZHkgaGF2ZSBleGNlZWRlZCB0aGVpciB0YXJnZXRzIChhYm92ZSB0aGUgcmVkIGxpbmUpIGhhdmUgYWN0dWFsbHkgcmVjZWl2ZWQgZXZlbiBtb3JlIGFzc2lzdGFuY2UgaW4gdGhlIHNlY29uZCBxdWFydGVyIG9mIDIwMjIuIA0KDQo8YnI+DQoNCmBgYHtyIHBsb3RseS10c3AtY29tcGFyaXNvbi1yZWFjaGVkLXRhcmdldC0yMDIxfQ0KDQpiZW5fdGFyZ2V0IDwtIGZzYyAlPiUgDQogIGZpbHRlcihxdWFydGVyID09ICJxMSIpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlX29sZCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3Qob3JnX2NvZGUpKSAlPiUgDQogIGxlZnRfam9pbihwaW4sIGJ5ID0gYygiYWRtaW4zX3Bjb2RlX29sZCIgPSAiYWRtaW4zX3Bjb2RlIikpICU+JSANCiAgbXV0YXRlKHJlYWNoZWRfcGMgPSBiZW5lZmljaWFyaWVzIC8gZnNfdGFyZ2V0ZWQsDQogICAgICAgICByZWFjaGVkX3BjID0gaWZlbHNlKGlzLmluZmluaXRlKHJlYWNoZWRfcGMpLCAxLCByZWFjaGVkX3BjKSwNCiAgICAgICAgIGZzX3RhcmdldGVkID0gaWZlbHNlKGZzX3RhcmdldGVkID09IDAgJiBiZW5lZmljaWFyaWVzID4gMCwgMSwgZnNfdGFyZ2V0ZWQpLA0KICAgICAgICAgZnNfdGFyZ2V0ZWQgPSByb3VuZChmc190YXJnZXRlZCwgZGlnaXRzID0gMCkpICU+JSANCiAgYXJyYW5nZShkZXNjKHJlYWNoZWRfcGMpKSAlPiUgDQogIHNlbGVjdChzdGF0ZSwgdG93bnNoaXAsIGZzX3BpbiwgZnNfdGFyZ2V0ZWQsIGJlbmVmaWNpYXJpZXMsIHJlYWNoZWRfcGMsIHBhcnRuZXJzKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZnNfdGFyZ2V0ZWQsIHkgPSBiZW5lZmljaWFyaWVzLCBjb2xvdXIgPSBwYXJ0bmVycywgDQogICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCh0b3duc2hpcCwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzOiAiLCBjb21tYShiZW5lZmljaWFyaWVzLCBhY2N1cmFjeSA9IDEpLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDogIiwgY29tbWEoZnNfdGFyZ2V0ZWQsIGFjY3VyYWN5ID0gMSksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiJSBvZiB0YXJnZXQ6ICIsIHBlcmNlbnQocmVhY2hlZF9wYywgYWNjdXJhY3kgPSAyKSwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAicGFydG5lcnM6ICIsIHBhcnRuZXJzKSkpICsgDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSwgbHR5ID0gMiwgY29sb3VyID0gInJlZCIpICsgDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IC41LCBzbG9wZSA9IDEsIGx0eSA9IDIsIGNvbG91ciA9ICJncmV5Iiwgc2l6ZSA9IC40KSArIA0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAtLjUsIHNsb3BlID0gMSwgbHR5ID0gMiwgY29sb3VyID0gImdyZXkiLCBzaXplID0gLjQpICsgDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzKSwgYWxwaGEgPSAwLjgpICsNCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKGd1aWRlID0gIm5vbmUiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBsYWJlbHMgPSBjb21tYSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbGFiZWxzID0gY29tbWEpICsNCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEpICsNCiAgbGFicyh4ID0gIlRhcmdldGVkIHBvcHVsYXRpb24iLCB5ID0gIkJlbmVmaWNpYXJpZXMiLCANCiAgICAgICB0aXRsZSA9ICJCZW5lZmljaWFyaWVzIHZzIHRhcmdldCBieSB0b3duc2hpcCwgKipRMSoqIDIwMjIiLA0KICAgICAgIHN1YnRpdGxlID0gIlRoZSByZWQgbGluZSBpcyAxMDAlIG9mIHRhcmdldCIpICsgDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpDQoNCmdncGxvdGx5KGJlbl90YXJnZXQsIHRvb2x0aXAgPSBjKCJ0ZXh0IiksIHdpZHRoID0gODIwLCBoZWlnaHQgPSA1MDApICU+JSANCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCJCZW5lZmljaWFyaWVzIHJlYWNoZWQgdnMgdGFyZ2V0ZWQgcG9wdWxhdGlvbiBieSB0b3duc2hpcCwgUTEgMjAyMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSByZWQgbGluZSBpcyAxMDAlIG9mIHRhcmdldDsgc2l6ZSBpbmRpY2F0ZXMgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMiLCI8L3N1cD4iKSksIA0KICAgICAgICAgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNykpKQ0KDQpgYGANCg0KPGJyPg0KDQpUaGUgdGFibGUgYmVsb3cgc2hvd3MgdGhlIHRvcCB0b3duc2hpcHMgaW4gdGVybXMgb2Ygb3ZlcnJlYWNoLiANCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1vdmVycmVhY2hlZC10b3duc2hpcHN9DQoNCmZzYyAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZV9vbGQsIHF1YXJ0ZXIpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBxdWFydGVyLCB2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMsIA0KICAgICAgICAgICAgICB2YWx1ZXNfZmlsbCA9IDApICAlPiUgDQogIG11dGF0ZShiZW5lZmljaWFyaWVzID0gcTEgKyBxMikgJT4lIA0KICByaWdodF9qb2luKHBpbiAlPiUgDQogICAgICAgICAgICAgICBzZWxlY3Qoc3RhdGUsIHRvd25zaGlwLCBhZG1pbjNfcGNvZGUsIA0KICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGZzX3RhcmdldGVkKSwgDQogICAgICAgICAgICAgYnkgPSBjKCJhZG1pbjNfcGNvZGVfb2xkIiA9ICJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUocGMgPSBiZW5lZmljaWFyaWVzIC8gdGFyZ2V0LCANCiAgICAgICAgIHBjID0gaWZlbHNlKGlzLmluZmluaXRlKHBjKSwgMCwgcGMpLCANCiAgICAgICAgIGdhcCA9IHRhcmdldCAtIGJlbmVmaWNpYXJpZXMpICU+JSANCiAgYXJyYW5nZShnYXApICU+JSANCiAgaGVhZCgxNSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyh0YXJnZXQsIGdhcCksIH4gcm91bmQoLngsIGRpZ2l0cyA9IDApKSAlPiUNCiAgbXV0YXRlKHBjID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHRhcmdldCAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgUTEgPSBxMSwgUTIgPSBxMiwgDQogICAgICAgICBiZW5lZmljaWFyaWVzLCB0YXJnZXQsIGdhcCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvcCAxNSBtb3N0IG92ZXJyZWFjaGVkIHRvd25zaGlwcyIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigpDQogIA0KICANCmBgYA0KDQo8YnI+DQoNCkluIG1vc3Qgb2YgdGhlIHRvd25zaGlwcyB3aGVyZSB0aGUgZm9vZCBzZWN1cml0eSBjbHVzdGVyIGlzIHByZXNlbnQsIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGlzIHVuZGVyIHRoZSBjbHVzdGVyIHRhcmdldC4gTm90IGVuY291cmFnaW5nbHksIHRoZSBmYXN0ZXN0IGdyb3dpbmcgZ3JvdXAgb2YgdG93bnNoaXBzIGFyZSB0aG9zZSB3aGVyZSB0aGUgdGFyZ2V0IGhhcyBiZWVuIGV4Y2VlZGVkLiBUb3duc2hpcHMgc3VjaCBhcyBIbGFpbmd0aGFyeWEsIHdoaWNoIHdlcmUgYWxyZWFkeSBmYXIgb3ZlciB0aGVpciB0YXJnZXQgaW4gUTEsIGNvbnRpbnVlZCB0byBhZGQgYmVuZWZpY2lhcmllcyBpbiBRMiwgYW5kIG5vdyBzdGFuZHMgYXQgMzgxJSBvZiB0YXJnZXQuIFNpbWlsYXIgYXJlYXMgaW5jbHVkZSBTaHdlcHlpdGhhciAoMzQwJSBvZiB0YXJnZXQpLCBEYWxhICgyODklKSwgTm9ydGggT2trYWxhcGEgKDMxNCUpIGFuZCBCdXRoaWRhdW5nICg2NjMlKS4NCg0KPGJyPg0KDQpgYGB7cn0NCmZzYyAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBxdWFydGVyLCB2YWx1ZXNfZnJvbSA9IG5ld19iZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHExICsgcTIpICU+JSANCiAgbGVmdF9qb2luKGZzYyAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSA9IGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSkgJT4lIA0KICByaWdodF9qb2luKHBpbiwgYnkgPSBjKCJhZG1pbjNfcGNvZGVfb2xkIiA9ICJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICBtdXRhdGUocmVhY2ggPSBjYXNlX3doZW4ocTEgPT0gMCB+ICJub3RfcmVhY2hlZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTEgPiBmc190YXJnZXRlZCAqIDEuMSB+ICJvdmVycmVhY2giLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHExID4gZnNfdGFyZ2V0ZWQgKiAuOSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxMSA8PSBmc190YXJnZXRlZCAqIDEuMSB+ICJvbl90YXJnZXQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHExIDw9IGZzX3RhcmdldGVkICogLjkgfiAidW5kZXIiKSkgICU+JQ0KICBncm91cF9ieShyZWFjaCkgJT4lDQogIHN1bW1hcmlzZSh0b3duc2hpcHNfUTEgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSkpICU+JSANCiAgbGVmdF9qb2luKA0KICAgIGZzYyAlPiUNCiAgICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBxdWFydGVyLCB2YWx1ZXNfZnJvbSA9IG5ld19iZW5lZmljaWFyaWVzLCANCiAgICAgICAgICAgICAgICB2YWx1ZXNfZmlsbCA9IDApICU+JSANCiAgICBtdXRhdGUodG90YWwgPSBxMSArIHEyKSAlPiUgDQogICAgbGVmdF9qb2luKGZzYyAlPiUgDQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlID0gYWRtaW4zX3Bjb2RlX29sZCkgJT4lIA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkpICU+JQ0KICAgICAgcmlnaHRfam9pbihwaW4sIGJ5ID0gYygiYWRtaW4zX3Bjb2RlX29sZCIgPSAiYWRtaW4zX3Bjb2RlIikpICU+JQ0KICAgICAgcmVwbGFjZV9uYShsaXN0KGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lDQogICAgICBtdXRhdGUocmVhY2ggPSBjYXNlX3doZW4odG90YWwgPT0gMCB+ICJub3RfcmVhY2hlZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgPiBmc190YXJnZXRlZCAqIDEuMSB+ICJvdmVycmVhY2giLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsID4gZnNfdGFyZ2V0ZWQgKiAuOSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCA8PSBmc190YXJnZXRlZCAqIDEuMSB+ICJvbl90YXJnZXQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsIDw9IGZzX3RhcmdldGVkICogLjkgfiAidW5kZXIiKSkgJT4lIA0KICAgICAgZ3JvdXBfYnkocmVhY2gpICU+JQ0KICAgICAgc3VtbWFyaXNlKHRvd25zaGlwc19RMiA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSksIA0KICAgIGJ5ID0gInJlYWNoIikgJT4lICANCiAgbXV0YXRlKGNhdGVnb3J5ID0gZmN0X3JlbGV2ZWwocmVhY2gsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJ1bmRlciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbl90YXJnZXQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3ZlcnJlYWNoIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdF9yZWFjaGVkIikpLCANCiAgICAgICAgIHJhbmdlID0gY2FzZV93aGVuKGNhdGVnb3J5ID09ICJ1bmRlciIgfiAiPDkwJSBvZiB0YXJnZXQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5ID09ICJvbl90YXJnZXQiIH4gIj49OTAlIGFuZCA8IDExMCUgb2YgdGFyZ2V0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9PSAib3ZlcnJlYWNoIiB+ICI+PSAxMTAlIG9mIHRhcmdldCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnkgPT0gIm5vdF9yZWFjaGVkIiB+ICIwJSBvZiB0YXJnZXQiKSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHJhbmdlKSkgJT4lIA0KICBzZWxlY3QoY2F0ZWdvcnksIHJhbmdlLCB0b3duc2hpcHNfUTEsIHRvd25zaGlwc19hc19vZl9RMl8yMDIyID0gdG93bnNoaXBzX1EyKSAlPiUNCiAgYXJyYW5nZShjYXRlZ29yeSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvd25zaGlwcyBieSBwZXJjZW50YWdlIG9mIHRhcmdldCByZWFjaGVkIiwNCiAgICAgICAgZm9ybWF0ID0gImh0bWwiLCANCiAgICAgICAgdGFibGUuYXR0ciA9ICJzdHlsZT0nd2lkdGg6NzAlOyciKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpDQogIA0KICANCiAgDQpgYGANCg0KPGJyPg0KDQpUaGUgbnVtYmVyIG9mIHRvd3NoaXBzIHdpdGggZm9vZCBzZWN1cml0eSB0YXJnZXRzIG5vdCByZWFjaGVkIGhhcyByZWR1Y2VkIGZyb20gMTA2IGluIFExIHRvIDc4IGluIFEyLiANCg0KPGJyPjxicj4NCg0KIyMjIDYuMiBNYXAgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGluIFExICYgUTIgMjAyMiB2cyB0YXJnZXQNCg0KYGBge3IgbWFwcy1iZW4tdGFyZ2V0LCBmaWcuaGVpZ2h0PTE0fQ0KZnNjICU+JSANCiAgZmlsdGVyKHF1YXJ0ZXIgPT0gInExIikgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUgPSBhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9IGMoImFkbWluM19wY29kZSIpKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBiZW5lZmljaWFyaWVzKSwgc2l6ZSA9IDAuMSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgdHJhbnMgPSAibG9nMTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDUwMDAwMCksDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTkwIikgKyANCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAnY20nKSwgDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gIndoaXRlIikpICsNCiAgbGFicyh0aXRsZSA9ICJCZW5lZmljaWFyaWVzIFExIDIwMjIsIGJ5IHRvd25zaGlwIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJ0b3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICsNCiAgDQpmc2MgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUgPSBhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9IGMoImFkbWluM19wY29kZSIpKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBiZW5lZmljaWFyaWVzKSwgc2l6ZSA9IDAuMSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgdHJhbnMgPSAibG9nMTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDUwMDAwMCksDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTkwIikgKyANCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAnY20nKSwgDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gIndoaXRlIikpICsNCiAgbGFicyh0aXRsZSA9ICJCZW5lZmljaWFyaWVzIFRvdGFsIDIwMjIgYXMgb2YgUTIgMjAyMiwgYnkgdG93bnNoaXAiLA0KICAgICAgIHN1YnRpdGxlID0gInRvd25zaGlwcyBpbiBncmV5IGRvIG5vdCBoYXZlIGFueSBwYXJ0bmVycyBwcmVzZW50IiwgDQogICAgICAgZmlsbCA9ICJCZW5lZmljaWFyaWVzIikgKw0KcGluICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gZnNfdGFyZ2V0ZWQpLCBzaXplID0gLjEpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGRpcmVjdGlvbiA9IC0xLCB0cmFucyA9ICJsb2cxMCIsICANCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDUwMDAwMCksDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IHJhbmdlKDU3LCA4MDE3NjApLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5OTAiKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNywgJ2NtJyksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJ3aGl0ZSIpKSArDQogICAgbGFicyh0aXRsZSA9ICJUYXJnZXQgYnkgdG93bnNoaXAiLA0KICAgICAgICAgc3VidGl0bGUgPSAidG93bnNoaXBzIGluIGdyZXkgZG8gbm90IGZvb2Qgc2VjdXJpdHkgdGFyZ2V0cyIsIA0KICAgICAgICAgZmlsbCA9ICJ0YXJnZXQiKSArIA0KICANCnBpbiAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGZzX3BpbiksIHNpemUgPSAuMSkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoZGlyZWN0aW9uID0gLTEsIHRyYW5zID0gImxvZzEwIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgNTAwMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gcmFuZ2UoNTcsIDgwMTc2MCksIA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyYXk5MCIpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC43LCAnY20nKSwgDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gIndoaXRlIikpICsNCiAgICBsYWJzKHRpdGxlID0gIlBlb3BsZSBpbiBOZWVkIGJ5IHRvd25zaGlwIiwNCiAgICAgICAgIHN1YnRpdGxlID0gInRvd25zaGlwcyBpbiBncmV5IGRvIG5vdCBmb29kIHNlY3VyaXR5IHRhcmdldHMiLCANCiAgICAgICAgIGZpbGwgPSAiUElOIikNCiAgDQoNCiMgZ2dzYXZlKCJ0YXJnZXRfYnlfdHNwLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gMTgsIHdpZHRoID0gMTEsIHVuaXRzID0gImluIikNCg0KDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDYuMyBJbnRlcmFjdGl2ZSByZWZlcmVuY2UgdGFibGUNCg0KSW4gdGhlIGludGVyYWN0aXZlIHRhYmxlIGJlbG93LCBpcyBhIGxpc3Qgb2YgdG93bnNoaXBzIHNvcnRlZCBieSB0aGUgZ2FwIGJldHdlZW4gdGhlIHRhcmdldGVkIHBvcHVsYXRpb24gYW5kIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiAyMDIyLiBBbnkgb2YgdGhlIGNvbHVtbnMgY2FuIGJlIHNvcnQ7IHRoZSBzZWFyY2ggYmFycyBhYm92ZSBlYWNoIGNvbHVtbiBjYW4gYWxzbyBhc3Npc3QgaW4gZmlsdGVyaW5nLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlX29sZCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3Qob3JnX2NvZGUpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGluLCBieSA9IGMoImFkbWluM19wY29kZV9vbGQiID0gImFkbWluM19wY29kZSIpKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChiZW5lZmljaWFyaWVzID0gMCkpICU+JQ0KICBtdXRhdGUocmVhY2hlZF9wYyA9IGJlbmVmaWNpYXJpZXMgLyBmc190YXJnZXRlZCwNCiAgICAgICAgIHJlYWNoZWRfcGMgPSBpZmVsc2UoaXMuaW5maW5pdGUocmVhY2hlZF9wYyksIDEsIHJlYWNoZWRfcGMpLA0KICAgICAgICAgcmVhY2hlZF9wYyA9IHJvdW5kKHJlYWNoZWRfcGMgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIGZzX3RhcmdldGVkID0gcm91bmQoZnNfdGFyZ2V0ZWQsIGRpZ2l0cyA9IDApLCANCiAgICAgICAgIGdhcCA9IGZzX3RhcmdldGVkIC0gYmVuZWZpY2lhcmllcykgJT4lIA0KICBhcnJhbmdlKGdhcCkgJT4lIA0KICBzZWxlY3Qoc3RhdGUsIHRvd25zaGlwLCB0YXJnZXQgPSBmc190YXJnZXRlZCwgYmVuZWZpY2lhcmllcywgDQogICAgICAgICBnYXAsIGAlX3JlYWNoZWRgID0gcmVhY2hlZF9wYywgcGFydG5lcnMpICU+JSANCiAgZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxNSwgc2Nyb2xsWCA9IFRSVUUpLCANCiAgICAgICAgICAgIGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOmJsYWNrOyBmb250LXNpemU6MTIwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2UgdGFibGUgLS0gdG93bnNoaXBzIikpICU+JSANCiAgZm9ybWF0Um91bmQoYygidGFyZ2V0IiwgImJlbmVmaWNpYXJpZXMiLCAiZ2FwIiksIGRpZ2l0cyA9IDApICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODAlIiwgZm9udFNpemUgPSAiODAlIikNCg0KDQoNCmBgYA0KDQoNCg0KDQoNCg==