World Happiness Report
How does the GDP influences the happiness of a Country?
Introduction
It is a common knowledge that some countries are recognized as “the happiest in the world”. The researches show that there is many factors that affect the happiness score of a country like economy, trust in government, safety, freedom, health, social relationships etc. The aim of this assignment is to discover the impact of economy (GDP of a country) on the happiness rate. I am going to use a Random Effects Models to explore the relationship between these factors.
Data
The data used in this assignment is a “World Happiness Report” from the Gallup World Poll from 2016. The report continues to gain global recognition as governments, organizations and civil society increasingly use happiness indicators to inform their policy-making decisions. The measurements of well-being can be used effectively to assess the progress of nations. The reports review the state of happiness in the world today and show how the new science of happiness explains personal and national variations in happiness.
The questions in the poll asks respondents to rate their life on a scale from 0 to 10 where 0 indicates the worst possible life being and 10 indicates the best possible life being for them.
Variables
- country - Name of the country.
- region - Region the country belongs to.
- happinessScore - a metric measured in 2016 by asking the sampled people the question: “How would you rate your happiness on a scale of 0 to 10 where 10 is the happiest”.
- gdp - quantitative measure of a nation’s total economic monetary status (in thousands)
Required Packages
library(haven)
library(readr)
library(nlme)
library(dplyr)
library(magrittr)
library(tidyr)
library(haven)
library(ggplot2)
library(texreg)
library(lmerTest)
Overview of the data
There is 157 countries from 10 regions of the world in a data set.
worldrank <- read_csv("/Users/lasha/Desktop/Queens College/712 Advanced Analytics/data sets/world-happiness-report/2016.csv", col_names=TRUE)
head(worldrank)
#no. of Countries
length(unique(worldrank$country))
[1] 157
How many countries in each region?
worldrank %>%
group_by(region) %>%
summarise(country= n())
Region level analysis (Ecological Model)
When we look at the mean value of a happiness rank across regions we can notice that Australia and New Zeland and North America have the highest mean happiness score and also the highest mean GDP score. If just looking at this grouped analysis we can come into conclusion that higher GDP increase the rate of happiness.
There is high amount of very poor and extremely rich countries. This makes the distribution of GDP skewed right. When we use the log of GDP the distribution is closer to normal.
regions <- worldrank %>%
group_by(region) %>%
summarise(mean_happy = mean(happinessScore, na.rm = TRUE), mean_gdp = mean(log(gdp), na.rm = TRUE))
head(regions)
The effect of GDP on ech region’s happines score
plot <- ggplot(worldrank, aes(x =log(gdp) , y=happinessScore, colour = region)) + geom_jitter()
plot

Ecological Regression
The regression shows that with the 1 unit growth in mean GDP, the mean happiness of a region increases 0.39. The problem is that the region-level analysis doesn’t have to necessary reflect country-level relations.
reghappy <- lm(mean_happy ~ mean_gdp, data = regions)
summary(reghappy)
Call:
lm(formula = mean_happy ~ mean_gdp, data = regions)
Residuals:
Min 1Q Median 3Q Max
-1.0489 -0.6141 -0.2106 0.7420 1.3901
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.8010 2.4405 0.328 0.751
mean_gdp 0.3928 0.1913 2.054 0.074 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.9138 on 8 degrees of freedom
Multiple R-squared: 0.3453, Adjusted R-squared: 0.2634
F-statistic: 4.219 on 1 and 8 DF, p-value: 0.07405
Country level analysis (Complete-pooling Model)
This model gives individual level scores. It allows to analyze direct influence of GDP on happiness score across countries. The intercept indicates the average happiness score across the countries. The happiness score increases 0.09 when the log of GDP increases for 1 unit.
cpooling <- lm(happinessScore ~ log(gdp), data = worldrank)
summary(cpooling)
Call:
lm(formula = happinessScore ~ log(gdp), data = worldrank)
Residuals:
Min 1Q Median 3Q Max
-3.09505 -0.93930 -0.07163 0.87947 2.31260
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.21329 0.34988 12.042 < 2e-16 ***
log(gdp) 0.09844 0.02852 3.452 0.000717 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.104 on 155 degrees of freedom
Multiple R-squared: 0.07139, Adjusted R-squared: 0.0654
F-statistic: 11.92 on 1 and 155 DF, p-value: 0.0007174
Country level analysis: one model per region (No-pooling Model)
The Intercept
This show the intercepts scores for all regions (10) in one graph.
dcoef <- worldrank %>%
group_by(region) %>%
do(mod = lm(happinessScore ~ log(gdp)
, data = .))
coef <- dcoef %>% do(data.frame(intc = coef(.$mod)[1]))
ggplot(coef, aes(x = intc)) + geom_histogram()

