Ejercicio 1. Modelo Econométrico

Ejercicio 2. good to great

# Aplicación de shiny

Aplicación de shiny

Actividad 3 en parejas

Ejercicio Panel En Equipos

instalar paquetes y llamar librerias

#install.packages("WDI")
#install.packages("wbstats")
library(WDI)
library(wbstats)
#install.packages("tidyverse")
library(tidyverse)
#install.packages("plm") #paquete para realizar modelos lineales para datos de panel
library(plm)
#install.packages("gplots")
library(gplots)
library(readxl)
library(lmtest)

Paso 1: Generar el conjunto de datos de panel

gdp <- wb_data(country=c("MX","US","CA"), indicator=c("NY.GDP.PCAP.CD",
                        "SM.POP.NETM"), start_date=1950, end_date=2025)

#generar conjunto de datos de panel
panel_1 <- select(gdp, country, date, NY.GDP.PCAP.CD, SM.POP.NETM)
panel_1 <- subset(panel_1, date == 1960 | date == 1970 | date== 1980 | date== 1990 | date==2000 | date==2010 | date==2020)

panel_1 <- pdata.frame(panel_1, index = c("country","date"))

Paso 2: Prueba de Heterogenidad

plotmeans(NY.GDP.PCAP.CD ~ country, main= "Prueba de heterogenidad entre paises para el PIB", data=panel_1)

plotmeans(SM.POP.NETM ~ country, main= "Prueba de heterogenidad entre paises para la migracion neta", data=panel_1)

#si la linea sale casi horizontal, hay poca o nula heterogenidad, por lo que no hay diferencia sitematica que ajustar
#si la linea sale quebrada, sube y baja, hay mucha heterogenidad, por lo que hay que ajustar

Paso 3: Prueba de Efectos fijos y Aleatoris

#Modelo 1. Regresión agrupada (pooled) ##para poca o nula heterogenidad
#asume que no hay heterogenidad no observada
pooled <- plm(NY.GDP.PCAP.CD ~ SM.POP.NETM, data = panel_1, model="pooling")
summary(pooled)
## Pooling Model
## 
## Call:
## plm(formula = NY.GDP.PCAP.CD ~ SM.POP.NETM, data = panel_1, model = "pooling")
## 
## Balanced Panel: n = 3, T = 7, N = 21
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -21506.0 -10924.8  -3728.9   5274.5  45389.3 
## 
## Coefficients:
##               Estimate Std. Error t-value Pr(>|t|)   
## (Intercept) 1.2873e+04 4.2134e+03  3.0553 0.006511 **
## SM.POP.NETM 1.8616e-02 7.2324e-03  2.5740 0.018588 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    7259500000
## Residual Sum of Squares: 5382600000
## R-Squared:      0.25855
## Adj. R-Squared: 0.21952
## F-statistic: 6.62533 on 1 and 19 DF, p-value: 0.018588
#Modelo 2. Efectos fijos (within)
#Cuando las diferencias no observadas son constante en el tiempo
within <- plm(NY.GDP.PCAP.CD ~ SM.POP.NETM, data = panel_1, model="within")
summary(within)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = NY.GDP.PCAP.CD ~ SM.POP.NETM, data = panel_1, model = "within")
## 
## Balanced Panel: n = 3, T = 7, N = 21
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -20886.56  -9903.27   -403.03   3407.39  44059.72 
## 
## Coefficients:
##             Estimate Std. Error t-value Pr(>|t|)
## SM.POP.NETM 0.013921   0.014345  0.9705   0.3454
## 
## Total Sum of Squares:    5256100000
## Residual Sum of Squares: 4980200000
## R-Squared:      0.052492
## Adj. R-Squared: -0.11471
## F-statistic: 0.94181 on 1 and 17 DF, p-value: 0.34542
#Prueba F
pFtest(within, pooled)
## 
##  F test for individual effects
## 
## data:  NY.GDP.PCAP.CD ~ SM.POP.NETM
## F = 0.68685, df1 = 2, df2 = 17, p-value = 0.5166
## alternative hypothesis: significant effects
# Si p-value es menor a 0.05 se prefiere el modelo de efectos fijos

#Modelo 3. Efectos Aleatorios 
#Cuando las diferencias no observadas son aleatorias

#Método walhus
walhus <- plm(NY.GDP.PCAP.CD ~ SM.POP.NETM, data = panel_1, model="random", random.method = "walhus")
summary(walhus)
## Oneway (individual) effect Random Effect Model 
##    (Wallace-Hussain's transformation)
## 
## Call:
## plm(formula = NY.GDP.PCAP.CD ~ SM.POP.NETM, data = panel_1, model = "random", 
##     random.method = "walhus")
## 
## Balanced Panel: n = 3, T = 7, N = 21
## 
## Effects:
##                     var   std.dev share
## idiosyncratic 278418900     16686     1
## individual            0         0     0
## theta: 0
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -21506.0 -10924.8  -3728.9   5274.5  45389.3 
## 
## Coefficients:
##               Estimate Std. Error z-value Pr(>|z|)   
## (Intercept) 1.2873e+04 4.2134e+03  3.0553 0.002248 **
## SM.POP.NETM 1.8616e-02 7.2324e-03  2.5740 0.010054 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    7259500000
## Residual Sum of Squares: 5382600000
## R-Squared:      0.25855
## Adj. R-Squared: 0.21952
## Chisq: 6.62533 on 1 DF, p-value: 0.010054
#Método amemiya
amemiya <- plm(NY.GDP.PCAP.CD ~ SM.POP.NETM, data = panel_1, model="random", random.method = "amemiya")
summary(amemiya)
## Oneway (individual) effect Random Effect Model 
##    (Amemiya's transformation)
## 
## Call:
## plm(formula = NY.GDP.PCAP.CD ~ SM.POP.NETM, data = panel_1, model = "random", 
##     random.method = "amemiya")
## 
## Balanced Panel: n = 3, T = 7, N = 21
## 
## Effects:
##                     var   std.dev share
## idiosyncratic 276675480     16634     1
## individual            0         0     0
## theta: 0
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -21506.0 -10924.8  -3728.9   5274.5  45389.3 
## 
## Coefficients:
##               Estimate Std. Error z-value Pr(>|z|)   
## (Intercept) 1.2873e+04 4.2134e+03  3.0553 0.002248 **
## SM.POP.NETM 1.8616e-02 7.2324e-03  2.5740 0.010054 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    7259500000
## Residual Sum of Squares: 5382600000
## R-Squared:      0.25855
## Adj. R-Squared: 0.21952
## Chisq: 6.62533 on 1 DF, p-value: 0.010054
#Método nerlove
nerlove <- plm(NY.GDP.PCAP.CD ~ SM.POP.NETM, data = panel_1, model="random", random.method = "nerlove")
summary(nerlove)
## Oneway (individual) effect Random Effect Model 
##    (Nerlove's transformation)
## 
## Call:
## plm(formula = NY.GDP.PCAP.CD ~ SM.POP.NETM, data = panel_1, model = "random", 
##     random.method = "nerlove")
## 
## Balanced Panel: n = 3, T = 7, N = 21
## 
## Effects:
##                     var   std.dev share
## idiosyncratic 237150411     15400 0.864
## individual     37271843      6105 0.136
## theta: 0.31
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -20850.0  -9773.4  -2826.2   3450.7  45608.0 
## 
## Coefficients:
##               Estimate Std. Error z-value Pr(>|z|)  
## (Intercept) 1.3174e+04 5.8290e+03  2.2601  0.02382 *
## SM.POP.NETM 1.7563e-02 9.0595e-03  1.9386  0.05255 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    6.21e+09
## Residual Sum of Squares: 5184500000
## R-Squared:      0.16513
## Adj. R-Squared: 0.12119
## Chisq: 3.75814 on 1 DF, p-value: 0.052551
#Comparar la r2 ajustada de los 3 métodos y elegir el que tenga el mayor r2 ese lo ponemos en la prueba de hausman

