by Jiray Avedisian
DUE Methods I - Fall 2021
Research Overview
The Gowanus Neighborhood Plan, is an 82-block redevelopment of the area surrounding the Gowanus Canal in Brooklyn, New York for increased residential, industrial, and commercial development. After over a decade of writing, planning, and engaging with the community, the Gowanus Neighborhood Plan was approved by the City Planning Commission to rezone the Greater Gowanus area in spring of 2021. Shortly after, the New York City Office of the Public Advocate passed Intro 1572-2019-B, a new law that requires Racial Equity Reports for land use changes moving forward as part of the Uniform Land Use Review Process (ULURP). The Gowanus Neighborhood Plan is the first rezoning project to have its own Racial Equity Report under this new law. As the first of its kind, it presents a unique opportunity for critical analysis. In the Gowanus Racial Equity Report, Gowanus is represented as a white and wealthy neighborhood. Through quantitative and spatial analyses, the report concludes with support for the Gowanus Neighborhood Plan redevelopment because, as it claims, the rezoning will increase racial diversity in the area.
The Report builds its characterization of Gowanus as a wealthy and white “high-opportunity zone,” by examining demographic, economic, and housing data from the 2006-2010 and 2015-2019 5-Year ACS “within a half mile of the GNP.” Ultimately, they analyze this data at the Community Board level. I examine select data represented in the Report at three different scales relative to Greater Gowanus: Community District Tabulation Area, Neighborhood Tabulation Area, and Selected Census tracts. If the characterization of Gowanus as wealthy and white is true, the results should resemble the Report’s description at each scale. Specifically, I analyze Gowanus income data disaggregated by race and select housing statistics, including median rent, median housing costs, and median home value, from the 2006-2010 and 2015-2019 American Community Surveys. Additionally, I analyze vacancy rates from the 2000 and 2020 Decennial Census.
Research Question:
Does the Gowanus Racial Equity Report’s characterization of the neighborhood as white, and specific to my research, wealthy maintain at scales smaller than the Community Board?
Context
In many of their analyses, the Racial Equity Report uses a large territory of Northwest Brooklyn, combining Community Board 2 and Community Board 6. However, Gowanus itself is relatively small (six census tracts in 2020) and entirely located within the bounds of Community Board 6. The rezoning territory does overlap with Community Board 2, but only for a half block. While combining the two community boards yields a lower margin of error, as reasoned in the report, it is useful to present the data at various scales, providing nuance to the local context rather than broad characterizations. This also strengthens a critique of the Racial Equity Report’s methodological approach as a whole.
While the new law enforcing the creation of a Racial Equity Report (RER) for land use changes has good intentions— quantitative data can be manipulated and are not objective facts. Analysis of data presented in the Report at the above three scales provides greater transparency and opportunity for reflection.
Three Boundaries of Gowanus
To investigate the boundaries used in the Racial Equity Report, I selected three alternative boundaries for Gowanus: by Community District Tabulation Areas (Community Board), Neighborhood Tabulation Areas, and by hand-selecting census tracts that match with the Google maps boundaries of Gowanus.
These three different boundaries yield different populations:
* In Community Board 6, we see the largest geographic size and highest population, 168,648 in 2020.
* The Neighborhood Tabulation Area is slightly smaller, with a population of 109,775 in 2020.
* The smallest boundary is a hand-selection census tracts that align with Google maps and common definitions of Gowanus, a population of 24,956 in 2020.
(Provided courtesy of Jordan Packer.)
Neighborhood Tabulation Areas

Selected Census Tracts

Data sources and analysis
For my analyses, I draw from the U.S. Decennial Census 2020 and 2000 housing unit, occupancy, and vacancy data. Additionally, I draw heavily from the 5-Year American Community Surveys (ACS) from 2006-2010 and 2015-2019 for income, rent, housing cost, and home value data. The Decennial data provides greater precision, as it is an exact count rather than an estimate as is the case with the ACS. The ACS provides incredibly helpful data when aggregated to larger geographic scales, which can reduce the margin of error of the data. The Racial Equity Report uses data from the American Community Survey to analyze housing and income trends. For smaller areas, using ACS data yields a higher margin of error. While this higher margin of error may make some data analysis statistically unreliable, it can indicate broader trends.
Results
Vacancy Maps
Mapping the vacancy rate at the tract level across the three scales can illustrate how vacancy rates differ across census tracts within CB6.
Looking at the selected Gowanus census tracts, vacancy is quite high in tract 121 (13%), middling in tracts 75, 77, 117, and tract 119.01, and low in tracts 71 and 127.
Looking at the data side by side, it is clear that the average vacancy rate of the selected census tracts is higher than that of the NTA, while the NTA vacancy rate is higher than the CDTA rate.