The Slope
This show the slopes scores for all regions (10) in one graph
dcoef <- worldrank %>%
group_by(region) %>%
do(mod = lm(happinessScore ~ log(gdp), data = .))
coef <- dcoef %>% do(data.frame(gdpc = coef(.$mod)[2]))
ggplot(coef, aes(x = gdpc)) + geom_histogram()

Both the slope and intercept show a lot of variation when regressions are done grouped by regions.
Random intercept model
This model allows between countries variation. The intercept (0.882) indicates remaining region-level variations in region’s happiness score after controlling for GDP. Residual (0.709) is the residuals at individual country level. These two numbers are two different residual’s components, one is on region level and the other is on country level.
rim1 <- lme(happinessScore ~ log(gdp), data = worldrank, random = ~1|region, method = "ML")
summary(rim1)
Linear mixed-effects model fit by maximum likelihood
Data: worldrank
AIC BIC logLik
374.2556 386.4806 -183.1278
Random effects:
Formula: ~1 | region
(Intercept) Residual
StdDev: 0.8818115 0.7087325
Fixed effects: happinessScore ~ log(gdp)
Value Std.Error DF t-value p-value
(Intercept) 5.068057 0.3839080 146 13.20123 0.0000
log(gdp) 0.051446 0.0196581 146 2.61703 0.0098
Correlation:
(Intr)
log(gdp) -0.644
Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-3.77686856 -0.54052792 0.03495429 0.64050460 2.66502907
Number of Observations: 157
Number of Groups: 10
Random slope model
Fixed Effects: These two values are the central tendency, the mean of all regions results: The Intercept (5.077) indicates average happiness scores in regions The log of gdp (0.051) mean GDP difference in happiness score. It indicates an increase of 0.051 of happiness with increase of 1 unit of GDP. Random Effect: Each individual region is different - the mean numbers are in between of 10 regions. When the GDP increases the happiness score increases in both cases: the region- and country-level analysis. 0.032 increase of happiness score across regions and 0.0509 increase of happiness score across countries for one unit increase of GDP.
rim2 <- lme(happinessScore ~ log(gdp), data = worldrank, random = ~ log(gdp)|region, method = "ML",control = lmeControl(msVerbose = TRUE))
0: 357.14095: -0.210167 3.04479 6.62028
1: 357.14090: -0.213161 3.04735 6.62049
2: 357.14085: -0.210614 3.05035 6.62077
3: 357.14069: -0.212402 3.06903 6.62270
4: 357.14069: -0.212471 3.07039 6.62449
5: 357.14068: -0.212589 3.07244 6.63080
6: 357.14066: -0.212843 3.07606 6.65144
7: 357.14061: -0.213316 3.08116 6.70473
8: 357.14053: -0.213998 3.08572 6.80819
9: 357.14041: -0.214811 3.08665 6.97875
10: 357.14032: -0.215130 3.08100 7.11289
11: 357.14030: -0.214949 3.07491 7.13286
12: 357.14030: -0.214805 3.07272 7.11297
13: 357.14030: -0.214782 3.07257 7.10627
14: 357.14030: -0.214782 3.07258 7.10587
summary(rim2)
Linear mixed-effects model fit by maximum likelihood
Data: worldrank
AIC BIC logLik
377.9967 396.3342 -182.9984
Random effects:
Formula: ~log(gdp) | region
Structure: General positive-definite, Log-Cholesky parametrization
StdDev Corr
(Intercept) 0.91731323 (Intr)
log(gdp) 0.03254726 -0.313
Residual 0.70294340
Fixed effects: happinessScore ~ log(gdp)
Value Std.Error DF t-value p-value
(Intercept) 5.077079 0.4119856 146 12.323438 0.0000
log(gdp) 0.050955 0.0241992 146 2.105654 0.0369
Correlation:
(Intr)
log(gdp) -0.704
Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-3.41413024 -0.54336997 0.06674879 0.63387840 2.67306099
Number of Observations: 157
Number of Groups: 10
Model selection
The lower values of AIC indicate better fit to data. The random intercept model, which allow across countries variation, is the best fit.
AIC(cpooling, rim1, rim2)
Model comparison in a table.
By creating 2 regressions we control for the random effect of GDP on happiness. This is important because as was shown in figure 1 and 2 the variation of effect of GDP on happiness was high between each region.
htmlreg(list(rim1, rim2))
Statistical models
|
|
Model 1
|
Model 2
|
|
(Intercept)
|
5.07***
|
5.08***
|
|
|
(0.38)
|
(0.41)
|
|
log(gdp)
|
0.05**
|
0.05*
|
|
|
(0.02)
|
(0.02)
|
|
AIC
|
374.26
|
378.00
|
|
BIC
|
386.48
|
396.33
|
|
Log Likelihood
|
-183.13
|
-183.00
|
|
Num. obs.
|
157
|
157
|
|
Num. groups
|
10
|
10
|
|
p < 0.001, p < 0.01, p < 0.05
|
Conclusion
The analysis prove that GDP has an impact on the overall happiness score across countries. The more stable and wealthy the country’s economy is, the happier the country seems to be. The same was proved when analyzing regions and GDP.
Using Multilevel models allows to compare the importance of results on individual (at a lower, countries level) and aggregated units (at a higher, regions level). The best results came out from a Random Intercept Model. The model allows between countries variation but it also takes the regions into consideration. The research was limited to the economical (GDP) affect on a happiness score only. Further analysis can include other factors that affect the countries’ happiness score like trust in government, safety, freedom, health, social relationships etc.
.
LS0tCnRpdGxlOiAiSG9tZXdvcmsgOCIKYXV0aG9yOiAiSm9hbm5hIFBvbGFuc2thIgpkYXRlOiAiMTAvMjQvMjAxNyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIzxmb250IGNvbG9yID0gZGFya2dyZWVuPiBXb3JsZCBIYXBwaW5lc3MgUmVwb3J0IDwvZm9udD4KIyMjKkhvdyBkb2VzIHRoZSBHRFAgaW5mbHVlbmNlcyB0aGUgaGFwcGluZXNzIG9mIGEgQ291bnRyeT8qCgojIyM8Zm9udCBjb2xvciA9IGdyYXk+IEludHJvZHVjdGlvbiA8L2ZvbnQ+Ckl0IGlzIGEgY29tbW9uIGtub3dsZWRnZSB0aGF0IHNvbWUgY291bnRyaWVzIGFyZSByZWNvZ25pemVkIGFzICJ0aGUgaGFwcGllc3QgaW4gdGhlIHdvcmxkIi4gVGhlIHJlc2VhcmNoZXMgc2hvdyB0aGF0IHRoZXJlIGlzIG1hbnkgZmFjdG9ycyB0aGF0IGFmZmVjdCB0aGUgaGFwcGluZXNzIHNjb3JlIG9mIGEgY291bnRyeSBsaWtlIGVjb25vbXksIHRydXN0IGluIGdvdmVybm1lbnQsIHNhZmV0eSwgZnJlZWRvbSwgaGVhbHRoLCBzb2NpYWwgcmVsYXRpb25zaGlwcyBldGMuIFRoZSBhaW0gb2YgdGhpcyBhc3NpZ25tZW50IGlzIHRvIGRpc2NvdmVyIHRoZSBpbXBhY3Qgb2YgZWNvbm9teSAoR0RQIG9mIGEgY291bnRyeSkgb24gdGhlIGhhcHBpbmVzcyByYXRlLiBJIGFtIGdvaW5nIHRvIHVzZSBhIFJhbmRvbSBFZmZlY3RzIE1vZGVscyB0byBleHBsb3JlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZSBmYWN0b3JzLgoKCiMjIyA8Zm9udCBjb2xvciA9IGdyYXk+IERhdGEgPC9mb250PgpUaGUgZGF0YSB1c2VkIGluIHRoaXMgYXNzaWdubWVudCBpcyBhICJXb3JsZCBIYXBwaW5lc3MgUmVwb3J0IiBmcm9tIHRoZSBHYWxsdXAgV29ybGQgUG9sbCBmcm9tIDIwMTYuIFRoZSByZXBvcnQgY29udGludWVzIHRvIGdhaW4gZ2xvYmFsIHJlY29nbml0aW9uIGFzIGdvdmVybm1lbnRzLCBvcmdhbml6YXRpb25zIGFuZCBjaXZpbCBzb2NpZXR5IGluY3JlYXNpbmdseSB1c2UgaGFwcGluZXNzIGluZGljYXRvcnMgdG8gaW5mb3JtIHRoZWlyIHBvbGljeS1tYWtpbmcgZGVjaXNpb25zLiBUaGUgbWVhc3VyZW1lbnRzIG9mIHdlbGwtYmVpbmcgY2FuIGJlIHVzZWQgZWZmZWN0aXZlbHkgdG8gYXNzZXNzIHRoZSBwcm9ncmVzcyBvZiBuYXRpb25zLiBUaGUgcmVwb3J0cyByZXZpZXcgdGhlIHN0YXRlIG9mIGhhcHBpbmVzcyBpbiB0aGUgd29ybGQgdG9kYXkgYW5kIHNob3cgaG93IHRoZSBuZXcgc2NpZW5jZSBvZiBoYXBwaW5lc3MgZXhwbGFpbnMgcGVyc29uYWwgYW5kIG5hdGlvbmFsIHZhcmlhdGlvbnMgaW4gaGFwcGluZXNzLgoKVGhlIHF1ZXN0aW9ucyBpbiB0aGUgcG9sbCBhc2tzIHJlc3BvbmRlbnRzIHRvIHJhdGUgdGhlaXIgbGlmZSBvbiBhIHNjYWxlIGZyb20gMCB0byAxMCB3aGVyZSAwIGluZGljYXRlcyB0aGUgd29yc3QgcG9zc2libGUgbGlmZSBiZWluZyBhbmQgMTAgaW5kaWNhdGVzIHRoZSBiZXN0IHBvc3NpYmxlIGxpZmUgYmVpbmcgZm9yIHRoZW0uIAoKIyMjIDxmb250IGNvbG9yID0gZ3JheT4gVmFyaWFibGVzIDwvZm9udD4KMS4gKipjb3VudHJ5KiogLSBOYW1lIG9mIHRoZSBjb3VudHJ5LgoyLiAqKnJlZ2lvbioqIC0gUmVnaW9uIHRoZSBjb3VudHJ5IGJlbG9uZ3MgdG8uCjMuICoqaGFwcGluZXNzU2NvcmUqKiAtIGEgbWV0cmljIG1lYXN1cmVkIGluIDIwMTYgYnkgYXNraW5nIHRoZSBzYW1wbGVkIHBlb3BsZSB0aGUgcXVlc3Rpb246ICJIb3cgd291bGQgeW91IHJhdGUgeW91ciBoYXBwaW5lc3Mgb24gYSBzY2FsZSBvZiAwIHRvIDEwIHdoZXJlIDEwIGlzIHRoZSBoYXBwaWVzdCIuCjQuICoqZ2RwKiogLSBxdWFudGl0YXRpdmUgbWVhc3VyZSBvZiBhIG5hdGlvbidzIHRvdGFsIGVjb25vbWljIG1vbmV0YXJ5IHN0YXR1cyAoaW4gdGhvdXNhbmRzKQoKCiMjIyAgPGZvbnQgY29sb3IgPSBkYXJrZ3JlZW4+IFJlcXVpcmVkIFBhY2thZ2VzICA8L2ZvbnQ+CmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgcmVzdWx0cz0naGlkZScsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkoaGF2ZW4pCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkobmxtZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShoYXZlbikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHRleHJlZykKbGlicmFyeShsbWVyVGVzdCkKYGBgCgojIyMgPGZvbnQgY29sb3IgPSBkYXJrZ3JlZW4+IE92ZXJ2aWV3IG9mIHRoZSBkYXRhIDwvZm9udD4KVGhlcmUgaXMgMTU3IGNvdW50cmllcyBmcm9tIDEwIHJlZ2lvbnMgb2YgdGhlIHdvcmxkIGluIGEgZGF0YSBzZXQuCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0Kd29ybGRyYW5rIDwtIHJlYWRfY3N2KCIvVXNlcnMvbGFzaGEvRGVza3RvcC9RdWVlbnMgQ29sbGVnZS83MTIgQWR2YW5jZWQgQW5hbHl0aWNzL2RhdGEgc2V0cy93b3JsZC1oYXBwaW5lc3MtcmVwb3J0LzIwMTYuY3N2IiwgY29sX25hbWVzPVRSVUUpCmhlYWQod29ybGRyYW5rKQoKI25vLiBvZiBDb3VudHJpZXMKbGVuZ3RoKHVuaXF1ZSh3b3JsZHJhbmskY291bnRyeSkpCmBgYAoKIyMjIDxmb250IGNvbG9yID0gZGFya2dyZWVuPiBIb3cgbWFueSBjb3VudHJpZXMgaW4gZWFjaCByZWdpb24/IDwvZm9udD4KYGBge3IsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQp3b3JsZHJhbmsgJT4lIAogIGdyb3VwX2J5KHJlZ2lvbikgJT4lIAogIHN1bW1hcmlzZShjb3VudHJ5PSBuKCkpCmBgYAoKIyMjIDxmb250IGNvbG9yID0gZGFya2dyZWVuPiBSZWdpb24gbGV2ZWwgYW5hbHlzaXMgKEVjb2xvZ2ljYWwgTW9kZWwpIDwvZm9udD4KV2hlbiB3ZSBsb29rIGF0IHRoZSBtZWFuIHZhbHVlIG9mIGEgaGFwcGluZXNzIHJhbmsgYWNyb3NzIHJlZ2lvbnMgd2UgY2FuIG5vdGljZSB0aGF0IEF1c3RyYWxpYSBhbmQgTmV3IFplbGFuZCBhbmQgTm9ydGggQW1lcmljYSBoYXZlIHRoZSBoaWdoZXN0IG1lYW4gaGFwcGluZXNzIHNjb3JlIGFuZCBhbHNvIHRoZSBoaWdoZXN0IG1lYW4gR0RQIHNjb3JlLiBJZiBqdXN0IGxvb2tpbmcgYXQgdGhpcyBncm91cGVkIGFuYWx5c2lzIHdlIGNhbiBjb21lIGludG8gY29uY2x1c2lvbiB0aGF0IGhpZ2hlciBHRFAgaW5jcmVhc2UgdGhlIHJhdGUgb2YgaGFwcGluZXNzLgoKVGhlcmUgaXMgaGlnaCBhbW91bnQgb2YgdmVyeSBwb29yIGFuZCBleHRyZW1lbHkgcmljaCBjb3VudHJpZXMuIFRoaXMgbWFrZXMgdGhlIGRpc3RyaWJ1dGlvbiBvZiBHRFAgc2tld2VkIHJpZ2h0LiBXaGVuIHdlIHVzZSB0aGUgbG9nIG9mIEdEUCB0aGUgZGlzdHJpYnV0aW9uIGlzIGNsb3NlciB0byBub3JtYWwuCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KcmVnaW9ucyA8LSB3b3JsZHJhbmsgJT4lIAogIGdyb3VwX2J5KHJlZ2lvbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX2hhcHB5ID0gbWVhbihoYXBwaW5lc3NTY29yZSwgbmEucm0gPSBUUlVFKSwgbWVhbl9nZHAgPSBtZWFuKGxvZyhnZHApLCBuYS5ybSA9IFRSVUUpKQpoZWFkKHJlZ2lvbnMpCmBgYAoKCiMjIyA8Zm9udCBjb2xvciA9IGRhcmtncmVlbj4gVGhlIGVmZmVjdCBvZiBHRFAgb24gZWNoIHJlZ2lvbidzIGhhcHBpbmVzIHNjb3JlIDwvZm9udD4KYGBge3IgZmlnLmxlbmd0aCA9IDYsIGZpZy53aWR0aD02LCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KcGxvdCA8LSBnZ3Bsb3Qod29ybGRyYW5rLCBhZXMoeCA9bG9nKGdkcCkgLCB5PWhhcHBpbmVzc1Njb3JlLCBjb2xvdXIgPSByZWdpb24pKSArIGdlb21faml0dGVyKCkgCnBsb3QKYGBgCgojIyMgPGZvbnQgY29sb3IgPSBkYXJrZ3JlZW4+IEVjb2xvZ2ljYWwgUmVncmVzc2lvbiA8L2ZvbnQ+ClRoZSByZWdyZXNzaW9uIHNob3dzIHRoYXQgd2l0aCB0aGUgMSB1bml0IGdyb3d0aCBpbiBtZWFuIEdEUCwgdGhlIG1lYW4gaGFwcGluZXNzIG9mIGEgcmVnaW9uIGluY3JlYXNlcyAwLjM5LgpUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSByZWdpb24tbGV2ZWwgYW5hbHlzaXMgZG9lc24ndCBoYXZlIHRvIG5lY2Vzc2FyeSByZWZsZWN0IGNvdW50cnktbGV2ZWwgcmVsYXRpb25zLiAKYGBge3IsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpyZWdoYXBweSA8LSBsbShtZWFuX2hhcHB5IH4gbWVhbl9nZHAsIGRhdGEgPSByZWdpb25zKQpzdW1tYXJ5KHJlZ2hhcHB5KQpgYGAKCiMjIyA8Zm9udCBjb2xvciA9IGRhcmtncmVlbj4gQ291bnRyeSBsZXZlbCBhbmFseXNpcyAoQ29tcGxldGUtcG9vbGluZyBNb2RlbCkgPC9mb250PgpUaGlzIG1vZGVsIGdpdmVzIGluZGl2aWR1YWwgbGV2ZWwgc2NvcmVzLiBJdCBhbGxvd3MgdG8gYW5hbHl6ZSBkaXJlY3QgaW5mbHVlbmNlIG9mIEdEUCBvbiBoYXBwaW5lc3Mgc2NvcmUgYWNyb3NzIGNvdW50cmllcy4KVGhlIGludGVyY2VwdCBpbmRpY2F0ZXMgdGhlIGF2ZXJhZ2UgaGFwcGluZXNzIHNjb3JlIGFjcm9zcyB0aGUgY291bnRyaWVzLiBUaGUgaGFwcGluZXNzIHNjb3JlIGluY3JlYXNlcyAwLjA5IHdoZW4gdGhlIGxvZyBvZiBHRFAgaW5jcmVhc2VzIGZvciAxIHVuaXQuCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KY3Bvb2xpbmcgPC0gbG0oaGFwcGluZXNzU2NvcmUgfiBsb2coZ2RwKSwgZGF0YSA9IHdvcmxkcmFuaykKc3VtbWFyeShjcG9vbGluZykKYGBgCgojIyMgPGZvbnQgY29sb3IgPSBkYXJrZ3JlZW4+IENvdW50cnkgbGV2ZWwgYW5hbHlzaXM6IG9uZSBtb2RlbCBwZXIgcmVnaW9uIChOby1wb29saW5nIE1vZGVsKSA8L2ZvbnQ+CgojIyMjIDxmb250IGNvbG9yID0gZ3JleT4gVGhlIEludGVyY2VwdCA8L2ZvbnQ+ClRoaXMgc2hvdyB0aGUgaW50ZXJjZXB0cyBzY29yZXMgZm9yIGFsbCByZWdpb25zICgxMCkgaW4gb25lIGdyYXBoLgpgYGB7ciwgZmlnLmhlaWdodD0yLCBmaWcud2lkdGg9Mywgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmRjb2VmIDwtIHdvcmxkcmFuayAlPiUgCiAgICBncm91cF9ieShyZWdpb24pICU+JSAKICAgIGRvKG1vZCA9IGxtKGhhcHBpbmVzc1Njb3JlIH4gbG9nKGdkcCkKICAgICAgICAgICAgICAgICwgZGF0YSA9IC4pKQpjb2VmIDwtIGRjb2VmICU+JSBkbyhkYXRhLmZyYW1lKGludGMgPSBjb2VmKC4kbW9kKVsxXSkpCmdncGxvdChjb2VmLCBhZXMoeCA9IGludGMpKSArIGdlb21faGlzdG9ncmFtKCkKCmBgYAoKCiMjIyMgPGZvbnQgY29sb3IgPSBncmV5PiBUaGUgU2xvcGUgPC9mb250PgpUaGlzIHNob3cgdGhlIHNsb3BlcyBzY29yZXMgZm9yIGFsbCByZWdpb25zICgxMCkgaW4gb25lIGdyYXBoCmBgYHtyLCBmaWcuaGVpZ2h0PTIsIGZpZy53aWR0aD0zLHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpkY29lZiA8LSB3b3JsZHJhbmsgJT4lIAogICAgZ3JvdXBfYnkocmVnaW9uKSAlPiUgCiAgICBkbyhtb2QgPSBsbShoYXBwaW5lc3NTY29yZSB+IGxvZyhnZHApLCBkYXRhID0gLikpCmNvZWYgPC0gZGNvZWYgJT4lIGRvKGRhdGEuZnJhbWUoZ2RwYyA9IGNvZWYoLiRtb2QpWzJdKSkKZ2dwbG90KGNvZWYsIGFlcyh4ID0gZ2RwYykpICsgZ2VvbV9oaXN0b2dyYW0oKQpgYGAKQm90aCB0aGUgc2xvcGUgYW5kIGludGVyY2VwdCBzaG93IGEgbG90IG9mIHZhcmlhdGlvbiB3aGVuIHJlZ3Jlc3Npb25zIGFyZSBkb25lIGdyb3VwZWQgYnkgcmVnaW9ucy4KCgojIyMgPGZvbnQgY29sb3IgPSBkYXJrZ3JlZW4+IFJhbmRvbSBpbnRlcmNlcHQgbW9kZWwgPC9mb250PgpUaGlzIG1vZGVsIGFsbG93cyBiZXR3ZWVuIGNvdW50cmllcyB2YXJpYXRpb24uIAoqKlRoZSBpbnRlcmNlcHQqKiAoMC44ODIpIGluZGljYXRlcyByZW1haW5pbmcgcmVnaW9uLWxldmVsIHZhcmlhdGlvbnMgaW4gcmVnaW9uJ3MgaGFwcGluZXNzIHNjb3JlIGFmdGVyIGNvbnRyb2xsaW5nIGZvciBHRFAuICoqUmVzaWR1YWwqKiAoMC43MDkpIGlzIHRoZSByZXNpZHVhbHMgYXQgaW5kaXZpZHVhbCBjb3VudHJ5IGxldmVsLiBUaGVzZSB0d28gbnVtYmVycyBhcmUgdHdvIGRpZmZlcmVudCByZXNpZHVhbCdzIGNvbXBvbmVudHMsIG9uZSBpcyBvbiByZWdpb24gbGV2ZWwgYW5kIHRoZSBvdGhlciBpcyBvbiBjb3VudHJ5IGxldmVsLgpgYGB7ciwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnJpbTEgPC0gbG1lKGhhcHBpbmVzc1Njb3JlIH4gbG9nKGdkcCksIGRhdGEgPSB3b3JsZHJhbmssIHJhbmRvbSA9IH4xfHJlZ2lvbiwgbWV0aG9kID0gIk1MIikKc3VtbWFyeShyaW0xKQpgYGAKCgojIyMgPGZvbnQgY29sb3IgPSBkYXJrZ3JlZW4+IFJhbmRvbSBzbG9wZSBtb2RlbCA8L2ZvbnQ+Cgo8Zm9udCBjb2xvciA9IGdyZXk+IEZpeGVkIEVmZmVjdHM6IDwvZm9udD4gVGhlc2UgdHdvIHZhbHVlcyBhcmUgdGhlIGNlbnRyYWwgdGVuZGVuY3ksIHRoZSBtZWFuIG9mIGFsbCByZWdpb25zIHJlc3VsdHM6CioqVGhlIEludGVyY2VwdCoqICg1LjA3NykgaW5kaWNhdGVzIGF2ZXJhZ2UgaGFwcGluZXNzIHNjb3JlcyBpbiByZWdpb25zCioqVGhlIGxvZyBvZiBnZHAqKiAoMC4wNTEpIG1lYW4gR0RQIGRpZmZlcmVuY2UgaW4gaGFwcGluZXNzIHNjb3JlLiBJdCBpbmRpY2F0ZXMgYW4gaW5jcmVhc2Ugb2YgMC4wNTEgb2YgaGFwcGluZXNzIHdpdGggaW5jcmVhc2Ugb2YgMSB1bml0IG9mIEdEUC4KPGZvbnQgY29sb3IgPSBncmV5PiBSYW5kb20gRWZmZWN0OiA8L2ZvbnQ+CkVhY2ggaW5kaXZpZHVhbCByZWdpb24gaXMgZGlmZmVyZW50IC0gdGhlIG1lYW4gbnVtYmVycyBhcmUgaW4gYmV0d2VlbiBvZiAxMCByZWdpb25zLiAgV2hlbiB0aGUgR0RQIGluY3JlYXNlcyB0aGUgaGFwcGluZXNzIHNjb3JlIGluY3JlYXNlcyBpbiBib3RoIGNhc2VzOiB0aGUgcmVnaW9uLSBhbmQgY291bnRyeS1sZXZlbCBhbmFseXNpcy4gMC4wMzIgaW5jcmVhc2Ugb2YgaGFwcGluZXNzIHNjb3JlIGFjcm9zcyByZWdpb25zIGFuZCAwLjA1MDkgaW5jcmVhc2Ugb2YgaGFwcGluZXNzIHNjb3JlIGFjcm9zcyBjb3VudHJpZXMgZm9yIG9uZSB1bml0IGluY3JlYXNlIG9mIEdEUC4KCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KcmltMiA8LSBsbWUoaGFwcGluZXNzU2NvcmUgfiBsb2coZ2RwKSwgZGF0YSA9IHdvcmxkcmFuaywgcmFuZG9tID0gfiBsb2coZ2RwKXxyZWdpb24sIG1ldGhvZCA9ICJNTCIsY29udHJvbCA9IGxtZUNvbnRyb2wobXNWZXJib3NlID0gVFJVRSkpCnN1bW1hcnkocmltMikKYGBgIAoKIyMjIDxmb250IGNvbG9yID0gZGFya2dyZWVuPiAgTW9kZWwgc2VsZWN0aW9uIDwvZm9udD4KVGhlIGxvd2VyIHZhbHVlcyBvZiBBSUMgaW5kaWNhdGUgYmV0dGVyIGZpdCB0byBkYXRhLiBUaGUgcmFuZG9tIGludGVyY2VwdCBtb2RlbCwgd2hpY2ggYWxsb3cgYWNyb3NzIGNvdW50cmllcyB2YXJpYXRpb24sIGlzIHRoZSBiZXN0IGZpdC4KYGBge3IsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpBSUMoY3Bvb2xpbmcsIHJpbTEsIHJpbTIpCmBgYAoKCiMjIyAgPGZvbnQgY29sb3IgPSBkYXJrZ3JlZW4+IE1vZGVsIGNvbXBhcmlzb24gaW4gYSB0YWJsZS4gPC9mb250PgpCeSBjcmVhdGluZyAyIHJlZ3Jlc3Npb25zIHdlIGNvbnRyb2wgZm9yIHRoZSByYW5kb20gZWZmZWN0IG9mIEdEUCBvbiBoYXBwaW5lc3MuIApUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGFzIHdhcyBzaG93biBpbiBmaWd1cmUgMSBhbmQgMiB0aGUgdmFyaWF0aW9uIG9mIGVmZmVjdCBvZiBHRFAgb24gaGFwcGluZXNzIHdhcyBoaWdoIGJldHdlZW4gZWFjaCByZWdpb24uCmBgYHtyLCByZXN1bHRzPSdhc2lzJ30KaHRtbHJlZyhsaXN0KHJpbTEsIHJpbTIpKQpgYGAKCiMjIyA8Zm9udCBjb2xvciA9IGRhcmtncmVlbj4gQ29uY2x1c2lvbiA8L2ZvbnQ+ClRoZSBhbmFseXNpcyBwcm92ZSB0aGF0IEdEUCBoYXMgYW4gaW1wYWN0IG9uIHRoZSBvdmVyYWxsIGhhcHBpbmVzcyBzY29yZSBhY3Jvc3MgY291bnRyaWVzLiBUaGUgbW9yZSBzdGFibGUgYW5kIHdlYWx0aHkgdGhlIGNvdW50cnkncyBlY29ub215IGlzLCB0aGUgaGFwcGllciB0aGUgY291bnRyeSBzZWVtcyB0byBiZS4gVGhlIHNhbWUgd2FzIHByb3ZlZCB3aGVuIGFuYWx5emluZyByZWdpb25zIGFuZCBHRFAuIAoKVXNpbmcgTXVsdGlsZXZlbCBtb2RlbHMgYWxsb3dzIHRvIGNvbXBhcmUgdGhlIGltcG9ydGFuY2Ugb2YgcmVzdWx0cyBvbiBpbmRpdmlkdWFsIChhdCBhIGxvd2VyLCBjb3VudHJpZXMgbGV2ZWwpIGFuZCBhZ2dyZWdhdGVkIHVuaXRzIChhdCBhIGhpZ2hlciwgcmVnaW9ucyBsZXZlbCkuIFRoZSBiZXN0IHJlc3VsdHMgY2FtZSBvdXQgZnJvbSBhIFJhbmRvbSBJbnRlcmNlcHQgTW9kZWwuIFRoZSBtb2RlbCBhbGxvd3MgYmV0d2VlbiBjb3VudHJpZXMgdmFyaWF0aW9uIGJ1dCBpdCBhbHNvIHRha2VzIHRoZSByZWdpb25zIGludG8gY29uc2lkZXJhdGlvbi4gVGhlIHJlc2VhcmNoIHdhcyBsaW1pdGVkIHRvIHRoZSBlY29ub21pY2FsIChHRFApIGFmZmVjdCBvbiBhIGhhcHBpbmVzcyBzY29yZSBvbmx5LiBGdXJ0aGVyIGFuYWx5c2lzIGNhbiBpbmNsdWRlIG90aGVyIGZhY3RvcnMgdGhhdCBhZmZlY3QgdGhlIGNvdW50cmllcycgaGFwcGluZXNzIHNjb3JlIGxpa2UgdHJ1c3QgaW4gZ292ZXJubWVudCwgc2FmZXR5LCBmcmVlZG9tLCBoZWFsdGgsIHNvY2lhbCByZWxhdGlvbnNoaXBzIGV0Yy4KCgouCg==