# print params
paged_table(as.data.frame(unlist(params)))
Data
library(TCGAbiolinks)
library(biomaRt)
library(kableExtra)
library(rmarkdown)
source("./Notebooks/TCGA/TCGA_functions.R")
# get hpv signature genes
scc_deg = readRDS(file = "./Data_out/scc_deg.rds")
avg_diff_cutoff = 0.6
fdr_cutoff = 0.1
signature = scc_deg %>% filter(avg_diff > avg_diff_cutoff &
fdr < fdr_cutoff) %>% rownames()
signature
[1] "AQP3" "TXN" "IGFBP2" "RPS2" "RPS5" "MT-CO2" "KRT19" "KRT5" "ATP1B3" "MT-CYB" "DEK" "MT-CO3"
[13] "S100A2" "ITM2B" "SFN" "NUCKS1" "IFI16" "SERBP1" "FABP5" "RPS10" "MT-ND4" "HMGN2" "TNFSF10" "MT-ATP6"
[25] "ID1" "HMGB1" "HES1" "MT-ND3" "PERP" "TACSTD2" "JUN" "CLDN4" "MT-ND5" "FOS" "IFI27" "MT1X"
[37] "LY6D" "RPS11" "FOSB" "DSP" "MT-ND1" "KRT15"
project_name = "TCGA-CESC"
# cesc_tpm = prepare_datasets(project_name = "TCGA-CESC")
# saveRDS(cesc_tpm,file = "./Data_out/TCGA_survival_analysis/TCGA_CESC_TPM.RDS")
cesc_tpm = readRDS("./Data_out/TCGA_survival_analysis/TCGA_CESC_TPM.RDS")
if (params$log_tpm) {
cesc_tpm = log2(cesc_tpm+1)
}
clinical_data <- GDCquery_clinic(project_name, "clinical")
CESC_tissues = c("Basaloid squamous cell carcinoma",
"Papillary squamous cell carcinoma",
"Squamous cell carcinoma, keratinizing, NOS",
"Squamous cell carcinoma, large cell, nonkeratinizing, NOS",
"Squamous cell carcinoma, NOS")
clinical_data = clinical_data[clinical_data$primary_diagnosis %in% CESC_tissues,]
MYB
gene_status = set_clinical_data(clin_data = clinical_data,genes = "MYB",tpm_data_frame = cesc_tpm,stratify = params$stratify)
paged_table(gene_status)
clinical_data_with_scores = clinical_data[clinical_data$submitter_id %in% rownames(gene_status),]
gene_status$patient = rownames(gene_status)
clinical_data_with_scores = left_join(x = clinical_data_with_scores,y = gene_status, by = c("submitter_id"="patient"))
p = TCGAanalyze_survival(
data = clinical_data_with_scores,
clusterCol = "gene_status",
main = "TCGA Set\n GBM",
height = 10,
width=10,filename = NULL,pval.method = T
)
p[[1]]/p[[2]]
Warning in grSoftVersion() :
unable to load shared object '/usr/local/lib/R/modules//R_X11.so':
libXt.so.6: cannot open shared object file: No such file or directory

HPV+ signature
# load data
library("readxl")
library(stringr)
library(ggpubr)
TCGA_HPV_data <- read_excel("./Input_data/TCGA/PMC3806554_ncomms3513-s2.xlsx",skip = 3)
TCGA_HPV_data %<>% filter(`Tumor type` == "Primary solid")
TCGA_HPV_data$submitter_id = TCGA_HPV_data$`Sample barcode` %>% str_sub( start = 1, end = 12)
TCGA_HPV_data = TCGA_HPV_data %>%
filter(Cancer == "CESC") %>%
mutate (hpv_status =
if_else(
condition = ppm == "N/A",
true = "HPV-",
false = "HPV+"))
clinical_data = inner_join(x = clinical_data,y = TCGA_HPV_data,by = c("submitter_id"="submitter_id"))
p = TCGAanalyze_survival(
data = clinical_data,
clusterCol = "hpv_status",
main = "TCGA Set\n GBM",
filename = NULL,pval.method = T
)
p[[1]]/p[[2]]

