Licença

This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

License: CC BY-SA 4.0

License: CC BY-SA 4.0

Citação

Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. Econometria: exemplo 11.10, heterocedasticidade, Gujarati (2004, p.424 english edition) (p388 Brazilian edition). Campo Grande-MS,Brasil: RStudio/Rpubs, 2019. Disponível em http://rpubs.com/amrofi/Gujarati_salesp424.

1 Introdução

Os primeiros passos são criar ou abrir um diretório de trabalho. Se optar por criar um novo projeto, haverá a possibilidade de criar em uma pasta vazia. Em seguida, sugere-se que coloque os dados nesta pasta, se possível em um arquivo MS Excel e chame a planilha de ‘dados’.Neste caso, a planilha de dados será colocada dentro do código gerado pela função dput().

Enunciado Exemplo 11.10. Fonte: Gujarati, 2004, p.424.

Enunciado Exemplo 11.10. Fonte: Gujarati, 2004, p.424.

2 Dados e regressão inicial

Aqui chamaremos os dados pela estrutura do dput() extraído previamente. Em seguida faremos a regressão dos gastos de P&D (R&D Expenses, ou \(PD\)) como função das vendas (Sales, \(VENDAS\)). O sumário da regressão é apresentado ao final.

dados <- structure(list(obs = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 
    15, 16, 17, 18), VENDAS = c(6375.3, 11626.4, 14655.1, 21869.2, 26408.3, 
    32405.6, 35107.7, 40295.4, 70761.6, 80552.8, 95294, 101314.1, 116141.3, 
    122315.7, 141649.9, 175025.8, 230614.5, 293543), PD = c(62.5, 92.9, 178.3, 
    258.4, 494.7, 1083, 1620.6, 421.7, 509.2, 6620.1, 3918.6, 1595.3, 6107.5, 
    4454.1, 3163.8, 13210.7, 1703.8, 9528.2), LUCROS = c(185.1, 1569.5, 276.8, 
    2828.1, 225.9, 3751.9, 2884.1, 4645.7, 5036.4, 13869.9, 4487.8, 10278.9, 
    8787.29999999999, 16438.8, 9761.4, 19774.5, 22626.6, 18415.4)), row.names = c(NA, 
    -18L), class = c("tbl_df", "tbl", "data.frame"))

library(stargazer)
library(car)
library(lmtest)
library(AER)
# VENDAS = vendas setoriais PD = pesquisa e desenvolvimento LUCRO = lucro
# setorial
knitr::kable(dados)
obs VENDAS PD LUCROS
1 6375.3 62.5 185.1
2 11626.4 92.9 1569.5
3 14655.1 178.3 276.8
4 21869.2 258.4 2828.1
5 26408.3 494.7 225.9
6 32405.6 1083.0 3751.9
7 35107.7 1620.6 2884.1
8 40295.4 421.7 4645.7
9 70761.6 509.2 5036.4
10 80552.8 6620.1 13869.9
11 95294.0 3918.6 4487.8
12 101314.1 1595.3 10278.9
13 116141.3 6107.5 8787.3
14 122315.7 4454.1 16438.8
15 141649.9 3163.8 9761.4
16 175025.8 13210.7 19774.5
17 230614.5 1703.8 22626.6
18 293543.0 9528.2 18415.4
attach(dados)

regressao1 <- lm(PD ~ VENDAS)
summary(regressao1)

Call:
lm(formula = PD ~ VENDAS)

Residuals:
    Min      1Q  Median      3Q     Max 
-5845.9  -950.6  -402.4   346.3  7434.3 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept) 1.930e+02  9.910e+02   0.195  0.84804   
VENDAS      3.190e-02  8.329e-03   3.830  0.00148 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2759 on 16 degrees of freedom
Multiple R-squared:  0.4783,    Adjusted R-squared:  0.4457 
F-statistic: 14.67 on 1 and 16 DF,  p-value: 0.001476

3 Análise e Testes de Heterocedasticidade

