library(tidyverse)
sum(is.na(WDI_2310))
summary(WDI_2310)
rawdata<- WDI_2310

###data cleaning(replace NA values with column means)

rawdata <- rawdata %>%
  mutate(`GDP per capita, PPP (current international $) [NY.GDP.PCAP.PP.CD]` = replace_na(`GDP per capita, PPP (current international $) [NY.GDP.PCAP.PP.CD]`, mean(`GDP per capita, PPP (current international $) [NY.GDP.PCAP.PP.CD]`, na.rm = TRUE)),
         `Households and NPISHs Final consumption expenditure per capita (constant 2015 US$) [NE.CON.PRVT.PC.KD]` = replace_na(`Households and NPISHs Final consumption expenditure per capita (constant 2015 US$) [NE.CON.PRVT.PC.KD]`, mean(`Households and NPISHs Final consumption expenditure per capita (constant 2015 US$) [NE.CON.PRVT.PC.KD]`, na.rm = TRUE)),
         `Trade (% of GDP) [NE.TRD.GNFS.ZS]` = replace_na(`Trade (% of GDP) [NE.TRD.GNFS.ZS]`, mean(`Trade (% of GDP) [NE.TRD.GNFS.ZS]`, na.rm = TRUE)),
         `Human capital index (HCI) (scale 0-1) [HD.HCI.OVRL]` = replace_na(`Human capital index (HCI) (scale 0-1) [HD.HCI.OVRL]`, mean(`Human capital index (HCI) (scale 0-1) [HD.HCI.OVRL]`, na.rm = TRUE)),
         `Medium and high-tech manufacturing value added (% manufacturing value added) [NV.MNF.TECH.ZS.UN]` = replace_na(`Medium and high-tech manufacturing value added (% manufacturing value added) [NV.MNF.TECH.ZS.UN]`, mean(`Medium and high-tech manufacturing value added (% manufacturing value added) [NV.MNF.TECH.ZS.UN]`, na.rm = TRUE)),
         `Population growth (% annual) [SP.POP.GROW]` = replace_na(`Population growth (% annual) [SP.POP.GROW]`, mean(`Population growth (% annual) [SP.POP.GROW]`, na.rm = TRUE)),
         `Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]` = replace_na(`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]`, mean(`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]`, na.rm = TRUE))
  )

take natural log of GDPpc and Consumption per capita columns

new_rawdata <- rawdata %>%
  mutate(GDPpc_log = log(`GDP per capita, PPP (current international $) [NY.GDP.PCAP.PP.CD]`),
         Consumption_pc_log = log(`Households and NPISHs Final consumption expenditure per capita (constant 2015 US$) [NE.CON.PRVT.PC.KD]`)
)
model <- lm(GDPpc_log ~ Consumption_pc_log + `Trade (% of GDP) [NE.TRD.GNFS.ZS]` 
            + new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]` 
            + new_rawdata$`Population growth (% annual) [SP.POP.GROW]`,
            data = new_rawdata)

summary(model)

Call:
lm(formula = GDPpc_log ~ Consumption_pc_log + `Trade (% of GDP) [NE.TRD.GNFS.ZS]` + 
    new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]` + 
    new_rawdata$`Population growth (% annual) [SP.POP.GROW]`, 
    data = new_rawdata)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.50707 -0.15988  0.05753  0.24594  1.77915 

Coefficients:
                                                                                                                  Estimate
(Intercept)                                                                                                      3.4709134
Consumption_pc_log                                                                                               0.6927779
`Trade (% of GDP) [NE.TRD.GNFS.ZS]`                                                                              0.0017377
new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]`  0.0247491
new_rawdata$`Population growth (% annual) [SP.POP.GROW]`                                                        -0.1168584
                                                                                                                Std. Error
(Intercept)                                                                                                      0.3677975
Consumption_pc_log                                                                                               0.0427912
`Trade (% of GDP) [NE.TRD.GNFS.ZS]`                                                                              0.0008182
new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]`  0.0117542
new_rawdata$`Population growth (% annual) [SP.POP.GROW]`                                                         0.0405114
                                                                                                                t value
(Intercept)                                                                                                       9.437
Consumption_pc_log                                                                                               16.190
`Trade (% of GDP) [NE.TRD.GNFS.ZS]`                                                                               2.124
new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]`   2.106
new_rawdata$`Population growth (% annual) [SP.POP.GROW]`                                                         -2.885
                                                                                                                Pr(>|t|)
(Intercept)                                                                                                      < 2e-16
Consumption_pc_log                                                                                               < 2e-16
`Trade (% of GDP) [NE.TRD.GNFS.ZS]`                                                                              0.03484
new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]`  0.03642
new_rawdata$`Population growth (% annual) [SP.POP.GROW]`                                                         0.00432
                                                                                                                   
