library(ggplot2)
library(dplyr)
library(knitr)
library(kableExtra)
#library(broom)
# Load the data into a dataframe
country_stats <- read.csv('who.csv')

Week 12, Regression Analysis in R part 2: 11-15 Apr

About the data

The attached who.csv dataset contains real-world data from 2008. The variables included follow.

Variable Description
Country name of the country
LifeExp average life expectancy for the country in years
InfantSurvival proportion of those surviving to one year or more
Under5Survival proportion of those surviving to five years or more
TBFree proportion of the population without TB.
PropMD proportion of the population who are MDs
PropRN proportion of the population who are RNs
PersExp mean personal expenditures on healthcare in US dollars at average exchange rate
GovtExp mean government expenditures per capita on healthcare, US dollars at average exchange rate
TotExp sum of personal and government expenditures.


Exercise 1

Provide a scatterplot of LifeExp ~ TotExp, and run simple linear regression. Do not transform the variables. Provide and interpret the F statistics, \(R^2\), standard error, and p-values only. Discuss whether the assumptions of simple linear regression met.

Generate a scatter plot

plot(x = country_stats$TotExp, y = country_stats$LifeExp)

The plot above does not resemble a roughly linear correlation between TotExp and LifeExp.

This figure shows that the life expentancy tends to fluctuate (large spread) between 40 and 75 for values of Total Expense under 70,000. However, The life expectancy tends to remain above 75 for Total Expense values above 70,000.

Fit a simple linear regression model

ex1_lm <- lm(formula = LifeExp ~ TotExp, data = country_stats)
ex1_lm_summary <- summary(ex1_lm)

#[1] "call"          "terms"         "residuals"     "coefficients"  "aliased"       "sigma"     
#[7] "df"            "r.squared"     "adj.r.squared" "fstatistic"    "cov.unscaled" 

ex1_fstat       <- ex1_lm_summary$fstatistic
ex1_rsquared    <- ex1_lm_summary$r.squared
ex1_res_std_err <- ex1_lm_summary$sigma
ex1_pVal        <- anova(ex1_lm)$'Pr(>F)'[1]

Show model’s quality measurement statistics

Item Value
F-Statistic 65.2641982, 1, 188
Multiple R-squared 0.2576922
Residual standard error 9.3710333
p-value 7.7139931^{-14}

Evaluate model’s quality measurement statistics

Evaluate F-Statistic

The F-statistic value compares the current model to a model that has one fewer parameters. Because the one-factor model already has only a single parameter, this test is not particularly useful in this case.

Evaluate Multiple R-squared

The Multiple R-squared value is a number between 0 and 1. It is a statistical measure of how well the model describes the measured data. The reported \(R^2\) of 0.2576922 for this model means that the model explains 25.77 percent of the data’s variation.

Evaluate Residual standard error

In a good linear model the, if the residuals are distributed normally, the first and third quantiles of the previous residuals should be about 1.5 times this standard error.

Show the Q1 and Q3 for the model’s residuals

summary(ex1_lm_summary$residuals)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#> -24.764  -4.778   3.154   0.000   7.116  13.292

From the summary above we see that,

  • Q1 of -4.778 is only -0.51 times of the Residual standard error (9.371).

  • Q3 of 7.116 is only 0.76 times of the Residual standard error (9.371).

Therefore, the residuals do not seem to be distributed normally.

Evaluate p-value

The Pr(>|t|) shows the probability that the corresponding coefficient is not relevant in the model. This value is also known as the significance or p-value of the coefficient.

In this model,

  • the probability that “TotExp” is not relevant in this model is \(7.7139931\times 10^{-14}\) - a tiny value less than 0.05. This means that “TotExp” (sum of personal and government expenditures) is relevant in the model.
  • the probability that the intercept is not relevant in this model is \(7.8070708\times 10^{-153}\) - a tiny value far less than 0.05. This means that the intercept is relevant in the model.


Exercise 2

Raise life expectancy to the 4.6 power (i.e., \(LifeExp^{4.6}\)). Raise total expenditures to the 0.06 power (nearly a log transform, \(TotExp^{.06}\)). Plot \(LifeExp^{4.6}\) as a function of \(TotExp^{.06}\), and r re-run the simple regression model using the transformed variables. Provide and interpret the F statistics, \(R^2\), standard error, and p-values. Which model is “better?”


Generate a scatter plot

plot(x = I(country_stats$TotExp ^ 0.06), y = I(country_stats$LifeExp ^ 4.6))

The plot above does resemble a roughly positive linear correlation between TotExp and LifeExp. The life expentancy tends to increase as the values of Total Expense increase.

Fit a simple linear regression model

ex2_lm <- lm(formula = I(LifeExp ^ 4.6) ~ I(TotExp ^ 0.06), data = country_stats)
ex2_lm_summary <- summary(ex2_lm)

#[1] "call"          "terms"         "residuals"     "coefficients"  "aliased"       "sigma"     
#[7] "df"            "r.squared"     "adj.r.squared" "fstatistic"    "cov.unscaled" 

ex2_fstat       <- ex2_lm_summary$fstatistic
ex2_rsquared    <- ex2_lm_summary$r.squared
ex2_res_std_err <- ex2_lm_summary$sigma
ex2_pVal        <- anova(ex2_lm)$'Pr(>F)'[1]

Show model’s quality measurement statistics

Item Value
F-Statistic 507.6967054, 1, 188
Multiple R-squared 0.7297673
Residual standard error 9.0492393^{7}
p-value 2.6014284^{-55}

Evaluate model’s quality measurement statistics

Evaluate F-Statistic

The F-statistic value compares the current model to a model that has one fewer parameters. Because the one-factor model already has only a single parameter, this test is not particularly useful in this case.

Evaluate Multiple R-squared

The Multiple R-squared value is a number between 0 and 1. It is a statistical measure of how well the model describes the measured data. The reported \(R^2\) of 0.7297673 for this model means that the model explains 72.98 percent of the data’s variation. This is a big improvement over the 25.77 percent reported in Exercise 1.


Evaluate Residual standard error

In a good linear model the, if the residuals are distributed normally, the first and third quantiles of the previous residuals should be about 1.5 times this standard error.

Show the Q1 and Q3 for the model’s residuals

summary(ex2_lm_summary$residuals)
#>       Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
#> -308616089  -53978977   13697187          0   59139231  211951764

From the summary above we see that,

  • Q1 of -5.3978977^{7} is only -0.6 times of the Residual standard error (9.0492393^{7}).

  • Q3 of 5.9139231^{7} is only 0.65 times of the Residual standard error (9.0492393^{7}).

Therefore, the residuals do not seem to be distributed normally.

Evaluate p-value

The Pr(>|t|) shows the probability that the corresponding coefficient is not relevant in the model. This value is also known as the significance or p-value of the coefficient.