3.1 Resíduos

Primeiro geramos os resíduos uhat (\(\hat u\)) da regressão 1 do bloco anterior. Em seguida geramos uhat2 = resíduos ao quadrado (\(\hat u^2\)) e os valores absolutos dos resíduos, uhat.abs = (\(|\hat u|\)).

# gerar residuos
uhat <- regressao1$residuals
uhat
          1           2           3           4           5           6 
 -333.86730  -470.97913  -482.19567  -632.22786  -540.72666  -143.74252 
          7           8           9          10          11          12 
  307.65959 -1056.72977 -1941.11167  3857.44579   685.69661 -1829.64658 
         13          14          15          16          17          18 
 2209.56081   359.19540 -1547.87201  7434.32569 -5845.87232   -28.91239 
uhat2 <- uhat^2
# residuos em valores absolutos
uhat.abs <- abs(uhat)
uhat.abs
         1          2          3          4          5          6 
 333.86730  470.97913  482.19567  632.22786  540.72666  143.74252 
         7          8          9         10         11         12 
 307.65959 1056.72977 1941.11167 3857.44579  685.69661 1829.64658 
        13         14         15         16         17         18 
2209.56081  359.19540 1547.87201 7434.32569 5845.87232   28.91239 

3.2 Teste de Glejser

Esse teste prevê a regressão auxiliar de \(|\hat u|\) em função de \(VENDAS\). O sumário está abaixo.

# Estimar “uhat.abs” em função de Vendas: ou seja, módulo dos resíduos em
# função de vendas:
reg.glejser <- lm(uhat.abs ~ VENDAS)
summary(reg.glejser)

Call:
lm(formula = uhat.abs ~ VENDAS)

Residuals:
    Min      1Q  Median      3Q     Max 
-4054.4  -714.0  -258.9   193.6  4766.1 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept) 5.786e+02  6.787e+02   0.852   0.4065  
VENDAS      1.194e-02  5.704e-03   2.093   0.0526 .
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1890 on 16 degrees of freedom
Multiple R-squared:  0.215, Adjusted R-squared:  0.1659 
F-statistic: 4.381 on 1 and 16 DF,  p-value: 0.05263

O coeficiente significativo (Pr(>|t|) inferior a 10% de significância) para \(VENDAS\) indica que \(VENDAS\) causa heterocedasticidade no modelo.

3.3 Teste de Breusch-Pagan - bptest simples

Esse teste prevê a regressão auxiliar de \(\hat u^2\) em função de \(VENDAS\). O sumário do teste está abaixo. Atente que nesse caso não aparece a regressão auxiliar, mas apenas a saída do teste.

bp.het <- bptest(regressao1, studentize = TRUE)
bp.het

    studentized Breusch-Pagan test

data:  regressao1
BP = 3.9952, df = 1, p-value = 0.04563

O valor de p-value = 0.04563 revela que rejeita H0: os resíduos são homocedásticos. Portanto, conclui-se pela presença de heterocedasticidade dos resíduos.

3.4 Teste de White Passo a Passo

Esse teste prevê a regressão auxiliar de \(\hat u^2\) como função das variáveis e variáveis ao quadrado, assim como os eventuais produtos cruzados. A rotina abaixo faz a regressão auxiliar, extrai a estatística de teste (\(LM\)) e seu respectivo p-valor (p.value).

m <- regressao1
data <- dados
# rotina do teste com base em m e data
u2 <- m$residuals^2
reg.auxiliar <- lm(u2 ~ VENDAS + I(VENDAS^2))  #Com termos cruzados, cross-terms
summary(reg.auxiliar)

Call:
lm(formula = u2 ~ VENDAS + I(VENDAS^2))

Residuals:
      Min        1Q    Median        3Q       Max 
