Se realizó un análisis horario de los valores de Pol, Brix y Pureza
reportados por el Core Sampler.
El objetivo es verificar la hipótesis de que durante cierto rango de
horas del día los valores de Pol, Brix y Pureza tienden a ser más altos
que en el resto de horas. Específicamente, durante las primeras
horas del día.
Verificación de Rangos
Se examinan los promedios de Pol, Brix y Pureza para los siguientes
rangos horarios:
- Rango 1: 0 a 7 horas
- Rango 2: 8 a 15 horas
- Rango 3: 16 a 23 horas
Y, para cada Rango, se analizan distintos horizontes temporales:
- Horizonte 1: 10 NOV al 30 NOV
- Horizonte 2: 10 NOV al 14 DIC
- Horizonte 3: 10 NOV al 28 DIC
df1 <- dataset %>% filter(Fecha < '2023-11-30')
df1_dist <- df1 %>% group_by(hora) %>% summarise(Pol = mean(Pol, na.rm = TRUE), Brix = mean(Brix, na.rm = TRUE),
Pureza = mean(Pureza, na.rm = TRUE) , ensayos = n())
df2 <- dataset %>% filter(Fecha < '2023-12-14')
df2_dist <- df2 %>% group_by(hora) %>% summarise(Pol = mean(Pol, na.rm = TRUE), Brix = mean(Brix, na.rm = TRUE),
Pureza = mean(Pureza, na.rm = TRUE) , ensayos = n())
df3 <- dataset %>% filter(Fecha < '2023-12-28')
df3_dist <- df3 %>% group_by(hora) %>% summarise(Pol = mean(Pol, na.rm = TRUE), Brix = mean(Brix, na.rm = TRUE),
Pureza = mean(Pureza, na.rm = TRUE) , ensayos = n())
Promedios Horizonte 1: 10 NOV al 30 NOV
NOV30_Primero <- df1_dist %>% filter(hora %in% (0:7) ) %>%
summarise(Pol_Promedio = mean(Pol, na.rm = TRUE), Brix_Promedio = mean(Brix, na.rm = TRUE), Pureza_Promedio = mean(Pureza, na.rm = TRUE))
NOV30_Segundo <- df1_dist %>% filter(hora %in% (8:15) ) %>%
summarise(Pol_Promedio = mean(Pol, na.rm = TRUE), Brix_Promedio = mean(Brix, na.rm = TRUE), Pureza_Promedio = mean(Pureza, na.rm = TRUE))
NOV30_Tercero <- df1_dist %>% filter(hora %in% (16:23) ) %>%
summarise(Pol_Promedio = mean(Pol, na.rm = TRUE), Brix_Promedio = mean(Brix, na.rm = TRUE), Pureza_Promedio = mean(Pureza, na.rm = TRUE))
df1_Pol <- data.frame("Variable" = c("Pol","Brix","Pureza"),
"de 0 a 7 horas" = c(NOV30_Primero$Pol_Promedio,NOV30_Primero$Brix_Promedio, NOV30_Primero$Pureza_Promedio),
"de 8 a 15 horas" = c(NOV30_Segundo$Pol_Promedio,NOV30_Segundo$Brix_Promedio, NOV30_Segundo$Pureza_Promedio),
"de 16 a 23 horas" = c(NOV30_Tercero$Pol_Promedio,NOV30_Tercero$Brix_Promedio, NOV30_Tercero$Pureza_Promedio)
)
df1_Pol
Promedios Horizonte 2: 10 NOV al 14 DIC
DIC14_Primero <- df2_dist %>% filter(hora %in% (0:7) ) %>%
summarise(Pol_Promedio = mean(Pol, na.rm = TRUE), Brix_Promedio = mean(Brix, na.rm = TRUE), Pureza_Promedio = mean(Pureza, na.rm = TRUE))
DIC14_Segundo <- df2_dist %>% filter(hora %in% (8:15) ) %>%
summarise(Pol_Promedio = mean(Pol, na.rm = TRUE), Brix_Promedio = mean(Brix, na.rm = TRUE), Pureza_Promedio = mean(Pureza, na.rm = TRUE))
DIC14_Tercero <- df2_dist %>% filter(hora %in% (16:23) ) %>%
summarise(Pol_Promedio = mean(Pol, na.rm = TRUE), Brix_Promedio = mean(Brix, na.rm = TRUE), Pureza_Promedio = mean(Pureza, na.rm = TRUE))
df2_Pol <- data.frame("Variable" = c("Pol","Brix","Pureza"),
"de 0 a 7 horas" = c(DIC14_Primero$Pol_Promedio,DIC14_Primero$Brix_Promedio, DIC14_Primero$Pureza_Promedio),
"de 8 a 15 horas" = c(DIC14_Segundo$Pol_Promedio,DIC14_Segundo$Brix_Promedio, DIC14_Segundo$Pureza_Promedio),
"de 16 a 23 horas" = c(DIC14_Tercero$Pol_Promedio,DIC14_Tercero$Brix_Promedio, DIC14_Tercero$Pureza_Promedio)
)
df2_Pol
Promedios Horizonte 3: 10 NOV al 28 DIC
DIC28_Primero <- df3_dist %>% filter(hora %in% (0:7) ) %>%
summarise(Pol_Promedio = mean(Pol, na.rm = TRUE), Brix_Promedio = mean(Brix, na.rm = TRUE), Pureza_Promedio = mean(Pureza, na.rm = TRUE))
DIC28_Segundo <- df3_dist %>% filter(hora %in% (8:15) ) %>%
summarise(Pol_Promedio = mean(Pol, na.rm = TRUE), Brix_Promedio = mean(Brix, na.rm = TRUE), Pureza_Promedio = mean(Pureza, na.rm = TRUE))
DIC28_Tercero <- df3_dist %>% filter(hora %in% (16:23) ) %>%
summarise(Pol_Promedio = mean(Pol, na.rm = TRUE), Brix_Promedio = mean(Brix, na.rm = TRUE), Pureza_Promedio = mean(Pureza, na.rm = TRUE))
df3_Pol <- data.frame("Variable" = c("Pol","Brix","Pureza"),
"de 0 a 7 horas" = c(DIC28_Primero$Pol_Promedio,DIC28_Primero$Brix_Promedio, DIC28_Primero$Pureza_Promedio),
"de 8 a 15 horas" = c(DIC28_Segundo$Pol_Promedio,DIC28_Segundo$Brix_Promedio, DIC28_Segundo$Pureza_Promedio),
"de 16 a 23 horas" = c(DIC28_Tercero$Pol_Promedio,DIC28_Tercero$Brix_Promedio, DIC28_Tercero$Pureza_Promedio)
)
df3_Pol
Puede observarse que efectivamente, a nivel de
promedios las primeras horas del día tienden a tener
valores más elevados que en las últimas horas del día. Sin embargo, es
necesario verificar el soporte de datos en cada rango, para la
significancia estadística. Por ello, se analiza el número de
muestreos por rango de horas.
# Bar Plots:
barplot(height=df3_dist$ensayos, names=df3_dist$hora, col = "light green", xlab = "Hora Muestreo", ylab = "Acumulado Muestras", cex.axis=0.5, cex.names=0.5)
barplot(height=df2_dist$ensayos, names=df2_dist$hora, col = "green", cex.axis=0.5, cex.names=0.5, add = TRUE)
barplot(height=df1_dist$ensayos, names=df1_dist$hora, col = "dark green", cex.axis=0.5, cex.names=0.5, add = TRUE)
legend("top", title="Período", legend= c("al 30-Nov","al 14-Dic","al 28-Dic"), fill =c("dark green", "green", "light green" ), box.lty=0)

En este caso, NO se cuenta con un soporte uniforme.
Es decir, el número de muestras que se registran en las
primeras horas del día es consistentemente menor que el número de
muestras que se registran a medida que avanza el día.
Aún más, en el inicio de la zafra (Horizonte 1) fue el único período
en el que se registraron muestras en las primeras horas (Rango 1). A
medida que avanzó la zafra, los registros se fueron acumulando hacia el
final del día, hasta la situación actual, donde parecieran concentrarse
los registros en la última hora del día (antes de la media noche).
LS0tDQp0aXRsZTogIkFuYWxpc2lzIGRlIFZhbG9yZXMgQ29yZSBTYW1wbGVyIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KU2UgcmVhbGl6w7MgdW4gYW7DoWxpc2lzIGhvcmFyaW8gZGUgbG9zIHZhbG9yZXMgZGUgUG9sLCBCcml4IHkgUHVyZXphIHJlcG9ydGFkb3MgcG9yIGVsICpDb3JlIFNhbXBsZXIqLg0KDQpFbCBvYmpldGl2byBlcyB2ZXJpZmljYXIgbGEgaGlww7N0ZXNpcyBkZSBxdWUgZHVyYW50ZSBjaWVydG8gcmFuZ28gZGUgaG9yYXMgZGVsIGTDrWEgbG9zIHZhbG9yZXMgZGUgUG9sLCBCcml4IHkgUHVyZXphIHRpZW5kZW4gYSBzZXIgbcOhcyBhbHRvcyBxdWUgZW4gZWwgcmVzdG8gZGUgaG9yYXMuIEVzcGVjw61maWNhbWVudGUsICoqZHVyYW50ZSBsYXMgcHJpbWVyYXMgaG9yYXMgZGVsIGTDrWEuKioNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoZHBseXIpDQpgYGANCg0KIyMjIENvbmp1bnRvIGRlIERhdG9zIE11ZXN0cmFzIENvcmUgU2FtcGxlcg0KRXN0ZSBjb25qdW50byBkZSBkYXRvcyBzZSBvYnR1dm8gZGUgbGEgYmFzZSBkZSBkYXRvcyBMZWdhY3kgZGUgTGFib3JhdG9yaW8NCg0KYGBge3J9DQpkYXRhc2V0IDwtIHJlYWQuY3N2KGZpbGUgPSAnQzovVXNlcnMvc2JhcnJpb3MvT25lRHJpdmUgLSBVbml2ZXJzaWRhZCBHYWxpbGVvL0RhdGEgU2NpZW5jZS9SL1Byb3llY3Rvcy9QYW50YWxlb24vTWF4L0RhdG9zX0Nhw7FhLmNzdicpDQpkYXRhc2V0JEZlY2hhIDwtIGFzLkRhdGUoZGF0YXNldCRGZWNoYSxmb3JtYXQgPSAiJWQvJW0vJVkiKQ0KZGF0YXNldA0KYGBgDQojIyMgVmVyaWZpY2FjacOzbiBkZSBSYW5nb3MNCg0KU2UgZXhhbWluYW4gbG9zIHByb21lZGlvcyBkZSBQb2wsIEJyaXggeSBQdXJlemEgcGFyYSBsb3Mgc2lndWllbnRlcyByYW5nb3MgaG9yYXJpb3M6DQoNCi0gKipSYW5nbyAxOioqIDAgYSA3IGhvcmFzIA0KLSAqKlJhbmdvIDI6KiogOCBhIDE1IGhvcmFzDQotICoqUmFuZ28gMzoqKiAxNiBhIDIzIGhvcmFzDQoNClksIHBhcmEgY2FkYSBSYW5nbywgc2UgYW5hbGl6YW4gZGlzdGludG9zIGhvcml6b250ZXMgdGVtcG9yYWxlczoNCg0KLSAqKkhvcml6b250ZSAxOioqIDEwIE5PViBhbCAzMCBOT1YNCi0gKipIb3Jpem9udGUgMjoqKiAxMCBOT1YgYWwgMTQgRElDDQotICoqSG9yaXpvbnRlIDM6KiogMTAgTk9WIGFsIDI4IERJQw0KDQpgYGB7cn0NCmRmMSA8LSBkYXRhc2V0ICU+JSBmaWx0ZXIoRmVjaGEgPCAnMjAyMy0xMS0zMCcpDQpkZjFfZGlzdCA8LSBkZjEgJT4lICBncm91cF9ieShob3JhKSAlPiUgc3VtbWFyaXNlKFBvbCA9IG1lYW4oUG9sLCBuYS5ybSA9IFRSVUUpLCBCcml4ID0gbWVhbihCcml4LCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHVyZXphID0gbWVhbihQdXJlemEsIG5hLnJtID0gVFJVRSkgLCBlbnNheW9zID0gbigpKQ0KDQpkZjIgPC0gZGF0YXNldCAlPiUgZmlsdGVyKEZlY2hhIDwgJzIwMjMtMTItMTQnKQ0KZGYyX2Rpc3QgPC0gZGYyICU+JSAgZ3JvdXBfYnkoaG9yYSkgJT4lIHN1bW1hcmlzZShQb2wgPSBtZWFuKFBvbCwgbmEucm0gPSBUUlVFKSwgQnJpeCA9IG1lYW4oQnJpeCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1cmV6YSA9IG1lYW4oUHVyZXphLCBuYS5ybSA9IFRSVUUpICwgZW5zYXlvcyA9IG4oKSkNCg0KZGYzIDwtIGRhdGFzZXQgJT4lIGZpbHRlcihGZWNoYSA8ICcyMDIzLTEyLTI4JykNCmRmM19kaXN0IDwtIGRmMyAlPiUgIGdyb3VwX2J5KGhvcmEpICU+JSBzdW1tYXJpc2UoUG9sID0gbWVhbihQb2wsIG5hLnJtID0gVFJVRSksIEJyaXggPSBtZWFuKEJyaXgsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXJlemEgPSBtZWFuKFB1cmV6YSwgbmEucm0gPSBUUlVFKSAsIGVuc2F5b3MgPSBuKCkpDQoNCmBgYA0KDQoNCiMjIyMgUHJvbWVkaW9zIEhvcml6b250ZSAxOiAxMCBOT1YgYWwgMzAgTk9WDQpgYGB7cn0NCk5PVjMwX1ByaW1lcm8gPC0gZGYxX2Rpc3QgJT4lIGZpbHRlcihob3JhICVpbiUgKDA6NykgKSAlPiUgDQogIHN1bW1hcmlzZShQb2xfUHJvbWVkaW8gPSBtZWFuKFBvbCwgbmEucm0gPSBUUlVFKSwgQnJpeF9Qcm9tZWRpbyA9IG1lYW4oQnJpeCwgbmEucm0gPSBUUlVFKSwgUHVyZXphX1Byb21lZGlvID0gbWVhbihQdXJlemEsIG5hLnJtID0gVFJVRSkpDQoNCk5PVjMwX1NlZ3VuZG8gPC0gZGYxX2Rpc3QgJT4lIGZpbHRlcihob3JhICVpbiUgKDg6MTUpICkgJT4lIA0KICBzdW1tYXJpc2UoUG9sX1Byb21lZGlvID0gbWVhbihQb2wsIG5hLnJtID0gVFJVRSksIEJyaXhfUHJvbWVkaW8gPSBtZWFuKEJyaXgsIG5hLnJtID0gVFJVRSksIFB1cmV6YV9Qcm9tZWRpbyA9IG1lYW4oUHVyZXphLCBuYS5ybSA9IFRSVUUpKQ0KDQpOT1YzMF9UZXJjZXJvIDwtIGRmMV9kaXN0ICU+JSBmaWx0ZXIoaG9yYSAlaW4lICgxNjoyMykgKSAlPiUgDQogIHN1bW1hcmlzZShQb2xfUHJvbWVkaW8gPSBtZWFuKFBvbCwgbmEucm0gPSBUUlVFKSwgQnJpeF9Qcm9tZWRpbyA9IG1lYW4oQnJpeCwgbmEucm0gPSBUUlVFKSwgUHVyZXphX1Byb21lZGlvID0gbWVhbihQdXJlemEsIG5hLnJtID0gVFJVRSkpDQoNCmRmMV9Qb2wgPC0gZGF0YS5mcmFtZSgiVmFyaWFibGUiID0gYygiUG9sIiwiQnJpeCIsIlB1cmV6YSIpLCANCiAgICAgICAgICAgICAgICAgICAgICAiZGUgMCBhIDcgaG9yYXMiID0gYyhOT1YzMF9QcmltZXJvJFBvbF9Qcm9tZWRpbyxOT1YzMF9QcmltZXJvJEJyaXhfUHJvbWVkaW8sIE5PVjMwX1ByaW1lcm8kUHVyZXphX1Byb21lZGlvKSwNCiAgICAgICAgICAgICAgICAgICAgICAiZGUgOCBhIDE1IGhvcmFzIiA9IGMoTk9WMzBfU2VndW5kbyRQb2xfUHJvbWVkaW8sTk9WMzBfU2VndW5kbyRCcml4X1Byb21lZGlvLCBOT1YzMF9TZWd1bmRvJFB1cmV6YV9Qcm9tZWRpbyksDQogICAgICAgICAgICAgICAgICAgICAgImRlIDE2IGEgMjMgaG9yYXMiID0gYyhOT1YzMF9UZXJjZXJvJFBvbF9Qcm9tZWRpbyxOT1YzMF9UZXJjZXJvJEJyaXhfUHJvbWVkaW8sIE5PVjMwX1RlcmNlcm8kUHVyZXphX1Byb21lZGlvKQ0KICAgICAgICAgICAgICAgICAgICAgICkNCmRmMV9Qb2wNCmBgYA0KIyMjIyBQcm9tZWRpb3MgSG9yaXpvbnRlIDI6IDEwIE5PViBhbCAxNCBESUMNCmBgYHtyfQ0KRElDMTRfUHJpbWVybyA8LSBkZjJfZGlzdCAlPiUgZmlsdGVyKGhvcmEgJWluJSAoMDo3KSApICU+JSANCiAgc3VtbWFyaXNlKFBvbF9Qcm9tZWRpbyA9IG1lYW4oUG9sLCBuYS5ybSA9IFRSVUUpLCBCcml4X1Byb21lZGlvID0gbWVhbihCcml4LCBuYS5ybSA9IFRSVUUpLCBQdXJlemFfUHJvbWVkaW8gPSBtZWFuKFB1cmV6YSwgbmEucm0gPSBUUlVFKSkNCg0KRElDMTRfU2VndW5kbyA8LSBkZjJfZGlzdCAlPiUgZmlsdGVyKGhvcmEgJWluJSAoODoxNSkgKSAlPiUgDQogIHN1bW1hcmlzZShQb2xfUHJvbWVkaW8gPSBtZWFuKFBvbCwgbmEucm0gPSBUUlVFKSwgQnJpeF9Qcm9tZWRpbyA9IG1lYW4oQnJpeCwgbmEucm0gPSBUUlVFKSwgUHVyZXphX1Byb21lZGlvID0gbWVhbihQdXJlemEsIG5hLnJtID0gVFJVRSkpDQoNCkRJQzE0X1RlcmNlcm8gPC0gZGYyX2Rpc3QgJT4lIGZpbHRlcihob3JhICVpbiUgKDE2OjIzKSApICU+JSANCiAgc3VtbWFyaXNlKFBvbF9Qcm9tZWRpbyA9IG1lYW4oUG9sLCBuYS5ybSA9IFRSVUUpLCBCcml4X1Byb21lZGlvID0gbWVhbihCcml4LCBuYS5ybSA9IFRSVUUpLCBQdXJlemFfUHJvbWVkaW8gPSBtZWFuKFB1cmV6YSwgbmEucm0gPSBUUlVFKSkNCg0KZGYyX1BvbCA8LSBkYXRhLmZyYW1lKCJWYXJpYWJsZSIgPSBjKCJQb2wiLCJCcml4IiwiUHVyZXphIiksIA0KICAgICAgICAgICAgICAgICAgICAgICJkZSAwIGEgNyBob3JhcyIgPSBjKERJQzE0X1ByaW1lcm8kUG9sX1Byb21lZGlvLERJQzE0X1ByaW1lcm8kQnJpeF9Qcm9tZWRpbywgRElDMTRfUHJpbWVybyRQdXJlemFfUHJvbWVkaW8pLA0KICAgICAgICAgICAgICAgICAgICAgICJkZSA4IGEgMTUgaG9yYXMiID0gYyhESUMxNF9TZWd1bmRvJFBvbF9Qcm9tZWRpbyxESUMxNF9TZWd1bmRvJEJyaXhfUHJvbWVkaW8sIERJQzE0X1NlZ3VuZG8kUHVyZXphX1Byb21lZGlvKSwNCiAgICAgICAgICAgICAgICAgICAgICAiZGUgMTYgYSAyMyBob3JhcyIgPSBjKERJQzE0X1RlcmNlcm8kUG9sX1Byb21lZGlvLERJQzE0X1RlcmNlcm8kQnJpeF9Qcm9tZWRpbywgRElDMTRfVGVyY2VybyRQdXJlemFfUHJvbWVkaW8pDQogICAgICAgICAgICAgICAgICAgICAgKQ0KZGYyX1BvbA0KYGBgDQoNCiMjIyMgUHJvbWVkaW9zIEhvcml6b250ZSAzOiAxMCBOT1YgYWwgMjggRElDDQpgYGB7cn0NCkRJQzI4X1ByaW1lcm8gPC0gZGYzX2Rpc3QgJT4lIGZpbHRlcihob3JhICVpbiUgKDA6NykgKSAlPiUgDQogIHN1bW1hcmlzZShQb2xfUHJvbWVkaW8gPSBtZWFuKFBvbCwgbmEucm0gPSBUUlVFKSwgQnJpeF9Qcm9tZWRpbyA9IG1lYW4oQnJpeCwgbmEucm0gPSBUUlVFKSwgUHVyZXphX1Byb21lZGlvID0gbWVhbihQdXJlemEsIG5hLnJtID0gVFJVRSkpDQoNCkRJQzI4X1NlZ3VuZG8gPC0gZGYzX2Rpc3QgJT4lIGZpbHRlcihob3JhICVpbiUgKDg6MTUpICkgJT4lIA0KICBzdW1tYXJpc2UoUG9sX1Byb21lZGlvID0gbWVhbihQb2wsIG5hLnJtID0gVFJVRSksIEJyaXhfUHJvbWVkaW8gPSBtZWFuKEJyaXgsIG5hLnJtID0gVFJVRSksIFB1cmV6YV9Qcm9tZWRpbyA9IG1lYW4oUHVyZXphLCBuYS5ybSA9IFRSVUUpKQ0KDQpESUMyOF9UZXJjZXJvIDwtIGRmM19kaXN0ICU+JSBmaWx0ZXIoaG9yYSAlaW4lICgxNjoyMykgKSAlPiUgDQogIHN1bW1hcmlzZShQb2xfUHJvbWVkaW8gPSBtZWFuKFBvbCwgbmEucm0gPSBUUlVFKSwgQnJpeF9Qcm9tZWRpbyA9IG1lYW4oQnJpeCwgbmEucm0gPSBUUlVFKSwgUHVyZXphX1Byb21lZGlvID0gbWVhbihQdXJlemEsIG5hLnJtID0gVFJVRSkpDQoNCmRmM19Qb2wgPC0gZGF0YS5mcmFtZSgiVmFyaWFibGUiID0gYygiUG9sIiwiQnJpeCIsIlB1cmV6YSIpLCANCiAgICAgICAgICAgICAgICAgICAgICAiZGUgMCBhIDcgaG9yYXMiID0gYyhESUMyOF9QcmltZXJvJFBvbF9Qcm9tZWRpbyxESUMyOF9QcmltZXJvJEJyaXhfUHJvbWVkaW8sIERJQzI4X1ByaW1lcm8kUHVyZXphX1Byb21lZGlvKSwNCiAgICAgICAgICAgICAgICAgICAgICAiZGUgOCBhIDE1IGhvcmFzIiA9IGMoRElDMjhfU2VndW5kbyRQb2xfUHJvbWVkaW8sRElDMjhfU2VndW5kbyRCcml4X1Byb21lZGlvLCBESUMyOF9TZWd1bmRvJFB1cmV6YV9Qcm9tZWRpbyksDQogICAgICAgICAgICAgICAgICAgICAgImRlIDE2IGEgMjMgaG9yYXMiID0gYyhESUMyOF9UZXJjZXJvJFBvbF9Qcm9tZWRpbyxESUMyOF9UZXJjZXJvJEJyaXhfUHJvbWVkaW8sIERJQzI4X1RlcmNlcm8kUHVyZXphX1Byb21lZGlvKQ0KICAgICAgICAgICAgICAgICAgICAgICkNCmRmM19Qb2wNCmBgYA0KDQpQdWVkZSBvYnNlcnZhcnNlIHF1ZSBlZmVjdGl2YW1lbnRlLCBhIG5pdmVsIGRlICoqcHJvbWVkaW9zKiogbGFzIHByaW1lcmFzIGhvcmFzIGRlbCBkw61hIHRpZW5kZW4gYSB0ZW5lciB2YWxvcmVzIG3DoXMgZWxldmFkb3MgcXVlIGVuIGxhcyDDumx0aW1hcyBob3JhcyBkZWwgZMOtYS4gU2luIGVtYmFyZ28sIGVzIG5lY2VzYXJpbyB2ZXJpZmljYXIgZWwgKnNvcG9ydGUqIGRlIGRhdG9zIGVuIGNhZGEgcmFuZ28sIHBhcmEgbGEgc2lnbmlmaWNhbmNpYSBlc3RhZMOtc3RpY2EuIFBvciBlbGxvLCBzZSBhbmFsaXphICoqZWwgbsO6bWVybyBkZSBtdWVzdHJlb3MgcG9yIHJhbmdvIGRlIGhvcmFzLioqDQoNCmBgYHtyfQ0KIyBCYXIgUGxvdHM6DQpiYXJwbG90KGhlaWdodD1kZjNfZGlzdCRlbnNheW9zLCBuYW1lcz1kZjNfZGlzdCRob3JhLCBjb2wgPSAibGlnaHQgZ3JlZW4iLCB4bGFiID0gIkhvcmEgTXVlc3RyZW8iLCB5bGFiID0gIkFjdW11bGFkbyBNdWVzdHJhcyIsIGNleC5heGlzPTAuNSwgY2V4Lm5hbWVzPTAuNSkNCmJhcnBsb3QoaGVpZ2h0PWRmMl9kaXN0JGVuc2F5b3MsIG5hbWVzPWRmMl9kaXN0JGhvcmEsIGNvbCA9ICJncmVlbiIsIGNleC5heGlzPTAuNSwgY2V4Lm5hbWVzPTAuNSwgYWRkID0gVFJVRSkNCmJhcnBsb3QoaGVpZ2h0PWRmMV9kaXN0JGVuc2F5b3MsIG5hbWVzPWRmMV9kaXN0JGhvcmEsIGNvbCA9ICJkYXJrIGdyZWVuIiwgY2V4LmF4aXM9MC41LCBjZXgubmFtZXM9MC41LCBhZGQgPSBUUlVFKQ0KDQpsZWdlbmQoInRvcCIsIHRpdGxlPSJQZXLDrW9kbyIsIGxlZ2VuZD0gYygiYWwgMzAtTm92IiwiYWwgMTQtRGljIiwiYWwgMjgtRGljIiksIGZpbGwgPWMoImRhcmsgZ3JlZW4iLCAiZ3JlZW4iLCAibGlnaHQgZ3JlZW4iICksIGJveC5sdHk9MCkNCg0KYGBgDQoNCkVuIGVzdGUgY2FzbywgKipOTyBzZSBjdWVudGEgY29uIHVuIHNvcG9ydGUgdW5pZm9ybWUqKi4gRXMgZGVjaXIsIGVsIG7Dum1lcm8gZGUgbXVlc3RyYXMgKnF1ZSBzZSByZWdpc3RyYW4qIGVuIGxhcyBwcmltZXJhcyBob3JhcyBkZWwgZMOtYSBlcyBjb25zaXN0ZW50ZW1lbnRlIG1lbm9yIHF1ZSBlbCBuw7ptZXJvIGRlIG11ZXN0cmFzICpxdWUgc2UgcmVnaXN0cmFuKiBhIG1lZGlkYSBxdWUgYXZhbnphIGVsIGTDrWEuIA0KDQpBw7puIG3DoXMsIGVuIGVsIGluaWNpbyBkZSBsYSB6YWZyYSAoSG9yaXpvbnRlIDEpIGZ1ZSBlbCDDum5pY28gcGVyw61vZG8gZW4gZWwgcXVlIHNlIHJlZ2lzdHJhcm9uIG11ZXN0cmFzIGVuIGxhcyBwcmltZXJhcyBob3JhcyAoUmFuZ28gMSkuIEEgbWVkaWRhIHF1ZSBhdmFuesOzIGxhIHphZnJhLCBsb3MgcmVnaXN0cm9zIHNlIGZ1ZXJvbiBhY3VtdWxhbmRvIGhhY2lhIGVsIGZpbmFsIGRlbCBkw61hLCBoYXN0YSBsYSBzaXR1YWNpw7NuIGFjdHVhbCwgZG9uZGUgcGFyZWNpZXJhbiBjb25jZW50cmFyc2UgbG9zIHJlZ2lzdHJvcyBlbiBsYSDDumx0aW1hIGhvcmEgZGVsIGTDrWEgKGFudGVzIGRlIGxhIG1lZGlhIG5vY2hlKS4NCg0KIyMjIENvbmNsdXNpw7NuOg0KKipObyBwdWVkZSBjb25jbHVpcnNlIHF1ZSBkdXJhbnRlIGxhcyBwcmltZXJhcyBob3JhcyBkZWwgZMOtYSBleGlzdGFuIG1heW9yZXMgdmFsb3JlcyBkZSBQb2wsIEJyaXggeSBQdXJlemEqKiwgZGViaWRvIGFsIHNlc2dvIHF1ZSBleGlzdGUgZW4gbG9zIGRhdG9zIHB1ZXMgKm5vIHNlIGVzdMOhbiByZWdpc3RyYW5kbyBkYXRvcyBlbiBsYXMgcHJpbWVyYXMgaG9yYXMgZGVsIGTDrWEqLiBFc3RvIG5vIGltcGxpY2EgcXVlIG5vIHNlIGVzdMOpIG11ZXN0cmVhbmRvIG5lY2VzYXJpYW1lbnRlIGVuIGVzdGFzIGhvcmFzLCBwdWVzIHB1ZGllcmEgc2VyIHVuIHRlbWEgZGUgaW5ncmVzbyBhbCBzaXN0ZW1hOyBkZSBjdWFscXVpZXIgbWFuZXJhIGVzdGUgcHJvYmxlbWEgZGUgcmVnaXN0cm8gaW1wb3NpYmlsaXRhIGVsIGFuw6FsaXNpcyBob3JhcmlvIHB1ZXMgbm8gc2UgY3VlbnRhIGNvbiB1bmEgZXN0YW1wYSBkZSB0aWVtcG8gYWRlY3VhZGEgcGFyYSBjb3JyZWxhY2lvbmFybGEgY29uIG90cmFzIHZhcmlhYmxlcyBhIGxvIGxhcmdvIGRlbCBkw61hLg0K