En esta Practica se abordan algunas operaciones basicas en R, que serviran en los analisis econometricos que se realizaran a lo largo de este curso.

En un primer momento se realizaran la introduccion de matrices, que estas se pueden introducir de dos formas, por medio de la manipulacion de dataframes o de una forma directa.

1. Introduccion de datos de forma manual.

#Las siguientes entradas son extraidas del libro de Econometria de Gujarati, tercera edicion, capitulo 6, pag 175
#INCREMENTO ANUAL DE LAS TASAS SALARIALES Y EN LA TASA DE DESEMPLEO, REINO UNIDO, 1950-1966
# VARIABLE DEPENDIENTE
tasas_salariales<-matrix(c(1.8,8.5,8.4,4.5,4.3,6.9,8,5,3.6,2.6,2.6,4.2,3.6,3.7,4.8,4.3,4.6),17,1)
tasas_salariales
      [,1]
 [1,]  1.8
 [2,]  8.5
 [3,]  8.4
 [4,]  4.5
 [5,]  4.3
 [6,]  6.9
 [7,]  8.0
 [8,]  5.0
 [9,]  3.6
[10,]  2.6
[11,]  2.6
[12,]  4.2
[13,]  3.6
[14,]  3.7
[15,]  4.8
[16,]  4.3
[17,]  4.6
#Otra forma de ingresar la matriz de tasas salariales
tasas_salariales_2<-matrix(c(1.8,8.5,8.4,4.5,4.3,6.9,8,5,3.6,2.6,2.6,4.2,3.6,3.7,4.8,4.3,4.6 ),nrow =17, ncol =1)
colnames(tasas_salariales_2) <-c("Incrmento tasas salariales")
tasas_salariales_2
      Incrmento tasas salariales
 [1,]                        1.8
 [2,]                        8.5
 [3,]                        8.4
 [4,]                        4.5
 [5,]                        4.3
 [6,]                        6.9
 [7,]                        8.0
 [8,]                        5.0
 [9,]                        3.6
[10,]                        2.6
[11,]                        2.6
[12,]                        4.2
[13,]                        3.6
[14,]                        3.7
[15,]                        4.8
[16,]                        4.3
[17,]                        4.6
#INCREMENTO ANUAL DE LAS TASAS SALARIALES Y EN LA TASA DE DESEMPLEO, REINO UNIDO, 1950-1966
#Variable Explicativa y la columna del término independiente
a<-cbind(rep(x = 1,17))
b<-matrix(c(1.4,1.1,1.5,1.5,1.2,1.0,1.1,1.3,1.8,1.9,1.5,1.4,1.8,2.1,1.5,1.3,1.4),nrow = 17, ncol = 1)
desempleo<-matrix(c(a,b),nrow = 17, ncol = 2)
colnames(desempleo)<-c("Cte","X1")
desempleo
      Cte  X1
 [1,]   1 1.4
 [2,]   1 1.1
 [3,]   1 1.5
 [4,]   1 1.5
 [5,]   1 1.2
 [6,]   1 1.0
 [7,]   1 1.1
 [8,]   1 1.3
 [9,]   1 1.8
[10,]   1 1.9
[11,]   1 1.5
[12,]   1 1.4
[13,]   1 1.8
[14,]   1 2.1
[15,]   1 1.5
[16,]   1 1.3
[17,]   1 1.4

2. Importando los datos de un archivo csv (separado por comas)

library(readr)
library(dplyr)
# la ruta cambiará en su maquina
archivo<-"C:/Users/74/Desktop/practica R/practica_1.csv"
datos<-read_csv(file = archivo)
Y_<-datos %>% select("Y") %>% as.matrix()
temp<-
X_<-datos %>%  mutate(Cte=1) %>% select("Cte","X1","X2") %>% as.matrix()
print(X_)
     Cte X1 X2
[1,]   1  4 10
[2,]   1  2  5
[3,]   1  6 11
[4,]   1  4  6
[5,]   1  8 12
print(Y_)
      Y
[1,] 30
[2,] 20
[3,] 36
[4,] 24
[5,] 40

3.Producto de matrices

Para multiplicar matrices se usa el comando %*%, y para trasponer matrices se usa t()

