Utiliza los datos de LOANAPP para este ejercicio.


1. Estima un modelo con approve como variable dependiente y white como variable explicativa. Calcula la probabilidad de que concedan una hipoteca a un blanco y a alguien de color. ¿Son estos resultados similares a los obtenidos mediante el modelo lineal de probabilidad?

Calculamos el modelo mediante un probit:

probit <- glm(approve ~ white, family = binomial(link="probit"))
summary(probit)

Call:
glm(formula = approve ~ white, family = binomial(link = "probit"))

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.1864   0.4384   0.4384   0.4384   0.8314  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  0.54695    0.07544   7.251 4.15e-13 ***
white        0.78395    0.08671   9.041  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1480.7  on 1988  degrees of freedom
Residual deviance: 1401.8  on 1987  degrees of freedom
AIC: 1405.8

Number of Fisher Scoring iterations: 4

Tanto la constante como la variable white son significativas en el modelo.

Las probabilidades de que concedan una hipoteca con el modelo probit son:

Persona blanca: 0.9083879 
Persona de color: 0.7077922

Hacemos lo mismo pero ahora con un MLP:

mlp <- lm(approve ~ white)
summary(mlp)

Call:
lm(formula = approve ~ white)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.90839  0.09161  0.09161  0.09161  0.29221 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.70779    0.01824   38.81   <2e-16 ***
white        0.20060    0.01984   10.11   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3201 on 1987 degrees of freedom
Multiple R-squared:  0.04893,   Adjusted R-squared:  0.04845 
F-statistic: 102.2 on 1 and 1987 DF,  p-value: < 2.2e-16

Probabilidades de conceder una hipoteca mediante MLP:

Persona blanca: 0.9083879 
Persona de color: 0.7077922

Como podemos ver las probabilidades en este caso son exactamente iguales, esto se debe a que solo estamos usando una variable explicativa.


2. Incluye las variable explicativas hrat, obrat, loanprc, unem, male, married, dep, sch, cosign, pubrec, mortlat1, mortlat2, y vr al modelo probit. ¿Hay evidencia estadística de discriminación de los no-blancos?

probit2 <- glm(approve ~ white + hrat + obrat + loanprc + unem + male + married + dep + sch + cosign + pubrec + mortlat1 + mortlat2 + vr, family = binomial(link="probit"))
summary(probit2)

Call:
glm(formula = approve ~ white + hrat + obrat + loanprc + unem + 
    male + married + dep + sch + cosign + pubrec + mortlat1 + 
    mortlat2 + vr, family = binomial(link = "probit"))

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.9826   0.2642   0.3673   0.4838   1.8536  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept)  2.467391   0.306604   8.047 8.45e-16 ***
white        0.570011   0.095110   5.993 2.06e-09 ***
hrat         0.010469   0.006898   1.518   0.1291    
obrat       -0.029881   0.006035  -4.951 7.37e-07 ***
loanprc     -1.005723   0.239389  -4.201 2.65e-05 ***
unem        -0.031173   0.017472  -1.784   0.0744 .  
male        -0.037751   0.108366  -0.348   0.7276    
married      0.229066   0.093089   2.461   0.0139 *  
dep         -0.037247   0.038513  -0.967   0.3335    
sch          0.041582   0.093806   0.443   0.6576    
cosign       0.044068   0.234173   0.188   0.8507    
pubrec      -0.965282   0.121759  -7.928 2.23e-15 ***
mortlat1    -0.256219   0.255706  -1.002   0.3163    
mortlat2    -0.584431   0.317975  -1.838   0.0661 .  
vr          -0.187485   0.080409  -2.332   0.0197 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1476.0  on 1970  degrees of freedom
Residual deviance: 1236.5  on 1956  degrees of freedom
  (18 observations deleted due to missingness)
AIC: 1266.5

Number of Fisher Scoring iterations: 5

La variable white en este modelo es significativa por lo que influye en la variable approve, el signo del coeficiente estimado es positivo lo que nos indica que en caso de ser una persona blanca la probabilidad de que te aprueben la hipoteca aumenta, por tanto hay evidencia estadística de discriminación de los no-blancos en este modelo.


3. Estima el modelo del apartado anterior como un logit y compara los coeficientes con los del probit.

