# - inputs: none
# - outputs: all sources coming from data, research and guesswork
chunk_sources <- function(){
###############################################################################
###############################################################################
#############
##### Setup
#############
nsims_so <- 1e4
rescale_so <- FALSE
policy_estimate_so <- "a3_inc_a2_all_sim"
run_sim_so <- FALSE
main_run_so <- TRUE
periods_so <- 50 #Total number of periods to forecast wages
costs_temp_so <- 1
main_pe_so <- 289.8
#############
##### Data
#############
# ATTENTION!
# costs2_ea_in
ex_rate_so <- 74 #Exchange Rate - Central Bank of Kenya 74 , 85
ex_rate_2018_so <- 101.30 # Exchange rate (KES per international $)
# - https://data.worldbank.org/indicator/PA.NUS.FCRF?locations=KE
ex_rate_2018_ppp_so <- 50.058 # KLPS4_E+_globals.do (originally from the World Bank)
ex_rate_2017_ppp_so <- 49.773 # KLPS4_E+_globals.do (originally from the World Bank)
growth_rate_so <- 1.52/100 #Per-capita GDP growth, 2002-2011 (accessed 1/29/13) - World Bank - see notes
gov_bonds_so <- 0.1185 #Kenyan interest on sovereign debt - Central Bank of Kenya
gov_bonds_new_so <- 0.09
inflation_so <- 0.02 #Kenyan inflation rate - World Bank Development Indicators
inflation_new_so <- 0.04
tax_so <- 0.16575 #ADD INFO!
# costs data
df_costs_so <- read_excel("rawdata/data/DtW Cost per Child Data.xlsx",
sheet = "DtW Costs")
# crosswalk data on region and country
df_costs_cw_so <- read_excel("rawdata/data/DtW Cost per Child Data.xlsx",
sheet = "state_country")
# data on number of treated children
df_counts_so <- read_excel("rawdata/data/DtW Cost per Child Data.xlsx",
sheet = "DtW Treatment #s")
# Prevalence data:
# original study
# Any infection on original study
#prevalence_0_so <- c("hookworm" = 0.77, "roundworm" = 0.42, "whipworm" = 0.55,
# "Schisto mansoni" = 0.22) # from Draft Cost-Effectiveness Model.xlsx ADD ORIGINAL SOURCE
df_prevalence_so <- read_excel("data/prevalence_data.xlsx",
sheet = "Sheet1")
# prevalence_0_so <- c("hookworm" = 0.77, "roundworm" = 0.42, "whipworm" =0.55, "Schisto mansoni" = 0.22) # from Draft Cost-Effectiveness Model.xlsx ADD ORIGINAL SOURCE
new_costs_so <- NULL
country_sel_so <- list("india", "kenya", "nigeria", "vietnam")
country_sel_pop_so <- c(
"india" = 1.366417750 * 1e9,
"kenya" = 5.257397 * 1e7,
"nigeria" = 2.0096360 * 1e8,
"vietnam" = 9.646211 * 1e7
)
#https://data.worldbank.org/indicator/SP.POP.TOTL
# options: "a1_tax_sim","a1_x_tax_sim","a1_all_sim", "a1_x_all_sim", "a2_tax_sim",
# "a2_all_sim", "a3_inc_a1_all_sim", "a3_inc_a1_all_x_sim", "a3_inc_a2_all_sim"
#############
##### Research
#############
df_research_so <- read_csv("rawdata/research/research_params.csv")
lambda1_so <- c(3.49, 0) #Hrs per week increase for men and women, table 3, row 1, cols 2 & 3
lambda1_sd_so <- c(1.42, 1.36) #table 3, row 2, cols 2 & 3
lambda1_new_so <- c(79.51) # avg treatment effect from klps2-4 (already adjusted for ppp and inflation) - w@w
lambda1_new_sd_so <- c(76) # ADD SOURCE
lambda2_so <- 10.2 #Externality effect (proportional) - Table 3, row 1 col 4
lambda2_sd_so <- 7.8 # Table 3, row 2 col 4
#This is are the parameters labeled eta in the doc
prevalence_0_so <- 0.92 # 0.92 doi: https://doi.org/10.1111/j.1468-0262.2004.00481.x location: table 2, row 6, column 1
wage_ag_so <- 11.84 #Mean hourly wage rate (KSH) - Suri 2011
wage_ww_so <- 14.5850933 #Control group hourly wage, ww (cond >=10 hrs per week) - Table 4, Panel B (Source data took the log, here we recover it)
profits_se_so <- 1766 #Control group monthly self-employed profits -
#Table 4, Panel C, Column 5, Row 1
#FIX: MOST REFERENCES FROM TABLE 4 ARE TABLE 3
hours_se_cond_so <- 38.1 #Control group weekly self-employed hours, conditional on hrs >0 - Table D13, Panel D
hours_ag_so <- 8.3 #Control group hrs per week, agriculture - Table 3, Panel B
hours_ww_so <- 6.9 #Control group hrs per week, working for wages - Table 3, Panel B
hours_se_so <- 3.3 #Control group hrs per week, self-employment - Table 3, Panel B
coef_exp_so <- c(0.1019575, -0.0010413) #Years of experience coefficients (1-linear, 2-cuadratic)
#- see notes(0.1019575, -0.0010413), (0,0)
coverage_so <- 0.681333333 # (R) Fraction of treated primary school students within 6 km - from W@W - see note
q_full_so <- 0.75 #Take up rates with full subsidy. From Miguel and Kremmer (2007)
q_zero_so <- 0 #Take up rates with zero subsidy. From Miguel and Kremmer (2007)
delta_ed_so <- c(-0.00176350949079451, 0.00696052250263997, 0.0258570306763183, # (Delta E) Additional direct secondary schooling increase (from Joan)
0.0239963665555466, 0.027301406306074, 0.0234125454594173,
0.0279278879439199, 0.00647044449446303, 0.00835739437790601)
delta_ed_so <- cbind(delta_ed_so, 1999:2007)
delta_ed_par_so <- 1
delta_ed_ext_par_so <- 1
delta_ed_ext_so <- c(-0.0110126908021048, 0.0140448546741008, -0.0034636291545585, #Additional externality secondary schooling increase (from Joan)
0.0112940214439477, 0.0571608179771775, -0.0560546793186931,
0.0558284756343451, 0.1546264843901160, 0.0055961489945619)
delta_ed_ext_so <- cbind(delta_ed_ext_so, 1999:2007)
include_ext_so <- TRUE
teach_sal_so <- 5041 #Yearly secondary schooling compensation 5041 - from ROI materials
teach_ben_so <- 217.47 #Yearly secondary schooling teacher benefits 217.47
teach_sal_new_so <- (50000 * 12 / 49.773)
teach_ben_new_so <- 0
#Monthly secondary schooling compensation (in 2017 KES) overestimated to account for benefits -
#news sources * 12 / ex_rate_2017_ppp_so
# https://www.tuko.co.ke/287766-secondary-school-teachers-salary-kenya.html
# https://www.standardmedia.co.ke/article/2001249581/windfall-for-teachers-as-tsc-releases-new-salaries
cpi_2018_so <- 251.10 # KLPS4_E+_globals.do (originally from the Bureau of Labor Statistics)
cpi_2017_so <- 245.120 # KLPS4_E+_globals.do (originally from the Bureau of Labor Statistics)
teach_sal_2017usdppp_so <- teach_sal_new_so * cpi_2017_so / cpi_2017_so # redundant, but for the sake of consistency
n_students_so <- 45 #Average pupils per teacher 45
#ATTENTION!
years_of_treat_0_so <- 2.41 #Additional Years of Treatment - Table 1, Panel A
unit_cost_local_so <- 43.66 #Deworm the World
unit_cost_so <- 0.42 # Unit cost of deworming (in 2018 USD) - from Evidence Action
#CALCULATIONS TO CONVERT ALL CURRENCY TO 2017 USD PPP
unit_cost_ppp_so <- unit_cost_so*ex_rate_2018_so/ex_rate_2018_ppp_so
unit_cost_2017usdppp_so <- unit_cost_ppp_so * cpi_2017_so / cpi_2018_so # 0.8296927
# Adjust for inflation: convert all costs to 2017 USD
# Move this calculations into the body of the document (and outside of the sources chunk)
costs_par_so <- 1
costs_par_sd_so <- 0.1
counts_par_so <- 1
counts_par_sd_so <- 0.1
#############
##### Guess work
#############
# ATTENTION!
# prevalence_r_in
prevalence_r_so <- c("india" = 0.5665, "kenya" = 0.345, "nigeria" = 0.27, "vietnam" = 0.145) #0.5665 0.5013121
# based on https://docs.google.com/spreadsheets/d/1drKdU-kRjlRtwXq6nCqFC6gcoQ-eOaLfT9MWHSMZ0MA/edit?usp=sharing
new_prevalence_r_so <- NULL
years_of_treat_t_so <- 2.41 #Years of Treatment in new setting
staff_time_so <- 0.3 #Added Deworming costs due to government staff time
time_to_jm_so <- 10 #Time from initial period until individual join the labor force
# Fix teach_sal_so
return( sapply( ls(pattern= "_so\\b"), function(x) get(x)) )
###############################################################################
###############################################################################
}
invisible( list2env(chunk_sources(),.GlobalEnv) )
#############
##### Notes:
#############
# on growth_rate_so: (http://data.worldbank.org/indicator/NY.GDP.PCAP.KD/), see calculation
# on "Kenya GDP per capita" tab. In W@W this equals 1.52%. ISSUE: This growth number should
# be updated to be 2002-2014, I think.
#
# on coef_exp_so: 1998/1999 Kenyan labor force survey; regression of earnings on age, age^2,
# female dummy, indicators for attained primary/secondary/beyond, and province dummies.
# Estimate used in W@W: (0.1019575, -0.0010413). ISSUE: For now assume no further life cycle
# adjustment beyond KLPS-3 (likely a conservative assumption).
#
# coverage_so: Overall Saturation (0.511) / 0.75 - not reported in table, average of T & C
Executive Summary
This report is part of an Open Policy Analysis (OPA) on deworming interventions. An OPA is a policy analysis that emphasizes high levels of transparency and reproducibility. It contains one open output that best represents the facts to inform policy makers, one report (this document) that clearly explains all the analysis, and one repository that contains all the materials to reproduce the report and final output.
This report describes three approaches to compute the net present value of mass deworming interventions. The first two approaches are exact reproductions from previous research (Baird et al. 2016; Hamory et al. 2020), and the third approach is a combination of the previous two with some modification suggested by Evidence Action, a key policy partner in this area. This third approach uses the same benefits as the previous approaches and adjusts for different costs, prevalence rates and length of treatment across settings. We suggest that this final approach should be used as the best available policy estimate to compare costs and benefits of deworming in different settings.
The main policy estimate predicts that a mass deworming intervention will have a net present value (comparison of stream of benefits and costs from today’s perspective) of 289.8 for a setting with average prevalence and average unit costs (among the countries where Evidence Action has data for). Readers interested in learning about the predicted value for a specific setting are encourage to use the interactive app components of this OPA.
*
Open Policy Analysis
This report is part of an Open Policy Analysis (OPA) project on deworming interventions. A framework for making policy analyses transparent and reproducible (Hoces de la Guardia, Grant, and Miguel 2020), OPA’s goal is to clearly show how an analysis was conducted and how to best represent key figures or results for policy makers to use as a factual basis for deliberation. In addition, OPA facilitates the re-use of analyses across similar settings, and sheds light on how evidence generated by research is used in specific policy analyses.
This OPA project contains three components, following the OPA principles laid out in the aforementioned paper:
One single output that best represents the factual information required by policy makers to inform their position regarding a policy of mass deworming. This output is presented in Figure 0.1, and described in the results section of this report. The connection between each component of the analysis and the final output can be explored interactively in this web app.
This detailed report that describes how to obtain the policy estimate and describes each component of the analysis.
A repository that contains all the materials needed to reproduce the analysis with minimal effort (report and interactive app).
This report provides a complete description of the analysis behind the results presented to inform a policy discussion on deworming interventions. It describes how to reproduce the analysis in its entirety, and includes all the methodological choices involved. In order to document all the steps without overwhelming the reader, the report is displayed in a layered fashion. The first layer consists of a narrative description of the analysis. The second layer, that appear after clicking in the
contains equations that show how each piece of the analysis was carried out. And the third and final layer displays the code used to operationalize each equation. All this information is contained in this document using dynamic documentation (Xie 2015), so interested readers can access the source file of the report and reproduce the entire document in their own computing environments.
Introduction
Parasitic worm infections, also known as soil-transmitted helminths (STH) and schistosomiasis, are endemic in many countries across the globe, disproportionately affecting the poor. These parasitic worms interfere with regular bodily processes by decreasing nutrient uptake and can thus lead to serious consequences on human health, education outcomes, and long-term economic well being. In particular, evidence indicates that these worms contribute to malnourishment, impairment of mental and physical development, lower school attendance, and decreased wages (Croke 2014; Miguel and Kremer 2004; Baird et al. 2016).
Evidence from previous mass deworming interventions has demonstrated to be a highly effective public health policy. Here we provide a policy analysis that compares benefits and costs of deworming across different settings, allowing for the translation of research findings into different policy-relevant scenarios.
The goals of this OPA are three. First, to increase the transparency and reproducibility behind existing policy analyses on the costs and benefits of mass deworming programs. Second, to update this policy analyses with input from stakeholders closely involved in policy making around deworming. And third, to illustrate how an open policy analysis framework can be implemented in practice.
The Cost Benefit Analysis (CBA) of deworming is computed using three different approaches:
- Reproducing the original CBA produced by Baird et al. (2016), which estimates the net present value of a Kenya school-based deworming program after a 10 year follow-up for four different policy estimates.
- Reproducing an updated version of such analysis on the same intervention but with additional follow-up data (Hamory et al. 2020).
- Producing a new analysis that, building from the previous two approaches, focuses on one specific policy estimate, and allows for results to vary depending on key characteristics of current settings where deworming policies are being implemented. This new approach was developed in consultation with a key stakeholder in this area, the non-governmental organization (NGO) Evidence Action (EA).
Methodology
We first describe the common elements across all three approaches, and then describe each approach in detail.
Common structure
The starting point is a comparison of a stream of benefits and costs over the lifetime of the recipients of deworming. The final policy estimate is the discounted sum of all costs and benefits, known as the Net Present Value (NPV).
Show all the details
\[\begin{equation}
NPV = B - C \\
\end{equation}\]
Where:
- \(NPV\): net present value of the deworming treatment
- \(B\): benefits of the deworming treatment
- \(C\): costs of the deworming treatment
Benefits are equal to the additional lifetime earnings that individuals are expected to generate due to deworming treatment. These additional earnings are computed as a discounted sum over their working lifetime.
Show all the details
\[\begin{equation}
B = \sum_{t=0}^{50}\left( \frac{1}{1 + r}\right)^{t} E_{t}
\label{eq:1}
\tag{1}
\end{equation}\]
Where:
- \(E_{t}\): earnings individuals are expected to generate at period t
- \(r\): real interest rate as the discounting rate
- \(t\): period t. Period 0 represents time of intervention. Individuals are assumed to enter the labor market 9 years after treatment.
At a high level all three approaches focus on the same type of benefits: the increase in incomes over the lifetime of beneficiaries of deworming. This is likely an under-estimate of the benefits as it does not quantify the non-pecuniary effects of improved health. The costs can be separated into direct costs of implementing and evaluating deworming programs, and indirect costs, such as additional costs to the education system as a result of increased child attendance, associated with the benefits of deworming.
The main differences in benefits across the three approaches have to do with how to predict the earnings profiles over a lifecycle, and how to account for differences in worm prevalence rates and length of treatment across settings. Approaches 1 and 2 use different earning profiles, and approach 3 combines both earning profiles and adjusts for possible differences in prevalence rates of worm infections and length of treatment.
The main differences in costs between scenarios have to do with a) whether indirect costs are included, and b) how to compute the relevant unit cost for the analysis. The first two approaches include indirect costs and use the unit costs of a specific country (Kenya) where the study was originally conducted, while the third approach does not include indirect costs and use unit costs of various countries from data provided by Evidence Action.
The discounting rate
All three approaches use the real interest rate (\(r\)) as the discounting rate. This is obtained from the interest rate on government bonds (\(i\)) minus the inflation rate (\(\pi\)).
Show all the details
\[\begin{equation}
r = \frac{1 + i}{1 + \pi} - 1 \\
r \approx i - \pi
\label{eq:2}
\tag{2}
\end{equation}\]
Where:
- \(r\): real interest rate as the discounting rate
- \(i\): interest rate on government bonds
- \(\pi\): inflation rate
The actual value varies across approaches depending on the time and country chosen. For example approach 1 uses the return from government bonds and the inflation rate in Kenya for the year 2016, while approaches 2 and 3 uses the values for the same country for the year 2019. This results in discount rates of 9.85% and 5% for approach 1 and, 2 and 3 respectively.
Approach 1: Baird et al. (2016)
In this first approach, the effect on earnings over the entire lifecycle is predicted by extrapolating the effects on hours worked by individuals in the original treatment group, ten years after the intervention.
Two types of results are presented: the total effect on earnings projected over a lifetime and the estimated fiscal effect due to the government collecting additional taxes on higher earnings. The effects are calculated in two scenarios: with and without externalities over the population of children who did not receive deworming interventions. In the original deworming study conducted in Kenya, there is evidence of epidemiological externalities for children who remained untreated but who attended treatment schools, as well as for children living near treatment schools. Externality effects may not be as relevant for current-day deworming programs since most programs are national programs that target all school-aged children (and in some cases, preschool-aged children) in at-risk areas.
Gains in earnings
Gains in earnings (\(\Delta W_{t}\)) are the result of multiplying expected earnings in a certain period (\(w_t\)) with the effects of deworming on worked hours. This effect can have two components: a direct effect of deworming on the individual (\(\lambda_1\)) and the indirect effect on earnings due to externalities (\(\lambda_2\)). The indirect effects are considered within the context of the treatment coverage and saturation.
Show all the details
\[\begin{equation}
\Delta W_{t} = w_{t}\left( \lambda_{1} + \frac{p \lambda_{2}}{R} \right)
\label{eq:3}
\tag{3}
\end{equation}\]
Where:
- \(w_t\): the earnings in period \(t\)
- \(\lambda_{1}\): the direct effects of deworming on earnings
- \(\lambda_{2}\): the indirect effects of deworming on earnings
- \(p\): saturation, measures the fraction of the population that is effectively using the treatment
- \(R\): coverage, defined as the fraction, among all neighboring schools (within 6 km), that belongs to the treatment group
Earnings over time
Wages in year \(t\) correspond to the initial weekly wage (\(w_0\)) adjusted by an economy-wide increase in salaries and by an increase in salaries due to additional experience at the individual level. The economy-wide wage adjustment is assumed to be equal to the per capita GDP growth (\(g\)) applied to the total number of years of work (\(Xp\)). The life cycle path for wages increases at decreasing rates (wages typically increase with more years of work, then decline later in a life cycle). It is assumed that individuals enter the labor force 10 years after the treatment period. Weekly wages are multiplied by 52 weeks to obtain the annual rate.
The initial wage in dollars (\(w_{0}\)) is a weighted average of wages for the control group in agriculture, working wage, and self-employed sectors (\(ag, ww, se\)). The weights correspond to the fraction of all the average worked hours dedicated to each sector (\(h\)).
The wage in agriculture comes from Suri (2011), whereas the working wage comes from the study data and is defined as an hourly wage for those who reported more than 10 hrs of work per week in the control group. The self-employed wage (\(w_{se}\)) was constructed as the reported monthly earnings from self-employed profits, divided by the reported weekly number of hours worked in self-employment for those who worked a positive number of hours (multiplied by 4.5 to obtain the monthly total).
The monthly self-employed profits and self-employed hours for the control group, for those with positive hours, also comes from study data (Page 1168, Table 4, Panel C, Column 5, Row 1). The measure of hours in self employment used to compute wages is different from the one used to compute the weights above. The first one captures hours of work among those actively employed in the self-employed sector, and the second captures the average hours of work as self-employed among all the population of working age in the sample (hence capturing the relative importance of the self employed sector in the economy).
Show all the details
The wages/earnings are determined by:
\[\begin{equation}
w_t = \text{#weeks} \times w_0 (1 + g)^{Xp}(1 + \hat{\beta_1} Xp + \hat{\beta_2} Xp^2) \quad \text{for } t=10, \dots, 50
\label{eq:4}
\tag{4}
\end{equation}\]
\[\begin{equation}
w_0 = \frac{1}{ex} \sum_{l \in \{ag, ww, se\}}w_{l}\alpha_{l}
\\ \quad \text{with: } \alpha_{l}= \frac{ h_{l}}{h_{ag} + h_{ww} + h_{se}}
\label{eq:5}
\tag{5}
\end{equation}\]
\[\begin{equation}
w_{se} = \frac{ \text{Monthly self-employed profits} }{4.5 \times E[h_{se}|h_{se}>0] }
\label{eq:6}
\tag{6}
\end{equation}\]
Where:
- \(w_t\): the weekly earnings in period \(t\)
- \(w_0\): the initial weekly earnings
- \(g\): per capita GDP growth
- \(Xp\): years of work
- \(\hat{\beta_1}\): coefficient estimate for \(Xp\)
- \(\hat{\beta_2}\): coefficient estimate for \(Xp^2\)
- \(ex\): exchange rate
- \(h\): average worked hours dedicated to each sector
- \(ag\): agriculture
- \(ww\): working wage
- \(se\): self-employed sectors
#inputs: wages (wage_ag_so, wage_ww_so) self employed income (profits_se_so,
# hours_se_cond_so) hours of work (hours_ag_so, hours_ww_so, hours_se_so),
# exchange rate (ex_rate_so), timing vars (periods_so, time_to_jm_so),
# growth rate (growth_rate_so), mincer coef (coef_exp_so[1], coef_exp_so[2])
#
#outputs: Starting wages: value (wage_0_in) and function (wage_0_f),
# Wage trajectory: value (wage_t_in) and function (wage_t_f).
chunk_wages <- function(){
################################################################################
################################################################################
#close to value from spreadsheet (Assumps&Panel A Calcs!B137 = 0.1481084),
#but I suspect diff due to computational precision
wage_0_f <- function(wage_ag_var,
wage_ww_var,
profits_se_var,
hours_se_cond_var,
hours_ag_var,
hours_ww_var,
hours_se_var,
ex_rate_var){
experience_aux <- 0:periods_so - time_to_jm_so
wage_se <- profits_se_var / (4.5 * hours_se_cond_var)
wage_ls <- c(wage_ag_var, wage_ww_var, wage_se)
alpha_ls <- c(hours_ag_var, hours_ww_var, hours_se_var) /
sum( c(hours_ag_var, hours_ww_var, hours_se_var) )
res1 <- 1/ex_rate_var * sum( wage_ls * alpha_ls )
return(res1)
}
wage_t_f <- function(wage_0_var,
growth_rate_var,
coef_exp1_var,
coef_exp2_var) {
experience_aux <- 0:periods_so - time_to_jm_so
res1 <- 52 * wage_0_var * ( ( 1 + growth_rate_var )^experience_aux ) *
( 1 + coef_exp1_var * experience_aux + coef_exp2_var *
(experience_aux^2) ) * ifelse(0:periods_so >= time_to_jm_so, 1, 0)
return(res1)
}
################################################################################
################################################################################
return(list("wage_0_f" = wage_0_f,
"wage_t_f" = wage_t_f))
}
invisible( list2env(chunk_wages(),.GlobalEnv) )
##### Execute values of the functions above when needed for the text:
wage_0_in <- wage_0_f(wage_ag_var = wage_ag_so,
wage_ww_var = wage_ww_so,
profits_se_var = profits_se_so,
hours_se_cond_var = hours_se_cond_so,
hours_ag_var = hours_ag_so,
hours_ww_var = hours_ww_so,
hours_se_var = hours_se_so,
ex_rate_var = ex_rate_so)
#close to value from spreadsheet (Calcs-Table 5!N21.. = 7.701634678),
#but I suspect diff due to computational precision
wage_t_in <- wage_t_f(wage_0_var = wage_0_in,
growth_rate_var = growth_rate_so,
coef_exp1_var = coef_exp_so[1],
coef_exp2_var = coef_exp_so[2])
Deworming effects: direct and externalities
The estimated impact of deworming on hours worked comes from Baird et al. (2016) and are estimated separately for men (\(\lambda_{1,male}\)) and women (\(\lambda_{1,female}\)). These two parameters are combined with a simple mean in the analysis.
The estimated externality effect (\(\lambda_{2}\)) reflects the additional hours worked due to individuals who did not receive the treatment but still saw reductions in the likelihood of infection due to lower worm prevalence in their community. Note that this parameter is not estimated by gender, so we repeat its value two times. All the components to the equation \ref{eq:7} come from Baird et al. (2016). The externalities effects are adjusted by the coverage and saturation of the original study.
Show all the details
\[\begin{equation}
\lambda_{1} = \frac{1}{2} \lambda_{1,male} + \frac{1}{2} \lambda_{1,female}\\
\label{eq:7}
\tag{7}
\end{equation}\]
Where:
- \(\lambda_1\): average impact of deworming on hours worked for both men and women
- \(\lambda_{1,male}\): average impact of deworming on hours worked for men
- \(\lambda_{1, female}\): average impact of deworming on hours worked for women
Coverage and saturation of the original study
The coverage (\(R\)) is defined as the fraction, among all neighboring schools (within 6 km), that were treated within the study. Since the treatment was applied to approximately two thirds of the population, \(R\) is set to: \(R = 0.68\).
The saturation of the intervention, \(p\), measures the fraction of the population that is effectively using the treatment. It is defined as a weighted average of the treatment take-up under a full subsidy for deworming and the take-up under zero subsidy.
For this setting Kremer and Miguel (2007) (Page 48, Table 1, Panel C, Col 1, Row 3) estimated that take-up with full subsidy (\(Q(full)\)) was 0.75. Miguel and Kremer (2004) (Table 3 and footnote 18) observed minimal to no take-up without subsidy (\(Q(0)\)), hence it is assigned the value of 0.
Show all the details
\[\begin{equation}
p = R \times Q(full) + (1 - R) \times Q(0)
\label{eq:8}
\tag{8}
\end{equation}\]
Where:
- \(p\): saturation, measures the fraction of the population that is effectively using the treatment
- \(R\): coverage, measures the fraction of the population that is effectively using the treatment
- \(Q(full)\): take-up with full subsidy
- \(Q(0)\): take-up without subsidy
# - inputs: coverage (coverage_so), take-up with full subsidy (q_full_so), and
# take-up with no subsidy (q_zero_so)
# - outputs: saturation (saturation_in)
chunk_coverage <- function(){
###############################################################################
###############################################################################
saturation_in_f <- function(coverage_var = coverage_so,
q_full_var = q_full_so,
q_zero_var = q_zero_so){
saturation_in <- coverage_so * q_full_so + ( 1 - coverage_so ) * q_zero_so
return(list("saturation_in" = saturation_in))
}
###############################################################################
###############################################################################
return(list("saturation_in_f" = saturation_in_f))
}
invisible( list2env(chunk_coverage(),.GlobalEnv) )
##### Execute values of the functions above when needed for the text:
saturation_in <- saturation_in_f()$saturation_in
# Computing values for inline text:
# pv_benef
# ├──── earnings_app1_f
# | ├──── delta_ed_final_f
# | ├──── saturation_in_f
# | └──── wage_t_f()
# | | └──── wage_0_f()
# | |
# | ├──── lambda1_in_f()
# | └──── lambda2_in_f()
# └──── interest_f()
earnings_no_ext_in <- earnings_app1_f(
wage_var = wage_t_in,
lambda1_var = lambda1_in[1],
saturation_var = saturation_in,
lambda2_var = 0,
coverage_var = coverage_so
)
earnings_yes_ext_in <- earnings_app1_f(
wage_var = wage_t_in,
lambda1_var = lambda1_in[1],
saturation_var = saturation_in,
lambda2_var = lambda2_in[1],
coverage_var = coverage_so
)
pv_benef_no_ext_in <- pv_benef_f(
earnings_var = earnings_no_ext_in,
interest_r_var = interest_in,
periods_var = periods_so
)
pv_benef_yes_ext_in <- pv_benef_f(
earnings_var = earnings_yes_ext_in,
interest_r_var = interest_in,
periods_var = periods_so
)
Assessing computational reproducibility of original results
Without externalities, the original analysis (Baird et al. (2016)) obtains a present value of benefits of 142.43 (table 5, column 3, and row 9). Including externalities, they obtain a present value of benefits of 766.81 (table 5, column 3, and row 12). Following the steps described in this section, this analysis obtains the same result (142.4258784 and 766.8143995 respectively without rounding).
Costs
The costs are a combination of direct costs of mass deworming (relative to the status quo, which is no subsidy for deworming) and indirect costs on the education system due to the additional time treated individuals spend in school.
Show all the details
\[\begin{equation}
C = \left( S_{2}Q(S_{2}) - S_{1}Q(S_{1}) \right) + K \sum_{t=0}^{50} \left( \frac{1}{1 + r}\right)^{t} \Delta \overline{E}_{t}(S1,S2)
\label{eq:9}
\tag{9}
\end{equation}\]
Where:
- \(S_2\): per-capita costs of deworming under the deworming intervention
- \(S_1\): per-capita costs of deworming if the government does not provide any additional resources for deworming
- \(Q(S_2)\): take-up under a mass deworming intervention
- \(Q(S_1)\): take-up without additional resources from the government
- \(K\): cost per student to get education
- \(\Delta \overline{E}_{t}(S1, S2)\): estimated increase in school attendance
# - inputs: periods (periods_so), additional education (delta_ed_final_in),
# discount rate (interest) (varies by approach), cost per student
# (cost_per_student_in), cost per treatment (s2_in), take-up with treatment
# (q2_in)
# - outputs: present value of all costs (pv_costs_f)
chunk_cost2 <- function(){
###############################################################################
###############################################################################
pv_costs_f <- function(
periods_var = periods_so,
delta_ed_var = delta_ed_final_in,
interest_r_var = NULL,
cost_of_schooling_var = cost_per_student_in,
s1_var = 0,
q1_var = 0,
s2_var = s2_in,
q2_var = q2_in) {
index_t <- 0:periods_var
# Effects over 9 years of education (post treatment)
delta_ed_s <- c(0, delta_ed_var, rep(0,41))
(s2_var * q2_var - s1_var * q1_var) +
sum( ( 1 / (1 + interest_r_var) )^index_t *
delta_ed_s * cost_of_schooling_var)
}
###############################################################################
###############################################################################
return(list("pv_costs_f" = pv_costs_f)) # Try to return only functions
}
invisible( list2env(chunk_cost2(),.GlobalEnv) )
##### Execute values of the functions above when needed for the text:
Direct costs: increase in deworming costs
Direct deworming costs (\(DC\)) are defined as the take-up under a mass deworming intervention (\(Q_{2}\)), times the per-capita costs of deworming under the intervention (\(S_{2}\)). These costs are compared to a status quo scenario where the government does not provide any additional resources for deworming. This analysis assumes that there is no subsidy for deworming under the status quo.
Complete subsidy to per capita costs of deworming
With complete subsidy, the relevant costs represent the total direct costs of deworming in USD. The take-up with full subsidy (\(Q_2\)) comes from a previous study (Kremer and Miguel 2007) and takes the value of 0.75.
Show all the details
\[\begin{equation}
S_{2} = \frac{\text{Cost per person per year (KSH)} }{ex}\times \text{Additional years of treatment} \\
\label{eq:10}
\tag{10}
\end{equation}\]
Indirect costs: additional years of education and its costs for government
As a result of deworming treatment, there is an estimated increase in school attendance, which is multiplied by the cost of education per student to calculate the additional indirect cost on the education system imposed by a treated individual. The additional costs on education are computed as follows: first compute a cost per student (\(K\)). This is calculated as the salary of the teacher plus benefits, divided by the average number of students per teacher. Second, the cost per student is multiplied by the estimated increase in school attendance (\(\Delta \overline{E}_{t}(S1,S2)\)). For this we use a series of estimated effects, including the additional direct increase in secondary schooling from 1999 to 2007 obtained from an additional analysis related to Baird et al. (2016). This series does not take into account the externality effects. To incorporate externality effects, we would need another series (from the same source) that estimates the additional secondary schooling increase due to the externality in order to add it to the original series.
Show all the details
\[\begin{equation}
K = \frac{\text{teacher salary} + \text{teacher benefits}}{\text{# Students}}
\label{eq:11}
\tag{11}
\end{equation}\]
# - inputs: teacher salary (teach_sal_so) and benefits (teach_ben_so), number
# of students (n_students_so), include externalities (include_ext_so), extra ed
# without ext (delta_ed_so), and extra ed due to ext (delta_ed_ext_so)
# - outputs: cost per student (cost_per_student_f), and total additional
# education (delta_ed_final_f)
chunk_edcosts <- function(){
###############################################################################
###############################################################################
cost_per_student_f <- function(teach_sal_var = teach_sal_so,
teach_ben_var = teach_ben_so,
n_students_var = n_students_so) {
(teach_sal_var + teach_ben_var) / n_students_var
}
delta_ed_final_f <- function(include_ext_var = include_ext_so,
delta_ed_var = delta_ed_so,
delta_ed_ext_var = delta_ed_ext_so){
if (include_ext_var == TRUE){
delta_ed_final_in <- delta_ed_ext_var[,1] + delta_ed_var[,1]
}else{
delta_ed_final_in <- delta_ed_var[,1]
}
return(delta_ed_final_in)
}
###############################################################################
###############################################################################
return(list("cost_per_student_f" = cost_per_student_f,
"delta_ed_final_f" = delta_ed_final_f))
}
invisible( list2env(chunk_edcosts(),.GlobalEnv) )
##### Execute values of the functions above when needed for the text:
cost_per_student_in <- cost_per_student_f()
delta_ed_final_no_ext_in <- delta_ed_final_f(include_ext_var = FALSE)
delta_ed_final_yes_ext_in <- delta_ed_final_f(include_ext_var = TRUE)
# Computing values for inline text:
# pv_costs_f
# ├──── delta_ed_final_f
# ├──── interest_f
# └──── cost_per_student_f
# | └──── x
# ├──── s2_f
# └──── lambda2_in_f
pv_cost_no_ext_in <- pv_costs_f(
periods_var = periods_so,
delta_ed_var = delta_ed_final_no_ext_in,
interest_r_var = interest_in,
cost_of_schooling_var = cost_per_student_in,
s1_var = 0,
q1_var = 0,
s2_var = s2_in,
q2_var = q_full_so
)
pv_cost_yes_ext_in <- pv_costs_f(
periods_var = periods_so,
delta_ed_var = delta_ed_final_yes_ext_in,
interest_r_var = interest_in,
cost_of_schooling_var = cost_per_student_in,
s1_var = 0,
q1_var = 0,
s2_var = s2_in,
q2_var = q_full_so
)
Assessing computational reproducibility of original results
Without externalities, the original analysis (Baird et al. (2016)) obtains a present value of costs of 11.78 (table 5, column 3, and adding rows 6 and 3). Including externalities, they obtain a present value of benefits of 25.2 (table 5, column 3, and adding rows 6 and 3 and 7). Following the steps described in this section, this analysis obtains the same result (11.7761881 and 25.1962131 respectively without rounding).
Approach 2: Hamory et al. (2020)
In this second approach, benefits follow the same principle as in approach 1 (increase in lifetime earnings), but it uses updated data on the effects on the labor market outcomes. Instead of projecting a trend of earnings into the future (after the estimated impact of the 10 year follow-up), this analysis uses additional data from 15 and 20 year follow-ups after the original intervention. Costs are fairly similar to approach 1, with the addition that in this second approach, the costs also account for discounting of the several rounds of treatment required for effective deworming. Additionally, the interest rate is updated to current values of return on (Kenyan) government bonds and inflation.
Gains in earnings
Gains in earnings (\(\Delta W_{t}\)) from 10, 15, and 20 years after the intervention are used to measure the effect of multiple rounds of deworming on welfare over time. This is an important difference from approach 1, which only measures gains in earnings at year 10 and extrapolates them into the future. To extrapolate earnings after the 20-year measurement, the authors assume that the welfare gains disapear 25 years after the intervention. Hence the treatment effect over an individual’s working life is the sum of the treatment effects over their working lifetime. This approach also disregards externality effects and measures the estimated effects directly on earnings (as opposed to approach 1 that measures effects on earnings indirectly through hours worked). The estimated treatment effects that pools years 10, 15, and 20, is $80 dollars per person per year.
Gains in yearly earnings represent the treatment effect on welfare (\(\alpha^{pooled}\)), which implicitly takes into consideration the life cycle profile of wages, economywide growth, etc.
Show all the details
\[\begin{equation}
\Delta W_{t} = \mathbf{1}(10 < t \leq 25)\alpha^{pooled}
\label{eq:12}
\tag{12}
\end{equation}\]
Where:
- \(\Delta W_t\): gains in earnings from 10, 15, and 20 years after the intervention
- \(\alpha^{pooled}\): pooled estimated treatment effects of 10, 15, 20 years after the intervention
Costs
Direct costs: increase in deworming costs
Similar to approach 1, the direct deworming costs under approach 2 are calculated by comparing the costs under a complete subsidy to the costs under the status quo of no subsidy. The two main differences with the previous cost estimates are 1) now the direct costs are summed and discounted over the treatment period, and 2) cost data has been updated after gathering more recent figures from Evidence Action.
Show all the details
\[\begin{equation}
DC = \sum_{t=0}^{1.4} \left( \frac{1}{1 + r}\right)^{t} \big[S_{2}Q(S_{2}) - S_{1}Q(S_{1}) \big]
\label{eq:13}
\tag{13}
\end{equation}\]
Since the analysis is discrete, and we cannot sum over a non-integer, we find
\[\begin{equation}
DC = \big[S_{2}Q(S_{2}) - S_{1}Q(S_{1}) \big] + \left( \frac{1}{1 + r}\right)\big[S_{2}Q(S_{2}) - S_{1}Q(S_{1}) \big] + \\
.4\left( \frac{1}{1 + r}\right)^2 \big[S_{2}Q(S_{2}) - S_{1}Q(S_{1}) \big]
\label{eq:14}
\tag{14}
\end{equation}\]
Where:
- \(DC\): direct deworming costs
- \(r\): discounting rate, defined as the real interest rate
- \(S_2\): per-capita costs of deworming under the deworming intervention
- \(S_1\): per-capita costs of deworming if the government does not provide any additional resources for deworming
- \(Q(S_2)\): take-up under a mass deworming intervention
- \(Q(S_1)\): take-up without additional resources from the government
# - inputs: unit costs (unit_cost_local_so), exchange rate (ex_rate_so),
# new interest rate (interest_new_in)
# - outputs: total unit costs (s2_new_f)
chunk_unit_costs2_new <- function(){
###############################################################################
###############################################################################
s2_new_f <- function(
unit_cost_local_var = unit_cost_local_so,
ex_rate_var = ex_rate_so,
interest_var = interest_new_in,
year_of_treat_var = years_of_treat_t_so) {
unit_cost <- ( unit_cost_local_var / ex_rate_var )
periods_temp <- floor(year_of_treat_var)
part_of_last_year_temp <- round(year_of_treat_var - periods_temp, 1)
sum(
( unit_cost * (1 + interest_var)^(-(0:periods_temp)) ) *
c(rep(1,periods_temp), part_of_last_year_temp)
)
}
###############################################################################
###############################################################################
return(list("s2_new_f" = s2_new_f) )
}
invisible( list2env(chunk_unit_costs2_new(),.GlobalEnv) )
##### Execute values of the functions above when needed for the text:
# New costs are all in dollars so, will compute them using ex rate of 1.
s2_new_in <- s2_new_f(
interest_var = interest_new_in,
unit_cost_local_var = unit_cost_2017usdppp_so,
ex_rate_var = 1,
year_of_treat_var = years_of_treat_t_so
)
q2_in <- q_full_so
With complete subsidy, the costs of the intervention become the total direct costs of deworming each child (in USD). Most recent (2018) data from Evidence Action reveals this cost to be $0.42 per year. Adjusting for purchasing power and inflation, we get a per capita cost of $0.83. Adding all indirect cost over an average 2.4 years of treatment, the average cost of deworming each child over the entire treatment period is $1.44.
Indirect costs: additional years of education and its costs for government
The indirect cost on the education system is calculated similarly to approach 1: the cost per student is multiplied by the increase in school attendance due to deworming. The cost of additional schooling is given by the product of the annual cost of schooling each child and the number of additional years children attend school as a result of deworming. This analysis assumes that pressure is added to educational institutions for a maximum of nine years, starting at year zero. The cost per student (\(K\)) is updated with new information on annual teacher salary (including benefits), $12,055 (also adjusted for PPP), and the same average number of students per teacher (45).
Hence, the cost of schooling each child for an additional year is now $267.9 (USD).
Show all the details
\[\begin{equation}
K \sum_{t=0}^{8} \left( \frac{1}{1 + r}\right)^{t} \Delta \overline{E}_t(S1,S2)
\label{eq:15}
\tag{15}
\end{equation}\]
Where:
- \(K\): cost per student to get education
- \(\Delta \overline{E}_{t}(S1, S2)\): estimated increase in school attendance
Over this nine year period, treated students attended school for an additional 0.15 years on average. Then we get an average cost of additional schooling per child over the nine-year period, $32.40.
Assessing computational reproducibility of original results
The second approach does not report benefits and costs separatedly. With all these elements the main result from the original analysis that is comparable with the results discussed here is a NPV of 499.72 (table A12, column 3, and row 6) This result corresponds to a social internal rate of return of 40.7% located as an inline result in the paper - also in Figure 1 - and in the appendix at table A12, column 3, and row 9). Following the steps described in this section, this analysis obtains the same result (499.689353 and 40.7483155643791% respectively without rounding).
Accounting for Uncertainty
This open policy analysis has aimed to make all the analysis presented so far highly reproducible. One direct result of this novel approach is that now it is possible to thoroughly assess how the final policy estimates change when any of the underlying sources of the analysis changes. In this OPA we have identified each source used in the analysis behind benefits and costs of Deworming interventions. Each of these sources in turn is measured with some uncertainty (either in prediction of future values or estimation of past ones). Traditional policy analysis assumes that each of these sources has no uncertainty, and in some cases incorporates uncertainty or performed sensitivity analysis for a few parameters of interest. By following the open policy analysis principles we now can allow for each source to vary and explore the overall uncertainty of the final policy estimate.
Our approach consists in assuming that each source used in the analysis can be represented as a random draw from a normal distribution. The mean corresponds to the measured value. The standard deviation corresponds to the estimated standard error when available, and to a fraction of the mean when not available. As a default analysis we suggest to set it these standard deviations to 10% of the mean. This choice is arbitrary, but unlike the default arbitrary choice of setting the standard deviations to zero, it makes explicit the uncertainty and it can be modified in the app.
Show all the details
Let \(x\) denote each source used in this analysis.
\[\begin{equation}
x \sim N(\hat{x}, \sigma_{x})
\label{eq:20}
\tag{20}
\\
\sigma_{x} =
\begin{cases}
\hat{\sigma_{x}} \quad \text{If $\hat{\sigma_{x}}$ is available}\\
\\
\delta_{u}\hat{x} \quad \text{otherwise}
\end{cases}
\end{equation}\]
As a default \(\delta_{u} = 0.1\)
# This function takes as inputs means and standard deviations of source
# parameters and simualte draws of each source. When the source is a scalar,
# it generates a draw from a noromal dist (mean, sd). When it is a "small"
# (less than 4 elements) vector, generates independent multivariate normals.
#begin by cleaning up the cost data once
costs_data_in <- costs1_p1_f(df_costs_var = df_costs_so,
df_costs_cw_var = df_costs_cw_so,
df_counts_var = df_counts_so)
# Data: source comes from a standard data source. Government statistic or other
# publicly available statistic
# Research: any sources that requieres some type of investigation to obtain
# Guesswork: no clear source available
sim_data1_f <- function(nsims_var2 = 1e2, # "Setup" vars
main_run_var2,
periods_var2,
costs_data_var2 = costs_data_in,
run_sim_var2,
countries_var2,
ex_rate_var2, # "Data" vars
ex_rate_sd_var2,
growth_rate_var2,
growth_rate_sd_var2,
gov_bonds_var2,
gov_bonds_sd_var2,
gov_bonds_new_var2,
gov_bonds_new_sd_var2,
inflation_var2,
inflation_sd_var2,
inflation_new_var2,
inflation_new_sd_var2,
tax_var2,
tax_sd_var2,
lambda1_var2, # "Research" vars
lambda1_sd_var2,
lambda1_new_var2,
lambda1_new_sd_var2,
lambda2_var2,
lambda2_sd_var2,
wage_ag_var2,
wage_ag_sd_var2,
wage_ww_var2,
wage_ww_sd_var2,
profits_se_var2,
profits_se_sd_var2,
hours_se_cond_var2,
hours_se_cond_sd_var2,
hours_ag_var2,
hours_ag_sd_var2,
hours_ww_var2,
hours_ww_sd_var2,
hours_se_var2,
hours_se_sd_var2,
coef_exp_var2, # sd for coef_exp is hard coded
prevalence_0_var2,
prevalence_0_sd_var2,
prevalence_r_var2,
prevalence_r_sd_var2,
new_prevl_r_var2, # substitudes the prev_r above??
new_prevl_r_sd_var2,
coverage_var2,
coverage_sd_var2,
q_full_var2,
q_full_sd_var2,
q_zero_var2,
q_zero_sd_var2,
delta_ed_var2,
delta_ed_sd_var2,
delta_ed_ext_var2,
delta_ed_ext_sd_var2,
teach_sal_var2,
teach_sal_sd_var2,
teach_ben_var2,
teach_ben_sd_var2,
teach_sal_new_var2,
teach_sal_new_sd_var2,
teach_ben_new_var2,
teach_ben_new_sd_var2,
n_students_var2,
n_students_sd_var2,
years_of_treat_0_var2,
years_of_treat_0_sd_var2,
years_of_treat_t_var2,
years_of_treat_t_sd_var2,
unit_cost_local_var2,
unit_cost_local_sd_var2,
unit_cost_local_new_var2,
unit_cost_local_new_sd_var2,
costs_par_var2,
costs_par_sd_var2,
counts_par_var2,
counts_par_sd_var2,
staff_time_var2, # Guesswork
staff_time_sd_var2,
new_costs_var2,
new_costs_sd_var2
) {
start_time <- Sys.time()
################
###### Draws
################
set.seed(142857)
#Default dist: normal, default sd: 0.1* mean
#
# Sources are separated into: data, research and guess work
## Data
gov_bonds_sim <- rnorm(n = nsims_var2, mean = gov_bonds_var2,
sd = gov_bonds_sd_var2)
inflation_sim <- rnorm(nsims_var2, inflation_var2,
inflation_sd_var2)
gov_bonds_new_sim <- rnorm(n = nsims_var2, mean = gov_bonds_new_var2,
sd = gov_bonds_new_sd_var2)
inflation_new_sim <- rnorm(nsims_var2, inflation_new_var2,
inflation_new_sd_var2)
growth_rate_sim <- rnorm(nsims_var2, growth_rate_var2, growth_rate_sd_var2)
ex_rate_sim <- rnorm(nsims_var2, ex_rate_var2, ex_rate_sd_var2)
tax_sim <- rnorm(nsims_var2, tax_var2, tax_sd_var2)
## Research
aux1 <-0.1 * c(lambda1_var2[1], 0.01)
# Each list is a pair mean, sd.
aux2 <- lapply(1:2, function(x) c(lambda1_var2[x], c(1.42, 1.36)[x] ) )
lambda1_sim <- sapply(aux2,
function(x) rnorm(nsims_var2, mean = x[1], sd = x[2]) )
lambda2_sim <- rnorm(nsims_var2, lambda2_var2, lambda2_sd_var2)
# New lambda here
lambda1_new_sim <- rnorm(nsims_var2, lambda1_new_var2, lambda1_new_sd_var2)
wage_ag_sim <- rnorm(nsims_var2, wage_ag_var2, wage_ag_sd_var2)
wage_ww_sim <- rnorm(nsims_var2, wage_ww_var2, wage_ww_sd_var2)
profits_se_sim <- rnorm(nsims_var2, profits_se_var2, profits_se_sd_var2)
hours_se_cond_sim <- rnorm(nsims_var2, hours_se_cond_var2,
hours_se_cond_sd_var2)
hours_ag_sim <- rnorm(nsims_var2, hours_ag_var2, hours_ag_sd_var2)
hours_ww_sim <- rnorm(nsims_var2, hours_ww_var2, hours_ww_sd_var2)
hours_se_sim <- rnorm(nsims_var2, hours_se_var2, hours_se_sd_var2)
coverage_sim <- rnorm(nsims_var2, coverage_var2, coverage_sd_var2)
unit_cost_local_sim <- rnorm(nsims_var2, unit_cost_local_var2,
unit_cost_local_sd_var2)
unit_cost_local_new_sim <- rnorm(nsims_var2, unit_cost_local_new_var2,
unit_cost_local_new_sd_var2)
years_of_treat_0_sim <- rnorm(nsims_var2, years_of_treat_0_var2,
years_of_treat_0_sd_var2)
years_of_treat_t_sim <- rnorm(nsims_var2, years_of_treat_t_var2,
years_of_treat_t_sd_var2)
q_full_sim <- rnorm(nsims_var2, q_full_var2, q_full_sd_var2)
q_zero_sim <- rnorm(nsims_var2, q_zero_var2, q_zero_sd_var2)
# Prevalence here TO DO: draw from a beta instead of "truncated" normal
prevalence_0_sim <- rnorm(nsims_var2, prevalence_0_var2, prevalence_0_sd_var2)
prevalence_0_sim <- ifelse(
prevalence_0_sim > 1,
yes = 1,
no = ifelse(prevalence_0_sim < 0, yes = 0, no = prevalence_0_sim)
)
aux4 <- lapply(countries_var2, #will have trouble when selecting no countries
function(x) c(prevalence_r_so[x],
prevalence_r_so[x]) )
# first draw samples of prevalence for each country
prevalence_r_sim <- sapply(aux4,
function(x)
rnorm(
nsims_var2,
mean = x[1] * prevalence_r_var2,
sd = x[2] * prevalence_r_sd_var2
))
prevalence_r_sim <- ifelse(
prevalence_r_sim > 1,
yes = 1,
no = ifelse(prevalence_r_sim < 0, yes = 0, no = prevalence_r_sim)
)
colnames(prevalence_r_sim) <- as.character(countries_var2)
# if there is a new entry of prevalence, draw from it. If there is not
# then leave as null
if (!is.null(new_prevl_r_var2)){
new_prevl_r_sim <- rnorm(nsims_var2, new_prevl_r_var2, new_prevl_r_sd_var2)
new_prevl_r_sim <- ifelse(
new_prevl_r_sim > 1,
yes = 1,
no = ifelse(new_prevl_r_sim < 0, 0, new_prevl_r_sim)
)
} else if (is.null(new_prevl_r_var2)){
new_prevl_r_sim <- NULL
}
aux2 <- lapply(1:2, function(x) c(coef_exp_var2[x],c(0.001 , 0.001)[x]) )
coef_exp_sim <- sapply(aux2, function(x) rnorm(nsims_var2, mean = x[1],
sd = x[2]) )
teach_sal_sim <- rnorm(nsims_var2, teach_sal_var2, teach_sal_sd_var2)
teach_ben_sim <- rnorm(nsims_var2, teach_ben_var2, teach_ben_sd_var2)
teach_sal_new_sim <- rnorm(nsims_var2, teach_sal_new_var2,
teach_sal_new_sd_var2)
teach_ben_new_sim <- rnorm(nsims_var2, teach_ben_new_var2,
teach_ben_new_sd_var2)
n_students_sim <- rnorm(nsims_var2, n_students_var2, n_students_sd_var2)
# TO DO: modify to have a scalar multlying the series, and have that
# scalar being N(1,0.1)
delta_ed_sim <- sapply(delta_ed_so[,1],
function(x) rnorm(
nsims_var2,
mean = x * delta_ed_var2,
sd = delta_ed_sd_var2 * sd(delta_ed_so[, 1])) )
colnames(delta_ed_sim) <- 1999:2007
# modify to have a scalar multlying the series, and have that scalar
# being N(1,0.1)
delta_ed_ext_sim <- sapply(delta_ed_ext_so[,1],
function(x) {
rnorm(
nsims_var2,
mean = x * delta_ed_ext_var2,
sd = sd(delta_ed_ext_so[, 1]) *
delta_ed_ext_sd_var2
)
}
)
colnames(delta_ed_ext_sim) <- 1999:2007
counts_in <- costs_data_var2$total
costs_no_staff_in <- costs_data_var2$costs_by_country
# drawing samples form counts
costs1_counts_sim <- sapply(counts_in,
function(x) rnorm(nsims_var2,
mean = x * counts_par_var2,
sd = x * counts_par_sd_var2)
)
# drawing samples from costs
costs1_all_costs_sim <- sapply(costs_no_staff_in,
function(x) rnorm(nsims_var2,
mean = x * costs_par_var2,
sd = x * costs_par_sd_var2)
)
#computing unit cost for each simulation draw
costs1_df_sim <- NULL
#building "nsims_var2" simulated data sets (corresponding to costs_data_in)
for (aux1_i in 1:nsims_var2){
costs1_df_sim[[aux1_i]] <- data.frame(
"Country" = costs_data_var2$Country,
"total" = costs1_counts_sim[aux1_i,],
"costs_by_country" = costs1_all_costs_sim[aux1_i,]
)
}
temp_cost_sim <- rnorm(nsims_var2,
mean = new_costs_var2,
sd = new_costs_sd_var2)
## Guess work
# drawing samples from staff time
staff_time_sim <- rnorm(nsims_var2, staff_time_var2, staff_time_sd_var2)
periods_val <- 50 #Total number of periods to forecast wages
time_to_jm_val <- 10 #periods until individual join the labor force
######
######
################
###### Runs
################
#Vectors to store the results of each simulation
a1_tax_sim <- rep(NA, nsims_var2) #a1_tax_pe
a1_x_tax_sim <- rep(NA, nsims_var2) #a1_x_tax_pe
a1_all_sim <- rep(NA, nsims_var2) #a1_all_pe
a1_x_all_sim <- rep(NA, nsims_var2) #a1_x_all_pe
a2_tax_sim <- rep(NA, nsims_var2) #a2_tax
a2_all_sim <- rep(NA, nsims_var2) #a2_all
a3_inc_a1_all_sim <- rep(NA, nsims_var2) #a3_inc_a1_all
a3_inc_a1_all_x_sim <- rep(NA, nsims_var2) #a3_inc_a1_all_x
a3_inc_a2_all_sim <- rep(NA, nsims_var2) #a3_inc_a2_all_mpe
for (i in 1:nsims_var2) {
# one_run_f, for the most part, does not include standard deviations
invisible( list2env(
one_run_f(main_run_var1 = FALSE, # HERE I NEED TO PLUG costs1_costs_sim
run_sim_var1 = TRUE,
wage_ag_var1 = wage_ag_sim[i],
wage_ww_var1 = wage_ww_sim[i],
profits_se_var1 = profits_se_sim[i],
hours_se_cond_var1 = hours_se_cond_sim[i],
hours_ag_var1 = hours_ag_sim[i],
hours_ww_var1 = hours_ww_sim[i],
hours_se_var1 = hours_se_sim[i],
ex_rate_var1 = ex_rate_sim[i],
growth_rate_var1 = growth_rate_sim[i],
coef_exp_var1 = coef_exp_sim[i, 1], coef_exp2_var1 = coef_exp_sim[i,2],
lambda1_var1 = lambda1_in_f(lambda1_var = lambda1_sim[i,]),
prevalence_0_var1 = prevalence_0_sim[i],
prevalence_r_var1 = prevalence_r_sim[i, ],
new_prevl_r_var1 = new_prevl_r_sim[i],
lambda2_var1 = lambda2_sim[i],
coverage_var1 = coverage_sim[i],
q_full_var1 = q_full_sim[i],
q_zero_var1 = q_zero_sim[i],
lambda1_new_var1 = lambda1_new_sim[i],
gov_bonds_var1 = gov_bonds_sim[i],
inflation_var1 = inflation_sim[i],
gov_bonds_new_var1 = gov_bonds_new_sim[i],
inflation_new_var1 = inflation_new_sim[i],
delta_ed_var1 = cbind(delta_ed_sim[i,], 1999:2007),
delta_ed_ext_var1 = cbind(delta_ed_ext_sim[i,], 1999:2007),
teach_sal_var1 = teach_sal_sim[i],
teach_ben_var1 = teach_ben_sim[i],
teach_sal_new_var1 = teach_sal_new_sim[i],
teach_ben_new_var1 = teach_ben_new_sim[i],
n_students_var1 = n_students_sim[i],
unit_cost_local_var1 = unit_cost_local_sim[i],
unit_cost_local_new_var1 = unit_cost_local_new_sim[i],
years_of_treat_0_var1 = years_of_treat_0_sim[i],
years_of_treat_t_var1 = years_of_treat_t_sim[i],
tax_var1 = tax_sim[i],
periods_var1 = periods_so,
df_costs_var1 = costs1_df_sim[[i]],
new_costs_var1 = temp_cost_sim[i],
staff_time_var1 = staff_time_sim[i],
countries_var1 = countries_var2
),.GlobalEnv) ) # add costs here
#Baird 1: Costs = Baird w/tax and no externalities (no ext); Benef = Baird no ext
a1_tax_sim[i] <- NPV_pe_f(benefits_var = pv_benef_tax_nx_in, costs_var = costs2_in)
#Baird 2: Costs = Baird w/tax and yes externalities (no ext); Benef = Baird yes ext
a1_x_tax_sim[i] <- NPV_pe_f(benefits_var = pv_benef_tax_yx_in, costs_var = costs2_x_in)
# Baird 3: Benefits = Baird all and no ext; Costs = Baird no ext
a1_all_sim[i] <- NPV_pe_f(benefits_var = pv_benef_all_nx_in, costs_var = costs2_in)
# Baird 4: Benefits = Baird all and yes ext; Costs = Baird yes ext
a1_x_all_sim[i] <- NPV_pe_f(benefits_var = pv_benef_all_yx_in, costs_var = costs2_x_in)
#KLPS4_1: benefits = KLPS4 w/t and no ext; Costs = Baird no ext
a2_tax_sim[i] <- NPV_pe_f(benefits_var = pv_benef_tax_new_in, costs_var = costs_a2_in)
#KLPS4_2:benefits = KLPS4 all and no ext; Costs = Baird no ext
a2_all_sim[i] <- NPV_pe_f(benefits_var = pv_benef_all_new_in, costs_var = costs_a2_in)
# EA1: no externality NPV using EAs costs
a3_inc_a1_all_sim[i] <- NPV_pe_f(benefits_var = pv_benef_all_nx_prevl_in, costs_var = costs2_ea_in)
# EA2: yes externality NPV using EAs costs
a3_inc_a1_all_x_sim[i] <- NPV_pe_f(benefits_var = pv_benef_all_yx_prevl_in, costs_var = costs2_ea_in)
# EA3: benef= KLPS all and no ext; Costs=EA
a3_inc_a2_all_sim[i] <- NPV_pe_f(benefits_var = pv_benef_all_prevl_new_in, costs_var = costs2_ea_in)
}
total_time_sim <- Sys.time() - start_time
######
######
return( list(
"a1_tax_sim" = a1_tax_sim,
"a1_x_tax_sim" = a1_x_tax_sim,
"a1_all_sim" = a1_all_sim,
"a1_x_all_sim" = a1_x_all_sim,
"a2_tax_sim" = a2_tax_sim,
"a2_all_sim" = a2_all_sim,
"a3_inc_a1_all_sim" = a3_inc_a1_all_sim,
"a3_inc_a1_all_x_sim" = a3_inc_a1_all_x_sim,
"a3_inc_a2_all_sim" = a3_inc_a2_all_sim,
"total_time_sim" = total_time_sim
) )
}
policy_estimates_varnames <- c(
"a1_tax_sim",
"a1_x_tax_sim",
"a1_all_sim",
"a1_x_all_sim",
"a2_tax_sim",
"a2_all_sim",
"a3_inc_a1_all_sim",
"a3_inc_a1_all_x_sim",
"a3_inc_a2_all_sim"
)
policy_estimates_text <- c(
"A1. Tax revenue",
"A1. With externalities. Tax",
"A1. All income",
"A1. With ext. All income",
"A2. Tax",
"A2. All income",
"A3. All income of A1",
"A3. All income of A1, with ext.",
"A3. All income of A2. Main Policy Estimate"
)
Main Results
In this document we have presented three different approaches to measuring the welfare effects of deworming interventions. The first approach was based on the original paper that measured the welfare effects of deworming (Baird et al. (2016)) and proposed four different ways to compute this effect (with and without externalities, and from a societal or fiscal perspective). The second approach, based on more recent data, focused only on direct effects, and relies less on predictive effects over the lifecycle. Results for the second approach are also separated between the societal and fiscal perspective.
The third and final approach uses similar methodologies with three main differences. First, we allow the benefits to be scaled to account for differences in the prevalence of worm infections in settings different from the original study. Second, we allow the benefits to be scaled by the length of treatment provided to children within a particular setting. Finally, based on feedback from Evidence Action on the relevant costs from present-day deworming programs, this approach uses more up to date information on treatment costs and it does not take into account the knock-on effects of additional schooling costs as a result of increased school attendance, which are accounted for in approaches #1 and #2.
The table below summarises the three different approaches and the different alternatives within each approach. The main policy estimate is defined as that of Evidence Action (approach 3) using the latest research (Hamory et al. (2020)): approach 3.3 in the table (in bold).
Show all the details
# TODO: Wrap this code chunk in chunk_xxxfunction
#chunk_runvalues <- function(){
# Function dependency is depicted as follows:
# f(g()) =
# f
# └──── g
#
# ## ### #### #####
# 1 2 3 4 5
# ## ### #### #####
# NPV_pe_f
# ├──── pv_benef_f
# │ ├──── earnings_app1_f
# │ | ├──── wage_t_f
# │ | | └──── wage_0_f
# | | ├──── lambda_eff_f
# │ | | └────lambda1_t_f
# │ | | └────lambda1_in_f
# | | ├──── lambda1_in_f
# | | ├──── lambda2_in_f
# │ | └──── saturation_in_f
# │ ├──── earnings_app2_f
# │ | └────lambda_eff_f
# │ | └────lambda1_t_f
# │ └──── interest_f
# └──── pv_costs_f (pv_costs_f)
# ├──── delta_ed_final_f
# ├──── interest_f
# └──── s2_new_f
# | └──── costs1_p2_f
# | └──── costs1_p1_f
# ├──── s2_f
# └──── cost_per_student_f
# ## ### #### #####
# Approach 1
# NPV_pe_f --> a1_tax_pe
# └────pv_benef_f --> pv_benef_tax_nx_in
# | ├────earnings_app1_f --> earnings_no_ext_in * tax_var1
# | | ├────wage_t_f --> wage_t_in
# | | | └────wage_0_f --> wage_0_in
# | | ├────lambda1_in_f --> lambda1_in
# | | └────saturation_in_f --> saturation_in
# | └────interest_f --> interest_in
# |
# |
# └────pv_costs_f --> costs2_in
# ├────delta_ed_final_f --> delta_ed_final_in
# ├────cost_per_student_f --> cost_per_student_in
# ├────s2_f --> s2_in
# └────interest_f --> interest_in
# unit test function
unit_test_f <- function(to_test_var, original_var, main_run_var = TRUE){
if (main_run_var == TRUE) {
if (length(to_test_var) > 1) {
fails_test <- ( abs(sd(to_test_var) - original_var) > 0.0001 )
text_val <- sd(to_test_var)
} else {
fails_test <- ( abs(to_test_var - original_var) > 0.0001 )
text_val <- to_test_var
}
if (fails_test) {
print(paste("Output has changed at",
deparse(substitute(to_test_var) ),
" to ", text_val) )
}
}
}
# TODO: update values of unit test within one_run_f
# one run of all the steps to get one policy estimate
one_run_f <-
function(main_run_var1 = main_run_so,
run_sim_var1 = run_sim_so,
wage_ag_var1 = wage_ag_so,
wage_ww_var1 = wage_ww_so,
profits_se_var1 = profits_se_so,
hours_se_cond_var1 = hours_se_cond_so,
hours_ag_var1 = hours_ag_so,
hours_ww_var1 = hours_ww_so,
hours_se_var1 = hours_se_so,
ex_rate_var1 = ex_rate_so,
growth_rate_var1 = growth_rate_so,
coef_exp_var1 = coef_exp_so[1],
coef_exp2_var1 = coef_exp_so[2],
lambda1_var1 = lambda1_in_f(lambda1_var = lambda1_so),
prevalence_0_var1 = prevalence_0_so,
prevalence_r_var1 = prevalence_r_so,
new_prevl_r_var1 = new_prevalence_r_so,
lambda2_var1 = lambda2_so,
coverage_var1 = coverage_so,
q_full_var1 = q_full_so,
q_zero_var1 = q_zero_so,
lambda1_new_var1 = lambda1_new_so,
gov_bonds_var1 = gov_bonds_so,
inflation_var1 = inflation_so,
gov_bonds_new_var1 = gov_bonds_new_so,
inflation_new_var1 = inflation_new_so,
df_costs_var1 = costs_data_in,
staff_time_var1 = staff_time_so,
delta_ed_var1 = delta_ed_so,
delta_ed_ext_var1 = delta_ed_ext_so,
teach_sal_var1 = teach_sal_so,
teach_ben_var1 = teach_ben_so,
n_students_var1 = n_students_so,
teach_sal_new_var1 = teach_sal_new_so,
teach_ben_new_var1 = teach_ben_new_so,
unit_cost_local_var1 = unit_cost_local_so,
unit_cost_local_new_var1 = unit_cost_2017usdppp_so,
new_costs_var1 = new_costs_so,
countries_var1 = country_sel_so,
years_of_treat_0_var1 = years_of_treat_0_so,
years_of_treat_t_var1 = years_of_treat_t_so,
tax_var1 = tax_so,
periods_var1 = periods_so) {
####------------ Inputs for wage_t -----------------------------------------
wage_0_in <- wage_0_f(
wage_ag_var = wage_ag_var1,
wage_ww_var = wage_ww_var1,
profits_se_var = profits_se_var1,
hours_se_cond_var = hours_se_cond_var1,
hours_ag_var = hours_ag_var1,
hours_ww_var = hours_ww_var1,
hours_se_var = hours_se_var1,
ex_rate_var = ex_rate_var1
)
unit_test_f(wage_0_in, 0.170124466664436, main_run_var = main_run_var1)
###---------- Inputs for earnings_app1_f ---------------------------------------
wage_t_in <- wage_t_f(
wage_0_var = wage_0_in,
growth_rate_var = growth_rate_var1,
coef_exp1_var = coef_exp_var1,
coef_exp2_var = coef_exp2_var1
)
unit_test_f(wage_t_in, 17.8464946727946, main_run_var = main_run_var1)
lambda1_in <- lambda1_in_f(lambda1_var = lambda1_var1)
unit_test_f(lambda1_in[1], 1.745, main_run_var = main_run_var1)
lambda1_t_temp = lambda_t_f(
lambda1_var = lambda1_in_f(lambda1_var = lambda1_var1),
years_of_treat_0_var = years_of_treat_0_var1,
years_of_treat_t_var = years_of_treat_t_var1
)$lambda1_t
lambda1_prevl_in <- lambda_eff_f(
lambda1_var = lambda1_t_temp,
prevalence_0_var = prevalence_0_var1,
prevalence_r_var = prevalence_r_var1,
other_prevl_r_var = new_prevl_r_var1,
country_sel_var = countries_var1
)$lambda1_eff_in
unit_test_f(lambda1_prevl_in[1], 0.9508583060968, main_run_var = main_run_var1)
lambda2_in <- lambda2_in_f(lambda2_var = lambda2_var1)
unit_test_f(lambda2_in[1], 10.2 , main_run_var = main_run_var1)
saturation_in <- saturation_in_f(coverage_var = coverage_var1,
q_full_var = q_full_var1,
q_zero_var = q_zero_var1)$saturation_in
unit_test_f(saturation_in, 0.511, main_run_var = main_run_var1)
###------------ Inputs for earnings_app2_f--------------------------------------
lambda1_new_in <- lambda1_new_var1
unit_test_f(lambda1_new_in, 79.51465,
main_run_var = main_run_var1)
lambda1_t_temp = lambda_t_f(
lambda1_var = lambda1_new_var1,
years_of_treat_0_var = years_of_treat_0_var1,
years_of_treat_t_var = years_of_treat_t_var1
)$lambda1_t
lambda1_prevl_new_in <- lambda_eff_f(lambda1_var = lambda1_t_temp,
prevalence_0_var = prevalence_0_var1,
prevalence_r_var = prevalence_r_var1,
other_prevl_r_var = new_prevl_r_var1,
country_sel_var = countries_var1
)$lambda1_eff_in
unit_test_f(lambda1_prevl_new_in[1], 43.3278884864681, main_run_var = main_run_var1)
##------------ Inputs for pv_benef_f ---------------------------------------
# earnings1
earnings_no_ext_in <- earnings_app1_f(
wage_var = wage_t_in,
lambda1_var = lambda1_in[1],
lambda2_var = 0,
saturation_var = saturation_in,
coverage_var = coverage_var1
)
earnings_yes_ext_in <- earnings_app1_f(
wage_var = wage_t_in,
lambda1_var = lambda1_in[1],
lambda2_var = lambda2_in[1],
saturation_var = saturation_in,
coverage_var = coverage_var1
)
# earnings1 with prevalence
earnings_no_ext_prevl_in <- earnings_app1_f(
wage_var = wage_t_in,
lambda1_var = lambda1_prevl_in[1],
lambda2_var = 0,
saturation_var = saturation_in,
coverage_var = coverage_var1
)
earnings_yes_ext_prevl_in <- earnings_app1_f(
wage_var = wage_t_in,
lambda1_var = lambda1_prevl_in[1],
lambda2_var = lambda2_in[1],
saturation_var = saturation_in,
coverage_var = coverage_var1
)
# earnings2
earnings_no_ext_new_in <- earnings_app2_f(t_var = 0:50,
lambda1k1_var = lambda1_new_in[1])
# earnings2 with prevalence
earnings_no_ext_prevl_new_in <- earnings_app2_f(t_var = 0:50,
lambda1k1_var = lambda1_prevl_new_in[1])
# interest rate NEED TO UPDATE TO EXACT RESULT
interest_in <- interest_f(gov_bonds_var = gov_bonds_var1,
inflation_var = inflation_var1)$interest_in
unit_test_f(earnings_no_ext_in, 31.1421332040266,
main_run_var = main_run_var1)
unit_test_f(earnings_yes_ext_in, 167.667817450905,
main_run_var = main_run_var1)
unit_test_f(earnings_no_ext_prevl_in, 16.9694876943406,
main_run_var = main_run_var1)
unit_test_f(earnings_yes_ext_prevl_in, 153.495171941219,
main_run_var = main_run_var1)
unit_test_f(interest_in, 0.0985, main_run_var = main_run_var1)
##-------------- Inputs for costs2_f----------------------------------------
# Make explicit non-function inputs:
delta_ed_final_in <- delta_ed_final_f(include_ext_var = FALSE,
delta_ed_var = delta_ed_var1,
delta_ed_ext_var = delta_ed_ext_var1)
unit_test_f(delta_ed_final_in, 0.01134819, main_run_var = main_run_var1)
delta_ed_final_x_in <- delta_ed_final_f(
include_ext_var = TRUE,
delta_ed_var = delta_ed_var1,
delta_ed_ext_var = delta_ed_ext_var1
)
unit_test_f(delta_ed_final_x_in, 0.05911765, main_run_var = main_run_var1)
interest_in <- interest_f(gov_bonds_var = gov_bonds_var1,
inflation_var = inflation_var1)$interest_in
unit_test_f(interest_in, 0.0985, main_run_var = main_run_var1)
interest_new_in <- interest_f(
gov_bonds_var = gov_bonds_new_var1,
inflation_var = inflation_new_var1)$interest_in
cost_per_student_in <- cost_per_student_f(teach_sal_var = teach_sal_var1,
teach_ben_var = teach_ben_var1,
n_students_var = n_students_var1)
unit_test_f(cost_per_student_in, 116.8549, main_run_var = main_run_var1)
cost_per_student_new_in <- cost_per_student_f(
teach_sal_var = teach_sal_new_var1,
teach_ben_var = teach_ben_new_var1,
n_students_var = n_students_var1
)
s2_in <- s2_f(
unit_cost_local_var = unit_cost_local_var1,
ex_rate_var = ex_rate_var1,
years_of_treat_var = years_of_treat_0_var1
)
unit_test_f(s2_in, 1.4219, main_run_var = main_run_var1)
#--------------- Inputs for NPV_pe_f--------------------
# Make explicit non-function inputs:
#Benefits:
#Baird w/tax and no externalities (no ext)
pv_benef_tax_nx_in <- pv_benef_f(
earnings_var = earnings_no_ext_in * tax_var1,
interest_r_var = interest_in,
periods_var = periods_var1
)
unit_test_f(pv_benef_tax_nx_in, 23.6070893378784,
main_run_var = main_run_var1)
#Baird w/t and ext
pv_benef_tax_yx_in <- pv_benef_f(
earnings_var = earnings_yes_ext_in * tax_var1,
interest_r_var = interest_in,
periods_var = periods_var1
)
unit_test_f(pv_benef_tax_yx_in, 127.0994867217, main_run_var = main_run_var1)
#Baird all and no
pv_benef_all_nx_in <- pv_benef_f(
earnings_var = earnings_no_ext_in,
interest_r_var = interest_in,
periods_var = periods_var1
)
unit_test_f(pv_benef_all_nx_in, 142.42587835824, main_run_var = main_run_var1)
#Baird all and no ext + prevalence
pv_benef_all_nx_prevl_in <- pv_benef_f(
earnings_var = earnings_no_ext_prevl_in,
interest_r_var = interest_in,
periods_var = periods_var1
)
unit_test_f(pv_benef_all_nx_prevl_in, 77.608498246463, main_run_var = main_run_var1)
#Baird all and ext
pv_benef_all_yx_in <- pv_benef_f(
earnings_var = earnings_yes_ext_in,
interest_r_var = interest_in,
periods_var = periods_var1
)
unit_test_f(pv_benef_all_yx_in, 766.814399527604,
main_run_var = main_run_var1)
#Baird all and ext
pv_benef_all_yx_prevl_in <- pv_benef_f(
earnings_var = earnings_yes_ext_prevl_in,
interest_r_var = interest_in,
periods_var = periods_var1
)
unit_test_f(pv_benef_all_yx_prevl_in, 701.997019415827,
main_run_var = main_run_var1)
#KLPS4 w/t and no ext
pv_benef_tax_new_in <- pv_benef_f(
earnings_var = earnings_no_ext_new_in * tax_var1,
interest_r_var = interest_new_in,
periods_var = periods_var1
)
unit_test_f(pv_benef_tax_new_in, 88.1820199569814,
main_run_var = main_run_var1)
# KLPS4 all and no ext
pv_benef_all_new_in <- pv_benef_f(earnings_var = earnings_no_ext_new_in,
interest_r_var = interest_new_in,
periods_var = periods_var1)
unit_test_f(pv_benef_all_new_in, 532.018219951622, main_run_var = main_run_var1)
# KLPS4 all and no ext + prevalence
pv_benef_all_prevl_new_in <- pv_benef_f(earnings_var = earnings_no_ext_prevl_new_in,
interest_r_var = interest_new_in,
periods_var = periods_var1)
unit_test_f(pv_benef_all_prevl_new_in, 289.899107986178, main_run_var = main_run_var1)
#Costs asd
# costs1: EA costs no externalities
cost1_in <- costs1_p2_f(country_total_var = df_costs_var1$total,
country_cost_var = df_costs_var1$costs_by_country,
staff_time_var = staff_time_var1,
country_name_var = df_costs_var1$Country,
select_var = countries_var1,
other_costs_var = new_costs_var1)
unit_test_f(cost1_in, 0.08480686,
main_run_var = main_run_var1)
# s2_ea_in <-- cost1_in (costs1_p2_f) <-- cost_data (costs1_p1_f())
s2_ea_in <- s2_new_f(interest_var = interest_new_in,
unit_cost_local_var = cost1_in,
ex_rate_var = 1,
year_of_treat_var = years_of_treat_t_var1)
unit_test_f(s2_ea_in, 0.19634422968991, main_run_var = main_run_var1)
costs2_ea_in <- pv_costs_f(
periods_var = periods_var1,
delta_ed_var = delta_ed_final_in,
interest_r_var = interest_new_in,
cost_of_schooling_var = 0,
s1_var = 0,
q1_var = 0,
s2_var = s2_ea_in,
q2_var = q_full_var1
)
unit_test_f(costs2_ea_in, 0.147258172267433, main_run_var = main_run_var1)
# costs2: Baird no externalities
costs2_in <- pv_costs_f(
periods_var = periods_var1,
delta_ed_var = delta_ed_final_in,
interest_r_var = interest_in,
cost_of_schooling_var = cost_per_student_in,
s1_var = 0,
q1_var = q_zero_var1,
s2_var = s2_in,
q2_var = q_full_var1
)
unit_test_f(costs2_in, 11.776188118988, main_run_var = main_run_var1)
earnings_no_ext_in
# Baird yes externalities
costs2_x_in <- pv_costs_f(
periods_var = periods_var1,
delta_ed_var = delta_ed_final_x_in,
interest_r_var = interest_in,
cost_of_schooling_var = cost_per_student_in,
s1_var = 0,
q1_var = q_zero_var1,
s2_var = s2_in,
q2_var = q_full_var1
)
unit_test_f(costs2_x_in, 25.1962130559894, main_run_var = main_run_var1)
s2_new_in <- s2_new_f(interest_var = interest_new_in,
unit_cost_local_var = unit_cost_local_new_var1,
ex_rate_var = 1,
year_of_treat_var = years_of_treat_t_var1)
# costs2: KLPS4
costs_a2_in <- pv_costs_f(
periods_var = periods_var1,
delta_ed_var = delta_ed_final_in,
interest_r_var = interest_new_in,
cost_of_schooling_var = cost_per_student_new_in,
s1_var = 0,
q1_var = q_zero_var1,
s2_var = s2_new_in,
q2_var = q_full_var1
)
unit_test_f(costs_a2_in, 32.2977546110344, main_run_var = main_run_var1)
return( list(
"wage_0_in" = wage_0_in,
"wage_t_in" = wage_t_in,
"lambda1_in" = lambda1_in,
"lambda1_prevl_in" = lambda1_prevl_in,
"lambda2_in" = lambda2_in,
"saturation_in" = saturation_in,
"lambda1_new_in" = lambda1_new_in,
"lambda1_prevl_new_in" = lambda1_prevl_new_in,
"earnings_no_ext_in" = earnings_no_ext_in,
"earnings_no_ext_prevl_in" = earnings_no_ext_prevl_in,
"earnings_yes_ext_in" = earnings_yes_ext_in,
"earnings_yes_ext_prevl_in" = earnings_yes_ext_prevl_in,
"earnings_no_ext_new_in" = earnings_no_ext_new_in,
"earnings_no_ext_prevl_new_in" = earnings_no_ext_prevl_new_in,
"interest_in" = interest_in,
"costs1_country_in" = costs_data_in,
"delta_ed_final_in" = delta_ed_final_in,
"delta_ed_final_x_in" = delta_ed_final_x_in,
"cost_per_student_in" = cost_per_student_in,
"s2_in" = s2_in,
"pv_benef_tax_nx_in" = pv_benef_tax_nx_in,
"pv_benef_tax_yx_in" = pv_benef_tax_yx_in,
"pv_benef_all_nx_in" = pv_benef_all_nx_in,
"pv_benef_all_nx_prevl_in" = pv_benef_all_nx_prevl_in,
"pv_benef_all_yx_in" = pv_benef_all_yx_in,
"pv_benef_all_yx_prevl_in" = pv_benef_all_yx_prevl_in,
"pv_benef_tax_new_in" = pv_benef_tax_new_in,
"pv_benef_all_new_in" = pv_benef_all_new_in,
"pv_benef_all_prevl_new_in" = pv_benef_all_prevl_new_in,
"costs2_ea_in" = costs2_ea_in,
"costs2_in" = costs2_in,
"costs2_x_in" = costs2_x_in,
"costs_a2_in" = costs_a2_in,
"cost1_in" = cost1_in
) )
}
invisible( list2env(one_run_f(),.GlobalEnv) )
## [1] "Output has changed at lambda1_new_in to 79.51"
## [1] "Output has changed at lambda1_prevl_new_in[1] to 43.3253546806668"
## [1] "Output has changed at pv_benef_tax_new_in to 88.1768630910102"
## [1] "Output has changed at pv_benef_all_new_in to 531.98710763807"
## [1] "Output has changed at pv_benef_all_prevl_new_in to 289.882154747346"
#Baird 1: Costs = Baird w/tax and no externalities (no ext);
#Benef = Baird no ext
a1_tax_pe <- NPV_pe_f(benefits_var = pv_benef_tax_nx_in, costs_var = costs2_in)
unit_test_f(a1_tax_pe, 11.8309012188904)
#Baird 2: Costs = Baird w/tax and yes externalities (no ext);
#Benef = Baird yes ext
a1_x_tax_pe <- NPV_pe_f(benefits_var = pv_benef_tax_yx_in, costs_var = costs2_x_in)
unit_test_f(a1_x_tax_pe, 101.903273665711)
# Baird 3: Benefits = Baird all and no ext; Costs = Baird no ext
a1_all_pe <- NPV_pe_f(benefits_var = pv_benef_all_nx_in, costs_var = costs2_in)
unit_test_f(a1_all_pe, 130.649690239252)
# Baird 4: Benefits = Baird all and yes ext; Costs = Baird yes ext
a1_x_all_pe <- NPV_pe_f(benefits_var = pv_benef_all_yx_in, costs_var = costs2_x_in)
unit_test_f(a1_x_all_pe, 741.618186471615)
#KLPS4_1: benefits = KLPS4 w/t and no ext; Costs = Baird no ext
klps4_1_pe <- NPV_pe_f(benefits_var = pv_benef_tax_new_in, costs_var = costs_a2_in)
unit_test_f(klps4_1_pe, 55.884265345947)
## [1] "Output has changed at klps4_1_pe to 55.8791084799758"
## [1] "Output has changed at klps4_2_pe to 499.689353027036"
## [1] "Output has changed at ea3_pe to 289.734896575078"
| 1.1 |
Baird et al. (2016) w/tax and no externalities (no ext) |
Treatment, Education |
11.8 |
| 1.2 |
Baird et al. (2016) w/t and ext |
Treatment, Education (w/ext) |
101.9 |
| 1.3 |
Baird et al. (2016) all and no ext |
Treatment, Education |
130.6 |
| 1.4 |
Baird et al. (2016) all and ext |
Treatment, Education (w/ext) |
741.6 |
| 2.1 |
Hamory et al. (2020) w/t and no ext |
Treatment, Education |
55.9 |
| 2.2 |
Hamory et al. (2020) all and no ext |
Treatment, Education |
499.7 |
| 3.1 |
1.3 + prevalence + length of treatment |
Treatment (EA) |
77.5 |
| 3.2 |
1.4 + prevalence + length |
Treatment (EA) |
701.8 |
| 3.3 |
2.2 + prevalence + length |
Treatment (EA) |
289.7 |

References
Croke, Kevin. 2014. “The Long Run Effects of Early Childhood Deworming on Literacy and Numeracy: Evidence from Uganda.” Unpublished Manuscript.
Hamory, Joan, Edward Miguel, Michael Walker, Michael Kremer, and Sarah Baird. 2020. “Twenty Year Economic Impacts of Deworming.” Working Paper. https://www.nber.org/papers/w27611.
Suri, Tavneet. 2011. “Selection and Comparative Advantage in Technology Adoption.” Econometrica 79 (1). Wiley Online Library: 159–209.
Xie, Yihui. 2015. Dynamic Documents with R and Knitr. Vol. 29. CRC Press.
LS0tCnRpdGxlOiAiPGNlbnRlcj48ZGl2IGNsYXNzPSAnbXl0aXRsZSc+T3BlbiBQb2xpY3kgQW5hbHlzaXMgZm9yIERld29ybWluZzwvZGl2PjwvY2VudGVyPiIKZGF0ZTogIjxjZW50ZXI+PGRpdiBjbGFzcz0nbXlzdWJ0aXRsZSc+YHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWA8L2Rpdj48L2NlbnRlcj4iCmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCm91dHB1dDoKICBib29rZG93bjo6aHRtbF9kb2N1bWVudDI6CiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY3NzOiBzdHlsZS5jc3MKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGluY2x1ZGVzOgogICAgICBhZnRlcl9ib2R5OiBmb290ZXIuaHRtbAogICAga2VlcF9tZDogeWVzCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgc21vb3RoX3Njcm9sbDogbm8KICAgIHRoZW1lOiBjZXJ1bGVhbgogICAgdG9jOiB5ZXMKICAgIHRvY19jb2xsYXBzZWQ6IG5vCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19mbG9hdDogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzMnCiAgd29yZF9kb2N1bWVudDogbnVsbApsaW5rLWNpdGF0aW9uczogeWVzCnBkZl9kb2N1bWVudDoKICBleHRyYV9kZXBlbmRlbmNpZXM6IHhjb2xvcgogIGZpZ19jYXB0aW9uOiBubwpiaWJsaW9ncmFwaHk6IGJpYmxpb2dyYXBoeS5iaWIKLS0tClxkZWZcYmx1ZXtcY29sb3J7Ymx1ZX19ClxkZWZccmVke1xjb2xvcntyZWR9fQoKCgoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBwdXJsPVRSVUV9Cmh0bWxfZm9ybWF0IDwtIFRSVUUKIyBMb2FkaW5nIHJlcXVpcmVkIGxpYnJhcmllcwojIGJlZm9yZSBkZXBsb3lpbmcgaW4gc2hpbnlhcHBzLmlvLCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgZm9sbG93aW5nIHBhY2thZ2VzOgojICJwbG90bHkiLCAiYm9va2Rvd24iLCAicm9vdFNvbHZlIgppZiAoVFJVRSkgewogIGxpc3Qub2YucGFja2FnZXMgPC0gYygidGlkeXZlcnNlIiwgImhlcmUiLCAia2FibGVFeHRyYSIsICJyZWFkeGwiLCJwbG90bHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiYm9va2Rvd24iLCAicm9vdFNvbHZlIiwic2hpbnlCUyIsICJzaGlueXRoZW1lcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJnZ3Bsb3QyIikKCiAgIyBzYXBwbHkobGlzdC5vZi5wYWNrYWdlcywgZnVuY3Rpb24oeCkgcGFjbWFuOjpwX2xvYWQoZ2V0KHgpKSkKCiAgbmV3LnBhY2thZ2VzIDwtIGxpc3Qub2YucGFja2FnZXNbCiAgICAhKCBsaXN0Lm9mLnBhY2thZ2VzICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKClbLCJQYWNrYWdlIl0gKQogICAgXQogIGlmKGxlbmd0aChuZXcucGFja2FnZXMpKSBpbnN0YWxsLnBhY2thZ2VzKG5ldy5wYWNrYWdlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQoKICBsYXBwbHkobGlzdC5vZi5wYWNrYWdlcywgbGlicmFyeSwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQp9Cgprbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9IGhlcmUoKSkKCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKCnByaW50X2NvZGUgPC0gaHRtbF9mb3JtYXQKc2hvd19zdW1tYXJ5X3RhYmxlcyA8LSBGQUxTRQoKZXF1YXRpb25JbmRleCA8LSAwCnN1bV90YWJsZV9pbmRleCA8LSAwCgpzZXR3ZChoZXJlKCkpCgpjb2xvcml6ZV9mID0gZnVuY3Rpb24oeCwgY29sb3IpewogIGlmIChrbml0cjo6aXNfbGF0ZXhfb3V0cHV0KCkpIHsKICAgIHNwcmludGYoIlxcdGV4dGNvbG9yeyVzfSglcykiLCBjb2xvciwgeCkKICB9IGVsc2UgaWYgKGtuaXRyOjppc19odG1sX291dHB1dCgpKSB7CiAgICBzcHJpbnRmKCI8Zm9udCBjb2xvcj0nJXMnPiVzPC9mb250PiIsIGNvbG9yLCB4KQogIH0gZWxzZSB4Cn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KG1lc3NhZ2UgPSBGQUxTRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KHdhcm5pbmcgPSBGQUxTRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04KQpvcHRpb25zKGtuaXRyLmR1cGxpY2F0ZS5sYWJlbCA9ICJhbGxvdyIpICMgd29ya2Fyb3VuZCBmb3IgcHVybCBlcnJvcgprbml0cjo6cHVybCgiY29kZS8wNV9maW5hbF9vcGEuUm1kIiwgImNvZGUvc2hpbnlfYXBwL2FsbF9hbmFseXNpcy5SIikKYGBgCgoKYGBge3Igbm90ZXMsIHB1cmw9RkFMU0UsIGVjaG89cHJpbnRfY29kZX0KIyMjIyMjIyMjIyMjIyMjIwojIyMjIyAgTm90ZXM6CiMjIyMjIyMjIyMjIyMjIyMKIyBUeXBlcyBvZiBvYmplY3RzOgojIyMgU291cmNlIC0tLS0tLS0+ICBJbnB1dCAmIE1vZGVsIC0tLS0tLS0+ICBQb2xpY3kgRXN0aW1hdGVzIChvdXRwdXQpCiMjIyAgKF9zbykgICAgICAgICAgIChfaW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9wZSkKIyMjIHZhbHVlcyAgICAgICAgICAgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMKIyMjICAgICAgICAgICAgICAgICAgJiB2YWx1ZXMgICAgICAgICAgCiMgRXhhbXBsZXM6ICAgICAgICAgICAgICAgICAgIAojIC0gY2FsbF9zb19mICAgICAgIC0gdGF4X2VsYXNfaW5fZiAgICAgICAgIC0gdGVuX3llYXJfcmV2ZW51ZV9wZQojIC0gcG9saWN5X3NvICAgICAgIC0gZXN0X2JpbGxfaW5fZiAgICAgICAgIC0gdGVuX3llYXJfdG9wX3RheF9wZQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdG90YWxfcmV2X3BlCiMjIyBhcmd1bWVudHMgaW4gZnVuY3Rpb25zIHNob3VsZCB1c2VkICJfdmFyIiBhbmQgZnVuY3Rpb25zIHNob3VsZCB1c2VkICJfZiIKCiMgRWFjaCBhbmFseXRpYyBjb2RlIGNodW5rIHdpbGwgYmVnaW4gYnkgbGlzdGluZyBhbGwgdGhlIGlucHV0cyBpdCBuZWVkcywgYW5kCiMgdGhlIG91dHB1dHMgaXQgcHJvZHVjZXMuCiMgLSBpbnB1dHM6IGxpc3QKIyAtIG91dHB1dHM6IGxpc3QKIyMjIyBUaGUga2V5IGVzc2VudGlhbCBhbmFseXRpYyBzdGVwcyBhcmUgd3JhcHRlZCBpbiBhIGZ1bmN0aW9uICAgCiNjaHVua19uYW1lX29mX2NodW5rIDwtIGZ1bmN0aW9uKCl7CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAojCiMgaGVyZSBnb2VzIHRoZSBlc3NlbnRpYWwgYW5hbHl0aWMgY29udGVudAojCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAojICAgIHJldHVybiggKSAgICAgICAgICAgICAgICAgICAgICAgICAjIEEgbGlzdCB3aXRoIGFsbCB0aGUgb2JqZWN0cwojfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYXRlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uCiMgVGhlIGZvbGxvd2luZyBsaW5lIGV4ZWN1dGVzIHRoZSBjb2RlIGNodW5rIGFuZCBkZXBvc2l0cyBpdHMgcmVzdWx0cwojIGludG8gdGhlIGN1cnJlbnQgUiBlbnZpb3JubWVudDoKI2ludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfbmFtZV9vZl9jaHVuaygpLC5HbG9iYWxFbnYpICkKIwojIyMjIyBFeGVjdXRlIHZhbHVlcyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIHdoZW4gbmVlZGVkIGZvciB0aGUgdGV4dDoKIyBBbnl0aGluZyB1bmRlciB0aGlzIGNvbW1lbnQgaXMgdG8gY3JlYXRlIG9iamVjdHMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgYm9keSBvZgojIHRleHQuIE5vdCB0byBiZSB1c2VkIGluIHRoZSBmaW5hbCByZXN1bHRzIChjb3VsZCBiZSBkZWxldGVkKS4gRWFjaCBvZiB0aGVzZQojIG9iamVjdCBzaG91bGQgZW5kIHdpdGggdGhlIHN1ZmZpeCBfdGVtcAojCiMgVXNlIGRpYWdyYW1zIHRvIHJlcHJlc2VudCBjb21wbGV4IG5lc3Rpbmcgb2YgZnVuY3Rpb25zLiBFeGFtcGxlOgojICMgcHZfY29zdHNfZgojICDilJzilIDilIDilIDilIAgZGVsdGFfZWRfZmluYWxfZgojICDilJzilIDilIDilIDilIAgaW50ZXJlc3RfZgojICDilJTilIDilIDilIDilIAgY29zdF9wZXJfc3R1ZGVudF9mCiMgIHwgICAgICDilJTilIDilIDilIDilIAgeAojICDilJzilIDilIDilIDilIAgczJfZgojICDilJTilIDilIDilIDilIAgbGFtYmRhMl9pbl9mCmBgYAoKCmBgYHtyIHNvdXJjZXMsIGV2YWwgPSBUUlVFLCBlY2hvPXByaW50X2NvZGUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgLSBpbnB1dHM6IG5vbmUKIyAtIG91dHB1dHM6IGFsbCBzb3VyY2VzIGNvbWluZyBmcm9tIGRhdGEsIHJlc2VhcmNoIGFuZCBndWVzc3dvcmsKY2h1bmtfc291cmNlcyA8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAoKICAgICMjIyMjIyMjIyMjIyMKICAgICMjIyMjIFNldHVwCiAgICAjIyMjIyMjIyMjIyMjICAKICAgIG5zaW1zX3NvIDwtIDFlNAogICAgcmVzY2FsZV9zbyA8LSBGQUxTRQogICAgcG9saWN5X2VzdGltYXRlX3NvIDwtICJhM19pbmNfYTJfYWxsX3NpbSIKICAgIHJ1bl9zaW1fc28gPC0gRkFMU0UKICAgIG1haW5fcnVuX3NvIDwtIFRSVUUKICAgIHBlcmlvZHNfc28gPC0gNTAgICAgICAgICAgICAgICAjVG90YWwgbnVtYmVyIG9mIHBlcmlvZHMgdG8gZm9yZWNhc3Qgd2FnZXMKICAgIGNvc3RzX3RlbXBfc28gPC0gMQogICAgbWFpbl9wZV9zbyA8LSAyODkuOAoKCiAgICAjIyMjIyMjIyMjIyMjCiAgICAjIyMjIyBEYXRhICAKICAgICMjIyMjIyMjIyMjIyMKICAgICMgQVRURU5USU9OIQogICAgIyBjb3N0czJfZWFfaW4KICAgIGV4X3JhdGVfc28gPC0gNzQgICAgICAgICAgICAgICAjRXhjaGFuZ2UgUmF0ZSAtIENlbnRyYWwgQmFuayBvZiBLZW55YSA3NCAsIDg1CiAgICBleF9yYXRlXzIwMThfc28gICAgICAgIDwtIDEwMS4zMCAgIyBFeGNoYW5nZSByYXRlIChLRVMgcGVyIGludGVybmF0aW9uYWwgJCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAtIGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9QQS5OVVMuRkNSRj9sb2NhdGlvbnM9S0UKICAgIGV4X3JhdGVfMjAxOF9wcHBfc28gPC0gNTAuMDU4ICAgIyBLTFBTNF9FK19nbG9iYWxzLmRvIChvcmlnaW5hbGx5IGZyb20gdGhlIFdvcmxkIEJhbmspCiAgICBleF9yYXRlXzIwMTdfcHBwX3NvIDwtIDQ5Ljc3MyAgICMgS0xQUzRfRStfZ2xvYmFscy5kbyAob3JpZ2luYWxseSBmcm9tIHRoZSBXb3JsZCBCYW5rKQogICAgZ3Jvd3RoX3JhdGVfc28gPC0gMS41Mi8xMDAgICAgICNQZXItY2FwaXRhIEdEUCBncm93dGgsIDIwMDItMjAxMSAoYWNjZXNzZWQgMS8yOS8xMykgLQlXb3JsZCBCYW5rIC0gc2VlIG5vdGVzCiAgICBnb3ZfYm9uZHNfc28gPC0gCTAuMTE4NQkgICAgICNLZW55YW4gaW50ZXJlc3Qgb24gc292ZXJlaWduIGRlYnQgLSBDZW50cmFsIEJhbmsgb2YgS2VueWEKICAgIGdvdl9ib25kc19uZXdfc28gPC0gMC4wOQogICAgaW5mbGF0aW9uX3NvIDwtICAwLjAyICAgICAgICAgICNLZW55YW4gaW5mbGF0aW9uIHJhdGUgLSBXb3JsZCBCYW5rIERldmVsb3BtZW50IEluZGljYXRvcnMKICAgIGluZmxhdGlvbl9uZXdfc28gPC0gMC4wNAogICAgdGF4X3NvIDwtIDAuMTY1NzUgICAgICAgICAgICAgICNBREQgSU5GTyEKCiAgICAjIGNvc3RzIGRhdGEKICAgIGRmX2Nvc3RzX3NvIDwtIHJlYWRfZXhjZWwoInJhd2RhdGEvZGF0YS9EdFcgQ29zdCBwZXIgQ2hpbGQgRGF0YS54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAiRHRXIENvc3RzIikKICAgICMgY3Jvc3N3YWxrIGRhdGEgb24gcmVnaW9uIGFuZCBjb3VudHJ5CiAgICBkZl9jb3N0c19jd19zbyA8LSByZWFkX2V4Y2VsKCJyYXdkYXRhL2RhdGEvRHRXIENvc3QgcGVyIENoaWxkIERhdGEueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gInN0YXRlX2NvdW50cnkiKQogICAgIyBkYXRhIG9uIG51bWJlciBvZiB0cmVhdGVkIGNoaWxkcmVuCiAgICBkZl9jb3VudHNfc28gPC0gcmVhZF9leGNlbCgicmF3ZGF0YS9kYXRhL0R0VyBDb3N0IHBlciBDaGlsZCBEYXRhLnhsc3giLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICJEdFcgVHJlYXRtZW50ICNzIikKICAgICMgUHJldmFsZW5jZSBkYXRhOgogICAgIyBvcmlnaW5hbCBzdHVkeQogICAgIyBBbnkgaW5mZWN0aW9uIG9uIG9yaWdpbmFsIHN0dWR5CiAgICAjcHJldmFsZW5jZV8wX3NvIDwtIGMoImhvb2t3b3JtIiA9IDAuNzcsICJyb3VuZHdvcm0iID0gMC40MiwgIndoaXB3b3JtIiA9IDAuNTUsCiAgICAjICJTY2hpc3RvIG1hbnNvbmkiID0gMC4yMikgIyBmcm9tIERyYWZ0IENvc3QtRWZmZWN0aXZlbmVzcyBNb2RlbC54bHN4IEFERCBPUklHSU5BTCBTT1VSQ0UKICAgIGRmX3ByZXZhbGVuY2Vfc28gPC0gcmVhZF9leGNlbCgiZGF0YS9wcmV2YWxlbmNlX2RhdGEueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gIlNoZWV0MSIpCiAgICAjIHByZXZhbGVuY2VfMF9zbyA8LSBjKCJob29rd29ybSIgPSAwLjc3LCAicm91bmR3b3JtIiA9IDAuNDIsICJ3aGlwd29ybSIgPTAuNTUsICJTY2hpc3RvIG1hbnNvbmkiID0gMC4yMikgIyBmcm9tIERyYWZ0IENvc3QtRWZmZWN0aXZlbmVzcyBNb2RlbC54bHN4IEFERCBPUklHSU5BTCBTT1VSQ0UKICAgIG5ld19jb3N0c19zbyA8LSBOVUxMCiAgICBjb3VudHJ5X3NlbF9zbyA8LSBsaXN0KCJpbmRpYSIsICJrZW55YSIsICJuaWdlcmlhIiwgInZpZXRuYW0iKQogICAgY291bnRyeV9zZWxfcG9wX3NvIDwtIGMoCiAgICAgICJpbmRpYSIgPSAxLjM2NjQxNzc1MCAqIDFlOSwKICAgICAgImtlbnlhIiA9IDUuMjU3Mzk3ICogMWU3LAogICAgICAibmlnZXJpYSIgPSAyLjAwOTYzNjAgKiAxZTgsCiAgICAgICJ2aWV0bmFtIiA9IDkuNjQ2MjExICogMWU3CiAgICApCiAgICAjaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLlBPUC5UT1RMCiAgICAjIG9wdGlvbnM6ICJhMV90YXhfc2ltIiwiYTFfeF90YXhfc2ltIiwiYTFfYWxsX3NpbSIsICJhMV94X2FsbF9zaW0iLCAiYTJfdGF4X3NpbSIsCiAgICAjICJhMl9hbGxfc2ltIiwgImEzX2luY19hMV9hbGxfc2ltIiwgImEzX2luY19hMV9hbGxfeF9zaW0iLCAiYTNfaW5jX2EyX2FsbF9zaW0iCgoKCgogICAgIyMjIyMjIyMjIyMjIwogICAgIyMjIyMgUmVzZWFyY2gKICAgICMjIyMjIyMjIyMjIyMKICAgIGRmX3Jlc2VhcmNoX3NvIDwtIHJlYWRfY3N2KCJyYXdkYXRhL3Jlc2VhcmNoL3Jlc2VhcmNoX3BhcmFtcy5jc3YiKSAgIAogICAgbGFtYmRhMV9zbyA8LSBjKDMuNDksIDApICAgICAgICAgICAgI0hycyBwZXIgd2VlayBpbmNyZWFzZSBmb3IgbWVuIGFuZCB3b21lbiwgdGFibGUgMywgcm93IDEsIGNvbHMgMiAmIDMKICAgIGxhbWJkYTFfc2Rfc28gPC0gYygxLjQyLCAxLjM2KSAgICAgICN0YWJsZSAzLCByb3cgMiwgY29scyAyICYgMwogICAgbGFtYmRhMV9uZXdfc28gPC0gYyg3OS41MSkgICAjIGF2ZyB0cmVhdG1lbnQgZWZmZWN0IGZyb20ga2xwczItNCAoYWxyZWFkeSBhZGp1c3RlZCBmb3IgcHBwIGFuZCBpbmZsYXRpb24pIC0gd0B3CiAgICBsYW1iZGExX25ld19zZF9zbyA8LSBjKDc2KSAgIyBBREQgU09VUkNFCiAgICBsYW1iZGEyX3NvIDwtIDEwLjIgICAgICAgICAgICAgICAgICAjRXh0ZXJuYWxpdHkgZWZmZWN0IChwcm9wb3J0aW9uYWwpIC0gVGFibGUgMywgcm93IDEgY29sIDQKICAgIGxhbWJkYTJfc2Rfc28gPC0gNy44ICAgICAgICAgICAgICAgICMgVGFibGUgMywgcm93IDIgY29sIDQKICAgICNUaGlzIGlzIGFyZSB0aGUgcGFyYW1ldGVycyBsYWJlbGVkIGV0YSBpbiB0aGUgZG9jCiAgICBwcmV2YWxlbmNlXzBfc28gPC0gMC45MiAjIDAuOTIgZG9pOiBodHRwczovL2RvaS5vcmcvMTAuMTExMS9qLjE0NjgtMDI2Mi4yMDA0LjAwNDgxLnggIGxvY2F0aW9uOiB0YWJsZSAyLCByb3cgNiwgY29sdW1uIDEKICAgIHdhZ2VfYWdfc28gPC0gCTExLjg0CSAgICAgICAgICNNZWFuIGhvdXJseSB3YWdlIHJhdGUgKEtTSCkgLSBTdXJpIDIwMTEKICAgIHdhZ2Vfd3dfc28gPC0gCTE0LjU4NTA5MzMgICAgICNDb250cm9sIGdyb3VwIGhvdXJseSB3YWdlLCB3dyAoY29uZCA+PTEwIGhycyBwZXIgd2VlaykgLSBUYWJsZSA0LCBQYW5lbCBCIChTb3VyY2UgZGF0YSB0b29rIHRoZSBsb2csIGhlcmUgd2UgcmVjb3ZlciBpdCkKICAgIHByb2ZpdHNfc2Vfc28gPC0gMTc2NiAgICAgICAgICAjQ29udHJvbCBncm91cCBtb250aGx5IHNlbGYtZW1wbG95ZWQgcHJvZml0cyAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI1RhYmxlIDQsIFBhbmVsIEMsIENvbHVtbiA1LCBSb3cgMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNGSVg6IE1PU1QgUkVGRVJFTkNFUyBGUk9NIFRBQkxFIDQgQVJFIFRBQkxFIDMKICAgIGhvdXJzX3NlX2NvbmRfc28gPC0gMzguMSAgICAgICAjQ29udHJvbCBncm91cCB3ZWVrbHkgc2VsZi1lbXBsb3llZCBob3VycywgY29uZGl0aW9uYWwgb24gaHJzID4wIC0gVGFibGUgRDEzLCBQYW5lbCBECiAgICBob3Vyc19hZ19zbyA8LSA4LjMgICAgICAgICAgICAgI0NvbnRyb2wgZ3JvdXAgaHJzIHBlciB3ZWVrLCBhZ3JpY3VsdHVyZSAtIFRhYmxlIDMsIFBhbmVsIEIKICAgIGhvdXJzX3d3X3NvIDwtIDYuOSAgICAgICAgICAgICAjQ29udHJvbCBncm91cCBocnMgcGVyIHdlZWssIHdvcmtpbmcgZm9yIHdhZ2VzIC0gVGFibGUgMywgUGFuZWwgQgogICAgaG91cnNfc2Vfc28gPC0gMy4zICAgICAgICAgICAgICNDb250cm9sIGdyb3VwIGhycyBwZXIgd2Vlaywgc2VsZi1lbXBsb3ltZW50IC0gVGFibGUgMywgUGFuZWwgQgogICAgY29lZl9leHBfc28gPC0gYygwLjEwMTk1NzUsIC0wLjAwMTA0MTMpICAgICAgICAgI1llYXJzIG9mIGV4cGVyaWVuY2UgY29lZmZpY2llbnRzICgxLWxpbmVhciwgMi1jdWFkcmF0aWMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjLSBzZWUgbm90ZXMoMC4xMDE5NTc1LCAtMC4wMDEwNDEzKSwgKDAsMCkKICAgIGNvdmVyYWdlX3NvICA8LSAwLjY4MTMzMzMzMyAgICAjIChSKSBGcmFjdGlvbiBvZiB0cmVhdGVkIHByaW1hcnkgc2Nob29sIHN0dWRlbnRzIHdpdGhpbiA2IGttIC0gZnJvbSBXQFcgLSBzZWUgbm90ZQogICAgcV9mdWxsX3NvIDwtIDAuNzUgICAgICAgICAgICAgICNUYWtlIHVwIHJhdGVzIHdpdGggZnVsbCBzdWJzaWR5LiBGcm9tIE1pZ3VlbCBhbmQgS3JlbW1lciAoMjAwNykKICAgIHFfemVyb19zbyA8LSAwICAgICAgICAgICAgICAgICAjVGFrZSB1cCByYXRlcyB3aXRoIHplcm8gc3Vic2lkeS4gRnJvbSBNaWd1ZWwgYW5kIEtyZW1tZXIgKDIwMDcpCiAgICBkZWx0YV9lZF9zbyA8LSBjKC0wLjAwMTc2MzUwOTQ5MDc5NDUxLCAwLjAwNjk2MDUyMjUwMjYzOTk3LCAwLjAyNTg1NzAzMDY3NjMxODMsICAgICAjIChEZWx0YSBFKSBBZGRpdGlvbmFsIGRpcmVjdCBzZWNvbmRhcnkgc2Nob29saW5nIGluY3JlYXNlIChmcm9tIEpvYW4pCiAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIzOTk2MzY2NTU1NTQ2NiwgMC4wMjczMDE0MDYzMDYwNzQsIDAuMDIzNDEyNTQ1NDU5NDE3MywKICAgICAgICAgICAgICAgICAgICAgICAwLjAyNzkyNzg4Nzk0MzkxOTksIDAuMDA2NDcwNDQ0NDk0NDYzMDMsIDAuMDA4MzU3Mzk0Mzc3OTA2MDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgZGVsdGFfZWRfc28gPC0gY2JpbmQoZGVsdGFfZWRfc28sIDE5OTk6MjAwNykKICAgIGRlbHRhX2VkX3Bhcl9zbyA8LSAxCiAgICBkZWx0YV9lZF9leHRfcGFyX3NvIDwtIDEKICAgIGRlbHRhX2VkX2V4dF9zbyA8LSBjKC0wLjAxMTAxMjY5MDgwMjEwNDgsCTAuMDE0MDQ0ODU0Njc0MTAwOCwJLTAuMDAzNDYzNjI5MTU0NTU4NSwgICNBZGRpdGlvbmFsIGV4dGVybmFsaXR5IHNlY29uZGFyeSBzY2hvb2xpbmcgaW5jcmVhc2UgKGZyb20gSm9hbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTEyOTQwMjE0NDM5NDc3LAkwLjA1NzE2MDgxNzk3NzE3NzUsCS0wLjA1NjA1NDY3OTMxODY5MzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDU1ODI4NDc1NjM0MzQ1MSwJMC4xNTQ2MjY0ODQzOTAxMTYwLAkwLjAwNTU5NjE0ODk5NDU2MTkpCiAgICBkZWx0YV9lZF9leHRfc28gPC0gY2JpbmQoZGVsdGFfZWRfZXh0X3NvLCAxOTk5OjIwMDcpCiAgICBpbmNsdWRlX2V4dF9zbyA8LSBUUlVFCiAgICB0ZWFjaF9zYWxfc28gPC0gNTA0MSAgICAgICAgICAgI1llYXJseSBzZWNvbmRhcnkgc2Nob29saW5nIGNvbXBlbnNhdGlvbgk1MDQxIC0gZnJvbSBST0kgbWF0ZXJpYWxzCiAgICB0ZWFjaF9iZW5fc28gPC0gMjE3LjQ3ICAgICAgICAgI1llYXJseSBzZWNvbmRhcnkgc2Nob29saW5nIHRlYWNoZXIgYmVuZWZpdHMJMjE3LjQ3CiAgICB0ZWFjaF9zYWxfbmV3X3NvIDwtICg1MDAwMCAqIDEyIC8gNDkuNzczKQogICAgdGVhY2hfYmVuX25ld19zbyA8LSAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjTW9udGhseSBzZWNvbmRhcnkgc2Nob29saW5nIGNvbXBlbnNhdGlvbgkoaW4gMjAxNyBLRVMpIG92ZXJlc3RpbWF0ZWQgdG8gYWNjb3VudCBmb3IgYmVuZWZpdHMgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI25ld3Mgc291cmNlcyAqIDEyIC8gZXhfcmF0ZV8yMDE3X3BwcF9zbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBodHRwczovL3d3dy50dWtvLmNvLmtlLzI4Nzc2Ni1zZWNvbmRhcnktc2Nob29sLXRlYWNoZXJzLXNhbGFyeS1rZW55YS5odG1sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGh0dHBzOi8vd3d3LnN0YW5kYXJkbWVkaWEuY28ua2UvYXJ0aWNsZS8yMDAxMjQ5NTgxL3dpbmRmYWxsLWZvci10ZWFjaGVycy1hcy10c2MtcmVsZWFzZXMtbmV3LXNhbGFyaWVzCiAgICBjcGlfMjAxOF9zbyA8LSAyNTEuMTAgICAgICAgICAgICMgS0xQUzRfRStfZ2xvYmFscy5kbyAob3JpZ2luYWxseSBmcm9tIHRoZSBCdXJlYXUgb2YgTGFib3IgU3RhdGlzdGljcykKICAgIGNwaV8yMDE3X3NvIDwtIDI0NS4xMjAgICAgICAgICAgIyBLTFBTNF9FK19nbG9iYWxzLmRvIChvcmlnaW5hbGx5IGZyb20gdGhlIEJ1cmVhdSBvZiBMYWJvciBTdGF0aXN0aWNzKQogICAgdGVhY2hfc2FsXzIwMTd1c2RwcHBfc28gPC0gdGVhY2hfc2FsX25ld19zbyAqIGNwaV8yMDE3X3NvIC8gY3BpXzIwMTdfc28gIyByZWR1bmRhbnQsIGJ1dCBmb3IgdGhlIHNha2Ugb2YgY29uc2lzdGVuY3kKCiAgICBuX3N0dWRlbnRzX3NvIDwtIDQ1ICAgICAgICAgICAgI0F2ZXJhZ2UgcHVwaWxzIHBlciB0ZWFjaGVyCTQ1CiAgICAjQVRURU5USU9OIQogICAgeWVhcnNfb2ZfdHJlYXRfMF9zbyA8LSAyLjQxICAgICAgI0FkZGl0aW9uYWwgWWVhcnMgb2YgVHJlYXRtZW50IC0gVGFibGUgMSwgUGFuZWwgQQogICAgdW5pdF9jb3N0X2xvY2FsX3NvIDwtIDQzLjY2ICAgICNEZXdvcm0gdGhlIFdvcmxkCiAgICB1bml0X2Nvc3Rfc28gPC0gMC40MiAgICAgICAgICAgIyBVbml0IGNvc3Qgb2YgZGV3b3JtaW5nIChpbiAyMDE4IFVTRCkgLSBmcm9tIEV2aWRlbmNlIEFjdGlvbgogICAgI0NBTENVTEFUSU9OUyBUTyBDT05WRVJUIEFMTCBDVVJSRU5DWSBUTyAyMDE3IFVTRCBQUFAKICAgIHVuaXRfY29zdF9wcHBfc28gPC0gdW5pdF9jb3N0X3NvKmV4X3JhdGVfMjAxOF9zby9leF9yYXRlXzIwMThfcHBwX3NvCiAgICB1bml0X2Nvc3RfMjAxN3VzZHBwcF9zbyA8LSB1bml0X2Nvc3RfcHBwX3NvICogY3BpXzIwMTdfc28gLyBjcGlfMjAxOF9zbyAgIyAwLjgyOTY5MjcKICAgICMgQWRqdXN0IGZvciBpbmZsYXRpb246IGNvbnZlcnQgYWxsIGNvc3RzIHRvIDIwMTcgVVNECiAgICAjIE1vdmUgdGhpcyBjYWxjdWxhdGlvbnMgaW50byB0aGUgYm9keSBvZiB0aGUgZG9jdW1lbnQgKGFuZCBvdXRzaWRlIG9mIHRoZSBzb3VyY2VzIGNodW5rKQogICAgY29zdHNfcGFyX3NvIDwtIDEKICAgIGNvc3RzX3Bhcl9zZF9zbyA8LSAwLjEKICAgIGNvdW50c19wYXJfc28gPC0gMQogICAgY291bnRzX3Bhcl9zZF9zbyA8LSAwLjEKCgoKCgoKICAgICMjIyMjIyMjIyMjIyMKICAgICMjIyMjIEd1ZXNzIHdvcmsgICAKICAgICMjIyMjIyMjIyMjIyMKICAgICMgQVRURU5USU9OIQogICAgIyBwcmV2YWxlbmNlX3JfaW4KICAgIHByZXZhbGVuY2Vfcl9zbyA8LSBjKCJpbmRpYSIgPSAwLjU2NjUsICJrZW55YSIgPSAwLjM0NSwgIm5pZ2VyaWEiID0gMC4yNywgInZpZXRuYW0iID0gMC4xNDUpICAjMC41NjY1ICAgMC41MDEzMTIxCiAgICAjIGJhc2VkIG9uIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFkcktkVS1rUmpsUnR3WHE2bkNxRkM2Z2NvUS1lT2FMZlQ5TVdIU01aME1BL2VkaXQ/dXNwPXNoYXJpbmcKICAgIG5ld19wcmV2YWxlbmNlX3Jfc28gPC0gTlVMTAogICAgeWVhcnNfb2ZfdHJlYXRfdF9zbyA8LSAyLjQxICAgICAgI1llYXJzIG9mIFRyZWF0bWVudCBpbiBuZXcgc2V0dGluZwogICAgc3RhZmZfdGltZV9zbyA8LSAwLjMgICAgICAgICAgICNBZGRlZCBEZXdvcm1pbmcgY29zdHMgZHVlIHRvIGdvdmVybm1lbnQgc3RhZmYgdGltZQogICAgdGltZV90b19qbV9zbyA8LSAxMCAgICAgICAgICAgICNUaW1lIGZyb20gaW5pdGlhbCBwZXJpb2QgdW50aWwgaW5kaXZpZHVhbCBqb2luIHRoZSBsYWJvciBmb3JjZQoKCiAgICAjIEZpeCB0ZWFjaF9zYWxfc28gICAgICAgCiAgICByZXR1cm4oIHNhcHBseSggbHMocGF0dGVybj0gIl9zb1xcYiIpLCBmdW5jdGlvbih4KSBnZXQoeCkpICkKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgIAp9CmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfc291cmNlcygpLC5HbG9iYWxFbnYpICkKIyMjIyMjIyMjIyMjIwojIyMjIyBOb3RlczoKIyMjIyMjIyMjIyMjIwojIG9uIGdyb3d0aF9yYXRlX3NvOiAoaHR0cDovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvTlkuR0RQLlBDQVAuS0QvKSwgc2VlIGNhbGN1bGF0aW9uCiMgb24gIktlbnlhIEdEUCBwZXIgY2FwaXRhIiB0YWIuIEluIFdAVyB0aGlzIGVxdWFscyAxLjUyJS4gSVNTVUU6IFRoaXMgZ3Jvd3RoIG51bWJlciBzaG91bGQKIyBiZSB1cGRhdGVkIHRvIGJlIDIwMDItMjAxNCwgSSB0aGluay4KIwojIG9uIGNvZWZfZXhwX3NvOiAxOTk4LzE5OTkgS2VueWFuIGxhYm9yIGZvcmNlIHN1cnZleTsgcmVncmVzc2lvbiBvZiBlYXJuaW5ncyBvbiBhZ2UsIGFnZV4yLAojIGZlbWFsZSBkdW1teSwgaW5kaWNhdG9ycyBmb3IgYXR0YWluZWQgcHJpbWFyeS9zZWNvbmRhcnkvYmV5b25kLCBhbmQgcHJvdmluY2UgZHVtbWllcy4KIyBFc3RpbWF0ZSB1c2VkIGluIFdAVzogKDAuMTAxOTU3NSwgLTAuMDAxMDQxMykuIElTU1VFOiBGb3Igbm93IGFzc3VtZSBubyBmdXJ0aGVyIGxpZmUgY3ljbGUKIyBhZGp1c3RtZW50IGJleW9uZCBLTFBTLTMgKGxpa2VseSBhIGNvbnNlcnZhdGl2ZSBhc3N1bXB0aW9uKS4KIwojIGNvdmVyYWdlX3NvOiBPdmVyYWxsIFNhdHVyYXRpb24gKDAuNTExKSAvIDAuNzUgLSBub3QgcmVwb3J0ZWQgaW4gdGFibGUsIGF2ZXJhZ2Ugb2YgVCAmIEMKYGBgCgoKCmBgYHtyIG1haW4tcGUtcHJpbnQsIG91dC53aWR0aCA9ICcxMDAlJywgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuY2FwID0gIk1haW4gUG9saWN5IEVzdGltYXRlIiwgZWNobz1GQUxTRSwgcHVybD1GQUxTRX0KIyB1cmwKa25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MocGF0aCA9IHBhc3RlMChoZXJlKCksIi9jb2RlL21haW5fcGUucG5nIikpCmBgYAoKPGRpdiBjbGFzcyA9ICJkaXZpZGVyIj48c3Bhbj48L3NwYW4+PHNwYW4+CkV4ZWN1dGl2ZSBTdW1tYXJ5Cjwvc3Bhbj48c3Bhbj48L3NwYW4+PC9kaXY+CgpUaGlzIHJlcG9ydCBpcyBwYXJ0IG9mIGFuIE9wZW4gUG9saWN5IEFuYWx5c2lzIChPUEEpIG9uIGRld29ybWluZyBpbnRlcnZlbnRpb25zLiBBbiBPUEEgaXMgYSBwb2xpY3kgYW5hbHlzaXMgdGhhdCBlbXBoYXNpemVzIGhpZ2ggbGV2ZWxzIG9mIHRyYW5zcGFyZW5jeSBhbmQgcmVwcm9kdWNpYmlsaXR5LiBJdCBjb250YWlucyBvbmUgW29wZW4gb3V0cHV0XShodHRwczovL2Zob2Nlcy5zaGlueWFwcHMuaW8vc2hpbnlfYXBwX3Rlc3QvKSB0aGF0IGJlc3QgcmVwcmVzZW50cyB0aGUgZmFjdHMgdG8gaW5mb3JtIHBvbGljeSBtYWtlcnMsIG9uZSByZXBvcnQgKHRoaXMgZG9jdW1lbnQpIHRoYXQgY2xlYXJseSBleHBsYWlucyBhbGwgdGhlIGFuYWx5c2lzLCBhbmQgW29uZSByZXBvc2l0b3J5XShodHRwczovL2dpdGh1Yi5vcmcvYml0c3Mvb3BhLWRld29ybWluZykgdGhhdCBjb250YWlucyBhbGwgdGhlIG1hdGVyaWFscyB0byByZXByb2R1Y2UgdGhlIHJlcG9ydCBhbmQgZmluYWwgb3V0cHV0LgoKVGhpcyByZXBvcnQgZGVzY3JpYmVzIHRocmVlIGFwcHJvYWNoZXMgdG8gY29tcHV0ZSB0aGUgbmV0IHByZXNlbnQgdmFsdWUgb2YgbWFzcyBkZXdvcm1pbmcgaW50ZXJ2ZW50aW9ucy4gVGhlIGZpcnN0IHR3byBhcHByb2FjaGVzIGFyZSBleGFjdCByZXByb2R1Y3Rpb25zIGZyb20gcHJldmlvdXMgcmVzZWFyY2ggW0BiYWlyZDIwMTZ3b3JtczsgQGtscHM0XSwgYW5kIHRoZSB0aGlyZCBhcHByb2FjaCBpcyBhIGNvbWJpbmF0aW9uIG9mIHRoZSBwcmV2aW91cyB0d28gd2l0aCBzb21lIG1vZGlmaWNhdGlvbiBzdWdnZXN0ZWQgYnkgRXZpZGVuY2UgQWN0aW9uLCBhIGtleSBwb2xpY3kgcGFydG5lciBpbiB0aGlzIGFyZWEuIFRoaXMgdGhpcmQgYXBwcm9hY2ggdXNlcyB0aGUgc2FtZSBiZW5lZml0cyBhcyB0aGUgcHJldmlvdXMgYXBwcm9hY2hlcyBhbmQgYWRqdXN0cyBmb3IgZGlmZmVyZW50IGNvc3RzLCBwcmV2YWxlbmNlIHJhdGVzIGFuZCBsZW5ndGggb2YgdHJlYXRtZW50IGFjcm9zcyBzZXR0aW5ncy4gV2Ugc3VnZ2VzdCB0aGF0IHRoaXMgZmluYWwgYXBwcm9hY2ggc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGJlc3QgYXZhaWxhYmxlIHBvbGljeSBlc3RpbWF0ZSB0byBjb21wYXJlIGNvc3RzIGFuZCBiZW5lZml0cyBvZiBkZXdvcm1pbmcgaW4gZGlmZmVyZW50IHNldHRpbmdzLgoKVGhlICBtYWluIHBvbGljeSBlc3RpbWF0ZSBwcmVkaWN0cyB0aGF0IGEgbWFzcyBkZXdvcm1pbmcgaW50ZXJ2ZW50aW9uIHdpbGwgaGF2ZSBhIG5ldCBwcmVzZW50IHZhbHVlIChjb21wYXJpc29uIG9mIHN0cmVhbSBvZiBiZW5lZml0cyBhbmQgY29zdHMgZnJvbSB0b2RheSdzIHBlcnNwZWN0aXZlKSBvZiBgciBtYWluX3BlX3NvYCBmb3IgYSBzZXR0aW5nIHdpdGggYXZlcmFnZSBwcmV2YWxlbmNlIGFuZCBhdmVyYWdlIHVuaXQgY29zdHMgKGFtb25nIHRoZSBjb3VudHJpZXMgd2hlcmUgRXZpZGVuY2UgQWN0aW9uIGhhcyBkYXRhIGZvcikuIFJlYWRlcnMgaW50ZXJlc3RlZCBpbiBsZWFybmluZyBhYm91dCB0aGUgcHJlZGljdGVkIHZhbHVlIGZvciBhIHNwZWNpZmljIHNldHRpbmcgYXJlIGVuY291cmFnZSB0byB1c2UgdGhlIFtpbnRlcmFjdGl2ZSBhcHBdKGh0dHBzOi8vZmhvY2VzLnNoaW55YXBwcy5pby9zaGlueV9hcHBfdGVzdC8pIGNvbXBvbmVudHMgb2YgdGhpcyBPUEEuCgo8ZGl2IGNsYXNzID0gImRpdmlkZXIiPjxzcGFuPjwvc3Bhbj48c3Bhbj4KKgo8L3NwYW4+PHNwYW4+PC9zcGFuPjwvZGl2PgoKCiMgT3BlbiBQb2xpY3kgQW5hbHlzaXMgey19CgpUaGlzIHJlcG9ydCBpcyBwYXJ0IG9mIGFuIE9wZW4gUG9saWN5IEFuYWx5c2lzIChPUEEpIHByb2plY3Qgb24gZGV3b3JtaW5nIGludGVydmVudGlvbnMuIEEgZnJhbWV3b3JrIGZvciBtYWtpbmcgcG9saWN5IGFuYWx5c2VzIHRyYW5zcGFyZW50IGFuZCByZXByb2R1Y2libGUgW0Bob2NlczIwMjBmcmFtZXdvcmtdLCBPUEHigJlzIGdvYWwgaXMgdG8gY2xlYXJseSBzaG93IGhvdyBhbiBhbmFseXNpcyB3YXMgY29uZHVjdGVkIGFuZCBob3cgdG8gYmVzdCByZXByZXNlbnQga2V5IGZpZ3VyZXMgb3IgcmVzdWx0cyBmb3IgcG9saWN5IG1ha2VycyB0byB1c2UgYXMgYSBmYWN0dWFsIGJhc2lzIGZvciBkZWxpYmVyYXRpb24uIEluIGFkZGl0aW9uLCBPUEEgZmFjaWxpdGF0ZXMgdGhlIHJlLXVzZSBvZiBhbmFseXNlcyBhY3Jvc3Mgc2ltaWxhciBzZXR0aW5ncywgYW5kIHNoZWRzIGxpZ2h0IG9uIGhvdyBldmlkZW5jZSBnZW5lcmF0ZWQgYnkgcmVzZWFyY2ggaXMgdXNlZCBpbiBzcGVjaWZpYyBwb2xpY3kgYW5hbHlzZXMuCgogVGhpcyBPUEEgcHJvamVjdCBjb250YWlucyB0aHJlZSBjb21wb25lbnRzLCBmb2xsb3dpbmcgdGhlIE9QQSBwcmluY2lwbGVzIGxhaWQgb3V0IGluIHRoZSBhZm9yZW1lbnRpb25lZCBwYXBlcjoKCiAgMS4gT25lIHNpbmdsZSBvdXRwdXQgdGhhdCBiZXN0IHJlcHJlc2VudHMgdGhlIGZhY3R1YWwgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgcG9saWN5IG1ha2VycyB0byBpbmZvcm0gdGhlaXIgcG9zaXRpb24gcmVnYXJkaW5nIGEgcG9saWN5IG9mIG1hc3MgZGV3b3JtaW5nLiBUaGlzIG91dHB1dCBpcyBwcmVzZW50ZWQgaW4gRmlndXJlICBcQHJlZihmaWc6bWFpbi1wZS1wcmludCksIGFuZCBkZXNjcmliZWQgaW4gdGhlIFtyZXN1bHRzIHNlY3Rpb25dKCNwb2xpY3ktZXN0aW1hdGUpIG9mIHRoaXMgcmVwb3J0LiBUaGUgY29ubmVjdGlvbiBiZXR3ZWVuIGVhY2ggY29tcG9uZW50IG9mIHRoZSBhbmFseXNpcyBhbmQgdGhlIGZpbmFsIG91dHB1dCBjYW4gYmUgZXhwbG9yZWQgaW50ZXJhY3RpdmVseSBpbiBbdGhpcyB3ZWIgYXBwXShodHRwczovL2Zob2Nlcy5zaGlueWFwcHMuaW8vc2hpbnlfYXBwX3Rlc3QvKS4KCiAgMi4gVGhpcyBkZXRhaWxlZCByZXBvcnQgdGhhdCBkZXNjcmliZXMgaG93IHRvIG9idGFpbiB0aGUgcG9saWN5IGVzdGltYXRlIGFuZCBkZXNjcmliZXMgZWFjaCBjb21wb25lbnQgb2YgdGhlIGFuYWx5c2lzLgoKICAzLiBbQSByZXBvc2l0b3J5XShodHRwczovL2dpdGh1Yi5vcmcvYml0c3Mvb3BhLWRld29ybWluZykgdGhhdCBjb250YWlucyBhbGwgdGhlIG1hdGVyaWFscyBuZWVkZWQgdG8gcmVwcm9kdWNlIHRoZSBhbmFseXNpcyB3aXRoIG1pbmltYWwgZWZmb3J0IChyZXBvcnQgYW5kIGludGVyYWN0aXZlIGFwcCkuICAKClRoaXMgcmVwb3J0IHByb3ZpZGVzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIGFuYWx5c2lzIGJlaGluZCB0aGUgcmVzdWx0cyBwcmVzZW50ZWQgdG8gaW5mb3JtIGEgcG9saWN5IGRpc2N1c3Npb24gb24gZGV3b3JtaW5nIGludGVydmVudGlvbnMuIEl0IGRlc2NyaWJlcyBob3cgdG8gcmVwcm9kdWNlIHRoZSBhbmFseXNpcyBpbiBpdHMgZW50aXJldHksIGFuZCBpbmNsdWRlcyBhbGwgdGhlIG1ldGhvZG9sb2dpY2FsIGNob2ljZXMgaW52b2x2ZWQuIEluIG9yZGVyIHRvIGRvY3VtZW50IGFsbCB0aGUgc3RlcHMgd2l0aG91dCBvdmVyd2hlbG1pbmcgdGhlIHJlYWRlciwgdGhlIHJlcG9ydCBpcyBkaXNwbGF5ZWQgaW4gYSBsYXllcmVkIGZhc2hpb24uIFRoZSBmaXJzdCBsYXllciBjb25zaXN0cyBvZiBhIG5hcnJhdGl2ZSBkZXNjcmlwdGlvbiBvZiB0aGUgYW5hbHlzaXMuIFRoZSBzZWNvbmQgbGF5ZXIsIHRoYXQgYXBwZWFyIGFmdGVyIGNsaWNraW5nIGluIHRoZSAhW3NjcmVlbnNob3RdKHNob3dfZGV0YWlscy5wbmc/ZGlzcGxheSA9IGlubGluZS1ibG9jaykgY29udGFpbnMgZXF1YXRpb25zIHRoYXQgc2hvdyBob3cgZWFjaCBwaWVjZSBvZiB0aGUgYW5hbHlzaXMgd2FzIGNhcnJpZWQgb3V0LiBBbmQgdGhlIHRoaXJkIGFuZCBmaW5hbCBsYXllciBkaXNwbGF5cyB0aGUgY29kZSB1c2VkIHRvIG9wZXJhdGlvbmFsaXplIGVhY2ggZXF1YXRpb24uIEFsbCB0aGlzIGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGlzIGRvY3VtZW50IHVzaW5nIGR5bmFtaWMgZG9jdW1lbnRhdGlvbiBbQHhpZTIwMTVkeW5hbWljXSwgc28gaW50ZXJlc3RlZCByZWFkZXJzIGNhbiBhY2Nlc3MgdGhlIHNvdXJjZSBmaWxlIG9mIHRoZSByZXBvcnQgYW5kIHJlcHJvZHVjZSB0aGUgZW50aXJlIGRvY3VtZW50IGluIHRoZWlyIG93biBjb21wdXRpbmcgZW52aXJvbm1lbnRzLgoKCiMgSW50cm9kdWN0aW9uICAKClBhcmFzaXRpYyB3b3JtIGluZmVjdGlvbnMsIGFsc28ga25vd24gYXMgc29pbC10cmFuc21pdHRlZCBoZWxtaW50aHMgKFNUSCkgYW5kIHNjaGlzdG9zb21pYXNpcywgYXJlIGVuZGVtaWMgaW4gbWFueSBjb3VudHJpZXMgYWNyb3NzIHRoZSBnbG9iZSwgZGlzcHJvcG9ydGlvbmF0ZWx5IGFmZmVjdGluZyB0aGUgcG9vci4gVGhlc2UgcGFyYXNpdGljIHdvcm1zIGludGVyZmVyZSB3aXRoIHJlZ3VsYXIgYm9kaWx5IHByb2Nlc3NlcyBieSBkZWNyZWFzaW5nIG51dHJpZW50IHVwdGFrZSBhbmQgY2FuIHRodXMgbGVhZCB0byBzZXJpb3VzIGNvbnNlcXVlbmNlcyBvbiBodW1hbiBoZWFsdGgsIGVkdWNhdGlvbiBvdXRjb21lcywgYW5kIGxvbmctdGVybSBlY29ub21pYyB3ZWxsIGJlaW5nLiBJbiBwYXJ0aWN1bGFyLCBldmlkZW5jZSBpbmRpY2F0ZXMgdGhhdCB0aGVzZSB3b3JtcyBjb250cmlidXRlIHRvIG1hbG5vdXJpc2htZW50LCBpbXBhaXJtZW50IG9mIG1lbnRhbCBhbmQgcGh5c2ljYWwgZGV2ZWxvcG1lbnQsIGxvd2VyIHNjaG9vbCBhdHRlbmRhbmNlLCBhbmQgZGVjcmVhc2VkIHdhZ2VzIFtAY3Jva2UyMDE0bG9uZzsgQG1pZ3VlbDIwMDR3b3JtczsgQGJhaXJkMjAxNndvcm1zXS4KCkV2aWRlbmNlIGZyb20gcHJldmlvdXMgbWFzcyBkZXdvcm1pbmcgaW50ZXJ2ZW50aW9ucyBoYXMgZGVtb25zdHJhdGVkIHRvIGJlIGEgaGlnaGx5IGVmZmVjdGl2ZSBwdWJsaWMgaGVhbHRoIHBvbGljeS4gSGVyZSB3ZSBwcm92aWRlIGEgcG9saWN5IGFuYWx5c2lzIHRoYXQgY29tcGFyZXMgYmVuZWZpdHMgYW5kIGNvc3RzIG9mIGRld29ybWluZyBhY3Jvc3MgZGlmZmVyZW50IHNldHRpbmdzLCBhbGxvd2luZyBmb3IgdGhlIHRyYW5zbGF0aW9uIG9mIHJlc2VhcmNoIGZpbmRpbmdzIGludG8gZGlmZmVyZW50IHBvbGljeS1yZWxldmFudCBzY2VuYXJpb3MuCgpUaGUgZ29hbHMgb2YgdGhpcyBPUEEgYXJlIHRocmVlLiBGaXJzdCwgdG8gaW5jcmVhc2UgdGhlIHRyYW5zcGFyZW5jeSBhbmQgcmVwcm9kdWNpYmlsaXR5IGJlaGluZCBleGlzdGluZyBwb2xpY3kgYW5hbHlzZXMgb24gdGhlIGNvc3RzIGFuZCBiZW5lZml0cyBvZiBtYXNzIGRld29ybWluZyBwcm9ncmFtcy4gU2Vjb25kLCB0byB1cGRhdGUgdGhpcyBwb2xpY3kgYW5hbHlzZXMgd2l0aCBpbnB1dCBmcm9tIHN0YWtlaG9sZGVycyBjbG9zZWx5IGludm9sdmVkIGluIHBvbGljeSBtYWtpbmcgYXJvdW5kIGRld29ybWluZy4gQW5kIHRoaXJkLCB0byBpbGx1c3RyYXRlIGhvdyBhbiBvcGVuIHBvbGljeSBhbmFseXNpcyBmcmFtZXdvcmsgY2FuIGJlIGltcGxlbWVudGVkIGluIHByYWN0aWNlLgoKVGhlIENvc3QgQmVuZWZpdCBBbmFseXNpcyAoQ0JBKSBvZiBkZXdvcm1pbmcgaXMgY29tcHV0ZWQgdXNpbmcgdGhyZWUgZGlmZmVyZW50IGFwcHJvYWNoZXM6ICAgICAKCiAgMS4gUmVwcm9kdWNpbmcgdGhlIG9yaWdpbmFsIENCQSBwcm9kdWNlZCBieSBAYmFpcmQyMDE2d29ybXMsIHdoaWNoIGVzdGltYXRlcyB0aGUgbmV0IHByZXNlbnQgdmFsdWUgb2YgYSBLZW55YSBzY2hvb2wtYmFzZWQgZGV3b3JtaW5nIHByb2dyYW0gYWZ0ZXIgYSAxMCB5ZWFyIGZvbGxvdy11cCBmb3IgZm91ciBkaWZmZXJlbnQgcG9saWN5IGVzdGltYXRlcy4gICAgIAogIDIuIFJlcHJvZHVjaW5nIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiBzdWNoIGFuYWx5c2lzIG9uIHRoZSBzYW1lIGludGVydmVudGlvbiBidXQgd2l0aCBhZGRpdGlvbmFsIGZvbGxvdy11cCBkYXRhIFtAa2xwczRdLgogIDMuIFByb2R1Y2luZyBhIG5ldyBhbmFseXNpcyB0aGF0LCBidWlsZGluZyBmcm9tIHRoZSBwcmV2aW91cyB0d28gYXBwcm9hY2hlcywgZm9jdXNlcyBvbiBvbmUgc3BlY2lmaWMgcG9saWN5IGVzdGltYXRlLCBhbmQgYWxsb3dzIGZvciByZXN1bHRzIHRvIHZhcnkgZGVwZW5kaW5nIG9uIGtleSBjaGFyYWN0ZXJpc3RpY3Mgb2YgY3VycmVudCBzZXR0aW5ncyB3aGVyZSBkZXdvcm1pbmcgcG9saWNpZXMgYXJlIGJlaW5nIGltcGxlbWVudGVkLiBUaGlzIG5ldyBhcHByb2FjaCB3YXMgZGV2ZWxvcGVkIGluIGNvbnN1bHRhdGlvbiB3aXRoIGEga2V5IHN0YWtlaG9sZGVyIGluIHRoaXMgYXJlYSwgdGhlIG5vbi1nb3Zlcm5tZW50YWwgb3JnYW5pemF0aW9uIChOR08pIEV2aWRlbmNlIEFjdGlvbiAoRUEpW14xXS4KCgoKCiMgTWV0aG9kb2xvZ3kgIAoKV2UgZmlyc3QgZGVzY3JpYmUgdGhlIGNvbW1vbiBlbGVtZW50cyBhY3Jvc3MgYWxsIHRocmVlIGFwcHJvYWNoZXMsIGFuZCB0aGVuIGRlc2NyaWJlIGVhY2ggYXBwcm9hY2ggaW4gZGV0YWlsLgoKIyMgQ29tbW9uIHN0cnVjdHVyZSB7LX0KClRoZSBzdGFydGluZyBwb2ludCBpcyBhIGNvbXBhcmlzb24gb2YgYSBzdHJlYW0gb2YgYmVuZWZpdHMgYW5kIGNvc3RzIG92ZXIgdGhlIGxpZmV0aW1lIG9mIHRoZSByZWNpcGllbnRzIG9mIGRld29ybWluZy4gVGhlIGZpbmFsIHBvbGljeSBlc3RpbWF0ZSBpcyB0aGUgZGlzY291bnRlZCBzdW0gb2YgYWxsIGNvc3RzIGFuZCBiZW5lZml0cywga25vd24gYXMgdGhlIE5ldCBQcmVzZW50IFZhbHVlIChOUFYpW14xMl0uCgpbXjEyXTogQXBwcm9hY2hlcyAxIGFuZCAyIGFsc28gcHJlc2VudCByZXN1bHRzIGluIHRoZSBmb3JtYXQgb2YgaW50ZXJuYWwgcmF0ZXMgb2YgcmV0dXJuIChJUlIpLiBGb2xsb3dpbmcgdGhlIHByaW5jaXBsZSBvZiBvcGVuIG91dHB1dCwgd2UgcmVzdHJpY3QgdGhlIHByZXNlbnRhdGlvbiBvZiByZXN1bHRzIHRvIGp1c3Qgb25lIGZvcm1hdC4gTlBWIHdhcyBjaG9zZW4gb3ZlciBJUlIgaW4gY29uc3VsdGF0aW9uIHdpdGggRXZpZGVuY2UgQWN0aW9uIHRvIGNsZWFybHkgY29tbXVuaWNhdGUgdGhlIHNjYWxlIG9mIHRoZSB3ZWxmYXJlIGVmZmVjdHMuIFtDT05GSVJNIFdJVEggR1JBQ0VdICAKCgo8ZGV0YWlscz48c3VtbWFyeT5TaG93IGFsbCB0aGUgZGV0YWlsczwvc3VtbWFyeT4KClxiZWdpbntlcXVhdGlvbn0KTlBWID0gQiAtIEMgXFwKXGVuZHtlcXVhdGlvbn0KCldoZXJlOiAgCgotICROUFYkOiBuZXQgcHJlc2VudCB2YWx1ZSBvZiB0aGUgZGV3b3JtaW5nIHRyZWF0bWVudCAgIAotICRCJDogYmVuZWZpdHMgb2YgdGhlIGRld29ybWluZyB0cmVhdG1lbnQgIAotICRDJDogY29zdHMgb2YgdGhlIGRld29ybWluZyB0cmVhdG1lbnQgIAoKCmBgYHtyIGZpbmFsLXBlLCBlY2hvPXByaW50X2NvZGV9CiMgLSBpbnB1dHM6IHRvdGFsIHBlciBjYXBpdGEgYmVuZWZpdHMsIHRvdGFsIHBlciBjYXBpdGEgY29zdHMKIyAtIG91dHB1dHM6IE5ldCBQcmVzZW50IFZhbHVlIChOUFYpCmNodW5rX2ZpbmFsX3BlIDwtIGZ1bmN0aW9uKCl7CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCgogICAgTlBWX3BlX2YgPC0gZnVuY3Rpb24oYmVuZWZpdHNfdmFyID0gMSwgY29zdHNfdmFyID0gMSl7CiAgICAgICAgYmVuZWZpdHNfdmFyIC0gY29zdHNfdmFyCiAgICB9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAogICAgcmV0dXJuKGxpc3QoIk5QVl9wZV9mIiA9IE5QVl9wZV9mKSkKfQojIEV4Y2VjdXRlIHRoZSBwcmV2aW9zIGZ1bmN0aW9uIGFuZCBsb2FkIHRoZSBsaXN0ZWQgb2JqZWN0cyBpbiB0byB0aGUgY3VycmVudCBSCiMgc2Vzc2lvbiAoZ2xvYmFsIGVudmlyb25tZW50KQppbnZpc2libGUoIGxpc3QyZW52KGNodW5rX2ZpbmFsX3BlKCksLkdsb2JhbEVudikgKQoKIyMjIyMgRXhlY3V0ZSB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGVuIG5lZWRlZCBmb3IgdGhlIHRleHQ6CmBgYAoKCjwvZGV0YWlscz4KPGJyPgoKQmVuZWZpdHMgYXJlIGVxdWFsIHRvIHRoZSBhZGRpdGlvbmFsIGxpZmV0aW1lIGVhcm5pbmdzIHRoYXQgaW5kaXZpZHVhbHMgYXJlIGV4cGVjdGVkIHRvIGdlbmVyYXRlIGR1ZSB0byBkZXdvcm1pbmcgdHJlYXRtZW50LiBUaGVzZSBhZGRpdGlvbmFsIGVhcm5pbmdzIGFyZSBjb21wdXRlZCBhcyBhIGRpc2NvdW50ZWQgc3VtIG92ZXIgdGhlaXIgd29ya2luZyBsaWZldGltZS4gIAoKCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5PgoKClxiZWdpbntlcXVhdGlvbn0KQiA9ICAgXHN1bV97dD0wfV57NTB9XGxlZnQoICBcZnJhY3sxfXsxICsgcn1ccmlnaHQpXnt0fSBFX3t0fQpgciBlcXVhdGlvbkluZGV4IDwtIGVxdWF0aW9uSW5kZXggKyAxYApcbGFiZWx7ZXE6YHIgZXF1YXRpb25JbmRleGB9Clx0YWd7YHIgZXF1YXRpb25JbmRleGB9ClxlbmR7ZXF1YXRpb259CgpXaGVyZToKCi0gJEVfe3R9JDogZWFybmluZ3MgaW5kaXZpZHVhbHMgYXJlIGV4cGVjdGVkIHRvIGdlbmVyYXRlIGF0IHBlcmlvZCB0ICAKLSAkciQ6IHJlYWwgaW50ZXJlc3QgcmF0ZSBhcyB0aGUgZGlzY291bnRpbmcgcmF0ZSAgCi0gJHQkOiBwZXJpb2QgdC4gUGVyaW9kIDAgcmVwcmVzZW50cyB0aW1lIG9mIGludGVydmVudGlvbi4gSW5kaXZpZHVhbHMgYXJlIGFzc3VtZWQgdG8gZW50ZXIgdGhlIGxhYm9yIG1hcmtldCA5IHllYXJzIGFmdGVyIHRyZWF0bWVudC4gIAoKYGBge3IgYmVuZWZpdHMsIGVjaG89cHJpbnRfY29kZX0KIyAtIGlucHV0czogc3RyZWFtIGVhcm5pbmdzLCBkaXNjb3VudGluZyByYXRlLCBudW1iZXIgb2YgcGVyaW9kcwojIC0gb3V0cHV0czogZnVuY3Rpb24gdGhhdCBjb21wdXRlcyB0aGUgcHJlc2VudCB2YWx1ZSBvZiBiZW5lZml0cwpjaHVua19iZW5lZml0cyA8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAoKICBwdl9iZW5lZl9mIDwtIGZ1bmN0aW9uKAogICAgZWFybmluZ3NfdmFyID0gZWFybmluZ3NfaW4sCiAgICBpbnRlcmVzdF9yX3ZhciA9IGludGVyZXN0X2luLAogICAgcGVyaW9kc192YXIgPSBwZXJpb2RzX3NvCiAgKSB7CiAgICAgIGluZGV4X3QgPC0gMDpwZXJpb2RzX3ZhcgogICAgICByZXMxIDwtIHN1bSggKCAxIC8gKDEgKyBpbnRlcmVzdF9yX3ZhcikgKV5pbmRleF90ICogZWFybmluZ3NfdmFyICkKICAgICAgcmV0dXJuKHJlczEpICAgCiAgICB9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAogICAgcmV0dXJuKGxpc3QoInB2X2JlbmVmX2YiID0gcHZfYmVuZWZfZikpCn0KaW52aXNpYmxlKCBsaXN0MmVudihjaHVua19iZW5lZml0cygpLC5HbG9iYWxFbnYpICkKCiMjIyMjIEV4ZWN1dGUgdmFsdWVzIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUgd2hlbiBuZWVkZWQgZm9yIHRoZSB0ZXh0OgpgYGAKPC9kZXRhaWxzPgo8YnI+CgpBdCBhIGhpZ2ggbGV2ZWwgYWxsIHRocmVlIGFwcHJvYWNoZXMgZm9jdXMgb24gdGhlIHNhbWUgdHlwZSBvZiBiZW5lZml0czogdGhlIGluY3JlYXNlIGluIGluY29tZXMgb3ZlciB0aGUgbGlmZXRpbWUgb2YgYmVuZWZpY2lhcmllcyBvZiBkZXdvcm1pbmcuIFRoaXMgaXMgbGlrZWx5IGFuIHVuZGVyLWVzdGltYXRlIG9mIHRoZSBiZW5lZml0cyBhcyBpdCBkb2VzIG5vdCBxdWFudGlmeSB0aGUgbm9uLXBlY3VuaWFyeSBlZmZlY3RzIG9mIGltcHJvdmVkIGhlYWx0aC4gIFRoZSBjb3N0cyBjYW4gYmUgc2VwYXJhdGVkIGludG8gZGlyZWN0IGNvc3RzIG9mIGltcGxlbWVudGluZyBhbmQgZXZhbHVhdGluZyBkZXdvcm1pbmcgcHJvZ3JhbXMsIGFuZCBpbmRpcmVjdCBjb3N0cywgc3VjaCBhcyBhZGRpdGlvbmFsIGNvc3RzIHRvIHRoZSBlZHVjYXRpb24gc3lzdGVtIGFzIGEgcmVzdWx0IG9mIGluY3JlYXNlZCBjaGlsZCBhdHRlbmRhbmNlLCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlbmVmaXRzIG9mIGRld29ybWluZy4KClRoZSBtYWluIGRpZmZlcmVuY2VzIGluIGJlbmVmaXRzIGFjcm9zcyB0aGUgdGhyZWUgYXBwcm9hY2hlcyBoYXZlIHRvIGRvIHdpdGggaG93IHRvIHByZWRpY3QgdGhlIGVhcm5pbmdzIHByb2ZpbGVzIG92ZXIgYSBsaWZlY3ljbGUsIGFuZCBob3cgdG8gYWNjb3VudCBmb3IgZGlmZmVyZW5jZXMgaW4gd29ybSBwcmV2YWxlbmNlIHJhdGVzIGFuZCBsZW5ndGggb2YgdHJlYXRtZW50IGFjcm9zcyBzZXR0aW5ncy4gQXBwcm9hY2hlcyAxIGFuZCAyIHVzZSBkaWZmZXJlbnQgZWFybmluZyBwcm9maWxlcywgYW5kIGFwcHJvYWNoIDMgY29tYmluZXMgYm90aCBlYXJuaW5nIHByb2ZpbGVzIGFuZCBhZGp1c3RzIGZvciBwb3NzaWJsZSBkaWZmZXJlbmNlcyBpbiBwcmV2YWxlbmNlIHJhdGVzIG9mIHdvcm0gaW5mZWN0aW9ucyBhbmQgbGVuZ3RoIG9mIHRyZWF0bWVudC4KClRoZSBtYWluIGRpZmZlcmVuY2VzIGluIGNvc3RzIGJldHdlZW4gc2NlbmFyaW9zIGhhdmUgdG8gZG8gd2l0aCBhKSB3aGV0aGVyIGluZGlyZWN0IGNvc3RzIGFyZSBpbmNsdWRlZCwgYW5kIGIpIGhvdyB0byBjb21wdXRlIHRoZSByZWxldmFudCB1bml0IGNvc3QgZm9yIHRoZSBhbmFseXNpcy4gVGhlIGZpcnN0IHR3byBhcHByb2FjaGVzIGluY2x1ZGUgaW5kaXJlY3QgY29zdHMgYW5kIHVzZSB0aGUgdW5pdCBjb3N0cyBvZiBhIHNwZWNpZmljIGNvdW50cnkgKEtlbnlhKSB3aGVyZSB0aGUgc3R1ZHkgd2FzIG9yaWdpbmFsbHkgY29uZHVjdGVkLCB3aGlsZSB0aGUgdGhpcmQgYXBwcm9hY2ggZG9lcyBub3QgaW5jbHVkZSBpbmRpcmVjdCBjb3N0cyBhbmQgdXNlIHVuaXQgY29zdHMgb2YgdmFyaW91cyBjb3VudHJpZXMgZnJvbSBkYXRhIHByb3ZpZGVkIGJ5IEV2aWRlbmNlIEFjdGlvbi4KCgojIyMgVGhlIGRpc2NvdW50aW5nIHJhdGUgIHstfQoKQWxsIHRocmVlIGFwcHJvYWNoZXMgdXNlIHRoZSByZWFsIGludGVyZXN0IHJhdGUgKCRyJCkgYXMgdGhlIGRpc2NvdW50aW5nIHJhdGUuIFRoaXMgaXMgb2J0YWluZWQgZnJvbSB0aGUgaW50ZXJlc3QgcmF0ZSBvbiBnb3Zlcm5tZW50IGJvbmRzICgkaSQpIG1pbnVzIHRoZSBpbmZsYXRpb24gcmF0ZSAoJFxwaSQpLgoKPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBhbGwgdGhlIGRldGFpbHM8L3N1bW1hcnk+CgpcYmVnaW57ZXF1YXRpb259CnIgPSBcZnJhY3sxICsgaX17MSArIFxwaX0gLSAxIFxcCnIgXGFwcHJveCBpIC0gXHBpCmByIGVxdWF0aW9uSW5kZXggPC0gZXF1YXRpb25JbmRleCArIDFgClxsYWJlbHtlcTpgciBlcXVhdGlvbkluZGV4YH0KXHRhZ3tgciBlcXVhdGlvbkluZGV4YH0KXGVuZHtlcXVhdGlvbn0KCldoZXJlOiAgIAoKLSAkciQ6IHJlYWwgaW50ZXJlc3QgcmF0ZSBhcyB0aGUgZGlzY291bnRpbmcgcmF0ZSAgCi0gJGkkOiBpbnRlcmVzdCByYXRlIG9uIGdvdmVybm1lbnQgYm9uZHMgIAotICRccGkkOiBpbmZsYXRpb24gcmF0ZSAgCgpgYGB7ciBpbnRlcmVzdC1yYXRlLCBlY2hvPXByaW50X2NvZGV9CiMgLSBpbnB1dHM6IG5vbWluYWwgaW50ZXJlc3QgcmF0ZSwgaW5mbGF0aW9uIHJhdGUKIyAtIG91dHB1dHM6IHJlYWwgaW50ZXJlc3QgcmF0ZS4gZXhhY3QgYW5kIGFwcHJveGltYXRlIGZvcm11bGEKY2h1bmtfaW50ZXJlc3QgPC0gZnVuY3Rpb24oKXsKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAKCiAgICBpbnRlcmVzdF9mIDwtIGZ1bmN0aW9uKGdvdl9ib25kc192YXIgPSBnb3ZfYm9uZHNfc28gLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRpb25fdmFyID0gaW5mbGF0aW9uX3NvKSB7ICAKICAgICAgICBpbnRlcmVzdF9leGN0X2luIDwtICgxICsgZ292X2JvbmRzX3ZhcikgLyAoMSArIGluZmxhdGlvbl92YXIpIC0gMQogICAgICAgIGludGVyZXN0X2luID0gZ292X2JvbmRzX3ZhciAtIGluZmxhdGlvbl92YXIKICAgICAgICByZXR1cm4obGlzdCgiaW50ZXJlc3RfaW4iID0gaW50ZXJlc3RfaW4sCiAgICAgICAgICAgICAgICAgICAgImludGVyZXN0X2V4Y3RfaW4iID0gaW50ZXJlc3RfZXhjdF9pbikpCiAgICB9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAogICAgcmV0dXJuKGxpc3QoImludGVyZXN0X2YiID0gaW50ZXJlc3RfZikpCn0KCmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfaW50ZXJlc3QoKSwuR2xvYmFsRW52KSApCgojIyMjIyBFeGVjdXRlIHZhbHVlcyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIHdoZW4gbmVlZGVkIGZvciB0aGUgdGV4dDoKCmludGVyZXN0X2luIDwtIGFzLm51bWVyaWMoCiAgaW50ZXJlc3RfZihnb3ZfYm9uZHNfdmFyID0gZ292X2JvbmRzX3NvLAogICAgICAgICAgICAgaW5mbGF0aW9uX3ZhciA9IGluZmxhdGlvbl9zbykkaW50ZXJlc3RfaW4KICApCgppbnRlcmVzdF9uZXdfaW4gPC0gYXMubnVtZXJpYygKICBpbnRlcmVzdF9mKGdvdl9ib25kc192YXIgPSBnb3ZfYm9uZHNfbmV3X3NvLAogICAgICAgICAgICAgaW5mbGF0aW9uX3ZhciA9IGluZmxhdGlvbl9uZXdfc28pJGludGVyZXN0X2luICAKICApCgpgYGAKCjwvZGV0YWlscz4KPGJyPgoKVGhlIGFjdHVhbCB2YWx1ZSB2YXJpZXMgYWNyb3NzIGFwcHJvYWNoZXMgZGVwZW5kaW5nIG9uIHRoZSB0aW1lIGFuZCBjb3VudHJ5IGNob3Nlbi4gRm9yIGV4YW1wbGUgYXBwcm9hY2ggMSB1c2VzIHRoZSByZXR1cm4gZnJvbSBnb3Zlcm5tZW50IGJvbmRzIGFuZCB0aGUgaW5mbGF0aW9uIHJhdGUgaW4gS2VueWEgZm9yIHRoZSB5ZWFyIDIwMTYsIHdoaWxlIGFwcHJvYWNoZXMgMiBhbmQgMyB1c2VzIHRoZSB2YWx1ZXMgZm9yIHRoZSBzYW1lIGNvdW50cnkgZm9yIHRoZSB5ZWFyIDIwMTkuIFRoaXMgcmVzdWx0cyBpbiBkaXNjb3VudCByYXRlcyBvZiBgciBwYXN0ZShyb3VuZCgxMDAgKiBpbnRlcmVzdF9pbiwyKSwgIiUiLCBzZXA9IiIpYCBhbmQgYHIgcGFzdGUocm91bmQoMTAwICogaW50ZXJlc3RfbmV3X2luLDIpLCAiJSIsIHNlcD0iIilgIGZvciBhcHByb2FjaCAxIGFuZCwgMiBhbmQgMyByZXNwZWN0aXZlbHkuCgoKCmBgYHtyIHN1bS10YWJsZXMyLCBwdXJsPUZBTFNFLCBlY2hvPUZBTFNFLCBldmFsPXNob3dfc3VtbWFyeV90YWJsZXN9CiMgU3VtbWFyeSB0YWJsZXMsIG5vdCB1c2VkIGZvciBub3cuCnRhYmxlXzEgPC0gbWF0cml4KCIiLCBucm93ID0gMSwgbmNvbCA9IDMpCnRhYmxlXzIgPC0gbWF0cml4KCIiLCBucm93ID0gMSwgbmNvbCA9IDIpCgp0YWJsZV8xWzEsMV0gPC0gcGFzdGUwKCIkXFxwaV97MTZ9PSIgLCBpbmZsYXRpb25fc28sICIkIikKCnRhYmxlXzEgPC0gcmJpbmQodGFibGVfMSwKICAgICAgICAgICAgICAgICBjKCBwYXN0ZTAoIiRpX3sxNn09IiAsIGdvdl9ib25kc19zbywgIiQiKSwgICIiLCAiIiApLAogICAgICAgICAgICAgICAgIGMoIHBhc3RlMCgiJFxccGlfezE5fT0iICwgaW5mbGF0aW9uX25ld19zbywgIiQiKSwgICIiLCAiIiApLAogICAgICAgICAgICAgICAgIGMoIHBhc3RlMCgiJGlfezE5fT0iICwgZ292X2JvbmRzX25ld19zbywgIiQiKSwgICIiLCAiIiApCiAgICApCgoKc3VtX3RhYmxlX2luZGV4IDwtIHN1bV90YWJsZV9pbmRleCsxCnRhYmxlXzIgPC0gcmJpbmQodGFibGVfMiwKICAgICAgICAgICAgICAgICBjKCIkTlBWID0gQiAtIEMkIiwKICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiJCgiLHN1bV90YWJsZV9pbmRleCwiKSQiICkpCiAgICApCnN1bV90YWJsZV9pbmRleCA8LSBzdW1fdGFibGVfaW5kZXgrMQp0YWJsZV8yIDwtIHJiaW5kKHRhYmxlXzIsCiAgICAgICAgICAgICAgICAgYygiJEI9XFxzdW1fe3Q9MH1eezUwfVxcbGVmdChcXGZyYWN7MX17MStyfVxccmlnaHQpXnt0fUVfe3R9JCIsCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIiQoIixzdW1fdGFibGVfaW5kZXgsIikkIiApKQogICAgKQoKc3VtX3RhYmxlX2luZGV4IDwtIHN1bV90YWJsZV9pbmRleCsxCnRhYmxlXzIgPC0gcmJpbmQodGFibGVfMiwKICAgICAgICAgICAgICAgICBjKCIkcj1cXGZyYWN7MStpfXsxK1xccGl9LTEkIiwKICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiJCgiLCBzdW1fdGFibGVfaW5kZXgsICIpJCIpICkKICAgICkKCmtuaXRyOjprYWJsZSh0YWJsZV8yLCBjb2wubmFtZXMgPSBjKCJFcXVhdGlvbiIsICIjIiksIGNhcHRpb24gPSAiU3VtbWFyeSBvZiBlcXVhdGlvbnMgdXNlZCB1bnRpbCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudCIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKQoKIygjdGFiOnN1bV90YWJsZXMyKVN1bW1hcnkgb2YgZXF1YXRpb25zIHVzZSB1bnRpbCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudAoKa25pdHI6OmthYmxlKHRhYmxlXzEsIGNvbC5uYW1lcyA9IGMoIkRhdGEiLCAiUmVzZWFyY2giLCAiR3Vlc3N3b3JrIiksIGNhcHRpb24gPSAiU291cmNlczogc3VtbWFyeSBvZiBpbnB1dHMgc3BlY2lmaWVkIHVudGlsIHRoaXMgcG9pbnQgaW4gdGhlIGRvY3VtZW50IikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpCmBgYAoKCiMjIEFwcHJvYWNoIDE6IEBiYWlyZDIwMTZ3b3JtcwoKSW4gdGhpcyBmaXJzdCBhcHByb2FjaCwgdGhlIGVmZmVjdCBvbiBlYXJuaW5ncyBvdmVyIHRoZSBlbnRpcmUgbGlmZWN5Y2xlIGlzIHByZWRpY3RlZCBieSBleHRyYXBvbGF0aW5nIHRoZSBlZmZlY3RzIG9uIGhvdXJzIHdvcmtlZCBieSBpbmRpdmlkdWFscyBpbiB0aGUgb3JpZ2luYWwgdHJlYXRtZW50IGdyb3VwLCB0ZW4geWVhcnMgYWZ0ZXIgdGhlIGludGVydmVudGlvbi4KClR3byB0eXBlcyBvZiByZXN1bHRzIGFyZSBwcmVzZW50ZWQ6IHRoZSB0b3RhbCBlZmZlY3Qgb24gZWFybmluZ3MgcHJvamVjdGVkIG92ZXIgYSBsaWZldGltZSBhbmQgdGhlIGVzdGltYXRlZCBmaXNjYWwgZWZmZWN0IGR1ZSB0byB0aGUgZ292ZXJubWVudCBjb2xsZWN0aW5nIGFkZGl0aW9uYWwgdGF4ZXMgb24gaGlnaGVyIGVhcm5pbmdzLiBUaGUgZWZmZWN0cyBhcmUgY2FsY3VsYXRlZCBpbiB0d28gc2NlbmFyaW9zOiB3aXRoIGFuZCB3aXRob3V0IGV4dGVybmFsaXRpZXMgb3ZlciB0aGUgcG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB3aG8gZGlkIG5vdCByZWNlaXZlIGRld29ybWluZyBpbnRlcnZlbnRpb25zLiBJbiB0aGUgb3JpZ2luYWwgZGV3b3JtaW5nIHN0dWR5IGNvbmR1Y3RlZCBpbiBLZW55YSwgdGhlcmUgaXMgZXZpZGVuY2Ugb2YgZXBpZGVtaW9sb2dpY2FsIGV4dGVybmFsaXRpZXMgZm9yIGNoaWxkcmVuIHdobyByZW1haW5lZCB1bnRyZWF0ZWQgYnV0IHdobyBhdHRlbmRlZCB0cmVhdG1lbnQgc2Nob29scywgYXMgd2VsbCBhcyBmb3IgY2hpbGRyZW4gbGl2aW5nIG5lYXIgdHJlYXRtZW50IHNjaG9vbHMuIEV4dGVybmFsaXR5IGVmZmVjdHMgbWF5IG5vdCBiZSBhcyByZWxldmFudCBmb3IgY3VycmVudC1kYXkgZGV3b3JtaW5nIHByb2dyYW1zIHNpbmNlIG1vc3QgcHJvZ3JhbXMgYXJlIG5hdGlvbmFsIHByb2dyYW1zIHRoYXQgdGFyZ2V0IGFsbCBzY2hvb2wtYWdlZCBjaGlsZHJlbiAoYW5kIGluIHNvbWUgY2FzZXMsIHByZXNjaG9vbC1hZ2VkIGNoaWxkcmVuKSBpbiBhdC1yaXNrIGFyZWFzLgoKCiMjIyAgR2FpbnMgaW4gZWFybmluZ3MKCkdhaW5zIGluIGVhcm5pbmdzICgkXERlbHRhIFdfe3R9JCkgYXJlIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgZXhwZWN0ZWQgZWFybmluZ3MgaW4gYSBjZXJ0YWluIHBlcmlvZCAoJHdfdCQpIHdpdGggdGhlIGVmZmVjdHMgb2YgZGV3b3JtaW5nIG9uIHdvcmtlZCBob3Vycy4gVGhpcyBlZmZlY3QgY2FuIGhhdmUgdHdvIGNvbXBvbmVudHM6IGEgZGlyZWN0IGVmZmVjdCBvZiBkZXdvcm1pbmcgb24gdGhlIGluZGl2aWR1YWwgKCRcbGFtYmRhXzEkKSBhbmQgdGhlIGluZGlyZWN0IGVmZmVjdCBvbiBlYXJuaW5ncyBkdWUgdG8gZXh0ZXJuYWxpdGllcyAoJFxsYW1iZGFfMiQpLiBUaGUgaW5kaXJlY3QgZWZmZWN0cyBhcmUgY29uc2lkZXJlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIHRyZWF0bWVudCBjb3ZlcmFnZSBhbmQgc2F0dXJhdGlvbi4KCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5PgoKXGJlZ2lue2VxdWF0aW9ufQpcRGVsdGEgV197dH0gPSB3X3t0fVxsZWZ0KCBcbGFtYmRhX3sxfSArIFxmcmFje3AgXGxhbWJkYV97Mn19e1J9IFxyaWdodCkKYHIgZXF1YXRpb25JbmRleCA8LSBlcXVhdGlvbkluZGV4ICsgMWAKXGxhYmVse2VxOmByIGVxdWF0aW9uSW5kZXhgfQpcdGFne2ByIGVxdWF0aW9uSW5kZXhgfQpcZW5ke2VxdWF0aW9ufQoKV2hlcmVbXjZdOiAgIAoKIC0gJHdfdCQ6IHRoZSBlYXJuaW5ncyBpbiBwZXJpb2QgJHQkICAgCiAtICRcbGFtYmRhX3sxfSQ6IHRoZSBkaXJlY3QgZWZmZWN0cyBvZiBkZXdvcm1pbmcgb24gZWFybmluZ3MgIAogLSAkXGxhbWJkYV97Mn0kOiB0aGUgaW5kaXJlY3QgZWZmZWN0cyBvZiBkZXdvcm1pbmcgb24gZWFybmluZ3MgICAKIC0gJHAkOiBzYXR1cmF0aW9uLCBtZWFzdXJlcyB0aGUgZnJhY3Rpb24gb2YgdGhlIHBvcHVsYXRpb24gdGhhdCBpcyBlZmZlY3RpdmVseSB1c2luZyB0aGUgdHJlYXRtZW50ICAKIC0gJFIkOiBjb3ZlcmFnZSwgZGVmaW5lZCBhcyB0aGUgZnJhY3Rpb24sIGFtb25nIGFsbCBuZWlnaGJvcmluZyBzY2hvb2xzICh3aXRoaW4gNiBrbSksIHRoYXQgYmVsb25ncyB0byB0aGUgdHJlYXRtZW50IGdyb3VwICAKClteNl06IFRoZSBvcmlnaW5hbCBlcXVhdGlvbiBzZXBhcmF0ZXMgZWZmZWN0cyBieSBnZW5kZXIuIEJ1dCB0aGUgZmluYWwgY2FsY3VsYXRpb24gKGJlaGluZCB0YWJsZSA1IGluIHBhcGVyKSBkb2VzIG5vdCBzZXBhcmF0ZSBieSBnZW5kZXIuCgoKYGBge3IgZWFybmluZ3MxLCBlY2hvPXByaW50X2NvZGV9CiMgLSBpbnB1dHM6IGVhcm5pbmdzIHdpaHRvdXQgdHJlYXRtZW50ICh3YWdlX2luKSwgZGlyZWN0IHRyZWF0bWVudCBlZmYKIyAobGFtYmRhMV9zbyksIGluZGlyZWN0IHRyZWF0bWVudCBlZmYgKGxhbWJkYTJfc28pLCBzYXR1cmF0aW9uIGFuZCBjb3ZlcmFnZSAoY292ZXJhZ2Vfc28pCiMgLSBvdXRwdXRzOiBlYXJuaW5ncyAobm8gbmFtZSBzcGVjaWZpZWQpCmNodW5rX2Vhcm5pbmdzMSA8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAoKICAgIGVhcm5pbmdzX2FwcDFfZiA8LSBmdW5jdGlvbih3YWdlX3ZhciA9IHdhZ2VfdF9pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGExX3ZhciA9IGxhbWJkYTFfc28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhMl92YXIgPSBsYW1iZGEyX3NvLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb25fdmFyID0gc2F0dXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZV92YXIgPSBjb3ZlcmFnZV9zbykgeyAgCiAgICAgICAgcmVzMSA8LSB3YWdlX3ZhciAqICggbGFtYmRhMV92YXIgKyBzYXR1cmF0aW9uX3ZhciAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEyX3ZhciAvIGNvdmVyYWdlX3ZhciApCiAgICAgICAgcmV0dXJuKHJlczEpCiAgICB9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAogICAgcmV0dXJuKGxpc3QoImVhcm5pbmdzX2FwcDFfZiIgPSBlYXJuaW5nc19hcHAxX2YpKQp9CgppbnZpc2libGUoIGxpc3QyZW52KGNodW5rX2Vhcm5pbmdzMSgpLC5HbG9iYWxFbnYpICkKYGBgCgo8L2RldGFpbHM+Cjxicj4KCiMjIyMgRWFybmluZ3Mgb3ZlciB0aW1lCgpXYWdlcyBpbiB5ZWFyICR0JCBjb3JyZXNwb25kIHRvIHRoZSBpbml0aWFsIHdlZWtseSB3YWdlICgkd18wJCkgYWRqdXN0ZWQgYnkgYW4gZWNvbm9teS13aWRlIGluY3JlYXNlIGluIHNhbGFyaWVzIGFuZCBieSBhbiBpbmNyZWFzZSBpbiBzYWxhcmllcyBkdWUgdG8gYWRkaXRpb25hbCBleHBlcmllbmNlIGF0IHRoZSBpbmRpdmlkdWFsIGxldmVsLiBUaGUgZWNvbm9teS13aWRlIHdhZ2UgYWRqdXN0bWVudCBpcyBhc3N1bWVkIHRvIGJlIGVxdWFsIHRvIHRoZSBwZXIgY2FwaXRhIEdEUCBncm93dGggKCRnJCkgYXBwbGllZCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIHllYXJzIG9mIHdvcmsgKCRYcCQpLiBUaGUgbGlmZSBjeWNsZSBwYXRoIGZvciB3YWdlcyBpbmNyZWFzZXMgYXQgZGVjcmVhc2luZyByYXRlcyAod2FnZXMgdHlwaWNhbGx5IGluY3JlYXNlIHdpdGggbW9yZSB5ZWFycyBvZiB3b3JrLCB0aGVuIGRlY2xpbmUgbGF0ZXIgaW4gYSBsaWZlIGN5Y2xlKS4gSXQgaXMgYXNzdW1lZCB0aGF0IGluZGl2aWR1YWxzIGVudGVyIHRoZSBsYWJvciBmb3JjZSAxMCB5ZWFycyBhZnRlciB0aGUgdHJlYXRtZW50IHBlcmlvZC4gV2Vla2x5IHdhZ2VzIGFyZSBtdWx0aXBsaWVkIGJ5IDUyIHdlZWtzIHRvIG9idGFpbiB0aGUgYW5udWFsIHJhdGUuCgpUaGUgaW5pdGlhbCB3YWdlIGluIGRvbGxhcnMgKCR3X3swfSQpIGlzIGEgd2VpZ2h0ZWQgYXZlcmFnZSBvZiB3YWdlcyBmb3IgdGhlIGNvbnRyb2wgZ3JvdXAgaW4gYWdyaWN1bHR1cmUsIHdvcmtpbmcgd2FnZSwgYW5kIHNlbGYtZW1wbG95ZWQgc2VjdG9ycyAoJGFnLCB3dywgc2UkKS4gVGhlIHdlaWdodHMgY29ycmVzcG9uZCB0byB0aGUgZnJhY3Rpb24gb2YgYWxsIHRoZSBhdmVyYWdlIHdvcmtlZCBob3VycyBkZWRpY2F0ZWQgdG8gZWFjaCBzZWN0b3IgKCRoJCkuICAKCjwhLS1UbyBkbzogZmluZCB0aGUgc3BlY2lmaWMgcmVmZXJlbmNlIGZyb20gaW4gU3VyaSAocGFnZSwgYW5kIHRhYmxlICMsICBsb2NhdGlvbiksIGFuZCBhZGQgdXNpbmcgdGhlIEBub3RhdGlvbiAoeW91IHdpbGwgbmVlZCB0byBlZGl0IHRoZSBiaWJsaW9ncmFwaHkuYmliIGZpbGUpLiBJZiB5b3UgY2Fubm90IGZpbmQgdGhlIFN1cmkgcmVmZXJlbmNlLCBzZW5kIG1lIGFuIGVtYWlsIGFuZCBJIHdpbGwgbG9vayBmb3IgaXQtLT4KClRoZSB3YWdlIGluIGFncmljdWx0dXJlIGNvbWVzIGZyb20gQHN1cmkyMDExc2VsZWN0aW9uLCB3aGVyZWFzIHRoZSB3b3JraW5nIHdhZ2UgY29tZXMgZnJvbSB0aGUgc3R1ZHkgZGF0YSBhbmQgaXMgZGVmaW5lZCBhcyBhbiBob3VybHkgd2FnZSBmb3IgdGhvc2Ugd2hvIHJlcG9ydGVkIG1vcmUgdGhhbiAxMCBocnMgb2Ygd29yayBwZXIgd2VlayBpbiB0aGUgY29udHJvbCBncm91cC4gVGhlIHNlbGYtZW1wbG95ZWQgd2FnZSAoJHdfe3NlfSQpIHdhcyBjb25zdHJ1Y3RlZCBhcyB0aGUgcmVwb3J0ZWQgbW9udGhseSBlYXJuaW5ncyBmcm9tIHNlbGYtZW1wbG95ZWQgcHJvZml0cywgZGl2aWRlZCBieSB0aGUgcmVwb3J0ZWQgd2Vla2x5IG51bWJlciBvZiBob3VycyB3b3JrZWQgaW4gc2VsZi1lbXBsb3ltZW50IGZvciB0aG9zZSB3aG8gd29ya2VkIGEgcG9zaXRpdmUgbnVtYmVyIG9mIGhvdXJzIChtdWx0aXBsaWVkIGJ5IDQuNSB0byBvYnRhaW4gdGhlIG1vbnRobHkgdG90YWwpLgoKVGhlIG1vbnRobHkgc2VsZi1lbXBsb3llZCBwcm9maXRzIGFuZCBzZWxmLWVtcGxveWVkIGhvdXJzIGZvciB0aGUgY29udHJvbCBncm91cCwgZm9yIHRob3NlIHdpdGggcG9zaXRpdmUgaG91cnMsIGFsc28gY29tZXMgZnJvbSBzdHVkeSBkYXRhIChQYWdlIDExNjgsIFRhYmxlIDQsIFBhbmVsIEMsIENvbHVtbiA1LCBSb3cgMSkuIFRoZSBtZWFzdXJlIG9mIGhvdXJzIGluIHNlbGYgZW1wbG95bWVudCB1c2VkIHRvIGNvbXB1dGUgd2FnZXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9uZSB1c2VkIHRvIGNvbXB1dGUgdGhlIHdlaWdodHMgYWJvdmUuIFRoZSBmaXJzdCBvbmUgY2FwdHVyZXMgaG91cnMgb2Ygd29yayBhbW9uZyB0aG9zZSBhY3RpdmVseSBlbXBsb3llZCBpbiB0aGUgc2VsZi1lbXBsb3llZCBzZWN0b3IsIGFuZCB0aGUgc2Vjb25kIGNhcHR1cmVzIHRoZSBhdmVyYWdlIGhvdXJzIG9mIHdvcmsgYXMgc2VsZi1lbXBsb3llZCBhbW9uZyBhbGwgdGhlIHBvcHVsYXRpb24gb2Ygd29ya2luZyBhZ2UgaW4gdGhlIHNhbXBsZSAoaGVuY2UgY2FwdHVyaW5nIHRoZSByZWxhdGl2ZSBpbXBvcnRhbmNlIG9mIHRoZSBzZWxmIGVtcGxveWVkIHNlY3RvciBpbiB0aGUgZWNvbm9teSkuCgoKPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBhbGwgdGhlIGRldGFpbHM8L3N1bW1hcnk+CgpUaGUgd2FnZXMvZWFybmluZ3MgYXJlIGRldGVybWluZWQgYnk6ICAKClxiZWdpbntlcXVhdGlvbn0Kd190ID0gIFx0ZXh0eyN3ZWVrc30gXHRpbWVzIHdfMCAoMSArIGcpXntYcH0oMSArIFxoYXR7XGJldGFfMX0gWHAgKyBcaGF0e1xiZXRhXzJ9IFhwXjIpIFxxdWFkIFx0ZXh0e2ZvciB9IHQ9MTAsIFxkb3RzLCA1MApgciBlcXVhdGlvbkluZGV4IDwtIGVxdWF0aW9uSW5kZXggKyAxYApcbGFiZWx7ZXE6YHIgZXF1YXRpb25JbmRleGB9Clx0YWd7YHIgZXF1YXRpb25JbmRleGB9ClxlbmR7ZXF1YXRpb259CgpcYmVnaW57ZXF1YXRpb259CndfMCA9IFxmcmFjezF9e2V4fSBcc3VtX3tsIFxpbiBce2FnLCB3dywgc2VcfX13X3tsfVxhbHBoYV97bH0KXFwgXHF1YWQgXHRleHR7d2l0aDogfSBcYWxwaGFfe2x9PSBcZnJhY3sgaF97bH19e2hfe2FnfSArIGhfe3d3fSArIGhfe3NlfX0KYHIgZXF1YXRpb25JbmRleCA8LSBlcXVhdGlvbkluZGV4ICsgMWAKXGxhYmVse2VxOmByIGVxdWF0aW9uSW5kZXhgfQpcdGFne2ByIGVxdWF0aW9uSW5kZXhgfQpcZW5ke2VxdWF0aW9ufQoKXGJlZ2lue2VxdWF0aW9ufQp3X3tzZX0gPSAgXGZyYWN7IFx0ZXh0e01vbnRobHkgc2VsZi1lbXBsb3llZCBwcm9maXRzfSB9ezQuNSBcdGltZXMgRVtoX3tzZX18aF97c2V9PjBdIH0KYHIgZXF1YXRpb25JbmRleCA8LSBlcXVhdGlvbkluZGV4ICsgMWAKXGxhYmVse2VxOmByIGVxdWF0aW9uSW5kZXhgfQpcdGFne2ByIGVxdWF0aW9uSW5kZXhgfQpcZW5ke2VxdWF0aW9ufQoKV2hlcmU6ICAKCi0gJHdfdCQ6IHRoZSB3ZWVrbHkgZWFybmluZ3MgaW4gcGVyaW9kICR0JCAgCi0gJHdfMCQ6IHRoZSBpbml0aWFsIHdlZWtseSBlYXJuaW5ncyAgCi0gJGckOiBwZXIgY2FwaXRhIEdEUCBncm93dGggIAotICRYcCQ6IHllYXJzIG9mIHdvcmsgIAotICRcaGF0e1xiZXRhXzF9JDogY29lZmZpY2llbnQgZXN0aW1hdGUgZm9yICRYcCQgIAotICRcaGF0e1xiZXRhXzJ9JDogY29lZmZpY2llbnQgZXN0aW1hdGUgZm9yICRYcF4yJCAgCi0gJGV4JDogZXhjaGFuZ2UgcmF0ZQotICRoJDogYXZlcmFnZSB3b3JrZWQgaG91cnMgZGVkaWNhdGVkIHRvIGVhY2ggc2VjdG9yICAKLSAkYWckOiBhZ3JpY3VsdHVyZSAgCi0gJHd3JDogd29ya2luZyB3YWdlICAKLSAkc2UkOiBzZWxmLWVtcGxveWVkIHNlY3RvcnMgIAoKCmBgYHtyIHdhZ2VfdCwgZWNobz1wcmludF9jb2RlfQojaW5wdXRzOiB3YWdlcyAod2FnZV9hZ19zbywgd2FnZV93d19zbykgc2VsZiBlbXBsb3llZCBpbmNvbWUgKHByb2ZpdHNfc2Vfc28sCiMgIGhvdXJzX3NlX2NvbmRfc28pIGhvdXJzIG9mIHdvcmsgKGhvdXJzX2FnX3NvLCBob3Vyc193d19zbywgaG91cnNfc2Vfc28pLAojICBleGNoYW5nZSByYXRlIChleF9yYXRlX3NvKSwgdGltaW5nIHZhcnMgKHBlcmlvZHNfc28sIHRpbWVfdG9fam1fc28pLAojICBncm93dGggcmF0ZSAoZ3Jvd3RoX3JhdGVfc28pLCBtaW5jZXIgY29lZiAoY29lZl9leHBfc29bMV0sIGNvZWZfZXhwX3NvWzJdKQojCiNvdXRwdXRzOiBTdGFydGluZyB3YWdlczogdmFsdWUgKHdhZ2VfMF9pbikgYW5kIGZ1bmN0aW9uICh3YWdlXzBfZiksCiMgV2FnZSB0cmFqZWN0b3J5OiB2YWx1ZSAod2FnZV90X2luKSBhbmQgZnVuY3Rpb24gKHdhZ2VfdF9mKS4KY2h1bmtfd2FnZXMgPC0gZnVuY3Rpb24oKXsKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAogICAgI2Nsb3NlIHRvIHZhbHVlIGZyb20gc3ByZWFkc2hlZXQgKEFzc3VtcHMmUGFuZWwgQSBDYWxjcyFCMTM3ID0gMC4xNDgxMDg0KSwKICAgICNidXQgSSBzdXNwZWN0IGRpZmYgZHVlIHRvIGNvbXB1dGF0aW9uYWwgcHJlY2lzaW9uCgogIHdhZ2VfMF9mIDwtIGZ1bmN0aW9uKHdhZ2VfYWdfdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIHdhZ2Vfd3dfdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpdHNfc2VfdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzX3NlX2NvbmRfdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzX2FnX3ZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICBob3Vyc193d192YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaG91cnNfc2VfdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGV4X3JhdGVfdmFyKXsKICAgICAgICBleHBlcmllbmNlX2F1eCA8LSAwOnBlcmlvZHNfc28gLSB0aW1lX3RvX2ptX3NvCiAgICAgICAgd2FnZV9zZSA8LSBwcm9maXRzX3NlX3ZhciAvICg0LjUgKiBob3Vyc19zZV9jb25kX3ZhcikKICAgICAgICB3YWdlX2xzIDwtIGMod2FnZV9hZ192YXIsIHdhZ2Vfd3dfdmFyLCB3YWdlX3NlKQogICAgICAgIGFscGhhX2xzIDwtIGMoaG91cnNfYWdfdmFyLCBob3Vyc193d192YXIsIGhvdXJzX3NlX3ZhcikgLwogICAgICAgICAgc3VtKCBjKGhvdXJzX2FnX3ZhciwgaG91cnNfd3dfdmFyLCBob3Vyc19zZV92YXIpICkKICAgICAgICByZXMxIDwtIDEvZXhfcmF0ZV92YXIgKiBzdW0oIHdhZ2VfbHMgKiBhbHBoYV9scyApCiAgICAgICAgcmV0dXJuKHJlczEpCiAgICB9CgogIHdhZ2VfdF9mIDwtIGZ1bmN0aW9uKHdhZ2VfMF92YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvd3RoX3JhdGVfdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZfZXhwMV92YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZl9leHAyX3ZhcikgewogICAgICAgIGV4cGVyaWVuY2VfYXV4IDwtIDA6cGVyaW9kc19zbyAtIHRpbWVfdG9fam1fc28KICAgICAgICByZXMxIDwtIDUyICogd2FnZV8wX3ZhciAqICggKCAxICsgZ3Jvd3RoX3JhdGVfdmFyICleZXhwZXJpZW5jZV9hdXggKSAqCiAgICAgICAgICAoIDEgKyBjb2VmX2V4cDFfdmFyICogZXhwZXJpZW5jZV9hdXggKyBjb2VmX2V4cDJfdmFyICoKICAgICAgICAgICAgICAoZXhwZXJpZW5jZV9hdXheMikgKSAqIGlmZWxzZSgwOnBlcmlvZHNfc28gPj0gdGltZV90b19qbV9zbywgMSwgMCkKICAgICAgICByZXR1cm4ocmVzMSkKICAgIH0KCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIHJldHVybihsaXN0KCJ3YWdlXzBfZiIgPSB3YWdlXzBfZiwKICAgICAgICAgICAgICAgICJ3YWdlX3RfZiIgPSB3YWdlX3RfZikpCn0KCmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfd2FnZXMoKSwuR2xvYmFsRW52KSApCgojIyMjIyBFeGVjdXRlIHZhbHVlcyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIHdoZW4gbmVlZGVkIGZvciB0aGUgdGV4dDoKd2FnZV8wX2luIDwtIHdhZ2VfMF9mKHdhZ2VfYWdfdmFyID0gd2FnZV9hZ19zbywgIAogICAgICAgICAgICAgICAgICAgICAgd2FnZV93d192YXIgPSB3YWdlX3d3X3NvLAogICAgICAgICAgICAgICAgICAgICAgcHJvZml0c19zZV92YXIgPSBwcm9maXRzX3NlX3NvLAogICAgICAgICAgICAgICAgICAgICAgaG91cnNfc2VfY29uZF92YXIgPSBob3Vyc19zZV9jb25kX3NvLCAgCiAgICAgICAgICAgICAgICAgICAgICBob3Vyc19hZ192YXIgPSBob3Vyc19hZ19zbywKICAgICAgICAgICAgICAgICAgICAgIGhvdXJzX3d3X3ZhciA9IGhvdXJzX3d3X3NvLAogICAgICAgICAgICAgICAgICAgICAgaG91cnNfc2VfdmFyID0gaG91cnNfc2Vfc28sCiAgICAgICAgICAgICAgICAgICAgICBleF9yYXRlX3ZhciA9IGV4X3JhdGVfc28pICAKCiNjbG9zZSB0byB2YWx1ZSBmcm9tIHNwcmVhZHNoZWV0IChDYWxjcy1UYWJsZSA1IU4yMS4uID0gNy43MDE2MzQ2NzgpLAojYnV0IEkgc3VzcGVjdCBkaWZmIGR1ZSB0byBjb21wdXRhdGlvbmFsIHByZWNpc2lvbgp3YWdlX3RfaW4gPC0gd2FnZV90X2Yod2FnZV8wX3ZhciA9IHdhZ2VfMF9pbiwKICAgICAgICAgICAgICAgICAgICAgIGdyb3d0aF9yYXRlX3ZhciA9IGdyb3d0aF9yYXRlX3NvLAogICAgICAgICAgICAgICAgICAgICAgY29lZl9leHAxX3ZhciA9IGNvZWZfZXhwX3NvWzFdLAogICAgICAgICAgICAgICAgICAgICAgY29lZl9leHAyX3ZhciA9IGNvZWZfZXhwX3NvWzJdKQoKYGBgCgo8L2RldGFpbHM+Cjxicj4KCiMjIyMgRGV3b3JtaW5nIGVmZmVjdHM6IGRpcmVjdCBhbmQgZXh0ZXJuYWxpdGllcwoKVGhlIGVzdGltYXRlZCBpbXBhY3Qgb2YgZGV3b3JtaW5nIG9uIGhvdXJzIHdvcmtlZCBjb21lcyBmcm9tIEBiYWlyZDIwMTZ3b3JtcyBhbmQgYXJlIGVzdGltYXRlZCBzZXBhcmF0ZWx5IGZvciBtZW4gKCRcbGFtYmRhX3sxLG1hbGV9JCkgYW5kIHdvbWVuICgkXGxhbWJkYV97MSxmZW1hbGV9JCkuIFRoZXNlIHR3byBwYXJhbWV0ZXJzIGFyZSBjb21iaW5lZCB3aXRoIGEgc2ltcGxlIG1lYW4gaW4gdGhlIGFuYWx5c2lzLgoKVGhlIGVzdGltYXRlZCBleHRlcm5hbGl0eSBlZmZlY3QgKCRcbGFtYmRhX3syfSQpIHJlZmxlY3RzIHRoZSBhZGRpdGlvbmFsIGhvdXJzIHdvcmtlZCBkdWUgdG8gaW5kaXZpZHVhbHMgd2hvIGRpZCBub3QgcmVjZWl2ZSB0aGUgdHJlYXRtZW50IGJ1dCBzdGlsbCBzYXcgcmVkdWN0aW9ucyBpbiB0aGUgbGlrZWxpaG9vZCBvZiBpbmZlY3Rpb24gZHVlIHRvIGxvd2VyIHdvcm0gcHJldmFsZW5jZSBpbiB0aGVpciBjb21tdW5pdHkuICBOb3RlIHRoYXQgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGVzdGltYXRlZCBieSBnZW5kZXIsIHNvIHdlIHJlcGVhdCBpdHMgdmFsdWUgdHdvIHRpbWVzLiBBbGwgdGhlIGNvbXBvbmVudHMgdG8gdGhlIGVxdWF0aW9uIFxccmVme2VxOmByIGVxdWF0aW9uSW5kZXggKyAxYH0gY29tZSBmcm9tIEBiYWlyZDIwMTZ3b3Jtcy4gVGhlIGV4dGVybmFsaXRpZXMgZWZmZWN0cyBhcmUgYWRqdXN0ZWQgYnkgdGhlIGNvdmVyYWdlIGFuZCBzYXR1cmF0aW9uIG9mIHRoZSBvcmlnaW5hbCBzdHVkeS4KCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5PgoKXGJlZ2lue2VxdWF0aW9ufQpcbGFtYmRhX3sxfSA9IFxmcmFjezF9ezJ9IFxsYW1iZGFfezEsbWFsZX0gKyBcZnJhY3sxfXsyfSBcbGFtYmRhX3sxLGZlbWFsZX1cXApgciBlcXVhdGlvbkluZGV4IDwtIGVxdWF0aW9uSW5kZXggKyAxYApcbGFiZWx7ZXE6YHIgZXF1YXRpb25JbmRleGB9Clx0YWd7YHIgZXF1YXRpb25JbmRleGB9ClxlbmR7ZXF1YXRpb259CgpXaGVyZToKCi0gJFxsYW1iZGFfMSQ6IGF2ZXJhZ2UgaW1wYWN0IG9mIGRld29ybWluZyBvbiBob3VycyB3b3JrZWQgZm9yIGJvdGggbWVuIGFuZCB3b21lbiAgCi0gJFxsYW1iZGFfezEsbWFsZX0kOiBhdmVyYWdlIGltcGFjdCBvZiBkZXdvcm1pbmcgb24gaG91cnMgd29ya2VkIGZvciBtZW4gICAKLSAkXGxhbWJkYV97MSwgZmVtYWxlfSQ6IGF2ZXJhZ2UgaW1wYWN0IG9mIGRld29ybWluZyBvbiBob3VycyB3b3JrZWQgZm9yIHdvbWVuICAKCgpgYGB7ciBsYW1iZGFzLCBlY2hvPXByaW50X2NvZGV9CiMgLSBpbnB1dHM6IGRpcmVjdCAobGFtYmRhMV9zbyksIGFuZCBpbmRpcmVjdCAobGFtYmRhMl9zbykgdHJlYXRtZW50IGVmZmVjdHMgYnkgZ2VuZGVyCiMgLSBvdXRwdXRzOiBzaW1wbGUgYXZlcmFnZSBvZiBkaXJlY3QgYW5kIGluZGlyZWN0IHRyZWF0bWVudCBlZmYuCmNodW5rX2xhbWJkYXM8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgCgogICAgbGFtYmRhMV9pbl9mIDwtIGZ1bmN0aW9uKGxhbWJkYTFfdmFyID0gbGFtYmRhMV9zbykgewogICAgICAgIHJlcCgwLjUgKiBsYW1iZGExX3ZhclsxXSArIDAuNSAqbGFtYmRhMV92YXJbMl0sIDIpCiAgICB9CiAgICBsYW1iZGEyX2luX2YgPC0gZnVuY3Rpb24obGFtYmRhMl92YXIgPSBsYW1iZGEyX3NvKXsKICAgICAgICByZXAobGFtYmRhMl92YXIsIDIpCiAgICB9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCiAgICByZXR1cm4obGlzdCgibGFtYmRhMV9pbl9mIiA9IGxhbWJkYTFfaW5fZiwKICAgICAgICAgICAgICAgICJsYW1iZGEyX2luX2YiID0gbGFtYmRhMl9pbl9mICkgKQp9CmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfbGFtYmRhcygpLC5HbG9iYWxFbnYpICkKCiMjIyMjIEV4ZWN1dGUgdmFsdWVzIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUgd2hlbiBuZWVkZWQgZm9yIHRoZSB0ZXh0OgpsYW1iZGExX2luIDwtIGxhbWJkYTFfaW5fZigpCmxhbWJkYTJfaW4gPC0gbGFtYmRhMl9pbl9mKCkKYGBgCgo8L2RldGFpbHM+Cjxicj4KCiMjIyMgQ292ZXJhZ2UgYW5kIHNhdHVyYXRpb24gb2YgdGhlIG9yaWdpbmFsIHN0dWR5CgpUaGUgY292ZXJhZ2UgKCRSJCkgaXMgZGVmaW5lZCBhcyB0aGUgZnJhY3Rpb24sIGFtb25nIGFsbCBuZWlnaGJvcmluZyBzY2hvb2xzICh3aXRoaW4gNiBrbSksIHRoYXQgd2VyZSB0cmVhdGVkIHdpdGhpbiB0aGUgc3R1ZHkuIFNpbmNlIHRoZSB0cmVhdG1lbnQgd2FzIGFwcGxpZWQgdG8gYXBwcm94aW1hdGVseSB0d28gdGhpcmRzIG9mIHRoZSBwb3B1bGF0aW9uLCAkUiQgaXMgc2V0IHRvOiAkUiAgPSBgciByb3VuZChjb3ZlcmFnZV9zbywgMilgJFteNl0uICAKClRoZSBzYXR1cmF0aW9uIG9mIHRoZSBpbnRlcnZlbnRpb24sICRwJCwgbWVhc3VyZXMgdGhlIGZyYWN0aW9uIG9mIHRoZSBwb3B1bGF0aW9uIHRoYXQgaXMgZWZmZWN0aXZlbHkgdXNpbmcgdGhlIHRyZWF0bWVudC4gSXQgaXMgZGVmaW5lZCBhcyBhIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgdGhlIHRyZWF0bWVudCB0YWtlLXVwIHVuZGVyIGEgZnVsbCBzdWJzaWR5IGZvciBkZXdvcm1pbmcgYW5kIHRoZSB0YWtlLXVwIHVuZGVyIHplcm8gc3Vic2lkeS4gICAKCgpbXjZdOiBMYXN0IHBhcmFncmFwaCBvZiBwYWdlIDkoMTY0NSkgb2YgQGJhaXJkMjAxNndvcm1zCgoKRm9yIHRoaXMgc2V0dGluZyBAa3JlbWVyMjAwN2lsbHVzaW9uIChQYWdlIDQ4LCBUYWJsZSAxLCBQYW5lbCBDLCBDb2wgMSwgUm93IDMpIGVzdGltYXRlZCB0aGF0IHRha2UtdXAgd2l0aCBmdWxsIHN1YnNpZHkgKCRRKGZ1bGwpJCkgd2FzIGByIHFfZnVsbF9zb2AuIE1pZ3VlbCBhbmQgS3JlbWVyICgyMDA0KSAoVGFibGUgMyBhbmQgZm9vdG5vdGUgMTgpIG9ic2VydmVkIG1pbmltYWwgdG8gbm8gdGFrZS11cCB3aXRob3V0IHN1YnNpZHkgKCRRKDApJCksIGhlbmNlIGl0IGlzIGFzc2lnbmVkIHRoZSB2YWx1ZSBvZiBgciBxX3plcm9fc29gLiAgCgo8ZGV0YWlscz48c3VtbWFyeT5TaG93IGFsbCB0aGUgZGV0YWlsczwvc3VtbWFyeT4KClxiZWdpbntlcXVhdGlvbn0KcCA9IFIgXHRpbWVzIFEoZnVsbCkgICsgKDEgLSBSKSBcdGltZXMgUSgwKQpgciBlcXVhdGlvbkluZGV4IDwtIGVxdWF0aW9uSW5kZXggKyAxYApcbGFiZWx7ZXE6YHIgZXF1YXRpb25JbmRleGB9Clx0YWd7YHIgZXF1YXRpb25JbmRleGB9ClxlbmR7ZXF1YXRpb259CgpXaGVyZToKCi0gJHAkOiBzYXR1cmF0aW9uLCBtZWFzdXJlcyB0aGUgZnJhY3Rpb24gb2YgdGhlIHBvcHVsYXRpb24gdGhhdCBpcyBlZmZlY3RpdmVseSB1c2luZyB0aGUgdHJlYXRtZW50ICAKLSAkUiQ6IGNvdmVyYWdlLCBtZWFzdXJlcyB0aGUgZnJhY3Rpb24gb2YgdGhlIHBvcHVsYXRpb24gdGhhdCBpcyBlZmZlY3RpdmVseSB1c2luZyB0aGUgdHJlYXRtZW50ICAKLSAkUShmdWxsKSQ6IHRha2UtdXAgd2l0aCBmdWxsIHN1YnNpZHkgIAotICRRKDApJDogdGFrZS11cCB3aXRob3V0IHN1YnNpZHkgIAoKCmBgYHtyIGNvdmVyYWdlLWFuZC1zYXR1cmF0aW9uLCBlY2hvID0gcHJpbnRfY29kZX0KIyAtIGlucHV0czogY292ZXJhZ2UgKGNvdmVyYWdlX3NvKSwgdGFrZS11cCB3aXRoIGZ1bGwgc3Vic2lkeSAocV9mdWxsX3NvKSwgYW5kCiMgdGFrZS11cCB3aXRoIG5vIHN1YnNpZHkgKHFfemVyb19zbykKIyAtIG91dHB1dHM6IHNhdHVyYXRpb24gKHNhdHVyYXRpb25faW4pCmNodW5rX2NvdmVyYWdlIDwtIGZ1bmN0aW9uKCl7CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCgogIHNhdHVyYXRpb25faW5fZiA8LSBmdW5jdGlvbihjb3ZlcmFnZV92YXIgPSBjb3ZlcmFnZV9zbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcV9mdWxsX3ZhciA9IHFfZnVsbF9zbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcV96ZXJvX3ZhciA9IHFfemVyb19zbyl7CiAgICAgIHNhdHVyYXRpb25faW4gPC0gY292ZXJhZ2Vfc28gKiBxX2Z1bGxfc28gKyAoIDEgLSBjb3ZlcmFnZV9zbyApICogcV96ZXJvX3NvCiAgICAgIHJldHVybihsaXN0KCJzYXR1cmF0aW9uX2luIiA9IHNhdHVyYXRpb25faW4pKQogICAgfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAKICAgIHJldHVybihsaXN0KCJzYXR1cmF0aW9uX2luX2YiID0gc2F0dXJhdGlvbl9pbl9mKSkgICAKfQppbnZpc2libGUoIGxpc3QyZW52KGNodW5rX2NvdmVyYWdlKCksLkdsb2JhbEVudikgKQoKIyMjIyMgRXhlY3V0ZSB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGVuIG5lZWRlZCBmb3IgdGhlIHRleHQ6CnNhdHVyYXRpb25faW4gPC0gc2F0dXJhdGlvbl9pbl9mKCkkc2F0dXJhdGlvbl9pbgoKIyBDb21wdXRpbmcgdmFsdWVzIGZvciBpbmxpbmUgdGV4dDoKCiMgcHZfYmVuZWYKIyDilJzilIDilIDilIDilIAgZWFybmluZ3NfYXBwMV9mCiMgfCAgICAgIOKUnOKUgOKUgOKUgOKUgCBkZWx0YV9lZF9maW5hbF9mCiMgfCAgICAgIOKUnOKUgOKUgOKUgOKUgCBzYXR1cmF0aW9uX2luX2YKIyB8ICAgICAg4pSU4pSA4pSA4pSA4pSAIHdhZ2VfdF9mKCkKIyB8ICAgICAgfCAgICAgIOKUlOKUgOKUgOKUgOKUgCB3YWdlXzBfZigpCiMgfCAgICAgIHwgICAgICAgICAgICAKIyB8ICAgICAg4pSc4pSA4pSA4pSA4pSAIGxhbWJkYTFfaW5fZigpCiMgfCAgICAgIOKUlOKUgOKUgOKUgOKUgCBsYW1iZGEyX2luX2YoKQojIOKUlOKUgOKUgOKUgOKUgCBpbnRlcmVzdF9mKCkKCmVhcm5pbmdzX25vX2V4dF9pbiA8LSBlYXJuaW5nc19hcHAxX2YoCiAgd2FnZV92YXIgPSB3YWdlX3RfaW4sCiAgbGFtYmRhMV92YXIgPSBsYW1iZGExX2luWzFdLAogIHNhdHVyYXRpb25fdmFyID0gc2F0dXJhdGlvbl9pbiwKICBsYW1iZGEyX3ZhciA9IDAsCiAgY292ZXJhZ2VfdmFyID0gY292ZXJhZ2Vfc28KKQoKZWFybmluZ3NfeWVzX2V4dF9pbiA8LSBlYXJuaW5nc19hcHAxX2YoCiAgd2FnZV92YXIgPSB3YWdlX3RfaW4sCiAgbGFtYmRhMV92YXIgPSBsYW1iZGExX2luWzFdLAogIHNhdHVyYXRpb25fdmFyID0gc2F0dXJhdGlvbl9pbiwKICBsYW1iZGEyX3ZhciA9IGxhbWJkYTJfaW5bMV0sCiAgY292ZXJhZ2VfdmFyID0gY292ZXJhZ2Vfc28KKQoKcHZfYmVuZWZfbm9fZXh0X2luIDwtIHB2X2JlbmVmX2YoCiAgZWFybmluZ3NfdmFyID0gZWFybmluZ3Nfbm9fZXh0X2luLAogIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfaW4sCiAgcGVyaW9kc192YXIgPSBwZXJpb2RzX3NvCikKCnB2X2JlbmVmX3llc19leHRfaW4gPC0gcHZfYmVuZWZfZigKICBlYXJuaW5nc192YXIgPSBlYXJuaW5nc195ZXNfZXh0X2luLAogIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfaW4sCiAgcGVyaW9kc192YXIgPSBwZXJpb2RzX3NvCikKYGBgCgo8L2RldGFpbHM+Cjxicj4KCiMjIyMgQXNzZXNzaW5nIGNvbXB1dGF0aW9uYWwgcmVwcm9kdWNpYmlsaXR5IG9mIG9yaWdpbmFsIHJlc3VsdHMgIAoKV2l0aG91dCBleHRlcm5hbGl0aWVzLCB0aGUgb3JpZ2luYWwgYW5hbHlzaXMgKEBiYWlyZDIwMTZ3b3Jtcykgb2J0YWlucyBhIHByZXNlbnQgdmFsdWUgb2YgYmVuZWZpdHMgb2YgYHIgZGZfcmVzZWFyY2hfc28kcGFyYW1bMV1gICh0YWJsZSBgciBkZl9yZXNlYXJjaF9zbyR0YWJsZW51bVsxXWAsIGNvbHVtbiBgciBkZl9yZXNlYXJjaF9zbyR0YWJsZV9jb2xbMV1gLCBhbmQgcm93IGByIGRmX3Jlc2VhcmNoX3NvJHRhYmxlX3Jvd1sxXWApLiBJbmNsdWRpbmcgZXh0ZXJuYWxpdGllcywgdGhleSBvYnRhaW4gYSBwcmVzZW50IHZhbHVlIG9mIGJlbmVmaXRzIG9mIGByIGRmX3Jlc2VhcmNoX3NvJHBhcmFtWzNdYCAodGFibGUgYHIgZGZfcmVzZWFyY2hfc28kdGFibGVudW1bM11gLCBjb2x1bW4gYHIgZGZfcmVzZWFyY2hfc28kdGFibGVfY29sWzNdYCwgYW5kIHJvdyBgciBkZl9yZXNlYXJjaF9zbyR0YWJsZV9yb3dbM11gKS4gRm9sbG93aW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgaW4gdGhpcyBzZWN0aW9uLCB0aGlzIGFuYWx5c2lzIG9idGFpbnMgdGhlIHNhbWUgcmVzdWx0IChgciBwdl9iZW5lZl9ub19leHRfaW5gIGFuZCBgciBwdl9iZW5lZl95ZXNfZXh0X2luYCByZXNwZWN0aXZlbHkgd2l0aG91dCByb3VuZGluZykuICAKCgpgYGB7ciBzdW0tdGFibGVzMywgcHVybD1GQUxTRSwgZWNobz1GQUxTRSwgZXZhbD1zaG93X3N1bW1hcnlfdGFibGVzfQp0YWJsZV8xWzEsM10gPC0gcGFzdGUwKCIkUj0iICwgcm91bmQoY292ZXJhZ2Vfc28sMiksICIkIikKdGFibGVfMVsxLDJdIDwtIHBhc3RlMCgiJFxcbGFtYmRhXzE9IiAsIGxhbWJkYTFfaW5fZihsYW1iZGExX3ZhciA9IGxhbWJkYTFfc28pWzFdLCAiJCIpCnRhYmxlXzFbMiwyXSA8LSBwYXN0ZTAoIiRcXGxhbWJkYV8yPSIgLCBsYW1iZGEyX3NvLCAiJCIpCgp0YWJsZV8xWzMsMl0gPC0gcGFzdGUwKCIkXFxoYXR7XFxiZXRhfV8xPSIgLCByb3VuZChjb2VmX2V4cF9zb1sxXSwyKSwgIiQiKQp0YWJsZV8xWzQsMl0gPC0gcGFzdGUwKCIkXFxoYXR7XFxiZXRhfV8yPSIgLCByb3VuZChjb2VmX2V4cF9zb1syXSwyKSwgIiQiKQoKI3dfe3NlfSBjb3BpZWQgZnJvbSA1ODkgaW4gd2FnZV8wX2luIGJ1dCB3YWdlX3NlIGlzIG5ldmVyIGNhbGN1bGF0ZWQgb3V0c2lkZSB0aGUgZm4KCnRhYmxlXzEgPC1yYmluZCh0YWJsZV8xLAogICAgICAgICAgICAgICAgYyggcGFzdGUwKCIkd197d3d9PSIgLCByb3VuZCh3YWdlX3d3X3NvLDIpLCAiJCIpLCBwYXN0ZTAoIiRRKGZ1bGwpPSIgLCBxX2Z1bGxfc28sICIkIiksICIiKSwKICAgICAgICAgICAgICAgIGMoIHBhc3RlMCgiJHdfe3NlfT0iICwgcm91bmQocHJvZml0c19zZV9zbyAvICg0LjUgKiBob3Vyc19zZV9jb25kX3NvKSwyKSwgIiQiKSAsCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIiRRKDApPSIgLCBxX3plcm9fc28sICIkIiksICIiKSwKICAgICAgICAgICAgICAgIGMoIHBhc3RlMCgiJGhfe2FnfT0iICwgaG91cnNfYWdfc28sICIkIiksICIiLCAiIiksCiAgICAgICAgICAgICAgICBjKCBwYXN0ZTAoIiRoX3t3d309IiAsIGhvdXJzX3d3X3NvLCAiJCIpLCAiIiwgIiIpLAogICAgICAgICAgICAgICAgYyggcGFzdGUwKCIkaF97c2V9PSIgLCBob3Vyc19zZV9zbywgIiQiKSwgIiIsICIiKQogICAgICAgICAgICAgICAgKQoKCnN1bV90YWJsZV9pbmRleCA8LSBzdW1fdGFibGVfaW5kZXgrMQp0YWJsZV8yIDwtIHJiaW5kKHRhYmxlXzIsCiAgICAgICAgICAgICAgICAgYygiJFxcRGVsdGEgV197dH0gPSB3X3t0fVxcbGVmdCggXFxsYW1iZGFfezF9ICsgXFxmcmFje3AgXFxsYW1iZGFfezJ9fXtSfSBcXHJpZ2h0KSQiLAogICAgICAgICAgICAgICAgICAgcGFzdGUwKCIkKCIsIHN1bV90YWJsZV9pbmRleCwgIikkIikgKQogICAgKQoKc3VtX3RhYmxlX2luZGV4IDwtIHN1bV90YWJsZV9pbmRleCsxCnRhYmxlXzIgPC0gcmJpbmQodGFibGVfMiwKICAgICAgICAgICAgICAgICBjKCIkd190ID0gIFxcdGV4dHsjd2Vla3N9IFxcdGltZXMgd18wICgxICsgZylee1hwfSgxICsgXFxoYXR7XFxiZXRhXzF9IFhwICsgXFxoYXR7XFxiZXRhXzJ9IFhwXjIpJCIsCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIiQoIiwgc3VtX3RhYmxlX2luZGV4LCAiKSQiKSApCiAgICApCgpzdW1fdGFibGVfaW5kZXggPC0gc3VtX3RhYmxlX2luZGV4KzEKdGFibGVfMiA8LSByYmluZCh0YWJsZV8yLAogICAgICAgICAgICAgICAgIGMoIiR3XzAgPSBcXGZyYWN7MX17ZXh9IFxcc3VtX3tsIFxcaW4gXFx7YWcsIHd3LCBzZVxcfX13X3tsfVxcYWxwaGFfe2x9CiAgICAgICAgICAgICAgICAgICAgIFxccXVhZCBcXHRleHR7d2l0aDogfSBcXGFscGhhX3tsfT0gXFxmcmFjeyBoX3tsfX17aF97YWd9ICsgaF97d3d9ICsgaF97c2V9fSQiLAogICAgICAgICAgICAgICAgICAgcGFzdGUwKCIkKCIsIHN1bV90YWJsZV9pbmRleCwgIikkIikgKQogICAgKQoKc3VtX3RhYmxlX2luZGV4IDwtIHN1bV90YWJsZV9pbmRleCsxCnRhYmxlXzIgPC0gcmJpbmQodGFibGVfMiwKICAgICAgICAgICAgICAgICBjKCIkd197c2V9ID0gXFxmcmFje1xcdGV4dHtNb250aGx5IHNlbGYtZW1wbG95ZWQgcHJvZml0c319ezQuNSBcXHRpbWVzIEVbaF97c2V9fGhfe3NlfSBcXHRleHR7Pn0gMF19JCIsCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIiQoIiwgc3VtX3RhYmxlX2luZGV4LCAiKSQiKSApCiAgICApCgpzdW1fdGFibGVfaW5kZXggPC0gc3VtX3RhYmxlX2luZGV4KzEKCnRhYmxlXzIgPC0gcmJpbmQodGFibGVfMiwKICAgICAgICAgICAgICAgICBjKCIkXFxsYW1iZGFfezF9ID0gXFxmcmFjezF9ezJ9IFxcbGFtYmRhX3sxLG1hbGV9ICsgXFxmcmFjezF9ezJ9IFxcbGFtYmRhX3sxLGZlbWFsZX0kIiwKICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiJCgiLCBzdW1fdGFibGVfaW5kZXgsICIpJCIpICkgKQoKCnN1bV90YWJsZV9pbmRleCA8LSBzdW1fdGFibGVfaW5kZXgrMQp0YWJsZV8yIDwtIHJiaW5kKHRhYmxlXzIsCiAgICAgICAgICAgICAgICAgYygiJHAgPSBSIFxcdGltZXMgUShmdWxsKSAgKyAoMSAtIFIpIFxcdGltZXMgUSgwKSQiLAogICAgICAgICAgICAgICAgICAgcGFzdGUwKCIkKCIsIHN1bV90YWJsZV9pbmRleCwgIikkIikgKQogICAgKQoKCmtuaXRyOjprYWJsZSh0YWJsZV8yLCBjb2wubmFtZXMgPSBjKCJFcXVhdGlvbiIsICIjIiksIGNhcHRpb24gPSAiU3VtbWFyeSBvZiBlcXVhdGlvbnMgdXNlZCB1bnRpbCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudCIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKQoKa25pdHI6OmthYmxlKHRhYmxlXzEsIGNvbC5uYW1lcyA9IGMoIkRhdGEiLCAiUmVzZWFyY2giLCAiR3Vlc3N3b3JrIiksIGNhcHRpb24gPSAiU291cmNlczogc3VtbWFyeSBvZiBpbnB1dHMgc3BlY2lmaWVkIHVudGlsIHRoaXMgcG9pbnQgaW4gdGhlIGRvY3VtZW50IikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpCmBgYAoKCiMjIyBDb3N0cwoKVGhlIGNvc3RzIGFyZSBhIGNvbWJpbmF0aW9uIG9mIGRpcmVjdCBjb3N0cyBvZiBtYXNzIGRld29ybWluZyAocmVsYXRpdmUgdG8gdGhlIHN0YXR1cyBxdW8sIHdoaWNoIGlzIG5vIHN1YnNpZHkgZm9yIGRld29ybWluZykgYW5kIGluZGlyZWN0IGNvc3RzIG9uIHRoZSBlZHVjYXRpb24gc3lzdGVtIGR1ZSB0byB0aGUgYWRkaXRpb25hbCB0aW1lIHRyZWF0ZWQgaW5kaXZpZHVhbHMgc3BlbmQgaW4gc2Nob29sLgoKPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBhbGwgdGhlIGRldGFpbHM8L3N1bW1hcnk+ClxiZWdpbntlcXVhdGlvbn0KQyA9ICBcbGVmdCggU197Mn1RKFNfezJ9KSAtIFNfezF9UShTX3sxfSkgXHJpZ2h0KSArIEsgXHN1bV97dD0wfV57NTB9IFxsZWZ0KCBcZnJhY3sxfXsxICsgcn1ccmlnaHQpXnt0fSBcRGVsdGEgXG92ZXJsaW5le0V9X3t0fShTMSxTMikKYHIgZXF1YXRpb25JbmRleCA8LSBlcXVhdGlvbkluZGV4ICsgMWAKXGxhYmVse2VxOmByIGVxdWF0aW9uSW5kZXhgfQpcdGFne2ByIGVxdWF0aW9uSW5kZXhgfQpcZW5ke2VxdWF0aW9ufQoKV2hlcmU6CgotICRTXzIkOiBwZXItY2FwaXRhIGNvc3RzIG9mIGRld29ybWluZyB1bmRlciB0aGUgZGV3b3JtaW5nIGludGVydmVudGlvbiAgCi0gJFNfMSQ6IHBlci1jYXBpdGEgY29zdHMgb2YgZGV3b3JtaW5nIGlmIHRoZSBnb3Zlcm5tZW50IGRvZXMgbm90IHByb3ZpZGUgYW55IGFkZGl0aW9uYWwgcmVzb3VyY2VzIGZvciBkZXdvcm1pbmcgIAotICRRKFNfMikkOiB0YWtlLXVwIHVuZGVyIGEgbWFzcyBkZXdvcm1pbmcgaW50ZXJ2ZW50aW9uICAKLSAkUShTXzEpJDogdGFrZS11cCB3aXRob3V0IGFkZGl0aW9uYWwgcmVzb3VyY2VzIGZyb20gdGhlIGdvdmVybm1lbnQgIAotICRLJDogY29zdCBwZXIgc3R1ZGVudCB0byBnZXQgZWR1Y2F0aW9uICAgCi0gJFxEZWx0YSBcb3ZlcmxpbmV7RX1fe3R9KFMxLCBTMikkOiBlc3RpbWF0ZWQgaW5jcmVhc2UgaW4gc2Nob29sIGF0dGVuZGFuY2UgIAoKYGBge3IgY29zdDIsIGVjaG8gPSBwcmludF9jb2RlfQojIC0gaW5wdXRzOiBwZXJpb2RzIChwZXJpb2RzX3NvKSwgYWRkaXRpb25hbCBlZHVjYXRpb24gKGRlbHRhX2VkX2ZpbmFsX2luKSwKIyAgZGlzY291bnQgcmF0ZSAoaW50ZXJlc3QpICh2YXJpZXMgYnkgYXBwcm9hY2gpLCBjb3N0IHBlciBzdHVkZW50CiMgIChjb3N0X3Blcl9zdHVkZW50X2luKSwgY29zdCBwZXIgdHJlYXRtZW50IChzMl9pbiksIHRha2UtdXAgd2l0aCB0cmVhdG1lbnQKIyAgKHEyX2luKQojIC0gb3V0cHV0czogcHJlc2VudCB2YWx1ZSBvZiBhbGwgY29zdHMgKHB2X2Nvc3RzX2YpCmNodW5rX2Nvc3QyIDwtIGZ1bmN0aW9uKCl7CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCgogIHB2X2Nvc3RzX2YgPC0gZnVuY3Rpb24oCiAgICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfc28sCiAgICBkZWx0YV9lZF92YXIgPSBkZWx0YV9lZF9maW5hbF9pbiwKICAgIGludGVyZXN0X3JfdmFyID0gTlVMTCwKICAgIGNvc3Rfb2Zfc2Nob29saW5nX3ZhciA9IGNvc3RfcGVyX3N0dWRlbnRfaW4sCiAgICBzMV92YXIgPSAwLAogICAgcTFfdmFyID0gMCwKICAgIHMyX3ZhciA9IHMyX2luLAogICAgcTJfdmFyID0gcTJfaW4pIHsKICAgICAgICBpbmRleF90IDwtIDA6cGVyaW9kc192YXIKICAgICAgICAjIEVmZmVjdHMgb3ZlciA5IHllYXJzIG9mIGVkdWNhdGlvbiAocG9zdCB0cmVhdG1lbnQpCiAgICAgICAgZGVsdGFfZWRfcyA8LSBjKDAsIGRlbHRhX2VkX3ZhciwgcmVwKDAsNDEpKQogICAgICAgIChzMl92YXIgKiBxMl92YXIgIC0gczFfdmFyICogcTFfdmFyKSArCiAgICAgICAgICBzdW0oICggMSAvICgxICsgaW50ZXJlc3Rfcl92YXIpICleaW5kZXhfdCAqCiAgICAgICAgICAgICAgICAgZGVsdGFfZWRfcyAqIGNvc3Rfb2Zfc2Nob29saW5nX3ZhcikKICAgIH0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCiAgICByZXR1cm4obGlzdCgicHZfY29zdHNfZiIgPSBwdl9jb3N0c19mKSkgICAgIyBUcnkgdG8gcmV0dXJuIG9ubHkgZnVuY3Rpb25zCn0KaW52aXNpYmxlKCBsaXN0MmVudihjaHVua19jb3N0MigpLC5HbG9iYWxFbnYpICkKCiMjIyMjIEV4ZWN1dGUgdmFsdWVzIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUgd2hlbiBuZWVkZWQgZm9yIHRoZSB0ZXh0OiAgCmBgYAoKPC9kZXRhaWxzPgo8YnI+CgojIyMjIERpcmVjdCBjb3N0czogaW5jcmVhc2UgaW4gZGV3b3JtaW5nIGNvc3RzCgpEaXJlY3QgZGV3b3JtaW5nIGNvc3RzICgkREMkKSBhcmUgZGVmaW5lZCBhcyB0aGUgdGFrZS11cCB1bmRlciBhIG1hc3MgZGV3b3JtaW5nIGludGVydmVudGlvbiAoJFFfezJ9JCksIHRpbWVzIHRoZSBwZXItY2FwaXRhIGNvc3RzIG9mIGRld29ybWluZyB1bmRlciB0aGUgaW50ZXJ2ZW50aW9uICgkU197Mn0kKS4gVGhlc2UgY29zdHMgYXJlIGNvbXBhcmVkIHRvIGEgc3RhdHVzIHF1byBzY2VuYXJpbyB3aGVyZSB0aGUgZ292ZXJubWVudCBkb2VzIG5vdCBwcm92aWRlIGFueSBhZGRpdGlvbmFsIHJlc291cmNlcyBmb3IgZGV3b3JtaW5nLiBUaGlzIGFuYWx5c2lzIGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBubyBzdWJzaWR5IGZvciBkZXdvcm1pbmcgdW5kZXIgdGhlIHN0YXR1cyBxdW8uICAgIAoKIyMjIyMgQ29tcGxldGUgc3Vic2lkeSB0byBwZXIgY2FwaXRhIGNvc3RzIG9mIGRld29ybWluZwoKV2l0aCBjb21wbGV0ZSBzdWJzaWR5LCB0aGUgcmVsZXZhbnQgY29zdHMgcmVwcmVzZW50IHRoZSB0b3RhbCBkaXJlY3QgY29zdHMgb2YgZGV3b3JtaW5nIGluIFVTRC4gVGhlIHRha2UtdXAgd2l0aCBmdWxsIHN1YnNpZHkgKCRRXzIkKSBjb21lcyBmcm9tIGEgcHJldmlvdXMgc3R1ZHkgW0BrcmVtZXIyMDA3aWxsdXNpb25dIGFuZCB0YWtlcyB0aGUgdmFsdWUgb2YgYHIgcV9mdWxsX3NvYC4KCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5PgoKXGJlZ2lue2VxdWF0aW9ufQpTX3syfSA9IFxmcmFje1x0ZXh0e0Nvc3QgcGVyIHBlcnNvbiBwZXIgeWVhciAoS1NIKX0JfXtleH1cdGltZXMgXHRleHR7QWRkaXRpb25hbCB5ZWFycyBvZiB0cmVhdG1lbnR9IFxcCmByIGVxdWF0aW9uSW5kZXggPC0gZXF1YXRpb25JbmRleCArIDFgClxsYWJlbHtlcTpgciBlcXVhdGlvbkluZGV4YH0KXHRhZ3tgciBlcXVhdGlvbkluZGV4YH0KXGVuZHtlcXVhdGlvbn0KCmBgYHtyIHVuaXRfY29zdHMyLCBlY2hvID0gcHJpbnRfY29kZX0KIyAtIGlucHV0czogdW5pdCBjb3N0cyBpbiBsb2NhbCBjdXJyZW5jeSAodW5pdF9jb3N0X2xvY2FsX3NvKSwgZXhjaGFuZ2UgcmF0ZQojICAoZXhfcmF0ZV9zbyksIHllYXJzIG9mIHRyZWF0bWVudCAoeWVhcnNfb2ZfdHJlYXRfMF9zbykKIyAtIG91dHB1dHM6IHVuaXQgY29zdHMgb2YgdHJlYXRtZW50IChzMl9mKQpjaHVua191bml0X2Nvc3RzMiA8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAoKICAgIHMyX2YgPC0gZnVuY3Rpb24odW5pdF9jb3N0X2xvY2FsX3ZhciA9IHVuaXRfY29zdF9sb2NhbF9zbywKICAgICAgICAgICAgICAgICAgICAgZXhfcmF0ZV92YXIgPSBleF9yYXRlX3NvLAogICAgICAgICAgICAgICAgICAgICB5ZWFyc19vZl90cmVhdF92YXIgPSB5ZWFyc19vZl90cmVhdF8wX3NvKSB7CiAgICAgICggdW5pdF9jb3N0X2xvY2FsX3ZhciAvIGV4X3JhdGVfdmFyICkgKiB5ZWFyc19vZl90cmVhdF92YXIKICAgIH0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCiAgICByZXR1cm4obGlzdCgiczJfZiIgPSBzMl9mKSApCn0KaW52aXNpYmxlKCBsaXN0MmVudihjaHVua191bml0X2Nvc3RzMigpLC5HbG9iYWxFbnYpICkKIyMjIyMgRXhlY3V0ZSB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGVuIG5lZWRlZCBmb3IgdGhlIHRleHQ6CnMyX2luIDwtIHMyX2YoKQpgYGAKCjwvZGV0YWlscz4KPGJyPgoKCiMjIyMgSW5kaXJlY3QgY29zdHM6IGFkZGl0aW9uYWwgeWVhcnMgb2YgZWR1Y2F0aW9uIGFuZCBpdHMgY29zdHMgZm9yIGdvdmVybm1lbnQKCkFzIGEgcmVzdWx0IG9mIGRld29ybWluZyB0cmVhdG1lbnQsIHRoZXJlIGlzIGFuIGVzdGltYXRlZCBpbmNyZWFzZSBpbiBzY2hvb2wgYXR0ZW5kYW5jZSwgd2hpY2ggaXMgbXVsdGlwbGllZCBieSB0aGUgY29zdCBvZiBlZHVjYXRpb24gcGVyIHN0dWRlbnQgdG8gY2FsY3VsYXRlIHRoZSBhZGRpdGlvbmFsIGluZGlyZWN0IGNvc3Qgb24gdGhlIGVkdWNhdGlvbiBzeXN0ZW0gaW1wb3NlZCBieSBhIHRyZWF0ZWQgaW5kaXZpZHVhbC4gVGhlIGFkZGl0aW9uYWwgY29zdHMgb24gZWR1Y2F0aW9uIGFyZSBjb21wdXRlZCBhcyBmb2xsb3dzOiBmaXJzdCBjb21wdXRlIGEgY29zdCBwZXIgc3R1ZGVudCAoJEskKS4gVGhpcyBpcyBjYWxjdWxhdGVkIGFzIHRoZSBzYWxhcnkgb2YgdGhlIHRlYWNoZXIgcGx1cyBiZW5lZml0cywgZGl2aWRlZCBieSB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygc3R1ZGVudHMgcGVyIHRlYWNoZXIuIFNlY29uZCwgdGhlIGNvc3QgcGVyIHN0dWRlbnQgaXMgbXVsdGlwbGllZCBieSB0aGUgZXN0aW1hdGVkIGluY3JlYXNlIGluIHNjaG9vbCBhdHRlbmRhbmNlICgkXERlbHRhIFxvdmVybGluZXtFfV97dH0oUzEsUzIpJCkuIEZvciB0aGlzIHdlIHVzZSBhIHNlcmllcyBvZiBlc3RpbWF0ZWQgZWZmZWN0cywgaW5jbHVkaW5nIHRoZSBhZGRpdGlvbmFsIGRpcmVjdCBpbmNyZWFzZSBpbiBzZWNvbmRhcnkgc2Nob29saW5nIGZyb20gMTk5OSB0byAyMDA3IG9idGFpbmVkIGZyb20gYW4gYWRkaXRpb25hbCBhbmFseXNpcyByZWxhdGVkIHRvIEBiYWlyZDIwMTZ3b3Jtcy4gVGhpcyBzZXJpZXMgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIGV4dGVybmFsaXR5IGVmZmVjdHMuIFRvIGluY29ycG9yYXRlIGV4dGVybmFsaXR5IGVmZmVjdHMsIHdlIHdvdWxkIG5lZWQgYW5vdGhlciBzZXJpZXMgKGZyb20gdGhlIHNhbWUgc291cmNlKSB0aGF0IGVzdGltYXRlcyB0aGUgYWRkaXRpb25hbCBzZWNvbmRhcnkgc2Nob29saW5nIGluY3JlYXNlIGR1ZSB0byB0aGUgZXh0ZXJuYWxpdHkgaW4gb3JkZXIgdG8gYWRkIGl0IHRvIHRoZSBvcmlnaW5hbCBzZXJpZXMuCgo8ZGV0YWlscz48c3VtbWFyeT5TaG93IGFsbCB0aGUgZGV0YWlsczwvc3VtbWFyeT4KClxiZWdpbntlcXVhdGlvbn0KSyA9IFxmcmFje1x0ZXh0e3RlYWNoZXIgc2FsYXJ5fSArIFx0ZXh0e3RlYWNoZXIgYmVuZWZpdHN9fXtcdGV4dHsjIFN0dWRlbnRzfX0KYHIgZXF1YXRpb25JbmRleCA8LSBlcXVhdGlvbkluZGV4ICsgMWAKXGxhYmVse2VxOmByIGVxdWF0aW9uSW5kZXhgfQpcdGFne2ByIGVxdWF0aW9uSW5kZXhgfQpcZW5ke2VxdWF0aW9ufQoKCmBgYHtyIGVkLWNvc3RzLCBlY2hvID0gcHJpbnRfY29kZX0KIyAtIGlucHV0czogdGVhY2hlciBzYWxhcnkgKHRlYWNoX3NhbF9zbykgYW5kIGJlbmVmaXRzICh0ZWFjaF9iZW5fc28pLCBudW1iZXIKIyBvZiBzdHVkZW50cyAobl9zdHVkZW50c19zbyksIGluY2x1ZGUgZXh0ZXJuYWxpdGllcyAoaW5jbHVkZV9leHRfc28pLCBleHRyYSBlZAojIHdpdGhvdXQgZXh0IChkZWx0YV9lZF9zbyksIGFuZCBleHRyYSBlZCBkdWUgdG8gZXh0IChkZWx0YV9lZF9leHRfc28pCiMgLSBvdXRwdXRzOiBjb3N0IHBlciBzdHVkZW50IChjb3N0X3Blcl9zdHVkZW50X2YpLCBhbmQgdG90YWwgYWRkaXRpb25hbAojIGVkdWNhdGlvbiAoZGVsdGFfZWRfZmluYWxfZikKY2h1bmtfZWRjb3N0cyA8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgCgogICAgY29zdF9wZXJfc3R1ZGVudF9mIDwtIGZ1bmN0aW9uKHRlYWNoX3NhbF92YXIgPSB0ZWFjaF9zYWxfc28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYWNoX2Jlbl92YXIgPSB0ZWFjaF9iZW5fc28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fc3R1ZGVudHNfdmFyID0gbl9zdHVkZW50c19zbykgewogICAgICAgICh0ZWFjaF9zYWxfdmFyICsgdGVhY2hfYmVuX3ZhcikgLyBuX3N0dWRlbnRzX3ZhcgogICAgfQoKICAgIGRlbHRhX2VkX2ZpbmFsX2YgPC0gZnVuY3Rpb24oaW5jbHVkZV9leHRfdmFyID0gaW5jbHVkZV9leHRfc28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhX2VkX3ZhciA9IGRlbHRhX2VkX3NvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YV9lZF9leHRfdmFyID0gZGVsdGFfZWRfZXh0X3NvKXsKICAgICAgICBpZiAoaW5jbHVkZV9leHRfdmFyID09IFRSVUUpewogICAgICAgICAgICBkZWx0YV9lZF9maW5hbF9pbiA8LSAgZGVsdGFfZWRfZXh0X3ZhclssMV0gKyBkZWx0YV9lZF92YXJbLDFdCiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGRlbHRhX2VkX2ZpbmFsX2luIDwtIGRlbHRhX2VkX3ZhclssMV0KICAgICAgICB9CiAgICAgICAgcmV0dXJuKGRlbHRhX2VkX2ZpbmFsX2luKQogICAgfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAKICAgIHJldHVybihsaXN0KCJjb3N0X3Blcl9zdHVkZW50X2YiID0gY29zdF9wZXJfc3R1ZGVudF9mLAogICAgICAgICAgICAgICAgImRlbHRhX2VkX2ZpbmFsX2YiID0gZGVsdGFfZWRfZmluYWxfZikpCn0KaW52aXNpYmxlKCBsaXN0MmVudihjaHVua19lZGNvc3RzKCksLkdsb2JhbEVudikgKQoKIyMjIyMgRXhlY3V0ZSB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGVuIG5lZWRlZCBmb3IgdGhlIHRleHQ6CmNvc3RfcGVyX3N0dWRlbnRfaW4gPC0gY29zdF9wZXJfc3R1ZGVudF9mKCkKZGVsdGFfZWRfZmluYWxfbm9fZXh0X2luIDwtIGRlbHRhX2VkX2ZpbmFsX2YoaW5jbHVkZV9leHRfdmFyID0gRkFMU0UpCmRlbHRhX2VkX2ZpbmFsX3llc19leHRfaW4gPC0gZGVsdGFfZWRfZmluYWxfZihpbmNsdWRlX2V4dF92YXIgPSBUUlVFKQoKIyBDb21wdXRpbmcgdmFsdWVzIGZvciBpbmxpbmUgdGV4dDoKCiMgcHZfY29zdHNfZgojICDilJzilIDilIDilIDilIAgZGVsdGFfZWRfZmluYWxfZgojICDilJzilIDilIDilIDilIAgaW50ZXJlc3RfZgojICDilJTilIDilIDilIDilIAgY29zdF9wZXJfc3R1ZGVudF9mCiMgIHwgICAgICDilJTilIDilIDilIDilIAgeAojICDilJzilIDilIDilIDilIAgczJfZgojICDilJTilIDilIDilIDilIAgbGFtYmRhMl9pbl9mCgpwdl9jb3N0X25vX2V4dF9pbiA8LSBwdl9jb3N0c19mKAogICAgICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfc28sCiAgICAgIGRlbHRhX2VkX3ZhciA9IGRlbHRhX2VkX2ZpbmFsX25vX2V4dF9pbiwKICAgICAgaW50ZXJlc3Rfcl92YXIgPSBpbnRlcmVzdF9pbiwKICAgICAgY29zdF9vZl9zY2hvb2xpbmdfdmFyID0gY29zdF9wZXJfc3R1ZGVudF9pbiwKICAgICAgczFfdmFyID0gMCwKICAgICAgcTFfdmFyID0gMCwKICAgICAgczJfdmFyID0gczJfaW4sCiAgICAgIHEyX3ZhciA9IHFfZnVsbF9zbwogICAgKQoKcHZfY29zdF95ZXNfZXh0X2luIDwtIHB2X2Nvc3RzX2YoCiAgICAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc19zbywKICAgICAgZGVsdGFfZWRfdmFyID0gZGVsdGFfZWRfZmluYWxfeWVzX2V4dF9pbiwKICAgICAgaW50ZXJlc3Rfcl92YXIgPSBpbnRlcmVzdF9pbiwKICAgICAgY29zdF9vZl9zY2hvb2xpbmdfdmFyID0gY29zdF9wZXJfc3R1ZGVudF9pbiwKICAgICAgczFfdmFyID0gMCwKICAgICAgcTFfdmFyID0gMCwKICAgICAgczJfdmFyID0gczJfaW4sCiAgICAgIHEyX3ZhciA9IHFfZnVsbF9zbwogICAgKQpgYGAKCjwvZGV0YWlscz4KPGJyPgoKIyMjIyBBc3Nlc3NpbmcgY29tcHV0YXRpb25hbCByZXByb2R1Y2liaWxpdHkgb2Ygb3JpZ2luYWwgcmVzdWx0cyAgCgpXaXRob3V0IGV4dGVybmFsaXRpZXMsIHRoZSBvcmlnaW5hbCBhbmFseXNpcyAoQGJhaXJkMjAxNndvcm1zKSBvYnRhaW5zIGEgcHJlc2VudCB2YWx1ZSBvZiBjb3N0cyBvZiBgciBkZl9yZXNlYXJjaF9zbyRwYXJhbVs1XSArIGRmX3Jlc2VhcmNoX3NvJHBhcmFtWzZdYCAodGFibGUgYHIgZGZfcmVzZWFyY2hfc28kdGFibGVudW1bNV1gLCBjb2x1bW4gYHIgZGZfcmVzZWFyY2hfc28kdGFibGVfY29sWzVdYCwgYW5kIGFkZGluZyByb3dzIGByIHBhc3RlMChkZl9yZXNlYXJjaF9zbyR0YWJsZV9yb3dbNV0sICIgYW5kICIsIGRmX3Jlc2VhcmNoX3NvJHRhYmxlX3Jvd1s2XSlgKS4gSW5jbHVkaW5nIGV4dGVybmFsaXRpZXMsIHRoZXkgb2J0YWluIGEgcHJlc2VudCB2YWx1ZSBvZiBiZW5lZml0cyBvZiAgYHIgZGZfcmVzZWFyY2hfc28kcGFyYW1bNV0gKyBkZl9yZXNlYXJjaF9zbyRwYXJhbVs2XSArIGRmX3Jlc2VhcmNoX3NvJHBhcmFtWzddYCAodGFibGUgYHIgZGZfcmVzZWFyY2hfc28kdGFibGVudW1bNV1gLCBjb2x1bW4gYHIgZGZfcmVzZWFyY2hfc28kdGFibGVfY29sWzVdYCwgYW5kIGFkZGluZyByb3dzIGByIHBhc3RlMChkZl9yZXNlYXJjaF9zbyR0YWJsZV9yb3dbNV0sICIgYW5kICIsIGRmX3Jlc2VhcmNoX3NvJHRhYmxlX3Jvd1s2XSwiIGFuZCAiLCBkZl9yZXNlYXJjaF9zbyR0YWJsZV9yb3dbN10pYCkuIEZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluIHRoaXMgc2VjdGlvbiwgdGhpcyBhbmFseXNpcyBvYnRhaW5zIHRoZSBzYW1lIHJlc3VsdCAoYHIgcHZfY29zdF9ub19leHRfaW5gIGFuZCBgciBwdl9jb3N0X3llc19leHRfaW5gIHJlc3BlY3RpdmVseSB3aXRob3V0IHJvdW5kaW5nKS4gIAoKYGBge3IsIGV2YWw9RkFMU0UsZWNobz1GQUxTRSwgcHVybD1GQUxTRX0KIyBOdW1iZXJzIGFyZSByZXByb2R1Y2VkLCB0aGUgb25seSBkaWZmZXJlbmNlIGlzIHRoYXQgIEJhaXJkIGV0IGFsLCBwcmVzZW50cyB0aGVtIGluIGEgZGlmZmVyZW50IHdheS4KIyBFcXVpdmFsZW5jZSBiZWxvdzoKIyBCYWlyZCBldCBhbCAyMDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVyZQojIDE0Mi40MyAtIDEwLjcxIC0gMS4wNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzAuNjUKIyAoMTQyLjQzICogMC4xNjU3NSAtIDEwLjcxID0gMTIuODk3NzcpIC0gMS4wNyAgICAgICAgICAgID0gMTEuODI3NzcKIyA3NjYuODEgLSAxMC43MSAtIDEzLjQyIC0gMS4wNyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzQxLjYxCiMgKDc2Ni44MSAqIDAuMTY1NzUgLSAxMC43MSAtIDEzLjQyID0gMTAyLjk2ODgpIC0gMS4wNyAgICA9IDEwMS44OTg4CmBgYAoKYGBge3Igc3VtLXRhYmxlczE2LCBwdXJsPUZBTFNFLCBlY2hvPUZBTFNFLCBldmFsPXNob3dfc3VtbWFyeV90YWJsZXN9Cgp0YWJsZV8xWzcsIDJdIDwtIHBhc3RlMCgiJEs9IiAsIHJvdW5kKGNvc3RfcGVyX3N0dWRlbnRfZigpLDIpLCAiJCIpCgpzdW1fdGFibGVfaW5kZXggPC0gc3VtX3RhYmxlX2luZGV4KzEKdGFibGVfMiA8LSByYmluZCh0YWJsZV8yLAogICAgICAgICAgICAgICAgIGMoIiRLID0gXFxmcmFje1xcdGV4dHt0ZWFjaGVyIHNhbGFyeX0gKyBcXHRleHR7dGVhY2hlciBiZW5lZml0c319e1xcdGV4dHsjIFN0dWRlbnRzfX0kIiwKICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiJCgiLCBzdW1fdGFibGVfaW5kZXgsICIpJCIpICkKICAgICkKCmtuaXRyOjprYWJsZSh0YWJsZV8yLCBjb2wubmFtZXMgPSBjKCJFcXVhdGlvbiIsICIjIiksIGNhcHRpb24gPSAiU3VtbWFyeSBvZiBlcXVhdGlvbnMgdXNlZCB1bnRpbCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudCIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKQoKa25pdHI6OmthYmxlKHRhYmxlXzEsIGNvbC5uYW1lcyA9IGMoIkRhdGEiLCAiUmVzZWFyY2giLCAiR3Vlc3N3b3JrIiksIGNhcHRpb24gPSAiU291cmNlczogc3VtbWFyeSBvZiBpbnB1dHMgc3BlY2lmaWVkIHVudGlsIHRoaXMgcG9pbnQgaW4gdGhlIGRvY3VtZW50IikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpCmBgYAoKIyMgQXBwcm9hY2ggMjogQGtscHM0CgpJbiB0aGlzIHNlY29uZCBhcHByb2FjaCwgYmVuZWZpdHMgZm9sbG93IHRoZSBzYW1lIHByaW5jaXBsZSBhcyBpbiBhcHByb2FjaCAxIChpbmNyZWFzZSBpbiBsaWZldGltZSBlYXJuaW5ncyksIGJ1dCBpdCB1c2VzIHVwZGF0ZWQgZGF0YSBvbiB0aGUgZWZmZWN0cyBvbiB0aGUgbGFib3IgbWFya2V0IG91dGNvbWVzLiBJbnN0ZWFkIG9mIHByb2plY3RpbmcgYSB0cmVuZCBvZiBlYXJuaW5ncyBpbnRvIHRoZSBmdXR1cmUgKGFmdGVyIHRoZSBlc3RpbWF0ZWQgaW1wYWN0IG9mIHRoZSAxMCB5ZWFyIGZvbGxvdy11cCksIHRoaXMgYW5hbHlzaXMgdXNlcyBhZGRpdGlvbmFsIGRhdGEgZnJvbSAxNSBhbmQgMjAgeWVhciBmb2xsb3ctdXBzIGFmdGVyIHRoZSBvcmlnaW5hbCBpbnRlcnZlbnRpb24uICBDb3N0cyBhcmUgZmFpcmx5IHNpbWlsYXIgdG8gYXBwcm9hY2ggMSwgd2l0aCB0aGUgYWRkaXRpb24gdGhhdCBpbiB0aGlzIHNlY29uZCBhcHByb2FjaCwgdGhlIGNvc3RzIGFsc28gYWNjb3VudCBmb3IgZGlzY291bnRpbmcgb2YgdGhlIHNldmVyYWwgcm91bmRzIG9mIHRyZWF0bWVudCByZXF1aXJlZCBmb3IgZWZmZWN0aXZlIGRld29ybWluZy4gIEFkZGl0aW9uYWxseSwgdGhlIGludGVyZXN0IHJhdGUgaXMgdXBkYXRlZCB0byBjdXJyZW50IHZhbHVlcyBvZiByZXR1cm4gb24gKEtlbnlhbikgZ292ZXJubWVudCBib25kcyBhbmQgaW5mbGF0aW9uLgoKCiMjIyBHYWlucyBpbiBlYXJuaW5ncwoKR2FpbnMgaW4gZWFybmluZ3MgKCRcRGVsdGEgV197dH0kKSBmcm9tIDEwLCAxNSwgYW5kIDIwIHllYXJzIGFmdGVyIHRoZSBpbnRlcnZlbnRpb24gYXJlIHVzZWQgdG8gbWVhc3VyZSB0aGUgZWZmZWN0IG9mIG11bHRpcGxlIHJvdW5kcyBvZiBkZXdvcm1pbmcgb24gd2VsZmFyZSBvdmVyIHRpbWUuIFRoaXMgaXMgYW4gaW1wb3J0YW50IGRpZmZlcmVuY2UgZnJvbSBhcHByb2FjaCAxLCB3aGljaCBvbmx5IG1lYXN1cmVzIGdhaW5zIGluIGVhcm5pbmdzIGF0IHllYXIgMTAgYW5kIGV4dHJhcG9sYXRlcyB0aGVtIGludG8gdGhlIGZ1dHVyZS4gVG8gZXh0cmFwb2xhdGUgZWFybmluZ3MgYWZ0ZXIgdGhlIDIwLXllYXIgbWVhc3VyZW1lbnQsIHRoZSBhdXRob3JzIGFzc3VtZSB0aGF0IHRoZSB3ZWxmYXJlIGdhaW5zIGRpc2FwZWFyIDI1IHllYXJzIGFmdGVyIHRoZSBpbnRlcnZlbnRpb24uIEhlbmNlIHRoZSB0cmVhdG1lbnQgZWZmZWN0IG92ZXIgYW4gaW5kaXZpZHVhbCdzIHdvcmtpbmcgbGlmZSBpcyB0aGUgc3VtIG9mIHRoZSB0cmVhdG1lbnQgZWZmZWN0cyBvdmVyIHRoZWlyIHdvcmtpbmcgbGlmZXRpbWVbXjhdLiBUaGlzIGFwcHJvYWNoIGFsc28gZGlzcmVnYXJkcyBleHRlcm5hbGl0eSBlZmZlY3RzIGFuZCBtZWFzdXJlcyB0aGUgZXN0aW1hdGVkIGVmZmVjdHMgZGlyZWN0bHkgb24gZWFybmluZ3MgKGFzIG9wcG9zZWQgdG8gYXBwcm9hY2ggMSB0aGF0IG1lYXN1cmVzIGVmZmVjdHMgb24gZWFybmluZ3MgaW5kaXJlY3RseSB0aHJvdWdoIGhvdXJzIHdvcmtlZCkuIFRoZSBlc3RpbWF0ZWQgdHJlYXRtZW50IGVmZmVjdHMgdGhhdCBwb29scyB5ZWFycyAxMCwgMTUsIGFuZCAyMCwgaXMgYHIgcGFzdGUwKCIkIiwgcm91bmQobWVhbihsYW1iZGExX25ld19zbyksMCkgKWAgZG9sbGFycyBwZXIgcGVyc29uIHBlciB5ZWFyLgoKR2FpbnMgaW4geWVhcmx5IGVhcm5pbmdzIHJlcHJlc2VudCB0aGUgdHJlYXRtZW50IGVmZmVjdCBvbiB3ZWxmYXJlICgkXGFscGhhXntwb29sZWR9JCksIHdoaWNoIGltcGxpY2l0bHkgdGFrZXMgaW50byBjb25zaWRlcmF0aW9uIHRoZSBsaWZlIGN5Y2xlIHByb2ZpbGUgb2Ygd2FnZXMsIGVjb25vbXl3aWRlIGdyb3d0aCwgZXRjLgoKW144XTogSW4gYW5vdGhlciBzcGVjaWZpY2F0aW9uIHRoZSBhdXRob3JzIGFzc3VtZSB0aGF0IGVmZmVjdHMgcGVyc2lzdCB0aHJvdWdoIHRoZSByZXN0IG9mIGFuIGluZGl2aWR1YWwncyB3b3JraW5nIGxpZmUuIEhlcmUgd2Ugc2VsZWN0IHRoZSBzcGVjaWZpY2F0aW9uIHRoYXQgaXMgbW9zdCBoaWdobGlnaHRlZCBpbiB0aGUgcGFwZXIgKG1vc3QgY29uc2VydmF0aXZlIHNwZWNpZmljYXRpb24pLiBUaGUgYXV0aG9ycyBhbHNvIGFuYWx5c2UgdGhlIHdlbGZhcmUgZWZmZWN0cyBvdmVyIGNvbnN1bXB0aW9uLCBidXQgZ2l2ZW4gdGhhdCB0aGV5IGRvIG5vdCBhZ2dyZWdhdGUgYm90aCBvdXRjb21lcyBpbiB0aGUgd2VsZmFyZSBlZmZlY3Qgd2Ugb25seSBjaG9vc2Ugb25lIGFuZCBmb2N1cyBvbiBlYXJuaW5nIGZvciBjb21wYXJhYmlsaXR5IHdpdGggdGhlIGFwcHJvYWNoIDEpLgoKCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5PgoKXGJlZ2lue2VxdWF0aW9ufQpcRGVsdGEgV197dH0gPSBcbWF0aGJmezF9KDEwIDwgdCBcbGVxIDI1KVxhbHBoYV57cG9vbGVkfQpgciBlcXVhdGlvbkluZGV4IDwtIGVxdWF0aW9uSW5kZXggKyAxYApcbGFiZWx7ZXE6YHIgZXF1YXRpb25JbmRleGB9Clx0YWd7YHIgZXF1YXRpb25JbmRleGB9ClxlbmR7ZXF1YXRpb259CgpXaGVyZToKCi0gJFxEZWx0YSBXX3QkOiBnYWlucyBpbiBlYXJuaW5ncyBmcm9tIDEwLCAxNSwgYW5kIDIwIHllYXJzIGFmdGVyIHRoZSBpbnRlcnZlbnRpb24gIAotICRcYWxwaGFee3Bvb2xlZH0kOiBwb29sZWQgZXN0aW1hdGVkIHRyZWF0bWVudCBlZmZlY3RzIG9mIDEwLCAxNSwgMjAgeWVhcnMgYWZ0ZXIgdGhlIGludGVydmVudGlvbgoKCmBgYHtyIGRlbHRhLWVhcm5pbmdzLCBldmFsPVRSVUUsIGVjaG8gPSBwcmludF9jb2RlfQojIC0gaW5wdXRzOiBpbmRleCBmb3IgdGltZSAodF92YXIpLCBwb29sZWQgdHJlYXRtZW50IGVmZmVjdCAobGFtYmRhMV9uZXdfc29bMV0pCiMgLSBvdXRwdXRzOiBlZmZlY3Qgb24gbGlmZXRpbWUgZWFybmluZ3MgKGVhcm5pbmdzX2FwcDJfZikKY2h1bmtfbmV3X2Vhcm5pbmdzIDwtIGZ1bmN0aW9uKCl7CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCgogICAgZWFybmluZ3NfYXBwMl9mIDwtIGZ1bmN0aW9uKHRfdmFyID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTFrMV92YXIgPSBsYW1iZGExX25ld19zb1sxXSkgewogICAgICAgIDEqKDEwIDw9IHRfdmFyICYgdF92YXIgPCAyNSkgKiBsYW1iZGExazFfdmFyCiAgICB9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgICAgICAgICAgCiAgICByZXR1cm4obGlzdCgiZWFybmluZ3NfYXBwMl9mIiA9IGVhcm5pbmdzX2FwcDJfZikpCn0KCmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfbmV3X2Vhcm5pbmdzKCksLkdsb2JhbEVudikgKQojIyMjIyBFeGVjdXRlIHZhbHVlcyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIHdoZW4gbmVlZGVkIGZvciB0aGUgdGV4dDoKZWFybmluZ3Nfbm9fZXh0X25ld19pbiA8LSBlYXJuaW5nc19hcHAyX2YodF92YXIgPSAwOjUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTFrMV92YXIgPSBsYW1iZGExX25ld19zb1sxXSkKYGBgCgo8L2RldGFpbHM+Cjxicj4KCgpgYGB7ciBzdW0tdGFibGVzMTcsIHB1cmw9RkFMU0UsIGVjaG89RkFMU0UsIGV2YWw9c2hvd19zdW1tYXJ5X3RhYmxlc30KCnRhYmxlXzFbOCwyXSA8LSBwYXN0ZTAoIiRcXGFscGhhXntLTFBTfT0iICwgcm91bmQobGFtYmRhMV9uZXdfc29bMV0sMiksICIkIikKCnN1bV90YWJsZV9pbmRleCA8LSBzdW1fdGFibGVfaW5kZXgrMQp0YWJsZV8yIDwtIHJiaW5kKHRhYmxlXzIsCiAgICAgICAgICAgICAgICAgYygiJFxcRGVsdGEgV197dH0gPSBcXG1hdGhiZnsxfSgxMCBcXGx0IHQgXFxsZXEgNTApXFxhbHBoYV57S0xQU30kIiwKICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiJCgiLCBzdW1fdGFibGVfaW5kZXgsICIpJCIpICkKICAgICkKCmtuaXRyOjprYWJsZSh0YWJsZV8yLCBjb2wubmFtZXMgPSBjKCJFcXVhdGlvbiIsICIjIiksIGNhcHRpb24gPSAiU3VtbWFyeSBvZiBlcXVhdGlvbnMgdXNlZCB1bnRpbCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudCIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKQoKa25pdHI6OmthYmxlKHRhYmxlXzEsIGNvbC5uYW1lcyA9IGMoIkRhdGEiLCAiUmVzZWFyY2giLCAiR3Vlc3N3b3JrIiksIGNhcHRpb24gPSAiU291cmNlczogc3VtbWFyeSBvZiBpbnB1dHMgc3BlY2lmaWVkIHVudGlsIHRoaXMgcG9pbnQgaW4gdGhlIGRvY3VtZW50IikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpCmBgYAoKIyMjIENvc3RzCgojIyMjIERpcmVjdCBjb3N0czogaW5jcmVhc2UgaW4gZGV3b3JtaW5nIGNvc3RzCgpTaW1pbGFyIHRvIGFwcHJvYWNoIDEsIHRoZSBkaXJlY3QgZGV3b3JtaW5nIGNvc3RzIHVuZGVyIGFwcHJvYWNoIDIgYXJlIGNhbGN1bGF0ZWQgYnkgY29tcGFyaW5nIHRoZSBjb3N0cyB1bmRlciBhIGNvbXBsZXRlIHN1YnNpZHkgdG8gdGhlIGNvc3RzIHVuZGVyIHRoZSBzdGF0dXMgcXVvIG9mIG5vIHN1YnNpZHkuIFRoZSB0d28gbWFpbiBkaWZmZXJlbmNlcyB3aXRoIHRoZSBwcmV2aW91cyBjb3N0IGVzdGltYXRlcyBhcmUgMSkgbm93IHRoZSBkaXJlY3QgY29zdHMgYXJlIHN1bW1lZCBhbmQgZGlzY291bnRlZCBvdmVyIHRoZSB0cmVhdG1lbnQgcGVyaW9kLCBhbmQgMikgY29zdCBkYXRhIGhhcyBiZWVuIHVwZGF0ZWQgYWZ0ZXIgZ2F0aGVyaW5nIG1vcmUgcmVjZW50IGZpZ3VyZXMgZnJvbSBFdmlkZW5jZSBBY3Rpb24uCgoKPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBhbGwgdGhlIGRldGFpbHM8L3N1bW1hcnk+CgpcYmVnaW57ZXF1YXRpb259CkRDID0gXHN1bV97dD0wfV57YHIgcm91bmQoeWVhcnNfb2ZfdHJlYXRfMF9zbywxKS0xYH0gXGxlZnQoIFxmcmFjezF9ezEgKyByfVxyaWdodClee3R9IFxiaWdbU197Mn1RKFNfezJ9KSAtIFNfezF9UShTX3sxfSkgXGJpZ10KYHIgZXF1YXRpb25JbmRleCA8LSBlcXVhdGlvbkluZGV4ICsgMWAKXGxhYmVse2VxOmByIGVxdWF0aW9uSW5kZXhgfQpcdGFne2ByIGVxdWF0aW9uSW5kZXhgfQpcZW5ke2VxdWF0aW9ufQoKClNpbmNlIHRoZSBhbmFseXNpcyBpcyBkaXNjcmV0ZSwgYW5kIHdlIGNhbm5vdCBzdW0gb3ZlciBhIG5vbi1pbnRlZ2VyLCB3ZSBmaW5kCgpcYmVnaW57ZXF1YXRpb259CkRDID0gXGJpZ1tTX3syfVEoU197Mn0pIC0gU197MX1RKFNfezF9KSBcYmlnXSArIFxsZWZ0KCBcZnJhY3sxfXsxICsgcn1ccmlnaHQpXGJpZ1tTX3syfVEoU197Mn0pIC0gU197MX1RKFNfezF9KSBcYmlnXSArIFxcCi40XGxlZnQoIFxmcmFjezF9ezEgKyByfVxyaWdodCleMiBcYmlnW1NfezJ9UShTX3syfSkgLSBTX3sxfVEoU197MX0pIFxiaWddCmByIGVxdWF0aW9uSW5kZXggPC0gZXF1YXRpb25JbmRleCArIDFgClxsYWJlbHtlcTpgciBlcXVhdGlvbkluZGV4YH0KXHRhZ3tgciBlcXVhdGlvbkluZGV4YH0KXGVuZHtlcXVhdGlvbn0KCldoZXJlOgoKLSAkREMkOiBkaXJlY3QgZGV3b3JtaW5nIGNvc3RzICAgCi0gJHIkOiBkaXNjb3VudGluZyByYXRlLCBkZWZpbmVkIGFzIHRoZSByZWFsIGludGVyZXN0IHJhdGUgIAotICRTXzIkOiBwZXItY2FwaXRhIGNvc3RzIG9mIGRld29ybWluZyB1bmRlciB0aGUgZGV3b3JtaW5nIGludGVydmVudGlvbiAgCi0gJFNfMSQ6IHBlci1jYXBpdGEgY29zdHMgb2YgZGV3b3JtaW5nIGlmIHRoZSBnb3Zlcm5tZW50IGRvZXMgbm90IHByb3ZpZGUgYW55IGFkZGl0aW9uYWwgcmVzb3VyY2VzIGZvciBkZXdvcm1pbmcgIAotICRRKFNfMikkOiB0YWtlLXVwIHVuZGVyIGEgbWFzcyBkZXdvcm1pbmcgaW50ZXJ2ZW50aW9uICAKLSAkUShTXzEpJDogdGFrZS11cCB3aXRob3V0IGFkZGl0aW9uYWwgcmVzb3VyY2VzIGZyb20gdGhlIGdvdmVybm1lbnQgIAoKCmBgYHtyIHVuaXRfY29zdHMyX25ldywgZWNobyA9IHByaW50X2NvZGV9CiMgLSBpbnB1dHM6IHVuaXQgY29zdHMgKHVuaXRfY29zdF9sb2NhbF9zbyksIGV4Y2hhbmdlIHJhdGUgKGV4X3JhdGVfc28pLAojICBuZXcgaW50ZXJlc3QgcmF0ZSAoaW50ZXJlc3RfbmV3X2luKQojIC0gb3V0cHV0czogdG90YWwgdW5pdCBjb3N0cyAoczJfbmV3X2YpCmNodW5rX3VuaXRfY29zdHMyX25ldyA8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAoKICBzMl9uZXdfZiA8LSBmdW5jdGlvbigKICAgIHVuaXRfY29zdF9sb2NhbF92YXIgPSB1bml0X2Nvc3RfbG9jYWxfc28sCiAgICBleF9yYXRlX3ZhciA9IGV4X3JhdGVfc28sCiAgICBpbnRlcmVzdF92YXIgPSBpbnRlcmVzdF9uZXdfaW4sCiAgICB5ZWFyX29mX3RyZWF0X3ZhciA9IHllYXJzX29mX3RyZWF0X3Rfc28pIHsKICAgICAgdW5pdF9jb3N0IDwtICggdW5pdF9jb3N0X2xvY2FsX3ZhciAvIGV4X3JhdGVfdmFyICkKICAgICAgcGVyaW9kc190ZW1wIDwtIGZsb29yKHllYXJfb2ZfdHJlYXRfdmFyKQogICAgICBwYXJ0X29mX2xhc3RfeWVhcl90ZW1wIDwtIHJvdW5kKHllYXJfb2ZfdHJlYXRfdmFyIC0gcGVyaW9kc190ZW1wLCAxKQogICAgICBzdW0oCiAgICAgICAgKCB1bml0X2Nvc3QgKiAoMSArIGludGVyZXN0X3ZhcileKC0oMDpwZXJpb2RzX3RlbXApKSApICoKICAgICAgICAgICAgYyhyZXAoMSxwZXJpb2RzX3RlbXApLCBwYXJ0X29mX2xhc3RfeWVhcl90ZW1wKQogICAgICAgICkKICAgIH0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCiAgICByZXR1cm4obGlzdCgiczJfbmV3X2YiID0gczJfbmV3X2YpICkKfQppbnZpc2libGUoIGxpc3QyZW52KGNodW5rX3VuaXRfY29zdHMyX25ldygpLC5HbG9iYWxFbnYpICkKIyMjIyMgRXhlY3V0ZSB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGVuIG5lZWRlZCBmb3IgdGhlIHRleHQ6CiMgTmV3IGNvc3RzIGFyZSBhbGwgaW4gZG9sbGFycyBzbywgd2lsbCBjb21wdXRlIHRoZW0gdXNpbmcgZXggcmF0ZSBvZiAxLgpzMl9uZXdfaW4gPC0gczJfbmV3X2YoCiAgaW50ZXJlc3RfdmFyID0gaW50ZXJlc3RfbmV3X2luLAogIHVuaXRfY29zdF9sb2NhbF92YXIgPSB1bml0X2Nvc3RfMjAxN3VzZHBwcF9zbywKICBleF9yYXRlX3ZhciA9IDEsCiAgeWVhcl9vZl90cmVhdF92YXIgPSB5ZWFyc19vZl90cmVhdF90X3NvCikKcTJfaW4gPC0gcV9mdWxsX3NvCmBgYAoKPC9kZXRhaWxzPgo8YnI+CgpXaXRoIGNvbXBsZXRlIHN1YnNpZHksIHRoZSBjb3N0cyBvZiB0aGUgaW50ZXJ2ZW50aW9uIGJlY29tZSB0aGUgdG90YWwgZGlyZWN0IGNvc3RzIG9mIGRld29ybWluZyBlYWNoIGNoaWxkIChpbiBVU0QpLiBNb3N0IHJlY2VudCAoMjAxOCkgZGF0YSBmcm9tIEV2aWRlbmNlIEFjdGlvbiByZXZlYWxzIHRoaXMgY29zdCB0byBiZSBcJGByIHVuaXRfY29zdF9zb2AgcGVyIHllYXIuIEFkanVzdGluZyBmb3IgcHVyY2hhc2luZyBwb3dlciBhbmQgaW5mbGF0aW9uLCB3ZSBnZXQgYSBwZXIgY2FwaXRhIGNvc3Qgb2YgXCRgciByb3VuZCh1bml0X2Nvc3RfMjAxN3VzZHBwcF9zbywyKWAuIEFkZGluZyBhbGwgaW5kaXJlY3QgY29zdCBvdmVyIGFuIGF2ZXJhZ2UgYHIgcm91bmQoeWVhcnNfb2ZfdHJlYXRfMF9zbywxKWAgeWVhcnMgb2YgdHJlYXRtZW50LCB0aGUgYXZlcmFnZSBjb3N0IG9mIGRld29ybWluZyBlYWNoIGNoaWxkIG92ZXIgdGhlIGVudGlyZSB0cmVhdG1lbnQgcGVyaW9kIGlzICRgciBmb3JtYXQocm91bmQoczJfbmV3X2luICogcTJfaW4sMiksIG5zbWFsbCA9IDIpYC4KCgojIyMjIEluZGlyZWN0IGNvc3RzOiBhZGRpdGlvbmFsIHllYXJzIG9mIGVkdWNhdGlvbiBhbmQgaXRzIGNvc3RzIGZvciBnb3Zlcm5tZW50ICAKClRoZSBpbmRpcmVjdCBjb3N0IG9uIHRoZSBlZHVjYXRpb24gc3lzdGVtIGlzIGNhbGN1bGF0ZWQgc2ltaWxhcmx5IHRvIGFwcHJvYWNoIDE6IHRoZSBjb3N0IHBlciBzdHVkZW50IGlzIG11bHRpcGxpZWQgYnkgdGhlIGluY3JlYXNlIGluIHNjaG9vbCBhdHRlbmRhbmNlIGR1ZSB0byBkZXdvcm1pbmcuIFRoZSBjb3N0IG9mIGFkZGl0aW9uYWwgc2Nob29saW5nIGlzIGdpdmVuIGJ5IHRoZSBwcm9kdWN0IG9mIHRoZSBhbm51YWwgY29zdCBvZiBzY2hvb2xpbmcgZWFjaCBjaGlsZCBhbmQgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHllYXJzIGNoaWxkcmVuIGF0dGVuZCBzY2hvb2wgYXMgYSByZXN1bHQgb2YgZGV3b3JtaW5nLiBUaGlzIGFuYWx5c2lzIGFzc3VtZXMgdGhhdCBwcmVzc3VyZSBpcyBhZGRlZCB0byBlZHVjYXRpb25hbCBpbnN0aXR1dGlvbnMgZm9yIGEgbWF4aW11bSBvZiBuaW5lIHllYXJzLCBzdGFydGluZyBhdCB5ZWFyIHplcm8uIFRoZSBjb3N0IHBlciBzdHVkZW50ICgkSyQpIGlzIHVwZGF0ZWQgd2l0aCBuZXcgaW5mb3JtYXRpb24gb24gYW5udWFsIHRlYWNoZXIgc2FsYXJ5IChpbmNsdWRpbmcgYmVuZWZpdHMpW145XSwgJGByIGZvcm1hdChyb3VuZCh0ZWFjaF9zYWxfMjAxN3VzZHBwcF9zbywwKSwgc2NpZW50aWZpYz1GQUxTRSwgYmlnLm1hcmsgPSAiLCIpYCAoYWxzbyBhZGp1c3RlZCBmb3IgUFBQKSwgYW5kIHRoZSBzYW1lIGF2ZXJhZ2UgbnVtYmVyIG9mIHN0dWRlbnRzIHBlciB0ZWFjaGVyIChgciBuX3N0dWRlbnRzX3NvYCkuCgpIZW5jZSwgdGhlIGNvc3Qgb2Ygc2Nob29saW5nIGVhY2ggY2hpbGQgZm9yIGFuIGFkZGl0aW9uYWwgeWVhciBpcyBub3cgJGByIHJvdW5kKHRlYWNoX3NhbF8yMDE3dXNkcHBwX3NvL25fc3R1ZGVudHNfc28sIDEpYCAoVVNEKS4KClteOV06IEJhc2VkIG9uIHRoZSB1cHBlciB0aWVyIG9mIG1vbnRobHkgdGVhY2hlciBzYWxhcmllcyByZXBvcnRlZCBieSB0d28gS2VueWFuIG5ld3Mgc291cmNlczogQG55YW5jaGFtYTIwMTggYW5kIEBvZHVvcjIwMTcuIFNpbmNlIGNvbXBlbnNhdGlvbiBmb3IgdGVhY2hlcnMgaW4gcnVyYWwgdmlsbGFnZXMgd2hlcmUgdGhlIHRyZWF0bWVudCB3YXMgYWRtaW5pc3RlcmVkIGlzIGJlbG93IHRoZSBuYXRpb25hbCBhdmVyYWdlLCB3ZSBhcmUgb3ZlcmVzdGltYXRpbmcgdGhlIGNvc3RzIGZvciBhIGNvbnNlcnZhdGl2ZSBhbmFseXNpcy4gVGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHN0dWRlbnRzIHBlciB0ZWFjaGVyIGlzIGByIG5fc3R1ZGVudHNfc29gLgoKCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5PgoKXGJlZ2lue2VxdWF0aW9ufQpLIFxzdW1fe3Q9MH1ee2ByIGRpbShkZWx0YV9lZF9zbylbMV0tMWB9IFxsZWZ0KCBcZnJhY3sxfXsxICsgcn1ccmlnaHQpXnt0fSBcRGVsdGEgXG92ZXJsaW5le0V9X3QoUzEsUzIpCmByIGVxdWF0aW9uSW5kZXggPC0gZXF1YXRpb25JbmRleCArIDFgClxsYWJlbHtlcTpgciBlcXVhdGlvbkluZGV4YH0KXHRhZ3tgciBlcXVhdGlvbkluZGV4YH0KXGVuZHtlcXVhdGlvbn0KCldoZXJlOgoKLSAkSyQ6IGNvc3QgcGVyIHN0dWRlbnQgdG8gZ2V0IGVkdWNhdGlvbiAgCi0gJFxEZWx0YSBcb3ZlcmxpbmV7RX1fe3R9KFMxLCBTMikkOiBlc3RpbWF0ZWQgaW5jcmVhc2UgaW4gc2Nob29sIGF0dGVuZGFuY2UgIAoKCmBgYHtyIGVkLWNvc3RzLW5ldywgcHVybD1GQUxTRSwgZWNobz1GQUxTRX0KbGlicmFyeShyb290U29sdmUpCgpkZWx0YV9lZF9pbiA8LSBkZWx0YV9lZF9zb1ssMV0KY29zdF9wZXJfc3R1ZGVudF9uZXdfaW4gPC0gY29zdF9wZXJfc3R1ZGVudF9mKAogIHRlYWNoX3NhbF92YXIgPSB0ZWFjaF9zYWxfbmV3X3NvLAogIHRlYWNoX2Jlbl92YXIgPSAwLAogIG5fc3R1ZGVudHNfdmFyID0gbl9zdHVkZW50c19zbwopCgoKcHZfY29zdHMyX2luIDwtIHB2X2Nvc3RzX2YoCiAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc19zbywKICAgZGVsdGFfZWRfdmFyID0gZGVsdGFfZWRfaW4sCiAgIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfbmV3X2luLAogICBjb3N0X29mX3NjaG9vbGluZ192YXIgPSBjb3N0X3Blcl9zdHVkZW50X25ld19pbiwKICAgczFfdmFyID0gMCwKICAgcTFfdmFyID0gMCwKICAgczJfdmFyID0gczJfbmV3X2luLAogICBxMl92YXIgPSBxX2Z1bGxfc28KKQoKCnB2X2JlbmVmX2FsbF9uZXdfaW4gPC0gcHZfYmVuZWZfZihlYXJuaW5nc192YXIgPSBlYXJuaW5nc19ub19leHRfbmV3X2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfbmV3X2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc19zbykKCmEyX2FsbF9wZSA8LSBOUFZfcGVfZihiZW5lZml0c192YXIgPSBwdl9iZW5lZl9hbGxfbmV3X2luLAogICAgICAgICAgICAgICAgICAgICAgY29zdHNfdmFyID0gcHZfY29zdHMyX2luKQoKZ2V0X2lyciA8LSBmdW5jdGlvbihyYXRlX3ZhcikgewogIHB2X2JlbmVmX2YoCiAgICAgZWFybmluZ3NfdmFyID0gZWFybmluZ3Nfbm9fZXh0X25ld19pbiwKICAgICBpbnRlcmVzdF9yX3ZhciA9IHJhdGVfdmFyLAogICAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc19zbwogICkgLQogIHB2X2Nvc3RzX2YoCiAgICAgcGVyaW9kc192YXIgPSBwZXJpb2RzX3NvLAogICAgIGRlbHRhX2VkX3ZhciA9IGRlbHRhX2VkX2luLAogICAgIGludGVyZXN0X3JfdmFyID0gcmF0ZV92YXIsCiAgICAgY29zdF9vZl9zY2hvb2xpbmdfdmFyID0gY29zdF9wZXJfc3R1ZGVudF9uZXdfaW4sCiAgICAgczFfdmFyID0gMCwKICAgICBxMV92YXIgPSAwLAogICAgIHMyX3ZhciA9IHMyX25ld19mKAogICAgICAgaW50ZXJlc3RfdmFyID0gcmF0ZV92YXIsCiAgICAgICB1bml0X2Nvc3RfbG9jYWxfdmFyID0gdW5pdF9jb3N0XzIwMTd1c2RwcHBfc28sCiAgICAgICBleF9yYXRlX3ZhciA9IDEsCiAgICAgICB5ZWFyX29mX3RyZWF0X3ZhciA9IHllYXJzX29mX3RyZWF0X3Rfc28KICAgICApLAogICAgIHEyX3ZhciA9IHFfZnVsbF9zbwogICkKfQoKaXJyX2luIDwtIChtdWx0aXJvb3QoZnVuY3Rpb24oeCkgZ2V0X2lycihyYXRlX3ZhciA9IHgpLCAuMSwgbWF4aXRlcj0xMDAwMDAwMCwgcG9zaXRpdmUgPSBUKSkkcm9vdApgYGAKPC9kZXRhaWxzPgo8YnI+CgpPdmVyIHRoaXMgbmluZSB5ZWFyIHBlcmlvZCwgdHJlYXRlZCBzdHVkZW50cyBhdHRlbmRlZCBzY2hvb2wgZm9yIGFuIGFkZGl0aW9uYWwgYHIgcm91bmQoc3VtKGRlbHRhX2VkX3NvWywxXSksMilgIHllYXJzIG9uIGF2ZXJhZ2UuIFRoZW4gd2UgZ2V0IGFuIGF2ZXJhZ2UgY29zdCBvZiBhZGRpdGlvbmFsIHNjaG9vbGluZyBwZXIgY2hpbGQgb3ZlciB0aGUgbmluZS15ZWFyIHBlcmlvZCwgJGByIGZvcm1hdChyb3VuZCgoY29zdF9wZXJfc3R1ZGVudF9uZXdfaW4qc3VtKCAoMS8oMStpbnRlcmVzdF9uZXdfaW4pKV4oMDo4KSAqIGRlbHRhX2VkX2luICkpLDIpLCBuc21hbGwgPSAyKWAuCgoKIyMjIEFzc2Vzc2luZyBjb21wdXRhdGlvbmFsIHJlcHJvZHVjaWJpbGl0eSBvZiBvcmlnaW5hbCByZXN1bHRzICAKClRoZSBzZWNvbmQgYXBwcm9hY2ggZG9lcyBub3QgcmVwb3J0IGJlbmVmaXRzIGFuZCBjb3N0cyBzZXBhcmF0ZWRseS4gV2l0aCBhbGwgdGhlc2UgZWxlbWVudHMgdGhlIG1haW4gcmVzdWx0IGZyb20gdGhlIG9yaWdpbmFsIGFuYWx5c2lzIHRoYXQgaXMgY29tcGFyYWJsZSB3aXRoIHRoZSByZXN1bHRzIGRpc2N1c3NlZCBoZXJlIGlzIGEgTlBWIG9mIGByIGRmX3Jlc2VhcmNoX3NvJHBhcmFtWzldYCAodGFibGUgYHIgZGZfcmVzZWFyY2hfc28kdGFibGVudW1bOV1gLCBjb2x1bW4gYHIgZGZfcmVzZWFyY2hfc28kdGFibGVfY29sWzldYCwgYW5kIHJvdyBgciBkZl9yZXNlYXJjaF9zbyR0YWJsZV9yb3dbOV1gKSBUaGlzIHJlc3VsdCBjb3JyZXNwb25kcyB0byBhIHNvY2lhbCBpbnRlcm5hbCByYXRlIG9mIHJldHVybiBvZiBgciBwYXN0ZTAoZGZfcmVzZWFyY2hfc28kcGFyYW1bOF0sICIlIilgIGxvY2F0ZWQgYXMgYW4gaW5saW5lIHJlc3VsdCBpbiB0aGUgcGFwZXIgLSBhbHNvIGluIGByIGRmX3Jlc2VhcmNoX3NvJGZpZ3VyZV9udW1bOF1gIC0gYW5kIGluIHRoZSBhcHBlbmRpeCBhdCB0YWJsZSBgciBkZl9yZXNlYXJjaF9zbyR0YWJsZW51bVs4XWAsIGNvbHVtbiBgciBkZl9yZXNlYXJjaF9zbyR0YWJsZV9jb2xbOF1gLCBhbmQgcm93IGByIGRmX3Jlc2VhcmNoX3NvJHRhYmxlX3Jvd1s4XWApLiBGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiB0aGlzIHNlY3Rpb24sIHRoaXMgYW5hbHlzaXMgb2J0YWlucyB0aGUgc2FtZSByZXN1bHQgKGByIGEyX2FsbF9wZWAgYW5kIGByIHBhc3RlMChpcnJfaW4gKiAxMDAsICIlIilgIHJlc3BlY3RpdmVseSB3aXRob3V0IHJvdW5kaW5nKS4KCgpgYGB7ciBzdW0tdGFibGVzMjAsIHB1cmw9RkFMU0UsIGVjaG89RkFMU0UsIGV2YWw9c2hvd19zdW1tYXJ5X3RhYmxlc30KdGFibGVfMVs5LDJdIDwtIHBhc3RlMCgiJHJfezE2fT0iLCBpbnRlcmVzdF9pbiwgIiQiKQoKdGFibGVfMSA8LSByYmluZCh0YWJsZV8xLCBjKCIiLCBwYXN0ZTAoIiRyX3sxOX09IiwgaW50ZXJlc3RfbmV3X2luLCAiJCIpLCAiIikpCnRhYmxlXzEgPC0gcmJpbmQodGFibGVfMSwgYyggIiIsIHBhc3RlMCgiJFNfMj0iLCAxLCAiJCIpLCAiIiksICNTMiBpcyBhIGNvbXBsZXRlIHN1YnNpZHkKICAgICAgICAgICAgICAgICBjKCAiIixwYXN0ZTAoIiRcXG92ZXJsaW5le1xcRGVsdGEgXFxvdmVybGluZXtFfV97dH0oUzEsUzIpfT0iLCByb3VuZChtZWFuKGRlbHRhX2VkX3NvWywxXSksMiksICIkIiksICIiKSkKCnN1bV90YWJsZV9pbmRleCA8LSBzdW1fdGFibGVfaW5kZXgrMQp0YWJsZV8yIDwtIHJiaW5kKHRhYmxlXzIsCiAgICAgICAgICAgICAgICAgYygiJERDID0gXFxiaWdbU197Mn1RKFNfezJ9KSAtIFNfezF9UShTX3sxfSkgXFxiaWddICsgXFxsZWZ0KCBcXGZyYWN7MX17MSArIHJ9XFxyaWdodClcXGJpZ1tTX3syfVEoU197Mn0pIC0gU197MX1RKFNfezF9KSBcXGJpZ10gKyBcXAouNFxcbGVmdCggXFxmcmFjezF9ezEgKyByfVxccmlnaHQpXjIgXFxiaWdbU197Mn1RKFNfezJ9KSAtIFNfezF9UShTX3sxfSkgXFxiaWddJCIsCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIiQoIiwgc3VtX3RhYmxlX2luZGV4LCAiKSQiKSApCiAgICApCgpzdW1fdGFibGVfaW5kZXggPC0gc3VtX3RhYmxlX2luZGV4KzEKdGFibGVfMiA8LSByYmluZCh0YWJsZV8yLAogICAgICAgICAgICAgICAgIGMoIiRLIFxcc3VtX3t0PTB9Xns4fSBcXGxlZnQoIFxcZnJhY3sxfXsxICsgcn1cXHJpZ2h0KV57dH0gXFxEZWx0YSBcXG92ZXJsaW5le0V9X3QoUzEsUzIpJCIsCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIiQoIiwgc3VtX3RhYmxlX2luZGV4LCAiKSQiKSApCiAgICApCgprbml0cjo6a2FibGUodGFibGVfMiwgY29sLm5hbWVzID0gYygiRXF1YXRpb24iLCAiIyIpLCBjYXB0aW9uID0gIlN1bW1hcnkgb2YgZXF1YXRpb25zIHVzZWQgdW50aWwgdGhpcyBwb2ludCBpbiB0aGUgZG9jdW1lbnQiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSkKCmtuaXRyOjprYWJsZSh0YWJsZV8xLCBjb2wubmFtZXMgPSBjKCJEYXRhIiwgIlJlc2VhcmNoIiwgIkd1ZXNzd29yayIpLCBjYXB0aW9uID0gIlNvdXJjZXM6IHN1bW1hcnkgb2YgaW5wdXRzIHNwZWNpZmllZCB1bnRpbCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudCIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKQpgYGAKCiMjIEFwcHJvYWNoIDM6IENvbWJpbmF0aW9uIG9mIFByZXZpb3VzIEFwcHJvYWNoZXMgYW5kIElucHV0IEZyb20gS2V5IFBvbGljeSBQYXJ0bmVycwoKSW4gdGhpcyB0aGlyZCBhbmQgZmluYWwgYXBwcm9hY2gsIHdlIGJvcnJvd2VkIHNvbWUgbWV0aG9kb2xvZ2ljYWwgZWxlbWVudHMgZnJvbSBAYmFpcmQyMDE2d29ybXMgYW5kIEBrbHBzNCBhbmQgc291Z2h0IGZlZWRiYWNrIGZyb20gYSBrZXkgcG9saWN5IHBhcnRuZXIgdG8gYmVzdCBpZGVudGlmeSBvbmUgY2xlYXIgb3V0cHV0IHRvIGluZm9ybSBwb2xpY3kgbWFrZXJzLiBXZSB3b3JrZWQgaW4gY29sbGFib3JhdGlvbiB3aXRoIHRoZSBOR08gRXZpZGVuY2UgQWN0aW9uLCBhIGtleSB0ZWNobmljYWwgYXNzaXN0YW5jZSBwYXJ0bmVyIGluIHRoaXMgYXJlYS4gRXZpZGVuY2UgQWN0aW9uIHByb3ZpZGVkIGluc2lnaHRzIG9uIHdoYXQgYXJlIHRoZSBtb3N0IHJlbGV2YW50IGNvc3RzIGFuZCBiZW5lZml0cyBmcm9tIHRoZSBwZXJzcGVjdGl2ZXMgb2YgcG9saWN5IG1ha2VycywgYW5kIG9uIGNlcnRhaW4gYXNwZWN0cyBvZiB0aGUgYW5hbHlzaXMgdGhhdCBjb3VsZCBiZSB1cGRhdGVkIHdpdGggcHJlc2VudC1kYXkgZGF0YS4KClVuZGVyIHRoaXMgYXBwcm9hY2gsIHRoZSBiZW5lZml0cyBmcm9tIGRld29ybWluZyBkZXNjcmliZWQgaW4gQXBwcm9hY2hlcyAxIGFuZCAyIGFyZSBzY2FsZWQgdG8gcmVmbGVjdCBkaWZmZXJlbmNlcyBpbiBwcmV2YWxlbmNlIHJhdGVzLCBhbmQgbGVuZ3RoIG9mIHRyZWF0bWVudC4gQWRkaXRpb25hbGx5LCB0aGUgcmVsZXZhbnQgY29zdHMgYXJlIGNvbnN0cmFpbmVkIHRvIGRpcmVjdCBjb3N0cyBhbG9uZSAoZXhjbHVkaW5nIGFkZGl0aW9uYWwgY29zdHMgb24gZWR1Y2F0aW9uKS4gRmluYWxseSB0aGlzIGFwcHJvYWNoIHVzZXMgaW5wdXRzIGNvc3RzIGFuZCBwcmV2YWxlbmNlIHRoYXQgcmVmbGVjdCB0aGUgY3VycmVudCBzZXR0aW5ncyB3aGVyZSBFdmlkZW5jZSBBY3Rpb24gaXMgY3VycmVudGx5IHN1cHBvcnRpbmcgZGV3b3JtaW5nIGludGVydmVudGlvbnMuIEFzIG9mIDIwMjAsIEV2aWRlbmNlIEFjdGlvbiBzdXBwb3J0cyBkZXdvcm1pbmcgaW50ZXJ2ZW50aW9ucyBpbiBmb3VyIGNvdW50cmllcy4KCiMjIyBCZW5lZml0cyAgIAoKCiMjIyMgQWRqdXN0aW5nIGZvciBkaWZmZXJlbnQgcHJldmFsZW5jZSByYXRlcyAgCgpUbyBhY2NvdW50IGZvciBkaWZmZXJlbnQgcHJldmFsZW5jZSByYXRlcyAoJFxldGEkKSwgdGhlIGVzdGltYXRlZCB0cmVhdG1lbnQgZWZmZWN0IGlzIGRlY29tcG9zZWQgaW4gdGhlIGltcGFjdCBvZiBkZXdvcm1pbmcgb24gY2hpbGRyZW4gd2hvIHdlcmUgdHJlYXRlZCBhbmQgaGFkIGEgd29ybSBpbmZlY3Rpb24sIG9yIHRoZSBlZmZlY3RpdmUgdHJlYXRtZW50IGVmZmVjdCBvZiBkZXdvcm1pbmcgKCRcbGFtYmRhX3sxfV57ZWZmfSQpLCBhbmQgY2hpbGRyZW4gd2hvIHdlcmUgdHJlYXRlZCBhbmQgZGlkIG5vdCBoYXZlIGEgd29ybSBpbmZlY3Rpb24uIEJ5IGNvbnN0cnVjdGlvbiwgdGhlIGVmZmVjdCBvbiB0aGlzIGxhc3QgZ3JvdXAgc2hvdWxkIGJlIHplcm8uIEhlbmNlIHRoZSBlZmZlY3RpdmUgdHJlYXRtZW50IG9mIGRld29ybWluZyBvbiBpbmZlY3RlZCBwb3B1bGF0aW9ucyB3aWxsIGJlIGVxdWFsIHRvIHRoZSBlc3RpbWF0ZWQgdHJlYXRtZW50IChvbiB0aGUgb3ZlYXJsbCBwb3B1bGF0aW9uKSwgZGl2aWRlZCBieSB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgcHJldmFsZW5jZSBvZiBpbmZlY3Rpb25zLgoKSW4gdGhlIG9yaWdpbmFsIGV2YWx1YXRpb24sIHRoZSBwcmV2YWxlbmNlIHJhdGVzIHdlcmUgdmVyeSBoaWdoIChgciBwcmV2YWxlbmNlXzBfc29gKSwgaGVuY2UgdGhlIGVmZmVjdCBvbiB0aGUgaW5mZWN0ZWQgcG9wdWxhdGlvbiB3YXMgc2ltaWxhciB0byB0aGF0IG9mIHRoZSBvdmVyYWxsIHBvcHVsYXRpb24uIEN1cnJlbnRseSBkZXdvcm1pbmcgaW50ZXJ2ZW50aW9ucyBhcmUgb2Z0ZW4gaW1wbGVtZW50ZWQgaW4gZ2VvZ3JhcGhpZXMgd2l0aCBtdWNoIGxvd2VyIHByZXZhbGVuY2UgcmF0ZXMgKHRob3VnaCBpbiBwb3B1bGF0aW9ucyB3aXRoIHN1ZmZpY2llbnQgaW5mZWN0aW9uIHRvIGp1c3RpZnkgdHJlYXRtZW50IGluIGFjY29yZGFuY2Ugd2l0aCBXb3JsZCBIZWFsdGggT3JnYW5pemF0aW9uIGd1aWRlbGluZXMpLCBoZW5jZSB0byBvYnRhaW4gdGhlIGV4cGVjdGVkIGVmZmVjdCBvdmVyIHRoZSBuZXcgcmVnaW9uLCB3ZSBuZWVkIHRvIG11bHRpcGx5IHRoZSBlZmZlY3Qgb24gdGhlIGluZmVjdGVkIHBvcHVsYXRpb24gYnkgdGhlIHByZXZhbGVuY2UgcmF0ZSBpbiB0aGUgbmV3IHJlZ2lvbiAoJFxldGFfe25ld30kKS4KCgo8ZGV0YWlscz48c3VtbWFyeT5TaG93IGFsbCB0aGUgZGV0YWlsczwvc3VtbWFyeT4KCkZvciBhcHByb2FjaCAzLCB3ZSB3aWxsIG1vZGlmeSB0cmVhdG1lbnQgZWZmZWN0cyBvZiBhcHByb2FjaGVzIDEgYW5kIDIgKGVxdWF0aW9uIDQgYW5kIDEzIHJlc3BlY3RpdmVseSkgYnkgdGhlIGZvbGxvd2luZzogICAKClxiZWdpbntlcXVhdGlvbn0KXGxhbWJkYV97MX0gPSBcZXRhIFxsYW1iZGFee2VmZn1fezF9ICsgKDEgLSAgXGV0YSkgXHRpbWVzIDAgXFwKXGxhbWJkYV57cn1fezF9ID0gXGV0YV97bmV3fVxsYW1iZGFee2VmZn1fezF9CmByIGVxdWF0aW9uSW5kZXggPC0gZXF1YXRpb25JbmRleCArIDFgClxsYWJlbHtlcTpgciBlcXVhdGlvbkluZGV4YH0KXHRhZ3tgciBlcXVhdGlvbkluZGV4YH0KXGVuZHtlcXVhdGlvbn0KCldoZXJlOgoKLSAkXGxhbWJkYV8xJDogZGlyZWN0IGVmZmVjdHMgb2YgZGV3b3JtaW5nIG9uIGluZGl2aWR1YWxzJyBlYXJuaW5ncy4gSGVyZSB3ZSB1c2UgdGhlIHN5bWJvbCBmb3IgdHJlYXRtZW50IGVmZmVjdCBvZiBhcHByb2FjaCAxLCBidXQgdGhlIHNhbWUgbG9naWMgYXBwbGllcyB0byB0aGUgdHJlYXRtZW50IGVmZmVjdCBvZiBhcHByb2FjaCAyICgkXGFscGhhXntwb29sZWR9JCkKLSAkXGxhbWJkYV57ZWZmfV8xJDogaW1wYWN0IG9mIGRld29ybWluZyBvbiBjaGlsZHJlbiB3aG8gd2VyZSB0cmVhdGVkIGFuZCBoYWQgYSB3b3JtIGluZmVjdGlvbiBpbiB0aGUgb3JpZ2luYWwgZXZhbHVhdGlvbiAgCi0gJFxsYW1iZGFecl8xJDogaW1wYWN0IG9mIGRld29ybWluZyBvbiBjaGlsZHJlbiB3aG8gd2VyZSB0cmVhdGVkIGFuZCBoYWQgYSB3b3JtIGluZmVjdGlvbiBpbiB0aGUgbmV3IHJlZ2lvbiAgCi0gJFxldGEkOiBwcmV2YWxlbmNlIHJhdGVzIGluIHRoZSBvcmlnaW5hbCBldmFsdWF0aW9uICAgCi0gJFxldGFfe25ld30kOiBwcmV2YWxlbmNlIHJhdGVzIGluIHRoZSBuZXcgcmVnaW9uICAgCgpgYGB7ciBsYW1iZGFzX2VmZiwgZWNobyA9IHByaW50X2NvZGV9CiMgLSBpbnB1dHM6IHByZXZpb3VzbHkgZXN0aW1hdGVkIHRyZWF0bWVudCBlZmZlY3QgKGxhbWJkYTFfaW5fZiksIHByZXZhbGVuY2UKIyByYXRlcyBpbiB0aGUgb3JpZ2luYWwgc2V0dGluZyAocHJldmFsZW5jZV8wX3NvKSwgcHJldmFsZW5jZSBpbiB0aGUgbmV3IHNldHRpbmcKIyAocHJldmFsZW5jZV9yX3NvKSwgY291bnRyaWVzIGluY2x1ZGVkIGluIHRoZSBhbmFseXNpcyAoY291bnRyeV9zZWxfc28pCiMgYW5kIHRoZWlyIHBvcHVsYXRpb24gKGNvdW50cnlfc2VsX3BvcF9zbyksIG9yIHNpbmdsZSBpbnB1dCBvZiBuZXcgcHJldmFsZW5jZQojIChuZXdfcHJldmFsZW5jZV9yX3NvKQojIC0gb3V0cHV0czogZWZmZWN0aXZlIHRyZWF0bWVudCBlZmZlY3QgKGxhbWJkYV9lZmZfZikKY2h1bmtfbGFtYmRhc19lZmY8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgCgogICAgbGFtYmRhX2VmZl9mIDwtIGZ1bmN0aW9uKGxhbWJkYTFfdmFyID0gbGFtYmRhMV9pbl9mKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZhbGVuY2VfMF92YXIgPSBwcmV2YWxlbmNlXzBfc28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZhbGVuY2Vfcl92YXIgPSBwcmV2YWxlbmNlX3Jfc28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlfc2VsX3ZhciA9IGNvdW50cnlfc2VsX3NvLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5X3NlbF9wb3BfdmFyID0gY291bnRyeV9zZWxfcG9wX3NvLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9wcmV2bF9yX3ZhciA9IG5ld19wcmV2YWxlbmNlX3Jfc28pewogICAgICB0ZW1wX3NlbCA8LSBhcy5jaGFyYWN0ZXIoY291bnRyeV9zZWxfdmFyKSAgCiAgICAgICMgaWYgYSBwb3NpdGl2ZSBudW1iZXIgb2YgY291bnRyaWVzIGlzIHNlbGVjdGVkCiAgICAgIGlmIChpcy5udWxsKG90aGVyX3ByZXZsX3JfdmFyKSkgewogICAgICAgIHRlbXBfd2VpZ2h0cyA8LSBjb3VudHJ5X3NlbF9wb3BfdmFyW3RlbXBfc2VsXSAvCiAgICAgICAgICBzdW0oY291bnRyeV9zZWxfcG9wX3Zhclt0ZW1wX3NlbF0pCiAgICAgICAgcHJldmFsZW5jZV9yX2ZpbmFsIDwtIHN1bSggcHJldmFsZW5jZV9yX3Zhclt0ZW1wX3NlbF0gKiB0ZW1wX3dlaWdodHMgKQogICAgICB9IGVsc2UgewogICAgICAgIHByZXZhbGVuY2Vfcl9maW5hbCA8LSBvdGhlcl9wcmV2bF9yX3ZhciAgCiAgICAgIH0KICAgICAgbGFtYmRhMV9lZmZfdGVtcCA8LSBsYW1iZGExX3ZhciAvIHByZXZhbGVuY2VfMF92YXIKICAgICAgbGFtYmRhMV9lZmZfaW4gPC0gbGFtYmRhMV9lZmZfdGVtcCAqIHByZXZhbGVuY2Vfcl9maW5hbAogICAgICByZXR1cm4oICAKICAgICAgICBsaXN0KCJsYW1iZGExX2VmZl9pbiIgPSBsYW1iZGExX2VmZl9pbiwKICAgICAgICAgICAgICJwcmV2YWxlbmNlX3JfZmluYWxfaW4iID0gcHJldmFsZW5jZV9yX2ZpbmFsKQogICAgICAgICAgICAgICkKICAgIH0gIAoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAKICAgIHJldHVybiggbGlzdCgibGFtYmRhX2VmZl9mIiA9IGxhbWJkYV9lZmZfZikgKQp9CmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfbGFtYmRhc19lZmYoKSwuR2xvYmFsRW52KSApCgojIyMjIyBFeGVjdXRlIHZhbHVlcyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIHdoZW4gbmVlZGVkIGZvciB0aGUgdGV4dDoKbGFtYmRhMV9yX2luIDwtIGxhbWJkYV9lZmZfZigpJGxhbWJkYTFfZWZmX2luCnByZXZhbGVuY2Vfcl9pbiA8LSBsYW1iZGFfZWZmX2YoKSRwcmV2YWxlbmNlX3JfZmluYWxfaW4KYGBgCgo8L2RldGFpbHM+Cjxicj4KCkV2aWRlbmNlIEFjdGlvbiBwcm92aWRlZCBwcmV2YWxlbmNlIHN1cnZleSBkYXRhIGZvciB0aGUgZ2VvZ3JhcGhpZXMgd2hlcmUgdGhleSBhcmUgaW52b2x2ZWQuIEluIG9yZGVyIHRvIGJlIG1vc3QgYW5hbG9nb3VzIHdpdGggdGhlIGJhc2VsaW5lIHByZXZhbGVuY2UgZXN0aW1hdGUgdXNlZCBpbiB0aGUgb3JpZ2luYWwgc3R1ZHksIHRoZSBwcmV2YWxlbmNlIGVzdGltYXRlcyB1c2VkIGFyZSAxKSB0aGUgZWFybGllc3QgcG9pbnQgZXN0aW1hdGVzIGF2YWlsYWJsZSBmcm9tIGJlZm9yZSwgb3IgY2xvc2UgdG8gdGhlIHRpbWUgb2YsIEV2aWRlbmNlIEFjdGlvbidzIGludm9sdmVtZW50IGluIHRoYXQgZ2VvZ3JhcGh5LCBhbmQgMikgYXJlIHJlcHJlc2VudGF0aXZlIG9mIGFueSBTVEggaW5mZWN0aW9uLiAgICAgIAoKIyMjIyBBZGp1c3RpbmcgZm9yIGRpZmZlcmVudCBsZW5ndGggb2YgdHJlYXRtZW50ICAKClRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgeWVhcnMgb3ZlciB3aGljaCBhIHBvcHVsYXRpb24gaXMgZXhwb3NlZCB0byBkZXdvcm1pbmcgdHJlYXRtZW50IGRldGVybWluZXMgdGhlIGludGVuc2l0eSBvZiB0aGUgZWZmZWN0cyBvdmVyIHRoaXMgcG9wdWxhdGlvbiBvdmVyIHRpbWUuIFRoZSB0d28gYXBwcm9hY2hlcyByZXByb2R1Y2VkIHNvIGZhciBob2xkIHRoZSBsZW5ndGggb2YgdHJlYXRtZW50IGNvbnN0YW50IGF0IHRoZSBsZXZlbHMgZXN0aW1hdGVkIGJ5IHRoZSBvcmlnaW5hbCBzdHVkeSAoYHIgcm91bmQoeWVhcnNfb2ZfdHJlYXRfMF9zbywgMSlgIHllYXJzKS4gSW4gdGhpcyB0aGlyZCBhcHByb2FjaCB3ZSBhbGxvdyBmb3IgdGhlIHllYXJzIG9mIHRyZWF0bWVudCB0byB2YXJ5IGFmZmVjdGluZyBib3RoIGJlbmVmaXRzIGFuZCBjb3N0cy4gV2UgYXNzdW1lIHRoYXQgdGhlIGVmZmVjdHMgYXJlIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIHllYXJzIG9mIHRyZWF0bWVudCwgd2l0aCBubyBhZGRpdGlvbmFsIGVmZmVjdHMgYWZ0ZXIgNiB5ZWFycyBvZiB0cmVhdG1lbnQuIFdlIGFzc3VtZWQgYSBtYXhpbXVtIG9mIDYgeWVhcnMgb2YgaW1wYWN0IGluIHRoaXMgY2FzZSBiYXNlZCBvbiB0aGUgMjAgeWVhciBLTFBTIGZvbGxvdy11cCByZXNlYXJjaCwgd2hpY2ggc2hvd3MgYSBsZXZlbGxpbmctb2ZmIG9mIHRyZWF0bWVudCBlZmZlY3QgYWZ0ZXIgYXBwcm94aW1hdGVseSA2IHllYXJzIG9mIGRld29ybWluZyAoQGtscHM0OyBGaWd1cmUgQS41IGluIEFwcGVuZGl4LCBwYWdlIEEtNikuCgpBZGRpbmcgdGhlIGVsZW1lbnQgb2YgdHJlYXRtZW50IGR1cmF0aW9uIGFsbG93cyB1cyB0byB0YWtlIGludG8gYWNjb3VudCBkaWZmZXJlbmNlcyBpbiB0aGUgbnVtYmVyIG9mIHllYXJzIG9mIGRld29ybWluZyB0cmVhdG1lbnQgYWNyb3NzIGRpZmZlcmVudCBjb3VudHJ5IGNvbnRleHRzIGRlcGVuZGluZyBvbiBwcm9ncmFtIGR5bmFtaWNzLiBBbHRob3VnaCB0aGUgY291bnRlcmZhY3R1YWwgb2Ygd29ybSBwcmV2YWxlbmNlIGluIHRoZSBhYnNlbmNlIG9mIHRyZWF0bWVudCBpcyBsYXJnZWx5IHVua25vd24sIHdlIGtub3cgdGhhdCBjb25zaXN0ZW50IGRld29ybWluZyBjb250aW51ZXMgdG8gZGVjcmVhc2Ugd29ybSBwcmV2YWxlbmNlIG92ZXIgdGltZSwgY29udHJpYnV0aW5nIHRvIGNvbnRyb2xsZWQgd29ybSBlbnZpcm9ubWVudHMgYW5kIHN1c3RhaW5lZCBiZW5lZml0cy4gSW4gbWFueSBkZXdvcm1pbmcgcHJvZ3JhbXMgdG9kYXksIGNoaWxkcmVuIHJlY2VpdmUgcmVndWxhciB0cmVhdG1lbnQgdGhyb3VnaG91dCBhIHBvcnRpb24gKGFuZCBpbiBzb21lIGNhc2VzIGZvciB0aGUgZnVsbCB0ZXJtKSBvZiB0aGVpciBwcmltYXJ5IHNjaG9vbGluZy4gSXQgaXMgd29ydGggbm90aW5nIHRoYXQgdGhlIGFzc3VtcHRpb24gb2YgbGluZWFyaXR5IGlzIGFuIGltcGVyZmVjdCBtZWFzdXJlIGZvciB2YXJpb3VzIGVwaWRlbWlvbG9naWNhbCByZWFzb25zLCB0aG91Z2ggd2UgaW5jbHVkZSB0aGlzIHZhcmlhYmxlIG9mIHRpbWUgaW50byB0aGUgZXF1YXRpb24gYXMgYW4gZXN0aW1hdGUgb2YgdGhlIGJlc3QgZ3Vlc3MgYXQgdGhlIGRpZmZlcmVuY2VzIGluIGFjaGlldmVkIGltcGFjdCBvdmVyIHRpbWUsIGFuZCBpbiBwYXJ0IGJlY2F1c2UgaXQgaGVscHMgY2FwdHVyZSB0aGF0IGEgbmV3IGNvaG9ydCBlbnRlcnMgcHJpbWFyeSBzY2hvb2wtLWFuZCBpcyB0aGVyZWZvcmUgZWxpZ2libGUgZm9yIHRyZWF0bWVudC0td2l0aCBlYWNoIHN1Y2Nlc3NpdmUgeWVhciBvZiBhIGRld29ybWluZyBwcm9ncmFtLgoKPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBhbGwgdGhlIGRldGFpbHM8L3N1bW1hcnk+CgpGb3IgYXBwcm9hY2ggMywgd2Ugd2lsbCBtb2RpZnkgdHJlYXRtZW50IGVmZmVjdHMgb2YgYXBwcm9hY2hlcyAxIGFuZCAyIChlcXVhdGlvbnMgNCBhbmQgMTMgcmVzcGVjdGl2ZWx5KSBieSB0aGUgZm9sbG93aW5nOiAgIAoKXGJlZ2lue2VxdWF0aW9ufQpcbGFtYmRhX3sxLHQgPSAxfSA9IFxmcmFje1xsYW1iZGFfezF9fXtMX3swfX0gXFwKXGxhbWJkYV97MSx0fSA9ClxiZWdpbntjYXNlc30KdCBcbGFtYmRhX3sxLHQgPSAxfSBccXVhZCBcdGV4dHtmb3IgfSB0PTEsIFxkb3RzLCA2XFwKXFwKNiAgXGxhbWJkYV97MSx0ID0gMX0gXHF1YWQgXHRleHR7Zm9yIH0gdCA+IDZcXApcZW5ke2Nhc2VzfQpgciBlcXVhdGlvbkluZGV4IDwtIGVxdWF0aW9uSW5kZXggKyAxYApcbGFiZWx7ZXE6YHIgZXF1YXRpb25JbmRleGB9Clx0YWd7YHIgZXF1YXRpb25JbmRleGB9ClxlbmR7ZXF1YXRpb259CgoKYGBge3IgbGFtYmRhc190LCBlY2hvID0gcHJpbnRfY29kZX0KIyAtIGlucHV0czogdHJlYXRtZW50IGVmZmVjdCAobGFtYmRhMV9pbl9mKSwgbGVuZ3RoIG9mIHRyZWF0bWVudCBpbiBvcmlnaW5hbAojIHN0dWR5ICh5ZWFyc19vZl90cmVhdF8wX3NvKSwgbGVuZ3RoIG9mIHRyZWF0bWVudCBpbiBuZXcgc2V0dGluZyAoeWVhcnNfb2ZfdHJlYXRfdF9zbykKIyAtIG91dHB1dHM6IHBlciB5ZWFyIHRyZWF0bWVudCBlZmZlY3QgKGxhbWJkYTFfdDEpIGFuZCB0b3RhbCB0cmVhdG1lbnQgZWZmZWN0CiMgKGxhbWJkYTFfdCkKCmNodW5rX2xhbWJkYXNfdDwtIGZ1bmN0aW9uKCl7CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgICAKCiAgICBsYW1iZGFfdF9mIDwtIGZ1bmN0aW9uKGxhbWJkYTFfdmFyID0gbGFtYmRhMV9pbl9mKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXJzX29mX3RyZWF0XzBfdmFyID0geWVhcnNfb2ZfdHJlYXRfMF9zbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhcnNfb2ZfdHJlYXRfdF92YXIgPSB5ZWFyc19vZl90cmVhdF8wX3NvKXsKICAgICAgICAgIGxhbWJkYTFfdDEgPC0gbGFtYmRhMV92YXIgLyB5ZWFyc19vZl90cmVhdF8wX3ZhcgogICAgICAgICAgaWYgKHllYXJzX29mX3RyZWF0X3RfdmFyPD02KXsKICAgICAgICAgICAgbGFtYmRhMV90IDwtIHllYXJzX29mX3RyZWF0X3RfdmFyICogbGFtYmRhMV90MQogICAgICAgICAgfSBlbHNlIGlmICAoeWVhcnNfb2ZfdHJlYXRfdF92YXI+NikgewogICAgICAgICAgICBsYW1iZGExX3QgPC0gNiAqIGxhbWJkYTFfdDEKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybigKICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAibGFtYmRhMV90MSIgPSBsYW1iZGExX3QxLAogICAgICAgICAgICAgICJsYW1iZGExX3QiID0gbGFtYmRhMV90KQogICAgICAgICAgICApCiAgICB9ICAKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCiAgICByZXR1cm4oIGxpc3QoImxhbWJkYV90X2YiID0gbGFtYmRhX3RfZikgKQp9CmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfbGFtYmRhc190KCksLkdsb2JhbEVudikgKQoKIyMjIyMgRXhlY3V0ZSB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGVuIG5lZWRlZCBmb3IgdGhlIHRleHQ6CgojICMgZWFybmluZ3NfYXBwMV9mCiMgIOKUnOKUgOKUgOKUgOKUgCBkZWx0YV9lZF9maW5hbF9mCiMgIOKUnOKUgOKUgOKUgOKUgCBpbnRlcmVzdF9mCiMgIOKUlOKUgOKUgOKUgOKUgCBsYW1iZGFfZWZmX2YKIyAgfCAgICAgIOKUlOKUgOKUgOKUgOKUgCBsYW1iZGFfdF9mCiMgIHwgICAgICAgICAgICDilJTilIDilIDilIDilIAgbGFtYmRhX2luX2YKIyAg4pSc4pSA4pSA4pSA4pSAIHNhdHVyYXRpb25fZgojICDilJTilIDilIDilIDilIAgd2FnZV90X2YKIyAgICAgICAgIOKUlOKUgOKUgOKUgOKUgCB3YWdlXzBfZgoKbGFtYmRhMV90X2luIDwtIGxhbWJkYV9lZmZfZigKICBsYW1iZGExX3ZhciA9IGxhbWJkYV90X2YoCiAgICBsYW1iZGExX3ZhciA9IGxhbWJkYTFfaW5fZigpLAogICAgeWVhcnNfb2ZfdHJlYXRfMF92YXIgPSAgeWVhcnNfb2ZfdHJlYXRfMF9zbywKICAgIHllYXJzX29mX3RyZWF0X3RfdmFyID0gIHllYXJzX29mX3RyZWF0X3Rfc28KICApJGxhbWJkYTFfdCwKICBwcmV2YWxlbmNlXzBfdmFyID0gcHJldmFsZW5jZV8wX3NvLAogIGNvdW50cnlfc2VsX3ZhciA9IGxpc3QoImluZGlhIiwgImtlbnlhIiwgIm5pZ2VyaWEiLCAidmlldG5hbSIpLAogIG90aGVyX3ByZXZsX3JfdmFyID0gTlVMTAopJGxhbWJkYTFfZWZmX2luCgoKYXBwM19lYXJuaW5nc19ub19leHRfaW4gPC0gZWFybmluZ3NfYXBwMV9mKAogIHdhZ2VfdmFyID0gd2FnZV90X2luLAogIGxhbWJkYTFfdmFyID0gbGFtYmRhMV90X2luWzFdLAogIHNhdHVyYXRpb25fdmFyID0gc2F0dXJhdGlvbl9pbiwKICBsYW1iZGEyX3ZhciA9IDAsCiAgY292ZXJhZ2VfdmFyID0gY292ZXJhZ2Vfc28KKQoKYXBwM19lYXJuaW5nc195ZXNfZXh0X2luIDwtIGVhcm5pbmdzX2FwcDFfZigKICB3YWdlX3ZhciA9IHdhZ2VfdF9pbiwKICBsYW1iZGExX3ZhciA9IGxhbWJkYTFfdF9pblsxXSwKICBzYXR1cmF0aW9uX3ZhciA9IHNhdHVyYXRpb25faW4sCiAgbGFtYmRhMl92YXIgPSBsYW1iZGEyX2luWzFdLAogIGNvdmVyYWdlX3ZhciA9IGNvdmVyYWdlX3NvCikKCmFwcDNfcHZfYmVuZWZfbm9fZXh0X2luIDwtIHB2X2JlbmVmX2YoCiAgZWFybmluZ3NfdmFyID0gYXBwM19lYXJuaW5nc19ub19leHRfaW4sCiAgaW50ZXJlc3Rfcl92YXIgPSBpbnRlcmVzdF9pbiwKICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfc28KKQoKYXBwM19wdl9iZW5lZl95ZXNfZXh0X2luIDwtIHB2X2JlbmVmX2YoCiAgZWFybmluZ3NfdmFyID0gYXBwM19lYXJuaW5nc195ZXNfZXh0X2luLAogIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfaW4sCiAgcGVyaW9kc192YXIgPSBwZXJpb2RzX3NvCikKCgpsYW1iZGExX3RfbmV3X2luIDwtIGxhbWJkYV9lZmZfZigKICBsYW1iZGExX3ZhciA9IGxhbWJkYV90X2YoCiAgICBsYW1iZGExX3ZhciA9IGxhbWJkYTFfbmV3X3NvWzFdLAogICAgeWVhcnNfb2ZfdHJlYXRfMF92YXIgPSAgeWVhcnNfb2ZfdHJlYXRfMF9zbywKICAgIHllYXJzX29mX3RyZWF0X3RfdmFyID0gIHllYXJzX29mX3RyZWF0X3Rfc28KICApJGxhbWJkYTFfdCwKICBwcmV2YWxlbmNlXzBfdmFyID0gcHJldmFsZW5jZV8wX3NvLAogIGNvdW50cnlfc2VsX3ZhciA9IGxpc3QoImluZGlhIiwgImtlbnlhIiwgIm5pZ2VyaWEiLCAidmlldG5hbSIpLAogIG90aGVyX3ByZXZsX3JfdmFyID0gTlVMTAopJGxhbWJkYTFfZWZmX2luCgoKZWFybmluZ3Nfbm9fZXh0X25ld19pbjwtIGVhcm5pbmdzX2FwcDJfZih0X3ZhciA9IDA6NTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhMWsxX3ZhciA9IGxhbWJkYTFfdF9uZXdfaW4pCgphcHAzX3B2X2JlbmVmX2FsbF9uZXdfaW4gPC0gcHZfYmVuZWZfZihlYXJuaW5nc192YXIgPSBlYXJuaW5nc19ub19leHRfbmV3X2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfbmV3X2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc19zbykKYGBgCgoKPC9kZXRhaWxzPgoKPCEtLQpOb3cgdGhlIGJlbmVmaXRzIGFyZSBmbGV4aWJsZSB0byB3b3JtIHByZXZhbGVuY2UgYW5kIGxlbmdodCBvZiB0cmVhdG1lbnQuIFRvIGZhY2lsaXRhdGUgY29tcGFyaXNvbiB3aXRoIHRoZSBvdGhlciB0d28gYXBwcm9hY2hlcywgd2UgcHJlc2VudCBoZXJlIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBzYW1lIHByZXZhbGVuY2UgYW5kIGxlbmd0aCBvZiB0cmVhdG1lbnQgYXNzdW1wdGlvbnMgcGFyYW1ldGVycyBhcyBpbiBhcHByb2FjaCAxIGFuZCAyLiBCb3RoIGFwcHJvYWNoZXMgaW1wbGljaXRseSBhc3N1bWUgcHJldmFsZW5jZSByYXRlcyBvZiAxMDAlIGFuZCBkbyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBvcmlnaW5hbCBwb3B1bGF0aW9uIGFuZCB0YXJnZXQgcG9wdWx1YXRpb24uIEJvdGggYXBwcm9hY2hlcyBhbHNvIHNldCB0aGUgbGVuZ3RoIG9mIHRyZWF0bWVudCBhdCBgciB5ZWFyc19vZl90cmVhdF8wX3NvYCB5ZWFycy4KLS0+CgpUbyBjb21wdXRlIHRoZSBiZW5lZml0cyBmb3IgdGhpcyBhcHByb2FjaCwgdGhpcyBwYXBlciB1c2VzIGRhdGEgb24gcHJldmFsZW5jZSBhbmQgbGVuZ3RoIG9mIHRyZWF0bWVudCBmb3IgdGhlIGZvdXIgY291bnRyaWVzIHRoYXQgRXZpZGVuY2UgQWN0aW9uIGhhcyByZWNvcmRzIGZvci4gUmVhZGVycyBpbnRlcmVzdGVkIGluIGFzc2Vzc2luZyB0aGUgZWZmZWN0cyBvZiBkZXdvcm1pbmcgZm9yIGEgc3BlY2lmaWMgdmFsdWUgb2YgcHJldmFsZW5jZSBhbmQgbGVuZ3RoIG9mIHRyZWF0bWVudCBhcmUgcmVmZXJyZWQgdG8gdGhlIFtpbnRlcmFjdGl2ZSBhcHBdKGh0dHBzOi8vZmhvY2VzLnNoaW55YXBwcy5pby9zaGlueV9hcHBfdGVzdC8pICh0YWIgb24ga2V5IGFzc3VtcHRpb25zKSB3aGVyZSB0aGV5IGNhbiBpbnB1dCB0aGUgdmFsdWVzIHRoYXQgYmVzdCByZWZsZWN0IHRoZWlyIHNldHRpbmcuIFRvIGZhY2lsaXRhdGUgY29tcGFyaXNvbiB3aXRoIHRoZSBvdGhlciB0d28gYXBwcm9hY2hlcywgdGhpcyBwYXBlciBwcmVzZW50cyBoZXJlIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBzYW1lIGxlbmd0aCBvZiB0cmVhdG1lbnQgYXNzdW1wdGlvbnMgcGFyYW1ldGVycyBhcyBpbiBhcHByb2FjaCAxIGFuZCAyLiAgCgpVbmRlciBhcHByb2FjaCAzLCBhbmQgdXNpbmcgdGhlIHNhbWUgYXNzdW1wdGlvbnMgYXMgYWJvdmUsIHRoZSBiZW5lZml0cyB3aWxsIGJlOiBgciByb3VuZChhcHAzX3B2X2JlbmVmX25vX2V4dF9pbiwgMilgIGFuZCBgciByb3VuZChhcHAzX3B2X2JlbmVmX3llc19leHRfaW4sIDIpYCB3aGVuIHVzaW5nIGJlbmVmaXRzIG9mIGFwcHJvYWNoIDEgd2l0aG91dCBhbmQgd2l0aCBleHRlcm5hbGl0aWVzLCBhbmQgYHIgcm91bmQoYXBwM19wdl9iZW5lZl9hbGxfbmV3X2luLCAyKWAgd2hlbiB1c2luZyB0aGUgYmVuZWZpdCBzdHJ1Y3R1cmUgb2YgYXBwcm9hY2ggMi4gIAoKIyMjIENvc3RzCgpFdmlkZW5jZSBBY3Rpb24ncyBEZXdvcm0gdGhlIFdvcmxkIEluaXRpYXRpdmUgcHJvdmlkZXMgdGVjaG5pY2FsIGFzc2lzdGFuY2UgdG8gZ292ZXJubWVudHMgdG8gaW1wbGVtZW50IHNjaG9vbC1iYXNlZCBkZXdvcm1pbmcgcHJvZ3JhbXMuIERld29ybSB0aGUgV29ybGQgd29ya3MgY2xvc2VseSB3aXRoIHBvbGljeW1ha2VycyBhbmQgZ292ZXJubWVudCBzdGFmZiB3aG8gYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGUgaW1wbGVtZW50YXRpb24gb2YgZGV3b3JtaW5nIHByb2dyYW1zIHdpdGhpbiB0aGVpciBnZW9ncmFwaGllcyB0byBwbGFuLCBzY2FsZSwgYW5kIHN1c3RhaW4gc2Nob29sLWJhc2VkIGRld29ybWluZyBwcm9ncmFtcyB0YXJnZXRpbmcgYXQtcmlzayBjaGlsZHJlbi4gRGV3b3JtIHRoZSBXb3JsZCB3b3JrcyB0byBnYWluIGFuZCBtYWludGFpbiBjcml0aWNhbCBzdXBwb3J0IGFtb25nc3QgdGhlc2Uga2V5IHN0YWtlaG9sZGVycywgdGh1cyBoYXZpbmcgaW1wb3J0YW50IGluZmx1ZW5jZSBvdmVyIGhvdyBwb2xpY3ltYWtlcnMgdGFrZS1pbiBhbmQgdXNlIGV2aWRlbmNlIGZvciBkZWNpc2lvbiBtYWtpbmcuIFRocm91Z2ggRXZpZGVuY2UgQWN0aW9uJ3MgdGVjaG5pY2FsIGFzc2lzdGFuY2UsIHdoaWNoIHR5cGljYWxseSBpbmNsdWRlcyBmaW5hbmNpYWwgc3VwcG9ydCBmb3IgcHJvZ3JhbSBpbXBsZW1lbnRhdGlvbiwgdGhleSBoYXZlIGFjY2VzcyB0byBjb3VudHJ5LWxldmVsIGdvdmVybm1lbnQgY29zdCBkYXRhIG9uIHdoYXQgaXQgdGFrZXMgdG8gaW1wbGVtZW50IGFuZCBldmFsdWF0ZSBzY2hvb2wtYmFzZWQgZGV3b3JtaW5nIHByb2dyYW1zIGFjcm9zcyBkaWZmZXJlbnQgY29udGV4dHMuIFRvIGVzdGltYXRlIHRoZSBjb3N0cyBpbiB0aGlzIGFuYWx5c2lzLCB3ZSB1c2UgY29zdHMgb2YgZGV3b3JtaW5nIHByb3ZpZGVkIGJ5IEV2aWRlbmNlIEFjdGlvbiAoZGV0YWlsZWQgYmVsb3cpIGFuZCBmb2xsb3cgYSBzaW1pbGFyIGFwcHJvYWNoIHRvIEBnaXZld2VsbCwgd2hpY2ggdGFrZXMgdGhvc2UgY29zdHMgYW5kIGluY2x1ZGVzIGFuIGFkZGl0aW9uYWwgZXN0aW1hdGUgYXJvdW5kIHRoZSBhbW91bnQgb2YgZ292ZXJubWVudCBzdGFmZiB0aW1lIHJlcXVpcmVkIHRvIHJ1biBkZXdvcm1pbmcgcHJvZ3JhbXMuIFRoZSBkZWZhdWx0IGNvc3QgaXMgdGhlIHBlciB1bml0IGNvc3QgcGVyIHRyZWF0bWVudCByb3VuZCBwZXIgY2hpbGQgYWNyb3NzIGFsbCBjb3VudHJpZXMuIFRoaXMgaXMgb2J0YWluZWQgYXMgdGhlIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgcGVyIHVuaXQgY29zdHMgKCRjX3tpfSQpIGluIGFsbCBjb3VudHJpZXMgd2hlcmUgRXZpZGVuY2UgQWN0aW9uIGN1cnJlbnRseSBoYXMgZGF0YSBvbiBpbXBsZW1lbnRhdGlvbiBvZiBkZXdvcm1pbmcgaW50ZXJ2ZW50aW9ucyBbXjEwXS4KClteMTBdOiBJbiBzb21lIHNldHRpbmdzIEV2aWRlbmNlIEFjdGlvbiBwcm92aWRlcyB0d28gcm91bmRzIG9mIHRyZWF0bWVudCBwZXIgeWVhci4gSW4gdGhvc2UgY2FzZXMsIHRoZSB1bml0IGNvc3RzIGRpc2N1c3NlZCBoZXJlIHJlcHJlc2VudCB0aGUgc3VtIG9mIGJvdGggcm91bmRzIFtDT05GSVJNIFdJVEggR1JBQ0VdCgpDb3N0cyBwZXIgY291bnRyeSBpbmNsdWRlIEV2aWRlbmNlIEFjdGlvbidzIHRlY2huaWNhbCBhc3Npc3RhbmNlIGNvc3RzLCBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlIChpbmNsdWRpbmcgZXN0aW1hdGVzIG9mIGdvdmVybm1lbnQgc3RhZmYgdGltZSksIGFuZCBhbnkgb3RoZXIgcGFydG5lciBjb3N0cyBzdWNoIGFzIHRoZSBjb3N0IG9mIGRydWdzIGRvbmF0ZWQgYnkgV0hPLiBUaGVzZSBpdGVtcyBpbmNsdWRlOiBkcnVnIHByb2N1cmVtZW50IGFuZCBtYW5hZ2VtZW50LCBtb25pdG9yaW5nIGFuZCBldmFsdWF0aW9uLCBwb2xpY3kgYW5kIGFkdm9jYWN5LCBwcmV2YWxlbmNlIHN1cnZleXMsIHByb2dyYW0gbWFuYWdlbWVudCwgcHVibGljIG1vYmlsaXphdGlvbi9jb21tdW5pdHkgc2Vuc2l0aXphdGlvbiwgYW5kIHRyYWluaW5nIGFuZCBkaXN0cmlidXRpb24uIENvc3RzIGNhbiB2YXJ5IGJ5IGdlb2dyYXBoeSBkdWUgdG8gZmFjdG9ycyBvZiBwb3B1bGF0aW9uIHNpemUsIHRyZWF0bWVudCBzdHJhdGVnaWVzLCBhZ2Ugb2YgdGhlIHByb2dyYW0sIGFuZCBjb3N0cyBvZiAiZG9pbmcgYnVzaW5lc3MuIgoKVGhlIGNvdW50cnkgd2VpZ2h0cyBhcmUgY29tcHV0ZWQgYXMgdGhlIGZyYWN0aW9uIG9mIGFsbCB0cmVhdGVkIGluZGl2aWR1YWxzIHRoYXQgY29ycmVzcG9uZCB0byBhIGdpdmVuIGNvdW50cnkuIFRoZSBwZXIgY2FwaXRhIGNvc3Qgb2YgZWFjaCBjb3VudHJ5IGlzIG9idGFpbmVkIGJ5IGRpdmlkaW5nIHRoZSBjb3VudHJ5J3MgdG90YWwgY29zdHMgYnkgdGhlIHRvdGFsIG51bWJlciBvZiB0cmVhdGVkIGluZGl2aWR1YWxzIGluIGEgZ2l2ZW4gcGVyaW9kLiBUb3RhbCBjb3N0cyBmb3IgYSBjb3VudHJ5IHJlcHJlc2VudCB0aGUgdG90YWwgY29zdCBhY3Jvc3MgY291bnRyeSByZWdpb25zIGZhY2VkIGJ5IHRocmVlIGRpZmZlcmVudCBwYXllcnM6IEV2aWRlbmNlIEFjdGlvbiwgY291bnRyeSBnb3Zlcm5tZW50cywgYW5kIG90aGVyIHBhcnRuZXJzLiAgCgoKPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBhbGwgdGhlIGRldGFpbHM8L3N1bW1hcnk+CgpcYmVnaW57ZXF1YXRpb259CkMgPSBcc3VtX3tpIFxpbiBDb3VudHJpZXMgfSBcb21lZ2Ffe2l9IGNfe2l9CmByIGVxdWF0aW9uSW5kZXggPC0gZXF1YXRpb25JbmRleCArIDFgClxsYWJlbHtlcTpgciBlcXVhdGlvbkluZGV4YH0KXHRhZ3tgciBlcXVhdGlvbkluZGV4YH0KXGVuZHtlcXVhdGlvbn0KClxiZWdpbntlcXVhdGlvbn0KXG9tZWdhX3tpfSA9IFxmcmFje05fe2l9fXtcc3VtX3tqfU5fe2p9fSBcXApjX3tpfSA9IFxmcmFje0Nfe2l9fXtOX3tpfX0gXFwKYHIgZXF1YXRpb25JbmRleCA8LSBlcXVhdGlvbkluZGV4ICsgMWAKXGxhYmVse2VxOmByIGVxdWF0aW9uSW5kZXhgfQpcdGFne2ByIGVxdWF0aW9uSW5kZXhgfQpcZW5ke2VxdWF0aW9ufQoKXGJlZ2lue2VxdWF0aW9ufQpDX3tpfSA9ICgxICsgXGRlbHRhX3tnfSlcc3VtX3trIFxpbiBwYXllcnN9Q197aSxrfSBcXApDX3tpLGt9ID0gXHN1bV97bCBcaW4gaXRlbXN9XHN1bV97bSBcaW4gcmVnaW9uc31DX3tpLGssbCxtfQpcZW5ke2VxdWF0aW9ufQoKV2hlcmU6ICAKCi0gJEMkOiB3ZWlnaHRlZCBhdmVyYWdlIG9mIHBlciB1bml0IGNvc3RzIGluIGFsbCBjb3VudHJpZXMgIAotICRjX2kkOiBwZXIgdW5pdCBjb3N0cyBpbiBkaWZmZXJlbnQgY291bnRyaWVzICAKLSAkXG9tZWdhX2kkOiBjb3VudHJ5IHdlaWdodHMgZm9yIGNvbXB1dGluZyB0aGUgY29zdHMgICAKLSAkTiQ6IHRoZSBudW1iZXIgb2YgYWxsIHRyZWF0ZWQgaW5kaXZpZHVhbHMgICAKLSAkQ197aSxrfSQ6IGNvc3RzIG9mIGEgY291bnRyeSBhdCBhIHNwZWNpZmljIHBheWVyIGxldmVsICAKLSAkXGRlbHRhX2ckOiBhZGRpdGlvbmFsIGdvdmVybm1lbnQgc3RhZmYgdGltZSByZXF1aXJlZCB0byBpbXBsZW1lbnQgYSB0eXBpY2FsIGRld29ybWluZyBpbnRlcnZlbnRpb24KCmBgYHtyIGVxXzMsIGVjaG89cHJpbnRfY29kZSwgZXZhbD1UUlVFfSAgCiMgLSBpbnB1dHM6IGNvc3QgZGF0YSBieSBwYXllciB0eXBlIGF0IHRoZSBjb250cnkvcHJvdmluY2UgbGV2ZWwgYnkgeWVhciAoZGZfY29zdHNfc28pCiMgIGNyb3Nzd2FsayBiZXR3ZWVuIGNvdW50cnkvc3RhdGUgYW5kIHJlZ2lvbiAoZGZfY29zdHNfY3dfc28pLCB0cmVhdG1lbnQgY291bnRzCiMgIGJ5IGNvdW50cnkvcHJvdmluY2UgYW5kIHllYXIgKGRmX2NvdW50c19zbyk7IHN0YWZmIHRpbWUgYWRqdXNtZW50IGZhY3RvcgojICAoc3RhZmZfdGltZV9zbyksCiMgLSBvdXRwdXRzOiBjb3VudHJ5IGxldmVsIGNvc3QgYW5kIHBvcHVsYXRpb24gZGF0YSAoY29zdHMxX3AxX2YpIGFuZCBjb3VudHJ5CiMgIHdlaWdodHMgYW5kIHBlciBjYXBpdGEgY29zdHMgKGNvc3RzMV9wMl9mKQojCmNodW5rX2Nvc3QxX2lucCA8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAogICMgY2xlYW4gYW5kIGFnZ3JlYWdhdGUgZGF0YSBhdCBjb3VudHJ5IGxldmVsCiAgY29zdHMxX3AxX2YgPC0gZnVuY3Rpb24oCiAgICBkZl9jb3N0c192YXIgPSBkZl9jb3N0c19zbywKICAgIGRmX2Nvc3RzX2N3X3ZhciA9IGRmX2Nvc3RzX2N3X3NvLAogICAgZGZfY291bnRzX3ZhciA9IGRmX2NvdW50c19zbykgewogICAgIyMgQ291bnRzCiAgICAjIERhdGEgY2xlYW5uaW5nOgogICAgIyBBZGQgY291bnRyeSB2YXJpYWJsZQogICAgIyBhbm95aW5nIG1lc3NhZ2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzYyMTQwNDgzL2hvdy10by1pbnRlcnByZXQtZHBseXItbWVzc2FnZS1zdW1tYXJpc2UtcmVncm91cGluZy1vdXRwdXQtYnkteC1vdmVycmlkZQoKICAgIGRmX2NvdW50c190ZW1wIDwtIGRmX2Nvc3RzX2N3X3ZhciAlPiUKICAgICAgcmlnaHRfam9pbihkZl9jb3VudHNfdmFyLCBieSA9ICJDb3VudHJ5L1N0YXRlIikgJT4lCiAgICAgIG11dGF0ZShDb3VudHJ5ID0gdG9sb3dlcihDb3VudHJ5KSkKICAgICMga2VlcCBvbmx5IGxhc3QgeWVhciBvbiByZWNvcmQKICAgIHN1cHByZXNzTWVzc2FnZXMoICAgICAgICAgICAgCiAgICAgICAgZGZfY291bnRzX2xhc3QgPC0gZGZfY291bnRzX3RlbXAgJT4lCiAgICAgICAgICBncm91cF9ieShDb3VudHJ5KSAlPiUKICAgICAgICAgIHN1bW1hcmlzZSgibGFzdF95ZWFyIiA9IG1heChZZWFyKSkgJT4lCiAgICAgICAgICByaWdodF9qb2luKGRmX2NvdW50c190ZW1wLCBieSA9ICJDb3VudHJ5IikgJT4lCiAgICAgICAgICBmaWx0ZXIoWWVhciA9PSBsYXN0X3llYXIpICAgICAgICAgIAogICAgKQogICAgIyBjb21wdXRlIGNvdW50cyBhcyB0aGUgc3VtIHdpdGgtaW4gY291bnRyeS15ZWFyIG9mIHRyZWF0bWVudHMKICAgIHN1cHByZXNzTWVzc2FnZXMoICAgICAgICAgICAgCiAgICAgICAgY19jb3VudHMgPC0gZGZfY291bnRzX2xhc3QgJT4lCiAgICAgICAgICBncm91cF9ieShDb3VudHJ5LCBZZWFyKSAlPiUKICAgICAgICAgIHN1bW1hcmlzZSgidG90YWwiID0gc3VtKGAjIGRld29ybWVkYCkpCiAgICApCgogICAgIyMgQ29zdHMKICAgICMgRGF0YSBjbGVhbmluZzoKICAgICMgQWRkIGNvdW50cnkgdmFyaWFibGUKICAgIGRmX2Nvc3RzX3RlbXAgPC0gZGZfY29zdHNfY3dfdmFyICU+JQogICAgICByaWdodF9qb2luKGRmX2Nvc3RzX3ZhciwgYnkgPSAiQ291bnRyeS9TdGF0ZSIpICU+JQogICAgICBzZWxlY3QoLUNvdW50cnkueSkgJT4lIHJlbmFtZShDb3VudHJ5ID0gQ291bnRyeS54KSAlPiUKICAgICAgbXV0YXRlKENvdW50cnkgPSB0b2xvd2VyKENvdW50cnkpKQogICAgIyB2YWx1ZXMgZm9yIGxhc3QgeWVhciB3aXRoIGNvc3QgaW5mb3JtYXRpb24KICAgIHN1cHByZXNzTWVzc2FnZXMoICAgICAgICAgICAgCiAgICBkZl9jb3N0c19sYXN0IDwtIGRmX2Nvc3RzX3RlbXAgJT4lCiAgICAgIGdyb3VwX2J5KENvdW50cnkpICU+JQogICAgICBzdW1tYXJpc2UoImxhc3RfeWVhciIgPSBtYXgoWWVhcikpICU+JQogICAgICByaWdodF9qb2luKGRmX2Nvc3RzX3RlbXAsIGJ5ID0gIkNvdW50cnkiKSAlPiUKICAgICAgZmlsdGVyKFllYXIgPT0gbGFzdF95ZWFyKSAgICAKICAgICAgKSAgICAgIAogICAgICMgc3VtbWluZyBhY3Jvc3MgcGF5ZXJzIGFuZCByZWdpb25zIChsYXN0IGVxdWF0aW9uKQogICAgc3VwcHJlc3NNZXNzYWdlcyggICAgICAgICAgICAKICAgIGNvc3RzX2J5X3BheWVyIDwtIGRmX2Nvc3RzX2xhc3QgJT4lCiAgICAgIGZpbHRlcihQYXllciAhPSAiVG90YWwiKSAlPiUKICAgICAgZ3JvdXBfYnkoQ291bnRyeSwgUGF5ZXIpICU+JQogICAgICBzdW1tYXJpc2UoImNvc3RzX2J5X3BheWVyIiA9CiAgICAgICAgICAgICAgICAgIHN1bShzdXBwcmVzc1dhcm5pbmdzKCBhcy5udW1lcmljKENvc3QpICksIG5hLnJtID0gVFJVRSkpCiAgICApICAgIAogICAgI3N1bSBhY3Jvc3MgcGF5ZXJzCiAgICBzdXBwcmVzc01lc3NhZ2VzKCAgICAgICAgICAgIAogICAgY291bnRyeV9jb3N0IDwtIGNvc3RzX2J5X3BheWVyICU+JQogICAgICBncm91cF9ieShDb3VudHJ5KSAlPiUKICAgICAgc3VtbWFyaXNlKCJjb3N0c19ieV9jb3VudHJ5IiA9CiAgICAgICAgICAgICAgICAgIHN1bShjb3N0c19ieV9wYXllcikgKSAgCiAgICAjIENvbXB1dGUgdGhlIHBlciBjYXBpdGEgY29zdCBmb3IgZWFjaCBjb3VudHJ5IChjX2kgYW5kIHdfaSkKICAgICkKICAgIGNvc3RzX2RhdGFfaW4gPC0gY291bnRyeV9jb3N0ICU+JQogICAgICAgbGVmdF9qb2luKGNfY291bnRzLCBieSA9ICJDb3VudHJ5IikKCiAgICByZXR1cm4oIGNvc3RzX2RhdGFfaW4gKQogIH0KCiAgIyBDb21wdXRlIHdlaWdodHMgYW5kIHBlciBjYXB0YSBjb3N0cwogIGNvc3RzMV9wMl9mIDwtIGZ1bmN0aW9uKGNvdW50cnlfdG90YWxfdmFyID0gY29zdHNfZGF0YV9pbiR0b3RhbCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlfY29zdF92YXIgPSBjb3N0c19kYXRhX2luJGNvc3RzX2J5X2NvdW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFmZl90aW1lX3ZhciA9IHN0YWZmX3RpbWVfc28sCiAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5X25hbWVfdmFyID0gY29zdHNfZGF0YV9pbiRDb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0X3ZhciA9IGxpc3QoImluZGlhIiwgImtlbnlhIiwgIm5pZ2VyaWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXRuYW0iKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2Nvc3RzX3ZhciA9IE5VTEwpIHsKICAgICAgIyBzZWxlY3QgY291bnRyaWVzCiAgICAgIGNvdW50cnlfdG90YWxfdmFyX3RlbXAgPC0gY291bnRyeV90b3RhbF92YXJbY291bnRyeV9uYW1lX3ZhciAlaW4lIHNlbGVjdF92YXJdCiAgICAgIGNvdW50cnlfY29zdF92YXJfdGVtcCA8LSBjb3VudHJ5X2Nvc3RfdmFyW2NvdW50cnlfbmFtZV92YXIgJWluJSBzZWxlY3RfdmFyXQogICAgICAjIGNyZWF0ZSBjb3VudHJ5IHdlaWdodAogICAgICBjX3dlaWdodHMgPC0gY291bnRyeV90b3RhbF92YXJfdGVtcCAvIHN1bShjb3VudHJ5X3RvdGFsX3Zhcl90ZW1wKQogICAgICAjIGNyZWF0ZSBjb3VudHJ5IHBlciBjYXBpdGEgY29zdHMsIGFkanVzdGVkIGJ5IHN0YWZmIHRpbWUKICAgICAgcGVyX2NhcCA8LSBjb3VudHJ5X2Nvc3RfdmFyX3RlbXAgKiAoMSArIHN0YWZmX3RpbWVfdmFyKSAvCiAgICAgICAgY291bnRyeV90b3RhbF92YXJfdGVtcAogICAgICAjIHJlcGxhY2UgY29udHJ5IGNvc3RzIHdpdGggbmV3IG9uZSBpZiB0aGVyZSBpcyBhIG5ldyBjb3VudHJ5CiAgICAgICMgKG9ubHkgY291bnQgdGhhdCBuZXcgY291bnRyeSkKICAgICAgIyAodGhlIHdlaWdodGhlZCBzdW0gb2YgdGhpcyBzY2FsYXIgd2lsbCBqdXN0IGJlIHRoZSBzYW1lIG51bWJlcikKICAgICAgaWYgKCFpcy5udWxsKG90aGVyX2Nvc3RzX3ZhcikpIHsKICAgICAgIyBpZiAoRkFMU0UpIHsgIAogICAgICAgIHBlcl9jYXAgPC0gb3RoZXJfY29zdHNfdmFyICogKDEgKyBzdGFmZl90aW1lX3ZhcikKICAgICAgfQogICAgICByZXR1cm4oIHN1bShjX3dlaWdodHMgKiBwZXJfY2FwKSApCiAgICB9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCiAgICByZXR1cm4oIGxpc3QoImNvc3RzMV9wMV9mIiA9IGNvc3RzMV9wMV9mLAogICAgICAgICAgICAgICAgICJjb3N0czFfcDJfZiIgPSBjb3N0czFfcDJfZikgKQp9CmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfY29zdDFfaW5wKCksLkdsb2JhbEVudikgKQoKIyMjIyMgRXhlY3V0ZSB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGVuIG5lZWRlZCBmb3IgdGhlIHRleHQ6CmNvc3RzX2RhdGFfaW4gPC0gY29zdHMxX3AxX2YoKQpjb3N0czFfcDJfaW4gPC0gY29zdHMxX3AyX2Yoc2VsZWN0X3ZhciA9IGxpc3QoImluZGlhIiwgImtlbnlhIiwgIm5pZ2VyaWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXRuYW0iKSkKYGBgCgo8L2RldGFpbHM+CgpUaGUgdW5pdCBjb3N0cyBvZiB0cmVhdG1lbnRzLCBhbHRob3VnaCBzbWFsbCwgdmFyeSBzdWJzdGFudGlhbGx5IGFjcm9zcyByZWdpb25zLiBXaGVuIGluY2x1ZGluZyBjb3N0IGluZm9ybWF0aW9uIGZvciBhbGwgdGhlIGNvdW50cmllcyB3aGVyZSBFdmlkZW5jZSBhY3Rpb24gaGFzIGRhdGEgKEluZGlhLCBLZW55YSwgTmlnZXJpYSwgVmlldG5hbSkgdGhlIHVuaXQgY29zdHMgaXMgYHIgcGFzdGUwKCIkIiwgcm91bmQoY29zdHMxX3AyX2luLCAyKSlgIHBlciByb3VuZCBvZiB0cmVhdG1lbnQgW0NPTkZJUk0gV0lUSCBHUkFDRSwgSEFSTU9OSVpFIFdJVEggRk9PVE5PVEVdLiBUaGlzIGZpbmFsIGNvc3QgaXMgcHJpbWFyaWx5IGRyaXZlbiBieSB0aGUgY29zdCwgYW5kIGxhcmdlIHBvcHVsYXRpb24sIG9mIEluZGlhLCB3aXRoIGEgdW5pdCBjb3N0IG9mIGByIHBhc3RlMCgiJCIsIHJvdW5kKGNvc3RzMV9wMl9mKHNlbGVjdF92YXIgPSBsaXN0KCJpbmRpYSIpKSwgMiApKWAsIHRoZSBvdGhlciAzIHJlbWFpbmluZyBjb3VudHJpZXMgaGF2ZSByZWxhdGl2ZWx5IGxhcmdlciB1bml0IGNvc3RzOiBgciBwYXN0ZTAoIiQiLCByb3VuZChjb3N0czFfcDJfZihzZWxlY3RfdmFyID0gbGlzdCgia2VueWEiKSksIDIgKSlgLCBgciBwYXN0ZTAoIiQiLCByb3VuZChjb3N0czFfcDJfZihzZWxlY3RfdmFyID0gbGlzdCgibmlnZXJpYSIpKSwgMiApKWAsIGByIHBhc3RlMCgiJCIsIHJvdW5kKGNvc3RzMV9wMl9mKHNlbGVjdF92YXIgPSBsaXN0KCJ2aWV0bmFtIikpLCAyICkpYCBmb3IgS2VueWEsIE5pZ2VyaWEgYW5kIFZpZXRuYW0gcmVzcGVjdGl2ZWx5LgoKCmBgYHtyIHN1bS10YWJsZTE4LCBwdXJsPUZBTFNFLCBlY2hvPUZBTFNFLCBldmFsPXNob3dfc3VtbWFyeV90YWJsZXN9CnRhYmxlXzFbMSwzXSA8LSBwYXN0ZTAoIiRcXGRlbHRhX3tnfT0iLCBzdGFmZl90aW1lX3NvLCAiJCIpCnRhYmxlXzFbMTAsMV0gPC0gcGFzdGUwKCIkXFxvdmVybGluZXt7Q31fe2l9fT0iLCByb3VuZChjb3N0czFfcDJfZihjb3VudHJ5X3RvdGFsX3ZhciA9IGNvc3RzX2RhdGFfaW4kdG90YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5X2Nvc3RfdmFyID0gY29zdHNfZGF0YV9pbiRjb3N0c19ieV9jb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhZmZfdGltZV92YXIgPSBzdGFmZl90aW1lX3NvKSwgMiksICIkIikgI3dlaWdodGVkIGF2ZXJhZ2UKdGFibGVfMVsxMSwxXSA8LSBwYXN0ZTAoIiRcXG92ZXJsaW5le3tOfV97aX19PSIsIHJvdW5kKG1lYW4oY29zdHNfZGF0YV9pbiR0b3RhbCkpLCAiJCIpCgp0YWJsZV8xIDwtIHJiaW5kKHRhYmxlXzEsCiAgICAgICAgICAgICAgICAgYygiIiwgcGFzdGUwKCIkXFxldGE9IiwgcHJldmFsZW5jZV8wX3NvLCAiJCIpLCAiIiksICNjaGFuZ2UgdG8gZXRhCiAgICAgICAgICAgICAgICAgYygiIiwgcGFzdGUwKCIkXFxldGFfe3J9PSIsIHByZXZhbGVuY2Vfcl9zbywgIiQiKSwgIiIpKQoKc3VtX3RhYmxlX2luZGV4IDwtIHN1bV90YWJsZV9pbmRleCsxCnRhYmxlXzIgPC0gcmJpbmQodGFibGVfMiwKICAgICAgICAgICAgICAgICBjKCIkQyA9IFxcc3VtX3tpIFxcaW4gQ291bnRyaWVzIH0gXFxvbWVnYV97aX0gY197aX0kIiwKICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiJCgiLCBzdW1fdGFibGVfaW5kZXgsICIpJCIpICkKICAgICkKc3VtX3RhYmxlX2luZGV4IDwtIHN1bV90YWJsZV9pbmRleCsxCnRhYmxlXzIgPC0gcmJpbmQodGFibGVfMiwKICAgICAgICAgICAgICAgICBjKCIkXFxvbWVnYV97aX0gPSBcXGZyYWN7Tl97aX19e1xcc3VtX3tqfU5fe2p9fSBcXApjX3tpfSA9IFxmcmFje0Nfe2l9fXtOX3tpfX0gXFwKQ197aX0gPSAoMSArIFxcZGVsdGFfe2d9KVxcc3VtX3trIFxcaW4gcGF5ZXJzfUNfe2ksa30gXFwKQ197aSxrfSA9IFxcc3VtX3tsIFxcaW4gaXRlbXN9XFxzdW1fe20gXFxpbiByZWdpb25zfUNfe2ksayxsLG19JCIsCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIiQoIiwgc3VtX3RhYmxlX2luZGV4LCAiKSQiKSApCiAgICApCgpzdW1fdGFibGVfaW5kZXggPC0gc3VtX3RhYmxlX2luZGV4KzEKdGFibGVfMiA8LSByYmluZCh0YWJsZV8yLAogICAgICAgICAgICAgICAgIGMoIiRcXGxhbWJkYV97MX0gPSBcXGFscGhhIFxcbGFtYmRhXntlZmZ9X3sxfSArICgxIC0gIFxcYWxwaGEpIFxcdGltZXMgMCQiLAogICAgICAgICAgICAgICAgICAgcGFzdGUwKCIkKCIsIHN1bV90YWJsZV9pbmRleCwgIikkIikgKQogICAgKQoKa25pdHI6OmthYmxlKHRhYmxlXzIsIGNvbC5uYW1lcyA9IGMoIkVxdWF0aW9uIiwgIiMiKSwgY2FwdGlvbiA9ICJTdW1tYXJ5IG9mIGVxdWF0aW9ucyB1c2VkIHVudGlsIHRoaXMgcG9pbnQgaW4gdGhlIGRvY3VtZW50IikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpCgprbml0cjo6a2FibGUodGFibGVfMSwgY29sLm5hbWVzID0gYygiRGF0YSIsICJSZXNlYXJjaCIsICJHdWVzc3dvcmsiKSwgY2FwdGlvbiA9ICJTb3VyY2VzOiBzdW1tYXJ5IG9mIGlucHV0cyBzcGVjaWZpZWQgdW50aWwgdGhpcyBwb2ludCBpbiB0aGUgZG9jdW1lbnQiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSkKYGBgCgoKIyMgQWNjb3VudGluZyBmb3IgVW5jZXJ0YWludHkKClRoaXMgb3BlbiBwb2xpY3kgYW5hbHlzaXMgaGFzIGFpbWVkIHRvIG1ha2UgYWxsIHRoZSBhbmFseXNpcyBwcmVzZW50ZWQgc28gZmFyIGhpZ2hseSByZXByb2R1Y2libGUuIE9uZSBkaXJlY3QgcmVzdWx0IG9mIHRoaXMgbm92ZWwgYXBwcm9hY2ggaXMgdGhhdCBub3cgaXQgaXMgcG9zc2libGUgdG8gdGhvcm91Z2hseSBhc3Nlc3MgaG93IHRoZSBmaW5hbCBwb2xpY3kgZXN0aW1hdGVzIGNoYW5nZSB3aGVuIGFueSBvZiB0aGUgdW5kZXJseWluZyBzb3VyY2VzIG9mIHRoZSBhbmFseXNpcyBjaGFuZ2VzLiBJbiB0aGlzIE9QQSB3ZSBoYXZlIGlkZW50aWZpZWQgZWFjaCBzb3VyY2UgdXNlZCBpbiB0aGUgYW5hbHlzaXMgYmVoaW5kIGJlbmVmaXRzIGFuZCBjb3N0cyBvZiBEZXdvcm1pbmcgaW50ZXJ2ZW50aW9ucy4gRWFjaCBvZiB0aGVzZSBzb3VyY2VzIGluIHR1cm4gaXMgbWVhc3VyZWQgd2l0aCBzb21lIHVuY2VydGFpbnR5IChlaXRoZXIgaW4gcHJlZGljdGlvbiBvZiBmdXR1cmUgdmFsdWVzIG9yIGVzdGltYXRpb24gb2YgcGFzdCBvbmVzKS4gVHJhZGl0aW9uYWwgcG9saWN5IGFuYWx5c2lzIGFzc3VtZXMgdGhhdCBlYWNoIG9mIHRoZXNlIHNvdXJjZXMgaGFzIG5vIHVuY2VydGFpbnR5LCBhbmQgaW4gc29tZSBjYXNlcyBpbmNvcnBvcmF0ZXMgdW5jZXJ0YWludHkgb3IgcGVyZm9ybWVkIHNlbnNpdGl2aXR5IGFuYWx5c2lzIGZvciBhIGZldyBwYXJhbWV0ZXJzIG9mIGludGVyZXN0LiBCeSBmb2xsb3dpbmcgdGhlIG9wZW4gcG9saWN5IGFuYWx5c2lzIHByaW5jaXBsZXMgd2Ugbm93IGNhbiBhbGxvdyBmb3IgZWFjaCBzb3VyY2UgdG8gdmFyeSBhbmQgZXhwbG9yZSB0aGUgb3ZlcmFsbCB1bmNlcnRhaW50eSBvZiB0aGUgZmluYWwgcG9saWN5IGVzdGltYXRlLgoKT3VyIGFwcHJvYWNoIGNvbnNpc3RzIGluIGFzc3VtaW5nIHRoYXQgZWFjaCBzb3VyY2UgdXNlZCBpbiB0aGUgYW5hbHlzaXMgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgcmFuZG9tIGRyYXcgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24uIFRoZSBtZWFuIGNvcnJlc3BvbmRzIHRvIHRoZSBtZWFzdXJlZCB2YWx1ZS4gVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBjb3JyZXNwb25kcyB0byB0aGUgZXN0aW1hdGVkIHN0YW5kYXJkIGVycm9yIHdoZW4gYXZhaWxhYmxlLCBhbmQgdG8gYSBmcmFjdGlvbiBvZiB0aGUgbWVhbiB3aGVuIG5vdCBhdmFpbGFibGUuIEFzIGEgZGVmYXVsdCBhbmFseXNpcyB3ZSBzdWdnZXN0IHRvIHNldCBpdCB0aGVzZSBzdGFuZGFyZCBkZXZpYXRpb25zIHRvIDEwJSBvZiB0aGUgbWVhbi4gVGhpcyBjaG9pY2UgaXMgYXJiaXRyYXJ5LCBidXQgdW5saWtlIHRoZSBkZWZhdWx0IGFyYml0cmFyeSBjaG9pY2Ugb2Ygc2V0dGluZyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9ucyB0byB6ZXJvLCBpdCBtYWtlcyBleHBsaWNpdCB0aGUgdW5jZXJ0YWludHkgYW5kIGl0IGNhbiBiZSBtb2RpZmllZCBpbiB0aGUgYXBwLgoKCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5PgoKTGV0ICR4JCBkZW5vdGUgZWFjaCBzb3VyY2UgdXNlZCBpbiB0aGlzIGFuYWx5c2lzLiAgCgpcYmVnaW57ZXF1YXRpb259CnggXHNpbSBOKFxoYXR7eH0sIFxzaWdtYV97eH0pCmByIGVxdWF0aW9uSW5kZXggPC0gZXF1YXRpb25JbmRleCArIDFgClxsYWJlbHtlcTpgciBlcXVhdGlvbkluZGV4YH0KXHRhZ3tgciBlcXVhdGlvbkluZGV4YH0KXFwKXHNpZ21hX3t4fSA9ClxiZWdpbntjYXNlc30KXGhhdHtcc2lnbWFfe3h9fSBccXVhZCBcdGV4dHtJZiAkXGhhdHtcc2lnbWFfe3h9fSQgaXMgYXZhaWxhYmxlfVxcClxcClxkZWx0YV97dX1caGF0e3h9IFxxdWFkIFx0ZXh0e290aGVyd2lzZX0KXGVuZHtjYXNlc30KXGVuZHtlcXVhdGlvbn0KCkFzIGEgZGVmYXVsdCAkXGRlbHRhX3t1fSA9IDAuMSQKCmBgYHtyIG1jLXNldHVwLCBldmFsPVRSVUUsIGVjaG8gPSBwcmludF9jb2RlfSAgCiMgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBpbnB1dHMgbWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMgb2Ygc291cmNlCiMgcGFyYW1ldGVycyBhbmQgc2ltdWFsdGUgZHJhd3Mgb2YgZWFjaCBzb3VyY2UuIFdoZW4gdGhlIHNvdXJjZSBpcyBhIHNjYWxhciwKIyBpdCBnZW5lcmF0ZXMgYSBkcmF3IGZyb20gYSBub3JvbWFsIGRpc3QgKG1lYW4sIHNkKS4gV2hlbiBpdCBpcyBhICJzbWFsbCIKIyAobGVzcyB0aGFuIDQgZWxlbWVudHMpIHZlY3RvciwgZ2VuZXJhdGVzIGluZGVwZW5kZW50IG11bHRpdmFyaWF0ZSBub3JtYWxzLgoKCiNiZWdpbiBieSBjbGVhbmluZyB1cCB0aGUgY29zdCBkYXRhIG9uY2UKY29zdHNfZGF0YV9pbiA8LSBjb3N0czFfcDFfZihkZl9jb3N0c192YXIgPSBkZl9jb3N0c19zbywKICAgICAgICAgICAgICAgICAgICAgICAgICBkZl9jb3N0c19jd192YXIgPSBkZl9jb3N0c19jd19zbywKICAgICAgICAgICAgICAgICAgICAgICAgICBkZl9jb3VudHNfdmFyID0gZGZfY291bnRzX3NvKQoKCiMgRGF0YTogc291cmNlIGNvbWVzIGZyb20gYSBzdGFuZGFyZCBkYXRhIHNvdXJjZS4gR292ZXJubWVudCBzdGF0aXN0aWMgb3Igb3RoZXIKIyBwdWJsaWNseSBhdmFpbGFibGUgc3RhdGlzdGljCiMgUmVzZWFyY2g6IGFueSBzb3VyY2VzIHRoYXQgcmVxdWllcmVzIHNvbWUgdHlwZSBvZiBpbnZlc3RpZ2F0aW9uIHRvIG9idGFpbgojIEd1ZXNzd29yazogbm8gY2xlYXIgc291cmNlIGF2YWlsYWJsZQoKc2ltX2RhdGExX2YgPC0gZnVuY3Rpb24obnNpbXNfdmFyMiA9IDFlMiwgICAgICAgICAgICAgICAgICAgIyAiU2V0dXAiIHZhcnMKICAgICAgICAgICAgICAgICAgICAgIG1haW5fcnVuX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBwZXJpb2RzX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBjb3N0c19kYXRhX3ZhcjIgPSBjb3N0c19kYXRhX2luLAogICAgICAgICAgICAgICAgICAgICAgcnVuX3NpbV92YXIyLAogICAgICAgICAgICAgICAgICAgICAgY291bnRyaWVzX3ZhcjIsCgogICAgICAgICAgICAgICAgICAgICAgZXhfcmF0ZV92YXIyLCAgICAgICAgICAgICAgICAgICMgIkRhdGEiIHZhcnMKICAgICAgICAgICAgICAgICAgICAgIGV4X3JhdGVfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGdyb3d0aF9yYXRlX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBncm93dGhfcmF0ZV9zZF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgZ292X2JvbmRzX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBnb3ZfYm9uZHNfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGdvdl9ib25kc19uZXdfdmFyMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgZ292X2JvbmRzX25ld19zZF92YXIyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGlvbl92YXIyLAogICAgICAgICAgICAgICAgICAgICAgaW5mbGF0aW9uX3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRpb25fbmV3X3ZhcjIsICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGlvbl9uZXdfc2RfdmFyMiwgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICB0YXhfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHRheF9zZF92YXIyLAoKICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTFfdmFyMiwgICAgICAgICAgICAgICAgICAjICJSZXNlYXJjaCIgdmFycwogICAgICAgICAgICAgICAgICAgICAgbGFtYmRhMV9zZF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgbGFtYmRhMV9uZXdfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTFfbmV3X3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEyX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEyX3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICB3YWdlX2FnX3ZhcjIsICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIHdhZ2VfYWdfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHdhZ2Vfd3dfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHdhZ2Vfd3dfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHByb2ZpdHNfc2VfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHByb2ZpdHNfc2Vfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGhvdXJzX3NlX2NvbmRfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGhvdXJzX3NlX2NvbmRfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGhvdXJzX2FnX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBob3Vyc19hZ19zZF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgaG91cnNfd3dfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGhvdXJzX3d3X3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBob3Vyc19zZV92YXIyLAogICAgICAgICAgICAgICAgICAgICAgaG91cnNfc2Vfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGNvZWZfZXhwX3ZhcjIsICAgICAgICAgIyBzZCBmb3IgY29lZl9leHAgaXMgaGFyZCBjb2RlZAogICAgICAgICAgICAgICAgICAgICAgcHJldmFsZW5jZV8wX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBwcmV2YWxlbmNlXzBfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHByZXZhbGVuY2Vfcl92YXIyLAogICAgICAgICAgICAgICAgICAgICAgcHJldmFsZW5jZV9yX3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBuZXdfcHJldmxfcl92YXIyLCAgICAgICAjIHN1YnN0aXR1ZGVzIHRoZSBwcmV2X3IgYWJvdmU/PwogICAgICAgICAgICAgICAgICAgICAgbmV3X3ByZXZsX3Jfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZV9zZF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgcV9mdWxsX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBxX2Z1bGxfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHFfemVyb192YXIyLAogICAgICAgICAgICAgICAgICAgICAgcV96ZXJvX3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBkZWx0YV9lZF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgZGVsdGFfZWRfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGRlbHRhX2VkX2V4dF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgZGVsdGFfZWRfZXh0X3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICB0ZWFjaF9zYWxfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHRlYWNoX3NhbF9zZF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgdGVhY2hfYmVuX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICB0ZWFjaF9iZW5fc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHRlYWNoX3NhbF9uZXdfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHRlYWNoX3NhbF9uZXdfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHRlYWNoX2Jlbl9uZXdfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHRlYWNoX2Jlbl9uZXdfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIG5fc3R1ZGVudHNfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIG5fc3R1ZGVudHNfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHllYXJzX29mX3RyZWF0XzBfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHllYXJzX29mX3RyZWF0XzBfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHllYXJzX29mX3RyZWF0X3RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHllYXJzX29mX3RyZWF0X3Rfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHVuaXRfY29zdF9sb2NhbF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgdW5pdF9jb3N0X2xvY2FsX3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfbmV3X3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfbmV3X3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBjb3N0c19wYXJfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGNvc3RzX3Bhcl9zZF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgY291bnRzX3Bhcl92YXIyLAogICAgICAgICAgICAgICAgICAgICAgY291bnRzX3Bhcl9zZF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgc3RhZmZfdGltZV92YXIyLCAgICAgICMgR3Vlc3N3b3JrCiAgICAgICAgICAgICAgICAgICAgICBzdGFmZl90aW1lX3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBuZXdfY29zdHNfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIG5ld19jb3N0c19zZF92YXIyCiAgICAgICAgICAgICAgICAgICAgICApIHsKICAgIHN0YXJ0X3RpbWUgPC0gU3lzLnRpbWUoKQogICAgIyMjIyMjIyMjIyMjIyMjIwogICAgIyMjIyMjIERyYXdzCiAgICAjIyMjIyMjIyMjIyMjIyMjCiAgICBzZXQuc2VlZCgxNDI4NTcpCiAgICAjRGVmYXVsdCBkaXN0OiBub3JtYWwsIGRlZmF1bHQgc2Q6IDAuMSogbWVhbgogICAgIwogICAgIyBTb3VyY2VzIGFyZSBzZXBhcmF0ZWQgaW50bzogZGF0YSwgcmVzZWFyY2ggYW5kIGd1ZXNzIHdvcmsKICAgICMjIERhdGEKICAgIGdvdl9ib25kc19zaW0gPC0gICAgICAgIHJub3JtKG4gPSBuc2ltc192YXIyLCBtZWFuID0gZ292X2JvbmRzX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IGdvdl9ib25kc19zZF92YXIyKQogICAgaW5mbGF0aW9uX3NpbSA8LSAgICAgICAgcm5vcm0obnNpbXNfdmFyMiwgaW5mbGF0aW9uX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRpb25fc2RfdmFyMikKICAgIGdvdl9ib25kc19uZXdfc2ltIDwtICAgIHJub3JtKG4gPSBuc2ltc192YXIyLCBtZWFuID0gZ292X2JvbmRzX25ld192YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBnb3ZfYm9uZHNfbmV3X3NkX3ZhcjIpCiAgICBpbmZsYXRpb25fbmV3X3NpbSA8LSAgICBybm9ybShuc2ltc192YXIyLCBpbmZsYXRpb25fbmV3X3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRpb25fbmV3X3NkX3ZhcjIpICAgICAgICAgICAgICAgICAgCiAgICBncm93dGhfcmF0ZV9zaW0gPC0gICAgICBybm9ybShuc2ltc192YXIyLCBncm93dGhfcmF0ZV92YXIyLCBncm93dGhfcmF0ZV9zZF92YXIyKQogICAgZXhfcmF0ZV9zaW0gPC0gICAgICAgICAgcm5vcm0obnNpbXNfdmFyMiwgZXhfcmF0ZV92YXIyLCBleF9yYXRlX3NkX3ZhcjIpCiAgICB0YXhfc2ltIDwtICAgICAgICAgICAgICBybm9ybShuc2ltc192YXIyLCB0YXhfdmFyMiwgdGF4X3NkX3ZhcjIpCgogICAgIyMgUmVzZWFyY2gKICAgIGF1eDEgPC0wLjEgKiBjKGxhbWJkYTFfdmFyMlsxXSwgMC4wMSkKICAgICMgRWFjaCBsaXN0IGlzIGEgcGFpciBtZWFuLCBzZC4KICAgIGF1eDIgPC0gIGxhcHBseSgxOjIsIGZ1bmN0aW9uKHgpIGMobGFtYmRhMV92YXIyW3hdLCBjKDEuNDIsIDEuMzYpW3hdICkgKQogICAgbGFtYmRhMV9zaW0gPC0gc2FwcGx5KGF1eDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgIHJub3JtKG5zaW1zX3ZhcjIsIG1lYW4gPSB4WzFdLCBzZCA9IHhbMl0pICkKICAgIGxhbWJkYTJfc2ltIDwtICAgICAgICAgIHJub3JtKG5zaW1zX3ZhcjIsIGxhbWJkYTJfdmFyMiwgIGxhbWJkYTJfc2RfdmFyMikKICAgICMgTmV3IGxhbWJkYSBoZXJlCiAgICBsYW1iZGExX25ld19zaW0gPC0gcm5vcm0obnNpbXNfdmFyMiwgbGFtYmRhMV9uZXdfdmFyMiwgIGxhbWJkYTFfbmV3X3NkX3ZhcjIpCgoKICAgIHdhZ2VfYWdfc2ltIDwtICAgICAgICAgIHJub3JtKG5zaW1zX3ZhcjIsIHdhZ2VfYWdfdmFyMiwgd2FnZV9hZ19zZF92YXIyKQogICAgd2FnZV93d19zaW0gPC0gICAgICAgICAgcm5vcm0obnNpbXNfdmFyMiwgd2FnZV93d192YXIyLCB3YWdlX3d3X3NkX3ZhcjIpCiAgICBwcm9maXRzX3NlX3NpbSA8LSAgICAgICBybm9ybShuc2ltc192YXIyLCBwcm9maXRzX3NlX3ZhcjIsIHByb2ZpdHNfc2Vfc2RfdmFyMikKICAgIGhvdXJzX3NlX2NvbmRfc2ltIDwtICAgIHJub3JtKG5zaW1zX3ZhcjIsIGhvdXJzX3NlX2NvbmRfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzX3NlX2NvbmRfc2RfdmFyMikKICAgIGhvdXJzX2FnX3NpbSA8LSAgICAgICAgIHJub3JtKG5zaW1zX3ZhcjIsIGhvdXJzX2FnX3ZhcjIsIGhvdXJzX2FnX3NkX3ZhcjIpCiAgICBob3Vyc193d19zaW0gPC0gICAgICAgICBybm9ybShuc2ltc192YXIyLCBob3Vyc193d192YXIyLCBob3Vyc193d19zZF92YXIyKQogICAgaG91cnNfc2Vfc2ltIDwtICAgICAgICAgcm5vcm0obnNpbXNfdmFyMiwgaG91cnNfc2VfdmFyMiwgaG91cnNfc2Vfc2RfdmFyMikKICAgIGNvdmVyYWdlX3NpbSA8LSAgICAgICAgIHJub3JtKG5zaW1zX3ZhcjIsIGNvdmVyYWdlX3ZhcjIsIGNvdmVyYWdlX3NkX3ZhcjIpCgogICAgdW5pdF9jb3N0X2xvY2FsX3NpbSA8LSAgcm5vcm0obnNpbXNfdmFyMiwgdW5pdF9jb3N0X2xvY2FsX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfc2RfdmFyMikKICAgIHVuaXRfY29zdF9sb2NhbF9uZXdfc2ltIDwtICBybm9ybShuc2ltc192YXIyLCB1bml0X2Nvc3RfbG9jYWxfbmV3X3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRfY29zdF9sb2NhbF9uZXdfc2RfdmFyMikKCiAgICB5ZWFyc19vZl90cmVhdF8wX3NpbSA8LSAgIHJub3JtKG5zaW1zX3ZhcjIsIHllYXJzX29mX3RyZWF0XzBfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXJzX29mX3RyZWF0XzBfc2RfdmFyMikKICAgIHllYXJzX29mX3RyZWF0X3Rfc2ltIDwtICAgcm5vcm0obnNpbXNfdmFyMiwgeWVhcnNfb2ZfdHJlYXRfdF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhcnNfb2ZfdHJlYXRfdF9zZF92YXIyKQoKICAgIHFfZnVsbF9zaW0gPC0gICAgICAgICAgIHJub3JtKG5zaW1zX3ZhcjIsIHFfZnVsbF92YXIyLCBxX2Z1bGxfc2RfdmFyMikKICAgIHFfemVyb19zaW0gPC0gICAgICAgICAgIHJub3JtKG5zaW1zX3ZhcjIsIHFfemVyb192YXIyLCBxX3plcm9fc2RfdmFyMikKCiAgICAjIFByZXZhbGVuY2UgaGVyZSBUTyBETzogZHJhdyBmcm9tIGEgYmV0YSBpbnN0ZWFkIG9mICJ0cnVuY2F0ZWQiIG5vcm1hbAogICAgcHJldmFsZW5jZV8wX3NpbSA8LSBybm9ybShuc2ltc192YXIyLCBwcmV2YWxlbmNlXzBfdmFyMiwgcHJldmFsZW5jZV8wX3NkX3ZhcjIpCiAgICBwcmV2YWxlbmNlXzBfc2ltIDwtIGlmZWxzZSgKICAgICAgcHJldmFsZW5jZV8wX3NpbSA+IDEsCiAgICAgIHllcyA9IDEsCiAgICAgIG5vID0gaWZlbHNlKHByZXZhbGVuY2VfMF9zaW0gPCAwLCB5ZXMgPSAwLCBubyA9IHByZXZhbGVuY2VfMF9zaW0pCiAgICApCgogICAgYXV4NCA8LSBsYXBwbHkoY291bnRyaWVzX3ZhcjIsICN3aWxsIGhhdmUgdHJvdWJsZSB3aGVuIHNlbGVjdGluZyBubyBjb3VudHJpZXMKICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIGMocHJldmFsZW5jZV9yX3NvW3hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2YWxlbmNlX3Jfc29beF0pICkKCiAgICAjIGZpcnN0IGRyYXcgc2FtcGxlcyBvZiBwcmV2YWxlbmNlIGZvciBlYWNoIGNvdW50cnkKICAgIHByZXZhbGVuY2Vfcl9zaW0gPC0gc2FwcGx5KGF1eDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJub3JtKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2ltc192YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuID0geFsxXSAqIHByZXZhbGVuY2Vfcl92YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IHhbMl0gKiBwcmV2YWxlbmNlX3Jfc2RfdmFyMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKICAgIHByZXZhbGVuY2Vfcl9zaW0gPC0gaWZlbHNlKAogICAgICBwcmV2YWxlbmNlX3Jfc2ltID4gMSwKICAgICAgeWVzID0gMSwKICAgICAgbm8gPSBpZmVsc2UocHJldmFsZW5jZV9yX3NpbSA8IDAsIHllcyA9IDAsIG5vID0gcHJldmFsZW5jZV9yX3NpbSkKICAgICkKICAgIGNvbG5hbWVzKHByZXZhbGVuY2Vfcl9zaW0pIDwtIGFzLmNoYXJhY3Rlcihjb3VudHJpZXNfdmFyMikgIAoKICAgICMgaWYgdGhlcmUgaXMgYSBuZXcgZW50cnkgb2YgcHJldmFsZW5jZSwgZHJhdyBmcm9tIGl0LiBJZiB0aGVyZSBpcyBub3QKICAgICMgdGhlbiBsZWF2ZSBhcyBudWxsCiAgICBpZiAoIWlzLm51bGwobmV3X3ByZXZsX3JfdmFyMikpewogICAgICAgICAgbmV3X3ByZXZsX3Jfc2ltIDwtIHJub3JtKG5zaW1zX3ZhcjIsIG5ld19wcmV2bF9yX3ZhcjIsIG5ld19wcmV2bF9yX3NkX3ZhcjIpCiAgICAgICAgICBuZXdfcHJldmxfcl9zaW0gPC0gaWZlbHNlKAogICAgICAgICAgICBuZXdfcHJldmxfcl9zaW0gPiAxLAogICAgICAgICAgICB5ZXMgPSAxLAogICAgICAgICAgICBubyA9IGlmZWxzZShuZXdfcHJldmxfcl9zaW0gPCAwLCAwLCBuZXdfcHJldmxfcl9zaW0pCiAgICAgICAgICApCiAgICB9IGVsc2UgaWYgKGlzLm51bGwobmV3X3ByZXZsX3JfdmFyMikpewogICAgICAgICAgbmV3X3ByZXZsX3Jfc2ltIDwtIE5VTEwKICAgIH0KICAgIGF1eDIgPC0gbGFwcGx5KDE6MiwgZnVuY3Rpb24oeCkgYyhjb2VmX2V4cF92YXIyW3hdLGMoMC4wMDEgLCAwLjAwMSlbeF0pICkKICAgIGNvZWZfZXhwX3NpbSA8LSBzYXBwbHkoYXV4MiwgZnVuY3Rpb24oeCkgIHJub3JtKG5zaW1zX3ZhcjIsIG1lYW4gPSB4WzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSB4WzJdKSApICAgICAKICAgIHRlYWNoX3NhbF9zaW0gPC0gICAgcm5vcm0obnNpbXNfdmFyMiwgdGVhY2hfc2FsX3ZhcjIsIHRlYWNoX3NhbF9zZF92YXIyKQogICAgdGVhY2hfYmVuX3NpbSA8LSAgICBybm9ybShuc2ltc192YXIyLCB0ZWFjaF9iZW5fdmFyMiwgdGVhY2hfYmVuX3NkX3ZhcjIpCgogICAgdGVhY2hfc2FsX25ld19zaW0gPC0gICAgcm5vcm0obnNpbXNfdmFyMiwgdGVhY2hfc2FsX25ld192YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhY2hfc2FsX25ld19zZF92YXIyKQogICAgdGVhY2hfYmVuX25ld19zaW0gPC0gICAgcm5vcm0obnNpbXNfdmFyMiwgdGVhY2hfYmVuX25ld192YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhY2hfYmVuX25ld19zZF92YXIyKQoKICAgIG5fc3R1ZGVudHNfc2ltIDwtICAgcm5vcm0obnNpbXNfdmFyMiwgbl9zdHVkZW50c192YXIyLCBuX3N0dWRlbnRzX3NkX3ZhcjIpCiAgICAjIFRPIERPOiBtb2RpZnkgdG8gaGF2ZSBhIHNjYWxhciBtdWx0bHlpbmcgdGhlIHNlcmllcywgYW5kIGhhdmUgdGhhdAogICAgIyBzY2FsYXIgYmVpbmcgTigxLDAuMSkKICAgIGRlbHRhX2VkX3NpbSA8LSBzYXBwbHkoZGVsdGFfZWRfc29bLDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSBybm9ybSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2ltc192YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4gPSB4ICogZGVsdGFfZWRfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IGRlbHRhX2VkX3NkX3ZhcjIgKiBzZChkZWx0YV9lZF9zb1ssIDFdKSkgKQogICAgY29sbmFtZXMoZGVsdGFfZWRfc2ltKSA8LSAxOTk5OjIwMDcKICAgICMgbW9kaWZ5IHRvIGhhdmUgYSBzY2FsYXIgbXVsdGx5aW5nIHRoZSBzZXJpZXMsIGFuZCBoYXZlIHRoYXQgc2NhbGFyCiAgICAjIGJlaW5nIE4oMSwwLjEpCiAgICBkZWx0YV9lZF9leHRfc2ltIDwtIHNhcHBseShkZWx0YV9lZF9leHRfc29bLDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5vcm0oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNpbXNfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuID0geCAqIGRlbHRhX2VkX2V4dF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gIHNkKGRlbHRhX2VkX2V4dF9zb1ssIDFdKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YV9lZF9leHRfc2RfdmFyMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgIGNvbG5hbWVzKGRlbHRhX2VkX2V4dF9zaW0pIDwtIDE5OTk6MjAwNwoKICAgIGNvdW50c19pbiA8LSBjb3N0c19kYXRhX3ZhcjIkdG90YWwKICAgIGNvc3RzX25vX3N0YWZmX2luIDwtIGNvc3RzX2RhdGFfdmFyMiRjb3N0c19ieV9jb3VudHJ5CgogICAgIyBkcmF3aW5nIHNhbXBsZXMgZm9ybSBjb3VudHMKICAgIGNvc3RzMV9jb3VudHNfc2ltIDwtIHNhcHBseShjb3VudHNfaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgIHJub3JtKG5zaW1zX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4gPSB4ICogY291bnRzX3Bhcl92YXIyLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0geCAqIGNvdW50c19wYXJfc2RfdmFyMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAjIGRyYXdpbmcgc2FtcGxlcyBmcm9tIGNvc3RzCiAgICBjb3N0czFfYWxsX2Nvc3RzX3NpbSA8LSBzYXBwbHkoY29zdHNfbm9fc3RhZmZfaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgIHJub3JtKG5zaW1zX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4gPSB4ICogY29zdHNfcGFyX3ZhcjIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSB4ICogY29zdHNfcGFyX3NkX3ZhcjIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKICAgICNjb21wdXRpbmcgdW5pdCBjb3N0IGZvciBlYWNoIHNpbXVsYXRpb24gZHJhdwogICAgY29zdHMxX2RmX3NpbSA8LSBOVUxMCgogICAgI2J1aWxkaW5nICJuc2ltc192YXIyIiBzaW11bGF0ZWQgZGF0YSBzZXRzIChjb3JyZXNwb25kaW5nIHRvIGNvc3RzX2RhdGFfaW4pCiAgICBmb3IgKGF1eDFfaSBpbiAxOm5zaW1zX3ZhcjIpewogICAgICBjb3N0czFfZGZfc2ltW1thdXgxX2ldXSA8LSBkYXRhLmZyYW1lKAogICAgICAgICJDb3VudHJ5IiA9IGNvc3RzX2RhdGFfdmFyMiRDb3VudHJ5LAogICAgICAgICJ0b3RhbCIgPSBjb3N0czFfY291bnRzX3NpbVthdXgxX2ksXSwKICAgICAgICAiY29zdHNfYnlfY291bnRyeSIgPSBjb3N0czFfYWxsX2Nvc3RzX3NpbVthdXgxX2ksXQogICAgICAgICkKICAgIH0KICAgIHRlbXBfY29zdF9zaW0gPC0gcm5vcm0obnNpbXNfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbiA9IG5ld19jb3N0c192YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IG5ld19jb3N0c19zZF92YXIyKQogICAgIyMgR3Vlc3Mgd29yawogICAgIyBkcmF3aW5nIHNhbXBsZXMgZnJvbSBzdGFmZiB0aW1lCiAgICBzdGFmZl90aW1lX3NpbSA8LSBybm9ybShuc2ltc192YXIyLCBzdGFmZl90aW1lX3ZhcjIsIHN0YWZmX3RpbWVfc2RfdmFyMikgICAgICAKICAgIHBlcmlvZHNfdmFsIDwtIDUwICAgICAgICAgICAjVG90YWwgbnVtYmVyIG9mIHBlcmlvZHMgdG8gZm9yZWNhc3Qgd2FnZXMKICAgIHRpbWVfdG9fam1fdmFsIDwtIDEwICAgICAgICAjcGVyaW9kcyB1bnRpbCBpbmRpdmlkdWFsIGpvaW4gdGhlIGxhYm9yIGZvcmNlCgogICAgIyMjIyMjICAgIAogICAgIyMjIyMjICAgIAoKICAgICMjIyMjIyMjIyMjIyMjIyMKICAgICMjIyMjIyBSdW5zICAgIAogICAgIyMjIyMjIyMjIyMjIyMjIwoKICAgICNWZWN0b3JzIHRvIHN0b3JlIHRoZSByZXN1bHRzIG9mIGVhY2ggc2ltdWxhdGlvbgogICAgYTFfdGF4X3NpbSAgICAgICAgICAgPC0gcmVwKE5BLCBuc2ltc192YXIyKSAjYTFfdGF4X3BlCiAgICBhMV94X3RheF9zaW0gICAgICAgICA8LSByZXAoTkEsIG5zaW1zX3ZhcjIpICNhMV94X3RheF9wZQogICAgYTFfYWxsX3NpbSAgICAgICAgICAgPC0gcmVwKE5BLCBuc2ltc192YXIyKSAjYTFfYWxsX3BlCiAgICBhMV94X2FsbF9zaW0gICAgICAgICA8LSByZXAoTkEsIG5zaW1zX3ZhcjIpICNhMV94X2FsbF9wZQogICAgYTJfdGF4X3NpbSAgICAgICAgICAgPC0gcmVwKE5BLCBuc2ltc192YXIyKSAjYTJfdGF4CiAgICBhMl9hbGxfc2ltICAgICAgICAgICA8LSByZXAoTkEsIG5zaW1zX3ZhcjIpICNhMl9hbGwKICAgIGEzX2luY19hMV9hbGxfc2ltICAgIDwtIHJlcChOQSwgbnNpbXNfdmFyMikgI2EzX2luY19hMV9hbGwKICAgIGEzX2luY19hMV9hbGxfeF9zaW0gIDwtIHJlcChOQSwgbnNpbXNfdmFyMikgI2EzX2luY19hMV9hbGxfeAogICAgYTNfaW5jX2EyX2FsbF9zaW0gICAgPC0gcmVwKE5BLCBuc2ltc192YXIyKSAjYTNfaW5jX2EyX2FsbF9tcGUKCgogICAgZm9yIChpIGluIDE6bnNpbXNfdmFyMikgewogICAgIyBvbmVfcnVuX2YsIGZvciB0aGUgbW9zdCBwYXJ0LCBkb2VzIG5vdCBpbmNsdWRlIHN0YW5kYXJkIGRldmlhdGlvbnMgICAKICAgICAgaW52aXNpYmxlKCBsaXN0MmVudigKICAgICAgICBvbmVfcnVuX2YobWFpbl9ydW5fdmFyMSA9IEZBTFNFLCAgICAgICAgICAgICAgIyBIRVJFIEkgTkVFRCBUTyBQTFVHIGNvc3RzMV9jb3N0c19zaW0KICAgICAgICAgICAgICAgIHJ1bl9zaW1fdmFyMSA9IFRSVUUsCiAgICAgICAgICAgICAgICB3YWdlX2FnX3ZhcjEgPSB3YWdlX2FnX3NpbVtpXSwKICAgICAgICAgICAgICAgIHdhZ2Vfd3dfdmFyMSA9IHdhZ2Vfd3dfc2ltW2ldLAogICAgICAgICAgICAgICAgcHJvZml0c19zZV92YXIxID0gcHJvZml0c19zZV9zaW1baV0sCiAgICAgICAgICAgICAgICBob3Vyc19zZV9jb25kX3ZhcjEgPSBob3Vyc19zZV9jb25kX3NpbVtpXSwKICAgICAgICAgICAgICAgIGhvdXJzX2FnX3ZhcjEgPSBob3Vyc19hZ19zaW1baV0sCiAgICAgICAgICAgICAgICBob3Vyc193d192YXIxID0gaG91cnNfd3dfc2ltW2ldLAogICAgICAgICAgICAgICAgaG91cnNfc2VfdmFyMSA9IGhvdXJzX3NlX3NpbVtpXSwKICAgICAgICAgICAgICAgIGV4X3JhdGVfdmFyMSA9IGV4X3JhdGVfc2ltW2ldLAogICAgICAgICAgICAgICAgZ3Jvd3RoX3JhdGVfdmFyMSA9IGdyb3d0aF9yYXRlX3NpbVtpXSwKICAgICAgICAgICAgICAgIGNvZWZfZXhwX3ZhcjEgPSBjb2VmX2V4cF9zaW1baSwgMV0sIGNvZWZfZXhwMl92YXIxID0gY29lZl9leHBfc2ltW2ksMl0sCiAgICAgICAgICAgICAgICBsYW1iZGExX3ZhcjEgPSBsYW1iZGExX2luX2YobGFtYmRhMV92YXIgPSBsYW1iZGExX3NpbVtpLF0pLAogICAgICAgICAgICAgICAgcHJldmFsZW5jZV8wX3ZhcjEgPSBwcmV2YWxlbmNlXzBfc2ltW2ldLAogICAgICAgICAgICAgICAgcHJldmFsZW5jZV9yX3ZhcjEgPSBwcmV2YWxlbmNlX3Jfc2ltW2ksIF0sCiAgICAgICAgICAgICAgICBuZXdfcHJldmxfcl92YXIxID0gbmV3X3ByZXZsX3Jfc2ltW2ldLAogICAgICAgICAgICAgICAgbGFtYmRhMl92YXIxID0gbGFtYmRhMl9zaW1baV0sCiAgICAgICAgICAgICAgICBjb3ZlcmFnZV92YXIxID0gY292ZXJhZ2Vfc2ltW2ldLAogICAgICAgICAgICAgICAgcV9mdWxsX3ZhcjEgPSBxX2Z1bGxfc2ltW2ldLAogICAgICAgICAgICAgICAgcV96ZXJvX3ZhcjEgPSBxX3plcm9fc2ltW2ldLAogICAgICAgICAgICAgICAgbGFtYmRhMV9uZXdfdmFyMSA9IGxhbWJkYTFfbmV3X3NpbVtpXSwKICAgICAgICAgICAgICAgIGdvdl9ib25kc192YXIxID0gZ292X2JvbmRzX3NpbVtpXSwKICAgICAgICAgICAgICAgIGluZmxhdGlvbl92YXIxID0gaW5mbGF0aW9uX3NpbVtpXSwKICAgICAgICAgICAgICAgIGdvdl9ib25kc19uZXdfdmFyMSA9IGdvdl9ib25kc19uZXdfc2ltW2ldLAogICAgICAgICAgICAgICAgaW5mbGF0aW9uX25ld192YXIxID0gaW5mbGF0aW9uX25ld19zaW1baV0sCiAgICAgICAgICAgICAgICBkZWx0YV9lZF92YXIxID0gY2JpbmQoZGVsdGFfZWRfc2ltW2ksXSwgMTk5OToyMDA3KSwKICAgICAgICAgICAgICAgIGRlbHRhX2VkX2V4dF92YXIxID0gY2JpbmQoZGVsdGFfZWRfZXh0X3NpbVtpLF0sIDE5OTk6MjAwNyksCiAgICAgICAgICAgICAgICB0ZWFjaF9zYWxfdmFyMSA9IHRlYWNoX3NhbF9zaW1baV0sCiAgICAgICAgICAgICAgICB0ZWFjaF9iZW5fdmFyMSA9IHRlYWNoX2Jlbl9zaW1baV0sCiAgICAgICAgICAgICAgICB0ZWFjaF9zYWxfbmV3X3ZhcjEgPSB0ZWFjaF9zYWxfbmV3X3NpbVtpXSwKICAgICAgICAgICAgICAgIHRlYWNoX2Jlbl9uZXdfdmFyMSA9IHRlYWNoX2Jlbl9uZXdfc2ltW2ldLAogICAgICAgICAgICAgICAgbl9zdHVkZW50c192YXIxID0gbl9zdHVkZW50c19zaW1baV0sCiAgICAgICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfdmFyMSA9IHVuaXRfY29zdF9sb2NhbF9zaW1baV0sCiAgICAgICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfbmV3X3ZhcjEgPSB1bml0X2Nvc3RfbG9jYWxfbmV3X3NpbVtpXSwKICAgICAgICAgICAgICAgIHllYXJzX29mX3RyZWF0XzBfdmFyMSA9IHllYXJzX29mX3RyZWF0XzBfc2ltW2ldLAogICAgICAgICAgICAgICAgeWVhcnNfb2ZfdHJlYXRfdF92YXIxID0geWVhcnNfb2ZfdHJlYXRfdF9zaW1baV0sCiAgICAgICAgICAgICAgICB0YXhfdmFyMSA9IHRheF9zaW1baV0sCiAgICAgICAgICAgICAgICBwZXJpb2RzX3ZhcjEgPSBwZXJpb2RzX3NvLAogICAgICAgICAgICAgICAgZGZfY29zdHNfdmFyMSA9IGNvc3RzMV9kZl9zaW1bW2ldXSwKICAgICAgICAgICAgICAgIG5ld19jb3N0c192YXIxID0gdGVtcF9jb3N0X3NpbVtpXSwgICAgCiAgICAgICAgICAgICAgICBzdGFmZl90aW1lX3ZhcjEgPSBzdGFmZl90aW1lX3NpbVtpXSwKICAgICAgICAgICAgICAgIGNvdW50cmllc192YXIxID0gY291bnRyaWVzX3ZhcjIKICAgICAgICAgICAgICAgICksLkdsb2JhbEVudikgKSAjIGFkZCBjb3N0cyBoZXJlCiAgICAgICNCYWlyZCAxOiBDb3N0cyA9IEJhaXJkIHcvdGF4IGFuZCBubyBleHRlcm5hbGl0aWVzIChubyBleHQpOyBCZW5lZiA9IEJhaXJkIG5vIGV4dAogICAgICBhMV90YXhfc2ltW2ldIDwtIE5QVl9wZV9mKGJlbmVmaXRzX3ZhciA9IHB2X2JlbmVmX3RheF9ueF9pbiwgY29zdHNfdmFyID0gY29zdHMyX2luKQogICAgICAjQmFpcmQgMjogQ29zdHMgPSBCYWlyZCB3L3RheCBhbmQgeWVzIGV4dGVybmFsaXRpZXMgKG5vIGV4dCk7IEJlbmVmID0gQmFpcmQgeWVzIGV4dAogICAgICBhMV94X3RheF9zaW1baV0gIDwtIE5QVl9wZV9mKGJlbmVmaXRzX3ZhciA9IHB2X2JlbmVmX3RheF95eF9pbiwgY29zdHNfdmFyID0gY29zdHMyX3hfaW4pCiAgICAgICMgQmFpcmQgMzogQmVuZWZpdHMgPSBCYWlyZCBhbGwgYW5kIG5vIGV4dDsgQ29zdHMgPSBCYWlyZCBubyBleHQKICAgICAgYTFfYWxsX3NpbVtpXSAgPC0gTlBWX3BlX2YoYmVuZWZpdHNfdmFyID0gcHZfYmVuZWZfYWxsX254X2luLCBjb3N0c192YXIgPSBjb3N0czJfaW4pCiAgICAgICMgQmFpcmQgNDogQmVuZWZpdHMgPSBCYWlyZCBhbGwgYW5kIHllcyBleHQ7IENvc3RzID0gQmFpcmQgeWVzIGV4dAogICAgICBhMV94X2FsbF9zaW1baV0gIDwtIE5QVl9wZV9mKGJlbmVmaXRzX3ZhciA9IHB2X2JlbmVmX2FsbF95eF9pbiwgY29zdHNfdmFyID0gY29zdHMyX3hfaW4pCiAgICAgICNLTFBTNF8xOiBiZW5lZml0cyA9IEtMUFM0IHcvdCBhbmQgbm8gZXh0OyBDb3N0cyA9CUJhaXJkIG5vIGV4dAogICAgICBhMl90YXhfc2ltW2ldICA8LSBOUFZfcGVfZihiZW5lZml0c192YXIgPSBwdl9iZW5lZl90YXhfbmV3X2luLCBjb3N0c192YXIgPSBjb3N0c19hMl9pbikKICAgICAgI0tMUFM0XzI6YmVuZWZpdHMgPSBLTFBTNCBhbGwgYW5kIG5vIGV4dDsgQ29zdHMgPQlCYWlyZCBubyBleHQKICAgICAgYTJfYWxsX3NpbVtpXSAgPC0gTlBWX3BlX2YoYmVuZWZpdHNfdmFyID0gcHZfYmVuZWZfYWxsX25ld19pbiwgY29zdHNfdmFyID0gY29zdHNfYTJfaW4pCiAgICAgICMgRUExOiBubyBleHRlcm5hbGl0eSBOUFYgdXNpbmcgRUFzIGNvc3RzCiAgICAgIGEzX2luY19hMV9hbGxfc2ltW2ldICA8LSBOUFZfcGVfZihiZW5lZml0c192YXIgPSBwdl9iZW5lZl9hbGxfbnhfcHJldmxfaW4sIGNvc3RzX3ZhciA9IGNvc3RzMl9lYV9pbikKICAgICAgIyBFQTI6IHllcyBleHRlcm5hbGl0eSBOUFYgdXNpbmcgRUFzIGNvc3RzCiAgICAgIGEzX2luY19hMV9hbGxfeF9zaW1baV0gIDwtIE5QVl9wZV9mKGJlbmVmaXRzX3ZhciA9IHB2X2JlbmVmX2FsbF95eF9wcmV2bF9pbiwgY29zdHNfdmFyID0gY29zdHMyX2VhX2luKQogICAgICAjIEVBMzogYmVuZWY9IEtMUFMgYWxsIGFuZCBubyBleHQ7IENvc3RzPUVBCiAgICAgIGEzX2luY19hMl9hbGxfc2ltW2ldICA8LSBOUFZfcGVfZihiZW5lZml0c192YXIgPSBwdl9iZW5lZl9hbGxfcHJldmxfbmV3X2luLCBjb3N0c192YXIgPSBjb3N0czJfZWFfaW4pCiAgICB9CgogICAgdG90YWxfdGltZV9zaW0gPC0gU3lzLnRpbWUoKSAtIHN0YXJ0X3RpbWUKCiAgICAjIyMjIyMgICAgCiAgICAjIyMjIyMgICAgIAogICAgcmV0dXJuKCBsaXN0KAogICAgICAiYTFfdGF4X3NpbSIgICAgICAgICAgPSBhMV90YXhfc2ltLCAgICAgICAgIAogICAgICAiYTFfeF90YXhfc2ltIiAgICAgICAgPSBhMV94X3RheF9zaW0sICAgICAgICAgCiAgICAgICJhMV9hbGxfc2ltIiAgICAgICAgICA9IGExX2FsbF9zaW0sICAgICAgICAgCiAgICAgICJhMV94X2FsbF9zaW0iICAgICAgICA9IGExX3hfYWxsX3NpbSwgICAgICAgICAKICAgICAgImEyX3RheF9zaW0iICAgICAgICAgID0gYTJfdGF4X3NpbSwgICAgICAgIAogICAgICAiYTJfYWxsX3NpbSIgICAgICAgICAgPSBhMl9hbGxfc2ltLCAgICAgICAgCiAgICAgICJhM19pbmNfYTFfYWxsX3NpbSIgICA9IGEzX2luY19hMV9hbGxfc2ltLCAgICAgICAgICAgIAogICAgICAiYTNfaW5jX2ExX2FsbF94X3NpbSIgPSBhM19pbmNfYTFfYWxsX3hfc2ltLCAgICAgICAgICAgIAogICAgICAiYTNfaW5jX2EyX2FsbF9zaW0iICAgPSBhM19pbmNfYTJfYWxsX3NpbSwgICAgICAgICAgICAKICAgICAgInRvdGFsX3RpbWVfc2ltIiAgICAgID0gdG90YWxfdGltZV9zaW0KICAgICkgKQp9Cgpwb2xpY3lfZXN0aW1hdGVzX3Zhcm5hbWVzIDwtIGMoCiAgImExX3RheF9zaW0iLAogICJhMV94X3RheF9zaW0iLAogICJhMV9hbGxfc2ltIiwKICAiYTFfeF9hbGxfc2ltIiwKICAiYTJfdGF4X3NpbSIsCiAgImEyX2FsbF9zaW0iLAogICJhM19pbmNfYTFfYWxsX3NpbSIsCiAgImEzX2luY19hMV9hbGxfeF9zaW0iLAogICJhM19pbmNfYTJfYWxsX3NpbSIgICAgICAgICAgICAKKQoKcG9saWN5X2VzdGltYXRlc190ZXh0IDwtIGMoCiAgIkExLiBUYXggcmV2ZW51ZSIsCiAgIkExLiBXaXRoIGV4dGVybmFsaXRpZXMuIFRheCIsCiAgIkExLiBBbGwgaW5jb21lIiwKICAiQTEuIFdpdGggZXh0LiBBbGwgaW5jb21lIiwKICAiQTIuIFRheCIsCiAgIkEyLiBBbGwgaW5jb21lIiwKICAiQTMuIEFsbCBpbmNvbWUgb2YgQTEiLAogICJBMy4gQWxsIGluY29tZSBvZiBBMSwgd2l0aCBleHQuIiwKICAiQTMuIEFsbCBpbmNvbWUgb2YgQTIuIE1haW4gUG9saWN5IEVzdGltYXRlIgogICkKYGBgCgo8L2RldGFpbHM+CgojIE1haW4gUmVzdWx0cyAgCgpJbiB0aGlzIGRvY3VtZW50IHdlIGhhdmUgcHJlc2VudGVkIHRocmVlIGRpZmZlcmVudCBhcHByb2FjaGVzIHRvIG1lYXN1cmluZyB0aGUgd2VsZmFyZSBlZmZlY3RzIG9mIGRld29ybWluZyAgaW50ZXJ2ZW50aW9ucy4gVGhlIGZpcnN0IGFwcHJvYWNoIHdhcyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgcGFwZXIgdGhhdCBtZWFzdXJlZCB0aGUgd2VsZmFyZSBlZmZlY3RzIG9mIGRld29ybWluZyAoQGJhaXJkMjAxNndvcm1zKSBhbmQgcHJvcG9zZWQgZm91ciBkaWZmZXJlbnQgd2F5cyB0byBjb21wdXRlIHRoaXMgZWZmZWN0ICh3aXRoIGFuZCB3aXRob3V0IGV4dGVybmFsaXRpZXMsIGFuZCBmcm9tIGEgc29jaWV0YWwgb3IgZmlzY2FsIHBlcnNwZWN0aXZlKS4gVGhlIHNlY29uZCBhcHByb2FjaCwgYmFzZWQgb24gbW9yZSByZWNlbnQgZGF0YSwgZm9jdXNlZCBvbmx5IG9uIGRpcmVjdCBlZmZlY3RzLCBhbmQgcmVsaWVzIGxlc3Mgb24gcHJlZGljdGl2ZSBlZmZlY3RzIG92ZXIgdGhlIGxpZmVjeWNsZS4gUmVzdWx0cyBmb3IgdGhlIHNlY29uZCBhcHByb2FjaCBhcmUgYWxzbyBzZXBhcmF0ZWQgYmV0d2VlbiB0aGUgc29jaWV0YWwgYW5kIGZpc2NhbCBwZXJzcGVjdGl2ZS4gICAKClRoZSB0aGlyZCBhbmQgZmluYWwgYXBwcm9hY2ggdXNlcyBzaW1pbGFyIG1ldGhvZG9sb2dpZXMgd2l0aCB0aHJlZSBtYWluIGRpZmZlcmVuY2VzLiBGaXJzdCwgd2UgYWxsb3cgdGhlIGJlbmVmaXRzIHRvIGJlIHNjYWxlZCB0byBhY2NvdW50IGZvciBkaWZmZXJlbmNlcyBpbiB0aGUgcHJldmFsZW5jZSBvZiB3b3JtIGluZmVjdGlvbnMgaW4gc2V0dGluZ3MgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIHN0dWR5LiBTZWNvbmQsIHdlIGFsbG93IHRoZSBiZW5lZml0cyB0byBiZSBzY2FsZWQgYnkgdGhlIGxlbmd0aCBvZiB0cmVhdG1lbnQgcHJvdmlkZWQgdG8gY2hpbGRyZW4gd2l0aGluIGEgcGFydGljdWxhciBzZXR0aW5nLiBGaW5hbGx5LCBiYXNlZCBvbiBmZWVkYmFjayBmcm9tIEV2aWRlbmNlIEFjdGlvbiBvbiB0aGUgcmVsZXZhbnQgY29zdHMgZnJvbSBwcmVzZW50LWRheSBkZXdvcm1pbmcgcHJvZ3JhbXMsIHRoaXMgYXBwcm9hY2ggdXNlcyBtb3JlIHVwIHRvIGRhdGUgaW5mb3JtYXRpb24gb24gdHJlYXRtZW50IGNvc3RzIGFuZCBpdCBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCB0aGUga25vY2stb24gZWZmZWN0cyBvZiBhZGRpdGlvbmFsIHNjaG9vbGluZyBjb3N0cyBhcyBhIHJlc3VsdCBvZiBpbmNyZWFzZWQgc2Nob29sIGF0dGVuZGFuY2UsIHdoaWNoIGFyZSBhY2NvdW50ZWQgZm9yIGluIGFwcHJvYWNoZXMgIzEgYW5kICMyW14xMV0uCgpbXjExXTogRXZpZGVuY2UgQWN0aW9uIHN1Z2dlc3RzIHRoYXQgdGhlIGFkZGVkIGNvc3RzIG9uIGVkdWNhdGlvbiB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIGFzIGNvc3RzIGZyb20gYSBwb2xpY3kgbWFrZXJzIHBlcnNwZWN0aXZlLiBUaG9zZSBjb3N0cyBjb3JyZXNwb25kcyB0byBhbm90aGVyIGludGVydmVudGlvbiBvbiBpdHNlbGYgKGVkdWNhdGlvbikgYW5kIGluY29ycG9yYXRpbmcgaXRzIGNvc3RzIHdvdWxkIGFsc28gcmVxdWlyZSB0byBpbmNvcnBvcmF0ZSBpdHMgYmVuZWZpdHMuIFtDT05GSVJNIFdJVEggR1JBQ0VdCgpUaGUgdGFibGUgYmVsb3cgc3VtbWFyaXNlcyB0aGUgdGhyZWUgZGlmZmVyZW50IGFwcHJvYWNoZXMgYW5kIHRoZSBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIHdpdGhpbiBlYWNoIGFwcHJvYWNoLiBUaGUgbWFpbiBwb2xpY3kgZXN0aW1hdGUgaXMgZGVmaW5lZCBhcyB0aGF0IG9mIEV2aWRlbmNlIEFjdGlvbiAoYXBwcm9hY2ggMykgdXNpbmcgdGhlIGxhdGVzdCByZXNlYXJjaCAoQGtscHM0KTogYXBwcm9hY2ggMy4zIGluIHRoZSB0YWJsZSAoaW4gYm9sZCkuCgo8ZGV0YWlscz48c3VtbWFyeT5TaG93IGFsbCB0aGUgZGV0YWlsczwvc3VtbWFyeT4KCmBgYHtyIGFsbC1zdGVwcywgZWNobz1wcmludF9jb2RlfQojIFRPRE86IFdyYXAgdGhpcyBjb2RlIGNodW5rIGluIGNodW5rX3h4eGZ1bmN0aW9uCgojY2h1bmtfcnVudmFsdWVzIDwtIGZ1bmN0aW9uKCl7CiMgRnVuY3Rpb24gZGVwZW5kZW5jeSBpcyBkZXBpY3RlZCBhcyBmb2xsb3dzOgojIGYoZygpKSA9CiMgZgojIOKUlOKUgOKUgOKUgOKUgCBnCiMKIyAgICAgICAjIyAgICAgIyMjICAgICMjIyMgICAgIyMjIyMKIyAxICAgICAyICAgICAgIDMgICAgIDQgICAgICAgNQojICAgICAgICMjICAgICAjIyMgICAgIyMjIyAgICAjIyMjIwojIE5QVl9wZV9mCiMg4pSc4pSA4pSA4pSA4pSAIHB2X2JlbmVmX2YKIyDilIIgICAgICDilJzilIDilIDilIDilIAgZWFybmluZ3NfYXBwMV9mCiMg4pSCICAgICAgfCAgICAgIOKUnOKUgOKUgOKUgOKUgCB3YWdlX3RfZgojIOKUgiAgICAgIHwgICAgICB8ICAgICAg4pSU4pSA4pSA4pSA4pSAIHdhZ2VfMF9mCiMgfCAgICAgIHwgICAgICDilJzilIDilIDilIDilIAgbGFtYmRhX2VmZl9mCiMg4pSCICAgICAgfCAgICAgIHwgICAgICDilJTilIDilIDilIDilIBsYW1iZGExX3RfZgojIOKUgiAgICAgIHwgICAgICB8ICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSAbGFtYmRhMV9pbl9mCiMgfCAgICAgIHwgICAgICDilJzilIDilIDilIDilIAgbGFtYmRhMV9pbl9mCiMgfCAgICAgIHwgICAgICDilJzilIDilIDilIDilIAgbGFtYmRhMl9pbl9mCiMg4pSCICAgICAgfCAgICAgIOKUlOKUgOKUgOKUgOKUgCBzYXR1cmF0aW9uX2luX2YKIyDilIIgICAgICDilJzilIDilIDilIDilIAgZWFybmluZ3NfYXBwMl9mCiMg4pSCICAgICAgfCAgICAgIOKUlOKUgOKUgOKUgOKUgGxhbWJkYV9lZmZfZgojIOKUgiAgICAgIHwgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgGxhbWJkYTFfdF9mCiMg4pSCICAgICAg4pSU4pSA4pSA4pSA4pSAIGludGVyZXN0X2YKIyDilJTilIDilIDilIDilIAgcHZfY29zdHNfZiAocHZfY29zdHNfZikKIyAgICAgICAg4pSc4pSA4pSA4pSA4pSAIGRlbHRhX2VkX2ZpbmFsX2YKIyAgICAgICAg4pSc4pSA4pSA4pSA4pSAIGludGVyZXN0X2YKIyAgICAgICAg4pSU4pSA4pSA4pSA4pSAIHMyX25ld19mCiMgICAgICAgIHwgICAgICDilJTilIDilIDilIDilIAgY29zdHMxX3AyX2YKIyAgICAgICAgfCAgICAgICAgICAgICDilJTilIDilIDilIDilIAgY29zdHMxX3AxX2YKIyAgICAgICAg4pSc4pSA4pSA4pSA4pSAIHMyX2YKIyAgICAgICAg4pSU4pSA4pSA4pSA4pSAIGNvc3RfcGVyX3N0dWRlbnRfZgojICAgICAgICMjICAgICAjIyMgICAgIyMjIyAgICAjIyMjIwoKCiMgQXBwcm9hY2ggMQojIE5QVl9wZV9mIC0tPiBhMV90YXhfcGUKIyAgICAg4pSU4pSA4pSA4pSA4pSAcHZfYmVuZWZfZiAtLT4gcHZfYmVuZWZfdGF4X254X2luCiMgICAgIHwgICAgIOKUnOKUgOKUgOKUgOKUgGVhcm5pbmdzX2FwcDFfZiAtLT4gZWFybmluZ3Nfbm9fZXh0X2luICogdGF4X3ZhcjEKIyAgICAgfCAgICAgfCAgICAg4pSc4pSA4pSA4pSA4pSAd2FnZV90X2YgLS0+IHdhZ2VfdF9pbgojICAgICB8ICAgICB8ICAgICB8ICAgICDilJTilIDilIDilIDilIB3YWdlXzBfZiAtLT4gd2FnZV8wX2luCiMgICAgIHwgICAgIHwgICAgIOKUnOKUgOKUgOKUgOKUgGxhbWJkYTFfaW5fZiAtLT4gbGFtYmRhMV9pbgojICAgICB8ICAgICB8ICAgICDilJTilIDilIDilIDilIBzYXR1cmF0aW9uX2luX2YgLS0+IHNhdHVyYXRpb25faW4KIyAgICAgfCAgICAg4pSU4pSA4pSA4pSA4pSAaW50ZXJlc3RfZiAtLT4gaW50ZXJlc3RfaW4KIyAgICAgfAojICAgICB8CiMgICAgIOKUlOKUgOKUgOKUgOKUgHB2X2Nvc3RzX2YgLS0+IGNvc3RzMl9pbgojICAgICAgICAgICDilJzilIDilIDilIDilIBkZWx0YV9lZF9maW5hbF9mIC0tPiBkZWx0YV9lZF9maW5hbF9pbgojICAgICAgICAgICDilJzilIDilIDilIDilIBjb3N0X3Blcl9zdHVkZW50X2YgLS0+IGNvc3RfcGVyX3N0dWRlbnRfaW4KIyAgICAgICAgICAg4pSc4pSA4pSA4pSA4pSAczJfZiAtLT4gczJfaW4KIyAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSAaW50ZXJlc3RfZiAtLT4gaW50ZXJlc3RfaW4KCgojIHVuaXQgdGVzdCBmdW5jdGlvbgp1bml0X3Rlc3RfZiA8LSBmdW5jdGlvbih0b190ZXN0X3Zhciwgb3JpZ2luYWxfdmFyLCBtYWluX3J1bl92YXIgPSBUUlVFKXsKICAgIGlmIChtYWluX3J1bl92YXIgPT0gVFJVRSkgewogICAgICAgIGlmIChsZW5ndGgodG9fdGVzdF92YXIpID4gMSkgewogICAgICAgICAgICBmYWlsc190ZXN0IDwtICggYWJzKHNkKHRvX3Rlc3RfdmFyKSAtIG9yaWdpbmFsX3ZhcikgPiAwLjAwMDEgKQogICAgICAgICAgICB0ZXh0X3ZhbCA8LSBzZCh0b190ZXN0X3ZhcikKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmYWlsc190ZXN0IDwtICggYWJzKHRvX3Rlc3RfdmFyIC0gb3JpZ2luYWxfdmFyKSA+IDAuMDAwMSApCiAgICAgICAgICAgIHRleHRfdmFsIDwtIHRvX3Rlc3RfdmFyCiAgICAgICAgfQogICAgICAgIGlmIChmYWlsc190ZXN0KSB7CiAgICAgICAgICAgIHByaW50KHBhc3RlKCJPdXRwdXQgaGFzIGNoYW5nZWQgYXQiLAogICAgICAgICAgICAgICAgICAgICAgICBkZXBhcnNlKHN1YnN0aXR1dGUodG9fdGVzdF92YXIpICksCiAgICAgICAgICAgICAgICAgICAgICAgICIgdG8gIiwgdGV4dF92YWwpICkKICAgICAgICB9CiAgICAgIH0KfQoKIyBUT0RPOiB1cGRhdGUgdmFsdWVzIG9mIHVuaXQgdGVzdCB3aXRoaW4gb25lX3J1bl9mCiMgb25lIHJ1biBvZiBhbGwgdGhlIHN0ZXBzIHRvIGdldCBvbmUgcG9saWN5IGVzdGltYXRlCm9uZV9ydW5fZiA8LQogIGZ1bmN0aW9uKG1haW5fcnVuX3ZhcjEgPSBtYWluX3J1bl9zbywKICAgICAgICAgICBydW5fc2ltX3ZhcjEgPSBydW5fc2ltX3NvLAogICAgICAgICAgIHdhZ2VfYWdfdmFyMSA9IHdhZ2VfYWdfc28sCiAgICAgICAgICAgd2FnZV93d192YXIxID0gd2FnZV93d19zbywKICAgICAgICAgICBwcm9maXRzX3NlX3ZhcjEgPSBwcm9maXRzX3NlX3NvLAogICAgICAgICAgIGhvdXJzX3NlX2NvbmRfdmFyMSA9IGhvdXJzX3NlX2NvbmRfc28sCiAgICAgICAgICAgaG91cnNfYWdfdmFyMSA9IGhvdXJzX2FnX3NvLAogICAgICAgICAgIGhvdXJzX3d3X3ZhcjEgPSBob3Vyc193d19zbywKICAgICAgICAgICBob3Vyc19zZV92YXIxID0gaG91cnNfc2Vfc28sCiAgICAgICAgICAgZXhfcmF0ZV92YXIxID0gZXhfcmF0ZV9zbywKICAgICAgICAgICBncm93dGhfcmF0ZV92YXIxID0gZ3Jvd3RoX3JhdGVfc28sCiAgICAgICAgICAgY29lZl9leHBfdmFyMSA9IGNvZWZfZXhwX3NvWzFdLAogICAgICAgICAgIGNvZWZfZXhwMl92YXIxID0gY29lZl9leHBfc29bMl0sCiAgICAgICAgICAgbGFtYmRhMV92YXIxID0gbGFtYmRhMV9pbl9mKGxhbWJkYTFfdmFyID0gbGFtYmRhMV9zbyksCiAgICAgICAgICAgcHJldmFsZW5jZV8wX3ZhcjEgPSBwcmV2YWxlbmNlXzBfc28sCiAgICAgICAgICAgcHJldmFsZW5jZV9yX3ZhcjEgPSBwcmV2YWxlbmNlX3Jfc28sCiAgICAgICAgICAgbmV3X3ByZXZsX3JfdmFyMSA9IG5ld19wcmV2YWxlbmNlX3Jfc28sCiAgICAgICAgICAgbGFtYmRhMl92YXIxID0gbGFtYmRhMl9zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgY292ZXJhZ2VfdmFyMSA9IGNvdmVyYWdlX3NvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBxX2Z1bGxfdmFyMSA9IHFfZnVsbF9zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgcV96ZXJvX3ZhcjEgPSBxX3plcm9fc28sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIGxhbWJkYTFfbmV3X3ZhcjEgPSBsYW1iZGExX25ld19zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgZ292X2JvbmRzX3ZhcjEgPSBnb3ZfYm9uZHNfc28sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIGluZmxhdGlvbl92YXIxID0gaW5mbGF0aW9uX3NvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBnb3ZfYm9uZHNfbmV3X3ZhcjEgPSBnb3ZfYm9uZHNfbmV3X3NvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgaW5mbGF0aW9uX25ld192YXIxID0gaW5mbGF0aW9uX25ld19zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBkZl9jb3N0c192YXIxID0gY29zdHNfZGF0YV9pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgc3RhZmZfdGltZV92YXIxID0gc3RhZmZfdGltZV9zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgZGVsdGFfZWRfdmFyMSA9IGRlbHRhX2VkX3NvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBkZWx0YV9lZF9leHRfdmFyMSA9IGRlbHRhX2VkX2V4dF9zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgdGVhY2hfc2FsX3ZhcjEgPSB0ZWFjaF9zYWxfc28sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIHRlYWNoX2Jlbl92YXIxID0gdGVhY2hfYmVuX3NvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBuX3N0dWRlbnRzX3ZhcjEgPSBuX3N0dWRlbnRzX3NvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICB0ZWFjaF9zYWxfbmV3X3ZhcjEgPSB0ZWFjaF9zYWxfbmV3X3NvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgdGVhY2hfYmVuX25ld192YXIxID0gdGVhY2hfYmVuX25ld19zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfdmFyMSA9IHVuaXRfY29zdF9sb2NhbF9zbywgICAgIAogICAgICAgICAgIHVuaXRfY29zdF9sb2NhbF9uZXdfdmFyMSA9IHVuaXRfY29zdF8yMDE3dXNkcHBwX3NvLAogICAgICAgICAgIG5ld19jb3N0c192YXIxID0gbmV3X2Nvc3RzX3NvLCAgICAKICAgICAgICAgICBjb3VudHJpZXNfdmFyMSA9IGNvdW50cnlfc2VsX3NvLAogICAgICAgICAgIHllYXJzX29mX3RyZWF0XzBfdmFyMSA9IHllYXJzX29mX3RyZWF0XzBfc28sCiAgICAgICAgICAgeWVhcnNfb2ZfdHJlYXRfdF92YXIxID0geWVhcnNfb2ZfdHJlYXRfdF9zbywKICAgICAgICAgICB0YXhfdmFyMSA9IHRheF9zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgcGVyaW9kc192YXIxID0gcGVyaW9kc19zbykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICMjIyMtLS0tLS0tLS0tLS0gSW5wdXRzIGZvciB3YWdlX3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdhZ2VfMF9pbiA8LSB3YWdlXzBfZigKICAgICAgd2FnZV9hZ192YXIgPSB3YWdlX2FnX3ZhcjEsCiAgICAgIHdhZ2Vfd3dfdmFyID0gd2FnZV93d192YXIxLAogICAgICBwcm9maXRzX3NlX3ZhciA9IHByb2ZpdHNfc2VfdmFyMSwKICAgICAgaG91cnNfc2VfY29uZF92YXIgPSBob3Vyc19zZV9jb25kX3ZhcjEsCiAgICAgIGhvdXJzX2FnX3ZhciA9IGhvdXJzX2FnX3ZhcjEsCiAgICAgIGhvdXJzX3d3X3ZhciA9IGhvdXJzX3d3X3ZhcjEsCiAgICAgIGhvdXJzX3NlX3ZhciA9IGhvdXJzX3NlX3ZhcjEsCiAgICAgIGV4X3JhdGVfdmFyID0gZXhfcmF0ZV92YXIxCiAgICApCiAgICB1bml0X3Rlc3RfZih3YWdlXzBfaW4sIDAuMTcwMTI0NDY2NjY0NDM2LCBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQogICAgIyMjLS0tLS0tLS0tLSBJbnB1dHMgZm9yIGVhcm5pbmdzX2FwcDFfZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdhZ2VfdF9pbiA8LSB3YWdlX3RfZigKICAgICAgd2FnZV8wX3ZhciA9IHdhZ2VfMF9pbiwKICAgICAgZ3Jvd3RoX3JhdGVfdmFyID0gZ3Jvd3RoX3JhdGVfdmFyMSwKICAgICAgY29lZl9leHAxX3ZhciA9IGNvZWZfZXhwX3ZhcjEsCiAgICAgIGNvZWZfZXhwMl92YXIgPSBjb2VmX2V4cDJfdmFyMQogICAgKQogICAgdW5pdF90ZXN0X2Yod2FnZV90X2luLCAxNy44NDY0OTQ2NzI3OTQ2LCBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQoKICAgIGxhbWJkYTFfaW4gPC0gbGFtYmRhMV9pbl9mKGxhbWJkYTFfdmFyID0gbGFtYmRhMV92YXIxKQogICAgdW5pdF90ZXN0X2YobGFtYmRhMV9pblsxXSwgMS43NDUsIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCgogICAgbGFtYmRhMV90X3RlbXAgPSBsYW1iZGFfdF9mKAogICAgICAgIGxhbWJkYTFfdmFyID0gbGFtYmRhMV9pbl9mKGxhbWJkYTFfdmFyID0gbGFtYmRhMV92YXIxKSwKICAgICAgICB5ZWFyc19vZl90cmVhdF8wX3ZhciA9IHllYXJzX29mX3RyZWF0XzBfdmFyMSwKICAgICAgICB5ZWFyc19vZl90cmVhdF90X3ZhciA9IHllYXJzX29mX3RyZWF0X3RfdmFyMSAgCiAgICAgICAgKSRsYW1iZGExX3QKCiAgICBsYW1iZGExX3ByZXZsX2luIDwtIGxhbWJkYV9lZmZfZigKICAgICAgbGFtYmRhMV92YXIgPSBsYW1iZGExX3RfdGVtcCwKICAgICAgcHJldmFsZW5jZV8wX3ZhciA9IHByZXZhbGVuY2VfMF92YXIxLAogICAgICBwcmV2YWxlbmNlX3JfdmFyID0gcHJldmFsZW5jZV9yX3ZhcjEsCiAgICAgIG90aGVyX3ByZXZsX3JfdmFyID0gbmV3X3ByZXZsX3JfdmFyMSwKICAgICAgY291bnRyeV9zZWxfdmFyID0gY291bnRyaWVzX3ZhcjEKICAgICAgKSRsYW1iZGExX2VmZl9pbgogICAgdW5pdF90ZXN0X2YobGFtYmRhMV9wcmV2bF9pblsxXSwgMC45NTA4NTgzMDYwOTY4LCBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQoKICAgIGxhbWJkYTJfaW4gPC0gbGFtYmRhMl9pbl9mKGxhbWJkYTJfdmFyID0gbGFtYmRhMl92YXIxKQogICAgdW5pdF90ZXN0X2YobGFtYmRhMl9pblsxXSwgMTAuMiAsIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCgogICAgc2F0dXJhdGlvbl9pbiA8LSBzYXR1cmF0aW9uX2luX2YoY292ZXJhZ2VfdmFyID0gY292ZXJhZ2VfdmFyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFfZnVsbF92YXIgPSBxX2Z1bGxfdmFyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFfemVyb192YXIgPSBxX3plcm9fdmFyMSkkc2F0dXJhdGlvbl9pbgogICAgdW5pdF90ZXN0X2Yoc2F0dXJhdGlvbl9pbiwgMC41MTEsIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCgoKCiAgICAjIyMtLS0tLS0tLS0tLS0gSW5wdXRzIGZvciBlYXJuaW5nc19hcHAyX2YtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgbGFtYmRhMV9uZXdfaW4gPC0gbGFtYmRhMV9uZXdfdmFyMQogICAgdW5pdF90ZXN0X2YobGFtYmRhMV9uZXdfaW4sIDc5LjUxNDY1LAogICAgICAgICAgICAgIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCiAgICBsYW1iZGExX3RfdGVtcCA9IGxhbWJkYV90X2YoCiAgICAgIGxhbWJkYTFfdmFyID0gbGFtYmRhMV9uZXdfdmFyMSwKICAgICAgeWVhcnNfb2ZfdHJlYXRfMF92YXIgPSB5ZWFyc19vZl90cmVhdF8wX3ZhcjEsCiAgICAgIHllYXJzX29mX3RyZWF0X3RfdmFyID0geWVhcnNfb2ZfdHJlYXRfdF92YXIxICAKICAgICkkbGFtYmRhMV90CiAgICBsYW1iZGExX3ByZXZsX25ld19pbiA8LSBsYW1iZGFfZWZmX2YobGFtYmRhMV92YXIgPSBsYW1iZGExX3RfdGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2YWxlbmNlXzBfdmFyID0gcHJldmFsZW5jZV8wX3ZhcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmFsZW5jZV9yX3ZhciA9IHByZXZhbGVuY2Vfcl92YXIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3ByZXZsX3JfdmFyID0gbmV3X3ByZXZsX3JfdmFyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlfc2VsX3ZhciA9IGNvdW50cmllc192YXIxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApJGxhbWJkYTFfZWZmX2luCiAgICB1bml0X3Rlc3RfZihsYW1iZGExX3ByZXZsX25ld19pblsxXSwgNDMuMzI3ODg4NDg2NDY4MSwgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKCiAgICAjIy0tLS0tLS0tLS0tLSBJbnB1dHMgZm9yIHB2X2JlbmVmX2YgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGVhcm5pbmdzMQogICAgZWFybmluZ3Nfbm9fZXh0X2luIDwtIGVhcm5pbmdzX2FwcDFfZigKICAgICAgd2FnZV92YXIgPSB3YWdlX3RfaW4sCiAgICAgIGxhbWJkYTFfdmFyID0gbGFtYmRhMV9pblsxXSwKICAgICAgbGFtYmRhMl92YXIgPSAwLAogICAgICBzYXR1cmF0aW9uX3ZhciA9IHNhdHVyYXRpb25faW4sCiAgICAgIGNvdmVyYWdlX3ZhciA9IGNvdmVyYWdlX3ZhcjEKICAgICkKICAgIGVhcm5pbmdzX3llc19leHRfaW4gPC0gZWFybmluZ3NfYXBwMV9mKAogICAgICB3YWdlX3ZhciA9IHdhZ2VfdF9pbiwKICAgICAgbGFtYmRhMV92YXIgPSBsYW1iZGExX2luWzFdLAogICAgICBsYW1iZGEyX3ZhciA9IGxhbWJkYTJfaW5bMV0sCiAgICAgIHNhdHVyYXRpb25fdmFyID0gc2F0dXJhdGlvbl9pbiwKICAgICAgY292ZXJhZ2VfdmFyID0gY292ZXJhZ2VfdmFyMQogICAgKQoKICAgICMgZWFybmluZ3MxIHdpdGggcHJldmFsZW5jZQogICAgZWFybmluZ3Nfbm9fZXh0X3ByZXZsX2luIDwtIGVhcm5pbmdzX2FwcDFfZigKICAgICAgd2FnZV92YXIgPSB3YWdlX3RfaW4sCiAgICAgIGxhbWJkYTFfdmFyID0gbGFtYmRhMV9wcmV2bF9pblsxXSwKICAgICAgbGFtYmRhMl92YXIgPSAwLAogICAgICBzYXR1cmF0aW9uX3ZhciA9IHNhdHVyYXRpb25faW4sCiAgICAgIGNvdmVyYWdlX3ZhciA9IGNvdmVyYWdlX3ZhcjEKICAgICkKICAgIGVhcm5pbmdzX3llc19leHRfcHJldmxfaW4gPC0gZWFybmluZ3NfYXBwMV9mKAogICAgICB3YWdlX3ZhciA9IHdhZ2VfdF9pbiwKICAgICAgbGFtYmRhMV92YXIgPSBsYW1iZGExX3ByZXZsX2luWzFdLAogICAgICBsYW1iZGEyX3ZhciA9IGxhbWJkYTJfaW5bMV0sCiAgICAgIHNhdHVyYXRpb25fdmFyID0gc2F0dXJhdGlvbl9pbiwKICAgICAgY292ZXJhZ2VfdmFyID0gY292ZXJhZ2VfdmFyMQogICAgKQoKICAgICMgZWFybmluZ3MyCiAgICBlYXJuaW5nc19ub19leHRfbmV3X2luIDwtIGVhcm5pbmdzX2FwcDJfZih0X3ZhciA9IDA6NTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTFrMV92YXIgPSBsYW1iZGExX25ld19pblsxXSkKICAgICMgZWFybmluZ3MyIHdpdGggcHJldmFsZW5jZQogICAgZWFybmluZ3Nfbm9fZXh0X3ByZXZsX25ld19pbiA8LSBlYXJuaW5nc19hcHAyX2YodF92YXIgPSAwOjUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGExazFfdmFyID0gbGFtYmRhMV9wcmV2bF9uZXdfaW5bMV0pCgogICAgIyBpbnRlcmVzdCByYXRlIE5FRUQgVE8gVVBEQVRFIFRPIEVYQUNUIFJFU1VMVAogICAgaW50ZXJlc3RfaW4gPC0gaW50ZXJlc3RfZihnb3ZfYm9uZHNfdmFyID0gZ292X2JvbmRzX3ZhcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGlvbl92YXIgPSBpbmZsYXRpb25fdmFyMSkkaW50ZXJlc3RfaW4KICAgIHVuaXRfdGVzdF9mKGVhcm5pbmdzX25vX2V4dF9pbiwgMzEuMTQyMTMzMjA0MDI2NiwKICAgICAgICAgICAgICBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQogICAgdW5pdF90ZXN0X2YoZWFybmluZ3NfeWVzX2V4dF9pbiwgMTY3LjY2NzgxNzQ1MDkwNSwKICAgICAgICAgICAgICBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQogICAgdW5pdF90ZXN0X2YoZWFybmluZ3Nfbm9fZXh0X3ByZXZsX2luLCAxNi45Njk0ODc2OTQzNDA2LAogICAgICAgICAgICAgIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCiAgICB1bml0X3Rlc3RfZihlYXJuaW5nc195ZXNfZXh0X3ByZXZsX2luLCAxNTMuNDk1MTcxOTQxMjE5LAogICAgICAgICAgICAgIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpICAgIAogICAgdW5pdF90ZXN0X2YoaW50ZXJlc3RfaW4sIDAuMDk4NSwgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKCiAgICAjIy0tLS0tLS0tLS0tLS0tIElucHV0cyBmb3IgY29zdHMyX2YtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIE1ha2UgZXhwbGljaXQgbm9uLWZ1bmN0aW9uIGlucHV0czoKICAgIGRlbHRhX2VkX2ZpbmFsX2luIDwtIGRlbHRhX2VkX2ZpbmFsX2YoaW5jbHVkZV9leHRfdmFyID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhX2VkX3ZhciA9IGRlbHRhX2VkX3ZhcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhX2VkX2V4dF92YXIgPSBkZWx0YV9lZF9leHRfdmFyMSkKICAgIHVuaXRfdGVzdF9mKGRlbHRhX2VkX2ZpbmFsX2luLCAwLjAxMTM0ODE5LCBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQoKICAgIGRlbHRhX2VkX2ZpbmFsX3hfaW4gPC0gZGVsdGFfZWRfZmluYWxfZigKICAgICAgaW5jbHVkZV9leHRfdmFyID0gVFJVRSwKICAgICAgZGVsdGFfZWRfdmFyID0gZGVsdGFfZWRfdmFyMSwKICAgICAgZGVsdGFfZWRfZXh0X3ZhciA9IGRlbHRhX2VkX2V4dF92YXIxCiAgICApCiAgICB1bml0X3Rlc3RfZihkZWx0YV9lZF9maW5hbF94X2luLCAgMC4wNTkxMTc2NSwgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKCiAgICBpbnRlcmVzdF9pbiA8LSBpbnRlcmVzdF9mKGdvdl9ib25kc192YXIgPSBnb3ZfYm9uZHNfdmFyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbGF0aW9uX3ZhciA9IGluZmxhdGlvbl92YXIxKSRpbnRlcmVzdF9pbgogICAgdW5pdF90ZXN0X2YoaW50ZXJlc3RfaW4sIDAuMDk4NSwgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKCiAgICBpbnRlcmVzdF9uZXdfaW4gPC0gaW50ZXJlc3RfZigKICAgICAgZ292X2JvbmRzX3ZhciA9IGdvdl9ib25kc19uZXdfdmFyMSwKICAgICAgaW5mbGF0aW9uX3ZhciA9IGluZmxhdGlvbl9uZXdfdmFyMSkkaW50ZXJlc3RfaW4KCiAgICBjb3N0X3Blcl9zdHVkZW50X2luIDwtICBjb3N0X3Blcl9zdHVkZW50X2YodGVhY2hfc2FsX3ZhciA9IHRlYWNoX3NhbF92YXIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYWNoX2Jlbl92YXIgPSB0ZWFjaF9iZW5fdmFyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX3N0dWRlbnRzX3ZhciA9IG5fc3R1ZGVudHNfdmFyMSkKICAgIHVuaXRfdGVzdF9mKGNvc3RfcGVyX3N0dWRlbnRfaW4sICAxMTYuODU0OSwgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKCgoKICAgIGNvc3RfcGVyX3N0dWRlbnRfbmV3X2luIDwtIGNvc3RfcGVyX3N0dWRlbnRfZigKICAgICAgdGVhY2hfc2FsX3ZhciA9IHRlYWNoX3NhbF9uZXdfdmFyMSwKICAgICAgdGVhY2hfYmVuX3ZhciA9IHRlYWNoX2Jlbl9uZXdfdmFyMSwKICAgICAgbl9zdHVkZW50c192YXIgPSBuX3N0dWRlbnRzX3ZhcjEKICAgICkKCiAgICBzMl9pbiA8LSBzMl9mKAogICAgICB1bml0X2Nvc3RfbG9jYWxfdmFyID0gdW5pdF9jb3N0X2xvY2FsX3ZhcjEsCiAgICAgIGV4X3JhdGVfdmFyID0gZXhfcmF0ZV92YXIxLAogICAgICB5ZWFyc19vZl90cmVhdF92YXIgPSB5ZWFyc19vZl90cmVhdF8wX3ZhcjEKICAgICkKICAgIHVuaXRfdGVzdF9mKHMyX2luLCAxLjQyMTksIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCiAgICAjLS0tLS0tLS0tLS0tLS0tIElucHV0cyBmb3IgTlBWX3BlX2YtLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBNYWtlIGV4cGxpY2l0IG5vbi1mdW5jdGlvbiBpbnB1dHM6CiAgICAjQmVuZWZpdHM6CiAgICAjQmFpcmQgdy90YXggYW5kIG5vIGV4dGVybmFsaXRpZXMgKG5vIGV4dCkKICAgIHB2X2JlbmVmX3RheF9ueF9pbiA8LSBwdl9iZW5lZl9mKAogICAgICBlYXJuaW5nc192YXIgPSBlYXJuaW5nc19ub19leHRfaW4gKiB0YXhfdmFyMSwKICAgICAgaW50ZXJlc3Rfcl92YXIgPSBpbnRlcmVzdF9pbiwKICAgICAgcGVyaW9kc192YXIgPSBwZXJpb2RzX3ZhcjEKICAgICkKICAgIHVuaXRfdGVzdF9mKHB2X2JlbmVmX3RheF9ueF9pbiwgMjMuNjA3MDg5MzM3ODc4NCwKICAgICAgICAgICAgICBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQogICAgI0JhaXJkIHcvdCBhbmQgZXh0CiAgICBwdl9iZW5lZl90YXhfeXhfaW4gPC0gcHZfYmVuZWZfZigKICAgICAgZWFybmluZ3NfdmFyID0gZWFybmluZ3NfeWVzX2V4dF9pbiAqIHRheF92YXIxLAogICAgICBpbnRlcmVzdF9yX3ZhciA9IGludGVyZXN0X2luLAogICAgICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfdmFyMQogICAgKQogICAgdW5pdF90ZXN0X2YocHZfYmVuZWZfdGF4X3l4X2luLCAxMjcuMDk5NDg2NzIxNywgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKICAgICNCYWlyZCBhbGwgYW5kIG5vCiAgICBwdl9iZW5lZl9hbGxfbnhfaW4gPC0gcHZfYmVuZWZfZigKICAgICAgZWFybmluZ3NfdmFyID0gZWFybmluZ3Nfbm9fZXh0X2luLAogICAgICBpbnRlcmVzdF9yX3ZhciA9IGludGVyZXN0X2luLAogICAgICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfdmFyMQogICAgKQogICAgdW5pdF90ZXN0X2YocHZfYmVuZWZfYWxsX254X2luLCAxNDIuNDI1ODc4MzU4MjQsIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCiAgICAjQmFpcmQgYWxsIGFuZCBubyBleHQgKyBwcmV2YWxlbmNlCiAgICBwdl9iZW5lZl9hbGxfbnhfcHJldmxfaW4gPC0gcHZfYmVuZWZfZigKICAgICAgZWFybmluZ3NfdmFyID0gZWFybmluZ3Nfbm9fZXh0X3ByZXZsX2luLAogICAgICBpbnRlcmVzdF9yX3ZhciA9IGludGVyZXN0X2luLAogICAgICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfdmFyMQogICAgKQogICAgdW5pdF90ZXN0X2YocHZfYmVuZWZfYWxsX254X3ByZXZsX2luLCA3Ny42MDg0OTgyNDY0NjMsIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCiAgICAjQmFpcmQgYWxsIGFuZCBleHQKICAgIHB2X2JlbmVmX2FsbF95eF9pbiA8LSBwdl9iZW5lZl9mKAogICAgICBlYXJuaW5nc192YXIgPSBlYXJuaW5nc195ZXNfZXh0X2luLAogICAgICBpbnRlcmVzdF9yX3ZhciA9IGludGVyZXN0X2luLAogICAgICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfdmFyMQogICAgKQogICAgdW5pdF90ZXN0X2YocHZfYmVuZWZfYWxsX3l4X2luLCA3NjYuODE0Mzk5NTI3NjA0LAogICAgICAgICAgICAgIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCiAgICAjQmFpcmQgYWxsIGFuZCBleHQKICAgIHB2X2JlbmVmX2FsbF95eF9wcmV2bF9pbiA8LSBwdl9iZW5lZl9mKAogICAgICBlYXJuaW5nc192YXIgPSBlYXJuaW5nc195ZXNfZXh0X3ByZXZsX2luLAogICAgICBpbnRlcmVzdF9yX3ZhciA9IGludGVyZXN0X2luLAogICAgICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfdmFyMQogICAgKQogICAgdW5pdF90ZXN0X2YocHZfYmVuZWZfYWxsX3l4X3ByZXZsX2luLCA3MDEuOTk3MDE5NDE1ODI3LAogICAgICAgICAgICAgIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCgogICAgI0tMUFM0IHcvdCBhbmQgbm8gZXh0CiAgICBwdl9iZW5lZl90YXhfbmV3X2luIDwtIHB2X2JlbmVmX2YoCiAgICAgIGVhcm5pbmdzX3ZhciA9IGVhcm5pbmdzX25vX2V4dF9uZXdfaW4gKiB0YXhfdmFyMSwKICAgICAgaW50ZXJlc3Rfcl92YXIgPSBpbnRlcmVzdF9uZXdfaW4sCiAgICAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc192YXIxCiAgICApCiAgICB1bml0X3Rlc3RfZihwdl9iZW5lZl90YXhfbmV3X2luLCA4OC4xODIwMTk5NTY5ODE0LAogICAgICAgICAgICAgIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCgogICAgIyBLTFBTNCBhbGwgYW5kIG5vIGV4dAogICAgcHZfYmVuZWZfYWxsX25ld19pbiA8LSBwdl9iZW5lZl9mKGVhcm5pbmdzX3ZhciA9IGVhcm5pbmdzX25vX2V4dF9uZXdfaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3Rfcl92YXIgPSBpbnRlcmVzdF9uZXdfaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kc192YXIgPSBwZXJpb2RzX3ZhcjEpCiAgICB1bml0X3Rlc3RfZihwdl9iZW5lZl9hbGxfbmV3X2luLCA1MzIuMDE4MjE5OTUxNjIyLCBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQogICAgIyBLTFBTNCBhbGwgYW5kIG5vIGV4dCArIHByZXZhbGVuY2UKICAgIHB2X2JlbmVmX2FsbF9wcmV2bF9uZXdfaW4gPC0gcHZfYmVuZWZfZihlYXJuaW5nc192YXIgPSBlYXJuaW5nc19ub19leHRfcHJldmxfbmV3X2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfbmV3X2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc192YXIxKQogICAgdW5pdF90ZXN0X2YocHZfYmVuZWZfYWxsX3ByZXZsX25ld19pbiwgMjg5Ljg5OTEwNzk4NjE3OCwgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKICAgICNDb3N0cyBhc2QKICAgICMgY29zdHMxOiBFQSBjb3N0cyBubyBleHRlcm5hbGl0aWVzCiAgICBjb3N0MV9pbiA8LSBjb3N0czFfcDJfZihjb3VudHJ5X3RvdGFsX3ZhciA9IGRmX2Nvc3RzX3ZhcjEkdG90YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5X2Nvc3RfdmFyID0gZGZfY29zdHNfdmFyMSRjb3N0c19ieV9jb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZmZfdGltZV92YXIgPSBzdGFmZl90aW1lX3ZhcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5X25hbWVfdmFyID0gZGZfY29zdHNfdmFyMSRDb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0X3ZhciA9IGNvdW50cmllc192YXIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfY29zdHNfdmFyID0gbmV3X2Nvc3RzX3ZhcjEpCiAgICB1bml0X3Rlc3RfZihjb3N0MV9pbiwgIDAuMDg0ODA2ODYsCiAgICAgICAgICAgICAgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKICAgICMgczJfZWFfaW4gPC0tIGNvc3QxX2luIChjb3N0czFfcDJfZikgPC0tIGNvc3RfZGF0YSAoY29zdHMxX3AxX2YoKSkKICAgIHMyX2VhX2luIDwtIHMyX25ld19mKGludGVyZXN0X3ZhciA9IGludGVyZXN0X25ld19pbiwKICAgICAgICAgICAgICAgICAgICAgIHVuaXRfY29zdF9sb2NhbF92YXIgPSBjb3N0MV9pbiwKICAgICAgICAgICAgICAgICAgICAgIGV4X3JhdGVfdmFyID0gMSwKICAgICAgICAgICAgICAgICAgICAgIHllYXJfb2ZfdHJlYXRfdmFyID0geWVhcnNfb2ZfdHJlYXRfdF92YXIxKQogICAgdW5pdF90ZXN0X2YoczJfZWFfaW4sICAwLjE5NjM0NDIyOTY4OTkxLCBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQogICAgY29zdHMyX2VhX2luIDwtIHB2X2Nvc3RzX2YoCiAgICAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc192YXIxLAogICAgICBkZWx0YV9lZF92YXIgPSBkZWx0YV9lZF9maW5hbF9pbiwKICAgICAgaW50ZXJlc3Rfcl92YXIgPSBpbnRlcmVzdF9uZXdfaW4sCiAgICAgIGNvc3Rfb2Zfc2Nob29saW5nX3ZhciA9IDAsCiAgICAgIHMxX3ZhciA9IDAsCiAgICAgIHExX3ZhciA9IDAsCiAgICAgIHMyX3ZhciA9IHMyX2VhX2luLAogICAgICBxMl92YXIgPSBxX2Z1bGxfdmFyMQogICAgKQogICAgdW5pdF90ZXN0X2YoY29zdHMyX2VhX2luLCAgMC4xNDcyNTgxNzIyNjc0MzMsIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCiAgICAjIGNvc3RzMjogQmFpcmQgbm8gZXh0ZXJuYWxpdGllcwogICAgY29zdHMyX2luIDwtIHB2X2Nvc3RzX2YoCiAgICAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc192YXIxLAogICAgICBkZWx0YV9lZF92YXIgPSBkZWx0YV9lZF9maW5hbF9pbiwKICAgICAgaW50ZXJlc3Rfcl92YXIgPSBpbnRlcmVzdF9pbiwKICAgICAgY29zdF9vZl9zY2hvb2xpbmdfdmFyID0gY29zdF9wZXJfc3R1ZGVudF9pbiwKICAgICAgczFfdmFyID0gMCwKICAgICAgcTFfdmFyID0gcV96ZXJvX3ZhcjEsCiAgICAgIHMyX3ZhciA9IHMyX2luLAogICAgICBxMl92YXIgPSBxX2Z1bGxfdmFyMQogICAgKQogICAgdW5pdF90ZXN0X2YoY29zdHMyX2luLCAxMS43NzYxODgxMTg5ODgsIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCmVhcm5pbmdzX25vX2V4dF9pbgogICAgIyBCYWlyZCB5ZXMgZXh0ZXJuYWxpdGllcwogICAgY29zdHMyX3hfaW4gPC0gcHZfY29zdHNfZigKICAgICAgcGVyaW9kc192YXIgPSBwZXJpb2RzX3ZhcjEsCiAgICAgIGRlbHRhX2VkX3ZhciA9IGRlbHRhX2VkX2ZpbmFsX3hfaW4sCiAgICAgIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfaW4sCiAgICAgIGNvc3Rfb2Zfc2Nob29saW5nX3ZhciA9IGNvc3RfcGVyX3N0dWRlbnRfaW4sCiAgICAgIHMxX3ZhciA9IDAsCiAgICAgIHExX3ZhciA9IHFfemVyb192YXIxLAogICAgICBzMl92YXIgPSBzMl9pbiwKICAgICAgcTJfdmFyID0gcV9mdWxsX3ZhcjEKICAgICkKICAgIHVuaXRfdGVzdF9mKGNvc3RzMl94X2luLCAgMjUuMTk2MjEzMDU1OTg5NCwgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKCiAgICBzMl9uZXdfaW4gPC0gczJfbmV3X2YoaW50ZXJlc3RfdmFyID0gaW50ZXJlc3RfbmV3X2luLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRfY29zdF9sb2NhbF92YXIgPSB1bml0X2Nvc3RfbG9jYWxfbmV3X3ZhcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhfcmF0ZV92YXIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIHllYXJfb2ZfdHJlYXRfdmFyID0geWVhcnNfb2ZfdHJlYXRfdF92YXIxKQogICAgIyBjb3N0czI6IEtMUFM0CiAgICBjb3N0c19hMl9pbiA8LSBwdl9jb3N0c19mKAogICAgICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfdmFyMSwKICAgICAgZGVsdGFfZWRfdmFyID0gZGVsdGFfZWRfZmluYWxfaW4sCiAgICAgIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfbmV3X2luLAogICAgICBjb3N0X29mX3NjaG9vbGluZ192YXIgPSBjb3N0X3Blcl9zdHVkZW50X25ld19pbiwKICAgICAgczFfdmFyID0gMCwKICAgICAgcTFfdmFyID0gcV96ZXJvX3ZhcjEsCiAgICAgIHMyX3ZhciA9IHMyX25ld19pbiwKICAgICAgcTJfdmFyID0gcV9mdWxsX3ZhcjEKICAgICkKICAgIHVuaXRfdGVzdF9mKGNvc3RzX2EyX2luLCAzMi4yOTc3NTQ2MTEwMzQ0LCBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQogICAgcmV0dXJuKCBsaXN0KAogICAgICAid2FnZV8wX2luIiA9IHdhZ2VfMF9pbiwKICAgICAgIndhZ2VfdF9pbiIgPSB3YWdlX3RfaW4sCiAgICAgICJsYW1iZGExX2luIiA9IGxhbWJkYTFfaW4sCiAgICAgICJsYW1iZGExX3ByZXZsX2luIiA9IGxhbWJkYTFfcHJldmxfaW4sCiAgICAgICJsYW1iZGEyX2luIiA9IGxhbWJkYTJfaW4sCiAgICAgICJzYXR1cmF0aW9uX2luIiA9IHNhdHVyYXRpb25faW4sCiAgICAgICJsYW1iZGExX25ld19pbiIgPSBsYW1iZGExX25ld19pbiwKICAgICAgImxhbWJkYTFfcHJldmxfbmV3X2luIiA9IGxhbWJkYTFfcHJldmxfbmV3X2luLAogICAgICAiZWFybmluZ3Nfbm9fZXh0X2luIiA9IGVhcm5pbmdzX25vX2V4dF9pbiwKICAgICAgImVhcm5pbmdzX25vX2V4dF9wcmV2bF9pbiIgPSBlYXJuaW5nc19ub19leHRfcHJldmxfaW4sCiAgICAgICJlYXJuaW5nc195ZXNfZXh0X2luIiA9IGVhcm5pbmdzX3llc19leHRfaW4sCiAgICAgICJlYXJuaW5nc195ZXNfZXh0X3ByZXZsX2luIiA9IGVhcm5pbmdzX3llc19leHRfcHJldmxfaW4sCiAgICAgICJlYXJuaW5nc19ub19leHRfbmV3X2luIiA9IGVhcm5pbmdzX25vX2V4dF9uZXdfaW4sCiAgICAgICJlYXJuaW5nc19ub19leHRfcHJldmxfbmV3X2luIiA9IGVhcm5pbmdzX25vX2V4dF9wcmV2bF9uZXdfaW4sCiAgICAgICJpbnRlcmVzdF9pbiIgPSBpbnRlcmVzdF9pbiwKICAgICAgImNvc3RzMV9jb3VudHJ5X2luIiA9IGNvc3RzX2RhdGFfaW4sCiAgICAgICJkZWx0YV9lZF9maW5hbF9pbiIgPSBkZWx0YV9lZF9maW5hbF9pbiwKICAgICAgImRlbHRhX2VkX2ZpbmFsX3hfaW4iID0gZGVsdGFfZWRfZmluYWxfeF9pbiwKICAgICAgImNvc3RfcGVyX3N0dWRlbnRfaW4iID0gY29zdF9wZXJfc3R1ZGVudF9pbiwKICAgICAgInMyX2luIiA9IHMyX2luLAogICAgICAicHZfYmVuZWZfdGF4X254X2luIiA9IHB2X2JlbmVmX3RheF9ueF9pbiwKICAgICAgInB2X2JlbmVmX3RheF95eF9pbiIgPSBwdl9iZW5lZl90YXhfeXhfaW4sCiAgICAgICJwdl9iZW5lZl9hbGxfbnhfaW4iID0gcHZfYmVuZWZfYWxsX254X2luLAogICAgICAicHZfYmVuZWZfYWxsX254X3ByZXZsX2luIiA9IHB2X2JlbmVmX2FsbF9ueF9wcmV2bF9pbiwKICAgICAgInB2X2JlbmVmX2FsbF95eF9pbiIgPSAgcHZfYmVuZWZfYWxsX3l4X2luLAogICAgICAicHZfYmVuZWZfYWxsX3l4X3ByZXZsX2luIiA9IHB2X2JlbmVmX2FsbF95eF9wcmV2bF9pbiwKICAgICAgInB2X2JlbmVmX3RheF9uZXdfaW4iID0gcHZfYmVuZWZfdGF4X25ld19pbiwKICAgICAgInB2X2JlbmVmX2FsbF9uZXdfaW4iID0gcHZfYmVuZWZfYWxsX25ld19pbiwKICAgICAgInB2X2JlbmVmX2FsbF9wcmV2bF9uZXdfaW4iID0gcHZfYmVuZWZfYWxsX3ByZXZsX25ld19pbiwKICAgICAgImNvc3RzMl9lYV9pbiIgPSBjb3N0czJfZWFfaW4sCiAgICAgICJjb3N0czJfaW4iID0gY29zdHMyX2luLAogICAgICAiY29zdHMyX3hfaW4iID0gY29zdHMyX3hfaW4sCiAgICAgICJjb3N0c19hMl9pbiIgPSBjb3N0c19hMl9pbiwKICAgICAgImNvc3QxX2luIiA9IGNvc3QxX2luCiAgICApICkKICB9CgppbnZpc2libGUoIGxpc3QyZW52KG9uZV9ydW5fZigpLC5HbG9iYWxFbnYpICkKCiMgIHJldHVybiggc2FwcGx5KCBscyhwYXR0ZXJuPSAiX2luXFxiIiksIGZ1bmN0aW9uKHgpIGdldCh4KSkgKQoKI30KYGBgCgpgYGB7ciBtYWluLXJlc3VsdHMsIHB1cmw9RkFMU0UsIGVjaG89cHJpbnRfY29kZX0KI0JhaXJkIDE6IENvc3RzID0gQmFpcmQgdy90YXggYW5kIG5vIGV4dGVybmFsaXRpZXMgKG5vIGV4dCk7CiNCZW5lZiA9IEJhaXJkIG5vIGV4dAphMV90YXhfcGUgPC0gTlBWX3BlX2YoYmVuZWZpdHNfdmFyID0gcHZfYmVuZWZfdGF4X254X2luLCBjb3N0c192YXIgPSBjb3N0czJfaW4pCnVuaXRfdGVzdF9mKGExX3RheF9wZSwgMTEuODMwOTAxMjE4ODkwNCkKI0JhaXJkIDI6IENvc3RzID0gQmFpcmQgdy90YXggYW5kIHllcyBleHRlcm5hbGl0aWVzIChubyBleHQpOwojQmVuZWYgPSBCYWlyZCB5ZXMgZXh0CmExX3hfdGF4X3BlIDwtIE5QVl9wZV9mKGJlbmVmaXRzX3ZhciA9IHB2X2JlbmVmX3RheF95eF9pbiwgY29zdHNfdmFyID0gY29zdHMyX3hfaW4pCnVuaXRfdGVzdF9mKGExX3hfdGF4X3BlLCAxMDEuOTAzMjczNjY1NzExKQojIEJhaXJkIDM6IEJlbmVmaXRzID0gQmFpcmQgYWxsIGFuZCBubyBleHQ7IENvc3RzID0gQmFpcmQgbm8gZXh0CmExX2FsbF9wZSA8LSBOUFZfcGVfZihiZW5lZml0c192YXIgPSBwdl9iZW5lZl9hbGxfbnhfaW4sIGNvc3RzX3ZhciA9IGNvc3RzMl9pbikKdW5pdF90ZXN0X2YoYTFfYWxsX3BlLCAxMzAuNjQ5NjkwMjM5MjUyKQojIEJhaXJkIDQ6IEJlbmVmaXRzID0gQmFpcmQgYWxsIGFuZCB5ZXMgZXh0OyBDb3N0cyA9IEJhaXJkIHllcyBleHQKYTFfeF9hbGxfcGUgPC0gTlBWX3BlX2YoYmVuZWZpdHNfdmFyID0gcHZfYmVuZWZfYWxsX3l4X2luLCBjb3N0c192YXIgPSBjb3N0czJfeF9pbikKdW5pdF90ZXN0X2YoYTFfeF9hbGxfcGUsIDc0MS42MTgxODY0NzE2MTUpCgojS0xQUzRfMTogYmVuZWZpdHMgPSBLTFBTNCB3L3QgYW5kIG5vIGV4dDsgQ29zdHMgPQlCYWlyZCBubyBleHQKa2xwczRfMV9wZSA8LSBOUFZfcGVfZihiZW5lZml0c192YXIgPSBwdl9iZW5lZl90YXhfbmV3X2luLCBjb3N0c192YXIgPSBjb3N0c19hMl9pbikKdW5pdF90ZXN0X2Yoa2xwczRfMV9wZSwgNTUuODg0MjY1MzQ1OTQ3KQojS0xQUzRfMjpiZW5lZml0cyA9IEtMUFM0IGFsbCBhbmQgbm8gZXh0OyBDb3N0cyA9CUJhaXJkIG5vIGV4dAprbHBzNF8yX3BlIDwtIE5QVl9wZV9mKGJlbmVmaXRzX3ZhciA9IHB2X2JlbmVmX2FsbF9uZXdfaW4sIGNvc3RzX3ZhciA9IGNvc3RzX2EyX2luKQp1bml0X3Rlc3RfZihrbHBzNF8yX3BlLCA0OTkuNzIwNDY1MzQwNTg4KQoKIyBFQTE6IG5vIGV4dGVybmFsaXR5IE5QViB1c2luZyBFQXMgY29zdHMKZWExX3BlIDwtIE5QVl9wZV9mKGJlbmVmaXRzX3ZhciA9IHB2X2JlbmVmX2FsbF9ueF9wcmV2bF9pbiwgY29zdHNfdmFyID0gY29zdHMyX2VhX2luKQp1bml0X3Rlc3RfZihlYTFfcGUsIDc3LjQ2MTI0MDA3NDE5NTUpCiMgRUEyOiB5ZXMgZXh0ZXJuYWxpdHkgTlBWIHVzaW5nIEVBcyBjb3N0cwplYTJfcGUgPC0gTlBWX3BlX2YoYmVuZWZpdHNfdmFyID0gcHZfYmVuZWZfYWxsX3l4X3ByZXZsX2luLCBjb3N0c192YXIgPSBjb3N0czJfZWFfaW4pCnVuaXRfdGVzdF9mKGVhMl9wZSwgNzAxLjg0OTc2MTI0MzU1OSkKIyBFQTM6IGJlbmVmPSBLTFBTIGFsbCBhbmQgbm8gZXh0OyBDb3N0cz1FQQplYTNfcGUgPC0gTlBWX3BlX2YoYmVuZWZpdHNfdmFyID0gcHZfYmVuZWZfYWxsX3ByZXZsX25ld19pbiwgY29zdHNfdmFyID0gY29zdHMyX2VhX2luKQp1bml0X3Rlc3RfZihlYTNfcGUsIDI4OS43NTE4NDk4MTM5MTEpCmBgYAoKPC9kZXRhaWxzPgoKfCBBcHByb2FjaCAgICB8IEJlbmVmaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ29zdHMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBOUFYKfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CnwgMS4xIHwgQGJhaXJkMjAxNndvcm1zIHcvdGF4IGFuZCBubyBleHRlcm5hbGl0aWVzIChubyBleHQpIHwgIFRyZWF0bWVudCwgRWR1Y2F0aW9uICAgICAgICAgIHwgYHIgcm91bmQoYTFfdGF4X3BlLCAxKWAgICB8CnwgMS4yIHwgQGJhaXJkMjAxNndvcm1zIHcvdCBhbmQgZXh0ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgVHJlYXRtZW50LCBFZHVjYXRpb24gKHcvZXh0KXwgYHIgcm91bmQoYTFfeF90YXhfcGUsIDEpYCB8CnwgMS4zIHwgQGJhaXJkMjAxNndvcm1zICBhbGwgYW5kIG5vIGV4dCAgICAgICAgICAgICAgICAgICAgIHwgIFRyZWF0bWVudCwgRWR1Y2F0aW9uICAgICAgICAgIHwgYHIgcm91bmQoYTFfYWxsX3BlLCAxKWAgICB8CnwgMS40IHwgQGJhaXJkMjAxNndvcm1zIGFsbCBhbmQgZXh0ICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFRyZWF0bWVudCwgRWR1Y2F0aW9uICh3L2V4dCkgIHwgYHIgcm91bmQoYTFfeF9hbGxfcGUsIDEpYCB8CnwgMi4xIHwgQGtscHM0ICB3L3QgYW5kIG5vIGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFRyZWF0bWVudCwgRWR1Y2F0aW9uICAgICAgICAgIHwgYHIgcm91bmQoa2xwczRfMV9wZSwgMSlgICB8CnwgMi4yIHwgQGtscHM0ICBhbGwgYW5kIG5vIGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFRyZWF0bWVudCwgRWR1Y2F0aW9uICAgICAgICAgIHwgYHIgcm91bmQoa2xwczRfMl9wZSwgMSlgICB8CnwgMy4xIHwgMS4zICsgcHJldmFsZW5jZSArIGxlbmd0aCBvZiB0cmVhdG1lbnQgICAgICAgICAgICAgIHwgVHJlYXRtZW50IChFQSkgICAgICAgICAgICAgICAgIHwgYHIgcm91bmQoZWExX3BlLCAxKWAgICAgICB8CnwgMy4yIHwgMS40ICsgcHJldmFsZW5jZSArIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVHJlYXRtZW50IChFQSkgICAgICAgICAgICAgICAgIHwgYHIgcm91bmQoZWEyX3BlLCAxKWAgICAgICB8CnwgKiozLjMqKiAgICB8ICoqMi4yICsgcHJldmFsZW5jZSArIGxlbmd0aCoqICAgICAgICAgICAgICAgIHwgKipUcmVhdG1lbnQgKEVBKSAgKiogICAgICAgICAgIHwgKipgciByb3VuZChlYTNfcGUsIDEpYCoqICB8ICAKCgoKCgo8YnI+CmBgYHtyIGdlbmVyYXRlLXBsb3QtZnVuY3Rpb24sIHB1cmwgPSBUUlVFLCBlY2hvID0gRkFMU0V9CiMgZ2VuZXJhdGVfcGxvdF9mOiBmdW5jdGlvbiB0byBnZW5lcmF0ZSBwbG90cyBmb3IgYm90aCBEeW5hbWljIERvY3VtZW50IGFuZAojIHNoaW55IGFwcC4gSXQgdGFrZXMgaW4gdGhlIHNpbXVsYXRlZCBkYXRhLCBwb2xpY3kgZXN0aW1hdGUgdGV4dCwgYW5kIHJlc2NhbGUKIyB2YXJpYWJsZS4gVGhlc2UgYXJlIGludGVybWVkaWFyeSB2YXJpYWJsZXMgdG8gZXhjbHVkZSB0aGUgaW50ZXJhY3Rpdml0eSBvZgojIHNoaW55IGFwcCBmcm9tIHRoZSBwbG90IGdlbmVyYXRpb24gcHJvY2Vzcy4gIApjaHVua19nZW5lcmF0ZV9wbG90IDwtIGZ1bmN0aW9uKCkgewogIGdlbmVyYXRlX3Bsb3RfZiA8LSBmdW5jdGlvbihucHZfYWxsX3NpbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5X2VzdGltYXRlc190ZXh0X3NlbGVjdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNjYWxlKXsKICAgIHRvdGFsX3RpbWVfc2ltIDwtIG5wdl9hbGxfc2ltJHRvdGFsX3RpbWVfc2ltCiAgICBwb3NpdGlvbiA8LSB3aGljaCggcG9saWN5X2VzdGltYXRlc190ZXh0ID09IHBvbGljeV9lc3RpbWF0ZXNfdGV4dF9zZWxlY3RlZCkKICAgIG5wdl9zaW0gPC0gbnB2X2FsbF9zaW1bWyBwb2xpY3lfZXN0aW1hdGVzX3Zhcm5hbWVzW3Bvc2l0aW9uXSBdXSAgICAKICAgIG5wdl9mb3JfdGV4dCA8LSBwYXN0ZSgiTWVkaWFuIE5QVjogIiwgcm91bmQobWVkaWFuKG5wdl9zaW0pLCAyKSkKICAgIG5wdl9mb3JfdGV4dDIgPC0gcGFzdGUoIlNEIE5QVjogIiwgcm91bmQoc2QobnB2X3NpbSksIDIpKQogICAgcGxvdDEgPC0gZ2dwbG90KCkgKwogICAgICBnZW9tX2RlbnNpdHkoCiAgICAgICAgYWVzKHggPSBucHZfc2ltLAogICAgICAgICAgICBhbHBoYSA9IDEgLyAyLCAuLnNjYWxlZC4uKSwKICAgICAgICBrZXJuZWwgPSAiZ2F1IiwKICAgICAgICBsd2QgPSAxLAogICAgICAgIGZpbGwgPSAiIzAwN2JhNyIsCiAgICAgICAgY29sb3IgPSAiZGFya2JsdWUiLAogICAgICAgIGFscGhhID0gMC4zCiAgICAgICkgKwogICAgICBnZW9tX3ZsaW5lKAogICAgICAgIHhpbnRlcmNlcHQgPSBjKDAsIG1lZGlhbihucHZfc2ltKSksCiAgICAgICAgY29sID0gYygiYmxhY2siLCAiZGFya2JsdWUiKSwKICAgICAgICBsd2QgPSBjKDEsIDEpLAogICAgICAgIGxpbmV0eXBlID0gYygic29saWQiLCAiZGFzaGVkIikKICAgICAgKSArCiAgICAgIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygtMzAwLDEwMDApLCAgeWxpbSA9ICBjKCAwLCAxLjIgKSkgICsgICMgZml4aW5nIHRoZSB4IGF4aXMgc28gd2UgY2FuIHNlZSBzaGlmdHMgaW4gdGhlIGRlbnNpdHkKICAgICAgI3hsaW0ocmFuZ2UoZGVuc2l0eShucHZfc2ltKSR4KSkgKwogICAgICBndWlkZXMoYWxwaGEgPSAibm9uZSIsIGNvbG91ciA9ICJub25lIikgKwogICAgICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDApKSkgKwogICAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDApKSkgKwogICAgICBhbm5vdGF0ZSgKICAgICAgICAidGV4dCIsCiAgICAgICAgeCA9IDEuNzUgKiBtZWRpYW4obnB2X3NpbSksCiAgICAgICAgeSA9IDAuMiwKICAgICAgICBsYWJlbCA9IG5wdl9mb3JfdGV4dCwKICAgICAgICBzaXplID0gNiwKICAgICAgICBjb2xvciA9ICJkYXJrYmx1ZSIKICAgICAgKSArCiAgICAgIGFubm90YXRlKAogICAgICAgICJ0ZXh0IiwKICAgICAgICB4ID0gMS43NSAqIG1lZGlhbihucHZfc2ltKSwKICAgICAgICB5ID0gMC4xLAogICAgICAgIGxhYmVsID0gbnB2X2Zvcl90ZXh0MiwKICAgICAgICBzaXplID0gNiwKICAgICAgICBjb2xvciA9ICJkYXJrYmx1ZSIKICAgICAgKSArCiAgICAgIHRoZW1lKAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMS41KQogICAgICApCgogICAgaWYgKHJlc2NhbGUgPT0gVFJVRSkgewogICAgICBwbG90MSA8LQogICAgICAgIHN1cHByZXNzTWVzc2FnZXMocGxvdDEgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IDEuMiAqIGMobWluKGMoCiAgICAgICAgICAtMSwgbnB2X3NpbQogICAgICAgICkpLCBtYXgoYygKICAgICAgICAgIDEwMCwgbnB2X3NpbQogICAgICAgICkpKSkpCiAgICB9CiAgICByZXR1cm4gKGxpc3QocGxvdDEscG9zaXRpb24sdG90YWxfdGltZV9zaW0pKQp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnJldHVybihsaXN0KCJnZW5lcmF0ZV9wbG90X2YiID0gZ2VuZXJhdGVfcGxvdF9mKSkKfQoKaW52aXNpYmxlKCBsaXN0MmVudihjaHVua19nZW5lcmF0ZV9wbG90KCksLkdsb2JhbEVudikgKQpgYGAKCgpgYGB7ciBydW4tbWMsIGRwaSA9IDQwMCwgcHVybD1GQUxTRSwgZWNobz1GQUxTRX0KCgpucHZfYWxsX3NpbSA8LSAgIHNpbV9kYXRhMV9mKAogICAgICAgICAgICBuc2ltc192YXIyID0gbnNpbXNfc28sICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGdvdl9ib25kc192YXIyICAgICAgICAgID0gcm91bmQoZ292X2JvbmRzX3NvLDIpICAgICAgICAgICAgICwgICAgI2FzZCBnb3ZfYm9uZHNfc28sIE5PIENIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBnb3ZfYm9uZHNfc2RfdmFyMiAgICAgICA9IGdvdl9ib25kc19zbyAqIDAuMSAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGluZmxhdGlvbl92YXIyICAgICAgICAgID0gaW5mbGF0aW9uX3NvICAgICAgICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaW5mbGF0aW9uX3NkX3ZhcjIgICAgICAgPSBpbmZsYXRpb25fc28gKiAwLjEgICAgICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBnb3ZfYm9uZHNfbmV3X3ZhcjIgICAgICA9IGdvdl9ib25kc19uZXdfc28gICAgICAsICAgICAgICAgIAogICAgICAgICAgICBnb3ZfYm9uZHNfbmV3X3NkX3ZhcjIgICA9IGdvdl9ib25kc19uZXdfc28gKiAwLjEsICAgICAgICAgIAogICAgICAgICAgICBpbmZsYXRpb25fbmV3X3ZhcjIgICAgICA9IGluZmxhdGlvbl9uZXdfc28gICAgICAsICAgICAgICAKICAgICAgICAgICAgaW5mbGF0aW9uX25ld19zZF92YXIyICAgPSBpbmZsYXRpb25fbmV3X3NvICogMC4xLCAgICAgICAgICAKICAgICAgICAgICAgd2FnZV9hZ192YXIyICAgICAgICAgICAgPSB3YWdlX2FnX3NvICAgICAgICAgICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHdhZ2VfYWdfc2RfdmFyMiAgICAgICAgID0gd2FnZV9hZ19zbyAqIDAuMSAgICAgICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB3YWdlX3d3X3ZhcjIgICAgICAgICAgICA9IHdhZ2Vfd3dfc28gICAgICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgd2FnZV93d19zZF92YXIyICAgICAgICAgPSB3YWdlX3d3X3NvICogMC4xICAgICAgICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHByb2ZpdHNfc2VfdmFyMiAgICAgICAgID0gcHJvZml0c19zZV9zbyAgICAgICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBwcm9maXRzX3NlX3NkX3ZhcjIgICAgICA9IHByb2ZpdHNfc2Vfc28gKiAwLjEgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaG91cnNfc2VfY29uZF92YXIyICAgICAgPSBob3Vyc19zZV9jb25kX3NvICAgICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGhvdXJzX3NlX2NvbmRfc2RfdmFyMiAgID0gaG91cnNfc2VfY29uZF9zbyAqIDAuMSAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBob3Vyc19hZ192YXIyICAgICAgICAgICA9IGhvdXJzX2FnX3NvICAgICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBob3Vyc19hZ19zZF92YXIyICAgICAgICA9IGhvdXJzX2FnX3NvICogMC4xICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBob3Vyc193d192YXIyICAgICAgICAgICA9IGhvdXJzX3d3X3NvICAgICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBob3Vyc193d19zZF92YXIyICAgICAgICA9IGhvdXJzX3d3X3NvICogMC4xICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBob3Vyc19zZV92YXIyICAgICAgICAgICA9IGhvdXJzX3NlX3NvICAgICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBob3Vyc19zZV9zZF92YXIyICAgICAgICA9IGhvdXJzX3NlX3NvICogMC4xICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBleF9yYXRlX3ZhcjIgICAgICAgICAgICA9IGV4X3JhdGVfc28gICAgICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgZXhfcmF0ZV9zZF92YXIyICAgICAgICAgPSBleF9yYXRlX3NvICogMC4xICAgICAgICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGdyb3d0aF9yYXRlX3ZhcjIgICAgICAgID0gZ3Jvd3RoX3JhdGVfc28gICAgICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGdyb3d0aF9yYXRlX3NkX3ZhcjIgICAgID0gZ3Jvd3RoX3JhdGVfc28gKiAwLjEgICAgICAgICwKICAgICAgICAgICAgY292ZXJhZ2VfdmFyMiAgICAgICAgICAgPSBjb3ZlcmFnZV9zbyAgICAgICAgICAgICAgLAogICAgICAgICAgICBjb3ZlcmFnZV9zZF92YXIyICAgICAgICA9IGNvdmVyYWdlX3NvICogMC4xICAgICAgICAgICAsICAKICAgICAgICAgICAgdGF4X3ZhcjIgICAgICAgICAgICAgICAgPSB0YXhfc28gICAgICAgICAgICAgICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB0YXhfc2RfdmFyMiAgICAgICAgICAgICA9IHRheF9zbyAqIDAuMSAgICAgICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfdmFyMiAgICA9IHVuaXRfY29zdF9sb2NhbF9zbyAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfc2RfdmFyMiA9IHVuaXRfY29zdF9sb2NhbF9zbyAqIDAuMSAgICAsCiAgICAgICAgICAgIHVuaXRfY29zdF9sb2NhbF9uZXdfdmFyMiA9IHVuaXRfY29zdF8yMDE3dXNkcHBwX3NvLAogICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfbmV3X3NkX3ZhcjIgPSB1bml0X2Nvc3RfMjAxN3VzZHBwcF9zbyAqIDAuMSAgLCAgCiAgICAgICAgICAgIHllYXJzX29mX3RyZWF0XzBfdmFyMiAgID0geWVhcnNfb2ZfdHJlYXRfMF9zbyAgICAgICAgLCAgICAKICAgICAgICAgICAgeWVhcnNfb2ZfdHJlYXRfMF9zZF92YXIyPSB5ZWFyc19vZl90cmVhdF8wX3NvICogMC4xICAgICAsCiAgICAgICAgICAgIHllYXJzX29mX3RyZWF0X3RfdmFyMiAgID0geWVhcnNfb2ZfdHJlYXRfdF9zbyAgICAgICAgLCAgICAKICAgICAgICAgICAgeWVhcnNfb2ZfdHJlYXRfdF9zZF92YXIyPSB5ZWFyc19vZl90cmVhdF90X3NvICogMC4xICAgICAsCiAgICAgICAgICAgIGxhbWJkYTFfdmFyMiAgICAgICAgICAgID0gbGFtYmRhMV9zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgbGFtYmRhMV9zZF92YXIyICAgICAgICAgPSBsYW1iZGExX3NkX3NvICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBsYW1iZGEyX3ZhcjIgICAgICAgICAgICA9IGxhbWJkYTJfc28gICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBsYW1iZGEyX3NkX3ZhcjIgICAgICAgICA9IGxhbWJkYTJfc2Rfc28gICAsICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBxX2Z1bGxfdmFyMiAgICAgICAgICAgICA9IHFfZnVsbF9zbyAgICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBxX2Z1bGxfc2RfdmFyMiAgICAgICAgICA9IHFfZnVsbF9zbyAqIDAuMSAgICwgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGNvZWZfZXhwX3ZhcjIgICAgICAgICAgID0gY29lZl9leHBfc28sICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB0ZWFjaF9zYWxfdmFyMiAgICAgICAgICA9IHRlYWNoX3NhbF9zbyAgICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgdGVhY2hfc2FsX3NkX3ZhcjIgICAgICAgPSB0ZWFjaF9zYWxfc28gKiAwLjEgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHRlYWNoX2Jlbl92YXIyICAgICAgICAgID0gdGVhY2hfYmVuX3NvICAgICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB0ZWFjaF9iZW5fc2RfdmFyMiAgICAgICA9IHRlYWNoX2Jlbl9zbyAqIDAuMSAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgdGVhY2hfc2FsX25ld192YXIyICAgICAgPSB0ZWFjaF9zYWxfbmV3X3NvICAgICAgICAgLCAgICAgICAgICAjYWRkIHRvIGFwcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHRlYWNoX3NhbF9uZXdfc2RfdmFyMiAgID0gdGVhY2hfc2FsX25ld19zbyAqIDAuMSAgICAgICwgICAgICAgI2FkZCB0byBhcHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB0ZWFjaF9iZW5fbmV3X3ZhcjIgICAgICA9IHRlYWNoX2Jlbl9uZXdfc28gICAgICAgICAsICAgICAgICAgICNhZGQgdG8gYXBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB0ZWFjaF9iZW5fbmV3X3NkX3ZhcjIgICA9IDAuMDAwMDAxICAgICAgLCAgICAgICAgICAgICAgICAgICAgICNhZGQgdG8gYXBwCiAgICAgICAgICAgIG5fc3R1ZGVudHNfdmFyMiAgICAgICAgID0gbl9zdHVkZW50c19zbyAgICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIG5fc3R1ZGVudHNfc2RfdmFyMiAgICAgID0gbl9zdHVkZW50c19zbyAqIDAuMSAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGRlbHRhX2VkX3ZhcjIgICAgICAgICAgID0gZGVsdGFfZWRfcGFyX3NvICAgICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGRlbHRhX2VkX3NkX3ZhcjIgICAgICAgID0gZGVsdGFfZWRfcGFyX3NvICogMC4xICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBkZWx0YV9lZF9leHRfdmFyMiAgICAgICA9IGRlbHRhX2VkX2V4dF9wYXJfc28gICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBkZWx0YV9lZF9leHRfc2RfdmFyMiAgICA9IGRlbHRhX2VkX2V4dF9wYXJfc28gKiAwLjEgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBxX3plcm9fdmFyMiAgICAgICAgICAgICA9IHFfemVyb19zbyAgICAgICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgIHFfemVyb19zZF92YXIyICAgICAgICAgID0gMC4wMDEsICNxX3plcm9fc28gKiAwLjEgICAgIEJJRyBDSEFOR0UgICAgLAogICAgICAgICAgICBsYW1iZGExX25ld192YXIyICAgICAgICA9IHJvdW5kKGxhbWJkYTFfbmV3X3NvLCAyKSwgICAgI3JvdW5kZWQgdG8gbWF0Y2ggc2hpbnkgYXBwICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBsYW1iZGExX25ld19zZF92YXIyICAgICA9IGxhbWJkYTFfbmV3X3NkX3NvLCAgICAgICAgICAgICAKICAgICAgICAgICAgcHJldmFsZW5jZV8wX3ZhcjIgICAgICAgPSBwcmV2YWxlbmNlXzBfc28gICAgICAgLCAgCiAgICAgICAgICAgIHByZXZhbGVuY2VfMF9zZF92YXIyICAgID0gMC4xICAgICwKICAgICAgICAgICAgcHJldmFsZW5jZV9yX3ZhcjIgICAgICAgPSAxICAgICAgICwgICAgI1RFTVAKICAgICAgICAgICAgcHJldmFsZW5jZV9yX3NkX3ZhcjIgICAgPSAwLjEgICAgLCAgICAgICAgICAgCiAgICAgICAgICAgIG5ld19wcmV2bF9yX3ZhcjIgICAgICAgICA9IHJvdW5kKHByZXZhbGVuY2Vfcl9pbiwyKSwgI2FzZCAjbmV3X3ByZXZhbGVuY2Vfcl9zbywgIEJJRyBDSEFOR0UKICAgICAgICAgICAgbmV3X3ByZXZsX3Jfc2RfdmFyMiAgICAgID0gMC4xLCAgICAgICAgICAgICAgICAgICAgICAjYXNkICNuZXdfcHJldmFsZW5jZV9yX3NvICogMC4xLAogICAgICAgICAgICBzdGFmZl90aW1lX3ZhcjIgICAgICAgICA9IHN0YWZmX3RpbWVfc28gICAgLAogICAgICAgICAgICBzdGFmZl90aW1lX3NkX3ZhcjIgICAgICA9IHN0YWZmX3RpbWVfc28gKiAwLjEsCiAgICAgICAgICAgIGNvdW50c19wYXJfdmFyMiAgICAgICAgID0gY291bnRzX3Bhcl9zbyAgICAsCiAgICAgICAgICAgIGNvdW50c19wYXJfc2RfdmFyMiAgICAgID0gY291bnRzX3Bhcl9zZF9zbyAsCiAgICAgICAgICAgIGNvc3RzX3Bhcl92YXIyICAgICAgICAgID0gY29zdHNfcGFyX3NvICAgICAsCiAgICAgICAgICAgIGNvc3RzX3Bhcl9zZF92YXIyICAgICAgID0gY29zdHNfcGFyX3NkX3NvLAoKICAgICAgICAgICAgbmV3X2Nvc3RzX3ZhcjIgICAgICAgICAgPSByb3VuZChjb3N0czJfZWFfaW4sMiksICAgICAgICNjb3N0czJfZWFfaW4sIE5PIENIQU5HRQogICAgICAgICAgICBuZXdfY29zdHNfc2RfdmFyMiAgICAgICA9IHJvdW5kKGNvc3RzMl9lYV9pbiwyKSAqIDAuMSwgI2Nvc3RzMl9lYV9pbiAqIDAuMSwKICAgICAgICAgICAgY291bnRyaWVzX3ZhcjIgICAgICAgICAgPSBsaXN0KCJpbmRpYSIsICJrZW55YSIsICJuaWdlcmlhIiwgInZpZXRuYW0iKQogICAgICAgICAgICApCgoKCgojVW5pdCB0ZXN0IHRoZSBzaW11bGF0aW9ucyBmb3IgPC0gPSAxMDAsIDEwMDAsIDEwMDAwIFVQREFURQphbGxfcmVzXzEwMF9zaW1zIDwtIGMoCiAgOC4wMzc1ODU4NzczMzUzNSwKICA0MS4zNDE4MjUzNzQwNzEgLAogIDQ5LjgyOTM3MjI2MTE3NTUsCiAgMjYzLjUwODUxOTY5MjkwOSwKICA4Mi4zOTU2ODYzNTA1NzAxLAogIDUwMi4xMDIyODUzMjAyNzgsCiAgMzMuOTM3MTYxMDY2NjExMiwKICAyNDcuNDM3NDAwMTIyMjggLAogIDI5Ni4yMDI2OTk4MjMzOTcKKQoKYWxsX3Jlc18xMDAwX3NpbXMgPC0gYygKICA4LjU4Mjk5MzkwMjc2NDM0LAogIDQ4LjkwMTk1NjM5MDM3NzcsCiAgNDkuMzg0NzM3OTE1NTI2OSwKICAyODQuMDI5ODUxMTgzNzA3LAogIDg1LjEwMjI4Mzc3NTU5OTQsCiAgNTEwLjMwNTk0NzQ2NTE1MywKICAzMi42NDQ3NjMzNzMzNDkzLAogIDI2Ni4xMTM3OTIyMTE0NzgsCiAgMzAyLjc0NTg3NDU3MjQxNAopCgphbGxfcmVzXzEwMDAwX3NpbXMgPC0gYygKICAxNi4zNDQ4ODQ2MTc2MDQ5LAogIDk4LjQ5OTgxNjM0NzgwODEsCiAgOTcuMzcyMjc5MTUxNzYzNCwKICA1ODkuMTA2MjE3NTg4MDY0LAogIDg4LjQxMTIyNjM0NTgwNzUsCiAgNTI5LjU5MDY5Mzk1MTAzNSwKICA2MS41NjUxNDk0MTA3NjY2LAogIDU3Ni43MTg3MjcyNDgzNyAsCiAgMzE3LjIzNjk2NzI2NjI5MQopCgoKCmlmIChUUlVFKSB7CmsgPC0gMApmb3IgKCBpIGluIHBvbGljeV9lc3RpbWF0ZXNfdmFybmFtZXMgKSB7CiAgICBrIDwtIGsgKyAxCiAgICB0b190ZXN0IDwtIG5wdl9hbGxfc2ltW1tpXV0KICAgIGlmIChuc2ltc19zbyA9PSAxZTQpewogICAgICAgIHVuaXRfdGVzdF9mKHRvX3Rlc3QsIGFsbF9yZXNfMTAwMDBfc2ltc1trXSwgbWFpbl9ydW5fdmFyID0gVFJVRSkKICAgIH0gZWxzZSBpZiAobnNpbXNfc28gPT0gMWUzKXsKICAgICAgICB1bml0X3Rlc3RfZih0b190ZXN0LCBhbGxfcmVzXzEwMDBfc2ltc1trXSwgbWFpbl9ydW5fdmFyID0gVFJVRSkKICAgIH0gZWxzZSBpZiAobnNpbXNfc28gPT0gMWUyKXsKICAgICAgICB1bml0X3Rlc3RfZih0b190ZXN0LCBhbGxfcmVzXzEwMF9zaW1zW2tdLCBtYWluX3J1bl92YXIgPSBUUlVFKQogICAgfQp9Cn0KIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMgUmVzdWx0cy9WaXoKIyMjIyMjIyMjIyMjIyMjIwpsaWJyYXJ5KHBsb3RseSkKCnBsb3QxIDwtIGdlbmVyYXRlX3Bsb3RfZihucHZfYWxsX3NpbSwgIkEzLiBBbGwgaW5jb21lIG9mIEEyLiBNYWluIFBvbGljeSBFc3RpbWF0ZSIsIHJlc2NhbGVfc28pW1sxXV0gKwogICAgICBsYWJzKHkgPSBOVUxMLAogICAgICAgeCA9ICJOZXQgUHJlc2VudCBWYWx1ZSAoQmVuZWZpdHMgLSAgQ29zdHMpIiAsCiAgICAgICB0aXRsZSA9ICJOZXQgTGlmZXRpbWUgSW5jb21lIEVmZmVjdHMgb2YgRGV3b3JtaW5nIGZvciBFYWNoIFRyZWF0ZWQgQ2hpbGRyZW4iLAogICAgICAgc3VidGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIHRoZSBOZXQgUHJlc2VudCBWYWx1ZSBvZiBEZXdvcm1pbmcgSW50ZXJ2ZW50aW9ucyIKICAgICAgICkKcHJpbnQocGxvdDEpCiNnZ3NhdmUoaGVyZSgiY29kZSIsICJtYWluX3BlLnBuZyIpKQoKYGBgCgojIFJlZmVyZW5jZXMKCgpbXjFdOiBFQXMgdmVyc2lvbiBvZiB0aGUgYW5hbHlzaXMgZm9sbG93cyBhIHNpbWlsYXIgc3RydWN0dXJlIHRoYW4gdGhlIGNvc3QgZWZmZWN0aXZlbmVzcyBhbmFseXNpcyBwZXJmb3JtZWQgYnkgdGhlIGNoYXJpdHkgZXZhbHVhdG9yIEdpdmVXZWxsIFtAZ2l2ZXdlbGxdLgoKClteNV06YEYxID0gR2l2ZVdlbGwncyBlc3RpbWF0ZXMgb2YgRGV3b3JtIHRoZSBXb3JsZCdzIGNvc3QgcGVyIGNoaWxkIGRld29ybWVkIHBlciB5ZWFyIFsyMDE4XWAgT3JpZ2luYWwgW2hlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFqelM2OTNZLVpBSWxvUWVqbHpTYzNlM3Q3aVBIeW9yMXF0N0hCalNWWGhRL2VkaXQjZ2lkPTUwOTAzMzg1NyksIGVkaXRhYmxlIHZlcnNpb24gW2hlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFobWlqbUpCZUNKQUtJMWRUOG41aU9MQUF4ZnpXcktZSk1fS2ZvdUZZSTJ3L2VkaXQjZ2lkPTUwOTAzMzg1NykKYEYyID0gMjAxOSBHaXZlV2VsbCBDb3N0LWVmZmVjdGl2ZW5lc3MgQW5hbHlzaXMg4oCUIFZlcnNpb24gM2AgIApgRjMgPSAyMDE4IFdvcm0gSW50ZW5zaXR5IFdvcmtib29rIOKAlCBWZXJzaW9uIDFgIFNoZWV0cyBhcmUgbmFtZWQgdGhlIGZpcnN0IHRpbWUgYW5kIG51bWJlcmVkIHRoZXJlYWZ0ZXIuCgoKW14yXTogdG8gYWNjb3VudCBmb3Igc2V2ZXJhbCBoaWdoLWxldmVsIGFjdGl2aXRpZXMgRGV3b3JtIHRoZSBXb3JsZCBkb2VzIG5vdCBpbmNsdWRlIGluIGl0cyBjb3N0IHBlciB0cmVhdG1lbnQgYW5hbHlzZXMsIGFzIHRoZXkgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIGFueSBwYXJ0aWN1bGFyIHByb2dyYW0KCgpbXjNdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFCa1FMeUxZUW15OU83RklTZ2U3OFBuV3k5dXJNbzBrMzFSd0k1dE9oSkU0L2VkaXQKCgpbXjddOiBzZXJpZXMgYXZhbGFibGUgaW4gZmlsZSBgfi9vcGEtZGV3b3JtaW5nL2RvY3MvbWF0ZXJpYWxzL29yaWdpbmFsX21hdGVyaWFscy9CYWlyZC1ldGFsLVFKRS0yMDE2X2Zpc2NhbC1pbXBhY3QtY2FsY3VsYXRpb25zLnhsc3hgIHdvcmtzaGVldGBBc3N1bXBzJlBhbmVsIEEgQ2FsY3MhQTkzYAo=

An Open Policy Analysis by BITSS
opa@berkeley.edu