Pork Barrel Politics of The Towns Fund Model Extension

Study Preregistration form: [https://rpubs.com/DDowd1/Preregistraion_Form]

Information about this replication project

YAML settings

output:
  html_document:
   code_download: true
    toc: true
    toc_depth: 2
    toc_float:
     collapsed: false
     smooth_scroll: true

Global settings of R chunks

# Global options
opts_chunk$set(echo=TRUE,
                 cache=TRUE,
               comment=NA,
               message=FALSE,
               warning=FALSE)

Libraries

library(rmarkdown)
library(knitr)
library(tidyverse)
library(lme4)
library(sjPlot)

Versions of used packages

$rmarkdown
[1] '2.21'

$knitr
[1] '1.42'

My enviroment

[1] "R version 4.2.1 (2022-06-23 ucrt)"

1. Introduction

This paper is an extension of Table 1, Model 4 found in the paper named “Pork Barrel Politics of the Town’s (Hanretty 2021). The model assesses data about a Towns Fund created by the Conservative Government in 2019. It found that the towns located in parliamentary seats which conservatives narrowly won or lost were more likely to receive funding. This led Hanretty to speculate that the conservatives aimed funding towards towns to gain electoral advantages in future electoral cycles, a process known as Pork Barrel Politics. These findings were important as spending towards local government takes up almost a quarter of public spending, so changes even small adjustments made to spending towards local authorities can have a large effect on what services they can provide to citizens (Ward, 1999). Regional spending like the towns fund often comes in the form of regional policies which address social and economic distress in areas were the government of the day has decided that inequality has reached too high (Hoare, 1985)

An issue with Hanretty’s original model is that it fails to account for the strong spatial effect associated with Pork Barrel Politics(Hoare, 1983). Pork Barrel politics is defined as the process of politicians creating geographically aimed local projects for their own constituencies (Lancaster 1986). This gives constituents incentive to re-elect their representatives as they are receiving direct rewards for their support. Since Pork is not a phenomena that can be seen across a whole population, spatial elements should be included in analysis to see how effects vary across geographic areas.Milligan (2005) found evidence of the relationship with voter margins and the odds of receiving funding regional grants with data from the Canadian government. Unlike Hanretty, Milligan performed analysis at the local level not across the population. The analysis for this extension will do the same, using the region variable found in the Hanretty data as a level 2 variable. It is expected that a model that measures effects at local levels will fit the data better then a single level model that does not account for Spatial differences.

There are 4 different methods in which one can take to check the reproducability of Scientific results (Freese and Peterson 2017). In the original replication check, which was performed for Hanretty’s model as part of this project, a verification method was used. The verification method involves using the same data and same methods as the original to see if the results are consistent. The replication was unsuccessful in repeating the results as the code for the Model was not made available by Hanretty for the replication. This paper will use a different method of reproducibility checking called Robustness (Freese and Peterson 2017). This is an alternative method of checking key analysis, which involves using an alternative method of analysis to the original model to see if results replicate. In his paper, Hanretty (2021) performed sensitivity analysis on the model created for the paper and claims that for his results to be incorrect there would have to be a lurking variable which has thirty times the association between the rank and success variables. This means that an extended version of the model will yield similar results to the original version of the model.

2. Data and methods

2.1. Data

The data supplied for the original model was supplied by Hanretty in the Harvard data verse replication package. The original sources of the data couldn’t be supplied as permission was not given for the redistribution of the resources by the supplier. The RDs file supplied by Hanretty is the only available source for this data.

dat <- readRDS("Data/selection_data.rds")

Since the data set supplied by Hanretty is not a raw version of the data very little data transformation was needed for this test. However, transformation was still performed for the creation of the model.

  1. A numerical dummy variable was made from a categorical in the data set. This is the dependent variable in the model measuring the success of towns in receiving funding from the government.
dat$outcome <- as.numeric(dat$Funded == "Yes")
  1. The categorical variable used in the model is then made. This is the independent variable of interest. It creates a 5 point scale with the ranging from the conservatives failing getting over -5% of the vote of the winning party to the conservatives winning with more than 10% of the vote.
dat2 <- subset(dat, !is.na(ConMaj.allm))

dat2<- dat %>% 
  #as_tibble() %>% 
  mutate(ConMaj.allm.categorical = 
           case_when(ConMaj.allm < -5 ~ "-10% to -5%",
                     ConMaj.allm > -5 & ConMaj.allm < 0 ~"-5 to 0",
                     ConMaj.allm > 0 & ConMaj.allm < 5 ~" 0 to 5",
                     ConMaj.allm > 5 & ConMaj.allm < 10 ~"5 to 10",
                     ConMaj.allm > 10 ~"greater than 10"))

2.2 Exploratory Analysis

Figure one shows the number of towns located in each Region of England. The colours of the bar indicate how many of those towns are located in Conservative held seats. The Chart indicates that the Conservatives win a much lower proportion of the seats in the North of England then they do in the South and Midlands.

#table showing number of towns located in each region
ggplot(data=dat2)+
  aes(x=Region,
      fill=ConWinner1.allm)+
  geom_bar()+  
  labs(title = "How many Towns are in each Region?",
    x="Region of England",
       y="Number of Towns",
       fill= "Is this town located in a conservative seat?")+
  theme(legend.position="top")+
  scale_fill_manual(values=c("red3",
                                   "blue4" ))

Figure 2 shows how the success of the Tory party in a towns parliamentary seat affects its likelihood of receiving funding in the towns fund. The relationship varies wildly by Region. In Northern states, a higher percentage of Tory votes increases the chance of receiving funding. In Southern regions, the effect is opposite with towns located in seats which voted strongly for the Tories

#Relationship between 
ggplot(data=dat2)+
  aes(x=ConMaj.allm,
      y=outcome,
      colour=Region)+
  geom_point()+
  geom_smooth(method="glm",
              level=0)+
   scale_colour_manual(values=c("East Midlands"="mediumpurple4",
                             "East of England"="mediumpurple2",
                             "North East"="firebrick4",
                             "North West"="red3",
                             "South East"="steelblue1",
                             "South West"="dodgerblue4",
                             "West Midlands"="blueviolet",
                             "Yorkshire and the Humber"="firebrick1"))+
  theme_bw()

2.3. Method for final analysis

Hanretty performed the original analysis using a single level regression model. A categorical variable was used to show how the gap between the Tories and their main rival for the seat was used to show that conservative marginal seats were targeted by the Tories in their Towns fund scheme to boost support in future electoral cycles. The issue with this model is that it fails to show how this effect can vary at the regional level. The theory of Pork Barrel Politics is inherently geographic as it is the relocation of Government money to specific areas in which the government believe that spending will benefit its political goals(Lancaster 1986). Therefore, it makes sense to perform analysis varying by region as spending in certain regions will yield greater political gains in some regions then it would in others. In this extension, a random slopes model will be created using region as the level two variable. The slopes will be varied by the size of the conservative vote compared to its biggest rival for the seat. The other control variables found in the original model will also be featured in the extension as level one controls. The results original recreational model and the extension model will then be compared to. The size and significance of effects will be compared to see if the change in design yields significant change in results. A BIC test will also be used to show which model fits the data set best.

3. Results

The random effects introduced in the extension model create no significant change in the effects of the original. The odds ratios of the categorical variables are slightly lower than the original model however, there is not enough of a statistically significant change when the random slopes are introduced. Both models find that seats that are in constituencies where conservatives win with 5 to 10% of the vote more than their closest rival. Being in marginal seat still yielded significant effects on the odds of receiving funding. Towns located in seats that had marginally lost in were 6.71 times more likely to receive funding and towns which the conservatives marginally won were 4.03 times more likely to receive funding from the towns fund. Being located in a seat which had a conservative majority greater then 10% did not have any significant effect on the data. The region variable did not explain the variance in the data. The random effect coefficient was only 0.06 meaning that there was no significant effect on the data from the Region variable when it was used as a level two independent variable. The random effect coefficients for the categorical variable were mixed. The 0 to 5% and greater than 10% coefficients explained much more of the variance in the model then the other levels of the categorical variable. The effects of the control variables did not have a statistically significant change from the original model apart from the Qualification and Income dependency variables. Introducing the level 2 region effects to the model made the result of the Qualification variable significant despite its small odds ratio of 0.27. The odds ratio of Income Dependency grew to 10.18 the second largest effect found in the model. This indicates that spending could have been targeted towards towns that with higher levels of income inequality, this is should be an expected outcome for the data as town fund schemes are a method of which the government of the day can address regional inequalities (Hoare, 1985).

#Original Model Replication
Original <- 
  glm(outcome ~ ConMaj.allm.categorical+
                 log(Pop) + 
                 Rank + 
                 ConWinner1.allm + 
                 Region+
                 Quals+ 
                 IncomeDep+
                 Brexit+
                 Productivity+
                 Shocks+
                 Investment+
                 Alignment,
               family = binomial,
               data = dat2)


#Extension Model
Extension <- glmer(data=dat2, outcome~ ConMaj.allm.categorical+
                       log(Pop)+ 
                       Rank+
                       ConWinner1.allm+ 
                       Quals+ 
                       IncomeDep+
                       Brexit+
                       Productivity+
                       Shocks+
                       Investment+
                       Alignment+( 1+ ConMaj.allm.categorical |Region),
                       family=binomial)

tab_model(Original,Extension)
  outcome outcome
Predictors Odds Ratios CI p Odds Ratios CI p
(Intercept) 0.00 0.00 – 0.03 <0.001 0.00 0.00 – 0.01 <0.001
ConMaj.allm.categorical-5 to 0 7.71 2.04 – 28.40 0.002 6.71 1.52 – 29.55 0.012
ConMaj allm categorical [
0 to 5]
5.88 1.58 – 22.67 0.009 4.03 1.04 – 15.60 0.044
ConMaj allm categorical
[5 to 10]
15.79 3.79 – 70.75 <0.001 11.73 2.75 – 50.09 0.001
ConMaj allm categorical
[greater than 10]
1.81 0.57 – 5.95 0.317 1.35 0.44 – 4.14 0.603
Pop [log] 2.96 2.01 – 4.51 <0.001 2.88 1.94 – 4.28 <0.001
Rank 0.98 0.95 – 1.00 0.026 0.98 0.96 – 1.00 0.032
ConWinner1 allmTRUE 1.60 0.59 – 4.33 0.352 1.86 0.71 – 4.87 0.207
Region [East of England] 0.82 0.18 – 3.69 0.799
Region [North East] 0.58 0.13 – 2.41 0.463
Region [North West] 0.75 0.22 – 2.56 0.648
Region [South East] 0.45 0.12 – 1.56 0.210
Region [South West] 0.44 0.13 – 1.53 0.202
Region [West Midlands] 0.81 0.27 – 2.45 0.713
Region [Yorkshire and the
Humber]
1.95 0.61 – 6.34 0.262
Quals 0.27 0.07 – 0.98 0.050 0.30 0.09 – 1.03 0.055
IncomeDep 7.03 1.33 – 38.81 0.023 10.18 2.23 – 46.44 0.003
Brexit 1.11 0.32 – 3.81 0.868 1.18 0.38 – 3.67 0.779
Productivity 1.62 0.43 – 6.16 0.475 1.91 0.64 – 5.76 0.248
Shocks 1.87 0.61 – 5.62 0.269 1.82 0.66 – 5.05 0.247
Investment 0.37 0.01 – 10.81 0.586 0.44 0.01 – 15.43 0.653
Alignment 6.90 0.24 – 428.59 0.291 7.24 0.21 – 248.58 0.272
Random Effects
σ2   3.29
τ00   0.06 Region
τ11   0.16 Region.ConMaj.allm.categorical-5 to 0
  0.31 Region.ConMaj.allm.categorical 0 to 5
  0.13 Region.ConMaj.allm.categorical5 to 10
  0.32 Region.ConMaj.allm.categoricalgreater than 10
ρ01   -1.00
  1.00
  -1.00
  -1.00
ICC   0.03
N   8 Region
Observations 539 539
R2 Tjur 0.354 0.494 / 0.512

The BIC test shows that the original replication model fits the data better then the model created for this extension; indicating that the original model created by Hanretty fits the data more accurately than the extension model created or this project. This means that it is unlikely that the regional effects used in the model have do not have a significant effect on whether or not towns received funding from the Government. Therefore, there will be no significant difference between the effects that the Conservative Majority categorical variable will have on the dependant variable across regions.

BIC(Original,Extension)
          df      BIC
Original  22 475.6313
Extension 30 532.0290

4. Conclusions

Chris Hanretty’s model did not replicate in the original verifiability check performed in this project. However, in this robustness check the results found were similar suggesting that the model does yield robust results. The BIC test comparing the two models found that the original single level model fit the data more than the extension version of the model which had random slopes. The null hypothesis stated in the pre-registration form stating that the model with regional random slopes would be superior can be rejected. This means that there is no significant regional variance in the relationship between conservative vote and the odds of receiving funding. The relationship discovered in the Pork Barrel Politics of the Towns Fund (Hanretty, 2021) paper is likely to be an effect that can be found across the data not just in certain geographic locations. The regional effects found by Milligan and Smart(2005) could not be replicated with this model .

References

Freese, J., & Peterson, D. (2017). Replication in social science. Annual Review of Sociology, 43, 147-165, doi: 10.1146.

Hanretty, C. (2021). “The pork barrel politics of the Towns Fund.” The Political Quarterly 92(1): 7-13.

Hoare, A.G., 1983. Pork-barrelling in Britain: a review. Environment and Planning C: Government and Policy, 1(4), pp.413-438.

Hoare, A. G. (1985). Dividing the pork barrel: Britain’s enterprise zone experience. Political Geography Quarterly, 4(1), 29-46.

Lancaster, T. D. (1986). “Electoral structures and pork barrel politics.” International Political Science Review 7(1): 67-81.

Milligan, K.S. and Smart, M., 2005. Regional grants as pork barrel politics. Available at SSRN 710903.

Appendix

Appendix 1. My enviroment (full information)

# Detailed information about my environment
sessionInfo()
R version 4.2.1 (2022-06-23 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19044)

Matrix products: default

locale:
[1] LC_COLLATE=English_United Kingdom.utf8 
[2] LC_CTYPE=English_United Kingdom.utf8   
[3] LC_MONETARY=English_United Kingdom.utf8
[4] LC_NUMERIC=C                           
[5] LC_TIME=English_United Kingdom.utf8    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] sjPlot_2.8.14   lme4_1.1-33     Matrix_1.4-1    lubridate_1.9.2
 [5] forcats_1.0.0   stringr_1.5.0   dplyr_1.1.2     purrr_1.0.1    
 [9] readr_2.1.4     tidyr_1.3.0     tibble_3.2.1    ggplot2_3.4.2  
