2. Ejercicios Regresión Lineal Simple (primera parte)

Ejercicio 2.1 Medidas del cuerpo, Parte II.

Datos publicados en Heinz, Peterson, Johnson, y Kerk {2003}, base de datos bdims del paquete openintro.

  1. Realizar un diagrama de dispersión que muestre la relación entre el peso medido en kilogramos (wgt)y la circunferencia de la cadera medida en centímetros (hip.gi), ponga el peso en el eje vertical. Describa la relación entre la circunferencia de la cadera y el peso.
plot(bdims$hip.gi,bdims$wgt, col = colores)

Es una relación lineal, positiva y fuerte

  1. ¿Cómo cambiaría la relación si el peso se midiera en libras mientras que las unidades para la circunferencia de la cadera permanecieran en centímetros? no cambia.

  2. Ajuste un modelo lineal para explicar el peso por la circunferencia de cadera, con las variables en las unidades originales. Escriba el modelo. Luego, escriba el modelo ajustado. Interprete la pendiente estimada en términos del problema. Su respuesta debería contener una frase que comience así: “Si una persona aumenta un cm. de contorno de cadera, en promedio su peso aumentará … kilogramos”.

lm.ajustado <- lm(wgt~hip.gi,data = bdims)
summary(lm.ajustado)

Call:
lm(formula = wgt ~ hip.gi, data = bdims)

Residuals:
    Min      1Q  Median      3Q     Max 
-19.449  -7.111  -0.367   7.264  22.353 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -78.21054    5.56902  -14.04   <2e-16 ***
hip.gi        1.52417    0.05747   26.52   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 8.636 on 505 degrees of freedom
Multiple R-squared:  0.5821,    Adjusted R-squared:  0.5813 
F-statistic: 703.5 on 1 and 505 DF,  p-value: < 2.2e-16

\[ E(wgt/hip.gi)= \beta_0 + \beta_1 .hip.gi +\epsilon \] \[ E(wgt/hip.gi)= -78.21 + 1.52 .hip.gi \]

“Si una persona aumenta un cm. de contorno de cadera, en promedio su peso aumentará 1.52417 kilogramos”.

  1. Superponga la recta ajustada al scatterplot. Observe el gráfco. ¿Diría que la recta describe bien la relación entre ambas variables?
plot(bdims$hip.gi,bdims$wgt)
abline(lm.ajustado, col = "red")

Describe bien

  1. Elegimos una persona adulta físicamente activa entre los estudiantes de primer año de la facultad. Su contorno de cadera mide 100 cm. Prediga su peso en kilogramos.
alumno <- data.frame(hip.gi =  100, wgt=NA)
predict(lm.ajustado,newdata = alumno)
       1 
74.20646 
  1. Esa persona elegida al azar pesa 81kg. Calcule el residuo.
(predict(lm.ajustado,newdata = alumno) -81)^2
       1 
46.15224 
  1. Estime el peso esperado para la población de adultos cuyo contorno de cadera mide 100 cm. El del punto E

Ejercicio 2.2 Medidas del cuerpo, Parte III. Base de datos bdims del paquete openintro.

  1. Realizar un diagrama de dispersión que muestre la relación entre el peso medido en kilogramos {wgt)y la altura hgt).
plot(bdims$hgt, bdims$wgt)

  1. Ajuste un modelo lineal para explicar el peso por la altura. Escriba el modelo . Luego, escriba el modelo ajustado. interprete la pendiente estimada en términos del problema. Interprete la pendiente. ¿Es razonable el signo obtenido para la pendiente estimada? Superponer al scatterplot anterior la recta estimada.
lm.ajustado <- lm(wgt~hgt,data = bdims)
summary(lm.ajustado)

Call:
lm(formula = wgt ~ hgt, data = bdims)

Residuals:
    Min      1Q  Median      3Q     Max 
-18.743  -6.402  -1.231   5.059  41.103 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -105.01125    7.53941  -13.93   <2e-16 ***
hgt            1.01762    0.04399   23.14   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 9.308 on 505 degrees of freedom
Multiple R-squared:  0.5145,    Adjusted R-squared:  0.5136 
F-statistic: 535.2 on 1 and 505 DF,  p-value: < 2.2e-16

