# R Basico
# Aprendiendo a importar y explorar datos  y a realizar graficos con  Edinburgh's biodiversity
# relizado por Angelica Martinez 10/03/2020 Universidad Nacional de Colombia

En el chuck anteior se observa que el signo numeral se usa para escribir comentarios al codigo y que no van a ser ejecutados pero que son muy utiles para recordar osas importantes del mismo.

install.packages("dplyr")
library(dplyr)

Cuando se va a instalar un package este va escrito entre comillas, pero cuanto este se llama ya no se usan las comillas. En rojo encontramos un mensaje de advertencia acerca de la version del package, pero no significa que no vaya a ser ejecutada.

IMPORTAR Y VERIFICAR DATOS


edidiv <- read.csv("C:/Users/Usuario/Documents/AGRONOMIA/edidiv.csv") 
# Nos basaremos en este archivo.

Se debe verificar si los archivos fueron copiados sin errores y para esto se realizan las siguientes verificaiones

head(edidiv)                  # Muestra las primeras filas
tail(edidiv)                # Muestra las ultimas filas
str(edidiv)                 # Indica si las variables son continuas, enteras, categóricas o caracteres.

El signo pesos permite acceder solo a una columna de una tabla de datos,

head(edidiv$taxonGroup)     # Muestra solamente las primeras filas de la columna
class(edidiv$taxonGroup)    # Indica con qué tipo de variable estamos lidiando 

L a variable taxonGroupvariable se muestra como una variable de carácter, pero debe ser un factor usando el siguiente comando se cambiara.

edidiv$taxonGroup <- as.factor(edidiv$taxonGroup)
class(edidiv$taxonGroup)

Seguimos explorando con comandos

dim(edidiv)                 # Muestra el numero de filas y columnas
summary(edidiv)             # Da un resumen de los datos
summary(edidiv$taxonGroup)  # Muestra un resumen de una variable particular en el conjunto de datos

CALCULAR LA RIQUEZA DE ESPECIES

La riqueza de especies es el número total de especies diferentes en un lugar o grupo dado. En este ejemplo para saber cuántas especies de aves, plantas, mamíferos, etc. tenemos en Edimburgo, primero debemos dividirnos edidiv en varios objetos.

Beetle <- filter(edidiv, taxonGroup == "Beetle")
Bird <- filter(edidiv, taxonGroup == "Bird") 
Butterfly <- filter(edidiv, taxonGroup == "Butterfly")
Dragonfly <- filter(edidiv, taxonGroup == "Dragonfly")
Flowering.plants <- filter(edidiv, taxonGroup == "Flowering.plants")
Fungus <- filter(edidiv, taxonGroup == "Fungus")
Hymenopteran <- filter(edidiv, taxonGroup == "Hymenopteran")
Lichen <- filter(edidiv, taxonGroup == "Lichen")
Liverwort <- filter(edidiv, taxonGroup == "Liverwort")
Mammal <- filter(edidiv, taxonGroup == "Mammal")
Mollusc <- filter(edidiv, taxonGroup == "Mollusc")

Una vez que haya creado objetos para cada taxón, podemos calcular la riqueza de especies, es decir, el número de especies diferentes en cada grupo. Para esto, anidaremos dos funciones juntas: unique()que identifica diferentes especies y length()que las cuenta.

a <- length(unique(Beetle$taxonName))
b <- length(unique(Bird$taxonName))
c <- length(unique(Butterfly$taxonName))
d <- length(unique(Dragonfly$taxonName))
e <- length(unique(Flowering.plants$taxonName))
f <- length(unique(Fungus$taxonName))
g <- length(unique(Hymenopteran$taxonName))
h <- length(unique(Lichen$taxonName))
i <- length(unique(Liverwort$taxonName))
j <- length(unique(Mammal$taxonName))
k <- length(unique(Mollusc$taxonName))

Si se escribe el nombre de alguna variable en la consola, obtendremos la cantidad de especies de la misma.

a

CREAR UN VECTOR Y TRAZARLO

