library(gridExtra)
library(ggplot2)
a3$type<-"glmnet200"
a4$type<-"glmnet250"
a5$type<-"glmnet350"
a6$type<-"glmnet500"
a7$type<-"glmnet1000"
a8$type<-"glmnet2500"
a9$type<-"glmnet5000"
a10$type<-"glmnet10000"
a11$type<-"glmnet20000"

x1$type<-"svr200"
x2$type<-"svr250"
x3$type<-"svr300"
x4$type<-"svr500"
x5$type<-"svr750"
x6$type<-"svr1000"
x7$type<-"svr1250"
x8$type<-"svr2000"
x9$type<-"svr5000"



z4$type<-"pls500"
z3$type<-"pls350"
z2$type<-"pls250"
z1$type<-"pls200"

heatmap <-rbind(a3,a4,a5,a6,a7,a8,a9,a10,a11,
                
                x1,x2,x3,x4,x5,x6,x7,x8,x9,
                z1,z2,z3,z4)

 

Heatmap per cell (Pearson)

#library(ggplotify)
#par(mfrow=c(2,1))
pattern="DS"

heatmap %>% group_by(type,cells) %>%  summarise(pearson=mean(pearson)) %>% reshape2::acast(type ~cells) %>% as.matrix() %>% d3heatmap::d3heatmap(colors = "Blues")

Heatmap per cell rnaseq (Pearson)


heatmap %>% filter(datasets %in% c("DS446395","DS500","FIAS4")) %>% group_by(type,cells) %>%  summarise(pearson=mean(pearson)) %>% reshape2::acast(type ~cells) %>% as.matrix() %>% d3heatmap::d3heatmap(colors = "Blues")

Heatmap per cell (Spearman)

heatmap %>% group_by(type,cells) %>% summarise(spearman=mean(spearman)) %>% reshape2::acast(type ~cells) %>% as.matrix() %>% d3heatmap::d3heatmap(colors = "Reds")

Heatmap per cell rnaseq (Spearman)

heatmap  %>% filter(datasets %in% c("DS446395","DS500","FIAS4")) %>% group_by(type,cells) %>% summarise(spearman=mean(spearman)) %>% reshape2::acast(type ~cells) %>% as.matrix() %>% d3heatmap::d3heatmap(colors = "Reds")

Heatmap per dataset (Pearson)

#library(ggplotify)
#par(mfrow=c(2,1))
pattern="DS"

heatmap %>% group_by(type,datasets) %>%  summarise(pearson=mean(pearson)) %>% reshape2::acast(type ~datasets) %>% as.matrix() %>% d3heatmap::d3heatmap(colors = "Blues")

Heatmap per dataset rnaseq (Pearson)


heatmap %>% filter(datasets %in% c("DS446395","DS500","FIAS4")) %>% group_by(type,datasets) %>%  summarise(pearson=mean(pearson)) %>% reshape2::acast(type ~datasets) %>% as.matrix() %>% d3heatmap::d3heatmap(colors = "Blues")

Heatmap per dataset (Spearman)

heatmap %>% group_by(type,datasets) %>% summarise(spearman=mean(spearman)) %>% reshape2::acast(type ~datasets) %>% as.matrix() %>% d3heatmap::d3heatmap(colors = "Reds")

Heatmap per dataset rnaseq (Spearman)

heatmap  %>% filter(datasets %in% c("DS446395","DS500","FIAS4")) %>% group_by(type,datasets) %>% summarise(spearman=mean(spearman)) %>% reshape2::acast(type ~datasets) %>% as.matrix() %>% d3heatmap::d3heatmap(colors = "Reds")

a3 [glmnet200] Results for glmnet 200 features over 20000 (RF2)

filename<-"./devcon_challenge.glmnet_results_noscale_rf_selected_features_200_20000_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
a3<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
a3
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))

a4 [glmnet250] Results for glmnet 250 features over 20000 (RF2)

filename<-"./devcon_challenge.glmnet_results_noscale_rf_selected_features_250_20000_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
a4<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
a4
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))

a5 [glmnet350] Results for glmnet 350 features over 20000 (RF2)

filename<-"./devcon_challenge.glmnet_results_noscale_rf_selected_features_350_20000_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
a5<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
a5
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))

a6 [glmnet500] Results for glmnet 500 features over 20000 (RF2)

filename<-"./devcon_challenge.glmnet_results_noscale_rf_selected_features_500_20000_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
a6<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
a6
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
NA

a7 [glmnet1000] Results for glmnet 1000 features over 20000 (RF2)

filename<-"./devcon_challenge.glmnet_results_noscale_rf_selected_features_1000_20000_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
a7<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
a7
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
NA

a8 [glmnet2500] Results for glmnet 2500 features over 20000 (RF2)

filename<-"./devcon_challenge.glmnet_results_noscale_rf_selected_features_2500_20000_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
a8<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
a8
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
NA

a9 [glmnet5000] Results for glmnet 5000 features over 20000 (RF2)

filename<-"./devcon_challenge.glmnet_results_noscale_rf_selected_features_5000_20000_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
a9<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
a9
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
NA

a10 [glmnet10000] Results for glmnet 10000 features over 20000 (RF2)

filename<-"./devcon_challenge.glmnet_results_noscale_rf_selected_features_10000_20000_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
a10<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
a10
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
NA

a11 [glmnet20000] Results for glmnet 20000 features over 20000 (RF2)

filename<-"./devcon_challenge.glmnet_results_noscale_rf_selected_features_20000_20000_newmix_spearson_finegrain.csv"
readr::write_csv(RESULTS,path = filename)
a11<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
a11
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
NA

x1 [svr200] Results for svr radial noscale 200 features over 20000 (RF2)

filename<-"./devcon_challenge.svr_results_rf_selected_features_200_20000_noscale_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
x1<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
x1
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))

x2 [svr250] Results for svr radial noscale 250 features over 20000 (RF2)

filename<-"./devcon_challenge.svr_results_rf_selected_features_250_20000_noscale_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
x2<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
x2
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))

x3 [svr350] Results for svr radial noscale 350 features over 20000 (RF2)

filename<-"./devcon_challenge.svr_results_rf_selected_features_350_20000_noscale_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
x3<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
x3
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))

x4 [svr500] Results for svr radial noscale 500 features over 20000 (RF2)

filename<-"./devcon_challenge.svr_results_rf_selected_features_500_20000_noscale_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
x4<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
x4
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))

x5 [svr750] Results for svr radial noscale 750 features over 20000 (RF2)

filename<-"./devcon_challenge.svr_results_rf_selected_features_750_20000_noscale_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
x5<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
x5
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))

x6 [svr1000] Results for svr radial noscale 1000 features over 20000 (RF2)

filename<-"./devcon_challenge.svr_results_rf_selected_features_1000_20000_noscale_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
x6<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
x6
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))

x7 [svr1250] Results for svr radial noscale 1250 features over 20000 (RF2)

filename<-"./devcon_challenge.svr_results_rf_selected_features_1250_20000_noscale_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
x7<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
x7
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))

x8 [svr2000] Results for svr radial noscale 2000 features over 20000 (RF2)

filename<-"./devcon_challenge.svr_results_rf_selected_features_2000_20000_noscale_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
x8<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
x8
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))

x9 [svr5000] Results for svr radial noscale 5000 features over 20000 (RF2)

filename<-"./devcon_challenge.svr_results_rf_selected_features_5000_20000_noscale_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
x9<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
x9
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))

z4 [pls500] Results for pls 500 features (RF)

filename<-"./devcon_challenge.pls_results_rf_selected_features_500_20000_noscale_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
z4<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
z4
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))

z3 [pls350] Results for pls 350 features (RF)

filename<-"./devcon_challenge.pls_results_rf_selected_features_350_20000_noscale_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
z3<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
z3
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))

z2 [pls250] Results for pls 250 features (RF)

filename<-"./devcon_challenge.pls_results_rf_selected_features_250_20000_noscale_newmix_spearson_finegrain.csv"
#readr::write_csv(RESULTS,path = filename)
z2<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
z2
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))

z1 [pls200] Results for pls 200 features (RF)

filename<-"./devcon_challenge.pls_results_rf_selected_features_200_20000_noscale_newmix_spearson.csv"
#readr::write_csv(RESULTS,path = filename)
z1<-readr::read_csv(filename) %>% filter(!is.na(pearson)) 
z1
readr::read_csv(filename) %>% filter(!is.na(pearson)) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
readr::read_csv(filename) %>% filter(!is.na(pearson))  %>% filter( datasets %in% c("DS446395","DS500","FIAS4")) %>%  summarise(pearson_mean=mean(pearson),spearman_mean=mean(spearman))
LS0tCnRpdGxlOiAiREVDT05WIERSRUFNIENoYWxsZW5lZ2UgMjAyMCAoNSkiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazogCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIHRvYzogeWVzCi0tLQoKCgpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD04fQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShnZ3Bsb3QyKQphMyR0eXBlPC0iZ2xtbmV0MjAwIgphNCR0eXBlPC0iZ2xtbmV0MjUwIgphNSR0eXBlPC0iZ2xtbmV0MzUwIgphNiR0eXBlPC0iZ2xtbmV0NTAwIgphNyR0eXBlPC0iZ2xtbmV0MTAwMCIKYTgkdHlwZTwtImdsbW5ldDI1MDAiCmE5JHR5cGU8LSJnbG1uZXQ1MDAwIgphMTAkdHlwZTwtImdsbW5ldDEwMDAwIgphMTEkdHlwZTwtImdsbW5ldDIwMDAwIgoKeDEkdHlwZTwtInN2cjIwMCIKeDIkdHlwZTwtInN2cjI1MCIKeDMkdHlwZTwtInN2cjMwMCIKeDQkdHlwZTwtInN2cjUwMCIKeDUkdHlwZTwtInN2cjc1MCIKeDYkdHlwZTwtInN2cjEwMDAiCng3JHR5cGU8LSJzdnIxMjUwIgp4OCR0eXBlPC0ic3ZyMjAwMCIKeDkkdHlwZTwtInN2cjUwMDAiCgoKCno0JHR5cGU8LSJwbHM1MDAiCnozJHR5cGU8LSJwbHMzNTAiCnoyJHR5cGU8LSJwbHMyNTAiCnoxJHR5cGU8LSJwbHMyMDAiCgpoZWF0bWFwIDwtcmJpbmQoYTMsYTQsYTUsYTYsYTcsYTgsYTksYTEwLGExMSwKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgeDEseDIseDMseDQseDUseDYseDcseDgseDksCiAgICAgICAgICAgICAgICB6MSx6Mix6Myx6NCkKCiAKYGBgCgoKIyMgSGVhdG1hcCBwZXIgY2VsbCAoUGVhcnNvbikKYGBge3IgZmlnLndpZHRoPTcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiNsaWJyYXJ5KGdncGxvdGlmeSkKI3BhcihtZnJvdz1jKDIsMSkpCnBhdHRlcm49IkRTIgoKaGVhdG1hcCAlPiUgZ3JvdXBfYnkodHlwZSxjZWxscykgJT4lICBzdW1tYXJpc2UocGVhcnNvbj1tZWFuKHBlYXJzb24pKSAlPiUgcmVzaGFwZTI6OmFjYXN0KHR5cGUgfmNlbGxzKSAlPiUgYXMubWF0cml4KCkgJT4lIGQzaGVhdG1hcDo6ZDNoZWF0bWFwKGNvbG9ycyA9ICJCbHVlcyIpCmBgYAojIyBIZWF0bWFwIHBlciBjZWxsIHJuYXNlcSAoUGVhcnNvbikKYGBge3IgZmlnLndpZHRoPTcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpoZWF0bWFwICU+JSBmaWx0ZXIoZGF0YXNldHMgJWluJSBjKCJEUzQ0NjM5NSIsIkRTNTAwIiwiRklBUzQiKSkgJT4lIGdyb3VwX2J5KHR5cGUsY2VsbHMpICU+JSAgc3VtbWFyaXNlKHBlYXJzb249bWVhbihwZWFyc29uKSkgJT4lIHJlc2hhcGUyOjphY2FzdCh0eXBlIH5jZWxscykgJT4lIGFzLm1hdHJpeCgpICU+JSBkM2hlYXRtYXA6OmQzaGVhdG1hcChjb2xvcnMgPSAiQmx1ZXMiKQpgYGAKCiMjIEhlYXRtYXAgcGVyIGNlbGwgKFNwZWFybWFuKQpgYGB7ciBmaWcud2lkdGg9NywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KaGVhdG1hcCAlPiUgZ3JvdXBfYnkodHlwZSxjZWxscykgJT4lIHN1bW1hcmlzZShzcGVhcm1hbj1tZWFuKHNwZWFybWFuKSkgJT4lIHJlc2hhcGUyOjphY2FzdCh0eXBlIH5jZWxscykgJT4lIGFzLm1hdHJpeCgpICU+JSBkM2hlYXRtYXA6OmQzaGVhdG1hcChjb2xvcnMgPSAiUmVkcyIpCmBgYAoKIyMgSGVhdG1hcCBwZXIgY2VsbCBybmFzZXEgKFNwZWFybWFuKQpgYGB7ciBmaWcud2lkdGg9NywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KaGVhdG1hcCAgJT4lIGZpbHRlcihkYXRhc2V0cyAlaW4lIGMoIkRTNDQ2Mzk1IiwiRFM1MDAiLCJGSUFTNCIpKSAlPiUgZ3JvdXBfYnkodHlwZSxjZWxscykgJT4lIHN1bW1hcmlzZShzcGVhcm1hbj1tZWFuKHNwZWFybWFuKSkgJT4lIHJlc2hhcGUyOjphY2FzdCh0eXBlIH5jZWxscykgJT4lIGFzLm1hdHJpeCgpICU+JSBkM2hlYXRtYXA6OmQzaGVhdG1hcChjb2xvcnMgPSAiUmVkcyIpCmBgYAoKCgoKIyMgSGVhdG1hcCBwZXIgZGF0YXNldCAoUGVhcnNvbikKYGBge3IgZmlnLndpZHRoPTcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiNsaWJyYXJ5KGdncGxvdGlmeSkKI3BhcihtZnJvdz1jKDIsMSkpCnBhdHRlcm49IkRTIgoKaGVhdG1hcCAlPiUgZ3JvdXBfYnkodHlwZSxkYXRhc2V0cykgJT4lICBzdW1tYXJpc2UocGVhcnNvbj1tZWFuKHBlYXJzb24pKSAlPiUgcmVzaGFwZTI6OmFjYXN0KHR5cGUgfmRhdGFzZXRzKSAlPiUgYXMubWF0cml4KCkgJT4lIGQzaGVhdG1hcDo6ZDNoZWF0bWFwKGNvbG9ycyA9ICJCbHVlcyIpCmBgYAojIyBIZWF0bWFwIHBlciBkYXRhc2V0IHJuYXNlcSAoUGVhcnNvbikKYGBge3IgZmlnLndpZHRoPTcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpoZWF0bWFwICU+JSBmaWx0ZXIoZGF0YXNldHMgJWluJSBjKCJEUzQ0NjM5NSIsIkRTNTAwIiwiRklBUzQiKSkgJT4lIGdyb3VwX2J5KHR5cGUsZGF0YXNldHMpICU+JSAgc3VtbWFyaXNlKHBlYXJzb249bWVhbihwZWFyc29uKSkgJT4lIHJlc2hhcGUyOjphY2FzdCh0eXBlIH5kYXRhc2V0cykgJT4lIGFzLm1hdHJpeCgpICU+JSBkM2hlYXRtYXA6OmQzaGVhdG1hcChjb2xvcnMgPSAiQmx1ZXMiKQpgYGAKCiMjIEhlYXRtYXAgcGVyIGRhdGFzZXQgKFNwZWFybWFuKQpgYGB7ciBmaWcud2lkdGg9NywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KaGVhdG1hcCAlPiUgZ3JvdXBfYnkodHlwZSxkYXRhc2V0cykgJT4lIHN1bW1hcmlzZShzcGVhcm1hbj1tZWFuKHNwZWFybWFuKSkgJT4lIHJlc2hhcGUyOjphY2FzdCh0eXBlIH5kYXRhc2V0cykgJT4lIGFzLm1hdHJpeCgpICU+JSBkM2hlYXRtYXA6OmQzaGVhdG1hcChjb2xvcnMgPSAiUmVkcyIpCmBgYAoKIyMgSGVhdG1hcCBwZXIgZGF0YXNldCBybmFzZXEgKFNwZWFybWFuKQpgYGB7ciBmaWcud2lkdGg9NywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KaGVhdG1hcCAgJT4lIGZpbHRlcihkYXRhc2V0cyAlaW4lIGMoIkRTNDQ2Mzk1IiwiRFM1MDAiLCJGSUFTNCIpKSAlPiUgZ3JvdXBfYnkodHlwZSxkYXRhc2V0cykgJT4lIHN1bW1hcmlzZShzcGVhcm1hbj1tZWFuKHNwZWFybWFuKSkgJT4lIHJlc2hhcGUyOjphY2FzdCh0eXBlIH5kYXRhc2V0cykgJT4lIGFzLm1hdHJpeCgpICU+JSBkM2hlYXRtYXA6OmQzaGVhdG1hcChjb2xvcnMgPSAiUmVkcyIpCmBgYAoKCgoKCiMjIGEzIFtnbG1uZXQyMDBdIFJlc3VsdHMgZm9yIGdsbW5ldCAyMDAgZmVhdHVyZXMgb3ZlciAyMDAwMCAoUkYyKQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmaWxlbmFtZTwtIi4vZGV2Y29uX2NoYWxsZW5nZS5nbG1uZXRfcmVzdWx0c19ub3NjYWxlX3JmX3NlbGVjdGVkX2ZlYXR1cmVzXzIwMF8yMDAwMF9uZXdtaXhfc3BlYXJzb25fZmluZWdyYWluLmNzdiIKI3JlYWRyOjp3cml0ZV9jc3YoUkVTVUxUUyxwYXRoID0gZmlsZW5hbWUpCmEzPC1yZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAKYTMKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgICU+JSBmaWx0ZXIoIGRhdGFzZXRzICVpbiUgYygiRFM0NDYzOTUiLCJEUzUwMCIsIkZJQVM0IikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCmBgYAoKCiMjIGE0IFtnbG1uZXQyNTBdIFJlc3VsdHMgZm9yIGdsbW5ldCAyNTAgZmVhdHVyZXMgb3ZlciAyMDAwMCAoUkYyKQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmaWxlbmFtZTwtIi4vZGV2Y29uX2NoYWxsZW5nZS5nbG1uZXRfcmVzdWx0c19ub3NjYWxlX3JmX3NlbGVjdGVkX2ZlYXR1cmVzXzI1MF8yMDAwMF9uZXdtaXhfc3BlYXJzb25fZmluZWdyYWluLmNzdiIKI3JlYWRyOjp3cml0ZV9jc3YoUkVTVUxUUyxwYXRoID0gZmlsZW5hbWUpCmE0PC1yZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAKYTQKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgICU+JSBmaWx0ZXIoIGRhdGFzZXRzICVpbiUgYygiRFM0NDYzOTUiLCJEUzUwMCIsIkZJQVM0IikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCmBgYAoKIyMgYTUgW2dsbW5ldDM1MF0gUmVzdWx0cyBmb3IgZ2xtbmV0IDM1MCBmZWF0dXJlcyBvdmVyIDIwMDAwIChSRjIpCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZpbGVuYW1lPC0iLi9kZXZjb25fY2hhbGxlbmdlLmdsbW5ldF9yZXN1bHRzX25vc2NhbGVfcmZfc2VsZWN0ZWRfZmVhdHVyZXNfMzUwXzIwMDAwX25ld21peF9zcGVhcnNvbl9maW5lZ3JhaW4uY3N2IgojcmVhZHI6OndyaXRlX2NzdihSRVNVTFRTLHBhdGggPSBmaWxlbmFtZSkKYTU8LXJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpIAphNQpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAgJT4lIGZpbHRlciggZGF0YXNldHMgJWluJSBjKCJEUzQ0NjM5NSIsIkRTNTAwIiwiRklBUzQiKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKYGBgCgojIyBhNiBbZ2xtbmV0NTAwXSBSZXN1bHRzIGZvciBnbG1uZXQgNTAwIGZlYXR1cmVzIG92ZXIgMjAwMDAgKFJGMikKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZmlsZW5hbWU8LSIuL2RldmNvbl9jaGFsbGVuZ2UuZ2xtbmV0X3Jlc3VsdHNfbm9zY2FsZV9yZl9zZWxlY3RlZF9mZWF0dXJlc181MDBfMjAwMDBfbmV3bWl4X3NwZWFyc29uX2ZpbmVncmFpbi5jc3YiCiNyZWFkcjo6d3JpdGVfY3N2KFJFU1VMVFMscGF0aCA9IGZpbGVuYW1lKQphNjwtcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgCmE2CnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICAlPiUgZmlsdGVyKCBkYXRhc2V0cyAlaW4lIGMoIkRTNDQ2Mzk1IiwiRFM1MDAiLCJGSUFTNCIpKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQoKYGBgCgoKIyMgYTcgW2dsbW5ldDEwMDBdIFJlc3VsdHMgZm9yIGdsbW5ldCAxMDAwIGZlYXR1cmVzIG92ZXIgMjAwMDAgKFJGMikKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZmlsZW5hbWU8LSIuL2RldmNvbl9jaGFsbGVuZ2UuZ2xtbmV0X3Jlc3VsdHNfbm9zY2FsZV9yZl9zZWxlY3RlZF9mZWF0dXJlc18xMDAwXzIwMDAwX25ld21peF9zcGVhcnNvbl9maW5lZ3JhaW4uY3N2IgojcmVhZHI6OndyaXRlX2NzdihSRVNVTFRTLHBhdGggPSBmaWxlbmFtZSkKYTc8LXJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpIAphNwpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAgJT4lIGZpbHRlciggZGF0YXNldHMgJWluJSBjKCJEUzQ0NjM5NSIsIkRTNTAwIiwiRklBUzQiKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKCmBgYAoKCiMjIGE4IFtnbG1uZXQyNTAwXSBSZXN1bHRzIGZvciBnbG1uZXQgMjUwMCBmZWF0dXJlcyBvdmVyIDIwMDAwIChSRjIpCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZpbGVuYW1lPC0iLi9kZXZjb25fY2hhbGxlbmdlLmdsbW5ldF9yZXN1bHRzX25vc2NhbGVfcmZfc2VsZWN0ZWRfZmVhdHVyZXNfMjUwMF8yMDAwMF9uZXdtaXhfc3BlYXJzb25fZmluZWdyYWluLmNzdiIKI3JlYWRyOjp3cml0ZV9jc3YoUkVTVUxUUyxwYXRoID0gZmlsZW5hbWUpCmE4PC1yZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAKYTgKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgICU+JSBmaWx0ZXIoIGRhdGFzZXRzICVpbiUgYygiRFM0NDYzOTUiLCJEUzUwMCIsIkZJQVM0IikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCgpgYGAKCiMjIGE5IFtnbG1uZXQ1MDAwXSBSZXN1bHRzIGZvciBnbG1uZXQgNTAwMCBmZWF0dXJlcyBvdmVyIDIwMDAwIChSRjIpCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZpbGVuYW1lPC0iLi9kZXZjb25fY2hhbGxlbmdlLmdsbW5ldF9yZXN1bHRzX25vc2NhbGVfcmZfc2VsZWN0ZWRfZmVhdHVyZXNfNTAwMF8yMDAwMF9uZXdtaXhfc3BlYXJzb25fZmluZWdyYWluLmNzdiIKI3JlYWRyOjp3cml0ZV9jc3YoUkVTVUxUUyxwYXRoID0gZmlsZW5hbWUpCmE5PC1yZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAKYTkKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgICU+JSBmaWx0ZXIoIGRhdGFzZXRzICVpbiUgYygiRFM0NDYzOTUiLCJEUzUwMCIsIkZJQVM0IikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCgpgYGAKCiMjIGExMCBbZ2xtbmV0MTAwMDBdIFJlc3VsdHMgZm9yIGdsbW5ldCAxMDAwMCBmZWF0dXJlcyBvdmVyIDIwMDAwIChSRjIpCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZpbGVuYW1lPC0iLi9kZXZjb25fY2hhbGxlbmdlLmdsbW5ldF9yZXN1bHRzX25vc2NhbGVfcmZfc2VsZWN0ZWRfZmVhdHVyZXNfMTAwMDBfMjAwMDBfbmV3bWl4X3NwZWFyc29uX2ZpbmVncmFpbi5jc3YiCiNyZWFkcjo6d3JpdGVfY3N2KFJFU1VMVFMscGF0aCA9IGZpbGVuYW1lKQphMTA8LXJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpIAphMTAKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgICU+JSBmaWx0ZXIoIGRhdGFzZXRzICVpbiUgYygiRFM0NDYzOTUiLCJEUzUwMCIsIkZJQVM0IikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCgpgYGAKCiMjIGExMSBbZ2xtbmV0MjAwMDBdIFJlc3VsdHMgZm9yIGdsbW5ldCAyMDAwMCBmZWF0dXJlcyBvdmVyIDIwMDAwIChSRjIpCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZpbGVuYW1lPC0iLi9kZXZjb25fY2hhbGxlbmdlLmdsbW5ldF9yZXN1bHRzX25vc2NhbGVfcmZfc2VsZWN0ZWRfZmVhdHVyZXNfMjAwMDBfMjAwMDBfbmV3bWl4X3NwZWFyc29uX2ZpbmVncmFpbi5jc3YiCnJlYWRyOjp3cml0ZV9jc3YoUkVTVUxUUyxwYXRoID0gZmlsZW5hbWUpCmExMTwtcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgCmExMQpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAgJT4lIGZpbHRlciggZGF0YXNldHMgJWluJSBjKCJEUzQ0NjM5NSIsIkRTNTAwIiwiRklBUzQiKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKCmBgYAoKIyMgeDEgW3N2cjIwMF0gUmVzdWx0cyBmb3Igc3ZyIHJhZGlhbCBub3NjYWxlIDIwMCBmZWF0dXJlcyBvdmVyIDIwMDAwIChSRjIpIApgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmaWxlbmFtZTwtIi4vZGV2Y29uX2NoYWxsZW5nZS5zdnJfcmVzdWx0c19yZl9zZWxlY3RlZF9mZWF0dXJlc18yMDBfMjAwMDBfbm9zY2FsZV9uZXdtaXhfc3BlYXJzb25fZmluZWdyYWluLmNzdiIKI3JlYWRyOjp3cml0ZV9jc3YoUkVTVUxUUyxwYXRoID0gZmlsZW5hbWUpCngxPC1yZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAKeDEKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgICU+JSBmaWx0ZXIoIGRhdGFzZXRzICVpbiUgYygiRFM0NDYzOTUiLCJEUzUwMCIsIkZJQVM0IikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCmBgYAoKCgojIyB4MiBbc3ZyMjUwXSBSZXN1bHRzIGZvciBzdnIgcmFkaWFsIG5vc2NhbGUgMjUwIGZlYXR1cmVzIG92ZXIgMjAwMDAgKFJGMikgCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZpbGVuYW1lPC0iLi9kZXZjb25fY2hhbGxlbmdlLnN2cl9yZXN1bHRzX3JmX3NlbGVjdGVkX2ZlYXR1cmVzXzI1MF8yMDAwMF9ub3NjYWxlX25ld21peF9zcGVhcnNvbl9maW5lZ3JhaW4uY3N2IgojcmVhZHI6OndyaXRlX2NzdihSRVNVTFRTLHBhdGggPSBmaWxlbmFtZSkKeDI8LXJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpIAp4MgpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAgJT4lIGZpbHRlciggZGF0YXNldHMgJWluJSBjKCJEUzQ0NjM5NSIsIkRTNTAwIiwiRklBUzQiKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKYGBgCgoKIyMgeDMgW3N2cjM1MF0gUmVzdWx0cyBmb3Igc3ZyIHJhZGlhbCBub3NjYWxlIDM1MCBmZWF0dXJlcyBvdmVyIDIwMDAwIChSRjIpIApgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmaWxlbmFtZTwtIi4vZGV2Y29uX2NoYWxsZW5nZS5zdnJfcmVzdWx0c19yZl9zZWxlY3RlZF9mZWF0dXJlc18zNTBfMjAwMDBfbm9zY2FsZV9uZXdtaXhfc3BlYXJzb25fZmluZWdyYWluLmNzdiIKI3JlYWRyOjp3cml0ZV9jc3YoUkVTVUxUUyxwYXRoID0gZmlsZW5hbWUpCngzPC1yZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAKeDMKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgICU+JSBmaWx0ZXIoIGRhdGFzZXRzICVpbiUgYygiRFM0NDYzOTUiLCJEUzUwMCIsIkZJQVM0IikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCmBgYAoKCiMjIHg0IFtzdnI1MDBdIFJlc3VsdHMgZm9yIHN2ciByYWRpYWwgbm9zY2FsZSA1MDAgZmVhdHVyZXMgb3ZlciAyMDAwMCAoUkYyKSAKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZmlsZW5hbWU8LSIuL2RldmNvbl9jaGFsbGVuZ2Uuc3ZyX3Jlc3VsdHNfcmZfc2VsZWN0ZWRfZmVhdHVyZXNfNTAwXzIwMDAwX25vc2NhbGVfbmV3bWl4X3NwZWFyc29uX2ZpbmVncmFpbi5jc3YiCiNyZWFkcjo6d3JpdGVfY3N2KFJFU1VMVFMscGF0aCA9IGZpbGVuYW1lKQp4NDwtcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgCng0CnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICAlPiUgZmlsdGVyKCBkYXRhc2V0cyAlaW4lIGMoIkRTNDQ2Mzk1IiwiRFM1MDAiLCJGSUFTNCIpKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpgYGAKCiMjIHg1IFtzdnI3NTBdIFJlc3VsdHMgZm9yIHN2ciByYWRpYWwgbm9zY2FsZSA3NTAgZmVhdHVyZXMgb3ZlciAyMDAwMCAoUkYyKSAKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZmlsZW5hbWU8LSIuL2RldmNvbl9jaGFsbGVuZ2Uuc3ZyX3Jlc3VsdHNfcmZfc2VsZWN0ZWRfZmVhdHVyZXNfNzUwXzIwMDAwX25vc2NhbGVfbmV3bWl4X3NwZWFyc29uX2ZpbmVncmFpbi5jc3YiCiNyZWFkcjo6d3JpdGVfY3N2KFJFU1VMVFMscGF0aCA9IGZpbGVuYW1lKQp4NTwtcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgCng1CnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICAlPiUgZmlsdGVyKCBkYXRhc2V0cyAlaW4lIGMoIkRTNDQ2Mzk1IiwiRFM1MDAiLCJGSUFTNCIpKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpgYGAKCgojIyB4NiBbc3ZyMTAwMF0gUmVzdWx0cyBmb3Igc3ZyIHJhZGlhbCBub3NjYWxlIDEwMDAgZmVhdHVyZXMgb3ZlciAyMDAwMCAoUkYyKSAKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZmlsZW5hbWU8LSIuL2RldmNvbl9jaGFsbGVuZ2Uuc3ZyX3Jlc3VsdHNfcmZfc2VsZWN0ZWRfZmVhdHVyZXNfMTAwMF8yMDAwMF9ub3NjYWxlX25ld21peF9zcGVhcnNvbl9maW5lZ3JhaW4uY3N2IgojcmVhZHI6OndyaXRlX2NzdihSRVNVTFRTLHBhdGggPSBmaWxlbmFtZSkKeDY8LXJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpIAp4NgpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAgJT4lIGZpbHRlciggZGF0YXNldHMgJWluJSBjKCJEUzQ0NjM5NSIsIkRTNTAwIiwiRklBUzQiKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKYGBgCgojIyB4NyBbc3ZyMTI1MF0gUmVzdWx0cyBmb3Igc3ZyIHJhZGlhbCBub3NjYWxlIDEyNTAgZmVhdHVyZXMgb3ZlciAyMDAwMCAoUkYyKSAKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZmlsZW5hbWU8LSIuL2RldmNvbl9jaGFsbGVuZ2Uuc3ZyX3Jlc3VsdHNfcmZfc2VsZWN0ZWRfZmVhdHVyZXNfMTI1MF8yMDAwMF9ub3NjYWxlX25ld21peF9zcGVhcnNvbl9maW5lZ3JhaW4uY3N2IgojcmVhZHI6OndyaXRlX2NzdihSRVNVTFRTLHBhdGggPSBmaWxlbmFtZSkKeDc8LXJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpIAp4NwpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAgJT4lIGZpbHRlciggZGF0YXNldHMgJWluJSBjKCJEUzQ0NjM5NSIsIkRTNTAwIiwiRklBUzQiKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKYGBgCiMjIHg4IFtzdnIyMDAwXSBSZXN1bHRzIGZvciBzdnIgcmFkaWFsIG5vc2NhbGUgMjAwMCBmZWF0dXJlcyBvdmVyIDIwMDAwIChSRjIpIApgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmaWxlbmFtZTwtIi4vZGV2Y29uX2NoYWxsZW5nZS5zdnJfcmVzdWx0c19yZl9zZWxlY3RlZF9mZWF0dXJlc18yMDAwXzIwMDAwX25vc2NhbGVfbmV3bWl4X3NwZWFyc29uX2ZpbmVncmFpbi5jc3YiCiNyZWFkcjo6d3JpdGVfY3N2KFJFU1VMVFMscGF0aCA9IGZpbGVuYW1lKQp4ODwtcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgCng4CnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICAlPiUgZmlsdGVyKCBkYXRhc2V0cyAlaW4lIGMoIkRTNDQ2Mzk1IiwiRFM1MDAiLCJGSUFTNCIpKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpgYGAKCiMjIHg5IFtzdnI1MDAwXSBSZXN1bHRzIGZvciBzdnIgcmFkaWFsIG5vc2NhbGUgNTAwMCBmZWF0dXJlcyBvdmVyIDIwMDAwIChSRjIpIApgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmaWxlbmFtZTwtIi4vZGV2Y29uX2NoYWxsZW5nZS5zdnJfcmVzdWx0c19yZl9zZWxlY3RlZF9mZWF0dXJlc181MDAwXzIwMDAwX25vc2NhbGVfbmV3bWl4X3NwZWFyc29uX2ZpbmVncmFpbi5jc3YiCiNyZWFkcjo6d3JpdGVfY3N2KFJFU1VMVFMscGF0aCA9IGZpbGVuYW1lKQp4OTwtcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgCng5CnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICAlPiUgZmlsdGVyKCBkYXRhc2V0cyAlaW4lIGMoIkRTNDQ2Mzk1IiwiRFM1MDAiLCJGSUFTNCIpKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpgYGAKCgoKCiMjIHo0IFtwbHM1MDBdIFJlc3VsdHMgZm9yIHBscyA1MDAgZmVhdHVyZXMgKFJGKQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmaWxlbmFtZTwtIi4vZGV2Y29uX2NoYWxsZW5nZS5wbHNfcmVzdWx0c19yZl9zZWxlY3RlZF9mZWF0dXJlc181MDBfMjAwMDBfbm9zY2FsZV9uZXdtaXhfc3BlYXJzb25fZmluZWdyYWluLmNzdiIKI3JlYWRyOjp3cml0ZV9jc3YoUkVTVUxUUyxwYXRoID0gZmlsZW5hbWUpCno0PC1yZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAKejQKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgICU+JSBmaWx0ZXIoIGRhdGFzZXRzICVpbiUgYygiRFM0NDYzOTUiLCJEUzUwMCIsIkZJQVM0IikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCmBgYAojIyB6MyBbcGxzMzUwXSBSZXN1bHRzIGZvciBwbHMgMzUwIGZlYXR1cmVzIChSRikKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZmlsZW5hbWU8LSIuL2RldmNvbl9jaGFsbGVuZ2UucGxzX3Jlc3VsdHNfcmZfc2VsZWN0ZWRfZmVhdHVyZXNfMzUwXzIwMDAwX25vc2NhbGVfbmV3bWl4X3NwZWFyc29uX2ZpbmVncmFpbi5jc3YiCiNyZWFkcjo6d3JpdGVfY3N2KFJFU1VMVFMscGF0aCA9IGZpbGVuYW1lKQp6MzwtcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgCnozCnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCnJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpICAlPiUgZmlsdGVyKCBkYXRhc2V0cyAlaW4lIGMoIkRTNDQ2Mzk1IiwiRFM1MDAiLCJGSUFTNCIpKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpgYGAKIyMgejIgW3BsczI1MF0gUmVzdWx0cyBmb3IgcGxzIDI1MCBmZWF0dXJlcyAoUkYpCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZpbGVuYW1lPC0iLi9kZXZjb25fY2hhbGxlbmdlLnBsc19yZXN1bHRzX3JmX3NlbGVjdGVkX2ZlYXR1cmVzXzI1MF8yMDAwMF9ub3NjYWxlX25ld21peF9zcGVhcnNvbl9maW5lZ3JhaW4uY3N2IgojcmVhZHI6OndyaXRlX2NzdihSRVNVTFRTLHBhdGggPSBmaWxlbmFtZSkKejI8LXJlYWRyOjpyZWFkX2NzdihmaWxlbmFtZSkgJT4lIGZpbHRlcighaXMubmEocGVhcnNvbikpIAp6MgpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAlPiUgIHN1bW1hcmlzZShwZWFyc29uX21lYW49bWVhbihwZWFyc29uKSxzcGVhcm1hbl9tZWFuPW1lYW4oc3BlYXJtYW4pKQpyZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAgJT4lIGZpbHRlciggZGF0YXNldHMgJWluJSBjKCJEUzQ0NjM5NSIsIkRTNTAwIiwiRklBUzQiKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKYGBgCgojIyB6MSBbcGxzMjAwXSBSZXN1bHRzIGZvciBwbHMgMjAwIGZlYXR1cmVzIChSRikKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZmlsZW5hbWU8LSIuL2RldmNvbl9jaGFsbGVuZ2UucGxzX3Jlc3VsdHNfcmZfc2VsZWN0ZWRfZmVhdHVyZXNfMjAwXzIwMDAwX25vc2NhbGVfbmV3bWl4X3NwZWFyc29uLmNzdiIKI3JlYWRyOjp3cml0ZV9jc3YoUkVTVUxUUyxwYXRoID0gZmlsZW5hbWUpCnoxPC1yZWFkcjo6cmVhZF9jc3YoZmlsZW5hbWUpICU+JSBmaWx0ZXIoIWlzLm5hKHBlYXJzb24pKSAKejEKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgJT4lICBzdW1tYXJpc2UocGVhcnNvbl9tZWFuPW1lYW4ocGVhcnNvbiksc3BlYXJtYW5fbWVhbj1tZWFuKHNwZWFybWFuKSkKcmVhZHI6OnJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgZmlsdGVyKCFpcy5uYShwZWFyc29uKSkgICU+JSBmaWx0ZXIoIGRhdGFzZXRzICVpbiUgYygiRFM0NDYzOTUiLCJEUzUwMCIsIkZJQVM0IikpICU+JSAgc3VtbWFyaXNlKHBlYXJzb25fbWVhbj1tZWFuKHBlYXJzb24pLHNwZWFybWFuX21lYW49bWVhbihzcGVhcm1hbikpCmBgYApgYGB7cn0KCmBgYAoK