1 Annotation version: 20190513

1.1 Genome annotation with OrgDb/TxDb/OrganismDbi

The tritrypdb just released a new version. Let us make new annotation data from it.

## These functions take _forever_ the first time around.
devtools::load_all("~/scratch/git/EuPathDB")

installedp <- get_eupath_pkgnames(esmer_entry)$orgdb_installed
if (!isTRUE(installedp)) {
  ## Setting the do_orthologs="get" argument ensures that I use the download
  ## more thorough but slower ortholog tables.  Otherwise it will attempt to
  ## use the still-changing 'OrthologsLite' table that the eupathdb folks
  ## are suggesting.
  esmer_annot <- EuPathDB::make_eupath_orgdb(esmer_entry, reinstall=TRUE,
                                             overwrite=TRUE)
}
installedp <- get_eupath_pkgnames(nonesmer_entry)$orgdb_installed
if (!isTRUE(installedp)) {
  nonesmer_annot <- EuPathDB::make_eupath_orgdb(nonesmer_entry, reinstall=TRUE, overwrite=TRUE)
}
installedp <- get_eupath_pkgnames(unas_entry)$orgdb_installed
if (!isTRUE(installedp)) {
  unas_annot <- EuPathDB::make_eupath_orgdb(unas_entry, reinstall=TRUE, overwrite=TRUE)
}

In order to load these new packages, I rather need to remember their names… Happily I have a function for that.

library(EuPathDB)
## Loading required package: GenomicRanges
## Loading required package: stats4
## Loading required package: S4Vectors
## 
## Attaching package: 'S4Vectors'
## The following object is masked from 'package:base':
## 
##     expand.grid
## Loading required package: IRanges
## Loading required package: GenomeInfoDb
## Loading required package: GenomeInfoDbData
## Loading required package: AnnotationHub
## 
## Attaching package: 'AnnotationHub'
## The following object is masked from 'package:hpgltools':
## 
##     cache
## The following object is masked from 'package:Biobase':
## 
##     cache
## 
## This is EuPathDB version 1.5.0
##  Read 'EuPathDB()' to get started.
## 
## Attaching package: 'EuPathDB'
## The following objects are masked from 'package:hpgltools':
## 
##     get_kegg_orgn, load_kegg_annotations, load_orgdb_annotations,
##     load_orgdb_go, orgdb_from_ah
esmer_entry <- EuPathDB::get_eupath_entry(species="Esmeraldo-like", webservice="tritrypdb")
## Warning: 'BiocInstaller' and 'biocLite()' are deprecated, use the 'BiocManager'
##   CRAN package instead.
## Found the following hits: Trypanosoma cruzi CL Brener Esmeraldo-like, Trypanosoma cruzi CL Brener Non-Esmeraldo-like, choosing the first.
## Using: Trypanosoma cruzi CL Brener Esmeraldo-like.
nonesmer_entry <- EuPathDB::get_eupath_entry(species="Brener Non", webservice="tritrypdb")
## Found: Trypanosoma cruzi CL Brener Non-Esmeraldo-like
unas_entry <- EuPathDB::get_eupath_entry(species="CL Brener$", webservice="tritrypdb")
## Found: Trypanosoma cruzi strain CL Brener
esmer_names <- get_eupath_pkgnames(esmer_entry)
esmer_names$orgdb
## org.Tcruzi.CL.Brener.Esmeraldo.like.v43.eg.db
nonesmer_names <- get_eupath_pkgnames(nonesmer_entry)
nonesmer_names$orgdb
## org.Tcruzi.CL.Brener.Non.Esmeraldo.like.v43.eg.db
unas_names <- get_eupath_pkgnames(unas_entry)
unas_names$orgdb
## org.Tcruzi.CL.Brener.v43.eg.db

For those packages I have generated/installed, use this to generate an annotation table. Oh, but I prefixed the column names with ‘annot_’ in order to make sure that nothing is duplicated with the GO tables, ortholog tables, etc.

## Just to save on typing
library(esmer_names$orgdb, character=TRUE)
## Loading required package: AnnotationDbi
## 
library(nonesmer_names$orgdb, character=TRUE)
## 
library(unas_names$orgdb, character=TRUE)
## 
esmer_db <- get0(esmer_names$orgdb)
esmer_db
## OrgDb object:
## | DBSCHEMAVERSION: 2.1
## | DBSCHEMA: NOSCHEMA_DB
## | ORGANISM: Trypanosoma cruzi
## | SPECIES: Trypanosoma cruzi
## | CENTRALID: GID
## | Taxonomy ID: 5693
## | Db type: OrgDb
## | Supporting package: AnnotationDbi
## 
## Please see: help('select') for usage information
nonesmer_db <- get0(nonesmer_names$orgdb)
nonesmer_db
## OrgDb object:
## | DBSCHEMAVERSION: 2.1
## | DBSCHEMA: NOSCHEMA_DB
## | ORGANISM: Trypanosoma cruzi
## | SPECIES: Trypanosoma cruzi
## | CENTRALID: GID
## | Taxonomy ID: 5693
## | Db type: OrgDb
## | Supporting package: AnnotationDbi
## 
## Please see: help('select') for usage information
unas_db <- get0(unas_names$orgdb)
unas_db
## OrgDb object:
## | DBSCHEMAVERSION: 2.1
## | DBSCHEMA: NOSCHEMA_DB
## | ORGANISM: Trypanosoma cruzi strain CL Brener
## | SPECIES: Trypanosoma cruzi strain CL Brener
## | CENTRALID: GID
## | Taxonomy ID: 353153
## | Db type: OrgDb
## | Supporting package: AnnotationDbi
## 
## Please see: help('select') for usage information

Lets see what columns are available in the annotation packages.

all_fields <- columns(esmer_db)
all_fields
##   [1] "ANNOT_BFD3_CDS"                         
##   [2] "ANNOT_BFD3_MODEL"                       
##   [3] "ANNOT_BFD6_CDS"                         
##   [4] "ANNOT_BFD6_MODEL"                       
##   [5] "ANNOT_CDS"                              
##   [6] "ANNOT_CDS_LENGTH"                       
##   [7] "ANNOT_CHROMOSOME"                       
##   [8] "ANNOT_DIF_CDS"                          
##   [9] "ANNOT_DIF_MODEL"                        
##  [10] "ANNOT_EC_NUMBERS"                       
##  [11] "ANNOT_EC_NUMBERS_DERIVED"               
##  [12] "ANNOT_EXON_COUNT"                       
##  [13] "ANNOT_FC_BFD3_CDS"                      
##  [14] "ANNOT_FC_BFD3_MODEL"                    
##  [15] "ANNOT_FC_BFD6_CDS"                      
##  [16] "ANNOT_FC_BFD6_MODEL"                    
##  [17] "ANNOT_FC_DIF_CDS"                       
##  [18] "ANNOT_FC_DIF_MODEL"                     
##  [19] "ANNOT_FC_PF_CDS"                        
##  [20] "ANNOT_FC_PF_MODEL"                      
##  [21] "ANNOT_FIVE_PRIME_UTR_LENGTH"            
##  [22] "ANNOT_GENE_ENTREZ_ID"                   
##  [23] "ANNOT_GENE_EXON_COUNT"                  
##  [24] "ANNOT_GENE_HTS_NONCODING_SNPS"          
##  [25] "ANNOT_GENE_HTS_NONSYN_SYN_RATIO"        
##  [26] "ANNOT_GENE_HTS_NONSYNONYMOUS_SNPS"      
##  [27] "ANNOT_GENE_HTS_STOP_CODON_SNPS"         
##  [28] "ANNOT_GENE_HTS_SYNONYMOUS_SNPS"         
##  [29] "ANNOT_GENE_LOCATION_TEXT"               
##  [30] "ANNOT_GENE_NAME"                        
##  [31] "ANNOT_GENE_ORTHOLOG_NUMBER"             
##  [32] "ANNOT_GENE_ORTHOMCL_NAME"               
##  [33] "ANNOT_GENE_PARALOG_NUMBER"              
##  [34] "ANNOT_GENE_PREVIOUS_IDS"                
##  [35] "ANNOT_GENE_PRODUCT"                     
##  [36] "ANNOT_GENE_SOURCE_ID"                   
##  [37] "ANNOT_GENE_TOTAL_HTS_SNPS"              
##  [38] "ANNOT_GENE_TRANSCRIPT_COUNT"            
##  [39] "ANNOT_GENE_TYPE"                        
##  [40] "ANNOT_GO_COMPONENT"                     
##  [41] "ANNOT_GO_FUNCTION"                      
##  [42] "ANNOT_GO_ID_COMPONENT"                  
##  [43] "ANNOT_GO_ID_FUNCTION"                   
##  [44] "ANNOT_GO_ID_PROCESS"                    
##  [45] "ANNOT_GO_PROCESS"                       
##  [46] "ANNOT_HAS_MISSING_TRANSCRIPTS"          
##  [47] "ANNOT_INTERPRO_DESCRIPTION"             
##  [48] "ANNOT_INTERPRO_ID"                      
##  [49] "ANNOT_IS_PSEUDO"                        
##  [50] "ANNOT_ISOELECTRIC_POINT"                
##  [51] "ANNOT_LOCATION_TEXT"                    
##  [52] "ANNOT_MATCHED_RESULT"                   
##  [53] "ANNOT_MOLECULAR_WEIGHT"                 
##  [54] "ANNOT_NO_TET_CDS"                       
##  [55] "ANNOT_NO_TET_MODEL"                     
##  [56] "ANNOT_ORGANISM"                         
##  [57] "ANNOT_PF_CDS"                           
##  [58] "ANNOT_PF_MODEL"                         
##  [59] "ANNOT_PFAM_DESCRIPTION"                 
##  [60] "ANNOT_PFAM_ID"                          
##  [61] "ANNOT_PIRSF_DESCRIPTION"                
##  [62] "ANNOT_PIRSF_ID"                         
##  [63] "ANNOT_PREDICTED_GO_COMPONENT"           
##  [64] "ANNOT_PREDICTED_GO_FUNCTION"            
##  [65] "ANNOT_PREDICTED_GO_ID_COMPONENT"        
##  [66] "ANNOT_PREDICTED_GO_ID_FUNCTION"         
##  [67] "ANNOT_PREDICTED_GO_ID_PROCESS"          
##  [68] "ANNOT_PREDICTED_GO_PROCESS"             
##  [69] "ANNOT_PROJECT_ID"                       
##  [70] "ANNOT_PROSITEPROFILES_DESCRIPTION"      
##  [71] "ANNOT_PROSITEPROFILES_ID"               
##  [72] "ANNOT_PROTEIN_LENGTH"                   
##  [73] "ANNOT_PROTEIN_SEQUENCE"                 
##  [74] "ANNOT_SEQUENCE_ID"                      
##  [75] "ANNOT_SIGNALP_PEPTIDE"                  
##  [76] "ANNOT_SIGNALP_SCORES"                   
##  [77] "ANNOT_SMART_DESCRIPTION"                
##  [78] "ANNOT_SMART_ID"                         
##  [79] "ANNOT_SOURCE_ID"                        
##  [80] "ANNOT_STRAND"                           
##  [81] "ANNOT_SUPERFAMILY_DESCRIPTION"          
##  [82] "ANNOT_SUPERFAMILY_ID"                   
##  [83] "ANNOT_THREE_PRIME_UTR_LENGTH"           
##  [84] "ANNOT_TIGRFAM_DESCRIPTION"              
##  [85] "ANNOT_TIGRFAM_ID"                       
##  [86] "ANNOT_TM_COUNT"                         
##  [87] "ANNOT_TRANS_FOUND_PER_GENE_INTERNAL"    
##  [88] "ANNOT_TRANSCRIPT_INDEX_PER_GENE"        
##  [89] "ANNOT_TRANSCRIPT_LENGTH"                
##  [90] "ANNOT_TRANSCRIPT_LINK"                  
##  [91] "ANNOT_TRANSCRIPT_PRODUCT"               
##  [92] "ANNOT_TRANSCRIPT_SEQUENCE"              
##  [93] "ANNOT_TRANSCRIPTS_FOUND_PER_GENE"       
##  [94] "ANNOT_UNIPROT_ID"                       
##  [95] "ANNOT_URI"                              
##  [96] "ANNOT_WDK_WEIGHT"                       
##  [97] "CHR_ID"                                 
##  [98] "GENE_TYPE"                              
##  [99] "GID"                                    
## [100] "GO_EVIDENCE_CODE"                       
## [101] "GO_ID"                                  
## [102] "GO_IS_NOT"                              
## [103] "GO_ONTOLOGY"                            
## [104] "GO_REFERENCE"                           
## [105] "GO_SORT_KEY"                            
## [106] "GO_SOURCE"                              
## [107] "GO_SUPPORT_FOR_EVIDENCE_CODE_ASSIGNMENT"
## [108] "GO_TERM_NAME"                           
## [109] "GO_TRANSCRIPT_ID_S"                     
## [110] "INTERPRO_DESCRIPTION"                   
## [111] "INTERPRO_E_VALUE"                       
## [112] "INTERPRO_END_MIN"                       
## [113] "INTERPRO_ID"                            
## [114] "INTERPRO_NAME"                          
## [115] "INTERPRO_PRIMARY_ID"                    
## [116] "INTERPRO_SECONDARY_ID"                  
## [117] "INTERPRO_START_MIN"                     
## [118] "INTERPRO_TRANSCRIPT_ID_S"               
## [119] "KEGGREST_KEGG_GENEID"                   
## [120] "KEGGREST_NCBI_GENEID"                   
## [121] "KEGGREST_NCBI_PROTEINID"                
## [122] "KEGGREST_PATHWAYS"                      
## [123] "KEGGREST_UNIPROTID"                     
## [124] "LINKOUT_DATABASE"                       
## [125] "LINKOUT_EXT_ID"                         
## [126] "LINKOUT_LINK_URL"                       
## [127] "LINKOUT_SOURCE_ID"                      
## [128] "ORTHOLOGS_GID"                          
## [129] "ORTHOLOGS_ORGANISM"                     
## [130] "ORTHOLOGS_PRODUCT"                      
## [131] "ORTHOLOGS_SYNTENIC"                     
## [132] "PATHWAY_EC_NUMBER_MATCHED_IN_PATHWAY"   
## [133] "PATHWAY_EXACT_EC_NUMBER_MATCH"          
## [134] "PATHWAY_EXPASY_URL"                     
## [135] "PATHWAY_ID"                             
## [136] "PATHWAY_REACTIONS_MATCHING_EC_NUMBER"   
## [137] "PATHWAY_SOURCE"                         
## [138] "PATHWAY_SOURCE_ID"                      
## [139] "PUBMED_AUTHORS"                         
## [140] "PUBMED_DOI"                             
## [141] "PUBMED_ID"                              
## [142] "PUBMED_TITLE"
wanted_fields <- c("annot_gene_location_text",
                   "annot_cds_length",
                   "annot_gene_name",
                   "annot_gene_product",
                   "annot_gene_type",
                   "annot_strand",
                   "annot_gene_entrez_id",
                   "annot_gene_orthomcl_name")
esmer_annot <- load_orgdb_annotations(
  esmer_db,
  keytype="gid",
  fields=wanted_fields)
## Unable to find CDSNAME, setting it to ANNOT_GENE_NAME.
## Unable to find CDSCHROM in the db, removing it.
## Unable to find CDSSTRAND in the db, removing it.
## Unable to find CDSSTART in the db, removing it.
## Unable to find CDSEND in the db, removing it.
## Extracted all gene ids.
## Attempting to select: ANNOT_GENE_NAME, GENE_TYPE, ANNOT_GENE_LOCATION_TEXT, ANNOT_CDS_LENGTH, ANNOT_GENE_NAME, ANNOT_GENE_PRODUCT, ANNOT_GENE_TYPE, ANNOT_STRAND, ANNOT_GENE_ENTREZ_ID, ANNOT_GENE_ORTHOMCL_NAME
## 'select()' returned 1:1 mapping between keys and columns
nonesmer_annot <- load_orgdb_annotations(
  nonesmer_db,
  keytype="gid",
  fields=wanted_fields)
## Unable to find CDSNAME, setting it to ANNOT_GENE_NAME.
## Unable to find CDSCHROM in the db, removing it.
## Unable to find CDSSTRAND in the db, removing it.
## Unable to find CDSSTART in the db, removing it.
## Unable to find CDSEND in the db, removing it.
## Extracted all gene ids.
## Attempting to select: ANNOT_GENE_NAME, GENE_TYPE, ANNOT_GENE_LOCATION_TEXT, ANNOT_CDS_LENGTH, ANNOT_GENE_NAME, ANNOT_GENE_PRODUCT, ANNOT_GENE_TYPE, ANNOT_STRAND, ANNOT_GENE_ENTREZ_ID, ANNOT_GENE_ORTHOMCL_NAME
## 'select()' returned 1:1 mapping between keys and columns
unas_annot <- load_orgdb_annotations(
  unas_db,
  keytype="gid",
  fields=wanted_fields)
## Unable to find CDSNAME, setting it to ANNOT_GENE_NAME.
## Unable to find CDSCHROM in the db, removing it.
## Unable to find CDSSTRAND in the db, removing it.
## Unable to find CDSSTART in the db, removing it.
## Unable to find CDSEND in the db, removing it.
## Extracted all gene ids.
## Attempting to select: ANNOT_GENE_NAME, GENE_TYPE, ANNOT_GENE_LOCATION_TEXT, ANNOT_CDS_LENGTH, ANNOT_GENE_NAME, ANNOT_GENE_PRODUCT, ANNOT_GENE_TYPE, ANNOT_STRAND, ANNOT_GENE_ENTREZ_ID, ANNOT_GENE_ORTHOMCL_NAME
## 'select()' returned 1:1 mapping between keys and columns

Now combine the esmer, nonesmer, and unassigned annotations.

clbr_annot <- rbind(rbind(esmer_annot[["genes"]], nonesmer_annot[["genes"]]),
                    unas_annot[["genes"]])
## Wait, did they finally combine esmer_annot/nonesmer_annot and the whole clbr?
testers <- head(rownames(unas_annot[["genes"]]))
testers %in% rownames(nonesmer_annot$genes)
## [1] FALSE FALSE FALSE FALSE FALSE FALSE
testers %in% rownames(esmer_annot$genes)
## [1] FALSE FALSE FALSE FALSE FALSE FALSE
## No, I guess not.
clbr_annot <- extract_gene_locations(clbr_annot)
hisat_clbr_annot <- clbr_annot
rownames(hisat_clbr_annot) <- paste0("exon_", rownames(hisat_clbr_annot), ".1")
salmon_clbr_annot <- clbr_annot
rownames(salmon_clbr_annot) <- paste0(rownames(salmon_clbr_annot), ".mRNA")

2 Gather orthologs between haplotypes

For the moment I think I will just ask for esmer->nonesmer

orthos <- EuPathDB::extract_eupath_orthologs(
                      db=esmer_db,
                      query_species="Trypanosoma cruzi CL Brener Non-Esmeraldo-like",
                      id_column="ORTHOLOGS_GID")
## Some columns were missing: ORTHOLOGS_COUNT
## Removing them, which may end badly.
## 'select()' returned 1:many mapping between keys and columns
## There are 48 possible species in this group.
## Found species: Trypanosoma cruzi CL Brener Non-Esmeraldo-like
orthos <- orthos[, c("GID", "ORTHOLOGS_GID")]
colnames(orthos) <- c("Esmeraldo", "NonEsmeraldo")
if (!isTRUE(get0("skip_load"))) {
  pander::pander(sessionInfo())
  message(paste0("This is hpgltools commit: ", get_git_commit()))
  message(paste0("Saving to ", savefile))
  tmp <- sm(saveme(filename=savefile))
}
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 0abc58e173be7300595d30d407b7efd4e4a512d6
## This is hpgltools commit: Thu May 9 14:56:34 2019 -0400: 0abc58e173be7300595d30d407b7efd4e4a512d6
## Saving to 01_annotation_v20190513.rda.xz
LS0tCnRpdGxlOiAiVC4gY3J1emkgMjAxOTA1MTM6IENvbGxlY3RpbmcgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbi4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKIGh0bWxfZG9jdW1lbnQ6CiAgY29kZV9kb3dubG9hZDogdHJ1ZQogIGNvZGVfZm9sZGluZzogc2hvdwogIGZpZ19jYXB0aW9uOiB0cnVlCiAgZmlnX2hlaWdodDogNwogIGZpZ193aWR0aDogNwogIGhpZ2hsaWdodDogZGVmYXVsdAogIGtlZXBfbWQ6IGZhbHNlCiAgbW9kZTogc2VsZmNvbnRhaW5lZAogIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgdGhlbWU6IHJlYWRhYmxlCiAgdG9jOiB0cnVlCiAgdG9jX2Zsb2F0OgogICBjb2xsYXBzZWQ6IGZhbHNlCiAgIHNtb290aF9zY3JvbGw6IGZhbHNlCi0tLQoKPHN0eWxlPgogIGJvZHkgLm1haW4tY29udGFpbmVyIHsKICAgIG1heC13aWR0aDogMTYwMHB4OwogIH0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmlmICghaXNUUlVFKGdldDAoInNraXBfbG9hZCIpKSkgewogIGxpYnJhcnkoaHBnbHRvb2xzKQogIHR0IDwtIHNtKGRldnRvb2xzOjpsb2FkX2FsbCgiL2RhdGEvaHBnbHRvb2xzIikpCiAga25pdHI6Om9wdHNfa25pdCRzZXQocHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9OTAsCiAgICAgICAgICAgICAgICAgICAgICAgZWNobz1UUlVFKQogIGtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGg9OCwKICAgICAgICAgICAgICAgICAgICAgICAgZmlnLmhlaWdodD04LAogICAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCiAgb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKICBnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEyKSkKICB2ZXIgPC0gIjIwMTkwNTEzIgogIHByZXZpb3VzX2ZpbGUgPC0gcGFzdGUwKCJpbmRleF92IiwgdmVyLCAiLlJtZCIpCgogIHRtcCA8LSB0cnkoc20obG9hZG1lKGZpbGVuYW1lPWdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iXFwucmRhXFwueHoiLCB4PXByZXZpb3VzX2ZpbGUpKSkpCiAgcm1kX2ZpbGUgPC0gcGFzdGUwKCIwMV9hbm5vdGF0aW9uX3YiLCB2ZXIsICIuUm1kIikKICBzYXZlZmlsZSA8LSBnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IlxcLnJkYVxcLnh6IiwgeD1ybWRfZmlsZSkKfQpgYGAKCiMgQW5ub3RhdGlvbiB2ZXJzaW9uOiBgciB2ZXJgCgojIyBHZW5vbWUgYW5ub3RhdGlvbiB3aXRoIE9yZ0RiL1R4RGIvT3JnYW5pc21EYmkKClRoZSB0cml0cnlwZGIganVzdCByZWxlYXNlZCBhIG5ldyB2ZXJzaW9uLiAgTGV0IHVzIG1ha2UgbmV3IGFubm90YXRpb24gZGF0YSBmcm9tIGl0LgoKYGBge3IgY3JlYXRlX29yZ2FuaXNtcywgZXZhbD1GQUxTRX0KIyMgVGhlc2UgZnVuY3Rpb25zIHRha2UgX2ZvcmV2ZXJfIHRoZSBmaXJzdCB0aW1lIGFyb3VuZC4KZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L3NjcmF0Y2gvZ2l0L0V1UGF0aERCIikKCmluc3RhbGxlZHAgPC0gZ2V0X2V1cGF0aF9wa2duYW1lcyhlc21lcl9lbnRyeSkkb3JnZGJfaW5zdGFsbGVkCmlmICghaXNUUlVFKGluc3RhbGxlZHApKSB7CiAgIyMgU2V0dGluZyB0aGUgZG9fb3J0aG9sb2dzPSJnZXQiIGFyZ3VtZW50IGVuc3VyZXMgdGhhdCBJIHVzZSB0aGUgZG93bmxvYWQKICAjIyBtb3JlIHRob3JvdWdoIGJ1dCBzbG93ZXIgb3J0aG9sb2cgdGFibGVzLiAgT3RoZXJ3aXNlIGl0IHdpbGwgYXR0ZW1wdCB0bwogICMjIHVzZSB0aGUgc3RpbGwtY2hhbmdpbmcgJ09ydGhvbG9nc0xpdGUnIHRhYmxlIHRoYXQgdGhlIGV1cGF0aGRiIGZvbGtzCiAgIyMgYXJlIHN1Z2dlc3RpbmcuCiAgZXNtZXJfYW5ub3QgPC0gRXVQYXRoREI6Om1ha2VfZXVwYXRoX29yZ2RiKGVzbWVyX2VudHJ5LCByZWluc3RhbGw9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXRlPVRSVUUpCn0KaW5zdGFsbGVkcCA8LSBnZXRfZXVwYXRoX3BrZ25hbWVzKG5vbmVzbWVyX2VudHJ5KSRvcmdkYl9pbnN0YWxsZWQKaWYgKCFpc1RSVUUoaW5zdGFsbGVkcCkpIHsKICBub25lc21lcl9hbm5vdCA8LSBFdVBhdGhEQjo6bWFrZV9ldXBhdGhfb3JnZGIobm9uZXNtZXJfZW50cnksIHJlaW5zdGFsbD1UUlVFLCBvdmVyd3JpdGU9VFJVRSkKfQppbnN0YWxsZWRwIDwtIGdldF9ldXBhdGhfcGtnbmFtZXModW5hc19lbnRyeSkkb3JnZGJfaW5zdGFsbGVkCmlmICghaXNUUlVFKGluc3RhbGxlZHApKSB7CiAgdW5hc19hbm5vdCA8LSBFdVBhdGhEQjo6bWFrZV9ldXBhdGhfb3JnZGIodW5hc19lbnRyeSwgcmVpbnN0YWxsPVRSVUUsIG92ZXJ3cml0ZT1UUlVFKQp9CmBgYAoKSW4gb3JkZXIgdG8gbG9hZCB0aGVzZSBuZXcgcGFja2FnZXMsIEkgcmF0aGVyIG5lZWQgdG8gcmVtZW1iZXIgdGhlaXIgbmFtZXMuLi4KSGFwcGlseSBJIGhhdmUgYSBmdW5jdGlvbiBmb3IgdGhhdC4KCmBgYHtyIGxvYWRfYW5ub3RhdGlvbnN9CmxpYnJhcnkoRXVQYXRoREIpCmVzbWVyX2VudHJ5IDwtIEV1UGF0aERCOjpnZXRfZXVwYXRoX2VudHJ5KHNwZWNpZXM9IkVzbWVyYWxkby1saWtlIiwgd2Vic2VydmljZT0idHJpdHJ5cGRiIikKbm9uZXNtZXJfZW50cnkgPC0gRXVQYXRoREI6OmdldF9ldXBhdGhfZW50cnkoc3BlY2llcz0iQnJlbmVyIE5vbiIsIHdlYnNlcnZpY2U9InRyaXRyeXBkYiIpCnVuYXNfZW50cnkgPC0gRXVQYXRoREI6OmdldF9ldXBhdGhfZW50cnkoc3BlY2llcz0iQ0wgQnJlbmVyJCIsIHdlYnNlcnZpY2U9InRyaXRyeXBkYiIpCgplc21lcl9uYW1lcyA8LSBnZXRfZXVwYXRoX3BrZ25hbWVzKGVzbWVyX2VudHJ5KQplc21lcl9uYW1lcyRvcmdkYgpub25lc21lcl9uYW1lcyA8LSBnZXRfZXVwYXRoX3BrZ25hbWVzKG5vbmVzbWVyX2VudHJ5KQpub25lc21lcl9uYW1lcyRvcmdkYgp1bmFzX25hbWVzIDwtIGdldF9ldXBhdGhfcGtnbmFtZXModW5hc19lbnRyeSkKdW5hc19uYW1lcyRvcmdkYgpgYGAKCkZvciB0aG9zZSBwYWNrYWdlcyBJIGhhdmUgZ2VuZXJhdGVkL2luc3RhbGxlZCwgdXNlIHRoaXMgdG8gZ2VuZXJhdGUgYW4KYW5ub3RhdGlvbiB0YWJsZS4gT2gsIGJ1dCBJIHByZWZpeGVkIHRoZSBjb2x1bW4gbmFtZXMgd2l0aCAnYW5ub3RfJyBpbiBvcmRlciB0bwptYWtlIHN1cmUgdGhhdCBub3RoaW5nIGlzIGR1cGxpY2F0ZWQgd2l0aCB0aGUgR08gdGFibGVzLCBvcnRob2xvZyB0YWJsZXMsIGV0Yy4KCmBgYHtyIGxvYWRfb3JnZGJ9CiMjIEp1c3QgdG8gc2F2ZSBvbiB0eXBpbmcKbGlicmFyeShlc21lcl9uYW1lcyRvcmdkYiwgY2hhcmFjdGVyPVRSVUUpCmxpYnJhcnkobm9uZXNtZXJfbmFtZXMkb3JnZGIsIGNoYXJhY3Rlcj1UUlVFKQpsaWJyYXJ5KHVuYXNfbmFtZXMkb3JnZGIsIGNoYXJhY3Rlcj1UUlVFKQoKZXNtZXJfZGIgPC0gZ2V0MChlc21lcl9uYW1lcyRvcmdkYikKZXNtZXJfZGIKbm9uZXNtZXJfZGIgPC0gZ2V0MChub25lc21lcl9uYW1lcyRvcmdkYikKbm9uZXNtZXJfZGIKdW5hc19kYiA8LSBnZXQwKHVuYXNfbmFtZXMkb3JnZGIpCnVuYXNfZGIKYGBgCgpMZXRzIHNlZSB3aGF0IGNvbHVtbnMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgYW5ub3RhdGlvbiBwYWNrYWdlcy4KCmBgYHtyIGF2YWlsX2NvbHVtbnN9CmFsbF9maWVsZHMgPC0gY29sdW1ucyhlc21lcl9kYikKYWxsX2ZpZWxkcwoKd2FudGVkX2ZpZWxkcyA8LSBjKCJhbm5vdF9nZW5lX2xvY2F0aW9uX3RleHQiLAogICAgICAgICAgICAgICAgICAgImFubm90X2Nkc19sZW5ndGgiLAogICAgICAgICAgICAgICAgICAgImFubm90X2dlbmVfbmFtZSIsCiAgICAgICAgICAgICAgICAgICAiYW5ub3RfZ2VuZV9wcm9kdWN0IiwKICAgICAgICAgICAgICAgICAgICJhbm5vdF9nZW5lX3R5cGUiLAogICAgICAgICAgICAgICAgICAgImFubm90X3N0cmFuZCIsCiAgICAgICAgICAgICAgICAgICAiYW5ub3RfZ2VuZV9lbnRyZXpfaWQiLAogICAgICAgICAgICAgICAgICAgImFubm90X2dlbmVfb3J0aG9tY2xfbmFtZSIpCmVzbWVyX2Fubm90IDwtIGxvYWRfb3JnZGJfYW5ub3RhdGlvbnMoCiAgZXNtZXJfZGIsCiAga2V5dHlwZT0iZ2lkIiwKICBmaWVsZHM9d2FudGVkX2ZpZWxkcykKbm9uZXNtZXJfYW5ub3QgPC0gbG9hZF9vcmdkYl9hbm5vdGF0aW9ucygKICBub25lc21lcl9kYiwKICBrZXl0eXBlPSJnaWQiLAogIGZpZWxkcz13YW50ZWRfZmllbGRzKQp1bmFzX2Fubm90IDwtIGxvYWRfb3JnZGJfYW5ub3RhdGlvbnMoCiAgdW5hc19kYiwKICBrZXl0eXBlPSJnaWQiLAogIGZpZWxkcz13YW50ZWRfZmllbGRzKQpgYGAKCk5vdyBjb21iaW5lIHRoZSBlc21lciwgbm9uZXNtZXIsIGFuZCB1bmFzc2lnbmVkIGFubm90YXRpb25zLgoKYGBge3IgY29tYmluZV9hbm5vdH0KY2xicl9hbm5vdCA8LSByYmluZChyYmluZChlc21lcl9hbm5vdFtbImdlbmVzIl1dLCBub25lc21lcl9hbm5vdFtbImdlbmVzIl1dKSwKICAgICAgICAgICAgICAgICAgICB1bmFzX2Fubm90W1siZ2VuZXMiXV0pCiMjIFdhaXQsIGRpZCB0aGV5IGZpbmFsbHkgY29tYmluZSBlc21lcl9hbm5vdC9ub25lc21lcl9hbm5vdCBhbmQgdGhlIHdob2xlIGNsYnI/CnRlc3RlcnMgPC0gaGVhZChyb3duYW1lcyh1bmFzX2Fubm90W1siZ2VuZXMiXV0pKQp0ZXN0ZXJzICVpbiUgcm93bmFtZXMobm9uZXNtZXJfYW5ub3QkZ2VuZXMpCnRlc3RlcnMgJWluJSByb3duYW1lcyhlc21lcl9hbm5vdCRnZW5lcykKIyMgTm8sIEkgZ3Vlc3Mgbm90LgpjbGJyX2Fubm90IDwtIGV4dHJhY3RfZ2VuZV9sb2NhdGlvbnMoY2xicl9hbm5vdCkKaGlzYXRfY2xicl9hbm5vdCA8LSBjbGJyX2Fubm90CnJvd25hbWVzKGhpc2F0X2NsYnJfYW5ub3QpIDwtIHBhc3RlMCgiZXhvbl8iLCByb3duYW1lcyhoaXNhdF9jbGJyX2Fubm90KSwgIi4xIikKc2FsbW9uX2NsYnJfYW5ub3QgPC0gY2xicl9hbm5vdApyb3duYW1lcyhzYWxtb25fY2xicl9hbm5vdCkgPC0gcGFzdGUwKHJvd25hbWVzKHNhbG1vbl9jbGJyX2Fubm90KSwgIi5tUk5BIikKYGBgCgojIEdhdGhlciBvcnRob2xvZ3MgYmV0d2VlbiBoYXBsb3R5cGVzCgpGb3IgdGhlIG1vbWVudCBJIHRoaW5rIEkgd2lsbCBqdXN0IGFzayBmb3IgZXNtZXItPm5vbmVzbWVyCgpgYGB7ciBvcnRob3N9Cm9ydGhvcyA8LSBFdVBhdGhEQjo6ZXh0cmFjdF9ldXBhdGhfb3J0aG9sb2dzKAogICAgICAgICAgICAgICAgICAgICAgZGI9ZXNtZXJfZGIsCiAgICAgICAgICAgICAgICAgICAgICBxdWVyeV9zcGVjaWVzPSJUcnlwYW5vc29tYSBjcnV6aSBDTCBCcmVuZXIgTm9uLUVzbWVyYWxkby1saWtlIiwKICAgICAgICAgICAgICAgICAgICAgIGlkX2NvbHVtbj0iT1JUSE9MT0dTX0dJRCIpCm9ydGhvcyA8LSBvcnRob3NbLCBjKCJHSUQiLCAiT1JUSE9MT0dTX0dJRCIpXQpjb2xuYW1lcyhvcnRob3MpIDwtIGMoIkVzbWVyYWxkbyIsICJOb25Fc21lcmFsZG8iKQpgYGAKCmBgYHtyIHNhdmVtZX0KaWYgKCFpc1RSVUUoZ2V0MCgic2tpcF9sb2FkIikpKSB7CiAgcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKICBtZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKICBtZXNzYWdlKHBhc3RlMCgiU2F2aW5nIHRvICIsIHNhdmVmaWxlKSkKICB0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lPXNhdmVmaWxlKSkKfQpgYGAK