CTIC - UNIVERSIDAD NACIONAL DE INGENIERIA

Programación en R para DataScience

Perfil Linkelind

Google Drive

Presentación del Codigo - Pregunta 1
> #Creando Cabeceras
> nombres <-c("Numero de la Observacion","Boiling Point(F)","Pressure(in Hg)","Log(Pressure)","100log(Pressure)")

> #Importando
> bdForbes <- read.table(file="Actividad4Caso1.txt",header=FALSE, sep=" ",col.names=nombres)
  Numero.de.la.Observacion Boiling.Point.F. Pressure.in.Hg. Log.Pressure. X100log.Pressure.
1                        1            194.5           20.79        1.3179            131.79
2                        2            194.3           20.79        1.3179            131.79
3                        3            197.9           22.40        1.3502            135.02
4                        4            198.4           22.67        1.3555            135.55
5                        5            199.4           23.15        1.3646            136.46
6                        6            199.9           23.35        1.3683            136.83

> #Convirtiendo a DataFrame
> df_forbes<-as.data.frame(bdForbes)
> head(df_forbes)
  Numero.de.la.Observacion Boiling.Point.F. Pressure.in.Hg. Log.Pressure. X100log.Pressure.
1                        1            194.5           20.79        1.3179            131.79
2                        2            194.3           20.79        1.3179            131.79
3                        3            197.9           22.40        1.3502            135.02
4                        4            198.4           22.67        1.3555            135.55
5                        5            199.4           23.15        1.3646            136.46
6                        6            199.9           23.35        1.3683            136.83

> #Diagrama de Puntos Pressure versus Boiling point
> plot(x=df_forbes$Pressure.in.Hg.,y=df_forbes$Boiling.Point.F., main = "Diagrama de Puntos de Pressure vs. Boiling Point", xlab = "Boiling Point", ylab = "Pressure")

Pregunta: ¿Hay una tendencia lineal?
Se Observa una clara correlación lineal



Presentación del Codigo - Pregunta 2
> #Diagrama de Puntos 100*log(Pressure) versus Boiling point
> plot(x=df_forbes$X100log.Pressure.,y=df_forbes$Boiling.Point.F., main = "Diagrama de Puntos de 100*log(Pressure) vs. Boiling Point", xlab = "Boiling Point", ylab = "Pressure")

Pregunta: ¿Se observa mejor la tendencia lineal que en la pregunta1?
Una respuesta dificil, pareciera que si, pero la certesa no la daria el coeficiciente de Correlación R



Presentación del Codigo - Pregunta 3
> #Ajutar la linea de regresión de 100*log(Pressure) versus Boiling point. Trazar la línea sobre el plot hallado en la pregunta 2

> #Aplicamos la Regresión Lineal y Guardamos su valor en una variable
> reg_lienal<-lm(df_forbes$X100log.Pressure.~df_forbes$Boiling.Point.F.)

> #Graficamos
> plot(df_forbes$X100log.Pressure.~df_forbes$Boiling.Point.F.,xlab="Boiling.Point.F.", ylab="100*log(Pressure)")
> lines(reg_lienal$fitted.values~df_forbes$Boiling.Point.F.)
> title("Regresión Lineal Y Grafica de Puntos")


Presentación del Codigo - Pregunta 3 - Continuación
> #Interpretar los “p-values” de la prueba t y el de la prueba F
> summary(reg_lienal)

Call:
lm(formula = df_forbes$X100log.Pressure. ~ df_forbes$Boiling.Point.F.)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.32220 -0.14473 -0.06664  0.02184  1.35978 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)
(Intercept)                -42.13778    3.34020  -12.62 2.18e-09
df_forbes$Boiling.Point.F.   0.89549    0.01645   54.43  < 2e-16
                              
(Intercept)                ***
df_forbes$Boiling.Point.F. ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.379 on 15 degrees of freedom
Multiple R-squared:  0.995, Adjusted R-squared:  0.9946 
F-statistic:  2963 on 1 and 15 DF,  p-value: < 2.2e-16

Interpretar los “t-values” de la prueba t y el de la prueba