\[ E(wgt/hip.gi)= \beta_0 + \beta_1 .hgt +\epsilon \] \[ E(wgt/hip.gi)= -105.01 + 1.02 . hgt \]

Es razonable. Si una persona aumenta un cm. de altura, en promedio su peso aumentará 1.02 kilogramos“.

plot(bdims$hgt, bdims$wgt)
abline(lm.ajustado, col = "red")

  1. La persona elegida en el ejercicio anterior, medía 187 cm. de alto, y pesaba 81 kg. Prediga su peso con el modelo que tiene a la altura como covariable. Calcule el residuo de dicha observación.
alumno$hgt <- 187
predict(lm.ajustado,newdata = alumno)
       1 
85.28308 
(predict(lm.ajustado,newdata = alumno) -81)^2
      1 
18.3448 

Ejercicio 2.3 Mamíferos, Parte III. Base de datos mammals del paquete openintro.

Ajuste un modelo lineal para explicar a log10 (BrainWt) en función del log10 (BodyWt) : Como antes, escriba el modelo teórico y el ajustado.

library(openintro, warn.conflicts = FALSE)
lm_fitted <- lm(log10(mammals$BrainWt) ~ log10(mammals$BodyWt))
summary(lm_fitted)

Call:
lm(formula = log10(mammals$BrainWt) ~ log10(mammals$BodyWt))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.74503 -0.21380 -0.02676  0.18934  0.84613 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)            0.92713    0.04171   22.23   <2e-16 ***
log10(mammals$BodyWt)  0.75169    0.02846   26.41   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3015 on 60 degrees of freedom
Multiple R-squared:  0.9208,    Adjusted R-squared:  0.9195 
F-statistic: 697.4 on 1 and 60 DF,  p-value: < 2.2e-16

modelo teórico:

\[ \log_{10}BrainWt = \beta_0 + \beta_1*\log_{10}BrainWt + \epsilon \] Modelo ajustado

\[ \widehat{\log_{10}BrainWt} = 0.92713 + 0.75169*\log_{10}BrainWt \]

  1. Repita el scatterplot de las variables transformadas y superpóngale la recta ajustada.
plot(log10(mammals$BrainWt) ~ log10(mammals$BodyWt))
abline(lm_fitted) 

c)La observación 45 corresponde a un chancho. Prediga el peso del cerebro del chancho con el modelo ajustado, sabiendo que pesa 192 kilos.

10^(predict(lm_fitted)[45])
      45 
439.9997 
plot(log10(mammals$BrainWt) ~ log10(mammals$BodyWt))
abline(lm_fitted) 
points(x= log10(mammals$BodyWt)[45],y= log10(mammals$BrainWt)[45], col= "violet",  pch = 19)

  1. La observación 34 corresponde a un ser humano. Prediga el peso del cerebro de un ser humano con el modelo ajustado, sabiendo que pesa 62 kilos.
10^(predict(lm_fitted)[34])
      34 
188.1233 
plot(log10(mammals$BrainWt) ~ log10(mammals$BodyWt))
abline(lm_fitted) 
points(x= log10(mammals$BodyWt)[45],y= log10(mammals$BrainWt)[45], col= "violet",  pch = 19)
points(x= log10(mammals$BodyWt)[34],y= log10(mammals$BrainWt)[34], col= "red",  pch = 19)

Otras opciones para graficar

#devtools::install_github('hadley/ggplot2')
library(ggplot2)
library(ggrepel)
ggplot(mammals, aes(log10(BodyWt), log10(BrainWt), label = Species))+
  geom_text_repel()+
  geom_smooth(method = "lm", alpha = 0.5)

library(plotly)
graf <- ggplot(mammals, aes(log10(BodyWt), log10(BrainWt), label =Species ))+
  geom_point()+
  geom_smooth(method = "lm", alpha = 0.5)
