Replication project on Government (dis)trust

Study Preregistration form: https://rpubs.com/a200382029/1047701

Information about this replication project


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("rmarkdown")
library("knitr")
library("haven")
library("ggeffects")
library("ggplot2")
library("dplyr")
library("ggthemes")
library("gridExtra")
library("cowplot")
library("ggpubr")
library("plotly")
library("renv")
library("sjPlot")
library("prettydoc")
library("withr")
library("skimr")

Versions of used packages

$rmarkdown
[1] '2.21'

$knitr
[1] '1.42'

$haven
[1] '2.5.2'

$ggeffects
[1] '1.2.2'

$ggplot2
[1] '3.4.2'

$dplyr
[1] '1.1.2'

$ggthemes
[1] '4.2.4'

$gridExtra
[1] '2.3'

$cowplot
[1] '1.1.1'

$ggpubr
[1] '0.6.0'

$plotly
[1] '4.10.1'

$renv
[1] '0.17.3'

$sjPlot
[1] '2.8.14'

$prettydoc
[1] '0.4.1'

$withr
[1] '2.5.0'

$skimr
[1] '2.1.5'

My enviroment

[1] "R version 4.2.2 (2022-10-31 ucrt)"


1. Introduction

This research project is an extension to Klein and Robinson’s paper (2019) which examines how social media can (de)polarize society and influence our trust on the government. Within my project there is a shift to focus on age having an impact on trust and comparing democratic and republican voters. Whilst Klein and Robinson are partly effective in capturing how (dis)trust varies, Holt et al. (2013) would advocate for a focus on age, finding social media and political interest are heavily impacted by this. Through their study, Holt et al. finds that social media usage will vary according to age which indicates changes in political interest and trust. There is an acknowledgement that social media purposes will vary between age, it can be equally impactful and influence political views. The data comes from a similar variation to the ANES, a Swedish study and through an OLS regression model found younger people sharing less interest in politics than older people. Additionally, statistically significant results suggest social media interest can impact all age groups. I therefore find it necessary to analyse the impact of age (taking it as a separate variable to analyse) to understand trust differences towards trust of the government.

Having analysed academic research surrounding age and governmental trust, age is found to be a statistically significant effect. Prior (2010) mentions the ease of access to political topics through social media, finding how political interest for one individual is unlikely to change drastically but with social media, people can invest a greater interest in politics. Furthermore, a paper conducted by Hitlin and Shutava (2022) focus on demographic factors influencing distrust in the government and particularly mention how impactful age can have: minor differences between those over sixty-five and people aged 18-34 for trust in government however, those middle aged had a far greater interest. Furthermore, Christensen and Lægreid in (2005) found older people tend to have a greater trust in the government but also notes the significance of institutions having a statistically significant impact on trust. Whilst these papers all find age to have an impact towards trust they all consist of alternative views, therefore should analysed to a greater context. Alternatively, Dalton assess the ANES, to cover political interest but focuses on how views differ over decades. This gives an alternative perspective, rather than analysing age Dalton concentrates the focus through a longitudinal approach from 1952 to 2000 gathering opinions from over twelve elections. The study included information such as 1980 being the lowest point (during the Reagan administration) and the 1960’s consisted of the era with most trust. There is an overall downwards trend over these years and Dalton does reflect the impact of social media and a reasoning behind a decrease in political trust.

In the preregistration form it was clarified how equivalent results were expected to Klein and Robinson (2019) but with age being the main shift of focus, I expected that distrust in government for democrats will increase with age whereas a decrease for republicans. (This prediction was since a democrat occupying the White House in both years the study was conducted). The type of replication would be described as “tests of robustness” (Freese and Perterson, 2017) where the same data was analysed however, a slight variation in what was being researched.


2. Data and methods

2.1. Data

The data is analysed from the American National Election Studies (ANES) which is identical to the original paper and can be found on the OFS Home website. The ‘anes_comb.dta’ variable was chosen since all required variables were accessible.

Downloading dataset

anes_comb <- read_dta("C:/Users/44748/Downloads/anes_comb.dta")

The dataset contained 10,184 observations with eighty-nine separate variables and gathered data in 2012 and 2016. The dependent variable analysed is the ‘Trust Index’ which consists of four different questions regarding trust of the government then scaled 0-1, a higher result meaning greater distrust in government and lower meaning greater trust in government.

Trust index examples

[1] 0.9375 0.8750 0.7500 0.6250 0.3125 0.9375

The paper had results regarding ‘party attitudes’ similarly ranked 0-1 with a low score associated with democratic and high with a republican preference. To understand which political party the subjects favoured, a ‘Party’ variable was formed which separated the two into “demo” and “rep” favoured voters (anything greater than 0.5 was coded as ‘rep’ and less than as ‘demo’).

Separating out the two parties

anes_comb$party[anes_comb$pol_party01 > 0.504] <- "rep"
anes_comb$party[anes_comb$pol_party01 < 0.496] <- "demo"

Furthermore, to understand party differences, two additional datasets including party preference was created. From there two alternative regression models could be created to understand differences.

Creating two different datasets based on party

anes_dem <- anes_comb %>% filter(party == "demo")
anes_rep <- anes_comb %>% filter(party == "rep")

Other than this, there were no other variable changes. For those (4 respondents) within the midpoint (0.5) with no party preference being ignored. Rather than using the whole dataset as one, the two political parties’ datasets were used to replicate ‘Figure 1’ with all original variables included with the addition of age (taken as a separate variable) and age squared (age^2). Other variables in this research include social media use; presidential approval; social trust; gender; race and income. STEALTH was another important variable in understanding diverse opinions differing with age and between democrats and republicans.

Brief summary statistics including trust and age

Overall

Data summary
Name anes_comb
Number of rows 10184
Number of columns 89
_______________________
Column type frequency:
numeric 2
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
trust_index 26 1.00 0.7 0.21 0 0.58 0.75 0.83 1 ▁▂▃▆▇
age 181 0.98 49.5 17.14 17 35.00 51.00 63.00 90 ▆▇▇▆▂

Democratic

Data summary
Name anes_dem
Number of rows 5021
Number of columns 89
_______________________
Column type frequency:
numeric 2
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
trust_index 7 1.00 0.65 0.21 0 0.5 0.69 0.81 1 ▁▃▅▇▇
age 81 0.98 48.77 16.89 17 35.0 50.00 62.00 90 ▆▇▇▆▂

Republican

Data summary
Name anes_rep
Number of rows 3545
Number of columns 89
_______________________
Column type frequency:
numeric 2
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
trust_index 3 1.00 0.76 0.17 0 0.75 0.81 0.88 1 ▁▁▂▃▇
age 55 0.98 52.19 17.00 18 39.00 54.00 65.00 90 ▅▅▇▆▂

2.2. Methods

In the paper linear regression was conducted to understand government trust and party attitudes, this was the same method used in this research. The method from this research was similar, taking all identical variables but also including age as a factor. Furthermore, this research also included two separate datasets reflecting their party preference to understand differences. So, a total of three statistical models are presented, showing an overall trend and two representing differences between each political party.

Regression Codes (3)

Overall

# graph 1
graph1 <- lm(data = anes_comb, trust_index ~ as.numeric(pol_party01) +
               as.numeric(socialmed01) + mediause01 +
               news_cons01 + worse_off01 + pres_aprv + libcon01 + as.factor(gay_mar) +
               spend_index01 + social_trust01 + activity_trunc +
               as.factor(male) + educ01 + as.factor(race_cat_1) +
               s_issue + party + age + I(age^2))

# graph 2 (FINAL)
graph2 <- lm(data = anes_comb, trust_index ~ +
               mediause01 + news_cons01 + worse_off01 +
               pres_aprv +spend_index01 + social_trust01 +
               educ01 + s_issue + party + age + I(age^2))

Democratic

# graph 1
graph1d <- lm(data = anes_dem, trust_index ~ as.numeric(pol_party01) +
               as.numeric(socialmed01) + mediause01 +
               news_cons01 + worse_off01 + pres_aprv + libcon01 + as.factor(gay_mar) +
               spend_index01 + social_trust01 + activity_trunc +
               as.factor(male) + educ01 + as.factor(race_cat_1) +
               s_issue + age + I(age^2))

# graph 2
graph2d <- lm(data = anes_dem, trust_index ~ +
                mediause01 +
                news_cons01 + worse_off01 + pres_aprv + as.factor(gay_mar) +
                spend_index01 + social_trust01 +
                educ01 + as.factor(race_cat_1) +
                s_issue + age + I(age^2))

# graph 3
graph3d <- lm(data = anes_dem, trust_index ~ +
                mediause01 +
                worse_off01 + pres_aprv +
                social_trust01 +
                educ01 + as.factor(race_cat_1) +
                s_issue + age + I(age^2))

# graph 4 (FINAL)
graph4d <- lm(data = anes_dem, trust_index ~ +
                 +worse_off01 + pres_aprv +
                social_trust01 +s_issue + age + I(age^2))

Republican

# graph 1
graph1r <- lm(data = anes_rep, trust_index ~ as.numeric(pol_party01) +
               as.numeric(socialmed01) + mediause01 +
               news_cons01 + worse_off01 + pres_aprv + libcon01 + as.factor(gay_mar) +
               spend_index01 + social_trust01 + activity_trunc +
               as.factor(male) + educ01 + as.factor(race_cat_1) +
               s_issue + age + I(age^2))

# graph 2
graph2r <- lm(data = anes_rep, trust_index ~ +
                mediause01 +
                news_cons01 + worse_off01 + pres_aprv + as.factor(gay_mar) +
                spend_index01 + social_trust01 +
                educ01 + as.factor(race_cat_1) +
                s_issue + age + I(age^2))

# graph 3
graph3r <- lm(data = anes_rep, trust_index ~ +
                news_cons01 + worse_off01 + pres_aprv+
                spend_index01 + social_trust01 +
                educ01 + as.factor(race_cat_1) +
                s_issue + age + I(age^2))

# graph 4 (FINAL)
graph4r <- lm(data = anes_rep, trust_index ~ +
                 + worse_off01 + pres_aprv+
                 + social_trust01 +
                 +s_issue + age + I(age^2))

When running the regression code, both codes began with all identical variables included in the original paper along with age (taken as its own variable) and age squared. After applying the ‘summary’ feature for both modes, one-by-one statistically insignificant results were removed (p-value > 0.05) from the regression. For this research, I aimed to have the identical variables for the ‘demo’ and ‘rep’ regression model so both models would be easily comparable with no differing variables. Once the three models contain statically significant results, prediction models can be formed representing changes in political trust whilst controlling for age, hence adding a polynomial in age squared. With these prediction modes, comparisons between the party can be made to understand how (dis)trust varies over age. In addition, linear regression graphics are displayed with trust and age without controlling for other variables and are included to produce a simple understanding in comparison between political parties and the (dis)trust. Geom_smooth is used to visualise the confidence intervals whilst predicting for ‘age’.


3. Results

Trust as people get older

Overall

combi <- anes_comb %>% 
     na.omit() %>% 
     ggplot()+
     aes(x = age, y = trust_index, colour = party)+
     stat_smooth(method = 'loess')+
  scale_color_manual(labels = c("Democratic", "Republican"),
                     values = c('Blue', 'Red'))+
  labs(title = "Distrust in government as people get older",
       x = "Age", y = "Trust in Government",
       caption = "DATA: OSF Home")+
  theme_solarized()
ggplotly(combi)

Democratic

demt <- ggplot(data = graph4d, aes(x = age, y = trust_index))+
  stat_smooth(method = 'loess')+
  labs(title = "Distrust in governmnet as people get older",
       subtitle = "(Democratic)", x = "Age", y = "Trust in Government",
       caption = "DATA: OSF Home")+
  theme_solarized()+
  scale_color_manual(values = 'Blue')
ggplotly(demt)

Republican

rept <- ggplot(data = graph4r, aes(x = age, y = trust_index))+
  stat_smooth(method = 'loess', colour = "Red")+ 
  labs(title = "Distrust in governmnet as people get older",
       subtitle = "(Republican)", x = "Age", y = "Trust in Government",
       caption = "DATA: OSF Home")+
  theme_solarized()+ 
  scale_color_manual(values = c('Red')) 
ggplotly(rept)

The first three sets of graphics show predictions for the linear models (confidence level at 95%) and used to enhance the readers knowledge regarding the distrust (of gov.) and how it varies over age. The ‘overall’ graph represents the differences in distrust with parties, where republicans overall a positive relationship with distrust and age increase. On the other hand, democratic differs with a small negative association. As people get older the range between the two expands and bipolar results around the ages of 55 are evident with republicans having an increase in distrust and democrats having a decrease (until the very later ages). The singular party models have also been included to provide a ’simpler’ model to understand and interact with.

Overall results

tab_model(graph2,
          pred.labels = c("(Intercept)", "Media usage",
                          "News usage", "Worse off", "Approval",
                          "Spend Index", "Social trust",
                          "Education", "Stealth", "Party", "Age",
                          "Age^2"),
          dv.labels = c("Overall Distrust"))
  Overall Distrust
Predictors Estimates CI p
(Intercept) 0.73 0.68 – 0.77 <0.001
Media usage 0.03 0.01 – 0.05 <0.001
News usage 0.02 0.01 – 0.03 <0.001
Worse off 0.06 0.04 – 0.07 <0.001
Approval -0.17 -0.18 – -0.15 <0.001
Spend Index -0.04 -0.06 – -0.02 0.001
Social trust 0.08 0.06 – 0.10 <0.001
Education -0.03 -0.06 – -0.00 0.042
Stealth 0.00 -0.00 – 0.00 0.513
Party -0.01 -0.03 – 0.00 0.067
Age 0.00 -0.00 – 0.00 0.330
Age^2 -0.00 -0.00 – 0.00 0.179
Observations 7703
R2 / R2 adjusted 0.151 / 0.150

When creating the regression model of overall distrust, the statistically significant results are highlighted in bold under ‘p’. Media (0.03) and news (0.02) usage are both associated with positive coefficient estimates in distrust, suggesting both these factors have a significance on our interpretation around government and even daily life, with media having a slightly greater impact than news. Those who agree with approval of the president has the greatest decline in estimates (-0.17), makes perfect sense since they agree with the current president. Those who believed they were worse off therefore saw the direct opposite with a 0.06 increase in distrust. Spending index (-0.04) and education (-0.03) both also saw negative coefficient estimates suggesting as both increases, the levels of trust increase. Finally, those with increasing social trust (0.08) had an overall distrust in government. Although stealth and party are not statistically significant, they have remained in the model since they are important factors which are analysed later. As mentioned in the pre-registration form earlier, age and age^2 remain regardless since it is the variable we are measuring.

Comparing both results

tab_model(graph4d, graph4r, 
          pred.labels = c("Intercept", "Worse Off", "Approval",
          "Distrust", "Stealth", "Age", "Age^2"),
          dv.labels = c("Democratic", "Republican"),
          string.est = "Coeff",
          string.ci = "Conf. Int (95%)",
          string.p = "P-value")
  Democratic Republican
Predictors Coeff Conf. Int (95%) P-value Coeff Conf. Int (95%) P-value
Intercept 0.67 0.62 – 0.72 <0.001 0.69 0.65 – 0.74 <0.001
Worse Off 0.06 0.04 – 0.08 <0.001 0.05 0.03 – 0.07 <0.001
Approval -0.14 -0.17 – -0.12 <0.001 -0.20 -0.23 – -0.18 <0.001
Distrust 0.07 0.04 – 0.09 <0.001 0.08 0.06 – 0.10 <0.001
Stealth 0.01 0.00 – 0.01 0.009 -0.00 -0.01 – 0.00 0.113
Age 0.00 -0.00 – 0.00 0.078 0.00 -0.00 – 0.00 0.095
Age^2 -0.00 -0.00 – -0.00 0.042 -0.00 -0.00 – 0.00 0.084
Observations 4844 3442
R2 / R2 adjusted 0.055 / 0.053 0.122 / 0.121

Once the two linear regressions are separated, given variables can be compared and understood for each party. For example, democrats believing they were worse off have a greater distrust than republicans. With those who had of approval for the president, republicans had a much larger coefficient estimate of trust. It is also shown there is a greater level of distrust amongst republicans than democrats which suggests they had a greater sense of mistrust over the two elections (with each party winning once).

‘Age’ Controlled GRAPHS (DEMO AND REP)

annotate_figure(control,
                top = text_grob("Distrust in Government", size = 16, face = "bold"),
                bottom = text_grob("Data source: OFS Home",
                                   hjust = 1, x = 1, face = "italic", size = 10),
                left = text_grob("Distrust in Government", rot = 90, size = 16))

Next, both these graphics represent age compared with level of distrust whilst controlling for all other variables. Both graphs are similar with an overall decrease in trust with democratic having a much larger decrease. Republicans have a peak level of distrust (0.769) around the age of 50 whereas democrats peak level of distrust (0.65) arrives around the age 44. As both parties get older, there ends up being an increase in trust, a much greater increase for democrats (0.037) than republicans (0.023). It is important to notice the confidence intervals larger since the quantity of older voters decrease.

Understanding ‘Stealth issues’

ggplot(data = graph2, aes(x = age, y = trust_index, colour = party))+
  stat_smooth(method = 'loess')+
  facet_wrap(~s_issue, dir = "h")+
  theme_igray()+   
  labs(x = "Age" , y = "Trust", 
       title = "Distrust in Government by age",
       subtitle = "STEALTH Campaign: 0 = low diverse opinion, 5 = highly diverse opinion",
       caption = "DATA: OSF Home")+
  scale_color_manual(labels = c("Democratic", "Republican"),
    values = c('Blue', 'Red'))

Finally, we can enhance our understanding from the original study by assessing levels of trust varying as parties have a greater level of diverse opinions. The graphic shows republicans almost always having a greater level of distrust however, as opinions get more diverse, the difference in distrust decreases. The levels of distrust do not decrease much for democrats however, as diversity increases for democrats, so does their level in trust.


4. Conclusions

To conclude with, we can see how social media had an effect on trust within parties something advocated by Holt et al along with Prior but also furthered the study by looking at how it varied between parties. When assessing this project with the original study, it does differ in the way they find an overall difference between parties and trust whereas this project finds a similar patter with distrust being highest during middle ages and lowest at young and old ages.

Likewise, results from this project favours Christensen and Lægreid’s research finding how trust increases as people get older (my research finds this occurs with both parties). Dalton’s perspective through a longitudinal approach is something that could have been further researched and understanding trust patterns throughout decades however, we both come to the conclusion that social media has a powerful impact on individuals. Hitlin and Shutava’s study is something that is somewhat challenged, the levels of trust between older and younger people were minimal (as found in their study) however, we find the opposite in trust for middle aged people where there is an increase in distrust rather than trust.

As to the hypothesis stated earlier, it was marginally correct in stating distrust will increase with democrats however, in this study did find an increase at the ‘older’ ages. The hypothesis also suggested the opposite for republicans, however the same trend occurs as democrats (although this does occur at a lower rate for all ages). The Stealth graphs was faceted in the final graphs to get a visualisation of how trust patterns may differ upon diverse opinions (such as abortion and gun rights) and was successful in finding a difference between both parties.

References

  • Christensen, T. and Lægreid, P., 2005. Trust in government: The relative importance of service satisfaction, political factors, and demography. Public performance & management review, 28(4), pp.487-511.
  • Dalton, R.J., 2005. The social transformation of trust in government. International review of sociology, 15(1), pp.133-154.
  • Freese, J. and Peterson, D., 2017. Replication in social science. Annual Review of Sociology, 43, pp.147-165.
  • HITLIN, P. and SHUTAVA, N., 2022. Trust in government.
  • Holt, K., Shehata, A., Strömbäck, J. and Ljungberg, E., 2013. Age and the effects of news media attention and social media use on political interest and participation: Do social media function as leveller?. European journal of communication, 28(1), pp.19-34.
  • Klein, E., & Robison, J. (2020). Like, post, and distrust? How social media use affects trust in government. Political Communication, 37(1), 46-64.
  • Prior, M., 2010. You’ve either got it or you don’t? The stability of political interest over the life cycle. The Journal of Politics, 72(3), pp.747-766.

Appendix

Appendix 1. My enviroment (full information)

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

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] skimr_2.1.5     withr_2.5.0     prettydoc_0.4.1 sjPlot_2.8.14  
 [5] renv_0.17.3     plotly_4.10.1   ggpubr_0.6.0    cowplot_1.1.1  
 [9] gridExtra_2.3   ggthemes_4.2.4  dplyr_1.1.2     ggplot2_3.4.2  
[13] ggeffects_1.2.2 haven_2.5.2     knitr_1.42      rmarkdown_2.21 

loaded via a namespace (and not attached):
 [1] nlme_3.1-160       insight_0.19.2     httr_1.4.6         repr_1.1.6        
 [5] tools_4.2.2        backports_1.4.1    bslib_0.4.2        utf8_1.2.3        
 [9] R6_2.5.1           sjlabelled_1.2.0   lazyeval_0.2.2     mgcv_1.8-41       
[13] colorspace_2.1-0   tidyselect_1.2.0   emmeans_1.8.6      compiler_4.2.2    
[17] performance_0.10.3 cli_3.6.1          labeling_0.4.2     bayestestR_0.13.1 
[21] sass_0.4.6         scales_1.2.1       mvtnorm_1.1-3      readr_2.1.4       
[25] stringr_1.5.0      digest_0.6.31      minqa_1.2.5        base64enc_0.1-3   
[29] pkgconfig_2.0.3    htmltools_0.5.5    lme4_1.1-33        highr_0.10        
[33] fastmap_1.1.1      htmlwidgets_1.6.2  rlang_1.1.1        rstudioapi_0.14   
[37] farver_2.1.1       jquerylib_0.1.4    generics_0.1.3     jsonlite_1.8.4    
[41] crosstalk_1.2.0    car_3.1-2          magrittr_2.0.3     parameters_0.21.1 
[45] Matrix_1.5-1       Rcpp_1.0.10        munsell_0.5.0      fansi_1.0.4       
[49] abind_1.4-5        lifecycle_1.0.3    stringi_1.7.12     yaml_2.3.7        
[53] carData_3.0-5      MASS_7.3-58.1      grid_4.2.2         sjmisc_2.8.9      
[57] forcats_1.0.0      lattice_0.20-45    splines_4.2.2      sjstats_0.18.2    
[61] hms_1.1.3          pillar_1.9.0       boot_1.3-28        estimability_1.4.1
[65] ggsignif_0.6.4     effectsize_0.8.3   codetools_0.2-18   glue_1.6.2        
[69] evaluate_0.21      data.table_1.14.8  modelr_0.1.11      vctrs_0.6.2       
[73] nloptr_2.0.3       tzdb_0.4.0         gtable_0.3.3       purrr_1.0.1       
[77] tidyr_1.3.0        datawizard_0.7.1   cachem_1.0.8       xfun_0.39         
[81] broom_1.0.4        rstatix_0.7.2      viridisLite_0.4.2  tibble_3.2.1      
[85] ellipsis_0.3.2    

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("rmarkdown")
library("knitr")
library("haven")
library("ggeffects")
library("ggplot2")
library("dplyr")
library("ggthemes")
library("gridExtra")
library("cowplot")
library("ggpubr")
library("plotly")
library("renv")
library("sjPlot")
library("prettydoc")
library("withr")
library("skimr")
# Versions of used packages
packages <- c("rmarkdown", "knitr", "haven", "ggeffects", "ggplot2", "dplyr", "ggthemes", "gridExtra", "cowplot", "ggpubr", "plotly", "renv", "sjPlot", "prettydoc", "withr", "skimr")
names(packages) <- packages
lapply(packages, packageVersion)
# What is my R version?
version[['version.string']]
anes_comb <- read_dta("C:/Users/44748/Downloads/anes_comb.dta")
head(anes_comb$trust_index)
anes_comb$party[anes_comb$pol_party01 > 0.504] <- "rep"
anes_comb$party[anes_comb$pol_party01 < 0.496] <- "demo"
anes_dem <- anes_comb %>% filter(party == "demo")
anes_rep <- anes_comb %>% filter(party == "rep")
skim(anes_comb, trust_index, age)
skim(anes_dem, trust_index, age)
skim(anes_rep, trust_index, age)
# graph 1
graph1 <- lm(data = anes_comb, trust_index ~ as.numeric(pol_party01) +
               as.numeric(socialmed01) + mediause01 +
               news_cons01 + worse_off01 + pres_aprv + libcon01 + as.factor(gay_mar) +
               spend_index01 + social_trust01 + activity_trunc +
               as.factor(male) + educ01 + as.factor(race_cat_1) +
               s_issue + party + age + I(age^2))

# graph 2 (FINAL)
graph2 <- lm(data = anes_comb, trust_index ~ +
               mediause01 + news_cons01 + worse_off01 +
               pres_aprv +spend_index01 + social_trust01 +
               educ01 + s_issue + party + age + I(age^2))
# graph 1
graph1d <- lm(data = anes_dem, trust_index ~ as.numeric(pol_party01) +
               as.numeric(socialmed01) + mediause01 +
               news_cons01 + worse_off01 + pres_aprv + libcon01 + as.factor(gay_mar) +
               spend_index01 + social_trust01 + activity_trunc +
               as.factor(male) + educ01 + as.factor(race_cat_1) +
               s_issue + age + I(age^2))

# graph 2
graph2d <- lm(data = anes_dem, trust_index ~ +
                mediause01 +
                news_cons01 + worse_off01 + pres_aprv + as.factor(gay_mar) +
                spend_index01 + social_trust01 +
                educ01 + as.factor(race_cat_1) +
                s_issue + age + I(age^2))

# graph 3
graph3d <- lm(data = anes_dem, trust_index ~ +
                mediause01 +
                worse_off01 + pres_aprv +
                social_trust01 +
                educ01 + as.factor(race_cat_1) +
                s_issue + age + I(age^2))