[13] tidyverse_2.0.0 knitr_1.42      rmarkdown_2.21 

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.10        mvtnorm_1.1-3      lattice_0.20-45    digest_0.6.31     
 [5] utf8_1.2.3         R6_2.5.1           backports_1.4.1    evaluate_0.20     
 [9] pillar_1.9.0       rlang_1.1.1        rstudioapi_0.14    minqa_1.2.5       
[13] performance_0.10.3 nloptr_2.0.3       jquerylib_0.1.4    effectsize_0.8.3  
[17] ggeffects_1.2.2    splines_4.2.1      munsell_0.5.0      broom_1.0.4       
[21] modelr_0.1.11      compiler_4.2.1     xfun_0.39          parameters_0.21.1 
[25] pkgconfig_2.0.3    htmltools_0.5.5    insight_0.19.2     tidyselect_1.2.0  
[29] codetools_0.2-18   fansi_1.0.4        tzdb_0.4.0         withr_2.5.0       
[33] MASS_7.3-57        sjmisc_2.8.9       grid_4.2.1         nlme_3.1-157      
[37] jsonlite_1.8.4     gtable_0.3.3       lifecycle_1.0.3    magrittr_2.0.3    
[41] bayestestR_0.13.1  scales_1.2.1       datawizard_0.7.1   estimability_1.4.1
[45] cli_3.6.1          stringi_1.7.12     cachem_1.0.8       bslib_0.4.2       
[49] generics_0.1.3     vctrs_0.6.2        boot_1.3-28        sjlabelled_1.2.0  
[53] tools_4.2.1        glue_1.6.2         sjstats_0.18.2     hms_1.1.3         
[57] emmeans_1.8.6      fastmap_1.1.1      yaml_2.3.7         timechange_0.2.0  
[61] colorspace_2.1-0   sass_0.4.6        

Appendix 2. Entire R code used in the project

# Opening key libraries first
library(rmarkdown)
library(knitr)
# Global options
opts_chunk$set(echo=TRUE,
                 cache=TRUE,
               comment=NA,
               message=FALSE,
               warning=FALSE)
library(rmarkdown)
library(knitr)
library(tidyverse)
library(lme4)
library(sjPlot)
# Versions of used packages
packages <- c("rmarkdown", "knitr")
names(packages) <- packages
lapply(packages, packageVersion)
# What is my R version?
version[['version.string']]
dat <- readRDS("Data/selection_data.rds")
dat$outcome <- as.numeric(dat$Funded == "Yes")
dat2 <- subset(dat, !is.na(ConMaj.allm))

dat2<- dat %>% 
  #as_tibble() %>% 
  mutate(ConMaj.allm.categorical = 
           case_when(ConMaj.allm < -5 ~ "-10% to -5%",
                     ConMaj.allm > -5 & ConMaj.allm < 0 ~"-5 to 0",
                     ConMaj.allm > 0 & ConMaj.allm < 5 ~" 0 to 5",
                     ConMaj.allm > 5 & ConMaj.allm < 10 ~"5 to 10",
                     ConMaj.allm > 10 ~"greater than 10"))
#table showing number of towns located in each region
ggplot(data=dat2)+
  aes(x=Region,
      fill=ConWinner1.allm)+
  geom_bar()+  
  labs(title = "How many Towns are in each Region?",
    x="Region of England",
       y="Number of Towns",
       fill= "Is this town located in a conservative seat?")+
  theme(legend.position="top")+
  scale_fill_manual(values=c("red3",
                                   "blue4" ))
#Relationship between 
ggplot(data=dat2)+
  aes(x=ConMaj.allm,
      y=outcome,
      colour=Region)+
  geom_point()+
  geom_smooth(method="glm",
              level=0)+
   scale_colour_manual(values=c("East Midlands"="mediumpurple4",
                             "East of England"="mediumpurple2",
                             "North East"="firebrick4",
                             "North West"="red3",
                             "South East"="steelblue1",
                             "South West"="dodgerblue4",
                             "West Midlands"="blueviolet",
                             "Yorkshire and the Humber"="firebrick1"))+
  theme_bw()
#Original Model Replication
Original <- 
  glm(outcome ~ ConMaj.allm.categorical+
                 log(Pop) + 
                 Rank + 
                 ConWinner1.allm + 
                 Region+
                 Quals+ 
                 IncomeDep+
                 Brexit+
                 Productivity+
                 Shocks+
                 Investment+
                 Alignment,
               family = binomial,
               data = dat2)