logit <- glm(approve ~ white + hrat + obrat + loanprc + unem + male + married + dep + sch + cosign + pubrec + mortlat1 + mortlat2 + vr, family = binomial(link="logit"))
summary(logit)

Call:
glm(formula = approve ~ white + hrat + obrat + loanprc + unem + 
    male + married + dep + sch + cosign + pubrec + mortlat1 + 
    mortlat2 + vr, family = binomial(link = "logit"))

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.8649   0.2774   0.3685   0.4753   1.9361  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  4.52976    0.57986   7.812 5.63e-15 ***
white        1.03621    0.16878   6.139 8.29e-10 ***
hrat         0.01852    0.01261   1.468   0.1420    
obrat       -0.05715    0.01103  -5.181 2.21e-07 ***
loanprc     -1.89846    0.45981  -4.129 3.65e-05 ***
unem        -0.05610    0.03235  -1.734   0.0829 .  
male        -0.06646    0.20289  -0.328   0.7432    
married      0.42606    0.17465   2.439   0.0147 *  
dep         -0.06529    0.07202  -0.906   0.3647    
sch          0.07918    0.17546   0.451   0.6518    
cosign       0.09046    0.43311   0.209   0.8345    
pubrec      -1.66816    0.20667  -8.072 6.94e-16 ***
mortlat1    -0.41786    0.46528  -0.898   0.3691    
mortlat2    -1.07987    0.54908  -1.967   0.0492 *  
vr          -0.33328    0.15167  -2.197   0.0280 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1476.0  on 1970  degrees of freedom
Residual deviance: 1237.3  on 1956  degrees of freedom
  (18 observations deleted due to missingness)
AIC: 1267.3

Number of Fisher Scoring iterations: 5
mtable(probit2, logit)

Calls:
probit2: glm(formula = approve ~ white + hrat + obrat + loanprc + unem + 
    male + married + dep + sch + cosign + pubrec + mortlat1 + 
    mortlat2 + vr, family = binomial(link = "probit"))
logit: glm(formula = approve ~ white + hrat + obrat + loanprc + unem + 
    male + married + dep + sch + cosign + pubrec + mortlat1 + 
    mortlat2 + vr, family = binomial(link = "logit"))

==============================================
                         probit2     logit    
----------------------------------------------
  (Intercept)            2.467***   4.530***  
                        (0.307)    (0.580)    
  white                  0.570***   1.036***  
                        (0.095)    (0.169)    
  hrat                   0.010      0.019     
                        (0.007)    (0.013)    
  obrat                 -0.030***  -0.057***  
                        (0.006)    (0.011)    
  loanprc               -1.006***  -1.898***  
                        (0.239)    (0.460)    
  unem                  -0.031     -0.056     
                        (0.017)    (0.032)    
  male                  -0.038     -0.066     
                        (0.108)    (0.203)    
  married                0.229*     0.426*    
                        (0.093)    (0.175)    
  dep                   -0.037     -0.065     
                        (0.039)    (0.072)    
  sch                    0.042      0.079     
                        (0.094)    (0.175)    
  cosign                 0.044      0.090     
                        (0.234)    (0.433)    
  pubrec                -0.965***  -1.668***  
                        (0.122)    (0.207)    
  mortlat1              -0.256     -0.418     
                        (0.256)    (0.465)    
  mortlat2              -0.584     -1.080*    
                        (0.318)    (0.549)    
  vr                    -0.187*    -0.333*    
                        (0.080)    (0.152)    
----------------------------------------------
  Aldrich-Nelson R-sq.      0.1        0.1    
  McFadden R-sq.            0.2        0.2    
  Cox-Snell R-sq.           0.1        0.1    
  Nagelkerke R-sq.          0.2        0.2    
  phi                       1.0        1.0    
  Likelihood-ratio        239.5      238.7    
  p                         0.0        0.0    
  Log-likelihood         -618.2     -618.7    
  Deviance               1236.5     1237.3    
  AIC                    1266.5     1267.3    
  BIC                    1350.3     1351.1    
  N                      1971       1971      
==============================================

Vemos como los coeficientes son prácticamente iguales excepto por la escala, los del modelo logit son casi el doble que los del modelo probit.

Una gran ventaja de las estimacions del modelo logit es que nos sirven para obtener los odds ratio de las variables, la variable white tiene un odd ratio de e1.036 = 2.818, que quiere decir que es 2.818 veces más probable que a una persona blanca le aprueben la hipoteca que a una persona no-blanca.