-14823352  -8256873   -830623   3687265  37800060 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)  
(Intercept) -6.220e+06  6.460e+06  -0.963   0.3509  
VENDAS       2.294e+02  1.262e+02   1.817   0.0892 .
I(VENDAS^2) -5.371e-04  4.495e-04  -1.195   0.2507  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 13200000 on 15 degrees of freedom
Multiple R-squared:  0.2896,    Adjusted R-squared:  0.1949 
F-statistic: 3.057 on 2 and 15 DF,  p-value: 0.07698
Ru2 <- summary(reg.auxiliar)$r.squared
LM <- nrow(data) * Ru2
# obtendo o numero de regressores menos o intercepto
k <- length(coefficients(reg.auxiliar)) - 1
k
[1] 2
p.value <- 1 - pchisq(LM, k)  # O TESTE TEM k TERMOS REGRESSORES EM reg.auxiliar
# c('LM','p.value')
c(LM, p.value)
[1] 5.21249182 0.07381112

Da mesma forma que anteriormente, conclui-se pela presença de resíduos heterocedásticos, para um p.value = 0.07381112, portanto, menor que 10% de significância.

3.5 Teste de White pelo bptest

Aqui o mesmo teste é realizado pela função bptest, especificando adequadamente os regressores. Observe que neste caso não aparece a regressão auxiliar (de teste). A conclusão é idêntica ao bloco anterior.

library(lmtest)
bptest(regressao1, ~VENDAS + I(VENDAS^2))

    studentized Breusch-Pagan test

data:  regressao1
BP = 5.2125, df = 2, p-value = 0.07381

4 Correcao de Var-cov conforme White

A correção é aqui feita pelos erros robustos de White conforme a matriz de correção tipo HC1, como o padrão adotado pelo software Stata.

# regressao1<- lm(PD~VENDAS) library(car) possibilidades:
# hccm(regressao1,type=c('hc0','hc1','hc2','hc3','hc4'))
vcov.white0 <- hccm(regressao1, type = c("hc1"))
# 
coeftest(regressao1, vcov.white0)

t test of coefficients:

              Estimate Std. Error t value Pr(>|t|)   
(Intercept) 192.993110 533.931735  0.3615 0.722487   
VENDAS        0.031900   0.010147  3.1438 0.006276 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(regressao1)

Call:
lm(formula = PD ~ VENDAS)

Residuals:
    Min      1Q  Median      3Q     Max 
-5845.9  -950.6  -402.4   346.3  7434.3 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept) 1.930e+02  9.910e+02   0.195  0.84804   
VENDAS      3.190e-02  8.329e-03   3.830  0.00148 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 2759 on 16 degrees of freedom
Multiple R-squared:  0.4783,    Adjusted R-squared:  0.4457 
F-statistic: 14.67 on 1 and 16 DF,  p-value: 0.001476

Referências

GUJARATI, Damodar N.; PORTER, Dawn C. Econometria básica. 5.ed. Porto Alegre: AMGH/Bookman/McGraw-Hill do Brasil, 2011.

GUJARATI, Damodar N. Basic Econometrics. 4th edition. The McGraw−Hill Companies, 2004.