biodiv <- c(a,b,c,d,e,f,g,h,i,j,k)  #Estamos encadenando todos los valores; preste atención a los nombres de objetos que ha calculado y su orden
names(biodiv) <- c("Beetle",
                   "Bird",
                   "Butterfly",
                   "Dragonfly",
                   "Flowering.Plants",
                   "Fungus",
                   "Hymenopteran",
                   "Lichen",
                   "Liverwort",
                   "Mammal",
                   "Mollusc")

Ya podemos graficar nuestros datos

barplot(biodiv)

Para mejorar nuestras graficas usamos los siguientes codigos de ayuda

help(barplot)     # Ayda con la funcion  barplot
help(par)         # Ayuda con graicos en general
png("barplot.png", width=1600, height=600)  #  tamaño y resolucion de l imagen
barplot(biodiv, xlab="Taxa", ylab="Number of species", ylim=c(0,600), cex.names= 1, cex.axis=1.5, cex.lab=1.5)

dev.off()
# El código cex aumenta el tamaño de fuente cuando es mayor que uno (y lo disminuye cuando es menor que uno).

CREAR UN TAXA

# Crear "taxa"  este contiene los nombres de las taxa
taxa <- c("Beetle",
          "Bird",
          "Butterfly",
          "Dragonfly",
          "Flowering.Plants",
          "Fungus",
          "Hymenopteran",
          "Lichen",
          "Liverwort",
          "Mammal",
          "Mollusc")

# Convirtiendo este objeto en un factor 
taxa_f <- factor(taxa)

# Combinando todos los valores para el número de especies en un objeto llamado richeness
richness <- c(a,b,c,d,e,f,g,h,i,j,k)

# combinando todos los valores para el número de especies en un objeto llamado richness
biodata <- data.frame(taxa_f, richness)

# Guardando el archivo
write.csv(biodata, file="biodata.csv")  # it will be saved in your working directory

para guardar un diagrama

png("barplot2.png", width=1600, height=600)

barplot(biodata$richness, names.arg=c("Beetle",
                                      "Bird",
                                      "Butterfly",
                                      "Dragonfly",
                                      "Flowering.Plants",
                                      "Fungus",
                                      "Hymenopteran",
                                      "Lichen",
                                      "Liverwort",
                                      "Mammal",
                                      "Mollusc"),
        xlab="Taxa", ylab="Number of species", ylim=c(0,600))

RETO

sparrow <- mean(22, 24, 21)
kingfisher <- mean(26, 23, 25)
eagle <- mean(195, 201, 185)
hummingbird <- mean(8, 9, 9)
wingspan <- c(sparrow, kingfisher, eagle, hummingbird)
bird_sp <- c("sparrow", "kingfisher", "eagle", "hummingbird")
class(bird_sp)                      
bird_sp <- as.factor(bird_sp)       
class(bird_sp)                      
wings <- data.frame(bird_sp, wingspan)
png("wingspan_plot.png", width=800, height=600)
barplot(wings$wingspan, names.arg = wings$bird_sp,    
        xlab = "Bird", 
        ylab = "Average wingspan (cm)",               
        ylim = c(0, 200),                             
        col = "green")                                
