1 TODO

  • Remove MSstats logging. – done
  • Make explicit spearman correlations between methods. – done
    • Do both for all data and for the top-50/bottom-50 – done, but weird.
  • Make 100% certain that the samples are annotated correctly. – done.
  • Limma/MSstats/EdgeR venn disagram for all up in CF
    • Repeat in all down CF
    • Repeat with a cutoff, top-50
  • Individual plots for P/PE proteins.

2 Analyzing data from openMS and friends.

In preprocessing_comet_highres.Rmd, I used the openMS tutorials and supplemental materials from a couple papers to hopefully correctly perform the various preprocessing tasks required to extract intensity data from DIA/SWATH transitions.

The final steps of that process combined the transition intensities from every sample into a metadata frile (results/tric/HCD_meta.tsv), an intensity matrix (results/tric/HCD_outmatrix.tsv), and a feature aligned output matrix (results/tric/aligned_comet_HCD.tsv).

My reading of the SWATH2stats and MSstats source code suggests to me that the log2(intensities) of the feature aligned data are our final proxy for protein abundance. At first glance, this suggests to me that these data might follow a distribution similar to RNASeq data (negative binomial, but perhaps with a bigger tail?). In addition, by the time we use tric on the data, we have a count matrix and sample annotation data frames which look remarkably similar to those used in a RNASeq expressionset. Indeed, by the end of the MSstats processing, it creates a MSnSet class of its own which uses fData/exprs/pData.

For the curious, my reasoning for saying that the log intensities are our proxy for abundance comes from MSstats/R/DataProcess.R in a clause which looks like:

if (logTrans == 2) {
  work[["ABUNDANCE"]] <- log2(work[["ABUNDANCE"]])
} else if (logTrans == 10) {
  work[["ABUNDANCE"]] <- log10(work[["ABUNDANCE"]])
} else {
  ## Above there was a check for only log 2 and 10, but we can do e if we want.
  ## I might go back up there and remove that check. Long live e! 2.718282 rules!
  work[["ABUNDANCE"]] <- log(work[["ABUNDANCE"]]) / log(logTrans)
}

(Note: I added the natural log to the set of conditions, but otherwise the logic is unchanged.)

With that in mind, I want to use some tools with which I am familiar in order to try to understand these data. Therefore I will first attempt to coerce my tric aligned data and annotations into a ‘normal’ expressionset. Then I want to do some diagnostic plots which, if I am wrong and these distributions are not as expected, will be conceptually incorrect (I don’t yet think I am wrong).

2.1 Sample annotation via SWATH2stats

I am using the SWATH2stats vignette as my primary source of information. Thus I see that it uses the OpenSWATH_SM3_GoldStandardAutomatedResults_human_peakgroups.txt which has a format nearly identical to my tric output matrix. Thus for the moment I will assume that the proper input for SWATH2stats is ‘results/tric/comet_HCD.tsv’ and not the metadata nor output matrix.

I keep a sample sheet of all the DIA samples used in this analysis in ‘sample_sheets/dia_samples.xlsx’ It should contain all the other required data with one important caveat, I removed 1 sample by ‘commenting’ it (e.g. prefixing it with ‘##’ – which is an admittedly dumb thing to do in an excel file.

One last caveat: I hacked the SWATH2stats sample_annotation() function to add a couple columns in an attempt to make it a little more robust when faced with sample sheets with differently named columns.

In addition, SWATH2stats provides some nice filtering and combination functions which should be considered when generating various expressionset data structures later.

tric_data <- read.csv("results/tric_20180530/comet_HCD.tsv", sep="\t")
## Warning in file(file, "rt"): cannot open file 'results/tric_20180530/comet_HCD.tsv': No
## such file or directory
## Error in file(file, "rt"): cannot open the connection
sample_annot <- openxlsx::read.xlsx("sample_sheets/Mtb_dia_samples.xlsx")
rownames(sample_annot) <- make.names(sample_annot[["sampleid"]], unique=TRUE)
## Drop samples starting with comments
keep_idx <- ! grepl(pattern="##", x=sample_annot[["sampleid"]])
sample_annot <- sample_annot[keep_idx, ]
expt_idx <- sample_annot[["expt_id"]] == "may2018" | sample_annot[["expt_id"]] == "mar2018"
expt_idx[is.na(sample_annot[["expt_id"]])] <- FALSE
sample_annot <- sample_annot[expt_idx, ]
mz_idx <- sample_annot[["windowsize"]] == "8"
sample_annot <- sample_annot[mz_idx, ]
## Set the mzXML column to match the filename column in the data.
loaded <- sm(devtools::load_all("~/scratch/git/SWATH2stats"))
## s2s, my witty way of shortening SWATH2stats...
s2s_exp <- sample_annotation(data=tric_data,
                             sample_annotation=sample_annot,
                             fullpeptidename_column="fullunimodpeptidename")
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, : The
## number of sample annotation condition and filenames in data are equal.
## Warning in if (missing_samples_from_data > 0) {: the condition has length > 1 and only the
## first element will be used
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, : The
## missing data samples from the annotation are: mzXML/dia_20180530/2018_0315Briken01.mzXML,
## mzXML/dia_20180530/2018_0315Briken02.mzXML, mzXML/dia_20180530/2018_0315Briken03.mzXML,
## mzXML/dia_20180530/2018_0315Briken04.mzXML, mzXML/dia_20180530/2018_0315Briken05.mzXML,
## mzXML/dia_20180530/2018_0315Briken06.mzXML, mzXML/dia_20180530/2018_0315Briken21.mzXML,
## mzXML/dia_20180530/2018_0315Briken22.mzXML, mzXML/dia_20180530/2018_0315Briken23.mzXML,
## mzXML/dia_20180530/2018_0315Briken24.mzXML, mzXML/dia_20180530/2018_0315Briken25.mzXML,
## mzXML/dia_20180530/2018_0315Briken26.mzXML, mzXML/dia_20180530/2018_0502BrikenDIA01.mzXML,
## mzXML/dia_20180530/2018_0502BrikenDIA02.mzXML, mzXML/
## dia_20180530/2018_0502BrikenDIA03.mzXML, mzXML/dia_20180530/2018_0502BrikenDIA04.mzXML,
## mzXML/dia_20180530/2018_0502BrikenDIA05.mzXML, mzXML/
## dia_20180530/2018_0502BrikenDIA06.mzXML, mzXML/dia_20180530/2018_0502BrikenDIA07.mzXML,
## mzXML/dia_20180530/2018_0502BrikenDIA08.mzXML, mzXML/
## dia_20180530/2018_0502BrikenDIA09.mzXML, mzXML/dia_20180530/2018_0502BrikenDIA11.mzXML,
## mzXML/dia_20180530/2018_0502BrikenDIA12.mzXML.
## Warning in if (missing_samples_from_annot > 0) {: the condition has length > 1 and only
## the first element will be used
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## The missing data samples from the data are: mzXML/dia_20mz/2018_0116BrikenDIA11.mzXML,
## mzXML/dia_20mz/2018_0116BrikenDIA12.mzXML, mzXML/dia_20mz/2018_0116BrikenDIA13.mzXML,
## mzXML/dia_20mz/2018_0315Briken11.mzXML, mzXML/dia_20mz/2018_0315Briken12.mzXML, mzXML/
## dia_20mz/2018_0315Briken13.mzXML, mzXML/dia_20mz/2018_0315Briken15.mzXML, mzXML/
## dia_20mz/2018_0315Briken16.mzXML, mzXML/dia_8mz/2018_0116BrikenDIA01.mzXML, mzXML/
## dia_8mz/2018_0116BrikenDIA02.mzXML, mzXML/dia_8mz/2018_0116BrikenDIA03.mzXML, mzXML/
## dia_8mz/2018_0315Briken01.mzXML, mzXML/dia_8mz/2018_0315Briken02.mzXML, mzXML/
## dia_8mz/2018_0315Briken03.mzXML, mzXML/dia_8mz/2018_0315Briken04.mzXML, mzXML/
## dia_8mz/2018_0315Briken05.mzXML, mzXML/dia_8mz/2018_0315Briken06.mzXML, mzXML/
## dia_8mz/2018_0315Briken21.mzXML, mzXML/dia_8mz/2018_0315Briken22.mzXML, mzXML/
## dia_8mz/2018_0315Briken23.mzXML, mzXML/dia_8mz/2018_0315Briken24.mzXML, mzXML/dia_8mz/
## 2018_0315Briken25.mzXML, mzXML/dia_8mz/2018_0315Briken26.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0315Briken01.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0315Briken02.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0315Briken03.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0315Briken04.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0315Briken05.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0315Briken06.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0315Briken21.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0315Briken22.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0315Briken23.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0315Briken24.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0315Briken25.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0315Briken26.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0502BrikenDIA01.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0502BrikenDIA02.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0502BrikenDIA03.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0502BrikenDIA04.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0502BrikenDIA05.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0502BrikenDIA06.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0502BrikenDIA07.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0502BrikenDIA08.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0502BrikenDIA09.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0502BrikenDIA11.mzXML.
## Warning in sample_annotation(data = tric_data, sample_annotation = sample_annot, :
## No measurement value found for this sample in the data file: mzXML/
## dia_20180530/2018_0502BrikenDIA12.mzXML.
## The following columns were missing from the data:
## fullunimodpeptidename
## Error in `[.data.frame`(data, , sel_colnames): undefined columns selected

Now I have a couple data structures which should prove useful for the metrics provided by SWATH2stats, MSstats, and my own hpgltools.

3 SWATH2stats continued

Lets return to some of the metrics provided by swath2stats.

## Get correlations on a sample by sample basis
pp(file="images/20180523_swath2stats_sample_cor.png")
## Going to write the image to: images/20180523_swath2stats_sample_cor.png when dev.off() is called.
sample_cor <- plot_correlation_between_samples(s2s_exp,
                                               fun.aggregate=sum,
                                               column.values="intensity")
dev.off()
## X11cairo 
##        2
sample_cond_rep_cor <- plot_correlation_between_samples(s2s_exp,
                                                        comparison=transition_group_id ~
                                                          condition + bioreplicate + run,
                                                        fun.aggregate=sum,
                                                        column.values="intensity")

## I am a little concerned that these values do not seem to change when I took
## filtered/normalized data.  So I am rerunning them manually for a moment --
## perhaps I messed something up when I rewrote portions of the
## sample_annotation() function in SWATH2stats.

## ahh I think I see the problem.  The default value for fun.aggregate is NULL,
## which causes dcast to default to length.  I think this is not likely to be
## valid for this data.  I am not certain, however, what is the appropriate
## function.  If I had to guess, I would go with sum()?

assess_decoy_rate(s2s_exp)
## Number of non-decoy peptides: 3227
## Number of decoy peptides: 244
## Decoy rate: 0.0756
## This seems a bit high to me, yesno?
fdr_overall <- assess_fdr_overall(s2s_exp, output="Rconsole", plot=TRUE)

byrun_fdr <- assess_fdr_byrun(s2s_exp, FFT=0.7, plot=TRUE, output="Rconsole")
## The average FDR by run on assay level is 0.016
## The average FDR by run on peptide level is 0.016
## The average FDR by run on protein level is 0.042

chosen_mscore <- mscore4assayfdr(s2s_exp, FFT=0.7, fdr_target=0.02)
## Target assay FDR: 0.02
## Required overall m-score cutoff: 0.0031623
## achieving assay FDR: 0.0198
prot_score <- mscore4protfdr(s2s_exp, FFT=0.7, fdr_target=0.02)
## Target protein FDR: 0.02
## Required overall m-score cutoff: 0.00070795
## achieving protein FDR: 0.0181
mscore_filtered <- filter_mscore(s2s_exp, chosen_mscore)
## Original dimension: 46587, new dimension: 41365, difference: 5222.
data_filtered_mscore <- filter_mscore_freqobs(s2s_exp, 0.01, 0.8, rm.decoy=FALSE)
## Treshold, peptides need to have been quantified in more conditions than: 18.4
## Fraction of peptides selected: 1
## Original dimension: 47663, new dimension: 47663, difference: 0.
data_filtered_fdr <- filter_mscore_fdr(mscore_filtered, FFT=0.7,
                                       overall_protein_fdr_target=prot_score,
                                       upper_overall_peptide_fdr_limit=0.05)
## Target protein FDR: 0.000707945784384137
## Required overall m-score cutoff: 0.01
## achieving protein FDR: 0
## filter_mscore_fdr is filtering the data...
## finding m-score cutoff to achieve desired protein FDR in protein master list..
## finding m-score cutoff to achieve desired global peptide FDR..
## Target peptide FDR: 0.05
## Required overall m-score cutoff: 0.01
## Achieving peptide FDR: 0
## Proteins selected: 
## Total proteins selected: 931
## Final target proteins: 931
## Final decoy proteins: 0
## Peptides mapping to these protein entries selected:
## Total mapping peptides: 3071
## Final target peptides: 3071
## Final decoy peptides: 0
## Total peptides selected from:
## Total peptides: 3071
## Final target peptides: 3071
## Final decoy peptides: 0
## Individual run FDR quality of the peptides was not calculated
## as not every run contains a decoy.
## The decoys have been removed from the returned data.
only_proteotypic <- filter_proteotypic_peptides(data_filtered_fdr)
## Number of proteins detected: 933
## Protein identifiers: Rv1908c, Rv0242c, Rv3224, Rv1133c, Rv3036c, Rv1098c
## Number of proteins detected that are supported by a proteotypic peptide: 916
## Number of proteotypic peptides detected: 3028
all_filtered <- filter_all_peptides(only_proteotypic)
## Number of proteins detected: 916
## First 6 protein identifiers: Rv1908c, Rv0242c, Rv3224, Rv1133c, Rv3036c, Rv1098c
only_strong <- filter_on_max_peptides(data=all_filtered, n_peptides=10)
## Before filtering: 
##   Number of proteins: 916
##   Number of peptides: 3028
## 
## Percentage of peptides removed: 8.19%
## 
## After filtering: 
##   Number of proteins: 914
##   Number of peptides: 2780
only_minimum <- filter_on_min_peptides(data=only_strong, n_peptides=3)
## Before filtering: 
##   Number of proteins: 914
##   Number of peptides: 2780
## 
## Percentage of peptides removed: 0%
## 
## After filtering: 
##   Number of proteins: 867
##   Number of peptides: 2780
## I think these matrixes are probably smarter to use than the raw outmatrix from tric.
## But I am not a fan of rerwriting the sample column names.
protein_matrix_all <- write_matrix_proteins(
  s2s_exp, write.csv=TRUE,
  filename=paste0("results/swath2stats_", ver, "/protein_all.csv"))
## Warning in file(file, ifelse(append, "a", "w")): cannot open file 'results/
## swath2stats_20180528/protein_all.csv': No such file or directory
## Error in file(file, ifelse(append, "a", "w")): cannot open the connection
dim(protein_matrix_all)
## [1] 1146   24
protein_matrix_mscore <- write_matrix_proteins(
  mscore_filtered, write.csv=TRUE,
  filename=paste0("results/swath2stats_", ver, "/protein_matrix_mscore.csv"))
## Warning in file(file, ifelse(append, "a", "w")): cannot open file 'results/
## swath2stats_20180528/protein_matrix_mscore.csv': No such file or directory
## Error in file(file, ifelse(append, "a", "w")): cannot open the connection
dim(protein_matrix_mscore)
## [1] 931  24
peptide_matrix_mscore <- write_matrix_peptides(
  mscore_filtered, write.csv=TRUE,
  filename=paste0("results/swath2stats_", ver, "/peptide_matrix_mscore.csv"))
## Warning in file(file, ifelse(append, "a", "w")): cannot open file 'results/
## swath2stats_20180528/peptide_matrix_mscore.csv': No such file or directory
## Error in file(file, ifelse(append, "a", "w")): cannot open the connection
dim(peptide_matrix_mscore)
## [1] 3071   24
protein_matrix_minimum <- write_matrix_proteins(
  only_minimum, write.csv=TRUE,
  filename=paste0("results/swath2stats_", ver, "/protein_matrix_minimum.csv"))
## Warning in file(file, ifelse(append, "a", "w")): cannot open file 'results/
## swath2stats_20180528/protein_matrix_minimum.csv': No such file or directory
## Error in file(file, ifelse(append, "a", "w")): cannot open the connection
dim(protein_matrix_minimum)
## [1] 867  24
peptide_matrix_minimum <- write_matrix_peptides(
  only_minimum, write.csv=TRUE,
  filename=paste0("results/swath2stats_", ver, "/peptide_matrix_minimum.csv"))
## Warning in file(file, ifelse(append, "a", "w")): cannot open file 'results/
## swath2stats_20180528/peptide_matrix_minimum.csv': No such file or directory
## Error in file(file, ifelse(append, "a", "w")): cannot open the connection
dim(peptide_matrix_minimum)
## [1] 35164    24
rt_cor <- plot_correlation_between_samples(
  only_minimum, column.values="intensity", fun.aggregate=sum)

## I have no effing clue what this plot means.
variation <- plot_variation(only_minimum, fun.aggregate=sum)

## Something in SWATH2stats::disaggregate was written poorly and is looking for
## a variable named 'cols'
cols <- colnames(only_minimum)
disaggregated <- disaggregate(only_minimum, all.columns=TRUE)
## The library contains 6 transitions per precursor.
## The data table was transformed into a table containing one row per transition.
msstats_input <- convert4MSstats(disaggregated)
## One or several columns required by MSstats were not in the data. The columns were created and filled with NAs.
## Missing columns: fragmention, productcharge, isotopelabeltype
## isotopelabeltype was filled with light.
##alfq_input <- sm(convert4aLFQ(disaggregated))
##mapdia_input <- sm(convert4mapDIA(disaggregated, RT=TRUE))

3.1 Some new plots

In response to some interesting queries from Yan, I made a few little functions which query and plot data from the scored data provided by openswath/pyprophet. Let us look at their results here.

pyprophet_fun <- extract_pyprophet_data(metadata="sample_sheets/Mtb_dia_samples.xlsx")
## Warning in extract_pyprophet_data(metadata = "sample_sheets/Mtb_dia_samples.xlsx"): It
## appears that some files are missing in the metadata.
## Attempting to read the tsv file for: 2018_0315Briken01: results/openswath_201805/whole_8mz/2018_0315Briken01_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken01_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0315Briken02: results/openswath_201805/whole_8mz/2018_0315Briken02_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken02_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0315Briken03: results/openswath_201805/whole_8mz/2018_0315Briken03_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken03_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0315Briken04: results/openswath_201805/whole_8mz/2018_0315Briken04_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken04_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0315Briken05: results/openswath_201805/whole_8mz/2018_0315Briken05_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken05_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0315Briken06: results/openswath_201805/whole_8mz/2018_0315Briken06_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken06_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0315Briken11: results/openswath_201805/whole_8mz/2018_0315Briken11_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken11_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0315Briken12: results/openswath_201805/whole_8mz/2018_0315Briken12_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken12_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0315Briken13: results/openswath_201805/whole_8mz/2018_0315Briken13_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken13_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0315Briken15: results/openswath_201805/whole_8mz/2018_0315Briken15_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken15_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0315Briken16: results/openswath_201805/whole_8mz/2018_0315Briken16_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken16_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0315Briken21: results/openswath_201805/whole_8mz/2018_0315Briken21_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken21_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0315Briken22: results/openswath_201805/whole_8mz/2018_0315Briken22_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken22_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0315Briken23: results/openswath_201805/whole_8mz/2018_0315Briken23_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken23_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0315Briken24: results/openswath_201805/whole_8mz/2018_0315Briken24_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken24_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0315Briken25: results/openswath_201805/whole_8mz/2018_0315Briken25_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken25_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0315Briken26: results/openswath_201805/whole_8mz/2018_0315Briken26_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0315Briken26_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0502BrikenDIA07: results/openswath_201805/whole_8mz/2018_0502BrikenDIA07_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0502BrikenDIA07_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0502BrikenDIA08: results/openswath_201805/whole_8mz/2018_0502BrikenDIA08_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0502BrikenDIA08_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0502BrikenDIA09: results/openswath_201805/whole_8mz/2018_0502BrikenDIA09_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0502BrikenDIA09_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0502BrikenDIA11: results/openswath_201805/whole_8mz/2018_0502BrikenDIA11_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0502BrikenDIA11_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0502BrikenDIA12: results/openswath_201805/whole_8mz/2018_0502BrikenDIA12_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0502BrikenDIA12_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0502BrikenDIA01: results/openswath_201805/whole_8mz/2018_0502BrikenDIA01_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0502BrikenDIA01_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0502BrikenDIA02: results/openswath_201805/whole_8mz/2018_0502BrikenDIA02_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0502BrikenDIA02_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0502BrikenDIA03: results/openswath_201805/whole_8mz/2018_0502BrikenDIA03_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0502BrikenDIA03_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0502BrikenDIA04: results/openswath_201805/whole_8mz/2018_0502BrikenDIA04_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0502BrikenDIA04_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0502BrikenDIA05: results/openswath_201805/whole_8mz/2018_0502BrikenDIA05_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0502BrikenDIA05_vs_201805_whole_HCD_dia.tsv': No such file or directory
## Attempting to read the tsv file for: 2018_0502BrikenDIA06: results/openswath_201805/whole_8mz/2018_0502BrikenDIA06_vs_201805_whole_HCD_dia.tsv.
## Warning in file(file, "rt"): cannot open file 'results/openswath_201805/whole_8mz/
## 2018_0502BrikenDIA06_vs_201805_whole_HCD_dia.tsv': No such file or directory
mass_plot <- sm(plot_pyprophet_boxplot(pyprophet_fun, column="mass"))
## Error in sample_data[[i]]: subscript out of bounds
mass_plot
## Error in eval(expr, envir, enclos): object 'mass_plot' not found
deltart_plot_all <- sm(plot_pyprophet_boxplot(pyprophet_fun, column="delta_rt"))
## Error in sample_data[[i]]: subscript out of bounds
deltart_plot_all
## Error in eval(expr, envir, enclos): object 'deltart_plot_all' not found
deltart_plot_real <- sm(plot_pyprophet_boxplot(pyprophet_fun,
                                               column="delta_rt", keep_decoys=FALSE))
## Error in sample_data[[i]]: subscript out of bounds
deltart_plot_real
## Error in eval(expr, envir, enclos): object 'deltart_plot_real' not found
deltart_plot_decoys <- sm(plot_pyprophet_boxplot(pyprophet_fun,
                                                 column="delta_rt", keep_real=FALSE))
## Error in sample_data[[i]]: subscript out of bounds
deltart_plot_decoys
## Error in eval(expr, envir, enclos): object 'deltart_plot_decoys' not found
testing <- sm(plot_pyprophet_data(pyprophet_fun))
## Error in sample_data[[i]]: subscript out of bounds
testing$plot
## Error in eval(expr, envir, enclos): object 'testing' not found

3.2 MSstats

msstats.org seems to provide a complete solution for performing reasonable metrics of this data.

I am currently reading: http://msstats.org/wp-content/uploads/2017/01/MSstats_v3.7.3_manual.pdf

I made some moderately intrusive changes to MSstats to make it clearer, as well.

devtools::load_all("~/scratch/git/MSstats")
## Loading MSstats
## Warning: character(0)

## Warning: character(0)

## Warning: character(0)

## Warning: character(0)

## Warning: character(0)

## Warning: character(0)

## Warning: character(0)

## Warning: character(0)

## Warning: character(0)

## Warning: character(0)

## Warning: character(0)

## Warning: character(0)

## Warning: character(0)

## Warning: character(0)

## Warning: character(0)
msstats_quant <- dataProcess(msstats_input)
## 2018-06-11 12:17:32 WARNING::The required inputs: ISOTOPLABELCHARGE were not provided. the required inputs are: 
## Proteinname, PeptideSequence/PeptideModifiedSequence, PrecursorCharge, FragmentIon,
## ProductCharge, IsotopeLabelType, Condition, BioReplicate, Run, Intensity.
## The provided inputs are: PROTEINNAME, PEPTIDESEQUENCE, PRECURSORCHARGE, FRAGMENTION, PRODUCTCHARGE, ISOTOPELABELTYPE, INTENSITY, BIOREPLICATE, CONDITION, RUN
## 2018-06-11 12:17:32 INFO::The summary method is: TMP
## 2018-06-11 12:17:32 INFO::The cutoff censor method is: minFeature.
## 2018-06-11 12:17:32 INFO::The censored int is: NA
## 2018-06-11 12:17:33 INFO::Data successfully reformatted for further analyses.
## 2018-06-11 12:17:33 INFO::Log 2 transformation complete.
## 2018-06-11 12:17:38 INFO::The fillincomplete rows option is: TRUE
## 2018-06-11 12:17:38 WARNING::CAUTION: the input dataset has incomplete rows. If missing peaks
##  occur they should be included in the dataset as separate rows, and the missing intensity
##  values should be indicated with 'NA'. The incomplete rows are listed below.
## 2018-06-11 12:17:38 INFO::*** Subject : br2, Condition : wt_cf has incomplete rows for some features
##  2018-06-11 12:17:38 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:38 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:38 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:38 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:17:38 INFO::*** Subject : br3, Condition : wt_cf has incomplete rows for some features
##  2018-06-11 12:17:38 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:38 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:38 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:38 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:17:39 INFO::*** Subject : br4, Condition : wt_cf has incomplete rows for some features
##  2018-06-11 12:17:39 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:39 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:39 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:39 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:17:40 INFO::*** Subject : br5, Condition : wt_whole has incomplete rows for some features
##  2018-06-11 12:17:40 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:40 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:40 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:40 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:17:41 INFO::*** Subject : br6, Condition : wt_whole has incomplete rows for some features
##  2018-06-11 12:17:41 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:41 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:41 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAHVLPDAQLTAAEQR_2_NA_NA,
##  2018-06-11 12:17:41 INFO::AAAAHVLPDAQLTAAEQR_3_NA_NA
## 2018-06-11 12:17:42 INFO::*** Subject : br7, Condition : wt_whole has incomplete rows for some features
##  2018-06-11 12:17:42 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:42 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:42 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:42 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:17:43 INFO::*** Subject : brt, Condition : wt_whole has incomplete rows for some features
##  2018-06-11 12:17:43 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:43 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:43 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:43 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:17:45 INFO::*** Subject : bru, Condition : wt_whole has incomplete rows for some features
##  2018-06-11 12:17:45 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:45 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:45 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:45 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:17:46 INFO::*** Subject : brv, Condition : wt_cf has incomplete rows for some features
##  2018-06-11 12:17:46 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:46 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:46 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:46 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:17:47 INFO::*** Subject : brx, Condition : wt_cf has incomplete rows for some features
##  2018-06-11 12:17:47 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:47 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:47 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:47 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:17:48 INFO::*** Subject : bry, Condition : wt_cf has incomplete rows for some features
##  2018-06-11 12:17:48 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:48 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:48 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:48 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:17:49 INFO::*** Subject : brz, Condition : wt_whole has incomplete rows for some features
##  2018-06-11 12:17:49 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:49 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:49 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:49 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:17:51 INFO::*** Subject : br14, Condition : delta_cf has incomplete rows for some features
##  2018-06-11 12:17:51 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:51 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:51 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:51 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:17:52 INFO::*** Subject : br15, Condition : delta_cf has incomplete rows for some features
##  2018-06-11 12:17:52 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:52 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:52 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:52 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:17:53 INFO::*** Subject : br16, Condition : delta_cf has incomplete rows for some features
##  2018-06-11 12:17:53 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:53 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:53 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:53 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:17:55 INFO::*** Subject : br17, Condition : comp_cf has incomplete rows for some features
##  2018-06-11 12:17:55 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:55 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:55 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:55 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:17:57 INFO::*** Subject : br18, Condition : comp_cf has incomplete rows for some features
##  2018-06-11 12:17:57 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:57 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:57 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:57 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:17:59 INFO::*** Subject : br19, Condition : comp_cf has incomplete rows for some features
##  2018-06-11 12:17:59 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:17:59 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:17:59 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:17:59 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:18:00 INFO::*** Subject : br8, Condition : delta_whole has incomplete rows for some features
##  2018-06-11 12:18:00 INFO::(AAAAAPSGTAVGAGAR_2_NA_NA, AAAAAPSGTAVGAGAR_3_NA_NA,
##  2018-06-11 12:18:00 INFO::AAAAGGQVIAEPADIPSVGR_2_NA_NA, AAAAGGQVIAEPADIPSVGR_3_NA_NA,
##  2018-06-11 12:18:00 INFO::AAAAHVLPDAQLTAAEQR_2_NA_NA, AAAAHVLPDAQLTAAEQR_3_NA_NA
## 2018-06-11 12:18:02 INFO::*** Subject : br9, Condition : delta_whole has incomplete rows for some features
##  2018-06-11 12:18:02 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:18:02 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:18:02 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:18:02 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:18:03 INFO::*** Subject : br10, Condition : delta_whole has incomplete rows for some
##  2018-06-11 12:18:03 INFO::features (AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:18:03 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:18:03 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:18:03 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:18:05 INFO::*** Subject : br12, Condition : comp_whole has incomplete rows for some features
##  2018-06-11 12:18:05 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:18:05 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAAPSGTAVGAGAR_2_NA_NA,
##  2018-06-11 12:18:05 INFO::AAAAAPSGTAVGAGAR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:18:05 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA
## 2018-06-11 12:18:07 INFO::*** Subject : br13, Condition : comp_whole has incomplete rows for some features
##  2018-06-11 12:18:07 INFO::(AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA,
##  2018-06-11 12:18:07 INFO::AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAAAGGQVIAEPADIPSVGR_2_NA_NA,
##  2018-06-11 12:18:07 INFO::AAAAGGQVIAEPADIPSVGR_3_NA_NA, AAADSAELPLFR_2_NA_NA, AAADSAELPLFR_3_NA_NA
## Incomplete rows for missing peaks are added with intensity values=NA.
## 2018-06-11 12:18:10 INFO::Incomplete rows for missing peaks are added with intensity values=NA.
## *** Subject : br2, Condition : wt_cf has multiple rows (duplicate rows) for some features (AAESTAPHKVK_4_NA_NA, AAIEALGPIALPVK_2_NA_NA, AAIEALGPIALPVK_3_NA_NA, AAIEALGPIALPVK_4_NA_NA, AAPATVSELDR_2_NA_NA, AAPATVSELDR_3_NA_NA)
## 2018-06-11 12:18:10 WARNING::*** Subject : br2, Condition : wt_cf has multiple rows (duplicate rows) for some features (AAESTAPHKVK_4_NA_NA, AAIEALGPIALPVK_2_NA_NA, AAIEALGPIALPVK_3_NA_NA, AAIEALGPIALPVK_4_NA_NA, AAPATVSELDR_2_NA_NA, AAPATVSELDR_3_NA_NA)
## *** Subject : br3, Condition : wt_cf has multiple rows (duplicate rows) for some features (AADSAESDAGADQTGPQVK_2_NA_NA, AADSAESDAGADQTGPQVK_3_NA_NA, AFAEPAGIK_2_NA_NA, AFAEPAGIK_3_NA_NA, AFAEPAGIKIEASDISVAAR_2_NA_NA, AFAEPAGIKIEASDISVAAR_3_NA_NA)
## 2018-06-11 12:18:13 WARNING::*** Subject : br3, Condition : wt_cf has multiple rows (duplicate rows) for some features (AADSAESDAGADQTGPQVK_2_NA_NA, AADSAESDAGADQTGPQVK_3_NA_NA, AFAEPAGIK_2_NA_NA, AFAEPAGIK_3_NA_NA, AFAEPAGIKIEASDISVAAR_2_NA_NA, AFAEPAGIKIEASDISVAAR_3_NA_NA)
## *** Subject : br4, Condition : wt_cf has multiple rows (duplicate rows) for some features (AAGFSDRPFSVMR_2_NA_NA, AAGFSDRPFSVMR_3_NA_NA, AALEKDYDLVGNNLGGR_2_NA_NA, AALEKDYDLVGNNLGGR_3_NA_NA, AALGGSDISAIK_2_NA_NA, AALGGSDISAIK_3_NA_NA)
## 2018-06-11 12:18:14 WARNING::*** Subject : br4, Condition : wt_cf has multiple rows (duplicate rows) for some features (AAGFSDRPFSVMR_2_NA_NA, AAGFSDRPFSVMR_3_NA_NA, AALEKDYDLVGNNLGGR_2_NA_NA, AALEKDYDLVGNNLGGR_3_NA_NA, AALGGSDISAIK_2_NA_NA, AALGGSDISAIK_3_NA_NA)
## *** Subject : br5, Condition : wt_whole has multiple rows (duplicate rows) for some features (AAALVELLSPFEADEGKAPAGR_2_NA_NA, AAALVELLSPFEADEGKAPAGR_3_NA_NA, AAIGLGDGVVR_2_NA_NA, AAIGLGDGVVR_3_NA_NA, AAVTAVSDAVR_2_NA_NA, AAVTAVSDAVR_3_NA_NA)
## 2018-06-11 12:18:15 WARNING::*** Subject : br5, Condition : wt_whole has multiple rows (duplicate rows) for some features (AAALVELLSPFEADEGKAPAGR_2_NA_NA, AAALVELLSPFEADEGKAPAGR_3_NA_NA, AAIGLGDGVVR_2_NA_NA, AAIGLGDGVVR_3_NA_NA, AAVTAVSDAVR_2_NA_NA, AAVTAVSDAVR_3_NA_NA)
## *** Subject : br6, Condition : wt_whole has multiple rows (duplicate rows) for some features (AAAAGGQVIAEPADIPSVGR_2_NA_NA, AAAAGGQVIAEPADIPSVGR_3_NA_NA, AAAQERPA_2_NA_NA, AADDAVYTALDANADR_2_NA_NA, AADDAVYTALDANADR_3_NA_NA, AAEGYLEAATSR_2_NA_NA)
## 2018-06-11 12:18:16 WARNING::*** Subject : br6, Condition : wt_whole has multiple rows (duplicate rows) for some features (AAAAGGQVIAEPADIPSVGR_2_NA_NA, AAAAGGQVIAEPADIPSVGR_3_NA_NA, AAAQERPA_2_NA_NA, AADDAVYTALDANADR_2_NA_NA, AADDAVYTALDANADR_3_NA_NA, AAEGYLEAATSR_2_NA_NA)
## *** Subject : br7, Condition : wt_whole has multiple rows (duplicate rows) for some features (AAANLGINLSR_2_NA_NA, AAANLGINLSR_3_NA_NA, AAANLGINLSR_4_NA_NA, AAGAPVIC(UniMod_4)ETADQGR_2_NA_NA, AAGAPVIC(UniMod_4)ETADQGR_3_NA_NA, AAGAPVIC(UniMod_4)ETADQGR_4_NA_NA)
## 2018-06-11 12:18:17 WARNING::*** Subject : br7, Condition : wt_whole has multiple rows (duplicate rows) for some features (AAANLGINLSR_2_NA_NA, AAANLGINLSR_3_NA_NA, AAANLGINLSR_4_NA_NA, AAGAPVIC(UniMod_4)ETADQGR_2_NA_NA, AAGAPVIC(UniMod_4)ETADQGR_3_NA_NA, AAGAPVIC(UniMod_4)ETADQGR_4_NA_NA)
## *** Subject : brt, Condition : wt_whole has multiple rows (duplicate rows) for some features (AAEAWSGGYFAK_2_NA_NA, AAEAWSGGYFAK_3_NA_NA, AAHWEHTVAVTDDGPR_2_NA_NA, AAHWEHTVAVTDDGPR_3_NA_NA, AAPVAPVLSAR_2_NA_NA, AAPVAPVLSAR_3_NA_NA)
## 2018-06-11 12:18:18 WARNING::*** Subject : brt, Condition : wt_whole has multiple rows (duplicate rows) for some features (AAEAWSGGYFAK_2_NA_NA, AAEAWSGGYFAK_3_NA_NA, AAHWEHTVAVTDDGPR_2_NA_NA, AAHWEHTVAVTDDGPR_3_NA_NA, AAPVAPVLSAR_2_NA_NA, AAPVAPVLSAR_3_NA_NA)
## *** Subject : bru, Condition : wt_whole has multiple rows (duplicate rows) for some features (AAADSAELPLFR_2_NA_NA, AAADSAELPLFR_3_NA_NA, AEPIFATVAPGVAAAPR_2_NA_NA, AEPIFATVAPGVAAAPR_3_NA_NA, AEQLDSDRL_2_NA_NA, AEQLDSDRL_3_NA_NA)
## 2018-06-11 12:18:19 WARNING::*** Subject : bru, Condition : wt_whole has multiple rows (duplicate rows) for some features (AAADSAELPLFR_2_NA_NA, AAADSAELPLFR_3_NA_NA, AEPIFATVAPGVAAAPR_2_NA_NA, AEPIFATVAPGVAAAPR_3_NA_NA, AEQLDSDRL_2_NA_NA, AEQLDSDRL_3_NA_NA)
## *** Subject : brv, Condition : wt_cf has multiple rows (duplicate rows) for some features (AAAIHDQFVATLASSASSYAATEVANAAAAS_2_NA_NA, AAM(UniMod_35)AAQLQAVPGAAQYIGLVESVAGSC(UniMod_4)NNY_2_NA_NA, AAMAAQLQAVPGAAQYIGLVESVAGSC(UniMod_4)NNY_2_NA_NA, AAVGTTSDINQQDPATLQDGGNLR_2_NA_NA, AAVGTTSDINQQDPATLQDGGNLR_3_NA_NA, AAVGTTSDINQQDPATLQDGGNLR_4_NA_NA)
## 2018-06-11 12:18:20 WARNING::*** Subject : brv, Condition : wt_cf has multiple rows (duplicate rows) for some features (AAAIHDQFVATLASSASSYAATEVANAAAAS_2_NA_NA, AAM(UniMod_35)AAQLQAVPGAAQYIGLVESVAGSC(UniMod_4)NNY_2_NA_NA, AAMAAQLQAVPGAAQYIGLVESVAGSC(UniMod_4)NNY_2_NA_NA, AAVGTTSDINQQDPATLQDGGNLR_2_NA_NA, AAVGTTSDINQQDPATLQDGGNLR_3_NA_NA, AAVGTTSDINQQDPATLQDGGNLR_4_NA_NA)
## *** Subject : brx, Condition : wt_cf has multiple rows (duplicate rows) for some features (AAALEKAAAAR_2_NA_NA, AAALEKAAAAR_3_NA_NA, AAALNIVPTSTGAAK_2_NA_NA, AAALNIVPTSTGAAK_3_NA_NA, AAAMTASAEYLR_2_NA_NA, AAAMTASAEYLR_3_NA_NA)
## 2018-06-11 12:18:21 WARNING::*** Subject : brx, Condition : wt_cf has multiple rows (duplicate rows) for some features (AAALEKAAAAR_2_NA_NA, AAALEKAAAAR_3_NA_NA, AAALNIVPTSTGAAK_2_NA_NA, AAALNIVPTSTGAAK_3_NA_NA, AAAMTASAEYLR_2_NA_NA, AAAMTASAEYLR_3_NA_NA)
## *** Subject : bry, Condition : wt_cf has multiple rows (duplicate rows) for some features (AAELLGWR_2_NA_NA, AAELLGWR_3_NA_NA, AASGAVLSALGPK_2_NA_NA, AASGAVLSALGPK_3_NA_NA, AAVADLVTAGTHPSC(UniMod_4)PKPAR_2_NA_NA, AAVADLVTAGTHPSC(UniMod_4)PKPAR_3_NA_NA)
## 2018-06-11 12:18:22 WARNING::*** Subject : bry, Condition : wt_cf has multiple rows (duplicate rows) for some features (AAELLGWR_2_NA_NA, AAELLGWR_3_NA_NA, AASGAVLSALGPK_2_NA_NA, AASGAVLSALGPK_3_NA_NA, AAVADLVTAGTHPSC(UniMod_4)PKPAR_2_NA_NA, AAVADLVTAGTHPSC(UniMod_4)PKPAR_3_NA_NA)
## *** Subject : brz, Condition : wt_whole has multiple rows (duplicate rows) for some features (AAAGALSPLAPLR_2_NA_NA, AAAGALSPLAPLR_3_NA_NA, AADILKDESYK_2_NA_NA, AADILKDESYK_3_NA_NA, AADILKDESYK_4_NA_NA, AAGAEAIQINDAHR_2_NA_NA)
## 2018-06-11 12:18:23 WARNING::*** Subject : brz, Condition : wt_whole has multiple rows (duplicate rows) for some features (AAAGALSPLAPLR_2_NA_NA, AAAGALSPLAPLR_3_NA_NA, AADILKDESYK_2_NA_NA, AADILKDESYK_3_NA_NA, AADILKDESYK_4_NA_NA, AAGAEAIQINDAHR_2_NA_NA)
## *** Subject : br14, Condition : delta_cf has multiple rows (duplicate rows) for some features (AAASGATVLC(UniMod_4)VSK_2_NA_NA, AAASGATVLC(UniMod_4)VSK_3_NA_NA, AAASGATVLC(UniMod_4)VSKDLPFAQKR_2_NA_NA, AADM(UniMod_35)WGPSSDPAWER_2_NA_NA, AADM(UniMod_35)WGPSSDPAWER_3_NA_NA, AADMWGPSSDPAWER_2_NA_NA)
## 2018-06-11 12:18:24 WARNING::*** Subject : br14, Condition : delta_cf has multiple rows (duplicate rows) for some features (AAASGATVLC(UniMod_4)VSK_2_NA_NA, AAASGATVLC(UniMod_4)VSK_3_NA_NA, AAASGATVLC(UniMod_4)VSKDLPFAQKR_2_NA_NA, AADM(UniMod_35)WGPSSDPAWER_2_NA_NA, AADM(UniMod_35)WGPSSDPAWER_3_NA_NA, AADMWGPSSDPAWER_2_NA_NA)
## *** Subject : br15, Condition : delta_cf has multiple rows (duplicate rows) for some features (ADALQADAER_2_NA_NA, ADALQADAER_3_NA_NA, ADAMLADAQSR_2_NA_NA, ADAMLADAQSR_3_NA_NA, AELPGVDPDKDVDIM(UniMod_35)VR_2_NA_NA, AELPGVDPDKDVDIMVR_2_NA_NA)
## 2018-06-11 12:18:25 WARNING::*** Subject : br15, Condition : delta_cf has multiple rows (duplicate rows) for some features (ADALQADAER_2_NA_NA, ADALQADAER_3_NA_NA, ADAMLADAQSR_2_NA_NA, ADAMLADAQSR_3_NA_NA, AELPGVDPDKDVDIM(UniMod_35)VR_2_NA_NA, AELPGVDPDKDVDIMVR_2_NA_NA)
## *** Subject : br16, Condition : delta_cf has multiple rows (duplicate rows) for some features (AAGDPDLLVSR_2_NA_NA, AAGDPDLLVSR_3_NA_NA, AAGDPDLLVSR_4_NA_NA, AASENGVPVTAR_2_NA_NA, AASENGVPVTAR_3_NA_NA, AASENGVPVTAR_4_NA_NA)
## 2018-06-11 12:18:26 WARNING::*** Subject : br16, Condition : delta_cf has multiple rows (duplicate rows) for some features (AAGDPDLLVSR_2_NA_NA, AAGDPDLLVSR_3_NA_NA, AAGDPDLLVSR_4_NA_NA, AASENGVPVTAR_2_NA_NA, AASENGVPVTAR_3_NA_NA, AASENGVPVTAR_4_NA_NA)
## *** Subject : br17, Condition : comp_cf has multiple rows (duplicate rows) for some features (AAC(UniMod_4)LDYVEK_2_NA_NA, AAC(UniMod_4)LDYVEK_3_NA_NA, AAEHGDLPLSFSVTNIQPAAAGSATADVSVSGPK_2_NA_NA, AAEHGDLPLSFSVTNIQPAAAGSATADVSVSGPK_3_NA_NA, AAEHGDLPLSFSVTNIQPAAAGSATADVSVSGPK_4_NA_NA, AAELLASTNR_2_NA_NA)
## 2018-06-11 12:18:27 WARNING::*** Subject : br17, Condition : comp_cf has multiple rows (duplicate rows) for some features (AAC(UniMod_4)LDYVEK_2_NA_NA, AAC(UniMod_4)LDYVEK_3_NA_NA, AAEHGDLPLSFSVTNIQPAAAGSATADVSVSGPK_2_NA_NA, AAEHGDLPLSFSVTNIQPAAAGSATADVSVSGPK_3_NA_NA, AAEHGDLPLSFSVTNIQPAAAGSATADVSVSGPK_4_NA_NA, AAELLASTNR_2_NA_NA)
## *** Subject : br18, Condition : comp_cf has multiple rows (duplicate rows) for some features (AADTDVFSAVR_2_NA_NA, AADTDVFSAVR_3_NA_NA, AAEAAAIAALPPSEDFESGARR_2_NA_NA, AAEAAAIAALPPSEDFESGARR_3_NA_NA, AAGGAAGPLGAK_2_NA_NA, AAGGAAGPLGAK_3_NA_NA)
## 2018-06-11 12:18:28 WARNING::*** Subject : br18, Condition : comp_cf has multiple rows (duplicate rows) for some features (AADTDVFSAVR_2_NA_NA, AADTDVFSAVR_3_NA_NA, AAEAAAIAALPPSEDFESGARR_2_NA_NA, AAEAAAIAALPPSEDFESGARR_3_NA_NA, AAGGAAGPLGAK_2_NA_NA, AAGGAAGPLGAK_3_NA_NA)
## *** Subject : br19, Condition : comp_cf has multiple rows (duplicate rows) for some features (AAEPAPQPEQPDTPALGGEQAELTAES_2_NA_NA, AAGAAGIPIR_2_NA_NA, AAGAAGIPIR_3_NA_NA, AAIDTAHAQGAR_2_NA_NA, AALAAAGVQPETVGVVEAHGTGTPIGDPIEYR_2_NA_NA, AALAAAGVQPETVGVVEAHGTGTPIGDPIEYR_3_NA_NA)
## 2018-06-11 12:18:29 WARNING::*** Subject : br19, Condition : comp_cf has multiple rows (duplicate rows) for some features (AAEPAPQPEQPDTPALGGEQAELTAES_2_NA_NA, AAGAAGIPIR_2_NA_NA, AAGAAGIPIR_3_NA_NA, AAIDTAHAQGAR_2_NA_NA, AALAAAGVQPETVGVVEAHGTGTPIGDPIEYR_2_NA_NA, AALAAAGVQPETVGVVEAHGTGTPIGDPIEYR_3_NA_NA)
## *** Subject : br8, Condition : delta_whole has multiple rows (duplicate rows) for some features (AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA, AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAGAELLDYDEVVAR_2_NA_NA, AAGAELLDYDEVVAR_3_NA_NA, AAVILDSDPWR_2_NA_NA, AAYLAEGRQPVVR_2_NA_NA)
## 2018-06-11 12:18:31 WARNING::*** Subject : br8, Condition : delta_whole has multiple rows (duplicate rows) for some features (AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_2_NA_NA, AAAAADPGPPTRPAHNAAGVSPEMVQVPAEAQR_3_NA_NA, AAGAELLDYDEVVAR_2_NA_NA, AAGAELLDYDEVVAR_3_NA_NA, AAVILDSDPWR_2_NA_NA, AAYLAEGRQPVVR_2_NA_NA)
## *** Subject : br9, Condition : delta_whole has multiple rows (duplicate rows) for some features (AAAKAPLRQTAVSAAALGLR_2_NA_NA, AAAKAPLRQTAVSAAALGLR_3_NA_NA, AAKADDLGAQQVAK_2_NA_NA, ADDLGAQQVAK_2_NA_NA, ADDLGAQQVAK_3_NA_NA, ADSGVPIVMLTAK_2_NA_NA)
## 2018-06-11 12:18:32 WARNING::*** Subject : br9, Condition : delta_whole has multiple rows (duplicate rows) for some features (AAAKAPLRQTAVSAAALGLR_2_NA_NA, AAAKAPLRQTAVSAAALGLR_3_NA_NA, AAKADDLGAQQVAK_2_NA_NA, ADDLGAQQVAK_2_NA_NA, ADDLGAQQVAK_3_NA_NA, ADSGVPIVMLTAK_2_NA_NA)
## *** Subject : br10, Condition : delta_whole has multiple rows (duplicate rows) for some features (AADAVSEALLASATPVSGK_2_NA_NA, AADAVSEALLASATPVSGK_3_NA_NA, AFGGPTVTNDGVTVAR_2_NA_NA, AFGGPTVTNDGVTVAR_3_NA_NA, AFTVASAGASADR_2_NA_NA, AGGLM(UniMod_35)SALTPQFGSK_2_NA_NA)
## 2018-06-11 12:18:33 WARNING::*** Subject : br10, Condition : delta_whole has multiple rows (duplicate rows) for some features (AADAVSEALLASATPVSGK_2_NA_NA, AADAVSEALLASATPVSGK_3_NA_NA, AFGGPTVTNDGVTVAR_2_NA_NA, AFGGPTVTNDGVTVAR_3_NA_NA, AFTVASAGASADR_2_NA_NA, AGGLM(UniMod_35)SALTPQFGSK_2_NA_NA)
## *** Subject : br12, Condition : comp_whole has multiple rows (duplicate rows) for some features (AADWVDRAEAEAEVQR_2_NA_NA, AADWVDRAEAEAEVQR_3_NA_NA, AAEIVAGPPR_2_NA_NA, AAEIVAGPPR_3_NA_NA, AAEIVAGPPR_4_NA_NA, AAEIVAGPPRK_3_NA_NA)
## 2018-06-11 12:18:34 WARNING::*** Subject : br12, Condition : comp_whole has multiple rows (duplicate rows) for some features (AADWVDRAEAEAEVQR_2_NA_NA, AADWVDRAEAEAEVQR_3_NA_NA, AAEIVAGPPR_2_NA_NA, AAEIVAGPPR_3_NA_NA, AAEIVAGPPR_4_NA_NA, AAEIVAGPPRK_3_NA_NA)
## *** Subject : br13, Condition : comp_whole has multiple rows (duplicate rows) for some features (AAAAAPSGTAVGAGAR_2_NA_NA, AAAAAPSGTAVGAGAR_3_NA_NA, AAAAHVLPDAQLTAAEQR_2_NA_NA, AAAAHVLPDAQLTAAEQR_3_NA_NA, AAIAVGHGVTVR_2_NA_NA, AAIAVGHGVTVR_3_NA_NA)
## 2018-06-11 12:18:37 WARNING::*** Subject : br13, Condition : comp_whole has multiple rows (duplicate rows) for some features (AAAAAPSGTAVGAGAR_2_NA_NA, AAAAAPSGTAVGAGAR_3_NA_NA, AAAAHVLPDAQLTAAEQR_2_NA_NA, AAAAHVLPDAQLTAAEQR_3_NA_NA, AAIAVGHGVTVR_2_NA_NA, AAIAVGHGVTVR_3_NA_NA)
## 2018-06-11 12:18:37 WARNING::Please remove duplicate rows in the list above.
## 2018-06-11 12:18:39 INFO::Recast the following columns as factors:
## group, subject, group_original, subject_original, subject_original_nested, feature, and run.
## 2018-06-11 12:18:40 INFO::Performing equalize medians normalization.
## 2018-06-11 12:18:40 INFO::Between run interference score was not calculated.
## 2018-06-11 12:18:40 INFO::** Log2 intensities under cutoff =14.452 were considered as censored missing values.
## 2018-06-11 12:18:40 INFO::** Log2 intensities = NA were considered as censored missing values.
## 2018-06-11 12:18:40 INFO::Feature Subset: using all features in the data set.
## 2018-06-11 12:18:40 INFO::Summary: 1 levels of isotope labeling were observed.
## 2018-06-11 12:19:20 INFO::Summary of Features:
## 2018-06-11 12:19:20 INFO::Number of Proteins : 867
## 2018-06-11 12:19:20 INFO::Number of Peptides/Protein : 3-494
## 2018-06-11 12:19:20 INFO::Number of Transitions/Peptide : 1-1
##                       
##   Summary of Samples :
## 2018-06-11 12:20:20 INFO::comp_cf   comp_whole   delta_cf   delta_whole   wt_cf   wt_whole
##  2018-06-11 12:20:20 INFO::--------------------------------  --------  -----------  ---------  ------------  ------  ---------
##  2018-06-11 12:20:20 INFO::Number of MS runs                        3            2          3             3       6          6
##  2018-06-11 12:20:20 INFO::Number of Biological Replicates          3            2          3             3       6          6
##  2018-06-11 12:20:20 INFO::Number of Technical Replicates           1            1          1             1       1          1
## 2018-06-11 12:20:20 INFO::Missingness summary: 5374 are missing completely in one condition.
## 2018-06-11 12:20:20 INFO::-> AADWVDRAEAEAEVQR_2_NA_NA, AAIEEMAPQLAR_2_NA_NA, AAVLASGM(UniMod_35)PVTSGGVQLNR_2_NA_NA, ADAVDDEELLELVEMEVR_2_NA_NA, ADDLLTATLLTAR_2_NA_NA ...
## 2018-06-11 12:20:20 INFO::Missingness summary: 0 are missing 75% observations.
## 2018-06-11 12:20:20 INFO::-> AADWVDRAEAEAEVQR_2_NA_NA, AAIEEMAPQLAR_2_NA_NA, AAVLASGM(UniMod_35)PVTSGGVQLNR_2_NA_NA, ADAVDDEELLELVEMEVR_2_NA_NA, ADDLLTATLLTAR_2_NA_NA ...
## 2018-06-11 12:20:20 INFO::Processing data for analysis is complete.
## 
  |                                                                                      
  |                                                                                |   0%
## Warning in survreg.fit(X, Y, weights, offset, init = init, controlvals = control, : Ran
## out of iterations and did not converge
## Warning in survreg.fit(X, Y, weights, offset, init = init, controlvals = control, : Ran
## out of iterations and did not converge

## Warning in survreg.fit(X, Y, weights, offset, init = init, controlvals = control, : Ran
## out of iterations and did not converge
## 
## 2018-06-11 12:28:20 INFO::The summarization per subplot by method: TMP is finished.
msstats_plots <- sm(dataProcessPlots(msstats_quant, type="QCPLOT"))

my_levels <- levels(as.factor(msstats_input$condition))

my_levels
## [1] "comp_cf"     "comp_whole"  "delta_cf"    "delta_whole" "wt_cf"       "wt_whole"
comparisons <- ghetto_contrast_matrix(
  numerators=c("wt_cf", "delta_cf", "comp_cf",
               "delta_cf", "comp_cf", "delta_whole",
               "comp_whole"),
  denominators=c("wt_whole", "delta_whole", "comp_whole",
                 "wt_cf", "wt_cf", "wt_whole",
                 "wt_whole"))
results <- list()
for (c in 1:length(rownames(comparisons))) {
  name <- rownames(comparisons)[c]
  message("Starting ", name)
  comp <- comparisons[c, ]
  comparison <- t(as.matrix(comp))
  rownames(comparison) <- name
  results[name] <- sm(MSstats::groupComparison(contrast.matrix=comparison,
                                               data=msstats_quant))
}
## Starting wt_cf_vs_wt_whole
## Warning in results[name] <- sm(MSstats::groupComparison(contrast.matrix = comparison, :
## number of items to replace is not a multiple of replacement length
## Starting delta_cf_vs_delta_whole
## Warning in results[name] <- sm(MSstats::groupComparison(contrast.matrix = comparison, :
## number of items to replace is not a multiple of replacement length
## Starting comp_cf_vs_comp_whole
## Warning in results[name] <- sm(MSstats::groupComparison(contrast.matrix = comparison, :
## number of items to replace is not a multiple of replacement length
## Starting delta_cf_vs_wt_cf
## Warning in results[name] <- sm(MSstats::groupComparison(contrast.matrix = comparison, :
## number of items to replace is not a multiple of replacement length
## Starting comp_cf_vs_wt_cf
## Warning in results[name] <- sm(MSstats::groupComparison(contrast.matrix = comparison, :
## number of items to replace is not a multiple of replacement length
## Starting delta_whole_vs_wt_whole
## Warning in results[name] <- sm(MSstats::groupComparison(contrast.matrix = comparison, :
## number of items to replace is not a multiple of replacement length
## Starting comp_whole_vs_wt_whole
## Warning in results[name] <- sm(MSstats::groupComparison(contrast.matrix = comparison, :
## number of items to replace is not a multiple of replacement length

3.2.1 P/PE protein QC plots for Yan

Yan asked for the p/pe protein qc plots. ok. I changed the dataProcessPlots to return something useful, so that should be possible now.

pe_genes <- read.table("reference/annotated_pe_genes.txt")[[1]]

## Unfortunately, the names did not get set in my changed version of dataProcessPlots...
plotlst <- msstats_plots$QCPLOT
available_plots <- gsub(pattern="^1/", replacement="", x=levels(msstats_quant$ProcessedData$PROTEIN))
names(plotlst) <- available_plots

pe_in_avail_idx <- pe_genes %in% available_plots
pe_in_avail <- pe_genes[pe_in_avail_idx]
pe_plots <- plotlst[pe_in_avail]
pdf(file="pe_qc_plots.pdf")
for (p in 1:length(pe_plots)) {
  plot(pe_plots[[p]])
}
dev.off()

4 Create hpgltools expressionset

Since I am not certain I understand these data, I will take the intensities from SWATH2stats, metadata, and annotation data; attempt to create a ‘normal’ expressionset; poke at it to see what I can learn.

4.1 Massaging the metadata

I want to use the same metadata as were used for MSstats. It has a few important differences from the requirements of hpgltools: pretty much only that I do not allow rownames/sampleIDs to start with a number.

metadata <- sample_annot
metadata[["sampleid"]] <- paste0("s", metadata[["sampleid"]])
rownames(metadata) <- metadata[["sampleid"]]

4.2 Massaging the gene annotation data and adding the msstats data.

I have my own annotation data from the gff file/microbesonline/whatever, I can add the MSstats result to it so that later I can print them all together.

4.3 Massaging the intensity matrix

I do not want the \1 before the protein names, I already merged them into one entry per gene vis SWATH2stats.

prot_mtrx <- read.csv(paste0("results/swath2stats_", ver, "/protein_matrix_minimum.csv"))
## Warning in file(file, "rt"): cannot open file 'results/swath2stats_20180528/
## protein_matrix_minimum.csv': No such file or directory
## Error in file(file, "rt"): cannot open the connection
rownames(prot_mtrx) <- gsub(pattern="^1\\/", replacement="", x=prot_mtrx[["proteinname"]])
## Error in `.rowNamesDF<-`(x, value = value): invalid 'row.names' length
prot_mtrx <- prot_mtrx[, -1]
## Important question: Did SWATH2stats reorder my data?
fun <- gsub(pattern="^.*_(2018.*$)", replacement="\\1", x=colnames(prot_mtrx))
colnames(prot_mtrx) <- paste0("s", fun)

4.4 Merge the pieces

Now we should have sufficient pieces to make an expressionset.

While here, I will also split the data into a cf and whole-cell pair of data structures.

## Drop the metadata not in the protein matrix:
## And ensure that they are the same order.
reordered <- colnames(prot_mtrx)
metadata <- metadata[reordered, ]

protein_expt <- create_expt(metadata,
                            count_dataframe=prot_mtrx,
                            gene_info=mtb_annotations)
## Reading the sample metadata.
## The sample definitions comprises: 0, 2 rows, columns.
## The count table column names are: ss2018_0315Briken01, ss2018_0315Briken02, ss2018_0315Briken03, ss2018_0315Briken04, ss2018_0315Briken05, ss2018_0315Briken06, ss2018_0315Briken21, ss2018_0315Briken22, ss2018_0315Briken23, ss2018_0315Briken24, ss2018_0315Briken25, ss2018_0315Briken26, ss2018_0502BrikenDIA01, ss2018_0502BrikenDIA02, ss2018_0502BrikenDIA03, ss2018_0502BrikenDIA05, ss2018_0502BrikenDIA06, ss2018_0502BrikenDIA07, ss2018_0502BrikenDIA08, ss2018_0502BrikenDIA09, ss2018_0502BrikenDIA11, ss2018_0502BrikenDIA12
## The  meta   data  row  names are:
## Error in create_expt(metadata, count_dataframe = prot_mtrx, gene_info = mtb_annotations): The count table column names are not the same as the sample definition row names.
whole_expt <- subset_expt(protein_expt, subset="collectiontype=='whole'")
## There were 23, now there are 11 samples.
cf_expt <- subset_expt(protein_expt, subset="collectiontype=='cf'")
## There were 23, now there are 12 samples.

4.5 Metrics of the full data set

protein_metrics <- sm(graph_metrics(protein_expt))
protein_norm <- sm(normalize_expt(protein_expt, transform="log2", convert="cpm",
                                  norm="quant", filter=TRUE))
protein_norm_metrics <- sm(graph_metrics(protein_norm))
protein_fsva <- sm(normalize_expt(protein_expt, transform="log2", convert="cpm",
                                  batch="fsva", filter=TRUE))
protein_fsva_metrics <- sm(graph_metrics(protein_fsva))

4.6 Metrics of the whole-cell data set

whole_metrics <- sm(graph_metrics(whole_expt))
whole_norm <- sm(normalize_expt(whole_expt, transform="log2", convert="cpm",
                                  norm="quant", filter=TRUE))
whole_norm_metrics <- sm(graph_metrics(whole_norm))
whole_fsva <- sm(normalize_expt(whole_expt, transform="log2", convert="cpm",
                                  batch="fsva", filter=TRUE))
whole_fsva_metrics <- sm(graph_metrics(whole_fsva))

4.7 Metrics of the filtrate data set

cf_metrics <- sm(graph_metrics(cf_expt))
cf_norm <- sm(normalize_expt(cf_expt, transform="log2", convert="cpm",
                                  norm="quant", filter=TRUE))
cf_norm_metrics <- sm(graph_metrics(cf_norm))
cf_fsva <- sm(normalize_expt(cf_expt, transform="log2", convert="cpm",
                                  batch="fsva", filter=TRUE))
cf_fsva_metrics <- sm(graph_metrics(cf_fsva))

4.8 plot some metrics

pp(image=protein_metrics$libsize, file="images/20180523_libsize.png")
## Writing the image to: images/20180523_libsize.png and calling dev.off().
## It seems to me that the scale of the data is all within an order of magnitude or two.
## I cannot get used to these absurdly large numbers though.
pp(image=protein_norm_metrics$pcaplot, file="images/20180523_norm_pca.png")
## Writing the image to: images/20180523_norm_pca.png and calling dev.off().
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

## There appears to be a nice split in the data, however the un-assayable batch
## effect is a problem.
pp(image=protein_fsva_metrics$pcaplot, file="images/20180523_fsva_pca.png")
## Writing the image to: images/20180523_fsva_pca.png and calling dev.off().
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

## fsva seems to get some handle on the data, but I don't think we should rely
## upon it.
pp(image=protein_norm_metrics$corheat, file="images/20180523_norm_corheat.png")
## Writing the image to: images/20180523_norm_corheat.png and calling dev.off().

## Once again, the whole-cell/culture-filtrate split is very large.
pp(image=protein_metrics$density, file="images/20180523_raw_density.png")
## Writing the image to: images/20180523_raw_density.png and calling dev.off().

## There are two obvious distributions in the data, once again split between types.
pp(image=protein_metrics$boxplot, file="images/20180523_boxplot.png")
## Writing the image to: images/20180523_boxplot.png and calling dev.off().

## This recapitulates the previous plot.

pp(image=whole_metrics$libsize, file="images/20180523_whole_libsize.png")
## Writing the image to: images/20180523_whole_libsize.png and calling dev.off().

pp(image=whole_norm_metrics$pcaplot, file="images/20180523_whole_norm_pca.png")
## Writing the image to: images/20180523_whole_norm_pca.png and calling dev.off().
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

pp(image=whole_fsva_metrics$pcaplot, file="images/20180523_whole_fsva_pca.png")
## Writing the image to: images/20180523_whole_fsva_pca.png and calling dev.off().
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

pp(image=whole_norm_metrics$corheat, file="images/20180523_whole_norm_corheat.png")
## Writing the image to: images/20180523_whole_norm_corheat.png and calling dev.off().

pp(image=whole_metrics$density, file="images/20180523_whole_raw_density.png")
## Writing the image to: images/20180523_whole_raw_density.png and calling dev.off().

pp(image=whole_metrics$boxplot, file="images/20180523_whole_boxplot.png")
## Writing the image to: images/20180523_whole_boxplot.png and calling dev.off().

pp(image=cf_metrics$libsize, file="images/20180523_libsize.png")
## Writing the image to: images/20180523_libsize.png and calling dev.off().

pp(image=cf_norm_metrics$pcaplot, file="images/20180523_norm_pca.png")
## Writing the image to: images/20180523_norm_pca.png and calling dev.off().
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

pp(image=cf_fsva_metrics$pcaplot, file="images/20180523_fsva_pca.png")
## Writing the image to: images/20180523_fsva_pca.png and calling dev.off().
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

pp(image=cf_norm_metrics$corheat, file="images/20180523_norm_corheat.png")
## Writing the image to: images/20180523_norm_corheat.png and calling dev.off().

pp(image=cf_metrics$density, file="images/20180523_raw_density.png")
## Writing the image to: images/20180523_raw_density.png and calling dev.off().

pp(image=cf_metrics$boxplot, file="images/20180523_boxplot.png")
## Writing the image to: images/20180523_boxplot.png and calling dev.off().

5 Attempt some quantification comparisons?

pairwise_filt <- sm(normalize_expt(protein_expt, filter=TRUE))
pairwise_comp <- sm(all_pairwise(pairwise_filt, model_batch="fsva", force=TRUE))

pairwise_nobatch <- sm(all_pairwise(pairwise_filt, model_batch=FALSE, force=TRUE))

6 For each msstats run, do a DE table

6.1 wt_cf vs wt_whole

keepers <- list(
  "wtcf_vs_wtwhole" = c("wt_cf", "wt_whole"))
droppers <- c("undefined")
names(droppers) <- "log2fc"

## Make sure to set the rownames so it will merge into the excel file.
rownames(results[[1]]) <- results[[1]][["Protein"]]
wtcf_wtwhole_tables <- sm(combine_de_tables(
  pairwise_comp, keepers=keepers, extra_annot=results[[1]],
  excludes=droppers,
  excel=paste0("excel/wtcf_vs_wtwhole_tables-v", ver, ".xlsx")))

wtcf_nobatch_wtwhole_tables <- sm(combine_de_tables(
  pairwise_nobatch, keepers=keepers, extra_annot=results[[1]],
  excludes=droppers,
  excel=paste0("excel/wtcf_vs_wtwhole_nobatch_tables-v", ver, ".xlsx")))

comp_table <- wtcf_wtwhole_tables$data[[1]]
cor.test(comp_table$log2fc, comp_table$deseq_logfc, method="spearman")
## Warning in cor.test.default(comp_table$log2fc, comp_table$deseq_logfc, method =
## "spearman"): Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  comp_table$log2fc and comp_table$deseq_logfc
## S = 5.7e+07, p-value <2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##    rho 
## 0.4486
comp_table <- wtcf_nobatch_wtwhole_tables$data[[1]]
cor.test(comp_table$log2fc, comp_table$deseq_logfc, method="spearman")
## Warning in cor.test.default(comp_table$log2fc, comp_table$deseq_logfc, method =
## "spearman"): Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  comp_table$log2fc and comp_table$deseq_logfc
## S = 4.9e+07, p-value <2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##    rho 
## 0.5303

6.2 delta_cf vs delta_whole

keepers <- list(
  "deltacf_vs_deltawhole" = c("delta_cf", "delta_whole"))
## Make sure to set the rownames so it will merge into the excel file.
rownames(results[[2]]) <- results[[2]][["Protein"]]
deltacf_deltawhole_tables <- sm(combine_de_tables(
  pairwise_comp, keepers=keepers, extra_annot=results[[2]],
  excel=paste0("excel/deltacf_vs_deltawhole_tables-v", ver, ".xlsx")))

6.3 comp_cf vs comp_whole

keepers <- list(
  "compcf_vs_compwhole" = c("comp_cf", "comp_whole"))
## Make sure to set the rownames so it will merge into the excel file.
rownames(results[[3]]) <- results[[3]][["Protein"]]
compcf_compwhole_tables <- sm(combine_de_tables(
  pairwise_comp, keepers=keepers, extra_annot=results[[3]],
  excel=paste0("excel/compcf_vs_compwhole_tables-v", ver, ".xlsx")))

6.4 delta_cf vs wt_cf

keepers <- list(
  "deltacf_vs_wtcf" = c("delta_cf", "wt_cf"))
## Make sure to set the rownames so it will merge into the excel file.
rownames(results[[4]]) <- results[[4]][["Protein"]]
deltacf_wtcf_tables <- sm(combine_de_tables(
  pairwise_comp, keepers=keepers, extra_annot=results[[4]],
  excel=paste0("excel/deltacf_vs_wtcf_tables-v", ver, ".xlsx")))

6.5 comp_cf vs wt_cf

keepers <- list(
  "compcf_vs_wtcf" = c("comp_cf", "wt_cf"))
## Make sure to set the rownames so it will merge into the excel file.
rownames(results[[5]]) <- results[[5]][["Protein"]]
compcf_wtcf_tables <- sm(combine_de_tables(
  pairwise_comp, keepers=keepers, extra_annot=results[[5]],
  excel=paste0("excel/compcf_vs_wtcf_tables-v", ver, ".xlsx")))

6.6 delta_whole vs wt_whole

keepers <- list(
  "wtcf_vs_wtwhole" = c("wt_cf", "wt_whole"))
## Make sure to set the rownames so it will merge into the excel file.
rownames(results[[6]]) <- results[[6]][["Protein"]]
wtcf_wtwhole_tables <- sm(combine_de_tables(
  pairwise_comp, keepers=keepers, extra_annot=results[[6]],
  excel=paste0("excel/deltawhole_vs_wtwhole_tables-v", ver, ".xlsx")))

6.7 comp_whole vs wt_whole

keepers <- list(
  "compwhole_vs_wtwhole" = c("comp_whole", "wt_whole"))
## Make sure to set the rownames so it will merge into the excel file.
rownames(results[[7]]) <- results[[7]][["Protein"]]
compwhole_wtwhole_tables <- sm(combine_de_tables(
  pairwise_comp, keepers=keepers, extra_annot=results[[7]],
  excel=paste0("excel/compwhole_vs_wtwhole_tables-v", ver, ".xlsx")))

7 Index version: 20180528

8 TODO

  • 2018-04-10: Make sure my invocations of SWATH2stats/MSstats are correct.
if (!isTRUE(get0("skip_load"))) {
  message(paste0("This is hpgltools commit: ", get_git_commit()))
  this_save <- paste0(gsub(pattern="\\.Rmd", replace="", x=rmd_file), "-v", ver, ".rda.xz")
  message(paste0("Saving to ", this_save))
  tmp <- sm(saveme(filename=this_save))
  pander::pander(sessionInfo())
}
LS0tCnRpdGxlOiAiTS50dWJlcmN1bG9zaXMgMjAxODA1OiBBbmFseXppbmcgZGF0YSBmcm9tIE9wZW5Td2F0aFdvcmtGbG93L1RSSUMuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiBodG1sX2RvY3VtZW50OgogIGNvZGVfZG93bmxvYWQ6IHRydWUKICBjb2RlX2ZvbGRpbmc6IHNob3cKICBmaWdfY2FwdGlvbjogdHJ1ZQogIGZpZ19oZWlnaHQ6IDcKICBmaWdfd2lkdGg6IDcKICBoaWdobGlnaHQ6IGRlZmF1bHQKICBrZWVwX21kOiBmYWxzZQogIG1vZGU6IHNlbGZjb250YWluZWQKICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogIHRoZW1lOiByZWFkYWJsZQogIHRvYzogdHJ1ZQogIHRvY19mbG9hdDoKICAgIGNvbGxhcHNlZDogZmFsc2UKICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCi0tLQoKPHN0eWxlPgogIGJvZHkgLm1haW4tY29udGFpbmVyIHsKICAgIG1heC13aWR0aDogMTYwMHB4OwogIH0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmlmICghaXNUUlVFKGdldDAoInNraXBfbG9hZCIpKSkgewogIGxpYnJhcnkoaHBnbHRvb2xzKQogIHR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKQogIGtuaXRyOjpvcHRzX2tuaXQkc2V0KHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTkwLAogICAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKICBrbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3I9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoPTgsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZy5oZWlnaHQ9OCwKICAgICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQogIG9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCiAgZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCiAgdmVyIDwtICIyMDE4MDUyOCIKICBwcmV2aW91c19maWxlIDwtICIwMV9wcmVwcm9jZXNzaW5nX2NvbWV0X2hpZ2hyZXMuUm1kIgoKICB0bXAgPC0gdHJ5KHNtKGxvYWRtZShmaWxlbmFtZT1wYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikpKSkKICBwcmV2aW91c19maWxlIDwtICIwMV9hbm5vdGF0aW9uLlJtZCIKICB0bXAgPC0gdHJ5KHNtKGxvYWRtZShmaWxlbmFtZT1wYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikpKSkKCiAgcm1kX2ZpbGUgPC0gcGFzdGUwKCIwMl9zd2F0aDJzdGF0c18iLCB2ZXIsICIuUm1kIikKICB2ZXIgPC0gIjIwMTgwNTI4IiAgIyMgSSBuZWVkIHRvIHJlcnVuIHRoZSBhbm5vdGF0aW9uIGZpbGUgd2l0aCB0aGUgbmV3IHZlcnNpb24KfQpgYGAKCiMgVE9ETwoKKiBSZW1vdmUgTVNzdGF0cyBsb2dnaW5nLiAtLSBkb25lCiogTWFrZSBleHBsaWNpdCBzcGVhcm1hbiBjb3JyZWxhdGlvbnMgYmV0d2VlbiBtZXRob2RzLiAtLSBkb25lCiAgICAqIERvIGJvdGggZm9yIGFsbCBkYXRhIGFuZCBmb3IgdGhlIHRvcC01MC9ib3R0b20tNTAgLS0gZG9uZSwgYnV0IHdlaXJkLgoqIE1ha2UgMTAwJSBjZXJ0YWluIHRoYXQgdGhlIHNhbXBsZXMgYXJlIGFubm90YXRlZCBjb3JyZWN0bHkuIC0tIGRvbmUuCiogTGltbWEvTVNzdGF0cy9FZGdlUiB2ZW5uIGRpc2FncmFtIGZvciBhbGwgdXAgaW4gQ0YKICAgKiBSZXBlYXQgaW4gYWxsIGRvd24gQ0YKICAgKiBSZXBlYXQgd2l0aCBhIGN1dG9mZiwgdG9wLTUwCiogSW5kaXZpZHVhbCBwbG90cyBmb3IgUC9QRSBwcm90ZWlucy4KCkFuYWx5emluZyBkYXRhIGZyb20gb3Blbk1TIGFuZCBmcmllbmRzLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkluIHByZXByb2Nlc3NpbmdfY29tZXRfaGlnaHJlcy5SbWQsIEkgdXNlZCB0aGUgb3Blbk1TIHR1dG9yaWFscyBhbmQgc3VwcGxlbWVudGFsCm1hdGVyaWFscyBmcm9tIGEgY291cGxlIHBhcGVycyB0byBob3BlZnVsbHkgY29ycmVjdGx5IHBlcmZvcm0gdGhlIHZhcmlvdXMKcHJlcHJvY2Vzc2luZyB0YXNrcyByZXF1aXJlZCB0byBleHRyYWN0IGludGVuc2l0eSBkYXRhIGZyb20gRElBL1NXQVRICnRyYW5zaXRpb25zLgoKVGhlIGZpbmFsIHN0ZXBzIG9mIHRoYXQgcHJvY2VzcyBjb21iaW5lZCB0aGUgdHJhbnNpdGlvbiBpbnRlbnNpdGllcyBmcm9tIGV2ZXJ5CnNhbXBsZSBpbnRvIGEgbWV0YWRhdGEgZnJpbGUgKHJlc3VsdHMvdHJpYy9IQ0RfbWV0YS50c3YpLCBhbiBpbnRlbnNpdHkgbWF0cml4CihyZXN1bHRzL3RyaWMvSENEX291dG1hdHJpeC50c3YpLCBhbmQgYSBmZWF0dXJlIGFsaWduZWQgb3V0cHV0IG1hdHJpeAoocmVzdWx0cy90cmljL2FsaWduZWRfY29tZXRfSENELnRzdikuCgpNeSByZWFkaW5nIG9mIHRoZSBTV0FUSDJzdGF0cyBhbmQgTVNzdGF0cyBzb3VyY2UgY29kZSBzdWdnZXN0cyB0byBtZSB0aGF0IHRoZQpsb2cyKGludGVuc2l0aWVzKSBvZiB0aGUgZmVhdHVyZSBhbGlnbmVkIGRhdGEgYXJlIG91ciBmaW5hbCBwcm94eSBmb3IgcHJvdGVpbgphYnVuZGFuY2UuICBBdCBmaXJzdCBnbGFuY2UsIHRoaXMgc3VnZ2VzdHMgdG8gbWUgdGhhdCB0aGVzZSBkYXRhIG1pZ2h0IGZvbGxvdyBhCmRpc3RyaWJ1dGlvbiBzaW1pbGFyIHRvIFJOQVNlcSBkYXRhIChuZWdhdGl2ZSBiaW5vbWlhbCwgYnV0IHBlcmhhcHMgd2l0aCBhCmJpZ2dlciB0YWlsPykuICBJbiBhZGRpdGlvbiwgYnkgdGhlIHRpbWUgd2UgdXNlIHRyaWMgb24gdGhlIGRhdGEsIHdlIGhhdmUgYQpjb3VudCBtYXRyaXggYW5kIHNhbXBsZSBhbm5vdGF0aW9uIGRhdGEgZnJhbWVzIHdoaWNoIGxvb2sgcmVtYXJrYWJseSBzaW1pbGFyIHRvCnRob3NlIHVzZWQgaW4gYSBSTkFTZXEgZXhwcmVzc2lvbnNldC4gIEluZGVlZCwgYnkgdGhlIGVuZCBvZiB0aGUgTVNzdGF0cwpwcm9jZXNzaW5nLCBpdCBjcmVhdGVzIGEgTVNuU2V0IGNsYXNzIG9mIGl0cyBvd24gd2hpY2ggdXNlcyBmRGF0YS9leHBycy9wRGF0YS4KCkZvciB0aGUgY3VyaW91cywgbXkgcmVhc29uaW5nIGZvciBzYXlpbmcgdGhhdCB0aGUgbG9nIGludGVuc2l0aWVzIGFyZSBvdXIgcHJveHkKZm9yIGFidW5kYW5jZSBjb21lcyBmcm9tIE1Tc3RhdHMvUi9EYXRhUHJvY2Vzcy5SIGluIGEgY2xhdXNlIHdoaWNoIGxvb2tzIGxpa2U6CgpgYGB7ciBzbmlwcGV0LCBldmFsPUZBTFNFfQppZiAobG9nVHJhbnMgPT0gMikgewogIHdvcmtbWyJBQlVOREFOQ0UiXV0gPC0gbG9nMih3b3JrW1siQUJVTkRBTkNFIl1dKQp9IGVsc2UgaWYgKGxvZ1RyYW5zID09IDEwKSB7CiAgd29ya1tbIkFCVU5EQU5DRSJdXSA8LSBsb2cxMCh3b3JrW1siQUJVTkRBTkNFIl1dKQp9IGVsc2UgewogICMjIEFib3ZlIHRoZXJlIHdhcyBhIGNoZWNrIGZvciBvbmx5IGxvZyAyIGFuZCAxMCwgYnV0IHdlIGNhbiBkbyBlIGlmIHdlIHdhbnQuCiAgIyMgSSBtaWdodCBnbyBiYWNrIHVwIHRoZXJlIGFuZCByZW1vdmUgdGhhdCBjaGVjay4gTG9uZyBsaXZlIGUhIDIuNzE4MjgyIHJ1bGVzIQogIHdvcmtbWyJBQlVOREFOQ0UiXV0gPC0gbG9nKHdvcmtbWyJBQlVOREFOQ0UiXV0pIC8gbG9nKGxvZ1RyYW5zKQp9CmBgYAoKKE5vdGU6IEkgYWRkZWQgdGhlIG5hdHVyYWwgbG9nIHRvIHRoZSBzZXQgb2YgY29uZGl0aW9ucywgYnV0IG90aGVyd2lzZSB0aGUgbG9naWMKaXMgdW5jaGFuZ2VkLikKCldpdGggdGhhdCBpbiBtaW5kLCBJIHdhbnQgdG8gdXNlIHNvbWUgdG9vbHMgd2l0aCB3aGljaCBJIGFtIGZhbWlsaWFyIGluIG9yZGVyIHRvCnRyeSB0byB1bmRlcnN0YW5kIHRoZXNlIGRhdGEuICBUaGVyZWZvcmUgSSB3aWxsIGZpcnN0IGF0dGVtcHQgdG8gY29lcmNlIG15IHRyaWMKYWxpZ25lZCBkYXRhIGFuZCBhbm5vdGF0aW9ucyBpbnRvIGEgJ25vcm1hbCcgZXhwcmVzc2lvbnNldC4gIFRoZW4gSSB3YW50IHRvIGRvCnNvbWUgZGlhZ25vc3RpYyBwbG90cyB3aGljaCwgaWYgSSBhbSB3cm9uZyBhbmQgdGhlc2UgZGlzdHJpYnV0aW9ucyBhcmUgbm90IGFzCmV4cGVjdGVkLCB3aWxsIGJlIGNvbmNlcHR1YWxseSBpbmNvcnJlY3QgKEkgZG9uJ3QgeWV0IHRoaW5rIEkgYW0gd3JvbmcpLgoKIyMgU2FtcGxlIGFubm90YXRpb24gdmlhIFNXQVRIMnN0YXRzCgpJIGFtIHVzaW5nIHRoZSBTV0FUSDJzdGF0cyB2aWduZXR0ZSBhcyBteSBwcmltYXJ5IHNvdXJjZSBvZiBpbmZvcm1hdGlvbi4gIFRodXMgSQpzZWUgdGhhdCBpdCB1c2VzIHRoZQpPcGVuU1dBVEhfU00zX0dvbGRTdGFuZGFyZEF1dG9tYXRlZFJlc3VsdHNfaHVtYW5fcGVha2dyb3Vwcy50eHQgd2hpY2ggaGFzIGEKZm9ybWF0IG5lYXJseSBpZGVudGljYWwgdG8gbXkgdHJpYyBvdXRwdXQgbWF0cml4LiAgVGh1cyBmb3IgdGhlIG1vbWVudCBJIHdpbGwKYXNzdW1lIHRoYXQgdGhlIHByb3BlciBpbnB1dCBmb3IgU1dBVEgyc3RhdHMgaXMgJ3Jlc3VsdHMvdHJpYy9jb21ldF9IQ0QudHN2JyBhbmQKbm90IHRoZSBtZXRhZGF0YSBub3Igb3V0cHV0IG1hdHJpeC4KCkkga2VlcCBhIHNhbXBsZSBzaGVldCBvZiBhbGwgdGhlIERJQSBzYW1wbGVzIHVzZWQgaW4gdGhpcyBhbmFseXNpcyBpbgonc2FtcGxlX3NoZWV0cy9kaWFfc2FtcGxlcy54bHN4JyAgSXQgc2hvdWxkIGNvbnRhaW4gYWxsIHRoZSBvdGhlciByZXF1aXJlZCBkYXRhCndpdGggb25lIGltcG9ydGFudCBjYXZlYXQsIEkgcmVtb3ZlZCAxIHNhbXBsZSBieSAnY29tbWVudGluZycgaXQgKGUuZy4gcHJlZml4aW5nCml0IHdpdGggJyMjJyAtLSB3aGljaCBpcyBhbiBhZG1pdHRlZGx5IGR1bWIgdGhpbmcgdG8gZG8gaW4gYW4gZXhjZWwgZmlsZS4KCk9uZSBsYXN0IGNhdmVhdDogSSBoYWNrZWQgdGhlIFNXQVRIMnN0YXRzIHNhbXBsZV9hbm5vdGF0aW9uKCkgZnVuY3Rpb24gdG8gYWRkIGEKY291cGxlIGNvbHVtbnMgaW4gYW4gYXR0ZW1wdCB0byBtYWtlIGl0IGEgbGl0dGxlIG1vcmUgcm9idXN0IHdoZW4gZmFjZWQgd2l0aApzYW1wbGUgc2hlZXRzIHdpdGggZGlmZmVyZW50bHkgbmFtZWQgY29sdW1ucy4KCkluIGFkZGl0aW9uLCBTV0FUSDJzdGF0cyBwcm92aWRlcyBzb21lIG5pY2UgZmlsdGVyaW5nIGFuZCBjb21iaW5hdGlvbgpmdW5jdGlvbnMgd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgd2hlbiBnZW5lcmF0aW5nIHZhcmlvdXMgZXhwcmVzc2lvbnNldCBkYXRhCnN0cnVjdHVyZXMgbGF0ZXIuCgpgYGB7ciBzd2F0aDJzdGF0c19zYW1wbGVfYW5ub3RhdGlvbnN9CnRyaWNfZGF0YSA8LSByZWFkLmNzdigicmVzdWx0cy90cmljXzIwMTgwNTMwL2NvbWV0X0hDRC50c3YiLCBzZXA9Ilx0IikKCnNhbXBsZV9hbm5vdCA8LSBvcGVueGxzeDo6cmVhZC54bHN4KCJzYW1wbGVfc2hlZXRzL010Yl9kaWFfc2FtcGxlcy54bHN4IikKcm93bmFtZXMoc2FtcGxlX2Fubm90KSA8LSBtYWtlLm5hbWVzKHNhbXBsZV9hbm5vdFtbInNhbXBsZWlkIl1dLCB1bmlxdWU9VFJVRSkKIyMgRHJvcCBzYW1wbGVzIHN0YXJ0aW5nIHdpdGggY29tbWVudHMKa2VlcF9pZHggPC0gISBncmVwbChwYXR0ZXJuPSIjIyIsIHg9c2FtcGxlX2Fubm90W1sic2FtcGxlaWQiXV0pCnNhbXBsZV9hbm5vdCA8LSBzYW1wbGVfYW5ub3Rba2VlcF9pZHgsIF0KZXhwdF9pZHggPC0gc2FtcGxlX2Fubm90W1siZXhwdF9pZCJdXSA9PSAibWF5MjAxOCIgfCBzYW1wbGVfYW5ub3RbWyJleHB0X2lkIl1dID09ICJtYXIyMDE4IgpleHB0X2lkeFtpcy5uYShzYW1wbGVfYW5ub3RbWyJleHB0X2lkIl1dKV0gPC0gRkFMU0UKc2FtcGxlX2Fubm90IDwtIHNhbXBsZV9hbm5vdFtleHB0X2lkeCwgXQptel9pZHggPC0gc2FtcGxlX2Fubm90W1sid2luZG93c2l6ZSJdXSA9PSAiOCIKc2FtcGxlX2Fubm90IDwtIHNhbXBsZV9hbm5vdFttel9pZHgsIF0KIyMgU2V0IHRoZSBtelhNTCBjb2x1bW4gdG8gbWF0Y2ggdGhlIGZpbGVuYW1lIGNvbHVtbiBpbiB0aGUgZGF0YS4KbG9hZGVkIDwtIHNtKGRldnRvb2xzOjpsb2FkX2FsbCgifi9zY3JhdGNoL2dpdC9TV0FUSDJzdGF0cyIpKQojIyBzMnMsIG15IHdpdHR5IHdheSBvZiBzaG9ydGVuaW5nIFNXQVRIMnN0YXRzLi4uCnMyc19leHAgPC0gc2FtcGxlX2Fubm90YXRpb24oZGF0YT10cmljX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX2Fubm90YXRpb249c2FtcGxlX2Fubm90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxwZXB0aWRlbmFtZV9jb2x1bW49ImZ1bGx1bmltb2RwZXB0aWRlbmFtZSIpCmBgYAoKTm93IEkgaGF2ZSBhIGNvdXBsZSBkYXRhIHN0cnVjdHVyZXMgd2hpY2ggc2hvdWxkIHByb3ZlIHVzZWZ1bCBmb3IgdGhlIG1ldHJpY3MKcHJvdmlkZWQgYnkgU1dBVEgyc3RhdHMsIE1Tc3RhdHMsIGFuZCBteSBvd24gaHBnbHRvb2xzLgoKIyBTV0FUSDJzdGF0cyBjb250aW51ZWQKCkxldHMgcmV0dXJuIHRvIHNvbWUgb2YgdGhlIG1ldHJpY3MgcHJvdmlkZWQgYnkgc3dhdGgyc3RhdHMuCgpgYGB7ciBzd2F0aDJzdGF0c19wcm9jZXNzaW5nfQojIyBHZXQgY29ycmVsYXRpb25zIG9uIGEgc2FtcGxlIGJ5IHNhbXBsZSBiYXNpcwpwcChmaWxlPSJpbWFnZXMvMjAxODA1MjNfc3dhdGgyc3RhdHNfc2FtcGxlX2Nvci5wbmciKQpzYW1wbGVfY29yIDwtIHBsb3RfY29ycmVsYXRpb25fYmV0d2Vlbl9zYW1wbGVzKHMyc19leHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuLmFnZ3JlZ2F0ZT1zdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnZhbHVlcz0iaW50ZW5zaXR5IikKZGV2Lm9mZigpCnNhbXBsZV9jb25kX3JlcF9jb3IgPC0gcGxvdF9jb3JyZWxhdGlvbl9iZXR3ZWVuX3NhbXBsZXMoczJzX2V4cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uPXRyYW5zaXRpb25fZ3JvdXBfaWQgfgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uICsgYmlvcmVwbGljYXRlICsgcnVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bi5hZ2dyZWdhdGU9c3VtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi52YWx1ZXM9ImludGVuc2l0eSIpCiMjIEkgYW0gYSBsaXR0bGUgY29uY2VybmVkIHRoYXQgdGhlc2UgdmFsdWVzIGRvIG5vdCBzZWVtIHRvIGNoYW5nZSB3aGVuIEkgdG9vawojIyBmaWx0ZXJlZC9ub3JtYWxpemVkIGRhdGEuICBTbyBJIGFtIHJlcnVubmluZyB0aGVtIG1hbnVhbGx5IGZvciBhIG1vbWVudCAtLQojIyBwZXJoYXBzIEkgbWVzc2VkIHNvbWV0aGluZyB1cCB3aGVuIEkgcmV3cm90ZSBwb3J0aW9ucyBvZiB0aGUKIyMgc2FtcGxlX2Fubm90YXRpb24oKSBmdW5jdGlvbiBpbiBTV0FUSDJzdGF0cy4KCiMjIGFoaCBJIHRoaW5rIEkgc2VlIHRoZSBwcm9ibGVtLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGZ1bi5hZ2dyZWdhdGUgaXMgTlVMTCwKIyMgd2hpY2ggY2F1c2VzIGRjYXN0IHRvIGRlZmF1bHQgdG8gbGVuZ3RoLiAgSSB0aGluayB0aGlzIGlzIG5vdCBsaWtlbHkgdG8gYmUKIyMgdmFsaWQgZm9yIHRoaXMgZGF0YS4gIEkgYW0gbm90IGNlcnRhaW4sIGhvd2V2ZXIsIHdoYXQgaXMgdGhlIGFwcHJvcHJpYXRlCiMjIGZ1bmN0aW9uLiAgSWYgSSBoYWQgdG8gZ3Vlc3MsIEkgd291bGQgZ28gd2l0aCBzdW0oKT8KCmFzc2Vzc19kZWNveV9yYXRlKHMyc19leHApCiMjIFRoaXMgc2VlbXMgYSBiaXQgaGlnaCB0byBtZSwgeWVzbm8/CmZkcl9vdmVyYWxsIDwtIGFzc2Vzc19mZHJfb3ZlcmFsbChzMnNfZXhwLCBvdXRwdXQ9IlJjb25zb2xlIiwgcGxvdD1UUlVFKQoKYnlydW5fZmRyIDwtIGFzc2Vzc19mZHJfYnlydW4oczJzX2V4cCwgRkZUPTAuNywgcGxvdD1UUlVFLCBvdXRwdXQ9IlJjb25zb2xlIikKY2hvc2VuX21zY29yZSA8LSBtc2NvcmU0YXNzYXlmZHIoczJzX2V4cCwgRkZUPTAuNywgZmRyX3RhcmdldD0wLjAyKQpwcm90X3Njb3JlIDwtIG1zY29yZTRwcm90ZmRyKHMyc19leHAsIEZGVD0wLjcsIGZkcl90YXJnZXQ9MC4wMikKCm1zY29yZV9maWx0ZXJlZCA8LSBmaWx0ZXJfbXNjb3JlKHMyc19leHAsIGNob3Nlbl9tc2NvcmUpCmRhdGFfZmlsdGVyZWRfbXNjb3JlIDwtIGZpbHRlcl9tc2NvcmVfZnJlcW9icyhzMnNfZXhwLCAwLjAxLCAwLjgsIHJtLmRlY295PUZBTFNFKQpkYXRhX2ZpbHRlcmVkX2ZkciA8LSBmaWx0ZXJfbXNjb3JlX2Zkcihtc2NvcmVfZmlsdGVyZWQsIEZGVD0wLjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGxfcHJvdGVpbl9mZHJfdGFyZ2V0PXByb3Rfc2NvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyX292ZXJhbGxfcGVwdGlkZV9mZHJfbGltaXQ9MC4wNSkKb25seV9wcm90ZW90eXBpYyA8LSBmaWx0ZXJfcHJvdGVvdHlwaWNfcGVwdGlkZXMoZGF0YV9maWx0ZXJlZF9mZHIpCmFsbF9maWx0ZXJlZCA8LSBmaWx0ZXJfYWxsX3BlcHRpZGVzKG9ubHlfcHJvdGVvdHlwaWMpCm9ubHlfc3Ryb25nIDwtIGZpbHRlcl9vbl9tYXhfcGVwdGlkZXMoZGF0YT1hbGxfZmlsdGVyZWQsIG5fcGVwdGlkZXM9MTApCm9ubHlfbWluaW11bSA8LSBmaWx0ZXJfb25fbWluX3BlcHRpZGVzKGRhdGE9b25seV9zdHJvbmcsIG5fcGVwdGlkZXM9MykKCiMjIEkgdGhpbmsgdGhlc2UgbWF0cml4ZXMgYXJlIHByb2JhYmx5IHNtYXJ0ZXIgdG8gdXNlIHRoYW4gdGhlIHJhdyBvdXRtYXRyaXggZnJvbSB0cmljLgojIyBCdXQgSSBhbSBub3QgYSBmYW4gb2YgcmVyd3JpdGluZyB0aGUgc2FtcGxlIGNvbHVtbiBuYW1lcy4KcHJvdGVpbl9tYXRyaXhfYWxsIDwtIHdyaXRlX21hdHJpeF9wcm90ZWlucygKICBzMnNfZXhwLCB3cml0ZS5jc3Y9VFJVRSwKICBmaWxlbmFtZT1wYXN0ZTAoInJlc3VsdHMvc3dhdGgyc3RhdHNfIiwgdmVyLCAiL3Byb3RlaW5fYWxsLmNzdiIpKQpkaW0ocHJvdGVpbl9tYXRyaXhfYWxsKQpwcm90ZWluX21hdHJpeF9tc2NvcmUgPC0gd3JpdGVfbWF0cml4X3Byb3RlaW5zKAogIG1zY29yZV9maWx0ZXJlZCwgd3JpdGUuY3N2PVRSVUUsCiAgZmlsZW5hbWU9cGFzdGUwKCJyZXN1bHRzL3N3YXRoMnN0YXRzXyIsIHZlciwgIi9wcm90ZWluX21hdHJpeF9tc2NvcmUuY3N2IikpCmRpbShwcm90ZWluX21hdHJpeF9tc2NvcmUpCnBlcHRpZGVfbWF0cml4X21zY29yZSA8LSB3cml0ZV9tYXRyaXhfcGVwdGlkZXMoCiAgbXNjb3JlX2ZpbHRlcmVkLCB3cml0ZS5jc3Y9VFJVRSwKICBmaWxlbmFtZT1wYXN0ZTAoInJlc3VsdHMvc3dhdGgyc3RhdHNfIiwgdmVyLCAiL3BlcHRpZGVfbWF0cml4X21zY29yZS5jc3YiKSkKZGltKHBlcHRpZGVfbWF0cml4X21zY29yZSkKcHJvdGVpbl9tYXRyaXhfbWluaW11bSA8LSB3cml0ZV9tYXRyaXhfcHJvdGVpbnMoCiAgb25seV9taW5pbXVtLCB3cml0ZS5jc3Y9VFJVRSwKICBmaWxlbmFtZT1wYXN0ZTAoInJlc3VsdHMvc3dhdGgyc3RhdHNfIiwgdmVyLCAiL3Byb3RlaW5fbWF0cml4X21pbmltdW0uY3N2IikpCmRpbShwcm90ZWluX21hdHJpeF9taW5pbXVtKQpwZXB0aWRlX21hdHJpeF9taW5pbXVtIDwtIHdyaXRlX21hdHJpeF9wZXB0aWRlcygKICBvbmx5X21pbmltdW0sIHdyaXRlLmNzdj1UUlVFLAogIGZpbGVuYW1lPXBhc3RlMCgicmVzdWx0cy9zd2F0aDJzdGF0c18iLCB2ZXIsICIvcGVwdGlkZV9tYXRyaXhfbWluaW11bS5jc3YiKSkKZGltKHBlcHRpZGVfbWF0cml4X21pbmltdW0pCgpydF9jb3IgPC0gcGxvdF9jb3JyZWxhdGlvbl9iZXR3ZWVuX3NhbXBsZXMoCiAgb25seV9taW5pbXVtLCBjb2x1bW4udmFsdWVzPSJpbnRlbnNpdHkiLCBmdW4uYWdncmVnYXRlPXN1bSkKIyMgSSBoYXZlIG5vIGVmZmluZyBjbHVlIHdoYXQgdGhpcyBwbG90IG1lYW5zLgp2YXJpYXRpb24gPC0gcGxvdF92YXJpYXRpb24ob25seV9taW5pbXVtLCBmdW4uYWdncmVnYXRlPXN1bSkKCiMjIFNvbWV0aGluZyBpbiBTV0FUSDJzdGF0czo6ZGlzYWdncmVnYXRlIHdhcyB3cml0dGVuIHBvb3JseSBhbmQgaXMgbG9va2luZyBmb3IKIyMgYSB2YXJpYWJsZSBuYW1lZCAnY29scycKY29scyA8LSBjb2xuYW1lcyhvbmx5X21pbmltdW0pCmRpc2FnZ3JlZ2F0ZWQgPC0gZGlzYWdncmVnYXRlKG9ubHlfbWluaW11bSwgYWxsLmNvbHVtbnM9VFJVRSkKbXNzdGF0c19pbnB1dCA8LSBjb252ZXJ0NE1Tc3RhdHMoZGlzYWdncmVnYXRlZCkKCiMjYWxmcV9pbnB1dCA8LSBzbShjb252ZXJ0NGFMRlEoZGlzYWdncmVnYXRlZCkpCiMjbWFwZGlhX2lucHV0IDwtIHNtKGNvbnZlcnQ0bWFwRElBKGRpc2FnZ3JlZ2F0ZWQsIFJUPVRSVUUpKQpgYGAKCiMjIFNvbWUgbmV3IHBsb3RzCgpJbiByZXNwb25zZSB0byBzb21lIGludGVyZXN0aW5nIHF1ZXJpZXMgZnJvbSBZYW4sIEkgbWFkZSBhIGZldyBsaXR0bGUgZnVuY3Rpb25zCndoaWNoIHF1ZXJ5IGFuZCBwbG90IGRhdGEgZnJvbSB0aGUgc2NvcmVkIGRhdGEgcHJvdmlkZWQgYnkgb3BlbnN3YXRoL3B5cHJvcGhldC4KTGV0IHVzIGxvb2sgYXQgdGhlaXIgcmVzdWx0cyBoZXJlLgoKYGBge3IgcHlwcm9waGV0X3Bsb3RzfQpweXByb3BoZXRfZnVuIDwtIGV4dHJhY3RfcHlwcm9waGV0X2RhdGEobWV0YWRhdGE9InNhbXBsZV9zaGVldHMvTXRiX2RpYV9zYW1wbGVzLnhsc3giKQoKbWFzc19wbG90IDwtIHNtKHBsb3RfcHlwcm9waGV0X2JveHBsb3QocHlwcm9waGV0X2Z1biwgY29sdW1uPSJtYXNzIikpCm1hc3NfcGxvdAoKZGVsdGFydF9wbG90X2FsbCA8LSBzbShwbG90X3B5cHJvcGhldF9ib3hwbG90KHB5cHJvcGhldF9mdW4sIGNvbHVtbj0iZGVsdGFfcnQiKSkKZGVsdGFydF9wbG90X2FsbAoKZGVsdGFydF9wbG90X3JlYWwgPC0gc20ocGxvdF9weXByb3BoZXRfYm94cGxvdChweXByb3BoZXRfZnVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbj0iZGVsdGFfcnQiLCBrZWVwX2RlY295cz1GQUxTRSkpCmRlbHRhcnRfcGxvdF9yZWFsCgpkZWx0YXJ0X3Bsb3RfZGVjb3lzIDwtIHNtKHBsb3RfcHlwcm9waGV0X2JveHBsb3QocHlwcm9waGV0X2Z1biwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbj0iZGVsdGFfcnQiLCBrZWVwX3JlYWw9RkFMU0UpKQpkZWx0YXJ0X3Bsb3RfZGVjb3lzCgp0ZXN0aW5nIDwtIHNtKHBsb3RfcHlwcm9waGV0X2RhdGEocHlwcm9waGV0X2Z1bikpCnRlc3RpbmckcGxvdApgYGAKCiMjIE1Tc3RhdHMKCm1zc3RhdHMub3JnIHNlZW1zIHRvIHByb3ZpZGUgYSBjb21wbGV0ZSBzb2x1dGlvbiBmb3IgcGVyZm9ybWluZyByZWFzb25hYmxlIG1ldHJpY3Mgb2YgdGhpcyBkYXRhLgoKSSBhbSBjdXJyZW50bHkgcmVhZGluZzogaHR0cDovL21zc3RhdHMub3JnL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE3LzAxL01Tc3RhdHNfdjMuNy4zX21hbnVhbC5wZGYKCkkgbWFkZSBzb21lIG1vZGVyYXRlbHkgaW50cnVzaXZlIGNoYW5nZXMgdG8gTVNzdGF0cyB0byBtYWtlIGl0IGNsZWFyZXIsIGFzIHdlbGwuCgpgYGB7ciBtc3N0YXRzX3F1YW50fQpkZXZ0b29sczo6bG9hZF9hbGwoIn4vc2NyYXRjaC9naXQvTVNzdGF0cyIpCm1zc3RhdHNfcXVhbnQgPC0gZGF0YVByb2Nlc3MobXNzdGF0c19pbnB1dCkKbXNzdGF0c19wbG90cyA8LSBzbShkYXRhUHJvY2Vzc1Bsb3RzKG1zc3RhdHNfcXVhbnQsIHR5cGU9IlFDUExPVCIpKQoKbXlfbGV2ZWxzIDwtIGxldmVscyhhcy5mYWN0b3IobXNzdGF0c19pbnB1dCRjb25kaXRpb24pKQpteV9sZXZlbHMKY29tcGFyaXNvbnMgPC0gZ2hldHRvX2NvbnRyYXN0X21hdHJpeCgKICBudW1lcmF0b3JzPWMoInd0X2NmIiwgImRlbHRhX2NmIiwgImNvbXBfY2YiLAogICAgICAgICAgICAgICAiZGVsdGFfY2YiLCAiY29tcF9jZiIsICJkZWx0YV93aG9sZSIsCiAgICAgICAgICAgICAgICJjb21wX3dob2xlIiksCiAgZGVub21pbmF0b3JzPWMoInd0X3dob2xlIiwgImRlbHRhX3dob2xlIiwgImNvbXBfd2hvbGUiLAogICAgICAgICAgICAgICAgICJ3dF9jZiIsICJ3dF9jZiIsICJ3dF93aG9sZSIsCiAgICAgICAgICAgICAgICAgInd0X3dob2xlIikpCnJlc3VsdHMgPC0gbGlzdCgpCmZvciAoYyBpbiAxOmxlbmd0aChyb3duYW1lcyhjb21wYXJpc29ucykpKSB7CiAgbmFtZSA8LSByb3duYW1lcyhjb21wYXJpc29ucylbY10KICBtZXNzYWdlKCJTdGFydGluZyAiLCBuYW1lKQogIGNvbXAgPC0gY29tcGFyaXNvbnNbYywgXQogIGNvbXBhcmlzb24gPC0gdChhcy5tYXRyaXgoY29tcCkpCiAgcm93bmFtZXMoY29tcGFyaXNvbikgPC0gbmFtZQogIHJlc3VsdHNbbmFtZV0gPC0gc20oTVNzdGF0czo6Z3JvdXBDb21wYXJpc29uKGNvbnRyYXN0Lm1hdHJpeD1jb21wYXJpc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9bXNzdGF0c19xdWFudCkpCn0KYGBgCgojIyMgUC9QRSBwcm90ZWluIFFDIHBsb3RzIGZvciBZYW4KCllhbiBhc2tlZCBmb3IgdGhlIHAvcGUgcHJvdGVpbiBxYyBwbG90cy4gb2suICBJIGNoYW5nZWQgdGhlIGRhdGFQcm9jZXNzUGxvdHMgdG8KcmV0dXJuIHNvbWV0aGluZyB1c2VmdWwsIHNvIHRoYXQgc2hvdWxkIGJlIHBvc3NpYmxlIG5vdy4KCmBgYHtyIHBlLCBldmFsPUZBTFNFfQpwZV9nZW5lcyA8LSByZWFkLnRhYmxlKCJyZWZlcmVuY2UvYW5ub3RhdGVkX3BlX2dlbmVzLnR4dCIpW1sxXV0KCiMjIFVuZm9ydHVuYXRlbHksIHRoZSBuYW1lcyBkaWQgbm90IGdldCBzZXQgaW4gbXkgY2hhbmdlZCB2ZXJzaW9uIG9mIGRhdGFQcm9jZXNzUGxvdHMuLi4KcGxvdGxzdCA8LSBtc3N0YXRzX3Bsb3RzJFFDUExPVAphdmFpbGFibGVfcGxvdHMgPC0gZ3N1YihwYXR0ZXJuPSJeMS8iLCByZXBsYWNlbWVudD0iIiwgeD1sZXZlbHMobXNzdGF0c19xdWFudCRQcm9jZXNzZWREYXRhJFBST1RFSU4pKQpuYW1lcyhwbG90bHN0KSA8LSBhdmFpbGFibGVfcGxvdHMKCnBlX2luX2F2YWlsX2lkeCA8LSBwZV9nZW5lcyAlaW4lIGF2YWlsYWJsZV9wbG90cwpwZV9pbl9hdmFpbCA8LSBwZV9nZW5lc1twZV9pbl9hdmFpbF9pZHhdCnBlX3Bsb3RzIDwtIHBsb3Rsc3RbcGVfaW5fYXZhaWxdCnBkZihmaWxlPSJwZV9xY19wbG90cy5wZGYiKQpmb3IgKHAgaW4gMTpsZW5ndGgocGVfcGxvdHMpKSB7CiAgcGxvdChwZV9wbG90c1tbcF1dKQp9CmRldi5vZmYoKQpgYGAKCiMgQ3JlYXRlIGhwZ2x0b29scyBleHByZXNzaW9uc2V0CgpTaW5jZSBJIGFtIG5vdCBjZXJ0YWluIEkgdW5kZXJzdGFuZCB0aGVzZSBkYXRhLCBJIHdpbGwgdGFrZSB0aGUgaW50ZW5zaXRpZXMgZnJvbQpTV0FUSDJzdGF0cywgbWV0YWRhdGEsIGFuZCBhbm5vdGF0aW9uIGRhdGE7ICBhdHRlbXB0IHRvIGNyZWF0ZSBhICdub3JtYWwnCmV4cHJlc3Npb25zZXQ7IHBva2UgYXQgaXQgdG8gc2VlIHdoYXQgSSBjYW4gbGVhcm4uCgojIyBNYXNzYWdpbmcgdGhlIG1ldGFkYXRhCgpJIHdhbnQgdG8gdXNlIHRoZSBzYW1lIG1ldGFkYXRhIGFzIHdlcmUgdXNlZCBmb3IgTVNzdGF0cy4gIEl0IGhhcyBhIGZldwppbXBvcnRhbnQgZGlmZmVyZW5jZXMgZnJvbSB0aGUgcmVxdWlyZW1lbnRzIG9mIGhwZ2x0b29sczogcHJldHR5IG11Y2ggb25seSB0aGF0CkkgZG8gbm90IGFsbG93IHJvd25hbWVzL3NhbXBsZUlEcyB0byBzdGFydCB3aXRoIGEgbnVtYmVyLgoKYGBge3IgcHJvdGVpbl9wZXB0aWRlX21hdHJpY2VzfQptZXRhZGF0YSA8LSBzYW1wbGVfYW5ub3QKbWV0YWRhdGFbWyJzYW1wbGVpZCJdXSA8LSBwYXN0ZTAoInMiLCBtZXRhZGF0YVtbInNhbXBsZWlkIl1dKQpyb3duYW1lcyhtZXRhZGF0YSkgPC0gbWV0YWRhdGFbWyJzYW1wbGVpZCJdXQpgYGAKCiMjIE1hc3NhZ2luZyB0aGUgZ2VuZSBhbm5vdGF0aW9uIGRhdGEgYW5kIGFkZGluZyB0aGUgbXNzdGF0cyBkYXRhLgoKSSBoYXZlIG15IG93biBhbm5vdGF0aW9uIGRhdGEgZnJvbSB0aGUgZ2ZmIGZpbGUvbWljcm9iZXNvbmxpbmUvd2hhdGV2ZXIsIEkgY2FuCmFkZCB0aGUgTVNzdGF0cyByZXN1bHQgdG8gaXQgc28gdGhhdCBsYXRlciBJIGNhbiBwcmludCB0aGVtIGFsbCB0b2dldGhlci4KCiMjIE1hc3NhZ2luZyB0aGUgaW50ZW5zaXR5IG1hdHJpeAoKSSBkbyBub3Qgd2FudCB0aGUgXDEgYmVmb3JlIHRoZSBwcm90ZWluIG5hbWVzLCBJIGFscmVhZHkgbWVyZ2VkIHRoZW0gaW50byBvbmUKZW50cnkgcGVyIGdlbmUgdmlzIFNXQVRIMnN0YXRzLgoKYGBge3IgcHJvdGVpbl9tYXRyaXh9CnByb3RfbXRyeCA8LSByZWFkLmNzdihwYXN0ZTAoInJlc3VsdHMvc3dhdGgyc3RhdHNfIiwgdmVyLCAiL3Byb3RlaW5fbWF0cml4X21pbmltdW0uY3N2IikpCnJvd25hbWVzKHByb3RfbXRyeCkgPC0gZ3N1YihwYXR0ZXJuPSJeMVxcLyIsIHJlcGxhY2VtZW50PSIiLCB4PXByb3RfbXRyeFtbInByb3RlaW5uYW1lIl1dKQpwcm90X210cnggPC0gcHJvdF9tdHJ4WywgLTFdCiMjIEltcG9ydGFudCBxdWVzdGlvbjogRGlkIFNXQVRIMnN0YXRzIHJlb3JkZXIgbXkgZGF0YT8KZnVuIDwtIGdzdWIocGF0dGVybj0iXi4qXygyMDE4LiokKSIsIHJlcGxhY2VtZW50PSJcXDEiLCB4PWNvbG5hbWVzKHByb3RfbXRyeCkpCmNvbG5hbWVzKHByb3RfbXRyeCkgPC0gcGFzdGUwKCJzIiwgZnVuKQpgYGAKCiMjIE1lcmdlIHRoZSBwaWVjZXMKCk5vdyB3ZSBzaG91bGQgaGF2ZSBzdWZmaWNpZW50IHBpZWNlcyB0byBtYWtlIGFuIGV4cHJlc3Npb25zZXQuCgpXaGlsZSBoZXJlLCBJIHdpbGwgYWxzbyBzcGxpdCB0aGUgZGF0YSBpbnRvIGEgY2YgYW5kIHdob2xlLWNlbGwgcGFpciBvZiBkYXRhIHN0cnVjdHVyZXMuCgpgYGB7ciBleHB0fQojIyBEcm9wIHRoZSBtZXRhZGF0YSBub3QgaW4gdGhlIHByb3RlaW4gbWF0cml4OgojIyBBbmQgZW5zdXJlIHRoYXQgdGhleSBhcmUgdGhlIHNhbWUgb3JkZXIuCnJlb3JkZXJlZCA8LSBjb2xuYW1lcyhwcm90X210cngpCm1ldGFkYXRhIDwtIG1ldGFkYXRhW3Jlb3JkZXJlZCwgXQoKcHJvdGVpbl9leHB0IDwtIGNyZWF0ZV9leHB0KG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRfZGF0YWZyYW1lPXByb3RfbXRyeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbz1tdGJfYW5ub3RhdGlvbnMpCndob2xlX2V4cHQgPC0gc3Vic2V0X2V4cHQocHJvdGVpbl9leHB0LCBzdWJzZXQ9ImNvbGxlY3Rpb250eXBlPT0nd2hvbGUnIikKY2ZfZXhwdCA8LSBzdWJzZXRfZXhwdChwcm90ZWluX2V4cHQsIHN1YnNldD0iY29sbGVjdGlvbnR5cGU9PSdjZiciKQpgYGAKCiMjIE1ldHJpY3Mgb2YgdGhlIGZ1bGwgZGF0YSBzZXQKCmBgYHtyIHByb3RlaW5fbWV0cmljcywgZmlnLnNob3c9J2hpZGUnfQpwcm90ZWluX21ldHJpY3MgPC0gc20oZ3JhcGhfbWV0cmljcyhwcm90ZWluX2V4cHQpKQpwcm90ZWluX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQocHJvdGVpbl9leHB0LCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkpCnByb3RlaW5fbm9ybV9tZXRyaWNzIDwtIHNtKGdyYXBoX21ldHJpY3MocHJvdGVpbl9ub3JtKSkKcHJvdGVpbl9mc3ZhIDwtIHNtKG5vcm1hbGl6ZV9leHB0KHByb3RlaW5fZXhwdCwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoPSJmc3ZhIiwgZmlsdGVyPVRSVUUpKQpwcm90ZWluX2ZzdmFfbWV0cmljcyA8LSBzbShncmFwaF9tZXRyaWNzKHByb3RlaW5fZnN2YSkpCmBgYAoKIyMgTWV0cmljcyBvZiB0aGUgd2hvbGUtY2VsbCBkYXRhIHNldAoKYGBge3Igd2hvbGVfbWV0cmljcywgZmlnLnNob3c9J2hpZGUnfQp3aG9sZV9tZXRyaWNzIDwtIHNtKGdyYXBoX21ldHJpY3Mod2hvbGVfZXhwdCkpCndob2xlX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQod2hvbGVfZXhwdCwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUpKQp3aG9sZV9ub3JtX21ldHJpY3MgPC0gc20oZ3JhcGhfbWV0cmljcyh3aG9sZV9ub3JtKSkKd2hvbGVfZnN2YSA8LSBzbShub3JtYWxpemVfZXhwdCh3aG9sZV9leHB0LCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2g9ImZzdmEiLCBmaWx0ZXI9VFJVRSkpCndob2xlX2ZzdmFfbWV0cmljcyA8LSBzbShncmFwaF9tZXRyaWNzKHdob2xlX2ZzdmEpKQpgYGAKCiMjIE1ldHJpY3Mgb2YgdGhlIGZpbHRyYXRlIGRhdGEgc2V0CgpgYGB7ciBjZl9tZXRyaWNzLCBmaWcuc2hvdz0naGlkZSd9CmNmX21ldHJpY3MgPC0gc20oZ3JhcGhfbWV0cmljcyhjZl9leHB0KSkKY2Zfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChjZl9leHB0LCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkpCmNmX25vcm1fbWV0cmljcyA8LSBzbShncmFwaF9tZXRyaWNzKGNmX25vcm0pKQpjZl9mc3ZhIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGNmX2V4cHQsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaD0iZnN2YSIsIGZpbHRlcj1UUlVFKSkKY2ZfZnN2YV9tZXRyaWNzIDwtIHNtKGdyYXBoX21ldHJpY3MoY2ZfZnN2YSkpCmBgYAoKIyMgcGxvdCBzb21lIG1ldHJpY3MKCmBgYHtyIHByaW50X21ldHJpY3N9CnBwKGltYWdlPXByb3RlaW5fbWV0cmljcyRsaWJzaXplLCBmaWxlPSJpbWFnZXMvMjAxODA1MjNfbGlic2l6ZS5wbmciKQojIyBJdCBzZWVtcyB0byBtZSB0aGF0IHRoZSBzY2FsZSBvZiB0aGUgZGF0YSBpcyBhbGwgd2l0aGluIGFuIG9yZGVyIG9mIG1hZ25pdHVkZSBvciB0d28uCiMjIEkgY2Fubm90IGdldCB1c2VkIHRvIHRoZXNlIGFic3VyZGx5IGxhcmdlIG51bWJlcnMgdGhvdWdoLgpwcChpbWFnZT1wcm90ZWluX25vcm1fbWV0cmljcyRwY2FwbG90LCBmaWxlPSJpbWFnZXMvMjAxODA1MjNfbm9ybV9wY2EucG5nIikKIyMgVGhlcmUgYXBwZWFycyB0byBiZSBhIG5pY2Ugc3BsaXQgaW4gdGhlIGRhdGEsIGhvd2V2ZXIgdGhlIHVuLWFzc2F5YWJsZSBiYXRjaAojIyBlZmZlY3QgaXMgYSBwcm9ibGVtLgpwcChpbWFnZT1wcm90ZWluX2ZzdmFfbWV0cmljcyRwY2FwbG90LCBmaWxlPSJpbWFnZXMvMjAxODA1MjNfZnN2YV9wY2EucG5nIikKIyMgZnN2YSBzZWVtcyB0byBnZXQgc29tZSBoYW5kbGUgb24gdGhlIGRhdGEsIGJ1dCBJIGRvbid0IHRoaW5rIHdlIHNob3VsZCByZWx5CiMjIHVwb24gaXQuCnBwKGltYWdlPXByb3RlaW5fbm9ybV9tZXRyaWNzJGNvcmhlYXQsIGZpbGU9ImltYWdlcy8yMDE4MDUyM19ub3JtX2NvcmhlYXQucG5nIikKIyMgT25jZSBhZ2FpbiwgdGhlIHdob2xlLWNlbGwvY3VsdHVyZS1maWx0cmF0ZSBzcGxpdCBpcyB2ZXJ5IGxhcmdlLgpwcChpbWFnZT1wcm90ZWluX21ldHJpY3MkZGVuc2l0eSwgZmlsZT0iaW1hZ2VzLzIwMTgwNTIzX3Jhd19kZW5zaXR5LnBuZyIpCiMjIFRoZXJlIGFyZSB0d28gb2J2aW91cyBkaXN0cmlidXRpb25zIGluIHRoZSBkYXRhLCBvbmNlIGFnYWluIHNwbGl0IGJldHdlZW4gdHlwZXMuCnBwKGltYWdlPXByb3RlaW5fbWV0cmljcyRib3hwbG90LCBmaWxlPSJpbWFnZXMvMjAxODA1MjNfYm94cGxvdC5wbmciKQojIyBUaGlzIHJlY2FwaXR1bGF0ZXMgdGhlIHByZXZpb3VzIHBsb3QuCgpwcChpbWFnZT13aG9sZV9tZXRyaWNzJGxpYnNpemUsIGZpbGU9ImltYWdlcy8yMDE4MDUyM193aG9sZV9saWJzaXplLnBuZyIpCnBwKGltYWdlPXdob2xlX25vcm1fbWV0cmljcyRwY2FwbG90LCBmaWxlPSJpbWFnZXMvMjAxODA1MjNfd2hvbGVfbm9ybV9wY2EucG5nIikKcHAoaW1hZ2U9d2hvbGVfZnN2YV9tZXRyaWNzJHBjYXBsb3QsIGZpbGU9ImltYWdlcy8yMDE4MDUyM193aG9sZV9mc3ZhX3BjYS5wbmciKQpwcChpbWFnZT13aG9sZV9ub3JtX21ldHJpY3MkY29yaGVhdCwgZmlsZT0iaW1hZ2VzLzIwMTgwNTIzX3dob2xlX25vcm1fY29yaGVhdC5wbmciKQpwcChpbWFnZT13aG9sZV9tZXRyaWNzJGRlbnNpdHksIGZpbGU9ImltYWdlcy8yMDE4MDUyM193aG9sZV9yYXdfZGVuc2l0eS5wbmciKQpwcChpbWFnZT13aG9sZV9tZXRyaWNzJGJveHBsb3QsIGZpbGU9ImltYWdlcy8yMDE4MDUyM193aG9sZV9ib3hwbG90LnBuZyIpCgpwcChpbWFnZT1jZl9tZXRyaWNzJGxpYnNpemUsIGZpbGU9ImltYWdlcy8yMDE4MDUyM19saWJzaXplLnBuZyIpCnBwKGltYWdlPWNmX25vcm1fbWV0cmljcyRwY2FwbG90LCBmaWxlPSJpbWFnZXMvMjAxODA1MjNfbm9ybV9wY2EucG5nIikKcHAoaW1hZ2U9Y2ZfZnN2YV9tZXRyaWNzJHBjYXBsb3QsIGZpbGU9ImltYWdlcy8yMDE4MDUyM19mc3ZhX3BjYS5wbmciKQpwcChpbWFnZT1jZl9ub3JtX21ldHJpY3MkY29yaGVhdCwgZmlsZT0iaW1hZ2VzLzIwMTgwNTIzX25vcm1fY29yaGVhdC5wbmciKQpwcChpbWFnZT1jZl9tZXRyaWNzJGRlbnNpdHksIGZpbGU9ImltYWdlcy8yMDE4MDUyM19yYXdfZGVuc2l0eS5wbmciKQpwcChpbWFnZT1jZl9tZXRyaWNzJGJveHBsb3QsIGZpbGU9ImltYWdlcy8yMDE4MDUyM19ib3hwbG90LnBuZyIpCmBgYAoKIyBBdHRlbXB0IHNvbWUgcXVhbnRpZmljYXRpb24gY29tcGFyaXNvbnM/CgpgYGB7ciBkZV90ZXN0aW5nfQpwYWlyd2lzZV9maWx0IDwtIHNtKG5vcm1hbGl6ZV9leHB0KHByb3RlaW5fZXhwdCwgZmlsdGVyPVRSVUUpKQpwYWlyd2lzZV9jb21wIDwtIHNtKGFsbF9wYWlyd2lzZShwYWlyd2lzZV9maWx0LCBtb2RlbF9iYXRjaD0iZnN2YSIsIGZvcmNlPVRSVUUpKQpwYWlyd2lzZV9ub2JhdGNoIDwtIHNtKGFsbF9wYWlyd2lzZShwYWlyd2lzZV9maWx0LCBtb2RlbF9iYXRjaD1GQUxTRSwgZm9yY2U9VFJVRSkpCmBgYAoKIyBGb3IgZWFjaCBtc3N0YXRzIHJ1biwgZG8gYSBERSB0YWJsZQoKIyMgd3RfY2YgdnMgd3Rfd2hvbGUKCmBgYHtyIGNvbWJpbmVfd3RjZl93dHdob2xlfQprZWVwZXJzIDwtIGxpc3QoCiAgInd0Y2ZfdnNfd3R3aG9sZSIgPSBjKCJ3dF9jZiIsICJ3dF93aG9sZSIpKQpkcm9wcGVycyA8LSBjKCJ1bmRlZmluZWQiKQpuYW1lcyhkcm9wcGVycykgPC0gImxvZzJmYyIKCiMjIE1ha2Ugc3VyZSB0byBzZXQgdGhlIHJvd25hbWVzIHNvIGl0IHdpbGwgbWVyZ2UgaW50byB0aGUgZXhjZWwgZmlsZS4Kcm93bmFtZXMocmVzdWx0c1tbMV1dKSA8LSByZXN1bHRzW1sxXV1bWyJQcm90ZWluIl1dCnd0Y2Zfd3R3aG9sZV90YWJsZXMgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgcGFpcndpc2VfY29tcCwga2VlcGVycz1rZWVwZXJzLCBleHRyYV9hbm5vdD1yZXN1bHRzW1sxXV0sCiAgZXhjbHVkZXM9ZHJvcHBlcnMsCiAgZXhjZWw9cGFzdGUwKCJleGNlbC93dGNmX3ZzX3d0d2hvbGVfdGFibGVzLXYiLCB2ZXIsICIueGxzeCIpKSkKCnd0Y2Zfbm9iYXRjaF93dHdob2xlX3RhYmxlcyA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICBwYWlyd2lzZV9ub2JhdGNoLCBrZWVwZXJzPWtlZXBlcnMsIGV4dHJhX2Fubm90PXJlc3VsdHNbWzFdXSwKICBleGNsdWRlcz1kcm9wcGVycywKICBleGNlbD1wYXN0ZTAoImV4Y2VsL3d0Y2ZfdnNfd3R3aG9sZV9ub2JhdGNoX3RhYmxlcy12IiwgdmVyLCAiLnhsc3giKSkpCgpjb21wX3RhYmxlIDwtIHd0Y2Zfd3R3aG9sZV90YWJsZXMkZGF0YVtbMV1dCmNvci50ZXN0KGNvbXBfdGFibGUkbG9nMmZjLCBjb21wX3RhYmxlJGRlc2VxX2xvZ2ZjLCBtZXRob2Q9InNwZWFybWFuIikKCmNvbXBfdGFibGUgPC0gd3RjZl9ub2JhdGNoX3d0d2hvbGVfdGFibGVzJGRhdGFbWzFdXQpjb3IudGVzdChjb21wX3RhYmxlJGxvZzJmYywgY29tcF90YWJsZSRkZXNlcV9sb2dmYywgbWV0aG9kPSJzcGVhcm1hbiIpCmBgYAoKIyMgZGVsdGFfY2YgdnMgZGVsdGFfd2hvbGUKCmBgYHtyIGNvbWJpbmVfZGVsdGFjZl9kZWx0YXdob2xlfQprZWVwZXJzIDwtIGxpc3QoCiAgImRlbHRhY2ZfdnNfZGVsdGF3aG9sZSIgPSBjKCJkZWx0YV9jZiIsICJkZWx0YV93aG9sZSIpKQojIyBNYWtlIHN1cmUgdG8gc2V0IHRoZSByb3duYW1lcyBzbyBpdCB3aWxsIG1lcmdlIGludG8gdGhlIGV4Y2VsIGZpbGUuCnJvd25hbWVzKHJlc3VsdHNbWzJdXSkgPC0gcmVzdWx0c1tbMl1dW1siUHJvdGVpbiJdXQpkZWx0YWNmX2RlbHRhd2hvbGVfdGFibGVzIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogIHBhaXJ3aXNlX2NvbXAsIGtlZXBlcnM9a2VlcGVycywgZXh0cmFfYW5ub3Q9cmVzdWx0c1tbMl1dLAogIGV4Y2VsPXBhc3RlMCgiZXhjZWwvZGVsdGFjZl92c19kZWx0YXdob2xlX3RhYmxlcy12IiwgdmVyLCAiLnhsc3giKSkpCmBgYAoKIyMgY29tcF9jZiB2cyBjb21wX3dob2xlCgpgYGB7ciBjb21iaW5lX2NvbXBjZl9jb21wd2hvbGV9CmtlZXBlcnMgPC0gbGlzdCgKICAiY29tcGNmX3ZzX2NvbXB3aG9sZSIgPSBjKCJjb21wX2NmIiwgImNvbXBfd2hvbGUiKSkKIyMgTWFrZSBzdXJlIHRvIHNldCB0aGUgcm93bmFtZXMgc28gaXQgd2lsbCBtZXJnZSBpbnRvIHRoZSBleGNlbCBmaWxlLgpyb3duYW1lcyhyZXN1bHRzW1szXV0pIDwtIHJlc3VsdHNbWzNdXVtbIlByb3RlaW4iXV0KY29tcGNmX2NvbXB3aG9sZV90YWJsZXMgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgcGFpcndpc2VfY29tcCwga2VlcGVycz1rZWVwZXJzLCBleHRyYV9hbm5vdD1yZXN1bHRzW1szXV0sCiAgZXhjZWw9cGFzdGUwKCJleGNlbC9jb21wY2ZfdnNfY29tcHdob2xlX3RhYmxlcy12IiwgdmVyLCAiLnhsc3giKSkpCmBgYAoKIyMgZGVsdGFfY2YgdnMgd3RfY2YKCmBgYHtyIGNvbWJpbmVfZGVsdGFjZl93dGNmfQprZWVwZXJzIDwtIGxpc3QoCiAgImRlbHRhY2ZfdnNfd3RjZiIgPSBjKCJkZWx0YV9jZiIsICJ3dF9jZiIpKQojIyBNYWtlIHN1cmUgdG8gc2V0IHRoZSByb3duYW1lcyBzbyBpdCB3aWxsIG1lcmdlIGludG8gdGhlIGV4Y2VsIGZpbGUuCnJvd25hbWVzKHJlc3VsdHNbWzRdXSkgPC0gcmVzdWx0c1tbNF1dW1siUHJvdGVpbiJdXQpkZWx0YWNmX3d0Y2ZfdGFibGVzIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogIHBhaXJ3aXNlX2NvbXAsIGtlZXBlcnM9a2VlcGVycywgZXh0cmFfYW5ub3Q9cmVzdWx0c1tbNF1dLAogIGV4Y2VsPXBhc3RlMCgiZXhjZWwvZGVsdGFjZl92c193dGNmX3RhYmxlcy12IiwgdmVyLCAiLnhsc3giKSkpCmBgYAoKIyMgY29tcF9jZiB2cyB3dF9jZgoKYGBge3IgY29tYmluZV9jb21wY2Zfd3RjZn0Ka2VlcGVycyA8LSBsaXN0KAogICJjb21wY2ZfdnNfd3RjZiIgPSBjKCJjb21wX2NmIiwgInd0X2NmIikpCiMjIE1ha2Ugc3VyZSB0byBzZXQgdGhlIHJvd25hbWVzIHNvIGl0IHdpbGwgbWVyZ2UgaW50byB0aGUgZXhjZWwgZmlsZS4Kcm93bmFtZXMocmVzdWx0c1tbNV1dKSA8LSByZXN1bHRzW1s1XV1bWyJQcm90ZWluIl1dCmNvbXBjZl93dGNmX3RhYmxlcyA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICBwYWlyd2lzZV9jb21wLCBrZWVwZXJzPWtlZXBlcnMsIGV4dHJhX2Fubm90PXJlc3VsdHNbWzVdXSwKICBleGNlbD1wYXN0ZTAoImV4Y2VsL2NvbXBjZl92c193dGNmX3RhYmxlcy12IiwgdmVyLCAiLnhsc3giKSkpCmBgYAoKIyMgZGVsdGFfd2hvbGUgdnMgd3Rfd2hvbGUKCmBgYHtyIGNvbWJpbmVfZGVsYXdob2xlX3d0d2hvbGV9CmtlZXBlcnMgPC0gbGlzdCgKICAid3RjZl92c193dHdob2xlIiA9IGMoInd0X2NmIiwgInd0X3dob2xlIikpCiMjIE1ha2Ugc3VyZSB0byBzZXQgdGhlIHJvd25hbWVzIHNvIGl0IHdpbGwgbWVyZ2UgaW50byB0aGUgZXhjZWwgZmlsZS4Kcm93bmFtZXMocmVzdWx0c1tbNl1dKSA8LSByZXN1bHRzW1s2XV1bWyJQcm90ZWluIl1dCnd0Y2Zfd3R3aG9sZV90YWJsZXMgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgcGFpcndpc2VfY29tcCwga2VlcGVycz1rZWVwZXJzLCBleHRyYV9hbm5vdD1yZXN1bHRzW1s2XV0sCiAgZXhjZWw9cGFzdGUwKCJleGNlbC9kZWx0YXdob2xlX3ZzX3d0d2hvbGVfdGFibGVzLXYiLCB2ZXIsICIueGxzeCIpKSkKYGBgCgojIyBjb21wX3dob2xlIHZzIHd0X3dob2xlCgpgYGB7ciBjb21iaW5lX2NvbXB3aG9sZV93dHdob2xlfQprZWVwZXJzIDwtIGxpc3QoCiAgImNvbXB3aG9sZV92c193dHdob2xlIiA9IGMoImNvbXBfd2hvbGUiLCAid3Rfd2hvbGUiKSkKIyMgTWFrZSBzdXJlIHRvIHNldCB0aGUgcm93bmFtZXMgc28gaXQgd2lsbCBtZXJnZSBpbnRvIHRoZSBleGNlbCBmaWxlLgpyb3duYW1lcyhyZXN1bHRzW1s3XV0pIDwtIHJlc3VsdHNbWzddXVtbIlByb3RlaW4iXV0KY29tcHdob2xlX3d0d2hvbGVfdGFibGVzIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogIHBhaXJ3aXNlX2NvbXAsIGtlZXBlcnM9a2VlcGVycywgZXh0cmFfYW5ub3Q9cmVzdWx0c1tbN11dLAogIGV4Y2VsPXBhc3RlMCgiZXhjZWwvY29tcHdob2xlX3ZzX3d0d2hvbGVfdGFibGVzLXYiLCB2ZXIsICIueGxzeCIpKSkKYGBgCgojIEluZGV4IHZlcnNpb246IGByIHZlcmAKCiMgVE9ETwoKKiAyMDE4LTA0LTEwOiAgTWFrZSBzdXJlIG15IGludm9jYXRpb25zIG9mIFNXQVRIMnN0YXRzL01Tc3RhdHMgYXJlIGNvcnJlY3QuCgpgYGB7ciBzYXZlbWUsIGV2YWw9RkFMU0V9CmlmICghaXNUUlVFKGdldDAoInNraXBfbG9hZCIpKSkgewogIG1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQogIHRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCiAgbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQogIHRtcCA8LSBzbShzYXZlbWUoZmlsZW5hbWU9dGhpc19zYXZlKSkKICBwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQp9CmBgYAo=