# graph 4 (FINAL)
graph4d <- lm(data = anes_dem, trust_index ~ +
                 +worse_off01 + pres_aprv +
                social_trust01 +s_issue + age + I(age^2))


# graph 1
graph1r <- lm(data = anes_rep, trust_index ~ as.numeric(pol_party01) +
               as.numeric(socialmed01) + mediause01 +
               news_cons01 + worse_off01 + pres_aprv + libcon01 + as.factor(gay_mar) +
               spend_index01 + social_trust01 + activity_trunc +
               as.factor(male) + educ01 + as.factor(race_cat_1) +
               s_issue + age + I(age^2))

# graph 2
graph2r <- lm(data = anes_rep, trust_index ~ +
                mediause01 +
                news_cons01 + worse_off01 + pres_aprv + as.factor(gay_mar) +
                spend_index01 + social_trust01 +
                educ01 + as.factor(race_cat_1) +
                s_issue + age + I(age^2))

# graph 3
graph3r <- lm(data = anes_rep, trust_index ~ +
                news_cons01 + worse_off01 + pres_aprv+
                spend_index01 + social_trust01 +
                educ01 + as.factor(race_cat_1) +
                s_issue + age + I(age^2))

# graph 4 (FINAL)
graph4r <- lm(data = anes_rep, trust_index ~ +
                 + worse_off01 + pres_aprv+
                 + social_trust01 +
                 +s_issue + age + I(age^2))
combi <- anes_comb %>% 
     na.omit() %>% 
     ggplot()+
     aes(x = age, y = trust_index, colour = party)+
     stat_smooth(method = 'loess')+
  scale_color_manual(labels = c("Democratic", "Republican"),
                     values = c('Blue', 'Red'))+
  labs(title = "Distrust in government as people get older",
       x = "Age", y = "Trust in Government",
       caption = "DATA: OSF Home")+
  theme_solarized()
ggplotly(combi)
demt <- ggplot(data = graph4d, aes(x = age, y = trust_index))+
  stat_smooth(method = 'loess')+
  labs(title = "Distrust in governmnet as people get older",
       subtitle = "(Democratic)", x = "Age", y = "Trust in Government",
       caption = "DATA: OSF Home")+
  theme_solarized()+
  scale_color_manual(values = 'Blue')
ggplotly(demt)

rept <- ggplot(data = graph4r, aes(x = age, y = trust_index))+
  stat_smooth(method = 'loess', colour = "Red")+ 
  labs(title = "Distrust in governmnet as people get older",
       subtitle = "(Republican)", x = "Age", y = "Trust in Government",
       caption = "DATA: OSF Home")+
  theme_solarized()+ 
  scale_color_manual(values = c('Red')) 
ggplotly(rept)
tab_model(graph2,
          pred.labels = c("(Intercept)", "Media usage",
                          "News usage", "Worse off", "Approval",
                          "Spend Index", "Social trust",
                          "Education", "Stealth", "Party", "Age",
                          "Age^2"),
          dv.labels = c("Overall Distrust"))
tab_model(graph4d, graph4r, 
          pred.labels = c("Intercept", "Worse Off", "Approval",
          "Distrust", "Stealth", "Age", "Age^2"),
          dv.labels = c("Democratic", "Republican"),
          string.est = "Coeff",
          string.ci = "Conf. Int (95%)",
          string.p = "P-value")
predR <- ggpredict(graph4r, terms = c("age"))
predD <- ggpredict(graph4d, terms = c("age"))

controlR <- plot(predR)
controlD <- plot(predD)

DCON <- controlD + labs(x = "Age", y = "(Democratic)",
                title = "Democratic" +
  theme_pander()+
  xlim(20, 90))  

RCON <- controlR + labs(x = "", y = "(Republican)",
               title = "Republican" +
  theme_pander()+
  xlim(20, 90))
control <- grid.arrange(RCON, DCON)
annotate_figure(control,
                top = text_grob("Distrust in Government", size = 16, face = "bold"),
                bottom = text_grob("Data source: OFS Home",
                                   hjust = 1, x = 1, face = "italic", size = 10),
                left = text_grob("Distrust in Government", rot = 90, size = 16))
ggplot(data = graph2, aes(x = age, y = trust_index, colour = party))+
  stat_smooth(method = 'loess')+
  facet_wrap(~s_issue, dir = "h")+
  theme_igray()+   
  labs(x = "Age" , y = "Trust", 
       title = "Distrust in Government by age",
       subtitle = "STEALTH Campaign: 0 = low diverse opinion, 5 = highly diverse opinion",
       caption = "DATA: OSF Home")+
  scale_color_manual(labels = c("Democratic", "Republican"),
    values = c('Blue', 'Red'))
