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

  1. country - Name of the country.
  2. region - Region the country belongs to.
  3. 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”.
  4. 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==