Author1 Hendrik Sommer, Germany
Author2 Antoine Putresza, Poland
Date of the project:
Date of the submission:02.12.2024
Date of the revision:
Date of acceptance:
We will now start with doing the basic parameters of the market
table
library(quantmod)
# Define the date range
start_date <- "2024-05-01"
end_date <- "2024-09-30"
# Create an empty data frame
table_data <- data.frame(
Description = character(),
Beginning_of_Term = character(),
End_of_Term = character()
)
# Function to add rows to the table
add_row <- function(category, data) {
table_data <<- rbind(table_data, data.frame(
Description = category,
BoT = as.character(format(round(data[1], 2), nsmall=2)),
EoT = as.character(format(round(data[2], 2), nsmall=2))
))
}
# Get S&P 500 index level
getSymbols("AAPL", src = "yahoo", from = start_date, to = end_date)
[1] "AAPL"
sp500_start <- AAPL[1, 4]
sp500_end <- AAPL[nrow(AAPL), 4]
add_row("S&P 500 (stock) index level:", c(sp500_start, sp500_end))
#getsymbols Nasdaq composite index level
getSymbols("^IXIC", src = "yahoo", from = start_date, to = end_date)
[1] "IXIC"
start_index_level <- IXIC[1, 4]
end_index_level <- IXIC[nrow(IXIC), 4]
add_row("Nasdaq Composite (stock) index level:", c(start_index_level,end_index_level ))
getSymbols("DPRIME", src = "FRED", from = start_date, to = end_date)
[1] "DPRIME"
# Extract the beginning and end prime rates
prime_rate_start <- DPRIME[1, 1]
prime_rate_end <- DPRIME[nrow(DPRIME), 1]
add_row("Prime rate:", c(prime_rate_start, prime_rate_end))
getSymbols("FEDFUNDS", src = "FRED", from = start_date, to = end_date)
[1] "FEDFUNDS"
# Extract the beginning and end federal funds rates
fed_funds_start <- FEDFUNDS[1, 1]
fed_funds_end <- FEDFUNDS[nrow(FEDFUNDS), 1]
add_row("Federal funds rate:", c(fed_funds_start, fed_funds_end))
getSymbols("DTB3", src = "FRED", from = start_date, to = end_date)
[1] "DTB3"
add_row("Commercial paper rate (90 days):", c(NA, NA))
add_row("Certificate of deposit rate (3-month):", c(NA, NA))
# Extract the beginning and end rates
tbill_rate_start <- DTB3[1, 1]
tbill_rate_end <- DTB3[nrow(DTB3), 1]
add_row("treasury bill rate (13 weeks):", c(tbill_rate_start, tbill_rate_end))
getSymbols("DTB6", src = "FRED", from = start_date, to = end_date)
[1] "DTB6"
# Extract the beginning and end rates
tbill6_rate_start <- DTB6[1, 1]
tbill6_rate_end <- DTB6[nrow(DTB6), 1]
add_row("Treasury bill rate (26 weeks):", c(tbill6_rate_start, tbill6_rate_end))
# Get the 10-year Treasury Bond Yield
getSymbols("DGS10", src = "FRED", from = start_date, to = end_date)
[1] "DGS10"
# Extract the beginning and end rates
long_term_yield_start <- DGS10[1, 1]
long_term_yield_end <- DGS10[nrow(DGS10), 1]
add_row("Treasury long-term bond yield:", c(long_term_yield_start, long_term_yield_end))
#we will use a proxy for corporate (master) bond yield, the Moody's Seasoned Aaa Corporate Bond Yeild
# Get the Moody's Seasoned Aaa Corporate Bond Yield
getSymbols("AAA", src = "FRED", from = start_date, to = end_date)
[1] "AAA"
# Extract the beginning and end rates
corp_bond_yield_start <- AAA[1, 1]
corp_bond_yield_end <- AAA[nrow(AAA), 1]
add_row("Corporate (Master) bond yield:", c(corp_bond_yield_start, corp_bond_yield_end))
add_row("High-yield corporate bond yield:", c(NA, NA))
add_row("Tax-exempt (7–12-year) bond yield:", c(NA, NA))
print(table_data)
First i will compare the London Stock Exchange with the NASDAQ
library(quantmod)
getSymbols("NDAQ", src = "yahoo")
[1] "NDAQ"
getSymbols("^FTSE", src = "yahoo")
Warning: ^FTSE contains missing values. Some functions will not work if objects contain missing values in the middle of the series. Consider using na.omit(), na.approx(), na.fill(), etc to remove or replace them.
[1] "FTSE"
FTSE<- na.approx(FTSE)
NDAQ <- subset(NDAQ, start = "2024-01-05", end = "2024-30-09")
FTSE <- subset(FTSE, start = "2008-01-05", end = "2024-30-09")
nasdaq_stats <- c(
Mean = mean(NDAQ$NDAQ.Close, na.rm=TRUE),
Median = median(NDAQ$NDAQ.Close, na.rm=TRUE),
StDev = sd(NDAQ$NDAQ.Close, na.rm= TRUE))
lond_stats <- c(
Mean = mean(FTSE$FTSE.Close),
Median = median(FTSE$FTSE.Close),
StDev = sd(FTSE$FTSE.Close))
aligned_data <- merge(NDAQ, FTSE)
cleaned_data <- na.omit(aligned_data)
correlation <- cor(cleaned_data[, 1], cleaned_data[, 7])
print(correlation)
FTSE.Open
NDAQ.Open 0.715855
stats_comparison <- rbind(nasdaq_stats, lond_stats)
colnames(stats_comparison) <- c("Mean", "Median", "Standard Deviation" )
round(stats_comparison,2)
Mean Median
nasdaq_stats 26.25 19.41
lond_stats 6536.16 6632.90
Standard Deviation
nasdaq_stats 19.72
lond_stats 946.51
print(round(correlation,2))
FTSE.Open
NDAQ.Open 0.72
I will now compare the London Stock Exchange index and the German DAX
index
# Download historical data for NASDAQ and TechDAX
getSymbols("NDAQ", src = "yahoo")
[1] "NDAQ"
getSymbols("DAX", src = "yahoo") # TechDAX is a component of the DAX index
[1] "DAX"
# Fill in missing values with approximations
DAX <- na.approx(DAX)
# Trim data to a specific period
NDAQ <- subset(NDAQ, start = "2024-05-01", end = "2024-09-30")
DAX <- subset(DAX, start = "2024-05-01", end = "2024-09-30")
# Calculate basic statistics
nasdaq_stats <- c(
Mean = mean(NDAQ$NDAQ.Close, na.rm = TRUE),
Median = median(NDAQ$NDAQ.Close, na.rm = TRUE),
StDev = sd(NDAQ$NDAQ.Close, na.rm = TRUE)
)
dax_stats <- c(
Mean = mean(DAX$DAX.Close),
Median = median(DAX$DAX.Close),
StDev = sd(DAX$DAX.Close)
)
# Correlation
aligned_data <- merge(NDAQ, DAX)
cleaned_data <- na.omit(aligned_data)
correlation <- cor(cleaned_data[, 1], cleaned_data[, 2])
# Print statistics and correlation
stats_comparison <- rbind(nasdaq_stats, dax_stats)
colnames(stats_comparison) <- c("Mean", "Median", "Standard Deviation")
round(stats_comparison, 2)
Mean Median
nasdaq_stats 26.25 19.41
dax_stats 28.06 27.98
Standard Deviation
nasdaq_stats 19.72
dax_stats 3.36
print(round(correlation, 2))
NDAQ.High
NDAQ.Open 1
# Visualize the comparison
library(ggplot2)
ggplot() +
geom_line(data = NDAQ, aes(x = index(NDAQ), y = NDAQ.Close), color = "blue") +
geom_line(data = DAX, aes(x = index(DAX), y = DAX.Close), color = "red") +
labs(title = "NASDAQ vs. DAX (TechDAX)", x = "Date", y = "Index Value") +
scale_color_manual(values = c("blue" = "NASDAQ", "red" = "DAX"))
Warning: No shared levels found between
`names(values)` of the manual scale and
the data's colour values.

L.3
library(quantmod)
# Define the date range
start_date <- as.Date("2024-05-01")
end_date <- as.Date("2024-09-30")
# Get 13-week Treasury Bill rates
getSymbols("^IRX", src = "yahoo", from = start_date, to = end_date)
Warning: ^IRX contains missing values. Some functions will not work if objects contain missing values in the middle of the series. Consider using na.omit(), na.approx(), na.fill(), etc to remove or replace them.
[1] "IRX"
# Extract initial and final rates
start_rate <- IRX[1,1]
end_rate <- IRX[nrow(IRX),1]
# Calculate change and percentage change
rate_change <- end_rate - start_rate
percentage_change <- (end_rate - start_rate) / start_rate * 100
# Print the results
cat("13-week Treasury Bill Rate at the beginning of the term:", start_rate, "\n")
13-week Treasury Bill Rate at the beginning of the term: 5.25
cat("13-week Treasury Bill Rate at the end of the term:", end_rate, "\n")
13-week Treasury Bill Rate at the end of the term: 4.478
cat("Change in rate:", rate_change, "\n")
Change in rate:
cat("Percentage change:", percentage_change, "%")
Percentage change: %
Why did the interest rate change?
Monetary policy of the Federal Reserve
Inflation expectations
Demand for safe assets
Liquidity in the financial system
Expectations for the future interest rates
Supply and demand
International capital flows
L.4
library(quantmod)
library(ggplot2)
# Specify the date range
start_date <- "2017-10-22"
end_date <- "2017-10-30"
# Get the stock data for Coca-Cola
getSymbols("KO", src = "yahoo", from = start_date, to = end_date)
[1] "KO"
# Create a data frame with Date and Closing Price
KO_df <- data.frame(Date = index(KO), Price = Cl(KO))
# Create the line plot
ggplot(KO_df, aes(x = Date, y = Cl(KO))) +
geom_line() +
labs(x = "Date", y = "Stock Price", title = "Coca-Cola Stock Price (22-30 Oct 2017)") +
theme_classic() # Optional: For a cleaner plot
Don't know how to automatically pick
scale for object of type <xts/zoo>.
Defaulting to continuous.

library(quantmod)
library(ggplot2)
# Specify the date range for October 2017
start_date <- "2017-10-15"
end_date <- "2017-11-15"
# Get the stock data for Coca-Cola
getSymbols("KO", src = "yahoo", from = start_date, to = end_date)
[1] "KO"
# Create a data frame with Date and Closing Price
KO_df <- data.frame(Date = index(KO), Price = Cl(KO))
# Create the line plot
ggplot(KO_df, aes(x = Date, y = Cl(KO))) +
geom_line() +
labs(x = "Date", y = "Stock Price", title = "Coca-Cola Stock Price (October 2017)") +
theme_classic()
Don't know how to automatically pick
scale for object of type <xts/zoo>.
Defaulting to continuous.

library(quantmod)
library(ggplot2)
# Specify the date range for October 2017
start_date <- "2017-04-15"
end_date <- "2017-11-15"
# Get the stock data for Coca-Cola
getSymbols("KO", src = "yahoo", from = start_date, to = end_date)
[1] "KO"
# Create a data frame with Date and Closing Price
KO_df <- data.frame(Date = index(KO), Price = Cl(KO))
# Create the line plot
ggplot(KO_df, aes(x = Date, y = Cl(KO))) +
geom_line() +
labs(x = "Date", y = "Stock Price", title = "Coca-Cola Stock Price (October 2017)") +
theme_classic()
Don't know how to automatically pick
scale for object of type <xts/zoo>.
Defaulting to continuous.