MYB- HPV
correlation
gene_status = set_clinical_data(clin_data = clinical_data,genes = "MYB",tpm_data_frame = cesc_tpm,stratify = params$stratify)
gene_status = gene_status[TCGA_HPV_data$submitter_id,] %>% cbind(HPV_PPM = as.numeric(TCGA_HPV_data$ppm))
Warning in eval(quote(list(...)), env) : NAs introduced by coercion
paged_table(gene_status)
sp <- ggscatter(gene_status, x = "MYB", y = "HPV_PPM",
add = "reg.line", # Add regressin line
add.params = list(color = "blue", fill = "lightgray"), # Customize reg. line
conf.int = TRUE # Add confidence interval
)
# Add correlation coefficient
sp + stat_cor(method = "pearson")
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 12 rows containing non-finite values (stat_smooth).
Warning: Removed 12 rows containing non-finite values (stat_cor).
Warning: Removed 12 rows containing missing values (geom_point).

HPV signature-HPV
correlation
gene_status = set_clinical_data(clin_data = clinical_data,genes = signature,tpm_data_frame = cesc_tpm,stratify = params$stratify,signature_name = "HPV+ signature")
gene_status = gene_status[TCGA_HPV_data$submitter_id,] %>% cbind(HPV_PPM = TCGA_HPV_data$ppm)
paged_table(gene_status)
sp <- ggscatter(gene_status, x = "HPV+ signature", y = "HPV_PPM",
add = "reg.line", # Add regressin line
add.params = list(color = "blue", fill = "lightgray"), # Customize reg. line
conf.int = TRUE # Add confidence interval
)
# Add correlation coefficient
sp + stat_cor(method = "pearson")
MYB- HPV T test
# create data
gene_status = set_clinical_data(clin_data = clinical_data,genes = "MYB",tpm_data_frame = cesc_tpm,stratify = params$stratify)
gene_status$patient = rownames(gene_status)
gene_status = inner_join(x = gene_status,y = clinical_data[,c("submitter_id","hpv_status")],by = c("patient"="submitter_id"))
paged_table(gene_status)
NA
NA
NA
# plot
library(ggpubr)
library(rstatix)
stat.test <- gene_status %>%
t_test(MYB ~ hpv_status) %>%
add_significance()
stat.test
bxp <- ggboxplot(gene_status, x = "hpv_status", y = "MYB", fill = "#00AFBB",add = "jitter")
stat.test <- stat.test %>% add_xy_position(x = "hpv_status")
bxp +
stat_pvalue_manual(stat.test, label = "T-test, p = {p}")

