library(ggplot2)
library(dplyr)
library(tidyr)
library(stringr)

Dadas las diferencias en los resultados que se generan a partir de como se toman en cuenta los simbolos de Tiempo se presentan dos resultados: "_Size" se normaliza sin tomar en cuenta los simbolos de tiempo pero se coloca una columna nueva “size” que toma en cuenta los simbolos de tiempo. Por otro lado, "_Time" normaliza tomando en cuenta los simbolos de tiempo.

Parte Dos

PS: Puro Size PT: Puro Time DS: Down Size DT: Down Time US: Up Size UT: Up Time

UpV_N = read.csv(file="C:/Users/DuzzLogic/Google Drive/Cosas/LABSIN/Botnets/CTU19_RandomForest/Resultados2/UpV_Size")
DownV_N = read.csv(file="C:/Users/DuzzLogic/Google Drive/Cosas/LABSIN/Botnets/CTU19_RandomForest/Resultados2/DownV_Size")
PuroV_N = read.csv(file="C:/Users/DuzzLogic/Google Drive/Cosas/LABSIN/Botnets/CTU19_RandomForest/Resultados2/PuroV_Size")
UpV_SN = read.csv(file="C:/Users/DuzzLogic/Google Drive/Cosas/LABSIN/Botnets/CTU19_RandomForest/Resultados2/UpV_Time")
DownV_SN = read.csv(file="C:/Users/DuzzLogic/Google Drive/Cosas/LABSIN/Botnets/CTU19_RandomForest/Resultados2/DownV_Time")
PuroV_SN = read.csv(file="C:/Users/DuzzLogic/Google Drive/Cosas/LABSIN/Botnets/CTU19_RandomForest/Resultados2/PuroV_Time")
PuroN <- PuroV_N %>% mutate(test = "PuroN") %>% 
  select(-standard_deviation,-standard_deviation.1,-standard_deviation.2,-standard_deviation.3,
         -standard_deviation.4,-standard_deviation.5,-standard_deviation.6,-standard_deviation.7,-standard_deviation.8)

PuroSN <- PuroV_SN %>% mutate(test = "PuroSN") %>% 
  select(-standard_deviation,-standard_deviation.1,-standard_deviation.2,-standard_deviation.3,
         -standard_deviation.4,-standard_deviation.5,-standard_deviation.6,-standard_deviation.7,-standard_deviation.8)

DownN <- DownV_N %>% mutate(test = "DownN") %>% 
  select(-standard_deviation,-standard_deviation.1,-standard_deviation.2,-standard_deviation.3,
         -standard_deviation.4,-standard_deviation.5,-standard_deviation.6,-standard_deviation.7,-standard_deviation.8)

DownSN <- DownV_SN %>% mutate(test = "DownSN") %>% 
  select(-standard_deviation,-standard_deviation.1,-standard_deviation.2,-standard_deviation.3,
         -standard_deviation.4,-standard_deviation.5,-standard_deviation.6,-standard_deviation.7,-standard_deviation.8)

UpN <- UpV_N %>% mutate(test = "UpN") %>% 
  select(-standard_deviation,-standard_deviation.1,-standard_deviation.2,-standard_deviation.3,
         -standard_deviation.4,-standard_deviation.5,-standard_deviation.6,-standard_deviation.7,-standard_deviation.8)

UpSN <- UpV_SN %>% mutate(test = "UpSN") %>% 
  select(-standard_deviation,-standard_deviation.1,-standard_deviation.2,-standard_deviation.3,
         -standard_deviation.4,-standard_deviation.5,-standard_deviation.6,-standard_deviation.7,-standard_deviation.8)
PuroN <- PuroN %>% filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test) %>% select(-name)
PuroSN <- PuroSN %>% filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test) %>% select(-name)
DownN <- DownN %>% filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test) %>% select(-name)
DownSN <- DownSN %>% filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test) %>% select(-name)
UpN <- UpN %>% filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test) %>% select(-name)
UpSN <- UpSN %>% filter(X %in% c("Sensitivity","Specificity","F1","Balanced Accuracy")) %>% select(-X) %>% pivot_longer(cols = -test) %>% select(-name)
name <- c("Sensitivity.0","Sensitivity.1","Sensitivity.2","Sensitivity.3","Sensitivity.4","Sensitivity.5","Sensitivity.6","Sensitivity.7","Sensitivity.8","Specificity.0","Specificity.1","Specificity.2","Specificity.3","Specificity.4","Specificity.5","Specificity.6","Specificity.7","Specificity.8","F1.0","F1.1","F1.2","F1.3","F1.4","F1.5","F1.6","F1.7","F1.8","BAccuracy.0","BAccuracy.1","BAccuracy.2","BAccuracy.3","BAccuracy.4","BAccuracy.5","BAccuracy.6","BAccuracy.7","BAccuracy.8")
PS <- PuroN %>% cbind(name) %>% select(-test) %>% mutate(test = "PS")
PT <- PuroSN %>% cbind(name) %>% select(-test) %>% mutate(test = "PT")
DS <- DownN %>% cbind(name) %>% select(-test) %>% mutate(test = "DS")
DT <- DownSN %>% cbind(name) %>% select(-test) %>% mutate(test = "DT")
US <- UpN %>% cbind(name) %>% select(-test) %>% mutate(test = "US")
UT <- UpSN %>% cbind(name) %>% select(-test) %>% mutate(test = "UT")

Ahora falta meter todo en un mismo dataset para poder graficar.

Tsec <- PS %>% rbind(PT) %>% rbind(DS) %>% rbind(DT) %>% rbind(US) %>% rbind(UT)
Tsec

Si vemos PS y PT parece ser que PS tiene mejores resultados con cadenas mas cortas en BAccuracy y Specificity. No sucede lo mismo al usar DownSam o UpSam, donde DT y UT siempre tienen mejores resultados que DS y US respectivamente. A medida que el tamaño de las cadenas aumenta se ven resultados similares, sobre todo cuando no se usa ni UpSam ni DownSam.

Tsec %>%
  ggplot()+
  geom_col(aes(x=test,y=value), fill="skyblue")+
  facet_wrap(~name, ncol = 9)+
  theme_bw()

Analizando solo Puro Normalizado con tiempo

Balanced accuracy

PT %>% filter(grepl("BA",name)) %>%
  ggplot()+
  geom_col(aes(x=name,y=value), fill="skyblue")+
  theme_bw()

Spec

PT %>% filter(grepl("Spe",name)) %>%
  ggplot()+
  geom_col(aes(x=name,y=value), fill="skyblue")+
  theme_bw()

Analizando solo Puro Normalizado sin tiempo con columna Size

Balanced accuracy

PS %>% filter(grepl("BA",name)) %>%
  ggplot()+
  geom_col(aes(x=name,y=value), fill="skyblue")+
  theme_bw()

Spec

PS %>% filter(grepl("Spe",name)) %>%
  ggplot()+
  geom_col(aes(x=name,y=value), fill="skyblue")+
  theme_bw()

Comparamos

Balanced accuracy

PS %>% rbind(PT) %>% filter(grepl("BA",name)) %>%
  ggplot()+
  geom_col(aes(x=test,y=value), fill="skyblue")+
  facet_wrap(~name)+
  theme_bw()

Spec

PS %>% rbind(PT) %>% filter(grepl("Spe",name)) %>%
  ggplot()+
  geom_col(aes(x=test,y=value), fill="skyblue")+
  facet_wrap(~name)+
  theme_bw()