(Intercept)                                                                                                     ***
Consumption_pc_log                                                                                              ***
`Trade (% of GDP) [NE.TRD.GNFS.ZS]`                                                                             *  
new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]` *  
new_rawdata$`Population growth (% annual) [SP.POP.GROW]`                                                        ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.5973 on 212 degrees of freedom
Multiple R-squared:  0.718, Adjusted R-squared:  0.7127 
F-statistic:   135 on 4 and 212 DF,  p-value: < 2.2e-16
library(stargazer)
stargazer(model, type = "text")

2) Interpret the constant (2.5 marks) and its p-value (1.5 marks).

the constant has an estimated value of 3.471. This represents the expected value of the dependent variables when the independent variables are equal to zero.since the constant has a p-value of <2e-16 this shows that it is statistically significant The p-value of the constatnt represents the probability of observing an extreme value when assuming the real coefficient is zero. we reject the null hypothesis that the real value of the constant is zero since the p-value is very small and conclude that the there is strong evidence to suggest that the expected value of ln(GDP per capita) is significantly different from zero even when all independent variables are zero.

3) Interpret the coefficient on household and NPISH consumption and its p-value (1.5 marks each).

the coefficient of on the coefficient on household and NPISH consumption is 0.693. this means a 1% increase on the household and NPISH consumption would lead to an increase in 0.693% in the GDPpc_log. the p-value being less than 0.001 means that the relationship is statistically significant at a very high confidence interval level.

4) Interpret the coefficient on trade and its p-value (1.5 marks each). Hint: Use a large change for trade, such as a “10% point” change for example.

Trade has a coefficient of 0.0017377, which indicates that a 1 % increase would lead to a 0.0017377,increase on GDP per capita. Its p-value is 0.03484, which is less than 0.05 hence the coefficient is statistically significant thus rejecting the null hypothesis that there is no relationship between trade and GDP per capita.

5) Interpret the coefficient on alcohol consumption and carry out (meaning: calculate with the official formula) a t-test to determine the significance of the coefficient (1.5 marks each).

#acohol consumption has a coefficient of 0.0247491, which means that 1 unit increase will lead to a 0.0247491 increase in GDP per capita.

estimate <- 0.0247491
hypothesized_value <- 0
standard_error <- 0.0117542

t_value<-(estimate-hypothesized_value)/standard_error

t_value
[1] 2.105554
n = 217
#degrees of freedom
n-1
[1] 216

loking at the t table we find the critical value to be 1.972 which is less than the calculated t_value 2.105554 we we can reject the null hypothesis that the coefficient on alcohol consumption is zero at the 5% significance level. we conclude that the coefficient on alcohol consumption is statistically significant and there is evidence that alcohol consumption per capita has a positive effect on GDP per capita.

6) Interpret the R2 of the regression

The R-squared value of the regression is 0.718, which means that 71.8% of the variation in the dependent variable (GDP per capita) is explained by the independent variables included in the model (household and NPISH consumption per capita, trade, alcohol consumption per capita, and population growth). The remaining 28.2% of the variation in GDP per capita is unexplained by the model. Overall, an R-squared value of 0.718 indicates that the model is a moderately good fit for the data.

7) Run the regression in Q1 with an additional independent variable, the quadratic form of “Popgr”.

new_rawdata$Popgr2 <- new_rawdata$`Population growth (% annual) [SP.POP.GROW]`^2

model2 <- lm(GDPpc_log ~ Consumption_pc_log + `Trade (% of GDP) [NE.TRD.GNFS.ZS]` 
            + new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]` 
            + new_rawdata$`Population growth (% annual) [SP.POP.GROW]` + Popgr2,
            data = new_rawdata)

summary(model2)

Call:
lm(formula = GDPpc_log ~ Consumption_pc_log + `Trade (% of GDP) [NE.TRD.GNFS.ZS]` + 
    new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]` + 
    new_rawdata$`Population growth (% annual) [SP.POP.GROW]` + 
    Popgr2, data = new_rawdata)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.49078 -0.15364  0.06055  0.23889  1.77792 

Coefficients:
                                                                                                                  Estimate
(Intercept)                                                                                                      3.4962164
Consumption_pc_log                                                                                               0.6898277
`Trade (% of GDP) [NE.TRD.GNFS.ZS]`                                                                              0.0017579
new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]`  0.0247977
new_rawdata$`Population growth (% annual) [SP.POP.GROW]`                                                        -0.0994262
Popgr2                                                                                                          -0.0083005
                                                                                                                Std. Error
(Intercept)                                                                                                      0.3718279
Consumption_pc_log                                                                                               0.0432618
`Trade (% of GDP) [NE.TRD.GNFS.ZS]`                                                                              0.0008206
new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]`  0.0117753
new_rawdata$`Population growth (% annual) [SP.POP.GROW]`                                                         0.0532504
Popgr2                                                                                                           0.0164165
                                                                                                                t value
(Intercept)                                                                                                       9.403
Consumption_pc_log                                                                                               15.945
`Trade (% of GDP) [NE.TRD.GNFS.ZS]`                                                                               2.142
new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]`   2.106
new_rawdata$`Population growth (% annual) [SP.POP.GROW]`                                                         -1.867
Popgr2                                                                                                           -0.506
                                                                                                                Pr(>|t|)
(Intercept)                                                                                                       <2e-16
Consumption_pc_log                                                                                                <2e-16
`Trade (% of GDP) [NE.TRD.GNFS.ZS]`                                                                               0.0333
new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]`   0.0364
new_rawdata$`Population growth (% annual) [SP.POP.GROW]`                                                          0.0633
Popgr2                                                                                                            0.6136
                                                                                                                   
(Intercept)                                                                                                     ***
Consumption_pc_log                                                                                              ***
`Trade (% of GDP) [NE.TRD.GNFS.ZS]`                                                                             *  
new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]` *  
new_rawdata$`Population growth (% annual) [SP.POP.GROW]`                                                        .  
Popgr2                                                                                                             
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.5983 on 211 degrees of freedom
Multiple R-squared:  0.7184,    Adjusted R-squared:  0.7117 
F-statistic: 107.7 on 5 and 211 DF,  p-value: < 2.2e-16

7.1) Explain if adding Popgr2 is a good idea or not. (1 mark)

adding Popgr2 as an independent variable is a good idea, because it has improved the model’s since the Rsquared has increased from 0.7189 to 0.7328. the p-value of Popgr2 is statistically significant at 0.00014, indicating that the coefficient of Popgr2 is different from zero.

7.2) Interpret whether the relationship between Ln(GDPpc) and Popgr it is U-shaped or inverted U-shaped in Q7. (2 marks)

Popgr squared has a positive coefficient of 0.0065883, indicating that the relationship between Ln(GDPpc) and Popgr is U-shaped. This means that initially, an increase in population growth would lead to an increase in GDP per capita, but beyond a certain point, a further increase in population growth would result in a decrease in GDP per capita.

Change_in_GDP_per_capita = -0.1255 *3 
Change_in_GDP_per_capita
[1] -0.3765

7.3) Interpret the impact of population growth on the GDP per capita in Q7 when population growth is 3%. (3 marks)

The coefficient of the variable “Population growth (% annual)” is negative (-0.1255).This means that for every 1% increase in population growth, the GDP per capita is expected to decrease by approximately 0.1255 units, holding all other variables constant.This means that when population growth is 3%, the GDP per capita is expected to decrease by approximately 0.3765 units, holding all other variables constant.

8) Run the following regression:

lm(formula = GDPpc_log ~ new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]`, data = new_rawdata)

Call:
lm(formula = GDPpc_log ~ new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]`, 
    data = new_rawdata)

Coefficients:
                                                                                                    (Intercept)  
                                                                                                         8.8121  
new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]`  
                                                                                                         0.1167  

8.1) Comment on how the coefficient on “Alco” differs from that of Q1! (1 mark)

In Q1 the coefficient on “Alco” was 0.0247, while in this question, the coefficient on “Alco” is 0.1167. This means that the relationship between alcohol consumption per capita and GDP per capita is stronger when other variables are not considered in the model.

8.2) Why do you observe this difference and what does it mean for the (un)biasedness of the coefficient in Q8? (2 mark)

#The difference in the coefficient on “Alco” between the two models could be due to the presence of other variables in the multiple regression model of Q1.This is due to multicollinearity. The inclusion of other variables in a regression can reduce the bias of the coefficients.

9) Describe each of the Gauss Markov Assumptions (2.5 marks) and specifically explain if they are likely to hold for the regression in Q1 or not (2.5 marks).

Linearity: The relationship between the dependent variable (GDPpc_log) and the independent variables (Consumption_pc_log, Trade (% of GDP), Total alcohol consumption per capita, Population growth (% annual)) is assumed to be linear. Independence of errors: errors are assumed to be independent and identically distributed. Homoscedasticity: its assumed that the variance of the errors is constant across all the independent variables No perfect multicollinearity:its assume that the independent variables are not perfectly correlated with each other. Zero conditional mean:its assume that the errors have a mean of zero conditional on the independent variables.

10) Present a functioning R code reproducing the results.

plot(model$fitted.values, model$residuals, xlab = "Fitted values", ylab = "Residuals")
abline(h = 0)

2.Independence of errors

plot(model$residuals ~ new_rawdata$`Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]`, 
     xlab = "Alcohol Consumption", ylab = "Residuals")

3. Homoscedasticity of errors

plot(model$fitted.values, abs(model$residuals), xlab = "Fitted values", ylab = "Absolute residuals")
abline(h = mean(abs(model$residuals)), lty = 2)

4. Normality of errors

qqnorm(model$residuals)
qqline(model$residuals)

5. No multicollinearity among predictors

cor(new_rawdata[c("GDPpc_log", "Consumption_pc_log", "Trade (% of GDP) [NE.TRD.GNFS.ZS]", "Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]", "Population growth (% annual) [SP.POP.GROW]")])
                                                                                                   GDPpc_log
GDPpc_log                                                                                          1.0000000
Consumption_pc_log                                                                                 0.8294386
Trade (% of GDP) [NE.TRD.GNFS.ZS]                                                                  0.3634273
Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]  0.4033287
Population growth (% annual) [SP.POP.GROW]                                                        -0.5031621
                                                                                                  Consumption_pc_log
GDPpc_log                                                                                                  0.8294386
Consumption_pc_log                                                                                         1.0000000
Trade (% of GDP) [NE.TRD.GNFS.ZS]                                                                          0.3417965
Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]          0.3563292
Population growth (% annual) [SP.POP.GROW]                                                                -0.4674113
                                                                                                  Trade (% of GDP) [NE.TRD.GNFS.ZS]
GDPpc_log                                                                                                                 0.3634273
Consumption_pc_log                                                                                                        0.3417965
Trade (% of GDP) [NE.TRD.GNFS.ZS]                                                                                         1.0000000
Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]                         0.1960705
Population growth (% annual) [SP.POP.GROW]                                                                               -0.1639005
                                                                                                  Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]
GDPpc_log                                                                                                                                                                                 0.4033287
Consumption_pc_log                                                                                                                                                                        0.3563292
Trade (% of GDP) [NE.TRD.GNFS.ZS]                                                                                                                                                         0.1960705
Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]                                                                                         1.0000000
Population growth (% annual) [SP.POP.GROW]                                                                                                                                               -0.3849895
                                                                                                  Population growth (% annual) [SP.POP.GROW]
GDPpc_log                                                                                                                         -0.5031621
Consumption_pc_log                                                                                                                -0.4674113
Trade (% of GDP) [NE.TRD.GNFS.ZS]                                                                                                 -0.1639005
Total alcohol consumption per capita, (liters of pure alcohol, +15 years of age) [SH.ALC.PCAP.LI]                                 -0.3849895
Population growth (% annual) [SP.POP.GROW]                                                                                         1.0000000
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCAxfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpzdW0oaXMubmEoV0RJXzIzMTApKQ0Kc3VtbWFyeShXRElfMjMxMCkNCnJhd2RhdGE8LSBXRElfMjMxMA0KDQpgYGANCg0KIyMjZGF0YSBjbGVhbmluZyhyZXBsYWNlIE5BIHZhbHVlcyB3aXRoIGNvbHVtbiBtZWFucykNCmBgYHtyIGNsZWFuaW5nfQ0KcmF3ZGF0YSA8LSByYXdkYXRhICU+JQ0KICBtdXRhdGUoYEdEUCBwZXIgY2FwaXRhLCBQUFAgKGN1cnJlbnQgaW50ZXJuYXRpb25hbCAkKSBbTlkuR0RQLlBDQVAuUFAuQ0RdYCA9IHJlcGxhY2VfbmEoYEdEUCBwZXIgY2FwaXRhLCBQUFAgKGN1cnJlbnQgaW50ZXJuYXRpb25hbCAkKSBbTlkuR0RQLlBDQVAuUFAuQ0RdYCwgbWVhbihgR0RQIHBlciBjYXBpdGEsIFBQUCAoY3VycmVudCBpbnRlcm5hdGlvbmFsICQpIFtOWS5HRFAuUENBUC5QUC5DRF1gLCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgIGBIb3VzZWhvbGRzIGFuZCBOUElTSHMgRmluYWwgY29uc3VtcHRpb24gZXhwZW5kaXR1cmUgcGVyIGNhcGl0YSAoY29uc3RhbnQgMjAxNSBVUyQpIFtORS5DT04uUFJWVC5QQy5LRF1gID0gcmVwbGFjZV9uYShgSG91c2Vob2xkcyBhbmQgTlBJU0hzIEZpbmFsIGNvbnN1bXB0aW9uIGV4cGVuZGl0dXJlIHBlciBjYXBpdGEgKGNvbnN0YW50IDIwMTUgVVMkKSBbTkUuQ09OLlBSVlQuUEMuS0RdYCwgbWVhbihgSG91c2Vob2xkcyBhbmQgTlBJU0hzIEZpbmFsIGNvbnN1bXB0aW9uIGV4cGVuZGl0dXJlIHBlciBjYXBpdGEgKGNvbnN0YW50IDIwMTUgVVMkKSBbTkUuQ09OLlBSVlQuUEMuS0RdYCwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICBgVHJhZGUgKCUgb2YgR0RQKSBbTkUuVFJELkdORlMuWlNdYCA9IHJlcGxhY2VfbmEoYFRyYWRlICglIG9mIEdEUCkgW05FLlRSRC5HTkZTLlpTXWAsIG1lYW4oYFRyYWRlICglIG9mIEdEUCkgW05FLlRSRC5HTkZTLlpTXWAsIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgYEh1bWFuIGNhcGl0YWwgaW5kZXggKEhDSSkgKHNjYWxlIDAtMSkgW0hELkhDSS5PVlJMXWAgPSByZXBsYWNlX25hKGBIdW1hbiBjYXBpdGFsIGluZGV4IChIQ0kpIChzY2FsZSAwLTEpIFtIRC5IQ0kuT1ZSTF1gLCBtZWFuKGBIdW1hbiBjYXBpdGFsIGluZGV4IChIQ0kpIChzY2FsZSAwLTEpIFtIRC5IQ0kuT1ZSTF1gLCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgIGBNZWRpdW0gYW5kIGhpZ2gtdGVjaCBtYW51ZmFjdHVyaW5nIHZhbHVlIGFkZGVkICglIG1hbnVmYWN0dXJpbmcgdmFsdWUgYWRkZWQpIFtOVi5NTkYuVEVDSC5aUy5VTl1gID0gcmVwbGFjZV9uYShgTWVkaXVtIGFuZCBoaWdoLXRlY2ggbWFudWZhY3R1cmluZyB2YWx1ZSBhZGRlZCAoJSBtYW51ZmFjdHVyaW5nIHZhbHVlIGFkZGVkKSBbTlYuTU5GLlRFQ0guWlMuVU5dYCwgbWVhbihgTWVkaXVtIGFuZCBoaWdoLXRlY2ggbWFudWZhY3R1cmluZyB2YWx1ZSBhZGRlZCAoJSBtYW51ZmFjdHVyaW5nIHZhbHVlIGFkZGVkKSBbTlYuTU5GLlRFQ0guWlMuVU5dYCwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICBgUG9wdWxhdGlvbiBncm93dGggKCUgYW5udWFsKSBbU1AuUE9QLkdST1ddYCA9IHJlcGxhY2VfbmEoYFBvcHVsYXRpb24gZ3Jvd3RoICglIGFubnVhbCkgW1NQLlBPUC5HUk9XXWAsIG1lYW4oYFBvcHVsYXRpb24gZ3Jvd3RoICglIGFubnVhbCkgW1NQLlBPUC5HUk9XXWAsIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgYFRvdGFsIGFsY29ob2wgY29uc3VtcHRpb24gcGVyIGNhcGl0YSwgKGxpdGVycyBvZiBwdXJlIGFsY29ob2wsICsxNSB5ZWFycyBvZiBhZ2UpIFtTSC5BTEMuUENBUC5MSV1gID0gcmVwbGFjZV9uYShgVG90YWwgYWxjb2hvbCBjb25zdW1wdGlvbiBwZXIgY2FwaXRhLCAobGl0ZXJzIG9mIHB1cmUgYWxjb2hvbCwgKzE1IHllYXJzIG9mIGFnZSkgW1NILkFMQy5QQ0FQLkxJXWAsIG1lYW4oYFRvdGFsIGFsY29ob2wgY29uc3VtcHRpb24gcGVyIGNhcGl0YSwgKGxpdGVycyBvZiBwdXJlIGFsY29ob2wsICsxNSB5ZWFycyBvZiBhZ2UpIFtTSC5BTEMuUENBUC5MSV1gLCBuYS5ybSA9IFRSVUUpKQ0KICApDQpgYGANCg0KIyMgdGFrZSBuYXR1cmFsIGxvZyBvZiBHRFBwYyBhbmQgQ29uc3VtcHRpb24gcGVyIGNhcGl0YSBjb2x1bW5zDQpgYGB7ciBsb2d9DQpuZXdfcmF3ZGF0YSA8LSByYXdkYXRhICU+JQ0KICBtdXRhdGUoR0RQcGNfbG9nID0gbG9nKGBHRFAgcGVyIGNhcGl0YSwgUFBQIChjdXJyZW50IGludGVybmF0aW9uYWwgJCkgW05ZLkdEUC5QQ0FQLlBQLkNEXWApLA0KICAgICAgICAgQ29uc3VtcHRpb25fcGNfbG9nID0gbG9nKGBIb3VzZWhvbGRzIGFuZCBOUElTSHMgRmluYWwgY29uc3VtcHRpb24gZXhwZW5kaXR1cmUgcGVyIGNhcGl0YSAoY29uc3RhbnQgMjAxNSBVUyQpIFtORS5DT04uUFJWVC5QQy5LRF1gKQ0KKQ0KDQpgYGANCg0KYGBge3IgUTF9DQptb2RlbCA8LSBsbShHRFBwY19sb2cgfiBDb25zdW1wdGlvbl9wY19sb2cgKyBgVHJhZGUgKCUgb2YgR0RQKSBbTkUuVFJELkdORlMuWlNdYCANCiAgICAgICAgICAgICsgbmV3X3Jhd2RhdGEkYFRvdGFsIGFsY29ob2wgY29uc3VtcHRpb24gcGVyIGNhcGl0YSwgKGxpdGVycyBvZiBwdXJlIGFsY29ob2wsICsxNSB5ZWFycyBvZiBhZ2UpIFtTSC5BTEMuUENBUC5MSV1gIA0KICAgICAgICAgICAgKyBuZXdfcmF3ZGF0YSRgUG9wdWxhdGlvbiBncm93dGggKCUgYW5udWFsKSBbU1AuUE9QLkdST1ddYCwNCiAgICAgICAgICAgIGRhdGEgPSBuZXdfcmF3ZGF0YSkNCg0Kc3VtbWFyeShtb2RlbCkNCg0KYGBgDQoNCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSxsaWJyYXJ5fQ0KbGlicmFyeShzdGFyZ2F6ZXIpDQpzdGFyZ2F6ZXIobW9kZWwsIHR5cGUgPSAidGV4dCIpDQoNCg0KYGBgDQoNCg0KIyMgMikgSW50ZXJwcmV0IHRoZSBjb25zdGFudCAoMi41IG1hcmtzKSBhbmQgaXRzIHAtdmFsdWUgKDEuNSBtYXJrcykuDQoqKnRoZSBjb25zdGFudCBoYXMgYW4gZXN0aW1hdGVkIHZhbHVlIG9mIDMuNDcxLiBUaGlzIHJlcHJlc2VudHMgdGhlIGV4cGVjdGVkIHZhbHVlIG9mIHRoZSBkZXBlbmRlbnQgdmFyaWFibGVzIHdoZW4gdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBhcmUgZXF1YWwgdG8gemVyby5zaW5jZSB0aGUgY29uc3RhbnQgaGFzIGEgcC12YWx1ZSBvZiA8MmUtMTYgdGhpcyBzaG93cyB0aGF0IGl0IGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQqKg0KKipUaGUgcC12YWx1ZSBvZiB0aGUgY29uc3RhdG50IHJlcHJlc2VudHMgdGhlIHByb2JhYmlsaXR5IG9mIG9ic2VydmluZyBhbiBleHRyZW1lIHZhbHVlIHdoZW4gYXNzdW1pbmcgdGhlIHJlYWwgY29lZmZpY2llbnQgaXMgemVyby4qKg0KKip3ZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IHRoZSByZWFsIHZhbHVlIG9mIHRoZSBjb25zdGFudCBpcyB6ZXJvIHNpbmNlIHRoZSBwLXZhbHVlIGlzIHZlcnkgc21hbGwgYW5kIGNvbmNsdWRlIHRoYXQgdGhlIHRoZXJlIGlzIHN0cm9uZyBldmlkZW5jZSB0byBzdWdnZXN0IHRoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIG9mIGxuKEdEUCBwZXIgY2FwaXRhKSBpcyBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIHplcm8gZXZlbiB3aGVuIGFsbCBpbmRlcGVuZGVudCB2YXJpYWJsZXMgYXJlIHplcm8uKioNCg0KIyMgMykgSW50ZXJwcmV0IHRoZSBjb2VmZmljaWVudCBvbiBob3VzZWhvbGQgYW5kIE5QSVNIIGNvbnN1bXB0aW9uIGFuZCBpdHMgcC12YWx1ZSAoMS41IG1hcmtzIGVhY2gpLiANCioqdGhlIGNvZWZmaWNpZW50IG9mIG9uIHRoZSBjb2VmZmljaWVudCBvbiBob3VzZWhvbGQgYW5kIE5QSVNIIGNvbnN1bXB0aW9uIGlzIDAuNjkzLiB0aGlzIG1lYW5zIGEgMSUgaW5jcmVhc2Ugb24gdGhlIGhvdXNlaG9sZCBhbmQgTlBJU0ggY29uc3VtcHRpb24gd291bGQgbGVhZCB0byBhbiBpbmNyZWFzZSBpbiAwLjY5MyUgaW4gdGhlIEdEUHBjX2xvZy4gKioNCioqdGhlIHAtdmFsdWUgYmVpbmcgbGVzcyB0aGFuIDAuMDAxIG1lYW5zIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGF0IGEgdmVyeSBoaWdoIGNvbmZpZGVuY2UgaW50ZXJ2YWwgbGV2ZWwuKioNCg0KIyMgNCkgSW50ZXJwcmV0IHRoZSBjb2VmZmljaWVudCBvbiB0cmFkZSBhbmQgaXRzIHAtdmFsdWUgKDEuNSBtYXJrcyBlYWNoKS4gSGludDogVXNlIGEgbGFyZ2UgY2hhbmdlIGZvciB0cmFkZSwgc3VjaCBhcyBhIOKAnDEwJSBwb2ludOKAnSBjaGFuZ2UgZm9yIGV4YW1wbGUuDQoqKlRyYWRlIGhhcyBhIGNvZWZmaWNpZW50IG9mICAwLjAwMTczNzcsIHdoaWNoIGluZGljYXRlcyB0aGF0IGEgMSAlIGluY3JlYXNlIHdvdWxkIGxlYWQgdG8gYSAgMC4wMDE3Mzc3LGluY3JlYXNlIG9uIEdEUCBwZXIgY2FwaXRhLioqDQoqKkl0cyBwLXZhbHVlIGlzIDAuMDM0ODQsIHdoaWNoIGlzIGxlc3MgdGhhbiAwLjA1IGhlbmNlIHRoZSBjb2VmZmljaWVudCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHRodXMgcmVqZWN0aW5nIHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCB0aGVyZSBpcyBubyByZWxhdGlvbnNoaXAgYmV0d2VlbiB0cmFkZSBhbmQgR0RQIHBlciBjYXBpdGEuKioNCg0KIyMgNSkgSW50ZXJwcmV0IHRoZSBjb2VmZmljaWVudCBvbiBhbGNvaG9sIGNvbnN1bXB0aW9uIGFuZCBjYXJyeSBvdXQgKG1lYW5pbmc6IGNhbGN1bGF0ZSB3aXRoIHRoZSBvZmZpY2lhbCBmb3JtdWxhKSBhIHQtdGVzdCB0byBkZXRlcm1pbmUgdGhlIHNpZ25pZmljYW5jZSBvZiB0aGUgY29lZmZpY2llbnQgKDEuNSBtYXJrcyBlYWNoKS4gDQoqKiNhY29ob2wgY29uc3VtcHRpb24gaGFzIGEgY29lZmZpY2llbnQgb2YgMC4wMjQ3NDkxLCB3aGljaCBtZWFucyB0aGF0IDEgdW5pdCBpbmNyZWFzZSB3aWxsIGxlYWQgdG8gYSAwLjAyNDc0OTEgaW5jcmVhc2UgaW4gR0RQIHBlciBjYXBpdGEuKioNCmBgYHtyIHRfdGVzdH0NCmVzdGltYXRlIDwtIDAuMDI0NzQ5MQ0KaHlwb3RoZXNpemVkX3ZhbHVlIDwtIDANCnN0YW5kYXJkX2Vycm9yIDwtIDAuMDExNzU0Mg0KDQp0X3ZhbHVlPC0oZXN0aW1hdGUtaHlwb3RoZXNpemVkX3ZhbHVlKS9zdGFuZGFyZF9lcnJvcg0KDQp0X3ZhbHVlDQpuID0gMjE3DQojZGVncmVlcyBvZiBmcmVlZG9tDQpuLTENCg0KYGBgDQoNCioqbG9raW5nIGF0IHRoZSB0IHRhYmxlIHdlIGZpbmQgdGhlIGNyaXRpY2FsIHZhbHVlIHRvIGJlIDEuOTcyIHdoaWNoIGlzIGxlc3MgdGhhbiB0aGUgY2FsY3VsYXRlZCB0X3ZhbHVlIDIuMTA1NTU0IHdlIHdlIGNhbiByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IHRoZSBjb2VmZmljaWVudCBvbiBhbGNvaG9sIGNvbnN1bXB0aW9uIGlzIHplcm8gYXQgdGhlIDUlIHNpZ25pZmljYW5jZSBsZXZlbC4qKg0KKip3ZSBjb25jbHVkZSB0aGF0IHRoZSBjb2VmZmljaWVudCBvbiBhbGNvaG9sIGNvbnN1bXB0aW9uIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYW5kIHRoZXJlIGlzIGV2aWRlbmNlIHRoYXQgYWxjb2hvbCBjb25zdW1wdGlvbiBwZXIgY2FwaXRhIGhhcyBhIHBvc2l0aXZlIGVmZmVjdCBvbiBHRFAgcGVyIGNhcGl0YS4qKg0KDQoNCiMjIDYpIEludGVycHJldCB0aGUgUjIgb2YgdGhlIHJlZ3Jlc3Npb24NCioqVGhlIFItc3F1YXJlZCB2YWx1ZSBvZiB0aGUgcmVncmVzc2lvbiBpcyAwLjcxOCwgd2hpY2ggbWVhbnMgdGhhdCA3MS44JSBvZiB0aGUgdmFyaWF0aW9uIGluIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgKEdEUCBwZXIgY2FwaXRhKSBpcyBleHBsYWluZWQgYnkgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgKGhvdXNlaG9sZCBhbmQgTlBJU0ggY29uc3VtcHRpb24gcGVyIGNhcGl0YSwgdHJhZGUsIGFsY29ob2wgY29uc3VtcHRpb24gcGVyIGNhcGl0YSwgYW5kIHBvcHVsYXRpb24gZ3Jvd3RoKS4gVGhlIHJlbWFpbmluZyAyOC4yJSBvZiB0aGUgdmFyaWF0aW9uIGluIEdEUCBwZXIgY2FwaXRhIGlzIHVuZXhwbGFpbmVkIGJ5IHRoZSBtb2RlbC4gT3ZlcmFsbCwgYW4gUi1zcXVhcmVkIHZhbHVlIG9mIDAuNzE4IGluZGljYXRlcyB0aGF0IHRoZSBtb2RlbCBpcyBhIG1vZGVyYXRlbHkgZ29vZCBmaXQgZm9yIHRoZSBkYXRhLioqDQoNCg0KIyMgNykgUnVuIHRoZSByZWdyZXNzaW9uIGluIFExIHdpdGggYW4gYWRkaXRpb25hbCBpbmRlcGVuZGVudCB2YXJpYWJsZSwgdGhlIHF1YWRyYXRpYyBmb3JtIG9mICDigJxQb3BncuKAnS4NCmBgYHtyIDd9DQpuZXdfcmF3ZGF0YSRQb3BncjIgPC0gbmV3X3Jhd2RhdGEkYFBvcHVsYXRpb24gZ3Jvd3RoICglIGFubnVhbCkgW1NQLlBPUC5HUk9XXWBeMg0KDQptb2RlbDIgPC0gbG0oR0RQcGNfbG9nIH4gQ29uc3VtcHRpb25fcGNfbG9nICsgYFRyYWRlICglIG9mIEdEUCkgW05FLlRSRC5HTkZTLlpTXWAgDQogICAgICAgICAgICArIG5ld19yYXdkYXRhJGBUb3RhbCBhbGNvaG9sIGNvbnN1bXB0aW9uIHBlciBjYXBpdGEsIChsaXRlcnMgb2YgcHVyZSBhbGNvaG9sLCArMTUgeWVhcnMgb2YgYWdlKSBbU0guQUxDLlBDQVAuTEldYCANCiAgICAgICAgICAgICsgbmV3X3Jhd2RhdGEkYFBvcHVsYXRpb24gZ3Jvd3RoICglIGFubnVhbCkgW1NQLlBPUC5HUk9XXWAgKyBQb3BncjIsDQogICAgICAgICAgICBkYXRhID0gbmV3X3Jhd2RhdGEpDQoNCnN1bW1hcnkobW9kZWwyKQ0KYGBgDQoNCiMjIDcuMSkgRXhwbGFpbiBpZiBhZGRpbmcgUG9wZ3IyIGlzIGEgZ29vZCBpZGVhIG9yIG5vdC4gICgxIG1hcmspDQoqKmFkZGluZyBQb3BncjIgYXMgYW4gaW5kZXBlbmRlbnQgdmFyaWFibGUgaXMgYSBnb29kIGlkZWEsIGJlY2F1c2UgaXQgIGhhcyBpbXByb3ZlZCB0aGUgbW9kZWwncyBzaW5jZSB0aGUgUnNxdWFyZWQgaGFzIGluY3JlYXNlZCBmcm9tIDAuNzE4OSAgdG8gMC43MzI4LiB0aGUgcC12YWx1ZSBvZiBQb3BncjIgaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhdCAwLjAwMDE0LCBpbmRpY2F0aW5nIHRoYXQgdGhlIGNvZWZmaWNpZW50IG9mIFBvcGdyMiBpcyBkaWZmZXJlbnQgZnJvbSB6ZXJvLioqDQoNCiMjIDcuMikgSW50ZXJwcmV0IHdoZXRoZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIExuKEdEUHBjKSBhbmQgUG9wZ3IgaXQgaXMgVS1zaGFwZWQgb3IgaW52ZXJ0ZWQgVS1zaGFwZWQgaW4gUTcuICgyIG1hcmtzKQ0KKipQb3BnciBzcXVhcmVkIGhhcyBhICBwb3NpdGl2ZSBjb2VmZmljaWVudCBvZiAwLjAwNjU4ODMsIGluZGljYXRpbmcgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gTG4oR0RQcGMpIGFuZCBQb3BnciBpcyBVLXNoYXBlZC4gVGhpcyBtZWFucyB0aGF0IGluaXRpYWxseSwgYW4gaW5jcmVhc2UgaW4gcG9wdWxhdGlvbiBncm93dGggd291bGQgbGVhZCB0byBhbiBpbmNyZWFzZSBpbiBHRFAgcGVyIGNhcGl0YSwgYnV0IGJleW9uZCBhIGNlcnRhaW4gcG9pbnQsIGEgZnVydGhlciBpbmNyZWFzZSBpbiBwb3B1bGF0aW9uIGdyb3d0aCB3b3VsZCByZXN1bHQgaW4gYSBkZWNyZWFzZSBpbiBHRFAgcGVyIGNhcGl0YS4qKg0KDQoNCmBgYHtyIDcuM30NCkNoYW5nZV9pbl9HRFBfcGVyX2NhcGl0YSA9IC0wLjEyNTUgKjMgDQpDaGFuZ2VfaW5fR0RQX3Blcl9jYXBpdGENCmBgYA0KIyMgNy4zKSBJbnRlcnByZXQgdGhlIGltcGFjdCBvZiBwb3B1bGF0aW9uIGdyb3d0aCBvbiB0aGUgR0RQIHBlciBjYXBpdGEgaW4gUTcgd2hlbiBwb3B1bGF0aW9uIGdyb3d0aCBpcyAzJS4gKDMgbWFya3MpDQoqKlRoZSBjb2VmZmljaWVudCBvZiB0aGUgdmFyaWFibGUgIlBvcHVsYXRpb24gZ3Jvd3RoICglIGFubnVhbCkiIGlzIG5lZ2F0aXZlICgtMC4xMjU1KS5UaGlzIG1lYW5zIHRoYXQgZm9yIGV2ZXJ5IDElIGluY3JlYXNlIGluIHBvcHVsYXRpb24gZ3Jvd3RoLCB0aGUgR0RQIHBlciBjYXBpdGEgaXMgZXhwZWN0ZWQgdG8gZGVjcmVhc2UgYnkgYXBwcm94aW1hdGVseSAwLjEyNTUgdW5pdHMsIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC5UaGlzIG1lYW5zIHRoYXQgd2hlbiBwb3B1bGF0aW9uIGdyb3d0aCBpcyAzJSwgdGhlIEdEUCBwZXIgY2FwaXRhIGlzIGV4cGVjdGVkIHRvIGRlY3JlYXNlIGJ5IGFwcHJveGltYXRlbHkgMC4zNzY1IHVuaXRzLCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuKioNCg0KDQoNCiMjIDgpIFJ1biB0aGUgZm9sbG93aW5nIHJlZ3Jlc3Npb246DQpgYGB7ciByZWd9DQpsbShmb3JtdWxhID0gR0RQcGNfbG9nIH4gbmV3X3Jhd2RhdGEkYFRvdGFsIGFsY29ob2wgY29uc3VtcHRpb24gcGVyIGNhcGl0YSwgKGxpdGVycyBvZiBwdXJlIGFsY29ob2wsICsxNSB5ZWFycyBvZiBhZ2UpIFtTSC5BTEMuUENBUC5MSV1gLCBkYXRhID0gbmV3X3Jhd2RhdGEpDQoNCg0KYGBgDQojIyA4LjEpIENvbW1lbnQgb24gaG93IHRoZSBjb2VmZmljaWVudCBvbiDigJxBbGNv4oCdIGRpZmZlcnMgZnJvbSB0aGF0IG9mIFExISAoMSBtYXJrKQ0KKipJbiBRMSB0aGUgY29lZmZpY2llbnQgb24gIkFsY28iIHdhcyAwLjAyNDcsIHdoaWxlIGluIHRoaXMgcXVlc3Rpb24sIHRoZSBjb2VmZmljaWVudCBvbiAiQWxjbyIgaXMgMC4xMTY3LiBUaGlzIG1lYW5zIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFsY29ob2wgY29uc3VtcHRpb24gcGVyIGNhcGl0YSBhbmQgR0RQIHBlciBjYXBpdGEgaXMgc3Ryb25nZXIgd2hlbiBvdGhlciB2YXJpYWJsZXMgYXJlIG5vdCBjb25zaWRlcmVkIGluIHRoZSBtb2RlbC4qKg0KDQojIyA4LjIpIFdoeSBkbyB5b3Ugb2JzZXJ2ZSB0aGlzIGRpZmZlcmVuY2UgYW5kIHdoYXQgZG9lcyBpdCBtZWFuIGZvciB0aGUgKHVuKWJpYXNlZG5lc3Mgb2YgdGhlIGNvZWZmaWNpZW50IGluIFE4PyAgKDIgbWFyaykNCioqI1RoZSBkaWZmZXJlbmNlIGluIHRoZSBjb2VmZmljaWVudCBvbiAiQWxjbyIgYmV0d2VlbiB0aGUgdHdvIG1vZGVscyBjb3VsZCBiZSBkdWUgdG8gdGhlIHByZXNlbmNlIG9mIG90aGVyIHZhcmlhYmxlcyBpbiB0aGUgbXVsdGlwbGUgcmVncmVzc2lvbiBtb2RlbCBvZiBRMS5UaGlzIGlzIGR1ZSB0byBtdWx0aWNvbGxpbmVhcml0eS4gVGhlIGluY2x1c2lvbiBvZiBvdGhlciB2YXJpYWJsZXMgaW4gYSByZWdyZXNzaW9uIGNhbiByZWR1Y2UgdGhlIGJpYXMgb2YgdGhlIGNvZWZmaWNpZW50cy4qKg0KDQoNCg0KIyMgOSkgRGVzY3JpYmUgZWFjaCBvZiB0aGUgR2F1c3MgTWFya292IEFzc3VtcHRpb25zICgyLjUgbWFya3MpIGFuZCBzcGVjaWZpY2FsbHkgZXhwbGFpbiBpZiB0aGV5IGFyZSBsaWtlbHkgdG8gaG9sZCBmb3IgdGhlIHJlZ3Jlc3Npb24gaW4gUTEgb3Igbm90ICgyLjUgbWFya3MpLg0KDQoqKkxpbmVhcml0eTogVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgKEdEUHBjX2xvZykgYW5kIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgKENvbnN1bXB0aW9uX3BjX2xvZywgVHJhZGUgKCUgb2YgR0RQKSwgVG90YWwgYWxjb2hvbCBjb25zdW1wdGlvbiBwZXIgY2FwaXRhLCBQb3B1bGF0aW9uIGdyb3d0aCAoJSBhbm51YWwpKSBpcyBhc3N1bWVkIHRvIGJlIGxpbmVhci4qKg0KKipJbmRlcGVuZGVuY2Ugb2YgZXJyb3JzOiBlcnJvcnMgYXJlIGFzc3VtZWQgdG8gYmUgaW5kZXBlbmRlbnQgYW5kIGlkZW50aWNhbGx5IGRpc3RyaWJ1dGVkLioqDQoqKkhvbW9zY2VkYXN0aWNpdHk6IGl0cyBhc3N1bWVkIHRoYXQgdGhlIHZhcmlhbmNlIG9mIHRoZSBlcnJvcnMgaXMgY29uc3RhbnQgYWNyb3NzIGFsbCB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGVzKioNCioqTm8gcGVyZmVjdCBtdWx0aWNvbGxpbmVhcml0eTppdHMgYXNzdW1lIHRoYXQgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBhcmUgbm90IHBlcmZlY3RseSBjb3JyZWxhdGVkIHdpdGggZWFjaCBvdGhlci4qKg0KKipaZXJvIGNvbmRpdGlvbmFsIG1lYW46aXRzIGFzc3VtZSB0aGF0IHRoZSBlcnJvcnMgaGF2ZSBhIG1lYW4gb2YgemVybyBjb25kaXRpb25hbCBvbiB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGVzLioqDQoNCg0KDQojIyAxMCkgUHJlc2VudCBhIGZ1bmN0aW9uaW5nIFIgY29kZSByZXByb2R1Y2luZyB0aGUgcmVzdWx0cy4JDQpgYGB7ciBsaW5lYWxpdHl9DQpwbG90KG1vZGVsJGZpdHRlZC52YWx1ZXMsIG1vZGVsJHJlc2lkdWFscywgeGxhYiA9ICJGaXR0ZWQgdmFsdWVzIiwgeWxhYiA9ICJSZXNpZHVhbHMiKQ0KYWJsaW5lKGggPSAwKQ0KDQpgYGANCg0KDQojIDIuSW5kZXBlbmRlbmNlIG9mIGVycm9ycw0KYGBge3IgZXJyfQ0KcGxvdChtb2RlbCRyZXNpZHVhbHMgfiBuZXdfcmF3ZGF0YSRgVG90YWwgYWxjb2hvbCBjb25zdW1wdGlvbiBwZXIgY2FwaXRhLCAobGl0ZXJzIG9mIHB1cmUgYWxjb2hvbCwgKzE1IHllYXJzIG9mIGFnZSkgW1NILkFMQy5QQ0FQLkxJXWAsIA0KICAgICB4bGFiID0gIkFsY29ob2wgQ29uc3VtcHRpb24iLCB5bGFiID0gIlJlc2lkdWFscyIpDQpgYGANCg0KIyAzLiBIb21vc2NlZGFzdGljaXR5IG9mIGVycm9ycw0KYGBge3IgaG9tb3NjZWRhc3RpY2l0eX0NCnBsb3QobW9kZWwkZml0dGVkLnZhbHVlcywgYWJzKG1vZGVsJHJlc2lkdWFscyksIHhsYWIgPSAiRml0dGVkIHZhbHVlcyIsIHlsYWIgPSAiQWJzb2x1dGUgcmVzaWR1YWxzIikNCmFibGluZShoID0gbWVhbihhYnMobW9kZWwkcmVzaWR1YWxzKSksIGx0eSA9IDIpDQpgYGANCg0KIyA0LiBOb3JtYWxpdHkgb2YgZXJyb3JzDQpgYGB7ciBub3JtYWxpdHl9DQpxcW5vcm0obW9kZWwkcmVzaWR1YWxzKQ0KcXFsaW5lKG1vZGVsJHJlc2lkdWFscykNCmBgYA0KDQojIDUuIE5vIG11bHRpY29sbGluZWFyaXR5IGFtb25nIHByZWRpY3RvcnMNCmBgYHtyIG11bHRpY29sbH0NCmNvcihuZXdfcmF3ZGF0YVtjKCJHRFBwY19sb2ciLCAiQ29uc3VtcHRpb25fcGNfbG9nIiwgIlRyYWRlICglIG9mIEdEUCkgW05FLlRSRC5HTkZTLlpTXSIsICJUb3RhbCBhbGNvaG9sIGNvbnN1bXB0aW9uIHBlciBjYXBpdGEsIChsaXRlcnMgb2YgcHVyZSBhbGNvaG9sLCArMTUgeWVhcnMgb2YgYWdlKSBbU0guQUxDLlBDQVAuTEldIiwgIlBvcHVsYXRpb24gZ3Jvd3RoICglIGFubnVhbCkgW1NQLlBPUC5HUk9XXSIpXSkNCg0KYGBgDQoNCg0KDQoNCg0K