dev.off()

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I. When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tDQp0aXRsZTogIkFwcmVuZGllbmRvIFIiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyfQ0KIyBSIEJhc2ljbw0KIyBBcHJlbmRpZW5kbyBhIGltcG9ydGFyIHkgZXhwbG9yYXIgZGF0b3MgIHkgYSByZWFsaXphciBncmFmaWNvcyBjb24gIEVkaW5idXJnaCdzIGJpb2RpdmVyc2l0eQ0KIyByZWxpemFkbyBwb3IgQW5nZWxpY2EgTWFydGluZXogMTAvMDMvMjAyMCBVbml2ZXJzaWRhZCBOYWNpb25hbCBkZSBDb2xvbWJpYQ0KYGBgDQpFbiBlbCBjaHVjayBhbnRlaW9yIHNlIG9ic2VydmEgcXVlIGVsIHNpZ25vIG51bWVyYWwgc2UgdXNhIHBhcmEgZXNjcmliaXIgY29tZW50YXJpb3MgYWwgY29kaWdvIHkgcXVlIG5vIHZhbiBhIHNlciBlamVjdXRhZG9zIHBlcm8gcXVlIHNvbiBtdXkgdXRpbGVzIHBhcmEgcmVjb3JkYXIgb3NhcyBpbXBvcnRhbnRlcyBkZWwgbWlzbW8uDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoImRwbHlyIikNCmxpYnJhcnkoZHBseXIpDQoNCmBgYA0KQ3VhbmRvIHNlIHZhIGEgaW5zdGFsYXIgdW4gcGFja2FnZSBlc3RlIHZhIGVzY3JpdG8gZW50cmUgY29taWxsYXMsIHBlcm8gY3VhbnRvIGVzdGUgc2UgbGxhbWEgeWEgbm8gc2UgdXNhbiBsYXMgY29taWxsYXMuDQpFbiByb2pvIGVuY29udHJhbW9zIHVuIG1lbnNhamUgZGUgIGFkdmVydGVuY2lhIGFjZXJjYSBkZSBsYSB2ZXJzaW9uIGRlbCBwYWNrYWdlLCBwZXJvIG5vIHNpZ25pZmljYSBxdWUgbm8gdmF5YSBhIHNlciBlamVjdXRhZGEuDQoNCklNUE9SVEFSIFkgVkVSSUZJQ0FSIERBVE9TDQoNCmBgYHtyfQ0KDQplZGlkaXYgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL1VzdWFyaW8vRG9jdW1lbnRzL0FHUk9OT01JQS9lZGlkaXYuY3N2IikgDQojIE5vcyBiYXNhcmVtb3MgZW4gZXN0ZSBhcmNoaXZvLg0KDQpgYGANCg0KU2UgZGViZSB2ZXJpZmljYXIgc2kgbG9zIGFyY2hpdm9zIGZ1ZXJvbiBjb3BpYWRvcyBzaW4gZXJyb3JlcyB5IHBhcmEgZXN0byBzZSByZWFsaXphbiBsYXMgc2lndWllbnRlcyB2ZXJpZmljYWlvbmVzDQoNCmBgYHtyfQ0KaGVhZChlZGlkaXYpICAgICAgICAgICAgICAgICAgIyBNdWVzdHJhIGxhcyBwcmltZXJhcyBmaWxhcw0KdGFpbChlZGlkaXYpICAgICAgICAgICAgICAgICMgTXVlc3RyYSBsYXMgdWx0aW1hcyBmaWxhcw0Kc3RyKGVkaWRpdikgICAgICAgICAgICAgICAgICMgSW5kaWNhIHNpIGxhcyB2YXJpYWJsZXMgc29uIGNvbnRpbnVhcywgZW50ZXJhcywgY2F0ZWfDs3JpY2FzIG8gY2FyYWN0ZXJlcy4NCmBgYA0KDQpFbCBzaWdubyBwZXNvcyBwZXJtaXRlIGFjY2VkZXIgc29sbyBhIHVuYSBjb2x1bW5hIGRlIHVuYSB0YWJsYSBkZSBkYXRvcywNCg0KYGBge3J9DQpoZWFkKGVkaWRpdiR0YXhvbkdyb3VwKSAgICAgIyBNdWVzdHJhIHNvbGFtZW50ZSBsYXMgcHJpbWVyYXMgZmlsYXMgZGUgbGEgY29sdW1uYQ0KY2xhc3MoZWRpZGl2JHRheG9uR3JvdXApICAgICMgSW5kaWNhIGNvbiBxdcOpIHRpcG8gZGUgdmFyaWFibGUgZXN0YW1vcyBsaWRpYW5kbyANCg0KYGBgDQpMIGEgdmFyaWFibGUgdGF4b25Hcm91cHZhcmlhYmxlIHNlIG11ZXN0cmEgY29tbyB1bmEgdmFyaWFibGUgZGUgY2Fyw6FjdGVyLCBwZXJvIGRlYmUgc2VyIHVuIGZhY3RvciB1c2FuZG8gZWwgc2lndWllbnRlIGNvbWFuZG8gc2UgY2FtYmlhcmEuDQoNCmBgYHtyfQ0KZWRpZGl2JHRheG9uR3JvdXAgPC0gYXMuZmFjdG9yKGVkaWRpdiR0YXhvbkdyb3VwKQ0KYGBgDQoNCmBgYHtyfQ0KY2xhc3MoZWRpZGl2JHRheG9uR3JvdXApDQpgYGANCiANCiBTZWd1aW1vcyBleHBsb3JhbmRvIGNvbiBjb21hbmRvcw0KDQpgYGB7cn0NCmRpbShlZGlkaXYpICAgICAgICAgICAgICAgICAjIE11ZXN0cmEgZWwgbnVtZXJvIGRlIGZpbGFzIHkgY29sdW1uYXMNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkoZWRpZGl2KSAgICAgICAgICAgICAjIERhIHVuIHJlc3VtZW4gZGUgbG9zIGRhdG9zDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KGVkaWRpdiR0YXhvbkdyb3VwKSAgIyBNdWVzdHJhIHVuIHJlc3VtZW4gZGUgdW5hIHZhcmlhYmxlIHBhcnRpY3VsYXIgZW4gZWwgY29uanVudG8gZGUgZGF0b3MNCmBgYA0KDQpDQUxDVUxBUiBMQSBSSVFVRVpBIERFIEVTUEVDSUVTDQoNCkxhIHJpcXVlemEgZGUgZXNwZWNpZXMgZXMgZWwgbsO6bWVybyB0b3RhbCBkZSBlc3BlY2llcyBkaWZlcmVudGVzIGVuIHVuIGx1Z2FyIG8gZ3J1cG8gZGFkby4gRW4gZXN0ZSBlamVtcGxvIHBhcmEgc2FiZXIgY3XDoW50YXMgZXNwZWNpZXMgZGUgYXZlcywgcGxhbnRhcywgbWFtw61mZXJvcywgZXRjLiB0ZW5lbW9zIGVuIEVkaW1idXJnbywgcHJpbWVybyBkZWJlbW9zIGRpdmlkaXJub3MgZWRpZGl2IGVuIHZhcmlvcyBvYmpldG9zLg0KDQpgYGB7cn0NCkJlZXRsZSA8LSBmaWx0ZXIoZWRpZGl2LCB0YXhvbkdyb3VwID09ICJCZWV0bGUiKQ0KYGBgDQoNCmBgYHtyfQ0KQmlyZCA8LSBmaWx0ZXIoZWRpZGl2LCB0YXhvbkdyb3VwID09ICJCaXJkIikgDQpgYGANCg0KYGBge3J9DQpCdXR0ZXJmbHkgPC0gZmlsdGVyKGVkaWRpdiwgdGF4b25Hcm91cCA9PSAiQnV0dGVyZmx5IikNCkRyYWdvbmZseSA8LSBmaWx0ZXIoZWRpZGl2LCB0YXhvbkdyb3VwID09ICJEcmFnb25mbHkiKQ0KRmxvd2VyaW5nLnBsYW50cyA8LSBmaWx0ZXIoZWRpZGl2LCB0YXhvbkdyb3VwID09ICJGbG93ZXJpbmcucGxhbnRzIikNCkZ1bmd1cyA8LSBmaWx0ZXIoZWRpZGl2LCB0YXhvbkdyb3VwID09ICJGdW5ndXMiKQ0KSHltZW5vcHRlcmFuIDwtIGZpbHRlcihlZGlkaXYsIHRheG9uR3JvdXAgPT0gIkh5bWVub3B0ZXJhbiIpDQpMaWNoZW4gPC0gZmlsdGVyKGVkaWRpdiwgdGF4b25Hcm91cCA9PSAiTGljaGVuIikNCkxpdmVyd29ydCA8LSBmaWx0ZXIoZWRpZGl2LCB0YXhvbkdyb3VwID09ICJMaXZlcndvcnQiKQ0KTWFtbWFsIDwtIGZpbHRlcihlZGlkaXYsIHRheG9uR3JvdXAgPT0gIk1hbW1hbCIpDQpNb2xsdXNjIDwtIGZpbHRlcihlZGlkaXYsIHRheG9uR3JvdXAgPT0gIk1vbGx1c2MiKQ0KYGBgDQoNClVuYSB2ZXogcXVlIGhheWEgY3JlYWRvIG9iamV0b3MgcGFyYSBjYWRhIHRheMOzbiwgcG9kZW1vcyBjYWxjdWxhciBsYSByaXF1ZXphIGRlIGVzcGVjaWVzLCBlcyBkZWNpciwgZWwgbsO6bWVybyBkZSBlc3BlY2llcyBkaWZlcmVudGVzIGVuIGNhZGEgZ3J1cG8uIFBhcmEgZXN0bywgYW5pZGFyZW1vcyBkb3MgZnVuY2lvbmVzIGp1bnRhczogdW5pcXVlKClxdWUgaWRlbnRpZmljYSBkaWZlcmVudGVzIGVzcGVjaWVzIHkgbGVuZ3RoKClxdWUgbGFzIGN1ZW50YS4NCg0KYGBge3J9DQphIDwtIGxlbmd0aCh1bmlxdWUoQmVldGxlJHRheG9uTmFtZSkpDQpiIDwtIGxlbmd0aCh1bmlxdWUoQmlyZCR0YXhvbk5hbWUpKQ0KYyA8LSBsZW5ndGgodW5pcXVlKEJ1dHRlcmZseSR0YXhvbk5hbWUpKQ0KZCA8LSBsZW5ndGgodW5pcXVlKERyYWdvbmZseSR0YXhvbk5hbWUpKQ0KZSA8LSBsZW5ndGgodW5pcXVlKEZsb3dlcmluZy5wbGFudHMkdGF4b25OYW1lKSkNCmYgPC0gbGVuZ3RoKHVuaXF1ZShGdW5ndXMkdGF4b25OYW1lKSkNCmcgPC0gbGVuZ3RoKHVuaXF1ZShIeW1lbm9wdGVyYW4kdGF4b25OYW1lKSkNCmggPC0gbGVuZ3RoKHVuaXF1ZShMaWNoZW4kdGF4b25OYW1lKSkNCmkgPC0gbGVuZ3RoKHVuaXF1ZShMaXZlcndvcnQkdGF4b25OYW1lKSkNCmogPC0gbGVuZ3RoKHVuaXF1ZShNYW1tYWwkdGF4b25OYW1lKSkNCmsgPC0gbGVuZ3RoKHVuaXF1ZShNb2xsdXNjJHRheG9uTmFtZSkpDQpgYGANCiBTaSBzZSAgZXNjcmliZSBlbCBub21icmUgZGUgYWxndW5hIHZhcmlhYmxlIGVuIGxhIGNvbnNvbGEsIG9idGVuZHJlbW9zIGxhIGNhbnRpZGFkIGRlIGVzcGVjaWVzIGRlIGxhIG1pc21hLg0KDQpgYGB7cn0NCmENCg0KYGBgDQoNCg0KQ1JFQVIgVU4gVkVDVE9SIFkgVFJBWkFSTE8NCg0KDQpgYGB7cn0NCmJpb2RpdiA8LSBjKGEsYixjLGQsZSxmLGcsaCxpLGosaykgICNFc3RhbW9zIGVuY2FkZW5hbmRvIHRvZG9zIGxvcyB2YWxvcmVzOyBwcmVzdGUgYXRlbmNpw7NuIGEgbG9zIG5vbWJyZXMgZGUgb2JqZXRvcyBxdWUgaGEgY2FsY3VsYWRvIHkgc3Ugb3JkZW4NCg0KYGBgDQoNCg0KYGBge3J9DQpuYW1lcyhiaW9kaXYpIDwtIGMoIkJlZXRsZSIsDQogICAgICAgICAgICAgICAgICAgIkJpcmQiLA0KICAgICAgICAgICAgICAgICAgICJCdXR0ZXJmbHkiLA0KICAgICAgICAgICAgICAgICAgICJEcmFnb25mbHkiLA0KICAgICAgICAgICAgICAgICAgICJGbG93ZXJpbmcuUGxhbnRzIiwNCiAgICAgICAgICAgICAgICAgICAiRnVuZ3VzIiwNCiAgICAgICAgICAgICAgICAgICAiSHltZW5vcHRlcmFuIiwNCiAgICAgICAgICAgICAgICAgICAiTGljaGVuIiwNCiAgICAgICAgICAgICAgICAgICAiTGl2ZXJ3b3J0IiwNCiAgICAgICAgICAgICAgICAgICAiTWFtbWFsIiwNCiAgICAgICAgICAgICAgICAgICAiTW9sbHVzYyIpDQpgYGANCg0KWWEgcG9kZW1vcyBncmFmaWNhciBudWVzdHJvcyBkYXRvcw0KDQpgYGB7cn0NCmJhcnBsb3QoYmlvZGl2KQ0KYGBgDQogUGFyYSBtZWpvcmFyIG51ZXN0cmFzIGdyYWZpY2FzIHVzYW1vcyBsb3Mgc2lndWllbnRlcyBjb2RpZ29zIGRlIGF5dWRhIA0KDQpgYGB7cn0NCmhlbHAoYmFycGxvdCkgICAgICMgQXlkYSBjb24gbGEgZnVuY2lvbiAgYmFycGxvdA0KaGVscChwYXIpICAgICAgICAgIyBBeXVkYSBjb24gZ3JhaWNvcyBlbiBnZW5lcmFsDQpgYGANCg0KYGBge3J9DQpwbmcoImJhcnBsb3QucG5nIiwgd2lkdGg9MTYwMCwgaGVpZ2h0PTYwMCkgICMgIHRhbWHDsW8geSByZXNvbHVjaW9uIGRlIGwgaW1hZ2VuDQpiYXJwbG90KGJpb2RpdiwgeGxhYj0iVGF4YSIsIHlsYWI9Ik51bWJlciBvZiBzcGVjaWVzIiwgeWxpbT1jKDAsNjAwKSwgY2V4Lm5hbWVzPSAxLCBjZXguYXhpcz0xLjUsIGNleC5sYWI9MS41KQ0KDQpkZXYub2ZmKCkNCiMgRWwgY8OzZGlnbyBjZXggYXVtZW50YSBlbCB0YW1hw7FvIGRlIGZ1ZW50ZSBjdWFuZG8gZXMgbWF5b3IgcXVlIHVubyAoeSBsbyBkaXNtaW51eWUgY3VhbmRvIGVzIG1lbm9yIHF1ZSB1bm8pLg0KYGBgDQoNCg0KDQpDUkVBUiBVTiBUQVhBDQoNCg0KYGBge3J9DQojIENyZWFyICJ0YXhhIiAgZXN0ZSBjb250aWVuZSBsb3Mgbm9tYnJlcyBkZSBsYXMgdGF4YQ0KdGF4YSA8LSBjKCJCZWV0bGUiLA0KICAgICAgICAgICJCaXJkIiwNCiAgICAgICAgICAiQnV0dGVyZmx5IiwNCiAgICAgICAgICAiRHJhZ29uZmx5IiwNCiAgICAgICAgICAiRmxvd2VyaW5nLlBsYW50cyIsDQogICAgICAgICAgIkZ1bmd1cyIsDQogICAgICAgICAgIkh5bWVub3B0ZXJhbiIsDQogICAgICAgICAgIkxpY2hlbiIsDQogICAgICAgICAgIkxpdmVyd29ydCIsDQogICAgICAgICAgIk1hbW1hbCIsDQogICAgICAgICAgIk1vbGx1c2MiKQ0KDQojIENvbnZpcnRpZW5kbyBlc3RlIG9iamV0byBlbiB1biBmYWN0b3IgDQp0YXhhX2YgPC0gZmFjdG9yKHRheGEpDQoNCiMgQ29tYmluYW5kbyB0b2RvcyBsb3MgdmFsb3JlcyBwYXJhIGVsIG7Dum1lcm8gZGUgZXNwZWNpZXMgZW4gdW4gb2JqZXRvIGxsYW1hZG8gcmljaGVuZXNzDQpyaWNobmVzcyA8LSBjKGEsYixjLGQsZSxmLGcsaCxpLGosaykNCg0KIyBjb21iaW5hbmRvIHRvZG9zIGxvcyB2YWxvcmVzIHBhcmEgZWwgbsO6bWVybyBkZSBlc3BlY2llcyBlbiB1biBvYmpldG8gbGxhbWFkbyByaWNobmVzcw0KYmlvZGF0YSA8LSBkYXRhLmZyYW1lKHRheGFfZiwgcmljaG5lc3MpDQoNCiMgR3VhcmRhbmRvIGVsIGFyY2hpdm8NCndyaXRlLmNzdihiaW9kYXRhLCBmaWxlPSJiaW9kYXRhLmNzdiIpICAjIGl0IHdpbGwgYmUgc2F2ZWQgaW4geW91ciB3b3JraW5nIGRpcmVjdG9yeQ0KYGBgDQoNCnBhcmEgZ3VhcmRhciB1biBkaWFncmFtYQ0KYGBge3J9DQpwbmcoImJhcnBsb3QyLnBuZyIsIHdpZHRoPTE2MDAsIGhlaWdodD02MDApDQoNCmJhcnBsb3QoYmlvZGF0YSRyaWNobmVzcywgbmFtZXMuYXJnPWMoIkJlZXRsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCaXJkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1dHRlcmZseSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEcmFnb25mbHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmxvd2VyaW5nLlBsYW50cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdW5ndXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSHltZW5vcHRlcmFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpY2hlbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaXZlcndvcnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFtbWFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vbGx1c2MiKSwNCiAgICAgICAgeGxhYj0iVGF4YSIsIHlsYWI9Ik51bWJlciBvZiBzcGVjaWVzIiwgeWxpbT1jKDAsNjAwKSkNCg0KYGBgDQoNCg0KUkVUTw0KDQpgYGB7cn0NCnNwYXJyb3cgPC0gbWVhbigyMiwgMjQsIDIxKQ0Ka2luZ2Zpc2hlciA8LSBtZWFuKDI2LCAyMywgMjUpDQplYWdsZSA8LSBtZWFuKDE5NSwgMjAxLCAxODUpDQpodW1taW5nYmlyZCA8LSBtZWFuKDgsIDksIDkpDQpgYGANCg0KDQpgYGB7cn0NCndpbmdzcGFuIDwtIGMoc3BhcnJvdywga2luZ2Zpc2hlciwgZWFnbGUsIGh1bW1pbmdiaXJkKQ0KYGBgDQoNCmBgYHtyfQ0KYmlyZF9zcCA8LSBjKCJzcGFycm93IiwgImtpbmdmaXNoZXIiLCAiZWFnbGUiLCAiaHVtbWluZ2JpcmQiKQ0KYGBgDQoNCmBgYHtyfQ0KY2xhc3MoYmlyZF9zcCkgICAgICAgICAgICAgICAgICAgICAgDQpiaXJkX3NwIDwtIGFzLmZhY3RvcihiaXJkX3NwKSAgICAgICANCmNsYXNzKGJpcmRfc3ApICAgICAgICAgICAgICAgICAgICAgIA0KYGBgDQoNCmBgYHtyfQ0Kd2luZ3MgPC0gZGF0YS5mcmFtZShiaXJkX3NwLCB3aW5nc3BhbikNCg0KYGBgDQoNCmBgYHtyfQ0KcG5nKCJ3aW5nc3Bhbl9wbG90LnBuZyIsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkNCmJhcnBsb3Qod2luZ3Mkd2luZ3NwYW4sIG5hbWVzLmFyZyA9IHdpbmdzJGJpcmRfc3AsICAgIA0KICAgICAgICB4bGFiID0gIkJpcmQiLCANCiAgICAgICAgeWxhYiA9ICJBdmVyYWdlIHdpbmdzcGFuIChjbSkiLCAgICAgICAgICAgICAgIA0KICAgICAgICB5bGltID0gYygwLCAyMDApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgIGNvbCA9ICJncmVlbiIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmRldi5vZmYoKQ0KDQpgYGANCg0KDQpBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ3RybCtBbHQrSSouDQpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkN0cmwrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4NCg0KVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLg0K