LS0tDQp0aXRsZTogIlJlc3VsdGFkb3MgQ1RVMTlfUmFuZG9tRm9yZXN0Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoc3RyaW5ncikNCmBgYA0KDQpEYWRhcyBsYXMgZGlmZXJlbmNpYXMgZW4gbG9zIHJlc3VsdGFkb3MgcXVlIHNlIGdlbmVyYW4gYSBwYXJ0aXIgZGUgY29tbyBzZSB0b21hbiBlbiBjdWVudGEgbG9zIHNpbWJvbG9zIGRlIFRpZW1wbyBzZSBwcmVzZW50YW4gZG9zIHJlc3VsdGFkb3M6ICJfU2l6ZSIgc2Ugbm9ybWFsaXphIHNpbiB0b21hciBlbiBjdWVudGEgbG9zIHNpbWJvbG9zIGRlIHRpZW1wbyBwZXJvIHNlIGNvbG9jYSB1bmEgY29sdW1uYSBudWV2YSAic2l6ZSIgcXVlIHRvbWEgZW4gY3VlbnRhIGxvcyBzaW1ib2xvcyBkZSB0aWVtcG8uIFBvciBvdHJvIGxhZG8sICJfVGltZSIgbm9ybWFsaXphIHRvbWFuZG8gZW4gY3VlbnRhIGxvcyBzaW1ib2xvcyBkZSB0aWVtcG8uIA0KDQoNCiMgUGFydGUgRG9zDQoNClBTOiBQdXJvIFNpemUNClBUOiBQdXJvIFRpbWUNCkRTOiBEb3duIFNpemUNCkRUOiBEb3duIFRpbWUNClVTOiBVcCBTaXplDQpVVDogVXAgVGltZQ0KDQpgYGB7cn0NClVwVl9OID0gcmVhZC5jc3YoZmlsZT0iQzovVXNlcnMvRHV6ekxvZ2ljL0dvb2dsZSBEcml2ZS9Db3Nhcy9MQUJTSU4vQm90bmV0cy9DVFUxOV9SYW5kb21Gb3Jlc3QvUmVzdWx0YWRvczIvVXBWX1NpemUiKQ0KRG93blZfTiA9IHJlYWQuY3N2KGZpbGU9IkM6L1VzZXJzL0R1enpMb2dpYy9Hb29nbGUgRHJpdmUvQ29zYXMvTEFCU0lOL0JvdG5ldHMvQ1RVMTlfUmFuZG9tRm9yZXN0L1Jlc3VsdGFkb3MyL0Rvd25WX1NpemUiKQ0KUHVyb1ZfTiA9IHJlYWQuY3N2KGZpbGU9IkM6L1VzZXJzL0R1enpMb2dpYy9Hb29nbGUgRHJpdmUvQ29zYXMvTEFCU0lOL0JvdG5ldHMvQ1RVMTlfUmFuZG9tRm9yZXN0L1Jlc3VsdGFkb3MyL1B1cm9WX1NpemUiKQ0KVXBWX1NOID0gcmVhZC5jc3YoZmlsZT0iQzovVXNlcnMvRHV6ekxvZ2ljL0dvb2dsZSBEcml2ZS9Db3Nhcy9MQUJTSU4vQm90bmV0cy9DVFUxOV9SYW5kb21Gb3Jlc3QvUmVzdWx0YWRvczIvVXBWX1RpbWUiKQ0KRG93blZfU04gPSByZWFkLmNzdihmaWxlPSJDOi9Vc2Vycy9EdXp6TG9naWMvR29vZ2xlIERyaXZlL0Nvc2FzL0xBQlNJTi9Cb3RuZXRzL0NUVTE5X1JhbmRvbUZvcmVzdC9SZXN1bHRhZG9zMi9Eb3duVl9UaW1lIikNClB1cm9WX1NOID0gcmVhZC5jc3YoZmlsZT0iQzovVXNlcnMvRHV6ekxvZ2ljL0dvb2dsZSBEcml2ZS9Db3Nhcy9MQUJTSU4vQm90bmV0cy9DVFUxOV9SYW5kb21Gb3Jlc3QvUmVzdWx0YWRvczIvUHVyb1ZfVGltZSIpDQpgYGANCg0KYGBge3J9IA0KUHVyb04gPC0gUHVyb1ZfTiAlPiUgbXV0YXRlKHRlc3QgPSAiUHVyb04iKSAlPiUgDQogIHNlbGVjdCgtc3RhbmRhcmRfZGV2aWF0aW9uLC1zdGFuZGFyZF9kZXZpYXRpb24uMSwtc3RhbmRhcmRfZGV2aWF0aW9uLjIsLXN0YW5kYXJkX2RldmlhdGlvbi4zLA0KICAgICAgICAgLXN0YW5kYXJkX2RldmlhdGlvbi40LC1zdGFuZGFyZF9kZXZpYXRpb24uNSwtc3RhbmRhcmRfZGV2aWF0aW9uLjYsLXN0YW5kYXJkX2RldmlhdGlvbi43LC1zdGFuZGFyZF9kZXZpYXRpb24uOCkNCg0KUHVyb1NOIDwtIFB1cm9WX1NOICU+JSBtdXRhdGUodGVzdCA9ICJQdXJvU04iKSAlPiUgDQogIHNlbGVjdCgtc3RhbmRhcmRfZGV2aWF0aW9uLC1zdGFuZGFyZF9kZXZpYXRpb24uMSwtc3RhbmRhcmRfZGV2aWF0aW9uLjIsLXN0YW5kYXJkX2RldmlhdGlvbi4zLA0KICAgICAgICAgLXN0YW5kYXJkX2RldmlhdGlvbi40LC1zdGFuZGFyZF9kZXZpYXRpb24uNSwtc3RhbmRhcmRfZGV2aWF0aW9uLjYsLXN0YW5kYXJkX2RldmlhdGlvbi43LC1zdGFuZGFyZF9kZXZpYXRpb24uOCkNCg0KRG93bk4gPC0gRG93blZfTiAlPiUgbXV0YXRlKHRlc3QgPSAiRG93bk4iKSAlPiUgDQogIHNlbGVjdCgtc3RhbmRhcmRfZGV2aWF0aW9uLC1zdGFuZGFyZF9kZXZpYXRpb24uMSwtc3RhbmRhcmRfZGV2aWF0aW9uLjIsLXN0YW5kYXJkX2RldmlhdGlvbi4zLA0KICAgICAgICAgLXN0YW5kYXJkX2RldmlhdGlvbi40LC1zdGFuZGFyZF9kZXZpYXRpb24uNSwtc3RhbmRhcmRfZGV2aWF0aW9uLjYsLXN0YW5kYXJkX2RldmlhdGlvbi43LC1zdGFuZGFyZF9kZXZpYXRpb24uOCkNCg0KRG93blNOIDwtIERvd25WX1NOICU+JSBtdXRhdGUodGVzdCA9ICJEb3duU04iKSAlPiUgDQogIHNlbGVjdCgtc3RhbmRhcmRfZGV2aWF0aW9uLC1zdGFuZGFyZF9kZXZpYXRpb24uMSwtc3RhbmRhcmRfZGV2aWF0aW9uLjIsLXN0YW5kYXJkX2RldmlhdGlvbi4zLA0KICAgICAgICAgLXN0YW5kYXJkX2RldmlhdGlvbi40LC1zdGFuZGFyZF9kZXZpYXRpb24uNSwtc3RhbmRhcmRfZGV2aWF0aW9uLjYsLXN0YW5kYXJkX2RldmlhdGlvbi43LC1zdGFuZGFyZF9kZXZpYXRpb24uOCkNCg0KVXBOIDwtIFVwVl9OICU+JSBtdXRhdGUodGVzdCA9ICJVcE4iKSAlPiUgDQogIHNlbGVjdCgtc3RhbmRhcmRfZGV2aWF0aW9uLC1zdGFuZGFyZF9kZXZpYXRpb24uMSwtc3RhbmRhcmRfZGV2aWF0aW9uLjIsLXN0YW5kYXJkX2RldmlhdGlvbi4zLA0KICAgICAgICAgLXN0YW5kYXJkX2RldmlhdGlvbi40LC1zdGFuZGFyZF9kZXZpYXRpb24uNSwtc3RhbmRhcmRfZGV2aWF0aW9uLjYsLXN0YW5kYXJkX2RldmlhdGlvbi43LC1zdGFuZGFyZF9kZXZpYXRpb24uOCkNCg0KVXBTTiA8LSBVcFZfU04gJT4lIG11dGF0ZSh0ZXN0ID0gIlVwU04iKSAlPiUgDQogIHNlbGVjdCgtc3RhbmRhcmRfZGV2aWF0aW9uLC1zdGFuZGFyZF9kZXZpYXRpb24uMSwtc3RhbmRhcmRfZGV2aWF0aW9uLjIsLXN0YW5kYXJkX2RldmlhdGlvbi4zLA0KICAgICAgICAgLXN0YW5kYXJkX2RldmlhdGlvbi40LC1zdGFuZGFyZF9kZXZpYXRpb24uNSwtc3RhbmRhcmRfZGV2aWF0aW9uLjYsLXN0YW5kYXJkX2RldmlhdGlvbi43LC1zdGFuZGFyZF9kZXZpYXRpb24uOCkNCmBgYA0KDQpgYGB7cn0NClB1cm9OIDwtIFB1cm9OICU+JSBmaWx0ZXIoWCAlaW4lIGMoIlNlbnNpdGl2aXR5IiwiU3BlY2lmaWNpdHkiLCJGMSIsIkJhbGFuY2VkIEFjY3VyYWN5IikpICU+JSBzZWxlY3QoLVgpICU+JSBwaXZvdF9sb25nZXIoY29scyA9IC10ZXN0KSAlPiUgc2VsZWN0KC1uYW1lKQ0KUHVyb1NOIDwtIFB1cm9TTiAlPiUgZmlsdGVyKFggJWluJSBjKCJTZW5zaXRpdml0eSIsIlNwZWNpZmljaXR5IiwiRjEiLCJCYWxhbmNlZCBBY2N1cmFjeSIpKSAlPiUgc2VsZWN0KC1YKSAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtdGVzdCkgJT4lIHNlbGVjdCgtbmFtZSkNCkRvd25OIDwtIERvd25OICU+JSBmaWx0ZXIoWCAlaW4lIGMoIlNlbnNpdGl2aXR5IiwiU3BlY2lmaWNpdHkiLCJGMSIsIkJhbGFuY2VkIEFjY3VyYWN5IikpICU+JSBzZWxlY3QoLVgpICU+JSBwaXZvdF9sb25nZXIoY29scyA9IC10ZXN0KSAlPiUgc2VsZWN0KC1uYW1lKQ0KRG93blNOIDwtIERvd25TTiAlPiUgZmlsdGVyKFggJWluJSBjKCJTZW5zaXRpdml0eSIsIlNwZWNpZmljaXR5IiwiRjEiLCJCYWxhbmNlZCBBY2N1cmFjeSIpKSAlPiUgc2VsZWN0KC1YKSAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtdGVzdCkgJT4lIHNlbGVjdCgtbmFtZSkNClVwTiA8LSBVcE4gJT4lIGZpbHRlcihYICVpbiUgYygiU2Vuc2l0aXZpdHkiLCJTcGVjaWZpY2l0eSIsIkYxIiwiQmFsYW5jZWQgQWNjdXJhY3kiKSkgJT4lIHNlbGVjdCgtWCkgJT4lIHBpdm90X2xvbmdlcihjb2xzID0gLXRlc3QpICU+JSBzZWxlY3QoLW5hbWUpDQpVcFNOIDwtIFVwU04gJT4lIGZpbHRlcihYICVpbiUgYygiU2Vuc2l0aXZpdHkiLCJTcGVjaWZpY2l0eSIsIkYxIiwiQmFsYW5jZWQgQWNjdXJhY3kiKSkgJT4lIHNlbGVjdCgtWCkgJT4lIHBpdm90X2xvbmdlcihjb2xzID0gLXRlc3QpICU+JSBzZWxlY3QoLW5hbWUpDQpgYGANCg0KYGBge3J9DQpuYW1lIDwtIGMoIlNlbnNpdGl2aXR5LjAiLCJTZW5zaXRpdml0eS4xIiwiU2Vuc2l0aXZpdHkuMiIsIlNlbnNpdGl2aXR5LjMiLCJTZW5zaXRpdml0eS40IiwiU2Vuc2l0aXZpdHkuNSIsIlNlbnNpdGl2aXR5LjYiLCJTZW5zaXRpdml0eS43IiwiU2Vuc2l0aXZpdHkuOCIsIlNwZWNpZmljaXR5LjAiLCJTcGVjaWZpY2l0eS4xIiwiU3BlY2lmaWNpdHkuMiIsIlNwZWNpZmljaXR5LjMiLCJTcGVjaWZpY2l0eS40IiwiU3BlY2lmaWNpdHkuNSIsIlNwZWNpZmljaXR5LjYiLCJTcGVjaWZpY2l0eS43IiwiU3BlY2lmaWNpdHkuOCIsIkYxLjAiLCJGMS4xIiwiRjEuMiIsIkYxLjMiLCJGMS40IiwiRjEuNSIsIkYxLjYiLCJGMS43IiwiRjEuOCIsIkJBY2N1cmFjeS4wIiwiQkFjY3VyYWN5LjEiLCJCQWNjdXJhY3kuMiIsIkJBY2N1cmFjeS4zIiwiQkFjY3VyYWN5LjQiLCJCQWNjdXJhY3kuNSIsIkJBY2N1cmFjeS42IiwiQkFjY3VyYWN5LjciLCJCQWNjdXJhY3kuOCIpDQpQUyA8LSBQdXJvTiAlPiUgY2JpbmQobmFtZSkgJT4lIHNlbGVjdCgtdGVzdCkgJT4lIG11dGF0ZSh0ZXN0ID0gIlBTIikNClBUIDwtIFB1cm9TTiAlPiUgY2JpbmQobmFtZSkgJT4lIHNlbGVjdCgtdGVzdCkgJT4lIG11dGF0ZSh0ZXN0ID0gIlBUIikNCkRTIDwtIERvd25OICU+JSBjYmluZChuYW1lKSAlPiUgc2VsZWN0KC10ZXN0KSAlPiUgbXV0YXRlKHRlc3QgPSAiRFMiKQ0KRFQgPC0gRG93blNOICU+JSBjYmluZChuYW1lKSAlPiUgc2VsZWN0KC10ZXN0KSAlPiUgbXV0YXRlKHRlc3QgPSAiRFQiKQ0KVVMgPC0gVXBOICU+JSBjYmluZChuYW1lKSAlPiUgc2VsZWN0KC10ZXN0KSAlPiUgbXV0YXRlKHRlc3QgPSAiVVMiKQ0KVVQgPC0gVXBTTiAlPiUgY2JpbmQobmFtZSkgJT4lIHNlbGVjdCgtdGVzdCkgJT4lIG11dGF0ZSh0ZXN0ID0gIlVUIikNCmBgYA0KDQpBaG9yYSBmYWx0YSBtZXRlciB0b2RvIGVuIHVuIG1pc21vIGRhdGFzZXQgcGFyYSBwb2RlciBncmFmaWNhci4gDQoNCmBgYHtyfQ0KVHNlYyA8LSBQUyAlPiUgcmJpbmQoUFQpICU+JSByYmluZChEUykgJT4lIHJiaW5kKERUKSAlPiUgcmJpbmQoVVMpICU+JSByYmluZChVVCkNClRzZWMNCmBgYA0KDQpTaSB2ZW1vcyBQUyB5IFBUIHBhcmVjZSBzZXIgcXVlIFBTIHRpZW5lIG1lam9yZXMgcmVzdWx0YWRvcyBjb24gY2FkZW5hcyBtYXMgY29ydGFzIGVuIEJBY2N1cmFjeSB5IFNwZWNpZmljaXR5LiBObyBzdWNlZGUgbG8gbWlzbW8gYWwgdXNhciBEb3duU2FtIG8gVXBTYW0sIGRvbmRlIERUIHkgVVQgc2llbXByZSB0aWVuZW4gbWVqb3JlcyByZXN1bHRhZG9zIHF1ZSBEUyB5IFVTIHJlc3BlY3RpdmFtZW50ZS4gQSBtZWRpZGEgcXVlIGVsIHRhbWHDsW8gZGUgbGFzIGNhZGVuYXMgYXVtZW50YSBzZSB2ZW4gcmVzdWx0YWRvcyBzaW1pbGFyZXMsIHNvYnJlIHRvZG8gY3VhbmRvIG5vIHNlIHVzYSBuaSBVcFNhbSBuaSBEb3duU2FtLg0KDQpgYGB7ciBmaWcud2lkdGg9MjB9DQpUc2VjICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9jb2woYWVzKHg9dGVzdCx5PXZhbHVlKSwgZmlsbD0ic2t5Ymx1ZSIpKw0KICBmYWNldF93cmFwKH5uYW1lLCBuY29sID0gOSkrDQogIHRoZW1lX2J3KCkNCmBgYA0KDQojIyBBbmFsaXphbmRvIHNvbG8gUHVybyBOb3JtYWxpemFkbyBjb24gdGllbXBvDQoNCiMjIyBCYWxhbmNlZCBhY2N1cmFjeQ0KDQpgYGB7ciBmaWcud2lkdGg9MTB9DQpQVCAlPiUgZmlsdGVyKGdyZXBsKCJCQSIsbmFtZSkpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9jb2woYWVzKHg9bmFtZSx5PXZhbHVlKSwgZmlsbD0ic2t5Ymx1ZSIpKw0KICB0aGVtZV9idygpDQpgYGANCg0KIyMjIFNwZWMNCg0KYGBge3IgZmlnLndpZHRoPTEwfQ0KUFQgJT4lIGZpbHRlcihncmVwbCgiU3BlIixuYW1lKSkgJT4lDQogIGdncGxvdCgpKw0KICBnZW9tX2NvbChhZXMoeD1uYW1lLHk9dmFsdWUpLCBmaWxsPSJza3libHVlIikrDQogIHRoZW1lX2J3KCkNCmBgYA0KDQojIyBBbmFsaXphbmRvIHNvbG8gUHVybyBOb3JtYWxpemFkbyBzaW4gdGllbXBvIGNvbiBjb2x1bW5hIFNpemUNCg0KIyMjIEJhbGFuY2VkIGFjY3VyYWN5DQoNCmBgYHtyIGZpZy53aWR0aD0xMH0NClBTICU+JSBmaWx0ZXIoZ3JlcGwoIkJBIixuYW1lKSkgJT4lDQogIGdncGxvdCgpKw0KICBnZW9tX2NvbChhZXMoeD1uYW1lLHk9dmFsdWUpLCBmaWxsPSJza3libHVlIikrDQogIHRoZW1lX2J3KCkNCmBgYA0KDQojIyMgU3BlYw0KDQpgYGB7ciBmaWcud2lkdGg9MTB9DQpQUyAlPiUgZmlsdGVyKGdyZXBsKCJTcGUiLG5hbWUpKSAlPiUNCiAgZ2dwbG90KCkrDQogIGdlb21fY29sKGFlcyh4PW5hbWUseT12YWx1ZSksIGZpbGw9InNreWJsdWUiKSsNCiAgdGhlbWVfYncoKQ0KYGBgDQoNCiMjIENvbXBhcmFtb3MNCg0KDQojIyMgQmFsYW5jZWQgYWNjdXJhY3kNCg0KYGBge3IgZmlnLndpZHRoPTE1fQ0KUFMgJT4lIHJiaW5kKFBUKSAlPiUgZmlsdGVyKGdyZXBsKCJCQSIsbmFtZSkpICU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9jb2woYWVzKHg9dGVzdCx5PXZhbHVlKSwgZmlsbD0ic2t5Ymx1ZSIpKw0KICBmYWNldF93cmFwKH5uYW1lKSsNCiAgdGhlbWVfYncoKQ0KYGBgDQoNCiMjIyBTcGVjDQoNCmBgYHtyIGZpZy53aWR0aD0xNX0NClBTICU+JSByYmluZChQVCkgJT4lIGZpbHRlcihncmVwbCgiU3BlIixuYW1lKSkgJT4lDQogIGdncGxvdCgpKw0KICBnZW9tX2NvbChhZXMoeD10ZXN0LHk9dmFsdWUpLCBmaWxsPSJza3libHVlIikrDQogIGZhY2V0X3dyYXAofm5hbWUpKw0KICB0aGVtZV9idygpDQpgYGA=