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

Citação

Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. Econometria: especificação: salários de advogados - Wooldridge(exemplo 7.8). Campo Grande-MS, Brasil: RStudio/Rpubs, 2020. Disponível em https://rpubs.com/amrofi/wooldridge_ex7_8_spec.

1 Introdução - Primeiros passos

Wooldridge Source: Collected by Kelly Barnett, an MSU economics student, for use in a term project. The data come from two sources: The Official Guide to U.S. Law Schools, 1986, Law School Admission Services, and The Gourman Report: A Ranking of Graduate and Professional Programs in American and International Universities, 1995, Washington, D.C. Data loads lazily.

O dataset do Wooldridge contém dados sobre a mediana dos salarios iniciais dos formados em Direito. Uma variável explicativa é a classificação da faculdade cursada.O grupo base é das faculdades com rank maior que 100

O script foi adaptado de https://www.r-econometrics.com/reproduction/wooldridge/wooldridge07/.

A data.frame with 156 observations on 21 variables:

rank: law school ranking    
salary: median starting salary    
cost: law school cost    
LSAT: median LSAT score    
GPA: median college GPA    
libvol: no. volumes in lib., 1000s    
faculty: no. of faculty    
age: age of law sch., years    
clsize: size of entering class    
north: =1 if law sch in north    
south: =1 if law sch in south    
east: =1 if law sch in east    
west: =1 if law sch in west    
lsalary: log(salary)    
studfac: student-faculty ratio    
top10: =1 if ranked in top 10    
r11_25: =1 if ranked 11-25    
r26_40: =1 if ranked 26-40    
r41_60: =1 if ranked 41-60    
llibvol: log(libvol)    
lcost: log(cost)    

2 Modelagem

2.1 Carregar os dados

library(wooldridge)
data("lawsch85")

Vamos gerar dummies (não era necessário, pois já estavam no dataset) para os rankings das faculdades. Criamos abaixo para ver como ficam, pois o dataset contém uma variável rank para os salarios (salary). O leitor pode investigar a forma como criamos dummies usando a variável rank e critérios de classes.

lawsch85$top10 <- as.numeric(lawsch85$rank <= 10)
lawsch85$r11.25 <- as.numeric(lawsch85$rank >= 11 & lawsch85$rank <= 25)
lawsch85$r26.40 <- as.numeric(lawsch85$rank >= 26 & lawsch85$rank <= 40)
lawsch85$r41.60 <- as.numeric(lawsch85$rank >= 41 & lawsch85$rank <= 60)
lawsch85$r61.100 <- as.numeric(lawsch85$rank >= 61 & lawsch85$rank <= 100)

As dummies foram criadas e já incorporadas ao dataset lawsch85. Podemos conferir, olhando pelo pacote knitr e função kable.

library(knitr)
kable(lawsch85[1:15,c(16:19,22:25)],caption="Dummies do dataset: recorte de 15 linhas")
Dummies do dataset: recorte de 15 linhas
top10 r11_25 r26_40 r41_60 r11.25 r26.40 r41.60 r61.100
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 1 0 0 1 0 0
0 0 0 1 0 0 1 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 1 0 0 1 0
0 1 0 0 1 0 0 0
0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0
0 0 1 0 0 1 0 0

Com essas variáveis, criamos um modelo inicial (mod1) do tipo log-log:

\[ \operatorname{log(salary)} = \alpha + \beta_{1}(\operatorname{log(rank)}) + \beta_{2}(\operatorname{log(LSAT)}) + \beta_{3}(\operatorname{log(GPA)}) + \beta_{4}(\operatorname{log(libvol)}) + \beta_{5}(\operatorname{log(cost)}) + \epsilon \] Depois um (mod2) linear:

\[ \operatorname{(salary)} = \alpha + \beta_{1}(\operatorname{rank}) + \beta_{2}(\operatorname{LSAT}) + \beta_{3}(\operatorname{GPA}) + \beta_{4}(\operatorname{libvol}) + \beta_{5}(\operatorname{cost}) + \epsilon \] e um modelo log-log (mod3) com as dummies:

\[ \begin{array}{l} \operatorname{log(salary)} = \alpha + \beta_{1}(\operatorname{top10}) + \beta_{2}(\operatorname{r11\_25}) + \beta_{3}(\operatorname{r26\_40}) +\\ \beta_{4}(\operatorname{r41\_60}) + \beta_{5}(\operatorname{r61.100}) + \beta_{6}(\operatorname{log(LSAT)}) + \beta_{7}(\operatorname{log(GPA)}) +\\ \beta_{8}(\operatorname{log(libvol)}) + \beta_{9}(\operatorname{log(cost)}) + \epsilon \end{array} \]

Portanto, os modelos são estimados e os resultados estão abaixo.

mod1 <- lm(log(salary) ~ log(rank) + log(LSAT) + log(GPA) 
           + log(libvol) + log(cost), data = lawsch85)
mod2 <- lm((salary) ~ (rank) + (LSAT) + (GPA) 
           + (libvol) + (cost), data = lawsch85)
mod3 <- lm(log(salary) ~ top10 + r11_25 + r26_40 + r41_60 + r61.100 
           + log(LSAT) + log(GPA) + log(libvol) + log(cost), data = lawsch85)
mod1$AIC <- AIC(mod1)
mod2$AIC <- AIC(mod2)
mod3$AIC <- AIC(mod3)
mod1$BIC <- BIC(mod1)
mod2$BIC <- BIC(mod2)
mod3$BIC <- BIC(mod3)
library(stargazer)
star.1 <- stargazer(mod1, mod2, mod3,
                    title="Título: Resultados das Regressões",
                    align=TRUE,
                    type = "text",
                    keep.stat=c("aic","bic","rsq", "adj.rsq","n")
)
## 
## Título: Resultados das Regressões
## =========================================================
##                              Dependent variable:         
##                     -------------------------------------
##                     log(salary)   (salary)    log(salary)
##                         (1)          (2)          (3)    
## ---------------------------------------------------------
## log(rank)            -0.227***                           
##                       (0.019)                            
##                                                          
## top10                                          0.700***  
##                                                 (0.053)  
##                                                          
## r11_25                                         0.593***  
##                                                 (0.039)  
##                                                          
## r26_40                                         0.374***  
##                                                 (0.034)  
##                                                          
## r41_60                                         0.262***  
##                                                 (0.028)  
##                                                          
## r61.100                                        0.131***  
##                                                 (0.021)  
##                                                          
## log(LSAT)              0.726                    0.885*   
##                       (0.559)                   (0.472)  
##                                                          
## log(GPA)               0.191                     0.057   
##                       (0.282)                   (0.239)  
##                                                          
## log(libvol)            0.017                     0.036   
##                       (0.033)                   (0.026)  
##                                                          
## log(cost)              0.008                     0.001   
##                       (0.029)                   (0.025)  
##                                                          
## rank                             -115.815***             
##                                   (16.153)               
##                                                          
## LSAT                               155.286               
##                                   (192.598)              
##                                                          
## GPA                             14,500.240***            
##                                  (4,357.070)             
##                                                          
## libvol                            12.956***              
##                                    (3.261)               
##                                                          
## cost                               0.366**               
##                                    (0.146)               
##                                                          
## Constant             7.383***    -33,124.550    5.562**  
##                       (2.577)   (25,210.760)    (2.141)  
##                                                          
## ---------------------------------------------------------
## Observations            136          136          136    
## R2                     0.870        0.806        0.911   
## Adjusted R2            0.865        0.798        0.905   
## Akaike Inf. Crit.    -227.844     2,737.692    -271.086  
## Bayesian Inf. Crit.  -207.455     2,758.080    -239.046  
## =========================================================
## Note:                         *p<0.1; **p<0.05; ***p<0.01

Podemos observar que os modelos com logs apresentam maiores R² ajustados mas apenas o rank como variável significativa, ou as dummies associadas aos ranks. Já o modelo linear aparece com menor R² ajustado mas com a maior parte das variáveis significativas estatisticamente. O leitor fica então com a impressão de que existem problemas de especificação. A melhor estratégia é observar todos os pressupostos clássicos e suas possíveis violações. Neste momento do curso, faremos apenas uma investigação do Ramsey RESET test e algum teste de omissão de variáveis.

2.2 Correlação

A análise de correlação permitirá ter uma ideia inicial de possível multicolinearidade. Olharei apenas um subset para as variáveis dos modelos.

# install.packages('corrplot')
library(corrplot)
dados<-lawsch85[,c('rank','LSAT','GPA','libvol','cost')]
corel <- cor(dados,method = "spearman",use = "complete.obs")
corrplot(corel, method = "number")

Podemos observar que GPA e LSAT tem uma correlação importante, de 0.78. Isso poderá causar não significância de parâmetros.

2.3 Testes de restrição dos modelos

Esses testes fazem uma estatística para avaliar um modelo restrito contra o modelo irrestrito. No presente caso, faremos apenas para o modelo log-log (mod3) com respeito às variáveis GPA, libvol e cost. O pacote car possui a função linearHypothesis que já fará o teste de restrição automaticamente (um teste F com H0 de que as variáveis testadas possuem parâmetros nulos). A rejeição de H0 implica na ideia de que as variáveis são importantes para o modelo, mesmo com parâmetros não significativos em mod3.

library(car)
# F test: APENAS ESPECIFICO AS QUE TERAO TESTE DE OMISSAO
myH0 <- c("log(GPA)","log(libvol)","log(cost)")
linearHypothesis(mod3, myH0)

Neste caso, o F=0.66 e a probabilidade associada de 0.57 indica a não rejeição de que os parâmetros destas variáveis (“log(GPA)”,“log(libvol)”,“log(cost)”) são nulos.

Outra forma de escrever o mesmo teste seria fazendo:

linearHypothesis(mod3, c("log(GPA)=0","log(libvol)=0","log(cost)=0")) 

Portanto, uma alternativa seria retirar essas variáveis do mod3. Antes, realizaremos um teste de Ramsey, o teste de erro de especificação da regressão (RESET).

2.4 Teste RESET

O teste RESET prevê a ideia de que adicionando termos da variável dependente ajustada ao quadrado, ao cubo e à quarta potências, seria o equivalente a testar o poder explicativo de variáveis explicativas quadráticas, cubicas e mesmo termos cruzados de X de forma que, para a H0 de que os termos de potências têm parâmetros nulos, ou que os termos \(Z_i \alpha_i\) tem \(\alpha_i=0\), a rejeição de H0 implica em existência de erros de especificação. Será um teste do tipo F. Faremos usando o pacote lmtest e sua função resettest, para cada um dos três modelos.

library(lmtest)
lmtest::resettest(mod1,power = 2:4,type = "fitted")
## 
##  RESET test
## 
## data:  mod1
## RESET = 29.637, df1 = 3, df2 = 127, p-value = 1.36e-14
lmtest::resettest(mod2,power = 2:4,type = "fitted")
## 
##  RESET test
## 
## data:  mod2
## RESET = 51, df1 = 3, df2 = 127, p-value < 2.2e-16
lmtest::resettest(mod3,power = 2:4,type = "fitted")
## 
##  RESET test
## 
## data:  mod3
## RESET = 3.0517, df1 = 3, df2 = 123, p-value = 0.03113

Nos três casos, a probabilidade menor que 1% para mod1 e mod2 e menor que 5% para mod3 indicam a existência de erros de especificação.

O pesquisador deve tomar cuidado, pois as vezes o teste RESET pode revelar que tem algo mais ocorrendo. Por exemplo, refaremos os testes para potências 2 e 3 apenas.

library(lmtest)
lmtest::resettest(mod1,power = 2:3,type = "fitted")
## 
##  RESET test
## 
## data:  mod1
## RESET = 42.71, df1 = 2, df2 = 128, p-value = 6.171e-15
lmtest::resettest(mod2,power = 2:3,type = "fitted")
## 
##  RESET test
## 
## data:  mod2
## RESET = 55.605, df1 = 2, df2 = 128, p-value < 2.2e-16
lmtest::resettest(mod3,power = 2:3,type = "fitted")
## 
##  RESET test
## 
## data:  mod3
## RESET = 0.30745, df1 = 2, df2 = 124, p-value = 0.7359

Neste caso, o modelo 3 “passou” no teste, não acusando erro de especificação. É importante observar que alguns softwares fazem por padrão apenas com essas potências, como é o caso do pacote lmtest, por entender ser suficiente com 2 e 3 potências. Veja abaixo pelo “default”, ou seja, sem colocar a opção power.

library(lmtest)
lmtest::resettest(mod1,type = "fitted")
## 
##  RESET test
## 
## data:  mod1
## RESET = 42.71, df1 = 2, df2 = 128, p-value = 6.171e-15
lmtest::resettest(mod2,type = "fitted")
## 
##  RESET test
## 
## data:  mod2
## RESET = 55.605, df1 = 2, df2 = 128, p-value < 2.2e-16
lmtest::resettest(mod3,type = "fitted")
## 
##  RESET test
## 
## data:  mod3
## RESET = 0.30745, df1 = 2, df2 = 124, p-value = 0.7359

3 Referências

HEISS, Florian. Using R for Introductory Econometrics. 2.ed. Florian Heiss, 2020. Recurso online. Disponível em: http://www.urfie.net/.

SHEA, Justin M. wooldridge: vignette. 2020. Disponível em: https://justinmshea.github.io/wooldridge/articles/Introductory-Econometrics-Examples.html.

SHEA, Justin M. wooldridge: 111 Data Sets from “Introductory Econometrics: A Modern Approach, 6e” by Jeffrey M. Wooldridge. R package version 1.3.1. 2018. Disponível em: https://CRAN.R-project.org/package=wooldridge.

WOOLDRIDGE, J.M. Introdução à Econometria: uma abordagem moderna. São Paulo: Pioneira Thomson Learning, 2006.(tradução da segunda edição americana).

WOOLDRIDGE, Jeffrey M. Introductory econometrics: A modern approach. Nelson Education, 2016.

