EJERCICIO 1
Con los datos del archivo SONIC.csv:
dat1 = import ("Lab-3_files/SONIC(1).csv")
dat2= dat1 %>%
select(where(is.numeric) & !ends_with(c('_c','_z')))
dat2 %>% head() %>% flextable()
Densidad | Velocidad_P | Tipi_Roca |
2.59 | 5.38 | 1 |
2.62 | 5.38 | 1 |
2.61 | 5.43 | 1 |
2.63 | 5.44 | 1 |
2.64 | 5.41 | 1 |
2.63 | 5.50 | 1 |
Regresión Lineal
a.Realice una regresión lineal de Velocidad (km/s) con respecto a
Densidad (g/cm3 ) (Velocidad~Densidad),
mod1 = lm(Velocidad_P~Densidad, data= dat1) # modelo de regresión lineal
mod1 %>% tidy()
Regresión
Cuadrática
- Realice una regresión cuadrática de Velocidad con respecto a
Densidad
mod2 = lm(Velocidad_P ~ Densidad + I(Densidad^2), data = dat1) # modelo de regresión cuadrática
mod2 %>% tidy()
Gráfico regresión
lineal y cuadrática
- Muestre ambas regresiones en un mismo gráfico
ggplot(dat1, aes(Densidad,Velocidad_P)) + geom_point() + geom_smooth(method = 'lm', aes(col='Lineal')) + geom_smooth(method = 'lm', aes(col='Cuadratico'), formula = y~poly(x, 2)) + scale_color_brewer('Modelo',palette = 'Dark2')
`geom_smooth()` using formula 'y ~ x'

Correlación
- Estime la correlación utilizando la relación con la pendiente de la
regresión lineal, y de la manera convencional (directamente entre las
variables). Obtiene el mismo resultado?
x = dat1$Velocidad_P
y = dat1$Densidad
cor(x,y,method = "pearson",
use = 'pairwise.complete.obs') # coeficiente de correlacion de Pearson
[1] 0.939
cov(x,y,use = 'pairwise.complete.obs') # covarianza
[1] 0.174
Relación entre correlación y regresión simple Estandarizando el
modelo con variables originales
lm(Velocidad_P ~ Densidad, data = dat1) %>%
standardize_parameters(method = 'refit') %>%
flextable() %>%
colformat_double()
Parameter | Std_Coefficient | CI | CI_low | CI_high |
(Intercept) | -0.000 | 0.950 | -0.036 | 0.036 |
Densidad | 0.939 | 0.950 | 0.903 | 0.975 |
map_dbl(dat1,sd) # desviacion estandar de cada columna
Densidad Velocidad_P Tipi_Roca
0.226 0.819 2.468
(3.39*0.226/0.819) # Coeficiente de correlación = Pendiente* Desv.est.Densidad/ Desv.est. Velocidad
[1] 0.935
Mejor ajuste
Comparando ambos modelos, cuál considera se ajusta mejor a los datos
y por qué? (Recuerde que puede usar medidas de ajuste y gráficos
diagnóstico)
R/ El modelo lineal tiene un error cuadrático medio de 0.08 el cual
es menor que el del modelo cuadrático que es 0.26. Con respecto al R2 el
modelo lineal tiene un valor de 0.881 mientras que el modelo cuadrático
tiene un valor de 0.900. Según la puntuación de rendimiento (Performance
score) el modelo lineal tiene un 66,67% y el modelo cuadrático un
33,33%. Por lo tanto el modelo lineal se ajusta más a los datos.
Gráficos
diagnóstico lineal
# plot(mod1)
check_model(mod1,panel=F)
$PP_CHECK
$NCV
$HOMOGENEITY
$OUTLIERS
$QQ





Gráficos
diagnóstico cuadrática
# plot(mod2)
check_model(mod2,panel=F)
$PP_CHECK
$NCV
$HOMOGENEITY
$OUTLIERS
$VIF
$QQ






