Linear regression modeling on Age and how it impacts attitudes towards immigration depending n the amount of Education level taken

Study Preregistration form: https://rpubs.com/Hi220180201/1194721

Information about this replication project

• This is a replication project based on Ruedin, D. (2020). Do we need multiple questions to capture feeling threatened by immigrants? Political Research Exchange, 2(1), 1758576. Available at https://doi.org/10.1080/2474736X.2020.1758576 • I previously conducted a replication of the paper using the same methods and the same data based on the replication package that was available on the OSF website: https://osf.io/bnftz/?view_only= DOI 10.17605/OSF.IO/BNFTZ • This replication is an extension of the original paper using the same data and different methods to test the robustness

Workspace setup

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

# All used libraries
library(tidyverse) #tidyverse
library(pscl)      # ZINB
library(arm)       # coefplot
library(stargazer) # stargazer
library(psych)     # alpha
library(reshape2)  # reshape
library(lme4)      # lmer
library(brms)      # Stan interface
library(rstanarm)  # Stan interface
library(sp)        # plotting maps
library(rmarkdown) # render("analysis-threat-redux.Rmd")
library(knitr)     # kable()
library(arm)# coefplot
library(dplyr)
library(ggplot2)
library(sjPlot) # Tab_model function
library(haven)
library(merTools)
library(lattice)
library(glmmTMB)
library(lmerTest)

Versions of used packages

$rmarkdown
[1] '2.26'

$knitr
[1] '1.45'

My enviroment

[1] "R version 4.3.3 (2024-02-29 ucrt)"

1. Introduction

Ruedin paper (2020) examines how individuals in Europe are uneasy and feel threatened by immigration. Respondents consistently regard immigrants from other cultures and those more likely to get social benefits as more dangerous. To do so, it examined whether types of immigrants are viewed as more threatening than others, while also emphasising that studies that capture sentiments against immigrants in a generalised a sense properly identify whoever feels most intimidated by and opposes immigration. I previously conducted a replication using the same data and same methods with adjustments to test the papers verifiability, my results supported the outcomes of the original paper. Didier utilised a fine-grained method, he demonstrated that responses to various immigrants change systematically. At the end he states that, correlations among various immigrants are often similar to each other, yet when looking at specific immigrants instead of combining questions, preferences around stereotypes may impact the outcomes. The findings that Didier claimed was the fact that older people are prone to display a more negative view towards immigrants. Given my lack of comprehension on the reason he had made this assertion along with lack of clarification I was interested in investigating this specific claim to determine if what he claimed was accurate or not. Lack of reasons forced me to look up different perspectives on this particular claim and what other researchers had discovered.

Drazanova,2022, had stated that the primary conclusion of our meta-analysis demonstrates that attitudes towards immigration are most closely connected to two individual-level variables: age (in a negative way) and education (in a positive way). People with greater educational backgrounds tend to perceive immigration positively. It additionally observes that the influence of education is not only related to its correlation with income, indicating that it also denotes a divide on the basis of values. On the other hand, attitudes on immigration decrease with age. The anti-immigration attitudes of older respondents are much stronger than those of younger ones. Also, an even deeper relationship to social views has been demonstrated. The findings are consistent when age is taken into account: As older people are less accepting towards immigration then younger indivuals. (Chandler and Tsai, 2001; Citrin, Reingold, and Green,1990; Coenders and Scheepers1998,20008; Espenshade and Calhoun,1993; Ford,2008,2011; Heath and Tilley2005; Heath and Richards,2020; Ramos, Pereira and Vala,2020; and Schlueter, Masso and Davidov,2020 ; Quillian,1995; Paterson,2018; Semyonov, Raijman, and Gorodzeisky,2006).

Research also suggests that attitudes towards immigration could change over time through generational replacement. Although certain analyses show minimal effects of age (Crepaz and Damron, 2009; Scheve and Slaughter, 2001; Van Dalen and Henkens, 2005; Weldon, 2006), age typically has a statistically significant effect on immigration attitudes. Age is typically included in studies of attitudes towards immigration at least as a control variable.

Education plays a crucial role in influencing younger generations to far right ideologies regarding anti-immigration view. The factors behind education’s significant impact on attitudes towards immigration, discrimination, and other views like political tolerance are still unclear, but two main theories explain the consequences: (a) exposure to a diversity of ideas and (b) cognitive development ( Coenders and Scheepers, 2003; Espenshade and Calhoun, 1993; Sniderman, Brody, and Kuklinski, 1948; Vogt, 1997). Higher education, for instance, is associated with more self-worth and confidence, as well as a greater appreciation for cultural diversity (Hainmueller and Hiscox, 2007).Thus, a mix of cultural mechanisms and the employment market is probably responsible for the overall effect of schooling on attitudes. As a result, there is a stronger than anticipated positive association between immigration sentiments and education.

-Hypothesis: The original replication projected just stated the claim where older people have a negative view on immigration and there wasn’t any explanation why that claim was made.I am hoping to prove it as an actual relation

2. Data and methods

2.1. Data

The dataset was acknowledged in the article, with a reference pointing to the OSF website. When opening Didier’s main dataset, it didn’t have the control variable and therefore he had to code them in the dataset which I had used named angst. The entire dataset contained 1008 objects and 52 variables; however, in the dataset I utilised, we constructed a separate dataset named rim2, which contained 15027 items and 39 variables. I sub setted out all of the neighbours data so I could concentrate on the bus variables, I had also changed most of the variables so it would be easier reading the tables and graphs .

Value (fear), my dependent variable, was measured on a scale of 1 to 10, with 10 denoting a serious threat, 5–6 denoting a medium-sized threat, and 1 denoting no threat at all. My primary variables, age and education, were divided into separate groups by the independent variable. Since education is categorical, it can be divided into groups according to different educational levels, such as primary vocational training (9 years), high school (12 years), higher vocational college (15 years), and university (18 years).Regarding age, I divided them into three categories: young adults (ages 0-34), middle-aged (ages 35–54), and elderly (ages 55 and above).The other independent variable were my moderator variables Fearful Personality measured on a 10-point scale, Right-wing ideology measured on a scale from 0-10, Female measured by sex and lastly Active in labour.

# opening dataset
load("C:/Users/HP/Desktop/205/SMI-205-Replication-Project/Data/Angst.1.RData")
# Adding all the variables
# gender (1=female)
angst$sex[angst$geschlf==1] = 0 # male
angst$sex[angst$geschlf==2] = 1 # female
angst$sex = factor(angst$sex)   # nominal
angst$age = angst$alternum      # age
# cleaning
angst$mcp = angst$f4                   # motivation to control prejudice (MCP)
angst$fear[angst$f2n<11] = angst$f2n[angst$f2n<11] # fearful 1..10; filter out 99
# Party position on immigration from CHES 2011, recoded 0..10
angst$party[angst$p02==1] = 3.889   # CSP
angst$party[angst$p02==2] = 5.556   # CVP
angst$party[angst$p02==3] = 4.938   # EVP
angst$party[angst$p02==4] = 6.944   # FDP
# 5 not occurring
angst$party[angst$p02==6] = 0.648   # GPS
angst$party[angst$p02==7] = 3.535   # GLP
angst$party[angst$p02==8] = 9.012   # Lega
# 9 not occurring
angst$party[angst$p02==10] = 1.111  # PdA
angst$party[angst$p02==11] = 9.833  # SD, from 2004 B&L
angst$party[angst$p02==12] = 0.463  # SPS
angst$party[angst$p02==13] = 9.63   # SVP
# 14 not occurring
angst$party[angst$p02==15] = 0.648  # Grünes Bündnis; set as GPS
angst$party[angst$p02==16] = 8.667  # EDU
angst$party[angst$p02==17] = 6.869  # BDP
angst$party[angst$p02==18] = 1.111  # AdG; set as PdA
angst$ideology = angst$party        # duplicate (not elegant), but I often confused them
angst$party = NULL                  # remove for clearer dataset
angst$edu[angst$s14a17 < 8] = angst$s14a17[angst$s14a17 < 8] # filter DK; 1..7
angst$active[angst$s15==1] = 1 # in labour force (erwerbstätig)
angst$active[angst$s15==2] = 0 # not in labour force
angst$active = factor(angst$active)   # nominal
## converting edu into years of schooling:
angst$educat = angst$edu # keep old, recode (following table 7 in Attitudes I)
angst$edu[angst$educat == 1] = 7  # none; set to 7 (or less), N=4; not too far of to avoid impact
angst$edu[angst$educat == 2] = 9  # compulsory school, elementary vocational training
angst$edu[angst$educat == 3] = 12
angst$edu[angst$educat == 4] = 12 # general training school, apprenticeship, full-time vocational school, maturity (high school)
angst$edu[angst$educat == 5] = 15
angst$edu[angst$educat == 6] = 15 # technical or vocational school; higher vocational college
angst$edu[angst$educat == 7] = 18 # university
# sum of all responses with a valid response, -1 so that 0 is the lowest value
angst$combi = rowSums(cbind(angst$f1_1-1, angst$f1_2-1, angst$f1_3-1, angst$f1_4-1, angst$f1_5-1, angst$f1_6-1, angst$f1_7-1, angst$f1_8-1, angst$f1_9-1, angst$f2_1-1, angst$f2_2-1, angst$f2_3-1, angst$f2_4-1, angst$f2_5-1, angst$f2_6-1, angst$f2_7-1, angst$f2_8-1, angst$f2_9-1, angst$f2_10-1, angst$f2_11-1, angst$f2_12-1, angst$f2_13-1, angst$f2_14-1, angst$f2_15-1), na.rm=TRUE)
rim2 = melt(angst, measure.vars = c("f2_1", "f2_2", "f2_3", "f2_4", "f2_5", "f2_6", "f2_7", "f2_8", "f2_9", "f2_10", "f2_11", "f2_12", "f2_13", "f2_14", "f2_15"), variable.name = "group", na.rm=TRUE)


b1 = lmer(value ~ group + (1 | coderesp), data=rim2)
b2 = lmer(value ~ group + (1 | coderesp) + edu + mcp + age, data=rim2)
b3 = lmer(value ~ group + (1 | coderesp) + edu + mcp + age + fear + ideology + sex + active, data=rim2)

  labls = c("Businessman\nFar East", "Businessman\nCross-border", "Craftsman\nBroken German", "Craftsman\nIncomprehensible", "Tourist\nWestern Europe", "Tourist\nFar East", "Jobseeker\nSouth-Eastern Europe", "Jobseeker\nIndia", "Jobseeker\nWestern Europe", "Jobseeker\nAfrica", "Headscarf", "Dark skin", "Portugal\n(trad. guestworker)", "Italy\n(trad. guestworker)")
# subsetting age into three different categories
rim2$Agecategory <- cut(rim2$age, 
                          breaks = c(-Inf
                                    ,34,54, Inf), 
                          labels = c("-34", "35-54","55+"),
                        right = FALSE)
                        
                        
# recoding the categories into age groups
rim2 <- rim2 %>%
  mutate(Agegroup = recode(Agecategory,
                           "-34" = "Young Adults",
                           "35-54" = "Middle Age",
                           "55+" = "Elderly"))

rim2 <- rim2%>%
  mutate(Educationlevel = recode(edu,
                      "7" = "Compulsory School not completed",
                "9" = "Compulsory School, elementary vocational training",
                "12" = "High School",
                "15" = "Higher vocational college",
                "18" = "University"))

2.2. Methods

Didier decided to utilise a multivariate regression strategy for the population size in the original research. It is impossible to determine, though, because the paper doesn’t adequately describe the variables used in this particular research or provide an explanation for his choice of model. I’m utilising cluster graphs and mixed-effects linear regression, which enable me to use the entire range of variables. Prior to commencing, I employed cluster graphs to ascertain the associations between age and education and their mutual influence. Subsequently, I employed a bar graph to illustrate the relationship between fear (a value) and age groups, as well as to ascertain whether attitudes regarding age vary among various age groups or remain constant.

In the research, a linear regression model was used to assess the dependent variable “value”. Data on a range of variables, including age groups and educational achievement, were collected from multiple respondents in order to account for individual variation. In this model fixed effects were used such as age (Young, middle age and Elderly) categories and education level(“Compulsory School not completed, Compulsory School, elementary vocational training, High School, Higher vocational college, University) alongside random intercepts in the model. To evaluate the significant of each predictors, the confidence intervals and p-values were codeded after the coefficients for fixed effects and variances for random effects were evaluated. The hypothesis’s fit was assessed by coding the variance of the residuals (σ²), the variance of random intercepts (τ00). In addition, the variance explained by fixed factors only and by random as well as fixed effects were measured using the marginal R2 and conditional R2, respectively. This all-encompassing strategy took individual differences into consideration while enabling a thorough knowledge of the factors impacting the dependent variable.

3. Results

The findings of the regression analysis are summarised in the table, which focuses on the influence of different demographic and socioeconomic factors on the dependent variable. The dependent value for the intercept is 1.10 and confidence level from 0.59 to 1.96 while the p value is <0. 001.The dependent variable years of education and self-monitoring(the random intercept is -0.20, the confidence level is -0.29 - -0.11 and there p-value is <0.001 both have a negative-significant effect. While the other dependent variable such as age(the random intercept is 0.01, the confidence level is 0.00 – 0.01 and there p-value = 0.001), fearful personality(the random intercept is 0.14, the confidence level is 0.10 – 0.18 and there p-value is <0.001) and right-wing ideology(the random intercept is 0.06, the confidence level is 0.04 – 0.08 and there p-value is <0.001) both have a positive significant effect which shows that they have a positive association with “value”. Females(the random intercept is 0.13, the confidence level is -0.03 – 0.29 and there p-value = 0.100) have positive but its non-significant and Active inn labour(the random intercept is -0.05, the confidence level is -0.23 – 0.13 and there p-value = 0.563) has a non-significant negative effect.

Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: 
value ~ group + (1 | coderesp) + Years_of_education + Self_monitoring +  
    age + Fearful_personality + right_wing_ideology + Female +  
    Active_in_Labour_Market
   Data: rim2

REML criterion at convergence: 25192.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.6471 -0.4582 -0.0614  0.2710  9.2296 

Random effects:
 Groups   Name        Variance Std.Dev.
 coderesp (Intercept) 0.8057   0.8976  
 Residual             0.8809   0.9385  
Number of obs: 8686, groups:  coderesp, 580

Fixed effects:
                           Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)               1.273e+00  3.485e-01  5.854e+02   3.653 0.000282 ***
groupf2_2                 5.245e-02  5.521e-02  8.092e+03   0.950 0.342182    
groupf2_3                 2.372e-01  5.524e-02  8.092e+03   4.294 1.77e-05 ***
groupf2_4                 3.933e-01  5.519e-02  8.092e+03   7.127 1.11e-12 ***
groupf2_5                 6.037e-01  5.524e-02  8.092e+03  10.928  < 2e-16 ***
groupf2_6                -1.874e-02  5.519e-02  8.092e+03  -0.340 0.734223    
groupf2_7                 2.457e-01  5.522e-02  8.092e+03   4.451 8.67e-06 ***
groupf2_8                 7.520e-01  5.519e-02  8.092e+03  13.625  < 2e-16 ***
groupf2_9                 5.298e-01  5.522e-02  8.092e+03   9.595  < 2e-16 ***
groupf2_10                1.140e-01  5.519e-02  8.092e+03   2.066 0.038863 *  
groupf2_11                9.051e-01  5.522e-02  8.092e+03  16.392  < 2e-16 ***
groupf2_12                7.968e-01  5.519e-02  8.092e+03  14.437  < 2e-16 ***
groupf2_13                6.409e-01  5.524e-02  8.092e+03  11.601  < 2e-16 ***
groupf2_14                1.222e-01  5.522e-02  8.092e+03   2.212 0.026960 *  
groupf2_15                8.816e-02  5.519e-02  8.092e+03   1.597 0.110223    
Years_of_education       -1.667e-02  1.564e-02  5.720e+02  -1.066 0.287052    
Self_monitoring          -2.029e-01  4.647e-02  5.718e+02  -4.366 1.50e-05 ***
age                       8.338e-03  2.507e-03  5.721e+02   3.326 0.000938 ***
Fearful_personality       1.400e-01  2.258e-02  5.719e+02   6.198 1.10e-09 ***
right_wing_ideology       5.751e-02  1.141e-02  5.719e+02   5.041 6.23e-07 ***
Female1                   1.309e-01  7.957e-02  5.719e+02   1.645 0.100559    
Active_in_Labour_Market1 -5.243e-02  9.055e-02  5.719e+02  -0.579 0.562804    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  value
Predictors Estimates CI p
(Intercept) 1.27 0.59 – 1.96 <0.001
group [f2_2] 0.05 -0.06 – 0.16 0.342
group [f2_3] 0.24 0.13 – 0.35 <0.001
group [f2_4] 0.39 0.29 – 0.50 <0.001
group [f2_5] 0.60 0.50 – 0.71 <0.001
group [f2_6] -0.02 -0.13 – 0.09 0.734
group [f2_7] 0.25 0.14 – 0.35 <0.001
group [f2_8] 0.75 0.64 – 0.86 <0.001
group [f2_9] 0.53 0.42 – 0.64 <0.001
group [f2_10] 0.11 0.01 – 0.22 0.039
group [f2_11] 0.91 0.80 – 1.01 <0.001
group [f2_12] 0.80 0.69 – 0.90 <0.001
group [f2_13] 0.64 0.53 – 0.75 <0.001
group [f2_14] 0.12 0.01 – 0.23 0.027
group [f2_15] 0.09 -0.02 – 0.20 0.110
Years of education -0.02 -0.05 – 0.01 0.287
Self monitoring -0.20 -0.29 – -0.11 <0.001
age 0.01 0.00 – 0.01 0.001
Fearful personality 0.14 0.10 – 0.18 <0.001
right wing ideology 0.06 0.04 – 0.08 <0.001
Female [1] 0.13 -0.03 – 0.29 0.100
Active in Labour Market
[1]
-0.05 -0.23 – 0.13 0.563
Random Effects
σ2 0.88
τ00 coderesp 0.81
ICC 0.48
N coderesp 580
Observations 8686
Marginal R2 / Conditional R2 0.169 / 0.566

This linear model shows the impact of various predictors on the dependent variable “value(fear)”. The intercept estimated at 1.27, and their confidence interval (CI) of 0.22 to 2.32, the p-value is 0.018 which indicates statistically significant. The Age groups shows that the Elderly group (the random intercept is 0.32, the confidence level is -0.06 and there p-value is <0.001) has a positive correlation while the middle age(the random intercept is 0.12, the confidence level is -0.06 to0.30 and there p-value is 0.203) has no significant correlation. For Education Level there is no statistically significant correlation on the dependent variable: compulsory school(the random intercept is 0.33, the confidence level is -0.73 - 1.40 and there p-value = 0.538), high school (the random intercept is 0.29, the confidence level is -0.76 - 1.33 and there p-value = 0.591), Higher vocational college(the random intercept is 0.22, the confidence level is -0.083 – 1.27 and there p-value = 0.678) and lastly university is(the random intercept is -0.09, the confidence level is -1.14 – 0.96 and there p-value = 0.867)

Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: value ~ Educationlevel + Agegroup + (1 | coderesp)
   Data: rim2

REML criterion at convergence: 45524.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.5843 -0.2554 -0.0490 -0.0297  8.3486 

Random effects:
 Groups   Name        Variance Std.Dev.
 coderesp (Intercept) 1.047    1.023   
 Residual             1.014    1.007   
Number of obs: 14977, groups:  coderesp, 1001

Fixed effects:
                                                                 Estimate
(Intercept)                                                       1.27219
EducationlevelCompulsory School, elementary vocational training   0.33389
EducationlevelHigh School                                         0.28510
EducationlevelHigher vocational college                           0.22167
EducationlevelUniversity                                         -0.08946
AgegroupMiddle Age                                                0.11789
AgegroupElderly                                                   0.31979
                                                                Std. Error
(Intercept)                                                        0.53547
EducationlevelCompulsory School, elementary vocational training    0.54164
EducationlevelHigh School                                          0.53114
EducationlevelHigher vocational college                            0.53440
EducationlevelUniversity                                           0.53609
AgegroupMiddle Age                                                 0.09262
AgegroupElderly                                                    0.09137
                                                                       df
(Intercept)                                                     998.05039
EducationlevelCompulsory School, elementary vocational training 997.96914
EducationlevelHigh School                                       998.12610
EducationlevelHigher vocational college                         998.07697
EducationlevelUniversity                                        998.04614
AgegroupMiddle Age                                              994.07452
AgegroupElderly                                                 993.70152
                                                                t value
(Intercept)                                                       2.376
EducationlevelCompulsory School, elementary vocational training   0.616
EducationlevelHigh School                                         0.537
EducationlevelHigher vocational college                           0.415
EducationlevelUniversity                                         -0.167
AgegroupMiddle Age                                                1.273
AgegroupElderly                                                   3.500
                                                                Pr(>|t|)    
(Intercept)                                                     0.017697 *  
EducationlevelCompulsory School, elementary vocational training 0.537749    
EducationlevelHigh School                                       0.591548    
EducationlevelHigher vocational college                         0.678378    
EducationlevelUniversity                                        0.867507    
AgegroupMiddle Age                                              0.203382    
AgegroupElderly                                                 0.000486 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr) ECSevt EdctHS EdcHvc EdctnU AggrMA
EdctnCS,evt -0.968                                   
EdctnlvlHgS -0.990  0.973                            
EdctnlvlHvc -0.981  0.966  0.986                     
EdctnlvlUnv -0.978  0.963  0.983  0.977              
AggrpMddlAg -0.128  0.017  0.023  0.001  0.000       
AggrpEldrly -0.157  0.028  0.050  0.036  0.033  0.664
  value
Predictors Estimates CI p
(Intercept) 1.27 0.22 – 2.32 0.018
Educationlevel
[Compulsory School,
elementary vocational
training]
0.33 -0.73 – 1.40 0.538
Educationlevel [High
School]
0.29 -0.76 – 1.33 0.591
Educationlevel [Higher
vocational college]
0.22 -0.83 – 1.27 0.678
Educationlevel
[University]
-0.09 -1.14 – 0.96 0.867
Agegroup [Middle Age] 0.12 -0.06 – 0.30 0.203
Agegroup [Elderly] 0.32 0.14 – 0.50 <0.001
Random Effects
σ2 1.01
τ00 coderesp 1.05
ICC 0.51
N coderesp 1001
Observations 14977
Marginal R2 / Conditional R2 0.016 / 0.516

4. Conclusions

250 words

My replication study was aimed to see the possible results that would appear from the original replication claim in which Dider stated that older people tend to have a negative view. The results approve the claim he made proving that younger people tend to have a more positive view to immigration compared to older people and education doesn’t not impact people’s attitudes at all.

The result suggested that there are other variables that effect how people see immigration. The results show that political ideology plays a big role on people’s attitudes towards immigration. subsequently is well recognized that, outside of the field of immigration research, individuals build their views on politics based on their attitudes towards several prominent socioeconomic groupings. Future study should investigate the possibility that those social groups could be described in terms of politics in addition to ethnicity or nationality (e.g., Green et al. 2002). In conclusion while in this study it claimed older people perceive immigrants negatively, there are other factors that interfere with and education does not play a big part of it

References

min. 5 scientific references, excluding the replicated paper

Dražanová, L., Gonnot, J., Heidland, T. and Krüger, F., 2024. Which individual-level factors explain public attitudes toward immigration? a meta-analysis. Journal of ethnic and migration studies, 50(2), pp.317-340.

Crepaz, M.M. and Damron, R., 2009. Constructing tolerance: How the welfare state shapes attitudes about immigrants. Comparative Political Studies, 42(3), pp.437-463.

Scheve, K.F. and Slaughter, M.J., 2001. Labor market competition and individual preferences over immigration policy. Review of Economics and Statistics, 83(1), pp.133-145.

van Dalen, H.P. and Henkens, K., 2005. The rationality behind immigration policy preferences. De Economist, 153, pp.67-83.

Weldon, S.A., 2006. The institutional context of tolerance for ethnic minorities: A comparative, multilevel analysis of Western Europe. American journal of political science, 50(2), pp.331-349.

Coenders, M. and Scheepers, P., 2003. The effect of education on nationalism and ethnic exclusionism: An international comparison. Political psychology, 24(2), pp.313-343.

Espenshade, T.J. and Calhoun, C.A., 1993. An analysis of public opinion toward undocumented immigration. Population research and policy review, 12, pp.189-224.

Vogt, Paul W. 1997. Tolerance and Education. Thousand Oaks: Sage.

Sniderman, P.M., Brody, R.A. and Kuklinski, J.H., 1984. Policy reasoning and political values: The problem of racial equality. American journal of political science, pp.75-94.

Hainmueller, J. and Hiscox, M.J., 2007. Educated preferences: Explaining attitudes toward immigration in Europe. International organization, 61(2), pp.399-442.

Hainmueller, J. and Hopkins, D.J., 2014. Public attitudes toward immigration. Annual review of political science, 17, pp.225-249.

Appendix

Appendix 1. My enviroment (full information)