ggplotly(graf, tooltip = c("label"))
LS0tCnRpdGxlOiAiRWplcmNpY2lvcyBtb2RlbG8gbGluZWFsLiBJSSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKLS0tCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkob3BlbmludHJvLHdhcm4uY29uZmxpY3RzID0gRkFMU0UpCgpjb2xvcmVzIDwtIGJkaW1zJHNleApjb2xvcmVzIDwtIGlmZWxzZShjb2xvcmVzID09IDEsImJsdWUiLCAicmVkIikKYGBgCgoKIyAyLiBFamVyY2ljaW9zIFJlZ3Jlc2nDs24gTGluZWFsIFNpbXBsZSAocHJpbWVyYSBwYXJ0ZSkKICAgCiMjIyBFamVyY2ljaW8gMi4xIE1lZGlkYXMgZGVsIGN1ZXJwbywgUGFydGUgSUkuIApEYXRvcyBwdWJsaWNhZG9zIGVuIEhlaW56LCBQZXRlcnNvbiwgSm9obnNvbiwgeSBLZXJrIHsyMDAzfSwgYmFzZSBkZSBkYXRvcyBiZGltcyBkZWwgcGFxdWV0ZSBvcGVuaW50cm8uCgphKSBSZWFsaXphciB1biBkaWFncmFtYSBkZSBkaXNwZXJzacOzbiBxdWUgbXVlc3RyZSBsYSByZWxhY2nDs24gZW50cmUgZWwgcGVzbyBtZWRpZG8gZW4ga2lsb2dyYW1vcyAod2d0KXkgbGEgY2lyY3VuZmVyZW5jaWEgZGUgbGEgY2FkZXJhIG1lZGlkYSBlbiBjZW50w61tZXRyb3MgKGhpcC5naSksIHBvbmdhIGVsIHBlc28gZW4gZWwgZWplIHZlcnRpY2FsLiBEZXNjcmliYSBsYSByZWxhY2nDs24gZW50cmUgbGEgY2lyY3VuZmVyZW5jaWEgZGUgbGEgY2FkZXJhIHkgZWwgcGVzby4KCmBgYHtyfQpwbG90KGJkaW1zJGhpcC5naSxiZGltcyR3Z3QsIGNvbCA9IGNvbG9yZXMpCmBgYApFcyB1bmEgcmVsYWNpw7NuIGxpbmVhbCwgcG9zaXRpdmEgeSBmdWVydGUKCgpiKSDCv0PDs21vIGNhbWJpYXLDrWEgbGEgcmVsYWNpw7NuIHNpIGVsIHBlc28gc2UgbWlkaWVyYSBlbiBsaWJyYXMgbWllbnRyYXMgcXVlIGxhcyB1bmlkYWRlcyBwYXJhIGxhIGNpcmN1bmZlcmVuY2lhIGRlIGxhIGNhZGVyYSBwZXJtYW5lY2llcmFuIGVuIGNlbnTDrW1ldHJvcz8KX19ubyBjYW1iaWEuX18KCmMpIEFqdXN0ZSB1biBtb2RlbG8gbGluZWFsIHBhcmEgZXhwbGljYXIgZWwgcGVzbyBwb3IgbGEgY2lyY3VuZmVyZW5jaWEgZGUgY2FkZXJhLCBjb24gbGFzIHZhcmlhYmxlcyBlbiBsYXMgdW5pZGFkZXMgb3JpZ2luYWxlcy4gRXNjcmliYSBlbCBtb2RlbG8uIEx1ZWdvLCBlc2NyaWJhIGVsIG1vZGVsbyBhanVzdGFkby4gSW50ZXJwcmV0ZSBsYSBwZW5kaWVudGUgZXN0aW1hZGEgZW4gdMOpcm1pbm9zIGRlbCBwcm9ibGVtYS4gU3UgcmVzcHVlc3RhIGRlYmVyw61hIGNvbnRlbmVyIHVuYSBmcmFzZSBxdWUgY29taWVuY2UgYXPDrTogIlNpIHVuYSBwZXJzb25hIGF1bWVudGEgdW4gY20uIGRlIGNvbnRvcm5vIGRlIGNhZGVyYSwgZW4gcHJvbWVkaW8gc3UgcGVzbyBhdW1lbnRhcsOhIC4uLiBraWxvZ3JhbW9zIi4KCmBgYHtyfQpsbS5hanVzdGFkbyA8LSBsbSh3Z3R+aGlwLmdpLGRhdGEgPSBiZGltcykKc3VtbWFyeShsbS5hanVzdGFkbykKCmBgYAoKJCQKRSh3Z3QvaGlwLmdpKT0gXGJldGFfMCArIFxiZXRhXzEgLmhpcC5naSArXGVwc2lsb24KJCQKJCQKRSh3Z3QvaGlwLmdpKT0gLTc4LjIxICsgMS41MiAuaGlwLmdpCiQkCgoiU2kgdW5hIHBlcnNvbmEgYXVtZW50YSB1biBjbS4gZGUgY29udG9ybm8gZGUgY2FkZXJhLCBlbiBwcm9tZWRpbyBzdSBwZXNvIGF1bWVudGFyw6EgMS41MjQxNyBraWxvZ3JhbW9zIi4KCmQpIFN1cGVycG9uZ2EgbGEgcmVjdGEgYWp1c3RhZGEgYWwgc2NhdHRlcnBsb3QuIE9ic2VydmUgZWwgZ3LDoWZjby4gwr9EaXLDrWEgcXVlIGxhIHJlY3RhIGRlc2NyaWJlIGJpZW4gbGEgcmVsYWNpw7NuIGVudHJlIGFtYmFzIHZhcmlhYmxlcz8KCmBgYHtyfQpwbG90KGJkaW1zJGhpcC5naSxiZGltcyR3Z3QpCmFibGluZShsbS5hanVzdGFkbywgY29sID0gInJlZCIpCgpgYGAKCkRlc2NyaWJlIGJpZW4KCmUpIEVsZWdpbW9zIHVuYSBwZXJzb25hIGFkdWx0YSBmw61zaWNhbWVudGUgYWN0aXZhIGVudHJlIGxvcyBlc3R1ZGlhbnRlcyBkZSBwcmltZXIgYcOxbyBkZSBsYSBmYWN1bHRhZC4gU3UgY29udG9ybm8gZGUgY2FkZXJhIG1pZGUgMTAwIGNtLiBQcmVkaWdhIHN1IHBlc28gZW4ga2lsb2dyYW1vcy4KCgpgYGB7cn0KYWx1bW5vIDwtIGRhdGEuZnJhbWUoaGlwLmdpID0gIDEwMCwgd2d0PU5BKQpwcmVkaWN0KGxtLmFqdXN0YWRvLG5ld2RhdGEgPSBhbHVtbm8pCgpgYGAKCmYpIEVzYSBwZXJzb25hIGVsZWdpZGEgYWwgYXphciBwZXNhIDgxa2cuIENhbGN1bGUgZWwgcmVzaWR1by4KCmBgYHtyfQoocHJlZGljdChsbS5hanVzdGFkbyxuZXdkYXRhID0gYWx1bW5vKSAtODEpXjIKCmBgYAoKCmcpIEVzdGltZSBlbCBwZXNvIGVzcGVyYWRvIHBhcmEgbGEgcG9ibGFjacOzbiBkZSBhZHVsdG9zIGN1eW8gY29udG9ybm8gZGUgY2FkZXJhIG1pZGUgMTAwIGNtLiBfX0VsIGRlbCBwdW50byBFX18KCiMjIyBFamVyY2ljaW8gMi4yIE1lZGlkYXMgZGVsIGN1ZXJwbywgUGFydGUgSUlJLiBCYXNlIGRlIGRhdG9zIGJkaW1zIGRlbCBwYXF1ZXRlIG9wZW5pbnRyby4KCmEpIFJlYWxpemFyIHVuIGRpYWdyYW1hIGRlIGRpc3BlcnNpw7NuIHF1ZSBtdWVzdHJlIGxhIHJlbGFjacOzbiBlbnRyZSBlbCBwZXNvIG1lZGlkbyBlbiBraWxvZ3JhbW9zIHt3Z3QpeSBsYSBhbHR1cmEgaGd0KS4KCmBgYHtyfQpwbG90KGJkaW1zJGhndCwgYmRpbXMkd2d0KQpgYGAKCgpiKSBBanVzdGUgdW4gbW9kZWxvIGxpbmVhbCBwYXJhIGV4cGxpY2FyIGVsIHBlc28gcG9yIGxhIGFsdHVyYS4gRXNjcmliYSBlbCBtb2RlbG8gLiBMdWVnbywgZXNjcmliYSBlbCBtb2RlbG8gYWp1c3RhZG8uIGludGVycHJldGUgbGEgcGVuZGllbnRlIGVzdGltYWRhIGVuIHTDqXJtaW5vcyBkZWwgcHJvYmxlbWEuIEludGVycHJldGUgbGEgcGVuZGllbnRlLiDCv0VzIHJhem9uYWJsZSBlbCBzaWdubyBvYnRlbmlkbyBwYXJhIGxhIHBlbmRpZW50ZSBlc3RpbWFkYT8gU3VwZXJwb25lciBhbCBzY2F0dGVycGxvdCBhbnRlcmlvciBsYSByZWN0YSBlc3RpbWFkYS4KCmBgYHtyfQpsbS5hanVzdGFkbyA8LSBsbSh3Z3R+aGd0LGRhdGEgPSBiZGltcykKc3VtbWFyeShsbS5hanVzdGFkbykKCmBgYAokJApFKHdndC9oaXAuZ2kpPSBcYmV0YV8wICsgXGJldGFfMSAuaGd0ICtcZXBzaWxvbgokJAokJApFKHdndC9oaXAuZ2kpPSAtMTA1LjAxICsgMS4wMiAgLiBoZ3QKJCQKCkVzIHJhem9uYWJsZS4gU2kgdW5hIHBlcnNvbmEgYXVtZW50YSB1biBjbS4gZGUgYWx0dXJhLCBlbiBwcm9tZWRpbyBzdSBwZXNvIGF1bWVudGFyw6EgMS4wMiBraWxvZ3JhbW9zIi4KCgpgYGB7cn0KcGxvdChiZGltcyRoZ3QsIGJkaW1zJHdndCkKYWJsaW5lKGxtLmFqdXN0YWRvLCBjb2wgPSAicmVkIikKYGBgCgoKYykgTGEgcGVyc29uYSBlbGVnaWRhIGVuIGVsIGVqZXJjaWNpbyBhbnRlcmlvciwgbWVkw61hIDE4NyBjbS4gZGUgYWx0bywgeSBwZXNhYmEgODEga2cuIFByZWRpZ2Egc3UgcGVzbyBjb24gZWwgbW9kZWxvIHF1ZSB0aWVuZSBhIGxhIGFsdHVyYSBjb21vIGNvdmFyaWFibGUuIENhbGN1bGUgZWwgcmVzaWR1byBkZSBkaWNoYSBvYnNlcnZhY2nDs24uCgpgYGB7cn0KYWx1bW5vJGhndCA8LSAxODcKcHJlZGljdChsbS5hanVzdGFkbyxuZXdkYXRhID0gYWx1bW5vKQoocHJlZGljdChsbS5hanVzdGFkbyxuZXdkYXRhID0gYWx1bW5vKSAtODEpXjIKCgpgYGAKCgojIyMgRWplcmNpY2lvIDIuMyBNYW3DrWZlcm9zLCBQYXJ0ZSBJSUkuIEJhc2UgZGUgZGF0b3MgbWFtbWFscyBkZWwgcGFxdWV0ZSBvcGVuaW50cm8uCkFqdXN0ZSB1biBtb2RlbG8gbGluZWFsIHBhcmEgZXhwbGljYXIgYSBsb2cxMCAoQnJhaW5XdCkgZW4gZnVuY2nDs24gZGVsIGxvZzEwIChCb2R5V3QpIDogQ29tbyBhbnRlcywgZXNjcmliYSBlbCBtb2RlbG8gdGXDs3JpY28geSBlbCBhanVzdGFkby4KCmBgYHtyfQpsaWJyYXJ5KG9wZW5pbnRybywgd2Fybi5jb25mbGljdHMgPSBGQUxTRSkKbG1fZml0dGVkIDwtIGxtKGxvZzEwKG1hbW1hbHMkQnJhaW5XdCkgfiBsb2cxMChtYW1tYWxzJEJvZHlXdCkpCnN1bW1hcnkobG1fZml0dGVkKQpgYGAKCm1vZGVsbyB0ZcOzcmljbzoKCiQkClxsb2dfezEwfUJyYWluV3QgPSBcYmV0YV8wICsgXGJldGFfMSpcbG9nX3sxMH1CcmFpbld0ICsgXGVwc2lsb24KJCQKTW9kZWxvIGFqdXN0YWRvCgokJApcd2lkZWhhdHtcbG9nX3sxMH1CcmFpbld0fSA9IDAuOTI3MTMgKyAwLjc1MTY5Klxsb2dfezEwfUJyYWluV3QKJCQKCgpiKSBSZXBpdGEgZWwgc2NhdHRlcnBsb3QgZGUgbGFzIHZhcmlhYmxlcyB0cmFuc2Zvcm1hZGFzIHkgc3VwZXJww7NuZ2FsZSBsYSByZWN0YSBhanVzdGFkYS4KCgpgYGB7cn0KcGxvdChsb2cxMChtYW1tYWxzJEJyYWluV3QpIH4gbG9nMTAobWFtbWFscyRCb2R5V3QpKQphYmxpbmUobG1fZml0dGVkKSAKYGBgCgpjKUxhIG9ic2VydmFjacOzbiA0NSBjb3JyZXNwb25kZSBhIHVuIGNoYW5jaG8uIFByZWRpZ2EgZWwgcGVzbyBkZWwgY2VyZWJybyBkZWwgY2hhbmNobyBjb24gZWwgbW9kZWxvIGFqdXN0YWRvLCBzYWJpZW5kbyBxdWUgcGVzYSAxOTIga2lsb3MuCgpgYGB7cn0KMTBeKHByZWRpY3QobG1fZml0dGVkKVs0NV0pCgpwbG90KGxvZzEwKG1hbW1hbHMkQnJhaW5XdCkgfiBsb2cxMChtYW1tYWxzJEJvZHlXdCkpCmFibGluZShsbV9maXR0ZWQpIApwb2ludHMoeD0gbG9nMTAobWFtbWFscyRCb2R5V3QpWzQ1XSx5PSBsb2cxMChtYW1tYWxzJEJyYWluV3QpWzQ1XSwgY29sPSAidmlvbGV0IiwgIHBjaCA9IDE5KQpgYGAKCgpkKSBMYSBvYnNlcnZhY2nDs24gMzQgY29ycmVzcG9uZGUgYSB1biBzZXIgaHVtYW5vLiBQcmVkaWdhIGVsIHBlc28gZGVsIGNlcmVicm8gZGUgdW4gc2VyIGh1bWFubyBjb24gZWwgbW9kZWxvIGFqdXN0YWRvLCBzYWJpZW5kbyBxdWUgcGVzYSA2MiBraWxvcy4KCmBgYHtyfQoKMTBeKHByZWRpY3QobG1fZml0dGVkKVszNF0pCgpwbG90KGxvZzEwKG1hbW1hbHMkQnJhaW5XdCkgfiBsb2cxMChtYW1tYWxzJEJvZHlXdCkpCmFibGluZShsbV9maXR0ZWQpIApwb2ludHMoeD0gbG9nMTAobWFtbWFscyRCb2R5V3QpWzQ1XSx5PSBsb2cxMChtYW1tYWxzJEJyYWluV3QpWzQ1XSwgY29sPSAidmlvbGV0IiwgIHBjaCA9IDE5KQpwb2ludHMoeD0gbG9nMTAobWFtbWFscyRCb2R5V3QpWzM0XSx5PSBsb2cxMChtYW1tYWxzJEJyYWluV3QpWzM0XSwgY29sPSAicmVkIiwgIHBjaCA9IDE5KQpgYGAKICAKT3RyYXMgb3BjaW9uZXMgcGFyYSBncmFmaWNhcgoKYGBge3J9CgojZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCdoYWRsZXkvZ2dwbG90MicpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3JlcGVsKQoKZ2dwbG90KG1hbW1hbHMsIGFlcyhsb2cxMChCb2R5V3QpLCBsb2cxMChCcmFpbld0KSwgbGFiZWwgPSBTcGVjaWVzKSkrCiAgZ2VvbV90ZXh0X3JlcGVsKCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWxwaGEgPSAwLjUpCmBgYAoKYGBge3J9CmxpYnJhcnkocGxvdGx5KQoKZ3JhZiA8LSBnZ3Bsb3QobWFtbWFscywgYWVzKGxvZzEwKEJvZHlXdCksIGxvZzEwKEJyYWluV3QpLCBsYWJlbCA9U3BlY2llcyApKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWxwaGEgPSAwLjUpCgpnZ3Bsb3RseShncmFmLCB0b29sdGlwID0gYygibGFiZWwiKSkKYGBgCgogIAo=