Comparación de
modelos
TMod(mod1,mod2) # DescTools
modelsummary(list(Lineal=mod1,Cuadratico=mod2),
title = 'Comparasion de modelos',
statistic = NULL, # 'conf.int',
coef_omit = NULL, # 'Int'
gof_omit = '^(?!R|Num|A)',
stars = F,
fmt = 4)
Comparasion de modelos
| |
Lineal |
Cuadratico |
| (Intercept) |
1.2403 |
18.9099 |
| Velocidad_P |
0.2596 |
|
| Densidad |
|
−11.7417 |
| I(Densidad^2) |
|
2.5487 |
| Num.Obs. |
357 |
357 |
| R2 |
0.881 |
0.900 |
| R2 Adj. |
0.881 |
0.900 |
| AIC |
−802.3 |
53.7 |
| RMSE |
0.08 |
0.26 |
sjPlot::tab_model(mod1,mod2,
title = 'Comparasion de modelos',
show.std = NULL, # 'std', NULL
show.intercept = T,
show.ci = F, # .95
collapse.ci = F,
ci.hyphen = ', ',
show.stat = F,
show.p = F,
show.aic = T,
dv.labels = c('Lineal','Cuadrático'),
digits = 4,
file = 'sjplot_models_lab3.doc')
comp.mods = compare_performance(mod1,mod2,rank = T) # performance
comp.mods
# Comparison of Model Performance Indices
Name | Model | R2 | R2 (adj.) | RMSE | Sigma | AIC weights | BIC weights | Performance-Score
------------------------------------------------------------------------------------------------
mod1 | lm | 0.881 | 0.881 | 0.078 | 0.078 | 1.00 | 1.00 | 66.67%
mod2 | lm | 0.900 | 0.900 | 0.258 | 0.259 | < 0.001 | < 0.001 | 33.33%

EJERCICIO 2
Se tienen 3 grupos de conglomerados, y para cada uno se separan los
clastos en mayor o menor a 5 cm. En el conglomerado I hay 20 clastos
menores a 5 cm y 16 clastos mayores a 5 cm. En el conglomerado II hay 31
clastos menores a 5 cm y 25 clastos mayores a 5 cm. En el conglomerado
III hay 12 clastos menores a 5 cm y 8 clastos mayores a 5 cm.
- Cuál es la probabilidad de seleccionar un clasto menor a 5 cm?
R/ De la tabla 1 se obtiene que es 56%/100 = 0.56
- Cuál es la probabilidad de seleccionar un clasto mayor a 5 cm,
sabiendo que proviene del conglomerado III?
R/ De la tabla 2 se obtiene que es 40%/100 = 0.40
- Cuál es la probabilidad de seleccionar un clasto del conglomerado I,
sabiendo que es mayor a 5 cm?
R/ De la tabla 3 se obtiene que es 33%/100 = 0.33
- Cuál es la probabilidad de seleccionar un clasto del conglomerado
II?
R/ De la tabla 1 se obtiene que es 50%/100 = 0.50
A = matrix(data = c(16,20,25,31,8,12),nrow = 2,
dimnames = list(Clasto=c('Mayor a 5','Menor a 5'),
Conglomerado=c('I','II','III')))
A.tb = Untable(A) %>% tibble()
tbl_cross(A.tb, percent = 'cell')
| Característica |
Conglomerado
|
Total |
| I |
II |
III |
| Clasto |
|
|
|
|
| Mayor a 5 |
16 (14%) |
25 (22%) |
8 (7.1%) |
49 (44%) |
| Menor a 5 |
20 (18%) |
31 (28%) |
12 (11%) |
63 (56%) |
| Total |
36 (32%) |
56 (50%) |
20 (18%) |
112 (100%) |
tbl_cross(A.tb, percent = 'column')
| Característica |
Conglomerado
|
Total |
| I |
II |
III |
| Clasto |
|
|
|
|
| Mayor a 5 |
16 (44%) |
25 (45%) |
8 (40%) |
49 (44%) |
| Menor a 5 |
20 (56%) |
31 (55%) |
12 (60%) |
63 (56%) |
| Total |
36 (100%) |
56 (100%) |
20 (100%) |
112 (100%) |
tbl_cross(A.tb, percent = 'row')
| Característica |
Conglomerado
|
Total |
| I |
II |
III |
| Clasto |
|
|
|
|
| Mayor a 5 |
16 (33%) |
25 (51%) |
8 (16%) |
49 (100%) |
| Menor a 5 |
20 (32%) |
31 (49%) |
12 (19%) |
63 (100%) |
| Total |
36 (32%) |
56 (50%) |
20 (18%) |
112 (100%) |
PARTE A MANO
knitr::include_graphics("Lab3_files/Parte a mano lab3.jpeg")