P-Values: Nos indican el grado de ajuste que tienen los coeficientes al modelo lineal, en este caso al ser ambos muy pequeños, consideramos que tanto el coeficiente y la variable son nesesarias para el modelo de regresion lineal

F-statistic: Nos indican si el modelo es valido o no, Partiendo de la hipótesis Ho: Que los datos no se ajsutan a una regresión lineal, como p<0.05, rechazamos la Ho y concluimos que los datos si se ajustan a una regresión lineal, por lo tanto el modelo es valido



Presentación del Codigo - Pregunta 4
> #Interpretar el Coeficiente de Determinación R
> reg_cuadrado<-lsfit(df_forbes$Boiling.Point.F.,df_forbes$X100log.Pressure.)
> ls.print(reg_cuadrado)
Residual Standard Error=0.379
R-Square=0.995
F-statistic (df=1, 15)=2962.785
p-value=0

          Estimate Std.Err  t-value Pr(>|t|)
Intercept -42.1378  3.3402 -12.6154        0
X           0.8955  0.0165  54.4315        0

> #Obtener un intervalo de confianza del 99% para 𝛽. Interpretar su resultado.
> beta<-summary(reg_lienal)$coef[2,1]
> eebeta<-summary(reg_lienal)$coef[2,2]
> dim(df_forbes)
[1] 17  5
> bint<-c(beta-qt(.995,15)*eebeta,beta+qt(.995,15)*eebeta)
> bint
[1] 0.8470150 0.9439723

> #Obtener un intervalo de confianza del 99% para el valor predicho y un intervalo de confianza para el valor medio de 100*log(Pressure) cuando el Boiling Point es de 195 °F.

> #Intervalo de Confiansa al 99% para el valor predicho
> limit99<-predict(reg_lienal,se.fit = T,interval = c("confidence"),level = .99)
> limit99
$fit
        fit      lwr      upr
1  132.0357 131.5445 132.5270
2  131.8566 131.3573 132.3560
3  135.0804 134.7152 135.4456
4  135.5282 135.1787 135.8776
5  136.4237 136.1027 136.7447
6  136.8714 136.5627 137.1801
7  137.7669 137.4783 138.0555
8  137.9460 137.6606 138.2314
9  138.2146 137.9335 138.4958
10 138.1251 137.8426 138.4076
11 140.1847 139.9120 140.4574
12 141.0802 140.7978 141.3626
13 145.4681 145.0509 145.8854
14 144.6622 144.2771 145.0473
15 146.5427 146.0797 147.0058
16 147.6173 147.1059 148.1287
17 147.8860 147.3622 148.4097

$se.fit
 [1] 0.16670329 0.16945786 0.12394054 0.11858031 0.10893736 0.10475387 0.09793575
 [8] 0.09685029 0.09541188 0.09586552 0.09254197 0.09583811 0.14160608 0.13069760
[15] 0.15714613 0.17354259 0.17774802

$df
[1] 15

$residual.scale
[1] 0.3790275

> #Graficando
> plot(df_forbes$X100log.Pressure.~df_forbes$Boiling.Point.F.)
> lines(reg_lienal$fitted.values~df_forbes$Boiling.Point.F.)
> title("Banda de Confiansa al 99% y Regresión Lineal")

> #intervalo de confianza para el valor medio de 100*log(Pressure) cuando el Boiling Point es de 195 °F.

> #Calculando el Coeficiente y el Termino Independiente(Intercepto) 
> intercept<-summary(reg_lienal)$coef[1,1]
> coeficiente<-summary(reg_lienal)$coef[2,1]
> Y<-intercept+coeficiente*195

> #Valor Predecido de Y (100*log(Pressure))
> Y
[1] 132.4835