LS0tDQp0aXRsZTogIkVjb25vbWV0cmlhOiBleGVtcGxvIDExLjEwLCBoZXRlcm9jZWRhc3RpY2lkYWRlLCBHdWphcmF0aSAoMjAwNCwgcC40MjQgZW5nbGlzaCBlZGl0aW9uKSAocDM4OCBCcmF6aWxpYW4gZWRpdGlvbikiDQphdXRob3I6ICJBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMgRmlndWVpcmVkbyINCmUtbWFpbDogImFkcmlhbm8uZmlndWVpcmVkb0B1Zm1zLmJyIg0KYWJzdHJhY3Q6IA0KICBXZSBhbmFseXNlIGhldGVyb3NrZWRhc3RpY2l0eSB1c2luZyBleGFtcGxlIDExLjEwIGZyb20gR3VqYXJhdGkncyBCYXNpYyBFY29ub21ldHJpY3MuIA0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJWQgJUIgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiBkZWZhdWx0DQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGZpZ19jYXB0aW9uOiB0cnVlDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCmBgYHtyIGtuaXRyX2luaXQsIGVjaG89RkFMU0UsIGNhY2hlPUZBTFNFfQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkocm1hcmtkb3duKQ0KbGlicmFyeShybWRmb3JtYXRzKQ0KDQojIyBHbG9iYWwgb3B0aW9ucw0Kb3B0aW9ucyhtYXgucHJpbnQ9IjEwMCIpDQpvcHRzX2NodW5rJHNldChlY2hvPVRSVUUsDQoJICAgICAgICAgICAgIGNhY2hlPVRSVUUsDQogICAgICAgICAgICAgICBwcm9tcHQ9RkFMU0UsDQogICAgICAgICAgICAgICB0aWR5PVRSVUUsDQogICAgICAgICAgICAgICBjb21tZW50PU5BLA0KICAgICAgICAgICAgICAgbWVzc2FnZT1GQUxTRSwNCiAgICAgICAgICAgICAgIHdhcm5pbmc9RkFMU0UpDQpvcHRzX2tuaXQkc2V0KHdpZHRoPTEwMCkNCmBgYA0KDQoNCkxpY2Vuw6dhIHstI0xpY2Vuw6dhfQ0KPT09PT09PT09PT09PT09PT09PQ0KDQpUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiBUbyB2aWV3IGEgY29weSBvZiB0aGlzIGxpY2Vuc2UsIHZpc2l0IDxodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvPiBvciBzZW5kIGEgbGV0dGVyIHRvIENyZWF0aXZlIENvbW1vbnMsIFBPIEJveCAxODY2LCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0MiwgVVNBLg0KDQohW0xpY2Vuc2U6IENDIEJZLVNBIDQuMF0oaHR0cHM6Ly9taXJyb3JzLmNyZWF0aXZlY29tbW9ucy5vcmcvcHJlc3NraXQvYnV0dG9ucy84OHgzMS9wbmcvYnktc2EucG5nKXsgd2lkdGg9MjUlIH0NCg0KQ2l0YcOnw6NvIHstI0NpdGHDp8Ojb30NCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNClN1Z2VzdMOjbyBkZSBjaXRhw6fDo286DQpGSUdVRUlSRURPLCBBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMuIEVjb25vbWV0cmlhOiBleGVtcGxvIDExLjEwLCBoZXRlcm9jZWRhc3RpY2lkYWRlLCBHdWphcmF0aSAoMjAwNCwgcC40MjQgZW5nbGlzaCBlZGl0aW9uKSAocDM4OCBCcmF6aWxpYW4gZWRpdGlvbikuIENhbXBvIEdyYW5kZS1NUyxCcmFzaWw6IFJTdHVkaW8vUnB1YnMsIDIwMTkuIERpc3BvbsOtdmVsIGVtIDxodHRwOi8vcnB1YnMuY29tL2Ftcm9maS9HdWphcmF0aV9zYWxlc3A0MjQ+LiANCg0KSW50cm9kdcOnw6NvDQo9PT09PT09PT09PT09PT09PT09DQoNCk9zIHByaW1laXJvcyBwYXNzb3Mgc8OjbyBjcmlhciBvdSBhYnJpciB1bSBkaXJldMOzcmlvIGRlIHRyYWJhbGhvLiBTZSBvcHRhciBwb3IgY3JpYXIgdW0gbm92byBwcm9qZXRvLCBoYXZlcsOhIGEgcG9zc2liaWxpZGFkZSBkZSBjcmlhciBlbSB1bWEgcGFzdGEgdmF6aWEuIEVtIHNlZ3VpZGEsIHN1Z2VyZS1zZSBxdWUgY29sb3F1ZSBvcyBkYWRvcyBuZXN0YSBwYXN0YSwgc2UgcG9zc8OtdmVsIGVtIHVtIGFycXVpdm8gTVMgRXhjZWwgZSBjaGFtZSBhIHBsYW5pbGhhIGRlICdkYWRvcycuTmVzdGUgY2FzbywgYSBwbGFuaWxoYSBkZSBkYWRvcyBzZXLDoSBjb2xvY2FkYSBkZW50cm8gZG8gY8OzZGlnbyBnZXJhZG8gcGVsYSBmdW7Dp8OjbyBgZHB1dCgpYC4NCg0KYGBge3IgcHJlc3N1cmUsIGVjaG89RkFMU0UsIGZpZy5jYXA9IkVudW5jaWFkbyBFeGVtcGxvIDExLjEwLiBGb250ZTogR3VqYXJhdGksIDIwMDQsIHAuNDI0LiIsIG91dC53aWR0aCA9ICcxMDAlJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJJbWFnZW0xLnBuZyIpDQpgYGANCg0KDQpEYWRvcyBlIHJlZ3Jlc3PDo28gaW5pY2lhbA0KPT09PT09PT09PT09PT09PQ0KDQpBcXVpIGNoYW1hcmVtb3Mgb3MgZGFkb3MgcGVsYSBlc3RydXR1cmEgZG8gYGRwdXQoKWAgZXh0cmHDrWRvIHByZXZpYW1lbnRlLiBFbSBzZWd1aWRhIGZhcmVtb3MgYSByZWdyZXNzw6NvIGRvcyBnYXN0b3MgZGUgUCZEIChSJkQgRXhwZW5zZXMsIG91ICRQRCQpIGNvbW8gZnVuw6fDo28gZGFzIHZlbmRhcyAoU2FsZXMsICRWRU5EQVMkKS4gTyBzdW3DoXJpbyBkYSByZWdyZXNzw6NvIMOpIGFwcmVzZW50YWRvIGFvIGZpbmFsLiANCg0KYGBge3J9DQpkYWRvcyA8LSBzdHJ1Y3R1cmUobGlzdChvYnMgPSBjKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIA0KMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCksIFZFTkRBUyA9IGMoNjM3NS4zLCAxMTYyNi40LCAxNDY1NS4xLCANCjIxODY5LjIsIDI2NDA4LjMsIDMyNDA1LjYsIDM1MTA3LjcsIDQwMjk1LjQsIDcwNzYxLjYsIDgwNTUyLjgsIA0KOTUyOTQsIDEwMTMxNC4xLCAxMTYxNDEuMywgMTIyMzE1LjcsIDE0MTY0OS45LCAxNzUwMjUuOCwgMjMwNjE0LjUsIA0KMjkzNTQzKSwgUEQgPSBjKDYyLjUsIDkyLjksIDE3OC4zLCAyNTguNCwgNDk0LjcsIDEwODMsIDE2MjAuNiwgDQo0MjEuNywgNTA5LjIsIDY2MjAuMSwgMzkxOC42LCAxNTk1LjMsIDYxMDcuNSwgNDQ1NC4xLCAzMTYzLjgsIA0KMTMyMTAuNywgMTcwMy44LCA5NTI4LjIpLCBMVUNST1MgPSBjKDE4NS4xLCAxNTY5LjUsIDI3Ni44LCAyODI4LjEsIA0KMjI1LjksIDM3NTEuOSwgMjg4NC4xLCA0NjQ1LjcsIDUwMzYuNCwgMTM4NjkuOSwgNDQ4Ny44LCAxMDI3OC45LCANCjg3ODcuMjk5OTk5OTk5OTksIDE2NDM4LjgsIDk3NjEuNCwgMTk3NzQuNSwgMjI2MjYuNiwgMTg0MTUuNCkpLCByb3cubmFtZXMgPSBjKE5BLCANCi0xOEwpLCBjbGFzcyA9IGMoInRibF9kZiIsICJ0YmwiLCAiZGF0YS5mcmFtZSIpKQ0KDQpsaWJyYXJ5KHN0YXJnYXplcik7IGxpYnJhcnkoY2FyKTsgbGlicmFyeShsbXRlc3QpOyBsaWJyYXJ5KEFFUikNCiMgVkVOREFTID0gdmVuZGFzIHNldG9yaWFpcyAgDQojIFBEID0gcGVzcXVpc2EgZSBkZXNlbnZvbHZpbWVudG8NCiMgTFVDUk8gPSBsdWNybyBzZXRvcmlhbA0Ka25pdHI6OmthYmxlKGRhZG9zKQ0KYXR0YWNoKGRhZG9zKQ0KDQpyZWdyZXNzYW8xPC0gbG0oUER+VkVOREFTKQ0Kc3VtbWFyeShyZWdyZXNzYW8xKQ0KYGBgIA0KDQpBbsOhbGlzZSBlIFRlc3RlcyBkZSBIZXRlcm9jZWRhc3RpY2lkYWRlDQo9PT09PT09PT09PT09PQ0KDQojIyBSZXPDrWR1b3MNCg0KUHJpbWVpcm8gZ2VyYW1vcyBvcyByZXPDrWR1b3MgdWhhdCAoJFxoYXQgdSQpIGRhIHJlZ3Jlc3PDo28gMSBkbyBibG9jbyBhbnRlcmlvci4gRW0gc2VndWlkYSBnZXJhbW9zIHVoYXQyID0gcmVzw61kdW9zIGFvIHF1YWRyYWRvICgkXGhhdCB1XjIkKSBlIG9zIHZhbG9yZXMgYWJzb2x1dG9zIGRvcyByZXPDrWR1b3MsIHVoYXQuYWJzID0gKCR8XGhhdCB1fCQpLg0KDQpgYGB7cn0NCiNnZXJhciByZXNpZHVvcw0KdWhhdCA8LSByZWdyZXNzYW8xJHJlc2lkdWFscw0KdWhhdA0KdWhhdDI8LXVoYXReMg0KI3Jlc2lkdW9zIGVtIHZhbG9yZXMgYWJzb2x1dG9zDQp1aGF0LmFiczwtYWJzKHVoYXQpDQp1aGF0LmFicw0KYGBgDQoNCiMjIFRlc3RlIGRlIEdsZWpzZXINCg0KRXNzZSB0ZXN0ZSBwcmV2w6ogYSByZWdyZXNzw6NvIGF1eGlsaWFyIGRlICR8XGhhdCB1fCQgZW0gZnVuw6fDo28gZGUgJFZFTkRBUyQuIE8gc3Vtw6FyaW8gZXN0w6EgYWJhaXhvLg0KDQpgYGB7cn0NCiNFc3RpbWFyIOKAnHVoYXQuYWJz4oCdIGVtIGZ1bsOnw6NvIGRlIFZlbmRhczogDQojb3Ugc2VqYSwgbcOzZHVsbyBkb3MgcmVzw61kdW9zIGVtIGZ1bsOnw6NvIGRlIHZlbmRhczoNCnJlZy5nbGVqc2VyPC1sbSh1aGF0LmFic35WRU5EQVMpDQpzdW1tYXJ5KHJlZy5nbGVqc2VyKQ0KYGBgDQogICAgDQpPIGNvZWZpY2llbnRlIHNpZ25pZmljYXRpdm8gKFByKD58dHwpIGluZmVyaW9yIGEgMTAlIGRlIHNpZ25pZmljw6JuY2lhKSBwYXJhICRWRU5EQVMkIGluZGljYSBxdWUgJFZFTkRBUyQgY2F1c2EgaGV0ZXJvY2VkYXN0aWNpZGFkZSBubyBtb2RlbG8uICAgIA0KDQoNCiMjIFRlc3RlIGRlIEJyZXVzY2gtUGFnYW4gLSBgYnB0ZXN0YCBzaW1wbGVzDQoNCkVzc2UgdGVzdGUgcHJldsOqIGEgcmVncmVzc8OjbyBhdXhpbGlhciBkZSAkXGhhdCB1XjIkIGVtIGZ1bsOnw6NvIGRlICRWRU5EQVMkLiBPIHN1bcOhcmlvIGRvIHRlc3RlIGVzdMOhIGFiYWl4by4gQXRlbnRlIHF1ZSBuZXNzZSBjYXNvIG7Do28gYXBhcmVjZSBhIHJlZ3Jlc3PDo28gYXV4aWxpYXIsIG1hcyBhcGVuYXMgYSBzYcOtZGEgZG8gdGVzdGUuDQoNCmBgYHtyfQ0KYnAuaGV0PC1icHRlc3QocmVncmVzc2FvMSwgc3R1ZGVudGl6ZSA9IFRSVUUpDQpicC5oZXQNCmBgYA0KICAgIA0KTyB2YWxvciBkZSBgcC12YWx1ZSA9IDAuMDQ1NjNgIHJldmVsYSBxdWUgcmVqZWl0YSBfSDA6IG9zIHJlc8OtZHVvcyBzw6NvIGhvbW9jZWTDoXN0aWNvc18uIFBvcnRhbnRvLCBjb25jbHVpLXNlIHBlbGEgcHJlc2Vuw6dhIGRlIGhldGVyb2NlZGFzdGljaWRhZGUgZG9zIHJlc8OtZHVvcy4gICAgDQoNCiMjIFRlc3RlIGRlIFdoaXRlIFBhc3NvIGEgUGFzc28NCg0KRXNzZSB0ZXN0ZSBwcmV2w6ogYSByZWdyZXNzw6NvIGF1eGlsaWFyIGRlICRcaGF0IHVeMiQgY29tbyBmdW7Dp8OjbyBkYXMgdmFyacOhdmVpcyBlIHZhcmnDoXZlaXMgYW8gcXVhZHJhZG8sIGFzc2ltIGNvbW8gb3MgZXZlbnR1YWlzIHByb2R1dG9zIGNydXphZG9zLiBBIHJvdGluYSBhYmFpeG8gZmF6IGEgcmVncmVzc8OjbyBhdXhpbGlhciwgZXh0cmFpIGEgZXN0YXTDrXN0aWNhIGRlIHRlc3RlICgkTE0kKSBlIHNldSByZXNwZWN0aXZvIHAtdmFsb3IgKGBwLnZhbHVlYCkuICAgIA0KDQpgYGB7cn0NCm0gPC0gcmVncmVzc2FvMQ0KZGF0YSA8LSBkYWRvcw0KI3JvdGluYSBkbyB0ZXN0ZSBjb20gYmFzZSBlbSBtIGUgZGF0YQ0KdTIgPC0gbSRyZXNpZHVhbHNeMg0KcmVnLmF1eGlsaWFyIDwtIGxtKHUyIH4gVkVOREFTK0koVkVOREFTXjIpKSAgI0NvbSB0ZXJtb3MgY3J1emFkb3MsIGNyb3NzLXRlcm1zDQpzdW1tYXJ5KHJlZy5hdXhpbGlhcikNClJ1MjwtIHN1bW1hcnkocmVnLmF1eGlsaWFyKSRyLnNxdWFyZWQNCkxNIDwtIG5yb3coZGF0YSkqUnUyDQojb2J0ZW5kbyBvIG51bWVybyBkZSByZWdyZXNzb3JlcyBtZW5vcyBvIGludGVyY2VwdG8NCmsgPC0gbGVuZ3RoKGNvZWZmaWNpZW50cyhyZWcuYXV4aWxpYXIpKS0xDQprDQpwLnZhbHVlIDwtIDEtcGNoaXNxKExNLCBrKSAjIE8gVEVTVEUgVEVNIGsgVEVSTU9TIFJFR1JFU1NPUkVTIEVNIHJlZy5hdXhpbGlhcg0KI2MoIkxNIiwicC52YWx1ZSIpDQpjKExNLCBwLnZhbHVlKQ0KYGBgDQogICAgDQpEYSBtZXNtYSBmb3JtYSBxdWUgYW50ZXJpb3JtZW50ZSwgY29uY2x1aS1zZSBwZWxhIHByZXNlbsOnYSBkZSByZXPDrWR1b3MgaGV0ZXJvY2Vkw6FzdGljb3MsIHBhcmEgdW0gYHAudmFsdWUgPSAwLjA3MzgxMTEyYCwgcG9ydGFudG8sIG1lbm9yIHF1ZSAxMCUgZGUgc2lnbmlmaWPDom5jaWEuICAgIA0KDQojIyBUZXN0ZSBkZSBXaGl0ZSBwZWxvIGBicHRlc3RgDQoNCkFxdWkgbyBtZXNtbyB0ZXN0ZSDDqSByZWFsaXphZG8gcGVsYSBmdW7Dp8OjbyBgYnB0ZXN0YCwgZXNwZWNpZmljYW5kbyBhZGVxdWFkYW1lbnRlIG9zIHJlZ3Jlc3NvcmVzLiBPYnNlcnZlIHF1ZSBuZXN0ZSBjYXNvIG7Do28gYXBhcmVjZSBhIHJlZ3Jlc3PDo28gYXV4aWxpYXIgKGRlIHRlc3RlKS4gQSBjb25jbHVzw6NvIMOpIGlkw6pudGljYSBhbyBibG9jbyBhbnRlcmlvci4gICAgDQoNCmBgYHtyfQ0KbGlicmFyeShsbXRlc3QpDQpicHRlc3QocmVncmVzc2FvMSx+IFZFTkRBUytJKFZFTkRBU14yKSkNCmBgYA0KDQojIENvcnJlY2FvIGRlIFZhci1jb3YgY29uZm9ybWUgV2hpdGUNCg0KQSBjb3JyZcOnw6NvIMOpIGFxdWkgZmVpdGEgcGVsb3MgZXJyb3Mgcm9idXN0b3MgZGUgV2hpdGUgY29uZm9ybWUgYSBtYXRyaXogZGUgY29ycmXDp8OjbyB0aXBvIEhDMSwgY29tbyBvIHBhZHLDo28gYWRvdGFkbyBwZWxvIHNvZnR3YXJlIFN0YXRhLg0KDQpgYGB7cn0NCiNyZWdyZXNzYW8xPC0gbG0oUER+VkVOREFTKQ0KI2xpYnJhcnkoY2FyKSANCiNwb3NzaWJpbGlkYWRlczogaGNjbShyZWdyZXNzYW8xLHR5cGU9YygiaGMwIiwiaGMxIiwiaGMyIiwiaGMzIiwiaGM0IikpDQp2Y292LndoaXRlMDwtaGNjbShyZWdyZXNzYW8xLHR5cGU9YygiaGMxIikpDQojDQpjb2VmdGVzdChyZWdyZXNzYW8xLHZjb3Yud2hpdGUwKQ0Kc3VtbWFyeShyZWdyZXNzYW8xKQ0KYGBgDQoNClJlZmVyw6puY2lhcyB7LSNSZWZlcsOqbmNpYXN9DQo9PT09PT09PT09PT09PT09PQ0KDQpHVUpBUkFUSSwgRGFtb2RhciBOLjsgUE9SVEVSLCBEYXduIEMuIEVjb25vbWV0cmlhIGLDoXNpY2EuIDUuZWQuIFBvcnRvIEFsZWdyZTogQU1HSC9Cb29rbWFuL01jR3Jhdy1IaWxsIGRvIEJyYXNpbCwgMjAxMS4gDQoNCkdVSkFSQVRJLCBEYW1vZGFyIE4uIEJhc2ljIEVjb25vbWV0cmljcy4gNHRoIGVkaXRpb24uIFRoZSBNY0dyYXfiiJJIaWxsIENvbXBhbmllcywgMjAwNC4=