LS0tCnRpdGxlOiAiTGFiIDM6IEVzdGFkaXN0aWNhIERlc2NyaXB0aXZhIDIiCmF1dGhvcjogIkpvc8OpIEzDs3BleiBDaGFjw7NuIEExMTk3OCIKb3V0cHV0OgogIHdvcmRfZG9jdW1lbnQ6CiAgICBkZl9wcmludDoga2FibGUKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0b2M6IHllcwogIHBkZl9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBrYWJsZQogICAga2VlcF90ZXg6IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvYzogeWVzCiAgaHRtbF9ub3RlYm9vazoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgaGlnaGxpZ2h0OiBweWdtZW50cwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiBmbGF0bHkKICAgIHRvYzogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZQogICAga2VlcF9tZDogeWVzCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6IHNwYWNlbGFiCiAgICB0b2M6IHllcwphbHdheXNfYWxsb3dfaHRtbDogeWVzCi0tLQoKCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgd2FybmluZz1GLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZ3RzdW1tYXJ5KQpsaWJyYXJ5KGZsZXh0YWJsZSkKbGlicmFyeShEZXNjVG9vbHMpCmxpYnJhcnkoamFuaXRvcikKbGlicmFyeShoaWdoY2hhcnRlcikKbGlicmFyeShtb2RlbHN1bW1hcnkpCmxpYnJhcnkodGlkeW1vZGVscykKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmlvKQpsaWJyYXJ5KGVhc3lzdGF0cykKCnRoZW1lX3NldCh0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEyKSkKCmZvcm1hdG8uc2FsaWRhID0gY2FzZV93aGVuKAogIGtuaXRyOjppc19odG1sX291dHB1dCgpIH4gJ2h0bWwnLAogIGtuaXRyOjppc19sYXRleF9vdXRwdXQoKSB+ICdsYXRleCcsCiAgVCAgfiAnc2ltcGxlJywKKQoKb3B0aW9ucygKICBrbml0ci50YWJsZS5mb3JtYXQgPSBmb3JtYXRvLnNhbGlkYSwKICBtb2RlbHN1bW1hcnlfZ2V0ID0gJ2FsbCcKICAjIE91dERlYyA9ICcsJwogICwgZGlnaXRzID0gMwogICkKCnNldF9mbGV4dGFibGVfZGVmYXVsdHMoCiAgIyBkZWNpbWFsLm1hcmsgPSAnLCcsCiAgIyBiaWcubWFyayA9ICcuJywKICBkaWdpdHMgPSAzCikKCnRoZW1lX2d0c3VtbWFyeV9sYW5ndWFnZSgKICBsYW5ndWFnZSA9ICJlcyIsCiAgIyBkZWNpbWFsLm1hcmsgPSAnLCcsCiAgIyBiaWcubWFyayA9ICcuJywKICBpcXIuc2VwID0gTlVMTCwKICBjaS5zZXAgPSBOVUxMCikKCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0gVFJVRSwKICBtZXNzYWdlID0gRkFMU0UsCiAgd2FybmluZyA9IEZBTFNFLAogIGVycm9yID0gRkFMU0UsCiAgIyBmaWcucGF0aCA9ICJmaWdzLyIsCiAgZmlnLnJldGluYSA9IDMsCiAgZmlnLndpZHRoID0gOCwKICBmaWcuYXNwID0gMC42MTgsCiAgIyBmaWcuYWxpZ24gPSAiY2VudGVyIiwKICBvdXQud2lkdGggPSAiOTAlIgopCmBgYAoKIyBFSkVSQ0lDSU8gMQpDb24gbG9zIGRhdG9zIGRlbCBhcmNoaXZvIFNPTklDLmNzdjoKYGBge3IgZGF0b3N9CmRhdDEgPSBpbXBvcnQgKCJMYWItM19maWxlcy9TT05JQygxKS5jc3YiKQoKYGBgCmBgYHtyIGRhdG9zLW51bX0KZGF0Mj0gZGF0MSAlPiUgCiAgc2VsZWN0KHdoZXJlKGlzLm51bWVyaWMpICYgIWVuZHNfd2l0aChjKCdfYycsJ196JykpKQoKZGF0MiAlPiUgaGVhZCgpICU+JSBmbGV4dGFibGUoKQpgYGAKCgojIyBSZWdyZXNpw7NuIExpbmVhbAphLlJlYWxpY2UgdW5hIHJlZ3Jlc2nDs24gbGluZWFsIGRlIFZlbG9jaWRhZCAoa20vcykgY29uIHJlc3BlY3RvIGEgRGVuc2lkYWQgKGcvY20zICkgKFZlbG9jaWRhZH5EZW5zaWRhZCksCmBgYHtyIG1vZC1saW59Cgptb2QxID0gbG0oVmVsb2NpZGFkX1B+RGVuc2lkYWQsIGRhdGE9IGRhdDEpICMgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsCm1vZDEgJT4lIHRpZHkoKQptb2QxJT4lIGdsYW5jZSgpCmBgYAoKIyMgUmVncmVzacOzbiBDdWFkcsOhdGljYQpiLiBSZWFsaWNlIHVuYSByZWdyZXNpw7NuIGN1YWRyw6F0aWNhIGRlIFZlbG9jaWRhZCBjb24gcmVzcGVjdG8gYSBEZW5zaWRhZApgYGB7cn0KbW9kMiA9IGxtKFZlbG9jaWRhZF9QIH4gRGVuc2lkYWQgKyBJKERlbnNpZGFkXjIpLCBkYXRhID0gZGF0MSkgIyBtb2RlbG8gZGUgcmVncmVzacOzbiBjdWFkcsOhdGljYQptb2QyICU+JSB0aWR5KCkKbW9kMiAlPiUgZ2xhbmNlKCkKYGBgCgojIyBHcsOhZmljbyByZWdyZXNpw7NuIGxpbmVhbCB5IGN1YWRyw6F0aWNhCmMuIE11ZXN0cmUgYW1iYXMgcmVncmVzaW9uZXMgZW4gdW4gbWlzbW8gZ3LDoWZpY28KYGBge3J9CmdncGxvdChkYXQxLCBhZXMoRGVuc2lkYWQsVmVsb2NpZGFkX1ApKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIGFlcyhjb2w9J0xpbmVhbCcpKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIGFlcyhjb2w9J0N1YWRyYXRpY28nKSwgZm9ybXVsYSA9IHl+cG9seSh4LCAyKSkgKyBzY2FsZV9jb2xvcl9icmV3ZXIoJ01vZGVsbycscGFsZXR0ZSA9ICdEYXJrMicpCmBgYAojIyBDb3JyZWxhY2nDs24KCmQuIEVzdGltZSBsYSBjb3JyZWxhY2nDs24gdXRpbGl6YW5kbyBsYSByZWxhY2nDs24gY29uIGxhIHBlbmRpZW50ZSBkZSBsYSByZWdyZXNpw7NuIGxpbmVhbCwgeSBkZSBsYSBtYW5lcmEgY29udmVuY2lvbmFsIChkaXJlY3RhbWVudGUgZW50cmUgbGFzIHZhcmlhYmxlcykuIE9idGllbmUgZWwgbWlzbW8gcmVzdWx0YWRvPwoKYGBge3J9CnggPSBkYXQxJFZlbG9jaWRhZF9QCnkgPSBkYXQxJERlbnNpZGFkCmBgYAoKYGBge3IgY292LWNvcn0KY29yKHgseSxtZXRob2QgPSAicGVhcnNvbiIsCiAgICB1c2UgPSAncGFpcndpc2UuY29tcGxldGUub2JzJykgIyBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2lvbiBkZSBQZWFyc29uCmNvdih4LHksdXNlID0gJ3BhaXJ3aXNlLmNvbXBsZXRlLm9icycpICMgY292YXJpYW56YQoKYGBgCgoKUmVsYWNpw7NuIGVudHJlIGNvcnJlbGFjacOzbiB5IHJlZ3Jlc2nDs24gc2ltcGxlCkVzdGFuZGFyaXphbmRvIGVsIG1vZGVsbyBjb24gdmFyaWFibGVzIG9yaWdpbmFsZXMKCmBgYHtyIGNvci1tb2Qten0KbG0oVmVsb2NpZGFkX1AgfiBEZW5zaWRhZCwgZGF0YSA9IGRhdDEpICU+JSAKc3RhbmRhcmRpemVfcGFyYW1ldGVycyhtZXRob2QgPSAncmVmaXQnKSAlPiUKZmxleHRhYmxlKCkgJT4lCmNvbGZvcm1hdF9kb3VibGUoKQpgYGAKYGBge3J9Cm1hcF9kYmwoZGF0MSxzZCkgIyBkZXN2aWFjaW9uIGVzdGFuZGFyIGRlIGNhZGEgY29sdW1uYQoKYGBgCmBgYHtyfSAKKDMuMzkqMC4yMjYvMC44MTkpICAgIyBDb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gPSBQZW5kaWVudGUqIERlc3YuZXN0LkRlbnNpZGFkLyBEZXN2LmVzdC4gVmVsb2NpZGFkCgpgYGAKIyMgTWVqb3IgYWp1c3RlCkNvbXBhcmFuZG8gYW1ib3MgbW9kZWxvcywgY3XDoWwgY29uc2lkZXJhIHNlIGFqdXN0YSBtZWpvciBhIGxvcyBkYXRvcyB5IHBvciBxdcOpPyAoUmVjdWVyZGUgcXVlIHB1ZWRlIHVzYXIgbWVkaWRhcyBkZSBhanVzdGUgeSBncsOhZmljb3MgZGlhZ27Ds3N0aWNvKQoKUi8gRWwgbW9kZWxvIGxpbmVhbCB0aWVuZSB1biBlcnJvciBjdWFkcsOhdGljbyBtZWRpbyBkZSAwLjA4IGVsIGN1YWwgZXMgbWVub3IgcXVlIGVsIGRlbCBtb2RlbG8gY3VhZHLDoXRpY28gcXVlIGVzIDAuMjYuIENvbiByZXNwZWN0byBhbCBSMiBlbCBtb2RlbG8gbGluZWFsIHRpZW5lIHVuIHZhbG9yIGRlIDAuODgxIG1pZW50cmFzIHF1ZSBlbCBtb2RlbG8gY3VhZHLDoXRpY28gdGllbmUgdW4gdmFsb3IgZGUgMC45MDAuClNlZ8O6biBsYSBwdW50dWFjacOzbiBkZSByZW5kaW1pZW50byAoUGVyZm9ybWFuY2Ugc2NvcmUpIGVsIG1vZGVsbyBsaW5lYWwgdGllbmUgdW4gNjYsNjclIHkgZWwgbW9kZWxvIGN1YWRyw6F0aWNvIHVuIDMzLDMzJS4gUG9yIGxvIHRhbnRvIGVsIG1vZGVsbyBsaW5lYWwgc2UgYWp1c3RhIG3DoXMgYSBsb3MgZGF0b3MuCgojIyMgR3LDoWZpY29zIGRpYWduw7NzdGljbyBsaW5lYWwKCmBgYHtyIG1vZC1jaGVjay0xfQojIHBsb3QobW9kMSkgCmNoZWNrX21vZGVsKG1vZDEscGFuZWw9RikKYGBgCiMjIyBHcsOhZmljb3MgZGlhZ27Ds3N0aWNvIGN1YWRyw6F0aWNhCgpgYGB7ciBtb2QtY2hlY2stMn0KIyBwbG90KG1vZDIpIApjaGVja19tb2RlbChtb2QyLHBhbmVsPUYpCmBgYAoKIyMjIENvbXBhcmFjacOzbiBkZSBtb2RlbG9zCgpgYGB7ciBjb21wLW1vZDF9ClRNb2QobW9kMSxtb2QyKSAjIERlc2NUb29scwpgYGAKCmBgYHtyIGNvbXAtbW9kMn0KbW9kZWxzdW1tYXJ5KGxpc3QoTGluZWFsPW1vZDEsQ3VhZHJhdGljbz1tb2QyKSwKICAgICAgICAgICAgIHRpdGxlID0gJ0NvbXBhcmFzaW9uIGRlIG1vZGVsb3MnLAogICAgICAgICAgICAgc3RhdGlzdGljID0gTlVMTCwgIyAnY29uZi5pbnQnLAogICAgICAgICAgICAgY29lZl9vbWl0ID0gTlVMTCwgIyAnSW50JwogICAgICAgICAgICAgZ29mX29taXQgPSAnXig/IVJ8TnVtfEEpJywKICAgICAgICAgICAgIHN0YXJzID0gRiwKICAgICAgICAgICAgIGZtdCA9IDQpCmBgYAoKYGBge3IgY29tcC1tb2QzfQpzalBsb3Q6OnRhYl9tb2RlbChtb2QxLG1vZDIsCiAgICAgICAgICAgICAgICAgIHRpdGxlID0gJ0NvbXBhcmFzaW9uIGRlIG1vZGVsb3MnLAogICAgICAgICAgICAgICAgICBzaG93LnN0ZCA9IE5VTEwsICMgJ3N0ZCcsIE5VTEwKICAgICAgICAgICAgICAgICAgc2hvdy5pbnRlcmNlcHQgPSBULAogICAgICAgICAgICAgICAgICBzaG93LmNpID0gRiwgIyAuOTUKICAgICAgICAgICAgICAgICAgY29sbGFwc2UuY2kgPSBGLAogICAgICAgICAgICAgICAgICBjaS5oeXBoZW4gPSAnLCAnLAogICAgICAgICAgICAgICAgICBzaG93LnN0YXQgPSBGLAogICAgICAgICAgICAgICAgICBzaG93LnAgPSBGLAogICAgICAgICAgICAgICAgICBzaG93LmFpYyA9IFQsCiAgICAgICAgICAgICAgICAgIGR2LmxhYmVscyA9IGMoJ0xpbmVhbCcsJ0N1YWRyw6F0aWNvJyksCiAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDQsCiAgICAgICAgICAgICAgICAgIGZpbGUgPSAnc2pwbG90X21vZGVsc19sYWIzLmRvYycpCmBgYAoKYGBge3IgY29tcC1tb2Q0fQpjb21wLm1vZHMgPSBjb21wYXJlX3BlcmZvcm1hbmNlKG1vZDEsbW9kMixyYW5rID0gVCkgIyBwZXJmb3JtYW5jZQpjb21wLm1vZHMKcGxvdChjb21wLm1vZHMpCmBgYAoKIyBFSkVSQ0lDSU8gMgpTZSB0aWVuZW4gMyBncnVwb3MgZGUgY29uZ2xvbWVyYWRvcywgeSBwYXJhIGNhZGEgdW5vIHNlIHNlcGFyYW4gbG9zIGNsYXN0b3MgZW4gbWF5b3IgbyBtZW5vciBhIDUgY20uIEVuIGVsIGNvbmdsb21lcmFkbyBJIGhheSAyMCBjbGFzdG9zIG1lbm9yZXMgYSA1IGNtIHkgMTYgY2xhc3RvcyBtYXlvcmVzIGEgNSBjbS4gRW4gZWwgY29uZ2xvbWVyYWRvIElJIGhheSAzMSBjbGFzdG9zIG1lbm9yZXMgYSA1IGNtIHkgMjUgY2xhc3RvcyBtYXlvcmVzIGEgNSBjbS4gRW4gZWwgY29uZ2xvbWVyYWRvIElJSSBoYXkgMTIgY2xhc3RvcyBtZW5vcmVzIGEgNSBjbSB5IDggY2xhc3RvcyBtYXlvcmVzIGEgNSBjbS4KCmEuIEN1w6FsIGVzIGxhIHByb2JhYmlsaWRhZCBkZSBzZWxlY2Npb25hciB1biBjbGFzdG8gbWVub3IgYSA1IGNtPwoKUi8gRGUgbGEgdGFibGEgMSBzZSBvYnRpZW5lIHF1ZSBlcyA1NiUvMTAwID0gMC41NgoKYi4gQ3XDoWwgZXMgbGEgcHJvYmFiaWxpZGFkIGRlIHNlbGVjY2lvbmFyIHVuIGNsYXN0byBtYXlvciBhIDUgY20sIHNhYmllbmRvIHF1ZSBwcm92aWVuZSBkZWwgY29uZ2xvbWVyYWRvIElJST8KClIvIERlIGxhIHRhYmxhIDIgc2Ugb2J0aWVuZSBxdWUgZXMgNDAlLzEwMCA9IDAuNDAKCmMuIEN1w6FsIGVzIGxhIHByb2JhYmlsaWRhZCBkZSBzZWxlY2Npb25hciB1biBjbGFzdG8gZGVsIGNvbmdsb21lcmFkbyBJLCBzYWJpZW5kbyBxdWUgZXMgbWF5b3IgYSA1IGNtPwoKUi8gRGUgbGEgdGFibGEgMyAgc2Ugb2J0aWVuZSBxdWUgZXMgMzMlLzEwMCA9IDAuMzMKCmQuIEN1w6FsIGVzIGxhIHByb2JhYmlsaWRhZCBkZSBzZWxlY2Npb25hciB1biBjbGFzdG8gZGVsIGNvbmdsb21lcmFkbyBJST8KClIvIERlIGxhIHRhYmxhIDEgc2Ugb2J0aWVuZSBxdWUgZXMgNTAlLzEwMCA9IDAuNTAKCgpgYGB7ciBwcm9ifQpBID0gbWF0cml4KGRhdGEgPSBjKDE2LDIwLDI1LDMxLDgsMTIpLG5yb3cgPSAyLAogICAgICAgICAgIGRpbW5hbWVzID0gbGlzdChDbGFzdG89YygnTWF5b3IgYSA1JywnTWVub3IgYSA1JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmdsb21lcmFkbz1jKCdJJywnSUknLCdJSUknKSkpCgpBLnRiID0gVW50YWJsZShBKSAlPiUgdGliYmxlKCkKCnRibF9jcm9zcyhBLnRiLCBwZXJjZW50ID0gJ2NlbGwnKQp0YmxfY3Jvc3MoQS50YiwgcGVyY2VudCA9ICdjb2x1bW4nKQp0YmxfY3Jvc3MoQS50YiwgcGVyY2VudCA9ICdyb3cnKQoKCmBgYAojIFBBUlRFIEEgTUFOTwpgYGB7cn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkxhYjNfZmlsZXMvUGFydGUgYSBtYW5vIGxhYjMuanBlZyIpCgpgYGAK