Performance of prime-seq across many experiments
###1. Load the following packages:
library(tidyverse)
library(ggsignif)
library(ggplotify)
library(ggrepel)
library(ggbeeswarm)
library(edgeR)
library(genefilter)
library(grid)
library(gridExtra)
library(ggsci)
library(UpSetR)
library(cowplot)
###2. Load following functions:
### all necessary custom functions are in the following script
source("/data/share/htp/prime-seq_Paper/Scripts/custom_functions.R")
theme_pub <- theme_bw() + theme(plot.title = element_text(hjust = 0.5, size=18, face="bold"),
axis.text = element_text(colour="black", size=14),
axis.title=element_text(size=16,face="bold"),
legend.text=element_text(size=14),
legend.position="right",
axis.line.x = element_line(colour = "black"),
axis.line.y = element_line(colour = "black"),
strip.background=element_blank(),
strip.text=element_text(size=16))
theme_set(theme_pub)
#prevent scientific notation
options(scipen=999)
fig_path<-"/data/share/htp/prime-seq_Paper/Fig_graphic/sensitivity/"
###3. Main - Sensitivity figure number of umis
ggsave("/data/share/htp/prime-seq_Paper/Fig_graphic/sensitivity/a1.pdf", a1, width = 13, height = 5, units = "in")
Error in ggsave("/data/share/htp/prime-seq_Paper/Fig_graphic/sensitivity/a1.pdf", :
could not find function "ggsave"
###4. Supp - Sensitivity figure number of genes
prime_df <- read.csv("prime_seq_projects.csv", header = T, stringsAsFactors = T, sep = ";")
prime_df_long <- pivot_longer(prime_df,
c(Genes_Exon_Only, Genes_Intron_Only, Genes_Both),
values_to = "Number_Genes",
names_to = "Feature")
#relevel factors
prime_df_long$Sample_Type<-factor(prime_df_long$Sample_Type,
levels=c("Nervous", "Cardiopulmonary",
"Digestive/Excretory",
"Renal/Urinary","Reproductive",
"Musculoskeletal","Immune","Cell Line",
"PDX","Plant",
"Plant/Fungus","Fungus"))
prime_df_long$Feature<-factor(prime_df_long$Feature,
levels=rev(c("Genes_Both", "Genes_Exon_Only",
"Genes_Intron_Only")))
# plot
a <- ggplot(prime_df_long[prime_df_long$Category == "A",], aes(x = reorder(Project, -Number_Genes), y = Number_Genes, fill = Feature, alpha = Average_reads_per_sample))+
geom_bar(stat="identity", width = 1)+
facet_grid(Sample_Type~., scales="free", space = "free", switch = "y") +
ylab("Number of Genes") +
coord_flip() +
ylim(0,30500)+
scale_fill_manual(labels = c("Intron", "Exon", "Both"),
values = c("#118730", "#1a5084", "gray60"))+
scale_alpha_continuous(range = c(0.6, 1), guide = FALSE)+
guides(fill = guide_legend(reverse=T))+
theme_pub+
theme(legend.position="none",
axis.title.y = element_blank(),
axis.text.y = element_blank(),
strip.text.y.left = element_text(angle = 0, size = 10),
strip.placement = "outside",
panel.grid.major = element_blank(),
panel.grid.minor.y = element_blank(),
axis.ticks.y = element_blank())
b <- ggplot(prime_df_long[prime_df_long$Category == "B",], aes(x = reorder(Project, -Number_Genes), y = Number_Genes, fill = Feature, alpha = Average_reads_per_sample))+
geom_bar(stat="identity", width = 1)+
facet_grid(Sample_Type~., scales="free", space = "free", switch = "y") +
ylab("Number of Genes") +
coord_flip() +
ylim(0,40500)+
scale_fill_manual(labels = c("Intron", "Exon", "Both"),
values = c("#118730", "#1a5084", "gray60"))+
scale_alpha_continuous(range = c(0.6, 1), guide = FALSE)+
guides(fill = guide_legend(reverse=T))+
theme_pub+
theme(legend.position="none",
axis.title.y = element_blank(),
axis.text.y = element_blank(),
strip.text.y.left = element_text(angle = 0, size = 10),
strip.placement = "outside",
panel.grid.major = element_blank(),
panel.grid.minor.y = element_blank(),
axis.ticks.y = element_blank())
c <- ggplot(prime_df_long[prime_df_long$Category == "C",], aes(x = reorder(Project, -Number_Genes), y = Number_Genes, fill = Feature, alpha = Average_reads_per_sample))+
geom_bar(stat="identity", width = 1)+
facet_grid(Sample_Type~., scales="free", space = "free", switch = "y") +
ylab("Number of Genes") +
coord_flip() +
ylim(0,30500)+
scale_fill_manual(labels = c("Intron", "Exon", "Both"),
values = c("#118730", "#1a5084", "gray60"))+
scale_alpha_continuous(range = c(0.6, 1), guide = FALSE)+
guides(fill = guide_legend(reverse=T))+
theme_pub+
theme(legend.position="none",
axis.title.y = element_blank(),
axis.text.y = element_blank(),
strip.text.y.left = element_text(angle = 0, size = 10),
strip.placement = "outside",
panel.grid.major = element_blank(),
panel.grid.minor.y = element_blank(),
axis.ticks.y = element_blank())
ggsave("/data/share/htp/prime-seq_Paper/Fig_graphic/sensitivity/a.pdf", a, width = 8, height = 11, units = "in")
ggsave("/data/share/htp/prime-seq_Paper/Fig_graphic/sensitivity/b.pdf", b, width = 8, height = 5.97, units = "in")
ggsave("/data/share/htp/prime-seq_Paper/Fig_graphic/sensitivity/c.pdf", c, width = 8, height = 2, units = "in")
LS0tCnRpdGxlOiAiU2Vuc2l0aXZpdHlfZ3JhcGhpYyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKUGVyZm9ybWFuY2Ugb2YgcHJpbWUtc2VxIGFjcm9zcyBtYW55IGV4cGVyaW1lbnRzCgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCmBgYAoKIyMjMS4gTG9hZCB0aGUgZm9sbG93aW5nIHBhY2thZ2VzOgoKYGBge3IgcGFja2FnZXN9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdnc2lnbmlmKQpsaWJyYXJ5KGdncGxvdGlmeSkKbGlicmFyeShnZ3JlcGVsKQpsaWJyYXJ5KGdnYmVlc3dhcm0pCmxpYnJhcnkoZWRnZVIpCmxpYnJhcnkoZ2VuZWZpbHRlcikKbGlicmFyeShncmlkKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShnZ3NjaSkKbGlicmFyeShVcFNldFIpCmxpYnJhcnkoY293cGxvdCkKCmBgYAoKIyMjMi4gTG9hZCBmb2xsb3dpbmcgZnVuY3Rpb25zOgoKCmBgYHtyIGZ1bmN0aW9uc30KIyMjIGFsbCBuZWNlc3NhcnkgY3VzdG9tIGZ1bmN0aW9ucyBhcmUgaW4gdGhlIGZvbGxvd2luZyBzY3JpcHQKc291cmNlKCIvZGF0YS9zaGFyZS9odHAvcHJpbWUtc2VxX1BhcGVyL1NjcmlwdHMvY3VzdG9tX2Z1bmN0aW9ucy5SIikKCnRoZW1lX3B1YiA8LSB0aGVtZV9idygpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZT0xOCwgZmFjZT0iYm9sZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPTE0KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE2LGZhY2U9ImJvbGQiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249InJpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAuYmFja2dyb3VuZD1lbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNikpICAKCnRoZW1lX3NldCh0aGVtZV9wdWIpCgojcHJldmVudCBzY2llbnRpZmljIG5vdGF0aW9uCm9wdGlvbnMoc2NpcGVuPTk5OSkKCmZpZ19wYXRoPC0iL2RhdGEvc2hhcmUvaHRwL3ByaW1lLXNlcV9QYXBlci9GaWdfZ3JhcGhpYy9zZW5zaXRpdml0eS8iCgpgYGAKCiMjIzMuIE1haW4gLSBTZW5zaXRpdml0eSBmaWd1cmUgbnVtYmVyIG9mIHVtaXMKCmBgYHtyIH0KCnByaW1lX2RmIDwtIHJlYWQuY3N2KCJwcmltZV9zZXFfcHJvamVjdHMuY3N2IiwgaGVhZGVyID0gVCwgc3RyaW5nc0FzRmFjdG9ycyA9IFQsIHNlcCA9ICIsIikKcHJpbWVfZGZfbG9uZyA8LSBwaXZvdF9sb25nZXIocHJpbWVfZGYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKFVNSV9FeG9uaWMsIFVNSV9JbnRyb25pYyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiTnVtYmVyX1VNSXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiRmVhdHVyZSIpCgojcmVsZXZlbCBmYWN0b3JzCnByaW1lX2RmX2xvbmckU2FtcGxlX1R5cGU8LWZhY3RvcihwcmltZV9kZl9sb25nJFNhbXBsZV9UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJOZXJ2b3VzIiwgIkNhcmRpb3B1bG1vbmFyeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWdlc3RpdmUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXJpbmFyeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbW11bmUiLCJDYW5jZXIgQ2VsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsdXJpcG90ZW50IENlbGwiKSkKcHJpbWVfZGZfbG9uZyRGZWF0dXJlPC1mYWN0b3IocHJpbWVfZGZfbG9uZyRGZWF0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1yZXYoYygiVU1JX0V4b25pYyIsICJVTUlfSW50cm9uaWMiKSkpCgojIHBsb3QKYTEgPC0gZ2dwbG90KHByaW1lX2RmX2xvbmcsIGFlcyh4ID0gcmVvcmRlcihQcm9qZWN0LCAtZnJhY19pbmV4X3VtaSksIHkgPSBOdW1iZXJfVU1JcywgZmlsbCA9IEZlYXR1cmUsIGFscGhhID0gYXMubnVtZXJpYyhBdmVyYWdlX3JlYWRzX3Blcl9zYW1wbGUpKSkrCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiKSsKICAgIGZhY2V0X2dyaWQoflNhbXBsZV9UeXBlLCBzY2FsZXM9ImZyZWUiLCBzcGFjZSA9ICJmcmVlIiwgc3dpdGNoID0gIngiKSArCiAgICB5bGFiKCJGcmFjdGlvbiBvZiBVTUlzIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwobGFiZWxzID0gYygiSW50cm9uIiwgIkV4b24iKSwgCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIjMTE4NzMwIiwgIiMxYTUwODQiKSkrCiAgICBzY2FsZV9hbHBoYV9jb250aW51b3VzKHJhbmdlID0gYygwLjc1LCAxKSwgZ3VpZGUgPSBGQUxTRSkrCiAgICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlPVQpKSsKICAgIHRoZW1lX3B1YisKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIAogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHNpemUgPSAxMCksCiAgICAgICAgICBzdHJpcC5wbGFjZW1lbnQgPSAib3V0c2lkZSIsCiAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSkgCgpnZ3NhdmUoIi9kYXRhL3NoYXJlL2h0cC9wcmltZS1zZXFfUGFwZXIvRmlnX2dyYXBoaWMvc2Vuc2l0aXZpdHkvYTEucGRmIiwgYTEsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUsIHVuaXRzID0gImluIikKCmBgYAoKCiMjIzQuIFN1cHAgLSBTZW5zaXRpdml0eSBmaWd1cmUgbnVtYmVyIG9mIGdlbmVzCgpgYGB7ciB9CgpwcmltZV9kZiA8LSByZWFkLmNzdigicHJpbWVfc2VxX3Byb2plY3RzX2dlbmVfbnVtLmNzdiIsIGhlYWRlciA9IFQsIHN0cmluZ3NBc0ZhY3RvcnMgPSBULCBzZXAgPSAiLCIpCnByaW1lX2RmX2xvbmcgPC0gcGl2b3RfbG9uZ2VyKHByaW1lX2RmLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhHZW5lc19FeG9uX09ubHksIEdlbmVzX0ludHJvbl9Pbmx5LCBHZW5lc19Cb3RoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJOdW1iZXJfR2VuZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiRmVhdHVyZSIpCgojcmVsZXZlbCBmYWN0b3JzCnByaW1lX2RmX2xvbmckU2FtcGxlX1R5cGU8LWZhY3RvcihwcmltZV9kZl9sb25nJFNhbXBsZV9UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJOZXJ2b3VzIiwgIkNhcmRpb3B1bG1vbmFyeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWdlc3RpdmUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXJpbmFyeSIsIlJlcHJvZHVjdGl2ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdXNjdWxvc2tlbGV0YWwiLCJJbW11bmUiLCJDYW5jZXIgQ2VsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBEWCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsdXJpcG90ZW50IENlbGwiLCJQbGFudCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGFudC9GdW5ndXMiLCJGdW5ndXMiKSkKcHJpbWVfZGZfbG9uZyRGZWF0dXJlPC1mYWN0b3IocHJpbWVfZGZfbG9uZyRGZWF0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1yZXYoYygiR2VuZXNfRXhvbl9Pbmx5IiwgIkdlbmVzX0JvdGgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXNfSW50cm9uX09ubHkiKSkpCgojIHBsb3QKYSA8LSBnZ3Bsb3QocHJpbWVfZGZfbG9uZ1twcmltZV9kZl9sb25nJENhdGVnb3J5ID09ICJBIixdLCBhZXMoeCA9IHJlb3JkZXIoUHJvamVjdCwgLU51bWJlcl9HZW5lcyksIHkgPSBOdW1iZXJfR2VuZXMsIGZpbGwgPSBGZWF0dXJlLCBhbHBoYSA9IGFzLm51bWVyaWMoQXZlcmFnZV9yZWFkc19wZXJfc2FtcGxlKSkpKwogICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aCA9IDEpKwogICAgZmFjZXRfZ3JpZChTYW1wbGVfVHlwZX4uLCBzY2FsZXM9ImZyZWUiLCBzcGFjZSA9ICJmcmVlIiwgc3dpdGNoID0gInkiKSArCiAgICB5bGFiKCJOdW1iZXIgb2YgR2VuZXMiKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgeWxpbSgwLDMwNTAwKSsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKGxhYmVscyA9IGMoIkludHJvbiIsICJCb3RoIiwgIkV4b24iKSwgCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIjMTE4NzMwIiwgIiM1RjhBOEIiLCAiIzFhNTA4NCIpKSsKICAgIHNjYWxlX2FscGhhX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuNzUsIDEpLCBndWlkZSA9IEZBTFNFKSsKICAgIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKHJldmVyc2U9VCkpKwogICAgdGhlbWVfcHViKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgCiAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBzdHJpcC50ZXh0LnkubGVmdCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIHNpemUgPSAxMCksCiAgICAgICAgICBzdHJpcC5wbGFjZW1lbnQgPSAib3V0c2lkZSIsCiAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkgCgpiIDwtIGdncGxvdChwcmltZV9kZl9sb25nW3ByaW1lX2RmX2xvbmckQ2F0ZWdvcnkgPT0gIkIiLF0sIGFlcyh4ID0gcmVvcmRlcihQcm9qZWN0LCAtTnVtYmVyX0dlbmVzKSwgeSA9IE51bWJlcl9HZW5lcywgZmlsbCA9IEZlYXR1cmUsIGFscGhhID0gYXMubnVtZXJpYyhBdmVyYWdlX3JlYWRzX3Blcl9zYW1wbGUpKSkrCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoID0gMSkrCiAgICBmYWNldF9ncmlkKFNhbXBsZV9UeXBlfi4sIHNjYWxlcz0iZnJlZSIsIHNwYWNlID0gImZyZWUiLCBzd2l0Y2ggPSAieSIpICsKICAgIHlsYWIoIk51bWJlciBvZiBHZW5lcyIpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICB5bGltKDAsNDAwMDApKwogICAgc2NhbGVfZmlsbF9tYW51YWwobGFiZWxzID0gYygiSW50cm9uIiwgIkJvdGgiLCAiRXhvbiIpLCAKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIiMxMTg3MzAiLCAiIzVGOEE4QiIsICIjMWE1MDg0IikpKwogICAgc2NhbGVfYWxwaGFfY29udGludW91cyhyYW5nZSA9IGMoMC43NSwgMSksIGd1aWRlID0gRkFMU0UpKwogICAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQocmV2ZXJzZT1UKSkrCiAgICB0aGVtZV9wdWIrCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCAKICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHN0cmlwLnRleHQueS5sZWZ0ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgc2l6ZSA9IDEwKSwKICAgICAgICAgIHN0cmlwLnBsYWNlbWVudCA9ICJvdXRzaWRlIiwKICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKSAKCmMgPC0gZ2dwbG90KHByaW1lX2RmX2xvbmdbcHJpbWVfZGZfbG9uZyRDYXRlZ29yeSA9PSAiQyIsXSwgYWVzKHggPSByZW9yZGVyKFByb2plY3QsIC1OdW1iZXJfR2VuZXMpLCB5ID0gTnVtYmVyX0dlbmVzLCBmaWxsID0gRmVhdHVyZSwgYWxwaGEgPSBhcy5udW1lcmljKEF2ZXJhZ2VfcmVhZHNfcGVyX3NhbXBsZSkpKSsKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGggPSAxKSsKICAgIGZhY2V0X2dyaWQoU2FtcGxlX1R5cGV+Liwgc2NhbGVzPSJmcmVlIiwgc3BhY2UgPSAiZnJlZSIsIHN3aXRjaCA9ICJ5IikgKwogICAgeWxhYigiTnVtYmVyIG9mIEdlbmVzIikgKwogICAgY29vcmRfZmxpcCgpICsKICAgIHlsaW0oMCwzMDUwMCkrCiAgICBzY2FsZV9maWxsX21hbnVhbChsYWJlbHMgPSBjKCJJbnRyb24iLCAiQm90aCIsICJFeG9uIiksIAogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiIzExODczMCIsICIjNUY4QThCIiwgIiMxYTUwODQiKSkrCiAgICBzY2FsZV9hbHBoYV9jb250aW51b3VzKHJhbmdlID0gYygwLjc1LCAxKSwgZ3VpZGUgPSBGQUxTRSkrCiAgICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlPVQpKSsKICAgIHRoZW1lX3B1YisKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIAogICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgc3RyaXAudGV4dC55LmxlZnQgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBzaXplID0gMTApLAogICAgICAgICAgc3RyaXAucGxhY2VtZW50ID0gIm91dHNpZGUiLAogICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpIAoKCmdnc2F2ZSgiL2RhdGEvc2hhcmUvaHRwL3ByaW1lLXNlcV9QYXBlci9GaWdfZ3JhcGhpYy9zZW5zaXRpdml0eS9hLnBkZiIsIGEsIHdpZHRoID0gOCwgaGVpZ2h0ID0gMTEsIHVuaXRzID0gImluIikKCmdnc2F2ZSgiL2RhdGEvc2hhcmUvaHRwL3ByaW1lLXNlcV9QYXBlci9GaWdfZ3JhcGhpYy9zZW5zaXRpdml0eS9iLnBkZiIsIGIsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNS45NywgdW5pdHMgPSAiaW4iKQoKZ2dzYXZlKCIvZGF0YS9zaGFyZS9odHAvcHJpbWUtc2VxX1BhcGVyL0ZpZ19ncmFwaGljL3NlbnNpdGl2aXR5L2MucGRmIiwgYywgd2lkdGggPSA3LjksIGhlaWdodCA9IDIsIHVuaXRzID0gImluIikKCgoKYGBg