En este documento se mostrará el análisis realizado a los datos de la encuesta realizada a los integrantes del salón, del curso de seminario de construcción con enfoque en herramientas estadísticas.
Lo primero que se realiza es cargar la matriz donde se encuentran los datos recolectados, y se muestran las variables a evaluar en la encuesta:
E<-read.csv("LibroEjercicio.csv", sep = ";")
names(E)
[1] "NOMBRE" "EDAD" "ESTATURA" "PESO..Kg."
[5] "PROFESIÓN" "CANT..HIJOS" "ESTRATO" "CANT..HERMANO"
[9] "MATRICULADO" "ESTADO.CIVIL" "LUGAR.DE.ORIGEN" "SEXO"
library(ggplot2)
ggplot(E, aes(x = EDAD)) + geom_histogram(breaks = seq(20, 40, by = 5), col = "black", fill = "deeppink4") + ggtitle("Edad") + ylab("No. Encuestados") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 14, by = 2), limits = c(0,14)) + xlab("Edad [Años]") + annotate("text", x = c(22.5, 27.5, 32.5, 37.5), y = c(12.5, 6.5, 1.5, 2.5), label = c("50%", "25%", "4.17%", "8.33%"))

ggplot(E, aes(x = ESTATURA)) + geom_histogram(breaks = seq(1.5, 1.9, by = 0.1), col = "black", fill = "darkturquoise") + ggtitle("Estatura") + ylab("No. Encuestados") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 10, by = 2), limits = c(0,10)) + xlab("Estatura [m]") + annotate("text", x = c(1.55, 1.65, 1.75, 1.85), y = c(9.5, 7.5, 5.5, 3.5), label = c("37.5%", "29.17%", "20.83%", "12.5%"))

ggplot(E, aes(x = C$PESO..Kg.)) + geom_histogram(breaks = seq(50, 80, by = 6), col = "black", fill = "midnightblue") + ggtitle("Peso") + ylab("No. Encuestados") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 7, by = 1), limits = c(0,7)) + xlab("Peso [Kg]") + scale_x_continuous(breaks = seq(50, 80, by = 6), limits = c(50,80)) + annotate("text", x = c(53, 59, 65, 71, 77), y = c(4.5, 6.5, 2.5, 4.5, 6.5), label = c("16.67%", "25%", "8.33%", "16.67%", "25%"))

NA
PRO<-as.data.frame(prop.table(table(E$PROFESIÓN))*100)
colnames(PRO)<-c("PROFESION", "PORCENTAJE")
k<-c("Pregrado", "Postgrado", "Doctorado")
v<-c("1", "2", "3")
ggplot(PRO, aes(x = PROFESION, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.8, fill = "royalblue3") + ggtitle("Nivel Educativo") + xlab("") + ylab("% Encuestados") + theme(plot.title = element_text(hjust = 0.5)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 1), "%")), position = position_dodge(width = 0.5), size=4, vjust=-0.5, hjust=0.5 ,col="black") + scale_x_discrete(breaks = v, labels = k) + scale_y_continuous(breaks = seq(0, 80, by = 5), limits = c(0,80))

H<-as.data.frame(prop.table(table(E$CANT..HIJOS))*100)
colnames(H)<-c("HIJOS", "PORCENTAJE")
ggplot(H, aes(x = HIJOS, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.8, fill = "palevioletred4") + ggtitle("No. Hijos") + ylab("% Encuestados") + theme(plot.title = element_text(hjust = 0.5)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 1), "%")), position = position_dodge(width = 0.5), size=4, vjust=0.5, hjust=-0.2 ,col="black") + scale_y_continuous(breaks = seq(0, 80, by = 5), limits = c(0,80)) + xlab("No. Hijos") + coord_flip()

