.libPaths("/n/data1/cores/ntc/R-4.0.1/library/")
setwd("/n/scratch3/groups/hms/cores/ntc/Weinstock008")
library(DESeq2)
taking in filtered bed file made from running mhm on ATAC data
counting around peak centers.
have to revert to peak span for working bed file but excluding all
dREGs that have been removed based on low ATAC read count (<6 tot
reads).
linked value based on “dREG” list and filtered bed contains 11567
peak hits. final bed should agree.
centers <- read.table("PDX_filtered.bed", sep="\t")
peaks <- read.table("TCL_PDX_dist_peak.bed", sep="\t")
colnames(centers) <- c("Chr", "Start_center", "End_center", "dREG", "Blank", "Strand")
colnames(peaks) <- c("Chr", "Start", "End", "dREG", "Score", "Strand", "Center_Start", "Center_End")
combined <- peaks[(peaks$dREG %in% centers$dREG),]
write.table(combined, "PDX_filtered.bed", quote = FALSE, sep = "\t", row.names = FALSE, col.names = FALSE)
working on master data file with scripts run (bedtools closest and
intersect) to link GGA annot genes to dREG filtered annot enhancers.
add in counts data from PRO and ATAC across dREG span.
full <- read.table("overall.bed", sep="\t")
colnames(full) <- c("chr_gene", "start_gene", "end_gene", "name_gene", "score_gene", "strand_gene",
"chr_peak", "start_peak", "end_peak", "name_peak", "score_peak", "strand_peak", "center_start", "center_end", "biotype", "distance")
write.table(full, "PDX_Gene_to_Enhancer_master.txt", quote = FALSE, sep = "\t", row.names = FALSE, col.names = TRUE)
load DEseq and normalize with DEseq size factors based on depth
Import gene body counts table generated in O2 into R
normalizing counts for all data types with DEseq size factors and
melding to full table
raw_atac <- read.table("PDX_ATAC_counts.txt", header = TRUE, sep = "\t", row.names = 1)
raw_pro <- read.table("PDX_PRO_counts.txt", header = TRUE, sep = "\t", row.names = 1)
raw_rna <- read.table("PDX_RNA_counts.txt", header = TRUE, sep = "\t", row.names = 1)
### Create metadata object to categorize samples:
metadata_atac <- data.frame(row.names = colnames(raw_atac[, 6:ncol(raw_atac)]),
disease = c(rep("AITL",2),rep("Other",5)))
metadata_atac # verify the table looks ok
#confirm that row and column names match
all(rownames(metadata_atac) %in% colnames(raw_atac))
all(rownames(metadata_atac) == colnames(raw_atac)[6:ncol(raw_atac)])
## Create DESeq Data Set from the count table, and sample list:
dds_atac <- DESeqDataSetFromMatrix(countData = raw_atac[, 6:ncol(raw_atac)], # the matrix of counts from featureCounts;
colData = metadata_atac, # the sample table created in the last step;
design= ~disease) # this is R's notation for models
dds_atac <- estimateSizeFactors(dds_atac)
deseq_sizes_atac <- as.data.frame(sizeFactors(dds_atac))
deseq_sizes_atac
write.table(deseq_sizes_atac, "ATAC_norm_factors.txt", quote = FALSE, sep = "\t", row.names = TRUE, col.names = TRUE)
normalization of ATAC data
dds_atac <- estimateDispersions(dds_atac)
pdf("Dispersion_ATAC_norm.pdf")
plotDispEsts(dds_atac)
dev.off()
# check results of normalization
colSums(counts(dds_atac)) # raw read counts per sample
colSums(counts(dds_atac, normalized=T)) # Total number of normalized counts per sample
data.frame(colSums(counts(dds_atac)), (colSums(counts(dds_atac, normalized=T))), row.names=colnames(counts(dds_atac)))
write.table(counts(dds_atac, normalized=TRUE), file="ATAC_norm_counts.txt", sep="\t")
counts_atac <- read.table("ATAC_norm_counts.txt", sep="\t")
counts_atac$dREG <- row.names(counts_atac)
full <- merge(full, counts_atac, by.x = "name_peak", by.y = "dREG", all.x=TRUE)
Now PRO
Create metadata object to categorize samples:
metadata_pro <- data.frame(row.names = colnames(raw_pro[, 1:ncol(raw_pro)]),
disease = c(rep("AITL",2),rep("Other",5)))
metadata_pro # verify the table looks ok
#confirm that row and column names match
all(rownames(metadata_pro) %in% colnames(raw_pro))
all(rownames(metadata_pro) == colnames(raw_pro)[1:ncol(raw_pro)])
## Create DESeq Data Set from the count table, and sample list:
dds_pro <- DESeqDataSetFromMatrix(countData = raw_pro[, 1:ncol(raw_pro)], # the matrix of counts from featureCounts;
colData = metadata_pro, # the sample table created in the last step;
design= ~disease) # this is R's notation for models
dds_pro <- estimateSizeFactors(dds_pro)
deseq_sizes_pro <- as.data.frame(sizeFactors(dds_pro))
deseq_sizes_pro
write.table(deseq_sizes_pro, "PRO_norm_factors.txt", quote = FALSE, sep = "\t", row.names = TRUE, col.names = TRUE)
normalization of PRO data
dds_pro <- estimateDispersions(dds_pro)
pdf("Dispersion_PRO_norm.pdf")
plotDispEsts(dds_pro)
dev.off()
# check results of normalization
colSums(counts(dds_pro)) # raw read counts per sample
colSums(counts(dds_pro, normalized=T)) # Total number of normalized counts per sample
data.frame(colSums(counts(dds_pro)), (colSums(counts(dds_pro, normalized=T))), row.names=colnames(counts(dds_pro)))
write.table(counts(dds_pro, normalized=TRUE), file="PRO_norm_counts.txt", sep="\t")
counts_pro <- read.table("PRO_norm_counts.txt", sep="\t")
counts_pro$dREG <- row.names(counts_pro)
full <- merge(full, counts_pro, by.x = "name_peak", by.y = "dREG", all.x=TRUE)
Now RNA
Create metadata object to categorize samples:
metadata_rna <- data.frame(row.names = colnames(raw_rna[, 6:ncol(raw_rna)]),
disease = c(rep("AITL",2),rep("Other",5)))
metadata_rna # verify the table looks ok
#confirm that row and column names match
all(rownames(metadata_rna) %in% colnames(raw_rna))
all(rownames(metadata_rna) == colnames(raw_rna)[6:ncol(raw_rna)])
## Create DESeq Data Set from the count table, and sample list:
dds_rna <- DESeqDataSetFromMatrix(countData = raw_rna[, 6:ncol(raw_rna)], # the matrix of counts from featureCounts;
colData = metadata_rna, # the sample table created in the last step;
design= ~disease) # this is R's notation for models
dds_rna <- estimateSizeFactors(dds_rna)
deseq_sizes_rna <- as.data.frame(sizeFactors(dds_rna))
deseq_sizes_rna
write.table(deseq_sizes_rna, "RNA_norm_factors.txt", quote = FALSE, sep = "\t", row.names = TRUE, col.names = TRUE)
normalization of RNA data
dds_rna <- estimateDispersions(dds_rna)
pdf("Dispersion_RNA_norm.pdf")
plotDispEsts(dds_rna)
dev.off()
# check results of normalization
colSums(counts(dds_rna)) # raw read counts per sample
colSums(counts(dds_rna, normalized=T)) # Total number of normalized counts per sample
data.frame(colSums(counts(dds_rna)), (colSums(counts(dds_rna, normalized=T))), row.names=colnames(counts(dds_rna)))
write.table(counts(dds_rna, normalized=TRUE), file="RNA_norm_counts.txt", sep="\t")
counts_rna <- read.table("RNA_norm_counts.txt", sep="\t")
counts_rna$dREG <- row.names(counts_rna)
full <- merge(full, counts_rna, by.x = "name_peak", by.y = "dREG", all.x=TRUE)
final table completed
write.table(full, "PDX_Final_gene_to_enhancer.txt", quote = FALSE, sep = "\t", row.names = FALSE, col.names = TRUE)
# clean-up and save out DEseq data sets
saveRDS(dds_atac, file="ATAC.rds")
saveRDS(dds_pro, file="PRO.rds")
saveRDS(dds_rna, file="RNA.rds")
# RNA counts for GGA locations #########
gga_rna <- read.table("RNA_GGA_counts.txt", header = TRUE, sep = "\t", row.names = 1)
### Create metadata object to categorize samples:
metadata_rna <- data.frame(row.names = colnames(gga_rna[, 6:ncol(gga_rna)]),
disease = c(rep("AITL",2),rep("Other",5)))
metadata_rna # verify the table looks ok
#confirm that row and column names match
all(rownames(metadata_rna) %in% colnames(gga_rna))
all(rownames(metadata_rna) == colnames(gga_rna)[6:ncol(gga_rna)])
# Create DESeq Data Set from the count table, and sample list:
dds_rna <- DESeqDataSetFromMatrix(countData = gga_rna[, 6:ncol(gga_rna)], # the matrix of counts from featureCounts;
colData = metadata_rna, # the sample table created in the last step;
design= ~disease) # this is R's notation for models
dds_rna <- estimateSizeFactors(dds_rna)
deseq_sizes_rna <- as.data.frame(sizeFactors(dds_rna))
deseq_sizes_rna
write.table(deseq_sizes_rna, "GGA_norm_factors.txt", quote = FALSE, sep = "\t", row.names = TRUE, col.names = TRUE)
normalization of RNA data
dds_rna <- estimateDispersions(dds_rna)
pdf("Dispersion_GGA_norm.pdf")
plotDispEsts(dds_rna)
dev.off()
# check results of normalization
colSums(counts(dds_rna)) # raw read counts per sample
colSums(counts(dds_rna, normalized=T)) # Total number of normalized counts per sample
data.frame(colSums(counts(dds_rna)), (colSums(counts(dds_rna, normalized=T))), row.names=colnames(counts(dds_rna)))
write.table(counts(dds_rna, normalized=TRUE), file="TES_TSS_RNA_norm_counts.txt", sep="\t")
######### END #########
## MKJ 26SEP23
## MKJ 04OCT23
LS0tCnRpdGxlOiAiQ29tYmluZWQgUERYIEFuYWx5c2lzIG9mIFJOQS1zZXEsIFBSTy1zZXEsIGFuZCBBVEFDLXNlcSIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KCmBgYHtyfQoubGliUGF0aHMoIi9uL2RhdGExL2NvcmVzL250Yy9SLTQuMC4xL2xpYnJhcnkvIikKc2V0d2QoIi9uL3NjcmF0Y2gzL2dyb3Vwcy9obXMvY29yZXMvbnRjL1dlaW5zdG9jazAwOCIpCgpsaWJyYXJ5KERFU2VxMikKCmBgYAoKdGFraW5nIGluIGZpbHRlcmVkIGJlZCBmaWxlIG1hZGUgZnJvbSBydW5uaW5nIG1obSBvbiBBVEFDIGRhdGEgY291bnRpbmcgYXJvdW5kIHBlYWsgY2VudGVycy4KCmhhdmUgdG8gcmV2ZXJ0IHRvIHBlYWsgc3BhbiBmb3Igd29ya2luZyBiZWQgZmlsZSBidXQgZXhjbHVkaW5nIGFsbCBkUkVHcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGJhc2VkIG9uIGxvdyBBVEFDIHJlYWQgY291bnQgKDw2IHRvdCByZWFkcykuCgpsaW5rZWQgdmFsdWUgYmFzZWQgb24gImRSRUciIGxpc3QgYW5kIGZpbHRlcmVkIGJlZCBjb250YWlucyAxMTU2NyBwZWFrIGhpdHMuIGZpbmFsIGJlZCBzaG91bGQgYWdyZWUuCgpgYGB7cn0KY2VudGVycyA8LSByZWFkLnRhYmxlKCJQRFhfZmlsdGVyZWQuYmVkIiwgc2VwPSJcdCIpCnBlYWtzIDwtIHJlYWQudGFibGUoIlRDTF9QRFhfZGlzdF9wZWFrLmJlZCIsIHNlcD0iXHQiKQoKY29sbmFtZXMoY2VudGVycykgPC0gYygiQ2hyIiwgIlN0YXJ0X2NlbnRlciIsICJFbmRfY2VudGVyIiwgImRSRUciLCAiQmxhbmsiLCAiU3RyYW5kIikKY29sbmFtZXMocGVha3MpIDwtIGMoIkNociIsICJTdGFydCIsICJFbmQiLCAiZFJFRyIsICJTY29yZSIsICJTdHJhbmQiLCAiQ2VudGVyX1N0YXJ0IiwgIkNlbnRlcl9FbmQiKQoKY29tYmluZWQgPC0gcGVha3NbKHBlYWtzJGRSRUcgJWluJSBjZW50ZXJzJGRSRUcpLF0Kd3JpdGUudGFibGUoY29tYmluZWQsICJQRFhfZmlsdGVyZWQuYmVkIiwgcXVvdGUgPSBGQUxTRSwgc2VwID0gIlx0Iiwgcm93Lm5hbWVzID0gRkFMU0UsIGNvbC5uYW1lcyA9IEZBTFNFKQoKYGBgCgp3b3JraW5nIG9uIG1hc3RlciBkYXRhIGZpbGUgd2l0aCBzY3JpcHRzIHJ1biAoYmVkdG9vbHMgY2xvc2VzdCBhbmQgaW50ZXJzZWN0KSB0byBsaW5rIEdHQSBhbm5vdCBnZW5lcyB0byBkUkVHIGZpbHRlcmVkIGFubm90IGVuaGFuY2Vycy4KCmFkZCBpbiBjb3VudHMgZGF0YSBmcm9tIFBSTyBhbmQgQVRBQyBhY3Jvc3MgZFJFRyBzcGFuLgoKYGBge3J9CmZ1bGwgPC0gcmVhZC50YWJsZSgib3ZlcmFsbC5iZWQiLCBzZXA9Ilx0IikKY29sbmFtZXMoZnVsbCkgPC0gYygiY2hyX2dlbmUiLCAic3RhcnRfZ2VuZSIsICJlbmRfZ2VuZSIsICJuYW1lX2dlbmUiLCAic2NvcmVfZ2VuZSIsICJzdHJhbmRfZ2VuZSIsIAogICAgICJjaHJfcGVhayIsICJzdGFydF9wZWFrIiwgImVuZF9wZWFrIiwgIm5hbWVfcGVhayIsICJzY29yZV9wZWFrIiwgInN0cmFuZF9wZWFrIiwgImNlbnRlcl9zdGFydCIsICJjZW50ZXJfZW5kIiwgImJpb3R5cGUiLCAiZGlzdGFuY2UiKQoKd3JpdGUudGFibGUoZnVsbCwgIlBEWF9HZW5lX3RvX0VuaGFuY2VyX21hc3Rlci50eHQiLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSkKCmBgYAoKbG9hZCBERXNlcSBhbmQgbm9ybWFsaXplIHdpdGggREVzZXEgc2l6ZSBmYWN0b3JzIGJhc2VkIG9uIGRlcHRoCgpJbXBvcnQgZ2VuZSBib2R5IGNvdW50cyB0YWJsZSBnZW5lcmF0ZWQgaW4gTzIgaW50byBSCgpub3JtYWxpemluZyBjb3VudHMgZm9yIGFsbCBkYXRhIHR5cGVzIHdpdGggREVzZXEgc2l6ZSBmYWN0b3JzIGFuZCBtZWxkaW5nIHRvIGZ1bGwgdGFibGUKCmBgYHtyfQpyYXdfYXRhYyA8LSByZWFkLnRhYmxlKCJQRFhfQVRBQ19jb3VudHMudHh0IiwgaGVhZGVyID0gVFJVRSwgc2VwID0gIlx0Iiwgcm93Lm5hbWVzID0gMSkKcmF3X3BybyA8LSByZWFkLnRhYmxlKCJQRFhfUFJPX2NvdW50cy50eHQiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSAxKQpyYXdfcm5hIDwtIHJlYWQudGFibGUoIlBEWF9STkFfY291bnRzLnR4dCIsIGhlYWRlciA9IFRSVUUsIHNlcCA9ICJcdCIsIHJvdy5uYW1lcyA9IDEpCgojIyMgQ3JlYXRlIG1ldGFkYXRhIG9iamVjdCB0byBjYXRlZ29yaXplIHNhbXBsZXM6CgptZXRhZGF0YV9hdGFjIDwtIGRhdGEuZnJhbWUocm93Lm5hbWVzID0gY29sbmFtZXMocmF3X2F0YWNbLCA2Om5jb2wocmF3X2F0YWMpXSksCiAgICAgICAgICAgICAgICAgICAgICAgZGlzZWFzZSA9IGMocmVwKCJBSVRMIiwyKSxyZXAoIk90aGVyIiw1KSkpCiAgICAgICAgICAgICAgICAgICAgICAgCm1ldGFkYXRhX2F0YWMgIyB2ZXJpZnkgdGhlIHRhYmxlIGxvb2tzIG9rCgojY29uZmlybSB0aGF0IHJvdyBhbmQgY29sdW1uIG5hbWVzIG1hdGNoCmFsbChyb3duYW1lcyhtZXRhZGF0YV9hdGFjKSAlaW4lIGNvbG5hbWVzKHJhd19hdGFjKSkKYWxsKHJvd25hbWVzKG1ldGFkYXRhX2F0YWMpID09IGNvbG5hbWVzKHJhd19hdGFjKVs2Om5jb2wocmF3X2F0YWMpXSkKCgojIyBDcmVhdGUgREVTZXEgRGF0YSBTZXQgZnJvbSB0aGUgY291bnQgdGFibGUsIGFuZCBzYW1wbGUgbGlzdDoKCmRkc19hdGFjIDwtIERFU2VxRGF0YVNldEZyb21NYXRyaXgoY291bnREYXRhID0gcmF3X2F0YWNbLCA2Om5jb2wocmF3X2F0YWMpXSwgICAgICAjIHRoZSBtYXRyaXggb2YgY291bnRzIGZyb20gZmVhdHVyZUNvdW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YSA9IG1ldGFkYXRhX2F0YWMsICAgICAgICAgICAgICAgICAgICAgIyB0aGUgc2FtcGxlIHRhYmxlIGNyZWF0ZWQgaW4gdGhlIGxhc3Qgc3RlcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduPSB+ZGlzZWFzZSkgICAgICAgICAgICAjIHRoaXMgaXMgUidzIG5vdGF0aW9uIGZvciBtb2RlbHMKCmRkc19hdGFjIDwtIGVzdGltYXRlU2l6ZUZhY3RvcnMoZGRzX2F0YWMpCmRlc2VxX3NpemVzX2F0YWMgPC0gYXMuZGF0YS5mcmFtZShzaXplRmFjdG9ycyhkZHNfYXRhYykpCmRlc2VxX3NpemVzX2F0YWMKd3JpdGUudGFibGUoZGVzZXFfc2l6ZXNfYXRhYywgIkFUQUNfbm9ybV9mYWN0b3JzLnR4dCIsIHF1b3RlID0gRkFMU0UsIHNlcCA9ICJcdCIsIHJvdy5uYW1lcyA9IFRSVUUsIGNvbC5uYW1lcyA9IFRSVUUpCgpgYGAKCm5vcm1hbGl6YXRpb24gb2YgQVRBQyBkYXRhCgpgYGB7cn0KZGRzX2F0YWMgPC0gZXN0aW1hdGVEaXNwZXJzaW9ucyhkZHNfYXRhYykKcGRmKCJEaXNwZXJzaW9uX0FUQUNfbm9ybS5wZGYiKQpwbG90RGlzcEVzdHMoZGRzX2F0YWMpCmRldi5vZmYoKQoKIyBjaGVjayByZXN1bHRzIG9mIG5vcm1hbGl6YXRpb24KY29sU3Vtcyhjb3VudHMoZGRzX2F0YWMpKSAgICAgICAgICAgICAgICAjIHJhdyByZWFkIGNvdW50cyBwZXIgc2FtcGxlCmNvbFN1bXMoY291bnRzKGRkc19hdGFjLCBub3JtYWxpemVkPVQpKSAgIyBUb3RhbCBudW1iZXIgb2Ygbm9ybWFsaXplZCBjb3VudHMgcGVyIHNhbXBsZQpkYXRhLmZyYW1lKGNvbFN1bXMoY291bnRzKGRkc19hdGFjKSksIChjb2xTdW1zKGNvdW50cyhkZHNfYXRhYywgbm9ybWFsaXplZD1UKSkpLCByb3cubmFtZXM9Y29sbmFtZXMoY291bnRzKGRkc19hdGFjKSkpCgp3cml0ZS50YWJsZShjb3VudHMoZGRzX2F0YWMsIG5vcm1hbGl6ZWQ9VFJVRSksIGZpbGU9IkFUQUNfbm9ybV9jb3VudHMudHh0Iiwgc2VwPSJcdCIpCmNvdW50c19hdGFjIDwtIHJlYWQudGFibGUoIkFUQUNfbm9ybV9jb3VudHMudHh0Iiwgc2VwPSJcdCIpCmNvdW50c19hdGFjJGRSRUcgPC0gcm93Lm5hbWVzKGNvdW50c19hdGFjKQoKZnVsbCA8LSBtZXJnZShmdWxsLCBjb3VudHNfYXRhYywgYnkueCA9ICJuYW1lX3BlYWsiLCBieS55ID0gImRSRUciLCBhbGwueD1UUlVFKQoKYGBgCk5vdyBQUk8KCkNyZWF0ZSBtZXRhZGF0YSBvYmplY3QgdG8gY2F0ZWdvcml6ZSBzYW1wbGVzOgoKYGBge3J9Cm1ldGFkYXRhX3BybyA8LSBkYXRhLmZyYW1lKHJvdy5uYW1lcyA9IGNvbG5hbWVzKHJhd19wcm9bLCAxOm5jb2wocmF3X3BybyldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Vhc2UgPSBjKHJlcCgiQUlUTCIsMikscmVwKCJPdGhlciIsNSkpKQoKbWV0YWRhdGFfcHJvICMgdmVyaWZ5IHRoZSB0YWJsZSBsb29rcyBvawoKI2NvbmZpcm0gdGhhdCByb3cgYW5kIGNvbHVtbiBuYW1lcyBtYXRjaAphbGwocm93bmFtZXMobWV0YWRhdGFfcHJvKSAlaW4lIGNvbG5hbWVzKHJhd19wcm8pKQphbGwocm93bmFtZXMobWV0YWRhdGFfcHJvKSA9PSBjb2xuYW1lcyhyYXdfcHJvKVsxOm5jb2wocmF3X3BybyldKQoKCiMjIENyZWF0ZSBERVNlcSBEYXRhIFNldCBmcm9tIHRoZSBjb3VudCB0YWJsZSwgYW5kIHNhbXBsZSBsaXN0OgoKZGRzX3BybyA8LSBERVNlcURhdGFTZXRGcm9tTWF0cml4KGNvdW50RGF0YSA9IHJhd19wcm9bLCAxOm5jb2wocmF3X3BybyldLCAgICAgICMgdGhlIG1hdHJpeCBvZiBjb3VudHMgZnJvbSBmZWF0dXJlQ291bnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEgPSBtZXRhZGF0YV9wcm8sICAgICAgICAgICAgICAgICAgICAgIyB0aGUgc2FtcGxlIHRhYmxlIGNyZWF0ZWQgaW4gdGhlIGxhc3Qgc3RlcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ249IH5kaXNlYXNlKSAgICAgICAgICAgICMgdGhpcyBpcyBSJ3Mgbm90YXRpb24gZm9yIG1vZGVscwoKZGRzX3BybyA8LSBlc3RpbWF0ZVNpemVGYWN0b3JzKGRkc19wcm8pCmRlc2VxX3NpemVzX3BybyA8LSBhcy5kYXRhLmZyYW1lKHNpemVGYWN0b3JzKGRkc19wcm8pKQpkZXNlcV9zaXplc19wcm8Kd3JpdGUudGFibGUoZGVzZXFfc2l6ZXNfcHJvLCAiUFJPX25vcm1fZmFjdG9ycy50eHQiLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSBUUlVFLCBjb2wubmFtZXMgPSBUUlVFKQoKYGBgCgpub3JtYWxpemF0aW9uIG9mIFBSTyBkYXRhCgpgYGB7cn0KZGRzX3BybyA8LSBlc3RpbWF0ZURpc3BlcnNpb25zKGRkc19wcm8pCnBkZigiRGlzcGVyc2lvbl9QUk9fbm9ybS5wZGYiKQpwbG90RGlzcEVzdHMoZGRzX3BybykKZGV2Lm9mZigpCgojIGNoZWNrIHJlc3VsdHMgb2Ygbm9ybWFsaXphdGlvbgpjb2xTdW1zKGNvdW50cyhkZHNfcHJvKSkgICAgICAgICAgICAgICAgIyByYXcgcmVhZCBjb3VudHMgcGVyIHNhbXBsZQpjb2xTdW1zKGNvdW50cyhkZHNfcHJvLCBub3JtYWxpemVkPVQpKSAgIyBUb3RhbCBudW1iZXIgb2Ygbm9ybWFsaXplZCBjb3VudHMgcGVyIHNhbXBsZQpkYXRhLmZyYW1lKGNvbFN1bXMoY291bnRzKGRkc19wcm8pKSwgKGNvbFN1bXMoY291bnRzKGRkc19wcm8sIG5vcm1hbGl6ZWQ9VCkpKSwgcm93Lm5hbWVzPWNvbG5hbWVzKGNvdW50cyhkZHNfcHJvKSkpCgp3cml0ZS50YWJsZShjb3VudHMoZGRzX3Bybywgbm9ybWFsaXplZD1UUlVFKSwgZmlsZT0iUFJPX25vcm1fY291bnRzLnR4dCIsIHNlcD0iXHQiKQpjb3VudHNfcHJvIDwtIHJlYWQudGFibGUoIlBST19ub3JtX2NvdW50cy50eHQiLCBzZXA9Ilx0IikKY291bnRzX3BybyRkUkVHIDwtIHJvdy5uYW1lcyhjb3VudHNfcHJvKQoKCmZ1bGwgPC0gbWVyZ2UoZnVsbCwgY291bnRzX3BybywgYnkueCA9ICJuYW1lX3BlYWsiLCBieS55ID0gImRSRUciLCBhbGwueD1UUlVFKQoKYGBgCk5vdyBSTkEKCkNyZWF0ZSBtZXRhZGF0YSBvYmplY3QgdG8gY2F0ZWdvcml6ZSBzYW1wbGVzOgoKYGBge3J9Cm1ldGFkYXRhX3JuYSA8LSBkYXRhLmZyYW1lKHJvdy5uYW1lcyA9IGNvbG5hbWVzKHJhd19ybmFbLCA2Om5jb2wocmF3X3JuYSldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Vhc2UgPSBjKHJlcCgiQUlUTCIsMikscmVwKCJPdGhlciIsNSkpKQoKbWV0YWRhdGFfcm5hICMgdmVyaWZ5IHRoZSB0YWJsZSBsb29rcyBvawoKI2NvbmZpcm0gdGhhdCByb3cgYW5kIGNvbHVtbiBuYW1lcyBtYXRjaAphbGwocm93bmFtZXMobWV0YWRhdGFfcm5hKSAlaW4lIGNvbG5hbWVzKHJhd19ybmEpKQphbGwocm93bmFtZXMobWV0YWRhdGFfcm5hKSA9PSBjb2xuYW1lcyhyYXdfcm5hKVs2Om5jb2wocmF3X3JuYSldKQoKCiMjIENyZWF0ZSBERVNlcSBEYXRhIFNldCBmcm9tIHRoZSBjb3VudCB0YWJsZSwgYW5kIHNhbXBsZSBsaXN0OgoKZGRzX3JuYSA8LSBERVNlcURhdGFTZXRGcm9tTWF0cml4KGNvdW50RGF0YSA9IHJhd19ybmFbLCA2Om5jb2wocmF3X3JuYSldLCAgICAgICMgdGhlIG1hdHJpeCBvZiBjb3VudHMgZnJvbSBmZWF0dXJlQ291bnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEgPSBtZXRhZGF0YV9ybmEsICAgICAgICAgICAgICAgICAgICAgIyB0aGUgc2FtcGxlIHRhYmxlIGNyZWF0ZWQgaW4gdGhlIGxhc3Qgc3RlcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ249IH5kaXNlYXNlKSAgICAgICAgICAgICMgdGhpcyBpcyBSJ3Mgbm90YXRpb24gZm9yIG1vZGVscwoKZGRzX3JuYSA8LSBlc3RpbWF0ZVNpemVGYWN0b3JzKGRkc19ybmEpCmRlc2VxX3NpemVzX3JuYSA8LSBhcy5kYXRhLmZyYW1lKHNpemVGYWN0b3JzKGRkc19ybmEpKQpkZXNlcV9zaXplc19ybmEKd3JpdGUudGFibGUoZGVzZXFfc2l6ZXNfcm5hLCAiUk5BX25vcm1fZmFjdG9ycy50eHQiLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSBUUlVFLCBjb2wubmFtZXMgPSBUUlVFKQoKYGBgCgpub3JtYWxpemF0aW9uIG9mIFJOQSBkYXRhCgpgYGB7cn0KZGRzX3JuYSA8LSBlc3RpbWF0ZURpc3BlcnNpb25zKGRkc19ybmEpCnBkZigiRGlzcGVyc2lvbl9STkFfbm9ybS5wZGYiKQpwbG90RGlzcEVzdHMoZGRzX3JuYSkKZGV2Lm9mZigpCgojIGNoZWNrIHJlc3VsdHMgb2Ygbm9ybWFsaXphdGlvbgpjb2xTdW1zKGNvdW50cyhkZHNfcm5hKSkgICAgICAgICAgICAgICAgIyByYXcgcmVhZCBjb3VudHMgcGVyIHNhbXBsZQpjb2xTdW1zKGNvdW50cyhkZHNfcm5hLCBub3JtYWxpemVkPVQpKSAgIyBUb3RhbCBudW1iZXIgb2Ygbm9ybWFsaXplZCBjb3VudHMgcGVyIHNhbXBsZQpkYXRhLmZyYW1lKGNvbFN1bXMoY291bnRzKGRkc19ybmEpKSwgKGNvbFN1bXMoY291bnRzKGRkc19ybmEsIG5vcm1hbGl6ZWQ9VCkpKSwgcm93Lm5hbWVzPWNvbG5hbWVzKGNvdW50cyhkZHNfcm5hKSkpCgp3cml0ZS50YWJsZShjb3VudHMoZGRzX3JuYSwgbm9ybWFsaXplZD1UUlVFKSwgZmlsZT0iUk5BX25vcm1fY291bnRzLnR4dCIsIHNlcD0iXHQiKQpjb3VudHNfcm5hIDwtIHJlYWQudGFibGUoIlJOQV9ub3JtX2NvdW50cy50eHQiLCBzZXA9Ilx0IikKY291bnRzX3JuYSRkUkVHIDwtIHJvdy5uYW1lcyhjb3VudHNfcm5hKQoKZnVsbCA8LSBtZXJnZShmdWxsLCBjb3VudHNfcm5hLCBieS54ID0gIm5hbWVfcGVhayIsIGJ5LnkgPSAiZFJFRyIsIGFsbC54PVRSVUUpCgpgYGAKCmZpbmFsIHRhYmxlIGNvbXBsZXRlZAoKYGBge3J9CndyaXRlLnRhYmxlKGZ1bGwsICJQRFhfRmluYWxfZ2VuZV90b19lbmhhbmNlci50eHQiLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSBGQUxTRSwgY29sLm5hbWVzID0gVFJVRSkKCiMgY2xlYW4tdXAgYW5kIHNhdmUgb3V0IERFc2VxIGRhdGEgc2V0cwoKc2F2ZVJEUyhkZHNfYXRhYywgZmlsZT0iQVRBQy5yZHMiKQpzYXZlUkRTKGRkc19wcm8sIGZpbGU9IlBSTy5yZHMiKQpzYXZlUkRTKGRkc19ybmEsIGZpbGU9IlJOQS5yZHMiKQoKYGBgCgpgYGB7cn0KIyBSTkEgY291bnRzIGZvciBHR0EgbG9jYXRpb25zICMjIyMjIyMjIwoKZ2dhX3JuYSA8LSByZWFkLnRhYmxlKCJSTkFfR0dBX2NvdW50cy50eHQiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSAxKQoKIyMjIENyZWF0ZSBtZXRhZGF0YSBvYmplY3QgdG8gY2F0ZWdvcml6ZSBzYW1wbGVzOgoKbWV0YWRhdGFfcm5hIDwtIGRhdGEuZnJhbWUocm93Lm5hbWVzID0gY29sbmFtZXMoZ2dhX3JuYVssIDY6bmNvbChnZ2Ffcm5hKV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNlYXNlID0gYyhyZXAoIkFJVEwiLDIpLHJlcCgiT3RoZXIiLDUpKSkKCm1ldGFkYXRhX3JuYSAjIHZlcmlmeSB0aGUgdGFibGUgbG9va3Mgb2sKCiNjb25maXJtIHRoYXQgcm93IGFuZCBjb2x1bW4gbmFtZXMgbWF0Y2gKYWxsKHJvd25hbWVzKG1ldGFkYXRhX3JuYSkgJWluJSBjb2xuYW1lcyhnZ2Ffcm5hKSkKYWxsKHJvd25hbWVzKG1ldGFkYXRhX3JuYSkgPT0gY29sbmFtZXMoZ2dhX3JuYSlbNjpuY29sKGdnYV9ybmEpXSkKCiMgQ3JlYXRlIERFU2VxIERhdGEgU2V0IGZyb20gdGhlIGNvdW50IHRhYmxlLCBhbmQgc2FtcGxlIGxpc3Q6CgpkZHNfcm5hIDwtIERFU2VxRGF0YVNldEZyb21NYXRyaXgoY291bnREYXRhID0gZ2dhX3JuYVssIDY6bmNvbChnZ2Ffcm5hKV0sICAgICAgIyB0aGUgbWF0cml4IG9mIGNvdW50cyBmcm9tIGZlYXR1cmVDb3VudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRhID0gbWV0YWRhdGFfcm5hLCAgICAgICAgICAgICAgICAgICAgICMgdGhlIHNhbXBsZSB0YWJsZSBjcmVhdGVkIGluIHRoZSBsYXN0IHN0ZXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ249IH5kaXNlYXNlKSAgICAgICAgICAgICMgdGhpcyBpcyBSJ3Mgbm90YXRpb24gZm9yIG1vZGVscwoKZGRzX3JuYSA8LSBlc3RpbWF0ZVNpemVGYWN0b3JzKGRkc19ybmEpCmRlc2VxX3NpemVzX3JuYSA8LSBhcy5kYXRhLmZyYW1lKHNpemVGYWN0b3JzKGRkc19ybmEpKQpkZXNlcV9zaXplc19ybmEKd3JpdGUudGFibGUoZGVzZXFfc2l6ZXNfcm5hLCAiR0dBX25vcm1fZmFjdG9ycy50eHQiLCBxdW90ZSA9IEZBTFNFLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSBUUlVFLCBjb2wubmFtZXMgPSBUUlVFKQoKYGBgCgpub3JtYWxpemF0aW9uIG9mIFJOQSBkYXRhCgpgYGB7cn0KZGRzX3JuYSA8LSBlc3RpbWF0ZURpc3BlcnNpb25zKGRkc19ybmEpCnBkZigiRGlzcGVyc2lvbl9HR0Ffbm9ybS5wZGYiKQpwbG90RGlzcEVzdHMoZGRzX3JuYSkKZGV2Lm9mZigpCgojIGNoZWNrIHJlc3VsdHMgb2Ygbm9ybWFsaXphdGlvbgpjb2xTdW1zKGNvdW50cyhkZHNfcm5hKSkgICAgICAgICAgICAgICAgIyByYXcgcmVhZCBjb3VudHMgcGVyIHNhbXBsZQpjb2xTdW1zKGNvdW50cyhkZHNfcm5hLCBub3JtYWxpemVkPVQpKSAgIyBUb3RhbCBudW1iZXIgb2Ygbm9ybWFsaXplZCBjb3VudHMgcGVyIHNhbXBsZQpkYXRhLmZyYW1lKGNvbFN1bXMoY291bnRzKGRkc19ybmEpKSwgKGNvbFN1bXMoY291bnRzKGRkc19ybmEsIG5vcm1hbGl6ZWQ9VCkpKSwgcm93Lm5hbWVzPWNvbG5hbWVzKGNvdW50cyhkZHNfcm5hKSkpCgp3cml0ZS50YWJsZShjb3VudHMoZGRzX3JuYSwgbm9ybWFsaXplZD1UUlVFKSwgZmlsZT0iVEVTX1RTU19STkFfbm9ybV9jb3VudHMudHh0Iiwgc2VwPSJcdCIpCgojIyMjIyMjIyMgRU5EICMjIyMjIyMjIwojIyBNS0ogMjZTRVAyMwojIyBNS0ogMDRPQ1QyMwpgYGA=