# Detailed information about my environment
sessionInfo()
R version 4.3.3 (2024-02-29 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 11 x64 (build 22631)

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    

time zone: Europe/London
tzcode source: internal

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

other attached packages:
 [1] lmerTest_3.1-3  glmmTMB_1.1.9   lattice_0.22-5  merTools_0.6.2 
 [5] haven_2.5.4     sjPlot_2.8.15   sp_2.1-3        rstanarm_2.32.1
 [9] brms_2.21.0     Rcpp_1.0.12     reshape2_1.4.4  psych_2.4.1    
[13] stargazer_5.2.3 arm_1.14-4      lme4_1.1-35.1   Matrix_1.6-5   
[17] MASS_7.3-60.0.1 pscl_1.5.9      lubridate_1.9.3 forcats_1.0.0  
[21] stringr_1.5.1   dplyr_1.1.4     purrr_1.0.2     readr_2.1.5    
[25] tidyr_1.3.1     tibble_3.2.1    ggplot2_3.5.0   tidyverse_2.0.0
[29] knitr_1.45      rmarkdown_2.26 

loaded via a namespace (and not attached):
  [1] RColorBrewer_1.1-3   tensorA_0.36.2.1     rstudioapi_0.15.0   
  [4] jsonlite_1.8.8       datawizard_0.10.0    magrittr_2.0.3      
  [7] estimability_1.5     farver_2.1.1         nloptr_2.0.3        
 [10] vctrs_0.6.5          minqa_1.2.6          effectsize_0.8.7    
 [13] base64enc_0.1-3      htmltools_0.5.7      distributional_0.4.0
 [16] broom_1.0.5          sjmisc_2.8.9         parallelly_1.37.1   
 [19] sass_0.4.8           StanHeaders_2.32.6   bslib_0.6.1         
 [22] htmlwidgets_1.6.4    plyr_1.8.9           emmeans_1.10.1      
 [25] zoo_1.8-12           cachem_1.0.8         TMB_1.9.11          
 [28] igraph_2.0.3         iterators_1.0.14     mime_0.12           
 [31] lifecycle_1.0.4      pkgconfig_2.0.3      colourpicker_1.3.0  
 [34] sjlabelled_1.2.0     R6_2.5.1             fastmap_1.1.1       
 [37] future_1.33.2        shiny_1.8.1.1        numDeriv_2016.8-1.1 
 [40] digest_0.6.35        colorspace_2.1-0     furrr_0.3.1         
 [43] crosstalk_1.2.1      labeling_0.4.3       fansi_1.0.6         
 [46] timechange_0.3.0     mgcv_1.9-1           abind_1.4-5         
 [49] compiler_4.3.3       withr_3.0.0          backports_1.4.1     
 [52] inline_0.3.19        shinystan_2.6.0      performance_0.11.0  
 [55] highr_0.10           QuickJSR_1.1.3       pkgbuild_1.4.3      
 [58] broom.mixed_0.2.9.5  sjstats_0.18.2       gtools_3.9.5        
 [61] loo_2.7.0            tools_4.3.3          httpuv_1.6.15       
 [64] threejs_0.3.3        glue_1.7.0           nlme_3.1-164        
 [67] promises_1.2.1       grid_4.3.3           checkmate_2.3.1     
 [70] generics_0.1.3       gtable_0.3.4         tzdb_0.4.0          
 [73] hms_1.1.3            utf8_1.2.4           foreach_1.5.2       
 [76] pillar_1.9.0         markdown_1.12        posterior_1.5.0     
 [79] later_1.3.2          splines_4.3.3        survival_3.5-8      
 [82] tidyselect_1.2.1     miniUI_0.1.1.1       blme_1.0-5          
 [85] gridExtra_2.3        stats4_4.3.3         xfun_0.42           
 [88] bridgesampling_1.1-2 matrixStats_1.2.0    DT_0.33             
 [91] rstan_2.32.6         stringi_1.8.3        yaml_2.3.8          
 [94] boot_1.3-29          evaluate_0.23        codetools_0.2-19    
 [97] cli_3.6.2            RcppParallel_5.1.7   parameters_0.21.6   
[100] shinythemes_1.2.0    xtable_1.8-4         munsell_0.5.0       
[103] jquerylib_0.1.4      modelr_0.1.11        globals_0.16.3      
[106] ggeffects_1.5.1      coda_0.19-4.1        parallel_4.3.3      
[109] rstantools_2.4.0     bayestestR_0.13.2    dygraphs_1.1.1.6    
[112] bayesplot_1.11.1     Brobdingnag_1.2-9    listenv_0.9.1       
[115] mvtnorm_1.2-4        scales_1.3.0         xts_0.13.2          
[118] insight_0.19.10      rlang_1.1.3          mnormt_2.1.1        
[121] shinyjs_2.1.0       

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)
# All used libraries
library(tidyverse) #tidyverse
library(pscl)      # ZINB
library(arm)       # coefplot
library(stargazer) # stargazer
library(psych)     # alpha
library(reshape2)  # reshape
library(lme4)      # lmer
library(brms)      # Stan interface
library(rstanarm)  # Stan interface
library(sp)        # plotting maps
library(rmarkdown) # render("analysis-threat-redux.Rmd")
library(knitr)     # kable()
library(arm)# coefplot
library(dplyr)
library(ggplot2)
library(sjPlot) # Tab_model function
library(haven)
library(merTools)
library(lattice)
library(glmmTMB)
library(lmerTest)
# Versions of used packages
packages <- c("rmarkdown", "knitr")
names(packages) <- packages
lapply(packages, packageVersion)
# What is my R version?
version[['version.string']]
# opening dataset
load("C:/Users/HP/Desktop/205/SMI-205-Replication-Project/Data/Angst.1.RData")
# Adding all the variables
# gender (1=female)
angst$sex[angst$geschlf==1] = 0 # male
angst$sex[angst$geschlf==2] = 1 # female
angst$sex = factor(angst$sex)   # nominal
angst$age = angst$alternum      # age
# cleaning
angst$mcp = angst$f4                   # motivation to control prejudice (MCP)
angst$fear[angst$f2n<11] = angst$f2n[angst$f2n<11] # fearful 1..10; filter out 99
# Party position on immigration from CHES 2011, recoded 0..10
angst$party[angst$p02==1] = 3.889   # CSP
angst$party[angst$p02==2] = 5.556   # CVP
angst$party[angst$p02==3] = 4.938   # EVP
angst$party[angst$p02==4] = 6.944   # FDP
# 5 not occurring
angst$party[angst$p02==6] = 0.648   # GPS
angst$party[angst$p02==7] = 3.535   # GLP
angst$party[angst$p02==8] = 9.012   # Lega
# 9 not occurring
angst$party[angst$p02==10] = 1.111  # PdA
angst$party[angst$p02==11] = 9.833  # SD, from 2004 B&L
angst$party[angst$p02==12] = 0.463  # SPS
angst$party[angst$p02==13] = 9.63   # SVP
# 14 not occurring
angst$party[angst$p02==15] = 0.648  # Grünes Bündnis; set as GPS
angst$party[angst$p02==16] = 8.667  # EDU
angst$party[angst$p02==17] = 6.869  # BDP
angst$party[angst$p02==18] = 1.111  # AdG; set as PdA
angst$ideology = angst$party        # duplicate (not elegant), but I often confused them
angst$party = NULL                  # remove for clearer dataset
angst$edu[angst$s14a17 < 8] = angst$s14a17[angst$s14a17 < 8] # filter DK; 1..7
angst$active[angst$s15==1] = 1 # in labour force (erwerbstätig)
angst$active[angst$s15==2] = 0 # not in labour force
angst$active = factor(angst$active)   # nominal
## converting edu into years of schooling:
angst$educat = angst$edu # keep old, recode (following table 7 in Attitudes I)
angst$edu[angst$educat == 1] = 7  # none; set to 7 (or less), N=4; not too far of to avoid impact
angst$edu[angst$educat == 2] = 9  # compulsory school, elementary vocational training
angst$edu[angst$educat == 3] = 12
angst$edu[angst$educat == 4] = 12 # general training school, apprenticeship, full-time vocational school, maturity (high school)
angst$edu[angst$educat == 5] = 15
angst$edu[angst$educat == 6] = 15 # technical or vocational school; higher vocational college
angst$edu[angst$educat == 7] = 18 # university
# sum of all responses with a valid response, -1 so that 0 is the lowest value
angst$combi = rowSums(cbind(angst$f1_1-1, angst$f1_2-1, angst$f1_3-1, angst$f1_4-1, angst$f1_5-1, angst$f1_6-1, angst$f1_7-1, angst$f1_8-1, angst$f1_9-1, angst$f2_1-1, angst$f2_2-1, angst$f2_3-1, angst$f2_4-1, angst$f2_5-1, angst$f2_6-1, angst$f2_7-1, angst$f2_8-1, angst$f2_9-1, angst$f2_10-1, angst$f2_11-1, angst$f2_12-1, angst$f2_13-1, angst$f2_14-1, angst$f2_15-1), na.rm=TRUE)


rim2 = melt(angst, measure.vars = c("f2_1", "f2_2", "f2_3", "f2_4", "f2_5", "f2_6", "f2_7", "f2_8", "f2_9", "f2_10", "f2_11", "f2_12", "f2_13", "f2_14", "f2_15"), variable.name = "group", na.rm=TRUE)


b1 = lmer(value ~ group + (1 | coderesp), data=rim2)
b2 = lmer(value ~ group + (1 | coderesp) + edu + mcp + age, data=rim2)
b3 = lmer(value ~ group + (1 | coderesp) + edu + mcp + age + fear + ideology + sex + active, data=rim2)

  labls = c("Businessman\nFar East", "Businessman\nCross-border", "Craftsman\nBroken German", "Craftsman\nIncomprehensible", "Tourist\nWestern Europe", "Tourist\nFar East", "Jobseeker\nSouth-Eastern Europe", "Jobseeker\nIndia", "Jobseeker\nWestern Europe", "Jobseeker\nAfrica", "Headscarf", "Dark skin", "Portugal\n(trad. guestworker)", "Italy\n(trad. guestworker)")
 
# subsetting age into three different categories
rim2$Agecategory <- cut(rim2$age, 
                          breaks = c(-Inf
                                    ,34,54, Inf), 
                          labels = c("-34", "35-54","55+"),
                        right = FALSE)
                        
                        
# recoding the categories into age groups
rim2 <- rim2 %>%
  mutate(Agegroup = recode(Agecategory,
                           "-34" = "Young Adults",
                           "35-54" = "Middle Age",
                           "55+" = "Elderly"))

rim2 <- rim2%>%
  mutate(Educationlevel = recode(edu,
                      "7" = "Compulsory School not completed",
                "9" = "Compulsory School, elementary vocational training",
                "12" = "High School",
                "15" = "Higher vocational college",
                "18" = "University"))

# graph showing the relationship with how age and the level of education
# Adding stats
rim2 %>%
  count(Agegroup, edu) %>% 
  group_by(Agegroup) %>%
  mutate(prop = n / sum(n)) %>%
ggplot(
       aes(x = Agegroup, y = edu, fill = as.factor(edu))) +
  geom_bar(stat = "identity", position = "fill") +
  geom_text(
    aes(label = round(100 * prop, digits = 2)), # Adding stats
            position = position_fill(.5), vjust = -.6) +
  labs(
    title = "Education and Age",
     y = "Years in Education",
     x = "Age group",
     fill = "Education Level") +
   scale_fill_manual(
     values = c("7" = "light blue", "9" = "yellow", "12" = "light green", "15" = "Purple", "18" = "Pink"),
     labels = c("7" = "Compulsory School not completed",
                "9" = "Compulsory School, elementary vocational training",
                "12" = "High School",
                "15" = "Higher vocational college",
                "18" = "University")) +
   theme_minimal() +
   theme(legend.position = "right") 

# bar graph showing correlation between Fear and Age Groups
rim2 %>%
  count(value, Agegroup) %>% 
  group_by(value) %>%
  mutate(prop = n / sum(n)) %>%
  ggplot(aes(x = value, y = prop, fill = Agegroup)) +
  geom_col(position = position_dodge()) +
  geom_text(
    aes(label = round(100 * prop)),
            position = position_dodge(.8), vjust = -.2
  ) +
  labs(y = "% of fear level")

# Renaming variables
names(rim2)[names(rim2) == "edu"] <- "Years_of_education"
names(rim2)[names(rim2) == "mcp"] <- "Self_monitoring"
names(rim2)[names(rim2) == "Age"] <- "age"
names(rim2)[names(rim2) == "fear"] <- "Fearful_personality"
names(rim2)[names(rim2) == "ideology"] <- "right_wing_ideology"
names(rim2)[names(rim2) == "sex"] <- "Female"
names(rim2)[names(rim2) == "active"] <- "Active_in_Labour_Market"

b3 = lmer(value ~ group + (1 | coderesp) + Years_of_education + Self_monitoring + age +  Fearful_personality + right_wing_ideology + Female + Active_in_Labour_Market, data=rim2)

summary(b3)
tab_model(b3)
plot_model(b3, transform = NULL,
           title = "How Threatned you feel with Immigrants",
  axis.title = c("Estimates","Independant variables"))

b4 = lmerTest::lmer(value ~  Educationlevel + Agegroup + (1|coderesp), data=rim2)

summary(b4)
tab_model(b4)
plot_model(b4, transform = NULL,
           title = "How different attitudes vary due to diffrent age groups and how education impacts it ",
  axis.title = c("Estimates","Independant variables"))