In this model,

  • the probability that \(TotExp ^ {0.06}\) is not relevant in this model is \(2.6014284\times 10^{-55}\) - a tiny value less than 0.05. This means that \(TotExp ^ {0.06}\) (sum of personal and government expenditures) is relevant in the model.
  • the probability that the intercept is not relevant in this model is \(3.9117741\times 10^{-36}\) - a tiny value far less than 0.05. This means that the intercept is relevant in the model.

Exercise 3

Using the results from Exercise 2, forecast life expectancy when \(TotExp^{.06} = 1.5\). Then forecast life expectancy when \(TotExp{^.06} = 2.5\).

From exercise 2, the y-intercept is \(a_0 = -736527910\) and the slope is \(a_1 = 620060216\). Thus, the final regression model is:

\(LifeExp^{4.6} = -736527910 + 620060216 * TotExp^{0.06}\)

Using the above equation we can calculate life expectancy as:

  • If \(TotExp^{.06} = 1.5\), then \(LifeExp^{4.6} = -736527910 + 620060216 * 1.5 = 1.9356241\times 10^{8}\)

  • If \(TotExp^{.06} = 2.5\), then \(LifeExp^{4.6} = -736527910 + 620060216 * 2.5 = 8.1362263\times 10^{8}\)


Exercise 4

Build the following multiple regression model and interpret the F Statistics, \(R^2\), standard error, and p-values. How good is the model?

\(LifeExp = b0 + b1 * PropMd + b2 * TotExp + b3 * PropMD * TotExp\)

Fit a simple linear regression model

ex4_lm <- lm(formula = LifeExp ~ PropMD + TotExp + I(PropMD * TotExp), data = country_stats)
ex4_lm_summary <- summary(ex4_lm)

#[1] "call"          "terms"         "residuals"     "coefficients"  "aliased"       "sigma"     
#[7] "df"            "r.squared"     "adj.r.squared" "fstatistic"    "cov.unscaled" 

ex4_fstat       <- ex4_lm_summary$fstatistic
ex4_rsquared    <- ex4_lm_summary$r.squared
ex4_res_std_err <- ex4_lm_summary$sigma
ex4_pVal        <- anova(ex4_lm)$'Pr(>F)'[1]

Show model’s quality measurement statistics

Item Value
F-Statistic 34.4883268, 3, 186
Multiple R-squared 0.3574352
Residual standard error 8.7654934
p-value 3.3134579^{-9}

Evaluate model’s quality measurement statistics

Evaluate F-Statistic

The F-statistic value compares the current model to a model that has one fewer parameters. Because the one-factor model already has only a single parameter, this test is not particularly useful in this case.

Evaluate Multiple R-squared

The Multiple R-squared value is a number between 0 and 1. It is a statistical measure of how well the model describes the measured data. The reported \(R^2\) of 0.3574352 for this model means that the model explains 35.74 percent of the data’s variation.

Evaluate Residual standard error

In a good linear model the, if the residuals are distributed normally, the first and third quantiles of the previous residuals should be about 1.5 times this standard error.

Show the Q1 and Q3 for the model’s residuals

summary(ex4_lm_summary$residuals)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#> -27.320  -4.132   2.098   0.000   6.540  13.074

From the summary above we see that,

  • Q1 of -4.132 is only -0.47 times of the Residual standard error (8.765).

  • Q3 of 6.54 is only 0.75 times of the Residual standard error (8.765).

Therefore, the residuals do not seem to be distributed normally.

Evaluate p-value

The Pr(>|t|) shows the probability that the corresponding coefficient is not relevant in the model. This value is also known as the significance or p-value of the coefficient.

In this model,

  • the probability that “TotExp” is not relevant in this model is \(3.3134579\times 10^{-9}\) - a tiny value less than 0.05. This means that “TotExp” (sum of personal and government expenditures) is relevant in the model.
  • the probability that the intercept is not relevant in this model is \(6.2071874\times 10^{-145}\) - a tiny value far less than 0.05. This means that the intercept is relevant in the model.


Exercise 5

Forecast LifeExp when \(PropMD = .03\) and \(TotExp = 14\). Does this forecast seem realistic? Why or why not?

Based on the results from Exercise 4, the below model

\(LifeExp = b0 + b1 * PropMd + 7.233^{-5} * TotExp + b3 * PropMD * TotExp\)

can be re-written as

\(LifeExp = 62.77 + 1497 * PropMd + 0.00007233 * TotExp - 0.006026 * PropMD * TotExp\)

Using the above equation we can calculate Life Expectancy as:

  • If \(PropMD = .03\) and \(TotExp = 14\), then \(LifeExp = 62.77 + 1497 * .03 + 0.00007233 * 14 - 0.006026 * .03 * 14 = 107.68\)

The life expectancy forecast of 107.68 does not seem realistic because

  • the actual life expectance values in the original source data range only from 40 to 83.
  • if TotExp (sum of personal and government expenditures) is 14, then it does not make sense that such a small expenditure could help increase a person’s life expectancy to the point of exceeding that of all the rest of the life expectancy values for the reported countries.


