1 Attempt some quantification/queries

Lets see if we can get anything out of the data?

1.1 An expressionSet?

Can I extract the intensities and do something with them?

## Take the outputs from tric (feature_alignment.py)
cid_intensities <- read.csv(file="results/tric/CID_outmatrix.tsv", sep="\t")
hcd_intensities <- read.csv(file="results/tric/HCD_outmatrix.tsv", sep="\t")

## Pull the protein names
cid_intensities[["rownames"]] <- cid_intensities[["Protein"]]
hcd_intensities[["rownames"]] <- hcd_intensities[["Protein"]]

## Simplify them
cid_intensities[["rownames"]] <- gsub(pattern="^[[:digit:]]+\\/",
                                      replacement="",
                                      x=cid_intensities[["rownames"]])
hcd_intensities[["rownames"]] <- gsub(pattern="^[[:digit:]]+\\/",
                                      replacement="",
                                      x=hcd_intensities[["rownames"]])

## make suitable rownames
rownames(cid_intensities) <- make.names(cid_intensities[["rownames"]], unique=TRUE)
rownames(hcd_intensities) <- make.names(hcd_intensities[["rownames"]], unique=TRUE)

## Simplify the column names because they are way too long
shorter_colnames <- colnames(cid_intensities)
shorter_colnames <- gsub(pattern="^(.*)_vs.*$", replacement="\\1", x=shorter_colnames)
colnames(cid_intensities) <- paste0("cid_", shorter_colnames)
colnames(hcd_intensities) <- paste0("hcd_", shorter_colnames)

## Make a data table from them.
cid <- data.table::as.data.table(cid_intensities)
cid[["cid_rownames"]] <- make.names(cid[["cid_rownames"]], unique=TRUE)
hcd <- data.table::as.data.table(hcd_intensities)
hcd[["hcd_rownames"]] <- make.names(hcd[["hcd_rownames"]], unique=TRUE)
## Set the NAs to 0
nas <- is.na(cid)
cid[nas] <- 0
nas <- is.na(hcd)
hcd[nas] <- 0

## Set up a decoy column
cid[["decoy"]] <- 0
hcd[["decoy"]] <- 0
decoys <- grepl(pattern="^DECOY_", x=cid[["cid_Protein"]])
cid[decoys, "decoy"] <- 1
decoys <- grepl(pattern="^DECOY_", x=hcd[["hcd_Protein"]])
hcd[decoys, "decoy"] <- 1

## Make some medians for the columns of interest
intensity_cols <- grep(pattern="Intensity", x=colnames(cid))
intense <- cid[, intensity_cols, with=FALSE]
cid[["median_intense"]] <- matrixStats::rowMedians(as.matrix(intense))
intensity_cols <- grep(pattern="Intensity", x=colnames(hcd))
intense <- hcd[, intensity_cols, with=FALSE]
hcd[["median_intense"]] <- matrixStats::rowMedians(as.matrix(intense))
## Repeat for RT
rt_cols <- grep(pattern="_RT_", x=colnames(cid))
rt <- cid[, rt_cols, with=FALSE]
cid[["median_rt"]] <- matrixStats::rowMedians(as.matrix(rt))
rt_cols <- grep(pattern="_RT_", x=colnames(hcd))
rt <- hcd[, rt_cols, with=FALSE]
hcd[["median_rt"]] <- matrixStats::rowMedians(as.matrix(rt))
## And score
score_cols <- grep(pattern="_score_", x=colnames(cid))
score <- cid[, score_cols, with=FALSE]
cid[["median_score"]] <- matrixStats::rowMedians(as.matrix(score))
score_cols <- grep(pattern="_RT_", x=colnames(hcd))
score <- hcd[, score_cols, with=FALSE]
hcd[["median_score"]] <- matrixStats::rowMedians(as.matrix(score))

## Now plot them.
cid_scores <- cid[, c("median_score", "median_rt", "median_intense", "decoy")]
melted <- reshape2::melt(cid_scores)
## No id variables; using all as measure variables
library(ggplot2)

cid[["decoy"]] <- as.factor(cid[["decoy"]])
cid_score_dist <- ggplot(data=cid, aes_string(x="median_score", fill="decoy")) +
  geom_density(aes_string(x="median_score", y="..count..", fill="decoy")) +
  scale_x_continuous(trans=scales::log2_trans()) +
  scale_fill_manual(values=c("0"="darkblue", "1"="darkred"))
