diff --git a/.circleci/config.yml b/.circleci/config.yml index 820a4b46af..dea6d3c3e3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -20,20 +20,47 @@ jobs: name: Sample Distribution Analyses command: ./scripts/run_in_ci.sh bash "analyses/sample-distribution-analysis/run-sample-distribution.sh" + # TODO: The data files for CI need to be fixed https://github.com/AlexsLemonade/OpenPBTA-analysis/issues/527 + # - run: + # name: TP53 NF1 classifier run + # command: OPENPBTA_POLYAPLOT=0 ./scripts/run_in_ci.sh bash "analyses/tp53_nf1_score/run_classifier.sh" + # The analysis no longer needs to be tested as it has been retired and is better covered by 'SNV Caller Analysis' below. #- run: # name: Mutect2 vs Strelka2 # command: ./scripts/run_in_ci.sh Rscript -e "rmarkdown::render('analyses/mutect2-vs-strelka2/01-set-up.Rmd', clean = TRUE); # rmarkdown::render('analyses/mutect2-vs-strelka2/02-analyze-concordance.Rmd', clean = TRUE)" - - - run: - name: Collapse RSEM - command: ./scripts/run_in_ci.sh bash analyses/collapse-rnaseq/run-collapse-rnaseq.sh + + ### MOLECULAR SUBTYPING ### - run: name: Molecular Subtyping - HGG command: OPENPBTA_SUBSET=0 ./scripts/run_in_ci.sh bash analyses/molecular-subtyping-HGG/run-molecular-subtyping-HGG.sh + - run: + name: Molecular subtyping - Non-MB/Non-ATRT Embryonal tumors + command: OPENPBTA_SUBSET=0 ./scripts/run_in_ci.sh bash analyses/molecular-subtyping-embryonal/run-embryonal-subtyping.sh + + - run: + name: Molecular Subtyping and Plotting - ATRT + command: OPENPBTA_SUBSET=0 ./scripts/run_in_ci.sh bash analyses/molecular-subtyping-ATRT/run-molecular-subtyping-ATRT.sh + + - run: + name: Molecular subtyping Chordoma + command: ./scripts/run_in_ci.sh Rscript -e "rmarkdown::render('analyses/molecular-subtyping-chordoma/01-Subtype-chordoma.Rmd', clean = TRUE)" + + + # Deprecated - these results do not include germline calls and therefore are insufficient by subtyping + # - run: + # name: SHH TP53 Molecular Subtyping + # command: ./scripts/run_in_ci.sh Rscript -e "rmarkdown::render('analyses/molecular-subtyping-SHH-tp53/SHH-tp53-molecular-subtyping-data-prep.Rmd', clean = TRUE)" + + ### END MOLECULAR SUBTYPING ### + + - run: + name: Collapse RSEM + command: ./scripts/run_in_ci.sh bash analyses/collapse-rnaseq/run-collapse-rnaseq.sh + - run: name: Immune deconvolution using xCell and MCP-Counter command: OPENPBTA_DECONV_METHOD="mcp_counter" ./scripts/run_in_ci.sh bash analyses/immune-deconv/run-immune-deconv.sh @@ -85,10 +112,6 @@ jobs: name: Tumor mutation burden with TCGA command: ./scripts/run_in_ci.sh Rscript -e "rmarkdown::render('analyses/tmb-compare-tcga/compare-tmb.Rmd', clean = TRUE)" - - run: - name: Molecular subtyping - Non-MB/Non-ATRT Embryonal tumors - command: OPENPBTA_SUBSET=0 ./scripts/run_in_ci.sh bash analyses/molecular-subtyping-embryonal/run-embryonal-subtyping.sh - - run: name: Copy number consensus command: ./scripts/run_in_ci.sh bash "analyses/copy_number_consensus_call/run_consensus_call.sh" @@ -104,11 +127,7 @@ jobs: - run: name: Comparative RNASeq - generate correlation matrix - rsem-tpm.stranded command: ./scripts/run_in_ci.sh python3 analyses/comparative-RNASeq-analysis/01-correlation-matrix.py ../../data/pbta-gene-expression-rsem-tpm.stranded.rds --output-prefix rsem-tpm-stranded- --verbose - - - run: - name: Molecular Subtyping and Plotting - ATRT - command: OPENPBTA_SUBSET=0 ./scripts/run_in_ci.sh bash analyses/molecular-subtyping-ATRT/run-molecular-subtyping-ATRT.sh - + - run: name: Process SV file command: ./scripts/run_in_ci.sh Rscript analyses/sv-analysis/01-process-sv-file.R @@ -116,20 +135,11 @@ jobs: - run: name: Oncoprint plotting command: ./scripts/run_in_ci.sh bash "analyses/oncoprint-landscape/run-oncoprint.sh" - - - run: - name: TP53 NF1 classifier run - command: OPENPBTA_POLYAPLOT=0 ./scripts/run_in_ci.sh bash "analyses/tp53_nf1_score/run_classifier.sh" - run: name: GISTIC Plots command: ./scripts/run_in_ci.sh Rscript -e "rmarkdown::render('analyses/cnv-chrom-plot/gistic_plot.Rmd', clean = TRUE)" - # Deprecated - these results do not include germline calls and therefore are insufficient by subtyping - # - run: - # name: SHH TP53 Molecular Subtyping - # command: ./scripts/run_in_ci.sh Rscript -e "rmarkdown::render('analyses/molecular-subtyping-SHH-tp53/SHH-tp53-molecular-subtyping-data-prep.Rmd', clean = TRUE)" - - run: name: Gene set enrichment analysis to generate GSVA scores command: OPENPBTA_TESTING=1 ./scripts/run_in_ci.sh bash "analyses/gene-set-enrichment-analysis/run-gsea.sh" @@ -142,10 +152,6 @@ jobs: name: Fusion Summary command: OPENPBTA_TESTING=1 ./scripts/run_in_ci.sh bash "analyses/fusion-summary/run-new-analysis.sh" - - run: - name: Molecular subtyping Chordoma - command: ./scripts/run_in_ci.sh Rscript -e "rmarkdown::render('analyses/molecular-subtyping-chordoma/01-Subtype-chordoma.Rmd', clean = TRUE)" - - run: name: Telomerase activity command: ./scripts/run_in_ci.sh bash analyses/telomerase-activity-prediction/RUN-telomerase-activity-prediction.sh diff --git a/analyses/chromosomal-instability/01b-visualization-cnv-sv.Rmd b/analyses/chromosomal-instability/01b-visualization-cnv-sv.Rmd index a5cfeb7768..ffb277b82d 100644 --- a/analyses/chromosomal-instability/01b-visualization-cnv-sv.Rmd +++ b/analyses/chromosomal-instability/01b-visualization-cnv-sv.Rmd @@ -88,11 +88,8 @@ metadata <- readr::read_tsv(file.path(data_dir, "pbta-histologies.tsv")) Read in the CNV data. ```{r} -# TODO: update file path when consensus is added to data release cnv_df <- data.table::fread( - file.path("..", - "copy_number_consensus_call", - "results", + file.path(data_dir, "pbta-cnv-consensus.seg.gz"), data.table = FALSE ) @@ -307,7 +304,7 @@ circos_map_plot( ```{r} circos_map_transloc(transloc_df, add_track = FALSE, # We change this to true to add on to our already existing plot - sample_names = samples_for_examples[1], + sample_names = sample(transloc_df$biospecimen_id1, 1), samples_col = "biospecimen_id1", chr_col_1 = "chrom1", # Need to specify which column is the first and second location for each chr_col_2 = "chrom2", @@ -326,7 +323,7 @@ png(file.path(plots_dir, "transloc_circos_plot.png"), width = 800, height = 800) # Run function per usual circos_map_transloc(transloc_df, add_track = FALSE, - sample_names = samples_for_examples[1], + sample_names = sample(transloc_df$biospecimen_id1, 1), samples_col = "biospecimen_id1", chr_col_1 = "chrom1", chr_col_2 = "chrom2", diff --git a/analyses/chromosomal-instability/01b-visualization-cnv-sv.nb.html b/analyses/chromosomal-instability/01b-visualization-cnv-sv.nb.html index 65218600e9..06c7f5209d 100644 --- a/analyses/chromosomal-instability/01b-visualization-cnv-sv.nb.html +++ b/analyses/chromosomal-instability/01b-visualization-cnv-sv.nb.html @@ -2986,8 +2986,8 @@
# Set seed so heatmaps turn out the same
+
+# Set seed so plots turn out the same
set.seed(2020)
# Magrittr pipe
@@ -3027,7 +3027,7 @@ Read in data
# Read in the metadata
metadata <- readr::read_tsv(file.path(data_dir, "pbta-histologies.tsv"))
-
+
Parsed with column specification:
cols(
.default = col_character(),
@@ -3039,13 +3039,13 @@ Read in data
molecular_subtype = [33mcol_logical()[39m
)
See spec(...) for full column specifications.
-221 parsing failures.
+493 parsing failures.
row col expected actual file
-2606 molecular_subtype 1/0/T/F/TRUE/FALSE Group3 '../../data/pbta-histologies.tsv'
-2607 molecular_subtype 1/0/T/F/TRUE/FALSE Group4 '../../data/pbta-histologies.tsv'
-2608 molecular_subtype 1/0/T/F/TRUE/FALSE Group3 '../../data/pbta-histologies.tsv'
-2609 molecular_subtype 1/0/T/F/TRUE/FALSE Group3 '../../data/pbta-histologies.tsv'
-2610 molecular_subtype 1/0/T/F/TRUE/FALSE Group3 '../../data/pbta-histologies.tsv'
+2334 molecular_subtype 1/0/T/F/TRUE/FALSE Group3 '../../data/pbta-histologies.tsv'
+2335 molecular_subtype 1/0/T/F/TRUE/FALSE Group4 '../../data/pbta-histologies.tsv'
+2336 molecular_subtype 1/0/T/F/TRUE/FALSE Group3 '../../data/pbta-histologies.tsv'
+2337 molecular_subtype 1/0/T/F/TRUE/FALSE Group3 '../../data/pbta-histologies.tsv'
+2338 molecular_subtype 1/0/T/F/TRUE/FALSE Group3 '../../data/pbta-histologies.tsv'
.... ................. .................. ...... .................................
See problems(...) for more details.
@@ -3054,12 +3054,9 @@ Read in data
Read in the CNV data.
-
-# TODO: update file path when consensus is added to data release
-cnv_df <- data.table::fread(
- file.path("..",
- "copy_number_consensus_call",
- "results",
+
+cnv_df <- data.table::fread(
+ file.path(data_dir,
"pbta-cnv-consensus.seg.gz"),
data.table = FALSE
)
@@ -3310,10 +3307,10 @@ Example uses of circos_map_plot
Example 4 making a translocation plot.
-
+
circos_map_transloc(transloc_df,
add_track = FALSE, # We change this to true to add on to our already existing plot
- sample_names = samples_for_examples[1],
+ sample_names = sample(transloc_df$biospecimen_id1, 1),
samples_col = "biospecimen_id1",
chr_col_1 = "chrom1", # Need to specify which column is the first and second location for each
chr_col_2 = "chrom2",
@@ -3324,20 +3321,20 @@ Example uses of circos_map_plot
)
-
+
Example 5 Saving a plot.
-
+
# Open up PNG file
png(file.path(plots_dir, "transloc_circos_plot.png"), width = 800, height = 800)
# Run function per usual
circos_map_transloc(transloc_df,
add_track = FALSE,
- sample_names = samples_for_examples[1],
+ sample_names = sample(transloc_df$biospecimen_id1, 1),
samples_col = "biospecimen_id1",
chr_col_1 = "chrom1",
chr_col_2 = "chrom2",
@@ -3365,7 +3362,7 @@ Session Info
sessionInfo()
-
+
R version 3.6.0 (2019-04-26)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 9 (stretch)
@@ -3374,61 +3371,84 @@ Session Info
BLAS/LAPACK: /usr/lib/libopenblasp-r0.2.19.so
locale:
- [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
- [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=C LC_PAPER=en_US.UTF-8 LC_NAME=C
- [9] LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
+ [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
+ [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
+ [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=C
+ [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
+ [9] LC_ADDRESS=C LC_TELEPHONE=C
+[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
-other attached packages:
-[1] optparse_1.6.2
-
loaded via a namespace (and not attached):
- [1] colorspace_1.4-1 rjson_0.2.20 biovizBase_1.34.1
- [4] circlize_0.4.8 htmlTable_1.13.1 XVector_0.26.0
- [7] GenomicRanges_1.38.0 GlobalOptions_0.1.1 base64enc_0.1-3
- [10] dichromat_2.0-0 clue_0.3-57 rstudioapi_0.10
- [13] getopt_1.20.3 bit64_0.9-7 AnnotationDbi_1.48.0
- [16] R.methodsS3_1.7.1 splines_3.6.0 ggbio_1.34.0
- [19] knitr_1.23 Formula_1.2-3 jsonlite_1.6
- [22] Rsamtools_2.2.1 cluster_2.1.0 dbplyr_1.4.2
- [25] R.oo_1.22.0 png_0.1-7 graph_1.62.0
- [28] BiocManager_1.30.4 readr_1.3.1 compiler_3.6.0
- [31] httr_1.4.0 backports_1.1.4 assertthat_0.2.1
- [34] Matrix_1.2-17 lazyeval_0.2.2 cli_1.1.0
- [37] acepack_1.4.1 htmltools_0.3.6 prettyunits_1.0.2
- [40] tools_3.6.0 gtable_0.3.0 glue_1.3.1
- [43] GenomeInfoDbData_1.2.2 reshape2_1.4.3 dplyr_0.8.3
- [46] rappdirs_0.3.1 Rcpp_1.0.1 Biobase_2.46.0
- [49] styler_1.1.1 Biostrings_2.54.0 rtracklayer_1.46.0
- [52] xfun_0.8 stringr_1.4.0 ensembldb_2.10.2
- [55] XML_3.98-1.20 zlibbioc_1.32.0 scales_1.0.0
- [58] BSgenome_1.54.0 VariantAnnotation_1.32.0 hms_0.4.2
- [61] ProtGenerics_1.18.0 RBGL_1.62.1 parallel_3.6.0
- [64] SummarizedExperiment_1.16.0 rematch2_2.0.1 AnnotationFilter_1.10.0
- [67] RColorBrewer_1.1-2 ComplexHeatmap_2.2.0 yaml_2.2.0
- [70] curl_3.3 memoise_1.1.0 gridExtra_2.3
- [73] ggplot2_3.2.0 biomaRt_2.42.0 rpart_4.1-15
- [76] reshape_0.8.8 latticeExtra_0.6-28 stringi_1.4.3
- [79] RSQLite_2.1.1 S4Vectors_0.24.1 checkmate_1.9.4
- [82] GenomicFeatures_1.38.0 BiocGenerics_0.32.0 BiocParallel_1.20.0
- [85] shape_1.4.4 GenomeInfoDb_1.22.0 rlang_0.4.0
- [88] pkgconfig_2.0.2 matrixStats_0.55.0 bitops_1.0-6
- [91] evaluate_0.14 lattice_0.20-38 purrr_0.3.2
- [94] labeling_0.3 GenomicAlignments_1.22.1 htmlwidgets_1.3
- [97] cowplot_0.9.4 bit_1.1-14 tidyselect_0.2.5
-[100] GGally_1.4.0 plyr_1.8.4 magrittr_1.5
-[103] R6_2.4.0 IRanges_2.20.1 Hmisc_4.2-0
-[106] DelayedArray_0.12.0 DBI_1.0.0 withr_2.1.2
-[109] pillar_1.4.2 foreign_0.8-71 survival_2.44-1.1
-[112] RCurl_1.95-4.12 nnet_7.3-12 tibble_2.1.3
-[115] crayon_1.3.4 OrganismDbi_1.28.0 BiocFileCache_1.10.2
-[118] rmarkdown_1.13 GetoptLong_0.1.7 progress_1.2.2
-[121] grid_3.6.0 data.table_1.12.2 blob_1.1.1
-[124] digest_0.6.20 tidyr_0.8.3 R.utils_2.9.0
-[127] openssl_1.4 stats4_3.6.0 munsell_0.5.0
-[130] askpass_1.1
+ [1] colorspace_1.4-1 rjson_0.2.20
+ [3] rprojroot_1.3-2 biovizBase_1.34.1
+ [5] circlize_0.4.8 htmlTable_1.13.1
+ [7] XVector_0.26.0 GenomicRanges_1.38.0
+ [9] GlobalOptions_0.1.1 base64enc_0.1-3
+ [11] dichromat_2.0-0 clue_0.3-57
+ [13] rstudioapi_0.10 bit64_0.9-7
+ [15] AnnotationDbi_1.48.0 R.methodsS3_1.7.1
+ [17] splines_3.6.0 ggbio_1.34.0
+ [19] knitr_1.23 Formula_1.2-3
+ [21] jsonlite_1.6 colorblindr_0.1.0
+ [23] Rsamtools_2.2.1 cluster_2.1.0
+ [25] dbplyr_1.4.2 R.oo_1.22.0
+ [27] png_0.1-7 graph_1.62.0
+ [29] BiocManager_1.30.4 readr_1.3.1
+ [31] compiler_3.6.0 httr_1.4.0
+ [33] backports_1.1.4 assertthat_0.2.1
+ [35] Matrix_1.2-17 lazyeval_0.2.2
+ [37] cli_1.1.0 acepack_1.4.1
+ [39] htmltools_0.3.6 prettyunits_1.0.2
+ [41] tools_3.6.0 gtable_0.3.0
+ [43] glue_1.3.1 GenomeInfoDbData_1.2.2
+ [45] reshape2_1.4.3 dplyr_0.8.3
+ [47] rappdirs_0.3.1 Rcpp_1.0.1
+ [49] Biobase_2.46.0 styler_1.1.1
+ [51] Biostrings_2.54.0 rtracklayer_1.46.0
+ [53] xfun_0.8 stringr_1.4.0
+ [55] ensembldb_2.10.2 XML_3.98-1.20
+ [57] zlibbioc_1.32.0 scales_1.0.0
+ [59] BSgenome_1.54.0 VariantAnnotation_1.32.0
+ [61] hms_0.4.2 ProtGenerics_1.18.0
+ [63] ggupset_0.1.0.9000 RBGL_1.62.1
+ [65] parallel_3.6.0 SummarizedExperiment_1.16.1
+ [67] AnnotationFilter_1.10.0 rematch2_2.0.1
+ [69] RColorBrewer_1.1-2 ComplexHeatmap_2.2.0
+ [71] yaml_2.2.0 curl_3.3
+ [73] memoise_1.1.0 gridExtra_2.3
+ [75] ggplot2_3.2.0 biomaRt_2.42.0
+ [77] rpart_4.1-15 reshape_0.8.8
+ [79] latticeExtra_0.6-28 stringi_1.4.3
+ [81] RSQLite_2.1.1 S4Vectors_0.24.1
+ [83] checkmate_1.9.4 GenomicFeatures_1.38.0
+ [85] BiocGenerics_0.32.0 BiocParallel_1.20.1
+ [87] shape_1.4.4 GenomeInfoDb_1.22.0
+ [89] rlang_0.4.0 pkgconfig_2.0.2
+ [91] matrixStats_0.55.0 bitops_1.0-6
+ [93] evaluate_0.14 lattice_0.20-38
+ [95] purrr_0.3.2 GenomicAlignments_1.22.1
+ [97] htmlwidgets_1.3 labeling_0.3
+ [99] cowplot_0.9.4 bit_1.1-14
+[101] tidyselect_0.2.5 GGally_1.4.0
+[103] plyr_1.8.4 magrittr_1.5
+[105] R6_2.4.0 IRanges_2.20.1
+[107] Hmisc_4.2-0 DelayedArray_0.12.2
+[109] DBI_1.0.0 pillar_1.4.2
+[111] foreign_0.8-71 withr_2.1.2
+[113] survival_2.44-1.1 RCurl_1.95-4.12
+[115] nnet_7.3-12 tibble_2.1.3
+[117] crayon_1.3.4 OrganismDbi_1.28.0
+[119] BiocFileCache_1.10.2 rmarkdown_1.13
+[121] GetoptLong_0.1.7 progress_1.2.2
+[123] grid_3.6.0 data.table_1.12.2
+[125] blob_1.1.1 forcats_0.4.0
+[127] digest_0.6.20 tidyr_0.8.3
+[129] R.utils_2.9.0 openssl_1.4
+[131] stats4_3.6.0 munsell_0.5.0
+[133] askpass_1.1
@@ -3436,7 +3456,7 @@ Session Info
-LS0tCnRpdGxlOiAiQ2lyY29zIFBsb3RzIEV4YW1wbGVzIGZvciBWaXN1YWxpemluZyBTViBhbmQgQ05WIGRhdGEiCm91dHB1dDogICAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCmF1dGhvcjogQ2FuZGFjZSBTYXZvbmVuIGZvciBBTFNGIC0gQ0NETApkYXRlOiAyMDIwCi0tLQoKVGhpcyBub3RlYm9vayBzaG93cyBleGFtcGxlcyBvZiBob3cgdG8gdXNlIHRoZSBjaXJjb3NfbWFwX3Bsb3QgZnVuY3Rpb24gZm9yIAptYXBwaW5nIGRhdGEgdGhhdCBjb3JyZXNwb25kcyB0byBjaHJvbW9zb21hbCBjb29yZGluYXRlcy4KCkNvcnJlc3BvbmRzIHRvIFtpc3N1ZSAzOTddKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzL2lzc3Vlcy8zOTcpLgoKIyMjIFVzYWdlCgpUaGlzIG5vdGVib29rIGNhbiBiZSBydW4gdmlhIHRoZSBjb21tYW5kIGxpbmUgZnJvbSB0aGUgdG9wIGRpcmVjdG9yeSBvZiB0aGUgCnJlcG9zaXRvcnkgYXMgZm9sbG93czoKCmBgYApSc2NyaXB0IC1lICJybWFya2Rvd246OnJlbmRlcignYW5hbHlzZXMvY2hyb21vc29tYWwtaW5zdGFiaWxpdHkvMDFiLXZpc3VhbGl6YXRpb24tY252LXN2LlJtZCcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbiA9IFRSVUUpIgpgYGAKCiMjIENpcmN1bGFyIHBsb3RzIGZ1bmN0aW9uczogClRvIHVzZSB0aGUgZnVuY3Rpb25zLCBzb3VyY2UgdGhlIGZ1bmN0aW9ucyBmaWxlOiBgc291cmNlKGZpbGUucGF0aCgidXRpbCIsICJjaXJjb3MtcGxvdHMuUiIpKWAKVGhpcyBmaWxlIGluY2x1ZGVzIHRocmVlIGZ1bmN0aW9ucywgYnV0IG9uZSBpcyBpbnRlcm5hbC4gCgoqKlRoZSB0d28gZnVuY3Rpb25zIHRvIHVzZToqKgoKYGNpcmNvc19tYXBfcGxvdGA6IEdpdmVuIGEgZGF0YS5mcmFtZSB3aXRoIGNocm9tb3NvbWFsIGNvb3JkaW5hdGVzLCBhbmQgYSBjb3JyZXNwb25kaW5nIGRhdGEgdmFsdWUgdG8gcGxvdCwgbWFrZSBhIGNpcmNvcyBwbG90IG9yIGFkZCBhIGNpcmN1bGFyIHRyYWNrIHRvIGFuIGV4aXN0aW5nIHBsb3QuICAKYGNpcmNvc19tYXBfdHJhbnNsb2NgOiBHaXZlbiBhIGRhdGEuZnJhbWUgd2l0aCB0d28gc2V0cyBvZiBjb29yZGluYXRlcywgbWFwIHRoZSBsaW5rcyBiZXR3ZWVuIHRob3NlIGNvb3JkaW5hdGVzIG9uIGEgbmV3IG9yIGV4aXNpdG5nIGNpcmN1bGFyIHBsb3QuICAKCiMjIEZ1bmN0aW9uIEFyZ3VtZW50cyBEZXNjcmlwdGlvbnMKCi0gYGRmYDogYSBkYXRhLmZyYW1lIHdpdGggdGhlIGNocm9tb3NvbWFsIGNvb3JkaW5hdGVzIGFuZCB5IHZhbHVlIHRvIHBsb3QuICAKLSBgYWRkX3RyYWNrYDogSWYgdHJ1ZSwgYWRkcyBhIHRyYWNrIHRvIGEgY3VycmVudCBwbG90LCBpZiBgRkFMU0VgLCBzdGFydHMgYSBuZXcgcGxvdC4gIAotIGBzYW1wbGVzX2NvbGA6IGEgY2hhcmFjdGVyIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzYW1wbGVzIGNvbHVtbiB3aGljaCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgYnkuICAKLSBgc2FtcGxlX25hbWVzYDogYSBjaGFyYWN0ZXIgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHZhbHVlcyB0byBrZWVwIGZyb20gYHNhbXBsZXNfY29sYCBjb2x1bW4uIGAiYWxsImAga2VlcHMgYWxsIHNhbXBsZXMgaW4uICAgCi0gYGNocl9jb2xgOiBhIGNoYXJhY3RlciBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIGNocm9tb3NvbWVzIGNvbHVtbiBuYW1lLiAgCi0gYHN0YXJ0X2NvbGA6IGEgY2hhcmFjdGVyIHN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgc3RhcnQgY29vcmRpbmF0ZSBjb2x1bW4gbmFtZS4gIAotIGBlbmRfY29sYDogYSBjaGFyYWN0ZXIgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBlbmQgY29vcmRpbmF0ZSBjb2x1bW4gbmFtZS4gIAotIGB5X3ZhbGA6IFRoZSBjb2x1bW4gbmFtZSBvZiB0aGUgdmFsdWUgeW91IHdvdWxkIGxpa2UgdG8gcGxvdC4gCi0gYGNvbG9yX2NvbGA6IGEgY29sdW1uIHdpdGggY29sb3Igc3BlY2lmaWNhdGlvbnMgZm9yIGVhY2ggZGF0YSBwb2ludC4gCi0gYHRyYWNrX2hlaWdodGA6IGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSB0aGF0IGRlc2lnbmF0ZXMgaGVpZ2h0LCBkZWZhdWx0IGlzIGAuMTVgLiAxID0gdGhlIGZ1bGwgZGlhbWV0ZXIgb2YgdGhlIGNpcmN1bGFyIHBsb3QuICAKLSBgdHlwZWA6IFR5cGUgb2YgcGxvdCB0aGUgdHJhY2sgc2hvdWxkIGJlLiBPcHRpb25zIGFyZSBgbGluZWAsIGBwb2ludGAsIGByZWN0YC4gIAotIGByZWN0X2hlaWdodGA6IFRoZSBhZGRlZCBoZWlnaHQgKHBsdXMgYW5kIG1pbnVzIHlfdmFsKSB0aGF0IHNob3VsZCBiZSBwbG90dGVkLiAKLSBgY3l0b2JhbmRgOiBgVFJVRS9GQUxTRWAgaW5kaWNhdGluZyB3aGV0aGVyIHlvdSB3YW50IGEgY3l0b2JhbmQgb24gdGhlIApvdXRlcm1vc3Qgb2YgdGhlIHBsb3QuIERlZmF1bHQgaXMgVFJVRS4gIAotIGBzaW5nbGVfY29sb3JgOiBBIHNpbmdsZSBjb2xvciB0byBjaG9vc2UuIEFuIGFsdGVybmF0aXZlIHRvIGBjb2xvcl9jb2xgLgoKIyMjIFNldCBVcAoKYGBge3J9CiMgU2V0IHNlZWQgc28gcGxvdHMgdHVybiBvdXQgdGhlIHNhbWUKc2V0LnNlZWQoMjAyMCkKCiMgTWFncml0dHIgcGlwZQpgJT4lYCA8LSBkcGx5cjo6YCU+JWAKYGBgCgpSZWFkIGluIHRoZSBjdXN0b20gZnVuY3Rpb25zLgoKYGBge3J9CnNvdXJjZShmaWxlLnBhdGgoInV0aWwiLCAiY2lyY29zLXBsb3RzLlIiKSkKYGBgCgojIyMgRGlyZWN0b3JpZXMgYW5kIEZpbGVzCgpgYGB7cn0KIyBQYXRoIHRvIGRhdGEgZGlyZWN0b3J5CmRhdGFfZGlyIDwtIGZpbGUucGF0aCgiLi4iLCAiLi4iLCAiZGF0YSIpCgojIFBhdGggdG8gb3V0cHV0IGRpcmVjdG9yeQpwbG90c19kaXIgPC0gInBsb3RzIgpgYGAKCiMjIyBSZWFkIGluIGRhdGEgCgpTZXQgdXAgbWV0YWRhdGEKCmBgYHtyfQojIFJlYWQgaW4gdGhlIG1ldGFkYXRhCm1ldGFkYXRhIDwtIHJlYWRyOjpyZWFkX3RzdihmaWxlLnBhdGgoZGF0YV9kaXIsICJwYnRhLWhpc3RvbG9naWVzLnRzdiIpKQpgYGAKClJlYWQgaW4gdGhlIENOViBkYXRhLiAKCmBgYHtyfQojIFRPRE86IHVwZGF0ZSBmaWxlIHBhdGggd2hlbiBjb25zZW5zdXMgaXMgYWRkZWQgdG8gZGF0YSByZWxlYXNlCmNudl9kZiA8LSBkYXRhLnRhYmxlOjpmcmVhZCgKICBmaWxlLnBhdGgoIi4uIiwgCiAgICAgICAgICAgICJjb3B5X251bWJlcl9jb25zZW5zdXNfY2FsbCIsIAogICAgICAgICAgICAicmVzdWx0cyIsCiAgICAgICAgICAgICJwYnRhLWNudi1jb25zZW5zdXMuc2VnLmd6IiksCiAgZGF0YS50YWJsZSA9IEZBTFNFCikgCmBgYAoKQ3JlYXRlIGEgc3RhdHVzIHZhcmlhYmxlIGJhc2VkIG9uIGNvcHkgbnVtYmVyIGFuZCB0dW1vciBwbG9pZHkuIApUaGlzIGlzIGxvZ2ljIHdhcyBib3Jyb3dlZCBmcm9tIFtgZm9jYWwtY24tZmlsZS1wcmVwYXJhdGlvbmAgbW9kdWxlXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcy9ibG9iLzg2YmQ2MzRhOTI4ZGIzZjQ2MDMyODIxMGUzOGM3ZGMxNzk3ZDEzMDQvYW5hbHlzZXMvZm9jYWwtY24tZmlsZS1wcmVwYXJhdGlvbi8wMi1hZGQtcGxvaWR5LWNvbnNlbnN1cy5SbWQjTDc0KS4KCmBgYHtyfQpjbnZfZGYgPC0gY252X2RmICU+JSAKICAjIE9ubHkga2VlcCBkYXRhIHRoYXQgaGFzIHZhbHVlcyBmb3IgY29weS5udW0KICBkcGx5cjo6ZmlsdGVyKCFpcy5uYShjb3B5Lm51bSkpICU+JQogICMgVGFjayBvbiB0aGUgcGxvaWR5IGFuZCBzZXggZXN0aW1hdGUgaW5mb3JtYXRpb24gZnJvbSBtZXRhZGF0YQogIGRwbHlyOjppbm5lcl9qb2luKAogICAgZHBseXI6OnNlbGVjdChtZXRhZGF0YSwgCiAgICAgICAgICAgICAgICAgIEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQsIAogICAgICAgICAgICAgICAgICB0dW1vcl9wbG9pZHksCiAgICAgICAgICAgICAgICAgIGdlcm1saW5lX3NleF9lc3RpbWF0ZSksIAogICAgICAgICAgICAgYnkgPSBjKCJJRCIgPSAiS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCIpKSAlPiUKICAjIENyZWF0ZSBhIHN0YXR1cyB2YXJpYWJsZQogIGRwbHlyOjptdXRhdGUoc3RhdHVzID0gZHBseXI6OmNhc2Vfd2hlbigKICAgICMgd2hlbiB0aGUgY29weSBudW1iZXIgaXMgbGVzcyB0aGFuIGluZmVycmVkIHBsb2lkeSwgbWFyayB0aGlzIGFzIGEgbG9zcwogICAgY29weS5udW0gPCB0dW1vcl9wbG9pZHkgfiAibG9zcyIsCiAgICAjIGlmIGNvcHkgbnVtYmVyIGlzIGhpZ2hlciB0aGFuIHBsb2lkeSwgbWFyayBhcyBhIGdhaW4KICAgIGNvcHkubnVtID4gdHVtb3JfcGxvaWR5IH4gImdhaW4iLAogICAgY29weS5udW0gPT0gdHVtb3JfcGxvaWR5IH4gIm5ldXRyYWwiCiAgKSwgCiAgc3RhdHVzID0gZmFjdG9yKHN0YXR1cywgbGV2ZWxzID0gYygibG9zcyIsICJuZXV0cmFsIiwgImdhaW4iKSkpCmBgYAoKUmVhZCBpbiB0aGUgU1YgZGF0YS4gCgpgYGB7cn0Kc3ZfZGYgPC0gZGF0YS50YWJsZTo6ZnJlYWQoCiAgZmlsZS5wYXRoKGRhdGFfZGlyLCAicGJ0YS1zdi1tYW50YS50c3YuZ3oiKSwKICBkYXRhLnRhYmxlID0gRkFMU0UKKQpgYGAKCk1ha2UgYSB0cmFuc2xvY2F0aW9uIGRhdGEuZnJhbWUgd2hlcmUgYm90aCBzZXRzIG9mIGNvb3JkaW5hdGVzIGZvciB0aGUgdHJhbnNsb2NhdGlvbiBhcmUgaW4gdGhlIHNhbWUgcm93LgoKYGBge3J9CnRyYW5zbG9jX2RmIDwtIHN2X2RmICU+JQogIGRwbHlyOjpmaWx0ZXIoU1YudHlwZSA9PSAiQk5EIikgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIG1hdGNoX2lkID0gc3RyaW5ncjo6c3RyX3N1YihJRCwgMCwgLTMpLAogICAgcGFpcl9udW0gPSBzdHJpbmdyOjpzdHJfc3ViKElELCAtMSkKICApICU+JQogIGRwbHlyOjpzZWxlY3QoCiAgICBiaW9zcGVjaW1lbl9pZCA9IEtpZHMuRmlyc3QuQmlvc3BlY2ltZW4uSUQuVHVtb3IsCiAgICBjaHJvbSA9IFNWLmNocm9tLAogICAgc3RhcnQgPSBTVi5zdGFydCwKICAgIGVuZCA9IFNWLmVuZCwKICAgIHdpZHRoID0gU1YubGVuZ3RoLAogICAgbWF0Y2hfaWQsCiAgICBwYWlyX251bQogICkKCnRyYW5zbG9jX2RmIDwtIHRyYW5zbG9jX2RmICU+JQogIGRwbHlyOjpmaWx0ZXIocGFpcl9udW0gPT0gMCkgJT4lCiAgZHBseXI6OmlubmVyX2pvaW4oZHBseXI6OmZpbHRlcih0cmFuc2xvY19kZiwgcGFpcl9udW0gPT0gMSksCiAgICBieSA9ICJtYXRjaF9pZCIsCiAgICBzdWZmaXggPSBjKCIxIiwgIjIiKQogICkKYGBgCgpMZXQncyBnZXQgc29tZSBzYW1wbGUgSURzIHRvIHBsYXkgd2l0aCBpbiB0aGVzZSBleGFtcGxlcy4gCgpgYGB7cn0Kc2FtcGxlc19mb3JfZXhhbXBsZXMgPC0gc2FtcGxlKGNudl9kZiRJRCwgNSkKYGBgCgojIyBNYWtpbmcgY29sb3Iga2V5cyBleGFtcGxlcwpUaGUgYGNpcmNvc19tYXBfcGxvdGAgZnVuY3Rpb25zIHRha2UgY29sdW1ucyB0aGF0IHNwZWNpZnkgdGhlIGNvbG9ycyBmb3IgZWFjaCBkYXRhIHJvdy4gCkhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgaG93IHRvIHNldCB1cCBjb2xvciBjb2x1bW5zIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aGUgY2lyY29zCmZ1bmN0aW9ucyBhcyB0aGUgYGNvbG9yX2NvbGAgYXJndW1lbnQuIAoKKipOdW1lcmljYWxseSBiYXNlZCBjb2xvciBrZXk6KiogCgpgYGB7cn0KIyBNYWtlIGNvbG9yIHBhbGV0dGUgYmFzZWQgb24gNSBjb2xvcnMKcGFsZXR0ZV9jb2wgPC0gUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJBY2NlbnQiICMgQ2FuIGNoYW5nZSB0aGlzIHBhbGV0dGUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzZSBSQ29sb3JCcmV3ZXI6OmRpc3BsYXkuYnJld2VyLmFsbCgpIHRvIHNlZSBvcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCgojIE1ha2UgY29sb3IgcmFtcCBmdW5jdGlvbiBiYXNlZCBvbiBxdWFudGlsZXMgb2Ygc2VnLm1lYW4gYW5kIHBhbGV0dGUKY29sb3JfZnVuIDwtIGNpcmNsaXplOjpjb2xvclJhbXAyKAogIGJyZWFrcyA9IHF1YW50aWxlKGNudl9kZiRzZWcubWVhbiwgCiAgICAgICAgICAgICAgICAgICAgYygwLjE1LCAwLjM1LCAwLjUsIDAuNjUsIDAuODUpLCBuYS5ybSA9IFRSVUUpLCAKICBjb2xvcnMgPSBwYWxldHRlX2NvbCkKYGBgCgpBZGQgbnVtZXJpY2FsbHkgYmFzZWQgY29sb3IgY29sdW1uIHRvIGBjbnZfZGZgLgoKYGBge3J9CmNudl9kZiA8LSBjbnZfZGYgJT4lCiAgIyBNYWtlIGNvbHVtbiB0aGF0IHNwZWNpZmllcyB0aGUgY29sb3IgZm9yIGVhY2ggdmFsdWUKICBkcGx5cjo6bXV0YXRlKG51bV9jb2xvcl9rZXkgPSBjb2xvcl9mdW4oY29weS5udW0pKQpgYGAKCkNhbiBydW4gdGhpcyB0byBzZWUgb3RoZXIgcGFsZXR0ZXMgYmVzaWRlcyBgQWNjZW50YC4KCmBgYHtyfQpSQ29sb3JCcmV3ZXI6OmRpc3BsYXkuYnJld2VyLmFsbCgpCmBgYAoKKipGYWN0b3ItYmFzZWQgY29sb3Iga2V5czoqKiAKSGVyZSB3ZSB3aWxsIGFkZCBhIGNvbHVtbiB0byBgY252X2RmYCB0aGF0IGNvbG9yIGNvZGVzIGJhc2VkIG9uIHRoZSBgc3RhdHVzYCAKY29sdW1uIHdoaWNoIGhhcyB0aHJlZSBjYXRlZ29yaWVzLiAKCmBgYHtyfQojIExldCdzIGRldGVybWluZSBob3cgbWFueSBsZXZlbHMgdGhpcyBmYWN0b3IgY29sdW1uIGhhcwpuX2xldmVscyA8LSBsZW5ndGgobGV2ZWxzKGNudl9kZiRzdGF0dXMpKQoKIyBTZXQgdXAgYSBwYWxldHRlIGJhc2VkIG9uIG51bWJlciBvZiBmYWN0b3IgbGV2ZWxzCnBhbGV0dGVfY29sIDwtIFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbChuX2xldmVscywgbmFtZSA9ICJBY2NlbnQiKQoKIyBMZXQncyBtYWtlIGEga2V5IHRvIHJlY29kZSBieSBiYXNlZCBvbiBsZXZlbHMKcGFsZXR0ZV9rZXkgPC0gcGFsZXR0ZV9jb2wKCiMgSGF2ZSB0aGUgZmFjdG9yIGxldmVscyBiZSB0aGUgbmFtZXMKbmFtZXMocGFsZXR0ZV9rZXkpIDwtIGxldmVscyhjbnZfZGYkc3RhdHVzKQoKIyBQcmV2aWV3IHRoaXMKcGFsZXR0ZV9rZXkKYGBgCgpBZGQgZmFjdG9yIGJhc2VkIGNvbG9yIGNvbHVtbiB0byBjbnZfZGYKCmBgYHtyfQpjbnZfZGYgPC0gY252X2RmICU+JQogICMgTWFrZSBjb2x1bW4gdGhhdCBzcGVjaWZpZXMgdGhlIGNvbG9yIGZvciBlYWNoIGZhY3RvciBsZXZlbAogIGRwbHlyOjptdXRhdGUoZmFjX2NvbG9yX2tleSA9IGRwbHlyOjpyZWNvZGUoc3RhdHVzLCAhISFwYWxldHRlX2tleSkpCmBgYAoKIyMgRXhhbXBsZSB1c2VzIG9mIGBjaXJjb3NfbWFwX3Bsb3RgCgoqKkV4YW1wbGUgMSoqIG1ha2luZyBhIGNpcmN1bGFyIHNjYXR0ZXIgcGxvdCBmb3IgYSBzaW5nbGUgc2FtcGxlLgoKYGBge3J9CmNpcmNvc19tYXBfcGxvdCgKICBkZiA9IGNudl9kZiwKICBhZGRfdHJhY2sgPSBGQUxTRSwgIyBJZiBzZXQgdG8gVFJVRSB3ZSB3b3VsZCBhZGQgdG8gYW4gZXhpc2l0aW5nIHBsb3QuCiAgc2FtcGxlc19jb2wgPSAiSUQiLCAjIERlc2lnbmF0ZSB3aGF0IGNvbHVtbnMgb2YgYGNudl9kZmAgaG9sZCB0aGUgc2FtcGxlIElEcy4KICBzYW1wbGVfbmFtZXMgPSBzYW1wbGVzX2Zvcl9leGFtcGxlc1sxXSwgIyBXaGF0IHNhbXBsZSB3ZSBhcmUgcGxvdHRpbmcuCiAgY2hyX2NvbCA9ICJjaHJvbSIsICMgRGVzaWduYXRlIHdoYXQgY29sdW1ucyBvZiBgY252X2RmYCBob2xkIHRoZSBjb29yZGluYXRlcy4KICBzdGFydF9jb2wgPSAibG9jLnN0YXJ0IiwKICBlbmRfY29sID0gImxvYy5lbmQiLAogIHlfdmFsID0gImNvcHkubnVtIiwgIyBUaGlzIGlzIHRoZSBkYXRhIHdlIHdhbnQgdG8gbWFwCiAgdHJhY2tfaGVpZ2h0ID0gLjE1LCAjIFRoaXMgaXMgdGhlIGRlZmF1bHQKICB0eXBlID0gInBvaW50IiwgIyB0eXBlIGlzIHNldCB0byBwb2ludAogIGNvbG9yX2NvbCA9ICJmYWNfY29sb3Jfa2V5IgogICkKYGBgCgoqKkV4YW1wbGUgMioqIG1ha2luZyBhIHBsb3Qgd2l0aCByZWN0YW5nbGVzIGZvciBhIG11bHRpcGxlIHNhbXBsZXMgYW5kIGNvbG9yIGNvZGUgYnkgbnVtZXJpYyB2YWx1ZSBhbmQgd2l0aG91dCB0aGUgY3l0b2JhbmQuCgpgYGB7cn0KY2lyY29zX21hcF9wbG90KAogIGRmID0gY252X2RmLAogIGFkZF90cmFjayA9IEZBTFNFLAogIHNhbXBsZXNfY29sID0gIklEIiwKICBzYW1wbGVfbmFtZXMgPSBzYW1wbGVzX2Zvcl9leGFtcGxlc1sxOjNdLCAjIFdoYXQgc2FtcGxlcyB3ZSBhcmUgcGxvdHRpbmcuCiAgY2hyX2NvbCA9ICJjaHJvbSIsCiAgc3RhcnRfY29sID0gImxvYy5zdGFydCIsCiAgZW5kX2NvbCA9ICJsb2MuZW5kIiwKICB5X3ZhbCA9ICJjb3B5Lm51bSIsCiAgdHJhY2tfaGVpZ2h0ID0gLjE1LAogIHR5cGUgPSAicmVjdCIsICMgQ2hhbmdlZCB0aGlzIHRvIHJlY3QKICByZWN0X2hlaWdodCA9IC4yLCAjIE9wdGlvbmFsbHkgY2FuIGNoYW5nZSBoZWlnaHQgd2l0aCB0aGlzIGFyZ3VtZW50LiBEZWZhdWx0IGlzICtfIDAuNAogIGNvbG9yX2NvbCA9ICJudW1fY29sb3Jfa2V5IiwgCiAgY3l0b2JhbmQgPSBGQUxTRSAjIFR1cm5pbmcgb2ZmIHRoZSBjeXRvYmFuZCBoZXJlLiBEZWZhdWx0IGlzIFRSVUUKKQpgYGAKCioqRXhhbXBsZSAzKiogQWRkaW5nIGxheWVycyB0byB0aGUgc2FtZSBwbG90LgpIZXJlIHdlIHdpbGwgcGxvdCB0d28gc2FtcGxlcywgZWFjaCB3aXRoIHRoZWlyIG93biB0cmFjaywgYW5kIGEgZGlmZmVyZW50IGNvbG9yIGZvciBlYWNoLiAKCmBgYHtyfQojIFRoaXMgZmlyc3QgcGFydCBpcyB0aGUgc2FtZSBhcyBFeGFtcGxlIDMsIGJ1dCB3ZSB3aWxsIGFkZCBhbiBleHRyYSBsYXllciBhbmQgY2hhbmdlIHRoZSBjb2xvciBwYWxldHRlCmNpcmNvc19tYXBfcGxvdCgKICBkZiA9IGNudl9kZiwKICBhZGRfdHJhY2sgPSBGQUxTRSwKICBzYW1wbGVzX2NvbCA9ICJJRCIsCiAgc2FtcGxlX25hbWVzID0gc2FtcGxlc19mb3JfZXhhbXBsZXNbMV0sICMgT25lIHNhbXBsZSBoZXJlCiAgY2hyX2NvbCA9ICJjaHJvbSIsCiAgc3RhcnRfY29sID0gImxvYy5zdGFydCIsCiAgZW5kX2NvbCA9ICJsb2MuZW5kIiwKICB5X3ZhbCA9ICJjb3B5Lm51bSIsCiAgdHlwZSA9ICJwb2ludCIsCiAgc2luZ2xlX2NvbG9yID0gInJlZCIgIyBBIHNpbmd1bGFyIGNvbG9yCikKIyBXZSdsbCBjaGFuZ2UgdGhlIGNvbG9yIHRob3VnaCBmb3IgZnVuCiMgQWRkIHJlY3QgbGF5ZXIKY2lyY29zX21hcF9wbG90KAogIGRmID0gY252X2RmLAogIGFkZF90cmFjayA9IFRSVUUsICMgU2V0IHRvIFRSVUUgc28gYWRkcyB0byBwbG90IGNhbGxlZCBhYm92ZS4KICBzYW1wbGVzX2NvbCA9ICJJRCIsCiAgc2FtcGxlX25hbWVzID0gc2FtcGxlc19mb3JfZXhhbXBsZXNbMl0sICMgU2Vjb25kIHNhbXBsZSBoZXJlLiAKICBjaHJfY29sID0gImNocm9tIiwgCiAgc3RhcnRfY29sID0gImxvYy5zdGFydCIsCiAgZW5kX2NvbCA9ICJsb2MuZW5kIiwKICB5X3ZhbCA9ICJjb3B5Lm51bSIsCiAgdHlwZSA9ICJwb2ludCIsIAogIHNpbmdsZV9jb2xvciA9ICJibHVlIiAjIEEgZGlmZmVyZW50IHNpbmd1bGFyIGNvbG9yCikKYGBgCgoqKkV4YW1wbGUgNCoqIG1ha2luZyBhIHRyYW5zbG9jYXRpb24gcGxvdC4gCgpgYGB7cn0KY2lyY29zX21hcF90cmFuc2xvYyh0cmFuc2xvY19kZiwKICBhZGRfdHJhY2sgPSBGQUxTRSwgIyBXZSBjaGFuZ2UgdGhpcyB0byB0cnVlIHRvIGFkZCBvbiB0byBvdXIgYWxyZWFkeSBleGlzdGluZyBwbG90CiAgc2FtcGxlX25hbWVzID0gc2FtcGxlc19mb3JfZXhhbXBsZXNbMV0sCiAgc2FtcGxlc19jb2wgPSAiYmlvc3BlY2ltZW5faWQxIiwKICBjaHJfY29sXzEgPSAiY2hyb20xIiwgIyBOZWVkIHRvIHNwZWNpZnkgd2hpY2ggY29sdW1uIGlzIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxvY2F0aW9uIGZvciBlYWNoCiAgY2hyX2NvbF8yID0gImNocm9tMiIsCiAgc3RhcnRfY29sXzEgPSAic3RhcnQxIiwKICBzdGFydF9jb2xfMiA9ICJzdGFydDIiLAogIGVuZF9jb2xfMSA9ICJlbmQxIiwKICBlbmRfY29sXzIgPSAiZW5kMiIKKQpgYGAKCioqRXhhbXBsZSA1KiogU2F2aW5nIGEgcGxvdC4gCgpgYGB7cn0KIyBPcGVuIHVwIFBORyBmaWxlCnBuZyhmaWxlLnBhdGgocGxvdHNfZGlyLCAidHJhbnNsb2NfY2lyY29zX3Bsb3QucG5nIiksIHdpZHRoID0gODAwLCBoZWlnaHQgPSA4MDApCiMgUnVuIGZ1bmN0aW9uIHBlciB1c3VhbApjaXJjb3NfbWFwX3RyYW5zbG9jKHRyYW5zbG9jX2RmLAogIGFkZF90cmFjayA9IEZBTFNFLAogIHNhbXBsZV9uYW1lcyA9IHNhbXBsZXNfZm9yX2V4YW1wbGVzWzFdLAogIHNhbXBsZXNfY29sID0gImJpb3NwZWNpbWVuX2lkMSIsCiAgY2hyX2NvbF8xID0gImNocm9tMSIsCiAgY2hyX2NvbF8yID0gImNocm9tMiIsCiAgc3RhcnRfY29sXzEgPSAic3RhcnQxIiwKICBzdGFydF9jb2xfMiA9ICJzdGFydDIiLAogIGVuZF9jb2xfMSA9ICJlbmQxIiwKICBlbmRfY29sXzIgPSAiZW5kMiIKKQpkZXYub2ZmKCkgIyBUdXJuIG9mZiBwbmcgZGV2CmBgYAoKIVtQcmludCBwbG90IHdlIHNhdmVkIHRvIFBORzpdKHBsb3RzL3RyYW5zbG9jX2NpcmNvc19wbG90LnBuZykKCiMjIyBTZXNzaW9uIEluZm8KCmBgYHtyfQpzZXNzaW9uSW5mbygpCmBgYAoK
+LS0tCnRpdGxlOiAiQ2lyY29zIFBsb3RzIEV4YW1wbGVzIGZvciBWaXN1YWxpemluZyBTViBhbmQgQ05WIGRhdGEiCm91dHB1dDogICAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCmF1dGhvcjogQ2FuZGFjZSBTYXZvbmVuIGZvciBBTFNGIC0gQ0NETApkYXRlOiAyMDIwCi0tLQoKVGhpcyBub3RlYm9vayBzaG93cyBleGFtcGxlcyBvZiBob3cgdG8gdXNlIHRoZSBjaXJjb3NfbWFwX3Bsb3QgZnVuY3Rpb24gZm9yIAptYXBwaW5nIGRhdGEgdGhhdCBjb3JyZXNwb25kcyB0byBjaHJvbW9zb21hbCBjb29yZGluYXRlcy4KCkNvcnJlc3BvbmRzIHRvIFtpc3N1ZSAzOTddKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzL2lzc3Vlcy8zOTcpLgoKIyMjIFVzYWdlCgpUaGlzIG5vdGVib29rIGNhbiBiZSBydW4gdmlhIHRoZSBjb21tYW5kIGxpbmUgZnJvbSB0aGUgdG9wIGRpcmVjdG9yeSBvZiB0aGUgCnJlcG9zaXRvcnkgYXMgZm9sbG93czoKCmBgYApSc2NyaXB0IC1lICJybWFya2Rvd246OnJlbmRlcignYW5hbHlzZXMvY2hyb21vc29tYWwtaW5zdGFiaWxpdHkvMDFiLXZpc3VhbGl6YXRpb24tY252LXN2LlJtZCcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbiA9IFRSVUUpIgpgYGAKCiMjIENpcmN1bGFyIHBsb3RzIGZ1bmN0aW9uczogClRvIHVzZSB0aGUgZnVuY3Rpb25zLCBzb3VyY2UgdGhlIGZ1bmN0aW9ucyBmaWxlOiBgc291cmNlKGZpbGUucGF0aCgidXRpbCIsICJjaXJjb3MtcGxvdHMuUiIpKWAKVGhpcyBmaWxlIGluY2x1ZGVzIHRocmVlIGZ1bmN0aW9ucywgYnV0IG9uZSBpcyBpbnRlcm5hbC4gCgoqKlRoZSB0d28gZnVuY3Rpb25zIHRvIHVzZToqKgoKYGNpcmNvc19tYXBfcGxvdGA6IEdpdmVuIGEgZGF0YS5mcmFtZSB3aXRoIGNocm9tb3NvbWFsIGNvb3JkaW5hdGVzLCBhbmQgYSBjb3JyZXNwb25kaW5nIGRhdGEgdmFsdWUgdG8gcGxvdCwgbWFrZSBhIGNpcmNvcyBwbG90IG9yIGFkZCBhIGNpcmN1bGFyIHRyYWNrIHRvIGFuIGV4aXN0aW5nIHBsb3QuICAKYGNpcmNvc19tYXBfdHJhbnNsb2NgOiBHaXZlbiBhIGRhdGEuZnJhbWUgd2l0aCB0d28gc2V0cyBvZiBjb29yZGluYXRlcywgbWFwIHRoZSBsaW5rcyBiZXR3ZWVuIHRob3NlIGNvb3JkaW5hdGVzIG9uIGEgbmV3IG9yIGV4aXNpdG5nIGNpcmN1bGFyIHBsb3QuICAKCiMjIEZ1bmN0aW9uIEFyZ3VtZW50cyBEZXNjcmlwdGlvbnMKCi0gYGRmYDogYSBkYXRhLmZyYW1lIHdpdGggdGhlIGNocm9tb3NvbWFsIGNvb3JkaW5hdGVzIGFuZCB5IHZhbHVlIHRvIHBsb3QuICAKLSBgYWRkX3RyYWNrYDogSWYgdHJ1ZSwgYWRkcyBhIHRyYWNrIHRvIGEgY3VycmVudCBwbG90LCBpZiBgRkFMU0VgLCBzdGFydHMgYSBuZXcgcGxvdC4gIAotIGBzYW1wbGVzX2NvbGA6IGEgY2hhcmFjdGVyIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzYW1wbGVzIGNvbHVtbiB3aGljaCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgYnkuICAKLSBgc2FtcGxlX25hbWVzYDogYSBjaGFyYWN0ZXIgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHZhbHVlcyB0byBrZWVwIGZyb20gYHNhbXBsZXNfY29sYCBjb2x1bW4uIGAiYWxsImAga2VlcHMgYWxsIHNhbXBsZXMgaW4uICAgCi0gYGNocl9jb2xgOiBhIGNoYXJhY3RlciBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIGNocm9tb3NvbWVzIGNvbHVtbiBuYW1lLiAgCi0gYHN0YXJ0X2NvbGA6IGEgY2hhcmFjdGVyIHN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgc3RhcnQgY29vcmRpbmF0ZSBjb2x1bW4gbmFtZS4gIAotIGBlbmRfY29sYDogYSBjaGFyYWN0ZXIgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBlbmQgY29vcmRpbmF0ZSBjb2x1bW4gbmFtZS4gIAotIGB5X3ZhbGA6IFRoZSBjb2x1bW4gbmFtZSBvZiB0aGUgdmFsdWUgeW91IHdvdWxkIGxpa2UgdG8gcGxvdC4gCi0gYGNvbG9yX2NvbGA6IGEgY29sdW1uIHdpdGggY29sb3Igc3BlY2lmaWNhdGlvbnMgZm9yIGVhY2ggZGF0YSBwb2ludC4gCi0gYHRyYWNrX2hlaWdodGA6IGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSB0aGF0IGRlc2lnbmF0ZXMgaGVpZ2h0LCBkZWZhdWx0IGlzIGAuMTVgLiAxID0gdGhlIGZ1bGwgZGlhbWV0ZXIgb2YgdGhlIGNpcmN1bGFyIHBsb3QuICAKLSBgdHlwZWA6IFR5cGUgb2YgcGxvdCB0aGUgdHJhY2sgc2hvdWxkIGJlLiBPcHRpb25zIGFyZSBgbGluZWAsIGBwb2ludGAsIGByZWN0YC4gIAotIGByZWN0X2hlaWdodGA6IFRoZSBhZGRlZCBoZWlnaHQgKHBsdXMgYW5kIG1pbnVzIHlfdmFsKSB0aGF0IHNob3VsZCBiZSBwbG90dGVkLiAKLSBgY3l0b2JhbmRgOiBgVFJVRS9GQUxTRWAgaW5kaWNhdGluZyB3aGV0aGVyIHlvdSB3YW50IGEgY3l0b2JhbmQgb24gdGhlIApvdXRlcm1vc3Qgb2YgdGhlIHBsb3QuIERlZmF1bHQgaXMgVFJVRS4gIAotIGBzaW5nbGVfY29sb3JgOiBBIHNpbmdsZSBjb2xvciB0byBjaG9vc2UuIEFuIGFsdGVybmF0aXZlIHRvIGBjb2xvcl9jb2xgLgoKIyMjIFNldCBVcAoKYGBge3J9CiMgU2V0IHNlZWQgc28gcGxvdHMgdHVybiBvdXQgdGhlIHNhbWUKc2V0LnNlZWQoMjAyMCkKCiMgTWFncml0dHIgcGlwZQpgJT4lYCA8LSBkcGx5cjo6YCU+JWAKYGBgCgpSZWFkIGluIHRoZSBjdXN0b20gZnVuY3Rpb25zLgoKYGBge3J9CnNvdXJjZShmaWxlLnBhdGgoInV0aWwiLCAiY2lyY29zLXBsb3RzLlIiKSkKYGBgCgojIyMgRGlyZWN0b3JpZXMgYW5kIEZpbGVzCgpgYGB7cn0KIyBQYXRoIHRvIGRhdGEgZGlyZWN0b3J5CmRhdGFfZGlyIDwtIGZpbGUucGF0aCgiLi4iLCAiLi4iLCAiZGF0YSIpCgojIFBhdGggdG8gb3V0cHV0IGRpcmVjdG9yeQpwbG90c19kaXIgPC0gInBsb3RzIgpgYGAKCiMjIyBSZWFkIGluIGRhdGEgCgpTZXQgdXAgbWV0YWRhdGEKCmBgYHtyfQojIFJlYWQgaW4gdGhlIG1ldGFkYXRhCm1ldGFkYXRhIDwtIHJlYWRyOjpyZWFkX3RzdihmaWxlLnBhdGgoZGF0YV9kaXIsICJwYnRhLWhpc3RvbG9naWVzLnRzdiIpKQpgYGAKClJlYWQgaW4gdGhlIENOViBkYXRhLiAKCmBgYHtyfQpjbnZfZGYgPC0gZGF0YS50YWJsZTo6ZnJlYWQoCiAgZmlsZS5wYXRoKGRhdGFfZGlyLCAKICAgICAgICAgICAgInBidGEtY252LWNvbnNlbnN1cy5zZWcuZ3oiKSwKICBkYXRhLnRhYmxlID0gRkFMU0UKKSAKYGBgCgpDcmVhdGUgYSBzdGF0dXMgdmFyaWFibGUgYmFzZWQgb24gY29weSBudW1iZXIgYW5kIHR1bW9yIHBsb2lkeS4gClRoaXMgaXMgbG9naWMgd2FzIGJvcnJvd2VkIGZyb20gW2Bmb2NhbC1jbi1maWxlLXByZXBhcmF0aW9uYCBtb2R1bGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzL2Jsb2IvODZiZDYzNGE5MjhkYjNmNDYwMzI4MjEwZTM4YzdkYzE3OTdkMTMwNC9hbmFseXNlcy9mb2NhbC1jbi1maWxlLXByZXBhcmF0aW9uLzAyLWFkZC1wbG9pZHktY29uc2Vuc3VzLlJtZCNMNzQpLgoKYGBge3J9CmNudl9kZiA8LSBjbnZfZGYgJT4lIAogICMgT25seSBrZWVwIGRhdGEgdGhhdCBoYXMgdmFsdWVzIGZvciBjb3B5Lm51bQogIGRwbHlyOjpmaWx0ZXIoIWlzLm5hKGNvcHkubnVtKSkgJT4lCiAgIyBUYWNrIG9uIHRoZSBwbG9pZHkgYW5kIHNleCBlc3RpbWF0ZSBpbmZvcm1hdGlvbiBmcm9tIG1ldGFkYXRhCiAgZHBseXI6OmlubmVyX2pvaW4oCiAgICBkcGx5cjo6c2VsZWN0KG1ldGFkYXRhLCAKICAgICAgICAgICAgICAgICAgS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCwgCiAgICAgICAgICAgICAgICAgIHR1bW9yX3Bsb2lkeSwKICAgICAgICAgICAgICAgICAgZ2VybWxpbmVfc2V4X2VzdGltYXRlKSwgCiAgICAgICAgICAgICBieSA9IGMoIklEIiA9ICJLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEIikpICU+JQogICMgQ3JlYXRlIGEgc3RhdHVzIHZhcmlhYmxlCiAgZHBseXI6Om11dGF0ZShzdGF0dXMgPSBkcGx5cjo6Y2FzZV93aGVuKAogICAgIyB3aGVuIHRoZSBjb3B5IG51bWJlciBpcyBsZXNzIHRoYW4gaW5mZXJyZWQgcGxvaWR5LCBtYXJrIHRoaXMgYXMgYSBsb3NzCiAgICBjb3B5Lm51bSA8IHR1bW9yX3Bsb2lkeSB+ICJsb3NzIiwKICAgICMgaWYgY29weSBudW1iZXIgaXMgaGlnaGVyIHRoYW4gcGxvaWR5LCBtYXJrIGFzIGEgZ2FpbgogICAgY29weS5udW0gPiB0dW1vcl9wbG9pZHkgfiAiZ2FpbiIsCiAgICBjb3B5Lm51bSA9PSB0dW1vcl9wbG9pZHkgfiAibmV1dHJhbCIKICApLCAKICBzdGF0dXMgPSBmYWN0b3Ioc3RhdHVzLCBsZXZlbHMgPSBjKCJsb3NzIiwgIm5ldXRyYWwiLCAiZ2FpbiIpKSkKYGBgCgpSZWFkIGluIHRoZSBTViBkYXRhLiAKCmBgYHtyfQpzdl9kZiA8LSBkYXRhLnRhYmxlOjpmcmVhZCgKICBmaWxlLnBhdGgoZGF0YV9kaXIsICJwYnRhLXN2LW1hbnRhLnRzdi5neiIpLAogIGRhdGEudGFibGUgPSBGQUxTRQopCmBgYAoKTWFrZSBhIHRyYW5zbG9jYXRpb24gZGF0YS5mcmFtZSB3aGVyZSBib3RoIHNldHMgb2YgY29vcmRpbmF0ZXMgZm9yIHRoZSB0cmFuc2xvY2F0aW9uIGFyZSBpbiB0aGUgc2FtZSByb3cuCgpgYGB7cn0KdHJhbnNsb2NfZGYgPC0gc3ZfZGYgJT4lCiAgZHBseXI6OmZpbHRlcihTVi50eXBlID09ICJCTkQiKSAlPiUKICBkcGx5cjo6bXV0YXRlKAogICAgbWF0Y2hfaWQgPSBzdHJpbmdyOjpzdHJfc3ViKElELCAwLCAtMyksCiAgICBwYWlyX251bSA9IHN0cmluZ3I6OnN0cl9zdWIoSUQsIC0xKQogICkgJT4lCiAgZHBseXI6OnNlbGVjdCgKICAgIGJpb3NwZWNpbWVuX2lkID0gS2lkcy5GaXJzdC5CaW9zcGVjaW1lbi5JRC5UdW1vciwKICAgIGNocm9tID0gU1YuY2hyb20sCiAgICBzdGFydCA9IFNWLnN0YXJ0LAogICAgZW5kID0gU1YuZW5kLAogICAgd2lkdGggPSBTVi5sZW5ndGgsCiAgICBtYXRjaF9pZCwKICAgIHBhaXJfbnVtCiAgKQoKdHJhbnNsb2NfZGYgPC0gdHJhbnNsb2NfZGYgJT4lCiAgZHBseXI6OmZpbHRlcihwYWlyX251bSA9PSAwKSAlPiUKICBkcGx5cjo6aW5uZXJfam9pbihkcGx5cjo6ZmlsdGVyKHRyYW5zbG9jX2RmLCBwYWlyX251bSA9PSAxKSwKICAgIGJ5ID0gIm1hdGNoX2lkIiwKICAgIHN1ZmZpeCA9IGMoIjEiLCAiMiIpCiAgKQpgYGAKCkxldCdzIGdldCBzb21lIHNhbXBsZSBJRHMgdG8gcGxheSB3aXRoIGluIHRoZXNlIGV4YW1wbGVzLiAKCmBgYHtyfQpzYW1wbGVzX2Zvcl9leGFtcGxlcyA8LSBzYW1wbGUoY252X2RmJElELCA1KQpgYGAKCiMjIE1ha2luZyBjb2xvciBrZXlzIGV4YW1wbGVzClRoZSBgY2lyY29zX21hcF9wbG90YCBmdW5jdGlvbnMgdGFrZSBjb2x1bW5zIHRoYXQgc3BlY2lmeSB0aGUgY29sb3JzIGZvciBlYWNoIGRhdGEgcm93LiAKSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBob3cgdG8gc2V0IHVwIGNvbG9yIGNvbHVtbnMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBjaXJjb3MKZnVuY3Rpb25zIGFzIHRoZSBgY29sb3JfY29sYCBhcmd1bWVudC4gCgoqKk51bWVyaWNhbGx5IGJhc2VkIGNvbG9yIGtleToqKiAKCmBgYHtyfQojIE1ha2UgY29sb3IgcGFsZXR0ZSBiYXNlZCBvbiA1IGNvbG9ycwpwYWxldHRlX2NvbCA8LSBSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkFjY2VudCIgIyBDYW4gY2hhbmdlIHRoaXMgcGFsZXR0ZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlIFJDb2xvckJyZXdlcjo6ZGlzcGxheS5icmV3ZXIuYWxsKCkgdG8gc2VlIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKCiMgTWFrZSBjb2xvciByYW1wIGZ1bmN0aW9uIGJhc2VkIG9uIHF1YW50aWxlcyBvZiBzZWcubWVhbiBhbmQgcGFsZXR0ZQpjb2xvcl9mdW4gPC0gY2lyY2xpemU6OmNvbG9yUmFtcDIoCiAgYnJlYWtzID0gcXVhbnRpbGUoY252X2RmJHNlZy5tZWFuLCAKICAgICAgICAgICAgICAgICAgICBjKDAuMTUsIDAuMzUsIDAuNSwgMC42NSwgMC44NSksIG5hLnJtID0gVFJVRSksIAogIGNvbG9ycyA9IHBhbGV0dGVfY29sKQpgYGAKCkFkZCBudW1lcmljYWxseSBiYXNlZCBjb2xvciBjb2x1bW4gdG8gYGNudl9kZmAuCgpgYGB7cn0KY252X2RmIDwtIGNudl9kZiAlPiUKICAjIE1ha2UgY29sdW1uIHRoYXQgc3BlY2lmaWVzIHRoZSBjb2xvciBmb3IgZWFjaCB2YWx1ZQogIGRwbHlyOjptdXRhdGUobnVtX2NvbG9yX2tleSA9IGNvbG9yX2Z1bihjb3B5Lm51bSkpCmBgYAoKQ2FuIHJ1biB0aGlzIHRvIHNlZSBvdGhlciBwYWxldHRlcyBiZXNpZGVzIGBBY2NlbnRgLgoKYGBge3J9ClJDb2xvckJyZXdlcjo6ZGlzcGxheS5icmV3ZXIuYWxsKCkKYGBgCgoqKkZhY3Rvci1iYXNlZCBjb2xvciBrZXlzOioqIApIZXJlIHdlIHdpbGwgYWRkIGEgY29sdW1uIHRvIGBjbnZfZGZgIHRoYXQgY29sb3IgY29kZXMgYmFzZWQgb24gdGhlIGBzdGF0dXNgIApjb2x1bW4gd2hpY2ggaGFzIHRocmVlIGNhdGVnb3JpZXMuIAoKYGBge3J9CiMgTGV0J3MgZGV0ZXJtaW5lIGhvdyBtYW55IGxldmVscyB0aGlzIGZhY3RvciBjb2x1bW4gaGFzCm5fbGV2ZWxzIDwtIGxlbmd0aChsZXZlbHMoY252X2RmJHN0YXR1cykpCgojIFNldCB1cCBhIHBhbGV0dGUgYmFzZWQgb24gbnVtYmVyIG9mIGZhY3RvciBsZXZlbHMKcGFsZXR0ZV9jb2wgPC0gUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKG5fbGV2ZWxzLCBuYW1lID0gIkFjY2VudCIpCgojIExldCdzIG1ha2UgYSBrZXkgdG8gcmVjb2RlIGJ5IGJhc2VkIG9uIGxldmVscwpwYWxldHRlX2tleSA8LSBwYWxldHRlX2NvbAoKIyBIYXZlIHRoZSBmYWN0b3IgbGV2ZWxzIGJlIHRoZSBuYW1lcwpuYW1lcyhwYWxldHRlX2tleSkgPC0gbGV2ZWxzKGNudl9kZiRzdGF0dXMpCgojIFByZXZpZXcgdGhpcwpwYWxldHRlX2tleQpgYGAKCkFkZCBmYWN0b3IgYmFzZWQgY29sb3IgY29sdW1uIHRvIGNudl9kZgoKYGBge3J9CmNudl9kZiA8LSBjbnZfZGYgJT4lCiAgIyBNYWtlIGNvbHVtbiB0aGF0IHNwZWNpZmllcyB0aGUgY29sb3IgZm9yIGVhY2ggZmFjdG9yIGxldmVsCiAgZHBseXI6Om11dGF0ZShmYWNfY29sb3Jfa2V5ID0gZHBseXI6OnJlY29kZShzdGF0dXMsICEhIXBhbGV0dGVfa2V5KSkKYGBgCgojIyBFeGFtcGxlIHVzZXMgb2YgYGNpcmNvc19tYXBfcGxvdGAKCioqRXhhbXBsZSAxKiogbWFraW5nIGEgY2lyY3VsYXIgc2NhdHRlciBwbG90IGZvciBhIHNpbmdsZSBzYW1wbGUuCgpgYGB7cn0KY2lyY29zX21hcF9wbG90KAogIGRmID0gY252X2RmLAogIGFkZF90cmFjayA9IEZBTFNFLCAjIElmIHNldCB0byBUUlVFIHdlIHdvdWxkIGFkZCB0byBhbiBleGlzaXRpbmcgcGxvdC4KICBzYW1wbGVzX2NvbCA9ICJJRCIsICMgRGVzaWduYXRlIHdoYXQgY29sdW1ucyBvZiBgY252X2RmYCBob2xkIHRoZSBzYW1wbGUgSURzLgogIHNhbXBsZV9uYW1lcyA9IHNhbXBsZXNfZm9yX2V4YW1wbGVzWzFdLCAjIFdoYXQgc2FtcGxlIHdlIGFyZSBwbG90dGluZy4KICBjaHJfY29sID0gImNocm9tIiwgIyBEZXNpZ25hdGUgd2hhdCBjb2x1bW5zIG9mIGBjbnZfZGZgIGhvbGQgdGhlIGNvb3JkaW5hdGVzLgogIHN0YXJ0X2NvbCA9ICJsb2Muc3RhcnQiLAogIGVuZF9jb2wgPSAibG9jLmVuZCIsCiAgeV92YWwgPSAiY29weS5udW0iLCAjIFRoaXMgaXMgdGhlIGRhdGEgd2Ugd2FudCB0byBtYXAKICB0cmFja19oZWlnaHQgPSAuMTUsICMgVGhpcyBpcyB0aGUgZGVmYXVsdAogIHR5cGUgPSAicG9pbnQiLCAjIHR5cGUgaXMgc2V0IHRvIHBvaW50CiAgY29sb3JfY29sID0gImZhY19jb2xvcl9rZXkiCiAgKQpgYGAKCioqRXhhbXBsZSAyKiogbWFraW5nIGEgcGxvdCB3aXRoIHJlY3RhbmdsZXMgZm9yIGEgbXVsdGlwbGUgc2FtcGxlcyBhbmQgY29sb3IgY29kZSBieSBudW1lcmljIHZhbHVlIGFuZCB3aXRob3V0IHRoZSBjeXRvYmFuZC4KCmBgYHtyfQpjaXJjb3NfbWFwX3Bsb3QoCiAgZGYgPSBjbnZfZGYsCiAgYWRkX3RyYWNrID0gRkFMU0UsCiAgc2FtcGxlc19jb2wgPSAiSUQiLAogIHNhbXBsZV9uYW1lcyA9IHNhbXBsZXNfZm9yX2V4YW1wbGVzWzE6M10sICMgV2hhdCBzYW1wbGVzIHdlIGFyZSBwbG90dGluZy4KICBjaHJfY29sID0gImNocm9tIiwKICBzdGFydF9jb2wgPSAibG9jLnN0YXJ0IiwKICBlbmRfY29sID0gImxvYy5lbmQiLAogIHlfdmFsID0gImNvcHkubnVtIiwKICB0cmFja19oZWlnaHQgPSAuMTUsCiAgdHlwZSA9ICJyZWN0IiwgIyBDaGFuZ2VkIHRoaXMgdG8gcmVjdAogIHJlY3RfaGVpZ2h0ID0gLjIsICMgT3B0aW9uYWxseSBjYW4gY2hhbmdlIGhlaWdodCB3aXRoIHRoaXMgYXJndW1lbnQuIERlZmF1bHQgaXMgK18gMC40CiAgY29sb3JfY29sID0gIm51bV9jb2xvcl9rZXkiLCAKICBjeXRvYmFuZCA9IEZBTFNFICMgVHVybmluZyBvZmYgdGhlIGN5dG9iYW5kIGhlcmUuIERlZmF1bHQgaXMgVFJVRQopCmBgYAoKKipFeGFtcGxlIDMqKiBBZGRpbmcgbGF5ZXJzIHRvIHRoZSBzYW1lIHBsb3QuCkhlcmUgd2Ugd2lsbCBwbG90IHR3byBzYW1wbGVzLCBlYWNoIHdpdGggdGhlaXIgb3duIHRyYWNrLCBhbmQgYSBkaWZmZXJlbnQgY29sb3IgZm9yIGVhY2guIAoKYGBge3J9CiMgVGhpcyBmaXJzdCBwYXJ0IGlzIHRoZSBzYW1lIGFzIEV4YW1wbGUgMywgYnV0IHdlIHdpbGwgYWRkIGFuIGV4dHJhIGxheWVyIGFuZCBjaGFuZ2UgdGhlIGNvbG9yIHBhbGV0dGUKY2lyY29zX21hcF9wbG90KAogIGRmID0gY252X2RmLAogIGFkZF90cmFjayA9IEZBTFNFLAogIHNhbXBsZXNfY29sID0gIklEIiwKICBzYW1wbGVfbmFtZXMgPSBzYW1wbGVzX2Zvcl9leGFtcGxlc1sxXSwgIyBPbmUgc2FtcGxlIGhlcmUKICBjaHJfY29sID0gImNocm9tIiwKICBzdGFydF9jb2wgPSAibG9jLnN0YXJ0IiwKICBlbmRfY29sID0gImxvYy5lbmQiLAogIHlfdmFsID0gImNvcHkubnVtIiwKICB0eXBlID0gInBvaW50IiwKICBzaW5nbGVfY29sb3IgPSAicmVkIiAjIEEgc2luZ3VsYXIgY29sb3IKKQojIFdlJ2xsIGNoYW5nZSB0aGUgY29sb3IgdGhvdWdoIGZvciBmdW4KIyBBZGQgcmVjdCBsYXllcgpjaXJjb3NfbWFwX3Bsb3QoCiAgZGYgPSBjbnZfZGYsCiAgYWRkX3RyYWNrID0gVFJVRSwgIyBTZXQgdG8gVFJVRSBzbyBhZGRzIHRvIHBsb3QgY2FsbGVkIGFib3ZlLgogIHNhbXBsZXNfY29sID0gIklEIiwKICBzYW1wbGVfbmFtZXMgPSBzYW1wbGVzX2Zvcl9leGFtcGxlc1syXSwgIyBTZWNvbmQgc2FtcGxlIGhlcmUuIAogIGNocl9jb2wgPSAiY2hyb20iLCAKICBzdGFydF9jb2wgPSAibG9jLnN0YXJ0IiwKICBlbmRfY29sID0gImxvYy5lbmQiLAogIHlfdmFsID0gImNvcHkubnVtIiwKICB0eXBlID0gInBvaW50IiwgCiAgc2luZ2xlX2NvbG9yID0gImJsdWUiICMgQSBkaWZmZXJlbnQgc2luZ3VsYXIgY29sb3IKKQpgYGAKCioqRXhhbXBsZSA0KiogbWFraW5nIGEgdHJhbnNsb2NhdGlvbiBwbG90LiAKCmBgYHtyfQpjaXJjb3NfbWFwX3RyYW5zbG9jKHRyYW5zbG9jX2RmLAogIGFkZF90cmFjayA9IEZBTFNFLCAjIFdlIGNoYW5nZSB0aGlzIHRvIHRydWUgdG8gYWRkIG9uIHRvIG91ciBhbHJlYWR5IGV4aXN0aW5nIHBsb3QKICBzYW1wbGVfbmFtZXMgPSBzYW1wbGUodHJhbnNsb2NfZGYkYmlvc3BlY2ltZW5faWQxLCAxKSwKICBzYW1wbGVzX2NvbCA9ICJiaW9zcGVjaW1lbl9pZDEiLAogIGNocl9jb2xfMSA9ICJjaHJvbTEiLCAjIE5lZWQgdG8gc3BlY2lmeSB3aGljaCBjb2x1bW4gaXMgdGhlIGZpcnN0IGFuZCBzZWNvbmQgbG9jYXRpb24gZm9yIGVhY2gKICBjaHJfY29sXzIgPSAiY2hyb20yIiwKICBzdGFydF9jb2xfMSA9ICJzdGFydDEiLAogIHN0YXJ0X2NvbF8yID0gInN0YXJ0MiIsCiAgZW5kX2NvbF8xID0gImVuZDEiLAogIGVuZF9jb2xfMiA9ICJlbmQyIgopCmBgYAoKKipFeGFtcGxlIDUqKiBTYXZpbmcgYSBwbG90LiAKCmBgYHtyfQojIE9wZW4gdXAgUE5HIGZpbGUKcG5nKGZpbGUucGF0aChwbG90c19kaXIsICJ0cmFuc2xvY19jaXJjb3NfcGxvdC5wbmciKSwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDgwMCkKIyBSdW4gZnVuY3Rpb24gcGVyIHVzdWFsCmNpcmNvc19tYXBfdHJhbnNsb2ModHJhbnNsb2NfZGYsCiAgYWRkX3RyYWNrID0gRkFMU0UsCiAgc2FtcGxlX25hbWVzID0gc2FtcGxlKHRyYW5zbG9jX2RmJGJpb3NwZWNpbWVuX2lkMSwgMSksCiAgc2FtcGxlc19jb2wgPSAiYmlvc3BlY2ltZW5faWQxIiwKICBjaHJfY29sXzEgPSAiY2hyb20xIiwKICBjaHJfY29sXzIgPSAiY2hyb20yIiwKICBzdGFydF9jb2xfMSA9ICJzdGFydDEiLAogIHN0YXJ0X2NvbF8yID0gInN0YXJ0MiIsCiAgZW5kX2NvbF8xID0gImVuZDEiLAogIGVuZF9jb2xfMiA9ICJlbmQyIgopCmRldi5vZmYoKSAjIFR1cm4gb2ZmIHBuZyBkZXYKYGBgCgohW1ByaW50IHBsb3Qgd2Ugc2F2ZWQgdG8gUE5HOl0ocGxvdHMvdHJhbnNsb2NfY2lyY29zX3Bsb3QucG5nKQoKIyMjIFNlc3Npb24gSW5mbwoKYGBge3J9CnNlc3Npb25JbmZvKCkKYGBgCgo=
diff --git a/analyses/chromosomal-instability/util/circos-plots.R b/analyses/chromosomal-instability/util/circos-plots.R
index 05a9704d80..a4dd9cc469 100644
--- a/analyses/chromosomal-instability/util/circos-plots.R
+++ b/analyses/chromosomal-instability/util/circos-plots.R
@@ -135,6 +135,13 @@ circos_map_plot <- function(df,
y_min <- min(bed_df$y_val, na.rm = TRUE)
y_max <- max(bed_df$y_val, na.rm = TRUE)
+ # Can't have identical y_min and y_max, this is just so CircleCI runs even if
+ # the subset data is wonky
+ if (y_min == y_max) {
+ y_max <- y_max + 0.001
+ warning("ymax and ymin are identical")
+ }
+
# Tell them only one color is allowed
if (length(single_color) > 1) {
warning("Only a single color is allowed for the `single_color` argument,
diff --git a/analyses/fusion-summary/01-fusion-summary.Rmd b/analyses/fusion-summary/01-fusion-summary.Rmd
index 933900a30b..3875306d81 100644
--- a/analyses/fusion-summary/01-fusion-summary.Rmd
+++ b/analyses/fusion-summary/01-fusion-summary.Rmd
@@ -151,36 +151,28 @@ specimensUnion<- union(arribaDF$tumor_id, starfusionDF$tumor_id)
#### Write non-MB, non-ATRT embryonal fusions to file
```{r}
-allFuseEmbry <- allFuseEmbry %>%
- prepareOutput(specimensUnion)
+if (!running_in_ci) {
+ allFuseEmbry <- allFuseEmbry %>%
+ prepareOutput(specimensUnion)
+ allFuseEmbry %>%
+ mutate(
+ `CIC--NUTM1` = 0,
+ `MN1--BEND2` = 0
+ ) %>%
+ write_tsv(embryFile)
+}
```
-```{r}
-# Are there any missing fusions?
-setdiff(embryFuses, colnames(allFuseEmbry))
-```
+#### Write ependymoma fusions to file
```{r}
-allFuseEmbry %>%
+allFuseEpend %>%
+ prepareOutput(specimensUnion) %>%
mutate(
- `CIC--NUTM1` = 0,
- `MN1--BEND2` = 0
+ `C11orf95--YAP1` = 0,
+ `LTBP3--RELA` = 0,
+ `PTEN--TAS2R1` = 0,
+ `YAP1--MAMLD2` = 0
) %>%
- write_tsv(embryFile)
-```
-
-#### Write ependymoma fusions to file
-
-```{r}
-if (!running_in_ci) {
- allFuseEpend %>%
- prepareOutput(specimensUnion) %>%
- mutate(
- `C11orf95--YAP1` = 0,
- `LTBP3--RELA` = 0,
- `PTEN--TAS2R1` = 0,
- `YAP1--MAMLD2` = 0
- ) %>%
- write_tsv(ependFile)
-}
+ write_tsv(ependFile)
```
diff --git a/analyses/fusion-summary/01-fusion-summary.nb.html b/analyses/fusion-summary/01-fusion-summary.nb.html
index dd7b91804a..10193a8610 100644
--- a/analyses/fusion-summary/01-fusion-summary.nb.html
+++ b/analyses/fusion-summary/01-fusion-summary.nb.html
@@ -1789,19 +1789,6 @@ Libraries and functions
library(tidyverse)
-
-Registered S3 method overwritten by 'dplyr':
- method from
- print.rowwise_df
-[37m── [1mAttaching packages[22m ────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──[39m
-[37m[32m✔[37m [34mggplot2[37m 3.2.0 [32m✔[37m [34mpurrr [37m 0.3.2
-[32m✔[37m [34mtibble [37m 2.1.3 [32m✔[37m [34mdplyr [37m 0.8.3
-[32m✔[37m [34mtidyr [37m 0.8.3 [32m✔[37m [34mstringr[37m 1.4.0
-[32m✔[37m [34mreadr [37m 1.3.1 [32m✔[37m [34mforcats[37m 0.4.0[39m
-[37m── [1mConflicts[22m ───────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
-[31m✖[37m [34mdplyr[37m::[32mfilter()[37m masks [34mstats[37m::filter()
-[31m✖[37m [34mdplyr[37m::[32mlag()[37m masks [34mstats[37m::lag()[39m
-
@@ -1994,9 +1981,17 @@ Filter putative oncogenic fusions list
Write non-MB, non-ATRT embryonal fusions to file
-
-allFuseEmbry <- allFuseEmbry %>%
- prepareOutput(specimensUnion)
+
+if (!running_in_ci) {
+ allFuseEmbry <- allFuseEmbry %>%
+ prepareOutput(specimensUnion)
+ allFuseEmbry %>%
+ mutate(
+ `CIC--NUTM1` = 0,
+ `MN1--BEND2` = 0
+ ) %>%
+ write_tsv(embryFile)
+}
Using FusionName as value column: use value.var to override.
@@ -2006,46 +2001,21 @@ Write non-MB, non-ATRT embryonal fusions to file
-
-
-
-# Are there any missing fusions?
-setdiff(embryFuses, colnames(allFuseEmbry))
-
-
-[1] "CIC--NUTM1" "MN1--BEND2"
-
-
-
-
-
-
-allFuseEmbry %>%
- mutate(
- `CIC--NUTM1` = 0,
- `MN1--BEND2` = 0
- ) %>%
- write_tsv(embryFile)
-
-
-
Write ependymoma fusions to file
-
-if (!running_in_ci) {
- allFuseEpend %>%
- prepareOutput(specimensUnion) %>%
- mutate(
- `C11orf95--YAP1` = 0,
- `LTBP3--RELA` = 0,
- `PTEN--TAS2R1` = 0,
- `YAP1--MAMLD2` = 0
- ) %>%
- write_tsv(ependFile)
-}
+
+allFuseEpend %>%
+ prepareOutput(specimensUnion) %>%
+ mutate(
+ `C11orf95--YAP1` = 0,
+ `LTBP3--RELA` = 0,
+ `PTEN--TAS2R1` = 0,
+ `YAP1--MAMLD2` = 0
+ ) %>%
+ write_tsv(ependFile)
Using FusionName as value column: use value.var to override.
@@ -2058,7 +2028,7 @@ Write ependymoma fusions to file
-LS0tCnRpdGxlOiAiR2VuZXJhdGUgRnVzaW9uIFN1bW1hcnkgRmlsZXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6IERhbmllbCBNaWxsZXIgKEQzYikgYW5kIEphY2x5biBUYXJvbmkgKENDREwpCmRhdGU6IEphbnVhcnkgMjAyMApwYXJhbXM6CiAgaXNfY2k6IDAKLS0tCgpHZW5lcmF0ZSBmdXNpb24gZmlsZXMgc3BlY2lmaWNhbGx5IGZvciBjb25zdW1wdGlvbiBieSBtb2xlY3VsYXIgc3VidHlwaW5nIGFuYWx5c2VzCgojIyBTZXQgdXAKCmBgYHtyfQojIGlmIHJ1bm5pbmcgaW4gQ0ksIHdlIG5lZWQgdG8gc2tpcCB0aGUgRVBOIHN0ZXBzCmlmIChwYXJhbXMkaXNfY2kgPT0gMCkgcnVubmluZ19pbl9jaSA8LSBGQUxTRQppZiAocGFyYW1zJGlzX2NpID09IDEpIHJ1bm5pbmdfaW5fY2kgPC0gVFJVRQpgYGAKCiMjIyBMaWJyYXJpZXMgYW5kIGZ1bmN0aW9ucwoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCmBgYHtyfQojJyBHZW5lcmF0ZSBmaWx0ZXJlZCBmdXNpb24gZnJhbWUKIycgQHBhcmFtIGRmIFVuZmlsdGVyZWQgZnVzaW9uIGRhdGEgZnJhbWUKIycgQHBhcmFtIGJpb2lkIExpc3Qgb2YgYmlvc3BlY2ltZW4gSURzCiMnIEBwYXJhbSBmdXNlcyBMaXN0IG9mIGV4cGxpY2l0IGZ1c2lvbiBuYW1lcwojJyBAcGFyYW0gZ2VuZXMgTGlzdCBvZiBnZW5lIG5hbWVzCiMnIEByZXR1cm4gdGhlIGZpbHRlcmVkIGZ1c2lvbiBkYXRhIGZyYW1lCmZpbHRlckZ1c2lvbiA8LSBmdW5jdGlvbihkZiwgYmlvaWQsIGZ1c2VzLCBnZW5lcykgewogIGlmICghbWlzc2luZyhiaW9pZCkpIHsKICAgIGRmIDwtIGZpbHRlcihkZiwgU2FtcGxlICVpbiUgYmlvaWQpCiAgfQogIGlmICghbWlzc2luZyhmdXNlcykgJiAhbWlzc2luZyhnZW5lcykpIHsKICAgIGRmIDwtIGZpbHRlcihkZiwgRnVzaW9uTmFtZSAlaW4lIGZ1c2VzIHwKICAgICAgICAgICAgICAgICAgIEdlbmUxQSAlaW4lIGdlbmVzIHwKICAgICAgICAgICAgICAgICAgIEdlbmUyQSAlaW4lIGdlbmVzIHwKICAgICAgICAgICAgICAgICAgIEdlbmUxQiAlaW4lIGdlbmVzIHwKICAgICAgICAgICAgICAgICAgIEdlbmUyQiAlaW4lIGdlbmVzKQogIH0gZWxzZSBpZiAoIW1pc3NpbmcoZnVzZXMpKSB7CiAgICBkZiA8LSBmaWx0ZXIoZGYsIEZ1c2lvbk5hbWUgJWluJSBmdXNlcykKICB9IGVsc2UgaWYgKCFtaXNzaW5nKGdlbmVzKSkgewogICAgZGYgPC0gZmlsdGVyKGRmLAogICAgICAgICAgICAgICAgIEdlbmUxQSAlaW4lIGdlbmVzIHwKICAgICAgICAgICAgICAgICAgIEdlbmUyQSAlaW4lIGdlbmVzIHwKICAgICAgICAgICAgICAgICAgIEdlbmUxQiAlaW4lIGdlbmVzIHwKICAgICAgICAgICAgICAgICAgIEdlbmUyQiAlaW4lIGdlbmVzKQogIH0KICByZXR1cm4oZGYgJT4lIHNlbGVjdChTYW1wbGUsIEZ1c2lvbk5hbWUpKQp9CgoKIycgR2VuZXJhdGUgbWF0cml4IHdpdGggZnVzaW9uIGNvdW50cwojJyBAcGFyYW0gZnVzZURGIEZpbHRlcmVkIGZ1c2lvbiBkYXRhIGZyYW1lCiMnIEBwYXJhbSBiaW9pZCBMaXN0IG9mIGJpb3NwZWNpbWVuIElEcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiBmaW5hbCB0YWJsZQoKIycgQHJldHVybiBEYXRhIGZyYW1lIHRoYXQgY29udGFpbnMgZnVzaW9uIGNvdW50cwpwcmVwYXJlT3V0cHV0IDwtIGZ1bmN0aW9uKGZ1c2VERiwgYmlvaWQpIHsKICBmdXNlREYgJT4lIAogICAgcmVzaGFwZTI6OmRjYXN0KFNhbXBsZSB+IEZ1c2lvbk5hbWUpICU+JQogICAgcmlnaHRfam9pbihkYXRhLmZyYW1lKFNhbXBsZSA9IGJpb2lkKSkgJT4lCiAgICByZXBsYWNlKGlzLm5hKC4pLCAwKSAlPiUKICAgIHJlbmFtZShLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEID0gU2FtcGxlKQp9CmBgYAoKIyMjIFJlYWQgaW4gZGF0YQoKYGBge3J9CmRhdGFEaXIgPC0gZmlsZS5wYXRoKCIuLiIsICIuLiIsICJkYXRhIikKIycgVGhlIHB1dGF0aXZlIG9uY29nZW5pYyBmdXNpb24gZmlsZSBpcyB3aGF0IHdlJ2xsIHVzZSB0byBjaGVjayBmb3IgdGhlIAojJyBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIHRoZSBmdXNpb25zLgpwdXRhdGl2ZU9uY29nZW5pY0RGIDwtIAogIHJlYWRfdHN2KGZpbGUucGF0aChkYXRhRGlyLCAicGJ0YS1mdXNpb24tcHV0YXRpdmUtb25jb2dlbmljLnRzdiIpKQojJyBIb3dldmVyLCBzb21lIGJpb3NwZWNpbWVucyBhcmUgbm90IHJlcHJlc2VudGVkIGluIHRoaXMgZmlsdGVyZWQsIHByaW9yaXRpemVkCiMnIGZpbGUgYnV0ICphcmUqIHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIGZpbGVzIC0tIHRoaXMgd2lsbCBjYXVzZSB0aGVtIHRvIGJlCiMnICJtaXNzaW5nIiBpbiB0aGUgZmluYWwgZmlsZXMgZm9yIGNvbnN1bXB0aW9uIHdoaWNoIGNvdWxkIG1pc2xlYWQgYW5hbHlzdHMuCmFycmliYURGIDwtIHJlYWRfdHN2KGZpbGUucGF0aChkYXRhRGlyLCAicGJ0YS1mdXNpb24tYXJyaWJhLnRzdi5neiIpKQpzdGFyZnVzaW9uREYgPC0gcmVhZF90c3YoZmlsZS5wYXRoKGRhdGFEaXIsICJwYnRhLWZ1c2lvbi1zdGFyZnVzaW9uLnRzdi5neiIpKQpgYGAKCiMjIyBPdXRwdXQKCmBgYHtyfQpyZXN1bHRzRGlyIDwtICJyZXN1bHRzIgppZiAoIWRpci5leGlzdHMocmVzdWx0c0RpcikpIHsKICBkaXIuY3JlYXRlKHJlc3VsdHNEaXIpCn0KZXBlbmRGaWxlIDwtIGZpbGUucGF0aChyZXN1bHRzRGlyLCAiZnVzaW9uX3N1bW1hcnlfZXBlbmR5bW9tYV9mb2kudHN2IikKZW1icnlGaWxlIDwtIGZpbGUucGF0aChyZXN1bHRzRGlyLCAiZnVzaW9uX3N1bW1hcnlfZW1icnlvbmFsX2ZvaS50c3YiKQpgYGAKCiMjIEZ1c2lvbnMgYW5kIGdlbmVzIG9mIGludGVyZXN0CgpUYWtlbiBmcm9tIFtgQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcyMyNDVgXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcy9pc3N1ZXMvMjQ1KSBhbmQgW2BBbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzIzI1MWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzL2lzc3Vlcy8yNTEpLCByZXNwZWN0aXZlbHkuCgpgYGB7cn0KIycgKipGaWx0ZXJzKioKIycKIycgKkZ1c2lvbnMgRmlsdGVycyoKIycgMTogRXhhY3QgbWF0Y2ggYSBsaXN0IG9mIGZ1c2lvbnMgY29tbW9uIGluIEVwZW5keW1vbWEgdHVtb3JzCmVwZW5kRnVzZXMgPC0gYygKICAiQzExb3JmOTUtLU1BTUwyIiwKICAiQzExb3JmOTUtLVJFTEEiLAogICJDMTFvcmY5NS0tWUFQMSIsCiAgIkxUQlAzLS1SRUxBIiwKICAiUFRFTi0tVEFTMlIxIiwKICAiWUFQMS0tRkFNMTE4QiIsCiAgIllBUDEtLU1BTUxEMSIsCiAgIllBUDEtLU1BTUxEMiIKKQplcGVuZEdlbmVzIDwtIGMoCiAgIlJFTEEiCikKIycgMjogRXhhY3QgbWF0Y2ggYSBsaXN0IG9mIGZ1c2lvbnMgY29tbW9uIGluIEVtYnJ5b25hbCB0dW1vcnMKIycgYXMgd2VsbCBhcyBmdXNpb25zIGNvbnRhaW5pbmcgYSBwYXJ0aWN1bGFyIGdlbmUgd2l0aCBhbnkgb3RoZXIgZ2VuZQplbWJyeUZ1c2VzIDwtIGMoCiAgIkNJQy0tTlVUTTEiLAogICJNTjEtLUJFTkQyIiwKICAiTU4xLS1DWFhDNSIKKQplbWJyeUdlbmVzIDwtIGMoCiAgIkZPWFIyIiwKICAiTU4xIiwKICAiVFRZSDEiCikKYGBgCgojIyMgRmlsdGVyIHB1dGF0aXZlIG9uY29nZW5pYyBmdXNpb25zIGxpc3QKCmBgYHtyfQphbGxGdXNlRXBlbmQgPC0gZmlsdGVyRnVzaW9uKGRmID0gcHV0YXRpdmVPbmNvZ2VuaWNERiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdXNlcyA9IGVwZW5kRnVzZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXMgPSBlcGVuZEdlbmVzKQphbGxGdXNlRW1icnkgPC0gZmlsdGVyRnVzaW9uKGRmID0gcHV0YXRpdmVPbmNvZ2VuaWNERiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdXNlcyA9IGVtYnJ5RnVzZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXMgPSBlbWJyeUdlbmVzKQpgYGAKCkdldCB0aGUgYmlvc3BlY2ltZW4gSURzIHRoYXQgYXJlIHByZXNlbnQgaW4gKmVpdGhlciogY2FsbGVyIGZpbGUgKEFycmliYSwgU1RBUkZ1c2lvbikuClRoZSBmdXNpb25zIGluIHRoZSBwdXRhdGl2ZSBvbmNvZ2VuaWMgZnVzaW9uIGZpbGUgY2FuIGJlIHJldGFpbmVkIGV2ZW4gaWYgdGhleSBhcmUgbm90IGluIGJvdGggY2FsbGVyczogaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvYmxvYi84ZmJhMTc1MzYwOGQ4YWMwYWEzZDVkN2Q2M2M0ODBiOGYwMGZmMGU5L2FuYWx5c2VzL2Z1c2lvbl9maWx0ZXJpbmcvMDQtcHJvamVjdC1zcGVjaWZpYy1maWx0ZXJpbmcuUm1kI0wyNDIKV2UgdXNlIHRoZSBwdXRhdGl2ZSBvbmNvZ2VuaWMgZmlsZSBoZXJlLCB0aGVyZWZvcmUgYW55IHNhbXBsZSB0aGF0IGlzIGluIGVpdGhlciBmaWxlIGJ1dCBkb2VzIG5vdCBoYXZlIGEgZnVzaW9uIHRoYXQgaXMgcmVsZXZhbnQgdG8gdGhlIHN1YnR5cGluZyB0aWNrZXRzIGlzIG5vdCBfbWlzc2luZ18gYnV0IGluc3RlYWQgaGFzIG5vIGV2aWRlbmNlIG9mIHRoZSByZWxldmFudCBmdXNpb25zLgoKYGBge3J9CnNwZWNpbWVuc1VuaW9uPC0gdW5pb24oYXJyaWJhREYkdHVtb3JfaWQsIHN0YXJmdXNpb25ERiR0dW1vcl9pZCkKYGBgCgojIyMjIFdyaXRlIG5vbi1NQiwgbm9uLUFUUlQgZW1icnlvbmFsIGZ1c2lvbnMgdG8gZmlsZQoKYGBge3J9CmFsbEZ1c2VFbWJyeSA8LSBhbGxGdXNlRW1icnkgJT4lCiAgcHJlcGFyZU91dHB1dChzcGVjaW1lbnNVbmlvbikKYGBgCgpgYGB7cn0KIyBBcmUgdGhlcmUgYW55IG1pc3NpbmcgZnVzaW9ucz8Kc2V0ZGlmZihlbWJyeUZ1c2VzLCBjb2xuYW1lcyhhbGxGdXNlRW1icnkpKQpgYGAKCmBgYHtyfQphbGxGdXNlRW1icnkgJT4lCiAgbXV0YXRlKAogICAgYENJQy0tTlVUTTFgID0gMCwKICAgIGBNTjEtLUJFTkQyYCA9IDAKICApICU+JQogIHdyaXRlX3RzdihlbWJyeUZpbGUpCmBgYAoKIyMjIyBXcml0ZSBlcGVuZHltb21hIGZ1c2lvbnMgdG8gZmlsZQoKYGBge3J9CmlmICghcnVubmluZ19pbl9jaSkgewogIGFsbEZ1c2VFcGVuZCAlPiUKICAgIHByZXBhcmVPdXRwdXQoc3BlY2ltZW5zVW5pb24pICU+JQogICAgbXV0YXRlKAogICAgICBgQzExb3JmOTUtLVlBUDFgID0gMCwKICAgICAgYExUQlAzLS1SRUxBYCA9IDAsCiAgICAgIGBQVEVOLS1UQVMyUjFgID0gMCwKICAgICAgYFlBUDEtLU1BTUxEMmAgPSAwCiAgICApICU+JQogICAgd3JpdGVfdHN2KGVwZW5kRmlsZSkKfQpgYGAK
+LS0tCnRpdGxlOiAiR2VuZXJhdGUgRnVzaW9uIFN1bW1hcnkgRmlsZXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6IERhbmllbCBNaWxsZXIgKEQzYikgYW5kIEphY2x5biBUYXJvbmkgKENDREwpCmRhdGU6IEphbnVhcnkgMjAyMApwYXJhbXM6CiAgaXNfY2k6IDAKLS0tCgpHZW5lcmF0ZSBmdXNpb24gZmlsZXMgc3BlY2lmaWNhbGx5IGZvciBjb25zdW1wdGlvbiBieSBtb2xlY3VsYXIgc3VidHlwaW5nIGFuYWx5c2VzCgojIyBTZXQgdXAKCmBgYHtyfQojIGlmIHJ1bm5pbmcgaW4gQ0ksIHdlIG5lZWQgdG8gc2tpcCB0aGUgRVBOIHN0ZXBzCmlmIChwYXJhbXMkaXNfY2kgPT0gMCkgcnVubmluZ19pbl9jaSA8LSBGQUxTRQppZiAocGFyYW1zJGlzX2NpID09IDEpIHJ1bm5pbmdfaW5fY2kgPC0gVFJVRQpgYGAKCiMjIyBMaWJyYXJpZXMgYW5kIGZ1bmN0aW9ucwoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCmBgYHtyfQojJyBHZW5lcmF0ZSBmaWx0ZXJlZCBmdXNpb24gZnJhbWUKIycgQHBhcmFtIGRmIFVuZmlsdGVyZWQgZnVzaW9uIGRhdGEgZnJhbWUKIycgQHBhcmFtIGJpb2lkIExpc3Qgb2YgYmlvc3BlY2ltZW4gSURzCiMnIEBwYXJhbSBmdXNlcyBMaXN0IG9mIGV4cGxpY2l0IGZ1c2lvbiBuYW1lcwojJyBAcGFyYW0gZ2VuZXMgTGlzdCBvZiBnZW5lIG5hbWVzCiMnIEByZXR1cm4gdGhlIGZpbHRlcmVkIGZ1c2lvbiBkYXRhIGZyYW1lCmZpbHRlckZ1c2lvbiA8LSBmdW5jdGlvbihkZiwgYmlvaWQsIGZ1c2VzLCBnZW5lcykgewogIGlmICghbWlzc2luZyhiaW9pZCkpIHsKICAgIGRmIDwtIGZpbHRlcihkZiwgU2FtcGxlICVpbiUgYmlvaWQpCiAgfQogIGlmICghbWlzc2luZyhmdXNlcykgJiAhbWlzc2luZyhnZW5lcykpIHsKICAgIGRmIDwtIGZpbHRlcihkZiwgRnVzaW9uTmFtZSAlaW4lIGZ1c2VzIHwKICAgICAgICAgICAgICAgICAgIEdlbmUxQSAlaW4lIGdlbmVzIHwKICAgICAgICAgICAgICAgICAgIEdlbmUyQSAlaW4lIGdlbmVzIHwKICAgICAgICAgICAgICAgICAgIEdlbmUxQiAlaW4lIGdlbmVzIHwKICAgICAgICAgICAgICAgICAgIEdlbmUyQiAlaW4lIGdlbmVzKQogIH0gZWxzZSBpZiAoIW1pc3NpbmcoZnVzZXMpKSB7CiAgICBkZiA8LSBmaWx0ZXIoZGYsIEZ1c2lvbk5hbWUgJWluJSBmdXNlcykKICB9IGVsc2UgaWYgKCFtaXNzaW5nKGdlbmVzKSkgewogICAgZGYgPC0gZmlsdGVyKGRmLAogICAgICAgICAgICAgICAgIEdlbmUxQSAlaW4lIGdlbmVzIHwKICAgICAgICAgICAgICAgICAgIEdlbmUyQSAlaW4lIGdlbmVzIHwKICAgICAgICAgICAgICAgICAgIEdlbmUxQiAlaW4lIGdlbmVzIHwKICAgICAgICAgICAgICAgICAgIEdlbmUyQiAlaW4lIGdlbmVzKQogIH0KICByZXR1cm4oZGYgJT4lIHNlbGVjdChTYW1wbGUsIEZ1c2lvbk5hbWUpKQp9CgoKIycgR2VuZXJhdGUgbWF0cml4IHdpdGggZnVzaW9uIGNvdW50cwojJyBAcGFyYW0gZnVzZURGIEZpbHRlcmVkIGZ1c2lvbiBkYXRhIGZyYW1lCiMnIEBwYXJhbSBiaW9pZCBMaXN0IG9mIGJpb3NwZWNpbWVuIElEcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiBmaW5hbCB0YWJsZQoKIycgQHJldHVybiBEYXRhIGZyYW1lIHRoYXQgY29udGFpbnMgZnVzaW9uIGNvdW50cwpwcmVwYXJlT3V0cHV0IDwtIGZ1bmN0aW9uKGZ1c2VERiwgYmlvaWQpIHsKICBmdXNlREYgJT4lIAogICAgcmVzaGFwZTI6OmRjYXN0KFNhbXBsZSB+IEZ1c2lvbk5hbWUpICU+JQogICAgcmlnaHRfam9pbihkYXRhLmZyYW1lKFNhbXBsZSA9IGJpb2lkKSkgJT4lCiAgICByZXBsYWNlKGlzLm5hKC4pLCAwKSAlPiUKICAgIHJlbmFtZShLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEID0gU2FtcGxlKQp9CmBgYAoKIyMjIFJlYWQgaW4gZGF0YQoKYGBge3J9CmRhdGFEaXIgPC0gZmlsZS5wYXRoKCIuLiIsICIuLiIsICJkYXRhIikKIycgVGhlIHB1dGF0aXZlIG9uY29nZW5pYyBmdXNpb24gZmlsZSBpcyB3aGF0IHdlJ2xsIHVzZSB0byBjaGVjayBmb3IgdGhlIAojJyBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIHRoZSBmdXNpb25zLgpwdXRhdGl2ZU9uY29nZW5pY0RGIDwtIAogIHJlYWRfdHN2KGZpbGUucGF0aChkYXRhRGlyLCAicGJ0YS1mdXNpb24tcHV0YXRpdmUtb25jb2dlbmljLnRzdiIpKQojJyBIb3dldmVyLCBzb21lIGJpb3NwZWNpbWVucyBhcmUgbm90IHJlcHJlc2VudGVkIGluIHRoaXMgZmlsdGVyZWQsIHByaW9yaXRpemVkCiMnIGZpbGUgYnV0ICphcmUqIHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIGZpbGVzIC0tIHRoaXMgd2lsbCBjYXVzZSB0aGVtIHRvIGJlCiMnICJtaXNzaW5nIiBpbiB0aGUgZmluYWwgZmlsZXMgZm9yIGNvbnN1bXB0aW9uIHdoaWNoIGNvdWxkIG1pc2xlYWQgYW5hbHlzdHMuCmFycmliYURGIDwtIHJlYWRfdHN2KGZpbGUucGF0aChkYXRhRGlyLCAicGJ0YS1mdXNpb24tYXJyaWJhLnRzdi5neiIpKQpzdGFyZnVzaW9uREYgPC0gcmVhZF90c3YoZmlsZS5wYXRoKGRhdGFEaXIsICJwYnRhLWZ1c2lvbi1zdGFyZnVzaW9uLnRzdi5neiIpKQpgYGAKCiMjIyBPdXRwdXQKCmBgYHtyfQpyZXN1bHRzRGlyIDwtICJyZXN1bHRzIgppZiAoIWRpci5leGlzdHMocmVzdWx0c0RpcikpIHsKICBkaXIuY3JlYXRlKHJlc3VsdHNEaXIpCn0KZXBlbmRGaWxlIDwtIGZpbGUucGF0aChyZXN1bHRzRGlyLCAiZnVzaW9uX3N1bW1hcnlfZXBlbmR5bW9tYV9mb2kudHN2IikKZW1icnlGaWxlIDwtIGZpbGUucGF0aChyZXN1bHRzRGlyLCAiZnVzaW9uX3N1bW1hcnlfZW1icnlvbmFsX2ZvaS50c3YiKQpgYGAKCiMjIEZ1c2lvbnMgYW5kIGdlbmVzIG9mIGludGVyZXN0CgpUYWtlbiBmcm9tIFtgQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcyMyNDVgXShodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcy9pc3N1ZXMvMjQ1KSBhbmQgW2BBbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzIzI1MWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9BbGV4c0xlbW9uYWRlL09wZW5QQlRBLWFuYWx5c2lzL2lzc3Vlcy8yNTEpLCByZXNwZWN0aXZlbHkuCgpgYGB7cn0KIycgKipGaWx0ZXJzKioKIycKIycgKkZ1c2lvbnMgRmlsdGVycyoKIycgMTogRXhhY3QgbWF0Y2ggYSBsaXN0IG9mIGZ1c2lvbnMgY29tbW9uIGluIEVwZW5keW1vbWEgdHVtb3JzCmVwZW5kRnVzZXMgPC0gYygKICAiQzExb3JmOTUtLU1BTUwyIiwKICAiQzExb3JmOTUtLVJFTEEiLAogICJDMTFvcmY5NS0tWUFQMSIsCiAgIkxUQlAzLS1SRUxBIiwKICAiUFRFTi0tVEFTMlIxIiwKICAiWUFQMS0tRkFNMTE4QiIsCiAgIllBUDEtLU1BTUxEMSIsCiAgIllBUDEtLU1BTUxEMiIKKQplcGVuZEdlbmVzIDwtIGMoCiAgIlJFTEEiCikKIycgMjogRXhhY3QgbWF0Y2ggYSBsaXN0IG9mIGZ1c2lvbnMgY29tbW9uIGluIEVtYnJ5b25hbCB0dW1vcnMKIycgYXMgd2VsbCBhcyBmdXNpb25zIGNvbnRhaW5pbmcgYSBwYXJ0aWN1bGFyIGdlbmUgd2l0aCBhbnkgb3RoZXIgZ2VuZQplbWJyeUZ1c2VzIDwtIGMoCiAgIkNJQy0tTlVUTTEiLAogICJNTjEtLUJFTkQyIiwKICAiTU4xLS1DWFhDNSIKKQplbWJyeUdlbmVzIDwtIGMoCiAgIkZPWFIyIiwKICAiTU4xIiwKICAiVFRZSDEiCikKYGBgCgojIyMgRmlsdGVyIHB1dGF0aXZlIG9uY29nZW5pYyBmdXNpb25zIGxpc3QKCmBgYHtyfQphbGxGdXNlRXBlbmQgPC0gZmlsdGVyRnVzaW9uKGRmID0gcHV0YXRpdmVPbmNvZ2VuaWNERiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdXNlcyA9IGVwZW5kRnVzZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXMgPSBlcGVuZEdlbmVzKQphbGxGdXNlRW1icnkgPC0gZmlsdGVyRnVzaW9uKGRmID0gcHV0YXRpdmVPbmNvZ2VuaWNERiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdXNlcyA9IGVtYnJ5RnVzZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXMgPSBlbWJyeUdlbmVzKQpgYGAKCkdldCB0aGUgYmlvc3BlY2ltZW4gSURzIHRoYXQgYXJlIHByZXNlbnQgaW4gKmVpdGhlciogY2FsbGVyIGZpbGUgKEFycmliYSwgU1RBUkZ1c2lvbikuClRoZSBmdXNpb25zIGluIHRoZSBwdXRhdGl2ZSBvbmNvZ2VuaWMgZnVzaW9uIGZpbGUgY2FuIGJlIHJldGFpbmVkIGV2ZW4gaWYgdGhleSBhcmUgbm90IGluIGJvdGggY2FsbGVyczogaHR0cHM6Ly9naXRodWIuY29tL0FsZXhzTGVtb25hZGUvT3BlblBCVEEtYW5hbHlzaXMvYmxvYi84ZmJhMTc1MzYwOGQ4YWMwYWEzZDVkN2Q2M2M0ODBiOGYwMGZmMGU5L2FuYWx5c2VzL2Z1c2lvbl9maWx0ZXJpbmcvMDQtcHJvamVjdC1zcGVjaWZpYy1maWx0ZXJpbmcuUm1kI0wyNDIKV2UgdXNlIHRoZSBwdXRhdGl2ZSBvbmNvZ2VuaWMgZmlsZSBoZXJlLCB0aGVyZWZvcmUgYW55IHNhbXBsZSB0aGF0IGlzIGluIGVpdGhlciBmaWxlIGJ1dCBkb2VzIG5vdCBoYXZlIGEgZnVzaW9uIHRoYXQgaXMgcmVsZXZhbnQgdG8gdGhlIHN1YnR5cGluZyB0aWNrZXRzIGlzIG5vdCBfbWlzc2luZ18gYnV0IGluc3RlYWQgaGFzIG5vIGV2aWRlbmNlIG9mIHRoZSByZWxldmFudCBmdXNpb25zLgoKYGBge3J9CnNwZWNpbWVuc1VuaW9uPC0gdW5pb24oYXJyaWJhREYkdHVtb3JfaWQsIHN0YXJmdXNpb25ERiR0dW1vcl9pZCkKYGBgCgojIyMjIFdyaXRlIG5vbi1NQiwgbm9uLUFUUlQgZW1icnlvbmFsIGZ1c2lvbnMgdG8gZmlsZQoKYGBge3J9CmlmICghcnVubmluZ19pbl9jaSkgewogIGFsbEZ1c2VFbWJyeSA8LSBhbGxGdXNlRW1icnkgJT4lCiAgICBwcmVwYXJlT3V0cHV0KHNwZWNpbWVuc1VuaW9uKQogIGFsbEZ1c2VFbWJyeSAlPiUKICAgIG11dGF0ZSgKICAgICAgYENJQy0tTlVUTTFgID0gMCwKICAgICAgYE1OMS0tQkVORDJgID0gMAogICAgKSAlPiUKICAgIHdyaXRlX3RzdihlbWJyeUZpbGUpCn0KYGBgCgojIyMjIFdyaXRlIGVwZW5keW1vbWEgZnVzaW9ucyB0byBmaWxlCgpgYGB7cn0KYWxsRnVzZUVwZW5kICU+JQogIHByZXBhcmVPdXRwdXQoc3BlY2ltZW5zVW5pb24pICU+JQogIG11dGF0ZSgKICAgIGBDMTFvcmY5NS0tWUFQMWAgPSAwLAogICAgYExUQlAzLS1SRUxBYCA9IDAsCiAgICBgUFRFTi0tVEFTMlIxYCA9IDAsCiAgICBgWUFQMS0tTUFNTEQyYCA9IDAKICApICU+JQogIHdyaXRlX3RzdihlcGVuZEZpbGUpCmBgYAo=
diff --git a/analyses/tp53_nf1_score/run_classifier.sh b/analyses/tp53_nf1_score/run_classifier.sh
index 851fac2770..3caba9d0c5 100644
--- a/analyses/tp53_nf1_score/run_classifier.sh
+++ b/analyses/tp53_nf1_score/run_classifier.sh
@@ -9,8 +9,9 @@
set -e
set -o pipefail
-# we want to skip the poly-A ROC plot in CI
-POLYA_PLOT=${OPENPBTA_POLYAPLOT:-1}
+# we want to skip the poly-A steps in CI
+# if POLYA=1, poly-A steps will be run
+POLYA=${OPENPBTA_POLYAPLOT:-1}
data_dir="data"
scratch_dir="scratch"
@@ -38,16 +39,12 @@ Rscript --vanilla ${analysis_dir}/00-tp53-nf1-alterations.R \
collapsed_stranded="pbta-gene-expression-rsem-fpkm-collapsed.stranded.rds"
collapsed_polya="pbta-gene-expression-rsem-fpkm-collapsed.polya.rds"
-# Run classifier for stranded and polya
+# Run classifier and ROC plotting for stranded data
python3 ${analysis_dir}/01-apply-classifier.py -f ${collapsed_stranded}
-python3 ${analysis_dir}/01-apply-classifier.py -f ${collapsed_polya}
-
-
-# Run ROC plot step
+python3 ${analysis_dir}/02-evaluate-classifier.py -s ${analysis_dir}/results/TP53_NF1_snv_alteration.tsv -f ${analysis_dir}/results/pbta-gene-expression-rsem-fpkm-collapsed.stranded_classifier_scores.tsv -c ${data_dir}/pbta-histologies.tsv -o stranded
-# Skip poly-A plotting in CI
-if [ "$POLYA_PLOT" -gt "0" ]; then
- python3 ${analysis_dir}/02-evaluate-classifier.py -s ${analysis_dir}/results/TP53_NF1_snv_alteration.tsv -f ${analysis_dir}/results/pbta-gene-expression-rsem-fpkm-collapsed.polya_classifier_scores.tsv -c ${data_dir}/pbta-histologies.tsv -o polya
+# Skip poly-A steps in CI
+if [ "$POLYA" -gt "0" ]; then
+ python3 ${analysis_dir}/01-apply-classifier.py -f ${collapsed_polya}
+ python3 ${analysis_dir}/02-evaluate-classifier.py -s ${analysis_dir}/results/TP53_NF1_snv_alteration.tsv -f ${analysis_dir}/results/pbta-gene-expression-rsem-fpkm-collapsed.polya_classifier_scores.tsv -c ${data_dir}/pbta-histologies.tsv -o polya
fi
-
-python3 ${analysis_dir}/02-evaluate-classifier.py -s ${analysis_dir}/results/TP53_NF1_snv_alteration.tsv -f ${analysis_dir}/results/pbta-gene-expression-rsem-fpkm-collapsed.stranded_classifier_scores.tsv -c ${data_dir}/pbta-histologies.tsv -o stranded