phtest(walhus, within)
## 
##  Hausman Test
## 
## data:  NY.GDP.PCAP.CD ~ SM.POP.NETM
## chisq = 0.14364, df = 1, p-value = 0.7047
## alternative hypothesis: one model is inconsistent
#Si el p-value en <0.05, usamos Efectos Fijos
patentes <- read_excel("C:\\Users\\admin\\Downloads\\PATENT 3.xls")
summary(patentes)
##      cusip            merger           employ            return       
##  Min.   :   800   Min.   :0.0000   Min.   :  0.085   Min.   :-73.022  
##  1st Qu.:368514   1st Qu.:0.0000   1st Qu.:  1.227   1st Qu.:  5.128  
##  Median :501116   Median :0.0000   Median :  3.842   Median :  7.585  
##  Mean   :514536   Mean   :0.0177   Mean   : 18.826   Mean   :  8.003  
##  3rd Qu.:754688   3rd Qu.:0.0000   3rd Qu.: 15.442   3rd Qu.: 10.501  
##  Max.   :878555   Max.   :1.0000   Max.   :506.531   Max.   : 48.675  
##                                    NA's   :21        NA's   :8        
##     patents         patentsg           stckpr              rnd           
##  Min.   :  0.0   Min.   :   0.00   Min.   :  0.1875   Min.   :   0.0000  
##  1st Qu.:  1.0   1st Qu.:   1.00   1st Qu.:  7.6250   1st Qu.:   0.6847  
##  Median :  3.0   Median :   4.00   Median : 16.5000   Median :   2.1456  
##  Mean   : 22.9   Mean   :  27.14   Mean   : 22.6270   Mean   :  29.3398  
##  3rd Qu.: 15.0   3rd Qu.:  19.00   3rd Qu.: 29.2500   3rd Qu.:  11.9168  
##  Max.   :906.0   Max.   :1063.00   Max.   :402.0000   Max.   :1719.3535  
##                                    NA's   :2                             
##     rndeflt             rndstck              sales                sic      
##  Min.   :   0.0000   Min.   :   0.1253   Min.   :    1.222   Min.   :2000  
##  1st Qu.:   0.4788   1st Qu.:   5.1520   1st Qu.:   52.995   1st Qu.:2890  
##  Median :   1.4764   Median :  13.3532   Median :  174.065   Median :3531  
##  Mean   :  19.7238   Mean   : 163.8234   Mean   : 1219.601   Mean   :3333  
##  3rd Qu.:   8.7527   3rd Qu.:  74.5625   3rd Qu.:  728.964   3rd Qu.:3661  
##  Max.   :1000.7876   Max.   :9755.3516   Max.   :44224.000   Max.   :9997  
##                      NA's   :157         NA's   :3                         
##       year     
##  Min.   :2012  
##  1st Qu.:2014  
##  Median :2016  
##  Mean   :2016  
##  3rd Qu.:2019  
##  Max.   :2021  
## 
str(patentes)
## tibble [2,260 × 13] (S3: tbl_df/tbl/data.frame)
##  $ cusip   : num [1:2260] 800 800 800 800 800 800 800 800 800 800 ...
##  $ merger  : num [1:2260] 0 0 0 0 0 0 0 0 0 0 ...
##  $ employ  : num [1:2260] 9.85 12.32 12.2 11.84 12.99 ...
##  $ return  : num [1:2260] 5.82 5.69 4.42 5.28 4.91 ...
##  $ patents : num [1:2260] 22 34 31 32 40 60 57 77 38 5 ...
##  $ patentsg: num [1:2260] 24 32 30 34 28 33 53 47 64 70 ...
##  $ stckpr  : num [1:2260] 47.6 57.9 33 38.5 35.1 ...
##  $ rnd     : num [1:2260] 2.56 3.1 3.27 3.24 3.78 ...
##  $ rndeflt : num [1:2260] 2.56 2.91 2.8 2.52 2.78 ...
##  $ rndstck : num [1:2260] 16.2 17.4 19.6 21.9 23.1 ...
##  $ sales   : num [1:2260] 344 436 535 567 631 ...
##  $ sic     : num [1:2260] 3740 3740 3740 3740 3740 3740 3740 3740 3740 3740 ...
##  $ year    : num [1:2260] 2012 2013 2014 2015 2016 ...
sum(is.na(patentes))#NA´s en la base de datos
## [1] 191
sapply(patentes, function(x) sum(is.na(x))) #NA´s por variable
##    cusip   merger   employ   return  patents patentsg   stckpr      rnd 
##        0        0       21        8        0        0        2        0 
##  rndeflt  rndstck    sales      sic     year 
##        0      157        3        0        0
patentes$employ[is.na(patentes$employ)] <- mean(patentes$employ, na.rm=TRUE)
patentes$return[is.na(patentes$employ)] <- mean(patentes$employ, na.rm=TRUE)
patentes$stckpr[is.na(patentes$employ)] <- mean(patentes$employ, na.rm=TRUE)
patentes$rndstck[is.na(patentes$employ)] <- mean(patentes$employ, na.rm=TRUE)
patentes$sales[is.na(patentes$employ)] <- mean(patentes$employ, na.rm=TRUE)
summary(patentes)
##      cusip            merger           employ            return       
##  Min.   :   800   Min.   :0.0000   Min.   :  0.085   Min.   :-73.022  
##  1st Qu.:368514   1st Qu.:0.0000   1st Qu.:  1.242   1st Qu.:  5.128  
##  Median :501116   Median :0.0000   Median :  3.893   Median :  7.585  
##  Mean   :514536   Mean   :0.0177   Mean   : 18.826   Mean   :  8.003  
##  3rd Qu.:754688   3rd Qu.:0.0000   3rd Qu.: 16.034   3rd Qu.: 10.501  
##  Max.   :878555   Max.   :1.0000   Max.   :506.531   Max.   : 48.675  
##                                                      NA's   :8        
##     patents         patentsg           stckpr              rnd           
##  Min.   :  0.0   Min.   :   0.00   Min.   :  0.1875   Min.   :   0.0000  
##  1st Qu.:  1.0   1st Qu.:   1.00   1st Qu.:  7.6250   1st Qu.:   0.6847  
##  Median :  3.0   Median :   4.00   Median : 16.5000   Median :   2.1456  
##  Mean   : 22.9   Mean   :  27.14   Mean   : 22.6270   Mean   :  29.3398  
##  3rd Qu.: 15.0   3rd Qu.:  19.00   3rd Qu.: 29.2500   3rd Qu.:  11.9168  
##  Max.   :906.0   Max.   :1063.00   Max.   :402.0000   Max.   :1719.3535  
##                                    NA's   :2                             
##     rndeflt             rndstck              sales                sic      
##  Min.   :   0.0000   Min.   :   0.1253   Min.   :    1.222   Min.   :2000  
##  1st Qu.:   0.4788   1st Qu.:   5.1520   1st Qu.:   52.995   1st Qu.:2890  
##  Median :   1.4764   Median :  13.3532   Median :  174.065   Median :3531  
##  Mean   :  19.7238   Mean   : 163.8234   Mean   : 1219.601   Mean   :3333  
##  3rd Qu.:   8.7527   3rd Qu.:  74.5625   3rd Qu.:  728.964   3rd Qu.:3661  
##  Max.   :1000.7876   Max.   :9755.3516   Max.   :44224.000   Max.   :9997  
##                      NA's   :157         NA's   :3                         
##       year     
##  Min.   :2012  
##  1st Qu.:2014  
##  Median :2016  
##  Mean   :2016  
##  3rd Qu.:2019  
##  Max.   :2021  
## 
sum(is.na(patentes))
## [1] 170
boxplot(patentes$cusip, horizontal=TRUE)

boxplot(patentes$merger, horizontal=TRUE)

boxplot(patentes$employ, horizontal=TRUE)

boxplot(patentes$patents, horizontal=TRUE)

boxplot(patentes$return, horizontal=TRUE)

boxplot(patentes$patentsg, horizontal=TRUE)

boxplot(patentes$stckpr, horizontal=TRUE)

boxplot(patentes$rnd, horizontal=TRUE)

boxplot(patentes$rndeflt, horizontal=TRUE)

boxplot(patentes$rndstck, horizontal=TRUE)

boxplot(patentes$sales, horizontal=TRUE)

boxplot(patentes$sic, horizontal=TRUE)

boxplot(patentes$year, horizontal=TRUE)

patentes$year <- patentes$year -40
summary(patentes)
##      cusip            merger           employ            return       
##  Min.   :   800   Min.   :0.0000   Min.   :  0.085   Min.   :-73.022  
##  1st Qu.:368514   1st Qu.:0.0000   1st Qu.:  1.242   1st Qu.:  5.128  
##  Median :501116   Median :0.0000   Median :  3.893   Median :  7.585  
##  Mean   :514536   Mean   :0.0177   Mean   : 18.826   Mean   :  8.003  
##  3rd Qu.:754688   3rd Qu.:0.0000   3rd Qu.: 16.034   3rd Qu.: 10.501  
##  Max.   :878555   Max.   :1.0000   Max.   :506.531   Max.   : 48.675  
##                                                      NA's   :8        
##     patents         patentsg           stckpr              rnd           
##  Min.   :  0.0   Min.   :   0.00   Min.   :  0.1875   Min.   :   0.0000  
##  1st Qu.:  1.0   1st Qu.:   1.00   1st Qu.:  7.6250   1st Qu.:   0.6847  
##  Median :  3.0   Median :   4.00   Median : 16.5000   Median :   2.1456  
##  Mean   : 22.9   Mean   :  27.14   Mean   : 22.6270   Mean   :  29.3398  
##  3rd Qu.: 15.0   3rd Qu.:  19.00   3rd Qu.: 29.2500   3rd Qu.:  11.9168  
##  Max.   :906.0   Max.   :1063.00   Max.   :402.0000   Max.   :1719.3535  
##                                    NA's   :2                             
##     rndeflt             rndstck              sales                sic      
##  Min.   :   0.0000   Min.   :   0.1253   Min.   :    1.222   Min.   :2000  
##  1st Qu.:   0.4788   1st Qu.:   5.1520   1st Qu.:   52.995   1st Qu.:2890  
##  Median :   1.4764   Median :  13.3532   Median :  174.065   Median :3531  
##  Mean   :  19.7238   Mean   : 163.8234   Mean   : 1219.601   Mean   :3333  
##  3rd Qu.:   8.7527   3rd Qu.:  74.5625   3rd Qu.:  728.964   3rd Qu.:3661  
##  Max.   :1000.7876   Max.   :9755.3516   Max.   :44224.000   Max.   :9997  
##                      NA's   :157         NA's   :3                         
##       year     
##  Min.   :1972  
##  1st Qu.:1974  
##  Median :1976  
##  Mean   :1976  
##  3rd Qu.:1979  
##  Max.   :1981  
## 

Paso 1: Generar el conjunto de datos de panel

#generar conjunto de datos de panel

panel_patentes <- pdata.frame(patentes, index = c("cusip","year"))

Paso 2: Prueba de Heterogenidad

plotmeans(patents ~ cusip, main= "Prueba de heterogenidad entre empresas para sus patentes", data=panel_patentes)

#Como la linea sale quebrada, sube y baja, hay mucha heterogenidad, por lo que hay que ajustar

Paso 3: Prueba de Efectos fijos y Aleatoris

#Modelo 1. Regresión agrupada (pooled) ##para poca o nula heterogenidad
#asume que no hay heterogenidad no observada
pooled_patentes <- plm(patents ~ merger + employ + return + stckpr + rnd + sales + sic, data = panel_patentes, model="pooling")
summary(pooled_patentes)
## Pooling Model
## 
## Call:
## plm(formula = patents ~ merger + employ + return + stckpr + rnd + 
##     sales + sic, data = panel_patentes, model = "pooling")
## 
## Unbalanced Panel: n = 226, T = 6-10, N = 2252
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -320.73823  -10.11533    0.96527    7.41046  433.49935 
## 
## Coefficients:
##                Estimate  Std. Error t-value Pr(>|t|)    
## (Intercept) -4.5823e-01  5.2868e+00 -0.0867  0.93094    
## merger      -1.1674e+01  7.2521e+00 -1.6097  0.10760    
## employ       1.3694e+00  4.2028e-02 32.5828  < 2e-16 ***
## return      -5.5049e-03  1.8177e-01 -0.0303  0.97584    
## stckpr       6.5251e-01  4.3209e-02 15.1012  < 2e-16 ***
## rnd         -1.3928e-01  1.6132e-02 -8.6336  < 2e-16 ***
## sales       -3.1901e-03  4.7031e-04 -6.7830  1.5e-11 ***
## sic         -2.6784e-03  1.4851e-03 -1.8035  0.07144 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    10994000
## Residual Sum of Squares: 4594700
## R-Squared:      0.58209
## Adj. R-Squared: 0.58079
## F-statistic: 446.512 on 7 and 2244 DF, p-value: < 2.22e-16
#Modelo 2. Efectos fijos (within)
#Cuando las diferencias no observadas son constante en el tiempo
within_patentes <- plm(patents ~ merger + employ + return + stckpr + rnd + sales + sic, data = panel_patentes, model="within")
summary(within_patentes)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = patents ~ merger + employ + return + stckpr + rnd + 
##     sales + sic, data = panel_patentes, model = "within")
## 
## Unbalanced Panel: n = 226, T = 6-10, N = 2252
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -497.16507   -1.62011   -0.19851    1.64094  184.59512 
## 
## Coefficients:
##           Estimate  Std. Error  t-value  Pr(>|t|)    
## merger  3.35351504  4.17165385   0.8039   0.42156    
## employ  0.11699838  0.07080752   1.6523   0.09862 .  
## return -0.07161127  0.11004982  -0.6507   0.51530    
## stckpr -0.01097329  0.03251309  -0.3375   0.73577    
## rnd    -0.19865376  0.01446336 -13.7350 < 2.2e-16 ***
## sales  -0.00310168  0.00041645  -7.4479 1.397e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    1091400
## Residual Sum of Squares: 819090
## R-Squared:      0.24952
## Adj. R-Squared: 0.1637
## F-statistic: 111.938 on 6 and 2020 DF, p-value: < 2.22e-16
#Prueba F
pFtest(within_patentes, pooled_patentes)
## 
##  F test for individual effects
## 
## data:  patents ~ merger + employ + return + stckpr + rnd + sales + sic
## F = 41.568, df1 = 224, df2 = 2020, p-value < 2.2e-16
## alternative hypothesis: significant effects
# como p-value es menor a 0.05 se avanza a los siguientes modelos

#Modelo 3. Efectos Aleatorios 
#Cuando las diferencias no observadas son aleatorias

#Método walhus
walhus_patentes <- plm(patents ~ merger + employ + return + stckpr + rnd + sales + sic, data = panel_patentes, model="random", random.method = "walhus")
summary(walhus_patentes)
## Oneway (individual) effect Random Effect Model 
##    (Wallace-Hussain's transformation)
## 
## Call:
## plm(formula = patents ~ merger + employ + return + stckpr + rnd + 
##     sales + sic, data = panel_patentes, model = "random", random.method = "walhus")
## 
## Unbalanced Panel: n = 226, T = 6-10, N = 2252
## 
## Effects:
##                   var std.dev share
## idiosyncratic  549.82   23.45 0.264
## individual    1531.45   39.13 0.736
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.7624  0.8138  0.8138  0.8135  0.8138  0.8138 
## 
## Residuals:
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -434.3797   -3.8922   -1.7663    0.0049    0.7622  211.3411 
## 
## Coefficients:
##                Estimate  Std. Error z-value  Pr(>|z|)    
## (Intercept) 11.81991653 13.02952376  0.9072    0.3643    
## merger       4.44477469  4.51229785  0.9850    0.3246    
## employ       1.09431950  0.04897343 22.3452 < 2.2e-16 ***
## return      -0.13029160  0.11861251 -1.0985    0.2720    
## stckpr       0.16740658  0.03358392  4.9847 6.205e-07 ***
## rnd         -0.14658043  0.01471279 -9.9628 < 2.2e-16 ***
## sales       -0.00392718  0.00042924 -9.1492 < 2.2e-16 ***
## sic         -0.00097605  0.00383427 -0.2546    0.7991    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    1434600
## Residual Sum of Squares: 1090600
## R-Squared:      0.23978
## Adj. R-Squared: 0.2374
## Chisq: 708.033 on 7 DF, p-value: < 2.22e-16
#Método amemiya
amemiya_patentes <- plm(patents ~ merger + employ + return + stckpr + rnd + sales,
data = panel_patentes, model="random", random.method = "amemiya")
summary(amemiya_patentes)
## Oneway (individual) effect Random Effect Model 
##    (Amemiya's transformation)
## 
## Call:
## plm(formula = patents ~ merger + employ + return + stckpr + rnd + 
##     sales, data = panel_patentes, model = "random", random.method = "amemiya")
## 
## Unbalanced Panel: n = 226, T = 6-10, N = 2252
## 
## Effects:
##                   var std.dev share
## idiosyncratic  405.49   20.14 0.051
## individual    7547.88   86.88 0.949
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.9058  0.9269  0.9269  0.9268  0.9269  0.9269 
## 
## Residuals:
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -454.5441   -2.9615   -1.6605    0.0033    0.6178  193.2184 
## 
## Coefficients:
##                Estimate  Std. Error  z-value  Pr(>|z|)    
## (Intercept) 22.75387365  5.92762406   3.8386 0.0001237 ***
## merger       3.92493580  4.12056765   0.9525 0.3408318    
## employ       0.49109781  0.06164783   7.9662 1.637e-15 ***
## return      -0.09571453  0.10863461  -0.8811 0.3782808    
## stckpr       0.04664956  0.03171241   1.4710 0.1412860    
## rnd         -0.17973247  0.01409500 -12.7515 < 2.2e-16 ***
## sales       -0.00343629  0.00040743  -8.4341 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    1144300
## Residual Sum of Squares: 891640
## R-Squared:      0.22083
## Adj. R-Squared: 0.21875
## Chisq: 636.323 on 6 DF, p-value: < 2.22e-16
#Método nerlove
nerlove_patentes <- plm(patents ~ merger + employ + return + stckpr + rnd + sales + sic, data = panel_patentes, model="random", random.method = "nerlove")
summary(nerlove_patentes)
## Oneway (individual) effect Random Effect Model 
##    (Nerlove's transformation)
## 
## Call:
## plm(formula = patents ~ merger + employ + return + stckpr + rnd + 
##     sales + sic, data = panel_patentes, model = "random", random.method = "nerlove")
## 
## Unbalanced Panel: n = 226, T = 6-10, N = 2252
## 
## Effects:
##                   var std.dev share
## idiosyncratic  363.72   19.07 0.046
## individual    7602.26   87.19 0.954
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.9111  0.9310  0.9310  0.9309  0.9310  0.9310 
## 
## Residuals:
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -455.9302   -2.9399   -1.6084    0.0032    0.6178  192.3469 
## 
## Coefficients:
##                Estimate  Std. Error  z-value  Pr(>|z|)    
## (Intercept)  8.37943183 31.51076930   0.2659    0.7903    
## merger       3.88283943  4.10699605   0.9454    0.3444    
## employ       0.45875996  0.06225393   7.3692 1.717e-13 ***
## return      -0.09373310  0.10828377  -0.8656    0.3867    
## stckpr       0.04168538  0.03164395   1.3173    0.1877    
## rnd         -0.18140485  0.01406829 -12.8946 < 2.2e-16 ***
## sales       -0.00340492  0.00040657  -8.3747 < 2.2e-16 ***
## sic          0.00452769  0.00928394   0.4877    0.6258    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    1138600
## Residual Sum of Squares: 885010
## R-Squared:      0.22271
## Adj. R-Squared: 0.22028
## Chisq: 642.996 on 7 DF, p-value: < 2.22e-16
#Comparar la r2 ajustada de los 3 métodos y elegir el que tenga el mayor r2 ese lo ponemos en la prueba de hausman

phtest(walhus_patentes, within_patentes)
## 
##  Hausman Test
## 
## data:  patents ~ merger + employ + return + stckpr + rnd + sales + sic
## chisq = 347.29, df = 6, p-value < 2.2e-16
## alternative hypothesis: one model is inconsistent
#Si el p-value en <0.05, usamos Efectos Fijos
#Por lo tat nos quedamos con el modelo de efectos fijos (within)

Paso 4: Prueba de heterocedasticidad y autocorrelación serial

#Prieba de heterocedasticidad
bptest(within_patentes)
## 
##  studentized Breusch-Pagan test
## 
## data:  within_patentes
## BP = 1444.3, df = 7, p-value < 2.2e-16
#Si el p-value < 0.05, hay heterocedasticidad en los residuos (problema detectado)

#prueba de autocorrelación serial
pwartest(within_patentes)
## 
##  Wooldridge's test for serial correlation in FE panels
## 
## data:  within_patentes
## F = 104.18, df1 = 1, df2 = 2024, p-value < 2.2e-16
## alternative hypothesis: serial correlation
#Si el p-value < 0.05, hay autocorrelación serial en los errores (problema detectado)

#Modelo de Corrección de Errores Estandar Robustos
coeficientes_corregidos <- coeftest(within_patentes, vcov= vcovHC(within_patentes, type="HC0"))
solo_coeficientes <- coeficientes_corregidos[,1]

Paso 5: Generar Pronosticos y Evaluar modelo

datos_de_prueba <- data.frame( merger=0,  employ=10, return=6, stckpr=48, rnd=3, sales=344)
prediccion <- sum(solo_coeficientes*datos_de_prueba)
prediccion
## [1] -1.449341

Conclusiones

En conclusion este ejercicio nos permitio generar pronosticos en bases de datos con panel, tomando en cuenta los tratamientos para distintos efectos en los datosy sus errores

