1 Grab annotation data for Streptococcus agalactiae.

1.1 Strain cjb111

cjb_microbes <- load_microbesonline_annotations(species="CJB111")
## Found 1 entry.
## Streptococcus agalactiae CJB111Firmicutesyes2007-05-08noNANA2208342617
## The species being downloaded is: Streptococcus agalactiae CJB111
## Downloading: http://www.microbesonline.org/cgi-bin/genomeInfo.cgi?tId=342617;export=tab
cjb_gff <- load_gff_annotations("~/scratch/libraries/genome/sagalactiae_cjb111.gff")
## Trying attempt: rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=TRUE)
## Had a successful gff import with rtracklayer::import.gff3(gff, sequenceRegionsAsSeqinfo=TRUE)
## Returning a df with 42 columns and 4347 rows.
cjb_microbes <- as.data.frame(cjb_microbes)
rownames(cjb_gff) <- make.names(cjb_gff[["locus_tag"]], unique=TRUE)
## I am going to only pay attention to the first annotation for each locus tag from microbesonline.
cjb_microbes[["sysName"]] <- make.names(cjb_microbes[["sysName"]], unique=TRUE)
## I should ask Lindsey if they would like me to merge these
cjb_annot <- cjb_gff
## cjb_annot <- merge(cjb_gff, cjb_microbes, by.x="old_locus_tag", by.y="sysName")
## rownames(cjb_annot) <- make.names(cjb_annot[["locus_tag"]], unique=TRUE)

2 Create Expressionsets

The following block merges the various counts, annotations, and experimental metadata.

Just as with the annotations, I will create one expressionset for each strain.

cjb_expt <- create_expt(metadata="sample_sheets/all_samples_cjb111.xlsx",
                        gene_info=cjb_annot, file_column="btv1m1sagalactiaecjb111")
## Reading the sample metadata.
## The sample definitions comprises: 16 rows(samples) and 18 columns(metadata fields).
## Reading count tables.
## Reading count files with read.table().
## /mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020/preprocessing/cx1/outputs/bowtie_sagalactiae_cjb111/consolidated_v2-v1M1.count_sagalactiae_cjb111_sno_gene_Name.count.xz contains 2042 rows.
## preprocessing/cx2/outputs/bowtie_sagalactiae_cjb111/consolidated_v2-v1M1.count_sagalactiae_cjb111_sno_gene_Name.count.xz contains 2042 rows and merges to 2042 rows.
## preprocessing/cx3/outputs/bowtie_sagalactiae_cjb111/consolidated_v2-v1M1.count_sagalactiae_cjb111_sno_gene_Name.count.xz contains 2042 rows and merges to 2042 rows.
## preprocessing/d1s1/outputs/bowtie_sagalactiae_cjb111/consolidated_v2-v1M1.count_sagalactiae_cjb111_sno_gene_Name.count.xz contains 2042 rows and merges to 2042 rows.
## preprocessing/d1s2/outputs/bowtie_sagalactiae_cjb111/consolidated_v2-v1M1.count_sagalactiae_cjb111_sno_gene_Name.count.xz contains 2042 rows and merges to 2042 rows.
## preprocessing/d1s3/outputs/bowtie_sagalactiae_cjb111/consolidated_v2-v1M1.count_sagalactiae_cjb111_sno_gene_Name.count.xz contains 2042 rows and merges to 2042 rows.
## preprocessing/d3s1/outputs/bowtie_sagalactiae_cjb111/consolidated_v2-v1M1.count_sagalactiae_cjb111_sno_gene_Name.count.xz contains 2042 rows and merges to 2042 rows.
## preprocessing/d3s3/outputs/bowtie_sagalactiae_cjb111/consolidated_v2-v1M1.count_sagalactiae_cjb111_sno_gene_Name.count.xz contains 2042 rows and merges to 2042 rows.
## preprocessing/tn1/outputs/bowtie_sagalactiae_cjb111/consolidated_v2-v1M1.count_sagalactiae_cjb111_sno_gene_Name.count.xz contains 2042 rows and merges to 2042 rows.
## preprocessing/tn2/outputs/bowtie_sagalactiae_cjb111/consolidated_v2-v1M1.count_sagalactiae_cjb111_sno_gene_Name.count.xz contains 2042 rows and merges to 2042 rows.
## preprocessing/tn3/outputs/bowtie_sagalactiae_cjb111/consolidated_v2-v1M1.count_sagalactiae_cjb111_sno_gene_Name.count.xz contains 2042 rows and merges to 2042 rows.
## preprocessing/ut1/outputs/bowtie_sagalactiae_cjb111/consolidated_v2-v1M1.count_sagalactiae_cjb111_sno_gene_Name.count.xz contains 2042 rows and merges to 2042 rows.
## preprocessing/ut2/outputs/bowtie_sagalactiae_cjb111/consolidated_v2-v1M1.count_sagalactiae_cjb111_sno_gene_Name.count.xz contains 2042 rows and merges to 2042 rows.
## preprocessing/vg1/outputs/bowtie_sagalactiae_cjb111/consolidated_v2-v1M1.count_sagalactiae_cjb111_sno_gene_Name.count.xz contains 2042 rows and merges to 2042 rows.
## preprocessing/vg2/outputs/bowtie_sagalactiae_cjb111/consolidated_v2-v1M1.count_sagalactiae_cjb111_sno_gene_Name.count.xz contains 2042 rows and merges to 2042 rows.
## preprocessing/vg3/outputs/bowtie_sagalactiae_cjb111/consolidated_v2-v1M1.count_sagalactiae_cjb111_sno_gene_Name.count.xz contains 2042 rows and merges to 2042 rows.
## Finished reading count data.
## Matched 1610 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 2037 rows and 16 columns.
cjb_written <- write_expt(cjb_expt, batch="raw",
                           excel=glue::glue("excel/{rundate}-cjb_counts-v{ver}.xlsx"))
## Writing the first sheet, containing a legend and some summary data.
## Writing the raw reads.
## Graphing the raw reads.
## `geom_smooth()` using formula 'y ~ x'
## `geom_smooth()` using formula 'y ~ x'
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Warning: ggrepel: 12 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 14 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Warning: ggrepel: 1 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Attempting mixed linear model with: ~  condition + batch
## Fitting the expressionset to the model, this is slow.
## Loading required package: Matrix
## 
## Total:11 s
## Placing factor: condition at the beginning of the model.
## Writing the normalized reads.
## Graphing the normalized reads.
## Warning: ggrepel: 2 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## `geom_smooth()` using formula 'y ~ x'
## `geom_smooth()` using formula 'y ~ x'
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Warning in doTryCatch(return(expr), name, parentenv, handler): display list
## redraw incomplete
## Warning: ggrepel: 1 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Attempting mixed linear model with: ~  condition + batch
## Fitting the expressionset to the model, this is slow.
## 
## Total:11 s
## Placing factor: condition at the beginning of the model.
## Writing the median reads by factor.

3 A Few diagnostic plots

cjb_written[["legend_plot"]]

cjb_written[["raw_libsize"]]

cjb_written[["raw_density"]]

## awesome

cjb_written[["norm_disheat"]]

cjb_written[["norm_corheat"]]

plot_topn(cjb_expt, num=40)$plot
## `geom_smooth()` using formula 'y ~ x'

cjb_n <- normalize_expt(cjb_expt, filter=TRUE, norm="quant", convert="cpm", transform="log2")
## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(cbcb(data))))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 170 low-count genes (1867 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## The method is: raw.
## Step 4: not doing batch correction.
## Step 4: transforming the data with log2.
## transform_counts: Found 2 values equal to 0, adding 1 to the matrix.
plot_pca(cjb_n)$plot

cjb_nb <- normalize_expt(cjb_expt, filter=TRUE, norm="quant",
                         transform="log2", batch="limma")
## This function will replace the expt$expressionset slot with:
## log2(limma(quant(cbcb(data))))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Step 1: performing count filter with option: cbcb
## Removing 170 low-count genes (1867 remaining).
## Step 2: normalizing the data with quant.
## Step 3: not converting the data.
## The method is: limma.
## Step 4: doing batch correction with limma.
## Using the current state of normalization.
## Passing the data to all_adjusters using the limma estimate type.
## batch_counts: Before batch/surrogate estimation, 29850 entries are x>1: 100%.
## batch_counts: Before batch/surrogate estimation, 2 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 20 entries are 0<x<1: 0%.
## The be method chose 2 surrogate variables.
## batch_counts: Using limma's removeBatchEffect to remove batch effect.
## If you receive a warning: 'NANs produced', one potential reason is that the data was quantile normalized.
## There are 1 (0%) elements which are < 0 after batch correction.
## Setting low elements to zero.
## Step 4: transforming the data with log2.
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
plot_pca(cjb_nb)$plot

tn_de <- all_pairwise(cjb_expt, filter=TRUE, batch="svaseq")
## Plotting a PCA before surrogate/batch inclusion.
## Not putting labels on the PC plot.
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Not putting labels on the PC plot.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

keepers <- list(
  "ut" = c("ut", "tn"),
  "d1" = c("d1", "tn"),
  "d3" = c("d3", "tn"),
  "cx" = c("cx", "tn"),
  "vg" = c("vg", "tn"))
tn_tables <- combine_de_tables(tn_de, keepers=keepers,
                               excel=glue::glue("excel/vivo_fitness-v{ver}.xlsx"))
## Deleting the file excel/vivo_fitness-v202011.xlsx before writing the tables.
## Writing a legend of columns.
## Printing a pca plot before/after surrogates/batch estimation.
## Working on 1/5: ut which is: ut/tn.
## Found table with ut_vs_tn
## The ebseq table is null.
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Working on 2/5: d1 which is: d1/tn.
## Found inverse table with tn_vs_d1
## The ebseq table is null.
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Working on 3/5: d3 which is: d3/tn.
## Found inverse table with tn_vs_d3
## The ebseq table is null.
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Working on 4/5: cx which is: cx/tn.
## Found inverse table with tn_vs_cx
## The ebseq table is null.
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Working on 5/5: vg which is: vg/tn.
## Found table with vg_vs_tn
## The ebseq table is null.
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Only 1 bin; IHW reduces to Benjamini Hochberg (uniform weights)
## Adding venn plots for ut.

## Limma expression coefficients for ut; R^2: 0.429; equation: y = 0.781x + 0.589
## Deseq expression coefficients for ut; R^2: 0.521; equation: y = 0.406x + 6.16
## Edger expression coefficients for ut; R^2: 0.491; equation: y = 0.406x + 12.1
## Adding venn plots for d1.

## Limma expression coefficients for d1; R^2: 0.834; equation: y = 0.864x + 0.493
## Deseq expression coefficients for d1; R^2: 0.754; equation: y = 1.24x - 3.23
## Edger expression coefficients for d1; R^2: 0.752; equation: y = 1.19x - 2.95
## Adding venn plots for d3.

## Limma expression coefficients for d3; R^2: 0.715; equation: y = 0.789x + 0.71
## Deseq expression coefficients for d3; R^2: 0.696; equation: y = 1.33x - 5.67
## Edger expression coefficients for d3; R^2: 0.679; equation: y = 1.22x - 4.83
## Adding venn plots for cx.

## Limma expression coefficients for cx; R^2: 0.624; equation: y = 0.71x + 0.853
## Deseq expression coefficients for cx; R^2: 0.617; equation: y = 1.33x - 5.8
## Edger expression coefficients for cx; R^2: 0.586; equation: y = 1.25x - 6.27
## Adding venn plots for vg.

## Limma expression coefficients for vg; R^2: 0.626; equation: y = 0.962x - 0.00323
## Deseq expression coefficients for vg; R^2: 0.588; equation: y = 0.431x + 6.44
## Edger expression coefficients for vg; R^2: 0.567; equation: y = 0.432x + 9.18
## Writing summary information, compare_plot is: TRUE.
## Performing save of excel/vivo_fitness-v202011.xlsx.

4 Check tnseq saturation

I moved this above the differential “expression”/“fitness” analysis so that we can add the results from it as annotation data to the DE tables if requested.

saturation_a909_cx1 <- tnseq_saturation(
  "preprocessing/d1s3/outputs/essentiality_sagalactiae_a909/r2_ca_v3-v1M1.wig")
saturation_d1s3$plot
## Error in eval(expr, envir, enclos): object 'saturation_d1s3' not found
saturation_d1s3$hits_summary
## Error in eval(expr, envir, enclos): object 'saturation_d1s3' not found
saturation_cx1 <- tnseq_saturation(
  "preprocessing/cx1/outputs/essentiality_sagalactiae_cjb111/consolidated_v2-v1M1.wig",
  adjust=2)
saturation_cx1$plot
## Warning: Removed 4377 rows containing non-finite values (stat_bin).
## Warning: Removed 4377 rows containing non-finite values (stat_density).
## Warning: Removed 2 rows containing missing values (geom_bar).

saturation_cx1$hits_summary
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0      18      68     207     252    4815
ess_plts <- plot_essentiality(
  "preprocessing/cx1/outputs/essentiality_sagalactiae_cjb111/mh_ess-consolidated_v2-v1M1_gene_tas_m1.csv")
ess_plts[["zbar"]]

saturation_cx2 <- tnseq_saturation(
  "preprocessing/cx2/outputs/essentiality_sagalactiae_cjb111/consolidated_v2-v1M1.wig")
saturation_cx2$plot
## Warning: Removed 1991 rows containing non-finite values (stat_bin).
## Warning: Removed 1991 rows containing non-finite values (stat_density).
## Warning: Removed 2 rows containing missing values (geom_bar).

saturation_cx2$hits_summary
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0      18     105     268     374    3743
ess_plts <- plot_essentiality(
  "preprocessing/cx2/outputs/essentiality_sagalactiae_cjb111/mh_ess-consolidated_v2-v1M1_gene_tas_m1.csv")
ess_plts[["zbar"]]

saturation_cx3 <- tnseq_saturation(
  "preprocessing/cx3/outputs/essentiality_sagalactiae_cjb111/consolidated_v2-v1M1.wig")
saturation_cx3$plot
## Warning: Removed 1989 rows containing non-finite values (stat_bin).
## Warning: Removed 1989 rows containing non-finite values (stat_density).
## Warning: Removed 2 rows containing missing values (geom_bar).

saturation_cx3$hits_summary
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0      26      91     353     386    8771
ess_plts <- plot_essentiality(
  "preprocessing/cx3/outputs/essentiality_sagalactiae_cjb111/mh_ess-consolidated_v2-v1M1_gene_tas_m1.csv")
ess_plts[["zbar"]]

saturation_d1s1 <- tnseq_saturation(
    "preprocessing/d1s1/outputs/essentiality_sagalactiae_cjb111/consolidated_v2-v1M1.wig")
saturation_d1s1$plot
## Warning: Removed 11638 rows containing non-finite values (stat_bin).
## Warning: Removed 11638 rows containing non-finite values (stat_density).
## Warning: Removed 2 rows containing missing values (geom_bar).

saturation_d1s1$hits_summary
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0    14.0    41.0    97.9   110.0  2595.0
ess_plts <- plot_essentiality(
  "preprocessing/d1s1/outputs/essentiality_sagalactiae_cjb111/mh_ess-consolidated_v2-v1M1_gene_tas_m2.csv")
ess_plts[["zbar"]]

saturation_d1s2 <- tnseq_saturation(
  "preprocessing/d1s2/outputs/essentiality_sagalactiae_cjb111/consolidated_v2-v1M1.wig")
saturation_d1s2$plot
## Warning: Removed 5413 rows containing non-finite values (stat_bin).
## Warning: Removed 5413 rows containing non-finite values (stat_density).
## Warning: Removed 2 rows containing missing values (geom_bar).

saturation_d1s2$hits_summary
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0      17      54     184     205    6218
ess_plts <- plot_essentiality(
  "preprocessing/d1s2/outputs/essentiality_sagalactiae_cjb111/mh_ess-consolidated_v2-v1M1_gene_tas_m2.csv")
## Warning in lmrob.S(x, y, control = control): S refinements did not converge (to
## refine.tol=1e-07) in 200 (= k.max) steps
## Warning in lmrob.S(x, y, control = control): S refinements did not converge (to
## refine.tol=1e-07) in 200 (= k.max) steps
ess_plts[["zbar"]]

saturation_d1s3 <- tnseq_saturation(
  "preprocessing/d1s3/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig")
## Warning in file(file, "rt"): cannot open file 'preprocessing/d1s3/outputs/
## essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig': No such file or directory
## Error in file(file, "rt"): cannot open the connection
saturation_d1s3$plot
## Error in eval(expr, envir, enclos): object 'saturation_d1s3' not found
saturation_d1s3$hits_summary
## Error in eval(expr, envir, enclos): object 'saturation_d1s3' not found
ess_plts <- plot_essentiality(
  "preprocessing/d1s3/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv")
## Error: 'preprocessing/d1s3/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
ess_plts[["zbar"]]

saturation_d3s1 <- tnseq_saturation(
  "preprocessing/d3s1/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig")
## Warning in file(file, "rt"): cannot open file 'preprocessing/d3s1/outputs/
## essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig': No such file or directory
## Error in file(file, "rt"): cannot open the connection
saturation_d3s1$plot
## Error in eval(expr, envir, enclos): object 'saturation_d3s1' not found
saturation_d3s1$hits_summary
## Error in eval(expr, envir, enclos): object 'saturation_d3s1' not found
ess_plts <- plot_essentiality(
  "preprocessing/d3s1/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv")
## Error: 'preprocessing/d3s1/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
ess_plts[["zbar"]]

saturation_d3s3 <- tnseq_saturation(
  "preprocessing/d3s3/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig")
## Warning in file(file, "rt"): cannot open file 'preprocessing/d3s3/outputs/
## essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig': No such file or directory
## Error in file(file, "rt"): cannot open the connection
saturation_d3s3$plot
## Error in eval(expr, envir, enclos): object 'saturation_d3s3' not found
saturation_d3s3$hits_summary
## Error in eval(expr, envir, enclos): object 'saturation_d3s3' not found
ess_plts <- plot_essentiality(
  "preprocessing/d3s3/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv")
## Error: 'preprocessing/d3s3/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
ess_plts[["zbar"]]

saturation_tn1 <- tnseq_saturation(
  "preprocessing/tn1/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig")
## Warning in file(file, "rt"): cannot open file 'preprocessing/tn1/outputs/
## essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig': No such file or directory
## Error in file(file, "rt"): cannot open the connection
saturation_tn1$plot
## Error in eval(expr, envir, enclos): object 'saturation_tn1' not found
saturation_tn1$hits_summary
## Error in eval(expr, envir, enclos): object 'saturation_tn1' not found
ess_plts <- plot_essentiality(
  "preprocessing/tn1/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv")
## Error: 'preprocessing/tn1/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
ess_plts[["zbar"]]

saturation_tn2 <- tnseq_saturation(
  "preprocessing/tn2/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig")
## Warning in file(file, "rt"): cannot open file 'preprocessing/tn2/outputs/
## essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig': No such file or directory
## Error in file(file, "rt"): cannot open the connection
saturation_tn2$plot
## Error in eval(expr, envir, enclos): object 'saturation_tn2' not found
saturation_tn2$hits_summary
## Error in eval(expr, envir, enclos): object 'saturation_tn2' not found
ess_plts <- plot_essentiality(
  "preprocessing/tn2/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv")
## Error: 'preprocessing/tn2/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
ess_plts[["zbar"]]

saturation_tn3 <- tnseq_saturation(
  "preprocessing/tn3/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig")
## Warning in file(file, "rt"): cannot open file 'preprocessing/tn3/outputs/
## essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig': No such file or directory
## Error in file(file, "rt"): cannot open the connection
saturation_tn3$plot
## Error in eval(expr, envir, enclos): object 'saturation_tn3' not found
saturation_tn3$hits_summary
## Error in eval(expr, envir, enclos): object 'saturation_tn3' not found
ess_plts <- plot_essentiality(
  "preprocessing/tn3/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv")
## Error: 'preprocessing/tn3/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
ess_plts[["zbar"]]

saturation_ut1 <- tnseq_saturation(
  "preprocessing/ut1/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig")
## Warning in file(file, "rt"): cannot open file 'preprocessing/ut1/outputs/
## essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig': No such file or directory
## Error in file(file, "rt"): cannot open the connection
saturation_ut1$plot
## Error in eval(expr, envir, enclos): object 'saturation_ut1' not found
saturation_ut1$hits_summary
## Error in eval(expr, envir, enclos): object 'saturation_ut1' not found
ess_plts <- plot_essentiality(
  "preprocessing/ut1/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv")
## Error: 'preprocessing/ut1/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
ess_plts[["zbar"]]

saturation_ut2 <- tnseq_saturation(
  "preprocessing/ut2/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig")
## Warning in file(file, "rt"): cannot open file 'preprocessing/ut2/outputs/
## essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig': No such file or directory
## Error in file(file, "rt"): cannot open the connection
saturation_ut2$plot
## Error in eval(expr, envir, enclos): object 'saturation_ut2' not found
saturation_ut2$hits_summary
## Error in eval(expr, envir, enclos): object 'saturation_ut2' not found
ess_plts <- plot_essentiality(
  "preprocessing/ut2/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv")
## Error: 'preprocessing/ut2/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
ess_plts[["zbar"]]

saturation_vg1 <- tnseq_saturation(
  "preprocessing/vg1/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig")
## Warning in file(file, "rt"): cannot open file 'preprocessing/vg1/outputs/
## essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig': No such file or directory
## Error in file(file, "rt"): cannot open the connection
saturation_vg1$plot
## Error in eval(expr, envir, enclos): object 'saturation_vg1' not found
saturation_vg1$hits_summary
## Error in eval(expr, envir, enclos): object 'saturation_vg1' not found
ess_plts <- plot_essentiality(
  "preprocessing/vg1/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv")
## Error: 'preprocessing/vg1/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
ess_plts[["zbar"]]

saturation_vg2 <- tnseq_saturation(
  "preprocessing/vg2/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig")
## Warning in file(file, "rt"): cannot open file 'preprocessing/vg2/outputs/
## essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig': No such file or directory
## Error in file(file, "rt"): cannot open the connection
saturation_vg2$plot
## Error in eval(expr, envir, enclos): object 'saturation_vg2' not found
saturation_vg2$hits_summary
## Error in eval(expr, envir, enclos): object 'saturation_vg2' not found
ess_plts <- plot_essentiality(
  "preprocessing/vg2/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv")
## Error: 'preprocessing/vg2/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
ess_plts[["zbar"]]

saturation_vg3 <- tnseq_saturation(
  "preprocessing/vg3/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig")
## Warning in file(file, "rt"): cannot open file 'preprocessing/vg3/outputs/
## essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1.wig': No such file or directory
## Error in file(file, "rt"): cannot open the connection
saturation_vg3$plot
## Error in eval(expr, envir, enclos): object 'saturation_vg3' not found
saturation_vg3$hits_summary
## Error in eval(expr, envir, enclos): object 'saturation_vg3' not found
ess_plts <- plot_essentiality(
  "preprocessing/vg3/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv")
## Error: 'preprocessing/vg3/outputs/essentiality_sagalactiae_cjb111/r2_ca_v3-v1M1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
ess_plts[["zbar"]]

saturation_control <- tnseq_saturation(
    "preprocessing/cx_combined/outputs/essentiality_sagalactiae_cjb111/r2-v1M1.wig")
## Warning in file(file, "rt"): cannot open file 'preprocessing/cx_combined/
## outputs/essentiality_sagalactiae_cjb111/r2-v1M1.wig': No such file or directory
## Error in file(file, "rt"): cannot open the connection
saturation_control$plot
## Error in eval(expr, envir, enclos): object 'saturation_control' not found
ess_plts <- plot_essentiality(
  "preprocessing/cx_combined/outputs/essentiality_sagalactiae_cjb111/mh_ess-r2-v1M1_gene_tas_m1.csv")
## Error: 'preprocessing/cx_combined/outputs/essentiality_sagalactiae_cjb111/mh_ess-r2-v1M1_gene_tas_m1.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
ess_plts[["zbar"]]

ess_plts <- plot_essentiality(
  "preprocessing/cx_combined/outputs/essentiality_sagalactiae_cjb111/mh_ess-r2-v1M1_gene_tas_m2.csv")
## Error: 'preprocessing/cx_combined/outputs/essentiality_sagalactiae_cjb111/mh_ess-r2-v1M1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
ess_plts[["zbar"]]

ess_plts <- plot_essentiality(
  "preprocessing/cx_combined/outputs/essentiality_sagalactiae_cjb111/mh_ess-r2-v1M1_gene_tas_m4.csv")
## Error: 'preprocessing/cx_combined/outputs/essentiality_sagalactiae_cjb111/mh_ess-r2-v1M1_gene_tas_m4.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
ess_plts[["zbar"]]

ess_plts <- plot_essentiality(
  "preprocessing/cx_combined/outputs/essentiality_sagalactiae_cjb111/mh_ess-r2-v1M1_gene_tas_m8.csv")
## Error: 'preprocessing/cx_combined/outputs/essentiality_sagalactiae_cjb111/mh_ess-r2-v1M1_gene_tas_m8.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
ess_plts[["zbar"]]

ess_plts <- plot_essentiality(
  "preprocessing/cx_combined/outputs/essentiality_sagalactiae_cjb111/mh_ess-r2-v1M1_gene_tas_m16.csv")
## Error: 'preprocessing/cx_combined/outputs/essentiality_sagalactiae_cjb111/mh_ess-r2-v1M1_gene_tas_m16.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
ess_plts[["zbar"]]

plt <- tnseq_multi_saturation(meta=pData(cjb111_expt), meta_column="cjb111esswig")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cjb111_expt' not found
plt$ggstats
## Error in eval(expr, envir, enclos): object 'plt' not found
plt <- tnseq_multi_saturation(meta=pData(cjb111_expt), meta_column="cjb111esswig")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cjb111_expt' not found
plt[["plot"]] + ggplot2::scale_y_continuous(limits=c(0, 12000))
## Error in eval(expr, envir, enclos): object 'plt' not found
## I expect the saturation of this to be a bit better than 2603V/R.

plt <- tnseq_multi_saturation(meta=pData(vr2603_expt), meta_column="vr2603esswig")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'vr2603_expt' not found
plt[["plot"]] + ggplot2::scale_y_continuous(limits=c(0, 12000))
## Error in eval(expr, envir, enclos): object 'plt' not found
## hmm this is not definitive.  It looks like cjb111 has more TAs with ~ 1 hit.
## but R/V has more hits with ~ 16<x<64 hits.

plt <- tnseq_multi_saturation(meta=pData(cjb111_expt), meta_column="cjb111esswig")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cjb111_expt' not found
plt[["plot"]] + ggplot2::scale_y_continuous(limits=c(0, 20000))
## Error in eval(expr, envir, enclos): object 'plt' not found
## I am not quite sure how to interpret this one, we have much more discrete
## numbers of reads than the others.

5 Changed genes

For differential expression, I am going to assume until I hear otherwise, that my batch assignments are not correct and that the 1,2,3 assignments of the sample names do not actually delineate separate batches. Though, if they do delineate separate batches, it might be taken as a (very)small degree of evidence that 04 and 09 were switched.

5.1 Strain cjb111

combined_essentiality <- list(
  "control" = "preprocessing/combined_control/outputs/essentiality_sagalactiae_cjb111/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv",
  "low" = "preprocessing/combined_low/outputs/essentiality_sagalactiae_cjb111/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv",
  "high" = "preprocessing/combined_high/outputs/essentiality_sagalactiae_cjb111/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv",
  "previous" = "preprocessing/combined_previous/outputs/essentiality_sagalactiae_cjb111/mh_ess-combined_ca_ta-v0M1_gene_tas_m2.csv")
ess_table <- data.frame()
for (f in 1:length(combined_essentiality)) {
  name <- names(combined_essentiality)[f]
  column_names <- c("orf", "k", "n", "r", "s", "zbar", "call")
  names <- paste0(name, "_", column_names)
  r <- readr::read_tsv(combined_essentiality[[f]], comment="#", col_names=names)
  colnames(r)[1] <- "orf"
  if (f == 1) {
    ess_table <- r
  } else {
    ess_table <- merge(ess_table, r, by="orf")
  }
}
## Error: 'preprocessing/combined_control/outputs/essentiality_sagalactiae_cjb111/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
rownames(ess_table) <- gsub(x=ess_table[["orf"]], pattern="^cds_", replacement="")
ess_table[["orf"]] <- NULL

cjb111_de <- all_pairwise(cjb111_expt, model_batch=FALSE, parallel=FALSE)
## Error in normalize_expt(input, filter = TRUE, batch = FALSE, transform = "log2", : object 'cjb111_expt' not found
cjb111_contrasts <- list(
  "low_vs_control" = c("cal_low", "control"),
  "high_vs_control" = c("cal_high", "control"))
cjb111_tables <- combine_de_tables(
  extra_annot=ess_table,
  cjb111_de, keepers=cjb111_contrasts,
  excel=glue::glue("excel/{rundate}-cjb111_tables-v{ver}.xlsx"))
## Error in combine_de_tables(extra_annot = ess_table, cjb111_de, keepers = cjb111_contrasts, : object 'cjb111_de' not found
##cjb111_sig <- extract_significant_genes(
##  cjb111_tables,
##  excel=glue::glue("excel/cjb111_sig-v{ver}.xlsx"))

6 Circos

combined_expt <- create_expt("sample_sheets/sagalactiae_combined_samples.xlsx",
                             gene_info=cjb111_annot)
## Reading the sample metadata.
## Error in read.xlsx.default(xlsxFile = file, sheet = 1) : 
##   File does not exist.
## Error in read_metadata(meta_file, ...): Unable to read the metadata file: sample_sheets/sagalactiae_combined_samples.xlsx
combined_norm <- normalize_expt(combined_expt, convert="rpkm",
                                transform="log2", na_to_zero=TRUE)
## Error in normalize_expt(combined_expt, convert = "rpkm", transform = "log2", : object 'combined_expt' not found
combined_exprs <- exprs(combined_norm)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'exprs': object 'combined_norm' not found
ess_circos <- ess_table[, c("control_call", "low_call", "high_call")] %>%
    dplyr::mutate(control_num = dplyr::case_when(
                                           control_call == "E" ~ 2,
                                           control_call == "NE" ~ 0,
                                           control_call == "S" ~ -1,
                                           control_call == "U" ~ 1),
                           low_num = dplyr::case_when(
                                                low_call == "E" ~ 2,
                                                low_call == "NE" ~ 0,
                                                low_call == "S" ~ -1,
                                                low_call == "U" ~ 1),
                           high_num = dplyr::case_when(
                                                 high_call == "E" ~ 2,
                                                 high_call == "NE" ~ 0,
                                                 high_call == "S" ~ -1,
                                                 high_call == "U" ~ 1))
## Error in `[.data.frame`(ess_table, , c("control_call", "low_call", "high_call")): undefined columns selected
ess_circos[["control_call"]] <- as.factor(ess_circos[["control_call"]])
## Error in is.factor(x): object 'ess_circos' not found
ess_circos[["low_call"]] <- as.factor(ess_circos[["low_call"]])
## Error in is.factor(x): object 'ess_circos' not found
ess_circos[["high_call"]] <- as.factor(ess_circos[["high_call"]])
## Error in is.factor(x): object 'ess_circos' not found
rownames(ess_circos) <- rownames(ess_table)
## Error in rownames(ess_circos) <- rownames(ess_table): object 'ess_circos' not found
colors <- c("990000", "008800", "000000", "0000AA")
names(colors) <- c("E", "NE", "S", "U")
low_df <- cjb111_tables[["data"]][["low_vs_control"]]
## Error in eval(expr, envir, enclos): object 'cjb111_tables' not found
high_df <- cjb111_tables[["data"]][["high_vs_control"]]
## Error in eval(expr, envir, enclos): object 'cjb111_tables' not found
circos_cfg <- circos_prefix(cjb111_annot, name="cjb111")
## This assumes you have a colors.conf in circos/colors/ and fonts.conf in circos/fonts/
## It also assumes you have conf/ideogram.conf, conf/ticks.conf, and conf/housekeeping.conf
## It will write circos/conf/cjb111.conf with a reasonable first approximation config file.
## Creating the data directory: circos/data
## The circos directory does not exist, creating: circos/conf
## Error in circos_prefix(cjb111_annot, name = "cjb111"): object 'cjb111_annot' not found
cjb111_kary <- circos_karyotype(circos_cfg, fasta="reference/sagalactiae_cjb111.fasta")
## Error in circos_karyotype(circos_cfg, fasta = "reference/sagalactiae_cjb111.fasta"): object 'circos_cfg' not found
cjb111_plus_minus <- circos_plus_minus(circos_cfg, width=0.06, thickness=40)
## Error in message("Writing data file: ", cfg[["plus_data_file"]], " with the + strand GO data."): object 'circos_cfg' not found
cjb111_control_rpkm <- circos_hist(circos_cfg, combined_exprs, colname="control",
                                 basename="control_rpkm", outer=cjb111_plus_minus,
                                 fill_color="vvdpblue", width=0.06)
## Error in circos_hist(circos_cfg, combined_exprs, colname = "control", : object 'circos_cfg' not found
cjb111_low_rpkm <- circos_hist(circos_cfg, combined_exprs, colname="low",
                             basename="low_rpkm", outer=cjb111_control_rpkm,
                             fill_color="vdpblue", width=0.06)
## Error in circos_hist(circos_cfg, combined_exprs, colname = "low", basename = "low_rpkm", : object 'circos_cfg' not found
cjb111_high_rpkm <- circos_hist(circos_cfg, combined_exprs, colname="high",
                              basename="high_rpkm", outer=cjb111_low_rpkm,
                              fill_color="dpblue", width=0.06)
## Error in circos_hist(circos_cfg, combined_exprs, colname = "high", basename = "high_rpkm", : object 'circos_cfg' not found
cjb111_control_tile <- circos_tile(circos_cfg, ess_circos, colname="control_call",
                                 colors=colors, basename="control_tile",
                                 outer=cjb111_high_rpkm, width=0.06)