> #Rango de Valores
desvt<-summary(reg_lienal)$coef[2,2]
> bint<-c(Y-qt(.995,15)*desvt,Y+qt(.995,15)*desvt)
> bint
[1] 132.435 132.532
LS0tDQp0aXRsZTogIlIgcGFyYSBEYXRhU2NpZW5jZSwgVGFyZWEgTsKwNCINCmF1dGhvcjogIkNhbHZvIFF1aXNwZSwgTHVpcyBBbnRvbmlvIg0KZGF0ZTogIjIwMjIvMDUvMjkiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KLS0tDQoNCjwhLS0gQmllbnZlbmlkb3MgYWwgUHJveWVjdG8gZGUgTHVpcyBBbnRvbmlvIENhbHZvIFF1aXNwZSAtLT4NCg0KPGNlbnRlcj4NCiMjIyBDVElDIC0gVU5JVkVSU0lEQUQgTkFDSU9OQUwgREUgSU5HRU5JRVJJQQ0KIVtdKExvZ28ucG5nKXt3aWR0aD01MDBweH0NCg0KPC9jZW50ZXI+DQoNCjxjZW50ZXI+DQojIyMjIFByb2dyYW1hY2nDs24gZW4gUiBwYXJhIERhdGFTY2llbmNlDQpbUGVyZmlsIExpbmtlbGluZF0oaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2luL2x1aXMtYW50b25pby1jYWx2by1xdWlzcGUtNTdhMzNiMjI5LyAiSW5ncmVzYXIgYWwgUGVyZmlsIGRlbCBDb21wYcOxZXJvIil7dGFyZ2V0PSJfYmxhbmsifQ0KDQoNCltHb29nbGUgRHJpdmVdKGh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS9kcml2ZS9mb2xkZXJzLzFOV2N5ZC1xWjg3b0RlWVV1VnJzekJxTFBlTTRldFB3Mz91c3A9c2hhcmluZyAiSW5ncmVzYXIgYSBsYSBDYXJwZXRhIENvbXBhcnRpZGEiKXt0YXJnZXQ9Il9ibGFuayJ9DQo8L2NlbnRlcj4NCjxicj4NCjxjZW50ZXI+DQoqKlByZXNlbnRhY2nDs24gZGVsIENvZGlnbyAtIFByZWd1bnRhIDEqKg0KPC9jZW50ZXI+DQpgYGBSDQo+ICNDcmVhbmRvIENhYmVjZXJhcw0KPiBub21icmVzIDwtYygiTnVtZXJvIGRlIGxhIE9ic2VydmFjaW9uIiwiQm9pbGluZyBQb2ludChGKSIsIlByZXNzdXJlKGluIEhnKSIsIkxvZyhQcmVzc3VyZSkiLCIxMDBsb2coUHJlc3N1cmUpIikNCg0KPiAjSW1wb3J0YW5kbw0KPiBiZEZvcmJlcyA8LSByZWFkLnRhYmxlKGZpbGU9IkFjdGl2aWRhZDRDYXNvMS50eHQiLGhlYWRlcj1GQUxTRSwgc2VwPSIgIixjb2wubmFtZXM9bm9tYnJlcykNCiAgTnVtZXJvLmRlLmxhLk9ic2VydmFjaW9uIEJvaWxpbmcuUG9pbnQuRi4gUHJlc3N1cmUuaW4uSGcuIExvZy5QcmVzc3VyZS4gWDEwMGxvZy5QcmVzc3VyZS4NCjEgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgMTk0LjUgICAgICAgICAgIDIwLjc5ICAgICAgICAxLjMxNzkgICAgICAgICAgICAxMzEuNzkNCjIgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgMTk0LjMgICAgICAgICAgIDIwLjc5ICAgICAgICAxLjMxNzkgICAgICAgICAgICAxMzEuNzkNCjMgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgICAgMTk3LjkgICAgICAgICAgIDIyLjQwICAgICAgICAxLjM1MDIgICAgICAgICAgICAxMzUuMDINCjQgICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgMTk4LjQgICAgICAgICAgIDIyLjY3ICAgICAgICAxLjM1NTUgICAgICAgICAgICAxMzUuNTUNCjUgICAgICAgICAgICAgICAgICAgICAgICA1ICAgICAgICAgICAgMTk5LjQgICAgICAgICAgIDIzLjE1ICAgICAgICAxLjM2NDYgICAgICAgICAgICAxMzYuNDYNCjYgICAgICAgICAgICAgICAgICAgICAgICA2ICAgICAgICAgICAgMTk5LjkgICAgICAgICAgIDIzLjM1ICAgICAgICAxLjM2ODMgICAgICAgICAgICAxMzYuODMNCg0KPiAjQ29udmlydGllbmRvIGEgRGF0YUZyYW1lDQo+IGRmX2ZvcmJlczwtYXMuZGF0YS5mcmFtZShiZEZvcmJlcykNCj4gaGVhZChkZl9mb3JiZXMpDQogIE51bWVyby5kZS5sYS5PYnNlcnZhY2lvbiBCb2lsaW5nLlBvaW50LkYuIFByZXNzdXJlLmluLkhnLiBMb2cuUHJlc3N1cmUuIFgxMDBsb2cuUHJlc3N1cmUuDQoxICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgIDE5NC41ICAgICAgICAgICAyMC43OSAgICAgICAgMS4zMTc5ICAgICAgICAgICAgMTMxLjc5DQoyICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgIDE5NC4zICAgICAgICAgICAyMC43OSAgICAgICAgMS4zMTc5ICAgICAgICAgICAgMTMxLjc5DQozICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICAgIDE5Ny45ICAgICAgICAgICAyMi40MCAgICAgICAgMS4zNTAyICAgICAgICAgICAgMTM1LjAyDQo0ICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgIDE5OC40ICAgICAgICAgICAyMi42NyAgICAgICAgMS4zNTU1ICAgICAgICAgICAgMTM1LjU1DQo1ICAgICAgICAgICAgICAgICAgICAgICAgNSAgICAgICAgICAgIDE5OS40ICAgICAgICAgICAyMy4xNSAgICAgICAgMS4zNjQ2ICAgICAgICAgICAgMTM2LjQ2DQo2ICAgICAgICAgICAgICAgICAgICAgICAgNiAgICAgICAgICAgIDE5OS45ICAgICAgICAgICAyMy4zNSAgICAgICAgMS4zNjgzICAgICAgICAgICAgMTM2LjgzDQoNCj4gI0RpYWdyYW1hIGRlIFB1bnRvcyBQcmVzc3VyZSB2ZXJzdXMgQm9pbGluZyBwb2ludA0KPiBwbG90KHg9ZGZfZm9yYmVzJFByZXNzdXJlLmluLkhnLix5PWRmX2ZvcmJlcyRCb2lsaW5nLlBvaW50LkYuLCBtYWluID0gIkRpYWdyYW1hIGRlIFB1bnRvcyBkZSBQcmVzc3VyZSB2cy4gQm9pbGluZyBQb2ludCIsIHhsYWIgPSAiQm9pbGluZyBQb2ludCIsIHlsYWIgPSAiUHJlc3N1cmUiKQ0KYGBgDQoNCjxjZW50ZXI+DQohW10oUnBsb3REUC5wbmcpe3dpZHRoPTUwMHB4fQ0KPGJyPg0KKipQcmVndW50YTogwr9IYXkgdW5hIHRlbmRlbmNpYSBsaW5lYWw/KioNCjxicj4NCioqU2UgT2JzZXJ2YSB1bmEgY2xhcmEgY29ycmVsYWNpw7NuIGxpbmVhbCoqDQo8L2NlbnRlcj4NCjxicj4NCjxicj4NCg0KPGNlbnRlcj4NCioqUHJlc2VudGFjacOzbiBkZWwgQ29kaWdvIC0gUHJlZ3VudGEgMioqDQo8L2NlbnRlcj4NCg0KYGBgUg0KPiAjRGlhZ3JhbWEgZGUgUHVudG9zIDEwMCpsb2coUHJlc3N1cmUpIHZlcnN1cyBCb2lsaW5nIHBvaW50DQo+IHBsb3QoeD1kZl9mb3JiZXMkWDEwMGxvZy5QcmVzc3VyZS4seT1kZl9mb3JiZXMkQm9pbGluZy5Qb2ludC5GLiwgbWFpbiA9ICJEaWFncmFtYSBkZSBQdW50b3MgZGUgMTAwKmxvZyhQcmVzc3VyZSkgdnMuIEJvaWxpbmcgUG9pbnQiLCB4bGFiID0gIkJvaWxpbmcgUG9pbnQiLCB5bGFiID0gIlByZXNzdXJlIikNCmBgYA0KDQo8Y2VudGVyPg0KIVtdKFJwbG90RFAyLnBuZyl7d2lkdGg9NTAwcHh9DQo8YnI+DQoqKlByZWd1bnRhOiDCv1NlIG9ic2VydmEgbWVqb3IgbGEgdGVuZGVuY2lhIGxpbmVhbCBxdWUgZW4gbGEgcHJlZ3VudGExPyoqDQo8YnI+DQoqKlVuYSByZXNwdWVzdGEgZGlmaWNpbCwgcGFyZWNpZXJhIHF1ZSBzaSwgcGVybyBsYSBjZXJ0ZXNhIG5vIGxhIGRhcmlhIGVsIGNvZWZpY2ljaWVudGUgZGUgQ29ycmVsYWNpw7NuIFIqKg0KPC9jZW50ZXI+DQo8YnI+DQo8YnI+DQoNCjxjZW50ZXI+DQoqKlByZXNlbnRhY2nDs24gZGVsIENvZGlnbyAtIFByZWd1bnRhIDMqKg0KPC9jZW50ZXI+DQpgYGBSDQo+ICNBanV0YXIgbGEgbGluZWEgZGUgcmVncmVzacOzbiBkZSAxMDAqbG9nKFByZXNzdXJlKSB2ZXJzdXMgQm9pbGluZyBwb2ludC4gVHJhemFyIGxhIGzDrW5lYSBzb2JyZSBlbCBwbG90IGhhbGxhZG8gZW4gbGEgcHJlZ3VudGEgMg0KDQo+ICNBcGxpY2Ftb3MgbGEgUmVncmVzacOzbiBMaW5lYWwgeSBHdWFyZGFtb3Mgc3UgdmFsb3IgZW4gdW5hIHZhcmlhYmxlDQo+IHJlZ19saWVuYWw8LWxtKGRmX2ZvcmJlcyRYMTAwbG9nLlByZXNzdXJlLn5kZl9mb3JiZXMkQm9pbGluZy5Qb2ludC5GLikNCg0KPiAjR3JhZmljYW1vcw0KPiBwbG90KGRmX2ZvcmJlcyRYMTAwbG9nLlByZXNzdXJlLn5kZl9mb3JiZXMkQm9pbGluZy5Qb2ludC5GLix4bGFiPSJCb2lsaW5nLlBvaW50LkYuIiwgeWxhYj0iMTAwKmxvZyhQcmVzc3VyZSkiKQ0KPiBsaW5lcyhyZWdfbGllbmFsJGZpdHRlZC52YWx1ZXN+ZGZfZm9yYmVzJEJvaWxpbmcuUG9pbnQuRi4pDQo+IHRpdGxlKCJSZWdyZXNpw7NuIExpbmVhbCBZIEdyYWZpY2EgZGUgUHVudG9zIikNCg0KYGBgDQoNCjxjZW50ZXI+DQohW10oUnBsb3RSMS5wbmcpe3dpZHRoPTUwMHB4fQ0KPC9jZW50ZXI+DQo8YnI+DQoNCjxjZW50ZXI+DQoqKlByZXNlbnRhY2nDs24gZGVsIENvZGlnbyAtIFByZWd1bnRhIDMgLSBDb250aW51YWNpw7NuKioNCjwvY2VudGVyPg0KDQoNCmBgYFINCj4gI0ludGVycHJldGFyIGxvcyDigJxwLXZhbHVlc+KAnSBkZSBsYSBwcnVlYmEgdCB5IGVsIGRlIGxhIHBydWViYSBGDQo+IHN1bW1hcnkocmVnX2xpZW5hbCkNCg0KQ2FsbDoNCmxtKGZvcm11bGEgPSBkZl9mb3JiZXMkWDEwMGxvZy5QcmVzc3VyZS4gfiBkZl9mb3JiZXMkQm9pbGluZy5Qb2ludC5GLikNCg0KUmVzaWR1YWxzOg0KICAgICBNaW4gICAgICAgMVEgICBNZWRpYW4gICAgICAgM1EgICAgICBNYXggDQotMC4zMjIyMCAtMC4xNDQ3MyAtMC4wNjY2NCAgMC4wMjE4NCAgMS4zNTk3OCANCg0KQ29lZmZpY2llbnRzOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVzdGltYXRlIFN0ZC4gRXJyb3IgdCB2YWx1ZSBQcig+fHR8KQ0KKEludGVyY2VwdCkgICAgICAgICAgICAgICAgLTQyLjEzNzc4ICAgIDMuMzQwMjAgIC0xMi42MiAyLjE4ZS0wOQ0KZGZfZm9yYmVzJEJvaWxpbmcuUG9pbnQuRi4gICAwLjg5NTQ5ICAgIDAuMDE2NDUgICA1NC40MyAgPCAyZS0xNg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQooSW50ZXJjZXB0KSAgICAgICAgICAgICAgICAqKioNCmRmX2ZvcmJlcyRCb2lsaW5nLlBvaW50LkYuICoqKg0KLS0tDQpTaWduaWYuIGNvZGVzOiAgMCDigJgqKirigJkgMC4wMDEg4oCYKirigJkgMC4wMSDigJgq4oCZIDAuMDUg4oCYLuKAmSAwLjEg4oCYIOKAmSAxDQoNClJlc2lkdWFsIHN0YW5kYXJkIGVycm9yOiAwLjM3OSBvbiAxNSBkZWdyZWVzIG9mIGZyZWVkb20NCk11bHRpcGxlIFItc3F1YXJlZDogIDAuOTk1LAlBZGp1c3RlZCBSLXNxdWFyZWQ6ICAwLjk5NDYgDQpGLXN0YXRpc3RpYzogIDI5NjMgb24gMSBhbmQgMTUgREYsICBwLXZhbHVlOiA8IDIuMmUtMTYNCmBgYA0KDQoNCjxjZW50ZXI+DQo8YnI+DQoqKkludGVycHJldGFyIGxvcyDigJx0LXZhbHVlc+KAnSBkZSBsYSBwcnVlYmEgdCB5IGVsIGRlIGxhIHBydWViYSAqKg0KPGJyPg0KPGJyPg0KKipQLVZhbHVlczogTm9zIGluZGljYW4gZWwgZ3JhZG8gZGUgYWp1c3RlIHF1ZSB0aWVuZW4gbG9zIGNvZWZpY2llbnRlcyBhbCBtb2RlbG8gbGluZWFsLCBlbiBlc3RlIGNhc28gYWwgc2VyIGFtYm9zIG11eSBwZXF1ZcOxb3MsIGNvbnNpZGVyYW1vcyBxdWUgdGFudG8gZWwgY29lZmljaWVudGUgeSBsYSB2YXJpYWJsZSBzb24gbmVzZXNhcmlhcyBwYXJhIGVsIG1vZGVsbyBkZSByZWdyZXNpb24gbGluZWFsKioNCjxicj4NCjxicj4NCioqRi1zdGF0aXN0aWM6IE5vcyBpbmRpY2FuIHNpIGVsIG1vZGVsbyBlcyB2YWxpZG8gbyBubywgUGFydGllbmRvIGRlIGxhIGhpcMOzdGVzaXMgSG86IFF1ZSBsb3MgZGF0b3Mgbm8gc2UgYWpzdXRhbiBhIHVuYSByZWdyZXNpw7NuIGxpbmVhbCwgY29tbyBwPDAuMDUsIHJlY2hhemFtb3MgbGEgSG8geSBjb25jbHVpbW9zIHF1ZSBsb3MgZGF0b3Mgc2kgc2UgYWp1c3RhbiBhIHVuYSByZWdyZXNpw7NuIGxpbmVhbCwgcG9yIGxvIHRhbnRvIGVsIG1vZGVsbyBlcyB2YWxpZG8qKg0KPC9jZW50ZXI+DQo8YnI+DQo8YnI+DQoNCjxjZW50ZXI+DQoqKlByZXNlbnRhY2nDs24gZGVsIENvZGlnbyAtIFByZWd1bnRhIDQqKg0KPC9jZW50ZXI+DQoNCg0KYGBgUg0KPiAjSW50ZXJwcmV0YXIgZWwgQ29lZmljaWVudGUgZGUgRGV0ZXJtaW5hY2nDs24gUg0KPiByZWdfY3VhZHJhZG88LWxzZml0KGRmX2ZvcmJlcyRCb2lsaW5nLlBvaW50LkYuLGRmX2ZvcmJlcyRYMTAwbG9nLlByZXNzdXJlLikNCj4gbHMucHJpbnQocmVnX2N1YWRyYWRvKQ0KUmVzaWR1YWwgU3RhbmRhcmQgRXJyb3I9MC4zNzkNClItU3F1YXJlPTAuOTk1DQpGLXN0YXRpc3RpYyAoZGY9MSwgMTUpPTI5NjIuNzg1DQpwLXZhbHVlPTANCg0KICAgICAgICAgIEVzdGltYXRlIFN0ZC5FcnIgIHQtdmFsdWUgUHIoPnx0fCkNCkludGVyY2VwdCAtNDIuMTM3OCAgMy4zNDAyIC0xMi42MTU0ICAgICAgICAwDQpYICAgICAgICAgICAwLjg5NTUgIDAuMDE2NSAgNTQuNDMxNSAgICAgICAgMA0KDQo+ICNPYnRlbmVyIHVuIGludGVydmFsbyBkZSBjb25maWFuemEgZGVsIDk5JSBwYXJhIPCdm70uIEludGVycHJldGFyIHN1IHJlc3VsdGFkby4NCj4gYmV0YTwtc3VtbWFyeShyZWdfbGllbmFsKSRjb2VmWzIsMV0NCj4gZWViZXRhPC1zdW1tYXJ5KHJlZ19saWVuYWwpJGNvZWZbMiwyXQ0KPiBkaW0oZGZfZm9yYmVzKQ0KWzFdIDE3ICA1DQo+IGJpbnQ8LWMoYmV0YS1xdCguOTk1LDE1KSplZWJldGEsYmV0YStxdCguOTk1LDE1KSplZWJldGEpDQo+IGJpbnQNClsxXSAwLjg0NzAxNTAgMC45NDM5NzIzDQoNCj4gI09idGVuZXIgdW4gaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZWwgOTklIHBhcmEgZWwgdmFsb3IgcHJlZGljaG8geSB1biBpbnRlcnZhbG8gZGUgY29uZmlhbnphIHBhcmEgZWwgdmFsb3IgbWVkaW8gZGUgMTAwKmxvZyhQcmVzc3VyZSkgY3VhbmRvIGVsIEJvaWxpbmcgUG9pbnQgZXMgZGUgMTk1IMKwRi4NCg0KPiAjSW50ZXJ2YWxvIGRlIENvbmZpYW5zYSBhbCA5OSUgcGFyYSBlbCB2YWxvciBwcmVkaWNobw0KPiBsaW1pdDk5PC1wcmVkaWN0KHJlZ19saWVuYWwsc2UuZml0ID0gVCxpbnRlcnZhbCA9IGMoImNvbmZpZGVuY2UiKSxsZXZlbCA9IC45OSkNCj4gbGltaXQ5OQ0KJGZpdA0KICAgICAgICBmaXQgICAgICBsd3IgICAgICB1cHINCjEgIDEzMi4wMzU3IDEzMS41NDQ1IDEzMi41MjcwDQoyICAxMzEuODU2NiAxMzEuMzU3MyAxMzIuMzU2MA0KMyAgMTM1LjA4MDQgMTM0LjcxNTIgMTM1LjQ0NTYNCjQgIDEzNS41MjgyIDEzNS4xNzg3IDEzNS44Nzc2DQo1ICAxMzYuNDIzNyAxMzYuMTAyNyAxMzYuNzQ0Nw0KNiAgMTM2Ljg3MTQgMTM2LjU2MjcgMTM3LjE4MDENCjcgIDEzNy43NjY5IDEzNy40NzgzIDEzOC4wNTU1DQo4ICAxMzcuOTQ2MCAxMzcuNjYwNiAxMzguMjMxNA0KOSAgMTM4LjIxNDYgMTM3LjkzMzUgMTM4LjQ5NTgNCjEwIDEzOC4xMjUxIDEzNy44NDI2IDEzOC40MDc2DQoxMSAxNDAuMTg0NyAxMzkuOTEyMCAxNDAuNDU3NA0KMTIgMTQxLjA4MDIgMTQwLjc5NzggMTQxLjM2MjYNCjEzIDE0NS40NjgxIDE0NS4wNTA5IDE0NS44ODU0DQoxNCAxNDQuNjYyMiAxNDQuMjc3MSAxNDUuMDQ3Mw0KMTUgMTQ2LjU0MjcgMTQ2LjA3OTcgMTQ3LjAwNTgNCjE2IDE0Ny42MTczIDE0Ny4xMDU5IDE0OC4xMjg3DQoxNyAxNDcuODg2MCAxNDcuMzYyMiAxNDguNDA5Nw0KDQokc2UuZml0DQogWzFdIDAuMTY2NzAzMjkgMC4xNjk0NTc4NiAwLjEyMzk0MDU0IDAuMTE4NTgwMzEgMC4xMDg5MzczNiAwLjEwNDc1Mzg3IDAuMDk3OTM1NzUNCiBbOF0gMC4wOTY4NTAyOSAwLjA5NTQxMTg4IDAuMDk1ODY1NTIgMC4wOTI1NDE5NyAwLjA5NTgzODExIDAuMTQxNjA2MDggMC4xMzA2OTc2MA0KWzE1XSAwLjE1NzE0NjEzIDAuMTczNTQyNTkgMC4xNzc3NDgwMg0KDQokZGYNClsxXSAxNQ0KDQokcmVzaWR1YWwuc2NhbGUNClsxXSAwLjM3OTAyNzUNCg0KPiAjR3JhZmljYW5kbw0KPiBwbG90KGRmX2ZvcmJlcyRYMTAwbG9nLlByZXNzdXJlLn5kZl9mb3JiZXMkQm9pbGluZy5Qb2ludC5GLikNCj4gbGluZXMocmVnX2xpZW5hbCRmaXR0ZWQudmFsdWVzfmRmX2ZvcmJlcyRCb2lsaW5nLlBvaW50LkYuKQ0KPiB0aXRsZSgiQmFuZGEgZGUgQ29uZmlhbnNhIGFsIDk5JSB5IFJlZ3Jlc2nDs24gTGluZWFsIikNCg0KPiAjaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBwYXJhIGVsIHZhbG9yIG1lZGlvIGRlIDEwMCpsb2coUHJlc3N1cmUpIGN1YW5kbyBlbCBCb2lsaW5nIFBvaW50IGVzIGRlIDE5NSDCsEYuDQoNCj4gI0NhbGN1bGFuZG8gZWwgQ29lZmljaWVudGUgeSBlbCBUZXJtaW5vIEluZGVwZW5kaWVudGUoSW50ZXJjZXB0bykgDQo+IGludGVyY2VwdDwtc3VtbWFyeShyZWdfbGllbmFsKSRjb2VmWzEsMV0NCj4gY29lZmljaWVudGU8LXN1bW1hcnkocmVnX2xpZW5hbCkkY29lZlsyLDFdDQo+IFk8LWludGVyY2VwdCtjb2VmaWNpZW50ZSoxOTUNCg0KPiAjVmFsb3IgUHJlZGVjaWRvIGRlIFkgKDEwMCpsb2coUHJlc3N1cmUpKQ0KPiBZDQpbMV0gMTMyLjQ4MzUNCg0KPiAjUmFuZ28gZGUgVmFsb3Jlcw0KZGVzdnQ8LXN1bW1hcnkocmVnX2xpZW5hbCkkY29lZlsyLDJdDQo+IGJpbnQ8LWMoWS1xdCguOTk1LDE1KSpkZXN2dCxZK3F0KC45OTUsMTUpKmRlc3Z0KQ0KPiBiaW50DQpbMV0gMTMyLjQzNSAxMzIuNTMyDQoNCmBgYA0K