LS0tDQp0aXRsZTogIkFjdGl2aWRhZCAxIg0KYXV0aG9yOiAiUm9kcmlnbyBBbmd1bG8gQTAwODM0NjY3Ig0KZGF0ZTogIjIwMjUtMDgtMTIiDQpvdXRwdXQ6DQogICBodG1sX2RvY3VtZW50Og0KICAgICB0b2M6IFRSVUUNCiAgICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICAgVGhlbWU6IGNvc21vDQogIA0KLS0tDQohW10oZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwvOWovNEFBUVNrWkpSZ0FCQVFBQUFRQUJBQUQvMndDRUFBa0dCeE1URWhVVEV4TVdGaFVXR0JjWUZ4Z1lHQlVYRnhvWEdCb2RGeGNZRnhvWUhTZ2dHQm9sSFJjWElURWhKU2tyTGk0dUZ4OHpPRE10TnlndExpc0JDZ29LRGcwT0d4QVFHeTBkSHgwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMUzB0TFMwdExTMHRMZi9BQUJFSUFKTUJXQU1CSWdBQ0VRRURFUUgveEFBYkFBQUNBZ01CQUFBQUFBQUFBQUFBQUFBREJBSUZBQUVHQi8vRUFFQVFBQUVEQWdNR0JBTUZCd0lHQXdBQUFBRUFBaEVESVFRU01RVkJVV0Z4Z1JNaW9jR1JzZkFHSXpKaTBSUkNVbkt5NGZHQ2tqTnpvclBTNGdja1EvL0VBQmtCQUFNQkFRRUFBQUFBQUFBQUFBQUFBQUVDQXdBRUJmL0VBQ0VSQUFJQ0F3RUJBUUVCQVFFQUFBQUFBQUFCQWhFREVpRXhJa0ZSUW1FRS85b0FEQU1CQUFJUkF4RUFQd0M5cjFqb2xxdGF4V3E5WUh6TklMWEFFRVhCSEpWbTA4WUd0SW01QzhCSTl0c3FOcFkwdWRBc0VvS3QwdlVxWFVmRXZIS2V5NktJV2RqczNHeXdEZUI2SnQxWG11VzJiaW9NRXhLdk04aXlqS05NckYyV3JzUkFWVTZ0SmNmekZLNG5GbG9NblJLN1ByeTA5VmxIbG1iNldENml6T2hFckpSUm1aVXFXS2tISlorWTJhQ1NMbU9DblFmSVJvRmh3NUVwVklRRnJPbEdHblZKM3JTQTJWSnJsakd5OURxT2lTVEFBazlsSnhYUC9hamFSWmxwaHM1cnV6VGxjQis3WWc2NndVMFkyNkZrNlZseGc4Y3lxQ1dPbU5kUjgwNVFaSlhDL1ozRmx0WUNZeldNd0JvU09uOTEzMnpaTXh6V3lSMEJqZXdITVFVVmxSUXhsUEtVdXdwZlIvQmw5UXJRZVZyTWd1cUxVQ3h0dUxJSUhIUlNmWGxjN3RER0VQQkIvRG9yVnRZT0VneUR3UmNUS1FmeFNpdHJwVUZTQVFvTmpyWHFMcXNJTFNWQjVXbzFqb3FMWXFLc3JZbktOVkRDYlNrd1QwUm9GbDR4NklhbGtpMm9obkVvR0dYdlM1ckFPSkozQkF4R0todk5WR094dXYxb2lvMkJ5SGNSdEdUd1ROUEc1bUVUZVBvcmx6aUVlaGlVK2d1eDJRckdOVm1aVkdIeDB0QUcrMHA0VlV1dERYWXdTdDV1YVVkVlUydWxhZ1dYR0R4RWtDVmlyS2JpTjhMRWppUHNlZjREYk5TZ1NHbVdtWmFiaWVJNEZIZmpRKzRQWGlGRGFHQ2ttYkdkUXVjTlZ6WEc4UVlYWEdDbDRjems0K25RRjZpWGVjYzJuNXF0b1lreC93QVF6dUJEWVBkSGJVaDBrejVYZHVIMXpXMW9GbHcwNkxxUHM1VHpHSTNMbHNFWll6b3VvK3pXTGJUY2N4Z1dIb29aVnd2amZRUDJzcGhsaHkrYXFkbXVzaS9hdkZaNmxqWktiTU9uZEdDK0FUZjJYYkFpQnFqUU1waDhBU2hRYk9jMmpVOHg1SnpaVlRkeFNHTG92ZkxtdEovc2k3UGVXdkFOdVB3VHRjRVQ2WGptcUFhbXNraENEYnFiUlJNbFJhdGxsMFNreE9Nb2hMVERZbFVvMlhIL0FHM3B4NFo0RjQvcEs5RFpTeldpeTQ3L0FPUmNMa0ZQbjRub0cvcW54UDdRdVZmTE9QMmVDWEFBd2JBUnJjeGI0cjFmN0w0SExUYU9BSXYxT3E4dDJPWWQzYi9VdmFmcy9kdk8vd0F5bS84QVN5V0huU3YyMWhieXFISmV5NmJidFVYRzljNERKbFJ4K0YyVHFVNDFTVG42OS9SUDFLM0ZjdlZ4L2xjSnZtY2V4Vll4YkVjcUZhdFU3MWNiRFAzYmlkQWZaVVJxQW01Z2NZSlQyejhXQTB0QjFnYUVid3F0Y0pwOU92bzBSQ0orem9tR0lJQlRFTG4vQUV0K0ZmVlpBUytXMHAvRndBa3NiVUFZVHlUS0lHeWd4K0tKY1c3Z1lDVHd1SUxYQWpqRithM1dMVG1NbVlPNUlpb3FxSkpzN2hrRUNORVhFWVVoZ2QxVkRzVEZFdGpuODFjVk5wa3Q4TzBOazg3OFVqaU9tVldPZkRWVFlpdW45cWtBOWxTWWlxbWloWk1KNHQxT25WdWtnVHFwVTMzVktKMlh1QnJ4QTRGZExUMFhGNGV1WkFsZGpnM3l3ZEVqaU1wRU1ZY3JTVkhaOWVXaVV0dGl0YU9LU3dGZHpUbEloQ2hyT2o4YTRDeFZuajNDeEkwT21jZXl2aW5PaHdKYVRmeVJ2NHhaVStKSG1kMVB6WFMwZHRzTFNiendYT2ZzMVI3blFKdVRxTjU1cnFoNzNoelRYT2RGQTZGWVlDdEJJM2xwSFlpZE95VWZoWGl4RWR3c3Bmai9BTlB5YVZXVk5DUnRIWGJLdlNZclFOTUZVMnhhbjNMTzZ2c08reGxjVS9UcWdjM2pISE9icGpBdU1oU3htSDh4VFdBdytuVk4va1gvQUVXK0hRTnAxNEhWSHhEY3NLdDJwVkdVWDNxYUtNcU1TQko3STJDc1FwMUdNZy9lTTBFWE84OUZBbG9FaDdUZlFHL3lWQ1oybURlQ3dkQWdWS3dEbFU0TGFIbHNlcVh4bU12TXBLSHM3TEJ0YTZMcEhhMjE2ZEtxMmtaSk1aaVAzUWRKNG5mSEJjMVIyK2FVWDB2SGRVZUp4bWVvNS84QUU0dTUzS3FzWkp6UFk5bk1FU0xpeEhQaEhWZVdmYm43U2Z0UnBnVThuaCtLRGVabkx5dCtGZHY5bDl1c05OcllJY0d0RnhBSkdzTHluYW40M244ei9taGlpdHc1SlBVanMxL21CL2wvcUM3ckc3VnFVc2hZNHRKOFFtREIvR2JXNnJ6L0FHWTd6RHFQNmd1cTI4Ly9BSVp2ZnhEZTJyelpQa2luSVNEK1Mwd2UwblZCTGpKa3lucXJnR2s4THJuZGtIeVQrWkYyamlqbGR1VVhIcFZTNEcyempNckRsM21PMnZzRnpUNjJ2RmF4T0xjNnhOcGtEcFpLT2VDVmVNYVJLVXJMRFo3UEVmRzlSeGJUVGZHOEpXamlTd3kwd1NDM2NiRVFkZVMxaU1TNm83TThrbXdtMjRRTk9RUTE2SGJoMmV5TnBrTU43aTY2WEMxNWFEeEM4MHdtTUlrRGVGM09DeFE4TnY4QUtQa3BTalRLUmxhb2p0L0daUUc3ejdLbTJqam5HbTIrcHYyUXRxWXN2ZVNkMGdmRlYrSnFlVWRmWk9vOEVjdWtXMXlRNis0cFFQUkd1MVFXR3c3cDZGc3VOalZmTVJOb24xVmcrcjUzZGxUYk5kRHovTDdwM3hQTzdvRWpReVlQYU5XVDJWVFhLZnhicjlncS9GaUQyQ01RU0lOTmxJRkNwdjEvdXBGLzFkUFFsakZHcmRkTGhjYkRCMEM1RnBWMHgvazdKWklaTUpqY2ZtTmpwb2dzeHh6UzR5VHZWYWF5am1XVVROblUwYWtyU1F3bFF3RmlWeEdVamlTKy9CSHcrSmNIRGVsM2k2aEs3ZFV6bXRvNkQ5cERtT3pFWnBCOWxXVXdQRU02UWZqbE1lc0pVVmpNNm9qSy9tSmpVRVIxQkh1a1dOeEczVE9rMmJYaWt3ZFZmWU92YjRMaXNOaVBMVEFkQmt5cjZsanNrWmdTREhtRzdxRnpaSWRMd2tXRmFwTGoxVG1BY3FOMklHWTMzcTIyVlZrZ2NUQ1Jxb2pKL1JiN1ROK3k0emFOV1htNjdIYW8zOG9YQzQxM25LR0xvY3BFa2Z4Ti93Q3Yvd0FWdG44dzM4ZmNKVXJSZk5sZWlGbHZzK29aN0l1T3FnWEtyOW51ODEwYmFUcEJTMTlEMzhpZUt4Y3hGa0VWZWFYYzVhRDFhaU5sOXNYYUJwdmFTWkFuZng1Sk43QThWVElBREh1dlBGc0FXMUpJUytGY2N5TU1TMXRPdXc2MUtZQTZpclRxZHZ3RklvMHgyN1FsZ0Q1aDFIOVFYVC9hR3BPUWc2K0lSdXNhaGowSzVURFBodzdmUCt5dmRvWXdWUTBqZG45WGtqMElXbXZvMFg4bGhzaDMzZmNvT09kSUsxZ0hlWHVvWXZRcWJYUjArRmJXRjBvOU9WUWxhZ1ZFVFpvL1hvdEQ2OVZJdHY4QVhKWVI5ZkZNQTJ5cEJYVzRiRkh3Mm44dnN1T2M2NjZERDFvcERvcHppUENRSjFTVGZWRHhqdktPcCtTRUhYN0JEeEw3QmIvZ0NURFkvVzVDYTZ3N3JRS2dUNVc5MDFHc3NNRzd6LzZVMTRubmNrNkZuaitUM1JIUGh5U2g3Q1ZtRXlVbnRTemdQeWhIcDRwdHdYYXowMDRwWGE5VnBlTXBrWkd5ZWNYSFZORkNTWXUwMlU1U29janNLZWhMQ3NDdFJadlpWbE5XRlUrVWRGT1JTSlhnWDdxVlBWU2VQcnNWQ2diL0FGelJpWmx6U2REZTZ4TGwvbFdJTXlPUGM1U2l5Q1RkUmtqZXV5am0yQ0VLTjFyeHVJV3c4RkVIQjdadUVmV3pNWlNxMUNQTjkweHp5QUxFdUFGaGNYVW52Y3lXNW5Bajkxd0lqZG83UktVYXJtbk14eGE0YUZwTFNPaEYxTEZZMnBWZG1xUGZVZHBtZTV6ekEwRXVKTUpYR3hsSm9aT01jUjVnREc4YXEzMkw5b1cweU04eUNDSkVqWGlMajFYTXlGdVVzc1VXcVl5eU5PenZjVDlwYWRYZUJyb1oxNUdENkxuTVhWQmQ4VlN3dGdrYnlweHdLUGcwc3psNldoZUpVVWdLenVLSisxSGVFMmpGMlJiWUUrWUkyUGQ1U3F6QzQ4QWlVV3JqR3VCdXA2dXlteTFGcWgxN0tERDdyYm5hcUFGMVZFaHZEMUlNbmdFT3M2UTkzSUFkQ2R5RlJOKzJ2NklkZDkraUNqMGErQjJOdU9pZXdaOHFweSsvWUt3d2xTdzR5WTU4bHBJeVpkNE4rcW5YZFpLNGFvREtuVmRZcm5mcFplQU1TWVNUemRQYlJFRUtzcUZVUWpIcTFQZno5Z29Dblk4bXo2Rk5BZmNPY2Y0aDZnTEtWVm9vdWNUZHpYdEhYS1VneFZFM1ZxSCtWbzVLbkxycXhMck0rdHlkb1ZNMngzbkk1QlJyR1Q4ZlJCcFZSNGp1bnlVNGs5ajhrR3VnVEl2cWdSSjRvVlRFdExHQUc0bVVHcTdNN2w3SWRld1ZGRUd4ME5VaVdFSC9BUE1mTXFGWVRPNnlvY0RYY0hBVFlxM3JiMGtvYWpSbHNKMUFnRnlZZWxuaE5FV1J0aFRMSGJrcFROdjhvMU4vMWRGb0NIcVF2Q2VmVGx1aVF3NGtxMm9Oa1JGMUdSV0lyV3BXYjE5aWxnM1g2NHE4eEdET1ZuR1Q2SkUwdGV2Nm9SZkF5UUZtbDFpSytrdG9ObVJ4SmQ1dTYxVU4xRUcvZFpVMVhvbkVTYUpXbnRoVFpvbzFGakdtTzVyYjNLTFFtYVRKdGEzRWdmTkI4Q3VpNGVwZUlFOSt4V21CL3VaN29GV2xsTndQaUQ4a0ZKTU9yUUVWRklWdWFZcDBBVzV2TC91SHloQzhQa1BpdGFEVE5Dc3QrSU9DencrbnhVaFM2ZkZEaHVtZzl2TmF6RGlmZ3Q1ZWl3TW5ndHcxTTBISW9ZY3VhV3dERVptei90bVNPWUVJRlFRaHlqUUxIR080Qy9JbFFmTTMxUTZSNHJickZDdWh2Z1FVanJDWThRQm8zUjdwWTF0THUvTnA2ZHVLaWFoTzlCeGI5Q25SY1U4UUFkZThlaDRvN3NXMDc5Nm9CUE5TRlE2U3B2Rlk2eUZ4aWEyWWdrcE41dWszdlBGUjhRb3JIUUhNc0g0MTNobWx1TGc2ZWdpT2lYTlk1UTIwQWs4N2dBZzhyZXBRQzhyTTVUS0ZBMkRza2xQUGZacXEyMVNqQ281dzFGaDZKWlJHVEowNm5ubm1tYTd6b3E1ajB5S1RuaHhGeTBDd21ibUJFZkpaeDZCTXlZUWg1aW9PcW1McktUa2FvRmplUHcrUWkwRWV6aVBaTlVzU0hOSjM4RWpqc1ZuSVBYMUpkN29HSGFUYThJT05yb1l1bVdKY05FQjRRWHkzVWxZMGsyYVNldGtFcUN3aldJcktZK2lvTXBIK0wxQ2w0WS9qK1NEQ2gzQzZ3Q2RPcTZIWWpIWnBJekFYSkdvQUhEM1hNWWZEbWZMVTNUeDdXWFFiTUR4SUZSd2tjNElpNE1YVVpqeEx4ejJtcmxCRUJreklpU1NFaFZvaTk5U1R1UmZzVFFkWHhEeG1mSlk2N1Q1b3pEVXhwRWVpdU5xN0hhd3g0bFFSZTdnZDhjT0tnMm91aXEram1xalpCaWJFL0w5Rml4bUM4MVNhaEFEam9kYmYyV0o3QWVjYjFqdFZzaTYwL1Zlb2VlRWJvbzFWSmdzc3FCQUpHa21NTmhmRWVHeUIxUVd0dW1jS1lKU3lmT0RSWDlMYW45bVBMbU5RYTZBRXBMRzdLWXh3QWNUSVZ2UzJ0NUlPcy9GSVltdG5NOGx6eG5PK2xwUmorRWFPemFXVE1jeFBiOUZEOWdwd1NCdlJaaHEydytRbjh4K1MyMHY2YWwvQkxFNGRnQWdid21xT0VhZnd0SDZmM1MrS2RZS3cyZSt4TTdoNmdveWsxR3pSUzJCTnd6WS9DUGdyQ25nbTJHVWJ0d1NoZkdxdEdWTE4rdnF5aktUS0pJcmNWUUFtd0YvWkJkaHBwRXdyREZtV3p4ZDdMWnBmL1hjZnJSTXBNVnhPZDhHd1BMOVVPclR5bjRlcWNZUEtPbHI4eWc0dHZtam91aU11a25IZ0Y5RHk1dUluMWhicE5CaldTN3RDMVZKRGVVZThyV0hNRnY4QU1tL0JmMHY2ZUdtTXhrV3NMRDRCRHJOYkpBYUFtS1Q4c0hvbHNTWmNWeEs3T2hpZmhYU3RXbkJUOU4yL21sc1VOTzY2WXZwSm9FVzcxSnJXeGZXM3ZQc2pHbmI2NUtQaC9YZGJZTFFyQ25TRit4K1NLeWljNGI1UVpQNHlHTnRQNGk0Z0R1aE9mSWtXUEswZys2ZjBUd0hNSzQySGljdFFTWXpGbStDQURJTTdsVU5iUHhXNmJ2TmMvVzVacXdEdTMyeFY2d2JkRXZoM01ING12SWtURGdPRTd0VDV2aUVHdlZMalB6dmJRQlRZNTBaUm15a2l3bktUdWthRW8xd3dTdTVqaTdKVGVCdUdiTkVtd0p5MzRkU0ZQWjdDYmI1OWtQN3ltU0ljMGlDYlg4cHNiamM0ZWl5amlITmRtTXlUSnRCNitxV1N1TklLNHh2RzBpTXFMUnc4TUJqdWk3UWFURWtrM21iM3RkVGJYKzZ5a0NPTVgwaUo0Y2x6YlBWRnE2SVlNMlBWR2M4VEZ0Q2xNSlVqTXRQZEx1eFZYSDZFdmhZNFhFUS8vUUFyN1lRejFNdVlEZnFOd0oza1QwMTRTdVRwMXNwemNsT250RTVwamZOa3M4Ymt1QmpPanJQcy9zdzFLencxeGE0YU9hUzF3ek9Ba1J3QlB3WFI3ZDJWaktNL2Vzck1FQVpqNTRPZ0xnTlp0NXVJNHJ6N0NiYjhONGMyYlgxZ3pNcTV4SDJ4ZTl3ZVg1dUlNeWJSZU4xejhWenl4NUxLeG1oUTQxekgxQTRGcHpFR2JpUnFKK0swcStyamc0dW45NXhQWXJGVlIvcUUyS0J6UG1vVkdYVE9XNjJhZDEyYkhQcVJheFJxTVZneWtnVmFkMGluMGR4RmcyNk94cTBXM1RlSG95SjVnTFNrWlJJMDZadHZKVE5LbEl0eithbGhobE1uY2YxQ0poM2tXSEhxb1NaV0tCMW0yeXhmNjE1SVRhTU1uODBIcEM2ZG15V3RaTHJBaVp0SjVybDY3UVRZbUpOdTZTRTl1SWFVYTZMWWk4QUl1SHFaZjhyUENITmEvWnh6VnJWVUpUdXpIdms3MDVnc2FRNXBjQ1FEdWhKaWlPZnhINktYZ0RjVDZmb2xhaXdxeS9yN1lvVkJreUZzT2tYOHVrVHhCTURlbVdZaWthRDJSNXZNUlBDUDdMajMyTUpuQ3Y4QUk1czhQa1VIalZXaGxQOEFwR0FHdE45UGNvVlFTOFg0S0xYZmhFMi95bUtWTHovQlU4SmVpSmt5T0VxTk50eDFUUXltQUdRNE5mbWRtSnpITklJSDdzQzIrWWxid3dBeVQvRjZLamxTRVNzdEtWUVFEcUJFb2RVaTVHaFRkQ3RSdkxuQWsyNGI1OWtPcVdseHY1ZFpYSjRYUWpobVNEMUtoaUcvSk9tbGxKYkRtbTBod2czRWd4dWtFSHVnWXVuY2MwNmwwTGp5elFway9YTUtZb21PWC9zcjNEN01CWVh0bUdqemNwTFFMOTBqdFNuYkkzWHp6eUFkN3dvckpzNlJSeG9vTEVsemdTMitoQVBLQ1FSNklEYVpWL3REWjJTbG1Ja0Q5VWpTd2hEaU5iTHBqbFZFSjQybUtZZHQrNk5TWTB1R2RubEFnaHB5RjJzR1RJRHROMEdPNjFUcHc2L1greXN0bnNsOGdBMkpoMmhBQkpCN1NPcXpuUXVwUVpGT201d05uT0hRa2N0eVphd0Ezazl3RHAwSzBLYXB1THFRZldlYkY3eURxQzV4QnVYWGs4WEU5U1NvWEp1U2VwSithWUZOUlkxRFlLaVhHTHVXL3dDcjJTRlV3MjZhZlVrZ3BTc1FkYkRrZmhxdWVDS3lFR3VoRlkyYmgxK2lIVlpDbGlzUm5MVGxhM0t4alBJQTJjZ2pNNk5YSFVuZXVxcklNQTRxYkhLdzJUUW9PQjhjdkJrUVd1QUVaSGt5TXBKT2J3L1hpcTFvQS9FMmU1SHlLUHZBRWpVUXBVM2dIUnNEcTQvTXFJcG9xa0RwT2xYTFROajFFajYvUllvRnF4QnhURGJHblU3bzdLTXBoK0h1VTNoTU91WnpPaFJBTm9wZXRTdXIycFFWZldvM1NLWXppVmhaZnNtOE1SbE02enc1TGRTaWpZQ2hNam1FMHBjQW9nZ3d1UE1xODJIc3pNWmNDV3RqbEprV25kWkwwNllFa0cwOTFkYlBxWktMM1JvVDhRQnFvVG5hNFVoRldWVzNjU1Mvd3hBYTIwYVgzLzRWSGFQanpWcGlHNTNUTnlaTWhhT3pQek5QeC9SUERpRmw2VkFoRWF6bXJFYk5IRVc2ckc0RWNVN2tJVm9wamVmUXFUQUFySit6aC9FRU00RDh3OVVOZ2xSVXBnbERGTld4d1kza2ZGTG1sZXlkVEYxRUcweklWcnM3RDVwUEF0bnZLQUtOMWRiTUVNZHhKYjdwWnpHakVvOE5RYklJSmM0aXBuYVd3R3dSbGgwK2FiazJFYzB0NFZnT2FzY05UODVQSnlCazBUYjlGMTRBOEk4ZmtpRFQvQ2Z3ZUREaFVKSUdSaGNBWkJKa0FBUnZ2TitCUVJTbWVoT25CSzVES0pIeFhQY1hQZExqbGsveXREUnB5QStDSGlUY1hudEN0ZHRNRFg1WmI1WFZRUTF1VUR6bm1aSERnTEtxeGZzc24wemJvdHNQdGZLMHRqTkl0STBtSk91dGg4RXhzZDdLdmp1ZVBNNWo4dTRjVEhGVVRnbWNHNkNid1l0OGtrb3F1REtUdnAzRzM4Qjl3NHRpQ0NZK0ZnRDdMbFhZTW1vK0IrR20wcnE4VGpHMWFYa2tBQ0lOOUlCSU80SlBEMHlIMUhFU0EwYTZYSnQ4L1ZjMFc0b3ZMdlRrTm9ZT05kUmxuaGNXTnVxVnc5UXRNYUdlL0FpZHk2WGFXSERpSUJNdHYybWZya3VXcnMwN2V0d2ZyZ3V2RzdWTTVwcWdqU1d1a2FqaUFSY1FiRUVMQXhEbzFKMSt1YWVGRTVRNkxFa2R3QVQ4MHpkQVFzS2V2VDNRelRzclBENGJNMm9SbzFyU2U3ZzMzUzFTbE80VzRMSm1CTUZ3ZVNBVElUUXBFUjNRNmRPOTF2RFZZazlxRTZrcmJFVVFiek5yRTYyR2p1ZG9uZWxhdEF0TUVmRlVqTVJ4SVVZQXVmcmd0akpOeW1tMFdrQWxwZ1dkQVB4MTFpVVFZQm9COFNXRVJFc2NaSnZHdHJFZkZEWTJva2ZENC9OUUpiZS9CSGRSYk5vam83M01yRGhkVEduVVI2bzdJMm9zL0lkRmlPY055V0xibTFMdDdCd1JzR3dTVnBZdVU2UDBkYzBKR3F3U2ZyY3RyRUVHWGd2V1lQUmJ3TFJCK3R5eFltL0FCOGdudXJQQUdhVllmbEo3MnVzV0tjdkFyMHJtTkd2Tkh6bmlWcFlxSVJnbkxiWEZZc1RDa2hmVlp1MVB4S3hZbEdRdlZjUnZLWFl3RXJheGI4TXZUYmFRenhISDVGTk1ZQklIQnF4WWdNSzFLWUJ0ejlrUElMZFZpeE1LR0RCZnAraW5oV0NUYmQxVzFpQVJmRU5IMThVbGltMjdMRmllQXN3cnFZanNpMG1CWXNXZmhrWHV5aHFPVStpdEtWTUV1bmdPS3hZdWFaZGVBTm80ZHBjQkdsSjUzaTR6a1gzNkQ0TGpzZlRHVmx0MGRnQVFzV0syRW5rOEVRM3pCZERTWURnNlozK1BWOUtkT0Z0WXJaUENNZlErekdEd3NWL3ltZjhBZXBwSU51dExFa1JwREdJYkFrS3REUlBaYldKODNvbUlJeG92M1EzTUN4WXBJcXc5R2kzK0VHTXVvQjM4MXF2U2JsczFvdWRHZ2ZJYWNsaXhFQnJEMFdrM0N3RHpUdkJ0MnVzV0pSamRNeklPbXVnNmFyRml4Qm1SLzlrPSkNCg0KIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiBvcmFuZ2U7ICI+IEVqZXJjaWNpbyAxLiBNb2RlbG8gRWNvbm9tw6l0cmljbw0KIVtdKEM6L1VzZXJzL2FkbWluL0Rvd25sb2Fkcy9DYXB0dXJhIGRlIHBhbnRhbGxhIDIwMjUtMDgtMTMgMTY1NzM1LnBuZykNCg0KIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiBvcmFuZ2U7ICI+IEVqZXJjaWNpbyAyLiBnb29kIHRvIGdyZWF0DQohW10oQzpcXFVzZXJzXFxhZG1pblxcRG93bmxvYWRzXFxJbWFnZW4gZGUgV2hhdHNBcHAgMjAyNS0wOC0xMyBhIGxhcyAxNi41OS40OV9hMTU0ZTc1MS5qcGcpDQojIDxzcGFuIHN0eWxlID0iY29sb3I6IG9yYW5nZTsgIj4gQXBsaWNhY2nDs24gZGUgc2hpbnkNCg0KW0FwbGljYWNpw7NuIGRlIHNoaW55XShodHRwczovL3JvZHJpZ29hbmd1bG8uc2hpbnlhcHBzLmlvL0VNMjUvKQ0KDQojIDxzcGFuIHN0eWxlID0iY29sb3I6IG9yYW5nZTsgIj4gQWN0aXZpZGFkIDMgZW4gcGFyZWphcw0KW0VqZXJjaWNpbyBQYW5lbCBFbiBFcXVpcG9zXShodHRwczovL3JwdWJzLmNvbS9yb3Jyb2FuZ3VsbzE1LzEzMzYwNjgpDQoNCiMgPHNwYW4gc3R5bGUgPSJjb2xvcjogb3JhbmdlOyAiPiBpbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXJpYXMNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNpbnN0YWxsLnBhY2thZ2VzKCJXREkiKQ0KI2luc3RhbGwucGFja2FnZXMoIndic3RhdHMiKQ0KbGlicmFyeShXREkpDQpsaWJyYXJ5KHdic3RhdHMpDQojaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KI2luc3RhbGwucGFja2FnZXMoInBsbSIpICNwYXF1ZXRlIHBhcmEgcmVhbGl6YXIgbW9kZWxvcyBsaW5lYWxlcyBwYXJhIGRhdG9zIGRlIHBhbmVsDQpsaWJyYXJ5KHBsbSkNCiNpbnN0YWxsLnBhY2thZ2VzKCJncGxvdHMiKQ0KbGlicmFyeShncGxvdHMpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobG10ZXN0KQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6IG9yYW5nZTsgIj4gUGFzbyAxOiBHZW5lcmFyIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHBhbmVsDQoNCmBgYHtyfQ0KZ2RwIDwtIHdiX2RhdGEoY291bnRyeT1jKCJNWCIsIlVTIiwiQ0EiKSwgaW5kaWNhdG9yPWMoIk5ZLkdEUC5QQ0FQLkNEIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJTTS5QT1AuTkVUTSIpLCBzdGFydF9kYXRlPTE5NTAsIGVuZF9kYXRlPTIwMjUpDQoNCiNnZW5lcmFyIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHBhbmVsDQpwYW5lbF8xIDwtIHNlbGVjdChnZHAsIGNvdW50cnksIGRhdGUsIE5ZLkdEUC5QQ0FQLkNELCBTTS5QT1AuTkVUTSkNCnBhbmVsXzEgPC0gc3Vic2V0KHBhbmVsXzEsIGRhdGUgPT0gMTk2MCB8IGRhdGUgPT0gMTk3MCB8IGRhdGU9PSAxOTgwIHwgZGF0ZT09IDE5OTAgfCBkYXRlPT0yMDAwIHwgZGF0ZT09MjAxMCB8IGRhdGU9PTIwMjApDQoNCnBhbmVsXzEgPC0gcGRhdGEuZnJhbWUocGFuZWxfMSwgaW5kZXggPSBjKCJjb3VudHJ5IiwiZGF0ZSIpKQ0KDQpgYGANCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6IG9yYW5nZTsgIj4gUGFzbyAyOiBQcnVlYmEgZGUgSGV0ZXJvZ2VuaWRhZA0KYGBge3J9DQpwbG90bWVhbnMoTlkuR0RQLlBDQVAuQ0QgfiBjb3VudHJ5LCBtYWluPSAiUHJ1ZWJhIGRlIGhldGVyb2dlbmlkYWQgZW50cmUgcGFpc2VzIHBhcmEgZWwgUElCIiwgZGF0YT1wYW5lbF8xKQ0KDQpwbG90bWVhbnMoU00uUE9QLk5FVE0gfiBjb3VudHJ5LCBtYWluPSAiUHJ1ZWJhIGRlIGhldGVyb2dlbmlkYWQgZW50cmUgcGFpc2VzIHBhcmEgbGEgbWlncmFjaW9uIG5ldGEiLCBkYXRhPXBhbmVsXzEpDQoNCiNzaSBsYSBsaW5lYSBzYWxlIGNhc2kgaG9yaXpvbnRhbCwgaGF5IHBvY2EgbyBudWxhIGhldGVyb2dlbmlkYWQsIHBvciBsbyBxdWUgbm8gaGF5IGRpZmVyZW5jaWEgc2l0ZW1hdGljYSBxdWUgYWp1c3Rhcg0KI3NpIGxhIGxpbmVhIHNhbGUgcXVlYnJhZGEsIHN1YmUgeSBiYWphLCBoYXkgbXVjaGEgaGV0ZXJvZ2VuaWRhZCwgcG9yIGxvIHF1ZSBoYXkgcXVlIGFqdXN0YXINCmBgYA0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiBvcmFuZ2U7ICI+IFBhc28gMzogUHJ1ZWJhIGRlIEVmZWN0b3MgZmlqb3MgeSBBbGVhdG9yaXMgDQoNCmBgYHtyfQ0KI01vZGVsbyAxLiBSZWdyZXNpw7NuIGFncnVwYWRhIChwb29sZWQpICMjcGFyYSBwb2NhIG8gbnVsYSBoZXRlcm9nZW5pZGFkDQojYXN1bWUgcXVlIG5vIGhheSBoZXRlcm9nZW5pZGFkIG5vIG9ic2VydmFkYQ0KcG9vbGVkIDwtIHBsbShOWS5HRFAuUENBUC5DRCB+IFNNLlBPUC5ORVRNLCBkYXRhID0gcGFuZWxfMSwgbW9kZWw9InBvb2xpbmciKQ0Kc3VtbWFyeShwb29sZWQpDQoNCiNNb2RlbG8gMi4gRWZlY3RvcyBmaWpvcyAod2l0aGluKQ0KI0N1YW5kbyBsYXMgZGlmZXJlbmNpYXMgbm8gb2JzZXJ2YWRhcyBzb24gY29uc3RhbnRlIGVuIGVsIHRpZW1wbw0Kd2l0aGluIDwtIHBsbShOWS5HRFAuUENBUC5DRCB+IFNNLlBPUC5ORVRNLCBkYXRhID0gcGFuZWxfMSwgbW9kZWw9IndpdGhpbiIpDQpzdW1tYXJ5KHdpdGhpbikNCg0KI1BydWViYSBGDQpwRnRlc3Qod2l0aGluLCBwb29sZWQpDQojIFNpIHAtdmFsdWUgZXMgbWVub3IgYSAwLjA1IHNlIHByZWZpZXJlIGVsIG1vZGVsbyBkZSBlZmVjdG9zIGZpam9zDQoNCiNNb2RlbG8gMy4gRWZlY3RvcyBBbGVhdG9yaW9zIA0KI0N1YW5kbyBsYXMgZGlmZXJlbmNpYXMgbm8gb2JzZXJ2YWRhcyBzb24gYWxlYXRvcmlhcw0KDQojTcOpdG9kbyB3YWxodXMNCndhbGh1cyA8LSBwbG0oTlkuR0RQLlBDQVAuQ0QgfiBTTS5QT1AuTkVUTSwgZGF0YSA9IHBhbmVsXzEsIG1vZGVsPSJyYW5kb20iLCByYW5kb20ubWV0aG9kID0gIndhbGh1cyIpDQpzdW1tYXJ5KHdhbGh1cykNCg0KI03DqXRvZG8gYW1lbWl5YQ0KYW1lbWl5YSA8LSBwbG0oTlkuR0RQLlBDQVAuQ0QgfiBTTS5QT1AuTkVUTSwgZGF0YSA9IHBhbmVsXzEsIG1vZGVsPSJyYW5kb20iLCByYW5kb20ubWV0aG9kID0gImFtZW1peWEiKQ0Kc3VtbWFyeShhbWVtaXlhKQ0KDQojTcOpdG9kbyBuZXJsb3ZlDQpuZXJsb3ZlIDwtIHBsbShOWS5HRFAuUENBUC5DRCB+IFNNLlBPUC5ORVRNLCBkYXRhID0gcGFuZWxfMSwgbW9kZWw9InJhbmRvbSIsIHJhbmRvbS5tZXRob2QgPSAibmVybG92ZSIpDQpzdW1tYXJ5KG5lcmxvdmUpDQoNCiNDb21wYXJhciBsYSByMiBhanVzdGFkYSBkZSBsb3MgMyBtw6l0b2RvcyB5IGVsZWdpciBlbCBxdWUgdGVuZ2EgZWwgbWF5b3IgcjIgZXNlIGxvIHBvbmVtb3MgZW4gbGEgcHJ1ZWJhIGRlIGhhdXNtYW4NCg0KcGh0ZXN0KHdhbGh1cywgd2l0aGluKQ0KI1NpIGVsIHAtdmFsdWUgZW4gPDAuMDUsIHVzYW1vcyBFZmVjdG9zIEZpam9zDQpgYGANCmBgYHtyfQ0KcGF0ZW50ZXMgPC0gcmVhZF9leGNlbCgiQzpcXFVzZXJzXFxhZG1pblxcRG93bmxvYWRzXFxQQVRFTlQgMy54bHMiKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShwYXRlbnRlcykNCnN0cihwYXRlbnRlcykNCnN1bShpcy5uYShwYXRlbnRlcykpI05BwrRzIGVuIGxhIGJhc2UgZGUgZGF0b3MNCnNhcHBseShwYXRlbnRlcywgZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSkgI05BwrRzIHBvciB2YXJpYWJsZQ0KcGF0ZW50ZXMkZW1wbG95W2lzLm5hKHBhdGVudGVzJGVtcGxveSldIDwtIG1lYW4ocGF0ZW50ZXMkZW1wbG95LCBuYS5ybT1UUlVFKQ0KcGF0ZW50ZXMkcmV0dXJuW2lzLm5hKHBhdGVudGVzJGVtcGxveSldIDwtIG1lYW4ocGF0ZW50ZXMkZW1wbG95LCBuYS5ybT1UUlVFKQ0KcGF0ZW50ZXMkc3Rja3ByW2lzLm5hKHBhdGVudGVzJGVtcGxveSldIDwtIG1lYW4ocGF0ZW50ZXMkZW1wbG95LCBuYS5ybT1UUlVFKQ0KcGF0ZW50ZXMkcm5kc3Rja1tpcy5uYShwYXRlbnRlcyRlbXBsb3kpXSA8LSBtZWFuKHBhdGVudGVzJGVtcGxveSwgbmEucm09VFJVRSkNCnBhdGVudGVzJHNhbGVzW2lzLm5hKHBhdGVudGVzJGVtcGxveSldIDwtIG1lYW4ocGF0ZW50ZXMkZW1wbG95LCBuYS5ybT1UUlVFKQ0Kc3VtbWFyeShwYXRlbnRlcykNCnN1bShpcy5uYShwYXRlbnRlcykpDQpib3hwbG90KHBhdGVudGVzJGN1c2lwLCBob3Jpem9udGFsPVRSVUUpDQpib3hwbG90KHBhdGVudGVzJG1lcmdlciwgaG9yaXpvbnRhbD1UUlVFKQ0KYm94cGxvdChwYXRlbnRlcyRlbXBsb3ksIGhvcml6b250YWw9VFJVRSkNCmJveHBsb3QocGF0ZW50ZXMkcGF0ZW50cywgaG9yaXpvbnRhbD1UUlVFKQ0KYm94cGxvdChwYXRlbnRlcyRyZXR1cm4sIGhvcml6b250YWw9VFJVRSkNCmJveHBsb3QocGF0ZW50ZXMkcGF0ZW50c2csIGhvcml6b250YWw9VFJVRSkNCmJveHBsb3QocGF0ZW50ZXMkc3Rja3ByLCBob3Jpem9udGFsPVRSVUUpDQpib3hwbG90KHBhdGVudGVzJHJuZCwgaG9yaXpvbnRhbD1UUlVFKQ0KYm94cGxvdChwYXRlbnRlcyRybmRlZmx0LCBob3Jpem9udGFsPVRSVUUpDQpib3hwbG90KHBhdGVudGVzJHJuZHN0Y2ssIGhvcml6b250YWw9VFJVRSkNCmJveHBsb3QocGF0ZW50ZXMkc2FsZXMsIGhvcml6b250YWw9VFJVRSkNCmJveHBsb3QocGF0ZW50ZXMkc2ljLCBob3Jpem9udGFsPVRSVUUpDQpib3hwbG90KHBhdGVudGVzJHllYXIsIGhvcml6b250YWw9VFJVRSkNCnBhdGVudGVzJHllYXIgPC0gcGF0ZW50ZXMkeWVhciAtNDANCnN1bW1hcnkocGF0ZW50ZXMpDQoNCg0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6IG9yYW5nZTsgIj4gUGFzbyAxOiBHZW5lcmFyIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHBhbmVsDQoNCmBgYHtyfQ0KI2dlbmVyYXIgY29uanVudG8gZGUgZGF0b3MgZGUgcGFuZWwNCg0KcGFuZWxfcGF0ZW50ZXMgPC0gcGRhdGEuZnJhbWUocGF0ZW50ZXMsIGluZGV4ID0gYygiY3VzaXAiLCJ5ZWFyIikpDQoNCmBgYA0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiBvcmFuZ2U7ICI+IFBhc28gMjogUHJ1ZWJhIGRlIEhldGVyb2dlbmlkYWQNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwbG90bWVhbnMocGF0ZW50cyB+IGN1c2lwLCBtYWluPSAiUHJ1ZWJhIGRlIGhldGVyb2dlbmlkYWQgZW50cmUgZW1wcmVzYXMgcGFyYSBzdXMgcGF0ZW50ZXMiLCBkYXRhPXBhbmVsX3BhdGVudGVzKQ0KDQoNCiNDb21vIGxhIGxpbmVhIHNhbGUgcXVlYnJhZGEsIHN1YmUgeSBiYWphLCBoYXkgbXVjaGEgaGV0ZXJvZ2VuaWRhZCwgcG9yIGxvIHF1ZSBoYXkgcXVlIGFqdXN0YXINCmBgYA0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiBvcmFuZ2U7ICI+IFBhc28gMzogUHJ1ZWJhIGRlIEVmZWN0b3MgZmlqb3MgeSBBbGVhdG9yaXMgDQoNCmBgYHtyfQ0KI01vZGVsbyAxLiBSZWdyZXNpw7NuIGFncnVwYWRhIChwb29sZWQpICMjcGFyYSBwb2NhIG8gbnVsYSBoZXRlcm9nZW5pZGFkDQojYXN1bWUgcXVlIG5vIGhheSBoZXRlcm9nZW5pZGFkIG5vIG9ic2VydmFkYQ0KcG9vbGVkX3BhdGVudGVzIDwtIHBsbShwYXRlbnRzIH4gbWVyZ2VyICsgZW1wbG95ICsgcmV0dXJuICsgc3Rja3ByICsgcm5kICsgc2FsZXMgKyBzaWMsIGRhdGEgPSBwYW5lbF9wYXRlbnRlcywgbW9kZWw9InBvb2xpbmciKQ0Kc3VtbWFyeShwb29sZWRfcGF0ZW50ZXMpDQoNCiNNb2RlbG8gMi4gRWZlY3RvcyBmaWpvcyAod2l0aGluKQ0KI0N1YW5kbyBsYXMgZGlmZXJlbmNpYXMgbm8gb2JzZXJ2YWRhcyBzb24gY29uc3RhbnRlIGVuIGVsIHRpZW1wbw0Kd2l0aGluX3BhdGVudGVzIDwtIHBsbShwYXRlbnRzIH4gbWVyZ2VyICsgZW1wbG95ICsgcmV0dXJuICsgc3Rja3ByICsgcm5kICsgc2FsZXMgKyBzaWMsIGRhdGEgPSBwYW5lbF9wYXRlbnRlcywgbW9kZWw9IndpdGhpbiIpDQpzdW1tYXJ5KHdpdGhpbl9wYXRlbnRlcykNCg0KI1BydWViYSBGDQpwRnRlc3Qod2l0aGluX3BhdGVudGVzLCBwb29sZWRfcGF0ZW50ZXMpDQojIGNvbW8gcC12YWx1ZSBlcyBtZW5vciBhIDAuMDUgc2UgYXZhbnphIGEgbG9zIHNpZ3VpZW50ZXMgbW9kZWxvcw0KDQojTW9kZWxvIDMuIEVmZWN0b3MgQWxlYXRvcmlvcyANCiNDdWFuZG8gbGFzIGRpZmVyZW5jaWFzIG5vIG9ic2VydmFkYXMgc29uIGFsZWF0b3JpYXMNCg0KI03DqXRvZG8gd2FsaHVzDQp3YWxodXNfcGF0ZW50ZXMgPC0gcGxtKHBhdGVudHMgfiBtZXJnZXIgKyBlbXBsb3kgKyByZXR1cm4gKyBzdGNrcHIgKyBybmQgKyBzYWxlcyArIHNpYywgZGF0YSA9IHBhbmVsX3BhdGVudGVzLCBtb2RlbD0icmFuZG9tIiwgcmFuZG9tLm1ldGhvZCA9ICJ3YWxodXMiKQ0Kc3VtbWFyeSh3YWxodXNfcGF0ZW50ZXMpDQoNCiNNw6l0b2RvIGFtZW1peWENCmFtZW1peWFfcGF0ZW50ZXMgPC0gcGxtKHBhdGVudHMgfiBtZXJnZXIgKyBlbXBsb3kgKyByZXR1cm4gKyBzdGNrcHIgKyBybmQgKyBzYWxlcywNCmRhdGEgPSBwYW5lbF9wYXRlbnRlcywgbW9kZWw9InJhbmRvbSIsIHJhbmRvbS5tZXRob2QgPSAiYW1lbWl5YSIpDQpzdW1tYXJ5KGFtZW1peWFfcGF0ZW50ZXMpDQoNCiNNw6l0b2RvIG5lcmxvdmUNCm5lcmxvdmVfcGF0ZW50ZXMgPC0gcGxtKHBhdGVudHMgfiBtZXJnZXIgKyBlbXBsb3kgKyByZXR1cm4gKyBzdGNrcHIgKyBybmQgKyBzYWxlcyArIHNpYywgZGF0YSA9IHBhbmVsX3BhdGVudGVzLCBtb2RlbD0icmFuZG9tIiwgcmFuZG9tLm1ldGhvZCA9ICJuZXJsb3ZlIikNCnN1bW1hcnkobmVybG92ZV9wYXRlbnRlcykNCg0KI0NvbXBhcmFyIGxhIHIyIGFqdXN0YWRhIGRlIGxvcyAzIG3DqXRvZG9zIHkgZWxlZ2lyIGVsIHF1ZSB0ZW5nYSBlbCBtYXlvciByMiBlc2UgbG8gcG9uZW1vcyBlbiBsYSBwcnVlYmEgZGUgaGF1c21hbg0KDQpwaHRlc3Qod2FsaHVzX3BhdGVudGVzLCB3aXRoaW5fcGF0ZW50ZXMpDQojU2kgZWwgcC12YWx1ZSBlbiA8MC4wNSwgdXNhbW9zIEVmZWN0b3MgRmlqb3MNCiNQb3IgbG8gdGF0IG5vcyBxdWVkYW1vcyBjb24gZWwgbW9kZWxvIGRlIGVmZWN0b3MgZmlqb3MgKHdpdGhpbikNCmBgYA0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjogb3JhbmdlOyAiPiBQYXNvIDQ6IFBydWViYSBkZSBoZXRlcm9jZWRhc3RpY2lkYWQgeSBhdXRvY29ycmVsYWNpw7NuIHNlcmlhbA0KDQpgYGB7cn0NCiNQcmllYmEgZGUgaGV0ZXJvY2VkYXN0aWNpZGFkDQpicHRlc3Qod2l0aGluX3BhdGVudGVzKQ0KI1NpIGVsIHAtdmFsdWUgPCAwLjA1LCBoYXkgaGV0ZXJvY2VkYXN0aWNpZGFkIGVuIGxvcyByZXNpZHVvcyAocHJvYmxlbWEgZGV0ZWN0YWRvKQ0KDQojcHJ1ZWJhIGRlIGF1dG9jb3JyZWxhY2nDs24gc2VyaWFsDQpwd2FydGVzdCh3aXRoaW5fcGF0ZW50ZXMpDQojU2kgZWwgcC12YWx1ZSA8IDAuMDUsIGhheSBhdXRvY29ycmVsYWNpw7NuIHNlcmlhbCBlbiBsb3MgZXJyb3JlcyAocHJvYmxlbWEgZGV0ZWN0YWRvKQ0KDQojTW9kZWxvIGRlIENvcnJlY2Npw7NuIGRlIEVycm9yZXMgRXN0YW5kYXIgUm9idXN0b3MNCmNvZWZpY2llbnRlc19jb3JyZWdpZG9zIDwtIGNvZWZ0ZXN0KHdpdGhpbl9wYXRlbnRlcywgdmNvdj0gdmNvdkhDKHdpdGhpbl9wYXRlbnRlcywgdHlwZT0iSEMwIikpDQpzb2xvX2NvZWZpY2llbnRlcyA8LSBjb2VmaWNpZW50ZXNfY29ycmVnaWRvc1ssMV0NCmBgYA0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiBvcmFuZ2U7ICI+IFBhc28gNTogR2VuZXJhciBQcm9ub3N0aWNvcyB5IEV2YWx1YXIgbW9kZWxvDQoNCmBgYHtyfQ0KZGF0b3NfZGVfcHJ1ZWJhIDwtIGRhdGEuZnJhbWUoIG1lcmdlcj0wLCAgZW1wbG95PTEwLCByZXR1cm49Niwgc3Rja3ByPTQ4LCBybmQ9Mywgc2FsZXM9MzQ0KQ0KcHJlZGljY2lvbiA8LSBzdW0oc29sb19jb2VmaWNpZW50ZXMqZGF0b3NfZGVfcHJ1ZWJhKQ0KcHJlZGljY2lvbg0KYGBgDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiBvcmFuZ2U7ICI+IENvbmNsdXNpb25lcw0KRW4gY29uY2x1c2lvbiBlc3RlIGVqZXJjaWNpbyBub3MgcGVybWl0aW8gZ2VuZXJhciBwcm9ub3N0aWNvcyBlbiBiYXNlcyBkZSBkYXRvcyBjb24gcGFuZWwsIHRvbWFuZG8gZW4gY3VlbnRhIGxvcyB0cmF0YW1pZW50b3MgcGFyYSBkaXN0aW50b3MgZWZlY3RvcyBlbiBsb3MgZGF0b3N5IHN1cyBlcnJvcmVzDQoNCg==