#La matrix X´X, sigma matriz
sigma_matriz<-t(X_)%*%X_
print(sigma_matriz)
    Cte  X1  X2
Cte   5  24  44
X1   24 136 236
X2   44 236 426
#La matrix X´Y, matriz cruzada
mat_cruzada<-t(X_)%*%Y_
print(mat_cruzada)
       Y
Cte  150
X1   792
X2  1420

4.Inversa de matrices

En el caso de la obtención de inversas, se utilizará el comando solve()

XX_inver<-solve(XX_)
print(XX_inver)
           Cte         X1         X2
Cte  2.3333333  0.1666667 -0.3333333
X1   0.1666667  0.2020833 -0.1291667
X2  -0.3333333 -0.1291667  0.1083333

5. Matriz Diagonal

Para la matriz diagonal de cualquier orden utilizaremos el comando diag()

diagonal<-diag(5)
diagonal
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    0    0    0
[2,]    0    1    0    0    0
[3,]    0    0    1    0    0
[4,]    0    0    0    1    0
[5,]    0    0    0    0    1
diagonal_2<-diag(3)
diagonal_2
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1

6.Nombres a las filas y columnas

R<- matrix(c(5,7,6,20,18,25,16,12,8,7,9,5,17,21,13),nrow = 3, ncol = 5,         byrow = TRUE, 
dimnames = list(c("Rustico", "Moderno", "Colonial"),  c("Acero", "Madera", "Vidrio",  "Pintura", "M.obra")))
R
         Acero Madera Vidrio Pintura M.obra
Rustico      5      7      6      20     18
Moderno     25     16     12       8      7
Colonial     9      5     17      21     13

7 Regla de cramer

La regla de Kramer es un teorema del álgebra lineal que da la solución de un sistema lineal de ecuaciones en términos de determinantes. Recibe este nombre en honor a Gabriel Cramer (1704-1752), quien publicó la regla en su Introduction à l’analyse des lignes courbes algébriques de 1750, aunque Colin Maclaurin también publicó el método en su Treatise of Geometry de 1748 (y probablemente sabía del método desde 1729).

#Nota:esta es una matriz de 3x3
#2x+y-z=15
#5x-y+5z=16
#x+4y+z=20
mat_sistema<-matrix(c(2,5,1,1,-1,4,-1,5,1),nrow =3 ,ncol =3 )
mat_x<-matrix(c(15,16,20,1,-1,4,-1,5,1),nrow = 3, ncol = 3)
mat_y<-matrix(c(2,5,1,15,16,20,-1,5,1), nrow = 3, ncol = 3)
mat_z<-matrix(c(2,5,1,1,-1,4,15,16,20),nrow = 3,ncol = 3)
det_sistema<-det(mat_sistema)
det_x<-det(mat_x)
det_y<-det(mat_y)
det_z<-det(mat_z)
valor_x<-det_x/det_sistema
valor_x
[1] 5
valor_y<-det_y/det_sistema
valor_y
[1] 4
valor_z<-det_z/det_sistema
valor_z
[1] -1

8. Calculo de los estimadores MCO \(\widehat{\beta}\), matricialmente apartir de las matrices antes utilizadas

En estadística, los mínimos cuadrados ordinarios (MCO) o mínimos cuadrados lineales es el nombre de un método para encontrar los parámetros poblacionales en un modelo de regresión lineal. Este método minimiza la suma de las distancias verticales entre las respuestas observadas en la muestra y las respuestas del modelo.

El calculo de estas matricialmente se hara mediante las operaciones: (INVERSA DE LA SIGMA MATRIZ * MATRIZ CRUZADA)

inver_sigma<-solve(sigma_matriz)
estimadores<-(inver_sigma%*%mat_cruzada)
colnames(estimadores)<-c("parametros")
estimadores
    parametros
Cte   8.666667
X1    1.633333
X2    1.533333
  

otra forma de obtener es usando mediante la solución de las ecuaciones normales, usando el comando solve

Beta<-solve(a = sigma_matriz,b = mat_cruzada )
colnames(Beta)<-c("parámetros")
Beta
    parámetros
Cte   8.666667
X1    1.633333
X2    1.533333

9. Autovalores y autovectores

Los autovalores se definen como las raices “\(\lambda\)”, de la siguiente ecuación polinómica: \(|C-\lambda*I| =0\) , donde \(C\) es una matriz cuadrada!!