MYB and HPV survival
plot
gene_status = set_clinical_data(clin_data = clinical_data,genes = "MYB",tpm_data_frame = cesc_tpm,stratify = params$stratify)
gene_status$HPV_status = if_else(
condition = row.names(gene_status) %in% TCGA_HPV_data$submitter_id,
true = "HPV+",
false = "HPV-"
)
gene_status$gene_status = paste(gene_status$gene_status,gene_status$HPV_status,sep = ", ")
gene_status$HPV_status = NULL
paged_table(gene_status)
clinical_data_with_scores = clinical_data[clinical_data$submitter_id %in% rownames(gene_status),]
gene_status$patient = rownames(gene_status)
clinical_data_with_scores = left_join(x = clinical_data_with_scores,y = gene_status, by = c("submitter_id"="patient"))
p = TCGAanalyze_survival(
data = clinical_data_with_scores,
clusterCol = "gene_status",
main = "TCGA Set\n GBM",
height = 10,
width=10,filename = NULL,pval.method = T
)
p[[1]]/p[[2]]
shared signature
shared_signature = readRDS(file = "./Data_out/temp/shared_signature.RDS")
gene_status = set_clinical_data(clin_data = clinical_data,genes = shared_signature,tpm_data_frame = cesc_tpm,stratify = params$stratify,signature_name = "HPV+ signature")
paged_table(gene_status)
clinical_data_with_scores = clinical_data[clinical_data$submitter_id %in% rownames(gene_status),]
gene_status$patient = rownames(gene_status)
clinical_data_with_scores = left_join(x = clinical_data_with_scores,y = gene_status, by = c("submitter_id"="patient"))
p = TCGAanalyze_survival(
data = clinical_data_with_scores,
clusterCol = "gene_status",
main = "TCGA Set\n GBM",
height = 10,
width=10,filename = NULL,pval.method = T
)
p[[1]]/p[[2]]
HMSC signature
# load
hmsc_deg = read.table(file = "./Data_out/HPV_analysis/hpv_deg_df.csv",row.names = 1)
avg_diff_cutoff = 1
fdr_cutoff = 0.1
signature = hmsc_deg %>% filter(avg_diff>avg_diff_cutoff & fdr<fdr_cutoff) %>% rownames()
signature
gene_status = set_clinical_data(clin_data = clinical_data,genes = signature,tpm_data_frame = cesc_tpm,stratify = params$stratify,signature_name = "HPV+ signature")
paged_table(gene_status)
clinical_data_with_scores = clinical_data[clinical_data$submitter_id %in% rownames(gene_status),]
gene_status$patient = rownames(gene_status)
clinical_data_with_scores = left_join(x = clinical_data_with_scores,y = gene_status, by = c("submitter_id"="patient"))
p = TCGAanalyze_survival(
data = clinical_data_with_scores,
clusterCol = "gene_status",
main = "TCGA Set\n GBM",
height = 10,
width=10,filename = NULL,pval.method = T
)
p[[1]]/p[[2]]
LS0tCnRpdGxlOiAnYHIgcnN0dWRpb2FwaTo6Z2V0U291cmNlRWRpdG9yQ29udGV4dCgpJHBhdGggJT4lIGJhc2VuYW1lKCkgJT4lIGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLHJlcGxhY2VtZW50ID0gIiIpYCcgCmF1dGhvcjogIkF2aXNoYWkgV2l6ZWwiCmRhdGU6ICdgciBTeXMudGltZSgpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19jb2xsYXBzZTogeWVzCiAgICB0b2NfZmxvYXQ6IAogICAgICBjb2xsYXBzZWQ6IFRSVUUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdG9jX2RlcHRoOiAyCiAgICAKICBodG1sX2RvY3VtZW50OiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19jb2xsYXBzZTogeWVzCiAgICB0b2NfZmxvYXQ6IAogICAgICBjb2xsYXBzZWQ6IFRSVUUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdG9jX2RlcHRoOiAyCiAgICBkZi1wcmludDogcGFnZWQKcGFyYW1zOgogIHN0cmF0aWZ5OiAiTSIKICBsb2dfdHBtOiBUUlVFCiAgZGF0YV9vdXRfZGlyOiBOVUxMCiAgZmlnc19vdXRfZGlyOiBOVUxMCi0tLQoKYGBge3J9CiMgcHJpbnQgcGFyYW1zCnBhZ2VkX3RhYmxlKGFzLmRhdGEuZnJhbWUodW5saXN0KHBhcmFtcykpKQpgYGAKCiMgRGF0YQpgYGB7cn0KbGlicmFyeShUQ0dBYmlvbGlua3MpCmxpYnJhcnkoYmlvbWFSdCkKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KHJtYXJrZG93bikKc291cmNlKCIuL05vdGVib29rcy9UQ0dBL1RDR0FfZnVuY3Rpb25zLlIiKQoKYGBgCgoKCmBgYHtyfQojIGdldCBocHYgc2lnbmF0dXJlIGdlbmVzCnNjY19kZWcgPSByZWFkUkRTKGZpbGUgPSAiLi9EYXRhX291dC9zY2NfZGVnLnJkcyIpCgphdmdfZGlmZl9jdXRvZmYgPSAwLjYKZmRyX2N1dG9mZiA9IDAuMQpzaWduYXR1cmUgPSBzY2NfZGVnICU+JSBmaWx0ZXIoYXZnX2RpZmYgPiBhdmdfZGlmZl9jdXRvZmYgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRyIDwgZmRyX2N1dG9mZikgJT4lIHJvd25hbWVzKCkKc2lnbmF0dXJlCiAgCmBgYAoKYGBge3J9CnByb2plY3RfbmFtZSA9ICJUQ0dBLUNFU0MiCmBgYAoKYGBge3J9CiMgY2VzY190cG0gPSBwcmVwYXJlX2RhdGFzZXRzKHByb2plY3RfbmFtZSA9ICJUQ0dBLUNFU0MiKQojIHNhdmVSRFMoY2VzY190cG0sZmlsZSA9ICIuL0RhdGFfb3V0L1RDR0Ffc3Vydml2YWxfYW5hbHlzaXMvVENHQV9DRVNDX1RQTS5SRFMiKQpjZXNjX3RwbSA9IHJlYWRSRFMoIi4vRGF0YV9vdXQvVENHQV9zdXJ2aXZhbF9hbmFseXNpcy9UQ0dBX0NFU0NfVFBNLlJEUyIpCgppZiAocGFyYW1zJGxvZ190cG0pIHsKICBjZXNjX3RwbSA9IGxvZzIoY2VzY190cG0rMSkKICAKfQpgYGAKCgpgYGB7cn0KY2xpbmljYWxfZGF0YSA8LSBHRENxdWVyeV9jbGluaWMocHJvamVjdF9uYW1lLCAiY2xpbmljYWwiKQpDRVNDX3Rpc3N1ZXMgPSBjKCJCYXNhbG9pZCBzcXVhbW91cyBjZWxsIGNhcmNpbm9tYSIsCiJQYXBpbGxhcnkgc3F1YW1vdXMgY2VsbCBjYXJjaW5vbWEiLAoiU3F1YW1vdXMgY2VsbCBjYXJjaW5vbWEsIGtlcmF0aW5pemluZywgTk9TIiwKIlNxdWFtb3VzIGNlbGwgY2FyY2lub21hLCBsYXJnZSBjZWxsLCBub25rZXJhdGluaXppbmcsIE5PUyIsCiJTcXVhbW91cyBjZWxsIGNhcmNpbm9tYSwgTk9TIikKY2xpbmljYWxfZGF0YSA9IGNsaW5pY2FsX2RhdGFbY2xpbmljYWxfZGF0YSRwcmltYXJ5X2RpYWdub3NpcyAlaW4lIENFU0NfdGlzc3VlcyxdCmBgYAoKCgojIE1ZQgpgYGB7cn0KZ2VuZV9zdGF0dXMgPSBzZXRfY2xpbmljYWxfZGF0YShjbGluX2RhdGEgPSBjbGluaWNhbF9kYXRhLGdlbmVzID0gIk1ZQiIsdHBtX2RhdGFfZnJhbWUgPSBjZXNjX3RwbSxzdHJhdGlmeSA9IHBhcmFtcyRzdHJhdGlmeSkKcGFnZWRfdGFibGUoZ2VuZV9zdGF0dXMpCmBgYAoKCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQpjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzID0gY2xpbmljYWxfZGF0YVtjbGluaWNhbF9kYXRhJHN1Ym1pdHRlcl9pZCAlaW4lIHJvd25hbWVzKGdlbmVfc3RhdHVzKSxdCmdlbmVfc3RhdHVzJHBhdGllbnQgPSByb3duYW1lcyhnZW5lX3N0YXR1cykKY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcyA9IGxlZnRfam9pbih4ID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3Jlcyx5ID0gZ2VuZV9zdGF0dXMsIGJ5ID0gYygic3VibWl0dGVyX2lkIj0icGF0aWVudCIpKQoKcCA9IFRDR0FhbmFseXplX3N1cnZpdmFsKAogICAgZGF0YSA9IGNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMsCiAgICBjbHVzdGVyQ29sID0gImdlbmVfc3RhdHVzIiwKICAgIG1haW4gPSAiVENHQSBTZXRcbiBHQk0iLAogICAgaGVpZ2h0ID0gMTAsCiAgICB3aWR0aD0xMCxmaWxlbmFtZSA9IE5VTEwscHZhbC5tZXRob2QgPSBUCikKcFtbMV1dL3BbWzJdXQpgYGAKCgojIEhQVisgc2lnbmF0dXJlCgpgYGB7cn0KIyBsb2FkIGRhdGEgCmxpYnJhcnkoInJlYWR4bCIpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShnZ3B1YnIpClRDR0FfSFBWX2RhdGEgPC0gcmVhZF9leGNlbCgiLi9JbnB1dF9kYXRhL1RDR0EvUE1DMzgwNjU1NF9uY29tbXMzNTEzLXMyLnhsc3giLHNraXAgPSAzKQpUQ0dBX0hQVl9kYXRhICAlPD4lIGZpbHRlcihgVHVtb3IgdHlwZWAgPT0gIlByaW1hcnkgc29saWQiKQpUQ0dBX0hQVl9kYXRhJHN1Ym1pdHRlcl9pZCA9IFRDR0FfSFBWX2RhdGEkYFNhbXBsZSBiYXJjb2RlYCAlPiUgc3RyX3N1Yiggc3RhcnQgPSAxLCBlbmQgPSAxMikKClRDR0FfSFBWX2RhdGEgPSBUQ0dBX0hQVl9kYXRhICU+JQogICAgZmlsdGVyKENhbmNlciA9PSAiQ0VTQyIpICU+JQogICAgbXV0YXRlIChocHZfc3RhdHVzID0gCiAgICAgICAgICAgIGlmX2Vsc2UoCiAgICAgICAgICAgICAgY29uZGl0aW9uID0gcHBtID09ICJOL0EiLAogICAgICAgICAgICAgIHRydWUgPSAiSFBWLSIsCiAgICAgICAgICAgICAgZmFsc2UgPSAgIkhQVisiKSkKY2xpbmljYWxfZGF0YSA9IGlubmVyX2pvaW4oeCA9IGNsaW5pY2FsX2RhdGEseSA9IFRDR0FfSFBWX2RhdGEsYnkgPSBjKCJzdWJtaXR0ZXJfaWQiPSJzdWJtaXR0ZXJfaWQiKSkKCmBgYAoKCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQoKCgpwID0gVENHQWFuYWx5emVfc3Vydml2YWwoCiAgICBkYXRhID0gY2xpbmljYWxfZGF0YSwKICAgIGNsdXN0ZXJDb2wgPSAiaHB2X3N0YXR1cyIsCiAgICBtYWluID0gIlRDR0EgU2V0XG4gR0JNIiwKICAgIGZpbGVuYW1lID0gTlVMTCxwdmFsLm1ldGhvZCA9IFQKKQoKcFtbMV1dL3BbWzJdXQpgYGAKCiMgTVlCLSBIUFYgY29ycmVsYXRpb24KCgoKCmBgYHtyfQpnZW5lX3N0YXR1cyA9IHNldF9jbGluaWNhbF9kYXRhKGNsaW5fZGF0YSA9IGNsaW5pY2FsX2RhdGEsZ2VuZXMgPSAiTVlCIix0cG1fZGF0YV9mcmFtZSA9IGNlc2NfdHBtLHN0cmF0aWZ5ID0gcGFyYW1zJHN0cmF0aWZ5KQoKZ2VuZV9zdGF0dXMgPSBnZW5lX3N0YXR1c1tUQ0dBX0hQVl9kYXRhJHN1Ym1pdHRlcl9pZCxdICU+JSBjYmluZChIUFZfUFBNID0gYXMubnVtZXJpYyhUQ0dBX0hQVl9kYXRhJHBwbSkpCnBhZ2VkX3RhYmxlKGdlbmVfc3RhdHVzKQoKc3AgPC0gZ2dzY2F0dGVyKGdlbmVfc3RhdHVzLCB4ID0gIk1ZQiIsIHkgPSAiSFBWX1BQTSIsCiAgIGFkZCA9ICJyZWcubGluZSIsICAjIEFkZCByZWdyZXNzaW4gbGluZQogICBhZGQucGFyYW1zID0gbGlzdChjb2xvciA9ICJibHVlIiwgZmlsbCA9ICJsaWdodGdyYXkiKSwgIyBDdXN0b21pemUgcmVnLiBsaW5lCiAgIGNvbmYuaW50ID0gVFJVRSAjIEFkZCBjb25maWRlbmNlIGludGVydmFsCiAgICkKIyBBZGQgY29ycmVsYXRpb24gY29lZmZpY2llbnQKc3AgKyBzdGF0X2NvcihtZXRob2QgPSAicGVhcnNvbiIpCgoKYGBgCgoKIyBIUFYgc2lnbmF0dXJlLUhQViBjb3JyZWxhdGlvbgoKYGBge3J9CgpnZW5lX3N0YXR1cyA9IHNldF9jbGluaWNhbF9kYXRhKGNsaW5fZGF0YSA9IGNsaW5pY2FsX2RhdGEsZ2VuZXMgPSBzaWduYXR1cmUsdHBtX2RhdGFfZnJhbWUgPSBjZXNjX3RwbSxzdHJhdGlmeSA9IHBhcmFtcyRzdHJhdGlmeSxzaWduYXR1cmVfbmFtZSA9ICJIUFYrIHNpZ25hdHVyZSIpCgpnZW5lX3N0YXR1cyA9IGdlbmVfc3RhdHVzW1RDR0FfSFBWX2RhdGEkc3VibWl0dGVyX2lkLF0gJT4lIGNiaW5kKEhQVl9QUE0gPSBUQ0dBX0hQVl9kYXRhJHBwbSkKcGFnZWRfdGFibGUoZ2VuZV9zdGF0dXMpCgpzcCA8LSBnZ3NjYXR0ZXIoZ2VuZV9zdGF0dXMsIHggPSAiSFBWKyBzaWduYXR1cmUiLCB5ID0gIkhQVl9QUE0iLAogICBhZGQgPSAicmVnLmxpbmUiLCAgIyBBZGQgcmVncmVzc2luIGxpbmUKICAgYWRkLnBhcmFtcyA9IGxpc3QoY29sb3IgPSAiYmx1ZSIsIGZpbGwgPSAibGlnaHRncmF5IiksICMgQ3VzdG9taXplIHJlZy4gbGluZQogICBjb25mLmludCA9IFRSVUUgIyBBZGQgY29uZmlkZW5jZSBpbnRlcnZhbAogICApCiMgQWRkIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50CnNwICsgc3RhdF9jb3IobWV0aG9kID0gInBlYXJzb24iKQoKCmBgYAoKIyBNWUItIEhQViBUIHRlc3QKCmBgYHtyfQojIGNyZWF0ZSBkYXRhCgpnZW5lX3N0YXR1cyA9IHNldF9jbGluaWNhbF9kYXRhKGNsaW5fZGF0YSA9IGNsaW5pY2FsX2RhdGEsZ2VuZXMgPSAiTVlCIix0cG1fZGF0YV9mcmFtZSA9IGNlc2NfdHBtLHN0cmF0aWZ5ID0gcGFyYW1zJHN0cmF0aWZ5KQpnZW5lX3N0YXR1cyRwYXRpZW50ID0gcm93bmFtZXMoZ2VuZV9zdGF0dXMpCmdlbmVfc3RhdHVzID0gaW5uZXJfam9pbih4ID0gZ2VuZV9zdGF0dXMseSA9IGNsaW5pY2FsX2RhdGFbLGMoInN1Ym1pdHRlcl9pZCIsImhwdl9zdGF0dXMiKV0sYnkgPSBjKCJwYXRpZW50Ij0ic3VibWl0dGVyX2lkIikpCgpwYWdlZF90YWJsZShnZW5lX3N0YXR1cykKCgoKYGBgCgoKYGBge3J9CiMgcGxvdApsaWJyYXJ5KGdncHVicikKbGlicmFyeShyc3RhdGl4KQpzdGF0LnRlc3QgPC0gZ2VuZV9zdGF0dXMgJT4lCiAgdF90ZXN0KE1ZQiB+IGhwdl9zdGF0dXMpICU+JQogIGFkZF9zaWduaWZpY2FuY2UoKQpzdGF0LnRlc3QKCgpieHAgPC0gZ2dib3hwbG90KGdlbmVfc3RhdHVzLCB4ID0gImhwdl9zdGF0dXMiLCB5ID0gIk1ZQiIsIGZpbGwgPSAiIzAwQUZCQiIsYWRkID0gImppdHRlciIpCnN0YXQudGVzdCA8LSBzdGF0LnRlc3QgJT4lIGFkZF94eV9wb3NpdGlvbih4ID0gImhwdl9zdGF0dXMiKQpieHAgKyAKICBzdGF0X3B2YWx1ZV9tYW51YWwoc3RhdC50ZXN0LCAgbGFiZWwgPSAiVC10ZXN0LCBwID0ge3B9IikgCgpgYGAKCgoKCiMgTVlCIGFuZCBIUFYgc3Vydml2YWwgcGxvdAoKYGBge3J9CmdlbmVfc3RhdHVzID0gc2V0X2NsaW5pY2FsX2RhdGEoY2xpbl9kYXRhID0gY2xpbmljYWxfZGF0YSxnZW5lcyA9ICJNWUIiLHRwbV9kYXRhX2ZyYW1lID0gY2VzY190cG0sc3RyYXRpZnkgPSBwYXJhbXMkc3RyYXRpZnkpCmdlbmVfc3RhdHVzJEhQVl9zdGF0dXMgICA9IGlmX2Vsc2UoCiAgY29uZGl0aW9uID0gcm93Lm5hbWVzKGdlbmVfc3RhdHVzKSAgJWluJSBUQ0dBX0hQVl9kYXRhJHN1Ym1pdHRlcl9pZCwKICB0cnVlID0gIkhQVisiLAogIGZhbHNlID0gIkhQVi0iCikKCmdlbmVfc3RhdHVzJGdlbmVfc3RhdHVzID0gcGFzdGUoZ2VuZV9zdGF0dXMkZ2VuZV9zdGF0dXMsZ2VuZV9zdGF0dXMkSFBWX3N0YXR1cyxzZXAgPSAiLCAiKQpnZW5lX3N0YXR1cyRIUFZfc3RhdHVzID0gTlVMTApwYWdlZF90YWJsZShnZW5lX3N0YXR1cykKYGBgCgoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTF9CmNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMgPSBjbGluaWNhbF9kYXRhW2NsaW5pY2FsX2RhdGEkc3VibWl0dGVyX2lkICVpbiUgcm93bmFtZXMoZ2VuZV9zdGF0dXMpLF0KZ2VuZV9zdGF0dXMkcGF0aWVudCA9IHJvd25hbWVzKGdlbmVfc3RhdHVzKQpjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzID0gbGVmdF9qb2luKHggPSBjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzLHkgPSBnZW5lX3N0YXR1cywgYnkgPSBjKCJzdWJtaXR0ZXJfaWQiPSJwYXRpZW50IikpCgpwID0gVENHQWFuYWx5emVfc3Vydml2YWwoCiAgICBkYXRhID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcywKICAgIGNsdXN0ZXJDb2wgPSAiZ2VuZV9zdGF0dXMiLAogICAgbWFpbiA9ICJUQ0dBIFNldFxuIEdCTSIsCiAgICBoZWlnaHQgPSAxMCwKICAgIHdpZHRoPTEwLGZpbGVuYW1lID0gTlVMTCxwdmFsLm1ldGhvZCA9IFQKKQpwW1sxXV0vcFtbMl1dCmBgYAoKIyBzaGFyZWQgc2lnbmF0dXJlCmBgYHtyfQpzaGFyZWRfc2lnbmF0dXJlID0gcmVhZFJEUyhmaWxlID0gIi4vRGF0YV9vdXQvdGVtcC9zaGFyZWRfc2lnbmF0dXJlLlJEUyIpCmBgYAoKYGBge3J9CmdlbmVfc3RhdHVzID0gc2V0X2NsaW5pY2FsX2RhdGEoY2xpbl9kYXRhID0gY2xpbmljYWxfZGF0YSxnZW5lcyA9IHNoYXJlZF9zaWduYXR1cmUsdHBtX2RhdGFfZnJhbWUgPSBjZXNjX3RwbSxzdHJhdGlmeSA9IHBhcmFtcyRzdHJhdGlmeSxzaWduYXR1cmVfbmFtZSA9ICJIUFYrIHNpZ25hdHVyZSIpCnBhZ2VkX3RhYmxlKGdlbmVfc3RhdHVzKQpgYGAKCgoKCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQpjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzID0gY2xpbmljYWxfZGF0YVtjbGluaWNhbF9kYXRhJHN1Ym1pdHRlcl9pZCAlaW4lIHJvd25hbWVzKGdlbmVfc3RhdHVzKSxdCmdlbmVfc3RhdHVzJHBhdGllbnQgPSByb3duYW1lcyhnZW5lX3N0YXR1cykKY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcyA9IGxlZnRfam9pbih4ID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3Jlcyx5ID0gZ2VuZV9zdGF0dXMsIGJ5ID0gYygic3VibWl0dGVyX2lkIj0icGF0aWVudCIpKQoKcCA9IFRDR0FhbmFseXplX3N1cnZpdmFsKAogICAgZGF0YSA9IGNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMsCiAgICBjbHVzdGVyQ29sID0gImdlbmVfc3RhdHVzIiwKICAgIG1haW4gPSAiVENHQSBTZXRcbiBHQk0iLAogICAgaGVpZ2h0ID0gMTAsCiAgICB3aWR0aD0xMCxmaWxlbmFtZSA9IE5VTEwscHZhbC5tZXRob2QgPSBUCikKCnBbWzFdXS9wW1syXV0KYGBgCgojIEhNU0Mgc2lnbmF0dXJlCgpgYGB7cn0KIyBsb2FkCmhtc2NfZGVnID0gcmVhZC50YWJsZShmaWxlID0gIi4vRGF0YV9vdXQvSFBWX2FuYWx5c2lzL2hwdl9kZWdfZGYuY3N2Iixyb3cubmFtZXMgPSAxKQogIGF2Z19kaWZmX2N1dG9mZiA9IDEKICBmZHJfY3V0b2ZmID0gMC4xCiAgc2lnbmF0dXJlID0gaG1zY19kZWcgJT4lIGZpbHRlcihhdmdfZGlmZj5hdmdfZGlmZl9jdXRvZmYgJiBmZHI8ZmRyX2N1dG9mZikgJT4lIHJvd25hbWVzKCkKICBzaWduYXR1cmUKCmBgYAoKYGBge3J9CmdlbmVfc3RhdHVzID0gc2V0X2NsaW5pY2FsX2RhdGEoY2xpbl9kYXRhID0gY2xpbmljYWxfZGF0YSxnZW5lcyA9IHNpZ25hdHVyZSx0cG1fZGF0YV9mcmFtZSA9IGNlc2NfdHBtLHN0cmF0aWZ5ID0gcGFyYW1zJHN0cmF0aWZ5LHNpZ25hdHVyZV9uYW1lID0gIkhQVisgc2lnbmF0dXJlIikKcGFnZWRfdGFibGUoZ2VuZV9zdGF0dXMpCmBgYAoKCgoKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9CmNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMgPSBjbGluaWNhbF9kYXRhW2NsaW5pY2FsX2RhdGEkc3VibWl0dGVyX2lkICVpbiUgcm93bmFtZXMoZ2VuZV9zdGF0dXMpLF0KZ2VuZV9zdGF0dXMkcGF0aWVudCA9IHJvd25hbWVzKGdlbmVfc3RhdHVzKQpjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzID0gbGVmdF9qb2luKHggPSBjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzLHkgPSBnZW5lX3N0YXR1cywgYnkgPSBjKCJzdWJtaXR0ZXJfaWQiPSJwYXRpZW50IikpCgpwID0gVENHQWFuYWx5emVfc3Vydml2YWwoCiAgICBkYXRhID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcywKICAgIGNsdXN0ZXJDb2wgPSAiZ2VuZV9zdGF0dXMiLAogICAgbWFpbiA9ICJUQ0dBIFNldFxuIEdCTSIsCiAgICBoZWlnaHQgPSAxMCwKICAgIHdpZHRoPTEwLGZpbGVuYW1lID0gTlVMTCxwdmFsLm1ldGhvZCA9IFQKKQoKcFtbMV1dL3BbWzJdXQpgYGAK