# Detailed information about my environment
sessionInfo()
LS0tDQp0aXRsZTogIlNNSTIwNSBSZXBsaWNhdGlvbiBQcm9qZWN0ICgyMDIzKSINCmF1dGhvcjogJzIwMDM4MjAyOScNCmRhdGU6ICIyOS8wNS8yMDIzIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRoZW1lOiB5ZXRpDQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDINCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IG5vDQogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICAgIGFsd2F5c19hbGxvd19odG1sOiB0cnVlDQogIEhUTUw6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICcyJw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnMicNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnMicNCi0tLQ0KDQpgYGB7ciBzdGFydCwgaW5jbHVkZT1GQUxTRX0NCiMgT3BlbmluZyBrZXkgbGlicmFyaWVzIGZpcnN0DQpsaWJyYXJ5KHJtYXJrZG93bikNCmxpYnJhcnkoa25pdHIpDQpgYGANCg0KPiBSZXBsaWNhdGlvbiBwcm9qZWN0IG9uIEdvdmVybm1lbnQgKGRpcyl0cnVzdCANCiANCg0KIyMjIyMgUnB1YnMgbGluazogaHR0cHM6Ly9ycHVicy5jb20vYTIwMDM4MjAyOS8xMDQ3OTUxDQojIyMjIyBHaXRIdWIgUmVwb3NpdG9yeTogaHR0cHM6Ly9naXRodWIuY29tLzIwMDM4MjAyOS9zbWkyMDUtYXNzZXNzbWVudC0yDQojIyMjIyBTdHVkeSBQcmVyZWdpc3RyYXRpb24gZm9ybTogaHR0cHM6Ly9ycHVicy5jb20vYTIwMDM4MjAyOS8xMDQ3NzAxDQogDQojIyMgSW5mb3JtYXRpb24gYWJvdXQgdGhpcyByZXBsaWNhdGlvbiBwcm9qZWN0DQoqIFJlcGxpY2F0aW9uIHByb2plY3QgYmFzZWQgb246DQogICsgW0tsZWluLCBFLiwgJiBSb2Jpc29uLCBKLiAoMjAyMCkuIExpa2UsIHBvc3QsIGFuZCBkaXN0cnVzdD8gSG93IHNvY2lhbCBtZWRpYSB1c2UgYWZmZWN0cyB0cnVzdCBpbiBnb3Zlcm5tZW50LiBQb2xpdGljYWwgQ29tbXVuaWNhdGlvbiwgMzcoMSksIDQ2LTY0Ll0oaHR0cHM6Ly93d3cudGFuZGZvbmxpbmUuY29tL2RvaS9mdWxsLzEwLjEwODAvMTA1ODQ2MDkuMjAxOS4xNjYxODkxKQ0KKiBSZXBsaWNhdGlvbiBtZXRob2Q6DQogICsgVXNlZCBtYXRlcmlhbHMgb2J0YWluZWQgZnJvbSBhdXRob3JzDQoNCioqKg0KDQojIyBXb3Jrc3BhY2Ugc2V0dXAgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KIyMjIFlBTUwgc2V0dGluZ3MNCg0KIG91dHB1dDogPC9icj4NCiAgJm5ic3A7IGh0bWxfZG9jdW1lbnQ6IDwvYnI+DQogICAgJm5ic3A7Jm5ic3A7IGNvZGVfZG93bmxvYWQ6IHRydWUgPC9icj4NCiAgICAmbmJzcDsmbmJzcDsmbmJzcDsgdG9jOiB0cnVlIDwvYnI+DQogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IHRvY19kZXB0aDogMiA8L2JyPg0KICAgICZuYnNwOyZuYnNwOyZuYnNwOyB0b2NfZmxvYXQ6IDwvYnI+DQogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY29sbGFwc2VkOiBmYWxzZSA8L2JyPg0KICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNtb290aF9zY3JvbGw6IHRydWUgPC9icj4NCg0KIyMjIEdsb2JhbCBzZXR0aW5ncyBvZiBSIGNodW5rcw0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1UUlVFfQ0KIyBHbG9iYWwgb3B0aW9ucw0Kb3B0c19jaHVuayRzZXQoZWNobz1UUlVFLA0KCSAgICAgICAgICAgICBjYWNoZT1UUlVFLA0KICAgICAgICAgICAgICAgY29tbWVudD1OQSwNCiAgICAgICAgICAgICAgIG1lc3NhZ2U9RkFMU0UsDQogICAgICAgICAgICAgICB3YXJuaW5nPUZBTFNFKQ0KYGBgDQoNCiMjIyBMaWJyYXJpZXMgDQoNCmBgYHtyIGxpYnJhcmllcywgaW5jbHVkZT1UUlVFfQ0KIyBBbGwgdXNlZCBsaWJyYXJpZXMNCmxpYnJhcnkoInJtYXJrZG93biIpDQpsaWJyYXJ5KCJrbml0ciIpDQpsaWJyYXJ5KCJoYXZlbiIpDQpsaWJyYXJ5KCJnZ2VmZmVjdHMiKQ0KbGlicmFyeSgiZ2dwbG90MiIpDQpsaWJyYXJ5KCJkcGx5ciIpDQpsaWJyYXJ5KCJnZ3RoZW1lcyIpDQpsaWJyYXJ5KCJncmlkRXh0cmEiKQ0KbGlicmFyeSgiY293cGxvdCIpDQpsaWJyYXJ5KCJnZ3B1YnIiKQ0KbGlicmFyeSgicGxvdGx5IikNCmxpYnJhcnkoInJlbnYiKQ0KbGlicmFyeSgic2pQbG90IikNCmxpYnJhcnkoInByZXR0eWRvYyIpDQpsaWJyYXJ5KCJ3aXRociIpDQpsaWJyYXJ5KCJza2ltciIpDQpgYGANCg0KIyMjIFZlcnNpb25zIG9mIHVzZWQgcGFja2FnZXMNCg0KYGBge3IgdmVyc2lvbnMsIGVjaG89RkFMU0V9DQojIFZlcnNpb25zIG9mIHVzZWQgcGFja2FnZXMNCnBhY2thZ2VzIDwtIGMoInJtYXJrZG93biIsICJrbml0ciIsICJoYXZlbiIsICJnZ2VmZmVjdHMiLCAiZ2dwbG90MiIsICJkcGx5ciIsICJnZ3RoZW1lcyIsICJncmlkRXh0cmEiLCAiY293cGxvdCIsICJnZ3B1YnIiLCAicGxvdGx5IiwgInJlbnYiLCAic2pQbG90IiwgInByZXR0eWRvYyIsICJ3aXRociIsICJza2ltciIpDQpuYW1lcyhwYWNrYWdlcykgPC0gcGFja2FnZXMNCmxhcHBseShwYWNrYWdlcywgcGFja2FnZVZlcnNpb24pDQpgYGANCg0KIyMjIE15IGVudmlyb21lbnQNCg0KYGBge3IgbXlSLCBlY2hvPUZBTFNFfQ0KIyBXaGF0IGlzIG15IFIgdmVyc2lvbj8NCnZlcnNpb25bWyd2ZXJzaW9uLnN0cmluZyddXQ0KYGBgDQoNCiMjDQoNCg0KKioqDQogIA0KIyMgMS4gSW50cm9kdWN0aW9uDQoNCg0KVGhpcyByZXNlYXJjaCBwcm9qZWN0IGlzIGFuIGV4dGVuc2lvbiB0byBLbGVpbiBhbmQgUm9iaW5zb27igJlzIHBhcGVyICgyMDE5KSB3aGljaCBleGFtaW5lcyBob3cgc29jaWFsIG1lZGlhIGNhbiAoZGUpcG9sYXJpemUgc29jaWV0eSBhbmQgaW5mbHVlbmNlIG91ciB0cnVzdCBvbiB0aGUgZ292ZXJubWVudC4gV2l0aGluIG15IHByb2plY3QgdGhlcmUgaXMgYSBzaGlmdCB0byBmb2N1cyBvbiBhZ2UgaGF2aW5nIGFuIGltcGFjdCBvbiB0cnVzdCBhbmQgY29tcGFyaW5nIGRlbW9jcmF0aWMgYW5kIHJlcHVibGljYW4gdm90ZXJzLiBXaGlsc3QgS2xlaW4gYW5kIFJvYmluc29uIGFyZSBwYXJ0bHkgZWZmZWN0aXZlIGluIGNhcHR1cmluZyBob3cgKGRpcyl0cnVzdCB2YXJpZXMsIEhvbHQgZXQgYWwuICgyMDEzKSB3b3VsZCBhZHZvY2F0ZSBmb3IgYSBmb2N1cyBvbiBhZ2UsIGZpbmRpbmcgc29jaWFsIG1lZGlhIGFuZCBwb2xpdGljYWwgaW50ZXJlc3QgYXJlIGhlYXZpbHkgaW1wYWN0ZWQgYnkgdGhpcy4gVGhyb3VnaCB0aGVpciBzdHVkeSwgSG9sdCBldCBhbC4gZmluZHMgdGhhdCBzb2NpYWwgbWVkaWEgdXNhZ2Ugd2lsbCB2YXJ5IGFjY29yZGluZyB0byBhZ2Ugd2hpY2ggaW5kaWNhdGVzIGNoYW5nZXMgaW4gcG9saXRpY2FsIGludGVyZXN0IGFuZCB0cnVzdC4gVGhlcmUgaXMgYW4gYWNrbm93bGVkZ2VtZW50IHRoYXQgc29jaWFsIG1lZGlhIHB1cnBvc2VzIHdpbGwgdmFyeSBiZXR3ZWVuIGFnZSwgaXQgY2FuIGJlIGVxdWFsbHkgaW1wYWN0ZnVsIGFuZCBpbmZsdWVuY2UgcG9saXRpY2FsIHZpZXdzLiBUaGUgZGF0YSBjb21lcyBmcm9tIGEgc2ltaWxhciB2YXJpYXRpb24gdG8gdGhlIEFORVMsIGEgU3dlZGlzaCBzdHVkeSBhbmQgdGhyb3VnaCBhbiBPTFMgcmVncmVzc2lvbiBtb2RlbCBmb3VuZCB5b3VuZ2VyIHBlb3BsZSBzaGFyaW5nIGxlc3MgaW50ZXJlc3QgaW4gcG9saXRpY3MgdGhhbiBvbGRlciBwZW9wbGUuIEFkZGl0aW9uYWxseSwgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCByZXN1bHRzIHN1Z2dlc3Qgc29jaWFsIG1lZGlhIGludGVyZXN0IGNhbiBpbXBhY3QgYWxsIGFnZSBncm91cHMuIEkgdGhlcmVmb3JlIGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFuYWx5c2UgdGhlIGltcGFjdCBvZiBhZ2UgKHRha2luZyBpdCBhcyBhIHNlcGFyYXRlIHZhcmlhYmxlIHRvIGFuYWx5c2UpIHRvIHVuZGVyc3RhbmQgdHJ1c3QgZGlmZmVyZW5jZXMgdG93YXJkcyB0cnVzdCBvZiB0aGUgZ292ZXJubWVudC4NCg0KSGF2aW5nIGFuYWx5c2VkIGFjYWRlbWljIHJlc2VhcmNoIHN1cnJvdW5kaW5nIGFnZSBhbmQgZ292ZXJubWVudGFsIHRydXN0LCBhZ2UgaXMgZm91bmQgdG8gYmUgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGVmZmVjdC4gUHJpb3IgKDIwMTApIG1lbnRpb25zIHRoZSBlYXNlIG9mIGFjY2VzcyB0byBwb2xpdGljYWwgdG9waWNzIHRocm91Z2ggc29jaWFsIG1lZGlhLCBmaW5kaW5nIGhvdyBwb2xpdGljYWwgaW50ZXJlc3QgZm9yIG9uZSBpbmRpdmlkdWFsIGlzIHVubGlrZWx5IHRvIGNoYW5nZSBkcmFzdGljYWxseSBidXQgd2l0aCBzb2NpYWwgbWVkaWEsIHBlb3BsZSBjYW4gaW52ZXN0IGEgZ3JlYXRlciBpbnRlcmVzdCBpbiBwb2xpdGljcy4gRnVydGhlcm1vcmUsIGEgcGFwZXIgY29uZHVjdGVkIGJ5IEhpdGxpbiBhbmQgU2h1dGF2YSAoMjAyMikgZm9jdXMgb24gZGVtb2dyYXBoaWMgZmFjdG9ycyBpbmZsdWVuY2luZyBkaXN0cnVzdCBpbiB0aGUgZ292ZXJubWVudCBhbmQgcGFydGljdWxhcmx5IG1lbnRpb24gaG93IGltcGFjdGZ1bCBhZ2UgY2FuIGhhdmU6IG1pbm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhvc2Ugb3ZlciBzaXh0eS1maXZlIGFuZCBwZW9wbGUgYWdlZCAxOC0zNCBmb3IgdHJ1c3QgaW4gZ292ZXJubWVudCBob3dldmVyLCB0aG9zZSBtaWRkbGUgYWdlZCBoYWQgYSBmYXIgZ3JlYXRlciBpbnRlcmVzdC4gRnVydGhlcm1vcmUsIENocmlzdGVuc2VuIGFuZCBMw6ZncmVpZCBpbiAoMjAwNSkgZm91bmQgb2xkZXIgcGVvcGxlIHRlbmQgdG8gaGF2ZSBhIGdyZWF0ZXIgdHJ1c3QgaW4gdGhlIGdvdmVybm1lbnQgYnV0IGFsc28gbm90ZXMgdGhlIHNpZ25pZmljYW5jZSBvZiBpbnN0aXR1dGlvbnMgaGF2aW5nIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbXBhY3Qgb24gdHJ1c3QuIFdoaWxzdCB0aGVzZSBwYXBlcnMgYWxsIGZpbmQgYWdlIHRvIGhhdmUgYW4gaW1wYWN0IHRvd2FyZHMgdHJ1c3QgdGhleSBhbGwgY29uc2lzdCBvZiBhbHRlcm5hdGl2ZSB2aWV3cywgdGhlcmVmb3JlIHNob3VsZCBhbmFseXNlZCB0byBhIGdyZWF0ZXIgY29udGV4dC4NCkFsdGVybmF0aXZlbHksIERhbHRvbiBhc3Nlc3MgdGhlIEFORVMsIHRvIGNvdmVyIHBvbGl0aWNhbCBpbnRlcmVzdCBidXQgZm9jdXNlcyBvbiBob3cgdmlld3MgZGlmZmVyIG92ZXIgZGVjYWRlcy4gVGhpcyBnaXZlcyBhbiBhbHRlcm5hdGl2ZSBwZXJzcGVjdGl2ZSwgcmF0aGVyIHRoYW4gYW5hbHlzaW5nIGFnZSBEYWx0b24gY29uY2VudHJhdGVzIHRoZSBmb2N1cyB0aHJvdWdoIGEgbG9uZ2l0dWRpbmFsIGFwcHJvYWNoIGZyb20gMTk1MiB0byAyMDAwIGdhdGhlcmluZyBvcGluaW9ucyBmcm9tIG92ZXIgdHdlbHZlIGVsZWN0aW9ucy4gVGhlIHN0dWR5IGluY2x1ZGVkIGluZm9ybWF0aW9uIHN1Y2ggYXMgMTk4MCBiZWluZyB0aGUgbG93ZXN0IHBvaW50IChkdXJpbmcgdGhlIFJlYWdhbiBhZG1pbmlzdHJhdGlvbikgYW5kIHRoZSAxOTYw4oCZcyBjb25zaXN0ZWQgb2YgdGhlIGVyYSB3aXRoIG1vc3QgdHJ1c3QuIFRoZXJlIGlzIGFuIG92ZXJhbGwgZG93bndhcmRzIHRyZW5kIG92ZXIgdGhlc2UgeWVhcnMgYW5kIERhbHRvbiBkb2VzIHJlZmxlY3QgdGhlIGltcGFjdCBvZiBzb2NpYWwgbWVkaWEgYW5kIGEgcmVhc29uaW5nIGJlaGluZCBhIGRlY3JlYXNlIGluIHBvbGl0aWNhbCB0cnVzdC4NCg0KSW4gdGhlIHByZXJlZ2lzdHJhdGlvbiBmb3JtIGl0IHdhcyBjbGFyaWZpZWQgaG93IGVxdWl2YWxlbnQgcmVzdWx0cyB3ZXJlIGV4cGVjdGVkIHRvIEtsZWluIGFuZCBSb2JpbnNvbiAoMjAxOSkgYnV0IHdpdGggYWdlIGJlaW5nIHRoZSBtYWluIHNoaWZ0IG9mIGZvY3VzLCBJIGV4cGVjdGVkIHRoYXQgZGlzdHJ1c3QgaW4gZ292ZXJubWVudCBmb3IgZGVtb2NyYXRzIHdpbGwgaW5jcmVhc2Ugd2l0aCBhZ2Ugd2hlcmVhcyBhIGRlY3JlYXNlIGZvciByZXB1YmxpY2Fucy4gKFRoaXMgcHJlZGljdGlvbiB3YXMgc2luY2UgYSBkZW1vY3JhdCBvY2N1cHlpbmcgdGhlIFdoaXRlIEhvdXNlIGluIGJvdGggeWVhcnMgdGhlIHN0dWR5IHdhcyBjb25kdWN0ZWQpLiBUaGUgdHlwZSBvZiByZXBsaWNhdGlvbiB3b3VsZCBiZSBkZXNjcmliZWQgYXMgInRlc3RzIG9mIHJvYnVzdG5lc3MiIChGcmVlc2UgYW5kIFBlcnRlcnNvbiwgMjAxNykgd2hlcmUgdGhlIHNhbWUgZGF0YSB3YXMgYW5hbHlzZWQgaG93ZXZlciwgYSBzbGlnaHQgdmFyaWF0aW9uIGluIHdoYXQgd2FzIGJlaW5nIHJlc2VhcmNoZWQuICAgDQoNCioqKg0KDQojIyAyLiBEYXRhIGFuZCBtZXRob2RzDQoNCj4gMi4xLiBEYXRhDQoNCg0KVGhlIGRhdGEgaXMgYW5hbHlzZWQgZnJvbSB0aGUgQW1lcmljYW4gTmF0aW9uYWwgRWxlY3Rpb24gU3R1ZGllcyAoQU5FUykgd2hpY2ggaXMgaWRlbnRpY2FsIHRvIHRoZSBvcmlnaW5hbCBwYXBlciBhbmQgY2FuIGJlIGZvdW5kIG9uIHRoZSBPRlMgSG9tZSB3ZWJzaXRlLiBUaGUg4oCYYW5lc19jb21iLmR0YeKAmSB2YXJpYWJsZSB3YXMgY2hvc2VuIHNpbmNlIGFsbCByZXF1aXJlZCB2YXJpYWJsZXMgd2VyZSBhY2Nlc3NpYmxlLg0KDQojIyMjIERvd25sb2FkaW5nIGRhdGFzZXQNCmBgYHtyfQ0KYW5lc19jb21iIDwtIHJlYWRfZHRhKCJDOi9Vc2Vycy80NDc0OC9Eb3dubG9hZHMvYW5lc19jb21iLmR0YSIpDQpgYGANCg0KVGhlIGRhdGFzZXQgY29udGFpbmVkIDEwLDE4NCBvYnNlcnZhdGlvbnMgd2l0aCBlaWdodHktbmluZSBzZXBhcmF0ZSB2YXJpYWJsZXMgYW5kIGdhdGhlcmVkIGRhdGEgaW4gMjAxMiBhbmQgMjAxNi4gVGhlIGRlcGVuZGVudCB2YXJpYWJsZSBhbmFseXNlZCBpcyB0aGUg4oCYVHJ1c3QgSW5kZXjigJkgd2hpY2ggY29uc2lzdHMgb2YgZm91ciBkaWZmZXJlbnQgcXVlc3Rpb25zIHJlZ2FyZGluZyB0cnVzdCBvZiB0aGUgZ292ZXJubWVudCB0aGVuIHNjYWxlZCAwLTEsIGEgaGlnaGVyIHJlc3VsdCBtZWFuaW5nIGdyZWF0ZXIgZGlzdHJ1c3QgaW4gZ292ZXJubWVudCBhbmQgbG93ZXIgbWVhbmluZyBncmVhdGVyIHRydXN0IGluIGdvdmVybm1lbnQuIA0KDQojIyMjIFRydXN0IGluZGV4IGV4YW1wbGVzIA0KYGBge3IgZWNobz1GQUxTRX0NCmhlYWQoYW5lc19jb21iJHRydXN0X2luZGV4KQ0KYGBgDQoNClRoZSBwYXBlciBoYWQgcmVzdWx0cyByZWdhcmRpbmcg4oCYcGFydHkgYXR0aXR1ZGVz4oCZIHNpbWlsYXJseSByYW5rZWQgMC0xIHdpdGggYSBsb3cgc2NvcmUgYXNzb2NpYXRlZCB3aXRoIGRlbW9jcmF0aWMgYW5kIGhpZ2ggd2l0aCBhIHJlcHVibGljYW4gcHJlZmVyZW5jZS4gVG8gdW5kZXJzdGFuZCB3aGljaCBwb2xpdGljYWwgcGFydHkgdGhlIHN1YmplY3RzIGZhdm91cmVkLCBhIOKAmFBhcnR54oCZIHZhcmlhYmxlIHdhcyBmb3JtZWQgd2hpY2ggc2VwYXJhdGVkIHRoZSB0d28gaW50byDigJxkZW1v4oCdIGFuZCDigJxyZXDigJ0gZmF2b3VyZWQgdm90ZXJzIChhbnl0aGluZyBncmVhdGVyIHRoYW4gMC41IHdhcyBjb2RlZCBhcyDigJhyZXDigJkgYW5kIGxlc3MgdGhhbiBhcyDigJhkZW1v4oCZKS4gDQoNCiMjIyMgU2VwYXJhdGluZyBvdXQgdGhlIHR3byBwYXJ0aWVzIA0KYGBge3J9DQphbmVzX2NvbWIkcGFydHlbYW5lc19jb21iJHBvbF9wYXJ0eTAxID4gMC41MDRdIDwtICJyZXAiDQphbmVzX2NvbWIkcGFydHlbYW5lc19jb21iJHBvbF9wYXJ0eTAxIDwgMC40OTZdIDwtICJkZW1vIg0KYGBgDQoNCg0KRnVydGhlcm1vcmUsIHRvIHVuZGVyc3RhbmQgcGFydHkgZGlmZmVyZW5jZXMsIHR3byBhZGRpdGlvbmFsIGRhdGFzZXRzIGluY2x1ZGluZyBwYXJ0eSBwcmVmZXJlbmNlIHdhcyBjcmVhdGVkLiBGcm9tIHRoZXJlIHR3byBhbHRlcm5hdGl2ZSByZWdyZXNzaW9uIG1vZGVscyBjb3VsZCBiZSBjcmVhdGVkIHRvIHVuZGVyc3RhbmQgZGlmZmVyZW5jZXMuDQoNCiMjIyMgQ3JlYXRpbmcgdHdvIGRpZmZlcmVudCBkYXRhc2V0cyBiYXNlZCBvbiBwYXJ0eQ0KYGBge3J9DQphbmVzX2RlbSA8LSBhbmVzX2NvbWIgJT4lIGZpbHRlcihwYXJ0eSA9PSAiZGVtbyIpDQphbmVzX3JlcCA8LSBhbmVzX2NvbWIgJT4lIGZpbHRlcihwYXJ0eSA9PSAicmVwIikNCmBgYA0KDQoNCk90aGVyIHRoYW4gdGhpcywgdGhlcmUgd2VyZSBubyBvdGhlciB2YXJpYWJsZSBjaGFuZ2VzLiBGb3IgdGhvc2UgKDQgcmVzcG9uZGVudHMpIHdpdGhpbiB0aGUgbWlkcG9pbnQgKDAuNSkgd2l0aCBubyBwYXJ0eSBwcmVmZXJlbmNlIGJlaW5nIGlnbm9yZWQuDQpSYXRoZXIgdGhhbiB1c2luZyB0aGUgd2hvbGUgZGF0YXNldCBhcyBvbmUsIHRoZSB0d28gcG9saXRpY2FsIHBhcnRpZXPigJkgZGF0YXNldHMgd2VyZSB1c2VkIHRvIHJlcGxpY2F0ZSDigJhGaWd1cmUgMeKAmSB3aXRoIGFsbCBvcmlnaW5hbCB2YXJpYWJsZXMgaW5jbHVkZWQgd2l0aCB0aGUgYWRkaXRpb24gb2YgYWdlICh0YWtlbiBhcyBhIHNlcGFyYXRlIHZhcmlhYmxlKSBhbmQgYWdlIHNxdWFyZWQgKGFnZV4yKS4gT3RoZXIgdmFyaWFibGVzIGluIHRoaXMgcmVzZWFyY2ggaW5jbHVkZSBzb2NpYWwgbWVkaWEgdXNlOyBwcmVzaWRlbnRpYWwgYXBwcm92YWw7IHNvY2lhbCB0cnVzdDsgZ2VuZGVyOyByYWNlIGFuZCBpbmNvbWUuIFNURUFMVEggd2FzIGFub3RoZXIgaW1wb3J0YW50IHZhcmlhYmxlIGluIHVuZGVyc3RhbmRpbmcgZGl2ZXJzZSBvcGluaW9ucyBkaWZmZXJpbmcgd2l0aCBhZ2UgYW5kIGJldHdlZW4gZGVtb2NyYXRzIGFuZCByZXB1YmxpY2Fucy4NCg0KDQojIyMgQnJpZWYgc3VtbWFyeSBzdGF0aXN0aWNzIGluY2x1ZGluZyB0cnVzdCBhbmQgYWdlIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCiMjIyMgT3ZlcmFsbA0KYGBge3IgZWNobz1GQUxTRX0NCnNraW0oYW5lc19jb21iLCB0cnVzdF9pbmRleCwgYWdlKQ0KYGBgDQoNCiMjIyMgRGVtb2NyYXRpYw0KYGBge3IgZWNobz1GQUxTRX0NCnNraW0oYW5lc19kZW0sIHRydXN0X2luZGV4LCBhZ2UpDQpgYGANCg0KIyMjIyBSZXB1YmxpY2FuDQpgYGB7ciBlY2hvPUZBTFNFfQ0Kc2tpbShhbmVzX3JlcCwgdHJ1c3RfaW5kZXgsIGFnZSkNCmBgYA0KDQojIyMNCg0KPiAyLjIuIE1ldGhvZHMNCg0KSW4gdGhlIHBhcGVyIGxpbmVhciByZWdyZXNzaW9uIHdhcyBjb25kdWN0ZWQgdG8gdW5kZXJzdGFuZCBnb3Zlcm5tZW50IHRydXN0IGFuZCBwYXJ0eSBhdHRpdHVkZXMsIHRoaXMgd2FzIHRoZSBzYW1lIG1ldGhvZCB1c2VkIGluIHRoaXMgcmVzZWFyY2guIFRoZSBtZXRob2QgZnJvbSB0aGlzIHJlc2VhcmNoIHdhcyBzaW1pbGFyLCB0YWtpbmcgYWxsIGlkZW50aWNhbCB2YXJpYWJsZXMgYnV0IGFsc28gaW5jbHVkaW5nIGFnZSBhcyBhIGZhY3Rvci4gRnVydGhlcm1vcmUsIHRoaXMgcmVzZWFyY2ggYWxzbyBpbmNsdWRlZCB0d28gc2VwYXJhdGUgZGF0YXNldHMgcmVmbGVjdGluZyB0aGVpciBwYXJ0eSBwcmVmZXJlbmNlIHRvIHVuZGVyc3RhbmQgZGlmZmVyZW5jZXMuIFNvLCBhIHRvdGFsIG9mIHRocmVlIHN0YXRpc3RpY2FsIG1vZGVscyBhcmUgcHJlc2VudGVkLCBzaG93aW5nIGFuIG92ZXJhbGwgdHJlbmQgYW5kIHR3byByZXByZXNlbnRpbmcgZGlmZmVyZW5jZXMgYmV0d2VlbiBlYWNoIHBvbGl0aWNhbCBwYXJ0eS4NCg0KIyMjIFJlZ3Jlc3Npb24gQ29kZXMgKDMpIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCiMjIyMgT3ZlcmFsbA0KYGBge3J9DQojIGdyYXBoIDENCmdyYXBoMSA8LSBsbShkYXRhID0gYW5lc19jb21iLCB0cnVzdF9pbmRleCB+IGFzLm51bWVyaWMocG9sX3BhcnR5MDEpICsNCiAgICAgICAgICAgICAgIGFzLm51bWVyaWMoc29jaWFsbWVkMDEpICsgbWVkaWF1c2UwMSArDQogICAgICAgICAgICAgICBuZXdzX2NvbnMwMSArIHdvcnNlX29mZjAxICsgcHJlc19hcHJ2ICsgbGliY29uMDEgKyBhcy5mYWN0b3IoZ2F5X21hcikgKw0KICAgICAgICAgICAgICAgc3BlbmRfaW5kZXgwMSArIHNvY2lhbF90cnVzdDAxICsgYWN0aXZpdHlfdHJ1bmMgKw0KICAgICAgICAgICAgICAgYXMuZmFjdG9yKG1hbGUpICsgZWR1YzAxICsgYXMuZmFjdG9yKHJhY2VfY2F0XzEpICsNCiAgICAgICAgICAgICAgIHNfaXNzdWUgKyBwYXJ0eSArIGFnZSArIEkoYWdlXjIpKQ0KDQojIGdyYXBoIDIgKEZJTkFMKQ0KZ3JhcGgyIDwtIGxtKGRhdGEgPSBhbmVzX2NvbWIsIHRydXN0X2luZGV4IH4gKw0KICAgICAgICAgICAgICAgbWVkaWF1c2UwMSArIG5ld3NfY29uczAxICsgd29yc2Vfb2ZmMDEgKw0KICAgICAgICAgICAgICAgcHJlc19hcHJ2ICtzcGVuZF9pbmRleDAxICsgc29jaWFsX3RydXN0MDEgKw0KICAgICAgICAgICAgICAgZWR1YzAxICsgc19pc3N1ZSArIHBhcnR5ICsgYWdlICsgSShhZ2VeMikpDQpgYGANCg0KDQojIyMjIERlbW9jcmF0aWMNCmBgYHtyfQ0KIyBncmFwaCAxDQpncmFwaDFkIDwtIGxtKGRhdGEgPSBhbmVzX2RlbSwgdHJ1c3RfaW5kZXggfiBhcy5udW1lcmljKHBvbF9wYXJ0eTAxKSArDQogICAgICAgICAgICAgICBhcy5udW1lcmljKHNvY2lhbG1lZDAxKSArIG1lZGlhdXNlMDEgKw0KICAgICAgICAgICAgICAgbmV3c19jb25zMDEgKyB3b3JzZV9vZmYwMSArIHByZXNfYXBydiArIGxpYmNvbjAxICsgYXMuZmFjdG9yKGdheV9tYXIpICsNCiAgICAgICAgICAgICAgIHNwZW5kX2luZGV4MDEgKyBzb2NpYWxfdHJ1c3QwMSArIGFjdGl2aXR5X3RydW5jICsNCiAgICAgICAgICAgICAgIGFzLmZhY3RvcihtYWxlKSArIGVkdWMwMSArIGFzLmZhY3RvcihyYWNlX2NhdF8xKSArDQogICAgICAgICAgICAgICBzX2lzc3VlICsgYWdlICsgSShhZ2VeMikpDQoNCiMgZ3JhcGggMg0KZ3JhcGgyZCA8LSBsbShkYXRhID0gYW5lc19kZW0sIHRydXN0X2luZGV4IH4gKw0KICAgICAgICAgICAgICAgIG1lZGlhdXNlMDEgKw0KICAgICAgICAgICAgICAgIG5ld3NfY29uczAxICsgd29yc2Vfb2ZmMDEgKyBwcmVzX2FwcnYgKyBhcy5mYWN0b3IoZ2F5X21hcikgKw0KICAgICAgICAgICAgICAgIHNwZW5kX2luZGV4MDEgKyBzb2NpYWxfdHJ1c3QwMSArDQogICAgICAgICAgICAgICAgZWR1YzAxICsgYXMuZmFjdG9yKHJhY2VfY2F0XzEpICsNCiAgICAgICAgICAgICAgICBzX2lzc3VlICsgYWdlICsgSShhZ2VeMikpDQoNCiMgZ3JhcGggMw0KZ3JhcGgzZCA8LSBsbShkYXRhID0gYW5lc19kZW0sIHRydXN0X2luZGV4IH4gKw0KICAgICAgICAgICAgICAgIG1lZGlhdXNlMDEgKw0KICAgICAgICAgICAgICAgIHdvcnNlX29mZjAxICsgcHJlc19hcHJ2ICsNCiAgICAgICAgICAgICAgICBzb2NpYWxfdHJ1c3QwMSArDQogICAgICAgICAgICAgICAgZWR1YzAxICsgYXMuZmFjdG9yKHJhY2VfY2F0XzEpICsNCiAgICAgICAgICAgICAgICBzX2lzc3VlICsgYWdlICsgSShhZ2VeMikpDQoNCiMgZ3JhcGggNCAoRklOQUwpDQpncmFwaDRkIDwtIGxtKGRhdGEgPSBhbmVzX2RlbSwgdHJ1c3RfaW5kZXggfiArDQogICAgICAgICAgICAgICAgICt3b3JzZV9vZmYwMSArIHByZXNfYXBydiArDQogICAgICAgICAgICAgICAgc29jaWFsX3RydXN0MDEgK3NfaXNzdWUgKyBhZ2UgKyBJKGFnZV4yKSkNCg0KDQpgYGANCg0KIyMjIyBSZXB1YmxpY2FuDQpgYGB7cn0NCiMgZ3JhcGggMQ0KZ3JhcGgxciA8LSBsbShkYXRhID0gYW5lc19yZXAsIHRydXN0X2luZGV4IH4gYXMubnVtZXJpYyhwb2xfcGFydHkwMSkgKw0KICAgICAgICAgICAgICAgYXMubnVtZXJpYyhzb2NpYWxtZWQwMSkgKyBtZWRpYXVzZTAxICsNCiAgICAgICAgICAgICAgIG5ld3NfY29uczAxICsgd29yc2Vfb2ZmMDEgKyBwcmVzX2FwcnYgKyBsaWJjb24wMSArIGFzLmZhY3RvcihnYXlfbWFyKSArDQogICAgICAgICAgICAgICBzcGVuZF9pbmRleDAxICsgc29jaWFsX3RydXN0MDEgKyBhY3Rpdml0eV90cnVuYyArDQogICAgICAgICAgICAgICBhcy5mYWN0b3IobWFsZSkgKyBlZHVjMDEgKyBhcy5mYWN0b3IocmFjZV9jYXRfMSkgKw0KICAgICAgICAgICAgICAgc19pc3N1ZSArIGFnZSArIEkoYWdlXjIpKQ0KDQojIGdyYXBoIDINCmdyYXBoMnIgPC0gbG0oZGF0YSA9IGFuZXNfcmVwLCB0cnVzdF9pbmRleCB+ICsNCiAgICAgICAgICAgICAgICBtZWRpYXVzZTAxICsNCiAgICAgICAgICAgICAgICBuZXdzX2NvbnMwMSArIHdvcnNlX29mZjAxICsgcHJlc19hcHJ2ICsgYXMuZmFjdG9yKGdheV9tYXIpICsNCiAgICAgICAgICAgICAgICBzcGVuZF9pbmRleDAxICsgc29jaWFsX3RydXN0MDEgKw0KICAgICAgICAgICAgICAgIGVkdWMwMSArIGFzLmZhY3RvcihyYWNlX2NhdF8xKSArDQogICAgICAgICAgICAgICAgc19pc3N1ZSArIGFnZSArIEkoYWdlXjIpKQ0KDQojIGdyYXBoIDMNCmdyYXBoM3IgPC0gbG0oZGF0YSA9IGFuZXNfcmVwLCB0cnVzdF9pbmRleCB+ICsNCiAgICAgICAgICAgICAgICBuZXdzX2NvbnMwMSArIHdvcnNlX29mZjAxICsgcHJlc19hcHJ2Kw0KICAgICAgICAgICAgICAgIHNwZW5kX2luZGV4MDEgKyBzb2NpYWxfdHJ1c3QwMSArDQogICAgICAgICAgICAgICAgZWR1YzAxICsgYXMuZmFjdG9yKHJhY2VfY2F0XzEpICsNCiAgICAgICAgICAgICAgICBzX2lzc3VlICsgYWdlICsgSShhZ2VeMikpDQoNCiMgZ3JhcGggNCAoRklOQUwpDQpncmFwaDRyIDwtIGxtKGRhdGEgPSBhbmVzX3JlcCwgdHJ1c3RfaW5kZXggfiArDQogICAgICAgICAgICAgICAgICsgd29yc2Vfb2ZmMDEgKyBwcmVzX2FwcnYrDQogICAgICAgICAgICAgICAgICsgc29jaWFsX3RydXN0MDEgKw0KICAgICAgICAgICAgICAgICArc19pc3N1ZSArIGFnZSArIEkoYWdlXjIpKQ0KYGBgDQoNCiMjIw0KDQpXaGVuIHJ1bm5pbmcgdGhlIHJlZ3Jlc3Npb24gY29kZSwgYm90aCBjb2RlcyBiZWdhbiB3aXRoIGFsbCBpZGVudGljYWwgdmFyaWFibGVzIGluY2x1ZGVkIGluIHRoZSBvcmlnaW5hbCBwYXBlciBhbG9uZyB3aXRoIGFnZSAodGFrZW4gYXMgaXRzIG93biB2YXJpYWJsZSkgYW5kIGFnZSBzcXVhcmVkLiBBZnRlciBhcHBseWluZyB0aGUg4oCYc3VtbWFyeeKAmSBmZWF0dXJlIGZvciBib3RoIG1vZGVzLCBvbmUtYnktb25lIHN0YXRpc3RpY2FsbHkgaW5zaWduaWZpY2FudCByZXN1bHRzIHdlcmUgcmVtb3ZlZCAocC12YWx1ZSA+IDAuMDUpIGZyb20gdGhlIHJlZ3Jlc3Npb24uIEZvciB0aGlzIHJlc2VhcmNoLCBJIGFpbWVkIHRvIGhhdmUgdGhlIGlkZW50aWNhbCB2YXJpYWJsZXMgZm9yIHRoZSDigJhkZW1v4oCZIGFuZCDigJhyZXDigJkgcmVncmVzc2lvbiBtb2RlbCBzbyBib3RoIG1vZGVscyB3b3VsZCBiZSBlYXNpbHkgY29tcGFyYWJsZSB3aXRoIG5vIGRpZmZlcmluZyB2YXJpYWJsZXMuIE9uY2UgdGhlIHRocmVlIG1vZGVscyBjb250YWluIHN0YXRpY2FsbHkgc2lnbmlmaWNhbnQgcmVzdWx0cywgcHJlZGljdGlvbiBtb2RlbHMgY2FuIGJlIGZvcm1lZCByZXByZXNlbnRpbmcgY2hhbmdlcyBpbiBwb2xpdGljYWwgdHJ1c3Qgd2hpbHN0IGNvbnRyb2xsaW5nIGZvciBhZ2UsIGhlbmNlIGFkZGluZyBhIHBvbHlub21pYWwgaW4gYWdlIHNxdWFyZWQuIFdpdGggdGhlc2UgcHJlZGljdGlvbiBtb2RlcywgY29tcGFyaXNvbnMgYmV0d2VlbiB0aGUgcGFydHkgY2FuIGJlIG1hZGUgdG8gdW5kZXJzdGFuZCBob3cgKGRpcyl0cnVzdCB2YXJpZXMgb3ZlciBhZ2UuDQpJbiBhZGRpdGlvbiwgbGluZWFyIHJlZ3Jlc3Npb24gZ3JhcGhpY3MgYXJlIGRpc3BsYXllZCB3aXRoIHRydXN0IGFuZCBhZ2Ugd2l0aG91dCBjb250cm9sbGluZyBmb3Igb3RoZXIgdmFyaWFibGVzIGFuZCBhcmUgaW5jbHVkZWQgdG8gcHJvZHVjZSBhIHNpbXBsZSB1bmRlcnN0YW5kaW5nIGluIGNvbXBhcmlzb24gYmV0d2VlbiBwb2xpdGljYWwgcGFydGllcyBhbmQgdGhlIChkaXMpdHJ1c3QuIEdlb21fc21vb3RoIGlzIHVzZWQgdG8gdmlzdWFsaXNlIHRoZSBjb25maWRlbmNlIGludGVydmFscyB3aGlsc3QgcHJlZGljdGluZyBmb3Ig4oCYYWdl4oCZLg0KDQoqKioNCg0KIyMgMy4gUmVzdWx0cyANCg0KDQojIyMgVHJ1c3QgYXMgcGVvcGxlIGdldCBvbGRlciB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQojIyMjIE92ZXJhbGwNCmBgYHtyfQ0KY29tYmkgPC0gYW5lc19jb21iICU+JSANCiAgICAgbmEub21pdCgpICU+JSANCiAgICAgZ2dwbG90KCkrDQogICAgIGFlcyh4ID0gYWdlLCB5ID0gdHJ1c3RfaW5kZXgsIGNvbG91ciA9IHBhcnR5KSsNCiAgICAgc3RhdF9zbW9vdGgobWV0aG9kID0gJ2xvZXNzJykrDQogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKCJEZW1vY3JhdGljIiwgIlJlcHVibGljYW4iKSwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0JsdWUnLCAnUmVkJykpKw0KICBsYWJzKHRpdGxlID0gIkRpc3RydXN0IGluIGdvdmVybm1lbnQgYXMgcGVvcGxlIGdldCBvbGRlciIsDQogICAgICAgeCA9ICJBZ2UiLCB5ID0gIlRydXN0IGluIEdvdmVybm1lbnQiLA0KICAgICAgIGNhcHRpb24gPSAiREFUQTogT1NGIEhvbWUiKSsNCiAgdGhlbWVfc29sYXJpemVkKCkNCmdncGxvdGx5KGNvbWJpKQ0KYGBgDQoNCiMjIyMgRGVtb2NyYXRpYyANCmBgYHtyfQ0KZGVtdCA8LSBnZ3Bsb3QoZGF0YSA9IGdyYXBoNGQsIGFlcyh4ID0gYWdlLCB5ID0gdHJ1c3RfaW5kZXgpKSsNCiAgc3RhdF9zbW9vdGgobWV0aG9kID0gJ2xvZXNzJykrDQogIGxhYnModGl0bGUgPSAiRGlzdHJ1c3QgaW4gZ292ZXJubW5ldCBhcyBwZW9wbGUgZ2V0IG9sZGVyIiwNCiAgICAgICBzdWJ0aXRsZSA9ICIoRGVtb2NyYXRpYykiLCB4ID0gIkFnZSIsIHkgPSAiVHJ1c3QgaW4gR292ZXJubWVudCIsDQogICAgICAgY2FwdGlvbiA9ICJEQVRBOiBPU0YgSG9tZSIpKw0KICB0aGVtZV9zb2xhcml6ZWQoKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9ICdCbHVlJykNCmdncGxvdGx5KGRlbXQpDQoNCmBgYA0KDQoNCiMjIyMgUmVwdWJsaWNhbg0KYGBge3J9DQpyZXB0IDwtIGdncGxvdChkYXRhID0gZ3JhcGg0ciwgYWVzKHggPSBhZ2UsIHkgPSB0cnVzdF9pbmRleCkpKw0KICBzdGF0X3Ntb290aChtZXRob2QgPSAnbG9lc3MnLCBjb2xvdXIgPSAiUmVkIikrIA0KICBsYWJzKHRpdGxlID0gIkRpc3RydXN0IGluIGdvdmVybm1uZXQgYXMgcGVvcGxlIGdldCBvbGRlciIsDQogICAgICAgc3VidGl0bGUgPSAiKFJlcHVibGljYW4pIiwgeCA9ICJBZ2UiLCB5ID0gIlRydXN0IGluIEdvdmVybm1lbnQiLA0KICAgICAgIGNhcHRpb24gPSAiREFUQTogT1NGIEhvbWUiKSsNCiAgdGhlbWVfc29sYXJpemVkKCkrIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygnUmVkJykpIA0KZ2dwbG90bHkocmVwdCkNCmBgYA0KDQoNClRoZSBmaXJzdCB0aHJlZSBzZXRzIG9mIGdyYXBoaWNzIHNob3cgcHJlZGljdGlvbnMgZm9yIHRoZSBsaW5lYXIgbW9kZWxzIChjb25maWRlbmNlIGxldmVsIGF0IDk1JSkgYW5kIHVzZWQgdG8gZW5oYW5jZSB0aGUgcmVhZGVycyBrbm93bGVkZ2UgcmVnYXJkaW5nIHRoZSBkaXN0cnVzdCAob2YgZ292LikgYW5kIGhvdyBpdCB2YXJpZXMgb3ZlciBhZ2UuIFRoZSDigJhvdmVyYWxs4oCZIGdyYXBoIHJlcHJlc2VudHMgdGhlIGRpZmZlcmVuY2VzIGluIGRpc3RydXN0IHdpdGggcGFydGllcywgd2hlcmUgcmVwdWJsaWNhbnMgb3ZlcmFsbCBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCB3aXRoIGRpc3RydXN0IGFuZCBhZ2UgaW5jcmVhc2UuIE9uIHRoZSBvdGhlciBoYW5kLCBkZW1vY3JhdGljIGRpZmZlcnMgd2l0aCBhIHNtYWxsIG5lZ2F0aXZlIGFzc29jaWF0aW9uLiBBcyBwZW9wbGUgZ2V0IG9sZGVyIHRoZSByYW5nZSBiZXR3ZWVuIHRoZSB0d28gZXhwYW5kcyBhbmQgYmlwb2xhciByZXN1bHRzIGFyb3VuZCB0aGUgYWdlcyBvZiA1NSBhcmUgZXZpZGVudCB3aXRoIHJlcHVibGljYW5zIGhhdmluZyBhbiBpbmNyZWFzZSBpbiBkaXN0cnVzdCBhbmQgZGVtb2NyYXRzIGhhdmluZyBhIGRlY3JlYXNlICh1bnRpbCB0aGUgdmVyeSBsYXRlciBhZ2VzKS4gIFRoZSBzaW5ndWxhciBwYXJ0eSBtb2RlbHMgaGF2ZSBhbHNvIGJlZW4gaW5jbHVkZWQgdG8gcHJvdmlkZSBhIOKAmXNpbXBsZXLigJkgbW9kZWwgdG8gdW5kZXJzdGFuZCBhbmQgaW50ZXJhY3Qgd2l0aC4NCg0KDQoNCg0KDQojIyMgT3ZlcmFsbCByZXN1bHRzDQpgYGB7cn0NCnRhYl9tb2RlbChncmFwaDIsDQogICAgICAgICAgcHJlZC5sYWJlbHMgPSBjKCIoSW50ZXJjZXB0KSIsICJNZWRpYSB1c2FnZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJOZXdzIHVzYWdlIiwgIldvcnNlIG9mZiIsICJBcHByb3ZhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJTcGVuZCBJbmRleCIsICJTb2NpYWwgdHJ1c3QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiRWR1Y2F0aW9uIiwgIlN0ZWFsdGgiLCAiUGFydHkiLCAiQWdlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkFnZV4yIiksDQogICAgICAgICAgZHYubGFiZWxzID0gYygiT3ZlcmFsbCBEaXN0cnVzdCIpKQ0KYGBgDQoNCg0KV2hlbiBjcmVhdGluZyB0aGUgcmVncmVzc2lvbiBtb2RlbCBvZiBvdmVyYWxsIGRpc3RydXN0LCB0aGUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCByZXN1bHRzIGFyZSBoaWdobGlnaHRlZCBpbiBib2xkIHVuZGVyIOKAmHDigJkuIE1lZGlhICgwLjAzKSBhbmQgbmV3cyAoMC4wMikgdXNhZ2UgYXJlIGJvdGggYXNzb2NpYXRlZCB3aXRoIHBvc2l0aXZlIGNvZWZmaWNpZW50IGVzdGltYXRlcyBpbiBkaXN0cnVzdCwgc3VnZ2VzdGluZyBib3RoIHRoZXNlIGZhY3RvcnMgaGF2ZSBhIHNpZ25pZmljYW5jZSBvbiBvdXIgaW50ZXJwcmV0YXRpb24gYXJvdW5kIGdvdmVybm1lbnQgYW5kIGV2ZW4gZGFpbHkgbGlmZSwgd2l0aCBtZWRpYSBoYXZpbmcgYSBzbGlnaHRseSBncmVhdGVyIGltcGFjdCB0aGFuIG5ld3MuIFRob3NlIHdobyBhZ3JlZSB3aXRoIGFwcHJvdmFsIG9mIHRoZSBwcmVzaWRlbnQgaGFzIHRoZSBncmVhdGVzdCBkZWNsaW5lIGluIGVzdGltYXRlcyAgICAgICAgKC0wLjE3KSwgbWFrZXMgcGVyZmVjdCBzZW5zZSBzaW5jZSB0aGV5IGFncmVlIHdpdGggdGhlIGN1cnJlbnQgcHJlc2lkZW50LiBUaG9zZSB3aG8gYmVsaWV2ZWQgdGhleSB3ZXJlIHdvcnNlIG9mZiB0aGVyZWZvcmUgc2F3IHRoZSBkaXJlY3Qgb3Bwb3NpdGUgd2l0aCBhIDAuMDYgaW5jcmVhc2UgaW4gZGlzdHJ1c3QuIFNwZW5kaW5nIGluZGV4ICAgICAgKC0wLjA0KSBhbmQgZWR1Y2F0aW9uICgtMC4wMykgYm90aCBhbHNvIHNhdyBuZWdhdGl2ZSBjb2VmZmljaWVudCBlc3RpbWF0ZXMgc3VnZ2VzdGluZyBhcyBib3RoIGluY3JlYXNlcywgdGhlIGxldmVscyBvZiB0cnVzdCBpbmNyZWFzZS4gRmluYWxseSwgdGhvc2Ugd2l0aCBpbmNyZWFzaW5nIHNvY2lhbCB0cnVzdCAoMC4wOCkgaGFkIGFuIG92ZXJhbGwgZGlzdHJ1c3QgaW4gZ292ZXJubWVudC4gQWx0aG91Z2ggc3RlYWx0aCBhbmQgcGFydHkgYXJlIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCB0aGV5IGhhdmUgcmVtYWluZWQgaW4gdGhlIG1vZGVsIHNpbmNlIHRoZXkgYXJlIGltcG9ydGFudCBmYWN0b3JzIHdoaWNoIGFyZSBhbmFseXNlZCBsYXRlci4gQXMgbWVudGlvbmVkIGluIHRoZSBwcmUtcmVnaXN0cmF0aW9uIGZvcm0gZWFybGllciwgYWdlIGFuZCBhZ2VeMiByZW1haW4gcmVnYXJkbGVzcyBzaW5jZSBpdCBpcyB0aGUgdmFyaWFibGUgd2UgYXJlIG1lYXN1cmluZy4gDQoNCg0KIyMjIENvbXBhcmluZyBib3RoIHJlc3VsdHMNCmBgYHtyfQ0KdGFiX21vZGVsKGdyYXBoNGQsIGdyYXBoNHIsIA0KICAgICAgICAgIHByZWQubGFiZWxzID0gYygiSW50ZXJjZXB0IiwgIldvcnNlIE9mZiIsICJBcHByb3ZhbCIsDQogICAgICAgICAgIkRpc3RydXN0IiwgIlN0ZWFsdGgiLCAiQWdlIiwgIkFnZV4yIiksDQogICAgICAgICAgZHYubGFiZWxzID0gYygiRGVtb2NyYXRpYyIsICJSZXB1YmxpY2FuIiksDQogICAgICAgICAgc3RyaW5nLmVzdCA9ICJDb2VmZiIsDQogICAgICAgICAgc3RyaW5nLmNpID0gIkNvbmYuIEludCAoOTUlKSIsDQogICAgICAgICAgc3RyaW5nLnAgPSAiUC12YWx1ZSIpDQpgYGANCg0KDQpPbmNlIHRoZSB0d28gbGluZWFyIHJlZ3Jlc3Npb25zIGFyZSBzZXBhcmF0ZWQsIGdpdmVuIHZhcmlhYmxlcyBjYW4gYmUgY29tcGFyZWQgYW5kIHVuZGVyc3Rvb2QgZm9yIGVhY2ggcGFydHkuIEZvciBleGFtcGxlLCBkZW1vY3JhdHMgYmVsaWV2aW5nIHRoZXkgd2VyZSB3b3JzZSBvZmYgaGF2ZSBhIGdyZWF0ZXIgZGlzdHJ1c3QgdGhhbiByZXB1YmxpY2Fucy4gV2l0aCB0aG9zZSB3aG8gaGFkIG9mIGFwcHJvdmFsIGZvciB0aGUgcHJlc2lkZW50LCByZXB1YmxpY2FucyBoYWQgYSBtdWNoIGxhcmdlciBjb2VmZmljaWVudCBlc3RpbWF0ZSBvZiB0cnVzdC4gSXQgaXMgYWxzbyBzaG93biB0aGVyZSBpcyBhIGdyZWF0ZXIgbGV2ZWwgb2YgZGlzdHJ1c3QgYW1vbmdzdCByZXB1YmxpY2FucyB0aGFuIGRlbW9jcmF0cyB3aGljaCBzdWdnZXN0cyB0aGV5IGhhZCBhIGdyZWF0ZXIgc2Vuc2Ugb2YgbWlzdHJ1c3Qgb3ZlciB0aGUgdHdvIGVsZWN0aW9ucyAod2l0aCBlYWNoIHBhcnR5IHdpbm5pbmcgb25jZSkuIA0KDQojIyMgJ0FnZScgQ29udHJvbGxlZCBHUkFQSFMgKERFTU8gQU5EIFJFUCkNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KcHJlZFIgPC0gZ2dwcmVkaWN0KGdyYXBoNHIsIHRlcm1zID0gYygiYWdlIikpDQpwcmVkRCA8LSBnZ3ByZWRpY3QoZ3JhcGg0ZCwgdGVybXMgPSBjKCJhZ2UiKSkNCg0KY29udHJvbFIgPC0gcGxvdChwcmVkUikNCmNvbnRyb2xEIDwtIHBsb3QocHJlZEQpDQoNCkRDT04gPC0gY29udHJvbEQgKyBsYWJzKHggPSAiQWdlIiwgeSA9ICIoRGVtb2NyYXRpYykiLA0KICAgICAgICAgICAgICAgIHRpdGxlID0gIkRlbW9jcmF0aWMiICsNCiAgdGhlbWVfcGFuZGVyKCkrDQogIHhsaW0oMjAsIDkwKSkgIA0KDQpSQ09OIDwtIGNvbnRyb2xSICsgbGFicyh4ID0gIiIsIHkgPSAiKFJlcHVibGljYW4pIiwNCiAgICAgICAgICAgICAgIHRpdGxlID0gIlJlcHVibGljYW4iICsNCiAgdGhlbWVfcGFuZGVyKCkrDQogIHhsaW0oMjAsIDkwKSkNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KY29udHJvbCA8LSBncmlkLmFycmFuZ2UoUkNPTiwgRENPTikNCmBgYA0KDQpgYGB7cn0NCmFubm90YXRlX2ZpZ3VyZShjb250cm9sLA0KICAgICAgICAgICAgICAgIHRvcCA9IHRleHRfZ3JvYigiRGlzdHJ1c3QgaW4gR292ZXJubWVudCIsIHNpemUgPSAxNiwgZmFjZSA9ICJib2xkIiksDQogICAgICAgICAgICAgICAgYm90dG9tID0gdGV4dF9ncm9iKCJEYXRhIHNvdXJjZTogT0ZTIEhvbWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsIHggPSAxLCBmYWNlID0gIml0YWxpYyIsIHNpemUgPSAxMCksDQogICAgICAgICAgICAgICAgbGVmdCA9IHRleHRfZ3JvYigiRGlzdHJ1c3QgaW4gR292ZXJubWVudCIsIHJvdCA9IDkwLCBzaXplID0gMTYpKQ0KYGBgDQoNCg0KTmV4dCwgYm90aCB0aGVzZSBncmFwaGljcyByZXByZXNlbnQgYWdlIGNvbXBhcmVkIHdpdGggbGV2ZWwgb2YgZGlzdHJ1c3Qgd2hpbHN0IGNvbnRyb2xsaW5nIGZvciBhbGwgb3RoZXIgdmFyaWFibGVzLiBCb3RoIGdyYXBocyBhcmUgc2ltaWxhciB3aXRoIGFuIG92ZXJhbGwgZGVjcmVhc2UgaW4gdHJ1c3Qgd2l0aCBkZW1vY3JhdGljIGhhdmluZyBhIG11Y2ggbGFyZ2VyIGRlY3JlYXNlLiBSZXB1YmxpY2FucyBoYXZlIGEgcGVhayBsZXZlbCBvZiBkaXN0cnVzdCAoMC43NjkpIGFyb3VuZCB0aGUgYWdlIG9mIDUwIHdoZXJlYXMgZGVtb2NyYXRzIHBlYWsgbGV2ZWwgb2YgZGlzdHJ1c3QgKDAuNjUpIGFycml2ZXMgYXJvdW5kIHRoZSBhZ2UgNDQuIEFzIGJvdGggcGFydGllcyBnZXQgb2xkZXIsIHRoZXJlIGVuZHMgdXAgYmVpbmcgYW4gaW5jcmVhc2UgaW4gdHJ1c3QsIGEgbXVjaCBncmVhdGVyIGluY3JlYXNlIGZvciBkZW1vY3JhdHMgKDAuMDM3KSB0aGFuIHJlcHVibGljYW5zICgwLjAyMykuIEl0IGlzIGltcG9ydGFudCB0byBub3RpY2UgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGxhcmdlciBzaW5jZSB0aGUgcXVhbnRpdHkgb2Ygb2xkZXIgdm90ZXJzIGRlY3JlYXNlLiANCg0KDQoNCg0KIyMjIFVuZGVyc3RhbmRpbmcgJ1N0ZWFsdGggaXNzdWVzJw0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IGdyYXBoMiwgYWVzKHggPSBhZ2UsIHkgPSB0cnVzdF9pbmRleCwgY29sb3VyID0gcGFydHkpKSsNCiAgc3RhdF9zbW9vdGgobWV0aG9kID0gJ2xvZXNzJykrDQogIGZhY2V0X3dyYXAofnNfaXNzdWUsIGRpciA9ICJoIikrDQogIHRoZW1lX2lncmF5KCkrICAgDQogIGxhYnMoeCA9ICJBZ2UiICwgeSA9ICJUcnVzdCIsIA0KICAgICAgIHRpdGxlID0gIkRpc3RydXN0IGluIEdvdmVybm1lbnQgYnkgYWdlIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJTVEVBTFRIIENhbXBhaWduOiAwID0gbG93IGRpdmVyc2Ugb3BpbmlvbiwgNSA9IGhpZ2hseSBkaXZlcnNlIG9waW5pb24iLA0KICAgICAgIGNhcHRpb24gPSAiREFUQTogT1NGIEhvbWUiKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoIkRlbW9jcmF0aWMiLCAiUmVwdWJsaWNhbiIpLA0KICAgIHZhbHVlcyA9IGMoJ0JsdWUnLCAnUmVkJykpDQpgYGANCg0KDQpGaW5hbGx5LCB3ZSBjYW4gZW5oYW5jZSBvdXIgdW5kZXJzdGFuZGluZyBmcm9tIHRoZSBvcmlnaW5hbCBzdHVkeSBieSBhc3Nlc3NpbmcgbGV2ZWxzIG9mIHRydXN0IHZhcnlpbmcgYXMgcGFydGllcyBoYXZlIGEgZ3JlYXRlciBsZXZlbCBvZiBkaXZlcnNlIG9waW5pb25zLiBUaGUgZ3JhcGhpYyBzaG93cyByZXB1YmxpY2FucyBhbG1vc3QgYWx3YXlzIGhhdmluZyBhIGdyZWF0ZXIgbGV2ZWwgb2YgZGlzdHJ1c3QgaG93ZXZlciwgYXMgb3BpbmlvbnMgZ2V0IG1vcmUgZGl2ZXJzZSwgdGhlIGRpZmZlcmVuY2UgaW4gZGlzdHJ1c3QgZGVjcmVhc2VzLiBUaGUgbGV2ZWxzIG9mIGRpc3RydXN0IGRvIG5vdCBkZWNyZWFzZSBtdWNoIGZvciBkZW1vY3JhdHMgaG93ZXZlciwgYXMgZGl2ZXJzaXR5IGluY3JlYXNlcyBmb3IgZGVtb2NyYXRzLCBzbyBkb2VzIHRoZWlyIGxldmVsIGluIHRydXN0Lg0KDQoqKioNCg0KIyMgNC4gQ29uY2x1c2lvbnMNCiANCg0KVG8gY29uY2x1ZGUgd2l0aCwgd2UgY2FuIHNlZSBob3cgc29jaWFsIG1lZGlhIGhhZCBhbiBlZmZlY3Qgb24gdHJ1c3Qgd2l0aGluIHBhcnRpZXMgc29tZXRoaW5nIGFkdm9jYXRlZCBieSBIb2x0IGV0IGFsIGFsb25nIHdpdGggUHJpb3IgYnV0IGFsc28gZnVydGhlcmVkIHRoZSBzdHVkeSBieSBsb29raW5nIGF0IGhvdyBpdCB2YXJpZWQgYmV0d2VlbiBwYXJ0aWVzLiBXaGVuIGFzc2Vzc2luZyB0aGlzIHByb2plY3Qgd2l0aCB0aGUgb3JpZ2luYWwgc3R1ZHksIGl0IGRvZXMgZGlmZmVyIGluIHRoZSB3YXkgdGhleSBmaW5kIGFuIG92ZXJhbGwgZGlmZmVyZW5jZSBiZXR3ZWVuIHBhcnRpZXMgYW5kIHRydXN0IHdoZXJlYXMgdGhpcyBwcm9qZWN0IGZpbmRzIGEgc2ltaWxhciBwYXR0ZXIgd2l0aCBkaXN0cnVzdCBiZWluZyBoaWdoZXN0IGR1cmluZyBtaWRkbGUgYWdlcyBhbmQgbG93ZXN0IGF0IHlvdW5nIGFuZCBvbGQgYWdlcy4NCg0KTGlrZXdpc2UsIHJlc3VsdHMgZnJvbSB0aGlzIHByb2plY3QgZmF2b3VycyBDaHJpc3RlbnNlbiBhbmQgTMOmZ3JlaWQncyByZXNlYXJjaCBmaW5kaW5nIGhvdyB0cnVzdCBpbmNyZWFzZXMgYXMgcGVvcGxlIGdldCBvbGRlciAobXkgcmVzZWFyY2ggZmluZHMgdGhpcyBvY2N1cnMgd2l0aCBib3RoIHBhcnRpZXMpLiBEYWx0b24ncyBwZXJzcGVjdGl2ZSB0aHJvdWdoIGEgbG9uZ2l0dWRpbmFsIGFwcHJvYWNoIGlzIHNvbWV0aGluZyB0aGF0IGNvdWxkIGhhdmUgYmVlbiBmdXJ0aGVyIHJlc2VhcmNoZWQgYW5kIHVuZGVyc3RhbmRpbmcgdHJ1c3QgcGF0dGVybnMgdGhyb3VnaG91dCBkZWNhZGVzIGhvd2V2ZXIsIHdlIGJvdGggY29tZSB0byB0aGUgY29uY2x1c2lvbiB0aGF0IHNvY2lhbCBtZWRpYSBoYXMgYSBwb3dlcmZ1bCBpbXBhY3Qgb24gaW5kaXZpZHVhbHMuIEhpdGxpbiBhbmQgU2h1dGF2YSdzIHN0dWR5IGlzIHNvbWV0aGluZyAgdGhhdCBpcyBzb21ld2hhdCBjaGFsbGVuZ2VkLCB0aGUgbGV2ZWxzIG9mIHRydXN0IGJldHdlZW4gb2xkZXIgYW5kIHlvdW5nZXIgcGVvcGxlIHdlcmUgbWluaW1hbCAoYXMgZm91bmQgaW4gdGhlaXIgc3R1ZHkpIGhvd2V2ZXIsIHdlIGZpbmQgdGhlIG9wcG9zaXRlIGluIHRydXN0IGZvciBtaWRkbGUgYWdlZCBwZW9wbGUgd2hlcmUgdGhlcmUgaXMgYW4gaW5jcmVhc2UgaW4gZGlzdHJ1c3QgcmF0aGVyIHRoYW4gdHJ1c3QuDQoNCkFzIHRvIHRoZSBoeXBvdGhlc2lzIHN0YXRlZCBlYXJsaWVyLCBpdCB3YXMgbWFyZ2luYWxseSBjb3JyZWN0IGluIHN0YXRpbmcgZGlzdHJ1c3Qgd2lsbCBpbmNyZWFzZSB3aXRoIGRlbW9jcmF0cyBob3dldmVyLCBpbiB0aGlzIHN0dWR5IGRpZCBmaW5kIGFuIGluY3JlYXNlIGF0IHRoZSAnb2xkZXInIGFnZXMuIFRoZSBoeXBvdGhlc2lzIGFsc28gc3VnZ2VzdGVkIHRoZSBvcHBvc2l0ZSBmb3IgcmVwdWJsaWNhbnMsIGhvd2V2ZXIgdGhlIHNhbWUgdHJlbmQgb2NjdXJzIGFzIGRlbW9jcmF0cyAoYWx0aG91Z2ggdGhpcyBkb2VzIG9jY3VyIGF0IGEgbG93ZXIgcmF0ZSBmb3IgYWxsIGFnZXMpLiBUaGUgU3RlYWx0aCBncmFwaHMgd2FzIGZhY2V0ZWQgaW4gdGhlIGZpbmFsIGdyYXBocyB0byBnZXQgYSB2aXN1YWxpc2F0aW9uIG9mIGhvdyB0cnVzdCBwYXR0ZXJucyBtYXkgZGlmZmVyIHVwb24gZGl2ZXJzZSBvcGluaW9ucyAoc3VjaCBhcyBhYm9ydGlvbiBhbmQgZ3VuIHJpZ2h0cykgYW5kIHdhcyBzdWNjZXNzZnVsIGluIGZpbmRpbmcgYSBkaWZmZXJlbmNlIGJldHdlZW4gYm90aCBwYXJ0aWVzLg0KDQogDQoNCg0KIyMgUmVmZXJlbmNlcw0KDQoNCiogW0NocmlzdGVuc2VuLCBULiBhbmQgTMOmZ3JlaWRdKGh0dHBzOi8vd3d3LnRhbmRmb25saW5lLmNvbS9kb2kvYWJzLzEwLjEwODAvMTUzMDk1NzYuMjAwNS4xMTA1MTg0OCksIFAuLCAyMDA1LiBUcnVzdCBpbiBnb3Zlcm5tZW50OiBUaGUgcmVsYXRpdmUgaW1wb3J0YW5jZSBvZiBzZXJ2aWNlIHNhdGlzZmFjdGlvbiwgcG9saXRpY2FsIGZhY3RvcnMsIGFuZCBkZW1vZ3JhcGh5LiBQdWJsaWMgcGVyZm9ybWFuY2UgJiBtYW5hZ2VtZW50IHJldmlldywgMjgoNCksIHBwLjQ4Ny01MTEuDQoqIFtEYWx0b24sIFIuSi5dKGh0dHBzOi8vd3d3LnRhbmRmb25saW5lLmNvbS9kb2kvZnVsbC8xMC4xMDgwLzAzOTA2NzAwNTAwMDM4ODE5KSwgMjAwNS4gVGhlIHNvY2lhbCB0cmFuc2Zvcm1hdGlvbiBvZiB0cnVzdCBpbiBnb3Zlcm5tZW50LiBJbnRlcm5hdGlvbmFsIHJldmlldyBvZiBzb2Npb2xvZ3ksIDE1KDEpLCBwcC4xMzMtMTU0Lg0KKiBbRnJlZXNlLCBKLiBhbmQgUGV0ZXJzb24sIEQuXShodHRwczovL3d3dy5hbm51YWxyZXZpZXdzLm9yZy9kb2kvcGRmLzEwLjExNDYvYW5udXJldi1zb2MtMDYwMTE2LTA1MzQ1MCksIDIwMTcuIFJlcGxpY2F0aW9uIGluIHNvY2lhbCBzY2llbmNlLiBBbm51YWwgUmV2aWV3IG9mIFNvY2lvbG9neSwgNDMsIHBwLjE0Ny0xNjUuDQoqIFtISVRMSU4sIFAuIGFuZCBTSFVUQVZBLCBOLl0oaHR0cHM6Ly9vdXJwdWJsaWNzZXJ2aWNlLm9yZy93cC1jb250ZW50L3VwbG9hZHMvMjAyMi8wMy9UcnVzdC1pbi1Hb3Zlcm5tZW50LnBkZiksIDIwMjIuIFRydXN0IGluIGdvdmVybm1lbnQuDQoqIFtIb2x0LCBLLiwgU2hlaGF0YSwgQS4sIFN0csO2bWLDpGNrLCBKLiBhbmQgTGp1bmdiZXJnLCBFLl0oaHR0cHM6Ly9qb3VybmFscy5zYWdlcHViLmNvbS9kb2kvcGRmLzEwLjExNzcvMDI2NzMyMzExMjQ2NTM2OSksIDIwMTMuIEFnZSBhbmQgdGhlIGVmZmVjdHMgb2YgbmV3cyBtZWRpYSBhdHRlbnRpb24gYW5kIHNvY2lhbCBtZWRpYSB1c2Ugb24gcG9saXRpY2FsIGludGVyZXN0IGFuZCBwYXJ0aWNpcGF0aW9uOiBEbyBzb2NpYWwgbWVkaWEgZnVuY3Rpb24gYXMgbGV2ZWxsZXI/LiBFdXJvcGVhbiBqb3VybmFsIG9mIGNvbW11bmljYXRpb24sIDI4KDEpLCBwcC4xOS0zNC4NCiogW0tsZWluLCBFLiwgJiBSb2Jpc29uLCBKLl0oaHR0cHM6Ly93d3cudGFuZGZvbmxpbmUuY29tL2RvaS9mdWxsLzEwLjEwODAvMTA1ODQ2MDkuMjAxOS4xNjYxODkxKSAoMjAyMCkuIExpa2UsIHBvc3QsIGFuZCBkaXN0cnVzdD8gSG93IHNvY2lhbCBtZWRpYSB1c2UgYWZmZWN0cyB0cnVzdCBpbiBnb3Zlcm5tZW50LiBQb2xpdGljYWwgQ29tbXVuaWNhdGlvbiwgMzcoMSksIDQ2LTY0Lg0KKiBbUHJpb3IsIE0uLCAyMDEwLl0oaHR0cHM6Ly93d3cuam91cm5hbHMudWNoaWNhZ28uZWR1L2RvaS9mdWxsLzEwLjEwMTcvUzAwMjIzODE2MTAwMDAxNDkpIFlvdeKAmXZlIGVpdGhlciBnb3QgaXQgb3IgeW91IGRvbuKAmXQ/IFRoZSBzdGFiaWxpdHkgb2YgcG9saXRpY2FsIGludGVyZXN0IG92ZXIgdGhlIGxpZmUgY3ljbGUuIFRoZSBKb3VybmFsIG9mIFBvbGl0aWNzLCA3MigzKSwgcHAuNzQ3LTc2Ni4NCg0KDQoNCiMjIEFwcGVuZGl4DQoNCiMjIyBBcHBlbmRpeCAxLiBNeSBlbnZpcm9tZW50IChmdWxsIGluZm9ybWF0aW9uKSANCg0KYGBge3Igc2Vzc2lvbn0NCiMgRGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgbXkgZW52aXJvbm1lbnQNCnNlc3Npb25JbmZvKCkNCmBgYA0KDQojIyMgQXBwZW5kaXggMi4gRW50aXJlIFIgY29kZSB1c2VkIGluIHRoZSBwcm9qZWN0DQoNCmBgYHtyIHJlZi5sYWJlbD1rbml0cjo6YWxsX2xhYmVscygpLCBlY2hvPVRSVUUsIGV2YWw9RkFMU0V9DQpgYGANCg==