Vacancy has risen at a much higher rate between 2000 and 2020 within the selected tracts versus at the Community Board and neighborhood level.
In 2000, the vacancy rate in the Gowanus census tracts was actually lower than the NTA average.
Rent and Housing
Median rent appears to be higher across Community Board 6 than at the selected census tract level. This could result from the high levels of protected housing in the Gowanus area, and that the most densely populated census tracts in the Gowanus neighborhood house NYCHA developments.
We can observe this same trend when looking at Housing Costs, which include utilities and other housing expenses. Housing Costs for Community Board 6 and the Gowanus NTA are nearly identical.
While home value data from the 2015-2019 ACS is unreliable at the selected tract level, home values at the Community Board and NTA levels are roughly equal.
Results
This data was analyzed in order to determine whether the Gowanus Racial Equity Report’s characterization of Gowanus as a wealthy, white neighborhood maintains at three different scales: that of the Community Board/Community District Tabulation Area, the neighborhood/Neighborhood Tabulation Area, and select census tracts. The data available in the ACS 2006-2010 and 2015-2019 suggest that trends in median household income, rent, housing costs, and vacancy at the Community Board 6 or even Gowanus NTA level are not representative of trends at the local/tract level. They also indicate disparities across demographics, particularly when looking at MHI data disaggregated by race. Finally, they indicate that rent, housing costs, home values, and vacancy rates across Community Board 6 (and at the NTA and tract level) have increased, while MHI has increased only when looking at the total and white populations at each scale.
Examining the discrepancy in findings among MHI data at the three geographic scales appears to counter the RER’s assertion that the neighborhood of Gowanus is a wealthy area. To be clear, there is wealth among certain sections of the population that tracks across geographic scales. The data suggest the white population in the selected Gowanus census tracts earns within $6,000 of the total population in Community Board 6. However, when examining the data for Black and Latinx populations across the three scales, MHI is substantially lower even when aggregated by race up to the Community Board.
Many of the general trends identified in the Racial Equity Report are affirmed when looking at this data at the Community Board level. The Report notes that over the past twenty years, rents have increased. Income for the white population has increased while earnings have stagnated among the Black and Latinx populations across CB6. In some instances, patterns like increasing vacancy rates track across the three scales but grow in intensity when looking at only select census tract data. Examining data such as MHI, especially disaggregated by race, at each scale illuminates additional trends, such as much lower MHI among Black and Latinx residents in comparison to whites. Examining this data at each scale also indicates that while data analyzed at the Community Board level may be representative of trends across the total and white populations, they do not represent trends among Black and Latinx populations at any scale.
This appears to indicate that broad generalizations of wealth and whiteness made about Community Board 6 do not track with the local reality within Gowanus itself. More specifically, using data aggregated to the Community Board level to extrapolate trends at smaller geographical scales is ineffective and, in this case, obfuscates the reality within the local context.
Next Steps
This analysis would be strengthened by examining income and housing data in the Decennial 2020 census. Since the Decennial Census is an exact count, rather than an estimate (such as in the American Community Survey), data will be more accurate. Reassessing and analyzing the data once the entire contents of the Decennial Census are released will allow for greater precision when examining variables such as median household income by race, as well as rent, housing costs, and home values.
Additionally, analysis of additional variables such as rent burden, employment rates, and commute times to places of work can broaden and deepen our understanding of historical demographic and economic shifts in Gowanus, while providing more accurate data to make future projections.
Since the Gowanus Neighborhood Plan has been passed, it will be even more important to examine these and future data in order to verify the conclusions made in the Racial Equity Report, particularly that the rezoning of Gowanus will support racial integration within a “white, wealthy high opportunity zone.”
Methods Appendix - Sources
Occupancy Status: U.S. Census Bureau, Occupancy Status, 2020 and 2000 Census retrieved November 29, 2021 using tidycensus R package:
* Total Housing Units
* Occupied Housing Units
* Vacant Housing Units
Median Household Income U.S. Census Bureau, “Median Household Income in the Past 12 Months by Race/Ethnicity” **2015-19 American Community Survey 5-year estimates, 2006-10 American Community Survey 5-year estimates, retrieved November 29, 2021 using tidycensus R package. MHI Total Population
* MHI Non-Hispanic White Population
* MHI Non-Hispanic Black Population
* MHI Hispanic/Latino Population
Median Gross Rent U.S. Census Bureau, “Median Gross Rent (Dollars)”**2015-19 American Community Survey 5-year estimates, 2006-10 American Community Survey 5-year estimates, retrieved November 29, 2021 using tidycensus R package.
Median Gross Rent
Median Monthly Housing Costs U.S. Census Bureau, “Median Monthly Housing Costs (Dollars)”**2015-19 American Community Survey 5-year estimates, 2006-10 American Community Survey 5-year estimates, retrieved November 29, 2021 using tidycensus R package.
Median Monthly Housing Costs
Median Home Value U.S. Census Bureau, “Median Value (Dollars)”**2015-19 American Community Survey 5-year estimates, 2006-10 American Community Survey 5-year estimates, retrieved November 29, 2021 using tidycensus R package.
Median Home Value
Shape files used:
* Community District Tabulation Areas (CDTAs) NYC Open Data, Community District Tabulation Areas 2020 retrieved November 29, 2021 using NYC Open Data shape file and imported with sf R package.
* Neighborhood Tabulation Areas (NTAs) NYC Open Data, Neighborhood Tabulation Areas 2020 retrieved November 29, 2021 using NYC Open Data shape file and imported with sf R package.
* Selected Census Tracts NYC Open Data, Census Tracts 77, 75, 71, 127, 119, 121, 117 retrieved November 29, 2021 using NYC Open Data.
Methods
Vacancy Rate is calculated as:
Vacant Housing Units divided by Total Housing Units
Summary statistics generated for each variable at the community board, neighborhood tabulation area, and census tract level using summarise( ). These summary tables were exported as Excel documents (writexlsx). I collated the data into the three boundaries we are seeking. I then re-imported the data into R through readxl.
LS0tCnRpdGxlOiAiQ291bnRlci1BbmFseXppbmcgSG91c2luZyBhbmQgRWNvbm9taWMgVHJlbmRzIGluIEdvd2FudXMiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzQnCiAgICB0b2NfZmxvYXQ6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodGlkeWNlbnN1cykKb3B0aW9ucyh0aWdyaXNfdXNlX2NhY2hlID0gVFJVRSkKbGlicmFyeShzZikKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KG9wZW54bHN4KQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGdyaWRFeHRyYSkKCnJhd19uYWJlcyA8LSBzdF9yZWFkKCJyYXcvbnludGEyMDIwXzIxYy9ueW50YTIwMjAuc2hwIikKcmF3X2NiIDwtIHN0X3JlYWQoInJhdy8yMDIwIENvbW11bml0eSBEaXN0cmljdCBUYWJ1bGF0aW9uIEFyZWFzIChDRFRBcykvZ2VvX2V4cG9ydF9mNzliYTE1OC1lNGNkLTRjNTgtYjI4ZS0yNGQ1OTIyOGY5YTguc2hwIikKcmF3X25hYmVzXzIwMTAgPC0gc3RfcmVhZCgicmF3L255bnRhMjAxMF8yMWQvbnludGEyMDEwLnNocCIpCgojIENvcnJlY3QgQ0RUQSBwcm9qZWN0aW9uIHRvIDIyNjMuCnJhd19jYl8yMjYzIDwtIHJhd19jYiAlPiUKICBzdF90cmFuc2Zvcm0oMjI2MykKCiMgU2VsZWN0IGRlc2lyZWQgdmFyaWFibGVzIGZyb20gQ0RUQSBzcGF0aWFsIGRhdGEgZnJhbWUuCmNicyA8LSByYXdfY2JfMjI2MyAlPiUKICBzZWxlY3QoYm9yb25hbWUsIGNvdW50eWZpcHMsIGNkdGEyMDIwLCBjZHRhbmFtZSkKCm5hYmVzIDwtIHJhd19uYWJlcyAlPiUKICBzZWxlY3QoQm9yb05hbWUsIENvdW50eUZJUFMsIE5UQTIwMjAsIE5UQU5hbWUpCgpuYWJlc18yMDEwIDwtIHJhd19uYWJlc18yMDEwICU+JQogIHNlbGVjdChCb3JvTmFtZSwgQ291bnR5RklQUywgTlRBQ29kZSwgTlRBTmFtZSkKYGBgCgoqKmJ5IEppcmF5IEF2ZWRpc2lhbioqPGJyPgoqKkRVRSBNZXRob2RzIEkgLSBGYWxsIDIwMjEqKjxicj4KCiMjIFJlc2VhcmNoIE92ZXJ2aWV3CgpUaGUgW0dvd2FudXMgTmVpZ2hib3Job29kIFBsYW5dKGh0dHBzOi8vd3d3MS5ueWMuZ292L3NpdGUvcGxhbm5pbmcvcGxhbnMvZ293YW51cy9nb3dhbnVzLWZyYW1ld29yay5wYWdlKSwgaXMgYW4gODItYmxvY2sgcmVkZXZlbG9wbWVudCBvZiB0aGUgYXJlYSBzdXJyb3VuZGluZyB0aGUgR293YW51cyBDYW5hbCBpbiBCcm9va2x5biwgTmV3IFlvcmsgZm9yIGluY3JlYXNlZCByZXNpZGVudGlhbCwgaW5kdXN0cmlhbCwgYW5kIGNvbW1lcmNpYWwgZGV2ZWxvcG1lbnQuIEFmdGVyIG92ZXIgYSBkZWNhZGUgb2Ygd3JpdGluZywgcGxhbm5pbmcsIGFuZCBlbmdhZ2luZyB3aXRoIHRoZSBjb21tdW5pdHksIHRoZSBHb3dhbnVzIE5laWdoYm9yaG9vZCBQbGFuIHdhcyBhcHByb3ZlZCBieSB0aGUgQ2l0eSBQbGFubmluZyBDb21taXNzaW9uIHRvIHJlem9uZSB0aGUgR3JlYXRlciBHb3dhbnVzIGFyZWEgaW4gc3ByaW5nIG9mIDIwMjEuIFNob3J0bHkgYWZ0ZXIsIHRoZSBOZXcgWW9yayBDaXR5IE9mZmljZSBvZiB0aGUgUHVibGljIEFkdm9jYXRlIHBhc3NlZCBJbnRybyAxNTcyLTIwMTktQiwgYSBuZXcgbGF3IHRoYXQgcmVxdWlyZXMgUmFjaWFsIEVxdWl0eSBSZXBvcnRzIGZvciBsYW5kIHVzZSBjaGFuZ2VzIG1vdmluZyBmb3J3YXJkIGFzIHBhcnQgb2YgdGhlIFVuaWZvcm0gTGFuZCBVc2UgUmV2aWV3IFByb2Nlc3MgKFVMVVJQKS4gVGhlIEdvd2FudXMgTmVpZ2hib3Job29kIFBsYW4gaXMgdGhlIGZpcnN0IHJlem9uaW5nIHByb2plY3QgdG8gaGF2ZSBpdHMgb3duIFJhY2lhbCBFcXVpdHkgUmVwb3J0IHVuZGVyIHRoaXMgbmV3IGxhdy4gQXMgdGhlIGZpcnN0IG9mIGl0cyBraW5kLCBpdCBwcmVzZW50cyBhIHVuaXF1ZSBvcHBvcnR1bml0eSBmb3IgY3JpdGljYWwgYW5hbHlzaXMuIEluIHRoZSBHb3dhbnVzIFtSYWNpYWwgRXF1aXR5IFJlcG9ydF0oaHR0cHM6Ly9jb3VuY2lsLm55Yy5nb3YvbGFuZC11c2UvcGxhbnMvZ293YW51cy1uZWlnaGJvcmhvb2QtcGxhbi1yYWNpYWwtZXF1aXR5LXJlcG9ydC1vbi1ob3VzaW5nLWFuZC1vcHBvcnR1bml0eS8pLCBHb3dhbnVzIGlzIHJlcHJlc2VudGVkIGFzIGEgd2hpdGUgYW5kIHdlYWx0aHkgbmVpZ2hib3Job29kLiA8Yj5UaHJvdWdoIHF1YW50aXRhdGl2ZSBhbmQgc3BhdGlhbCBhbmFseXNlcywgdGhlIHJlcG9ydCBjb25jbHVkZXMgd2l0aCBzdXBwb3J0IGZvciB0aGUgR293YW51cyBOZWlnaGJvcmhvb2QgUGxhbiByZWRldmVsb3BtZW50IGJlY2F1c2UsIGFzIGl0IGNsYWltcywgdGhlIHJlem9uaW5nIHdpbGwgaW5jcmVhc2UgcmFjaWFsIGRpdmVyc2l0eSBpbiB0aGUgYXJlYS48L2I+CgpUaGUgUmVwb3J0IGJ1aWxkcyBpdHMgY2hhcmFjdGVyaXphdGlvbiBvZiBHb3dhbnVzIGFzIGEgd2VhbHRoeSBhbmQgd2hpdGUg4oCcaGlnaC1vcHBvcnR1bml0eSB6b25lLOKAnSBieSBleGFtaW5pbmcgZGVtb2dyYXBoaWMsIGVjb25vbWljLCBhbmQgaG91c2luZyBkYXRhIGZyb20gdGhlIDIwMDYtMjAxMCBhbmQgMjAxNS0yMDE5IDUtWWVhciBBQ1Mg4oCcd2l0aGluIGEgaGFsZiBtaWxlIG9mIHRoZSBHTlAu4oCdIFVsdGltYXRlbHksIHRoZXkgYW5hbHl6ZSB0aGlzIGRhdGEgYXQgdGhlIENvbW11bml0eSBCb2FyZCBsZXZlbC4gSSBleGFtaW5lIHNlbGVjdCBkYXRhIHJlcHJlc2VudGVkIGluIHRoZSBSZXBvcnQgYXQgdGhyZWUgZGlmZmVyZW50IHNjYWxlcyByZWxhdGl2ZSB0byBHcmVhdGVyIEdvd2FudXM6IENvbW11bml0eSBEaXN0cmljdCBUYWJ1bGF0aW9uIEFyZWEsIE5laWdoYm9yaG9vZCBUYWJ1bGF0aW9uIEFyZWEsIGFuZCBTZWxlY3RlZCBDZW5zdXMgdHJhY3RzLiBJZiB0aGUgY2hhcmFjdGVyaXphdGlvbiBvZiBHb3dhbnVzIGFzIHdlYWx0aHkgYW5kIHdoaXRlIGlzIHRydWUsIHRoZSByZXN1bHRzIHNob3VsZCByZXNlbWJsZSB0aGUgUmVwb3J04oCZcyBkZXNjcmlwdGlvbiBhdCBlYWNoIHNjYWxlLiBTcGVjaWZpY2FsbHksIEkgYW5hbHl6ZSBHb3dhbnVzIGluY29tZSBkYXRhIGRpc2FnZ3JlZ2F0ZWQgYnkgcmFjZSBhbmQgc2VsZWN0IGhvdXNpbmcgc3RhdGlzdGljcywgaW5jbHVkaW5nIG1lZGlhbiByZW50LCBtZWRpYW4gaG91c2luZyBjb3N0cywgYW5kIG1lZGlhbiBob21lIHZhbHVlLCBmcm9tIHRoZSAyMDA2LTIwMTAgYW5kIDIwMTUtMjAxOSBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5cy4gQWRkaXRpb25hbGx5LCBJIGFuYWx5emUgdmFjYW5jeSByYXRlcyBmcm9tIHRoZSAyMDAwIGFuZCAyMDIwIERlY2VubmlhbCBDZW5zdXMuIAoKIyMjIyBSZXNlYXJjaCBRdWVzdGlvbjoKPGI+RG9lcyB0aGUgR293YW51cyBSYWNpYWwgRXF1aXR5IFJlcG9ydOKAmXMgY2hhcmFjdGVyaXphdGlvbiBvZiB0aGUgbmVpZ2hib3Job29kIGFzIHdoaXRlLCBhbmQgc3BlY2lmaWMgdG8gbXkgcmVzZWFyY2gsIHdlYWx0aHkgbWFpbnRhaW4gYXQgc2NhbGVzIHNtYWxsZXIgdGhhbiB0aGUgQ29tbXVuaXR5IEJvYXJkPzwvYj4KCiMjIENvbnRleHQKSW4gbWFueSBvZiB0aGVpciBhbmFseXNlcywgdGhlIFJhY2lhbCBFcXVpdHkgUmVwb3J0IHVzZXMgYSBsYXJnZSB0ZXJyaXRvcnkgb2YgTm9ydGh3ZXN0IEJyb29rbHluLCBjb21iaW5pbmcgQ29tbXVuaXR5IEJvYXJkIDIgYW5kIENvbW11bml0eSBCb2FyZCA2LiBIb3dldmVyLCBHb3dhbnVzIGl0c2VsZiBpcyByZWxhdGl2ZWx5IHNtYWxsIChzaXggY2Vuc3VzIHRyYWN0cyBpbiAyMDIwKSBhbmQgZW50aXJlbHkgbG9jYXRlZCB3aXRoaW4gdGhlIGJvdW5kcyBvZiBDb21tdW5pdHkgQm9hcmQgNi4gVGhlIHJlem9uaW5nIHRlcnJpdG9yeSBkb2VzIG92ZXJsYXAgd2l0aCBDb21tdW5pdHkgQm9hcmQgMiwgYnV0IG9ubHkgZm9yIGEgaGFsZiBibG9jay4gV2hpbGUgY29tYmluaW5nIHRoZSB0d28gY29tbXVuaXR5IGJvYXJkcyB5aWVsZHMgYSBsb3dlciBtYXJnaW4gb2YgZXJyb3IsIGFzIHJlYXNvbmVkIGluIHRoZSByZXBvcnQsIGl0IGlzIHVzZWZ1bCB0byBwcmVzZW50IHRoZSBkYXRhIGF0IHZhcmlvdXMgc2NhbGVzLCBwcm92aWRpbmcgbnVhbmNlIHRvIHRoZSBsb2NhbCBjb250ZXh0IHJhdGhlciB0aGFuIGJyb2FkIGNoYXJhY3Rlcml6YXRpb25zLiBUaGlzIGFsc28gc3RyZW5ndGhlbnMgYSBjcml0aXF1ZSBvZiB0aGUgUmFjaWFsIEVxdWl0eSBSZXBvcnTigJlzIG1ldGhvZG9sb2dpY2FsIGFwcHJvYWNoIGFzIGEgd2hvbGUuCiAKV2hpbGUgdGhlIG5ldyBsYXcgZW5mb3JjaW5nIHRoZSBjcmVhdGlvbiBvZiBhIFJhY2lhbCBFcXVpdHkgUmVwb3J0IChSRVIpIGZvciBsYW5kIHVzZSBjaGFuZ2VzIGhhcyBnb29kIGludGVudGlvbnPigJQgcXVhbnRpdGF0aXZlIGRhdGEgY2FuIGJlIG1hbmlwdWxhdGVkIGFuZCBhcmUgbm90IG9iamVjdGl2ZSBmYWN0cy4gQW5hbHlzaXMgb2YgZGF0YSBwcmVzZW50ZWQgaW4gdGhlIFJlcG9ydCBhdCB0aGUgYWJvdmUgdGhyZWUgc2NhbGVzIHByb3ZpZGVzIGdyZWF0ZXIgdHJhbnNwYXJlbmN5IGFuZCBvcHBvcnR1bml0eSBmb3IgcmVmbGVjdGlvbi4KCiMjIyBUaHJlZSBCb3VuZGFyaWVzIG9mIEdvd2FudXMKVG8gaW52ZXN0aWdhdGUgdGhlIGJvdW5kYXJpZXMgdXNlZCBpbiB0aGUgUmFjaWFsIEVxdWl0eSBSZXBvcnQsIEkgc2VsZWN0ZWQgdGhyZWUgYWx0ZXJuYXRpdmUgYm91bmRhcmllcyBmb3IgR293YW51czogYnkgQ29tbXVuaXR5IERpc3RyaWN0IFRhYnVsYXRpb24gQXJlYXMgKENvbW11bml0eSBCb2FyZCksIE5laWdoYm9yaG9vZCBUYWJ1bGF0aW9uIEFyZWFzLCBhbmQgYnkgaGFuZC1zZWxlY3RpbmcgY2Vuc3VzIHRyYWN0cyB0aGF0IG1hdGNoIHdpdGggdGhlIEdvb2dsZSBtYXBzIGJvdW5kYXJpZXMgb2YgR293YW51cy4KClRoZXNlIHRocmVlIGRpZmZlcmVudCBib3VuZGFyaWVzIHlpZWxkIGRpZmZlcmVudCBwb3B1bGF0aW9uczo8YnI+CiogSW4gPGI+Q29tbXVuaXR5IEJvYXJkIDY8L2I+LCB3ZSBzZWUgdGhlIGxhcmdlc3QgZ2VvZ3JhcGhpYyBzaXplIGFuZCBoaWdoZXN0IHBvcHVsYXRpb24sIDxiPjE2OCw2NDg8L2I+IGluIDIwMjAuPGJyPgoqIFRoZSA8Yj5OZWlnaGJvcmhvb2QgVGFidWxhdGlvbiBBcmVhPC9iPiBpcyBzbGlnaHRseSBzbWFsbGVyLCB3aXRoIGEgcG9wdWxhdGlvbiBvZiA8Yj4xMDksNzc1PC9iPiBpbiAyMDIwLjxicj4KKiBUaGUgc21hbGxlc3QgYm91bmRhcnkgaXMgYSA8Yj5oYW5kLXNlbGVjdGlvbiBjZW5zdXMgdHJhY3RzPC9iPiB0aGF0IGFsaWduIHdpdGggR29vZ2xlIG1hcHMgYW5kIGNvbW1vbiBkZWZpbml0aW9ucyBvZiBHb3dhbnVzLCBhIHBvcHVsYXRpb24gb2YgPGI+MjQsOTU2PC9iPiBpbiAyMDIwLjxicj4KKFByb3ZpZGVkIGNvdXJ0ZXN5IG9mIEpvcmRhbiBQYWNrZXIuKQoKIyMjIyBDb21tdW5pdHkgRGlzdHJpY3QgVGFidWxhdGlvbiBBcmVhcwohW10oaW1hZ2VzL2NkdGEucG5nKXt3aWR0aD00MDBweH0KCiMjIyMgTmVpZ2hib3Job29kIFRhYnVsYXRpb24gQXJlYXMKIVtdKGltYWdlcy9udGEucG5nKXt3aWR0aD00MDBweH0KCiMjIyMgU2VsZWN0ZWQgQ2Vuc3VzIFRyYWN0cwohW10oaW1hZ2VzL2NlbnN1c3RyYWN0LnBuZyl7d2lkdGg9NDAwcHh9CgoKIyMgRGF0YSBzb3VyY2VzIGFuZCBhbmFseXNpcwpGb3IgbXkgYW5hbHlzZXMsIEkgZHJhdyBmcm9tIHRoZSBbVS5TLiBEZWNlbm5pYWwgQ2Vuc3VzIDIwMjAgYW5kIDIwMDBdKGh0dHBzOi8vZGF0YS5jZW5zdXMuZ292L2NlZHNjaS8pIGhvdXNpbmcgdW5pdCwgb2NjdXBhbmN5LCBhbmQgdmFjYW5jeSBkYXRhLiBBZGRpdGlvbmFsbHksIEkgZHJhdyBoZWF2aWx5IGZyb20gdGhlIFs1LVllYXIgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleXMgKEFDUykgZnJvbSAyMDA2LTIwMTAgYW5kIDIwMTUtMjAxOV0oaHR0cHM6Ly93d3cuY2Vuc3VzLmdvdi9wcm9ncmFtcy1zdXJ2ZXlzL2Fjcy9kYXRhLmh0bWwpIGZvciBpbmNvbWUsIHJlbnQsIGhvdXNpbmcgY29zdCwgYW5kIGhvbWUgdmFsdWUgZGF0YS4gVGhlIERlY2VubmlhbCBkYXRhIHByb3ZpZGVzIGdyZWF0ZXIgcHJlY2lzaW9uLCBhcyBpdCBpcyBhbiBleGFjdCBjb3VudCByYXRoZXIgdGhhbiBhbiBlc3RpbWF0ZSBhcyBpcyB0aGUgY2FzZSB3aXRoIHRoZSBBQ1MuIFRoZSBBQ1MgcHJvdmlkZXMgaW5jcmVkaWJseSBoZWxwZnVsIGRhdGEgd2hlbiBhZ2dyZWdhdGVkIHRvIGxhcmdlciBnZW9ncmFwaGljIHNjYWxlcywgd2hpY2ggY2FuIHJlZHVjZSB0aGUgbWFyZ2luIG9mIGVycm9yIG9mIHRoZSBkYXRhLiBUaGUgUmFjaWFsIEVxdWl0eSBSZXBvcnQgdXNlcyBkYXRhIGZyb20gdGhlIEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkgdG8gYW5hbHl6ZSBob3VzaW5nIGFuZCBpbmNvbWUgdHJlbmRzLiBGb3Igc21hbGxlciBhcmVhcywgdXNpbmcgQUNTIGRhdGEgeWllbGRzIGEgaGlnaGVyIG1hcmdpbiBvZiBlcnJvci4gV2hpbGUgdGhpcyBoaWdoZXIgbWFyZ2luIG9mIGVycm9yIG1heSBtYWtlIHNvbWUgZGF0YSBhbmFseXNpcyBzdGF0aXN0aWNhbGx5IHVucmVsaWFibGUsIGl0IGNhbiBpbmRpY2F0ZSBicm9hZGVyIHRyZW5kcy48YnI+PGJyPgoKIyMgUmVzdWx0cwoKYGBge3IgZWNobz1GLCBtZXNzYWdlPUYsIHdhcm5pbmc9Rn0KIyMjIyMjIFZBQ0FOQ1kgUkFURSBBTkFMWVNJUyAjIyMjIyMKIzEpIExvYWQgdmFyaWFibGVzIGFuZCBjb25maXJtIHZhcmlhYmxlcyB0byBwdWxsLiBQdWxsIHZhcmlhYmxlcy4KIyBWYXJpYWJsZXMgc2hvdWxkIGJlOgoKIyMjIyMgRGVjZW5uaWFsIDIwMDAgU3VtbWFyeSBGaWxlIDEgIyMjIwojIFZhY2FuY3kgcmF0ZSAtIEgwMDUwMDEKCmRlYzAwX3RhYmxlcyA8LSBsb2FkX3ZhcmlhYmxlcyh5ZWFyID0gMjAwMCwic2YxIiwgY2FjaGUgPSBUUlVFKQoKIyBQdWxsIHZhcmlhYmxlcyBmcm9tIERlY2VubmlhbCAyMDAwIGNlbnN1cyB3aXRoIGFuZCB3aXRob3V0IGdlb21ldHJ5LgpyYXdfdmFjXzAwX3NocCA8LSBnZXRfZGVjZW5uaWFsKGdlb2dyYXBoeSA9ICJ0cmFjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMgPSAiSDAwMzAwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nTlknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnR5ID0gJ0tpbmdzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bWZpbGUgPSAic2YxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbmEgPSAiTi9BIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPSAyMDAwKQoKcmF3X3ZhY18wMCA8LSBnZXRfZGVjZW5uaWFsKGdlb2dyYXBoeSA9ICJ0cmFjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzID0gYygiSDAwMzAwMSIsICJIMDAzMDAyIiwgIkgwMDMwMDMiKSwKICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nTlknLAogICAgICAgICAgICAgICAgICAgICAgIGNvdW50eSA9ICdLaW5ncycsCiAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBzdW1maWxlID0gInNmMSIsCiAgICAgICAgICAgICAgICAgICAgICAgbmEgPSAiTi9BIiwKICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAwMCkKCiMgQ3JlYXRlIGEgdGlkeSBzdGF0cyBkYXRhIGZyYW1lIHNob3dpbmcgdGhlIHZhY2FuY3kgcmF0ZSBpbiAyMDAwLgp2YWNhbmN5X3JhdGVfMDAgPC0gcmF3X3ZhY18wMCAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gdmFyaWFibGUsIHZhbHVlc19mcm9tID0gdmFsdWUpICU+JQogIHJlbmFtZSh0b3RhbF91bml0c18wMCA9ICJIMDAzMDAxIiwKICAgICAgICAgb2NjdXBpZWRfdW5pdHNfMDAgPSAiSDAwMzAwMiIsCiAgICAgICAgIHZhY2FudF91bml0c18wMCA9ICJIMDAzMDAzIikgJT4lCiAgbXV0YXRlKHZhY2FuY3lfcmF0ZV8wMCA9IGlmZWxzZSh0b3RhbF91bml0c18wMCA9PSAwLCBOQSwgdmFjYW50X3VuaXRzXzAwL3RvdGFsX3VuaXRzXzAwKSkKCiMgSm9pbiAyMDAwIFZhY2FuY3kgZGF0YSB0byBnZW9tZXRyeSBkYXRhCnZhY2FuY3lfcmF0ZV8wMF9zaHAgPC0gcmF3X3ZhY18wMF9zaHAgJT4lCiAgaW5uZXJfam9pbih2YWNhbmN5X3JhdGVfMDApICU+JQogIHNlbGVjdChHRU9JRCwgTkFNRSwgdG90YWxfdW5pdHNfMDAsIG9jY3VwaWVkX3VuaXRzXzAwLCB2YWNhbnRfdW5pdHNfMDAsCiAgICAgICAgIHZhY2FuY3lfcmF0ZV8wMCwgZ2VvbWV0cnkpCgojIFRyYW5zZm9ybSBjZW5zdXMgc3BhdGlhbCBkYXRhIGZyYW1lcyB0byBjb3JyZWN0IHByb2plY3Rpb24KdmFjYW5jeV9yYXRlXzAwXzIyNjMgPC0gdmFjYW5jeV9yYXRlXzAwX3NocCAlPiUKICBzdF90cmFuc2Zvcm0oMjI2MykKCiNKb2luIENEVEEgYW5kIE5UQSBzcGF0aWFsIGRhdGEgdG8gY2Vuc3VzIHNwYXRpYWwgZGF0YQp2YWNhbmN5X3JhdGVfMDBfc2hwX2NicyA8LSB2YWNhbmN5X3JhdGVfMDBfMjI2MyAlPiUKICBzdF9qb2luKGNicywgam9pbiA9IHN0X2ludGVyc2VjdHMpCgp2YWNhbmN5X3JhdGVfMDBfc2hwX25hYmVzIDwtIHZhY2FuY3lfcmF0ZV8wMF8yMjYzICU+JQogIHN0X2pvaW4obmFiZXMsIGpvaW4gPSBzdF9pbnRlcnNlY3RzKQoKIyBGaWx0ZXIgZGF0YSBieSBDQjYgYW5kIEdvd2FudXMgTlRBIHRvIHB1bGwgc3VtbWFyeSBzdGF0cwp2YWNhbmN5X3JhdGVfMDBfc2hwX2NiNiA8LSB2YWNhbmN5X3JhdGVfMDBfc2hwX2NicyAlPiUKICBmaWx0ZXIoY2R0YW5hbWUgPT0gIkJLMDYgUGFyayBTbG9wZS1DYXJyb2xsIEdhcmRlbnMgKENEIDYgQXBwcm94aW1hdGlvbikiKQoKdmFjYW5jeV9yYXRlXzAwX3NocF9udGEgPC0gdmFjYW5jeV9yYXRlXzAwX3NocF9uYWJlcyAlPiUKICBmaWx0ZXIoTlRBTmFtZSA9PSAiQ2Fycm9sbCBHYXJkZW5zLUNvYmJsZSBIaWxsLUdvd2FudXMtUmVkIEhvb2siKQoKdmFjYW5jeV90cmFjdF8wMCA8LSB2YWNhbmN5X3JhdGVfMDBfc2hwX250YSAlPiUKICBmaWx0ZXIoTlRBMjAyMCA9PSAiQkswNjAxIikgJT4lCiAgZmlsdGVyKEdFT0lEID09IDM2MDQ3MDA3NzAwIHwKICAgICAgICAgICBHRU9JRCA9PSAzNjA0NzAwNzEwMCB8CiAgICAgICAgICAgR0VPSUQgPT0gMzYwNDcwMDc1MDAgfAogICAgICAgICAgIEdFT0lEID09IDM2MDQ3MDExNzAwIHwKICAgICAgICAgICBHRU9JRCA9PSAzNjA0NzAxMjMwMCB8CiAgICAgICAgICAgR0VPSUQgPT0gMzYwNDcwMTI3MDAgfAogICAgICAgICAgIEdFT0lEID09IDM2MDQ3MDEyNTAwIHwKICAgICAgICAgICBHRU9JRCA9PSAzNjA0NzAxMjEwMCkKCiMgQ3JlYXRlIHN1bW1hcnkgc3RhdHMgZm9yIENCIDYgdmFjYW5jeSByYXRlcyBhdCB0aGUgY2Vuc3VzIHRyYWN0IGxldmVsLgp2YWNhbmN5X3JhdGVfMDBfY2Jfc3RhdHMgPC0gdmFjYW5jeV9yYXRlXzAwX3NocF9jYjYgJT4lCiAgZ3JvdXBfYnkoY2R0YTIwMjApICU+JQogIHN1bW1hcmlzZShgQ0IgNiBNaW5pbXVtIFZhY2FuY3kgUmF0ZWAgPSByb3VuZChtaW4odmFjYW5jeV9yYXRlXzAwKSwgMyksCiAgICAgICAgICAgIGBDQiA2IE1heGltdW1gID0gcm91bmQobWF4KHZhY2FuY3lfcmF0ZV8wMCksIDMpLAogICAgICAgICAgICBgQ0IgNiBBdmVyYWdlIFZhY2FuY3kgUmF0ZWAgPSByb3VuZChtZWFuKHZhY2FuY3lfcmF0ZV8wMCksIDMpLAogICAgICAgICAgICBgQ0IgTWVkaWFuIFZhY2FuY3kgUmF0ZWAgPSByb3VuZChtZWRpYW4odmFjYW5jeV9yYXRlXzAwKSwgMyksCiAgICAgICAgICAgIGBDQiA2IFZhY2FuY3kgUmF0ZSBSYW5nZWAgPSByb3VuZChtYXgodmFjYW5jeV9yYXRlXzAwKSAtIG1pbih2YWNhbmN5X3JhdGVfMDApLCAzKSwKICAgICAgICAgICAgR0VPSUQgPSBmaXJzdChHRU9JRCkpCgp2YWNhbmN5X3JhdGVfMDBfY2JzX3N0YXRzIDwtIHN0X2Ryb3BfZ2VvbWV0cnkodmFjYW5jeV9yYXRlXzAwX2NiX3N0YXRzKQoKdmFjYW5jeV9yYXRlXzAwX250YV9zdGF0cyA8LSB2YWNhbmN5X3JhdGVfMDBfc2hwX250YSAlPiUKICBncm91cF9ieShOVEEyMDIwKSAlPiUKICBzdW1tYXJpc2UoYE5UQSBNaW5pbXVtIFZhY2FuY3kgUmF0ZWAgPSByb3VuZChtaW4odmFjYW5jeV9yYXRlXzAwKSwgMyksCiAgICAgICAgICAgIGBOVEEgTWF4aW11bWAgPSByb3VuZChtYXgodmFjYW5jeV9yYXRlXzAwKSwgMyksCiAgICAgICAgICAgIGBOVEEgQXZlcmFnZSBWYWNhbmN5IFJhdGVgID0gcm91bmQobWVhbih2YWNhbmN5X3JhdGVfMDApLCAzKSwKICAgICAgICAgICAgYE5UQSBNZWRpYW4gVmFjYW5jeSBSYXRlYCA9IHJvdW5kKG1lZGlhbih2YWNhbmN5X3JhdGVfMDApLCAzKSwKICAgICAgICAgICAgYE5UQSBWYWNhbmN5IFJhdGUgUmFuZ2VgID0gcm91bmQobWF4KHZhY2FuY3lfcmF0ZV8wMCkgLSBtaW4odmFjYW5jeV9yYXRlXzAwKSwgMyksCiAgICAgICAgICAgIEdFT0lEID0gZmlyc3QoR0VPSUQpKQoKdmFjYW5jeV9yYXRlXzAwX250YXNfc3RhdHMgPC0gc3RfZHJvcF9nZW9tZXRyeSh2YWNhbmN5X3JhdGVfMDBfbnRhX3N0YXRzKQoKdmFjYW5jeV9yYXRlXzAwX3RyYWN0X3N0YXRzIDwtIHZhY2FuY3lfdHJhY3RfMDAgJT4lCiAgc3VtbWFyaXNlKGBUcmFjdCBNaW5pbXVtIFZhY2FuY3kgUmF0ZWAgPSByb3VuZChtaW4odmFjYW5jeV9yYXRlXzAwKSwgMyksCiAgICAgICAgICAgIGBUcmFjdCBNYXhpbXVtYCA9IHJvdW5kKG1heCh2YWNhbmN5X3JhdGVfMDApLCAzKSwKICAgICAgICAgICAgYFRyYWN0IEF2ZXJhZ2UgVmFjYW5jeSBSYXRlYCA9IHJvdW5kKG1lYW4odmFjYW5jeV9yYXRlXzAwKSwgMyksCiAgICAgICAgICAgIGBUcmFjdCBNZWRpYW4gVmFjYW5jeSBSYXRlYCA9IHJvdW5kKG1lZGlhbih2YWNhbmN5X3JhdGVfMDApLCAzKSwKICAgICAgICAgICAgYFRyYWN0IFZhY2FuY3kgUmF0ZSBSYW5nZWAgPSByb3VuZChtYXgodmFjYW5jeV9yYXRlXzAwKSAtIG1pbih2YWNhbmN5X3JhdGVfMDApLCAzKSwKICAgICAgICAgICAgR0VPSUQgPSBmaXJzdChHRU9JRCkpCiAgCnZhY2FuY3lfcmF0ZV8wMF90cmFjdHNfc3RhdHMgPC0gc3RfZHJvcF9nZW9tZXRyeSh2YWNhbmN5X3JhdGVfMDBfdHJhY3Rfc3RhdHMpCgp2YWNfMjAwMF9zdW1tYXJ5IDwtIHJlYWQueGxzeCgnc3VtbWFyeS92YWNfMjAwMF9zdW1tYXJ5Lnhsc3gnKQp2YWNfc3VtbWFyeSA8LSByZWFkLnhsc3goJ3N1bW1hcnkvdmFjX3N1bW1hcnkueGxzeCcpCgojIyMjIyBEZWNlbm5pYWwgMjAyMCAjIyMjIwojIFRvdGFsIGhvdXNpbmcgdW5pdHMgLSBIMV8wMDFOCiMgVG90YWwgb2NjdXBpZWQgaG91c2luZyB1bml0cyAtIEgxXzAwMk4KIyBUb3RhbCB2YWNhbnQgaG91c2luZyB1bml0cyAtIEgxXzAwM04KCmRlYzIwX3RhYmxlcyA8LSBsb2FkX3ZhcmlhYmxlcyh5ZWFyID0gMjAyMCwicGwiLCBjYWNoZSA9IFRSVUUpCgpyYXdfdmFjXzIwX3NocCA8LSBnZXRfZGVjZW5uaWFsKGdlb2dyYXBoeSA9ICJ0cmFjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMgPSAiSDFfMDAxTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nTlknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnR5ID0gJ0tpbmdzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbmEgPSAiTi9BIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPSAyMDIwKQoKcmF3X3ZhY18yMCA8LSBnZXRfZGVjZW5uaWFsKGdlb2dyYXBoeSA9ICJ0cmFjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyA9IGMoIkgxXzAwMU4iLCAiSDFfMDAyTiIsICJIMV8wMDNOIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlPSdOWScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50eSA9ICdLaW5ncycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hID0gIk4vQSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPSAyMDIwKQoKdmFjYW5jeV9yYXRlXzIwIDwtIHJhd192YWNfMjAgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHZhcmlhYmxlLCB2YWx1ZXNfZnJvbSA9IHZhbHVlKSAlPiUKICByZW5hbWUodG90YWxfdW5pdHNfMjAgPSAiSDFfMDAxTiIsCiAgICAgICAgIG9jY3VwaWVkX3VuaXRzXzIwID0gIkgxXzAwMk4iLAogICAgICAgICB2YWNhbnRfdW5pdHNfMjAgPSAiSDFfMDAzTiIpICU+JQogIG11dGF0ZSh2YWNhbmN5X3JhdGVfMjAgPSBpZmVsc2UodG90YWxfdW5pdHNfMjAgPT0gMCwgTkEsIHZhY2FudF91bml0c18yMC90b3RhbF91bml0c18yMCkpCgojIEpvaW4gMjAyMCB2YWNhbmN5IGRhdGEgdG8gZ2VvbWV0cnkgZGF0YQp2YWNhbmN5X3JhdGVfMjBfc2hwIDwtIHJhd192YWNfMjBfc2hwICU+JQogIGlubmVyX2pvaW4odmFjYW5jeV9yYXRlXzIwKSAlPiUKICBzZWxlY3QoR0VPSUQsIE5BTUUsIHRvdGFsX3VuaXRzXzIwLCBvY2N1cGllZF91bml0c18yMCwgdmFjYW50X3VuaXRzXzIwLAogICAgICAgICB2YWNhbmN5X3JhdGVfMjAsIGdlb21ldHJ5KQoKIyBUcmFuc2Zvcm0gY2Vuc3VzIHNwYXRpYWwgZGF0YSBmcmFtZXMgdG8gY29ycmVjdCBwcm9qZWN0aW9uCnZhY2FuY3lfcmF0ZV8yMF8yMjYzIDwtIHZhY2FuY3lfcmF0ZV8yMF9zaHAgJT4lCiAgc3RfdHJhbnNmb3JtKDIyNjMpCgojSm9pbiBDRFRBIHNwYXRpYWwgZGF0YSB0byBjZW5zdXMgc3BhdGlhbCBkYXRhCnZhY2FuY3lfcmF0ZV8yMF9zaHBfY2JzIDwtIHZhY2FuY3lfcmF0ZV8yMF8yMjYzICU+JQogIHN0X2pvaW4oY2JzLCBqb2luID0gc3RfaW50ZXJzZWN0cykKCnZhY2FuY3lfcmF0ZV8yMF9zaHBfbmFiZXMgPC0gdmFjYW5jeV9yYXRlXzIwXzIyNjMgJT4lCiAgc3Rfam9pbihuYWJlcywgam9pbiA9IHN0X2ludGVyc2VjdHMpCgojIEZpbHRlciBkYXRhIGJ5IENCNiB0byBwdWxsIHN1bW1hcnkgc3RhdHMKdmFjYW5jeV9yYXRlXzIwX3NocF9jYjYgPC0gdmFjYW5jeV9yYXRlXzIwX3NocF9jYnMgJT4lCiAgZmlsdGVyKGNkdGFuYW1lID09ICJCSzA2IFBhcmsgU2xvcGUtQ2Fycm9sbCBHYXJkZW5zIChDRCA2IEFwcHJveGltYXRpb24pIiwKICAgICAgICAgdmFjYW5jeV9yYXRlXzIwIDwgLjkpCgp2YWNhbmN5X3JhdGVfMjBfc2hwX250YSA8LSB2YWNhbmN5X3JhdGVfMjBfc2hwX25hYmVzICU+JQogIGZpbHRlcihOVEFOYW1lID09ICJDYXJyb2xsIEdhcmRlbnMtQ29iYmxlIEhpbGwtR293YW51cy1SZWQgSG9vayIsCiAgICAgICAgIHZhY2FuY3lfcmF0ZV8yMCA8IC45KQoKdmFjYW5jeV90cmFjdF8yMCA8LSB2YWNhbmN5X3JhdGVfMjBfc2hwX250YSAlPiUKICBmaWx0ZXIoTlRBMjAyMCA9PSAiQkswNjAxIikgJT4lCiAgZmlsdGVyKEdFT0lEID09IDM2MDQ3MDA3NzAwIHwKICAgICAgICAgICBHRU9JRCA9PSAzNjA0NzAwNzEwMCB8CiAgICAgICAgICAgR0VPSUQgPT0gMzYwNDcwMDc1MDAgfAogICAgICAgICAgIEdFT0lEID09IDM2MDQ3MDExNzAwIHwKICAgICAgICAgICBHRU9JRCA9PSAzNjA0NzAxMTkwMSB8CiAgICAgICAgICAgR0VPSUQgPT0gMzYwNDcwMTI3MDAgfAogICAgICAgICAgIEdFT0lEID09IDM2MDQ3MDEyMTAwKQoKCiMgQ3JlYXRlIHN1bW1hcnkgc3RhdHMgZm9yIENCIDYgdmFjYW5jeSByYXRlcyBhdCB0aGUgY2Vuc3VzIHRyYWN0IGxldmVsLgp2YWNhbmN5X3JhdGVfMjBfY2Jfc3RhdHMgPC0gdmFjYW5jeV9yYXRlXzIwX3NocF9jYjYgJT4lCiAgZ3JvdXBfYnkoY2R0YTIwMjApICU+JQogIHN1bW1hcmlzZShgQ0IgNiBNaW5pbXVtIFZhY2FuY3kgUmF0ZSAyMGAgPSByb3VuZChtaW4odmFjYW5jeV9yYXRlXzIwKSwgMyksCiAgICAgICAgICAgIGBDQiA2IE1heGltdW0gMjBgID0gcm91bmQobWF4KHZhY2FuY3lfcmF0ZV8yMCksIDMpLAogICAgICAgICAgICBgQ0IgNiBBdmVyYWdlIFZhY2FuY3kgUmF0ZSAyMGAgPSByb3VuZChtZWFuKHZhY2FuY3lfcmF0ZV8yMCksIDMpLAogICAgICAgICAgICBgQ0IgTWVkaWFuIFZhY2FuY3kgUmF0ZSAyMGAgPSByb3VuZChtZWRpYW4odmFjYW5jeV9yYXRlXzIwKSwgMyksCiAgICAgICAgICAgIGBDQiA2IFZhY2FuY3kgUmF0ZSBSYW5nZSAyMGAgPSByb3VuZChtYXgodmFjYW5jeV9yYXRlXzIwKSAtIG1pbih2YWNhbmN5X3JhdGVfMjApLCAzKSwKICAgICAgICAgICAgYENCIDYgVG90YWwgVW5pdHMgMjBgID0gc3VtKHRvdGFsX3VuaXRzXzIwKSwKICAgICAgICAgICAgYENCIDYgVmFjYW50IFVuaXRzIFRvdGFsIDIwYCA9IHN1bSh2YWNhbnRfdW5pdHNfMjApKQoKdmFjYW5jeV9yYXRlXzIwX2Nic19zdGF0cyA8LSBzdF9kcm9wX2dlb21ldHJ5KHZhY2FuY3lfcmF0ZV8yMF9jYl9zdGF0cykKCnZhY2FuY3lfcmF0ZV8yMF9udGFfc3RhdHMgPC0gdmFjYW5jeV9yYXRlXzIwX3NocF9udGEgJT4lCiAgZ3JvdXBfYnkoTlRBMjAyMCkgJT4lCiAgc3VtbWFyaXNlKGBOVEEgTWluaW11bSBWYWNhbmN5IFJhdGVgID0gcm91bmQobWluKHZhY2FuY3lfcmF0ZV8yMCksIDMpLAogICAgICAgICAgICBgTlRBIE1heGltdW1gID0gcm91bmQobWF4KHZhY2FuY3lfcmF0ZV8yMCksIDMpLAogICAgICAgICAgICBgTlRBIEF2ZXJhZ2UgVmFjYW5jeSBSYXRlYCA9IHJvdW5kKG1lYW4odmFjYW5jeV9yYXRlXzIwKSwgMyksCiAgICAgICAgICAgIGBOVEEgTWVkaWFuIFZhY2FuY3kgUmF0ZWAgPSByb3VuZChtZWRpYW4odmFjYW5jeV9yYXRlXzIwKSwgMyksCiAgICAgICAgICAgIGBOVEEgVmFjYW5jeSBSYXRlIFJhbmdlYCA9IHJvdW5kKG1heCh2YWNhbmN5X3JhdGVfMjApIC0gbWluKHZhY2FuY3lfcmF0ZV8yMCksIDMpLAogICAgICAgICAgICBgTlRBIFRvdGFsIFVuaXRzYCA9IHN1bSh0b3RhbF91bml0c18yMCksCiAgICAgICAgICAgIGBOVEEgVmFjYW50IFVuaXRzIFRvdGFsYCA9IHN1bSh2YWNhbnRfdW5pdHNfMjApKQoKdmFjYW5jeV9yYXRlXzIwX250YXNfc3RhdHMgPC0gc3RfZHJvcF9nZW9tZXRyeSh2YWNhbmN5X3JhdGVfMjBfbnRhX3N0YXRzKQoKdmFjYW5jeV9yYXRlXzIwX3RyYWN0X3N0YXRzIDwtIHZhY2FuY3lfdHJhY3RfMjAgJT4lCiAgc3VtbWFyaXNlKGBUcmFjdCBNaW5pbXVtIFZhY2FuY3kgUmF0ZWAgPSByb3VuZChtaW4odmFjYW5jeV9yYXRlXzIwKSwgMyksCiAgICAgICAgICAgIGBUcmFjdCBNYXhpbXVtIFZhY2FuY3kgUmF0ZWAgPSByb3VuZChtYXgodmFjYW5jeV9yYXRlXzIwKSwgMyksCiAgICAgICAgICAgIGBUcmFjdCBBdmVyYWdlIFZhY2FuY3kgUmF0ZWAgPSByb3VuZChtZWFuKHZhY2FuY3lfcmF0ZV8yMCksIDMpLAogICAgICAgICAgICBgVHJhY3QgTWVkaWFuIFZhY2FuY3kgUmF0ZWAgPSByb3VuZChtZWRpYW4odmFjYW5jeV9yYXRlXzIwKSwgMyksCiAgICAgICAgICAgIGBUcmFjdCBWYWNhbmN5IFJhdGUgUmFuZ2VgID0gcm91bmQobWF4KHZhY2FuY3lfcmF0ZV8yMCkgLSBtaW4odmFjYW5jeV9yYXRlXzIwKSwgMyksCiAgICAgICAgICAgIGBUcmFjdCBUb3RhbCBVbml0c2AgPSBzdW0odG90YWxfdW5pdHNfMjApLAogICAgICAgICAgICBgVHJhY3QgVmFjYW50IFVuaXRzIFRvdGFsYCA9IHN1bSh2YWNhbnRfdW5pdHNfMjApKQoKdmFjYW5jeV9yYXRlXzIwX3RyYWN0c19zdGF0cyA8LSBzdF9kcm9wX2dlb21ldHJ5KHZhY2FuY3lfcmF0ZV8yMF90cmFjdF9zdGF0cykKCnZhY18yMDIwX3N1bW1hcnkgPC0gcmVhZC54bHN4KCdzdW1tYXJ5L3ZhY18yMDIwX3N1bW1hcnkueGxzeCcpCmBgYAoKIyMjIyBWYWNhbmN5IE1hcHMKCk1hcHBpbmcgdGhlIHZhY2FuY3kgcmF0ZSBhdCB0aGUgdHJhY3QgbGV2ZWwgYWNyb3NzIHRoZSB0aHJlZSBzY2FsZXMgY2FuIGlsbHVzdHJhdGUgaG93IHZhY2FuY3kgcmF0ZXMgZGlmZmVyIGFjcm9zcyBjZW5zdXMgdHJhY3RzIHdpdGhpbiBDQjYuCgpgYGB7ciBlY2hvPUYsIG1lc3NhZ2U9Riwgd2FybmluZz1GfQojIyMjIyBWYWNhbmN5IERlY2VubmlhbCAyMDIwIE1hcHMgIyMjIyMKIyBQbG90IGEgbWFwIG9mIHRoZSB2YWNhbmN5IHJhdGUgYWNyb3NzIENCIDYgYXQgdGhlIGNlbnN1cyB0cmFjdCBsZXZlbAp2YWNhbmN5X3JhdGVfMjBfY2JfbWFwIDwtIGdncGxvdCgpICArCiAgZ2VvbV9zZihkYXRhID0gdmFjYW5jeV9yYXRlXzIwX3NocF9jYjYsIG1hcHBpbmcgPSBhZXMoZmlsbCA9IHZhY2FuY3lfcmF0ZV8yMCwgZ2VvbWV0cnk9Z2VvbWV0cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCgiQ2Vuc3VzIFRyYWN0OiAiLCBOQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4gVmFjYW5jeSBSYXRlOiAiLCBzY2FsZXM6OnBlcmNlbnQodmFjYW5jeV9yYXRlXzIwLCBhY2N1cmFjeT0xKSkpLAogICAgICAgICAgY29sb3IgPSAiI2ZmZmZmZiIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKGJyZWFrcz1jKC4wMywgLjA2LCAuMDksIDAuMTIpLAogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiI2ZmZmZmZiIsCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVmFjYW5jeSBSYXRlIGluIENvbW11bml0eSBCb2FyZCA2LCAyMDIwIiwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxTCkpICsKICBsYWJzKAogICAgdGl0bGUgPSAiVmFjYW5jeSBSYXRlIGluIENvbW11bml0eSBCb2FyZCA2LCAyMDIwIiwKICAgIGNhcHRpb24gPSAiU291cmNlOiBEZWNlbm5pYWwgQ2Vuc3VzIDIwMjAiKSArCiAgZ2VvbV9zZihkYXRhID0gcmF3X2NiICU+JSBmaWx0ZXIoY2R0YTIwMjAgPT0gIkJLMDYiKSwgY29sb3IgPSAib3JhbmdlIiwgZmlsbCA9IE5BLCBsd2QgPSAuNSkKCmdncGxvdGx5KHZhY2FuY3lfcmF0ZV8yMF9jYl9tYXAsIHRvb2x0aXAgPSAidGV4dCIpCgojIFBsb3QgYSBtYXAgb2YgdGhlIHZhY2FuY3kgcmF0ZSBhY3Jvc3MgR293YW51cyBOVEEgYXQgdGhlIGNlbnN1cyB0cmFjdCBsZXZlbAp2YWNhbmN5X3JhdGVfMjBfbmFiZV9tYXAgPC0gZ2dwbG90KCkgICsKICBnZW9tX3NmKGRhdGEgPSB2YWNhbmN5X3JhdGVfMjBfc2hwX250YSwgbWFwcGluZyA9IGFlcyhmaWxsID0gdmFjYW5jeV9yYXRlXzIwLCBnZW9tZXRyeT1nZW9tZXRyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKCJDZW5zdXMgVHJhY3Q6ICIsIE5BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiBWYWNhbmN5IFJhdGU6ICIsIHNjYWxlczo6cGVyY2VudCh2YWNhbmN5X3JhdGVfMjAsIGFjY3VyYWN5PTEpKSksCiAgICAgICAgICBjb2xvciA9ICIjZmZmZmZmIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoYnJlYWtzPWMoLjA1LCAuMTAsIC4xNSwgMC4yKSwKICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAxLAogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gIiNmZmZmZmYiLAogICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlZhY2FuY3kgUmF0ZSBpbiBHb3dhbnVzIE5UQSwgMjAyMCIsCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMUwpKSArCiAgbGFicygKICAgIHRpdGxlID0gIlZhY2FuY3kgUmF0ZSBpbiBHb3dhbnVzIE5UQSwgMjAyMCIsCiAgICBjYXB0aW9uID0gIlNvdXJjZTogRGVjZW5uaWFsIENlbnN1cyAyMDIwIikgKwogIGdlb21fc2YoZGF0YSA9IHJhd19uYWJlcyAlPiUgZmlsdGVyKE5UQTIwMjAgPT0gIkJLMDYwMSIpLCBjb2xvciA9ICJvcmFuZ2UiLCBmaWxsID0gTkEsIGx3ZCA9IC41KQoKZ2dwbG90bHkodmFjYW5jeV9yYXRlXzIwX25hYmVfbWFwLCB0b29sdGlwID0gInRleHQiKQoKIyBQbG90IGEgbWFwIG9mIHRoZSB2YWNhbmN5IHJhdGUgYWNyb3NzIEdvd2FudXMgTlRBIGF0IHRoZSBjZW5zdXMgdHJhY3QgbGV2ZWwKdmFjYW5jeV9yYXRlXzIwX3RyYWN0X21hcCA8LSBnZ3Bsb3QoKSAgKwogIGdlb21fc2YoZGF0YSA9IHZhY2FuY3lfdHJhY3RfMjAsIG1hcHBpbmcgPSBhZXMoZmlsbCA9IHZhY2FuY3lfcmF0ZV8yMCwgZ2VvbWV0cnk9Z2VvbWV0cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKCJDZW5zdXMgVHJhY3Q6ICIsIE5BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IFZhY2FuY3kgUmF0ZTogIiwgc2NhbGVzOjpwZXJjZW50KHZhY2FuY3lfcmF0ZV8yMCwgYWNjdXJhY3k9MSkpKSwKICAgICAgICAgIGNvbG9yID0gIiNmZmZmZmYiKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihicmVha3M9YyguMDI1LCAuMDUsIC4wNzUsIC4xMCksCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMSwKICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICIjZmZmZmZmIiwKICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJWYWNhbmN5IFJhdGUgaW4gU2VsZWN0ZWQgQ2Vuc3VzIFRyYWN0cywgMjAyMCIsCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMUwpKSArCiAgbGFicygKICAgIHRpdGxlID0gIlZhY2FuY3kgUmF0ZSBpbiBTZWxlY3RlZCBDZW5zdXMgVHJhY3RzLCAyMDIwIiwKICAgIGNhcHRpb24gPSAiU291cmNlOiBEZWNlbm5pYWwgQ2Vuc3VzIDIwMjAiKQoKZ2dwbG90bHkodmFjYW5jeV9yYXRlXzIwX3RyYWN0X21hcCwgdG9vbHRpcCA9ICJ0ZXh0IikKYGBgCgpMb29raW5nIGF0IHRoZSBzZWxlY3RlZCBHb3dhbnVzIGNlbnN1cyB0cmFjdHMsIHZhY2FuY3kgaXMgcXVpdGUgaGlnaCBpbiB0cmFjdCAxMjEgKDEzJSksIG1pZGRsaW5nIGluIHRyYWN0cyA3NSwgNzcsIDExNywgYW5kIHRyYWN0IDExOS4wMSwgYW5kIGxvdyBpbiB0cmFjdHMgNzEgYW5kIDEyNy4KPGJyPjxicj4KCmBgYHtyIGVjaG89RiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGZpZy53aWR0aD03fQojIyMjIyBWYWNhbmN5IERlY2VubmlhbCAyMDIwIEhpc3RvZ3JhbSAjIyMjIwp2YWNhbmN5XzIwX3AgPC0gZ2dwbG90KGRhdGE9dmFjXzIwMjBfc3VtbWFyeSwgYWVzKHg9WDEsIHk9QXZlcmFnZV9WYWNhbmN5X1JhdGVfMjAyMCwgZmlsbD1BdmVyYWdlX1ZhY2FuY3lfUmF0ZV8yMDIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoIlZhY2FuY3kgUmF0ZTogIiwgc2NhbGVzOjpwZXJjZW50KEF2ZXJhZ2VfVmFjYW5jeV9SYXRlXzIwMjApKSkpICsKICBnZW9tX2NvbCgpICsKICAjY291bGQgY2hhbmdlIHRoaXMg4oCcYW5nbGXigJ0gYmVsb3cgZnJvbSA5MCB0byAyNSBmb3IgaXQgdG8gYmUgYSBiaXQgbW9yZSByZWFkYWJsZQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbD1zY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMUwpKSArCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxTCkpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJDRFRBMjAyMCIgPSAiQ29tbXVuaXR5IEJvYXJkIDIwMjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5UQTIwMjAiID0gIk5laWdoYm9yaG9vZCBUcmFjdCAyMDIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUUkFDVDIwMjAiID0gIlNlbGVjdGVkIFRyYWN0cyAyMDIwIikpICsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MjUsaGp1c3Q9MSx2anVzdD0wLjUpKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKyAjIHJlbW92ZSBncmlkbGluZXMKICBsYWJzKHggPSAiQm91bmRhcnkgb2YgR293YW51cyIsIHkgPSAiVmFjYW5jeSBSYXRlICglKSIsIGZpbGwgPSAiQXZlcmFnZSBWYWNhbmN5IFJhdGUgKCUpIikKZ2dwbG90bHkodmFjYW5jeV8yMF9wLCB0b29sdGlwID0gInRleHQiKSAlPiUKICBsYXlvdXQobWFyZ2luID0gbGlzdCAodCA9IDE1MCksIHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCc8YnI+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWYWNhbmN5IFJhdGUgaW4gR3JlYXRlciBHb3dhbnVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3VwPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnkgQ0RUQSwgTlRBLCBhbmQgU2VsZWN0ZWQgQ2Vuc3VzIFRyYWN0cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJyPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHN1cD4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NvdXJjZTogRGVjZW5uaWFsIENlbnN1cyAyMDIwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L3N1cD4nICkpKQpgYGAKCkxvb2tpbmcgYXQgdGhlIGRhdGEgc2lkZSBieSBzaWRlLCBpdCBpcyBjbGVhciB0aGF0IHRoZSBhdmVyYWdlIHZhY2FuY3kgcmF0ZSBvZiB0aGUgc2VsZWN0ZWQgY2Vuc3VzIHRyYWN0cyBpcyBoaWdoZXIgdGhhbiB0aGF0IG9mIHRoZSBOVEEsIHdoaWxlIHRoZSBOVEEgdmFjYW5jeSByYXRlIGlzIGhpZ2hlciB0aGFuIHRoZSBDRFRBIHJhdGUuCgpgYGB7ciBlY2hvPUYsIHdhcm5pbmc9RiwgbWVzc2FnZT1GfQojIyMgTGluZSBDaGFydCBTaG93aW5nIENoYW5nZSBpbiBWYWNhbmN5IFJhdGUgZnJvbSAyMDAwLTIwMjAgYXQgQ0RUQSBhbmQgTlRBIGxldmVscy4KdmFjX2NoYW5nZV8wMF8yMF9zdW0gPC0gcmVhZC54bHN4KCdzdW1tYXJ5L3ZhY19jaGFuZ2VfMDBfMjBfc3VtbWFyeS54bHN4JykKCnZhY2FuY3lfY2hhbmdlX3Bsb3QgPC0gZ2dwbG90KGRhdGE9dmFjX2NoYW5nZV8wMF8yMF9zdW0sIGFlcyh4PVllYXIsIHk9QXZlcmFnZV9WYWNhbmN5X1JhdGUsIGdyb3VwPVNjYWxlLCBjb2xvcj1TY2FsZSkpICsKICBnZW9tX2xpbmUoc2l6ZT0xLCBhbHBoYT0wLjkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKGRpc2NyZXRlID0gVFJVRSkgKwogIGdndGl0bGUoIkNoYW5nZSBpbiBWYWNhbmN5IFJhdGUgZnJvbSAyMDAwLTIwMjAsIGF0IENEVEEgYW5kIE5UQSBMZXZlbHMiKSArCiAgdGhlbWUoKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5PTEpKSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKCJWYWNhbmN5IFJhdGUiKQoKdmFjYW5jeV9jaGFuZ2VfcGxvdApgYGAKClZhY2FuY3kgaGFzIHJpc2VuIGF0IGEgbXVjaCBoaWdoZXIgcmF0ZSBiZXR3ZWVuIDIwMDAgYW5kIDIwMjAgd2l0aGluIHRoZSBzZWxlY3RlZCB0cmFjdHMgdmVyc3VzIGF0IHRoZSBDb21tdW5pdHkgQm9hcmQgYW5kIG5laWdoYm9yaG9vZCBsZXZlbC48YnI+PGJyPgoKYGBge3IgZWNobz1GLCB3YXJuaW5nPUYsIG1lc3NhZ2U9Rn0KIyMjIyMgVmFjYW5jeSBEZWNlbm5pYWwgMjAwMCBIaXN0b2dyYW0gIyMjIyMKdmFjYW5jeV8wMF9wIDwtIGdncGxvdChkYXRhPXZhY18yMDAwX3N1bW1hcnksIGFlcyh4PVgxLCB5PUF2ZXJhZ2VfVmFjYW5jeV9SYXRlXzIwMDAsIGZpbGw9QXZlcmFnZV9WYWNhbmN5X1JhdGVfMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCgiVmFjYW5jeSBSYXRlOiAiLCBzY2FsZXM6OnBlcmNlbnQoQXZlcmFnZV9WYWNhbmN5X1JhdGVfMjAwMCkpKSkgKwogIGdlb21fY29sKCkgKwogICNjb3VsZCBjaGFuZ2UgdGhpcyDigJxhbmdsZeKAnSBiZWxvdyBmcm9tIDkwIHRvIDI1IGZvciBpdCB0byBiZSBhIGJpdCBtb3JlIHJlYWRhYmxlCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVsPXNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxTCkpICsKICBzY2FsZV9maWxsX2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDFMKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkNEVEEyMDAwIiA9ICJDb21tdW5pdHkgQm9hcmQgMjAwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTlRBMjAwMCIgPSAiTmVpZ2hib3Job29kIFRyYWN0IDIwMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRSQUNUMjAwMCIgPSAiU2VsZWN0ZWQgVHJhY3RzIDIwMDAiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0yNSxoanVzdD0xLHZqdXN0PTAuNSkpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArICMgcmVtb3ZlIGdyaWRsaW5lcwogIGxhYnMoeCA9ICJCb3VuZGFyeSBvZiBHb3dhbnVzIiwgeSA9ICJWYWNhbmN5IFJhdGUgKCUpIiwgZmlsbCA9ICJBdmVyYWdlIFZhY2FuY3kgUmF0ZSAoJSkiKQpnZ3Bsb3RseSh2YWNhbmN5XzAwX3AsIHRvb2x0aXAgPSAidGV4dCIpICU+JQogIGxheW91dChtYXJnaW4gPSBsaXN0ICh0ID0gMTUwKSwgdGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoJzxicj4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZhY2FuY3kgUmF0ZSBpbiBHcmVhdGVyIEdvd2FudXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxicj4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzdXA+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdieSBDRFRBLCBOVEEsIGFuZCBTZWxlY3RlZCBDZW5zdXMgVHJhY3RzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3VwPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU291cmNlOiBEZWNlbm5pYWwgQ2Vuc3VzIDIwMDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvc3VwPicgKSkpCmBgYAoKSW4gMjAwMCwgdGhlIHZhY2FuY3kgcmF0ZSBpbiB0aGUgR293YW51cyBjZW5zdXMgdHJhY3RzIHdhcyBhY3R1YWxseSBsb3dlciB0aGFuIHRoZSBOVEEgYXZlcmFnZS4KPGJyPjxicj4KCiMjIyMgTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWUKCmBgYHtyIGVjaG89RiwgbWVzc2FnZT1GLCB3YXJuaW5nPUZ9CiMjIyMjIEFDUyAyMDE1LTIwMTkgIyMjIyMKI1RvdGFsIC0gQjA2MDExXzAwMQojTkggV2hpdGUgLSBCMTkwMDFIXzAwMQojTkggQmxhY2sgLSBCMTkwMDFCXzAwMQojTkggQXNpYW4gLSBCMTkwMDFEXzAwMQojSGlzcGFuaWMvTGF0aW54IC0gQjE5MDAxSV8wMDEKCiNwdWxsIGFjcyAyMDE1LTE5IGRhdGEgd2l0aCBzaGFwZQpyYXdfbWVkX2luY29tZV8yMDE5X3NocCA8LSBnZXRfYWNzKGdlb2dyYXBoeSA9ICJ0cmFjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzID0gIkIxOTAxM18wMDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlPSdOWScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnR5ID0gJ0tpbmdzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9IDIwMTkpCiNwdWxsIGFjcyB3aXRob3V0IHNoYXBlICgyMDE1LTkpCnJhd19tZWRfaW5jb21lXzIwMTkgPC0gZ2V0X2FjcyhnZW9ncmFwaHkgPSAidHJhY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzID0gYygiQjE5MDEzXzAwMSIsICJCMTkwMTNBXzAwMSIsICJCMTkwMTNCXzAwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkIxOTAxM0RfMDAxIiwgIkIxOTAxM0lfMDAxIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZT0nTlknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnR5ID0gJ0tpbmdzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAxOSkKCiMgVGlkeSBkYXRhIGZyYW1lCm1lZF9pbmNvbWVfMjAxOSA8LSByYXdfbWVkX2luY29tZV8yMDE5ICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSB2YXJpYWJsZSwgdmFsdWVzX2Zyb20gPSBjKGVzdGltYXRlLCBtb2UpKSAlPiUKICByZW5hbWUobWhpXzE5X3RvdGFsID0gImVzdGltYXRlX0IxOTAxM18wMDEiLAogICAgICAgICBtaGlfMTlfd2hpdGUgPSAiZXN0aW1hdGVfQjE5MDEzQV8wMDEiLAogICAgICAgICBtaGlfMTlfYmxhY2sgPSAiZXN0aW1hdGVfQjE5MDEzQl8wMDEiLAogICAgICAgICBtaGlfMTlfYXNpYW4gPSAiZXN0aW1hdGVfQjE5MDEzRF8wMDEiLAogICAgICAgICBtaGlfMTlfbGF0aW54ID0gImVzdGltYXRlX0IxOTAxM0lfMDAxIiwKICAgICAgICAgbWhpXzE5X3RvdGFsX21vZSA9ICJtb2VfQjE5MDEzXzAwMSIsCiAgICAgICAgIG1oaV8xOV93aGl0ZV9tb2UgPSAibW9lX0IxOTAxM0FfMDAxIiwKICAgICAgICAgbWhpXzE5X2JsYWNrX21vZSA9ICJtb2VfQjE5MDEzQl8wMDEiLAogICAgICAgICBtaGlfMTlfYXNpYW5fbW9lID0gIm1vZV9CMTkwMTNEXzAwMSIsCiAgICAgICAgIG1oaV8xOV9sYXRpbnhfbW9lID0gIm1vZV9CMTkwMTNJXzAwMSIpICU+JQogIHNlbGVjdChHRU9JRCwgTkFNRSwgbWhpXzE5X3RvdGFsLCBtaGlfMTlfdG90YWxfbW9lLAogICAgICAgICBtaGlfMTlfd2hpdGUsIG1oaV8xOV93aGl0ZV9tb2UsCiAgICAgICAgIG1oaV8xOV9hc2lhbiwgbWhpXzE5X2FzaWFuX21vZSwKICAgICAgICAgbWhpXzE5X2JsYWNrLCBtaGlfMTlfYmxhY2tfbW9lLAogICAgICAgICBtaGlfMTlfbGF0aW54LCBtaGlfMTlfbGF0aW54X21vZSkKCiMgSm9pbiAyMDE5IE1ISSBkYXRhIHRvIGdlb21ldHJ5IGRhdGEKbWVkX2luY29tZV8xOV9zaHAgPC0gcmF3X21lZF9pbmNvbWVfMjAxOV9zaHAgJT4lCiAgaW5uZXJfam9pbihtZWRfaW5jb21lXzIwMTkpICU+JQogIHNlbGVjdChHRU9JRCwgTkFNRSwgbWhpXzE5X3RvdGFsLCBtaGlfMTlfdG90YWxfbW9lLAogICAgICAgICBtaGlfMTlfd2hpdGUsIG1oaV8xOV93aGl0ZV9tb2UsCiAgICAgICAgIG1oaV8xOV9hc2lhbiwgbWhpXzE5X2FzaWFuX21vZSwKICAgICAgICAgbWhpXzE5X2JsYWNrLCBtaGlfMTlfYmxhY2tfbW9lLAogICAgICAgICBtaGlfMTlfbGF0aW54LCBtaGlfMTlfbGF0aW54X21vZSkKCiMgVHJhbnNmb3JtIGNlbnN1cyBzcGF0aWFsIGRhdGEgZnJhbWVzIHRvIGNvcnJlY3QgcHJvamVjdGlvbgptZWRfaW5jb21lXzE5XzIyNjMgPC0gbWVkX2luY29tZV8xOV9zaHAgJT4lCiAgc3RfdHJhbnNmb3JtKDIyNjMpCgojSm9pbiBDRFRBIHNwYXRpYWwgZGF0YSB0byBjZW5zdXMgc3BhdGlhbCBkYXRhCm1lZF9pbmNvbWVfMTlfc2hwX2NicyA8LSBtZWRfaW5jb21lXzE5XzIyNjMgJT4lCiAgc3Rfam9pbihjYnMsIGpvaW4gPSBzdF9pbnRlcnNlY3RzKQoKbWVkX2luY29tZV8xOV9zaHBfbmFiZXMgPC0gbWVkX2luY29tZV8xOV8yMjYzICU+JQogIHN0X2pvaW4obmFiZXMsIGpvaW4gPSBzdF9pbnRlcnNlY3RzKQoKIyBGaWx0ZXIgZGF0YSBieSBDQjYgYW5kIE5UQSB0byBwdWxsIHN1bW1hcnkgc3RhdHMKbWVkX2luY29tZV8xOV9zaHBfY2I2IDwtIG1lZF9pbmNvbWVfMTlfc2hwX2NicyAlPiUKICBmaWx0ZXIoY2R0YW5hbWUgPT0gIkJLMDYgUGFyayBTbG9wZS1DYXJyb2xsIEdhcmRlbnMgKENEIDYgQXBwcm94aW1hdGlvbikiKQoKbWVkX2luY29tZV8xOV9zaHBfbnRhIDwtIG1lZF9pbmNvbWVfMTlfc2hwX25hYmVzICU+JQogIGZpbHRlcihOVEFOYW1lID09ICJDYXJyb2xsIEdhcmRlbnMtQ29iYmxlIEhpbGwtR293YW51cy1SZWQgSG9vayIpCgptZWRfaW5jb21lX3RyYWN0XzE5IDwtIG1lZF9pbmNvbWVfMTlfc2hwX250YSAlPiUKICBmaWx0ZXIoTlRBMjAyMCA9PSAiQkswNjAxIikgJT4lCiAgZmlsdGVyKEdFT0lEID09IDM2MDQ3MDA3NzAwIHwKICAgICAgICAgICBHRU9JRCA9PSAzNjA0NzAwNzEwMCB8CiAgICAgICAgICAgR0VPSUQgPT0gMzYwNDcwMDc1MDAgfAogICAgICAgICAgIEdFT0lEID09IDM2MDQ3MDExNzAwIHwKICAgICAgICAgICBHRU9JRCA9PSAzNjA0NzAxMTkwMSB8CiAgICAgICAgICAgR0VPSUQgPT0gMzYwNDcwMTI3MDAgfAogICAgICAgICAgIEdFT0lEID09IDM2MDQ3MDEyMTAwKQoKIyBDcmVhdGUgc3VtbWFyeSBzdGF0cyBmb3IgQ0IgNiBhbmQgTlRhIGZvciBNSEkgYXQgdGhlIGNlbnN1cyB0cmFjdCBsZXZlbC4KbWVkX2luY29tZV8xOV9zdGF0c19jYjYgPC0gbWVkX2luY29tZV8xOV9zaHBfY2I2ICU+JQogIGdyb3VwX2J5KGNkdGEyMDIwKSAlPiUKICBzdW1tYXJpc2UoYENCIDYgTWluaW11bSBNSElgID0gbWluKG1oaV8xOV90b3RhbCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgYENCIDYgTWF4aW11bSBNSElgID0gbWF4KG1oaV8xOV90b3RhbCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgYENCIDYgQXZlcmFnZSBNSElgID0gcm91bmQobWVhbihtaGlfMTlfdG90YWwsIG5hLnJtID0gVFJVRSksIDMpLAogICAgICAgICAgICBgQ0IgNiBBdmVyYWdlIFdoaXRlIE1ISWAgPSByb3VuZChtZWFuKG1oaV8xOV93aGl0ZSwgbmEucm0gPSBUUlVFKSwgMyksCiAgICAgICAgICAgIGBDQiA2IEF2ZXJhZ2UgQmxhY2sgTUhJYCA9IHJvdW5kKG1lYW4obWhpXzE5X2JsYWNrLCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgICAgICAgICAgYENCIDYgQXZlcmFnZSBBc2lhbiBNSElgID0gcm91bmQobWVhbihtaGlfMTlfYXNpYW4sIG5hLnJtID0gVFJVRSksIDMpLAogICAgICAgICAgICBgQ0IgNiBBdmVyYWdlIExhdGlueCBNSElgID0gcm91bmQobWVhbihtaGlfMTlfbGF0aW54LCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgICAgICAgICAgYENCIDYgTWVkaWFuIE1ISWAgPSByb3VuZChtZWRpYW4obWhpXzE5X3RvdGFsLCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgICAgICAgICAgYENCIDYgTUhJIFJhbmdlYCA9IHJvdW5kKG1heChtaGlfMTlfdG90YWwsIG5hLnJtID0gVFJVRSkgLSBtaW4obWhpXzE5X3RvdGFsLCBuYS5ybSA9IFRSVUUpLCAzKSkKCm1lZF9pbmNvbWVfMTlfc3RhdHNfY2JzIDwtIHN0X2Ryb3BfZ2VvbWV0cnkobWVkX2luY29tZV8xOV9zdGF0c19jYjYpCgptZWRfaW5jb21lXzE5X3N0YXRzX250YSA8LSBtZWRfaW5jb21lXzE5X3NocF9udGEgJT4lCiAgZ3JvdXBfYnkoTlRBMjAyMCkgJT4lCiAgc3VtbWFyaXNlKGBOVEEgTWluaW11bSBNSElgID0gbWluKG1oaV8xOV90b3RhbCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgYE5UQSBNYXhpbXVtIE1ISWAgPSBtYXgobWhpXzE5X3RvdGFsLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBgTlRBIEF2ZXJhZ2UgTUhJYCA9IHJvdW5kKG1lYW4obWhpXzE5X3RvdGFsLCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgICAgICAgICAgYE5UQSBBdmVyYWdlIFdoaXRlIE1ISWAgPSByb3VuZChtZWFuKG1oaV8xOV93aGl0ZSwgbmEucm0gPSBUUlVFKSwgMyksCiAgICAgICAgICAgIGBOVEEgQXZlcmFnZSBCbGFjayBNSElgID0gcm91bmQobWVhbihtaGlfMTlfYmxhY2ssIG5hLnJtID0gVFJVRSksIDMpLAogICAgICAgICAgICBgTlRBIEF2ZXJhZ2UgQXNpYW4gTUhJYCA9IHJvdW5kKG1lYW4obWhpXzE5X2FzaWFuLCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgICAgICAgICAgYE5UQSBBdmVyYWdlIExhdGlueCBNSElgID0gcm91bmQobWVhbihtaGlfMTlfbGF0aW54LCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgICAgICAgICAgYE5UQSBNZWRpYW4gTUhJYCA9IHJvdW5kKG1lZGlhbihtaGlfMTlfdG90YWwsIG5hLnJtID0gVFJVRSksIDMpLAogICAgICAgICAgICBgTlRBIE1ISSBSYW5nZWAgPSByb3VuZChtYXgobWhpXzE5X3RvdGFsLCBuYS5ybSA9IFRSVUUpIC0gbWluKG1oaV8xOV90b3RhbCwgbmEucm0gPSBUUlVFKSwgMykpCgptZWRfaW5jb21lXzE5X3N0YXRzX250YXMgPC0gc3RfZHJvcF9nZW9tZXRyeShtZWRfaW5jb21lXzE5X3N0YXRzX250YSkKCm1lZF9pbmNvbWVfMTlfc3RhdHNfdHJhY3QgPC0gbWVkX2luY29tZV90cmFjdF8xOSAlPiUKICBncm91cF9ieShOVEEyMDIwKSAlPiUKICBzdW1tYXJpc2UoYFRyYWN0IE1pbmltdW0gTUhJYCA9IG1pbihtaGlfMTlfdG90YWwsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGBUcmFjdCBNYXhpbXVtIE1ISWAgPSBtYXgobWhpXzE5X3RvdGFsLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBgVHJhY3QgQXZlcmFnZSBNSElgID0gcm91bmQobWVhbihtaGlfMTlfdG90YWwsIG5hLnJtID0gVFJVRSksIDMpLAogICAgICAgICAgICBgVHJhY3QgQXZlcmFnZSBXaGl0ZSBNSElgID0gcm91bmQobWVhbihtaGlfMTlfd2hpdGUsIG5hLnJtID0gVFJVRSksIDMpLAogICAgICAgICAgICBgVHJhY3QgQXZlcmFnZSBCbGFjayBNSElgID0gcm91bmQobWVhbihtaGlfMTlfYmxhY2ssIG5hLnJtID0gVFJVRSksIDMpLAogICAgICAgICAgICBgVHJhY3QgQXZlcmFnZSBBc2lhbiBNSElgID0gcm91bmQobWVhbihtaGlfMTlfYXNpYW4sIG5hLnJtID0gVFJVRSksIDMpLAogICAgICAgICAgICBgVHJhY3QgQXZlcmFnZSBMYXRpbnggTUhJYCA9IHJvdW5kKG1lYW4obWhpXzE5X2xhdGlueCwgbmEucm0gPSBUUlVFKSwgMyksCiAgICAgICAgICAgIGBUcmFjdCBNZWRpYW4gTUhJYCA9IHJvdW5kKG1lZGlhbihtaGlfMTlfdG90YWwsIG5hLnJtID0gVFJVRSksIDMpLAogICAgICAgICAgICBgVHJhY3QgTUhJIFJhbmdlYCA9IHJvdW5kKG1heChtaGlfMTlfdG90YWwsIG5hLnJtID0gVFJVRSkgLSBtaW4obWhpXzE5X3RvdGFsLCBuYS5ybSA9IFRSVUUpLCAzKSkKCm1lZF9pbmNvbWVfMTlfc3RhdHNfdHJhY3RzIDwtIHN0X2Ryb3BfZ2VvbWV0cnkobWVkX2luY29tZV8xOV9zdGF0c190cmFjdCkKCmluY29tZV8yMDE5X3N1bW1hcnkgPC0gcmVhZC54bHN4KCdzdW1tYXJ5L2luY29tZV8yMDE5X3N1bW1hcnkueGxzeCcpCgppbmNvbWVfMTlfcCA8LSBnZ3Bsb3QoZGF0YT1pbmNvbWVfMjAxOV9zdW1tYXJ5LCBhZXMoeD1YMSwgeT1BdmVyYWdlX01lZF9JbmNvbWVfMjAxOSwgZmlsbD1BdmVyYWdlX01lZF9JbmNvbWVfMjAxOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKCJNZWRpYW4gSG91c2Vob2xkIEluY29tZTogIiwgc2NhbGVzOjpkb2xsYXIoQXZlcmFnZV9NZWRfSW5jb21lXzIwMTkpKSkpICsKICBnZW9tX2NvbCgpICsKICAjY291bGQgY2hhbmdlIHRoaXMg4oCcYW5nbGXigJ0gYmVsb3cgZnJvbSA5MCB0byAyNSBmb3IgaXQgdG8gYmUgYSBiaXQgbW9yZSByZWFkYWJsZQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbD1kb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gMUwpKSArCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKGxhYmVscyA9IGRvbGxhcl9mb3JtYXQoYWNjdXJhY3kgPSAxTCkpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJDRFRBMjAyMCIgPSAiQ29tbXVuaXR5IEJvYXJkIDIwMjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5UQTIwMjAiID0gIk5laWdoYm9yaG9vZCBUcmFjdCAyMDIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUUkFDVDIwMjAiID0gIlNlbGVjdGVkIFRyYWN0cyAyMDIwIikpICsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MjUsaGp1c3Q9MSx2anVzdD0wLjUpKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKyAjIHJlbW92ZSBncmlkbGluZXMKICBsYWJzKHggPSAiQm91bmRhcnkgb2YgR293YW51cyIsIHkgPSAiQXZlcmFnZSBNSEkgKFVTRCkiLCBmaWxsID0gIkF2ZXJhZ2UgTUhJIChVU0QpIikKZ2dwbG90bHkoaW5jb21lXzE5X3AsIHRvb2x0aXAgPSAidGV4dCIpICU+JQogIGxheW91dChtYXJnaW4gPSBsaXN0ICh0ID0gMTUwKSwgdGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoJzxicj4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01lZGlhbiBIb3VzZWhvbGQgSW5jb21lIGluIEdyZWF0ZXIgR293YW51cywgMjAxOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJyPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHN1cD4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J5IENEVEEsIE5UQSwgYW5kIFNlbGVjdGVkIENlbnN1cyBUcmFjdHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxicj4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzdXA+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTb3VyY2U6IEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkgMjAxNS0yMDE5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L3N1cD4nICkpKQpgYGAKClRoZSBhdmVyYWdlIE1lZGlhbiBIb3VzZWhvbGQgSW5jb21lIGluIENvbW11bml0eSBCb2FyZCA2IChiYXNlZCBvbiBBQ1MgMjAxNS0yMDE5IGRhdGEpLCBpcyAkMTI4LDkyMC4gT25seSBjb3VudGluZyB0aGUgR293YW51cyBOVEEgKHdoaWNoIGluIDIwMjAgaW5jbHVkZXMgQ2Fycm9sbCBHYXJkZW5zLCBDb2JibGUgSGlsbCwgYW5kIFJlZCBIb29rLCBhdmVyYWdlIE1ISSBpcyBcJDEyNCw2MTIuIEhvd2V2ZXIsIG9ubHkgY291bnRpbmcgdGhlIHNldmVuIEdvd2FudXMgY2Vuc3VzIHRyYWN0cywgdGhlIGF2ZXJhZ2UgTUhJIGlzIFwkOTcsNjg1LiBUaGlzIGlzIGEgXCQzMSwyMzUgZGlmZmVyZW5jZSwgaW5kaWNhdGluZyBhIHBvdGVudGlhbCBkaXNjcmVwYW5jeSBiZXR3ZWVuIHRoZSBpbmNvbWUgb2YgcGVvcGxlIGxpdmluZyBpbiBHb3dhbnVzIGFuZCB0aG9zZSBsaXZpbmcgaW4gc3Vycm91bmRpbmcgbmVpZ2hib3Job29kcy4KCmBgYHtyIGVjaG89Riwgd2FybmluZz1GLCBtZXNzYWdlPUZ9CiMjIyMjIFdoaXRlIEluY29tZSAjIyMjIwppbmNvbWVfMTlfd2hpdGVfcCA8LSBnZ3Bsb3QoZGF0YT1pbmNvbWVfMjAxOV9zdW1tYXJ5LCBhZXMoeD1YMSwgeT1BdmVyYWdlX1doaXRlX01ISV8yMDE5LCBmaWxsPUF2ZXJhZ2VfV2hpdGVfTUhJXzIwMTksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKCJNZWRpYW4gSG91c2Vob2xkIEluY29tZSwgV2hpdGUgUG9wOiAiLCBzY2FsZXM6OmRvbGxhcihBdmVyYWdlX1doaXRlX01ISV8yMDE5KSkpKSArCiAgZ2VvbV9jb2woKSArCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1lYW4oaW5jb21lXzIwMTlfc3VtbWFyeSRBdmVyYWdlX01lZF9JbmNvbWVfMjAxOSksIGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yPSJyZWQiKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gIk5UQTIwMjAiLCB5ID0gMTAwMDAwLCBsYWJlbCA9ICJNSEkgZm9yIFRvdGFsIFBvcCIsIHZqdXN0ID0gLTAuNSwgc2l6ZT0zKSArCiAgI2NvdWxkIGNoYW5nZSB0aGlzIOKAnGFuZ2xl4oCdIGJlbG93IGZyb20gOTAgdG8gMjUgZm9yIGl0IHRvIGJlIGEgYml0IG1vcmUgcmVhZGFibGUKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWw9ZG9sbGFyX2Zvcm1hdChhY2N1cmFjeSA9IDFMKSkgKwogIHNjYWxlX2ZpbGxfY29udGludW91cyhsYWJlbHMgPSBkb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gMUwpKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9YygiQ0RUQTIwMjAiID0gIkNvbW11bml0eSBCb2FyZCAyMDIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOVEEyMDIwIiA9ICJOZWlnaGJvcmhvb2QgVHJhY3QgMjAyMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVFJBQ1QyMDIwIiA9ICJTZWxlY3RlZCBUcmFjdHMgMjAyMCIpKSArCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTI1LGhqdXN0PTEsdmp1c3Q9MC41KSkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpICsgIyByZW1vdmUgZ3JpZGxpbmVzCiAgbGFicyh4ID0gIkJvdW5kYXJ5IG9mIEdvd2FudXMiLCB5ID0gIkF2ZXJhZ2UgTUhJLCBXaGl0ZSBQb3B1bGF0aW9uIChVU0QpIiwgZmlsbCA9ICJBdmVyYWdlIE1ISSwgV2hpdGUgUG9wIChVU0QpIikKZ2dwbG90bHkoaW5jb21lXzE5X3doaXRlX3AsIHRvb2x0aXAgPSAidGV4dCIpICU+JQogIGxheW91dChtYXJnaW4gPSBsaXN0ICh0ID0gMTUwKSwgdGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoJzxicj4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01lZGlhbiBIb3VzZWhvbGQgSW5jb21lLCBXaGl0ZSBQb3AgaW4gR3JlYXRlciBHb3dhbnVzLCAyMDE5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3VwPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnkgQ0RUQSwgTlRBLCBhbmQgU2VsZWN0ZWQgQ2Vuc3VzIFRyYWN0cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJyPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHN1cD4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NvdXJjZTogQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSAyMDE1LTIwMTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvc3VwPicgKSkpCmBgYAogCkxvb2tpbmcganVzdCBhdCB0aGUgaW5jb21lIG9mIHRoZSB3aGl0ZSBwb3B1bGF0aW9uIGF0IGVhY2ggc2NhbGUsIHRoZSBkaXNjcmVwYW5jeSBpZGVudGlmaWVkIGFib3ZlIGNhbiBiZSBvYnNlcnZlZCBhZ2Fpbiwgd2l0aCBtaWxkZXIgZWZmZWN0LiBUaGUgZGlmZmVyZW5jZSBpbiBhdmVyYWdlIE1ISSBhdCB0aGUgQ29tbXVuaXR5IEJvYXJkIGxldmVsIGFuZCB0aGUgdHJhY3QgbGV2ZWwgaXMgJDE3LDY1MC4gVGhpcyBkYXRhIGFsc28gaW5kaWNhdGVzIHRoYXQgd2hpdGUgcGVvcGxlIG9uIGF2ZXJhZ2UgaGF2ZSBoaWdoZXIgTUhJcyB0aGFuIHRoZSB0b3RhbCBwb3B1bGF0aW9uIGF0IGVhY2ggc2NhbGUuCgpgYGB7ciBlY2hvPUYsIHdhcm5pbmc9RiwgbWVzc2FnZT1GfQojIyMjIyBCbGFjayBJbmNvbWUgIyMjIyMKaW5jb21lXzE5X2JsYWNrX3AgPC0gZ2dwbG90KGRhdGE9aW5jb21lXzIwMTlfc3VtbWFyeSwgYWVzKHg9WDEsIHk9QXZlcmFnZV9CbGFja19NSElfMjAxOSwgZmlsbD1BdmVyYWdlX0JsYWNrX01ISV8yMDE5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCgiTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWUsIEJsYWNrIFBvcDogIiwgc2NhbGVzOjpkb2xsYXIoQXZlcmFnZV9CbGFja19NSElfMjAxOSkpKSkgKwogIGdlb21fY29sKCkgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWVhbihpbmNvbWVfMjAxOV9zdW1tYXJ5JEF2ZXJhZ2VfTWVkX0luY29tZV8yMDE5KSwgbGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3I9InJlZCIpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAiTlRBMjAyMCIsIHkgPSAxMDAwMDAsIGxhYmVsID0gIk1ISSBmb3IgVG90YWwgUG9wIiwgdmp1c3QgPSAtMC41LCBzaXplPTMpICsKICAjY291bGQgY2hhbmdlIHRoaXMg4oCcYW5nbGXigJ0gYmVsb3cgZnJvbSA5MCB0byAyNSBmb3IgaXQgdG8gYmUgYSBiaXQgbW9yZSByZWFkYWJsZQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbD1kb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gMUwpKSArCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKGxhYmVscyA9IGRvbGxhcl9mb3JtYXQoYWNjdXJhY3kgPSAxTCkpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJDRFRBMjAyMCIgPSAiQ29tbXVuaXR5IEJvYXJkIDIwMjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5UQTIwMjAiID0gIk5laWdoYm9yaG9vZCBUcmFjdCAyMDIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUUkFDVDIwMjAiID0gIlNlbGVjdGVkIFRyYWN0cyAyMDIwIikpICsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MjUsaGp1c3Q9MSx2anVzdD0wLjUpKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKyAjIHJlbW92ZSBncmlkbGluZXMKICBsYWJzKHggPSAiQm91bmRhcnkgb2YgR293YW51cyIsIHkgPSAiQXZlcmFnZSBNSEksIEJsYWNrIFBvcHVsYXRpb24gKFVTRCkiLCBmaWxsID0gIkF2ZXJhZ2UgTUhJLCBCbGFjayBQb3AgKFVTRCkiKQpnZ3Bsb3RseShpbmNvbWVfMTlfYmxhY2tfcCwgdG9vbHRpcCA9ICJ0ZXh0IikgJT4lCiAgbGF5b3V0KG1hcmdpbiA9IGxpc3QgKHQgPSAxNTApLCB0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgnPGJyPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWUsIEJsYWNrIFBvcCBpbiBHcmVhdGVyIEdvd2FudXMsIDIwMTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxicj4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzdXA+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdieSBDRFRBLCBOVEEsIGFuZCBTZWxlY3RlZCBDZW5zdXMgVHJhY3RzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3VwPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU291cmNlOiBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IDIwMTUtMjAxOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9zdXA+JyApKSkKYGBgCgpUaGlzIGRpc2NyZXBhbmN5IGlzIGV2ZW4gbW9yZSBleHRyZW1lIHdoZW4gbG9va2luZyBhdCBtZWRpYW4gaG91c2Vob2xkIGluY29tZSBmb3IgdGhlIEJsYWNrIHBvcHVsYXRpb24gYXQgZWFjaCBzY2FsZS4gQWNjb3JkaW5nIHRvIHRoZSBkYXRhIGF2YWlsYWJsZSBpbiB0aGUgQUNTLCB0aGUgYXZlcmFnZSBNSEkgZm9yIHRoZSBCbGFjayBwb3B1bGF0aW9uIGluIENvbW11bml0eSBCb2FyZCA2IGlzICQ1MCwwNDcgbW9yZSB0aGFuIGZvciB0aGUgQmxhY2sgcG9wdWxhdGlvbiBpbiB0aGUgc2VsZWN0ZWQgY2Vuc3VzIHRyYWN0cy4gSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIG1lZGlhbiBob3VzZWhvbGQgaW5jb21lIGFtb25nIEJsYWNrIHBlb3BsZSBsaXZpbmcgaW4gdGhlIHNlbGVjdGVkIHRyYWNrcyBpcyBzcGFyc2UgYW5kIGhhcyBhIGhpZ2ggbWFyZ2luIG9mIGVycm9yLiBIb3dldmVyLCBpdCBpcyBpbmNsdWRlZCBoZXJlIHRvIGJvdGggaGlnaGxpZ2h0IHRoZSBkaXZpZGUgYmV0d2VlbiB0aGUgTUhJIG9mIHRoZSB0b3RhbCBwb3B1bGF0aW9uIGluIENCNiBhbmQgdGhhdCBvZiB0aGUgQmxhY2sgcG9wdWxhdGlvbiwgYXMgd2VsbCBhcyB0byBkcmF3IGF0dGVudGlvbiB0byB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIHBhdHRlcm4gZXN0YWJsaXNoZWQgYWJvdmUuCgpgYGB7ciBlY2hvPUYsIHdhcm5pbmc9RiwgbWVzc2FnZT1GfQojIyMjIyBMYXRpbnggSW5jb21lICMjIyMjCmluY29tZV8xOV9sYXRpbnhfcCA8LSBnZ3Bsb3QoZGF0YT1pbmNvbWVfMjAxOV9zdW1tYXJ5LCBhZXMoeD1YMSwgeT1BdmVyYWdlX0xhdGlueF9NSElfMjAxOSwgZmlsbD1BdmVyYWdlX0xhdGlueF9NSElfMjAxOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoIk1lZGlhbiBIb3VzZWhvbGQgSW5jb21lLCBCbGFjayBQb3A6ICIsIHNjYWxlczo6ZG9sbGFyKEF2ZXJhZ2VfTGF0aW54X01ISV8yMDE5KSkpKSArCiAgZ2VvbV9jb2woKSArCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtZWFuKGluY29tZV8yMDE5X3N1bW1hcnkkQXZlcmFnZV9NZWRfSW5jb21lXzIwMTkpLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvcj0icmVkIikgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9ICJOVEEyMDIwIiwgeSA9IDEwMDAwMCwgbGFiZWwgPSAiTUhJIGZvciBUb3RhbCBQb3AiLCB2anVzdCA9IC0wLjUsIHNpemU9MykgKwogICNjb3VsZCBjaGFuZ2UgdGhpcyDigJxhbmdsZeKAnSBiZWxvdyBmcm9tIDkwIHRvIDI1IGZvciBpdCB0byBiZSBhIGJpdCBtb3JlIHJlYWRhYmxlCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVsPWRvbGxhcl9mb3JtYXQoYWNjdXJhY3kgPSAxTCkpICsKICBzY2FsZV9maWxsX2NvbnRpbnVvdXMobGFiZWxzID0gZG9sbGFyX2Zvcm1hdChhY2N1cmFjeSA9IDFMKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkNEVEEyMDIwIiA9ICJDb21tdW5pdHkgQm9hcmQgMjAyMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTlRBMjAyMCIgPSAiTmVpZ2hib3Job29kIFRyYWN0IDIwMjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRSQUNUMjAyMCIgPSAiU2VsZWN0ZWQgVHJhY3RzIDIwMjAiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0yNSxoanVzdD0xLHZqdXN0PTAuNSkpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArICMgcmVtb3ZlIGdyaWRsaW5lcwogIGxhYnMoeCA9ICJCb3VuZGFyeSBvZiBHb3dhbnVzIiwgeSA9ICJBdmVyYWdlIE1ISSwgTGF0aW54IFBvcHVsYXRpb24gKFVTRCkiLCBmaWxsID0gIkF2ZXJhZ2UgTUhJLCBMYXRpbnggUG9wIChVU0QpIikKZ2dwbG90bHkoaW5jb21lXzE5X2xhdGlueF9wLCB0b29sdGlwID0gInRleHQiKSAlPiUKICBsYXlvdXQobWFyZ2luID0gbGlzdCAodCA9IDE1MCksIHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCc8YnI+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNZWRpYW4gSG91c2Vob2xkIEluY29tZSwgTGF0aW54IFBvcCBpbiBHcmVhdGVyIEdvd2FudXMsIDIwMTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxicj4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzdXA+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdieSBDRFRBLCBOVEEsIGFuZCBTZWxlY3RlZCBDZW5zdXMgVHJhY3RzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3VwPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU291cmNlOiBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IDIwMTUtMjAxOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9zdXA+JyApKSkKYGBgCgpBY2NvcmRpbmcgdG8gdGhlIEFDUyAyMDE1LTIwMTkgZGF0YSBvbiBtZWRpYW4gaG91c2Vob2xkIGluY29tZSwgdGhlIExhdGlueCBwb3B1bGF0aW9uIGluIENCNiBhcyBhIHdob2xlIGVhcm5zIGFyb3VuZCAkMjAsMDAwIGxlc3MgdGhhbiB0aGUgdG90YWwgcG9wdWxhdGlvbi4gVGhpcyBkaXNjcmVwYW5jeSBpcyBldmVuIGdyZWF0ZXIgd2hlbiBsb29raW5nIGF0IHNjYWxlcyBzbWFsbGVyIHRoYW4gdGhlIENvbW11bml0eSBCb2FyZC9Db21tdW5pdHkgRGlzdHJpY3QgVGFidWxhdGlvbiBBcmVhLjxicj48YnI+CgojIyMjIFJlbnQgYW5kIEhvdXNpbmcKCmBgYHtyIGVjaG89Riwgd2FybmluZz1GLCBtZXNzYWdlPUZ9CiMjIyMjIDUtWWVhciBBQ1MgMjAxNS0yMDE5ICMjIyMjCiMgTWVkaWFuIEdyb3NzIE1vbnRobHkgUmVudCAtIEIyNTA2NF8wMDEKIyBNZWRpYW4gTW9udGhseSBIb3VzaW5nIENvc3RzIC0gQjI1MTA1XzAwMQojIE1lZGlhbiBIb21lIFZhbHVlIC0gQjI1MDc3XzAwMQoKYWNzMTlfdGFibGVzIDwtIGxvYWRfdmFyaWFibGVzKHllYXIgPSAyMDE5LCJhY3M1IiwgY2FjaGUgPSBUUlVFKQoKcmF3X2hvdXNpbmdfMTlfc2hwIDwtIGdldF9hY3MoZ2VvZ3JhcGh5ID0gInRyYWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMgPSAiQjI1MDY0XzAwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU9J05ZJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHkgPSAnS2luZ3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAxOSkKCnJhd19ob3VzaW5nXzE5IDwtIGdldF9hY3MoZ2VvZ3JhcGh5ID0gInRyYWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMgPSBjKCJCMjUwNjRfMDAxIiwgIkIyNTEwNV8wMDEiLCAiQjI1MDc3XzAwMSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlPSdOWScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnR5ID0gJ0tpbmdzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hID0gIk4vQSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9IDIwMTkpCgpob3VzaW5nX2RhdGFfMTkgPC0gcmF3X2hvdXNpbmdfMTkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHZhcmlhYmxlLCB2YWx1ZXNfZnJvbSA9IGMoZXN0aW1hdGUsIG1vZSkpICU+JQogIHJlbmFtZShtZWRfZ3Jvc3NfcmVudF8xOSA9ICJlc3RpbWF0ZV9CMjUwNjRfMDAxIiwKICAgICAgICAgZ3Jvc3NfcmVudF9tb2VfMTkgPSAibW9lX0IyNTA2NF8wMDEiLAogICAgICAgICBtZWRfaG91c2luZ19jb3N0c18xOSA9ICJlc3RpbWF0ZV9CMjUxMDVfMDAxIiwKICAgICAgICAgaG91c2luZ19jb3N0c19tb2VfMTkgPSAibW9lX0IyNTEwNV8wMDEiLAogICAgICAgICBtZWRfaG9tZV92YWx1ZV8xOSA9ICJlc3RpbWF0ZV9CMjUwNzdfMDAxIiwKICAgICAgICAgaG9tZV92YWx1ZV9tb2VfMTkgPSAibW9lX0IyNTA3N18wMDEiKSAlPiUKICBtdXRhdGUoZ3Jvc3NfcmVudF9tb2VfcGN0ID0gcm91bmQoZ3Jvc3NfcmVudF9tb2VfMTkvbWVkX2dyb3NzX3JlbnRfMTksIDMpLAogICAgICAgICBob3VzaW5nX2Nvc3RzX21vZV9wY3QgPSByb3VuZChob3VzaW5nX2Nvc3RzX21vZV8xOS9tZWRfaG91c2luZ19jb3N0c18xOSwgMyksCiAgICAgICAgIGhvbWVfdmFsdWVfbW9lX3BjdCA9IHJvdW5kKGhvbWVfdmFsdWVfbW9lXzE5L21lZF9ob21lX3ZhbHVlXzE5LCAzKSkgJT4lCiAgc2VsZWN0KEdFT0lELCBOQU1FLCBtZWRfZ3Jvc3NfcmVudF8xOSwgZ3Jvc3NfcmVudF9tb2VfMTksIGdyb3NzX3JlbnRfbW9lX3BjdCwgbWVkX2hvdXNpbmdfY29zdHNfMTksCiAgICAgICAgIGhvdXNpbmdfY29zdHNfbW9lXzE5LCBob3VzaW5nX2Nvc3RzX21vZV9wY3QsIG1lZF9ob21lX3ZhbHVlXzE5LCBob21lX3ZhbHVlX21vZV8xOSwgaG9tZV92YWx1ZV9tb2VfcGN0KQoKaG91c2luZ19kYXRhXzE5X3NocCA8LSByYXdfaG91c2luZ18xOV9zaHAgJT4lCiAgaW5uZXJfam9pbihob3VzaW5nX2RhdGFfMTkpICU+JQogIHNlbGVjdChHRU9JRCwgTkFNRSwgbWVkX2dyb3NzX3JlbnRfMTksIGdyb3NzX3JlbnRfbW9lXzE5LCBtZWRfaG91c2luZ19jb3N0c18xOSwKICAgICAgICAgaG91c2luZ19jb3N0c19tb2VfMTksIG1lZF9ob21lX3ZhbHVlXzE5LCBob21lX3ZhbHVlX21vZV8xOSwgZ2VvbWV0cnkpCgojNWQpIFRyYW5zZm9ybSBjZW5zdXMgc3BhdGlhbCBkYXRhIGZyYW1lIHRvIGNvcnJlY3QgcHJvamVjdGlvbgoKaG91c2luZ19kYXRhXzE5XzIyNjMgPC0gaG91c2luZ19kYXRhXzE5X3NocCAlPiUKICBzdF90cmFuc2Zvcm0oMjI2MykKCiM1ZSkgSm9pbiBDRFRBIHNwYXRpYWwgZGF0YSB0byBjZW5zdXMgc3BhdGlhbCBkYXRhCiNKb2luIENEVEEgc3BhdGlhbCBkYXRhIHRvIGNlbnN1cyBzcGF0aWFsIGRhdGEKaG91c2luZ19kYXRhXzE5X3NocF9jYnMgPC0gaG91c2luZ19kYXRhXzE5XzIyNjMgJT4lCiAgc3Rfam9pbihjYnMsIGpvaW4gPSBzdF9pbnRlcnNlY3RzKQoKaG91c2luZ19kYXRhXzE5X3NocF9uYWJlcyA8LSBob3VzaW5nX2RhdGFfMTlfMjI2MyAlPiUKICBzdF9qb2luKG5hYmVzLCBqb2luID0gc3RfaW50ZXJzZWN0cykKCiMgRmlsdGVyIGRhdGEgYnkgQ0I2IGFuZCBOVEEgdG8gcHVsbCBzdW1tYXJ5IHN0YXRzCmhvdXNpbmdfZGF0YV8xOV9zaHBfY2I2IDwtIGhvdXNpbmdfZGF0YV8xOV9zaHBfY2JzICU+JQogIGZpbHRlcihjZHRhbmFtZSA9PSAiQkswNiBQYXJrIFNsb3BlLUNhcnJvbGwgR2FyZGVucyAoQ0QgNiBBcHByb3hpbWF0aW9uKSIpCgpob3VzaW5nX2RhdGFfMTlfc2hwX250YSA8LSBob3VzaW5nX2RhdGFfMTlfc2hwX25hYmVzICU+JQogIGZpbHRlcihOVEFOYW1lID09ICJDYXJyb2xsIEdhcmRlbnMtQ29iYmxlIEhpbGwtR293YW51cy1SZWQgSG9vayIpCgpob3VzaW5nX2RhdGFfdHJhY3RfMTkgPC0gaG91c2luZ19kYXRhXzE5X3NocF9udGEgJT4lCiAgZmlsdGVyKE5UQTIwMjAgPT0gIkJLMDYwMSIpICU+JQogIGZpbHRlcihHRU9JRCA9PSAzNjA0NzAwNzcwMCB8CiAgICAgICAgICAgR0VPSUQgPT0gMzYwNDcwMDcxMDAgfAogICAgICAgICAgIEdFT0lEID09IDM2MDQ3MDA3NTAwIHwKICAgICAgICAgICBHRU9JRCA9PSAzNjA0NzAxMTcwMCB8CiAgICAgICAgICAgR0VPSUQgPT0gMzYwNDcwMTE5MDEgfAogICAgICAgICAgIEdFT0lEID09IDM2MDQ3MDEyNzAwIHwKICAgICAgICAgICBHRU9JRCA9PSAzNjA0NzAxMjEwMCkKCiMgQ3JlYXRlIHN1bW1hcnkgc3RhdHMgZm9yIENCIDYgYW5kIE5UYSBmb3IgTUhJIGF0IHRoZSBjZW5zdXMgdHJhY3QgbGV2ZWwuCm1lZF9yZW50XzE5X3N0YXRzX2NiNiA8LSBob3VzaW5nX2RhdGFfMTlfc2hwX2NiNiAlPiUKICBncm91cF9ieShjZHRhMjAyMCkgJT4lCiAgc3VtbWFyaXNlKGBDQiA2IE1pbmltdW0gTWVkIEdyb3NzIFJlbnRgID0gbWluKG1lZF9ncm9zc19yZW50XzE5LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBgQ0IgNiBNYXhpbXVtIE1lZCBHcm9zcyBSZW50YCA9IG1heChtZWRfZ3Jvc3NfcmVudF8xOSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgYENCIDYgQXZlcmFnZSBNZWQgR3Jvc3MgUmVudGAgPSByb3VuZChtZWFuKG1lZF9ncm9zc19yZW50XzE5LCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgICAgICAgICAgYENCIDYgTWVkaWFuIE1lZCBHcm9zcyBSZW50YCA9IHJvdW5kKG1lZGlhbihtZWRfZ3Jvc3NfcmVudF8xOSwgbmEucm0gPSBUUlVFKSwgMyksCiAgICAgICAgICAgIGBDQiA2IE1lZCBHcm9zcyBSZW50IFJhbmdlYCA9IHJvdW5kKG1heChtZWRfZ3Jvc3NfcmVudF8xOSwgbmEucm0gPSBUUlVFKSAtIG1pbihtZWRfZ3Jvc3NfcmVudF8xOSwgbmEucm0gPSBUUlVFKSwgMykpCgptZWRfcmVudF8xOV9zdGF0c19jYnMgPC0gc3RfZHJvcF9nZW9tZXRyeShtZWRfcmVudF8xOV9zdGF0c19jYjYpCgptZWRfaG9tZV92YWx1ZV8xOV9zdGF0c19jYjYgPC0gaG91c2luZ19kYXRhXzE5X3NocF9jYjYgJT4lCiAgZ3JvdXBfYnkoY2R0YTIwMjApICU+JQogIHN1bW1hcmlzZShgQ0IgNiBNaW5pbXVtIE1lZCBIb21lIFZhbHVlYCA9IG1pbihtZWRfaG9tZV92YWx1ZV8xOSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgYENCIDYgTWF4aW11bSBNZWQgSG9tZSBWYWx1ZWAgPSBtYXgobWVkX2hvbWVfdmFsdWVfMTksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGBDQiA2IEF2ZXJhZ2UgTWVkIEhvbWUgVmFsdWVgID0gcm91bmQobWVhbihtZWRfaG9tZV92YWx1ZV8xOSwgbmEucm0gPSBUUlVFKSwgMyksCiAgICAgICAgICAgIGBDQiA2IE1lZGlhbiBNZWQgSG9tZSBWYWx1ZWAgPSByb3VuZChtZWRpYW4obWVkX2hvbWVfdmFsdWVfMTksIG5hLnJtID0gVFJVRSksIDMpLAogICAgICAgICAgICBgQ0IgNiBNZWQgSG9tZSBWYWx1ZWAgPSByb3VuZChtYXgobWVkX2hvbWVfdmFsdWVfMTksIG5hLnJtID0gVFJVRSkgLSBtaW4obWVkX2hvbWVfdmFsdWVfMTksIG5hLnJtID0gVFJVRSksIDMpKQoKbWVkX2hvbWVfdmFsdWVfMTlfc3RhdHNfY2JzIDwtIHN0X2Ryb3BfZ2VvbWV0cnkobWVkX2hvbWVfdmFsdWVfMTlfc3RhdHNfY2I2KQoKbWVkX2hvdXNpbmdfY29zdHNfMTlfc3RhdHNfY2I2IDwtIGhvdXNpbmdfZGF0YV8xOV9zaHBfY2I2ICU+JQogIGdyb3VwX2J5KGNkdGEyMDIwKSAlPiUKICBzdW1tYXJpc2UoYENCIDYgTWluaW11bSBNZWQgSG91c2luZyBDb3N0c2AgPSBtaW4obWVkX2hvdXNpbmdfY29zdHNfMTksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGBDQiA2IE1heGltdW0gTWVkIEhvdXNpbmcgQ29zdHNgID0gbWF4KG1lZF9ob3VzaW5nX2Nvc3RzXzE5LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBgQ0IgNiBBdmVyYWdlIE1lZCBIb3VzaW5nIENvc3RzYCA9IHJvdW5kKG1lYW4obWVkX2hvdXNpbmdfY29zdHNfMTksIG5hLnJtID0gVFJVRSksIDMpLAogICAgICAgICAgICBgQ0IgNiBNZWRpYW4gTWVkIEhvdXNpbmcgQ29zdHNgID0gcm91bmQobWVkaWFuKG1lZF9ob3VzaW5nX2Nvc3RzXzE5LCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgICAgICAgICAgYENCIDYgTWVkIEhvdXNpbmcgQ29zdHNgID0gcm91bmQobWF4KG1lZF9ob3VzaW5nX2Nvc3RzXzE5LCBuYS5ybSA9IFRSVUUpIC0gbWluKG1lZF9ob3VzaW5nX2Nvc3RzXzE5LCBuYS5ybSA9IFRSVUUpLCAzKSkKCm1lZF9ob3VzaW5nX2Nvc3RzXzE5X3N0YXRzX2NicyA8LSBzdF9kcm9wX2dlb21ldHJ5KG1lZF9ob3VzaW5nX2Nvc3RzXzE5X3N0YXRzX2NiNikKCm1lZF9yZW50XzE5X3N0YXRzX250YSA8LSBob3VzaW5nX2RhdGFfMTlfc2hwX250YSAlPiUKICBncm91cF9ieShOVEFOYW1lKSAlPiUKICBzdW1tYXJpc2UoYE5UQSBNaW5pbXVtIE1lZCBHcm9zcyBSZW50YCA9IG1pbihtZWRfZ3Jvc3NfcmVudF8xOSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgYE5UQSBNYXhpbXVtIE1lZCBHcm9zcyBSZW50YCA9IG1heChtZWRfZ3Jvc3NfcmVudF8xOSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgYE5UQSBBdmVyYWdlIE1lZCBHcm9zcyBSZW50YCA9IHJvdW5kKG1lYW4obWVkX2dyb3NzX3JlbnRfMTksIG5hLnJtID0gVFJVRSksIDMpLAogICAgICAgICAgICBgTlRBIE1lZGlhbiBNZWQgR3Jvc3MgUmVudGAgPSByb3VuZChtZWRpYW4obWVkX2dyb3NzX3JlbnRfMTksIG5hLnJtID0gVFJVRSksIDMpLAogICAgICAgICAgICBgTlRBIE1lZCBHcm9zcyBSZW50IFJhbmdlYCA9IHJvdW5kKG1heChtZWRfZ3Jvc3NfcmVudF8xOSwgbmEucm0gPSBUUlVFKSAtIG1pbihtZWRfZ3Jvc3NfcmVudF8xOSwgbmEucm0gPSBUUlVFKSwgMykpCgptZWRfcmVudF8xOV9zdGF0c19udGFzIDwtIHN0X2Ryb3BfZ2VvbWV0cnkobWVkX3JlbnRfMTlfc3RhdHNfbnRhKQoKbWVkX2hvbWVfdmFsdWVfMTlfc3RhdHNfbnRhIDwtIGhvdXNpbmdfZGF0YV8xOV9zaHBfbnRhICU+JQogIGdyb3VwX2J5KE5UQU5hbWUpICU+JQogIHN1bW1hcmlzZShgTlRBIE1pbmltdW0gTWVkIEhvbWUgVmFsdWVgID0gbWluKG1lZF9ob21lX3ZhbHVlXzE5LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBgTlRBIE1heGltdW0gTWVkIEhvbWUgVmFsdWVgID0gbWF4KG1lZF9ob21lX3ZhbHVlXzE5LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBgTlRBIEF2ZXJhZ2UgTWVkIEhvbWUgVmFsdWVgID0gcm91bmQobWVhbihtZWRfaG9tZV92YWx1ZV8xOSwgbmEucm0gPSBUUlVFKSwgMyksCiAgICAgICAgICAgIGBOVEEgTWVkaWFuIE1lZCBIb21lIFZhbHVlYCA9IHJvdW5kKG1lZGlhbihtZWRfaG9tZV92YWx1ZV8xOSwgbmEucm0gPSBUUlVFKSwgMyksCiAgICAgICAgICAgIGBOVEEgTWVkIEhvbWUgVmFsdWVgID0gcm91bmQobWF4KG1lZF9ob21lX3ZhbHVlXzE5LCBuYS5ybSA9IFRSVUUpIC0gbWluKG1lZF9ob21lX3ZhbHVlXzE5LCBuYS5ybSA9IFRSVUUpLCAzKSkKCm1lZF9ob21lX3ZhbHVlXzE5X3N0YXRzX250YXMgPC0gc3RfZHJvcF9nZW9tZXRyeShtZWRfaG9tZV92YWx1ZV8xOV9zdGF0c19udGEpCgptZWRfaG91c2luZ19jb3N0c18xOV9zdGF0c19udGEgPC0gaG91c2luZ19kYXRhXzE5X3NocF9udGEgJT4lCiAgZ3JvdXBfYnkoTlRBTmFtZSkgJT4lCiAgc3VtbWFyaXNlKGBOVEEgTWluaW11bSBNZWQgSG91c2luZyBDb3N0c2AgPSBtaW4obWVkX2hvdXNpbmdfY29zdHNfMTksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGBOVEEgTWF4aW11bSBNZWQgSG91c2luZyBDb3N0c2AgPSBtYXgobWVkX2hvdXNpbmdfY29zdHNfMTksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGBOVEEgQXZlcmFnZSBNZWQgSG91c2luZyBDb3N0c2AgPSByb3VuZChtZWFuKG1lZF9ob3VzaW5nX2Nvc3RzXzE5LCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgICAgICAgICAgYE5UQSBNZWRpYW4gTWVkIEhvdXNpbmcgQ29zdHNgID0gcm91bmQobWVkaWFuKG1lZF9ob3VzaW5nX2Nvc3RzXzE5LCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgICAgICAgICAgYE5UQSBNZWQgSG91c2luZyBDb3N0c2AgPSByb3VuZChtYXgobWVkX2hvdXNpbmdfY29zdHNfMTksIG5hLnJtID0gVFJVRSkgLSBtaW4obWVkX2hvdXNpbmdfY29zdHNfMTksIG5hLnJtID0gVFJVRSksIDMpKQoKbWVkX2hvdXNpbmdfY29zdHNfMTlfc3RhdHNfbnRhcyA8LSBzdF9kcm9wX2dlb21ldHJ5KG1lZF9ob3VzaW5nX2Nvc3RzXzE5X3N0YXRzX250YSkKCm1lZF9yZW50XzE5X3N0YXRzX3RyYWN0IDwtIGhvdXNpbmdfZGF0YV90cmFjdF8xOSAlPiUKICBncm91cF9ieShOVEFOYW1lKSAlPiUKICBzdW1tYXJpc2UoYFRyYWN0IE1pbmltdW0gTWVkIEdyb3NzIFJlbnRgID0gbWluKG1lZF9ncm9zc19yZW50XzE5LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBgVHJhY3QgTWF4aW11bSBNZWQgR3Jvc3MgUmVudGAgPSBtYXgobWVkX2dyb3NzX3JlbnRfMTksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGBUcmFjdCBBdmVyYWdlIE1lZCBHcm9zcyBSZW50YCA9IHJvdW5kKG1lYW4obWVkX2dyb3NzX3JlbnRfMTksIG5hLnJtID0gVFJVRSksIDMpLAogICAgICAgICAgICBgVHJhY3QgTWVkaWFuIE1lZCBHcm9zcyBSZW50YCA9IHJvdW5kKG1lZGlhbihtZWRfZ3Jvc3NfcmVudF8xOSwgbmEucm0gPSBUUlVFKSwgMyksCiAgICAgICAgICAgIGBUcmFjdCBNZWQgR3Jvc3MgUmVudCBSYW5nZWAgPSByb3VuZChtYXgobWVkX2dyb3NzX3JlbnRfMTksIG5hLnJtID0gVFJVRSkgLSBtaW4obWVkX2dyb3NzX3JlbnRfMTksIG5hLnJtID0gVFJVRSksIDMpKQoKbWVkX3JlbnRfMTlfc3RhdHNfdHJhY3RzIDwtIHN0X2Ryb3BfZ2VvbWV0cnkobWVkX3JlbnRfMTlfc3RhdHNfdHJhY3QpCgptZWRfaG9tZV92YWx1ZV8xOV9zdGF0c190cmFjdCA8LSBob3VzaW5nX2RhdGFfdHJhY3RfMTkgJT4lCiAgZ3JvdXBfYnkoTlRBTmFtZSkgJT4lCiAgc3VtbWFyaXNlKGBUcmFjdCBNaW5pbXVtIE1lZCBIb21lIFZhbHVlYCA9IG1pbihtZWRfaG9tZV92YWx1ZV8xOSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgYFRyYWN0IE1heGltdW0gTWVkIEhvbWUgVmFsdWVgID0gbWF4KG1lZF9ob21lX3ZhbHVlXzE5LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBgVHJhY3QgQXZlcmFnZSBNZWQgSG9tZSBWYWx1ZWAgPSByb3VuZChtZWFuKG1lZF9ob21lX3ZhbHVlXzE5LCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgICAgICAgICAgYFRyYWN0IE1lZGlhbiBNZWQgSG9tZSBWYWx1ZWAgPSByb3VuZChtZWRpYW4obWVkX2hvbWVfdmFsdWVfMTksIG5hLnJtID0gVFJVRSksIDMpLAogICAgICAgICAgICBgVHJhY3QgTWVkIEhvbWUgVmFsdWVgID0gcm91bmQobWF4KG1lZF9ob21lX3ZhbHVlXzE5LCBuYS5ybSA9IFRSVUUpIC0gbWluKG1lZF9ob21lX3ZhbHVlXzE5LCBuYS5ybSA9IFRSVUUpLCAzKSkKCm1lZF9ob21lX3ZhbHVlXzE5X3N0YXRzX3RyYWN0cyA8LSBzdF9kcm9wX2dlb21ldHJ5KG1lZF9ob21lX3ZhbHVlXzE5X3N0YXRzX3RyYWN0KQoKbWVkX2hvdXNpbmdfY29zdHNfMTlfc3RhdHNfdHJhY3QgPC0gaG91c2luZ19kYXRhX3RyYWN0XzE5ICU+JQogIGdyb3VwX2J5KE5UQU5hbWUpICU+JQogIHN1bW1hcmlzZShgVHJhY3QgTWluaW11bSBNZWQgSG91c2luZyBDb3N0c2AgPSBtaW4obWVkX2hvdXNpbmdfY29zdHNfMTksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGBUcmFjdCBNYXhpbXVtIE1lZCBIb3VzaW5nIENvc3RzYCA9IG1heChtZWRfaG91c2luZ19jb3N0c18xOSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgYFRyYWN0IEF2ZXJhZ2UgTWVkIEhvdXNpbmcgQ29zdHNgID0gcm91bmQobWVhbihtZWRfaG91c2luZ19jb3N0c18xOSwgbmEucm0gPSBUUlVFKSwgMyksCiAgICAgICAgICAgIGBUcmFjdCBNZWRpYW4gTWVkIEhvdXNpbmcgQ29zdHNgID0gcm91bmQobWVkaWFuKG1lZF9ob3VzaW5nX2Nvc3RzXzE5LCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgICAgICAgICAgYFRyYWN0IE1lZCBIb3VzaW5nIENvc3RzYCA9IHJvdW5kKG1heChtZWRfaG91c2luZ19jb3N0c18xOSwgbmEucm0gPSBUUlVFKSAtIG1pbihtZWRfaG91c2luZ19jb3N0c18xOSwgbmEucm0gPSBUUlVFKSwgMykpCgptZWRfaG91c2luZ19jb3N0c18xOV9zdGF0c190cmFjdHMgPC0gc3RfZHJvcF9nZW9tZXRyeShtZWRfaG91c2luZ19jb3N0c18xOV9zdGF0c190cmFjdCkKCnJlbnRfMjAxOV9zdW1tYXJ5IDwtIHJlYWQueGxzeCgnc3VtbWFyeS9yZW50XzIwMTlfc3VtbWFyeS54bHN4JykKaG91c2luZ19jb3N0c18yMDE5X3N1bW1hcnkgPC0gcmVhZC54bHN4KCdzdW1tYXJ5L2hvdXNpbmdfY29zdHNfMjAxOV9zdW1tYXJ5Lnhsc3gnKQpob21lX3ZhbHVlXzIwMTlfc3VtbWFyeSA8LSByZWFkLnhsc3goJ3N1bW1hcnkvaG9tZV92YWx1ZV8yMDE5X3N1bW1hcnkueGxzeCcpICAKCiMjIyMjIEhvdXNpbmcgQUNTIDIwMTUtMjAxOSBIaXN0b2dyYW1zICMjIyMjCiMjIyMjIFJlbnQgUGxvdCAjIyMjIwpyZW50XzE5X3AgPC0gZ2dwbG90KGRhdGE9cmVudF8yMDE5X3N1bW1hcnksIGFlcyh4PVgxLCB5PUF2ZXJhZ2VfTWVkaWFuX1JlbnRfMjAxOSwgZmlsbD1BdmVyYWdlX01lZGlhbl9SZW50XzIwMTksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoIkF2ZXJhZ2UgTWVkaWFuIFJlbnQ6ICIsIHNjYWxlczo6ZG9sbGFyKEF2ZXJhZ2VfTWVkaWFuX1JlbnRfMjAxOSkpKSkgKwogIGdlb21fY29sKCkgKwogICNjb3VsZCBjaGFuZ2UgdGhpcyDigJxhbmdsZeKAnSBiZWxvdyBmcm9tIDkwIHRvIDI1IGZvciBpdCB0byBiZSBhIGJpdCBtb3JlIHJlYWRhYmxlCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVsPWRvbGxhcl9mb3JtYXQoYWNjdXJhY3kgPSAxTCkpICsKICBzY2FsZV9maWxsX2NvbnRpbnVvdXMobGFiZWxzID0gZG9sbGFyX2Zvcm1hdChhY2N1cmFjeSA9IDFMKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkNEVEEyMDIwIiA9ICJDb21tdW5pdHkgQm9hcmQgMjAyMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTlRBMjAyMCIgPSAiTmVpZ2hib3Job29kIFRyYWN0IDIwMjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRSQUNUMjAxOSIgPSAiU2VsZWN0ZWQgVHJhY3RzIDIwMTkiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0yNSxoanVzdD0xLHZqdXN0PTAuNSkpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArICMgcmVtb3ZlIGdyaWRsaW5lcwogIGxhYnMoeCA9ICJCb3VuZGFyeSBvZiBHb3dhbnVzIiwgeSA9ICJBdmVyYWdlIE1lZGlhbiBSZW50IChVU0QpIiwgZmlsbCA9ICJBdmVyYWdlIFJlbnQgKFVTRCkiKQoKZ2dwbG90bHkocmVudF8xOV9wLCB0b29sdGlwID0gInRleHQiKSAlPiUKICBsYXlvdXQobWFyZ2luID0gbGlzdCAodCA9IDE1MCksIHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCc8YnI+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNZWRpYW4gUmVudCBpbiBHcmVhdGVyIEdvd2FudXMsIDIwMTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxicj4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzdXA+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdieSBDRFRBLCBOVEEsIGFuZCBTZWxlY3RlZCBDZW5zdXMgVHJhY3RzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3VwPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU291cmNlOiBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IDIwMTAtMjAxOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9zdXA+JyApKSkKYGBgCgpNZWRpYW4gcmVudCBhcHBlYXJzIHRvIGJlIGhpZ2hlciBhY3Jvc3MgQ29tbXVuaXR5IEJvYXJkIDYgdGhhbiBhdCB0aGUgc2VsZWN0ZWQgY2Vuc3VzIHRyYWN0IGxldmVsLiBUaGlzIGNvdWxkIHJlc3VsdCBmcm9tIHRoZSBoaWdoIGxldmVscyBvZiBwcm90ZWN0ZWQgaG91c2luZyBpbiB0aGUgR293YW51cyBhcmVhLCBhbmQgdGhhdCB0aGUgbW9zdCBkZW5zZWx5IHBvcHVsYXRlZCBjZW5zdXMgdHJhY3RzIGluIHRoZSBHb3dhbnVzIG5laWdoYm9yaG9vZCBob3VzZSBOWUNIQSBkZXZlbG9wbWVudHMuCgpgYGB7ciBlY2hvPUYsIHdhcm5pbmc9RiwgbWVzc2FnZT1GfQojIyMjIyBIb3VzaW5nIENvc3RzIFBsb3QgIyMjIyMKaG91c2luZ19jb3N0c18xOV9wIDwtIGdncGxvdChkYXRhPWhvdXNpbmdfY29zdHNfMjAxOV9zdW1tYXJ5LCBhZXMoeD1YMSwgeT1BdmVyYWdlX01lZGlhbl9Ib3VzaW5nX0Nvc3RzXzIwMTksIGZpbGw9QXZlcmFnZV9NZWRpYW5fSG91c2luZ19Db3N0c18yMDE5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKCJBdmVyYWdlIE1lZGlhbiBIb3VzaW5nIENvc3RzOiAiLCBzY2FsZXM6OmRvbGxhcihBdmVyYWdlX01lZGlhbl9Ib3VzaW5nX0Nvc3RzXzIwMTkpKSkpICsKICBnZW9tX2NvbCgpICsKICAjY291bGQgY2hhbmdlIHRoaXMg4oCcYW5nbGXigJ0gYmVsb3cgZnJvbSA5MCB0byAyNSBmb3IgaXQgdG8gYmUgYSBiaXQgbW9yZSByZWFkYWJsZQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbD1kb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gMUwpKSArCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKGxhYmVscyA9IGRvbGxhcl9mb3JtYXQoYWNjdXJhY3kgPSAxTCkpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz1jKCJDRFRBMjAyMCIgPSAiQ29tbXVuaXR5IEJvYXJkIDIwMjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5UQTIwMjAiID0gIk5laWdoYm9yaG9vZCBUcmFjdCAyMDIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUUkFDVDIwMTkiID0gIlNlbGVjdGVkIFRyYWN0cyAyMDE5IikpICsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MjUsaGp1c3Q9MSx2anVzdD0wLjUpKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKyAjIHJlbW92ZSBncmlkbGluZXMKICBsYWJzKHggPSAiQm91bmRhcnkgb2YgR293YW51cyIsIHkgPSAiQXZlcmFnZSBNZWRpYW4gSG91c2luZyBDb3N0cyAoVVNEKSIsIGZpbGwgPSAiQXZlcmFnZSBIb3VzaW5nIENvc3RzIChVU0QpIikKCmdncGxvdGx5KGhvdXNpbmdfY29zdHNfMTlfcCwgdG9vbHRpcCA9ICJ0ZXh0IikgJT4lCiAgbGF5b3V0KG1hcmdpbiA9IGxpc3QgKHQgPSAxNTApLCB0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgnPGJyPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTWVkaWFuIEhvdXNpbmcgQ29zdHMgaW4gR3JlYXRlciBHb3dhbnVzLCAyMDE5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3VwPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnkgQ0RUQSwgTlRBLCBhbmQgU2VsZWN0ZWQgQ2Vuc3VzIFRyYWN0cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJyPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHN1cD4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NvdXJjZTogQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSAyMDEwLTIwMTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvc3VwPicgKSkpCmBgYAoKV2UgY2FuIG9ic2VydmUgdGhpcyBzYW1lIHRyZW5kIHdoZW4gbG9va2luZyBhdCBIb3VzaW5nIENvc3RzLCB3aGljaCBpbmNsdWRlIHV0aWxpdGllcyBhbmQgb3RoZXIgaG91c2luZyBleHBlbnNlcy4gSG91c2luZyBDb3N0cyBmb3IgQ29tbXVuaXR5IEJvYXJkIDYgYW5kIHRoZSBHb3dhbnVzIE5UQSBhcmUgbmVhcmx5IGlkZW50aWNhbC4KCmBgYHtyIGVjaG89Riwgd2FybmluZz1GLCBtZXNzYWdlPUZ9CiMjIyMjIEhvbWUgVmFsdWUgUGxvdCAjIyMjIwpob21lX3ZhbHVlXzE5X3AgPC0gZ2dwbG90KGRhdGE9aG9tZV92YWx1ZV8yMDE5X3N1bW1hcnksIGFlcyh4PVgxLCB5PUF2ZXJhZ2VfTWVkaWFuX0hvbWVfVmFsdWVfMjAxOSwgZmlsbD1BdmVyYWdlX01lZGlhbl9Ib21lX1ZhbHVlXzIwMTksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoIkF2ZXJhZ2UgTWVkaWFuIEhvbWUgVmFsdWU6ICIsIHNjYWxlczo6ZG9sbGFyKEF2ZXJhZ2VfTWVkaWFuX0hvbWVfVmFsdWVfMjAxOSkpKSkgKwogIGdlb21fY29sKCkgKwogICNjb3VsZCBjaGFuZ2UgdGhpcyDigJxhbmdsZeKAnSBiZWxvdyBmcm9tIDkwIHRvIDI1IGZvciBpdCB0byBiZSBhIGJpdCBtb3JlIHJlYWRhYmxlCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVsPWRvbGxhcl9mb3JtYXQoYWNjdXJhY3kgPSAxTCkpICsKICBzY2FsZV9maWxsX2NvbnRpbnVvdXMobGFiZWxzID0gZG9sbGFyX2Zvcm1hdChhY2N1cmFjeSA9IDFMKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkNEVEEyMDIwIiA9ICJDb21tdW5pdHkgQm9hcmQgMjAyMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTlRBMjAyMCIgPSAiTmVpZ2hib3Job29kIFRyYWN0IDIwMjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRSQUNUMjAxOSIgPSAiU2VsZWN0ZWQgVHJhY3RzIDIwMTkiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0yNSxoanVzdD0xLHZqdXN0PTAuNSkpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArICMgcmVtb3ZlIGdyaWRsaW5lcwogIGxhYnMoeCA9ICJCb3VuZGFyeSBvZiBHb3dhbnVzIiwgeSA9ICJBdmVyYWdlIE1lZGlhbiBIb21lIFZhbHVlIChVU0QpIiwgZmlsbCA9ICJBdmVyYWdlIEhvbWUgVmFsdWUgKFVTRCkiKQoKZ2dwbG90bHkoaG9tZV92YWx1ZV8xOV9wLCB0b29sdGlwID0gInRleHQiKSAlPiUKICBsYXlvdXQobWFyZ2luID0gbGlzdCAodCA9IDE1MCksIHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCc8YnI+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNZWRpYW4gSG9tZSBWYWx1ZSBpbiBHcmVhdGVyIEdvd2FudXMsIDIwMTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxicj4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzdXA+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdieSBDRFRBLCBOVEEsIGFuZCBTZWxlY3RlZCBDZW5zdXMgVHJhY3RzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3VwPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU291cmNlOiBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IDIwMTAtMjAxOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9zdXA+JyApKSkKYGBgCgpXaGlsZSBob21lIHZhbHVlIGRhdGEgZnJvbSB0aGUgMjAxNS0yMDE5IEFDUyBpcyB1bnJlbGlhYmxlIGF0IHRoZSBzZWxlY3RlZCB0cmFjdCBsZXZlbCwgaG9tZSB2YWx1ZXMgYXQgdGhlIENvbW11bml0eSBCb2FyZCBhbmQgTlRBIGxldmVscyBhcmUgcm91Z2hseSBlcXVhbC48YnI+PGJyPgoKIyMjIFJlc3VsdHMKClRoaXMgZGF0YSB3YXMgYW5hbHl6ZWQgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIEdvd2FudXMgUmFjaWFsIEVxdWl0eSBSZXBvcnTigJlzIGNoYXJhY3Rlcml6YXRpb24gb2YgR293YW51cyBhcyBhIHdlYWx0aHksIHdoaXRlIG5laWdoYm9yaG9vZCBtYWludGFpbnMgYXQgdGhyZWUgZGlmZmVyZW50IHNjYWxlczogdGhhdCBvZiB0aGUgQ29tbXVuaXR5IEJvYXJkL0NvbW11bml0eSBEaXN0cmljdCBUYWJ1bGF0aW9uIEFyZWEsIHRoZSBuZWlnaGJvcmhvb2QvTmVpZ2hib3Job29kIFRhYnVsYXRpb24gQXJlYSwgYW5kIHNlbGVjdCBjZW5zdXMgdHJhY3RzLiBUaGUgZGF0YSBhdmFpbGFibGUgaW4gdGhlIEFDUyAyMDA2LTIwMTAgYW5kIDIwMTUtMjAxOSBzdWdnZXN0IHRoYXQgdHJlbmRzIGluIG1lZGlhbiBob3VzZWhvbGQgaW5jb21lLCByZW50LCBob3VzaW5nIGNvc3RzLCBhbmQgdmFjYW5jeSBhdCB0aGUgQ29tbXVuaXR5IEJvYXJkIDYgb3IgZXZlbiBHb3dhbnVzIE5UQSBsZXZlbCBhcmUgbm90IHJlcHJlc2VudGF0aXZlIG9mIHRyZW5kcyBhdCB0aGUgbG9jYWwvdHJhY3QgbGV2ZWwuIFRoZXkgYWxzbyBpbmRpY2F0ZSBkaXNwYXJpdGllcyBhY3Jvc3MgZGVtb2dyYXBoaWNzLCBwYXJ0aWN1bGFybHkgd2hlbiBsb29raW5nIGF0IE1ISSBkYXRhIGRpc2FnZ3JlZ2F0ZWQgYnkgcmFjZS4gRmluYWxseSwgdGhleSBpbmRpY2F0ZSB0aGF0IHJlbnQsIGhvdXNpbmcgY29zdHMsIGhvbWUgdmFsdWVzLCBhbmQgdmFjYW5jeSByYXRlcyBhY3Jvc3MgQ29tbXVuaXR5IEJvYXJkIDYgKGFuZCBhdCB0aGUgTlRBIGFuZCB0cmFjdCBsZXZlbCkgaGF2ZSBpbmNyZWFzZWQsIHdoaWxlIE1ISSBoYXMgaW5jcmVhc2VkIG9ubHkgd2hlbiBsb29raW5nIGF0IHRoZSB0b3RhbCBhbmQgd2hpdGUgcG9wdWxhdGlvbnMgYXQgZWFjaCBzY2FsZS4KCkV4YW1pbmluZyB0aGUgZGlzY3JlcGFuY3kgaW4gZmluZGluZ3MgYW1vbmcgTUhJIGRhdGEgYXQgdGhlIHRocmVlIGdlb2dyYXBoaWMgc2NhbGVzIGFwcGVhcnMgdG8gY291bnRlciB0aGUgUkVS4oCZcyBhc3NlcnRpb24gdGhhdCB0aGUgbmVpZ2hib3Job29kIG9mIEdvd2FudXMgaXMgYSB3ZWFsdGh5IGFyZWEuIFRvIGJlIGNsZWFyLCB0aGVyZSBpcyB3ZWFsdGggYW1vbmcgY2VydGFpbiBzZWN0aW9ucyBvZiB0aGUgcG9wdWxhdGlvbiB0aGF0IHRyYWNrcyBhY3Jvc3MgZ2VvZ3JhcGhpYyBzY2FsZXMuIFRoZSBkYXRhIHN1Z2dlc3QgdGhlIHdoaXRlIHBvcHVsYXRpb24gaW4gdGhlIHNlbGVjdGVkIEdvd2FudXMgY2Vuc3VzIHRyYWN0cyBlYXJucyB3aXRoaW4gJDYsMDAwIG9mIHRoZSB0b3RhbCBwb3B1bGF0aW9uIGluIENvbW11bml0eSBCb2FyZCA2LiBIb3dldmVyLCB3aGVuIGV4YW1pbmluZyB0aGUgZGF0YSBmb3IgQmxhY2sgYW5kIExhdGlueCBwb3B1bGF0aW9ucyBhY3Jvc3MgdGhlIHRocmVlIHNjYWxlcywgTUhJIGlzIHN1YnN0YW50aWFsbHkgbG93ZXIgZXZlbiB3aGVuIGFnZ3JlZ2F0ZWQgYnkgcmFjZSB1cCB0byB0aGUgQ29tbXVuaXR5IEJvYXJkLgoKTWFueSBvZiB0aGUgZ2VuZXJhbCB0cmVuZHMgaWRlbnRpZmllZCBpbiB0aGUgUmFjaWFsIEVxdWl0eSBSZXBvcnQgYXJlIGFmZmlybWVkIHdoZW4gbG9va2luZyBhdCB0aGlzIGRhdGEgYXQgdGhlIENvbW11bml0eSBCb2FyZCBsZXZlbC4gVGhlIFJlcG9ydCBub3RlcyB0aGF0IG92ZXIgdGhlIHBhc3QgdHdlbnR5IHllYXJzLCByZW50cyBoYXZlIGluY3JlYXNlZC4gSW5jb21lIGZvciB0aGUgd2hpdGUgcG9wdWxhdGlvbiBoYXMgaW5jcmVhc2VkIHdoaWxlIGVhcm5pbmdzIGhhdmUgc3RhZ25hdGVkIGFtb25nIHRoZSBCbGFjayBhbmQgTGF0aW54IHBvcHVsYXRpb25zIGFjcm9zcyBDQjYuIEluIHNvbWUgaW5zdGFuY2VzLCBwYXR0ZXJucyBsaWtlIGluY3JlYXNpbmcgdmFjYW5jeSByYXRlcyB0cmFjayBhY3Jvc3MgdGhlIHRocmVlIHNjYWxlcyBidXQgZ3JvdyBpbiBpbnRlbnNpdHkgd2hlbiBsb29raW5nIGF0IG9ubHkgc2VsZWN0IGNlbnN1cyB0cmFjdCBkYXRhLiBFeGFtaW5pbmcgZGF0YSBzdWNoIGFzIE1ISSwgZXNwZWNpYWxseSBkaXNhZ2dyZWdhdGVkIGJ5IHJhY2UsIGF0IGVhY2ggc2NhbGUgaWxsdW1pbmF0ZXMgYWRkaXRpb25hbCB0cmVuZHMsIHN1Y2ggYXMgbXVjaCBsb3dlciBNSEkgYW1vbmcgQmxhY2sgYW5kIExhdGlueCByZXNpZGVudHMgaW4gY29tcGFyaXNvbiB0byB3aGl0ZXMuIEV4YW1pbmluZyB0aGlzIGRhdGEgYXQgZWFjaCBzY2FsZSBhbHNvIGluZGljYXRlcyB0aGF0IHdoaWxlIGRhdGEgYW5hbHl6ZWQgYXQgdGhlIENvbW11bml0eSBCb2FyZCBsZXZlbCBtYXkgYmUgcmVwcmVzZW50YXRpdmUgb2YgdHJlbmRzIGFjcm9zcyB0aGUgdG90YWwgYW5kIHdoaXRlIHBvcHVsYXRpb25zLCB0aGV5IGRvIG5vdCByZXByZXNlbnQgdHJlbmRzIGFtb25nIEJsYWNrIGFuZCBMYXRpbnggcG9wdWxhdGlvbnMgYXQgYW55IHNjYWxlLgoKVGhpcyBhcHBlYXJzIHRvIGluZGljYXRlIHRoYXQgYnJvYWQgZ2VuZXJhbGl6YXRpb25zIG9mIHdlYWx0aCBhbmQgd2hpdGVuZXNzIG1hZGUgYWJvdXQgQ29tbXVuaXR5IEJvYXJkIDYgZG8gbm90IHRyYWNrIHdpdGggdGhlIGxvY2FsIHJlYWxpdHkgd2l0aGluIEdvd2FudXMgaXRzZWxmLiBNb3JlIHNwZWNpZmljYWxseSwgdXNpbmcgZGF0YSBhZ2dyZWdhdGVkIHRvIHRoZSBDb21tdW5pdHkgQm9hcmQgbGV2ZWwgdG8gZXh0cmFwb2xhdGUgdHJlbmRzIGF0IHNtYWxsZXIgZ2VvZ3JhcGhpY2FsIHNjYWxlcyBpcyBpbmVmZmVjdGl2ZSBhbmQsIGluIHRoaXMgY2FzZSwgb2JmdXNjYXRlcyB0aGUgcmVhbGl0eSB3aXRoaW4gdGhlIGxvY2FsIGNvbnRleHQuCgojIyBOZXh0IFN0ZXBzCgpUaGlzIGFuYWx5c2lzIHdvdWxkIGJlIHN0cmVuZ3RoZW5lZCBieSBleGFtaW5pbmcgaW5jb21lIGFuZCBob3VzaW5nIGRhdGEgaW4gdGhlIERlY2VubmlhbCAyMDIwIGNlbnN1cy4gU2luY2UgdGhlIERlY2VubmlhbCBDZW5zdXMgaXMgYW4gZXhhY3QgY291bnQsIHJhdGhlciB0aGFuIGFuIGVzdGltYXRlIChzdWNoIGFzIGluIHRoZSBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5KSwgZGF0YSB3aWxsIGJlIG1vcmUgYWNjdXJhdGUuIFJlYXNzZXNzaW5nIGFuZCBhbmFseXppbmcgdGhlIGRhdGEgb25jZSB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBEZWNlbm5pYWwgQ2Vuc3VzIGFyZSByZWxlYXNlZCB3aWxsIGFsbG93IGZvciBncmVhdGVyIHByZWNpc2lvbiB3aGVuIGV4YW1pbmluZyB2YXJpYWJsZXMgc3VjaCBhcyBtZWRpYW4gaG91c2Vob2xkIGluY29tZSBieSByYWNlLCBhcyB3ZWxsIGFzIHJlbnQsIGhvdXNpbmcgY29zdHMsIGFuZCBob21lIHZhbHVlcy4KCkFkZGl0aW9uYWxseSwgYW5hbHlzaXMgb2YgYWRkaXRpb25hbCB2YXJpYWJsZXMgc3VjaCBhcyByZW50IGJ1cmRlbiwgZW1wbG95bWVudCByYXRlcywgYW5kIGNvbW11dGUgdGltZXMgdG8gcGxhY2VzIG9mIHdvcmsgY2FuIGJyb2FkZW4gYW5kIGRlZXBlbiBvdXIgdW5kZXJzdGFuZGluZyBvZiBoaXN0b3JpY2FsIGRlbW9ncmFwaGljIGFuZCBlY29ub21pYyBzaGlmdHMgaW4gR293YW51cywgd2hpbGUgcHJvdmlkaW5nIG1vcmUgYWNjdXJhdGUgZGF0YSB0byBtYWtlIGZ1dHVyZSBwcm9qZWN0aW9ucy4KClNpbmNlIHRoZSBHb3dhbnVzIE5laWdoYm9yaG9vZCBQbGFuIGhhcyBiZWVuIHBhc3NlZCwgaXQgd2lsbCBiZSBldmVuIG1vcmUgaW1wb3J0YW50IHRvIGV4YW1pbmUgdGhlc2UgYW5kIGZ1dHVyZSBkYXRhIGluIG9yZGVyIHRvIHZlcmlmeSB0aGUgY29uY2x1c2lvbnMgbWFkZSBpbiB0aGUgUmFjaWFsIEVxdWl0eSBSZXBvcnQsIHBhcnRpY3VsYXJseSB0aGF0IHRoZSByZXpvbmluZyBvZiBHb3dhbnVzIHdpbGwgc3VwcG9ydCByYWNpYWwgaW50ZWdyYXRpb24gd2l0aGluIGEg4oCcd2hpdGUsIHdlYWx0aHkgaGlnaCBvcHBvcnR1bml0eSB6b25lLuKAnQoKIyMgTWV0aG9kcyBBcHBlbmRpeCAtIFNvdXJjZXMKKipPY2N1cGFuY3kgU3RhdHVzOioqIFUuUy4gQ2Vuc3VzIEJ1cmVhdSwgKk9jY3VwYW5jeSBTdGF0dXMsIDIwMjAgYW5kIDIwMDAgQ2Vuc3VzKiByZXRyaWV2ZWQgTm92ZW1iZXIgMjksIDIwMjEgdXNpbmcgW3RpZHljZW5zdXNdKGh0dHBzOi8vd2Fsa2VyLWRhdGEuY29tL3RpZHljZW5zdXMvKSBSIHBhY2thZ2U6PGJyPgoqIFRvdGFsIEhvdXNpbmcgVW5pdHM8YnI+CiogT2NjdXBpZWQgSG91c2luZyBVbml0czxicj4KKiBWYWNhbnQgSG91c2luZyBVbml0cwogCioqTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWUqKiBVLlMuIENlbnN1cyBCdXJlYXUsIOKAnE1lZGlhbiBIb3VzZWhvbGQgSW5jb21lIGluIHRoZSBQYXN0IDEyIE1vbnRocyBieSBSYWNlL0V0aG5pY2l0eSIgKioyMDE1LTE5IEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkgNS15ZWFyIGVzdGltYXRlcyosICoyMDA2LTEwIEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkgNS15ZWFyIGVzdGltYXRlcyosIHJldHJpZXZlZCBOb3ZlbWJlciAyOSwgMjAyMSB1c2luZyBbdGlkeWNlbnN1c10oaHR0cHM6Ly93YWxrZXItZGF0YS5jb20vdGlkeWNlbnN1cy8pIFIgcGFja2FnZS4KKiBNSEkgVG90YWwgUG9wdWxhdGlvbjxicj4KKiBNSEkgTm9uLUhpc3BhbmljIFdoaXRlIFBvcHVsYXRpb248YnI+CiogTUhJIE5vbi1IaXNwYW5pYyBCbGFjayBQb3B1bGF0aW9uPGJyPgoqIE1ISSBIaXNwYW5pYy9MYXRpbm8gUG9wdWxhdGlvbgogCioqTWVkaWFuIEdyb3NzIFJlbnQqKiBVLlMuIENlbnN1cyBCdXJlYXUsIOKAnE1lZGlhbiBHcm9zcyBSZW50IChEb2xsYXJzKeKAnSoqMjAxNS0xOSBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IDUteWVhciBlc3RpbWF0ZXMqLCAqMjAwNi0xMCBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IDUteWVhciBlc3RpbWF0ZXMqLCByZXRyaWV2ZWQgTm92ZW1iZXIgMjksIDIwMjEgdXNpbmcgW3RpZHljZW5zdXNdKGh0dHBzOi8vd2Fsa2VyLWRhdGEuY29tL3RpZHljZW5zdXMvKSBSIHBhY2thZ2UuPGJyPgoqIE1lZGlhbiBHcm9zcyBSZW50CiAKKipNZWRpYW4gTW9udGhseSBIb3VzaW5nIENvc3RzKiogVS5TLiBDZW5zdXMgQnVyZWF1LCDigJxNZWRpYW4gTW9udGhseSBIb3VzaW5nIENvc3RzIChEb2xsYXJzKeKAnSoqMjAxNS0xOSBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IDUteWVhciBlc3RpbWF0ZXMqLCAqMjAwNi0xMCBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IDUteWVhciBlc3RpbWF0ZXMqLCByZXRyaWV2ZWQgTm92ZW1iZXIgMjksIDIwMjEgdXNpbmcgW3RpZHljZW5zdXNdKGh0dHBzOi8vd2Fsa2VyLWRhdGEuY29tL3RpZHljZW5zdXMvKSBSIHBhY2thZ2UuPGJyPgoqIE1lZGlhbiBNb250aGx5IEhvdXNpbmcgQ29zdHMKIAoqKk1lZGlhbiBIb21lIFZhbHVlKiogVS5TLiBDZW5zdXMgQnVyZWF1LCDigJxNZWRpYW4gVmFsdWUgKERvbGxhcnMp4oCdKioyMDE1LTE5IEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkgNS15ZWFyIGVzdGltYXRlcyosICoyMDA2LTEwIEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkgNS15ZWFyIGVzdGltYXRlcyosIHJldHJpZXZlZCBOb3ZlbWJlciAyOSwgMjAyMSB1c2luZyBbdGlkeWNlbnN1c10oaHR0cHM6Ly93YWxrZXItZGF0YS5jb20vdGlkeWNlbnN1cy8pIFIgcGFja2FnZS48YnI+CiogTWVkaWFuIEhvbWUgVmFsdWUKIApTaGFwZSBmaWxlcyB1c2VkOjxicj4KICogKipDb21tdW5pdHkgRGlzdHJpY3QgVGFidWxhdGlvbiBBcmVhcyAoQ0RUQXMpKiogTllDIE9wZW4gRGF0YSwgKkNvbW11bml0eSBEaXN0cmljdCBUYWJ1bGF0aW9uIEFyZWFzIDIwMjAqIHJldHJpZXZlZCBOb3ZlbWJlciAyOSwgMjAyMSB1c2luZyBbTllDIE9wZW4gRGF0YV0oaHR0cHM6Ly93d3cxLm55Yy5nb3Yvc2l0ZS9wbGFubmluZy9kYXRhLW1hcHMvb3Blbi1kYXRhL2NlbnN1cy1kb3dubG9hZC1tZXRhZGF0YS5wYWdlP3RhYj0yKSBzaGFwZSBmaWxlIGFuZCBpbXBvcnRlZCB3aXRoIFtzZl0oaHR0cHM6Ly9yLXNwYXRpYWwuZ2l0aHViLmlvL3NmLykgUiBwYWNrYWdlLjxicj4KKiAqKk5laWdoYm9yaG9vZCBUYWJ1bGF0aW9uIEFyZWFzIChOVEFzKSoqIE5ZQyBPcGVuIERhdGEsICpOZWlnaGJvcmhvb2QgVGFidWxhdGlvbiBBcmVhcyAyMDIwKiByZXRyaWV2ZWQgTm92ZW1iZXIgMjksIDIwMjEgdXNpbmcgW05ZQyBPcGVuIERhdGFdKGh0dHBzOi8vd3d3MS5ueWMuZ292L3NpdGUvcGxhbm5pbmcvZGF0YS1tYXBzL29wZW4tZGF0YS9jZW5zdXMtZG93bmxvYWQtbWV0YWRhdGEucGFnZT90YWI9Mikgc2hhcGUgZmlsZSBhbmQgaW1wb3J0ZWQgd2l0aCBbc2ZdKGh0dHBzOi8vci1zcGF0aWFsLmdpdGh1Yi5pby9zZi8pIFIgcGFja2FnZS48YnI+CiogKipTZWxlY3RlZCBDZW5zdXMgVHJhY3RzKiogTllDIE9wZW4gRGF0YSwgKkNlbnN1cyBUcmFjdHMgNzcsIDc1LCA3MSwgMTI3LCAxMTksIDEyMSwgMTE3KiByZXRyaWV2ZWQgTm92ZW1iZXIgMjksIDIwMjEgdXNpbmcgW05ZQyBPcGVuIERhdGFdKGh0dHBzOi8vd3d3MS5ueWMuZ292L3NpdGUvcGxhbm5pbmcvZGF0YS1tYXBzL29wZW4tZGF0YS9jZW5zdXMtZG93bmxvYWQtbWV0YWRhdGEucGFnZT90YWI9MikuCiAKIyMjIyBNZXRob2RzPGJyPgoqKlZhY2FuY3kgUmF0ZSoqIGlzIGNhbGN1bGF0ZWQgYXM6PGJyPgoqVmFjYW50IEhvdXNpbmcgVW5pdHMqIGRpdmlkZWQgYnkgKlRvdGFsIEhvdXNpbmcgVW5pdHMqCiAKU3VtbWFyeSBzdGF0aXN0aWNzIGdlbmVyYXRlZCBmb3IgZWFjaCB2YXJpYWJsZSBhdCB0aGUgY29tbXVuaXR5IGJvYXJkLCBuZWlnaGJvcmhvb2QgdGFidWxhdGlvbiBhcmVhLCBhbmQgY2Vuc3VzIHRyYWN0IGxldmVsIHVzaW5nIHN1bW1hcmlzZSggKS4gVGhlc2Ugc3VtbWFyeSB0YWJsZXMgd2VyZSBleHBvcnRlZCBhcyBFeGNlbCBkb2N1bWVudHMgKHdyaXRleGxzeCkuIEkgY29sbGF0ZWQgdGhlIGRhdGEgaW50byB0aGUgdGhyZWUgYm91bmRhcmllcyB3ZSBhcmUgc2Vla2luZy4gSSB0aGVuIHJlLWltcG9ydGVkIHRoZSBkYXRhIGludG8gUiB0aHJvdWdoIHJlYWR4bC48YnI+PGJyPgoKCg==