4. Utiliza la siguiente ecuación para estimar el efecto parcial medio de una variable discreta (ck = 0, 1) \[ n^{-1}\sum_{i=1}^{n} (G[\beta_0 + \beta_1x_{1i} +...+ \beta_{k-1}x_{k-1,i} +\beta_k]-G[\beta_0 + \beta_1x_{1i} +...+ \beta_{k-1}x_{k-1,i}]) \]

dat <- cbind(1,1, hrat, obrat, loanprc, unem, male, married, dep, sch, cosign, pubrec, mortlat1, mortlat2, vr)
dat2 <- dat
dat2[,2] <- 0
epm <- mean(pnorm(colSums(t(dat)*probit2$coefficients))-pnorm(colSums(t(dat2)*probit2$coefficients)),na.rm = T)
cat("Efecto Parcial Medio:", epm)
Efecto Parcial Medio: 0.1197566

El efecto parcial medio de la variable white es de 0.1198, esto quiere decir que de media hay un 11.98% más de posibilidades de que a una persona blanca le concedan su hipoteca respecto a una persona no-blanca.


EXTRA

La variable white es significativa en el modelo anterior pero ese modelo tiene varias variables no significativas y no se incluyen variables que pueden ser muy relevantes a la hora de determinar si se aprueba una hipoteca o no, por ejemplo, el ingreso de la persona, poder verificar la información del solicitante o que el historial de crédito cumpla con los requisitos.

Por este motivo he creado otro modelo que incluye otras variables de la base de datos para poder ver si realmente hay un problema de discriminación de los no-blancos.

probit3 <- glm(approve ~ white + self +unver + gdlin + unit + occ + appinc + obrat + loanprc + unem + married + pubrec + vr, family = binomial(link="probit"))
summary(probit3)

Call:
glm(formula = approve ~ white + self + unver + gdlin + unit + 
    occ + appinc + obrat + loanprc + unem + married + pubrec + 
    vr, family = binomial(link = "probit"))

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.9347   0.1711   0.2412   0.3486   2.9440  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept)  1.5038051  0.4306665   3.492 0.000480 ***
white        0.4053171  0.1150080   3.524 0.000425 ***
self        -0.3145065  0.1325273  -2.373 0.017637 *  
unver       -1.4829111  0.1846080  -8.033 9.53e-16 ***
gdlin        1.9567561  0.1392716  14.050  < 2e-16 ***
unit        -0.1753078  0.0889967  -1.970 0.048859 *  
occ         -0.3274222  0.2002519  -1.635 0.102038    
appinc      -0.0007689  0.0007373  -1.043 0.297006    
obrat       -0.0206990  0.0056301  -3.676 0.000236 ***
loanprc     -0.8460874  0.2745578  -3.082 0.002059 ** 
unem        -0.0299231  0.0199632  -1.499 0.133896    
married      0.2626258  0.0976951   2.688 0.007183 ** 
pubrec      -0.2968444  0.1626660  -1.825 0.068021 .  
vr          -0.3143704  0.0971048  -3.237 0.001206 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1441.79  on 1960  degrees of freedom
Residual deviance:  840.11  on 1947  degrees of freedom
  (28 observations deleted due to missingness)
AIC: 868.11

Number of Fisher Scoring iterations: 6

En este modelo podemos considerar que todas las variables son significativas, white sigue siendo significativa pero esta vez con un nivel de significación considerablemente más bajo, pasó de 2.06e-09 a 0.000425, además el coeficiente estimado ahora es de 0.405 en lugar de 0.570 lo que nos indica que el efecto es mucho menor que antes, el error estándar solo aumento un poco de 0.095 a 0.115.

Hay que tener en cuenta también que el AIC de este nuevo modelo es de 868.11, mucho más bajo que los 1266.5 del modelo anterior, lo cual es muy buena señal.

Las conclusiones siguen siendo las mismas en cuanto a que hay discriminación de los no-blancos, sin embargo, si estimamos su efecto parcial medio en este modelo obtenemos:

dat <- cbind(1,1,self,unver,gdlin,unit,occ,appinc,obrat,loanprc,unem,married,pubrec,vr)
dat2 <- dat
dat2[,2] <- 0
epm2 <- mean(pnorm(colSums(t(dat)*probit3$coefficients))-pnorm(colSums(t(dat2)*probit3$coefficients)),na.rm = T)
cat("Efecto Parcial Medio:", epm2)
Efecto Parcial Medio: 0.05417827