#Extension Model
Extension <- glmer(data=dat2, outcome~ ConMaj.allm.categorical+
                       log(Pop)+ 
                       Rank+
                       ConWinner1.allm+ 
                       Quals+ 
                       IncomeDep+
                       Brexit+
                       Productivity+
                       Shocks+
                       Investment+
                       Alignment+( 1+ ConMaj.allm.categorical |Region),
                       family=binomial)

tab_model(Original,Extension)
BIC(Original,Extension)
# Detailed information about my environment
sessionInfo()
###Data Transformation Code----

#Creating binary dependant variable
dat$outcome <- as.numeric(dat$Funded == "Yes")

dat2 <- subset(dat, !is.na(ConMaj.allm))

#Creating Conservative majority Categorical Variable
dat2<- dat %>% 
  #as_tibble() %>% 
  mutate(ConMaj.allm.categorical = 
           case_when(ConMaj.allm < -5 ~ "-10% to -5%",
                     ConMaj.allm > -5 & ConMaj.allm < 0 ~"-5 to 0",
                     ConMaj.allm > 0 & ConMaj.allm < 5 ~" 0 to 5",
                     ConMaj.allm > 5 & ConMaj.allm < 10 ~"5 to 10",
                     ConMaj.allm > 10 ~"greater than 10"))

#Exploratory Analysis Code---

#table showing number of towns located in each region
ggplot(data=dat2)+
  aes(x=Region,
      fill=ConWinner1.allm)+
  geom_bar()+  
  labs(title = "How many Towns are in each Region?",
    x="Region of England",
       y="Number of Towns",
       fill= "Is this town located in a conservative seat?")+
  theme(legend.position="top")+
  scale_fill_manual(values=c("red3",
                                   "blue4" ))
                                   
#Relationship between Conservative margins and odds of success
ggplot(data=dat2)+
  aes(x=ConMaj.allm,
      y=outcome,
      colour=Region)+
  geom_point()+
  geom_smooth(method="glm",
              level=0)+
   scale_colour_manual(values=c("East Midlands"="mediumpurple4",
                             "East of England"="mediumpurple2",
                             "North East"="firebrick4",
                             "North West"="red3",
                             "South East"="steelblue1",
                             "South West"="dodgerblue4",
                             "West Midlands"="blueviolet",
                             "Yorkshire and the Humber"="firebrick1"))+
  theme_bw()

#Code for Models----

#original model
Original <- 
  glm(outcome ~ ConMaj.allm.categorical+
                 log(Pop) + 
                 Rank + 
                 ConWinner1.allm + 
                 Region+
                 Quals+ 
                 IncomeDep+
                 Brexit+
                 Productivity+
                 Shocks+
                 Investment+
                 Alignment,
               family = binomial,
               data = dat2)

#Extension Model
Extension <- glmer(data=dat2, outcome~ ConMaj.allm.categorical+
                       log(Pop)+ 
                       Rank+
                       ConWinner1.allm+ 
                       Quals+ 
                       IncomeDep+
                       Brexit+
                       Productivity+
                       Shocks+
                       Investment+
                       Alignment+( 1+ ConMaj.allm.categorical |Region),
                       family=binomial)