Est<-as.data.frame(prop.table(table(E$ESTRATO))*100)
colnames(Est)<-c("Estrato", "PORCENTAJE")
ggplot(Est, aes(x = Estrato, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.8, fill = "seagreen4") + ggtitle("Estrato") + xlab("") + ylab("% Encuestados") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 60, by = 5), limits = c(0,60)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 2), "%")), position = position_dodge(width = 0.5), size=4, vjust=0.5, hjust=-0.2 ,col="black") + scale_x_discrete(breaks = c("1","2","3","4","5"), labels = c("Estrato 1", "Estrato 2", "Estrato 3", "Estrato 4", "Estrato 5")) + coord_flip()

HE<-as.data.frame(prop.table(table(E$CANT..HERMANO))*100)
colnames(HE)<-c("Hermanos", "PORCENTAJE")
ggplot(HE, aes(x = Hermanos, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.8, fill = "pink4", col = "black") + ggtitle("No. Hermanos") + xlab("No. Hermanos") + ylab("% Encuestados") + theme(plot.title = element_text(hjust = 0.5)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 2), "%")), position = position_dodge(width = 0.5), size=4, vjust=-0.5, hjust=0.5 ,col="black") + scale_y_continuous(breaks = seq(0, 30, by = 5), limits = c(0,30))

M<-as.data.frame(prop.table(table(E$MATRICULADO))*100)
colnames(M)<-c("MATRICULADO", "PORCENTAJE")
library(ggplot2)
ggplot(M, aes(x="", y = PORCENTAJE, fill = MATRICULADO)) + geom_bar(stat = "identity", width = 1)+coord_polar("y", start=0)+scale_fill_brewer(palette = "Spectral", labels=c("Si","No"))+ labs(title = "Matriculados", x = NULL, y = NULL, fill = "")+scale_x_discrete(labels=NULL,breaks = NULL)+scale_y_discrete(labels=NULL,breaks = NULL)+ geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 1), "%")), position = position_dodge(width = 1), size=5, vjust=-3.5, hjust=0.7 ,col="black")+ylim(0, 100)+ theme(plot.title = element_text(hjust = 0.5)) + theme(legend.position = "right", legend.background = element_rect(fill = "white", size = 0.5, linetype = "solid"))
Scale for 'y' is already present. Adding another scale for 'y', which will replace
the existing scale.

EC<-as.data.frame(prop.table(table(E$ESTADO.CIVIL))*100)
colnames(EC)<-c("ECI", "PORCENTAJE")
library(ggplot2)
ggplot(EC, aes(x="", y = PORCENTAJE, fill = ECI)) + geom_bar(stat = "identity", width = 1)+coord_polar("y", start=0)+scale_fill_brewer(palette = "Set2", labels=c("Soltero","Casado"))+ labs(title = "Estado Civil", x = NULL, y = NULL, fill = "")+scale_x_discrete(labels=NULL,breaks = NULL)+scale_y_discrete(labels=NULL,breaks = NULL)+ geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 1), "%")), position = position_dodge(width = 1), size=4, vjust=0, hjust=1.2 ,col="black")+ylim(0, 100)+ theme(plot.title = element_text(hjust = 0.5)) + theme(legend.position = "right", legend.background = element_rect(fill = "white", size = 0.5, linetype = "solid"))
Scale for 'y' is already present. Adding another scale for 'y', which will replace
the existing scale.

R<-as.data.frame(prop.table(table(E$LUGAR.DE.ORIGEN))*100)
colnames(R)<-c("L", "PORCENTAJE")
ggplot(R, aes(x = L, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.8, fill = "orangered") + ggtitle("Departamento") + xlab("") + ylab("% Encuestados") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 80, by = 10), limits = c(0,80)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 2), "%")), position = position_dodge(width = 0.5), size=4, vjust=-0.5, hjust=0.5 ,col="black") + scale_x_discrete(breaks = c("1","2", "3","4","5"), labels = c("Valle del Cauca", "Cauca", "Quindio", "Nariño", "Cundinamarca"))