## Error in circos_tile(circos_cfg, ess_circos, colname = "control_call", : object 'circos_cfg' not found
cjb111_low <- circos_hist(circos_cfg, low_df, colname="deseq_logfc", basename="low",
                        outer=0.60, fill_color="vvdpgreen", width=0.06, thickness=0.1)
## Error in circos_hist(circos_cfg, low_df, colname = "deseq_logfc", basename = "low", : object 'circos_cfg' not found
cjb111_high <- circos_hist(circos_cfg, high_df, colname="deseq_logfc", basename="high",
                         outer=cjb111_low, fill_color="vdpgreen", width=0.06, thickness=0.1)
## Error in circos_hist(circos_cfg, high_df, colname = "deseq_logfc", basename = "high", : object 'circos_cfg' not found
cjb111_suffix <- circos_suffix(circos_cfg)
## Error in circos_suffix(circos_cfg): object 'circos_cfg' not found
made <- circos_make(circos_cfg, target="cjb111")
## Error in circos_make(circos_cfg, target = "cjb111"): object 'circos_cfg' not found

Yoann sent an email this morning with the following request:

“I have now the table summarizing the data and we would like to summarize it with a Circos plot. I was hoping you could do your amazing magic on this. The data is in the Excel file I am attaching to the email. The figure would look very similar to what you did not too long ago, but with extra data. The idea will be to have the genome information and then going down into the circle we would show the THY data (in column BE), than maybe a little space and we would show the RPMI-based data (BL, BS and BZ), then again a little space and we would have a final circle integrating all previous data for the final call (CI).”

I copied the xls file to the ‘from_yoann/’ directory and exported the relevant portions to a csv file named ‘gbs_essentiality.csv’.

I just realized that the material Yoann sent me is precisely what I already did in the above section which created the ess_circos table.

yoann_table <- readr::read_csv("from_yoann/gbs_essentiality.csv")
## Error: 'from_yoann/gbs_essentiality.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
## The new column which is desired is actually the 'Final'.
## So, I will merge this with my existing ess_circos data frame and add a color for 'NC'.
## The wanted column names are:
## BE: previouscall BL: controlcall BS: lowcall BZ: highcall CI: 'Final call' (85)
wanted <- c("controlcall", "Final")
yoann_wanted <- as.data.frame(yoann_table[, wanted])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': object 'yoann_table' not found
rownames(yoann_wanted) <- yoann_table[["row.names"]]
## Error in eval(expr, envir, enclos): object 'yoann_table' not found
yoann_circos <- merge(ess_circos, yoann_wanted, by.x="row.names", by.y="row.names")
## Error in merge(ess_circos, yoann_wanted, by.x = "row.names", by.y = "row.names"): object 'ess_circos' not found
yoann_circos[["Final"]] <- as.factor(yoann_circos[["Final"]])
## Error in is.factor(x): object 'yoann_circos' not found
rownames(yoann_circos) <- yoann_circos[["Row.names"]]
## Error in eval(expr, envir, enclos): object 'yoann_circos' not found
yoann_circos[["Row.names"]] <- NULL
## Error in yoann_circos[["Row.names"]] <- NULL: object 'yoann_circos' not found
colors <- c("990000", "008800", "444444", "0000AA", "000000")
names(colors) <- c("E", "NE", "S", "U", "NC")

yoann_cfg <- circos_prefix(cjb111_annot, name="cjb111_yoann")
## This assumes you have a colors.conf in circos/colors/ and fonts.conf in circos/fonts/
## It also assumes you have conf/ideogram.conf, conf/ticks.conf, and conf/housekeeping.conf
## It will write circos/conf/cjb111_yoann.conf with a reasonable first approximation config file.
## Error in circos_prefix(cjb111_annot, name = "cjb111_yoann"): object 'cjb111_annot' not found
yoann_kary <- circos_karyotype(yoann_cfg, fasta="reference/sagalactiae_cjb111.fasta")
## Error in circos_karyotype(yoann_cfg, fasta = "reference/sagalactiae_cjb111.fasta"): object 'yoann_cfg' not found
yoann_plus_minus <- circos_plus_minus(yoann_cfg, width=0.06, thickness=40)
## Error in message("Writing data file: ", cfg[["plus_data_file"]], " with the + strand GO data."): object 'yoann_cfg' not found
yoann_control_tile <- circos_tile(yoann_cfg, ess_circos, colname="control_call",
                                  colors=colors, basename="control_tile",
                                  outer=yoann_plus_minus, width=0.06)
## Error in circos_tile(yoann_cfg, ess_circos, colname = "control_call", : object 'yoann_cfg' not found
yoann_low_tile <- circos_tile(yoann_cfg, ess_circos, colname="low_call",
                              colors=colors, basename="low_tile",
                              outer=yoann_control_tile, width=0.06)
## Error in circos_tile(yoann_cfg, ess_circos, colname = "low_call", colors = colors, : object 'yoann_cfg' not found
yoann_high_tile <- circos_tile(yoann_cfg, ess_circos, colname="high_call",
                              colors=colors, basename="high_tile",
                              outer=yoann_low_tile, width=0.06)
## Error in circos_tile(yoann_cfg, ess_circos, colname = "high_call", colors = colors, : object 'yoann_cfg' not found
yoann_final_tile <- circos_tile(yoann_cfg, yoann_circos, colname="Final",
                                colors=colors, basename="final_tile",
                                outer=yoann_high_tile, width=0.06)
## Error in circos_tile(yoann_cfg, yoann_circos, colname = "Final", colors = colors, : object 'yoann_cfg' not found
yoann_suffix <- circos_suffix(yoann_cfg)
## Error in circos_suffix(yoann_cfg): object 'yoann_cfg' not found
made <- circos_make(yoann_cfg, target="cjb111_yoann")
## Error in circos_make(yoann_cfg, target = "cjb111_yoann"): object 'yoann_cfg' not found

7 Another Yoann query

First, between the COG categories and the THY data, I would like to add the saturation level of the library: this would be the blue lines from the Circos figure you produce a while back (see Circos plot attached to this email).

Second, I would like to add a new ring of essentiality that summarizes the data from the rings (1), (2), (3) and (4) abovementioned. The data is listed in the attached Excel document and is found in column CI, called Lindsey’s call. I would like the data to look a little different so it “pops” as it is a summary. I remember back in the day, we did something similar with some of my data in Group A strep, and we had the non-essential genes showing in yellow.

In order to do the above, I saved the excel file Yoann sent me, exported the relevant column to a 2 column cvs file, containing the gene IDs and calls. Now I will copy/paste the previous set of rings and add the new requests.

yoann_202006 <- readr::read_csv("from_yoann/lindsey_calls.csv")
## Error: 'from_yoann/lindsey_calls.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
yoann_202006 <- as.data.frame(yoann_202006)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': object 'yoann_202006' not found
rownames(yoann_202006) <- yoann_202006[["ID"]]
## Error in eval(expr, envir, enclos): object 'yoann_202006' not found
colnames(yoann_202006) <- c("ID202006", "lindsey_call")
## Error in colnames(yoann_202006) <- c("ID202006", "lindsey_call"): object 'yoann_202006' not found
lindsey_colors <- c("e31212", "f0c505", "444444", "0000AA", "000000")
names(lindsey_colors) <- c("E", "NE", "S", "U", "NC")

yoann_circos_202006 <- merge(yoann_circos, yoann_202006, by.x="row.names", by.y="row.names")
## Error in merge(yoann_circos, yoann_202006, by.x = "row.names", by.y = "row.names"): object 'yoann_circos' not found
rownames(yoann_circos_202006) <- yoann_circos_202006[["Row.names"]]
## Error in eval(expr, envir, enclos): object 'yoann_circos_202006' not found
yoann_circos_202006[["Row.names"]] <- NULL
## Error in yoann_circos_202006[["Row.names"]] <- NULL: object 'yoann_circos_202006' not found
yoann_cfg_202006 <- circos_prefix(cjb111_annot, name="cjb111_yoann_202006")
## This assumes you have a colors.conf in circos/colors/ and fonts.conf in circos/fonts/
## It also assumes you have conf/ideogram.conf, conf/ticks.conf, and conf/housekeeping.conf
## It will write circos/conf/cjb111_yoann_202006.conf with a reasonable first approximation config file.
## Error in circos_prefix(cjb111_annot, name = "cjb111_yoann_202006"): object 'cjb111_annot' not found
yoann_kary_202006 <- circos_karyotype(yoann_cfg_202006, fasta="reference/sagalactiae_cjb111.fasta")
## Error in circos_karyotype(yoann_cfg_202006, fasta = "reference/sagalactiae_cjb111.fasta"): object 'yoann_cfg_202006' not found
yoann_plus_minus_202006 <- circos_plus_minus(yoann_cfg_202006, width=0.05, thickness=40)
## Error in message("Writing data file: ", cfg[["plus_data_file"]], " with the + strand GO data."): object 'yoann_cfg_202006' not found
cjb111_control_rpkm_202006 <- circos_hist(yoann_cfg_202006, combined_exprs, colname="control",
                                        basename="control_rpkm", outer=yoann_plus_minus_202006,
                                        fill_color="vvdpblue", width=0.05)
## Error in circos_hist(yoann_cfg_202006, combined_exprs, colname = "control", : object 'yoann_cfg_202006' not found
cjb111_low_rpkm_202006 <- circos_hist(yoann_cfg_202006, combined_exprs, colname="low",
                                    basename="low_rpkm", outer=cjb111_control_rpkm_202006,
                                    fill_color="vdpblue", width=0.05)
## Error in circos_hist(yoann_cfg_202006, combined_exprs, colname = "low", : object 'yoann_cfg_202006' not found
cjb111_high_rpkm_202006 <- circos_hist(yoann_cfg_202006, combined_exprs, colname="high",
                                     basename="high_rpkm", outer=cjb111_low_rpkm_202006,
                                     fill_color="dpblue", width=0.05)
## Error in circos_hist(yoann_cfg_202006, combined_exprs, colname = "high", : object 'yoann_cfg_202006' not found
lindsey_tile_202006 <- circos_tile(yoann_cfg_202006, yoann_circos_202006, colname="lindsey_call",
                                   colors=lindsey_colors, basename="summary_tile", thickness=60,
                                   stroke_thickness=0.001,
                                   outer=cjb111_high_rpkm_202006, width=0.05)
## Error in circos_tile(yoann_cfg_202006, yoann_circos_202006, colname = "lindsey_call", : object 'yoann_cfg_202006' not found
yoann_control_tile_202006 <- circos_tile(yoann_cfg_202006, ess_circos, colname="control_call",
                                         colors=colors, basename="control_tile", thickness=60,
                                         stroke_thickness=0.001,
                                         outer=lindsey_tile_202006, width=0.05)
## Error in circos_tile(yoann_cfg_202006, ess_circos, colname = "control_call", : object 'yoann_cfg_202006' not found
yoann_low_tile_202006 <- circos_tile(yoann_cfg_202006, ess_circos, colname="low_call",
                                     colors=colors, basename="low_tile",
                                     thickness=60, stroke_thickness=0.001,
                                     outer=yoann_control_tile_202006, width=0.05)
## Error in circos_tile(yoann_cfg_202006, ess_circos, colname = "low_call", : object 'yoann_cfg_202006' not found
yoann_high_tile_202006 <- circos_tile(yoann_cfg_202006, ess_circos, colname="high_call",
                                      colors=colors, basename="high_tile",
                                      thickness=60, stroke_thickness=0.001,
                                      outer=yoann_low_tile_202006, width=0.05)
## Error in circos_tile(yoann_cfg_202006, ess_circos, colname = "high_call", : object 'yoann_cfg_202006' not found
yoann_final_tile_202006 <- circos_tile(yoann_cfg_202006, yoann_circos_202006, colname="Final",
                                       colors=colors, basename="final_tile",
                                       thickness=60, stroke_thickness=0.001,
                                       outer=yoann_high_tile_202006, width=0.05)
## Error in circos_tile(yoann_cfg_202006, yoann_circos_202006, colname = "Final", : object 'yoann_cfg_202006' not found
yoann_suffix_202006 <- circos_suffix(yoann_cfg_202006)
## Error in circos_suffix(yoann_cfg_202006): object 'yoann_cfg_202006' not found
made <- circos_make(yoann_cfg_202006, target="cjb111_yoann_202006")
## Error in circos_make(yoann_cfg_202006, target = "cjb111_yoann_202006"): object 'yoann_cfg_202006' not found

8 Yoann version 4ish

Here is this morning’s email:

For the information we want to display. - rings 1 and 2, from the outside: the genes by COG, which I think is already what you have there. - ring 3: the mutation saturation, how many Krmit insertions in the initial library in THY, which again I think is what you have. - ring 4: Bayesian essentiality data for the THY medium (this is column BE in the crazy table I sent you this morning). - ring 5: Bayesian essentiality data for the mRPMI medium (this is column BL in the crazy table). - ring 6: Bayesian essentiality data for the mRPMI medium + low Calprotectin (this is column BS in the crazy table). - ring 7: Bayesian essentiality data for the mRPMI medium + high Calprotectin (this is column BZ in the crazy table). - I was wondering if you could include a little space here (maybe it’s too much, don’t spend too much time on that).

Since all the stuff is apparently in the table Yoann called ‘crazy table’, I exported those columns into a csv with that name…

crazy_table <- read.csv("from_yoann/crazy_table.csv")
## Warning in file(file, "rt"): cannot open file 'from_yoann/crazy_table.csv': No
## such file or directory
## Error in file(file, "rt"): cannot open the connection
rownames(crazy_table) <- crazy_table[["row.names"]]
## Error in eval(expr, envir, enclos): object 'crazy_table' not found
crazy_table[["row.names"]] <- NULL
## Error in crazy_table[["row.names"]] <- NULL: object 'crazy_table' not found
cfgv4 <- circos_prefix(cjb111_annot, name="cjb111_v4")
## This assumes you have a colors.conf in circos/colors/ and fonts.conf in circos/fonts/
## It also assumes you have conf/ideogram.conf, conf/ticks.conf, and conf/housekeeping.conf
## It will write circos/conf/cjb111_v4.conf with a reasonable first approximation config file.
## Error in circos_prefix(cjb111_annot, name = "cjb111_v4"): object 'cjb111_annot' not found
karyv4 <- circos_karyotype(cfgv4, fasta="reference/sagalactiae_cjb111.fasta")
## Error in circos_karyotype(cfgv4, fasta = "reference/sagalactiae_cjb111.fasta"): object 'cfgv4' not found
ring12v4 <- circos_plus_minus(cfgv4, width=0.05, thickness=40)
## Error in message("Writing data file: ", cfg[["plus_data_file"]], " with the + strand GO data."): object 'cfgv4' not found
ring3v4 <- circos_hist(cfgv4, combined_exprs, colname="control",
                       basename="control_rpkmv4", outer=ring12v4,
                       fill_color="vvdpblue", width=0.05)
## Error in circos_hist(cfgv4, combined_exprs, colname = "control", basename = "control_rpkmv4", : object 'cfgv4' not found
ring4v4 <- circos_tile(cfgv4, crazy_table, colname="previouscall",
                       colors=lindsey_colors, basename="previousv4", outer=ring3v4,
                       thickness=60, stroke_thickness=0.001,  width=0.05)
## Error in circos_tile(cfgv4, crazy_table, colname = "previouscall", colors = lindsey_colors, : object 'cfgv4' not found
ring5v4 <- circos_tile(cfgv4, crazy_table, colname="controlcall",
                       colors=lindsey_colors, basename="controlv4", outer=ring4v4,
                       thickness=60, stroke_thickness=0.001, width=0.05)
## Error in circos_tile(cfgv4, crazy_table, colname = "controlcall", colors = lindsey_colors, : object 'cfgv4' not found
ring6v4 <- circos_tile(cfgv4, crazy_table, colname="lowcall",
                       colors=lindsey_colors, basename="lowv4", outer=ring5v4,
                       thickness=60, stroke_thickness=0.001, width=0.05)
## Error in circos_tile(cfgv4, crazy_table, colname = "lowcall", colors = lindsey_colors, : object 'cfgv4' not found
ring7v4 <- circos_tile(cfgv4, crazy_table, colname="highcall",
                       colors=lindsey_colors, basename="highv4", outer=ring6v4,
                       thickness=60, stroke_thickness=0.001, width=0.05)
## Error in circos_tile(cfgv4, crazy_table, colname = "highcall", colors = lindsey_colors, : object 'cfgv4' not found
suffixv4 <- circos_suffix(cfgv4)
## Error in circos_suffix(cfgv4): object 'cfgv4' not found
made <- circos_make(cfgv4, target="cjb111_v4")
## Error in circos_make(cfgv4, target = "cjb111_v4"): object 'cfgv4' not found

8.1 Yoann 20200707

Here is today’s email:

“For the Bayesian representations, I was hoping we could display a total of 5 circles, four representing the data obtained for the four different conditions (i.e., THY -column BE-; RPMI -column BL-; RPMI+lowCal -column BS- and RPMI+highCal -column BZ-): for these 4 circles the non-essential genes would be shown in gree. Then, there would be one last circle, that is a summary of the results previously mentioned: this circle would integrate the data from column CI (also called Lindsey Call), and for this circle, I want the non-essential genes represented in yellow, so that we can see that this is a little different than the 4 other circles previously mentioned.”

If I read this correctly, the only thing I did wrong was to get some of the colors wrong?

main_colors <- c("e31212", "12e312", "444444", "0909AA", "090909")
names(main_colors) <- c("E", "NE", "S", "U", "NC")
summary_colors <- c("e31212", "f0c505", "444444", "0909AA", "090909")
names(summary_colors) <- c("E", "NE", "S", "U", "NC")

cfgv5 <- circos_prefix(cjb111_annot, name="cjb111_v5")
## This assumes you have a colors.conf in circos/colors/ and fonts.conf in circos/fonts/
## It also assumes you have conf/ideogram.conf, conf/ticks.conf, and conf/housekeeping.conf
## It will write circos/conf/cjb111_v5.conf with a reasonable first approximation config file.
## Error in circos_prefix(cjb111_annot, name = "cjb111_v5"): object 'cjb111_annot' not found
karyv5 <- circos_karyotype(cfgv5, fasta="reference/sagalactiae_cjb111.fasta")
## Error in circos_karyotype(cfgv5, fasta = "reference/sagalactiae_cjb111.fasta"): object 'cfgv5' not found
ring12v5 <- circos_plus_minus(cfgv5, width=0.07, thickness=40)
## Error in message("Writing data file: ", cfg[["plus_data_file"]], " with the + strand GO data."): object 'cfgv5' not found
ring3v5 <- circos_hist(cfgv5, combined_exprs, colname="control",
                       basename="control_rpkmv5", outer=ring12v5,
                       fill_color="vvdpblue", width=0.07)
## Error in circos_hist(cfgv5, combined_exprs, colname = "control", basename = "control_rpkmv5", : object 'cfgv5' not found
ring4v5 <- circos_tile(cfgv5, crazy_table, colname="previouscall",
                       colors=main_colors, basename="previousv5", outer=ring3v5,
                       thickness=70, stroke_thickness=0.001,  width=0.07)
## Error in circos_tile(cfgv5, crazy_table, colname = "previouscall", colors = main_colors, : object 'cfgv5' not found
ring5v5 <- circos_tile(cfgv5, crazy_table, colname="controlcall",
                       colors=main_colors, basename="controlv5", outer=ring4v5,
                       thickness=70, stroke_thickness=0.001, width=0.07)
## Error in circos_tile(cfgv5, crazy_table, colname = "controlcall", colors = main_colors, : object 'cfgv5' not found
ring6v5 <- circos_tile(cfgv5, crazy_table, colname="lowcall",
                       colors=main_colors, basename="lowv5", outer=ring5v5,
                       thickness=70, stroke_thickness=0.001, width=0.07)
## Error in circos_tile(cfgv5, crazy_table, colname = "lowcall", colors = main_colors, : object 'cfgv5' not found
ring7v5 <- circos_tile(cfgv5, crazy_table, colname="highcall",
                       colors=main_colors, basename="highv5", outer=ring6v5,
                       thickness=70, stroke_thickness=0.001, width=0.07)
## Error in circos_tile(cfgv5, crazy_table, colname = "highcall", colors = main_colors, : object 'cfgv5' not found
ring8v5 <- circos_tile(cfgv5, crazy_table, colname="Final",
                       colors=summary_colors, basename="finalv5", outer=ring7v5,
                       thickness=70, stroke_thickness=0.001, width=0.07)
## Error in circos_tile(cfgv5, crazy_table, colname = "Final", colors = summary_colors, : object 'cfgv5' not found
suffixv5 <- circos_suffix(cfgv5)
## Error in circos_suffix(cfgv5): object 'cfgv5' not found
made <- circos_make(cfgv5, target="cjb111_v5")
## Error in circos_make(cfgv5, target = "cjb111_v5"): object 'cfgv5' not found

8.1.1 Experimenting with ggstatsplots and the 2018 data

cjb111_prev <- create_expt(metadata="sample_sheets/sagalactiae_combined_with_previous_samples.xlsx",
                         batch=FALSE, gene_info=cjb111_annot, file_column="file")
## Reading the sample metadata.
## Error in read.xlsx.default(xlsxFile = file, sheet = 1) : 
##   File does not exist.
## Error in read_metadata(meta_file, ...): Unable to read the metadata file: sample_sheets/sagalactiae_combined_with_previous_samples.xlsx
saturation_control <- tnseq_saturation(
    "preprocessing/combined_control/outputs/essentiality_sagalactiae_cjb111/trimmed_ca-v1m1.wig")
## Warning in file(file, "rt"): cannot open file 'preprocessing/combined_control/
## outputs/essentiality_sagalactiae_cjb111/trimmed_ca-v1m1.wig': No such file or
## directory
## Error in file(file, "rt"): cannot open the connection
saturation_control$plot
## Error in eval(expr, envir, enclos): object 'saturation_control' not found
control_plts <- plot_essentiality(
    "preprocessing/combined_control/outputs/essentiality_sagalactiae_cjb111/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv")
## Error: 'preprocessing/combined_control/outputs/essentiality_sagalactiae_cjb111/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
control_plts[["zbar"]]
## Error in eval(expr, envir, enclos): object 'control_plts' not found
saturation_low <- tnseq_saturation(
    "preprocessing/combined_low/outputs/essentiality_sagalactiae_cjb111/trimmed_ca-v1m1.wig")
## Warning in file(file, "rt"): cannot open file 'preprocessing/combined_low/
## outputs/essentiality_sagalactiae_cjb111/trimmed_ca-v1m1.wig': No such file or
## directory
## Error in file(file, "rt"): cannot open the connection
saturation_control$plot
## Error in eval(expr, envir, enclos): object 'saturation_control' not found
low_plts <- plot_essentiality(
    "preprocessing/combined_low/outputs/essentiality_sagalactiae_cjb111/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv")
## Error: 'preprocessing/combined_low/outputs/essentiality_sagalactiae_cjb111/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
low_plts[["zbar"]]
## Error in eval(expr, envir, enclos): object 'low_plts' not found
saturation_high <- tnseq_saturation(
    "preprocessing/combined_high/outputs/essentiality_sagalactiae_cjb111/trimmed_ca-v1m1.wig")
## Warning in file(file, "rt"): cannot open file 'preprocessing/combined_high/
## outputs/essentiality_sagalactiae_cjb111/trimmed_ca-v1m1.wig': No such file or
## directory
## Error in file(file, "rt"): cannot open the connection
saturation_control$plot
## Error in eval(expr, envir, enclos): object 'saturation_control' not found
high_plts <- plot_essentiality(
    "preprocessing/combined_high/outputs/essentiality_sagalactiae_cjb111/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv")
## Error: 'preprocessing/combined_high/outputs/essentiality_sagalactiae_cjb111/mh_ess-trimmed_ca-v1m1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
high_plts[["zbar"]]
## Error in eval(expr, envir, enclos): object 'high_plts' not found
saturation_prev <- tnseq_saturation(
    "preprocessing/combined_previous/outputs/essentiality_sagalactiae_cjb111/combined_ca_ta-v0M1.wig")
## Warning in file(file, "rt"): cannot open file 'preprocessing/combined_previous/
## outputs/essentiality_sagalactiae_cjb111/combined_ca_ta-v0M1.wig': No such file
## or directory
## Error in file(file, "rt"): cannot open the connection
saturation_control$plot
## Error in eval(expr, envir, enclos): object 'saturation_control' not found
high_plts <- plot_essentiality(
    "preprocessing/combined_previous/outputs/essentiality_sagalactiae_cjb111/mh_ess-combined_ca_ta-v0M1_gene_tas_m2.csv")
## Error: 'preprocessing/combined_previous/outputs/essentiality_sagalactiae_cjb111/mh_ess-combined_ca_ta-v0M1_gene_tas_m2.csv' does not exist in current working directory ('/mnt/sshfs/cbcbsub01/fs/cbcb-lab/nelsayed/scratch/atb/tnseq/sagalacticae_2020').
high_plts[["zbar"]]
## Error in eval(expr, envir, enclos): object 'high_plts' not found
plt <- tnseq_multi_saturation(meta=pData(cjb111_prev), meta_column="cjb111esswig")
## Error in h(simpleError(msg, call)): error in evaluating the argument 'object' in selecting a method for function 'pData': object 'cjb111_prev' not found
plt$plot
## Error in eval(expr, envir, enclos): object 'plt' not found
plt$ggstats
## Error in eval(expr, envir, enclos): object 'plt' not found
pander::pander(sessionInfo())

R version 4.0.3 (2020-10-10)

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

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

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

other attached packages: ruv(v.0.9.7.1), lme4(v.1.1-26), Matrix(v.1.3-0), BiocParallel(v.1.24.1), variancePartition(v.1.20.0), hpgltools(v.1.0), testthat(v.3.0.1), R6(v.2.5.0), Biobase(v.2.50.0) and BiocGenerics(v.0.36.0)

loaded via a namespace (and not attached): R.utils(v.2.10.1), tidyselect(v.1.1.0), RSQLite(v.2.2.3), AnnotationDbi(v.1.52.0), grid(v.4.0.3), Rtsne(v.0.15), IHW(v.1.18.0), devtools(v.2.3.2), scatterpie(v.0.1.5), munsell(v.0.5.0), preprocessCore(v.1.52.0), codetools(v.0.2-18), statmod(v.1.4.35), withr(v.2.4.1), colorspace(v.2.0-0), GOSemSim(v.2.16.1), knitr(v.1.30), rstudioapi(v.0.13), stats4(v.4.0.3), Vennerable(v.3.1.0.9000), robustbase(v.0.93-6), DOSE(v.3.16.0), labeling(v.0.4.2), MatrixGenerics(v.1.2.0), slam(v.0.1-48), lpsymphony(v.1.18.0), GenomeInfoDbData(v.1.2.4), polyclip(v.1.10-0), bit64(v.4.0.5), farver(v.2.0.3), rprojroot(v.2.0.2), downloader(v.0.4), vctrs(v.0.3.6), generics(v.0.1.0), xfun(v.0.19), BiocFileCache(v.1.14.0), fastcluster(v.1.1.25), doParallel(v.1.0.16), GenomeInfoDb(v.1.26.2), graphlayouts(v.0.7.1), locfit(v.1.5-9.4), bitops(v.1.0-6), cachem(v.1.0.1), fgsea(v.1.16.0), DelayedArray(v.0.16.1), assertthat(v.0.2.1), scales(v.1.1.1), ggraph(v.2.0.4), enrichplot(v.1.10.1), gtable(v.0.3.0), sva(v.3.38.0), processx(v.3.4.5), tidygraph(v.1.2.0), rlang(v.0.4.10), genefilter(v.1.72.0), rtracklayer(v.1.50.0), selectr(v.0.4-2), broom(v.0.7.3), BiocManager(v.1.30.10), yaml(v.2.2.1), reshape2(v.1.4.4), GenomicFeatures(v.1.42.1), backports(v.1.2.1), qvalue(v.2.22.0), RBGL(v.1.66.0), clusterProfiler(v.3.18.0), tools(v.4.0.3), usethis(v.1.6.3), ggplot2(v.3.3.3), ellipsis(v.0.3.1), gplots(v.3.1.1), RColorBrewer(v.1.1-2), sessioninfo(v.1.1.1), Rcpp(v.1.0.6), plyr(v.1.8.6), progress(v.1.2.2), zlibbioc(v.1.36.0), purrr(v.0.3.4), RCurl(v.1.98-1.2), ps(v.1.5.0), prettyunits(v.1.1.1), openssl(v.1.4.3), viridis(v.0.5.1), cowplot(v.1.1.0), S4Vectors(v.0.28.1), SummarizedExperiment(v.1.20.0), ggrepel(v.0.9.0), colorRamps(v.2.3), fs(v.1.5.0), magrittr(v.2.0.1), data.table(v.1.13.6), DO.db(v.2.9), openxlsx(v.4.2.3), matrixStats(v.0.57.0), pkgload(v.1.1.0), hms(v.1.0.0), evaluate(v.0.14), xtable(v.1.8-4), pbkrtest(v.0.5-0.1), XML(v.3.99-0.5), IRanges(v.2.24.1), gridExtra(v.2.3), compiler(v.4.0.3), biomaRt(v.2.46.2), tibble(v.3.0.5), KernSmooth(v.2.23-18), crayon(v.1.3.4), shadowtext(v.0.0.7), R.oo(v.1.24.0), minqa(v.1.2.4), htmltools(v.0.5.1.1), mgcv(v.1.8-33), corpcor(v.1.6.9), geneplotter(v.1.68.0), tidyr(v.1.1.2), DBI(v.1.1.1), tweenr(v.1.0.1), dbplyr(v.2.0.0), MASS(v.7.3-53), rappdirs(v.0.3.2), boot(v.1.3-25), readr(v.1.4.0), cli(v.2.2.0), R.methodsS3(v.1.8.1), quadprog(v.1.5-8), igraph(v.1.2.6), GenomicRanges(v.1.42.0), pkgconfig(v.2.0.3), rvcheck(v.0.1.8), GenomicAlignments(v.1.26.0), xml2(v.1.3.2), foreach(v.1.5.1), annotate(v.1.68.0), XVector(v.0.30.0), rvest(v.0.3.6), stringr(v.1.4.0), callr(v.3.5.1), digest(v.0.6.27), graph(v.1.68.0), Biostrings(v.2.58.0), rmarkdown(v.2.6), fastmatch(v.1.1-0), edgeR(v.3.32.0), PROPER(v.1.22.0), directlabels(v.2020.6.17), curl(v.4.3), Rsamtools(v.2.6.0), gtools(v.3.8.2), nloptr(v.1.2.2.2), lifecycle(v.0.2.0), nlme(v.3.1-151), desc(v.1.2.0), viridisLite(v.0.3.0), askpass(v.1.1), limma(v.3.46.0), fansi(v.0.4.2), pillar(v.1.4.7), lattice(v.0.20-41), DEoptimR(v.1.0-8), fastmap(v.1.1.0), httr(v.1.4.2), pkgbuild(v.1.2.0), survival(v.3.2-7), GO.db(v.3.12.1), glue(v.1.4.2), remotes(v.2.2.0), fdrtool(v.1.2.15), zip(v.2.1.1), iterators(v.1.0.13), pander(v.0.6.3), bit(v.4.0.4), ggforce(v.0.3.2), stringi(v.1.5.3), blob(v.1.2.1), DESeq2(v.1.30.0), caTools(v.1.18.0), memoise(v.2.0.0) and dplyr(v.1.0.3)

message(paste0("This is hpgltools commit: ", get_git_commit()))
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 052640a0b091e9a740e487957e087f265d0c74b5
## This is hpgltools commit: Thu Dec 3 13:42:02 2020 -0500: 052640a0b091e9a740e487957e087f265d0c74b5
this_save <- paste0(gsub(pattern="\\.Rmd", replace="", x=rmd_file), "-v", ver, ".rda.xz")
message(paste0("Saving to ", this_save))
## Saving to index_202011-v202011.rda.xz
tmp <- sm(saveme(filename=this_save))
loadme(filename=this_save)
LS0tCnRpdGxlOiAiUy4gYWdhbGFjdGlhZSAyMDIwMTA6IFBva2luZyBhdCBzb21lIFROU2VxLiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aGVtZTogcmVhZGFibGUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgd2lkdGg6IDMwMAogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQogIEJpb2NTdHlsZTo6aHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCmRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKQprbml0cjo6b3B0c19rbml0JHNldCh3aWR0aD0xMjAsCiAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgZWNobz1UUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3I9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGRwaT05NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbD0iYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEwKSkKcnVuZGF0ZSA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0PSIlWSVtJWQiKQpwcmV2aW91c19maWxlIDwtICIiCnZlciA8LSAiMjAyMDExIgoKIyN0bXAgPC0gc20obG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpCnJtZF9maWxlIDwtICJpbmRleF8yMDIwMTEuUm1kIgpgYGAKCiMgR3JhYiBhbm5vdGF0aW9uIGRhdGEgZm9yIFN0cmVwdG9jb2NjdXMgYWdhbGFjdGlhZS4KCiMjIFN0cmFpbiBjamIxMTEKCmBgYHtyIGFubm90YXRpb25zX2NqYjExMX0KY2piX21pY3JvYmVzIDwtIGxvYWRfbWljcm9iZXNvbmxpbmVfYW5ub3RhdGlvbnMoc3BlY2llcz0iQ0pCMTExIikKY2piX2dmZiA8LSBsb2FkX2dmZl9hbm5vdGF0aW9ucygifi9zY3JhdGNoL2xpYnJhcmllcy9nZW5vbWUvc2FnYWxhY3RpYWVfY2piMTExLmdmZiIpCmNqYl9taWNyb2JlcyA8LSBhcy5kYXRhLmZyYW1lKGNqYl9taWNyb2JlcykKcm93bmFtZXMoY2piX2dmZikgPC0gbWFrZS5uYW1lcyhjamJfZ2ZmW1sibG9jdXNfdGFnIl1dLCB1bmlxdWU9VFJVRSkKIyMgSSBhbSBnb2luZyB0byBvbmx5IHBheSBhdHRlbnRpb24gdG8gdGhlIGZpcnN0IGFubm90YXRpb24gZm9yIGVhY2ggbG9jdXMgdGFnIGZyb20gbWljcm9iZXNvbmxpbmUuCmNqYl9taWNyb2Jlc1tbInN5c05hbWUiXV0gPC0gbWFrZS5uYW1lcyhjamJfbWljcm9iZXNbWyJzeXNOYW1lIl1dLCB1bmlxdWU9VFJVRSkKIyMgSSBzaG91bGQgYXNrIExpbmRzZXkgaWYgdGhleSB3b3VsZCBsaWtlIG1lIHRvIG1lcmdlIHRoZXNlCmNqYl9hbm5vdCA8LSBjamJfZ2ZmCiMjIGNqYl9hbm5vdCA8LSBtZXJnZShjamJfZ2ZmLCBjamJfbWljcm9iZXMsIGJ5Lng9Im9sZF9sb2N1c190YWciLCBieS55PSJzeXNOYW1lIikKIyMgcm93bmFtZXMoY2piX2Fubm90KSA8LSBtYWtlLm5hbWVzKGNqYl9hbm5vdFtbImxvY3VzX3RhZyJdXSwgdW5pcXVlPVRSVUUpCmBgYAoKIyBDcmVhdGUgRXhwcmVzc2lvbnNldHMKClRoZSBmb2xsb3dpbmcgYmxvY2sgbWVyZ2VzIHRoZSB2YXJpb3VzIGNvdW50cywgYW5ub3RhdGlvbnMsIGFuZCBleHBlcmltZW50YWwKbWV0YWRhdGEuCgpKdXN0IGFzIHdpdGggdGhlIGFubm90YXRpb25zLCBJIHdpbGwgY3JlYXRlIG9uZSBleHByZXNzaW9uc2V0IGZvciBlYWNoIHN0cmFpbi4KCmBgYHtyIGNqYl9leHB0LCBmaWcuc2hvdz0iaGlkZSJ9CmNqYl9leHB0IDwtIGNyZWF0ZV9leHB0KG1ldGFkYXRhPSJzYW1wbGVfc2hlZXRzL2FsbF9zYW1wbGVzX2NqYjExMS54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPWNqYl9hbm5vdCwgZmlsZV9jb2x1bW49ImJ0djFtMXNhZ2FsYWN0aWFlY2piMTExIikKCmNqYl93cml0dGVuIDwtIHdyaXRlX2V4cHQoY2piX2V4cHQsIGJhdGNoPSJyYXciLAogICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX0tY2piX2NvdW50cy12e3Zlcn0ueGxzeCIpKQpgYGAKCiMgQSBGZXcgZGlhZ25vc3RpYyBwbG90cwoKYGBge3Igc29tZV9wbG90c30KY2piX3dyaXR0ZW5bWyJsZWdlbmRfcGxvdCJdXQpjamJfd3JpdHRlbltbInJhd19saWJzaXplIl1dCmNqYl93cml0dGVuW1sicmF3X2RlbnNpdHkiXV0KIyMgYXdlc29tZQoKY2piX3dyaXR0ZW5bWyJub3JtX2Rpc2hlYXQiXV0KY2piX3dyaXR0ZW5bWyJub3JtX2NvcmhlYXQiXV0KYGBgCgpgYGB7ciByYW5kb21fcGxvdHN9CnBsb3RfdG9wbihjamJfZXhwdCwgbnVtPTQwKSRwbG90CgpjamJfbiA8LSBub3JtYWxpemVfZXhwdChjamJfZXhwdCwgZmlsdGVyPVRSVUUsIG5vcm09InF1YW50IiwgY29udmVydD0iY3BtIiwgdHJhbnNmb3JtPSJsb2cyIikKcGxvdF9wY2EoY2piX24pJHBsb3QKCmNqYl9uYiA8LSBub3JtYWxpemVfZXhwdChjamJfZXhwdCwgZmlsdGVyPVRSVUUsIG5vcm09InF1YW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT0ibG9nMiIsIGJhdGNoPSJsaW1tYSIpCnBsb3RfcGNhKGNqYl9uYikkcGxvdAoKdG5fZGUgPC0gYWxsX3BhaXJ3aXNlKGNqYl9leHB0LCBmaWx0ZXI9VFJVRSwgYmF0Y2g9InN2YXNlcSIpCgprZWVwZXJzIDwtIGxpc3QoCiAgInV0IiA9IGMoInV0IiwgInRuIiksCiAgImQxIiA9IGMoImQxIiwgInRuIiksCiAgImQzIiA9IGMoImQzIiwgInRuIiksCiAgImN4IiA9IGMoImN4IiwgInRuIiksCiAgInZnIiA9IGMoInZnIiwgInRuIikpCnRuX3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcyh0bl9kZSwga2VlcGVycz1rZWVwZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvdml2b19maXRuZXNzLXZ7dmVyfS54bHN4IikpCmBgYAoKIyBDaGVjayB0bnNlcSBzYXR1cmF0aW9uCgpJIG1vdmVkIHRoaXMgYWJvdmUgdGhlIGRpZmZlcmVudGlhbCAiZXhwcmVzc2lvbiIvImZpdG5lc3MiIGFuYWx5c2lzIHNvIHRoYXQgd2UKY2FuIGFkZCB0aGUgcmVzdWx0cyBmcm9tIGl0IGFzIGFubm90YXRpb24gZGF0YSB0byB0aGUgREUgdGFibGVzIGlmIHJlcXVlc3RlZC4KCmBgYHtyIHRuc2VxX3NhdHVyYXRpb25fYTkwOX0Kc2F0dXJhdGlvbl9hOTA5X2N4MSA8LSB0bnNlcV9zYXR1cmF0aW9uKAogICJwcmVwcm9jZXNzaW5nL2QxczMvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfYTkwOS9yMl9jYV92My12MU0xLndpZyIpCnNhdHVyYXRpb25fZDFzMyRwbG90CnNhdHVyYXRpb25fZDFzMyRoaXRzX3N1bW1hcnkKc2F0dXJhdGlvbl9jeDEgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy9jeDEvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL2NvbnNvbGlkYXRlZF92Mi12MU0xLndpZyIsCiAgYWRqdXN0PTIpCnNhdHVyYXRpb25fY3gxJHBsb3QKc2F0dXJhdGlvbl9jeDEkaGl0c19zdW1tYXJ5CmVzc19wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICJwcmVwcm9jZXNzaW5nL2N4MS9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9jamIxMTEvbWhfZXNzLWNvbnNvbGlkYXRlZF92Mi12MU0xX2dlbmVfdGFzX20xLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl9jeDIgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy9jeDIvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL2NvbnNvbGlkYXRlZF92Mi12MU0xLndpZyIpCnNhdHVyYXRpb25fY3gyJHBsb3QKc2F0dXJhdGlvbl9jeDIkaGl0c19zdW1tYXJ5CmVzc19wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICJwcmVwcm9jZXNzaW5nL2N4Mi9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9jamIxMTEvbWhfZXNzLWNvbnNvbGlkYXRlZF92Mi12MU0xX2dlbmVfdGFzX20xLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl9jeDMgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy9jeDMvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL2NvbnNvbGlkYXRlZF92Mi12MU0xLndpZyIpCnNhdHVyYXRpb25fY3gzJHBsb3QKc2F0dXJhdGlvbl9jeDMkaGl0c19zdW1tYXJ5CmVzc19wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICJwcmVwcm9jZXNzaW5nL2N4My9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9jamIxMTEvbWhfZXNzLWNvbnNvbGlkYXRlZF92Mi12MU0xX2dlbmVfdGFzX20xLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl9kMXMxIDwtIHRuc2VxX3NhdHVyYXRpb24oCiAgICAicHJlcHJvY2Vzc2luZy9kMXMxL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9jb25zb2xpZGF0ZWRfdjItdjFNMS53aWciKQpzYXR1cmF0aW9uX2QxczEkcGxvdApzYXR1cmF0aW9uX2QxczEkaGl0c19zdW1tYXJ5CmVzc19wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICJwcmVwcm9jZXNzaW5nL2QxczEvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL21oX2Vzcy1jb25zb2xpZGF0ZWRfdjItdjFNMV9nZW5lX3Rhc19tMi5jc3YiKQplc3NfcGx0c1tbInpiYXIiXV0KCnNhdHVyYXRpb25fZDFzMiA8LSB0bnNlcV9zYXR1cmF0aW9uKAogICJwcmVwcm9jZXNzaW5nL2QxczIvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL2NvbnNvbGlkYXRlZF92Mi12MU0xLndpZyIpCnNhdHVyYXRpb25fZDFzMiRwbG90CnNhdHVyYXRpb25fZDFzMiRoaXRzX3N1bW1hcnkKZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvZDFzMi9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9jamIxMTEvbWhfZXNzLWNvbnNvbGlkYXRlZF92Mi12MU0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl9kMXMzIDwtIHRuc2VxX3NhdHVyYXRpb24oCiAgInByZXByb2Nlc3NpbmcvZDFzMy9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9jamIxMTEvcjJfY2FfdjMtdjFNMS53aWciKQpzYXR1cmF0aW9uX2QxczMkcGxvdApzYXR1cmF0aW9uX2QxczMkaGl0c19zdW1tYXJ5CmVzc19wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICJwcmVwcm9jZXNzaW5nL2QxczMvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL3IyX2NhX3YzLXYxTTFfZ2VuZV90YXNfbTIuY3N2IikKZXNzX3BsdHNbWyJ6YmFyIl1dCgpzYXR1cmF0aW9uX2QzczEgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy9kM3MxL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9yMl9jYV92My12MU0xLndpZyIpCnNhdHVyYXRpb25fZDNzMSRwbG90CnNhdHVyYXRpb25fZDNzMSRoaXRzX3N1bW1hcnkKZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvZDNzMS9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9jamIxMTEvcjJfY2FfdjMtdjFNMV9nZW5lX3Rhc19tMi5jc3YiKQplc3NfcGx0c1tbInpiYXIiXV0KCnNhdHVyYXRpb25fZDNzMyA8LSB0bnNlcV9zYXR1cmF0aW9uKAogICJwcmVwcm9jZXNzaW5nL2QzczMvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL3IyX2NhX3YzLXYxTTEud2lnIikKc2F0dXJhdGlvbl9kM3MzJHBsb3QKc2F0dXJhdGlvbl9kM3MzJGhpdHNfc3VtbWFyeQplc3NfcGx0cyA8LSBwbG90X2Vzc2VudGlhbGl0eSgKICAicHJlcHJvY2Vzc2luZy9kM3MzL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9yMl9jYV92My12MU0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl90bjEgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy90bjEvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL3IyX2NhX3YzLXYxTTEud2lnIikKc2F0dXJhdGlvbl90bjEkcGxvdApzYXR1cmF0aW9uX3RuMSRoaXRzX3N1bW1hcnkKZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvdG4xL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9yMl9jYV92My12MU0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl90bjIgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy90bjIvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL3IyX2NhX3YzLXYxTTEud2lnIikKc2F0dXJhdGlvbl90bjIkcGxvdApzYXR1cmF0aW9uX3RuMiRoaXRzX3N1bW1hcnkKZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvdG4yL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9yMl9jYV92My12MU0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl90bjMgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy90bjMvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL3IyX2NhX3YzLXYxTTEud2lnIikKc2F0dXJhdGlvbl90bjMkcGxvdApzYXR1cmF0aW9uX3RuMyRoaXRzX3N1bW1hcnkKZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvdG4zL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9yMl9jYV92My12MU0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl91dDEgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy91dDEvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL3IyX2NhX3YzLXYxTTEud2lnIikKc2F0dXJhdGlvbl91dDEkcGxvdApzYXR1cmF0aW9uX3V0MSRoaXRzX3N1bW1hcnkKZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvdXQxL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9yMl9jYV92My12MU0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl91dDIgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy91dDIvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL3IyX2NhX3YzLXYxTTEud2lnIikKc2F0dXJhdGlvbl91dDIkcGxvdApzYXR1cmF0aW9uX3V0MiRoaXRzX3N1bW1hcnkKZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvdXQyL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9yMl9jYV92My12MU0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl92ZzEgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy92ZzEvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL3IyX2NhX3YzLXYxTTEud2lnIikKc2F0dXJhdGlvbl92ZzEkcGxvdApzYXR1cmF0aW9uX3ZnMSRoaXRzX3N1bW1hcnkKZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvdmcxL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9yMl9jYV92My12MU0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl92ZzIgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy92ZzIvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL3IyX2NhX3YzLXYxTTEud2lnIikKc2F0dXJhdGlvbl92ZzIkcGxvdApzYXR1cmF0aW9uX3ZnMiRoaXRzX3N1bW1hcnkKZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvdmcyL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9yMl9jYV92My12MU0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl92ZzMgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAicHJlcHJvY2Vzc2luZy92ZzMvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL3IyX2NhX3YzLXYxTTEud2lnIikKc2F0dXJhdGlvbl92ZzMkcGxvdApzYXR1cmF0aW9uX3ZnMyRoaXRzX3N1bW1hcnkKZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvdmczL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9yMl9jYV92My12MU0xX2dlbmVfdGFzX20yLmNzdiIpCmVzc19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl9jb250cm9sIDwtIHRuc2VxX3NhdHVyYXRpb24oCiAgICAicHJlcHJvY2Vzc2luZy9jeF9jb21iaW5lZC9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9jamIxMTEvcjItdjFNMS53aWciKQpzYXR1cmF0aW9uX2NvbnRyb2wkcGxvdAplc3NfcGx0cyA8LSBwbG90X2Vzc2VudGlhbGl0eSgKICAicHJlcHJvY2Vzc2luZy9jeF9jb21iaW5lZC9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9jamIxMTEvbWhfZXNzLXIyLXYxTTFfZ2VuZV90YXNfbTEuY3N2IikKZXNzX3BsdHNbWyJ6YmFyIl1dCmVzc19wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICJwcmVwcm9jZXNzaW5nL2N4X2NvbWJpbmVkL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9taF9lc3MtcjItdjFNMV9nZW5lX3Rhc19tMi5jc3YiKQplc3NfcGx0c1tbInpiYXIiXV0KZXNzX3BsdHMgPC0gcGxvdF9lc3NlbnRpYWxpdHkoCiAgInByZXByb2Nlc3NpbmcvY3hfY29tYmluZWQvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL21oX2Vzcy1yMi12MU0xX2dlbmVfdGFzX200LmNzdiIpCmVzc19wbHRzW1siemJhciJdXQplc3NfcGx0cyA8LSBwbG90X2Vzc2VudGlhbGl0eSgKICAicHJlcHJvY2Vzc2luZy9jeF9jb21iaW5lZC9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9jamIxMTEvbWhfZXNzLXIyLXYxTTFfZ2VuZV90YXNfbTguY3N2IikKZXNzX3BsdHNbWyJ6YmFyIl1dCmVzc19wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICJwcmVwcm9jZXNzaW5nL2N4X2NvbWJpbmVkL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9taF9lc3MtcjItdjFNMV9nZW5lX3Rhc19tMTYuY3N2IikKZXNzX3BsdHNbWyJ6YmFyIl1dCgpwbHQgPC0gdG5zZXFfbXVsdGlfc2F0dXJhdGlvbihtZXRhPXBEYXRhKGNqYjExMV9leHB0KSwgbWV0YV9jb2x1bW49ImNqYjExMWVzc3dpZyIpCnBsdCRnZ3N0YXRzCmBgYAoKYGBge3IgdG5zZXFfY2piMTExX3Bsb3R9CnBsdCA8LSB0bnNlcV9tdWx0aV9zYXR1cmF0aW9uKG1ldGE9cERhdGEoY2piMTExX2V4cHQpLCBtZXRhX2NvbHVtbj0iY2piMTExZXNzd2lnIikKcGx0W1sicGxvdCJdXSArIGdncGxvdDI6OnNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxMjAwMCkpCiMjIEkgZXhwZWN0IHRoZSBzYXR1cmF0aW9uIG9mIHRoaXMgdG8gYmUgYSBiaXQgYmV0dGVyIHRoYW4gMjYwM1YvUi4KCnBsdCA8LSB0bnNlcV9tdWx0aV9zYXR1cmF0aW9uKG1ldGE9cERhdGEodnIyNjAzX2V4cHQpLCBtZXRhX2NvbHVtbj0idnIyNjAzZXNzd2lnIikKcGx0W1sicGxvdCJdXSArIGdncGxvdDI6OnNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxMjAwMCkpCiMjIGhtbSB0aGlzIGlzIG5vdCBkZWZpbml0aXZlLiAgSXQgbG9va3MgbGlrZSBjamIxMTEgaGFzIG1vcmUgVEFzIHdpdGggfiAxIGhpdC4KIyMgYnV0IFIvViBoYXMgbW9yZSBoaXRzIHdpdGggfiAxNjx4PDY0IGhpdHMuCgpwbHQgPC0gdG5zZXFfbXVsdGlfc2F0dXJhdGlvbihtZXRhPXBEYXRhKGNqYjExMV9leHB0KSwgbWV0YV9jb2x1bW49ImNqYjExMWVzc3dpZyIpCnBsdFtbInBsb3QiXV0gKyBnZ3Bsb3QyOjpzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMjAwMDApKQojIyBJIGFtIG5vdCBxdWl0ZSBzdXJlIGhvdyB0byBpbnRlcnByZXQgdGhpcyBvbmUsIHdlIGhhdmUgbXVjaCBtb3JlIGRpc2NyZXRlCiMjIG51bWJlcnMgb2YgcmVhZHMgdGhhbiB0aGUgb3RoZXJzLgpgYGAKCiMgQ2hhbmdlZCBnZW5lcwoKRm9yIGRpZmZlcmVudGlhbCBleHByZXNzaW9uLCBJIGFtIGdvaW5nIHRvIGFzc3VtZSB1bnRpbCBJIGhlYXIgb3RoZXJ3aXNlLCB0aGF0Cm15IGJhdGNoIGFzc2lnbm1lbnRzIGFyZSBub3QgY29ycmVjdCBhbmQgdGhhdCB0aGUgMSwyLDMgYXNzaWdubWVudHMgb2YgdGhlCnNhbXBsZSBuYW1lcyBkbyBub3QgYWN0dWFsbHkgZGVsaW5lYXRlIHNlcGFyYXRlIGJhdGNoZXMuICBUaG91Z2gsIGlmIHRoZXkgX2RvXwpkZWxpbmVhdGUgc2VwYXJhdGUgYmF0Y2hlcywgaXQgbWlnaHQgYmUgdGFrZW4gYXMgYSAodmVyeSlzbWFsbCBkZWdyZWUgb2YgZXZpZGVuY2UgdGhhdAowNCBhbmQgMDkgd2VyZSBzd2l0Y2hlZC4KCiMjIFN0cmFpbiBjamIxMTEKCmBgYHtyIGRlX2NqYjExMX0KY29tYmluZWRfZXNzZW50aWFsaXR5IDwtIGxpc3QoCiAgImNvbnRyb2wiID0gInByZXByb2Nlc3NpbmcvY29tYmluZWRfY29udHJvbC9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9jamIxMTEvbWhfZXNzLXRyaW1tZWRfY2EtdjFtMV9nZW5lX3Rhc19tMi5jc3YiLAogICJsb3ciID0gInByZXByb2Nlc3NpbmcvY29tYmluZWRfbG93L291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9taF9lc3MtdHJpbW1lZF9jYS12MW0xX2dlbmVfdGFzX20yLmNzdiIsCiAgImhpZ2giID0gInByZXByb2Nlc3NpbmcvY29tYmluZWRfaGlnaC9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9jamIxMTEvbWhfZXNzLXRyaW1tZWRfY2EtdjFtMV9nZW5lX3Rhc19tMi5jc3YiLAogICJwcmV2aW91cyIgPSAicHJlcHJvY2Vzc2luZy9jb21iaW5lZF9wcmV2aW91cy9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9jamIxMTEvbWhfZXNzLWNvbWJpbmVkX2NhX3RhLXYwTTFfZ2VuZV90YXNfbTIuY3N2IikKZXNzX3RhYmxlIDwtIGRhdGEuZnJhbWUoKQpmb3IgKGYgaW4gMTpsZW5ndGgoY29tYmluZWRfZXNzZW50aWFsaXR5KSkgewogIG5hbWUgPC0gbmFtZXMoY29tYmluZWRfZXNzZW50aWFsaXR5KVtmXQogIGNvbHVtbl9uYW1lcyA8LSBjKCJvcmYiLCAiayIsICJuIiwgInIiLCAicyIsICJ6YmFyIiwgImNhbGwiKQogIG5hbWVzIDwtIHBhc3RlMChuYW1lLCAiXyIsIGNvbHVtbl9uYW1lcykKICByIDwtIHJlYWRyOjpyZWFkX3Rzdihjb21iaW5lZF9lc3NlbnRpYWxpdHlbW2ZdXSwgY29tbWVudD0iIyIsIGNvbF9uYW1lcz1uYW1lcykKICBjb2xuYW1lcyhyKVsxXSA8LSAib3JmIgogIGlmIChmID09IDEpIHsKICAgIGVzc190YWJsZSA8LSByCiAgfSBlbHNlIHsKICAgIGVzc190YWJsZSA8LSBtZXJnZShlc3NfdGFibGUsIHIsIGJ5PSJvcmYiKQogIH0KfQpyb3duYW1lcyhlc3NfdGFibGUpIDwtIGdzdWIoeD1lc3NfdGFibGVbWyJvcmYiXV0sIHBhdHRlcm49Il5jZHNfIiwgcmVwbGFjZW1lbnQ9IiIpCmVzc190YWJsZVtbIm9yZiJdXSA8LSBOVUxMCgpjamIxMTFfZGUgPC0gYWxsX3BhaXJ3aXNlKGNqYjExMV9leHB0LCBtb2RlbF9iYXRjaD1GQUxTRSwgcGFyYWxsZWw9RkFMU0UpCmNqYjExMV9jb250cmFzdHMgPC0gbGlzdCgKICAibG93X3ZzX2NvbnRyb2wiID0gYygiY2FsX2xvdyIsICJjb250cm9sIiksCiAgImhpZ2hfdnNfY29udHJvbCIgPSBjKCJjYWxfaGlnaCIsICJjb250cm9sIikpCmNqYjExMV90YWJsZXMgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgZXh0cmFfYW5ub3Q9ZXNzX3RhYmxlLAogIGNqYjExMV9kZSwga2VlcGVycz1jamIxMTFfY29udHJhc3RzLAogIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfS1jamIxMTFfdGFibGVzLXZ7dmVyfS54bHN4IikpCiMjY2piMTExX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAojIyAgY2piMTExX3RhYmxlcywKIyMgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL2NqYjExMV9zaWctdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIENpcmNvcwoKYGBge3IgY2lyY29zfQpjb21iaW5lZF9leHB0IDwtIGNyZWF0ZV9leHB0KCJzYW1wbGVfc2hlZXRzL3NhZ2FsYWN0aWFlX2NvbWJpbmVkX3NhbXBsZXMueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPWNqYjExMV9hbm5vdCkKY29tYmluZWRfbm9ybSA8LSBub3JtYWxpemVfZXhwdChjb21iaW5lZF9leHB0LCBjb252ZXJ0PSJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09ImxvZzIiLCBuYV90b196ZXJvPVRSVUUpCmNvbWJpbmVkX2V4cHJzIDwtIGV4cHJzKGNvbWJpbmVkX25vcm0pCgplc3NfY2lyY29zIDwtIGVzc190YWJsZVssIGMoImNvbnRyb2xfY2FsbCIsICJsb3dfY2FsbCIsICJoaWdoX2NhbGwiKV0gJT4lCiAgICBkcGx5cjo6bXV0YXRlKGNvbnRyb2xfbnVtID0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfY2FsbCA9PSAiRSIgfiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbF9jYWxsID09ICJORSIgfiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbF9jYWxsID09ICJTIiB+IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbF9jYWxsID09ICJVIiB+IDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfbnVtID0gZHBseXI6OmNhc2Vfd2hlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93X2NhbGwgPT0gIkUiIH4gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93X2NhbGwgPT0gIk5FIiB+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd19jYWxsID09ICJTIiB+IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfY2FsbCA9PSAiVSIgfiAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaF9udW0gPSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaF9jYWxsID09ICJFIiB+IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoX2NhbGwgPT0gIk5FIiB+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoX2NhbGwgPT0gIlMiIH4gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoX2NhbGwgPT0gIlUiIH4gMSkpCmVzc19jaXJjb3NbWyJjb250cm9sX2NhbGwiXV0gPC0gYXMuZmFjdG9yKGVzc19jaXJjb3NbWyJjb250cm9sX2NhbGwiXV0pCmVzc19jaXJjb3NbWyJsb3dfY2FsbCJdXSA8LSBhcy5mYWN0b3IoZXNzX2NpcmNvc1tbImxvd19jYWxsIl1dKQplc3NfY2lyY29zW1siaGlnaF9jYWxsIl1dIDwtIGFzLmZhY3Rvcihlc3NfY2lyY29zW1siaGlnaF9jYWxsIl1dKQpyb3duYW1lcyhlc3NfY2lyY29zKSA8LSByb3duYW1lcyhlc3NfdGFibGUpCgpjb2xvcnMgPC0gYygiOTkwMDAwIiwgIjAwODgwMCIsICIwMDAwMDAiLCAiMDAwMEFBIikKbmFtZXMoY29sb3JzKSA8LSBjKCJFIiwgIk5FIiwgIlMiLCAiVSIpCmxvd19kZiA8LSBjamIxMTFfdGFibGVzW1siZGF0YSJdXVtbImxvd192c19jb250cm9sIl1dCmhpZ2hfZGYgPC0gY2piMTExX3RhYmxlc1tbImRhdGEiXV1bWyJoaWdoX3ZzX2NvbnRyb2wiXV0KCmNpcmNvc19jZmcgPC0gY2lyY29zX3ByZWZpeChjamIxMTFfYW5ub3QsIG5hbWU9ImNqYjExMSIpCmNqYjExMV9rYXJ5IDwtIGNpcmNvc19rYXJ5b3R5cGUoY2lyY29zX2NmZywgZmFzdGE9InJlZmVyZW5jZS9zYWdhbGFjdGlhZV9jamIxMTEuZmFzdGEiKQpjamIxMTFfcGx1c19taW51cyA8LSBjaXJjb3NfcGx1c19taW51cyhjaXJjb3NfY2ZnLCB3aWR0aD0wLjA2LCB0aGlja25lc3M9NDApCmNqYjExMV9jb250cm9sX3Jwa20gPC0gY2lyY29zX2hpc3QoY2lyY29zX2NmZywgY29tYmluZWRfZXhwcnMsIGNvbG5hbWU9ImNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZT0iY29udHJvbF9ycGttIiwgb3V0ZXI9Y2piMTExX3BsdXNfbWludXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfY29sb3I9InZ2ZHBibHVlIiwgd2lkdGg9MC4wNikKY2piMTExX2xvd19ycGttIDwtIGNpcmNvc19oaXN0KGNpcmNvc19jZmcsIGNvbWJpbmVkX2V4cHJzLCBjb2xuYW1lPSJsb3ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lPSJsb3dfcnBrbSIsIG91dGVyPWNqYjExMV9jb250cm9sX3Jwa20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9jb2xvcj0idmRwYmx1ZSIsIHdpZHRoPTAuMDYpCmNqYjExMV9oaWdoX3Jwa20gPC0gY2lyY29zX2hpc3QoY2lyY29zX2NmZywgY29tYmluZWRfZXhwcnMsIGNvbG5hbWU9ImhpZ2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZT0iaGlnaF9ycGttIiwgb3V0ZXI9Y2piMTExX2xvd19ycGttLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2NvbG9yPSJkcGJsdWUiLCB3aWR0aD0wLjA2KQpjamIxMTFfY29udHJvbF90aWxlIDwtIGNpcmNvc190aWxlKGNpcmNvc19jZmcsIGVzc19jaXJjb3MsIGNvbG5hbWU9ImNvbnRyb2xfY2FsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1jb2xvcnMsIGJhc2VuYW1lPSJjb250cm9sX3RpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlcj1jamIxMTFfaGlnaF9ycGttLCB3aWR0aD0wLjA2KQpjamIxMTFfbG93IDwtIGNpcmNvc19oaXN0KGNpcmNvc19jZmcsIGxvd19kZiwgY29sbmFtZT0iZGVzZXFfbG9nZmMiLCBiYXNlbmFtZT0ibG93IiwKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXI9MC42MCwgZmlsbF9jb2xvcj0idnZkcGdyZWVuIiwgd2lkdGg9MC4wNiwgdGhpY2tuZXNzPTAuMSkKY2piMTExX2hpZ2ggPC0gY2lyY29zX2hpc3QoY2lyY29zX2NmZywgaGlnaF9kZiwgY29sbmFtZT0iZGVzZXFfbG9nZmMiLCBiYXNlbmFtZT0iaGlnaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlcj1jamIxMTFfbG93LCBmaWxsX2NvbG9yPSJ2ZHBncmVlbiIsIHdpZHRoPTAuMDYsIHRoaWNrbmVzcz0wLjEpCmNqYjExMV9zdWZmaXggPC0gY2lyY29zX3N1ZmZpeChjaXJjb3NfY2ZnKQptYWRlIDwtIGNpcmNvc19tYWtlKGNpcmNvc19jZmcsIHRhcmdldD0iY2piMTExIikKYGBgCgpZb2FubiBzZW50IGFuIGVtYWlsIHRoaXMgbW9ybmluZyB3aXRoIHRoZSBmb2xsb3dpbmcgcmVxdWVzdDoKCiJJIGhhdmUgbm93IHRoZSB0YWJsZSBzdW1tYXJpemluZyB0aGUgZGF0YSBhbmQgd2Ugd291bGQgbGlrZSB0byBzdW1tYXJpemUgaXQKd2l0aCBhIENpcmNvcyBwbG90LiBJIHdhcyBob3BpbmcgeW91IGNvdWxkIGRvIHlvdXIgYW1hemluZyBtYWdpYyBvbiB0aGlzLiBUaGUKZGF0YSBpcyBpbiB0aGUgRXhjZWwgZmlsZSBJIGFtIGF0dGFjaGluZyB0byB0aGUgZW1haWwuIFRoZSBmaWd1cmUgd291bGQgbG9vawp2ZXJ5IHNpbWlsYXIgdG8gd2hhdCB5b3UgZGlkIG5vdCB0b28gbG9uZyBhZ28sIGJ1dCB3aXRoIGV4dHJhIGRhdGEuIFRoZSBpZGVhCndpbGwgYmUgdG8gaGF2ZSB0aGUgZ2Vub21lIGluZm9ybWF0aW9uIGFuZCB0aGVuIGdvaW5nIGRvd24gaW50byB0aGUgY2lyY2xlIHdlCndvdWxkIHNob3cgdGhlIFRIWSBkYXRhIChpbiBjb2x1bW4gQkUpLCB0aGFuIG1heWJlIGEgbGl0dGxlIHNwYWNlIGFuZCB3ZSB3b3VsZApzaG93IHRoZSBSUE1JLWJhc2VkIGRhdGEgKEJMLCBCUyBhbmQgQlopLCB0aGVuIGFnYWluIGEgbGl0dGxlIHNwYWNlIGFuZCB3ZSB3b3VsZApoYXZlIGEgZmluYWwgY2lyY2xlIGludGVncmF0aW5nIGFsbCBwcmV2aW91cyBkYXRhIGZvciB0aGUgZmluYWwgY2FsbCAoQ0kpLiIKCkkgY29waWVkIHRoZSB4bHMgZmlsZSB0byB0aGUgJ2Zyb21feW9hbm4vJyBkaXJlY3RvcnkgYW5kIGV4cG9ydGVkIHRoZSByZWxldmFudApwb3J0aW9ucyB0byBhIGNzdiBmaWxlIG5hbWVkICdnYnNfZXNzZW50aWFsaXR5LmNzdicuCgpJIGp1c3QgcmVhbGl6ZWQgdGhhdCB0aGUgbWF0ZXJpYWwgWW9hbm4gc2VudCBtZSBpcyBwcmVjaXNlbHkgd2hhdCBJIGFscmVhZHkgZGlkCmluIHRoZSBhYm92ZSBzZWN0aW9uIHdoaWNoIGNyZWF0ZWQgdGhlIGVzc19jaXJjb3MgdGFibGUuCgpgYGB7ciBuZXdfY2lyY29zfQp5b2Fubl90YWJsZSA8LSByZWFkcjo6cmVhZF9jc3YoImZyb21feW9hbm4vZ2JzX2Vzc2VudGlhbGl0eS5jc3YiKQojIyBUaGUgbmV3IGNvbHVtbiB3aGljaCBpcyBkZXNpcmVkIGlzIGFjdHVhbGx5IHRoZSAnRmluYWwnLgojIyBTbywgSSB3aWxsIG1lcmdlIHRoaXMgd2l0aCBteSBleGlzdGluZyBlc3NfY2lyY29zIGRhdGEgZnJhbWUgYW5kIGFkZCBhIGNvbG9yIGZvciAnTkMnLgojIyBUaGUgd2FudGVkIGNvbHVtbiBuYW1lcyBhcmU6CiMjIEJFOiBwcmV2aW91c2NhbGwgQkw6IGNvbnRyb2xjYWxsIEJTOiBsb3djYWxsIEJaOiBoaWdoY2FsbCBDSTogJ0ZpbmFsIGNhbGwnICg4NSkKd2FudGVkIDwtIGMoImNvbnRyb2xjYWxsIiwgIkZpbmFsIikKeW9hbm5fd2FudGVkIDwtIGFzLmRhdGEuZnJhbWUoeW9hbm5fdGFibGVbLCB3YW50ZWRdKQpyb3duYW1lcyh5b2Fubl93YW50ZWQpIDwtIHlvYW5uX3RhYmxlW1sicm93Lm5hbWVzIl1dCgp5b2Fubl9jaXJjb3MgPC0gbWVyZ2UoZXNzX2NpcmNvcywgeW9hbm5fd2FudGVkLCBieS54PSJyb3cubmFtZXMiLCBieS55PSJyb3cubmFtZXMiKQp5b2Fubl9jaXJjb3NbWyJGaW5hbCJdXSA8LSBhcy5mYWN0b3IoeW9hbm5fY2lyY29zW1siRmluYWwiXV0pCnJvd25hbWVzKHlvYW5uX2NpcmNvcykgPC0geW9hbm5fY2lyY29zW1siUm93Lm5hbWVzIl1dCnlvYW5uX2NpcmNvc1tbIlJvdy5uYW1lcyJdXSA8LSBOVUxMCmNvbG9ycyA8LSBjKCI5OTAwMDAiLCAiMDA4ODAwIiwgIjQ0NDQ0NCIsICIwMDAwQUEiLCAiMDAwMDAwIikKbmFtZXMoY29sb3JzKSA8LSBjKCJFIiwgIk5FIiwgIlMiLCAiVSIsICJOQyIpCgp5b2Fubl9jZmcgPC0gY2lyY29zX3ByZWZpeChjamIxMTFfYW5ub3QsIG5hbWU9ImNqYjExMV95b2FubiIpCnlvYW5uX2thcnkgPC0gY2lyY29zX2thcnlvdHlwZSh5b2Fubl9jZmcsIGZhc3RhPSJyZWZlcmVuY2Uvc2FnYWxhY3RpYWVfY2piMTExLmZhc3RhIikKeW9hbm5fcGx1c19taW51cyA8LSBjaXJjb3NfcGx1c19taW51cyh5b2Fubl9jZmcsIHdpZHRoPTAuMDYsIHRoaWNrbmVzcz00MCkKeW9hbm5fY29udHJvbF90aWxlIDwtIGNpcmNvc190aWxlKHlvYW5uX2NmZywgZXNzX2NpcmNvcywgY29sbmFtZT0iY29udHJvbF9jYWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1jb2xvcnMsIGJhc2VuYW1lPSJjb250cm9sX3RpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXI9eW9hbm5fcGx1c19taW51cywgd2lkdGg9MC4wNikKeW9hbm5fbG93X3RpbGUgPC0gY2lyY29zX3RpbGUoeW9hbm5fY2ZnLCBlc3NfY2lyY29zLCBjb2xuYW1lPSJsb3dfY2FsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1jb2xvcnMsIGJhc2VuYW1lPSJsb3dfdGlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPXlvYW5uX2NvbnRyb2xfdGlsZSwgd2lkdGg9MC4wNikKeW9hbm5faGlnaF90aWxlIDwtIGNpcmNvc190aWxlKHlvYW5uX2NmZywgZXNzX2NpcmNvcywgY29sbmFtZT0iaGlnaF9jYWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWNvbG9ycywgYmFzZW5hbWU9ImhpZ2hfdGlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPXlvYW5uX2xvd190aWxlLCB3aWR0aD0wLjA2KQp5b2Fubl9maW5hbF90aWxlIDwtIGNpcmNvc190aWxlKHlvYW5uX2NmZywgeW9hbm5fY2lyY29zLCBjb2xuYW1lPSJGaW5hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWNvbG9ycywgYmFzZW5hbWU9ImZpbmFsX3RpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPXlvYW5uX2hpZ2hfdGlsZSwgd2lkdGg9MC4wNikKeW9hbm5fc3VmZml4IDwtIGNpcmNvc19zdWZmaXgoeW9hbm5fY2ZnKQptYWRlIDwtIGNpcmNvc19tYWtlKHlvYW5uX2NmZywgdGFyZ2V0PSJjamIxMTFfeW9hbm4iKQpgYGAKCiMgQW5vdGhlciBZb2FubiBxdWVyeQoKIEZpcnN0LCBiZXR3ZWVuIHRoZSBDT0cgY2F0ZWdvcmllcyBhbmQgdGhlIFRIWSBkYXRhLCBJIHdvdWxkIGxpa2UgdG8gYWRkIHRoZQogc2F0dXJhdGlvbiBsZXZlbCBvZiB0aGUgbGlicmFyeTogdGhpcyB3b3VsZCBiZSB0aGUgYmx1ZSBsaW5lcyBmcm9tIHRoZSBDaXJjb3MKIGZpZ3VyZSB5b3UgcHJvZHVjZSBhIHdoaWxlIGJhY2sgKHNlZSBDaXJjb3MgcGxvdCBhdHRhY2hlZCB0byB0aGlzIGVtYWlsKS4KCiBTZWNvbmQsIEkgd291bGQgbGlrZSB0byBhZGQgYSBuZXcgcmluZyBvZiBlc3NlbnRpYWxpdHkgdGhhdCBzdW1tYXJpemVzIHRoZSBkYXRhCiBmcm9tIHRoZSByaW5ncyAoMSksICgyKSwgKDMpIGFuZCAoNCkgYWJvdmVtZW50aW9uZWQuIFRoZSBkYXRhIGlzIGxpc3RlZCBpbiB0aGUKIGF0dGFjaGVkIEV4Y2VsIGRvY3VtZW50IGFuZCBpcyBmb3VuZCBpbiBjb2x1bW4gQ0ksIGNhbGxlZCBMaW5kc2V5J3MgY2FsbC4gSQogd291bGQgbGlrZSB0aGUgZGF0YSB0byBsb29rIGEgbGl0dGxlIGRpZmZlcmVudCBzbyBpdCAicG9wcyIgYXMgaXQgaXMgYQogc3VtbWFyeS4gSSByZW1lbWJlciBiYWNrIGluIHRoZSBkYXksIHdlIGRpZCBzb21ldGhpbmcgc2ltaWxhciB3aXRoIHNvbWUgb2YgbXkKIGRhdGEgaW4gR3JvdXAgQSBzdHJlcCwgYW5kIHdlIGhhZCB0aGUgbm9uLWVzc2VudGlhbCBnZW5lcyBzaG93aW5nIGluIHllbGxvdy4KCiAgSW4gb3JkZXIgdG8gZG8gdGhlIGFib3ZlLCBJIHNhdmVkIHRoZSBleGNlbCBmaWxlIFlvYW5uIHNlbnQgbWUsIGV4cG9ydGVkIHRoZQogIHJlbGV2YW50IGNvbHVtbiB0byBhIDIgY29sdW1uIGN2cyBmaWxlLCBjb250YWluaW5nIHRoZSBnZW5lIElEcyBhbmQgY2FsbHMuCiAgTm93IEkgd2lsbCBjb3B5L3Bhc3RlIHRoZSBwcmV2aW91cyBzZXQgb2YgcmluZ3MgYW5kIGFkZCB0aGUgbmV3IHJlcXVlc3RzLgoKYGBge3IgeW9hbm5fMjAyMDA2fQp5b2Fubl8yMDIwMDYgPC0gcmVhZHI6OnJlYWRfY3N2KCJmcm9tX3lvYW5uL2xpbmRzZXlfY2FsbHMuY3N2IikKeW9hbm5fMjAyMDA2IDwtIGFzLmRhdGEuZnJhbWUoeW9hbm5fMjAyMDA2KQpyb3duYW1lcyh5b2Fubl8yMDIwMDYpIDwtIHlvYW5uXzIwMjAwNltbIklEIl1dCmNvbG5hbWVzKHlvYW5uXzIwMjAwNikgPC0gYygiSUQyMDIwMDYiLCAibGluZHNleV9jYWxsIikKCmxpbmRzZXlfY29sb3JzIDwtIGMoImUzMTIxMiIsICJmMGM1MDUiLCAiNDQ0NDQ0IiwgIjAwMDBBQSIsICIwMDAwMDAiKQpuYW1lcyhsaW5kc2V5X2NvbG9ycykgPC0gYygiRSIsICJORSIsICJTIiwgIlUiLCAiTkMiKQoKeW9hbm5fY2lyY29zXzIwMjAwNiA8LSBtZXJnZSh5b2Fubl9jaXJjb3MsIHlvYW5uXzIwMjAwNiwgYnkueD0icm93Lm5hbWVzIiwgYnkueT0icm93Lm5hbWVzIikKcm93bmFtZXMoeW9hbm5fY2lyY29zXzIwMjAwNikgPC0geW9hbm5fY2lyY29zXzIwMjAwNltbIlJvdy5uYW1lcyJdXQp5b2Fubl9jaXJjb3NfMjAyMDA2W1siUm93Lm5hbWVzIl1dIDwtIE5VTEwKCnlvYW5uX2NmZ18yMDIwMDYgPC0gY2lyY29zX3ByZWZpeChjamIxMTFfYW5ub3QsIG5hbWU9ImNqYjExMV95b2Fubl8yMDIwMDYiKQp5b2Fubl9rYXJ5XzIwMjAwNiA8LSBjaXJjb3Nfa2FyeW90eXBlKHlvYW5uX2NmZ18yMDIwMDYsIGZhc3RhPSJyZWZlcmVuY2Uvc2FnYWxhY3RpYWVfY2piMTExLmZhc3RhIikKeW9hbm5fcGx1c19taW51c18yMDIwMDYgPC0gY2lyY29zX3BsdXNfbWludXMoeW9hbm5fY2ZnXzIwMjAwNiwgd2lkdGg9MC4wNSwgdGhpY2tuZXNzPTQwKQpjamIxMTFfY29udHJvbF9ycGttXzIwMjAwNiA8LSBjaXJjb3NfaGlzdCh5b2Fubl9jZmdfMjAyMDA2LCBjb21iaW5lZF9leHBycywgY29sbmFtZT0iY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZT0iY29udHJvbF9ycGttIiwgb3V0ZXI9eW9hbm5fcGx1c19taW51c18yMDIwMDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2NvbG9yPSJ2dmRwYmx1ZSIsIHdpZHRoPTAuMDUpCmNqYjExMV9sb3dfcnBrbV8yMDIwMDYgPC0gY2lyY29zX2hpc3QoeW9hbm5fY2ZnXzIwMjAwNiwgY29tYmluZWRfZXhwcnMsIGNvbG5hbWU9ImxvdyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lPSJsb3dfcnBrbSIsIG91dGVyPWNqYjExMV9jb250cm9sX3Jwa21fMjAyMDA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2NvbG9yPSJ2ZHBibHVlIiwgd2lkdGg9MC4wNSkKY2piMTExX2hpZ2hfcnBrbV8yMDIwMDYgPC0gY2lyY29zX2hpc3QoeW9hbm5fY2ZnXzIwMjAwNiwgY29tYmluZWRfZXhwcnMsIGNvbG5hbWU9ImhpZ2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWU9ImhpZ2hfcnBrbSIsIG91dGVyPWNqYjExMV9sb3dfcnBrbV8yMDIwMDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2NvbG9yPSJkcGJsdWUiLCB3aWR0aD0wLjA1KQpsaW5kc2V5X3RpbGVfMjAyMDA2IDwtIGNpcmNvc190aWxlKHlvYW5uX2NmZ18yMDIwMDYsIHlvYW5uX2NpcmNvc18yMDIwMDYsIGNvbG5hbWU9ImxpbmRzZXlfY2FsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWxpbmRzZXlfY29sb3JzLCBiYXNlbmFtZT0ic3VtbWFyeV90aWxlIiwgdGhpY2tuZXNzPTYwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZV90aGlja25lc3M9MC4wMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXI9Y2piMTExX2hpZ2hfcnBrbV8yMDIwMDYsIHdpZHRoPTAuMDUpCnlvYW5uX2NvbnRyb2xfdGlsZV8yMDIwMDYgPC0gY2lyY29zX3RpbGUoeW9hbm5fY2ZnXzIwMjAwNiwgZXNzX2NpcmNvcywgY29sbmFtZT0iY29udHJvbF9jYWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9Y29sb3JzLCBiYXNlbmFtZT0iY29udHJvbF90aWxlIiwgdGhpY2tuZXNzPTYwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZV90aGlja25lc3M9MC4wMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXI9bGluZHNleV90aWxlXzIwMjAwNiwgd2lkdGg9MC4wNSkKeW9hbm5fbG93X3RpbGVfMjAyMDA2IDwtIGNpcmNvc190aWxlKHlvYW5uX2NmZ18yMDIwMDYsIGVzc19jaXJjb3MsIGNvbG5hbWU9Imxvd19jYWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1jb2xvcnMsIGJhc2VuYW1lPSJsb3dfdGlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlja25lc3M9NjAsIHN0cm9rZV90aGlja25lc3M9MC4wMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlcj15b2Fubl9jb250cm9sX3RpbGVfMjAyMDA2LCB3aWR0aD0wLjA1KQp5b2Fubl9oaWdoX3RpbGVfMjAyMDA2IDwtIGNpcmNvc190aWxlKHlvYW5uX2NmZ18yMDIwMDYsIGVzc19jaXJjb3MsIGNvbG5hbWU9ImhpZ2hfY2FsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWNvbG9ycywgYmFzZW5hbWU9ImhpZ2hfdGlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpY2tuZXNzPTYwLCBzdHJva2VfdGhpY2tuZXNzPTAuMDAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyPXlvYW5uX2xvd190aWxlXzIwMjAwNiwgd2lkdGg9MC4wNSkKeW9hbm5fZmluYWxfdGlsZV8yMDIwMDYgPC0gY2lyY29zX3RpbGUoeW9hbm5fY2ZnXzIwMjAwNiwgeW9hbm5fY2lyY29zXzIwMjAwNiwgY29sbmFtZT0iRmluYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9Y29sb3JzLCBiYXNlbmFtZT0iZmluYWxfdGlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaWNrbmVzcz02MCwgc3Ryb2tlX3RoaWNrbmVzcz0wLjAwMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXI9eW9hbm5faGlnaF90aWxlXzIwMjAwNiwgd2lkdGg9MC4wNSkKeW9hbm5fc3VmZml4XzIwMjAwNiA8LSBjaXJjb3Nfc3VmZml4KHlvYW5uX2NmZ18yMDIwMDYpCm1hZGUgPC0gY2lyY29zX21ha2UoeW9hbm5fY2ZnXzIwMjAwNiwgdGFyZ2V0PSJjamIxMTFfeW9hbm5fMjAyMDA2IikKYGBgCgojIFlvYW5uIHZlcnNpb24gNGlzaAoKSGVyZSBpcyB0aGlzIG1vcm5pbmcncyBlbWFpbDoKCkZvciB0aGUgaW5mb3JtYXRpb24gd2Ugd2FudCB0byBkaXNwbGF5LgogLSByaW5ncyAxIGFuZCAyLCBmcm9tIHRoZSBvdXRzaWRlOiB0aGUgZ2VuZXMgYnkgQ09HLCB3aGljaCBJIHRoaW5rIGlzIGFscmVhZHkKICAgd2hhdCB5b3UgaGF2ZSB0aGVyZS4KIC0gcmluZyAzOiB0aGUgbXV0YXRpb24gc2F0dXJhdGlvbiwgaG93IG1hbnkgS3JtaXQgaW5zZXJ0aW9ucyBpbiB0aGUgaW5pdGlhbAogICBsaWJyYXJ5IGluIFRIWSwgd2hpY2ggYWdhaW4gSSB0aGluayBpcyB3aGF0IHlvdSBoYXZlLgogLSByaW5nIDQ6IEJheWVzaWFuIGVzc2VudGlhbGl0eSBkYXRhIGZvciB0aGUgVEhZIG1lZGl1bSAodGhpcyBpcyBjb2x1bW4gQkUgaW4KICAgdGhlIGNyYXp5IHRhYmxlIEkgc2VudCB5b3UgdGhpcyBtb3JuaW5nKS4KIC0gcmluZyA1OiBCYXllc2lhbiBlc3NlbnRpYWxpdHkgZGF0YSBmb3IgdGhlIG1SUE1JIG1lZGl1bSAodGhpcyBpcyBjb2x1bW4gQkwgaW4KICAgdGhlIGNyYXp5IHRhYmxlKS4KIC0gcmluZyA2OiBCYXllc2lhbiBlc3NlbnRpYWxpdHkgZGF0YSBmb3IgdGhlIG1SUE1JIG1lZGl1bSArIGxvdyBDYWxwcm90ZWN0aW4KICAgKHRoaXMgaXMgY29sdW1uIEJTIGluIHRoZSBjcmF6eSB0YWJsZSkuCiAtIHJpbmcgNzogQmF5ZXNpYW4gZXNzZW50aWFsaXR5IGRhdGEgZm9yIHRoZSBtUlBNSSBtZWRpdW0gKyBoaWdoIENhbHByb3RlY3RpbgogICAodGhpcyBpcyBjb2x1bW4gQlogaW4gdGhlIGNyYXp5IHRhYmxlKS4KIC0gSSB3YXMgd29uZGVyaW5nIGlmIHlvdSBjb3VsZCBpbmNsdWRlIGEgbGl0dGxlIHNwYWNlIGhlcmUgKG1heWJlIGl0J3MgdG9vCiAgIG11Y2gsIGRvbid0IHNwZW5kIHRvbyBtdWNoIHRpbWUgb24gdGhhdCkuCgpTaW5jZSBhbGwgdGhlIHN0dWZmIGlzIGFwcGFyZW50bHkgaW4gdGhlIHRhYmxlIFlvYW5uIGNhbGxlZCAnY3JhenkgdGFibGUnLCBJCmV4cG9ydGVkIHRob3NlIGNvbHVtbnMgaW50byBhIGNzdiB3aXRoIHRoYXQgbmFtZS4uLgoKYGBge3IgeW9hbm52NH0KY3JhenlfdGFibGUgPC0gcmVhZC5jc3YoImZyb21feW9hbm4vY3JhenlfdGFibGUuY3N2IikKcm93bmFtZXMoY3JhenlfdGFibGUpIDwtIGNyYXp5X3RhYmxlW1sicm93Lm5hbWVzIl1dCmNyYXp5X3RhYmxlW1sicm93Lm5hbWVzIl1dIDwtIE5VTEwKCmNmZ3Y0IDwtIGNpcmNvc19wcmVmaXgoY2piMTExX2Fubm90LCBuYW1lPSJjamIxMTFfdjQiKQprYXJ5djQgPC0gY2lyY29zX2thcnlvdHlwZShjZmd2NCwgZmFzdGE9InJlZmVyZW5jZS9zYWdhbGFjdGlhZV9jamIxMTEuZmFzdGEiKQpyaW5nMTJ2NCA8LSBjaXJjb3NfcGx1c19taW51cyhjZmd2NCwgd2lkdGg9MC4wNSwgdGhpY2tuZXNzPTQwKQpyaW5nM3Y0IDwtIGNpcmNvc19oaXN0KGNmZ3Y0LCBjb21iaW5lZF9leHBycywgY29sbmFtZT0iY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWU9ImNvbnRyb2xfcnBrbXY0Iiwgb3V0ZXI9cmluZzEydjQsCiAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9jb2xvcj0idnZkcGJsdWUiLCB3aWR0aD0wLjA1KQpyaW5nNHY0IDwtIGNpcmNvc190aWxlKGNmZ3Y0LCBjcmF6eV90YWJsZSwgY29sbmFtZT0icHJldmlvdXNjYWxsIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9bGluZHNleV9jb2xvcnMsIGJhc2VuYW1lPSJwcmV2aW91c3Y0Iiwgb3V0ZXI9cmluZzN2NCwKICAgICAgICAgICAgICAgICAgICAgICB0aGlja25lc3M9NjAsIHN0cm9rZV90aGlja25lc3M9MC4wMDEsICB3aWR0aD0wLjA1KQpyaW5nNXY0IDwtIGNpcmNvc190aWxlKGNmZ3Y0LCBjcmF6eV90YWJsZSwgY29sbmFtZT0iY29udHJvbGNhbGwiLAogICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1saW5kc2V5X2NvbG9ycywgYmFzZW5hbWU9ImNvbnRyb2x2NCIsIG91dGVyPXJpbmc0djQsCiAgICAgICAgICAgICAgICAgICAgICAgdGhpY2tuZXNzPTYwLCBzdHJva2VfdGhpY2tuZXNzPTAuMDAxLCB3aWR0aD0wLjA1KQpyaW5nNnY0IDwtIGNpcmNvc190aWxlKGNmZ3Y0LCBjcmF6eV90YWJsZSwgY29sbmFtZT0ibG93Y2FsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWxpbmRzZXlfY29sb3JzLCBiYXNlbmFtZT0ibG93djQiLCBvdXRlcj1yaW5nNXY0LAogICAgICAgICAgICAgICAgICAgICAgIHRoaWNrbmVzcz02MCwgc3Ryb2tlX3RoaWNrbmVzcz0wLjAwMSwgd2lkdGg9MC4wNSkKcmluZzd2NCA8LSBjaXJjb3NfdGlsZShjZmd2NCwgY3JhenlfdGFibGUsIGNvbG5hbWU9ImhpZ2hjYWxsIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9bGluZHNleV9jb2xvcnMsIGJhc2VuYW1lPSJoaWdodjQiLCBvdXRlcj1yaW5nNnY0LAogICAgICAgICAgICAgICAgICAgICAgIHRoaWNrbmVzcz02MCwgc3Ryb2tlX3RoaWNrbmVzcz0wLjAwMSwgd2lkdGg9MC4wNSkKc3VmZml4djQgPC0gY2lyY29zX3N1ZmZpeChjZmd2NCkKbWFkZSA8LSBjaXJjb3NfbWFrZShjZmd2NCwgdGFyZ2V0PSJjamIxMTFfdjQiKQpgYGAKCiMjIFlvYW5uIDIwMjAwNzA3CgpIZXJlIGlzIHRvZGF5J3MgZW1haWw6CgoiRm9yIHRoZSBCYXllc2lhbiByZXByZXNlbnRhdGlvbnMsIEkgd2FzIGhvcGluZyB3ZSBjb3VsZCBkaXNwbGF5IGEgdG90YWwgb2YgNQpjaXJjbGVzLCBmb3VyIHJlcHJlc2VudGluZyB0aGUgZGF0YSBvYnRhaW5lZCBmb3IgdGhlIGZvdXIgZGlmZmVyZW50IGNvbmRpdGlvbnMKKGkuZS4sIFRIWSAtY29sdW1uIEJFLTsgUlBNSSAtY29sdW1uIEJMLTsgUlBNSStsb3dDYWwgLWNvbHVtbiBCUy0gYW5kClJQTUkraGlnaENhbCAtY29sdW1uIEJaLSk6IGZvciB0aGVzZSA0IGNpcmNsZXMgdGhlIG5vbi1lc3NlbnRpYWwgZ2VuZXMgd291bGQgYmUKc2hvd24gaW4gZ3JlZS4gVGhlbiwgdGhlcmUgd291bGQgYmUgb25lIGxhc3QgY2lyY2xlLCB0aGF0IGlzIGEgc3VtbWFyeSBvZiB0aGUKcmVzdWx0cyBwcmV2aW91c2x5IG1lbnRpb25lZDogdGhpcyBjaXJjbGUgd291bGQgaW50ZWdyYXRlIHRoZSBkYXRhIGZyb20gY29sdW1uCkNJIChhbHNvIGNhbGxlZCBMaW5kc2V5IENhbGwpLCBhbmQgZm9yIHRoaXMgY2lyY2xlLCBJIHdhbnQgdGhlIG5vbi1lc3NlbnRpYWwKZ2VuZXMgcmVwcmVzZW50ZWQgaW4geWVsbG93LCBzbyB0aGF0IHdlIGNhbiBzZWUgdGhhdCB0aGlzIGlzIGEgbGl0dGxlIGRpZmZlcmVudAp0aGFuIHRoZSA0IG90aGVyIGNpcmNsZXMgcHJldmlvdXNseSBtZW50aW9uZWQuIgoKSWYgSSByZWFkIHRoaXMgY29ycmVjdGx5LCB0aGUgb25seSB0aGluZyBJIGRpZCB3cm9uZyB3YXMgdG8gZ2V0IHNvbWUgb2YgdGhlCmNvbG9ycyB3cm9uZz8KCmBgYHtyIHlvYW5udjV9Cm1haW5fY29sb3JzIDwtIGMoImUzMTIxMiIsICIxMmUzMTIiLCAiNDQ0NDQ0IiwgIjA5MDlBQSIsICIwOTA5MDkiKQpuYW1lcyhtYWluX2NvbG9ycykgPC0gYygiRSIsICJORSIsICJTIiwgIlUiLCAiTkMiKQpzdW1tYXJ5X2NvbG9ycyA8LSBjKCJlMzEyMTIiLCAiZjBjNTA1IiwgIjQ0NDQ0NCIsICIwOTA5QUEiLCAiMDkwOTA5IikKbmFtZXMoc3VtbWFyeV9jb2xvcnMpIDwtIGMoIkUiLCAiTkUiLCAiUyIsICJVIiwgIk5DIikKCmNmZ3Y1IDwtIGNpcmNvc19wcmVmaXgoY2piMTExX2Fubm90LCBuYW1lPSJjamIxMTFfdjUiKQprYXJ5djUgPC0gY2lyY29zX2thcnlvdHlwZShjZmd2NSwgZmFzdGE9InJlZmVyZW5jZS9zYWdhbGFjdGlhZV9jamIxMTEuZmFzdGEiKQpyaW5nMTJ2NSA8LSBjaXJjb3NfcGx1c19taW51cyhjZmd2NSwgd2lkdGg9MC4wNywgdGhpY2tuZXNzPTQwKQpyaW5nM3Y1IDwtIGNpcmNvc19oaXN0KGNmZ3Y1LCBjb21iaW5lZF9leHBycywgY29sbmFtZT0iY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWU9ImNvbnRyb2xfcnBrbXY1Iiwgb3V0ZXI9cmluZzEydjUsCiAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9jb2xvcj0idnZkcGJsdWUiLCB3aWR0aD0wLjA3KQpyaW5nNHY1IDwtIGNpcmNvc190aWxlKGNmZ3Y1LCBjcmF6eV90YWJsZSwgY29sbmFtZT0icHJldmlvdXNjYWxsIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9bWFpbl9jb2xvcnMsIGJhc2VuYW1lPSJwcmV2aW91c3Y1Iiwgb3V0ZXI9cmluZzN2NSwKICAgICAgICAgICAgICAgICAgICAgICB0aGlja25lc3M9NzAsIHN0cm9rZV90aGlja25lc3M9MC4wMDEsICB3aWR0aD0wLjA3KQpyaW5nNXY1IDwtIGNpcmNvc190aWxlKGNmZ3Y1LCBjcmF6eV90YWJsZSwgY29sbmFtZT0iY29udHJvbGNhbGwiLAogICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1tYWluX2NvbG9ycywgYmFzZW5hbWU9ImNvbnRyb2x2NSIsIG91dGVyPXJpbmc0djUsCiAgICAgICAgICAgICAgICAgICAgICAgdGhpY2tuZXNzPTcwLCBzdHJva2VfdGhpY2tuZXNzPTAuMDAxLCB3aWR0aD0wLjA3KQpyaW5nNnY1IDwtIGNpcmNvc190aWxlKGNmZ3Y1LCBjcmF6eV90YWJsZSwgY29sbmFtZT0ibG93Y2FsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPW1haW5fY29sb3JzLCBiYXNlbmFtZT0ibG93djUiLCBvdXRlcj1yaW5nNXY1LAogICAgICAgICAgICAgICAgICAgICAgIHRoaWNrbmVzcz03MCwgc3Ryb2tlX3RoaWNrbmVzcz0wLjAwMSwgd2lkdGg9MC4wNykKcmluZzd2NSA8LSBjaXJjb3NfdGlsZShjZmd2NSwgY3JhenlfdGFibGUsIGNvbG5hbWU9ImhpZ2hjYWxsIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9bWFpbl9jb2xvcnMsIGJhc2VuYW1lPSJoaWdodjUiLCBvdXRlcj1yaW5nNnY1LAogICAgICAgICAgICAgICAgICAgICAgIHRoaWNrbmVzcz03MCwgc3Ryb2tlX3RoaWNrbmVzcz0wLjAwMSwgd2lkdGg9MC4wNykKcmluZzh2NSA8LSBjaXJjb3NfdGlsZShjZmd2NSwgY3JhenlfdGFibGUsIGNvbG5hbWU9IkZpbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9c3VtbWFyeV9jb2xvcnMsIGJhc2VuYW1lPSJmaW5hbHY1Iiwgb3V0ZXI9cmluZzd2NSwKICAgICAgICAgICAgICAgICAgICAgICB0aGlja25lc3M9NzAsIHN0cm9rZV90aGlja25lc3M9MC4wMDEsIHdpZHRoPTAuMDcpCnN1ZmZpeHY1IDwtIGNpcmNvc19zdWZmaXgoY2ZndjUpCm1hZGUgPC0gY2lyY29zX21ha2UoY2ZndjUsIHRhcmdldD0iY2piMTExX3Y1IikKYGBgCgojIyMgRXhwZXJpbWVudGluZyB3aXRoIGdnc3RhdHNwbG90cyBhbmQgdGhlIDIwMTggZGF0YQoKYGBge3IgcHJldmlvdXN9CmNqYjExMV9wcmV2IDwtIGNyZWF0ZV9leHB0KG1ldGFkYXRhPSJzYW1wbGVfc2hlZXRzL3NhZ2FsYWN0aWFlX2NvbWJpbmVkX3dpdGhfcHJldmlvdXNfc2FtcGxlcy54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoPUZBTFNFLCBnZW5lX2luZm89Y2piMTExX2Fubm90LCBmaWxlX2NvbHVtbj0iZmlsZSIpCmBgYAoKYGBge3Igc2F0dXJhdGlvbnN9CnNhdHVyYXRpb25fY29udHJvbCA8LSB0bnNlcV9zYXR1cmF0aW9uKAogICAgInByZXByb2Nlc3NpbmcvY29tYmluZWRfY29udHJvbC9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9jamIxMTEvdHJpbW1lZF9jYS12MW0xLndpZyIpCnNhdHVyYXRpb25fY29udHJvbCRwbG90CmNvbnRyb2xfcGx0cyA8LSBwbG90X2Vzc2VudGlhbGl0eSgKICAgICJwcmVwcm9jZXNzaW5nL2NvbWJpbmVkX2NvbnRyb2wvb3V0cHV0cy9lc3NlbnRpYWxpdHlfc2FnYWxhY3RpYWVfY2piMTExL21oX2Vzcy10cmltbWVkX2NhLXYxbTFfZ2VuZV90YXNfbTIuY3N2IikKY29udHJvbF9wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl9sb3cgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAgICJwcmVwcm9jZXNzaW5nL2NvbWJpbmVkX2xvdy9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9jamIxMTEvdHJpbW1lZF9jYS12MW0xLndpZyIpCnNhdHVyYXRpb25fY29udHJvbCRwbG90Cmxvd19wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICAgInByZXByb2Nlc3NpbmcvY29tYmluZWRfbG93L291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9taF9lc3MtdHJpbW1lZF9jYS12MW0xX2dlbmVfdGFzX20yLmNzdiIpCmxvd19wbHRzW1siemJhciJdXQoKc2F0dXJhdGlvbl9oaWdoIDwtIHRuc2VxX3NhdHVyYXRpb24oCiAgICAicHJlcHJvY2Vzc2luZy9jb21iaW5lZF9oaWdoL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS90cmltbWVkX2NhLXYxbTEud2lnIikKc2F0dXJhdGlvbl9jb250cm9sJHBsb3QKaGlnaF9wbHRzIDwtIHBsb3RfZXNzZW50aWFsaXR5KAogICAgInByZXByb2Nlc3NpbmcvY29tYmluZWRfaGlnaC9vdXRwdXRzL2Vzc2VudGlhbGl0eV9zYWdhbGFjdGlhZV9jamIxMTEvbWhfZXNzLXRyaW1tZWRfY2EtdjFtMV9nZW5lX3Rhc19tMi5jc3YiKQpoaWdoX3BsdHNbWyJ6YmFyIl1dCgpzYXR1cmF0aW9uX3ByZXYgPC0gdG5zZXFfc2F0dXJhdGlvbigKICAgICJwcmVwcm9jZXNzaW5nL2NvbWJpbmVkX3ByZXZpb3VzL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9jb21iaW5lZF9jYV90YS12ME0xLndpZyIpCnNhdHVyYXRpb25fY29udHJvbCRwbG90CmhpZ2hfcGx0cyA8LSBwbG90X2Vzc2VudGlhbGl0eSgKICAgICJwcmVwcm9jZXNzaW5nL2NvbWJpbmVkX3ByZXZpb3VzL291dHB1dHMvZXNzZW50aWFsaXR5X3NhZ2FsYWN0aWFlX2NqYjExMS9taF9lc3MtY29tYmluZWRfY2FfdGEtdjBNMV9nZW5lX3Rhc19tMi5jc3YiKQpoaWdoX3BsdHNbWyJ6YmFyIl1dCmBgYAoKYGBge3IgY29tYmluZWRfc2F0dXJhdGlvbn0KcGx0IDwtIHRuc2VxX211bHRpX3NhdHVyYXRpb24obWV0YT1wRGF0YShjamIxMTFfcHJldiksIG1ldGFfY29sdW1uPSJjamIxMTFlc3N3aWciKQpwbHQkcGxvdApwbHQkZ2dzdGF0cwpgYGAKCgoKYGBge3Igc2F2ZW1lfQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQptZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKdGhpc19zYXZlIDwtIHBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cm1kX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikKbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQp0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkpCmBgYAoKYGBge3IgbG9hZG1lLCBldmFsPUZBTFNFfQpsb2FkbWUoZmlsZW5hbWU9dGhpc19zYXZlKQpgYGAK