# Detailed information about my environment
sessionInfo()
LS0tDQp0aXRsZTogIlNNSTIwNSBSZXBsaWNhdGlvbiBQcm9qZWN0ICgyMDI0KSINCmF1dGhvcjogIjIyMDE4MDIwMSINCmRhdGU6ICIwOC8wNi8yMDI0Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMg0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQotLS0NCg0KYGBge3Igc3RhcnQsIGluY2x1ZGU9RkFMU0V9DQojIE9wZW5pbmcga2V5IGxpYnJhcmllcyBmaXJzdA0KbGlicmFyeShybWFya2Rvd24pDQpsaWJyYXJ5KGtuaXRyKQ0KYGBgDQoNCiMgTGluZWFyIHJlZ3Jlc3Npb24gbW9kZWxpbmcgb24gQWdlIGFuZCBob3cgaXQgaW1wYWN0cyBhdHRpdHVkZXMgdG93YXJkcyBpbW1pZ3JhdGlvbiBkZXBlbmRpbmcgbiB0aGUgYW1vdW50IG9mIEVkdWNhdGlvbiBsZXZlbCB0YWtlbg0KDQojIyMgUnB1YnMgbGluazogaHR0cHM6Ly9ycHVicy5jb20vSGkyMjAxODAyMDEvMTE5NDcyOQ0KIyMjIEdpdEh1YiBSZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vTHdlMjJocy9TTUktMjA1LVJlcGxpY2F0aW9uLVByb2plY3QNCiMjIyBTdHVkeSBQcmVyZWdpc3RyYXRpb24gZm9ybTogaHR0cHM6Ly9ycHVicy5jb20vSGkyMjAxODAyMDEvMTE5NDcyMQ0KDQojIyBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJlcGxpY2F0aW9uIHByb2plY3QNCuKAoglUaGlzIGlzIGEgcmVwbGljYXRpb24gcHJvamVjdCBiYXNlZCBvbiBSdWVkaW4sIEQuICgyMDIwKS4gRG8gd2UgbmVlZCBtdWx0aXBsZSBxdWVzdGlvbnMgdG8gY2FwdHVyZSBmZWVsaW5nIHRocmVhdGVuZWQgYnkgaW1taWdyYW50cz8gUG9saXRpY2FsIFJlc2VhcmNoIEV4Y2hhbmdlLCAyKDEpLCAxNzU4NTc2LiAgQXZhaWxhYmxlIGF0IGh0dHBzOi8vZG9pLm9yZy8xMC4xMDgwLzI0NzQ3MzZYLjIwMjAuMTc1ODU3Ng0K4oCiCUkgcHJldmlvdXNseSBjb25kdWN0ZWQgYSByZXBsaWNhdGlvbiBvZiB0aGUgcGFwZXIgdXNpbmcgdGhlIHNhbWUgbWV0aG9kcyBhbmQgdGhlIHNhbWUgZGF0YSBiYXNlZCBvbiB0aGUgcmVwbGljYXRpb24gcGFja2FnZSB0aGF0IHdhcyBhdmFpbGFibGUgb24gdGhlIE9TRiB3ZWJzaXRlOiBodHRwczovL29zZi5pby9ibmZ0ei8/dmlld19vbmx5PSBET0kgMTAuMTc2MDUvT1NGLklPL0JORlRaDQrigKIJVGhpcyByZXBsaWNhdGlvbiBpcyBhbiBleHRlbnNpb24gb2YgdGhlIG9yaWdpbmFsIHBhcGVyIHVzaW5nIHRoZSBzYW1lIGRhdGEgYW5kIGRpZmZlcmVudCBtZXRob2RzIHRvIHRlc3QgdGhlIHJvYnVzdG5lc3MNCg0KDQojIyBXb3Jrc3BhY2Ugc2V0dXAgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KIyMjIFlBTUwgc2V0dGluZ3MNCg0KIG91dHB1dDogPC9icj4NCiAgJm5ic3A7IGh0bWxfZG9jdW1lbnQ6IDwvYnI+DQogICAgJm5ic3A7Jm5ic3A7IGNvZGVfZG93bmxvYWQ6IHRydWUgPC9icj4NCiAgICAmbmJzcDsmbmJzcDsmbmJzcDsgdG9jOiB0cnVlIDwvYnI+DQogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IHRvY19kZXB0aDogMiA8L2JyPg0KICAgICZuYnNwOyZuYnNwOyZuYnNwOyB0b2NfZmxvYXQ6IDwvYnI+DQogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY29sbGFwc2VkOiBmYWxzZSA8L2JyPg0KICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNtb290aF9zY3JvbGw6IHRydWUgPC9icj4NCg0KIyMjIEdsb2JhbCBzZXR0aW5ncyBvZiBSIGNodW5rcw0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1UUlVFfQ0KIyBHbG9iYWwgb3B0aW9ucw0Kb3B0c19jaHVuayRzZXQoZWNobz1UUlVFLA0KCSAgICAgICAgICAgICBjYWNoZT1UUlVFLA0KICAgICAgICAgICAgICAgY29tbWVudD1OQSwNCiAgICAgICAgICAgICAgIG1lc3NhZ2U9RkFMU0UsDQogICAgICAgICAgICAgICB3YXJuaW5nPUZBTFNFKQ0KYGBgDQoNCiMjIyBMaWJyYXJpZXMNCg0KYGBge3IgbGlicmFyaWVzLCBpbmNsdWRlPVRSVUV9DQojIEFsbCB1c2VkIGxpYnJhcmllcw0KbGlicmFyeSh0aWR5dmVyc2UpICN0aWR5dmVyc2UNCmxpYnJhcnkocHNjbCkgICAgICAjIFpJTkINCmxpYnJhcnkoYXJtKSAgICAgICAjIGNvZWZwbG90DQpsaWJyYXJ5KHN0YXJnYXplcikgIyBzdGFyZ2F6ZXINCmxpYnJhcnkocHN5Y2gpICAgICAjIGFscGhhDQpsaWJyYXJ5KHJlc2hhcGUyKSAgIyByZXNoYXBlDQpsaWJyYXJ5KGxtZTQpICAgICAgIyBsbWVyDQpsaWJyYXJ5KGJybXMpICAgICAgIyBTdGFuIGludGVyZmFjZQ0KbGlicmFyeShyc3RhbmFybSkgICMgU3RhbiBpbnRlcmZhY2UNCmxpYnJhcnkoc3ApICAgICAgICAjIHBsb3R0aW5nIG1hcHMNCmxpYnJhcnkocm1hcmtkb3duKSAjIHJlbmRlcigiYW5hbHlzaXMtdGhyZWF0LXJlZHV4LlJtZCIpDQpsaWJyYXJ5KGtuaXRyKSAgICAgIyBrYWJsZSgpDQpsaWJyYXJ5KGFybSkjIGNvZWZwbG90DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzalBsb3QpICMgVGFiX21vZGVsIGZ1bmN0aW9uDQpsaWJyYXJ5KGhhdmVuKQ0KbGlicmFyeShtZXJUb29scykNCmxpYnJhcnkobGF0dGljZSkNCmxpYnJhcnkoZ2xtbVRNQikNCmxpYnJhcnkobG1lclRlc3QpDQpgYGANCg0KIyMjIFZlcnNpb25zIG9mIHVzZWQgcGFja2FnZXMNCg0KYGBge3IgdmVyc2lvbnMsIGVjaG89RkFMU0V9DQojIFZlcnNpb25zIG9mIHVzZWQgcGFja2FnZXMNCnBhY2thZ2VzIDwtIGMoInJtYXJrZG93biIsICJrbml0ciIpDQpuYW1lcyhwYWNrYWdlcykgPC0gcGFja2FnZXMNCmxhcHBseShwYWNrYWdlcywgcGFja2FnZVZlcnNpb24pDQpgYGANCg0KIyMjIE15IGVudmlyb21lbnQNCg0KYGBge3IgbXlSLCBlY2hvPUZBTFNFfQ0KIyBXaGF0IGlzIG15IFIgdmVyc2lvbj8NCnZlcnNpb25bWyd2ZXJzaW9uLnN0cmluZyddXQ0KYGBgDQoNCiMjIDEuIEludHJvZHVjdGlvbg0KDQpSdWVkaW4gcGFwZXIgKDIwMjApIGV4YW1pbmVzIGhvdyBpbmRpdmlkdWFscyBpbiBFdXJvcGUgYXJlIHVuZWFzeSBhbmQgZmVlbCB0aHJlYXRlbmVkIGJ5IGltbWlncmF0aW9uLiBSZXNwb25kZW50cyBjb25zaXN0ZW50bHkgcmVnYXJkIGltbWlncmFudHMgZnJvbSBvdGhlciBjdWx0dXJlcyBhbmQgdGhvc2UgbW9yZSBsaWtlbHkgdG8gZ2V0IHNvY2lhbCBiZW5lZml0cyBhcyBtb3JlIGRhbmdlcm91cy4gVG8gZG8gc28sIGl0IGV4YW1pbmVkIHdoZXRoZXIgdHlwZXMgb2YgaW1taWdyYW50cyBhcmUgdmlld2VkIGFzIG1vcmUgdGhyZWF0ZW5pbmcgdGhhbiBvdGhlcnMsIHdoaWxlIGFsc28gZW1waGFzaXNpbmcgdGhhdCBzdHVkaWVzIHRoYXQgY2FwdHVyZSBzZW50aW1lbnRzIGFnYWluc3QgaW1taWdyYW50cyBpbiBhIGdlbmVyYWxpc2VkIGEgc2Vuc2UgcHJvcGVybHkgaWRlbnRpZnkgd2hvZXZlciBmZWVscyBtb3N0IGludGltaWRhdGVkIGJ5IGFuZCBvcHBvc2VzIGltbWlncmF0aW9uLiBJIHByZXZpb3VzbHkgY29uZHVjdGVkIGEgcmVwbGljYXRpb24gdXNpbmcgdGhlIHNhbWUgZGF0YSBhbmQgc2FtZSBtZXRob2RzIHdpdGggYWRqdXN0bWVudHMgdG8gdGVzdCB0aGUgcGFwZXJzIHZlcmlmaWFiaWxpdHksIG15IHJlc3VsdHMgc3VwcG9ydGVkIHRoZSBvdXRjb21lcyBvZiB0aGUgb3JpZ2luYWwgcGFwZXIuIERpZGllciB1dGlsaXNlZCBhIGZpbmUtZ3JhaW5lZCBtZXRob2QsIGhlIGRlbW9uc3RyYXRlZCB0aGF0IHJlc3BvbnNlcyB0byB2YXJpb3VzIGltbWlncmFudHMgY2hhbmdlIHN5c3RlbWF0aWNhbGx5LiBBdCB0aGUgZW5kIGhlIHN0YXRlcyB0aGF0LCBjb3JyZWxhdGlvbnMgYW1vbmcgdmFyaW91cyBpbW1pZ3JhbnRzIGFyZSBvZnRlbiBzaW1pbGFyIHRvIGVhY2ggb3RoZXIsIHlldCB3aGVuIGxvb2tpbmcgYXQgc3BlY2lmaWMgaW1taWdyYW50cyBpbnN0ZWFkIG9mIGNvbWJpbmluZyBxdWVzdGlvbnMsIHByZWZlcmVuY2VzIGFyb3VuZCBzdGVyZW90eXBlcyBtYXkgaW1wYWN0IHRoZSBvdXRjb21lcy4gVGhlIGZpbmRpbmdzIHRoYXQgRGlkaWVyIGNsYWltZWQgd2FzIHRoZSBmYWN0IHRoYXQgb2xkZXIgcGVvcGxlIGFyZSBwcm9uZSB0byBkaXNwbGF5IGEgbW9yZSBuZWdhdGl2ZSB2aWV3IHRvd2FyZHMgaW1taWdyYW50cy4gR2l2ZW4gbXkgbGFjayBvZiBjb21wcmVoZW5zaW9uIG9uIHRoZSByZWFzb24gaGUgaGFkIG1hZGUgdGhpcyBhc3NlcnRpb24gYWxvbmcgd2l0aCBsYWNrIG9mIGNsYXJpZmljYXRpb24gSSB3YXMgaW50ZXJlc3RlZCBpbiBpbnZlc3RpZ2F0aW5nIHRoaXMgc3BlY2lmaWMgY2xhaW0gdG8gZGV0ZXJtaW5lIGlmIHdoYXQgaGUgY2xhaW1lZCB3YXMgYWNjdXJhdGUgb3Igbm90LiBMYWNrIG9mIHJlYXNvbnMgZm9yY2VkIG1lIHRvIGxvb2sgdXAgZGlmZmVyZW50IHBlcnNwZWN0aXZlcyBvbiB0aGlzIHBhcnRpY3VsYXIgY2xhaW0gYW5kIHdoYXQgb3RoZXIgcmVzZWFyY2hlcnMgaGFkIGRpc2NvdmVyZWQuDQoNCkRyYXphbm92YSwyMDIyLCBoYWQgc3RhdGVkIHRoYXQgdGhlIHByaW1hcnkgY29uY2x1c2lvbiBvZiBvdXIgbWV0YS1hbmFseXNpcyBkZW1vbnN0cmF0ZXMgdGhhdCBhdHRpdHVkZXMgdG93YXJkcyBpbW1pZ3JhdGlvbiBhcmUgbW9zdCBjbG9zZWx5IGNvbm5lY3RlZCB0byB0d28gaW5kaXZpZHVhbC1sZXZlbCB2YXJpYWJsZXM6IGFnZSAoaW4gYSBuZWdhdGl2ZSB3YXkpIGFuZCBlZHVjYXRpb24gKGluIGEgcG9zaXRpdmUgd2F5KS4gUGVvcGxlIHdpdGggZ3JlYXRlciBlZHVjYXRpb25hbCBiYWNrZ3JvdW5kcyB0ZW5kIHRvIHBlcmNlaXZlIGltbWlncmF0aW9uIHBvc2l0aXZlbHkuIEl0IGFkZGl0aW9uYWxseSBvYnNlcnZlcyB0aGF0IHRoZSBpbmZsdWVuY2Ugb2YgZWR1Y2F0aW9uIGlzIG5vdCBvbmx5IHJlbGF0ZWQgdG8gaXRzIGNvcnJlbGF0aW9uIHdpdGggaW5jb21lLCBpbmRpY2F0aW5nIHRoYXQgaXQgYWxzbyBkZW5vdGVzIGEgZGl2aWRlIG9uIHRoZSBiYXNpcyBvZiB2YWx1ZXMuIE9uIHRoZSBvdGhlciBoYW5kLCBhdHRpdHVkZXMgb24gaW1taWdyYXRpb24gZGVjcmVhc2Ugd2l0aCBhZ2UuIFRoZSBhbnRpLWltbWlncmF0aW9uIGF0dGl0dWRlcyBvZiBvbGRlciByZXNwb25kZW50cyBhcmUgbXVjaCBzdHJvbmdlciB0aGFuIHRob3NlIG9mIHlvdW5nZXIgb25lcy4gQWxzbywgYW4gZXZlbiBkZWVwZXIgcmVsYXRpb25zaGlwIHRvIHNvY2lhbCB2aWV3cyBoYXMgYmVlbiBkZW1vbnN0cmF0ZWQuIFRoZSBmaW5kaW5ncyBhcmUgY29uc2lzdGVudCB3aGVuIGFnZSBpcyB0YWtlbiBpbnRvIGFjY291bnQ6IEFzIG9sZGVyIHBlb3BsZSBhcmUgbGVzcyBhY2NlcHRpbmcgdG93YXJkcyBpbW1pZ3JhdGlvbiB0aGVuIHlvdW5nZXIgaW5kaXZ1YWxzLiAoQ2hhbmRsZXIgYW5kIFRzYWksIDIwMDE7IENpdHJpbiwgUmVpbmdvbGQsIGFuZCBHcmVlbiwxOTkwOyBDb2VuZGVycyBhbmQgU2NoZWVwZXJzMTk5OCwyMDAwODsgRXNwZW5zaGFkZSBhbmQgQ2FsaG91biwxOTkzOyBGb3JkLDIwMDgsMjAxMTsgSGVhdGggYW5kIFRpbGxleTIwMDU7IEhlYXRoIGFuZCBSaWNoYXJkcywyMDIwOyBSYW1vcywgUGVyZWlyYSBhbmQgVmFsYSwyMDIwOyBhbmQgU2NobHVldGVyLCBNYXNzbyBhbmQgRGF2aWRvdiwyMDIwIDsgUXVpbGxpYW4sMTk5NTsgUGF0ZXJzb24sMjAxODsgU2VteW9ub3YsIFJhaWptYW4sIGFuZCBHb3JvZHplaXNreSwyMDA2KS4NCg0KUmVzZWFyY2ggYWxzbyBzdWdnZXN0cyB0aGF0IGF0dGl0dWRlcyB0b3dhcmRzIGltbWlncmF0aW9uIGNvdWxkIGNoYW5nZSBvdmVyIHRpbWUgdGhyb3VnaCBnZW5lcmF0aW9uYWwgcmVwbGFjZW1lbnQuIEFsdGhvdWdoIGNlcnRhaW4gYW5hbHlzZXMgc2hvdyBtaW5pbWFsIGVmZmVjdHMgb2YgYWdlIChDcmVwYXogYW5kIERhbXJvbiwgMjAwOTsgU2NoZXZlIGFuZCBTbGF1Z2h0ZXIsIDIwMDE7IFZhbiBEYWxlbiBhbmQgSGVua2VucywgMjAwNTsgV2VsZG9uLCAyMDA2KSwgYWdlIHR5cGljYWxseSBoYXMgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGVmZmVjdCBvbiBpbW1pZ3JhdGlvbiBhdHRpdHVkZXMuIEFnZSBpcyB0eXBpY2FsbHkgaW5jbHVkZWQgaW4gc3R1ZGllcyBvZiBhdHRpdHVkZXMgdG93YXJkcyBpbW1pZ3JhdGlvbiBhdCBsZWFzdCBhcyBhIGNvbnRyb2wgdmFyaWFibGUuDQoNCkVkdWNhdGlvbiBwbGF5cyBhIGNydWNpYWwgcm9sZSBpbiBpbmZsdWVuY2luZyB5b3VuZ2VyIGdlbmVyYXRpb25zIHRvIGZhciByaWdodCBpZGVvbG9naWVzIHJlZ2FyZGluZyBhbnRpLWltbWlncmF0aW9uIHZpZXcuIFRoZSBmYWN0b3JzIGJlaGluZCBlZHVjYXRpb24ncyBzaWduaWZpY2FudCBpbXBhY3Qgb24gYXR0aXR1ZGVzIHRvd2FyZHMgaW1taWdyYXRpb24sIGRpc2NyaW1pbmF0aW9uLCBhbmQgb3RoZXIgdmlld3MgbGlrZSBwb2xpdGljYWwgdG9sZXJhbmNlIGFyZSBzdGlsbCB1bmNsZWFyLCBidXQgdHdvIG1haW4gdGhlb3JpZXMgZXhwbGFpbiB0aGUgY29uc2VxdWVuY2VzOiAoYSkgZXhwb3N1cmUgdG8gYSBkaXZlcnNpdHkgb2YgaWRlYXMgYW5kIChiKSBjb2duaXRpdmUgZGV2ZWxvcG1lbnQgKCBDb2VuZGVycyBhbmQgU2NoZWVwZXJzLCAyMDAzOyBFc3BlbnNoYWRlIGFuZCBDYWxob3VuLCAxOTkzOyBTbmlkZXJtYW4sIEJyb2R5LCBhbmQgS3VrbGluc2tpLCAxOTQ4OyBWb2d0LCAxOTk3KS4gSGlnaGVyIGVkdWNhdGlvbiwgZm9yIGluc3RhbmNlLCBpcyBhc3NvY2lhdGVkIHdpdGggbW9yZSBzZWxmLXdvcnRoIGFuZCBjb25maWRlbmNlLCBhcyB3ZWxsIGFzIGEgZ3JlYXRlciBhcHByZWNpYXRpb24gZm9yIGN1bHR1cmFsIGRpdmVyc2l0eSAoSGFpbm11ZWxsZXIgYW5kIEhpc2NveCwgMjAwNykuVGh1cywgYSBtaXggb2YgY3VsdHVyYWwgbWVjaGFuaXNtcyBhbmQgdGhlIGVtcGxveW1lbnQgbWFya2V0IGlzIHByb2JhYmx5IHJlc3BvbnNpYmxlIGZvciB0aGUgb3ZlcmFsbCBlZmZlY3Qgb2Ygc2Nob29saW5nIG9uIGF0dGl0dWRlcy4gQXMgYSByZXN1bHQsIHRoZXJlIGlzIGEgc3Ryb25nZXIgdGhhbiBhbnRpY2lwYXRlZCBwb3NpdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGltbWlncmF0aW9uIHNlbnRpbWVudHMgYW5kIGVkdWNhdGlvbi4NCg0KLSpIeXBvdGhlc2lzKjogVGhlIG9yaWdpbmFsIHJlcGxpY2F0aW9uIHByb2plY3RlZCBqdXN0IHN0YXRlZCB0aGUgY2xhaW0gd2hlcmUgb2xkZXIgcGVvcGxlIGhhdmUgYSBuZWdhdGl2ZSB2aWV3IG9uIGltbWlncmF0aW9uIGFuZCB0aGVyZSB3YXNuJ3QgYW55IGV4cGxhbmF0aW9uIHdoeSB0aGF0IGNsYWltIHdhcyBtYWRlLkkgYW0gaG9waW5nIHRvIHByb3ZlIGl0IGFzIGFuIGFjdHVhbCByZWxhdGlvbg0KDQojIyAyLiBEYXRhIGFuZCBtZXRob2RzDQoNCiMjIyAyLjEuIERhdGENCg0KDQoNClRoZSBkYXRhc2V0IHdhcyBhY2tub3dsZWRnZWQgaW4gdGhlIGFydGljbGUsIHdpdGggYSByZWZlcmVuY2UgcG9pbnRpbmcgdG8gdGhlIE9TRiB3ZWJzaXRlLiBXaGVuIG9wZW5pbmcgRGlkaWVy4oCZcyBtYWluIGRhdGFzZXQsIGl0IGRpZG7igJl0IGhhdmUgdGhlIGNvbnRyb2wgdmFyaWFibGUgYW5kIHRoZXJlZm9yZSBoZSBoYWQgdG8gY29kZSB0aGVtIGluIHRoZSBkYXRhc2V0IHdoaWNoIEkgaGFkIHVzZWQgbmFtZWQgYW5nc3QuIFRoZSBlbnRpcmUgZGF0YXNldCBjb250YWluZWQgMTAwOCBvYmplY3RzIGFuZCA1MiB2YXJpYWJsZXM7IGhvd2V2ZXIsIGluIHRoZSBkYXRhc2V0IEkgdXRpbGlzZWQsIHdlIGNvbnN0cnVjdGVkIGEgc2VwYXJhdGUgZGF0YXNldCBuYW1lZCByaW0yLCB3aGljaCBjb250YWluZWQgMTUwMjcgaXRlbXMgYW5kIDM5IHZhcmlhYmxlcy4gSSBzdWIgc2V0dGVkIG91dCBhbGwgb2YgdGhlIG5laWdoYm91cnMgZGF0YSBzbyBJIGNvdWxkIGNvbmNlbnRyYXRlIG9uIHRoZSBidXMgdmFyaWFibGVzLCBJIGhhZCBhbHNvIGNoYW5nZWQgbW9zdCBvZiB0aGUgdmFyaWFibGVzIHNvIGl0IHdvdWxkIGJlIGVhc2llciByZWFkaW5nIHRoZSB0YWJsZXMgYW5kIGdyYXBocyAuDQoNClZhbHVlIChmZWFyKSwgbXkgZGVwZW5kZW50IHZhcmlhYmxlLCB3YXMgbWVhc3VyZWQgb24gYSBzY2FsZSBvZiAxIHRvIDEwLCB3aXRoIDEwIGRlbm90aW5nIGEgc2VyaW91cyB0aHJlYXQsIDXigJM2IGRlbm90aW5nIGEgbWVkaXVtLXNpemVkIHRocmVhdCwgYW5kIDEgZGVub3Rpbmcgbm8gdGhyZWF0IGF0IGFsbC4gTXkgcHJpbWFyeSB2YXJpYWJsZXMsIGFnZSBhbmQgZWR1Y2F0aW9uLCB3ZXJlIGRpdmlkZWQgaW50byBzZXBhcmF0ZSBncm91cHMgYnkgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlLiBTaW5jZSBlZHVjYXRpb24gaXMgY2F0ZWdvcmljYWwsIGl0IGNhbiBiZSBkaXZpZGVkIGludG8gZ3JvdXBzIGFjY29yZGluZyB0byBkaWZmZXJlbnQgZWR1Y2F0aW9uYWwgbGV2ZWxzLCBzdWNoIGFzIHByaW1hcnkgdm9jYXRpb25hbCB0cmFpbmluZyAoOSB5ZWFycyksIGhpZ2ggc2Nob29sICgxMiB5ZWFycyksIGhpZ2hlciB2b2NhdGlvbmFsIGNvbGxlZ2UgKDE1IHllYXJzKSwgYW5kIHVuaXZlcnNpdHkgKDE4IHllYXJzKS5SZWdhcmRpbmcgYWdlLCBJIGRpdmlkZWQgdGhlbSBpbnRvIHRocmVlIGNhdGVnb3JpZXM6IHlvdW5nIGFkdWx0cyAoYWdlcyAwLTM0KSwgbWlkZGxlLWFnZWQgKGFnZXMgMzXigJM1NCksIGFuZCBlbGRlcmx5IChhZ2VzIDU1IGFuZCBhYm92ZSkuVGhlIG90aGVyIGluZGVwZW5kZW50IHZhcmlhYmxlIHdlcmUgbXkgbW9kZXJhdG9yIHZhcmlhYmxlcyBGZWFyZnVsIFBlcnNvbmFsaXR5ICBtZWFzdXJlZCBvbiBhIDEwLXBvaW50IHNjYWxlLCBSaWdodC13aW5nIGlkZW9sb2d5IG1lYXN1cmVkIG9uIGEgc2NhbGUgZnJvbSAwLTEwLCBGZW1hbGUgIG1lYXN1cmVkIGJ5IHNleCBhbmQgbGFzdGx5IEFjdGl2ZSBpbiBsYWJvdXIuDQoNCmBgYHtyfQ0KIyBvcGVuaW5nIGRhdGFzZXQNCmxvYWQoIkM6L1VzZXJzL0hQL0Rlc2t0b3AvMjA1L1NNSS0yMDUtUmVwbGljYXRpb24tUHJvamVjdC9EYXRhL0FuZ3N0LjEuUkRhdGEiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBBZGRpbmcgYWxsIHRoZSB2YXJpYWJsZXMNCiMgZ2VuZGVyICgxPWZlbWFsZSkNCmFuZ3N0JHNleFthbmdzdCRnZXNjaGxmPT0xXSA9IDAgIyBtYWxlDQphbmdzdCRzZXhbYW5nc3QkZ2VzY2hsZj09Ml0gPSAxICMgZmVtYWxlDQphbmdzdCRzZXggPSBmYWN0b3IoYW5nc3Qkc2V4KSAgICMgbm9taW5hbA0KYW5nc3QkYWdlID0gYW5nc3QkYWx0ZXJudW0gICAgICAjIGFnZQ0KIyBjbGVhbmluZw0KYW5nc3QkbWNwID0gYW5nc3QkZjQgICAgICAgICAgICAgICAgICAgIyBtb3RpdmF0aW9uIHRvIGNvbnRyb2wgcHJlanVkaWNlIChNQ1ApDQphbmdzdCRmZWFyW2FuZ3N0JGYybjwxMV0gPSBhbmdzdCRmMm5bYW5nc3QkZjJuPDExXSAjIGZlYXJmdWwgMS4uMTA7IGZpbHRlciBvdXQgOTkNCiMgUGFydHkgcG9zaXRpb24gb24gaW1taWdyYXRpb24gZnJvbSBDSEVTIDIwMTEsIHJlY29kZWQgMC4uMTANCmFuZ3N0JHBhcnR5W2FuZ3N0JHAwMj09MV0gPSAzLjg4OSAgICMgQ1NQDQphbmdzdCRwYXJ0eVthbmdzdCRwMDI9PTJdID0gNS41NTYgICAjIENWUA0KYW5nc3QkcGFydHlbYW5nc3QkcDAyPT0zXSA9IDQuOTM4ICAgIyBFVlANCmFuZ3N0JHBhcnR5W2FuZ3N0JHAwMj09NF0gPSA2Ljk0NCAgICMgRkRQDQojIDUgbm90IG9jY3VycmluZw0KYW5nc3QkcGFydHlbYW5nc3QkcDAyPT02XSA9IDAuNjQ4ICAgIyBHUFMNCmFuZ3N0JHBhcnR5W2FuZ3N0JHAwMj09N10gPSAzLjUzNSAgICMgR0xQDQphbmdzdCRwYXJ0eVthbmdzdCRwMDI9PThdID0gOS4wMTIgICAjIExlZ2ENCiMgOSBub3Qgb2NjdXJyaW5nDQphbmdzdCRwYXJ0eVthbmdzdCRwMDI9PTEwXSA9IDEuMTExICAjIFBkQQ0KYW5nc3QkcGFydHlbYW5nc3QkcDAyPT0xMV0gPSA5LjgzMyAgIyBTRCwgZnJvbSAyMDA0IEImTA0KYW5nc3QkcGFydHlbYW5nc3QkcDAyPT0xMl0gPSAwLjQ2MyAgIyBTUFMNCmFuZ3N0JHBhcnR5W2FuZ3N0JHAwMj09MTNdID0gOS42MyAgICMgU1ZQDQojIDE0IG5vdCBvY2N1cnJpbmcNCmFuZ3N0JHBhcnR5W2FuZ3N0JHAwMj09MTVdID0gMC42NDggICMgR3LDvG5lcyBCw7xuZG5pczsgc2V0IGFzIEdQUw0KYW5nc3QkcGFydHlbYW5nc3QkcDAyPT0xNl0gPSA4LjY2NyAgIyBFRFUNCmFuZ3N0JHBhcnR5W2FuZ3N0JHAwMj09MTddID0gNi44NjkgICMgQkRQDQphbmdzdCRwYXJ0eVthbmdzdCRwMDI9PTE4XSA9IDEuMTExICAjIEFkRzsgc2V0IGFzIFBkQQ0KYW5nc3QkaWRlb2xvZ3kgPSBhbmdzdCRwYXJ0eSAgICAgICAgIyBkdXBsaWNhdGUgKG5vdCBlbGVnYW50KSwgYnV0IEkgb2Z0ZW4gY29uZnVzZWQgdGhlbQ0KYW5nc3QkcGFydHkgPSBOVUxMICAgICAgICAgICAgICAgICAgIyByZW1vdmUgZm9yIGNsZWFyZXIgZGF0YXNldA0KYW5nc3QkZWR1W2FuZ3N0JHMxNGExNyA8IDhdID0gYW5nc3QkczE0YTE3W2FuZ3N0JHMxNGExNyA8IDhdICMgZmlsdGVyIERLOyAxLi43DQphbmdzdCRhY3RpdmVbYW5nc3QkczE1PT0xXSA9IDEgIyBpbiBsYWJvdXIgZm9yY2UgKGVyd2VyYnN0w6R0aWcpDQphbmdzdCRhY3RpdmVbYW5nc3QkczE1PT0yXSA9IDAgIyBub3QgaW4gbGFib3VyIGZvcmNlDQphbmdzdCRhY3RpdmUgPSBmYWN0b3IoYW5nc3QkYWN0aXZlKSAgICMgbm9taW5hbA0KIyMgY29udmVydGluZyBlZHUgaW50byB5ZWFycyBvZiBzY2hvb2xpbmc6DQphbmdzdCRlZHVjYXQgPSBhbmdzdCRlZHUgIyBrZWVwIG9sZCwgcmVjb2RlIChmb2xsb3dpbmcgdGFibGUgNyBpbiBBdHRpdHVkZXMgSSkNCmFuZ3N0JGVkdVthbmdzdCRlZHVjYXQgPT0gMV0gPSA3ICAjIG5vbmU7IHNldCB0byA3IChvciBsZXNzKSwgTj00OyBub3QgdG9vIGZhciBvZiB0byBhdm9pZCBpbXBhY3QNCmFuZ3N0JGVkdVthbmdzdCRlZHVjYXQgPT0gMl0gPSA5ICAjIGNvbXB1bHNvcnkgc2Nob29sLCBlbGVtZW50YXJ5IHZvY2F0aW9uYWwgdHJhaW5pbmcNCmFuZ3N0JGVkdVthbmdzdCRlZHVjYXQgPT0gM10gPSAxMg0KYW5nc3QkZWR1W2FuZ3N0JGVkdWNhdCA9PSA0XSA9IDEyICMgZ2VuZXJhbCB0cmFpbmluZyBzY2hvb2wsIGFwcHJlbnRpY2VzaGlwLCBmdWxsLXRpbWUgdm9jYXRpb25hbCBzY2hvb2wsIG1hdHVyaXR5IChoaWdoIHNjaG9vbCkNCmFuZ3N0JGVkdVthbmdzdCRlZHVjYXQgPT0gNV0gPSAxNQ0KYW5nc3QkZWR1W2FuZ3N0JGVkdWNhdCA9PSA2XSA9IDE1ICMgdGVjaG5pY2FsIG9yIHZvY2F0aW9uYWwgc2Nob29sOyBoaWdoZXIgdm9jYXRpb25hbCBjb2xsZWdlDQphbmdzdCRlZHVbYW5nc3QkZWR1Y2F0ID09IDddID0gMTggIyB1bml2ZXJzaXR5DQojIHN1bSBvZiBhbGwgcmVzcG9uc2VzIHdpdGggYSB2YWxpZCByZXNwb25zZSwgLTEgc28gdGhhdCAwIGlzIHRoZSBsb3dlc3QgdmFsdWUNCmFuZ3N0JGNvbWJpID0gcm93U3VtcyhjYmluZChhbmdzdCRmMV8xLTEsIGFuZ3N0JGYxXzItMSwgYW5nc3QkZjFfMy0xLCBhbmdzdCRmMV80LTEsIGFuZ3N0JGYxXzUtMSwgYW5nc3QkZjFfNi0xLCBhbmdzdCRmMV83LTEsIGFuZ3N0JGYxXzgtMSwgYW5nc3QkZjFfOS0xLCBhbmdzdCRmMl8xLTEsIGFuZ3N0JGYyXzItMSwgYW5nc3QkZjJfMy0xLCBhbmdzdCRmMl80LTEsIGFuZ3N0JGYyXzUtMSwgYW5nc3QkZjJfNi0xLCBhbmdzdCRmMl83LTEsIGFuZ3N0JGYyXzgtMSwgYW5nc3QkZjJfOS0xLCBhbmdzdCRmMl8xMC0xLCBhbmdzdCRmMl8xMS0xLCBhbmdzdCRmMl8xMi0xLCBhbmdzdCRmMl8xMy0xLCBhbmdzdCRmMl8xNC0xLCBhbmdzdCRmMl8xNS0xKSwgbmEucm09VFJVRSkNCg0KDQpgYGANCg0KYGBge3J9DQpyaW0yID0gbWVsdChhbmdzdCwgbWVhc3VyZS52YXJzID0gYygiZjJfMSIsICJmMl8yIiwgImYyXzMiLCAiZjJfNCIsICJmMl81IiwgImYyXzYiLCAiZjJfNyIsICJmMl84IiwgImYyXzkiLCAiZjJfMTAiLCAiZjJfMTEiLCAiZjJfMTIiLCAiZjJfMTMiLCAiZjJfMTQiLCAiZjJfMTUiKSwgdmFyaWFibGUubmFtZSA9ICJncm91cCIsIG5hLnJtPVRSVUUpDQoNCg0KYjEgPSBsbWVyKHZhbHVlIH4gZ3JvdXAgKyAoMSB8IGNvZGVyZXNwKSwgZGF0YT1yaW0yKQ0KYjIgPSBsbWVyKHZhbHVlIH4gZ3JvdXAgKyAoMSB8IGNvZGVyZXNwKSArIGVkdSArIG1jcCArIGFnZSwgZGF0YT1yaW0yKQ0KYjMgPSBsbWVyKHZhbHVlIH4gZ3JvdXAgKyAoMSB8IGNvZGVyZXNwKSArIGVkdSArIG1jcCArIGFnZSArIGZlYXIgKyBpZGVvbG9neSArIHNleCArIGFjdGl2ZSwgZGF0YT1yaW0yKQ0KDQogIGxhYmxzID0gYygiQnVzaW5lc3NtYW5cbkZhciBFYXN0IiwgIkJ1c2luZXNzbWFuXG5Dcm9zcy1ib3JkZXIiLCAiQ3JhZnRzbWFuXG5Ccm9rZW4gR2VybWFuIiwgIkNyYWZ0c21hblxuSW5jb21wcmVoZW5zaWJsZSIsICJUb3VyaXN0XG5XZXN0ZXJuIEV1cm9wZSIsICJUb3VyaXN0XG5GYXIgRWFzdCIsICJKb2JzZWVrZXJcblNvdXRoLUVhc3Rlcm4gRXVyb3BlIiwgIkpvYnNlZWtlclxuSW5kaWEiLCAiSm9ic2Vla2VyXG5XZXN0ZXJuIEV1cm9wZSIsICJKb2JzZWVrZXJcbkFmcmljYSIsICJIZWFkc2NhcmYiLCAiRGFyayBza2luIiwgIlBvcnR1Z2FsXG4odHJhZC4gZ3Vlc3R3b3JrZXIpIiwgIkl0YWx5XG4odHJhZC4gZ3Vlc3R3b3JrZXIpIikNCiANCmBgYA0KDQpgYGB7cn0NCiMgc3Vic2V0dGluZyBhZ2UgaW50byB0aHJlZSBkaWZmZXJlbnQgY2F0ZWdvcmllcw0KcmltMiRBZ2VjYXRlZ29yeSA8LSBjdXQocmltMiRhZ2UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC1JbmYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwzNCw1NCwgSW5mKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIi0zNCIsICIzNS01NCIsIjU1KyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBGQUxTRSkNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgDQojIHJlY29kaW5nIHRoZSBjYXRlZ29yaWVzIGludG8gYWdlIGdyb3Vwcw0KcmltMiA8LSByaW0yICU+JQ0KICBtdXRhdGUoQWdlZ3JvdXAgPSByZWNvZGUoQWdlY2F0ZWdvcnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiLTM0IiA9ICJZb3VuZyBBZHVsdHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIjM1LTU0IiA9ICJNaWRkbGUgQWdlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICI1NSsiID0gIkVsZGVybHkiKSkNCg0KcmltMiA8LSByaW0yJT4lDQogIG11dGF0ZShFZHVjYXRpb25sZXZlbCA9IHJlY29kZShlZHUsDQogICAgICAgICAgICAgICAgICAgICAgIjciID0gIkNvbXB1bHNvcnkgU2Nob29sIG5vdCBjb21wbGV0ZWQiLA0KICAgICAgICAgICAgICAgICI5IiA9ICJDb21wdWxzb3J5IFNjaG9vbCwgZWxlbWVudGFyeSB2b2NhdGlvbmFsIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAgICAiMTIiID0gIkhpZ2ggU2Nob29sIiwNCiAgICAgICAgICAgICAgICAiMTUiID0gIkhpZ2hlciB2b2NhdGlvbmFsIGNvbGxlZ2UiLA0KICAgICAgICAgICAgICAgICIxOCIgPSAiVW5pdmVyc2l0eSIpKQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCiMgZ3JhcGggc2hvd2luZyB0aGUgcmVsYXRpb25zaGlwIHdpdGggaG93IGFnZSBhbmQgdGhlIGxldmVsIG9mIGVkdWNhdGlvbg0KIyBBZGRpbmcgc3RhdHMNCnJpbTIgJT4lDQogIGNvdW50KEFnZWdyb3VwLCBlZHUpICU+JSANCiAgZ3JvdXBfYnkoQWdlZ3JvdXApICU+JQ0KICBtdXRhdGUocHJvcCA9IG4gLyBzdW0obikpICU+JQ0KZ2dwbG90KA0KICAgICAgIGFlcyh4ID0gQWdlZ3JvdXAsIHkgPSBlZHUsIGZpbGwgPSBhcy5mYWN0b3IoZWR1KSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiKSArDQogIGdlb21fdGV4dCgNCiAgICBhZXMobGFiZWwgPSByb3VuZCgxMDAgKiBwcm9wLCBkaWdpdHMgPSAyKSksICMgQWRkaW5nIHN0YXRzDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ZpbGwoLjUpLCB2anVzdCA9IC0uNikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkVkdWNhdGlvbiBhbmQgQWdlIiwNCiAgICAgeSA9ICJZZWFycyBpbiBFZHVjYXRpb24iLA0KICAgICB4ID0gIkFnZSBncm91cCIsDQogICAgIGZpbGwgPSAiRWR1Y2F0aW9uIExldmVsIikgKw0KICAgc2NhbGVfZmlsbF9tYW51YWwoDQogICAgIHZhbHVlcyA9IGMoIjciID0gImxpZ2h0IGJsdWUiLCAiOSIgPSAieWVsbG93IiwgIjEyIiA9ICJsaWdodCBncmVlbiIsICIxNSIgPSAiUHVycGxlIiwgIjE4IiA9ICJQaW5rIiksDQogICAgIGxhYmVscyA9IGMoIjciID0gIkNvbXB1bHNvcnkgU2Nob29sIG5vdCBjb21wbGV0ZWQiLA0KICAgICAgICAgICAgICAgICI5IiA9ICJDb21wdWxzb3J5IFNjaG9vbCwgZWxlbWVudGFyeSB2b2NhdGlvbmFsIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAgICAiMTIiID0gIkhpZ2ggU2Nob29sIiwNCiAgICAgICAgICAgICAgICAiMTUiID0gIkhpZ2hlciB2b2NhdGlvbmFsIGNvbGxlZ2UiLA0KICAgICAgICAgICAgICAgICIxOCIgPSAiVW5pdmVyc2l0eSIpKSArDQogICB0aGVtZV9taW5pbWFsKCkgKw0KICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikgDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KIyBiYXIgZ3JhcGggc2hvd2luZyBjb3JyZWxhdGlvbiBiZXR3ZWVuIEZlYXIgYW5kIEFnZSBHcm91cHMNCnJpbTIgJT4lDQogIGNvdW50KHZhbHVlLCBBZ2Vncm91cCkgJT4lIA0KICBncm91cF9ieSh2YWx1ZSkgJT4lDQogIG11dGF0ZShwcm9wID0gbiAvIHN1bShuKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IHZhbHVlLCB5ID0gcHJvcCwgZmlsbCA9IEFnZWdyb3VwKSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCkpICsNCiAgZ2VvbV90ZXh0KA0KICAgIGFlcyhsYWJlbCA9IHJvdW5kKDEwMCAqIHByb3ApKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjgpLCB2anVzdCA9IC0uMg0KICApICsNCiAgbGFicyh5ID0gIiUgb2YgZmVhciBsZXZlbCIpDQoNCmBgYA0KDQoNCiMjIyAyLjIuIE1ldGhvZHMNCg0KRGlkaWVyIGRlY2lkZWQgdG8gdXRpbGlzZSBhIG11bHRpdmFyaWF0ZSByZWdyZXNzaW9uIHN0cmF0ZWd5IGZvciB0aGUgcG9wdWxhdGlvbiBzaXplIGluIHRoZSBvcmlnaW5hbCByZXNlYXJjaC4gSXQgaXMgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUsIHRob3VnaCwgYmVjYXVzZSB0aGUgcGFwZXIgZG9lc24ndCBhZGVxdWF0ZWx5IGRlc2NyaWJlIHRoZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIHBhcnRpY3VsYXIgcmVzZWFyY2ggb3IgcHJvdmlkZSBhbiBleHBsYW5hdGlvbiBmb3IgaGlzIGNob2ljZSBvZiBtb2RlbC4gSSdtIHV0aWxpc2luZyBjbHVzdGVyIGdyYXBocyBhbmQgbWl4ZWQtZWZmZWN0cyBsaW5lYXIgcmVncmVzc2lvbiwgd2hpY2ggZW5hYmxlIG1lIHRvIHVzZSB0aGUgZW50aXJlIHJhbmdlIG9mIHZhcmlhYmxlcy4gUHJpb3IgdG8gY29tbWVuY2luZywgSSBlbXBsb3llZCBjbHVzdGVyIGdyYXBocyB0byBhc2NlcnRhaW4gdGhlIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGFnZSBhbmQgZWR1Y2F0aW9uIGFuZCB0aGVpciBtdXR1YWwgaW5mbHVlbmNlLiBTdWJzZXF1ZW50bHksIEkgZW1wbG95ZWQgYSBiYXIgZ3JhcGggdG8gaWxsdXN0cmF0ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZmVhciAoYSB2YWx1ZSkgYW5kIGFnZSBncm91cHMsIGFzIHdlbGwgYXMgdG8gYXNjZXJ0YWluIHdoZXRoZXIgYXR0aXR1ZGVzIHJlZ2FyZGluZyBhZ2UgdmFyeSBhbW9uZyB2YXJpb3VzIGFnZSBncm91cHMgb3IgcmVtYWluIGNvbnN0YW50Lg0KDQpJbiB0aGUgcmVzZWFyY2gsIGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgd2FzIHVzZWQgdG8gYXNzZXNzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgInZhbHVlIi4gRGF0YSBvbiBhIHJhbmdlIG9mIHZhcmlhYmxlcywgaW5jbHVkaW5nIGFnZSBncm91cHMgYW5kIGVkdWNhdGlvbmFsIGFjaGlldmVtZW50LCB3ZXJlIGNvbGxlY3RlZCBmcm9tIG11bHRpcGxlIHJlc3BvbmRlbnRzIGluIG9yZGVyIHRvIGFjY291bnQgZm9yIGluZGl2aWR1YWwgdmFyaWF0aW9uLiBJbiB0aGlzIG1vZGVsIGZpeGVkIGVmZmVjdHMgd2VyZSB1c2VkIHN1Y2ggYXMgYWdlIChZb3VuZywgbWlkZGxlIGFnZSBhbmQgRWxkZXJseSkgIGNhdGVnb3JpZXMgYW5kIGVkdWNhdGlvbiBsZXZlbCgiQ29tcHVsc29yeSBTY2hvb2wgbm90IGNvbXBsZXRlZCwgQ29tcHVsc29yeSBTY2hvb2wsIGVsZW1lbnRhcnkgdm9jYXRpb25hbCB0cmFpbmluZywgSGlnaCBTY2hvb2wsIEhpZ2hlciB2b2NhdGlvbmFsIGNvbGxlZ2UsIFVuaXZlcnNpdHkpIGFsb25nc2lkZSByYW5kb20gaW50ZXJjZXB0cyBpbiB0aGUgbW9kZWwuIFRvIGV2YWx1YXRlIHRoZSBzaWduaWZpY2FudCBvZiBlYWNoIHByZWRpY3RvcnMsIHRoZSBjb25maWRlbmNlIGludGVydmFscyBhbmQgcC12YWx1ZXMgd2VyZSBjb2RlZGVkIGFmdGVyIHRoZSBjb2VmZmljaWVudHMgZm9yIGZpeGVkIGVmZmVjdHMgYW5kIHZhcmlhbmNlcyBmb3IgcmFuZG9tIGVmZmVjdHMgd2VyZSBldmFsdWF0ZWQuICBUaGUgaHlwb3RoZXNpcydzIGZpdCB3YXMgYXNzZXNzZWQgYnkgY29kaW5nICB0aGUgdmFyaWFuY2Ugb2YgdGhlIHJlc2lkdWFscyAoz4PCsiksIHRoZSB2YXJpYW5jZSBvZiByYW5kb20gaW50ZXJjZXB0cyAoz4QwMCkuIEluIGFkZGl0aW9uLCB0aGUgdmFyaWFuY2UgZXhwbGFpbmVkIGJ5IGZpeGVkIGZhY3RvcnMgb25seSBhbmQgYnkgcmFuZG9tIGFzIHdlbGwgYXMgZml4ZWQgZWZmZWN0cyB3ZXJlIG1lYXN1cmVkIHVzaW5nIHRoZSBtYXJnaW5hbCBSMiBhbmQgY29uZGl0aW9uYWwgUjIsIHJlc3BlY3RpdmVseS4gVGhpcyBhbGwtZW5jb21wYXNzaW5nIHN0cmF0ZWd5IHRvb2sgaW5kaXZpZHVhbCBkaWZmZXJlbmNlcyBpbnRvIGNvbnNpZGVyYXRpb24gd2hpbGUgZW5hYmxpbmcgYSB0aG9yb3VnaCBrbm93bGVkZ2Ugb2YgdGhlIGZhY3RvcnMgaW1wYWN0aW5nIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUuDQoNCg0KDQojIyAzLiBSZXN1bHRzDQoNClRoZSBmaW5kaW5ncyBvZiB0aGUgcmVncmVzc2lvbiBhbmFseXNpcyBhcmUgc3VtbWFyaXNlZCBpbiB0aGUgdGFibGUsIHdoaWNoIGZvY3VzZXMgb24gdGhlIGluZmx1ZW5jZSBvZiBkaWZmZXJlbnQgZGVtb2dyYXBoaWMgYW5kIHNvY2lvZWNvbm9taWMgZmFjdG9ycyBvbiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlLiBUaGUgZGVwZW5kZW50IHZhbHVlIGZvciB0aGUgaW50ZXJjZXB0IGlzIDEuMTAgYW5kIGNvbmZpZGVuY2UgbGV2ZWwgZnJvbSAwLjU5IHRvIDEuOTYgd2hpbGUgdGhlIHAgdmFsdWUgaXMgPDAuIDAwMS5UaGUgZGVwZW5kZW50IHZhcmlhYmxlIHllYXJzIG9mIGVkdWNhdGlvbiBhbmQgc2VsZi1tb25pdG9yaW5nKHRoZSByYW5kb20gaW50ZXJjZXB0IGlzIC0wLjIwLCB0aGUgY29uZmlkZW5jZSBsZXZlbCBpcyAtMC4yOSAtIC0wLjExIGFuZCB0aGVyZSBwLXZhbHVlIGlzIDwwLjAwMSBib3RoIGhhdmUgYSBuZWdhdGl2ZS1zaWduaWZpY2FudCBlZmZlY3QuIFdoaWxlIHRoZSBvdGhlciBkZXBlbmRlbnQgdmFyaWFibGUgc3VjaCBhcyBhZ2UodGhlIHJhbmRvbSBpbnRlcmNlcHQgaXMgMC4wMSwgdGhlIGNvbmZpZGVuY2UgbGV2ZWwgaXMgMC4wMCDigJMgMC4wMSBhbmQgdGhlcmUgcC12YWx1ZSA9IDAuMDAxKSwgZmVhcmZ1bCBwZXJzb25hbGl0eSh0aGUgcmFuZG9tIGludGVyY2VwdCBpcyAwLjE0LCB0aGUgY29uZmlkZW5jZSBsZXZlbCBpcyAwLjEwIOKAkyAwLjE4IGFuZCB0aGVyZSBwLXZhbHVlIGlzIDwwLjAwMSkgYW5kIHJpZ2h0LXdpbmcgaWRlb2xvZ3kodGhlIHJhbmRvbSBpbnRlcmNlcHQgaXMgMC4wNiwgdGhlIGNvbmZpZGVuY2UgbGV2ZWwgaXMgMC4wNCDigJMgMC4wOCBhbmQgdGhlcmUgcC12YWx1ZSBpcyA8MC4wMDEpIGJvdGggaGF2ZSBhIHBvc2l0aXZlIHNpZ25pZmljYW50IGVmZmVjdCB3aGljaCBzaG93cyB0aGF0IHRoZXkgaGF2ZSBhIHBvc2l0aXZlIGFzc29jaWF0aW9uIHdpdGgg4oCcdmFsdWXigJ0uIEZlbWFsZXModGhlIHJhbmRvbSBpbnRlcmNlcHQgaXMgMC4xMywgdGhlIGNvbmZpZGVuY2UgbGV2ZWwgaXMgLTAuMDMg4oCTIDAuMjkgYW5kIHRoZXJlIHAtdmFsdWUgPSAwLjEwMCkgaGF2ZSBwb3NpdGl2ZSBidXQgaXRzIG5vbi1zaWduaWZpY2FudCBhbmQgQWN0aXZlIGlubiBsYWJvdXIodGhlIHJhbmRvbSBpbnRlcmNlcHQgaXMgLTAuMDUsIHRoZSBjb25maWRlbmNlIGxldmVsIGlzIC0wLjIzIOKAkyAwLjEzIGFuZCB0aGVyZSBwLXZhbHVlID0gMC41NjMpIGhhcyBhIG5vbi1zaWduaWZpY2FudCBuZWdhdGl2ZSBlZmZlY3QuDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojIFJlbmFtaW5nIHZhcmlhYmxlcw0KbmFtZXMocmltMilbbmFtZXMocmltMikgPT0gImVkdSJdIDwtICJZZWFyc19vZl9lZHVjYXRpb24iDQpuYW1lcyhyaW0yKVtuYW1lcyhyaW0yKSA9PSAibWNwIl0gPC0gIlNlbGZfbW9uaXRvcmluZyINCm5hbWVzKHJpbTIpW25hbWVzKHJpbTIpID09ICJBZ2UiXSA8LSAiYWdlIg0KbmFtZXMocmltMilbbmFtZXMocmltMikgPT0gImZlYXIiXSA8LSAiRmVhcmZ1bF9wZXJzb25hbGl0eSINCm5hbWVzKHJpbTIpW25hbWVzKHJpbTIpID09ICJpZGVvbG9neSJdIDwtICJyaWdodF93aW5nX2lkZW9sb2d5Ig0KbmFtZXMocmltMilbbmFtZXMocmltMikgPT0gInNleCJdIDwtICJGZW1hbGUiDQpuYW1lcyhyaW0yKVtuYW1lcyhyaW0yKSA9PSAiYWN0aXZlIl0gPC0gIkFjdGl2ZV9pbl9MYWJvdXJfTWFya2V0Ig0KDQpiMyA9IGxtZXIodmFsdWUgfiBncm91cCArICgxIHwgY29kZXJlc3ApICsgWWVhcnNfb2ZfZWR1Y2F0aW9uICsgU2VsZl9tb25pdG9yaW5nICsgYWdlICsgIEZlYXJmdWxfcGVyc29uYWxpdHkgKyByaWdodF93aW5nX2lkZW9sb2d5ICsgRmVtYWxlICsgQWN0aXZlX2luX0xhYm91cl9NYXJrZXQsIGRhdGE9cmltMikNCg0Kc3VtbWFyeShiMykNCnRhYl9tb2RlbChiMykNCnBsb3RfbW9kZWwoYjMsIHRyYW5zZm9ybSA9IE5VTEwsDQogICAgICAgICAgIHRpdGxlID0gIkhvdyBUaHJlYXRuZWQgeW91IGZlZWwgd2l0aCBJbW1pZ3JhbnRzIiwNCiAgYXhpcy50aXRsZSA9IGMoIkVzdGltYXRlcyIsIkluZGVwZW5kYW50IHZhcmlhYmxlcyIpKQ0KDQpgYGANClRoaXMgbGluZWFyIG1vZGVsIHNob3dzIHRoZSBpbXBhY3Qgb2YgdmFyaW91cyBwcmVkaWN0b3JzIG9uIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUg4oCcdmFsdWUoZmVhcinigJ0uIFRoZSBpbnRlcmNlcHQgZXN0aW1hdGVkIGF0IDEuMjcsIGFuZCB0aGVpciBjb25maWRlbmNlIGludGVydmFsIChDSSkgb2YgMC4yMiB0byAyLjMyLCB0aGUgcC12YWx1ZSBpcyAwLjAxOCB3aGljaCBpbmRpY2F0ZXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gVGhlIEFnZSBncm91cHMgc2hvd3MgdGhhdCB0aGUgRWxkZXJseSBncm91cCAodGhlIHJhbmRvbSBpbnRlcmNlcHQgaXMgMC4zMiwgdGhlIGNvbmZpZGVuY2UgbGV2ZWwgaXMgLTAuMDYgYW5kIHRoZXJlIHAtdmFsdWUgaXMgPDAuMDAxKSBoYXMgYSBwb3NpdGl2ZSBjb3JyZWxhdGlvbiB3aGlsZSB0aGUgbWlkZGxlIGFnZSh0aGUgcmFuZG9tIGludGVyY2VwdCBpcyAwLjEyLCB0aGUgY29uZmlkZW5jZSBsZXZlbCBpcyAtMC4wNiB0bzAuMzAgYW5kIHRoZXJlIHAtdmFsdWUgaXMgMC4yMDMpICBoYXMgbm8gc2lnbmlmaWNhbnQgY29ycmVsYXRpb24uIEZvciBFZHVjYXRpb24gTGV2ZWwgdGhlcmUgaXMgbm8gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBjb3JyZWxhdGlvbiBvbiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlOiBjb21wdWxzb3J5IHNjaG9vbCh0aGUgcmFuZG9tIGludGVyY2VwdCBpcyAwLjMzLCB0aGUgY29uZmlkZW5jZSBsZXZlbCBpcyAtMC43MyAtIDEuNDAgYW5kIHRoZXJlIHAtdmFsdWUgPSAwLjUzOCksIGhpZ2ggc2Nob29sICh0aGUgcmFuZG9tIGludGVyY2VwdCBpcyAwLjI5LCB0aGUgY29uZmlkZW5jZSBsZXZlbCBpcyAtMC43NiAtIDEuMzMgYW5kIHRoZXJlIHAtdmFsdWUgPSAwLjU5MSksIEhpZ2hlciB2b2NhdGlvbmFsIGNvbGxlZ2UodGhlIHJhbmRvbSBpbnRlcmNlcHQgaXMgMC4yMiwgdGhlIGNvbmZpZGVuY2UgbGV2ZWwgaXMgLTAuMDgzIOKAkyAxLjI3IGFuZCB0aGVyZSBwLXZhbHVlID0gMC42NzgpIGFuZCBsYXN0bHkgdW5pdmVyc2l0eSBpcyh0aGUgcmFuZG9tIGludGVyY2VwdCBpcyAtMC4wOSwgdGhlIGNvbmZpZGVuY2UgbGV2ZWwgaXMgLTEuMTQg4oCTIDAuOTYgYW5kIHRoZXJlIHAtdmFsdWUgPSAwLjg2NykNCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KYjQgPSBsbWVyVGVzdDo6bG1lcih2YWx1ZSB+ICBFZHVjYXRpb25sZXZlbCArIEFnZWdyb3VwICsgKDF8Y29kZXJlc3ApLCBkYXRhPXJpbTIpDQoNCnN1bW1hcnkoYjQpDQp0YWJfbW9kZWwoYjQpDQpwbG90X21vZGVsKGI0LCB0cmFuc2Zvcm0gPSBOVUxMLA0KICAgICAgICAgICB0aXRsZSA9ICJIb3cgZGlmZmVyZW50IGF0dGl0dWRlcyB2YXJ5IGR1ZSB0byBkaWZmcmVudCBhZ2UgZ3JvdXBzIGFuZCBob3cgZWR1Y2F0aW9uIGltcGFjdHMgaXQgIiwNCiAgYXhpcy50aXRsZSA9IGMoIkVzdGltYXRlcyIsIkluZGVwZW5kYW50IHZhcmlhYmxlcyIpKQ0KDQpgYGANCg0KDQojIyA0LiBDb25jbHVzaW9ucw0KDQoqKjI1MCB3b3JkcyoqDQoNCk15IHJlcGxpY2F0aW9uIHN0dWR5IHdhcyBhaW1lZCB0byBzZWUgdGhlIHBvc3NpYmxlIHJlc3VsdHMgdGhhdCB3b3VsZCBhcHBlYXIgZnJvbSB0aGUgb3JpZ2luYWwgcmVwbGljYXRpb24gY2xhaW0gaW4gd2hpY2ggRGlkZXIgc3RhdGVkIHRoYXQgb2xkZXIgcGVvcGxlIHRlbmQgdG8gaGF2ZSBhIG5lZ2F0aXZlIHZpZXcuIFRoZSByZXN1bHRzIGFwcHJvdmUgdGhlIGNsYWltIGhlIG1hZGUgcHJvdmluZyB0aGF0IHlvdW5nZXIgcGVvcGxlIHRlbmQgdG8gaGF2ZSBhIG1vcmUgcG9zaXRpdmUgdmlldyB0byBpbW1pZ3JhdGlvbiBjb21wYXJlZCB0byBvbGRlciBwZW9wbGUgYW5kIGVkdWNhdGlvbiBkb2VzbuKAmXQgbm90IGltcGFjdCBwZW9wbGXigJlzIGF0dGl0dWRlcyBhdCBhbGwuDQoNClRoZSByZXN1bHQgc3VnZ2VzdGVkIHRoYXQgdGhlcmUgYXJlIG90aGVyIHZhcmlhYmxlcyB0aGF0IGVmZmVjdCBob3cgcGVvcGxlIHNlZSBpbW1pZ3JhdGlvbi4gVGhlIHJlc3VsdHMgc2hvdyB0aGF0IHBvbGl0aWNhbCBpZGVvbG9neSBwbGF5cyBhIGJpZyByb2xlIG9uIHBlb3BsZeKAmXMgYXR0aXR1ZGVzIHRvd2FyZHMgaW1taWdyYXRpb24uIHN1YnNlcXVlbnRseSBpcyB3ZWxsIHJlY29nbml6ZWQgdGhhdCwgb3V0c2lkZSBvZiB0aGUgZmllbGQgb2YgaW1taWdyYXRpb24gcmVzZWFyY2gsIGluZGl2aWR1YWxzIGJ1aWxkIHRoZWlyIHZpZXdzIG9uIHBvbGl0aWNzIGJhc2VkIG9uIHRoZWlyIGF0dGl0dWRlcyB0b3dhcmRzIHNldmVyYWwgcHJvbWluZW50IHNvY2lvZWNvbm9taWMgZ3JvdXBpbmdzLiBGdXR1cmUgc3R1ZHkgc2hvdWxkIGludmVzdGlnYXRlIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRob3NlIHNvY2lhbCBncm91cHMgY291bGQgYmUgZGVzY3JpYmVkIGluIHRlcm1zIG9mIHBvbGl0aWNzIGluIGFkZGl0aW9uIHRvIGV0aG5pY2l0eSBvciBuYXRpb25hbGl0eSAoZS5nLiwgR3JlZW4gZXQgYWwuIDIwMDIpLg0KSW4gY29uY2x1c2lvbiB3aGlsZSBpbiB0aGlzIHN0dWR5IGl0IGNsYWltZWQgb2xkZXIgcGVvcGxlIHBlcmNlaXZlIGltbWlncmFudHMgbmVnYXRpdmVseSwgdGhlcmUgYXJlIG90aGVyIGZhY3RvcnMgdGhhdCBpbnRlcmZlcmUgd2l0aCBhbmQgZWR1Y2F0aW9uIGRvZXMgbm90IHBsYXkgYSBiaWcgcGFydCBvZiBpdA0KDQogDQoNCg0KIyMgUmVmZXJlbmNlcw0KDQoqKm1pbi4gNSBzY2llbnRpZmljIHJlZmVyZW5jZXMsIGV4Y2x1ZGluZyB0aGUgcmVwbGljYXRlZCBwYXBlcioqDQoNCg0KRHJhxb5hbm92w6EsIEwuLCBHb25ub3QsIEouLCBIZWlkbGFuZCwgVC4gYW5kIEtyw7xnZXIsIEYuLCAyMDI0LiBXaGljaCBpbmRpdmlkdWFsLWxldmVsIGZhY3RvcnMgZXhwbGFpbiBwdWJsaWMgYXR0aXR1ZGVzIHRvd2FyZCBpbW1pZ3JhdGlvbj8gYSBtZXRhLWFuYWx5c2lzLiBKb3VybmFsIG9mIGV0aG5pYyBhbmQgbWlncmF0aW9uIHN0dWRpZXMsIDUwKDIpLCBwcC4zMTctMzQwLg0KDQpDcmVwYXosIE0uTS4gYW5kIERhbXJvbiwgUi4sIDIwMDkuIENvbnN0cnVjdGluZyB0b2xlcmFuY2U6IEhvdyB0aGUgd2VsZmFyZSBzdGF0ZSBzaGFwZXMgYXR0aXR1ZGVzIGFib3V0IGltbWlncmFudHMuIENvbXBhcmF0aXZlIFBvbGl0aWNhbCBTdHVkaWVzLCA0MigzKSwgcHAuNDM3LTQ2My4NCg0KU2NoZXZlLCBLLkYuIGFuZCBTbGF1Z2h0ZXIsIE0uSi4sIDIwMDEuIExhYm9yIG1hcmtldCBjb21wZXRpdGlvbiBhbmQgaW5kaXZpZHVhbCBwcmVmZXJlbmNlcyBvdmVyIGltbWlncmF0aW9uIHBvbGljeS4gUmV2aWV3IG9mIEVjb25vbWljcyBhbmQgU3RhdGlzdGljcywgODMoMSksIHBwLjEzMy0xNDUuDQoNCnZhbiBEYWxlbiwgSC5QLiBhbmQgSGVua2VucywgSy4sIDIwMDUuIFRoZSByYXRpb25hbGl0eSBiZWhpbmQgaW1taWdyYXRpb24gcG9saWN5IHByZWZlcmVuY2VzLiBEZSBFY29ub21pc3QsIDE1MywgcHAuNjctODMuDQoNCldlbGRvbiwgUy5BLiwgMjAwNi4gVGhlIGluc3RpdHV0aW9uYWwgY29udGV4dCBvZiB0b2xlcmFuY2UgZm9yIGV0aG5pYyBtaW5vcml0aWVzOiBBIGNvbXBhcmF0aXZlLCBtdWx0aWxldmVsIGFuYWx5c2lzIG9mIFdlc3Rlcm4gRXVyb3BlLiBBbWVyaWNhbiBqb3VybmFsIG9mIHBvbGl0aWNhbCBzY2llbmNlLCA1MCgyKSwgcHAuMzMxLTM0OS4NCg0KQ29lbmRlcnMsIE0uIGFuZCBTY2hlZXBlcnMsIFAuLCAyMDAzLiBUaGUgZWZmZWN0IG9mIGVkdWNhdGlvbiBvbiBuYXRpb25hbGlzbSBhbmQgZXRobmljIGV4Y2x1c2lvbmlzbTogQW4gaW50ZXJuYXRpb25hbCBjb21wYXJpc29uLiBQb2xpdGljYWwgcHN5Y2hvbG9neSwgMjQoMiksIHBwLjMxMy0zNDMuDQoNCkVzcGVuc2hhZGUsIFQuSi4gYW5kIENhbGhvdW4sIEMuQS4sIDE5OTMuIEFuIGFuYWx5c2lzIG9mIHB1YmxpYyBvcGluaW9uIHRvd2FyZCB1bmRvY3VtZW50ZWQgaW1taWdyYXRpb24uIFBvcHVsYXRpb24gcmVzZWFyY2ggYW5kIHBvbGljeSByZXZpZXcsIDEyLCBwcC4xODktMjI0Lg0KDQpWb2d0LCBQYXVsIFcuIDE5OTcuIFRvbGVyYW5jZSBhbmQgRWR1Y2F0aW9uLiBUaG91c2FuZCBPYWtzOiBTYWdlLg0KDQpTbmlkZXJtYW4sIFAuTS4sIEJyb2R5LCBSLkEuIGFuZCBLdWtsaW5za2ksIEouSC4sIDE5ODQuIFBvbGljeSByZWFzb25pbmcgYW5kIHBvbGl0aWNhbCB2YWx1ZXM6IFRoZSBwcm9ibGVtIG9mIHJhY2lhbCBlcXVhbGl0eS4gQW1lcmljYW4gam91cm5hbCBvZiBwb2xpdGljYWwgc2NpZW5jZSwgcHAuNzUtOTQuDQoNCkhhaW5tdWVsbGVyLCBKLiBhbmQgSGlzY294LCBNLkouLCAyMDA3LiBFZHVjYXRlZCBwcmVmZXJlbmNlczogRXhwbGFpbmluZyBhdHRpdHVkZXMgdG93YXJkIGltbWlncmF0aW9uIGluIEV1cm9wZS4gSW50ZXJuYXRpb25hbCBvcmdhbml6YXRpb24sIDYxKDIpLCBwcC4zOTktNDQyLg0KCQ0KSGFpbm11ZWxsZXIsIEouIGFuZCBIb3BraW5zLCBELkouLCAyMDE0LiBQdWJsaWMgYXR0aXR1ZGVzIHRvd2FyZCBpbW1pZ3JhdGlvbi4gQW5udWFsIHJldmlldyBvZiBwb2xpdGljYWwgc2NpZW5jZSwgMTcsIHBwLjIyNS0yNDkuDQoNCg0KIyMgQXBwZW5kaXgNCg0KIyMjIEFwcGVuZGl4IDEuIE15IGVudmlyb21lbnQgKGZ1bGwgaW5mb3JtYXRpb24pIA0KDQpgYGB7ciBzZXNzaW9ufQ0KIyBEZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBteSBlbnZpcm9ubWVudA0Kc2Vzc2lvbkluZm8oKQ0KYGBgDQoNCiMjIyBBcHBlbmRpeCAyLiBFbnRpcmUgUiBjb2RlIHVzZWQgaW4gdGhlIHByb2plY3QNCg0KYGBge3IgcmVmLmxhYmVsPWtuaXRyOjphbGxfbGFiZWxzKCksIGVjaG89VFJVRSwgZXZhbD1GQUxTRX0NCmBgYA0K