Podemos ver como ahora el efecto parcial medio es solamente de 0.0542, si bien sigue habiendo discriminación en este modelo es muy distinto hablar de solo 5.42% mayor probabilidad de que te aprueben una hipoteca siendo blanco al 11.98% obtenido anteriormente.

LS0tDQp0aXRsZTogIkVqZXJjaWNpb3MgZGUgVmFyaWFibGUgRGVwZW5kaWVudGUgQmluYXJpYSINCmF1dGhvcjogIkFydGllbCBQYWxvbWFyIENvbGwiDQpkYXRlOiAiMDcvMDQvMjAxNyINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCjxQQVJBIFZFUiBCSUVOIExPUyBBQ0VOVE9TIFkgTEEgw5E6Pg0KPEZpbGUgLyBSZW9wZW4gd2l0aCBlbmNvZGluZy4uLiAvIFVURi04Pg0KDQo8Zm9udCBzaXplPTM+VXRpbGl6YSBsb3MgZGF0b3MgZGUgTE9BTkFQUCBwYXJhIGVzdGUgZWplcmNpY2lvLjwvZm9udCBzaXplPTM+DQoNCmBgYHtyIExlY3R1cmEgZGUgZGF0b3MsIGluY2x1ZGU9RkFMU0V9DQpzZXR3ZCgiQzovVXNlcnMvQWRtaW5pc3RyYWRvci9EZXNrdG9wL1VuaSIpDQojc2V0d2QoIkM6L1VzZXJzL0FydGllbC9Ecm9wYm94L0Vjb25vbWV0cmlhIikNCmxpYnJhcnkobWVtaXNjKQ0KDQpkYXRvcyA8LSByZWFkLnRhYmxlKCJsb2FuYXBwLnJhdyIsIG5hLnN0cmluZ3MgPSAiLiIpDQpuYW1lcyhkYXRvcykgPC0gYygib2NjIiwibG9hbmFtdCIsImFjdGlvbiIsIm1zYSIsInN1ZmZvbGsiLCJhcHBpbmMiLCJ0eXB1ciIsInVuaXQiLCAibWFycmllZCIsImRlcCIsImVtcCIsInlqb2IiLCJzZWxmIiwiYXRvdGluYyIsImNvdG90aW5jIiwiaGV4cCIsInByaWNlIiwib3RoZXIiLCJsaXEiLCJyZXAiLCJnZGxpbiIsImxpbmVzIiwibW9ydGciLCJjb25zIiwicHVicmVjIiwiaHJhdCIsIm9icmF0IiwiZml4YWRqIiwidGVybSIsImFwciIsInByb3AiLCJpbnNzIiwiaW5zb24iLCJnaWZ0IiwiY29zaWduIiwidW52ZXIiLCJyZXZpZXciLCJuZXR3IiwidW5lbSIsIm1pbjMwIiwiYmQiLCJtaSIsIm9sZCIsInZyIiwic2NoIiwiYmxhY2siLCJoaXNwYW4iLCJtYWxlIiwicmVqZWN0IiwiYXBwcm92ZSIsIm1vcnRubyIsIm1vcnRwZXJmIiwibW9ydGxhdDEiLCJtb3J0bGF0MiIsImNoaXN0IiwibXVsdGkiLCJsb2FucHJjIiwidGhpY2siLCJ3aGl0ZSIpDQphdHRhY2goZGF0b3MpDQpgYGANCg0KPEhSPioqMS4gRXN0aW1hIHVuIG1vZGVsbyBjb24gKmFwcHJvdmUqIGNvbW8gdmFyaWFibGUgZGVwZW5kaWVudGUgeSAqd2hpdGUqIGNvbW8gdmFyaWFibGUgZXhwbGljYXRpdmEuIENhbGN1bGEgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBjb25jZWRhbiB1bmEgaGlwb3RlY2EgYSB1biBibGFuY28geSBhIGFsZ3VpZW4gZGUgY29sb3IuIMK/U29uIGVzdG9zIHJlc3VsdGFkb3Mgc2ltaWxhcmVzIGEgbG9zIG9idGVuaWRvcyBtZWRpYW50ZSBlbCBtb2RlbG8gbGluZWFsIGRlIHByb2JhYmlsaWRhZD8qKg0KDQpDYWxjdWxhbW9zIGVsIG1vZGVsbyBtZWRpYW50ZSB1biBwcm9iaXQ6DQpgYGB7cn0NCnByb2JpdCA8LSBnbG0oYXBwcm92ZSB+IHdoaXRlLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rPSJwcm9iaXQiKSkNCnN1bW1hcnkocHJvYml0KQ0KYGBgDQoNClRhbnRvIGxhIGNvbnN0YW50ZSBjb21vIGxhIHZhcmlhYmxlICp3aGl0ZSogc29uIHNpZ25pZmljYXRpdmFzIGVuIGVsIG1vZGVsby4NCg0KTGFzIHByb2JhYmlsaWRhZGVzIGRlIHF1ZSBjb25jZWRhbiB1bmEgaGlwb3RlY2EgY29uIGVsIG1vZGVsbyBwcm9iaXQgc29uOg0KYGBge3IsIGVjaG89RkFMU0V9DQpjYXQoIlBlcnNvbmEgYmxhbmNhOiIsIHBub3JtKHN1bShwcm9iaXQkY29lZmZpY2llbnRzKmMoMSwxKSkpLCAiXG4iKQ0KY2F0KCJQZXJzb25hIGRlIGNvbG9yOiIsIHBub3JtKHN1bShwcm9iaXQkY29lZmZpY2llbnRzKmMoMSwwKSkpKQ0KYGBgDQoNCkhhY2Vtb3MgbG8gbWlzbW8gcGVybyBhaG9yYSBjb24gdW4gTUxQOg0KYGBge3J9DQptbHAgPC0gbG0oYXBwcm92ZSB+IHdoaXRlKQ0Kc3VtbWFyeShtbHApDQpgYGANCg0KUHJvYmFiaWxpZGFkZXMgZGUgY29uY2VkZXIgdW5hIGhpcG90ZWNhIG1lZGlhbnRlIE1MUDoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KY2F0KCJQZXJzb25hIGJsYW5jYToiLCBzdW0obWxwJGNvZWZmaWNpZW50cypjKDEsMSkpLCAiXG4iKQ0KY2F0KCJQZXJzb25hIGRlIGNvbG9yOiIsIHN1bShtbHAkY29lZmZpY2llbnRzKmMoMSwwKSkpDQpgYGANCg0KQ29tbyBwb2RlbW9zIHZlciBsYXMgcHJvYmFiaWxpZGFkZXMgZW4gZXN0ZSBjYXNvIHNvbiBleGFjdGFtZW50ZSBpZ3VhbGVzLCBlc3RvIHNlIGRlYmUgYSBxdWUgc29sbyBlc3RhbW9zIHVzYW5kbyB1bmEgdmFyaWFibGUgZXhwbGljYXRpdmEuDQoNCjxIUj4qKjIuIEluY2x1eWUgbGFzIHZhcmlhYmxlIGV4cGxpY2F0aXZhcyAqaHJhdCosICpvYnJhdCosICpsb2FucHJjKiwgKnVuZW0qLCAqbWFsZSosICptYXJyaWVkKiwgKmRlcCosICpzY2gqLCAqY29zaWduKiwgKnB1YnJlYyosICptb3J0bGF0MSosICptb3J0bGF0MiosIHkgKnZyKiBhbCBtb2RlbG8gcHJvYml0LiDCv0hheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIGRlIGRpc2NyaW1pbmFjacOzbiBkZSBsb3Mgbm8tYmxhbmNvcz8qKg0KDQpgYGB7cn0NCnByb2JpdDIgPC0gZ2xtKGFwcHJvdmUgfiB3aGl0ZSArIGhyYXQgKyBvYnJhdCArIGxvYW5wcmMgKyB1bmVtICsgbWFsZSArIG1hcnJpZWQgKyBkZXAgKyBzY2ggKyBjb3NpZ24gKyBwdWJyZWMgKyBtb3J0bGF0MSArIG1vcnRsYXQyICsgdnIsIGZhbWlseSA9IGJpbm9taWFsKGxpbms9InByb2JpdCIpKQ0Kc3VtbWFyeShwcm9iaXQyKQ0KYGBgDQpMYSB2YXJpYWJsZSAqd2hpdGUqIGVuIGVzdGUgbW9kZWxvIGVzIHNpZ25pZmljYXRpdmEgcG9yIGxvIHF1ZSBpbmZsdXllIGVuIGxhIHZhcmlhYmxlICphcHByb3ZlKiwgZWwgc2lnbm8gZGVsIGNvZWZpY2llbnRlIGVzdGltYWRvIGVzIHBvc2l0aXZvIGxvIHF1ZSBub3MgaW5kaWNhIHF1ZSBlbiBjYXNvIGRlIHNlciB1bmEgcGVyc29uYSBibGFuY2EgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSB0ZSBhcHJ1ZWJlbiBsYSBoaXBvdGVjYSBhdW1lbnRhLCBwb3IgdGFudG8gaGF5IGV2aWRlbmNpYSBlc3RhZMOtc3RpY2EgZGUgZGlzY3JpbWluYWNpw7NuIGRlIGxvcyBuby1ibGFuY29zIGVuIGVzdGUgbW9kZWxvLg0KDQo8SFI+KiozLiBFc3RpbWEgZWwgbW9kZWxvIGRlbCBhcGFydGFkbyBhbnRlcmlvciBjb21vIHVuIGxvZ2l0IHkgY29tcGFyYSBsb3MgY29lZmljaWVudGVzIGNvbiBsb3MgZGVsIHByb2JpdC4qKg0KDQpgYGB7cn0NCmxvZ2l0IDwtIGdsbShhcHByb3ZlIH4gd2hpdGUgKyBocmF0ICsgb2JyYXQgKyBsb2FucHJjICsgdW5lbSArIG1hbGUgKyBtYXJyaWVkICsgZGVwICsgc2NoICsgY29zaWduICsgcHVicmVjICsgbW9ydGxhdDEgKyBtb3J0bGF0MiArIHZyLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rPSJsb2dpdCIpKQ0Kc3VtbWFyeShsb2dpdCkNCmBgYA0KYGBge3J9DQptdGFibGUocHJvYml0MiwgbG9naXQpDQpgYGANCg0KVmVtb3MgY29tbyBsb3MgY29lZmljaWVudGVzIHNvbiBwcsOhY3RpY2FtZW50ZSBpZ3VhbGVzIGV4Y2VwdG8gcG9yIGxhIGVzY2FsYSwgbG9zIGRlbCBtb2RlbG8gbG9naXQgc29uIGNhc2kgZWwgZG9ibGUgcXVlIGxvcyBkZWwgbW9kZWxvIHByb2JpdC4NCg0KVW5hIGdyYW4gdmVudGFqYSBkZSBsYXMgZXN0aW1hY2lvbnMgZGVsIG1vZGVsbyBsb2dpdCBlcyBxdWUgbm9zIHNpcnZlbiBwYXJhIG9idGVuZXIgbG9zIG9kZHMgcmF0aW8gZGUgbGFzIHZhcmlhYmxlcywgbGEgdmFyaWFibGUgKndoaXRlKiB0aWVuZSB1biBvZGQgcmF0aW8gZGUgZTxzdXA+MS4wMzY8L3N1cD4gPSAyLjgxOCwgcXVlIHF1aWVyZSBkZWNpciBxdWUgZXMgMi44MTggdmVjZXMgbcOhcyBwcm9iYWJsZSBxdWUgYSB1bmEgcGVyc29uYSBibGFuY2EgbGUgYXBydWViZW4gbGEgaGlwb3RlY2EgcXVlIGEgdW5hIHBlcnNvbmEgbm8tYmxhbmNhLg0KDQo8SFI+Kio0LiBVdGlsaXphIGxhIHNpZ3VpZW50ZSBlY3VhY2nDs24gcGFyYSBlc3RpbWFyIGVsIGVmZWN0byBwYXJjaWFsIG1lZGlvIGRlIHVuYSB2YXJpYWJsZSBkaXNjcmV0YSAoKmM8c3ViPms8L3N1Yj4qID0gMCwgMSkqKg0KJCQNCm5eey0xfVxzdW1fe2k9MX1ee259IChHW1xiZXRhXzAgKyBcYmV0YV8xeF97MWl9ICsuLi4rIFxiZXRhX3trLTF9eF97ay0xLGl9ICtcYmV0YV9rXS1HW1xiZXRhXzAgKyBcYmV0YV8xeF97MWl9ICsuLi4rIFxiZXRhX3trLTF9eF97ay0xLGl9XSkNCiQkDQpgYGB7cn0NCmRhdCA8LSBjYmluZCgxLDEsIGhyYXQsIG9icmF0LCBsb2FucHJjLCB1bmVtLCBtYWxlLCBtYXJyaWVkLCBkZXAsIHNjaCwgY29zaWduLCBwdWJyZWMsIG1vcnRsYXQxLCBtb3J0bGF0MiwgdnIpDQpkYXQyIDwtIGRhdA0KZGF0MlssMl0gPC0gMA0KDQplcG0gPC0gbWVhbihwbm9ybShjb2xTdW1zKHQoZGF0KSpwcm9iaXQyJGNvZWZmaWNpZW50cykpLXBub3JtKGNvbFN1bXModChkYXQyKSpwcm9iaXQyJGNvZWZmaWNpZW50cykpLG5hLnJtID0gVCkNCmNhdCgiRWZlY3RvIFBhcmNpYWwgTWVkaW86IiwgZXBtKQ0KDQpgYGANCg0KRWwgZWZlY3RvIHBhcmNpYWwgbWVkaW8gZGUgbGEgdmFyaWFibGUgKndoaXRlKiBlcyBkZSAwLjExOTgsIGVzdG8gcXVpZXJlIGRlY2lyIHF1ZSBkZSBtZWRpYSBoYXkgdW4gMTEuOTglIG3DoXMgZGUgcG9zaWJpbGlkYWRlcyBkZSBxdWUgYSB1bmEgcGVyc29uYSBibGFuY2EgbGUgY29uY2VkYW4gc3UgaGlwb3RlY2EgcmVzcGVjdG8gYSB1bmEgcGVyc29uYSBuby1ibGFuY2EuDQoNCjxIUj4qKipFWFRSQSoqKg0KDQpMYSB2YXJpYWJsZSAqd2hpdGUqIGVzIHNpZ25pZmljYXRpdmEgZW4gZWwgbW9kZWxvIGFudGVyaW9yIHBlcm8gZXNlIG1vZGVsbyB0aWVuZSB2YXJpYXMgdmFyaWFibGVzIG5vIHNpZ25pZmljYXRpdmFzIHkgbm8gc2UgaW5jbHV5ZW4gdmFyaWFibGVzIHF1ZSBwdWVkZW4gc2VyIG11eSByZWxldmFudGVzIGEgbGEgaG9yYSBkZSBkZXRlcm1pbmFyIHNpIHNlIGFwcnVlYmEgdW5hIGhpcG90ZWNhIG8gbm8sIHBvciBlamVtcGxvLCBlbCBpbmdyZXNvIGRlIGxhIHBlcnNvbmEsIHBvZGVyIHZlcmlmaWNhciBsYSBpbmZvcm1hY2nDs24gZGVsIHNvbGljaXRhbnRlIG8gcXVlIGVsIGhpc3RvcmlhbCBkZSBjcsOpZGl0byBjdW1wbGEgY29uIGxvcyByZXF1aXNpdG9zLg0KDQpQb3IgZXN0ZSBtb3Rpdm8gaGUgY3JlYWRvIG90cm8gbW9kZWxvIHF1ZSBpbmNsdXllIG90cmFzIHZhcmlhYmxlcyBkZSBsYSBiYXNlIGRlIGRhdG9zIHBhcmEgcG9kZXIgdmVyIHNpIHJlYWxtZW50ZSBoYXkgdW4gcHJvYmxlbWEgZGUgZGlzY3JpbWluYWNpw7NuIGRlIGxvcyBuby1ibGFuY29zLg0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCmFwcGluY1t3aGljaChhcHBpbmM9PTY2NildPC1OQQ0KZ2RsaW5bd2hpY2goZ2RsaW4+MSldPC1OQQ0KYGBgDQpgYGB7cn0NCnByb2JpdDMgPC0gZ2xtKGFwcHJvdmUgfiB3aGl0ZSArIHNlbGYgK3VudmVyICsgZ2RsaW4gKyB1bml0ICsgb2NjICsgYXBwaW5jICsgb2JyYXQgKyBsb2FucHJjICsgdW5lbSArIG1hcnJpZWQgKyBwdWJyZWMgKyB2ciwgZmFtaWx5ID0gYmlub21pYWwobGluaz0icHJvYml0IikpDQpzdW1tYXJ5KHByb2JpdDMpDQpgYGANCg0KRW4gZXN0ZSBtb2RlbG8gcG9kZW1vcyBjb25zaWRlcmFyIHF1ZSB0b2RhcyBsYXMgdmFyaWFibGVzIHNvbiBzaWduaWZpY2F0aXZhcywgKndoaXRlKiBzaWd1ZSBzaWVuZG8gc2lnbmlmaWNhdGl2YSBwZXJvIGVzdGEgdmV6IGNvbiB1biBuaXZlbCBkZSBzaWduaWZpY2FjacOzbiBjb25zaWRlcmFibGVtZW50ZSBtw6FzIGJham8sIHBhc8OzIGRlIDIuMDZlLTA5IGEgMC4wMDA0MjUsIGFkZW3DoXMgZWwgY29lZmljaWVudGUgZXN0aW1hZG8gYWhvcmEgZXMgZGUgMC40MDUgZW4gbHVnYXIgZGUgMC41NzAgbG8gcXVlIG5vcyBpbmRpY2EgcXVlIGVsIGVmZWN0byBlcyBtdWNobyBtZW5vciBxdWUgYW50ZXMsIGVsIGVycm9yIGVzdMOhbmRhciBzb2xvIGF1bWVudG8gdW4gcG9jbyBkZSAwLjA5NSBhIDAuMTE1Lg0KDQpIYXkgcXVlIHRlbmVyIGVuIGN1ZW50YSB0YW1iacOpbiBxdWUgZWwgQUlDIGRlIGVzdGUgbnVldm8gbW9kZWxvIGVzIGRlIDg2OC4xMSwgbXVjaG8gbcOhcyBiYWpvIHF1ZSBsb3MgMTI2Ni41IGRlbCBtb2RlbG8gYW50ZXJpb3IsIGxvIGN1YWwgZXMgbXV5IGJ1ZW5hIHNlw7FhbC4NCg0KTGFzIGNvbmNsdXNpb25lcyBzaWd1ZW4gc2llbmRvIGxhcyBtaXNtYXMgZW4gY3VhbnRvIGEgcXVlIGhheSBkaXNjcmltaW5hY2nDs24gZGUgbG9zIG5vLWJsYW5jb3MsIHNpbiBlbWJhcmdvLCBzaSBlc3RpbWFtb3Mgc3UgZWZlY3RvIHBhcmNpYWwgbWVkaW8gZW4gZXN0ZSBtb2RlbG8gb2J0ZW5lbW9zOg0KDQpgYGB7cn0NCmRhdCA8LSBjYmluZCgxLDEsc2VsZix1bnZlcixnZGxpbix1bml0LG9jYyxhcHBpbmMsb2JyYXQsbG9hbnByYyx1bmVtLG1hcnJpZWQscHVicmVjLHZyKQ0KZGF0MiA8LSBkYXQNCmRhdDJbLDJdIDwtIDANCg0KZXBtMiA8LSBtZWFuKHBub3JtKGNvbFN1bXModChkYXQpKnByb2JpdDMkY29lZmZpY2llbnRzKSktcG5vcm0oY29sU3Vtcyh0KGRhdDIpKnByb2JpdDMkY29lZmZpY2llbnRzKSksbmEucm0gPSBUKQ0KY2F0KCJFZmVjdG8gUGFyY2lhbCBNZWRpbzoiLCBlcG0yKQ0KYGBgDQoNClBvZGVtb3MgdmVyIGNvbW8gYWhvcmEgZWwgZWZlY3RvIHBhcmNpYWwgbWVkaW8gZXMgc29sYW1lbnRlIGRlIDAuMDU0Miwgc2kgYmllbiBzaWd1ZSBoYWJpZW5kbyBkaXNjcmltaW5hY2nDs24gZW4gZXN0ZSBtb2RlbG8gZXMgbXV5IGRpc3RpbnRvIGhhYmxhciBkZSBzb2xvIDUuNDIlIG1heW9yIHByb2JhYmlsaWRhZCBkZSBxdWUgdGUgYXBydWViZW4gdW5hIGhpcG90ZWNhIHNpZW5kbyBibGFuY28gYWwgMTEuOTglIG9idGVuaWRvIGFudGVyaW9ybWVudGUu