On October 26 2017 Coca-Cola released its third-quarter earnings for
2017. As we analize the stock price of coca cola company in time we
observe that in the period of a month before the 26th of october there
is a downtrend but on the 26th of october the price increased for one
day and then continued dropping intill the begining of November where it
started going up again. The explanation could be that the information
comming from the quarterly report influenced a better informed part of
the market immidiately on the 26th of october and the rest of the market
later in the begining of November.
L.5
For our task we chose the Bank of America
L5.1 Identify the types of deposits that the commercial bank uses to
obtain most of its funds. Bank of America raises the majority of its
funds through the following types of deposits: - Demand deposits:
checking accounts that allow customers to access their money at any
time. - Time deposits: Time deposit accounts in which customers invest
their money for a specific period of time. - Savings deposits: Savings
accounts that are intended for saving and offer higher interest
rates.
L5.2 Identify the main uses of funds by the bank. c. Summarize any
statements made by the commercial bank in its annual report about how
recent or potential regulations will affect its performance. The primary
uses of Bank of America’s funds include: - Lending: providing loans to
individuals and businesses. - Investment banking: providing corporate
finance and capital markets transaction services. - Asset management:
managing assets for private clients and institutions.
Impact of regulations In its annual report, Bank of America
emphasises that current and potential regulatory requirements can affect
its performance. In particular, reference is made to capital
requirements and liquidity requirements, which could restrict the
ability to grant loans.
L5.3 Does it appear that the bank is attempting to enter the
securities industry by offering securities services? If so, explain how.
Yes, it appears that Bank of America is attempting to enter the
securities industry. This is being done by: - Offering securities
services: The bank offers trading services for stocks and bonds and has
a strong investment banking segment that focuses on capital market
transactions.
L5.4 Does it appear that the bank is attempting to enter the
insurance industry by offering insurance services? If so, explain how.
Yes, there are signs that Bank of America is entering the insurance
sector. This is evidenced by: - Offering insurance products: The bank
offers various insurance services to provide comprehensive financial
solutions to its customers.
L5.6 To determine Bank of America’s interest income as a percentage
of its total assets, we can use the following data from their financial
statements:
L5.7 Interest expenses: For the year ending December 31, 2023, Bank
of America reported interest income of $98,581 million Total Assets: As
of December 31, 2023, the total assets for Bank of America were reported
as $3,180,151 million
We can now divide the total interest income by the total assets to
get a percentage rate:
98581/3180151
[1] 0.03099884
The bank’s interest expenses were 3,10% of the total assets of the
Bank of America
L5.8 Determine the bank’s net interest margin. NIM = 2.07% (P. 84 /
P. 86)
L5.9
The noninterest income: For the year ending December 31, 2023, Bank
of America reported a noninterest income of $41,650 million Now we will
divide this by the total assets to get a percentage rate
41650/3180151
[1] 0.01309686
The bank’s noninterest income rate was 1,31% of the total assets
Non Interest expenses percentage = 2.09% (P.81)
L5.10
For the year ending December 31, 2023, Bank of America reported a
loan loss reserve of $13,287 million We will now divide it by the amount
of total assets to get a percentage rate
13287/3180151
[1] 0.004178103
The loans and loss reserve rate was 0,42% of the total assets
L5.11 To find out about the return on assets we should find out about
the total income of the bank and then divide it by the value of total
assets. For the year ending December 31, 2023, Bank of America reported
a net income of $26,515 million We will now divide this value by the
total assets to get a percentage rate
26515/3180151
[1] 0.008337654
The Bank of America’s return on assets was 0,83% of the total
assets
L5.12 To find out about the return on assets we should find out about
the total income of the bank and then divide it by the value of total
shareholders equity. As we already have the value of the net income we
will now find the data about the total shareholders equity. For the year
ending December 31, 2023, Bank of America reported a total shareholders
equity of $291,646 million. We will now divide the net income by the
total shareholders equity.
26515/291646
[1] 0.09091501
The Bank of America’s return on equity rate was 9,09%.
L5.13
Income Statement Items Affected
- net interest income (interest income):
- 2023: $56,931 million
- Impact: An increase in interest rates will increase interest income
as the bank benefits from higher income from variable rate loans and new
loans. Interest expenses could also increase, but as net interest income
is higher than interest expenses, overall net interest income is
expected to grow.
- provision for credit losses (loan loss provisions):
- 2023: USD 4.394 million
- Impact: Higher interest rates could increase the risk of default as
borrowers may have difficulty servicing their debts. This could lead to
higher loan loss provisions.
- non-interest income (non-interest income):
- 2023: USD 41.650 million
- Impact: Fee income could increase as clients increasingly seek
financial products to deal with rising interest rates. At the same time,
market volatility could negatively impact trading profits.
Summary of the impact
An increase in interest rates would likely lead to an increase in net
interest income as interest income exceeds interest expenses. At the
same time, the commission for credit losses could increase, which
affects the default risk for borrowers. Non-interest income could be
affected both positively and negatively, depending on developments in
fee income and trading profits. Overall, the bank could benefit from the
interest rate increases as long as the income outweighs the risk of
credit losses.
This analysis provides a specific overview of the potential financial
impact on Bank of America in the context of rising interest rates.
L5.14
Income Statement Items Affected Net interest income: In a situation
of crisis the net interest income might register a drop. Usually when
the economic conditions deteriorate, individuals and businesses are less
likely to take credits because the bank has no guarantee they will be
able to pay them back. As a result the demand falls and the interest
income becomes lower.There might also be a reaction of the Federal
Reserve which could lower the rate which would be a reason for a lower
interest income from existing loans.
Provision for Loan Losses: During an economic condition deterioration
bank’s might anticipate a higher default rate on credits. That might
result in an increase of the provision for loan losses since the
expected defaulted loans rate rises, so to cover the potential losses
the bank could put more funds into this item.
Non-interest income: During an economic condition deterioration
bank’s might experience a drop of fee-generating activities such as
asset management or investment banking. That could lead to a decrease of
the non-interest income.
Net interest margin: During an economic condition deterioration
bank’s might lower the interest rate to stimulate borrowing, that would
lead to a drop in the difference between the interest of loans and the
interest of deposits which would lead to a drop of the net interest
margin.
Net income: As we take the situation of all the items we analyzed
above we see that as the net interest income could drop the provision on
loan losses could rise and the net interest margin could drop the
situation of the net income could also be a decrease in overall.
L5.15
The fund’s objective is to invest at least 99.5% of its total assets
in cash, U.S. Treasury bills, notes and other direct obligations of the
U.S Treasury, and repurchase agreements secured by such obligations or
cash. The Fund invests in securities maturing in 397 days or less (with
certain exceptions) and the portfolio will have a dollar-weighted
average maturity of 60 days or less and a dollar-weighted average life
of 120 days or less. In addition, the Fund may invest in variable and
floating rate instruments and transact in securities on a when-issued,
delayed delivery or forward commitment basis. We consider this mutual
fund to have a low risk since it invests mostly in low risk instruments
such as treasury bills.
L5.16
The return of the mutual fund for last year was 5.08% The average
annual return over the last three years was 2.22%
L5.17
As the fund invests most of its assets in treasury bills and
obligations it will be mostly affected by the U.S. interest rates.
L5.18
When buying we pay 0.10% of a management fee and 0.07% of an
administration fee, as a sum we pay a 0.17% fee.
L5.19
The expense ratio for this mutual fund over the last year was 0.02%.
This amount seems quite low in comparison with other funds that
sometimes have an expense ratio of over 1%. This level of expense ratio
gives a possibility to transfer more of the interest to the
investors.
Securities firms For the securities firm that you selected at the
beginning of the term, use its annual report or any other related
information to answer the following questions.
L5.20 What are the main types of business conducted by the securities
firm? The corporate purpose of Prosegur Cash is to provide the following
services through companies focusing on the Cash business: (i) national
and international transport services (by land, sea and air) of funds and
other valuables (including jewellery, artworks, precious metals,
electronic devices, voting ballots, legal evidence), including
collection, transport, custody and deposit services; (ii) processing and
automation of cash (including counting, processing and packaging, as
well as coin recycling, cash flow control and monitoring systems); (iii)
comprehensive ATM solutions (including planning, loading, monitoring,
first- and second-tier maintenance and balancing); (iv) cash planning
and forecasting for financial institutions; (v) Cash-Today (including
self-service cash machines, cash deposits, recycling and bank notes and
coin dispensing services), and cryptocurrency custody services; and (vi)
added-value services in several countries (AVOS) for banks (including
outsourcing of tellers, multi-agency services, cheque processing and
related administrative services among others) and (vii) Correspondent
banking activities (collection and payment management and payment of
invoices, among others) and (viii) Foreign exchange currency services
(also includes international payment services, online foreign money,
home delivery services for travel money and local cash)
L5.21 Summarize any statements made by the securities firm in its
annual report about how it may be affected by existing or potential
regulations. Prosegur acknowledges that the sector in which it provides
its services is highly regulated. The firm however sees the need to
adapt to those regulations and takes action in introducing changes the
regulations address. The reports indicate that the change in regulations
affect the business especially in the data protection sector, however it
provided important steps to introduce changes in its operational
practices. This process may lead to a rise in operational costs since it
may need introducing some new technologies and training of the staff.
The regulations may however have a positive effect on the business in
the domains of cybersecurity and risk management since the changes in
regulations may affect the demand on such services provided by this
firm.
L5.22 Describe the recent performance of the securities firm, and
explain why the performance has been favorable or unfavorable. Sales in
2023 compared to the year 2022 -21 802 000 € Post tax profit of ongoing
operations in 2023 compared to the year 2022 -95 488 000 € EBITDA in
2023 compared to year 2022 -36 220 000€
The data shows a significant difference between the performance of
the firm in the year 2022 and the year 2023. This may have been caused
by multiple different aspects. First of all, the year 2022 was a very
good year in the history of Prosegur and the firm registered some
significant profits and a big growth in assets, which could be difficult
to outperform. The second aspect could be a difference in demand on the
market which could be the reason for the difference in sales and the
EBITDA. The firm also has registered an important difference in the post
tax profit of ongoing operations which could be caused by a different
cost management policy.
L7 Fixed income Comparing yields among securities
L7.1 What is the difference between the yield on corporate
high-quality bonds and the yield on Treasury bonds at the end of the
school term? Explain why the difference exists? Reasons for the
difference between these two yields
This difference between the yields is called the credit spread and
exists due to the following factors: 1. credit risk a. Corporate
high-quality bonds have a higher risk of default compared to Treasury
bonds. Therefore, investors demand a higher yield to compensate for this
risk 2. liquidity risk a. Corporate high-quality bonds are often less
liquid than Treasury bonds. A quick sale at a fair market price is
therefore much more difficult than with Treasury bonds. 3. market
conditions a. Changes in the economic situation or monetary policy have
a different effect on the respective bond.
L7.2 What is the difference between the yield on long-term Treasury
bonds and the yield on long-term municipal bonds at the end of the
school term? Explain why does the difference exist? Long-term treasury
bonds yield varies between 3.8% and 4% while long-term municipal bonds
may yield between 5% and 6% after counting for their tax-exempt status
for investors in higher tax brackets. That means that after taking in
consideration the tax implications the municipal bonds offer a higher
yield than treasury bonds. The interest from municipal bonds is exempt
from federal income tax and also from state taxes if the investor
resides in the issuing state. This puts the municipal bonds in a
favorable position compared to the treasury bonds which are taxable.
There is a difference in risk between the treasury bonds and the
municipal bonds since the treasury bonds are considered to be risk-free
while the municipal bonds carry some type of credit risk depending on
the financial condition of the issuing municipality.
Assessing the forecasting ability of the yield curve
L7.3 What was the difference between the 26-week T-bill yield and the
13-week T-bill yield at the beginning of the school term?
L7.4 Does this imply that the yield curve had an upward or downward
slope at that time?
L7.5 Assuming that this slope can be primarily attributed to
expectations theory, did the direction of the slope indicate that the
market expected higher or lower interest rates in the future?
L7.6 Did interest rates move in that direction over the school term?
Explaining shifts in the yield curve over time
L7.7 What was the difference between the long-term Treasury bond
yield and the 13-week T-bill yield at the beginning of the school term?
On May 1st, 2024, the yield for the 30-year Treasury bond was 4.57%
Meanwhile, the yield for the 13-week T-bill was 3.81% Difference between
those bonds is 4.57 - 3.81 = 0.76% The difference between those two
bonds would usually be caused by the risk differences where the risk of
the 10-year U.S. treasury bond is higher than the 13-week treasury bill.
In such a case the yield of the 10-year treasury bond should be higher
to compensate for the risk. Another reason for this difference is the
expectation that the interest rate could change in time so investors
would prefer to have their money held for a shorter period of time in
order not to be locked in their investments.
L7.8 What is the difference between the long-term Treasury bond yield
and the 13-week T-bill yield at the end of the school term? On September
30, 2024, the long-term Treasury bond yield (10-year Treasury rate) was
4.41%. Meanwhile, the 13-week T-bill yield was 3.81%. The difference
between these two yields is 0.60% (4.41% - 3.81%)
L7.9 Given your answers to the two previous questions, describe how
the yield curve changed over the school term. Explain the changes in
expectations about future interest rates that are implied by the shift
in the yield curve over the school term. The differences between the
yields in the beginning of the school term was 0.76% and at the end of
the school term was 0.60%. Over the school term, the yield curve
experienced a flattening. That shows that the expectations about the
interest rates are that it will drop. The Fed’s influence on interest
rates
L7.10 Did the Fed change the federal funds rate over the school
term?
L7.11 Do you think the movements in interest rates over the school
term were caused by the Fed’s monetary policy? Explain. Measuring and
explaining premiums on money market securities L7.12 What is the
difference between the yield on 90-day commercial paper and the yield on
13-week T-bills at the end of the school term? Eexplain why this premium
exists. L7.13 Compare the premium on the 90-day commercial paper yield
(relative to the 13-week T-bill yield) that exists at the end of the
school term to the premium that existed at the beginning of the term.
Eexplain why the premium may have changed over the school term.
Explaining bond premiums and price movements
L7.14 What is the difference between the yield on high-yield
corporate bonds at the end of the school term versus the yield on
high-quality corporate bonds at the beginning of the school term?
L7.15 Compare the long-term Treasury bond yield at the end of the
school term to the longterm Treasury bond yield that existed at the
beginning of the school term. Given the direction of this change, did
prices of long-term bonds rise or fall over the school term?
L7.16 Compare the change in the yields of Treasury, municipal, and
corporate bonds over the school term. Did the yields of all three types
of securities move in the same direction and by about the same degree?
Explain why yields of different types of bonds move together.
L7.17 Compare the premium on high-yield corporate bonds (relative to
Treasury bonds) at the beginning of the school term to the premium that
existed at the end of the school term. Did the premium increase or
decrease? Why this premium changed over the school term.
L8 Portfolio - Markovitz Replicate the basic idea of the portfolio
case Markowitz portfolio theory, which was developed in the 1950s, is a
form of portfolio optimization based on structured mathematical and
statistical principles. At its heart is the concept of diversification.
Markowitz argues that by combining different assets in a portfolio, the
overall risk can be significantly reduced without significantly reducing
the expected return. This is based on the assumption that not all
investments are equally correlated; by specifically selecting assets
with different risk profiles and expected returns, investors can reduce
the volatility of their portfolios. A key element of this theory is the
quantification of risk.
L9 Portfolio - CAMP State the difference between CAMP and Markovitz
The Capital Asset Pricing Model (CAPM) is a central concept in finance
that describes the relationship between the risk of an asset and its
expected return. The basic assumption is that investors must be rewarded
for taking risk. It introduces the concept of systematic risk, which
cannot be eliminated through diversification. The expected return of an
asset is determined by the risk-free rate of return plus a risk premium
proportional to the asset’s beta - a measure of its volatility relative
to the market as a whole. In contrast to Markowitz portfolio theory,
which focuses on the diversification of investments to reduce risk, the
CAPM focuses on the systematic risk of an individual asset in the
context of the market as a whole. While Markowitz theory helps investors
to create optimal portfolios by using the standard deviation of returns
as a measure of risk, the CAPM only looks at risk that cannot be reduced
through diversification. Another difference lies in the application of
the two models. The Markowitz theory is often used to optimize the
composition of portfolios through diversification, among other things,
whereas the CAPM is used to evaluate individual investments. It offers a
clear method for determining an appropriate return for the risk taken on
an asset. It is therefore very useful for individual investment
decisions. To summarize, both CAPM and Markowitz are important tools in
the field of finance. They offer different perspectives on risk and
return and complement each other in their application.
L10 WACC Replicate the book case of WACC The Weighted Average Cost of
Capital (WACC) is an important financial metric that represents the
average rate of return a company needs to achieve to satisfy its
investors—both equity shareholders and debt holders. It helps determine
the minimum return the company should generate on its investments to
maintain its value and attract ongoing funding. Key Components of WACC:
Cost of Equity (Re): This is the return that equity investors expect for
taking on the risk of investing in the company. It is typically
estimated using the Capital Asset Pricing Model (CAPM), reflecting the
opportunity cost of capital. Cost of Debt (Rd): This represents the
interest rate a company pays on its borrowed funds, adjusted for the
corporate tax rate because interest payments are tax-deductible. WACC
Formula: WACC is calculated as a weighted average, where the weights
represent the proportion of equity and debt in the company’s capital
structure. The formula is:
WACC=EV⋅Re+DV⋅Rd⋅(1−Tc)WACC=VE⋅Re+VD⋅Rd⋅(1−Tc) Where: E: Market value of
equity D: Market value of debt V: Total value (equity + debt) Re: Cost
of equity Rd: Cost of debt Tc: Corporate tax rate Key Takeaways: Purpose
of WACC: WACC serves as a crucial benchmark for evaluating investment
opportunities. It represents the minimum return required to satisfy both
equity and debt investors. Projects should only be pursued if their
expected return exceeds the WACC, ensuring they create value. By
factoring in the company’s overall cost of capital, WACC reflects the
risk preferences of both equity and debt holders, supporting informed
financial decision-making. Factors Affecting WACC: A company’s capital
structure plays a major role in determining its WACC, as debt is
typically less expensive than equity, but increases financial risk.
External factors like interest rates or market risk premiums can
influence both the cost of debt and equity. Additionally, the tax rate
impacts the after-tax cost of debt, with higher tax rates lowering the
effective cost of debt, thus potentially reducing WACC. All these
elements collectively shape the company’s total cost of capital and
impact its financial strategy. Implications of WACC: A lower WACC means
cheaper financing for investments, improving the company’s competitive
edge. A higher WACC signals higher financing costs, which could limit
growth opportunities. WACC is a vital metric in corporate finance,
guiding investment decisions, valuation models, and performance
assessments. It provides a comprehensive view of a company’s financing
costs and strategic financial planning.
L11 Derivatives L11.1 Assume that you purchased an S&P 500
futures contract at the beginning of the school term, with the first
settlement date beyond the end of the school term. Also assume that you
sold an S&P 500 futures contract with this same settlement date at
the end of the school term. Given that this contract has a value of the
futures price times $250, determine the difference between the dollar
value of the contract you sold and the dollar amount of the contract
that you purchased.
The price of futures contract in the beginning of the school term: $
5046,5 The price of futures contract in the end of the school term:
$5814,25
250*5046.5
[1] 1261625
Futures value of purchase: $1 261 625
Futures value of sale:
250*5814.25
[1] 1453562
Futures value of sale: = $1 453 562,5 We will now calculate the
difference:
1261625-1453562.5
[1] -191937.5
= $191 937,5
L11.2 Assume that you invested an initial margin of 20 percent of the
amount that you would owe to purchase the S&P 500 index at the
settlement date. Measure your return from taking a position in the
S&P 500 index futures as follows. Take the difference determined in
the previous question (which represents the dollar amount of the gain on
the futures position) and divide it by the amount you originally
invested (the amount you originally invested is 20 percent of the dollar
value of the futures contract that you purchased).
Initial investment:
0.2*1261625
[1] 252325
= 252 325 Return = difference/initial investment
191937.5/252325
[1] 0.7606757
Return = 0,7606757 = 76%
L11.3 The return that you just derived in the previous question is
not annualized. To annualize your return, multiply it by 12/m, where m
is the number of months in your school term.
Annualized return
76*12/5
[1] 182.4
= 182,4%
L11.4 Assume that you purchased a call option (representing 100
shares) on the specific stock that you identified for this project. What
was your return from purchasing this option? [Your return can be
measured as Return = max(market price - K,0)/P
Premt represents the premium at which the same option can be sold at
the end of the school term.] If the premium for this option is not
quoted at the end of the school term, measure the return as if you had
exercised the call option at the end of the school term (assuming that
it is feasible to exercise the option at that time). That is, the return
is based on purchasing the stock at the option’s strike price and then
selling the stock at its market price at the end of the school term.
To calculate the return from purchasing a call option on Apple
Inc. (AAPL) shares, we will assume specific values for the strike price
and premium paid for the option. Based on the most recent stock price
data, we will use the closing price of Apple shares at the end of the
school term, which is $237.33. Assumptions: Strike Price (K): Let’s
assume a strike price of $230. Premium Paid (P): We will assume we paid
a premium of $5 per share Market Price at Expiration: The market price
of Apple shares on September 30 2024 is $237.33. Calculating return:
Selling the option If you decide to sell the call option at market
price: Return=max(Market Price−K,0)−P /P K - strike price P - premium
Calculating: max(237.33−230,0)=max(7.33,0)=7.33
Return=(7.33−5)/5=2.33/5=0.466 or 46.6%
Exercising the option: If you decide to exercise the call option:
Return=max(Market Price−K,0)/P Calculating: Return
7.33/5
[1] 1.466
=1.466 or 146.6% Summary of returns Return if Sold: 46.6% Return if
Exercised: 146.6%
L11.5 Annualize the return on your option by multiplying the return
you derived in the previous question by 12/m, where m represents the
number of months in your school term. If sold:
46.6* 12/5
[1] 111.84
= 111,84%
If exercised
146.6*12/5
[1] 351.84
= 351,84%
L11.6 Compare the return on your call option to the return that you
would have earned if you had simply invested in the stock itself. Notice
how the magnitude of the return on the call option is much larger than
the magnitude of the return on the stock itself. That is, the gains are
larger and the losses are larger when investing in call options on a
stock instead of the stock itself. Determining swap payments
L11.7 Assume that, at the beginning of the school term, you engaged
in a fixed-for-floating rate swap in which you agreed to pay 6 percent
in exchange for the prevailing 26-week T-bill rate that exists at the
end of the school term. Assume that your swap agreement specifies the
end of the school term as the only time at which a swap will occur and
that the notional amount is $10 million. Determine the amount that you
owe on the swap, the amount you are owed on the swap, and the
difference. Did you gain or lose as a result of the swap? Measuring and
explaining exchange rate movements
L11.8 Determine the percentage change in the value of the British
pound over the school term. Did the pound appreciate or depreciate
against the dollar?
In the beginning of the school term one British Pound costed 1,27 USD
In the end of the school term one British Pound costed 1,34 USD The
British Pound appreciated
(1.34-1.27)/1.27
[1] 0.05511811
= 0,05512 = 5,512%
L11.9 Determine the percentage change in the value of the Japanese
yen over the school term. Did the yen appreciate or depreciate against
the dollar? In the beginning of the school term one Japanese Yen costed
0,0064 USD In the end of the school term one Japanese Yen costed 0,0070
USD The Japanese Yen appreciated
(0.0070-0.0064)/0.0064
[1] 0.09375
= 0,09375 = 9,38%
L11.10 Determine the percentage change in the value of the Mexican
peso over the school term. Did the peso appreciate or depreciate against
the dollar? In the beginning of the school term the Mexican Peso costed
0,59 USD In the end of the school term the Mexican Peso costed 0,51 USD
The Mexican Peso depreciated
(0.51-0.59)/0.59
[1] -0.1355932
= -0,13559 = -13,56%
L11.11 Determine the per unit gain or loss if you had purchased
British pound futures at the beginning of the term and sold British
pound futures at the end of the term.
In the beginning of the school term one British Pound costed 1,27 USD
In the end of the school term one British Pound costed 1,34 USD Gain or
loss per unit
1.34-1.27
[1] 0.07
= 0,07 USD That represents a gain of $0,07 per British Pound
L11.12 Given that a single futures contract on British pounds
represents 62,500 pounds, determine the dollar amount of your gain or
loss.
To calculate the dollar amount of gain or loss we must multiplicate
the amount of GBP per the gain or loss per British Pound in USD
Calculation:
62500*0.07
[1] 4375
= $4 375
L12 Capital requirements L12.1 Calculate the operational, market and
credit risk capital requirements for Bank of America and Deutsche Bank
as of December 31, last year, which bank has a better capital base?
Bank of America (BoA):
Common Equity Tier 1 (CET1) Capital Ratio: 11.8%
Deutsche Bank:
Common Equity Tier 1 (CET1) Capital Ratio: 13.7% Risk-weighted Assets
(RWA): €350 billion Operational Risk RWA: €57 billion Credit Risk and
Market Risk RWA: Remaining amounts after operational RWA deduction.
Comparison
CET1 Ratios: Deutsche Bank: 13.7% BoA: 11.8%
Better CET1 Ratio: Deutsche Bank, indicating a stronger capital
position relative to risk-weighted assets. Breakdown of Risks (Deutsche
Bank): Operational Risk: €57 billion. Remaining RWA (likely split
between Credit and Market Risk): €293 billion.
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpBdXRob3IxIEhlbmRyaWsgU29tbWVyLCBHZXJtYW55CgpBdXRob3IyIEFudG9pbmUgUHV0cmVzemEsIFBvbGFuZAoKRGF0ZSBvZiB0aGUgcHJvamVjdDoKCkRhdGUgb2YgdGhlIHN1Ym1pc3Npb246MDIuMTIuMjAyNAoKRGF0ZSBvZiB0aGUgcmV2aXNpb246CgpEYXRlIG9mIGFjY2VwdGFuY2U6CgoKV2Ugd2lsbCBub3cgc3RhcnQgd2l0aCBkb2luZyB0aGUgYmFzaWMgcGFyYW1ldGVycyBvZiB0aGUgbWFya2V0IHRhYmxlCgpgYGB7cn0KbGlicmFyeShxdWFudG1vZCkKCiMgRGVmaW5lIHRoZSBkYXRlIHJhbmdlCnN0YXJ0X2RhdGUgPC0gIjIwMjQtMDUtMDEiCmVuZF9kYXRlIDwtICIyMDI0LTA5LTMwIgoKIyBDcmVhdGUgYW4gZW1wdHkgZGF0YSBmcmFtZQp0YWJsZV9kYXRhIDwtIGRhdGEuZnJhbWUoCiAgRGVzY3JpcHRpb24gPSBjaGFyYWN0ZXIoKSwKICBCZWdpbm5pbmdfb2ZfVGVybSA9IGNoYXJhY3RlcigpLAogIEVuZF9vZl9UZXJtID0gY2hhcmFjdGVyKCkKKQoKIyBGdW5jdGlvbiB0byBhZGQgcm93cyB0byB0aGUgdGFibGUKYWRkX3JvdyA8LSBmdW5jdGlvbihjYXRlZ29yeSwgZGF0YSkgewogIHRhYmxlX2RhdGEgPDwtIHJiaW5kKHRhYmxlX2RhdGEsIGRhdGEuZnJhbWUoCiAgICBEZXNjcmlwdGlvbiA9IGNhdGVnb3J5LAogICAgQm9UID0gYXMuY2hhcmFjdGVyKGZvcm1hdChyb3VuZChkYXRhWzFdLCAyKSwgbnNtYWxsPTIpKSwKICAgIEVvVCA9IGFzLmNoYXJhY3Rlcihmb3JtYXQocm91bmQoZGF0YVsyXSwgMiksIG5zbWFsbD0yKSkKICApKQp9CgojIEdldCBTJlAgNTAwIGluZGV4IGxldmVsCmdldFN5bWJvbHMoIkFBUEwiLCBzcmMgPSAieWFob28iLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKCnNwNTAwX3N0YXJ0IDwtIEFBUExbMSwgNF0Kc3A1MDBfZW5kIDwtIEFBUExbbnJvdyhBQVBMKSwgNF0KYWRkX3JvdygiUyZQIDUwMCAoc3RvY2spIGluZGV4IGxldmVsOiIsIGMoc3A1MDBfc3RhcnQsIHNwNTAwX2VuZCkpCgojZ2V0c3ltYm9scyBOYXNkYXEgY29tcG9zaXRlIGluZGV4IGxldmVsCmdldFN5bWJvbHMoIl5JWElDIiwgc3JjID0gInlhaG9vIiwgZnJvbSA9IHN0YXJ0X2RhdGUsIHRvID0gZW5kX2RhdGUpCnN0YXJ0X2luZGV4X2xldmVsIDwtIElYSUNbMSwgNF0KZW5kX2luZGV4X2xldmVsIDwtIElYSUNbbnJvdyhJWElDKSwgNF0KYWRkX3JvdygiTmFzZGFxIENvbXBvc2l0ZSAoc3RvY2spIGluZGV4IGxldmVsOiIsIGMoc3RhcnRfaW5kZXhfbGV2ZWwsZW5kX2luZGV4X2xldmVsICkpCmdldFN5bWJvbHMoIkRQUklNRSIsIHNyYyA9ICJGUkVEIiwgZnJvbSA9IHN0YXJ0X2RhdGUsIHRvID0gZW5kX2RhdGUpCgojIEV4dHJhY3QgdGhlIGJlZ2lubmluZyBhbmQgZW5kIHByaW1lIHJhdGVzCnByaW1lX3JhdGVfc3RhcnQgPC0gRFBSSU1FWzEsIDFdCnByaW1lX3JhdGVfZW5kIDwtIERQUklNRVtucm93KERQUklNRSksIDFdCmFkZF9yb3coIlByaW1lIHJhdGU6IiwgYyhwcmltZV9yYXRlX3N0YXJ0LCBwcmltZV9yYXRlX2VuZCkpCmdldFN5bWJvbHMoIkZFREZVTkRTIiwgc3JjID0gIkZSRUQiLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKCiMgRXh0cmFjdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgZmVkZXJhbCBmdW5kcyByYXRlcwpmZWRfZnVuZHNfc3RhcnQgPC0gRkVERlVORFNbMSwgMV0KZmVkX2Z1bmRzX2VuZCA8LSBGRURGVU5EU1tucm93KEZFREZVTkRTKSwgMV0KYWRkX3JvdygiRmVkZXJhbCBmdW5kcyByYXRlOiIsIGMoZmVkX2Z1bmRzX3N0YXJ0LCBmZWRfZnVuZHNfZW5kKSkKCmdldFN5bWJvbHMoIkRUQjMiLCBzcmMgPSAiRlJFRCIsIGZyb20gPSBzdGFydF9kYXRlLCB0byA9IGVuZF9kYXRlKQoKYWRkX3JvdygiQ29tbWVyY2lhbCBwYXBlciByYXRlICg5MCBkYXlzKToiLCBjKE5BLCBOQSkpCgphZGRfcm93KCJDZXJ0aWZpY2F0ZSBvZiBkZXBvc2l0IHJhdGUgKDMtbW9udGgpOiIsIGMoTkEsIE5BKSkKCiMgRXh0cmFjdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgcmF0ZXMKdGJpbGxfcmF0ZV9zdGFydCA8LSBEVEIzWzEsIDFdCnRiaWxsX3JhdGVfZW5kIDwtIERUQjNbbnJvdyhEVEIzKSwgMV0KYWRkX3JvdygidHJlYXN1cnkgYmlsbCByYXRlICgxMyB3ZWVrcyk6IiwgYyh0YmlsbF9yYXRlX3N0YXJ0LCB0YmlsbF9yYXRlX2VuZCkpCgpnZXRTeW1ib2xzKCJEVEI2Iiwgc3JjID0gIkZSRUQiLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKCiMgRXh0cmFjdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgcmF0ZXMKdGJpbGw2X3JhdGVfc3RhcnQgPC0gRFRCNlsxLCAxXQp0YmlsbDZfcmF0ZV9lbmQgPC0gRFRCNltucm93KERUQjYpLCAxXQphZGRfcm93KCJUcmVhc3VyeSBiaWxsIHJhdGUgKDI2IHdlZWtzKToiLCBjKHRiaWxsNl9yYXRlX3N0YXJ0LCB0YmlsbDZfcmF0ZV9lbmQpKQoKCiMgR2V0IHRoZSAxMC15ZWFyIFRyZWFzdXJ5IEJvbmQgWWllbGQKZ2V0U3ltYm9scygiREdTMTAiLCBzcmMgPSAiRlJFRCIsIGZyb20gPSBzdGFydF9kYXRlLCB0byA9IGVuZF9kYXRlKQoKIyBFeHRyYWN0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCByYXRlcwpsb25nX3Rlcm1feWllbGRfc3RhcnQgPC0gREdTMTBbMSwgMV0KbG9uZ190ZXJtX3lpZWxkX2VuZCA8LSBER1MxMFtucm93KERHUzEwKSwgMV0KYWRkX3JvdygiVHJlYXN1cnkgbG9uZy10ZXJtIGJvbmQgeWllbGQ6IiwgYyhsb25nX3Rlcm1feWllbGRfc3RhcnQsIGxvbmdfdGVybV95aWVsZF9lbmQpKQoKI3dlIHdpbGwgdXNlIGEgcHJveHkgZm9yIGNvcnBvcmF0ZSAobWFzdGVyKSBib25kIHlpZWxkLCB0aGUgTW9vZHkncyBTZWFzb25lZCBBYWEgQ29ycG9yYXRlIEJvbmQgWWVpbGQKCiMgR2V0IHRoZSBNb29keSdzIFNlYXNvbmVkIEFhYSBDb3Jwb3JhdGUgQm9uZCBZaWVsZApnZXRTeW1ib2xzKCJBQUEiLCBzcmMgPSAiRlJFRCIsIGZyb20gPSBzdGFydF9kYXRlLCB0byA9IGVuZF9kYXRlKQoKIyBFeHRyYWN0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCByYXRlcwpjb3JwX2JvbmRfeWllbGRfc3RhcnQgPC0gQUFBWzEsIDFdCmNvcnBfYm9uZF95aWVsZF9lbmQgPC0gQUFBW25yb3coQUFBKSwgMV0KYWRkX3JvdygiQ29ycG9yYXRlIChNYXN0ZXIpIGJvbmQgeWllbGQ6IiwgYyhjb3JwX2JvbmRfeWllbGRfc3RhcnQsIGNvcnBfYm9uZF95aWVsZF9lbmQpKQoKYWRkX3JvdygiSGlnaC15aWVsZCBjb3Jwb3JhdGUgYm9uZCB5aWVsZDoiLCBjKE5BLCBOQSkpCgphZGRfcm93KCJUYXgtZXhlbXB0ICg34oCTMTIteWVhcikgYm9uZCB5aWVsZDoiLCBjKE5BLCBOQSkpCgpwcmludCh0YWJsZV9kYXRhKQpgYGAKCgpGaXJzdCBpIHdpbGwgY29tcGFyZSB0aGUgTG9uZG9uIFN0b2NrIEV4Y2hhbmdlIHdpdGggdGhlIE5BU0RBUQoKYGBge3J9CmxpYnJhcnkocXVhbnRtb2QpCmBgYApgYGB7cn0KZ2V0U3ltYm9scygiTkRBUSIsIHNyYyA9ICJ5YWhvbyIpCmBgYAoKCmBgYHtyfQpnZXRTeW1ib2xzKCJeRlRTRSIsIHNyYyA9ICJ5YWhvbyIpCmBgYApgYGB7cn0KRlRTRTwtIG5hLmFwcHJveChGVFNFKQpgYGAKYGBge3J9Ck5EQVEgPC0gc3Vic2V0KE5EQVEsIHN0YXJ0ID0gIjIwMjQtMDEtMDUiLCBlbmQgPSAiMjAyNC0zMC0wOSIpCkZUU0UgPC0gc3Vic2V0KEZUU0UsIHN0YXJ0ID0gIjIwMDgtMDEtMDUiLCBlbmQgPSAiMjAyNC0zMC0wOSIpCmBgYApgYGB7cn0KbmFzZGFxX3N0YXRzIDwtIGMoCiAgTWVhbiA9IG1lYW4oTkRBUSROREFRLkNsb3NlLCBuYS5ybT1UUlVFKSwKICBNZWRpYW4gPSBtZWRpYW4oTkRBUSROREFRLkNsb3NlLCBuYS5ybT1UUlVFKSwKU3REZXYgPSBzZChOREFRJE5EQVEuQ2xvc2UsIG5hLnJtPSBUUlVFKSkKYGBgCgpgYGB7cn0KbG9uZF9zdGF0cyA8LSBjKAogIE1lYW4gPSBtZWFuKEZUU0UkRlRTRS5DbG9zZSksCiAgTWVkaWFuID0gbWVkaWFuKEZUU0UkRlRTRS5DbG9zZSksCiAgU3REZXYgPSBzZChGVFNFJEZUU0UuQ2xvc2UpKQpgYGAKYGBge3J9CmFsaWduZWRfZGF0YSA8LSBtZXJnZShOREFRLCBGVFNFKQoKYGBgCgpgYGB7cn0KY2xlYW5lZF9kYXRhIDwtIG5hLm9taXQoYWxpZ25lZF9kYXRhKQpgYGAKYGBge3J9CmNvcnJlbGF0aW9uIDwtIGNvcihjbGVhbmVkX2RhdGFbLCAxXSwgY2xlYW5lZF9kYXRhWywgN10pCmBgYApgYGB7cn0KcHJpbnQoY29ycmVsYXRpb24pCmBgYApgYGB7cn0Kc3RhdHNfY29tcGFyaXNvbiA8LSByYmluZChuYXNkYXFfc3RhdHMsIGxvbmRfc3RhdHMpCmNvbG5hbWVzKHN0YXRzX2NvbXBhcmlzb24pIDwtIGMoIk1lYW4iLCAiTWVkaWFuIiwgIlN0YW5kYXJkIERldmlhdGlvbiIgKQoKcm91bmQoc3RhdHNfY29tcGFyaXNvbiwyKQpgYGAKYGBge3J9CnByaW50KHJvdW5kKGNvcnJlbGF0aW9uLDIpKQpgYGAKCkkgd2lsbCBub3cgY29tcGFyZSB0aGUgTG9uZG9uIFN0b2NrIEV4Y2hhbmdlIGluZGV4IGFuZCB0aGUgR2VybWFuIERBWCBpbmRleAoKYGBge3J9CiMgRG93bmxvYWQgaGlzdG9yaWNhbCBkYXRhIGZvciBOQVNEQVEgYW5kIFRlY2hEQVgKZ2V0U3ltYm9scygiTkRBUSIsIHNyYyA9ICJ5YWhvbyIpCmdldFN5bWJvbHMoIkRBWCIsIHNyYyA9ICJ5YWhvbyIpICAjIFRlY2hEQVggaXMgYSBjb21wb25lbnQgb2YgdGhlIERBWCBpbmRleAogCiMgRmlsbCBpbiBtaXNzaW5nIHZhbHVlcyB3aXRoIGFwcHJveGltYXRpb25zCkRBWCA8LSBuYS5hcHByb3goREFYKQogCiMgVHJpbSBkYXRhIHRvIGEgc3BlY2lmaWMgcGVyaW9kCk5EQVEgPC0gc3Vic2V0KE5EQVEsIHN0YXJ0ID0gIjIwMjQtMDUtMDEiLCBlbmQgPSAiMjAyNC0wOS0zMCIpCkRBWCA8LSBzdWJzZXQoREFYLCBzdGFydCA9ICIyMDI0LTA1LTAxIiwgZW5kID0gIjIwMjQtMDktMzAiKQogCiMgQ2FsY3VsYXRlIGJhc2ljIHN0YXRpc3RpY3MKbmFzZGFxX3N0YXRzIDwtIGMoCiAgTWVhbiA9IG1lYW4oTkRBUSROREFRLkNsb3NlLCBuYS5ybSA9IFRSVUUpLAogIE1lZGlhbiA9IG1lZGlhbihOREFRJE5EQVEuQ2xvc2UsIG5hLnJtID0gVFJVRSksCiAgU3REZXYgPSBzZChOREFRJE5EQVEuQ2xvc2UsIG5hLnJtID0gVFJVRSkKKQogCmRheF9zdGF0cyA8LSBjKAogIE1lYW4gPSBtZWFuKERBWCREQVguQ2xvc2UpLAogIE1lZGlhbiA9IG1lZGlhbihEQVgkREFYLkNsb3NlKSwKICBTdERldiA9IHNkKERBWCREQVguQ2xvc2UpCikKIAojIENvcnJlbGF0aW9uCmFsaWduZWRfZGF0YSA8LSBtZXJnZShOREFRLCBEQVgpCmNsZWFuZWRfZGF0YSA8LSBuYS5vbWl0KGFsaWduZWRfZGF0YSkKY29ycmVsYXRpb24gPC0gY29yKGNsZWFuZWRfZGF0YVssIDFdLCBjbGVhbmVkX2RhdGFbLCAyXSkKIAojIFByaW50IHN0YXRpc3RpY3MgYW5kIGNvcnJlbGF0aW9uCnN0YXRzX2NvbXBhcmlzb24gPC0gcmJpbmQobmFzZGFxX3N0YXRzLCBkYXhfc3RhdHMpCmNvbG5hbWVzKHN0YXRzX2NvbXBhcmlzb24pIDwtIGMoIk1lYW4iLCAiTWVkaWFuIiwgIlN0YW5kYXJkIERldmlhdGlvbiIpCnJvdW5kKHN0YXRzX2NvbXBhcmlzb24sIDIpCnByaW50KHJvdW5kKGNvcnJlbGF0aW9uLCAyKSkKIAojIFZpc3VhbGl6ZSB0aGUgY29tcGFyaXNvbgpsaWJyYXJ5KGdncGxvdDIpCmdncGxvdCgpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5EQVEsIGFlcyh4ID0gaW5kZXgoTkRBUSksIHkgPSBOREFRLkNsb3NlKSwgY29sb3IgPSAiYmx1ZSIpICsKICBnZW9tX2xpbmUoZGF0YSA9IERBWCwgYWVzKHggPSBpbmRleChEQVgpLCB5ID0gREFYLkNsb3NlKSwgY29sb3IgPSAicmVkIikgKwogIGxhYnModGl0bGUgPSAiTkFTREFRIHZzLiBEQVggKFRlY2hEQVgpIiwgeCA9ICJEYXRlIiwgeSA9ICJJbmRleCBWYWx1ZSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmx1ZSIgPSAiTkFTREFRIiwgInJlZCIgPSAiREFYIikpCmBgYAoKCkwuMwpgYGB7cn0KbGlicmFyeShxdWFudG1vZCkKCiMgRGVmaW5lIHRoZSBkYXRlIHJhbmdlCnN0YXJ0X2RhdGUgPC0gYXMuRGF0ZSgiMjAyNC0wNS0wMSIpCmVuZF9kYXRlIDwtIGFzLkRhdGUoIjIwMjQtMDktMzAiKQoKIyBHZXQgMTMtd2VlayBUcmVhc3VyeSBCaWxsIHJhdGVzCmdldFN5bWJvbHMoIl5JUlgiLCBzcmMgPSAieWFob28iLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKCiMgRXh0cmFjdCBpbml0aWFsIGFuZCBmaW5hbCByYXRlcwpzdGFydF9yYXRlIDwtIElSWFsxLDFdCmBgYAoKCmBgYHtyfQplbmRfcmF0ZSA8LSBJUlhbbnJvdyhJUlgpLDFdCgojIENhbGN1bGF0ZSBjaGFuZ2UgYW5kIHBlcmNlbnRhZ2UgY2hhbmdlCnJhdGVfY2hhbmdlIDwtIGVuZF9yYXRlIC0gc3RhcnRfcmF0ZQpwZXJjZW50YWdlX2NoYW5nZSA8LSAoZW5kX3JhdGUgLSBzdGFydF9yYXRlKSAvIHN0YXJ0X3JhdGUgKiAxMDAKCiMgUHJpbnQgdGhlIHJlc3VsdHMKY2F0KCIxMy13ZWVrIFRyZWFzdXJ5IEJpbGwgUmF0ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXJtOiIsIHN0YXJ0X3JhdGUsICJcbiIpCmNhdCgiMTMtd2VlayBUcmVhc3VyeSBCaWxsIFJhdGUgYXQgdGhlIGVuZCBvZiB0aGUgdGVybToiLCBlbmRfcmF0ZSwgIlxuIikKY2F0KCJDaGFuZ2UgaW4gcmF0ZToiLCByYXRlX2NoYW5nZSwgIlxuIikKY2F0KCJQZXJjZW50YWdlIGNoYW5nZToiLCBwZXJjZW50YWdlX2NoYW5nZSwgIiUiKQpgYGAKCgpgYGB7cn0KV2h5IGRpZCB0aGUgaW50ZXJlc3QgcmF0ZSBjaGFuZ2U/CgpNb25ldGFyeSBwb2xpY3kgb2YgdGhlIEZlZGVyYWwgUmVzZXJ2ZQpJbmZsYXRpb24gZXhwZWN0YXRpb25zCkRlbWFuZCBmb3Igc2FmZSBhc3NldHMKTGlxdWlkaXR5IGluIHRoZSBmaW5hbmNpYWwgc3lzdGVtCkV4cGVjdGF0aW9ucyBmb3IgdGhlIGZ1dHVyZSBpbnRlcmVzdCByYXRlcwpTdXBwbHkgYW5kIGRlbWFuZApJbnRlcm5hdGlvbmFsIGNhcGl0YWwgZmxvd3MKYGBgCgpMLjQKYGBge3J9CmxpYnJhcnkocXVhbnRtb2QpCmxpYnJhcnkoZ2dwbG90MikKCiMgU3BlY2lmeSB0aGUgZGF0ZSByYW5nZQpzdGFydF9kYXRlIDwtICIyMDE3LTEwLTIyIgplbmRfZGF0ZSA8LSAiMjAxNy0xMC0zMCIKCiMgR2V0IHRoZSBzdG9jayBkYXRhIGZvciBDb2NhLUNvbGEKZ2V0U3ltYm9scygiS08iLCBzcmMgPSAieWFob28iLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIERhdGUgYW5kIENsb3NpbmcgUHJpY2UKS09fZGYgPC0gZGF0YS5mcmFtZShEYXRlID0gaW5kZXgoS08pLCBQcmljZSA9IENsKEtPKSkKCiMgQ3JlYXRlIHRoZSBsaW5lIHBsb3QKZ2dwbG90KEtPX2RmLCBhZXMoeCA9IERhdGUsIHkgPSBDbChLTykpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnMoeCA9ICJEYXRlIiwgeSA9ICJTdG9jayBQcmljZSIsIHRpdGxlID0gIkNvY2EtQ29sYSBTdG9jayBQcmljZSAoMjItMzAgT2N0IDIwMTcpIikgKwogIHRoZW1lX2NsYXNzaWMoKSAgIyBPcHRpb25hbDogRm9yIGEgY2xlYW5lciBwbG90CmBgYAoKCmBgYHtyfQpsaWJyYXJ5KHF1YW50bW9kKQpsaWJyYXJ5KGdncGxvdDIpCgojIFNwZWNpZnkgdGhlIGRhdGUgcmFuZ2UgZm9yIE9jdG9iZXIgMjAxNwpzdGFydF9kYXRlIDwtICIyMDE3LTEwLTE1IgplbmRfZGF0ZSA8LSAiMjAxNy0xMS0xNSIKCiMgR2V0IHRoZSBzdG9jayBkYXRhIGZvciBDb2NhLUNvbGEKZ2V0U3ltYm9scygiS08iLCBzcmMgPSAieWFob28iLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIERhdGUgYW5kIENsb3NpbmcgUHJpY2UKS09fZGYgPC0gZGF0YS5mcmFtZShEYXRlID0gaW5kZXgoS08pLCBQcmljZSA9IENsKEtPKSkKCiMgQ3JlYXRlIHRoZSBsaW5lIHBsb3QKZ2dwbG90KEtPX2RmLCBhZXMoeCA9IERhdGUsIHkgPSBDbChLTykpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnMoeCA9ICJEYXRlIiwgeSA9ICJTdG9jayBQcmljZSIsIHRpdGxlID0gIkNvY2EtQ29sYSBTdG9jayBQcmljZSAoT2N0b2JlciAyMDE3KSIpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCmBgYHtyfQpsaWJyYXJ5KHF1YW50bW9kKQpsaWJyYXJ5KGdncGxvdDIpCgojIFNwZWNpZnkgdGhlIGRhdGUgcmFuZ2UgZm9yIE9jdG9iZXIgMjAxNwpzdGFydF9kYXRlIDwtICIyMDE3LTA0LTE1IgplbmRfZGF0ZSA8LSAiMjAxNy0xMS0xNSIKCiMgR2V0IHRoZSBzdG9jayBkYXRhIGZvciBDb2NhLUNvbGEKZ2V0U3ltYm9scygiS08iLCBzcmMgPSAieWFob28iLCBmcm9tID0gc3RhcnRfZGF0ZSwgdG8gPSBlbmRfZGF0ZSkKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIERhdGUgYW5kIENsb3NpbmcgUHJpY2UKS09fZGYgPC0gZGF0YS5mcmFtZShEYXRlID0gaW5kZXgoS08pLCBQcmljZSA9IENsKEtPKSkKCiMgQ3JlYXRlIHRoZSBsaW5lIHBsb3QKZ2dwbG90KEtPX2RmLCBhZXMoeCA9IERhdGUsIHkgPSBDbChLTykpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnMoeCA9ICJEYXRlIiwgeSA9ICJTdG9jayBQcmljZSIsIHRpdGxlID0gIkNvY2EtQ29sYSBTdG9jayBQcmljZSAoT2N0b2JlciAyMDE3KSIpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCk9uIE9jdG9iZXIgMjYgMjAxNyBDb2NhLUNvbGEgcmVsZWFzZWQgaXRzIHRoaXJkLXF1YXJ0ZXIgZWFybmluZ3MgZm9yIDIwMTcuIEFzIHdlIGFuYWxpemUgdGhlIHN0b2NrIHByaWNlIG9mIGNvY2EgY29sYSBjb21wYW55IGluIHRpbWUgd2Ugb2JzZXJ2ZSB0aGF0IGluIHRoZSBwZXJpb2Qgb2YgYSBtb250aCBiZWZvcmUgdGhlIDI2dGggb2Ygb2N0b2JlciB0aGVyZSBpcyBhIGRvd250cmVuZCBidXQgb24gdGhlIDI2dGggb2Ygb2N0b2JlciB0aGUgcHJpY2UgaW5jcmVhc2VkIGZvciBvbmUgZGF5IGFuZCB0aGVuIGNvbnRpbnVlZCBkcm9wcGluZyBpbnRpbGwgdGhlIGJlZ2luaW5nIG9mIE5vdmVtYmVyIHdoZXJlIGl0IHN0YXJ0ZWQgZ29pbmcgdXAgYWdhaW4uIFRoZSBleHBsYW5hdGlvbiBjb3VsZCBiZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiBjb21taW5nIGZyb20gdGhlIHF1YXJ0ZXJseSByZXBvcnQgaW5mbHVlbmNlZCBhIGJldHRlciBpbmZvcm1lZCBwYXJ0IG9mIHRoZSBtYXJrZXQgaW1taWRpYXRlbHkgb24gdGhlIDI2dGggb2Ygb2N0b2JlciBhbmQgdGhlIHJlc3Qgb2YgdGhlIG1hcmtldCBsYXRlciBpbiB0aGUgYmVnaW5pbmcgb2YgTm92ZW1iZXIuCgpMLjUKCkZvciBvdXIgdGFzayB3ZSBjaG9zZSB0aGUgQmFuayBvZiBBbWVyaWNhCgpMNS4xIElkZW50aWZ5IHRoZSB0eXBlcyBvZiBkZXBvc2l0cyB0aGF0IHRoZSBjb21tZXJjaWFsIGJhbmsgdXNlcyB0byBvYnRhaW4gbW9zdCBvZiBpdHMgZnVuZHMuCkJhbmsgb2YgQW1lcmljYSByYWlzZXMgdGhlIG1ham9yaXR5IG9mIGl0cyBmdW5kcyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgZGVwb3NpdHM6Ci0gRGVtYW5kIGRlcG9zaXRzOiBjaGVja2luZyBhY2NvdW50cyB0aGF0IGFsbG93IGN1c3RvbWVycyB0byBhY2Nlc3MgdGhlaXIgbW9uZXkgYXQgYW55IHRpbWUuCi0gVGltZSBkZXBvc2l0czogVGltZSBkZXBvc2l0IGFjY291bnRzIGluIHdoaWNoIGN1c3RvbWVycyBpbnZlc3QgdGhlaXIgbW9uZXkgZm9yIGEgc3BlY2lmaWMgcGVyaW9kIG9mIHRpbWUuCi0gU2F2aW5ncyBkZXBvc2l0czogU2F2aW5ncyBhY2NvdW50cyB0aGF0IGFyZSBpbnRlbmRlZCBmb3Igc2F2aW5nIGFuZCBvZmZlciBoaWdoZXIgaW50ZXJlc3QgcmF0ZXMuCiAKTDUuMiBJZGVudGlmeSB0aGUgbWFpbiB1c2VzIG9mIGZ1bmRzIGJ5IHRoZSBiYW5rLiBjLiBTdW1tYXJpemUgYW55IHN0YXRlbWVudHMgbWFkZSBieSB0aGUgY29tbWVyY2lhbCBiYW5rIGluIGl0cyBhbm51YWwgcmVwb3J0IGFib3V0IGhvdyByZWNlbnQgb3IgcG90ZW50aWFsIHJlZ3VsYXRpb25zIHdpbGwgYWZmZWN0IGl0cyBwZXJmb3JtYW5jZS4KVGhlIHByaW1hcnkgdXNlcyBvZiBCYW5rIG9mIEFtZXJpY2EncyBmdW5kcyBpbmNsdWRlOgotIExlbmRpbmc6IHByb3ZpZGluZyBsb2FucyB0byBpbmRpdmlkdWFscyBhbmQgYnVzaW5lc3Nlcy4KLSBJbnZlc3RtZW50IGJhbmtpbmc6IHByb3ZpZGluZyBjb3Jwb3JhdGUgZmluYW5jZSBhbmQgY2FwaXRhbCBtYXJrZXRzIHRyYW5zYWN0aW9uIHNlcnZpY2VzLgotIEFzc2V0IG1hbmFnZW1lbnQ6IG1hbmFnaW5nIGFzc2V0cyBmb3IgcHJpdmF0ZSBjbGllbnRzIGFuZCBpbnN0aXR1dGlvbnMuCiAKSW1wYWN0IG9mIHJlZ3VsYXRpb25zCkluIGl0cyBhbm51YWwgcmVwb3J0LCBCYW5rIG9mIEFtZXJpY2EgZW1waGFzaXNlcyB0aGF0IGN1cnJlbnQgYW5kIHBvdGVudGlhbCByZWd1bGF0b3J5IHJlcXVpcmVtZW50cyBjYW4gYWZmZWN0IGl0cyBwZXJmb3JtYW5jZS4gSW4gcGFydGljdWxhciwgcmVmZXJlbmNlIGlzIG1hZGUgdG8gY2FwaXRhbCByZXF1aXJlbWVudHMgYW5kIGxpcXVpZGl0eSByZXF1aXJlbWVudHMsIHdoaWNoIGNvdWxkIHJlc3RyaWN0IHRoZSBhYmlsaXR5IHRvIGdyYW50IGxvYW5zLgoKTDUuMyBEb2VzIGl0IGFwcGVhciB0aGF0IHRoZSBiYW5rIGlzIGF0dGVtcHRpbmcgdG8gZW50ZXIgdGhlIHNlY3VyaXRpZXMgaW5kdXN0cnkgYnkgb2ZmZXJpbmcgc2VjdXJpdGllcyBzZXJ2aWNlcz8gSWYgc28sIGV4cGxhaW4gaG93LgpZZXMsIGl0IGFwcGVhcnMgdGhhdCBCYW5rIG9mIEFtZXJpY2EgaXMgYXR0ZW1wdGluZyB0byBlbnRlciB0aGUgc2VjdXJpdGllcyBpbmR1c3RyeS4gVGhpcyBpcyBiZWluZyBkb25lIGJ5OgotIE9mZmVyaW5nIHNlY3VyaXRpZXMgc2VydmljZXM6IFRoZSBiYW5rIG9mZmVycyB0cmFkaW5nIHNlcnZpY2VzIGZvciBzdG9ja3MgYW5kIGJvbmRzIGFuZCBoYXMgYSBzdHJvbmcgaW52ZXN0bWVudCBiYW5raW5nIHNlZ21lbnQgdGhhdCBmb2N1c2VzIG9uIGNhcGl0YWwgbWFya2V0IHRyYW5zYWN0aW9ucy4KIApMNS40IERvZXMgaXQgYXBwZWFyIHRoYXQgdGhlIGJhbmsgaXMgYXR0ZW1wdGluZyB0byBlbnRlciB0aGUgaW5zdXJhbmNlIGluZHVzdHJ5IGJ5IG9mZmVyaW5nIGluc3VyYW5jZSBzZXJ2aWNlcz8gSWYgc28sIGV4cGxhaW4gaG93LgpZZXMsIHRoZXJlIGFyZSBzaWducyB0aGF0IEJhbmsgb2YgQW1lcmljYSBpcyBlbnRlcmluZyB0aGUgaW5zdXJhbmNlIHNlY3Rvci4gVGhpcyBpcyBldmlkZW5jZWQgYnk6Ci0gT2ZmZXJpbmcgaW5zdXJhbmNlIHByb2R1Y3RzOiBUaGUgYmFuayBvZmZlcnMgdmFyaW91cyBpbnN1cmFuY2Ugc2VydmljZXMgdG8gcHJvdmlkZSBjb21wcmVoZW5zaXZlIGZpbmFuY2lhbCBzb2x1dGlvbnMgdG8gaXRzIGN1c3RvbWVycy4KCkw1LjYKVG8gZGV0ZXJtaW5lIEJhbmsgb2YgQW1lcmljYSdzIGludGVyZXN0IGluY29tZSBhcyBhIHBlcmNlbnRhZ2Ugb2YgaXRzIHRvdGFsIGFzc2V0cywgd2UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGRhdGEgZnJvbSB0aGVpciBmaW5hbmNpYWwgc3RhdGVtZW50czoKCgpMNS43CiAgICBJbnRlcmVzdCBleHBlbnNlczogRm9yIHRoZSB5ZWFyIGVuZGluZyBEZWNlbWJlciAzMSwgMjAyMywgQmFuayBvZiBBbWVyaWNhIHJlcG9ydGVkIGludGVyZXN0IGluY29tZSBvZiAkOTgsNTgxIG1pbGxpb24gCiAgICBUb3RhbCBBc3NldHM6IEFzIG9mIERlY2VtYmVyIDMxLCAyMDIzLCB0aGUgdG90YWwgYXNzZXRzIGZvciBCYW5rIG9mIEFtZXJpY2Egd2VyZSByZXBvcnRlZCBhcyAkMywxODAsMTUxIG1pbGxpb24KCldlIGNhbiBub3cgZGl2aWRlIHRoZSB0b3RhbCBpbnRlcmVzdCBpbmNvbWUgYnkgdGhlIHRvdGFsIGFzc2V0cyB0byBnZXQgYSBwZXJjZW50YWdlIHJhdGU6CgoKYGBge3J9Cjk4NTgxLzMxODAxNTEgCmBgYAoKVGhlIGJhbmsncyBpbnRlcmVzdCBleHBlbnNlcyB3ZXJlIDMsMTAlIG9mIHRoZSB0b3RhbCBhc3NldHMgb2YgdGhlIEJhbmsgb2YgQW1lcmljYQoKCkw1LjggRGV0ZXJtaW5lIHRoZSBiYW5r4oCZcyBuZXQgaW50ZXJlc3QgbWFyZ2luLgpOSU0gPSAyLjA3JSAoUC4gODQgLyBQLiA4NikgCgoKTDUuOQoKVGhlIG5vbmludGVyZXN0IGluY29tZTogRm9yIHRoZSB5ZWFyIGVuZGluZyBEZWNlbWJlciAzMSwgMjAyMywgQmFuayBvZiBBbWVyaWNhIHJlcG9ydGVkIGEgbm9uaW50ZXJlc3QgaW5jb21lIG9mICQ0MSw2NTAgbWlsbGlvbgpOb3cgd2Ugd2lsbCBkaXZpZGUgdGhpcyBieSB0aGUgdG90YWwgYXNzZXRzIHRvIGdldCBhIHBlcmNlbnRhZ2UgcmF0ZQoKYGBge3J9CjQxNjUwLzMxODAxNTEgCmBgYAoKVGhlIGJhbmsncyBub25pbnRlcmVzdCBpbmNvbWUgcmF0ZSB3YXMgMSwzMSUgb2YgdGhlIHRvdGFsIGFzc2V0cwoKTm9uIEludGVyZXN0IGV4cGVuc2VzIHBlcmNlbnRhZ2UgPSAyLjA5JSAoUC44MSkKCkw1LjEwCgpGb3IgdGhlIHllYXIgZW5kaW5nIERlY2VtYmVyIDMxLCAyMDIzLCBCYW5rIG9mIEFtZXJpY2EgcmVwb3J0ZWQgYSBsb2FuIGxvc3MgcmVzZXJ2ZSBvZiAkMTMsMjg3IG1pbGxpb24KV2Ugd2lsbCBub3cgZGl2aWRlIGl0IGJ5IHRoZSBhbW91bnQgb2YgdG90YWwgYXNzZXRzIHRvIGdldCBhIHBlcmNlbnRhZ2UgcmF0ZQpgYGB7cn0KMTMyODcvMzE4MDE1MQpgYGAKClRoZSBsb2FucyBhbmQgbG9zcyByZXNlcnZlIHJhdGUgd2FzIDAsNDIlIG9mIHRoZSB0b3RhbCBhc3NldHMKCgpMNS4xMQpUbyBmaW5kIG91dCBhYm91dCB0aGUgcmV0dXJuIG9uIGFzc2V0cyB3ZSBzaG91bGQgZmluZCBvdXQgYWJvdXQgdGhlIHRvdGFsIGluY29tZSBvZiB0aGUgYmFuayBhbmQgdGhlbiBkaXZpZGUgaXQgYnkgdGhlIHZhbHVlIG9mIHRvdGFsIGFzc2V0cy4KRm9yIHRoZSB5ZWFyIGVuZGluZyBEZWNlbWJlciAzMSwgMjAyMywgQmFuayBvZiBBbWVyaWNhIHJlcG9ydGVkIGEgbmV0IGluY29tZSBvZiAkMjYsNTE1IG1pbGxpb24KV2Ugd2lsbCBub3cgZGl2aWRlIHRoaXMgdmFsdWUgYnkgdGhlIHRvdGFsIGFzc2V0cyB0byBnZXQgYSBwZXJjZW50YWdlIHJhdGUKYGBge3J9CjI2NTE1LzMxODAxNTEKYGBgCgpUaGUgQmFuayBvZiBBbWVyaWNhJ3MgcmV0dXJuIG9uIGFzc2V0cyB3YXMgMCw4MyUgb2YgdGhlIHRvdGFsIGFzc2V0cwoKCkw1LjEyClRvIGZpbmQgb3V0IGFib3V0IHRoZSByZXR1cm4gb24gYXNzZXRzIHdlIHNob3VsZCBmaW5kIG91dCBhYm91dCB0aGUgdG90YWwgaW5jb21lIG9mIHRoZSBiYW5rIGFuZCB0aGVuIGRpdmlkZSBpdCBieSB0aGUgdmFsdWUgb2YgdG90YWwgc2hhcmVob2xkZXJzIGVxdWl0eS4KQXMgd2UgYWxyZWFkeSBoYXZlIHRoZSB2YWx1ZSBvZiB0aGUgbmV0IGluY29tZSB3ZSB3aWxsIG5vdyBmaW5kIHRoZSBkYXRhIGFib3V0IHRoZSB0b3RhbCBzaGFyZWhvbGRlcnMgZXF1aXR5LiBGb3IgdGhlIHllYXIgZW5kaW5nIERlY2VtYmVyIDMxLCAyMDIzLCBCYW5rIG9mIEFtZXJpY2EgcmVwb3J0ZWQgYSB0b3RhbCBzaGFyZWhvbGRlcnMgZXF1aXR5IG9mICQyOTEsNjQ2IG1pbGxpb24uCldlIHdpbGwgbm93IGRpdmlkZSB0aGUgbmV0IGluY29tZSBieSB0aGUgdG90YWwgc2hhcmVob2xkZXJzIGVxdWl0eS4KYGBge3J9CjI2NTE1LzI5MTY0NgpgYGAKVGhlIEJhbmsgb2YgQW1lcmljYSdzIHJldHVybiBvbiBlcXVpdHkgcmF0ZSB3YXMgOSwwOSUuCgpMNS4xMwoKSW5jb21lIFN0YXRlbWVudCBJdGVtcyBBZmZlY3RlZAoKCjEuIG5ldCBpbnRlcmVzdCBpbmNvbWUgKGludGVyZXN0IGluY29tZSk6CiAgIC0gMjAyMzogJDU2LDkzMSBtaWxsaW9uCiAgIC0gSW1wYWN0OiBBbiBpbmNyZWFzZSBpbiBpbnRlcmVzdCByYXRlcyB3aWxsIGluY3JlYXNlIGludGVyZXN0IGluY29tZSBhcyB0aGUgYmFuayBiZW5lZml0cyBmcm9tIGhpZ2hlciBpbmNvbWUgZnJvbSB2YXJpYWJsZSByYXRlIGxvYW5zIGFuZCBuZXcgbG9hbnMuIEludGVyZXN0IGV4cGVuc2VzIGNvdWxkIGFsc28gaW5jcmVhc2UsIGJ1dCBhcyBuZXQgaW50ZXJlc3QgaW5jb21lIGlzIGhpZ2hlciB0aGFuIGludGVyZXN0IGV4cGVuc2VzLCBvdmVyYWxsIG5ldCBpbnRlcmVzdCBpbmNvbWUgaXMgZXhwZWN0ZWQgdG8gZ3Jvdy4KCgoyLiBwcm92aXNpb24gZm9yIGNyZWRpdCBsb3NzZXMgKGxvYW4gbG9zcyBwcm92aXNpb25zKToKICAgLSAyMDIzOiBVU0QgNC4zOTQgbWlsbGlvbgogICAtIEltcGFjdDogSGlnaGVyIGludGVyZXN0IHJhdGVzIGNvdWxkIGluY3JlYXNlIHRoZSByaXNrIG9mIGRlZmF1bHQgYXMgYm9ycm93ZXJzIG1heSBoYXZlIGRpZmZpY3VsdHkgc2VydmljaW5nIHRoZWlyIGRlYnRzLiBUaGlzIGNvdWxkIGxlYWQgdG8gaGlnaGVyIGxvYW4gbG9zcyBwcm92aXNpb25zLgoKCjMuIG5vbi1pbnRlcmVzdCBpbmNvbWUgKG5vbi1pbnRlcmVzdCBpbmNvbWUpOgogICAtIDIwMjM6IFVTRCA0MS42NTAgbWlsbGlvbgogICAtIEltcGFjdDogRmVlIGluY29tZSBjb3VsZCBpbmNyZWFzZSBhcyBjbGllbnRzIGluY3JlYXNpbmdseSBzZWVrIGZpbmFuY2lhbCBwcm9kdWN0cyB0byBkZWFsIHdpdGggcmlzaW5nIGludGVyZXN0IHJhdGVzLiBBdCB0aGUgc2FtZSB0aW1lLCBtYXJrZXQgdm9sYXRpbGl0eSBjb3VsZCBuZWdhdGl2ZWx5IGltcGFjdCB0cmFkaW5nIHByb2ZpdHMuCgoKU3VtbWFyeSBvZiB0aGUgaW1wYWN0CgoKQW4gaW5jcmVhc2UgaW4gaW50ZXJlc3QgcmF0ZXMgd291bGQgbGlrZWx5IGxlYWQgdG8gYW4gaW5jcmVhc2UgaW4gbmV0IGludGVyZXN0IGluY29tZSBhcyBpbnRlcmVzdCBpbmNvbWUgZXhjZWVkcyBpbnRlcmVzdCBleHBlbnNlcy4gQXQgdGhlIHNhbWUgdGltZSwgdGhlIGNvbW1pc3Npb24gZm9yIGNyZWRpdCBsb3NzZXMgY291bGQgaW5jcmVhc2UsIHdoaWNoIGFmZmVjdHMgdGhlIGRlZmF1bHQgcmlzayBmb3IgYm9ycm93ZXJzLiBOb24taW50ZXJlc3QgaW5jb21lIGNvdWxkIGJlIGFmZmVjdGVkIGJvdGggcG9zaXRpdmVseSBhbmQgbmVnYXRpdmVseSwgZGVwZW5kaW5nIG9uIGRldmVsb3BtZW50cyBpbiBmZWUgaW5jb21lIGFuZCB0cmFkaW5nIHByb2ZpdHMuIE92ZXJhbGwsIHRoZSBiYW5rIGNvdWxkIGJlbmVmaXQgZnJvbSB0aGUgaW50ZXJlc3QgcmF0ZSBpbmNyZWFzZXMgYXMgbG9uZyBhcyB0aGUgaW5jb21lIG91dHdlaWdocyB0aGUgcmlzayBvZiBjcmVkaXQgbG9zc2VzLgoKVGhpcyBhbmFseXNpcyBwcm92aWRlcyBhIHNwZWNpZmljIG92ZXJ2aWV3IG9mIHRoZSBwb3RlbnRpYWwgZmluYW5jaWFsIGltcGFjdCBvbiBCYW5rIG9mIEFtZXJpY2EgaW4gdGhlIGNvbnRleHQgb2YgcmlzaW5nIGludGVyZXN0IHJhdGVzLgoKCkw1LjE0CgpJbmNvbWUgU3RhdGVtZW50IEl0ZW1zIEFmZmVjdGVkCk5ldCBpbnRlcmVzdCBpbmNvbWU6IEluIGEgc2l0dWF0aW9uIG9mIGNyaXNpcyB0aGUgbmV0IGludGVyZXN0IGluY29tZSBtaWdodCByZWdpc3RlciBhIGRyb3AuIFVzdWFsbHkgd2hlbiB0aGUgZWNvbm9taWMgY29uZGl0aW9ucyBkZXRlcmlvcmF0ZSwgaW5kaXZpZHVhbHMgYW5kIGJ1c2luZXNzZXMgYXJlIGxlc3MgbGlrZWx5IHRvIHRha2UgY3JlZGl0cyBiZWNhdXNlIHRoZSBiYW5rIGhhcyBubyBndWFyYW50ZWUgdGhleSB3aWxsIGJlIGFibGUgdG8gcGF5IHRoZW0gYmFjay4gQXMgYSByZXN1bHQgdGhlIGRlbWFuZCBmYWxscyBhbmQgdGhlIGludGVyZXN0IGluY29tZSBiZWNvbWVzIGxvd2VyLlRoZXJlIG1pZ2h0IGFsc28gYmUgYSByZWFjdGlvbiBvZiB0aGUgRmVkZXJhbCBSZXNlcnZlIHdoaWNoIGNvdWxkIGxvd2VyIHRoZSByYXRlIHdoaWNoIHdvdWxkIGJlIGEgcmVhc29uIGZvciBhIGxvd2VyIGludGVyZXN0IGluY29tZSBmcm9tIGV4aXN0aW5nIGxvYW5zLgoKClByb3Zpc2lvbiBmb3IgTG9hbiBMb3NzZXM6IER1cmluZyBhbiBlY29ub21pYyBjb25kaXRpb24gZGV0ZXJpb3JhdGlvbiBiYW5r4oCZcyBtaWdodCBhbnRpY2lwYXRlIGEgaGlnaGVyIGRlZmF1bHQgcmF0ZSBvbiBjcmVkaXRzLiBUaGF0IG1pZ2h0IHJlc3VsdCBpbiBhbiBpbmNyZWFzZSBvZiB0aGUgcHJvdmlzaW9uIGZvciBsb2FuIGxvc3NlcyBzaW5jZSB0aGUgZXhwZWN0ZWQgZGVmYXVsdGVkIGxvYW5zIHJhdGUgcmlzZXMsIHNvIHRvIGNvdmVyIHRoZSBwb3RlbnRpYWwgbG9zc2VzIHRoZSBiYW5rIGNvdWxkIHB1dCBtb3JlIGZ1bmRzIGludG8gdGhpcyBpdGVtLgoKCk5vbi1pbnRlcmVzdCBpbmNvbWU6IER1cmluZyBhbiBlY29ub21pYyBjb25kaXRpb24gZGV0ZXJpb3JhdGlvbiBiYW5r4oCZcyBtaWdodCBleHBlcmllbmNlIGEgZHJvcCBvZiBmZWUtZ2VuZXJhdGluZyBhY3Rpdml0aWVzIHN1Y2ggYXMgYXNzZXQgbWFuYWdlbWVudCBvciBpbnZlc3RtZW50IGJhbmtpbmcuIFRoYXQgY291bGQgbGVhZCB0byBhIGRlY3JlYXNlIG9mIHRoZSBub24taW50ZXJlc3QgaW5jb21lLgoKCk5ldCBpbnRlcmVzdCBtYXJnaW46IER1cmluZyBhbiBlY29ub21pYyBjb25kaXRpb24gZGV0ZXJpb3JhdGlvbiBiYW5r4oCZcyBtaWdodCBsb3dlciB0aGUgaW50ZXJlc3QgcmF0ZSB0byBzdGltdWxhdGUgYm9ycm93aW5nLCB0aGF0IHdvdWxkIGxlYWQgdG8gYSBkcm9wIGluIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGludGVyZXN0IG9mIGxvYW5zIGFuZCB0aGUgaW50ZXJlc3Qgb2YgZGVwb3NpdHMgd2hpY2ggd291bGQgbGVhZCB0byBhIGRyb3Agb2YgdGhlIG5ldCBpbnRlcmVzdCBtYXJnaW4uCgoKTmV0IGluY29tZTogQXMgd2UgdGFrZSB0aGUgc2l0dWF0aW9uIG9mIGFsbCB0aGUgaXRlbXMgd2UgYW5hbHl6ZWQgYWJvdmUgd2Ugc2VlIHRoYXQgYXMgdGhlIG5ldCBpbnRlcmVzdCBpbmNvbWUgY291bGQgZHJvcCB0aGUgcHJvdmlzaW9uIG9uIGxvYW4gbG9zc2VzIGNvdWxkIHJpc2UgYW5kIHRoZSBuZXQgaW50ZXJlc3QgbWFyZ2luIGNvdWxkIGRyb3AgdGhlIHNpdHVhdGlvbiBvZiB0aGUgbmV0IGluY29tZSBjb3VsZCBhbHNvIGJlIGEgZGVjcmVhc2UgaW4gb3ZlcmFsbC4KCgpMNS4xNQoKVGhlIGZ1bmQncyBvYmplY3RpdmUgaXMgdG8gaW52ZXN0IGF0IGxlYXN0IDk5LjUlIG9mIGl0cyB0b3RhbCBhc3NldHMgaW4gY2FzaCwgVS5TLiBUcmVhc3VyeSBiaWxscywgbm90ZXMgYW5kIG90aGVyIGRpcmVjdCBvYmxpZ2F0aW9ucyBvZiB0aGUgVS5TIFRyZWFzdXJ5LCBhbmQgcmVwdXJjaGFzZSBhZ3JlZW1lbnRzIHNlY3VyZWQgYnkgc3VjaCBvYmxpZ2F0aW9ucyBvciBjYXNoLiBUaGUgRnVuZCBpbnZlc3RzIGluIHNlY3VyaXRpZXMgbWF0dXJpbmcgaW4gMzk3IGRheXMgb3IgbGVzcyAod2l0aCBjZXJ0YWluIGV4Y2VwdGlvbnMpIGFuZCB0aGUgcG9ydGZvbGlvIHdpbGwgaGF2ZSBhIGRvbGxhci13ZWlnaHRlZCBhdmVyYWdlIG1hdHVyaXR5IG9mIDYwIGRheXMgb3IgbGVzcyBhbmQgYSBkb2xsYXItd2VpZ2h0ZWQgYXZlcmFnZSBsaWZlIG9mIDEyMCBkYXlzIG9yIGxlc3MuIEluIGFkZGl0aW9uLCB0aGUgRnVuZCBtYXkgaW52ZXN0IGluIHZhcmlhYmxlIGFuZCBmbG9hdGluZyByYXRlIGluc3RydW1lbnRzIGFuZCB0cmFuc2FjdCBpbiBzZWN1cml0aWVzIG9uIGEgd2hlbi1pc3N1ZWQsIGRlbGF5ZWQgZGVsaXZlcnkgb3IgZm9yd2FyZCBjb21taXRtZW50IGJhc2lzLgpXZSBjb25zaWRlciB0aGlzIG11dHVhbCBmdW5kIHRvIGhhdmUgYSBsb3cgcmlzayBzaW5jZSBpdCBpbnZlc3RzIG1vc3RseSBpbiBsb3cgcmlzayBpbnN0cnVtZW50cyBzdWNoIGFzIHRyZWFzdXJ5IGJpbGxzLgoKTDUuMTYKClRoZSByZXR1cm4gb2YgdGhlIG11dHVhbCBmdW5kIGZvciBsYXN0IHllYXIgd2FzIDUuMDglClRoZSBhdmVyYWdlIGFubnVhbCByZXR1cm4gb3ZlciB0aGUgbGFzdCB0aHJlZSB5ZWFycyB3YXMgMi4yMiUKCkw1LjE3CgpBcyB0aGUgZnVuZCBpbnZlc3RzIG1vc3Qgb2YgaXRzIGFzc2V0cyBpbiB0cmVhc3VyeSBiaWxscyBhbmQgb2JsaWdhdGlvbnMgaXQgd2lsbCBiZSBtb3N0bHkgYWZmZWN0ZWQgYnkgdGhlIFUuUy4gaW50ZXJlc3QgcmF0ZXMuCgpMNS4xOAoKV2hlbiBidXlpbmcgd2UgcGF5IDAuMTAlIG9mIGEgbWFuYWdlbWVudCBmZWUgYW5kIDAuMDclIG9mIGFuIGFkbWluaXN0cmF0aW9uIGZlZSwgYXMgYSBzdW0gd2UgcGF5IGEgMC4xNyUgZmVlLgoKTDUuMTkKClRoZSBleHBlbnNlIHJhdGlvIGZvciB0aGlzIG11dHVhbCBmdW5kIG92ZXIgdGhlIGxhc3QgeWVhciB3YXMgMC4wMiUuIFRoaXMgYW1vdW50IHNlZW1zIHF1aXRlIGxvdyBpbiBjb21wYXJpc29uIHdpdGggb3RoZXIgZnVuZHMgdGhhdCBzb21ldGltZXMgaGF2ZSBhbiBleHBlbnNlIHJhdGlvIG9mIG92ZXIgMSUuIFRoaXMgbGV2ZWwgb2YgZXhwZW5zZSByYXRpbyBnaXZlcyBhIHBvc3NpYmlsaXR5IHRvIHRyYW5zZmVyIG1vcmUgb2YgdGhlIGludGVyZXN0IHRvIHRoZSBpbnZlc3RvcnMuCgpTZWN1cml0aWVzIGZpcm1zCkZvciB0aGUgc2VjdXJpdGllcyBmaXJtIHRoYXQgeW91IHNlbGVjdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlcm0sIHVzZSBpdHMgYW5udWFsIHJlcG9ydCBvciBhbnkgb3RoZXIgcmVsYXRlZCBpbmZvcm1hdGlvbiB0byBhbnN3ZXIgdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMuCgoKTDUuMjAgV2hhdCBhcmUgdGhlIG1haW4gdHlwZXMgb2YgYnVzaW5lc3MgY29uZHVjdGVkIGJ5IHRoZSBzZWN1cml0aWVzIGZpcm0/ClRoZSBjb3Jwb3JhdGUgcHVycG9zZSBvZiBQcm9zZWd1ciBDYXNoIGlzIHRvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBzZXJ2aWNlcyB0aHJvdWdoIGNvbXBhbmllcyBmb2N1c2luZyBvbiB0aGUgQ2FzaCBidXNpbmVzczogKGkpIG5hdGlvbmFsIGFuZCBpbnRlcm5hdGlvbmFsIHRyYW5zcG9ydCBzZXJ2aWNlcyAoYnkgbGFuZCwgc2VhIGFuZCBhaXIpIG9mIGZ1bmRzIGFuZCBvdGhlciB2YWx1YWJsZXMgKGluY2x1ZGluZyBqZXdlbGxlcnksIGFydHdvcmtzLCBwcmVjaW91cyBtZXRhbHMsIGVsZWN0cm9uaWMgZGV2aWNlcywgdm90aW5nIGJhbGxvdHMsIGxlZ2FsIGV2aWRlbmNlKSwgaW5jbHVkaW5nIGNvbGxlY3Rpb24sIHRyYW5zcG9ydCwgY3VzdG9keSBhbmQgZGVwb3NpdCBzZXJ2aWNlczsgKGlpKSBwcm9jZXNzaW5nIGFuZCBhdXRvbWF0aW9uIG9mIGNhc2ggKGluY2x1ZGluZyBjb3VudGluZywgcHJvY2Vzc2luZyBhbmQgcGFja2FnaW5nLCBhcyB3ZWxsIGFzIGNvaW4gcmVjeWNsaW5nLCBjYXNoIGZsb3cgY29udHJvbCBhbmQgbW9uaXRvcmluZyBzeXN0ZW1zKTsgKGlpaSkgY29tcHJlaGVuc2l2ZSBBVE0gc29sdXRpb25zIChpbmNsdWRpbmcgcGxhbm5pbmcsIGxvYWRpbmcsIG1vbml0b3JpbmcsIGZpcnN0LSBhbmQgc2Vjb25kLXRpZXIgbWFpbnRlbmFuY2UgYW5kIGJhbGFuY2luZyk7IChpdikgY2FzaCBwbGFubmluZyBhbmQgZm9yZWNhc3RpbmcgZm9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnM7ICh2KSBDYXNoLVRvZGF5IChpbmNsdWRpbmcgc2VsZi1zZXJ2aWNlIGNhc2ggbWFjaGluZXMsIGNhc2ggZGVwb3NpdHMsIHJlY3ljbGluZyBhbmQgYmFuayBub3RlcyBhbmQgY29pbiBkaXNwZW5zaW5nIHNlcnZpY2VzKSwgYW5kIGNyeXB0b2N1cnJlbmN5IGN1c3RvZHkgc2VydmljZXM7IGFuZCAodmkpIGFkZGVkLXZhbHVlIHNlcnZpY2VzIGluIHNldmVyYWwgY291bnRyaWVzIChBVk9TKSBmb3IgYmFua3MgKGluY2x1ZGluZyBvdXRzb3VyY2luZyBvZiB0ZWxsZXJzLCBtdWx0aS1hZ2VuY3kgc2VydmljZXMsIGNoZXF1ZSBwcm9jZXNzaW5nIGFuZCByZWxhdGVkIGFkbWluaXN0cmF0aXZlIHNlcnZpY2VzIGFtb25nIG90aGVycykgYW5kICh2aWkpIENvcnJlc3BvbmRlbnQgYmFua2luZyBhY3Rpdml0aWVzIChjb2xsZWN0aW9uIGFuZCBwYXltZW50IG1hbmFnZW1lbnQgYW5kIHBheW1lbnQgb2YgaW52b2ljZXMsIGFtb25nIG90aGVycykgYW5kICh2aWlpKSBGb3JlaWduIGV4Y2hhbmdlIGN1cnJlbmN5IHNlcnZpY2VzIChhbHNvIGluY2x1ZGVzIGludGVybmF0aW9uYWwgcGF5bWVudCBzZXJ2aWNlcywgb25saW5lIGZvcmVpZ24gbW9uZXksIGhvbWUgZGVsaXZlcnkgc2VydmljZXMgZm9yIHRyYXZlbCBtb25leSBhbmQgbG9jYWwgY2FzaCkKCkw1LjIxIFN1bW1hcml6ZSBhbnkgc3RhdGVtZW50cyBtYWRlIGJ5IHRoZSBzZWN1cml0aWVzIGZpcm0gaW4gaXRzIGFubnVhbCByZXBvcnQgYWJvdXQgaG93IGl0IG1heSBiZSBhZmZlY3RlZCBieSBleGlzdGluZyBvciBwb3RlbnRpYWwgcmVndWxhdGlvbnMuClByb3NlZ3VyIGFja25vd2xlZGdlcyB0aGF0IHRoZSBzZWN0b3IgaW4gd2hpY2ggaXQgcHJvdmlkZXMgaXRzIHNlcnZpY2VzIGlzIGhpZ2hseSByZWd1bGF0ZWQuIFRoZSBmaXJtIGhvd2V2ZXIgc2VlcyB0aGUgbmVlZCB0byBhZGFwdCB0byB0aG9zZSByZWd1bGF0aW9ucyBhbmQgdGFrZXMgYWN0aW9uIGluIGludHJvZHVjaW5nIGNoYW5nZXMgdGhlIHJlZ3VsYXRpb25zIGFkZHJlc3MuIFRoZSByZXBvcnRzIGluZGljYXRlIHRoYXQgdGhlIGNoYW5nZSBpbiByZWd1bGF0aW9ucyBhZmZlY3QgdGhlIGJ1c2luZXNzIGVzcGVjaWFsbHkgaW4gdGhlIGRhdGEgcHJvdGVjdGlvbiBzZWN0b3IsIGhvd2V2ZXIgaXQgcHJvdmlkZWQgaW1wb3J0YW50IHN0ZXBzIHRvIGludHJvZHVjZSBjaGFuZ2VzIGluIGl0cyBvcGVyYXRpb25hbCBwcmFjdGljZXMuIFRoaXMgcHJvY2VzcyBtYXkgbGVhZCB0byBhIHJpc2UgaW4gb3BlcmF0aW9uYWwgY29zdHMgIHNpbmNlIGl0IG1heSBuZWVkIGludHJvZHVjaW5nIHNvbWUgbmV3IHRlY2hub2xvZ2llcyBhbmQgdHJhaW5pbmcgb2YgdGhlIHN0YWZmLiBUaGUgcmVndWxhdGlvbnMgbWF5IGhvd2V2ZXIgaGF2ZSBhIHBvc2l0aXZlIGVmZmVjdCBvbiB0aGUgYnVzaW5lc3MgaW4gdGhlIGRvbWFpbnMgb2YgY3liZXJzZWN1cml0eSBhbmQgcmlzayBtYW5hZ2VtZW50IHNpbmNlIHRoZSBjaGFuZ2VzIGluIHJlZ3VsYXRpb25zIG1heSBhZmZlY3QgdGhlIGRlbWFuZCBvbiBzdWNoIHNlcnZpY2VzIHByb3ZpZGVkIGJ5IHRoaXMgZmlybS4KCkw1LjIyIERlc2NyaWJlIHRoZSByZWNlbnQgcGVyZm9ybWFuY2Ugb2YgdGhlIHNlY3VyaXRpZXMgZmlybSwgYW5kIGV4cGxhaW4gd2h5IHRoZSBwZXJmb3JtYW5jZSBoYXMgYmVlbiBmYXZvcmFibGUgb3IgdW5mYXZvcmFibGUuClNhbGVzIGluIDIwMjMgY29tcGFyZWQgdG8gdGhlIHllYXIgMjAyMiAgLTIxIDgwMiAwMDAg4oKsClBvc3QgdGF4IHByb2ZpdCBvZiBvbmdvaW5nIG9wZXJhdGlvbnMgaW4gMjAyMyBjb21wYXJlZCB0byB0aGUgeWVhciAyMDIyIC05NSA0ODggMDAwIOKCrApFQklUREEgaW4gMjAyMyBjb21wYXJlZCB0byB5ZWFyIDIwMjIgLTM2IDIyMCAwMDDigqwKCgpUaGUgZGF0YSBzaG93cyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGZpcm0gaW4gdGhlIHllYXIgMjAyMiBhbmQgdGhlIHllYXIgMjAyMy4gVGhpcyBtYXkgaGF2ZSBiZWVuIGNhdXNlZCBieSBtdWx0aXBsZSBkaWZmZXJlbnQgYXNwZWN0cy4gRmlyc3Qgb2YgYWxsLCB0aGUgeWVhciAyMDIyIHdhcyBhIHZlcnkgZ29vZCB5ZWFyIGluIHRoZSBoaXN0b3J5IG9mIFByb3NlZ3VyIGFuZCB0aGUgZmlybSByZWdpc3RlcmVkIHNvbWUgc2lnbmlmaWNhbnQgcHJvZml0cyBhbmQgYSBiaWcgZ3Jvd3RoIGluIGFzc2V0cywgd2hpY2ggY291bGQgYmUgZGlmZmljdWx0IHRvIG91dHBlcmZvcm0uIFRoZSBzZWNvbmQgYXNwZWN0IGNvdWxkIGJlIGEgZGlmZmVyZW5jZSBpbiBkZW1hbmQgb24gdGhlIG1hcmtldCB3aGljaCBjb3VsZCBiZSB0aGUgcmVhc29uIGZvciB0aGUgZGlmZmVyZW5jZSBpbiBzYWxlcyBhbmQgdGhlIEVCSVREQS4gVGhlIGZpcm0gYWxzbyBoYXMgcmVnaXN0ZXJlZCBhbiBpbXBvcnRhbnQgZGlmZmVyZW5jZSBpbiB0aGUgcG9zdCB0YXggcHJvZml0IG9mIG9uZ29pbmcgb3BlcmF0aW9ucyB3aGljaCBjb3VsZCBiZSBjYXVzZWQgYnkgYSBkaWZmZXJlbnQgY29zdCBtYW5hZ2VtZW50IHBvbGljeS4KCkw3IEZpeGVkIGluY29tZQpDb21wYXJpbmcgeWllbGRzIGFtb25nIHNlY3VyaXRpZXMKCkw3LjEgV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB5aWVsZCBvbiBjb3Jwb3JhdGUgaGlnaC1xdWFsaXR5IGJvbmRzIGFuZCB0aGUgeWllbGQgb24gVHJlYXN1cnkgYm9uZHMgYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0/IEV4cGxhaW4gd2h5IHRoZSBkaWZmZXJlbmNlIGV4aXN0cz8KUmVhc29ucyBmb3IgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSB0d28geWllbGRzIAoKClRoaXMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB5aWVsZHMgaXMgY2FsbGVkIHRoZSBjcmVkaXQgc3ByZWFkIGFuZCBleGlzdHMgZHVlIHRvIHRoZSBmb2xsb3dpbmcgZmFjdG9yczogCjEuIGNyZWRpdCByaXNrIAphLglDb3Jwb3JhdGUgaGlnaC1xdWFsaXR5IGJvbmRzIGhhdmUgYSBoaWdoZXIgcmlzayBvZiBkZWZhdWx0IGNvbXBhcmVkIHRvIFRyZWFzdXJ5IGJvbmRzLiBUaGVyZWZvcmUsIGludmVzdG9ycyBkZW1hbmQgYSBoaWdoZXIgeWllbGQgdG8gY29tcGVuc2F0ZSBmb3IgdGhpcyByaXNrIAoyLiBsaXF1aWRpdHkgcmlzayAKYS4JQ29ycG9yYXRlIGhpZ2gtcXVhbGl0eSBib25kcyBhcmUgb2Z0ZW4gbGVzcyBsaXF1aWQgdGhhbiBUcmVhc3VyeSBib25kcy4gQSBxdWljayBzYWxlIGF0IGEgZmFpciBtYXJrZXQgcHJpY2UgaXMgdGhlcmVmb3JlIG11Y2ggbW9yZSBkaWZmaWN1bHQgdGhhbiB3aXRoIFRyZWFzdXJ5IGJvbmRzLiAKMy4gbWFya2V0IGNvbmRpdGlvbnMgCmEuCUNoYW5nZXMgaW4gdGhlIGVjb25vbWljIHNpdHVhdGlvbiBvciBtb25ldGFyeSBwb2xpY3kgaGF2ZSBhIGRpZmZlcmVudCBlZmZlY3Qgb24gdGhlIHJlc3BlY3RpdmUgYm9uZC4gCgoKTDcuMiBXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHlpZWxkIG9uIGxvbmctdGVybSBUcmVhc3VyeSBib25kcyBhbmQgdGhlIHlpZWxkIG9uIGxvbmctdGVybSBtdW5pY2lwYWwgYm9uZHMgYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0/IEV4cGxhaW4gd2h5IGRvZXMgdGhlIGRpZmZlcmVuY2UgZXhpc3Q/CkxvbmctdGVybSB0cmVhc3VyeSBib25kcyB5aWVsZCB2YXJpZXMgYmV0d2VlbiAzLjglIGFuZCA0JSB3aGlsZSBsb25nLXRlcm0gbXVuaWNpcGFsIGJvbmRzIG1heSB5aWVsZCBiZXR3ZWVuIDUlIGFuZCA2JSBhZnRlciBjb3VudGluZyBmb3IgdGhlaXIgdGF4LWV4ZW1wdCBzdGF0dXMgZm9yIGludmVzdG9ycyBpbiBoaWdoZXIgdGF4IGJyYWNrZXRzLiBUaGF0IG1lYW5zIHRoYXQgYWZ0ZXIgdGFraW5nIGluIGNvbnNpZGVyYXRpb24gdGhlIHRheCBpbXBsaWNhdGlvbnMgdGhlIG11bmljaXBhbCBib25kcyBvZmZlciBhIGhpZ2hlciB5aWVsZCB0aGFuIHRyZWFzdXJ5IGJvbmRzLiBUaGUgaW50ZXJlc3QgZnJvbSBtdW5pY2lwYWwgYm9uZHMgaXMgZXhlbXB0IGZyb20gZmVkZXJhbCBpbmNvbWUgdGF4IGFuZCBhbHNvIGZyb20gc3RhdGUgdGF4ZXMgaWYgdGhlIGludmVzdG9yIHJlc2lkZXMgaW4gdGhlIGlzc3Vpbmcgc3RhdGUuIFRoaXMgcHV0cyB0aGUgbXVuaWNpcGFsIGJvbmRzIGluIGEgZmF2b3JhYmxlIHBvc2l0aW9uIGNvbXBhcmVkIHRvIHRoZSB0cmVhc3VyeSBib25kcyB3aGljaCBhcmUgdGF4YWJsZS4gVGhlcmUgaXMgYSBkaWZmZXJlbmNlIGluIHJpc2sgYmV0d2VlbiB0aGUgdHJlYXN1cnkgYm9uZHMgYW5kIHRoZSBtdW5pY2lwYWwgYm9uZHMgc2luY2UgdGhlIHRyZWFzdXJ5IGJvbmRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIHJpc2stZnJlZSB3aGlsZSB0aGUgbXVuaWNpcGFsIGJvbmRzIGNhcnJ5IHNvbWUgdHlwZSBvZiBjcmVkaXQgcmlzayBkZXBlbmRpbmcgb24gdGhlIGZpbmFuY2lhbCBjb25kaXRpb24gb2YgdGhlIGlzc3VpbmcgbXVuaWNpcGFsaXR5LgoKCkFzc2Vzc2luZyB0aGUgZm9yZWNhc3RpbmcgYWJpbGl0eSBvZiB0aGUgeWllbGQgY3VydmUKCgpMNy4zIFdoYXQgd2FzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIDI2LXdlZWsgVC1iaWxsIHlpZWxkIGFuZCB0aGUgMTMtd2VlayBULWJpbGwgeWllbGQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Nob29sIHRlcm0/CgoKTDcuNCBEb2VzIHRoaXMgaW1wbHkgdGhhdCB0aGUgeWllbGQgY3VydmUgaGFkIGFuIHVwd2FyZCBvciBkb3dud2FyZCBzbG9wZSBhdCB0aGF0IHRpbWU/CgoKTDcuNSBBc3N1bWluZyB0aGF0IHRoaXMgc2xvcGUgY2FuIGJlIHByaW1hcmlseSBhdHRyaWJ1dGVkIHRvIGV4cGVjdGF0aW9ucyB0aGVvcnksIGRpZCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzbG9wZSBpbmRpY2F0ZSB0aGF0IHRoZSBtYXJrZXQgZXhwZWN0ZWQgaGlnaGVyIG9yIGxvd2VyIGludGVyZXN0IHJhdGVzIGluIHRoZSBmdXR1cmU/CgpMNy42IERpZCBpbnRlcmVzdCByYXRlcyBtb3ZlIGluIHRoYXQgZGlyZWN0aW9uIG92ZXIgdGhlIHNjaG9vbCB0ZXJtPwpFeHBsYWluaW5nIHNoaWZ0cyBpbiB0aGUgeWllbGQgY3VydmUgb3ZlciB0aW1lCgoKTDcuNyBXaGF0IHdhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsb25nLXRlcm0gVHJlYXN1cnkgYm9uZCB5aWVsZCBhbmQgdGhlIDEzLXdlZWsgVC1iaWxsIHlpZWxkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjaG9vbCB0ZXJtPwpPbiBNYXkgMXN0LCAyMDI0LCB0aGUgeWllbGQgZm9yIHRoZSAzMC15ZWFyIFRyZWFzdXJ5IGJvbmQgd2FzIDQuNTclCk1lYW53aGlsZSwgdGhlIHlpZWxkIGZvciB0aGUgMTMtd2VlayBULWJpbGwgd2FzIDMuODElCkRpZmZlcmVuY2UgYmV0d2VlbiB0aG9zZSBib25kcyBpcyA0LjU3IC0gMy44MSA9IDAuNzYlClRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhvc2UgdHdvIGJvbmRzIHdvdWxkIHVzdWFsbHkgYmUgY2F1c2VkIGJ5IHRoZSByaXNrIGRpZmZlcmVuY2VzIHdoZXJlIHRoZSByaXNrIG9mIHRoZSAxMC15ZWFyIFUuUy4gdHJlYXN1cnkgYm9uZCBpcyBoaWdoZXIgdGhhbiB0aGUgMTMtd2VlayB0cmVhc3VyeSBiaWxsLiBJbiBzdWNoIGEgY2FzZSB0aGUgeWllbGQgb2YgdGhlIDEwLXllYXIgdHJlYXN1cnkgYm9uZCBzaG91bGQgYmUgaGlnaGVyIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSByaXNrLiBBbm90aGVyIHJlYXNvbiBmb3IgdGhpcyBkaWZmZXJlbmNlIGlzIHRoZSBleHBlY3RhdGlvbiB0aGF0IHRoZSBpbnRlcmVzdCByYXRlIGNvdWxkIGNoYW5nZSBpbiB0aW1lIHNvIGludmVzdG9ycyB3b3VsZCBwcmVmZXIgdG8gaGF2ZSB0aGVpciBtb25leSBoZWxkIGZvciBhIHNob3J0ZXIgcGVyaW9kIG9mIHRpbWUgaW4gb3JkZXIgbm90IHRvIGJlIGxvY2tlZCBpbiB0aGVpciBpbnZlc3RtZW50cy4KCkw3LjggV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBsb25nLXRlcm0gVHJlYXN1cnkgYm9uZCB5aWVsZCBhbmQgdGhlIDEzLXdlZWsgVC1iaWxsIHlpZWxkIGF0IHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtPwpPbiBTZXB0ZW1iZXIgMzAsIDIwMjQsIHRoZSBsb25nLXRlcm0gVHJlYXN1cnkgYm9uZCB5aWVsZCAoMTAteWVhciBUcmVhc3VyeSByYXRlKSB3YXMgNC40MSUuCk1lYW53aGlsZSwgdGhlIDEzLXdlZWsgVC1iaWxsIHlpZWxkIHdhcyAzLjgxJS4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSB0d28geWllbGRzIGlzIDAuNjAlICg0LjQxJSAtIDMuODElKQoKTDcuOSBHaXZlbiB5b3VyIGFuc3dlcnMgdG8gdGhlIHR3byBwcmV2aW91cyBxdWVzdGlvbnMsIGRlc2NyaWJlIGhvdyB0aGUgeWllbGQgY3VydmUgY2hhbmdlZCBvdmVyIHRoZSBzY2hvb2wgdGVybS4gRXhwbGFpbiB0aGUgY2hhbmdlcyBpbiBleHBlY3RhdGlvbnMgYWJvdXQgZnV0dXJlIGludGVyZXN0IHJhdGVzIHRoYXQgYXJlIGltcGxpZWQgYnkgdGhlIHNoaWZ0IGluIHRoZSB5aWVsZCBjdXJ2ZSBvdmVyIHRoZSBzY2hvb2wgdGVybS4KVGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHlpZWxkcyBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzY2hvb2wgdGVybSB3YXMgMC43NiUgYW5kIGF0IHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtIHdhcyAwLjYwJS4gT3ZlciB0aGUgc2Nob29sIHRlcm0sIHRoZSB5aWVsZCBjdXJ2ZSBleHBlcmllbmNlZCBhIGZsYXR0ZW5pbmcuIFRoYXQgc2hvd3MgdGhhdCB0aGUgZXhwZWN0YXRpb25zIGFib3V0IHRoZSBpbnRlcmVzdCByYXRlcyBhcmUgdGhhdCBpdCB3aWxsIGRyb3AuClRoZSBGZWTigJlzIGluZmx1ZW5jZSBvbiBpbnRlcmVzdCByYXRlcwoKTDcuMTAgRGlkIHRoZSBGZWQgY2hhbmdlIHRoZSBmZWRlcmFsIGZ1bmRzIHJhdGUgb3ZlciB0aGUgc2Nob29sIHRlcm0/CgpMNy4xMSBEbyB5b3UgdGhpbmsgdGhlIG1vdmVtZW50cyBpbiBpbnRlcmVzdCByYXRlcyBvdmVyIHRoZSBzY2hvb2wgdGVybSB3ZXJlIGNhdXNlZCBieSB0aGUgRmVk4oCZcyBtb25ldGFyeSBwb2xpY3k/IEV4cGxhaW4uCk1lYXN1cmluZyBhbmQgZXhwbGFpbmluZyBwcmVtaXVtcyBvbiBtb25leSBtYXJrZXQgc2VjdXJpdGllcwpMNy4xMiBXaGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHlpZWxkIG9uIDkwLWRheSBjb21tZXJjaWFsIHBhcGVyIGFuZCB0aGUgeWllbGQgb24gMTMtd2VlayBULWJpbGxzIGF0IHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtPyBFZXhwbGFpbiB3aHkgdGhpcyBwcmVtaXVtIGV4aXN0cy4KTDcuMTMgQ29tcGFyZSB0aGUgcHJlbWl1bSBvbiB0aGUgOTAtZGF5IGNvbW1lcmNpYWwgcGFwZXIgeWllbGQgKHJlbGF0aXZlIHRvIHRoZSAxMy13ZWVrIFQtYmlsbCB5aWVsZCkgdGhhdCBleGlzdHMgYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0gdG8gdGhlIHByZW1pdW0gdGhhdCBleGlzdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlcm0uIEVleHBsYWluIHdoeSB0aGUgcHJlbWl1bSBtYXkgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHNjaG9vbCB0ZXJtLgpFeHBsYWluaW5nIGJvbmQgcHJlbWl1bXMgYW5kIHByaWNlIG1vdmVtZW50cwoKTDcuMTQgV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB5aWVsZCBvbiBoaWdoLXlpZWxkIGNvcnBvcmF0ZSBib25kcyBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybSB2ZXJzdXMgdGhlIHlpZWxkIG9uIGhpZ2gtcXVhbGl0eSBjb3Jwb3JhdGUgYm9uZHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Nob29sIHRlcm0/CgpMNy4xNSBDb21wYXJlIHRoZSBsb25nLXRlcm0gVHJlYXN1cnkgYm9uZCB5aWVsZCBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybSB0byB0aGUgbG9uZ3Rlcm0gVHJlYXN1cnkgYm9uZCB5aWVsZCB0aGF0IGV4aXN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Nob29sIHRlcm0uIEdpdmVuIHRoZSBkaXJlY3Rpb24gb2YgdGhpcyBjaGFuZ2UsIGRpZCBwcmljZXMgb2YgbG9uZy10ZXJtIGJvbmRzIHJpc2Ugb3IgZmFsbCBvdmVyIHRoZSBzY2hvb2wgdGVybT8KCkw3LjE2IENvbXBhcmUgdGhlIGNoYW5nZSBpbiB0aGUgeWllbGRzIG9mIFRyZWFzdXJ5LCBtdW5pY2lwYWwsIGFuZCBjb3Jwb3JhdGUgYm9uZHMgb3ZlciB0aGUgc2Nob29sIHRlcm0uIERpZCB0aGUgeWllbGRzIG9mIGFsbCB0aHJlZSB0eXBlcyBvZiBzZWN1cml0aWVzIG1vdmUgaW4gdGhlIHNhbWUgZGlyZWN0aW9uIGFuZCBieSBhYm91dCB0aGUgc2FtZSBkZWdyZWU/IEV4cGxhaW4gd2h5IHlpZWxkcyBvZiBkaWZmZXJlbnQgdHlwZXMgb2YgYm9uZHMgbW92ZSB0b2dldGhlci4KCkw3LjE3IENvbXBhcmUgdGhlIHByZW1pdW0gb24gaGlnaC15aWVsZCBjb3Jwb3JhdGUgYm9uZHMgKHJlbGF0aXZlIHRvIFRyZWFzdXJ5IGJvbmRzKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzY2hvb2wgdGVybSB0byB0aGUgcHJlbWl1bSB0aGF0IGV4aXN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0uIERpZCB0aGUgcHJlbWl1bSBpbmNyZWFzZSBvciBkZWNyZWFzZT8gV2h5IHRoaXMgcHJlbWl1bSBjaGFuZ2VkIG92ZXIgdGhlIHNjaG9vbCB0ZXJtLgoKCkw4IFBvcnRmb2xpbyAtIE1hcmtvdml0egpSZXBsaWNhdGUgdGhlIGJhc2ljIGlkZWEgb2YgdGhlIHBvcnRmb2xpbyBjYXNlCk1hcmtvd2l0eiBwb3J0Zm9saW8gdGhlb3J5LCB3aGljaCB3YXMgZGV2ZWxvcGVkIGluIHRoZSAxOTUwcywgaXMgYSBmb3JtIG9mIHBvcnRmb2xpbyBvcHRpbWl6YXRpb24gYmFzZWQgb24gc3RydWN0dXJlZCBtYXRoZW1hdGljYWwgYW5kIHN0YXRpc3RpY2FsIHByaW5jaXBsZXMuIApBdCBpdHMgaGVhcnQgaXMgdGhlIGNvbmNlcHQgb2YgZGl2ZXJzaWZpY2F0aW9uLiBNYXJrb3dpdHogYXJndWVzIHRoYXQgYnkgY29tYmluaW5nIGRpZmZlcmVudCBhc3NldHMgaW4gYSBwb3J0Zm9saW8sIHRoZSBvdmVyYWxsIHJpc2sgY2FuIGJlIHNpZ25pZmljYW50bHkgcmVkdWNlZCB3aXRob3V0IHNpZ25pZmljYW50bHkgcmVkdWNpbmcgdGhlIGV4cGVjdGVkIHJldHVybi4gVGhpcyBpcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IG5vdCBhbGwgaW52ZXN0bWVudHMgYXJlIGVxdWFsbHkgY29ycmVsYXRlZDsgYnkgc3BlY2lmaWNhbGx5IHNlbGVjdGluZyBhc3NldHMgd2l0aCBkaWZmZXJlbnQgcmlzayBwcm9maWxlcyBhbmQgZXhwZWN0ZWQgcmV0dXJucywgaW52ZXN0b3JzIGNhbiByZWR1Y2UgdGhlIHZvbGF0aWxpdHkgb2YgdGhlaXIgcG9ydGZvbGlvcy4KQSBrZXkgZWxlbWVudCBvZiB0aGlzIHRoZW9yeSBpcyB0aGUgcXVhbnRpZmljYXRpb24gb2Ygcmlzay4KCgpMOSBQb3J0Zm9saW8gLSBDQU1QClN0YXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gQ0FNUCBhbmQgTWFya292aXR6ClRoZSBDYXBpdGFsIEFzc2V0IFByaWNpbmcgTW9kZWwgKENBUE0pIGlzIGEgY2VudHJhbCBjb25jZXB0IGluIGZpbmFuY2UgdGhhdCBkZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSByaXNrIG9mIGFuIGFzc2V0IGFuZCBpdHMgZXhwZWN0ZWQgcmV0dXJuLiBUaGUgYmFzaWMgYXNzdW1wdGlvbiBpcyB0aGF0IGludmVzdG9ycyBtdXN0IGJlIHJld2FyZGVkIGZvciB0YWtpbmcgcmlzay4gSXQgaW50cm9kdWNlcyB0aGUgY29uY2VwdCBvZiBzeXN0ZW1hdGljIHJpc2ssIHdoaWNoIGNhbm5vdCBiZSBlbGltaW5hdGVkIHRocm91Z2ggZGl2ZXJzaWZpY2F0aW9uLiBUaGUgZXhwZWN0ZWQgcmV0dXJuIG9mIGFuIGFzc2V0IGlzIGRldGVybWluZWQgYnkgdGhlIHJpc2stZnJlZSByYXRlIG9mIHJldHVybiBwbHVzIGEgcmlzayBwcmVtaXVtIHByb3BvcnRpb25hbCB0byB0aGUgYXNzZXQncyBiZXRhIC0gYSBtZWFzdXJlIG9mIGl0cyB2b2xhdGlsaXR5IHJlbGF0aXZlIHRvIHRoZSBtYXJrZXQgYXMgYSB3aG9sZS4KSW4gY29udHJhc3QgdG8gTWFya293aXR6IHBvcnRmb2xpbyB0aGVvcnksIHdoaWNoIGZvY3VzZXMgb24gdGhlIGRpdmVyc2lmaWNhdGlvbiBvZiBpbnZlc3RtZW50cyB0byByZWR1Y2UgcmlzaywgdGhlIENBUE0gZm9jdXNlcyBvbiB0aGUgc3lzdGVtYXRpYyByaXNrIG9mIGFuIGluZGl2aWR1YWwgYXNzZXQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIG1hcmtldCBhcyBhIHdob2xlLiBXaGlsZSBNYXJrb3dpdHogdGhlb3J5IGhlbHBzIGludmVzdG9ycyB0byBjcmVhdGUgb3B0aW1hbCBwb3J0Zm9saW9zIGJ5IHVzaW5nIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgcmV0dXJucyBhcyBhIG1lYXN1cmUgb2YgcmlzaywgdGhlIENBUE0gb25seSBsb29rcyBhdCByaXNrIHRoYXQgY2Fubm90IGJlIHJlZHVjZWQgdGhyb3VnaCBkaXZlcnNpZmljYXRpb24uCkFub3RoZXIgZGlmZmVyZW5jZSBsaWVzIGluIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgdHdvIG1vZGVscy4gVGhlIE1hcmtvd2l0eiB0aGVvcnkgaXMgb2Z0ZW4gdXNlZCB0byBvcHRpbWl6ZSB0aGUgY29tcG9zaXRpb24gb2YgcG9ydGZvbGlvcyB0aHJvdWdoIGRpdmVyc2lmaWNhdGlvbiwgYW1vbmcgb3RoZXIgdGhpbmdzLCB3aGVyZWFzIHRoZSBDQVBNIGlzIHVzZWQgdG8gZXZhbHVhdGUgaW5kaXZpZHVhbCBpbnZlc3RtZW50cy4gSXQgb2ZmZXJzIGEgY2xlYXIgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBhbiBhcHByb3ByaWF0ZSByZXR1cm4gZm9yIHRoZSByaXNrIHRha2VuIG9uIGFuIGFzc2V0LiBJdCBpcyB0aGVyZWZvcmUgdmVyeSB1c2VmdWwgZm9yIGluZGl2aWR1YWwgaW52ZXN0bWVudCBkZWNpc2lvbnMuIApUbyBzdW1tYXJpemUsIGJvdGggQ0FQTSBhbmQgTWFya293aXR6IGFyZSBpbXBvcnRhbnQgdG9vbHMgaW4gdGhlIGZpZWxkIG9mIGZpbmFuY2UuIFRoZXkgb2ZmZXIgZGlmZmVyZW50IHBlcnNwZWN0aXZlcyBvbiByaXNrIGFuZCByZXR1cm4gYW5kIGNvbXBsZW1lbnQgZWFjaCBvdGhlciBpbiB0aGVpciBhcHBsaWNhdGlvbi4KCgoKTDEwIFdBQ0MKUmVwbGljYXRlIHRoZSBib29rIGNhc2Ugb2YgV0FDQwpUaGUgV2VpZ2h0ZWQgQXZlcmFnZSBDb3N0IG9mIENhcGl0YWwgKFdBQ0MpIGlzIGFuIGltcG9ydGFudCBmaW5hbmNpYWwgbWV0cmljIHRoYXQgcmVwcmVzZW50cyB0aGUgYXZlcmFnZSByYXRlIG9mIHJldHVybiBhIGNvbXBhbnkgbmVlZHMgdG8gYWNoaWV2ZSB0byBzYXRpc2Z5IGl0cyBpbnZlc3RvcnPigJRib3RoIGVxdWl0eSBzaGFyZWhvbGRlcnMgYW5kIGRlYnQgaG9sZGVycy4gSXQgaGVscHMgZGV0ZXJtaW5lIHRoZSBtaW5pbXVtIHJldHVybiB0aGUgY29tcGFueSBzaG91bGQgZ2VuZXJhdGUgb24gaXRzIGludmVzdG1lbnRzIHRvIG1haW50YWluIGl0cyB2YWx1ZSBhbmQgYXR0cmFjdCBvbmdvaW5nIGZ1bmRpbmcuCktleSBDb21wb25lbnRzIG9mIFdBQ0M6CkNvc3Qgb2YgRXF1aXR5IChSZSk6IFRoaXMgaXMgdGhlIHJldHVybiB0aGF0IGVxdWl0eSBpbnZlc3RvcnMgZXhwZWN0IGZvciB0YWtpbmcgb24gdGhlIHJpc2sgb2YgaW52ZXN0aW5nIGluIHRoZSBjb21wYW55LiBJdCBpcyB0eXBpY2FsbHkgZXN0aW1hdGVkIHVzaW5nIHRoZSBDYXBpdGFsIEFzc2V0IFByaWNpbmcgTW9kZWwgKENBUE0pLCByZWZsZWN0aW5nIHRoZSBvcHBvcnR1bml0eSBjb3N0IG9mIGNhcGl0YWwuCkNvc3Qgb2YgRGVidCAoUmQpOiBUaGlzIHJlcHJlc2VudHMgdGhlIGludGVyZXN0IHJhdGUgYSBjb21wYW55IHBheXMgb24gaXRzIGJvcnJvd2VkIGZ1bmRzLCBhZGp1c3RlZCBmb3IgdGhlIGNvcnBvcmF0ZSB0YXggcmF0ZSBiZWNhdXNlIGludGVyZXN0IHBheW1lbnRzIGFyZSB0YXgtZGVkdWN0aWJsZS4KV0FDQyBGb3JtdWxhOgpXQUNDIGlzIGNhbGN1bGF0ZWQgYXMgYSB3ZWlnaHRlZCBhdmVyYWdlLCB3aGVyZSB0aGUgd2VpZ2h0cyByZXByZXNlbnQgdGhlIHByb3BvcnRpb24gb2YgZXF1aXR5IGFuZCBkZWJ0IGluIHRoZSBjb21wYW554oCZcyBjYXBpdGFsIHN0cnVjdHVyZS4gVGhlIGZvcm11bGEgaXM6CldBQ0M9RVbii4VSZStEVuKLhVJk4ouFKDHiiJJUYylXQUNDPVZF4ouFUmUrVkTii4VSZOKLhSgx4oiSVGMpCldoZXJlOgpFOiBNYXJrZXQgdmFsdWUgb2YgZXF1aXR5CkQ6IE1hcmtldCB2YWx1ZSBvZiBkZWJ0ClY6IFRvdGFsIHZhbHVlIChlcXVpdHkgKyBkZWJ0KQpSZTogQ29zdCBvZiBlcXVpdHkKUmQ6IENvc3Qgb2YgZGVidApUYzogQ29ycG9yYXRlIHRheCByYXRlCktleSBUYWtlYXdheXM6ClB1cnBvc2Ugb2YgV0FDQzoKV0FDQyBzZXJ2ZXMgYXMgYSBjcnVjaWFsIGJlbmNobWFyayBmb3IgZXZhbHVhdGluZyBpbnZlc3RtZW50IG9wcG9ydHVuaXRpZXMuIEl0IHJlcHJlc2VudHMgdGhlIG1pbmltdW0gcmV0dXJuIHJlcXVpcmVkIHRvIHNhdGlzZnkgYm90aCBlcXVpdHkgYW5kIGRlYnQgaW52ZXN0b3JzLiBQcm9qZWN0cyBzaG91bGQgb25seSBiZSBwdXJzdWVkIGlmIHRoZWlyIGV4cGVjdGVkIHJldHVybiBleGNlZWRzIHRoZSBXQUNDLCBlbnN1cmluZyB0aGV5IGNyZWF0ZSB2YWx1ZS4gQnkgZmFjdG9yaW5nIGluIHRoZSBjb21wYW554oCZcyBvdmVyYWxsIGNvc3Qgb2YgY2FwaXRhbCwgV0FDQyByZWZsZWN0cyB0aGUgcmlzayBwcmVmZXJlbmNlcyBvZiBib3RoIGVxdWl0eSBhbmQgZGVidCBob2xkZXJzLCBzdXBwb3J0aW5nIGluZm9ybWVkIGZpbmFuY2lhbCBkZWNpc2lvbi1tYWtpbmcuCkZhY3RvcnMgQWZmZWN0aW5nIFdBQ0M6CkEgY29tcGFueeKAmXMgY2FwaXRhbCBzdHJ1Y3R1cmUgcGxheXMgYSBtYWpvciByb2xlIGluIGRldGVybWluaW5nIGl0cyBXQUNDLCBhcyBkZWJ0IGlzIHR5cGljYWxseSBsZXNzIGV4cGVuc2l2ZSB0aGFuIGVxdWl0eSwgYnV0IGluY3JlYXNlcyBmaW5hbmNpYWwgcmlzay4gRXh0ZXJuYWwgZmFjdG9ycyBsaWtlIGludGVyZXN0IHJhdGVzIG9yIG1hcmtldCByaXNrIHByZW1pdW1zIGNhbiBpbmZsdWVuY2UgYm90aCB0aGUgY29zdCBvZiBkZWJ0IGFuZCBlcXVpdHkuIEFkZGl0aW9uYWxseSwgdGhlIHRheCByYXRlIGltcGFjdHMgdGhlIGFmdGVyLXRheCBjb3N0IG9mIGRlYnQsIHdpdGggaGlnaGVyIHRheCByYXRlcyBsb3dlcmluZyB0aGUgZWZmZWN0aXZlIGNvc3Qgb2YgZGVidCwgdGh1cyBwb3RlbnRpYWxseSByZWR1Y2luZyBXQUNDLiBBbGwgdGhlc2UgZWxlbWVudHMgY29sbGVjdGl2ZWx5IHNoYXBlIHRoZSBjb21wYW554oCZcyB0b3RhbCBjb3N0IG9mIGNhcGl0YWwgYW5kIGltcGFjdCBpdHMgZmluYW5jaWFsIHN0cmF0ZWd5LgpJbXBsaWNhdGlvbnMgb2YgV0FDQzoKQSBsb3dlciBXQUNDIG1lYW5zIGNoZWFwZXIgZmluYW5jaW5nIGZvciBpbnZlc3RtZW50cywgaW1wcm92aW5nIHRoZSBjb21wYW554oCZcyBjb21wZXRpdGl2ZSBlZGdlLgpBIGhpZ2hlciBXQUNDIHNpZ25hbHMgaGlnaGVyIGZpbmFuY2luZyBjb3N0cywgd2hpY2ggY291bGQgbGltaXQgZ3Jvd3RoIG9wcG9ydHVuaXRpZXMuCldBQ0MgaXMgYSB2aXRhbCBtZXRyaWMgaW4gY29ycG9yYXRlIGZpbmFuY2UsIGd1aWRpbmcgaW52ZXN0bWVudCBkZWNpc2lvbnMsIHZhbHVhdGlvbiBtb2RlbHMsIGFuZCBwZXJmb3JtYW5jZSBhc3Nlc3NtZW50cy4gSXQgcHJvdmlkZXMgYSBjb21wcmVoZW5zaXZlIHZpZXcgb2YgYSBjb21wYW554oCZcyBmaW5hbmNpbmcgY29zdHMgYW5kIHN0cmF0ZWdpYyBmaW5hbmNpYWwgcGxhbm5pbmcuCgoKTDExIERlcml2YXRpdmVzCkwxMS4xIEFzc3VtZSB0aGF0IHlvdSBwdXJjaGFzZWQgYW4gUyZQIDUwMCBmdXR1cmVzIGNvbnRyYWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjaG9vbCB0ZXJtLCB3aXRoIHRoZSBmaXJzdCBzZXR0bGVtZW50IGRhdGUgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtLiBBbHNvIGFzc3VtZSB0aGF0IHlvdSBzb2xkIGFuIFMmUCA1MDAgZnV0dXJlcyBjb250cmFjdCB3aXRoIHRoaXMgc2FtZSBzZXR0bGVtZW50IGRhdGUgYXQgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0uIEdpdmVuIHRoYXQgdGhpcyBjb250cmFjdCBoYXMgYSB2YWx1ZSBvZiB0aGUgZnV0dXJlcyBwcmljZSB0aW1lcyAkMjUwLCBkZXRlcm1pbmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZG9sbGFyIHZhbHVlIG9mIHRoZSBjb250cmFjdCB5b3Ugc29sZCBhbmQgdGhlIGRvbGxhciBhbW91bnQgb2YgdGhlIGNvbnRyYWN0IHRoYXQgeW91IHB1cmNoYXNlZC4KCgpUaGUgcHJpY2Ugb2YgZnV0dXJlcyBjb250cmFjdCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzY2hvb2wgdGVybTogJCA1MDQ2LDUKVGhlIHByaWNlIG9mIGZ1dHVyZXMgY29udHJhY3QgaW4gdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm06ICQ1ODE0LDI1CgpgYGB7cn0KMjUwKjUwNDYuNQpgYGAKRnV0dXJlcyB2YWx1ZSBvZiBwdXJjaGFzZTogJDEgMjYxIDYyNQoKRnV0dXJlcyB2YWx1ZSBvZiBzYWxlOgpgYGB7cn0KMjUwKjU4MTQuMjUKYGBgCkZ1dHVyZXMgdmFsdWUgb2Ygc2FsZTogPSAkMSA0NTMgNTYyLDUKV2Ugd2lsbCBub3cgY2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlOgpgYGB7cn0KMTI2MTYyNS0xNDUzNTYyLjUKYGBgCiA9ICQxOTEgOTM3LDUKCgoKCgpMMTEuMiBBc3N1bWUgdGhhdCB5b3UgaW52ZXN0ZWQgYW4gaW5pdGlhbCBtYXJnaW4gb2YgMjAgcGVyY2VudCBvZiB0aGUgYW1vdW50IHRoYXQgeW91IHdvdWxkIG93ZSB0byBwdXJjaGFzZSB0aGUgUyZQIDUwMCBpbmRleCBhdCB0aGUgc2V0dGxlbWVudCBkYXRlLiBNZWFzdXJlIHlvdXIgcmV0dXJuIGZyb20gdGFraW5nIGEgcG9zaXRpb24gaW4gdGhlIFMmUCA1MDAgaW5kZXggZnV0dXJlcyBhcyBmb2xsb3dzLiBUYWtlIHRoZSBkaWZmZXJlbmNlIGRldGVybWluZWQgaW4gdGhlIHByZXZpb3VzIHF1ZXN0aW9uICh3aGljaCByZXByZXNlbnRzIHRoZSBkb2xsYXIgYW1vdW50IG9mIHRoZSBnYWluIG9uIHRoZSBmdXR1cmVzIHBvc2l0aW9uKSBhbmQgZGl2aWRlIGl0IGJ5IHRoZSBhbW91bnQgeW91IG9yaWdpbmFsbHkgaW52ZXN0ZWQgKHRoZSBhbW91bnQgeW91IG9yaWdpbmFsbHkgaW52ZXN0ZWQgaXMgMjAgcGVyY2VudCBvZiB0aGUgZG9sbGFyIHZhbHVlIG9mIHRoZSBmdXR1cmVzIGNvbnRyYWN0IHRoYXQgeW91IHB1cmNoYXNlZCkuCgoKSW5pdGlhbCBpbnZlc3RtZW50OgoKYGBge3J9CjAuMioxMjYxNjI1IApgYGAKPSAyNTIgMzI1ClJldHVybiA9IGRpZmZlcmVuY2UvaW5pdGlhbCBpbnZlc3RtZW50CmBgYHtyfQoxOTE5MzcuNS8yNTIzMjUKYGBgCgpSZXR1cm4gPSAwLDc2MDY3NTcgPSA3NiUKCkwxMS4zIFRoZSByZXR1cm4gdGhhdCB5b3UganVzdCBkZXJpdmVkIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiBpcyBub3QgYW5udWFsaXplZC4gVG8gYW5udWFsaXplIHlvdXIgcmV0dXJuLCBtdWx0aXBseSBpdCBieSAxMi9tLCB3aGVyZSBtIGlzIHRoZSBudW1iZXIgb2YgbW9udGhzIGluIHlvdXIgc2Nob29sIHRlcm0uCgoKQW5udWFsaXplZCByZXR1cm4gCiAKYGBge3J9Cjc2KjEyLzUKYGBgCj0gMTgyLDQlCgpMMTEuNCBBc3N1bWUgdGhhdCB5b3UgcHVyY2hhc2VkIGEgY2FsbCBvcHRpb24gKHJlcHJlc2VudGluZyAxMDAgc2hhcmVzKSBvbiB0aGUgc3BlY2lmaWMgc3RvY2sgdGhhdCB5b3UgaWRlbnRpZmllZCBmb3IgdGhpcyBwcm9qZWN0LiBXaGF0IHdhcyB5b3VyIHJldHVybiBmcm9tIHB1cmNoYXNpbmcgdGhpcyBvcHRpb24/IFtZb3VyIHJldHVybiBjYW4gYmUgbWVhc3VyZWQgYXMgClJldHVybiA9IG1heChtYXJrZXQgcHJpY2UgLSBLLDApL1AKCgpQcmVtdCByZXByZXNlbnRzIHRoZSBwcmVtaXVtIGF0IHdoaWNoIHRoZSBzYW1lIG9wdGlvbiBjYW4gYmUgc29sZCBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybS5dIElmIHRoZSBwcmVtaXVtIGZvciB0aGlzIG9wdGlvbiBpcyBub3QgcXVvdGVkIGF0IHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtLCBtZWFzdXJlIHRoZSByZXR1cm4gYXMgaWYgeW91IGhhZCBleGVyY2lzZWQgdGhlIGNhbGwgb3B0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtIChhc3N1bWluZyB0aGF0IGl0IGlzIGZlYXNpYmxlIHRvIGV4ZXJjaXNlIHRoZSBvcHRpb24gYXQgdGhhdCB0aW1lKS4gVGhhdCBpcywgdGhlIHJldHVybiBpcyBiYXNlZCBvbiBwdXJjaGFzaW5nIHRoZSBzdG9jayBhdCB0aGUgb3B0aW9u4oCZcyBzdHJpa2UgcHJpY2UgYW5kIHRoZW4gc2VsbGluZyB0aGUgc3RvY2sgYXQgaXRzIG1hcmtldCBwcmljZSBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybS4KCgpUbyBjYWxjdWxhdGUgdGhlIHJldHVybiBmcm9tIHB1cmNoYXNpbmcgYSBjYWxsIG9wdGlvbiBvbiBBcHBsZSBJbmMuIChBQVBMKSBzaGFyZXMsIHdlIHdpbGwgYXNzdW1lIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIHN0cmlrZSBwcmljZSBhbmQgcHJlbWl1bSBwYWlkIGZvciB0aGUgb3B0aW9uLiBCYXNlZCBvbiB0aGUgbW9zdCByZWNlbnQgc3RvY2sgcHJpY2UgZGF0YSwgd2Ugd2lsbCB1c2UgdGhlIGNsb3NpbmcgcHJpY2Ugb2YgQXBwbGUgc2hhcmVzIGF0IHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtLCB3aGljaCBpcyAkMjM3LjMzLgpBc3N1bXB0aW9uczoKU3RyaWtlIFByaWNlIChLKTogTGV0J3MgYXNzdW1lIGEgc3RyaWtlIHByaWNlIG9mICQyMzAuClByZW1pdW0gUGFpZCAoUCk6IFdlIHdpbGwgYXNzdW1lIHdlIHBhaWQgYSBwcmVtaXVtIG9mICQ1IHBlciBzaGFyZQpNYXJrZXQgUHJpY2UgYXQgRXhwaXJhdGlvbjogVGhlIG1hcmtldCBwcmljZSBvZiBBcHBsZSBzaGFyZXMgb24gU2VwdGVtYmVyIDMwIDIwMjQgaXMgJDIzNy4zMy4KQ2FsY3VsYXRpbmcgcmV0dXJuOiAKU2VsbGluZyB0aGUgb3B0aW9uCklmIHlvdSBkZWNpZGUgdG8gc2VsbCB0aGUgY2FsbCBvcHRpb24gYXQgbWFya2V0IHByaWNlOgpSZXR1cm49bWF44oGhKE1hcmtldCBQcmljZeKIkkssMCniiJJQIC9QCksgLSBzdHJpa2UgcHJpY2UKUCAtIHByZW1pdW0KQ2FsY3VsYXRpbmc6Cm1heOKBoSgyMzcuMzPiiJIyMzAsMCk9bWF44oGhKDcuMzMsMCk9Ny4zMwpSZXR1cm49KDcuMzPiiJI1KS81PTIuMzMvNT0wLjQ2NiBvciA0Ni42JQoKCkV4ZXJjaXNpbmcgdGhlIG9wdGlvbjoKSWYgeW91IGRlY2lkZSB0byBleGVyY2lzZSB0aGUgY2FsbCBvcHRpb246ClJldHVybj1tYXjigaEoTWFya2V0IFByaWNl4oiSSywwKS9QCkNhbGN1bGF0aW5nOgpSZXR1cm4KYGBge3J9CjcuMzMvNQpgYGAKCj0xLjQ2NiBvciAxNDYuNiUKU3VtbWFyeSBvZiByZXR1cm5zClJldHVybiBpZiBTb2xkOiA0Ni42JQpSZXR1cm4gaWYgRXhlcmNpc2VkOiAxNDYuNiUKCgpMMTEuNSBBbm51YWxpemUgdGhlIHJldHVybiBvbiB5b3VyIG9wdGlvbiBieSBtdWx0aXBseWluZyB0aGUgcmV0dXJuIHlvdSBkZXJpdmVkIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiBieSAxMi9tLCB3aGVyZSBtIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBtb250aHMgaW4geW91ciBzY2hvb2wgdGVybS4KSWYgc29sZDoKYGBge3J9CjQ2LjYqIDEyLzUKYGBgCiA9IDExMSw4NCUKIApJZiBleGVyY2lzZWQKYGBge3J9CjE0Ni42KjEyLzUKYGBgCgogPSAzNTEsODQlCgoKTDExLjYgQ29tcGFyZSB0aGUgcmV0dXJuIG9uIHlvdXIgY2FsbCBvcHRpb24gdG8gdGhlIHJldHVybiB0aGF0IHlvdSB3b3VsZCBoYXZlIGVhcm5lZCBpZiB5b3UgaGFkIHNpbXBseSBpbnZlc3RlZCBpbiB0aGUgc3RvY2sgaXRzZWxmLiBOb3RpY2UgaG93IHRoZSBtYWduaXR1ZGUgb2YgdGhlIHJldHVybiBvbiB0aGUgY2FsbCBvcHRpb24gaXMgbXVjaCBsYXJnZXIgdGhhbiB0aGUgbWFnbml0dWRlIG9mIHRoZSByZXR1cm4gb24gdGhlIHN0b2NrIGl0c2VsZi4gVGhhdCBpcywgdGhlIGdhaW5zIGFyZSBsYXJnZXIgYW5kIHRoZSBsb3NzZXMgYXJlIGxhcmdlciB3aGVuIGludmVzdGluZyBpbiBjYWxsIG9wdGlvbnMgb24gYSBzdG9jayBpbnN0ZWFkIG9mIHRoZSBzdG9jayBpdHNlbGYuCkRldGVybWluaW5nIHN3YXAgcGF5bWVudHMKCkwxMS43IEFzc3VtZSB0aGF0LCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzY2hvb2wgdGVybSwgeW91IGVuZ2FnZWQgaW4gYSBmaXhlZC1mb3ItZmxvYXRpbmcgcmF0ZSBzd2FwIGluIHdoaWNoIHlvdSBhZ3JlZWQgdG8gcGF5IDYgcGVyY2VudCBpbiBleGNoYW5nZSBmb3IgdGhlIHByZXZhaWxpbmcgMjYtd2VlayBULWJpbGwgcmF0ZSB0aGF0IGV4aXN0cyBhdCB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybS4gQXNzdW1lIHRoYXQgeW91ciBzd2FwIGFncmVlbWVudCBzcGVjaWZpZXMgdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0gYXMgdGhlIG9ubHkgdGltZSBhdCB3aGljaCBhIHN3YXAgd2lsbCBvY2N1ciBhbmQgdGhhdCB0aGUgbm90aW9uYWwgYW1vdW50IGlzICQxMCBtaWxsaW9uLiBEZXRlcm1pbmUgdGhlIGFtb3VudCB0aGF0IHlvdSBvd2Ugb24gdGhlIHN3YXAsIHRoZSBhbW91bnQgeW91IGFyZSBvd2VkIG9uIHRoZSBzd2FwLCBhbmQgdGhlIGRpZmZlcmVuY2UuIERpZCB5b3UgZ2FpbiBvciBsb3NlIGFzIGEgcmVzdWx0IG9mIHRoZSBzd2FwPwpNZWFzdXJpbmcgYW5kIGV4cGxhaW5pbmcgZXhjaGFuZ2UgcmF0ZSBtb3ZlbWVudHMKCkwxMS44IERldGVybWluZSB0aGUgcGVyY2VudGFnZSBjaGFuZ2UgaW4gdGhlIHZhbHVlIG9mIHRoZSBCcml0aXNoIHBvdW5kIG92ZXIgdGhlIHNjaG9vbCB0ZXJtLiBEaWQgdGhlIHBvdW5kIGFwcHJlY2lhdGUgb3IgZGVwcmVjaWF0ZSBhZ2FpbnN0IHRoZSBkb2xsYXI/CgoKSW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Nob29sIHRlcm0gb25lIEJyaXRpc2ggUG91bmQgY29zdGVkIDEsMjcgVVNECkluIHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtIG9uZSBCcml0aXNoIFBvdW5kIGNvc3RlZCAxLDM0IFVTRApUaGUgQnJpdGlzaCBQb3VuZCBhcHByZWNpYXRlZAoKCmBgYHtyfQooMS4zNC0xLjI3KS8xLjI3CmBgYAo9IDAsMDU1MTIgPSA1LDUxMiUKCkwxMS45IERldGVybWluZSB0aGUgcGVyY2VudGFnZSBjaGFuZ2UgaW4gdGhlIHZhbHVlIG9mIHRoZSBKYXBhbmVzZSB5ZW4gb3ZlciB0aGUgc2Nob29sIHRlcm0uIERpZCB0aGUgeWVuIGFwcHJlY2lhdGUgb3IgZGVwcmVjaWF0ZSBhZ2FpbnN0IHRoZSBkb2xsYXI/CkluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjaG9vbCB0ZXJtIG9uZSBKYXBhbmVzZSBZZW4gY29zdGVkIDAsMDA2NCBVU0QKSW4gdGhlIGVuZCBvZiB0aGUgc2Nob29sIHRlcm0gb25lIEphcGFuZXNlIFllbiBjb3N0ZWQgMCwwMDcwIFVTRApUaGUgSmFwYW5lc2UgWWVuIGFwcHJlY2lhdGVkCmBgYHtyfQooMC4wMDcwLTAuMDA2NCkvMC4wMDY0CmBgYAoKID0gMCwwOTM3NSA9IDksMzglCgoKTDExLjEwIERldGVybWluZSB0aGUgcGVyY2VudGFnZSBjaGFuZ2UgaW4gdGhlIHZhbHVlIG9mIHRoZSBNZXhpY2FuIHBlc28gb3ZlciB0aGUgc2Nob29sIHRlcm0uIERpZCB0aGUgcGVzbyBhcHByZWNpYXRlIG9yIGRlcHJlY2lhdGUgYWdhaW5zdCB0aGUgZG9sbGFyPwpJbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzY2hvb2wgdGVybSB0aGUgTWV4aWNhbiBQZXNvIGNvc3RlZCAwLDU5IFVTRApJbiB0aGUgZW5kIG9mIHRoZSBzY2hvb2wgdGVybSB0aGUgTWV4aWNhbiBQZXNvIGNvc3RlZCAwLDUxIFVTRApUaGUgTWV4aWNhbiBQZXNvIGRlcHJlY2lhdGVkCmBgYHtyfQooMC41MS0wLjU5KS8wLjU5CmBgYAoKPSAtMCwxMzU1OSA9IC0xMyw1NiUKCgpMMTEuMTEgRGV0ZXJtaW5lIHRoZSBwZXIgdW5pdCBnYWluIG9yIGxvc3MgaWYgeW91IGhhZCBwdXJjaGFzZWQgQnJpdGlzaCBwb3VuZCBmdXR1cmVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlcm0gYW5kIHNvbGQgQnJpdGlzaCBwb3VuZCBmdXR1cmVzIGF0IHRoZSBlbmQgb2YgdGhlIHRlcm0uCgoKSW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Nob29sIHRlcm0gb25lIEJyaXRpc2ggUG91bmQgY29zdGVkIDEsMjcgVVNECkluIHRoZSBlbmQgb2YgdGhlIHNjaG9vbCB0ZXJtIG9uZSBCcml0aXNoIFBvdW5kIGNvc3RlZCAxLDM0IFVTRApHYWluIG9yIGxvc3MgcGVyIHVuaXQKYGBge3J9CjEuMzQtMS4yNwpgYGAKCiA9IDAsMDcgVVNEClRoYXQgcmVwcmVzZW50cyBhIGdhaW4gb2YgJDAsMDcgcGVyIEJyaXRpc2ggUG91bmQKCgpMMTEuMTIgR2l2ZW4gdGhhdCBhIHNpbmdsZSBmdXR1cmVzIGNvbnRyYWN0IG9uIEJyaXRpc2ggcG91bmRzIHJlcHJlc2VudHMgNjIsNTAwIHBvdW5kcywgZGV0ZXJtaW5lIHRoZSBkb2xsYXIgYW1vdW50IG9mIHlvdXIgZ2FpbiBvciBsb3NzLgoKClRvIGNhbGN1bGF0ZSB0aGUgZG9sbGFyIGFtb3VudCBvZiBnYWluIG9yIGxvc3Mgd2UgbXVzdCBtdWx0aXBsaWNhdGUgdGhlIGFtb3VudCBvZiBHQlAgcGVyIHRoZSBnYWluIG9yIGxvc3MgcGVyIEJyaXRpc2ggUG91bmQgaW4gVVNECkNhbGN1bGF0aW9uOiAKCmBgYHtyfQo2MjUwMCowLjA3CmBgYAoKID0gJDQgMzc1CgoKTDEyIENhcGl0YWwgcmVxdWlyZW1lbnRzCkwxMi4xIENhbGN1bGF0ZSB0aGUgb3BlcmF0aW9uYWwsIG1hcmtldCBhbmQgY3JlZGl0IHJpc2sgY2FwaXRhbCByZXF1aXJlbWVudHMgZm9yIEJhbmsgb2YgQW1lcmljYSBhbmQgRGV1dHNjaGUgQmFuayBhcyBvZiBEZWNlbWJlciAzMSwgbGFzdCB5ZWFyLCB3aGljaCBiYW5rIGhhcyBhIGJldHRlciBjYXBpdGFsIGJhc2U/CgoKCgpCYW5rIG9mIEFtZXJpY2EgKEJvQSk6CgoKQ29tbW9uIEVxdWl0eSBUaWVyIDEgKENFVDEpIENhcGl0YWwgUmF0aW86IDExLjglCgoKRGV1dHNjaGUgQmFuazoKCgpDb21tb24gRXF1aXR5IFRpZXIgMSAoQ0VUMSkgQ2FwaXRhbCBSYXRpbzogMTMuNyUKUmlzay13ZWlnaHRlZCBBc3NldHMgKFJXQSk6IOKCrDM1MCBiaWxsaW9uCk9wZXJhdGlvbmFsIFJpc2sgUldBOiDigqw1NyBiaWxsaW9uCkNyZWRpdCBSaXNrIGFuZCBNYXJrZXQgUmlzayBSV0E6IFJlbWFpbmluZyBhbW91bnRzIGFmdGVyIG9wZXJhdGlvbmFsIFJXQSBkZWR1Y3Rpb24uCkNvbXBhcmlzb24KCgpDRVQxIFJhdGlvczoKRGV1dHNjaGUgQmFuazogMTMuNyUKQm9BOiAxMS44JQoKCkJldHRlciBDRVQxIFJhdGlvOiBEZXV0c2NoZSBCYW5rLCBpbmRpY2F0aW5nIGEgc3Ryb25nZXIgY2FwaXRhbCBwb3NpdGlvbiByZWxhdGl2ZSB0byByaXNrLXdlaWdodGVkIGFzc2V0cy4KQnJlYWtkb3duIG9mIFJpc2tzIChEZXV0c2NoZSBCYW5rKToKT3BlcmF0aW9uYWwgUmlzazog4oKsNTcgYmlsbGlvbi4KUmVtYWluaW5nIFJXQSAobGlrZWx5IHNwbGl0IGJldHdlZW4gQ3JlZGl0IGFuZCBNYXJrZXQgUmlzayk6IOKCrDI5MyBiaWxsaW9uLgoK