tab_model(Original,Extension)
LS0tDQp0aXRsZTogIlNNSTIwNSBSZXBsaWNhdGlvbiBQcm9qZWN0ICgyMDIzKSINCmF1dGhvcjogJzIwMDM4MTk2MycNCmRhdGU6ICIyMi8wNS8yMDIzIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAyDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBubw0KICAgICAgc21vb3RoX3Njcm9sbDogeWVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogJzInDQotLS0NCg0KYGBge3Igc3RhcnQsIGluY2x1ZGU9RkFMU0V9DQojIE9wZW5pbmcga2V5IGxpYnJhcmllcyBmaXJzdA0KbGlicmFyeShybWFya2Rvd24pDQpsaWJyYXJ5KGtuaXRyKQ0KYGBgDQoNCiMgUG9yayBCYXJyZWwgUG9saXRpY3Mgb2YgVGhlIFRvd25zIEZ1bmQgTW9kZWwgRXh0ZW5zaW9uDQoNCiMjIyBScHVicyBsaW5rOltodHRwczovL3JwdWJzLmNvbS9ERG93ZDEvUG9ya19CYXJyZWxdDQojIyMgU3R1ZHkgUHJlcmVnaXN0cmF0aW9uIGZvcm06IFtodHRwczovL3JwdWJzLmNvbS9ERG93ZDEvUHJlcmVnaXN0cmFpb25fRm9ybV0gDQoNCiMjIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmVwbGljYXRpb24gcHJvamVjdA0KKiBSZXBsaWNhdGlvbiBwcm9qZWN0IGJhc2VkIG9uOiBIYW5yZXR0eSwgQy4sIDIwMjEuIFRoZSBwb3JrIGJhcnJlbCBwb2xpdGljcyBvZiB0aGUgVG93bnMgRnVuZC4gVGhlIFBvbGl0aWNhbCBRdWFydGVybHksIDkyKDEpLCBwcC43LTEzOiBbaHR0cHM6Ly9kb2kub3JnLzEwLjExMTEvMTQ2Ny05MjNYLjEyOTcwXShodHRwczovL2RvaS5vcmcvMTAuMTExMS8xNDY3LTkyM1guMTI5NzApIA0KKiBSZXBsaWNhdGlvbiBtZXRob2Q6DQogICsgUmVwbGljYXRpb24gcGFja2FnZSBhdmFpbGFibGUgYXQgW2h0dHBzOi8vZG9pLm9yZy8xMC43OTEwL0RWTi9KRzlVMkJdKCBodHRwczovL2RvaS5vcmcvMTAuNzkxMC9EVk4vSkc5VTJCKSANCiAgDQogIA0KIyMjIFlBTUwgc2V0dGluZ3MNCg0KIG91dHB1dDogPC9icj4NCiAgJm5ic3A7IGh0bWxfZG9jdW1lbnQ6IDwvYnI+DQogICAgJm5ic3A7Jm5ic3A7IGNvZGVfZG93bmxvYWQ6IHRydWUgPC9icj4NCiAgICAmbmJzcDsmbmJzcDsmbmJzcDsgdG9jOiB0cnVlIDwvYnI+DQogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IHRvY19kZXB0aDogMiA8L2JyPg0KICAgICZuYnNwOyZuYnNwOyZuYnNwOyB0b2NfZmxvYXQ6IDwvYnI+DQogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY29sbGFwc2VkOiBmYWxzZSA8L2JyPg0KICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNtb290aF9zY3JvbGw6IHRydWUgPC9icj4NCg0KIyMjIEdsb2JhbCBzZXR0aW5ncyBvZiBSIGNodW5rcw0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1UUlVFfQ0KIyBHbG9iYWwgb3B0aW9ucw0Kb3B0c19jaHVuayRzZXQoZWNobz1UUlVFLA0KCSAgICAgICAgICAgICBjYWNoZT1UUlVFLA0KICAgICAgICAgICAgICAgY29tbWVudD1OQSwNCiAgICAgICAgICAgICAgIG1lc3NhZ2U9RkFMU0UsDQogICAgICAgICAgICAgICB3YXJuaW5nPUZBTFNFKQ0KYGBgDQoNCiMjIyBMaWJyYXJpZXMNCg0KYGBge3IgbGlicmFyaWVzLCBpbmNsdWRlPVRSVUV9DQpsaWJyYXJ5KHJtYXJrZG93bikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkobG1lNCkNCmxpYnJhcnkoc2pQbG90KQ0KYGBgDQoNCiMjIyBWZXJzaW9ucyBvZiB1c2VkIHBhY2thZ2VzDQoNCmBgYHtyIHZlcnNpb25zLCBlY2hvPUZBTFNFfQ0KIyBWZXJzaW9ucyBvZiB1c2VkIHBhY2thZ2VzDQpwYWNrYWdlcyA8LSBjKCJybWFya2Rvd24iLCAia25pdHIiKQ0KbmFtZXMocGFja2FnZXMpIDwtIHBhY2thZ2VzDQpsYXBwbHkocGFja2FnZXMsIHBhY2thZ2VWZXJzaW9uKQ0KYGBgDQoNCiMjIyBNeSBlbnZpcm9tZW50DQoNCmBgYHtyIG15UiwgZWNobz1GQUxTRX0NCiMgV2hhdCBpcyBteSBSIHZlcnNpb24/DQp2ZXJzaW9uW1sndmVyc2lvbi5zdHJpbmcnXV0NCmBgYA0KDQojIyAxLiBJbnRyb2R1Y3Rpb24NCg0KVGhpcyBwYXBlciBpcyBhbiBleHRlbnNpb24gb2YgVGFibGUgMSwgTW9kZWwgNCBmb3VuZCBpbiB0aGUgcGFwZXIgbmFtZWQg4oCcUG9yayBCYXJyZWwgUG9saXRpY3Mgb2YgdGhlIFRvd27igJlzIChIYW5yZXR0eSAyMDIxKS4gVGhlIG1vZGVsIGFzc2Vzc2VzIGRhdGEgYWJvdXQgYSBUb3ducyBGdW5kIGNyZWF0ZWQgYnkgdGhlIENvbnNlcnZhdGl2ZSBHb3Zlcm5tZW50IGluIDIwMTkuIEl0IGZvdW5kIHRoYXQgdGhlIHRvd25zIGxvY2F0ZWQgaW4gcGFybGlhbWVudGFyeSBzZWF0cyB3aGljaCBjb25zZXJ2YXRpdmVzIG5hcnJvd2x5IHdvbiBvciBsb3N0IHdlcmUgbW9yZSBsaWtlbHkgdG8gcmVjZWl2ZSBmdW5kaW5nLiBUaGlzIGxlZCBIYW5yZXR0eSB0byBzcGVjdWxhdGUgdGhhdCB0aGUgY29uc2VydmF0aXZlcyBhaW1lZCBmdW5kaW5nIHRvd2FyZHMgdG93bnMgdG8gZ2FpbiBlbGVjdG9yYWwgYWR2YW50YWdlcyBpbiBmdXR1cmUgZWxlY3RvcmFsIGN5Y2xlcywgYSBwcm9jZXNzIGtub3duIGFzIFBvcmsgQmFycmVsIFBvbGl0aWNzLiBUaGVzZSBmaW5kaW5ncyB3ZXJlIGltcG9ydGFudCBhcyBzcGVuZGluZyB0b3dhcmRzIGxvY2FsIGdvdmVybm1lbnQgdGFrZXMgdXAgYWxtb3N0IGEgcXVhcnRlciBvZiBwdWJsaWMgc3BlbmRpbmcsIHNvIGNoYW5nZXMgZXZlbiBzbWFsbCBhZGp1c3RtZW50cyBtYWRlIHRvIHNwZW5kaW5nIHRvd2FyZHMgbG9jYWwgYXV0aG9yaXRpZXMgY2FuIGhhdmUgYSBsYXJnZSBlZmZlY3Qgb24gd2hhdCBzZXJ2aWNlcyB0aGV5IGNhbiBwcm92aWRlIHRvIGNpdGl6ZW5zIChXYXJkLCAxOTk5KS4gUmVnaW9uYWwgc3BlbmRpbmcgbGlrZSB0aGUgdG93bnMgZnVuZCBvZnRlbiBjb21lcyBpbiB0aGUgZm9ybSBvZiByZWdpb25hbCBwb2xpY2llcyB3aGljaCBhZGRyZXNzIHNvY2lhbCBhbmQgZWNvbm9taWMgZGlzdHJlc3MgaW4gYXJlYXMgd2VyZSB0aGUgZ292ZXJubWVudCBvZiB0aGUgZGF5IGhhcyBkZWNpZGVkIHRoYXQgaW5lcXVhbGl0eSBoYXMgcmVhY2hlZCB0b28gaGlnaCAoSG9hcmUsIDE5ODUpDQoNCkFuIGlzc3VlIHdpdGggSGFucmV0dHnigJlzIG9yaWdpbmFsIG1vZGVsIGlzIHRoYXQgaXQgZmFpbHMgdG8gYWNjb3VudCBmb3IgdGhlIHN0cm9uZyBzcGF0aWFsIGVmZmVjdCBhc3NvY2lhdGVkIHdpdGggUG9yayBCYXJyZWwgUG9saXRpY3MoSG9hcmUsIDE5ODMpLiAgUG9yayBCYXJyZWwgcG9saXRpY3MgaXMgZGVmaW5lZCBhcyB0aGUgcHJvY2VzcyBvZiBwb2xpdGljaWFucyBjcmVhdGluZyBnZW9ncmFwaGljYWxseSBhaW1lZCBsb2NhbCBwcm9qZWN0cyBmb3IgdGhlaXIgb3duIGNvbnN0aXR1ZW5jaWVzIChMYW5jYXN0ZXIgMTk4NikuIFRoaXMgZ2l2ZXMgY29uc3RpdHVlbnRzIGluY2VudGl2ZSB0byByZS1lbGVjdCB0aGVpciByZXByZXNlbnRhdGl2ZXMgYXMgdGhleSBhcmUgcmVjZWl2aW5nIGRpcmVjdCByZXdhcmRzIGZvciB0aGVpciBzdXBwb3J0LiBTaW5jZSBQb3JrIGlzIG5vdCBhIHBoZW5vbWVuYSB0aGF0IGNhbiBiZSBzZWVuIGFjcm9zcyBhIHdob2xlIHBvcHVsYXRpb24sIHNwYXRpYWwgZWxlbWVudHMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFuYWx5c2lzIHRvIHNlZSBob3cgZWZmZWN0cyB2YXJ5IGFjcm9zcyBnZW9ncmFwaGljIGFyZWFzLk1pbGxpZ2FuICgyMDA1KSBmb3VuZCBldmlkZW5jZSBvZiB0aGUgcmVsYXRpb25zaGlwIHdpdGggdm90ZXIgbWFyZ2lucyBhbmQgdGhlIG9kZHMgb2YgcmVjZWl2aW5nIGZ1bmRpbmcgcmVnaW9uYWwgZ3JhbnRzIHdpdGggZGF0YSBmcm9tIHRoZSBDYW5hZGlhbiBnb3Zlcm5tZW50LiBVbmxpa2UgSGFucmV0dHksIE1pbGxpZ2FuIHBlcmZvcm1lZCBhbmFseXNpcyBhdCB0aGUgbG9jYWwgbGV2ZWwgbm90IGFjcm9zcyB0aGUgcG9wdWxhdGlvbi4gVGhlIGFuYWx5c2lzIGZvciB0aGlzIGV4dGVuc2lvbiB3aWxsIGRvIHRoZSBzYW1lLCB1c2luZyB0aGUgcmVnaW9uIHZhcmlhYmxlIGZvdW5kIGluIHRoZSBIYW5yZXR0eSBkYXRhIGFzIGEgbGV2ZWwgMiB2YXJpYWJsZS4gSXQgaXMgZXhwZWN0ZWQgdGhhdCBhIG1vZGVsIHRoYXQgbWVhc3VyZXMgZWZmZWN0cyBhdCBsb2NhbCBsZXZlbHMgd2lsbCBmaXQgdGhlIGRhdGEgYmV0dGVyIHRoZW4gYSBzaW5nbGUgbGV2ZWwgbW9kZWwgdGhhdCBkb2VzIG5vdCBhY2NvdW50IGZvciBTcGF0aWFsIGRpZmZlcmVuY2VzLg0KDQpUaGVyZSBhcmUgNCBkaWZmZXJlbnQgbWV0aG9kcyBpbiB3aGljaCBvbmUgY2FuIHRha2UgdG8gY2hlY2sgdGhlIHJlcHJvZHVjYWJpbGl0eSBvZiBTY2llbnRpZmljIHJlc3VsdHMgKEZyZWVzZSBhbmQgUGV0ZXJzb24gMjAxNykuIEluIHRoZSBvcmlnaW5hbCByZXBsaWNhdGlvbiBjaGVjaywgd2hpY2ggd2FzIHBlcmZvcm1lZCBmb3IgSGFucmV0dHnigJlzIG1vZGVsIGFzIHBhcnQgb2YgdGhpcyBwcm9qZWN0LCBhIHZlcmlmaWNhdGlvbiBtZXRob2Qgd2FzIHVzZWQuIFRoZSB2ZXJpZmljYXRpb24gbWV0aG9kIGludm9sdmVzIHVzaW5nIHRoZSBzYW1lIGRhdGEgYW5kIHNhbWUgbWV0aG9kcyBhcyB0aGUgb3JpZ2luYWwgdG8gc2VlIGlmIHRoZSByZXN1bHRzIGFyZSBjb25zaXN0ZW50LiBUaGUgcmVwbGljYXRpb24gd2FzIHVuc3VjY2Vzc2Z1bCBpbiByZXBlYXRpbmcgdGhlIHJlc3VsdHMgYXMgdGhlIGNvZGUgZm9yIHRoZSBNb2RlbCB3YXMgbm90IG1hZGUgYXZhaWxhYmxlIGJ5IEhhbnJldHR5IGZvciB0aGUgcmVwbGljYXRpb24uDQpUaGlzIHBhcGVyIHdpbGwgdXNlIGEgZGlmZmVyZW50IG1ldGhvZCBvZiByZXByb2R1Y2liaWxpdHkgY2hlY2tpbmcgY2FsbGVkIFJvYnVzdG5lc3MgKEZyZWVzZSBhbmQgUGV0ZXJzb24gMjAxNykuIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgbWV0aG9kIG9mIGNoZWNraW5nIGtleSBhbmFseXNpcywgd2hpY2ggaW52b2x2ZXMgdXNpbmcgYW4gYWx0ZXJuYXRpdmUgbWV0aG9kIG9mIGFuYWx5c2lzIHRvIHRoZSBvcmlnaW5hbCBtb2RlbCB0byBzZWUgaWYgcmVzdWx0cyByZXBsaWNhdGUuICBJbiBoaXMgcGFwZXIsIEhhbnJldHR5ICgyMDIxKSBwZXJmb3JtZWQgc2Vuc2l0aXZpdHkgYW5hbHlzaXMgb24gdGhlIG1vZGVsIGNyZWF0ZWQgZm9yIHRoZSBwYXBlciBhbmQgY2xhaW1zIHRoYXQgZm9yIGhpcyByZXN1bHRzIHRvIGJlIGluY29ycmVjdCB0aGVyZSB3b3VsZCBoYXZlIHRvIGJlIGEgbHVya2luZyB2YXJpYWJsZSB3aGljaCBoYXMgdGhpcnR5IHRpbWVzIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSByYW5rIGFuZCBzdWNjZXNzIHZhcmlhYmxlcy4gVGhpcyBtZWFucyB0aGF0IGFuIGV4dGVuZGVkIHZlcnNpb24gb2YgdGhlIG1vZGVsIHdpbGwgeWllbGQgc2ltaWxhciByZXN1bHRzIHRvIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBtb2RlbC4NCg0KIyMgMi4gRGF0YSBhbmQgbWV0aG9kcw0KDQojIyMgMi4xLiBEYXRhDQoNClRoZSBkYXRhIHN1cHBsaWVkIGZvciB0aGUgb3JpZ2luYWwgbW9kZWwgd2FzIHN1cHBsaWVkIGJ5IEhhbnJldHR5IGluIHRoZSBIYXJ2YXJkIGRhdGEgdmVyc2UgcmVwbGljYXRpb24gcGFja2FnZS4gVGhlIG9yaWdpbmFsIHNvdXJjZXMgb2YgdGhlIGRhdGEgY291bGRuJ3QgYmUgc3VwcGxpZWQgYXMgcGVybWlzc2lvbiB3YXMgbm90IGdpdmVuIGZvciB0aGUgcmVkaXN0cmlidXRpb24gb2YgdGhlIHJlc291cmNlcyBieSB0aGUgc3VwcGxpZXIuIFRoZSBSRHMgZmlsZSBzdXBwbGllZCBieSBIYW5yZXR0eSBpcyB0aGUgb25seSBhdmFpbGFibGUgc291cmNlIGZvciB0aGlzIGRhdGEuDQpgYGB7cn0NCmRhdCA8LSByZWFkUkRTKCJEYXRhL3NlbGVjdGlvbl9kYXRhLnJkcyIpDQpgYGANClNpbmNlIHRoZSBkYXRhIHNldCBzdXBwbGllZCBieSBIYW5yZXR0eSBpcyBub3QgYSByYXcgdmVyc2lvbiBvZiB0aGUgZGF0YSB2ZXJ5IGxpdHRsZSBkYXRhIHRyYW5zZm9ybWF0aW9uIHdhcyBuZWVkZWQgZm9yIHRoaXMgdGVzdC4gSG93ZXZlciwgdHJhbnNmb3JtYXRpb24gd2FzIHN0aWxsIHBlcmZvcm1lZCBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBtb2RlbC4NCg0KMS4gQSBudW1lcmljYWwgZHVtbXkgdmFyaWFibGUgd2FzIG1hZGUgZnJvbSBhIGNhdGVnb3JpY2FsIGluIHRoZSBkYXRhIHNldC4gVGhpcyBpcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGluIHRoZSBtb2RlbCBtZWFzdXJpbmcgdGhlIHN1Y2Nlc3Mgb2YgdG93bnMgaW4gcmVjZWl2aW5nIGZ1bmRpbmcgZnJvbSB0aGUgZ292ZXJubWVudC4gICANCmBgYHtyfQ0KZGF0JG91dGNvbWUgPC0gYXMubnVtZXJpYyhkYXQkRnVuZGVkID09ICJZZXMiKQ0KYGBgDQoNCjIuIFRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSB1c2VkIGluIHRoZSBtb2RlbCBpcyB0aGVuIG1hZGUuIFRoaXMgaXMgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlIG9mIGludGVyZXN0LiBJdCBjcmVhdGVzIGEgNSBwb2ludCBzY2FsZSB3aXRoIHRoZSByYW5naW5nIGZyb20gdGhlIGNvbnNlcnZhdGl2ZXMgZmFpbGluZyBnZXR0aW5nIG92ZXIgLTUlIG9mIHRoZSB2b3RlIG9mIHRoZSB3aW5uaW5nIHBhcnR5IHRvIHRoZSBjb25zZXJ2YXRpdmVzIHdpbm5pbmcgd2l0aCBtb3JlIHRoYW4gMTAlIG9mIHRoZSB2b3RlLg0KYGBge3J9DQpkYXQyIDwtIHN1YnNldChkYXQsICFpcy5uYShDb25NYWouYWxsbSkpDQoNCmRhdDI8LSBkYXQgJT4lIA0KICAjYXNfdGliYmxlKCkgJT4lIA0KICBtdXRhdGUoQ29uTWFqLmFsbG0uY2F0ZWdvcmljYWwgPSANCiAgICAgICAgICAgY2FzZV93aGVuKENvbk1hai5hbGxtIDwgLTUgfiAiLTEwJSB0byAtNSUiLA0KICAgICAgICAgICAgICAgICAgICAgQ29uTWFqLmFsbG0gPiAtNSAmIENvbk1hai5hbGxtIDwgMCB+Ii01IHRvIDAiLA0KICAgICAgICAgICAgICAgICAgICAgQ29uTWFqLmFsbG0gPiAwICYgQ29uTWFqLmFsbG0gPCA1IH4iIDAgdG8gNSIsDQogICAgICAgICAgICAgICAgICAgICBDb25NYWouYWxsbSA+IDUgJiBDb25NYWouYWxsbSA8IDEwIH4iNSB0byAxMCIsDQogICAgICAgICAgICAgICAgICAgICBDb25NYWouYWxsbSA+IDEwIH4iZ3JlYXRlciB0aGFuIDEwIikpDQpgYGANCg0KIyMjIDIuMiBFeHBsb3JhdG9yeSBBbmFseXNpcw0KDQpGaWd1cmUgb25lIHNob3dzIHRoZSBudW1iZXIgb2YgdG93bnMgbG9jYXRlZCBpbiBlYWNoIFJlZ2lvbiBvZiBFbmdsYW5kLiBUaGUgY29sb3VycyBvZiB0aGUgYmFyIGluZGljYXRlIGhvdyBtYW55IG9mIHRob3NlIHRvd25zIGFyZSBsb2NhdGVkIGluIENvbnNlcnZhdGl2ZSBoZWxkIHNlYXRzLiBUaGUgQ2hhcnQgaW5kaWNhdGVzIHRoYXQgdGhlIENvbnNlcnZhdGl2ZXMgd2luIGEgbXVjaCBsb3dlciBwcm9wb3J0aW9uIG9mIHRoZSBzZWF0cyBpbiB0aGUgTm9ydGggb2YgRW5nbGFuZCB0aGVuIHRoZXkgZG8gaW4gdGhlIFNvdXRoIGFuZCBNaWRsYW5kcy4NCmBgYHtyfQ0KI3RhYmxlIHNob3dpbmcgbnVtYmVyIG9mIHRvd25zIGxvY2F0ZWQgaW4gZWFjaCByZWdpb24NCmdncGxvdChkYXRhPWRhdDIpKw0KICBhZXMoeD1SZWdpb24sDQogICAgICBmaWxsPUNvbldpbm5lcjEuYWxsbSkrDQogIGdlb21fYmFyKCkrICANCiAgbGFicyh0aXRsZSA9ICJIb3cgbWFueSBUb3ducyBhcmUgaW4gZWFjaCBSZWdpb24/IiwNCiAgICB4PSJSZWdpb24gb2YgRW5nbGFuZCIsDQogICAgICAgeT0iTnVtYmVyIG9mIFRvd25zIiwNCiAgICAgICBmaWxsPSAiSXMgdGhpcyB0b3duIGxvY2F0ZWQgaW4gYSBjb25zZXJ2YXRpdmUgc2VhdD8iKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJ0b3AiKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInJlZDMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmx1ZTQiICkpDQpgYGANCg0KRmlndXJlIDIgc2hvd3MgaG93IHRoZSBzdWNjZXNzIG9mIHRoZSBUb3J5IHBhcnR5IGluIGEgdG93bnMgcGFybGlhbWVudGFyeSBzZWF0IGFmZmVjdHMgaXRzIGxpa2VsaWhvb2Qgb2YgcmVjZWl2aW5nIGZ1bmRpbmcgaW4gdGhlIHRvd25zIGZ1bmQuIFRoZSByZWxhdGlvbnNoaXAgdmFyaWVzIHdpbGRseSBieSBSZWdpb24uIEluIE5vcnRoZXJuIHN0YXRlcywgYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBUb3J5IHZvdGVzIGluY3JlYXNlcyB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBmdW5kaW5nLiBJbiBTb3V0aGVybiByZWdpb25zLCB0aGUgZWZmZWN0IGlzIG9wcG9zaXRlIHdpdGggdG93bnMgbG9jYXRlZCBpbiBzZWF0cyB3aGljaCB2b3RlZCBzdHJvbmdseSBmb3IgdGhlIFRvcmllcyAgDQpgYGB7cn0NCiNSZWxhdGlvbnNoaXAgYmV0d2VlbiANCmdncGxvdChkYXRhPWRhdDIpKw0KICBhZXMoeD1Db25NYWouYWxsbSwNCiAgICAgIHk9b3V0Y29tZSwNCiAgICAgIGNvbG91cj1SZWdpb24pKw0KICBnZW9tX3BvaW50KCkrDQogIGdlb21fc21vb3RoKG1ldGhvZD0iZ2xtIiwNCiAgICAgICAgICAgICAgbGV2ZWw9MCkrDQogICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCJFYXN0IE1pZGxhbmRzIj0ibWVkaXVtcHVycGxlNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFYXN0IG9mIEVuZ2xhbmQiPSJtZWRpdW1wdXJwbGUyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vcnRoIEVhc3QiPSJmaXJlYnJpY2s0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vcnRoIFdlc3QiPSJyZWQzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoIEVhc3QiPSJzdGVlbGJsdWUxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoIFdlc3QiPSJkb2RnZXJibHVlNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXZXN0IE1pZGxhbmRzIj0iYmx1ZXZpb2xldCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3Jrc2hpcmUgYW5kIHRoZSBIdW1iZXIiPSJmaXJlYnJpY2sxIikpKw0KICB0aGVtZV9idygpDQpgYGANCg0KDQoNCg0KIyMjIDIuMy4gTWV0aG9kIGZvciBmaW5hbCBhbmFseXNpcw0KDQpIYW5yZXR0eSBwZXJmb3JtZWQgdGhlIG9yaWdpbmFsIGFuYWx5c2lzIHVzaW5nIGEgc2luZ2xlIGxldmVsIHJlZ3Jlc3Npb24gbW9kZWwuIEEgY2F0ZWdvcmljYWwgdmFyaWFibGUgd2FzIHVzZWQgdG8gc2hvdyBob3cgdGhlIGdhcCBiZXR3ZWVuIHRoZSBUb3JpZXMgYW5kIHRoZWlyIG1haW4gcml2YWwgZm9yIHRoZSBzZWF0IHdhcyB1c2VkIHRvIHNob3cgdGhhdCBjb25zZXJ2YXRpdmUgbWFyZ2luYWwgc2VhdHMgd2VyZSB0YXJnZXRlZCBieSB0aGUgVG9yaWVzIGluIHRoZWlyIFRvd25zIGZ1bmQgc2NoZW1lIHRvIGJvb3N0IHN1cHBvcnQgaW4gZnV0dXJlIGVsZWN0b3JhbCBjeWNsZXMuIFRoZSBpc3N1ZSB3aXRoIHRoaXMgbW9kZWwgaXMgdGhhdCBpdCBmYWlscyB0byBzaG93IGhvdyB0aGlzIGVmZmVjdCBjYW4gdmFyeSBhdCB0aGUgcmVnaW9uYWwgbGV2ZWwuIA0KVGhlIHRoZW9yeSBvZiBQb3JrIEJhcnJlbCBQb2xpdGljcyBpcyBpbmhlcmVudGx5IGdlb2dyYXBoaWMgYXMgaXQgaXMgdGhlIHJlbG9jYXRpb24gb2YgR292ZXJubWVudCBtb25leSB0byBzcGVjaWZpYyBhcmVhcyBpbiB3aGljaCB0aGUgZ292ZXJubWVudCBiZWxpZXZlIHRoYXQgc3BlbmRpbmcgd2lsbCBiZW5lZml0IGl0cyBwb2xpdGljYWwgZ29hbHMoTGFuY2FzdGVyIDE5ODYpLiBUaGVyZWZvcmUsIGl0IG1ha2VzIHNlbnNlIHRvIHBlcmZvcm0gYW5hbHlzaXMgdmFyeWluZyBieSByZWdpb24gYXMgc3BlbmRpbmcgaW4gY2VydGFpbiByZWdpb25zIHdpbGwgeWllbGQgZ3JlYXRlciBwb2xpdGljYWwgZ2FpbnMgaW4gc29tZSByZWdpb25zIHRoZW4gaXQgd291bGQgaW4gb3RoZXJzLiBJbiB0aGlzIGV4dGVuc2lvbiwgYSByYW5kb20gc2xvcGVzIG1vZGVsIHdpbGwgYmUgY3JlYXRlZCB1c2luZyByZWdpb24gYXMgdGhlIGxldmVsIHR3byB2YXJpYWJsZS4gVGhlIHNsb3BlcyB3aWxsIGJlIHZhcmllZCBieSB0aGUgc2l6ZSBvZiB0aGUgY29uc2VydmF0aXZlIHZvdGUgY29tcGFyZWQgdG8gaXRzIGJpZ2dlc3Qgcml2YWwgZm9yIHRoZSBzZWF0LiBUaGUgb3RoZXIgY29udHJvbCB2YXJpYWJsZXMgZm91bmQgaW4gdGhlIG9yaWdpbmFsIG1vZGVsIHdpbGwgYWxzbyBiZSBmZWF0dXJlZCBpbiB0aGUgZXh0ZW5zaW9uIGFzIGxldmVsIG9uZSBjb250cm9scy4gDQpUaGUgcmVzdWx0cyBvcmlnaW5hbCByZWNyZWF0aW9uYWwgbW9kZWwgYW5kIHRoZSBleHRlbnNpb24gbW9kZWwgd2lsbCB0aGVuIGJlIGNvbXBhcmVkIHRvLiBUaGUgc2l6ZSBhbmQgc2lnbmlmaWNhbmNlIG9mIGVmZmVjdHMgd2lsbCBiZSBjb21wYXJlZCB0byBzZWUgaWYgdGhlIGNoYW5nZSBpbiBkZXNpZ24geWllbGRzIHNpZ25pZmljYW50IGNoYW5nZSBpbiByZXN1bHRzLiBBIEJJQyB0ZXN0IHdpbGwgYWxzbyBiZSB1c2VkIHRvIHNob3cgd2hpY2ggbW9kZWwgZml0cyB0aGUgZGF0YSBzZXQgYmVzdC4NCg0KIyMgMy4gUmVzdWx0cw0KDQpUaGUgcmFuZG9tIGVmZmVjdHMgaW50cm9kdWNlZCBpbiB0aGUgZXh0ZW5zaW9uIG1vZGVsIGNyZWF0ZSBubyBzaWduaWZpY2FudCBjaGFuZ2UgaW4gdGhlIGVmZmVjdHMgb2YgdGhlIG9yaWdpbmFsLiBUaGUgb2RkcyByYXRpb3Mgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlcyBhcmUgc2xpZ2h0bHkgbG93ZXIgdGhhbiB0aGUgb3JpZ2luYWwgbW9kZWwgaG93ZXZlciwgdGhlcmUgaXMgbm90IGVub3VnaCBvZiBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgY2hhbmdlIHdoZW4gdGhlIHJhbmRvbSBzbG9wZXMgYXJlIGludHJvZHVjZWQuIEJvdGggbW9kZWxzIGZpbmQgdGhhdCBzZWF0cyB0aGF0IGFyZSBpbiBjb25zdGl0dWVuY2llcyB3aGVyZSBjb25zZXJ2YXRpdmVzIHdpbiB3aXRoIDUgdG8gMTAlIG9mIHRoZSB2b3RlIG1vcmUgdGhhbiB0aGVpciBjbG9zZXN0IHJpdmFsLiAgQmVpbmcgaW4gbWFyZ2luYWwgc2VhdCBzdGlsbCB5aWVsZGVkIHNpZ25pZmljYW50IGVmZmVjdHMgb24gdGhlIG9kZHMgb2YgcmVjZWl2aW5nIGZ1bmRpbmcuIFRvd25zIGxvY2F0ZWQgaW4gc2VhdHMgdGhhdCBoYWQgbWFyZ2luYWxseSBsb3N0IGluIHdlcmUgNi43MSB0aW1lcyBtb3JlIGxpa2VseSB0byByZWNlaXZlIGZ1bmRpbmcgYW5kIHRvd25zIHdoaWNoIHRoZSBjb25zZXJ2YXRpdmVzIG1hcmdpbmFsbHkgd29uIHdlcmUgNC4wMyB0aW1lcyBtb3JlIGxpa2VseSB0byByZWNlaXZlIGZ1bmRpbmcgZnJvbSB0aGUgdG93bnMgZnVuZC4gQmVpbmcgbG9jYXRlZCBpbiBhIHNlYXQgd2hpY2ggaGFkIGEgY29uc2VydmF0aXZlIG1ham9yaXR5IGdyZWF0ZXIgdGhlbiAxMCUgZGlkIG5vdCBoYXZlIGFueSBzaWduaWZpY2FudCBlZmZlY3Qgb24gdGhlIGRhdGEuIA0KVGhlIHJlZ2lvbiB2YXJpYWJsZSBkaWQgbm90IGV4cGxhaW4gdGhlIHZhcmlhbmNlIGluIHRoZSBkYXRhLiBUaGUgcmFuZG9tIGVmZmVjdCBjb2VmZmljaWVudCB3YXMgb25seSAwLjA2IG1lYW5pbmcgdGhhdCB0aGVyZSB3YXMgbm8gc2lnbmlmaWNhbnQgZWZmZWN0IG9uIHRoZSBkYXRhIGZyb20gdGhlIFJlZ2lvbiB2YXJpYWJsZSB3aGVuIGl0IHdhcyB1c2VkIGFzIGEgbGV2ZWwgdHdvIGluZGVwZW5kZW50IHZhcmlhYmxlLiBUaGUgcmFuZG9tIGVmZmVjdCBjb2VmZmljaWVudHMgZm9yIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSB3ZXJlIG1peGVkLiAgVGhlIDAgdG8gNSUgYW5kIGdyZWF0ZXIgdGhhbiAxMCUgY29lZmZpY2llbnRzIGV4cGxhaW5lZCBtdWNoIG1vcmUgb2YgdGhlIHZhcmlhbmNlIGluIHRoZSBtb2RlbCB0aGVuIHRoZSBvdGhlciBsZXZlbHMgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlLg0KVGhlIGVmZmVjdHMgb2YgdGhlIGNvbnRyb2wgdmFyaWFibGVzIGRpZCBub3QgaGF2ZSBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgY2hhbmdlIGZyb20gdGhlIG9yaWdpbmFsIG1vZGVsIGFwYXJ0IGZyb20gdGhlIFF1YWxpZmljYXRpb24gYW5kIEluY29tZSBkZXBlbmRlbmN5IHZhcmlhYmxlcy4gSW50cm9kdWNpbmcgdGhlIGxldmVsIDIgcmVnaW9uIGVmZmVjdHMgdG8gdGhlIG1vZGVsIG1hZGUgdGhlIHJlc3VsdCBvZiB0aGUgUXVhbGlmaWNhdGlvbiB2YXJpYWJsZSBzaWduaWZpY2FudCBkZXNwaXRlIGl0cyBzbWFsbCBvZGRzIHJhdGlvIG9mIDAuMjcuICBUaGUgb2RkcyByYXRpbyBvZiBJbmNvbWUgRGVwZW5kZW5jeSBncmV3IHRvIDEwLjE4IHRoZSBzZWNvbmQgbGFyZ2VzdCBlZmZlY3QgZm91bmQgaW4gdGhlIG1vZGVsLiBUaGlzIGluZGljYXRlcyB0aGF0IHNwZW5kaW5nIGNvdWxkIGhhdmUgYmVlbiB0YXJnZXRlZCB0b3dhcmRzIHRvd25zIHRoYXQgd2l0aCBoaWdoZXIgbGV2ZWxzIG9mIGluY29tZSBpbmVxdWFsaXR5LCB0aGlzIGlzIHNob3VsZCBiZSBhbiBleHBlY3RlZCBvdXRjb21lIGZvciB0aGUgZGF0YSBhcyB0b3duIGZ1bmQgc2NoZW1lcyBhcmUgYSBtZXRob2Qgb2Ygd2hpY2ggdGhlIGdvdmVybm1lbnQgb2YgdGhlIGRheSBjYW4gYWRkcmVzcyByZWdpb25hbCBpbmVxdWFsaXRpZXMgKEhvYXJlLCAxOTg1KS4NCg0KYGBge1J9DQojT3JpZ2luYWwgTW9kZWwgUmVwbGljYXRpb24NCk9yaWdpbmFsIDwtIA0KICBnbG0ob3V0Y29tZSB+IENvbk1hai5hbGxtLmNhdGVnb3JpY2FsKw0KICAgICAgICAgICAgICAgICBsb2coUG9wKSArIA0KICAgICAgICAgICAgICAgICBSYW5rICsgDQogICAgICAgICAgICAgICAgIENvbldpbm5lcjEuYWxsbSArIA0KICAgICAgICAgICAgICAgICBSZWdpb24rDQogICAgICAgICAgICAgICAgIFF1YWxzKyANCiAgICAgICAgICAgICAgICAgSW5jb21lRGVwKw0KICAgICAgICAgICAgICAgICBCcmV4aXQrDQogICAgICAgICAgICAgICAgIFByb2R1Y3Rpdml0eSsNCiAgICAgICAgICAgICAgICAgU2hvY2tzKw0KICAgICAgICAgICAgICAgICBJbnZlc3RtZW50Kw0KICAgICAgICAgICAgICAgICBBbGlnbm1lbnQsDQogICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbCwNCiAgICAgICAgICAgICAgIGRhdGEgPSBkYXQyKQ0KDQoNCiNFeHRlbnNpb24gTW9kZWwNCkV4dGVuc2lvbiA8LSBnbG1lcihkYXRhPWRhdDIsIG91dGNvbWV+IENvbk1hai5hbGxtLmNhdGVnb3JpY2FsKw0KICAgICAgICAgICAgICAgICAgICAgICBsb2coUG9wKSsgDQogICAgICAgICAgICAgICAgICAgICAgIFJhbmsrDQogICAgICAgICAgICAgICAgICAgICAgIENvbldpbm5lcjEuYWxsbSsgDQogICAgICAgICAgICAgICAgICAgICAgIFF1YWxzKyANCiAgICAgICAgICAgICAgICAgICAgICAgSW5jb21lRGVwKw0KICAgICAgICAgICAgICAgICAgICAgICBCcmV4aXQrDQogICAgICAgICAgICAgICAgICAgICAgIFByb2R1Y3Rpdml0eSsNCiAgICAgICAgICAgICAgICAgICAgICAgU2hvY2tzKw0KICAgICAgICAgICAgICAgICAgICAgICBJbnZlc3RtZW50Kw0KICAgICAgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQrKCAxKyBDb25NYWouYWxsbS5jYXRlZ29yaWNhbCB8UmVnaW9uKSwNCiAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PWJpbm9taWFsKQ0KDQp0YWJfbW9kZWwoT3JpZ2luYWwsRXh0ZW5zaW9uKQ0KYGBgDQoNClRoZSBCSUMgdGVzdCBzaG93cyB0aGF0IHRoZSBvcmlnaW5hbCByZXBsaWNhdGlvbiBtb2RlbCBmaXRzIHRoZSBkYXRhIGJldHRlciB0aGVuIHRoZSBtb2RlbCBjcmVhdGVkIGZvciB0aGlzIGV4dGVuc2lvbjsgaW5kaWNhdGluZyB0aGF0IHRoZSBvcmlnaW5hbCBtb2RlbCBjcmVhdGVkIGJ5IEhhbnJldHR5IGZpdHMgdGhlIGRhdGEgbW9yZSBhY2N1cmF0ZWx5IHRoYW4gdGhlIGV4dGVuc2lvbiBtb2RlbCBjcmVhdGVkIG9yIHRoaXMgcHJvamVjdC4gVGhpcyBtZWFucyB0aGF0IGl0IGlzIHVubGlrZWx5IHRoYXQgdGhlIHJlZ2lvbmFsIGVmZmVjdHMgdXNlZCBpbiB0aGUgbW9kZWwgaGF2ZSBkbyBub3QgaGF2ZSBhIHNpZ25pZmljYW50IGVmZmVjdCBvbiB3aGV0aGVyIG9yIG5vdCB0b3ducyByZWNlaXZlZCBmdW5kaW5nIGZyb20gdGhlIEdvdmVybm1lbnQuIFRoZXJlZm9yZSwgdGhlcmUgd2lsbCBiZSBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGVmZmVjdHMgdGhhdCB0aGUgQ29uc2VydmF0aXZlIE1ham9yaXR5IGNhdGVnb3JpY2FsIHZhcmlhYmxlIHdpbGwgaGF2ZSBvbiB0aGUgZGVwZW5kYW50IHZhcmlhYmxlIGFjcm9zcyByZWdpb25zLiANCmBgYHtyfQ0KQklDKE9yaWdpbmFsLEV4dGVuc2lvbikNCmBgYA0KDQoNCiMjIDQuIENvbmNsdXNpb25zDQoNCkNocmlzIEhhbnJldHR54oCZcyBtb2RlbCBkaWQgbm90IHJlcGxpY2F0ZSBpbiB0aGUgb3JpZ2luYWwgdmVyaWZpYWJpbGl0eSBjaGVjayBwZXJmb3JtZWQgaW4gdGhpcyBwcm9qZWN0LiAgSG93ZXZlciwgaW4gdGhpcyByb2J1c3RuZXNzIGNoZWNrIHRoZSByZXN1bHRzIGZvdW5kIHdlcmUgc2ltaWxhciBzdWdnZXN0aW5nIHRoYXQgdGhlIG1vZGVsIGRvZXMgeWllbGQgcm9idXN0IHJlc3VsdHMuIFRoZSBCSUMgdGVzdCBjb21wYXJpbmcgdGhlIHR3byBtb2RlbHMgZm91bmQgdGhhdCB0aGUgb3JpZ2luYWwgc2luZ2xlIGxldmVsIG1vZGVsIGZpdCB0aGUgZGF0YSBtb3JlIHRoYW4gdGhlIGV4dGVuc2lvbiB2ZXJzaW9uIG9mIHRoZSBtb2RlbCB3aGljaCBoYWQgcmFuZG9tIHNsb3Blcy4gIFRoZSBudWxsIGh5cG90aGVzaXMgc3RhdGVkIGluIHRoZSBwcmUtcmVnaXN0cmF0aW9uIGZvcm0gc3RhdGluZyB0aGF0IHRoZSBtb2RlbCB3aXRoIHJlZ2lvbmFsIHJhbmRvbSBzbG9wZXMgd291bGQgYmUgc3VwZXJpb3IgY2FuIGJlIHJlamVjdGVkLiBUaGlzIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgcmVnaW9uYWwgdmFyaWFuY2UgaW4gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvbnNlcnZhdGl2ZSB2b3RlIGFuZCB0aGUgb2RkcyBvZiByZWNlaXZpbmcgZnVuZGluZy4gVGhlIHJlbGF0aW9uc2hpcCBkaXNjb3ZlcmVkIGluIHRoZSBQb3JrIEJhcnJlbCBQb2xpdGljcyBvZiB0aGUgVG93bnMgRnVuZCAoSGFucmV0dHksIDIwMjEpIHBhcGVyIGlzIGxpa2VseSB0byBiZSBhbiBlZmZlY3QgdGhhdCBjYW4gYmUgZm91bmQgYWNyb3NzIHRoZSBkYXRhIG5vdCBqdXN0IGluIGNlcnRhaW4gZ2VvZ3JhcGhpYyBsb2NhdGlvbnMuICBUaGUgcmVnaW9uYWwgZWZmZWN0cyBmb3VuZCBieSBNaWxsaWdhbiBhbmQgU21hcnQoMjAwNSkgY291bGQgbm90IGJlIHJlcGxpY2F0ZWQgd2l0aCB0aGlzIG1vZGVsIC4NCg0KDQojIyBSZWZlcmVuY2VzDQoNCkZyZWVzZSwgSi4sICYgUGV0ZXJzb24sIEQuICgyMDE3KS4gUmVwbGljYXRpb24gaW4gc29jaWFsIHNjaWVuY2UuICpBbm51YWwgUmV2aWV3IG9mIFNvY2lvbG9neSosIDQzLCAxNDctMTY1LCBbZG9pOiAxMC4xMTQ2XShodHRwczovL3d3dy5hbm51YWxyZXZpZXdzLm9yZy9kb2kvYWJzLzEwLjExNDYvYW5udXJldi1zb2MtMDYwMTE2LTA1MzQ1MCkuDQoNCkhhbnJldHR5LCBDLiAoMjAyMSkuICJUaGUgcG9yayBiYXJyZWwgcG9saXRpY3Mgb2YgdGhlIFRvd25zIEZ1bmQuIiBUaGUgUG9saXRpY2FsIFF1YXJ0ZXJseSA5MigxKTogNy0xMy4NCg0KSG9hcmUsIEEuRy4sIDE5ODMuIFBvcmstYmFycmVsbGluZyBpbiBCcml0YWluOiBhIHJldmlldy4gRW52aXJvbm1lbnQgYW5kIFBsYW5uaW5nIEM6IEdvdmVybm1lbnQgYW5kIFBvbGljeSwgMSg0KSwgcHAuNDEzLTQzOC4NCg0KSG9hcmUsIEEuIEcuICgxOTg1KS4gRGl2aWRpbmcgdGhlIHBvcmsgYmFycmVsOiBCcml0YWluJ3MgZW50ZXJwcmlzZSB6b25lIGV4cGVyaWVuY2UuIFBvbGl0aWNhbCBHZW9ncmFwaHkgUXVhcnRlcmx5LCA0KDEpLCAyOS00Ni4NCg0KTGFuY2FzdGVyLCBULiBELiAoMTk4NikuICJFbGVjdG9yYWwgc3RydWN0dXJlcyBhbmQgcG9yayBiYXJyZWwgcG9saXRpY3MuIiBJbnRlcm5hdGlvbmFsIFBvbGl0aWNhbCBTY2llbmNlIFJldmlldyA3KDEpOiA2Ny04MS4NCg0KTWlsbGlnYW4sIEsuUy4gYW5kIFNtYXJ0LCBNLiwgMjAwNS4gUmVnaW9uYWwgZ3JhbnRzIGFzIHBvcmsgYmFycmVsIHBvbGl0aWNzLiBBdmFpbGFibGUgYXQgU1NSTiA3MTA5MDMuDQoNCg0KIyMgQXBwZW5kaXgNCg0KIyMjIEFwcGVuZGl4IDEuIE15IGVudmlyb21lbnQgKGZ1bGwgaW5mb3JtYXRpb24pIA0KDQpgYGB7ciBzZXNzaW9ufQ0KIyBEZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBteSBlbnZpcm9ubWVudA0Kc2Vzc2lvbkluZm8oKQ0KYGBgDQoNCg0KIyMjIEFwcGVuZGl4IDIuIEVudGlyZSBSIGNvZGUgdXNlZCBpbiB0aGUgcHJvamVjdA0KDQpgYGB7ciByZWYubGFiZWw9a25pdHI6OmFsbF9sYWJlbHMoKSwgZWNobz1UUlVFLCBldmFsPUZBTFNFfQ0KIyMjRGF0YSBUcmFuc2Zvcm1hdGlvbiBDb2RlLS0tLQ0KDQojQ3JlYXRpbmcgYmluYXJ5IGRlcGVuZGFudCB2YXJpYWJsZQ0KZGF0JG91dGNvbWUgPC0gYXMubnVtZXJpYyhkYXQkRnVuZGVkID09ICJZZXMiKQ0KDQpkYXQyIDwtIHN1YnNldChkYXQsICFpcy5uYShDb25NYWouYWxsbSkpDQoNCiNDcmVhdGluZyBDb25zZXJ2YXRpdmUgbWFqb3JpdHkgQ2F0ZWdvcmljYWwgVmFyaWFibGUNCmRhdDI8LSBkYXQgJT4lIA0KICAjYXNfdGliYmxlKCkgJT4lIA0KICBtdXRhdGUoQ29uTWFqLmFsbG0uY2F0ZWdvcmljYWwgPSANCiAgICAgICAgICAgY2FzZV93aGVuKENvbk1hai5hbGxtIDwgLTUgfiAiLTEwJSB0byAtNSUiLA0KICAgICAgICAgICAgICAgICAgICAgQ29uTWFqLmFsbG0gPiAtNSAmIENvbk1hai5hbGxtIDwgMCB+Ii01IHRvIDAiLA0KICAgICAgICAgICAgICAgICAgICAgQ29uTWFqLmFsbG0gPiAwICYgQ29uTWFqLmFsbG0gPCA1IH4iIDAgdG8gNSIsDQogICAgICAgICAgICAgICAgICAgICBDb25NYWouYWxsbSA+IDUgJiBDb25NYWouYWxsbSA8IDEwIH4iNSB0byAxMCIsDQogICAgICAgICAgICAgICAgICAgICBDb25NYWouYWxsbSA+IDEwIH4iZ3JlYXRlciB0aGFuIDEwIikpDQoNCiNFeHBsb3JhdG9yeSBBbmFseXNpcyBDb2RlLS0tDQoNCiN0YWJsZSBzaG93aW5nIG51bWJlciBvZiB0b3ducyBsb2NhdGVkIGluIGVhY2ggcmVnaW9uDQpnZ3Bsb3QoZGF0YT1kYXQyKSsNCiAgYWVzKHg9UmVnaW9uLA0KICAgICAgZmlsbD1Db25XaW5uZXIxLmFsbG0pKw0KICBnZW9tX2JhcigpKyAgDQogIGxhYnModGl0bGUgPSAiSG93IG1hbnkgVG93bnMgYXJlIGluIGVhY2ggUmVnaW9uPyIsDQogICAgeD0iUmVnaW9uIG9mIEVuZ2xhbmQiLA0KICAgICAgIHk9Ik51bWJlciBvZiBUb3ducyIsDQogICAgICAgZmlsbD0gIklzIHRoaXMgdG93biBsb2NhdGVkIGluIGEgY29uc2VydmF0aXZlIHNlYXQ/IikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0idG9wIikrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJyZWQzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJsdWU0IiApKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiNSZWxhdGlvbnNoaXAgYmV0d2VlbiBDb25zZXJ2YXRpdmUgbWFyZ2lucyBhbmQgb2RkcyBvZiBzdWNjZXNzDQpnZ3Bsb3QoZGF0YT1kYXQyKSsNCiAgYWVzKHg9Q29uTWFqLmFsbG0sDQogICAgICB5PW91dGNvbWUsDQogICAgICBjb2xvdXI9UmVnaW9uKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBnZW9tX3Ntb290aChtZXRob2Q9ImdsbSIsDQogICAgICAgICAgICAgIGxldmVsPTApKw0KICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9YygiRWFzdCBNaWRsYW5kcyI9Im1lZGl1bXB1cnBsZTQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWFzdCBvZiBFbmdsYW5kIj0ibWVkaXVtcHVycGxlMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3J0aCBFYXN0Ij0iZmlyZWJyaWNrNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3J0aCBXZXN0Ij0icmVkMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCBFYXN0Ij0ic3RlZWxibHVlMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCBXZXN0Ij0iZG9kZ2VyYmx1ZTQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2VzdCBNaWRsYW5kcyI9ImJsdWV2aW9sZXQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW9ya3NoaXJlIGFuZCB0aGUgSHVtYmVyIj0iZmlyZWJyaWNrMSIpKSsNCiAgdGhlbWVfYncoKQ0KDQojQ29kZSBmb3IgTW9kZWxzLS0tLQ0KDQojb3JpZ2luYWwgbW9kZWwNCk9yaWdpbmFsIDwtIA0KICBnbG0ob3V0Y29tZSB+IENvbk1hai5hbGxtLmNhdGVnb3JpY2FsKw0KICAgICAgICAgICAgICAgICBsb2coUG9wKSArIA0KICAgICAgICAgICAgICAgICBSYW5rICsgDQogICAgICAgICAgICAgICAgIENvbldpbm5lcjEuYWxsbSArIA0KICAgICAgICAgICAgICAgICBSZWdpb24rDQogICAgICAgICAgICAgICAgIFF1YWxzKyANCiAgICAgICAgICAgICAgICAgSW5jb21lRGVwKw0KICAgICAgICAgICAgICAgICBCcmV4aXQrDQogICAgICAgICAgICAgICAgIFByb2R1Y3Rpdml0eSsNCiAgICAgICAgICAgICAgICAgU2hvY2tzKw0KICAgICAgICAgICAgICAgICBJbnZlc3RtZW50Kw0KICAgICAgICAgICAgICAgICBBbGlnbm1lbnQsDQogICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbCwNCiAgICAgICAgICAgICAgIGRhdGEgPSBkYXQyKQ0KDQojRXh0ZW5zaW9uIE1vZGVsDQpFeHRlbnNpb24gPC0gZ2xtZXIoZGF0YT1kYXQyLCBvdXRjb21lfiBDb25NYWouYWxsbS5jYXRlZ29yaWNhbCsNCiAgICAgICAgICAgICAgICAgICAgICAgbG9nKFBvcCkrIA0KICAgICAgICAgICAgICAgICAgICAgICBSYW5rKw0KICAgICAgICAgICAgICAgICAgICAgICBDb25XaW5uZXIxLmFsbG0rIA0KICAgICAgICAgICAgICAgICAgICAgICBRdWFscysgDQogICAgICAgICAgICAgICAgICAgICAgIEluY29tZURlcCsNCiAgICAgICAgICAgICAgICAgICAgICAgQnJleGl0Kw0KICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0aXZpdHkrDQogICAgICAgICAgICAgICAgICAgICAgIFNob2NrcysNCiAgICAgICAgICAgICAgICAgICAgICAgSW52ZXN0bWVudCsNCiAgICAgICAgICAgICAgICAgICAgICAgQWxpZ25tZW50KyggMSsgQ29uTWFqLmFsbG0uY2F0ZWdvcmljYWwgfFJlZ2lvbiksDQogICAgICAgICAgICAgICAgICAgICAgIGZhbWlseT1iaW5vbWlhbCkNCg0KdGFiX21vZGVsKE9yaWdpbmFsLEV4dGVuc2lvbikNCmBgYA==