cid_score_dist
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 2734 rows containing non-finite values (stat_density).

hcd[["decoy"]] <- as.factor(hcd[["decoy"]])
hcd_score_dist <- ggplot(data=hcd, aes_string(x="median_score", fill="decoy")) +
  geom_density(aes_string(x="median_score", y="..count..", fill="decoy")) +
  scale_x_continuous(trans=scales::log2_trans()) +
  scale_fill_manual(values=c("0"="darkblue", "1"="darkred"))
hcd_score_dist
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 1863 rows containing non-finite values (stat_density).

library(dplyr)
decoy_idx <- cid[, "decoy"] == 1
decoys <- as.data.frame(cid)[decoy_idx, ]
nodecoys <- as.data.frame(cid)[!decoy_idx, ]
decoy_xint <- mean(decoys[, "median_intense"], na.rm=TRUE)
nodecoy_xint <- mean(nodecoys[, "median_intense"], na.rm=TRUE)
cid_intense_dist <- ggplot(data=cid, aes_string(x="median_intense", fill="decoy")) +
  geom_density(aes_string(x="median_intense", y="..count..", fill="decoy")) +
  scale_x_continuous(trans=scales::log2_trans()) +
  geom_vline(xintercept=decoy_xint, color="darkred", linetype="dashed", size=1) +
  geom_vline(xintercept=nodecoy_xint, color="darkblue", linetype="dashed", size=1) +
  scale_fill_manual(values=c("0"="darkblue", "1"="darkred"))
cid_intense_dist
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 2734 rows containing non-finite values (stat_density).

decoy_idx <- hcd[, "decoy"] == 1
decoys <- as.data.frame(hcd)[decoy_idx, ]
nodecoys <- as.data.frame(hcd)[!decoy_idx, ]
decoy_xint <- mean(decoys[, "median_intense"], na.rm=TRUE)
nodecoy_xint <- mean(nodecoys[, "median_intense"], na.rm=TRUE)
hcd_intense_dist <- ggplot(data=hcd, aes_string(x="median_intense", fill="decoy")) +
  geom_density(aes_string(x="median_intense", y="..count..", fill="decoy")) +
  geom_vline(xintercept=decoy_xint, color="darkred", linetype="dashed", size=1) +
  geom_vline(xintercept=nodecoy_xint, color="darkblue", linetype="dashed", size=1) +
  scale_x_continuous(trans=scales::log2_trans()) +
  scale_fill_manual(values=c("0"="darkblue", "1"="darkred"))
hcd_intense_dist
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 3147 rows containing non-finite values (stat_density).

decoy_idx <- cid[, "decoy"] == 1
decoys <- as.data.frame(cid)[decoy_idx, ]
nodecoys <- as.data.frame(cid)[!decoy_idx, ]
decoy_xint <- mean(decoys[, "median_rt"], na.rm=TRUE)
nodecoy_xint <- mean(nodecoys[, "median_rt"], na.rm=TRUE)
cid_rt_dist <- ggplot(data=cid, aes_string(x="median_rt", fill="decoy")) +
  geom_density(aes_string(x="median_rt", y="..count..", fill="decoy")) +
  scale_x_continuous(trans=scales::log2_trans()) +
  geom_vline(xintercept=decoy_xint, color="darkred", linetype="dashed", size=1) +
  geom_vline(xintercept=nodecoy_xint, color="darkblue", linetype="dashed", size=1) +
  scale_fill_manual(values=c("0"="darkblue", "1"="darkred"))
cid_rt_dist
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 1448 rows containing non-finite values (stat_density).

decoy_idx <- hcd[, "decoy"] == 1
decoys <- as.data.frame(hcd)[decoy_idx, ]
nodecoys <- as.data.frame(hcd)[!decoy_idx, ]
decoy_xint <- mean(decoys[, "median_rt"], na.rm=TRUE)
nodecoy_xint <- mean(nodecoys[, "median_rt"], na.rm=TRUE)
hcd_rt_dist <- ggplot(data=hcd, aes_string(x="median_rt", fill="decoy")) +
  geom_density(aes_string(x="median_rt", y="..count..", fill="decoy")) +
  scale_x_continuous(trans=scales::log2_trans()) +
  geom_vline(xintercept=decoy_xint, color="darkred", linetype="dashed", size=1) +
  geom_vline(xintercept=nodecoy_xint, color="darkblue", linetype="dashed", size=1) +
  scale_fill_manual(values=c("0"="darkblue", "1"="darkred"))
hcd_rt_dist
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: Removed 1863 rows containing non-finite values (stat_density).

index.html

2 Index version: 20180215

3 TODO

  • 2017-06-14:

index.html

LS0tCnRpdGxlOiAiUHJlcHJvY2Vzc2luZyBESUEgZGF0YSIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogaHRtbF9kb2N1bWVudDoKICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgY29kZV9mb2xkaW5nOiBzaG93CiAgZmlnX2NhcHRpb246IHRydWUKICBmaWdfaGVpZ2h0OiA3CiAgZmlnX3dpZHRoOiA3CiAgaGlnaGxpZ2h0OiB0YW5nbwogIGtlZXBfbWQ6IGZhbHNlCiAgbW9kZTogc2VsZmNvbnRhaW5lZAogIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgdGhlbWU6IGNvc21vCiAgdG9jOiB0cnVlCiAgdG9jX2Zsb2F0OgogICAgY29sbGFwc2VkOiBmYWxzZQogICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgo8c3R5bGU+CiAgYm9keSAubWFpbi1jb250YWluZXIgewogICAgbWF4LXdpZHRoOiAxNjAwcHg7Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKQprbml0cjo6b3B0c19rbml0JHNldChwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTkwLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoPTgsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuaGVpZ2h0PTgsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoCiAgZGlnaXRzPTQsCiAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCiMjc2V0LnNlZWQoMSkKdmVyIDwtICIyMDE4MDIxNSIKcHJldmlvdXNfZmlsZSA8LSAiaW5kZXguUm1kIgoKdG1wIDwtIHRyeShzbShsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKSkpCmBgYAoKIyBBdHRlbXB0IHNvbWUgcXVhbnRpZmljYXRpb24vcXVlcmllcwoKTGV0cyBzZWUgaWYgd2UgY2FuIGdldCBhbnl0aGluZyBvdXQgb2YgdGhlIGRhdGE/CgojIyBBbiBleHByZXNzaW9uU2V0PwoKQ2FuIEkgZXh0cmFjdCB0aGUgaW50ZW5zaXRpZXMgYW5kIGRvIHNvbWV0aGluZyB3aXRoIHRoZW0/CgpgYGB7ciBleHB0X3N3YXRofQojIyBUYWtlIHRoZSBvdXRwdXRzIGZyb20gdHJpYyAoZmVhdHVyZV9hbGlnbm1lbnQucHkpCmNpZF9pbnRlbnNpdGllcyA8LSByZWFkLmNzdihmaWxlPSJyZXN1bHRzL3RyaWMvQ0lEX291dG1hdHJpeC50c3YiLCBzZXA9Ilx0IikKaGNkX2ludGVuc2l0aWVzIDwtIHJlYWQuY3N2KGZpbGU9InJlc3VsdHMvdHJpYy9IQ0Rfb3V0bWF0cml4LnRzdiIsIHNlcD0iXHQiKQoKIyMgUHVsbCB0aGUgcHJvdGVpbiBuYW1lcwpjaWRfaW50ZW5zaXRpZXNbWyJyb3duYW1lcyJdXSA8LSBjaWRfaW50ZW5zaXRpZXNbWyJQcm90ZWluIl1dCmhjZF9pbnRlbnNpdGllc1tbInJvd25hbWVzIl1dIDwtIGhjZF9pbnRlbnNpdGllc1tbIlByb3RlaW4iXV0KCiMjIFNpbXBsaWZ5IHRoZW0KY2lkX2ludGVuc2l0aWVzW1sicm93bmFtZXMiXV0gPC0gZ3N1YihwYXR0ZXJuPSJeW1s6ZGlnaXQ6XV0rXFwvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudD0iIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4PWNpZF9pbnRlbnNpdGllc1tbInJvd25hbWVzIl1dKQpoY2RfaW50ZW5zaXRpZXNbWyJyb3duYW1lcyJdXSA8LSBnc3ViKHBhdHRlcm49Il5bWzpkaWdpdDpdXStcXC8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50PSIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg9aGNkX2ludGVuc2l0aWVzW1sicm93bmFtZXMiXV0pCgojIyBtYWtlIHN1aXRhYmxlIHJvd25hbWVzCnJvd25hbWVzKGNpZF9pbnRlbnNpdGllcykgPC0gbWFrZS5uYW1lcyhjaWRfaW50ZW5zaXRpZXNbWyJyb3duYW1lcyJdXSwgdW5pcXVlPVRSVUUpCnJvd25hbWVzKGhjZF9pbnRlbnNpdGllcykgPC0gbWFrZS5uYW1lcyhoY2RfaW50ZW5zaXRpZXNbWyJyb3duYW1lcyJdXSwgdW5pcXVlPVRSVUUpCgojIyBTaW1wbGlmeSB0aGUgY29sdW1uIG5hbWVzIGJlY2F1c2UgdGhleSBhcmUgd2F5IHRvbyBsb25nCnNob3J0ZXJfY29sbmFtZXMgPC0gY29sbmFtZXMoY2lkX2ludGVuc2l0aWVzKQpzaG9ydGVyX2NvbG5hbWVzIDwtIGdzdWIocGF0dGVybj0iXiguKilfdnMuKiQiLCByZXBsYWNlbWVudD0iXFwxIiwgeD1zaG9ydGVyX2NvbG5hbWVzKQpjb2xuYW1lcyhjaWRfaW50ZW5zaXRpZXMpIDwtIHBhc3RlMCgiY2lkXyIsIHNob3J0ZXJfY29sbmFtZXMpCmNvbG5hbWVzKGhjZF9pbnRlbnNpdGllcykgPC0gcGFzdGUwKCJoY2RfIiwgc2hvcnRlcl9jb2xuYW1lcykKCiMjIE1ha2UgYSBkYXRhIHRhYmxlIGZyb20gdGhlbS4KY2lkIDwtIGRhdGEudGFibGU6OmFzLmRhdGEudGFibGUoY2lkX2ludGVuc2l0aWVzKQpjaWRbWyJjaWRfcm93bmFtZXMiXV0gPC0gbWFrZS5uYW1lcyhjaWRbWyJjaWRfcm93bmFtZXMiXV0sIHVuaXF1ZT1UUlVFKQpoY2QgPC0gZGF0YS50YWJsZTo6YXMuZGF0YS50YWJsZShoY2RfaW50ZW5zaXRpZXMpCmhjZFtbImhjZF9yb3duYW1lcyJdXSA8LSBtYWtlLm5hbWVzKGhjZFtbImhjZF9yb3duYW1lcyJdXSwgdW5pcXVlPVRSVUUpCiMjIFNldCB0aGUgTkFzIHRvIDAKbmFzIDwtIGlzLm5hKGNpZCkKY2lkW25hc10gPC0gMApuYXMgPC0gaXMubmEoaGNkKQpoY2RbbmFzXSA8LSAwCgojIyBTZXQgdXAgYSBkZWNveSBjb2x1bW4KY2lkW1siZGVjb3kiXV0gPC0gMApoY2RbWyJkZWNveSJdXSA8LSAwCmRlY295cyA8LSBncmVwbChwYXR0ZXJuPSJeREVDT1lfIiwgeD1jaWRbWyJjaWRfUHJvdGVpbiJdXSkKY2lkW2RlY295cywgImRlY295Il0gPC0gMQpkZWNveXMgPC0gZ3JlcGwocGF0dGVybj0iXkRFQ09ZXyIsIHg9aGNkW1siaGNkX1Byb3RlaW4iXV0pCmhjZFtkZWNveXMsICJkZWNveSJdIDwtIDEKCiMjIE1ha2Ugc29tZSBtZWRpYW5zIGZvciB0aGUgY29sdW1ucyBvZiBpbnRlcmVzdAppbnRlbnNpdHlfY29scyA8LSBncmVwKHBhdHRlcm49IkludGVuc2l0eSIsIHg9Y29sbmFtZXMoY2lkKSkKaW50ZW5zZSA8LSBjaWRbLCBpbnRlbnNpdHlfY29scywgd2l0aD1GQUxTRV0KY2lkW1sibWVkaWFuX2ludGVuc2UiXV0gPC0gbWF0cml4U3RhdHM6OnJvd01lZGlhbnMoYXMubWF0cml4KGludGVuc2UpKQppbnRlbnNpdHlfY29scyA8LSBncmVwKHBhdHRlcm49IkludGVuc2l0eSIsIHg9Y29sbmFtZXMoaGNkKSkKaW50ZW5zZSA8LSBoY2RbLCBpbnRlbnNpdHlfY29scywgd2l0aD1GQUxTRV0KaGNkW1sibWVkaWFuX2ludGVuc2UiXV0gPC0gbWF0cml4U3RhdHM6OnJvd01lZGlhbnMoYXMubWF0cml4KGludGVuc2UpKQojIyBSZXBlYXQgZm9yIFJUCnJ0X2NvbHMgPC0gZ3JlcChwYXR0ZXJuPSJfUlRfIiwgeD1jb2xuYW1lcyhjaWQpKQpydCA8LSBjaWRbLCBydF9jb2xzLCB3aXRoPUZBTFNFXQpjaWRbWyJtZWRpYW5fcnQiXV0gPC0gbWF0cml4U3RhdHM6OnJvd01lZGlhbnMoYXMubWF0cml4KHJ0KSkKcnRfY29scyA8LSBncmVwKHBhdHRlcm49Il9SVF8iLCB4PWNvbG5hbWVzKGhjZCkpCnJ0IDwtIGhjZFssIHJ0X2NvbHMsIHdpdGg9RkFMU0VdCmhjZFtbIm1lZGlhbl9ydCJdXSA8LSBtYXRyaXhTdGF0czo6cm93TWVkaWFucyhhcy5tYXRyaXgocnQpKQojIyBBbmQgc2NvcmUKc2NvcmVfY29scyA8LSBncmVwKHBhdHRlcm49Il9zY29yZV8iLCB4PWNvbG5hbWVzKGNpZCkpCnNjb3JlIDwtIGNpZFssIHNjb3JlX2NvbHMsIHdpdGg9RkFMU0VdCmNpZFtbIm1lZGlhbl9zY29yZSJdXSA8LSBtYXRyaXhTdGF0czo6cm93TWVkaWFucyhhcy5tYXRyaXgoc2NvcmUpKQpzY29yZV9jb2xzIDwtIGdyZXAocGF0dGVybj0iX1JUXyIsIHg9Y29sbmFtZXMoaGNkKSkKc2NvcmUgPC0gaGNkWywgc2NvcmVfY29scywgd2l0aD1GQUxTRV0KaGNkW1sibWVkaWFuX3Njb3JlIl1dIDwtIG1hdHJpeFN0YXRzOjpyb3dNZWRpYW5zKGFzLm1hdHJpeChzY29yZSkpCgojIyBOb3cgcGxvdCB0aGVtLgpjaWRfc2NvcmVzIDwtIGNpZFssIGMoIm1lZGlhbl9zY29yZSIsICJtZWRpYW5fcnQiLCAibWVkaWFuX2ludGVuc2UiLCAiZGVjb3kiKV0KbWVsdGVkIDwtIHJlc2hhcGUyOjptZWx0KGNpZF9zY29yZXMpCmxpYnJhcnkoZ2dwbG90MikKCmNpZFtbImRlY295Il1dIDwtIGFzLmZhY3RvcihjaWRbWyJkZWNveSJdXSkKY2lkX3Njb3JlX2Rpc3QgPC0gZ2dwbG90KGRhdGE9Y2lkLCBhZXNfc3RyaW5nKHg9Im1lZGlhbl9zY29yZSIsIGZpbGw9ImRlY295IikpICsKICBnZW9tX2RlbnNpdHkoYWVzX3N0cmluZyh4PSJtZWRpYW5fc2NvcmUiLCB5PSIuLmNvdW50Li4iLCBmaWxsPSJkZWNveSIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPXNjYWxlczo6bG9nMl90cmFucygpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIjAiPSJkYXJrYmx1ZSIsICIxIj0iZGFya3JlZCIpKQpjaWRfc2NvcmVfZGlzdAoKaGNkW1siZGVjb3kiXV0gPC0gYXMuZmFjdG9yKGhjZFtbImRlY295Il1dKQpoY2Rfc2NvcmVfZGlzdCA8LSBnZ3Bsb3QoZGF0YT1oY2QsIGFlc19zdHJpbmcoeD0ibWVkaWFuX3Njb3JlIiwgZmlsbD0iZGVjb3kiKSkgKwogIGdlb21fZGVuc2l0eShhZXNfc3RyaW5nKHg9Im1lZGlhbl9zY29yZSIsIHk9Ii4uY291bnQuLiIsIGZpbGw9ImRlY295IikpICsKICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnM9c2NhbGVzOjpsb2cyX3RyYW5zKCkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiMCI9ImRhcmtibHVlIiwgIjEiPSJkYXJrcmVkIikpCmhjZF9zY29yZV9kaXN0CgpsaWJyYXJ5KGRwbHlyKQpkZWNveV9pZHggPC0gY2lkWywgImRlY295Il0gPT0gMQpkZWNveXMgPC0gYXMuZGF0YS5mcmFtZShjaWQpW2RlY295X2lkeCwgXQpub2RlY295cyA8LSBhcy5kYXRhLmZyYW1lKGNpZClbIWRlY295X2lkeCwgXQpkZWNveV94aW50IDwtIG1lYW4oZGVjb3lzWywgIm1lZGlhbl9pbnRlbnNlIl0sIG5hLnJtPVRSVUUpCm5vZGVjb3lfeGludCA8LSBtZWFuKG5vZGVjb3lzWywgIm1lZGlhbl9pbnRlbnNlIl0sIG5hLnJtPVRSVUUpCmNpZF9pbnRlbnNlX2Rpc3QgPC0gZ2dwbG90KGRhdGE9Y2lkLCBhZXNfc3RyaW5nKHg9Im1lZGlhbl9pbnRlbnNlIiwgZmlsbD0iZGVjb3kiKSkgKwogIGdlb21fZGVuc2l0eShhZXNfc3RyaW5nKHg9Im1lZGlhbl9pbnRlbnNlIiwgeT0iLi5jb3VudC4uIiwgZmlsbD0iZGVjb3kiKSkgKwogIHNjYWxlX3hfY29udGludW91cyh0cmFucz1zY2FsZXM6OmxvZzJfdHJhbnMoKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD1kZWNveV94aW50LCBjb2xvcj0iZGFya3JlZCIsIGxpbmV0eXBlPSJkYXNoZWQiLCBzaXplPTEpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9bm9kZWNveV94aW50LCBjb2xvcj0iZGFya2JsdWUiLCBsaW5ldHlwZT0iZGFzaGVkIiwgc2l6ZT0xKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIjAiPSJkYXJrYmx1ZSIsICIxIj0iZGFya3JlZCIpKQpjaWRfaW50ZW5zZV9kaXN0CgpkZWNveV9pZHggPC0gaGNkWywgImRlY295Il0gPT0gMQpkZWNveXMgPC0gYXMuZGF0YS5mcmFtZShoY2QpW2RlY295X2lkeCwgXQpub2RlY295cyA8LSBhcy5kYXRhLmZyYW1lKGhjZClbIWRlY295X2lkeCwgXQpkZWNveV94aW50IDwtIG1lYW4oZGVjb3lzWywgIm1lZGlhbl9pbnRlbnNlIl0sIG5hLnJtPVRSVUUpCm5vZGVjb3lfeGludCA8LSBtZWFuKG5vZGVjb3lzWywgIm1lZGlhbl9pbnRlbnNlIl0sIG5hLnJtPVRSVUUpCmhjZF9pbnRlbnNlX2Rpc3QgPC0gZ2dwbG90KGRhdGE9aGNkLCBhZXNfc3RyaW5nKHg9Im1lZGlhbl9pbnRlbnNlIiwgZmlsbD0iZGVjb3kiKSkgKwogIGdlb21fZGVuc2l0eShhZXNfc3RyaW5nKHg9Im1lZGlhbl9pbnRlbnNlIiwgeT0iLi5jb3VudC4uIiwgZmlsbD0iZGVjb3kiKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD1kZWNveV94aW50LCBjb2xvcj0iZGFya3JlZCIsIGxpbmV0eXBlPSJkYXNoZWQiLCBzaXplPTEpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9bm9kZWNveV94aW50LCBjb2xvcj0iZGFya2JsdWUiLCBsaW5ldHlwZT0iZGFzaGVkIiwgc2l6ZT0xKSArCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPXNjYWxlczo6bG9nMl90cmFucygpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIjAiPSJkYXJrYmx1ZSIsICIxIj0iZGFya3JlZCIpKQpoY2RfaW50ZW5zZV9kaXN0CgpkZWNveV9pZHggPC0gY2lkWywgImRlY295Il0gPT0gMQpkZWNveXMgPC0gYXMuZGF0YS5mcmFtZShjaWQpW2RlY295X2lkeCwgXQpub2RlY295cyA8LSBhcy5kYXRhLmZyYW1lKGNpZClbIWRlY295X2lkeCwgXQpkZWNveV94aW50IDwtIG1lYW4oZGVjb3lzWywgIm1lZGlhbl9ydCJdLCBuYS5ybT1UUlVFKQpub2RlY295X3hpbnQgPC0gbWVhbihub2RlY295c1ssICJtZWRpYW5fcnQiXSwgbmEucm09VFJVRSkKY2lkX3J0X2Rpc3QgPC0gZ2dwbG90KGRhdGE9Y2lkLCBhZXNfc3RyaW5nKHg9Im1lZGlhbl9ydCIsIGZpbGw9ImRlY295IikpICsKICBnZW9tX2RlbnNpdHkoYWVzX3N0cmluZyh4PSJtZWRpYW5fcnQiLCB5PSIuLmNvdW50Li4iLCBmaWxsPSJkZWNveSIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPXNjYWxlczo6bG9nMl90cmFucygpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PWRlY295X3hpbnQsIGNvbG9yPSJkYXJrcmVkIiwgbGluZXR5cGU9ImRhc2hlZCIsIHNpemU9MSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD1ub2RlY295X3hpbnQsIGNvbG9yPSJkYXJrYmx1ZSIsIGxpbmV0eXBlPSJkYXNoZWQiLCBzaXplPTEpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiMCI9ImRhcmtibHVlIiwgIjEiPSJkYXJrcmVkIikpCmNpZF9ydF9kaXN0CgpkZWNveV9pZHggPC0gaGNkWywgImRlY295Il0gPT0gMQpkZWNveXMgPC0gYXMuZGF0YS5mcmFtZShoY2QpW2RlY295X2lkeCwgXQpub2RlY295cyA8LSBhcy5kYXRhLmZyYW1lKGhjZClbIWRlY295X2lkeCwgXQpkZWNveV94aW50IDwtIG1lYW4oZGVjb3lzWywgIm1lZGlhbl9ydCJdLCBuYS5ybT1UUlVFKQpub2RlY295X3hpbnQgPC0gbWVhbihub2RlY295c1ssICJtZWRpYW5fcnQiXSwgbmEucm09VFJVRSkKaGNkX3J0X2Rpc3QgPC0gZ2dwbG90KGRhdGE9aGNkLCBhZXNfc3RyaW5nKHg9Im1lZGlhbl9ydCIsIGZpbGw9ImRlY295IikpICsKICBnZW9tX2RlbnNpdHkoYWVzX3N0cmluZyh4PSJtZWRpYW5fcnQiLCB5PSIuLmNvdW50Li4iLCBmaWxsPSJkZWNveSIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPXNjYWxlczo6bG9nMl90cmFucygpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PWRlY295X3hpbnQsIGNvbG9yPSJkYXJrcmVkIiwgbGluZXR5cGU9ImRhc2hlZCIsIHNpemU9MSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD1ub2RlY295X3hpbnQsIGNvbG9yPSJkYXJrYmx1ZSIsIGxpbmV0eXBlPSJkYXNoZWQiLCBzaXplPTEpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiMCI9ImRhcmtibHVlIiwgIjEiPSJkYXJrcmVkIikpCmhjZF9ydF9kaXN0CmBgYAoKW2luZGV4Lmh0bWxdKGluZGV4Lmh0bWwpCgojIEluZGV4IHZlcnNpb246IGByIHZlcmAKCiMgVE9ETwoKKiAyMDE3LTA2LTE0OgoKW2luZGV4Lmh0bWxdKGluZGV4Lmh0bWwpCg==