Se usará el comando eigen()

autovalor_autovector<-eigen(sigma_matriz)
#muestra los valores y vectores propios
autovalor_autovector
eigen() decomposition
$values
[1] 562.4909617   4.0919529   0.4170855

$vectors
            [,1]       [,2]        [,3]
[1,] -0.08953653  0.1446454  0.98542423
[2,] -0.48607751 -0.8699151  0.08352496
[3,] -0.86931690  0.4715140 -0.14819805
LS0tDQp0aXRsZTogIlByYWN0aWNhIE1hdHJpY2VzIg0KYXV0aG9yOiAiRGVuaXMgRmVybmFuZG8gRmxhbWVuY28gTm9sYXNjbyINCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6IA0KICAgIHRvYzogeWVzDQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGRmX3ByaW50OiBrYWJsZQ0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0UsbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1UUlVFLGV2YWw9VFJVRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpFbiBlc3RhIFByYWN0aWNhIHNlIGFib3JkYW4gYWxndW5hcyBvcGVyYWNpb25lcyBiYXNpY2FzIGVuIFIsIHF1ZSBzZXJ2aXJhbiBlbiBsb3MgYW5hbGlzaXMgZWNvbm9tZXRyaWNvcyBxdWUgc2UgcmVhbGl6YXJhbiBhIGxvIGxhcmdvIGRlIGVzdGUgY3Vyc28uDQoNCkVuIHVuIHByaW1lciBtb21lbnRvIHNlIHJlYWxpemFyYW4gbGEgaW50cm9kdWNjaW9uIGRlIG1hdHJpY2VzLCBxdWUgZXN0YXMgc2UgcHVlZGVuIGludHJvZHVjaXIgZGUgZG9zIGZvcm1hcywgcG9yIG1lZGlvIGRlIGxhIG1hbmlwdWxhY2lvbiBkZSBkYXRhZnJhbWVzIG8gZGUgdW5hIGZvcm1hIGRpcmVjdGEuIA0KDQojIDEuIEludHJvZHVjY2lvbiBkZSBkYXRvcyBkZSBmb3JtYSBtYW51YWwuDQpgYGB7cn0NCiNMYXMgc2lndWllbnRlcyBlbnRyYWRhcyBzb24gZXh0cmFpZGFzIGRlbCBsaWJybyBkZSBFY29ub21ldHJpYSBkZSBHdWphcmF0aSwgdGVyY2VyYSBlZGljaW9uLCBjYXBpdHVsbyA2LCBwYWcgMTc1DQojSU5DUkVNRU5UTyBBTlVBTCBERSBMQVMgVEFTQVMgU0FMQVJJQUxFUyBZIEVOIExBIFRBU0EgREUgREVTRU1QTEVPLCBSRUlOTyBVTklETywgMTk1MC0xOTY2DQoNCiMgVkFSSUFCTEUgREVQRU5ESUVOVEUNCg0KDQp0YXNhc19zYWxhcmlhbGVzPC1tYXRyaXgoYygxLjgsOC41LDguNCw0LjUsNC4zLDYuOSw4LDUsMy42LDIuNiwyLjYsNC4yLDMuNiwzLjcsNC44LDQuMyw0LjYpLDE3LDEpDQp0YXNhc19zYWxhcmlhbGVzDQpgYGANCg0KYGBge3J9DQojT3RyYSBmb3JtYSBkZSBpbmdyZXNhciBsYSBtYXRyaXogZGUgdGFzYXMgc2FsYXJpYWxlcw0KdGFzYXNfc2FsYXJpYWxlc18yPC1tYXRyaXgoYygxLjgsOC41LDguNCw0LjUsNC4zLDYuOSw4LDUsMy42LDIuNiwyLjYsNC4yLDMuNiwzLjcsNC44LDQuMyw0LjYgKSxucm93ID0xNywgbmNvbCA9MSkNCmNvbG5hbWVzKHRhc2FzX3NhbGFyaWFsZXNfMikgPC1jKCJJbmNybWVudG8gdGFzYXMgc2FsYXJpYWxlcyIpDQp0YXNhc19zYWxhcmlhbGVzXzINCmBgYA0KDQoNCmBgYHtyfQ0KI0lOQ1JFTUVOVE8gQU5VQUwgREUgTEFTIFRBU0FTIFNBTEFSSUFMRVMgWSBFTiBMQSBUQVNBIERFIERFU0VNUExFTywgUkVJTk8gVU5JRE8sIDE5NTAtMTk2Ng0KDQojVmFyaWFibGUgRXhwbGljYXRpdmEgeSBsYSBjb2x1bW5hIGRlbCB06XJtaW5vIGluZGVwZW5kaWVudGUNCg0KYTwtY2JpbmQocmVwKHggPSAxLDE3KSkNCg0KDQpiPC1tYXRyaXgoYygxLjQsMS4xLDEuNSwxLjUsMS4yLDEuMCwxLjEsMS4zLDEuOCwxLjksMS41LDEuNCwxLjgsMi4xLDEuNSwxLjMsMS40KSxucm93ID0gMTcsIG5jb2wgPSAxKQ0KDQpkZXNlbXBsZW88LW1hdHJpeChjKGEsYiksbnJvdyA9IDE3LCBuY29sID0gMikNCmNvbG5hbWVzKGRlc2VtcGxlbyk8LWMoIkN0ZSIsIlgxIikNCmRlc2VtcGxlbw0KDQpgYGANCiMgMi4gSW1wb3J0YW5kbyBsb3MgZGF0b3MgZGUgdW4gYXJjaGl2byBjc3YgKHNlcGFyYWRvIHBvciBjb21hcykNCg0KYGBge3IsbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1UUlVFLGV2YWw9VFJVRX0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGRwbHlyKQ0KIyBsYSBydXRhIGNhbWJpYXLhIGVuIHN1IG1hcXVpbmENCmFyY2hpdm88LSJDOi9Vc2Vycy83NC9EZXNrdG9wL3ByYWN0aWNhIFIvcHJhY3RpY2FfMS5jc3YiDQpkYXRvczwtcmVhZF9jc3YoZmlsZSA9IGFyY2hpdm8pDQpZXzwtZGF0b3MgJT4lIHNlbGVjdCgiWSIpICU+JSBhcy5tYXRyaXgoKQ0KdGVtcDwtDQpYXzwtZGF0b3MgJT4lICBtdXRhdGUoQ3RlPTEpICU+JSBzZWxlY3QoIkN0ZSIsIlgxIiwiWDIiKSAlPiUgYXMubWF0cml4KCkNCnByaW50KFhfKQ0KDQpwcmludChZXykNCmBgYA0KDQojIDMuUHJvZHVjdG8gZGUgbWF0cmljZXMNCg0KUGFyYSBtdWx0aXBsaWNhciBtYXRyaWNlcyBzZSB1c2EgZWwgY29tYW5kbyAlKiUsIHkgcGFyYSB0cmFzcG9uZXIgbWF0cmljZXMgc2UgdXNhIHQoKQ0KDQpgYGB7cn0NCg0KI0xhIG1hdHJpeCBYtFgsIHNpZ21hIG1hdHJpeg0Kc2lnbWFfbWF0cml6PC10KFhfKSUqJVhfDQpwcmludChzaWdtYV9tYXRyaXopDQpgYGANCg0KYGBge3J9DQojTGEgbWF0cml4IFi0WSwgbWF0cml6IGNydXphZGENCg0KbWF0X2NydXphZGE8LXQoWF8pJSolWV8NCnByaW50KG1hdF9jcnV6YWRhKQ0KDQpgYGANCg0KIyA0LkludmVyc2EgZGUgbWF0cmljZXMNCg0KRW4gZWwgY2FzbyBkZSBsYSBvYnRlbmNp824gZGUgaW52ZXJzYXMsIHNlIHV0aWxpemFy4SBlbCBjb21hbmRvIHNvbHZlKCkNCg0KYGBge3J9DQpYWF9pbnZlcjwtc29sdmUoWFhfKQ0KcHJpbnQoWFhfaW52ZXIpDQpgYGANCg0KIyA1LiBNYXRyaXogRGlhZ29uYWwNCg0KUGFyYSBsYSBtYXRyaXogZGlhZ29uYWwgZGUgY3VhbHF1aWVyIG9yZGVuIHV0aWxpemFyZW1vcyBlbCBjb21hbmRvIGRpYWcoKQ0KDQpgYGB7cn0NCmRpYWdvbmFsPC1kaWFnKDUpDQpkaWFnb25hbA0KDQpkaWFnb25hbF8yPC1kaWFnKDMpDQpkaWFnb25hbF8yDQpgYGANCg0KDQojIDYuTm9tYnJlcyBhIGxhcyBmaWxhcyB5IGNvbHVtbmFzDQoNCmBgYHtyfQ0KUjwtIG1hdHJpeChjKDUsNyw2LDIwLDE4LDI1LDE2LDEyLDgsNyw5LDUsMTcsMjEsMTMpLG5yb3cgPSAzLCBuY29sID0gNSwgICAgICAgICBieXJvdyA9IFRSVUUsIA0KZGltbmFtZXMgPSBsaXN0KGMoIlJ1c3RpY28iLCAiTW9kZXJubyIsICJDb2xvbmlhbCIpLCAgYygiQWNlcm8iLCAiTWFkZXJhIiwgIlZpZHJpbyIsICAiUGludHVyYSIsICJNLm9icmEiKSkpDQpSDQpgYGANCg0KIyA3IFJlZ2xhIGRlIGNyYW1lcg0KDQoNCkxhIHJlZ2xhIGRlIEtyYW1lciBlcyB1biB0ZW9yZW1hIGRlbCDhbGdlYnJhIGxpbmVhbCBxdWUgZGEgbGEgc29sdWNp824gZGUgdW4gc2lzdGVtYSBsaW5lYWwgZGUgZWN1YWNpb25lcyBlbiB06XJtaW5vcyBkZSBkZXRlcm1pbmFudGVzLiBSZWNpYmUgZXN0ZSBub21icmUgZW4gaG9ub3IgYSBHYWJyaWVsIENyYW1lciAoMTcwNC0xNzUyKSwgcXVpZW4gcHVibGlj8yBsYSByZWdsYSBlbiBzdSBJbnRyb2R1Y3Rpb24g4CBsJ2FuYWx5c2UgZGVzIGxpZ25lcyBjb3VyYmVzIGFsZ+licmlxdWVzIGRlIDE3NTAsIGF1bnF1ZSBDb2xpbiBNYWNsYXVyaW4gdGFtYmnpbiBwdWJsaWPzIGVsIG3pdG9kbyBlbiBzdSBUcmVhdGlzZSBvZiBHZW9tZXRyeSBkZSAxNzQ4ICh5IHByb2JhYmxlbWVudGUgc2Fi7WEgZGVsIG3pdG9kbyBkZXNkZSAxNzI5KS4NCg0KYGBge3J9DQoNCiNOb3RhOmVzdGEgZXMgdW5hIG1hdHJpeiBkZSAzeDMNCg0KIzJ4K3ktej0xNQ0KIzV4LXkrNXo9MTYNCiN4KzR5K3o9MjANCg0KbWF0X3Npc3RlbWE8LW1hdHJpeChjKDIsNSwxLDEsLTEsNCwtMSw1LDEpLG5yb3cgPTMgLG5jb2wgPTMgKQ0KbWF0X3g8LW1hdHJpeChjKDE1LDE2LDIwLDEsLTEsNCwtMSw1LDEpLG5yb3cgPSAzLCBuY29sID0gMykNCm1hdF95PC1tYXRyaXgoYygyLDUsMSwxNSwxNiwyMCwtMSw1LDEpLCBucm93ID0gMywgbmNvbCA9IDMpDQptYXRfejwtbWF0cml4KGMoMiw1LDEsMSwtMSw0LDE1LDE2LDIwKSxucm93ID0gMyxuY29sID0gMykNCg0KZGV0X3Npc3RlbWE8LWRldChtYXRfc2lzdGVtYSkNCmRldF94PC1kZXQobWF0X3gpDQpkZXRfeTwtZGV0KG1hdF95KQ0KZGV0X3o8LWRldChtYXRfeikNCg0KdmFsb3JfeDwtZGV0X3gvZGV0X3Npc3RlbWENCnZhbG9yX3gNCg0KdmFsb3JfeTwtZGV0X3kvZGV0X3Npc3RlbWENCnZhbG9yX3kNCg0KdmFsb3JfejwtZGV0X3ovZGV0X3Npc3RlbWENCnZhbG9yX3oNCg0KDQoNCmBgYA0KDQojIDguIENhbGN1bG8gZGUgbG9zIGVzdGltYWRvcmVzIE1DTyAgXChcd2lkZWhhdHtcYmV0YX1cKSwgbWF0cmljaWFsbWVudGUgYXBhcnRpciBkZSBsYXMgbWF0cmljZXMgYW50ZXMgdXRpbGl6YWRhcw0KDQpFbiBlc3RhZO1zdGljYSwgbG9zIG3tbmltb3MgY3VhZHJhZG9zIG9yZGluYXJpb3MgKE1DTykgbyBt7W5pbW9zIGN1YWRyYWRvcyBsaW5lYWxlcyBlcyBlbCBub21icmUgZGUgdW4gbel0b2RvIHBhcmEgZW5jb250cmFyIGxvcyBwYXLhbWV0cm9zIHBvYmxhY2lvbmFsZXMgZW4gdW4gbW9kZWxvIGRlIHJlZ3Jlc2nzbiBsaW5lYWwuIEVzdGUgbel0b2RvIG1pbmltaXphIGxhIHN1bWEgZGUgbGFzIGRpc3RhbmNpYXMgdmVydGljYWxlcyBlbnRyZSBsYXMgcmVzcHVlc3RhcyBvYnNlcnZhZGFzIGVuIGxhIG11ZXN0cmEgeSBsYXMgcmVzcHVlc3RhcyBkZWwgbW9kZWxvLg0KDQpFbCBjYWxjdWxvIGRlIGVzdGFzIG1hdHJpY2lhbG1lbnRlIHNlIGhhcmEgbWVkaWFudGUgbGFzIG9wZXJhY2lvbmVzOiAoSU5WRVJTQSBERSBMQSBTSUdNQSBNQVRSSVogKiBNQVRSSVogQ1JVWkFEQSkNCg0KDQpgYGB7cn0NCmludmVyX3NpZ21hPC1zb2x2ZShzaWdtYV9tYXRyaXopDQoNCmVzdGltYWRvcmVzPC0oaW52ZXJfc2lnbWElKiVtYXRfY3J1emFkYSkNCmNvbG5hbWVzKGVzdGltYWRvcmVzKTwtYygicGFyYW1ldHJvcyIpDQplc3RpbWFkb3Jlcw0KICANCmBgYA0KDQpvdHJhIGZvcm1hIGRlIG9idGVuZXIgZXMgdXNhbmRvIG1lZGlhbnRlIGxhIHNvbHVjafNuIGRlIGxhcyBlY3VhY2lvbmVzIG5vcm1hbGVzLCB1c2FuZG8gZWwgY29tYW5kbyBzb2x2ZQ0KDQpgYGB7cn0NCkJldGE8LXNvbHZlKGEgPSBzaWdtYV9tYXRyaXosYiA9IG1hdF9jcnV6YWRhICkNCmNvbG5hbWVzKEJldGEpPC1jKCJwYXLhbWV0cm9zIikNCkJldGENCmBgYA0KDQojIDkuIEF1dG92YWxvcmVzIHkgYXV0b3ZlY3RvcmVzIA0KDQpMb3MgYXV0b3ZhbG9yZXMgc2UgZGVmaW5lbiBjb21vIGxhcyByYWljZXMgIlwoXGxhbWJkYVwpIiwgZGUgbGEgc2lndWllbnRlIGVjdWFjafNuIHBvbGlu821pY2E6IFwofEMtXGxhbWJkYSpJfCA9MFwpICwgZG9uZGUgXChDXCkgZXMgdW5hIG1hdHJpeiBjdWFkcmFkYSEhDQoNClNlIHVzYXLhIGVsIGNvbWFuZG8gZWlnZW4oKQ0KDQpgYGB7cn0NCmF1dG92YWxvcl9hdXRvdmVjdG9yPC1laWdlbihzaWdtYV9tYXRyaXopDQoNCiNtdWVzdHJhIGxvcyB2YWxvcmVzIHkgdmVjdG9yZXMgcHJvcGlvcw0KYXV0b3ZhbG9yX2F1dG92ZWN0b3INCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg==