1 Annotation version: 20190914

1.1 Genome annotation input

There are a few methods of importing annotation data into R. The following are two attempts, the second is currently being used in these analyses.

1.2 OrganismDb

Since this document was originally written, I have made substantial changes to how I create, load, and manipulate the eupathdb annotation data. As a result, this needs to be significantly reworked.

AnnotationHub is the new and fancier version of what OrganismDb does. Keith already made these for the parasites though, lets try and use one of those.

Assuming the above packages got created, we may load them and extract the annotation data.

## Loading required package: GenomeInfoDbData
## 
## This is EuPathDB version 1.6.0
##  Read 'EuPathDB()' to get started.
## 
## Attaching package: 'EuPathDB'
## The following objects are masked from 'package:hpgltools':
## 
##     download_uniprot_proteome, get_kegg_orgn,
##     load_kegg_annotations, load_orgdb_annotations, load_orgdb_go,
##     load_uniprot_annotations, orgdb_from_ah
## Found the following hits: Leishmania major strain Friedlin, Leishmania major strain LV39c5, Leishmania major strain SD 75.1, choosing the first.
## Using: Leishmania major strain Friedlin.
## org.Lmajor.Friedlin.v45.eg.db
## Found the following hits: Leishmania panamensis MHOM/COL/81/L13, Leishmania panamensis strain MHOM/PA/94/PSC-1, choosing the first.
## Using: Leishmania panamensis MHOM/COL/81/L13.
## org.Lpanamensis.MHOMCOL81L13.v45.eg.db

2 Putting the pieces together

The macrophage experiment has samples across 2 contexts, the host and parasite. The following block sets up one experiment for each. If you open the all_samples-species.xlsx files, you will note immediately that a few different attempts were made at ascertaining the most likely experimental factors that contributed to the readily apparent batch effects.

2.1 The human transcriptome mappings

Keep in mind that if I change the experimental design with new annotations, I must therefore regenerate the following.

sampleid pathogenstrain experimentname tubelabel alias condition batch anotherbatch snpclade snpcladev2 snpcladev3 pathogenstrain.1 label donor time pctmappedparasite pctcategory state sourcelab expperson pathogen host hostcelltype noofhostcells infectionperiodhpitimeofharvest moiexposure parasitespercell pctinf rnangul rnaqcpassed libraryconst libqcpassed index descriptonandremarks observation lowercaseid humanfile parasitefile bcftable file
HPGL0241 HPGL0241 none macrophage TM130-Nil (Blue label) Nil uninf a a undef undef undef none uninf_1 d130 undef undef 0 uninfected Ade Adriana none Human Human macs Max 2 mill 2h - 24h chase period NA unknown unknown 468 Y Wanderson Y 1 Uninfected human macrophages NA hpgl0241 preprocessing/hpgl0241/outputs/tophat_hsapiens/accepted_paired.count.xz undef undef null

2.2 The parasite transcriptome mappings

The first three rows of the parasite experimental design.
sampleid pathogenstrain experimentname tubelabel alias condition batch anotherbatch snpclade snpcladev2 snpcladev3 pathogenstrain.1 label donor time pctmappedparasite pctcategory state sourcelab expperson pathogen host hostcelltype noofhostcells infectionperiodhpitimeofharvest moiexposure parasitespercell pctinf rnangul rnaqcpassed libraryconst libqcpassed index descriptonandremarks observation lowercaseid humanfile parasitefile bcftable file
HPGL0242 HPGL0242 s2271 macrophage TM130-2271 Self-Healing sh a a white whitepink right s2271 sh_2271 d130 undef 30 3 self_heal Ade Adriana Lp Human Human macs Max 2 mill 2h - 24h chase period 0.0486111111111111 unknown unknown 276 Y Wanderson Y 8 Infected human macrophages. NA hpgl0242 preprocessing/hpgl0242/outputs/tophat_hsapiens/accepted_paired.count.xz preprocessing/hpgl0242/outputs/tophat_lpanamensis/accepted_paired.count.xz preprocessing/outputs/hpgl0242_parsed_count.txt null
HPGL0244 HPGL0244 s5433 macrophage TM130-5433 Chronic chr a a blue_self blue left s5433 chr_5433 d130 undef 15 1 chronic Ade Adriana Lp Human Human macs Max 2 mill 2h - 24h chase period 0.0486111111111111 unknown unknown 261 Y Wanderson Y 27 Infected human macrophages NA hpgl0244 preprocessing/hpgl0244/outputs/tophat_hsapiens/accepted_paired.count.xz preprocessing/hpgl0244/outputs/tophat_lpanamensis/accepted_paired.count.xz preprocessing/outputs/hpgl0244_parsed_count.txt null
HPGL0245 HPGL0245 s1320 macrophage TM130-1320 Chronic chr a a multicolor yellowbrownmulti right s1320 chr_1320 d130 undef 40 4 chronic Ade Adriana Lp Human Human macs Max 2 mill 2h - 24h chase period 0.0486111111111111 unknown unknown 199 Y Wanderson Y 11 Infected human macrophages NA hpgl0245 preprocessing/hpgl0245/outputs/tophat_hsapiens/accepted_paired.count.xz preprocessing/hpgl0245/outputs/tophat_lpanamensis/accepted_paired.count.xz preprocessing/outputs/hpgl0245_parsed_count.txt null

3 Supplemental Table 1

Table S1 is going to be a summary of the metadata in all_samples-combined This may also include some of the numbers regarding mapping %, etc.

Wanted columns:

  • Sample ID: HPGLxxxx
  • Donor Code: TM130 or PG1xx
  • Cell Type: Macrophage or PBMC
  • Infection Status: Infected or Uninfected
  • Disease Outcome: Chronic or Self-Healing or NA
  • Batch: A or B (macrophage); NA for PBMC
  • Number of reads that passed Illumina filter
  • Number of reads after trimming
  • Number of reads mapped - human
  • % reads mapped - human
  • Number of reads mapped - L.panamensis
  • % reads mapped - L.panamensis

Use the Tcruzi colors.

  • A1 is a large title: “Macrophage Samples”
  • Row 2 is the blue column headings
  • 3-m contains Macrophage metadata
  • m+1 is blank
  • m+2 is a large title: “PBMC Samples”
  • m+3-n contains PBMC metadata

4 End

At this point, we should have everything necessary to perform the various analyses of the 4 sub-experiments. So save the current data for reuse elsewhere.

The experimental design is available here.

## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset f3c1e03852c87dc60c7e72e726bb640572e695ff
## This is hpgltools commit: Thu Aug 22 15:32:44 2019 -0400: f3c1e03852c87dc60c7e72e726bb640572e695ff
## Saving to 01_annotation_20190914-v20190914.rda.xz
## The savefile is: /cbcbsub/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_2016/savefiles/01_annotation_20190914-v20190914.rda.xz
## The file does not yet exist.
## The save string is: con <- pipe(paste0('pxz > /cbcbsub/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_2016/savefiles/01_annotation_20190914-v20190914.rda.xz'), 'wb'); save(list=ls(all.names=TRUE, envir=globalenv()),
##      envir=globalenv(), file=con, compress=FALSE); close(con)

R version 3.6.0 (2019-04-26)

Platform: x86_64-pc-linux-gnu (64-bit)

locale: LC_CTYPE=en_US.utf8, LC_NUMERIC=C, LC_TIME=en_US.utf8, LC_COLLATE=en_US.utf8, LC_MONETARY=en_US.utf8, LC_MESSAGES=en_US.utf8, LC_PAPER=en_US.utf8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=en_US.utf8 and LC_IDENTIFICATION=C

attached base packages: stats4, parallel, stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: Homo.sapiens(v.1.3.1), TxDb.Hsapiens.UCSC.hg19.knownGene(v.3.2.2), org.Hs.eg.db(v.3.8.2), GO.db(v.3.8.2), OrganismDbi(v.1.26.0), GenomicFeatures(v.1.36.4), GenomicRanges(v.1.36.1), GenomeInfoDb(v.1.20.0), org.Lpanamensis.MHOMCOL81L13.v45.eg.db(v.2019.09), org.Lmajor.Friedlin.v45.eg.db(v.2019.09), AnnotationDbi(v.1.46.1), IRanges(v.2.18.2), S4Vectors(v.0.22.1), futile.logger(v.1.4.3), EuPathDB(v.1.6.0), GenomeInfoDbData(v.1.2.1), hpgltools(v.1.0), Biobase(v.2.44.0) and BiocGenerics(v.0.30.0)

loaded via a namespace (and not attached): RUnit(v.0.4.32), tidyselect(v.0.2.5), lme4(v.1.1-21), RSQLite(v.2.1.2), htmlwidgets(v.1.3), grid(v.3.6.0), BiocParallel(v.1.18.1), devtools(v.2.2.0), munsell(v.0.5.0), codetools(v.0.2-16), DT(v.0.8), withr(v.2.1.2), colorspace(v.1.4-1), GOSemSim(v.2.10.0), highr(v.0.8), knitr(v.1.24), rstudioapi(v.0.10), DOSE(v.3.10.2), labeling(v.0.3), urltools(v.1.7.3), polyclip(v.1.10-0), bit64(v.0.9-7), farver(v.1.1.0), rprojroot(v.1.3-2), vctrs(v.0.2.0), lambda.r(v.1.2.3), xfun(v.0.9), BiocFileCache(v.1.8.0), R6(v.2.4.0), doParallel(v.1.0.15), graphlayouts(v.0.5.0), bitops(v.1.0-6), fgsea(v.1.10.1), gridGraphics(v.0.4-1), DelayedArray(v.0.10.0), assertthat(v.0.2.1), promises(v.1.0.1), scales(v.1.0.0), ggraph(v.2.0.0), enrichplot(v.1.4.0), gtable(v.0.3.0), biocViews(v.1.52.2), sva(v.3.32.1), processx(v.3.4.1), tidygraph(v.1.1.2), rlang(v.0.4.0), zeallot(v.0.1.0), genefilter(v.1.66.0), splines(v.3.6.0), rtracklayer(v.1.44.4), lazyeval(v.0.2.2), europepmc(v.0.3), BiocManager(v.1.30.4), yaml(v.2.2.0), reshape2(v.1.4.3), backports(v.1.1.4), httpuv(v.1.5.2), qvalue(v.2.16.0), RBGL(v.1.60.0), clusterProfiler(v.3.12.0), tools(v.3.6.0), usethis(v.1.5.1), ggplotify(v.0.0.4), ggplot2(v.3.2.1), ellipsis(v.0.2.0.1), gplots(v.3.0.1.1), RColorBrewer(v.1.1-2), sessioninfo(v.1.1.1), ggridges(v.0.5.1), Rcpp(v.1.0.2), plyr(v.1.8.4), base64enc(v.0.1-3), progress(v.1.2.2), zlibbioc(v.1.30.0), purrr(v.0.3.2), RCurl(v.1.95-4.12), ps(v.1.3.0), prettyunits(v.1.0.2), viridis(v.0.5.1), cowplot(v.1.0.0), SummarizedExperiment(v.1.14.1), ggrepel(v.0.8.1), colorRamps(v.2.3), fs(v.1.3.1), variancePartition(v.1.14.0), magrittr(v.1.5), futile.options(v.1.0.1), data.table(v.1.12.2), openxlsx(v.4.1.0.1), DO.db(v.2.9), triebeard(v.0.3.0), matrixStats(v.0.55.0), pkgload(v.1.0.2), hms(v.0.5.1), mime(v.0.7), evaluate(v.0.14), xtable(v.1.8-4), pbkrtest(v.0.4-7), XML(v.3.98-1.20), gridExtra(v.2.3), testthat(v.2.2.1), compiler(v.3.6.0), biomaRt(v.2.40.4), tibble(v.2.1.3), KernSmooth(v.2.23-15), crayon(v.1.3.4), minqa(v.1.2.4), htmltools(v.0.3.6), mgcv(v.1.8-28), later(v.0.8.0), tidyr(v.0.8.3), DBI(v.1.0.0), formatR(v.1.7), tweenr(v.1.0.1), dbplyr(v.1.4.2), MASS(v.7.3-51.4), rappdirs(v.0.3.1), boot(v.1.3-23), Matrix(v.1.2-17), cli(v.1.1.0), gdata(v.2.18.0), igraph(v.1.2.4.1), pkgconfig(v.2.0.2), rvcheck(v.0.1.3), GenomicAlignments(v.1.20.1), xml2(v.1.2.2), foreach(v.1.4.7), annotate(v.1.62.0), XVector(v.0.24.0), AnnotationForge(v.1.26.0), rvest(v.0.3.4), stringr(v.1.4.0), callr(v.3.3.1), digest(v.0.6.20), graph(v.1.62.0), Biostrings(v.2.52.0), rmarkdown(v.1.15), fastmatch(v.1.1-0), curl(v.4.1), shiny(v.1.3.2), Rsamtools(v.2.0.0), gtools(v.3.8.1), nloptr(v.1.2.1), nlme(v.3.1-141), jsonlite(v.1.6), desc(v.1.2.0), viridisLite(v.0.3.0), limma(v.3.40.6), pillar(v.1.4.2), lattice(v.0.20-38), httr(v.1.4.1), pkgbuild(v.1.0.5), survival(v.2.44-1.1), interactiveDisplayBase(v.1.22.0), glue(v.1.3.1), remotes(v.2.1.0), zip(v.2.0.4), UpSetR(v.1.4.0), iterators(v.1.0.12), pander(v.0.6.3), bit(v.1.1-14), ggforce(v.0.3.1), stringi(v.1.4.3), blob(v.1.2.0), AnnotationHub(v.2.16.1), caTools(v.1.17.1.2), AnnotationHubData(v.1.14.0), memoise(v.1.1.0), rBiopaxParser(v.2.24.0) and dplyr(v.0.8.3)

LS0tCnRpdGxlOiAiTC4gcGFuYW1lbnNpcyAyMDE5MDkxNDogQW5ub3RhdGlvbiBkYXRhLiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHdpZHRoOiAzMDAKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgiL2RhdGEvaHBnbHRvb2xzIikKa25pdHI6Om9wdHNfa25pdCRzZXQod2lkdGg9MTIwLAogICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgbWF4LnByaW50PTEyMCwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbD0iYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEwKSkKdmVyIDwtICIyMDE5MDkxNCIKcHJldmlvdXNfZmlsZSA8LSAiaW5kZXguUm1kIgoKdG1wIDwtIHRyeShzbShsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKSkpCnJtZF9maWxlIDwtICIwMV9hbm5vdGF0aW9uXzIwMTkwOTE0LlJtZCIKYGBgCgojIEFubm90YXRpb24gdmVyc2lvbjogYHIgdmVyYAoKIyMgR2Vub21lIGFubm90YXRpb24gaW5wdXQKClRoZXJlIGFyZSBhIGZldyBtZXRob2RzIG9mIGltcG9ydGluZyBhbm5vdGF0aW9uIGRhdGEgaW50byBSLiAgVGhlIGZvbGxvd2luZyBhcmUKdHdvIGF0dGVtcHRzLCB0aGUgc2Vjb25kIGlzIGN1cnJlbnRseSBiZWluZyB1c2VkIGluIHRoZXNlIGFuYWx5c2VzLgoKIyMjIEFubm90YXRpb25IdWIKCkFubm90YXRpb25IdWIgaXMgYSBuZXdlciBzZXJ2aWNlIGFuZCBoYXMgcHJvbWlzZSB0byBiZSBhbiBleGNlbGxlbnQgdG9wLWxldmVsCnJlc291cmNlIGZvciBnYXRoZXJpbmcgYW5ub3RhdGlvbiBkYXRhLgoKYGBge3IgZGF0YV9pbnB1dF9nZW5vbWUsIGV2YWw9RkFMU0V9CnR0IDwtIHNtKGxpYnJhcnkoQW5ub3RhdGlvbkh1YikpCmFoIDwtIHNtKEFubm90YXRpb25IdWIoKSkKb3JnZGJzIDwtIHF1ZXJ5KGFoLCAiT3JnREIiKQphbm5vdF9sbSA8LSBxdWVyeShhaCwgYygiT3JnREIiLCAiRnJpZWRsaW4iKSkKbG1fbmFtZSA8LSBuYW1lcyhhbm5vdF9sbSkKYW5ub3RfbG0gPC0gc20oYW5ub3RfbG1bW2xtX25hbWVbWzJdXV1dKQp0eHRkYnMgPC0gcXVlcnkoYWgsICJUeERiIikKCiMjIEFINDg0MjkgYXBwZWFycyB0byBiZSBwYW5hbWVuc2lzCiMjYW5ub3RfbHAgPC0gYW5ub3RfbHBbWyJBSDQ4NDI5Il1dCmFubm90X2xwIDwtIHF1ZXJ5KGFoLCBjKCJPcmdEQiIsICJwYW5hbWVuc2lzIikpCmxwX25hbWUgPC0gbmFtZXMoYW5ub3RfbHApCmFubm90X2xwIDwtIHNtKGFubm90X2xwW1tscF9uYW1lW1syXV1dXSkKYGBgCgojIyBPcmdhbmlzbURiCgpTaW5jZSB0aGlzIGRvY3VtZW50IHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4sIEkgaGF2ZSBtYWRlIHN1YnN0YW50aWFsIGNoYW5nZXMgdG8KaG93IEkgY3JlYXRlLCBsb2FkLCBhbmQgbWFuaXB1bGF0ZSB0aGUgZXVwYXRoZGIgYW5ub3RhdGlvbiBkYXRhLiAgQXMgYSByZXN1bHQsCnRoaXMgbmVlZHMgdG8gYmUgc2lnbmlmaWNhbnRseSByZXdvcmtlZC4KCkFubm90YXRpb25IdWIgaXMgdGhlIG5ldyBhbmQgZmFuY2llciB2ZXJzaW9uIG9mIHdoYXQgT3JnYW5pc21EYiBkb2VzLiAgS2VpdGgKYWxyZWFkeSBtYWRlIHRoZXNlIGZvciB0aGUgcGFyYXNpdGVzIHRob3VnaCwgbGV0cyB0cnkgYW5kIHVzZSBvbmUgb2YgdGhvc2UuCgpgYGB7ciBtYWtlX29yZ2RiLCBldmFsPUZBTFNFfQp0cml0cnlwX21ldGFkYXRhIDwtIGRvd25sb2FkX2V1cGF0aF9tZXRhZGF0YSh3ZWJzZXJ2aWNlPSJ0cml0cnlwZGIiKQoKcGFuYW1lbnNpc19lbnRyeSA8LSBnZXRfZXVwYXRoX2VudHJ5KCJwYW5hbWVuc2lzIiwgd2Vic2VydmljZT0idHJpdHJ5cGRiIikKdGVzdGluZ19wYW5hbWVuc2lzIDwtIG1ha2VfZXVwYXRoX29yZ2FuaXNtZGJpKHBhbmFtZW5zaXNfZW50cnkpCgp0ZXN0aW5nX2JyYXppbGllbnNpcyA8LSBtYWtlX2V1cGF0aF9vcmdhbmlzbWRiaSgiYnJhemlsaWVuc2lzIikKdGVzdGluZ19kb25vdmFuaSA8LSBtYWtlX2V1cGF0aF9vcmdhbmlzbWRiaSgiZG9ub3ZhbmkiKQp0ZXN0aW5nX21leGljYW5hIDwtIG1ha2VfZXVwYXRoX29yZ2FuaXNtZGJpKCJtZXhpY2FuYSIpCgptYWpvcl9lbnRyeSA8LSBnZXRfZXVwYXRoX2VudHJ5KCJtYWpvciIsIHdlYnNlcnZpY2U9InRyaXRyeXBkYiIpCnRlc3RpbmdfbWFqb3IgPC0gbWFrZV9ldXBhdGhfb3JnYW5pc21kYmkobWFqb3JfZW50cnkpCgp0ZXN0aW5nX2NyaXRoIDwtIG1ha2VfZXVwYXRoX29yZ2FuaXNtZGJpKCJDcml0IiwgbWV0YWRhdGE9dHJpdHJ5cF9tZXRhZGF0YSkKYGBgCgpBc3N1bWluZyB0aGUgYWJvdmUgcGFja2FnZXMgZ290IGNyZWF0ZWQsIHdlIG1heSBsb2FkIHRoZW0gYW5kIGV4dHJhY3QgdGhlCmFubm90YXRpb24gZGF0YS4KCmBgYHtyIGxwYW5hbWVuc2lzX29yZ2RifQpsaWJyYXJ5KEV1UGF0aERCKQp0cml0cnlwX21ldGFkYXRhIDwtIGRvd25sb2FkX2V1cGF0aF9tZXRhZGF0YSh3ZWJzZXJ2aWNlPSJ0cml0cnlwZGIiKQptYWpvcl9lbnRyeSA8LSBnZXRfZXVwYXRoX2VudHJ5KCJtYWpvciIsIHdlYnNlcnZpY2U9InRyaXRyeXBkYiIpCm1ham9yX25hbWVzIDwtIGdldF9ldXBhdGhfcGtnbmFtZXMobWFqb3JfZW50cnkpCm1ham9yX25hbWVzJG9yZ2RiCgp3YW50ZWRfZmllbGRzIDwtIGMoImFubm90X2Nkc19sZW5ndGgiLCAiYW5ub3RfY2hyb21vc29tZSIsICJhbm5vdF9nZW5lX2VudHJlel9pZCIsCiAgICAgICAgICAgICAgICAgICAiYW5ub3RfZ2VuZV9uYW1lIiwgImFubm90X3N0cmFuZCIsICJnaWQiLCAiZ29fZ29faWQiLAogICAgICAgICAgICAgICAgICAgImdvX2dvX3Rlcm1fbmFtZSIsICJnb19vbnRvbG9neSIsCiAgICAgICAgICAgICAgICAgICAiaW50ZXJwcm9fZGVzY3JpcHRpb24iICwiaW50ZXJwcm9fZV92YWx1ZSIsICJ0eXBlX2dlbmVfdHlwZSIpCgpsbV9vcmcgPC0gc20oRXVQYXRoREI6OmxvYWRfb3JnZGJfYW5ub3RhdGlvbnMobWFqb3JfbmFtZXMkb3JnZGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl0eXBlPSJnaWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzPXdhbnRlZF9maWVsZHMpKQoKcGFuYW1lbnNpc19lbnRyeSA8LSBnZXRfZXVwYXRoX2VudHJ5KCJwYW5hbWVuc2lzIiwgd2Vic2VydmljZT0idHJpdHJ5cGRiIikKcGFuYW1lbnNpc19uYW1lcyA8LSBnZXRfZXVwYXRoX3BrZ25hbWVzKHBhbmFtZW5zaXNfZW50cnkpCnBhbmFtZW5zaXNfbmFtZXMkb3JnZGIKbHBfb3JnIDwtIHNtKEV1UGF0aERCOjpsb2FkX29yZ2RiX2Fubm90YXRpb25zKHBhbmFtZW5zaXNfbmFtZXMkb3JnZGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXR5cGU9ImdpZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcz13YW50ZWRfZmllbGRzKSkKYGBgCgpgYGB7ciBvdGhlcl9vcmdkYnMsIGV2YWw9RkFMU0V9CmJyYXppbGllbnNpc19uYW1lcyA8LSBnZXRfZXVwYXRoX3BrZ25hbWVzKCJicmF6aWxpZW5zaXMiKQpicmF6aWxpZW5zaXNfbmFtZXMkb3JnZGIKb2xkX25hbWUgPC0gIm9yZy5MYnJhemlsaWVuc2lzLk1IT01CUjc1TTI5MDMudjM4LmVnLmRiIgpsYl9vcmcgPC0gc20obG9hZF9vcmdkYl9hbm5vdGF0aW9ucyhvbGRfbmFtZSwga2V5dHlwZT0iZ2lkIiwgZmllbGRzPXdhbnRlZF9maWVsZHMpKQoKIyNkb25vdmFuaV9uYW1lcyA8LSBnZXRfZXVwYXRoX3BrZ25hbWVzKCJkb25vdmFuaSIpCiMjZG9ub3ZhbmlfbmFtZXMkb3JnZGIKIyNsZF9vcmcgPC0gbG9hZF9vcmdkYl9hbm5vdGF0aW9ucyhkb25vdmFuaV9uYW1lcyRvcmdkYiwga2V5dHlwZT0iZ2lkIiwgZmllbGRzPXdhbnRlZF9maWVsZHMpCiMjCiMjbWV4aWNhbmFfbmFtZXMgPC0gZ2V0X2V1cGF0aF9wa2duYW1lcygibWV4aWNhbmEiKQojI21leGljYW5hX25hbWVzJG9yZ2RiCiMjbG1leF9vcmcgPC0gbG9hZF9vcmdkYl9hbm5vdGF0aW9ucyhtZXhpY2FuYV9uYW1lcyRvcmdkYiwga2V5dHlwZT0iZ2lkIiwgZmllbGRzPXdhbnRlZF9maWVsZHMpCiMjCiMjZmFzY2ljdWxhdGFfbmFtZXMgPC0gZ2V0X2V1cGF0aF9wa2duYW1lcygicml0aGlkaWEiLCBtZXRhZGF0YT10cml0cnlwX21ldGFkYXRhKQojI2Zhc2NpY3VsYXRhX25hbWVzJG9yZ2RiCiMjY2Zfb3JnIDwtIGxvYWRfb3JnZGJfYW5ub3RhdGlvbnMoZmFzY2ljdWxhdGFfbmFtZXMkb3JnZGIsIGtleXR5cGU9ImdpZCIsIGZpZWxkcz13YW50ZWRfZmllbGRzKQpgYGAKCiMjIFJlYWQgYSBnZmYgZmlsZQoKSW4gY29udHJhc3QsIGl0IGlzIHBvc3NpYmxlIHRvIGxvYWQgbW9zdCBhbm5vdGF0aW9ucyBvZiBpbnRlcmVzdCBkaXJlY3RseSBmcm9tCnRoZSBnZmYgZmlsZXMgdXNlZCBpbiB0aGUgYWxpZ25tZW50cy4gIE1vcmUgaW4tZGVwdGggaW5mb3JtYXRpb24gZm9yIHRoZSBodW1hbgp0cmFuc2NyaXB0b21lIG1heSBiZSBleHRyYWN0ZWQgZnJvbSBiaW9tYXJ0LgoKYGBge3IgZ2Vub21lX2lucHV0fQojIyBUaGUgb2xkIHdheSBvZiBnZXR0aW5nIGdlbm9tZS9hbm5vdGF0aW9uIGRhdGEKbHBfZ2ZmIDwtICJyZWZlcmVuY2UvbHBhbmFtZW5zaXMuZ2ZmIgpsYl9nZmYgPC0gInJlZmVyZW5jZS9sYnJhemlsaWVuc2lzLmdmZiIKaHNfZ2ZmIDwtICJyZWZlcmVuY2UvaHNhcGllbnMuZ3RmIgoKbHBfZmFzdGEgPC0gInJlZmVyZW5jZS9scGFuYW1lbnNpcy5mYXN0YS54eiIKbGJfZmFzdGEgPC0gInJlZmVyZW5jZS9sYnJhemlsaWVuc2lzLmZhc3RhLnh6Igpoc19mYXN0YSA8LSAicmVmZXJlbmNlL2hzYXBpZW5zLmZhc3RhLnh6IgoKbHBfYW5ub3RhdGlvbnMgPC0gc20obG9hZF9nZmZfYW5ub3RhdGlvbnMobHBfZ2ZmLCB0eXBlPSJnZW5lIikpCnJvd25hbWVzKGxwX2Fubm90YXRpb25zKSA8LSBwYXN0ZTAoImV4b25fIiwgbHBfYW5ub3RhdGlvbnMkd2ViX2lkLCAiLjEiKQoKbGJfYW5ub3RhdGlvbnMgPC0gc20obG9hZF9nZmZfYW5ub3RhdGlvbnMobGJfZ2ZmLCB0eXBlPSJnZW5lIikpCmhzX2dmZl9hbm5vdCA8LSBzbShsb2FkX2dmZl9hbm5vdGF0aW9ucyhoc19nZmYsIGlkX2NvbD0iZ2VuZV9pZCIpKQoKaHNfYW5ub3RhdGlvbnMgPC0gc20obG9hZF9iaW9tYXJ0X2Fubm90YXRpb25zKCkpJGFubm90YXRpb24KaHNfYW5ub3RhdGlvbnMkSUQgPC0gaHNfYW5ub3RhdGlvbnMkZ2VuZUlECnJvd25hbWVzKGhzX2Fubm90YXRpb25zKSA8LSBtYWtlLm5hbWVzKGhzX2Fubm90YXRpb25zW1siZW5zZW1ibF9nZW5lX2lkIl1dLCB1bmlxdWU9VFJVRSkKCmxwX3NpemVfZGlzdCA8LSBwbG90X2hpc3RvZ3JhbShscF9hbm5vdGF0aW9uc1tbIndpZHRoIl1dKQpscF9zaXplX2Rpc3QKaHNfc2l6ZV9kaXN0IDwtIHBsb3RfaGlzdG9ncmFtKGhzX2Fubm90YXRpb25zW1siY2RzX2xlbmd0aCJdXSkKaHNfc2l6ZV9kaXN0ICsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMjAwMDApKQpgYGAKCiMjIEdldHRpbmcgb250b2xvZ3kgZGF0YQoKQW5ub3RhdGlvbiBmb3IgZ2VuZSBvbnRvbG9naWVzIG1heSBiZSBnYXRoZXJlZCBmcm9tIGEgc2ltaWxhcmx5IGxhcmdlIG51bWJlciBvZgpzb3VyY2VzLiBUaGUgZm9sbG93aW5nIGFyZSBhIGNvdXBsZS4KCmBgYHtyIG9udG9sb2d5fQojIyBUcnkgdXNpbmcgYmlvbWFydApoc19nb19iaW9tYXJ0IDwtIHNtKGxvYWRfYmlvbWFydF9nbygpKQojIyBvciB0aGUgb3JnLkhzLmVnLmRiIHNxbGl0ZSBkYXRhYmFzZQp0dCA8LSBzbShsaWJyYXJ5KCJIb21vLnNhcGllbnMiKSkKaHMgPC0gSG9tby5zYXBpZW5zCiMjaHNfZ29fZW5zZW1ibCA8LSBsb2FkX29yZ2RiX2dvKGhzLCBoc19hbm5vdGF0aW9ucyRnZW5lSUQpCiMjZGltKGhzX2dvX2Jpb21hcnQpCiMjZGltKGhzX2dvX2Vuc2VtYmwpCiMjaHNfZ29pZHMgPC0gaHNfZ29fYmlvbWFydAoKIyMgV2hpbGUgdGVzdGluZywgSSBjYWxsZWQgdGhpcyBkZXNjLCB0aGF0IHdpbGwgbmVlZCB0byBjaGFuZ2UuCiMjbHBfdG9vbHRpcHMgPC0gbWFrZV90b29sdGlwcyhscF9hbm5vdGF0aW9ucykKIyNsYl90b29sdGlwcyA8LSBtYWtlX3Rvb2x0aXBzKGxiX2Fubm90YXRpb25zKQoKbHBfbGVuZ3RocyA8LSBscF9hbm5vdGF0aW9uc1ssIGMoIklEIiwgIndpZHRoIildCmxiX2xlbmd0aHMgPC0gbGJfYW5ub3RhdGlvbnNbLCBjKCJJRCIsICJ3aWR0aCIpXQpoc19sZW5ndGhzIDwtIGhzX2Fubm90YXRpb25zWywgYygiZW5zZW1ibF9nZW5lX2lkIiwgImNkc19sZW5ndGgiKV0KY29sbmFtZXMoaHNfbGVuZ3RocykgPC0gYygiSUQiLCAid2lkdGgiKQoKbHBfZ29pZHMgPC0gcmVhZC5jc3YoZmlsZT0icmVmZXJlbmNlL2xwYW5fZ28udHh0Lnh6Iiwgc2VwPSJcdCIsIGhlYWRlcj1GQUxTRSkKbGJfZ29pZHMgPC0gcmVhZC5jc3YoZmlsZT0icmVmZXJlbmNlL2xicmF6X2dvLnR4dC54eiIsIHNlcD0iXHQiLCBoZWFkZXI9RkFMU0UpCmNvbG5hbWVzKGxwX2dvaWRzKSA8LSBjKCJJRCIsIkdPIiwib250IiwibmFtZSIsInNvdXJjZSIsInRhZyIpCmNvbG5hbWVzKGxiX2dvaWRzKSA8LSBjKCJJRCIsIkdPIiwib250IiwibmFtZSIsInNvdXJjZSIsInRhZyIpCmBgYAoKIyBQdXR0aW5nIHRoZSBwaWVjZXMgdG9nZXRoZXIKClRoZSBtYWNyb3BoYWdlIGV4cGVyaW1lbnQgaGFzIHNhbXBsZXMgYWNyb3NzIDIgY29udGV4dHMsIHRoZSBob3N0IGFuZCBwYXJhc2l0ZS4KVGhlIGZvbGxvd2luZyBibG9jayBzZXRzIHVwIG9uZSBleHBlcmltZW50IGZvciBlYWNoLiAgSWYgeW91IG9wZW4gdGhlCmFsbF9zYW1wbGVzLXNwZWNpZXMueGxzeCBmaWxlcywgeW91IHdpbGwgbm90ZSBpbW1lZGlhdGVseSB0aGF0IGEgZmV3IGRpZmZlcmVudAphdHRlbXB0cyB3ZXJlIG1hZGUgYXQgYXNjZXJ0YWluaW5nIHRoZSBtb3N0IGxpa2VseSBleHBlcmltZW50YWwgZmFjdG9ycyB0aGF0CmNvbnRyaWJ1dGVkIHRvIHRoZSByZWFkaWx5IGFwcGFyZW50IGJhdGNoIGVmZmVjdHMuCgojIyBUaGUgaHVtYW4gdHJhbnNjcmlwdG9tZSBtYXBwaW5ncwoKS2VlcCBpbiBtaW5kIHRoYXQgaWYgSSBjaGFuZ2UgdGhlIGV4cGVyaW1lbnRhbCBkZXNpZ24gd2l0aCBuZXcgYW5ub3RhdGlvbnMsIEkKbXVzdCB0aGVyZWZvcmUgcmVnZW5lcmF0ZSB0aGUgZm9sbG93aW5nLgoKYGBge3IgaHNfZXhwdH0KaHNfZmluYWxfYW5ub3RhdGlvbnMgPC0gaHNfYW5ub3RhdGlvbnMKaHNfZmluYWxfYW5ub3RhdGlvbnMgPC0gaHNfZmluYWxfYW5ub3RhdGlvbnNbLCBjKCJlbnNlbWJsX3RyYW5zY3JpcHRfaWQiLCAiZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZ25jX3N5bWJvbCIsICJkZXNjcmlwdGlvbiIsICJnZW5lX2Jpb3R5cGUiKV0Kbm90ZSA8LSAiTmV3IGV4cGVyaW1lbnRhbCBkZXNpZ24gZmFjdG9ycyBieSBzbnAgYWRkZWQgMjAxNi0wOS0yMCIKCmhzX2V4cHQgPC0gc20oY3JlYXRlX2V4cHQoInNhbXBsZV9zaGVldHMvYWxsX3NhbXBsZXMtY29tYmluZWQueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPWhzX2ZpbmFsX2Fubm90YXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uPSJodW1hbmZpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGVzPW5vdGUpKQprbml0cjo6a2FibGUoaGVhZChoc19leHB0JGRlc2lnbiwgbj0xKSkKCmNkc19lbnRyaWVzIDwtIGZEYXRhKGhzX2V4cHQpCmNkc19lbnRyaWVzIDwtIGNkc19lbnRyaWVzW1siZ2VuZV9iaW90eXBlIl1dID09ICJwcm90ZWluX2NvZGluZyIKaHNfY2RzX2V4cHQgPC0gaHNfZXhwdApoc19jZHNfZXhwdCRleHByZXNzaW9uc2V0IDwtIGhzX2Nkc19leHB0JGV4cHJlc3Npb25zZXRbY2RzX2VudHJpZXMsIF0KbmV3X2Nkc19lbnRyaWVzIDwtIGZEYXRhKGhzX2Nkc19leHB0KQpgYGAKCiMjIFRoZSBwYXJhc2l0ZSB0cmFuc2NyaXB0b21lIG1hcHBpbmdzCgpgYGB7ciBwYXJhc2l0ZV9leHB0fQpwYXJhc2l0ZV9leHB0IDwtIHNtKGNyZWF0ZV9leHB0KCJzYW1wbGVfc2hlZXRzL2FsbF9zYW1wbGVzLWNvbWJpbmVkLnhsc3giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbz1scF9hbm5vdGF0aW9ucywgZmlsZV9jb2x1bW49InBhcmFzaXRlZmlsZSIpKQprbml0cjo6a2FibGUoaGVhZChwYXJhc2l0ZV9leHB0JGRlc2lnbiwgbj0zKSwKICAgICAgICAgICAgIGNhcHRpb249IlRoZSBmaXJzdCB0aHJlZSByb3dzIG9mIHRoZSBwYXJhc2l0ZSBleHBlcmltZW50YWwgZGVzaWduLiIpCmBgYAoKIyBTdXBwbGVtZW50YWwgVGFibGUgMQoKVGFibGUgUzEgaXMgZ29pbmcgdG8gYmUgYSBzdW1tYXJ5IG9mIHRoZSBtZXRhZGF0YSBpbiBhbGxfc2FtcGxlcy1jb21iaW5lZApUaGlzIG1heSBhbHNvIGluY2x1ZGUgc29tZSBvZiB0aGUgbnVtYmVycyByZWdhcmRpbmcgbWFwcGluZyAlLCBldGMuCgpXYW50ZWQgY29sdW1uczoKCiogU2FtcGxlIElEOiAgSFBHTHh4eHgKKiBEb25vciBDb2RlOiBUTTEzMCBvciBQRzF4eAoqIENlbGwgVHlwZTogIE1hY3JvcGhhZ2Ugb3IgUEJNQwoqIEluZmVjdGlvbiBTdGF0dXM6ICBJbmZlY3RlZCBvciBVbmluZmVjdGVkCiogRGlzZWFzZSBPdXRjb21lOiAgQ2hyb25pYyBvciBTZWxmLUhlYWxpbmcgb3IgTkEKKiBCYXRjaDogQSBvciBCIChtYWNyb3BoYWdlKTsgTkEgZm9yIFBCTUMKKiBOdW1iZXIgb2YgcmVhZHMgdGhhdCBwYXNzZWQgSWxsdW1pbmEgZmlsdGVyCiogTnVtYmVyIG9mIHJlYWRzIGFmdGVyIHRyaW1taW5nCiogTnVtYmVyIG9mIHJlYWRzIG1hcHBlZCAtIGh1bWFuCiogJSByZWFkcyBtYXBwZWQgLSBodW1hbgoqIE51bWJlciBvZiByZWFkcyBtYXBwZWQgLSBMLnBhbmFtZW5zaXMKKiAlIHJlYWRzIG1hcHBlZCAtIEwucGFuYW1lbnNpcwoKVXNlIHRoZSBUY3J1emkgY29sb3JzLgoKKiBBMSBpcyBhIGxhcmdlIHRpdGxlOiAiTWFjcm9waGFnZSBTYW1wbGVzIgoqIFJvdyAyIGlzIHRoZSBibHVlIGNvbHVtbiBoZWFkaW5ncwoqIDMtbSBjb250YWlucyBNYWNyb3BoYWdlIG1ldGFkYXRhCiogbSsxIGlzIGJsYW5rCiogbSsyIGlzIGEgbGFyZ2UgdGl0bGU6ICJQQk1DIFNhbXBsZXMiCiogbSszLW4gY29udGFpbnMgUEJNQyBtZXRhZGF0YQoKIyBFbmQKCkF0IHRoaXMgcG9pbnQsIHdlIHNob3VsZCBoYXZlIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gdGhlIHZhcmlvdXMKYW5hbHlzZXMgb2YgdGhlIDQgc3ViLWV4cGVyaW1lbnRzLiAgU28gc2F2ZSB0aGUgY3VycmVudCBkYXRhIGZvciByZXVzZQplbHNld2hlcmUuCgpUaGUgZXhwZXJpbWVudGFsIGRlc2lnbiBpcyBhdmFpbGFibGUKW2hlcmVdKHNhbXBsZV9zaGVldHMvYWxsX3NhbXBsZXMtY29tYmluZWQueGxzeCIpLgoKYGBge3Igc2F2ZW1lfQptZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKdGhpc19zYXZlIDwtIHBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cm1kX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikKbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQp0bXAgPC0gc2F2ZW1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkKcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKYGBgCg==