Published: 2024-12-12
About This Report
This report provides analyses of inflation rates, and growth rates
across financial indexes, with the flexibility to explore publicly
traded stocks and ETFs. It evaluates their historical performance over
time, refining for accuracy of probable growth rates and inflation
trends. In this report, the term “index” is used broadly and may
interchangeably refer to a benchmark index (e.g., S&P 500), ETFs,
mutual funds, or even collections of individual publicly traded stocks,
such as Apple or Microsoft, representing specific market segments or
investment strategies. I intend to expand the comparisons with large-cap
companies and other ETFs, such as those within QQQ and the S&P 500
itself (e.g., Apple, Microsoft, NVIDIA, UnitedHealth Group, Amazon,
Broadcom, and others), as well as additional ETFs.
Indexes serve as benchmarks for a variety of purposes, such as
investment comparisons, policy valuation, and strategic financial
planning. The report aims to assess the long-term viability and
comparative performance of these indexes in the context of value
generation, like variable annuities, mutual funds, exchange-traded funds
(ETFs), structured notes, target-date funds, retirement savings plans
(e.g., 401(k)s), and endowment policies. The S&P 500, QQQ, and
BlackRock Endura is utilized as external indexes for an Indexed
Universal Life (IUL) Insurance Policy product that’s been under review.
I won’t delve into the origins of that decision or about the policy
here; the product has its pros and cons—it is, after all, designed to be
sold.
CPI
The CPI (Consumer Price Index) is a measure that examines the average
change in prices over time for a basket of goods and services commonly
purchased by households, such as food, clothing, and transportation. CPI
is often used as an indicator of inflation, as it reflects how much the
cost of living has increased or decreased. It is reported as a
percentage, showing the relative price change from one period to
another.
Inflation Targets
The historical inflation targets in the U.S. reflect the evolving
priorities of monetary policy. From 1913 to the 1970s, the Federal
Reserve did not have an explicit inflation target, focusing instead on
financial stability and economic growth. In the 1979–1980s, under Paul
Volcker, the Fed shifted to controlling inflation without a formal
target, implicitly aiming for low inflation. During the 1990s–2011,
global trends influenced the Fed to align informally with a 2% inflation
target, though it remained unofficial. Finally, in 2012, the Federal
Reserve formally adopted a 2% target, prioritizing price stability and
maximum employment as part of its dual mandate. This evolution
highlights the transition from reactive to proactive inflation
management.
Sources:
Historical Inflation Targets in the United States
Period
|
Inflation_Target
|
Policy_Focus
|
Source
|
1913–1970s
|
None
|
Financial stability and economic growth.
|
Federal Reserve Historical Overview
|
1979–1980s
|
Implicit (low inflation)
|
Price stability (Volcker’s anti-inflation focus).
|
Federal Reserve Monetary Policy History
|
1990s–2011
|
Implicit (~2%)
|
Informal alignment with global 2% targets.
|
Implicit trend in global monetary policy
|
2012–Present
|
Formal 2% Target
|
Price stability with a dual mandate.
|
Federal Reserve (2012 announcement)
|
Glossary
Name
|
Definition
|
Annual Inflation Rate
|
Also referred as “1-Year CAIR” for analytical purposes, this shows the
inflation rate for each “1-Year” or “YoY” as a percentage, based on the
Consumer Price Index (CPI) for All Urban Consumers in the United States.
It reflects the percentage change in CPI from December of the previous
year to December of the indicated year. A positive rate indicates an
increase in prices, while a negative rate (e.g., in 2009) shows
deflation.
|
CAIR
|
Compound Average Inflation Rate. The average yearly inflation rate over
the period, calculated as a mean inflation rate over a period if it had
compounded anually. It provides an idea of the typical inflation rate
experienced each year, smoothing out annual fluctuations and making it
more accurate for comparisons across time periods. A 5-Year CAIR
represents the annualized average rate of inflation over a five-year
period, accounting for compounding; it reflects the inflation rate as if
it were compounded each year over five years.
|
CIR
|
Cumulative Inflation Rate. The cumulative inflation rate over multiple
periods, accounting for compounding. It measures the total percentage
inflation from the initial to the final year in the series. It is the
total increase in prices over a given period without averaging it
annually. It’s the straightforward cumulative effect of inflation over
the specified time. A 5-Year CIR represents the total percentage
increase in an index or prices over a five-year period without averaging
or compounding on an annual basis. it shows the cumulative inflation
over the entire five years.
|
Close
|
The closing value of the Index on the Close Date. This represents the
value of the index at the end of that specific period, giving a snapshot
of the market’s performance.
|
Date
|
Specific Date when the Index is measured. Date varies by sources. Annual
inflation rate data presented in this dataframe is the average
percentage change in the Consumer Price Index (CPI) for all months
within that specified year.
|
Target Inflation Rate
|
The Federal Reserve aims for a 2% inflation rate over the longer run, as
measured by the annual change in the price index for personal
consumption expenditures. This target is considered most consistent with
the Federal Reserve’s mandate for maximum employment and price
stability. For more see https://www.federalreserve.gov/faqs/economy_14400.htm.
The 2% inflation rate became official target rate in 2012, but will be
used as the target rate across all years in this report.
|
CPI IR
Data
The Consumer Price Index (CPI) data presented here is sourced from
the U.S. Bureau of Labor Statistics (BLS). Unless otherwise noted, the
analysis begins with data from 1913. The “Annual Inflation Rates” (also
referred to as the “1-Year CAIR”) is derived directly from the CPI
database prior to any additional data processing. Each Annual Inflation
Rates represents the average of the 12 monthly percentage changes (from
January to December) for the given year. For more comprehensive details
and additional rate information, please refer to the BLS website.
Data Source: Consumer Price Index for All Urban Consumers (CPI-U) via
CPI BLS at https://data.bls.gov/timeseries/CUUR0000SA0?years_option=all_years,
filtered to 12-Month Percent Change > Annual Averages.
Annual Inflation Rates (1913-2023)
Date
|
1-Year CAIR
|
Date
|
1-Year CAIR
|
2023
|
4.10%
|
1967
|
3.10%
|
2022
|
8.00%
|
1966
|
2.90%
|
2021
|
4.70%
|
1965
|
1.60%
|
2020
|
1.20%
|
1964
|
1.30%
|
2019
|
1.80%
|
1963
|
1.30%
|
2018
|
2.40%
|
1962
|
1.00%
|
2017
|
2.10%
|
1961
|
1.00%
|
2016
|
1.30%
|
1960
|
1.70%
|
2015
|
0.10%
|
1959
|
0.70%
|
2014
|
1.60%
|
1958
|
2.80%
|
2013
|
1.50%
|
1957
|
3.30%
|
2012
|
2.10%
|
1956
|
1.50%
|
2011
|
3.20%
|
1955
|
-0.40%
|
2010
|
1.60%
|
1954
|
0.70%
|
2009
|
-0.40%
|
1953
|
0.80%
|
2008
|
3.80%
|
1952
|
1.90%
|
2007
|
2.80%
|
1951
|
7.90%
|
2006
|
3.20%
|
1950
|
1.30%
|
2005
|
3.40%
|
1949
|
-1.20%
|
2004
|
2.70%
|
1948
|
8.10%
|
2003
|
2.30%
|
1947
|
14.40%
|
2002
|
1.60%
|
1946
|
8.30%
|
2001
|
2.80%
|
1945
|
2.30%
|
2000
|
3.40%
|
1944
|
1.70%
|
1999
|
2.20%
|
1943
|
6.10%
|
1998
|
1.60%
|
1942
|
10.90%
|
1997
|
2.30%
|
1941
|
5.00%
|
1996
|
3.00%
|
1940
|
0.70%
|
1995
|
2.80%
|
1939
|
-1.40%
|
1994
|
2.60%
|
1938
|
-2.10%
|
1993
|
3.00%
|
1937
|
3.60%
|
1992
|
3.00%
|
1936
|
1.50%
|
1991
|
4.20%
|
1935
|
2.20%
|
1990
|
5.40%
|
1934
|
3.10%
|
1989
|
4.80%
|
1933
|
-5.10%
|
1988
|
4.10%
|
1932
|
-9.90%
|
1987
|
3.60%
|
1931
|
-9.00%
|
1986
|
1.90%
|
1930
|
-2.30%
|
1985
|
3.60%
|
1929
|
0.00%
|
1984
|
4.30%
|
1928
|
-1.70%
|
1983
|
3.20%
|
1927
|
-1.70%
|
1982
|
6.20%
|
1926
|
1.10%
|
1981
|
10.30%
|
1925
|
2.30%
|
1980
|
13.50%
|
1924
|
0.00%
|
1979
|
11.30%
|
1923
|
1.80%
|
1978
|
7.60%
|
1922
|
-6.10%
|
1977
|
6.50%
|
1921
|
-10.50%
|
1976
|
5.80%
|
1920
|
15.60%
|
1975
|
9.10%
|
1919
|
14.60%
|
1974
|
11.00%
|
1918
|
18.00%
|
1973
|
6.20%
|
1917
|
17.40%
|
1972
|
3.20%
|
1916
|
7.90%
|
1971
|
4.40%
|
1915
|
1.00%
|
1970
|
5.70%
|
1914
|
1.00%
|
1969
|
5.50%
|
1913
|
NA
|
1968
|
4.20%
|
NA
|
NA
|
Summary
Annual Inflation Rate Summary (1913-2023)
Statistic
|
Value
|
Definition
|
Count of Observations
|
110
|
Total number of data points collected over the specific period.
|
CAIR
|
3.16%
|
Compound Average Inflation Rate; mean inflation rate over a period if it
had compounded anually.
|
Mean
|
3.27%
|
Reflects the general price level and overall inflation rate.
|
Median
|
2.75%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
4.69%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAIR Range (CAIR - SD)
|
-1.53%
|
Lower boundary of expected CPI range; lowest estimate of typical
inflation rate considering normal fluctuations.
|
Max CAIR Range (CAIR + SD)
|
7.85%
|
Upper boundary of expected CPI range; highest estimate of typical
inflation rate considering normal fluctuations.
|
Minimum
|
-10.5%
|
Lowest value; highlights periods of minimal inflation or deflationary
trends.
|
Maximum
|
18%
|
Highest value; highlights periods of peak inflationary pressures.
|
Above 2.0 Target
|
60%
|
Percentage of periods where inflation exceeded the 2.0% target,
indicating higher-than-desired inflation.
|
Below 2.0 Target
|
40%
|
Percentage of periods where inflation was below the 2.0% target,
suggesting potential deflationary pressures or insufficient inflation.
|
The annual inflation rate (3.16%) is lower than mean inflation rate
(3.27%), reflecting short-term volatility and inflation spikes. The
annual inflation rate (3.16%) is higher than mean inflation rate
(2.75%), indicating that sustained periods of below-median inflation
exerted cumulative upward pressure on price levels. This relationship
signals a distribution with notable extremes on the higher end (positive
skewness) while emphasizing that the long-term compounded effect is more
representative of the overall economic trend than either the mean or the
median alone. The standard deviation of 4.69% reflects significant
volatility, with inflation rates ranging from a deflationary low of
-10.5% to a peak of18%, and an expected range of -1.53% to 7.85% when
accounting for typical fluctuations. Notably, inflation exceeded the 2%
target in 60% of the years, indicating inflationary pressures, while
remaining below the target in 40% of the observations, signaling
deflationary trends or weaker inflation.
The 3.16% CAIR from 1913 to 2023 reflects the influence of major
historical events that caused significant inflation, including World
Wars, the Great Depression, and the 1970s oil crises. In contrast, the
2.76% CAIR, measured since the 1990 enactment of the Implicit 2% Target,
is notably lower. With the exception of the 2022 inflation rate of 8.0%,
rates after 1990 have stayed within the expected range of -1.53% to
7.85%.
Graph

Over the past century, the U.S. Consumer Price Index (CPI) has
exhibited significant fluctuations, with notable peaks during the
post-World War I era and the 1970s. The U.S. Consumer Price Index (CPI)
has experienced significant peaks due to various major events:
- World War I (1914–1918): The CPI surged to approximately 18% in
1918, driven by increased government spending and supply constraints
during the war.
- World War II (1939–1945): Inflation rose due to heightened demand
and production limitations, leading to price controls and rationing to
manage the economy.
- 1970s Oil Crises: The 1973 and 1979 oil embargoes led to energy
shortages and skyrocketing oil prices, causing inflation to peak around
14% in 1980.
- Early 1980s Recession: In response to high inflation, the Federal
Reserve increased interest rates, leading to a recession but eventually
stabilizing prices.
- COVID-19 Pandemic (2020–2021): Supply chain disruptions and economic
stimulus measures contributed to a significant rise in inflation, with
the CPI reaching levels not seen in decades.
However, in recent decades, these inflationary peaks have become less
pronounced, indicating a trend toward more stable inflation rates,
showing a narrowing of CPI volatility.
CPI CAIR
Data
You’ve probably seen or heard the phrase, “If you had invested $1,000
in [Company/Stock Name] back in [Year], your investment would be worth
[Current Value] today.” Or perhaps you’ve thought to yourself, “If I
had… I would have…” This is the result of cumulative growth captured in
a snapshot. The Cumulative Inflation Rate (CIR) represents the total
percentage increase in prices over time horizons of 5, 10, 20, and 30
years, reflecting the long-term cumulative impact of inflation (e.g., a
30-year CIR of 110.76% in 2023).
In contrast, the Compound Average Inflation Rate (CAIR) represents
the average annualized inflation rate over the same periods, smoothing
short-term fluctuations (e.g., a 5-year CAIR of 3.93% in 2023). Compound
averages allow us to study the annualized rate required to achieve the
same total cumulative growth, providing a basis for making future
projections grounded in past performance.
Cumulative Inflation Rates (1913-2023)
Date
|
1-Year CAIR
|
5-Year CIR
|
10-Year CIR
|
20-Year CIR
|
30-Year CIR
|
2023
|
4.10%
|
21.27%
|
30.62%
|
65.31%
|
110.76%
|
2022
|
8.00%
|
19.29%
|
27.36%
|
62.45%
|
108.53%
|
2021
|
4.70%
|
12.77%
|
20.40%
|
52.82%
|
98.87%
|
2020
|
1.20%
|
9.11%
|
18.68%
|
50.05%
|
97.92%
|
2019
|
1.80%
|
7.92%
|
19.15%
|
53.31%
|
106.14%
|
2018
|
2.40%
|
7.71%
|
16.57%
|
53.92%
|
112.21%
|
2017
|
2.10%
|
6.77%
|
18.16%
|
52.71%
|
115.74%
|
2016
|
1.30%
|
6.77%
|
18.97%
|
53.01%
|
118.91%
|
2015
|
0.10%
|
8.77%
|
21.21%
|
55.58%
|
120.20%
|
2014
|
1.60%
|
10.40%
|
25.20%
|
59.78%
|
127.90%
|
2013
|
1.50%
|
8.22%
|
26.56%
|
61.35%
|
133.96%
|
2012
|
2.10%
|
10.68%
|
27.55%
|
63.73%
|
137.88%
|
2011
|
3.20%
|
11.44%
|
26.93%
|
65.18%
|
147.43%
|
2010
|
1.60%
|
11.44%
|
26.44%
|
66.78%
|
164.45%
|
2009
|
-0.40%
|
13.41%
|
28.68%
|
73.02%
|
195.43%
|
2008
|
3.80%
|
16.94%
|
32.04%
|
82.05%
|
230.13%
|
2007
|
2.80%
|
15.25%
|
29.24%
|
82.57%
|
242.22%
|
2006
|
3.20%
|
13.90%
|
28.61%
|
84.00%
|
254.53%
|
2005
|
3.40%
|
13.46%
|
28.36%
|
81.68%
|
263.47%
|
2004
|
2.70%
|
13.46%
|
27.62%
|
82.03%
|
283.50%
|
2003
|
2.30%
|
12.91%
|
27.49%
|
84.86%
|
314.50%
|
2002
|
1.60%
|
12.14%
|
28.36%
|
86.49%
|
330.30%
|
2001
|
2.80%
|
12.91%
|
30.13%
|
94.93%
|
337.07%
|
2000
|
3.40%
|
13.13%
|
31.90%
|
109.16%
|
343.88%
|
1999
|
2.20%
|
12.47%
|
34.46%
|
129.59%
|
353.75%
|
1998
|
1.60%
|
12.91%
|
37.88%
|
150.03%
|
368.40%
|
1997
|
2.30%
|
14.47%
|
41.27%
|
164.79%
|
380.39%
|
1996
|
3.00%
|
15.25%
|
43.06%
|
175.67%
|
384.14%
|
1995
|
2.80%
|
16.60%
|
41.54%
|
183.16%
|
383.67%
|
1994
|
2.60%
|
19.54%
|
42.64%
|
200.51%
|
378.03%
|
1993
|
3.00%
|
22.11%
|
45.00%
|
225.12%
|
371.97%
|
1992
|
3.00%
|
23.41%
|
45.28%
|
235.22%
|
364.18%
|
1991
|
4.20%
|
24.13%
|
49.80%
|
235.87%
|
355.17%
|
1990
|
5.40%
|
21.39%
|
58.57%
|
236.51%
|
341.19%
|
1989
|
4.80%
|
19.32%
|
70.75%
|
237.47%
|
325.70%
|
1988
|
4.10%
|
18.75%
|
81.34%
|
239.72%
|
309.05%
|
1987
|
3.60%
|
17.72%
|
87.44%
|
240.05%
|
303.94%
|
1986
|
1.90%
|
20.68%
|
92.69%
|
238.41%
|
302.77%
|
1985
|
3.60%
|
30.62%
|
100.06%
|
241.73%
|
301.19%
|
1984
|
4.30%
|
43.11%
|
110.68%
|
235.13%
|
285.70%
|
1983
|
3.20%
|
52.71%
|
124.22%
|
225.49%
|
272.39%
|
1982
|
6.20%
|
59.22%
|
130.73%
|
219.50%
|
263.73%
|
1981
|
10.30%
|
59.67%
|
124.22%
|
203.86%
|
249.00%
|
1980
|
13.50%
|
53.16%
|
112.22%
|
178.24%
|
241.41%
|
1979
|
11.30%
|
47.22%
|
97.64%
|
149.31%
|
204.71%
|
1978
|
7.60%
|
46.82%
|
87.34%
|
125.57%
|
170.49%
|
1977
|
6.50%
|
44.91%
|
81.42%
|
115.50%
|
171.74%
|
1976
|
5.80%
|
40.42%
|
75.63%
|
109.03%
|
191.90%
|
1975
|
9.10%
|
38.56%
|
70.81%
|
100.53%
|
198.80%
|
1974
|
11.00%
|
34.25%
|
59.07%
|
83.07%
|
180.17%
|
1973
|
6.20%
|
27.59%
|
45.17%
|
66.08%
|
156.70%
|
1972
|
3.20%
|
25.19%
|
38.47%
|
57.64%
|
156.46%
|
1971
|
4.40%
|
25.07%
|
35.52%
|
55.65%
|
175.59%
|
1970
|
5.70%
|
23.27%
|
31.11%
|
60.87%
|
177.18%
|
1969
|
5.50%
|
18.49%
|
26.15%
|
54.17%
|
164.07%
|
1968
|
4.20%
|
13.77%
|
20.41%
|
44.38%
|
146.80%
|
1967
|
3.10%
|
10.61%
|
18.79%
|
49.79%
|
131.87%
|
1966
|
2.90%
|
8.36%
|
19.02%
|
66.20%
|
133.00%
|
1965
|
1.60%
|
6.35%
|
17.40%
|
74.93%
|
129.83%
|
1964
|
1.30%
|
6.46%
|
15.09%
|
76.13%
|
131.19%
|
1963
|
1.30%
|
5.83%
|
14.41%
|
76.83%
|
135.29%
|
1962
|
1.00%
|
7.40%
|
13.84%
|
85.21%
|
120.43%
|
1961
|
1.00%
|
9.84%
|
14.86%
|
103.36%
|
96.64%
|
1960
|
1.70%
|
10.38%
|
22.70%
|
111.41%
|
77.17%
|
1959
|
0.70%
|
8.11%
|
22.22%
|
109.34%
|
70.20%
|
1958
|
2.80%
|
8.11%
|
19.91%
|
104.97%
|
69.02%
|
1957
|
3.30%
|
6.00%
|
26.10%
|
95.20%
|
61.62%
|
1956
|
1.50%
|
4.57%
|
39.65%
|
95.77%
|
53.80%
|
1955
|
-0.40%
|
11.16%
|
49.00%
|
95.77%
|
53.19%
|
1954
|
0.70%
|
13.06%
|
53.04%
|
100.88%
|
57.34%
|
1953
|
0.80%
|
10.92%
|
54.56%
|
105.66%
|
56.25%
|
1952
|
1.90%
|
18.96%
|
62.69%
|
93.63%
|
57.80%
|
1951
|
7.90%
|
33.55%
|
77.06%
|
71.20%
|
45.41%
|
1950
|
1.30%
|
34.04%
|
72.30%
|
44.39%
|
20.61%
|
1949
|
-1.20%
|
35.37%
|
71.28%
|
39.26%
|
37.64%
|
1948
|
8.10%
|
39.34%
|
70.93%
|
40.95%
|
59.65%
|
1947
|
14.40%
|
36.76%
|
54.80%
|
28.17%
|
74.27%
|
1946
|
8.30%
|
32.58%
|
40.19%
|
10.13%
|
78.84%
|
1945
|
2.30%
|
28.54%
|
31.39%
|
2.81%
|
78.18%
|
1944
|
1.70%
|
26.53%
|
31.26%
|
2.81%
|
75.92%
|
1943
|
6.10%
|
22.67%
|
33.06%
|
1.09%
|
74.71%
|
1942
|
10.90%
|
13.19%
|
19.02%
|
-3.00%
|
NA
|
1941
|
5.00%
|
5.74%
|
-3.30%
|
-17.87%
|
NA
|
1940
|
0.70%
|
2.22%
|
-16.20%
|
-30.00%
|
NA
|
1939
|
-1.40%
|
3.74%
|
-18.69%
|
-19.64%
|
NA
|
1938
|
-2.10%
|
8.47%
|
-17.54%
|
-6.60%
|
NA
|
1937
|
3.60%
|
5.15%
|
-17.20%
|
12.58%
|
NA
|
1936
|
1.50%
|
-8.55%
|
-21.44%
|
27.57%
|
NA
|
1935
|
2.20%
|
-18.01%
|
-21.75%
|
35.62%
|
NA
|
1934
|
3.10%
|
-21.62%
|
-21.67%
|
34.03%
|
NA
|
1933
|
-5.10%
|
-23.98%
|
-24.03%
|
31.30%
|
NA
|
1932
|
-9.90%
|
-21.26%
|
-18.50%
|
NA
|
NA
|
1931
|
-9.00%
|
-14.09%
|
-15.07%
|
NA
|
NA
|
1930
|
-2.30%
|
-4.56%
|
-16.47%
|
NA
|
NA
|
1929
|
0.00%
|
-0.06%
|
-1.16%
|
NA
|
NA
|
1928
|
-1.70%
|
-0.06%
|
13.27%
|
NA
|
NA
|
1927
|
-1.70%
|
3.50%
|
35.97%
|
NA
|
NA
|
1926
|
1.10%
|
-1.14%
|
62.39%
|
NA
|
NA
|
1925
|
2.30%
|
-12.48%
|
73.31%
|
NA
|
NA
|
1924
|
0.00%
|
-1.10%
|
71.11%
|
NA
|
NA
|
1923
|
1.80%
|
13.34%
|
72.82%
|
NA
|
NA
|
1922
|
-6.10%
|
31.38%
|
NA
|
NA
|
NA
|
1921
|
-10.50%
|
64.25%
|
NA
|
NA
|
NA
|
1920
|
15.60%
|
98.02%
|
NA
|
NA
|
NA
|
1919
|
14.60%
|
73.01%
|
NA
|
NA
|
NA
|
1918
|
18.00%
|
52.48%
|
NA
|
NA
|
NA
|
1917
|
17.40%
|
NA
|
NA
|
NA
|
NA
|
1916
|
7.90%
|
NA
|
NA
|
NA
|
NA
|
1915
|
1.00%
|
NA
|
NA
|
NA
|
NA
|
1914
|
1.00%
|
NA
|
NA
|
NA
|
NA
|
1913
|
NA
|
NA
|
NA
|
NA
|
NA
|
Compound Average Inflation Rates (1913-2023)
Date
|
1-Year CAIR
|
5-Year CAIR
|
10-Year CAIR
|
20-Year CAIR
|
30-Year CAIR
|
2023
|
4.10%
|
3.93%
|
2.71%
|
2.55%
|
2.52%
|
2022
|
8.00%
|
3.59%
|
2.45%
|
2.46%
|
2.48%
|
2021
|
4.70%
|
2.43%
|
1.87%
|
2.14%
|
2.32%
|
2020
|
1.20%
|
1.76%
|
1.73%
|
2.05%
|
2.30%
|
2019
|
1.80%
|
1.54%
|
1.77%
|
2.16%
|
2.44%
|
2018
|
2.40%
|
1.50%
|
1.55%
|
2.18%
|
2.54%
|
2017
|
2.10%
|
1.32%
|
1.68%
|
2.14%
|
2.60%
|
2016
|
1.30%
|
1.32%
|
1.75%
|
2.15%
|
2.65%
|
2015
|
0.10%
|
1.70%
|
1.94%
|
2.23%
|
2.67%
|
2014
|
1.60%
|
2.00%
|
2.27%
|
2.37%
|
2.78%
|
2013
|
1.50%
|
1.59%
|
2.38%
|
2.42%
|
2.87%
|
2012
|
2.10%
|
2.05%
|
2.46%
|
2.50%
|
2.93%
|
2011
|
3.20%
|
2.19%
|
2.41%
|
2.54%
|
3.07%
|
2010
|
1.60%
|
2.19%
|
2.37%
|
2.59%
|
3.29%
|
2009
|
-0.40%
|
2.55%
|
2.55%
|
2.78%
|
3.68%
|
2008
|
3.80%
|
3.18%
|
2.82%
|
3.04%
|
4.06%
|
2007
|
2.80%
|
2.88%
|
2.60%
|
3.06%
|
4.19%
|
2006
|
3.20%
|
2.64%
|
2.55%
|
3.10%
|
4.31%
|
2005
|
3.40%
|
2.56%
|
2.53%
|
3.03%
|
4.40%
|
2004
|
2.70%
|
2.56%
|
2.47%
|
3.04%
|
4.58%
|
2003
|
2.30%
|
2.46%
|
2.46%
|
3.12%
|
4.85%
|
2002
|
1.60%
|
2.32%
|
2.53%
|
3.17%
|
4.98%
|
2001
|
2.80%
|
2.46%
|
2.67%
|
3.39%
|
5.04%
|
2000
|
3.40%
|
2.50%
|
2.81%
|
3.76%
|
5.09%
|
1999
|
2.20%
|
2.38%
|
3.00%
|
4.24%
|
5.17%
|
1998
|
1.60%
|
2.46%
|
3.26%
|
4.69%
|
5.28%
|
1997
|
2.30%
|
2.74%
|
3.52%
|
4.99%
|
5.37%
|
1996
|
3.00%
|
2.88%
|
3.65%
|
5.20%
|
5.40%
|
1995
|
2.80%
|
3.12%
|
3.53%
|
5.34%
|
5.39%
|
1994
|
2.60%
|
3.63%
|
3.62%
|
5.66%
|
5.35%
|
1993
|
3.00%
|
4.08%
|
3.79%
|
6.07%
|
5.31%
|
1992
|
3.00%
|
4.30%
|
3.81%
|
6.23%
|
5.25%
|
1991
|
4.20%
|
4.42%
|
4.12%
|
6.24%
|
5.18%
|
1990
|
5.40%
|
3.95%
|
4.72%
|
6.26%
|
5.07%
|
1989
|
4.80%
|
3.60%
|
5.50%
|
6.27%
|
4.95%
|
1988
|
4.10%
|
3.50%
|
6.13%
|
6.31%
|
4.81%
|
1987
|
3.60%
|
3.32%
|
6.48%
|
6.31%
|
4.76%
|
1986
|
1.90%
|
3.83%
|
6.78%
|
6.29%
|
4.75%
|
1985
|
3.60%
|
5.49%
|
7.18%
|
6.34%
|
4.74%
|
1984
|
4.30%
|
7.43%
|
7.74%
|
6.23%
|
4.60%
|
1983
|
3.20%
|
8.84%
|
8.41%
|
6.08%
|
4.48%
|
1982
|
6.20%
|
9.75%
|
8.72%
|
5.98%
|
4.40%
|
1981
|
10.30%
|
9.81%
|
8.41%
|
5.71%
|
4.25%
|
1980
|
13.50%
|
8.90%
|
7.81%
|
5.25%
|
4.18%
|
1979
|
11.30%
|
8.04%
|
7.05%
|
4.67%
|
3.78%
|
1978
|
7.60%
|
7.98%
|
6.48%
|
4.15%
|
3.37%
|
1977
|
6.50%
|
7.70%
|
6.14%
|
3.91%
|
3.39%
|
1976
|
5.80%
|
7.03%
|
5.79%
|
3.76%
|
3.64%
|
1975
|
9.10%
|
6.74%
|
5.50%
|
3.54%
|
3.72%
|
1974
|
11.00%
|
6.07%
|
4.75%
|
3.07%
|
3.49%
|
1973
|
6.20%
|
4.99%
|
3.80%
|
2.57%
|
3.19%
|
1972
|
3.20%
|
4.60%
|
3.31%
|
2.30%
|
3.19%
|
1971
|
4.40%
|
4.58%
|
3.09%
|
2.24%
|
3.44%
|
1970
|
5.70%
|
4.27%
|
2.75%
|
2.41%
|
3.46%
|
1969
|
5.50%
|
3.45%
|
2.35%
|
2.19%
|
3.29%
|
1968
|
4.20%
|
2.61%
|
1.87%
|
1.85%
|
3.06%
|
1967
|
3.10%
|
2.04%
|
1.74%
|
2.04%
|
2.84%
|
1966
|
2.90%
|
1.62%
|
1.76%
|
2.57%
|
2.86%
|
1965
|
1.60%
|
1.24%
|
1.62%
|
2.84%
|
2.81%
|
1964
|
1.30%
|
1.26%
|
1.42%
|
2.87%
|
2.83%
|
1963
|
1.30%
|
1.14%
|
1.35%
|
2.89%
|
2.89%
|
1962
|
1.00%
|
1.44%
|
1.30%
|
3.13%
|
2.67%
|
1961
|
1.00%
|
1.90%
|
1.39%
|
3.61%
|
2.28%
|
1960
|
1.70%
|
2.00%
|
2.07%
|
3.81%
|
1.92%
|
1959
|
0.70%
|
1.57%
|
2.03%
|
3.76%
|
1.79%
|
1958
|
2.80%
|
1.57%
|
1.83%
|
3.65%
|
1.76%
|
1957
|
3.30%
|
1.17%
|
2.35%
|
3.40%
|
1.61%
|
1956
|
1.50%
|
0.90%
|
3.40%
|
3.42%
|
1.45%
|
1955
|
-0.40%
|
2.14%
|
4.07%
|
3.42%
|
1.43%
|
1954
|
0.70%
|
2.48%
|
4.35%
|
3.55%
|
1.52%
|
1953
|
0.80%
|
2.10%
|
4.45%
|
3.67%
|
1.50%
|
1952
|
1.90%
|
3.53%
|
4.99%
|
3.36%
|
1.53%
|
1951
|
7.90%
|
5.96%
|
5.88%
|
2.72%
|
1.26%
|
1950
|
1.30%
|
6.04%
|
5.59%
|
1.85%
|
0.63%
|
1949
|
-1.20%
|
6.24%
|
5.53%
|
1.67%
|
1.07%
|
1948
|
8.10%
|
6.86%
|
5.51%
|
1.73%
|
1.57%
|
1947
|
14.40%
|
6.46%
|
4.47%
|
1.25%
|
1.87%
|
1946
|
8.30%
|
5.80%
|
3.44%
|
0.48%
|
1.96%
|
1945
|
2.30%
|
5.15%
|
2.77%
|
0.14%
|
1.94%
|
1944
|
1.70%
|
4.82%
|
2.76%
|
0.14%
|
1.90%
|
1943
|
6.10%
|
4.17%
|
2.90%
|
0.05%
|
1.88%
|
1942
|
10.90%
|
2.51%
|
1.76%
|
-0.15%
|
NA
|
1941
|
5.00%
|
1.12%
|
-0.34%
|
-0.98%
|
NA
|
1940
|
0.70%
|
0.44%
|
-1.75%
|
-1.77%
|
NA
|
1939
|
-1.40%
|
0.74%
|
-2.05%
|
-1.09%
|
NA
|
1938
|
-2.10%
|
1.64%
|
-1.91%
|
-0.34%
|
NA
|
1937
|
3.60%
|
1.01%
|
-1.87%
|
0.59%
|
NA
|
1936
|
1.50%
|
-1.77%
|
-2.38%
|
1.23%
|
NA
|
1935
|
2.20%
|
-3.89%
|
-2.42%
|
1.54%
|
NA
|
1934
|
3.10%
|
-4.76%
|
-2.41%
|
1.48%
|
NA
|
1933
|
-5.10%
|
-5.34%
|
-2.71%
|
1.37%
|
NA
|
1932
|
-9.90%
|
-4.67%
|
-2.03%
|
NA
|
NA
|
1931
|
-9.00%
|
-2.99%
|
-1.62%
|
NA
|
NA
|
1930
|
-2.30%
|
-0.93%
|
-1.78%
|
NA
|
NA
|
1929
|
0.00%
|
-0.01%
|
-0.12%
|
NA
|
NA
|
1928
|
-1.70%
|
-0.01%
|
1.25%
|
NA
|
NA
|
1927
|
-1.70%
|
0.69%
|
3.12%
|
NA
|
NA
|
1926
|
1.10%
|
-0.23%
|
4.97%
|
NA
|
NA
|
1925
|
2.30%
|
-2.63%
|
5.65%
|
NA
|
NA
|
1924
|
0.00%
|
-0.22%
|
5.52%
|
NA
|
NA
|
1923
|
1.80%
|
2.54%
|
5.62%
|
NA
|
NA
|
1922
|
-6.10%
|
5.61%
|
NA
|
NA
|
NA
|
1921
|
-10.50%
|
10.43%
|
NA
|
NA
|
NA
|
1920
|
15.60%
|
14.64%
|
NA
|
NA
|
NA
|
1919
|
14.60%
|
11.59%
|
NA
|
NA
|
NA
|
1918
|
18.00%
|
8.80%
|
NA
|
NA
|
NA
|
1917
|
17.40%
|
NA
|
NA
|
NA
|
NA
|
1916
|
7.90%
|
NA
|
NA
|
NA
|
NA
|
1915
|
1.00%
|
NA
|
NA
|
NA
|
NA
|
1914
|
1.00%
|
NA
|
NA
|
NA
|
NA
|
1913
|
NA
|
NA
|
NA
|
NA
|
NA
|
Values “NA” exists for years where there is insufficient amount of
data. For example, since the dataset starts in 1913, there is not enough
years in 1930 to calculate for a 30-Year CAIR.
Summary
Compound Average Summary (1913-2023)
Statistic
|
1-Year CAIR
|
5-Year CAIR
|
10-Year CAIR
|
20-Year CAIR
|
30-Year CAIR
|
Overall
|
Count of Observations
|
110
|
106
|
101
|
91
|
81
|
489
|
Mean
|
3.27%
|
3.17%
|
2.99%
|
3.08%
|
3.33%
|
3.16%
|
Median
|
2.75%
|
2.54%
|
2.75%
|
3.03%
|
3.19%
|
2.81%
|
Standard Deviation (Volatility)
|
4.69%
|
3.31%
|
2.59%
|
1.87%
|
1.31%
|
3.1%
|
Min CAIR Range (CAIR - SD)
|
-1.53%
|
-0.15%
|
0.57%
|
1.29%
|
1.85%
|
0.06%
|
Max CAIR Range (CAIR + SD)
|
7.85%
|
6.47%
|
5.75%
|
5.03%
|
4.47%
|
6.26%
|
Minimum
|
-10.5%
|
-5.34%
|
-2.71%
|
-1.77%
|
0.63%
|
-10.5%
|
Maximum
|
18%
|
14.64%
|
8.72%
|
6.34%
|
5.4%
|
18%
|
Above 2.0 Target
|
60%
|
65.09%
|
69.31%
|
79.12%
|
77.78%
|
69.53%
|
Below 2.0 Target
|
40%
|
33.02%
|
30.69%
|
20.88%
|
22.22%
|
30.06%
|
The overall mean annual inflation rate stands at 3.16%, with a
standard deviation of 3.1%, indicating moderate volatility over the full
dataset from 1913 thru 2023. Shorter periods, such as the 1-Year and
5-Year CAIRs, exhibit greater variability, with standard deviations of
4.69% and 3.31%, respectively, reflecting sensitivity to short-term
economic fluctuations. Conversely, longer periods like the 20-Year and
30-Year CAIRs demonstrate significantly reduced volatility, with
standard deviations of 1.87% and 1.31%, respectively, highlighting that
extended durations offer a more stable and consistent view of inflation
trends.
Overall values are calculated from all numerical data across the CAIR
periods, providing a comprehensive representation of historical
inflation trends. We can, therefore, use the Overall CAIR Mean (3.16%)
as a baseline to evaluate inflationary pressures relative to historical
norms. The overall standard deviation quantifies the typical range of
inflation variability over time, providing a singular CAIR range
(0.06%-6.26)% that capture the bounds of typical historical
fluctuations.
Graph
These graphs illustrate the Rolling CAIR across varying time horizons
(1, 5, 10, 20, and 30 years) over different historical periods, with a
focus on the standard 2% inflation target. The green band represents
overall range where inflation rates align with historical norms, while
the red zones indicate periods of significant deviation. Shorter-term
CAIRs (e.g., 1-Year) display higher volatility, often exceeding the
target range, whereas longer-term CAIRs (e.g., 30-Year) are smoother and
remain more stable within the green band, reflecting cumulative
inflation effects and long-term stability.
All Periods
Short-Term
Compound Average Inflation Rates Across Short-Term Rolling
Periods

Long-Term
Compound Average Inflation Rates Across Long-Term Rolling
Periods

INDEXES
General Portfolio Types
Conservative Portfolios
Conservative investment strategies focus on capital preservation with
annual growth targets of 3%-5%. Typically, these portfolios consist of
20%-40% equities, with the majority allocated to bonds or other
income-generating assets. They are characterized by reduced volatility
and limited drawdowns (~10%-20%), making them suitable for risk-averse
individuals or those nearing retirement. For more on constructing
conservative portfolios, see Vanguard’s Asset Allocation Guide (https://investor.vanguard.com/investor-resources-education/education/model-portfolio-allocation).
Moderate Portfolios
Moderate portfolios typically target annual growth rates of 5%-7%,
balancing risk and return. These portfolios often allocate 60% to
stocks, such as the S&P 500, and 40% to fixed-income assets like
bonds. The historical performance of moderate portfolios provides
stable, inflation-beating returns with lower volatility than aggressive
strategies, making them ideal for investors seeking steady growth
without high exposure to market swings. The concept aligns with insights
provided by Morningstar’s Portfolio Analysis (https://www.morningstar.com/products/portfolio-analysis).
Aggressive Portfolios
Aggressive portfolios aim for annual growth rates of 10%-12% and are
heavily weighted in equities, such as growth stocks, small-cap stocks,
and emerging markets. While these portfolios often outperform benchmarks
like the S&P 500 during bull markets, they carry significant
volatility, with potential drawdowns of ~50% during downturns. These
strategies are ideal for long-term investors willing to withstand
fluctuations. Learn more about growth-focused investing through
Investopedia’s Aggressive Growth Strategies (https://www.investopedia.com/terms/a/aggressiveinvestmentstrategy.asp).
Inflation to S&P 500
The S&P 500 does not adjust for inflation, meaning its
performance reflects nominal returns. Inflation-adjusted (real) returns,
which subtract inflation rates (e.g., ~2%-3%), provide a clearer picture
of purchasing power. On average, the S&P 500 is widely accepted to
deliver ~6%-7% real annual returns after accounting for inflation. For
historical insights on inflation-adjusted returns, the Shiller CAPE
Ratio dataset (https://shillerdata.com/) is a valuable resource. This
dataset aligns the S&P 500’s nominal prices with their real,
inflation-adjusted counterparts, offering insights into long-term market
valuations. Additionally, the U.S. Bureau of Labor Statistics provides a
CPI Inflation Calculator (https://www.bls.gov/data/inflation_calculator.htm),
which allows users to calculate the buying power of the dollar between
different dates, facilitating a better understanding of inflation’s
impact over time.
Conclusion
Investment strategies are aligned to each individual goals and risk
tolerances. Moderate portfolios balance growth and risk, conservative
strategies prioritize stability, and aggressive approaches focus on high
growth. Understanding inflation’s impact on nominal returns is critical
for evaluating real investment performance. For additional analysis
tools and historical data, consider reviewing Morningstar, Vanguard, and
the Shiller CAPE Ratio.
Preferred Targets
To effectively compare indexes over time, it’s essential to account
for inflation rates. I’ve set Subjective Target rates using the
calculated overall inflation rate (3.16%) and the assumed portfolio
growth rates. A higher inflation rate as a target serves as a
conservative buffer against inflationary volatility, aiding in the
selection of stocks or indexes that perform well in preserving
purchasing power during periods of elevated inflation. Monitoring
performance against these benchmarks helps narrow down which investment
or index provides better inflation-adjusted outcomes. To Ekko words once
said, “It’s not enough to give people what they need to survive; you
have to give them what they need to live.”
Growth Rate Targets
Target Type
|
Target Rate
|
Definition
|
Inflation
|
3.16%
|
Overall, Average Inflation Rate to stay afloat.
|
Conservative
|
6.16%
|
3% Growth Rate minimum, including inflation.
|
Moderate
|
8.16%
|
5% Growth Rate minimum, including inflation
|
Aggressive
|
13.16%
|
10% Growth Rate minimum, including inflation.
|
Glossary
Name
|
Definition
|
CAGR
|
Compound Average Growth Rate. The average yearly growth rate over the
period, calculated as a mean growth rate over a period if it had
compounded anually. It provides an idea of the typical growth rate
experienced each year, smoothing out annual fluctuations and making it
more accurate for comparisons across time periods. A 5-Year CAGR
represents the annualized average rate of growth over a five-year
period, accounting for compounding; it reflects the growth rate as if it
were compounded each year over five years.
|
CGR
|
Cumulative Growth Rate. The cumulative growth rate over multiple
periods, accounting for compounding. It measures the total percentage
growth from the initial to the final year in the series. It is the total
increase in prices over a given period without averaging it annually.
It’s the straightforward cumulative effect of growth over the specified
time. A 5-Year CGR represents the total percentage increase in an index
or prices over a five-year period without averaging or compounding on an
annual basis. it shows the cumulative growth over the entire five years.
|
Close
|
The closing value of the Index on the Close Date. This represents the
value of the index at the end of that specific period, giving a snapshot
of the market’s performance.
|
Date
|
Specific Date when the Index is measured. Date varies by sources.
|
S&P 500
The S&P 500, short for the Standard & Poor’s 500 Index and
commonly known by its ticker symbol SPX, is a widely recognized
benchmark that tracks the performance of 500 of the largest publicly
traded companies in the United States. It represents a broad spectrum of
industries, including technology, healthcare, finance, and energy, and
is often used as a gauge of overall market health and economic
performance. The index is weighted by market capitalization, meaning
companies with larger market values have a greater impact on its
performance. As a key indicator for investors, it reflects the growth
and volatility of the U.S. stock market and serves as a baseline for
measuring investment returns across a variety of portfolios.
S&P 500 GR
Data
The S&P 500 data presented here, sourced from Multpl, spans from
the year 1900 onward. Multpl is a financial data platform that provides
historical and current metrics for the S&P 500, including prices,
price-to-earnings ratios, and inflation-adjusted values, offering
investors insights into market trends over time. Each “Close” (Closing
Price) represents the average of each month’s closing prices; for
example, the price for January 1, 2024, reflects the average of all
January closing prices. By cross-referencing the January 1, 2024,
monthly close from Multpl with the average of all January 2024 closing
prices from Webull Trading Platform (an unrelated platform), we can
assume these databases are accurate and consistent with other major
financial data sources.
Data Source: S&P 500 Index - SPX Historical Chart | Multpl via https://www.multpl.com/s-p-500-historical-prices/table/by-month
Summary
Annual Growth Rate Summary (1900-2024)
Statistic
|
Value
|
Definition
|
Count of Observations
|
124
|
Total number of data points collected over the specific period.
|
CAGR
|
5.53%
|
Compound Average Growth Rate; mean growth rate over a period if it had
compounded anually.
|
Mean
|
7.17%
|
Reflects the general price level and overall growth rate.
|
Median
|
9.39%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
18.13%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAGR Range (CAGR - SD)
|
-12.6%
|
Lower boundary of expected S&P 500 range; lowest estimate of typical
growth rate considering normal fluctuations.
|
Max CAGR Range (CAGR + SD)
|
23.66%
|
Upper boundary of expected S&P 500 range; highest estimate of
typical growth rate considering normal fluctuations.
|
Minimum
|
-48.06%
|
Lowest growth rate.
|
Maximum
|
48.66%
|
Highest growth rate.
|
Percent Above Inflation Target
|
61.29%
|
Percentage of values above the inflation target specified in Preferred
Targets section.
|
Percent Above Conservative Target
|
55.65%
|
Percentage of values above the conservative target specified in
Preferred Targets section.
|
Percent Above Moderate Target
|
54.03%
|
Percentage of values above the moderate target specified in Preferred
Targets section.
|
Percent Above Aggressive Target
|
40.32%
|
Percentage of values above the aggressive target specified in Preferred
Targets section.
|
The S&P 500’s Index exhibits a baseline CAGR at 5.53%, lower than
the mean growth rate of 7.17%, reflecting the impact of short-term
volatility and growth spikes. The median return of 9.39% indicates that
more than half of the observed years experienced returns above the mean.
The relationship between the CAGR and the median growth rate suggests
that sustained periods of above-median growth have exerted cumulative
upward pressure on overall price levels. This relationship highlights a
distribution with notable extremes on the higher end, reflecting
positive skewness. This positive skewness implies that while more than
half of the observed years experienced returns above the mean, downturns
can be severe. However, the market has historically provided substantial
upside potential. Additionally, the fact that 61.29% of the years
exceeded the inflation target reinforces the S&P 500’s effectiveness
as a long-term hedge against inflation.
The standard deviation of 18.13% underscores significant volatility,
a common feature of equity markets. The highly volatile range of annual
returns, spanning from -48.06% to 48.66%, illustrates a highly volatile
market environment, partly due to its composition, with the potential
for both extreme gains and losses.
For the S&P 500 to be considered a high-performing and resilient
long-term investment, it would be ideal to exceed the aggressive target
(e.g., 10% annualized returns, accounting for higher inflation-adjusted
performance expectations) in at least 40%-50% of the years. This range
reflects the potential for strong upside in many years while balancing
the understanding that markets do experience downturns. The fact that
40.32% of the years exceeded the aggressive target suggests that while
not consistent, the S&P 500 has historically provided robust growth
over the long term, making it a viable investment for those with a
higher risk tolerance.
S&P 500 CAGR
Data
Compound Average Growth Rates (1900-2024)
Date
|
Close
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
2024-12-11
|
6,103.04
|
27.03%
|
13.24%
|
11.65%
|
8.56%
|
8.96%
|
2024-01-01
|
4,804.49
|
21.31%
|
13.00%
|
10.18%
|
7.49%
|
8.03%
|
2023-01-01
|
3,960.66
|
-13.41%
|
7.26%
|
10.34%
|
7.72%
|
7.64%
|
2022-01-01
|
4,573.82
|
20.56%
|
14.99%
|
13.40%
|
7.19%
|
8.32%
|
2021-01-01
|
3,793.75
|
15.73%
|
14.61%
|
11.45%
|
5.36%
|
8.53%
|
2020-01-01
|
3,278.20
|
25.73%
|
10.08%
|
11.30%
|
4.25%
|
7.85%
|
2019-01-01
|
2,607.39
|
-6.54%
|
7.43%
|
11.66%
|
3.75%
|
7.65%
|
2018-01-01
|
2,789.80
|
22.62%
|
13.51%
|
7.30%
|
5.46%
|
8.37%
|
2017-01-01
|
2,275.12
|
18.58%
|
11.83%
|
4.80%
|
5.59%
|
7.44%
|
2016-01-01
|
1,918.60
|
-5.40%
|
8.39%
|
4.14%
|
5.86%
|
7.68%
|
2015-01-01
|
2,028.18
|
11.29%
|
12.54%
|
5.55%
|
7.64%
|
8.58%
|
2014-01-01
|
1,822.36
|
23.10%
|
16.06%
|
4.87%
|
6.98%
|
8.31%
|
2013-01-01
|
1,480.40
|
13.83%
|
1.43%
|
5.15%
|
6.31%
|
8.07%
|
2012-01-01
|
1,300.58
|
1.40%
|
-1.80%
|
1.32%
|
5.86%
|
8.35%
|
2011-01-01
|
1,282.62
|
14.15%
|
0.06%
|
-0.40%
|
7.10%
|
7.85%
|
2010-01-01
|
1,123.58
|
29.81%
|
-1.00%
|
-2.35%
|
6.16%
|
8.02%
|
2009-01-01
|
865.58
|
-37.22%
|
-5.23%
|
-3.60%
|
5.70%
|
7.47%
|
2008-01-01
|
1,378.76
|
-3.19%
|
9.01%
|
3.65%
|
8.90%
|
9.51%
|
2007-01-01
|
1,424.16
|
11.37%
|
4.55%
|
6.39%
|
8.78%
|
9.12%
|
2006-01-01
|
1,278.73
|
8.24%
|
-0.87%
|
7.60%
|
9.50%
|
8.98%
|
2005-01-01
|
1,181.41
|
4.32%
|
-3.69%
|
9.77%
|
10.13%
|
9.75%
|
2004-01-01
|
1,132.52
|
26.42%
|
-1.94%
|
9.12%
|
10.06%
|
8.57%
|
2003-01-01
|
895.84
|
-21.43%
|
-1.44%
|
7.49%
|
9.56%
|
6.98%
|
2002-01-01
|
1,140.21
|
-14.63%
|
8.27%
|
10.61%
|
12.04%
|
8.33%
|
2001-01-01
|
1,335.63
|
-6.31%
|
16.80%
|
15.16%
|
12.23%
|
9.27%
|
2000-01-01
|
1,425.59
|
14.16%
|
25.10%
|
15.41%
|
13.62%
|
9.63%
|
1999-01-01
|
1,248.77
|
29.63%
|
21.43%
|
15.91%
|
13.47%
|
8.71%
|
1998-01-01
|
963.36
|
25.73%
|
17.22%
|
14.42%
|
12.57%
|
8.03%
|
1997-01-01
|
766.22
|
24.71%
|
12.99%
|
11.22%
|
10.51%
|
7.63%
|
1996-01-01
|
614.42
|
32.06%
|
13.55%
|
11.43%
|
9.68%
|
6.48%
|
1995-01-01
|
465.25
|
-1.64%
|
6.48%
|
10.49%
|
9.74%
|
5.78%
|
1994-01-01
|
472.99
|
8.68%
|
10.63%
|
11.01%
|
8.29%
|
6.26%
|
1993-01-01
|
435.23
|
4.60%
|
11.68%
|
11.67%
|
6.73%
|
6.54%
|
1992-01-01
|
416.08
|
27.83%
|
9.48%
|
13.50%
|
7.21%
|
6.17%
|
1991-01-01
|
325.49
|
-4.26%
|
9.35%
|
9.36%
|
6.44%
|
5.82%
|
1990-01-01
|
339.97
|
19.12%
|
14.65%
|
11.85%
|
6.85%
|
6.07%
|
1989-01-01
|
285.40
|
13.93%
|
11.39%
|
11.09%
|
5.28%
|
5.60%
|
1988-01-01
|
250.50
|
-5.29%
|
11.66%
|
10.75%
|
4.97%
|
6.21%
|
1987-01-01
|
264.50
|
27.04%
|
17.66%
|
9.81%
|
5.87%
|
6.05%
|
1986-01-01
|
208.20
|
21.33%
|
9.38%
|
7.95%
|
4.09%
|
5.31%
|
1985-01-01
|
171.60
|
3.12%
|
9.12%
|
8.99%
|
3.51%
|
5.38%
|
1984-01-01
|
166.40
|
15.32%
|
10.79%
|
5.64%
|
3.97%
|
6.46%
|
1983-01-01
|
144.30
|
23.02%
|
9.84%
|
2.00%
|
4.06%
|
5.85%
|
1982-01-01
|
117.30
|
-11.80%
|
2.48%
|
1.28%
|
2.68%
|
5.40%
|
1981-01-01
|
133.00
|
19.93%
|
6.55%
|
3.59%
|
4.08%
|
6.31%
|
1980-01-01
|
110.90
|
11.22%
|
8.85%
|
2.08%
|
3.29%
|
6.48%
|
1979-01-01
|
99.71
|
10.48%
|
0.74%
|
-0.23%
|
2.96%
|
6.43%
|
1978-01-01
|
90.25
|
-13.05%
|
-5.28%
|
-0.52%
|
4.01%
|
6.20%
|
1977-01-01
|
103.80
|
7.16%
|
0.10%
|
2.08%
|
4.22%
|
6.61%
|
1976-01-01
|
96.86
|
33.49%
|
0.71%
|
0.37%
|
4.01%
|
5.77%
|
1975-01-01
|
72.56
|
-24.50%
|
-4.28%
|
-1.70%
|
3.62%
|
5.77%
|
1974-01-01
|
96.11
|
-18.83%
|
-1.18%
|
2.31%
|
6.87%
|
7.23%
|
1973-01-01
|
118.40
|
14.62%
|
4.49%
|
6.17%
|
7.84%
|
8.55%
|
1972-01-01
|
103.30
|
10.49%
|
4.11%
|
4.11%
|
7.53%
|
8.50%
|
1971-01-01
|
93.49
|
3.52%
|
0.04%
|
4.58%
|
7.70%
|
7.54%
|
1970-01-01
|
90.31
|
-11.46%
|
0.95%
|
4.52%
|
8.75%
|
6.87%
|
1969-01-01
|
102.00
|
7.32%
|
5.94%
|
6.25%
|
9.93%
|
7.25%
|
1968-01-01
|
95.04
|
12.54%
|
7.87%
|
8.74%
|
9.73%
|
7.35%
|
1967-01-01
|
84.45
|
-9.50%
|
4.10%
|
6.40%
|
8.95%
|
5.37%
|
1966-01-01
|
93.32
|
8.36%
|
9.34%
|
7.77%
|
8.57%
|
6.59%
|
1965-01-01
|
86.12
|
12.65%
|
8.22%
|
9.24%
|
9.71%
|
7.72%
|
1964-01-01
|
76.45
|
17.51%
|
6.57%
|
11.62%
|
9.77%
|
6.83%
|
1963-01-01
|
65.06
|
-5.81%
|
9.61%
|
9.53%
|
9.77%
|
7.67%
|
1962-01-01
|
69.07
|
15.66%
|
8.74%
|
11.06%
|
10.77%
|
7.32%
|
1961-01-01
|
59.72
|
2.91%
|
6.23%
|
10.91%
|
9.05%
|
4.49%
|
1960-01-01
|
58.03
|
4.33%
|
10.27%
|
13.14%
|
8.07%
|
3.33%
|
1959-01-01
|
55.62
|
35.26%
|
16.92%
|
13.73%
|
7.75%
|
2.72%
|
1958-01-01
|
41.12
|
-9.49%
|
9.45%
|
10.74%
|
6.67%
|
2.88%
|
1957-01-01
|
45.43
|
2.90%
|
13.43%
|
11.56%
|
4.86%
|
4.15%
|
1956-01-01
|
44.15
|
24.02%
|
15.79%
|
9.37%
|
6.00%
|
4.25%
|
1955-01-01
|
35.60
|
39.83%
|
16.10%
|
10.19%
|
6.97%
|
4.13%
|
1954-01-01
|
25.46
|
-2.75%
|
10.64%
|
7.95%
|
4.51%
|
3.59%
|
1953-01-01
|
26.18
|
8.23%
|
12.04%
|
10.00%
|
6.75%
|
3.66%
|
1952-01-01
|
24.19
|
14.05%
|
9.72%
|
10.48%
|
5.49%
|
4.07%
|
1951-01-01
|
21.21
|
25.65%
|
3.31%
|
7.23%
|
1.43%
|
3.71%
|
1950-01-01
|
16.88
|
9.90%
|
4.59%
|
3.22%
|
-1.25%
|
2.18%
|
1949-01-01
|
15.36
|
3.57%
|
5.33%
|
2.08%
|
-2.38%
|
2.26%
|
1948-01-01
|
14.83
|
-2.50%
|
8.01%
|
2.75%
|
-0.83%
|
2.43%
|
1947-01-01
|
15.21
|
-15.59%
|
11.24%
|
-1.44%
|
0.64%
|
1.56%
|
1946-01-01
|
18.02
|
33.58%
|
11.30%
|
2.73%
|
1.78%
|
2.22%
|
1945-01-01
|
13.49
|
13.84%
|
1.86%
|
3.83%
|
1.22%
|
1.99%
|
1944-01-01
|
11.85
|
17.44%
|
-1.06%
|
1.18%
|
1.48%
|
1.17%
|
1943-01-01
|
10.09
|
12.99%
|
-2.26%
|
3.59%
|
0.63%
|
0.27%
|
1942-01-01
|
8.93
|
-15.36%
|
-12.68%
|
0.73%
|
1.01%
|
-0.07%
|
1941-01-01
|
10.55
|
-14.23%
|
-5.17%
|
-4.07%
|
1.99%
|
0.43%
|
1940-01-01
|
12.30
|
-1.60%
|
5.84%
|
-5.52%
|
1.67%
|
0.67%
|
1939-01-01
|
12.50
|
10.52%
|
3.47%
|
-6.64%
|
2.35%
|
1.08%
|
1938-01-01
|
11.31
|
-35.70%
|
9.79%
|
-4.29%
|
2.28%
|
1.69%
|
1937-01-01
|
17.59
|
27.83%
|
16.21%
|
2.76%
|
3.09%
|
2.05%
|
1936-01-01
|
13.76
|
48.60%
|
-2.95%
|
0.84%
|
1.96%
|
1.11%
|
1935-01-01
|
9.26
|
-12.14%
|
-15.67%
|
-1.32%
|
1.07%
|
0.31%
|
1934-01-01
|
10.54
|
48.66%
|
-15.77%
|
1.79%
|
1.16%
|
1.53%
|
1933-01-01
|
7.09
|
-14.58%
|
-16.56%
|
-2.25%
|
-1.35%
|
-0.59%
|
1932-01-01
|
8.30
|
-48.06%
|
-9.14%
|
1.29%
|
-0.47%
|
0.07%
|
1931-01-01
|
15.98
|
-26.39%
|
4.78%
|
8.44%
|
2.76%
|
2.76%
|
1930-01-01
|
21.71
|
-12.67%
|
15.46%
|
9.41%
|
3.91%
|
4.32%
|
1929-01-01
|
24.86
|
41.81%
|
23.00%
|
12.22%
|
5.18%
|
NA
|
1928-01-01
|
17.53
|
30.82%
|
14.52%
|
9.29%
|
4.81%
|
NA
|
1927-01-01
|
13.40
|
5.93%
|
12.92%
|
3.42%
|
1.70%
|
NA
|
1926-01-01
|
12.65
|
19.57%
|
12.21%
|
3.09%
|
1.25%
|
NA
|
1925-01-01
|
10.58
|
19.82%
|
3.68%
|
3.53%
|
1.14%
|
NA
|
1924-01-01
|
8.83
|
-0.79%
|
2.38%
|
0.54%
|
1.40%
|
NA
|
1923-01-01
|
8.90
|
21.92%
|
4.30%
|
-0.44%
|
0.25%
|
NA
|
1922-01-01
|
7.30
|
2.67%
|
-5.27%
|
-2.20%
|
-0.53%
|
NA
|
1921-01-01
|
7.11
|
-19.48%
|
-5.29%
|
-2.62%
|
0.03%
|
NA
|
1920-01-01
|
8.83
|
12.48%
|
3.37%
|
-1.32%
|
1.87%
|
NA
|
1919-01-01
|
7.85
|
8.88%
|
-1.27%
|
-1.42%
|
NA
|
NA
|
1918-01-01
|
7.21
|
-24.66%
|
-4.96%
|
0.51%
|
NA
|
NA
|
1917-01-01
|
9.57
|
2.57%
|
0.97%
|
0.01%
|
NA
|
NA
|
1916-01-01
|
9.33
|
24.73%
|
0.13%
|
-0.56%
|
NA
|
NA
|
1915-01-01
|
7.48
|
-10.63%
|
-5.79%
|
-1.19%
|
NA
|
NA
|
1914-01-01
|
8.37
|
-10.00%
|
-1.57%
|
2.28%
|
NA
|
NA
|
1913-01-01
|
9.30
|
1.97%
|
6.31%
|
0.95%
|
NA
|
NA
|
1912-01-01
|
9.12
|
-1.62%
|
-0.94%
|
1.17%
|
NA
|
NA
|
1911-01-01
|
9.27
|
-8.04%
|
-1.25%
|
2.75%
|
NA
|
NA
|
1910-01-01
|
10.08
|
11.26%
|
3.64%
|
5.15%
|
NA
|
NA
|
1909-01-01
|
9.06
|
32.26%
|
6.28%
|
NA
|
NA
|
NA
|
1908-01-01
|
6.85
|
-28.35%
|
-4.13%
|
NA
|
NA
|
NA
|
1907-01-01
|
9.56
|
-3.14%
|
3.32%
|
NA
|
NA
|
NA
|
1906-01-01
|
9.87
|
17.08%
|
6.90%
|
NA
|
NA
|
NA
|
1905-01-01
|
8.43
|
26.20%
|
6.68%
|
NA
|
NA
|
NA
|
1904-01-01
|
6.68
|
-21.04%
|
NA
|
NA
|
NA
|
NA
|
1903-01-01
|
8.46
|
4.19%
|
NA
|
NA
|
NA
|
NA
|
1902-01-01
|
8.12
|
14.85%
|
NA
|
NA
|
NA
|
NA
|
1901-01-01
|
7.07
|
15.90%
|
NA
|
NA
|
NA
|
NA
|
1900-01-01
|
6.10
|
NA
|
NA
|
NA
|
NA
|
NA
|
Summary
Compound Average Growth Rates (1900-2024)
Statistic
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
Overall
|
Count of Observations
|
124
|
120
|
115
|
105
|
95
|
559
|
Mean
|
7.17%
|
5.71%
|
5.45%
|
5.42%
|
5.59%
|
5.9%
|
Median
|
9.39%
|
6.52%
|
5.15%
|
5.49%
|
6.26%
|
6.21%
|
Standard Deviation (Volatility)
|
18.13%
|
7.88%
|
5.31%
|
3.62%
|
2.75%
|
9.78%
|
Min CAGR Range (CAGR - SD)
|
-12.6%
|
-2.35%
|
0.22%
|
1.91%
|
2.78%
|
-4.25%
|
Max CAGR Range (CAGR + SD)
|
23.66%
|
13.41%
|
10.84%
|
9.15%
|
8.28%
|
15.31%
|
Minimum
|
-48.06%
|
-16.56%
|
-6.64%
|
-2.38%
|
-0.59%
|
-48.06%
|
Maximum
|
48.66%
|
25.1%
|
15.91%
|
13.62%
|
9.75%
|
48.66%
|
Percent Above Inflation Target
|
65.32%
|
68.33%
|
71.3%
|
76.19%
|
85.26%
|
66.91%
|
Percent Above Conservative Target
|
56.45%
|
55.83%
|
50.43%
|
54.29%
|
66.32%
|
50.81%
|
Percent Above Moderate Target
|
55.65%
|
46.67%
|
43.48%
|
34.29%
|
37.89%
|
36.49%
|
Percent Above Aggressive Target
|
43.55%
|
20.83%
|
7.83%
|
4.76%
|
0%
|
13.95%
|
1900-2024 Summary: The 1-Year CAGR exhibits the
highest mean return at 7.17%, and the greatest volatility with a a
standard deviation of 18.13%. As the investment horizon extends to 5,
10, 20, and 30 years, the mean returns decrease, ranging from 5.71% to
5.59%, while volatility diminishes, with standard deviations dropping
from 7.88% to 2.75%. This trend indicates that longer investment periods
tend to offer more stable returns. Furthermore, the percentage of
periods exceeding the inflation target increases with longer durations,
from 65.32% in the 1-Year CAGR to 85.26% in the 30-Year CAGR,
underscoring S&P 500’s effectiveness as a hedge against inflation
over extended timeframes. With an overall percentage of 13.95% exceeding
the aggressive target (10% annualized returns), S&P 500 appears,
over this time period, to be a less suitable option for a high-returning
long-term investment.
Graph
All Periods
Short-Term
Compound Average Growth Rates Across Short-Term Rolling Periods


Long-Term
Compound Average Growth Rates Across Long-Term Rolling Periods

QQQ
The Invesco QQQ Trust, commonly known by its ticker symbol QQQ, is an
exchange-traded fund (ETF) that tracks the Nasdaq-100 Index. This index
comprises 100 of the largest non-financial companies listed on the
Nasdaq Stock Market, predominantly featuring firms in the technology
sector, but also including companies from consumer services, healthcare,
and industrials. Due to its focus on high-growth industries, QQQ is
often used by investors to gain exposure to leading tech companies and
to capitalize on the performance of the broader technology market.
Invesco Ltd. is a global independent investment management firm
headquartered in Atlanta, Georgia. Established in 1978, the company
offers a diverse range of investment products and services, including
mutual funds, exchange-traded funds (ETFs), and retirement plans,
catering to individual investors, financial professionals, and
institutions. Operating under brand names such as Invesco, Invesco
Perpetual, and PowerShares, Invesco manages assets across various asset
classes, investment styles, and geographies. Visit Invesco at https://www.invesco.com/qqq-etf/en/about-invesco.html.
QQQ GR
Data
The QQQ data presented here, sourced from Investing.com, spans from
December 31, 1999, onward. Investing.com is a comprehensive financial
platform that offers real-time data, quotes, charts, and financial news
across global markets. Each “Close” represents the closing price for the
day prior, or the end of the prior year. For example, the price for
January 1, 2024, reflects the December 31, 2023, end-of-year closing
price.
Data Source: Invesco QQQ Index - QQQ Historical Chart | Via https://www.investing.com/etfs/powershares-qqqq-historical-data.
The Actual Close Price is the day prior Close Date of the preceding
month (if Date is 11/01/2024, QQQ Data represents 10/31/2024 Close).
Price on date may differ between databases by +/-1%.
Summary
Annual Growth Rate Summary (2000-2024)
Statistic
|
Value
|
Definition
|
Count of Observations
|
24
|
Total number of data points collected over the specific period.
|
CAGR
|
6.47%
|
Compound Average Growth Rate; mean growth rate over a period if it had
compounded anually.
|
Mean
|
10.82%
|
Reflects the general price level and overall growth rate.
|
Median
|
13.07%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
29.71%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAGR Range (CAGR - SD)
|
-23.24%
|
Lower boundary of expected QQQ range; lowest estimate of typical growth
rate considering normal fluctuations.
|
Max CAGR Range (CAGR + SD)
|
36.18%
|
Upper boundary of expected QQQ range; highest estimate of typical growth
rate considering normal fluctuations.
|
Minimum
|
-41.94%
|
Lowest growth rate.
|
Maximum
|
53.87%
|
Highest growth rate.
|
Percent Above Inflation Target
|
66.67%
|
Percentage of values above the inflation target specified in Preferred
Targets section.
|
Percent Above Conservative Target
|
62.5%
|
Percentage of values above the conservative target specified in
Preferred Targets section.
|
Percent Above Moderate Target
|
58.33%
|
Percentage of values above the moderate target specified in Preferred
Targets section.
|
Percent Above Aggressive Target
|
50%
|
Percentage of values above the aggressive target specified in Preferred
Targets section.
|
The QQQ’s Index exhibits a conservative CAGR at 6.47%, lower than the
mean growth rate of 10.82%, reflecting the impact of short-term
volatility and growth spikes. The median return of 13.07% indicates that
more than half of the observed years experienced returns above the mean.
The relationship between the CAGR and the median growth rate suggests
that sustained periods of above-median growth have exerted cumulative
upward pressure on overall price levels. This relationship highlights a
distribution with notable extremes on the higher end, reflecting
positive skewness. This positive skewness implies that while more than
half of the observed years experienced returns above the mean, downturns
can be severe. However, the market has historically provided substantial
upside potential. Additionally, the fact that 66.67% of the years
exceeded the inflation target reinforces the QQQ’s effectiveness as a
long-term hedge against inflation.
The standard deviation of 29.71% indicates extreme volatility,
reflecting substantial fluctuations in equity markets. The notable range
of annual returns, spanning from -41.94% to 53.87%, highlights notable
market variability, partly due to its composition, reflecting both
opportunities and risks.
For the QQQ to be considered a high-performing and resilient
long-term investment, it would be ideal to exceed the aggressive target
(e.g., 10% annualized returns, accounting for higher inflation-adjusted
performance expectations) in at least 40%-50% of the years. This range
reflects the potential for strong upside in many years while balancing
the understanding that markets do experience downturns. The fact that
50% of the years exceeded the aggressive target suggests that while not
consistent, the QQQ has historically provided robust growth over the
long term, making it a viable investment for those with a higher risk
tolerance.
Graph


QQQ CAGR
Data
Due to QQQ’s inception in March 1999, there is insufficient data to
calculate the 30-year CAGRs.
Compound Average Growth Rates (2000-2024)
Date
|
Close
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
2024-12-11
|
529.92
|
29.40%
|
20.05%
|
17.77%
|
13.83%
|
NA
|
2024-01-01
|
409.52
|
53.87%
|
21.58%
|
16.68%
|
12.88%
|
NA
|
2023-01-01
|
266.14
|
-33.07%
|
11.32%
|
15.17%
|
12.72%
|
NA
|
2022-01-01
|
397.64
|
26.81%
|
27.41%
|
21.75%
|
12.35%
|
NA
|
2021-01-01
|
313.58
|
47.57%
|
22.91%
|
19.19%
|
8.79%
|
NA
|
2020-01-01
|
212.50
|
37.83%
|
15.54%
|
16.65%
|
4.33%
|
NA
|
2019-01-01
|
154.18
|
-0.96%
|
11.98%
|
17.94%
|
NA
|
NA
|
2018-01-01
|
155.68
|
31.46%
|
19.15%
|
11.81%
|
NA
|
NA
|
2017-01-01
|
118.42
|
5.92%
|
16.34%
|
10.67%
|
NA
|
NA
|
2016-01-01
|
111.80
|
8.33%
|
15.58%
|
10.76%
|
NA
|
NA
|
2015-01-01
|
103.20
|
17.88%
|
17.78%
|
10.02%
|
NA
|
NA
|
2014-01-01
|
87.55
|
35.05%
|
24.22%
|
9.21%
|
NA
|
NA
|
2013-01-01
|
64.83
|
16.66%
|
4.92%
|
10.33%
|
NA
|
NA
|
2012-01-01
|
55.57
|
2.51%
|
5.28%
|
3.68%
|
NA
|
NA
|
2011-01-01
|
54.21
|
19.04%
|
6.15%
|
-0.69%
|
NA
|
NA
|
2010-01-01
|
45.54
|
53.85%
|
2.77%
|
-6.68%
|
NA
|
NA
|
2009-01-01
|
29.60
|
-41.94%
|
-3.99%
|
NA
|
NA
|
NA
|
2008-01-01
|
50.98
|
18.67%
|
16.01%
|
NA
|
NA
|
NA
|
2007-01-01
|
42.96
|
6.81%
|
2.09%
|
NA
|
NA
|
NA
|
2006-01-01
|
40.22
|
1.23%
|
-7.09%
|
NA
|
NA
|
NA
|
2005-01-01
|
39.73
|
9.48%
|
-15.26%
|
NA
|
NA
|
NA
|
2004-01-01
|
36.29
|
49.59%
|
NA
|
NA
|
NA
|
NA
|
2003-01-01
|
24.26
|
-37.36%
|
NA
|
NA
|
NA
|
NA
|
2002-01-01
|
38.73
|
-33.34%
|
NA
|
NA
|
NA
|
NA
|
2001-01-01
|
58.10
|
-36.12%
|
NA
|
NA
|
NA
|
NA
|
2000-01-01
|
90.95
|
NA
|
NA
|
NA
|
NA
|
NA
|
Summary
Compound Average Growth Rates (2000-2024)
Statistic
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
Overall
|
Count of Observations
|
24
|
20
|
15
|
5
|
NA
|
64
|
Mean
|
10.82%
|
10.73%
|
11.1%
|
10.21%
|
NA
|
10.81%
|
Median
|
13.07%
|
13.76%
|
10.76%
|
12.35%
|
NA
|
11.89%
|
Standard Deviation (Volatility)
|
29.71%
|
11.21%
|
7.66%
|
3.69%
|
NA
|
19.34%
|
Min CAGR Range (CAGR - SD)
|
-23.24%
|
-4.74%
|
-1.19%
|
2.78%
|
NA
|
-12.87%
|
Max CAGR Range (CAGR + SD)
|
36.18%
|
17.68%
|
14.13%
|
10.16%
|
NA
|
25.81%
|
Minimum
|
-41.94%
|
-15.26%
|
-6.68%
|
4.33%
|
NA
|
-41.94%
|
Maximum
|
53.87%
|
27.41%
|
21.75%
|
12.88%
|
NA
|
53.87%
|
Percent Above Inflation Target
|
70.83%
|
85%
|
86.67%
|
100%
|
NA
|
76.56%
|
Percent Above Conservative Target
|
66.67%
|
70%
|
80%
|
80%
|
NA
|
67.19%
|
Percent Above Moderate Target
|
58.33%
|
60%
|
80%
|
80%
|
NA
|
65.62%
|
Percent Above Aggressive Target
|
50%
|
50%
|
40%
|
60%
|
NA
|
43.75%
|
2000-2024 Summary: The 1-Year CAGR exhibits the mean
return at 10.82%, and the greatest volatility with a standard deviation
of 29.71%. As the investment horizon extends to 5, 10, and 20 years, the
mean returns decrease, ranging from 10.73% to 10.21%, while volatility
diminishes, with standard deviations dropping from 11.21% to 3.69%. This
trend indicates that longer investment periods tend to offer more stable
returns. Furthermore, the percentage of periods exceeding the inflation
target increases with longer durations, from 70.83% in the 1-Year CAGR
to 100% in the 20-Year CAGR, underscoring QQQ’s effectiveness as a hedge
against inflation over extended timeframes. With an overall percentage
of 43.75% exceeding the aggressive target (10% annualized returns), QQQ
has, over this time period, demonstrated itself as a viable option for a
high-returning long-term investment.
Graph
All Periods
Compound Average Growth Rates Across Periods


Short-Term
Compound Average Growth Rates Across Short-Term Rolling Periods

Long-Term
Compound Average Growth Rates Across Long-Term Rolling Periods

BLACKROCK
BlackRock, Inc. is an American multinational investment management
corporation headquartered in New York City. Founded in 1988, it has
grown to become the world’s largest asset manager, with approximately
$11.5 trillion in assets under management as of October 2024. BlackRock
offers a diverse range of investment products, including mutual funds,
exchange-traded funds (ETFs) under the iShares brand, and alternative
investments. The firm serves a broad clientele, encompassing
institutional investors, financial professionals, and individual
investors worldwide. BlackRock is also known for its Aladdin platform, a
comprehensive risk management and portfolio management system utilized
both internally and by external clients. The company emphasizes
sustainable investing, integrating environmental, social, and governance
(ESG) factors into its investment processes. With a global presence
spanning over 30 countries, BlackRock plays a significant role in the
global financial system, influencing market trends and investment
practices.
BlackRock GR
Data
The BlackRock iBLD Endura® VC 5.5 ER Index, commonly referred to as
the BlackRock Endura® Index, is designed to provide more consistent
returns compared to traditional stock indices. It aims to reduce losses
during market downturns while capturing gains in rising markets. The
index primarily comprises U.S. equities and employs a daily volatility
control mechanism to mitigate downside risk. This mechanism adjusts
allocations between U.S. equities and short-term U.S. Treasury bonds
based on market volatility. The index’s constituents include iShares®
ETFs, and it tracks the excess return of these selected ETFs over the
return on cash. This structure seeks to balance growth potential with
risk management, making it a strategic option for investors seeking
stable returns across varying market conditions. BlackRock Endura Index
was officially launched on June 14, 2016 and therefore has accumulated
less data over time when compared to the other indexes and ETFs.
Short-term Treasury bonds, often referred to as Treasury notes
(T-notes), and represented by the ETF ticker symbol SHY, are U.S.
government debt securities with maturities typically ranging from 1 to 3
years (rather than the 2 to 10 years characteristic of traditional
T-notes). These securities pay a fixed interest rate every six months
and are considered low-risk investments due to being backed by the full
faith and credit of the U.S. government. Investors often use short-term
Treasury bonds like SHY to achieve stability in their portfolios, earn
modest interest income, and minimize exposure to interest rate
fluctuations, making them an ideal choice in uncertain economic
environments.
The iShares MSCI USA Minimum Volatility Factor ETF (USMV) is an
exchange-traded fund designed to provide exposure to U.S. stocks with
lower volatility compared to the broader market. It tracks the MSCI USA
Minimum Volatility Index, focusing on companies that exhibit stable
price movements, making it a popular choice for risk-averse investors.
USMV typically includes large-cap stocks from defensive sectors like
healthcare, utilities, and consumer staples, aiming to reduce portfolio
risk while maintaining equity market exposure. With a low expense ratio,
it offers a cost-efficient way to achieve steady returns, though it may
underperform in bull markets due to its defensive nature. This ETF is
ideal for investors seeking to weather market fluctuations while
maintaining consistent performance over time.
Data Source: BlackRock iBLD Endura® VC 5.5 ER Index (hereinafter, the
“BlackRock Endura® Index”) at https://www.blackrock.com/us/individual/products/284053/blackrock-ibld-endura-vc5-5-er-index#/
Summary
Annual Growth Rate Summary (2016-2024)
Statistic
|
Value
|
Definition
|
Count of Observations
|
7
|
Total number of data points collected over the specific period.
|
CAGR
|
3.1%
|
Compound Average Growth Rate; mean growth rate over a period if it had
compounded anually.
|
Mean
|
3.82%
|
Reflects the general price level and overall growth rate.
|
Median
|
2.42%
|
Middle value of the data when ordered chronologically; central tendency
measure less affected by extreme values.
|
Standard Deviation (Volatility)
|
8.13%
|
The dispersion of values from the mean, indicating the volatility of
price changes and economic stability.
|
Min CAGR Range (CAGR - SD)
|
-5.03%
|
Lower boundary of expected BlackRock range; lowest estimate of typical
growth rate considering normal fluctuations.
|
Max CAGR Range (CAGR + SD)
|
11.23%
|
Upper boundary of expected BlackRock range; highest estimate of typical
growth rate considering normal fluctuations.
|
Minimum
|
-9.24%
|
Lowest growth rate.
|
Maximum
|
14.99%
|
Highest growth rate.
|
Percent Above Inflation Target
|
42.86%
|
Percentage of values above the inflation target specified in Preferred
Targets section.
|
Percent Above Conservative Target
|
42.86%
|
Percentage of values above the conservative target specified in
Preferred Targets section.
|
Percent Above Moderate Target
|
28.57%
|
Percentage of values above the moderate target specified in Preferred
Targets section.
|
Percent Above Aggressive Target
|
14.29%
|
Percentage of values above the aggressive target specified in Preferred
Targets section.
|
The BlackRock Endura’s Index exhibits a disappointing CAGR at 3.1%,
lower than the mean growth rate of 3.82%, reflecting the impact of
short-term volatility and growth spikes. The median return of 2.42%
indicates that more than half of the observed years experienced returns
below the mean. The relationship between the CAGR and the median growth
rate suggests that sustained periods of above-median growth have exerted
cumulative downward pressure on overall price levels. This relationship
highlights a distribution with notable extremes on the higher end,
reflecting positive skewness. This negative skewness implies that while
more than half of the observed years experienced returns below the mean,
upturns can be significant. However, the market has historically
provided substantial downside risk. Additionally, the fact that 42.86%
of the years exceeded the inflation target undermines the BlackRock
Endura’s effectiveness as a long-term hedge against inflation.
The standard deviation of 8.13% suggests moderate volatility, typical
of relatively stable markets. The comparatively stable range of annual
returns, spanning from -9.24% to 14.99%, indicates a comparatively
stable market, partly due to its composition, with less extreme annual
fluctuations.
For the BlackRock Endura to be considered a high-performing and
resilient long-term investment, it would be ideal to exceed the
aggressive target (e.g., 10% annualized returns, accounting for higher
inflation-adjusted performance expectations) in at least 40%-50% of the
years. This range reflects the potential for strong upside in many years
while balancing the understanding that markets do experience downturns.
The fact that 14.29% of the years exceeded the aggressive target raises
concerns about the BlackRock Endura’s ability to meet aggressive growth
targets, making it less suitable for investors with higher risk
tolerance.
Graph

BlackRock CAGR
Data
Due to BlackRock Endura’s inception in 2016, there is insufficient
data to calculate the 10-year, 20-year and 30-year CAGRs.
Compound Average Growth Rates (2016-2024)
Date
|
Close
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
2024-12-11
|
137.27
|
7.04%
|
1.73%
|
NA
|
NA
|
NA
|
2024-01-01
|
128.24
|
1.59%
|
2.44%
|
NA
|
NA
|
NA
|
2023-01-01
|
126.23
|
-9.24%
|
1.79%
|
NA
|
NA
|
NA
|
2022-01-01
|
139.08
|
7.78%
|
6.72%
|
NA
|
NA
|
NA
|
2021-01-01
|
129.04
|
2.42%
|
NA
|
NA
|
NA
|
NA
|
2020-01-01
|
125.99
|
10.84%
|
NA
|
NA
|
NA
|
NA
|
2019-01-01
|
113.66
|
-1.61%
|
NA
|
NA
|
NA
|
NA
|
2018-01-01
|
115.52
|
14.99%
|
NA
|
NA
|
NA
|
NA
|
2017-01-01
|
100.46
|
NA
|
NA
|
NA
|
NA
|
NA
|
2016-01-01
|
NA
|
NA
|
NA
|
NA
|
NA
|
NA
|
Summary
Compound Average Growth Rates (2016-2024)
Statistic
|
1-Year CAGR
|
5-Year CAGR
|
10-Year CAGR
|
20-Year CAGR
|
30-Year CAGR
|
Overall
|
Count of Observations
|
7
|
3
|
NA
|
NA
|
NA
|
10
|
Mean
|
3.82%
|
3.65%
|
NA
|
NA
|
NA
|
3.77%
|
Median
|
2.42%
|
2.44%
|
NA
|
NA
|
NA
|
2.43%
|
Standard Deviation (Volatility)
|
8.13%
|
2.68%
|
NA
|
NA
|
NA
|
6.76%
|
Min CAGR Range (CAGR - SD)
|
-5.03%
|
0.42%
|
NA
|
NA
|
NA
|
-3.66%
|
Max CAGR Range (CAGR + SD)
|
11.23%
|
5.78%
|
NA
|
NA
|
NA
|
9.86%
|
Minimum
|
-9.24%
|
1.79%
|
NA
|
NA
|
NA
|
-9.24%
|
Maximum
|
14.99%
|
6.72%
|
NA
|
NA
|
NA
|
14.99%
|
Percent Above Inflation Target
|
57.14%
|
66.67%
|
NA
|
NA
|
NA
|
40%
|
Percent Above Conservative Target
|
42.86%
|
33.33%
|
NA
|
NA
|
NA
|
40%
|
Percent Above Moderate Target
|
42.86%
|
0%
|
NA
|
NA
|
NA
|
20%
|
Percent Above Aggressive Target
|
14.29%
|
0%
|
NA
|
NA
|
NA
|
10%
|
2016-2024 Summary: The 1-Year CAGR exhibits the
highest mean return at 3.82%, and the greatest volatility with a
standard deviation of 8.13%. As the investment horizon extends to 5
years, the mean returns decrease, to 3.65%, while volatility diminishes,
with standard deviations at 2.68%. This trend indicates that longer
investment periods tend to offer more stable returns. Furthermore, the
percentage of periods exceeding the inflation target increases with
longer durations, from 57.14% in the 1-Year CAGR to 66.67% in the 5-Year
CAGR, underscoring BlackRock’s effectiveness as a hedge against
inflation over extended timeframes. With an overall percentage of 10%
exceeding the aggressive target (10% annualized returns), BlackRock
appears, over this time period, to be a less suitable option for a
high-returning long-term investment.
Graph
All Periods
Compound Average Growth Rates Across Periods

COMPARISON OF INDEXES
Annual GR
Data
Annual Growth Rates By Index (2017-2024)
Date
|
S&P 500
|
QQQ
|
BlackRock
|
2024
|
21.31%
|
53.87%
|
1.59%
|
2023
|
-13.41%
|
-33.07%
|
-9.24%
|
2022
|
20.56%
|
26.81%
|
7.78%
|
2021
|
15.73%
|
47.57%
|
2.42%
|
2020
|
25.73%
|
37.83%
|
10.84%
|
2019
|
-6.54%
|
-0.96%
|
-1.61%
|
2018
|
22.62%
|
31.46%
|
14.99%
|
2017
|
18.58%
|
5.92%
|
NA%
|
Data begins with 2017, determined by the index with the least
historical data for consistent comparison across all indexes.
Summary
Annual Growth Rates Summary By Index (2017-2024)
Metric
|
S&P 500
|
QQQ
|
BlackRock
|
CAGR
|
12.16%
|
17.62%
|
3.10%
|
Mean
|
13.07%
|
21.18%
|
3.82%
|
Median
|
19.57%
|
29.13%
|
2.42%
|
Standard Deviation (Volatility)
|
14.63%
|
28.90%
|
8.13%
|
Min CAGR Range (CAGR - SD)
|
-1.56%
|
-7.72%
|
-4.31%
|
Max CAGR Range (CAGR + SD)
|
27.70%
|
50.08%
|
11.96%
|
Min
|
-13.41%
|
-33.07%
|
-9.24%
|
Max
|
25.73%
|
53.87%
|
14.99%
|
Percent Above Inflation Target
|
75.00%
|
75.00%
|
42.86%
|
Percent Above Conservative Target
|
75.00%
|
62.50%
|
42.86%
|
Percent Above Moderate Target
|
75.00%
|
62.50%
|
28.57%
|
Percent Above Aggressive Target
|
75.00%
|
62.50%
|
14.29%
|
Comparison in Annual Growth Rates of Indexes (S&P 500,
QQQ, and BlackRock) Over 8 Years (2017-2024): The summary
reflects data over a Intermediate-Term Period (5-10 years). The
performance and relative strength between indexes are likely to shift
when measured across different time frames, particularly in response to
major historical events, and particularly for Short-Term and Long-Term
Periods. While a short- or intermediate-term analysis can provide
insights, it may not fully represent performance over extended,
long-term periods. Nevertheless, these statistics can serve as a
benchmark for evaluating future market trends.
Comparative Analysis of Index Performance: QQQ
exhibits the highest mean return at 21.18%, surpassing the S&P 500’s
13.07% and BlackRock’s 3.82%, reflecting its aggressive, tech-focused
composition. Its CAGR of 17.62% significantly outpaces the S&P 500’s
12.16% and BlackRock’s 3.1%, further emphasizing QQQ’s strong growth
potential. While both the S&P 500 and QQQ have consistently
surpassed inflation, conservative, and moderate targets 62.5% of the
time, BlackRock lags significantly, meeting these thresholds only 42.86%
and 62.5% of the time, respectively. Additionally, BlackRock’s
performance in exceeding the aggressive benchmark stands at just 14.29%,
compared to 62.5% for both the S&P 500 and QQQ.
However, QQQ also demonstrates the highest volatility, with a
standard deviation of 28.9%%, compared to 14.63% for the S&P 500 and
8.13% for BlackRock, underscoring its greater risk. The range of
expected returns (CAGR ± SD) is widest for QQQ (-7.72% to 50.08%) and
narrowest for BlackRock (-4.31% to 11.96%), emphasizing BlackRock’s
stability but significantly lower growth potential. Median returns
further highlight QQQ’s dominance (29.13%) over the S&P 500 (19.57%)
and BlackRock (2.42%). BlackRock, though less volatile, lags in
performance with the lowest maximum return. Both S&P 500 and QQQ
have near- or at-equal percentage of years above each target, (14.99%)
and the highest percentage of years below inflation and conservative
targets. This comparison underscores QQQ’s appeal for growth-oriented
investors seeking higher returns despite increased risk.
Long-Term Investment Viability: For any of these
Indexes to be considered a high-performing and resilient long-term
investment, it would be ideal to exceed the aggressive target (e.g., 10%
annualized returns, accounting for higher inflation-adjusted performance
expectations) in at least 40%-50% of the years. This range reflects the
potential for strong upside in many years while balancing the
understanding that markets do experience downturns.
S&P 500: 75% of the years exceeded the aggressive target
indicating consistent and robust growth, making it a strong option for
those seeking aggressive investments.
QQQ: 62.5% of the years exceeded the aggressive target indicating
consistent and robust growth, making it a strong option for those
seeking aggressive investments.
BlackRock: 14.29% of the years exceeded the aggressive target
raising concerns about its ability to meet aggressive growth targets,
making it less suitable for investors with higher risk
tolerance.
Graph
Annual Growth Rates By Index

There are years when QQQ’s annual growth rate underperformed the
other indexes, particularly during declines such as in 2023, but those
years are overshadowed by its overall strength. In hindsight, periods
when strong, volatile indexes have performed the worst may actually
represent the best opportunities to invest.
Cumulative Growth
Data
Cumulative Growth (2017-2024)
Date
|
S&P 500
|
QQQ
|
BlackRock
|
2024
|
250.41
|
366.31
|
127.64
|
2023
|
206.42
|
238.07
|
125.64
|
2022
|
238.39
|
355.69
|
138.43
|
2021
|
197.73
|
280.49
|
128.44
|
2020
|
170.86
|
190.08
|
125.40
|
2019
|
135.89
|
137.91
|
113.14
|
2018
|
145.40
|
139.24
|
114.99
|
2017
|
118.58
|
105.92
|
100.00
|
2016
|
100.00
|
100.00
|
100.00
|
The table and graph below show the impact of the annual growth rates,
comparing the cumulative growth of the S&P 500, QQQ, and BlackRock
indexes over a 8-year period from 2017 to 2024, starting with an initial
value of $100 per 100%.
Graph
Cumulative Growth By Index

QQQ demonstrates the highest cumulative growth, reflecting its
tech-heavy composition and higher risk-reward profile, while the S&P
500 shows steady, moderate growth, consistent with its broader market
representation. In contrast, BlackRock exhibits the most conservative
growth, likely due to its focus on lower-risk strategies or diversified
portfolios. Since 2017, QQQ has maintained dominance on a cumulative
basis. This comparison highlights the varying risk-return dynamics of
the indexes, with QQQ offering aggressive growth potential and BlackRock
catering to stability-focused investors.
SPX VS QQQ
Annual GR
Data
Annual Growth Rates By Index (2001-2024)
Date
|
S&P 500
|
QQQ
|
2024
|
21.31%
|
53.87%
|
2023
|
-13.41%
|
-33.07%
|
2022
|
20.56%
|
26.81%
|
2021
|
15.73%
|
47.57%
|
2020
|
25.73%
|
37.83%
|
2019
|
-6.54%
|
-0.96%
|
2018
|
22.62%
|
31.46%
|
2017
|
18.58%
|
5.92%
|
2016
|
-5.40%
|
8.33%
|
2015
|
11.29%
|
17.88%
|
2014
|
23.10%
|
35.05%
|
2013
|
13.83%
|
16.66%
|
2012
|
1.40%
|
2.51%
|
2011
|
14.15%
|
19.04%
|
2010
|
29.81%
|
53.85%
|
2009
|
-37.22%
|
-41.94%
|
2008
|
-3.19%
|
18.67%
|
2007
|
11.37%
|
6.81%
|
2006
|
8.24%
|
1.23%
|
2005
|
4.32%
|
9.48%
|
2004
|
26.42%
|
49.59%
|
2003
|
-21.43%
|
-37.36%
|
2002
|
-14.63%
|
-33.34%
|
2001
|
-6.31%
|
-36.12%
|
Data begins with 2001, determined by the index with the least
historical data for consistent comparison across all indexes.
Summary
Annual Growth Rates Summary By Index (2001-2024)
Metric
|
S&P 500
|
QQQ
|
CAGR
|
5.19%
|
6.47%
|
Mean
|
6.68%
|
10.82%
|
Median
|
11.33%
|
13.07%
|
Standard Deviation (Volatility)
|
17.18%
|
29.71%
|
Min CAGR Range (CAGR - SD)
|
-10.50%
|
-18.89%
|
Max CAGR Range (CAGR + SD)
|
23.86%
|
40.53%
|
Min
|
-37.22%
|
-41.94%
|
Max
|
29.81%
|
53.87%
|
Percent Above Inflation Target
|
62.50%
|
66.67%
|
Percent Above Conservative Target
|
58.33%
|
62.50%
|
Percent Above Moderate Target
|
58.33%
|
58.33%
|
Percent Above Aggressive Target
|
45.83%
|
50.00%
|
Comparison in Annual Growth Rates of Indexes (S&P 500 and
QQQ) Over 24 Years (2001-2024): QQQ exhibits the highest mean
return at 10.82%, surpassing the S&P 500’s 6.68%, reflecting its
aggressive, tech-focused composition. Its CAGR of 6.47% significantly
outpaces the S&P 500’s 5.19%, further emphasizing QQQ’s strong
growth potential. However, QQQ also demonstrates the highest volatility
with a standard deviation of 29.71%, compared to 17.18% for the S&P
500, underscoring greater risk. The range of expected returns (Mean ±
SD) is widest for QQQ (-18.89% to 40.53%). Median returns further
showcase QQQ’s dominance (13.07%) over the S&P 500 (11.33%). S&P
500, though less volatile, lags in performance with the lowest maximum
return (29.81%) and the highest percentage of years below inflation and
conservative targets, meeting the aggressive benchmark only 45.83% of
the time compared to 50% for the QQQ. This comparison underscores QQQ’s
appeal for growth-oriented investors despite higher risk, while S&P
500 suits those prioritizing stability.
Graph
AGR
Annual Growth Rates By Index

Cumulative Growth
Data
Cumulative Growth Rates (2001-2024)
Date
|
S&P 500
|
QQQ
|
2024
|
337.03
|
450.27
|
2023
|
277.83
|
292.63
|
2022
|
320.85
|
437.22
|
2021
|
266.14
|
344.78
|
2020
|
229.96
|
233.64
|
2019
|
182.90
|
169.51
|
2018
|
195.70
|
171.16
|
2017
|
159.60
|
130.20
|
2016
|
134.59
|
122.92
|
2015
|
142.28
|
113.47
|
2014
|
127.84
|
96.26
|
2013
|
103.85
|
71.27
|
2012
|
91.23
|
61.10
|
2011
|
89.97
|
59.60
|
2010
|
78.82
|
50.07
|
2009
|
60.72
|
32.54
|
2008
|
96.72
|
56.05
|
2007
|
99.91
|
47.23
|
2006
|
89.71
|
44.22
|
2005
|
82.88
|
43.68
|
2004
|
79.45
|
39.90
|
2003
|
62.84
|
26.67
|
2002
|
79.98
|
42.58
|
2001
|
93.69
|
63.88
|
2000
|
100.00
|
100.00
|
The table and graph below show the impact of the annual growth rates,
comparing the cumulative growth of the S&P 500 and QQQ indexes over
a 24-year period from 2001 to 2024, starting with an initial value of
$100 per 100%.
Graph
Cumulative Growth By Index

This graph depicts the cumulative growth of the S&P 500 (SPX) and
QQQ over a 24-year period (2000 – 2024). Initially, QQQ underperformed
on a cumulative basis, particularly during the dot-com bubble burst in
the early 2000s and the 2008 financial crisis, which significantly
impacted its tech-heavy composition. Despite these setbacks, as time
progressed, QQQ outperformed the S&P 500, reflecting its strong
recovery and dominance during the tech boom of the 2010s and beyond.
This graph exemplifies how timing impacts performance, highlighting the
importance of analyzing growth over short-term, intermediate, and
long-term periods to understand the varying risk-return dynamics and the
influence of major economic events.
LS0tDQp0aXRsZTogIk1hcmtldCBJbmRleGVzOiBDb21wYXJpbmcgUmF0ZXMiDQpzdWJ0aXRsZTogIkNvbXBhcmlzb24gb2YgUGVyZm9ybWFuY2UgUmF0ZXMgYmV0d2VlbiBJbmRleGVzIg0KYXV0aG9yOiAiQXV0aG9yOiBLZW5kcmljayBUaGFtIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogeWVzICAjIFRoaXMgbWFrZXMgdGhlIHN1Yi1zZWN0aW9ucyBhcHBlYXIgb25seSB3aGVuIHRoZSBwcmltYXJ5IHNlY3Rpb24gaXMgZXhwYW5kZWQNCiAgICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgICAgcGxhY2VtZW50OiB0b3ANCiAgICAgIHRvY19zdWJ0cmVlOiB5ZXMgICMgRW5zdXJlcyB0aGF0IHN1Yi1zZWN0aW9ucyBhcmUgaGlkZGVuIHVudGlsIHRoZSBwcmltYXJ5IHNlY3Rpb24gaXMgY2xpY2tlZA0KICAgICAgIyBudW1iZXJfc2VjdGlvbnM6IHRydWUgICMgVGhpcyBlbmFibGVzIG51bWJlcmVkIHNlY3Rpb25zICMgRklHVVJFIE9VVCBBIE1PUkUgQVBQRUFMSU5HIE9VVFBVVA0KICAgIGZpZ19jYXB0aW9uOiB0cnVlDQogICAgIyBjb2RlX2ZvbGRpbmc6IGhpZGUgICAjIEhpZGUgdGhlIGNvZGUgYnkgZGVmYXVsdA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUgICMgQWRkIGEgYnV0dG9uIHRvIGRvd25sb2FkIHRoZSBSIGNvZGUNCiAgICAjIGRldjogIkNhaXJvUE5HIiAgIyBTd2l0Y2ggdG8gdGhlIENhaXJvIGdyYXBoaWNzIGRldmljZSBmb3IgUE5HIG91dHB1dDsgYXZvaWRzIHBuZygpIGVycm9yOyBlbnN1cmUgdG8gaW5zdGFsbC5wYWNrYWdlcygiQ2Fpcm8iKQ0KICAgIGRldjogInBuZyINCiAgICBmaWdfcGF0aDogImZpZ3VyZS8iICAjIERpcmVjdG9yeSBmb3IgZmlndXJlcyAjV09SSyBJTiBQUk9HUkVTU2hlYWRlci1pbmNsdWRlczoNCiAgICBjc3M6IGN1c3RvbS5jc3MgICMgRGVmaW5lIGEgY3VzdG9tIENTUyBmaWxlDQogICAgIyBydW50aW1lOiBzaGlueQ0KLS0tDQoNCmBgYHs9aHRtbH0NCjwhLS0gDQpTdGFydCBEYXRlOiAyMDI0LTExLTA4DQotLT4NCmBgYA0KDQpQdWJsaXNoZWQ6IGByIFN5cy5EYXRlKClgDQoNCjwhLS0gIyBSTUQgSFRNTCBDU1MgU0VUVVAgLS0+DQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCg0KLyogQXZvaWQgcGFnZSBicmVha3MgaW5zaWRlIGNvZGUgY2h1bmtzIGluIEhUTUwgb3V0cHV0ICovDQpwcmUgew0KICBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7DQp9DQoNCi5rYWJsZV90YWJsZSB7DQogIHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDsNCn0NCg0KLyogUmVkdWNlIHRoZSBmb250IHNpemUgb2YgdGhlIFRPQyAqLw0Kew0KICBmb250LXNpemU6IDAuOTBlbTsgLyogQWRqdXN0IHRoZSBzaXplIGFzIG5lZWRlZCAqLw0KfQ0KDQovKiBBZGQgYm9yZGVycyBhbmQgc3BhY2luZyB0byBhbGwgZmlndXJlcyAqLw0KaW1nIHsNCiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgLyogU3BlY2lmeSBib3JkZXIgc3R5bGUgKi8NCiAgcGFkZGluZzogNXB4OyAvKiBBZGQgcGFkZGluZyBhcm91bmQgdGhlIGZpZ3VyZXMgKi8NCiAgYm9yZGVyLXJhZGl1czogNXB4OyAvKiBBZGQgcm91bmRlZCBjb3JuZXJzIHRvIHRoZSBib3JkZXIgKi8NCiAgZGlzcGxheTogYmxvY2s7IC8qIEVuc3VyZSB0aGUgaW1hZ2UgaXMgdHJlYXRlZCBhcyBhIGJsb2NrIGVsZW1lbnQgdG8gcmVzcGVjdCBtYXJnaW4gKi8NCiAgbWFyZ2luLWJvdHRvbTogMjBweDsgLyogQWRkIGJvdHRvbSBtYXJnaW4gdG8gZWFjaCBpbWFnZSBmb3Igc3BhY2luZyAqLw0KfQ0KDQovKiBBZGQgYm9yZGVycyB0byBhbGwgdGFibGVzICovDQp0YWJsZSB7DQogIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IC8qIENvbGxhcHNlIGJvcmRlcnMgaW50byBhIHNpbmdsZSBib3JkZXIgKi8NCiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgLyogU3BlY2lmeSBib3JkZXIgc3R5bGUgKi8NCiAgbWFyZ2luLWJvdHRvbTogMjBweDsgLyogQWRkIGJvdHRvbSBtYXJnaW4gdG8gZWFjaCB0YWJsZSBmb3Igc3BhY2luZyAqLw0KfQ0KDQovKiBBZGQgYm9yZGVycyB0byB0YWJsZSBjZWxscyAqLw0KdGgsIHRkIHsNCiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgLyogU3BlY2lmeSBib3JkZXIgc3R5bGUgZm9yIHRhYmxlIGNlbGxzICovDQogIHBhZGRpbmc6IDhweDsgLyogQWRkIHBhZGRpbmcgaW5zaWRlIHRoZSB0YWJsZSBjZWxscyAqLw0KICB0ZXh0LWFsaWduOiBsZWZ0OyAvKiBBbGlnbiB0ZXh0IHRvIHRoZSBsZWZ0IHdpdGhpbiB0YWJsZSBjZWxscyAqLw0KfQ0KDQoNCi8qIEVuc3VyaW5nIGFsbCBjb2x1bW4gaGVhZGVycyBhcmUgYWxpZ25lZCB0byB0aGUgbGVmdCAqLw0KdGFibGUua2FibGUtdGFibGUgdGgsIHRhYmxlLmthYmxlLXRhYmxlIHRkIHsNCiAgIHRleHQtYWxpZ246IGxlZnQgIWltcG9ydGFudDsNCn0NCg0KDQovKiBBcHBseSBzdHlsZXMgdG8gYWxsIGhlYWRlcnMgKi8NCnRoIHsNCiAgcG9zaXRpb246IHN0aWNreTsgLyogRW5zdXJlIGhlYWRlcnMgc3RpY2sgd2hlbiBzY3JvbGxpbmcgKi8NCiAgdG9wOiAwOyAvKiBQb3NpdGlvbiBoZWFkZXJzIGF0IHRoZSB0b3AgKi8NCiAgYmFja2dyb3VuZC1jb2xvcjogI2YyZjJmMjsgLyogQmFja2dyb3VuZCBjb2xvciBmb3IgaGVhZGVycyAqLw0KICB6LWluZGV4OiA5OTk7IC8qIEVuc3VyZSBoZWFkZXJzIHN0YXkgb24gdG9wIG9mIG90aGVyIGVsZW1lbnRzICovDQp9DQoNCi8qIEFwcGx5IHN0eWxlcyB0byBhbGwgdGFibGVzICovDQp0YWJsZSB7DQogIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IC8qIENvbGxhcHNlIGJvcmRlcnMgaW50byBhIHNpbmdsZSBib3JkZXIgKi8NCiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgLyogU3BlY2lmeSBib3JkZXIgc3R5bGUgKi8NCn0NCg0KLyogQXBwbHkgc3R5bGVzIHRvIHRhYmxlIGNlbGxzICovDQp0aCwgdGQgew0KICBib3JkZXI6IDFweCBzb2xpZCAjZGRkOyAvKiBTcGVjaWZ5IGJvcmRlciBzdHlsZSBmb3IgdGFibGUgY2VsbHMgKi8NCiAgcGFkZGluZzogOHB4OyAvKiBBZGQgcGFkZGluZyBpbnNpZGUgdGhlIHRhYmxlIGNlbGxzICovDQogIHRleHQtYWxpZ246IGxlZnQ7IC8qIEFsaWduIHRleHQgdG8gdGhlIGxlZnQgd2l0aGluIHRhYmxlIGNlbGxzICovDQp9DQoNCi8qIFN0eWxlIHRhYmxlcyB3aXRoIGFsdGVybmF0aW5nIHN0cmlwZWQgcm93cyAqLw0KdGFibGUgew0KICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOw0KICB3aWR0aDogMTAwJTsNCn0NCg0KdGgsIHRkIHsNCiAgYm9yZGVyOiAxcHggc29saWQgI2RkZGRkZDsNCiAgdGV4dC1hbGlnbjogbGVmdDsNCiAgcGFkZGluZzogOHB4Ow0KfQ0KDQovKiBBZGQgYWx0ZXJuYXRpbmcgYmFja2dyb3VuZCBjb2xvcnMgdG8gdGFibGUgcm93cyAqLw0KdHI6bnRoLWNoaWxkKGV2ZW4pIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2YyZjJmMjsNCn0NCg0KdHI6bnRoLWNoaWxkKG9kZCkgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyAvKiBXaGl0ZSBiYWNrZ3JvdW5kIGZvciBvZGQgcm93cyAqLw0KfQ0KDQovKiBjdXN0b20tc3R5bGVzLmNzcyAqLw0KYmxvY2txdW90ZSB7DQogIGZvbnQtc2l6ZTogMWVtOyAgLyogU2V0IHRoZSBmb250IHNpemUgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHJlZ3VsYXIgdGV4dCAqLw0KICBtYXJnaW46IDA7ICAgICAgLyogQWRqdXN0IG1hcmdpbnMgdG8gYWxpZ24gd2l0aCB0aGUgcmVndWxhciB0ZXh0ICovDQogIHBhZGRpbmctbGVmdDogMWVtOyAgLyogQWRkIHNvbWUgcGFkZGluZyBmb3IgaW5kZW50YXRpb24gKi8NCiAgYm9yZGVyLWxlZnQ6IDAuMjVlbSBzb2xpZCAjY2NjOyAgLyogT3B0aW9uYWw6IGFkZCBhIGxlZnQgYm9yZGVyIGZvciBibG9ja3F1b3RlICovDQogIGNvbG9yOiBpbmhlcml0OyAgLyogSW5oZXJpdCBjb2xvciBmcm9tIHRoZSBzdXJyb3VuZGluZyB0ZXh0ICovDQp9DQoNCjwvc3R5bGU+DQpgYGANCg0KPCEtLSANCiMgVEFCTEUgT0YgQ09OVEVOVFMNCg0KLSBUaGUgVGFibGUgb2YgQ29udGVudHMgaXMgYXZhaWxhYmxlIGluIHRoZSBsZWZ0IG1lbnUgZm9yIGVhc3kgbmF2aWdhdGlvbi4NCi0gVGhlIGZ1bGwgUk1EIGZpbGUgY29kZSBpcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGluIHRoZSB0b3AtcmlnaHQgY29ybmVyLg0KLSBBIHNpZ25pZmljYW50IGFtb3VudCBvZiB0aW1lIGlzIG9mdGVuIHNwZW50IGNyZWF0aW5nIHRoZSBzdHJ1Y3R1cmUgYW5kIGFlc3RoZXRpY3Mgb2YgYSByZXBvcnQuIEkgY2FuIGF0dGVzdCB0byB0aGUgcmVjb21tZW5kYXRpb24gb2Ygc2VwYXJhdGluZyB0YXNrczogdXNpbmcgUiBmb3IgZGF0YSBhbmFseXNpcyAoRVRMLCBFREEsIGFuZCBzdGF0aXN0aWNhbCBtb2RlbGluZykgYW5kIGxldmVyYWdpbmcgdmlzdWFsaXphdGlvbiBwcm9ncmFtcyBsaWtlIFRhYmxlYXUgb3IgUG93ZXIgQkkgZm9yIGludGVyYWN0aXZlIGludGVyZmFjZXMgYW5kIHN0b3J5dGVsbGluZy4NCg0KIyMgQ2h1bmsgT3B0aW9ucyBTZXR0aW5ncw0KDQpUaGlzIHNlY3Rpb24gZGVmaW5lcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYWxsIGNvZGUgY2h1bmtzIGluIHRoZSBkb2N1bWVudCB1c2luZyBrbml0cjo6b3B0c19jaHVua1wkc2V0KCkuIEl0IGNvbnRyb2xzIHdoZXRoZXIgY29kZSBpcyBzaG93biAoZWNobyksIGV2YWx1YXRlZCAoZXZhbCksIHdoZXRoZXIgd2FybmluZ3MgYW5kIG1lc3NhZ2VzIGFyZSBzdXBwcmVzc2VkICh3YXJuaW5nLCBtZXNzYWdlKSwgYW5kIHdoZXRoZXIgcmVzdWx0cyBhcmUgc2hvd24gKHJlc3VsdHMpLiBJdCBhbHNvIGNoZWNrcyBpZiByZXF1aXJlZCBSIGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkIGFuZCBpbnN0YWxscyBhbnkgbWlzc2luZyBvbmVzLCBlbnN1cmluZyB0aGF0IGFsbCBuZWNlc3NhcnkgcGFja2FnZXMgYXJlIGxvYWRlZC4NCg0KT3B0aW9ucyBzdWNoIGFzIGVjaG8sIG1lc3NhZ2UsIHdhcm5pbmcsIHJlc3VsdHMsIGluY2x1ZGUsIGV2YWwsIGNhY2hlLCBhbmQgbW9yZS4gDQoNCi0gZWNobzogU2hvdyBvciBoaWRlIGNvZGUgaW4gdGhlIG91dHB1dCAoZWNobyA9IEZBTFNFIGhpZGVzIHRoZSBjb2RlKS4NCi0gbWVzc2FnZTogU2hvdyBvciBoaWRlIG1lc3NhZ2VzIGluIHRoZSBvdXRwdXQgKG1lc3NhZ2UgPSBGQUxTRSBzdXBwcmVzc2VzIG1lc3NhZ2VzKS4NCi0gd2FybmluZzogU2hvdyBvciBoaWRlIHdhcm5pbmdzIGluIHRoZSBvdXRwdXQgKHdhcm5pbmcgPSBGQUxTRSBzdXBwcmVzc2VzIHdhcm5pbmdzKS4NCi0gcmVzdWx0czogQ29udHJvbCBob3cgcmVzdWx0cyBhcmUgc2hvd246DQogIC0gJ21hcmt1cCc6IERpc3BsYXkgcmVzdWx0cyBhcyB0aGV5IGFyZS4NCiAgLSAnYXNpcyc6IEluY2x1ZGUgcmVzdWx0cyBhcyByYXcgSFRNTCBvciBMYVRlWC4NCiAgLSAnaGlkZSc6IEhpZGUgcmVzdWx0cyBmcm9tIG91dHB1dC4NCi0gaW5jbHVkZTogSW5jbHVkZSBvciBleGNsdWRlIGJvdGggY29kZSBhbmQgcmVzdWx0cyBmcm9tIHRoZSBvdXRwdXQgKGluY2x1ZGUgPSBGQUxTRSBleGNsdWRlcyBldmVyeXRoaW5nKS4NCi0gZXZhbDogRXZhbHVhdGUgdGhlIGNvZGUgY2h1bmsgb3Igbm90IChldmFsID0gRkFMU0UgcHJldmVudHMgY29kZSBleGVjdXRpb24pLg0KLSBjYWNoZTogQ2FjaGUgdGhlIHJlc3VsdHMgb2YgdGhlIGNodW5rIHRvIHNwZWVkIHVwIHJlbmRlcmluZyAoY2FjaGUgPSBUUlVFIGVuYWJsZXMgY2FjaGluZykuDQotIGZpZy5jYXA6IEFkZCBhIGNhcHRpb24gdG8gZ3JhcGhpY2FsIG91dHB1dHMuDQotIG91dC53aWR0aC9vdXQuaGVpZ2h0OiBTZXQgdGhlIG91dHB1dCBzaXplIG9mIHBsb3RzLg0KLSBjb2xsYXBzZTogQ29uY2F0ZW5hdGUgdGV4dHVhbCBvdXRwdXQgaW50byBhIHNpbmdsZSBibG9jay4NCi0gdGlkeTogVGlkeSB1cCB0aGUgZGlzcGxheSBvZiBjb2RlIG9yIHJlc3VsdHMgKHRpZHkgPSBUUlVFIHRpZGllcyB0aGUgb3V0cHV0KS4NCg0KLS0+DQoNCmBgYHtyIHNldHVwX29wdGlvbnMsIGluY2x1ZGU9RkFMU0UsIGVjaG89RkFMU0V9DQoNCiMgRW5zdXJlIHRoYXQgYW55IGZpbGUgcGF0aHMgYXJlIGNvcnJlY3RseSBzZXQgcmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyZWN0b3J5LiBUbyBhdm9pZCBzdWNoIGlzc3Vlcywgc2V0IHRoZSByb290IGRpcmVjdG9yeSBleHBsaWNpdGx5IGF0IHRoZSBzdGFydCBvZiB5b3VyIGRvY3VtZW50Og0Ka25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSBnZXR3ZCgpKQ0KDQojIyBERUZBVUxUIENIVU5LIE9QVElPTlMNCg0KIyBTZXQgcmVwb3NpdG9yeSBhbmQgZGVmYXVsdCBjaHVuayBvcHRpb25zDQpvcHRpb25zKHJlcG9zID0gYyhDUkFOID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgcmVzdWx0cz0nYXNpcycsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UpDQoNCg0KIyBSIFBBQ0tBR0VTIEFORCBMSUJSQVJJRVMgDQoNCiMgTGlzdCBvZiByZXF1aXJlZCBsaWJyYXJpZXMgKG1heSBiZSBtaXNzaW5nIHNvbWUpDQpyZXF1aXJlZF9saWJyYXJpZXMgPC0gYygiZ2dwbG90MiIsICJzdHJpbmdyIiwgInJlYWR4bCIsICJkcGx5ciIsICJsdWJyaWRhdGUiLCAiaG1zIiwgIm9wZW54bHN4IiwgIndyaXRleGwiLCAicm1hcmtkb3duIiwgImtuaXRyIiwgImthYmxlRXh0cmEiLCAiZ2duZXdzY2FsZSIsICJncmlkRXh0cmEiLCAidGlkeXIiLCAic2NhbGVzIiwgImdnYnJlYWsiLCAiZTEwNzEiLCAiZ2dyZXBlbCIsICJyZXNoYXBlMiIpDQoNCiMgZ2dwbG90MiAgICAgZm9yICdkZWNsYXJhdGl2ZWx5JyBjcmVhdGluZyBncmFwaGljcywgYmFzZWQgb24gIlRoZSBHcmFtbWFyIG9mIEdyYXBoaWNzIi4gDQojIHN0cmluZ3IgICAgIGZvciB3b3JraW5nIHdpdGggc3RyaW5ncywgaS5lLiwgY2hhcmFjdGVyIGRhdGEuDQojIHJlYWR4bCAgICAgIGZvciByZWFkaW5nIEV4Y2VsIGZpbGVzIGJ5IHByb3ZpZGluZyBhIHdheSB0byByZWFkIHhscyBhbmQgeGxzeCBmaWxlcyBpbnRvIFIgd2l0aG91dCBkZXBlbmRlbmNpZXMgb24gZXh0ZXJuYWwgc29mdHdhcmUuDQojIGRwbHlyICAgICAgIGZvciBkYXRhIG1hbmlwdWxhdGlvbiwgcHJvdmlkaW5nIGEgY29uc2lzdGVudCBzZXQgb2YgdmVyYnMgdGhhdCBoZWxwIHlvdSBzb2x2ZSB0aGUgbW9zdCBjb21tb24gZGF0YSBtYW5pcHVsYXRpb24gY2hhbGxlbmdlcy4NCiMgbHVicmlkYXRlICAgZm9yIHdvcmtpbmcgd2l0aCBkYXRlcyBhbmQgdGltZXMgaW4gUi4NCiMgaG1zICAgICAgICAgZm9yIHN0b3JpbmcgdGltZS1vZi1kYXkgdmFsdWVzIGFuZCBpbnRlcmZhY2luZyB0aGVzZSB2YWx1ZXMgd2l0aCBiYXNlIFIncyBkYXRlLXRpbWUgY2xhc3Nlcy4NCiMgb3Blbnhsc3ggICAgZm9yIHJlYWRpbmcgZnJvbSBhbmQgd3JpdGluZyB0byBNaWNyb3NvZnQgRXhjZWwgLnhsc3ggZmlsZXMuIEl0IHByb3ZpZGVzIG1vcmUgZnVuY3Rpb25hbGl0eSB0aGFuIGp1c3QgaGFuZGxpbmcgZGF0YTsgaXQgYWxzbyBhbGxvd3MgeW91IHRvIG1vZGlmeSB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIEV4Y2VsIGZpbGUgaXRzZWxmLg0KIyB3cml0ZXhsICAgICBmb3IgYSBmYXN0IGFuZCBwb3J0YWJsZSB3YXkgdG8gd3JpdGUgZGF0YSBmcmFtZXMgdG8gRXhjZWwgLnhsc3ggZmlsZXMsIGZvY3VzaW5nIHNvbGVseSBvbiB3cml0aW5nIGRhdGEgd2l0aG91dCBhbnkgZGVwZW5kZW5jaWVzLg0KIyBybWFya2Rvd24gICBmb3IgZHluYW1pYyByZXBvcnQgZ2VuZXJhdGlvbiBmcm9tIFIuIEl0IGludGVncmF0ZXMgdGhlIGNvcmUgc3ludGF4IG9mIG1hcmtkb3duIChhIHNpbXBsZSBtYXJrdXAgbGFuZ3VhZ2UpIHdpdGggUiBjb2RlLCBhbGxvd2luZyBmb3IgdGhlIGF1dG9tYXRpYyB1cGRhdGUgb2YgcmVwb3J0cyB0byByZWZsZWN0IGRhdGEgY2hhbmdlcyBhbmQgYW5hbHlzaXMgdXBkYXRlcy4NCiMga25pdHIgICAgICAgZm9yIHVzaW5nIGZ1bmN0aW9ucyBzdWNoIGFzIGthYmxlKCkgdG8gZm9ybWF0IGRhdGFmcmFtZXMgYXMgbWFya2Rvd24gdGFibGVzLiANCiMga2FibGVFeHRyYSAgZm9yIGVuaGFuY2VkIGZ1bmN0aW9uYWxpdHkgZm9yIHN0eWxpbmcgdGFibGVzIHN1Y2ggYXMgZGlzcGxheWluZyBjb2x1bW5zIGV2ZW5seQ0KIyBnZ25ld3NjYWxlICBmb3IgY3JlYXRpbmcgbmV3IGNvbG9yIHBhbGV0dGVzIGFuZCBtb3JlDQojIGdyaWRFeHRyYQ0KIyBDYWlybyAgICAgICBmb3Igc3dpdGNoaW5nIHRvIHRoZSBDYWlybyBncmFwaGljcyBkZXZpY2UgZm9yIFBORyBvdXRwdXQ7IGF2b2lkcyBwbmcoKSBlcnJvcg0KIyB0aWR5cg0KIyBzY2FsZXMNCiMgZ2dicmVhayAgDQojIGUxMDcxICAgICAgIGZvciBza2V3bmVzcyBhbmQga3VydG9zaXMNCiMgZ2dyZXBlbCAgICAgZm9yIHZpc3VhbGl6YXRpb24sIGluY2x1ZGVzIGdlb21fdGV4dF9yZXBlbCgpIHdoaWNoIG1pbmltaXplcyBvdmVybGFwcGluZyB0ZXh0IGxhYmVscw0KIyByZXNoYXBlMiAgICBmb3IgZm9ybWF0dGluZyBpbnRvIGxvbmcgZm9ybWF0IHN1Y2ggYXMgcmVzaGFwZTI6Om1lbHQNCg0KDQojIENoZWNrIHdoaWNoIGxpYnJhcmllcyBhcmUgbm90IGluc3RhbGxlZA0KaW5zdGFsbGVkX2xpYnMgPC0gcm93bmFtZXMoaW5zdGFsbGVkLnBhY2thZ2VzKCkpDQpsaWJyYXJpZXNfdG9faW5zdGFsbCA8LSByZXF1aXJlZF9saWJyYXJpZXNbIXJlcXVpcmVkX2xpYnJhcmllcyAlaW4lIGluc3RhbGxlZF9saWJzXQ0KDQojIEluc3RhbGwgbWlzc2luZyBsaWJyYXJpZXMNCmlmKGxlbmd0aChsaWJyYXJpZXNfdG9faW5zdGFsbCkgPiAwKSB7DQogIGluc3RhbGwucGFja2FnZXMobGlicmFyaWVzX3RvX2luc3RhbGwpDQp9DQoNCiMgTG9hZCBhbGwgcmVxdWlyZWQgbGlicmFyaWVzDQpsYXBwbHkocmVxdWlyZWRfbGlicmFyaWVzLCBsaWJyYXJ5LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpDQoNCmlmICghZGlyLmV4aXN0cygiZmlndXJlLyIpKSB7DQogIGRpci5jcmVhdGUoImZpZ3VyZS8iKQ0KfQ0KDQpgYGANCg0KPCEtLQ0KIyMgSW50ZXJhY3RpdmUoKSBGdW5jdGlvbg0KDQpUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHJlYWwtdGltZSBmZWVkYmFjayBkdXJpbmcgdGhlIFIgTWFya2Rvd24gcHJvY2VzcywgdHlwaWNhbGx5IHVzaW5nIHByaW50KCkgb3IgY2F0KCkgdG8gZGlzcGxheSBrZXkgaW5mb3JtYXRpb24gbGlrZSBjb2x1bW4gbmFtZXMgb3IgZGF0YSBzdHJ1Y3R1cmUgYXMgdGhlIGRvY3VtZW50IHJlbmRlcnMuIFRoaXMgaGVscHMgdXNlcnMgdmVyaWZ5IHRoZSBpbnRlcm1lZGlhdGUgc3RlcHMgaW4gZGF0YSBhbmFseXNpcyBvciBmb3JtYXR0aW5nIHdoaWxlIHJ1bm5pbmcgdGhlIHJlcG9ydCwgYWlkaW5nIGRlYnVnZ2luZyBhbmQgZXhwbG9yYXRpbyB3aXRob3V0IGFwcGVhcmluZyBpbiB0aGUgZmluYWwgcmVuZGVyZWQgZG9jdW1lbnQuDQotLT4NCg0KYGBge3IgaW50ZXJhY3RpdmUgZnVuY3Rpb25zLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgRGVmaW5lIHRoZSBpbnRlcmFjdGl2ZV9wcmludCBmdW5jdGlvbg0KaW50ZXJhY3RpdmVfcHJpbnQgPC0gZnVuY3Rpb24ob2JqKSB7DQogIGlmIChpbnRlcmFjdGl2ZSgpKSB7DQogICAgcHJpbnQob2JqKQ0KICB9DQogIGludmlzaWJsZShOVUxMKSAgIyBUaGlzIGVuc3VyZXMgdGhlIGZ1bmN0aW9uIGRvZXNuJ3QgcmV0dXJuIGFueXRoaW5nIGluIHRoZSBrbml0IG91dHB1dA0KfQ0KDQojIERlZmluZSB0aGUgaW50ZXJhY3RpdmVfc3RyIGZ1bmN0aW9uDQppbnRlcmFjdGl2ZV9zdHIgPC0gZnVuY3Rpb24ob2JqKSB7DQogIGlmIChpbnRlcmFjdGl2ZSgpKSB7DQogICAgc3RyKG9iaikNCiAgfQ0KICBpbnZpc2libGUoTlVMTCkgICMgRW5zdXJlIHRoZSBmdW5jdGlvbiBkb2Vzbid0IHJldHVybiBhbnl0aGluZyBpbiB0aGUga25pdCBvdXRwdXQNCn0NCg0KIyBEZWZpbmUgdGhlIGludGVyYWN0aXZlX3Bhc3RlIGZ1bmN0aW9uDQppbnRlcmFjdGl2ZV9wYXN0ZSA8LSBmdW5jdGlvbiguLi4pIHsNCiAgaWYgKGludGVyYWN0aXZlKCkpIHsNCiAgICBtZXNzYWdlKHBhc3RlKC4uLikpDQogIH0NCiAgaW52aXNpYmxlKE5VTEwpICAjIEVuc3VyZSB0aGUgZnVuY3Rpb24gZG9lc24ndCByZXR1cm4gYW55dGhpbmcgaW4gdGhlIGtuaXQgb3V0cHV0DQp9DQoNCg0KIyBEZWZpbmUgdGhlIGludGVyYWN0aXZlX2NhdCBmdW5jdGlvbg0KaW50ZXJhY3RpdmVfY2F0IDwtIGZ1bmN0aW9uKC4uLikgew0KICAjIENvbWJpbmUgYWxsIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIHN0cmluZw0KICBtZXNzYWdlIDwtIHBhc3RlKC4uLikNCiAgDQogICMgUHJpbnQgb25seSBpbiBpbnRlcmFjdGl2ZSBtb2RlDQogIGlmIChpbnRlcmFjdGl2ZSgpKSB7DQogICAgY2F0KG1lc3NhZ2UsICJcbiIpICAjIEFkZCBhIG5ld2xpbmUgZm9yIHJlYWRhYmlsaXR5DQogIH0NCiAgDQogIGludmlzaWJsZShOVUxMKSAgIyBFbnN1cmUgbm8gb3V0cHV0IGlzIHJldHVybmVkIGluIG5vbi1pbnRlcmFjdGl2ZSBtb2RlDQp9DQoNCmBgYA0KDQo8IS0tDQojIyBEYXRhIFR5cGVzDQoNCmBgYHtyIGRhdGFfdHlwZXMsIGluY2x1ZGU9RkFMU0UsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCiMgTG9hZCByZXF1aXJlZCBsaWJyYXJpZXMNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIHRoZSBkYXRhIHR5cGUgdGFibGUNCmRhdGFfdHlwZXMgPC0gZGF0YS5mcmFtZSgNCiAgIkRhdGEgVHlwZSIgPSBjKCJOdW1lcmljIiwgIkNoYXJhY3RlciIsICJEYXRlIiwgIkRhdGVUaW1lIiwgIkxvZ2ljYWwiLCAiRmFjdG9yIiwgIkludGVnZXIiLCAiQ29tcGxleCIsICJMaXN0IiksDQogICJEZXNjcmlwdGlvbiIgPSBjKA0KICAgICJDb250aW51b3VzIG9yIGRpc2NyZXRlIG51bWJlcnMsIG9mdGVuIHVzZWQgZm9yIGNhbGN1bGF0aW9ucyIsDQogICAgIlRleHQgZGF0YSwgdXNlZCBmb3IgbmFtZXMsIGxhYmVscywgb3IgY2F0ZWdvcmljYWwgaW5mbyIsDQogICAgIkRhdGVzIHdpdGhvdXQgdGltZSwgdXNlZnVsIGZvciBkYXlzLCBtb250aHMsIHllYXJzIiwNCiAgICAiRGF0ZSBhbmQgdGltZSBkYXRhLCBpbmNsdWRlcyBib3RoIGRhdGUgYW5kIHRpbWUgY29tcG9uZW50cyIsDQogICAgIkJvb2xlYW4gdmFsdWVzIChUUlVFL0ZBTFNFKSwgb2Z0ZW4gZm9yIGNvbmRpdGlvbmFscyIsDQogICAgIkNhdGVnb3JpY2FsIGRhdGEgd2l0aCBkaXN0aW5jdCBsZXZlbHMgb3IgY2F0ZWdvcmllcyIsDQogICAgIldob2xlIG51bWJlcnMsIHR5cGljYWxseSBmb3IgY291bnRzIG9yIElEcyIsDQogICAgIk51bWJlcnMgd2l0aCByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMiLA0KICAgICJDb2xsZWN0aW9uIG9mIG1peGVkIGRhdGEgdHlwZXMsIGVhY2ggZWxlbWVudCBjYW4gZGlmZmVyIg0KICApLA0KICAiQ2hlY2sgVHlwZSBGdW5jdGlvbiIgPSBjKA0KICAgICJgaXMubnVtZXJpYygpYCIsDQogICAgImBpcy5jaGFyYWN0ZXIoKWAiLA0KICAgICJgaW5oZXJpdHMoLiwgJ0RhdGUnKWAiLA0KICAgICJgaW5oZXJpdHMoLiwgJ1BPU0lYdCcpYCIsDQogICAgImBpcy5sb2dpY2FsKClgIiwNCiAgICAiYGlzLmZhY3RvcigpYCIsDQogICAgImBpcy5pbnRlZ2VyKClgIiwNCiAgICAiYGlzLmNvbXBsZXgoKWAiLA0KICAgICJgaXMubGlzdCgpYCINCiAgKSwNCiAgIkV4YW1wbGUgVHJhbnNmb3JtYXRpb24gRnVuY3Rpb25zIiA9IGMoDQogICAgImByb3VuZCgpYCwgYGZsb29yKClgLCBgY2VpbGluZygpYCwgYGFicygpYCwgYGNvbW1hKClgIChzY2FsZXMpLCBgcGVyY2VudCgpYCAoc2NhbGVzKSIsDQogICAgImB0b3VwcGVyKClgLCBgdG9sb3dlcigpYCwgYHN0cl9yZXBsYWNlKClgIChzdHJpbmdyKSwgYHBhc3RlKClgLCBgc3RyX3RyaW0oKWAiLA0KICAgICJgYXMuRGF0ZSgpYCwgYGZvcm1hdCgpYCwgYHllYXIoKWAsIGBtb250aCgpYCwgYGRheSgpYCAobHVicmlkYXRlKSIsDQogICAgImBhcy5QT1NJWGN0KClgLCBgYXMuUE9TSVhsdCgpYCwgYGhvdXIoKWAsIGBtaW51dGUoKWAgKGx1YnJpZGF0ZSksIGBmb3JtYXQoKWAiLA0KICAgICJgaWZlbHNlKClgLCBgY2FzZV93aGVuKClgLCBgIWAgKE5PVCksIGBhcy5udW1lcmljKClgIChjb252ZXJ0IHRvIDAgYW5kIDEpIiwNCiAgICAiYGFzLmZhY3RvcigpYCwgYGZjdF9yZW9yZGVyKClgLCBgZmN0X3JlbGV2ZWwoKWAgKGZvcmNhdHMpLCBgcmVjb2RlKClgIiwNCiAgICAiYGFzLmludGVnZXIoKWAsIGBmbG9vcigpYCwgYGNlaWxpbmcoKWAiLA0KICAgICJgUmUoKWAsIGBJbSgpYCwgYE1vZCgpYCwgYEFyZygpYCIsDQogICAgImBtYXAoKWAgKHB1cnJyKSwgYHVubGlzdCgpYCwgYGxhcHBseSgpYCwgYHNhcHBseSgpYCINCiAgKQ0KKQ0KDQojIERpc3BsYXkgdGhlIHRhYmxlIGluIG1hcmtkb3duIGZvcm1hdA0Ka2FibGUoZGF0YV90eXBlcywgZm9ybWF0ID0gIm1hcmtkb3duIiwgY29sLm5hbWVzID0gYygiRGF0YSBUeXBlIiwgIkRlc2NyaXB0aW9uIiwgIkNoZWNrIFR5cGUgRnVuY3Rpb24iLCAiRXhhbXBsZSBUcmFuc2Zvcm1hdGlvbiBGdW5jdGlvbnMiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpDQpgYGANCg0KIyMgT3RoZXIgRnVuY3Rpb24NCg0KIyMjIENsZWFuIE51bWVyaWMgU3RyaW5ncw0KLS0+DQoNCmBgYHtyIGNsZWFuX251bWVyaWN9DQoNCiMgRGVmaW5lIGEgY3VzdG9tIGZ1bmN0aW9uIHRvIGNsZWFuIG51bWVyaWMgc3RyaW5ncyB3aXRoIHBlcmNlbnRhZ2Ugc2lnbnMNCmNsZWFuX251bWVyaWMgPC0gZnVuY3Rpb24oeCkgew0KICBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgeCkpICAjIFJlbW92ZSB0aGUgIiUiIHNpZ24gYW5kIGNvbnZlcnQgdG8gbnVtZXJpYw0KfQ0KDQpgYGANCg0KPCEtLQ0KIyMgU2F2ZSBWYXJpYWJsZXMgRnVuY3Rpb24NCg0KRnVuY3Rpb24gdG8gc2F2ZSBkYXRhZnJhbWVzLCB2YWx1ZXMsIGxpc3RzIGFzIHZhcmlhYmxlcy4NCi0tPiANCg0KYGBge3Igc2F2ZV92YXJpYWJsZXMsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyMjIERBVEFGUkFNRQ0KDQojIyBEYXRhZnJhbWUgKyBJbmRleCAxICsgSW5kZXggMiArIFllYXIgDQojIEZ1bmN0aW9uIHRvIGR5bmFtaWNhbGx5IHNhdmUgdGhlIGRhdGFmcmFtZSBhcyBhIHZhcmlhYmxlDQpzYXZlX2RhdGFmcmFtZV9pbmRleF8xX2luZGV4XzJfc3RhcnRfeWVhcl9lbmRfeWVhciA8LSBmdW5jdGlvbihkYXRhZnJhbWUsIGluZGV4XzEsIGluZGV4XzIsIHN0YXJ0X3llYXIsIGVuZF95ZWFyKSB7DQogICMgQ3JlYXRlIHRoZSB2YXJpYWJsZSBuYW1lIGR5bmFtaWNhbGx5DQogIHZhcmlhYmxlX25hbWUgPC0gcGFzdGUwKGRlcGFyc2Uoc3Vic3RpdHV0ZShkYXRhZnJhbWUpKSwgIl8iLCBpbmRleF8xLCAiXyIsIGluZGV4XzIsICJfcyIsIHN0YXJ0X3llYXIsICJfZSIsIGVuZF95ZWFyKQ0KICANCiAgIyBBc3NpZ24gdGhlIGRhdGFmcmFtZSB0byB0aGUgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZQ0KICBhc3NpZ24odmFyaWFibGVfbmFtZSwgZGF0YWZyYW1lLCBlbnZpciA9IC5HbG9iYWxFbnYpDQp9DQoNCiMgRGVmaW5lIHBhcmFtZXRlcnMNCmRmMSA8LSBkYXRhLmZyYW1lKA0KICBEYXRlID0gYXMuRGF0ZShjKCIyMDIyLTAxLTAxIiwgIjIwMjItMDEtMDIiKSksDQogIFZhbHVlID0gYygxMDAsIDIwMCkNCikNCmluZGV4XzEgPC0gImJ0Y3VzZCINCmluZGV4XzIgPC0gImRvZ2V1c2QiDQpzdGFydF95ZWFyIDwtIDIwMDUgIyBPciBtaW5feWVhciwgZXRjDQplbmRfeWVhciA8LSAyMDI0ICMgT3IgcHJlc2VudF9kYXRlLCBtYXhfeWVhciwgZXRjDQojIGVuZF95ZWFyIDwtIGFzLm51bWVyaWMoZm9ybWF0KFN5cy5EYXRlKCksICIlWSIpKQ0KDQojIFVzZSB0aGUgZnVuY3Rpb24gdG8gc2F2ZSB0aGUgZGF0YWZyYW1lDQpzYXZlX2RhdGFmcmFtZV9pbmRleF8xX2luZGV4XzJfc3RhcnRfeWVhcl9lbmRfeWVhcihkZjEsIGluZGV4XzEsIGluZGV4XzIsIHN0YXJ0X3llYXIsIGVuZF95ZWFyKQ0KDQojIEFjY2VzcyB0aGUgc2F2ZWQgdmFyaWFibGUgZGlyZWN0bHkNCmludGVyYWN0aXZlX2NhdCgiRGF0YWZyYW1lIHNhdmVkIGFzIHZhcmlhYmxlOiIsIHBhc3RlMCgiZGYxXyIsIGluZGV4XzEsICJfIiwgaW5kZXhfMiwgIl9zIiwgc3RhcnRfeWVhciwgIl9lIiwgZW5kX3llYXIpLCAiXG4iKQ0KDQoNCg0KIyMgRGF0YWZyYW1lICsgSW5kZXggMSArIEluZGV4IDI7IEdlbmVyYWwgTm9uLVNwZWNpZmljIFllYXIgIA0KIyBGdW5jdGlvbiB0byBkeW5hbWljYWxseSBzYXZlIHRoZSBkYXRhZnJhbWUgYXMgYSB2YXJpYWJsZQ0Kc2F2ZV9kYXRhZnJhbWVfaW5kZXhfMV9pbmRleF8yIDwtIGZ1bmN0aW9uKGRhdGFmcmFtZSwgaW5kZXhfMSwgaW5kZXhfMikgew0KICAjIENyZWF0ZSB0aGUgdmFyaWFibGUgbmFtZSBkeW5hbWljYWxseQ0KICB2YXJpYWJsZV9uYW1lIDwtIHBhc3RlMChkZXBhcnNlKHN1YnN0aXR1dGUoZGF0YWZyYW1lKSksICJfIiwgaW5kZXhfMSwgIl8iLCBpbmRleF8yKQ0KICANCiAgIyBBc3NpZ24gdGhlIGRhdGFmcmFtZSB0byB0aGUgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZQ0KICBhc3NpZ24odmFyaWFibGVfbmFtZSwgZGF0YWZyYW1lLCBlbnZpciA9IC5HbG9iYWxFbnYpDQp9DQoNCiMgRGVmaW5lIHBhcmFtZXRlcnMNCmRmMSA8LSBkYXRhLmZyYW1lKA0KICBEYXRlID0gYXMuRGF0ZShjKCIyMDIyLTAxLTAxIiwgIjIwMjItMDEtMDIiKSksDQogIFZhbHVlID0gYygxMDAsIDIwMCkNCikNCmluZGV4XzEgPC0gImJ0Y3VzZCINCmluZGV4XzIgPC0gImRvZ2V1c2QiDQoNCiMgVXNlIHRoZSBmdW5jdGlvbiB0byBzYXZlIHRoZSBkYXRhZnJhbWUNCnNhdmVfZGF0YWZyYW1lX2luZGV4XzFfaW5kZXhfMihkZjEsIGluZGV4XzEsIGluZGV4XzIpDQoNCiMgQWNjZXNzIHRoZSBzYXZlZCB2YXJpYWJsZSBkaXJlY3RseQ0KaW50ZXJhY3RpdmVfY2F0KCJEYXRhZnJhbWUgc2F2ZWQgYXMgdmFyaWFibGU6IiwgcGFzdGUwKCJkZjFfIiwgaW5kZXhfMSwgIl8iLCBpbmRleF8yKSkNCg0KDQoNCmBgYA0KDQoNCjwhLS0NCiMjIEZvcm1hdCBDb2x1bW4gRnVuY3Rpb24gKFJlZDwwPEdyZWVuKSANCg0KRnVuY3Rpb25zIGZvciBwcmUtZGVmaW5lZCBjb2x1bW4gd2lkdGhzLiBOdW1iZXJzIGFuZCBQZXJjZW50YWdlcyBrbml0IHdpdGggY29tbWFzLg0KLS0+DQoNCmBgYHtyIHByZV9kZWZpbmVkX2NvbHVtbl93aWR0aHMsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIHJlcXVpcmVkIGxpYnJhcmllcw0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoc2NhbGVzKQ0KDQojIEZ1bmN0aW9uIHRvIGVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgdW5pdmVyc2FsbHkgaW4gc3RyaW5ncyAoZm9yIGNhcHRpb25zIG9yIG5ydCRtZXRhZGF0YSkNCmVzY2FwZV9zcGVjaWFsX2NoYXJzIDwtIGZ1bmN0aW9uKHRleHQpIHsNCiAgdGV4dCA8LSBnc3ViKCImYW1wOyIsICImIiwgdGV4dCkNCiAgdGV4dCA8LSBnc3ViKCImIzEyNDsiLCAiIHwgIiwgdGV4dCkNCiAgdGV4dCA8LSBnc3ViKCImbHQiLCAiPDsiLCB0ZXh0KQ0KICB0ZXh0IDwtIGdzdWIoIiZndDsiLCAiPiIsIHRleHQpDQogIHJldHVybih0ZXh0KQ0KfQ0KDQojIyMgTElORSBCUkVBS1MgDQojIEZ1bmN0aW9uIHRvIGhhbmRsZSBsaW5lIGJyZWFrcyBpbiBjaGFyYWN0ZXIgY29sdW1ucw0KcHJlc2VydmVfbGluZV9icmVha3MgPC0gZnVuY3Rpb24odGV4dCkgew0KICBnc3ViKCJcbiIsICI8YnI+IiwgdGV4dCkgICMgUmVwbGFjZSBuZXdsaW5lIGNoYXJhY3RlcnMgd2l0aCA8YnI+IGZvciBIVE1MDQp9DQoNCiMjIyBDT05ESVRJT05BTCBGT1JNQVRUSU5HIChSRUQ8MDxHUkVFTikNCiMgVW5pdmVyc2FsIGNvbmRpdGlvbmFsIGNvbG9yaW5nIGZ1bmN0aW9uDQphcHBseV9jb25kaXRpb25hbF9jb2xvcmluZyA8LSBmdW5jdGlvbihkYXRhKSB7DQogICMgRGVmaW5lIHRhcmdldCBjb2x1bW4gcGF0dGVybnMgZm9yIGNvbmRpdGlvbmFsIGNvbG9yaW5nDQogIHRhcmdldF9wYXR0ZXJucyA8LSBjKCJDQUdSIiwgIkNHUiIsICJDSVIiLCAiQ0FJUiIsICIoJSkiLCAiVmFsdWUiLCAiUmF0ZSIsICJPdmVyYWxsIiwgIlMmUCA1MDAiLCAiUVFRIiwgIkJsYWNrUm9jayIsICJTbG9wZSIpDQogIA0KICAjIEFwcGx5IGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgYmFzZWQgb24gcGF0dGVybiBtYXRjaCBpbiBjb2x1bW4gbmFtZXMNCiAgZGF0YSA8LSBkYXRhICU+JQ0KICAgIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCB+IHsNCiAgICAgIGNvbHVtbl9uYW1lIDwtIGN1cl9jb2x1bW4oKQ0KICAgICAgaWYgKGFueShzdHJfZGV0ZWN0KGNvbHVtbl9uYW1lLCB0YXJnZXRfcGF0dGVybnMpKSkgew0KICAgICAgICAjIEFwcGx5IGNvbG9yIGZvcm1hdHRpbmcgYmFzZWQgb24gdmFsdWUsIGFzc3VtaW5nIHBlcmNlbnRhZ2UgZm9ybWF0IHdpdGggIiUiDQogICAgICAgIGNlbGxfc3BlYygNCiAgICAgICAgICAuLCANCiAgICAgICAgICBjb2xvciA9IGlmZWxzZSgNCiAgICAgICAgICAgICFpcy5uYShhcy5udW1lcmljKGdzdWIoIlssJV0iLCAiIiwgLikpKSAmIGFzLm51bWVyaWMoZ3N1YigiWywlXSIsICIiLCAuKSkgPCAwLCANCiAgICAgICAgICAgICJkYXJrcmVkIiwgDQogICAgICAgICAgICBpZmVsc2UoIWlzLm5hKGFzLm51bWVyaWMoZ3N1YigiWywlXSIsICIiLCAuKSkpICYgYXMubnVtZXJpYyhnc3ViKCJbLCVdIiwgIiIsIC4pKSA+IDAsIA0KICAgICAgICAgICAgICAgICAgICJkYXJrZ3JlZW4iLCANCiAgICAgICAgICAgICAgICAgICAiYmxhY2siKSAgIyBEZWZhdWx0IGNvbG9yIGlmIE5BIG9yIG5vbi1udW1lcmljDQogICAgICAgICAgKQ0KICAgICAgICApDQogICAgICB9IGVsc2Ugew0KICAgICAgICAuDQogICAgICB9DQogICAgfSwgLm5hbWVzID0gInsuY29sfSIpKQ0KICANCiAgcmV0dXJuKGRhdGEpDQp9DQoNCg0KDQojIyMgVEVYVCBDRUxMUyBGT1JNQVRTIChDT01NQSwgJiBOQSdTIFJFTU9WRUQsICYgT1RIRVIpDQojIE1haW4gZm9ybWF0dGluZyBmdW5jdGlvbiB0byBoYW5kbGUgc3BlY2lhbCBjaGFyYWN0ZXJzLCBsaW5lIGJyZWFrcywgY29tbWFzLCBhbmQgY29uZGl0aW9uYWwgY29sb3JpbmcNCmZvcm1hdF9kYXRhIDwtIGZ1bmN0aW9uKGRhdGEpIHsNCiAgDQogICMgUmVtb3ZlIHJvd3Mgd2hlcmUgYWxsIHZhbHVlcyBhcmUgTkENCiAgZGF0YSA8LSBkYXRhICU+JSBmaWx0ZXIocm93U3Vtcyhpcy5uYSguKSkgPCBuY29sKC4pKQ0KDQogICMgRm9ybWF0IGRhdGEgd2l0aCBzcGVjaWFsIGNoYXJhY3RlciBlc2NhcGluZywgbGluZSBicmVhayBwcmVzZXJ2YXRpb24sIGFuZCBudW1iZXIgZm9ybWF0dGluZw0KICBkYXRhIDwtIGRhdGEgJT4lDQogICAgbXV0YXRlKGFjcm9zcyh3aGVyZShpcy5jaGFyYWN0ZXIpLCB+IHByZXNlcnZlX2xpbmVfYnJlYWtzKGVzY2FwZV9zcGVjaWFsX2NoYXJzKC4pKSkpICU+JSAgICAjIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIHByZXNlcnZlIGxpbmUgYnJlYWtzDQogICAgbXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfiBpZmVsc2UoLiAlJSAxID09IDAsIC4sIHJvdW5kKC4sIDIpKSkpICU+JSAjIFJvdW5kIG51bWVyaWMgdmFsdWVzIHRvIDIgZGVjaW1hbCBwbGFjZXMgaWYgZGVjaW1hbHMgZXhpc3QNCiAgICBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCBjb21tYSkpICU+JSAjIEZvcm1hdCBhbGwgbnVtZXJpYyBjb2x1bW5zIHdpdGggY29tbWFzDQogICAgbXV0YXRlKGFjcm9zcyhjb250YWlucygiUGVyY2VudCIpLCB+IHBhc3RlMChjb21tYSguICogMTAwLCBhY2N1cmFjeSA9IDAuMSksICIlIikpKSAlPiUgIyBBZGQgY29tbWFzIHRvIHBlcmNlbnRhZ2VzDQogICAgbXV0YXRlKGFjcm9zcyhjb250YWlucygiRG9sbGFyIikgfCBjb250YWlucygiQ3VycmVuY3kiKSwgZG9sbGFyKSkgIyBBZGQgY29tbWFzIHRvIGN1cnJlbmN5DQogIA0KICAjIEFwcGx5IGNvbmRpdGlvbmFsIGNvbG9yaW5nDQogIGRhdGEgPC0gYXBwbHlfY29uZGl0aW9uYWxfY29sb3JpbmcoZGF0YSkNCg0KICByZXR1cm4oZGF0YSkNCn0NCg0KDQojIyMgUkVTSEFQRSBHUk9VUEVEIENPTFVNTlMgDQojIEZ1bmN0aW9uIHRvIHJlc2hhcGUgZGF0YSBmcmFtZSBieSBzdGFja2luZyBjb2x1bW5zIHZlcnRpY2FsbHkgd2l0aGluIGVhY2ggZ3JvdXANCnJlc2hhcGVfZ3JvdXBlZF9jb2x1bW5zIDwtIGZ1bmN0aW9uKGRhdGEsIGdyb3VwaW5nX2ZhY3RvciA9IDIpIHsNCiAgb3JpZ2luYWxfcm93cyA8LSBucm93KGRhdGEpDQogIG9yaWdpbmFsX2NvbHVtbnMgPC0gbmNvbChkYXRhKQ0KICANCiAgIyBDYWxjdWxhdGUgdGhlIHJlcXVpcmVkIG51bWJlciBvZiByb3dzIGJhc2VkIG9uIHRoZSBncm91cGluZyBmYWN0b3INCiAgbmV3X3Jvd19jb3VudCA8LSBjZWlsaW5nKG9yaWdpbmFsX3Jvd3MgLyBncm91cGluZ19mYWN0b3IpDQogIA0KICAjIEluaXRpYWxpemUgYW4gZW1wdHkgZGF0YSBmcmFtZSBmb3IgdGhlIHJlc2hhcGVkIGRhdGENCiAgcmVzaGFwZWRfZGF0YSA8LSBkYXRhLmZyYW1lKG1hdHJpeChOQSwgbnJvdyA9IG5ld19yb3dfY291bnQsIG5jb2wgPSBvcmlnaW5hbF9jb2x1bW5zICogZ3JvdXBpbmdfZmFjdG9yKSkNCiAgDQogICMgU3RhY2sgZWFjaCBncm91cCBkb3duIHRoZSBjb2x1bW4NCiAgZm9yIChpIGluIDE6Z3JvdXBpbmdfZmFjdG9yKSB7DQogICAgIyBDYWxjdWxhdGUgdGhlIHJvdyBpbmRpY2VzIGZvciB0aGUgY3VycmVudCBncm91cA0KICAgIHJvd19pbmRpY2VzIDwtICgoaSAtIDEpICogbmV3X3Jvd19jb3VudCArIDEpOm1pbihpICogbmV3X3Jvd19jb3VudCwgb3JpZ2luYWxfcm93cykNCiAgICBjb2xfaW5kaWNlcyA8LSAoKGkgLSAxKSAqIG9yaWdpbmFsX2NvbHVtbnMgKyAxKTooaSAqIG9yaWdpbmFsX2NvbHVtbnMpDQogICAgDQogICAgIyBBc3NpZ24gdGhlIGRhdGEgZm9yIHRoZSBjdXJyZW50IGdyb3VwDQogICAgcmVzaGFwZWRfZGF0YVsxOmxlbmd0aChyb3dfaW5kaWNlcyksIGNvbF9pbmRpY2VzXSA8LSBkYXRhW3Jvd19pbmRpY2VzLCBdDQogIH0NCiAgDQogICMgU2V0IGNvbHVtbiBuYW1lcyB0byByZXBlYXQgb3JpZ2luYWwgbmFtZXMgd2l0aG91dCBzdWZmaXhlcw0KICBjb2xfbmFtZXMgPC0gcmVwKGNvbG5hbWVzKGRhdGEpLCBncm91cGluZ19mYWN0b3IpDQogIGNvbG5hbWVzKHJlc2hhcGVkX2RhdGEpIDwtIGNvbF9uYW1lcw0KICANCiAgcmV0dXJuKHJlc2hhcGVkX2RhdGEpDQp9DQoNCg0KDQoNCiMjIyBXSURUSFMNCiMjIFVuc3BlY2lmaWVkIHdpZHRocw0KDQojIEZ1bmN0aW9uIHRvIGZvcm1hdCB0YWJsZSB3aXRoIHVuc3BlY2lmaWVkLCBhdXRvbWF0aWMgY29sdW1uIHdpZHRocw0KZm9ybWF0X3Vuc3BlY2lmaWVkX3dpZHRoIDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIG51bV9jb2x1bW5zIDwtIG5jb2woZGF0YSkgIyBDaGVjayB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGRhdGEgZnJhbWUNCiAgICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JSAjIERpc3BsYXkgdGhlIHRhYmxlIHdpdGggYXV0b21hdGljIHdpZHRocw0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICAjIExldCBjb2x1bW5zIGFkYXB0IGF1dG9tYXRpY2FsbHkNCn0NCg0KIyMgVW5zcGVjaWZpZWQgV2lkdGhzIEdyb3VwZWQNCiMgRnVuY3Rpb24gdG8gZm9ybWF0IHRhYmxlIHdpdGggZHluYW1pY2FsbHkgcmVzaGFwZWQgY29sdW1ucyBhbmQgdW5zcGVjaWZpZWQgd2lkdGgNCmZvcm1hdF91bnNwZWNpZmllZF93aWR0aF9ncm91cGVkIDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMLCBncm91cGluZ19mYWN0b3IgPSAyKSB7DQogIGRhdGEgPC0gZm9ybWF0X2RhdGEoZGF0YSkgICMgQXBwbHkgZGF0YSBmb3JtYXR0aW5nDQogIGRhdGEgPC0gcmVzaGFwZV9ncm91cGVkX2NvbHVtbnMoZGF0YSwgZ3JvdXBpbmdfZmFjdG9yKSAgIyBSZXNoYXBlIGRhdGEgd2l0aCBncm91cGVkIGNvbHVtbnMNCiAgDQogICMgVXNlIGtuaXRyOjprYWJsZSBhbmQga2FibGVFeHRyYSB0byBzdHlsZSB0aGUgdGFibGUNCiAga2FibGVfb3V0cHV0IDwtIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgICMgTGV0IGNvbHVtbnMgYWRhcHQgYXV0b21hdGljYWxseQ0KICANCiAgcmV0dXJuKGthYmxlX291dHB1dCkNCn0NCg0KIyBFeGFtcGxlIHVzYWdlDQojIGZvcm1hdF91bnNwZWNpZmllZF93aWR0aF9ncm91cGVkKG5ydCRjcGlfcmF3LCBjYXB0aW9uID0gIkNvbnN1bWVyIFByaWNlIEluZGV4ICgxOTEzLTIwMjQpIiwgZ3JvdXBpbmdfZmFjdG9yID0gMykNCg0KDQoNCiMjIEVxdWFsIFdpZHRocw0KDQojIEZ1bmN0aW9uIHRvIGZvcm1hdCB0YWJsZSB3aXRoIGVxdWFsIHdpZHRoIGNvbHVtbnMNCmZvcm1hdF9lcXVhbF93aWR0aCA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBudW1fY29sdW1ucyA8LSBuY29sKGRhdGEpICMgR2V0IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZGF0YSBmcmFtZQ0KICBjb2x1bW5fd2lkdGggPC0gMTAwIC8gbnVtX2NvbHVtbnMgIyBDYWxjdWxhdGUgZXF1YWwgd2lkdGggYXMgYSBwZXJjZW50YWdlDQogIA0KICAjIFVzZSBrbml0cjo6a2FibGUgYW5kIGthYmxlRXh0cmEgdG8gc3R5bGUgdGhlIHRhYmxlDQogIGthYmxlX291dHB1dCA8LSBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpDQogIA0KICAjIEFwcGx5IGVxdWFsIHdpZHRoIHRvIGVhY2ggY29sdW1uIHVzaW5nIGNvbHVtbl9zcGVjDQogIGZvciAoaSBpbiAxOm51bV9jb2x1bW5zKSB7DQogICAga2FibGVfb3V0cHV0IDwtIGthYmxlX291dHB1dCAlPiUNCiAgICAgIGNvbHVtbl9zcGVjKGksIHdpZHRoID0gcGFzdGUwKGNvbHVtbl93aWR0aCwgIiUiKSkNCiAgfQ0KICANCiAgcmV0dXJuKGthYmxlX291dHB1dCkNCn0NCg0KIyMgRXF1YWwgV2lkdGhzIEdyb3VwZWQgIA0KDQojIEZ1bmN0aW9uIHRvIGZvcm1hdCB0YWJsZSB3aXRoIGR5bmFtaWNhbGx5IHJlc2hhcGVkIGNvbHVtbnMgYW5kIGVxdWFsIHdpZHRoDQpmb3JtYXRfZXF1YWxfd2lkdGhfZ3JvdXBlZCA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCwgZ3JvdXBpbmdfZmFjdG9yID0gMikgew0KICBkYXRhIDwtIGZvcm1hdF9kYXRhKGRhdGEpICAjIEFwcGx5IGRhdGEgZm9ybWF0dGluZw0KICBkYXRhIDwtIHJlc2hhcGVfZ3JvdXBlZF9jb2x1bW5zKGRhdGEsIGdyb3VwaW5nX2ZhY3RvcikgICMgUmVzaGFwZSBkYXRhIHdpdGggZ3JvdXBlZCBjb2x1bW5zDQogIA0KICAjIENhbGN1bGF0ZSBlcXVhbCB3aWR0aCBhcyBhIHBlcmNlbnRhZ2UNCiAgbnVtX2NvbHVtbnMgPC0gbmNvbChkYXRhKQ0KICBjb2x1bW5fd2lkdGggPC0gMTAwIC8gbnVtX2NvbHVtbnMNCiAgDQogICMgVXNlIGtuaXRyOjprYWJsZSBhbmQga2FibGVFeHRyYSB0byBzdHlsZSB0aGUgdGFibGUNCiAga2FibGVfb3V0cHV0IDwtIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkNCiAgDQogICMgQXBwbHkgZXF1YWwgd2lkdGggdG8gZWFjaCBjb2x1bW4gdXNpbmcgY29sdW1uX3NwZWMNCiAgZm9yIChpIGluIDE6bnVtX2NvbHVtbnMpIHsNCiAgICBrYWJsZV9vdXRwdXQgPC0ga2FibGVfb3V0cHV0ICU+JQ0KICAgICAgY29sdW1uX3NwZWMoaSwgd2lkdGggPSBwYXN0ZTAoY29sdW1uX3dpZHRoLCAiJSIpKQ0KICB9DQogIA0KICByZXR1cm4oa2FibGVfb3V0cHV0KQ0KfQ0KDQoNCg0KIyMgUHJlZGVmaW5lZCBmdW5jdGlvbiBmb3IgMi1jb2x1bW4gdGFibGVzDQoNCiMgRnVuY3Rpb24gZm9yIDItY29sdW1uIHRhYmxlOiBDb2x1bW4gMSA9IDEvNCwgQ29sdW1uIDIgPSAzLzQNCmZvcm1hdF8yY29sXzFfNF8zXzQgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICIyNSUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICI3NSUiKQ0KfQ0KDQojIEZ1bmN0aW9uIGZvciAyLWNvbHVtbiB0YWJsZTogQ29sdW1uIDEgPSAzLzQsIENvbHVtbiAyID0gMS80DQpmb3JtYXRfMmNvbF8zXzRfMV80IDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiNzUlIikgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiMjUlIikNCn0NCg0KIyBGdW5jdGlvbiBmb3IgMi1jb2x1bW4gdGFibGU6IENvbHVtbiAxID0gMS8zLCBDb2x1bW4gMiA9IDIvMw0KZm9ybWF0XzJjb2xfMV8zXzJfMyA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjMzLjMzJSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjY2LjY3JSIpDQp9DQoNCiMgRnVuY3Rpb24gZm9yIDItY29sdW1uIHRhYmxlOiBDb2x1bW4gMSA9IDIvMywgQ29sdW1uIDIgPSAxLzMNCmZvcm1hdF8yY29sXzJfM18xXzMgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI2Ni42NyUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICIzMy4zMyUiKQ0KfQ0KIyBGdW5jdGlvbiBmb3IgMi1jb2x1bW4gdGFibGUgd2l0aCBlcXVhbCB3aWR0aCAoNTAlIGVhY2gpDQpmb3JtYXRfMmNvbF9lcXVhbCA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjUwJSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjUwJSIpDQp9DQoNCiMjIFByZWRlZmluZWQgZnVuY3Rpb24gZm9yIDMtY29sdW1uIHRhYmxlcw0KDQojIEZ1bmN0aW9uIGZvciAzLWNvbHVtbiB0YWJsZTogQ29sdW1uIDEgPSAyLzQsIENvbHVtbnMgMiBhbmQgMyA9IDEvNCBlYWNoDQpmb3JtYXRfM2NvbF8yXzRfMV80XzFfNCA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjUwJSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjI1JSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gIjI1JSIpDQp9DQoNCiMgRnVuY3Rpb24gZm9yIDMtY29sdW1uIHRhYmxlOiBDb2x1bW4gMiA9IDIvNCwgQ29sdW1ucyAxIGFuZCAzID0gMS80IGVhY2gNCmZvcm1hdF8zY29sXzFfNF8yXzRfMV80IDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMjUlIikgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiNTAlIikgJT4lDQogICAgY29sdW1uX3NwZWMoMywgd2lkdGggPSAiMjUlIikNCn0NCg0KIyBGdW5jdGlvbiBmb3IgMy1jb2x1bW4gdGFibGU6IENvbHVtbiAzID0gMi80LCBDb2x1bW5zIDEgYW5kIDIgPSAxLzQgZWFjaA0KZm9ybWF0XzNjb2xfMV80XzFfNF8yXzQgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICIyNSUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICIyNSUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9ICI1MCUiKQ0KfQ0KDQojIEZ1bmN0aW9uIGZvciAzLWNvbHVtbiB0YWJsZTogQ29sdW1uIDEgPSAxLzcsIENvbHVtbnMgMiBhbmQgMyA9IDMvNyBlYWNoDQpmb3JtYXRfM2NvbF8xXzdfM183XzNfNyA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gMS83KSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9IDMvNykgJT4lDQogICAgY29sdW1uX3NwZWMoMywgd2lkdGggPSAzLzcpDQp9DQoNCg0KIyBGdW5jdGlvbiBmb3IgMy1jb2x1bW4gdGFibGU6IENvbHVtbiAyID0gMS83LCBDb2x1bW5zIDEgYW5kIDMgPSAzLzcgZWFjaA0KZm9ybWF0XzNjb2xfM183XzFfN18zXzcgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9IDMvNykgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAxLzcpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gMy83KQ0KfQ0KDQoNCiMgRnVuY3Rpb24gZm9yIDMtY29sdW1uIHRhYmxlOiBDb2x1bW4gMyA9IDEvNywgQ29sdW1ucyAxIGFuZCAyID0gMy83IGVhY2gNCmZvcm1hdF8zY29sXzNfN18zXzdfMV83IDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAzLzcpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gMy83KSAlPiUNCiAgICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9IDEvNykNCn0NCg0KDQojIEZ1bmN0aW9uIGZvciAzLWNvbHVtbiB0YWJsZSB3aXRoIGVxdWFsIHdpZHRoICgzMy4zMyUgZWFjaCkNCmZvcm1hdF8zY29sX2VxdWFsIDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMzMuMzMlIikgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiMzMuMzMlIikgJT4lDQogICAgY29sdW1uX3NwZWMoMywgd2lkdGggPSAiMzMuMzMlIikNCn0NCg0KDQojIyBNYW51YWxseSBTcGVjaWZpZWQgV2lkdGhzIA0KDQojIEZ1bmN0aW9uIGZvciA0LWNvbHVtbiB0YWJsZSB3aXRoIGN1c3RvbWl6YWJsZSBjb2x1bW4gd2lkdGhzIA0KZm9ybWF0XzRjb2xfY3VzdG9tX3dpZHRocyA8LSBmdW5jdGlvbihkYXRhLCBjb2wxX3dpZHRoID0gIjMwZW0iLCBjb2wyX3dpZHRoID0gIjEwZW0iLCBjb2wzX3dpZHRoID0gIjMwZW0iLCBjb2w0X3dpZHRoID0gIjMwZW0iLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gY29sMV93aWR0aCkgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSBjb2wyX3dpZHRoKSAlPiUNCiAgICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9IGNvbDNfd2lkdGgpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gY29sNF93aWR0aCkNCn0NCg0KIyBGdW5jdGlvbiBmb3IgMy1jb2x1bW4gdGFibGUgd2l0aCBjdXN0b21pemFibGUgY29sdW1uIHdpZHRocyANCmZvcm1hdF8zY29sX2N1c3RvbV93aWR0aHMgPC0gZnVuY3Rpb24oZGF0YSwgY29sMV93aWR0aCA9ICIzMGVtIiwgY29sMl93aWR0aCA9ICIxMGVtIiwgY29sM193aWR0aCA9ICIzMGVtIiwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9IGNvbDFfd2lkdGgpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gY29sMl93aWR0aCkgJT4lDQogICAgY29sdW1uX3NwZWMoMywgd2lkdGggPSBjb2wzX3dpZHRoKQ0KfQ0KDQojIEZ1bmN0aW9uIGZvciAyLWNvbHVtbiB0YWJsZSB3aXRoIGN1c3RvbWl6YWJsZSBjb2x1bW4gd2lkdGhzDQpmb3JtYXRfMmNvbF9jdXN0b21fd2lkdGhzIDwtIGZ1bmN0aW9uKGRhdGEsIGNvbDFfd2lkdGggPSAiMzBlbSIsIGNvbDJfd2lkdGggPSAiMTBlbSIsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSBjb2wxX3dpZHRoKSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9IGNvbDJfd2lkdGgpDQp9DQoNCg0KIyMgRVhBTVBMRSBVU0FHRVMgDQoNCiMgRXhhbXBsZSB1c2FnZSB3aXRoIHNwZWNpZmljIHdpZHRocw0KIyBmb3JtYXRfM2NvbF9jdXN0b21fd2lkdGhzKGNwaV9yYXdfc3VtbWFyeSwgY29sMV93aWR0aCA9ICIyNWVtIiwgY29sMl93aWR0aCA9ICIxNWVtIiwgY29sM193aWR0aCA9ICIyNWVtIikNCg0KDQojIEV4YW1wbGUgdXNhZ2U6DQojIEFzc3VtaW5nIGBteV9kYXRhYCBpcyB5b3VyIGRhdGEgZnJhbWUNCg0KIyBVc2UgZXF1YWwgd2lkdGggZm9ybWF0IA0KIyBmb3JtYXRfZXF1YWxfd2lkdGgobXlfZGF0YSkNCg0KIyBBc3N1bWluZyBgbnJ0JGNwaV9yYXdgIGlzIHlvdXIgZGF0YSBmcmFtZQ0KIyBVc2UgZXF1YWwgd2lkdGggZm9ybWF0IHdpdGggbXVsdGlwbGUgc2V0cyBvZiBhIGdyb3VwZWQgY29sdW1ucyAgDQojIGZvcm1hdF9lcXVhbF93aWR0aF9ncm91cGVkKG5ydCRjcGlfcmF3LCBjYXB0aW9uID0gIkNvbnN1bWVyIFByaWNlIEluZGV4ICgxOTEzLTIwMjQpIiwgZ3JvdXBpbmdfZmFjdG9yID0gMikgICMgRG91YmxlcyBjb2x1bW5zDQojIGZvcm1hdF9lcXVhbF93aWR0aF9ncm91cGVkKG5ydCRjcGlfcmF3LCBjYXB0aW9uID0gIkNvbnN1bWVyIFByaWNlIEluZGV4ICgxOTEzLTIwMjQpIiwgZ3JvdXBpbmdfZmFjdG9yID0gMykgICMgVHJpcGxlcyBjb2x1bW5zDQoNCiMgQXNzdW1pbmcgYG5ydCRjcGlfcmF3YCBpcyB5b3VyIGRhdGEgZnJhbWUNCiMgVXNlIFVuc3BlY2lmaWVkIGZvcm1hdCB3aXRoIG11bHRpcGxlIHNldHMgb2YgYSBncm91cGVkIGNvbHVtbnMgIA0KIyBmb3JtYXRfdW5zcGVjaWZpZWRfd2lkdGhfZ3JvdXBlZChucnQkY3BpX3JhdywgY2FwdGlvbiA9ICJDb25zdW1lciBQcmljZSBJbmRleCAoMTkxMy0yMDI0KSIsIGdyb3VwaW5nX2ZhY3RvciA9IDMpDQoNCg0KIyBVc2UgMi1jb2x1bW4gZm9ybWF0IHdpdGggQ29sdW1uIDEgYXMgMS80IGFuZCBDb2x1bW4gMiBhcyAzLzQNCiMgZm9ybWF0XzJjb2xfMV80XzNfNChteV9kYXRhKQ0KDQojIFVzZSAyLWNvbHVtbiBmb3JtYXQgd2l0aCBlcXVhbCB3aWR0aA0KIyBmb3JtYXRfMmNvbF9lcXVhbChteV9kYXRhKQ0KDQojIFVzZSAzLWNvbHVtbiBmb3JtYXQgd2l0aCBlcXVhbCB3aWR0aA0KIyBmb3JtYXRfM2NvbF9lcXVhbChteV9kYXRhKQ0KDQoNCiMgQWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25zIGFzIG5lZWRlZCBmb3Igb3RoZXIgY29uZmlndXJhdGlvbnMNCmBgYA0KDQoNCjwhLS0NClJFUVVJUkVTIFVQREFUSU5HIENPREUgQ0hVTksgRFVFIFRPIEVSUk9SOiANCklFIA0KIyMjIyBBbm51YWwgSW5mbGF0aW9uIFJhdGVzICgxOTEzLTIwMjMpDQo+IGZvcm1hdF95b3ljb2xvcl9lcXVhbF93aWR0aF9ncm91cGVkKG5ydCRjcGlfcmF3LCBncm91cGluZ19mYWN0b3IgPSAyKQ0KRXJyb3IgaW4gYG11dGF0ZSgpYDoNCuKEuSBJbiBhcmd1bWVudDogYGFjcm9zcyguLi4pYC4NCkNhdXNlZCBieSBlcnJvciBpbiBgYWNyb3NzKClgOg0KISBDYW4ndCBjb21wdXRlIGNvbHVtbiBgMS1ZZWFyIENBSVJgLg0KQ2F1c2VkIGJ5IGVycm9yIGluIGBpZiAoIWlzLm5hKG51bWVyaWNfdmFsdWUpKSAuLi5gOg0KISB0aGUgY29uZGl0aW9uIGhhcyBsZW5ndGggPiAxDQpCYWNrdHJhY2U6DQogIDEuIGdsb2JhbCBmb3JtYXRfeW95Y29sb3JfZXF1YWxfd2lkdGhfZ3JvdXBlZChucnQkY3BpX3JhdywgZ3JvdXBpbmdfZmFjdG9yID0gMikNCiAgNi4gZHBseXI6OjptdXRhdGUuZGF0YS5mcmFtZSguLi4pDQogIDcuIGRwbHlyOjo6bXV0YXRlX2NvbHMoLmRhdGEsIGRwbHlyX3F1b3N1cmVzKC4uLiksIGJ5KQ0KICA5LiBkcGx5cjo6Om11dGF0ZV9jb2woZG90c1tbaV1dLCBkYXRhLCBtYXNrLCBuZXdfY29sdW1ucykNCiAxMS4gbWFzayRldmFsX2FsbF9tdXRhdGUocXVvKQ0KIDEyLiBkcGx5ciAobG9jYWwpIGV2YWwoKQ0KDQojIyBGb3JtYXQgQ29sdW1uIEZ1bmN0aW9uIChZb1kgQ29tcGFyaXNvbikNCg0KRnVuY3Rpb25zIGZvciBwcmUtZGVmaW5lZCBjb2x1bW4gd2lkdGhzLiBOdW1iZXJzIGFuZCBQZXJjZW50YWdlcyBrbml0IHdpdGggY29tbWFzLg0KLS0+DQoNCmBgYHtyIHByZV9kZWZpbmVkX2NvbHVtbl93aWR0aHNfeW95Y29sb3IsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIHJlcXVpcmVkIGxpYnJhcmllcw0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoc2NhbGVzKQ0KDQojIEZ1bmN0aW9uIHRvIGVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgdW5pdmVyc2FsbHkgaW4gc3RyaW5ncyAoZm9yIGNhcHRpb25zIG9yIG5ydCRtZXRhZGF0YSkNCmVzY2FwZV9zcGVjaWFsX2NoYXJzIDwtIGZ1bmN0aW9uKHRleHQpIHsNCiAgdGV4dCA8LSBnc3ViKCImYW1wOyIsICImIiwgdGV4dCkNCiAgdGV4dCA8LSBnc3ViKCImIzEyNDsiLCAiIHwgIiwgdGV4dCkNCiAgdGV4dCA8LSBnc3ViKCImbHQiLCAiPDsiLCB0ZXh0KQ0KICB0ZXh0IDwtIGdzdWIoIiZndDsiLCAiPiIsIHRleHQpDQogIHJldHVybih0ZXh0KQ0KfQ0KDQojIyMgTElORSBCUkVBS1MgDQojIEZ1bmN0aW9uIHRvIGhhbmRsZSBsaW5lIGJyZWFrcyBpbiBjaGFyYWN0ZXIgY29sdW1ucw0KcHJlc2VydmVfbGluZV9icmVha3MgPC0gZnVuY3Rpb24odGV4dCkgew0KICBnc3ViKCJcbiIsICI8YnI+IiwgdGV4dCkgICMgUmVwbGFjZSBuZXdsaW5lIGNoYXJhY3RlcnMgd2l0aCA8YnI+IGZvciBIVE1MDQp9DQoNCiMjIyBDT05ESVRJT05BTCBGT1JNQVRUSU5HIEZPUiBZT1kgQ09NUEFSSVNPTg0KIyBZb1kgQ29uZGl0aW9uYWwgQ29sb3JpbmcgRnVuY3Rpb24NCmFwcGx5X3lveV9jb25kaXRpb25hbF9jb2xvcmluZyA8LSBmdW5jdGlvbihkYXRhKSB7DQogICMgRGVmaW5lIHRhcmdldCBjb2x1bW4gcGF0dGVybnMgZm9yIGNvbmRpdGlvbmFsIGNvbG9yaW5nDQogIHRhcmdldF9wYXR0ZXJucyA8LSBjKCJDQUdSIiwgIkNHUiIsICJDSVIiLCAiQ0FJUiIsICIoJSkiLCAiVmFsdWUiLCAiUmF0ZSIsICJPdmVyYWxsIiwgIlMmUCA1MDAiLCAiUVFRIiwgIkJsYWNrUm9jayIsICJTbG9wZSIpDQogIA0KICAjIEFwcGx5IGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgc3BlY2lmaWNhbGx5IGZvciBZb1kgY29tcGFyaXNvbg0KICBkYXRhIDwtIGRhdGEgJT4lDQogICAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIH4gew0KICAgICAgY29sdW1uX25hbWUgPC0gY3VyX2NvbHVtbigpDQogICAgICANCiAgICAgICMgQXBwbHkgb25seSBpZiB0aGUgY29sdW1uIG5hbWUgbWF0Y2hlcyB0aGUgdGFyZ2V0IHBhdHRlcm5zDQogICAgICBpZiAoYW55KHN0cl9kZXRlY3QoY29sdW1uX25hbWUsIHRhcmdldF9wYXR0ZXJucykpKSB7DQogICAgICAgICMgQ29udmVydCBjb2x1bW4gdmFsdWVzIHRvIG51bWVyaWMgZm9yIGNvbXBhcmlzb24gKGhhbmRsZXMgcGVyY2VudGFnZXMgb3Igc3ltYm9scykNCiAgICAgICAgbnVtZXJpY192YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiWywlXSIsICIiLCAuKSkpDQogICAgICAgIA0KICAgICAgICBpZiAoIWlzLm5hKG51bWVyaWNfdmFsdWUpKSB7DQogICAgICAgICAgIyBBcHBseSBZb1kgY29sb3IgZm9ybWF0dGluZyBiYXNlZCBvbiBjb21wYXJpc29uIHdpdGggdGhlIHByZXZpb3VzIHJvdw0KICAgICAgICAgIGNlbGxfc3BlYygNCiAgICAgICAgICAgIC4sIA0KICAgICAgICAgICAgY29sb3IgPSBpZmVsc2UoDQogICAgICAgICAgICAgICFpcy5uYShsYWcobnVtZXJpY192YWx1ZSkpICYgbnVtZXJpY192YWx1ZSA+IGxhZyhudW1lcmljX3ZhbHVlKSwgDQogICAgICAgICAgICAgICJkYXJrZ3JlZW4iLCANCiAgICAgICAgICAgICAgaWZlbHNlKCFpcy5uYShsYWcobnVtZXJpY192YWx1ZSkpICYgbnVtZXJpY192YWx1ZSA8IGxhZyhudW1lcmljX3ZhbHVlKSwgDQogICAgICAgICAgICAgICAgICAgICAiZGFya3JlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgImJsYWNrIikgICMgRGVmYXVsdCBjb2xvciBmb3IgZXF1YWwgb3IgTkEgdmFsdWVzDQogICAgICAgICAgICApDQogICAgICAgICAgKQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIC4NCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgLiAgIyBSZXR1cm4gdGhlIG9yaWdpbmFsIHZhbHVlIGlmIHRoZSBjb2x1bW4gZG9lc24ndCBtYXRjaCB0aGUgdGFyZ2V0IHBhdHRlcm5zDQogICAgICB9DQogICAgfSwgLm5hbWVzID0gInsuY29sfSIpKQ0KICANCiAgcmV0dXJuKGRhdGEpDQp9DQoNCiMgRm9ybWF0dGluZyBGdW5jdGlvbiBmb3IgWW9ZIENvbG9yaW5nDQpmb3JtYXRfeW95Y29sb3JfZGF0YSA8LSBmdW5jdGlvbihkYXRhKSB7DQogICMgRmlsdGVyIG91dCByb3dzIHdoZXJlIGFsbCB2YWx1ZXMgYXJlIE5BDQogIGRhdGEgPC0gZGF0YSAlPiUgZmlsdGVyKHJvd1N1bXMoaXMubmEoLikpIDwgbmNvbCguKSkNCiAgDQogICMgRm9ybWF0IGRhdGEgKGVzY2FwZSBjaGFyYWN0ZXJzLCBsaW5lIGJyZWFrcywgYW5kIG51bWVyaWMgcm91bmRpbmcpDQogIGRhdGEgPC0gZGF0YSAlPiUNCiAgICBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLmNoYXJhY3RlciksIH4gcHJlc2VydmVfbGluZV9icmVha3MoZXNjYXBlX3NwZWNpYWxfY2hhcnMoLikpKSkgJT4lICAjIEVzY2FwZSBhbmQgcHJlc2VydmUgc3BlY2lhbCBjaGFyYWN0ZXJzDQogICAgbXV0YXRlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfiBpZmVsc2UoLiAlJSAxID09IDAsIC4sIHJvdW5kKC4sIDIpKSkpICU+JSAgICAgICAgICAgICMgUm91bmQgbnVtZXJpYyB2YWx1ZXMNCiAgICBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCBjb21tYSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEZvcm1hdCBudW1lcmljIHZhbHVlcyB3aXRoIGNvbW1hcw0KICANCiAgIyBBcHBseSBZb1ktc3BlY2lmaWMgY29uZGl0aW9uYWwgY29sb3JpbmcNCiAgZGF0YSA8LSBhcHBseV95b3lfY29uZGl0aW9uYWxfY29sb3JpbmcoZGF0YSkNCiAgDQogIHJldHVybihkYXRhKQ0KfQ0KDQojIEV4YW1wbGUgVXNhZ2UNCiMgQXNzdW1pbmcgYG5ydCRjcGlfcmF3YCBpcyB5b3VyIGRhdGEgZnJhbWUgZm9yIFlvWSBjb21wYXJpc29uDQojIGZvcm1hdF95b3ljb2xvcl9lcXVhbF93aWR0aF9ncm91cGVkKG5ydCRjcGlfcmF3LCBjYXB0aW9uID0gIkNvbnN1bWVyIFByaWNlIEluZGV4IFlvWSBDaGFuZ2VzICgxOTEzLTIwMjQpIiwgZ3JvdXBpbmdfZmFjdG9yID0gMikNCg0KDQoNCiMjIyBSRVNIQVBFIEdST1VQRUQgQ09MVU1OUyANCiMgRnVuY3Rpb24gdG8gcmVzaGFwZSBkYXRhIGZyYW1lIGJ5IHN0YWNraW5nIGNvbHVtbnMgdmVydGljYWxseSB3aXRoaW4gZWFjaCBncm91cA0KcmVzaGFwZV9ncm91cGVkX2NvbHVtbnMgPC0gZnVuY3Rpb24oZGF0YSwgZ3JvdXBpbmdfZmFjdG9yID0gMikgew0KICBvcmlnaW5hbF9yb3dzIDwtIG5yb3coZGF0YSkNCiAgb3JpZ2luYWxfY29sdW1ucyA8LSBuY29sKGRhdGEpDQogIA0KICAjIENhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIHJvd3MgYmFzZWQgb24gdGhlIGdyb3VwaW5nIGZhY3Rvcg0KICBuZXdfcm93X2NvdW50IDwtIGNlaWxpbmcob3JpZ2luYWxfcm93cyAvIGdyb3VwaW5nX2ZhY3RvcikNCiAgDQogICMgSW5pdGlhbGl6ZSBhbiBlbXB0eSBkYXRhIGZyYW1lIGZvciB0aGUgcmVzaGFwZWQgZGF0YQ0KICByZXNoYXBlZF9kYXRhIDwtIGRhdGEuZnJhbWUobWF0cml4KE5BLCBucm93ID0gbmV3X3Jvd19jb3VudCwgbmNvbCA9IG9yaWdpbmFsX2NvbHVtbnMgKiBncm91cGluZ19mYWN0b3IpKQ0KICANCiAgIyBTdGFjayBlYWNoIGdyb3VwIGRvd24gdGhlIGNvbHVtbg0KICBmb3IgKGkgaW4gMTpncm91cGluZ19mYWN0b3IpIHsNCiAgICAjIENhbGN1bGF0ZSB0aGUgcm93IGluZGljZXMgZm9yIHRoZSBjdXJyZW50IGdyb3VwDQogICAgcm93X2luZGljZXMgPC0gKChpIC0gMSkgKiBuZXdfcm93X2NvdW50ICsgMSk6bWluKGkgKiBuZXdfcm93X2NvdW50LCBvcmlnaW5hbF9yb3dzKQ0KICAgIGNvbF9pbmRpY2VzIDwtICgoaSAtIDEpICogb3JpZ2luYWxfY29sdW1ucyArIDEpOihpICogb3JpZ2luYWxfY29sdW1ucykNCiAgICANCiAgICAjIEFzc2lnbiB0aGUgZGF0YSBmb3IgdGhlIGN1cnJlbnQgZ3JvdXANCiAgICByZXNoYXBlZF9kYXRhWzE6bGVuZ3RoKHJvd19pbmRpY2VzKSwgY29sX2luZGljZXNdIDwtIGRhdGFbcm93X2luZGljZXMsIF0NCiAgfQ0KICANCiAgIyBTZXQgY29sdW1uIG5hbWVzIHRvIHJlcGVhdCBvcmlnaW5hbCBuYW1lcyB3aXRob3V0IHN1ZmZpeGVzDQogIGNvbF9uYW1lcyA8LSByZXAoY29sbmFtZXMoZGF0YSksIGdyb3VwaW5nX2ZhY3RvcikNCiAgY29sbmFtZXMocmVzaGFwZWRfZGF0YSkgPC0gY29sX25hbWVzDQogIA0KICByZXR1cm4ocmVzaGFwZWRfZGF0YSkNCn0NCg0KDQoNCg0KIyMjIFdJRFRIUw0KIyMgVW5zcGVjaWZpZWQgd2lkdGhzDQoNCiMgRnVuY3Rpb24gdG8gZm9ybWF0IHRhYmxlIHdpdGggdW5zcGVjaWZpZWQsIGF1dG9tYXRpYyBjb2x1bW4gd2lkdGhzDQpmb3JtYXRfeW95Y29sb3JfdW5zcGVjaWZpZWRfd2lkdGggPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfeW95Y29sb3JfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAgbnVtX2NvbHVtbnMgPC0gbmNvbChkYXRhKSAjIENoZWNrIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZGF0YSBmcmFtZQ0KICAgIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lICMgRGlzcGxheSB0aGUgdGFibGUgd2l0aCBhdXRvbWF0aWMgd2lkdGhzDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgICMgTGV0IGNvbHVtbnMgYWRhcHQgYXV0b21hdGljYWxseQ0KfQ0KDQojIyBVbnNwZWNpZmllZCBXaWR0aHMgR3JvdXBlZA0KIyBGdW5jdGlvbiB0byBmb3JtYXQgdGFibGUgd2l0aCBkeW5hbWljYWxseSByZXNoYXBlZCBjb2x1bW5zIGFuZCB1bnNwZWNpZmllZCB3aWR0aA0KZm9ybWF0X3lveWNvbG9yX3Vuc3BlY2lmaWVkX3dpZHRoX2dyb3VwZWQgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwsIGdyb3VwaW5nX2ZhY3RvciA9IDIpIHsNCiAgZGF0YSA8LSBmb3JtYXRfeW95Y29sb3JfZGF0YShkYXRhKSAgIyBBcHBseSBkYXRhIGZvcm1hdHRpbmcNCiAgZGF0YSA8LSByZXNoYXBlX2dyb3VwZWRfY29sdW1ucyhkYXRhLCBncm91cGluZ19mYWN0b3IpICAjIFJlc2hhcGUgZGF0YSB3aXRoIGdyb3VwZWQgY29sdW1ucw0KICANCiAgIyBVc2Uga25pdHI6OmthYmxlIGFuZCBrYWJsZUV4dHJhIHRvIHN0eWxlIHRoZSB0YWJsZQ0KICBrYWJsZV9vdXRwdXQgPC0ga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAgIyBMZXQgY29sdW1ucyBhZGFwdCBhdXRvbWF0aWNhbGx5DQogIA0KICByZXR1cm4oa2FibGVfb3V0cHV0KQ0KfQ0KDQojIEV4YW1wbGUgdXNhZ2UNCiMgZm9ybWF0X3lveWNvbG9yX3Vuc3BlY2lmaWVkX3dpZHRoX2dyb3VwZWQobnJ0JGNwaV9yYXcsIGNhcHRpb24gPSAiQ29uc3VtZXIgUHJpY2UgSW5kZXggKDE5MTMtMjAyNCkiLCBncm91cGluZ19mYWN0b3IgPSAzKQ0KDQoNCg0KIyMgRXF1YWwgV2lkdGhzDQoNCiMgRnVuY3Rpb24gdG8gZm9ybWF0IHRhYmxlIHdpdGggZXF1YWwgd2lkdGggY29sdW1ucw0KZm9ybWF0X3lveWNvbG9yX2VxdWFsX3dpZHRoIDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X3lveWNvbG9yX2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIG51bV9jb2x1bW5zIDwtIG5jb2woZGF0YSkgIyBHZXQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBkYXRhIGZyYW1lDQogIGNvbHVtbl93aWR0aCA8LSAxMDAgLyBudW1fY29sdW1ucyAjIENhbGN1bGF0ZSBlcXVhbCB3aWR0aCBhcyBhIHBlcmNlbnRhZ2UNCiAgDQogICMgVXNlIGtuaXRyOjprYWJsZSBhbmQga2FibGVFeHRyYSB0byBzdHlsZSB0aGUgdGFibGUNCiAga2FibGVfb3V0cHV0IDwtIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkNCiAgDQogICMgQXBwbHkgZXF1YWwgd2lkdGggdG8gZWFjaCBjb2x1bW4gdXNpbmcgY29sdW1uX3NwZWMNCiAgZm9yIChpIGluIDE6bnVtX2NvbHVtbnMpIHsNCiAgICBrYWJsZV9vdXRwdXQgPC0ga2FibGVfb3V0cHV0ICU+JQ0KICAgICAgY29sdW1uX3NwZWMoaSwgd2lkdGggPSBwYXN0ZTAoY29sdW1uX3dpZHRoLCAiJSIpKQ0KICB9DQogIA0KICByZXR1cm4oa2FibGVfb3V0cHV0KQ0KfQ0KDQojIyBFcXVhbCBXaWR0aHMgR3JvdXBlZCAgDQoNCiMgRnVuY3Rpb24gdG8gZm9ybWF0IHRhYmxlIHdpdGggZHluYW1pY2FsbHkgcmVzaGFwZWQgY29sdW1ucyBhbmQgZXF1YWwgd2lkdGgNCmZvcm1hdF95b3ljb2xvcl9lcXVhbF93aWR0aF9ncm91cGVkIDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMLCBncm91cGluZ19mYWN0b3IgPSAyKSB7DQogIGRhdGEgPC0gZm9ybWF0X3lveWNvbG9yX2RhdGEoZGF0YSkgICMgQXBwbHkgZGF0YSBmb3JtYXR0aW5nDQogIGRhdGEgPC0gcmVzaGFwZV9ncm91cGVkX2NvbHVtbnMoZGF0YSwgZ3JvdXBpbmdfZmFjdG9yKSAgIyBSZXNoYXBlIGRhdGEgd2l0aCBncm91cGVkIGNvbHVtbnMNCiAgDQogICMgQ2FsY3VsYXRlIGVxdWFsIHdpZHRoIGFzIGEgcGVyY2VudGFnZQ0KICBudW1fY29sdW1ucyA8LSBuY29sKGRhdGEpDQogIGNvbHVtbl93aWR0aCA8LSAxMDAgLyBudW1fY29sdW1ucw0KICANCiAgIyBVc2Uga25pdHI6OmthYmxlIGFuZCBrYWJsZUV4dHJhIHRvIHN0eWxlIHRoZSB0YWJsZQ0KICBrYWJsZV9vdXRwdXQgPC0ga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKQ0KICANCiAgIyBBcHBseSBlcXVhbCB3aWR0aCB0byBlYWNoIGNvbHVtbiB1c2luZyBjb2x1bW5fc3BlYw0KICBmb3IgKGkgaW4gMTpudW1fY29sdW1ucykgew0KICAgIGthYmxlX291dHB1dCA8LSBrYWJsZV9vdXRwdXQgJT4lDQogICAgICBjb2x1bW5fc3BlYyhpLCB3aWR0aCA9IHBhc3RlMChjb2x1bW5fd2lkdGgsICIlIikpDQogIH0NCiAgDQogIHJldHVybihrYWJsZV9vdXRwdXQpDQp9DQoNCg0KDQojIyBQcmVkZWZpbmVkIGZ1bmN0aW9uIGZvciAyLWNvbHVtbiB0YWJsZXMNCg0KIyBGdW5jdGlvbiBmb3IgMi1jb2x1bW4gdGFibGU6IENvbHVtbiAxID0gMS80LCBDb2x1bW4gMiA9IDMvNA0KZm9ybWF0X3lveWNvbG9yXzJjb2xfMV80XzNfNCA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF95b3ljb2xvcl9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjI1JSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjc1JSIpDQp9DQoNCiMgRnVuY3Rpb24gZm9yIDItY29sdW1uIHRhYmxlOiBDb2x1bW4gMSA9IDMvNCwgQ29sdW1uIDIgPSAxLzQNCmZvcm1hdF95b3ljb2xvcl8yY29sXzNfNF8xXzQgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfeW95Y29sb3JfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICI3NSUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICIyNSUiKQ0KfQ0KDQojIEZ1bmN0aW9uIGZvciAyLWNvbHVtbiB0YWJsZTogQ29sdW1uIDEgPSAxLzMsIENvbHVtbiAyID0gMi8zDQpmb3JtYXRfeW95Y29sb3JfMmNvbF8xXzNfMl8zIDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X3lveWNvbG9yX2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMzMuMzMlIikgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiNjYuNjclIikNCn0NCg0KIyBGdW5jdGlvbiBmb3IgMi1jb2x1bW4gdGFibGU6IENvbHVtbiAxID0gMi8zLCBDb2x1bW4gMiA9IDEvMw0KZm9ybWF0X3lveWNvbG9yXzJjb2xfMl8zXzFfMyA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF95b3ljb2xvcl9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjY2LjY3JSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjMzLjMzJSIpDQp9DQojIEZ1bmN0aW9uIGZvciAyLWNvbHVtbiB0YWJsZSB3aXRoIGVxdWFsIHdpZHRoICg1MCUgZWFjaCkNCmZvcm1hdF95b3ljb2xvcl8yY29sX2VxdWFsIDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X3lveWNvbG9yX2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiNTAlIikgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiNTAlIikNCn0NCg0KIyMgUHJlZGVmaW5lZCBmdW5jdGlvbiBmb3IgMy1jb2x1bW4gdGFibGVzDQoNCiMgRnVuY3Rpb24gZm9yIDMtY29sdW1uIHRhYmxlOiBDb2x1bW4gMSA9IDIvNCwgQ29sdW1ucyAyIGFuZCAzID0gMS80IGVhY2gNCmZvcm1hdF95b3ljb2xvcl8zY29sXzJfNF8xXzRfMV80IDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X3lveWNvbG9yX2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiNTAlIikgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiMjUlIikgJT4lDQogICAgY29sdW1uX3NwZWMoMywgd2lkdGggPSAiMjUlIikNCn0NCg0KIyBGdW5jdGlvbiBmb3IgMy1jb2x1bW4gdGFibGU6IENvbHVtbiAyID0gMi80LCBDb2x1bW5zIDEgYW5kIDMgPSAxLzQgZWFjaA0KZm9ybWF0X3lveWNvbG9yXzNjb2xfMV80XzJfNF8xXzQgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfeW95Y29sb3JfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICIyNSUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICI1MCUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9ICIyNSUiKQ0KfQ0KDQojIEZ1bmN0aW9uIGZvciAzLWNvbHVtbiB0YWJsZTogQ29sdW1uIDMgPSAyLzQsIENvbHVtbnMgMSBhbmQgMiA9IDEvNCBlYWNoDQpmb3JtYXRfeW95Y29sb3JfM2NvbF8xXzRfMV80XzJfNCA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF95b3ljb2xvcl9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjI1JSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjI1JSIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gIjUwJSIpDQp9DQoNCiMgRnVuY3Rpb24gZm9yIDMtY29sdW1uIHRhYmxlOiBDb2x1bW4gMSA9IDEvNywgQ29sdW1ucyAyIGFuZCAzID0gMy83IGVhY2gNCmZvcm1hdF95b3ljb2xvcl8zY29sXzFfN18zXzdfM183IDwtIGZ1bmN0aW9uKGRhdGEsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X3lveWNvbG9yX2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAxLzcpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gMy83KSAlPiUNCiAgICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9IDMvNykNCn0NCg0KDQojIEZ1bmN0aW9uIGZvciAzLWNvbHVtbiB0YWJsZTogQ29sdW1uIDIgPSAxLzcsIENvbHVtbnMgMSBhbmQgMyA9IDMvNyBlYWNoDQpmb3JtYXRfeW95Y29sb3JfM2NvbF8zXzdfMV83XzNfNyA8LSBmdW5jdGlvbihkYXRhLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF95b3ljb2xvcl9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gMy83KSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9IDEvNykgJT4lDQogICAgY29sdW1uX3NwZWMoMywgd2lkdGggPSAzLzcpDQp9DQoNCg0KIyBGdW5jdGlvbiBmb3IgMy1jb2x1bW4gdGFibGU6IENvbHVtbiAzID0gMS83LCBDb2x1bW5zIDEgYW5kIDIgPSAzLzcgZWFjaA0KZm9ybWF0X3lveWNvbG9yXzNjb2xfM183XzNfN18xXzcgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfeW95Y29sb3JfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9IDMvNykgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAzLzcpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gMS83KQ0KfQ0KDQoNCiMgRnVuY3Rpb24gZm9yIDMtY29sdW1uIHRhYmxlIHdpdGggZXF1YWwgd2lkdGggKDMzLjMzJSBlYWNoKQ0KZm9ybWF0X3lveWNvbG9yXzNjb2xfZXF1YWwgPC0gZnVuY3Rpb24oZGF0YSwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfeW95Y29sb3JfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICIzMy4zMyUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICIzMy4zMyUiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9ICIzMy4zMyUiKQ0KfQ0KDQoNCiMjIE1hbnVhbGx5IFNwZWNpZmllZCBXaWR0aHMgDQoNCiMgRnVuY3Rpb24gZm9yIDQtY29sdW1uIHRhYmxlIHdpdGggY3VzdG9taXphYmxlIGNvbHVtbiB3aWR0aHMgDQpmb3JtYXRfeW95Y29sb3JfNGNvbF9jdXN0b21fd2lkdGhzIDwtIGZ1bmN0aW9uKGRhdGEsIGNvbDFfd2lkdGggPSAiMzBlbSIsIGNvbDJfd2lkdGggPSAiMTBlbSIsIGNvbDNfd2lkdGggPSAiMzBlbSIsIGNvbDRfd2lkdGggPSAiMzBlbSIsIGNhcHRpb24gPSBOVUxMKSB7DQogIGRhdGEgPC0gZm9ybWF0X3lveWNvbG9yX2RhdGEoZGF0YSkgIyBBcHBseSBmb3JtYXR0aW5nDQogIGtuaXRyOjprYWJsZShkYXRhLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSBjYXB0aW9uLCBlc2NhcGUgPSBGQUxTRSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gVFJVRSkgJT4lDQogICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSBjb2wxX3dpZHRoKSAlPiUNCiAgICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9IGNvbDJfd2lkdGgpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gY29sM193aWR0aCkgJT4lDQogICAgY29sdW1uX3NwZWMoMywgd2lkdGggPSBjb2w0X3dpZHRoKQ0KfQ0KDQojIEZ1bmN0aW9uIGZvciAzLWNvbHVtbiB0YWJsZSB3aXRoIGN1c3RvbWl6YWJsZSBjb2x1bW4gd2lkdGhzIA0KZm9ybWF0X3lveWNvbG9yXzNjb2xfY3VzdG9tX3dpZHRocyA8LSBmdW5jdGlvbihkYXRhLCBjb2wxX3dpZHRoID0gIjMwZW0iLCBjb2wyX3dpZHRoID0gIjEwZW0iLCBjb2wzX3dpZHRoID0gIjMwZW0iLCBjYXB0aW9uID0gTlVMTCkgew0KICBkYXRhIDwtIGZvcm1hdF95b3ljb2xvcl9kYXRhKGRhdGEpICMgQXBwbHkgZm9ybWF0dGluZw0KICBrbml0cjo6a2FibGUoZGF0YSwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gY2FwdGlvbiwgZXNjYXBlID0gRkFMU0UpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gY29sMV93aWR0aCkgJT4lDQogICAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSBjb2wyX3dpZHRoKSAlPiUNCiAgICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9IGNvbDNfd2lkdGgpDQp9DQoNCiMgRnVuY3Rpb24gZm9yIDItY29sdW1uIHRhYmxlIHdpdGggY3VzdG9taXphYmxlIGNvbHVtbiB3aWR0aHMNCmZvcm1hdF95b3ljb2xvcl8yY29sX2N1c3RvbV93aWR0aHMgPC0gZnVuY3Rpb24oZGF0YSwgY29sMV93aWR0aCA9ICIzMGVtIiwgY29sMl93aWR0aCA9ICIxMGVtIiwgY2FwdGlvbiA9IE5VTEwpIHsNCiAgZGF0YSA8LSBmb3JtYXRfeW95Y29sb3JfZGF0YShkYXRhKSAjIEFwcGx5IGZvcm1hdHRpbmcNCiAga25pdHI6OmthYmxlKGRhdGEsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IGNhcHRpb24sIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9IGNvbDFfd2lkdGgpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gY29sMl93aWR0aCkNCn0NCg0KDQojIyBFWEFNUExFIFVTQUdFUyANCg0KIyBFeGFtcGxlIHVzYWdlIHdpdGggc3BlY2lmaWMgd2lkdGhzDQojIGZvcm1hdF95b3ljb2xvcl8zY29sX2N1c3RvbV93aWR0aHMoY3BpX3Jhd19zdW1tYXJ5LCBjb2wxX3dpZHRoID0gIjI1ZW0iLCBjb2wyX3dpZHRoID0gIjE1ZW0iLCBjb2wzX3dpZHRoID0gIjI1ZW0iKQ0KDQoNCiMgRXhhbXBsZSB1c2FnZToNCiMgQXNzdW1pbmcgYG15X2RhdGFgIGlzIHlvdXIgZGF0YSBmcmFtZQ0KDQojIFVzZSBlcXVhbCB3aWR0aCBmb3JtYXQgDQojIGZvcm1hdF95b3ljb2xvcl9lcXVhbF93aWR0aChteV9kYXRhKQ0KDQojIEFzc3VtaW5nIGBucnQkY3BpX3Jhd2AgaXMgeW91ciBkYXRhIGZyYW1lDQojIFVzZSBlcXVhbCB3aWR0aCBmb3JtYXQgd2l0aCBtdWx0aXBsZSBzZXRzIG9mIGEgZ3JvdXBlZCBjb2x1bW5zICANCiMgZm9ybWF0X3lveWNvbG9yX2VxdWFsX3dpZHRoX2dyb3VwZWQobnJ0JGNwaV9yYXcsIGNhcHRpb24gPSAiQ29uc3VtZXIgUHJpY2UgSW5kZXggKDE5MTMtMjAyNCkiLCBncm91cGluZ19mYWN0b3IgPSAyKSAgIyBEb3VibGVzIGNvbHVtbnMNCiMgZm9ybWF0X3lveWNvbG9yX2VxdWFsX3dpZHRoX2dyb3VwZWQobnJ0JGNwaV9yYXcsIGNhcHRpb24gPSAiQ29uc3VtZXIgUHJpY2UgSW5kZXggKDE5MTMtMjAyNCkiLCBncm91cGluZ19mYWN0b3IgPSAzKSAgIyBUcmlwbGVzIGNvbHVtbnMNCg0KIyBBc3N1bWluZyBgbnJ0JGNwaV9yYXdgIGlzIHlvdXIgZGF0YSBmcmFtZQ0KIyBVc2UgVW5zcGVjaWZpZWQgZm9ybWF0IHdpdGggbXVsdGlwbGUgc2V0cyBvZiBhIGdyb3VwZWQgY29sdW1ucyAgDQojIGZvcm1hdF95b3ljb2xvcl91bnNwZWNpZmllZF93aWR0aF9ncm91cGVkKG5ydCRjcGlfcmF3LCBjYXB0aW9uID0gIkNvbnN1bWVyIFByaWNlIEluZGV4ICgxOTEzLTIwMjQpIiwgZ3JvdXBpbmdfZmFjdG9yID0gMykNCg0KDQojIFVzZSAyLWNvbHVtbiBmb3JtYXQgd2l0aCBDb2x1bW4gMSBhcyAxLzQgYW5kIENvbHVtbiAyIGFzIDMvNA0KIyBmb3JtYXRfeW95Y29sb3JfMmNvbF8xXzRfM180KG15X2RhdGEpDQoNCiMgVXNlIDItY29sdW1uIGZvcm1hdCB3aXRoIGVxdWFsIHdpZHRoDQojIGZvcm1hdF95b3ljb2xvcl8yY29sX2VxdWFsKG15X2RhdGEpDQoNCiMgVXNlIDMtY29sdW1uIGZvcm1hdCB3aXRoIGVxdWFsIHdpZHRoDQojIGZvcm1hdF95b3ljb2xvcl8zY29sX2VxdWFsKG15X2RhdGEpDQoNCg0KIyBBZGQgYWRkaXRpb25hbCBmdW5jdGlvbnMgYXMgbmVlZGVkIGZvciBvdGhlciBjb25maWd1cmF0aW9ucw0KYGBgDQoNCg0KDQo8IS0tDQojIyBDb2xvcnMgKFVuaXZlcnNhbCkNCg0KVGhpcyBzZWN0aW9uIGRlZmluZXMgYSB1bml2ZXJzYWwgY29sb3IgcGFsZXR0ZSB0aGF0IHdpbGwgYmUgdXNlZCB0aHJvdWdob3V0IHRoZSBkb2N1bWVudCBmb3IgY29uc2lzdGVudCBzdHlsaW5nIGFjcm9zcyBwbG90cyBhbmQgdGFibGVzLiBCeSBkZWZpbmluZyBjb2xvcnMgYXQgYSBnbG9iYWwgbGV2ZWwsIGl0IGVuc3VyZXMgdW5pZm9ybSBhZXN0aGV0aWNzIGFjcm9zcyB2aXN1YWxpemF0aW9ucywgaW1wcm92aW5nIHRoZSBvdmVyYWxsIGNvaGVyZW5jZSBhbmQgcmVhZGFiaWxpdHkgb2YgdGhlIHJlcG9ydC4gVGhlIGNvbG9ycyBhcmUgb2Z0ZW4gYXNzaWduZWQgdG8gc3BlY2lmaWMgY2F0ZWdvcmllcyBvciB2YXJpYWJsZXMgaW4gcGxvdHMuDQotLT4NCg0KYGBge3IgY29sb3JzX2dlbmVyYWwsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyMgR0VORVJBTCBDT0xPUlMgTElTVA0KIyBDcmVhdGUgYSBsaXN0IG9mIGJvbGQsIGRpc3RpbmN0IGNvbG9ycw0KIyBVbml2ZXJzYWwgc2V0dGluZyBvZiBjb2xvcnMgbGlzdCB0byBhc3NpZ24gdmFsdWVzIGZvciBwbG90cyBhbmQgZ3JhcGhzDQoNCmNvbG9yc19nZW5lcmFsIDwtIGMoDQogICIjMWY3N2I0IiwgICMgQm9sZCBCbHVlDQogICIjZmY3ZjBlIiwgICMgQm9sZCBPcmFuZ2UNCiAgIiMyY2EwMmMiLCAgIyBCb2xkIEdyZWVuDQogICIjZDYyNzI4IiwgICMgQm9sZCBSZWQNCiAgIiM5NDY3YmQiLCAgIyBCb2xkIFB1cnBsZQ0KICAiI2JjYmQyMiIsICAjIEJvbGQgWWVsbG93LUdyZWVuDQogICIjMTdiZWNmIiwgICMgQm9sZCBDeWFuDQogICIjZTM3N2MyIiwgICMgQm9sZCBQaW5rDQogICIjOGM1NjRiIiwgICMgQm9sZCBCcm93bg0KICAiI2M1YjBkNSIsICAjIFNvZnQgTGF2ZW5kZXINCiAgIiNmN2I2ZDIiLCAgIyBTb2Z0IFBpbmsNCiAgIiNmZmJiNzgiLCAgIyBTb2Z0IFBlYWNoDQogICIjOThkZjhhIiwgICMgU29mdCBHcmVlbg0KICAiI2ZmOTg5NiIsICAjIFNvZnQgUmVkDQogICIjYWVjN2U4IiwgICMgU29mdCBCbHVlDQogICIjYzQ5Yzk0IiwgICMgU29mdCBCcm93bg0KICAiI2RiZGI4ZCIsICAjIFNvZnQgWWVsbG93DQogICIjOWVkYWU1IiAgICMgU29mdCBDeWFuDQogICkNCg0KY29sb3JzX2dlbmVyYWxfZGFyayA8LSBjKA0KICAiIzFhNWI4YSIsICAjIERhcmsgQmx1ZQ0KICAiI2NjNjYwMCIsICAjIERhcmsgT3JhbmdlDQogICIjMjM3YjIzIiwgICMgRGFyayBHcmVlbg0KICAiI2E2MjAyMCIsICAjIERhcmsgUmVkDQogICIjNmQ0YjhjIiwgICMgRGFyayBQdXJwbGUNCiAgIiM5YTliMWIiLCAgIyBEYXJrIFllbGxvdy1HcmVlbg0KICAiIzEzOWI5ZiIsICAjIERhcmsgQ3lhbg0KICAiI2IzNjE5YSIsICAjIERhcmsgUGluaw0KICAiIzZiNDQzOCIsICAjIERhcmsgQnJvd24NCiAgIiM5YTg3YTUiLCAgIyBEYXJrIExhdmVuZGVyDQogICIjYjg3Mjk2IiwgICMgRGFyayBQaW5rDQogICIjY2M5MTVjIiwgICMgRGFyayBQZWFjaA0KICAiIzZhOGI1YSIsICAjIERhcmsgR3JlZW4NCiAgIiNjYzY2NjQiLCAgIyBEYXJrIFJlZA0KICAiIzcxODVhOCIsICAjIERhcmsgQmx1ZQ0KICAiIzhiNmU2ZCIsICAjIERhcmsgQnJvd24NCiAgIiNhMTlhNTkiLCAgIyBEYXJrIFllbGxvdw0KICAiIzZiOTY5YiIgICAjIERhcmsgQ3lhbg0KKQ0KDQpjb2xvcnNfcmVmZXJlbmNlIDwtIGMoDQogIA0KICAjIExpZ2h0IEdyZWVuIFZhcmlhbnRzDQogICJtZWRpdW1zcHJpbmdncmVlbiIsICMgLSAjMDBGQTlBIChSR0IoMCwgMjUwLCAxNTQpKQ0KICAic3ByaW5nZ3JlZW4iLCAjIC0gIzAwRkY3RiAoUkdCKDAsIDI1NSwgMTI3KSkNCiAgImNoYXJ0cmV1c2UiLCAjIC0gIzdGRkYwMCAoUkdCKDEyNywgMjU1LCAwKSkNCiAgImdyZWVueWVsbG93IiwgIyAtICNBREZGMkYgKFJHQigxNzMsIDI1NSwgNDcpKQ0KICAicGFsZWdyZWVuIiwgIyAtICM5OEZCOTggKFJHQigxNTIsIDI1MSwgMTUyKSkNCiAgImxpZ2h0Z3JlZW4iLCAjIC0gIzkwRUU5MCAoUkdCKDE0NCwgMjM4LCAxNDQpKQ0KICAiaG9uZXlkZXciLCAjIC0gI0YwRkZGMCAoUkdCKDI0MCwgMjU1LCAyNDApKQ0KICAibWludGNyZWFtIiwgIyAtICNGNUZGRkEgKFJHQigyNDUsIDI1NSwgMjUwKSkNCg0KICAjIExpZ2h0IFllbGxvdyBWYXJpYW50cyAgDQogICJsaWdodGdvbGRlbnJvZHllbGxvdyIsICMgLSAjRkFGQUQyIChSR0IoMjUwLCAyNTAsIDIxMCkpDQogICJsZW1vbmNoaWZmb24iLCAjIC0gI0ZGRkFDRCAoUkdCKDI1NSwgMjUwLCAyMDUpKQ0KICAibGlnaHR5ZWxsb3ciLCAjIC0gI0ZGRkZFMCAoUkdCKDI1NSwgMjU1LCAyMjQpKQ0KICAicGFwYXlhd2hpcCIsICMgLSAjRkZFRkQ1IChSR0IoMjU1LCAyMzksIDIxMykpDQogICJibGFuY2hlZGFsbW9uZCIsICMgLSAjRkZFQkNEIChSR0IoMjU1LCAyMzUsIDIwNSkpDQogICJtb2NjYXNpbiIsICMgLSAjRkZFNEI1IChSR0IoMjU1LCAyMjgsIDE4MSkpDQogICJjb3Juc2lsayIsICMgLSAjRkZGOERDIChSR0IoMjU1LCAyNDgsIDIyMCkpDQogICJiZWlnZSIsICMgLSAjRjVGNURDIChSR0IoMjQ1LCAyNDUsIDIyMCkpDQogIA0KICAjIExpZ2h0IFJlZCBHcmVlbiBWYXJpYW50cw0KICAibWlzdHlyb3NlIiwgIyAtICNGRkU0RTEgKFJHQigyNTUsIDIyOCwgMjI1KSkNCiAgInBpbmsiLCAjIC0gI0ZGQzBDQiAoUkdCKDI1NSwgMTkyLCAyMDMpKQ0KICAibGlnaHRwaW5rIiwgIyAtICNGRkI2QzEgKFJHQigyNTUsIDE4MiwgMTkzKSkNCiAgImxpZ2h0Y29yYWwiLCAjIC0gI0YwODA4MCAoUkdCKDI0MCwgMTI4LCAxMjgpKQ0KICAiaW5kaWFucmVkIiwgIyAtICNDRDVDNUMgKFJHQigyMDUsIDkyLCA5MikpDQogICJyb3N5YnJvd24iLCAjIC0gI0JDOEY4RiAoUkdCKDE4OCwgMTQzLCAxNDMpKQ0KICAiZGFya3NhbG1vbiIsICMgLSAjRTk5NjdBIChSR0IoMjMzLCAxNTAsIDEyMikpDQogICJzYWxtb24iICMgLSAjRkE4MDcyIChSR0IoMjUwLCAxMjgsIDExNCkpDQogICAgKQ0KDQojIFNldCBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkNCnNldC5zZWVkKDEyMykNCg0KDQpgYGANCg0KIyBBYm91dCBUaGlzIFJlcG9ydA0KDQpUaGlzIHJlcG9ydCBwcm92aWRlcyBhbmFseXNlcyBvZiBpbmZsYXRpb24gcmF0ZXMsIGFuZCBncm93dGggcmF0ZXMgYWNyb3NzIGZpbmFuY2lhbCBpbmRleGVzLCB3aXRoIHRoZSBmbGV4aWJpbGl0eSB0byBleHBsb3JlIHB1YmxpY2x5IHRyYWRlZCBzdG9ja3MgYW5kIEVURnMuIEl0IGV2YWx1YXRlcyB0aGVpciBoaXN0b3JpY2FsIHBlcmZvcm1hbmNlIG92ZXIgdGltZSwgcmVmaW5pbmcgZm9yIGFjY3VyYWN5IG9mIHByb2JhYmxlIGdyb3d0aCByYXRlcyBhbmQgaW5mbGF0aW9uIHRyZW5kcy4gSW4gdGhpcyByZXBvcnQsIHRoZSB0ZXJtICJpbmRleCIgaXMgdXNlZCBicm9hZGx5IGFuZCBtYXkgaW50ZXJjaGFuZ2VhYmx5IHJlZmVyIHRvIGEgYmVuY2htYXJrIGluZGV4IChlLmcuLCBTJlAgNTAwKSwgRVRGcywgbXV0dWFsIGZ1bmRzLCBvciBldmVuIGNvbGxlY3Rpb25zIG9mIGluZGl2aWR1YWwgcHVibGljbHkgdHJhZGVkIHN0b2Nrcywgc3VjaCBhcyBBcHBsZSBvciBNaWNyb3NvZnQsIHJlcHJlc2VudGluZyBzcGVjaWZpYyBtYXJrZXQgc2VnbWVudHMgb3IgaW52ZXN0bWVudCBzdHJhdGVnaWVzLiBJIGludGVuZCB0byBleHBhbmQgdGhlIGNvbXBhcmlzb25zIHdpdGggbGFyZ2UtY2FwIGNvbXBhbmllcyBhbmQgb3RoZXIgRVRGcywgc3VjaCBhcyB0aG9zZSB3aXRoaW4gUVFRIGFuZCB0aGUgUyZQIDUwMCBpdHNlbGYgKGUuZy4sIEFwcGxlLCBNaWNyb3NvZnQsIE5WSURJQSwgVW5pdGVkSGVhbHRoIEdyb3VwLCBBbWF6b24sIEJyb2FkY29tLCBhbmQgb3RoZXJzKSwgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIEVURnMuIA0KDQpJbmRleGVzIHNlcnZlIGFzIGJlbmNobWFya3MgZm9yIGEgdmFyaWV0eSBvZiBwdXJwb3Nlcywgc3VjaCBhcyBpbnZlc3RtZW50IGNvbXBhcmlzb25zLCBwb2xpY3kgdmFsdWF0aW9uLCBhbmQgc3RyYXRlZ2ljIGZpbmFuY2lhbCBwbGFubmluZy4gVGhlIHJlcG9ydCBhaW1zIHRvIGFzc2VzcyB0aGUgbG9uZy10ZXJtIHZpYWJpbGl0eSBhbmQgY29tcGFyYXRpdmUgcGVyZm9ybWFuY2Ugb2YgdGhlc2UgaW5kZXhlcyBpbiB0aGUgY29udGV4dCBvZiB2YWx1ZSBnZW5lcmF0aW9uLCBsaWtlIHZhcmlhYmxlIGFubnVpdGllcywgbXV0dWFsIGZ1bmRzLCBleGNoYW5nZS10cmFkZWQgZnVuZHMgKEVURnMpLCBzdHJ1Y3R1cmVkIG5vdGVzLCB0YXJnZXQtZGF0ZSBmdW5kcywgcmV0aXJlbWVudCBzYXZpbmdzIHBsYW5zIChlLmcuLCA0MDEoaylzKSwgYW5kIGVuZG93bWVudCBwb2xpY2llcy4gVGhlIFMmUCA1MDAsIFFRUSwgYW5kIEJsYWNrUm9jayBFbmR1cmEgaXMgdXRpbGl6ZWQgYXMgZXh0ZXJuYWwgaW5kZXhlcyBmb3IgYW4gSW5kZXhlZCBVbml2ZXJzYWwgTGlmZSAoSVVMKSBJbnN1cmFuY2UgUG9saWN5IHByb2R1Y3QgdGhhdCdzIGJlZW4gdW5kZXIgcmV2aWV3LiBJIHdvbuKAmXQgZGVsdmUgaW50byB0aGUgb3JpZ2lucyBvZiB0aGF0IGRlY2lzaW9uIG9yIGFib3V0IHRoZSBwb2xpY3kgaGVyZTsgdGhlIHByb2R1Y3QgaGFzIGl0cyBwcm9zIGFuZCBjb25z4oCUaXQgaXMsIGFmdGVyIGFsbCwgZGVzaWduZWQgdG8gYmUgc29sZC4gDQoNCjwhLS0NCiMgUERYIElVTCBXb3JrYm9vaw0KRm9yIFZpZXc6IGh0dHBzOi8vMWRydi5tcy94L3MhQXNZWVpBOW5MOGxmZ2NadUFOVlJsY0F2QmQyNWpnP2U9YlVNQVJvDQoNCiMjIE5hbWVkIFJhbmdlcw0KLS0+DQoNCmBgYHtyIHJlYWRfbmFtZWRfcmFuZ2VzLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCg0KIyBEZWZpbmUgZmlsZSBwYXRoDQpmaWxlX3BhdGhfaXVsd2IgPC0gIkM6Ly9Vc2Vycy8va2VuZHIvL09uZURyaXZlLy9Eb2N1bWVudHMvL0RhdGEgQW5hbHl0aWNzLy9Nci4gTWFya2V0Ly9QRFggSVVMIFJldmlldy54bHNtIg0KDQojIFJlYWQgdGhlICJOYW1lZCBSYW5nZXMiIHNoZWV0IGludG8gYSBkYXRhIGZyYW1lDQpuYW1lZF9yYW5nZXNfaXVsd2IgPC0gcmVhZF9leGNlbChmaWxlX3BhdGhfaXVsd2IsIHNoZWV0ID0gIk5hbWVkIFJhbmdlcyIpDQoNCiMgSW5pdGlhbGl6ZSBsaXN0cyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIG5hbWVkIHJhbmdlcw0KbnJ0IDwtIGxpc3QoKSAgIyBOYW1lZCBSYW5nZXMgRGF0YUZyYW1lcyAoVGFibGVzKQ0KbnJsIDwtIGxpc3QoKSAgICMgTmFtZWQgUmFuZ2VzIExpc3RzDQpucnYgPC0gbGlzdCgpICAgIyBOYW1lZCBSYW5nZXMgU2luZ2xlIFZhbHVlcyAoVmFsdWVzKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIHJvdyBpbiB0aGUgbmFtZWQgcmFuZ2VzIHRhYmxlDQpmb3IgKGkgaW4gMTpucm93KG5hbWVkX3Jhbmdlc19pdWx3YikpIHsNCiAgbmFtZSA8LSB0b2xvd2VyKG5hbWVkX3Jhbmdlc19pdWx3YiROYW1lW2ldKQ0KICByYW5nZSA8LSBuYW1lZF9yYW5nZXNfaXVsd2IkUmFuZ2VbaV0NCiAgdHlwZSA8LSBuYW1lZF9yYW5nZXNfaXVsd2IkVHlwZVtpXQ0KICANCiAgIyBDaGVjayB0aGUgdHlwZSBvZiBuYW1lZCByYW5nZSBhbmQgaGFuZGxlIGFjY29yZGluZ2x5DQogIGlmICh0eXBlID09ICJWYWx1ZSIpIHsNCiAgICAjIFJlYWQgdGhlIHNpbmdsZSB2YWx1ZSBmcm9tIHRoZSBzcGVjaWZpZWQgcmFuZ2UNCiAgICBzaW5nbGVfdmFsdWUgPC0gdHJ5Q2F0Y2goew0KICAgICAgcmVhZF9leGNlbChmaWxlX3BhdGhfaXVsd2IsIHJhbmdlID0gcmFuZ2UsIGNvbF9uYW1lcyA9IEZBTFNFKSAlPiUgDQogICAgICAgIHB1bGwoMSkgJT4lICAjIEFzc3VtaW5nIHRoZSBzaW5nbGUgdmFsdWUgaXMgaW4gdGhlIGZpcnN0IGNlbGwgb2YgdGhlIHJhbmdlDQogICAgICAgIGFzLmNoYXJhY3RlcigpDQogICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7DQogICAgICBtZXNzYWdlKHBhc3RlKCJFcnJvciByZWFkaW5nIHNpbmdsZSB2YWx1ZSBmcm9tIHJhbmdlOiIsIHJhbmdlKSkNCiAgICAgIE5BDQogICAgfSkNCiAgICANCiAgICAjIFN0b3JlIGFzIGEgY2hhcmFjdGVyIHZhbHVlIGluIG5ydiBmb3IgdmFsdWVzDQogICAgbnJ2W1tuYW1lXV0gPC0gc2luZ2xlX3ZhbHVlDQoNCiAgfSBlbHNlIGlmICh0eXBlID09ICJMaXN0Iikgew0KICAgICMgUmVhZCB0aGUgZGF0YSBhcyBhIGxpc3QgZnJvbSB0aGUgc3BlY2lmaWVkIHJhbmdlDQogICAgbGlzdF9kYXRhIDwtIHRyeUNhdGNoKHsNCiAgICAgIHJlYWRfZXhjZWwoZmlsZV9wYXRoX2l1bHdiLCByYW5nZSA9IHJhbmdlLCBjb2xfbmFtZXMgPSBGQUxTRSkgJT4lDQogICAgICAgIHB1bGwoMSkgICMgQXNzdW1pbmcgYSBzaW5nbGUtY29sdW1uIHJhbmdlIGZvciBsaXN0cw0KICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgew0KICAgICAgbWVzc2FnZShwYXN0ZSgiRXJyb3IgcmVhZGluZyBsaXN0IGZyb20gcmFuZ2U6IiwgcmFuZ2UpKQ0KICAgICAgTlVMTA0KICAgIH0pDQogICAgDQogICAgIyBTdG9yZSBhcyBhIHZlY3RvciBpbiBucmwgZm9yIGxpc3RzDQogICAgaWYgKCFpcy5udWxsKGxpc3RfZGF0YSkpIHsNCiAgICAgIG5ybFtbbmFtZV1dIDwtIGxpc3RfZGF0YQ0KICAgIH0NCg0KICB9IGVsc2UgaWYgKHR5cGUgPT0gIlRhYmxlIikgew0KICAgICMgUmVhZCB0aGUgZGF0YSBhcyBhIHRhYmxlIGZyb20gdGhlIHNwZWNpZmllZCByYW5nZQ0KICAgIHRhYmxlX2RhdGEgPC0gdHJ5Q2F0Y2goew0KICAgICAgcmVhZF9leGNlbChmaWxlX3BhdGhfaXVsd2IsIHJhbmdlID0gcmFuZ2UpDQogICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7DQogICAgICBtZXNzYWdlKHBhc3RlKCJFcnJvciByZWFkaW5nIHRhYmxlIGZyb20gcmFuZ2U6IiwgcmFuZ2UpKQ0KICAgICAgTlVMTA0KICAgIH0pDQogICAgDQogICAgIyBTdG9yZSBhcyBhIGRhdGEgZnJhbWUgaW4gbnJ0IGZvciB0YWJsZXMNCiAgICBpZiAoIWlzLm51bGwodGFibGVfZGF0YSkpIHsNCiAgICAgIG5ydFtbbmFtZV1dIDwtIHRhYmxlX2RhdGENCiAgICB9DQogIH0NCn0NCg0KIyBVc2FnZSBleGFtcGxlczoNCiMgRm9yIGEgIlZhbHVlIiB0eXBlIG5hbWVkIHJhbmdlLCBhY2Nlc3MgdGhlIHZhbHVlIHVzaW5nIGBucnYkeW91cl92YWx1ZV9uYW1lYA0KIyBGb3IgYSAiTGlzdCIgdHlwZSBuYW1lZCByYW5nZSwgYWNjZXNzIHRoZSBsaXN0IHVzaW5nIGBucmwkeW91cl9saXN0X25hbWVgDQojIEZvciBhICJUYWJsZSIgdHlwZSBuYW1lZCByYW5nZSwgYWNjZXNzIHRoZSBkYXRhIGZyYW1lIHVzaW5nIGBucnQkeW91cl90YWJsZV9uYW1lYA0KDQpgYGANCg0KPCEtLQ0KIyMgV29ya3NoZWV0cw0KDQpgYGB7ciBucnQkdGFibGVfb2ZfY29udGVudHNfbnIgLCBldmFsPVRSVUUsIHJlc3VsdHM9J21hcmt1cCcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY29sbmFtZXMobnJ0JHRhYmxlX29mX2NvbnRlbnRzX25yKVsyXSA8LSAiRVhQTEFOQVRJT04iIA0KaW50ZXJhY3RpdmVfcHJpbnQobnJ0JHRhYmxlX29mX2NvbnRlbnRzX25yKQ0KIyBWaWV3KG5ydCR0YWJsZV9vZl9jb250ZW50c19ucikNCmludGVyYWN0aXZlX3N0cihucnQkdGFibGVfb2ZfY29udGVudHNfbnIpDQoNCiMgRmlsdGVyIFRPQyBmb3IgZGlzcGxheSBieSBmaWx0ZXJpbmcgdG8gdGhlIHNwZWNpZmljIHJvd3MuDQpucnQkdGFibGVfb2ZfY29udGVudHNfbnJfZGlzcGxheSA8LSBucnQkdGFibGVfb2ZfY29udGVudHNfbnJbMToxOCwgXQ0KDQojIERpc3BsYXkgVGFibGUNCmZvcm1hdF91bnNwZWNpZmllZF93aWR0aChucnQkdGFibGVfb2ZfY29udGVudHNfbnJfZGlzcGxheSkNCg0KYGBgDQotLT4NCg0KIyBDUEkNCg0KVGhlIENQSSAoQ29uc3VtZXIgUHJpY2UgSW5kZXgpIGlzIGEgbWVhc3VyZSB0aGF0IGV4YW1pbmVzIHRoZSBhdmVyYWdlIGNoYW5nZSBpbiBwcmljZXMgb3ZlciB0aW1lIGZvciBhIGJhc2tldCBvZiBnb29kcyBhbmQgc2VydmljZXMgY29tbW9ubHkgcHVyY2hhc2VkIGJ5IGhvdXNlaG9sZHMsIHN1Y2ggYXMgZm9vZCwgY2xvdGhpbmcsIGFuZCB0cmFuc3BvcnRhdGlvbi4gQ1BJIGlzIG9mdGVuIHVzZWQgYXMgYW4gaW5kaWNhdG9yIG9mIGluZmxhdGlvbiwgYXMgaXQgcmVmbGVjdHMgaG93IG11Y2ggdGhlIGNvc3Qgb2YgbGl2aW5nIGhhcyBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkLiBJdCBpcyByZXBvcnRlZCBhcyBhIHBlcmNlbnRhZ2UsIHNob3dpbmcgdGhlIHJlbGF0aXZlIHByaWNlIGNoYW5nZSBmcm9tIG9uZSBwZXJpb2QgdG8gYW5vdGhlci4NCg0KIyMgSW5mbGF0aW9uIFRhcmdldHMgDQoNClRoZSBoaXN0b3JpY2FsIGluZmxhdGlvbiB0YXJnZXRzIGluIHRoZSBVLlMuIHJlZmxlY3QgdGhlIGV2b2x2aW5nIHByaW9yaXRpZXMgb2YgbW9uZXRhcnkgcG9saWN5LiBGcm9tIDE5MTMgdG8gdGhlIDE5NzBzLCB0aGUgRmVkZXJhbCBSZXNlcnZlIGRpZCBub3QgaGF2ZSBhbiBleHBsaWNpdCBpbmZsYXRpb24gdGFyZ2V0LCBmb2N1c2luZyBpbnN0ZWFkIG9uIGZpbmFuY2lhbCBzdGFiaWxpdHkgYW5kIGVjb25vbWljIGdyb3d0aC4gSW4gdGhlIDE5NznigJMxOTgwcywgdW5kZXIgUGF1bCBWb2xja2VyLCB0aGUgRmVkIHNoaWZ0ZWQgdG8gY29udHJvbGxpbmcgaW5mbGF0aW9uIHdpdGhvdXQgYSBmb3JtYWwgdGFyZ2V0LCBpbXBsaWNpdGx5IGFpbWluZyBmb3IgbG93IGluZmxhdGlvbi4gRHVyaW5nIHRoZSAxOTkwc+KAkzIwMTEsIGdsb2JhbCB0cmVuZHMgaW5mbHVlbmNlZCB0aGUgRmVkIHRvIGFsaWduIGluZm9ybWFsbHkgd2l0aCBhIDIlIGluZmxhdGlvbiB0YXJnZXQsIHRob3VnaCBpdCByZW1haW5lZCB1bm9mZmljaWFsLiBGaW5hbGx5LCBpbiAyMDEyLCB0aGUgRmVkZXJhbCBSZXNlcnZlIGZvcm1hbGx5IGFkb3B0ZWQgYSAyJSB0YXJnZXQsIHByaW9yaXRpemluZyBwcmljZSBzdGFiaWxpdHkgYW5kIG1heGltdW0gZW1wbG95bWVudCBhcyBwYXJ0IG9mIGl0cyBkdWFsIG1hbmRhdGUuIFRoaXMgZXZvbHV0aW9uIGhpZ2hsaWdodHMgdGhlIHRyYW5zaXRpb24gZnJvbSByZWFjdGl2ZSB0byBwcm9hY3RpdmUgaW5mbGF0aW9uIG1hbmFnZW1lbnQuDQoNClNvdXJjZXM6IA0KDQotIE1hdHRoZXcgV2VsbHMgKDIwMDQpLiAiVGhlIE9yaWdpbnMgb2YgdGhlIDIgUGVyY2VudCBJbmZsYXRpb24gVGFyZ2V0Ii4gRmVkZXJhbCBSZXNlcnZlIEJhbmsgb2YgUmljaG1vbmQuIGh0dHBzOi8vd3d3LnJpY2htb25kZmVkLm9yZy9wdWJsaWNhdGlvbnMvcmVzZWFyY2gvZWNvbl9mb2N1cy8yMDI0L3ExX3EyX2ZlZGVyYWxfcmVzZXJ2ZT91dG1fc291cmNlPWNoYXRncHQuY29tDQotIEFkYW0gU2hhcGlybyBhbmQgRGFuaWVsIEouIFdpbHNvbi4gICJUaGUgRXZvbHV0aW9uIG9mIHRoZSBGT01D4oCZcyBFeHBsaWNpdCBJbmZsYXRpb24gVGFyZ2V0Ii4gRlJCU0YgRWNvbm9taWMgTGV0dGVyIDIwMTktMTIgKEFwcmlsIDE1LCAyMDE5KS4gaHR0cHM6Ly93d3cuZnJic2Yub3JnL3Jlc2VhcmNoLWFuZC1pbnNpZ2h0cy9wdWJsaWNhdGlvbnMvZWNvbm9taWMtbGV0dGVyLzIwMTkvMDQvZXZvbHV0aW9uLW9mLWZvbWMtZXhwbGljaXQtaW5mbGF0aW9uLXRhcmdldC8/dXRtX3NvdXJjZT1jaGF0Z3B0LmNvbQ0KDQpgYGB7ciBoaXN0b3JpY2FsX2luZmxhdGlvbl90YXJnZXRzLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30NCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJ5DQpsaWJyYXJ5KGtuaXRyKQ0KDQojIENyZWF0ZSB0aGUgZGF0YSBmcmFtZSBmb3IgdGhlIGhpc3RvcmljYWwgaW5mbGF0aW9uIHRhcmdldA0KaW5mbGF0aW9uX3RhcmdldCA8LSBkYXRhLmZyYW1lKA0KICBQZXJpb2QgPSBjKCIxOTEz4oCTMTk3MHMiLCAiMTk3OeKAkzE5ODBzIiwgIjE5OTBz4oCTMjAxMSIsICIyMDEy4oCTUHJlc2VudCIpLA0KICBJbmZsYXRpb25fVGFyZ2V0ID0gYygiTm9uZSIsICJJbXBsaWNpdCAobG93IGluZmxhdGlvbikiLCAiSW1wbGljaXQgKH4yJSkiLCAiRm9ybWFsIDIlIFRhcmdldCIpLA0KICBQb2xpY3lfRm9jdXMgPSBjKA0KICAgICJGaW5hbmNpYWwgc3RhYmlsaXR5IGFuZCBlY29ub21pYyBncm93dGguIiwNCiAgICAiUHJpY2Ugc3RhYmlsaXR5IChWb2xja2VyJ3MgYW50aS1pbmZsYXRpb24gZm9jdXMpLiIsDQogICAgIkluZm9ybWFsIGFsaWdubWVudCB3aXRoIGdsb2JhbCAyJSB0YXJnZXRzLiIsDQogICAgIlByaWNlIHN0YWJpbGl0eSB3aXRoIGEgZHVhbCBtYW5kYXRlLiINCiAgKSwNCiAgU291cmNlID0gYygNCiAgICAiRmVkZXJhbCBSZXNlcnZlIEhpc3RvcmljYWwgT3ZlcnZpZXciLA0KICAgICJGZWRlcmFsIFJlc2VydmUgTW9uZXRhcnkgUG9saWN5IEhpc3RvcnkiLA0KICAgICJJbXBsaWNpdCB0cmVuZCBpbiBnbG9iYWwgbW9uZXRhcnkgcG9saWN5IiwNCiAgICAiRmVkZXJhbCBSZXNlcnZlICgyMDEyIGFubm91bmNlbWVudCkiDQogICkNCikNCg0KIyBQcmludCB0aGUgdGFibGUNCmZvcm1hdF91bnNwZWNpZmllZF93aWR0aChpbmZsYXRpb25fdGFyZ2V0LCBjYXB0aW9uID0gIkhpc3RvcmljYWwgSW5mbGF0aW9uIFRhcmdldHMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMiKQ0KDQoNCmBgYA0KDQojIyBHbG9zc2FyeSANCg0KYGBge3IgbnJ0JGNwaV9tZXRhfQ0KDQpmb3JtYXRfMmNvbF9jdXN0b21fd2lkdGhzKG5ydCRjcGlfbWV0YSwgY29sMV93aWR0aCA9ICIxMGVtIiwgY29sMl93aWR0aCA9ICI1MGVtIikNCg0KYGBgDQoNCg0KIyMgQ1BJIElSDQoNCiMjIyBEYXRhDQoNClRoZSBDb25zdW1lciBQcmljZSBJbmRleCAoQ1BJKSBkYXRhIHByZXNlbnRlZCBoZXJlIGlzIHNvdXJjZWQgZnJvbSB0aGUgVS5TLiBCdXJlYXUgb2YgTGFib3IgU3RhdGlzdGljcyAoQkxTKS4gVW5sZXNzIG90aGVyd2lzZSBub3RlZCwgdGhlIGFuYWx5c2lzIGJlZ2lucyB3aXRoIGRhdGEgZnJvbSAxOTEzLiBUaGUgIkFubnVhbCBJbmZsYXRpb24gUmF0ZXMiIChhbHNvIHJlZmVycmVkIHRvIGFzIHRoZSAiMS1ZZWFyIENBSVIiKSBpcyBkZXJpdmVkIGRpcmVjdGx5IGZyb20gdGhlIENQSSBkYXRhYmFzZSBwcmlvciB0byBhbnkgYWRkaXRpb25hbCBkYXRhIHByb2Nlc3NpbmcuIEVhY2ggQW5udWFsIEluZmxhdGlvbiBSYXRlcyByZXByZXNlbnRzIHRoZSBhdmVyYWdlIG9mIHRoZSAxMiBtb250aGx5IHBlcmNlbnRhZ2UgY2hhbmdlcyAoZnJvbSBKYW51YXJ5IHRvIERlY2VtYmVyKSBmb3IgdGhlIGdpdmVuIHllYXIuIEZvciBtb3JlIGNvbXByZWhlbnNpdmUgZGV0YWlscyBhbmQgYWRkaXRpb25hbCByYXRlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVmZXIgdG8gdGhlIEJMUyB3ZWJzaXRlLg0KDQpEYXRhIFNvdXJjZTogYHIgbnJ2JHNvdXJjZV9jcGlfYmxzYA0KDQpgYGB7ciBucnQkY3BpX3JhdywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShsdWJyaWRhdGUpICAjIEZvciBkYXRlIG1hbmlwdWxhdGlvbg0KbGlicmFyeShzY2FsZXMpICAgICAjIEZvciBwZXJjZW50YWdlIGZvcm1hdHRpbmcNCg0KIyBDb252ZXJ0IERhdGUgdG8gWVlZWSBmb3JtYXQsIGNoZWNrIGlmIGAxLVllYXIgQ0FJUmAgaXMgYWxyZWFkeSBhIHBlcmNlbnRhZ2UsDQojIGFuZCBzb3J0IERhdGUgZnJvbSBuZXdlc3QgdG8gb2xkZXN0DQpucnQkY3BpX3JhdyA8LSBucnQkY3BpX3JhdyAlPiUNCiAgbXV0YXRlKA0KICAgIERhdGUgPSBhcy5EYXRlKGFzLmNoYXJhY3RlcihEYXRlKSwgZm9ybWF0ID0gIiVZIiksICAjIENvbnZlcnQgRGF0ZSB0byBEYXRlIGZvcm1hdA0KICAgIGAxLVllYXIgQ0FJUmAgPSBpZmVsc2UoDQogICAgICBncmVwbCgiJSIsIGAxLVllYXIgQ0FJUmApLCAgIyBDaGVjayBpZiBhbHJlYWR5IGZvcm1hdHRlZCBhcyBhIHBlcmNlbnRhZ2UNCiAgICAgIGAxLVllYXIgQ0FJUmAsICAjIEtlZXAgYXMtaXMgaWYgYWxyZWFkeSBhIHBlcmNlbnRhZ2UNCiAgICAgIHBlcmNlbnQoYXMubnVtZXJpYyhgMS1ZZWFyIENBSVJgKSwgYWNjdXJhY3kgPSAwLjAxKSAgIyBGb3JtYXQgYXMgcGVyY2VudGFnZSBpZiBub3QNCiAgICApDQogICkgJT4lDQogIGFycmFuZ2UoZGVzYyhEYXRlKSkgJT4lICAjIFNvcnQgYnkgRGF0ZSBmcm9tIG5ld2VzdCB0byBvbGRlc3QNCiAgbXV0YXRlKA0KICAgIERhdGUgPSBmb3JtYXQoRGF0ZSwgIiVZIikgICMgQ29udmVydCBEYXRlIGJhY2sgdG8gIllZWVkiIGNoYXJhY3RlciBmb3JtYXQgZm9yIGRpc3BsYXkNCiAgKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gbWluKG5ydCRjcGlfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChucnQkY3BpX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIERpc3BsYXkgdGhlIGZvcm1hdHRlZCBkYXRhDQppbnRlcmFjdGl2ZV9zdHIobnJ0JGNwaV9yYXcpDQppbnRlcmFjdGl2ZV9wcmludChucnQkY3BpX3JhdykNCmludGVyYWN0aXZlX3ByaW50KG5ydCRjcGlfbWV0YSkNCg0KIyBEaXNwbGF5IHRoZSB0YWJsZSB3aXRoIGNhcHRpb24NCmNhdCgiXG5cbiMjIyMgQW5udWFsIEluZmxhdGlvbiBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF9lcXVhbF93aWR0aF9ncm91cGVkKG5ydCRjcGlfcmF3LCBncm91cGluZ19mYWN0b3IgPSAyKQ0KIyBjYXQoIlxuXG4gU291cmNlOiAiLCBucnYkc291cmNlX2NwaV9ibHMsICJcbiIpDQoNCmBgYA0KDQojIyMgU3VtbWFyeQ0KDQpgYGB7ciBjcGlfcmF3X3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpYmJsZSkNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgQXNzdW1pbmcgeW91ciBkYXRhIGZyYW1lIGlzIG5hbWVkICducnQkY3BpX3JhdycgYW5kIGhhcyBjb2x1bW5zICdEYXRlJyBhbmQgJzEtWWVhciBDQUlSJw0KIyBDb252ZXJ0ICdEYXRlJyB0byBudW1lcmljIGFuZCAnMS1ZZWFyIENBSVInIHRvIG51bWVyaWMsIHJlbW92aW5nIGFueSBub24tbnVtZXJpYyBjaGFyYWN0ZXJzDQpucnQkY3BpX3JhdyA8LSBucnQkY3BpX3JhdyAlPiUNCiAgbXV0YXRlKA0KICAgIERhdGUgPSBhcy5udW1lcmljKERhdGUpLA0KICAgIGAxLVllYXIgQ0FJUmAgPSBhcy5udW1lcmljKGdzdWIoIlteMC05Li1dIiwgIiIsIGAxLVllYXIgQ0FJUmApKQ0KICApDQoNCiMgU29ydCBkYXRhIGJ5IERhdGUgaW4gYXNjZW5kaW5nIG9yZGVyDQpucnQkY3BpX3JhdyA8LSBucnQkY3BpX3JhdyAlPiUNCiAgYXJyYW5nZShEYXRlKQ0KDQojIENhbGN1bGF0ZSB0aGUgQ0FJUiB2YWx1ZSBhbmQgZHluYW1pY2FsbHkgY3JlYXRlIGEgdmFyaWFibGUgbmFtZSB3aXRoIHRoZSBmb3JtYXQgY3BpX2NhaXJfdmFsdWVfczxtaW5feWVhcj5fZTxtYXhfeWVhcj4NCmluaXRpYWxfdmFsdWUgPC0gMTAwICAjIEFzc3VtaW5nIGFuIGluaXRpYWwgaW5kZXggdmFsdWUgb2YgMTAwDQpmaW5hbF92YWx1ZSA8LSBpbml0aWFsX3ZhbHVlICogcHJvZCgxICsgbnJ0JGNwaV9yYXckYDEtWWVhciBDQUlSYCAvIDEwMCwgbmEucm0gPSBUUlVFKQ0KbWluX3llYXIgPC0gbWluKG5ydCRjcGlfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChucnQkY3BpX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQpudW1feWVhcnMgPC0gbWF4X3llYXIgLSBtaW5feWVhcg0KY2Fpcl92YWx1ZSA8LSByb3VuZCgoKGZpbmFsX3ZhbHVlIC8gaW5pdGlhbF92YWx1ZSleKDEgLyBudW1feWVhcnMpIC0gMSkgKiAxMDAsIDIpDQp2YXJfbmFtZSA8LSBwYXN0ZTAoImNwaV9jYWlyX3ZhbHVlX3MiLCBtaW5feWVhciwgIl9lIiwgbWF4X3llYXIpDQphc3NpZ24odmFyX25hbWUsIGNhaXJfdmFsdWUpDQoNCiMgRXhhbXBsZSBDUEkgZGF0YSAocmVwbGFjZSB3aXRoIHlvdXIgZGF0YSBmcmFtZSkNCiMgbnJ0JGNwaV9yYXcgPC0gZGF0YS5mcmFtZShgQW5udWFsIEluZmxhdGlvbiBSYXRlc2AgPSBjKDEuNSwgMi4xLCAzLjAsIC4uLikpDQp0YXJnZXRfdmFsdWUgPC0gMiAgIyBTZXQgdGhlIHRhcmdldCByYXRlLCBlLmcuLCAyJQ0KDQojIENvbnZlcnQgQ1BJIGRhdGEgdG8gbnVtZXJpYywgcmVtb3ZpbmcgYW55IHBlcmNlbnRhZ2Ugc2lnbnMNCmRhdGEgPC0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIG5ydCRjcGlfcmF3JGAxLVllYXIgQ0FJUmApKQ0KDQojIENhbGN1bGF0ZSBzdGF0aXN0aWNzDQpjb3VudF9vYnNlcnZhdGlvbnMgPC0gc3VtKCFpcy5uYShkYXRhKSkNCm1lYW5fdmFsdWUgPC0gcm91bmQobWVhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0Kc2RfdmFsdWUgPC0gcm91bmQoc2QoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1pbl9jYWlyX3JhbmdlIDwtIHJvdW5kKGNhaXJfdmFsdWUgLSBzZF92YWx1ZSwgMikNCm1heF9jYWlyX3JhbmdlIDwtIHJvdW5kKGNhaXJfdmFsdWUgKyBzZF92YWx1ZSwgMikNCm1pbl92YWx1ZSA8LSByb3VuZChtaW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1heF92YWx1ZSA8LSByb3VuZChtYXgoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCg0KIyBUYXJnZXQgUmF0ZSBBbmFseXNpcw0KeWVhcnNfYWJvdmVfdGFyZ2V0IDwtIHN1bShkYXRhID4gdGFyZ2V0X3ZhbHVlLCBuYS5ybSA9IFRSVUUpDQp5ZWFyc19iZWxvd190YXJnZXQgPC0gc3VtKGRhdGEgPCB0YXJnZXRfdmFsdWUsIG5hLnJtID0gVFJVRSkNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0IDwtIHJvdW5kKCh5ZWFyc19hYm92ZV90YXJnZXQgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9iZWxvd190YXJnZXQgPC0gcm91bmQoKHllYXJzX2JlbG93X3RhcmdldCAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQoNCiMgQ29tcGlsZSBzdGF0aXN0aWNzIGludG8gYSBsaXN0IGZvciBlYXN5IGNvbnZlcnNpb24gdG8gYSBkYXRhIGZyYW1lIHdpdGggZGVmaW5pdGlvbnMNCmNwaV9yYXdfc3VtbWFyeSA8LSB0cmliYmxlKA0KICB+U3RhdGlzdGljLCB+VmFsdWUsIH5EZWZpbml0aW9uLA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiwgYXMuY2hhcmFjdGVyKGNvdW50X29ic2VydmF0aW9ucyksICJUb3RhbCBudW1iZXIgb2YgZGF0YSBwb2ludHMgY29sbGVjdGVkIG92ZXIgdGhlIHNwZWNpZmljIHBlcmlvZC4iLA0KICAiQ0FJUiIsIHBhc3RlMChjYWlyX3ZhbHVlLCAiJSIpLCAiQ29tcG91bmQgQXZlcmFnZSBJbmZsYXRpb24gUmF0ZTsgbWVhbiBpbmZsYXRpb24gcmF0ZSBvdmVyIGEgcGVyaW9kIGlmIGl0IGhhZCBjb21wb3VuZGVkIGFudWFsbHkuIiwNCiAgIk1lYW4iLCBwYXN0ZTAobWVhbl92YWx1ZSwgIiUiKSwgIlJlZmxlY3RzIHRoZSBnZW5lcmFsIHByaWNlIGxldmVsIGFuZCBvdmVyYWxsIGluZmxhdGlvbiByYXRlLiIsDQogICJNZWRpYW4iLCBwYXN0ZTAobWVkaWFuX3ZhbHVlLCAiJSIpLCAiTWlkZGxlIHZhbHVlIG9mIHRoZSBkYXRhIHdoZW4gb3JkZXJlZCBjaHJvbm9sb2dpY2FsbHk7IGNlbnRyYWwgdGVuZGVuY3kgbWVhc3VyZSBsZXNzIGFmZmVjdGVkIGJ5IGV4dHJlbWUgdmFsdWVzLiIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiwgcGFzdGUwKHNkX3ZhbHVlLCAiJSIpLCAiVGhlIGRpc3BlcnNpb24gb2YgdmFsdWVzIGZyb20gdGhlIG1lYW4sIGluZGljYXRpbmcgdGhlIHZvbGF0aWxpdHkgb2YgcHJpY2UgY2hhbmdlcyBhbmQgZWNvbm9taWMgc3RhYmlsaXR5LiIsDQogICJNaW4gQ0FJUiBSYW5nZSAoQ0FJUiAtIFNEKSIsIHBhc3RlMChtaW5fY2Fpcl9yYW5nZSwgIiUiKSwgIkxvd2VyIGJvdW5kYXJ5IG9mIGV4cGVjdGVkIENQSSByYW5nZTsgbG93ZXN0IGVzdGltYXRlIG9mIHR5cGljYWwgaW5mbGF0aW9uIHJhdGUgY29uc2lkZXJpbmcgbm9ybWFsIGZsdWN0dWF0aW9ucy4iLA0KICAiTWF4IENBSVIgUmFuZ2UgKENBSVIgKyBTRCkiLCBwYXN0ZTAobWF4X2NhaXJfcmFuZ2UsICIlIiksICJVcHBlciBib3VuZGFyeSBvZiBleHBlY3RlZCBDUEkgcmFuZ2U7IGhpZ2hlc3QgZXN0aW1hdGUgb2YgdHlwaWNhbCBpbmZsYXRpb24gcmF0ZSBjb25zaWRlcmluZyBub3JtYWwgZmx1Y3R1YXRpb25zLiIsDQogICJNaW5pbXVtIiwgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwgIkxvd2VzdCB2YWx1ZTsgaGlnaGxpZ2h0cyBwZXJpb2RzIG9mIG1pbmltYWwgaW5mbGF0aW9uIG9yIGRlZmxhdGlvbmFyeSB0cmVuZHMuIiwNCiAgIk1heGltdW0iLCBwYXN0ZTAobWF4X3ZhbHVlLCAiJSIpLCAiSGlnaGVzdCB2YWx1ZTsgaGlnaGxpZ2h0cyBwZXJpb2RzIG9mIHBlYWsgaW5mbGF0aW9uYXJ5IHByZXNzdXJlcy4iLA0KICAiQWJvdmUgMi4wIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldCwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgcGVyaW9kcyB3aGVyZSBpbmZsYXRpb24gZXhjZWVkZWQgdGhlIDIuMCUgdGFyZ2V0LCBpbmRpY2F0aW5nIGhpZ2hlci10aGFuLWRlc2lyZWQgaW5mbGF0aW9uLiIsDQogICJCZWxvdyAyLjAgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYmVsb3dfdGFyZ2V0LCAiJSIpLCAiUGVyY2VudGFnZSBvZiBwZXJpb2RzIHdoZXJlIGluZmxhdGlvbiB3YXMgYmVsb3cgdGhlIDIuMCUgdGFyZ2V0LCBzdWdnZXN0aW5nIHBvdGVudGlhbCBkZWZsYXRpb25hcnkgcHJlc3N1cmVzIG9yIGluc3VmZmljaWVudCBpbmZsYXRpb24uIg0KKQ0KDQojIENvbnZlcnQgdG8gY2hhcmFjdGVyIHRvIGF2b2lkIGF1dG9tYXRpYyBkZWNpbWFsIHBvaW50cyBvbiB3aG9sZSBudW1iZXJzDQpjcGlfcmF3X3N1bW1hcnkgPC0gY3BpX3Jhd19zdW1tYXJ5ICU+JQ0KICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgYXMuY2hhcmFjdGVyKSkNCg0KIyBEaXNwbGF5IGZvcm1hdHRlZCB0YWJsZQ0KIyBVc2UgY2F0KCkgd2l0aCBzZXAgPSAiIiB0byBhdm9pZCBzcGFjZXMgYmV0d2VlbiBlbGVtZW50cw0KY2F0KCJcblxuIyMjIyBBbm51YWwgSW5mbGF0aW9uIFJhdGUgU3VtbWFyeSAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF8zY29sX2N1c3RvbV93aWR0aHMoY3BpX3Jhd19zdW1tYXJ5LCBjb2wxX3dpZHRoID0gIjIwZW0iLCBjb2wyX3dpZHRoID0gIjEwZW0iLCBjb2wzX3dpZHRoID0gIjQwZW0iKSANCg0KIyBWaWV3KGNwaV9yYXdfc3VtbWFyeSkNCmludGVyYWN0aXZlX3N0cihjcGlfcmF3X3N1bW1hcnkpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBDQUlSIFZhbHVlIFNpbmNlIEltcGxpY2l0IDIlIFRhcmdldA0KDQojIENhbGN1bGF0ZSB0aGUgQ0FJUiB2YWx1ZSBmcm9tIHNwZWNpZmljIHN0YXJ0LWRhdGUsIGFuZCBkeW5hbWljYWxseSBjcmVhdGUgYSB2YXJpYWJsZSBuYW1lIHdpdGggdGhlIGZvcm1hdCBjcGlfY2Fpcl92YWx1ZV9zPG1pbl95ZWFyX3NwZWNpZmljPl9lPG1heF95ZWFyX3NwZWNpZmljPg0KIyBEZWZpbmUgdGhlIHNwZWNpZmljIHN0YXJ0IHllYXIgZm9yIHRoZSBpbXBsaWNpdCAyJSB0YXJnZXQNCm1pbl95ZWFyX3NwZWNpZmljIDwtIDE5OTANCm1heF95ZWFyX3NwZWNpZmljIDwtIG1heChucnQkY3BpX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQoNCiMgRmlsdGVyIHRoZSBkYXRhIHRvIGluY2x1ZGUgb25seSBkYXRlcyBmcm9tIG1pbl95ZWFyX3NwZWNpZmljIG9ud2FyZA0KZmlsdGVyZWRfZGF0YSA8LSBucnQkY3BpX3Jhd1tucnQkY3BpX3JhdyREYXRlID49IG1pbl95ZWFyX3NwZWNpZmljLCBdDQoNCiMgQ2FsY3VsYXRlIHRoZSBDQUlSIHVzaW5nIHRoZSBmaWx0ZXJlZCBkYXRhDQppbml0aWFsX3ZhbHVlIDwtIDEwMCAgIyBBc3N1bWluZyBhbiBpbml0aWFsIGluZGV4IHZhbHVlIG9mIDEwMA0KZmluYWxfdmFsdWUgPC0gaW5pdGlhbF92YWx1ZSAqIHByb2QoMSArIGZpbHRlcmVkX2RhdGEkYDEtWWVhciBDQUlSYCAvIDEwMCwgbmEucm0gPSBUUlVFKQ0KbnVtX3llYXJzIDwtIG1heF95ZWFyX3NwZWNpZmljIC0gbWluX3llYXJfc3BlY2lmaWMNCmNhaXJfdmFsdWVfc3BlY2lmaWMgPC0gcm91bmQoKChmaW5hbF92YWx1ZSAvIGluaXRpYWxfdmFsdWUpXigxIC8gbnVtX3llYXJzKSAtIDEpICogMTAwLCAyKQ0KDQojIER5bmFtaWNhbGx5IGNyZWF0ZSB0aGUgdmFyaWFibGUgbmFtZQ0KdmFyX25hbWUgPC0gcGFzdGUwKCJjcGlfY2Fpcl92YWx1ZV9zIiwgbWluX3llYXJfc3BlY2lmaWMsICJfZSIsIG1heF95ZWFyX3NwZWNpZmljKQ0KDQojIEFzc2lnbiB0aGUgY2FsY3VsYXRlZCBDQUlSIHZhbHVlIHRvIHRoZSBkeW5hbWljYWxseSBjcmVhdGVkIHZhcmlhYmxlDQphc3NpZ24odmFyX25hbWUsIGNhaXJfdmFsdWVfc3BlY2lmaWMpDQoNCiMgRGlzcGxheSB0aGUgY2FsY3VsYXRlZCBDQUlSIHZhbHVlDQppbnRlcmFjdGl2ZV9wcmludChjYWlyX3ZhbHVlX3NwZWNpZmljKQ0KDQojIENQSSBDQUlSIFNwZWNpZmljIFZhbHVlcw0KIyBjcGlfY2Fpcl92YWx1ZV9zMTkxM19lMjAyMw0KIyBjcGlfY2Fpcl92YWx1ZV9zMTk5MF9lMjAyMw0KDQpgYGANCg0KVGhlIGFubnVhbCBpbmZsYXRpb24gcmF0ZSAoYHIgY3BpX2NhaXJfdmFsdWVfczE5MTNfZTIwMjNgJSkgaXMgYHIgaWYoY3BpX2NhaXJfdmFsdWVfczE5MTNfZTIwMjMgPCBtZWFuX3ZhbHVlKSAibG93ZXIgdGhhbiIgZWxzZSBpZihjcGlfY2Fpcl92YWx1ZV9zMTkxM19lMjAyMyA+IG1lYW5fdmFsdWUpICJoaWdoZXIgdGhhbiIgZWxzZSAiZXF1YWwgdG8iYCBtZWFuIGluZmxhdGlvbiByYXRlIChgciBtZWFuX3ZhbHVlYCUpLCByZWZsZWN0aW5nIGByIGlmKGNwaV9jYWlyX3ZhbHVlX3MxOTEzX2UyMDIzIDwgbWVhbl92YWx1ZSkgInNob3J0LXRlcm0gdm9sYXRpbGl0eSBhbmQgaW5mbGF0aW9uIHNwaWtlcyIgZWxzZSBpZihjcGlfY2Fpcl92YWx1ZV9zMTkxM19lMjAyMyA+IG1lYW5fdmFsdWUpICJzaG9ydC10ZXJtIHZvbGF0aWxpdHkgYW5kIGRlZmxhdGlvbiBkcm9wcyIgZWxzZSAiYWJzZW5jZSBvZiBub3RpY2VhYmxlIHNwaWtlcyBhdCBmaXJzdCBnbGFuY2UiYC4gVGhlIGFubnVhbCBpbmZsYXRpb24gcmF0ZSAoYHIgY3BpX2NhaXJfdmFsdWVfczE5MTNfZTIwMjNgJSkgaXMgYHIgaWYoY3BpX2NhaXJfdmFsdWVfczE5MTNfZTIwMjMgPCBtZWRpYW5fdmFsdWUpICJsb3dlciB0aGFuIiBlbHNlIGlmKGNwaV9jYWlyX3ZhbHVlX3MxOTEzX2UyMDIzID4gbWVkaWFuX3ZhbHVlKSAiaGlnaGVyIHRoYW4iIGVsc2UgImVxdWFsIHRvImAgbWVhbiBpbmZsYXRpb24gcmF0ZSAoYHIgbWVkaWFuX3ZhbHVlYCUpLCBpbmRpY2F0aW5nIHRoYXQgc3VzdGFpbmVkIHBlcmlvZHMgYHIgaWYoY3BpX2NhaXJfdmFsdWVfczE5MTNfZTIwMjMgPCBtZWRpYW5fdmFsdWUpICJvZiBhYm92ZS1tZWRpYW4gaW5mbGF0aW9uIGV4ZXJ0ZWQgY3VtdWxhdGl2ZSBkb3duYXJkIiBlbHNlIGlmKGNwaV9jYWlyX3ZhbHVlX3MxOTEzX2UyMDIzID4gbWVkaWFuX3ZhbHVlKSAib2YgYmVsb3ctbWVkaWFuIGluZmxhdGlvbiBleGVydGVkIGN1bXVsYXRpdmUgdXB3YXJkIiBlbHNlICJvZiBpbmZsYXRpb24gZG9lc24ndCBpbml0aWFsbHkgYXBwZWFyIHRvIGhhdmUgYW55ImAgcHJlc3N1cmUgb24gcHJpY2UgbGV2ZWxzLiBUaGlzIHJlbGF0aW9uc2hpcCBzaWduYWxzIGEgZGlzdHJpYnV0aW9uIHdpdGggbm90YWJsZSBleHRyZW1lcyBvbiB0aGUgaGlnaGVyIGVuZCAocG9zaXRpdmUgc2tld25lc3MpIHdoaWxlIGVtcGhhc2l6aW5nIHRoYXQgdGhlIGxvbmctdGVybSBjb21wb3VuZGVkIGVmZmVjdCBpcyBtb3JlIHJlcHJlc2VudGF0aXZlIG9mIHRoZSBvdmVyYWxsIGVjb25vbWljIHRyZW5kIHRoYW4gZWl0aGVyIHRoZSBtZWFuIG9yIHRoZSBtZWRpYW4gYWxvbmUuIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYHIgc2RfdmFsdWVgJSByZWZsZWN0cyBzaWduaWZpY2FudCB2b2xhdGlsaXR5LCB3aXRoIGluZmxhdGlvbiByYXRlcyByYW5naW5nIGZyb20gYSBkZWZsYXRpb25hcnkgbG93IG9mIGByIG1pbl92YWx1ZWAlIHRvIGEgcGVhayBvZmByIG1heF92YWx1ZWAlLCBhbmQgYW4gZXhwZWN0ZWQgcmFuZ2Ugb2YgYHIgbWluX2NhaXJfcmFuZ2VgJSB0byBgciBtYXhfY2Fpcl9yYW5nZWAlIHdoZW4gYWNjb3VudGluZyBmb3IgdHlwaWNhbCBmbHVjdHVhdGlvbnMuIE5vdGFibHksIGluZmxhdGlvbiBleGNlZWRlZCB0aGUgMiUgdGFyZ2V0IGluIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0YCUgb2YgdGhlIHllYXJzLCBpbmRpY2F0aW5nIGluZmxhdGlvbmFyeSBwcmVzc3VyZXMsIHdoaWxlIHJlbWFpbmluZyBiZWxvdyB0aGUgdGFyZ2V0IGluIGByIHBlcmNlbnRfYmVsb3dfdGFyZ2V0YCUgb2YgdGhlIG9ic2VydmF0aW9ucywgc2lnbmFsaW5nIGRlZmxhdGlvbmFyeSB0cmVuZHMgb3Igd2Vha2VyIGluZmxhdGlvbi4NCg0KVGhlIGByIGNwaV9jYWlyX3ZhbHVlX3MxOTEzX2UyMDIzYCUgQ0FJUiBmcm9tIGByIG1pbl95ZWFyYCB0byBgciBtYXhfeWVhcmAgcmVmbGVjdHMgdGhlIGluZmx1ZW5jZSBvZiBtYWpvciBoaXN0b3JpY2FsIGV2ZW50cyB0aGF0IGNhdXNlZCBzaWduaWZpY2FudCBpbmZsYXRpb24sIGluY2x1ZGluZyBXb3JsZCBXYXJzLCB0aGUgR3JlYXQgRGVwcmVzc2lvbiwgYW5kIHRoZSAxOTcwcyBvaWwgY3Jpc2VzLiBJbiBjb250cmFzdCwgdGhlIGByIGNwaV9jYWlyX3ZhbHVlX3MxOTkwX2UyMDIzYCUgQ0FJUiwgbWVhc3VyZWQgc2luY2UgdGhlIDE5OTAgZW5hY3RtZW50IG9mIHRoZSBJbXBsaWNpdCAyJSBUYXJnZXQsIGlzIG5vdGFibHkgbG93ZXIuIFdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgMjAyMiBpbmZsYXRpb24gcmF0ZSBvZiA4LjAlLCByYXRlcyBhZnRlciAxOTkwIGhhdmUgc3RheWVkIHdpdGhpbiB0aGUgZXhwZWN0ZWQgcmFuZ2Ugb2YgYHIgbWluX2NhaXJfcmFuZ2VgJSB0byBgciBtYXhfY2Fpcl9yYW5nZWAlLiANCg0KIyMjIEdyYXBoDQoNCmBgYHtyIG5ydCRjcGlfcmF3X2dyYXBoLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KaW50ZXJhY3RpdmVfc3RyKG5ydCRjcGlfcmF3KQ0KIyBFbnN1cmUgYDEtWWVhciBDQUlSYCBpcyBudW1lcmljDQpucnQkY3BpX3JhdyA8LSBucnQkY3BpX3JhdyAlPiUNCiAgbXV0YXRlKGAxLVllYXIgQ0FJUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDEtWWVhciBDQUlSYCkpKQ0KDQojIERlZmluZSBgbnJ0X2xvbmdgIGlmIG5lY2Vzc2FyeSAodXNlIG9yaWdpbmFsIGBucnQkY3BpX3Jhd2AgZm9yIHNpbXBsaWNpdHkgaGVyZSkNCm5ydF9sb25nIDwtIG5ydCRjcGlfcmF3ICAjIElmIHJlc2hhcGluZyBpcyB1bm5lY2Vzc2FyeSwgdGhpcyBtYWtlcyBpdCBlcXVpdmFsZW50IHRvIG5ydCRjcGlfcmF3DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIobnJ0JGNwaV9yYXckRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKG5ydCRjcGlfcmF3JERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihucnQkY3BpX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobnJ0JGNwaV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDE5MTMNCmVuZF95ZWFyIDwtIDIwMjMNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkFubnVhbCBJbmZsYXRpb24gUmF0ZXMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkNQSSBBbm51YWwgSW5mbGF0aW9uIFJhdGVzIGZvciBBbGwgVXJiYW4gQ29uc3VtZXJzLCBEYXRhIFBlcmlvZCAoIiwgbWluX3llYXIsICLigJMiLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnQkY3BpX3JhdywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gYDEtWWVhciBDQUlSYCkpICsNCiAgDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IG1pbl9jYWlyX3JhbmdlLCB5bWF4ID0gbWF4X2NhaXJfcmFuZ2UpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gbWluX2NhaXJfcmFuZ2UpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSBtYXhfY2Fpcl9yYW5nZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcywgcG9pbnRzLCBhbmQgYW5ub3RhdGlvbnMgb24gdG9wIG9mIHNoYWRlZCBhcmVhcw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjApICsgICAgICAgIyBEYXJrIHB1cnBsZSBsaW5lIA0KICBnZW9tX3BvaW50KGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS41KSArICAgICAgICAjIERhcmsgcHVycGxlIHBvaW50cyANCiAgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF92YWx1ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1pbl9jYWlyX3JhbmdlLCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWF4X2NhaXJfcmFuZ2UsIGNvbG9yID0gImRhcmtncmVlbiIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWlyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfdmFsdWUsIGxhYmVsID0gIlRhcmdldCIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBtaW5fY2Fpcl9yYW5nZSwgbGFiZWwgPSAiTWluIENBSVIiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtncmVlbiIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG1heF9jYWlyX3JhbmdlLCBsYWJlbCA9ICJNYXggQ0FJUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fpcl92YWx1ZSwgbGFiZWwgPSAiQ0FJUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIA0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiSW5mbGF0aW9uIFJhdGUgKCUpIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICkgKw0KICANCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIpLCAjIFJlc3RyaWN0cyB4LWF4aXMgZGF0YSANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkgIyBTZXRzIE1ham9yIHgtYXhpcyAgDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAgICAgICAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAjIGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiKSAgIyBNaW5vciB4IGdyaWQgbGluZXMgZm9yIGVhY2ggeWVhcg0KICAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImRhcmtncmV5IiwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSAgIyBEYXJrIGJvcmRlciBhcm91bmQgdGhlIHBsb3QNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIyBQUklOVCBXLyBZLUFYSVMgQU5OT1RBVElPTlMNCiMgRGVmaW5lIHRoZSB5LXBvc2l0aW9uIGZvciBhbm5vdGF0aW9ucyBzbGlnaHRseSBiZWxvdyB0aGUgbWluaW11bSB5LWF4aXMgbGltaXQNCmFubm90YXRpb25feV9wb3NpdGlvbiA8LSBtaW4obnJ0JGNwaV9yYXckYDEtWWVhciBDQUlSYCwgbmEucm0gPSBUUlVFKSAtIDENCg0KIyBEZWZpbmUgbWlsZXN0b25lIHllYXJzDQptaWxlc3RvbmVfeWVhcnMgPC0gYygxOTEzLCAxOTc5LCAxOTkwLCAyMDEyKQ0KDQojIEFkZCB2ZXJ0aWNhbCBsaW5lcyBhdCBtaWxlc3RvbmUgeWVhcnMNCnAxICsNCiAgIyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtaWxlc3RvbmVfeWVhcnMsIGNvbG9yID0gImRhcmtncmV5IiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDAuNSkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxOTEzLCB5ID0gYW5ub3RhdGlvbl95X3Bvc2l0aW9uLCBsYWJlbCA9ICIxOTEzIE5vIFRhcmdldCIsIA0KICAgICAgICAgICBoanVzdCA9IDAuMTAsIHZqdXN0ID0gMC41MCwgYW5nbGUgPSA5MCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMykgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxOTE4LCB5ID0gYW5ub3RhdGlvbl95X3Bvc2l0aW9uLCBsYWJlbCA9ICIxOTE4IFBvc3QtV29ybGQgV2FyIEkiLCANCiAgICAgICAgICAgaGp1c3QgPSAwLjEwLCB2anVzdCA9IDAuNTAsIGFuZ2xlID0gOTAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDMpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTkzMiwgeSA9IGFubm90YXRpb25feV9wb3NpdGlvbiwgbGFiZWwgPSAiMTkzMlxuR3JlYXQgRGVwcmVzc2lvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDAuMTAsIHZqdXN0ID0gMC41MCwgYW5nbGUgPSA5MCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMykgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxOTM5LCB5ID0gYW5ub3RhdGlvbl95X3Bvc2l0aW9uLCBsYWJlbCA9ICIxOTM5IFdvcmxkIFdhciBJSSIsIA0KICAgICAgICAgICBoanVzdCA9IDAuMTAsIHZqdXN0ID0gMC41MCwgYW5nbGUgPSA5MCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMykgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxOTczLCB5ID0gYW5ub3RhdGlvbl95X3Bvc2l0aW9uLCBsYWJlbCA9ICIxOTcwcyBPaWwgQ3Jpc2VzIiwgDQogICAgICAgICAgIGhqdXN0ID0gMC4xMCwgdmp1c3QgPSAwLjUwLCBhbmdsZSA9IDkwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDE5NzksIHkgPSBhbm5vdGF0aW9uX3lfcG9zaXRpb24sIGxhYmVsID0gIjE5NzkgSW1wbGljaXQgTG93IFRhcmdldCIsIA0KICAgICAgICAgICBoanVzdCA9IDAuMTAsIHZqdXN0ID0gMC41MCwgYW5nbGUgPSA5MCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMykgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxOTgxLCB5ID0gYW5ub3RhdGlvbl95X3Bvc2l0aW9uLCBsYWJlbCA9ICIxOTgwcyBSZWNlc3Npb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAwLjEwLCB2anVzdCA9IDAuNTAsIGFuZ2xlID0gOTAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDMpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTk5MCwgeSA9IGFubm90YXRpb25feV9wb3NpdGlvbiwgbGFiZWwgPSAiMTk5MCBJbXBsaWNpdCAyJSBUYXJnZXQiLCANCiAgICAgICAgICAgaGp1c3QgPSAwLjEwLCB2anVzdCA9IDAuNTAsIGFuZ2xlID0gOTAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDMpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMjAxMiwgeSA9IGFubm90YXRpb25feV9wb3NpdGlvbiwgbGFiZWwgPSAiMjAxMiBGb3JtYWwgMiUgVGFyZ2V0IiwgDQogICAgICAgICAgIGhqdXN0ID0gMC4xMCwgdmp1c3QgPSAwLjUwLCBhbmdsZSA9IDkwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzKSArIA0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyMDIwLCB5ID0gYW5ub3RhdGlvbl95X3Bvc2l0aW9uLCBsYWJlbCA9ICIyMDIwIENPVklELTE5XG5QYW5kZW1pYyIsIA0KICAgICAgICAgICBoanVzdCA9IDAuMTAsIHZqdXN0ID0gMC41MCwgYW5nbGUgPSA5MCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMykgDQogIA0KDQpgYGANCg0KT3ZlciB0aGUgcGFzdCBjZW50dXJ5LCB0aGUgVS5TLiBDb25zdW1lciBQcmljZSBJbmRleCAoQ1BJKSBoYXMgZXhoaWJpdGVkIHNpZ25pZmljYW50IGZsdWN0dWF0aW9ucywgd2l0aCBub3RhYmxlIHBlYWtzIGR1cmluZyB0aGUgcG9zdC1Xb3JsZCBXYXIgSSBlcmEgYW5kIHRoZSAxOTcwcy4gVGhlIFUuUy4gQ29uc3VtZXIgUHJpY2UgSW5kZXggKENQSSkgaGFzIGV4cGVyaWVuY2VkIHNpZ25pZmljYW50IHBlYWtzIGR1ZSB0byB2YXJpb3VzIG1ham9yIGV2ZW50czoNCg0KLSBXb3JsZCBXYXIgSSAoMTkxNOKAkzE5MTgpOiBUaGUgQ1BJIHN1cmdlZCB0byBhcHByb3hpbWF0ZWx5IDE4JSBpbiAxOTE4LCBkcml2ZW4gYnkgaW5jcmVhc2VkIGdvdmVybm1lbnQgc3BlbmRpbmcgYW5kIHN1cHBseSBjb25zdHJhaW50cyBkdXJpbmcgdGhlIHdhci4NCi0gV29ybGQgV2FyIElJICgxOTM54oCTMTk0NSk6IEluZmxhdGlvbiByb3NlIGR1ZSB0byBoZWlnaHRlbmVkIGRlbWFuZCBhbmQgcHJvZHVjdGlvbiBsaW1pdGF0aW9ucywgbGVhZGluZyB0byBwcmljZSBjb250cm9scyBhbmQgcmF0aW9uaW5nIHRvIG1hbmFnZSB0aGUgZWNvbm9teS4NCi0gMTk3MHMgT2lsIENyaXNlczogVGhlIDE5NzMgYW5kIDE5Nzkgb2lsIGVtYmFyZ29lcyBsZWQgdG8gZW5lcmd5IHNob3J0YWdlcyBhbmQgc2t5cm9ja2V0aW5nIG9pbCBwcmljZXMsIGNhdXNpbmcgaW5mbGF0aW9uIHRvIHBlYWsgYXJvdW5kIDE0JSBpbiAxOTgwLg0KLSBFYXJseSAxOTgwcyBSZWNlc3Npb246IEluIHJlc3BvbnNlIHRvIGhpZ2ggaW5mbGF0aW9uLCB0aGUgRmVkZXJhbCBSZXNlcnZlIGluY3JlYXNlZCBpbnRlcmVzdCByYXRlcywgbGVhZGluZyB0byBhIHJlY2Vzc2lvbiBidXQgZXZlbnR1YWxseSBzdGFiaWxpemluZyBwcmljZXMuDQotIENPVklELTE5IFBhbmRlbWljICgyMDIw4oCTMjAyMSk6IFN1cHBseSBjaGFpbiBkaXNydXB0aW9ucyBhbmQgZWNvbm9taWMgc3RpbXVsdXMgbWVhc3VyZXMgY29udHJpYnV0ZWQgdG8gYSBzaWduaWZpY2FudCByaXNlIGluIGluZmxhdGlvbiwgd2l0aCB0aGUgQ1BJIHJlYWNoaW5nIGxldmVscyBub3Qgc2VlbiBpbiBkZWNhZGVzLg0KDQpIb3dldmVyLCBpbiByZWNlbnQgZGVjYWRlcywgdGhlc2UgaW5mbGF0aW9uYXJ5IHBlYWtzIGhhdmUgYmVjb21lIGxlc3MgcHJvbm91bmNlZCwgaW5kaWNhdGluZyBhIHRyZW5kIHRvd2FyZCBtb3JlIHN0YWJsZSBpbmZsYXRpb24gcmF0ZXMsIHNob3dpbmcgYSBuYXJyb3dpbmcgb2YgQ1BJIHZvbGF0aWxpdHkuIA0KDQojIyBDUEkgQ0FJUg0KDQojIyMgRGF0YQ0KDQpZb3UndmUgcHJvYmFibHkgc2VlbiBvciBoZWFyZCB0aGUgcGhyYXNlLCAiSWYgeW91IGhhZCBpbnZlc3RlZCAkMSwwMDAgaW4gW0NvbXBhbnkvU3RvY2sgTmFtZV0gYmFjayBpbiBbWWVhcl0sIHlvdXIgaW52ZXN0bWVudCB3b3VsZCBiZSB3b3J0aCBbQ3VycmVudCBWYWx1ZV0gdG9kYXkuIiBPciBwZXJoYXBzIHlvdSd2ZSB0aG91Z2h0IHRvIHlvdXJzZWxmLCAiSWYgSSBoYWQuLi4gSSB3b3VsZCBoYXZlLi4uIiBUaGlzIGlzIHRoZSByZXN1bHQgb2YgY3VtdWxhdGl2ZSBncm93dGggY2FwdHVyZWQgaW4gYSBzbmFwc2hvdC4gVGhlIEN1bXVsYXRpdmUgSW5mbGF0aW9uIFJhdGUgKENJUikgcmVwcmVzZW50cyB0aGUgdG90YWwgcGVyY2VudGFnZSBpbmNyZWFzZSBpbiBwcmljZXMgb3ZlciB0aW1lIGhvcml6b25zIG9mIDUsIDEwLCAyMCwgYW5kIDMwIHllYXJzLCByZWZsZWN0aW5nIHRoZSBsb25nLXRlcm0gY3VtdWxhdGl2ZSBpbXBhY3Qgb2YgaW5mbGF0aW9uIChlLmcuLCBhIDMwLXllYXIgQ0lSIG9mIDExMC43NiUgaW4gMjAyMykuDQoNCkluIGNvbnRyYXN0LCB0aGUgQ29tcG91bmQgQXZlcmFnZSBJbmZsYXRpb24gUmF0ZSAoQ0FJUikgcmVwcmVzZW50cyB0aGUgYXZlcmFnZSBhbm51YWxpemVkIGluZmxhdGlvbiByYXRlIG92ZXIgdGhlIHNhbWUgcGVyaW9kcywgc21vb3RoaW5nIHNob3J0LXRlcm0gZmx1Y3R1YXRpb25zIChlLmcuLCBhIDUteWVhciBDQUlSIG9mIDMuOTMlIGluIDIwMjMpLiBDb21wb3VuZCBhdmVyYWdlcyBhbGxvdyB1cyB0byBzdHVkeSB0aGUgYW5udWFsaXplZCByYXRlIHJlcXVpcmVkIHRvIGFjaGlldmUgdGhlIHNhbWUgdG90YWwgY3VtdWxhdGl2ZSBncm93dGgsIHByb3ZpZGluZyBhIGJhc2lzIGZvciBtYWtpbmcgZnV0dXJlIHByb2plY3Rpb25zIGdyb3VuZGVkIGluIHBhc3QgcGVyZm9ybWFuY2UuDQoNCmBgYHtyIG5ydCRjcGlfcmF3X2lyLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgICMgRm9yIGRhdGUgbWFuaXB1bGF0aW9uDQoNCiMgVXBkYXRlIGRhdGEgZnJhbWUgd2l0aCBwcm9wZXIgZGF0ZSBhbmQgcGVyY2VudGFnZSBoYW5kbGluZw0KbnJ0JGNwaV9yYXdfaXIgPC0gbnJ0JGNwaV9yYXdfaXIgJT4lDQogIG11dGF0ZSgNCiAgICBEYXRlID0gZm9ybWF0KGFzLkRhdGUoYXMuY2hhcmFjdGVyKERhdGUpLCBmb3JtYXQgPSAiJVkiKSwgIiVZIiksICAjIENvbnZlcnQgdG8gIllZWVkiIGNoYXJhY3RlciBmb3JtYXQNCiAgICBhY3Jvc3MoMjoxMCwgfiBpZmVsc2UoDQogICAgICBncmVwbCgiJSIsIC4pLCAgIyBDaGVjayBpZiB0aGUgdmFsdWUgYWxyZWFkeSBjb250YWlucyBhICIlIiBzeW1ib2wNCiAgICAgIC4sICAjIEtlZXAgYXMtaXMgaWYgaXQncyBhbHJlYWR5IGEgcGVyY2VudGFnZQ0KICAgICAgcGVyY2VudChhcy5udW1lcmljKC4pLCBhY2N1cmFjeSA9IDAuMDEpICAjIENvbnZlcnQgdG8gcGVyY2VudGFnZSBpZiBub3QNCiAgICApKQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoRGF0ZSkpICAjIFNvcnQgYnkgRGF0ZSBmcm9tIG5ld2VzdCB0byBvbGRlc3QNCg0KIyBDcmVhdGUgbnJ0JGNwaV9yYXdfaXI6IENJUg0KbnJ0JGNwaV9yYXdfY2lyIDwtIG5ydCRjcGlfcmF3X2lyICU+JQ0KICBzZWxlY3QoYERhdGVgLCBgMS1ZZWFyIENBSVJgLCBjb250YWlucyAoIkNJUiIpKQ0KDQojIENyZWF0ZSBucnQkY3BpX3Jhd19pcjogQ0FJUg0KbnJ0JGNwaV9yYXdfY2FpciA8LSBucnQkY3BpX3Jhd19pciAlPiUNCiAgc2VsZWN0KGBEYXRlYCwgYDEtWWVhciBDQUlSYCwgY29udGFpbnMgKCJDQUlSIikpDQoNCiMgRGlzcGxheSBib3RoIHRhYmxlcyBmb3IgY29uZmlybWF0aW9uDQppbnRlcmFjdGl2ZV9wcmludChucnQkY3BpX3Jhd19jaXIpDQppbnRlcmFjdGl2ZV9wcmludChucnQkY3BpX3Jhd19jYWlyKQ0KDQojIE9wdGlvbmFsOiBQcmludCB0YWJsZSBzdW1tYXJpZXMNCmludGVyYWN0aXZlX3N0cihucnQkY3BpX3Jhd19jaXIpDQppbnRlcmFjdGl2ZV9zdHIobnJ0JGNwaV9yYXdfY2FpcikNCg0KIyBEaXNwbGF5IGNhcHRpb25zIGZvciBlYWNoIHRhYmxlDQpjYXQoIlxuXG4jIyMjIEN1bXVsYXRpdmUgSW5mbGF0aW9uIFJhdGVzICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KZm9ybWF0X2VxdWFsX3dpZHRoKG5ydCRjcGlfcmF3X2NpcikNCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEluZmxhdGlvbiBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF9lcXVhbF93aWR0aChucnQkY3BpX3Jhd19jYWlyKQ0KDQojIFZpZXcobnJ0JGNwaV9yYXdfY2FpcikNCiMgY29sbmFtZXMobnJ0JGNwaV9yYXdfY2FpcikNCmludGVyYWN0aXZlX3N0cihucnQkY3BpX3Jhd19jYWlyKQ0KDQoNCmBgYA0KDQpWYWx1ZXMgIk5BIiBleGlzdHMgZm9yIHllYXJzIHdoZXJlIHRoZXJlIGlzIGluc3VmZmljaWVudCBhbW91bnQgb2YgZGF0YS4gRm9yIGV4YW1wbGUsIHNpbmNlIHRoZSBkYXRhc2V0IHN0YXJ0cyBpbiAxOTEzLCB0aGVyZSBpcyBub3QgZW5vdWdoIHllYXJzIGluIDE5MzAgdG8gY2FsY3VsYXRlIGZvciBhIDMwLVllYXIgQ0FJUi4gDQoNCiMjIyBTdW1tYXJ5DQoNCmBgYHtyIGNwaV9yYXdfY2Fpcl9zdW1tYXJ5LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWJibGUpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShlMTA3MSkgICMgZm9yIHNrZXduZXNzIGFuZCBrdXJ0b3Npcw0KDQojIERlZmluZSBhIGhlbHBlciBmdW5jdGlvbiB0byByZW1vdmUgIiUiIGFuZCBjb252ZXJ0IHRvIG51bWVyaWMNCmNsZWFuX3BlcmNlbnRhZ2UgPC0gZnVuY3Rpb24oY29sdW1uKSB7DQogIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2x1bW4pKQ0KfQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gbWluKG5ydCRjcGlfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChucnQkY3BpX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQoNCiMgQ2xlYW4gYW5kIGNvbnZlcnQgQ0FJUiBjb2x1bW5zIGFuZCAxLVllYXIgQ0FJUiB0byBudW1lcmljDQpucnQkY3BpX3Jhd19jYWlyIDwtIG5ydCRjcGlfcmF3X2NhaXIgJT4lDQogIG11dGF0ZSgNCiAgICBgMS1ZZWFyIENBSVJgID0gY2xlYW5fcGVyY2VudGFnZShgMS1ZZWFyIENBSVJgKSwNCiAgICBgNS1ZZWFyIENBSVJgID0gY2xlYW5fcGVyY2VudGFnZShgNS1ZZWFyIENBSVJgKSwNCiAgICBgMTAtWWVhciBDQUlSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDEwLVllYXIgQ0FJUmApLA0KICAgIGAyMC1ZZWFyIENBSVJgID0gY2xlYW5fcGVyY2VudGFnZShgMjAtWWVhciBDQUlSYCksDQogICAgYDMwLVllYXIgQ0FJUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAzMC1ZZWFyIENBSVJgKQ0KICApDQoNCiMgRGVmaW5lIHN0YXRpc3RpYyBuYW1lcyBleHBsaWNpdGx5DQpzdGF0aXN0aWNfbmFtZXMgPC0gYygNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIsDQogICJNZWFuIiwNCiAgIk1lZGlhbiIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiwNCiAgIk1pbiBDQUlSIFJhbmdlIChDQUlSIC0gU0QpIiwNCiAgIk1heCBDQUlSIFJhbmdlIChDQUlSICsgU0QpIiwNCiAgIk1pbmltdW0iLA0KICAiTWF4aW11bSIsDQogICJBYm92ZSAyLjAgVGFyZ2V0IiwNCiAgIkJlbG93IDIuMCBUYXJnZXQiDQopDQoNCg0KIyMgQ0FMQ1VMQVRJT05TDQojIERlZmluZSBhIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBzdW1tYXJ5IHN0YXRpc3RpY3MgYW5kIGhhbmRsZSBjYXNlcyB3aXRoIGluc3VmZmljaWVudCBkYXRhDQpjYWxjX3N0YXRzIDwtIGZ1bmN0aW9uKGRhdGEpIHsNCiAgaWYgKHN1bSghaXMubmEoZGF0YSkpIDwgMikgcmV0dXJuKHJlcChOQSwgbGVuZ3RoKHN0YXRpc3RpY19uYW1lcykpKSAgIyBSZXR1cm4gTkFzIGlmIGluc3VmZmljaWVudCBkYXRhDQoNCiAgY291bnRfb2JzZXJ2YXRpb25zIDwtIHN1bSghaXMubmEoZGF0YSkpDQogIG1lYW5fdmFsdWUgPC0gcm91bmQobWVhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtZWRpYW5fdmFsdWUgPC0gcm91bmQobWVkaWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIHNkX3ZhbHVlIDwtIHJvdW5kKHNkKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIG1pbl9jYWlyX3JhbmdlIDwtIHJvdW5kKGNhaXJfdmFsdWUgLSBzZF92YWx1ZSwgMikNCiAgbWF4X2NhaXJfcmFuZ2UgPC0gcm91bmQoY2Fpcl92YWx1ZSArIHNkX3ZhbHVlLCAyKQ0KICBtaW5fdmFsdWUgPC0gcm91bmQobWluKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIG1heF92YWx1ZSA8LSByb3VuZChtYXgoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgDQogICMgVGFyZ2V0IFJhdGUgQW5hbHlzaXMNCiAgdGFyZ2V0X3ZhbHVlIDwtIDIgICMgU2V0IHRoZSB0YXJnZXQgcmF0ZSwgZS5nLiwgMiUNCiAgeWVhcnNfYWJvdmVfdGFyZ2V0IDwtIHN1bShkYXRhID4gdGFyZ2V0X3ZhbHVlLCBuYS5ybSA9IFRSVUUpDQogIHllYXJzX2JlbG93X3RhcmdldCA8LSBzdW0oZGF0YSA8IHRhcmdldF92YWx1ZSwgbmEucm0gPSBUUlVFKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldCA8LSByb3VuZCgoeWVhcnNfYWJvdmVfdGFyZ2V0IC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9iZWxvd190YXJnZXQgPC0gcm91bmQoKHllYXJzX2JlbG93X3RhcmdldCAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQoNCiAgYygNCiAgICBjb3VudF9vYnNlcnZhdGlvbnMsIA0KICAgIHBhc3RlMChtZWFuX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtZWRpYW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKHNkX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtaW5fY2Fpcl9yYW5nZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X2NhaXJfcmFuZ2UsICIlIiksDQogICAgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldCwgIiUiKSwNCiAgICBwYXN0ZTAocGVyY2VudF9iZWxvd190YXJnZXQsICIlIikNCiAgKQ0KfQ0KDQojIFNwZWNpZnkgQ0FJUiBjb2x1bW5zIGZvciBjYWxjdWxhdGlvbiwgaW5jbHVkaW5nICIxLVllYXIgQ0FJUiINCmNhaXJfY29sdW1ucyA8LSBjKCIxLVllYXIgQ0FJUiIsICI1LVllYXIgQ0FJUiIsICIxMC1ZZWFyIENBSVIiLCAiMjAtWWVhciBDQUlSIiwgIjMwLVllYXIgQ0FJUiIpDQpleGlzdGluZ19jYWlyX2NvbHVtbnMgPC0gaW50ZXJzZWN0KGNhaXJfY29sdW1ucywgbmFtZXMobnJ0JGNwaV9yYXdfY2FpcikpDQoNCiMgQXBwbHkgdGhlIGNhbGNfc3RhdHMgZnVuY3Rpb24gdG8gZWFjaCBDQUlSIGNvbHVtbiBhbmQgY29tcGlsZSByZXN1bHRzDQpjYWlyX3N0YXRzX2xpc3QgPC0gbGFwcGx5KG5ydCRjcGlfcmF3X2NhaXJbZXhpc3RpbmdfY2Fpcl9jb2x1bW5zXSwgY2FsY19zdGF0cykNCg0KIyBDb21iaW5lIHJlc3VsdHMgaW50byBhIGRhdGEgZnJhbWUgYW5kIHNldCByb3cgbmFtZXMgYXMgU3RhdGlzdGljIG5hbWVzDQpjcGlfcmF3X2NhaXJfc3VtbWFyeSA8LSBhcy5kYXRhLmZyYW1lKGRvLmNhbGwoY2JpbmQsIGNhaXJfc3RhdHNfbGlzdCkpDQpyb3duYW1lcyhjcGlfcmF3X2NhaXJfc3VtbWFyeSkgPC0gc3RhdGlzdGljX25hbWVzICAjIEFzc2lnbiB0aGUgcm93IG5hbWVzDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBTQVZFIFZBTFVFUyBGT1IgSU4tTElORSBDT0RFDQoNCiMgRGVmaW5lIHRoZSBtYXBwaW5nIG9mIHJvdyBuYW1lcyB0byB2YXJpYWJsZSBuYW1lcw0Kcm93X3RvX3Zhcl9uYW1lIDwtIGMoDQogICJDb3VudCBvZiBPYnNlcnZhdGlvbnMiID0gImNvdW50X29ic2VydmF0aW9ucyIsDQogICJNZWFuIiA9ICJtZWFuX3ZhbHVlIiwNCiAgIk1lZGlhbiIgPSAibWVkaWFuX3ZhbHVlIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiID0gInNkX3ZhbHVlIiwNCiAgIk1pbiBDQUlSIFJhbmdlIChDQUlSIC0gU0QpIiA9ICJtaW5fY2Fpcl9yYW5nZSIsDQogICJNYXggQ0FJUiBSYW5nZSAoQ0FJUiArIFNEKSIgPSAibWF4X2NhaXJfcmFuZ2UiLA0KICAiTWluaW11bSIgPSAibWluX3ZhbHVlIiwNCiAgIk1heGltdW0iID0gIm1heF92YWx1ZSIsDQogICJBYm92ZSAyLjAgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldCIsDQogICJCZWxvdyAyLjAgVGFyZ2V0IiA9ICJwZXJjZW50X2JlbG93X3RhcmdldCINCikNCg0KIyBGdW5jdGlvbiB0byBzYXZlIHN1bW1hcnkgdmFsdWVzIGR5bmFtaWNhbGx5DQpzYXZlX2NvbHVtbl92YWx1ZXMgPC0gZnVuY3Rpb24oc3VtbWFyeV9kZikgew0KICAjIEV4Y2x1ZGUgdGhlICJTdGF0aXN0aWMiIGFuZCAiT3ZlcmFsbCIgY29sdW1ucw0KICBjb2x1bW5zX3RvX3NhdmUgPC0gc2V0ZGlmZihuYW1lcyhzdW1tYXJ5X2RmKSwgYygiU3RhdGlzdGljIiwgIk92ZXJhbGwiKSkNCiAgDQogICMgSXRlcmF0ZSBvdmVyIGVhY2ggY29sdW1uDQogIGZvciAoY29sIGluIGNvbHVtbnNfdG9fc2F2ZSkgew0KICAgICMgRm9ybWF0IGNvbHVtbiBuYW1lIHRvIGxvd2VyY2FzZSBhbmQgcmVwbGFjZSBpbnZhbGlkIGNoYXJhY3RlcnMNCiAgICBjb2xfbmFtZSA8LSB0b2xvd2VyKGdzdWIoIlteYS16QS1aMC05XSIsICJfIiwgY29sKSkNCiAgICANCiAgICAjIEV4dHJhY3QgdmFsdWVzIGZvciB0aGUgY3VycmVudCBjb2x1bW4NCiAgICBjb2xfdmFsdWVzIDwtIHN1bW1hcnlfZGZbW2NvbF1dDQogICAgDQogICAgIyBTYXZlIGVhY2ggdmFsdWUgZHluYW1pY2FsbHkgdXNpbmcgdGhlIG1hcHBpbmcgZm9yIHJvdyBuYW1lcw0KICAgIGZvciAoaSBpbiBzZXFfYWxvbmcoY29sX3ZhbHVlcykpIHsNCiAgICAgICMgR2V0IHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlIG5hbWUgZnJvbSB0aGUgbWFwcGluZw0KICAgICAgc3RhdF9uYW1lIDwtIHJvd190b192YXJfbmFtZVtyb3duYW1lcyhzdW1tYXJ5X2RmKVtpXV0NCiAgICAgIA0KICAgICAgaWYgKCFpcy5uYShzdGF0X25hbWUpKSB7ICAjIFNraXAgaWYgbm8gbWFwcGluZyBpcyBkZWZpbmVkDQogICAgICAgICMgQ3JlYXRlIHRoZSB2YXJpYWJsZSBuYW1lDQogICAgICAgIHZhcl9uYW1lIDwtIHBhc3RlMChzdGF0X25hbWUsICJfIiwgY29sX25hbWUpDQogICAgICAgIA0KICAgICAgICAjIEF0dGVtcHQgbnVtZXJpYyBjb252ZXJzaW9uIGZvciBkb3duc3RyZWFtIHVzZQ0KICAgICAgICB2YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2xfdmFsdWVzW2ldKSkpDQogICAgICAgIA0KICAgICAgICAjIEFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIGdsb2JhbCBlbnZpcm9ubWVudA0KICAgICAgICBhc3NpZ24odmFyX25hbWUsIHZhbHVlLCBlbnZpciA9IC5HbG9iYWxFbnYpDQogICAgICB9DQogICAgfQ0KICB9DQp9DQoNCiMgQXBwbHkgdGhlIGZ1bmN0aW9uIHRvIHNhdmUgdmFsdWVzIGZvciBhbGwgY29sdW1ucyBleGNlcHQgIk92ZXJhbGwiDQpzYXZlX2NvbHVtbl92YWx1ZXMoY3BpX3Jhd19jYWlyX3N1bW1hcnkpDQoNCiMgRXhhbXBsZTogQWNjZXNzaW5nIGR5bmFtaWNhbGx5IGNyZWF0ZWQgdmFyaWFibGVzDQppbnRlcmFjdGl2ZV9wcmludChtZWFuX3ZhbHVlXzFfeWVhcl9jYWlyKSAgIyBTaG91bGQgcHJpbnQgdGhlIG1lYW4gdmFsdWUgZm9yIDEtWWVhciBDQUlSDQppbnRlcmFjdGl2ZV9wcmludChwZXJjZW50X2Fib3ZlX3RhcmdldF81X3llYXJfY2FpcikgICMgU2hvdWxkIHByaW50IHRoZSBwZXJjZW50IGFib3ZlIGluZmxhdGlvbiBmb3IgNS1ZZWFyIENBSVINCmludGVyYWN0aXZlX3ByaW50KHNkX3ZhbHVlXzEwX3llYXJfY2FpcikgICMgU2hvdWxkIHByaW50IHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gZm9yIDEwLVllYXIgQ0FJUg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIE9WRVJBTEwgQ09MVU1OUyANCmludGVyYWN0aXZlX3N0cihjcGlfcmF3X2NhaXJfc3VtbWFyeSkNCg0KIyBDb21iaW5lIGFsbCBDQUlSIGNvbHVtbnMgaW50byBhIHNpbmdsZSBudW1lcmljIHZlY3RvciwgZXhjbHVkaW5nIE5Bcw0KbnVtZXJpY192YWx1ZXNfYWxsIDwtIGFzLm51bWVyaWModW5saXN0KG5ydCRjcGlfcmF3X2NhaXJbZXhpc3RpbmdfY2Fpcl9jb2x1bW5zXSwgdXNlLm5hbWVzID0gRkFMU0UpKQ0KbnVtZXJpY192YWx1ZXNfYWxsIDwtIG51bWVyaWNfdmFsdWVzX2FsbFshaXMubmEobnVtZXJpY192YWx1ZXNfYWxsKV0gICMgRXhjbHVkZSBOQSB2YWx1ZXMNCg0KIyBDYWxjdWxhdGUgb3ZlcmFsbCBzdGF0aXN0aWNzDQpvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucyA8LSBsZW5ndGgobnVtZXJpY192YWx1ZXNfYWxsKQ0Kb3ZlcmFsbF9tZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9zZF92YWx1ZSA8LSByb3VuZChzZChudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSA8LSByb3VuZChjYWlyX3ZhbHVlIC0gb3ZlcmFsbF9zZF92YWx1ZSwgMikNCm92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UgPC0gcm91bmQoY2Fpcl92YWx1ZSArIG92ZXJhbGxfc2RfdmFsdWUsIDIpDQpvdmVyYWxsX21pbl92YWx1ZSA8LSByb3VuZChtaW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0KDQojIFRhcmdldCBSYXRlIEFuYWx5c2lzIGZvciBvdmVyYWxsIGRhdGENCnRhcmdldF92YWx1ZSA8LSAyICAjIFNldCB0aGUgdGFyZ2V0IHJhdGUsIGUuZy4sIDIlDQpvdmVyYWxsX3llYXJzX2Fib3ZlX3RhcmdldCA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID4gdGFyZ2V0X3ZhbHVlKQ0Kb3ZlcmFsbF95ZWFyc19iZWxvd190YXJnZXQgPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA8IHRhcmdldF92YWx1ZSkNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXQgPC0gcm91bmQoKG92ZXJhbGxfeWVhcnNfYWJvdmVfdGFyZ2V0IC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0Kb3ZlcmFsbF9wZXJjZW50X2JlbG93X3RhcmdldCA8LSByb3VuZCgob3ZlcmFsbF95ZWFyc19iZWxvd190YXJnZXQgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQoNCiMgQWRkIHRoZSBvdmVyYWxsIHN0YXRpc3RpY3MgdG8gdGhlIHN1bW1hcnkgZGF0YSBmcmFtZQ0KY3BpX3Jhd19jYWlyX3N1bW1hcnkkT3ZlcmFsbCA8LSBjKA0KICBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucywNCiAgcGFzdGUwKG92ZXJhbGxfbWVhbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWVkaWFuX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9zZF92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWluX2NhaXJfcmFuZ2UsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21heF9jYWlyX3JhbmdlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9taW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21heF92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXQsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYmVsb3dfdGFyZ2V0LCAiJSIpDQopDQoNCiMgQ29udmVydCByb3cgbmFtZXMgdG8gYSBjb2x1bW4gZm9yIGVhc2llciBtYW5pcHVsYXRpb24gYW5kIGRpc3BsYXkNCmNwaV9yYXdfY2Fpcl9zdW1tYXJ5IDwtIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKGNwaV9yYXdfY2Fpcl9zdW1tYXJ5LCB2YXIgPSAiU3RhdGlzdGljIikNCg0KIyBDb252ZXJ0IGFsbCBjb2x1bW5zIHRvIGNoYXJhY3RlciB0byBlbnN1cmUgY29uc2lzdGVudCBmb3JtYXR0aW5nDQpjcGlfcmF3X2NhaXJfc3VtbWFyeSA8LSBjcGlfcmF3X2NhaXJfc3VtbWFyeSAlPiUNCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIGFzLmNoYXJhY3RlcikpDQoNCiMgRGlzcGxheSBmb3JtYXR0ZWQgdGFibGUgd2l0aCB1bnNwZWNpZmllZCBjb2x1bW4gd2lkdGhzDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgU3VtbWFyeSAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF91bnNwZWNpZmllZF93aWR0aChjcGlfcmF3X2NhaXJfc3VtbWFyeSkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFNBVkUgVkFMVUVTOyANCg0KIyBBc3NpZ24gdGhlIGNhbGN1bGF0ZWQgQ0FJUiB2YWx1ZSB0byB0aGUgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZQ0KdmFyX25hbWUgPC0gcGFzdGUwKCJjcGlfY2Fpcl9zdW1tYXJ5X292ZXJhbGxfbWVhbl9zIiwgbWluX3llYXIsICJfZSIsIG1heF95ZWFyLCAiX2F5ZCIpDQphc3NpZ24odmFyX25hbWUsIG92ZXJhbGxfbWVhbl92YWx1ZSkNCmludGVyYWN0aXZlX3ByaW50KG92ZXJhbGxfbWVhbl92YWx1ZSkNCg0KdmFyX25hbWUgPC0gcGFzdGUwKCJjcGlfY2Fpcl9zdW1tYXJ5X292ZXJhbGxfbWluX2NhaXJfcmFuZ2VfcyIsIG1pbl95ZWFyLCAiX2UiLCBtYXhfeWVhciwgIl9heWQiKQ0KYXNzaWduKHZhcl9uYW1lLCBvdmVyYWxsX21pbl9jYWlyX3JhbmdlKQ0KaW50ZXJhY3RpdmVfcHJpbnQob3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSkNCg0KdmFyX25hbWUgPC0gcGFzdGUwKCJjcGlfY2Fpcl9zdW1tYXJ5X292ZXJhbGxfbWF4X2NhaXJfcmFuZ2VfcyIsIG1pbl95ZWFyLCAiX2UiLCBtYXhfeWVhciwgIl9heWQiKQ0KYXNzaWduKHZhcl9uYW1lLCBvdmVyYWxsX21heF9jYWlyX3JhbmdlKQ0KaW50ZXJhY3RpdmVfcHJpbnQob3ZlcmFsbF9tYXhfY2Fpcl9yYW5nZSkNCg0KDQppbnRlcmFjdGl2ZV9wcmludChjcGlfY2Fpcl9zdW1tYXJ5X292ZXJhbGxfbWVhbl9zMTkxM19lMjAyM19heWQpDQppbnRlcmFjdGl2ZV9wcmludChjcGlfY2Fpcl9zdW1tYXJ5X292ZXJhbGxfbWluX2NhaXJfcmFuZ2VfczE5MTNfZTIwMjNfYXlkKQ0KaW50ZXJhY3RpdmVfcHJpbnQoY3BpX2NhaXJfc3VtbWFyeV9vdmVyYWxsX21heF9jYWlyX3JhbmdlX3MxOTEzX2UyMDIzX2F5ZCkNCg0KIyBDb25maXJtIG1pbiBhbmQgbWF4IHllYXJzDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQpgYGANCg0KDQpUaGUgb3ZlcmFsbCBtZWFuIGFubnVhbCBpbmZsYXRpb24gcmF0ZSBzdGFuZHMgYXQgYHIgY3BpX2NhaXJfc3VtbWFyeV9vdmVyYWxsX21lYW5fczE5MTNfZTIwMjNfYXlkYCUsIHdpdGggYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYHIgb3ZlcmFsbF9zZF92YWx1ZWAlLCBpbmRpY2F0aW5nIG1vZGVyYXRlIHZvbGF0aWxpdHkgb3ZlciB0aGUgZnVsbCBkYXRhc2V0IGZyb20gYHIgbWluX3llYXJgIHRocnUgYHIgbWF4X3llYXJgLiBTaG9ydGVyIHBlcmlvZHMsIHN1Y2ggYXMgdGhlIDEtWWVhciBhbmQgNS1ZZWFyIENBSVJzLCBleGhpYml0IGdyZWF0ZXIgdmFyaWFiaWxpdHksIHdpdGggc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiBgciBzZF92YWx1ZV8xX3llYXJfY2FpcmAlIGFuZCBgciBzZF92YWx1ZV81X3llYXJfY2FpcmAlLCByZXNwZWN0aXZlbHksIHJlZmxlY3Rpbmcgc2Vuc2l0aXZpdHkgdG8gc2hvcnQtdGVybSBlY29ub21pYyBmbHVjdHVhdGlvbnMuIENvbnZlcnNlbHksIGxvbmdlciBwZXJpb2RzIGxpa2UgdGhlIDIwLVllYXIgYW5kIDMwLVllYXIgQ0FJUnMgZGVtb25zdHJhdGUgc2lnbmlmaWNhbnRseSByZWR1Y2VkIHZvbGF0aWxpdHksIHdpdGggc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiBgciBzZF92YWx1ZV8yMF95ZWFyX2NhaXJgJSBhbmQgYHIgc2RfdmFsdWVfMzBfeWVhcl9jYWlyYCUsIHJlc3BlY3RpdmVseSwgaGlnaGxpZ2h0aW5nIHRoYXQgZXh0ZW5kZWQgZHVyYXRpb25zIG9mZmVyIGEgbW9yZSBzdGFibGUgYW5kIGNvbnNpc3RlbnQgdmlldyBvZiBpbmZsYXRpb24gdHJlbmRzLg0KDQpPdmVyYWxsIHZhbHVlcyBhcmUgY2FsY3VsYXRlZCBmcm9tIGFsbCBudW1lcmljYWwgZGF0YSBhY3Jvc3MgdGhlIENBSVIgcGVyaW9kcywgcHJvdmlkaW5nIGEgY29tcHJlaGVuc2l2ZSByZXByZXNlbnRhdGlvbiBvZiBoaXN0b3JpY2FsIGluZmxhdGlvbiB0cmVuZHMuIFdlIGNhbiwgdGhlcmVmb3JlLCB1c2UgdGhlIE92ZXJhbGwgQ0FJUiBNZWFuIChgciBjcGlfY2Fpcl9zdW1tYXJ5X292ZXJhbGxfbWVhbl9zMTkxM19lMjAyM19heWRgJSkgYXMgYSBiYXNlbGluZSB0byBldmFsdWF0ZSBpbmZsYXRpb25hcnkgcHJlc3N1cmVzIHJlbGF0aXZlIHRvIGhpc3RvcmljYWwgbm9ybXMuIFRoZSBvdmVyYWxsIHN0YW5kYXJkIGRldmlhdGlvbiBxdWFudGlmaWVzIHRoZSB0eXBpY2FsIHJhbmdlIG9mIGluZmxhdGlvbiB2YXJpYWJpbGl0eSBvdmVyIHRpbWUsIHByb3ZpZGluZyBhIHNpbmd1bGFyIENBSVIgcmFuZ2UgKGByIGNwaV9jYWlyX3N1bW1hcnlfb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZV9zMTkxM19lMjAyM19heWRgJS1gciBjcGlfY2Fpcl9zdW1tYXJ5X292ZXJhbGxfbWF4X2NhaXJfcmFuZ2VfczE5MTNfZTIwMjNfYXlkYCklIHRoYXQgY2FwdHVyZSB0aGUgYm91bmRzIG9mIHR5cGljYWwgaGlzdG9yaWNhbCBmbHVjdHVhdGlvbnMuDQoNCiMjIyBHcmFwaA0KDQpUaGVzZSBncmFwaHMgaWxsdXN0cmF0ZSB0aGUgUm9sbGluZyBDQUlSIGFjcm9zcyB2YXJ5aW5nIHRpbWUgaG9yaXpvbnMgKDEsIDUsIDEwLCAyMCwgYW5kIDMwIHllYXJzKSBvdmVyIGRpZmZlcmVudCBoaXN0b3JpY2FsIHBlcmlvZHMsIHdpdGggYSBmb2N1cyBvbiB0aGUgc3RhbmRhcmQgMiUgaW5mbGF0aW9uIHRhcmdldC4gVGhlIGdyZWVuIGJhbmQgcmVwcmVzZW50cyBvdmVyYWxsIHJhbmdlIHdoZXJlIGluZmxhdGlvbiByYXRlcyBhbGlnbiB3aXRoIGhpc3RvcmljYWwgbm9ybXMsIHdoaWxlIHRoZSByZWQgem9uZXMgaW5kaWNhdGUgcGVyaW9kcyBvZiBzaWduaWZpY2FudCBkZXZpYXRpb24uIFNob3J0ZXItdGVybSBDQUlScyAoZS5nLiwgMS1ZZWFyKSBkaXNwbGF5IGhpZ2hlciB2b2xhdGlsaXR5LCBvZnRlbiBleGNlZWRpbmcgdGhlIHRhcmdldCByYW5nZSwgd2hlcmVhcyBsb25nZXItdGVybSBDQUlScyAoZS5nLiwgMzAtWWVhcikgYXJlIHNtb290aGVyIGFuZCByZW1haW4gbW9yZSBzdGFibGUgd2l0aGluIHRoZSBncmVlbiBiYW5kLCByZWZsZWN0aW5nIGN1bXVsYXRpdmUgaW5mbGF0aW9uIGVmZmVjdHMgYW5kIGxvbmctdGVybSBzdGFiaWxpdHkuDQoNCiMjIyMgQWxsIFBlcmlvZHMNCg0KYGBge3IgbnJ0JGNwaV9yYXdfY2Fpcl9ncmFwaHMsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBJbmZsYXRpb24gUmF0ZXMgQWNyb3NzIFBlcmlvZHMgXG4iKQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBDb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcgaWYgbmVlZGVkDQpucnQkY3BpX3Jhd19jYWlyIDwtIG5ydCRjcGlfcmF3X2NhaXIgJT4lDQogIG11dGF0ZSgNCiAgICBgMS1ZZWFyIENBSVJgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FJUmApKSwNCiAgICBgNS1ZZWFyIENBSVJgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGA1LVllYXIgQ0FJUmApKSwNCiAgICBgMTAtWWVhciBDQUlSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMTAtWWVhciBDQUlSYCkpLA0KICAgIGAyMC1ZZWFyIENBSVJgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAyMC1ZZWFyIENBSVJgKSksDQogICAgYDMwLVllYXIgQ0FJUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDMwLVllYXIgQ0FJUmApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gbnJ0JGNwaV9yYXdfY2FpciAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGAxLVllYXIgQ0FJUmAsIGA1LVllYXIgQ0FJUmAsIGAxMC1ZZWFyIENBSVJgLCBgMjAtWWVhciBDQUlSYCwgYDMwLVllYXIgQ0FJUmApLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQ0FJUl9QZXJpb2QiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkNBSVJfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKENBSVJfUGVyaW9kID0gZmFjdG9yKENBSVJfUGVyaW9kLCBsZXZlbHMgPSBjKCIxLVllYXIgQ0FJUiIsICI1LVllYXIgQ0FJUiIsICIxMC1ZZWFyIENBSVIiLCAiMjAtWWVhciBDQUlSIiwgIjMwLVllYXIgQ0FJUiIpKSkNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBDQUlSX1BlcmlvZCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBDQUlSX1BlcmlvZCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQ0FJUl9QZXJpb2QpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihucnQkY3BpX3Jhd19jYWlyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihucnQkY3BpX3Jhd19jYWlyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihucnQkY3BpX3Jhd19jYWlyJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChucnQkY3BpX3Jhd19jYWlyJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCg0KIyBSZS1EZWZpbmUgdGhlIHRhcmdldCByYXRlIGFzIG5lZWRlZC4NCnRhcmdldF92YWx1ZSA8LSAyLjAgICMgUmVwbGFjZSB3aXRoIHlvdXIgc3BlY2lmaWMgdGFyZ2V0IHJhdGUgaWYgbmVlZGVkDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAxOTEzDQplbmRfeWVhciA8LSAyMDIzDQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJSb2xsaW5nIENBSVJzIEFjcm9zcyBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJDUEkgQ29tcG91bmQgQXZlcmFnZSBJbmZsYXRpb24gUmF0ZXMgZm9yIEFsbCBVcmJhbiBDb25zdW1lcnMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KG5ydF9sb25nLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUlSX1ZhbHVlLCBjb2xvciA9IENBSVJfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IG92ZXJhbGxfbWluX2NhaXJfcmFuZ2UsIHltYXggPSBvdmVyYWxsX21heF9jYWlyX3JhbmdlKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAwNzUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSBvdmVyYWxsX21pbl9jYWlyX3JhbmdlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAwNzUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDA3NSkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBSVIgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FJUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBSVINCiAgDQogICMgQWRkIHRhcmdldCBhbmQgcmFuZ2UgbGluZXMNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X3ZhbHVlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSwgY29sb3IgPSAiZGFya2dyZWVuIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UsIGNvbG9yID0gImRhcmtncmVlbiIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21lYW5fdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF92YWx1ZSwgbGFiZWwgPSAiVGFyZ2V0IiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWluX2NhaXJfcmFuZ2UsIGxhYmVsID0gIk1pbiBDQUlSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21heF9jYWlyX3JhbmdlLCBsYWJlbCA9ICJNYXggQ0FJUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9tZWFuX3ZhbHVlLCBsYWJlbCA9ICJDQUlSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FJUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBSVIgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIENBSVIgUGVyaW9kDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgNSksICMgU2V0IGRhdGEgZm9yIHgtYXhpcyANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciArIDUsIDUpICMgU2V0IGluY3JlbWVudHMgZm9yIHgtYXhpcw0KICAgICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgUkVTVFJJQ1RFRCBXSVRIIExJTUlUUyANCg0KIyBGaWx0ZXIgdGhlIGRhdGEgZm9yIHRoZSByZXN0cmljdGVkIHgtYXhpcyByYW5nZSAoMTk3NC0yMDIzKQ0KcmVzdHJpY3RlZF9kYXRhIDwtIG5ydF9sb25nICU+JQ0KICBmaWx0ZXIoYXMuaW50ZWdlcihEYXRlKSA+PSAxOTQ1ICYgYXMuaW50ZWdlcihEYXRlKSA8PSAyMDIzKQ0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDE5NzQNCmVuZF95ZWFyIDwtIDIwMjMNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIlJvbGxpbmcgQ0FJUnMgQWNyb3NzIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkNQSSBDb21wb3VuZCBBdmVyYWdlIEluZmxhdGlvbiBSYXRlcyBmb3IgQWxsIFVyYmFuIENvbnN1bWVycywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ2FsY3VsYXRlIGR5bmFtaWMgeS1heGlzIGxpbWl0cyBmb3IgdGhlIHJlc3RyaWN0ZWQgZGF0YQ0KeV9taW4gPC0gbWluKHJlc3RyaWN0ZWRfZGF0YSRDQUlSX1ZhbHVlLCBuYS5ybSA9IFRSVUUpDQp5X21heCA8LSBtYXgocmVzdHJpY3RlZF9kYXRhJENBSVJfVmFsdWUsIG5hLnJtID0gVFJVRSkNCg0KIyBDcmVhdGUgdGhlIGZpbHRlcmVkLCByZXN0cmljdGVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAyIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FJUl9WYWx1ZSwgY29sb3IgPSBDQUlSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSBvdmVyYWxsX21pbl9jYWlyX3JhbmdlLCB5bWF4ID0gb3ZlcmFsbF9tYXhfY2Fpcl9yYW5nZSksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMDc1KSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMDc1KSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSBvdmVyYWxsX21heF9jYWlyX3JhbmdlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAwNzUpICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUlSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBSVINCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUlSDQogIA0KICAjIEFkZCB0YXJnZXQgYW5kIHJhbmdlIGxpbmVzDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF92YWx1ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWluX2NhaXJfcmFuZ2UsIGNvbG9yID0gImRhcmtncmVlbiIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21heF9jYWlyX3JhbmdlLCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9tZWFuX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfdmFsdWUsIGxhYmVsID0gIlRhcmdldCIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21pbl9jYWlyX3JhbmdlLCBsYWJlbCA9ICJNaW4gQ0FJUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9tYXhfY2Fpcl9yYW5nZSwgbGFiZWwgPSAiTWF4IENBSVIiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtncmVlbiIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWVhbl92YWx1ZSwgbGFiZWwgPSAiQ0FJUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBSVIgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUlSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBDQUlSIFBlcmlvZA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeV9taW4sIHlfbWF4KSkgKyAjIEFwcGx5IGR5bmFtaWMgeS1heGlzIGxpbWl0cw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDUpLCAjIFJlc3RyaWN0cyB4LWF4aXMgZGF0YSANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkgIyBTZXRzIE1ham9yIHgtYXhpcyAgDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgDQogIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAyKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBSRVNUUklDVEVEIFdJVEggTElNSVRTIA0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMDQNCmVuZF95ZWFyIDwtIDIwMjMNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIlJvbGxpbmcgQ0FJUnMgQWNyb3NzIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkNQSSBDb21wb3VuZCBBdmVyYWdlIEluZmxhdGlvbiBSYXRlcyBmb3IgQWxsIFVyYmFuIENvbnN1bWVycywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgRmlsdGVyIHRoZSBkYXRhIGZvciB0aGUgcmVzdHJpY3RlZCB4LWF4aXMgcmFuZ2UgKDIwMDQtMjAyMykNCnJlc3RyaWN0ZWRfZGF0YSA8LSBucnRfbG9uZyAlPiUNCiAgZmlsdGVyKGFzLmludGVnZXIoRGF0ZSkgPj0gMjAwNCAmIGFzLmludGVnZXIoRGF0ZSkgPD0gMjAyMykNCg0KIyBDYWxjdWxhdGUgZHluYW1pYyB5LWF4aXMgbGltaXRzIGZvciB0aGUgcmVzdHJpY3RlZCBkYXRhDQp5X21pbiA8LSBtaW4ocmVzdHJpY3RlZF9kYXRhJENBSVJfVmFsdWUsIG5hLnJtID0gVFJVRSkNCnlfbWF4IDwtIG1heChyZXN0cmljdGVkX2RhdGEkQ0FJUl9WYWx1ZSwgbmEucm0gPSBUUlVFKQ0KDQojIENyZWF0ZSB0aGUgZmlsdGVyZWQsIHJlc3RyaWN0ZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDMgPC0gZ2dwbG90KG5ydF9sb25nLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUlSX1ZhbHVlLCBjb2xvciA9IENBSVJfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IG92ZXJhbGxfbWluX2NhaXJfcmFuZ2UsIHltYXggPSBvdmVyYWxsX21heF9jYWlyX3JhbmdlKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAwNzUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSBvdmVyYWxsX21pbl9jYWlyX3JhbmdlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAwNzUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDA3NSkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBSVIgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FJUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBSVINCiAgDQogICMgQWRkIHRhcmdldCBhbmQgcmFuZ2UgbGluZXMNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X3ZhbHVlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSwgY29sb3IgPSAiZGFya2dyZWVuIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UsIGNvbG9yID0gImRhcmtncmVlbiIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21lYW5fdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF92YWx1ZSwgbGFiZWwgPSAiVGFyZ2V0IiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWluX2NhaXJfcmFuZ2UsIGxhYmVsID0gIk1pbiBDQUlSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21heF9jYWlyX3JhbmdlLCBsYWJlbCA9ICJNYXggQ0FJUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9tZWFuX3ZhbHVlLCBsYWJlbCA9ICJDQUlSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FJUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBSVIgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIENBSVIgUGVyaW9kDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5X21pbiwgeV9tYXgpKSArICMgQXBwbHkgZHluYW1pYyB5LWF4aXMgbGltaXRzDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMiksICMgUmVzdHJpY3RzIHgtYXhpcyBkYXRhIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KSAjIFNldHMgTWFqb3IgeC1heGlzICANCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyANCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDMpDQoNCmBgYA0KDQojIyMjIFNob3J0LVRlcm0NCg0KYGBge3IgbnJ0JGNwaV9yYXdfY2Fpcl9ncmFwaHNfc2hvcnQsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBJbmZsYXRpb24gUmF0ZXMgQWNyb3NzIFNob3J0LVRlcm0gUm9sbGluZyBQZXJpb2RzIFxuIikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgU2hvcnQtVGVybSBDQUlSICg1LVllYXIgYW5kIDEwLVllYXIpDQpzaG9ydHRlcm1fZGF0YSA8LSBucnRfbG9uZyAlPiUNCiAgZmlsdGVyKENBSVJfUGVyaW9kICVpbiUgYygiNS1ZZWFyIENBSVIiLCAiMTAtWWVhciBDQUlSIikpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDE5MTUNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkNBSVIgQWNyb3NzIFNob3J0LVRlcm0gUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiQ1BJIENvbXBvdW5kIEF2ZXJhZ2UgSW5mbGF0aW9uIFJhdGVzIGZvciBBbGwgVXJiYW4gQ29uc3VtZXJzLCBEYXRhIFBlcmlvZCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxX3Nob3J0dGVybSA8LSBnZ3Bsb3Qoc2hvcnR0ZXJtX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBSVJfVmFsdWUsIGNvbG9yID0gQ0FJUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSwgeW1heCA9IG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDA3NSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IG92ZXJhbGxfbWluX2NhaXJfcmFuZ2UpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDA3NSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gb3ZlcmFsbF9tYXhfY2Fpcl9yYW5nZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMDc1KSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FJUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUlSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FJUg0KICANCiAgIyBBZGQgdGFyZ2V0IGFuZCByYW5nZSBsaW5lcw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfdmFsdWUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21pbl9jYWlyX3JhbmdlLCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9tYXhfY2Fpcl9yYW5nZSwgY29sb3IgPSAiZGFya2dyZWVuIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWVhbl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X3ZhbHVlLCBsYWJlbCA9ICJUYXJnZXQiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSwgbGFiZWwgPSAiTWluIENBSVIiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtncmVlbiIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UsIGxhYmVsID0gIk1heCBDQUlSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21lYW5fdmFsdWUsIGxhYmVsID0gIkNBSVIiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUlSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FJUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0FJUiBQZXJpb2QNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAyKSwgIyBTZXQgZGF0YSBmb3IgeC1heGlzIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KSAjIFNldCBpbmNyZW1lbnRzIGZvciB4LWF4aXMNCiAgICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMV9zaG9ydHRlcm0pDQoNCmBgYA0KDQoNCiMjIyMgTG9uZy1UZXJtDQoNCmBgYHtyIG5ydCRjcGlfcmF3X2NhaXJfZ3JhcGhzX2xvbmcsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBJbmZsYXRpb24gUmF0ZXMgQWNyb3NzIExvbmctVGVybSBSb2xsaW5nIFBlcmlvZHMgXG4iKQ0KDQojIEZpbHRlciBkYXRhIGZvciBMb25nLVRlcm0gQ0FJUiAoMjAtWWVhciBhbmQgMzAtWWVhcikNCmxvbmd0ZXJtX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihDQUlSX1BlcmlvZCAlaW4lIGMoIjIwLVllYXIgQ0FJUiIsICIzMC1ZZWFyIENBSVIiKSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMTkzMA0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQ0FJUiBBY3Jvc3MgTG9uZy1UZXJtIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkNQSSBDb21wb3VuZCBBdmVyYWdlIEluZmxhdGlvbiBSYXRlcyBmb3IgQWxsIFVyYmFuIENvbnN1bWVycywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDFfbG9uZ3Rlcm0gPC0gZ2dwbG90KGxvbmd0ZXJtX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBSVJfVmFsdWUsIGNvbG9yID0gQ0FJUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSwgeW1heCA9IG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDA3NSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IG92ZXJhbGxfbWluX2NhaXJfcmFuZ2UpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDA3NSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gb3ZlcmFsbF9tYXhfY2Fpcl9yYW5nZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMDc1KSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FJUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUlSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FJUg0KICANCiAgIyBBZGQgdGFyZ2V0IGFuZCByYW5nZSBsaW5lcw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfdmFsdWUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21pbl9jYWlyX3JhbmdlLCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9tYXhfY2Fpcl9yYW5nZSwgY29sb3IgPSAiZGFya2dyZWVuIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWVhbl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X3ZhbHVlLCBsYWJlbCA9ICJUYXJnZXQiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9taW5fY2Fpcl9yYW5nZSwgbGFiZWwgPSAiTWluIENBSVIiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtncmVlbiIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWF4X2NhaXJfcmFuZ2UsIGxhYmVsID0gIk1heCBDQUlSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21lYW5fdmFsdWUsIGxhYmVsID0gIkNBSVIiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUlSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FJUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0FJUiBQZXJpb2QNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAyKSwgIyBTZXQgZGF0YSBmb3IgeC1heGlzIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KSAjIFNldCBpbmNyZW1lbnRzIGZvciB4LWF4aXMNCiAgICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDFfbG9uZ3Rlcm0pDQoNCmBgYA0KDQoNCiMgSU5ERVhFUyANCg0KIyMgR2VuZXJhbCBQb3J0Zm9saW8gVHlwZXMNCg0KKipDb25zZXJ2YXRpdmUgUG9ydGZvbGlvcyoqDQoNCkNvbnNlcnZhdGl2ZSBpbnZlc3RtZW50IHN0cmF0ZWdpZXMgZm9jdXMgb24gY2FwaXRhbCBwcmVzZXJ2YXRpb24gd2l0aCBhbm51YWwgZ3Jvd3RoIHRhcmdldHMgb2YgMyUtNSUuIFR5cGljYWxseSwgdGhlc2UgcG9ydGZvbGlvcyBjb25zaXN0IG9mIDIwJS00MCUgZXF1aXRpZXMsIHdpdGggdGhlIG1ham9yaXR5IGFsbG9jYXRlZCB0byBib25kcyBvciBvdGhlciBpbmNvbWUtZ2VuZXJhdGluZyBhc3NldHMuIFRoZXkgYXJlIGNoYXJhY3Rlcml6ZWQgYnkgcmVkdWNlZCB2b2xhdGlsaXR5IGFuZCBsaW1pdGVkIGRyYXdkb3ducyAoXH4xMCUtMjAlKSwgbWFraW5nIHRoZW0gc3VpdGFibGUgZm9yIHJpc2stYXZlcnNlIGluZGl2aWR1YWxzIG9yIHRob3NlIG5lYXJpbmcgcmV0aXJlbWVudC4gRm9yIG1vcmUgb24gY29uc3RydWN0aW5nIGNvbnNlcnZhdGl2ZSBwb3J0Zm9saW9zLCBzZWUgVmFuZ3VhcmQncyBBc3NldCBBbGxvY2F0aW9uIEd1aWRlICg8aHR0cHM6Ly9pbnZlc3Rvci52YW5ndWFyZC5jb20vaW52ZXN0b3ItcmVzb3VyY2VzLWVkdWNhdGlvbi9lZHVjYXRpb24vbW9kZWwtcG9ydGZvbGlvLWFsbG9jYXRpb24+KS4NCg0KKipNb2RlcmF0ZSBQb3J0Zm9saW9zKioNCg0KTW9kZXJhdGUgcG9ydGZvbGlvcyB0eXBpY2FsbHkgdGFyZ2V0IGFubnVhbCBncm93dGggcmF0ZXMgb2YgNSUtNyUsIGJhbGFuY2luZyByaXNrIGFuZCByZXR1cm4uIFRoZXNlIHBvcnRmb2xpb3Mgb2Z0ZW4gYWxsb2NhdGUgNjAlIHRvIHN0b2Nrcywgc3VjaCBhcyB0aGUgUyZQIDUwMCwgYW5kIDQwJSB0byBmaXhlZC1pbmNvbWUgYXNzZXRzIGxpa2UgYm9uZHMuIFRoZSBoaXN0b3JpY2FsIHBlcmZvcm1hbmNlIG9mIG1vZGVyYXRlIHBvcnRmb2xpb3MgcHJvdmlkZXMgc3RhYmxlLCBpbmZsYXRpb24tYmVhdGluZyByZXR1cm5zIHdpdGggbG93ZXIgdm9sYXRpbGl0eSB0aGFuIGFnZ3Jlc3NpdmUgc3RyYXRlZ2llcywgbWFraW5nIHRoZW0gaWRlYWwgZm9yIGludmVzdG9ycyBzZWVraW5nIHN0ZWFkeSBncm93dGggd2l0aG91dCBoaWdoIGV4cG9zdXJlIHRvIG1hcmtldCBzd2luZ3MuIFRoZSBjb25jZXB0IGFsaWducyB3aXRoIGluc2lnaHRzIHByb3ZpZGVkIGJ5IE1vcm5pbmdzdGFyJ3MgUG9ydGZvbGlvIEFuYWx5c2lzICg8aHR0cHM6Ly93d3cubW9ybmluZ3N0YXIuY29tL3Byb2R1Y3RzL3BvcnRmb2xpby1hbmFseXNpcz4pLg0KDQoqKkFnZ3Jlc3NpdmUgUG9ydGZvbGlvcyoqDQoNCkFnZ3Jlc3NpdmUgcG9ydGZvbGlvcyBhaW0gZm9yIGFubnVhbCBncm93dGggcmF0ZXMgb2YgMTAlLTEyJSBhbmQgYXJlIGhlYXZpbHkgd2VpZ2h0ZWQgaW4gZXF1aXRpZXMsIHN1Y2ggYXMgZ3Jvd3RoIHN0b2Nrcywgc21hbGwtY2FwIHN0b2NrcywgYW5kIGVtZXJnaW5nIG1hcmtldHMuIFdoaWxlIHRoZXNlIHBvcnRmb2xpb3Mgb2Z0ZW4gb3V0cGVyZm9ybSBiZW5jaG1hcmtzIGxpa2UgdGhlIFMmUCA1MDAgZHVyaW5nIGJ1bGwgbWFya2V0cywgdGhleSBjYXJyeSBzaWduaWZpY2FudCB2b2xhdGlsaXR5LCB3aXRoIHBvdGVudGlhbCBkcmF3ZG93bnMgb2YgXH41MCUgZHVyaW5nIGRvd250dXJucy4gVGhlc2Ugc3RyYXRlZ2llcyBhcmUgaWRlYWwgZm9yIGxvbmctdGVybSBpbnZlc3RvcnMgd2lsbGluZyB0byB3aXRoc3RhbmQgZmx1Y3R1YXRpb25zLiBMZWFybiBtb3JlIGFib3V0IGdyb3d0aC1mb2N1c2VkIGludmVzdGluZyB0aHJvdWdoIEludmVzdG9wZWRpYSdzIEFnZ3Jlc3NpdmUgR3Jvd3RoIFN0cmF0ZWdpZXMgKDxodHRwczovL3d3dy5pbnZlc3RvcGVkaWEuY29tL3Rlcm1zL2EvYWdncmVzc2l2ZWludmVzdG1lbnRzdHJhdGVneS5hc3A+KS4NCg0KIyMgSW5mbGF0aW9uIHRvIFMmUCA1MDANCg0KVGhlIFMmUCA1MDAgZG9lcyBub3QgYWRqdXN0IGZvciBpbmZsYXRpb24sIG1lYW5pbmcgaXRzIHBlcmZvcm1hbmNlIHJlZmxlY3RzIG5vbWluYWwgcmV0dXJucy4gSW5mbGF0aW9uLWFkanVzdGVkIChyZWFsKSByZXR1cm5zLCB3aGljaCBzdWJ0cmFjdCBpbmZsYXRpb24gcmF0ZXMgKGUuZy4sIFx+MiUtMyUpLCBwcm92aWRlIGEgY2xlYXJlciBwaWN0dXJlIG9mIHB1cmNoYXNpbmcgcG93ZXIuIE9uIGF2ZXJhZ2UsIHRoZSBTJlAgNTAwIGlzIHdpZGVseSBhY2NlcHRlZCB0byBkZWxpdmVyIFx+NiUtNyUgcmVhbCBhbm51YWwgcmV0dXJucyBhZnRlciBhY2NvdW50aW5nIGZvciBpbmZsYXRpb24uIEZvciBoaXN0b3JpY2FsIGluc2lnaHRzIG9uIGluZmxhdGlvbi1hZGp1c3RlZCByZXR1cm5zLCB0aGUgU2hpbGxlciBDQVBFIFJhdGlvIGRhdGFzZXQgKDxodHRwczovL3NoaWxsZXJkYXRhLmNvbS8+KSBpcyBhIHZhbHVhYmxlIHJlc291cmNlLiBUaGlzIGRhdGFzZXQgYWxpZ25zIHRoZSBTJlAgNTAwJ3Mgbm9taW5hbCBwcmljZXMgd2l0aCB0aGVpciByZWFsLCBpbmZsYXRpb24tYWRqdXN0ZWQgY291bnRlcnBhcnRzLCBvZmZlcmluZyBpbnNpZ2h0cyBpbnRvIGxvbmctdGVybSBtYXJrZXQgdmFsdWF0aW9ucy4gQWRkaXRpb25hbGx5LCB0aGUgVS5TLiBCdXJlYXUgb2YgTGFib3IgU3RhdGlzdGljcyBwcm92aWRlcyBhIENQSSBJbmZsYXRpb24gQ2FsY3VsYXRvciAoPGh0dHBzOi8vd3d3LmJscy5nb3YvZGF0YS9pbmZsYXRpb25fY2FsY3VsYXRvci5odG0+KSwgd2hpY2ggYWxsb3dzIHVzZXJzIHRvIGNhbGN1bGF0ZSB0aGUgYnV5aW5nIHBvd2VyIG9mIHRoZSBkb2xsYXIgYmV0d2VlbiBkaWZmZXJlbnQgZGF0ZXMsIGZhY2lsaXRhdGluZyBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIGluZmxhdGlvbidzIGltcGFjdCBvdmVyIHRpbWUuDQoNCioqQ29uY2x1c2lvbioqDQoNCkludmVzdG1lbnQgc3RyYXRlZ2llcyBhcmUgYWxpZ25lZCB0byBlYWNoIGluZGl2aWR1YWwgZ29hbHMgYW5kIHJpc2sgdG9sZXJhbmNlcy4gTW9kZXJhdGUgcG9ydGZvbGlvcyBiYWxhbmNlIGdyb3d0aCBhbmQgcmlzaywgY29uc2VydmF0aXZlIHN0cmF0ZWdpZXMgcHJpb3JpdGl6ZSBzdGFiaWxpdHksIGFuZCBhZ2dyZXNzaXZlIGFwcHJvYWNoZXMgZm9jdXMgb24gaGlnaCBncm93dGguIFVuZGVyc3RhbmRpbmcgaW5mbGF0aW9uJ3MgaW1wYWN0IG9uIG5vbWluYWwgcmV0dXJucyBpcyBjcml0aWNhbCBmb3IgZXZhbHVhdGluZyByZWFsIGludmVzdG1lbnQgcGVyZm9ybWFuY2UuIEZvciBhZGRpdGlvbmFsIGFuYWx5c2lzIHRvb2xzIGFuZCBoaXN0b3JpY2FsIGRhdGEsIGNvbnNpZGVyIHJldmlld2luZyBNb3JuaW5nc3RhciwgVmFuZ3VhcmQsIGFuZCB0aGUgU2hpbGxlciBDQVBFIFJhdGlvLg0KDQojIyBQcmVmZXJyZWQgVGFyZ2V0cw0KDQpUbyBlZmZlY3RpdmVseSBjb21wYXJlIGluZGV4ZXMgb3ZlciB0aW1lLCBpdCdzIGVzc2VudGlhbCB0byBhY2NvdW50IGZvciBpbmZsYXRpb24gcmF0ZXMuIEkndmUgc2V0IFN1YmplY3RpdmUgVGFyZ2V0IHJhdGVzIHVzaW5nIHRoZSBjYWxjdWxhdGVkIG92ZXJhbGwgaW5mbGF0aW9uIHJhdGUgKGByIGNwaV9jYWlyX3N1bW1hcnlfb3ZlcmFsbF9tZWFuX3MxOTEzX2UyMDIzX2F5ZGAlKSBhbmQgdGhlIGFzc3VtZWQgcG9ydGZvbGlvIGdyb3d0aCByYXRlcy4gQSBoaWdoZXIgaW5mbGF0aW9uIHJhdGUgYXMgYSB0YXJnZXQgc2VydmVzIGFzIGEgY29uc2VydmF0aXZlIGJ1ZmZlciBhZ2FpbnN0IGluZmxhdGlvbmFyeSB2b2xhdGlsaXR5LCBhaWRpbmcgaW4gdGhlIHNlbGVjdGlvbiBvZiBzdG9ja3Mgb3IgaW5kZXhlcyB0aGF0IHBlcmZvcm0gd2VsbCBpbiBwcmVzZXJ2aW5nIHB1cmNoYXNpbmcgcG93ZXIgZHVyaW5nIHBlcmlvZHMgb2YgZWxldmF0ZWQgaW5mbGF0aW9uLiBNb25pdG9yaW5nIHBlcmZvcm1hbmNlIGFnYWluc3QgdGhlc2UgYmVuY2htYXJrcyBoZWxwcyBuYXJyb3cgZG93biB3aGljaCBpbnZlc3RtZW50IG9yIGluZGV4IHByb3ZpZGVzIGJldHRlciBpbmZsYXRpb24tYWRqdXN0ZWQgb3V0Y29tZXMuIFRvIEVra28gd29yZHMgb25jZSBzYWlkLCAiSXQncyBub3QgZW5vdWdoIHRvIGdpdmUgcGVvcGxlIHdoYXQgdGhleSBuZWVkIHRvIHN1cnZpdmU7IHlvdSBoYXZlIHRvIGdpdmUgdGhlbSB3aGF0IHRoZXkgbmVlZCB0byBsaXZlLiINCg0KYGBge3Igc2V0X3RhcmdldHMsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KaW50ZXJhY3RpdmVfcHJpbnQoY3BpX2NhaXJfc3VtbWFyeV9vdmVyYWxsX21lYW5fczE5MTNfZTIwMjNfYXlkKSAjIFRlc3QNCg0KIyBUYXJnZXQgUmF0ZSBBbmFseXNpcw0KdGFyZ2V0X2luZmxhdGlvbiA8LSBjcGlfY2Fpcl9zdW1tYXJ5X292ZXJhbGxfbWVhbl9zMTkxM19lMjAyM19heWQgIyBUYXJnZXQgcmF0ZSB0byBzdGF5IGFmbG9hdA0KdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSAzICsgdGFyZ2V0X2luZmxhdGlvbiAjIFRhcmdldCBmb3IgMyUgZ3Jvd3RoIGluY2x1ZGluZyBpbmZsYXRpb24NCnRhcmdldF9tb2RlcmF0ZSA8LSA1ICsgdGFyZ2V0X2luZmxhdGlvbiAjIFRhcmdldCBmb3IgNSUgZ3Jvd3RoIGluY2x1ZGluZyBpbmZsYXRpb24NCnRhcmdldF9hZ2dyZXNzaXZlIDwtIDEwICsgdGFyZ2V0X2luZmxhdGlvbiAjIFRhcmdldCBmb3IgMTAlIGdyb3d0aCBpbmNsdWRpbmcgaW5mbGF0aW9uDQoNCiMgQ29tcGlsZSBzdGF0aXN0aWNzIGludG8gYSBsaXN0IGZvciBlYXN5IGNvbnZlcnNpb24gdG8gYSBkYXRhIGZyYW1lIHdpdGggZGVmaW5pdGlvbnMNCnByZWZlcnJlZF90YXJnZXRzIDwtIHRyaWJibGUoDQogIH4iVGFyZ2V0IFR5cGUiLCB+IlRhcmdldCBSYXRlIiwgfkRlZmluaXRpb24sDQogICJJbmZsYXRpb24iLCBwYXN0ZTAodGFyZ2V0X2luZmxhdGlvbiwgIiUiKSwgIk92ZXJhbGwsIEF2ZXJhZ2UgSW5mbGF0aW9uIFJhdGUgdG8gc3RheSBhZmxvYXQuIiwNCiAgIkNvbnNlcnZhdGl2ZSIsIHBhc3RlMCh0YXJnZXRfY29uc2VydmF0aXZlLCAiJSIpLCAiMyUgR3Jvd3RoIFJhdGUgbWluaW11bSwgaW5jbHVkaW5nIGluZmxhdGlvbi4iLA0KICAiTW9kZXJhdGUiLCBwYXN0ZTAodGFyZ2V0X21vZGVyYXRlLCAiJSIpLCAiNSUgR3Jvd3RoIFJhdGUgbWluaW11bSwgaW5jbHVkaW5nIGluZmxhdGlvbiIsDQogICJBZ2dyZXNzaXZlIiwgcGFzdGUwKHRhcmdldF9hZ2dyZXNzaXZlLCAiJSIpLCAiMTAlIEdyb3d0aCBSYXRlIG1pbmltdW0sIGluY2x1ZGluZyBpbmZsYXRpb24uIiwNCikNCg0KZm9ybWF0XzNjb2xfY3VzdG9tX3dpZHRocyhwcmVmZXJyZWRfdGFyZ2V0cywgY29sMV93aWR0aCA9ICIxNWVtIiwgY29sMl93aWR0aCA9ICIxMGVtIiwgY29sM193aWR0aCA9ICIzMGVtIiwgY2FwdGlvbiA9ICJHcm93dGggUmF0ZSBUYXJnZXRzIikNCg0KYGBgDQoNCiMjIEdsb3NzYXJ5DQoNCmBgYHtyIG5ydCRpbmRleGVzX21ldGF9DQoNCmZvcm1hdF8yY29sX2N1c3RvbV93aWR0aHMobnJ0JGluZGV4ZXNfbWV0YSwgY29sMV93aWR0aCA9ICIxMGVtIiwgY29sMl93aWR0aCA9ICI1MGVtIikNCmBgYA0KDQojIFMmUCA1MDANCg0KVGhlIFMmUCA1MDAsIHNob3J0IGZvciB0aGUgU3RhbmRhcmQgJiBQb29yJ3MgNTAwIEluZGV4IGFuZCBjb21tb25seSBrbm93biBieSBpdHMgdGlja2VyIHN5bWJvbCBTUFgsIGlzIGEgd2lkZWx5IHJlY29nbml6ZWQgYmVuY2htYXJrIHRoYXQgdHJhY2tzIHRoZSBwZXJmb3JtYW5jZSBvZiA1MDAgb2YgdGhlIGxhcmdlc3QgcHVibGljbHkgdHJhZGVkIGNvbXBhbmllcyBpbiB0aGUgVW5pdGVkIFN0YXRlcy4gSXQgcmVwcmVzZW50cyBhIGJyb2FkIHNwZWN0cnVtIG9mIGluZHVzdHJpZXMsIGluY2x1ZGluZyB0ZWNobm9sb2d5LCBoZWFsdGhjYXJlLCBmaW5hbmNlLCBhbmQgZW5lcmd5LCBhbmQgaXMgb2Z0ZW4gdXNlZCBhcyBhIGdhdWdlIG9mIG92ZXJhbGwgbWFya2V0IGhlYWx0aCBhbmQgZWNvbm9taWMgcGVyZm9ybWFuY2UuIFRoZSBpbmRleCBpcyB3ZWlnaHRlZCBieSBtYXJrZXQgY2FwaXRhbGl6YXRpb24sIG1lYW5pbmcgY29tcGFuaWVzIHdpdGggbGFyZ2VyIG1hcmtldCB2YWx1ZXMgaGF2ZSBhIGdyZWF0ZXIgaW1wYWN0IG9uIGl0cyBwZXJmb3JtYW5jZS4gQXMgYSBrZXkgaW5kaWNhdG9yIGZvciBpbnZlc3RvcnMsIGl0IHJlZmxlY3RzIHRoZSBncm93dGggYW5kIHZvbGF0aWxpdHkgb2YgdGhlIFUuUy4gc3RvY2sgbWFya2V0IGFuZCBzZXJ2ZXMgYXMgYSBiYXNlbGluZSBmb3IgbWVhc3VyaW5nIGludmVzdG1lbnQgcmV0dXJucyBhY3Jvc3MgYSB2YXJpZXR5IG9mIHBvcnRmb2xpb3MuDQoNCiMjIFMmUCA1MDAgR1INCg0KIyMjIERhdGENCg0KVGhlIFMmUCA1MDAgZGF0YSBwcmVzZW50ZWQgaGVyZSwgc291cmNlZCBmcm9tIE11bHRwbCwgc3BhbnMgZnJvbSB0aGUgeWVhciAxOTAwIG9ud2FyZC4gTXVsdHBsIGlzIGEgZmluYW5jaWFsIGRhdGEgcGxhdGZvcm0gdGhhdCBwcm92aWRlcyBoaXN0b3JpY2FsIGFuZCBjdXJyZW50IG1ldHJpY3MgZm9yIHRoZSBTJlAgNTAwLCBpbmNsdWRpbmcgcHJpY2VzLCBwcmljZS10by1lYXJuaW5ncyByYXRpb3MsIGFuZCBpbmZsYXRpb24tYWRqdXN0ZWQgdmFsdWVzLCBvZmZlcmluZyBpbnZlc3RvcnMgaW5zaWdodHMgaW50byBtYXJrZXQgdHJlbmRzIG92ZXIgdGltZS4gRWFjaCAiQ2xvc2UiIChDbG9zaW5nIFByaWNlKSByZXByZXNlbnRzIHRoZSBhdmVyYWdlIG9mIGVhY2ggbW9udGgncyBjbG9zaW5nIHByaWNlczsgZm9yIGV4YW1wbGUsIHRoZSBwcmljZSBmb3IgSmFudWFyeSAxLCAyMDI0LCByZWZsZWN0cyB0aGUgYXZlcmFnZSBvZiBhbGwgSmFudWFyeSBjbG9zaW5nIHByaWNlcy4gQnkgY3Jvc3MtcmVmZXJlbmNpbmcgdGhlIEphbnVhcnkgMSwgMjAyNCwgbW9udGhseSBjbG9zZSBmcm9tIE11bHRwbCB3aXRoIHRoZSBhdmVyYWdlIG9mIGFsbCBKYW51YXJ5IDIwMjQgY2xvc2luZyBwcmljZXMgZnJvbSBXZWJ1bGwgVHJhZGluZyBQbGF0Zm9ybSAoYW4gdW5yZWxhdGVkIHBsYXRmb3JtKSwgd2UgY2FuIGFzc3VtZSB0aGVzZSBkYXRhYmFzZXMgYXJlIGFjY3VyYXRlIGFuZCBjb25zaXN0ZW50IHdpdGggb3RoZXIgbWFqb3IgZmluYW5jaWFsIGRhdGEgc291cmNlcy4NCg0KRGF0YSBTb3VyY2U6IGByIG5ydiRzb3VyY2Vfc3A1MDBfbXVsdHBsYA0KDQpgYGB7ciBucnQkc3A1MDBfcmF3LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgRGlzcGxheSB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhc2V0IHRvIGNvbmZpcm0gY29sdW1uIG5hbWVzDQppbnRlcmFjdGl2ZV9zdHIobnJ0JHNwNTAwX3JhdykNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBGb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQojIEVuc3VyZSB0aGUgJ0RhdGUnIGNvbHVtbiBpcyBvZiBEYXRlIGNsYXNzDQpucnQkc3A1MDBfcmF3IDwtIG5ydCRzcDUwMF9yYXcgJT4lDQogIG11dGF0ZShEYXRlID0gYXMuRGF0ZShEYXRlLCBmb3JtYXQgPSAiJVktJW0tJWQiKSkNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIGZvcm1hdChtaW4obnJ0JHNwNTAwX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpLCAiJVkiKQ0KbWF4X3llYXIgPC0gZm9ybWF0KG1heChucnQkc3A1MDBfcmF3JERhdGUsIG5hLnJtID0gVFJVRSksICIlWSIpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIFVwZGF0ZSBkYXRhIGZyYW1lIHdpdGggcHJvcGVyIGRhdGUgYW5kIHBlcmNlbnRhZ2UgaGFuZGxpbmcNCm5ydCRzcDUwMF9yYXcgPC0gbnJ0JHNwNTAwX3JhdyAlPiUNCiAgbXV0YXRlKA0KICAgICMgQ29udmVydCBDbG9zZSBEYXRlIHRvICJZWVlZLU1NLUREIiBmb3JtYXQNCiAgICBgRGF0ZWAgPSBmb3JtYXQoYXMuRGF0ZShhcy5jaGFyYWN0ZXIoYERhdGVgKSwgb3JpZ2luID0gIjE5NzAtMDEtMDEiKSwgIiVZLSVtLSVkIiksDQoNCiAgICAjIEVuc3VyZSBDbG9zZSBpcyBhIG51bWJlciBmb3JtYXR0ZWQgdG8gMiBkZWNpbWFsIHBsYWNlcw0KICAgIGBDbG9zZWAgPSBudW1iZXIoYXMubnVtZXJpYyhnc3ViKCIsIiwgIiIsIENsb3NlKSksIGJpZy5tYXJrID0gIiwiLCBkZWNpbWFsLm1hcmsgPSAiLiIsIGFjY3VyYWN5ID0gMC4wMSksDQoNCiAgICAjIENsZWFuIGFuZCBoYW5kbGUgcGVyY2VudGFnZSBjb2x1bW5zDQogICAgYWNyb3NzKDM6MywgfiB7DQogICAgICB2YWx1ZSA8LSBnc3ViKCJbLCVcXHNdIiwgIiIsIC4pICAjIFJlbW92ZSAlLCBjb21tYXMsIGFuZCBzcGFjZXMNCiAgICAgIG51bWVyaWNfdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKHZhbHVlKSkgICMgQ29udmVydCB0byBudW1lcmljDQogICAgICBpZmVsc2UoDQogICAgICAgICFpcy5uYShudW1lcmljX3ZhbHVlKSwgDQogICAgICAgIHBhc3RlMChmb3JtYXQocm91bmQobnVtZXJpY192YWx1ZSoxMDAsIDIpLCBiaWcubWFyayA9ICIsIiwgc2NpZW50aWZpYyA9IEZBTFNFKSwgIiUiKSwgICMgRm9ybWF0IHRvIDIgZGVjaW1hbCBwbGFjZXMgYW5kIGFkZCBjb21tYXMNCiAgICAgICAgLg0KICAgICAgKQ0KICAgIH0pDQogICkgJT4lDQogIGFycmFuZ2UoZGVzYyhgRGF0ZWApKSAgIyBTb3J0IGJ5IERhdGUgZnJvbSBuZXdlc3QgdG8gb2xkZXN0DQoNCiMgRGlzcGxheSB0aGUgZm9ybWF0dGVkIGRhdGENCmludGVyYWN0aXZlX3N0cihucnQkc3A1MDBfcmF3KQ0KaW50ZXJhY3RpdmVfcHJpbnQobnJ0JHNwNTAwX3JhdykNCg0KIyBEaXNwbGF5IHRoZSB0YWJsZSB3aXRoIGNhcHRpb24NCmNhdCgiXG5cbiMjIyMgUyZQIDUwMCBZZWFybHkgUGVyZm9ybWFuY2UgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQoNCmZvcm1hdF9lcXVhbF93aWR0aF9ncm91cGVkKG5ydCRzcDUwMF9yYXcsIGdyb3VwaW5nX2ZhY3RvciA9IDIpDQojIGNhdCgiXG5cbiBTb3VyY2U6ICIsIG5ydiRzb3VyY2Vfc3A1MDBfbXVsdHBsLCAiXG4iKQ0KDQpgYGANCg0KDQojIyMgU3VtbWFyeQ0KDQpgYGB7ciBzcDUwMF9yYXdfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KaW50ZXJhY3RpdmVfc3RyKG5ydCRzcDUwMF9yYXcpDQppbnRlcmFjdGl2ZV9wcmludChucnQkc3A1MDBfcmF3KQ0KDQojIEVuc3VyZSB0aGUgRGF0ZSBjb2x1bW4gaXMgYSBwcm9wZXIgRGF0ZSBvYmplY3QgYW5kIGV4dHJhY3QgdGhlIHllYXINCm5ydCRzcDUwMF9yYXcgPC0gbnJ0JHNwNTAwX3JhdyAlPiUNCiAgc2xpY2UoLTEpICU+JSAjIFJlbW92ZSB0aGUgZmlyc3Qgcm93DQogICMgbXV0YXRlKERhdGUgPSBpZmVsc2Uocm93X251bWJlcigpID09IDEsICIyMDI1LTAxLTAxIiwgRGF0ZSkpICU+JQ0KICBtdXRhdGUoDQogICAgRGF0ZSA9IGFzLm51bWVyaWMoZm9ybWF0KGFzLkRhdGUoRGF0ZSwgZm9ybWF0ID0gIiVZLSVtLSVkIiksICIlWSIpKSwNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCJbXjAtOS4tXSIsICIiLCBgMS1ZZWFyIENBR1JgKSkNCiAgKQ0KDQojIFNvcnQgZGF0YSBieSBEYXRlIGluIGFzY2VuZGluZyBvcmRlcg0KbnJ0JHNwNTAwX3JhdyA8LSBucnQkc3A1MDBfcmF3ICU+JQ0KICBhcnJhbmdlKERhdGUpDQoNCg0KIyBDYWxjdWxhdGUgdGhlIENBR1IgYW5kIGR5bmFtaWNhbGx5IGNyZWF0ZSBhIHZhcmlhYmxlIG5hbWUgd2l0aCB0aGUgZm9ybWF0IHNwNTAwX2NhZ3JfdmFsdWVfczxtaW5feWVhcj5fZTxtYXhfeWVhcj4NCmluaXRpYWxfdmFsdWUgPC0gMTAwICAjIEFzc3VtaW5nIGFuIGluaXRpYWwgaW5kZXggdmFsdWUgb2YgMTAwDQpmaW5hbF92YWx1ZSA8LSBpbml0aWFsX3ZhbHVlICogcHJvZCgxICsgbnJ0JHNwNTAwX3JhdyRgMS1ZZWFyIENBR1JgIC8gMTAwLCBuYS5ybSA9IFRSVUUpDQptaW5feWVhciA8LSBtaW4obnJ0JHNwNTAwX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobnJ0JHNwNTAwX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQpudW1feWVhcnMgPC0gbWF4X3llYXIgLSBtaW5feWVhcg0KY2Fncl92YWx1ZSA8LSByb3VuZCgoKGZpbmFsX3ZhbHVlIC8gaW5pdGlhbF92YWx1ZSleKDEgLyBudW1feWVhcnMpIC0gMSkgKiAxMDAsIDIpDQp2YXJfbmFtZSA8LSBwYXN0ZTAoInNwNTAwX2NhZ3JfdmFsdWVfcyIsIG1pbl95ZWFyLCAiX2UiLCBtYXhfeWVhcikNCmFzc2lnbih2YXJfbmFtZSwgY2Fncl92YWx1ZSkNCg0KIyBDb252ZXJ0IFMmUCA1MDAgZGF0YSB0byBudW1lcmljLCByZW1vdmluZyBhbnkgcGVyY2VudGFnZSBzaWducw0KZGF0YSA8LSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgbnJ0JHNwNTAwX3JhdyRgMS1ZZWFyIENBR1JgKSkNCg0KIyBDYWxjdWxhdGUgc3RhdGlzdGljcw0KY291bnRfb2JzZXJ2YXRpb25zIDwtIHN1bSghaXMubmEoZGF0YSkpDQptZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCnNkX3ZhbHVlIDwtIHJvdW5kKHNkKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQptaW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gc2RfdmFsdWUsIDIpDQptYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgc2RfdmFsdWUsIDIpDQptaW5fdmFsdWUgPC0gcm91bmQobWluKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQptYXhfdmFsdWUgPC0gcm91bmQobWF4KGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQoNCiMgVGFyZ2V0IFJhdGUgQW5hbHlzaXMgLSBSZWZlciB0byAiUHJlZmVycmVkIFRhcmdldHMiIG9yIGluY2x1ZGUgYmVsb3cgZm9yIGluZGl2aWR1YWwgY2hhbmdlcy4NCmFib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2luZmxhdGlvbiwgbmEucm0gPSBUUlVFKQ0KYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfY29uc2VydmF0aXZlLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfYWdncmVzc2l2ZSwgbmEucm0gPSBUUlVFKQ0KDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfbW9kZXJhdGUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KDQojIENvbXBpbGUgc3RhdGlzdGljcyBpbnRvIGEgbGlzdCBmb3IgZWFzeSBjb252ZXJzaW9uIHRvIGEgZGF0YSBmcmFtZSB3aXRoIGRlZmluaXRpb25zDQpzcDUwMF9yYXdfc3VtbWFyeSA8LSB0cmliYmxlKA0KICB+U3RhdGlzdGljLCB+VmFsdWUsIH5EZWZpbml0aW9uLA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiwgYXMuY2hhcmFjdGVyKGNvdW50X29ic2VydmF0aW9ucyksICJUb3RhbCBudW1iZXIgb2YgZGF0YSBwb2ludHMgY29sbGVjdGVkIG92ZXIgdGhlIHNwZWNpZmljIHBlcmlvZC4iLA0KICAiQ0FHUiIsIHBhc3RlMChjYWdyX3ZhbHVlLCAiJSIpLCAiQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZTsgbWVhbiBncm93dGggcmF0ZSBvdmVyIGEgcGVyaW9kIGlmIGl0IGhhZCBjb21wb3VuZGVkIGFudWFsbHkuIiwNCiAgIk1lYW4iLCBwYXN0ZTAobWVhbl92YWx1ZSwgIiUiKSwgIlJlZmxlY3RzIHRoZSBnZW5lcmFsIHByaWNlIGxldmVsIGFuZCBvdmVyYWxsIGdyb3d0aCByYXRlLiIsDQogICJNZWRpYW4iLCBwYXN0ZTAobWVkaWFuX3ZhbHVlLCAiJSIpLCAiTWlkZGxlIHZhbHVlIG9mIHRoZSBkYXRhIHdoZW4gb3JkZXJlZCBjaHJvbm9sb2dpY2FsbHk7IGNlbnRyYWwgdGVuZGVuY3kgbWVhc3VyZSBsZXNzIGFmZmVjdGVkIGJ5IGV4dHJlbWUgdmFsdWVzLiIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiwgcGFzdGUwKHNkX3ZhbHVlLCAiJSIpLCAiVGhlIGRpc3BlcnNpb24gb2YgdmFsdWVzIGZyb20gdGhlIG1lYW4sIGluZGljYXRpbmcgdGhlIHZvbGF0aWxpdHkgb2YgcHJpY2UgY2hhbmdlcyBhbmQgZWNvbm9taWMgc3RhYmlsaXR5LiIsDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIsIHBhc3RlMChtaW5fY2Fncl9yYW5nZSwgIiUiKSwgIkxvd2VyIGJvdW5kYXJ5IG9mIGV4cGVjdGVkIFMmUCA1MDAgcmFuZ2U7IGxvd2VzdCBlc3RpbWF0ZSBvZiB0eXBpY2FsIGdyb3d0aCByYXRlIGNvbnNpZGVyaW5nIG5vcm1hbCBmbHVjdHVhdGlvbnMuIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiwgcGFzdGUwKG1heF9jYWdyX3JhbmdlLCAiJSIpLCAiVXBwZXIgYm91bmRhcnkgb2YgZXhwZWN0ZWQgUyZQIDUwMCByYW5nZTsgaGlnaGVzdCBlc3RpbWF0ZSBvZiB0eXBpY2FsIGdyb3d0aCByYXRlIGNvbnNpZGVyaW5nIG5vcm1hbCBmbHVjdHVhdGlvbnMuIiwNCiAgIk1pbmltdW0iLCBwYXN0ZTAobWluX3ZhbHVlLCAiJSIpLCAiTG93ZXN0IGdyb3d0aCByYXRlLiIsDQogICJNYXhpbXVtIiwgcGFzdGUwKG1heF92YWx1ZSwgIiUiKSwgIkhpZ2hlc3QgZ3Jvd3RoIHJhdGUuIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgaW5mbGF0aW9uIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iLA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBjb25zZXJ2YXRpdmUgdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiIsDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBtb2RlcmF0ZSB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iDQopDQoNCiMgQ29udmVydCB0byBjaGFyYWN0ZXIgdG8gYXZvaWQgYXV0b21hdGljIGRlY2ltYWwgcG9pbnRzIG9uIHdob2xlIG51bWJlcnMNCnNwNTAwX3Jhd19zdW1tYXJ5IDwtIHNwNTAwX3Jhd19zdW1tYXJ5ICU+JQ0KICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgYXMuY2hhcmFjdGVyKSkNCg0KIyBEaXNwbGF5IGZvcm1hdHRlZCB0YWJsZQ0KY2F0KCJcblxuIyMjIyBBbm51YWwgR3Jvd3RoIFJhdGUgU3VtbWFyeSAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF8zY29sX2N1c3RvbV93aWR0aHMoc3A1MDBfcmF3X3N1bW1hcnksIGNvbDFfd2lkdGggPSAiMjBlbSIsIGNvbDJfd2lkdGggPSAiMTBlbSIsIGNvbDNfd2lkdGggPSAiNDBlbSIpIA0KDQojIFZpZXcoc3A1MDBfcmF3X3N1bW1hcnkpDQppbnRlcmFjdGl2ZV9zdHIoc3A1MDBfcmF3X3N1bW1hcnkpDQoNCmBgYA0KDQpUaGUgUyZQIDUwMCdzIEluZGV4IGV4aGliaXRzIGEgYHIgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9hZ2dyZXNzaXZlKSAiYWdncmVzc2l2ZSIgZWxzZSBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X21vZGVyYXRlKSAibW9kZXJhdGUiIGVsc2UgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9jb25zZXJ2YXRpdmUpICJjb25zZXJ2YXRpdmUiIGVsc2UgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9pbmZsYXRpb24pICJiYXNlbGluZSIgZWxzZSAiZGlzYXBwb2ludGluZyJgIENBR1IgYXQgYHIgY2Fncl92YWx1ZWAlLCBgciBpZihjYWdyX3ZhbHVlIDwgbWVhbl92YWx1ZSkgImxvd2VyIHRoYW4iIGVsc2UgImhpZ2hlciB0aGFuImAgdGhlIG1lYW4gZ3Jvd3RoIHJhdGUgb2YgYHIgbWVhbl92YWx1ZWAlLCByZWZsZWN0aW5nIHRoZSBpbXBhY3Qgb2Ygc2hvcnQtdGVybSB2b2xhdGlsaXR5IGFuZCBgciBpZihjYWdyX3ZhbHVlID4gbWVhbl92YWx1ZSkgImRlY2xpbmVzIiBlbHNlICJncm93dGggc3Bpa2VzImAuIFRoZSBtZWRpYW4gcmV0dXJuIG9mIGByIG1lZGlhbl92YWx1ZWAlIGluZGljYXRlcyB0aGF0IG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBvYnNlcnZlZCB5ZWFycyBleHBlcmllbmNlZCByZXR1cm5zIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJhYm92ZSIgZWxzZSAiYmVsb3ciYCB0aGUgbWVhbi4gVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBDQUdSIGFuZCB0aGUgbWVkaWFuIGdyb3d0aCByYXRlIHN1Z2dlc3RzIHRoYXQgc3VzdGFpbmVkIHBlcmlvZHMgb2YgYWJvdmUtbWVkaWFuIGdyb3d0aCBoYXZlIGV4ZXJ0ZWQgY3VtdWxhdGl2ZSBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAidXB3YXJkIHByZXNzdXJlIiBlbHNlICJkb3dud2FyZCBwcmVzc3VyZSJgIG9uIG92ZXJhbGwgcHJpY2UgbGV2ZWxzLiBUaGlzIHJlbGF0aW9uc2hpcCBoaWdobGlnaHRzIGEgZGlzdHJpYnV0aW9uIHdpdGggbm90YWJsZSBleHRyZW1lcyBvbiB0aGUgYHIgaWYoY2Fncl92YWx1ZSA8IG1lYW5fdmFsdWUpICJoaWdoZXIiIGVsc2UgImxvd2VyImAgZW5kLCByZWZsZWN0aW5nIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWFuX3ZhbHVlKSAicG9zaXRpdmUiIGVsc2UgIm5lZ2F0aXZlImAgc2tld25lc3MuIFRoaXMgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgInBvc2l0aXZlIiBlbHNlICJuZWdhdGl2ZSJgIHNrZXduZXNzIGltcGxpZXMgdGhhdCB3aGlsZSBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgb2JzZXJ2ZWQgeWVhcnMgZXhwZXJpZW5jZWQgcmV0dXJucyBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAiYWJvdmUgdGhlIG1lYW4sIGRvd250dXJucyBjYW4gYmUgc2V2ZXJlIiBlbHNlICJiZWxvdyB0aGUgbWVhbiwgdXB0dXJucyBjYW4gYmUgc2lnbmlmaWNhbnQiYC4gSG93ZXZlciwgdGhlIG1hcmtldCBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHN1YnN0YW50aWFsIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJ1cHNpZGUgcG90ZW50aWFsIiBlbHNlICJkb3duc2lkZSByaXNrImAuIEFkZGl0aW9uYWxseSwgdGhlIGZhY3QgdGhhdCBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25gJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGluZmxhdGlvbiB0YXJnZXQgYHIgaWYgKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA+IDcwKSAicmVpbmZvcmNlcyB0aGUgUyZQIDUwMCdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBzdHJvbmcgbG9uZy10ZXJtIGhlZGdlIiBlbHNlIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA2MCkgInJlaW5mb3JjZXMgdGhlIFMmUCA1MDAncyBlZmZlY3RpdmVuZXNzIGFzIGEgbG9uZy10ZXJtIGhlZGdlIiBlbHNlIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA1MCkgInF1ZXN0aW9ucyB0aGUgUyZQIDUwMCdzIGVmZmVjdGl2ZW5lc3MgIGFzIGEgbG9uZy10ZXJtIGhlZGdlIiBlbHNlICJ1bmRlcm1pbmVzIHRoZSBTJlAgNTAwJ3MgZWZmZWN0aXZlbmVzcyBhcyBhIGxvbmctdGVybSBoZWRnZSJgIGFnYWluc3QgaW5mbGF0aW9uLg0KDQpUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlYCUgYHIgaWYoc2RfdmFsdWUgPiAyMCkgImluZGljYXRlcyBleHRyZW1lIHZvbGF0aWxpdHksIHJlZmxlY3Rpbmcgc3Vic3RhbnRpYWwgZmx1Y3R1YXRpb25zIGluIGVxdWl0eSBtYXJrZXRzIiBlbHNlIGlmKHNkX3ZhbHVlID4gMTUpICJ1bmRlcnNjb3JlcyBzaWduaWZpY2FudCB2b2xhdGlsaXR5LCBhIGNvbW1vbiBmZWF0dXJlIG9mIGVxdWl0eSBtYXJrZXRzIiBlbHNlICJzdWdnZXN0cyBtb2RlcmF0ZSB2b2xhdGlsaXR5LCB0eXBpY2FsIG9mIHJlbGF0aXZlbHkgc3RhYmxlIG1hcmtldHMiYC4gVGhlIGByIHJhbmdlX3JhdGlvIDwtIChtYXhfdmFsdWUgLSBtaW5fdmFsdWUpIC8gc2RfdmFsdWU7IGlmKHJhbmdlX3JhdGlvID4gNSkgImhpZ2hseSB2b2xhdGlsZSIgZWxzZSBpZihyYW5nZV9yYXRpbyA+IDMpICJub3RhYmxlIiBlbHNlICJjb21wYXJhdGl2ZWx5IHN0YWJsZSJgIHJhbmdlIG9mIGFubnVhbCByZXR1cm5zLCBzcGFubmluZyBmcm9tIGByIG1pbl92YWx1ZWAlIHRvIGByIG1heF92YWx1ZWAlLCBgciBpZihyYW5nZV9yYXRpbyA+IDUpICJpbGx1c3RyYXRlcyBhIGhpZ2hseSB2b2xhdGlsZSBtYXJrZXQgZW52aXJvbm1lbnQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIHRoZSBwb3RlbnRpYWwgZm9yIGJvdGggZXh0cmVtZSBnYWlucyBhbmQgbG9zc2VzIiBlbHNlIGlmKHJhbmdlX3JhdGlvID4gMykgImhpZ2hsaWdodHMgbm90YWJsZSBtYXJrZXQgdmFyaWFiaWxpdHksIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCAgcmVmbGVjdGluZyBib3RoIG9wcG9ydHVuaXRpZXMgYW5kIHJpc2tzIiBlbHNlICJpbmRpY2F0ZXMgYSBjb21wYXJhdGl2ZWx5IHN0YWJsZSBtYXJrZXQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIGxlc3MgZXh0cmVtZSBhbm51YWwgZmx1Y3R1YXRpb25zImAuIA0KDQpGb3IgdGhlIFMmUCA1MDAgdG8gYmUgY29uc2lkZXJlZCBhIGhpZ2gtcGVyZm9ybWluZyBhbmQgcmVzaWxpZW50IGxvbmctdGVybSBpbnZlc3RtZW50LCBpdCB3b3VsZCBiZSBpZGVhbCB0byBleGNlZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IChlLmcuLCBgciAodGFyZ2V0X2FnZ3Jlc3NpdmUgLSB0YXJnZXRfaW5mbGF0aW9uKWAlIGFubnVhbGl6ZWQgcmV0dXJucywgYWNjb3VudGluZyBmb3IgaGlnaGVyIGluZmxhdGlvbi1hZGp1c3RlZCBwZXJmb3JtYW5jZSBleHBlY3RhdGlvbnMpIGluIGF0IGxlYXN0IDQwJS01MCUgb2YgdGhlIHllYXJzLiBUaGlzIHJhbmdlIHJlZmxlY3RzIHRoZSBwb3RlbnRpYWwgZm9yIHN0cm9uZyB1cHNpZGUgaW4gbWFueSB5ZWFycyB3aGlsZSBiYWxhbmNpbmcgdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBtYXJrZXRzIGRvIGV4cGVyaWVuY2UgZG93bnR1cm5zLiBUaGUgZmFjdCB0aGF0IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA1MCkgImluZGljYXRlcyBjb25zaXN0ZW50IGFuZCByb2J1c3QgZ3Jvd3RoLCBtYWtpbmcgdGhlIFMmUCA1MDAgYSBzdHJvbmcgb3B0aW9uIGZvciB0aG9zZSBzZWVraW5nIGFnZ3Jlc3NpdmUgaW52ZXN0bWVudHMuIiBlbHNlIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA0MCkgInN1Z2dlc3RzIHRoYXQgd2hpbGUgbm90IGNvbnNpc3RlbnQsIHRoZSBTJlAgNTAwIGhhcyBoaXN0b3JpY2FsbHkgcHJvdmlkZWQgcm9idXN0IGdyb3d0aCBvdmVyIHRoZSBsb25nIHRlcm0sIG1ha2luZyBpdCBhIHZpYWJsZSBpbnZlc3RtZW50IGZvciB0aG9zZSB3aXRoIGEgaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiIgZWxzZSAicmFpc2VzIGNvbmNlcm5zIGFib3V0IHRoZSBTJlAgNTAwJ3MgYWJpbGl0eSB0byBtZWV0IGFnZ3Jlc3NpdmUgZ3Jvd3RoIHRhcmdldHMsIG1ha2luZyBpdCBsZXNzIHN1aXRhYmxlIGZvciBpbnZlc3RvcnMgd2l0aCBoaWdoZXIgcmlzayB0b2xlcmFuY2UuImANCg0KIyMjIEdyYXBoDQoNCmBgYHtyIG5ydCRzcDUwMF9yYXdfZ3JhcGgsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgQ29udmVydCBgMS1ZZWFyIENBR1JgIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nDQpucnQkc3A1MDBfcmF3IDwtIG5ydCRzcDUwMF9yYXcgJT4lDQogIG11dGF0ZSgNCiAgICBgRGF0ZWAgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihgRGF0ZWApKSwgICMgRW5zdXJlIERhdGUgaXMgbnVtZXJpYw0KICAgIGAxLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDEtWWVhciBDQUdSYCkpDQogICkNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihucnQkc3A1MDBfcmF3JERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihucnQkc3A1MDBfcmF3JERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihucnQkc3A1MDBfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChucnQkc3A1MDBfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAxOTAwDQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJBbm51YWwgR3Jvd3RoIFJhdGVzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJTJlAgNTAwIEFubnVhbCBHcm93dGggUmF0ZXMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIuKAkyIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KG5ydCRzcDUwMF9yYXcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IGAxLVllYXIgQ0FHUmApKSArDQogIA0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMsIHBvaW50cywgYW5kIGFubm90YXRpb25zIG9uIHRvcCBvZiBzaGFkZWQgYXJlYXMNCiAgZ2VvbV9saW5lKGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS4wKSArICAgICAgICMgRGFyayBwdXJwbGUgbGluZSANCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuNSkgKyAgICAgICAgIyBEYXJrIHB1cnBsZSBwb2ludHMgDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiR3Jvd3RoIFJhdGUgKCUpIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICkgKw0KDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMTApLCAjIFJlc3RyaWN0cyB4LWF4aXMgZGF0YSANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciArIDUsIDUpICMgU2V0cyBNYWpvciB4LWF4aXMgIA0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIA0KICAgIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICAgICAgICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICMgZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXk4MCIpICAjIE1pbm9yIHggZ3JpZCBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogICAgIyBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiZGFya2dyZXkiLCBmaWxsID0gTkEsIHNpemUgPSAxLjApICAjIERhcmsgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdA0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCnByaW50KHAxKQ0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgUkVTVFJJQ1RFRCBXSVRIIExJTUlUUw0KDQojIEZpbHRlciB0aGUgZGF0YSBmb3IgdGhlIHJlc3RyaWN0ZWQgeC1heGlzIHJhbmdlICgxOTc1LTIwMjQpDQpyZXN0cmljdGVkX2RhdGEgPC0gbnJ0JHNwNTAwX3JhdyAlPiUNCiAgZmlsdGVyKGFzLmludGVnZXIoRGF0ZSkgPj0gMTk3NSAmIGFzLmludGVnZXIoRGF0ZSkgPD0gMjAyNCkNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAxOTc1DQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJBbm51YWwgR3Jvd3RoIFJhdGVzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJTJlAgNTAwIEFubnVhbCBHcm93dGggUmF0ZXMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIuKAkyIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ2FsY3VsYXRlIGR5bmFtaWMgeS1heGlzIGxpbWl0cyBmb3IgdGhlIHJlc3RyaWN0ZWQgZGF0YQ0KeV9taW4gPC0gbWluKHJlc3RyaWN0ZWRfZGF0YSRgMS1ZZWFyIENBR1JgLCBuYS5ybSA9IFRSVUUpDQp5X21heCA8LSBtYXgocmVzdHJpY3RlZF9kYXRhJGAxLVllYXIgQ0FHUmAsIG5hLnJtID0gVFJVRSkNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMiA8LSBnZ3Bsb3QocmVzdHJpY3RlZF9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBgMS1ZZWFyIENBR1JgKSkgKw0KICANCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDE1KSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMTUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxNSkgKw0KICANCiAgIyBQbG90IGxpbmVzLCBwb2ludHMsIGFuZCBhbm5vdGF0aW9ucyBvbiB0b3Agb2Ygc2hhZGVkIGFyZWFzDQogIGdlb21fbGluZShjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuMCkgKyAgICAgICAjIERhcmsgcHVycGxlIGxpbmUgDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjUpICsgICAgICAgICMgRGFyayBwdXJwbGUgcG9pbnRzIA0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiR3Jvd3RoIFJhdGUgKCUpIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICkgKw0KICANCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHlfbWluLCB5X21heCkpICsgIyBBcHBseSBkeW5hbWljIHktYXhpcyBsaW1pdHMNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyA1KSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAgICAgICAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAjIGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiKSAgIyBNaW5vciB4IGdyaWQgbGluZXMgZm9yIGVhY2ggeWVhcg0KICAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImRhcmtncmV5IiwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSAgIyBEYXJrIGJvcmRlciBhcm91bmQgdGhlIHBsb3QNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQpwcmludChwMikNCg0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgUkVTVFJJQ1RFRCBXSVRIIExJTUlUUw0KDQojIEZpbHRlciB0aGUgZGF0YSBmb3IgdGhlIHJlc3RyaWN0ZWQgeC1heGlzIHJhbmdlICgyMDA1LTIwMjQpDQpyZXN0cmljdGVkX2RhdGEgPC0gbnJ0JHNwNTAwX3JhdyAlPiUNCiAgZmlsdGVyKGFzLmludGVnZXIoRGF0ZSkgPj0gMjAwNSAmIGFzLmludGVnZXIoRGF0ZSkgPD0gMjAyNCkNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDA1DQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJBbm51YWwgR3Jvd3RoIFJhdGVzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJTJlAgNTAwIEFubnVhbCBHcm93dGggUmF0ZXMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIuKAkyIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ2FsY3VsYXRlIGR5bmFtaWMgeS1heGlzIGxpbWl0cyBmb3IgdGhlIHJlc3RyaWN0ZWQgZGF0YQ0KeV9taW4gPC0gbWluKHJlc3RyaWN0ZWRfZGF0YSRgMS1ZZWFyIENBR1JgLCBuYS5ybSA9IFRSVUUpDQp5X21heCA8LSBtYXgocmVzdHJpY3RlZF9kYXRhJGAxLVllYXIgQ0FHUmAsIG5hLnJtID0gVFJVRSkNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMyA8LSBnZ3Bsb3QocmVzdHJpY3RlZF9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBgMS1ZZWFyIENBR1JgKSkgKw0KICANCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAzMCkgKw0KICANCiAgIyBQbG90IGxpbmVzLCBwb2ludHMsIGFuZCBhbm5vdGF0aW9ucyBvbiB0b3Agb2Ygc2hhZGVkIGFyZWFzDQogIGdlb21fbGluZShjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuMCkgKyAgICAgICAjIERhcmsgcHVycGxlIGxpbmUgDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjUpICsgICAgICAgICMgRGFyayBwdXJwbGUgcG9pbnRzIA0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiR3Jvd3RoIFJhdGUgKCUpIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICkgKw0KICANCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHlfbWluLCB5X21heCkpICsgIyBBcHBseSBkeW5hbWljIHktYXhpcyBsaW1pdHMNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAyKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgICAgICAgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgIyBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JleTgwIikgICMgTWlub3IgeCBncmlkIGxpbmVzIGZvciBlYWNoIHllYXINCiAgICAjIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJkYXJrZ3JleSIsIGZpbGwgPSBOQSwgc2l6ZSA9IDEuMCkgICMgRGFyayBib3JkZXIgYXJvdW5kIHRoZSBwbG90DQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KcHJpbnQocDMpDQoNCmBgYA0KDQojIyBTJlAgNTAwIENBR1INCg0KIyMjIERhdGENCg0KYGBge3IgbnJ0JHNwNTAwX3Jhd19nciwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIFZpZXcobnJ0JHNwNTAwX3Jhd19ncikNCmludGVyYWN0aXZlX3N0cihucnQkc3A1MDBfcmF3X2dyKQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShsdWJyaWRhdGUpICAjIEZvciBkYXRlIG1hbmlwdWxhdGlvbg0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHN0cmluZ3IpDQoNCiMgVXBkYXRlIGRhdGEgZnJhbWUgd2l0aCBwcm9wZXIgZGF0ZSBhbmQgcGVyY2VudGFnZSBoYW5kbGluZw0KbnJ0JHNwNTAwX3Jhd19nciA8LSBucnQkc3A1MDBfcmF3X2dyICU+JQ0KICBtdXRhdGUoDQogICAgIyBDb252ZXJ0IENsb3NlIERhdGUgdG8gIllZWVktTU0tREQiIGZvcm1hdA0KICAgIGBEYXRlYCA9IGZvcm1hdChhcy5EYXRlKGFzLmNoYXJhY3RlcihgRGF0ZWApLCBvcmlnaW4gPSAiMTk3MC0wMS0wMSIpLCAiJVktJW0tJWQiKSwNCiAgICANCiAgICAjIEVuc3VyZSBDbG9zZSBpcyBhIG51bWJlciBmb3JtYXR0ZWQgdG8gMiBkZWNpbWFsIHBsYWNlcw0KICAgIGBDbG9zZWAgPSBudW1iZXIoYXMubnVtZXJpYyhnc3ViKCIsIiwgIiIsIENsb3NlKSksIGJpZy5tYXJrID0gIiwiLCBkZWNpbWFsLm1hcmsgPSAiLiIsIGFjY3VyYWN5ID0gMC4wMSksDQoNCiAgICAjIENsZWFuIGFuZCBoYW5kbGUgcGVyY2VudGFnZSBjb2x1bW5zDQogICAgYWNyb3NzKDM6MTEsIH4gew0KICAgICAgdmFsdWUgPC0gZ3N1YigiWywlXFxzXSIsICIiLCAuKSAgIyBSZW1vdmUgJSwgY29tbWFzLCBhbmQgc3BhY2VzDQogICAgICBudW1lcmljX3ZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh2YWx1ZSkpICAjIENvbnZlcnQgdG8gbnVtZXJpYw0KICAgICAgaWZlbHNlKA0KICAgICAgICAhaXMubmEobnVtZXJpY192YWx1ZSksIA0KICAgICAgICBwYXN0ZTAoZm9ybWF0KHJvdW5kKG51bWVyaWNfdmFsdWUqMTAwLCAyKSwgYmlnLm1hcmsgPSAiLCIsIHNjaWVudGlmaWMgPSBGQUxTRSksICIlIiksICAjIEZvcm1hdCB0byAyIGRlY2ltYWwgcGxhY2VzIGFuZCBhZGQgY29tbWFzDQogICAgICAgIC4NCiAgICAgICkNCiAgICB9KQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoYERhdGVgKSkgICMgU29ydCBieSBEYXRlIGZyb20gbmV3ZXN0IHRvIG9sZGVzdA0KDQojIENyZWF0ZSBucnQkc3A1MDBfcmF3X2dyOiBDR1INCm5ydCRzcDUwMF9yYXdfY2dyIDwtIG5ydCRzcDUwMF9yYXdfZ3IgJT4lDQogIHNlbGVjdChgRGF0ZWAsIGBDbG9zZWAsIGAxLVllYXIgQ0FHUmAsIGNvbnRhaW5zICgiQ0dSIikpDQoNCiMgQ3JlYXRlIG5ydCRzcDUwMF9yYXdfZ3I6IENBR1INCm5ydCRzcDUwMF9yYXdfY2FnciA8LSBucnQkc3A1MDBfcmF3X2dyICU+JQ0KICBzZWxlY3QoYERhdGVgLCBgQ2xvc2VgLCBjb250YWlucyAoIkNBR1IiKSkNCg0KIyBEaXNwbGF5IGJvdGggdGFibGVzIGZvciBjb25maXJtYXRpb24NCmludGVyYWN0aXZlX3ByaW50KG5ydCRzcDUwMF9yYXdfY2dyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobnJ0JHNwNTAwX3Jhd19jYWdyKQ0KDQojIE9wdGlvbmFsOiBQcmludCB0YWJsZSBzdW1tYXJpZXMNCmludGVyYWN0aXZlX3N0cihucnQkc3A1MDBfcmF3X2NncikNCmludGVyYWN0aXZlX3N0cihucnQkc3A1MDBfcmF3X2NhZ3IpDQoNCiMgRGlzcGxheSBjYXB0aW9ucyBmb3IgZWFjaCB0YWJsZQ0KIyBjYXQoIlxuXG4jIyMjIEN1bXVsYXRpdmUgR3Jvd3RoIFJhdGVzICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KIyBmb3JtYXRfZXF1YWxfd2lkdGgobnJ0JHNwNTAwX3Jhd19jZ3IpDQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGgobnJ0JHNwNTAwX3Jhd19jYWdyKQ0KDQojIFZpZXcobnJ0JHNwNTAwX3Jhd19jYWdyKQ0KIyBjb2xuYW1lcyhucnQkc3A1MDBfcmF3X2NhZ3IpDQppbnRlcmFjdGl2ZV9zdHIobnJ0JHNwNTAwX3Jhd19jYWdyKQ0KDQoNCmBgYA0KDQojIyMgU3VtbWFyeQ0KDQpgYGB7ciBzcDUwMF9yYXdfY2Fncl9zdW1tYXJ5LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmludGVyYWN0aXZlX3N0cihucnQkc3A1MDBfcmF3X2NhZ3IpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWJibGUpDQoNCiMgRGVmaW5lIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFuIGFuZCBjb252ZXJ0IHBlcmNlbnRhZ2VzDQpjbGVhbl9wZXJjZW50YWdlIDwtIGZ1bmN0aW9uKGNvbHVtbikgew0KICBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sdW1uKSkNCn0NCg0KIyBEZWZpbmUgdGhlIHN0YXRpc3RpYyBuYW1lcyBmb3IgdGhlIHN1bW1hcnkgdGFibGUNCnN0YXRpc3RpY19uYW1lcyA8LSBjKA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiwgDQogICJNZWFuIiwgDQogICJNZWRpYW4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiLA0KICAiTWluaW11bSIsIA0KICAiTWF4aW11bSIsIA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0Ig0KKQ0KDQojIEFkanVzdCB0aGUgZmlyc3Qgcm93J3MgRGF0ZSBhbmQgY2xlYW4gdXAgQ0FHUiBjb2x1bW5zDQpucnQkc3A1MDBfcmF3X2NhZ3IgPC0gbnJ0JHNwNTAwX3Jhd19jYWdyICU+JQ0KICBzbGljZSgtMSkgJT4lICMgUmVtb3ZlIHRoZSBmaXJzdCByb3cNCiAgbXV0YXRlKA0KICAgICMgRGF0ZSA9IGlmZWxzZShyb3dfbnVtYmVyKCkgPT0gMSwgIjIwMjUtMDEtMDEiLCBEYXRlKSwNCiAgICBEYXRlID0gYXMubnVtZXJpYyhmb3JtYXQoYXMuRGF0ZShEYXRlKSwgIiVZIikpLA0KICAgIGAxLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAxLVllYXIgQ0FHUmApLA0KICAgIGA1LVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGA1LVllYXIgQ0FHUmApLA0KICAgIGAxMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMTAtWWVhciBDQUdSYCksDQogICAgYDIwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAyMC1ZZWFyIENBR1JgKSwNCiAgICBgMzAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDMwLVllYXIgQ0FHUmApDQogICkNCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgc3RhdGlzdGljcyBmb3IgYSBnaXZlbiBkYXRhc2V0DQpjYWxjX3N0YXRzIDwtIGZ1bmN0aW9uKGRhdGEpIHsNCiAgaWYgKHN1bSghaXMubmEoZGF0YSkpIDwgMikgcmV0dXJuKHJlcChOQSwgbGVuZ3RoKHN0YXRpc3RpY19uYW1lcykpKSAgIyBIYW5kbGUgaW5zdWZmaWNpZW50IGRhdGENCg0KICBjb3VudF9vYnNlcnZhdGlvbnMgPC0gc3VtKCFpcy5uYShkYXRhKSkNCiAgbWVhbl92YWx1ZSA8LSByb3VuZChtZWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIG1lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgc2RfdmFsdWUgPC0gcm91bmQoc2QoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWluX2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSAtIHNkX3ZhbHVlLCAyKQ0KICBtYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgc2RfdmFsdWUsIDIpDQogIG1pbl92YWx1ZSA8LSByb3VuZChtaW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICANCiAgIyBEZWZpbmUgaW5mbGF0aW9uIGFuZCBncm93dGggdGFyZ2V0cw0KICB0YXJnZXRfaW5mbGF0aW9uIDwtIDIgICMgRXhhbXBsZSB0YXJnZXQgZm9yIGluZmxhdGlvbg0KICB0YXJnZXRfY29uc2VydmF0aXZlIDwtIDMgKyB0YXJnZXRfaW5mbGF0aW9uDQogIHRhcmdldF9tb2RlcmF0ZSA8LSA1ICsgdGFyZ2V0X2luZmxhdGlvbg0KICB0YXJnZXRfYWdncmVzc2l2ZSA8LSAxMCArIHRhcmdldF9pbmZsYXRpb24NCiAgDQogIGFib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2luZmxhdGlvbiwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCiAgYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShkYXRhID49IHRhcmdldF9tb2RlcmF0ZSwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfYWdncmVzc2l2ZSwgbmEucm0gPSBUUlVFKQ0KICANCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQogIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgDQogIGMoDQogICAgY291bnRfb2JzZXJ2YXRpb25zLCANCiAgICBwYXN0ZTAobWVhbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWVkaWFuX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChzZF92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWluX2NhZ3JfcmFuZ2UsICIlIiksDQogICAgcGFzdGUwKG1heF9jYWdyX3JhbmdlLCAiJSIpLA0KICAgIHBhc3RlMChtaW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKG1heF92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksIA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSwgIiUiKSwgDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIikNCiAgKQ0KfQ0KDQojIENvbHVtbnMgdG8gY2FsY3VsYXRlIENBR1Igc3RhdGlzdGljcw0KY2Fncl9jb2x1bW5zIDwtIGMoIjEtWWVhciBDQUdSIiwgIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIsICIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIikNCmV4aXN0aW5nX2NhZ3JfY29sdW1ucyA8LSBpbnRlcnNlY3QoY2Fncl9jb2x1bW5zLCBuYW1lcyhucnQkc3A1MDBfcmF3X2NhZ3IpKQ0KDQojIENhbGN1bGF0ZSBzdGF0cyBmb3IgZWFjaCBDQUdSIGNvbHVtbg0KY2Fncl9zdGF0c19saXN0IDwtIGxhcHBseShucnQkc3A1MDBfcmF3X2NhZ3JbZXhpc3RpbmdfY2Fncl9jb2x1bW5zXSwgY2FsY19zdGF0cykNCg0KIyBDb21waWxlIGludG8gYSBzdW1tYXJ5IGRhdGEgZnJhbWUNCnNwNTAwX3Jhd19jYWdyX3N1bW1hcnkgPC0gYXMuZGF0YS5mcmFtZShkby5jYWxsKGNiaW5kLCBjYWdyX3N0YXRzX2xpc3QpKQ0Kcm93bmFtZXMoc3A1MDBfcmF3X2NhZ3Jfc3VtbWFyeSkgPC0gc3RhdGlzdGljX25hbWVzDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFNBVkUgVkFMVUVTIEZPUiBJTi1MSU5FIENPREUNCg0KIyBEZWZpbmUgdGhlIG1hcHBpbmcgb2Ygcm93IG5hbWVzIHRvIHZhcmlhYmxlIG5hbWVzDQpyb3dfdG9fdmFyX25hbWUgPC0gYygNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIgPSAiY291bnRfb2JzZXJ2YXRpb25zIiwNCiAgIk1lYW4iID0gIm1lYW5fdmFsdWUiLA0KICAiTWVkaWFuIiA9ICJtZWRpYW5fdmFsdWUiLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIgPSAic2RfdmFsdWUiLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiID0gIm1pbl9jYWdyX3JhbmdlIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiA9ICJtYXhfY2Fncl9yYW5nZSIsDQogICJNaW5pbXVtIiA9ICJtaW5fdmFsdWUiLA0KICAiTWF4aW11bSIgPSAibWF4X3ZhbHVlIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIiwNCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIg0KKQ0KDQojIEZ1bmN0aW9uIHRvIHNhdmUgc3VtbWFyeSB2YWx1ZXMgZHluYW1pY2FsbHkNCnNhdmVfY29sdW1uX3ZhbHVlcyA8LSBmdW5jdGlvbihzdW1tYXJ5X2RmKSB7DQogICMgRXhjbHVkZSB0aGUgIlN0YXRpc3RpYyIgYW5kICJPdmVyYWxsIiBjb2x1bW5zDQogIGNvbHVtbnNfdG9fc2F2ZSA8LSBzZXRkaWZmKG5hbWVzKHN1bW1hcnlfZGYpLCBjKCJTdGF0aXN0aWMiLCAiT3ZlcmFsbCIpKQ0KICANCiAgIyBJdGVyYXRlIG92ZXIgZWFjaCBjb2x1bW4NCiAgZm9yIChjb2wgaW4gY29sdW1uc190b19zYXZlKSB7DQogICAgIyBGb3JtYXQgY29sdW1uIG5hbWUgdG8gbG93ZXJjYXNlIGFuZCByZXBsYWNlIGludmFsaWQgY2hhcmFjdGVycw0KICAgIGNvbF9uYW1lIDwtIHRvbG93ZXIoZ3N1YigiW15hLXpBLVowLTldIiwgIl8iLCBjb2wpKQ0KICAgIA0KICAgICMgRXh0cmFjdCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IGNvbHVtbg0KICAgIGNvbF92YWx1ZXMgPC0gc3VtbWFyeV9kZltbY29sXV0NCiAgICANCiAgICAjIFNhdmUgZWFjaCB2YWx1ZSBkeW5hbWljYWxseSB1c2luZyB0aGUgbWFwcGluZyBmb3Igcm93IG5hbWVzDQogICAgZm9yIChpIGluIHNlcV9hbG9uZyhjb2xfdmFsdWVzKSkgew0KICAgICAgIyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgbmFtZSBmcm9tIHRoZSBtYXBwaW5nDQogICAgICBzdGF0X25hbWUgPC0gcm93X3RvX3Zhcl9uYW1lW3Jvd25hbWVzKHN1bW1hcnlfZGYpW2ldXQ0KICAgICAgDQogICAgICBpZiAoIWlzLm5hKHN0YXRfbmFtZSkpIHsgICMgU2tpcCBpZiBubyBtYXBwaW5nIGlzIGRlZmluZWQNCiAgICAgICAgIyBDcmVhdGUgdGhlIHZhcmlhYmxlIG5hbWUNCiAgICAgICAgdmFyX25hbWUgPC0gcGFzdGUwKHN0YXRfbmFtZSwgIl8iLCBjb2xfbmFtZSkNCiAgICAgICAgDQogICAgICAgICMgQXR0ZW1wdCBudW1lcmljIGNvbnZlcnNpb24gZm9yIGRvd25zdHJlYW0gdXNlDQogICAgICAgIHZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGNvbF92YWx1ZXNbaV0pKSkNCiAgICAgICAgDQogICAgICAgICMgQXNzaWduIHRoZSB2YWx1ZSB0byB0aGUgZ2xvYmFsIGVudmlyb25tZW50DQogICAgICAgIGFzc2lnbih2YXJfbmFtZSwgdmFsdWUsIGVudmlyID0gLkdsb2JhbEVudikNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KIyBBcHBseSB0aGUgZnVuY3Rpb24gdG8gc2F2ZSB2YWx1ZXMgZm9yIGFsbCBjb2x1bW5zIGV4Y2VwdCAiT3ZlcmFsbCINCnNhdmVfY29sdW1uX3ZhbHVlcyhzcDUwMF9yYXdfY2Fncl9zdW1tYXJ5KQ0KDQojIEV4YW1wbGU6IEFjY2Vzc2luZyBkeW5hbWljYWxseSBjcmVhdGVkIHZhcmlhYmxlcw0KaW50ZXJhY3RpdmVfcHJpbnQobWVhbl92YWx1ZV8xX3llYXJfY2FncikgICMgU2hvdWxkIHByaW50IHRoZSBtZWFuIHZhbHVlIGZvciAxLVllYXIgQ0FHUg0KaW50ZXJhY3RpdmVfcHJpbnQocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzVfeWVhcl9jYWdyKSAgIyBTaG91bGQgcHJpbnQgdGhlIHBlcmNlbnQgYWJvdmUgaW5mbGF0aW9uIHRhcmdldCBmb3IgNS1ZZWFyIENBR1INCmludGVyYWN0aXZlX3ByaW50KHNkX3ZhbHVlXzEwX3llYXJfY2FncikgICMgU2hvdWxkIHByaW50IHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gZm9yIDEwLVllYXIgQ0FHUg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgT1ZFUkFMTCBTVEFUSVNUSUNTIA0KbnVtZXJpY192YWx1ZXNfYWxsIDwtIGFzLm51bWVyaWModW5saXN0KG5ydCRzcDUwMF9yYXdfY2FncltleGlzdGluZ19jYWdyX2NvbHVtbnNdLCB1c2UubmFtZXMgPSBGQUxTRSkpDQpudW1lcmljX3ZhbHVlc19hbGwgPC0gbnVtZXJpY192YWx1ZXNfYWxsWyFpcy5uYShudW1lcmljX3ZhbHVlc19hbGwpXQ0KDQpvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucyA8LSBsZW5ndGgobnVtZXJpY192YWx1ZXNfYWxsKQ0Kb3ZlcmFsbF9tZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9zZF92YWx1ZSA8LSByb3VuZChzZChudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9taW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gb3ZlcmFsbF9zZF92YWx1ZSwgMikNCm92ZXJhbGxfbWF4X2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSArIG92ZXJhbGxfc2RfdmFsdWUsIDIpDQpvdmVyYWxsX21pbl92YWx1ZSA8LSByb3VuZChtaW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0KDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKG51bWVyaWNfdmFsdWVzX2FsbCA+PSB0YXJnZXRfY29uc2VydmF0aXZlLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9tb2RlcmF0ZSwgbmEucm0gPSBUUlVFKQ0Kb3ZlcmFsbF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQoNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIC8gb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQoNCnNwNTAwX3Jhd19jYWdyX3N1bW1hcnkkT3ZlcmFsbCA8LSBjKA0KICBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucywNCiAgcGFzdGUwKG92ZXJhbGxfbWVhbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWVkaWFuX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9zZF92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWluX2NhZ3JfcmFuZ2UsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21heF9jYWdyX3JhbmdlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9taW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21heF92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlLCAiJSIpDQopDQoNCiMgQ29udmVydCByb3cgbmFtZXMgdG8gYSBjb2x1bW4NCnNwNTAwX3Jhd19jYWdyX3N1bW1hcnkgPC0gdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oc3A1MDBfcmF3X2NhZ3Jfc3VtbWFyeSwgdmFyID0gIlN0YXRpc3RpYyIpDQoNCiMgRW5zdXJlIGFsbCBjb2x1bW5zIGFyZSBjaGFyYWN0ZXINCnNwNTAwX3Jhd19jYWdyX3N1bW1hcnkgPC0gc3A1MDBfcmF3X2NhZ3Jfc3VtbWFyeSAlPiUNCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIGFzLmNoYXJhY3RlcikpDQoNCiMgRGlzcGxheSB0aGUgc3VtbWFyeSB0YWJsZQ0KY2F0KCJcbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQppbnRlcmFjdGl2ZV9zdHIoc3A1MDBfcmF3X2NhZ3Jfc3VtbWFyeSkNCmZvcm1hdF91bnNwZWNpZmllZF93aWR0aChzcDUwMF9yYXdfY2Fncl9zdW1tYXJ5KQ0KDQpgYGANCg0KKipgciBtaW5feWVhcmAtYHIgbWF4X3llYXJgIFN1bW1hcnk6KiogVGhlIDEtWWVhciBDQUdSIGV4aGliaXRzIHRoZSBgciBpZihtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1heChjKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMTBfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzIwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8zMF95ZWFyX2NhZ3IpKSkgImhpZ2hlc3QgbWVhbiByZXR1cm4iIGVsc2UgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA9PSBtaW4oYyhtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8yMF95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMzBfeWVhcl9jYWdyKSkpICJsb3dlc3QgbWVhbiByZXR1cm4iIGVsc2UgIm1lYW4gcmV0dXJuImAgYXQgYHIgbWVhbl92YWx1ZV8xX3llYXJfY2FncmAlLCBhbmQgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWF4KGMoc2RfdmFsdWVfMV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzIwX3llYXJfY2Fnciwgc2RfdmFsdWVfMzBfeWVhcl9jYWdyKSkpICJ0aGUgZ3JlYXRlc3Qgdm9sYXRpbGl0eSB3aXRoIGEiIGVsc2UgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWluKGMoc2RfdmFsdWVfMV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzIwX3llYXJfY2Fnciwgc2RfdmFsdWVfMzBfeWVhcl9jYWdyKSkpICJ0aGUgbGVhc3Qgdm9sYXRpbGl0eSB3aXRoIGEiIGVsc2UgIndpdGgiYCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBgciBzZF92YWx1ZV8xX3llYXJfY2FncmAlLiBBcyB0aGUgaW52ZXN0bWVudCBob3Jpem9uIGV4dGVuZHMgdG8gNSwgMTAsIDIwLCBhbmQgMzAgeWVhcnMsIHRoZSBtZWFuIHJldHVybnMgYHIgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA8IG1lYW4oYyhtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8yMF95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMzBfeWVhcl9jYWdyKSkpICJpbmNyZWFzZSIgZWxzZSAiZGVjcmVhc2UiYCwgcmFuZ2luZyBmcm9tIGByIG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3JgJSB0byBgciBtZWFuX3ZhbHVlXzMwX3llYXJfY2FncmAlLCB3aGlsZSB2b2xhdGlsaXR5IGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyIDwgbWVhbihjKHNkX3ZhbHVlXzVfeWVhcl9jYWdyLCBzZF92YWx1ZV8xMF95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzIwX3llYXJfY2Fnciwgc2RfdmFsdWVfMzBfeWVhcl9jYWdyKSkpICJyaXNlcyIgZWxzZSAiZGltaW5pc2hlcyJgLCB3aXRoIHN0YW5kYXJkIGRldmlhdGlvbnMgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPiBzZF92YWx1ZV8zMF95ZWFyX2NhZ3IpICJkcm9wcGluZyIgZWxzZSAicmlzaW5nImAgZnJvbSBgciBzZF92YWx1ZV81X3llYXJfY2FncmAlIHRvIGByIHNkX3ZhbHVlXzMwX3llYXJfY2FncmAlLiBUaGlzIHRyZW5kIGluZGljYXRlcyB0aGF0IGxvbmdlciBpbnZlc3RtZW50IHBlcmlvZHMgdGVuZCB0byBvZmZlciBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA+IHNkX3ZhbHVlXzMwX3llYXJfY2FncikgIm1vcmUgc3RhYmxlIiBlbHNlICJsZXNzIHN0YWJsZSJgIHJldHVybnMuIEZ1cnRoZXJtb3JlLCB0aGUgcGVyY2VudGFnZSBvZiBwZXJpb2RzIGV4Y2VlZGluZyB0aGUgaW5mbGF0aW9uIHRhcmdldCBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMV95ZWFyX2NhZ3IgPCBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMzBfeWVhcl9jYWdyKSAiaW5jcmVhc2VzIiBlbHNlICJkZWNyZWFzZXMiYCB3aXRoIGxvbmdlciBkdXJhdGlvbnMsIGZyb20gYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyYCUgaW4gdGhlIDEtWWVhciBDQUdSIHRvIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8zMF95ZWFyX2NhZ3JgJSBpbiB0aGUgMzAtWWVhciBDQUdSLCB1bmRlcnNjb3JpbmcgUyZQIDUwMCdzIGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8xX3llYXJfY2FnciA8IHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8zMF95ZWFyX2NhZ3IpICJlZmZlY3RpdmVuZXNzIiBlbHNlICJpbmVmZmVjdGl2ZW5lc3MiYCBhcyBhIGhlZGdlIGFnYWluc3QgaW5mbGF0aW9uIG92ZXIgZXh0ZW5kZWQgdGltZWZyYW1lcy4gV2l0aCBhbiBvdmVyYWxsIHBlcmNlbnRhZ2Ugb2YgYHIgb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlYCUgZXhjZWVkaW5nIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCAoYHIgdGFyZ2V0X2FnZ3Jlc3NpdmUgLSB0YXJnZXRfaW5mbGF0aW9uYCUgYW5udWFsaXplZCByZXR1cm5zKSwgUyZQIDUwMCBgciBpZihvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA1MCkgImhhcywgb3ZlciB0aGlzIHRpbWUgcGVyaW9kLCBwcm92ZW4gdG8gYmUgYSBzdHJvbmciIGVsc2UgaWYob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNDApICJoYXMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgZGVtb25zdHJhdGVkIGl0c2VsZiBhcyBhIHZpYWJsZSIgZWxzZSAiYXBwZWFycywgb3ZlciB0aGlzIHRpbWUgcGVyaW9kLCB0byBiZSBhIGxlc3Mgc3VpdGFibGUiYCBvcHRpb24gZm9yIGEgaGlnaC1yZXR1cm5pbmcgbG9uZy10ZXJtIGludmVzdG1lbnQuDQoNCg0KIyMjIEdyYXBoDQoNCiMjIyMgQWxsIFBlcmlvZHMNCg0KYGBge3IgbnJ0JHNwNTAwX3Jhd19jYWdyX2dyYXBoc19hbGwsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFBlcmlvZHMgXG4iKQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KDQojIENvbnZlcnQgY29sdW1ucyB0byBudW1lcmljIGZvciBwbG90dGluZyBpZiBuZWVkZWQNCm5ydCRzcDUwMF9yYXdfY2FnciA8LSBucnQkc3A1MDBfcmF3X2NhZ3IgJT4lDQogIG11dGF0ZSgNCiAgICBgRGF0ZWAgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihgRGF0ZWApKSwgICMgRW5zdXJlIERhdGUgaXMgbnVtZXJpYw0KICAgIGAxLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDEtWWVhciBDQUdSYCkpLA0KICAgIGA1LVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDUtWWVhciBDQUdSYCkpLA0KICAgIGAxMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxMC1ZZWFyIENBR1JgKSksDQogICAgYDIwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDIwLVllYXIgQ0FHUmApKSwNCiAgICBgMzAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMzAtWWVhciBDQUdSYCkpDQogICkNCg0KIyBSZXNoYXBlIHRoZSBkYXRhIGludG8gbG9uZyBmb3JtYXQgZm9yIGVhc3kgcGxvdHRpbmcgb2YgbXVsdGlwbGUgbGluZXMgYW5kIHNldCB0aGUgZmFjdG9yIG9yZGVyDQpucnRfbG9uZyA8LSBucnQkc3A1MDBfcmF3X2NhZ3IgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgMS1ZZWFyIENBR1JgLCBgNS1ZZWFyIENBR1JgLCBgMTAtWWVhciBDQUdSYCwgYDIwLVllYXIgQ0FHUmAsIGAzMC1ZZWFyIENBR1JgKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkNBR1JfUGVyaW9kIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJDQUdSX1ZhbHVlIikgJT4lDQogIG11dGF0ZShDQUdSX1BlcmlvZCA9IGZhY3RvcihDQUdSX1BlcmlvZCwgbGV2ZWxzID0gYygiMS1ZZWFyIENBR1IiLCAiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIiwgIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKSkpDQoNCiMgQXNzaWduIGNvbG9ycyBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgQ0FHUl9QZXJpb2QgaW4gdGhlIGRhdGENCiMgTWF0Y2ggdGhlIHVuaXF1ZSBsZXZlbHMgb2YgQ0FHUl9QZXJpb2Qgd2l0aCBjb2xvcnMgZnJvbSBjb2xvcnNfZ2VuZXJhbF9kYXJrDQp1bmlxdWVfdHlwZXMgPC0gdW5pcXVlKG5ydF9sb25nJENBR1JfUGVyaW9kKQ0KY3VzdG9tX2NvbG9ycyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlcyldLCB1bmlxdWVfdHlwZXMpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIobnJ0JHNwNTAwX3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihucnQkc3A1MDBfcmF3X2NhZ3IkRGF0ZSksIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1heF94KSAgIyBUZXN0DQppbnRlcmFjdGl2ZV9wcmludChtaW5feCkgICMgVGVzdA0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gbWluX3gNCm1heF95ZWFyIDwtIG1heF94DQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMTkwMA0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiUm9sbGluZyBDQUdScyBBY3Jvc3MgUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiUyZQIDUwMCBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUm9sbGluZyBQZXJpb2RzLCBEYXRhIFBlcmlvZCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMSA8LSBnZ3Bsb3QobnJ0X2xvbmcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtZWFuX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNzUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMTAgKyA1KSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgKyA1LCA1KSkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgUkVTVFJJQ1RFRCBXSVRIIExJTUlUUyANCg0KIyBGaWx0ZXIgdGhlIGRhdGEgZm9yIHRoZSByZXN0cmljdGVkIHgtYXhpcyByYW5nZSAoMTk3NS0yMDI0KQ0KcmVzdHJpY3RlZF9kYXRhIDwtIG5ydF9sb25nICU+JQ0KICBmaWx0ZXIoYXMuaW50ZWdlcihEYXRlKSA+PSAxOTc1ICYgYXMuaW50ZWdlcihEYXRlKSA8PSAyMDI0KQ0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDE5NzUNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIlJvbGxpbmcgQ0FHUnMgQWNyb3NzIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlMmUCA1MDAgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFJvbGxpbmcgUGVyaW9kcywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ2FsY3VsYXRlIGR5bmFtaWMgeS1heGlzIGxpbWl0cyBmb3IgdGhlIHJlc3RyaWN0ZWQgZGF0YQ0KeV9taW4gPC0gbWluKHJlc3RyaWN0ZWRfZGF0YSRDQUdSX1ZhbHVlLCBuYS5ybSA9IFRSVUUpDQp5X21heCA8LSBtYXgocmVzdHJpY3RlZF9kYXRhJENBR1JfVmFsdWUsIG5hLnJtID0gVFJVRSkNCg0KIyBDcmVhdGUgdGhlIGZpbHRlcmVkLCByZXN0cmljdGVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAyIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1lYW5fdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMS4yNSwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHlfbWluLCB5X21heCkpICsgIyBBcHBseSBkeW5hbWljIHktYXhpcyBsaW1pdHMNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyA1ICsgMSksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCg0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAyKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIFJFU1RSSUNURUQgV0lUSCBMSU1JVFMgDQoNCiMgRmlsdGVyIHRoZSBkYXRhIGZvciB0aGUgcmVzdHJpY3RlZCB4LWF4aXMgcmFuZ2UgKDIwMDUtMjAyNCkNCnJlc3RyaWN0ZWRfZGF0YSA8LSBucnRfbG9uZyAlPiUNCiAgZmlsdGVyKGFzLmludGVnZXIoRGF0ZSkgPj0gMjAwNSAmIGFzLmludGVnZXIoRGF0ZSkgPD0gMjAyNCkNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDA1DQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJSb2xsaW5nIENBR1JzIEFjcm9zcyBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJTJlAgNTAwIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBSb2xsaW5nIFBlcmlvZHMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENhbGN1bGF0ZSBkeW5hbWljIHktYXhpcyBsaW1pdHMgZm9yIHRoZSByZXN0cmljdGVkIGRhdGENCnlfbWluIDwtIG1pbihyZXN0cmljdGVkX2RhdGEkQ0FHUl9WYWx1ZSwgbmEucm0gPSBUUlVFKQ0KeV9tYXggPC0gbWF4KHJlc3RyaWN0ZWRfZGF0YSRDQUdSX1ZhbHVlLCBuYS5ybSA9IFRSVUUpDQoNCiMgQ3JlYXRlIHRoZSBmaWx0ZXJlZCwgcmVzdHJpY3RlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMyA8LSBnZ3Bsb3QobnJ0X2xvbmcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWVhbl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0xLjI1LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeV9taW4sIHlfbWF4KSkgKyAjIEFwcGx5IGR5bmFtaWMgeS1heGlzIGxpbWl0cw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDIgKyAxKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDMpDQoNCmBgYA0KDQojIyMjIFNob3J0LVRlcm0NCg0KYGBge3IgbnJ0JHNwNTAwX3Jhd19jYWdyX2dyYXBoc19zaG9ydCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgU2hvcnQtVGVybSBSb2xsaW5nIFBlcmlvZHMgXG4iKQ0KDQojIEZpbHRlciBkYXRhIGZvciBTaG9ydC1UZXJtIENBR1IgKDUtWWVhciBhbmQgMTAtWWVhcikNCnNob3J0dGVybV9kYXRhIDwtIG5ydF9sb25nICU+JQ0KICBmaWx0ZXIoQ0FHUl9QZXJpb2QgJWluJSBjKCI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiKSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMTkwNQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQ0FHUiBBY3Jvc3MgU2hvcnQtVGVybSBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJTJlAgNTAwIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBTaG9ydC1UZXJtIFJvbGxpbmcgUGVyaW9kcywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDFfc2hvcnR0ZXJtIDwtIGdncGxvdChzaG9ydHRlcm1fZGF0YSwgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0FHUl9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQoNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjI1LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMjUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9yc1tjKCI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiKV0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxMCksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICsgNSwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMV9zaG9ydHRlcm0pDQoNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBSRVNUUklDVEVEIFdJVEggTElNSVRTIA0KDQojIEZpbHRlciB0aGUgZGF0YSBmb3IgdGhlIHJlc3RyaWN0ZWQgeC1heGlzIHJhbmdlICgyMDA1LTIwMjQpDQpyZXN0cmljdGVkX2RhdGEgPC0gc2hvcnR0ZXJtX2RhdGEgJT4lDQogIGZpbHRlcihhcy5pbnRlZ2VyKERhdGUpID49IDIwMDUgJiBhcy5pbnRlZ2VyKERhdGUpIDw9IDIwMjQpDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAwNQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQ0FHUiBBY3Jvc3MgU2hvcnQtVGVybSBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJTJlAgNTAwIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBTaG9ydC1UZXJtIFJvbGxpbmcgUGVyaW9kcywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ2FsY3VsYXRlIGR5bmFtaWMgeS1heGlzIGxpbWl0cyBmb3IgdGhlIHJlc3RyaWN0ZWQgZGF0YQ0KeV9taW4gPC0gbWluKHJlc3RyaWN0ZWRfZGF0YSRDQUdSX1ZhbHVlLCBuYS5ybSA9IFRSVUUpDQp5X21heCA8LSBtYXgocmVzdHJpY3RlZF9kYXRhJENBR1JfVmFsdWUsIG5hLnJtID0gVFJVRSkNCg0KIyBDcmVhdGUgdGhlIGZpbHRlcmVkLCByZXN0cmljdGVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAyX3Nob3J0dGVybSA8LSBnZ3Bsb3Qoc2hvcnR0ZXJtX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQogIA0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjI1LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMjUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9yc1tjKCI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiKV0pICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHlfbWluLCB5X21heCkpICsgIyBBcHBseSBkeW5hbWljIHktYXhpcyBsaW1pdHMNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAyKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHNob3J0LXRlcm0gQ0FHUiBwbG90DQpwcmludChwMl9zaG9ydHRlcm0pDQoNCg0KYGBgDQoNCg0KDQojIyMjIExvbmctVGVybQ0KDQpgYGB7ciBucnQkc3A1MDBfcmF3X2NhZ3JfZ3JhcGhzX2xvbmcsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIExvbmctVGVybSBSb2xsaW5nIFBlcmlvZHMgXG4iKQ0KDQojIEZpbHRlciBkYXRhIGZvciBMb25nLVRlcm0gQ0FHUiAoMjAtWWVhciBhbmQgMzAtWWVhcikNCmxvbmd0ZXJtX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihDQUdSX1BlcmlvZCAlaW4lIGMoIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMTkyMA0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQ0FHUiBBY3Jvc3MgTG9uZy1UZXJtIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlMmUCA1MDAgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIExvbmctVGVybSBSb2xsaW5nIFBlcmlvZHMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxX2xvbmd0ZXJtIDwtIGdncGxvdChsb25ndGVybV9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDEpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCg0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4yNSwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzW2MoIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKV0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxMCksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICsgNSwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMV9sb25ndGVybSkNCg0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIFJFU1RSSUNURUQgV0lUSCBMSU1JVFMgDQoNCiMgRmlsdGVyIHRoZSBkYXRhIGZvciB0aGUgcmVzdHJpY3RlZCB4LWF4aXMgcmFuZ2UgKDIwMDUtMjAyNCkNCnJlc3RyaWN0ZWRfZGF0YSA8LSBsb25ndGVybV9kYXRhICU+JQ0KICBmaWx0ZXIoYXMuaW50ZWdlcihEYXRlKSA+PSAyMDA1ICYgYXMuaW50ZWdlcihEYXRlKSA8PSAyMDI0KQ0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMDUNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkNBR1IgQWNyb3NzIExvbmctVGVybSBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJTJlAgNTAwIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBMb25nLVRlcm0gUm9sbGluZyBQZXJpb2RzLCBEYXRhIFBlcmlvZCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KIyBDYWxjdWxhdGUgZHluYW1pYyB5LWF4aXMgbGltaXRzIGZvciB0aGUgcmVzdHJpY3RlZCBkYXRhDQp5X21pbiA8LSBtaW4ocmVzdHJpY3RlZF9kYXRhJENBR1JfVmFsdWUsIG5hLnJtID0gVFJVRSkNCnlfbWF4IDwtIG1heChyZXN0cmljdGVkX2RhdGEkQ0FHUl9WYWx1ZSwgbmEucm0gPSBUUlVFKQ0KDQojIENyZWF0ZSB0aGUgZmlsdGVyZWQsIHJlc3RyaWN0ZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDJfbG9uZ3Rlcm0gPC0gZ2dwbG90KGxvbmd0ZXJtX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQogIA0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAxKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9yc1tjKCIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIildKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5X21pbiwgeV9tYXgpKSArICMgQXBwbHkgZHluYW1pYyB5LWF4aXMgbGltaXRzDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMiksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBsb25nLXRlcm0gQ0FHUiBwbG90DQpwcmludChwMl9sb25ndGVybSkNCg0KDQpgYGANCjwhLS0gDQojIyBTJlAgNTAwIFNsb3BlIA0KDQojIyMgRGF0YQ0KYGBge3Igc3A1MDBfY2Fncl9zbG9wZX0NCg0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyMgUyZQIDUwMCBTbG9wZSAtIFVwZGF0ZSBEYXRlIHRvIFlZWVkgZm9ybWF0DQoNCiMgRW5zdXJlIG51bWVyaWMgY29udmVyc2lvbiBmb3IgdGhlIGBDbG9zZWAgYW5kIGBEYXRlYCBjb2x1bW5zDQpzcDUwMF9jYWdyX3Nsb3BlcyA8LSBucnQkc3A1MDBfcmF3X2NhZ3IgJT4lDQogIG11dGF0ZSgNCiAgICBDbG9zZSA9IGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCAgIyBFbnN1cmUgQ2xvc2UgaXMgbnVtZXJpYw0KICAgIERhdGUgPSBhcy5jaGFyYWN0ZXIoYXMubnVtZXJpYyhnc3ViKCIsIiwgIiIsIERhdGUpKSkgIyBDb252ZXJ0IERhdGUgdG8gY2hhcmFjdGVyIFlZWVkNCiAgKQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBzbG9wZXMgZm9yIGEgc3BlY2lmaWVkIHBlcmlvZCBmb3IgZWFjaCBDQUdSIGNvbHVtbg0KY2FsY3VsYXRlX2NhZ3Jfc2xvcGUgPC0gZnVuY3Rpb24oZGF0YSwgcGVyaW9kcykgew0KICBmb3IgKGNhZ3JfY29sIGluIGdyZXAoIkNBR1IiLCBuYW1lcyhkYXRhKSwgdmFsdWUgPSBUUlVFKSkgew0KICAgIGZvciAocGVyaW9kIGluIHBlcmlvZHMpIHsNCiAgICAgIHNsb3BlX2NvbF9uYW1lIDwtIHBhc3RlMChwZXJpb2QsICItWWVhciBTbG9wZSBvZiAiLCBjYWdyX2NvbCkNCiAgICAgIA0KICAgICAgIyBJbml0aWFsaXplIHNsb3BlIGNvbHVtbiB3aXRoIE5BDQogICAgICBkYXRhW1tzbG9wZV9jb2xfbmFtZV1dIDwtIE5BDQogICAgICANCiAgICAgICMgUmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIGRhdGEgYnkgRGF0ZSAocmVjZW50IHRvIG9sZGVzdCkNCiAgICAgIGRhdGEgPC0gZGF0YSAlPiUgYXJyYW5nZShkZXNjKGFzLm51bWVyaWMoRGF0ZSkpKSAgIyBTb3J0IG51bWVyaWNhbGx5IGJ5IERhdGUNCiAgICAgIA0KICAgICAgIyBDYWxjdWxhdGUgc2xvcGUgZm9yIGVhY2ggdmFsaWQgcGVyaW9kDQogICAgICBmb3IgKGkgaW4gMToobnJvdyhkYXRhKSAtIHBlcmlvZCArIDEpKSB7DQogICAgICAgIHN1YnNldF9kYXRhIDwtIGRhdGFbaTooaSArIHBlcmlvZCAtIDEpLCBjKCJEYXRlIiwgY2Fncl9jb2wpXQ0KICAgICAgICBpZiAobnJvdyhzdWJzZXRfZGF0YSkgPT0gcGVyaW9kICYmIGFsbCghaXMubmEoc3Vic2V0X2RhdGFbW2NhZ3JfY29sXV0pKSkgew0KICAgICAgICAgICMgVXNlIGJhY2t0aWNrcyB0byBlc2NhcGUgY29sdW1uIG5hbWVzIHdpdGggc3BlY2lhbCBjaGFyYWN0ZXJzDQogICAgICAgICAgbG1fbW9kZWwgPC0gbG0oYXMuZm9ybXVsYShwYXN0ZTAoImAiLCBjYWdyX2NvbCwgImAgfiBhcy5udW1lcmljKERhdGUpIikpLCBkYXRhID0gc3Vic2V0X2RhdGEpDQogICAgICAgICAgc2xvcGUgPC0gY29lZihsbV9tb2RlbClbImFzLm51bWVyaWMoRGF0ZSkiXSAgIyBTbG9wZSBvZiBDQUdSDQogICAgICAgICAgDQogICAgICAgICAgIyBTdG9yZSBzbG9wZSBhcyB0aGUgcmF0ZSBvZiBjaGFuZ2UgZm9yIENBR1INCiAgICAgICAgICBkYXRhW1tzbG9wZV9jb2xfbmFtZV1dW2ldIDwtIHJvdW5kKHNsb3BlLCAyKSAgIyBFbnN1cmUgc2xvcGUgaGFzIDIgZGVjaW1hbCBwb2ludHMNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICByZXR1cm4oZGF0YSkNCn0NCg0KIyBBcHBseSB0aGUgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHNsb3BlcyBmb3IgZGVzaXJlZCBwZXJpb2RzIChlLmcuLCAxMCBhbmQgMjQgeWVhcnMpDQpkZXNpcmVkX3BlcmlvZHMgPC0gYygxMCwgMjQpDQpzcDUwMF9jYWdyX3Nsb3BlcyA8LSBjYWxjdWxhdGVfY2Fncl9zbG9wZShzcDUwMF9jYWdyX3Nsb3BlcywgZGVzaXJlZF9wZXJpb2RzKQ0KDQojIEVuc3VyZSBkYXRhIGlzIG9yZGVyZWQgYnkgRGF0ZSBhbmQgcm91bmQgbnVtZXJpYyBjb2x1bW5zIHRvIDIgZGVjaW1hbHMNCnNwNTAwX2NhZ3Jfc2xvcGVzIDwtIHNwNTAwX2NhZ3Jfc2xvcGVzICU+JQ0KICBhcnJhbmdlKGRlc2MoYXMubnVtZXJpYyhEYXRlKSkpICU+JQ0KICBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+IHJvdW5kKC54LCAyKSkpICAjIFJvdW5kIGFsbCBudW1lcmljIGNvbHVtbnMgdG8gMiBkZWNpbWFscw0KDQojIEZvcm1hdCBDQUdSIGFuZCBzbG9wZSBjb2x1bW5zIGFzIHBlcmNlbnRhZ2VzIHdpdGggdHdvIGRlY2ltYWxzLCBoYW5kbGUgTkEgdmFsdWVzLCBhbmQgZm9ybWF0IENsb3NlIHdpdGggY29tbWFzDQpzcDUwMF9jYWdyX3Nsb3BlcyA8LSBzcDUwMF9jYWdyX3Nsb3BlcyAlPiUNCiAgbXV0YXRlKA0KICAgICMgRm9ybWF0IENBR1IgY29sdW1ucyB3aXRoIHBlcmNlbnRhZ2VzDQogICAgYWNyb3NzKGNvbnRhaW5zKCJDQUdSIiksIH4gaWZlbHNlKGlzLm5hKC54KSwgIk5BIiwgc3ByaW50ZigiJS4yZiUlIiwgLngpKSksDQogICAgDQogICAgIyBGb3JtYXQgQ2xvc2UgY29sdW1uIHdpdGggdHdvIGRlY2ltYWwgcG9pbnRzIGFuZCBjb21tYXMgZm9yIHRob3VzYW5kcyBzZXBhcmF0b3JzDQogICAgQ2xvc2UgPSBpZmVsc2UoaXMubmEoQ2xvc2UpLCAiTkEiLCBmb3JtYXRDKENsb3NlLCBmb3JtYXQgPSAiZiIsIGJpZy5tYXJrID0gIiwiLCBkaWdpdHMgPSAyKSkNCiAgKQ0KDQojIFNhdmUgdGhlIHJlc3VsdGluZyBkYXRhZnJhbWUgZHluYW1pY2FsbHkgd2l0aCBhZGp1c3RlZCBjb2x1bW4gbmFtZXMNCmluZGV4IDwtICJzcDUwMCIgICMgRGVmaW5lIHRoZSBpbmRleCBuYW1lIChlLmcuLCBTJlAgNTAwKQ0KZm9yIChwZXJpb2QgaW4gZGVzaXJlZF9wZXJpb2RzKSB7DQogIHNsb3BlX2NvbHVtbnMgPC0gZ3JlcChwYXN0ZTAocGVyaW9kLCAiLVllYXIgU2xvcGUiKSwgbmFtZXMoc3A1MDBfY2Fncl9zbG9wZXMpLCB2YWx1ZSA9IFRSVUUpDQogIHNsb3BlX2RmIDwtIHNwNTAwX2NhZ3Jfc2xvcGVzICU+JQ0KICAgIHNlbGVjdChEYXRlLCBDbG9zZSwgYWxsX29mKHNsb3BlX2NvbHVtbnMpKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MoYXMubnVtZXJpYyhEYXRlKSkpICAjIEVuc3VyZSBkYXRhIGlzIG9yZGVyZWQgYnkgcmVjZW50IHRvIG9sZGVzdA0KICANCiAgIyBBZGp1c3QgY29sdW1uIG5hbWVzIGZvciB0aGUgdGFibGUNCiAgY29sbmFtZXMoc2xvcGVfZGYpIDwtIHN1YihwYXN0ZTAocGVyaW9kLCAiLVllYXIgU2xvcGUgb2YgIiksICIiLCBjb2xuYW1lcyhzbG9wZV9kZikpDQogIA0KICAjIENyZWF0ZSBkeW5hbWljIGRhdGFmcmFtZSBuYW1lDQogIGRmX25hbWUgPC0gcGFzdGUwKGluZGV4LCAiXyIsIHBlcmlvZCwgIl95ZWFyX2NhZ3Jfc2xvcGVzIikNCiAgDQogICMgU2F2ZSB0aGUgZGF0YWZyYW1lIHdpdGggdGhlIGR5bmFtaWMgbmFtZQ0KICBhc3NpZ24oZGZfbmFtZSwgc2xvcGVfZGYsIGVudmlyID0gLkdsb2JhbEVudikNCn0NCg0KIyBFeGFtcGxlIHRvIGFjY2VzcyB0aGUgZGF0YWZyYW1lcw0KaW50ZXJhY3RpdmVfcHJpbnQobHMocGF0dGVybiA9IHBhc3RlMChpbmRleCwgIl8uKl95ZWFyX2NhZ3Jfc2xvcGVzIikpKQ0KIyBpbnRlcmFjdGl2ZV9zdHIoc3A1MDBfMTBfeWVhcl9jYWdyX3Nsb3BlcykNCmludGVyYWN0aXZlX3N0cihzcDUwMF8yNF95ZWFyX2NhZ3Jfc2xvcGVzKQ0KDQojIFByaW50IHRoZSB0YWJsZSBjYXB0aW9uIGR5bmFtaWNhbGx5DQpjYXQoIlxuIyMjIDEwLVllYXIgQ0FHUiBTbG9wZXMiKQ0KZm9ybWF0X2VxdWFsX3dpZHRoKHNwNTAwXzEwX3llYXJfY2Fncl9zbG9wZXMpDQoNCiMgY2F0KCJcbiMjIyAyNC1ZZWFyIENBR1IgU2xvcGVzIikNCiMgZm9ybWF0X2VxdWFsX3dpZHRoKHNwNTAwXzI0X3llYXJfY2Fncl9zbG9wZXMpDQoNCg0KDQpgYGANCg0KIyMjIyMNCiMgVE8gQkUgQ09OVElOVUVEIC0gRVhQTE9SRSwgU1RVRFkgJiBFWFBMQUlOIEhPVyBTT01FIEdFTkVSQUxJWkFUSU9OUyBPRiBUSEUgDQpUbyBkZXRlcm1pbmUgd2hpY2ggMjAteWVhciBwZXJpb2Qgd2UgbWlnaHQgZXhwZWN0IHRvIHJlcGVhdCBvdmVyIHRoZSBuZXh0IDEwLTIwIHllYXJzLCB3ZSBuZWVkIHRvIGFuYWx5emUgdGhlIGNvbnRleHQgb2YgaGlzdG9yaWNhbCB0cmVuZHMsIGN1cnJlbnQgY29uZGl0aW9ucywgYW5kIHRoZSBzbG9wZSBwYXR0ZXJuczoNCg0KRGF0ZQlDbG9zZQkxLVllYXIgQ0FHUgk1LVllYXIgQ0FHUgkxMC1ZZWFyIENBR1IJMjAtWWVhciBDQUdSCTMwLVllYXIgQ0FHUg0KMjAyNAk0LDgwNC40OQkwLjM0JQkwLjExJQkwLjg1JQkwLjEyJQktMC4wMCUNCjIwMjMJMyw5NjAuNjYJLTEuMDAlCS0wLjI2JQkxLjAwJQktMC4wMyUJLTAuMDIlDQoyMDIyCTQsNTczLjgyCTAuNTAlCTAuNjAlCTEuMDYlCS0wLjE2JQkwLjAxJQ0KMjAyMQkzLDc5My43NQkwLjc0JQkxLjA0JQkxLjA2JQktMC4yNSUJLTAuMDIlDQoyMDIwCTMsMjc4LjIwCTAuMzglCTEuMjAlCTEuMTMlCS0wLjMxJQktMC4wNCUNCg0KVGVsbCBtZSBob3cgd2UgY291bGQgaGF2ZSBhbmFseXplZCB0aGUgMS1ZZWFyIGFuZCA1LVllYXIgdG8gbWFrZSByaXNrIGFkanVzdG1lbnRzIA0KDQpUaGUgZm9sbG93aW5nIDEwLVllYXIgU2xvcGUgdGVsbHMgdXMgaG93IG11Y2ggdGhlIGF2ZXJhZ2UgZ3Jvd3RoIG92ZXIgdGhlIHBhc3QgMTAgeWVhcnMgaXMgc3BlZWRpbmcgdXAgb3Igc2xvd2luZyBkb3duIGVhY2ggeWVhci4gUG9zaXRpdmUgc2xvcGVzIG1lYW4gZ3Jvd3RoIHJhdGVzIGhhdmUgYmVlbiBpbXByb3ZpbmcsIHdoaWxlIG5lZ2F0aXZlIHNsb3BlcyB3b3VsZCBzdWdnZXN0IGdyb3d0aCByYXRlcyBhcmUgZGVjbGluaW5nIG92ZXIgdGltZS4gQSBuZWdhdGl2ZSBzbG9wZSBkb2VzIG5vdCBpbmRpY2F0ZSB3ZWFrbmVzcyBhbmQgdmljZS12ZXJzYSAoYSBuZWdhdGl2ZSBzbG9wZSBjYW4gc3RpbGwgaGF2ZSBhICsyMCUgYXZlcmFnZSBncm93dGggcmF0ZSBvdmVyIDUgeWVhcnMpLiANCg0KVGhlIDEwLVllYXIgbGluZWFyIHJlZ3Jlc3Npb24gc2xvcGUgZm9yIHRoZSBjb21wb3VuZCBhdmVyYWdlIGdyb3d0aCByYXRlIChDQUdSKSBwcm92aWRlcyBhbiBpbnRlcm1lZGlhdGUtIGludG8gbG9uZy10ZXJtIGxlYW5pbmcgb3ZlcnZpZXcuIE9uIGF2ZXJhZ2UsIHRoZSBjb21wb3VuZCBhdmVyYWdlIGdyb3d0aCByYXRlIG92ZXIgdGhlIGByIG1pbl95ZWFyYCB0byBgciBtYXhfeWVhcmAgcmVtYWlucyB0aGUgc2FtZSwgYXQgYHIgbWluKGMobWVhbl92YWx1ZV8xX3llYXJfY2FnciwgbWVhbl92YWx1ZV81X3llYXJfY2FnciwgbWVhbl92YWx1ZV8xMF95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMjBfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzMwX3llYXJfY2FncikpYCB0byBgciBtaW4oYyhtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8yMF95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMzBfeWVhcl9jYWdyKSlgLiANCg0KTG9uZy10ZXJtIENBR1Igc2xvcGVzIChlLmcuLCAxMC1ZZWFyLCAyMC1ZZWFyKSBoZWxwIGlkZW50aWZ5IHN1c3RhaW5lZCBncm93dGggb3IgY29udHJhY3Rpb24gdHJlbmRzLiBUaGV5IGFyZSBzdGFibGUgYnV0IG1heSBsYWcgaW4gcmVmbGVjdGluZyByZWNlbnQgY2hhbmdlcy4gU2hvcnQtdGVybSBzbG9wZXMgKGUuZy4sIDEtWWVhciwgNS1ZZWFyKSBhcmUgcHJvbmUgdG8gdm9sYXRpbGl0eSwgaGlnaGxpZ2h0aW5nIHJlY2VudCBtb21lbnR1bSBvciBwb3RlbnRpYWwgbWFya2V0IHJldmVyc2Fscy4gVGhleSBhcmUgcmVzcG9uc2l2ZSBidXQgbW9yZSBwcm9uZSB0byBub2lzZSBhbmQgdm9sYXRpbGl0eS4gQ0FHUiBzbG9wZXMgYWxvbmUgaW5zdWZmaWNpZW50IGZvciByZWxpYWJsZSBmb3JlY2FzdGluZzsgdGhleSBhZGQgbW9yZSB2YWx1ZSB3aGVuIGNvbWJpbmVkIHdpdGggZnVuZGFtZW50YWxzIGxpa2UgZWFybmluZ3MsIHZhbHVhdGlvbnMsIG9yIG1hY3JvZWNvbm9taWMgZGF0YSwgcHJvdmlkaW5nIGEgY29tcHJlaGVuc2l2ZSBtYXJrZXQgdmlldy4gQW5hbHlzZXMgb2YgdGhvc2UgZnVuZGFtZW50YWxzIGFyZW4ndCBpbmNsdWRlZCBoZXJlLg0KIyMjIyMjIyMjIyMNCg0KIyMjIFN1bW1hcnkNCg0KDQpgYGB7ciBzcDUwMF9jYWdyX3Nsb3BlX3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KaW50ZXJhY3RpdmVfc3RyKHNwNTAwXzEwX3llYXJfY2Fncl9zbG9wZXMpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWJibGUpDQoNCiMgRGVmaW5lIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFuIGFuZCBjb252ZXJ0IHBlcmNlbnRhZ2VzDQpjbGVhbl9wZXJjZW50YWdlIDwtIGZ1bmN0aW9uKGNvbHVtbikgew0KICBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sdW1uKSkNCn0NCg0KIyBEZWZpbmUgdGhlIHN0YXRpc3RpYyBuYW1lcyBmb3IgdGhlIHN1bW1hcnkgdGFibGUNCnN0YXRpc3RpY19uYW1lcyA8LSBjKA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiwgDQogICJNZWFuIiwgDQogICJNZWRpYW4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIA0KICAiTWluIE1lYW4gUmFuZ2UgKE1lYW4gLSBTRCkiLA0KICAiTWF4IE1lYW4gUmFuZ2UgKE1lYW4gKyBTRCkiLA0KICAiTWluaW11bSIsIA0KICAiTWF4aW11bSINCikNCg0KIyBBZGp1c3QgdGhlIGZpcnN0IHJvdydzIERhdGUgYW5kIGNsZWFuIHVwIENBR1IgY29sdW1ucw0Kc3A1MDBfMTBfeWVhcl9jYWdyX3Nsb3BlcyA8LSBzcDUwMF8xMF95ZWFyX2NhZ3Jfc2xvcGVzICU+JQ0KICBtdXRhdGUoDQogICAgIyBEYXRlID0gaWZlbHNlKHJvd19udW1iZXIoKSA9PSAxLCAiMjAyNS0wMS0wMSIsIERhdGUpLA0KICAgIERhdGUgPSBhcy5udW1lcmljKERhdGUpLA0KICAgIGAxLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAxLVllYXIgQ0FHUmApLA0KICAgIGA1LVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGA1LVllYXIgQ0FHUmApLA0KICAgIGAxMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMTAtWWVhciBDQUdSYCksDQogICAgYDIwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAyMC1ZZWFyIENBR1JgKSwNCiAgICBgMzAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDMwLVllYXIgQ0FHUmApDQogICkNCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgc3RhdGlzdGljcyBmb3IgYSBnaXZlbiBkYXRhc2V0DQpjYWxjX3N0YXRzIDwtIGZ1bmN0aW9uKGRhdGEpIHsNCiAgaWYgKHN1bSghaXMubmEoZGF0YSkpIDwgMikgcmV0dXJuKHJlcChOQSwgbGVuZ3RoKHN0YXRpc3RpY19uYW1lcykpKSAgIyBIYW5kbGUgaW5zdWZmaWNpZW50IGRhdGENCg0KICBjb3VudF9vYnNlcnZhdGlvbnMgPC0gc3VtKCFpcy5uYShkYXRhKSkNCiAgbWVhbl92YWx1ZSA8LSByb3VuZChtZWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIG1lZGlhbl92YWx1ZSA8LSByb3VuZChtZWRpYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgc2RfdmFsdWUgPC0gcm91bmQoc2QoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWluX21lYW5fcmFuZ2UgPC0gcm91bmQobWVhbl92YWx1ZSAtIHNkX3ZhbHVlLCAyKQ0KICBtYXhfbWVhbl9yYW5nZSA8LSByb3VuZChtZWFuX3ZhbHVlICsgc2RfdmFsdWUsIDIpDQogIG1pbl92YWx1ZSA8LSByb3VuZChtaW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICANCiAgYygNCiAgICBjb3VudF9vYnNlcnZhdGlvbnMsIA0KICAgIHBhc3RlMChtZWFuX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtZWRpYW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKHNkX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtaW5fbWVhbl9yYW5nZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X21lYW5fcmFuZ2UsICIlIiksDQogICAgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X3ZhbHVlLCAiJSIpDQogICkNCn0NCg0KIyBDb2x1bW5zIHRvIGNhbGN1bGF0ZSBDQUdSIHN0YXRpc3RpY3MNCmNhZ3JfY29sdW1ucyA8LSBjKCIxLVllYXIgQ0FHUiIsICI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiLCAiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpDQpleGlzdGluZ19jYWdyX2NvbHVtbnMgPC0gaW50ZXJzZWN0KGNhZ3JfY29sdW1ucywgbmFtZXMoc3A1MDBfMTBfeWVhcl9jYWdyX3Nsb3BlcykpDQoNCiMgQ2FsY3VsYXRlIHN0YXRzIGZvciBlYWNoIENBR1IgY29sdW1uDQpjYWdyX3N0YXRzX2xpc3QgPC0gbGFwcGx5KHNwNTAwXzEwX3llYXJfY2Fncl9zbG9wZXNbZXhpc3RpbmdfY2Fncl9jb2x1bW5zXSwgY2FsY19zdGF0cykNCg0KIyBDb21waWxlIGludG8gYSBzdW1tYXJ5IGRhdGEgZnJhbWUNCnNwNTAwXzEwX3llYXJfY2Fncl9zbG9wZXNfc3VtbWFyeSA8LSBhcy5kYXRhLmZyYW1lKGRvLmNhbGwoY2JpbmQsIGNhZ3Jfc3RhdHNfbGlzdCkpDQpyb3duYW1lcyhzcDUwMF8xMF95ZWFyX2NhZ3Jfc2xvcGVzX3N1bW1hcnkpIDwtIHN0YXRpc3RpY19uYW1lcw0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBTQVZFIFZBTFVFUyBGT1IgSU4tTElORSBDT0RFDQoNCiMgRGVmaW5lIHRoZSBtYXBwaW5nIG9mIHJvdyBuYW1lcyB0byB2YXJpYWJsZSBuYW1lcw0Kcm93X3RvX3Zhcl9uYW1lIDwtIGMoDQogICJDb3VudCBvZiBPYnNlcnZhdGlvbnMiID0gImNvdW50X29ic2VydmF0aW9ucyIsDQogICJNZWFuIiA9ICJtZWFuX3ZhbHVlIiwNCiAgIk1lZGlhbiIgPSAibWVkaWFuX3ZhbHVlIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiID0gInNkX3ZhbHVlIiwNCiAgIk1pbiBNZWFuIFJhbmdlIChNZWFuIC0gU0QpIiA9ICJtaW5fbWVhbl9yYW5nZSIsDQogICJNYXggTWVhbiBSYW5nZSAoTWVhbiArIFNEKSIgPSAibWF4X21lYW5fcmFuZ2UiLA0KICAiTWluaW11bSIgPSAibWluX3ZhbHVlIiwNCiAgIk1heGltdW0iID0gIm1heF92YWx1ZSINCikNCg0KIyBGdW5jdGlvbiB0byBzYXZlIHN1bW1hcnkgdmFsdWVzIGR5bmFtaWNhbGx5DQpzYXZlX2NvbHVtbl92YWx1ZXMgPC0gZnVuY3Rpb24oc3VtbWFyeV9kZikgew0KICAjIEV4Y2x1ZGUgdGhlICJTdGF0aXN0aWMiIGFuZCAiT3ZlcmFsbCIgY29sdW1ucw0KICBjb2x1bW5zX3RvX3NhdmUgPC0gc2V0ZGlmZihuYW1lcyhzdW1tYXJ5X2RmKSwgYygiU3RhdGlzdGljIiwgIk92ZXJhbGwiKSkNCiAgDQogICMgSXRlcmF0ZSBvdmVyIGVhY2ggY29sdW1uDQogIGZvciAoY29sIGluIGNvbHVtbnNfdG9fc2F2ZSkgew0KICAgICMgRm9ybWF0IGNvbHVtbiBuYW1lIHRvIGxvd2VyY2FzZSBhbmQgcmVwbGFjZSBpbnZhbGlkIGNoYXJhY3RlcnMNCiAgICBjb2xfbmFtZSA8LSB0b2xvd2VyKGdzdWIoIlteYS16QS1aMC05XSIsICJfIiwgY29sKSkNCiAgICANCiAgICAjIEV4dHJhY3QgdmFsdWVzIGZvciB0aGUgY3VycmVudCBjb2x1bW4NCiAgICBjb2xfdmFsdWVzIDwtIHN1bW1hcnlfZGZbW2NvbF1dDQogICAgDQogICAgIyBTYXZlIGVhY2ggdmFsdWUgZHluYW1pY2FsbHkgdXNpbmcgdGhlIG1hcHBpbmcgZm9yIHJvdyBuYW1lcw0KICAgIGZvciAoaSBpbiBzZXFfYWxvbmcoY29sX3ZhbHVlcykpIHsNCiAgICAgICMgR2V0IHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlIG5hbWUgZnJvbSB0aGUgbWFwcGluZw0KICAgICAgc3RhdF9uYW1lIDwtIHJvd190b192YXJfbmFtZVtyb3duYW1lcyhzdW1tYXJ5X2RmKVtpXV0NCiAgICAgIA0KICAgICAgaWYgKCFpcy5uYShzdGF0X25hbWUpKSB7ICAjIFNraXAgaWYgbm8gbWFwcGluZyBpcyBkZWZpbmVkDQogICAgICAgICMgQ3JlYXRlIHRoZSB2YXJpYWJsZSBuYW1lDQogICAgICAgIHZhcl9uYW1lIDwtIHBhc3RlMChzdGF0X25hbWUsICJfIiwgY29sX25hbWUpDQogICAgICAgIA0KICAgICAgICAjIEF0dGVtcHQgbnVtZXJpYyBjb252ZXJzaW9uIGZvciBkb3duc3RyZWFtIHVzZQ0KICAgICAgICB2YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2xfdmFsdWVzW2ldKSkpDQogICAgICAgIA0KICAgICAgICAjIEFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIGdsb2JhbCBlbnZpcm9ubWVudA0KICAgICAgICBhc3NpZ24odmFyX25hbWUsIHZhbHVlLCBlbnZpciA9IC5HbG9iYWxFbnYpDQogICAgICB9DQogICAgfQ0KICB9DQp9DQoNCiMgQXBwbHkgdGhlIGZ1bmN0aW9uIHRvIHNhdmUgdmFsdWVzIGZvciBhbGwgY29sdW1ucyBleGNlcHQgIk92ZXJhbGwiDQpzYXZlX2NvbHVtbl92YWx1ZXMoc3A1MDBfMTBfeWVhcl9jYWdyX3Nsb3Blc19zdW1tYXJ5KQ0KDQojIEV4YW1wbGU6IEFjY2Vzc2luZyBkeW5hbWljYWxseSBjcmVhdGVkIHZhcmlhYmxlcw0KaW50ZXJhY3RpdmVfcHJpbnQobWVhbl92YWx1ZV8xX3llYXJfY2FncikgICMgU2hvdWxkIHByaW50IHRoZSBtZWFuIHZhbHVlIGZvciAxLVllYXIgQ0FHUg0KaW50ZXJhY3RpdmVfcHJpbnQoc2RfdmFsdWVfMTBfeWVhcl9jYWdyKSAgIyBTaG91bGQgcHJpbnQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgMTAtWWVhciBDQUdSDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBPVkVSQUxMIFNUQVRJU1RJQ1MgDQojIEZsYXR0ZW4gYWxsIHJlbGV2YW50IENBR1IgdmFsdWVzIGludG8gYSBzaW5nbGUgbnVtZXJpYyB2ZWN0b3INCm51bWVyaWNfdmFsdWVzX2FsbCA8LSB1bmxpc3QobGFwcGx5KHNwNTAwXzEwX3llYXJfY2Fncl9zbG9wZXNbZXhpc3RpbmdfY2Fncl9jb2x1bW5zXSwgY2xlYW5fcGVyY2VudGFnZSksIHVzZS5uYW1lcyA9IEZBTFNFKQ0KbnVtZXJpY192YWx1ZXNfYWxsIDwtIG51bWVyaWNfdmFsdWVzX2FsbFshaXMubmEobnVtZXJpY192YWx1ZXNfYWxsKV0gICMgUmVtb3ZlIE5BIHZhbHVlcw0KDQojIENhbGN1bGF0ZSBvdmVyYWxsIHN0YXRpc3RpY3MNCm92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zIDwtIGxlbmd0aChudW1lcmljX3ZhbHVlc19hbGwpDQpvdmVyYWxsX21lYW5fdmFsdWUgPC0gcm91bmQobWVhbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9tZWRpYW5fdmFsdWUgPC0gcm91bmQobWVkaWFuKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX3NkX3ZhbHVlIDwtIHJvdW5kKHNkKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX21pbl9tZWFuX3JhbmdlIDwtIHJvdW5kKG92ZXJhbGxfbWVhbl92YWx1ZSAtIG92ZXJhbGxfc2RfdmFsdWUsIDIpDQpvdmVyYWxsX21heF9tZWFuX3JhbmdlIDwtIHJvdW5kKG92ZXJhbGxfbWVhbl92YWx1ZSArIG92ZXJhbGxfc2RfdmFsdWUsIDIpDQpvdmVyYWxsX21pbl92YWx1ZSA8LSByb3VuZChtaW4obnVtZXJpY192YWx1ZXNfYWxsKSwgMikNCm92ZXJhbGxfbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0KDQojIFBvcHVsYXRlIHRoZSBvdmVyYWxsIGNvbHVtbiBpbiB0aGUgc3VtbWFyeSB0YWJsZQ0Kc3A1MDBfMTBfeWVhcl9jYWdyX3Nsb3Blc19zdW1tYXJ5JE92ZXJhbGwgPC0gYygNCiAgb3ZlcmFsbF9jb3VudF9vYnNlcnZhdGlvbnMsDQogIHBhc3RlMChvdmVyYWxsX21lYW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21lZGlhbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfc2RfdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21pbl9tZWFuX3JhbmdlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tYXhfbWVhbl9yYW5nZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWluX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9tYXhfdmFsdWUsICIlIikNCikNCg0KDQojIENvbnZlcnQgcm93IG5hbWVzIHRvIGEgY29sdW1uDQpzcDUwMF8xMF95ZWFyX2NhZ3Jfc2xvcGVzX3N1bW1hcnkgPC0gdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oc3A1MDBfMTBfeWVhcl9jYWdyX3Nsb3Blc19zdW1tYXJ5LCB2YXIgPSAiU3RhdGlzdGljIikNCg0KIyBFbnN1cmUgYWxsIGNvbHVtbnMgYXJlIGNoYXJhY3Rlcg0Kc3A1MDBfMTBfeWVhcl9jYWdyX3Nsb3Blc19zdW1tYXJ5IDwtIHNwNTAwXzEwX3llYXJfY2Fncl9zbG9wZXNfc3VtbWFyeSAlPiUNCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIGFzLmNoYXJhY3RlcikpDQoNCiMgRGlzcGxheSB0aGUgc3VtbWFyeSB0YWJsZQ0KY2F0KCJcbiMjIyMgMTAtWWVhciBSZWdyZXNzaW9uIFNsb3BlcyBpbiBDQUdScyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmludGVyYWN0aXZlX3N0cihzcDUwMF8xMF95ZWFyX2NhZ3Jfc2xvcGVzX3N1bW1hcnkpDQpmb3JtYXRfdW5zcGVjaWZpZWRfd2lkdGgoc3A1MDBfMTBfeWVhcl9jYWdyX3Nsb3Blc19zdW1tYXJ5KQ0KDQpgYGANCg0KDQojIyMgR3JhcGgNCg0KIyMjIyBBbGwgUGVyaW9kcw0KDQpgYGB7ciBzcDUwMF9jYWdyX3Nsb3BlX2dyYXBocywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyAxMC1ZZWFyIFJlZ3Jlc3Npb24gU2xvcGVzIGluIENBR1JzIFxuIikNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCg0KIyBDb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcgaWYgbmVlZGVkDQpzcDUwMF8xMF95ZWFyX2NhZ3Jfc2xvcGVzIDwtIHNwNTAwXzEwX3llYXJfY2Fncl9zbG9wZXMgJT4lDQogIG11dGF0ZSgNCiAgICBgRGF0ZWAgPSBhcy5udW1lcmljKERhdGUpLCAgIyBFbnN1cmUgRGF0ZSBpcyBudW1lcmljDQogICAgYDEtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMS1ZZWFyIENBR1JgKSksDQogICAgYDUtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgNS1ZZWFyIENBR1JgKSksDQogICAgYDEwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDEwLVllYXIgQ0FHUmApKSwNCiAgICBgMjAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMjAtWWVhciBDQUdSYCkpLA0KICAgIGAzMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAzMC1ZZWFyIENBR1JgKSkNCiAgKQ0KDQojIFJlc2hhcGUgdGhlIGRhdGEgaW50byBsb25nIGZvcm1hdCBmb3IgZWFzeSBwbG90dGluZyBvZiBtdWx0aXBsZSBsaW5lcyBhbmQgc2V0IHRoZSBmYWN0b3Igb3JkZXINCm5ydF9sb25nIDwtIHNwNTAwXzEwX3llYXJfY2Fncl9zbG9wZXMgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgMS1ZZWFyIENBR1JgLCBgNS1ZZWFyIENBR1JgLCBgMTAtWWVhciBDQUdSYCwgYDIwLVllYXIgQ0FHUmAsIGAzMC1ZZWFyIENBR1JgKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkNBR1JfUGVyaW9kIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJTbG9wZV9WYWx1ZSIpICU+JQ0KICBtdXRhdGUoQ0FHUl9QZXJpb2QgPSBmYWN0b3IoQ0FHUl9QZXJpb2QsIGxldmVscyA9IGMoIjEtWWVhciBDQUdSIiwgIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIsICIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIikpKQ0KDQojIEFzc2lnbiBjb2xvcnMgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIG9yZGVyIG9mIENBR1JfUGVyaW9kIGluIHRoZSBkYXRhDQojIE1hdGNoIHRoZSB1bmlxdWUgbGV2ZWxzIG9mIENBR1JfUGVyaW9kIHdpdGggY29sb3JzIGZyb20gY29sb3JzX2dlbmVyYWxfZGFyaw0KdW5pcXVlX3R5cGVzIDwtIHVuaXF1ZShucnRfbG9uZyRDQUdSX1BlcmlvZCkNCmN1c3RvbV9jb2xvcnMgPC0gc2V0TmFtZXMoY29sb3JzX2dlbmVyYWxfZGFya1sxOmxlbmd0aCh1bmlxdWVfdHlwZXMpXSwgdW5pcXVlX3R5cGVzKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geC12YWx1ZSBpbiB5b3VyIGRhdGENCm1heF94IDwtIG1heChhcy5pbnRlZ2VyKHNwNTAwXzEwX3llYXJfY2Fncl9zbG9wZXMkRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKHNwNTAwXzEwX3llYXJfY2Fncl9zbG9wZXMkRGF0ZSksIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1heF94KSAgIyBUZXN0DQppbnRlcmFjdGl2ZV9wcmludChtaW5feCkgICMgVGVzdA0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gbWluX3gNCm1heF95ZWFyIDwtIG1heF94DQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMTkxMA0KZW5kX3llYXIgPC0gbWF4X3llYXINCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIjEwLVllYXIgUmVncmVzc2lvbiBTbG9wZXMgaW4gQ0FHUnMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlMmUCA1MDAgTGluZWFyIFJlZ3Jlc3Npb24gU2xvcGVzIGluIENBR1JzIEFjcm9zcyBSb2xsaW5nIFBlcmlvZHMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gU2xvcGVfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gMCwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSAwKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggU2xvcGUNCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBTbG9wZQ0KICANCiAgIyBBZGQgdGFyZ2V0IGFuZCByYW5nZSBsaW5lcw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21pbl9tZWFuX3JhbmdlLCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWF4X21lYW5fcmFuZ2UsIGNvbG9yID0gImRhcmtncmVlbiIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9tZWFuX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21pbl9tZWFuX3JhbmdlLCBsYWJlbCA9ICJNaW4gTWVhbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9tYXhfbWVhbl9yYW5nZSwgbGFiZWwgPSAiTWF4IE1lYW4iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtncmVlbiIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWVhbl92YWx1ZSwgbGFiZWwgPSAiTWVhbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIA0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiU2xvcGUgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEwKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBSRVNUUklDVEVEIFdJVEggTElNSVRTIA0KDQojIEZpbHRlciB0aGUgZGF0YSBmb3IgdGhlIHJlc3RyaWN0ZWQgeC1heGlzIHJhbmdlICgxOTc1LTIwMjQpDQpyZXN0cmljdGVkX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihhcy5pbnRlZ2VyKERhdGUpID49IDE5NzUgJiBhcy5pbnRlZ2VyKERhdGUpIDw9IDIwMjQpDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMTk3NQ0KZW5kX3llYXIgPC0gbWF4X3llYXINCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIjEwLVllYXIgUmVncmVzc2lvbiBTbG9wZXMgaW4gQ0FHUnMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlMmUCA1MDAgTGluZWFyIFJlZ3Jlc3Npb24gU2xvcGVzIGluIENBR1JzIEFjcm9zcyBSb2xsaW5nIFBlcmlvZHMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENhbGN1bGF0ZSBkeW5hbWljIHktYXhpcyBsaW1pdHMgZm9yIHRoZSByZXN0cmljdGVkIGRhdGENCnlfbWluIDwtIG1pbihyZXN0cmljdGVkX2RhdGEkU2xvcGVfVmFsdWUsIG5hLnJtID0gVFJVRSkNCnlfbWF4IDwtIG1heChyZXN0cmljdGVkX2RhdGEkU2xvcGVfVmFsdWUsIG5hLnJtID0gVFJVRSkNCg0KIyBDcmVhdGUgdGhlIGZpbHRlcmVkLCByZXN0cmljdGVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAyIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gU2xvcGVfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAwLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IDApLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBTbG9wZQ0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIFNsb3BlDQogIA0KICAjIEFkZCB0YXJnZXQgYW5kIHJhbmdlIGxpbmVzDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWluX21lYW5fcmFuZ2UsIGNvbG9yID0gImRhcmtncmVlbiIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9tYXhfbWVhbl9yYW5nZSwgY29sb3IgPSAiZGFya2dyZWVuIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21lYW5fdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWluX21lYW5fcmFuZ2UsIGxhYmVsID0gIk1pbiBNZWFuIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21heF9tZWFuX3JhbmdlLCBsYWJlbCA9ICJNYXggTWVhbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9tZWFuX3ZhbHVlLCBsYWJlbCA9ICJNZWFuIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiU2xvcGUgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeV9taW4sIHlfbWF4KSkgKyAjIEFwcGx5IGR5bmFtaWMgeS1heGlzIGxpbWl0cw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDUpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMikNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBSRVNUUklDVEVEIFdJVEggTElNSVRTIA0KDQojIEZpbHRlciB0aGUgZGF0YSBmb3IgdGhlIHJlc3RyaWN0ZWQgeC1heGlzIHJhbmdlICgyMDA1LTIwMjQpDQpyZXN0cmljdGVkX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihhcy5pbnRlZ2VyKERhdGUpID49IDIwMDUgJiBhcy5pbnRlZ2VyKERhdGUpIDw9IDIwMjQpDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAwNQ0KZW5kX3llYXIgPC0gbWF4X3llYXINCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gMikgKiAyICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyAyKSAqIDIgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIjEwLVllYXIgUmVncmVzc2lvbiBTbG9wZXMgaW4gQ0FHUnMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlMmUCA1MDAgTGluZWFyIFJlZ3Jlc3Npb24gU2xvcGVzIGluIENBR1JzIEFjcm9zcyBSb2xsaW5nIFBlcmlvZHMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENhbGN1bGF0ZSBkeW5hbWljIHktYXhpcyBsaW1pdHMgZm9yIHRoZSByZXN0cmljdGVkIGRhdGENCnlfbWluIDwtIG1pbihyZXN0cmljdGVkX2RhdGEkU2xvcGVfVmFsdWUsIG5hLnJtID0gVFJVRSkNCnlfbWF4IDwtIG1heChyZXN0cmljdGVkX2RhdGEkU2xvcGVfVmFsdWUsIG5hLnJtID0gVFJVRSkNCg0KIyBDcmVhdGUgdGhlIGZpbHRlcmVkLCByZXN0cmljdGVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAzIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gU2xvcGVfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAwLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IDApLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBTbG9wZQ0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIFNsb3BlDQogIA0KICAjIEFkZCB0YXJnZXQgYW5kIHJhbmdlIGxpbmVzDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWluX21lYW5fcmFuZ2UsIGNvbG9yID0gImRhcmtncmVlbiIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9tYXhfbWVhbl9yYW5nZSwgY29sb3IgPSAiZGFya2dyZWVuIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21lYW5fdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWluX21lYW5fcmFuZ2UsIGxhYmVsID0gIk1pbiBNZWFuIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21heF9tZWFuX3JhbmdlLCBsYWJlbCA9ICJNYXggTWVhbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9tZWFuX3ZhbHVlLCBsYWJlbCA9ICJNZWFuIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiU2xvcGUgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeV9taW4sIHlfbWF4KSkgKyAjIEFwcGx5IGR5bmFtaWMgeS1heGlzIGxpbWl0cw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgMikNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMykNCg0KYGBgDQoNCiMjIyMgU2hvcnQtVGVybQ0KDQpgYGB7ciBzcDUwMF8xMF95ZWFyX2NhZ3Jfc2xvcGVzX2dyYXBoc19zaG9ydCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyAxMC1ZZWFyIFJlZ3Jlc3Npb24gU2xvcGVzIGluIENBR1JzIEFjcm9zcyBTaG9ydC1UZXJtIFJvbGxpbmcgUGVyaW9kcyBcbiIpDQoNCiMgRmlsdGVyIGRhdGEgZm9yIFNob3J0LVRlcm0gQ0FHUiAoNS1ZZWFyIGFuZCAxMC1ZZWFyKQ0Kc2hvcnR0ZXJtX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihDQUdSX1BlcmlvZCAlaW4lIGMoIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIpKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAxOTEwDQplbmRfeWVhciA8LSBtYXhfeWVhcg0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiMTAtWWVhciBSZWdyZXNzaW9uIFNsb3BlcyBpbiBDQUdScyBBY3Jvc3MgU2hvcnQtVGVybSBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJTJlAgNTAwIExpbmVhciBSZWdyZXNzaW9uIFNsb3BlcyBpbiBDQUdScyBBY3Jvc3MgU2hvcnQtVGVybSBSb2xsaW5nIFBlcmlvZHMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxX3Nob3J0dGVybSA8LSBnZ3Bsb3Qoc2hvcnR0ZXJtX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IFNsb3BlX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IDAsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gMCksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIFNsb3BlDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggU2xvcGUNCiAgDQogICMgQWRkIHRhcmdldCBhbmQgcmFuZ2UgbGluZXMNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9taW5fbWVhbl9yYW5nZSwgY29sb3IgPSAiZGFya2dyZWVuIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21heF9tZWFuX3JhbmdlLCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWVhbl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9taW5fbWVhbl9yYW5nZSwgbGFiZWwgPSAiTWluIE1lYW4iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtncmVlbiIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWF4X21lYW5fcmFuZ2UsIGxhYmVsID0gIk1heCBNZWFuIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21lYW5fdmFsdWUsIGxhYmVsID0gIk1lYW4iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJTbG9wZSBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9yc1tjKCI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiKV0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxMCksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICsgNSwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMV9zaG9ydHRlcm0pDQoNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBSRVNUUklDVEVEIFdJVEggTElNSVRTIA0KDQojIEZpbHRlciB0aGUgZGF0YSBmb3IgdGhlIHJlc3RyaWN0ZWQgeC1heGlzIHJhbmdlICgyMDA1LTIwMjQpDQpyZXN0cmljdGVkX2RhdGEgPC0gc2hvcnR0ZXJtX2RhdGEgJT4lDQogIGZpbHRlcihhcy5pbnRlZ2VyKERhdGUpID49IDIwMDUgJiBhcy5pbnRlZ2VyKERhdGUpIDw9IDIwMjQpDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAwNQ0KZW5kX3llYXIgPC0gbWF4X3llYXINCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIjEwLVllYXIgUmVncmVzc2lvbiBTbG9wZXMgaW4gQ0FHUnMgQWNyb3NzIFNob3J0LVRlcm0gUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiUyZQIDUwMCBMaW5lYXIgUmVncmVzc2lvbiBTbG9wZXMgaW4gQ0FHUnMgQWNyb3NzIFNob3J0LVRlcm0gUm9sbGluZyBQZXJpb2RzLCBEYXRhIFBlcmlvZCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIikNCg0KIyBDYWxjdWxhdGUgZHluYW1pYyB5LWF4aXMgbGltaXRzIGZvciB0aGUgcmVzdHJpY3RlZCBkYXRhDQp5X21pbiA8LSBtaW4ocmVzdHJpY3RlZF9kYXRhJFNsb3BlX1ZhbHVlLCBuYS5ybSA9IFRSVUUpDQp5X21heCA8LSBtYXgocmVzdHJpY3RlZF9kYXRhJFNsb3BlX1ZhbHVlLCBuYS5ybSA9IFRSVUUpDQoNCiMgQ3JlYXRlIHRoZSBmaWx0ZXJlZCwgcmVzdHJpY3RlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMl9zaG9ydHRlcm0gPC0gZ2dwbG90KHNob3J0dGVybV9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBTbG9wZV9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAwLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IDApLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBTbG9wZQ0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIFNsb3BlDQogIA0KICAjIEFkZCB0YXJnZXQgYW5kIHJhbmdlIGxpbmVzDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWluX21lYW5fcmFuZ2UsIGNvbG9yID0gImRhcmtncmVlbiIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9tYXhfbWVhbl9yYW5nZSwgY29sb3IgPSAiZGFya2dyZWVuIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21lYW5fdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWluX21lYW5fcmFuZ2UsIGxhYmVsID0gIk1pbiBNZWFuIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21heF9tZWFuX3JhbmdlLCBsYWJlbCA9ICJNYXggTWVhbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9tZWFuX3ZhbHVlLCBsYWJlbCA9ICJNZWFuIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJTbG9wZSBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9yc1tjKCI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiKV0pICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKHlfbWluLCB5X21heCkpICsgIyBBcHBseSBkeW5hbWljIHktYXhpcyBsaW1pdHMNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAyKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHNob3J0LXRlcm0gQ0FHUiBwbG90DQpwcmludChwMl9zaG9ydHRlcm0pDQoNCg0KYGBgDQoNCg0KDQojIyMjIExvbmctVGVybQ0KDQpgYGB7ciBzcDUwMF8xMF95ZWFyX2NhZ3Jfc2xvcGVzX2dyYXBoc19sb25nLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQpjYXQoIlxuXG4jIyMjIDEwLVllYXIgUmVncmVzc2lvbiBTbG9wZXMgaW4gQ0FHUnMgQWNyb3NzIExvbmctVGVybSBSb2xsaW5nIFBlcmlvZHMgXG4iKQ0KDQojIEZpbHRlciBkYXRhIGZvciBMb25nLVRlcm0gQ0FHUiAoMjAtWWVhciBhbmQgMzAtWWVhcikNCmxvbmd0ZXJtX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihDQUdSX1BlcmlvZCAlaW4lIGMoIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMTkyMA0KZW5kX3llYXIgPC0gbWF4X3llYXINCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIjEwLVllYXIgUmVncmVzc2lvbiBTbG9wZXMgaW4gQ0FHUnMgQWNyb3NzIExvbmctVGVybSBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJTJlAgNTAwIExpbmVhciBSZWdyZXNzaW9uIFNsb3BlcyBpbiBDQUdScyBBY3Jvc3MgTG9uZy1UZXJtIFJvbGxpbmcgUGVyaW9kcywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDFfbG9uZ3Rlcm0gPC0gZ2dwbG90KGxvbmd0ZXJtX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IFNsb3BlX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gMCwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMTApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSAwKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggU2xvcGUNCiAgZ2VvbV9wb2ludChzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBTbG9wZQ0KICANCiAgIyBBZGQgdGFyZ2V0IGFuZCByYW5nZSBsaW5lcw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21pbl9tZWFuX3JhbmdlLCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWF4X21lYW5fcmFuZ2UsIGNvbG9yID0gImRhcmtncmVlbiIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9tZWFuX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21pbl9tZWFuX3JhbmdlLCBsYWJlbCA9ICJNaW4gTWVhbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2dyZWVuIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9tYXhfbWVhbl9yYW5nZSwgbGFiZWwgPSAiTWF4IE1lYW4iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtncmVlbiIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWVhbl92YWx1ZSwgbGFiZWwgPSAiTWVhbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIlNsb3BlIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzW2MoIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKV0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxMCksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICsgNSwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMV9sb25ndGVybSkNCg0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIFJFU1RSSUNURUQgV0lUSCBMSU1JVFMgDQoNCiMgRmlsdGVyIHRoZSBkYXRhIGZvciB0aGUgcmVzdHJpY3RlZCB4LWF4aXMgcmFuZ2UgKDIwMDUtMjAyNCkNCnJlc3RyaWN0ZWRfZGF0YSA8LSBsb25ndGVybV9kYXRhICU+JQ0KICBmaWx0ZXIoYXMuaW50ZWdlcihEYXRlKSA+PSAyMDA1ICYgYXMuaW50ZWdlcihEYXRlKSA8PSAyMDI0KQ0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMDUNCmVuZF95ZWFyIDwtIG1heF95ZWFyDQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCIxMC1ZZWFyIFJlZ3Jlc3Npb24gU2xvcGVzIGluIENBR1JzIEFjcm9zcyBMb25nLVRlcm0gUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiUyZQIDUwMCBMaW5lYXIgUmVncmVzc2lvbiBTbG9wZXMgaW4gQ0FHUnMgQWNyb3NzIExvbmctVGVybSBSb2xsaW5nIFBlcmlvZHMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENhbGN1bGF0ZSBkeW5hbWljIHktYXhpcyBsaW1pdHMgZm9yIHRoZSByZXN0cmljdGVkIGRhdGENCnlfbWluIDwtIG1pbihyZXN0cmljdGVkX2RhdGEkU2xvcGVfVmFsdWUsIG5hLnJtID0gVFJVRSkNCnlfbWF4IDwtIG1heChyZXN0cmljdGVkX2RhdGEkU2xvcGVfVmFsdWUsIG5hLnJtID0gVFJVRSkNCg0KIyBDcmVhdGUgdGhlIGZpbHRlcmVkLCByZXN0cmljdGVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAyX2xvbmd0ZXJtIDwtIGdncGxvdChsb25ndGVybV9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBTbG9wZV9WYWx1ZSwgY29sb3IgPSBDQUdSX1BlcmlvZCkpICsNCiAgDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IDAsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gMCksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMTApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIFNsb3BlDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggU2xvcGUNCiAgDQogICMgQWRkIHRhcmdldCBhbmQgcmFuZ2UgbGluZXMNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gb3ZlcmFsbF9taW5fbWVhbl9yYW5nZSwgY29sb3IgPSAiZGFya2dyZWVuIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBvdmVyYWxsX21heF9tZWFuX3JhbmdlLCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG92ZXJhbGxfbWVhbl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gb3ZlcmFsbF9taW5fbWVhbl9yYW5nZSwgbGFiZWwgPSAiTWluIE1lYW4iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtncmVlbiIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IG92ZXJhbGxfbWF4X21lYW5fcmFuZ2UsIGxhYmVsID0gIk1heCBNZWFuIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrZ3JlZW4iLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBvdmVyYWxsX21lYW5fdmFsdWUsIGxhYmVsID0gIk1lYW4iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJTbG9wZSBWYWx1ZSAoJSkiLA0KICAgIGNvbG9yID0gIkNBR1IgUGVyaW9kIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9yc1tjKCIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIildKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYyh5X21pbiwgeV9tYXgpKSArICMgQXBwbHkgZHluYW1pYyB5LWF4aXMgbGltaXRzDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMiksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBsb25nLXRlcm0gQ0FHUiBwbG90DQpwcmludChwMl9sb25ndGVybSkNCg0KDQpgYGANCg0KIA0KDQotLT4NCg0KDQojIFFRUQ0KDQpUaGUgSW52ZXNjbyBRUVEgVHJ1c3QsIGNvbW1vbmx5IGtub3duIGJ5IGl0cyB0aWNrZXIgc3ltYm9sIFFRUSwgaXMgYW4gZXhjaGFuZ2UtdHJhZGVkIGZ1bmQgKEVURikgdGhhdCB0cmFja3MgdGhlIE5hc2RhcS0xMDAgSW5kZXguIFRoaXMgaW5kZXggY29tcHJpc2VzIDEwMCBvZiB0aGUgbGFyZ2VzdCBub24tZmluYW5jaWFsIGNvbXBhbmllcyBsaXN0ZWQgb24gdGhlIE5hc2RhcSBTdG9jayBNYXJrZXQsIHByZWRvbWluYW50bHkgZmVhdHVyaW5nIGZpcm1zIGluIHRoZSB0ZWNobm9sb2d5IHNlY3RvciwgYnV0IGFsc28gaW5jbHVkaW5nIGNvbXBhbmllcyBmcm9tIGNvbnN1bWVyIHNlcnZpY2VzLCBoZWFsdGhjYXJlLCBhbmQgaW5kdXN0cmlhbHMuIER1ZSB0byBpdHMgZm9jdXMgb24gaGlnaC1ncm93dGggaW5kdXN0cmllcywgUVFRIGlzIG9mdGVuIHVzZWQgYnkgaW52ZXN0b3JzIHRvIGdhaW4gZXhwb3N1cmUgdG8gbGVhZGluZyB0ZWNoIGNvbXBhbmllcyBhbmQgdG8gY2FwaXRhbGl6ZSBvbiB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGJyb2FkZXIgdGVjaG5vbG9neSBtYXJrZXQuIA0KDQpJbnZlc2NvIEx0ZC4gaXMgYSBnbG9iYWwgaW5kZXBlbmRlbnQgaW52ZXN0bWVudCBtYW5hZ2VtZW50IGZpcm0gaGVhZHF1YXJ0ZXJlZCBpbiBBdGxhbnRhLCBHZW9yZ2lhLiBFc3RhYmxpc2hlZCBpbiAxOTc4LCB0aGUgY29tcGFueSBvZmZlcnMgYSBkaXZlcnNlIHJhbmdlIG9mIGludmVzdG1lbnQgcHJvZHVjdHMgYW5kIHNlcnZpY2VzLCBpbmNsdWRpbmcgbXV0dWFsIGZ1bmRzLCBleGNoYW5nZS10cmFkZWQgZnVuZHMgKEVURnMpLCBhbmQgcmV0aXJlbWVudCBwbGFucywgY2F0ZXJpbmcgdG8gaW5kaXZpZHVhbCBpbnZlc3RvcnMsIGZpbmFuY2lhbCBwcm9mZXNzaW9uYWxzLCBhbmQgaW5zdGl0dXRpb25zLiBPcGVyYXRpbmcgdW5kZXIgYnJhbmQgbmFtZXMgc3VjaCBhcyBJbnZlc2NvLCBJbnZlc2NvIFBlcnBldHVhbCwgYW5kIFBvd2VyU2hhcmVzLCBJbnZlc2NvIG1hbmFnZXMgYXNzZXRzIGFjcm9zcyB2YXJpb3VzIGFzc2V0IGNsYXNzZXMsIGludmVzdG1lbnQgc3R5bGVzLCBhbmQgZ2VvZ3JhcGhpZXMuIFZpc2l0IEludmVzY28gYXQgaHR0cHM6Ly93d3cuaW52ZXNjby5jb20vcXFxLWV0Zi9lbi9hYm91dC1pbnZlc2NvLmh0bWwuIA0KDQoNCiMjIFFRUSBHUg0KDQojIyMgRGF0YQ0KDQpUaGUgUVFRIGRhdGEgcHJlc2VudGVkIGhlcmUsIHNvdXJjZWQgZnJvbSBJbnZlc3RpbmcuY29tLCBzcGFucyBmcm9tIERlY2VtYmVyIDMxLCAxOTk5LCBvbndhcmQuIEludmVzdGluZy5jb20gaXMgYSBjb21wcmVoZW5zaXZlIGZpbmFuY2lhbCBwbGF0Zm9ybSB0aGF0IG9mZmVycyByZWFsLXRpbWUgZGF0YSwgcXVvdGVzLCBjaGFydHMsIGFuZCBmaW5hbmNpYWwgbmV3cyBhY3Jvc3MgZ2xvYmFsIG1hcmtldHMuIEVhY2ggIkNsb3NlIiByZXByZXNlbnRzIHRoZSBjbG9zaW5nIHByaWNlIGZvciB0aGUgZGF5IHByaW9yLCBvciB0aGUgZW5kIG9mIHRoZSBwcmlvciB5ZWFyLiBGb3IgZXhhbXBsZSwgdGhlIHByaWNlIGZvciBKYW51YXJ5IDEsIDIwMjQsIHJlZmxlY3RzIHRoZSBEZWNlbWJlciAzMSwgMjAyMywgZW5kLW9mLXllYXIgY2xvc2luZyBwcmljZS4gDQoNCkRhdGEgU291cmNlOiBgciBucnYkc291cmNlX3FxcWANCg0KYGBge3IgbnJ0JHFxcV9yYXcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBEaXNwbGF5IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGFzZXQgdG8gY29uZmlybSBjb2x1bW4gbmFtZXMNCmludGVyYWN0aXZlX3N0cihucnQkcXFxX3JhdykNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKSAgIyBGb3IgZGF0ZSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShzdHJpbmdyKQ0KDQojIEVuc3VyZSB0aGUgJ0RhdGUnIGNvbHVtbiBpcyBvZiBEYXRlIGNsYXNzDQpucnQkcXFxX3JhdyA8LSBucnQkcXFxX3JhdyAlPiUNCiAgbXV0YXRlKERhdGUgPSBhcy5EYXRlKERhdGUsIGZvcm1hdCA9ICIlWS0lbS0lZCIpKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gZm9ybWF0KG1pbihucnQkcXFxX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpLCAiJVkiKQ0KbWF4X3llYXIgPC0gZm9ybWF0KG1heChucnQkcXFxX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpLCAiJVkiKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBVcGRhdGUgZGF0YSBmcmFtZSB3aXRoIHByb3BlciBkYXRlIGFuZCBwZXJjZW50YWdlIGhhbmRsaW5nDQpucnQkcXFxX3JhdyA8LSBucnQkcXFxX3JhdyAlPiUNCiAgbXV0YXRlKA0KICAgICMgQ29udmVydCBDbG9zZSBEYXRlIHRvICJZWVlZLU1NLUREIiBmb3JtYXQNCiAgICBgRGF0ZWAgPSBmb3JtYXQoYXMuRGF0ZShhcy5jaGFyYWN0ZXIoYERhdGVgKSwgb3JpZ2luID0gIjE5NzAtMDEtMDEiKSwgIiVZLSVtLSVkIiksDQoNCiAgICAjIEVuc3VyZSBDbG9zZSBpcyBhIG51bWJlciBmb3JtYXR0ZWQgdG8gMiBkZWNpbWFsIHBsYWNlcw0KICAgIGBDbG9zZWAgPSBudW1iZXIoYXMubnVtZXJpYyhnc3ViKCIsIiwgIiIsIENsb3NlKSksIGJpZy5tYXJrID0gIiwiLCBkZWNpbWFsLm1hcmsgPSAiLiIsIGFjY3VyYWN5ID0gMC4wMSksDQoNCiAgICAjIENsZWFuIGFuZCBoYW5kbGUgcGVyY2VudGFnZSBjb2x1bW5zDQogICAgYWNyb3NzKDM6MywgfiB7DQogICAgICB2YWx1ZSA8LSBnc3ViKCJbLCVcXHNdIiwgIiIsIC4pICAjIFJlbW92ZSAlLCBjb21tYXMsIGFuZCBzcGFjZXMNCiAgICAgIG51bWVyaWNfdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKHZhbHVlKSkgICMgQ29udmVydCB0byBudW1lcmljDQogICAgICBpZmVsc2UoDQogICAgICAgICFpcy5uYShudW1lcmljX3ZhbHVlKSwgDQogICAgICAgIHBhc3RlMChmb3JtYXQocm91bmQobnVtZXJpY192YWx1ZSoxMDAsIDIpLCBiaWcubWFyayA9ICIsIiwgc2NpZW50aWZpYyA9IEZBTFNFKSwgIiUiKSwgICMgRm9ybWF0IHRvIDIgZGVjaW1hbCBwbGFjZXMgYW5kIGFkZCBjb21tYXMNCiAgICAgICAgLg0KICAgICAgKQ0KICAgIH0pDQogICkgJT4lDQogIGFycmFuZ2UoZGVzYyhgRGF0ZWApKSAgIyBTb3J0IGJ5IERhdGUgZnJvbSBuZXdlc3QgdG8gb2xkZXN0DQoNCiMgRGlzcGxheSB0aGUgZm9ybWF0dGVkIGRhdGENCmludGVyYWN0aXZlX3N0cihucnQkcXFxX3JhdykNCmludGVyYWN0aXZlX3ByaW50KG5ydCRxcXFfcmF3KQ0KDQojIERpc3BsYXkgdGhlIHRhYmxlIHdpdGggY2FwdGlvbg0KY2F0KCJcblxuIyMjIyBRUVEgWWVhcmx5IFBlcmZvcm1hbmNlICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KZm9ybWF0X2VxdWFsX3dpZHRoX2dyb3VwZWQobnJ0JHFxcV9yYXcsIGdyb3VwaW5nX2ZhY3RvciA9IDIpDQojIGNhdCgiXG5cbiBTb3VyY2U6ICIsIG5ydiRzb3VyY2VfcXFxLCAiXG4iKQ0KDQpgYGANCg0KIyMjIFN1bW1hcnkNCg0KYGBge3IgcXFxX3Jhd19zdW1tYXJ5LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWJibGUpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQppbnRlcmFjdGl2ZV9zdHIobnJ0JHFxcV9yYXcpDQppbnRlcmFjdGl2ZV9wcmludChucnQkcXFxX3JhdykNCg0KIyBFbnN1cmUgdGhlIERhdGUgY29sdW1uIGlzIGEgcHJvcGVyIERhdGUgb2JqZWN0IGFuZCBleHRyYWN0IHRoZSB5ZWFyDQpucnQkcXFxX3JhdyA8LSBucnQkcXFxX3JhdyAlPiUNCiAgc2xpY2UoLTEpICU+JSAjIFJlbW92ZSB0aGUgZmlyc3Qgcm93DQogICMgbXV0YXRlKERhdGUgPSBpZmVsc2Uocm93X251bWJlcigpID09IDEsICIyMDI1LTAxLTAxIiwgRGF0ZSkpICU+JQ0KICBtdXRhdGUoDQogICAgRGF0ZSA9IGFzLm51bWVyaWMoZm9ybWF0KGFzLkRhdGUoRGF0ZSwgZm9ybWF0ID0gIiVZLSVtLSVkIiksICIlWSIpKSwNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCJbXjAtOS4tXSIsICIiLCBgMS1ZZWFyIENBR1JgKSkNCiAgKQ0KDQojIFNvcnQgZGF0YSBieSBEYXRlIGluIGFzY2VuZGluZyBvcmRlcg0KbnJ0JHFxcV9yYXcgPC0gbnJ0JHFxcV9yYXcgJT4lDQogIGFycmFuZ2UoRGF0ZSkNCg0KDQojIENhbGN1bGF0ZSB0aGUgQ0FHUiBhbmQgZHluYW1pY2FsbHkgY3JlYXRlIGEgdmFyaWFibGUgbmFtZSB3aXRoIHRoZSBmb3JtYXQgcXFxX2NhZ3JfdmFsdWVfczxtaW5feWVhcj5fZTxtYXhfeWVhcj4NCmluaXRpYWxfdmFsdWUgPC0gMTAwICAjIEFzc3VtaW5nIGFuIGluaXRpYWwgaW5kZXggdmFsdWUgb2YgMTAwDQpmaW5hbF92YWx1ZSA8LSBpbml0aWFsX3ZhbHVlICogcHJvZCgxICsgbnJ0JHFxcV9yYXckYDEtWWVhciBDQUdSYCAvIDEwMCwgbmEucm0gPSBUUlVFKQ0KbWluX3llYXIgPC0gbWluKG5ydCRxcXFfcmF3JERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChucnQkcXFxX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQpudW1feWVhcnMgPC0gbWF4X3llYXIgLSBtaW5feWVhcg0KY2Fncl92YWx1ZSA8LSByb3VuZCgoKGZpbmFsX3ZhbHVlIC8gaW5pdGlhbF92YWx1ZSleKDEgLyBudW1feWVhcnMpIC0gMSkgKiAxMDAsIDIpDQp2YXJfbmFtZSA8LSBwYXN0ZTAoInFxcV9jYWdyX3ZhbHVlX3MiLCBtaW5feWVhciwgIl9lIiwgbWF4X3llYXIpDQphc3NpZ24odmFyX25hbWUsIGNhZ3JfdmFsdWUpDQoNCiMgQ29udmVydCBRUVEgZGF0YSB0byBudW1lcmljLCByZW1vdmluZyBhbnkgcGVyY2VudGFnZSBzaWducw0KZGF0YSA8LSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgbnJ0JHFxcV9yYXckYDEtWWVhciBDQUdSYCkpDQoNCiMgQ2FsY3VsYXRlIHN0YXRpc3RpY3MNCmNvdW50X29ic2VydmF0aW9ucyA8LSBzdW0oIWlzLm5hKGRhdGEpKQ0KbWVhbl92YWx1ZSA8LSByb3VuZChtZWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQptZWRpYW5fdmFsdWUgPC0gcm91bmQobWVkaWFuKGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQpzZF92YWx1ZSA8LSByb3VuZChzZChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KbWluX2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSAtIHNkX3ZhbHVlLCAyKQ0KbWF4X2NhZ3JfcmFuZ2UgPC0gcm91bmQoY2Fncl92YWx1ZSArIHNkX3ZhbHVlLCAyKQ0KbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KbWF4X3ZhbHVlIDwtIHJvdW5kKG1heChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KDQojIFRhcmdldCBSYXRlIEFuYWx5c2lzIC0gUmVmZXIgdG8gIlByZWZlcnJlZCBUYXJnZXRzIiBvciBpbmNsdWRlIGJlbG93IGZvciBpbmRpdmlkdWFsIGNoYW5nZXMuDQphYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHN1bShkYXRhID49IHRhcmdldF9pbmZsYXRpb24sIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbmEucm0gPSBUUlVFKQ0KYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShkYXRhID49IHRhcmdldF9tb2RlcmF0ZSwgbmEucm0gPSBUUlVFKQ0KYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIG5hLnJtID0gVFJVRSkNCg0KcGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X21vZGVyYXRlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCg0KIyBDb21waWxlIHN0YXRpc3RpY3MgaW50byBhIGxpc3QgZm9yIGVhc3kgY29udmVyc2lvbiB0byBhIGRhdGEgZnJhbWUgd2l0aCBkZWZpbml0aW9ucw0KcXFxX3Jhd19zdW1tYXJ5IDwtIHRyaWJibGUoDQogIH5TdGF0aXN0aWMsIH5WYWx1ZSwgfkRlZmluaXRpb24sDQogICJDb3VudCBvZiBPYnNlcnZhdGlvbnMiLCBhcy5jaGFyYWN0ZXIoY291bnRfb2JzZXJ2YXRpb25zKSwgIlRvdGFsIG51bWJlciBvZiBkYXRhIHBvaW50cyBjb2xsZWN0ZWQgb3ZlciB0aGUgc3BlY2lmaWMgcGVyaW9kLiIsDQogICJDQUdSIiwgcGFzdGUwKGNhZ3JfdmFsdWUsICIlIiksICJDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlOyBtZWFuIGdyb3d0aCByYXRlIG92ZXIgYSBwZXJpb2QgaWYgaXQgaGFkIGNvbXBvdW5kZWQgYW51YWxseS4iLA0KICAiTWVhbiIsIHBhc3RlMChtZWFuX3ZhbHVlLCAiJSIpLCAiUmVmbGVjdHMgdGhlIGdlbmVyYWwgcHJpY2UgbGV2ZWwgYW5kIG92ZXJhbGwgZ3Jvd3RoIHJhdGUuIiwNCiAgIk1lZGlhbiIsIHBhc3RlMChtZWRpYW5fdmFsdWUsICIlIiksICJNaWRkbGUgdmFsdWUgb2YgdGhlIGRhdGEgd2hlbiBvcmRlcmVkIGNocm9ub2xvZ2ljYWxseTsgY2VudHJhbCB0ZW5kZW5jeSBtZWFzdXJlIGxlc3MgYWZmZWN0ZWQgYnkgZXh0cmVtZSB2YWx1ZXMuIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiLCBwYXN0ZTAoc2RfdmFsdWUsICIlIiksICJUaGUgZGlzcGVyc2lvbiBvZiB2YWx1ZXMgZnJvbSB0aGUgbWVhbiwgaW5kaWNhdGluZyB0aGUgdm9sYXRpbGl0eSBvZiBwcmljZSBjaGFuZ2VzIGFuZCBlY29ub21pYyBzdGFiaWxpdHkuIiwNCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiwgcGFzdGUwKG1pbl9jYWdyX3JhbmdlLCAiJSIpLCAiTG93ZXIgYm91bmRhcnkgb2YgZXhwZWN0ZWQgUVFRIHJhbmdlOyBsb3dlc3QgZXN0aW1hdGUgb2YgdHlwaWNhbCBncm93dGggcmF0ZSBjb25zaWRlcmluZyBub3JtYWwgZmx1Y3R1YXRpb25zLiIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIsIHBhc3RlMChtYXhfY2Fncl9yYW5nZSwgIiUiKSwgIlVwcGVyIGJvdW5kYXJ5IG9mIGV4cGVjdGVkIFFRUSByYW5nZTsgaGlnaGVzdCBlc3RpbWF0ZSBvZiB0eXBpY2FsIGdyb3d0aCByYXRlIGNvbnNpZGVyaW5nIG5vcm1hbCBmbHVjdHVhdGlvbnMuIiwNCiAgIk1pbmltdW0iLCBwYXN0ZTAobWluX3ZhbHVlLCAiJSIpLCAiTG93ZXN0IGdyb3d0aCByYXRlLiIsDQogICJNYXhpbXVtIiwgcGFzdGUwKG1heF92YWx1ZSwgIiUiKSwgIkhpZ2hlc3QgZ3Jvd3RoIHJhdGUuIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgaW5mbGF0aW9uIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iLA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBjb25zZXJ2YXRpdmUgdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiIsDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBtb2RlcmF0ZSB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKSwgIlBlcmNlbnRhZ2Ugb2YgdmFsdWVzIGFib3ZlIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iDQopDQoNCiMgQ29udmVydCB0byBjaGFyYWN0ZXIgdG8gYXZvaWQgYXV0b21hdGljIGRlY2ltYWwgcG9pbnRzIG9uIHdob2xlIG51bWJlcnMNCnFxcV9yYXdfc3VtbWFyeSA8LSBxcXFfcmF3X3N1bW1hcnkgJT4lDQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5jaGFyYWN0ZXIpKQ0KDQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIEFubnVhbCBHcm93dGggUmF0ZSBTdW1tYXJ5ICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KZm9ybWF0XzNjb2xfY3VzdG9tX3dpZHRocyhxcXFfcmF3X3N1bW1hcnksIGNvbDFfd2lkdGggPSAiMjBlbSIsIGNvbDJfd2lkdGggPSAiMTBlbSIsIGNvbDNfd2lkdGggPSAiNDBlbSIpIA0KDQojIFZpZXcocXFxX3Jhd19zdW1tYXJ5KQ0KaW50ZXJhY3RpdmVfc3RyKHFxcV9yYXdfc3VtbWFyeSkNCg0KYGBgDQoNClRoZSBRUVEncyBJbmRleCBleGhpYml0cyBhIGByIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfYWdncmVzc2l2ZSkgImFnZ3Jlc3NpdmUiIGVsc2UgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9tb2RlcmF0ZSkgIm1vZGVyYXRlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfY29uc2VydmF0aXZlKSAiY29uc2VydmF0aXZlIiBlbHNlIGlmKGNhZ3JfdmFsdWUgPiB0YXJnZXRfaW5mbGF0aW9uKSAiYmFzZWxpbmUiIGVsc2UgImRpc2FwcG9pbnRpbmciYCBDQUdSIGF0IGByIGNhZ3JfdmFsdWVgJSwgYHIgaWYoY2Fncl92YWx1ZSA8IG1lYW5fdmFsdWUpICJsb3dlciB0aGFuIiBlbHNlICJoaWdoZXIgdGhhbiJgIHRoZSBtZWFuIGdyb3d0aCByYXRlIG9mIGByIG1lYW5fdmFsdWVgJSwgcmVmbGVjdGluZyB0aGUgaW1wYWN0IG9mIHNob3J0LXRlcm0gdm9sYXRpbGl0eSBhbmQgYHIgaWYoY2Fncl92YWx1ZSA+IG1lYW5fdmFsdWUpICJkZWNsaW5lcyIgZWxzZSAiZ3Jvd3RoIHNwaWtlcyJgLiBUaGUgbWVkaWFuIHJldHVybiBvZiBgciBtZWRpYW5fdmFsdWVgJSBpbmRpY2F0ZXMgdGhhdCBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgb2JzZXJ2ZWQgeWVhcnMgZXhwZXJpZW5jZWQgcmV0dXJucyBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAiYWJvdmUiIGVsc2UgImJlbG93ImAgdGhlIG1lYW4uIFRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgQ0FHUiBhbmQgdGhlIG1lZGlhbiBncm93dGggcmF0ZSBzdWdnZXN0cyB0aGF0IHN1c3RhaW5lZCBwZXJpb2RzIG9mIGFib3ZlLW1lZGlhbiBncm93dGggaGF2ZSBleGVydGVkIGN1bXVsYXRpdmUgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgInVwd2FyZCBwcmVzc3VyZSIgZWxzZSAiZG93bndhcmQgcHJlc3N1cmUiYCBvbiBvdmVyYWxsIHByaWNlIGxldmVscy4gVGhpcyByZWxhdGlvbnNoaXAgaGlnaGxpZ2h0cyBhIGRpc3RyaWJ1dGlvbiB3aXRoIG5vdGFibGUgZXh0cmVtZXMgb24gdGhlIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWFuX3ZhbHVlKSAiaGlnaGVyIiBlbHNlICJsb3dlciJgIGVuZCwgcmVmbGVjdGluZyBgciBpZihjYWdyX3ZhbHVlIDwgbWVhbl92YWx1ZSkgInBvc2l0aXZlIiBlbHNlICJuZWdhdGl2ZSJgIHNrZXduZXNzLiBUaGlzIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJwb3NpdGl2ZSIgZWxzZSAibmVnYXRpdmUiYCBza2V3bmVzcyBpbXBsaWVzIHRoYXQgd2hpbGUgbW9yZSB0aGFuIGhhbGYgb2YgdGhlIG9ic2VydmVkIHllYXJzIGV4cGVyaWVuY2VkIHJldHVybnMgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgImFib3ZlIHRoZSBtZWFuLCBkb3dudHVybnMgY2FuIGJlIHNldmVyZSIgZWxzZSAiYmVsb3cgdGhlIG1lYW4sIHVwdHVybnMgY2FuIGJlIHNpZ25pZmljYW50ImAuIEhvd2V2ZXIsIHRoZSBtYXJrZXQgaGFzIGhpc3RvcmljYWxseSBwcm92aWRlZCBzdWJzdGFudGlhbCBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAidXBzaWRlIHBvdGVudGlhbCIgZWxzZSAiZG93bnNpZGUgcmlzayJgLiBBZGRpdGlvbmFsbHksIHRoZSBmYWN0IHRoYXQgYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uYCUgb2YgdGhlIHllYXJzIGV4Y2VlZGVkIHRoZSBpbmZsYXRpb24gdGFyZ2V0IGByIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA3MCkgInJlaW5mb3JjZXMgdGhlIFFRUSdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBzdHJvbmcgbG9uZy10ZXJtIGhlZGdlIiBlbHNlIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA2MCkgInJlaW5mb3JjZXMgdGhlIFFRUSdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBsb25nLXRlcm0gaGVkZ2UiIGVsc2UgaWYgKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA+IDUwKSAicXVlc3Rpb25zIHRoZSBRUVEncyBlZmZlY3RpdmVuZXNzICBhcyBhIGxvbmctdGVybSBoZWRnZSIgZWxzZSAidW5kZXJtaW5lcyB0aGUgUVFRJ3MgZWZmZWN0aXZlbmVzcyBhcyBhIGxvbmctdGVybSBoZWRnZSJgIGFnYWluc3QgaW5mbGF0aW9uLg0KDQpUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlYCUgYHIgaWYoc2RfdmFsdWUgPiAyMCkgImluZGljYXRlcyBleHRyZW1lIHZvbGF0aWxpdHksIHJlZmxlY3Rpbmcgc3Vic3RhbnRpYWwgZmx1Y3R1YXRpb25zIGluIGVxdWl0eSBtYXJrZXRzIiBlbHNlIGlmKHNkX3ZhbHVlID4gMTUpICJ1bmRlcnNjb3JlcyBzaWduaWZpY2FudCB2b2xhdGlsaXR5LCBhIGNvbW1vbiBmZWF0dXJlIG9mIGVxdWl0eSBtYXJrZXRzIiBlbHNlICJzdWdnZXN0cyBtb2RlcmF0ZSB2b2xhdGlsaXR5LCB0eXBpY2FsIG9mIHJlbGF0aXZlbHkgc3RhYmxlIG1hcmtldHMiYC4gVGhlIGByIHJhbmdlX3JhdGlvIDwtIChtYXhfdmFsdWUgLSBtaW5fdmFsdWUpIC8gc2RfdmFsdWU7IGlmKHJhbmdlX3JhdGlvID4gNSkgImhpZ2hseSB2b2xhdGlsZSIgZWxzZSBpZihyYW5nZV9yYXRpbyA+IDMpICJub3RhYmxlIiBlbHNlICJjb21wYXJhdGl2ZWx5IHN0YWJsZSJgIHJhbmdlIG9mIGFubnVhbCByZXR1cm5zLCBzcGFubmluZyBmcm9tIGByIG1pbl92YWx1ZWAlIHRvIGByIG1heF92YWx1ZWAlLCBgciBpZihyYW5nZV9yYXRpbyA+IDUpICJpbGx1c3RyYXRlcyBhIGhpZ2hseSB2b2xhdGlsZSBtYXJrZXQgZW52aXJvbm1lbnQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIHRoZSBwb3RlbnRpYWwgZm9yIGJvdGggZXh0cmVtZSBnYWlucyBhbmQgbG9zc2VzIiBlbHNlIGlmKHJhbmdlX3JhdGlvID4gMykgImhpZ2hsaWdodHMgbm90YWJsZSBtYXJrZXQgdmFyaWFiaWxpdHksIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCAgcmVmbGVjdGluZyBib3RoIG9wcG9ydHVuaXRpZXMgYW5kIHJpc2tzIiBlbHNlICJpbmRpY2F0ZXMgYSBjb21wYXJhdGl2ZWx5IHN0YWJsZSBtYXJrZXQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIGxlc3MgZXh0cmVtZSBhbm51YWwgZmx1Y3R1YXRpb25zImAuIA0KDQpGb3IgdGhlIFFRUSB0byBiZSBjb25zaWRlcmVkIGEgaGlnaC1wZXJmb3JtaW5nIGFuZCByZXNpbGllbnQgbG9uZy10ZXJtIGludmVzdG1lbnQsIGl0IHdvdWxkIGJlIGlkZWFsIHRvIGV4Y2VlZCB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgIChlLmcuLCBgciAodGFyZ2V0X2FnZ3Jlc3NpdmUgLSB0YXJnZXRfaW5mbGF0aW9uKWAlIGFubnVhbGl6ZWQgcmV0dXJucywgYWNjb3VudGluZyBmb3IgaGlnaGVyIGluZmxhdGlvbi1hZGp1c3RlZCBwZXJmb3JtYW5jZSBleHBlY3RhdGlvbnMpIGluIGF0IGxlYXN0IDQwJS01MCUgb2YgdGhlIHllYXJzLiBUaGlzIHJhbmdlIHJlZmxlY3RzIHRoZSBwb3RlbnRpYWwgZm9yIHN0cm9uZyB1cHNpZGUgaW4gbWFueSB5ZWFycyB3aGlsZSBiYWxhbmNpbmcgdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBtYXJrZXRzIGRvIGV4cGVyaWVuY2UgZG93bnR1cm5zLiBUaGUgZmFjdCB0aGF0IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA1MCkgImluZGljYXRlcyBjb25zaXN0ZW50IGFuZCByb2J1c3QgZ3Jvd3RoLCBtYWtpbmcgdGhlIFFRUSBhIHN0cm9uZyBvcHRpb24gZm9yIHRob3NlIHNlZWtpbmcgYWdncmVzc2l2ZSBpbnZlc3RtZW50cy4iIGVsc2UgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAic3VnZ2VzdHMgdGhhdCB3aGlsZSBub3QgY29uc2lzdGVudCwgdGhlIFFRUSBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHJvYnVzdCBncm93dGggb3ZlciB0aGUgbG9uZyB0ZXJtLCBtYWtpbmcgaXQgYSB2aWFibGUgaW52ZXN0bWVudCBmb3IgdGhvc2Ugd2l0aCBhIGhpZ2hlciByaXNrIHRvbGVyYW5jZS4iIGVsc2UgInJhaXNlcyBjb25jZXJucyBhYm91dCB0aGUgUVFRJ3MgYWJpbGl0eSB0byBtZWV0IGFnZ3Jlc3NpdmUgZ3Jvd3RoIHRhcmdldHMsIG1ha2luZyBpdCBsZXNzIHN1aXRhYmxlIGZvciBpbnZlc3RvcnMgd2l0aCBoaWdoZXIgcmlzayB0b2xlcmFuY2UuImANCg0KIyMjIEdyYXBoDQoNCmBgYHtyIG5ydCRxcXFfcmF3X2dyYXBoLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBDb252ZXJ0IGAxLVllYXIgQ0FHUmAgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcNCm5ydCRxcXFfcmF3IDwtIG5ydCRxcXFfcmF3ICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIobnJ0JHFxcV9yYXckRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKG5ydCRxcXFfcmF3JERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihucnQkcXFxX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobnJ0JHFxcV9yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAwMA0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQW5udWFsIEdyb3d0aCBSYXRlcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiUVFRIEFubnVhbCBHcm93dGggUmF0ZXMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIuKAkyIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KG5ydCRxcXFfcmF3LCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBgMS1ZZWFyIENBR1JgKSkgKw0KICANCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDI1KSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMjUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAyNSkgKw0KICANCiAgIyBQbG90IGxpbmVzLCBwb2ludHMsIGFuZCBhbm5vdGF0aW9ucyBvbiB0b3Agb2Ygc2hhZGVkIGFyZWFzDQogIGdlb21fbGluZShjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuMCkgKyAgICAgICAjIERhcmsgcHVycGxlIGxpbmUgDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjUpICsgICAgICAgICMgRGFyayBwdXJwbGUgcG9pbnRzIA0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBjYWdyX3ZhbHVlLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gY2Fncl92YWx1ZSwgbGFiZWwgPSAiQ0FHUiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKyANCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiR3Jvd3RoIFJhdGUgKCUpIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICkgKw0KDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMyksICMgUmVzdHJpY3RzIHgtYXhpcyBkYXRhIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCA1KSAjIFNldHMgTWFqb3IgeC1heGlzICANCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyANCiAgICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAgICAgICAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAjIGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiKSAgIyBNaW5vciB4IGdyaWQgbGluZXMgZm9yIGVhY2ggeWVhcg0KICAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImRhcmtncmV5IiwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSAgIyBEYXJrIGJvcmRlciBhcm91bmQgdGhlIHBsb3QNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQpwcmludChwMSkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBSRVNUUklDVEVEIFdJVEggTElNSVRTDQoNCiMgRmlsdGVyIHRoZSBkYXRhIGZvciB0aGUgcmVzdHJpY3RlZCB4LWF4aXMgcmFuZ2UgKDIwMDUtMjAyNCkNCnJlc3RyaWN0ZWRfZGF0YSA8LSBucnQkcXFxX3JhdyAlPiUNCiAgZmlsdGVyKGFzLmludGVnZXIoRGF0ZSkgPj0gMjAwNSAmIGFzLmludGVnZXIoRGF0ZSkgPD0gMjAyNCkNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDA1DQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJBbm51YWwgR3Jvd3RoIFJhdGVzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJRUVEgQW5udWFsIEdyb3d0aCBSYXRlcywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAi4oCTIiwgbWF4X3llYXIsICIpIikNCg0KIyBDYWxjdWxhdGUgZHluYW1pYyB5LWF4aXMgbGltaXRzIGZvciB0aGUgcmVzdHJpY3RlZCBkYXRhDQp5X21pbiA8LSBtaW4ocmVzdHJpY3RlZF9kYXRhJGAxLVllYXIgQ0FHUmAsIG5hLnJtID0gVFJVRSkNCnlfbWF4IDwtIG1heChyZXN0cmljdGVkX2RhdGEkYDEtWWVhciBDQUdSYCwgbmEucm0gPSBUUlVFKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAzIDwtIGdncGxvdChyZXN0cmljdGVkX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IGAxLVllYXIgQ0FHUmApKSArDQogIA0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDMwKSArDQogIA0KICAjIFBsb3QgbGluZXMsIHBvaW50cywgYW5kIGFubm90YXRpb25zIG9uIHRvcCBvZiBzaGFkZWQgYXJlYXMNCiAgZ2VvbV9saW5lKGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS4wKSArICAgICAgICMgRGFyayBwdXJwbGUgbGluZSANCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjNEIwMDgyIiwgc2l6ZSA9IDEuNSkgKyAgICAgICAgIyBEYXJrIHB1cnBsZSBwb2ludHMgDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgKSArDQogIA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeV9taW4sIHlfbWF4KSkgKyAjIEFwcGx5IGR5bmFtaWMgeS1heGlzIGxpbWl0cw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDIpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgNSkNCiAgKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQoNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAgICAgICAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAjIGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5ODAiKSAgIyBNaW5vciB4IGdyaWQgbGluZXMgZm9yIGVhY2ggeWVhcg0KICAgICMgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImRhcmtncmV5IiwgZmlsbCA9IE5BLCBzaXplID0gMS4wKSAgIyBEYXJrIGJvcmRlciBhcm91bmQgdGhlIHBsb3QNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQpwcmludChwMykNCg0KYGBgDQoNCg0KIyMgUVFRIENBR1INCg0KIyMjIERhdGENCg0KRHVlIHRvIFFRUSdzIGluY2VwdGlvbiBpbiBNYXJjaCAxOTk5LCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgZGF0YSB0byBjYWxjdWxhdGUgdGhlIDMwLXllYXIgQ0FHUnMuIA0KDQpgYGB7ciBucnQkcXFxX3Jhd19nciwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIFZpZXcobnJ0JHFxcV9yYXdfZ3IpDQppbnRlcmFjdGl2ZV9zdHIobnJ0JHFxcV9yYXdfZ3IpDQoNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgICMgRm9yIGRhdGUgbWFuaXB1bGF0aW9uDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoc3RyaW5ncikNCg0KIyBVcGRhdGUgZGF0YSBmcmFtZSB3aXRoIHByb3BlciBkYXRlIGFuZCBwZXJjZW50YWdlIGhhbmRsaW5nDQpucnQkcXFxX3Jhd19nciA8LSBucnQkcXFxX3Jhd19nciAlPiUNCiAgbXV0YXRlKA0KICAgICMgQ29udmVydCBDbG9zZSBEYXRlIHRvICJZWVlZLU1NLUREIiBmb3JtYXQNCiAgICBgRGF0ZWAgPSBmb3JtYXQoYXMuRGF0ZShhcy5jaGFyYWN0ZXIoYERhdGVgKSwgb3JpZ2luID0gIjE5NzAtMDEtMDEiKSwgIiVZLSVtLSVkIiksDQogICAgDQogICAgIyBFbnN1cmUgQ2xvc2UgaXMgYSBudW1iZXIgZm9ybWF0dGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMNCiAgICBgQ2xvc2VgID0gbnVtYmVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iLCBhY2N1cmFjeSA9IDAuMDEpLA0KDQogICAgIyBDbGVhbiBhbmQgaGFuZGxlIHBlcmNlbnRhZ2UgY29sdW1ucw0KICAgIGFjcm9zcygzOjExLCB+IHsNCiAgICAgIHZhbHVlIDwtIGdzdWIoIlssJVxcc10iLCAiIiwgLikgICMgUmVtb3ZlICUsIGNvbW1hcywgYW5kIHNwYWNlcw0KICAgICAgbnVtZXJpY192YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWModmFsdWUpKSAgIyBDb252ZXJ0IHRvIG51bWVyaWMNCiAgICAgIGlmZWxzZSgNCiAgICAgICAgIWlzLm5hKG51bWVyaWNfdmFsdWUpLCANCiAgICAgICAgcGFzdGUwKGZvcm1hdChyb3VuZChudW1lcmljX3ZhbHVlKjEwMCwgMiksIGJpZy5tYXJrID0gIiwiLCBzY2llbnRpZmljID0gRkFMU0UpLCAiJSIpLCAgIyBGb3JtYXQgdG8gMiBkZWNpbWFsIHBsYWNlcyBhbmQgYWRkIGNvbW1hcw0KICAgICAgICAuDQogICAgICApDQogICAgfSkNCiAgKSAlPiUNCiAgYXJyYW5nZShkZXNjKGBEYXRlYCkpICAjIFNvcnQgYnkgRGF0ZSBmcm9tIG5ld2VzdCB0byBvbGRlc3QNCg0KIyBDcmVhdGUgbnJ0JHFxcV9yYXdfZ3I6IENHUg0KbnJ0JHFxcV9yYXdfY2dyIDwtIG5ydCRxcXFfcmF3X2dyICU+JQ0KICBzZWxlY3QoYERhdGVgLCBgQ2xvc2VgLCBgMS1ZZWFyIENBR1JgLCBjb250YWlucyAoIkNHUiIpKQ0KDQojIENyZWF0ZSBucnQkcXFxX3Jhd19ncjogQ0FHUg0KbnJ0JHFxcV9yYXdfY2FnciA8LSBucnQkcXFxX3Jhd19nciAlPiUNCiAgc2VsZWN0KGBEYXRlYCwgYENsb3NlYCwgY29udGFpbnMgKCJDQUdSIikpDQoNCiMgRGlzcGxheSBib3RoIHRhYmxlcyBmb3IgY29uZmlybWF0aW9uDQppbnRlcmFjdGl2ZV9wcmludChucnQkcXFxX3Jhd19jZ3IpDQppbnRlcmFjdGl2ZV9wcmludChucnQkcXFxX3Jhd19jYWdyKQ0KDQojIE9wdGlvbmFsOiBQcmludCB0YWJsZSBzdW1tYXJpZXMNCmludGVyYWN0aXZlX3N0cihucnQkcXFxX3Jhd19jZ3IpDQppbnRlcmFjdGl2ZV9zdHIobnJ0JHFxcV9yYXdfY2FncikNCg0KIyBEaXNwbGF5IGNhcHRpb25zIGZvciBlYWNoIHRhYmxlDQojIGNhdCgiXG5cbiMjIyMgQ3VtdWxhdGl2ZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQojIGZvcm1hdF9lcXVhbF93aWR0aChucnQkcXFxX3Jhd19jZ3IpDQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGgobnJ0JHFxcV9yYXdfY2FncikNCg0KIyBWaWV3KG5ydCRxcXFfcmF3X2NhZ3IpDQojIGNvbG5hbWVzKG5ydCRxcXFfcmF3X2NhZ3IpDQppbnRlcmFjdGl2ZV9zdHIobnJ0JHFxcV9yYXdfY2FncikNCg0KDQpgYGANCg0KIyMjIFN1bW1hcnkNCg0KYGBge3IgcXFxX3Jhd19jYWdyX3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KaW50ZXJhY3RpdmVfc3RyKG5ydCRxcXFfcmF3X2NhZ3IpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWJibGUpDQoNCiMgRGVmaW5lIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFuIGFuZCBjb252ZXJ0IHBlcmNlbnRhZ2VzDQpjbGVhbl9wZXJjZW50YWdlIDwtIGZ1bmN0aW9uKGNvbHVtbikgew0KICBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sdW1uKSkNCn0NCg0KIyBEZWZpbmUgdGhlIHN0YXRpc3RpYyBuYW1lcyBmb3IgdGhlIHN1bW1hcnkgdGFibGUNCnN0YXRpc3RpY19uYW1lcyA8LSBjKA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiwgDQogICJNZWFuIiwgDQogICJNZWRpYW4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiLA0KICAiTWluaW11bSIsIA0KICAiTWF4aW11bSIsIA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0Ig0KKQ0KDQojIEFkanVzdCB0aGUgZmlyc3Qgcm93J3MgRGF0ZSBhbmQgY2xlYW4gdXAgQ0FHUiBjb2x1bW5zDQpucnQkcXFxX3Jhd19jYWdyIDwtIG5ydCRxcXFfcmF3X2NhZ3IgJT4lDQogIHNsaWNlKC0xKSAlPiUgIyBSZW1vdmUgdGhlIGZpcnN0IHJvdw0KICBtdXRhdGUoDQogICAgIyBEYXRlID0gaWZlbHNlKHJvd19udW1iZXIoKSA9PSAxLCAiMjAyNS0wMS0wMSIsIERhdGUpLA0KICAgIERhdGUgPSBhcy5udW1lcmljKGZvcm1hdChhcy5EYXRlKERhdGUpLCAiJVkiKSksDQogICAgYDEtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDEtWWVhciBDQUdSYCksDQogICAgYDUtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDUtWWVhciBDQUdSYCksDQogICAgYDEwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAxMC1ZZWFyIENBR1JgKSwNCiAgICBgMjAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDIwLVllYXIgQ0FHUmApLA0KICAgIGAzMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMzAtWWVhciBDQUdSYCkNCiAgKQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBzdGF0aXN0aWNzIGZvciBhIGdpdmVuIGRhdGFzZXQNCmNhbGNfc3RhdHMgPC0gZnVuY3Rpb24oZGF0YSkgew0KICBpZiAoc3VtKCFpcy5uYShkYXRhKSkgPCAyKSByZXR1cm4ocmVwKE5BLCBsZW5ndGgoc3RhdGlzdGljX25hbWVzKSkpICAjIEhhbmRsZSBpbnN1ZmZpY2llbnQgZGF0YQ0KDQogIGNvdW50X29ic2VydmF0aW9ucyA8LSBzdW0oIWlzLm5hKGRhdGEpKQ0KICBtZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBzZF92YWx1ZSA8LSByb3VuZChzZChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtaW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gc2RfdmFsdWUsIDIpDQogIG1heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBzZF92YWx1ZSwgMikNCiAgbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtYXhfdmFsdWUgPC0gcm91bmQobWF4KGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIA0KICAjIERlZmluZSBpbmZsYXRpb24gYW5kIGdyb3d0aCB0YXJnZXRzDQogIHRhcmdldF9pbmZsYXRpb24gPC0gMiAgIyBFeGFtcGxlIHRhcmdldCBmb3IgaW5mbGF0aW9uDQogIHRhcmdldF9jb25zZXJ2YXRpdmUgPC0gMyArIHRhcmdldF9pbmZsYXRpb24NCiAgdGFyZ2V0X21vZGVyYXRlIDwtIDUgKyB0YXJnZXRfaW5mbGF0aW9uDQogIHRhcmdldF9hZ2dyZXNzaXZlIDwtIDEwICsgdGFyZ2V0X2luZmxhdGlvbg0KICANCiAgYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQogIA0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKGFib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X21vZGVyYXRlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICANCiAgYygNCiAgICBjb3VudF9vYnNlcnZhdGlvbnMsIA0KICAgIHBhc3RlMChtZWFuX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtZWRpYW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKHNkX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtaW5fY2Fncl9yYW5nZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X2NhZ3JfcmFuZ2UsICIlIiksDQogICAgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwgDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLCANCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKQ0KICApDQp9DQoNCiMgQ29sdW1ucyB0byBjYWxjdWxhdGUgQ0FHUiBzdGF0aXN0aWNzDQpjYWdyX2NvbHVtbnMgPC0gYygiMS1ZZWFyIENBR1IiLCAiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIiwgIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKQ0KZXhpc3RpbmdfY2Fncl9jb2x1bW5zIDwtIGludGVyc2VjdChjYWdyX2NvbHVtbnMsIG5hbWVzKG5ydCRxcXFfcmF3X2NhZ3IpKQ0KDQojIENhbGN1bGF0ZSBzdGF0cyBmb3IgZWFjaCBDQUdSIGNvbHVtbg0KY2Fncl9zdGF0c19saXN0IDwtIGxhcHBseShucnQkcXFxX3Jhd19jYWdyW2V4aXN0aW5nX2NhZ3JfY29sdW1uc10sIGNhbGNfc3RhdHMpDQoNCiMgQ29tcGlsZSBpbnRvIGEgc3VtbWFyeSBkYXRhIGZyYW1lDQpxcXFfcmF3X2NhZ3Jfc3VtbWFyeSA8LSBhcy5kYXRhLmZyYW1lKGRvLmNhbGwoY2JpbmQsIGNhZ3Jfc3RhdHNfbGlzdCkpDQpyb3duYW1lcyhxcXFfcmF3X2NhZ3Jfc3VtbWFyeSkgPC0gc3RhdGlzdGljX25hbWVzDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFNBVkUgVkFMVUVTIEZPUiBJTi1MSU5FIENPREUNCg0KIyBEZWZpbmUgdGhlIG1hcHBpbmcgb2Ygcm93IG5hbWVzIHRvIHZhcmlhYmxlIG5hbWVzDQpyb3dfdG9fdmFyX25hbWUgPC0gYygNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIgPSAiY291bnRfb2JzZXJ2YXRpb25zIiwNCiAgIk1lYW4iID0gIm1lYW5fdmFsdWUiLA0KICAiTWVkaWFuIiA9ICJtZWRpYW5fdmFsdWUiLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIgPSAic2RfdmFsdWUiLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiID0gIm1pbl9jYWdyX3JhbmdlIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiA9ICJtYXhfY2Fncl9yYW5nZSIsDQogICJNaW5pbXVtIiA9ICJtaW5fdmFsdWUiLA0KICAiTWF4aW11bSIgPSAibWF4X3ZhbHVlIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIiwNCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIg0KKQ0KDQojIEZ1bmN0aW9uIHRvIHNhdmUgc3VtbWFyeSB2YWx1ZXMgZHluYW1pY2FsbHkNCnNhdmVfY29sdW1uX3ZhbHVlcyA8LSBmdW5jdGlvbihzdW1tYXJ5X2RmKSB7DQogICMgRXhjbHVkZSB0aGUgIlN0YXRpc3RpYyIgYW5kICJPdmVyYWxsIiBjb2x1bW5zDQogIGNvbHVtbnNfdG9fc2F2ZSA8LSBzZXRkaWZmKG5hbWVzKHN1bW1hcnlfZGYpLCBjKCJTdGF0aXN0aWMiLCAiT3ZlcmFsbCIpKQ0KICANCiAgIyBJdGVyYXRlIG92ZXIgZWFjaCBjb2x1bW4NCiAgZm9yIChjb2wgaW4gY29sdW1uc190b19zYXZlKSB7DQogICAgIyBGb3JtYXQgY29sdW1uIG5hbWUgdG8gbG93ZXJjYXNlIGFuZCByZXBsYWNlIGludmFsaWQgY2hhcmFjdGVycw0KICAgIGNvbF9uYW1lIDwtIHRvbG93ZXIoZ3N1YigiW15hLXpBLVowLTldIiwgIl8iLCBjb2wpKQ0KICAgIA0KICAgICMgRXh0cmFjdCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IGNvbHVtbg0KICAgIGNvbF92YWx1ZXMgPC0gc3VtbWFyeV9kZltbY29sXV0NCiAgICANCiAgICAjIFNhdmUgZWFjaCB2YWx1ZSBkeW5hbWljYWxseSB1c2luZyB0aGUgbWFwcGluZyBmb3Igcm93IG5hbWVzDQogICAgZm9yIChpIGluIHNlcV9hbG9uZyhjb2xfdmFsdWVzKSkgew0KICAgICAgIyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgbmFtZSBmcm9tIHRoZSBtYXBwaW5nDQogICAgICBzdGF0X25hbWUgPC0gcm93X3RvX3Zhcl9uYW1lW3Jvd25hbWVzKHN1bW1hcnlfZGYpW2ldXQ0KICAgICAgDQogICAgICBpZiAoIWlzLm5hKHN0YXRfbmFtZSkpIHsgICMgU2tpcCBpZiBubyBtYXBwaW5nIGlzIGRlZmluZWQNCiAgICAgICAgIyBDcmVhdGUgdGhlIHZhcmlhYmxlIG5hbWUNCiAgICAgICAgdmFyX25hbWUgPC0gcGFzdGUwKHN0YXRfbmFtZSwgIl8iLCBjb2xfbmFtZSkNCiAgICAgICAgDQogICAgICAgICMgQXR0ZW1wdCBudW1lcmljIGNvbnZlcnNpb24gZm9yIGRvd25zdHJlYW0gdXNlDQogICAgICAgIHZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGNvbF92YWx1ZXNbaV0pKSkNCiAgICAgICAgDQogICAgICAgICMgQXNzaWduIHRoZSB2YWx1ZSB0byB0aGUgZ2xvYmFsIGVudmlyb25tZW50DQogICAgICAgIGFzc2lnbih2YXJfbmFtZSwgdmFsdWUsIGVudmlyID0gLkdsb2JhbEVudikNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KIyBBcHBseSB0aGUgZnVuY3Rpb24gdG8gc2F2ZSB2YWx1ZXMgZm9yIGFsbCBjb2x1bW5zIGV4Y2VwdCAiT3ZlcmFsbCINCnNhdmVfY29sdW1uX3ZhbHVlcyhxcXFfcmF3X2NhZ3Jfc3VtbWFyeSkNCg0KIyBFeGFtcGxlOiBBY2Nlc3NpbmcgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZXMNCmludGVyYWN0aXZlX3ByaW50KG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgbWVhbiB2YWx1ZSBmb3IgMS1ZZWFyIENBR1INCmludGVyYWN0aXZlX3ByaW50KHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl81X3llYXJfY2FncikgICMgU2hvdWxkIHByaW50IHRoZSBwZXJjZW50IGFib3ZlIGluZmxhdGlvbiB0YXJnZXQgZm9yIDUtWWVhciBDQUdSDQppbnRlcmFjdGl2ZV9wcmludChzZF92YWx1ZV8xMF95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciAxMC1ZZWFyIENBR1INCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIE9WRVJBTEwgU1RBVElTVElDUyANCm51bWVyaWNfdmFsdWVzX2FsbCA8LSBhcy5udW1lcmljKHVubGlzdChucnQkcXFxX3Jhd19jYWdyW2V4aXN0aW5nX2NhZ3JfY29sdW1uc10sIHVzZS5uYW1lcyA9IEZBTFNFKSkNCm51bWVyaWNfdmFsdWVzX2FsbCA8LSBudW1lcmljX3ZhbHVlc19hbGxbIWlzLm5hKG51bWVyaWNfdmFsdWVzX2FsbCldDQoNCm92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zIDwtIGxlbmd0aChudW1lcmljX3ZhbHVlc19hbGwpDQpvdmVyYWxsX21lYW5fdmFsdWUgPC0gcm91bmQobWVhbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9tZWRpYW5fdmFsdWUgPC0gcm91bmQobWVkaWFuKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX3NkX3ZhbHVlIDwtIHJvdW5kKHNkKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX21pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBvdmVyYWxsX3NkX3ZhbHVlLCAyKQ0Kb3ZlcmFsbF9tYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgb3ZlcmFsbF9zZF92YWx1ZSwgMikNCm92ZXJhbGxfbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9tYXhfdmFsdWUgPC0gcm91bmQobWF4KG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQoNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9pbmZsYXRpb24sIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIG5hLnJtID0gVFJVRSkNCg0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCg0KcXFxX3Jhd19jYWdyX3N1bW1hcnkkT3ZlcmFsbCA8LSBjKA0KICBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucywNCiAgcGFzdGUwKG92ZXJhbGxfbWVhbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWVkaWFuX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9zZF92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWluX2NhZ3JfcmFuZ2UsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21heF9jYWdyX3JhbmdlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9taW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21heF92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlLCAiJSIpDQopDQoNCiMgQ29udmVydCByb3cgbmFtZXMgdG8gYSBjb2x1bW4NCnFxcV9yYXdfY2Fncl9zdW1tYXJ5IDwtIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHFxcV9yYXdfY2Fncl9zdW1tYXJ5LCB2YXIgPSAiU3RhdGlzdGljIikNCg0KIyBFbnN1cmUgYWxsIGNvbHVtbnMgYXJlIGNoYXJhY3Rlcg0KcXFxX3Jhd19jYWdyX3N1bW1hcnkgPC0gcXFxX3Jhd19jYWdyX3N1bW1hcnkgJT4lDQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5jaGFyYWN0ZXIpKQ0KDQojIERpc3BsYXkgdGhlIHN1bW1hcnkgdGFibGUNCmNhdCgiXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfc3RyKHFxcV9yYXdfY2Fncl9zdW1tYXJ5KQ0KZm9ybWF0X3Vuc3BlY2lmaWVkX3dpZHRoKHFxcV9yYXdfY2Fncl9zdW1tYXJ5KQ0KDQpgYGANCg0KKipgciBtaW5feWVhcmAtYHIgbWF4X3llYXJgIFN1bW1hcnk6KiogVGhlIDEtWWVhciBDQUdSIGV4aGliaXRzIHRoZSBgciBpZihtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1heChjKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMTBfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzIwX3llYXJfY2FncikpKSAiaGlnaGVzdCBtZWFuIHJldHVybiIgZWxzZSBpZihtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1pbihjKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfMTBfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzIwX3llYXJfY2FncikpKSAibG93ZXN0IG1lYW4gcmV0dXJuIiBlbHNlICJtZWFuIHJldHVybiJgIGF0IGByIG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3JgJSwgYW5kIGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1heChjKHNkX3ZhbHVlXzFfeWVhcl9jYWdyLCBzZF92YWx1ZV81X3llYXJfY2Fnciwgc2RfdmFsdWVfMTBfeWVhcl9jYWdyLCBzZF92YWx1ZV8yMF95ZWFyX2NhZ3IpKSkgInRoZSBncmVhdGVzdCB2b2xhdGlsaXR5IHdpdGggYSIgZWxzZSBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA9PSBtaW4oYyhzZF92YWx1ZV8xX3llYXJfY2Fnciwgc2RfdmFsdWVfNV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzEwX3llYXJfY2Fnciwgc2RfdmFsdWVfMjBfeWVhcl9jYWdyKSkpICJ0aGUgbGVhc3Qgdm9sYXRpbGl0eSB3aXRoIGEiIGVsc2UgImEiYCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYHIgc2RfdmFsdWVfMV95ZWFyX2NhZ3JgJS4gQXMgdGhlIGludmVzdG1lbnQgaG9yaXpvbiBleHRlbmRzIHRvIDUsIDEwLCBhbmQgMjAgeWVhcnMsIHRoZSBtZWFuIHJldHVybnMgYHIgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA8IG1lYW4oYyhtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzEwX3llYXJfY2FnciwgbWVhbl92YWx1ZV8yMF95ZWFyX2NhZ3IpKSkgImluY3JlYXNlIiBlbHNlICJkZWNyZWFzZSJgLCByYW5naW5nIGZyb20gYHIgbWVhbl92YWx1ZV81X3llYXJfY2FncmAlIHRvIGByIG1lYW5fdmFsdWVfMjBfeWVhcl9jYWdyYCUsIHdoaWxlIHZvbGF0aWxpdHkgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPCBtZWFuKGMoc2RfdmFsdWVfNV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzEwX3llYXJfY2Fnciwgc2RfdmFsdWVfMjBfeWVhcl9jYWdyKSkpICJyaXNlcyIgZWxzZSAiZGltaW5pc2hlcyJgLCB3aXRoIHN0YW5kYXJkIGRldmlhdGlvbnMgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPiBzZF92YWx1ZV8yMF95ZWFyX2NhZ3IpICJkcm9wcGluZyIgZWxzZSAicmlzaW5nImAgZnJvbSBgciBzZF92YWx1ZV81X3llYXJfY2FncmAlIHRvIGByIHNkX3ZhbHVlXzIwX3llYXJfY2FncmAlLiBUaGlzIHRyZW5kIGluZGljYXRlcyB0aGF0IGxvbmdlciBpbnZlc3RtZW50IHBlcmlvZHMgdGVuZCB0byBvZmZlciBgciBpZihzZF92YWx1ZV8xX3llYXJfY2FnciA+IHNkX3ZhbHVlXzIwX3llYXJfY2FncikgIm1vcmUgc3RhYmxlIiBlbHNlICJsZXNzIHN0YWJsZSJgIHJldHVybnMuIEZ1cnRoZXJtb3JlLCB0aGUgcGVyY2VudGFnZSBvZiBwZXJpb2RzIGV4Y2VlZGluZyB0aGUgaW5mbGF0aW9uIHRhcmdldCBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMV95ZWFyX2NhZ3IgPCBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMjBfeWVhcl9jYWdyKSAiaW5jcmVhc2VzIiBlbHNlICJkZWNyZWFzZXMiYCB3aXRoIGxvbmdlciBkdXJhdGlvbnMsIGZyb20gYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyYCUgaW4gdGhlIDEtWWVhciBDQUdSIHRvIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl8yMF95ZWFyX2NhZ3JgJSBpbiB0aGUgMjAtWWVhciBDQUdSLCB1bmRlcnNjb3JpbmcgUVFRJ3MgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyIDwgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzIwX3llYXJfY2FncikgImVmZmVjdGl2ZW5lc3MiIGVsc2UgImluZWZmZWN0aXZlbmVzcyJgIGFzIGEgaGVkZ2UgYWdhaW5zdCBpbmZsYXRpb24gb3ZlciBleHRlbmRlZCB0aW1lZnJhbWVzLiBXaXRoIGFuIG92ZXJhbGwgcGVyY2VudGFnZSBvZiBgciBvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBleGNlZWRpbmcgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IChgciB0YXJnZXRfYWdncmVzc2l2ZSAtIHRhcmdldF9pbmZsYXRpb25gJSBhbm51YWxpemVkIHJldHVybnMpLCBRUVEgYHIgaWYob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNTApICJoYXMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgcHJvdmVuIHRvIGJlIGEgc3Ryb25nIiBlbHNlIGlmKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA+IDQwKSAiaGFzLCBvdmVyIHRoaXMgdGltZSBwZXJpb2QsIGRlbW9uc3RyYXRlZCBpdHNlbGYgYXMgYSB2aWFibGUiIGVsc2UgImFwcGVhcnMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgdG8gYmUgYSBsZXNzIHN1aXRhYmxlImAgb3B0aW9uIGZvciBhIGhpZ2gtcmV0dXJuaW5nIGxvbmctdGVybSBpbnZlc3RtZW50Lg0KDQojIyMgR3JhcGgNCg0KIyMjIyBBbGwgUGVyaW9kcw0KDQoNCmBgYHtyIG5ydCRxcXFfcmF3X2NhZ3JfZ3JhcGhzX2FsbCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUGVyaW9kcyBcbiIpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KbnJ0JHFxcV9yYXdfY2FnciA8LSBucnQkcXFxX3Jhd19jYWdyICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKSwNCiAgICBgNS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGA1LVllYXIgQ0FHUmApKSwNCiAgICBgMTAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMTAtWWVhciBDQUdSYCkpLA0KICAgIGAyMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAyMC1ZZWFyIENBR1JgKSksDQogICAgYDMwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDMwLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gbnJ0JHFxcV9yYXdfY2FnciAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGAxLVllYXIgQ0FHUmAsIGA1LVllYXIgQ0FHUmAsIGAxMC1ZZWFyIENBR1JgLCBgMjAtWWVhciBDQUdSYCwgYDMwLVllYXIgQ0FHUmApLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQ0FHUl9QZXJpb2QiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkNBR1JfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKENBR1JfUGVyaW9kID0gZmFjdG9yKENBR1JfUGVyaW9kLCBsZXZlbHMgPSBjKCIxLVllYXIgQ0FHUiIsICI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiLCAiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpKSkNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBDQUdSX1BlcmlvZCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBDQUdSX1BlcmlvZCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQ0FHUl9QZXJpb2QpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihucnQkcXFxX3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihucnQkcXFxX3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihucnQkcXFxX3Jhd19jYWdyJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChucnQkcXFxX3Jhd19jYWdyJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDAwDQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJSb2xsaW5nIENBR1JzIEFjcm9zcyBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJRUVEgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFJvbGxpbmcgUGVyaW9kcywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KG5ydF9sb25nLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDEpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCiAgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDMpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciAsIDUpKSArICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBSRVNUUklDVEVEIFdJVEggTElNSVRTIA0KDQojIEZpbHRlciB0aGUgZGF0YSBmb3IgdGhlIHJlc3RyaWN0ZWQgeC1heGlzIHJhbmdlICgyMDA1LTIwMjQpDQpyZXN0cmljdGVkX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihhcy5pbnRlZ2VyKERhdGUpID49IDIwMDUgJiBhcy5pbnRlZ2VyKERhdGUpIDw9IDIwMjQpDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAwNQ0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiUm9sbGluZyBDQUdScyBBY3Jvc3MgUGVyaW9kcyBPdmVyICIseWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiUVFRIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBSb2xsaW5nIFBlcmlvZHMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENhbGN1bGF0ZSBkeW5hbWljIHktYXhpcyBsaW1pdHMgZm9yIHRoZSByZXN0cmljdGVkIGRhdGENCnlfbWluIDwtIG1pbihyZXN0cmljdGVkX2RhdGEkQ0FHUl9WYWx1ZSwgbmEucm0gPSBUUlVFKQ0KeV9tYXggPC0gbWF4KHJlc3RyaWN0ZWRfZGF0YSRDQUdSX1ZhbHVlLCBuYS5ybSA9IFRSVUUpDQoNCiMgQ3JlYXRlIHRoZSBmaWx0ZXJlZCwgcmVzdHJpY3RlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMyA8LSBnZ3Bsb3QobnJ0X2xvbmcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoeV9taW4sIHlfbWF4KSkgKyAjIEFwcGx5IGR5bmFtaWMgeS1heGlzIGxpbWl0cw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDIgKyAxKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDMpDQoNCmBgYA0KDQojIyMjIFNob3J0LVRlcm0NCg0KYGBge3IgbnJ0JHFxcV9yYXdfY2Fncl9ncmFwaHNfc2hvcnQsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQ0KDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBTaG9ydC1UZXJtIFJvbGxpbmcgUGVyaW9kcyBcbiIpDQoNCiMgRmlsdGVyIGRhdGEgZm9yIFNob3J0LVRlcm0gQ0FHUiAoNS1ZZWFyIGFuZCAxMC1ZZWFyKQ0Kc2hvcnR0ZXJtX2RhdGEgPC0gbnJ0X2xvbmcgJT4lDQogIGZpbHRlcihDQUdSX1BlcmlvZCAlaW4lIGMoIjUtWWVhciBDQUdSIiwgIjEwLVllYXIgQ0FHUiIpKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDA1DQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDUpICogNSAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gNSkgKiA1ICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJDQUdSIEFjcm9zcyBTaG9ydC1UZXJtIFBlcmlvZHMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlFRUSBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgU2hvcnQtVGVybSBSb2xsaW5nIFBlcmlvZHMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxX3Nob3J0dGVybSA8LSBnZ3Bsb3Qoc2hvcnR0ZXJtX2RhdGEsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENBR1JfVmFsdWUsIGNvbG9yID0gQ0FHUl9QZXJpb2QpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDEwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMSkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDEwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0FHUiBQZXJpb2QNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMzAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4zMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnNbYygiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIildKSArDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMSksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICsgMSAsIDUpDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDFfc2hvcnR0ZXJtKQ0KDQpgYGANCg0KDQoNCiMjIyMgTG9uZy1UZXJtDQoNCmBgYHtyIG5ydCRxcXFfcmF3X2NhZ3JfZ3JhcGhzX2xvbmcsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQ0KDQpjYXQoIlxuXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEFjcm9zcyBMb25nLVRlcm0gUm9sbGluZyBQZXJpb2RzIFxuIikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgTG9uZy1UZXJtIENBR1IgKDIwLVllYXIgYW5kIDMwLVllYXIpDQpsb25ndGVybV9kYXRhIDwtIG5ydF9sb25nICU+JQ0KICBmaWx0ZXIoQ0FHUl9QZXJpb2QgJWluJSBjKCIyMC1ZZWFyIENBR1IiLCAiMzAtWWVhciBDQUdSIikpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMjANCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gNSkgKiA1ICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyA1KSAqIDUgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkNBR1IgQWNyb3NzIExvbmctVGVybSBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJRUVEgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIExvbmctVGVybSBSb2xsaW5nIFBlcmlvZHMsIERhdGEgUGVyaW9kICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxX2xvbmd0ZXJtIDwtIGdncGxvdChsb25ndGVybV9kYXRhLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDEpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCg0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNhZ3JfdmFsdWUsIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSBjYWdyX3ZhbHVlLCBsYWJlbCA9ICJDQUdSIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41MCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArIA0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiQ0FHUiBQZXJpb2QiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzW2MoIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKV0pICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgKyAxLCAxKQ0KICApICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCg0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxX2xvbmd0ZXJtKQ0KDQoNCmBgYA0KDQo8IS0tIA0KIyMjIyMjIyMjIyMNCiMjIFFRUSBTbG9wZSANCg0KIyMjIERhdGENCmBgYHtyIHFxcV9zbG9wZX0NCg0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyMgUVFRIFNsb3BlIC0gVXBkYXRlIERhdGUgdG8gWVlZWSBmb3JtYXQNCg0KIyBFbnN1cmUgbnVtZXJpYyBjb252ZXJzaW9uIGZvciB0aGUgYENsb3NlYCBhbmQgYERhdGVgIGNvbHVtbnMNCnFxcV9jYWdyX3Nsb3BlcyA8LSBucnQkcXFxX3Jhd19jYWdyICU+JQ0KICBtdXRhdGUoDQogICAgQ2xvc2UgPSBhcy5udW1lcmljKGdzdWIoIiwiLCAiIiwgQ2xvc2UpKSwgICMgRW5zdXJlIENsb3NlIGlzIG51bWVyaWMNCiAgICBEYXRlID0gYXMuY2hhcmFjdGVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBEYXRlKSkpICMgQ29udmVydCBEYXRlIHRvIGNoYXJhY3RlciBZWVlZDQogICkNCg0KIyBGdW5jdGlvbiB0byBjYWxjdWxhdGUgc2xvcGVzIGZvciBhIHNwZWNpZmllZCBwZXJpb2QgZm9yIGVhY2ggQ0FHUiBjb2x1bW4NCmNhbGN1bGF0ZV9jYWdyX3Nsb3BlIDwtIGZ1bmN0aW9uKGRhdGEsIHBlcmlvZHMpIHsNCiAgZm9yIChjYWdyX2NvbCBpbiBncmVwKCJDQUdSIiwgbmFtZXMoZGF0YSksIHZhbHVlID0gVFJVRSkpIHsNCiAgICBmb3IgKHBlcmlvZCBpbiBwZXJpb2RzKSB7DQogICAgICBzbG9wZV9jb2xfbmFtZSA8LSBwYXN0ZTAocGVyaW9kLCAiLVllYXIgU2xvcGUgb2YgIiwgY2Fncl9jb2wpDQogICAgICANCiAgICAgICMgSW5pdGlhbGl6ZSBzbG9wZSBjb2x1bW4gd2l0aCBOQQ0KICAgICAgZGF0YVtbc2xvcGVfY29sX25hbWVdXSA8LSBOQQ0KICAgICAgDQogICAgICAjIFJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBkYXRhIGJ5IERhdGUgKHJlY2VudCB0byBvbGRlc3QpDQogICAgICBkYXRhIDwtIGRhdGEgJT4lIGFycmFuZ2UoZGVzYyhhcy5udW1lcmljKERhdGUpKSkgICMgU29ydCBudW1lcmljYWxseSBieSBEYXRlDQogICAgICANCiAgICAgICMgQ2FsY3VsYXRlIHNsb3BlIGZvciBlYWNoIHZhbGlkIHBlcmlvZA0KICAgICAgZm9yIChpIGluIDE6KG5yb3coZGF0YSkgLSBwZXJpb2QgKyAxKSkgew0KICAgICAgICBzdWJzZXRfZGF0YSA8LSBkYXRhW2k6KGkgKyBwZXJpb2QgLSAxKSwgYygiRGF0ZSIsIGNhZ3JfY29sKV0NCiAgICAgICAgaWYgKG5yb3coc3Vic2V0X2RhdGEpID09IHBlcmlvZCAmJiBhbGwoIWlzLm5hKHN1YnNldF9kYXRhW1tjYWdyX2NvbF1dKSkpIHsNCiAgICAgICAgICAjIFVzZSBiYWNrdGlja3MgdG8gZXNjYXBlIGNvbHVtbiBuYW1lcyB3aXRoIHNwZWNpYWwgY2hhcmFjdGVycw0KICAgICAgICAgIGxtX21vZGVsIDwtIGxtKGFzLmZvcm11bGEocGFzdGUwKCJgIiwgY2Fncl9jb2wsICJgIH4gYXMubnVtZXJpYyhEYXRlKSIpKSwgZGF0YSA9IHN1YnNldF9kYXRhKQ0KICAgICAgICAgIHNsb3BlIDwtIGNvZWYobG1fbW9kZWwpWyJhcy5udW1lcmljKERhdGUpIl0gICMgU2xvcGUgb2YgQ0FHUg0KICAgICAgICAgIA0KICAgICAgICAgICMgU3RvcmUgc2xvcGUgYXMgdGhlIHJhdGUgb2YgY2hhbmdlIGZvciBDQUdSDQogICAgICAgICAgZGF0YVtbc2xvcGVfY29sX25hbWVdXVtpXSA8LSByb3VuZChzbG9wZSwgMikgICMgRW5zdXJlIHNsb3BlIGhhcyAyIGRlY2ltYWwgcG9pbnRzDQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0NCiAgcmV0dXJuKGRhdGEpDQp9DQoNCiMgQXBwbHkgdGhlIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBzbG9wZXMgZm9yIGRlc2lyZWQgcGVyaW9kcyAoZS5nLiwgMTAgYW5kIDI0IHllYXJzKQ0KZGVzaXJlZF9wZXJpb2RzIDwtIGMoMTAsIDI0KQ0KcXFxX2NhZ3Jfc2xvcGVzIDwtIGNhbGN1bGF0ZV9jYWdyX3Nsb3BlKHFxcV9jYWdyX3Nsb3BlcywgZGVzaXJlZF9wZXJpb2RzKQ0KDQojIEVuc3VyZSBkYXRhIGlzIG9yZGVyZWQgYnkgRGF0ZSBhbmQgcm91bmQgbnVtZXJpYyBjb2x1bW5zIHRvIDIgZGVjaW1hbHMNCnFxcV9jYWdyX3Nsb3BlcyA8LSBxcXFfY2Fncl9zbG9wZXMgJT4lDQogIGFycmFuZ2UoZGVzYyhhcy5udW1lcmljKERhdGUpKSkgJT4lDQogIG11dGF0ZShhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIH4gcm91bmQoLngsIDIpKSkgICMgUm91bmQgYWxsIG51bWVyaWMgY29sdW1ucyB0byAyIGRlY2ltYWxzDQoNCiMgRm9ybWF0IENBR1IgYW5kIHNsb3BlIGNvbHVtbnMgYXMgcGVyY2VudGFnZXMgd2l0aCB0d28gZGVjaW1hbHMsIGhhbmRsZSBOQSB2YWx1ZXMsIGFuZCBmb3JtYXQgQ2xvc2Ugd2l0aCBjb21tYXMNCnFxcV9jYWdyX3Nsb3BlcyA8LSBxcXFfY2Fncl9zbG9wZXMgJT4lDQogIG11dGF0ZSgNCiAgICAjIEZvcm1hdCBDQUdSIGNvbHVtbnMgd2l0aCBwZXJjZW50YWdlcw0KICAgIGFjcm9zcyhjb250YWlucygiQ0FHUiIpLCB+IGlmZWxzZShpcy5uYSgueCksICJOQSIsIHNwcmludGYoIiUuMmYlJSIsIC54KSkpLA0KICAgIA0KICAgICMgRm9ybWF0IENsb3NlIGNvbHVtbiB3aXRoIHR3byBkZWNpbWFsIHBvaW50cyBhbmQgY29tbWFzIGZvciB0aG91c2FuZHMgc2VwYXJhdG9ycw0KICAgIENsb3NlID0gaWZlbHNlKGlzLm5hKENsb3NlKSwgIk5BIiwgZm9ybWF0QyhDbG9zZSwgZm9ybWF0ID0gImYiLCBiaWcubWFyayA9ICIsIiwgZGlnaXRzID0gMikpDQogICkNCg0KIyBTYXZlIHRoZSByZXN1bHRpbmcgZGF0YWZyYW1lIGR5bmFtaWNhbGx5IHdpdGggYWRqdXN0ZWQgY29sdW1uIG5hbWVzDQppbmRleCA8LSAicXFxIiAgIyBEZWZpbmUgdGhlIGluZGV4IG5hbWUgKGUuZy4sIFFRUSkNCmZvciAocGVyaW9kIGluIGRlc2lyZWRfcGVyaW9kcykgew0KICBzbG9wZV9jb2x1bW5zIDwtIGdyZXAocGFzdGUwKHBlcmlvZCwgIi1ZZWFyIFNsb3BlIiksIG5hbWVzKHFxcV9jYWdyX3Nsb3BlcyksIHZhbHVlID0gVFJVRSkNCiAgc2xvcGVfZGYgPC0gcXFxX2NhZ3Jfc2xvcGVzICU+JQ0KICAgIHNlbGVjdChEYXRlLCBDbG9zZSwgYWxsX29mKHNsb3BlX2NvbHVtbnMpKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MoYXMubnVtZXJpYyhEYXRlKSkpICAjIEVuc3VyZSBkYXRhIGlzIG9yZGVyZWQgYnkgcmVjZW50IHRvIG9sZGVzdA0KICANCiAgIyBBZGp1c3QgY29sdW1uIG5hbWVzIGZvciB0aGUgdGFibGUNCiAgY29sbmFtZXMoc2xvcGVfZGYpIDwtIHN1YihwYXN0ZTAocGVyaW9kLCAiLVllYXIgU2xvcGUgb2YgIiksICIiLCBjb2xuYW1lcyhzbG9wZV9kZikpDQogIA0KICAjIENyZWF0ZSBkeW5hbWljIGRhdGFmcmFtZSBuYW1lDQogIGRmX25hbWUgPC0gcGFzdGUwKGluZGV4LCAiXyIsIHBlcmlvZCwgIl95ZWFyX2NhZ3Jfc2xvcGVzIikNCiAgDQogICMgU2F2ZSB0aGUgZGF0YWZyYW1lIHdpdGggdGhlIGR5bmFtaWMgbmFtZQ0KICBhc3NpZ24oZGZfbmFtZSwgc2xvcGVfZGYsIGVudmlyID0gLkdsb2JhbEVudikNCn0NCg0KIyBFeGFtcGxlIHRvIGFjY2VzcyB0aGUgZGF0YWZyYW1lcw0KaW50ZXJhY3RpdmVfcHJpbnQobHMocGF0dGVybiA9IHBhc3RlMChpbmRleCwgIl8uKl95ZWFyX2NhZ3Jfc2xvcGVzIikpKQ0KaW50ZXJhY3RpdmVfc3RyKHFxcV8xMF95ZWFyX2NhZ3Jfc2xvcGVzKQ0KaW50ZXJhY3RpdmVfc3RyKHFxcV8yNF95ZWFyX2NhZ3Jfc2xvcGVzKQ0KDQojIFByaW50IHRoZSB0YWJsZSBjYXB0aW9uIGR5bmFtaWNhbGx5DQpjYXQoIlxuIyMjIDEwLVllYXIgQ0FHUiBTbG9wZXMiKQ0KZm9ybWF0X2VxdWFsX3dpZHRoKHFxcV8xMF95ZWFyX2NhZ3Jfc2xvcGVzKQ0KDQpjYXQoIlxuIyMjIDI0LVllYXIgQ0FHUiBTbG9wZXMiKQ0KZm9ybWF0X2VxdWFsX3dpZHRoKHFxcV8yNF95ZWFyX2NhZ3Jfc2xvcGVzKQ0KDQoNCg0KYGBgDQotLT4NCg0KDQoNCiMgQkxBQ0tST0NLDQoNCkJsYWNrUm9jaywgSW5jLiBpcyBhbiBBbWVyaWNhbiBtdWx0aW5hdGlvbmFsIGludmVzdG1lbnQgbWFuYWdlbWVudCBjb3Jwb3JhdGlvbiBoZWFkcXVhcnRlcmVkIGluIE5ldyBZb3JrIENpdHkuIEZvdW5kZWQgaW4gMTk4OCwgaXQgaGFzIGdyb3duIHRvIGJlY29tZSB0aGUgd29ybGQncyBsYXJnZXN0IGFzc2V0IG1hbmFnZXIsIHdpdGggYXBwcm94aW1hdGVseSAkMTEuNSB0cmlsbGlvbiBpbiBhc3NldHMgdW5kZXIgbWFuYWdlbWVudCBhcyBvZiBPY3RvYmVyIDIwMjQuIEJsYWNrUm9jayBvZmZlcnMgYSBkaXZlcnNlIHJhbmdlIG9mIGludmVzdG1lbnQgcHJvZHVjdHMsIGluY2x1ZGluZyBtdXR1YWwgZnVuZHMsIGV4Y2hhbmdlLXRyYWRlZCBmdW5kcyAoRVRGcykgdW5kZXIgdGhlIGlTaGFyZXMgYnJhbmQsIGFuZCBhbHRlcm5hdGl2ZSBpbnZlc3RtZW50cy4gVGhlIGZpcm0gc2VydmVzIGEgYnJvYWQgY2xpZW50ZWxlLCBlbmNvbXBhc3NpbmcgaW5zdGl0dXRpb25hbCBpbnZlc3RvcnMsIGZpbmFuY2lhbCBwcm9mZXNzaW9uYWxzLCBhbmQgaW5kaXZpZHVhbCBpbnZlc3RvcnMgd29ybGR3aWRlLiBCbGFja1JvY2sgaXMgYWxzbyBrbm93biBmb3IgaXRzIEFsYWRkaW4gcGxhdGZvcm0sIGEgY29tcHJlaGVuc2l2ZSByaXNrIG1hbmFnZW1lbnQgYW5kIHBvcnRmb2xpbyBtYW5hZ2VtZW50IHN5c3RlbSB1dGlsaXplZCBib3RoIGludGVybmFsbHkgYW5kIGJ5IGV4dGVybmFsIGNsaWVudHMuIFRoZSBjb21wYW55IGVtcGhhc2l6ZXMgc3VzdGFpbmFibGUgaW52ZXN0aW5nLCBpbnRlZ3JhdGluZyBlbnZpcm9ubWVudGFsLCBzb2NpYWwsIGFuZCBnb3Zlcm5hbmNlIChFU0cpIGZhY3RvcnMgaW50byBpdHMgaW52ZXN0bWVudCBwcm9jZXNzZXMuIFdpdGggYSBnbG9iYWwgcHJlc2VuY2Ugc3Bhbm5pbmcgb3ZlciAzMCBjb3VudHJpZXMsIEJsYWNrUm9jayBwbGF5cyBhIHNpZ25pZmljYW50IHJvbGUgaW4gdGhlIGdsb2JhbCBmaW5hbmNpYWwgc3lzdGVtLCBpbmZsdWVuY2luZyBtYXJrZXQgdHJlbmRzIGFuZCBpbnZlc3RtZW50IHByYWN0aWNlcy4NCg0KIyMgQmxhY2tSb2NrIEdSDQoNCiMjIyBEYXRhDQoNClRoZSBCbGFja1JvY2sgaUJMRCBFbmR1cmHCriBWQyA1LjUgRVIgSW5kZXgsIGNvbW1vbmx5IHJlZmVycmVkIHRvIGFzIHRoZSBCbGFja1JvY2sgRW5kdXJhwq4gSW5kZXgsIGlzIGRlc2lnbmVkIHRvIHByb3ZpZGUgbW9yZSBjb25zaXN0ZW50IHJldHVybnMgY29tcGFyZWQgdG8gdHJhZGl0aW9uYWwgc3RvY2sgaW5kaWNlcy4gSXQgYWltcyB0byByZWR1Y2UgbG9zc2VzIGR1cmluZyBtYXJrZXQgZG93bnR1cm5zIHdoaWxlIGNhcHR1cmluZyBnYWlucyBpbiByaXNpbmcgbWFya2V0cy4gVGhlIGluZGV4IHByaW1hcmlseSBjb21wcmlzZXMgVS5TLiBlcXVpdGllcyBhbmQgZW1wbG95cyBhIGRhaWx5IHZvbGF0aWxpdHkgY29udHJvbCBtZWNoYW5pc20gdG8gbWl0aWdhdGUgZG93bnNpZGUgcmlzay4gVGhpcyBtZWNoYW5pc20gYWRqdXN0cyBhbGxvY2F0aW9ucyBiZXR3ZWVuIFUuUy4gZXF1aXRpZXMgYW5kIHNob3J0LXRlcm0gVS5TLiBUcmVhc3VyeSBib25kcyBiYXNlZCBvbiBtYXJrZXQgdm9sYXRpbGl0eS4gVGhlIGluZGV4J3MgY29uc3RpdHVlbnRzIGluY2x1ZGUgaVNoYXJlc8KuIEVURnMsIGFuZCBpdCB0cmFja3MgdGhlIGV4Y2VzcyByZXR1cm4gb2YgdGhlc2Ugc2VsZWN0ZWQgRVRGcyBvdmVyIHRoZSByZXR1cm4gb24gY2FzaC4gVGhpcyBzdHJ1Y3R1cmUgc2Vla3MgdG8gYmFsYW5jZSBncm93dGggcG90ZW50aWFsIHdpdGggcmlzayBtYW5hZ2VtZW50LCBtYWtpbmcgaXQgYSBzdHJhdGVnaWMgb3B0aW9uIGZvciBpbnZlc3RvcnMgc2Vla2luZyBzdGFibGUgcmV0dXJucyBhY3Jvc3MgdmFyeWluZyBtYXJrZXQgY29uZGl0aW9ucy4gQmxhY2tSb2NrIEVuZHVyYSBJbmRleCB3YXMgb2ZmaWNpYWxseSBsYXVuY2hlZCBvbiBKdW5lIDE0LCAyMDE2IGFuZCB0aGVyZWZvcmUgaGFzIGFjY3VtdWxhdGVkIGxlc3MgZGF0YSBvdmVyIHRpbWUgd2hlbiBjb21wYXJlZCB0byB0aGUgb3RoZXIgaW5kZXhlcyBhbmQgRVRGcy4gDQoNClNob3J0LXRlcm0gVHJlYXN1cnkgYm9uZHMsIG9mdGVuIHJlZmVycmVkIHRvIGFzIFRyZWFzdXJ5IG5vdGVzIChULW5vdGVzKSwgYW5kIHJlcHJlc2VudGVkIGJ5IHRoZSBFVEYgdGlja2VyIHN5bWJvbCBTSFksIGFyZSBVLlMuIGdvdmVybm1lbnQgZGVidCBzZWN1cml0aWVzIHdpdGggbWF0dXJpdGllcyB0eXBpY2FsbHkgcmFuZ2luZyBmcm9tIDEgdG8gMyB5ZWFycyAocmF0aGVyIHRoYW4gdGhlIDIgdG8gMTAgeWVhcnMgY2hhcmFjdGVyaXN0aWMgb2YgdHJhZGl0aW9uYWwgVC1ub3RlcykuIFRoZXNlIHNlY3VyaXRpZXMgcGF5IGEgZml4ZWQgaW50ZXJlc3QgcmF0ZSBldmVyeSBzaXggbW9udGhzIGFuZCBhcmUgY29uc2lkZXJlZCBsb3ctcmlzayBpbnZlc3RtZW50cyBkdWUgdG8gYmVpbmcgYmFja2VkIGJ5IHRoZSBmdWxsIGZhaXRoIGFuZCBjcmVkaXQgb2YgdGhlIFUuUy4gZ292ZXJubWVudC4gSW52ZXN0b3JzIG9mdGVuIHVzZSBzaG9ydC10ZXJtIFRyZWFzdXJ5IGJvbmRzIGxpa2UgU0hZIHRvIGFjaGlldmUgc3RhYmlsaXR5IGluIHRoZWlyIHBvcnRmb2xpb3MsIGVhcm4gbW9kZXN0IGludGVyZXN0IGluY29tZSwgYW5kIG1pbmltaXplIGV4cG9zdXJlIHRvIGludGVyZXN0IHJhdGUgZmx1Y3R1YXRpb25zLCBtYWtpbmcgdGhlbSBhbiBpZGVhbCBjaG9pY2UgaW4gdW5jZXJ0YWluIGVjb25vbWljIGVudmlyb25tZW50cy4NCg0KVGhlIGlTaGFyZXMgTVNDSSBVU0EgTWluaW11bSBWb2xhdGlsaXR5IEZhY3RvciBFVEYgKFVTTVYpIGlzIGFuIGV4Y2hhbmdlLXRyYWRlZCBmdW5kIGRlc2lnbmVkIHRvIHByb3ZpZGUgZXhwb3N1cmUgdG8gVS5TLiBzdG9ja3Mgd2l0aCBsb3dlciB2b2xhdGlsaXR5IGNvbXBhcmVkIHRvIHRoZSBicm9hZGVyIG1hcmtldC4gSXQgdHJhY2tzIHRoZSBNU0NJIFVTQSBNaW5pbXVtIFZvbGF0aWxpdHkgSW5kZXgsIGZvY3VzaW5nIG9uIGNvbXBhbmllcyB0aGF0IGV4aGliaXQgc3RhYmxlIHByaWNlIG1vdmVtZW50cywgbWFraW5nIGl0IGEgcG9wdWxhciBjaG9pY2UgZm9yIHJpc2stYXZlcnNlIGludmVzdG9ycy4gVVNNViB0eXBpY2FsbHkgaW5jbHVkZXMgbGFyZ2UtY2FwIHN0b2NrcyBmcm9tIGRlZmVuc2l2ZSBzZWN0b3JzIGxpa2UgaGVhbHRoY2FyZSwgdXRpbGl0aWVzLCBhbmQgY29uc3VtZXIgc3RhcGxlcywgYWltaW5nIHRvIHJlZHVjZSBwb3J0Zm9saW8gcmlzayB3aGlsZSBtYWludGFpbmluZyBlcXVpdHkgbWFya2V0IGV4cG9zdXJlLiBXaXRoIGEgbG93IGV4cGVuc2UgcmF0aW8sIGl0IG9mZmVycyBhIGNvc3QtZWZmaWNpZW50IHdheSB0byBhY2hpZXZlIHN0ZWFkeSByZXR1cm5zLCB0aG91Z2ggaXQgbWF5IHVuZGVycGVyZm9ybSBpbiBidWxsIG1hcmtldHMgZHVlIHRvIGl0cyBkZWZlbnNpdmUgbmF0dXJlLiBUaGlzIEVURiBpcyBpZGVhbCBmb3IgaW52ZXN0b3JzIHNlZWtpbmcgdG8gd2VhdGhlciBtYXJrZXQgZmx1Y3R1YXRpb25zIHdoaWxlIG1haW50YWluaW5nIGNvbnNpc3RlbnQgcGVyZm9ybWFuY2Ugb3ZlciB0aW1lLg0KDQpEYXRhIFNvdXJjZTogYHIgbnJ2JHNvdXJjZV9ibGFja3JvY2tfZW5kdXJhYA0KDQoNCmBgYHtyIG5ydCRibGFja3JvY2tfcmF3LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgRGlzcGxheSB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhc2V0IHRvIGNvbmZpcm0gY29sdW1uIG5hbWVzDQppbnRlcmFjdGl2ZV9zdHIobnJ0JGJsYWNrcm9ja19yYXcpDQoNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgICMgRm9yIGRhdGUgbWFuaXB1bGF0aW9uDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoc3RyaW5ncikNCg0KIyBFbnN1cmUgdGhlICdEYXRlJyBjb2x1bW4gaXMgb2YgRGF0ZSBjbGFzcw0KbnJ0JGJsYWNrcm9ja19yYXcgPC0gbnJ0JGJsYWNrcm9ja19yYXcgJT4lDQogIG11dGF0ZShEYXRlID0gYXMuRGF0ZShEYXRlLCBmb3JtYXQgPSAiJVktJW0tJWQiKSkNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIGZvcm1hdChtaW4obnJ0JGJsYWNrcm9ja19yYXckRGF0ZSwgbmEucm0gPSBUUlVFKSwgIiVZIikNCm1heF95ZWFyIDwtIGZvcm1hdChtYXgobnJ0JGJsYWNrcm9ja19yYXckRGF0ZSwgbmEucm0gPSBUUlVFKSwgIiVZIikNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgVXBkYXRlIGRhdGEgZnJhbWUgd2l0aCBwcm9wZXIgZGF0ZSBhbmQgcGVyY2VudGFnZSBoYW5kbGluZw0KbnJ0JGJsYWNrcm9ja19yYXcgPC0gbnJ0JGJsYWNrcm9ja19yYXcgJT4lDQogIG11dGF0ZSgNCiAgICAjIENvbnZlcnQgQ2xvc2UgRGF0ZSB0byAiWVlZWS1NTS1ERCIgZm9ybWF0DQogICAgYERhdGVgID0gZm9ybWF0KGFzLkRhdGUoYXMuY2hhcmFjdGVyKGBEYXRlYCksIG9yaWdpbiA9ICIxOTcwLTAxLTAxIiksICIlWS0lbS0lZCIpLA0KDQogICAgIyBFbnN1cmUgQ2xvc2UgaXMgYSBudW1iZXIgZm9ybWF0dGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMNCiAgICBgQ2xvc2VgID0gbnVtYmVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iLCBhY2N1cmFjeSA9IDAuMDEpLA0KDQogICAgIyBDbGVhbiBhbmQgaGFuZGxlIHBlcmNlbnRhZ2UgY29sdW1ucw0KICAgIGFjcm9zcygzOjMsIH4gew0KICAgICAgdmFsdWUgPC0gZ3N1YigiWywlXFxzXSIsICIiLCAuKSAgIyBSZW1vdmUgJSwgY29tbWFzLCBhbmQgc3BhY2VzDQogICAgICBudW1lcmljX3ZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh2YWx1ZSkpICAjIENvbnZlcnQgdG8gbnVtZXJpYw0KICAgICAgaWZlbHNlKA0KICAgICAgICAhaXMubmEobnVtZXJpY192YWx1ZSksIA0KICAgICAgICBwYXN0ZTAoZm9ybWF0KHJvdW5kKG51bWVyaWNfdmFsdWUqMTAwLCAyKSwgYmlnLm1hcmsgPSAiLCIsIHNjaWVudGlmaWMgPSBGQUxTRSksICIlIiksICAjIEZvcm1hdCB0byAyIGRlY2ltYWwgcGxhY2VzIGFuZCBhZGQgY29tbWFzDQogICAgICAgIC4NCiAgICAgICkNCiAgICB9KQ0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoYERhdGVgKSkgICMgU29ydCBieSBEYXRlIGZyb20gbmV3ZXN0IHRvIG9sZGVzdA0KDQojIERpc3BsYXkgdGhlIGZvcm1hdHRlZCBkYXRhDQppbnRlcmFjdGl2ZV9zdHIobnJ0JGJsYWNrcm9ja19yYXcpDQppbnRlcmFjdGl2ZV9wcmludChucnQkYmxhY2tyb2NrX3JhdykNCg0KIyBEaXNwbGF5IHRoZSB0YWJsZSB3aXRoIGNhcHRpb24NCmNhdCgiXG5cbiMjIyMgQmxhY2tSb2NrIFllYXJseSBQZXJmb3JtYW5jZSAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF9lcXVhbF93aWR0aF9ncm91cGVkKG5ydCRibGFja3JvY2tfcmF3LCBncm91cGluZ19mYWN0b3IgPSAxKQ0KIyBjYXQoIlxuXG4gU291cmNlOiAiLCBucnYkc291cmNlX2JsYWNrcm9ja19lbmR1cmEsICJcbiIpDQoNCiMgVmlldyhucnQkYmxhY2tyb2NrX3Jhd19ncikNCg0KYGBgDQoNCiMjIyBTdW1tYXJ5DQoNCmBgYHtyIGJsYWNrcm9ja19yYXdfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KaW50ZXJhY3RpdmVfc3RyKG5ydCRibGFja3JvY2tfcmF3KQ0KaW50ZXJhY3RpdmVfcHJpbnQobnJ0JGJsYWNrcm9ja19yYXcpDQoNCiMgRW5zdXJlIHRoZSBEYXRlIGNvbHVtbiBpcyBhIHByb3BlciBEYXRlIG9iamVjdCBhbmQgZXh0cmFjdCB0aGUgeWVhcg0KbnJ0JGJsYWNrcm9ja19yYXcgPC0gbnJ0JGJsYWNrcm9ja19yYXcgJT4lDQogIHNsaWNlKC0xKSAlPiUgIyBSZW1vdmUgdGhlIGZpcnN0IHJvdw0KICAjIG11dGF0ZShEYXRlID0gaWZlbHNlKHJvd19udW1iZXIoKSA9PSAxLCAiMjAyNS0wMS0wMSIsIERhdGUpKSAlPiUNCiAgbXV0YXRlKA0KICAgIERhdGUgPSBhcy5udW1lcmljKGZvcm1hdChhcy5EYXRlKERhdGUsIGZvcm1hdCA9ICIlWS0lbS0lZCIpLCAiJVkiKSksDQogICAgYDEtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiW14wLTkuLV0iLCAiIiwgYDEtWWVhciBDQUdSYCkpDQogICkNCg0KIyBTb3J0IGRhdGEgYnkgRGF0ZSBpbiBhc2NlbmRpbmcgb3JkZXINCm5ydCRibGFja3JvY2tfcmF3IDwtIG5ydCRibGFja3JvY2tfcmF3ICU+JQ0KICBhcnJhbmdlKERhdGUpDQoNCg0KIyBDYWxjdWxhdGUgdGhlIENBR1IgYW5kIGR5bmFtaWNhbGx5IGNyZWF0ZSBhIHZhcmlhYmxlIG5hbWUgd2l0aCB0aGUgZm9ybWF0IGJsYWNrcm9ja19jYWdyX3ZhbHVlX3M8bWluX3llYXI+X2U8bWF4X3llYXI+DQppbml0aWFsX3ZhbHVlIDwtIDEwMCAgIyBBc3N1bWluZyBhbiBpbml0aWFsIGluZGV4IHZhbHVlIG9mIDEwMA0KZmluYWxfdmFsdWUgPC0gaW5pdGlhbF92YWx1ZSAqIHByb2QoMSArIG5ydCRibGFja3JvY2tfcmF3JGAxLVllYXIgQ0FHUmAgLyAxMDAsIG5hLnJtID0gVFJVRSkNCm1pbl95ZWFyIDwtIG1pbihucnQkYmxhY2tyb2NrX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobnJ0JGJsYWNrcm9ja19yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbnVtX3llYXJzIDwtIG1heF95ZWFyIC0gbWluX3llYXINCmNhZ3JfdmFsdWUgPC0gcm91bmQoKChmaW5hbF92YWx1ZSAvIGluaXRpYWxfdmFsdWUpXigxIC8gbnVtX3llYXJzKSAtIDEpICogMTAwLCAyKQ0KdmFyX25hbWUgPC0gcGFzdGUwKCJibGFja3JvY2tfY2Fncl92YWx1ZV9zIiwgbWluX3llYXIsICJfZSIsIG1heF95ZWFyKQ0KYXNzaWduKHZhcl9uYW1lLCBjYWdyX3ZhbHVlKQ0KDQojIENvbnZlcnQgQmxhY2tSb2NrIGRhdGEgdG8gbnVtZXJpYywgcmVtb3ZpbmcgYW55IHBlcmNlbnRhZ2Ugc2lnbnMNCmRhdGEgPC0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIG5ydCRibGFja3JvY2tfcmF3JGAxLVllYXIgQ0FHUmApKQ0KDQojIENhbGN1bGF0ZSBzdGF0aXN0aWNzDQpjb3VudF9vYnNlcnZhdGlvbnMgPC0gc3VtKCFpcy5uYShkYXRhKSkNCm1lYW5fdmFsdWUgPC0gcm91bmQobWVhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0Kc2RfdmFsdWUgPC0gcm91bmQoc2QoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBzZF92YWx1ZSwgMikNCm1heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBzZF92YWx1ZSwgMikNCm1pbl92YWx1ZSA8LSByb3VuZChtaW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCm1heF92YWx1ZSA8LSByb3VuZChtYXgoZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCg0KIyBUYXJnZXQgUmF0ZSBBbmFseXNpcyAtIFJlZmVyIHRvICJQcmVmZXJyZWQgVGFyZ2V0cyIgb3IgaW5jbHVkZSBiZWxvdyBmb3IgaW5kaXZpZHVhbCBjaGFuZ2VzLg0KYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQphYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfbW9kZXJhdGUsIG5hLnJtID0gVFJVRSkNCmFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQoNCnBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKGFib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KcGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHJvdW5kKChhYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIGNvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQoNCiMgQ29tcGlsZSBzdGF0aXN0aWNzIGludG8gYSBsaXN0IGZvciBlYXN5IGNvbnZlcnNpb24gdG8gYSBkYXRhIGZyYW1lIHdpdGggZGVmaW5pdGlvbnMNCmJsYWNrcm9ja19yYXdfc3VtbWFyeSA8LSB0cmliYmxlKA0KICB+U3RhdGlzdGljLCB+VmFsdWUsIH5EZWZpbml0aW9uLA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiwgYXMuY2hhcmFjdGVyKGNvdW50X29ic2VydmF0aW9ucyksICJUb3RhbCBudW1iZXIgb2YgZGF0YSBwb2ludHMgY29sbGVjdGVkIG92ZXIgdGhlIHNwZWNpZmljIHBlcmlvZC4iLA0KICAiQ0FHUiIsIHBhc3RlMChjYWdyX3ZhbHVlLCAiJSIpLCAiQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZTsgbWVhbiBncm93dGggcmF0ZSBvdmVyIGEgcGVyaW9kIGlmIGl0IGhhZCBjb21wb3VuZGVkIGFudWFsbHkuIiwNCiAgIk1lYW4iLCBwYXN0ZTAobWVhbl92YWx1ZSwgIiUiKSwgIlJlZmxlY3RzIHRoZSBnZW5lcmFsIHByaWNlIGxldmVsIGFuZCBvdmVyYWxsIGdyb3d0aCByYXRlLiIsDQogICJNZWRpYW4iLCBwYXN0ZTAobWVkaWFuX3ZhbHVlLCAiJSIpLCAiTWlkZGxlIHZhbHVlIG9mIHRoZSBkYXRhIHdoZW4gb3JkZXJlZCBjaHJvbm9sb2dpY2FsbHk7IGNlbnRyYWwgdGVuZGVuY3kgbWVhc3VyZSBsZXNzIGFmZmVjdGVkIGJ5IGV4dHJlbWUgdmFsdWVzLiIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiwgcGFzdGUwKHNkX3ZhbHVlLCAiJSIpLCAiVGhlIGRpc3BlcnNpb24gb2YgdmFsdWVzIGZyb20gdGhlIG1lYW4sIGluZGljYXRpbmcgdGhlIHZvbGF0aWxpdHkgb2YgcHJpY2UgY2hhbmdlcyBhbmQgZWNvbm9taWMgc3RhYmlsaXR5LiIsDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIsIHBhc3RlMChtaW5fY2Fncl9yYW5nZSwgIiUiKSwgIkxvd2VyIGJvdW5kYXJ5IG9mIGV4cGVjdGVkIEJsYWNrUm9jayByYW5nZTsgbG93ZXN0IGVzdGltYXRlIG9mIHR5cGljYWwgZ3Jvd3RoIHJhdGUgY29uc2lkZXJpbmcgbm9ybWFsIGZsdWN0dWF0aW9ucy4iLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiLCBwYXN0ZTAobWF4X2NhZ3JfcmFuZ2UsICIlIiksICJVcHBlciBib3VuZGFyeSBvZiBleHBlY3RlZCBCbGFja1JvY2sgcmFuZ2U7IGhpZ2hlc3QgZXN0aW1hdGUgb2YgdHlwaWNhbCBncm93dGggcmF0ZSBjb25zaWRlcmluZyBub3JtYWwgZmx1Y3R1YXRpb25zLiIsDQogICJNaW5pbXVtIiwgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwgIkxvd2VzdCBncm93dGggcmF0ZS4iLA0KICAiTWF4aW11bSIsIHBhc3RlMChtYXhfdmFsdWUsICIlIiksICJIaWdoZXN0IGdyb3d0aCByYXRlLiIsDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLCAiUGVyY2VudGFnZSBvZiB2YWx1ZXMgYWJvdmUgdGhlIGluZmxhdGlvbiB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIsIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgY29uc2VydmF0aXZlIHRhcmdldCBzcGVjaWZpZWQgaW4gUHJlZmVycmVkIFRhcmdldHMgc2VjdGlvbi4iLA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiLCBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgbW9kZXJhdGUgdGFyZ2V0IHNwZWNpZmllZCBpbiBQcmVmZXJyZWQgVGFyZ2V0cyBzZWN0aW9uLiIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiwgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUsICIlIiksICJQZXJjZW50YWdlIG9mIHZhbHVlcyBhYm92ZSB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgc3BlY2lmaWVkIGluIFByZWZlcnJlZCBUYXJnZXRzIHNlY3Rpb24uIg0KKQ0KDQojIENvbnZlcnQgdG8gY2hhcmFjdGVyIHRvIGF2b2lkIGF1dG9tYXRpYyBkZWNpbWFsIHBvaW50cyBvbiB3aG9sZSBudW1iZXJzDQpibGFja3JvY2tfcmF3X3N1bW1hcnkgPC0gYmxhY2tyb2NrX3Jhd19zdW1tYXJ5ICU+JQ0KICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgYXMuY2hhcmFjdGVyKSkNCg0KIyBEaXNwbGF5IGZvcm1hdHRlZCB0YWJsZQ0KY2F0KCJcblxuIyMjIyBBbm51YWwgR3Jvd3RoIFJhdGUgU3VtbWFyeSAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmZvcm1hdF8zY29sX2N1c3RvbV93aWR0aHMoYmxhY2tyb2NrX3Jhd19zdW1tYXJ5LCBjb2wxX3dpZHRoID0gIjIwZW0iLCBjb2wyX3dpZHRoID0gIjEwZW0iLCBjb2wzX3dpZHRoID0gIjQwZW0iKSANCg0KIyBWaWV3KGJsYWNrcm9ja19yYXdfc3VtbWFyeSkNCmludGVyYWN0aXZlX3N0cihibGFja3JvY2tfcmF3X3N1bW1hcnkpDQoNCmBgYA0KDQpUaGUgQmxhY2tSb2NrIEVuZHVyYSdzIEluZGV4IGV4aGliaXRzIGEgYHIgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9hZ2dyZXNzaXZlKSAiYWdncmVzc2l2ZSIgZWxzZSBpZihjYWdyX3ZhbHVlID4gdGFyZ2V0X21vZGVyYXRlKSAibW9kZXJhdGUiIGVsc2UgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9jb25zZXJ2YXRpdmUpICJjb25zZXJ2YXRpdmUiIGVsc2UgaWYoY2Fncl92YWx1ZSA+IHRhcmdldF9pbmZsYXRpb24pICJiYXNlbGluZSIgZWxzZSAiZGlzYXBwb2ludGluZyJgIENBR1IgYXQgYHIgY2Fncl92YWx1ZWAlLCBgciBpZihjYWdyX3ZhbHVlIDwgbWVhbl92YWx1ZSkgImxvd2VyIHRoYW4iIGVsc2UgImhpZ2hlciB0aGFuImAgdGhlIG1lYW4gZ3Jvd3RoIHJhdGUgb2YgYHIgbWVhbl92YWx1ZWAlLCByZWZsZWN0aW5nIHRoZSBpbXBhY3Qgb2Ygc2hvcnQtdGVybSB2b2xhdGlsaXR5IGFuZCBgciBpZihjYWdyX3ZhbHVlID4gbWVhbl92YWx1ZSkgImRlY2xpbmVzIiBlbHNlICJncm93dGggc3Bpa2VzImAuIFRoZSBtZWRpYW4gcmV0dXJuIG9mIGByIG1lZGlhbl92YWx1ZWAlIGluZGljYXRlcyB0aGF0IG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBvYnNlcnZlZCB5ZWFycyBleHBlcmllbmNlZCByZXR1cm5zIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJhYm92ZSIgZWxzZSAiYmVsb3ciYCB0aGUgbWVhbi4gVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBDQUdSIGFuZCB0aGUgbWVkaWFuIGdyb3d0aCByYXRlIHN1Z2dlc3RzIHRoYXQgc3VzdGFpbmVkIHBlcmlvZHMgb2YgYWJvdmUtbWVkaWFuIGdyb3d0aCBoYXZlIGV4ZXJ0ZWQgY3VtdWxhdGl2ZSBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAidXB3YXJkIHByZXNzdXJlIiBlbHNlICJkb3dud2FyZCBwcmVzc3VyZSJgIG9uIG92ZXJhbGwgcHJpY2UgbGV2ZWxzLiBUaGlzIHJlbGF0aW9uc2hpcCBoaWdobGlnaHRzIGEgZGlzdHJpYnV0aW9uIHdpdGggbm90YWJsZSBleHRyZW1lcyBvbiB0aGUgYHIgaWYoY2Fncl92YWx1ZSA8IG1lYW5fdmFsdWUpICJoaWdoZXIiIGVsc2UgImxvd2VyImAgZW5kLCByZWZsZWN0aW5nIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWFuX3ZhbHVlKSAicG9zaXRpdmUiIGVsc2UgIm5lZ2F0aXZlImAgc2tld25lc3MuIFRoaXMgYHIgaWYoY2Fncl92YWx1ZSA8IG1lZGlhbl92YWx1ZSkgInBvc2l0aXZlIiBlbHNlICJuZWdhdGl2ZSJgIHNrZXduZXNzIGltcGxpZXMgdGhhdCB3aGlsZSBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgb2JzZXJ2ZWQgeWVhcnMgZXhwZXJpZW5jZWQgcmV0dXJucyBgciBpZihjYWdyX3ZhbHVlIDwgbWVkaWFuX3ZhbHVlKSAiYWJvdmUgdGhlIG1lYW4sIGRvd250dXJucyBjYW4gYmUgc2V2ZXJlIiBlbHNlICJiZWxvdyB0aGUgbWVhbiwgdXB0dXJucyBjYW4gYmUgc2lnbmlmaWNhbnQiYC4gSG93ZXZlciwgdGhlIG1hcmtldCBoYXMgaGlzdG9yaWNhbGx5IHByb3ZpZGVkIHN1YnN0YW50aWFsIGByIGlmKGNhZ3JfdmFsdWUgPCBtZWRpYW5fdmFsdWUpICJ1cHNpZGUgcG90ZW50aWFsIiBlbHNlICJkb3duc2lkZSByaXNrImAuIEFkZGl0aW9uYWxseSwgdGhlIGZhY3QgdGhhdCBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25gJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGluZmxhdGlvbiB0YXJnZXQgYHIgaWYgKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA+IDcwKSAicmVpbmZvcmNlcyB0aGUgQmxhY2tSb2NrIEVuZHVyYSdzIGVmZmVjdGl2ZW5lc3MgYXMgYSBzdHJvbmcgbG9uZy10ZXJtIGhlZGdlIiBlbHNlIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA2MCkgInJlaW5mb3JjZXMgdGhlIEJsYWNrUm9jayBFbmR1cmEncyBlZmZlY3RpdmVuZXNzIGFzIGEgbG9uZy10ZXJtIGhlZGdlIiBlbHNlIGlmIChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPiA1MCkgInF1ZXN0aW9ucyB0aGUgQmxhY2tSb2NrIEVuZHVyYSdzIGVmZmVjdGl2ZW5lc3MgIGFzIGEgbG9uZy10ZXJtIGhlZGdlIiBlbHNlICJ1bmRlcm1pbmVzIHRoZSBCbGFja1JvY2sgRW5kdXJhJ3MgZWZmZWN0aXZlbmVzcyBhcyBhIGxvbmctdGVybSBoZWRnZSJgIGFnYWluc3QgaW5mbGF0aW9uLg0KDQpUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlYCUgYHIgaWYoc2RfdmFsdWUgPiAyMCkgImluZGljYXRlcyBleHRyZW1lIHZvbGF0aWxpdHksIHJlZmxlY3Rpbmcgc3Vic3RhbnRpYWwgZmx1Y3R1YXRpb25zIGluIGVxdWl0eSBtYXJrZXRzIiBlbHNlIGlmKHNkX3ZhbHVlID4gMTUpICJ1bmRlcnNjb3JlcyBzaWduaWZpY2FudCB2b2xhdGlsaXR5LCBhIGNvbW1vbiBmZWF0dXJlIG9mIGVxdWl0eSBtYXJrZXRzIiBlbHNlICJzdWdnZXN0cyBtb2RlcmF0ZSB2b2xhdGlsaXR5LCB0eXBpY2FsIG9mIHJlbGF0aXZlbHkgc3RhYmxlIG1hcmtldHMiYC4gVGhlIGByIHJhbmdlX3JhdGlvIDwtIChtYXhfdmFsdWUgLSBtaW5fdmFsdWUpIC8gc2RfdmFsdWU7IGlmKHJhbmdlX3JhdGlvID4gNSkgImhpZ2hseSB2b2xhdGlsZSIgZWxzZSBpZihyYW5nZV9yYXRpbyA+IDMpICJub3RhYmxlIiBlbHNlICJjb21wYXJhdGl2ZWx5IHN0YWJsZSJgIHJhbmdlIG9mIGFubnVhbCByZXR1cm5zLCBzcGFubmluZyBmcm9tIGByIG1pbl92YWx1ZWAlIHRvIGByIG1heF92YWx1ZWAlLCBgciBpZihyYW5nZV9yYXRpbyA+IDUpICJpbGx1c3RyYXRlcyBhIGhpZ2hseSB2b2xhdGlsZSBtYXJrZXQgZW52aXJvbm1lbnQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIHRoZSBwb3RlbnRpYWwgZm9yIGJvdGggZXh0cmVtZSBnYWlucyBhbmQgbG9zc2VzIiBlbHNlIGlmKHJhbmdlX3JhdGlvID4gMykgImhpZ2hsaWdodHMgbm90YWJsZSBtYXJrZXQgdmFyaWFiaWxpdHksIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCAgcmVmbGVjdGluZyBib3RoIG9wcG9ydHVuaXRpZXMgYW5kIHJpc2tzIiBlbHNlICJpbmRpY2F0ZXMgYSBjb21wYXJhdGl2ZWx5IHN0YWJsZSBtYXJrZXQsIHBhcnRseSBkdWUgdG8gaXRzIGNvbXBvc2l0aW9uLCB3aXRoIGxlc3MgZXh0cmVtZSBhbm51YWwgZmx1Y3R1YXRpb25zImAuIA0KDQpGb3IgdGhlIEJsYWNrUm9jayBFbmR1cmEgdG8gYmUgY29uc2lkZXJlZCBhIGhpZ2gtcGVyZm9ybWluZyBhbmQgcmVzaWxpZW50IGxvbmctdGVybSBpbnZlc3RtZW50LCBpdCB3b3VsZCBiZSBpZGVhbCB0byBleGNlZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IChlLmcuLCBgciAodGFyZ2V0X2FnZ3Jlc3NpdmUgLSB0YXJnZXRfaW5mbGF0aW9uKWAlIGFubnVhbGl6ZWQgcmV0dXJucywgYWNjb3VudGluZyBmb3IgaGlnaGVyIGluZmxhdGlvbi1hZGp1c3RlZCBwZXJmb3JtYW5jZSBleHBlY3RhdGlvbnMpIGluIGF0IGxlYXN0IDQwJS01MCUgb2YgdGhlIHllYXJzLiBUaGlzIHJhbmdlIHJlZmxlY3RzIHRoZSBwb3RlbnRpYWwgZm9yIHN0cm9uZyB1cHNpZGUgaW4gbWFueSB5ZWFycyB3aGlsZSBiYWxhbmNpbmcgdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBtYXJrZXRzIGRvIGV4cGVyaWVuY2UgZG93bnR1cm5zLiBUaGUgZmFjdCB0aGF0IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA1MCkgImluZGljYXRlcyBjb25zaXN0ZW50IGFuZCByb2J1c3QgZ3Jvd3RoLCBtYWtpbmcgdGhlIEJsYWNrUm9jayBFbmR1cmEgYSBzdHJvbmcgb3B0aW9uIGZvciB0aG9zZSBzZWVraW5nIGFnZ3Jlc3NpdmUgaW52ZXN0bWVudHMuIiBlbHNlIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA0MCkgInN1Z2dlc3RzIHRoYXQgd2hpbGUgbm90IGNvbnNpc3RlbnQsIHRoZSBCbGFja1JvY2sgRW5kdXJhIGhhcyBoaXN0b3JpY2FsbHkgcHJvdmlkZWQgcm9idXN0IGdyb3d0aCBvdmVyIHRoZSBsb25nIHRlcm0sIG1ha2luZyBpdCBhIHZpYWJsZSBpbnZlc3RtZW50IGZvciB0aG9zZSB3aXRoIGEgaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiIgZWxzZSAicmFpc2VzIGNvbmNlcm5zIGFib3V0IHRoZSBCbGFja1JvY2sgRW5kdXJhJ3MgYWJpbGl0eSB0byBtZWV0IGFnZ3Jlc3NpdmUgZ3Jvd3RoIHRhcmdldHMsIG1ha2luZyBpdCBsZXNzIHN1aXRhYmxlIGZvciBpbnZlc3RvcnMgd2l0aCBoaWdoZXIgcmlzayB0b2xlcmFuY2UuImANCg0KDQojIyMgR3JhcGgNCg0KYGBge3IgbnJ0JGJsYWNrcm9ja19yYXdfZ3JhcGgsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBDb252ZXJ0IGAxLVllYXIgQ0FHUmAgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcNCm5ydCRibGFja3JvY2tfcmF3IDwtIG5ydCRibGFja3JvY2tfcmF3ICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIobnJ0JGJsYWNrcm9ja19yYXckRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKG5ydCRibGFja3JvY2tfcmF3JERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihucnQkYmxhY2tyb2NrX3JhdyREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobnJ0JGJsYWNrcm9ja19yYXckRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMTgNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gMikgKiAyICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyAyKSAqIDIgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkFubnVhbCBHcm93dGggUmF0ZXMgT3ZlciAiLHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkJsYWNrUm9jayBBbm51YWwgR3Jvd3RoIFJhdGVzLCBEYXRhIFBlcmlvZCAoIiwgbWluX3llYXIsICLigJMiLCBtYXhfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnQkYmxhY2tyb2NrX3JhdywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gYDEtWWVhciBDQUdSYCkpICsNCiAgDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjA1MCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDUwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wNTApICsNCiAgDQogICMgUGxvdCBsaW5lcywgcG9pbnRzLCBhbmQgYW5ub3RhdGlvbnMgb24gdG9wIG9mIHNoYWRlZCBhcmVhcw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzRCMDA4MiIsIHNpemUgPSAxLjApICsgICAgICAgIyBEYXJrIHB1cnBsZSBsaW5lIA0KICBnZW9tX3BvaW50KGNvbG9yID0gIiM0QjAwODIiLCBzaXplID0gMS41KSArICAgICAgICAjIERhcmsgcHVycGxlIHBvaW50cyANCiAgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkdyb3d0aCBSYXRlICglKSIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICApICsNCg0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEpLCAjIFJlc3RyaWN0cyB4LWF4aXMgZGF0YSANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgMikgIyBTZXRzIE1ham9yIHgtYXhpcyAgDQogICkgKyAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgDQogICAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgICAgICAgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgIyBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JleTgwIikgICMgTWlub3IgeCBncmlkIGxpbmVzIGZvciBlYWNoIHllYXINCiAgICAjIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJkYXJrZ3JleSIsIGZpbGwgPSBOQSwgc2l6ZSA9IDEuMCkgICMgRGFyayBib3JkZXIgYXJvdW5kIHRoZSBwbG90DQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KcHJpbnQocDEpDQoNCmBgYA0KDQojIyBCbGFja1JvY2sgQ0FHUg0KDQojIyMgRGF0YQ0KDQpEdWUgdG8gQmxhY2tSb2NrIEVuZHVyYSdzIGluY2VwdGlvbiBpbiAyMDE2LCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgZGF0YSB0byBjYWxjdWxhdGUgdGhlIDEwLXllYXIsIDIwLXllYXIgYW5kIDMwLXllYXIgQ0FHUnMuIA0KDQpgYGB7ciBucnQkYmxhY2tyb2NrX3Jhd19nciwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIFZpZXcobnJ0JGJsYWNrcm9ja19yYXdfZ3IpDQppbnRlcmFjdGl2ZV9zdHIobnJ0JGJsYWNrcm9ja19yYXdfZ3IpDQoNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkgICMgRm9yIGRhdGUgbWFuaXB1bGF0aW9uDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoc3RyaW5ncikNCg0KIyBVcGRhdGUgZGF0YSBmcmFtZSB3aXRoIHByb3BlciBkYXRlIGFuZCBwZXJjZW50YWdlIGhhbmRsaW5nDQpucnQkYmxhY2tyb2NrX3Jhd19nciA8LSBucnQkYmxhY2tyb2NrX3Jhd19nciAlPiUNCiAgbXV0YXRlKA0KICAgICMgQ29udmVydCBDbG9zZSBEYXRlIHRvICJZWVlZLU1NLUREIiBmb3JtYXQNCiAgICBgRGF0ZWAgPSBmb3JtYXQoYXMuRGF0ZShhcy5jaGFyYWN0ZXIoYERhdGVgKSwgb3JpZ2luID0gIjE5NzAtMDEtMDEiKSwgIiVZLSVtLSVkIiksDQogICAgDQogICAgIyBFbnN1cmUgQ2xvc2UgaXMgYSBudW1iZXIgZm9ybWF0dGVkIHRvIDIgZGVjaW1hbCBwbGFjZXMNCiAgICBgQ2xvc2VgID0gbnVtYmVyKGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBDbG9zZSkpLCBiaWcubWFyayA9ICIsIiwgZGVjaW1hbC5tYXJrID0gIi4iLCBhY2N1cmFjeSA9IDAuMDEpLA0KDQogICAgIyBDbGVhbiBhbmQgaGFuZGxlIHBlcmNlbnRhZ2UgY29sdW1ucw0KICAgIGFjcm9zcygzOjExLCB+IHsNCiAgICAgIHZhbHVlIDwtIGdzdWIoIlssJVxcc10iLCAiIiwgLikgICMgUmVtb3ZlICUsIGNvbW1hcywgYW5kIHNwYWNlcw0KICAgICAgbnVtZXJpY192YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWModmFsdWUpKSAgIyBDb252ZXJ0IHRvIG51bWVyaWMNCiAgICAgIGlmZWxzZSgNCiAgICAgICAgIWlzLm5hKG51bWVyaWNfdmFsdWUpLCANCiAgICAgICAgcGFzdGUwKGZvcm1hdChyb3VuZChudW1lcmljX3ZhbHVlKjEwMCwgMiksIGJpZy5tYXJrID0gIiwiLCBzY2llbnRpZmljID0gRkFMU0UpLCAiJSIpLCAgIyBGb3JtYXQgdG8gMiBkZWNpbWFsIHBsYWNlcyBhbmQgYWRkIGNvbW1hcw0KICAgICAgICAuDQogICAgICApDQogICAgfSkNCiAgKSAlPiUNCiAgYXJyYW5nZShkZXNjKGBEYXRlYCkpICAjIFNvcnQgYnkgRGF0ZSBmcm9tIG5ld2VzdCB0byBvbGRlc3QNCg0KIyBDcmVhdGUgbnJ0JGJsYWNrcm9ja19yYXdfZ3I6IENHUg0KbnJ0JGJsYWNrcm9ja19yYXdfY2dyIDwtIG5ydCRibGFja3JvY2tfcmF3X2dyICU+JQ0KICBzZWxlY3QoYERhdGVgLCBgQ2xvc2VgLCBgMS1ZZWFyIENBR1JgLCBjb250YWlucyAoIkNHUiIpKQ0KDQojIENyZWF0ZSBucnQkYmxhY2tyb2NrX3Jhd19ncjogQ0FHUg0KbnJ0JGJsYWNrcm9ja19yYXdfY2FnciA8LSBucnQkYmxhY2tyb2NrX3Jhd19nciAlPiUNCiAgc2VsZWN0KGBEYXRlYCwgYENsb3NlYCwgY29udGFpbnMgKCJDQUdSIikpDQoNCiMgRGlzcGxheSBib3RoIHRhYmxlcyBmb3IgY29uZmlybWF0aW9uDQppbnRlcmFjdGl2ZV9wcmludChucnQkYmxhY2tyb2NrX3Jhd19jZ3IpDQppbnRlcmFjdGl2ZV9wcmludChucnQkYmxhY2tyb2NrX3Jhd19jYWdyKQ0KDQojIE9wdGlvbmFsOiBQcmludCB0YWJsZSBzdW1tYXJpZXMNCmludGVyYWN0aXZlX3N0cihucnQkYmxhY2tyb2NrX3Jhd19jZ3IpDQppbnRlcmFjdGl2ZV9zdHIobnJ0JGJsYWNrcm9ja19yYXdfY2FncikNCg0KIyBEaXNwbGF5IGNhcHRpb25zIGZvciBlYWNoIHRhYmxlDQojIGNhdCgiXG5cbiMjIyMgQ3VtdWxhdGl2ZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQojIGZvcm1hdF9lcXVhbF93aWR0aChucnQkYmxhY2tyb2NrX3Jhd19jZ3IpDQoNCmNhdCgiXG5cbiMjIyMgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQpmb3JtYXRfZXF1YWxfd2lkdGgobnJ0JGJsYWNrcm9ja19yYXdfY2FncikNCg0KIyBWaWV3KG5ydCRibGFja3JvY2tfcmF3X2NhZ3IpDQojIGNvbG5hbWVzKG5ydCRibGFja3JvY2tfcmF3X2NhZ3IpDQppbnRlcmFjdGl2ZV9zdHIobnJ0JGJsYWNrcm9ja19yYXdfY2FncikNCg0KDQpgYGANCg0KIyMjIFN1bW1hcnkNCg0KYGBge3IgYmxhY2tyb2NrX3Jhd19jYWdyX3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KaW50ZXJhY3RpdmVfc3RyKG5ydCRibGFja3JvY2tfcmF3X2NhZ3IpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWJibGUpDQoNCiMgRGVmaW5lIGEgaGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFuIGFuZCBjb252ZXJ0IHBlcmNlbnRhZ2VzDQpjbGVhbl9wZXJjZW50YWdlIDwtIGZ1bmN0aW9uKGNvbHVtbikgew0KICBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sdW1uKSkNCn0NCg0KIyBEZWZpbmUgdGhlIHN0YXRpc3RpYyBuYW1lcyBmb3IgdGhlIHN1bW1hcnkgdGFibGUNCnN0YXRpc3RpY19uYW1lcyA8LSBjKA0KICAiQ291bnQgb2YgT2JzZXJ2YXRpb25zIiwgDQogICJNZWFuIiwgDQogICJNZWRpYW4iLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiLA0KICAiTWluaW11bSIsIA0KICAiTWF4aW11bSIsIA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0Ig0KKQ0KDQojIEFkanVzdCB0aGUgZmlyc3Qgcm93J3MgRGF0ZSBhbmQgY2xlYW4gdXAgQ0FHUiBjb2x1bW5zDQpucnQkYmxhY2tyb2NrX3Jhd19jYWdyIDwtIG5ydCRibGFja3JvY2tfcmF3X2NhZ3IgJT4lDQogIHNsaWNlKC0xKSAlPiUgIyBSZW1vdmUgdGhlIGZpcnN0IHJvdw0KICBtdXRhdGUoDQogICAgIyBEYXRlID0gaWZlbHNlKHJvd19udW1iZXIoKSA9PSAxLCAiMjAyNS0wMS0wMSIsIERhdGUpLA0KICAgIERhdGUgPSBhcy5udW1lcmljKGZvcm1hdChhcy5EYXRlKERhdGUpLCAiJVkiKSksDQogICAgYDEtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDEtWWVhciBDQUdSYCksDQogICAgYDUtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDUtWWVhciBDQUdSYCksDQogICAgYDEwLVllYXIgQ0FHUmAgPSBjbGVhbl9wZXJjZW50YWdlKGAxMC1ZZWFyIENBR1JgKSwNCiAgICBgMjAtWWVhciBDQUdSYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYDIwLVllYXIgQ0FHUmApLA0KICAgIGAzMC1ZZWFyIENBR1JgID0gY2xlYW5fcGVyY2VudGFnZShgMzAtWWVhciBDQUdSYCkNCiAgKQ0KDQojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBzdGF0aXN0aWNzIGZvciBhIGdpdmVuIGRhdGFzZXQNCmNhbGNfc3RhdHMgPC0gZnVuY3Rpb24oZGF0YSkgew0KICBpZiAoc3VtKCFpcy5uYShkYXRhKSkgPCAyKSByZXR1cm4ocmVwKE5BLCBsZW5ndGgoc3RhdGlzdGljX25hbWVzKSkpICAjIEhhbmRsZSBpbnN1ZmZpY2llbnQgZGF0YQ0KDQogIGNvdW50X29ic2VydmF0aW9ucyA8LSBzdW0oIWlzLm5hKGRhdGEpKQ0KICBtZWFuX3ZhbHVlIDwtIHJvdW5kKG1lYW4oZGF0YSwgbmEucm0gPSBUUlVFKSwgMikNCiAgbWVkaWFuX3ZhbHVlIDwtIHJvdW5kKG1lZGlhbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBzZF92YWx1ZSA8LSByb3VuZChzZChkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtaW5fY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlIC0gc2RfdmFsdWUsIDIpDQogIG1heF9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgKyBzZF92YWx1ZSwgMikNCiAgbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihkYXRhLCBuYS5ybSA9IFRSVUUpLCAyKQ0KICBtYXhfdmFsdWUgPC0gcm91bmQobWF4KGRhdGEsIG5hLnJtID0gVFJVRSksIDIpDQogIA0KICAjIERlZmluZSBpbmZsYXRpb24gYW5kIGdyb3d0aCB0YXJnZXRzDQogIHRhcmdldF9pbmZsYXRpb24gPC0gMiAgIyBFeGFtcGxlIHRhcmdldCBmb3IgaW5mbGF0aW9uDQogIHRhcmdldF9jb25zZXJ2YXRpdmUgPC0gMyArIHRhcmdldF9pbmZsYXRpb24NCiAgdGFyZ2V0X21vZGVyYXRlIDwtIDUgKyB0YXJnZXRfaW5mbGF0aW9uDQogIHRhcmdldF9hZ2dyZXNzaXZlIDwtIDEwICsgdGFyZ2V0X2luZmxhdGlvbg0KICANCiAgYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0oZGF0YSA+PSB0YXJnZXRfaW5mbGF0aW9uLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbmEucm0gPSBUUlVFKQ0KICBhYm92ZV90YXJnZXRfbW9kZXJhdGUgPC0gc3VtKGRhdGEgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQogIGFib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShkYXRhID49IHRhcmdldF9hZ2dyZXNzaXZlLCBuYS5ybSA9IFRSVUUpDQogIA0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKGFib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gPC0gcm91bmQoKGFib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICBwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X21vZGVyYXRlIC8gY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCiAgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgoYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgLyBjb3VudF9vYnNlcnZhdGlvbnMpICogMTAwLCAyKQ0KICANCiAgYygNCiAgICBjb3VudF9vYnNlcnZhdGlvbnMsIA0KICAgIHBhc3RlMChtZWFuX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtZWRpYW5fdmFsdWUsICIlIiksDQogICAgcGFzdGUwKHNkX3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChtaW5fY2Fncl9yYW5nZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X2NhZ3JfcmFuZ2UsICIlIiksDQogICAgcGFzdGUwKG1pbl92YWx1ZSwgIiUiKSwNCiAgICBwYXN0ZTAobWF4X3ZhbHVlLCAiJSIpLA0KICAgIHBhc3RlMChwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24sICIlIiksDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgIiUiKSwgDQogICAgcGFzdGUwKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLCANCiAgICBwYXN0ZTAocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSwgIiUiKQ0KICApDQp9DQoNCiMgQ29sdW1ucyB0byBjYWxjdWxhdGUgQ0FHUiBzdGF0aXN0aWNzDQpjYWdyX2NvbHVtbnMgPC0gYygiMS1ZZWFyIENBR1IiLCAiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIiwgIjIwLVllYXIgQ0FHUiIsICIzMC1ZZWFyIENBR1IiKQ0KZXhpc3RpbmdfY2Fncl9jb2x1bW5zIDwtIGludGVyc2VjdChjYWdyX2NvbHVtbnMsIG5hbWVzKG5ydCRibGFja3JvY2tfcmF3X2NhZ3IpKQ0KDQojIENhbGN1bGF0ZSBzdGF0cyBmb3IgZWFjaCBDQUdSIGNvbHVtbg0KY2Fncl9zdGF0c19saXN0IDwtIGxhcHBseShucnQkYmxhY2tyb2NrX3Jhd19jYWdyW2V4aXN0aW5nX2NhZ3JfY29sdW1uc10sIGNhbGNfc3RhdHMpDQoNCiMgQ29tcGlsZSBpbnRvIGEgc3VtbWFyeSBkYXRhIGZyYW1lDQpibGFja3JvY2tfcmF3X2NhZ3Jfc3VtbWFyeSA8LSBhcy5kYXRhLmZyYW1lKGRvLmNhbGwoY2JpbmQsIGNhZ3Jfc3RhdHNfbGlzdCkpDQpyb3duYW1lcyhibGFja3JvY2tfcmF3X2NhZ3Jfc3VtbWFyeSkgPC0gc3RhdGlzdGljX25hbWVzDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFNBVkUgVkFMVUVTIEZPUiBJTi1MSU5FIENPREUNCg0KIyBEZWZpbmUgdGhlIG1hcHBpbmcgb2Ygcm93IG5hbWVzIHRvIHZhcmlhYmxlIG5hbWVzDQpyb3dfdG9fdmFyX25hbWUgPC0gYygNCiAgIkNvdW50IG9mIE9ic2VydmF0aW9ucyIgPSAiY291bnRfb2JzZXJ2YXRpb25zIiwNCiAgIk1lYW4iID0gIm1lYW5fdmFsdWUiLA0KICAiTWVkaWFuIiA9ICJtZWRpYW5fdmFsdWUiLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIgPSAic2RfdmFsdWUiLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiID0gIm1pbl9jYWdyX3JhbmdlIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiA9ICJtYXhfY2Fncl9yYW5nZSIsDQogICJNaW5pbXVtIiA9ICJtaW5fdmFsdWUiLA0KICAiTWF4aW11bSIgPSAibWF4X3ZhbHVlIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIiwNCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIg0KKQ0KDQojIEZ1bmN0aW9uIHRvIHNhdmUgc3VtbWFyeSB2YWx1ZXMgZHluYW1pY2FsbHkNCnNhdmVfY29sdW1uX3ZhbHVlcyA8LSBmdW5jdGlvbihzdW1tYXJ5X2RmKSB7DQogICMgRXhjbHVkZSB0aGUgIlN0YXRpc3RpYyIgYW5kICJPdmVyYWxsIiBjb2x1bW5zDQogIGNvbHVtbnNfdG9fc2F2ZSA8LSBzZXRkaWZmKG5hbWVzKHN1bW1hcnlfZGYpLCBjKCJTdGF0aXN0aWMiLCAiT3ZlcmFsbCIpKQ0KICANCiAgIyBJdGVyYXRlIG92ZXIgZWFjaCBjb2x1bW4NCiAgZm9yIChjb2wgaW4gY29sdW1uc190b19zYXZlKSB7DQogICAgIyBGb3JtYXQgY29sdW1uIG5hbWUgdG8gbG93ZXJjYXNlIGFuZCByZXBsYWNlIGludmFsaWQgY2hhcmFjdGVycw0KICAgIGNvbF9uYW1lIDwtIHRvbG93ZXIoZ3N1YigiW15hLXpBLVowLTldIiwgIl8iLCBjb2wpKQ0KICAgIA0KICAgICMgRXh0cmFjdCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IGNvbHVtbg0KICAgIGNvbF92YWx1ZXMgPC0gc3VtbWFyeV9kZltbY29sXV0NCiAgICANCiAgICAjIFNhdmUgZWFjaCB2YWx1ZSBkeW5hbWljYWxseSB1c2luZyB0aGUgbWFwcGluZyBmb3Igcm93IG5hbWVzDQogICAgZm9yIChpIGluIHNlcV9hbG9uZyhjb2xfdmFsdWVzKSkgew0KICAgICAgIyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgbmFtZSBmcm9tIHRoZSBtYXBwaW5nDQogICAgICBzdGF0X25hbWUgPC0gcm93X3RvX3Zhcl9uYW1lW3Jvd25hbWVzKHN1bW1hcnlfZGYpW2ldXQ0KICAgICAgDQogICAgICBpZiAoIWlzLm5hKHN0YXRfbmFtZSkpIHsgICMgU2tpcCBpZiBubyBtYXBwaW5nIGlzIGRlZmluZWQNCiAgICAgICAgIyBDcmVhdGUgdGhlIHZhcmlhYmxlIG5hbWUNCiAgICAgICAgdmFyX25hbWUgPC0gcGFzdGUwKHN0YXRfbmFtZSwgIl8iLCBjb2xfbmFtZSkNCiAgICAgICAgDQogICAgICAgICMgQXR0ZW1wdCBudW1lcmljIGNvbnZlcnNpb24gZm9yIGRvd25zdHJlYW0gdXNlDQogICAgICAgIHZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGNvbF92YWx1ZXNbaV0pKSkNCiAgICAgICAgDQogICAgICAgICMgQXNzaWduIHRoZSB2YWx1ZSB0byB0aGUgZ2xvYmFsIGVudmlyb25tZW50DQogICAgICAgIGFzc2lnbih2YXJfbmFtZSwgdmFsdWUsIGVudmlyID0gLkdsb2JhbEVudikNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KIyBBcHBseSB0aGUgZnVuY3Rpb24gdG8gc2F2ZSB2YWx1ZXMgZm9yIGFsbCBjb2x1bW5zIGV4Y2VwdCAiT3ZlcmFsbCINCnNhdmVfY29sdW1uX3ZhbHVlcyhibGFja3JvY2tfcmF3X2NhZ3Jfc3VtbWFyeSkNCg0KIyBFeGFtcGxlOiBBY2Nlc3NpbmcgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZXMNCmludGVyYWN0aXZlX3ByaW50KG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgbWVhbiB2YWx1ZSBmb3IgMS1ZZWFyIENBR1INCmludGVyYWN0aXZlX3ByaW50KHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbl81X3llYXJfY2FncikgICMgU2hvdWxkIHByaW50IHRoZSBwZXJjZW50IGFib3ZlIGluZmxhdGlvbiB0YXJnZXQgZm9yIDUtWWVhciBDQUdSDQppbnRlcmFjdGl2ZV9wcmludChzZF92YWx1ZV8xMF95ZWFyX2NhZ3IpICAjIFNob3VsZCBwcmludCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciAxMC1ZZWFyIENBR1INCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIE9WRVJBTEwgU1RBVElTVElDUyANCm51bWVyaWNfdmFsdWVzX2FsbCA8LSBhcy5udW1lcmljKHVubGlzdChucnQkYmxhY2tyb2NrX3Jhd19jYWdyW2V4aXN0aW5nX2NhZ3JfY29sdW1uc10sIHVzZS5uYW1lcyA9IEZBTFNFKSkNCm51bWVyaWNfdmFsdWVzX2FsbCA8LSBudW1lcmljX3ZhbHVlc19hbGxbIWlzLm5hKG51bWVyaWNfdmFsdWVzX2FsbCldDQoNCm92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zIDwtIGxlbmd0aChudW1lcmljX3ZhbHVlc19hbGwpDQpvdmVyYWxsX21lYW5fdmFsdWUgPC0gcm91bmQobWVhbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9tZWRpYW5fdmFsdWUgPC0gcm91bmQobWVkaWFuKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX3NkX3ZhbHVlIDwtIHJvdW5kKHNkKG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQpvdmVyYWxsX21pbl9jYWdyX3JhbmdlIDwtIHJvdW5kKGNhZ3JfdmFsdWUgLSBvdmVyYWxsX3NkX3ZhbHVlLCAyKQ0Kb3ZlcmFsbF9tYXhfY2Fncl9yYW5nZSA8LSByb3VuZChjYWdyX3ZhbHVlICsgb3ZlcmFsbF9zZF92YWx1ZSwgMikNCm92ZXJhbGxfbWluX3ZhbHVlIDwtIHJvdW5kKG1pbihudW1lcmljX3ZhbHVlc19hbGwpLCAyKQ0Kb3ZlcmFsbF9tYXhfdmFsdWUgPC0gcm91bmQobWF4KG51bWVyaWNfdmFsdWVzX2FsbCksIDIpDQoNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9pbmZsYXRpb24sIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSA8LSBzdW0obnVtZXJpY192YWx1ZXNfYWxsID49IHRhcmdldF9jb25zZXJ2YXRpdmUsIG5hLnJtID0gVFJVRSkNCm92ZXJhbGxfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X21vZGVyYXRlLCBuYS5ybSA9IFRSVUUpDQpvdmVyYWxsX2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIDwtIHN1bShudW1lcmljX3ZhbHVlc19hbGwgPj0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIG5hLnJtID0gVFJVRSkNCg0Kb3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUgPC0gcm91bmQoKG92ZXJhbGxfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9pbmZsYXRpb24gLyBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucykgKiAxMDAsIDIpDQpvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIDwtIHJvdW5kKChvdmVyYWxsX2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCm92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSA8LSByb3VuZCgob3ZlcmFsbF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSAvIG92ZXJhbGxfY291bnRfb2JzZXJ2YXRpb25zKSAqIDEwMCwgMikNCg0KYmxhY2tyb2NrX3Jhd19jYWdyX3N1bW1hcnkkT3ZlcmFsbCA8LSBjKA0KICBvdmVyYWxsX2NvdW50X29ic2VydmF0aW9ucywNCiAgcGFzdGUwKG92ZXJhbGxfbWVhbl92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWVkaWFuX3ZhbHVlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9zZF92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfbWluX2NhZ3JfcmFuZ2UsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21heF9jYWdyX3JhbmdlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9taW5fdmFsdWUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX21heF92YWx1ZSwgIiUiKSwNCiAgcGFzdGUwKG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUsICIlIiksDQogIHBhc3RlMChvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlLCAiJSIpLA0KICBwYXN0ZTAob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlLCAiJSIpDQopDQoNCiMgQ29udmVydCByb3cgbmFtZXMgdG8gYSBjb2x1bW4NCmJsYWNrcm9ja19yYXdfY2Fncl9zdW1tYXJ5IDwtIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKGJsYWNrcm9ja19yYXdfY2Fncl9zdW1tYXJ5LCB2YXIgPSAiU3RhdGlzdGljIikNCg0KIyBFbnN1cmUgYWxsIGNvbHVtbnMgYXJlIGNoYXJhY3Rlcg0KYmxhY2tyb2NrX3Jhd19jYWdyX3N1bW1hcnkgPC0gYmxhY2tyb2NrX3Jhd19jYWdyX3N1bW1hcnkgJT4lDQogIG11dGF0ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBhcy5jaGFyYWN0ZXIpKQ0KDQojIERpc3BsYXkgdGhlIHN1bW1hcnkgdGFibGUNCmNhdCgiXG4jIyMjIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfc3RyKGJsYWNrcm9ja19yYXdfY2Fncl9zdW1tYXJ5KQ0KZm9ybWF0X3Vuc3BlY2lmaWVkX3dpZHRoKGJsYWNrcm9ja19yYXdfY2Fncl9zdW1tYXJ5KQ0KDQpgYGANCg0KKipgciBtaW5feWVhcmAtYHIgbWF4X3llYXJgIFN1bW1hcnk6KiogVGhlIDEtWWVhciBDQUdSIGV4aGliaXRzIHRoZSBgciBpZihtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyID09IG1heChjKG1lYW5fdmFsdWVfMV95ZWFyX2NhZ3IsIG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3IpKSkgImhpZ2hlc3QgbWVhbiByZXR1cm4iIGVsc2UgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA9PSBtaW4oYyhtZWFuX3ZhbHVlXzFfeWVhcl9jYWdyLCBtZWFuX3ZhbHVlXzVfeWVhcl9jYWdyKSkpICJsb3dlc3QgbWVhbiByZXR1cm4iIGVsc2UgIm1lYW4gcmV0dXJuImAgYXQgYHIgbWVhbl92YWx1ZV8xX3llYXJfY2FncmAlLCBhbmQgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWF4KGMoc2RfdmFsdWVfMV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzVfeWVhcl9jYWdyKSkpICJ0aGUgZ3JlYXRlc3Qgdm9sYXRpbGl0eSB3aXRoIGEiIGVsc2UgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPT0gbWluKGMoc2RfdmFsdWVfMV95ZWFyX2NhZ3IsIHNkX3ZhbHVlXzVfeWVhcl9jYWdyKSkpICJ0aGUgbGVhc3Qgdm9sYXRpbGl0eSB3aXRoIGEiIGVsc2UgImEiYCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYHIgc2RfdmFsdWVfMV95ZWFyX2NhZ3JgJS4gQXMgdGhlIGludmVzdG1lbnQgaG9yaXpvbiBleHRlbmRzIHRvIDUgeWVhcnMsIHRoZSBtZWFuIHJldHVybnMgYHIgaWYobWVhbl92YWx1ZV8xX3llYXJfY2FnciA8IG1lYW5fdmFsdWVfNV95ZWFyX2NhZ3IpICJpbmNyZWFzZSIgZWxzZSAiZGVjcmVhc2UiYCwgdG8gYHIgbWVhbl92YWx1ZV81X3llYXJfY2FncmAlLCB3aGlsZSB2b2xhdGlsaXR5IGByIGlmKHNkX3ZhbHVlXzFfeWVhcl9jYWdyIDwgc2RfdmFsdWVfNV95ZWFyX2NhZ3IpICJyaXNlcyIgZWxzZSAiZGltaW5pc2hlcyJgLCB3aXRoIHN0YW5kYXJkIGRldmlhdGlvbnMgYXQgYHIgc2RfdmFsdWVfNV95ZWFyX2NhZ3JgJS4gVGhpcyB0cmVuZCBpbmRpY2F0ZXMgdGhhdCBsb25nZXIgaW52ZXN0bWVudCBwZXJpb2RzIHRlbmQgdG8gb2ZmZXIgYHIgaWYoc2RfdmFsdWVfMV95ZWFyX2NhZ3IgPiBzZF92YWx1ZV81X3llYXJfY2FncikgIm1vcmUgc3RhYmxlIiBlbHNlICJsZXNzIHN0YWJsZSJgIHJldHVybnMuIEZ1cnRoZXJtb3JlLCB0aGUgcGVyY2VudGFnZSBvZiBwZXJpb2RzIGV4Y2VlZGluZyB0aGUgaW5mbGF0aW9uIHRhcmdldCBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMV95ZWFyX2NhZ3IgPCBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fNV95ZWFyX2NhZ3IpICJpbmNyZWFzZXMiIGVsc2UgImRlY3JlYXNlcyJgIHdpdGggbG9uZ2VyIGR1cmF0aW9ucywgZnJvbSBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb25fMV95ZWFyX2NhZ3JgJSBpbiB0aGUgMS1ZZWFyIENBR1IgdG8gYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzVfeWVhcl9jYWdyYCUgaW4gdGhlIDUtWWVhciBDQUdSLCB1bmRlcnNjb3JpbmcgQmxhY2tSb2NrJ3MgYHIgaWYocGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzFfeWVhcl9jYWdyIDwgcGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uXzVfeWVhcl9jYWdyKSAiZWZmZWN0aXZlbmVzcyIgZWxzZSAiaW5lZmZlY3RpdmVuZXNzImAgYXMgYSBoZWRnZSBhZ2FpbnN0IGluZmxhdGlvbiBvdmVyIGV4dGVuZGVkIHRpbWVmcmFtZXMuIFdpdGggYW4gb3ZlcmFsbCBwZXJjZW50YWdlIG9mIGByIG92ZXJhbGxfcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZWAlIGV4Y2VlZGluZyB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgKGByIHRhcmdldF9hZ2dyZXNzaXZlIC0gdGFyZ2V0X2luZmxhdGlvbmAlIGFubnVhbGl6ZWQgcmV0dXJucyksIEJsYWNrUm9jayBgciBpZihvdmVyYWxsX3BlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUgPiA1MCkgImhhcywgb3ZlciB0aGlzIHRpbWUgcGVyaW9kLCBwcm92ZW4gdG8gYmUgYSBzdHJvbmciIGVsc2UgaWYob3ZlcmFsbF9wZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlID4gNDApICJoYXMsIG92ZXIgdGhpcyB0aW1lIHBlcmlvZCwgZGVtb25zdHJhdGVkIGl0c2VsZiBhcyBhIHZpYWJsZSIgZWxzZSAiYXBwZWFycywgb3ZlciB0aGlzIHRpbWUgcGVyaW9kLCB0byBiZSBhIGxlc3Mgc3VpdGFibGUiYCBvcHRpb24gZm9yIGEgaGlnaC1yZXR1cm5pbmcgbG9uZy10ZXJtIGludmVzdG1lbnQuDQoNCiMjIyBHcmFwaA0KDQojIyMjIEFsbCBQZXJpb2RzDQoNCmBgYHtyIG5ydCRibGFja3JvY2tfcmF3X2NhZ3JfZ3JhcGhzX2FsbCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBDb21wb3VuZCBBdmVyYWdlIEdyb3d0aCBSYXRlcyBBY3Jvc3MgUGVyaW9kcyBcbiIpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KbnJ0JGJsYWNrcm9ja19yYXdfY2FnciA8LSBucnQkYmxhY2tyb2NrX3Jhd19jYWdyICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgMS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAxLVllYXIgQ0FHUmApKSwNCiAgICBgNS1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGA1LVllYXIgQ0FHUmApKSwNCiAgICBgMTAtWWVhciBDQUdSYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgMTAtWWVhciBDQUdSYCkpLA0KICAgIGAyMC1ZZWFyIENBR1JgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGAyMC1ZZWFyIENBR1JgKSksDQogICAgYDMwLVllYXIgQ0FHUmAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYDMwLVllYXIgQ0FHUmApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gbnJ0JGJsYWNrcm9ja19yYXdfY2FnciAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGAxLVllYXIgQ0FHUmAsIGA1LVllYXIgQ0FHUmAsIGAxMC1ZZWFyIENBR1JgLCBgMjAtWWVhciBDQUdSYCwgYDMwLVllYXIgQ0FHUmApLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQ0FHUl9QZXJpb2QiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkNBR1JfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKENBR1JfUGVyaW9kID0gZmFjdG9yKENBR1JfUGVyaW9kLCBsZXZlbHMgPSBjKCIxLVllYXIgQ0FHUiIsICI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiLCAiMjAtWWVhciBDQUdSIiwgIjMwLVllYXIgQ0FHUiIpKSkNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBDQUdSX1BlcmlvZCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBDQUdSX1BlcmlvZCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQ0FHUl9QZXJpb2QpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihucnQkYmxhY2tyb2NrX3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihucnQkYmxhY2tyb2NrX3Jhd19jYWdyJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihucnQkYmxhY2tyb2NrX3Jhd19jYWdyJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChucnQkYmxhY2tyb2NrX3Jhd19jYWdyJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDE4DQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDIpICogMiAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gMikgKiAyICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJSb2xsaW5nIENBR1JzIEFjcm9zcyBQZXJpb2RzIE92ZXIgIix5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJCbGFja1JvY2sgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQWNyb3NzIFJvbGxpbmcgUGVyaW9kcywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KG5ydF9sb25nLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBDQUdSX1ZhbHVlLCBjb2xvciA9IENBR1JfUGVyaW9kKSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAxMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDEpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAxMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIENBR1IgUGVyaW9kDQogIGdlb21fbGluZShzaXplID0gMS4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAxLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCiAgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY2Fncl92YWx1ZSwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNTAsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSArMS4xMCwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IGNhZ3JfdmFsdWUsIGxhYmVsID0gIkNBR1IiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsgDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJDQUdSIFBlcmlvZCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBDQUdSIFBlcmlvZA0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgMikpICsgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDEpDQoNCg0KYGBgDQoNCiMgQ09NUEFSSVNPTiBPRiBJTkRFWEVTDQoNCiMjIEFubnVhbCBHUg0KDQojIyMgRGF0YQ0KDQpgYGB7ciBpbmRleF9jb21wYXJpc29uX2dyLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmludGVyYWN0aXZlX3N0cihucnQkc3A1MDBfcmF3KQ0KaW50ZXJhY3RpdmVfc3RyKG5ydCRxcXFfcmF3KQ0KaW50ZXJhY3RpdmVfc3RyKG5ydCRibGFja3JvY2tfcmF3KQ0KDQppbnRlcmFjdGl2ZV9wcmludChucnQkc3A1MDBfcmF3KQ0KaW50ZXJhY3RpdmVfcHJpbnQobnJ0JHFxcV9yYXcpDQppbnRlcmFjdGl2ZV9wcmludChucnQkYmxhY2tyb2NrX3JhdykNCg0KbWluX3llYXIgPC0gbWluKG5ydCRzcDUwMF9yYXckRGF0ZSkNCm1heF95ZWFyIDwtIG1heChucnQkc3A1MDBfcmF3JERhdGUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQptaW5feWVhciA8LSBtaW4obnJ0JHFxcV9yYXckRGF0ZSkNCm1heF95ZWFyIDwtIG1heChucnQkcXFxX3JhdyREYXRlKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KbWluX3llYXIgPC0gbWluKG5ydCRibGFja3JvY2tfcmF3JERhdGUpDQptYXhfeWVhciA8LSBtYXgobnJ0JGJsYWNrcm9ja19yYXckRGF0ZSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgRmlsdGVyIGRhdGEgZm9yIHRoZSBtYXRjaGluZyBkYXRlIHJhbmdlDQptYXRjaGluZ19kYXRlcyA8LSBSZWR1Y2UoaW50ZXJzZWN0LCBsaXN0KG5ydCRxcXFfcmF3JERhdGUsIG5ydCRxcXFfcmF3JERhdGUsIG5ydCRibGFja3JvY2tfcmF3JERhdGUpKQ0KIyBHZXQgdGhlIG9sZGVzdCBtYXRjaGluZyBkYXRlDQppZiAobGVuZ3RoKG1hdGNoaW5nX2RhdGVzKSA+IDApIHsNCiAgb2xkZXN0X21hdGNoaW5nX2RhdGUgPC0gbWluKG1hdGNoaW5nX2RhdGVzKQ0KICBpbnRlcmFjdGl2ZV9jYXQoIk9sZGVzdCBtYXRjaGluZyBkYXRlOiIsIG9sZGVzdF9tYXRjaGluZ19kYXRlLCAiXG4iKQ0KfSBlbHNlIHsNCiAgaW50ZXJhY3RpdmVfY2F0KCJObyBtYXRjaGluZyBkYXRlcyBmb3VuZCBhbW9uZyB0aGUgdGhyZWUgZGF0YXNldHMuXG4iKQ0KfQ0KDQpzdGFydF95ZWFyIDwtIG9sZGVzdF9tYXRjaGluZ19kYXRlICsgMQ0KIyBlbmRfeWVhciA8LSAyMDI1DQplbmRfeWVhciA8LSBhcy5udW1lcmljKGZvcm1hdChTeXMuRGF0ZSgpLCAiJVkiKSkNCg0Kc3A1MDBfZmlsdGVyZWQgPC0gc3Vic2V0KG5ydCRzcDUwMF9yYXcsIERhdGUgPj0gc3RhcnRfeWVhciAmIERhdGUgPD0gZW5kX3llYXIsIHNlbGVjdCA9IGMoRGF0ZSwgYDEtWWVhciBDQUdSYCkpDQpxcXFfZmlsdGVyZWQgPC0gc3Vic2V0KG5ydCRxcXFfcmF3LCBEYXRlID49IHN0YXJ0X3llYXIgJiBEYXRlIDw9IGVuZF95ZWFyLCBzZWxlY3QgPSBjKERhdGUsIGAxLVllYXIgQ0FHUmApKQ0KYmxhY2tyb2NrX2ZpbHRlcmVkIDwtIHN1YnNldChucnQkYmxhY2tyb2NrX3JhdywgRGF0ZSA+PSBzdGFydF95ZWFyICYgRGF0ZSA8PSBlbmRfeWVhciwgc2VsZWN0ID0gYyhEYXRlLCBgMS1ZZWFyIENBR1JgKSkNCg0KIyBSZW5hbWUgY29sdW1ucyBmb3IgY2xhcml0eQ0KY29sbmFtZXMoc3A1MDBfZmlsdGVyZWQpW2NvbG5hbWVzKHNwNTAwX2ZpbHRlcmVkKSA9PSAiMS1ZZWFyIENBR1IiXSA8LSAiUyZQIDUwMCINCmNvbG5hbWVzKHFxcV9maWx0ZXJlZClbY29sbmFtZXMocXFxX2ZpbHRlcmVkKSA9PSAiMS1ZZWFyIENBR1IiXSA8LSAiUVFRIg0KY29sbmFtZXMoYmxhY2tyb2NrX2ZpbHRlcmVkKVtjb2xuYW1lcyhibGFja3JvY2tfZmlsdGVyZWQpID09ICIxLVllYXIgQ0FHUiJdIDwtICJCbGFja1JvY2siDQoNCiMgTWVyZ2UgZGF0YXNldHMgYnkgRGF0ZSAoWWVhcikNCm1lcmdlZF9kYXRhIDwtIG1lcmdlKHNwNTAwX2ZpbHRlcmVkLCBxcXFfZmlsdGVyZWQsIGJ5ID0gIkRhdGUiKQ0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2UobWVyZ2VkX2RhdGEsIGJsYWNrcm9ja19maWx0ZXJlZCwgYnkgPSAiRGF0ZSIpDQoNCiMgU29ydCBieSBEYXRlIGluIGRlc2NlbmRpbmcgb3JkZXIgKG1vc3QgcmVjZW50IHllYXIgZmlyc3QpDQptZXJnZWRfZGF0YSA8LSBtZXJnZWRfZGF0YVtvcmRlcigtbWVyZ2VkX2RhdGEkRGF0ZSksIF0NCg0KIyBGb3JtYXQgdGhlIG1lcmdlZCBkYXRhDQptZXJnZWRfZGF0YSREYXRlIDwtIGFzLmNoYXJhY3RlcihtZXJnZWRfZGF0YSREYXRlKSAgIyBFbnN1cmUgRGF0ZSBpcyBhIGNoYXJhY3RlciB3aXRob3V0IGNvbW1hcw0KbWVyZ2VkX2RhdGEkYFMmUCA1MDBgIDwtIHBhc3RlMChmb3JtYXRDKG1lcmdlZF9kYXRhJGBTJlAgNTAwYCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKQ0KbWVyZ2VkX2RhdGEkUVFRIDwtIHBhc3RlMChmb3JtYXRDKG1lcmdlZF9kYXRhJFFRUSwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKQ0KbWVyZ2VkX2RhdGEkYEJsYWNrUm9ja2AgPC0gcGFzdGUwKGZvcm1hdEMobWVyZ2VkX2RhdGEkYEJsYWNrUm9ja2AsIGZvcm1hdCA9ICJmIiwgZGlnaXRzID0gMiksICIlIikNCg0KIyBEaXNwbGF5IGZvcm1hdHRlZCB0YWJsZQ0KY2F0KCJcblxuIyMjIyBBbm51YWwgR3Jvd3RoIFJhdGVzIEJ5IEluZGV4ICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQppbnRlcmFjdGl2ZV9wcmludChtZXJnZWRfZGF0YSkNCmludGVyYWN0aXZlX3N0cihtZXJnZWRfZGF0YSkNCmZvcm1hdF9lcXVhbF93aWR0aChtZXJnZWRfZGF0YSkNCg0KDQpgYGANCg0KRGF0YSBiZWdpbnMgd2l0aCBgciBzdGFydF95ZWFyYCwgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggd2l0aCB0aGUgbGVhc3QgaGlzdG9yaWNhbCBkYXRhIGZvciBjb25zaXN0ZW50IGNvbXBhcmlzb24gYWNyb3NzIGFsbCBpbmRleGVzLg0KDQojIyMgU3VtbWFyeQ0KDQpgYGB7ciBpbmRleF9jb21wYXJpc29uX2dyX3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJ5DQpsaWJyYXJ5KGRwbHlyKQ0KDQojIFJlbW92ZSBwZXJjZW50YWdlIHNpZ25zIGFuZCBjb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYw0KbWVyZ2VkX2RhdGFfY2xlYW4gPC0gbWVyZ2VkX2RhdGENCm1lcmdlZF9kYXRhX2NsZWFuWzI6NF0gPC0gbGFwcGx5KG1lcmdlZF9kYXRhWzI6NF0sIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCB4KSkpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4obWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgRGVmaW5lIHRoZSBtZXRyaWNzIHRvIGNhbGN1bGF0ZSwgaW5jbHVkaW5nIENBR1INCm1ldHJpY3MgPC0gYygNCiAgIkNBR1IiLCANCiAgIk1lYW4iLCANCiAgIk1lZGlhbiIsIA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLCANCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiwgDQogICJNaW4iLCANCiAgIk1heCIsIA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0Ig0KKQ0KDQojIERlZmluZSB0aGUgQ0FHUiBjYWxjdWxhdGlvbg0KY2FsY3VsYXRlX2NhZ3IgPC0gZnVuY3Rpb24oY29sKSB7DQogIHN0YXJ0X3ZhbCA8LSAxICAjIEZpcnN0IHllYXIgdmFsdWUNCiAgZW5kX3ZhbCA8LSBwcm9kKDEgKyBjb2wgLyAxMDAsIG5hLnJtID0gVFJVRSkgICMgUHJvZHVjdCBvZiBncm93dGggZmFjdG9ycw0KICB5ZWFycyA8LSBucm93KG1lcmdlZF9kYXRhX2NsZWFuKQ0KICAoKGVuZF92YWwgLyBzdGFydF92YWwpXigxIC8geWVhcnMpIC0gMSkgKiAxMDAgICMgQ0FHUiBmb3JtdWxhDQp9DQoNCiMgQ2FsY3VsYXRlIG1ldHJpY3MgZHluYW1pY2FsbHkgZm9yIGFsbCBudW1lcmljIGNvbHVtbnMNCmNhbGN1bGF0ZWRfbWV0cmljcyA8LSBzYXBwbHkobWVyZ2VkX2RhdGFfY2xlYW5bMjo0XSwgZnVuY3Rpb24oY29sKSB7DQogIG1lYW5fdmFsIDwtIG1lYW4oY29sLCBuYS5ybSA9IFRSVUUpDQogIHNkX3ZhbCA8LSBzZChjb2wsIG5hLnJtID0gVFJVRSkNCiAgcGVyY2VudF9hYm92ZSA8LSBmdW5jdGlvbih0YXJnZXQpIG1lYW4oY29sID4gdGFyZ2V0LCBuYS5ybSA9IFRSVUUpICogMTAwDQogIA0KICBjKA0KICAgIGBDQUdSYCA9IGNhbGN1bGF0ZV9jYWdyKGNvbCksDQogICAgTWVhbiA9IG1lYW5fdmFsLA0KICAgIE1lZGlhbiA9IG1lZGlhbihjb2wsIG5hLnJtID0gVFJVRSksDQogICAgYFN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSlgID0gc2RfdmFsLA0KICAgIGBNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKWAgPSBtZWFuX3ZhbCAtIHNkX3ZhbCwNCiAgICBgTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRClgID0gbWVhbl92YWwgKyBzZF92YWwsDQogICAgTWluID0gbWluKGNvbCwgbmEucm0gPSBUUlVFKSwNCiAgICBNYXggPSBtYXgoY29sLCBuYS5ybSA9IFRSVUUpLA0KICAgIGBQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXRgID0gcGVyY2VudF9hYm92ZSh0YXJnZXRfaW5mbGF0aW9uKSwgICMgRXhhbXBsZSBpbmZsYXRpb24gdGFyZ2V0OiAyJQ0KICAgIGBQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXRgID0gcGVyY2VudF9hYm92ZSh0YXJnZXRfY29uc2VydmF0aXZlKSwNCiAgICBgUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXRgID0gcGVyY2VudF9hYm92ZSh0YXJnZXRfbW9kZXJhdGUpLA0KICAgIGBQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X2FnZ3Jlc3NpdmUpDQogICkNCn0pDQoNCiMgVHJhbnNwb3NlIHRoZSByZXN1bHQgYW5kIGFkZCB0aGUgTWV0cmljIGNvbHVtbg0KY3VzdG9tX3N1bW1hcnkgPC0gZGF0YS5mcmFtZSgNCiAgTWV0cmljID0gbWV0cmljcywNCiAgY2FsY3VsYXRlZF9tZXRyaWNzDQopDQoNCiMgUmVuYW1lIGNvbHVtbnMgdG8gcmV0YWluIHRoZSBvcmlnaW5hbCBjb2x1bW4gbmFtZXMgZHluYW1pY2FsbHkNCmNvbG5hbWVzKGN1c3RvbV9zdW1tYXJ5KVstMV0gPC0gY29sbmFtZXMobWVyZ2VkX2RhdGEpWzI6NF0NCg0KIyBBZGQgcGVyY2VudGFnZSBzaWducyBiYWNrIHRvIGFsbCBudW1lcmljIHZhbHVlcw0KY3VzdG9tX3N1bW1hcnlbLTFdIDwtIGxhcHBseShjdXN0b21fc3VtbWFyeVstMV0sIGZ1bmN0aW9uKHgpIHBhc3RlMChmb3JtYXRDKHgsIGZvcm1hdCA9ICJmIiwgZGlnaXRzID0gMiksICIlIikpDQoNCiMgUmVtb3ZlIHJvdyBuYW1lcw0Kcm93bmFtZXMoY3VzdG9tX3N1bW1hcnkpIDwtIE5VTEwNCg0KIyBQcmludCB0aGUgZmluYWwgc3VtbWFyeQ0KIyBEaXNwbGF5IGZvcm1hdHRlZCB0YWJsZQ0KY2F0KCJcblxuIyMjIyBBbm51YWwgR3Jvd3RoIFJhdGVzIFN1bW1hcnkgQnkgSW5kZXggKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmludGVyYWN0aXZlX3ByaW50KGN1c3RvbV9zdW1tYXJ5KQ0KZm9ybWF0XzRjb2xfY3VzdG9tX3dpZHRocyhjdXN0b21fc3VtbWFyeSwgY29sMV93aWR0aCA9ICIyMGVtIiwgY29sMl93aWR0aCA9ICIxNWVtIiwgY29sM193aWR0aCA9ICIxNWVtIiwgY29sNF93aWR0aCA9ICIxNWVtIikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFNBVkUgVkFMVUVTIEZPUiBJTi1MSU5FIENPREUNCg0KDQojIERlZmluZSB0aGUgbWFwcGluZyBvZiByb3cgbmFtZXMgdG8gdmFyaWFibGUgbmFtZXMNCnJvd190b192YXJfbmFtZSA8LSBjKA0KICAiQ0FHUiIgPSAiY2Fncl92YWx1ZSIsDQogICJNZWFuIiA9ICJtZWFuX3ZhbHVlIiwNCiAgIk1lZGlhbiIgPSAibWVkaWFuX3ZhbHVlIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiID0gInNkX3ZhbHVlIiwNCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiA9ICJtaW5fY2Fncl9yYW5nZSIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIgPSAibWF4X2NhZ3JfcmFuZ2UiLA0KICAiTWluIiA9ICJtaW5fdmFsdWUiLA0KICAiTWF4IiA9ICJtYXhfdmFsdWUiLA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24iLA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUiLA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIiwNCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUiDQopDQoNCiMgRGVmaW5lIGEgY3VzdG9tIG1hcHBpbmcgZm9yIGNvbHVtbiBuYW1lcw0KY29sdW1uX25hbWVfbWFwcGluZyA8LSBjKA0KICAiUyZQIDUwMCIgPSAic3A1MDAiLA0KICAiUVFRIiA9ICJxcXEiLA0KICAiQmxhY2tSb2NrIiA9ICJibGFja3JvY2siDQopDQoNCiMgRnVuY3Rpb24gdG8gc2F2ZSBzdW1tYXJ5IHZhbHVlcyBkeW5hbWljYWxseSB3aXRoIGNvbHVtbiBuYW1lIG1hcHBpbmcNCnNhdmVfY29sdW1uX3ZhbHVlcyA8LSBmdW5jdGlvbihzdW1tYXJ5X2RmLCByb3dfbWFwcGluZywgY29sdW1uX21hcHBpbmcpIHsNCiAgIyBHZXQgdGhlIGNvbHVtbiBuYW1lcyBpbiB0aGUgZGF0YSBmcmFtZQ0KICBjb2x1bW5zX3RvX3NhdmUgPC0gc2V0ZGlmZihuYW1lcyhzdW1tYXJ5X2RmKSwgYygiTWV0cmljIikpICAjIEV4Y2x1ZGUgdGhlIE1ldHJpYyBjb2x1bW4NCiAgDQogICMgSXRlcmF0ZSBvdmVyIGVhY2ggY29sdW1uDQogIGZvciAoY29sIGluIGNvbHVtbnNfdG9fc2F2ZSkgew0KICAgICMgVXNlIHRoZSBjdXN0b20gbWFwcGluZyB0byBnZXQgdGhlIGFwcHJvcHJpYXRlIGNvbHVtbiBuYW1lDQogICAgY29sX25hbWUgPC0gY29sdW1uX21hcHBpbmdbW2NvbF1dICV8fCUgdG9sb3dlcihnc3ViKCJbXmEtekEtWjAtOV0iLCAiXyIsIGNvbCkpDQogICAgDQogICAgIyBFeHRyYWN0IHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgY29sdW1uDQogICAgY29sX3ZhbHVlcyA8LSBzdW1tYXJ5X2RmW1tjb2xdXQ0KICAgIA0KICAgICMgSXRlcmF0ZSBvdmVyIHJvd3MgdG8gc2F2ZSBlYWNoIHZhbHVlIGR5bmFtaWNhbGx5DQogICAgZm9yIChpIGluIHNlcV9hbG9uZyhjb2xfdmFsdWVzKSkgew0KICAgICAgIyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgbmFtZSBmcm9tIHRoZSBtYXBwaW5nDQogICAgICBzdGF0X25hbWUgPC0gcm93X21hcHBpbmdbc3VtbWFyeV9kZiRNZXRyaWNbaV1dDQogICAgICANCiAgICAgIGlmICghaXMubmEoc3RhdF9uYW1lKSkgeyAgIyBTa2lwIGlmIG5vIG1hcHBpbmcgaXMgZGVmaW5lZA0KICAgICAgICAjIENyZWF0ZSB0aGUgdmFyaWFibGUgbmFtZQ0KICAgICAgICB2YXJfbmFtZSA8LSBwYXN0ZTAoc3RhdF9uYW1lLCAiXyIsIGNvbF9uYW1lKQ0KICAgICAgICANCiAgICAgICAgIyBBdHRlbXB0IG51bWVyaWMgY29udmVyc2lvbiBmb3IgZG93bnN0cmVhbSB1c2UNCiAgICAgICAgdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sX3ZhbHVlc1tpXSkpKQ0KICAgICAgICANCiAgICAgICAgIyBBc3NpZ24gdGhlIHZhbHVlIHRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQNCiAgICAgICAgYXNzaWduKHZhcl9uYW1lLCB2YWx1ZSwgZW52aXIgPSAuR2xvYmFsRW52KQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQojIEFwcGx5IHRoZSBmdW5jdGlvbiB0byBzYXZlIHZhbHVlcyBkeW5hbWljYWxseQ0Kc2F2ZV9jb2x1bW5fdmFsdWVzKGN1c3RvbV9zdW1tYXJ5LCByb3dfdG9fdmFyX25hbWUsIGNvbHVtbl9uYW1lX21hcHBpbmcpDQoNCiMgRXhhbXBsZTogQWNjZXNzaW5nIGR5bmFtaWNhbGx5IGNyZWF0ZWQgdmFyaWFibGVzDQppbnRlcmFjdGl2ZV9wcmludChtZWFuX3ZhbHVlX3NwNTAwKSAgIyBTaG91bGQgcHJpbnQgdGhlIG1lYW4gdmFsdWUgZm9yIFMmUCA1MDANCmludGVyYWN0aXZlX3ByaW50KHNkX3ZhbHVlX2JsYWNrcm9jaykgICMgU2hvdWxkIHByaW50IHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gZm9yIEJsYWNrUm9jaw0KaW50ZXJhY3RpdmVfcHJpbnQocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9xcXEpICAjIFNob3VsZCBwcmludCB0aGUgcGVyY2VudCBhYm92ZSBhZ2dyZXNzaXZlIHRhcmdldCBmb3IgUVFRDQppbnRlcmFjdGl2ZV9wcmludChlbmRfeWVhciAtIHN0YXJ0X3llYXIpDQoNCmBgYA0KDQoqKkNvbXBhcmlzb24gaW4gQW5udWFsIEdyb3d0aCBSYXRlcyBvZiBJbmRleGVzIChTJlAgNTAwLCBRUVEsIGFuZCBCbGFja1JvY2spIE92ZXIgYHIgZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMWAgWWVhcnMgKGByIHN0YXJ0X3llYXJgLWByIGVuZF95ZWFyYCkqKjogVGhlIHN1bW1hcnkgcmVmbGVjdHMgZGF0YSBvdmVyIGEgYHIgaWYoKGVuZF95ZWFyIC0gc3RhcnRfeWVhcikgPCA1KSAiU2hvcnQtVGVybSBQZXJpb2QgKHVuZGVyIDUgeWVhcnMpIiBlbHNlIGlmKChlbmRfeWVhciAtIHN0YXJ0X3llYXIpID49IDUgJiYgIChlbmRfeWVhciAtIHN0YXJ0X3llYXIpIDw9IDEwKSAiSW50ZXJtZWRpYXRlLVRlcm0gUGVyaW9kICg1LTEwIHllYXJzKSIgZWxzZSAiTG9uZy1UZXJtIFBlcmlvZCAob3ZlciAxMCB5ZWFycykiYC4gVGhlIHBlcmZvcm1hbmNlIGFuZCByZWxhdGl2ZSBzdHJlbmd0aCBiZXR3ZWVuIGluZGV4ZXMgYXJlIGxpa2VseSB0byBzaGlmdCB3aGVuIG1lYXN1cmVkIGFjcm9zcyBkaWZmZXJlbnQgdGltZSBmcmFtZXMsIHBhcnRpY3VsYXJseSBpbiByZXNwb25zZSB0byBtYWpvciBoaXN0b3JpY2FsIGV2ZW50cywgYW5kIHBhcnRpY3VsYXJseSBmb3IgU2hvcnQtVGVybSBhbmQgTG9uZy1UZXJtIFBlcmlvZHMuIFdoaWxlIGEgc2hvcnQtIG9yIGludGVybWVkaWF0ZS10ZXJtIGFuYWx5c2lzIGNhbiBwcm92aWRlIGluc2lnaHRzLCBpdCBtYXkgbm90IGZ1bGx5IHJlcHJlc2VudCBwZXJmb3JtYW5jZSBvdmVyIGV4dGVuZGVkLCBsb25nLXRlcm0gcGVyaW9kcy4gTmV2ZXJ0aGVsZXNzLCB0aGVzZSBzdGF0aXN0aWNzIGNhbiBzZXJ2ZSBhcyBhIGJlbmNobWFyayBmb3IgZXZhbHVhdGluZyBmdXR1cmUgbWFya2V0IHRyZW5kcy4NCg0KKipDb21wYXJhdGl2ZSBBbmFseXNpcyBvZiBJbmRleCBQZXJmb3JtYW5jZToqKiBRUVEgZXhoaWJpdHMgdGhlIGhpZ2hlc3QgbWVhbiByZXR1cm4gYXQgYHIgbWVhbl92YWx1ZV9xcXFgJSwgc3VycGFzc2luZyB0aGUgUyZQIDUwMCdzIGByIG1lYW5fdmFsdWVfc3A1MDBgJSBhbmQgQmxhY2tSb2NrJ3MgYHIgbWVhbl92YWx1ZV9ibGFja3JvY2tgJSwgcmVmbGVjdGluZyBpdHMgYWdncmVzc2l2ZSwgdGVjaC1mb2N1c2VkIGNvbXBvc2l0aW9uLiBJdHMgQ0FHUiBvZiBgciBjYWdyX3ZhbHVlX3FxcWAlIHNpZ25pZmljYW50bHkgb3V0cGFjZXMgdGhlIFMmUCA1MDAncyBgciBjYWdyX3ZhbHVlX3NwNTAwYCUgYW5kIEJsYWNrUm9jaydzIGByIGNhZ3JfdmFsdWVfYmxhY2tyb2NrYCUsIGZ1cnRoZXIgZW1waGFzaXppbmcgUVFRJ3Mgc3Ryb25nIGdyb3d0aCBwb3RlbnRpYWwuIFdoaWxlIGJvdGggdGhlIFMmUCA1MDAgYW5kIFFRUSBoYXZlIGNvbnNpc3RlbnRseSBzdXJwYXNzZWQgaW5mbGF0aW9uLCBjb25zZXJ2YXRpdmUsIGFuZCBtb2RlcmF0ZSB0YXJnZXRzIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlX3FxcWAlIG9mIHRoZSB0aW1lLCBCbGFja1JvY2sgbGFncyBzaWduaWZpY2FudGx5LCBtZWV0aW5nIHRoZXNlIHRocmVzaG9sZHMgb25seSBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmVfYmxhY2tyb2NrYCUgYW5kIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlX3FxcWAlIG9mIHRoZSB0aW1lLCByZXNwZWN0aXZlbHkuIEFkZGl0aW9uYWxseSwgQmxhY2tSb2NrJ3MgcGVyZm9ybWFuY2UgaW4gZXhjZWVkaW5nIHRoZSBhZ2dyZXNzaXZlIGJlbmNobWFyayBzdGFuZHMgYXQganVzdCBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX2JsYWNrcm9ja2AlLCBjb21wYXJlZCB0byBgciBwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX3FxcWAlIGZvciBib3RoIHRoZSBTJlAgNTAwIGFuZCBRUVEuDQoNCkhvd2V2ZXIsIFFRUSBhbHNvIGRlbW9uc3RyYXRlcyB0aGUgaGlnaGVzdCB2b2xhdGlsaXR5LCB3aXRoIGEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGByIHNkX3ZhbHVlX3FxcWAlJSwgY29tcGFyZWQgdG8gYHIgc2RfdmFsdWVfc3A1MDBgJSBmb3IgdGhlIFMmUCA1MDAgYW5kIGByIHNkX3ZhbHVlX2JsYWNrcm9ja2AlIGZvciBCbGFja1JvY2ssIHVuZGVyc2NvcmluZyBpdHMgZ3JlYXRlciByaXNrLiBUaGUgcmFuZ2Ugb2YgZXhwZWN0ZWQgcmV0dXJucyAoQ0FHUiDCsSBTRCkgaXMgd2lkZXN0IGZvciBRUVEgKGByIG1pbl9jYWdyX3JhbmdlX3FxcWAlIHRvIGByIG1heF9jYWdyX3JhbmdlX3FxcWAlKSBhbmQgbmFycm93ZXN0IGZvciBCbGFja1JvY2sgKGByIG1pbl9jYWdyX3JhbmdlX2JsYWNrcm9ja2AlIHRvIGByIG1heF9jYWdyX3JhbmdlX2JsYWNrcm9ja2AlKSwgZW1waGFzaXppbmcgQmxhY2tSb2NrJ3Mgc3RhYmlsaXR5IGJ1dCBzaWduaWZpY2FudGx5IGxvd2VyIGdyb3d0aCBwb3RlbnRpYWwuIE1lZGlhbiByZXR1cm5zIGZ1cnRoZXIgaGlnaGxpZ2h0IFFRUSdzIGRvbWluYW5jZSAoYHIgbWVkaWFuX3ZhbHVlX3FxcWAlKSBvdmVyIHRoZSBTJlAgNTAwIChgciBtZWRpYW5fdmFsdWVfc3A1MDBgJSkgYW5kIEJsYWNrUm9jayAoYHIgbWVkaWFuX3ZhbHVlX2JsYWNrcm9ja2AlKS4gQmxhY2tSb2NrLCB0aG91Z2ggbGVzcyB2b2xhdGlsZSwgbGFncyBpbiBwZXJmb3JtYW5jZSB3aXRoIHRoZSBsb3dlc3QgbWF4aW11bSByZXR1cm4uIEJvdGggUyZQIDUwMCBhbmQgUVFRIGhhdmUgbmVhci0gb3IgYXQtZXF1YWwgcGVyY2VudGFnZSBvZiB5ZWFycyBhYm92ZSBlYWNoIHRhcmdldCwgKGByIG1heF92YWx1ZV9ibGFja3JvY2tgJSkgYW5kIHRoZSBoaWdoZXN0IHBlcmNlbnRhZ2Ugb2YgeWVhcnMgYmVsb3cgaW5mbGF0aW9uIGFuZCBjb25zZXJ2YXRpdmUgdGFyZ2V0cy4gVGhpcyBjb21wYXJpc29uIHVuZGVyc2NvcmVzIFFRUSdzIGFwcGVhbCBmb3IgZ3Jvd3RoLW9yaWVudGVkIGludmVzdG9ycyBzZWVraW5nIGhpZ2hlciByZXR1cm5zIGRlc3BpdGUgaW5jcmVhc2VkIHJpc2suDQoNCioqTG9uZy1UZXJtIEludmVzdG1lbnQgVmlhYmlsaXR5OioqIEZvciBhbnkgb2YgdGhlc2UgSW5kZXhlcyB0byBiZSBjb25zaWRlcmVkIGEgaGlnaC1wZXJmb3JtaW5nIGFuZCByZXNpbGllbnQgbG9uZy10ZXJtIGludmVzdG1lbnQsIGl0IHdvdWxkIGJlIGlkZWFsIHRvIGV4Y2VlZCB0aGUgYWdncmVzc2l2ZSB0YXJnZXQgKGUuZy4sIGByICh0YXJnZXRfYWdncmVzc2l2ZSAtIHRhcmdldF9pbmZsYXRpb24pYCUgYW5udWFsaXplZCByZXR1cm5zLCBhY2NvdW50aW5nIGZvciBoaWdoZXIgaW5mbGF0aW9uLWFkanVzdGVkIHBlcmZvcm1hbmNlIGV4cGVjdGF0aW9ucykgaW4gYXQgbGVhc3QgNDAlLTUwJSBvZiB0aGUgeWVhcnMuIFRoaXMgcmFuZ2UgcmVmbGVjdHMgdGhlIHBvdGVudGlhbCBmb3Igc3Ryb25nIHVwc2lkZSBpbiBtYW55IHllYXJzIHdoaWxlIGJhbGFuY2luZyB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IG1hcmtldHMgZG8gZXhwZXJpZW5jZSBkb3dudHVybnMuIA0KDQotIFMmUCA1MDA6IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfc3A1MDBgJSBvZiB0aGUgeWVhcnMgZXhjZWVkZWQgdGhlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGByIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfc3A1MDAgPiA1MCkgImluZGljYXRpbmcgY29uc2lzdGVudCBhbmQgcm9idXN0IGdyb3d0aCwgbWFraW5nIGl0IGEgc3Ryb25nIG9wdGlvbiBmb3IgdGhvc2Ugc2Vla2luZyBhZ2dyZXNzaXZlIGludmVzdG1lbnRzLiIgZWxzZSBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX3NwNTAwID4gNDApICJzdWdnZXN0aW5nIHRoYXQgd2hpbGUgbm90IGNvbnNpc3RlbnQsIGl0IGhhcyBoaXN0b3JpY2FsbHkgcHJvdmlkZWQgcm9idXN0IGdyb3d0aCBvdmVyIHRoZSBsb25nIHRlcm0sIG1ha2luZyBpdCBhIHZpYWJsZSBpbnZlc3RtZW50IGZvciB0aG9zZSB3aXRoIGEgaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiIgZWxzZSAicmFpc2luZyBjb25jZXJucyBhYm91dCBpdHMgYWJpbGl0eSB0byBtZWV0IGFnZ3Jlc3NpdmUgZ3Jvd3RoIHRhcmdldHMsIG1ha2luZyBpdCBsZXNzIHN1aXRhYmxlIGZvciBpbnZlc3RvcnMgd2l0aCBoaWdoZXIgcmlzayB0b2xlcmFuY2UuImANCg0KLSBRUVE6IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfcXFxYCUgb2YgdGhlIHllYXJzIGV4Y2VlZGVkIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX3FxcSA+IDUwKSAiaW5kaWNhdGluZyBjb25zaXN0ZW50IGFuZCByb2J1c3QgZ3Jvd3RoLCBtYWtpbmcgaXQgYSBzdHJvbmcgb3B0aW9uIGZvciB0aG9zZSBzZWVraW5nIGFnZ3Jlc3NpdmUgaW52ZXN0bWVudHMuIiBlbHNlIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfcXFxID4gNDApICJzdWdnZXN0aW5nIHRoYXQgd2hpbGUgbm90IGNvbnNpc3RlbnQsIGl0IGhhcyBoaXN0b3JpY2FsbHkgcHJvdmlkZWQgcm9idXN0IGdyb3d0aCBvdmVyIHRoZSBsb25nIHRlcm0sIG1ha2luZyBpdCBhIHZpYWJsZSBpbnZlc3RtZW50IGZvciB0aG9zZSB3aXRoIGEgaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiIgZWxzZSAicmFpc2luZyBjb25jZXJucyBhYm91dCBpdHMgYWJpbGl0eSB0byBtZWV0IGFnZ3Jlc3NpdmUgZ3Jvd3RoIHRhcmdldHMsIG1ha2luZyBpdCBsZXNzIHN1aXRhYmxlIGZvciBpbnZlc3RvcnMgd2l0aCBoaWdoZXIgcmlzayB0b2xlcmFuY2UuImANCg0KLSBCbGFja1JvY2s6IGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfYmxhY2tyb2NrYCUgb2YgdGhlIHllYXJzIGV4Y2VlZGVkIHRoZSBhZ2dyZXNzaXZlIHRhcmdldCBgciBpZihwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX2JsYWNrcm9jayA+IDUwKSAiaW5kaWNhdGluZyBjb25zaXN0ZW50IGFuZCByb2J1c3QgZ3Jvd3RoLCBtYWtpbmcgaXQgYSBzdHJvbmcgb3B0aW9uIGZvciB0aG9zZSBzZWVraW5nIGFnZ3Jlc3NpdmUgaW52ZXN0bWVudHMuIiBlbHNlIGlmKHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfYmxhY2tyb2NrID4gNDApICJzdWdnZXN0aW5nIHRoYXQgd2hpbGUgbm90IGNvbnNpc3RlbnQsIGl0IGhhcyBoaXN0b3JpY2FsbHkgcHJvdmlkZWQgcm9idXN0IGdyb3d0aCBvdmVyIHRoZSBsb25nIHRlcm0sIG1ha2luZyBpdCBhIHZpYWJsZSBpbnZlc3RtZW50IGZvciB0aG9zZSB3aXRoIGEgaGlnaGVyIHJpc2sgdG9sZXJhbmNlLiIgZWxzZSAicmFpc2luZyBjb25jZXJucyBhYm91dCBpdHMgYWJpbGl0eSB0byBtZWV0IGFnZ3Jlc3NpdmUgZ3Jvd3RoIHRhcmdldHMsIG1ha2luZyBpdCBsZXNzIHN1aXRhYmxlIGZvciBpbnZlc3RvcnMgd2l0aCBoaWdoZXIgcmlzayB0b2xlcmFuY2UuImANCg0KIyMjIEdyYXBoIA0KDQpgYGB7ciBpbmRleF9jb21wYXJpc29uX2dyX2dyYXBoLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQpjYXQoIlxuXG4jIyMjIEFubnVhbCBHcm93dGggUmF0ZXMgQnkgSW5kZXggXG4iKQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBDb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcgaWYgbmVlZGVkDQptZXJnZWRfZGF0YSA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIGBEYXRlYCA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGBEYXRlYCkpLCAgIyBFbnN1cmUgRGF0ZSBpcyBudW1lcmljDQogICAgYFMmUCA1MDBgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGBTJlAgNTAwYCkpLA0KICAgIGBRUVFgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGBRUVFgKSksDQogICAgYEJsYWNrUm9ja2AgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYEJsYWNrUm9ja2ApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gbWVyZ2VkX2RhdGEgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgUyZQIDUwMGAsIGBRUVFgLCBgQmxhY2tSb2NrYCksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJBR1JfSW5kZXgiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkFHUl9WYWx1ZSIpICU+JQ0KICBtdXRhdGUoQUdSX0luZGV4ID0gZmFjdG9yKEFHUl9JbmRleCwgbGV2ZWxzID0gYygiUyZQIDUwMCIsICJRUVEiLCAiQmxhY2tSb2NrIikpKQ0KDQojIEFzc2lnbiBjb2xvcnMgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIG9yZGVyIG9mIEFHUl9JbmRleCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBBR1JfSW5kZXggd2l0aCBjb2xvcnMgZnJvbSBjb2xvcnNfZ2VuZXJhbF9kYXJrDQp1bmlxdWVfdHlwZXMgPC0gdW5pcXVlKG5ydF9sb25nJEFHUl9JbmRleCkNCmN1c3RvbV9jb2xvcnMgPC0gc2V0TmFtZXMoY29sb3JzX2dlbmVyYWxfZGFya1sxOmxlbmd0aCh1bmlxdWVfdHlwZXMpXSwgdW5pcXVlX3R5cGVzKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geC12YWx1ZSBpbiB5b3VyIGRhdGENCm1heF94IDwtIG1heChhcy5pbnRlZ2VyKG1lcmdlZF9kYXRhJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihtZXJnZWRfZGF0YSREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4obWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSBtaW5feWVhcg0KZW5kX3llYXIgPC0gbWF4X3llYXINCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gMikgKiAyICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyAyKSAqIDIgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkFubnVhbCBHcm93dGggUmF0ZXMgQnkgSW5kZXggT3ZlciAiLCB5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJBbm51YWwgR3Jvd3RoIFJhdGVzIEJ5IEluZGV4LCBEYXRhIFBlcmlvZCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQUdSX1ZhbHVlLCBjb2xvciA9IEFHUl9JbmRleCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDMwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQUdSIEluZGV4DQogIGdlb21fbGluZShzaXplID0gMS4yNSwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMi4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQoNCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNvbG9yID0gIkFHUiBJbmRleCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBBR1IgSW5kZXgNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIgKyAxKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIgKyAxLCAyKSAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICApICsgDQogIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxKQ0KDQoNCmBgYA0KDQpUaGVyZSBhcmUgeWVhcnMgd2hlbiBRUVEncyBhbm51YWwgZ3Jvd3RoIHJhdGUgdW5kZXJwZXJmb3JtZWQgdGhlIG90aGVyIGluZGV4ZXMsIHBhcnRpY3VsYXJseSBkdXJpbmcgZGVjbGluZXMgc3VjaCBhcyBpbiAyMDIzLCBidXQgdGhvc2UgeWVhcnMgYXJlIG92ZXJzaGFkb3dlZCBieSBpdHMgb3ZlcmFsbCBzdHJlbmd0aC4gSW4gaGluZHNpZ2h0LCBwZXJpb2RzIHdoZW4gc3Ryb25nLCB2b2xhdGlsZSBpbmRleGVzIGhhdmUgcGVyZm9ybWVkIHRoZSB3b3JzdCBtYXkgYWN0dWFsbHkgcmVwcmVzZW50IHRoZSBiZXN0IG9wcG9ydHVuaXRpZXMgdG8gaW52ZXN0Lg0KDQojIyBDdW11bGF0aXZlIEdyb3d0aCANCg0KIyMjIERhdGENCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9jZywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcnkNCmxpYnJhcnkoZHBseXIpDQoNCiMgU3RlcCAxOiBDb252ZXJ0IHBlcmNlbnRhZ2VzIHRvIG51bWVyaWMgdmFsdWVzIChjb2x1bW5zIDI6NCkNCmN1bXVsYXRpdmVfZGF0YSA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIGFjcm9zcygyOjQsIH4gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIC4pKSAvIDEwMCkgIyBDb252ZXJ0IHBlcmNlbnRhZ2Ugc3RyaW5ncyB0byBudW1lcmljDQogICkNCg0KIyBTdGVwIDI6IEVuc3VyZSB0aGUgYERhdGVgIGNvbHVtbiBpcyB0cmVhdGVkIGFzIGFuIGludGVnZXINCmN1bXVsYXRpdmVfZGF0YSA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIG11dGF0ZShEYXRlID0gYXMuaW50ZWdlcihEYXRlKSkNCg0KIyBTdGVwIDM6IEFkZCB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgMjAxNw0KY3VtdWxhdGl2ZV9kYXRhIDwtIGJpbmRfcm93cygNCiAgZGF0YS5mcmFtZShEYXRlID0gc3RhcnRfeWVhci0xLCBgUyZQIDUwMGAgPSAwLCBRUVEgPSAwLCBCbGFja1JvY2sgPSAwKSwgIyBTZXQgZ3Jvd3RoIHJhdGVzIGZvciAyMDE3IHRvIDANCiAgY3VtdWxhdGl2ZV9kYXRhDQopDQoNCiMgU3RlcCA0OiBTb3J0IGJ5IERhdGUgYXNjZW5kaW5nIGZvciBwcm9wZXIgY3VtdWxhdGl2ZSBjYWxjdWxhdGlvbg0KY3VtdWxhdGl2ZV9kYXRhIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgYXJyYW5nZShEYXRlKQ0KDQojIFN0ZXAgNTogSW5pdGlhbGl6ZSB0aGUgc3RhcnRpbmcgdmFsdWUNCnN0YXJ0aW5nX3ZhbHVlIDwtIDEwMA0KDQojIFN0ZXAgNjogQ2FsY3VsYXRlIGN1bXVsYXRpdmUgZ3Jvd3RoDQpjdW11bGF0aXZlX2RhdGEgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBtdXRhdGUoDQogICAgYFMmUCA1MDBgID0gc3RhcnRpbmdfdmFsdWUgKiBjdW1wcm9kKDEgKyByZXBsYWNlX25hKGBTJlAgNTAwYCwgMCkpLCAjIFJlcGxhY2UgTkEgd2l0aCAwIGZvciBwcm9wZXIgY2FsY3VsYXRpb24NCiAgICBRUVEgPSBzdGFydGluZ192YWx1ZSAqIGN1bXByb2QoMSArIHJlcGxhY2VfbmEoUVFRLCAwKSksDQogICAgQmxhY2tSb2NrID0gc3RhcnRpbmdfdmFsdWUgKiBjdW1wcm9kKDEgKyByZXBsYWNlX25hKEJsYWNrUm9jaywgMCkpDQogICkNCg0KIyBTdGVwIDc6IFJlcGxhY2UgaW5pdGlhbCBncm93dGggcmF0ZXMgZm9yIDIwMTcgd2l0aCAkMTAwIGV4cGxpY2l0bHkNCmN1bXVsYXRpdmVfZGF0YSA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIG11dGF0ZShhY3Jvc3MoMjo0LCB+IGlmZWxzZShEYXRlID09IHN0YXJ0X3llYXItMSwgMTAwLCAuKSkpDQoNCiMgU3RlcCA4OiBSZW9yZGVyIGNvbHVtbnMgYXMgRGF0ZSwgUyZQIDUwMCwgUVFRLCBCbGFja1JvY2sNCmN1bXVsYXRpdmVfZGF0YSA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIHNlbGVjdChEYXRlLCBgUyZQIDUwMGAsIFFRUSwgQmxhY2tSb2NrKQ0KDQojIFN0ZXAgOTogUm91bmQgdmFsdWVzIHRvIDIgZGVjaW1hbCBwbGFjZXMNCmN1bXVsYXRpdmVfZGF0YSA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIG11dGF0ZShhY3Jvc3MoMjo0LCB+IHJvdW5kKC4sIDIpKSkNCg0KIyBTdGVwIDEwOiBTb3J0IGJ5IERhdGUgZGVzY2VuZGluZyBmb3IgcHJlc2VudGF0aW9uDQpjdW11bGF0aXZlX2RhdGEgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBhcnJhbmdlKGRlc2MoRGF0ZSkpDQoNCiMgRm9ybWF0IHRoZSB0YWJsZSB3aXRob3V0IGFkZGluZyBjb21tYXMgdG8gdGhlIERhdGUgY29sdW1uDQpjdW11bGF0aXZlX2RhdGEkRGF0ZSA8LSBhcy5jaGFyYWN0ZXIoY3VtdWxhdGl2ZV9kYXRhJERhdGUpICAjIEVuc3VyZSBEYXRlIGlzIGEgY2hhcmFjdGVyIHdpdGhvdXQgY29tbWFzDQpjdW11bGF0aXZlX2RhdGEkYFMmUCA1MDBgIDwtIGZvcm1hdEMoY3VtdWxhdGl2ZV9kYXRhJGBTJlAgNTAwYCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKQ0KY3VtdWxhdGl2ZV9kYXRhJFFRUSA8LSBmb3JtYXRDKGN1bXVsYXRpdmVfZGF0YSRRUVEsIGZvcm1hdCA9ICJmIiwgZGlnaXRzID0gMikNCmN1bXVsYXRpdmVfZGF0YSRgQmxhY2tSb2NrYCA8LSBmb3JtYXRDKGN1bXVsYXRpdmVfZGF0YSRgQmxhY2tSb2NrYCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKQ0KDQoNCiMgUHJpbnQgdGhlIGN1bXVsYXRpdmUgZ3Jvd3RoIHRhYmxlDQpjYXQoIlxuXG4jIyMjIEN1bXVsYXRpdmUgR3Jvd3RoICgiLCBtaW5feWVhciwgIi0iLCBtYXhfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfcHJpbnQoY3VtdWxhdGl2ZV9kYXRhKQ0KaW50ZXJhY3RpdmVfc3RyKGN1bXVsYXRpdmVfZGF0YSkNCmZvcm1hdF9lcXVhbF93aWR0aChjdW11bGF0aXZlX2RhdGEpDQoNCg0KDQoNCmBgYA0KDQpUaGUgdGFibGUgYW5kIGdyYXBoIGJlbG93IHNob3cgdGhlIGltcGFjdCBvZiB0aGUgYW5udWFsIGdyb3d0aCByYXRlcywgY29tcGFyaW5nIHRoZSBjdW11bGF0aXZlIGdyb3d0aCBvZiB0aGUgUyZQIDUwMCwgUVFRLCBhbmQgQmxhY2tSb2NrIGluZGV4ZXMgb3ZlciBhIGByIHllYXJfcmFuZ2VgLXllYXIgcGVyaW9kIGZyb20gYHIgc3RhcnRfeWVhcmAgdG8gYHIgZW5kX3llYXJgLCBzdGFydGluZyB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgJDEwMCBwZXIgMTAwJS4gDQoNCiMjIyBHcmFwaCANCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9jZ19ncmFwaCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBDdW11bGF0aXZlIEdyb3d0aCBCeSBJbmRleCBcbiIpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIENvbnZlcnQgY29sdW1ucyB0byBudW1lcmljIGZvciBwbG90dGluZyBpZiBuZWVkZWQNCmN1bXVsYXRpdmVfZGF0YSA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBgRGF0ZWAgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihgRGF0ZWApKSwgICMgRW5zdXJlIERhdGUgaXMgbnVtZXJpYw0KICAgIGBTJlAgNTAwYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgUyZQIDUwMGApKSwNCiAgICBgUVFRYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgUVFRYCkpLA0KICAgIGBCbGFja1JvY2tgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGBCbGFja1JvY2tgKSkNCiAgKQ0KDQojIFJlc2hhcGUgdGhlIGRhdGEgaW50byBsb25nIGZvcm1hdCBmb3IgZWFzeSBwbG90dGluZyBvZiBtdWx0aXBsZSBsaW5lcyBhbmQgc2V0IHRoZSBmYWN0b3Igb3JkZXINCm5ydF9sb25nIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGBTJlAgNTAwYCwgYFFRUWAsIGBCbGFja1JvY2tgKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkNHX0luZGV4IiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJDR19WYWx1ZSIpICU+JQ0KICBtdXRhdGUoQ0dfSW5kZXggPSBmYWN0b3IoQ0dfSW5kZXgsIGxldmVscyA9IGMoIlMmUCA1MDAiLCAiUVFRIiwgIkJsYWNrUm9jayIpKSkNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBDR19JbmRleCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBDR19JbmRleCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQ0dfSW5kZXgpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihjdW11bGF0aXZlX2RhdGEkRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKGN1bXVsYXRpdmVfZGF0YSREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4oY3VtdWxhdGl2ZV9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChjdW11bGF0aXZlX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIDIwMTcNCmVuZF95ZWFyIDwtIDIwMjQNCnllYXJfcmFuZ2UgPC0gZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMSAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB5ZWFycw0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gMikgKiAyICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgMg0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyAyKSAqIDIgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDINCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSBwYXN0ZTAoIkN1bXVsYXRpdmUgR3Jvd3RoIEJ5IEluZGV4IE92ZXIgIiwgeWVhcl9yYW5nZSAtIDEsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkN1bXVsYXRpdmUgR3Jvd3RoIEJ5IEluZGV4LCBEYXRhIFBlcmlvZCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQ0dfVmFsdWUsIGNvbG9yID0gQ0dfSW5kZXgpKSArDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gMTAwLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IDEwMCksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMzApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBDRyBJbmRleA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMjUsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDRw0KICBnZW9tX3BvaW50KHNpemUgPSAyLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENHDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNHIFZhbHVlICgxJCAvIDElKSIsDQogICAgY29sb3IgPSAiQ0cgSW5kZXgiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggQ0cgSW5kZXgNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgMikgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgKSArIA0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KDQpgYGANCg0KUVFRIGRlbW9uc3RyYXRlcyB0aGUgaGlnaGVzdCBjdW11bGF0aXZlIGdyb3d0aCwgcmVmbGVjdGluZyBpdHMgdGVjaC1oZWF2eSBjb21wb3NpdGlvbiBhbmQgaGlnaGVyIHJpc2stcmV3YXJkIHByb2ZpbGUsIHdoaWxlIHRoZSBTJlAgNTAwIHNob3dzIHN0ZWFkeSwgbW9kZXJhdGUgZ3Jvd3RoLCBjb25zaXN0ZW50IHdpdGggaXRzIGJyb2FkZXIgbWFya2V0IHJlcHJlc2VudGF0aW9uLiBJbiBjb250cmFzdCwgQmxhY2tSb2NrIGV4aGliaXRzIHRoZSBtb3N0IGNvbnNlcnZhdGl2ZSBncm93dGgsIGxpa2VseSBkdWUgdG8gaXRzIGZvY3VzIG9uIGxvd2VyLXJpc2sgc3RyYXRlZ2llcyBvciBkaXZlcnNpZmllZCBwb3J0Zm9saW9zLiBTaW5jZSBgciBzdGFydF95ZWFyYCwgUVFRIGhhcyBtYWludGFpbmVkIGRvbWluYW5jZSBvbiBhIGN1bXVsYXRpdmUgYmFzaXMuIFRoaXMgY29tcGFyaXNvbiBoaWdobGlnaHRzIHRoZSB2YXJ5aW5nIHJpc2stcmV0dXJuIGR5bmFtaWNzIG9mIHRoZSBpbmRleGVzLCB3aXRoIFFRUSBvZmZlcmluZyBhZ2dyZXNzaXZlIGdyb3d0aCBwb3RlbnRpYWwgYW5kIEJsYWNrUm9jayBjYXRlcmluZyB0byBzdGFiaWxpdHktZm9jdXNlZCBpbnZlc3RvcnMuDQoNCiMgU1BYIFZTIFFRUQ0KDQojIyBBbm51YWwgR1INCg0KIyMjIERhdGENCg0KDQpgYGB7ciBpbmRleF9jb21wYXJpc29uX2dyX3YyLCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmludGVyYWN0aXZlX3N0cihucnQkc3A1MDBfcmF3KQ0KaW50ZXJhY3RpdmVfc3RyKG5ydCRxcXFfcmF3KQ0KDQppbnRlcmFjdGl2ZV9wcmludChucnQkc3A1MDBfcmF3KQ0KaW50ZXJhY3RpdmVfcHJpbnQobnJ0JHFxcV9yYXcpDQoNCm1pbl95ZWFyIDwtIG1pbihucnQkc3A1MDBfcmF3JERhdGUpDQptYXhfeWVhciA8LSBtYXgobnJ0JHNwNTAwX3JhdyREYXRlKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KbWluX3llYXIgPC0gbWluKG5ydCRxcXFfcmF3JERhdGUpDQptYXhfeWVhciA8LSBtYXgobnJ0JHFxcV9yYXckRGF0ZSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgRmlsdGVyIGRhdGEgZm9yIHRoZSBtYXRjaGluZyBkYXRlIHJhbmdlDQptYXRjaGluZ19kYXRlcyA8LSBSZWR1Y2UoaW50ZXJzZWN0LCBsaXN0KG5ydCRxcXFfcmF3JERhdGUsIG5ydCRxcXFfcmF3JERhdGUpKQ0KIyBHZXQgdGhlIG9sZGVzdCBtYXRjaGluZyBkYXRlDQppZiAobGVuZ3RoKG1hdGNoaW5nX2RhdGVzKSA+IDApIHsNCiAgb2xkZXN0X21hdGNoaW5nX2RhdGUgPC0gbWluKG1hdGNoaW5nX2RhdGVzKQ0KICBpbnRlcmFjdGl2ZV9jYXQoIk9sZGVzdCBtYXRjaGluZyBkYXRlOiIsIG9sZGVzdF9tYXRjaGluZ19kYXRlLCAiXG4iKQ0KfSBlbHNlIHsNCiAgaW50ZXJhY3RpdmVfY2F0KCJObyBtYXRjaGluZyBkYXRlcyBmb3VuZCBhbW9uZyB0aGUgdGhyZWUgZGF0YXNldHMuXG4iKQ0KfQ0KDQpzdGFydF95ZWFyIDwtIG9sZGVzdF9tYXRjaGluZ19kYXRlICsgMQ0KIyBlbmRfeWVhciA8LSAyMDI1DQplbmRfeWVhciA8LSBhcy5udW1lcmljKGZvcm1hdChTeXMuRGF0ZSgpLCAiJVkiKSkNCg0Kc3A1MDBfZmlsdGVyZWQgPC0gc3Vic2V0KG5ydCRzcDUwMF9yYXcsIERhdGUgPj0gc3RhcnRfeWVhciAmIERhdGUgPD0gZW5kX3llYXIsIHNlbGVjdCA9IGMoRGF0ZSwgYDEtWWVhciBDQUdSYCkpDQpxcXFfZmlsdGVyZWQgPC0gc3Vic2V0KG5ydCRxcXFfcmF3LCBEYXRlID49IHN0YXJ0X3llYXIgJiBEYXRlIDw9IGVuZF95ZWFyLCBzZWxlY3QgPSBjKERhdGUsIGAxLVllYXIgQ0FHUmApKQ0KDQojIFJlbmFtZSBjb2x1bW5zIGZvciBjbGFyaXR5DQpjb2xuYW1lcyhzcDUwMF9maWx0ZXJlZClbY29sbmFtZXMoc3A1MDBfZmlsdGVyZWQpID09ICIxLVllYXIgQ0FHUiJdIDwtICJTJlAgNTAwIg0KY29sbmFtZXMocXFxX2ZpbHRlcmVkKVtjb2xuYW1lcyhxcXFfZmlsdGVyZWQpID09ICIxLVllYXIgQ0FHUiJdIDwtICJRUVEiDQoNCiMgTWVyZ2UgZGF0YXNldHMgYnkgRGF0ZSAoWWVhcikNCm1lcmdlZF9kYXRhIDwtIG1lcmdlKHNwNTAwX2ZpbHRlcmVkLCBxcXFfZmlsdGVyZWQsIGJ5ID0gIkRhdGUiKQ0KDQojIFNvcnQgYnkgRGF0ZSBpbiBkZXNjZW5kaW5nIG9yZGVyIChtb3N0IHJlY2VudCB5ZWFyIGZpcnN0KQ0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2VkX2RhdGFbb3JkZXIoLW1lcmdlZF9kYXRhJERhdGUpLCBdDQoNCiMgRm9ybWF0IHRoZSBtZXJnZWQgZGF0YQ0KbWVyZ2VkX2RhdGEkRGF0ZSA8LSBhcy5jaGFyYWN0ZXIobWVyZ2VkX2RhdGEkRGF0ZSkgICMgRW5zdXJlIERhdGUgaXMgYSBjaGFyYWN0ZXIgd2l0aG91dCBjb21tYXMNCm1lcmdlZF9kYXRhJGBTJlAgNTAwYCA8LSBwYXN0ZTAoZm9ybWF0QyhtZXJnZWRfZGF0YSRgUyZQIDUwMGAsIGZvcm1hdCA9ICJmIiwgZGlnaXRzID0gMiksICIlIikNCm1lcmdlZF9kYXRhJFFRUSA8LSBwYXN0ZTAoZm9ybWF0QyhtZXJnZWRfZGF0YSRRUVEsIGZvcm1hdCA9ICJmIiwgZGlnaXRzID0gMiksICIlIikNCg0KIyBEaXNwbGF5IGZvcm1hdHRlZCB0YWJsZQ0KY2F0KCJcblxuIyMjIyBBbm51YWwgR3Jvd3RoIFJhdGVzIEJ5IEluZGV4ICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQppbnRlcmFjdGl2ZV9wcmludChtZXJnZWRfZGF0YSkNCmludGVyYWN0aXZlX3N0cihtZXJnZWRfZGF0YSkNCmZvcm1hdF9lcXVhbF93aWR0aChtZXJnZWRfZGF0YSkNCg0KIyMgU2F2ZSBEYXRhZnJhbWUgdXNpbmcgZnVuY3Rpb24gDQojIERlZmluZSBwYXJhbWV0ZXJzDQppbmRleF8xIDwtICJzcDUwMCINCmluZGV4XzIgPC0gInFxcSINCnN0YXJ0X3llYXIgPC0gc3RhcnRfeWVhcg0KZW5kX3llYXIgPC0gZW5kX3llYXINCg0KIyBVc2UgdGhlIGZ1bmN0aW9uIHRvIHNhdmUgdGhlIGRhdGFmcmFtZQ0Kc2F2ZV9kYXRhZnJhbWVfaW5kZXhfMV9pbmRleF8yX3N0YXJ0X3llYXJfZW5kX3llYXIobWVyZ2VkX2RhdGEsIGluZGV4XzEsIGluZGV4XzIsIHN0YXJ0X3llYXIsIGVuZF95ZWFyKQ0Kc2F2ZV9kYXRhZnJhbWVfaW5kZXhfMV9pbmRleF8yKG1lcmdlZF9kYXRhLCBpbmRleF8xLCBpbmRleF8yKQ0KDQojIEFjY2VzcyB0aGUgc2F2ZWQgdmFyaWFibGUgZGlyZWN0bHkNCmludGVyYWN0aXZlX2NhdCgiRGF0YWZyYW1lIHNhdmVkIGFzIHZhcmlhYmxlOiIsIHBhc3RlMCgibWVyZ2VkX2RhdGFfIiwgaW5kZXhfMSwgIl8iLCBpbmRleF8yLCAiX3MiLCBzdGFydF95ZWFyLCAiX2UiLCBlbmRfeWVhciksICJcbiIpDQppbnRlcmFjdGl2ZV9jYXQoIkRhdGFmcmFtZSBzYXZlZCBhcyB2YXJpYWJsZToiLCBwYXN0ZTAoIm1lcmdlZF9kYXRhXyIsIGluZGV4XzEsICJfIiwgaW5kZXhfMikpDQoNCmBgYA0KDQpEYXRhIGJlZ2lucyB3aXRoIGByIHN0YXJ0X3llYXJgLCBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCB3aXRoIHRoZSBsZWFzdCBoaXN0b3JpY2FsIGRhdGEgZm9yIGNvbnNpc3RlbnQgY29tcGFyaXNvbiBhY3Jvc3MgYWxsIGluZGV4ZXMuDQoNCiMjIyBTdW1tYXJ5DQoNCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fZ3JfdjJfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcnkNCmxpYnJhcnkoZHBseXIpDQoNCiMgUmVtb3ZlIHBlcmNlbnRhZ2Ugc2lnbnMgYW5kIGNvbnZlcnQgY29sdW1ucyB0byBudW1lcmljDQptZXJnZWRfZGF0YV9jbGVhbiA8LSBtZXJnZWRfZGF0YQ0KbWVyZ2VkX2RhdGFfY2xlYW5bMjozXSA8LSBsYXBwbHkobWVyZ2VkX2RhdGFbMjozXSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIHgpKSkNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihtZXJnZWRfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBEZWZpbmUgdGhlIG1ldHJpY3MgdG8gY2FsY3VsYXRlLCBpbmNsdWRpbmcgQ0FHUg0KbWV0cmljcyA8LSBjKA0KICAiQ0FHUiIsIA0KICAiTWVhbiIsIA0KICAiTWVkaWFuIiwgDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiwgDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIsIA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiLCANCiAgIk1pbiIsIA0KICAiTWF4IiwgDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiDQopDQoNCiMgRGVmaW5lIHRoZSBDQUdSIGNhbGN1bGF0aW9uDQpjYWxjdWxhdGVfY2FnciA8LSBmdW5jdGlvbihjb2wpIHsNCiAgc3RhcnRfdmFsIDwtIDEgICMgRmlyc3QgeWVhciB2YWx1ZQ0KICBlbmRfdmFsIDwtIHByb2QoMSArIGNvbCAvIDEwMCwgbmEucm0gPSBUUlVFKSAgIyBQcm9kdWN0IG9mIGdyb3d0aCBmYWN0b3JzDQogIHllYXJzIDwtIG5yb3cobWVyZ2VkX2RhdGFfY2xlYW4pDQogICgoZW5kX3ZhbCAvIHN0YXJ0X3ZhbCleKDEgLyB5ZWFycykgLSAxKSAqIDEwMCAgIyBDQUdSIGZvcm11bGENCn0NCg0KIyBDYWxjdWxhdGUgbWV0cmljcyBkeW5hbWljYWxseSBmb3IgYWxsIG51bWVyaWMgY29sdW1ucw0KY2FsY3VsYXRlZF9tZXRyaWNzIDwtIHNhcHBseShtZXJnZWRfZGF0YV9jbGVhblsyOjNdLCBmdW5jdGlvbihjb2wpIHsNCiAgbWVhbl92YWwgPC0gbWVhbihjb2wsIG5hLnJtID0gVFJVRSkNCiAgc2RfdmFsIDwtIHNkKGNvbCwgbmEucm0gPSBUUlVFKQ0KICBwZXJjZW50X2Fib3ZlIDwtIGZ1bmN0aW9uKHRhcmdldCkgbWVhbihjb2wgPiB0YXJnZXQsIG5hLnJtID0gVFJVRSkgKiAxMDANCiAgDQogIGMoDQogICAgYENBR1JgID0gY2FsY3VsYXRlX2NhZ3IoY29sKSwNCiAgICBNZWFuID0gbWVhbl92YWwsDQogICAgTWVkaWFuID0gbWVkaWFuKGNvbCwgbmEucm0gPSBUUlVFKSwNCiAgICBgU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KWAgPSBzZF92YWwsDQogICAgYE1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpYCA9IG1lYW5fdmFsIC0gc2RfdmFsLA0KICAgIGBNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKWAgPSBtZWFuX3ZhbCArIHNkX3ZhbCwNCiAgICBNaW4gPSBtaW4oY29sLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1heCA9IG1heChjb2wsIG5hLnJtID0gVFJVRSksDQogICAgYFBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9pbmZsYXRpb24pLCAgIyBFeGFtcGxlIGluZmxhdGlvbiB0YXJnZXQ6IDIlDQogICAgYFBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9jb25zZXJ2YXRpdmUpLA0KICAgIGBQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9tb2RlcmF0ZSksDQogICAgYFBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXRgID0gcGVyY2VudF9hYm92ZSh0YXJnZXRfYWdncmVzc2l2ZSkNCiAgKQ0KfSkNCg0KIyBUcmFuc3Bvc2UgdGhlIHJlc3VsdCBhbmQgYWRkIHRoZSBNZXRyaWMgY29sdW1uDQpjdXN0b21fc3VtbWFyeSA8LSBkYXRhLmZyYW1lKA0KICBNZXRyaWMgPSBtZXRyaWNzLA0KICBjYWxjdWxhdGVkX21ldHJpY3MNCikNCg0KIyBSZW5hbWUgY29sdW1ucyB0byByZXRhaW4gdGhlIG9yaWdpbmFsIGNvbHVtbiBuYW1lcyBkeW5hbWljYWxseQ0KY29sbmFtZXMoY3VzdG9tX3N1bW1hcnkpWy0xXSA8LSBjb2xuYW1lcyhtZXJnZWRfZGF0YSlbMjozXQ0KDQojIEFkZCBwZXJjZW50YWdlIHNpZ25zIGJhY2sgdG8gYWxsIG51bWVyaWMgdmFsdWVzDQpjdXN0b21fc3VtbWFyeVstMV0gPC0gbGFwcGx5KGN1c3RvbV9zdW1tYXJ5Wy0xXSwgZnVuY3Rpb24oeCkgcGFzdGUwKGZvcm1hdEMoeCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKSkNCg0KIyBSZW1vdmUgcm93IG5hbWVzDQpyb3duYW1lcyhjdXN0b21fc3VtbWFyeSkgPC0gTlVMTA0KDQojIFByaW50IHRoZSBmaW5hbCBzdW1tYXJ5DQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIEFubnVhbCBHcm93dGggUmF0ZXMgU3VtbWFyeSBCeSBJbmRleCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KDQppbnRlcmFjdGl2ZV9wcmludChjdXN0b21fc3VtbWFyeSkNCmZvcm1hdF8zY29sX2N1c3RvbV93aWR0aHMoY3VzdG9tX3N1bW1hcnksIGNvbDFfd2lkdGggPSAiMjBlbSIsIGNvbDJfd2lkdGggPSAiMTVlbSIsIGNvbDNfd2lkdGggPSAiMTVlbSIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFNBVkUgVkFMVUVTIEZPUiBJTi1MSU5FIENPREUNCg0KIyBEZWZpbmUgdGhlIG1hcHBpbmcgb2Ygcm93IG5hbWVzIHRvIHZhcmlhYmxlIG5hbWVzDQpyb3dfdG9fdmFyX25hbWUgPC0gYygNCiAgIkNBR1IiID0gImNhZ3JfdmFsdWUiLA0KICAiTWVhbiIgPSAibWVhbl92YWx1ZSIsDQogICJNZWRpYW4iID0gIm1lZGlhbl92YWx1ZSIsDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiA9ICJzZF92YWx1ZSIsDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIgPSAibWluX2NhZ3JfcmFuZ2UiLA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiID0gIm1heF9jYWdyX3JhbmdlIiwNCiAgIk1pbiIgPSAibWluX3ZhbHVlIiwNCiAgIk1heCIgPSAibWF4X3ZhbHVlIiwNCiAgIlBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfaW5mbGF0aW9uIiwNCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfY29uc2VydmF0aXZlIiwNCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9tb2RlcmF0ZSIsDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlIg0KKQ0KDQojIERlZmluZSBhIGN1c3RvbSBtYXBwaW5nIGZvciBjb2x1bW4gbmFtZXMNCmNvbHVtbl9uYW1lX21hcHBpbmcgPC0gYygNCiAgIlMmUCA1MDAiID0gInNwNTAwIiwNCiAgIlFRUSIgPSAicXFxIg0KKQ0KDQojIEZ1bmN0aW9uIHRvIHNhdmUgc3VtbWFyeSB2YWx1ZXMgZHluYW1pY2FsbHkgd2l0aCBjb2x1bW4gbmFtZSBtYXBwaW5nDQpzYXZlX2NvbHVtbl92YWx1ZXMgPC0gZnVuY3Rpb24oc3VtbWFyeV9kZiwgcm93X21hcHBpbmcsIGNvbHVtbl9tYXBwaW5nKSB7DQogICMgR2V0IHRoZSBjb2x1bW4gbmFtZXMgaW4gdGhlIGRhdGEgZnJhbWUNCiAgY29sdW1uc190b19zYXZlIDwtIHNldGRpZmYobmFtZXMoc3VtbWFyeV9kZiksIGMoIk1ldHJpYyIpKSAgIyBFeGNsdWRlIHRoZSBNZXRyaWMgY29sdW1uDQogIA0KICAjIEl0ZXJhdGUgb3ZlciBlYWNoIGNvbHVtbg0KICBmb3IgKGNvbCBpbiBjb2x1bW5zX3RvX3NhdmUpIHsNCiAgICAjIFVzZSB0aGUgY3VzdG9tIG1hcHBpbmcgdG8gZ2V0IHRoZSBhcHByb3ByaWF0ZSBjb2x1bW4gbmFtZQ0KICAgIGNvbF9uYW1lIDwtIGNvbHVtbl9tYXBwaW5nW1tjb2xdXSAlfHwlIHRvbG93ZXIoZ3N1YigiW15hLXpBLVowLTldIiwgIl8iLCBjb2wpKQ0KICAgIA0KICAgICMgRXh0cmFjdCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IGNvbHVtbg0KICAgIGNvbF92YWx1ZXMgPC0gc3VtbWFyeV9kZltbY29sXV0NCiAgICANCiAgICAjIEl0ZXJhdGUgb3ZlciByb3dzIHRvIHNhdmUgZWFjaCB2YWx1ZSBkeW5hbWljYWxseQ0KICAgIGZvciAoaSBpbiBzZXFfYWxvbmcoY29sX3ZhbHVlcykpIHsNCiAgICAgICMgR2V0IHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlIG5hbWUgZnJvbSB0aGUgbWFwcGluZw0KICAgICAgc3RhdF9uYW1lIDwtIHJvd19tYXBwaW5nW3N1bW1hcnlfZGYkTWV0cmljW2ldXQ0KICAgICAgDQogICAgICBpZiAoIWlzLm5hKHN0YXRfbmFtZSkpIHsgICMgU2tpcCBpZiBubyBtYXBwaW5nIGlzIGRlZmluZWQNCiAgICAgICAgIyBDcmVhdGUgdGhlIHZhcmlhYmxlIG5hbWUNCiAgICAgICAgdmFyX25hbWUgPC0gcGFzdGUwKHN0YXRfbmFtZSwgIl8iLCBjb2xfbmFtZSkNCiAgICAgICAgDQogICAgICAgICMgQXR0ZW1wdCBudW1lcmljIGNvbnZlcnNpb24gZm9yIGRvd25zdHJlYW0gdXNlDQogICAgICAgIHZhbHVlIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGNvbF92YWx1ZXNbaV0pKSkNCiAgICAgICAgDQogICAgICAgICMgQXNzaWduIHRoZSB2YWx1ZSB0byB0aGUgZ2xvYmFsIGVudmlyb25tZW50DQogICAgICAgIGFzc2lnbih2YXJfbmFtZSwgdmFsdWUsIGVudmlyID0gLkdsb2JhbEVudikNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KIyBBcHBseSB0aGUgZnVuY3Rpb24gdG8gc2F2ZSB2YWx1ZXMgZHluYW1pY2FsbHkNCnNhdmVfY29sdW1uX3ZhbHVlcyhjdXN0b21fc3VtbWFyeSwgcm93X3RvX3Zhcl9uYW1lLCBjb2x1bW5fbmFtZV9tYXBwaW5nKQ0KDQojIEV4YW1wbGU6IEFjY2Vzc2luZyBkeW5hbWljYWxseSBjcmVhdGVkIHZhcmlhYmxlcw0KaW50ZXJhY3RpdmVfcGFzdGUoIlMmUCA1MDAgTWVhbjogIiwgbWVhbl92YWx1ZV9zcDUwMCkgICMgU2hvdWxkIHByaW50IHRoZSBtZWFuIHZhbHVlIGZvciBTJlAgNTAwDQppbnRlcmFjdGl2ZV9wcmludChwZXJjZW50X2Fib3ZlX3RhcmdldF9hZ2dyZXNzaXZlX3FxcSkgICMgU2hvdWxkIHByaW50IHRoZSBwZXJjZW50IGFib3ZlIGFnZ3Jlc3NpdmUgdGFyZ2V0IGZvciBRUVENCg0KDQpgYGANCg0KKipDb21wYXJpc29uIGluIEFubnVhbCBHcm93dGggUmF0ZXMgb2YgSW5kZXhlcyAoUyZQIDUwMCBhbmQgUVFRKSBPdmVyIGByIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDFgIFllYXJzIChgciBzdGFydF95ZWFyYC1gciBlbmRfeWVhcmApKio6IFFRUSBleGhpYml0cyB0aGUgaGlnaGVzdCBtZWFuIHJldHVybiBhdCBgciBtZWFuX3ZhbHVlX3FxcWAlLCBzdXJwYXNzaW5nIHRoZSBTJlAgNTAwJ3MgYHIgbWVhbl92YWx1ZV9zcDUwMGAlLCByZWZsZWN0aW5nIGl0cyBhZ2dyZXNzaXZlLCB0ZWNoLWZvY3VzZWQgY29tcG9zaXRpb24uIEl0cyBDQUdSIG9mIGByIGNhZ3JfdmFsdWVfcXFxYCUgc2lnbmlmaWNhbnRseSBvdXRwYWNlcyB0aGUgUyZQIDUwMCdzIGByIGNhZ3JfdmFsdWVfc3A1MDBgJSwgZnVydGhlciBlbXBoYXNpemluZyBRUVEncyBzdHJvbmcgZ3Jvd3RoIHBvdGVudGlhbC4gSG93ZXZlciwgUVFRIGFsc28gZGVtb25zdHJhdGVzIHRoZSBoaWdoZXN0IHZvbGF0aWxpdHkgd2l0aCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBgciBzZF92YWx1ZV9xcXFgJSwgY29tcGFyZWQgdG8gYHIgc2RfdmFsdWVfc3A1MDBgJSBmb3IgdGhlIFMmUCA1MDAsIHVuZGVyc2NvcmluZyBncmVhdGVyIHJpc2suIFRoZSByYW5nZSBvZiBleHBlY3RlZCByZXR1cm5zIChNZWFuIMKxIFNEKSBpcyB3aWRlc3QgZm9yIFFRUSAoYHIgbWluX2NhZ3JfcmFuZ2VfcXFxYCUgdG8gYHIgbWF4X2NhZ3JfcmFuZ2VfcXFxYCUpLiBNZWRpYW4gcmV0dXJucyBmdXJ0aGVyIHNob3djYXNlIFFRUSdzIGRvbWluYW5jZSAoYHIgbWVkaWFuX3ZhbHVlX3FxcWAlKSBvdmVyIHRoZSBTJlAgNTAwIChgciBtZWRpYW5fdmFsdWVfc3A1MDBgJSkuIFMmUCA1MDAsIHRob3VnaCBsZXNzIHZvbGF0aWxlLCBsYWdzIGluIHBlcmZvcm1hbmNlIHdpdGggdGhlIGxvd2VzdCBtYXhpbXVtIHJldHVybiAoYHIgbWF4X3ZhbHVlX3NwNTAwYCUpIGFuZCB0aGUgaGlnaGVzdCBwZXJjZW50YWdlIG9mIHllYXJzIGJlbG93IGluZmxhdGlvbiBhbmQgY29uc2VydmF0aXZlIHRhcmdldHMsIG1lZXRpbmcgdGhlIGFnZ3Jlc3NpdmUgYmVuY2htYXJrIG9ubHkgYHIgcGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9zcDUwMGAlIG9mIHRoZSB0aW1lIGNvbXBhcmVkIHRvIGByIHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfcXFxYCUgZm9yIHRoZSBRUVEuIFRoaXMgY29tcGFyaXNvbiB1bmRlcnNjb3JlcyBRUVEncyBhcHBlYWwgZm9yIGdyb3d0aC1vcmllbnRlZCBpbnZlc3RvcnMgZGVzcGl0ZSBoaWdoZXIgcmlzaywgd2hpbGUgUyZQIDUwMCBzdWl0cyB0aG9zZSBwcmlvcml0aXppbmcgc3RhYmlsaXR5Lg0KDQojIyMgR3JhcGggDQoNCiMjIyMgQUdSDQpgYGB7ciBpbmRleF9jb21wYXJpc29uX2dyX3YyX2dyYXBoLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQpjYXQoIlxuXG4jIyMjIEFubnVhbCBHcm93dGggUmF0ZXMgQnkgSW5kZXggXG4iKQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBDb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYyBmb3IgcGxvdHRpbmcgaWYgbmVlZGVkDQptZXJnZWRfZGF0YSA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIGBEYXRlYCA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGBEYXRlYCkpLCAgIyBFbnN1cmUgRGF0ZSBpcyBudW1lcmljDQogICAgYFMmUCA1MDBgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGBTJlAgNTAwYCkpLA0KICAgIGBRUVFgID0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGBRUVFgKSkNCiAgKQ0KDQojIFJlc2hhcGUgdGhlIGRhdGEgaW50byBsb25nIGZvcm1hdCBmb3IgZWFzeSBwbG90dGluZyBvZiBtdWx0aXBsZSBsaW5lcyBhbmQgc2V0IHRoZSBmYWN0b3Igb3JkZXINCm5ydF9sb25nIDwtIG1lcmdlZF9kYXRhICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYFMmUCA1MDBgLCBgUVFRYCksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJBR1JfSW5kZXgiLA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIkFHUl9WYWx1ZSIpICU+JQ0KICBtdXRhdGUoQUdSX0luZGV4ID0gZmFjdG9yKEFHUl9JbmRleCwgbGV2ZWxzID0gYygiUyZQIDUwMCIsICJRUVEiKSkpDQoNCiMgQXNzaWduIGNvbG9ycyBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgQUdSX0luZGV4IGluIHRoZSBkYXRhDQojIE1hdGNoIHRoZSB1bmlxdWUgbGV2ZWxzIG9mIEFHUl9JbmRleCB3aXRoIGNvbG9ycyBmcm9tIGNvbG9yc19nZW5lcmFsX2RhcmsNCnVuaXF1ZV90eXBlcyA8LSB1bmlxdWUobnJ0X2xvbmckQUdSX0luZGV4KQ0KY3VzdG9tX2NvbG9ycyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlcyldLCB1bmlxdWVfdHlwZXMpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB4LXZhbHVlIGluIHlvdXIgZGF0YQ0KbWF4X3ggPC0gbWF4KGFzLmludGVnZXIobWVyZ2VkX2RhdGEkRGF0ZSksIG5hLnJtID0gVFJVRSkNCm1pbl94IDwtIG1pbihhcy5pbnRlZ2VyKG1lcmdlZF9kYXRhJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihtZXJnZWRfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFBMT1QgRlVMTCBXSVRIT1VUIExJTUlUUw0KDQojIERlZmluZSBzdGFydCBhbmQgZW5kIHllYXJzDQpzdGFydF95ZWFyIDwtIG1pbl95ZWFyDQplbmRfeWVhciA8LSBtYXhfeWVhcg0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyAyKSAqIDIgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDIpICogMiAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiQW5udWFsIEdyb3d0aCBSYXRlcyBCeSBJbmRleCBPdmVyICIsIHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIkFubnVhbCBHcm93dGggUmF0ZXMgQnkgSW5kZXgsIERhdGEgUGVyaW9kICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KG5ydF9sb25nLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBBR1JfVmFsdWUsIGNvbG9yID0gQUdSX0luZGV4KSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMzApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBNYXJrZXQgSW5kZXgNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjI1LCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAyLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCiAgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCg0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gKzEuMTAsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiTWFya2V0IEluZGV4IiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIE1hcmtldCBJbmRleA0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDIpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciArIDIsIDIpICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogICkgKyANCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAgICAgICAgIyBMYXJnZXIgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeC1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCBzaXplID0gMTQpLCAgIyBMYXJnZXIgeC1heGlzIHRleHQNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0aXRsZSBzaXplDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQojIFByaW50IHRoZSBwbG90IA0KcHJpbnQocDEpDQoNCg0KYGBgDQoNCiMjIyMgT3V0cGVyZm9ybWFuY2UNCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9ncl92Ml9yYXRpb19ncmFwaCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBDb252ZXJ0IFMmUCA1MDAgYW5kIFFRUSBjb2x1bW5zIHRvIG51bWVyaWMNCm1lcmdlZF9kYXRhJGBTJlAgNTAwYCA8LSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgbWVyZ2VkX2RhdGEkYFMmUCA1MDBgKSkNCm1lcmdlZF9kYXRhJFFRUSA8LSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgbWVyZ2VkX2RhdGEkUVFRKSkNCg0KIyBDYWxjdWxhdGUgQUdSIERpZmZlcmVuY2UgKFNQWCAtIFFRUSkNCm1lcmdlZF9kYXRhJGBBR1IgRGlmZmVyZW5jZWAgPC0gbWVyZ2VkX2RhdGEkYFMmUCA1MDBgIC0gbWVyZ2VkX2RhdGEkUVFRDQptZXJnZWRfZGF0YSRgQUdSIERpZmZlcmVuY2VgIDwtIC1tZXJnZWRfZGF0YSRgQUdSIERpZmZlcmVuY2VgDQptZXJnZWRfZGF0YSREaXJlY3Rpb24gPC0gaWZlbHNlKG1lcmdlZF9kYXRhJGBBR1IgRGlmZmVyZW5jZWAgPiAwLCAiUVFRIiwgIlNQWCIpDQoNCiMgQ3JlYXRlIGEgYmFzZWxpbmUgd2lkdGggZm9yIHRoZSB5ZWFyDQpiYXNlbGluZV93aWR0aCA8LSAwLjENCm1lcmdlZF9kYXRhJExlZnRfQmFyIDwtIGlmZWxzZShtZXJnZWRfZGF0YSRgQUdSIERpZmZlcmVuY2VgIDwgMCwgbWVyZ2VkX2RhdGEkYEFHUiBEaWZmZXJlbmNlYCwgLWJhc2VsaW5lX3dpZHRoKQ0KbWVyZ2VkX2RhdGEkUmlnaHRfQmFyIDwtIGlmZWxzZShtZXJnZWRfZGF0YSRgQUdSIERpZmZlcmVuY2VgID4gMCwgbWVyZ2VkX2RhdGEkYEFHUiBEaWZmZXJlbmNlYCwgYmFzZWxpbmVfd2lkdGgpDQptZXJnZWRfZGF0YSRZZWFyX1Bvc2l0aW9uIDwtIGlmZWxzZShtZXJnZWRfZGF0YSRgQUdSIERpZmZlcmVuY2VgID4gMCwgLWJhc2VsaW5lX3dpZHRoICogMS41LCBiYXNlbGluZV93aWR0aCAqIDEuNSkNCg0KIyBEeW5hbWljYWxseSBhc3NpZ24gY29sb3JzIGZyb20gY29sb3JzX2dlbmVyYWxfZGFyayB0byB1bmlxdWUgbGV2ZWxzIG9mIERpcmVjdGlvbg0KY29sb3JfbWFwcGluZyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZShtZXJnZWRfZGF0YSREaXJlY3Rpb24pKV0sIHVuaXF1ZShtZXJnZWRfZGF0YSREaXJlY3Rpb24pKQ0KDQojIEhvcml6b250YWwgQmFyIENoYXJ0IHdpdGggRHluYW1pYyBDb2xvcnMNCmdncGxvdCgpICsNCiAgDQogICMgTGVmdCBiYXJzIChTUFgpDQogIGdlb21fYmFyKGRhdGEgPSBtZXJnZWRfZGF0YSwgYWVzKHggPSBhcy5mYWN0b3IoRGF0ZSksIHkgPSBMZWZ0X0JhciwgZmlsbCA9IERpcmVjdGlvbiksIA0KICAgICAgICAgICBzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuNykgKw0KICAjIFJpZ2h0IGJhcnMgKFFRUSkNCiAgZ2VvbV9iYXIoZGF0YSA9IG1lcmdlZF9kYXRhLCBhZXMoeCA9IGFzLmZhY3RvcihEYXRlKSwgeSA9IFJpZ2h0X0JhciwgZmlsbCA9IERpcmVjdGlvbiksIA0KICAgICAgICAgICBzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuNykgKw0KICAjIEFkZCB5ZWFyIGxhYmVscyBkeW5hbWljYWxseSBiYXNlZCBvbiB0aGUgc2lkZQ0KICBnZW9tX3RleHQoZGF0YSA9IG1lcmdlZF9kYXRhLCBhZXMoeCA9IGFzLmZhY3RvcihEYXRlKSwgeSA9IFllYXJfUG9zaXRpb24sIGxhYmVsID0gRGF0ZSksIA0KICAgICAgICAgICAgdmp1c3QgPSAwLjQsIGhqdXN0ID0gaWZlbHNlKG1lcmdlZF9kYXRhJGBBR1IgRGlmZmVyZW5jZWAgPiAwLCAxLjEsIC0wLjEpLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSA0KSArDQogIA0KICAjIEFkZCBBR1IgRGlmZmVyZW5jZSB2YWx1ZXMgb24gdGhlIHNpZGUgb2YgdGhlIGJhcg0KICBnZW9tX3RleHQoZGF0YSA9IG1lcmdlZF9kYXRhLCBhZXMoeCA9IGFzLmZhY3RvcihEYXRlKSwgeSA9IGBBR1IgRGlmZmVyZW5jZWAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBzcHJpbnRmKCIlLjJmJSUiLCBhYnMoYEFHUiBEaWZmZXJlbmNlYCkpKSwNCiAgICAgICAgICAgIGhqdXN0ID0gaWZlbHNlKG1lcmdlZF9kYXRhJGBBR1IgRGlmZmVyZW5jZWAgPiAwLCAtMC4xLCAxLjEpLCAgIyBBbGlnbiB0ZXh0IGR5bmFtaWNhbGx5DQogICAgICAgICAgICB2anVzdCA9IDAuNCwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMy41KSArDQoNCiAgIyBVc2UgZHluYW1pY2FsbHkgYXNzaWduZWQgY29sb3JzDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX21hcHBpbmcpICsNCiAgDQogICMgQWRqdXN0IFgtYXhpcyByYW5nZSB3aXRoIGV4cGFuZGVkIGxpbWl0cw0KICBjb29yZF9mbGlwKHlsaW0gPSBjKC0zMCwgMzApKSArICAjIEV4cGFuZGVkIHJhbmdlIHRvIHByZXZlbnQgY3V0b2ZmDQoNCiAgICBsYWJzKA0KICAgIHRpdGxlID0gIkFHUiBEaWZmZXJlbmNlIEJldHdlZW4gU1BYIGFuZCBRUVEgT3ZlciBUaW1lIiwNCiAgICBzdWJ0aXRsZSA9ICJOZWdhdGl2ZSBWYWx1ZXMgSW5kaWNhdGUgU1BYOyBQb3NpdGl2ZSBWYWx1ZXMgSW5kaWNhdGUgUVFRIiwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiQUdSIERpZmZlcmVuY2UgKCUpIiwNCiAgICBmaWxsID0gIk91dHBlcmZvcm1hbmNlIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLCANCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udCAgICAgDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksICAjIFJlbW92ZSB5LWF4aXMgdGl0bGUNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwgIyBSZW1vdmUgeS1heGlzIHRleHQNCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksICMgUmVtb3ZlIHktYXhpcyB0aWNrcw0KICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwgIyBSZW1vdmUgaG9yaXpvbnRhbCBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAuMDIsIDAuOTgpLCAgIyBNb3ZlIGxlZ2VuZCB0byB0b3AtbGVmdCBjb3JuZXINCiAgICBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksICAjIEFsaWduIGxlZ2VuZCB0byB0aGUgaW5zaWRlIGJvcmRlcg0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICMgTm8gbWlub3IgeCBncmlkIGxpbmVzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAuNSwgMSwgMC41LCAxKSwgImNtIikNCiAgKQ0KDQoNCg0KYGBgDQoNClRoZSBmaXJzdCBncmFwaCBoaWdobGlnaHRzIGFubnVhbCBncm93dGggcmF0ZXMgKEFHUikgZm9yIFMmUCA1MDAgYW5kIFFRUSBvdmVyIGEgYHIgZW5kX3llYXIgLSBzdGFydF95ZWFyICsgMWAteWVhciBwZXJpb2QsIGRlbW9uc3RyYXRpbmcgdGhlIHZvbGF0aWxpdHkgYW5kIHZhcmlhYmlsaXR5IG9mIGJvdGggaW5kZXhlcy4gUVFRIGNvbnNpc3RlbnRseSBzaG93cyBsYXJnZXIgc3dpbmdzLCBib3RoIGFib3ZlIGFuZCBiZWxvdyB0aGUgYWdncmVzc2l2ZSBiZW5jaG1hcmssIHJlZmxlY3RpdmUgb2YgaXRzIHRlY2gtaGVhdnkgYW5kIGhpZ2gtZ3Jvd3RoIG5hdHVyZSwgd2hpbGUgdGhlIFMmUCA1MDAgZXhoaWJpdHMgc3RlYWRpZXIgcGVyZm9ybWFuY2Ugd2l0aCBmZXdlciBleHRyZW1lIG91dGxpZXJzLiBUaGUgc2Vjb25kIGdyYXBoIGNvbXBhcmVzIHRoZSBBR1IgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIGluZGV4ZXMsIGlsbHVzdHJhdGluZyBwZXJpb2RzIHdoZW4gUVFRIG91dHBlcmZvcm1lZCAoYmx1ZSBiYXJzKSBvciB1bmRlcnBlcmZvcm1lZCAob3JhbmdlIGJhcnMpIHRoZSBTJlAgNTAwLiBOb3RhYmx5LCBRUVEncyBkb21pbmFuY2UgaXMgZXZpZGVudCBpbiB0aGUgbW9zdCByZWNlbnQgeWVhcnMgKGUuZy4sIDIwMjQgYW5kIDIwMjEpLCB3aGVyZSBpdCBzaWduaWZpY2FudGx5IG91dHBlcmZvcm1lZCwgd2hpbGUgZWFybGllciBwZXJpb2RzIGxpa2UgMjAwMSB0aHJ1IDIwMjMgc2hvdyBub3RhYmxlIHVuZGVycGVyZm9ybWFuY2UgY29tcGFyZWQgdG8gdGhlIFMmUCA1MDAuIA0KDQojIyBDdW11bGF0aXZlIEdyb3d0aCANCg0KIyMjIERhdGENCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9jZ192MiwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyeQ0KbGlicmFyeShkcGx5cikNCg0KIyBTdGVwIDE6IENvbnZlcnQgcGVyY2VudGFnZXMgdG8gbnVtZXJpYyB2YWx1ZXMgKGNvbHVtbnMgMjozKQ0KY3VtdWxhdGl2ZV9kYXRhIDwtIG1lcmdlZF9kYXRhICU+JQ0KICBtdXRhdGUoDQogICAgYWNyb3NzKDI6MywgfiBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgLikpIC8gMTAwKSAjIENvbnZlcnQgcGVyY2VudGFnZSBzdHJpbmdzIHRvIG51bWVyaWMNCiAgKQ0KDQojIFN0ZXAgMjogRW5zdXJlIHRoZSBgRGF0ZWAgY29sdW1uIGlzIHRyZWF0ZWQgYXMgYW4gaW50ZWdlcg0KY3VtdWxhdGl2ZV9kYXRhIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgbXV0YXRlKERhdGUgPSBhcy5pbnRlZ2VyKERhdGUpKQ0KDQojIFN0ZXAgMzogQWRkIHRoZSBpbml0aWFsIHZhbHVlIGZvciAyMDAwDQpjdW11bGF0aXZlX2RhdGEgPC0gYmluZF9yb3dzKA0KICBkYXRhLmZyYW1lKERhdGUgPSAyMDAwLCBgUyZQIDUwMGAgPSAwLCBRUVEgPSAwKSwgIyBTZXQgZ3Jvd3RoIHJhdGVzIGZvciAyMDAwIHRvIDANCiAgY3VtdWxhdGl2ZV9kYXRhDQopDQoNCiMgU3RlcCA0OiBTb3J0IGJ5IERhdGUgYXNjZW5kaW5nIGZvciBwcm9wZXIgY3VtdWxhdGl2ZSBjYWxjdWxhdGlvbg0KY3VtdWxhdGl2ZV9kYXRhIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgYXJyYW5nZShEYXRlKQ0KDQojIFN0ZXAgNTogSW5pdGlhbGl6ZSB0aGUgc3RhcnRpbmcgdmFsdWUNCnN0YXJ0aW5nX3ZhbHVlIDwtIDEwMA0KDQojIFN0ZXAgNjogQ2FsY3VsYXRlIGN1bXVsYXRpdmUgZ3Jvd3RoDQpjdW11bGF0aXZlX2RhdGEgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBtdXRhdGUoDQogICAgYFMmUCA1MDBgID0gc3RhcnRpbmdfdmFsdWUgKiBjdW1wcm9kKDEgKyByZXBsYWNlX25hKGBTJlAgNTAwYCwgMCkpLCAjIFJlcGxhY2UgTkEgd2l0aCAwIGZvciBwcm9wZXIgY2FsY3VsYXRpb24NCiAgICBRUVEgPSBzdGFydGluZ192YWx1ZSAqIGN1bXByb2QoMSArIHJlcGxhY2VfbmEoUVFRLCAwKSkNCiAgKQ0KDQojIFN0ZXAgNzogUmVwbGFjZSBpbml0aWFsIGdyb3d0aCByYXRlcyBmb3IgMjAwMCB3aXRoICQxMDAgZXhwbGljaXRseQ0KY3VtdWxhdGl2ZV9kYXRhIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgbXV0YXRlKGFjcm9zcygyOjMsIH4gaWZlbHNlKERhdGUgPT0gMjAwMCwgMTAwLCAuKSkpDQoNCiMgU3RlcCA4OiBSZW9yZGVyIGNvbHVtbnMgYXMgRGF0ZSwgUyZQIDUwMCwgUVFRDQpjdW11bGF0aXZlX2RhdGEgPC0gY3VtdWxhdGl2ZV9kYXRhICU+JQ0KICBzZWxlY3QoRGF0ZSwgYFMmUCA1MDBgLCBRUVEpDQoNCiMgU3RlcCA5OiBSb3VuZCB2YWx1ZXMgdG8gMiBkZWNpbWFsIHBsYWNlcw0KY3VtdWxhdGl2ZV9kYXRhIDwtIGN1bXVsYXRpdmVfZGF0YSAlPiUNCiAgbXV0YXRlKGFjcm9zcygyOjMsIH4gcm91bmQoLiwgMikpKQ0KDQojIFN0ZXAgMTA6IFNvcnQgYnkgRGF0ZSBkZXNjZW5kaW5nIGZvciBwcmVzZW50YXRpb24NCmN1bXVsYXRpdmVfZGF0YSA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIGFycmFuZ2UoZGVzYyhEYXRlKSkNCg0KIyBGb3JtYXQgdGhlIHRhYmxlIHdpdGhvdXQgYWRkaW5nIGNvbW1hcyB0byB0aGUgRGF0ZSBjb2x1bW4NCmN1bXVsYXRpdmVfZGF0YSREYXRlIDwtIGFzLmNoYXJhY3RlcihjdW11bGF0aXZlX2RhdGEkRGF0ZSkgICMgRW5zdXJlIERhdGUgaXMgYSBjaGFyYWN0ZXIgd2l0aG91dCBjb21tYXMNCmN1bXVsYXRpdmVfZGF0YSRgUyZQIDUwMGAgPC0gZm9ybWF0QyhjdW11bGF0aXZlX2RhdGEkYFMmUCA1MDBgLCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpDQpjdW11bGF0aXZlX2RhdGEkUVFRIDwtIGZvcm1hdEMoY3VtdWxhdGl2ZV9kYXRhJFFRUSwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKQ0KDQojIFByaW50IHRoZSBjdW11bGF0aXZlIGdyb3d0aCB0YWJsZQ0KY2F0KCJcblxuIyMjIyBDdW11bGF0aXZlIEdyb3d0aCBSYXRlcyAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmludGVyYWN0aXZlX3ByaW50KGN1bXVsYXRpdmVfZGF0YSkNCmludGVyYWN0aXZlX3N0cihjdW11bGF0aXZlX2RhdGEpDQpmb3JtYXRfZXF1YWxfd2lkdGgoY3VtdWxhdGl2ZV9kYXRhKQ0KDQoNCmBgYA0KDQpUaGUgdGFibGUgYW5kIGdyYXBoIGJlbG93IHNob3cgdGhlIGltcGFjdCBvZiB0aGUgYW5udWFsIGdyb3d0aCByYXRlcywgY29tcGFyaW5nIHRoZSBjdW11bGF0aXZlIGdyb3d0aCBvZiB0aGUgUyZQIDUwMCBhbmQgUVFRIGluZGV4ZXMgb3ZlciBhIGByIHllYXJfcmFuZ2VgLXllYXIgcGVyaW9kIGZyb20gYHIgc3RhcnRfeWVhcmAgdG8gYHIgZW5kX3llYXJgLCBzdGFydGluZyB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgJDEwMCBwZXIgMTAwJS4gDQoNCiMjIyBHcmFwaCANCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl9jZ192Ml9ncmFwaCwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KY2F0KCJcblxuIyMjIyBDdW11bGF0aXZlIEdyb3d0aCBCeSBJbmRleCBcbiIpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIENvbnZlcnQgY29sdW1ucyB0byBudW1lcmljIGZvciBwbG90dGluZyBpZiBuZWVkZWQNCmN1bXVsYXRpdmVfZGF0YSA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBgRGF0ZWAgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihgRGF0ZWApKSwgICMgRW5zdXJlIERhdGUgaXMgbnVtZXJpYw0KICAgIGBTJlAgNTAwYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgUyZQIDUwMGApKSwNCiAgICBgUVFRYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgUVFRYCkpDQogICkNCg0KIyBSZXNoYXBlIHRoZSBkYXRhIGludG8gbG9uZyBmb3JtYXQgZm9yIGVhc3kgcGxvdHRpbmcgb2YgbXVsdGlwbGUgbGluZXMgYW5kIHNldCB0aGUgZmFjdG9yIG9yZGVyDQpucnRfbG9uZyA8LSBjdW11bGF0aXZlX2RhdGEgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgUyZQIDUwMGAsIGBRUVFgKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkNHX0luZGV4IiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJDR19WYWx1ZSIpICU+JQ0KICBtdXRhdGUoQ0dfSW5kZXggPSBmYWN0b3IoQ0dfSW5kZXgsIGxldmVscyA9IGMoIlMmUCA1MDAiLCAiUVFRIikpKQ0KDQojIEFzc2lnbiBjb2xvcnMgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIG9yZGVyIG9mIENHX0luZGV4IGluIHRoZSBkYXRhDQojIE1hdGNoIHRoZSB1bmlxdWUgbGV2ZWxzIG9mIENHX0luZGV4IHdpdGggY29sb3JzIGZyb20gY29sb3JzX2dlbmVyYWxfZGFyaw0KdW5pcXVlX3R5cGVzIDwtIHVuaXF1ZShucnRfbG9uZyRDR19JbmRleCkNCmN1c3RvbV9jb2xvcnMgPC0gc2V0TmFtZXMoY29sb3JzX2dlbmVyYWxfZGFya1sxOmxlbmd0aCh1bmlxdWVfdHlwZXMpXSwgdW5pcXVlX3R5cGVzKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geC12YWx1ZSBpbiB5b3VyIGRhdGENCm1heF94IDwtIG1heChhcy5pbnRlZ2VyKGN1bXVsYXRpdmVfZGF0YSREYXRlKSwgbmEucm0gPSBUUlVFKQ0KbWluX3ggPC0gbWluKGFzLmludGVnZXIoY3VtdWxhdGl2ZV9kYXRhJERhdGUpLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeCkgICMgVGVzdA0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3gpICAjIFRlc3QNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihjdW11bGF0aXZlX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KGN1bXVsYXRpdmVfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gbWluX3llYXINCmVuZF95ZWFyIDwtIG1heF95ZWFyDQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDIpICogMiAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDINCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gMikgKiAyICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiAyDQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJDdW11bGF0aXZlIEdyb3d0aCBCeSBJbmRleCBPdmVyICIsIHllYXJfcmFuZ2UgLSAxLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJDdW11bGF0aXZlIEdyb3d0aCBCeSBJbmRleCwgRGF0YSBQZXJpb2QgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCg0KIyBDcmVhdGUgdGhlIGZ1bGwsIG5vbi1maWx0ZXJlZCB4LWF4aXMgcGxvdCB3aXRoIGR5bmFtaWMgeCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQpwMSA8LSBnZ3Bsb3QobnJ0X2xvbmcsIGFlcyh4ID0gYXMuaW50ZWdlcihEYXRlKSwgeSA9IENHX1ZhbHVlLCBjb2xvciA9IENHX0luZGV4KSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IDEwMCwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMjUpICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSAxMDApLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDI1KSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggQ0cgSW5kZXgNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjI1LCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0cNCiAgZ2VvbV9wb2ludChzaXplID0gMi4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDRw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDRyBWYWx1ZSAoMSQgLyAxJSkiLA0KICAgIGNvbG9yID0gIkNHIEluZGV4IiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIENHIEluZGV4DQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMSksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyICsgMSwgMikgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgKSArIA0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KDQpgYGANCg0KVGhpcyBncmFwaCBkZXBpY3RzIHRoZSBjdW11bGF0aXZlIGdyb3d0aCBvZiB0aGUgUyZQIDUwMCAoU1BYKSBhbmQgUVFRIG92ZXIgYSBgciBlbmRfeWVhciAtIHN0YXJ0X3llYXJgLXllYXIgcGVyaW9kIChgciBzdGFydF95ZWFyYCDigJMgYHIgZW5kX3llYXJgKS4gSW5pdGlhbGx5LCBRUVEgdW5kZXJwZXJmb3JtZWQgb24gYSBjdW11bGF0aXZlIGJhc2lzLCBwYXJ0aWN1bGFybHkgZHVyaW5nIHRoZSBkb3QtY29tIGJ1YmJsZSBidXJzdCBpbiB0aGUgZWFybHkgMjAwMHMgYW5kIHRoZSAyMDA4IGZpbmFuY2lhbCBjcmlzaXMsIHdoaWNoIHNpZ25pZmljYW50bHkgaW1wYWN0ZWQgaXRzIHRlY2gtaGVhdnkgY29tcG9zaXRpb24uIERlc3BpdGUgdGhlc2Ugc2V0YmFja3MsIGFzIHRpbWUgcHJvZ3Jlc3NlZCwgUVFRIG91dHBlcmZvcm1lZCB0aGUgUyZQIDUwMCwgcmVmbGVjdGluZyBpdHMgc3Ryb25nIHJlY292ZXJ5IGFuZCBkb21pbmFuY2UgZHVyaW5nIHRoZSB0ZWNoIGJvb20gb2YgdGhlIDIwMTBzIGFuZCBiZXlvbmQuIFRoaXMgZ3JhcGggZXhlbXBsaWZpZXMgaG93IHRpbWluZyBpbXBhY3RzIHBlcmZvcm1hbmNlLCBoaWdobGlnaHRpbmcgdGhlIGltcG9ydGFuY2Ugb2YgYW5hbHl6aW5nIGdyb3d0aCBvdmVyIHNob3J0LXRlcm0sIGludGVybWVkaWF0ZSwgYW5kIGxvbmctdGVybSBwZXJpb2RzIHRvIHVuZGVyc3RhbmQgdGhlIHZhcnlpbmcgcmlzay1yZXR1cm4gZHluYW1pY3MgYW5kIHRoZSBpbmZsdWVuY2Ugb2YgbWFqb3IgZWNvbm9taWMgZXZlbnRzLg0KDQo8IS0tIA0KIyMgQ0FHUiBSb2xsaW5nIFBlcmlvZHMgDQoNCiMjIyBBdmVyYWdlcw0KDQojIyMjIERhdGENCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fY2Fncl9hdmVyYWdlc19zdW1tYXJ5LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgRGVmaW5lIGEgZnVuY3Rpb24gdG8gZmlsdGVyIGRhdGFzZXRzIGZvciB2YWxpZCBkYXRhIGluIGVhY2ggcm9sbGluZyBDQUdSIHBlcmlvZCBhbmQgd2l0aGluIG1pbi9tYXggeWVhciByYW5nZQ0KZmlsdGVyX2RhdGFfZm9yX3BlcmlvZCA8LSBmdW5jdGlvbihkYXRhLCBjb2x1bW5fbmFtZSwgbWluX3llYXIsIG1heF95ZWFyKSB7DQogIGRhdGEgPC0gZGF0YVshaXMubmEoZGF0YVtbY29sdW1uX25hbWVdXSksIF0NCiAgZGF0YSA8LSBkYXRhW2RhdGEkRGF0ZSA+PSBtaW5feWVhciAmIGRhdGEkRGF0ZSA8PSBtYXhfeWVhciwgXQ0KICByZXR1cm4oZGF0YSkNCn0NCg0KIyBGaWx0ZXIgZGF0YXNldHMgZm9yIGVhY2ggcm9sbGluZyBwZXJpb2QNCmZpbHRlcmVkX3NwNTAwXzF5ciA8LSBmaWx0ZXJfZGF0YV9mb3JfcGVyaW9kKG5ydCRzcDUwMF9yYXdfY2FnciwgIjEtWWVhciBDQUdSIiwgbWluX3llYXIsIG1heF95ZWFyKQ0KZmlsdGVyZWRfc3A1MDBfNXlyIDwtIGZpbHRlcl9kYXRhX2Zvcl9wZXJpb2QobnJ0JHNwNTAwX3Jhd19jYWdyLCAiNS1ZZWFyIENBR1IiLCBtaW5feWVhciwgbWF4X3llYXIpDQpmaWx0ZXJlZF9zcDUwMF8xMHlyIDwtIGZpbHRlcl9kYXRhX2Zvcl9wZXJpb2QobnJ0JHNwNTAwX3Jhd19jYWdyLCAiMTAtWWVhciBDQUdSIiwgbWluX3llYXIsIG1heF95ZWFyKQ0KZmlsdGVyZWRfc3A1MDBfMjB5ciA8LSBmaWx0ZXJfZGF0YV9mb3JfcGVyaW9kKG5ydCRzcDUwMF9yYXdfY2FnciwgIjIwLVllYXIgQ0FHUiIsIG1pbl95ZWFyLCBtYXhfeWVhcikNCg0KZmlsdGVyZWRfcXFxXzF5ciA8LSBmaWx0ZXJfZGF0YV9mb3JfcGVyaW9kKG5ydCRxcXFfcmF3X2NhZ3IsICIxLVllYXIgQ0FHUiIsIG1pbl95ZWFyLCBtYXhfeWVhcikNCmZpbHRlcmVkX3FxcV81eXIgPC0gZmlsdGVyX2RhdGFfZm9yX3BlcmlvZChucnQkcXFxX3Jhd19jYWdyLCAiNS1ZZWFyIENBR1IiLCBtaW5feWVhciwgbWF4X3llYXIpDQpmaWx0ZXJlZF9xcXFfMTB5ciA8LSBmaWx0ZXJfZGF0YV9mb3JfcGVyaW9kKG5ydCRxcXFfcmF3X2NhZ3IsICIxMC1ZZWFyIENBR1IiLCBtaW5feWVhciwgbWF4X3llYXIpDQpmaWx0ZXJlZF9xcXFfMjB5ciA8LSBmaWx0ZXJfZGF0YV9mb3JfcGVyaW9kKG5ydCRxcXFfcmF3X2NhZ3IsICIyMC1ZZWFyIENBR1IiLCBtaW5feWVhciwgbWF4X3llYXIpDQoNCiMgRW5zdXJlIG1hdGNoaW5nIGRhdGVzIGZvciBlYWNoIHJvbGxpbmcgcGVyaW9kDQpjb21tb25fZGF0ZXNfMXlyIDwtIGludGVyc2VjdChmaWx0ZXJlZF9zcDUwMF8xeXIkRGF0ZSwgZmlsdGVyZWRfcXFxXzF5ciREYXRlKQ0KY29tbW9uX2RhdGVzXzV5ciA8LSBpbnRlcnNlY3QoZmlsdGVyZWRfc3A1MDBfNXlyJERhdGUsIGZpbHRlcmVkX3FxcV81eXIkRGF0ZSkNCmNvbW1vbl9kYXRlc18xMHlyIDwtIGludGVyc2VjdChmaWx0ZXJlZF9zcDUwMF8xMHlyJERhdGUsIGZpbHRlcmVkX3FxcV8xMHlyJERhdGUpDQpjb21tb25fZGF0ZXNfMjB5ciA8LSBpbnRlcnNlY3QoZmlsdGVyZWRfc3A1MDBfMjB5ciREYXRlLCBmaWx0ZXJlZF9xcXFfMjB5ciREYXRlKQ0KDQojIEZpbHRlciBkYXRhc2V0cyB0byBpbmNsdWRlIG9ubHkgbWF0Y2hpbmcgZGF0ZXMgZm9yIGVhY2ggcGVyaW9kDQpmaWx0ZXJlZF9zcDUwMF8xeXIgPC0gZmlsdGVyZWRfc3A1MDBfMXlyW2ZpbHRlcmVkX3NwNTAwXzF5ciREYXRlICVpbiUgY29tbW9uX2RhdGVzXzF5ciwgXQ0KZmlsdGVyZWRfcXFxXzF5ciA8LSBmaWx0ZXJlZF9xcXFfMXlyW2ZpbHRlcmVkX3FxcV8xeXIkRGF0ZSAlaW4lIGNvbW1vbl9kYXRlc18xeXIsIF0NCg0KZmlsdGVyZWRfc3A1MDBfNXlyIDwtIGZpbHRlcmVkX3NwNTAwXzV5cltmaWx0ZXJlZF9zcDUwMF81eXIkRGF0ZSAlaW4lIGNvbW1vbl9kYXRlc181eXIsIF0NCmZpbHRlcmVkX3FxcV81eXIgPC0gZmlsdGVyZWRfcXFxXzV5cltmaWx0ZXJlZF9xcXFfNXlyJERhdGUgJWluJSBjb21tb25fZGF0ZXNfNXlyLCBdDQoNCmZpbHRlcmVkX3NwNTAwXzEweXIgPC0gZmlsdGVyZWRfc3A1MDBfMTB5cltmaWx0ZXJlZF9zcDUwMF8xMHlyJERhdGUgJWluJSBjb21tb25fZGF0ZXNfMTB5ciwgXQ0KZmlsdGVyZWRfcXFxXzEweXIgPC0gZmlsdGVyZWRfcXFxXzEweXJbZmlsdGVyZWRfcXFxXzEweXIkRGF0ZSAlaW4lIGNvbW1vbl9kYXRlc18xMHlyLCBdDQoNCmZpbHRlcmVkX3NwNTAwXzIweXIgPC0gZmlsdGVyZWRfc3A1MDBfMjB5cltmaWx0ZXJlZF9zcDUwMF8yMHlyJERhdGUgJWluJSBjb21tb25fZGF0ZXNfMjB5ciwgXQ0KZmlsdGVyZWRfcXFxXzIweXIgPC0gZmlsdGVyZWRfcXFxXzIweXJbZmlsdGVyZWRfcXFxXzIweXIkRGF0ZSAlaW4lIGNvbW1vbl9kYXRlc18yMHlyLCBdDQoNCiMgRGV0ZXJtaW5lIHRoZSBtaW4gYW5kIG1heCB5ZWFycyBmb3IgZWFjaCByb2xsaW5nIHBlcmlvZA0KeWVhcl9yYW5nZXMgPC0gYygNCiAgcGFzdGUwKG1pbihjb21tb25fZGF0ZXNfMXlyKSwgIi0iLCBtYXgoY29tbW9uX2RhdGVzXzF5cikpLA0KICBwYXN0ZTAobWluKGNvbW1vbl9kYXRlc181eXIpLCAiLSIsIG1heChjb21tb25fZGF0ZXNfNXlyKSksDQogIHBhc3RlMChtaW4oY29tbW9uX2RhdGVzXzEweXIpLCAiLSIsIG1heChjb21tb25fZGF0ZXNfMTB5cikpLA0KICBwYXN0ZTAobWluKGNvbW1vbl9kYXRlc18yMHlyKSwgIi0iLCBtYXgoY29tbW9uX2RhdGVzXzIweXIpKQ0KKQ0KDQojIENhbGN1bGF0ZSB0aGUgbWVhbiBzdW1tYXJ5IGZvciBTJlAgNTAwIGFuZCBRUVENCnN1bW1hcnlfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBNZXRyaWMgPSBjKCIxLVllYXIgQ0FHUiIsICI1LVllYXIgQ0FHUiIsICIxMC1ZZWFyIENBR1IiLCAiMjAtWWVhciBDQUdSIiksDQogIGBTJlAgNTAwYCA9IGMoDQogICAgbWVhbihmaWx0ZXJlZF9zcDUwMF8xeXIkYDEtWWVhciBDQUdSYCwgbmEucm0gPSBUUlVFKSwNCiAgICBtZWFuKGZpbHRlcmVkX3NwNTAwXzV5ciRgNS1ZZWFyIENBR1JgLCBuYS5ybSA9IFRSVUUpLA0KICAgIG1lYW4oZmlsdGVyZWRfc3A1MDBfMTB5ciRgMTAtWWVhciBDQUdSYCwgbmEucm0gPSBUUlVFKSwNCiAgICBtZWFuKGZpbHRlcmVkX3NwNTAwXzIweXIkYDIwLVllYXIgQ0FHUmAsIG5hLnJtID0gVFJVRSkNCiAgKSwNCiAgUVFRID0gYygNCiAgICBtZWFuKGZpbHRlcmVkX3FxcV8xeXIkYDEtWWVhciBDQUdSYCwgbmEucm0gPSBUUlVFKSwNCiAgICBtZWFuKGZpbHRlcmVkX3FxcV81eXIkYDUtWWVhciBDQUdSYCwgbmEucm0gPSBUUlVFKSwNCiAgICBtZWFuKGZpbHRlcmVkX3FxcV8xMHlyJGAxMC1ZZWFyIENBR1JgLCBuYS5ybSA9IFRSVUUpLA0KICAgIG1lYW4oZmlsdGVyZWRfcXFxXzIweXIkYDIwLVllYXIgQ0FHUmAsIG5hLnJtID0gVFJVRSkNCiAgKSwNCiAgYFJhbmdlYCA9IHllYXJfcmFuZ2VzLA0KICBjaGVjay5uYW1lcyA9IEZBTFNFICMgUHJldmVudCBSIGZyb20gYWx0ZXJpbmcgY29sdW1uIG5hbWVzDQopDQoNCiMgQ2FsY3VsYXRlIHRoZSBSYXRpbyBjb2x1bW4gKFMmUCA1MDAgLyBRUVEpDQpzdW1tYXJ5X2RhdGEkUmF0aW8gPC0gTkEgICMgSW5pdGlhbGl6ZSB0aGUgUmF0aW8gY29sdW1uIHdpdGggTkEgdmFsdWVzDQpmb3IgKGkgaW4gc2VxX2xlbihucm93KHN1bW1hcnlfZGF0YSkpKSB7DQogIHNwNTAwX3ZhbCA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBzdW1tYXJ5X2RhdGEkYFMmUCA1MDBgW2ldKSkpDQogIHFxcV92YWwgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgc3VtbWFyeV9kYXRhJFFRUVtpXSkpKQ0KICANCiAgaWYgKCFpcy5uYShzcDUwMF92YWwpICYmICFpcy5uYShxcXFfdmFsKSAmJiBxcXFfdmFsICE9IDApIHsNCiAgICBzdW1tYXJ5X2RhdGEkUmF0aW9baV0gPC0gcm91bmQoKHNwNTAwX3ZhbCAvIHFxcV92YWwpLCAyKSAgIyBDYWxjdWxhdGUgYW5kIHN0b3JlIHRoZSByYXRpbw0KICB9DQp9DQoNCiMgRm9ybWF0IFMmUCA1MDAsIFFRUSwgYW5kIFJhdGlvIGNvbHVtbnMNCmlmIChucm93KHN1bW1hcnlfZGF0YSkgPiAwKSB7DQogIHN1bW1hcnlfZGF0YSRgUyZQIDUwMGAgPC0gc3ByaW50ZigiJS4yZiUlIiwgc3VtbWFyeV9kYXRhJGBTJlAgNTAwYCkNCiAgc3VtbWFyeV9kYXRhJFFRUSA8LSBzcHJpbnRmKCIlLjJmJSUiLCBzdW1tYXJ5X2RhdGEkUVFRKQ0KICBzdW1tYXJ5X2RhdGEkUmF0aW8gPC0gc3ByaW50ZigiJS4yZiIsIHN1bW1hcnlfZGF0YSRSYXRpbykgICMgS2VlcCB0aGUgcmF0aW8gYXMgYSBudW1lcmljIHN0cmluZw0KfSBlbHNlIHsNCiAgc3RvcCgiTm8gZGF0YSB0byBzdW1tYXJpemUgb3Igcm93cyBkbyBub3QgbWF0Y2guIikNCn0NCg0KIyBSZW9yZGVyIGNvbHVtbnMgdG8gTWV0cmljIC8gUyZQIDUwMCAvIFFRUSAvIFJhdGlvIC8gUmFuZ2UNCnN1bW1hcnlfZGF0YSA8LSBzdW1tYXJ5X2RhdGFbLCBjKCJNZXRyaWMiLCAiUyZQIDUwMCIsICJRUVEiLCAiUmF0aW8iLCAiUmFuZ2UiKV0NCg0KIyBEaXNwbGF5IHRoZSB1cGRhdGVkIHN1bW1hcnkgd2l0aCB0aGUgUmF0aW8gY29sdW1uDQpjYXQoIlxuXG4jIyMjIEF2ZXJhZ2UgUm9sbGluZyBDQUdScyBieSBJbmRleCB3aXRoIFJhdGlvOiBEYXRhIFBlcmlvZCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmludGVyYWN0aXZlX3N0cihzdW1tYXJ5X2RhdGEpDQppbnRlcmFjdGl2ZV9wcmludChzdW1tYXJ5X2RhdGEpDQpmb3JtYXRfZXF1YWxfd2lkdGgoc3VtbWFyeV9kYXRhKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgU0FWRSBWQUxVRVMgRk9SIElOLUxJTkUgQ09ERSBJTkNMVURJTkcgUkFUSU9TDQoNCiMgRGVmaW5lIHRoZSBtYXBwaW5nIG9mIHJvdyBuYW1lcyB0byB2YXJpYWJsZSBuYW1lcw0Kcm93X3RvX3Zhcl9uYW1lIDwtIGMoDQogICIxLVllYXIgQ0FHUiIgPSAiMV95ZWFyX2NhZ3IiLA0KICAiNS1ZZWFyIENBR1IiID0gIjVfeWVhcl9jYWdyIiwNCiAgIjEwLVllYXIgQ0FHUiIgPSAiMTBfeWVhcl9jYWdyIiwNCiAgIjIwLVllYXIgQ0FHUiIgPSAiMjBfeWVhcl9jYWdyIg0KKQ0KDQojIERlZmluZSBhIGN1c3RvbSBtYXBwaW5nIGZvciBjb2x1bW4gbmFtZXMNCmNvbHVtbl9uYW1lX21hcHBpbmcgPC0gYygNCiAgIlMmUCA1MDAiID0gInNwNTAwIiwNCiAgIlFRUSIgPSAicXFxIiwNCiAgIlJhdGlvIiA9ICJyYXRpbyINCikNCg0KIyBGdW5jdGlvbiB0byBzYXZlIHN1bW1hcnkgdmFsdWVzIGR5bmFtaWNhbGx5IHdpdGggY29sdW1uIG5hbWUgbWFwcGluZw0Kc2F2ZV9jb2x1bW5fdmFsdWVzIDwtIGZ1bmN0aW9uKHN1bW1hcnlfZGYsIHJvd19tYXBwaW5nLCBjb2x1bW5fbWFwcGluZywgcHJlZml4ID0gIiIpIHsNCiAgIyBHZXQgdGhlIGNvbHVtbiBuYW1lcyBpbiB0aGUgZGF0YSBmcmFtZQ0KICBjb2x1bW5zX3RvX3NhdmUgPC0gc2V0ZGlmZihuYW1lcyhzdW1tYXJ5X2RmKSwgYygiTWV0cmljIiwgIlJhbmdlIikpICAjIEV4Y2x1ZGUgdGhlIE1ldHJpYyBhbmQgUmFuZ2UgY29sdW1ucw0KICANCiAgIyBJdGVyYXRlIG92ZXIgZWFjaCBjb2x1bW4NCiAgZm9yIChjb2wgaW4gY29sdW1uc190b19zYXZlKSB7DQogICAgIyBVc2UgdGhlIGN1c3RvbSBtYXBwaW5nIHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgY29sdW1uIG5hbWUNCiAgICBjb2xfbmFtZSA8LSBjb2x1bW5fbWFwcGluZ1tbY29sXV0gJXx8JSB0b2xvd2VyKGdzdWIoIlteYS16QS1aMC05XSIsICJfIiwgY29sKSkNCiAgICANCiAgICAjIEV4dHJhY3QgdmFsdWVzIGZvciB0aGUgY3VycmVudCBjb2x1bW4NCiAgICBjb2xfdmFsdWVzIDwtIHN1bW1hcnlfZGZbW2NvbF1dDQogICAgDQogICAgIyBJdGVyYXRlIG92ZXIgcm93cyB0byBzYXZlIGVhY2ggdmFsdWUgZHluYW1pY2FsbHkNCiAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKGNvbF92YWx1ZXMpKSB7DQogICAgICAjIEdldCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZSBuYW1lIGZyb20gdGhlIG1hcHBpbmcNCiAgICAgIHN0YXRfbmFtZSA8LSByb3dfbWFwcGluZ1tzdW1tYXJ5X2RmJE1ldHJpY1tpXV0NCiAgICAgIA0KICAgICAgaWYgKCFpcy5uYShzdGF0X25hbWUpKSB7ICAjIFNraXAgaWYgbm8gbWFwcGluZyBpcyBkZWZpbmVkDQogICAgICAgICMgQ3JlYXRlIHRoZSB2YXJpYWJsZSBuYW1lIHdpdGggdGhlIHByZWZpeA0KICAgICAgICB2YXJfbmFtZSA8LSBwYXN0ZTAocHJlZml4LCBzdGF0X25hbWUsICJfIiwgY29sX25hbWUpDQogICAgICAgIA0KICAgICAgICAjIEF0dGVtcHQgbnVtZXJpYyBjb252ZXJzaW9uIGZvciBkb3duc3RyZWFtIHVzZQ0KICAgICAgICB2YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2xfdmFsdWVzW2ldKSkpDQogICAgICAgIA0KICAgICAgICAjIEFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIGdsb2JhbCBlbnZpcm9ubWVudA0KICAgICAgICBhc3NpZ24odmFyX25hbWUsIHZhbHVlLCBlbnZpciA9IC5HbG9iYWxFbnYpDQogICAgICB9DQogICAgfQ0KICB9DQp9DQoNCiMgQ2FsbCB0aGUgZnVuY3Rpb24gd2l0aCBhIHByZWZpeA0Kc2F2ZV9jb2x1bW5fdmFsdWVzKHN1bW1hcnlfZGF0YSwgcm93X3RvX3Zhcl9uYW1lLCBjb2x1bW5fbmFtZV9tYXBwaW5nLCBwcmVmaXggPSAicm9sbGluZ19hdmdfIikNCg0KIyBFeGFtcGxlOiBBY2Nlc3NpbmcgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZXMNCmludGVyYWN0aXZlX3ByaW50KHJvbGxpbmdfYXZnXzFfeWVhcl9jYWdyX3NwNTAwKSAgIyBTaG91bGQgcHJpbnQgdGhlIDEtWWVhciBDQUdSIGZvciBTJlAgNTAwDQppbnRlcmFjdGl2ZV9wcmludChyb2xsaW5nX2F2Z18xX3llYXJfY2Fncl9xcXEpICAgICMgU2hvdWxkIHByaW50IHRoZSAxLVllYXIgQ0FHUiBmb3IgUVFRDQppbnRlcmFjdGl2ZV9wcmludChyb2xsaW5nX2F2Z18xX3llYXJfY2Fncl9yYXRpbykgICMgU2hvdWxkIHByaW50IHRoZSBSYXRpbyBmb3IgMS1ZZWFyIENBR1INCmludGVyYWN0aXZlX3ByaW50KHJvbGxpbmdfYXZnXzVfeWVhcl9jYWdyX3JhdGlvKSAgIyBTaG91bGQgcHJpbnQgdGhlIFJhdGlvIGZvciA1LVllYXIgQ0FHUg0KDQpgYGANCg0KQ29tcGFyaW5nIHRoZSBDQUdSIGF2ZXJhZ2VzIHByb3ZpZGVzIGEgc3RhbmRhcmRpemVkIHdheSB0byBldmFsdWF0ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgZGlmZmVyZW50IGluZGV4ZXMgb3ZlciB2YXJ5aW5nIHRpbWUgaG9yaXpvbnMuIFVubGlrZSBzaW5nbGUtcG9pbnQgZ3Jvd3RoIHJhdGVzLCByb2xsaW5nIENBR1JzIHNtb290aCBvdXQgc2hvcnQtdGVybSBmbHVjdHVhdGlvbnMgYW5kIG9mZmVyIGEgY2xlYXJlciBwaWN0dXJlIG9mIGxvbmctdGVybSB0cmVuZHMuIFRoZSByYXRpb3MgdW5kZXJzY29yZXMgdGhlIHJlbGF0aXZlIGdyb3d0aCBkeW5hbWljcyBiZXR3ZWVuIHRoZSB0d28gaW5kZXhlcywgaWxsdXN0cmF0aW5nIHRoZSBtYWduaXR1ZGUgb2YgUVFRJ3Mgb3V0cGVyZm9ybWFuY2Ugb3ZlciBlYWNoIHBlcmlvZC4NCg0KVGhlIGdyYXBoIGFuZCBhY2NvbXBhbnlpbmcgZGF0YSB0YWJsZSBpbGx1c3RyYXRlIHRoZSBhdmVyYWdlIHJvbGxpbmcgQ0FHUnMgb2YgdGhlIFMmUCA1MDAgYW5kIFFRUSBvdmVyIHZhcmlvdXMgdGltZSBwZXJpb2RzLCBmcm9tIDEteWVhciB0byAyMC15ZWFyIGludGVydmFscy4gQWNyb3NzIGFsbCByb2xsaW5nIHBlcmlvZHMsIFFRUSBjb25zaXN0ZW50bHkgb3V0cGVyZm9ybXMgdGhlIFMmUCA1MDAsIHdpdGggYSAxLVllYXIgQ0FHUiBvZiBgciByb2xsaW5nX2F2Z18xX3llYXJfY2Fncl9xcXFgJSBjb21wYXJlZCB0byB0aGUgUyZQIDUwMCdzIGByIHJvbGxpbmdfYXZnXzFfeWVhcl9jYWdyX3NwNTAwYCUsIGFuZCBhIDIwLVllYXIgQ0FHUiBvZiBgciByb2xsaW5nX2F2Z18yMF95ZWFyX2NhZ3JfcXFxYCUgY29tcGFyZWQgdG8gdGhlIFMmUCA1MDAncyBgciByb2xsaW5nX2F2Z18yMF95ZWFyX2NhZ3Jfc3A1MDBgJS4gVGhlIHJhdGlvcyBvZiBTJlAgNTAwIHRvIFFRUSBDQUdScyBmdXJ0aGVyIGhpZ2hsaWdodCB0aGlzIGRpc3Bhcml0eSwgd2l0aCB2YWx1ZXMgcmFuZ2luZyBmcm9tIGByIHJvbGxpbmdfYXZnXzFfeWVhcl9jYWdyX3JhdGlvYCBmb3IgdGhlIDEtWWVhciBDQUdSIHRvIGByIHJvbGxpbmdfYXZnXzEwX3llYXJfY2Fncl9yYXRpb2AgZm9yIHRoZSAxMC1ZZWFyIENBR1IsIHJlZmxlY3RpbmcgUVFRJ3Mgc3Ryb25nZXIgcGVyZm9ybWFuY2UgcmVsYXRpdmUgdG8gdGhlIGJyb2FkZXIgbWFya2V0IGluZGV4LiANCg0KRWFybHkgeWVhcnMgc2hvdyBzaWduaWZpY2FudCBvdXRwZXJmb3JtYW5jZSBieSB0aGUgUyZQIDUwMCwgYnV0IG1vc3Qgb2YgdGhlIHN1YnNlcXVlbnQgeWVhcnMgYXJlIGRvbWluYXRlZCBieSBzdHJvbmdlciBRUVEgZ3Jvd3RoLiBTaW5jZSB0aGUgcm9sbGluZyBDQUdSIGhlYXZpbHkgd2VpZ2h0cyB0aGUgbWFqb3JpdHkgb2YgeWVhcnMgd2hlcmUgUVFRIGhhZCBzdHJvbmdlciBwZXJmb3JtYW5jZSwgdGhlIGF2ZXJhZ2UgQ0FHUiBmb3IgUVFRIHJlbWFpbnMgY29uc2lzdGVudGx5IGhpZ2hlciB0aGFuIFNQWCBhY3Jvc3MgZGlmZmVyZW50IHJvbGxpbmcgcGVyaW9kcy4gSG93ZXZlciwgdGhlIHN0cm9uZyBpbml0aWFsIG91dHBlcmZvcm1hbmNlIG9mIFNQWCBpbiBlYXJseSB5ZWFycyBwcmV2ZW50cyB0aGUgcmF0aW8gYmV0d2VlbiB0aGUgdHdvIGluZGljZXMgZnJvbSBkaXZlcmdpbmcgZnVydGhlci4NCg0KIyMjIyBHcmFwaA0KDQpgYGB7ciBpbmRleF9jb21wYXJpc29uX2NhZ3JfYXZlcmFnZXNfc3VtbWFyeV9ncmFwaF91cGRhdGVkLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIERlZmluZSBhIGhlbHBlciBmdW5jdGlvbiB0byByZW1vdmUgIiUiIGFuZCBjb252ZXJ0IHRvIG51bWVyaWMNCmNsZWFuX3BlcmNlbnRhZ2UgPC0gZnVuY3Rpb24oY29sdW1uKSB7DQogIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2x1bW4pKQ0KfQ0KDQojIEVuc3VyZSBhbGwgY29sdW1ucyBhcmUgbnVtZXJpYyBhbmQgZm9ybWF0IHRoZSBSYXRpbyBwcm9wZXJseQ0Kc3VtbWFyeV9kYXRhIDwtIHN1bW1hcnlfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIGBTJlAgNTAwYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYFMmUCA1MDBgKSwNCiAgICBgUVFRYCA9IGNsZWFuX3BlcmNlbnRhZ2UoYFFRUWApLA0KICAgIFJhdGlvID0gYXMubnVtZXJpYyhSYXRpbykgIyBFbnN1cmUgUmF0aW8gaXMgbnVtZXJpYw0KICApDQoNCiMgQ29tYmluZSBNZXRyaWMsIFJhbmdlLCBhbmQgUmF0aW8gaW50byBhIHNpbmdsZSBsYWJlbA0Kc3VtbWFyeV9kYXRhIDwtIHN1bW1hcnlfZGF0YSAlPiUNCiAgbXV0YXRlKA0KICAgIExhYmVsID0gcGFzdGUwKA0KICAgICAgTWV0cmljLCAiXG4oIiwgUmFuZ2UsICIpIiwNCiAgICAgICJcblJhdGlvICIsIHNwcmludGYoIiUuMmYiLCBSYXRpbykgIyBSYXRpbyBpcyBub3cgbnVtZXJpYw0KICAgICkNCiAgKQ0KDQoNCiMgQ29udmVydCB0byBsb25nIGZvcm1hdCBmb3IgZ2dwbG90Mg0KbGlicmFyeShyZXNoYXBlMikNCnN1bW1hcnlfZGF0YV9sb25nIDwtIG1lbHQoc3VtbWFyeV9kYXRhLCBpZC52YXJzID0gYygiTWV0cmljIiwgIlJhbmdlIiwgIkxhYmVsIiwgIlJhdGlvIiksIHZhcmlhYmxlLm5hbWUgPSAiSW5kZXgiLCB2YWx1ZS5uYW1lID0gIkNBR1IiKQ0KDQojIEVuc3VyZSB0aGUgTWV0cmljIGNvbHVtbiBoYXMgdGhlIGRlc2lyZWQgb3JkZXINCnN1bW1hcnlfZGF0YV9sb25nJExhYmVsIDwtIGZhY3RvcihzdW1tYXJ5X2RhdGFfbG9uZyRMYWJlbCwgbGV2ZWxzID0gdW5pcXVlKHN1bW1hcnlfZGF0YSRMYWJlbCkpDQoNCiMgQ3JlYXRlIHRoZSBiYXIgZ3JhcGgNCmdncGxvdChzdW1tYXJ5X2RhdGFfbG9uZywgYWVzKHggPSBMYWJlbCwgeSA9IENBR1IsIGZpbGwgPSBJbmRleCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICANCiAgIyBBZGQgdGV4dCB2YWx1ZXMgb24gdG9wIG9mIGJhcnMNCiAgZ2VvbV90ZXh0KA0KICAgIGFlcyhsYWJlbCA9IHNwcmludGYoIiUuMmYlJSIsIENBR1IpKSwNCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwNCiAgICB2anVzdCA9IC0wLjUsICMgUG9zaXRpb24gYWJvdmUgdGhlIGJhcg0KICAgIHNpemUgPSA0ICAgICAgIyBTZXQgdGV4dCBzaXplDQogICkgKw0KICANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoc2NhbGUgPSAxKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkF2ZXJhZ2UgUm9sbGluZyBDQUdScyBCeSBJbmRleCIsDQogICAgc3VidGl0bGUgPSBwYXN0ZSgiQ29tcGFyaXNvbiBvZiBTJlAgNTAwIGFuZCBRUVEgRGF0YXNldCAoIiwgbWluX3llYXIsICItIiwgbWF4X3llYXIsICIpIiwgc2VwID0gIiIpLA0KICAgIHggPSAiUm9sbGluZyBQZXJpb2QiLA0KICAgIHkgPSAiQ0FHUiBWYWx1ZSIsDQogICAgZmlsbCA9ICJJbmRleCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwgDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIG1hcmdpbiA9IG1hcmdpbih0ID0gMTApKSwgIyBBZGQgc3BhY2UgYWJvdmUgWC1heGlzIHRpdGxlDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIFktYXhpcyB0aXRsZSBmb250DQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCB2anVzdCA9IDAuNSksICAgICAgICAgICAgICMgQWRqdXN0IFgtYXhpcyB0ZXh0IHNpemUgYW5kIHNwYWNpbmcNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgWS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgICAgICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciBYIGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgICAgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgICAgICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgICAgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQoNCg0KYGBgDQoNCiMjIyBMaW5lYXIgUmVncmVzc2lvbg0KDQojIyMjIERhdGENCiMgVE8gQkUgQ09OVElOVUVEIA0KVXBkYXRlIHRoZSBmb2xsb3dpbmcuIA0KSW5zdGVhZCBvZiBmaWx0ZXJpbmcgTkFzIHRvIGNhbGN1bGF0ZSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gc2xvcGUsIHVzZSB0aGUgc3A1MDBfMTBfeWVhcl9jYWdyX3Nsb3BlcyBhbmQgcXFxXzEwX3llYXJfY2Fncl9zbG9wZXMNClNsb3BlcyBhcmUgYWxyZWFkeSBjYWxjdWxhdGVkOyBmaWx0ZXIgdGhlIGRhdGUgcmFuZ2UgYW5kIHN1bW1hcml6ZSB0aGUgYXZlcmFnZSAxMC1ZZWFyIFNsb3BlIGZvciBlYWNoIGluZGV4IGFuZCBDQUdSIGNvbHVtbjsgUVFRIDEwLVllYXIgc2xvcGVzIGZvciAyMC1ZZWFyIENBR1IgaXMgbm90IGF2YWlsYWJsZTsgY29uc2lkZXIgdG8gc3RpY2sgd2l0aCBtYXRjaGluZyBEYXRlcyBvZiAxMC1ZZWFycy4gDQoNCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fY2Fncl9zbG9wZV9zdW1tYXJ5X3VwZGF0ZWQsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBEZWZpbmUgYSBmdW5jdGlvbiB0byBmaWx0ZXIgZGF0YXNldHMgZm9yIHZhbGlkIGRhdGEgaW4gZWFjaCByb2xsaW5nIENBR1IgcGVyaW9kIGFuZCB3aXRoaW4gbWluL21heCB5ZWFyIHJhbmdlDQpmaWx0ZXJfZGF0YV9mb3JfcGVyaW9kIDwtIGZ1bmN0aW9uKGRhdGEsIGNvbHVtbl9uYW1lLCBtaW5feWVhciwgbWF4X3llYXIpIHsNCiAgZGF0YSA8LSBkYXRhWyFpcy5uYShkYXRhW1tjb2x1bW5fbmFtZV1dKSwgXQ0KICBkYXRhIDwtIGRhdGFbZGF0YSREYXRlID49IG1pbl95ZWFyICYgZGF0YSREYXRlIDw9IG1heF95ZWFyLCBdDQogIHJldHVybihkYXRhKQ0KfQ0KDQojIEZpbHRlciBkYXRhc2V0cyBmb3IgZWFjaCByb2xsaW5nIHBlcmlvZA0KZmlsdGVyZWRfc3A1MDBfMXlyIDwtIGZpbHRlcl9kYXRhX2Zvcl9wZXJpb2QobnJ0JHNwNTAwX3Jhd19jYWdyLCAiMS1ZZWFyIENBR1IiLCBtaW5feWVhciwgbWF4X3llYXIpDQpmaWx0ZXJlZF9zcDUwMF81eXIgPC0gZmlsdGVyX2RhdGFfZm9yX3BlcmlvZChucnQkc3A1MDBfcmF3X2NhZ3IsICI1LVllYXIgQ0FHUiIsIG1pbl95ZWFyLCBtYXhfeWVhcikNCmZpbHRlcmVkX3NwNTAwXzEweXIgPC0gZmlsdGVyX2RhdGFfZm9yX3BlcmlvZChucnQkc3A1MDBfcmF3X2NhZ3IsICIxMC1ZZWFyIENBR1IiLCBtaW5feWVhciwgbWF4X3llYXIpDQpmaWx0ZXJlZF9zcDUwMF8yMHlyIDwtIGZpbHRlcl9kYXRhX2Zvcl9wZXJpb2QobnJ0JHNwNTAwX3Jhd19jYWdyLCAiMjAtWWVhciBDQUdSIiwgbWluX3llYXIsIG1heF95ZWFyKQ0KDQpmaWx0ZXJlZF9xcXFfMXlyIDwtIGZpbHRlcl9kYXRhX2Zvcl9wZXJpb2QobnJ0JHFxcV9yYXdfY2FnciwgIjEtWWVhciBDQUdSIiwgbWluX3llYXIsIG1heF95ZWFyKQ0KZmlsdGVyZWRfcXFxXzV5ciA8LSBmaWx0ZXJfZGF0YV9mb3JfcGVyaW9kKG5ydCRxcXFfcmF3X2NhZ3IsICI1LVllYXIgQ0FHUiIsIG1pbl95ZWFyLCBtYXhfeWVhcikNCmZpbHRlcmVkX3FxcV8xMHlyIDwtIGZpbHRlcl9kYXRhX2Zvcl9wZXJpb2QobnJ0JHFxcV9yYXdfY2FnciwgIjEwLVllYXIgQ0FHUiIsIG1pbl95ZWFyLCBtYXhfeWVhcikNCmZpbHRlcmVkX3FxcV8yMHlyIDwtIGZpbHRlcl9kYXRhX2Zvcl9wZXJpb2QobnJ0JHFxcV9yYXdfY2FnciwgIjIwLVllYXIgQ0FHUiIsIG1pbl95ZWFyLCBtYXhfeWVhcikNCg0KIyBFbnN1cmUgbWF0Y2hpbmcgZGF0ZXMgZm9yIGVhY2ggcGVyaW9kDQpjb21tb25fZGF0ZXNfMXlyIDwtIGludGVyc2VjdChmaWx0ZXJlZF9zcDUwMF8xeXIkRGF0ZSwgZmlsdGVyZWRfcXFxXzF5ciREYXRlKQ0KY29tbW9uX2RhdGVzXzV5ciA8LSBpbnRlcnNlY3QoZmlsdGVyZWRfc3A1MDBfNXlyJERhdGUsIGZpbHRlcmVkX3FxcV81eXIkRGF0ZSkNCmNvbW1vbl9kYXRlc18xMHlyIDwtIGludGVyc2VjdChmaWx0ZXJlZF9zcDUwMF8xMHlyJERhdGUsIGZpbHRlcmVkX3FxcV8xMHlyJERhdGUpDQpjb21tb25fZGF0ZXNfMjB5ciA8LSBpbnRlcnNlY3QoZmlsdGVyZWRfc3A1MDBfMjB5ciREYXRlLCBmaWx0ZXJlZF9xcXFfMjB5ciREYXRlKQ0KDQojIEZpbHRlciBkYXRhc2V0cyB0byBpbmNsdWRlIG9ubHkgbWF0Y2hpbmcgZGF0ZXMgZm9yIGVhY2ggcGVyaW9kDQpmaWx0ZXJlZF9zcDUwMF8xeXIgPC0gZmlsdGVyZWRfc3A1MDBfMXlyW2ZpbHRlcmVkX3NwNTAwXzF5ciREYXRlICVpbiUgY29tbW9uX2RhdGVzXzF5ciwgXQ0KZmlsdGVyZWRfcXFxXzF5ciA8LSBmaWx0ZXJlZF9xcXFfMXlyW2ZpbHRlcmVkX3FxcV8xeXIkRGF0ZSAlaW4lIGNvbW1vbl9kYXRlc18xeXIsIF0NCg0KZmlsdGVyZWRfc3A1MDBfNXlyIDwtIGZpbHRlcmVkX3NwNTAwXzV5cltmaWx0ZXJlZF9zcDUwMF81eXIkRGF0ZSAlaW4lIGNvbW1vbl9kYXRlc181eXIsIF0NCmZpbHRlcmVkX3FxcV81eXIgPC0gZmlsdGVyZWRfcXFxXzV5cltmaWx0ZXJlZF9xcXFfNXlyJERhdGUgJWluJSBjb21tb25fZGF0ZXNfNXlyLCBdDQoNCmZpbHRlcmVkX3NwNTAwXzEweXIgPC0gZmlsdGVyZWRfc3A1MDBfMTB5cltmaWx0ZXJlZF9zcDUwMF8xMHlyJERhdGUgJWluJSBjb21tb25fZGF0ZXNfMTB5ciwgXQ0KZmlsdGVyZWRfcXFxXzEweXIgPC0gZmlsdGVyZWRfcXFxXzEweXJbZmlsdGVyZWRfcXFxXzEweXIkRGF0ZSAlaW4lIGNvbW1vbl9kYXRlc18xMHlyLCBdDQoNCmZpbHRlcmVkX3NwNTAwXzIweXIgPC0gZmlsdGVyZWRfc3A1MDBfMjB5cltmaWx0ZXJlZF9zcDUwMF8yMHlyJERhdGUgJWluJSBjb21tb25fZGF0ZXNfMjB5ciwgXQ0KZmlsdGVyZWRfcXFxXzIweXIgPC0gZmlsdGVyZWRfcXFxXzIweXJbZmlsdGVyZWRfcXFxXzIweXIkRGF0ZSAlaW4lIGNvbW1vbl9kYXRlc18yMHlyLCBdDQoNCiMgRnVuY3Rpb24gdG8gY2FsY3VsYXRlIHJlZ3Jlc3Npb24gc2xvcGUNCmNhbGN1bGF0ZV9zbG9wZSA8LSBmdW5jdGlvbih2YWx1ZXMsIGRhdGVzKSB7DQogIGlmIChsZW5ndGgodmFsdWVzKSA8IDIpIHJldHVybihOQSkgIyBIYW5kbGUgaW5zdWZmaWNpZW50IGRhdGENCiAgcmVncmVzc2lvbiA8LSBsbSh2YWx1ZXMgfiBkYXRlcykNCiAgcmV0dXJuKHJvdW5kKGNvZWYocmVncmVzc2lvbilbMl0sIDIpKSAjIFJldHVybiBzbG9wZQ0KfQ0KDQojIERldGVybWluZSB0aGUgbWluIGFuZCBtYXggeWVhcnMgZm9yIGVhY2ggcm9sbGluZyBwZXJpb2QNCnllYXJfcmFuZ2VzIDwtIGMoDQogIHBhc3RlMChtaW4oY29tbW9uX2RhdGVzXzF5ciksICItIiwgbWF4KGNvbW1vbl9kYXRlc18xeXIpKSwNCiAgcGFzdGUwKG1pbihjb21tb25fZGF0ZXNfNXlyKSwgIi0iLCBtYXgoY29tbW9uX2RhdGVzXzV5cikpLA0KICBwYXN0ZTAobWluKGNvbW1vbl9kYXRlc18xMHlyKSwgIi0iLCBtYXgoY29tbW9uX2RhdGVzXzEweXIpKSwNCiAgcGFzdGUwKG1pbihjb21tb25fZGF0ZXNfMjB5ciksICItIiwgbWF4KGNvbW1vbl9kYXRlc18yMHlyKSkNCikNCg0KIyBDYWxjdWxhdGUgc2xvcGVzIGZvciBTJlAgNTAwIGFuZCBRUVEgZm9yIGVhY2ggcm9sbGluZyBwZXJpb2QNCnNsb3BlX2RhdGEgPC0gZGF0YS5mcmFtZSgNCiAgTWV0cmljID0gYygiMS1ZZWFyIENBR1IiLCAiNS1ZZWFyIENBR1IiLCAiMTAtWWVhciBDQUdSIiwgIjIwLVllYXIgQ0FHUiIpLA0KICBgUyZQIDUwMGAgPSBjKA0KICAgIGNhbGN1bGF0ZV9zbG9wZShmaWx0ZXJlZF9zcDUwMF8xeXIkYDEtWWVhciBDQUdSYCwgZmlsdGVyZWRfc3A1MDBfMXlyJERhdGUpLA0KICAgIGNhbGN1bGF0ZV9zbG9wZShmaWx0ZXJlZF9zcDUwMF81eXIkYDUtWWVhciBDQUdSYCwgZmlsdGVyZWRfc3A1MDBfNXlyJERhdGUpLA0KICAgIGNhbGN1bGF0ZV9zbG9wZShmaWx0ZXJlZF9zcDUwMF8xMHlyJGAxMC1ZZWFyIENBR1JgLCBmaWx0ZXJlZF9zcDUwMF8xMHlyJERhdGUpLA0KICAgIGNhbGN1bGF0ZV9zbG9wZShmaWx0ZXJlZF9zcDUwMF8yMHlyJGAyMC1ZZWFyIENBR1JgLCBmaWx0ZXJlZF9zcDUwMF8yMHlyJERhdGUpDQogICksDQogIFFRUSA9IGMoDQogICAgY2FsY3VsYXRlX3Nsb3BlKGZpbHRlcmVkX3FxcV8xeXIkYDEtWWVhciBDQUdSYCwgZmlsdGVyZWRfcXFxXzF5ciREYXRlKSwNCiAgICBjYWxjdWxhdGVfc2xvcGUoZmlsdGVyZWRfcXFxXzV5ciRgNS1ZZWFyIENBR1JgLCBmaWx0ZXJlZF9xcXFfNXlyJERhdGUpLA0KICAgIGNhbGN1bGF0ZV9zbG9wZShmaWx0ZXJlZF9xcXFfMTB5ciRgMTAtWWVhciBDQUdSYCwgZmlsdGVyZWRfcXFxXzEweXIkRGF0ZSksDQogICAgY2FsY3VsYXRlX3Nsb3BlKGZpbHRlcmVkX3FxcV8yMHlyJGAyMC1ZZWFyIENBR1JgLCBmaWx0ZXJlZF9xcXFfMjB5ciREYXRlKQ0KICApLA0KICBSYXRpbyA9IE5BLCAgIyBJbml0aWFsaXplIHRoZSBSYXRpbyBjb2x1bW4NCiAgYFJhbmdlYCA9IHllYXJfcmFuZ2VzLA0KICBjaGVjay5uYW1lcyA9IEZBTFNFICMgUHJldmVudCBSIGZyb20gYWx0ZXJpbmcgY29sdW1uIG5hbWVzDQopDQoNCiMgRm9ybWF0IHNsb3BlcyBhbmQgY2FsY3VsYXRlIHRoZSBSYXRpbyBjb2x1bW4NCmlmIChucm93KHNsb3BlX2RhdGEpID4gMCkgew0KICBzbG9wZV9kYXRhJGBTJlAgNTAwYCA8LSBzcHJpbnRmKCIlLjJmJSUiLCBzbG9wZV9kYXRhJGBTJlAgNTAwYCkNCiAgc2xvcGVfZGF0YSRRUVEgPC0gc3ByaW50ZigiJS4yZiUlIiwgc2xvcGVfZGF0YSRRUVEpDQogIGZvciAoaSBpbiBzZXFfbGVuKG5yb3coc2xvcGVfZGF0YSkpKSB7DQogICAgc3A1MDBfdmFsIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIHNsb3BlX2RhdGEkYFMmUCA1MDBgW2ldKSkpDQogICAgcXFxX3ZhbCA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBzbG9wZV9kYXRhJFFRUVtpXSkpKQ0KICAgIA0KICAgIGlmICghaXMubmEoc3A1MDBfdmFsKSAmJiAhaXMubmEocXFxX3ZhbCkgJiYgcXFxX3ZhbCAhPSAwKSB7DQogICAgICBzbG9wZV9kYXRhJFJhdGlvW2ldIDwtIHJvdW5kKHNwNTAwX3ZhbCAvIHFxcV92YWwsIDIpDQogICAgfQ0KICB9DQogIHNsb3BlX2RhdGEkUmF0aW8gPC0gc3ByaW50ZigiJS4yZiIsIHNsb3BlX2RhdGEkUmF0aW8pDQp9IGVsc2Ugew0KICBzdG9wKCJObyBkYXRhIHRvIHN1bW1hcml6ZSBvciByb3dzIGRvIG5vdCBtYXRjaC4iKQ0KfQ0KDQojIFJlb3JkZXIgY29sdW1ucyB0byBNZXRyaWMgLyBTJlAgNTAwIC8gUVFRIC8gUmF0aW8gLyBSYW5nZQ0Kc2xvcGVfZGF0YSA8LSBzbG9wZV9kYXRhWywgYygiTWV0cmljIiwgIlMmUCA1MDAiLCAiUVFRIiwgIlJhdGlvIiwgIlJhbmdlIildDQoNCiMgQ2FsbCB0aGUgZnVuY3Rpb24gd2l0aCBhIHByZWZpeA0Kc2F2ZV9jb2x1bW5fdmFsdWVzKHNsb3BlX2RhdGEsIHJvd190b192YXJfbmFtZSwgY29sdW1uX25hbWVfbWFwcGluZywgcHJlZml4ID0gInJvbGxpbmdfc2xvcGVfIikNCg0KIyBEaXNwbGF5IHRoZSBzdW1tYXJ5IHdpdGggZHluYW1pYyB5ZWFyIHJhbmdlDQpjYXQoIlxuXG4jIyMjIExpbmVhciBSZWdyZXNzaW9uIFNsb3BlcyBmb3IgUm9sbGluZyBDQUdScywgRGF0YSBQZXJpb2QgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKVxuIiwgc2VwID0gIiIpDQppbnRlcmFjdGl2ZV9wcmludChzbG9wZV9kYXRhKQ0KaW50ZXJhY3RpdmVfc3RyKHNsb3BlX2RhdGEpDQpmb3JtYXRfZXF1YWxfd2lkdGgoc2xvcGVfZGF0YSkNCg0KYGBgDQpUaGUgdGFibGUgYW5kIGFjY29tcGFueWluZyBncmFwaCBzaG93IGhvdyB0aGUgZ3Jvd3RoIHRyZW5kcyBvZiB0aGUgUyZQIDUwMCBhbmQgUVFRIGNoYW5nZSBvdmVyIHRpbWUgdXNpbmcgbGluZWFyIHJlZ3Jlc3Npb24gc2xvcGVzLCBzaG93aW5nIGhvdyBmYXN0IHRoZSBncm93dGggcmF0ZXMgYXJlIGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZy4gVGhpcyBoZWxwcyB1bmRlcnN0YW5kIHRoZSBwZXJpb2RpYyB0cmVuZHMuDQoNClFRUSBjb25zaXN0ZW50bHkgc2hvd3Mgc3Ryb25nZXIgZ3Jvd3RoIHRyZW5kcyB0aGFuIHRoZSBTJlAgNTAwIGFjcm9zcyBhbGwgdGltZSBwZXJpb2RzLiBGb3IgaW5zdGFuY2UsIFFRUSdzIDEtWWVhciBzbG9wZSBpcyBgciByb2xsaW5nX3Nsb3BlXzFfeWVhcl9jYWdyX3FxcWAlIGNvbXBhcmVkIHRvIHRoZSBTJlAgNTAwJ3MgYHIgcm9sbGluZ19zbG9wZV8xX3llYXJfY2Fncl9zcDUwMGAlLCBhbmQgdGhpcyBkaWZmZXJlbmNlIGJlY29tZXMgZXZlbiBsYXJnZXIgb3ZlciAyMCB5ZWFycywgd2l0aCBRUVEgYXQgYHIgcm9sbGluZ19zbG9wZV8yMF95ZWFyX2NhZ3JfcXFxYCUgdmVyc3VzIHRoZSBTJlAgNTAwJ3MgYHIgcm9sbGluZ19zbG9wZV8yMF95ZWFyX2NhZ3Jfc3A1MDBgJS4gVGhlIHJhdGlvIG9mIFMmUCA1MDAgdG8gUVFRIHNsb3BlcyBzaG93cyBob3cgbXVjaCBmYXN0ZXIgUVFRIGlzIGdyb3dpbmcsIHJhbmdpbmcgZnJvbSBgciByb2xsaW5nX3Nsb3BlXzFfeWVhcl9jYWdyX3JhdGlvYCBmb3IgdGhlIDEtWWVhciBwZXJpb2QgdG8gYHIgcm9sbGluZ19zbG9wZV8yMF95ZWFyX2NhZ3JfcmF0aW9gIGZvciB0aGUgMjAtWWVhciBwZXJpb2QuIFRoaXMgaGlnaGxpZ2h0cyBRUVEncyBtb3JlIGFnZ3Jlc3NpdmUgZ3Jvd3RoIHBvdGVudGlhbCBvdmVyIHRpbWUuDQoNCiMjIyMgR3JhcGggDQoNCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fY2Fncl9zbG9wZV9zdW1tYXJ5X2dyYXBoX3VwZGF0ZWQsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgRGVmaW5lIGEgaGVscGVyIGZ1bmN0aW9uIHRvIHJlbW92ZSAiJSIgYW5kIGNvbnZlcnQgdG8gbnVtZXJpYw0KY2xlYW5fcGVyY2VudGFnZSA8LSBmdW5jdGlvbihjb2x1bW4pIHsNCiAgYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIGNvbHVtbikpDQp9DQoNCiMgRW5zdXJlIGFsbCBjb2x1bW5zIGFyZSBudW1lcmljIGFuZCBmb3JtYXQgdGhlIFJhdGlvIHByb3Blcmx5DQpzbG9wZV9kYXRhIDwtIHNsb3BlX2RhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBgUyZQIDUwMGAgPSBjbGVhbl9wZXJjZW50YWdlKGBTJlAgNTAwYCksDQogICAgYFFRUWAgPSBjbGVhbl9wZXJjZW50YWdlKGBRUVFgKSwNCiAgICBSYXRpbyA9IGFzLm51bWVyaWMoUmF0aW8pICMgRW5zdXJlIFJhdGlvIGlzIG51bWVyaWMNCiAgKQ0KDQojIENvbWJpbmUgTWV0cmljLCBSYW5nZSwgYW5kIFJhdGlvIGludG8gYSBzaW5nbGUgbGFiZWwgZm9yIGJldHRlciByZWFkYWJpbGl0eQ0Kc2xvcGVfZGF0YSA8LSBzbG9wZV9kYXRhICU+JQ0KICBtdXRhdGUoDQogICAgTGFiZWwgPSBwYXN0ZTAoDQogICAgICBNZXRyaWMsICJcbigiLCBSYW5nZSwgIikiLA0KICAgICAgIlxuUmF0aW86ICIsIHNwcmludGYoIiUuMmYiLCBSYXRpbykNCiAgICApDQogICkNCg0KIyBDb252ZXJ0IHRvIGxvbmcgZm9ybWF0IGZvciBnZ3Bsb3QyIGNvbXBhdGliaWxpdHkNCmxpYnJhcnkocmVzaGFwZTIpDQpzbG9wZV9kYXRhX2xvbmcgPC0gbWVsdChzbG9wZV9kYXRhLCBpZC52YXJzID0gYygiTWV0cmljIiwgIlJhbmdlIiwgIkxhYmVsIiwgIlJhdGlvIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lID0gIkluZGV4IiwgdmFsdWUubmFtZSA9ICJTbG9wZSIpDQoNCiMgRW5zdXJlIHRoZSBvcmRlciBvZiB0aGUgTGFiZWwgY29sdW1uIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHNlcXVlbmNlDQpzbG9wZV9kYXRhX2xvbmckTGFiZWwgPC0gZmFjdG9yKHNsb3BlX2RhdGFfbG9uZyRMYWJlbCwgbGV2ZWxzID0gdW5pcXVlKHNsb3BlX2RhdGEkTGFiZWwpKQ0KDQojIENyZWF0ZSB0aGUgYmFyIGdyYXBoDQpnZ3Bsb3Qoc2xvcGVfZGF0YV9sb25nLCBhZXMoeCA9IExhYmVsLCB5ID0gU2xvcGUsIGZpbGwgPSBJbmRleCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICANCiAgIyBBZGQgdGV4dCBsYWJlbHMgdG8gdGhlIGJhcnMNCiAgZ2VvbV90ZXh0KA0KICAgIGFlcyhsYWJlbCA9IHNwcmludGYoIiUuMmYlJSIsIFNsb3BlKSksDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksDQogICAgdmp1c3QgPSAtMC41LCAjIFBvc2l0aW9uIGxhYmVscyBhYm92ZSB0aGUgYmFycw0KICAgIHNpemUgPSA0ICAgICAgIyBTZXQgdGV4dCBzaXplIGZvciByZWFkYWJpbGl0eQ0KICApICsNCiAgDQogICMgRm9ybWF0IHRoZSB5LWF4aXMgZm9yIHBlcmNlbnRhZ2UgdmFsdWVzDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KHNjYWxlID0gMSkpICsNCiAgDQogICMgU2V0IGdyYXBoIHRpdGxlcyBhbmQgbGFiZWxzDQogIGxhYnMoDQogICAgdGl0bGUgPSAiTGluZWFyIFJlZ3Jlc3Npb24gU2xvcGUgZm9yIFJvbGxpbmcgQ0FHUnMgQnkgSW5kZXgiLA0KICAgIHN1YnRpdGxlID0gcGFzdGUoIkNvbXBhcmlzb24gb2YgUyZQIDUwMCBhbmQgUVFRIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIsIHNlcCA9ICIiKSwNCiAgICB4ID0gIlJvbGxpbmcgUGVyaW9kIiwNCiAgICB5ID0gIlNsb3BlIFZhbHVlICglKSIsDQogICAgZmlsbCA9ICJJbmRleCINCiAgKSArDQogIA0KICAjIEFwcGx5IHRoZW1lIHNldHRpbmdzIGZvciBiZXR0ZXIgYWVzdGhldGljcw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksIA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBtYXJnaW4gPSBtYXJnaW4odCA9IDEwKSksICMgQWRkIHNwYWNlIGFib3ZlIFgtYXhpcyB0aXRsZQ0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciBZLWF4aXMgdGl0bGUgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgdmp1c3QgPSAwLjUpLCAgICAgICAgICAgICAjIEFkanVzdCBYLWF4aXMgdGV4dCBzaXplIGFuZCBzcGFjaW5nDQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIFktYXhpcyB0ZXh0DQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTm8gbWlub3IgWCBncmlkIGxpbmVzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICAgICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICAgICAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICAgICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCmBgYA0KDQpUaGVyZSBhcmUgY29uc2lzdGVudGx5IGhpZ2hlciBzbG9wZXMgZm9yIFFRUSBjb21wYXJlZCB0byB0aGUgUyZQIDUwMC4gSWYgd2UgcmVmZXIgYmFjayB0byBTUFggVlMgUVFROiBBbm51YWwgR1Igc2VjdGlvbiwgd2UgZmluZCBzaGFycCBzd2luZ3MgKGUuZy4sIGR1cmluZyAyMDA4IGFuZCAyMDIwKSBhbmQgcGVyaW9kcyBvZiBjb25zaXN0ZW50IHRyZW5kcyAoZS5nLiwgUVFR4oCZcyBzdHJvbmcgcG9zdC0yMDA5IGdyb3d0aCkuIFRoaXMgc2lnbmlmaWNhbnRseSBpbmZsdWVuY2VkIHRoZSBzbG9wZSBjYWxjdWxhdGlvbnMsIHBhcnRpY3VsYXJseSBmb3Igc2hvcnRlciByb2xsaW5nIHBlcmlvZHMgbGlrZSB0aGUgMS15ZWFyIENBR1IsIGFzIGxhcmdlciB2YXJpYWJpbGl0eSBhbmQgb3V0bGllcnMgKGUuZy4sIGV4dHJlbWUgbmVnYXRpdmUgb3IgcG9zaXRpdmUgZ3Jvd3RoIHllYXJzKSBhbXBsaWZ5IHRoZSBzbG9wZSB2YWx1ZS4NCg0KIyMjIFByb2plY3Rpb24NCg0KIyMjIyBBbm51YWwgKyBTbG9wZQ0KDQpgYGB7ciBjYWdyXzF5ZWFyX3Byb2plY3Rpb24sIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCiMgRW5zdXJlIHRoZSBsaWJyYXJpZXMgYXJlIGxvYWRlZA0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQoNCiMgRGVidWdnaW5nOiBDaGVjayBgc3VtbWFyeV9kYXRhYCBhbmQgYHNsb3BlX2RhdGFgIHN0cnVjdHVyZXMNCiMgY29sbmFtZXMoc3VtbWFyeV9kYXRhKSAgIyBTaG91bGQgaW5jbHVkZSAiTWV0cmljIiwgIlMmUCA1MDAiLCAiUVFRIg0KIyBjb2xuYW1lcyhzbG9wZV9kYXRhKSAgICAjIFNob3VsZCBpbmNsdWRlICJNZXRyaWMiLCAiUyZQIDUwMCIsICJRUVEiDQoNCiMgRXh0cmFjdCBzdGFydGluZyB2YWx1ZXMgZm9yIDEtWWVhciBDQUdSIGZyb20gc3VtbWFyeV9kYXRhDQpzcDUwMF9zdGFydCA8LSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgc3VtbWFyeV9kYXRhJGBTJlAgNTAwYFtzdW1tYXJ5X2RhdGEkTWV0cmljID09ICIxLVllYXIgQ0FHUiJdKSkNCnFxcV9zdGFydCA8LSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgc3VtbWFyeV9kYXRhJFFRUVtzdW1tYXJ5X2RhdGEkTWV0cmljID09ICIxLVllYXIgQ0FHUiJdKSkNCg0KIyBzcDUwMF9zdGFydCA8LSAxMDANCiMgcXFxX3N0YXJ0IDwtIDEwMA0KDQojIEVuc3VyZSB0aGUgc3RhcnRpbmcgdmFsdWVzIGFyZSB2YWxpZA0KaWYgKGxlbmd0aChzcDUwMF9zdGFydCkgPT0gMCB8fCBsZW5ndGgocXFxX3N0YXJ0KSA9PSAwKSB7DQogIHN0b3AoIkZhaWxlZCB0byBleHRyYWN0IHN0YXJ0aW5nIHZhbHVlcyBmb3IgUyZQIDUwMCBvciBRUVEgZnJvbSBzdW1tYXJ5X2RhdGEuIikNCn0NCg0KIyBSZW1vdmUgcGVyY2VudGFnZSBzeW1ib2xzIGFuZCBjb252ZXJ0IHNsb3BlcyB0byBudW1lcmljDQpzbG9wZV9kYXRhJGBTJlAgNTAwYCA8LSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgc2xvcGVfZGF0YSRgUyZQIDUwMGApKQ0Kc2xvcGVfZGF0YSRRUVEgPC0gYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIHNsb3BlX2RhdGEkUVFRKSkNCg0KIyBFeHRyYWN0IHNsb3BlcyBmb3IgMS1ZZWFyIENBR1INCnNwNTAwX3Nsb3BlIDwtIHNsb3BlX2RhdGEkYFMmUCA1MDBgW3Nsb3BlX2RhdGEkTWV0cmljID09ICIxLVllYXIgQ0FHUiJdDQpxcXFfc2xvcGUgPC0gc2xvcGVfZGF0YSRRUVFbc2xvcGVfZGF0YSRNZXRyaWMgPT0gIjEtWWVhciBDQUdSIl0NCg0KIyBFbnN1cmUgc2xvcGVzIGFyZSB2YWxpZCBudW1lcmljIHZhbHVlcw0KaWYgKGxlbmd0aChzcDUwMF9zbG9wZSkgPT0gMCB8fCBsZW5ndGgocXFxX3Nsb3BlKSA9PSAwKSB7DQogIHN0b3AoIkZhaWxlZCB0byBleHRyYWN0IHZhbGlkIG51bWVyaWMgc2xvcGVzIGZvciBTJlAgNTAwIG9yIFFRUSBmcm9tIHNsb3BlX2RhdGEuIikNCn0NCg0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gbWluKG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChtZXJnZWRfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIFNldCBkYXRlIHJhbmdlDQpzdGFydF95ZWFyID0gYXMubnVtZXJpYyhtYXhfeWVhcikNCm51bWJlcl95ZWFycyA9IDIwDQplbmRfeWVhciA9IHN1bShzdGFydF95ZWFyICsgbnVtYmVyX3llYXJzKQ0KDQojIERlZmluZSBicmVha3Mgcm91bmRlZCBhcHByb3ByaWF0ZWx5DQpsaW1pdHNfc3RhcnRfeWVhciA8LSBmbG9vcihzdGFydF95ZWFyIC8gMikgKiAyICAjIFJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgMg0KbGltaXRzX2VuZF95ZWFyIDwtIGNlaWxpbmcoZW5kX3llYXIgLyAyKSAqIDIgICAjIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDINCiAgDQojIEluaXRpYWxpemUgdGhlIHByb2plY3Rpb25zIGRhdGFmcmFtZSB3aXRoIHRoZSBzdGFydGluZyB5ZWFyIGFuZCBpbml0aWFsIHZhbHVlcw0KcHJvamVjdGlvbnMgPC0gZGF0YS5mcmFtZSgNCiAgRGF0ZSA9IHN0YXJ0X3llYXIsDQogIGBTJlAgNTAwYCA9IHNwNTAwX3N0YXJ0LA0KICBRUVEgPSBxcXFfc3RhcnQNCikNCg0KIyBSZW5hbWUgdGhlIGNvbHVtbiBmcm9tICJTLlAuNTAwIiB0byAiUyZQIDUwMCINCmNvbG5hbWVzKHByb2plY3Rpb25zKVtjb2xuYW1lcyhwcm9qZWN0aW9ucykgPT0gIlMuUC41MDAiXSA8LSAiUyZQIDUwMCINCg0KIyBWZXJpZnkgdGhlIGNoYW5nZQ0KaW50ZXJhY3RpdmVfc3RyKHByb2plY3Rpb25zKQ0KIyBFbnN1cmUgdGhlIGNvbHVtbiBuYW1lcyBhcmUgY29uc2lzdGVudA0KIyBjb2xuYW1lcyhwcm9qZWN0aW9ucykNCg0KIyBDb21wdXRlIHByb2plY3Rpb25zIGZvciB0aGUgbmV4dCAyMCB5ZWFycw0KZm9yIChpIGluIDE6bnVtYmVyX3llYXJzKSB7DQogIG5ld19yb3cgPC0gZGF0YS5mcmFtZSgNCiAgICBEYXRlID0gc3RhcnRfeWVhciArIGksDQogICAgYFMmUCA1MDBgID0gcHJvamVjdGlvbnMkYFMmUCA1MDBgW2ldICsgc3A1MDBfc2xvcGUsDQogICAgUVFRID0gcHJvamVjdGlvbnMkUVFRW2ldICsgcXFxX3Nsb3BlDQogICkNCiAgDQogICMgRW5zdXJlIHRoZSBuZXcgcm93IGhhcyB0aGUgc2FtZSBjb2x1bW4gbmFtZXMgYXMgdGhlIHByb2plY3Rpb25zIGRhdGFmcmFtZQ0KICBjb2xuYW1lcyhuZXdfcm93KSA8LSBjb2xuYW1lcyhwcm9qZWN0aW9ucykNCiAgDQogICMgQXBwZW5kIHRoZSBuZXcgcm93DQogIHByb2plY3Rpb25zIDwtIHJiaW5kKHByb2plY3Rpb25zLCBuZXdfcm93KQ0KfQ0KDQojIFNvcnQgdGhlIHByb2plY3Rpb25zIGRhdGFmcmFtZSBieSBEYXRlIGluIGRlc2NlbmRpbmcgb3JkZXINCnByb2plY3Rpb25zIDwtIHByb2plY3Rpb25zICU+JQ0KICBhcnJhbmdlKGRlc2MoRGF0ZSkpDQoNCiMgRm9ybWF0IFMmUCA1MDAsIFFRUSwgYW5kIFJhdGlvIGNvbHVtbnMNCmlmIChucm93KHByb2plY3Rpb25zKSA+IDApIHsNCiAgcHJvamVjdGlvbnMkRGF0ZSA8LSBhcy5jaGFyYWN0ZXIocHJvamVjdGlvbnMkRGF0ZSkNCiAgcHJvamVjdGlvbnMkYFMmUCA1MDBgIDwtIGFzLmNoYXJhY3Rlcihwcm9qZWN0aW9ucyRgUyZQIDUwMGApDQogIHByb2plY3Rpb25zJFFRUSA8LSBhcy5jaGFyYWN0ZXIocHJvamVjdGlvbnMkUVFRKQ0KfSBlbHNlIHsNCiAgc3RvcCgiTm8gZGF0YSB0byBzdW1tYXJpemUgb3Igcm93cyBkbyBub3QgbWF0Y2guIikNCn0NCg0KIyBWZXJpZnkgdGhlIHByb2plY3Rpb25zDQppbnRlcmFjdGl2ZV9wcmludChwcm9qZWN0aW9ucykNCmludGVyYWN0aXZlX3N0cihwcm9qZWN0aW9ucykNCmZvcm1hdF9lcXVhbF93aWR0aChwcm9qZWN0aW9ucykNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIENSRUFURSBQTE9UDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KcHJvamVjdGlvbnMgPC0gcHJvamVjdGlvbnMgJT4lDQogIG11dGF0ZSgNCiAgICBgRGF0ZWAgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihgRGF0ZWApKSwgICMgRW5zdXJlIERhdGUgaXMgbnVtZXJpYw0KICAgIGBTJlAgNTAwYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgUyZQIDUwMGApKSwNCiAgICBgUVFRYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgUVFRYCkpDQogICkNCg0KIyBDb252ZXJ0IHRvIGxvbmcgZm9ybWF0IGZvciBnZ3Bsb3QyDQpwcm9qZWN0aW9uc19sb25nIDwtIHByb2plY3Rpb25zICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYFMmUCA1MDBgLCBRUVEpLCBuYW1lc190byA9ICJJbmRleCIsIHZhbHVlc190byA9ICJDQUdSIikNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBJbmRleA0KdW5pcXVlX3R5cGVzIDwtIHVuaXF1ZShwcm9qZWN0aW9uc19sb25nJEluZGV4KQ0KY3VzdG9tX2NvbG9ycyA8LSBzZXROYW1lcyhjb2xvcnNfZ2VuZXJhbF9kYXJrWzE6bGVuZ3RoKHVuaXF1ZV90eXBlcyldLCB1bmlxdWVfdHlwZXMpDQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCJQcm9qZWN0ZWQgR3Jvd3RoIFJhdGUgT3ZlciAiLCBudW1iZXJfeWVhcnMsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIlByb2plY3RlZCBHcm93dGggUmF0ZSAoQXZlcmFnZSBHcm93dGggKyBTbG9wZSksIERhdGFzZXQgKCIsIG1pbl95ZWFyLCAiLSIsIG1heF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBwcm9qZWN0aW9uIHBsb3QNCmdncGxvdChwcm9qZWN0aW9uc19sb25nLCBhZXMoeCA9IERhdGUsIHkgPSBDQUdSLCBjb2xvciA9IEluZGV4KSkgKw0KDQoNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMDMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUpLCBmaWxsID0gIm9yYW5nZSIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IC1JbmYsIHltYXggPSB0YXJnZXRfY29uc2VydmF0aXZlKSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjAzMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIE1hcmtldCBJbmRleA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMjUsIGFscGhhID0gMy4wKSArICAgICAgICMgTGluZSBmb3IgZWFjaCBDQUdSDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIuMCwgYWxwaGEgPSAzLjApICsgICAgICAgIyBQb2ludHMgZm9yIGVhY2ggQ0FHUg0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X21vZGVyYXRlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KDQogICMgRHluYW1pYyByaWdodC1hbGlnbmVkIHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGxhYmVsID0gIkFnZ3Jlc3NpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgIyBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfbW9kZXJhdGUsIGxhYmVsID0gIk1vZGVyYXRlIiwgDQogICMgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBsYWJlbCA9ICJDb25zZXJ2YXRpdmUiLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2luZmxhdGlvbiwgbGFiZWwgPSAiSW5mbGF0aW9uIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCg0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiR3Jvd3RoIFJhdGUgKCUpIiwNCiAgICBjb2xvciA9ICJJbmRleCIsDQogICAgY2FwdGlvbiA9IGR5bmFtaWNfY2FwdGlvbg0KICAgICkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICsgICMgU2V0IGNvbG9ycyBmb3IgZWFjaCBNYXJrZXQgSW5kZXgNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGxpbWl0cyA9IGMoc3RhcnRfeWVhciwgZW5kX3llYXIpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgMikgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgKSArIA0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMjIFNhdmUgRGF0YWZyYW1lIHVzaW5nIGZ1bmN0aW9uIA0KIyBEZWZpbmUgcGFyYW1ldGVycw0KaW5kZXhfMSA8LSAic3A1MDAiDQppbmRleF8yIDwtICJxcXEiDQpzdGFydF95ZWFyIDwtIHN0YXJ0X3llYXINCmVuZF95ZWFyIDwtIGVuZF95ZWFyDQoNCiMgVXNlIHRoZSBmdW5jdGlvbiB0byBzYXZlIHRoZSBkYXRhZnJhbWUNCnNhdmVfZGF0YWZyYW1lX2luZGV4XzFfaW5kZXhfMl9zdGFydF95ZWFyX2VuZF95ZWFyKHByb2plY3Rpb25zLCBpbmRleF8xLCBpbmRleF8yLCBzdGFydF95ZWFyLCBlbmRfeWVhcikNCnNhdmVfZGF0YWZyYW1lX2luZGV4XzFfaW5kZXhfMihwcm9qZWN0aW9ucywgaW5kZXhfMSwgaW5kZXhfMikNCg0KIyBBY2Nlc3MgdGhlIHNhdmVkIHZhcmlhYmxlIGRpcmVjdGx5DQppbnRlcmFjdGl2ZV9jYXQoIkRhdGFmcmFtZSBzYXZlZCBhcyB2YXJpYWJsZToiLCBwYXN0ZTAoInByb2plY3Rpb25zXyIsIGluZGV4XzEsICJfIiwgaW5kZXhfMiwgIl9zIiwgc3RhcnRfeWVhciwgIl9lIiwgZW5kX3llYXIpLCAiXG4iKQ0KIyBBY2Nlc3MgdGhlIHNhdmVkIHZhcmlhYmxlIGRpcmVjdGx5DQppbnRlcmFjdGl2ZV9jYXQoIkRhdGFmcmFtZSBzYXZlZCBhcyB2YXJpYWJsZToiLCBwYXN0ZTAoInByb2plY3Rpb25zXyIsIGluZGV4XzEsICJfIiwgaW5kZXhfMikpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBTQVZFIFZBTFVFUyBGT1IgSU4tTElORSBDT0RFIElOQ0xVRElORyBSQVRJT1MNCg0KIyBEZWZpbmUgYSBmdW5jdGlvbiB0byBzYXZlIHByb2plY3RlZCBncm93dGggcmF0ZSB2YWx1ZXMgZHluYW1pY2FsbHkNCnNhdmVfcHJvamVjdGVkX3ZhbHVlcyA8LSBmdW5jdGlvbihwcm9qZWN0aW9ucywgY29sdW1uX21hcHBpbmcpIHsNCiAgZm9yIChyb3cgaW4gc2VxX2xlbihucm93KHByb2plY3Rpb25zKSkpIHsNCiAgICBmb3IgKGNvbCBpbiBuYW1lcyhjb2x1bW5fbWFwcGluZykpIHsNCiAgICAgICMgQ29uc3RydWN0IHRoZSB2YXJpYWJsZSBuYW1lIGJhc2VkIG9uIHRoZSBjb2x1bW4gYW5kIHllYXINCiAgICAgIHZhcmlhYmxlX25hbWUgPC0gcGFzdGUwKCJwcm9qZWN0ZWRfZ3JfIiwgY29sdW1uX21hcHBpbmdbW2NvbF1dLCAiXyIsIHByb2plY3Rpb25zJERhdGVbcm93XSkNCiAgICAgIA0KICAgICAgIyBFeHRyYWN0IHRoZSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgcm93IGFuZCBjb2x1bW4NCiAgICAgIHZhbHVlIDwtIHByb2plY3Rpb25zW1tjb2xdXVtyb3ddDQogICAgICANCiAgICAgICMgU2F2ZSB0aGUgdmFsdWUgZHluYW1pY2FsbHkNCiAgICAgIGFzc2lnbih2YXJpYWJsZV9uYW1lLCB2YWx1ZSwgZW52aXIgPSAuR2xvYmFsRW52KQ0KICAgIH0NCiAgfQ0KfQ0KDQojIEN1c3RvbSBtYXBwaW5nIGZvciBjb2x1bW5zDQpjb2x1bW5fbmFtZV9tYXBwaW5nIDwtIGMoDQogIGBTJlAgNTAwYCA9ICJzcDUwMCIsDQogIFFRUSA9ICJxcXEiDQopDQoNCiMgQ2FsbCB0aGUgZnVuY3Rpb24gdG8gc2F2ZSB2YWx1ZXMgZHluYW1pY2FsbHkNCnNhdmVfcHJvamVjdGVkX3ZhbHVlcyhwcm9qZWN0aW9ucywgY29sdW1uX25hbWVfbWFwcGluZykNCg0KIyBFeGFtcGxlOiBBY2Nlc3MgZHluYW1pY2FsbHkgc2F2ZWQgdmFyaWFibGVzDQppbnRlcmFjdGl2ZV9wcmludChwcm9qZWN0ZWRfZ3Jfc3A1MDBfMjAzNCkgICMgU2hvdWxkIHByaW50IHRoZSBwcm9qZWN0ZWQgZ3Jvd3RoIHJhdGUgZm9yIFMmUCA1MDAgaW4gMjAzNA0KaW50ZXJhY3RpdmVfcHJpbnQocHJvamVjdGVkX2dyX3FxcV8yMDM0KSAgICAjIFNob3VsZCBwcmludCB0aGUgcHJvamVjdGVkIGdyb3d0aCByYXRlIGZvciBRUVEgaW4gMjAzNA0KaW50ZXJhY3RpdmVfcHJpbnQocHJvamVjdGVkX2dyX3NwNTAwXzIwMjQpICAjIFNob3VsZCBwcmludCB0aGUgcHJvamVjdGVkIGdyb3d0aCByYXRlIGZvciBTJlAgNTAwIGluIDIwMjQNCmludGVyYWN0aXZlX3ByaW50KHByb2plY3RlZF9ncl9xcXFfMjAyNCkgICAgIyBTaG91bGQgcHJpbnQgdGhlIHByb2plY3RlZCBncm93dGggcmF0ZSBmb3IgUVFRIGluIDIwMjQNCg0KDQoNCg0KICAgIA0KYGBgDQoNClRoZSBgciBtYXhfeWVhciAtIG1pbl95ZWFyYC1ZZWFyIHByb2plY3Rpb24gcmVmbGVjdHMgYmVoYXZpb3Igb2YgdGhlIGNhbGN1bGF0ZWQgQXZlcmFnZXMgYW5kIExpbmVhciBSZWdyZXNzaW9uIFNsb3BlIGZyb20gYHIgc3RhcnRfeWVhcmAgdGhydSBgciBlbmRfeWVhcmAuIFMmUCA1MDAncyAxLXllYXIgYW5udWFsIGF2ZXJhZ2UgZ3Jvd3RoIHJhdGUgKGByICByb2xsaW5nX2F2Z18xX3llYXJfY2Fncl9zcDUwMGAlKSBhbmQgc2xvcGUgKGByIHJvbGxpbmdfc2xvcGVfMV95ZWFyX2NhZ3Jfc3A1MDBgKSBwcm92aWRlcyB1cyB3aXRoIGEgcHJvamVjdGVkIGEgZ3Jvd3RoIHJhdGUgb2YgYHIgcHJvamVjdGVkX2dyX3NwNTAwXzIwMzRgIGJ5IDIwMzQuIFFRUSdzIDEteWVhciBhbm51YWwgYXZlcmFnZSBncm93dGggcmF0ZSAoYHIgIHJvbGxpbmdfYXZnXzFfeWVhcl9jYWdyX3FxcWAlKSBhbmQgc2xvcGUgKGByIHJvbGxpbmdfc2xvcGVfMV95ZWFyX2NhZ3JfcXFxYCkgcHJvdmlkZXMgdXMgd2l0aCBhIHByb2plY3RlZCBhdmVyYWdlIGdyb3d0aCByYXRlIG9mIGByIHByb2plY3RlZF9ncl9xcXFfMjAzNGAgYnkgMjAzNCwgYW5kIA0KDQpUaGUgZ3JhcGggYmVsb3cgc2hvd3MgdGhlIFVuZm9ydHVuYXRlbHkgdGhpcyBwcm9qZWN0aW9uIGlzIGh5cG90aGV0aWNhbCBiYXNlZCBvbiB0aGUgcGVyZm9ybWFuY2Ugb3ZlciB0aW1lIHBlcmlvZC4gcmFuZ2UuIEFzIGJvdGggUyZQIDUwMCBHUiBHcmFwaCBhbmQgUVFRIEdSIEdyYXBoIHNob3dzLCB0aGVyZSBpcyBxdWl0ZSB0aGUgdm9sYXRpbGl0eSBhbmQgZmx1Y3R1YXRpb24gdGhhdCB0aGlzIGdyYXBoIGNsZWFybHkgZG9lcyBub3QgcHJlc2VudC4gDQoNClNoaWZ0aW5nIG9yIHNob3J0ZW5pbmcgdGhlIGRhdGUgcmFuZ2Ugd291bGQgc2lnbmlmaWNhbnRseSBpbXBhY3QgdGhlIENBR1IgYW5kIHRoZSBzbG9wZS4gRm9jdXNpbmcgb24gYSByYW5nZSBkb21pbmF0ZWQgYnkgU1BYJ3Mgc3Ryb25nIHBlcmZvcm1hbmNlIChlLmcuLCBlYXJseSAyMDAwcykgd291bGQgbGlrZWx5IGZsYXR0ZW4gUVFRJ3Mgc2xvcGUgYW5kIGJvb3N0IFNQWCdzIHJlbGF0aXZlIGdyb3d0aC4gQ29udmVyc2VseSwgZW1waGFzaXppbmcgbW9yZSByZWNlbnQgeWVhcnMgd291bGQgYW1wbGlmeSBRUVEncyBDQUdSIGRvbWluYW5jZSBhbmQgaW5jcmVhc2UgaXRzIHNsb3BlLCBnaXZlbiBpdHMgc3Ryb25nZXIgcGVyZm9ybWFuY2UgaW4gdGhlIGxhc3QgdHdvIGRlY2FkZXMuIFRoZSBjaG9pY2Ugb2YgdGhlIGRhdGUgcmFuZ2UgdGh1cyBjcml0aWNhbGx5IHNoYXBlcyB0aGUgcGVyY2VpdmVkIGdyb3d0aCB0cmFqZWN0b3JpZXMgYW5kIHJlbGF0aXZlIHN0cmVuZ3RocyBvZiB0aGUgaW5kaWNlcyBpbiBwcm9qZWN0aW9uIG1vZGVscy4NCg0KIyMjIyBIUCB2MQ0KDQpgYGB7ciBjYWdyXzF5ZWFyX2hpc3RvcmljYWxfcHJvamVjdGlvbiwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTcsIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBFbnN1cmUgdGhlIGxpYnJhcmllcyBhcmUgbG9hZGVkDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCg0KaW50ZXJhY3RpdmVfc3RyKG1lcmdlZF9kYXRhX3NwNTAwX3FxcSkNCmludGVyYWN0aXZlX3N0cihwcm9qZWN0aW9uc19zcDUwMF9xcXEpDQoNCiMgQ2xlYW4gYW5kIHByZXBhcmUgSGlzdG9yaWNhbCBEYXRhc2V0DQpoaXN0b3JpY2FsX2RhdGEgPC0gbWVyZ2VkX2RhdGFfc3A1MDBfcXFxICU+JQ0KICBtdXRhdGUoDQogICAgRGF0ZSA9IGFzLm51bWVyaWMoRGF0ZSksDQogICAgYFMmUCA1MDBgID0gY2xlYW5fbnVtZXJpYyhgUyZQIDUwMGApLA0KICAgIFFRUSA9IGNsZWFuX251bWVyaWMoUVFRKQ0KICApICU+JQ0KICBzZWxlY3QoRGF0ZSwgYFMmUCA1MDBgLCBRUVEpDQoNCiMgQ2xlYW4gYW5kIHByZXBhcmUgUHJvamVjdGVkIERhdGFzZXQNCnByb2plY3RlZF9kYXRhIDwtIHByb2plY3Rpb25zX3NwNTAwX3FxcSAlPiUNCiAgbXV0YXRlKA0KICAgIERhdGUgPSBhcy5udW1lcmljKERhdGUpLCAgIyBDb252ZXJ0IERhdGUgdG8gbnVtZXJpYyBpZiBuZWVkZWQNCiAgICBgUyZQIDUwMGAgPSBhcy5udW1lcmljKGBTJlAgNTAwYCksICAjIEFzc3VtaW5nIHRoaXMgaXMgYWxyZWFkeSBudW1lcmljDQogICAgUVFRID0gYXMubnVtZXJpYyhRUVEpICAjIEFzc3VtaW5nIHRoaXMgaXMgYWxyZWFkeSBudW1lcmljDQogICkgJT4lDQogIHNlbGVjdChEYXRlLCBgUyZQIDUwMGAsIFFRUSkNCg0KIyBWaWV3IHRoZSBjbGVhbmVkIGRhdGFzZXRzDQppbnRlcmFjdGl2ZV9wcmludChoaXN0b3JpY2FsX2RhdGEpDQppbnRlcmFjdGl2ZV9wcmludChwcm9qZWN0ZWRfZGF0YSkNCg0KIyBQcmVwYXJlIEhpc3RvcmljYWwgRGF0YSBmb3IgUGxvdHRpbmcNCmhpc3RvcmljYWxfbG9uZyA8LSBoaXN0b3JpY2FsX2RhdGEgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgUyZQIDUwMGAsIFFRUSksIG5hbWVzX3RvID0gIkluZGV4IiwgdmFsdWVzX3RvID0gIkNBR1IiKSAlPiUNCiAgbXV0YXRlKGBEYXRlIFR5cGVgID0gIkhpc3RvcmljYWwiKSAgIyBBZGQgRGF0ZSBUeXBlIGNvbHVtbg0KDQojIFByZXBhcmUgUHJvamVjdGVkIERhdGEgZm9yIFBsb3R0aW5nDQpwcm9qZWN0ZWRfbG9uZyA8LSBwcm9qZWN0ZWRfZGF0YSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGBTJlAgNTAwYCwgUVFRKSwgbmFtZXNfdG8gPSAiSW5kZXgiLCB2YWx1ZXNfdG8gPSAiQ0FHUiIpICU+JQ0KICBtdXRhdGUoYERhdGUgVHlwZWAgPSAiUHJvamVjdGVkIikgICMgQWRkIERhdGUgVHlwZSBjb2x1bW4NCg0KIyBDb21iaW5lIERhdGEgZm9yIENvbnNpc3RlbnQgTGVnZW5kDQpjb21iaW5lZF9sb25nIDwtIGJpbmRfcm93cyhoaXN0b3JpY2FsX2xvbmcsIHByb2plY3RlZF9sb25nKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcnMgZm9yIHNldHRpbmcgYXhpcyBsaW1pdHMNCm1pbl95ZWFyIDwtIG1pbihjb21iaW5lZF9sb25nJERhdGUpDQptYXhfeWVhciA8LSBtYXgoY29tYmluZWRfbG9uZyREYXRlKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBTZXQgZGF0ZSByYW5nZQ0Kc3RhcnRfeWVhciA9IGFzLm51bWVyaWMobWluX3llYXIpDQplbmRfeWVhciA9IGFzLm51bWVyaWMobWF4X3llYXIpDQpudW1iZXJfeWVhcnMgPSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiAyDQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgMg0KDQojIEFzc2lnbiBjb2xvcnMgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIG9yZGVyIG9mIEluZGV4DQp1bmlxdWVfdHlwZXMgPC0gdW5pcXVlKHByb2plY3Rpb25zX2xvbmckSW5kZXgpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSAiSGlzdG9yaWNhbCB0byBQcm9qZWN0ZWQgR3Jvd3RoIFJhdGUiDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJIaXN0b3JpY2FsIEdyb3d0aCBSYXRlICgiLCBtaW4oaGlzdG9yaWNhbF9kYXRhJERhdGUpLCAiLSIsIG1heChoaXN0b3JpY2FsX2RhdGEkRGF0ZSksICIpIC8vIFByb2plY3RlZCBBdmVyYWdlIEdyb3d0aCBSYXRlICgiLCBtaW4ocHJvamVjdGVkX2RhdGEkRGF0ZSksICItIiwgbWF4KHByb2plY3RlZF9kYXRhJERhdGUpLCAiKSIpDQoNCiMgVXBkYXRlIHRoZSBEYXRhX1R5cGUgY29sdW1uIHRvICJEYXRlIFR5cGUiDQpjb21iaW5lZF9sb25nIDwtIGNvbWJpbmVkX2xvbmcgJT4lDQogIG11dGF0ZSgNCiAgICBgRGF0ZSBUeXBlYCA9IGlmZWxzZShEYXRlIDw9IGVuZF95ZWFyLCAiSGlzdG9yaWNhbCIsICJQcm9qZWN0ZWQiKSAgIyBBZGQgRGF0ZSBUeXBlIGNvbHVtbg0KICApDQoNCiMgQ3JlYXRlIENvbXBhcmlzb24gR3JhcGgNCmdncGxvdCgpICsNCiAgDQogICMgQWRkIEhpc3RvcmljYWwgRGF0YQ0KICBnZW9tX2xpbmUoZGF0YSA9IGhpc3RvcmljYWxfbG9uZywgYWVzKHggPSBEYXRlLCB5ID0gQ0FHUiwgY29sb3IgPSBJbmRleCwgbGluZXR5cGUgPSBgRGF0ZSBUeXBlYCksIHNpemUgPSAxLjI1KSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGhpc3RvcmljYWxfbG9uZywgYWVzKHggPSBEYXRlLCB5ID0gQ0FHUiwgY29sb3IgPSBJbmRleCksIHNpemUgPSAyLjApICsNCiAgDQogICMgQWRkIFByb2plY3RlZCBEYXRhDQogIGdlb21fbGluZShkYXRhID0gcHJvamVjdGVkX2xvbmcsIGFlcyh4ID0gRGF0ZSwgeSA9IENBR1IsIGNvbG9yID0gSW5kZXgsIGxpbmV0eXBlID0gYERhdGUgVHlwZWApLCBzaXplID0gMS4yNSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwcm9qZWN0ZWRfbG9uZywgYWVzKHggPSBEYXRlLCB5ID0gQ0FHUiwgY29sb3IgPSBJbmRleCksIHNpemUgPSAyLjApICsNCiAgIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBiYWNrZ3JvdW5kIGVmZmVjdA0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIHltYXggPSBJbmYpLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBhbHBoYSA9IDAuMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4zMCkgKw0KICANCiAgIyBQbG90IGxpbmVzIGZvciBlYWNoIE1hcmtldCBJbmRleA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMDAsIGFscGhhID0gMy4wKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEuNTAsIGFscGhhID0gMy4wKSArDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQoNCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9ICsxLjEwLCBjb2xvciA9ICJkYXJrcmVkIiwgc2l6ZSA9IDQpICsNCiAgDQogICAjIEFkZCB0aXRsZXMgYW5kIGxhYmVscw0KICBsYWJzKA0KICAgIHRpdGxlID0gZHluYW1pY190aXRsZSwNCiAgICB4ID0gIlllYXIiLA0KICAgIHkgPSAiR3Jvd3RoIFJhdGUgKCUpIiwNCiAgICBjb2xvciA9ICJJbmRleCIsDQogICAgbGluZXR5cGUgPSAiRGF0ZSBUeXBlIiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQoNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoIkhpc3RvcmljYWwiID0gInNvbGlkIiwgIlByb2plY3RlZCIgPSAiZGFzaGVkIikpICsgICMgU2V0IGxpbmV0eXBlcw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIE1hcmtldCBJbmRleA0KDQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyKSwgDQogICAgYnJlYWtzID0gc2VxKGxpbWl0c19zdGFydF95ZWFyLCBsaW1pdHNfZW5kX3llYXIsIDUpICAjIFJlc3RyaWN0ICYgU2V0IE1ham9yIHgtYXhpcyBsaW5lcyBmb3IgZWFjaCB5ZWFyDQogICkgKyANCiAgDQogICMgQ3VzdG9taXplIHRoZW1lDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAjIExlZ2VuZCB0ZXh0IHNpemUNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImJsYWNrIiksICAjIE1ham9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCg0KYGBgDQoNCiMjIyMgSFAgdjINCmBgYHtyIGNhZ3JfMXllYXJfaGlzdG9yaWNhbF9wcm9qZWN0aW9uX3dpdGhfc3BsaXQsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCg0KIyBFbnN1cmUgdGhlIGxpYnJhcmllcyBhcmUgbG9hZGVkDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCg0KIyBDbGVhbiBhbmQgcHJlcGFyZSBIaXN0b3JpY2FsIERhdGFzZXQNCmhpc3RvcmljYWxfZGF0YSA8LSBtZXJnZWRfZGF0YV9zcDUwMF9xcXEgJT4lDQogIG11dGF0ZShEYXRlID0gYXMubnVtZXJpYyhEYXRlKSwNCiAgICAgICAgIGBTJlAgNTAwYCA9IGNsZWFuX251bWVyaWMoYFMmUCA1MDBgKSwNCiAgICAgICAgIFFRUSA9IGNsZWFuX251bWVyaWMoUVFRKSkgJT4lDQogIHNlbGVjdChEYXRlLCBgUyZQIDUwMGAsIFFRUSkNCg0KIyBDbGVhbiBhbmQgcHJlcGFyZSBQcm9qZWN0ZWQgRGF0YXNldA0KcHJvamVjdGVkX2RhdGEgPC0gcHJvamVjdGlvbnNfc3A1MDBfcXFxICU+JQ0KICBtdXRhdGUoRGF0ZSA9IGFzLm51bWVyaWMoRGF0ZSksDQogICAgICAgICBgUyZQIDUwMGAgPSBjbGVhbl9udW1lcmljKGBTJlAgNTAwYCksDQogICAgICAgICBRUVEgPSBjbGVhbl9udW1lcmljKFFRUSkpICU+JQ0KICBzZWxlY3QoRGF0ZSwgYFMmUCA1MDBgLCBRUVEpDQoNCiMgUHJlcGFyZSBIaXN0b3JpY2FsIERhdGEgZm9yIFBsb3R0aW5nDQpoaXN0b3JpY2FsX2xvbmcgPC0gaGlzdG9yaWNhbF9kYXRhICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYFMmUCA1MDBgLCBRUVEpLCBuYW1lc190byA9ICJJbmRleCIsIHZhbHVlc190byA9ICJDQUdSIikgJT4lDQogIG11dGF0ZShgRGF0ZSBUeXBlYCA9ICJIaXN0b3JpY2FsIiwgU2VjdGlvbiA9IHBhc3RlMCgiSGlzdG9yaWNhbCBHUiAoIiwgbWluKGhpc3RvcmljYWxfZGF0YSREYXRlKSwgIi0iLCBtYXgoaGlzdG9yaWNhbF9kYXRhJERhdGUpLCAiKSIpKSAgIyBBZGQgZHluYW1pYyBTZWN0aW9uIHRpdGxlDQoNCiMgUHJlcGFyZSBQcm9qZWN0ZWQgRGF0YSBmb3IgUGxvdHRpbmcNCnByb2plY3RlZF9sb25nIDwtIHByb2plY3RlZF9kYXRhICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYFMmUCA1MDBgLCBRUVEpLCBuYW1lc190byA9ICJJbmRleCIsIHZhbHVlc190byA9ICJDQUdSIikgJT4lDQogIG11dGF0ZShgRGF0ZSBUeXBlYCA9ICJQcm9qZWN0ZWQiLCBTZWN0aW9uID0gcGFzdGUwKCJQcm9qZWN0ZWQgR1IgKCIsIG1pbihwcm9qZWN0ZWRfZGF0YSREYXRlKSwgIi0iLCBtYXgocHJvamVjdGVkX2RhdGEkRGF0ZSksICIpIikpICAjIEFkZCBkeW5hbWljIFNlY3Rpb24gdGl0bGUNCg0KIyBDb21iaW5lIEhpc3RvcmljYWwgYW5kIFByb2plY3RlZCBEYXRhDQpjb21iaW5lZF9sb25nIDwtIGJpbmRfcm93cyhoaXN0b3JpY2FsX2xvbmcsIHByb2plY3RlZF9sb25nKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcnMgZm9yIHNldHRpbmcgYXhpcyBsaW1pdHMNCm1pbl95ZWFyIDwtIG1pbihjb21iaW5lZF9sb25nJERhdGUpDQptYXhfeWVhciA8LSBtYXgoY29tYmluZWRfbG9uZyREYXRlKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBTZXQgZGF0ZSByYW5nZQ0Kc3RhcnRfeWVhciA9IGFzLm51bWVyaWMobWluX3llYXIpDQplbmRfeWVhciA9IGFzLm51bWVyaWMobWF4X3llYXIpDQpudW1iZXJfeWVhcnMgPSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyA1KSAqIDUgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiAyDQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDUpICogNSAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgMg0KDQojIEFzc2lnbiBjb2xvcnMgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIG9yZGVyIG9mIEluZGV4DQp1bmlxdWVfdHlwZXMgPC0gdW5pcXVlKHByb2plY3Rpb25zX2xvbmckSW5kZXgpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBDcmVhdGUgZHluYW1pYyB0aXRsZSBhbmQgY2FwdGlvbg0KZHluYW1pY190aXRsZSA8LSAiSGlzdG9yaWNhbCB0byBQcm9qZWN0ZWQgR3Jvd3RoIFJhdGUiDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCJIaXN0b3JpY2FsIEdyb3d0aCBSYXRlICgiLCBtaW4oaGlzdG9yaWNhbF9kYXRhJERhdGUpLCAiLSIsIG1heChoaXN0b3JpY2FsX2RhdGEkRGF0ZSksICIpIC8vIFByb2plY3RlZCBBdmVyYWdlIEdyb3d0aCBSYXRlICgiLCBtaW4ocHJvamVjdGVkX2RhdGEkRGF0ZSksICItIiwgbWF4KHByb2plY3RlZF9kYXRhJERhdGUpLCAiKSIpDQoNCiMgRGF0YSBmb3Igc2hhZGVkIGFyZWFzIChyZWN0YW5nbGVzKQ0KYmFja2dyb3VuZF9kYXRhIDwtIGRhdGEuZnJhbWUoDQogIHhtaW4gPSAtSW5mLA0KICB4bWF4ID0gSW5mLA0KICB5bWluID0gYygtSW5mLCB0YXJnZXRfY29uc2VydmF0aXZlLCB0YXJnZXRfYWdncmVzc2l2ZSksDQogIHltYXggPSBjKHRhcmdldF9jb25zZXJ2YXRpdmUsIHRhcmdldF9hZ2dyZXNzaXZlLCBJbmYpLA0KICBmaWxsID0gYygibGlnaHRjb3JhbCIsICJvcmFuZ2UiLCAibGlnaHRncmVlbiIpDQopDQoNCiMgQ3JlYXRlIHRoZSBncmFwaA0KZ2dwbG90KGNvbWJpbmVkX2xvbmcsIGFlcyh4ID0gRGF0ZSwgeSA9IENBR1IsIGNvbG9yID0gSW5kZXgsIGxpbmV0eXBlID0gYERhdGUgVHlwZWApKSArDQogIA0KICAjIEFkZCBzaGFkZWQgYmFja2dyb3VuZCBhcmVhcyB1c2luZyBhbm5vdGF0ZSgpDQogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgZmlsbCA9ICJsaWdodGNvcmFsIiwgYWxwaGEgPSAwLjMwKSArDQogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfY29uc2VydmF0aXZlLCB5bWF4ID0gdGFyZ2V0X2FnZ3Jlc3NpdmUsIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjMwKSArDQogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjMwKSArDQoNCiAgIyBBZGQgbGluZXMgYW5kIHBvaW50cyBmb3IgZWFjaCBpbmRleA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuMjUpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMi4wKSArDQoNCiAgIyBBZGQgcmVmZXJlbmNlIGxpbmVzDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfY29uc2VydmF0aXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfaW5mbGF0aW9uLCBjb2xvciA9ICJkYXJrcmVkIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KDQogICMgU3BsaXQgaW50byBmYWNldHMgZm9yIEhpc3RvcmljYWwgYW5kIFByb2plY3RlZA0KICBmYWNldF9ncmlkKH5TZWN0aW9uLCBzY2FsZXMgPSAiZnJlZV94Iiwgc3BhY2UgPSAiZnJlZSIpICsNCg0KICAjIEFkZCB0aXRsZXMsIGxhYmVscywgYW5kIGNhcHRpb25zDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJHcm93dGggUmF0ZSAoJSkiLA0KICAgIGNvbG9yID0gIkluZGV4IiwNCiAgICBsaW5ldHlwZSA9ICJEYXRlIFR5cGUiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgKSArDQoNCiAgIyBDdXN0b21pemUgY29sb3JzIGFuZCBsaW5ldHlwZXMNCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoIkhpc3RvcmljYWwiID0gInNvbGlkIiwgIlByb2plY3RlZCIgPSAiZGFzaGVkIikpICsgICMgU2V0IGxpbmV0eXBlcw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIE1hcmtldCBJbmRleA0KDQogICMgQ3VzdG9taXplIHRoZW1lDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAyMCksICAjIENlbnRlcmVkIHRpdGxlDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgIyBYLWF4aXMgdGl0bGUgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICMgWS1heGlzIHRpdGxlIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksICAjIFgtYXhpcyB0aWNrcw0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICMgWS1heGlzIHRpY2tzDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgZm9udA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgZm9udA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiKSwgICMgRmFjZXQgdGl0bGUgZm9udA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgR3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksICAgICAgICAgICAgICAgICMgUmVtb3ZlIG1pbm9yIGdyaWQgbGluZXMNCiAgICBwYW5lbC5zcGFjaW5nID0gdW5pdCgxLCAibGluZXMiKSwgICAgICAgICAgICAgICAgICAjIFNwYWNlIGJldHdlZW4gZmFjZXRzDQogICAgYXhpcy50aWNrcy5sZW5ndGggPSB1bml0KC0wLjI1LCAiY20iKSwgICAgICAgICAgICAgIyBJbmNyZWFzZSB0aWNrIGxlbmd0aA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41MCksICAgIyBEYXJrZXIgdGlja3MNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSwgICMgRGFyayBib3R0b20gYm9yZGVyDQogICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSkgICAjIERhcmsgbGVmdCBib3JkZXINCiAgKQ0KDQoNCmBgYA0KDQpCYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBncm93dGggcmF0ZQ0KDQoNCiMjIyA1LVllYXIgQ0FHUiANCg0KIyMjIyBEYXRhDQoNCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fNXllYXJfY2FnciwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQppbnRlcmFjdGl2ZV9zdHIobnJ0JHNwNTAwX3Jhd19jYWdyKQ0KaW50ZXJhY3RpdmVfc3RyKG5ydCRxcXFfcmF3X2NhZ3IpDQoNCmludGVyYWN0aXZlX3ByaW50KG5ydCRzcDUwMF9yYXdfY2FncikNCmludGVyYWN0aXZlX3ByaW50KG5ydCRxcXFfcmF3X2NhZ3IpDQoNCm1pbl95ZWFyIDwtIG1pbihucnQkc3A1MDBfcmF3X2NhZ3IkRGF0ZSkNCm1heF95ZWFyIDwtIG1heChucnQkc3A1MDBfcmF3X2NhZ3IkRGF0ZSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCm1pbl95ZWFyIDwtIG1pbihucnQkcXFxX3Jhd19jYWdyJERhdGUpDQptYXhfeWVhciA8LSBtYXgobnJ0JHFxcV9yYXdfY2FnciREYXRlKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgdGhlIHJlcXVpcmVkIGRhdGUgcmFuZ2UgKDIwMDUgdG8gdGhlIHByZXNlbnQgeWVhcikNCnN0YXJ0X3llYXIgPC0gMjAwNQ0KIyBlbmRfeWVhciA8LSAyMDI1DQplbmRfeWVhciA8LSBhcy5udW1lcmljKGZvcm1hdChTeXMuRGF0ZSgpLCAiJVkiKSkNCg0Kc3A1MDBfZmlsdGVyZWQgPC0gc3Vic2V0KG5ydCRzcDUwMF9yYXdfY2FnciwgRGF0ZSA+PSBzdGFydF95ZWFyICYgRGF0ZSA8PSBlbmRfeWVhciwgc2VsZWN0ID0gYyhEYXRlLCBgNS1ZZWFyIENBR1JgKSkNCnFxcV9maWx0ZXJlZCA8LSBzdWJzZXQobnJ0JHFxcV9yYXdfY2FnciwgRGF0ZSA+PSBzdGFydF95ZWFyICYgRGF0ZSA8PSBlbmRfeWVhciwgc2VsZWN0ID0gYyhEYXRlLCBgNS1ZZWFyIENBR1JgKSkNCg0KIyBSZW5hbWUgY29sdW1ucyBmb3IgY2xhcml0eQ0KY29sbmFtZXMoc3A1MDBfZmlsdGVyZWQpW2NvbG5hbWVzKHNwNTAwX2ZpbHRlcmVkKSA9PSAiNS1ZZWFyIENBR1IiXSA8LSAiUyZQIDUwMCINCmNvbG5hbWVzKHFxcV9maWx0ZXJlZClbY29sbmFtZXMocXFxX2ZpbHRlcmVkKSA9PSAiNS1ZZWFyIENBR1IiXSA8LSAiUVFRIg0KDQojIE1lcmdlIGRhdGFzZXRzIGJ5IERhdGUgKFllYXIpDQptZXJnZWRfZGF0YSA8LSBtZXJnZShzcDUwMF9maWx0ZXJlZCwgcXFxX2ZpbHRlcmVkLCBieSA9ICJEYXRlIikNCg0KIyBTb3J0IGJ5IERhdGUgaW4gZGVzY2VuZGluZyBvcmRlciAobW9zdCByZWNlbnQgeWVhciBmaXJzdCkNCm1lcmdlZF9kYXRhIDwtIG1lcmdlZF9kYXRhW29yZGVyKC1tZXJnZWRfZGF0YSREYXRlKSwgXQ0KDQojIEZvcm1hdCB0aGUgbWVyZ2VkIGRhdGENCm1lcmdlZF9kYXRhJERhdGUgPC0gYXMuY2hhcmFjdGVyKG1lcmdlZF9kYXRhJERhdGUpICAjIEVuc3VyZSBEYXRlIGlzIGEgY2hhcmFjdGVyIHdpdGhvdXQgY29tbWFzDQptZXJnZWRfZGF0YSRgUyZQIDUwMGAgPC0gcGFzdGUwKGZvcm1hdEMobWVyZ2VkX2RhdGEkYFMmUCA1MDBgLCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpLCAiJSIpDQptZXJnZWRfZGF0YSRRUVEgPC0gcGFzdGUwKGZvcm1hdEMobWVyZ2VkX2RhdGEkUVFRLCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpLCAiJSIpDQoNCiMgRGlzcGxheSBmb3JtYXR0ZWQgdGFibGUNCmNhdCgiXG5cbiMjIyMgNS1ZZWFyIFJvbGxpbmcgQ0FHUnMgQnkgSW5kZXggKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpXG4iLCBzZXAgPSAiIikNCmludGVyYWN0aXZlX3ByaW50KG1lcmdlZF9kYXRhKQ0KaW50ZXJhY3RpdmVfc3RyKG1lcmdlZF9kYXRhKQ0KZm9ybWF0X2VxdWFsX3dpZHRoKG1lcmdlZF9kYXRhKQ0KDQoNCmBgYA0KDQojIyMjIFN1bW1hcnkNCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl81eWVhcl9jYWdyX3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJ5DQpsaWJyYXJ5KGRwbHlyKQ0KDQojIFJlbW92ZSBwZXJjZW50YWdlIHNpZ25zIGFuZCBjb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYw0KbWVyZ2VkX2RhdGFfY2xlYW4gPC0gbWVyZ2VkX2RhdGENCm1lcmdlZF9kYXRhX2NsZWFuWzI6M10gPC0gbGFwcGx5KG1lcmdlZF9kYXRhWzI6M10sIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCB4KSkpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4obWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgRGVmaW5lIHRoZSBtZXRyaWNzIHRvIGNhbGN1bGF0ZSwgaW5jbHVkaW5nIENBR1INCm1ldHJpY3MgPC0gYygNCiAgIk1lYW4iLCANCiAgIk1lZGlhbiIsIA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLCANCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiwgDQogICJNaW4iLCANCiAgIk1heCIsIA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0Ig0KKQ0KDQojIENhbGN1bGF0ZSBtZXRyaWNzIGR5bmFtaWNhbGx5IGZvciBhbGwgbnVtZXJpYyBjb2x1bW5zDQpjYWxjdWxhdGVkX21ldHJpY3MgPC0gc2FwcGx5KG1lcmdlZF9kYXRhX2NsZWFuWzI6M10sIGZ1bmN0aW9uKGNvbCkgew0KICBtZWFuX3ZhbCA8LSBtZWFuKGNvbCwgbmEucm0gPSBUUlVFKQ0KICBzZF92YWwgPC0gc2QoY29sLCBuYS5ybSA9IFRSVUUpDQogIHBlcmNlbnRfYWJvdmUgPC0gZnVuY3Rpb24odGFyZ2V0KSBtZWFuKGNvbCA+IHRhcmdldCwgbmEucm0gPSBUUlVFKSAqIDEwMA0KICANCiAgYygNCiAgICBNZWFuID0gbWVhbl92YWwsDQogICAgTWVkaWFuID0gbWVkaWFuKGNvbCwgbmEucm0gPSBUUlVFKSwNCiAgICBgU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KWAgPSBzZF92YWwsDQogICAgYE1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpYCA9IG1lYW5fdmFsIC0gc2RfdmFsLA0KICAgIGBNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKWAgPSBtZWFuX3ZhbCArIHNkX3ZhbCwNCiAgICBNaW4gPSBtaW4oY29sLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1heCA9IG1heChjb2wsIG5hLnJtID0gVFJVRSksDQogICAgYFBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9pbmZsYXRpb24pLCAgIyBFeGFtcGxlIGluZmxhdGlvbiB0YXJnZXQ6IDIlDQogICAgYFBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9jb25zZXJ2YXRpdmUpLA0KICAgIGBQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9tb2RlcmF0ZSksDQogICAgYFBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXRgID0gcGVyY2VudF9hYm92ZSh0YXJnZXRfYWdncmVzc2l2ZSkNCiAgKQ0KfSkNCg0KIyBUcmFuc3Bvc2UgdGhlIHJlc3VsdCBhbmQgYWRkIHRoZSBNZXRyaWMgY29sdW1uDQpjdXN0b21fc3VtbWFyeSA8LSBkYXRhLmZyYW1lKA0KICBNZXRyaWMgPSBtZXRyaWNzLA0KICBjYWxjdWxhdGVkX21ldHJpY3MNCikNCg0KIyBSZW5hbWUgY29sdW1ucyB0byByZXRhaW4gdGhlIG9yaWdpbmFsIGNvbHVtbiBuYW1lcyBkeW5hbWljYWxseQ0KY29sbmFtZXMoY3VzdG9tX3N1bW1hcnkpWy0xXSA8LSBjb2xuYW1lcyhtZXJnZWRfZGF0YSlbMjozXQ0KDQojIEFkZCBwZXJjZW50YWdlIHNpZ25zIGJhY2sgdG8gYWxsIG51bWVyaWMgdmFsdWVzDQpjdXN0b21fc3VtbWFyeVstMV0gPC0gbGFwcGx5KGN1c3RvbV9zdW1tYXJ5Wy0xXSwgZnVuY3Rpb24oeCkgcGFzdGUwKGZvcm1hdEMoeCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKSkNCg0KIyBSZW1vdmUgcm93IG5hbWVzDQpyb3duYW1lcyhjdXN0b21fc3VtbWFyeSkgPC0gTlVMTA0KDQojIFByaW50IHRoZSBmaW5hbCBzdW1tYXJ5DQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIDUtWWVhciBHcm93dGggUmF0ZXMgU3VtbWFyeSBCeSBJbmRleCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KDQppbnRlcmFjdGl2ZV9wcmludChjdXN0b21fc3VtbWFyeSkNCmZvcm1hdF8zY29sX2N1c3RvbV93aWR0aHMoY3VzdG9tX3N1bW1hcnksIGNvbDFfd2lkdGggPSAiMjBlbSIsIGNvbDJfd2lkdGggPSAiMTVlbSIsIGNvbDNfd2lkdGggPSAiMTVlbSIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFNBVkUgVkFMVUVTIEZPUiBJTi1MSU5FIENPREUNCg0KIyBEZWZpbmUgdGhlIG1hcHBpbmcgb2Ygcm93IG5hbWVzIHRvIHZhcmlhYmxlIG5hbWVzDQpyb3dfdG9fdmFyX25hbWUgPC0gYygNCiAgIk1lYW4iID0gIm1lYW5fdmFsdWUiLA0KICAiTWVkaWFuIiA9ICJtZWRpYW5fdmFsdWUiLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIgPSAic2RfdmFsdWUiLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiID0gIm1pbl9jYWdyX3JhbmdlIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiA9ICJtYXhfY2Fncl9yYW5nZSIsDQogICJNaW4iID0gIm1pbl92YWx1ZSIsDQogICJNYXgiID0gIm1heF92YWx1ZSIsDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiIsDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSIsDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUiLA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSINCikNCg0KIyBEZWZpbmUgYSBjdXN0b20gbWFwcGluZyBmb3IgY29sdW1uIG5hbWVzDQpjb2x1bW5fbmFtZV9tYXBwaW5nIDwtIGMoDQogICJTJlAgNTAwIiA9ICJzcDUwMCIsDQogICJRUVEiID0gInFxcSINCikNCg0KIyBGdW5jdGlvbiB0byBzYXZlIHN1bW1hcnkgdmFsdWVzIGR5bmFtaWNhbGx5IHdpdGggY29sdW1uIG5hbWUgbWFwcGluZw0Kc2F2ZV9jb2x1bW5fdmFsdWVzIDwtIGZ1bmN0aW9uKHN1bW1hcnlfZGYsIHJvd19tYXBwaW5nLCBjb2x1bW5fbWFwcGluZykgew0KICAjIEdldCB0aGUgY29sdW1uIG5hbWVzIGluIHRoZSBkYXRhIGZyYW1lDQogIGNvbHVtbnNfdG9fc2F2ZSA8LSBzZXRkaWZmKG5hbWVzKHN1bW1hcnlfZGYpLCBjKCJNZXRyaWMiKSkgICMgRXhjbHVkZSB0aGUgTWV0cmljIGNvbHVtbg0KICANCiAgIyBJdGVyYXRlIG92ZXIgZWFjaCBjb2x1bW4NCiAgZm9yIChjb2wgaW4gY29sdW1uc190b19zYXZlKSB7DQogICAgIyBVc2UgdGhlIGN1c3RvbSBtYXBwaW5nIHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgY29sdW1uIG5hbWUNCiAgICBjb2xfbmFtZSA8LSBjb2x1bW5fbWFwcGluZ1tbY29sXV0gJXx8JSB0b2xvd2VyKGdzdWIoIlteYS16QS1aMC05XSIsICJfIiwgY29sKSkNCiAgICANCiAgICAjIEV4dHJhY3QgdmFsdWVzIGZvciB0aGUgY3VycmVudCBjb2x1bW4NCiAgICBjb2xfdmFsdWVzIDwtIHN1bW1hcnlfZGZbW2NvbF1dDQogICAgDQogICAgIyBJdGVyYXRlIG92ZXIgcm93cyB0byBzYXZlIGVhY2ggdmFsdWUgZHluYW1pY2FsbHkNCiAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKGNvbF92YWx1ZXMpKSB7DQogICAgICAjIEdldCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZSBuYW1lIGZyb20gdGhlIG1hcHBpbmcNCiAgICAgIHN0YXRfbmFtZSA8LSByb3dfbWFwcGluZ1tzdW1tYXJ5X2RmJE1ldHJpY1tpXV0NCiAgICAgIA0KICAgICAgaWYgKCFpcy5uYShzdGF0X25hbWUpKSB7ICAjIFNraXAgaWYgbm8gbWFwcGluZyBpcyBkZWZpbmVkDQogICAgICAgICMgQ3JlYXRlIHRoZSB2YXJpYWJsZSBuYW1lDQogICAgICAgIHZhcl9uYW1lIDwtIHBhc3RlMChzdGF0X25hbWUsICJfIiwgY29sX25hbWUpDQogICAgICAgIA0KICAgICAgICAjIEF0dGVtcHQgbnVtZXJpYyBjb252ZXJzaW9uIGZvciBkb3duc3RyZWFtIHVzZQ0KICAgICAgICB2YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2xfdmFsdWVzW2ldKSkpDQogICAgICAgIA0KICAgICAgICAjIEFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIGdsb2JhbCBlbnZpcm9ubWVudA0KICAgICAgICBhc3NpZ24odmFyX25hbWUsIHZhbHVlLCBlbnZpciA9IC5HbG9iYWxFbnYpDQogICAgICB9DQogICAgfQ0KICB9DQp9DQoNCiMgQXBwbHkgdGhlIGZ1bmN0aW9uIHRvIHNhdmUgdmFsdWVzIGR5bmFtaWNhbGx5DQpzYXZlX2NvbHVtbl92YWx1ZXMoY3VzdG9tX3N1bW1hcnksIHJvd190b192YXJfbmFtZSwgY29sdW1uX25hbWVfbWFwcGluZykNCg0KIyBFeGFtcGxlOiBBY2Nlc3NpbmcgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZXMNCmludGVyYWN0aXZlX3Bhc3RlKCJTJlAgNTAwIE1lYW46ICIsIG1lYW5fdmFsdWVfc3A1MDApICAjIFNob3VsZCBwcmludCB0aGUgbWVhbiB2YWx1ZSBmb3IgUyZQIDUwMA0KaW50ZXJhY3RpdmVfcHJpbnQocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9xcXEpICAjIFNob3VsZCBwcmludCB0aGUgcGVyY2VudCBhYm92ZSBhZ2dyZXNzaXZlIHRhcmdldCBmb3IgUVFRDQoNCg0KYGBgDQoNCg0KIyMjIyBHcmFwaCANCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl81eWVhcl9jYWdyX2dyYXBoLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQpjYXQoIlxuXG4jIyMjIDUtWWVhciBSb2xsaW5nIENBR1JzIEJ5IEluZGV4IFxuIikNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2VkX2RhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBgRGF0ZWAgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihgRGF0ZWApKSwgICMgRW5zdXJlIERhdGUgaXMgbnVtZXJpYw0KICAgIGBTJlAgNTAwYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgUyZQIDUwMGApKSwNCiAgICBgUVFRYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgUVFRYCkpDQogICkNCg0KIyBSZXNoYXBlIHRoZSBkYXRhIGludG8gbG9uZyBmb3JtYXQgZm9yIGVhc3kgcGxvdHRpbmcgb2YgbXVsdGlwbGUgbGluZXMgYW5kIHNldCB0aGUgZmFjdG9yIG9yZGVyDQpucnRfbG9uZyA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGBTJlAgNTAwYCwgYFFRUWApLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQUdSX0luZGV4IiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJBR1JfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKEFHUl9JbmRleCA9IGZhY3RvcihBR1JfSW5kZXgsIGxldmVscyA9IGMoIlMmUCA1MDAiLCAiUVFRIikpKQ0KDQojIEFzc2lnbiBjb2xvcnMgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIG9yZGVyIG9mIEFHUl9JbmRleCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBBR1JfSW5kZXggd2l0aCBjb2xvcnMgZnJvbSBjb2xvcnNfZ2VuZXJhbF9kYXJrDQp1bmlxdWVfdHlwZXMgPC0gdW5pcXVlKG5ydF9sb25nJEFHUl9JbmRleCkNCmN1c3RvbV9jb2xvcnMgPC0gc2V0TmFtZXMoY29sb3JzX2dlbmVyYWxfZGFya1sxOmxlbmd0aCh1bmlxdWVfdHlwZXMpXSwgdW5pcXVlX3R5cGVzKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geC12YWx1ZSBpbiB5b3VyIGRhdGENCm1heF94IDwtIG1heChhcy5pbnRlZ2VyKG1lcmdlZF9kYXRhJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihtZXJnZWRfZGF0YSREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4obWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDA1DQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDIpICogMiAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gMikgKiAyICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCI1LVllYXIgUm9sbGluZyBDQUdScyBCeSBJbmRleCBPdmVyICIsIHllYXJfcmFuZ2UsICIgWWVhcnMgKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpIikNCmR5bmFtaWNfY2FwdGlvbiA8LSBwYXN0ZTAoIjUtWWVhciBSb2xsaW5nIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEJ5IEluZGV4LCBEYXRhIFBlcmlvZCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQUdSX1ZhbHVlLCBjb2xvciA9IEFHUl9JbmRleCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDMwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggTWFya2V0IEluZGV4DQogIGdlb21fbGluZShzaXplID0gMS4yNSwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMi4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQoNCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiTWFya2V0IEluZGV4IiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIE1hcmtldCBJbmRleA0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgMikgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgKSArIA0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KDQpgYGANCg0KDQoNCg0KDQojIyMgMTAtWWVhciBDQUdSIA0KDQojIyMjIERhdGENCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl8xMHllYXJfY2FnciwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQppbnRlcmFjdGl2ZV9zdHIobnJ0JHNwNTAwX3Jhd19jYWdyKQ0KaW50ZXJhY3RpdmVfc3RyKG5ydCRxcXFfcmF3X2NhZ3IpDQoNCmludGVyYWN0aXZlX3ByaW50KG5ydCRzcDUwMF9yYXdfY2FncikNCmludGVyYWN0aXZlX3ByaW50KG5ydCRxcXFfcmF3X2NhZ3IpDQoNCm1pbl95ZWFyIDwtIG1pbihucnQkc3A1MDBfcmF3X2NhZ3IkRGF0ZSkNCm1heF95ZWFyIDwtIG1heChucnQkc3A1MDBfcmF3X2NhZ3IkRGF0ZSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCm1pbl95ZWFyIDwtIG1pbihucnQkcXFxX3Jhd19jYWdyJERhdGUpDQptYXhfeWVhciA8LSBtYXgobnJ0JHFxcV9yYXdfY2FnciREYXRlKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgdGhlIHJlcXVpcmVkIGRhdGUgcmFuZ2UgKDIwMTAgdG8gdGhlIHByZXNlbnQgeWVhcikNCnN0YXJ0X3llYXIgPC0gMjAxMA0KIyBlbmRfeWVhciA8LSAyMDI1DQplbmRfeWVhciA8LSBhcy5udW1lcmljKGZvcm1hdChTeXMuRGF0ZSgpLCAiJVkiKSkNCg0Kc3A1MDBfZmlsdGVyZWQgPC0gc3Vic2V0KG5ydCRzcDUwMF9yYXdfY2FnciwgRGF0ZSA+PSBzdGFydF95ZWFyICYgRGF0ZSA8PSBlbmRfeWVhciwgc2VsZWN0ID0gYyhEYXRlLCBgMTAtWWVhciBDQUdSYCkpDQpxcXFfZmlsdGVyZWQgPC0gc3Vic2V0KG5ydCRxcXFfcmF3X2NhZ3IsIERhdGUgPj0gc3RhcnRfeWVhciAmIERhdGUgPD0gZW5kX3llYXIsIHNlbGVjdCA9IGMoRGF0ZSwgYDEwLVllYXIgQ0FHUmApKQ0KDQojIFJlbmFtZSBjb2x1bW5zIGZvciBjbGFyaXR5DQpjb2xuYW1lcyhzcDUwMF9maWx0ZXJlZClbY29sbmFtZXMoc3A1MDBfZmlsdGVyZWQpID09ICIxMC1ZZWFyIENBR1IiXSA8LSAiUyZQIDUwMCINCmNvbG5hbWVzKHFxcV9maWx0ZXJlZClbY29sbmFtZXMocXFxX2ZpbHRlcmVkKSA9PSAiMTAtWWVhciBDQUdSIl0gPC0gIlFRUSINCg0KIyBNZXJnZSBkYXRhc2V0cyBieSBEYXRlIChZZWFyKQ0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2Uoc3A1MDBfZmlsdGVyZWQsIHFxcV9maWx0ZXJlZCwgYnkgPSAiRGF0ZSIpDQoNCiMgU29ydCBieSBEYXRlIGluIGRlc2NlbmRpbmcgb3JkZXIgKG1vc3QgcmVjZW50IHllYXIgZmlyc3QpDQptZXJnZWRfZGF0YSA8LSBtZXJnZWRfZGF0YVtvcmRlcigtbWVyZ2VkX2RhdGEkRGF0ZSksIF0NCg0KIyBGb3JtYXQgdGhlIG1lcmdlZCBkYXRhDQptZXJnZWRfZGF0YSREYXRlIDwtIGFzLmNoYXJhY3RlcihtZXJnZWRfZGF0YSREYXRlKSAgIyBFbnN1cmUgRGF0ZSBpcyBhIGNoYXJhY3RlciB3aXRob3V0IGNvbW1hcw0KbWVyZ2VkX2RhdGEkYFMmUCA1MDBgIDwtIHBhc3RlMChmb3JtYXRDKG1lcmdlZF9kYXRhJGBTJlAgNTAwYCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKQ0KbWVyZ2VkX2RhdGEkUVFRIDwtIHBhc3RlMChmb3JtYXRDKG1lcmdlZF9kYXRhJFFRUSwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKQ0KDQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIDEwLVllYXIgUm9sbGluZyBDQUdScyBCeSBJbmRleCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWVyZ2VkX2RhdGEpDQppbnRlcmFjdGl2ZV9zdHIobWVyZ2VkX2RhdGEpDQpmb3JtYXRfZXF1YWxfd2lkdGgobWVyZ2VkX2RhdGEpDQoNCg0KYGBgDQoNCg0KIyMjIyBTdW1tYXJ5DQoNCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fMTB5ZWFyX2NhZ3Jfc3VtbWFyeSwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcnkNCmxpYnJhcnkoZHBseXIpDQoNCiMgUmVtb3ZlIHBlcmNlbnRhZ2Ugc2lnbnMgYW5kIGNvbnZlcnQgY29sdW1ucyB0byBudW1lcmljDQptZXJnZWRfZGF0YV9jbGVhbiA8LSBtZXJnZWRfZGF0YQ0KbWVyZ2VkX2RhdGFfY2xlYW5bMjozXSA8LSBsYXBwbHkobWVyZ2VkX2RhdGFbMjozXSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyhnc3ViKCIlIiwgIiIsIHgpKSkNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHllYXINCm1pbl95ZWFyIDwtIG1pbihtZXJnZWRfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQptYXhfeWVhciA8LSBtYXgobWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBEZWZpbmUgdGhlIG1ldHJpY3MgdG8gY2FsY3VsYXRlLCBpbmNsdWRpbmcgQ0FHUg0KbWV0cmljcyA8LSBjKA0KICAiTWVhbiIsIA0KICAiTWVkaWFuIiwgDQogICJTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpIiwgDQogICJNaW4gQ0FHUiBSYW5nZSAoQ0FHUiAtIFNEKSIsIA0KICAiTWF4IENBR1IgUmFuZ2UgKENBR1IgKyBTRCkiLCANCiAgIk1pbiIsIA0KICAiTWF4IiwgDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldCIsIA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiDQopDQoNCiMgQ2FsY3VsYXRlIG1ldHJpY3MgZHluYW1pY2FsbHkgZm9yIGFsbCBudW1lcmljIGNvbHVtbnMNCmNhbGN1bGF0ZWRfbWV0cmljcyA8LSBzYXBwbHkobWVyZ2VkX2RhdGFfY2xlYW5bMjozXSwgZnVuY3Rpb24oY29sKSB7DQogIG1lYW5fdmFsIDwtIG1lYW4oY29sLCBuYS5ybSA9IFRSVUUpDQogIHNkX3ZhbCA8LSBzZChjb2wsIG5hLnJtID0gVFJVRSkNCiAgcGVyY2VudF9hYm92ZSA8LSBmdW5jdGlvbih0YXJnZXQpIG1lYW4oY29sID4gdGFyZ2V0LCBuYS5ybSA9IFRSVUUpICogMTAwDQogIA0KICBjKA0KICAgIE1lYW4gPSBtZWFuX3ZhbCwNCiAgICBNZWRpYW4gPSBtZWRpYW4oY29sLCBuYS5ybSA9IFRSVUUpLA0KICAgIGBTdGFuZGFyZCBEZXZpYXRpb24gKFZvbGF0aWxpdHkpYCA9IHNkX3ZhbCwNCiAgICBgTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRClgID0gbWVhbl92YWwgLSBzZF92YWwsDQogICAgYE1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpYCA9IG1lYW5fdmFsICsgc2RfdmFsLA0KICAgIE1pbiA9IG1pbihjb2wsIG5hLnJtID0gVFJVRSksDQogICAgTWF4ID0gbWF4KGNvbCwgbmEucm0gPSBUUlVFKSwNCiAgICBgUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X2luZmxhdGlvbiksICAjIEV4YW1wbGUgaW5mbGF0aW9uIHRhcmdldDogMiUNCiAgICBgUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X2NvbnNlcnZhdGl2ZSksDQogICAgYFBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0YCA9IHBlcmNlbnRfYWJvdmUodGFyZ2V0X21vZGVyYXRlKSwNCiAgICBgUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9hZ2dyZXNzaXZlKQ0KICApDQp9KQ0KDQojIFRyYW5zcG9zZSB0aGUgcmVzdWx0IGFuZCBhZGQgdGhlIE1ldHJpYyBjb2x1bW4NCmN1c3RvbV9zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoDQogIE1ldHJpYyA9IG1ldHJpY3MsDQogIGNhbGN1bGF0ZWRfbWV0cmljcw0KKQ0KDQojIFJlbmFtZSBjb2x1bW5zIHRvIHJldGFpbiB0aGUgb3JpZ2luYWwgY29sdW1uIG5hbWVzIGR5bmFtaWNhbGx5DQpjb2xuYW1lcyhjdXN0b21fc3VtbWFyeSlbLTFdIDwtIGNvbG5hbWVzKG1lcmdlZF9kYXRhKVsyOjNdDQoNCiMgQWRkIHBlcmNlbnRhZ2Ugc2lnbnMgYmFjayB0byBhbGwgbnVtZXJpYyB2YWx1ZXMNCmN1c3RvbV9zdW1tYXJ5Wy0xXSA8LSBsYXBwbHkoY3VzdG9tX3N1bW1hcnlbLTFdLCBmdW5jdGlvbih4KSBwYXN0ZTAoZm9ybWF0Qyh4LCBmb3JtYXQgPSAiZiIsIGRpZ2l0cyA9IDIpLCAiJSIpKQ0KDQojIFJlbW92ZSByb3cgbmFtZXMNCnJvd25hbWVzKGN1c3RvbV9zdW1tYXJ5KSA8LSBOVUxMDQoNCiMgUHJpbnQgdGhlIGZpbmFsIHN1bW1hcnkNCiMgRGlzcGxheSBmb3JtYXR0ZWQgdGFibGUNCmNhdCgiXG5cbiMjIyMgMTAtWWVhciBHcm93dGggUmF0ZXMgU3VtbWFyeSBCeSBJbmRleCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KDQppbnRlcmFjdGl2ZV9wcmludChjdXN0b21fc3VtbWFyeSkNCmZvcm1hdF8zY29sX2N1c3RvbV93aWR0aHMoY3VzdG9tX3N1bW1hcnksIGNvbDFfd2lkdGggPSAiMjBlbSIsIGNvbDJfd2lkdGggPSAiMTVlbSIsIGNvbDNfd2lkdGggPSAiMTVlbSIpDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFNBVkUgVkFMVUVTIEZPUiBJTi1MSU5FIENPREUNCg0KIyBEZWZpbmUgdGhlIG1hcHBpbmcgb2Ygcm93IG5hbWVzIHRvIHZhcmlhYmxlIG5hbWVzDQpyb3dfdG9fdmFyX25hbWUgPC0gYygNCiAgIk1lYW4iID0gIm1lYW5fdmFsdWUiLA0KICAiTWVkaWFuIiA9ICJtZWRpYW5fdmFsdWUiLA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIgPSAic2RfdmFsdWUiLA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiID0gIm1pbl9jYWdyX3JhbmdlIiwNCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiA9ICJtYXhfY2Fncl9yYW5nZSIsDQogICJNaW4iID0gIm1pbl92YWx1ZSIsDQogICJNYXgiID0gIm1heF92YWx1ZSIsDQogICJQZXJjZW50IEFib3ZlIEluZmxhdGlvbiBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2luZmxhdGlvbiIsDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2NvbnNlcnZhdGl2ZSIsDQogICJQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfbW9kZXJhdGUiLA0KICAiUGVyY2VudCBBYm92ZSBBZ2dyZXNzaXZlIFRhcmdldCIgPSAicGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZSINCikNCg0KIyBEZWZpbmUgYSBjdXN0b20gbWFwcGluZyBmb3IgY29sdW1uIG5hbWVzDQpjb2x1bW5fbmFtZV9tYXBwaW5nIDwtIGMoDQogICJTJlAgNTAwIiA9ICJzcDUwMCIsDQogICJRUVEiID0gInFxcSINCikNCg0KIyBGdW5jdGlvbiB0byBzYXZlIHN1bW1hcnkgdmFsdWVzIGR5bmFtaWNhbGx5IHdpdGggY29sdW1uIG5hbWUgbWFwcGluZw0Kc2F2ZV9jb2x1bW5fdmFsdWVzIDwtIGZ1bmN0aW9uKHN1bW1hcnlfZGYsIHJvd19tYXBwaW5nLCBjb2x1bW5fbWFwcGluZykgew0KICAjIEdldCB0aGUgY29sdW1uIG5hbWVzIGluIHRoZSBkYXRhIGZyYW1lDQogIGNvbHVtbnNfdG9fc2F2ZSA8LSBzZXRkaWZmKG5hbWVzKHN1bW1hcnlfZGYpLCBjKCJNZXRyaWMiKSkgICMgRXhjbHVkZSB0aGUgTWV0cmljIGNvbHVtbg0KICANCiAgIyBJdGVyYXRlIG92ZXIgZWFjaCBjb2x1bW4NCiAgZm9yIChjb2wgaW4gY29sdW1uc190b19zYXZlKSB7DQogICAgIyBVc2UgdGhlIGN1c3RvbSBtYXBwaW5nIHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgY29sdW1uIG5hbWUNCiAgICBjb2xfbmFtZSA8LSBjb2x1bW5fbWFwcGluZ1tbY29sXV0gJXx8JSB0b2xvd2VyKGdzdWIoIlteYS16QS1aMC05XSIsICJfIiwgY29sKSkNCiAgICANCiAgICAjIEV4dHJhY3QgdmFsdWVzIGZvciB0aGUgY3VycmVudCBjb2x1bW4NCiAgICBjb2xfdmFsdWVzIDwtIHN1bW1hcnlfZGZbW2NvbF1dDQogICAgDQogICAgIyBJdGVyYXRlIG92ZXIgcm93cyB0byBzYXZlIGVhY2ggdmFsdWUgZHluYW1pY2FsbHkNCiAgICBmb3IgKGkgaW4gc2VxX2Fsb25nKGNvbF92YWx1ZXMpKSB7DQogICAgICAjIEdldCB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZSBuYW1lIGZyb20gdGhlIG1hcHBpbmcNCiAgICAgIHN0YXRfbmFtZSA8LSByb3dfbWFwcGluZ1tzdW1tYXJ5X2RmJE1ldHJpY1tpXV0NCiAgICAgIA0KICAgICAgaWYgKCFpcy5uYShzdGF0X25hbWUpKSB7ICAjIFNraXAgaWYgbm8gbWFwcGluZyBpcyBkZWZpbmVkDQogICAgICAgICMgQ3JlYXRlIHRoZSB2YXJpYWJsZSBuYW1lDQogICAgICAgIHZhcl9uYW1lIDwtIHBhc3RlMChzdGF0X25hbWUsICJfIiwgY29sX25hbWUpDQogICAgICAgIA0KICAgICAgICAjIEF0dGVtcHQgbnVtZXJpYyBjb252ZXJzaW9uIGZvciBkb3duc3RyZWFtIHVzZQ0KICAgICAgICB2YWx1ZSA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBjb2xfdmFsdWVzW2ldKSkpDQogICAgICAgIA0KICAgICAgICAjIEFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIGdsb2JhbCBlbnZpcm9ubWVudA0KICAgICAgICBhc3NpZ24odmFyX25hbWUsIHZhbHVlLCBlbnZpciA9IC5HbG9iYWxFbnYpDQogICAgICB9DQogICAgfQ0KICB9DQp9DQoNCiMgQXBwbHkgdGhlIGZ1bmN0aW9uIHRvIHNhdmUgdmFsdWVzIGR5bmFtaWNhbGx5DQpzYXZlX2NvbHVtbl92YWx1ZXMoY3VzdG9tX3N1bW1hcnksIHJvd190b192YXJfbmFtZSwgY29sdW1uX25hbWVfbWFwcGluZykNCg0KIyBFeGFtcGxlOiBBY2Nlc3NpbmcgZHluYW1pY2FsbHkgY3JlYXRlZCB2YXJpYWJsZXMNCmludGVyYWN0aXZlX3Bhc3RlKCJTJlAgNTAwIE1lYW46ICIsIG1lYW5fdmFsdWVfc3A1MDApICAjIFNob3VsZCBwcmludCB0aGUgbWVhbiB2YWx1ZSBmb3IgUyZQIDUwMA0KaW50ZXJhY3RpdmVfcHJpbnQocGVyY2VudF9hYm92ZV90YXJnZXRfYWdncmVzc2l2ZV9xcXEpICAjIFNob3VsZCBwcmludCB0aGUgcGVyY2VudCBhYm92ZSBhZ2dyZXNzaXZlIHRhcmdldCBmb3IgUVFRDQoNCg0KYGBgDQoNCiMjIyMgR3JhcGggDQoNCmBgYHtyIGluZGV4X2NvbXBhcmlzb25fMTB5ZWFyX2NhZ3JfZ3JhcGgsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQoNCmNhdCgiXG5cbiMjIyMgMTAtWWVhciBSb2xsaW5nIENBR1JzIEJ5IEluZGV4IFxuIikNCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgQ29udmVydCBjb2x1bW5zIHRvIG51bWVyaWMgZm9yIHBsb3R0aW5nIGlmIG5lZWRlZA0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2VkX2RhdGEgJT4lDQogIG11dGF0ZSgNCiAgICBgRGF0ZWAgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihgRGF0ZWApKSwgICMgRW5zdXJlIERhdGUgaXMgbnVtZXJpYw0KICAgIGBTJlAgNTAwYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgUyZQIDUwMGApKSwNCiAgICBgUVFRYCA9IGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCBgUVFRYCkpDQogICkNCg0KIyBSZXNoYXBlIHRoZSBkYXRhIGludG8gbG9uZyBmb3JtYXQgZm9yIGVhc3kgcGxvdHRpbmcgb2YgbXVsdGlwbGUgbGluZXMgYW5kIHNldCB0aGUgZmFjdG9yIG9yZGVyDQpucnRfbG9uZyA8LSBtZXJnZWRfZGF0YSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGBTJlAgNTAwYCwgYFFRUWApLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiQUdSX0luZGV4IiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJBR1JfVmFsdWUiKSAlPiUNCiAgbXV0YXRlKEFHUl9JbmRleCA9IGZhY3RvcihBR1JfSW5kZXgsIGxldmVscyA9IGMoIlMmUCA1MDAiLCAiUVFRIikpKQ0KDQojIEFzc2lnbiBjb2xvcnMgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIG9yZGVyIG9mIEFHUl9JbmRleCBpbiB0aGUgZGF0YQ0KIyBNYXRjaCB0aGUgdW5pcXVlIGxldmVscyBvZiBBR1JfSW5kZXggd2l0aCBjb2xvcnMgZnJvbSBjb2xvcnNfZ2VuZXJhbF9kYXJrDQp1bmlxdWVfdHlwZXMgPC0gdW5pcXVlKG5ydF9sb25nJEFHUl9JbmRleCkNCmN1c3RvbV9jb2xvcnMgPC0gc2V0TmFtZXMoY29sb3JzX2dlbmVyYWxfZGFya1sxOmxlbmd0aCh1bmlxdWVfdHlwZXMpXSwgdW5pcXVlX3R5cGVzKQ0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geC12YWx1ZSBpbiB5b3VyIGRhdGENCm1heF94IDwtIG1heChhcy5pbnRlZ2VyKG1lcmdlZF9kYXRhJERhdGUpLCBuYS5ybSA9IFRSVUUpDQptaW5feCA8LSBtaW4oYXMuaW50ZWdlcihtZXJnZWRfZGF0YSREYXRlKSwgbmEucm0gPSBUUlVFKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3gpICAjIFRlc3QNCmludGVyYWN0aXZlX3ByaW50KG1pbl94KSAgIyBUZXN0DQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4obWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBQTE9UIEZVTEwgV0lUSE9VVCBMSU1JVFMNCg0KIyBEZWZpbmUgc3RhcnQgYW5kIGVuZCB5ZWFycw0Kc3RhcnRfeWVhciA8LSAyMDEwDQplbmRfeWVhciA8LSAyMDI0DQp5ZWFyX3JhbmdlIDwtIGVuZF95ZWFyIC0gc3RhcnRfeWVhciArIDEgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgeWVhcnMNCg0KIyBEZWZpbmUgYnJlYWtzIHJvdW5kZWQgYXBwcm9wcmlhdGVseQ0KbGltaXRzX3N0YXJ0X3llYXIgPC0gZmxvb3Ioc3RhcnRfeWVhciAvIDIpICogMiAgIyBSb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDUNCmxpbWl0c19lbmRfeWVhciA8LSBjZWlsaW5nKGVuZF95ZWFyIC8gMikgKiAyICAgIyBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQoNCiMgQ3JlYXRlIGR5bmFtaWMgdGl0bGUgYW5kIGNhcHRpb24NCmR5bmFtaWNfdGl0bGUgPC0gcGFzdGUwKCIxMC1ZZWFyIFJvbGxpbmcgQ0FHUnMgQnkgSW5kZXggT3ZlciAiLCB5ZWFyX3JhbmdlLCAiIFllYXJzICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQpkeW5hbWljX2NhcHRpb24gPC0gcGFzdGUwKCIxMC1ZZWFyIFJvbGxpbmcgQ29tcG91bmQgQXZlcmFnZSBHcm93dGggUmF0ZXMgQnkgSW5kZXgsIERhdGEgUGVyaW9kICgiLCBzdGFydF95ZWFyLCAiLSIsIGVuZF95ZWFyLCAiKSIpDQoNCiMgQ3JlYXRlIHRoZSBmdWxsLCBub24tZmlsdGVyZWQgeC1heGlzIHBsb3Qgd2l0aCBkeW5hbWljIHggcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KcDEgPC0gZ2dwbG90KG5ydF9sb25nLCBhZXMoeCA9IGFzLmludGVnZXIoRGF0ZSksIHkgPSBBR1JfVmFsdWUsIGNvbG9yID0gQUdSX0luZGV4KSkgKw0KDQogICMgQWRkIHNoYWRlZCBhcmVhcyBmb3IgYmFja2dyb3VuZCBlZmZlY3QNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9hZ2dyZXNzaXZlLCB5bWF4ID0gSW5mKSwgZmlsbCA9ICJsaWdodGdyZWVuIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgeW1heCA9IHRhcmdldF9hZ2dyZXNzaXZlKSwgZmlsbCA9ICJvcmFuZ2UiLCBhbHBoYSA9IDAuMDMwKSArDQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSAtSW5mLCB5bWF4ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSksIGZpbGwgPSAibGlnaHRjb3JhbCIsIGFscGhhID0gMC4wMzApICsNCiAgDQogICMgUGxvdCBsaW5lcyBmb3IgZWFjaCBNYXJrZXQgSW5kZXgNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjI1LCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIExpbmUgZm9yIGVhY2ggQ0FHUg0KICBnZW9tX3BvaW50KHNpemUgPSAyLjAsIGFscGhhID0gMy4wKSArICAgICAgICMgUG9pbnRzIGZvciBlYWNoIENBR1INCiAgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9hZ2dyZXNzaXZlLCBjb2xvciA9ICJkYXJrYmx1ZSIsIGxpbmV0eXBlID0gInNvbGlkIikgKw0KICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9tb2RlcmF0ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdGFyZ2V0X2luZmxhdGlvbiwgY29sb3IgPSAiZGFya3JlZCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCg0KICAjIER5bmFtaWMgcmlnaHQtYWxpZ25lZCBwbGFjZW1lbnQgZm9yIGFubm90YXRpb25zDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9hZ2dyZXNzaXZlLCBsYWJlbCA9ICJBZ2dyZXNzaXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogICMgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X21vZGVyYXRlLCBsYWJlbCA9ICJNb2RlcmF0ZSIsIA0KICAjICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gSW5mLCB5ID0gdGFyZ2V0X2NvbnNlcnZhdGl2ZSwgbGFiZWwgPSAiQ29uc2VydmF0aXZlIiwgDQogICAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9pbmZsYXRpb24sIGxhYmVsID0gIkluZmxhdGlvbiIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSA0KSArDQoNCiAgbGFicygNCiAgICB0aXRsZSA9IGR5bmFtaWNfdGl0bGUsDQogICAgeCA9ICJZZWFyIiwNCiAgICB5ID0gIkNBR1IgVmFsdWUgKCUpIiwNCiAgICBjb2xvciA9ICJNYXJrZXQgSW5kZXgiLA0KICAgIGNhcHRpb24gPSBkeW5hbWljX2NhcHRpb24NCiAgICApICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSArICAjIFNldCBjb2xvcnMgZm9yIGVhY2ggTWFya2V0IEluZGV4DQogIHNjYWxlX3hfY29udGludW91cygNCiAgICBsaW1pdHMgPSBjKHN0YXJ0X3llYXIsIGVuZF95ZWFyICsgMSksIA0KICAgIGJyZWFrcyA9IHNlcShsaW1pdHNfc3RhcnRfeWVhciwgbGltaXRzX2VuZF95ZWFyLCAyKSAgIyBSZXN0cmljdCAmIFNldCBNYWpvciB4LWF4aXMgbGluZXMgZm9yIGVhY2ggeWVhcg0KICApICsgDQogIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMjApLCAgICAgICAgICMgTGFyZ2VyIHRpdGxlIGZvbnQNCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGFyZ2VyIHgtYXhpcyBsYWJlbCBmb250DQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDE0KSwgICMgTGFyZ2VyIHgtYXhpcyB0ZXh0DQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB5LWF4aXMgdGV4dA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGl0bGUgc2l6ZQ0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAgICAgICAgICAgICAgICAgICAgIyBMZWdlbmQgdGV4dCBzaXplDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJibGFjayIpLCAgIyBNYWpvciBncmlkIGxpbmVzDQogICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAgICAgICAgICAgICAgICAgICAgICAjIE5vIG1pbm9yIHggZ3JpZCBsaW5lcw0KICAgIGF4aXMudGlja3MubGVuZ3RoID0gdW5pdCgtMC4yNSwgImNtIiksICAgICAgICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgdGljayBsZW5ndGgNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNTApLCAgICMgRGFya2VyIHRpY2tzDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC43NSksICAjIERhcmsgYm90dG9tIGJvcmRlcg0KICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpICAgIyBEYXJrIGxlZnQgYm9yZGVyDQogICkNCg0KIyBQcmludCB0aGUgcGxvdCANCnByaW50KHAxKQ0KDQoNCmBgYA0KDQojIyMgMjAtWWVhciBDQUdSIA0KDQojIyMjIERhdGENCg0KYGBge3IgaW5kZXhfY29tcGFyaXNvbl8yMHllYXJfY2FnciwgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQppbnRlcmFjdGl2ZV9zdHIobnJ0JHNwNTAwX3Jhd19jYWdyKQ0KaW50ZXJhY3RpdmVfc3RyKG5ydCRxcXFfcmF3X2NhZ3IpDQoNCmludGVyYWN0aXZlX3ByaW50KG5ydCRzcDUwMF9yYXdfY2FncikNCmludGVyYWN0aXZlX3ByaW50KG5ydCRxcXFfcmF3X2NhZ3IpDQoNCm1pbl95ZWFyIDwtIG1pbihucnQkc3A1MDBfcmF3X2NhZ3IkRGF0ZSkNCm1heF95ZWFyIDwtIG1heChucnQkc3A1MDBfcmF3X2NhZ3IkRGF0ZSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCm1pbl95ZWFyIDwtIG1pbihucnQkcXFxX3Jhd19jYWdyJERhdGUpDQptYXhfeWVhciA8LSBtYXgobnJ0JHFxcV9yYXdfY2FnciREYXRlKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWluX3llYXIpDQppbnRlcmFjdGl2ZV9wcmludChtYXhfeWVhcikNCg0KIyBGaWx0ZXIgZGF0YSBmb3IgdGhlIHJlcXVpcmVkIGRhdGUgcmFuZ2UgKDIwMjAgdG8gdGhlIHByZXNlbnQgeWVhcikNCnN0YXJ0X3llYXIgPC0gMjAyMA0KIyBlbmRfeWVhciA8LSAyMDI1DQplbmRfeWVhciA8LSBhcy5udW1lcmljKGZvcm1hdChTeXMuRGF0ZSgpLCAiJVkiKSkNCg0Kc3A1MDBfZmlsdGVyZWQgPC0gc3Vic2V0KG5ydCRzcDUwMF9yYXdfY2FnciwgRGF0ZSA+PSBzdGFydF95ZWFyICYgRGF0ZSA8PSBlbmRfeWVhciwgc2VsZWN0ID0gYyhEYXRlLCBgMjAtWWVhciBDQUdSYCkpDQpxcXFfZmlsdGVyZWQgPC0gc3Vic2V0KG5ydCRxcXFfcmF3X2NhZ3IsIERhdGUgPj0gc3RhcnRfeWVhciAmIERhdGUgPD0gZW5kX3llYXIsIHNlbGVjdCA9IGMoRGF0ZSwgYDIwLVllYXIgQ0FHUmApKQ0KDQojIFJlbmFtZSBjb2x1bW5zIGZvciBjbGFyaXR5DQpjb2xuYW1lcyhzcDUwMF9maWx0ZXJlZClbY29sbmFtZXMoc3A1MDBfZmlsdGVyZWQpID09ICIyMC1ZZWFyIENBR1IiXSA8LSAiUyZQIDUwMCINCmNvbG5hbWVzKHFxcV9maWx0ZXJlZClbY29sbmFtZXMocXFxX2ZpbHRlcmVkKSA9PSAiMjAtWWVhciBDQUdSIl0gPC0gIlFRUSINCg0KIyBNZXJnZSBkYXRhc2V0cyBieSBEYXRlIChZZWFyKQ0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2Uoc3A1MDBfZmlsdGVyZWQsIHFxcV9maWx0ZXJlZCwgYnkgPSAiRGF0ZSIpDQoNCiMgU29ydCBieSBEYXRlIGluIGRlc2NlbmRpbmcgb3JkZXIgKG1vc3QgcmVjZW50IHllYXIgZmlyc3QpDQptZXJnZWRfZGF0YSA8LSBtZXJnZWRfZGF0YVtvcmRlcigtbWVyZ2VkX2RhdGEkRGF0ZSksIF0NCg0KIyBGb3JtYXQgdGhlIG1lcmdlZCBkYXRhDQptZXJnZWRfZGF0YSREYXRlIDwtIGFzLmNoYXJhY3RlcihtZXJnZWRfZGF0YSREYXRlKSAgIyBFbnN1cmUgRGF0ZSBpcyBhIGNoYXJhY3RlciB3aXRob3V0IGNvbW1hcw0KbWVyZ2VkX2RhdGEkYFMmUCA1MDBgIDwtIHBhc3RlMChmb3JtYXRDKG1lcmdlZF9kYXRhJGBTJlAgNTAwYCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKQ0KbWVyZ2VkX2RhdGEkUVFRIDwtIHBhc3RlMChmb3JtYXRDKG1lcmdlZF9kYXRhJFFRUSwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKQ0KDQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIDIwLVllYXIgUm9sbGluZyBDQUdScyBCeSBJbmRleCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIilcbiIsIHNlcCA9ICIiKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWVyZ2VkX2RhdGEpDQppbnRlcmFjdGl2ZV9zdHIobWVyZ2VkX2RhdGEpDQpmb3JtYXRfZXF1YWxfd2lkdGgobWVyZ2VkX2RhdGEpDQoNCg0KYGBgDQoNCiMjIyMgU3VtbWFyeQ0KDQpgYGB7ciBpbmRleF9jb21wYXJpc29uXzIweWVhcl9jYWdyX3N1bW1hcnksIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCg0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJ5DQpsaWJyYXJ5KGRwbHlyKQ0KDQojIFJlbW92ZSBwZXJjZW50YWdlIHNpZ25zIGFuZCBjb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYw0KbWVyZ2VkX2RhdGFfY2xlYW4gPC0gbWVyZ2VkX2RhdGENCm1lcmdlZF9kYXRhX2NsZWFuWzI6M10gPC0gbGFwcGx5KG1lcmdlZF9kYXRhWzI6M10sIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoZ3N1YigiJSIsICIiLCB4KSkpDQoNCiMgRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB5ZWFyDQptaW5feWVhciA8LSBtaW4obWVyZ2VkX2RhdGEkRGF0ZSwgbmEucm0gPSBUUlVFKQ0KbWF4X3llYXIgPC0gbWF4KG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1pbl95ZWFyKQ0KaW50ZXJhY3RpdmVfcHJpbnQobWF4X3llYXIpDQoNCiMgRGVmaW5lIHRoZSBtZXRyaWNzIHRvIGNhbGN1bGF0ZSwgaW5jbHVkaW5nIENBR1INCm1ldHJpY3MgPC0gYygNCiAgIk1lYW4iLCANCiAgIk1lZGlhbiIsIA0KICAiU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KSIsIA0KICAiTWluIENBR1IgUmFuZ2UgKENBR1IgLSBTRCkiLCANCiAgIk1heCBDQUdSIFJhbmdlIChDQUdSICsgU0QpIiwgDQogICJNaW4iLCANCiAgIk1heCIsIA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIENvbnNlcnZhdGl2ZSBUYXJnZXQiLCANCiAgIlBlcmNlbnQgQWJvdmUgTW9kZXJhdGUgVGFyZ2V0IiwgDQogICJQZXJjZW50IEFib3ZlIEFnZ3Jlc3NpdmUgVGFyZ2V0Ig0KKQ0KDQojIENhbGN1bGF0ZSBtZXRyaWNzIGR5bmFtaWNhbGx5IGZvciBhbGwgbnVtZXJpYyBjb2x1bW5zDQpjYWxjdWxhdGVkX21ldHJpY3MgPC0gc2FwcGx5KG1lcmdlZF9kYXRhX2NsZWFuWzI6M10sIGZ1bmN0aW9uKGNvbCkgew0KICBtZWFuX3ZhbCA8LSBtZWFuKGNvbCwgbmEucm0gPSBUUlVFKQ0KICBzZF92YWwgPC0gc2QoY29sLCBuYS5ybSA9IFRSVUUpDQogIHBlcmNlbnRfYWJvdmUgPC0gZnVuY3Rpb24odGFyZ2V0KSBtZWFuKGNvbCA+IHRhcmdldCwgbmEucm0gPSBUUlVFKSAqIDEwMA0KICANCiAgYygNCiAgICBNZWFuID0gbWVhbl92YWwsDQogICAgTWVkaWFuID0gbWVkaWFuKGNvbCwgbmEucm0gPSBUUlVFKSwNCiAgICBgU3RhbmRhcmQgRGV2aWF0aW9uIChWb2xhdGlsaXR5KWAgPSBzZF92YWwsDQogICAgYE1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpYCA9IG1lYW5fdmFsIC0gc2RfdmFsLA0KICAgIGBNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKWAgPSBtZWFuX3ZhbCArIHNkX3ZhbCwNCiAgICBNaW4gPSBtaW4oY29sLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1heCA9IG1heChjb2wsIG5hLnJtID0gVFJVRSksDQogICAgYFBlcmNlbnQgQWJvdmUgSW5mbGF0aW9uIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9pbmZsYXRpb24pLCAgIyBFeGFtcGxlIGluZmxhdGlvbiB0YXJnZXQ6IDIlDQogICAgYFBlcmNlbnQgQWJvdmUgQ29uc2VydmF0aXZlIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9jb25zZXJ2YXRpdmUpLA0KICAgIGBQZXJjZW50IEFib3ZlIE1vZGVyYXRlIFRhcmdldGAgPSBwZXJjZW50X2Fib3ZlKHRhcmdldF9tb2RlcmF0ZSksDQogICAgYFBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXRgID0gcGVyY2VudF9hYm92ZSh0YXJnZXRfYWdncmVzc2l2ZSkNCiAgKQ0KfSkNCg0KIyBUcmFuc3Bvc2UgdGhlIHJlc3VsdCBhbmQgYWRkIHRoZSBNZXRyaWMgY29sdW1uDQpjdXN0b21fc3VtbWFyeSA8LSBkYXRhLmZyYW1lKA0KICBNZXRyaWMgPSBtZXRyaWNzLA0KICBjYWxjdWxhdGVkX21ldHJpY3MNCikNCg0KIyBSZW5hbWUgY29sdW1ucyB0byByZXRhaW4gdGhlIG9yaWdpbmFsIGNvbHVtbiBuYW1lcyBkeW5hbWljYWxseQ0KY29sbmFtZXMoY3VzdG9tX3N1bW1hcnkpWy0xXSA8LSBjb2xuYW1lcyhtZXJnZWRfZGF0YSlbMjozXQ0KDQojIEFkZCBwZXJjZW50YWdlIHNpZ25zIGJhY2sgdG8gYWxsIG51bWVyaWMgdmFsdWVzDQpjdXN0b21fc3VtbWFyeVstMV0gPC0gbGFwcGx5KGN1c3RvbV9zdW1tYXJ5Wy0xXSwgZnVuY3Rpb24oeCkgcGFzdGUwKGZvcm1hdEMoeCwgZm9ybWF0ID0gImYiLCBkaWdpdHMgPSAyKSwgIiUiKSkNCg0KIyBSZW1vdmUgcm93IG5hbWVzDQpyb3duYW1lcyhjdXN0b21fc3VtbWFyeSkgPC0gTlVMTA0KDQojIFByaW50IHRoZSBmaW5hbCBzdW1tYXJ5DQojIERpc3BsYXkgZm9ybWF0dGVkIHRhYmxlDQpjYXQoIlxuXG4jIyMjIDIwLVllYXIgR3Jvd3RoIFJhdGVzIFN1bW1hcnkgQnkgSW5kZXggKCIsIHN0YXJ0X3llYXIsICItIiwgZW5kX3llYXIsICIpXG4iLCBzZXAgPSAiIikNCg0KaW50ZXJhY3RpdmVfcHJpbnQoY3VzdG9tX3N1bW1hcnkpDQpmb3JtYXRfM2NvbF9jdXN0b21fd2lkdGhzKGN1c3RvbV9zdW1tYXJ5LCBjb2wxX3dpZHRoID0gIjIwZW0iLCBjb2wyX3dpZHRoID0gIjE1ZW0iLCBjb2wzX3dpZHRoID0gIjE1ZW0iKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBTQVZFIFZBTFVFUyBGT1IgSU4tTElORSBDT0RFDQoNCiMgRGVmaW5lIHRoZSBtYXBwaW5nIG9mIHJvdyBuYW1lcyB0byB2YXJpYWJsZSBuYW1lcw0Kcm93X3RvX3Zhcl9uYW1lIDwtIGMoDQogICJNZWFuIiA9ICJtZWFuX3ZhbHVlIiwNCiAgIk1lZGlhbiIgPSAibWVkaWFuX3ZhbHVlIiwNCiAgIlN0YW5kYXJkIERldmlhdGlvbiAoVm9sYXRpbGl0eSkiID0gInNkX3ZhbHVlIiwNCiAgIk1pbiBDQUdSIFJhbmdlIChDQUdSIC0gU0QpIiA9ICJtaW5fY2Fncl9yYW5nZSIsDQogICJNYXggQ0FHUiBSYW5nZSAoQ0FHUiArIFNEKSIgPSAibWF4X2NhZ3JfcmFuZ2UiLA0KICAiTWluIiA9ICJtaW5fdmFsdWUiLA0KICAiTWF4IiA9ICJtYXhfdmFsdWUiLA0KICAiUGVyY2VudCBBYm92ZSBJbmZsYXRpb24gVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9pbmZsYXRpb24iLA0KICAiUGVyY2VudCBBYm92ZSBDb25zZXJ2YXRpdmUgVGFyZ2V0IiA9ICJwZXJjZW50X2Fib3ZlX3RhcmdldF9jb25zZXJ2YXRpdmUiLA0KICAiUGVyY2VudCBBYm92ZSBNb2RlcmF0ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X21vZGVyYXRlIiwNCiAgIlBlcmNlbnQgQWJvdmUgQWdncmVzc2l2ZSBUYXJnZXQiID0gInBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmUiDQopDQoNCiMgRGVmaW5lIGEgY3VzdG9tIG1hcHBpbmcgZm9yIGNvbHVtbiBuYW1lcw0KY29sdW1uX25hbWVfbWFwcGluZyA8LSBjKA0KICAiUyZQIDUwMCIgPSAic3A1MDAiLA0KICAiUVFRIiA9ICJxcXEiDQopDQoNCiMgRnVuY3Rpb24gdG8gc2F2ZSBzdW1tYXJ5IHZhbHVlcyBkeW5hbWljYWxseSB3aXRoIGNvbHVtbiBuYW1lIG1hcHBpbmcNCnNhdmVfY29sdW1uX3ZhbHVlcyA8LSBmdW5jdGlvbihzdW1tYXJ5X2RmLCByb3dfbWFwcGluZywgY29sdW1uX21hcHBpbmcpIHsNCiAgIyBHZXQgdGhlIGNvbHVtbiBuYW1lcyBpbiB0aGUgZGF0YSBmcmFtZQ0KICBjb2x1bW5zX3RvX3NhdmUgPC0gc2V0ZGlmZihuYW1lcyhzdW1tYXJ5X2RmKSwgYygiTWV0cmljIikpICAjIEV4Y2x1ZGUgdGhlIE1ldHJpYyBjb2x1bW4NCiAgDQogICMgSXRlcmF0ZSBvdmVyIGVhY2ggY29sdW1uDQogIGZvciAoY29sIGluIGNvbHVtbnNfdG9fc2F2ZSkgew0KICAgICMgVXNlIHRoZSBjdXN0b20gbWFwcGluZyB0byBnZXQgdGhlIGFwcHJvcHJpYXRlIGNvbHVtbiBuYW1lDQogICAgY29sX25hbWUgPC0gY29sdW1uX21hcHBpbmdbW2NvbF1dICV8fCUgdG9sb3dlcihnc3ViKCJbXmEtekEtWjAtOV0iLCAiXyIsIGNvbCkpDQogICAgDQogICAgIyBFeHRyYWN0IHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgY29sdW1uDQogICAgY29sX3ZhbHVlcyA8LSBzdW1tYXJ5X2RmW1tjb2xdXQ0KICAgIA0KICAgICMgSXRlcmF0ZSBvdmVyIHJvd3MgdG8gc2F2ZSBlYWNoIHZhbHVlIGR5bmFtaWNhbGx5DQogICAgZm9yIChpIGluIHNlcV9hbG9uZyhjb2xfdmFsdWVzKSkgew0KICAgICAgIyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgbmFtZSBmcm9tIHRoZSBtYXBwaW5nDQogICAgICBzdGF0X25hbWUgPC0gcm93X21hcHBpbmdbc3VtbWFyeV9kZiRNZXRyaWNbaV1dDQogICAgICANCiAgICAgIGlmICghaXMubmEoc3RhdF9uYW1lKSkgeyAgIyBTa2lwIGlmIG5vIG1hcHBpbmcgaXMgZGVmaW5lZA0KICAgICAgICAjIENyZWF0ZSB0aGUgdmFyaWFibGUgbmFtZQ0KICAgICAgICB2YXJfbmFtZSA8LSBwYXN0ZTAoc3RhdF9uYW1lLCAiXyIsIGNvbF9uYW1lKQ0KICAgICAgICANCiAgICAgICAgIyBBdHRlbXB0IG51bWVyaWMgY29udmVyc2lvbiBmb3IgZG93bnN0cmVhbSB1c2UNCiAgICAgICAgdmFsdWUgPC0gc3VwcHJlc3NXYXJuaW5ncyhhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgY29sX3ZhbHVlc1tpXSkpKQ0KICAgICAgICANCiAgICAgICAgIyBBc3NpZ24gdGhlIHZhbHVlIHRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQNCiAgICAgICAgYXNzaWduKHZhcl9uYW1lLCB2YWx1ZSwgZW52aXIgPSAuR2xvYmFsRW52KQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQojIEFwcGx5IHRoZSBmdW5jdGlvbiB0byBzYXZlIHZhbHVlcyBkeW5hbWljYWxseQ0Kc2F2ZV9jb2x1bW5fdmFsdWVzKGN1c3RvbV9zdW1tYXJ5LCByb3dfdG9fdmFyX25hbWUsIGNvbHVtbl9uYW1lX21hcHBpbmcpDQoNCiMgRXhhbXBsZTogQWNjZXNzaW5nIGR5bmFtaWNhbGx5IGNyZWF0ZWQgdmFyaWFibGVzDQppbnRlcmFjdGl2ZV9wYXN0ZSgiUyZQIDUwMCBNZWFuOiAiLCBtZWFuX3ZhbHVlX3NwNTAwKSAgIyBTaG91bGQgcHJpbnQgdGhlIG1lYW4gdmFsdWUgZm9yIFMmUCA1MDANCmludGVyYWN0aXZlX3ByaW50KHBlcmNlbnRfYWJvdmVfdGFyZ2V0X2FnZ3Jlc3NpdmVfcXFxKSAgIyBTaG91bGQgcHJpbnQgdGhlIHBlcmNlbnQgYWJvdmUgYWdncmVzc2l2ZSB0YXJnZXQgZm9yIFFRUQ0KDQoNCmBgYA0KDQojIyMjIEdyYXBoIA0KDQpgYGB7ciBpbmRleF9jb21wYXJpc29uXzIweWVhcl9jYWdyX2dyYXBoLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZXZhbD1UUlVFLCBlY2hvPUZBTFNFfQ0KDQpjYXQoIlxuXG4jIyMjIDIwLVllYXIgUm9sbGluZyBDQUdScyBCeSBJbmRleCBcbiIpDQoNCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIENvbnZlcnQgY29sdW1ucyB0byBudW1lcmljIGZvciBwbG90dGluZyBpZiBuZWVkZWQNCm1lcmdlZF9kYXRhIDwtIG1lcmdlZF9kYXRhICU+JQ0KICBtdXRhdGUoDQogICAgYERhdGVgID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYERhdGVgKSksICAjIEVuc3VyZSBEYXRlIGlzIG51bWVyaWMNCiAgICBgUyZQIDUwMGAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYFMmUCA1MDBgKSksDQogICAgYFFRUWAgPSBhcy5udW1lcmljKGdzdWIoIiUiLCAiIiwgYFFRUWApKQ0KICApDQoNCiMgUmVzaGFwZSB0aGUgZGF0YSBpbnRvIGxvbmcgZm9ybWF0IGZvciBlYXN5IHBsb3R0aW5nIG9mIG11bHRpcGxlIGxpbmVzIGFuZCBzZXQgdGhlIGZhY3RvciBvcmRlcg0KbnJ0X2xvbmcgPC0gbWVyZ2VkX2RhdGEgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhgUyZQIDUwMGAsIGBRUVFgKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkFHUl9JbmRleCIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiQUdSX1ZhbHVlIikgJT4lDQogIG11dGF0ZShBR1JfSW5kZXggPSBmYWN0b3IoQUdSX0luZGV4LCBsZXZlbHMgPSBjKCJTJlAgNTAwIiwgIlFRUSIpKSkNCg0KIyBBc3NpZ24gY29sb3JzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRoZSBvcmRlciBvZiBBR1JfSW5kZXggaW4gdGhlIGRhdGENCiMgTWF0Y2ggdGhlIHVuaXF1ZSBsZXZlbHMgb2YgQUdSX0luZGV4IHdpdGggY29sb3JzIGZyb20gY29sb3JzX2dlbmVyYWxfZGFyaw0KdW5pcXVlX3R5cGVzIDwtIHVuaXF1ZShucnRfbG9uZyRBR1JfSW5kZXgpDQpjdXN0b21fY29sb3JzIDwtIHNldE5hbWVzKGNvbG9yc19nZW5lcmFsX2RhcmtbMTpsZW5ndGgodW5pcXVlX3R5cGVzKV0sIHVuaXF1ZV90eXBlcykNCg0KIyBGaW5kIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHgtdmFsdWUgaW4geW91ciBkYXRhDQptYXhfeCA8LSBtYXgoYXMuaW50ZWdlcihtZXJnZWRfZGF0YSREYXRlKSwgbmEucm0gPSBUUlVFKQ0KbWluX3ggPC0gbWluKGFzLmludGVnZXIobWVyZ2VkX2RhdGEkRGF0ZSksIG5hLnJtID0gVFJVRSkNCmludGVyYWN0aXZlX3ByaW50KG1heF94KSAgIyBUZXN0DQppbnRlcmFjdGl2ZV9wcmludChtaW5feCkgICMgVGVzdA0KDQojIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geWVhcg0KbWluX3llYXIgPC0gbWluKG1lcmdlZF9kYXRhJERhdGUsIG5hLnJtID0gVFJVRSkNCm1heF95ZWFyIDwtIG1heChtZXJnZWRfZGF0YSREYXRlLCBuYS5ybSA9IFRSVUUpDQppbnRlcmFjdGl2ZV9wcmludChtaW5feWVhcikNCmludGVyYWN0aXZlX3ByaW50KG1heF95ZWFyKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgUExPVCBGVUxMIFdJVEhPVVQgTElNSVRTDQoNCiMgRGVmaW5lIHN0YXJ0IGFuZCBlbmQgeWVhcnMNCnN0YXJ0X3llYXIgPC0gMjAyMA0KZW5kX3llYXIgPC0gMjAyNA0KeWVhcl9yYW5nZSA8LSBlbmRfeWVhciAtIHN0YXJ0X3llYXIgKyAxICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHllYXJzDQoNCiMgRGVmaW5lIGJyZWFrcyByb3VuZGVkIGFwcHJvcHJpYXRlbHkNCmxpbWl0c19zdGFydF95ZWFyIDwtIGZsb29yKHN0YXJ0X3llYXIgLyAyKSAqIDIgICMgUm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA1DQpsaW1pdHNfZW5kX3llYXIgPC0gY2VpbGluZyhlbmRfeWVhciAvIDIpICogMiAgICMgUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgNQ0KDQojIENyZWF0ZSBkeW5hbWljIHRpdGxlIGFuZCBjYXB0aW9uDQpkeW5hbWljX3RpdGxlIDwtIHBhc3RlMCgiMjAtWWVhciBSb2xsaW5nIENBR1JzIEJ5IEluZGV4IE92ZXIgIiwgeWVhcl9yYW5nZSwgIiBZZWFycyAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KZHluYW1pY19jYXB0aW9uIDwtIHBhc3RlMCgiMjAtWWVhciBSb2xsaW5nIENvbXBvdW5kIEF2ZXJhZ2UgR3Jvd3RoIFJhdGVzIEJ5IEluZGV4LCBEYXRhIFBlcmlvZCAoIiwgc3RhcnRfeWVhciwgIi0iLCBlbmRfeWVhciwgIikiKQ0KDQojIENyZWF0ZSB0aGUgZnVsbCwgbm9uLWZpbHRlcmVkIHgtYXhpcyBwbG90IHdpdGggZHluYW1pYyB4IHBsYWNlbWVudCBmb3IgYW5ub3RhdGlvbnMNCnAxIDwtIGdncGxvdChucnRfbG9uZywgYWVzKHggPSBhcy5pbnRlZ2VyKERhdGUpLCB5ID0gQUdSX1ZhbHVlLCBjb2xvciA9IEFHUl9JbmRleCkpICsNCg0KICAjIEFkZCBzaGFkZWQgYXJlYXMgZm9yIGJhY2tncm91bmQgZWZmZWN0DQogIGdlb21fcmVjdChhZXMoeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsIHltaW4gPSB0YXJnZXRfYWdncmVzc2l2ZSwgeW1heCA9IEluZiksIGZpbGwgPSAibGlnaHRncmVlbiIsIGFscGhhID0gMC4wMzApICsNCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0gLUluZiwgeG1heCA9IEluZiwgeW1pbiA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIHltYXggPSB0YXJnZXRfYWdncmVzc2l2ZSksIGZpbGwgPSAib3JhbmdlIiwgYWxwaGEgPSAwLjAzMCkgKw0KICBnZW9tX3JlY3QoYWVzKHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLCB5bWluID0gLUluZiwgeW1heCA9IHRhcmdldF9jb25zZXJ2YXRpdmUpLCBmaWxsID0gImxpZ2h0Y29yYWwiLCBhbHBoYSA9IDAuMDMwKSArDQogIA0KICAjIFBsb3QgbGluZXMgZm9yIGVhY2ggTWFya2V0IEluZGV4DQogIGdlb21fbGluZShzaXplID0gMS4yNSwgYWxwaGEgPSAzLjApICsgICAgICAgIyBMaW5lIGZvciBlYWNoIENBR1INCiAgZ2VvbV9wb2ludChzaXplID0gMi4wLCBhbHBoYSA9IDMuMCkgKyAgICAgICAjIFBvaW50cyBmb3IgZWFjaCBDQUdSDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfYWdncmVzc2l2ZSwgY29sb3IgPSAiZGFya2JsdWUiLCBsaW5ldHlwZSA9ICJzb2xpZCIpICsNCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0YXJnZXRfbW9kZXJhdGUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGNvbG9yID0gImRhcmtibHVlIiwgbGluZXR5cGUgPSAic29saWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRhcmdldF9pbmZsYXRpb24sIGNvbG9yID0gImRhcmtyZWQiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQoNCiAgIyBEeW5hbWljIHJpZ2h0LWFsaWduZWQgcGxhY2VtZW50IGZvciBhbm5vdGF0aW9ucw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfYWdncmVzc2l2ZSwgbGFiZWwgPSAiQWdncmVzc2l2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICAjIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9tb2RlcmF0ZSwgbGFiZWwgPSAiTW9kZXJhdGUiLCANCiAgIyAgICAgICAgIGhqdXN0ID0gMSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSA0KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IEluZiwgeSA9IHRhcmdldF9jb25zZXJ2YXRpdmUsIGxhYmVsID0gIkNvbnNlcnZhdGl2ZSIsIA0KICAgICAgICAgICBoanVzdCA9IDEsIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gNCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBJbmYsIHkgPSB0YXJnZXRfaW5mbGF0aW9uLCBsYWJlbCA9ICJJbmZsYXRpb24iLCANCiAgICAgICAgICAgaGp1c3QgPSAxLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gNCkgKw0KDQogIGxhYnMoDQogICAgdGl0bGUgPSBkeW5hbWljX3RpdGxlLA0KICAgIHggPSAiWWVhciIsDQogICAgeSA9ICJDQUdSIFZhbHVlICglKSIsDQogICAgY29sb3IgPSAiTWFya2V0IEluZGV4IiwNCiAgICBjYXB0aW9uID0gZHluYW1pY19jYXB0aW9uDQogICAgKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX2NvbG9ycykgKyAgIyBTZXQgY29sb3JzIGZvciBlYWNoIE1hcmtldCBJbmRleA0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYyhzdGFydF95ZWFyLCBlbmRfeWVhciArIDEpLCANCiAgICBicmVha3MgPSBzZXEobGltaXRzX3N0YXJ0X3llYXIsIGxpbWl0c19lbmRfeWVhciwgMikgICMgUmVzdHJpY3QgJiBTZXQgTWFqb3IgeC1heGlzIGxpbmVzIGZvciBlYWNoIHllYXINCiAgKSArIA0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDIwKSwgICAgICAgICAjIExhcmdlciB0aXRsZSBmb250DQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAjIExhcmdlciB4LWF4aXMgbGFiZWwgZm9udA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIGxhYmVsIGZvbnQNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSAxNCksICAjIExhcmdlciB4LWF4aXMgdGV4dA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksICAgICAgICAgICAgICAgICAgICAgIyBMYXJnZXIgeS1heGlzIHRleHQNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRpdGxlIHNpemUNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAgICAgICAgICAgICAgICAgICAgICMgTGVnZW5kIHRleHQgc2l6ZQ0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiYmxhY2siKSwgICMgTWFqb3IgZ3JpZCBsaW5lcw0KICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgICAgICAgICAgICAgICAgICAgICAgIyBObyBtaW5vciB4IGdyaWQgbGluZXMNCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoLTAuMjUsICJjbSIpLCAgICAgICAgICAgICAgICAgICAgICAjIEluY3JlYXNlIHRpY2sgbGVuZ3RoDQogICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUwKSwgICAjIERhcmtlciB0aWNrcw0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNzUpLCAgIyBEYXJrIGJvdHRvbSBib3JkZXINCiAgICBheGlzLmxpbmUueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjc1KSAgICMgRGFyayBsZWZ0IGJvcmRlcg0KICApDQoNCiMgUHJpbnQgdGhlIHBsb3QgDQpwcmludChwMSkNCg0KDQpgYGANCi0tPiANCg0KIyBGVVRVUkUgQ09OU0lERVJBVElPTlMNCg0KVGhlcmUgYXJlIGh1bmRyZWRzIG9mIEVURnMgYW5kIHB1YmxpY2x5IHRyYWRlZCBzdG9jayBjb21wYW5pZXMgdGhhdCBvbmUgY2FuIGV4cGxvcmUuIFRoZXNlIG1heSBpbmNsdWRlIG90aGVyIEVURnMgc3VjaCBhcyB0aGUgVmFuZ3VhcmQgVkdUIEVURiAoaHR0cHM6Ly9pbnZlc3Rvci52YW5ndWFyZC5jb20vaW52ZXN0bWVudC1wcm9kdWN0cy9ldGZzL3Byb2ZpbGUvdmd0I3ByaWNlKSBhbmQgQmxhY2tSb2NrIEVURnMgKGh0dHBzOi8vd3d3LmJsYWNrcm9jay5jb20vdXMvaW5kaXZpZHVhbC9wcm9kdWN0cy9pbnZlc3RtZW50LWZ1bmRzKSwgaW5kaXZpZHVhbCBjb21wYW5pZXMgKGUuZy4sIEFBUEwsIE1TRlQpLCBhbmQgb3RoZXIgcG9ydGZvbGlvcyB0eXBlcyAoUmV0aXJlbWVudC1QbGFuIFBvcnRmb2xpb3MsIGV0YykuDQoNCjwhLS0gDQojIE9USEVSIEFOQUxZVElDQUwgREVTSUdOUyAvIE1PREVMUw0KDQojIyBQcm9qZWN0aW9ucyANCg0KQ29uc2lkZXIgdG8gY3JlYXRlIGZ1dHVyZSBwcm9qZWN0aW9ucyBmb3IgaW5kZXhlcyBiYXNlZCBvbiBoaXN0b3JpY2FsIGRhdGEuIA0KDQoxLiBTaW1wbGUgQXZlcmFnZSBHcm93dGggUHJvamVjdGlvbjoNCi0gVXNlIHRoZSBoaXN0b3JpY2FsIENBR1Igb3IgTWVhbiBHcm93dGggUmF0ZSBhcyB0aGUgYXNzdW1lZCBhbm51YWwgZ3Jvd3RoIHJhdGUgZm9yIGZ1dHVyZSB5ZWFycy4gDQotIEFwcGx5IHRoaXMgcmF0ZSBjdW11bGF0aXZlbHkgdG8gcHJvamVjdCBmdXR1cmUgdmFsdWVzLg0KDQoyLiBNb250ZSBDYXJsbyBTaW11bGF0aW9uOg0KLSBJbmNvcnBvcmF0ZSBoaXN0b3JpY2FsIG1lYW4gYW5kIHZvbGF0aWxpdHkgKHN0YW5kYXJkIGRldmlhdGlvbikgdG8gc2ltdWxhdGUgcmFuZG9tIHJldHVybnMgb3ZlciB0aW1lLg0KLSBHZW5lcmF0ZSBtdWx0aXBsZSBzY2VuYXJpb3MgYW5kIHRha2UgdGhlIGF2ZXJhZ2UgdG8gcmVwcmVzZW50IHBvc3NpYmxlIGZ1dHVyZSB0cmFqZWN0b3JpZXMuDQoNCjMuIFJlZ3Jlc3Npb24gQW5hbHlzaXM6DQotIEZpdCBhIHRyZW5kbGluZSAobGluZWFyLCBwb2x5bm9taWFsLCBvciBleHBvbmVudGlhbCkgdG8gaGlzdG9yaWNhbCBkYXRhIHRvIHByb2plY3QgZnV0dXJlIHBlcmZvcm1hbmNlLg0KLSBJbmNvcnBvcmF0ZSB0aW1lIGFzIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZSBhbmQgZ3Jvd3RoIHJhdGVzIGFzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUuDQoNCjQuIFNjZW5hcmlvLUJhc2VkIFByb2plY3Rpb25zOg0KLSBEZXZlbG9wIG9wdGltaXN0aWMsIG1vZGVyYXRlLCBhbmQgcGVzc2ltaXN0aWMgc2NlbmFyaW9zIGJhc2VkIG9uIHRoZSBNaW4gQ0FHUiBSYW5nZSBhbmQgTWF4IENBR1IgUmFuZ2UgKGUuZy4sIGhpc3RvcmljYWwgbWVhbiDCsSBzdGFuZGFyZCBkZXZpYXRpb24pLg0KLSBVc2UgdGhlc2UgdG8gY3JlYXRlIGEgcmFuZ2Ugb2YgcG9zc2libGUgb3V0Y29tZXMuDQoNCiMjIENQSSB2cyBJbmRleA0KDQotIENvbnNpZGVyIHRvIG1hdGNoIHRoZSBDUEkgSW5mbGF0aW9uIFJhdGUocykgdG8gdGhlIEluZGV4LiBDb25zaWRlciB0byBtdWx0aXBseSBpbmZsYXRpb24gcmF0ZXMgZm9yIG1hZ25pZmljYXRpb24gcHVycG9zZXMgdG8gY29tcGFyZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbmRleGVzIChlZyB4NC1TUFggYW5kIHg1LVFRUSkNCg0KLS0+DQo=