LS0tDQp0aXRsZTogIkVjb25vbWV0cmlhOiBlc3BlY2lmaWNhw6fDo286IHNhbMOhcmlvcyBkZSBhZHZvZ2Fkb3MgLSBXb29sZHJpZGdlKGV4ZW1wbG8gNy44KSINCmF1dGhvcjogIkFkcmlhbm8gTWFyY29zIFJvZHJpZ3VlcyBGaWd1ZWlyZWRvLCAqZS1tYWlsOiBhZHJpYW5vLmZpZ3VlaXJlZG9AdWZtcy5icioiDQphYnN0cmFjdDogDQogIFRoaXMgaXMgYW4gdW5kZXJncmFkIHN0dWRlbnQgbGV2ZWwgZXhlcmNpc2UgZm9yIGNsYXNzIHVzZS4gDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclZCAlQiAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogZGVmYXVsdA0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQoNCkxpY2Vuw6dhIHstI0xpY2Vuw6dhfQ0KPT09PT09PT09PT09PT09PT09PQ0KDQpUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiBUbyB2aWV3IGEgY29weSBvZiB0aGlzIGxpY2Vuc2UsIHZpc2l0IDxodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvPiBvciBzZW5kIGEgbGV0dGVyIHRvIENyZWF0aXZlIENvbW1vbnMsIFBPIEJveCAxODY2LCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0MiwgVVNBLg0KDQohW0xpY2Vuc2U6IENDIEJZLVNBIDQuMF0oaHR0cHM6Ly9taXJyb3JzLmNyZWF0aXZlY29tbW9ucy5vcmcvcHJlc3NraXQvYnV0dG9ucy84OHgzMS9wbmcvYnktc2EucG5nKXsgd2lkdGg9MjUlIH0NCg0KDQpDaXRhw6fDo28gey0jQ2l0YcOnw6NvfQ0KPT09PT09PT09PT09PT09PT09PSANCg0KU3VnZXN0w6NvIGRlIGNpdGHDp8OjbzoNCkZJR1VFSVJFRE8sIEFkcmlhbm8gTWFyY29zIFJvZHJpZ3Vlcy4gRWNvbm9tZXRyaWE6IGVzcGVjaWZpY2HDp8Ojbzogc2Fsw6FyaW9zIGRlIGFkdm9nYWRvcyAtIFdvb2xkcmlkZ2UoZXhlbXBsbyA3LjgpLiBDYW1wbyBHcmFuZGUtTVMsIEJyYXNpbDogUlN0dWRpby9ScHVicywgMjAyMC4gRGlzcG9uw612ZWwgZW0gPGh0dHBzOi8vcnB1YnMuY29tL2Ftcm9maS93b29sZHJpZGdlX2V4N184X3NwZWM+LiANCg0KSW50cm9kdcOnw6NvIC0gUHJpbWVpcm9zIHBhc3Nvcw0KPT09PT09PT09PT09PT09PT09PQ0KDQo+IFdvb2xkcmlkZ2UgU291cmNlOiBDb2xsZWN0ZWQgYnkgS2VsbHkgQmFybmV0dCwgYW4gTVNVIGVjb25vbWljcyBzdHVkZW50LCBmb3IgdXNlIGluIGEgdGVybSBwcm9qZWN0LiBUaGUgZGF0YSBjb21lIGZyb20gdHdvIHNvdXJjZXM6IFRoZSBPZmZpY2lhbCBHdWlkZSB0byBVLlMuIExhdyBTY2hvb2xzLCAxOTg2LCBMYXcgU2Nob29sIEFkbWlzc2lvbiBTZXJ2aWNlcywgYW5kIFRoZSBHb3VybWFuIFJlcG9ydDogQSBSYW5raW5nIG9mIEdyYWR1YXRlIGFuZCBQcm9mZXNzaW9uYWwgUHJvZ3JhbXMgaW4gQW1lcmljYW4gYW5kIEludGVybmF0aW9uYWwgVW5pdmVyc2l0aWVzLCAxOTk1LCBXYXNoaW5ndG9uLCBELkMuIERhdGEgbG9hZHMgbGF6aWx5Lg0KDQo+IE8gZGF0YXNldCBkbyBXb29sZHJpZGdlIGNvbnTDqW0gZGFkb3Mgc29icmUgYSBtZWRpYW5hIGRvcyBzYWxhcmlvcyBpbmljaWFpcyBkb3MgZm9ybWFkb3MgZW0gRGlyZWl0by4gVW1hIHZhcmnDoXZlbCBleHBsaWNhdGl2YSDDqSBhIGNsYXNzaWZpY2HDp8OjbyBkYSBmYWN1bGRhZGUgY3Vyc2FkYS5PIGdydXBvIGJhc2Ugw6kgZGFzIGZhY3VsZGFkZXMgY29tIHJhbmsgbWFpb3IgcXVlIDEwMCANCg0KTyBzY3JpcHQgZm9pIGFkYXB0YWRvIGRlIDxodHRwczovL3d3dy5yLWVjb25vbWV0cmljcy5jb20vcmVwcm9kdWN0aW9uL3dvb2xkcmlkZ2Uvd29vbGRyaWRnZTA3Lz4uDQoNCkEgZGF0YS5mcmFtZSB3aXRoIDE1NiBvYnNlcnZhdGlvbnMgb24gMjEgdmFyaWFibGVzOg0KDQpgYGANCnJhbms6IGxhdyBzY2hvb2wgcmFua2luZyAgICANCnNhbGFyeTogbWVkaWFuIHN0YXJ0aW5nIHNhbGFyeSAgICANCmNvc3Q6IGxhdyBzY2hvb2wgY29zdCAgICANCkxTQVQ6IG1lZGlhbiBMU0FUIHNjb3JlICAgIA0KR1BBOiBtZWRpYW4gY29sbGVnZSBHUEEgICAgDQpsaWJ2b2w6IG5vLiB2b2x1bWVzIGluIGxpYi4sIDEwMDBzICAgIA0KZmFjdWx0eTogbm8uIG9mIGZhY3VsdHkgICAgDQphZ2U6IGFnZSBvZiBsYXcgc2NoLiwgeWVhcnMgICAgDQpjbHNpemU6IHNpemUgb2YgZW50ZXJpbmcgY2xhc3MgICAgDQpub3J0aDogPTEgaWYgbGF3IHNjaCBpbiBub3J0aCAgICANCnNvdXRoOiA9MSBpZiBsYXcgc2NoIGluIHNvdXRoICAgIA0KZWFzdDogPTEgaWYgbGF3IHNjaCBpbiBlYXN0ICAgIA0Kd2VzdDogPTEgaWYgbGF3IHNjaCBpbiB3ZXN0ICAgIA0KbHNhbGFyeTogbG9nKHNhbGFyeSkgICAgDQpzdHVkZmFjOiBzdHVkZW50LWZhY3VsdHkgcmF0aW8gICAgDQp0b3AxMDogPTEgaWYgcmFua2VkIGluIHRvcCAxMCAgICANCnIxMV8yNTogPTEgaWYgcmFua2VkIDExLTI1ICAgIA0KcjI2XzQwOiA9MSBpZiByYW5rZWQgMjYtNDAgICAgDQpyNDFfNjA6ID0xIGlmIHJhbmtlZCA0MS02MCAgICANCmxsaWJ2b2w6IGxvZyhsaWJ2b2wpICAgIA0KbGNvc3Q6IGxvZyhjb3N0KSAgICANCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQ0KIyBpbmNsdWRlIHRoaXMgY29kZSBjaHVuayBhcy1pcyB0byBzZXQgb3B0aW9ucw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGNvbW1lbnQ9TkEsIHByb21wdD1UUlVFLCBvdXQud2lkdGg9NzUwLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD04KQ0KYGBgDQoNCk1vZGVsYWdlbQ0KPT09PT09PT09PT09PT09PT09PQ0KDQojIyBDYXJyZWdhciBvcyBkYWRvcw0KDQpgYGB7cn0NCmxpYnJhcnkod29vbGRyaWRnZSkNCmRhdGEoImxhd3NjaDg1IikNCmBgYA0KDQpWYW1vcyBnZXJhciBkdW1taWVzIChuw6NvIGVyYSBuZWNlc3PDoXJpbywgcG9pcyBqw6EgZXN0YXZhbSBubyBkYXRhc2V0KSBwYXJhIG9zIHJhbmtpbmdzIGRhcyBmYWN1bGRhZGVzLiBDcmlhbW9zIGFiYWl4byBwYXJhIHZlciBjb21vIGZpY2FtLCBwb2lzIG8gZGF0YXNldCBjb250w6ltIHVtYSB2YXJpw6F2ZWwgcmFuayBwYXJhIG9zIHNhbGFyaW9zIChzYWxhcnkpLiBPIGxlaXRvciBwb2RlIGludmVzdGlnYXIgYSBmb3JtYSBjb21vIGNyaWFtb3MgZHVtbWllcyB1c2FuZG8gYSB2YXJpw6F2ZWwgcmFuayBlIGNyaXTDqXJpb3MgZGUgY2xhc3Nlcy4NCg0KYGBge3J9DQpsYXdzY2g4NSR0b3AxMCA8LSBhcy5udW1lcmljKGxhd3NjaDg1JHJhbmsgPD0gMTApDQpsYXdzY2g4NSRyMTEuMjUgPC0gYXMubnVtZXJpYyhsYXdzY2g4NSRyYW5rID49IDExICYgbGF3c2NoODUkcmFuayA8PSAyNSkNCmxhd3NjaDg1JHIyNi40MCA8LSBhcy5udW1lcmljKGxhd3NjaDg1JHJhbmsgPj0gMjYgJiBsYXdzY2g4NSRyYW5rIDw9IDQwKQ0KbGF3c2NoODUkcjQxLjYwIDwtIGFzLm51bWVyaWMobGF3c2NoODUkcmFuayA+PSA0MSAmIGxhd3NjaDg1JHJhbmsgPD0gNjApDQpsYXdzY2g4NSRyNjEuMTAwIDwtIGFzLm51bWVyaWMobGF3c2NoODUkcmFuayA+PSA2MSAmIGxhd3NjaDg1JHJhbmsgPD0gMTAwKQ0KYGBgDQoNCkFzIGR1bW1pZXMgZm9yYW0gY3JpYWRhcyBlIGrDoSBpbmNvcnBvcmFkYXMgYW8gZGF0YXNldCBgbGF3c2NoODVgLiBQb2RlbW9zIGNvbmZlcmlyLCBvbGhhbmRvIHBlbG8gcGFjb3RlIGBrbml0cmAgZSBmdW7Dp8OjbyBga2FibGVgLg0KDQpgYGB7cn0NCmxpYnJhcnkoa25pdHIpDQprYWJsZShsYXdzY2g4NVsxOjE1LGMoMTY6MTksMjI6MjUpXSxjYXB0aW9uPSJEdW1taWVzIGRvIGRhdGFzZXQ6IHJlY29ydGUgZGUgMTUgbGluaGFzIikNCg0KYGBgDQpDb20gZXNzYXMgdmFyacOhdmVpcywgY3JpYW1vcyB1bSBtb2RlbG8gaW5pY2lhbCAobW9kMSkgZG8gdGlwbyBsb2ctbG9nOg0KDQokJA0KXG9wZXJhdG9ybmFtZXtsb2coc2FsYXJ5KX0gPSBcYWxwaGEgKyBcYmV0YV97MX0oXG9wZXJhdG9ybmFtZXtsb2cocmFuayl9KSArIFxiZXRhX3syfShcb3BlcmF0b3JuYW1le2xvZyhMU0FUKX0pICsgXGJldGFfezN9KFxvcGVyYXRvcm5hbWV7bG9nKEdQQSl9KSArIFxiZXRhX3s0fShcb3BlcmF0b3JuYW1le2xvZyhsaWJ2b2wpfSkgKyBcYmV0YV97NX0oXG9wZXJhdG9ybmFtZXtsb2coY29zdCl9KSArIFxlcHNpbG9uDQokJA0KRGVwb2lzIHVtIChtb2QyKSBsaW5lYXI6DQoNCiQkDQpcb3BlcmF0b3JuYW1leyhzYWxhcnkpfSA9IFxhbHBoYSArIFxiZXRhX3sxfShcb3BlcmF0b3JuYW1le3Jhbmt9KSArIFxiZXRhX3syfShcb3BlcmF0b3JuYW1le0xTQVR9KSArIFxiZXRhX3szfShcb3BlcmF0b3JuYW1le0dQQX0pICsgXGJldGFfezR9KFxvcGVyYXRvcm5hbWV7bGlidm9sfSkgKyBcYmV0YV97NX0oXG9wZXJhdG9ybmFtZXtjb3N0fSkgKyBcZXBzaWxvbg0KJCQNCmUgdW0gbW9kZWxvIGxvZy1sb2cgKG1vZDMpIGNvbSBhcyBkdW1taWVzOg0KDQpcWw0KXGJlZ2lue2FycmF5fXtsfQ0KXG9wZXJhdG9ybmFtZXtsb2coc2FsYXJ5KX0gPSBcYWxwaGEgKyBcYmV0YV97MX0oXG9wZXJhdG9ybmFtZXt0b3AxMH0pICsgXGJldGFfezJ9KFxvcGVyYXRvcm5hbWV7cjExXF8yNX0pICsgXGJldGFfezN9KFxvcGVyYXRvcm5hbWV7cjI2XF80MH0pICtcXA0KXGJldGFfezR9KFxvcGVyYXRvcm5hbWV7cjQxXF82MH0pICsgXGJldGFfezV9KFxvcGVyYXRvcm5hbWV7cjYxLjEwMH0pICsgXGJldGFfezZ9KFxvcGVyYXRvcm5hbWV7bG9nKExTQVQpfSkgKyBcYmV0YV97N30oXG9wZXJhdG9ybmFtZXtsb2coR1BBKX0pICtcXA0KXGJldGFfezh9KFxvcGVyYXRvcm5hbWV7bG9nKGxpYnZvbCl9KSArIFxiZXRhX3s5fShcb3BlcmF0b3JuYW1le2xvZyhjb3N0KX0pICsgXGVwc2lsb24NClxlbmR7YXJyYXl9DQpcXQ0KICAgICANClBvcnRhbnRvLCBvcyBtb2RlbG9zIHPDo28gZXN0aW1hZG9zIGUgb3MgcmVzdWx0YWRvcyBlc3TDo28gYWJhaXhvLg0KDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQptb2QxIDwtIGxtKGxvZyhzYWxhcnkpIH4gbG9nKHJhbmspICsgbG9nKExTQVQpICsgbG9nKEdQQSkgDQogICAgICAgICAgICsgbG9nKGxpYnZvbCkgKyBsb2coY29zdCksIGRhdGEgPSBsYXdzY2g4NSkNCm1vZDIgPC0gbG0oKHNhbGFyeSkgfiAocmFuaykgKyAoTFNBVCkgKyAoR1BBKSANCiAgICAgICAgICAgKyAobGlidm9sKSArIChjb3N0KSwgZGF0YSA9IGxhd3NjaDg1KQ0KbW9kMyA8LSBsbShsb2coc2FsYXJ5KSB+IHRvcDEwICsgcjExXzI1ICsgcjI2XzQwICsgcjQxXzYwICsgcjYxLjEwMCANCiAgICAgICAgICAgKyBsb2coTFNBVCkgKyBsb2coR1BBKSArIGxvZyhsaWJ2b2wpICsgbG9nKGNvc3QpLCBkYXRhID0gbGF3c2NoODUpDQptb2QxJEFJQyA8LSBBSUMobW9kMSkNCm1vZDIkQUlDIDwtIEFJQyhtb2QyKQ0KbW9kMyRBSUMgPC0gQUlDKG1vZDMpDQptb2QxJEJJQyA8LSBCSUMobW9kMSkNCm1vZDIkQklDIDwtIEJJQyhtb2QyKQ0KbW9kMyRCSUMgPC0gQklDKG1vZDMpDQpsaWJyYXJ5KHN0YXJnYXplcikNCnN0YXIuMSA8LSBzdGFyZ2F6ZXIobW9kMSwgbW9kMiwgbW9kMywNCiAgICAgICAgICAgICAgICAgICAgdGl0bGU9IlTDrXR1bG86IFJlc3VsdGFkb3MgZGFzIFJlZ3Jlc3PDtWVzIiwNCiAgICAgICAgICAgICAgICAgICAgYWxpZ249VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ0ZXh0IiwNCiAgICAgICAgICAgICAgICAgICAga2VlcC5zdGF0PWMoImFpYyIsImJpYyIsInJzcSIsICJhZGoucnNxIiwibiIpDQopDQoNCmBgYA0KDQpQb2RlbW9zIG9ic2VydmFyIHF1ZSBvcyBtb2RlbG9zIGNvbSBsb2dzIGFwcmVzZW50YW0gbWFpb3JlcyBSwrIgYWp1c3RhZG9zIG1hcyBhcGVuYXMgbyByYW5rIGNvbW8gdmFyacOhdmVsIHNpZ25pZmljYXRpdmEsIG91IGFzIGR1bW1pZXMgYXNzb2NpYWRhcyBhb3MgcmFua3MuIErDoSBvIG1vZGVsbyBsaW5lYXIgYXBhcmVjZSBjb20gbWVub3IgUsKyIGFqdXN0YWRvIG1hcyBjb20gYSBtYWlvciBwYXJ0ZSBkYXMgdmFyacOhdmVpcyBzaWduaWZpY2F0aXZhcyBlc3RhdGlzdGljYW1lbnRlLiBPIGxlaXRvciBmaWNhIGVudMOjbyBjb20gYSBpbXByZXNzw6NvIGRlIHF1ZSBleGlzdGVtIHByb2JsZW1hcyBkZSBlc3BlY2lmaWNhw6fDo28uIEEgbWVsaG9yIGVzdHJhdMOpZ2lhIMOpIG9ic2VydmFyIHRvZG9zIG9zIHByZXNzdXBvc3RvcyBjbMOhc3NpY29zIGUgc3VhcyBwb3Nzw612ZWlzIHZpb2xhw6fDtWVzLiBOZXN0ZSBtb21lbnRvIGRvIGN1cnNvLCBmYXJlbW9zIGFwZW5hcyB1bWEgaW52ZXN0aWdhw6fDo28gZG8gUmFtc2V5IFJFU0VUIHRlc3QgZSBhbGd1bSB0ZXN0ZSBkZSBvbWlzc8OjbyBkZSB2YXJpw6F2ZWlzLg0KDQojIyBDb3JyZWxhw6fDo28NCg0KQSBhbsOhbGlzZSBkZSBjb3JyZWxhw6fDo28gcGVybWl0aXLDoSB0ZXIgdW1hIGlkZWlhIGluaWNpYWwgZGUgcG9zc8OtdmVsIG11bHRpY29saW5lYXJpZGFkZS4gT2xoYXJlaSBhcGVuYXMgdW0gc3Vic2V0IHBhcmEgYXMgdmFyacOhdmVpcyBkb3MgbW9kZWxvcy4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCiMgaW5zdGFsbC5wYWNrYWdlcygnY29ycnBsb3QnKQ0KbGlicmFyeShjb3JycGxvdCkNCmRhZG9zPC1sYXdzY2g4NVssYygncmFuaycsJ0xTQVQnLCdHUEEnLCdsaWJ2b2wnLCdjb3N0JyldDQpjb3JlbCA8LSBjb3IoZGFkb3MsbWV0aG9kID0gInNwZWFybWFuIix1c2UgPSAiY29tcGxldGUub2JzIikNCmNvcnJwbG90KGNvcmVsLCBtZXRob2QgPSAibnVtYmVyIikNCg0KYGBgDQoNClBvZGVtb3Mgb2JzZXJ2YXIgcXVlIEdQQSBlIExTQVQgdGVtIHVtYSBjb3JyZWxhw6fDo28gaW1wb3J0YW50ZSwgZGUgMC43OC4gSXNzbyBwb2RlcsOhIGNhdXNhciBuw6NvIHNpZ25pZmljw6JuY2lhIGRlIHBhcsOibWV0cm9zLiAgICAgICAgDQoNCiMjIFRlc3RlcyBkZSByZXN0cmnDp8OjbyBkb3MgbW9kZWxvcw0KDQpFc3NlcyB0ZXN0ZXMgZmF6ZW0gdW1hIGVzdGF0w61zdGljYSBwYXJhIGF2YWxpYXIgdW0gbW9kZWxvIHJlc3RyaXRvIGNvbnRyYSBvIG1vZGVsbyBpcnJlc3RyaXRvLiBObyBwcmVzZW50ZSBjYXNvLCBmYXJlbW9zIGFwZW5hcyBwYXJhIG8gbW9kZWxvIGxvZy1sb2cgKGBtb2QzYCkgY29tIHJlc3BlaXRvIMOgcyB2YXJpw6F2ZWlzIGBHUEFgLCBgbGlidm9sYCBlIGBjb3N0YC4gTyBwYWNvdGUgYGNhcmAgcG9zc3VpIGEgZnVuw6fDo28gYGxpbmVhckh5cG90aGVzaXNgIHF1ZSBqw6EgZmFyw6EgbyB0ZXN0ZSBkZSByZXN0cmnDp8OjbyBhdXRvbWF0aWNhbWVudGUgKHVtIHRlc3RlIEYgY29tIEgwIGRlIHF1ZSBhcyB2YXJpw6F2ZWlzIHRlc3RhZGFzIHBvc3N1ZW0gcGFyw6JtZXRyb3MgbnVsb3MpLiBBIHJlamVpw6fDo28gZGUgSDAgaW1wbGljYSBuYSBpZGVpYSBkZSBxdWUgYXMgdmFyacOhdmVpcyBzw6NvIGltcG9ydGFudGVzIHBhcmEgbyBtb2RlbG8sIG1lc21vIGNvbSBwYXLDom1ldHJvcyBuw6NvIHNpZ25pZmljYXRpdm9zIGVtIGBtb2QzYC4gDQoNCmBgYHtyLGV2YWw9VFJVRSwgbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShjYXIpDQojIEYgdGVzdDogQVBFTkFTIEVTUEVDSUZJQ08gQVMgUVVFIFRFUkFPIFRFU1RFIERFIE9NSVNTQU8NCm15SDAgPC0gYygibG9nKEdQQSkiLCJsb2cobGlidm9sKSIsImxvZyhjb3N0KSIpDQpsaW5lYXJIeXBvdGhlc2lzKG1vZDMsIG15SDApDQpgYGANCk5lc3RlIGNhc28sIG8gRj0wLjY2IGUgYSBwcm9iYWJpbGlkYWRlIGFzc29jaWFkYSBkZSAwLjU3IGluZGljYSBhIG7Do28gcmVqZWnDp8OjbyBkZSBxdWUgb3MgcGFyw6JtZXRyb3MgZGVzdGFzIHZhcmnDoXZlaXMgKCJsb2coR1BBKSIsImxvZyhsaWJ2b2wpIiwibG9nKGNvc3QpIikgc8OjbyBudWxvcy4gICAgIA0KDQpPdXRyYSBmb3JtYSBkZSBlc2NyZXZlciBvIG1lc21vIHRlc3RlIHNlcmlhIGZhemVuZG86DQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpsaW5lYXJIeXBvdGhlc2lzKG1vZDMsIGMoImxvZyhHUEEpPTAiLCJsb2cobGlidm9sKT0wIiwibG9nKGNvc3QpPTAiKSkgDQpgYGANCg0KUG9ydGFudG8sIHVtYSBhbHRlcm5hdGl2YSBzZXJpYSByZXRpcmFyIGVzc2FzIHZhcmnDoXZlaXMgZG8gYG1vZDNgLiBBbnRlcywgcmVhbGl6YXJlbW9zIHVtIHRlc3RlIGRlIFJhbXNleSwgbyB0ZXN0ZSBkZSBlcnJvIGRlIGVzcGVjaWZpY2HDp8OjbyBkYSByZWdyZXNzw6NvIChSRVNFVCkuDQoNCg0KIyMgVGVzdGUgUkVTRVQNCg0KTyB0ZXN0ZSBSRVNFVCBwcmV2w6ogYSBpZGVpYSBkZSBxdWUgYWRpY2lvbmFuZG8gdGVybW9zIGRhIHZhcmnDoXZlbCBkZXBlbmRlbnRlIGFqdXN0YWRhIGFvIHF1YWRyYWRvLCBhbyBjdWJvIGUgw6AgcXVhcnRhIHBvdMOqbmNpYXMsIHNlcmlhIG8gZXF1aXZhbGVudGUgYSB0ZXN0YXIgbyBwb2RlciBleHBsaWNhdGl2byBkZSB2YXJpw6F2ZWlzIGV4cGxpY2F0aXZhcyBxdWFkcsOhdGljYXMsIGN1YmljYXMgZSBtZXNtbyB0ZXJtb3MgY3J1emFkb3MgZGUgWCBkZSBmb3JtYSBxdWUsIHBhcmEgYSBIMCBkZSBxdWUgb3MgdGVybW9zIGRlIHBvdMOqbmNpYXMgdMOqbSBwYXLDom1ldHJvcyBudWxvcywgb3UgcXVlIG9zIHRlcm1vcyAkWl9pIFxhbHBoYV9pJCB0ZW0gJFxhbHBoYV9pPTAkLCBhIHJlamVpw6fDo28gZGUgSDAgaW1wbGljYSBlbSBleGlzdMOqbmNpYSBkZSBlcnJvcyBkZSBlc3BlY2lmaWNhw6fDo28uIFNlcsOhIHVtIHRlc3RlIGRvIHRpcG8gRi4gRmFyZW1vcyB1c2FuZG8gbyBwYWNvdGUgYGxtdGVzdGAgZSBzdWEgZnVuw6fDo28gYHJlc2V0dGVzdGAsIHBhcmEgY2FkYSB1bSBkb3MgdHLDqnMgbW9kZWxvcy4gICAgDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGxtdGVzdCkNCmxtdGVzdDo6cmVzZXR0ZXN0KG1vZDEscG93ZXIgPSAyOjQsdHlwZSA9ICJmaXR0ZWQiKQ0KbG10ZXN0OjpyZXNldHRlc3QobW9kMixwb3dlciA9IDI6NCx0eXBlID0gImZpdHRlZCIpDQpsbXRlc3Q6OnJlc2V0dGVzdChtb2QzLHBvd2VyID0gMjo0LHR5cGUgPSAiZml0dGVkIikNCg0KYGBgDQpOb3MgdHLDqnMgY2Fzb3MsIGEgcHJvYmFiaWxpZGFkZSBtZW5vciBxdWUgMSUgcGFyYSBtb2QxIGUgbW9kMiBlIG1lbm9yIHF1ZSA1JSBwYXJhIG1vZDMgaW5kaWNhbSBhIGV4aXN0w6puY2lhIGRlIGVycm9zIGRlIGVzcGVjaWZpY2HDp8Ojby4gICAgDQogICAgDQpPIHBlc3F1aXNhZG9yIGRldmUgdG9tYXIgY3VpZGFkbywgcG9pcyBhcyB2ZXplcyBvIHRlc3RlIFJFU0VUIHBvZGUgcmV2ZWxhciBxdWUgdGVtIGFsZ28gbWFpcyBvY29ycmVuZG8uIFBvciBleGVtcGxvLCByZWZhcmVtb3Mgb3MgdGVzdGVzIHBhcmEgcG90w6puY2lhcyAyIGUgMyBhcGVuYXMuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGxtdGVzdCkNCmxtdGVzdDo6cmVzZXR0ZXN0KG1vZDEscG93ZXIgPSAyOjMsdHlwZSA9ICJmaXR0ZWQiKQ0KbG10ZXN0OjpyZXNldHRlc3QobW9kMixwb3dlciA9IDI6Myx0eXBlID0gImZpdHRlZCIpDQpsbXRlc3Q6OnJlc2V0dGVzdChtb2QzLHBvd2VyID0gMjozLHR5cGUgPSAiZml0dGVkIikNCg0KYGBgDQoNCk5lc3RlIGNhc28sIG8gbW9kZWxvIDMgInBhc3NvdSIgbm8gdGVzdGUsIG7Do28gYWN1c2FuZG8gZXJybyBkZSBlc3BlY2lmaWNhw6fDo28uIMOJIGltcG9ydGFudGUgb2JzZXJ2YXIgcXVlIGFsZ3VucyBzb2Z0d2FyZXMgZmF6ZW0gcG9yIHBhZHLDo28gYXBlbmFzIGNvbSBlc3NhcyBwb3TDqm5jaWFzLCBjb21vIMOpIG8gY2FzbyBkbyBwYWNvdGUgYGxtdGVzdGAsIHBvciBlbnRlbmRlciBzZXIgc3VmaWNpZW50ZSBjb20gMiBlIDMgcG90w6puY2lhcy4gVmVqYSBhYmFpeG8gcGVsbyAiZGVmYXVsdCIsIG91IHNlamEsIHNlbSBjb2xvY2FyIGEgb3DDp8OjbyBgcG93ZXJgLg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShsbXRlc3QpDQpsbXRlc3Q6OnJlc2V0dGVzdChtb2QxLHR5cGUgPSAiZml0dGVkIikNCmxtdGVzdDo6cmVzZXR0ZXN0KG1vZDIsdHlwZSA9ICJmaXR0ZWQiKQ0KbG10ZXN0OjpyZXNldHRlc3QobW9kMyx0eXBlID0gImZpdHRlZCIpDQoNCmBgYA0KDQpSZWZlcsOqbmNpYXMNCj09PT09PT09PT09PT09PT0NCg0KSEVJU1MsIEZsb3JpYW4uIFVzaW5nIFIgZm9yIEludHJvZHVjdG9yeSBFY29ub21ldHJpY3MuIDIuZWQuIEZsb3JpYW4gSGVpc3MsIDIwMjAuIFJlY3Vyc28gb25saW5lLiBEaXNwb27DrXZlbCBlbTogPGh0dHA6Ly93d3cudXJmaWUubmV0Lz4uICAgIA0KDQpTSEVBLCAgSnVzdGluIE0uICB3b29sZHJpZGdlOiB2aWduZXR0ZS4gMjAyMC4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL2p1c3Rpbm1zaGVhLmdpdGh1Yi5pby93b29sZHJpZGdlL2FydGljbGVzL0ludHJvZHVjdG9yeS1FY29ub21ldHJpY3MtRXhhbXBsZXMuaHRtbD4uDQoNClNIRUEsICBKdXN0aW4gTS4gIHdvb2xkcmlkZ2U6IDExMSBEYXRhIFNldHMgZnJvbSAiSW50cm9kdWN0b3J5IEVjb25vbWV0cmljczogQSBNb2Rlcm4gQXBwcm9hY2gsIDZlIiBieSBKZWZmcmV5IE0uIFdvb2xkcmlkZ2UuIFIgcGFja2FnZSB2ZXJzaW9uIDEuMy4xLiAyMDE4LiBEaXNwb27DrXZlbCBlbTogPGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9d29vbGRyaWRnZT4uIA0KICANCg0KV09PTERSSURHRSwgSi5NLiBJbnRyb2R1w6fDo28gw6AgRWNvbm9tZXRyaWE6IHVtYSBhYm9yZGFnZW0gbW9kZXJuYS4gU8OjbyBQYXVsbzogUGlvbmVpcmEgVGhvbXNvbiBMZWFybmluZywgMjAwNi4odHJhZHXDp8OjbyBkYSBzZWd1bmRhIGVkacOnw6NvIGFtZXJpY2FuYSkuICAgIA0KDQpXT09MRFJJREdFLCBKZWZmcmV5IE0uIEludHJvZHVjdG9yeSBlY29ub21ldHJpY3M6IEEgbW9kZXJuIGFwcHJvYWNoLiBOZWxzb24gRWR1Y2F0aW9uLCAyMDE2Lg==