LS0tDQp0aXRsZTogIkRBVEE2MDUgLSBIb21ld29yayAxMiINCmF1dGhvcjogIkVzdGViYW4gQXJhbWF5byINCmRhdGU6ICIyMDIyLTA0LTE1Ig0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQpgYGB7ciBnbG9iYWwtb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gIiM+IiApDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KI2xpYnJhcnkoYnJvb20pDQpgYGANCg0KIA0KYGBge3J9DQojIExvYWQgdGhlIGRhdGEgaW50byBhIGRhdGFmcmFtZQ0KY291bnRyeV9zdGF0cyA8LSByZWFkLmNzdignd2hvLmNzdicpDQpgYGANCg0KDQoNCiMgV2VlayAxMiwgUmVncmVzc2lvbiBBbmFseXNpcyBpbiBSIHBhcnQgMjogMTEtMTUgQXByDQoNCg0KIyMgQWJvdXQgdGhlIGRhdGENCg0KVGhlIGF0dGFjaGVkICp3aG8uY3N2KiBkYXRhc2V0IGNvbnRhaW5zIHJlYWwtd29ybGQgZGF0YSBmcm9tIDIwMDguIFRoZSB2YXJpYWJsZXMgaW5jbHVkZWQgZm9sbG93Lg0KDQpWYXJpYWJsZSB8IERlc2NyaXB0aW9uDQotLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KQ291bnRyeSAgfCBuYW1lIG9mIHRoZSBjb3VudHJ5DQpMaWZlRXhwICB8IGF2ZXJhZ2UgbGlmZSBleHBlY3RhbmN5IGZvciB0aGUgY291bnRyeSBpbiB5ZWFycw0KSW5mYW50U3Vydml2YWwgfCBwcm9wb3J0aW9uIG9mIHRob3NlIHN1cnZpdmluZyB0byBvbmUgeWVhciBvciBtb3JlDQpVbmRlcjVTdXJ2aXZhbCB8IHByb3BvcnRpb24gb2YgdGhvc2Ugc3Vydml2aW5nIHRvIGZpdmUgeWVhcnMgb3IgbW9yZQ0KVEJGcmVlIHwgIHByb3BvcnRpb24gb2YgdGhlIHBvcHVsYXRpb24gd2l0aG91dCBUQi4NClByb3BNRCB8IHByb3BvcnRpb24gb2YgdGhlIHBvcHVsYXRpb24gd2hvIGFyZSBNRHMNClByb3BSTiB8IHByb3BvcnRpb24gb2YgdGhlIHBvcHVsYXRpb24gd2hvIGFyZSBSTnMNClBlcnNFeHB8IG1lYW4gcGVyc29uYWwgZXhwZW5kaXR1cmVzIG9uIGhlYWx0aGNhcmUgaW4gVVMgZG9sbGFycyBhdCBhdmVyYWdlIGV4Y2hhbmdlIHJhdGUNCkdvdnRFeHB8IG1lYW4gZ292ZXJubWVudCBleHBlbmRpdHVyZXMgcGVyIGNhcGl0YSBvbiBoZWFsdGhjYXJlLCBVUyBkb2xsYXJzIGF0IGF2ZXJhZ2UgZXhjaGFuZ2UgcmF0ZQ0KVG90RXhwIHwgc3VtIG9mIHBlcnNvbmFsIGFuZCBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlcy4NCg0KPGJyPg0KDQojIyBFeGVyY2lzZSAxDQoNClByb3ZpZGUgYSBzY2F0dGVycGxvdCBvZiAqKkxpZmVFeHAgfiBUb3RFeHAqKiwgYW5kIHJ1biBzaW1wbGUgbGluZWFyIHJlZ3Jlc3Npb24uIERvIG5vdCB0cmFuc2Zvcm0gdGhlIHZhcmlhYmxlcy4gUHJvdmlkZSBhbmQgaW50ZXJwcmV0IHRoZSBGIHN0YXRpc3RpY3MsICRSXjIkLCBzdGFuZGFyZCBlcnJvciwgYW5kIHAtdmFsdWVzIG9ubHkuIERpc2N1c3Mgd2hldGhlciB0aGUgYXNzdW1wdGlvbnMgb2Ygc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIG1ldC4NCg0KIyMjIEdlbmVyYXRlIGEgc2NhdHRlciBwbG90DQoNCmBgYHtyfQ0KcGxvdCh4ID0gY291bnRyeV9zdGF0cyRUb3RFeHAsIHkgPSBjb3VudHJ5X3N0YXRzJExpZmVFeHApDQpgYGANClRoZSBwbG90IGFib3ZlIGRvZXMgbm90IHJlc2VtYmxlIGEgcm91Z2hseSBsaW5lYXIgY29ycmVsYXRpb24gYmV0d2VlbiBUb3RFeHAgYW5kIExpZmVFeHAuDQoNClRoaXMgZmlndXJlIHNob3dzIHRoYXQgdGhlIGxpZmUgZXhwZW50YW5jeSB0ZW5kcyB0byBmbHVjdHVhdGUgKGxhcmdlIHNwcmVhZCkgYmV0d2VlbiA0MCBhbmQgNzUgZm9yIHZhbHVlcyBvZiBUb3RhbCBFeHBlbnNlIHVuZGVyIDcwLDAwMC4gSG93ZXZlciwgVGhlIGxpZmUgZXhwZWN0YW5jeSB0ZW5kcyB0byByZW1haW4gYWJvdmUgNzUgZm9yIFRvdGFsIEV4cGVuc2UgdmFsdWVzIGFib3ZlIDcwLDAwMC4gDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRSwgcmVuZGVyPUZBTFNFfQ0KI2FibGluZShleDFfbG0pDQpgYGANCg0KDQojIyMgRml0IGEgc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsDQoNCmBgYHtyfQ0KZXgxX2xtIDwtIGxtKGZvcm11bGEgPSBMaWZlRXhwIH4gVG90RXhwLCBkYXRhID0gY291bnRyeV9zdGF0cykNCmV4MV9sbV9zdW1tYXJ5IDwtIHN1bW1hcnkoZXgxX2xtKQ0KDQojWzFdICJjYWxsIiAgICAgICAgICAidGVybXMiICAgICAgICAgInJlc2lkdWFscyIgICAgICJjb2VmZmljaWVudHMiICAiYWxpYXNlZCIgICAgICAgInNpZ21hIiAgICAgDQojWzddICJkZiIgICAgICAgICAgICAici5zcXVhcmVkIiAgICAgImFkai5yLnNxdWFyZWQiICJmc3RhdGlzdGljIiAgICAiY292LnVuc2NhbGVkIiANCg0KZXgxX2ZzdGF0ICAgICAgIDwtIGV4MV9sbV9zdW1tYXJ5JGZzdGF0aXN0aWMNCmV4MV9yc3F1YXJlZCAgICA8LSBleDFfbG1fc3VtbWFyeSRyLnNxdWFyZWQNCmV4MV9yZXNfc3RkX2VyciA8LSBleDFfbG1fc3VtbWFyeSRzaWdtYQ0KZXgxX3BWYWwgICAgICAgIDwtIGFub3ZhKGV4MV9sbSkkJ1ByKD5GKSdbMV0NCg0KYGBgDQoNCiMjIyBTaG93IG1vZGVsJ3MgcXVhbGl0eSBtZWFzdXJlbWVudCBzdGF0aXN0aWNzDQoNCkl0ZW0gICAgICAgICAgICAgICAgICAgIHwgVmFsdWUNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRi1TdGF0aXN0aWMgICAgICAgICAgICAgfCBgciBleDFfZnN0YXRgDQpNdWx0aXBsZSBSLXNxdWFyZWQgICAgICB8IGByIGV4MV9yc3F1YXJlZGANClJlc2lkdWFsIHN0YW5kYXJkIGVycm9yIHwgYHIgZXgxX3Jlc19zdGRfZXJyYA0KcC12YWx1ZSAgICAgICAgICAgICAgICAgfCBgciBleDFfcFZhbGANCg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFLCByZW5kZXI9RkFMU0V9DQojZ2xhbmNlKGV4MV9sbSkNCmBgYA0KDQojIyMgRXZhbHVhdGUgbW9kZWwncyBxdWFsaXR5IG1lYXN1cmVtZW50IHN0YXRpc3RpY3MNCg0KDQojIyMjIEV2YWx1YXRlIEYtU3RhdGlzdGljDQoNClRoZSBGLXN0YXRpc3RpYyB2YWx1ZSBjb21wYXJlcyB0aGUgY3VycmVudCBtb2RlbCB0byBhIG1vZGVsIHRoYXQgaGFzIG9uZSBmZXdlciBwYXJhbWV0ZXJzLiBCZWNhdXNlIHRoZSBvbmUtZmFjdG9yIG1vZGVsIGFscmVhZHkgaGFzIG9ubHkgYSBzaW5nbGUgcGFyYW1ldGVyLCB0aGlzIHRlc3QgaXMgbm90IHBhcnRpY3VsYXJseSB1c2VmdWwgaW4gdGhpcyBjYXNlLg0KPGJyPg0KDQojIyMjIEV2YWx1YXRlIE11bHRpcGxlIFItc3F1YXJlZA0KDQpUaGUgTXVsdGlwbGUgUi1zcXVhcmVkIHZhbHVlIGlzIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMS4gSXQgaXMgYSBzdGF0aXN0aWNhbCBtZWFzdXJlIG9mIGhvdyB3ZWxsIHRoZSBtb2RlbCBkZXNjcmliZXMgdGhlIG1lYXN1cmVkIGRhdGEuIFRoZSByZXBvcnRlZCAkUl4yJCBvZiAqKmByIGV4MV9yc3F1YXJlZGAqKiBmb3IgdGhpcyBtb2RlbCBtZWFucyB0aGF0IHRoZSBtb2RlbCBleHBsYWlucyAqKmByIHJvdW5kKGV4MV9yc3F1YXJlZCAqIDEwMCwgMilgKiogcGVyY2VudCBvZiB0aGUgZGF0YeKAmXMgdmFyaWF0aW9uLg0KPGJyPg0KDQoNCiMjIyMgRXZhbHVhdGUgUmVzaWR1YWwgc3RhbmRhcmQgZXJyb3INCg0KSW4gYSBnb29kIGxpbmVhciBtb2RlbCB0aGUsIGlmIHRoZSByZXNpZHVhbHMgYXJlIGRpc3RyaWJ1dGVkIG5vcm1hbGx5LCB0aGUgZmlyc3QgYW5kIHRoaXJkIHF1YW50aWxlcyBvZiB0aGUgcHJldmlvdXMgcmVzaWR1YWxzIHNob3VsZCBiZSBhYm91dCAxLjUgdGltZXMgdGhpcyBzdGFuZGFyZCBlcnJvci4NCg0KU2hvdyB0aGUgUTEgYW5kIFEzIGZvciB0aGUgbW9kZWwncyByZXNpZHVhbHMNCg0KYGBge3J9DQpzdW1tYXJ5KGV4MV9sbV9zdW1tYXJ5JHJlc2lkdWFscykNCmBgYA0KDQoNCkZyb20gdGhlIHN1bW1hcnkgYWJvdmUgd2Ugc2VlIHRoYXQsDQoNCi0gKipRMSoqIG9mICoqYHIgcm91bmQocXVhbnRpbGUoZXgxX2xtX3N1bW1hcnkkcmVzaWR1YWxzLCAuMjUpLCAzKWAqKiBpcyBvbmx5ICoqYHIgcm91bmQocXVhbnRpbGUoZXgxX2xtX3N1bW1hcnkkcmVzaWR1YWxzLCAuMjUpIC8gZXgxX3Jlc19zdGRfZXJyLCAyKWAqKiB0aW1lcyBvZiB0aGUgKipSZXNpZHVhbCBzdGFuZGFyZCBlcnJvcioqIChgciByb3VuZChleDFfcmVzX3N0ZF9lcnIsIDMpYCkuDQoNCi0gKipRMyoqIG9mICoqYHIgcm91bmQocXVhbnRpbGUoZXgxX2xtX3N1bW1hcnkkcmVzaWR1YWxzLCAuNzUpLCAzKWAqKiBpcyBvbmx5ICoqYHIgcm91bmQocXVhbnRpbGUoZXgxX2xtX3N1bW1hcnkkcmVzaWR1YWxzLCAuNzUpIC8gZXgxX3Jlc19zdGRfZXJyLCAyKWAqKiB0aW1lcyBvZiB0aGUgKipSZXNpZHVhbCBzdGFuZGFyZCBlcnJvcioqIChgciByb3VuZChleDFfcmVzX3N0ZF9lcnIsIDMpYCkuDQoNClRoZXJlZm9yZSwgdGhlIHJlc2lkdWFscyBkbyBub3Qgc2VlbSB0byBiZSBkaXN0cmlidXRlZCBub3JtYWxseS4NCjxicj4NCg0KIyMjIyBFdmFsdWF0ZSBwLXZhbHVlDQoNClRoZSBQcig+fHR8KSBzaG93cyB0aGUgcHJvYmFiaWxpdHkgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBjb2VmZmljaWVudCBpcyBub3QgcmVsZXZhbnQgaW4gdGhlIG1vZGVsLiBUaGlzIHZhbHVlIGlzIGFsc28ga25vd24gYXMgdGhlIHNpZ25pZmljYW5jZSBvciBwLXZhbHVlIG9mIHRoZSBjb2VmZmljaWVudC4NCg0KSW4gdGhpcyBtb2RlbCwgDQoNCi0gdGhlIHByb2JhYmlsaXR5IHRoYXQgKioiVG90RXhwIioqIGlzIG5vdCByZWxldmFudCBpbiB0aGlzIG1vZGVsIGlzICoqJGByIGV4MV9wVmFsYCQqKiAtIGEgdGlueSB2YWx1ZSBsZXNzIHRoYW4gMC4wNS4gVGhpcyBtZWFucyB0aGF0ICoqIlRvdEV4cCIqKiAoc3VtIG9mIHBlcnNvbmFsIGFuZCBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlcykgaXMgcmVsZXZhbnQgaW4gdGhlIG1vZGVsLg0KLSB0aGUgcHJvYmFiaWxpdHkgdGhhdCB0aGUgKippbnRlcmNlcHQqKiBpcyBub3QgcmVsZXZhbnQgaW4gdGhpcyBtb2RlbCBpcyAqKiRgciBleDFfbG1fc3VtbWFyeSRjb2VmZmljaWVudHNbMSw0XWAkKiogLSBhIHRpbnkgdmFsdWUgZmFyIGxlc3MgdGhhbiAwLjA1LiBUaGlzIG1lYW5zIHRoYXQgdGhlIGludGVyY2VwdCBpcyByZWxldmFudCBpbiB0aGUgbW9kZWwuDQoNCg0KPGJyPg0KDQoNCg0KDQoNCiMjIEV4ZXJjaXNlIDINCg0KUmFpc2UgbGlmZSBleHBlY3RhbmN5IHRvIHRoZSA0LjYgcG93ZXIgKGkuZS4sICRMaWZlRXhwXns0LjZ9JCkuIFJhaXNlIHRvdGFsIGV4cGVuZGl0dXJlcyB0byB0aGUgMC4wNiBwb3dlciAobmVhcmx5IGEgbG9nIHRyYW5zZm9ybSwgJFRvdEV4cF57LjA2fSQpLiBQbG90ICRMaWZlRXhwXns0LjZ9JCBhcyBhIGZ1bmN0aW9uIG9mICRUb3RFeHBeey4wNn0kLCBhbmQgciByZS1ydW4gdGhlIHNpbXBsZSByZWdyZXNzaW9uIG1vZGVsIHVzaW5nIHRoZSB0cmFuc2Zvcm1lZCB2YXJpYWJsZXMuIFByb3ZpZGUgYW5kIGludGVycHJldCB0aGUgRiBzdGF0aXN0aWNzLCAkUl4yJCwgc3RhbmRhcmQgZXJyb3IsIGFuZCBwLXZhbHVlcy4gV2hpY2ggbW9kZWwgaXMgImJldHRlcj8iDQoNCjxicj4NCg0KIyMjIEdlbmVyYXRlIGEgc2NhdHRlciBwbG90DQoNCmBgYHtyfQ0KcGxvdCh4ID0gSShjb3VudHJ5X3N0YXRzJFRvdEV4cCBeIDAuMDYpLCB5ID0gSShjb3VudHJ5X3N0YXRzJExpZmVFeHAgXiA0LjYpKQ0KYGBgDQoNClRoZSBwbG90IGFib3ZlIGRvZXMgcmVzZW1ibGUgYSByb3VnaGx5IHBvc2l0aXZlIGxpbmVhciBjb3JyZWxhdGlvbiBiZXR3ZWVuIFRvdEV4cCBhbmQgTGlmZUV4cC4gVGhlIGxpZmUgZXhwZW50YW5jeSB0ZW5kcyB0byBpbmNyZWFzZSBhcyB0aGUgdmFsdWVzIG9mIFRvdGFsIEV4cGVuc2UgaW5jcmVhc2UuIA0KDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRSwgcmVuZGVyPUZBTFNFfQ0KI2FibGluZShleDFfbG0pDQpgYGANCg0KDQojIyMgRml0IGEgc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsDQoNCmBgYHtyfQ0KZXgyX2xtIDwtIGxtKGZvcm11bGEgPSBJKExpZmVFeHAgXiA0LjYpIH4gSShUb3RFeHAgXiAwLjA2KSwgZGF0YSA9IGNvdW50cnlfc3RhdHMpDQpleDJfbG1fc3VtbWFyeSA8LSBzdW1tYXJ5KGV4Ml9sbSkNCg0KI1sxXSAiY2FsbCIgICAgICAgICAgInRlcm1zIiAgICAgICAgICJyZXNpZHVhbHMiICAgICAiY29lZmZpY2llbnRzIiAgImFsaWFzZWQiICAgICAgICJzaWdtYSIgICAgIA0KI1s3XSAiZGYiICAgICAgICAgICAgInIuc3F1YXJlZCIgICAgICJhZGouci5zcXVhcmVkIiAiZnN0YXRpc3RpYyIgICAgImNvdi51bnNjYWxlZCIgDQoNCmV4Ml9mc3RhdCAgICAgICA8LSBleDJfbG1fc3VtbWFyeSRmc3RhdGlzdGljDQpleDJfcnNxdWFyZWQgICAgPC0gZXgyX2xtX3N1bW1hcnkkci5zcXVhcmVkDQpleDJfcmVzX3N0ZF9lcnIgPC0gZXgyX2xtX3N1bW1hcnkkc2lnbWENCmV4Ml9wVmFsICAgICAgICA8LSBhbm92YShleDJfbG0pJCdQcig+RiknWzFdDQoNCmBgYA0KDQojIyMgU2hvdyBtb2RlbCdzIHF1YWxpdHkgbWVhc3VyZW1lbnQgc3RhdGlzdGljcw0KDQpJdGVtICAgICAgICAgICAgICAgICAgICB8IFZhbHVlDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkYtU3RhdGlzdGljICAgICAgICAgICAgIHwgYHIgZXgyX2ZzdGF0YA0KTXVsdGlwbGUgUi1zcXVhcmVkICAgICAgfCBgciBleDJfcnNxdWFyZWRgDQpSZXNpZHVhbCBzdGFuZGFyZCBlcnJvciB8IGByIGV4Ml9yZXNfc3RkX2VycmANCnAtdmFsdWUgICAgICAgICAgICAgICAgIHwgYHIgZXgyX3BWYWxgDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRSwgcmVuZGVyPUZBTFNFfQ0KI2dsYW5jZShleDJfbG0pDQpgYGANCg0KIyMjIEV2YWx1YXRlIG1vZGVsJ3MgcXVhbGl0eSBtZWFzdXJlbWVudCBzdGF0aXN0aWNzDQoNCg0KIyMjIyBFdmFsdWF0ZSBGLVN0YXRpc3RpYw0KDQpUaGUgRi1zdGF0aXN0aWMgdmFsdWUgY29tcGFyZXMgdGhlIGN1cnJlbnQgbW9kZWwgdG8gYSBtb2RlbCB0aGF0IGhhcyBvbmUgZmV3ZXIgcGFyYW1ldGVycy4gQmVjYXVzZSB0aGUgb25lLWZhY3RvciBtb2RlbCBhbHJlYWR5IGhhcyBvbmx5IGEgc2luZ2xlIHBhcmFtZXRlciwgdGhpcyB0ZXN0IGlzIG5vdCBwYXJ0aWN1bGFybHkgdXNlZnVsIGluIHRoaXMgY2FzZS4NCjxicj4NCg0KIyMjIyBFdmFsdWF0ZSBNdWx0aXBsZSBSLXNxdWFyZWQNCg0KVGhlIE11bHRpcGxlIFItc3F1YXJlZCB2YWx1ZSBpcyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEuIEl0IGlzIGEgc3RhdGlzdGljYWwgbWVhc3VyZSBvZiBob3cgd2VsbCB0aGUgbW9kZWwgZGVzY3JpYmVzIHRoZSBtZWFzdXJlZCBkYXRhLiBUaGUgcmVwb3J0ZWQgJFJeMiQgb2YgKipgciBleDJfcnNxdWFyZWRgKiogZm9yIHRoaXMgbW9kZWwgbWVhbnMgdGhhdCB0aGUgbW9kZWwgZXhwbGFpbnMgKipgciByb3VuZChleDJfcnNxdWFyZWQgKiAxMDAsIDIpYCoqIHBlcmNlbnQgb2YgdGhlIGRhdGHigJlzIHZhcmlhdGlvbi4gVGhpcyBpcyBhIGJpZyBpbXByb3ZlbWVudCBvdmVyIHRoZSAqKmByIHJvdW5kKGV4MV9yc3F1YXJlZCAqIDEwMCwgMilgKiogcGVyY2VudCByZXBvcnRlZCBpbiBFeGVyY2lzZSAxLg0KDQo8YnI+DQoNCg0KIyMjIyBFdmFsdWF0ZSBSZXNpZHVhbCBzdGFuZGFyZCBlcnJvcg0KDQpJbiBhIGdvb2QgbGluZWFyIG1vZGVsIHRoZSwgaWYgdGhlIHJlc2lkdWFscyBhcmUgZGlzdHJpYnV0ZWQgbm9ybWFsbHksIHRoZSBmaXJzdCBhbmQgdGhpcmQgcXVhbnRpbGVzIG9mIHRoZSBwcmV2aW91cyByZXNpZHVhbHMgc2hvdWxkIGJlIGFib3V0IDEuNSB0aW1lcyB0aGlzIHN0YW5kYXJkIGVycm9yLg0KDQpTaG93IHRoZSBRMSBhbmQgUTMgZm9yIHRoZSBtb2RlbCdzIHJlc2lkdWFscw0KDQpgYGB7cn0NCnN1bW1hcnkoZXgyX2xtX3N1bW1hcnkkcmVzaWR1YWxzKQ0KYGBgDQoNCg0KRnJvbSB0aGUgc3VtbWFyeSBhYm92ZSB3ZSBzZWUgdGhhdCwNCg0KLSAqKlExKiogb2YgKipgciByb3VuZChxdWFudGlsZShleDJfbG1fc3VtbWFyeSRyZXNpZHVhbHMsIC4yNSksIDMpYCoqIGlzIG9ubHkgKipgciByb3VuZChxdWFudGlsZShleDJfbG1fc3VtbWFyeSRyZXNpZHVhbHMsIC4yNSkgLyBleDJfcmVzX3N0ZF9lcnIsIDIpYCoqIHRpbWVzIG9mIHRoZSAqKlJlc2lkdWFsIHN0YW5kYXJkIGVycm9yKiogKGByIHJvdW5kKGV4Ml9yZXNfc3RkX2VyciwgMylgKS4NCg0KLSAqKlEzKiogb2YgKipgciByb3VuZChxdWFudGlsZShleDJfbG1fc3VtbWFyeSRyZXNpZHVhbHMsIC43NSksIDMpYCoqIGlzIG9ubHkgKipgciByb3VuZChxdWFudGlsZShleDJfbG1fc3VtbWFyeSRyZXNpZHVhbHMsIC43NSkgLyBleDJfcmVzX3N0ZF9lcnIsIDIpYCoqIHRpbWVzIG9mIHRoZSAqKlJlc2lkdWFsIHN0YW5kYXJkIGVycm9yKiogKGByIHJvdW5kKGV4Ml9yZXNfc3RkX2VyciwgMylgKS4NCg0KVGhlcmVmb3JlLCB0aGUgcmVzaWR1YWxzIGRvIG5vdCBzZWVtIHRvIGJlIGRpc3RyaWJ1dGVkIG5vcm1hbGx5Lg0KPGJyPg0KDQojIyMjIEV2YWx1YXRlIHAtdmFsdWUNCg0KVGhlIFByKD58dHwpIHNob3dzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGNvZWZmaWNpZW50IGlzIG5vdCByZWxldmFudCBpbiB0aGUgbW9kZWwuIFRoaXMgdmFsdWUgaXMgYWxzbyBrbm93biBhcyB0aGUgc2lnbmlmaWNhbmNlIG9yIHAtdmFsdWUgb2YgdGhlIGNvZWZmaWNpZW50Lg0KDQpJbiB0aGlzIG1vZGVsLCANCg0KLSB0aGUgcHJvYmFiaWxpdHkgdGhhdCAqKiRUb3RFeHAgXiB7MC4wNn0kKiogaXMgbm90IHJlbGV2YW50IGluIHRoaXMgbW9kZWwgaXMgKiokYHIgZXgyX3BWYWxgJCoqIC0gYSB0aW55IHZhbHVlIGxlc3MgdGhhbiAwLjA1LiBUaGlzIG1lYW5zIHRoYXQgKiokVG90RXhwIF4gezAuMDZ9JCoqIChzdW0gb2YgcGVyc29uYWwgYW5kIGdvdmVybm1lbnQgZXhwZW5kaXR1cmVzKSBpcyByZWxldmFudCBpbiB0aGUgbW9kZWwuDQotIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSAqKmludGVyY2VwdCoqIGlzIG5vdCByZWxldmFudCBpbiB0aGlzIG1vZGVsIGlzICoqJGByIGV4Ml9sbV9zdW1tYXJ5JGNvZWZmaWNpZW50c1sxLDRdYCQqKiAtIGEgdGlueSB2YWx1ZSBmYXIgbGVzcyB0aGFuIDAuMDUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgaW50ZXJjZXB0IGlzIHJlbGV2YW50IGluIHRoZSBtb2RlbC4NCg0KDQoNCg0KDQoNCg0KIyMgRXhlcmNpc2UgMw0KDQpVc2luZyB0aGUgcmVzdWx0cyBmcm9tIEV4ZXJjaXNlIDIsIGZvcmVjYXN0IGxpZmUgZXhwZWN0YW5jeSB3aGVuICRUb3RFeHBeey4wNn0gPSAxLjUkLiBUaGVuIGZvcmVjYXN0IGxpZmUgZXhwZWN0YW5jeSB3aGVuICRUb3RFeHB7Xi4wNn0gPSAyLjUkLg0KDQoNCkZyb20gZXhlcmNpc2UgMiwgdGhlIHktaW50ZXJjZXB0IGlzICRhXzAgPSAtNzM2NTI3OTEwJCBhbmQgdGhlIHNsb3BlIGlzICRhXzEgPSA2MjAwNjAyMTYkLiBUaHVzLCB0aGUgZmluYWwgcmVncmVzc2lvbiBtb2RlbCBpczoNCg0KJExpZmVFeHBeezQuNn0gPSAtNzM2NTI3OTEwICsgNjIwMDYwMjE2ICogVG90RXhwXnswLjA2fSQNCg0KVXNpbmcgdGhlIGFib3ZlIGVxdWF0aW9uIHdlIGNhbiBjYWxjdWxhdGUgbGlmZSBleHBlY3RhbmN5IGFzOg0KDQotIElmICRUb3RFeHBeey4wNn0gPSAxLjUkLCB0aGVuICRMaWZlRXhwXns0LjZ9ID0gLTczNjUyNzkxMCArIDYyMDA2MDIxNiAqIDEuNSA9IGByIC03MzY1Mjc5MTAgKyA2MjAwNjAyMTYgKiAxLjVgJA0KDQotIElmICRUb3RFeHBeey4wNn0gPSAyLjUkLCB0aGVuICRMaWZlRXhwXns0LjZ9ID0gLTczNjUyNzkxMCArIDYyMDA2MDIxNiAqIDIuNSA9IGByIC03MzY1Mjc5MTAgKyA2MjAwNjAyMTYgKiAyLjVgJA0KDQoNCjxicj4NCg0KDQoNCg0KDQojIyBFeGVyY2lzZSA0DQoNCkJ1aWxkIHRoZSBmb2xsb3dpbmcgbXVsdGlwbGUgcmVncmVzc2lvbiBtb2RlbCBhbmQgaW50ZXJwcmV0IHRoZSBGIFN0YXRpc3RpY3MsICRSXjIkLCBzdGFuZGFyZCBlcnJvciwgYW5kIHAtdmFsdWVzLiBIb3cgZ29vZCBpcyB0aGUgbW9kZWw/DQoNCiRMaWZlRXhwID0gYjAgKyBiMSAqICBQcm9wTWQgKyBiMiAqIFRvdEV4cCArIGIzICogUHJvcE1EICogVG90RXhwJA0KDQoNCg0KIyMjIEZpdCBhIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbA0KDQpgYGB7cn0NCmV4NF9sbSA8LSBsbShmb3JtdWxhID0gTGlmZUV4cCB+IFByb3BNRCArIFRvdEV4cCArIEkoUHJvcE1EICogVG90RXhwKSwgZGF0YSA9IGNvdW50cnlfc3RhdHMpDQpleDRfbG1fc3VtbWFyeSA8LSBzdW1tYXJ5KGV4NF9sbSkNCg0KI1sxXSAiY2FsbCIgICAgICAgICAgInRlcm1zIiAgICAgICAgICJyZXNpZHVhbHMiICAgICAiY29lZmZpY2llbnRzIiAgImFsaWFzZWQiICAgICAgICJzaWdtYSIgICAgIA0KI1s3XSAiZGYiICAgICAgICAgICAgInIuc3F1YXJlZCIgICAgICJhZGouci5zcXVhcmVkIiAiZnN0YXRpc3RpYyIgICAgImNvdi51bnNjYWxlZCIgDQoNCmV4NF9mc3RhdCAgICAgICA8LSBleDRfbG1fc3VtbWFyeSRmc3RhdGlzdGljDQpleDRfcnNxdWFyZWQgICAgPC0gZXg0X2xtX3N1bW1hcnkkci5zcXVhcmVkDQpleDRfcmVzX3N0ZF9lcnIgPC0gZXg0X2xtX3N1bW1hcnkkc2lnbWENCmV4NF9wVmFsICAgICAgICA8LSBhbm92YShleDRfbG0pJCdQcig+RiknWzFdDQoNCmBgYA0KDQojIyMgU2hvdyBtb2RlbCdzIHF1YWxpdHkgbWVhc3VyZW1lbnQgc3RhdGlzdGljcw0KDQpJdGVtICAgICAgICAgICAgICAgICAgICB8IFZhbHVlDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkYtU3RhdGlzdGljICAgICAgICAgICAgIHwgYHIgZXg0X2ZzdGF0YA0KTXVsdGlwbGUgUi1zcXVhcmVkICAgICAgfCBgciBleDRfcnNxdWFyZWRgDQpSZXNpZHVhbCBzdGFuZGFyZCBlcnJvciB8IGByIGV4NF9yZXNfc3RkX2VycmANCnAtdmFsdWUgICAgICAgICAgICAgICAgIHwgYHIgZXg0X3BWYWxgDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRSwgcmVuZGVyPUZBTFNFfQ0KI2dsYW5jZShleDRfbG0pDQpgYGANCg0KIyMjIEV2YWx1YXRlIG1vZGVsJ3MgcXVhbGl0eSBtZWFzdXJlbWVudCBzdGF0aXN0aWNzDQoNCg0KIyMjIyBFdmFsdWF0ZSBGLVN0YXRpc3RpYw0KDQpUaGUgRi1zdGF0aXN0aWMgdmFsdWUgY29tcGFyZXMgdGhlIGN1cnJlbnQgbW9kZWwgdG8gYSBtb2RlbCB0aGF0IGhhcyBvbmUgZmV3ZXIgcGFyYW1ldGVycy4gQmVjYXVzZSB0aGUgb25lLWZhY3RvciBtb2RlbCBhbHJlYWR5IGhhcyBvbmx5IGEgc2luZ2xlIHBhcmFtZXRlciwgdGhpcyB0ZXN0IGlzIG5vdCBwYXJ0aWN1bGFybHkgdXNlZnVsIGluIHRoaXMgY2FzZS4NCjxicj4NCg0KIyMjIyBFdmFsdWF0ZSBNdWx0aXBsZSBSLXNxdWFyZWQNCg0KVGhlIE11bHRpcGxlIFItc3F1YXJlZCB2YWx1ZSBpcyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEuIEl0IGlzIGEgc3RhdGlzdGljYWwgbWVhc3VyZSBvZiBob3cgd2VsbCB0aGUgbW9kZWwgZGVzY3JpYmVzIHRoZSBtZWFzdXJlZCBkYXRhLiBUaGUgcmVwb3J0ZWQgJFJeMiQgb2YgKipgciBleDRfcnNxdWFyZWRgKiogZm9yIHRoaXMgbW9kZWwgbWVhbnMgdGhhdCB0aGUgbW9kZWwgZXhwbGFpbnMgKipgciByb3VuZChleDRfcnNxdWFyZWQgKiAxMDAsIDIpYCoqIHBlcmNlbnQgb2YgdGhlIGRhdGHigJlzIHZhcmlhdGlvbi4NCjxicj4NCg0KDQojIyMjIEV2YWx1YXRlIFJlc2lkdWFsIHN0YW5kYXJkIGVycm9yDQoNCkluIGEgZ29vZCBsaW5lYXIgbW9kZWwgdGhlLCBpZiB0aGUgcmVzaWR1YWxzIGFyZSBkaXN0cmlidXRlZCBub3JtYWxseSwgdGhlIGZpcnN0IGFuZCB0aGlyZCBxdWFudGlsZXMgb2YgdGhlIHByZXZpb3VzIHJlc2lkdWFscyBzaG91bGQgYmUgYWJvdXQgMS41IHRpbWVzIHRoaXMgc3RhbmRhcmQgZXJyb3IuDQoNClNob3cgdGhlIFExIGFuZCBRMyBmb3IgdGhlIG1vZGVsJ3MgcmVzaWR1YWxzDQoNCmBgYHtyfQ0Kc3VtbWFyeShleDRfbG1fc3VtbWFyeSRyZXNpZHVhbHMpDQpgYGANCg0KDQpGcm9tIHRoZSBzdW1tYXJ5IGFib3ZlIHdlIHNlZSB0aGF0LA0KDQotICoqUTEqKiBvZiAqKmByIHJvdW5kKHF1YW50aWxlKGV4NF9sbV9zdW1tYXJ5JHJlc2lkdWFscywgLjI1KSwgMylgKiogaXMgb25seSAqKmByIHJvdW5kKHF1YW50aWxlKGV4NF9sbV9zdW1tYXJ5JHJlc2lkdWFscywgLjI1KSAvIGV4NF9yZXNfc3RkX2VyciwgMilgKiogdGltZXMgb2YgdGhlICoqUmVzaWR1YWwgc3RhbmRhcmQgZXJyb3IqKiAoYHIgcm91bmQoZXg0X3Jlc19zdGRfZXJyLCAzKWApLg0KDQotICoqUTMqKiBvZiAqKmByIHJvdW5kKHF1YW50aWxlKGV4NF9sbV9zdW1tYXJ5JHJlc2lkdWFscywgLjc1KSwgMylgKiogaXMgb25seSAqKmByIHJvdW5kKHF1YW50aWxlKGV4NF9sbV9zdW1tYXJ5JHJlc2lkdWFscywgLjc1KSAvIGV4NF9yZXNfc3RkX2VyciwgMilgKiogdGltZXMgb2YgdGhlICoqUmVzaWR1YWwgc3RhbmRhcmQgZXJyb3IqKiAoYHIgcm91bmQoZXg0X3Jlc19zdGRfZXJyLCAzKWApLg0KDQpUaGVyZWZvcmUsIHRoZSByZXNpZHVhbHMgZG8gbm90IHNlZW0gdG8gYmUgZGlzdHJpYnV0ZWQgbm9ybWFsbHkuDQo8YnI+DQoNCiMjIyMgRXZhbHVhdGUgcC12YWx1ZQ0KDQpUaGUgUHIoPnx0fCkgc2hvd3MgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgY29lZmZpY2llbnQgaXMgbm90IHJlbGV2YW50IGluIHRoZSBtb2RlbC4gVGhpcyB2YWx1ZSBpcyBhbHNvIGtub3duIGFzIHRoZSBzaWduaWZpY2FuY2Ugb3IgcC12YWx1ZSBvZiB0aGUgY29lZmZpY2llbnQuDQoNCkluIHRoaXMgbW9kZWwsIA0KDQotIHRoZSBwcm9iYWJpbGl0eSB0aGF0ICoqIlRvdEV4cCIqKiBpcyBub3QgcmVsZXZhbnQgaW4gdGhpcyBtb2RlbCBpcyAqKiRgciBleDRfcFZhbGAkKiogLSBhIHRpbnkgdmFsdWUgbGVzcyB0aGFuIDAuMDUuIFRoaXMgbWVhbnMgdGhhdCAqKiJUb3RFeHAiKiogKHN1bSBvZiBwZXJzb25hbCBhbmQgZ292ZXJubWVudCBleHBlbmRpdHVyZXMpIGlzIHJlbGV2YW50IGluIHRoZSBtb2RlbC4NCi0gdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlICoqaW50ZXJjZXB0KiogaXMgbm90IHJlbGV2YW50IGluIHRoaXMgbW9kZWwgaXMgKiokYHIgZXg0X2xtX3N1bW1hcnkkY29lZmZpY2llbnRzWzEsNF1gJCoqIC0gYSB0aW55IHZhbHVlIGZhciBsZXNzIHRoYW4gMC4wNS4gVGhpcyBtZWFucyB0aGF0IHRoZSBpbnRlcmNlcHQgaXMgcmVsZXZhbnQgaW4gdGhlIG1vZGVsLg0KDQoNCjxicj4NCg0KDQoNCg0KDQojIyBFeGVyY2lzZSA1DQoNCkZvcmVjYXN0IExpZmVFeHAgd2hlbiAkUHJvcE1EID0gLjAzJCBhbmQgJFRvdEV4cCA9IDE0JC4gRG9lcyB0aGlzIGZvcmVjYXN0IHNlZW0gcmVhbGlzdGljPyBXaHkgb3Igd2h5IG5vdD8NCg0KQmFzZWQgb24gdGhlIHJlc3VsdHMgZnJvbSBFeGVyY2lzZSA0LCB0aGUgYmVsb3cgbW9kZWwgDQoNCiRMaWZlRXhwID0gYjAgKyBiMSAqICBQcm9wTWQgKyA3LjIzM157LTV9ICogVG90RXhwICsgYjMgKiBQcm9wTUQgKiBUb3RFeHAkDQoNCmNhbiBiZSByZS13cml0dGVuIGFzDQoNCiRMaWZlRXhwID0gNjIuNzcgKyAxNDk3ICogUHJvcE1kICsgMC4wMDAwNzIzMyAqIFRvdEV4cCAtIDAuMDA2MDI2ICogUHJvcE1EICogVG90RXhwJA0KDQoNClVzaW5nIHRoZSBhYm92ZSBlcXVhdGlvbiB3ZSBjYW4gY2FsY3VsYXRlIExpZmUgRXhwZWN0YW5jeSBhczoNCg0KLSBJZiAkUHJvcE1EID0gLjAzJCBhbmQgJFRvdEV4cCA9IDE0JCwgdGhlbiAkTGlmZUV4cCA9IDYyLjc3ICsgMTQ5NyAqIC4wMyArIDAuMDAwMDcyMzMgKiAxNCAtIDAuMDA2MDI2ICogLjAzICogMTQgPSBgciByb3VuZCg2Mi43NyArIDE0OTcgKiAuMDMgKyAwLjAwMDA3MjMzICogMTQgLSAwLjAwNjAyNiAqIC4wMyAqIDE0LCAyKWAkDQoNClRoZSBsaWZlIGV4cGVjdGFuY3kgZm9yZWNhc3Qgb2YgYHIgcm91bmQoNjIuNzcgKyAxNDk3ICogLjAzICsgMC4wMDAwNzIzMyAqIDE0IC0gMC4wMDYwMjYgKiAuMDMgKiAxNCwgMilgIGRvZXMgbm90IHNlZW0gcmVhbGlzdGljIGJlY2F1c2UNCg0KLSB0aGUgYWN0dWFsIGxpZmUgZXhwZWN0YW5jZSB2YWx1ZXMgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBkYXRhIHJhbmdlIG9ubHkgZnJvbSA0MCB0byA4My4NCi0gaWYgVG90RXhwIChzdW0gb2YgcGVyc29uYWwgYW5kIGdvdmVybm1lbnQgZXhwZW5kaXR1cmVzKSBpcyAxNCwgdGhlbiBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRoYXQgc3VjaCBhIHNtYWxsIGV4cGVuZGl0dXJlIGNvdWxkIGhlbHAgaW5jcmVhc2UgYSBwZXJzb24ncyBsaWZlIGV4cGVjdGFuY3kgdG8gdGhlIHBvaW50IG9mIGV4Y2VlZGluZyB0aGF0IG9mIGFsbCB0aGUgcmVzdCBvZiB0aGUgbGlmZSBleHBlY3RhbmN5IHZhbHVlcyBmb3IgdGhlIHJlcG9ydGVkIGNvdW50cmllcy4NCg0KDQo8YnI+DQoNCg0KDQo=