Sexo<-as.data.frame(prop.table(table(E$SEXO))*100)
colnames(Sexo)<-c("Sexo", "PORCENTAJE")
d<-c("HOMBRES", "MUJERES")
f<-c("1", "2")
library(ggplot2)
ggplot(Sexo, aes(x = Sexo, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.5, fill =c("turquoise4","violetred4")) + ggtitle("GÉNERO") + xlab("") + ylab("% ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 2), "%")), position = position_dodge(width = 0.5), size=4, vjust=-0.5, hjust=0.5 ,col="black") + scale_x_discrete(breaks = f, labels = d) + scale_y_continuous(breaks = seq(0, 60, by = 5), limits = c(0,60))

summary(E)
NOMBRE EDAD ESTATURA PESO..Kg. PROFESIÓN
ALEJANDRO ARCILA: 1 Min. :21.00 Min. :1.520 Min. :50.00 Min. :1.000
ANDRÉS CASANOVA : 1 1st Qu.:23.00 1st Qu.:1.595 1st Qu.:57.00 1st Qu.:1.000
ANGELA PEREZ : 1 Median :25.50 Median :1.660 Median :67.50 Median :1.000
ANGIE ALDEMAR : 1 Mean :28.71 Mean :1.673 Mean :67.46 Mean :1.375
ANGIE CABEZAS : 1 3rd Qu.:30.25 3rd Qu.:1.750 3rd Qu.:75.25 3rd Qu.:2.000
CARLOS ZAPATA : 1 Max. :49.00 Max. :1.880 Max. :98.00 Max. :3.000
(Other) :18
CANT..HIJOS ESTRATO CANT..HERMANO MATRICULADO ESTADO.CIVIL
Min. :0.0000 Min. :1.00 Min. :0.000 Min. :1.000 Min. :1.000
1st Qu.:0.0000 1st Qu.:3.00 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:1.000
Median :0.0000 Median :3.00 Median :2.000 Median :1.000 Median :1.000
Mean :0.4167 Mean :3.25 Mean :2.292 Mean :1.375 Mean :1.125
3rd Qu.:0.2500 3rd Qu.:4.00 3rd Qu.:3.250 3rd Qu.:2.000 3rd Qu.:1.000
Max. :3.0000 Max. :5.00 Max. :6.000 Max. :2.000 Max. :2.000
LUGAR.DE.ORIGEN SEXO
Min. :1.000 Min. :1.000
1st Qu.:1.000 1st Qu.:1.000
Median :1.000 Median :2.000
Mean :1.875 Mean :1.583
3rd Qu.:2.000 3rd Qu.:2.000
Max. :5.000 Max. :2.000
Promedio de edad = 28.7 años Estrato promedio = 3 Número de hijos promedio = 0 - 1 Con respecto a la edad, la mitad de los encuestados son menores de 25 años.
La profesora propone responder las siguientes preguntas a partir de la información suministrada por la encuesta.
¿Es posible conocer el número de estudiantes que van a aprobar el curso? Puede ser posible que se tenga conocimiento de los estudiantes que van a aprobar el curso si se tiene presenta la entrega del trabajo, pero no a partir de los datos, dado que las variables estudiadas no tienen alguna relación con el desempeño académico.
¿En el programa de ingeniería civil hay más hombres que mujeres? La tendencia de que haya más hombres que mujeres en una carrera de ingeniería civil es cada vez menor, dado que como es el caso de este curso, es mayor el número de mujeres que de hombres.
¿Cuál es la tendencia de los estudiantes de ingeniería civil con respecto a tener hijos? Teniendo en cuenta que la mayoría de estudiantes del curso son solteros, se encuentran en pregrado y no tienen hijos, no es conveniente hablar de la tendencia de los estudiantes con respecto a los hijos.
LS0tDQp0aXRsZTogIkVOQ1VFU1RBIENMQVNFIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCkVuIGVzdGUgZG9jdW1lbnRvIHNlIG1vc3RyYXLhIGVsIGFu4Wxpc2lzIHJlYWxpemFkbyBhIGxvcyBkYXRvcyBkZSBsYSBlbmN1ZXN0YSByZWFsaXphZGEgYSBsb3MgaW50ZWdyYW50ZXMgZGVsIHNhbPNuLCBkZWwgY3Vyc28gZGUgc2VtaW5hcmlvIGRlIGNvbnN0cnVjY2nzbiBjb24gZW5mb3F1ZSBlbiBoZXJyYW1pZW50YXMgZXN0YWTtc3RpY2FzLg0KDQpMbyBwcmltZXJvIHF1ZSBzZSByZWFsaXphIGVzIGNhcmdhciBsYSBtYXRyaXogZG9uZGUgc2UgZW5jdWVudHJhbiBsb3MgZGF0b3MgcmVjb2xlY3RhZG9zLCB5IHNlIG11ZXN0cmFuIGxhcyB2YXJpYWJsZXMgYSBldmFsdWFyIGVuIGxhIGVuY3Vlc3RhOg0KDQoNCmBgYHtyfQ0KRTwtcmVhZC5jc3YoIkxpYnJvRWplcmNpY2lvLmNzdiIsIHNlcCA9ICI7IikNCm5hbWVzKEUpDQpgYGANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KEUsIGFlcyh4ID0gRURBRCkpICsgZ2VvbV9oaXN0b2dyYW0oYnJlYWtzID0gc2VxKDIwLCA0MCwgYnkgPSA1KSwgY29sID0gImJsYWNrIiwgZmlsbCA9ICJkZWVwcGluazQiKSArIGdndGl0bGUoIkVkYWQiKSArIHlsYWIoIk5vLiBFbmN1ZXN0YWRvcyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxNCwgYnkgPSAyKSwgbGltaXRzID0gYygwLDE0KSkgKyB4bGFiKCJFZGFkIFtB8W9zXSIpICsgYW5ub3RhdGUoInRleHQiLCB4ID0gYygyMi41LCAyNy41LCAzMi41LCAzNy41KSwgeSA9IGMoMTIuNSwgNi41LCAxLjUsIDIuNSksIGxhYmVsID0gYygiNTAlIiwgIjI1JSIsICI0LjE3JSIsICI4LjMzJSIpKQ0KDQpnZ3Bsb3QoRSwgYWVzKHggPSBFU1RBVFVSQSkpICsgZ2VvbV9oaXN0b2dyYW0oYnJlYWtzID0gc2VxKDEuNSwgMS45LCBieSA9IDAuMSksIGNvbCA9ICJibGFjayIsIGZpbGwgPSAiZGFya3R1cnF1b2lzZSIpICsgZ2d0aXRsZSgiRXN0YXR1cmEiKSArIHlsYWIoIk5vLiBFbmN1ZXN0YWRvcyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgYnkgPSAyKSwgbGltaXRzID0gYygwLDEwKSkgKyB4bGFiKCJFc3RhdHVyYSBbbV0iKSArIGFubm90YXRlKCJ0ZXh0IiwgeCA9IGMoMS41NSwgMS42NSwgMS43NSwgMS44NSksIHkgPSBjKDkuNSwgNy41LCA1LjUsIDMuNSksIGxhYmVsID0gYygiMzcuNSUiLCAiMjkuMTclIiwgIjIwLjgzJSIsICIxMi41JSIpKQ0KDQpnZ3Bsb3QoRSwgYWVzKHggPSBDJFBFU08uLktnLikpICsgZ2VvbV9oaXN0b2dyYW0oYnJlYWtzID0gc2VxKDUwLCA4MCwgYnkgPSA2KSwgY29sID0gImJsYWNrIiwgZmlsbCA9ICJtaWRuaWdodGJsdWUiKSArIGdndGl0bGUoIlBlc28iKSArIHlsYWIoIk5vLiBFbmN1ZXN0YWRvcyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA3LCBieSA9IDEpLCBsaW1pdHMgPSBjKDAsNykpICsgeGxhYigiUGVzbyBbS2ddIikgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDUwLCA4MCwgYnkgPSA2KSwgbGltaXRzID0gYyg1MCw4MCkpICArIGFubm90YXRlKCJ0ZXh0IiwgeCA9IGMoNTMsIDU5LCA2NSwgNzEsIDc3KSwgeSA9IGMoNC41LCA2LjUsIDIuNSwgNC41LCA2LjUpLCBsYWJlbCA9IGMoIjE2LjY3JSIsICIyNSUiLCAiOC4zMyUiLCAiMTYuNjclIiwgIjI1JSIpKQ0KIA0KDQpgYGANCg0KYGBge3J9DQpQUk88LWFzLmRhdGEuZnJhbWUocHJvcC50YWJsZSh0YWJsZShFJFBST0ZFU0nTTikpKjEwMCkNCmNvbG5hbWVzKFBSTyk8LWMoIlBST0ZFU0lPTiIsICJQT1JDRU5UQUpFIikNCg0KazwtYygiUHJlZ3JhZG8iLCAiUG9zdGdyYWRvIiwgIkRvY3RvcmFkbyIpDQp2PC1jKCIxIiwgIjIiLCAiMyIpDQoNCmdncGxvdChQUk8sIGFlcyh4ID0gUFJPRkVTSU9OLCB5ID0gUE9SQ0VOVEFKRSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC44LCBmaWxsID0gInJveWFsYmx1ZTMiKSArIGdndGl0bGUoIk5pdmVsIEVkdWNhdGl2byIpICsgeGxhYigiIikgKyB5bGFiKCIlIEVuY3Vlc3RhZG9zIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBnZW9tX3RleHQoYWVzKHkgPSBQT1JDRU5UQUpFLCBsYWJlbCA9IHBhc3RlKHJvdW5kKFBPUkNFTlRBSkUsIDEpLCAiJSIpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksIHNpemU9NCwgdmp1c3Q9LTAuNSwgaGp1c3Q9MC41ICxjb2w9ImJsYWNrIikgKyBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IHYsIGxhYmVscyA9IGspICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA4MCwgYnkgPSA1KSwgbGltaXRzID0gYygwLDgwKSkNCmBgYA0KDQpgYGB7cn0NCkg8LWFzLmRhdGEuZnJhbWUocHJvcC50YWJsZSh0YWJsZShFJENBTlQuLkhJSk9TKSkqMTAwKQ0KY29sbmFtZXMoSCk8LWMoIkhJSk9TIiwgIlBPUkNFTlRBSkUiKQ0KDQoNCg0KZ2dwbG90KEgsIGFlcyh4ID0gSElKT1MsIHkgPSBQT1JDRU5UQUpFKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjgsIGZpbGwgPSAicGFsZXZpb2xldHJlZDQiKSArIGdndGl0bGUoIk5vLiBIaWpvcyIpICsgeWxhYigiJSBFbmN1ZXN0YWRvcyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgZ2VvbV90ZXh0KGFlcyh5ID0gUE9SQ0VOVEFKRSwgbGFiZWwgPSBwYXN0ZShyb3VuZChQT1JDRU5UQUpFLCAxKSwgIiUiKSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLCBzaXplPTQsIHZqdXN0PTAuNSwgaGp1c3Q9LTAuMiAsY29sPSJibGFjayIpICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA4MCwgYnkgPSA1KSwgbGltaXRzID0gYygwLDgwKSkgKyB4bGFiKCJOby4gSGlqb3MiKSArIGNvb3JkX2ZsaXAoKQ0KYGBgDQpgYGB7cn0NCkVzdDwtYXMuZGF0YS5mcmFtZShwcm9wLnRhYmxlKHRhYmxlKEUkRVNUUkFUTykpKjEwMCkNCmNvbG5hbWVzKEVzdCk8LWMoIkVzdHJhdG8iLCAiUE9SQ0VOVEFKRSIpDQoNCg0KZ2dwbG90KEVzdCwgYWVzKHggPSBFc3RyYXRvLCB5ID0gUE9SQ0VOVEFKRSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC44LCBmaWxsID0gInNlYWdyZWVuNCIpICsgZ2d0aXRsZSgiRXN0cmF0byIpICsgeGxhYigiIikgKyB5bGFiKCIlIEVuY3Vlc3RhZG9zIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDYwLCBieSA9IDUpLCBsaW1pdHMgPSBjKDAsNjApKSArIGdlb21fdGV4dChhZXMoeSA9IFBPUkNFTlRBSkUsIGxhYmVsID0gcGFzdGUocm91bmQoUE9SQ0VOVEFKRSwgMiksICIlIikpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwgc2l6ZT00LCB2anVzdD0wLjUsIGhqdXN0PS0wLjIgLGNvbD0iYmxhY2siKSArIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiKSwgbGFiZWxzID0gYygiRXN0cmF0byAxIiwgIkVzdHJhdG8gMiIsICJFc3RyYXRvIDMiLCAiRXN0cmF0byA0IiwgIkVzdHJhdG8gNSIpKSArIGNvb3JkX2ZsaXAoKQ0KYGBgDQoNCmBgYHtyfQ0KSEU8LWFzLmRhdGEuZnJhbWUocHJvcC50YWJsZSh0YWJsZShFJENBTlQuLkhFUk1BTk8pKSoxMDApDQpjb2xuYW1lcyhIRSk8LWMoIkhlcm1hbm9zIiwgIlBPUkNFTlRBSkUiKQ0KDQoNCmdncGxvdChIRSwgYWVzKHggPSBIZXJtYW5vcywgeSA9IFBPUkNFTlRBSkUpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuOCwgZmlsbCA9ICJwaW5rNCIsICBjb2wgPSAiYmxhY2siKSArIGdndGl0bGUoIk5vLiBIZXJtYW5vcyIpICsgeGxhYigiTm8uIEhlcm1hbm9zIikgKyB5bGFiKCIlIEVuY3Vlc3RhZG9zIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBnZW9tX3RleHQoYWVzKHkgPSBQT1JDRU5UQUpFLCBsYWJlbCA9IHBhc3RlKHJvdW5kKFBPUkNFTlRBSkUsIDIpLCAiJSIpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksIHNpemU9NCwgdmp1c3Q9LTAuNSwgaGp1c3Q9MC41ICxjb2w9ImJsYWNrIikgKyBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDMwLCBieSA9IDUpLCBsaW1pdHMgPSBjKDAsMzApKQ0KYGBgDQpgYGB7cn0NCk08LWFzLmRhdGEuZnJhbWUocHJvcC50YWJsZSh0YWJsZShFJE1BVFJJQ1VMQURPKSkqMTAwKQ0KY29sbmFtZXMoTSk8LWMoIk1BVFJJQ1VMQURPIiwgIlBPUkNFTlRBSkUiKQ0KDQoNCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChNLCBhZXMoeD0iIiwgeSA9IFBPUkNFTlRBSkUsIGZpbGwgPSBNQVRSSUNVTEFETykpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMSkrY29vcmRfcG9sYXIoInkiLCBzdGFydD0wKStzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNwZWN0cmFsIiwgbGFiZWxzPWMoIlNpIiwiTm8iKSkrIGxhYnModGl0bGUgPSAiTWF0cmljdWxhZG9zIiwgeCA9IE5VTEwsIHkgPSBOVUxMLCBmaWxsID0gIiIpK3NjYWxlX3hfZGlzY3JldGUobGFiZWxzPU5VTEwsYnJlYWtzID0gTlVMTCkrc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9TlVMTCxicmVha3MgPSBOVUxMKSsgZ2VvbV90ZXh0KGFlcyh5ID0gUE9SQ0VOVEFKRSwgbGFiZWwgPSBwYXN0ZShyb3VuZChQT1JDRU5UQUpFLCAxKSwgIiUiKSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSwgc2l6ZT01LCB2anVzdD0tMy41LCBoanVzdD0wLjcgLGNvbD0iYmxhY2siKSt5bGltKDAsIDEwMCkrIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpKQ0KYGBgDQpgYGB7cn0NCkVDPC1hcy5kYXRhLmZyYW1lKHByb3AudGFibGUodGFibGUoRSRFU1RBRE8uQ0lWSUwpKSoxMDApDQpjb2xuYW1lcyhFQyk8LWMoIkVDSSIsICJQT1JDRU5UQUpFIikNCg0KDQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoRUMsIGFlcyh4PSIiLCB5ID0gUE9SQ0VOVEFKRSwgZmlsbCA9IEVDSSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMSkrY29vcmRfcG9sYXIoInkiLCBzdGFydD0wKStzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiLCBsYWJlbHM9YygiU29sdGVybyIsIkNhc2FkbyIpKSsgbGFicyh0aXRsZSA9ICJFc3RhZG8gQ2l2aWwiLCB4ID0gTlVMTCwgeSA9IE5VTEwsIGZpbGwgPSAiIikrc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9TlVMTCxicmVha3MgPSBOVUxMKStzY2FsZV95X2Rpc2NyZXRlKGxhYmVscz1OVUxMLGJyZWFrcyA9IE5VTEwpKyBnZW9tX3RleHQoYWVzKHkgPSBQT1JDRU5UQUpFLCBsYWJlbCA9IHBhc3RlKHJvdW5kKFBPUkNFTlRBSkUsIDEpLCAiJSIpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpLCBzaXplPTQsIHZqdXN0PTAsIGhqdXN0PTEuMiAsY29sPSJibGFjayIpK3lsaW0oMCwgMTAwKSsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIHNpemUgPSAwLjUsIGxpbmV0eXBlID0gInNvbGlkIikpDQpgYGANCmBgYHtyfQ0KUjwtYXMuZGF0YS5mcmFtZShwcm9wLnRhYmxlKHRhYmxlKEUkTFVHQVIuREUuT1JJR0VOKSkqMTAwKQ0KY29sbmFtZXMoUik8LWMoIkwiLCAiUE9SQ0VOVEFKRSIpDQoNCg0KZ2dwbG90KFIsIGFlcyh4ID0gTCwgeSA9IFBPUkNFTlRBSkUpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuOCwgZmlsbCA9ICJvcmFuZ2VyZWQiKSArIGdndGl0bGUoIkRlcGFydGFtZW50byIpICsgeGxhYigiIikgKyB5bGFiKCIlIEVuY3Vlc3RhZG9zIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDgwLCBieSA9IDEwKSwgbGltaXRzID0gYygwLDgwKSkgKyBnZW9tX3RleHQoYWVzKHkgPSBQT1JDRU5UQUpFLCBsYWJlbCA9IHBhc3RlKHJvdW5kKFBPUkNFTlRBSkUsIDIpLCAiJSIpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksIHNpemU9NCwgdmp1c3Q9LTAuNSwgaGp1c3Q9MC41ICxjb2w9ImJsYWNrIikgKyBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IGMoIjEiLCIyIiwgIjMiLCI0IiwiNSIpLCBsYWJlbHMgPSBjKCJWYWxsZSBkZWwgQ2F1Y2EiLCAiQ2F1Y2EiLCAiUXVpbmRpbyIsICJOYXJp8W8iLCAiQ3VuZGluYW1hcmNhIikpIA0KYGBgDQpgYGB7cn0NClNleG88LWFzLmRhdGEuZnJhbWUocHJvcC50YWJsZSh0YWJsZShFJFNFWE8pKSoxMDApDQpjb2xuYW1lcyhTZXhvKTwtYygiU2V4byIsICJQT1JDRU5UQUpFIikNCg0KZDwtYygiSE9NQlJFUyIsICJNVUpFUkVTIikNCmY8LWMoIjEiLCAiMiIpDQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoU2V4bywgYWVzKHggPSBTZXhvLCB5ID0gUE9SQ0VOVEFKRSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC41LCBmaWxsID1jKCJ0dXJxdW9pc2U0IiwidmlvbGV0cmVkNCIpKSArIGdndGl0bGUoIkfJTkVSTyIpICsgeGxhYigiIikgKyB5bGFiKCIlIEVOQ1VFU1RBRE9TIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBnZW9tX3RleHQoYWVzKHkgPSBQT1JDRU5UQUpFLCBsYWJlbCA9IHBhc3RlKHJvdW5kKFBPUkNFTlRBSkUsIDIpLCAiJSIpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksIHNpemU9NCwgdmp1c3Q9LTAuNSwgaGp1c3Q9MC41ICxjb2w9ImJsYWNrIikgKyBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IGYsIGxhYmVscyA9IGQpICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA2MCwgYnkgPSA1KSwgbGltaXRzID0gYygwLDYwKSkNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkoRSkNCmBgYA0KUHJvbWVkaW8gZGUgZWRhZCA9IDI4LjcgYfFvcw0KRXN0cmF0byBwcm9tZWRpbyA9IDMNCk76bWVybyBkZSBoaWpvcyBwcm9tZWRpbyA9IDAgLSAxDQpDb24gcmVzcGVjdG8gYSBsYSBlZGFkLCBsYSBtaXRhZCBkZSBsb3MgZW5jdWVzdGFkb3Mgc29uIG1lbm9yZXMgZGUgMjUgYfFvcy4NCg0KTGEgcHJvZmVzb3JhIHByb3BvbmUgcmVzcG9uZGVyIGxhcyBzaWd1aWVudGVzIHByZWd1bnRhcyBhIHBhcnRpciBkZSBsYSBpbmZvcm1hY2nzbiBzdW1pbmlzdHJhZGEgcG9yIGxhIGVuY3Vlc3RhLg0KDQoxKSC/RXMgcG9zaWJsZSBjb25vY2VyIGVsIG76bWVybyBkZSBlc3R1ZGlhbnRlcyBxdWUgdmFuIGEgYXByb2JhciBlbCBjdXJzbz8NClB1ZWRlIHNlciBwb3NpYmxlIHF1ZSBzZSB0ZW5nYSBjb25vY2ltaWVudG8gZGUgbG9zIGVzdHVkaWFudGVzIHF1ZSB2YW4gYSBhcHJvYmFyIGVsIGN1cnNvIHNpIHNlIHRpZW5lIHByZXNlbnRhIGxhIGVudHJlZ2EgZGVsIHRyYWJham8sIHBlcm8gbm8gYSBwYXJ0aXIgZGUgbG9zIGRhdG9zLCBkYWRvIHF1ZSBsYXMgdmFyaWFibGVzIGVzdHVkaWFkYXMgbm8gdGllbmVuIGFsZ3VuYSByZWxhY2nzbiBjb24gZWwgZGVzZW1wZfFvIGFjYWTpbWljby4NCg0KMikgv0VuIGVsIHByb2dyYW1hIGRlIGluZ2VuaWVy7WEgY2l2aWwgaGF5IG3hcyBob21icmVzIHF1ZSBtdWplcmVzPw0KTGEgdGVuZGVuY2lhIGRlIHF1ZSBoYXlhIG3hcyBob21icmVzIHF1ZSBtdWplcmVzIGVuIHVuYSBjYXJyZXJhIGRlIGluZ2VuaWVy7WEgY2l2aWwgZXMgY2FkYSB2ZXogbWVub3IsIGRhZG8gcXVlIGNvbW8gZXMgZWwgY2FzbyBkZSBlc3RlIGN1cnNvLCBlcyBtYXlvciBlbCBu+m1lcm8gZGUgbXVqZXJlcyBxdWUgZGUgaG9tYnJlcy4NCg0KMykgv0N14WwgZXMgbGEgdGVuZGVuY2lhIGRlIGxvcyBlc3R1ZGlhbnRlcyBkZSBpbmdlbmllcu1hIGNpdmlsIGNvbiByZXNwZWN0byBhIHRlbmVyIGhpam9zPw0KVGVuaWVuZG8gZW4gY3VlbnRhIHF1ZSBsYSBtYXlvcu1hIGRlIGVzdHVkaWFudGVzIGRlbCBjdXJzbyBzb24gc29sdGVyb3MsIHNlIGVuY3VlbnRyYW4gZW4gcHJlZ3JhZG8geSBubyB0aWVuZW4gaGlqb3MsIG5vIGVzIGNvbnZlbmllbnRlIGhhYmxhciBkZSBsYSB0ZW5kZW5jaWEgZGUgbG9zIGVzdHVkaWFudGVzIGNvbiByZXNwZWN0byBhIGxvcyBoaWpvcy4g