samplesheet <- "sample_sheets/tmrc3_samples_20210610.xlsx"

1 Annotation

We take the annotation data from ensembl’s biomart instance. The genome which was used to map the data was hg38 revision 100. My default when using biomart is to load the data from 1 year before the current date.

hs_annot <- sm(load_biomart_annotations(year = "2020"))
hs_annot <- hs_annot[["annotation"]]
hs_annot[["transcript"]] <- paste0(rownames(hs_annot), ".", hs_annot[["version"]])
rownames(hs_annot) <- make.names(hs_annot[["ensembl_gene_id"]], unique = TRUE)
tx_gene_map <- hs_annot[, c("transcript", "ensembl_gene_id")]

summary(hs_annot)
##  ensembl_transcript_id ensembl_gene_id       version     transcript_version
##  Length:227921         Length:227921      Min.   : 1.0   Min.   : 1.00     
##  Class :character      Class :character   1st Qu.: 6.0   1st Qu.: 1.00     
##  Mode  :character      Mode  :character   Median :12.0   Median : 1.00     
##                                           Mean   :10.7   Mean   : 3.08     
##                                           3rd Qu.:16.0   3rd Qu.: 5.00     
##                                           Max.   :29.0   Max.   :17.00     
##                                                                            
##  hgnc_symbol        description        gene_biotype         cds_length    
##  Length:227921      Length:227921      Length:227921      Min.   :     3  
##  Class :character   Class :character   Class :character   1st Qu.:   357  
##  Mode  :character   Mode  :character   Mode  :character   Median :   694  
##                                                           Mean   :  1139  
##                                                           3rd Qu.:  1446  
##                                                           Max.   :107976  
##                                                           NA's   :127343  
##  chromosome_name       strand          start_position      end_position     
##  Length:227921      Length:227921      Min.   :5.77e+02   Min.   :6.47e+02  
##  Class :character   Class :character   1st Qu.:3.11e+07   1st Qu.:3.12e+07  
##  Mode  :character   Mode  :character   Median :6.04e+07   Median :6.06e+07  
##                                        Mean   :7.41e+07   Mean   :7.42e+07  
##                                        3rd Qu.:1.09e+08   3rd Qu.:1.09e+08  
##                                        Max.   :2.49e+08   Max.   :2.49e+08  
##                                                                             
##   transcript       
##  Length:227921     
##  Class :character  
##  Mode  :character  
##                    
##                    
##                    
## 
hs_go <- sm(load_biomart_go()[["go"]])
hs_length <- hs_annot[, c("ensembl_gene_id", "cds_length")]
colnames(hs_length) <- c("ID", "length")

2 Introduction

This document is intended to provide an overview of TMRC3 samples which have been sequenced. It includes some plots and analyses showing the relationships among the samples as well as some differential analyses when possible.

3 Sample Estimation

3.1 Generate expressionsets

The sample sheet is copied from our shared online sheet and updated with each release of sequencing data.

3.1.1 Hisat2 expressionsets

The first thing to note is the large range in coverage. There are multiple samples with coverage which is too low to use. These will be removed shortly.

In the following block I immediately exclude any non-coding reads as well.

## Create the expressionset and immediately pass it to a filter
## removing the non protein coding genes.
sanitize_columns <- c("visitnumber", "clinicaloutcome", "donor",
                      "typeofcells", "clinicalpresentation",
                      "condition", "batch")
hs_expt <- create_expt(samplesheet,
                       file_column = "hg38100hisatfile",
                       savefile = glue::glue("rda/hs_expt_all-v{ver}.rda"),
                       gene_info = hs_annot) %>%
  exclude_genes_expt(column = "gene_biotype", method = "keep",
                     pattern = "protein_coding", meta_column = "ncrna_lost") %>%
  sanitize_expt_metadata(columns = sanitize_columns) %>%
  set_expt_factors(columns = sanitize_columns, class = "factor")
## Reading the sample metadata.
## Dropped 71 rows from the sample metadata because they were blank.
## The sample definitions comprises: 173 rows(samples) and 75 columns(metadata fields).
## Warning in create_expt(samplesheet, file_column = "hg38100hisatfile", savefile =
## glue::glue("rda/hs_expt_all-v{ver}.rda"), : Some samples were removed when cross
## referencing the samples against the count data.
## Matched 21452 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## The final expressionset has 21481 rows and 155 columns.
## Before removal, there were 21481 genes, now there are 19941.
## There are 17 samples which kept less than 90 percent counts.
## TMRC30015 TMRC30017 TMRC30019 TMRC30044 TMRC30045 TMRC30154 TMRC30097 TMRC30075 
##     79.24     85.72     89.75     80.34     73.33     83.20     89.90     86.97 
## TMRC30087 TMRC30101 TMRC30104 TMRC30114 TMRC30127 TMRC30120 TMRC30128 TMRC30131 
##     83.63     88.41     80.29     87.62     89.49     79.16     82.53     86.82 
## TMRC30073 
##     89.26
levels(pData(hs_expt[["expressionset"]])[["visitnumber"]]) <- list(
    '0' = "notapplicable", '1' = 1, '2' = 2, '3' = 3)

Split this data into CDS and lncRNA. Oh crap in order to do that I need to recount the data. Running now (20210518)

## lnc_expt <- create_expt(samplesheet,
##                         file_column = "hg38100lncfile",
##                         gene_info = hs_annot)

3.1.1.1 Initial metrics

Once the data was loaded, there are a couple of metrics which may be plotted immediately.

nonzero <- plot_nonzero(hs_expt)
nonzero$plot
## Warning: ggrepel: 127 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

ncrna_lost_df <- as.data.frame(pData(hs_expt)[["ncrna_lost"]])
rownames(ncrna_lost_df) <- rownames(pData(hs_expt))
colnames(ncrna_lost_df) <- "ncrna_lost"

tmpdf <- merge(nonzero$table, ncrna_lost_df, by = "row.names")
rownames(tmpdf) <- tmpdf[["Row.names"]]
tmpdf[["Row.names"]] <- NULL

ggplot(tmpdf, aes(x=ncrna_lost, y=nonzero_genes)) +
  ggplot2::geom_point() +
  ggplot2::ggtitle("Nonzero genes with respect to percent counts 
lost when ncRNA was removed.")

Najib doesn’t want this plot, but I am using it to check new samples, so will hide it from general use.

libsize <- plot_libsize(hs_expt)
libsize$plot

3.2 Minimum coverage sample filtering

I arbitrarily chose 11,000 non-zero genes as a minimum. We may want this to be higher.

hs_valid <- subset_expt(hs_expt, nonzero = 11000)
## The samples (and read coverage) removed when filtering 11000 non-zero genes are:
## TMRC30010 TMRC30050 TMRC30052 
##     52471    808149   3087347
## subset_expt(): There were 155, now there are 152 samples.
valid_write <- sm(write_expt(hs_valid, excel = glue("excel/hs_valid-v{ver}.xlsx")))

4 Project Aims

The project seeks to determine the relationship of the innate immune response and inflammatory signaling to the clinical outcome of antileishmanial drug treatment. We will test the hypothesis that the profile of innate immune cell activation and their dynamics through the course of treatment differ between CL patients with prospectively determined therapeutic cure or failure.

This will be achieved through the characterization of the in vivo dynamics of blood-derived monocyte, neutrophil and eosinophil transcriptome before, during and at the end of treatment in CL patients. Cell-type specific transcriptomes, composite signatures and time-response expression profiles will be contrasted among patients with therapeutic cure or failure.

4.1 Preparation

To address these, I added to the end of the sample sheet columns named ‘condition’, ‘batch’, ‘donor’, and ‘time’. These are filled in with shorthand values according to the above.

4.2 Global view

Before addressing the questions explicitly by subsetting the data, I want to get a look at the samples as they are.

new_names <- pData(hs_valid)[["samplename"]]
hs_valid <- hs_valid %>%
  set_expt_batches(fact = "cellssource") %>%
  set_expt_conditions(fact = "typeofcells") %>%
  set_expt_samplenames(newnames = new_names)

all_norm <- sm(normalize_expt(hs_valid, transform = "log2", norm = "quant",
                              convert = "cpm", filter = TRUE))

all_pca <- plot_pca(all_norm, plot_labels = FALSE,
                    plot_title = "PCA - Cell type", size_column = "visitnumber")
pp(file = glue("images/tmrc3_pca_nolabels-v{ver}.png"), image = all_pca$plot)

write.csv(all_pca$table, file = "coords/hs_donor_pca_coords.csv")
plot_corheat(all_norm, plot_title = "Heirarchical clustering:
         cell types")$plot

4.3 Examine samples relevant to clinical outcome

Now let us consider only the samples for which we have a clinical outcome. These fall primarily into either ‘cured’ or ‘failed’, but some people have not yet returned to the clinic after the first or second visit. These are deemed ‘lost’.

hs_clinical <- hs_valid %>%
  set_expt_conditions(fact = "clinicaloutcome") %>%
  set_expt_batches(fact = "typeofcells") %>%
  subset_expt(subset = "typeofcells!='pbmcs'&typeofcells!='macrophages'")
## subset_expt(): There were 152, now there are 132 samples.
chosen_colors <- c("#D95F02", "#7570B3", "#1B9E77", "#FF0000", "#FF0000")
names(chosen_colors) <- c("cure", "failure", "lost", "null", "notapplicable")
hs_clinical <- set_expt_colors(hs_clinical, colors = chosen_colors)
## Warning in set_expt_colors(hs_clinical, colors = chosen_colors): Colors for the
## following categories are not being used: nullnotapplicable.
newnames <- make.names(pData(hs_clinical)[["samplename"]], unique = TRUE)
hs_clinical <- set_expt_samplenames(hs_clinical, newnames = newnames)

hs_clinical_norm <- sm(normalize_expt(hs_clinical, filter = TRUE, transform = "log2",
                                      convert = "cpm", norm = "quant"))
clinical_pca <- plot_pca(hs_clinical_norm, plot_labels = FALSE,
                         size_column = "visitnumber", cis = NULL,
                         plot_title = "PCA - clinical samples")
pp(file = glue("images/all_clinical_nobatch_pca-v{ver}.png"), image = clinical_pca$plot,
   height = 8, width = 20)

4.3.1 Repeat without the biopsy samples

hs_clinical_nobiop <- hs_clinical %>%
  subset_expt(subset = "typeofcells!='biopsy'")
## subset_expt(): There were 132, now there are 83 samples.
hs_clinical_nobiop_norm <- sm(normalize_expt(hs_clinical_nobiop, filter = TRUE, transform = "log2",
                                             convert = "cpm", norm = "quant"))
clinical_nobiop_pca <- plot_pca(hs_clinical_nobiop_norm, plot_labels = FALSE, cis = NULL,
                                plot_title = "PCA - clinical samples without biopsies")
pp(file = glue("images/all_clinical_nobiop_nobatch_pca-v{ver}.png"),
   image = clinical_nobiop_pca$plot)

4.3.2 Attempt to correct for the surrogate variables

At this time we have two primary data structures of interest: hs_clinical and hs_clinical_nobiop

hs_clinical_nb <- normalize_expt(hs_clinical, filter = TRUE, batch = "svaseq",
                                 transform = "log2", convert = "cpm")
## Removing 5271 low-count genes (14670 remaining).
## batch_counts: Before batch/surrogate estimation, 122582 entries are x==0: 6%.
## batch_counts: Before batch/surrogate estimation, 355614 entries are 0<x<1: 18%.
## Setting 25766 low elements to zero.
## transform_counts: Found 25766 values equal to 0, adding 1 to the matrix.
clinical_batch_pca <- plot_pca(hs_clinical_nb, plot_labels = FALSE, cis = NULL,
                               size_column = "visitnumber", plot_title = "PCA - clinical samples")
clinical_batch_pca$plot

hs_clinical_nobiop_nb <- sm(normalize_expt(hs_clinical_nobiop, filter = TRUE, batch = "svaseq",
                                           transform = "log2", convert = "cpm"))
clinical_nobiop_batch_pca <- plot_pca(hs_clinical_nobiop_nb,
                                      plot_title = "PCA - clinical samples without biopsies",
                                      plot_labels = FALSE)
pp(file = "images/clinical_batch.png", image = clinical_nobiop_batch_pca$plot)

test <- plot_pca(hs_clinical_nobiop_nb, size_column = "visitnumber",
                 plot_title = "PCA - clinical samples without biopsies",
                 plot_labels = FALSE)
test$plot

clinical_nobiop_batch_tsne <- plot_tsne(hs_clinical_nobiop_nb,
                                        plot_title = "tSNE - clinical samples without biopsies",
                                        plot_labels = FALSE)
clinical_nobiop_batch_tsne$plot

4.3.2.1 Look at remaining variance with variancePartition

test <- simple_varpart(hs_clinical_nobiop)
## 
## Total:102 s
test$partition_plot

4.4 Perform DE of the clinical samples cure vs. fail

individual_celltypes <- subset_expt(hs_clinical_nobiop, subset="condition!='lost'")
## subset_expt(): There were 83, now there are 68 samples.
hs_clinic_de <- sm(all_pairwise(individual_celltypes, model_batch = "svaseq", filter = TRUE))

hs_clinic_table <- sm(combine_de_tables(
    hs_clinic_de,
    excel = glue::glue("excel/individual_celltypes_table-v{ver}.xlsx")))

hs_clinic_sig <- sm(extract_significant_genes(
    hs_clinic_table,
    excel = glue::glue("excel/individual_celltypes_sig-v{ver}.xlsx")))

hs_clinic_sig[["summary_df"]]
##   limma_V1 limma_V2 edger_V1 edger_V2 deseq_V1 deseq_V2 ebseq_V1 ebseq_V2
## 1      183      181      263      213      249      232       96      166
##   basic_V1 basic_V2
## 1       46       26
hs_clinic_de[["comparison"]][["heat"]]
## NULL

4.4.1 Perform LRT with the clinical samples

I am not sure if we have enough samples across the three visit to completely work as well as we would like, but there is only 1 way to find out! Now that I think about it, one thing which might be awesome is to use cell type as an interacting factor…

4.4.1.1 With biopsy samples

I figure this might be a place where the biopsy samples might prove useful.

clinical_nolost <- subset_expt(hs_clinical, subset="condition!='lost'")
## subset_expt(): There were 132, now there are 115 samples.
lrt_visit_clinical_test <- deseq_lrt(clinical_nolost, transform = "vst",
                                     interactor_column = "visitnumber",
                                     interest_column = "clinicaloutcome")
## converting counts to integer mode
## estimating size factors
## estimating dispersions
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## fitting model and testing
## -- replacing outliers and refitting for 276 genes
## -- DESeq argument 'minReplicatesForReplace' = 7 
## -- original counts are preserved in counts(dds)
## estimating dispersions
## fitting model and testing
## Working with 0 genes.
## Error in dimnames(x) <- dn: length of 'dimnames' [2] not equal to array extent
lrt_visit_clinical_test[["favorite_genes"]]
## Error in eval(expr, envir, enclos): object 'lrt_visit_clinical_test' not found
lrt_celltype_clinical_test <- deseq_lrt(clinical_nolost, transform = "vst",
                                        interactor_column = "typeofcells",
                                        interest_column = "clinicaloutcome")
## converting counts to integer mode
## estimating size factors
## estimating dispersions
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## fitting model and testing
## -- replacing outliers and refitting for 53 genes
## -- DESeq argument 'minReplicatesForReplace' = 7 
## -- original counts are preserved in counts(dds)
## estimating dispersions
## fitting model and testing
## Working with 1177 genes.
## Warning: `distinct_()` was deprecated in dplyr 0.7.0.
## Please use `distinct()` instead.
## See vignette('programming') for more help
## Working with 1175 genes after filtering: minc > 3
## Joining, by = "merge"
## Joining, by = "merge"

lrt_celltype_clinical_test[["favorite_genes"]]
##                           genes cluster
## ENSG00000001497 ENSG00000001497       1
## ENSG00000003137 ENSG00000003137       2
## ENSG00000004455 ENSG00000004455       3
## ENSG00000005020 ENSG00000005020       4
## ENSG00000005075 ENSG00000005075       4
## ENSG00000005108 ENSG00000005108       5
## ENSG00000005175 ENSG00000005175       6
## ENSG00000005486 ENSG00000005486       7
## ENSG00000006747 ENSG00000006747       3
## ENSG00000007047 ENSG00000007047       8
## ENSG00000007392 ENSG00000007392       9
## ENSG00000008056 ENSG00000008056      10
## ENSG00000008086 ENSG00000008086      11
## ENSG00000008438 ENSG00000008438      12
## ENSG00000010270 ENSG00000010270       8
## ENSG00000010278 ENSG00000010278       9
## ENSG00000010704 ENSG00000010704      13
## ENSG00000010803 ENSG00000010803      14
## ENSG00000010818 ENSG00000010818      13
## ENSG00000011028 ENSG00000011028      15
## ENSG00000011426 ENSG00000011426       5
## ENSG00000011465 ENSG00000011465      15
## ENSG00000012983 ENSG00000012983       9
## ENSG00000013306 ENSG00000013306      16
## ENSG00000013583 ENSG00000013583      17
## ENSG00000017427 ENSG00000017427      18
## ENSG00000019144 ENSG00000019144       2
## ENSG00000019169 ENSG00000019169      17
## ENSG00000020129 ENSG00000020129       1
## ENSG00000020256 ENSG00000020256       9
## ENSG00000020577 ENSG00000020577       2
## ENSG00000020633 ENSG00000020633      19
## ENSG00000021355 ENSG00000021355      20
## ENSG00000023171 ENSG00000023171      12
## ENSG00000026751 ENSG00000026751       2
## ENSG00000026950 ENSG00000026950      11
## ENSG00000028203 ENSG00000028203       1
## ENSG00000030066 ENSG00000030066       9
## ENSG00000035141 ENSG00000035141       3
## ENSG00000035403 ENSG00000035403      21
## ENSG00000035720 ENSG00000035720       9
## ENSG00000038210 ENSG00000038210       3
## ENSG00000038945 ENSG00000038945       2
## ENSG00000039560 ENSG00000039560       2
## ENSG00000040199 ENSG00000040199       1
## ENSG00000042088 ENSG00000042088       1
## ENSG00000044446 ENSG00000044446      12
## ENSG00000044459 ENSG00000044459      17
## ENSG00000047634 ENSG00000047634      17
## ENSG00000048828 ENSG00000048828       4
## ENSG00000050820 ENSG00000050820      18
## ENSG00000054277 ENSG00000054277      16
## ENSG00000055130 ENSG00000055130      16
## ENSG00000055332 ENSG00000055332      13
## ENSG00000057704 ENSG00000057704       4
## ENSG00000058600 ENSG00000058600      16
## ENSG00000059588 ENSG00000059588       1
## ENSG00000060138 ENSG00000060138      17
## ENSG00000060656 ENSG00000060656       2
## ENSG00000060762 ENSG00000060762      19
## ENSG00000060982 ENSG00000060982       2
## ENSG00000061918 ENSG00000061918       3
## ENSG00000062598 ENSG00000062598      11
## ENSG00000064201 ENSG00000064201      12
## ENSG00000064763 ENSG00000064763      12
## ENSG00000065150 ENSG00000065150       1
## ENSG00000065809 ENSG00000065809       7
## ENSG00000065882 ENSG00000065882       4
## ENSG00000066455 ENSG00000066455       5
## ENSG00000066651 ENSG00000066651       2
## ENSG00000067533 ENSG00000067533       1
## ENSG00000068305 ENSG00000068305       8
## ENSG00000068784 ENSG00000068784      11
## ENSG00000069020 ENSG00000069020       5
## ENSG00000069248 ENSG00000069248       1
## ENSG00000069345 ENSG00000069345       7
## ENSG00000069696 ENSG00000069696      11
## ENSG00000069998 ENSG00000069998      16
## ENSG00000071575 ENSG00000071575      18
## ENSG00000072121 ENSG00000072121      17
## ENSG00000072657 ENSG00000072657       6
## ENSG00000073150 ENSG00000073150       4
## ENSG00000073331 ENSG00000073331      13
## ENSG00000073417 ENSG00000073417      14
## ENSG00000073737 ENSG00000073737      11
## ENSG00000073754 ENSG00000073754       2
## ENSG00000074211 ENSG00000074211       5
## ENSG00000074657 ENSG00000074657       2
## ENSG00000074935 ENSG00000074935       3
## ENSG00000075340 ENSG00000075340      17
## ENSG00000075914 ENSG00000075914       1
## ENSG00000076242 ENSG00000076242       3
## ENSG00000076716 ENSG00000076716       2
## ENSG00000077782 ENSG00000077782       2
## ENSG00000077935 ENSG00000077935      16
## ENSG00000078081 ENSG00000078081      18
## ENSG00000078098 ENSG00000078098      18
## ENSG00000078269 ENSG00000078269      15
## ENSG00000078589 ENSG00000078589      22
## ENSG00000078596 ENSG00000078596       3
## ENSG00000079215 ENSG00000079215       2
## ENSG00000079308 ENSG00000079308       1
## ENSG00000079337 ENSG00000079337       6
## ENSG00000079482 ENSG00000079482      15
## ENSG00000081386 ENSG00000081386       3
## ENSG00000081913 ENSG00000081913      20
## ENSG00000082458 ENSG00000082458       3
## ENSG00000082516 ENSG00000082516       1
## ENSG00000083168 ENSG00000083168       4
## ENSG00000083457 ENSG00000083457      14
## ENSG00000083817 ENSG00000083817       1
## ENSG00000083828 ENSG00000083828       4
## ENSG00000083845 ENSG00000083845       1
## ENSG00000084090 ENSG00000084090       1
## ENSG00000084112 ENSG00000084112       4
## ENSG00000084207 ENSG00000084207      16
## ENSG00000084652 ENSG00000084652       2
## ENSG00000084734 ENSG00000084734      18
## ENSG00000084754 ENSG00000084754      17
## ENSG00000085871 ENSG00000085871       7
## ENSG00000087116 ENSG00000087116      15
## ENSG00000087237 ENSG00000087237       6
## ENSG00000087269 ENSG00000087269      16
## ENSG00000087586 ENSG00000087586       5
## ENSG00000088205 ENSG00000088205      15
## ENSG00000088280 ENSG00000088280       2
## ENSG00000088543 ENSG00000088543       3
## ENSG00000088726 ENSG00000088726       3
## ENSG00000088826 ENSG00000088826       1
## ENSG00000088827 ENSG00000088827      17
## ENSG00000088836 ENSG00000088836       1
## ENSG00000088992 ENSG00000088992      19
## ENSG00000089012 ENSG00000089012      18
## ENSG00000089127 ENSG00000089127       2
## ENSG00000089818 ENSG00000089818       4
## ENSG00000090013 ENSG00000090013      17
## ENSG00000090612 ENSG00000090612       1
## ENSG00000090674 ENSG00000090674       7
## ENSG00000091409 ENSG00000091409       5
## ENSG00000091640 ENSG00000091640      16
## ENSG00000091972 ENSG00000091972       5
## ENSG00000092445 ENSG00000092445       2
## ENSG00000095002 ENSG00000095002       3
## ENSG00000095464 ENSG00000095464       9
## ENSG00000097021 ENSG00000097021       3
## ENSG00000099260 ENSG00000099260       3
## ENSG00000099715 ENSG00000099715      16
## ENSG00000099783 ENSG00000099783       8
## ENSG00000100036 ENSG00000100036      16
## ENSG00000100065 ENSG00000100065       3
## ENSG00000100124 ENSG00000100124       5
## ENSG00000100138 ENSG00000100138       1
## ENSG00000100216 ENSG00000100216      16
## ENSG00000100221 ENSG00000100221       7
## ENSG00000100281 ENSG00000100281      19
## ENSG00000100288 ENSG00000100288       1
## ENSG00000100292 ENSG00000100292      17
## ENSG00000100335 ENSG00000100335      23
## ENSG00000100353 ENSG00000100353      15
## ENSG00000100354 ENSG00000100354       4
## ENSG00000100376 ENSG00000100376      16
## ENSG00000100413 ENSG00000100413      23
## ENSG00000100422 ENSG00000100422       4
## ENSG00000100558 ENSG00000100558       1
## ENSG00000100583 ENSG00000100583      11
## ENSG00000100596 ENSG00000100596       8
## ENSG00000100600 ENSG00000100600      15
## ENSG00000100721 ENSG00000100721       2
## ENSG00000100842 ENSG00000100842      18
## ENSG00000100908 ENSG00000100908       6
## ENSG00000100997 ENSG00000100997       1
## ENSG00000101000 ENSG00000101000       5
## ENSG00000101188 ENSG00000101188      10
## ENSG00000101189 ENSG00000101189      23
## ENSG00000101255 ENSG00000101255      17
## ENSG00000101342 ENSG00000101342       2
## ENSG00000101347 ENSG00000101347      13
## ENSG00000101361 ENSG00000101361       3
## ENSG00000101384 ENSG00000101384       3
## ENSG00000101391 ENSG00000101391      16
## ENSG00000101608 ENSG00000101608       6
## ENSG00000101665 ENSG00000101665      23
## ENSG00000101695 ENSG00000101695       9
## ENSG00000101842 ENSG00000101842       2
## ENSG00000101916 ENSG00000101916      13
## ENSG00000102048 ENSG00000102048       2
## ENSG00000102178 ENSG00000102178      16
## ENSG00000102221 ENSG00000102221      15
## ENSG00000102290 ENSG00000102290      16
## ENSG00000102384 ENSG00000102384       5
## ENSG00000102409 ENSG00000102409       3
## ENSG00000102572 ENSG00000102572       8
## ENSG00000102738 ENSG00000102738       1
## ENSG00000102854 ENSG00000102854      17
## ENSG00000102967 ENSG00000102967      13
## ENSG00000102978 ENSG00000102978      20
## ENSG00000103047 ENSG00000103047      16
## ENSG00000103257 ENSG00000103257       5
## ENSG00000103274 ENSG00000103274      16
## ENSG00000103740 ENSG00000103740       3
## ENSG00000104133 ENSG00000104133      12
## ENSG00000104213 ENSG00000104213       2
## ENSG00000104218 ENSG00000104218      16
## ENSG00000104267 ENSG00000104267       1
## ENSG00000104321 ENSG00000104321       2
## ENSG00000104635 ENSG00000104635       3
## ENSG00000104689 ENSG00000104689      23
## ENSG00000104738 ENSG00000104738       1
## ENSG00000104936 ENSG00000104936       2
## ENSG00000104969 ENSG00000104969       8
## ENSG00000104980 ENSG00000104980      16
## ENSG00000105146 ENSG00000105146       5
## ENSG00000105245 ENSG00000105245      24
## ENSG00000105281 ENSG00000105281      16
## ENSG00000105366 ENSG00000105366       9
## ENSG00000105499 ENSG00000105499       2
## ENSG00000105612 ENSG00000105612      17
## ENSG00000105656 ENSG00000105656       4
## ENSG00000105928 ENSG00000105928       2
## ENSG00000105939 ENSG00000105939      11
## ENSG00000105948 ENSG00000105948       6
## ENSG00000105967 ENSG00000105967      17
## ENSG00000105968 ENSG00000105968      14
## ENSG00000105997 ENSG00000105997      24
## ENSG00000106025 ENSG00000106025       5
## ENSG00000106100 ENSG00000106100      21
## ENSG00000106366 ENSG00000106366       1
## ENSG00000106404 ENSG00000106404      12
## ENSG00000106560 ENSG00000106560       2
## ENSG00000106617 ENSG00000106617       8
## ENSG00000106635 ENSG00000106635      19
## ENSG00000106636 ENSG00000106636       7
## ENSG00000106638 ENSG00000106638      16
## ENSG00000106780 ENSG00000106780       4
## ENSG00000106804 ENSG00000106804      17
## ENSG00000107130 ENSG00000107130       5
## ENSG00000107281 ENSG00000107281       1
## ENSG00000107485 ENSG00000107485       1
## ENSG00000107719 ENSG00000107719       2
## ENSG00000107731 ENSG00000107731       3
## ENSG00000107798 ENSG00000107798       2
## ENSG00000107816 ENSG00000107816       1
## ENSG00000107819 ENSG00000107819      23
## ENSG00000107864 ENSG00000107864       4
## ENSG00000107937 ENSG00000107937       1
## ENSG00000108039 ENSG00000108039      16
## ENSG00000108175 ENSG00000108175       8
## ENSG00000108219 ENSG00000108219      19
## ENSG00000108312 ENSG00000108312      20
## ENSG00000108389 ENSG00000108389      11
## ENSG00000108395 ENSG00000108395       9
## ENSG00000108559 ENSG00000108559       3
## ENSG00000108679 ENSG00000108679       2
## ENSG00000108771 ENSG00000108771      13
## ENSG00000108821 ENSG00000108821       5
## ENSG00000108828 ENSG00000108828       1
## ENSG00000108946 ENSG00000108946       6
## ENSG00000108960 ENSG00000108960       9
## ENSG00000108963 ENSG00000108963      16
## ENSG00000109113 ENSG00000109113      16
## ENSG00000109182 ENSG00000109182       3
## ENSG00000109511 ENSG00000109511      24
## ENSG00000109685 ENSG00000109685       9
## ENSG00000109917 ENSG00000109917      23
## ENSG00000109919 ENSG00000109919       1
## ENSG00000109944 ENSG00000109944       1
## ENSG00000109971 ENSG00000109971       2
## ENSG00000110048 ENSG00000110048       6
## ENSG00000110092 ENSG00000110092       3
## ENSG00000110171 ENSG00000110171      23
## ENSG00000110200 ENSG00000110200      23
## ENSG00000110455 ENSG00000110455      14
## ENSG00000110660 ENSG00000110660       1
## ENSG00000110665 ENSG00000110665      12
## ENSG00000110756 ENSG00000110756       2
## ENSG00000110851 ENSG00000110851       9
## ENSG00000111145 ENSG00000111145      10
## ENSG00000111331 ENSG00000111331      13
## ENSG00000111335 ENSG00000111335       2
## ENSG00000111424 ENSG00000111424      20
## ENSG00000111640 ENSG00000111640      17
## ENSG00000111785 ENSG00000111785       1
## ENSG00000111799 ENSG00000111799       5
## ENSG00000111801 ENSG00000111801       2
## ENSG00000111877 ENSG00000111877      12
## ENSG00000112033 ENSG00000112033       4
## ENSG00000112079 ENSG00000112079       4
## ENSG00000112130 ENSG00000112130       1
## ENSG00000112208 ENSG00000112208      18
## ENSG00000112299 ENSG00000112299      13
## ENSG00000112303 ENSG00000112303      13
## ENSG00000112367 ENSG00000112367       4
## ENSG00000112419 ENSG00000112419      14
## ENSG00000112715 ENSG00000112715      19
## ENSG00000112773 ENSG00000112773      12
## ENSG00000113273 ENSG00000113273      12
## ENSG00000113360 ENSG00000113360       3
## ENSG00000113648 ENSG00000113648       8
## ENSG00000113649 ENSG00000113649      16
## ENSG00000114439 ENSG00000114439      11
## ENSG00000114450 ENSG00000114450       2
## ENSG00000114541 ENSG00000114541       2
## ENSG00000115155 ENSG00000115155      13
## ENSG00000115159 ENSG00000115159      18
## ENSG00000115267 ENSG00000115267      13
## ENSG00000115414 ENSG00000115414       2
## ENSG00000115423 ENSG00000115423      15
## ENSG00000115425 ENSG00000115425      13
## ENSG00000115457 ENSG00000115457       1
## ENSG00000115590 ENSG00000115590      13
## ENSG00000115598 ENSG00000115598      15
## ENSG00000115648 ENSG00000115648      18
## ENSG00000115718 ENSG00000115718      10
## ENSG00000115738 ENSG00000115738      23
## ENSG00000115761 ENSG00000115761       1
## ENSG00000115762 ENSG00000115762      20
## ENSG00000115904 ENSG00000115904      18
## ENSG00000115919 ENSG00000115919      17
## ENSG00000115963 ENSG00000115963       5
## ENSG00000116096 ENSG00000116096       2
## ENSG00000116127 ENSG00000116127       9
## ENSG00000116132 ENSG00000116132       5
## ENSG00000116141 ENSG00000116141       3
## ENSG00000116157 ENSG00000116157       3
## ENSG00000116455 ENSG00000116455       1
## ENSG00000116478 ENSG00000116478      22
## ENSG00000116678 ENSG00000116678       1
## ENSG00000116688 ENSG00000116688       4
## ENSG00000116729 ENSG00000116729      13
## ENSG00000116774 ENSG00000116774       1
## ENSG00000116830 ENSG00000116830       1
## ENSG00000116898 ENSG00000116898      15
## ENSG00000116984 ENSG00000116984       9
## ENSG00000117226 ENSG00000117226       2
## ENSG00000117228 ENSG00000117228      13
## ENSG00000117298 ENSG00000117298       4
## ENSG00000117448 ENSG00000117448       1
## ENSG00000117481 ENSG00000117481      16
## ENSG00000117597 ENSG00000117597       1
## ENSG00000117697 ENSG00000117697      24
## ENSG00000117724 ENSG00000117724       3
## ENSG00000118004 ENSG00000118004       3
## ENSG00000118680 ENSG00000118680       6
## ENSG00000118785 ENSG00000118785       5
## ENSG00000118849 ENSG00000118849      18
## ENSG00000118946 ENSG00000118946      18
## ENSG00000119121 ENSG00000119121      11
## ENSG00000119397 ENSG00000119397      12
## ENSG00000119408 ENSG00000119408      12
## ENSG00000119681 ENSG00000119681       5
## ENSG00000119698 ENSG00000119698      24
## ENSG00000119772 ENSG00000119772       4
## ENSG00000119865 ENSG00000119865      18
## ENSG00000119915 ENSG00000119915       2
## ENSG00000120008 ENSG00000120008      16
## ENSG00000120053 ENSG00000120053       3
## ENSG00000120055 ENSG00000120055       1
## ENSG00000120159 ENSG00000120159       1
## ENSG00000120162 ENSG00000120162       2
## ENSG00000120254 ENSG00000120254      15
## ENSG00000120278 ENSG00000120278      15
## ENSG00000120280 ENSG00000120280       4
## ENSG00000120675 ENSG00000120675       2
## ENSG00000120696 ENSG00000120696       6
## ENSG00000120798 ENSG00000120798       9
## ENSG00000120868 ENSG00000120868       4
## ENSG00000120889 ENSG00000120889      10
## ENSG00000121057 ENSG00000121057       1
## ENSG00000121067 ENSG00000121067      11
## ENSG00000121210 ENSG00000121210       4
## ENSG00000121410 ENSG00000121410      16
## ENSG00000121858 ENSG00000121858      13
## ENSG00000121966 ENSG00000121966      22
## ENSG00000122729 ENSG00000122729       6
## ENSG00000122733 ENSG00000122733       6
## ENSG00000123219 ENSG00000123219       3
## ENSG00000123384 ENSG00000123384      17
## ENSG00000123473 ENSG00000123473       1
## ENSG00000123607 ENSG00000123607      17
## ENSG00000123838 ENSG00000123838      13
## ENSG00000124006 ENSG00000124006       3
## ENSG00000124145 ENSG00000124145       1
## ENSG00000124215 ENSG00000124215       7
## ENSG00000124216 ENSG00000124216      17
## ENSG00000124228 ENSG00000124228      23
## ENSG00000124313 ENSG00000124313      14
## ENSG00000124357 ENSG00000124357       4
## ENSG00000124380 ENSG00000124380       2
## ENSG00000124615 ENSG00000124615      15
## ENSG00000124766 ENSG00000124766      16
## ENSG00000124780 ENSG00000124780      18
## ENSG00000124785 ENSG00000124785       2
## ENSG00000125046 ENSG00000125046      18
## ENSG00000125247 ENSG00000125247      16
## ENSG00000125551 ENSG00000125551      12
## ENSG00000125630 ENSG00000125630       1
## ENSG00000125650 ENSG00000125650       2
## ENSG00000125733 ENSG00000125733       2
## ENSG00000125735 ENSG00000125735       4
## ENSG00000125753 ENSG00000125753       4
## ENSG00000125772 ENSG00000125772       4
## ENSG00000125779 ENSG00000125779       4
## ENSG00000125812 ENSG00000125812       4
## ENSG00000125821 ENSG00000125821       1
## ENSG00000125863 ENSG00000125863       2
## ENSG00000125952 ENSG00000125952      12
## ENSG00000125968 ENSG00000125968      15
## ENSG00000126217 ENSG00000126217      18
## ENSG00000126709 ENSG00000126709      13
## ENSG00000126870 ENSG00000126870       1
## ENSG00000127954 ENSG00000127954      13
## ENSG00000128245 ENSG00000128245      17
## ENSG00000128274 ENSG00000128274      15
## ENSG00000128731 ENSG00000128731       9
## ENSG00000129071 ENSG00000129071       4
## ENSG00000129484 ENSG00000129484       1
## ENSG00000129493 ENSG00000129493      11
## ENSG00000129566 ENSG00000129566       4
## ENSG00000129675 ENSG00000129675      12
## ENSG00000129691 ENSG00000129691       9
## ENSG00000129990 ENSG00000129990       1
## ENSG00000130158 ENSG00000130158       2
## ENSG00000130167 ENSG00000130167       4
## ENSG00000130203 ENSG00000130203       2
## ENSG00000130208 ENSG00000130208       2
## ENSG00000130300 ENSG00000130300       2
## ENSG00000130479 ENSG00000130479       8
## ENSG00000130487 ENSG00000130487       2
## ENSG00000130529 ENSG00000130529       2
## ENSG00000130559 ENSG00000130559      23
## ENSG00000130638 ENSG00000130638       1
## ENSG00000130649 ENSG00000130649       3
## ENSG00000130725 ENSG00000130725       4
## ENSG00000130768 ENSG00000130768      22
## ENSG00000131019 ENSG00000131019       2
## ENSG00000131042 ENSG00000131042       4
## ENSG00000131143 ENSG00000131143      16
## ENSG00000131238 ENSG00000131238      17
## ENSG00000131508 ENSG00000131508      20
## ENSG00000131828 ENSG00000131828       1
## ENSG00000131845 ENSG00000131845       3
## ENSG00000131871 ENSG00000131871       1
## ENSG00000132141 ENSG00000132141       7
## ENSG00000132256 ENSG00000132256       6
## ENSG00000132305 ENSG00000132305       1
## ENSG00000132386 ENSG00000132386       1
## ENSG00000132530 ENSG00000132530      13
## ENSG00000132746 ENSG00000132746       3
## ENSG00000132792 ENSG00000132792      14
## ENSG00000132952 ENSG00000132952       7
## ENSG00000132965 ENSG00000132965       7
## ENSG00000132972 ENSG00000132972       6
## ENSG00000133030 ENSG00000133030       3
## ENSG00000133103 ENSG00000133103       3
## ENSG00000133104 ENSG00000133104       6
## ENSG00000133116 ENSG00000133116       2
## ENSG00000133997 ENSG00000133997      22
## ENSG00000134057 ENSG00000134057       3
## ENSG00000134107 ENSG00000134107      19
## ENSG00000134207 ENSG00000134207      16
## ENSG00000134245 ENSG00000134245       2
## ENSG00000134262 ENSG00000134262       9
## ENSG00000134318 ENSG00000134318      11
## ENSG00000134333 ENSG00000134333      15
## ENSG00000134369 ENSG00000134369       1
## ENSG00000134453 ENSG00000134453      14
## ENSG00000134460 ENSG00000134460       9
## ENSG00000134463 ENSG00000134463      22
## ENSG00000134686 ENSG00000134686       4
## ENSG00000134697 ENSG00000134697       1
## ENSG00000134759 ENSG00000134759       1
## ENSG00000134809 ENSG00000134809       2
## ENSG00000134824 ENSG00000134824       3
## ENSG00000134874 ENSG00000134874      15
## ENSG00000135040 ENSG00000135040       9
## ENSG00000135047 ENSG00000135047       2
## ENSG00000135077 ENSG00000135077       2
## ENSG00000135083 ENSG00000135083      11
## ENSG00000135094 ENSG00000135094      17
## ENSG00000135111 ENSG00000135111       3
## ENSG00000135116 ENSG00000135116      11
## ENSG00000135205 ENSG00000135205      11
## ENSG00000135245 ENSG00000135245      18
## ENSG00000135316 ENSG00000135316      16
## ENSG00000135362 ENSG00000135362      12
## ENSG00000135363 ENSG00000135363      10
## ENSG00000135372 ENSG00000135372       1
## ENSG00000135503 ENSG00000135503      14
## ENSG00000135723 ENSG00000135723       4
## ENSG00000135775 ENSG00000135775      16
## ENSG00000135823 ENSG00000135823      20
## ENSG00000135828 ENSG00000135828       6
## ENSG00000135913 ENSG00000135913       9
## ENSG00000135916 ENSG00000135916       9
## ENSG00000135919 ENSG00000135919       5
## ENSG00000135924 ENSG00000135924       9
## ENSG00000135929 ENSG00000135929      13
## ENSG00000136011 ENSG00000136011       5
## ENSG00000136045 ENSG00000136045       1
## ENSG00000136068 ENSG00000136068       9
## ENSG00000136158 ENSG00000136158       9
## ENSG00000136235 ENSG00000136235       2
## ENSG00000136319 ENSG00000136319       3
## ENSG00000136514 ENSG00000136514       2
## ENSG00000136631 ENSG00000136631       1
## ENSG00000136717 ENSG00000136717      15
## ENSG00000136732 ENSG00000136732      15
## ENSG00000136830 ENSG00000136830      16
## ENSG00000136840 ENSG00000136840      16
## ENSG00000136874 ENSG00000136874      24
## ENSG00000136930 ENSG00000136930       7
## ENSG00000136932 ENSG00000136932       7
## ENSG00000136938 ENSG00000136938      23
## ENSG00000137054 ENSG00000137054       1
## ENSG00000137124 ENSG00000137124       1
## ENSG00000137166 ENSG00000137166      23
## ENSG00000137265 ENSG00000137265       2
## ENSG00000137312 ENSG00000137312       4
## ENSG00000137547 ENSG00000137547       1
## ENSG00000137571 ENSG00000137571      15
## ENSG00000137628 ENSG00000137628      24
## ENSG00000137673 ENSG00000137673      18
## ENSG00000137807 ENSG00000137807       1
## ENSG00000137936 ENSG00000137936       9
## ENSG00000137959 ENSG00000137959      13
## ENSG00000137965 ENSG00000137965      13
## ENSG00000138061 ENSG00000138061      17
## ENSG00000138246 ENSG00000138246      13
## ENSG00000138279 ENSG00000138279      20
## ENSG00000138496 ENSG00000138496       6
## ENSG00000138614 ENSG00000138614       1
## ENSG00000138646 ENSG00000138646      24
## ENSG00000138709 ENSG00000138709       1
## ENSG00000138760 ENSG00000138760       2
## ENSG00000138764 ENSG00000138764      11
## ENSG00000139112 ENSG00000139112       4
## ENSG00000139211 ENSG00000139211       2
## ENSG00000139514 ENSG00000139514       1
## ENSG00000139597 ENSG00000139597       2
## ENSG00000139675 ENSG00000139675       9
## ENSG00000139684 ENSG00000139684       1
## ENSG00000139722 ENSG00000139722       4
## ENSG00000139842 ENSG00000139842      23
## ENSG00000139970 ENSG00000139970      17
## ENSG00000140044 ENSG00000140044       4
## ENSG00000140297 ENSG00000140297      18
## ENSG00000140332 ENSG00000140332       4
## ENSG00000140463 ENSG00000140463      11
## ENSG00000140525 ENSG00000140525       5
## ENSG00000140564 ENSG00000140564       7
## ENSG00000140577 ENSG00000140577      23
## ENSG00000140859 ENSG00000140859       5
## ENSG00000141040 ENSG00000141040       1
## ENSG00000141298 ENSG00000141298       4
## ENSG00000141338 ENSG00000141338       5
## ENSG00000141519 ENSG00000141519      15
## ENSG00000141540 ENSG00000141540      16
## ENSG00000141574 ENSG00000141574      13
## ENSG00000141576 ENSG00000141576       3
## ENSG00000141655 ENSG00000141655       2
## ENSG00000141664 ENSG00000141664      12
## ENSG00000141837 ENSG00000141837       6
## ENSG00000142224 ENSG00000142224      15
## ENSG00000142303 ENSG00000142303      15
## ENSG00000142528 ENSG00000142528      13
## ENSG00000142621 ENSG00000142621       2
## ENSG00000142627 ENSG00000142627       1
## ENSG00000142655 ENSG00000142655      14
## ENSG00000142687 ENSG00000142687      12
## ENSG00000142765 ENSG00000142765      22
## ENSG00000142910 ENSG00000142910      15
## ENSG00000142920 ENSG00000142920       5
## ENSG00000143033 ENSG00000143033      22
## ENSG00000143067 ENSG00000143067      17
## ENSG00000143079 ENSG00000143079       2
## ENSG00000143178 ENSG00000143178      12
## ENSG00000143217 ENSG00000143217       2
## ENSG00000143420 ENSG00000143420       7
## ENSG00000143493 ENSG00000143493       3
## ENSG00000143498 ENSG00000143498       3
## ENSG00000143622 ENSG00000143622       4
## ENSG00000143624 ENSG00000143624      12
## ENSG00000143627 ENSG00000143627      18
## ENSG00000143643 ENSG00000143643       9
## ENSG00000143669 ENSG00000143669       4
## ENSG00000143801 ENSG00000143801       1
## ENSG00000143845 ENSG00000143845       1
## ENSG00000143851 ENSG00000143851      22
## ENSG00000143878 ENSG00000143878      12
## ENSG00000143889 ENSG00000143889       6
## ENSG00000143891 ENSG00000143891      13
## ENSG00000144331 ENSG00000144331       6
## ENSG00000144647 ENSG00000144647      16
## ENSG00000144785 ENSG00000144785       9
## ENSG00000144908 ENSG00000144908      18
## ENSG00000145040 ENSG00000145040       2
## ENSG00000145191 ENSG00000145191       1
## ENSG00000145244 ENSG00000145244      24
## ENSG00000145246 ENSG00000145246       2
## ENSG00000145348 ENSG00000145348       9
## ENSG00000145362 ENSG00000145362       2
## ENSG00000145375 ENSG00000145375       1
## ENSG00000145416 ENSG00000145416      23
## ENSG00000145431 ENSG00000145431      16
## ENSG00000145685 ENSG00000145685       2
## ENSG00000145721 ENSG00000145721       6
## ENSG00000145817 ENSG00000145817       2
## ENSG00000145945 ENSG00000145945       2
## ENSG00000146021 ENSG00000146021       9
## ENSG00000146070 ENSG00000146070       2
## ENSG00000146192 ENSG00000146192      23
## ENSG00000146205 ENSG00000146205      11
## ENSG00000146243 ENSG00000146243       5
## ENSG00000146281 ENSG00000146281       6
## ENSG00000146416 ENSG00000146416       6
## ENSG00000146453 ENSG00000146453       2
## ENSG00000146463 ENSG00000146463      16
## ENSG00000146592 ENSG00000146592      13
## ENSG00000146826 ENSG00000146826       4
## ENSG00000146918 ENSG00000146918       1
## ENSG00000147010 ENSG00000147010       4
## ENSG00000147119 ENSG00000147119      20
## ENSG00000147138 ENSG00000147138       3
## ENSG00000147174 ENSG00000147174       6
## ENSG00000147257 ENSG00000147257       2
## ENSG00000147408 ENSG00000147408       6
## ENSG00000147454 ENSG00000147454       4
## ENSG00000147548 ENSG00000147548       4
## ENSG00000147614 ENSG00000147614      18
## ENSG00000147647 ENSG00000147647       1
## ENSG00000147650 ENSG00000147650       3
## ENSG00000148180 ENSG00000148180      11
## ENSG00000148187 ENSG00000148187       1
## ENSG00000148219 ENSG00000148219      15
## ENSG00000148225 ENSG00000148225      18
## ENSG00000148248 ENSG00000148248      23
## ENSG00000148334 ENSG00000148334      16
## ENSG00000148513 ENSG00000148513      24
## ENSG00000148606 ENSG00000148606       1
## ENSG00000148690 ENSG00000148690       3
## ENSG00000148737 ENSG00000148737      13
## ENSG00000148814 ENSG00000148814      16
## ENSG00000148926 ENSG00000148926      13
## ENSG00000149292 ENSG00000149292       5
## ENSG00000149599 ENSG00000149599       3
## ENSG00000149639 ENSG00000149639      16
## ENSG00000149679 ENSG00000149679       8
## ENSG00000149972 ENSG00000149972       6
## ENSG00000150048 ENSG00000150048      13
## ENSG00000150347 ENSG00000150347       2
## ENSG00000151150 ENSG00000151150      18
## ENSG00000151320 ENSG00000151320      15
## ENSG00000151353 ENSG00000151353       1
## ENSG00000151490 ENSG00000151490      16
## ENSG00000151498 ENSG00000151498       9
## ENSG00000151503 ENSG00000151503       3
## ENSG00000151553 ENSG00000151553      11
## ENSG00000151576 ENSG00000151576      13
## ENSG00000151692 ENSG00000151692      11
## ENSG00000151693 ENSG00000151693       1
## ENSG00000151778 ENSG00000151778       3
## ENSG00000151789 ENSG00000151789       2
## ENSG00000151790 ENSG00000151790       5
## ENSG00000152056 ENSG00000152056       2
## ENSG00000152061 ENSG00000152061      12
## ENSG00000152137 ENSG00000152137      15
## ENSG00000152147 ENSG00000152147       2
## ENSG00000152672 ENSG00000152672      17
## ENSG00000152804 ENSG00000152804      19
## ENSG00000152952 ENSG00000152952       3
## ENSG00000153066 ENSG00000153066      23
## ENSG00000153395 ENSG00000153395       4
## ENSG00000153822 ENSG00000153822      13
## ENSG00000153823 ENSG00000153823      17
## ENSG00000153976 ENSG00000153976       5
## ENSG00000153982 ENSG00000153982       1
## ENSG00000154240 ENSG00000154240       5
## ENSG00000154265 ENSG00000154265       9
## ENSG00000154277 ENSG00000154277      18
## ENSG00000154305 ENSG00000154305      11
## ENSG00000154447 ENSG00000154447       2
## ENSG00000154451 ENSG00000154451      13
## ENSG00000154743 ENSG00000154743       1
## ENSG00000154760 ENSG00000154760       9
## ENSG00000155016 ENSG00000155016       1
## ENSG00000155158 ENSG00000155158      18
## ENSG00000155189 ENSG00000155189       1
## ENSG00000155252 ENSG00000155252      15
## ENSG00000155275 ENSG00000155275      16
## ENSG00000155363 ENSG00000155363      13
## ENSG00000155366 ENSG00000155366       2
## ENSG00000155380 ENSG00000155380       2
## ENSG00000155438 ENSG00000155438       1
## ENSG00000155561 ENSG00000155561       1
## ENSG00000155827 ENSG00000155827       6
## ENSG00000156042 ENSG00000156042      11
## ENSG00000156049 ENSG00000156049       9
## ENSG00000156140 ENSG00000156140      18
## ENSG00000156239 ENSG00000156239       1
## ENSG00000156398 ENSG00000156398      15
## ENSG00000156500 ENSG00000156500      12
## ENSG00000156502 ENSG00000156502      16
## ENSG00000156711 ENSG00000156711      11
## ENSG00000156802 ENSG00000156802       3
## ENSG00000156804 ENSG00000156804       1
## ENSG00000156931 ENSG00000156931      11
## ENSG00000157036 ENSG00000157036      16
## ENSG00000157227 ENSG00000157227       2
## ENSG00000157617 ENSG00000157617       2
## ENSG00000157654 ENSG00000157654       3
## ENSG00000157657 ENSG00000157657       9
## ENSG00000157933 ENSG00000157933       7
## ENSG00000157985 ENSG00000157985      15
## ENSG00000158062 ENSG00000158062      17
## ENSG00000158292 ENSG00000158292       9
## ENSG00000158373 ENSG00000158373       6
## ENSG00000158402 ENSG00000158402       5
## ENSG00000158406 ENSG00000158406       6
## ENSG00000158710 ENSG00000158710       4
## ENSG00000158715 ENSG00000158715      14
## ENSG00000158815 ENSG00000158815      12
## ENSG00000158856 ENSG00000158856       9
## ENSG00000159216 ENSG00000159216      14
## ENSG00000159261 ENSG00000159261       5
## ENSG00000159346 ENSG00000159346       4
## ENSG00000159784 ENSG00000159784      15
## ENSG00000160094 ENSG00000160094      14
## ENSG00000160113 ENSG00000160113       3
## ENSG00000160179 ENSG00000160179       4
## ENSG00000160191 ENSG00000160191      24
## ENSG00000160271 ENSG00000160271      15
## ENSG00000160789 ENSG00000160789       1
## ENSG00000160791 ENSG00000160791       2
## ENSG00000160867 ENSG00000160867       6
## ENSG00000160932 ENSG00000160932      13
## ENSG00000161533 ENSG00000161533      13
## ENSG00000161692 ENSG00000161692      11
## ENSG00000161835 ENSG00000161835      14
## ENSG00000161960 ENSG00000161960       3
## ENSG00000161981 ENSG00000161981       9
## ENSG00000162139 ENSG00000162139      16
## ENSG00000162367 ENSG00000162367       9
## ENSG00000162377 ENSG00000162377      15
## ENSG00000162390 ENSG00000162390       9
## ENSG00000162408 ENSG00000162408      23
## ENSG00000162614 ENSG00000162614       1
## ENSG00000162627 ENSG00000162627       2
## ENSG00000162645 ENSG00000162645      13
## ENSG00000162654 ENSG00000162654      13
## ENSG00000162669 ENSG00000162669      15
## ENSG00000162714 ENSG00000162714      17
## ENSG00000162722 ENSG00000162722      14
## ENSG00000162729 ENSG00000162729       1
## ENSG00000162757 ENSG00000162757       5
## ENSG00000162877 ENSG00000162877      18
## ENSG00000162928 ENSG00000162928       3
## ENSG00000163116 ENSG00000163116       6
## ENSG00000163121 ENSG00000163121      18
## ENSG00000163156 ENSG00000163156       4
## ENSG00000163328 ENSG00000163328      13
## ENSG00000163399 ENSG00000163399      16
## ENSG00000163449 ENSG00000163449       2
## ENSG00000163466 ENSG00000163466       4
## ENSG00000163513 ENSG00000163513      11
## ENSG00000163521 ENSG00000163521      17
## ENSG00000163644 ENSG00000163644      18
## ENSG00000163666 ENSG00000163666       2
## ENSG00000163702 ENSG00000163702      17
## ENSG00000163840 ENSG00000163840      13
## ENSG00000163879 ENSG00000163879       5
## ENSG00000163950 ENSG00000163950       6
## ENSG00000163995 ENSG00000163995      15
## ENSG00000164116 ENSG00000164116       1
## ENSG00000164124 ENSG00000164124      17
## ENSG00000164125 ENSG00000164125      17
## ENSG00000164136 ENSG00000164136      17
## ENSG00000164211 ENSG00000164211      14
## ENSG00000164292 ENSG00000164292       9
## ENSG00000164296 ENSG00000164296       1
## ENSG00000164309 ENSG00000164309       5
## ENSG00000164379 ENSG00000164379      15
## ENSG00000164406 ENSG00000164406       1
## ENSG00000164440 ENSG00000164440       2
## ENSG00000164466 ENSG00000164466       9
## ENSG00000164543 ENSG00000164543      11
## ENSG00000164649 ENSG00000164649       9
## ENSG00000164741 ENSG00000164741       2
## ENSG00000164818 ENSG00000164818      16
## ENSG00000165028 ENSG00000165028       9
## ENSG00000165097 ENSG00000165097       4
## ENSG00000165259 ENSG00000165259      16
## ENSG00000165283 ENSG00000165283       1
## ENSG00000165527 ENSG00000165527      19
## ENSG00000165661 ENSG00000165661      12
## ENSG00000165685 ENSG00000165685      17
## ENSG00000165716 ENSG00000165716       9
## ENSG00000165733 ENSG00000165733       1
## ENSG00000165804 ENSG00000165804      15
## ENSG00000165819 ENSG00000165819      22
## ENSG00000165943 ENSG00000165943       7
## ENSG00000165949 ENSG00000165949       2
## ENSG00000165966 ENSG00000165966       3
## ENSG00000166016 ENSG00000166016      12
## ENSG00000166123 ENSG00000166123       1
## ENSG00000166164 ENSG00000166164      17
## ENSG00000166199 ENSG00000166199       1
## ENSG00000166257 ENSG00000166257      18
## ENSG00000166448 ENSG00000166448       2
## ENSG00000166484 ENSG00000166484      19
## ENSG00000166503 ENSG00000166503       3
## ENSG00000166508 ENSG00000166508      22
## ENSG00000166510 ENSG00000166510       5
## ENSG00000166529 ENSG00000166529       9
## ENSG00000166592 ENSG00000166592      17
## ENSG00000166669 ENSG00000166669      15
## ENSG00000166750 ENSG00000166750       1
## ENSG00000166788 ENSG00000166788       1
## ENSG00000166801 ENSG00000166801      24
## ENSG00000166881 ENSG00000166881       1
## ENSG00000166928 ENSG00000166928      17
## ENSG00000166949 ENSG00000166949      14
## ENSG00000167193 ENSG00000167193      20
## ENSG00000167291 ENSG00000167291      15
## ENSG00000167543 ENSG00000167543       9
## ENSG00000167566 ENSG00000167566      10
## ENSG00000167680 ENSG00000167680      15
## ENSG00000167772 ENSG00000167772       2
## ENSG00000167858 ENSG00000167858      24
## ENSG00000167925 ENSG00000167925       8
## ENSG00000167994 ENSG00000167994      15
## ENSG00000167995 ENSG00000167995      13
## ENSG00000168016 ENSG00000168016      11
## ENSG00000168038 ENSG00000168038       4
## ENSG00000168209 ENSG00000168209       7
## ENSG00000168256 ENSG00000168256      17
## ENSG00000168264 ENSG00000168264      19
## ENSG00000168268 ENSG00000168268       1
## ENSG00000168273 ENSG00000168273      16
## ENSG00000168421 ENSG00000168421       9
## ENSG00000168439 ENSG00000168439       2
## ENSG00000168569 ENSG00000168569       1
## ENSG00000168679 ENSG00000168679      11
## ENSG00000168685 ENSG00000168685       2
## ENSG00000168795 ENSG00000168795       3
## ENSG00000168961 ENSG00000168961       8
## ENSG00000168994 ENSG00000168994       2
## ENSG00000169047 ENSG00000169047       1
## ENSG00000169239 ENSG00000169239      23
## ENSG00000169432 ENSG00000169432       6
## ENSG00000169499 ENSG00000169499      12
## ENSG00000169860 ENSG00000169860       1
## ENSG00000169871 ENSG00000169871       6
## ENSG00000169908 ENSG00000169908       5
## ENSG00000169919 ENSG00000169919      23
## ENSG00000169946 ENSG00000169946       5
## ENSG00000170027 ENSG00000170027       2
## ENSG00000170037 ENSG00000170037      16
## ENSG00000170175 ENSG00000170175      18
## ENSG00000170234 ENSG00000170234      11
## ENSG00000170298 ENSG00000170298       9
## ENSG00000170370 ENSG00000170370      18
## ENSG00000170458 ENSG00000170458      10
## ENSG00000170473 ENSG00000170473       1
## ENSG00000170558 ENSG00000170558       6
## ENSG00000170581 ENSG00000170581      13
## ENSG00000170677 ENSG00000170677      16
## ENSG00000170989 ENSG00000170989       9
## ENSG00000171100 ENSG00000171100      12
## ENSG00000171126 ENSG00000171126      15
## ENSG00000171135 ENSG00000171135       2
## ENSG00000171208 ENSG00000171208      16
## ENSG00000171262 ENSG00000171262       3
## ENSG00000171365 ENSG00000171365      17
## ENSG00000171403 ENSG00000171403      18
## ENSG00000171604 ENSG00000171604      17
## ENSG00000171617 ENSG00000171617      14
## ENSG00000171729 ENSG00000171729      15
## ENSG00000171812 ENSG00000171812      17
## ENSG00000171877 ENSG00000171877       3
## ENSG00000172123 ENSG00000172123      21
## ENSG00000172159 ENSG00000172159      13
## ENSG00000172331 ENSG00000172331       6
## ENSG00000172403 ENSG00000172403      18
## ENSG00000172428 ENSG00000172428      16
## ENSG00000172594 ENSG00000172594       2
## ENSG00000172716 ENSG00000172716       2
## ENSG00000172794 ENSG00000172794      12
## ENSG00000172828 ENSG00000172828       1
## ENSG00000172888 ENSG00000172888       9
## ENSG00000172893 ENSG00000172893       3
## ENSG00000173124 ENSG00000173124      18
## ENSG00000173156 ENSG00000173156       2
## ENSG00000173166 ENSG00000173166      17
## ENSG00000173198 ENSG00000173198      12
## ENSG00000173391 ENSG00000173391      14
## ENSG00000173409 ENSG00000173409       1
## ENSG00000173457 ENSG00000173457       1
## ENSG00000173511 ENSG00000173511       3
## ENSG00000173530 ENSG00000173530      17
## ENSG00000173801 ENSG00000173801       1
## ENSG00000173818 ENSG00000173818      23
## ENSG00000173917 ENSG00000173917       2
## ENSG00000173947 ENSG00000173947       1
## ENSG00000174177 ENSG00000174177      14
## ENSG00000174197 ENSG00000174197       9
## ENSG00000174236 ENSG00000174236       3
## ENSG00000174238 ENSG00000174238      20
## ENSG00000174371 ENSG00000174371       3
## ENSG00000174442 ENSG00000174442       3
## ENSG00000174705 ENSG00000174705       2
## ENSG00000174943 ENSG00000174943      12
## ENSG00000174989 ENSG00000174989       9
## ENSG00000175130 ENSG00000175130       7
## ENSG00000175414 ENSG00000175414       2
## ENSG00000175544 ENSG00000175544       1
## ENSG00000175691 ENSG00000175691       3
## ENSG00000175899 ENSG00000175899       2
## ENSG00000176105 ENSG00000176105       3
## ENSG00000176125 ENSG00000176125      18
## ENSG00000176148 ENSG00000176148      14
## ENSG00000176903 ENSG00000176903       3
## ENSG00000177119 ENSG00000177119      16
## ENSG00000177294 ENSG00000177294      13
## ENSG00000177311 ENSG00000177311       3
## ENSG00000177380 ENSG00000177380       2
## ENSG00000177409 ENSG00000177409       6
## ENSG00000177469 ENSG00000177469       1
## ENSG00000177479 ENSG00000177479      23
## ENSG00000177627 ENSG00000177627       2
## ENSG00000177646 ENSG00000177646       1
## ENSG00000177917 ENSG00000177917      11
## ENSG00000177989 ENSG00000177989      13
## ENSG00000178105 ENSG00000178105       1
## ENSG00000178209 ENSG00000178209      23
## ENSG00000178338 ENSG00000178338       1
## ENSG00000178573 ENSG00000178573       2
## ENSG00000178685 ENSG00000178685       4
## ENSG00000178700 ENSG00000178700      18
## ENSG00000178726 ENSG00000178726      13
## ENSG00000178741 ENSG00000178741      16
## ENSG00000178896 ENSG00000178896      20
## ENSG00000178982 ENSG00000178982      16
## ENSG00000179044 ENSG00000179044      13
## ENSG00000179144 ENSG00000179144       2
## ENSG00000179262 ENSG00000179262      23
## ENSG00000179271 ENSG00000179271       1
## ENSG00000179409 ENSG00000179409       1
## ENSG00000179455 ENSG00000179455       1
## ENSG00000179776 ENSG00000179776       2
## ENSG00000179889 ENSG00000179889       9
## ENSG00000179988 ENSG00000179988       9
## ENSG00000180044 ENSG00000180044       3
## ENSG00000180251 ENSG00000180251       6
## ENSG00000180376 ENSG00000180376       9
## ENSG00000180537 ENSG00000180537       3
## ENSG00000180543 ENSG00000180543       1
## ENSG00000180628 ENSG00000180628       4
## ENSG00000181038 ENSG00000181038      22
## ENSG00000181045 ENSG00000181045      17
## ENSG00000181218 ENSG00000181218      17
## ENSG00000181350 ENSG00000181350       1
## ENSG00000181392 ENSG00000181392      11
## ENSG00000181409 ENSG00000181409      13
## ENSG00000181523 ENSG00000181523      17
## ENSG00000181852 ENSG00000181852      19
## ENSG00000181873 ENSG00000181873      16
## ENSG00000181929 ENSG00000181929       6
## ENSG00000182158 ENSG00000182158       9
## ENSG00000182173 ENSG00000182173       9
## ENSG00000182179 ENSG00000182179      12
## ENSG00000182183 ENSG00000182183      22
## ENSG00000182240 ENSG00000182240       9
## ENSG00000182263 ENSG00000182263       5
## ENSG00000182378 ENSG00000182378       1
## ENSG00000182379 ENSG00000182379       2
## ENSG00000182504 ENSG00000182504      24
## ENSG00000182557 ENSG00000182557      14
## ENSG00000182901 ENSG00000182901      20
## ENSG00000182952 ENSG00000182952      24
## ENSG00000182973 ENSG00000182973      11
## ENSG00000182986 ENSG00000182986       1
## ENSG00000183044 ENSG00000183044      12
## ENSG00000183087 ENSG00000183087       2
## ENSG00000183091 ENSG00000183091       6
## ENSG00000183117 ENSG00000183117       2
## ENSG00000183172 ENSG00000183172      16
## ENSG00000183185 ENSG00000183185      15
## ENSG00000183283 ENSG00000183283       4
## ENSG00000183421 ENSG00000183421       5
## ENSG00000183431 ENSG00000183431       7
## ENSG00000183527 ENSG00000183527       1
## ENSG00000183569 ENSG00000183569      14
## ENSG00000183578 ENSG00000183578       2
## ENSG00000183617 ENSG00000183617      16
## ENSG00000183647 ENSG00000183647       3
## ENSG00000183762 ENSG00000183762      13
## ENSG00000183763 ENSG00000183763       3
## ENSG00000183785 ENSG00000183785      21
## ENSG00000183801 ENSG00000183801       1
## ENSG00000183853 ENSG00000183853      15
## ENSG00000183943 ENSG00000183943      14
## ENSG00000183955 ENSG00000183955       7
## ENSG00000184060 ENSG00000184060      17
## ENSG00000184113 ENSG00000184113       3
## ENSG00000184384 ENSG00000184384      13
## ENSG00000184402 ENSG00000184402      11
## ENSG00000184787 ENSG00000184787      16
## ENSG00000184831 ENSG00000184831       5
## ENSG00000184898 ENSG00000184898      24
## ENSG00000184979 ENSG00000184979      21
## ENSG00000185024 ENSG00000185024      14
## ENSG00000185033 ENSG00000185033      13
## ENSG00000185043 ENSG00000185043       7
## ENSG00000185477 ENSG00000185477      15
## ENSG00000185480 ENSG00000185480       3
## ENSG00000185561 ENSG00000185561       5
## ENSG00000185614 ENSG00000185614       3
## ENSG00000185650 ENSG00000185650      13
## ENSG00000185669 ENSG00000185669       4
## ENSG00000185686 ENSG00000185686       3
## ENSG00000185736 ENSG00000185736       6
## ENSG00000185842 ENSG00000185842       6
## ENSG00000186193 ENSG00000186193      16
## ENSG00000186197 ENSG00000186197       5
## ENSG00000186281 ENSG00000186281       1
## ENSG00000186470 ENSG00000186470      24
## ENSG00000186818 ENSG00000186818      15
## ENSG00000186951 ENSG00000186951      14
## ENSG00000187079 ENSG00000187079       5
## ENSG00000187097 ENSG00000187097       9
## ENSG00000187105 ENSG00000187105       9
## ENSG00000187166 ENSG00000187166       8
## ENSG00000187210 ENSG00000187210       9
## ENSG00000187231 ENSG00000187231      13
## ENSG00000187566 ENSG00000187566       1
## ENSG00000187569 ENSG00000187569      24
## ENSG00000187758 ENSG00000187758       3
## ENSG00000187808 ENSG00000187808      17
## ENSG00000187997 ENSG00000187997       3
## ENSG00000188037 ENSG00000188037      10
## ENSG00000188452 ENSG00000188452      11
## ENSG00000188554 ENSG00000188554       6
## ENSG00000188636 ENSG00000188636      16
## ENSG00000188672 ENSG00000188672      24
## ENSG00000188886 ENSG00000188886      13
## ENSG00000188921 ENSG00000188921      12
## ENSG00000188938 ENSG00000188938      20
## ENSG00000189001 ENSG00000189001       5
## ENSG00000189013 ENSG00000189013      15
## ENSG00000189067 ENSG00000189067      20
## ENSG00000189077 ENSG00000189077       4
## ENSG00000189159 ENSG00000189159      22
## ENSG00000189195 ENSG00000189195      24
## ENSG00000189337 ENSG00000189337       6
## ENSG00000189420 ENSG00000189420      19
## ENSG00000196072 ENSG00000196072       4
## ENSG00000196081 ENSG00000196081       3
## ENSG00000196123 ENSG00000196123      17
## ENSG00000196126 ENSG00000196126      16
## ENSG00000196141 ENSG00000196141      18
## ENSG00000196199 ENSG00000196199      11
## ENSG00000196247 ENSG00000196247       6
## ENSG00000196305 ENSG00000196305       1
## ENSG00000196358 ENSG00000196358       4
## ENSG00000196369 ENSG00000196369      13
## ENSG00000196378 ENSG00000196378      14
## ENSG00000196388 ENSG00000196388       1
## ENSG00000196405 ENSG00000196405       9
## ENSG00000196526 ENSG00000196526       3
## ENSG00000196549 ENSG00000196549      13
## ENSG00000196597 ENSG00000196597      18
## ENSG00000196652 ENSG00000196652       6
## ENSG00000196872 ENSG00000196872       6
## ENSG00000196923 ENSG00000196923       4
## ENSG00000196943 ENSG00000196943      14
## ENSG00000197008 ENSG00000197008       5
## ENSG00000197093 ENSG00000197093       6
## ENSG00000197122 ENSG00000197122      16
## ENSG00000197124 ENSG00000197124      15
## ENSG00000197283 ENSG00000197283       9
## ENSG00000197451 ENSG00000197451      16
## ENSG00000197461 ENSG00000197461       3
## ENSG00000197557 ENSG00000197557       5
## ENSG00000197603 ENSG00000197603       1
## ENSG00000197653 ENSG00000197653      22
## ENSG00000197766 ENSG00000197766      12
## ENSG00000197782 ENSG00000197782       3
## ENSG00000197857 ENSG00000197857      22
## ENSG00000197992 ENSG00000197992       6
## ENSG00000198056 ENSG00000198056       3
## ENSG00000198133 ENSG00000198133      14
## ENSG00000198178 ENSG00000198178      24
## ENSG00000198286 ENSG00000198286       1
## ENSG00000198393 ENSG00000198393      14
## ENSG00000198612 ENSG00000198612       1
## ENSG00000198624 ENSG00000198624       8
## ENSG00000198690 ENSG00000198690       4
## ENSG00000198700 ENSG00000198700      16
## ENSG00000198795 ENSG00000198795       5
## ENSG00000198805 ENSG00000198805      16
## ENSG00000198829 ENSG00000198829      18
## ENSG00000198959 ENSG00000198959       2
## ENSG00000203546 ENSG00000203546       1
## ENSG00000203814 ENSG00000203814      13
## ENSG00000204103 ENSG00000204103      17
## ENSG00000204388 ENSG00000204388       2
## ENSG00000204389 ENSG00000204389       6
## ENSG00000204520 ENSG00000204520       6
## ENSG00000204568 ENSG00000204568       1
## ENSG00000204590 ENSG00000204590      20
## ENSG00000204869 ENSG00000204869      18
## ENSG00000204920 ENSG00000204920       6
## ENSG00000204991 ENSG00000204991      18
## ENSG00000205038 ENSG00000205038       3
## ENSG00000205060 ENSG00000205060       1
## ENSG00000205090 ENSG00000205090      11
## ENSG00000205362 ENSG00000205362      18
## ENSG00000205420 ENSG00000205420      15
## ENSG00000205639 ENSG00000205639      14
## ENSG00000205730 ENSG00000205730      15
## ENSG00000205937 ENSG00000205937      19
## ENSG00000213588 ENSG00000213588       1
## ENSG00000213859 ENSG00000213859       3
## ENSG00000213923 ENSG00000213923       3
## ENSG00000214872 ENSG00000214872       4
## ENSG00000215788 ENSG00000215788       2
## ENSG00000219481 ENSG00000219481       9
## ENSG00000221963 ENSG00000221963      13
## ENSG00000222009 ENSG00000222009      20
## ENSG00000223609 ENSG00000223609      18
## ENSG00000225921 ENSG00000225921       1
## ENSG00000227051 ENSG00000227051      18
## ENSG00000235750 ENSG00000235750      13
## ENSG00000239920 ENSG00000239920      11
## ENSG00000240021 ENSG00000240021       1
## ENSG00000240445 ENSG00000240445       5
## ENSG00000241058 ENSG00000241058       9
## ENSG00000244165 ENSG00000244165      16
## ENSG00000244242 ENSG00000244242       4
## ENSG00000244405 ENSG00000244405      15
## ENSG00000248405 ENSG00000248405      24
## ENSG00000249242 ENSG00000249242       3
## ENSG00000250264 ENSG00000250264       4
## ENSG00000254827 ENSG00000254827      17
## ENSG00000254979 ENSG00000254979      19
## ENSG00000256043 ENSG00000256043      16
## ENSG00000256235 ENSG00000256235      14
## ENSG00000257335 ENSG00000257335       4
## ENSG00000259330 ENSG00000259330      23
## ENSG00000260861 ENSG00000260861       4
## ENSG00000261652 ENSG00000261652      18
## ENSG00000261832 ENSG00000261832      12
## ENSG00000263001 ENSG00000263001      23
## ENSG00000263528 ENSG00000263528      17
## ENSG00000263715 ENSG00000263715       1
## ENSG00000266028 ENSG00000266028      13
## ENSG00000266338 ENSG00000266338       1
## ENSG00000266412 ENSG00000266412      13
## ENSG00000266524 ENSG00000266524       1
## ENSG00000268182 ENSG00000268182       9
## ENSG00000268350 ENSG00000268350      15
## ENSG00000273559 ENSG00000273559       4
## ENSG00000273802 ENSG00000273802      24
## ENSG00000275895 ENSG00000275895       7
## ENSG00000276023 ENSG00000276023       5
## ENSG00000277075 ENSG00000277075       6
## ENSG00000277224 ENSG00000277224      11
## ENSG00000278599 ENSG00000278599       4
## ENSG00000282988 ENSG00000282988       6
## ENSG00000283149 ENSG00000283149      15
## ENSG00000283977 ENSG00000283977      19
## ENSG00000285253 ENSG00000285253       1
## ENSG00000285708 ENSG00000285708      12
## ENSG00000286239 ENSG00000286239      13
## ENSG00000286261 ENSG00000286261       9

4.4.2 Look at only the differential genes

A good suggestion from Theresa was to examine only the most variant genes from failure vs. cure and see how they change the clustering/etc results. This is my attempt to address this query.

hs_clinic_topn <- sm(extract_significant_genes(hs_clinic_table, n = 100))
table <- "failure_vs_cure"
wanted <- rbind(hs_clinic_topn[["deseq"]][["ups"]][[table]],
                hs_clinic_topn[["deseq"]][["downs"]][[table]])

small_expt <- exclude_genes_expt(hs_clinical_nobiop, ids = rownames(wanted), method = "keep")
## Before removal, there were 19941 genes, now there are 200.
## There are 83 samples which kept less than 90 percent counts.
##  X1017n1  X1017m1  X1034n1  X1034n2  X1034m2 X1034m2.  X2052e1  X2052m2 
##   0.4344   0.4209   2.3933   2.8302   1.3082   1.2597   0.6909   0.6058 
##  X2052n2  X2052m3  X2052n3  X2065m1  X2065n1  X2066m1  X2066n1  X2065m2 
##   1.3510   0.6899   1.1861   1.1063   3.1233   0.4222   0.7710   0.6235 
##  X2065n2  X2065e2  X2066m2  X2066n2  X2066e2  X2068m1  X2068n1  X2068e1 
##   0.8864   1.3413   0.5375   0.9750   1.1821   0.5670   0.8161   1.3970 
##  X2072m1  X2072n1  X2072e1  X2071m1  X2071n1  X2073m1  X2073n1  X2073e1 
##   0.5170   0.6085   0.8754   0.7574   1.7531   0.6883   1.8493   0.9073 
##  X2068m2  X2068n2  X2068e2  X2072m2  X2072n2  X2072e2  X2073m2  X2073n2 
##   0.3942   0.5760   0.8514   0.4248   0.5737   0.6222   1.0724   2.7964 
##  X2073e2  X2066m3  X2066n3  X2066e3  X2065e3  X2068m3  X2068n3  X2068e3 
##   0.8723   0.4794   0.6782   0.6991   0.6026   0.4552   0.7345   0.8428 
##  X2072m3  X2072n3  X2072e3  X2073m3  X2073n3  X2073e3  X2162m1  X2162n1 
##   0.7395   1.9132   0.8600   0.5342   0.7511   0.6015   0.4937   0.6971 
##  X2162e1  X2162n2  X2162e2  X2162n3  X2162e3  X2167m1  X2167n1  X2167e1 
##   1.0733   0.9258   1.1809   0.7148   0.7263   0.6428   0.9420   1.3436 
##  X2168m1  X2168n1  X2168e1  X2168m2  X2168n2  X2168e2  X2167m2  X2167n3 
##   1.0901   2.2668   1.1321   0.9822   2.2914   0.9692   0.4135   1.4135 
##  X2167e3  X2168m3  X2168n3  X2168e3  X2172n1  X2172e1  X1168m1  X1168n1 
##   1.4795   1.3873   3.6918   1.1862   0.3999   0.5349   0.7780   1.3948 
##  X1168m2  X1168e2  X1168n3 
##   0.7665   0.5925   0.9169
small_norm <- sm(normalize_expt(small_expt, transform = "log2", convert = "cpm",
                                norm = "quant", filter = TRUE))
plot_pca(small_norm)$plot
## Warning: ggrepel: 21 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

small_nb <- normalize_expt(small_expt, transform = "log2", convert = "cpm",
                           batch = "svaseq", norm = "quant", filter = TRUE)
## Warning in normalize_expt(small_expt, transform = "log2", convert = "cpm", :
## Quantile normalization and sva do not always play well together.
## Removing 0 low-count genes (200 remaining).
## batch_counts: Before batch/surrogate estimation, 1 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 894 entries are 0<x<1: 5%.
## Setting 801 low elements to zero.
## transform_counts: Found 801 values equal to 0, adding 1 to the matrix.
plot_pca(small_nb)$plot
## Warning: ggrepel: 79 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

## DESeq2 MA plot of failure / cure
hs_clinic_table[["plots"]][["failure_vs_cure"]][["deseq_ma_plots"]]$plot

## DESeq2 Volcano plot of failure / cure
hs_clinic_table[["plots"]][["failure_vs_cure"]][["deseq_vol_plots"]]$plot

4.4.3 g:Profiler results using the significant up and down genes

ups <- hs_clinic_sig[["deseq"]][["ups"]][[1]]
downs <- hs_clinic_sig[["deseq"]][["downs"]][[1]]

hs_clinic_gprofiler_ups <- simple_gprofiler(ups)
## Performing gProfiler GO search of 249 genes against hsapiens.
## GO search found 106 hits.
## Performing gProfiler KEGG search of 249 genes against hsapiens.
## KEGG search found 10 hits.
## Performing gProfiler REAC search of 249 genes against hsapiens.
## REAC search found 10 hits.
## Performing gProfiler MI search of 249 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 249 genes against hsapiens.
## TF search found 55 hits.
## Performing gProfiler CORUM search of 249 genes against hsapiens.
## CORUM search found 1 hits.
## Performing gProfiler HP search of 249 genes against hsapiens.
## HP search found 0 hits.
hs_clinic_gprofiler_ups[["pvalue_plots"]][["bpp_plot_over"]]

hs_clinic_gprofiler_ups[["pvalue_plots"]][["mfp_plot_over"]]

hs_clinic_gprofiler_ups[["pvalue_plots"]][["reactome_plot_over"]]

##hs_try2 <- simple_gprofiler2(ups)

hs_clinic_gprofiler_downs <- simple_gprofiler(downs)
## Performing gProfiler GO search of 232 genes against hsapiens.
## GO search found 58 hits.
## Performing gProfiler KEGG search of 232 genes against hsapiens.
## KEGG search found 8 hits.
## Performing gProfiler REAC search of 232 genes against hsapiens.
## REAC search found 5 hits.
## Performing gProfiler MI search of 232 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 232 genes against hsapiens.
## TF search found 11 hits.
## Performing gProfiler CORUM search of 232 genes against hsapiens.
## CORUM search found 0 hits.
## Performing gProfiler HP search of 232 genes against hsapiens.
## HP search found 2 hits.
hs_clinic_gprofiler_downs[["pvalue_plots"]][["bpp_plot_over"]]

hs_clinic_gprofiler_downs[["pvalue_plots"]][["mfp_plot_over"]]

hs_clinic_gprofiler_downs[["pvalue_plots"]][["reactome_plot_over"]]

4.5 Perform GSVA on the clinical samples

hs_celltype_gsva_c2 <- sm(simple_gsva(individual_celltypes))
hs_celltype_gsva_c2_sig <- sm(get_sig_gsva_categories(
    hs_celltype_gsva_c2,
    excel = "excel/individual_celltypes_gsva_c2.xlsx"))

broad_c7 <- GSEABase::getGmt("reference/msigdb/c7.all.v7.2.entrez.gmt",
                             collectionType = GSEABase::BroadCollection(category = "c7"),
                             geneIdType = GSEABase::EntrezIdentifier())
hs_celltype_gsva_c7 <- sm(simple_gsva(individual_celltypes, signatures = broad_c7,
                                      msig_xml = "reference/msigdb_v7.2.xml", cores = 10))
hs_celltype_gsva_c7_sig <- sm(get_sig_gsva_categories(
    hs_celltype_gsva_c7,
    excel = "excel/individual_celltypes_gsva_c7.xlsx"))

5 Individual Cell types

The following blocks split the samples into a few groups by sample type and look at the distributions between them.

5.1 Implementation details

Get top/bottom n genes for each cell type, using clinical outcome as the factor of interest. For the moment, use sva for the DE analysis. Provide cpms for the top/bottom n genes.

Start with top/bottom 200. Perform default logFC and p-value as well.

5.1.1 Shared contrasts

Here is the contrast we will use throughput, I am leaving open the option to add more.

keepers <- list(
  "fail_vs_cure" = c("failure", "cure"))

5.2 Monocytes

5.2.1 Evaluate Monocyte samples

mono <- subset_expt(hs_valid, subset = "typeofcells=='monocytes'") %>%
  set_expt_conditions(fact = "clinicaloutcome") %>%
  set_expt_batches(fact = "donor") %>%
  set_expt_colors(colors = chosen_colors)
## subset_expt(): There were 152, now there are 28 samples.
## Warning in set_expt_colors(., colors = chosen_colors): Colors for the following
## categories are not being used: nullnotapplicable.
## FIXME set_expt_colors should speak up if there are mismatches here!!!

save_result <- save(mono, file = "rda/monocyte_expt.rda")
mono_norm <- normalize_expt(mono, convert = "cpm", filter = TRUE,
                            transform = "log2", norm = "quant")
## Removing 8906 low-count genes (11035 remaining).
## transform_counts: Found 9 values equal to 0, adding 1 to the matrix.
plt <- plot_pca(mono_norm, plot_labels = FALSE)$plot
pp(file = glue("images/mono_pca_normalized-v{ver}.pdf"), image = plt)

mono_nb <- normalize_expt(mono, convert = "cpm", filter = TRUE,
                          transform = "log2", batch = "svaseq")
## Removing 8906 low-count genes (11035 remaining).
## batch_counts: Before batch/surrogate estimation, 1433 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 18423 entries are 0<x<1: 6%.
## Setting 512 low elements to zero.
## transform_counts: Found 512 values equal to 0, adding 1 to the matrix.
plt <- plot_pca(mono_nb, plot_labels = FALSE)$plot
pp(file = glue("images/mono_pca_normalized_batch-v{ver}.pdf"), image = plt)

5.2.2 DE of Monocyte samples

5.2.2.1 Without sva

mono_de <- sm(all_pairwise(mono, model_batch = FALSE, filter = TRUE))
mono_tables <- sm(combine_de_tables(
    mono_de, keepers = keepers,
    excel = glue::glue("excel/monocyte_clinical_all_tables-v{ver}.xlsx")))
written <- write_xlsx(data = mono_tables[["data"]][[1]],
                      excel = glue::glue("excel/monocyte_clinical_table-v{ver}.xlsx"))
mono_sig <- sm(extract_significant_genes(mono_tables, according_to = "deseq"))
written <- write_xlsx(data = mono_sig[["deseq"]][["ups"]][[1]],
                      excel = glue::glue("excel/monocyte_clinical_sigup-v{ver}.xlsx"))
written <- write_xlsx(data = mono_sig[["deseq"]][["downs"]][[1]],
                      excel = glue::glue("excel/monocyte_clinical_sigdown-v{ver}.xlsx"))

mono_pct_sig <- sm(extract_significant_genes(mono_tables, n = 200,
                                             lfc = NULL, p = NULL, according_to = "deseq"))
written <- write_xlsx(data = mono_pct_sig[["deseq"]][["ups"]][[1]],
                      excel = glue::glue("excel/monocyte_clinical_sigup_pct-v{ver}.xlsx"))
written <- write_xlsx(data = mono_pct_sig[["deseq"]][["downs"]][[1]],
                      excel = glue::glue("excel/monocyte_clinical_sigdown_pct-v{ver}.xlsx"))
mono_sig$summary_df
## data frame with 0 columns and 1 row
## Print out a table of the cpm values for other explorations.
mono_cpm <- sm(normalize_expt(mono, convert = "cpm"))
written <- write_xlsx(data = exprs(mono_cpm),
                      excel = glue::glue("excel/monocyte_cpm_before_batch-v{ver}.xlsx"))
mono_bcpm <- sm(normalize_expt(mono, filter = TRUE, convert = "cpm", batch = "svaseq"))
written <- write_xlsx(data = exprs(mono_bcpm),
                      excel = glue::glue("excel/monocyte_cpm_after_batch-v{ver}.xlsx"))

5.2.2.2 With sva

mono_de_sva <- sm(all_pairwise(mono, model_batch = "svaseq", filter = TRUE))
mono_tables_sva <- sm(combine_de_tables(
    mono_de_sva, keepers = keepers,
    excel = glue::glue("excel/monocyte_clinical_all_tables_sva-v{ver}.xlsx")))
mono_sig_sva <- sm(extract_significant_genes(
    mono_tables_sva,
    excel = glue::glue("excel/monocyte_clinical_sig_tables_sva-v{ver}.xlsx"),
    according_to = "deseq"))

5.2.2.3 Monocyte DE plots

First print out the DE plots without and then with sva estimates.

## DESeq2 MA plot of failure / cure
mono_tables[["plots"]][["fail_vs_cure"]][["deseq_ma_plots"]]$plot

## DESeq2 Volcano plot of failure / cure
mono_tables[["plots"]][["fail_vs_cure"]][["deseq_vol_plots"]]$plot

## DESeq2 MA plot of failure / cure with svaseq
mono_tables_sva[["plots"]][["fail_vs_cure"]][["deseq_ma_plots"]]$plot

## DESeq2 Volcano plot of failure / cure with svaseq
mono_tables_sva[["plots"]][["fail_vs_cure"]][["deseq_vol_plots"]]$plot

5.2.2.5 Monocyte MSigDB query

broad_c7 <- GSEABase::getGmt("reference/msigdb/c7.all.v7.2.entrez.gmt",
                             collectionType = GSEABase::BroadCollection(category = "c7"),
                             geneIdType = GSEABase::EntrezIdentifier())

mono_up_goseq_msig <- goseq_msigdb(sig_genes = ups, signatures = broad_c7,
                                   signature_category = "c7", length_db = hs_length)
## Before conversion: 126, after conversion: 127.
## Before conversion: 227921, after conversion: 35341.
## Found 122 go_db genes and 127 length_db genes out of 127.
mono_down_goseq_msig <- goseq_msigdb(sig_genes = downs, signatures = broad_c7,
                                     signature_category = "c7", length_db = hs_length)
## Before conversion: 281, after conversion: 280.
## Before conversion: 227921, after conversion: 35341.
## Found 269 go_db genes and 280 length_db genes out of 280.

5.2.2.6 Plot of similar experiments

## Monocyte genes with increased expression in the failed samples
## share genes with the following experiments
mono_up_goseq_msig[["pvalue_plots"]][["mfp_plot_over"]]

## Monocyte genes with increased expression in the cured samples
## share genes with the following experiments
mono_down_goseq_msig[["pvalue_plots"]][["mfp_plot_over"]]

5.2.3 Evaluate Neutrophil samples

neut <- subset_expt(hs_valid, subset = "typeofcells=='neutrophils'") %>%
  set_expt_conditions(fact = "clinicaloutcome") %>%
  set_expt_batches(fact = "donor") %>%
  set_expt_colors(colors = chosen_colors)
## subset_expt(): There were 152, now there are 31 samples.
## Warning in set_expt_colors(., colors = chosen_colors): Colors for the following
## categories are not being used: nullnotapplicable.
save_result <- save(neut, file = "rda/neutrophil_expt.rda")
neut_norm <- sm(normalize_expt(neut, convert = "cpm", filter = TRUE, transform = "log2"))
plt <- plot_pca(neut_norm, plot_labels = FALSE)$plot
pp(file = glue("images/neut_pca_normalized-v{ver}.pdf"), image = plt)

neut_nb <- sm(normalize_expt(neut, convert = "cpm", filter = TRUE,
                             transform = "log2", batch = "svaseq"))
plt <- plot_pca(neut_nb, plot_labels = FALSE)$plot
pp(file = glue("images/neut_pca_normalized_svaseq-v{ver}.pdf"), image = plt)

5.2.4 DE of Netrophil samples

5.2.4.1 Without sva

neut_de <- sm(all_pairwise(neut, model_batch = FALSE, filter = TRUE))
neut_tables <- sm(combine_de_tables(
    neut_de, keepers = keepers,
    excel = glue::glue("excel/neutrophil_clinical_all_tables-v{ver}.xlsx")))
written <- write_xlsx(data = neut_tables[["data"]][[1]],
                      excel = glue::glue("excel/neutrophil_clinical_table-v{ver}.xlsx"))
neut_sig <- sm(extract_significant_genes(neut_tables, according_to = "deseq"))
written <- write_xlsx(data = neut_sig[["deseq"]][["ups"]][[1]],
                      excel = glue::glue("excel/neutrophil_clinical_sigup-v{ver}.xlsx"))
written <- write_xlsx(data = neut_sig[["deseq"]][["downs"]][[1]],
                      excel = glue::glue("excel/neutrophil_clinical_sigdown-v{ver}.xlsx"))

neut_pct_sig <- sm(extract_significant_genes(neut_tables, n = 200, lfc = NULL,
                                             p = NULL, according_to = "deseq"))
written <- write_xlsx(data = neut_sig[["deseq"]][["ups"]][[1]],
                      excel = glue::glue("excel/neutrophil_clinical_sigup_pct-v{ver}.xlsx"))
written <- write_xlsx(data = neut_sig[["deseq"]][["downs"]][[1]],
                      excel = glue::glue("excel/neutrophil_clinical_sigdown_pct-v{ver}.xlsx"))
neut_cpm <- sm(normalize_expt(neut, convert = "cpm"))
written <- write_xlsx(data = exprs(neut_cpm),
                      excel = glue::glue("excel/neutrophil_cpm_before_batch-v{ver}.xlsx"))
neut_bcpm <- sm(normalize_expt(neut, filter = TRUE, batch = "svaseq", convert = "cpm"))
written <- write_xlsx(data = exprs(neut_bcpm),
                      excel = glue::glue("excel/neutrophil_cpm_after_batch-v{ver}.xlsx"))

5.2.4.2 With sva

neut_de_sva <- sm(all_pairwise(neut, model_batch = "svaseq", filter = TRUE))
neut_tables_sva <- sm(combine_de_tables(
    neut_de_sva, keepers = keepers,
    excel = glue::glue("excel/neutrophil_clinical_all_tables_sva-v{ver}.xlsx")))
neut_sig_sva <- sm(extract_significant_genes(
    neut_tables_sva,
    excel = glue::glue("excel/neutrophil_clinical_sig_tables_sva-v{ver}.xlsx"),
    according_to = "deseq"))

5.2.4.3 Neutrophil DE plots

## DESeq2 MA plot of failure / cure
neut_tables[["plots"]][["fail_vs_cure"]][["deseq_ma_plots"]]$plot

## DESeq2 Volcano plot of failure / cure
neut_tables[["plots"]][["fail_vs_cure"]][["deseq_vol_plots"]]$plot

## DESeq2 MA plot of failure / cure with sva
neut_tables_sva[["plots"]][["fail_vs_cure"]][["deseq_ma_plots"]]$plot

## DESeq2 Volcano plot of failure / cure with sva
neut_tables_sva[["plots"]][["fail_vs_cure"]][["deseq_vol_plots"]]$plot

5.2.4.5 Neutrophil GSVA query

neut_up_goseq_msig <- goseq_msigdb(sig_genes = ups, signatures = broad_c7,
                                   signature_category = "c7", length_db = hs_length)
## Before conversion: 179, after conversion: 178.
## Before conversion: 227921, after conversion: 35341.
## Found 171 go_db genes and 178 length_db genes out of 178.
neut_down_goseq_msig <- goseq_msigdb(sig_genes = downs, signatures = broad_c7,
                                     signature_category = "c7", length_db = hs_length)
## Before conversion: 138, after conversion: 133.
## Before conversion: 227921, after conversion: 35341.
## Found 128 go_db genes and 133 length_db genes out of 133.

5.2.4.6 Plot of similar experiments

## Neutrophil genes with increased expression in the failed samples
## share genes with the following experiments
neut_up_goseq_msig[["pvalue_plots"]][["mfp_plot_over"]]

## Neutrophil genes with increased expression in the cured samples
## share genes with the following experiments
neut_down_goseq_msig[["pvalue_plots"]][["mfp_plot_over"]]

5.3 Eosinophils

5.3.1 Evaluate Eosinophil samples

eo <- subset_expt(hs_valid, subset = "typeofcells=='eosinophils'") %>%
  set_expt_conditions(fact = "clinicaloutcome") %>%
  set_expt_batches(fact = "donor") %>%
  set_expt_colors(colors = chosen_colors)
## subset_expt(): There were 152, now there are 24 samples.
## Warning in set_expt_colors(., colors = chosen_colors): Colors for the following
## categories are not being used: nullnotapplicable.
save_result <- save(eo, file = "rda/eosinophil_expt.rda")
eo_norm <- sm(normalize_expt(eo, convert = "cpm", transform = "log2",
                             norm = "quant", filter = TRUE))
plt <- plot_pca(eo_norm, plot_labels = FALSE)$plot
pp(file = glue("images/eo_pca_normalized-v{ver}.pdf"), image = plt)

eo_nb <- sm(normalize_expt(eo, convert = "cpm", transform = "log2",
                           filter = TRUE, batch = "svaseq"))
plot_pca(eo_nb)$plot

5.3.2 DE of Eosinophil samples

5.3.2.1 Withouth sva

eo_de <- sm(all_pairwise(eo, model_batch = FALSE, filter = TRUE))
eo_tables <- sm(combine_de_tables(
    eo_de, keepers = keepers,
    excel = glue::glue("excel/eosinophil_clinical_all_tables-v{ver}.xlsx")))
written <- write_xlsx(data = eo_tables[["data"]][[1]],
                      excel = glue::glue("excel/eosinophil_clinical_table-v{ver}.xlsx"))
eo_sig <- sm(extract_significant_genes(eo_tables, according_to = "deseq"))
written <- write_xlsx(data = eo_sig[["deseq"]][["ups"]][[1]],
                      excel = glue::glue("excel/eosinophil_clinical_sigup-v{ver}.xlsx"))
written <- write_xlsx(data = eo_sig[["deseq"]][["downs"]][[1]],
                      excel = glue::glue("excel/eosinophil_clinical_sigdown-v{ver}.xlsx"))

eo_pct_sig <- sm(extract_significant_genes(eo_tables, n = 200,
                                           lfc = NULL, p = NULL, according_to = "deseq"))
written <- write_xlsx(data = eo_pct_sig[["deseq"]][["ups"]][[1]],
                      excel = glue::glue("excel/eosinophil_clinical_sigup_pct-v{ver}.xlsx"))
written <- write_xlsx(data = eo_pct_sig[["deseq"]][["downs"]][[1]],
                      excel = glue::glue("excel/eosinophil_clinical_sigdown_pct-v{ver}.xlsx"))

eo_cpm <- sm(normalize_expt(eo, convert = "cpm"))
written <- write_xlsx(data = exprs(eo_cpm),
                      excel = glue::glue("excel/eosinophil_cpm_before_batch-v{ver}.xlsx"))
eo_bcpm <- sm(normalize_expt(eo, filter = TRUE, batch = "svaseq", convert = "cpm"))
written <- write_xlsx(data = exprs(eo_bcpm),
                      excel = glue::glue("excel/eosinophil_cpm_after_batch-v{ver}.xlsx"))

5.3.2.2 With sva

eo_de_sva <- sm(all_pairwise(eo, model_batch = "svaseq", filter = TRUE))
eo_tables_sva <- sm(combine_de_tables(
    eo_de_sva, keepers = keepers,
    excel = glue::glue("excel/eosinophil_clinical_all_tables_sva-v{ver}.xlsx")))
eo_sig_sva <- sm(extract_significant_genes(
    eo_tables_sva,
    excel = glue::glue("excel/eosinophil_clinical_sig_tables_sva-v{ver}.xlsx"),
    according_to = "deseq"))

5.3.2.3 Eosinophil DE plots

## DESeq2 MA plot of failure / cure
eo_tables[["plots"]][["fail_vs_cure"]][["deseq_ma_plots"]]$plot

## DESeq2 Volcano plot of failure / cure
eo_tables[["plots"]][["fail_vs_cure"]][["deseq_vol_plots"]]$plot

## DESeq2 MA plot of failure / cure with sva
eo_tables_sva[["plots"]][["fail_vs_cure"]][["deseq_ma_plots"]]$plot

## DESeq2 Volcano plot of failure / cure with sva
eo_tables_sva[["plots"]][["fail_vs_cure"]][["deseq_vol_plots"]]$plot

5.3.2.5 Eosinophil MSigDB query

eo_up_goseq_msig <- goseq_msigdb(sig_genes = ups, signatures = broad_c7,
                                 signature_category = "c7", length_db = hs_length)
## Before conversion: 110, after conversion: 110.
## Before conversion: 227921, after conversion: 35341.
## Found 108 go_db genes and 110 length_db genes out of 110.
eo_down_goseq_msig <- goseq_msigdb(sig_genes = downs, signatures = broad_c7,
                                   signature_category = "c7", length_db = hs_length)
## Before conversion: 38, after conversion: 37.
## Before conversion: 227921, after conversion: 35341.
## Found 33 go_db genes and 37 length_db genes out of 37.

5.3.2.6 Plot of similar experiments

## Eosinophil genes with increased expression in the failed samples
## share genes with the following experiments
eo_up_goseq_msig[["pvalue_plots"]][["mfp_plot_over"]]

## Eosinophil genes with increased expression in the cured samples
## share genes with the following experiments
eo_down_goseq_msig[["pvalue_plots"]][["mfp_plot_over"]]

5.4 Biopsies

5.4.1 Evaluate Biopsy samples

biop <- subset_expt(hs_valid, subset = "typeofcells=='biopsy'") %>%
  set_expt_conditions(fact = "clinicaloutcome") %>%
  set_expt_batches(fact = "donor") %>%
  set_expt_colors(colors = chosen_colors)
## subset_expt(): There were 152, now there are 49 samples.
## Warning in set_expt_colors(., colors = chosen_colors): Colors for the following
## categories are not being used: nullnotapplicable.
save_result <- save(biop, file = "rda/biopsy_expt.rda")
biop_norm <- normalize_expt(biop, filter = TRUE, convert = "cpm",
                            transform = "log2", norm = "quant")
## Removing 5753 low-count genes (14188 remaining).
## transform_counts: Found 16 values equal to 0, adding 1 to the matrix.
plt <- plot_pca(biop_norm, plot_labels = FALSE)$plot
pp(file = glue("images/biop_pca_normalized-v{ver}.pdf"), image = plt)

biop_nb <- sm(normalize_expt(biop, convert = "cpm", filter = TRUE,
                             transform = "log2", batch = "svaseq"))
plt <- plot_pca(biop_nb, plot_labels = FALSE)$plot
pp(file = glue("images/biop_pca_normalized_svaseq-v{ver}.pdf"), image = plt)

5.4.2 DE of Biopsy samples

5.4.2.1 Without sva

biop_de <- sm(all_pairwise(biop, model_batch = FALSE, filter = TRUE))
biop_tables <- combine_de_tables(biop_de, keepers = keepers,
                                 excel = glue::glue("excel/biopsy_clinical_all_tables-v{ver}.xlsx"))
written <- write_xlsx(data = biop_tables[["data"]][[1]],
                      excel = glue::glue("excel/biopsy_clinical_table-v{ver}.xlsx"))
biop_sig <- extract_significant_genes(biop_tables, according_to = "deseq")
##written <- write_xlsx(data = biop_sig[["deseq"]][["ups"]][[1]],
##                      excel = glue::glue("excel/biopsy_clinical_sigup-v{ver}.xlsx"))
written <- write_xlsx(data = biop_sig[["deseq"]][["downs"]][[1]],
                      excel = glue::glue("excel/biopsy_clinical_sigdown-v{ver}.xlsx"))
biop_pct_sig <- extract_significant_genes(biop_tables, n = 200, lfc = NULL, p = NULL, according_to = "deseq")
## Getting the top and bottom 200 genes.
written <- write_xlsx(data = biop_pct_sig[["deseq"]][["ups"]][[1]],
                      excel = glue::glue("excel/biopsy_clinical_sigup_pct-v{ver}.xlsx"))
written <- write_xlsx(data = biop_pct_sig[["deseq"]][["downs"]][[1]],
                      excel = glue::glue("excel/biopsy_clinical_sigdown_pct-v{ver}.xlsx"))

biop_cpm <- sm(normalize_expt(biop, convert = "cpm"))
written <- write_xlsx(data = exprs(biop_cpm),
                      excel = glue::glue("excel/biopsy_cpm_before_batch-v{ver}.xlsx"))
biop_bcpm <- sm(normalize_expt(biop, filter = TRUE, batch = "svaseq", convert = "cpm"))
written <- write_xlsx(data = exprs(biop_bcpm),
                      excel = glue::glue("excel/biopsy_cpm_after_batch-v{ver}.xlsx"))

5.4.2.2 with sva

biop_de_sva <- sm(all_pairwise(biop, model_batch = "svaseq", filter = TRUE))
biop_tables_sva <- sm(combine_de_tables(
    biop_de_sva, keepers = keepers,
    excel = glue::glue("excel/biopsy_clinical_all_tables_sva-v{ver}.xlsx")))
biop_sig_sva <- sm(extract_significant_genes(
    biop_tables_sva,
    excel = glue::glue("excel/biopsy_clinical_sig_tables_sva-v{ver}.xlsx"),
    according_to = "deseq"))

5.4.2.3 Biopsy DE plots

## DESeq2 MA plot of failure / cure
biop_tables[["plots"]][["fail_vs_cure"]][["deseq_ma_plots"]]$plot

## DESeq2 Volcano plot of failure / cure
biop_tables[["plots"]][["fail_vs_cure"]][["deseq_vol_plots"]]$plot

## DESeq2 MA plot of failure / cure
biop_tables_sva[["plots"]][["fail_vs_cure"]][["deseq_ma_plots"]]$plot

## DESeq2 Volcano plot of failure / cure
biop_tables_sva[["plots"]][["fail_vs_cure"]][["deseq_vol_plots"]]$plot

6 Look for shared genes among Monocytes/Neutrophils/Eosinophils

We have three variables containing the ‘significant’ DE genes for the three cell types. For this I am choosing (for the moment) to use the sva data.

## mono_sig_sva, neut_sig_sva, eo_sig_sva
sig_vectors <- list(
    "monocytes" = c(rownames(mono_sig_sva[["deseq"]][["ups"]][["fail_vs_cure"]]),
                    rownames(mono_sig_sva[["deseq"]][["downs"]][["fail_vs_cure"]])),
    "neutrophils" = c(rownames(neut_sig_sva[["deseq"]][["ups"]][["fail_vs_cure"]]),
                      rownames(neut_sig_sva[["deseq"]][["downs"]][["fail_vs_cure"]])),
    "eosinophils" =  c(rownames(eo_sig_sva[["deseq"]][["ups"]][["fail_vs_cure"]]),
                       rownames(eo_sig_sva[["deseq"]][["downs"]][["fail_vs_cure"]])))

shared_vector <- Vennerable::Venn(Sets = sig_vectors)
Vennerable::plot(shared_vector, doWeights = FALSE)

shared_ids <- shared_vector@IntersectionSets[["111"]]
shared_expt <- exclude_genes_expt(hs_clinical, ids = shared_ids, method = "keep")
## Before removal, there were 19941 genes, now there are 21.
## There are 132 samples which kept less than 90 percent counts.
##  X1017n1  X1017m1  X1034n1 X1034bp1  X1034n2  X1034m2 X1034m2. X2050bp1 
##  0.10770  0.10087  0.95547  0.33773  1.09654  0.51353  0.49517  0.16070 
## X2052bp1  X2052e1  X2052m2  X2052n2  X2052m3  X2052n3  X2065m1  X2065n1 
##  0.32817  0.03808  0.12555  0.24676  0.16692  0.23432  0.16654  0.52827 
## X2065bp1  X2066m1  X2066n1 X2066bp1  X2065m2  X2065n2  X2065e2  X2066m2 
##  0.34346  0.07692  0.13150  0.27139  0.07087  0.04962  0.03702  0.06761 
##  X2066n2  X2066e2  X2068m1  X2068n1  X2068e1 X2068bp1  X2072m1  X2072n1 
##  0.06831  0.02495  0.04981  0.04888  0.01947  0.17676  0.06351  0.06770 
##  X2072e1 X2072bp1  X2071m1  X2071n1 X2071bp1  X2073m1  X2073n1  X2073e1 
##  0.03133  0.18845  0.12420  0.39016  0.23609  0.13451  0.45494  0.04816 
## X2073bp1  X2068m2  X2068n2  X2068e2  X2072m2  X2072n2  X2072e2  X2073m2 
##  0.25557  0.06535  0.07704  0.01960  0.09097  0.11434  0.03699  0.27127 
##  X2073n2  X2073e2  X2066m3  X2066n3  X2066e3  X2065e3  X2068m3  X2068n3 
##  0.94140  0.12439  0.08602  0.10998  0.02804  0.02263  0.06194  0.06636 
##  X2068e3  X2072m3  X2072n3  X2072e3 X2159bp1  X2073m3  X2073n3  X2073e3 
##  0.02747  0.18905  0.57829  0.06830  0.21495  0.13146  0.21920  0.05208 
##  X2162m1  X2162n1  X2162e1 X2162bp1  X2162n2  X2162e2  X2162n3  X2162e3 
##  0.06606  0.06570  0.04768  0.21141  0.08682  0.07029  0.13566  0.04089 
##  X2167m1  X2167n1  X2167e1 X2167bp1  X2168m1  X2168n1  X2168e1  X2168m2 
##  0.13729  0.06095  0.11876  0.18832  0.32153  0.76205  0.16761  0.26397 
##  X2168n2  X2168e2  X2167m2  X2167n3  X2167e3  X2168m3  X2168n3  X2168e3 
##  0.75628  0.13855  0.07451  0.06879  0.08244  0.35171  0.98796  0.18522 
##  X2172n1  X2172e1 X2172bp1 X2173bp1 X1154bp1  X2008.1  X2008.2  X2008.3 
##  0.06621  0.03115  0.34453  0.23774  0.23862  0.18147  0.13122  0.19344 
##  X1029.1  X1029.2  X1029.3  X1036.1  X1036.2  X1036.3  X1037.1  X1037.2 
##  0.18687  0.17736  0.15556  0.29831  0.23483  0.18661  0.28122  0.13634 
##  X1037.3  X1031.1  X1031.2  X1031.3  X2002.1  X2002.3  X2009.1  X2009.2 
##  0.14125  0.30709  0.16886  0.19346  0.26122  0.12688  0.19448  0.14828 
##  X2010.1  X2010.2  X2010.3  X1019.1  X1019.2  X1019.3  X2004.1  X2004.2 
##  0.24210  0.24601  0.15844  0.41003  0.27201  0.23768  0.17984  0.17389 
##  X2004.3  X2001.1  X2001.2  X2001.3  X2003.1  X2003.2  X2003.3  X1168m1 
##  0.14816  0.24701  0.15282  0.10547  0.39666  0.16892  0.14402  0.24770 
##  X1168n1  X1168m2  X1168e2  X1168n3 
##  0.39685  0.23465  0.05943  0.27880
shared_written <- write_expt(shared_expt,
                             excel = glue::glue("excel/shared_across_celltypes-v{ver}.xlsx"))
## Writing the first sheet, containing a legend and some summary data.
## Warning: ggrepel: 126 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 110 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## `geom_smooth()` using formula 'y ~ x'
## `geom_smooth()` using formula 'y ~ x'
## plot labels was not set and there are more than 100 samples, disabling it.
## plot labels was not set and there are more than 100 samples, disabling it.
## 
## Total:0 s
## Error in quantile.default(prop_median, p = c(1, 3)/4) : 
##   missing values and NaN's not allowed if 'na.rm' is FALSE
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 2 rows containing missing values (geom_bar).
## Warning: Transformation introduced infinite values in continuous y-axis

## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 2 rows containing missing values (geom_bar).
## Warning: ggrepel: 130 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## Warning: ggrepel: 118 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 4 rows containing missing values (geom_dl).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 4 rows containing missing values (geom_dl).
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure
## 
## Total:0 s

7 Monocytes by visit

  1. Can you please share with us a PCA (SVA and non-SVA) of the monocytes of the TMRC3 project, but labeling them based on the visit (V1, V2, V3)?
  2. Can you please share DE lists of V1 vs V2, V1 vs V3, V1 vs. V2+V3 and V2 vs V3?
visit_colors <- chosen_colors <- c("#D95F02", "#7570B3", "#1B9E77")
names(visit_colors) <- c(1, 2, 3)
mono_visit <- subset_expt(hs_valid, subset = "typeofcells=='monocytes'") %>%
  set_expt_conditions(fact = "visitnumber") %>%
  set_expt_batches(fact = "clinicaloutcome") %>%
  set_expt_colors(colors = chosen_colors)
## subset_expt(): There were 152, now there are 28 samples.
mono_visit_norm <- normalize_expt(mono_visit, filter = TRUE, norm = "quant", convert = "cpm",
                                  transform = "log2")
## Removing 8906 low-count genes (11035 remaining).
## transform_counts: Found 9 values equal to 0, adding 1 to the matrix.
mono_visit_pca <- plot_pca(mono_visit_norm)
pp(file = "images/monocyte_by_visit.png", image = mono_visit_pca$plot)

mono_visit_nb <- normalize_expt(mono_visit, filter = TRUE, convert = "cpm",
                                batch = "svaseq", transform = "log2")
## Removing 8906 low-count genes (11035 remaining).
## batch_counts: Before batch/surrogate estimation, 1433 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 18423 entries are 0<x<1: 6%.
## Setting 401 low elements to zero.
## transform_counts: Found 401 values equal to 0, adding 1 to the matrix.
mono_visit_nb_pca <- plot_pca(mono_visit_nb)
pp(file = "images/monocyte_by_visit_nb.png", image = mono_visit_nb_pca$plot)

table(pData(mono_visit_norm)$batch)
## 
##    cure failure    lost 
##       9      13       6
keepers <- list(
    "second_vs_first" = c("c2", "c1"),
    "third_vs_second" = c("c3", "c2"),
    "third_vs_first" = c("c3", "c1"))
mono_visit_de <- all_pairwise(mono_visit, model_batch = "svaseq", filter = TRUE)
## batch_counts: Before batch/surrogate estimation, 1433 entries are x==0: 0%.
## Plotting a PCA before surrogate/batch inclusion.
## Using svaseq to visualize before/after batch inclusion.
## Performing a test normalization with: raw
## Removing 0 low-count genes (11035 remaining).
## batch_counts: Before batch/surrogate estimation, 1433 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 18423 entries are 0<x<1: 6%.
## Setting 401 low elements to zero.
## transform_counts: Found 401 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
mono_visit_tables <- combine_de_tables(
    mono_visit_de,
    keepers = keepers,
    excel = glue::glue("excel/mono_visit_tables-v{ver}.xlsx"))
## Deleting the file excel/mono_visit_tables-v202106.xlsx before writing the tables.
new_factor <- as.character(pData(mono_visit)[["visitnumber"]])
not_one_idx <- new_factor != 1
new_factor[not_one_idx] <- "not_1"
mono_one_vs <- set_expt_conditions(mono_visit, new_factor)

mono_one_vs_de <- all_pairwise(mono_one_vs, model_batch = "svaseq", filter = TRUE)
## batch_counts: Before batch/surrogate estimation, 1433 entries are x==0: 0%.
## Plotting a PCA before surrogate/batch inclusion.
## Using svaseq to visualize before/after batch inclusion.
## Performing a test normalization with: raw
## Removing 0 low-count genes (11035 remaining).
## batch_counts: Before batch/surrogate estimation, 1433 entries are x==0: 0%.
## batch_counts: Before batch/surrogate estimation, 18423 entries are 0<x<1: 6%.
## Setting 384 low elements to zero.
## transform_counts: Found 384 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
mono_one_vs_tables <- combine_de_tables(
    mono_one_vs_de,
    excel = glue::glue("excel/mono_one_vs_tables-v{ver}.xlsx"))
## Deleting the file excel/mono_one_vs_tables-v202106.xlsx before writing the tables.

8 Test TSP

In writing the following, I quickly realized that tspair was not joking when it said it is intended for small numbers of genes. For a full expressionset of human data it is struggling. I like the idea, it may prove worth while to spend some time optimizing the package so that it is more usable.

expt <- hs_clinical_nobiop

simple_tsp <- function(expt, column = "condition") {
  facts <- levels(as.factor(pData(expt)[[column]]))
  retlist <- list()
  if (length(facts) < 2) {
    stop("This requires factors with at least 2 levels.")
  } else if (length(facts) == 2) {
    retlist <- simple_tsp_pair(expt, column = column)
  } else {
    for (first in 1:(length(facts) - 1)) {
      for (second in 2:(length(facts))) {
        if (first < second) {
          name <- glue::glue("{facts[first]}_vs_{facts[second]}")
          message("Starting ", name, ".")
          substring <- glue::glue("{column}=='{facts[first]}'|{column}=='{facts[second]}'")
          subby <- subset_expt(expt, subset=as.character(substring))
          retlist[[name]] <- simple_tsp_pair(subby, column = column)
        }
      }
    }
  }
}

simple_tsp_pair <- function(subby, column = "condition", repetitions = 50) {
  tsp_input <- subby[["expressionset"]]
  tsp_output <- tspcalc(tsp_input, column)
  tsp_scores <- tspsig(tsp_input, column, B = repetitions)
}

tsp1 <- tspcalc(tsp_input, "condition")
if (!isTRUE(get0("skip_load"))) {
  pander::pander(sessionInfo())
  message(paste0("This is hpgltools commit: ", get_git_commit()))
  message(paste0("Saving to ", savefile))
  tmp <- sm(saveme(filename = savefile))
}
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 72947fcc6afe09da22d71967059edd84e3063341
## This is hpgltools commit: Tue Jun 1 15:57:56 2021 -0400: 72947fcc6afe09da22d71967059edd84e3063341
## Saving to tmrc3_02sample_estimation_v202106.rda.xz
tmp <- loadme(filename = savefile)
LS0tCnRpdGxlOiAiVE1SQzMgQ29tcHJlaGVuc2l2ZSBEYXRhIEFuYWx5c2lzOiAyMDIxMDYiCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKIGh0bWxfZG9jdW1lbnQ6CiAgY29kZV9kb3dubG9hZDogdHJ1ZQogIGNvZGVfZm9sZGluZzogc2hvdwogIGZpZ19jYXB0aW9uOiB0cnVlCiAgZmlnX2hlaWdodDogNwogIGZpZ193aWR0aDogNwogIGhpZ2hsaWdodDogZGVmYXVsdAogIGtlZXBfbWQ6IGZhbHNlCiAgbW9kZTogc2VsZmNvbnRhaW5lZAogIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgdGhlbWU6IHJlYWRhYmxlCiAgdG9jOiB0cnVlCiAgdG9jX2Zsb2F0OgogICBjb2xsYXBzZWQ6IGZhbHNlCiAgIHNtb290aF9zY3JvbGw6IGZhbHNlCi0tLQoKPHN0eWxlPgogIGJvZHkgLm1haW4tY29udGFpbmVyIHsKICAgIG1heC13aWR0aDogMTYwMHB4OwogIH0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGUgPSBGQUxTRX0KbGlicmFyeShocGdsdG9vbHMpCnR0IDwtIHNtKGRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKSkKa25pdHI6Om9wdHNfa25pdCRzZXQocHJvZ3Jlc3MgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAxMjAsCiAgICAgICAgICAgICAgICAgICAgIGVjaG8gPSBUUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3IgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoID0gMTIsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuaGVpZ2h0ID0gMTIsCiAgICAgICAgICAgICAgICAgICAgICBkcGkgPSA5NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHMgPSA0LAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWwgPSAiYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplID0gMTIpKQp2ZXIgPC0gIjIwMjEwNiIKcnVuZGF0ZSA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0ID0gIiVZJW0lZCIpCgpybWRfZmlsZSA8LSBnbHVlOjpnbHVlKCJ0bXJjM18wMnNhbXBsZV9lc3RpbWF0aW9uX3Z7dmVyfS5SbWQiKQpzYXZlZmlsZSA8LSBnc3ViKHBhdHRlcm4gPSAiXFwuUm1kIiwgcmVwbGFjZSA9ICJcXC5yZGFcXC54eiIsIHggPSBybWRfZmlsZSkKYGBgCgpgYGB7ciBzYW1wbGVzaGVldH0Kc2FtcGxlc2hlZXQgPC0gInNhbXBsZV9zaGVldHMvdG1yYzNfc2FtcGxlc18yMDIxMDYxMC54bHN4IgpgYGAKCiMgQW5ub3RhdGlvbgoKV2UgdGFrZSB0aGUgYW5ub3RhdGlvbiBkYXRhIGZyb20gZW5zZW1ibCdzIGJpb21hcnQgaW5zdGFuY2UuICBUaGUgZ2Vub21lIHdoaWNoCndhcyB1c2VkIHRvIG1hcCB0aGUgZGF0YSB3YXMgaGczOCByZXZpc2lvbiAxMDAuICBNeSBkZWZhdWx0IHdoZW4gdXNpbmcgYmlvbWFydCBpcwp0byBsb2FkIHRoZSBkYXRhIGZyb20gMSB5ZWFyIGJlZm9yZSB0aGUgY3VycmVudCBkYXRlLgoKYGBge3IgaHNfYW5ub3R9CmhzX2Fubm90IDwtIHNtKGxvYWRfYmlvbWFydF9hbm5vdGF0aW9ucyh5ZWFyID0gIjIwMjAiKSkKaHNfYW5ub3QgPC0gaHNfYW5ub3RbWyJhbm5vdGF0aW9uIl1dCmhzX2Fubm90W1sidHJhbnNjcmlwdCJdXSA8LSBwYXN0ZTAocm93bmFtZXMoaHNfYW5ub3QpLCAiLiIsIGhzX2Fubm90W1sidmVyc2lvbiJdXSkKcm93bmFtZXMoaHNfYW5ub3QpIDwtIG1ha2UubmFtZXMoaHNfYW5ub3RbWyJlbnNlbWJsX2dlbmVfaWQiXV0sIHVuaXF1ZSA9IFRSVUUpCnR4X2dlbmVfbWFwIDwtIGhzX2Fubm90WywgYygidHJhbnNjcmlwdCIsICJlbnNlbWJsX2dlbmVfaWQiKV0KCnN1bW1hcnkoaHNfYW5ub3QpCmBgYAoKYGBge3IgaHNfZ299CmhzX2dvIDwtIHNtKGxvYWRfYmlvbWFydF9nbygpW1siZ28iXV0pCmhzX2xlbmd0aCA8LSBoc19hbm5vdFssIGMoImVuc2VtYmxfZ2VuZV9pZCIsICJjZHNfbGVuZ3RoIildCmNvbG5hbWVzKGhzX2xlbmd0aCkgPC0gYygiSUQiLCAibGVuZ3RoIikKYGBgCgojIEludHJvZHVjdGlvbgoKVGhpcyBkb2N1bWVudCBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGFuIG92ZXJ2aWV3IG9mIFRNUkMzIHNhbXBsZXMgd2hpY2ggaGF2ZQpiZWVuIHNlcXVlbmNlZC4gIEl0IGluY2x1ZGVzIHNvbWUgcGxvdHMgYW5kIGFuYWx5c2VzIHNob3dpbmcgdGhlIHJlbGF0aW9uc2hpcHMKYW1vbmcgdGhlIHNhbXBsZXMgYXMgd2VsbCBhcyBzb21lIGRpZmZlcmVudGlhbCBhbmFseXNlcyB3aGVuIHBvc3NpYmxlLgoKIyBTYW1wbGUgRXN0aW1hdGlvbgoKIyMgR2VuZXJhdGUgZXhwcmVzc2lvbnNldHMKClRoZSBzYW1wbGUgc2hlZXQgaXMgY29waWVkIGZyb20gb3VyIHNoYXJlZCBvbmxpbmUgc2hlZXQgYW5kIHVwZGF0ZWQgd2l0aCBlYWNoIHJlbGVhc2UKb2Ygc2VxdWVuY2luZyBkYXRhLgoKCiMjIyBIaXNhdDIgZXhwcmVzc2lvbnNldHMKClRoZSBmaXJzdCB0aGluZyB0byBub3RlIGlzIHRoZSBsYXJnZSByYW5nZSBpbiBjb3ZlcmFnZS4gIFRoZXJlIGFyZSBtdWx0aXBsZQpzYW1wbGVzIHdpdGggY292ZXJhZ2Ugd2hpY2ggaXMgdG9vIGxvdyB0byB1c2UuICBUaGVzZSB3aWxsIGJlIHJlbW92ZWQgc2hvcnRseS4KCkluIHRoZSBmb2xsb3dpbmcgYmxvY2sgSSBpbW1lZGlhdGVseSBleGNsdWRlIGFueSBub24tY29kaW5nIHJlYWRzIGFzIHdlbGwuCgpgYGB7ciBhbGxfbmV3X2hpc2F0Mn0KIyMgQ3JlYXRlIHRoZSBleHByZXNzaW9uc2V0IGFuZCBpbW1lZGlhdGVseSBwYXNzIGl0IHRvIGEgZmlsdGVyCiMjIHJlbW92aW5nIHRoZSBub24gcHJvdGVpbiBjb2RpbmcgZ2VuZXMuCnNhbml0aXplX2NvbHVtbnMgPC0gYygidmlzaXRudW1iZXIiLCAiY2xpbmljYWxvdXRjb21lIiwgImRvbm9yIiwKICAgICAgICAgICAgICAgICAgICAgICJ0eXBlb2ZjZWxscyIsICJjbGluaWNhbHByZXNlbnRhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAiY29uZGl0aW9uIiwgImJhdGNoIikKaHNfZXhwdCA8LSBjcmVhdGVfZXhwdChzYW1wbGVzaGVldCwKICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbHVtbiA9ICJoZzM4MTAwaGlzYXRmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgICBzYXZlZmlsZSA9IGdsdWU6OmdsdWUoInJkYS9oc19leHB0X2FsbC12e3Zlcn0ucmRhIiksCiAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvID0gaHNfYW5ub3QpICU+JQogIGV4Y2x1ZGVfZ2VuZXNfZXhwdChjb2x1bW4gPSAiZ2VuZV9iaW90eXBlIiwgbWV0aG9kID0gImtlZXAiLAogICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gInByb3RlaW5fY29kaW5nIiwgbWV0YV9jb2x1bW4gPSAibmNybmFfbG9zdCIpICU+JQogIHNhbml0aXplX2V4cHRfbWV0YWRhdGEoY29sdW1ucyA9IHNhbml0aXplX2NvbHVtbnMpICU+JQogIHNldF9leHB0X2ZhY3RvcnMoY29sdW1ucyA9IHNhbml0aXplX2NvbHVtbnMsIGNsYXNzID0gImZhY3RvciIpCgpsZXZlbHMocERhdGEoaHNfZXhwdFtbImV4cHJlc3Npb25zZXQiXV0pW1sidmlzaXRudW1iZXIiXV0pIDwtIGxpc3QoCiAgICAnMCcgPSAibm90YXBwbGljYWJsZSIsICcxJyA9IDEsICcyJyA9IDIsICczJyA9IDMpCmBgYAoKU3BsaXQgdGhpcyBkYXRhIGludG8gQ0RTIGFuZCBsbmNSTkEuICBPaCBjcmFwIGluIG9yZGVyIHRvIGRvIHRoYXQgSSBuZWVkIHRvIHJlY291bnQgdGhlIGRhdGEuClJ1bm5pbmcgbm93ICgyMDIxMDUxOCkKCmBgYHtyIGxuY19jZHN9CiMjIGxuY19leHB0IDwtIGNyZWF0ZV9leHB0KHNhbXBsZXNoZWV0LAojIyAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbHVtbiA9ICJoZzM4MTAwbG5jZmlsZSIsCiMjICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbyA9IGhzX2Fubm90KQpgYGAKCiMjIyMgSW5pdGlhbCBtZXRyaWNzCgpPbmNlIHRoZSBkYXRhIHdhcyBsb2FkZWQsIHRoZXJlIGFyZSBhIGNvdXBsZSBvZiBtZXRyaWNzIHdoaWNoIG1heSBiZSBwbG90dGVkIGltbWVkaWF0ZWx5LgoKYGBge3IgaW5pdGlhbF9tZXRyaWNzfQpub256ZXJvIDwtIHBsb3Rfbm9uemVybyhoc19leHB0KQpub256ZXJvJHBsb3QKCm5jcm5hX2xvc3RfZGYgPC0gYXMuZGF0YS5mcmFtZShwRGF0YShoc19leHB0KVtbIm5jcm5hX2xvc3QiXV0pCnJvd25hbWVzKG5jcm5hX2xvc3RfZGYpIDwtIHJvd25hbWVzKHBEYXRhKGhzX2V4cHQpKQpjb2xuYW1lcyhuY3JuYV9sb3N0X2RmKSA8LSAibmNybmFfbG9zdCIKCnRtcGRmIDwtIG1lcmdlKG5vbnplcm8kdGFibGUsIG5jcm5hX2xvc3RfZGYsIGJ5ID0gInJvdy5uYW1lcyIpCnJvd25hbWVzKHRtcGRmKSA8LSB0bXBkZltbIlJvdy5uYW1lcyJdXQp0bXBkZltbIlJvdy5uYW1lcyJdXSA8LSBOVUxMCgpnZ3Bsb3QodG1wZGYsIGFlcyh4PW5jcm5hX2xvc3QsIHk9bm9uemVyb19nZW5lcykpICsKICBnZ3Bsb3QyOjpnZW9tX3BvaW50KCkgKwogIGdncGxvdDI6OmdndGl0bGUoIk5vbnplcm8gZ2VuZXMgd2l0aCByZXNwZWN0IHRvIHBlcmNlbnQgY291bnRzIApsb3N0IHdoZW4gbmNSTkEgd2FzIHJlbW92ZWQuIikKYGBgCgpOYWppYiBkb2Vzbid0IHdhbnQgdGhpcyBwbG90LCBidXQgSSBhbSB1c2luZyBpdCB0byBjaGVjayBuZXcgc2FtcGxlcywKc28gd2lsbCBoaWRlIGl0IGZyb20gZ2VuZXJhbCB1c2UuCgpgYGB7ciBsaWJzaXplfQpsaWJzaXplIDwtIHBsb3RfbGlic2l6ZShoc19leHB0KQpsaWJzaXplJHBsb3QKYGBgCgojIyBNaW5pbXVtIGNvdmVyYWdlIHNhbXBsZSBmaWx0ZXJpbmcKCkkgYXJiaXRyYXJpbHkgY2hvc2UgMTEsMDAwIG5vbi16ZXJvIGdlbmVzIGFzIGEgbWluaW11bS4gIFdlIG1heQp3YW50IHRoaXMgdG8gYmUgaGlnaGVyLgoKYGBge3IgaGlzYXQyX3dyaXRlLCBmaWcuc2hvdyA9ICJoaWRlIn0KaHNfdmFsaWQgPC0gc3Vic2V0X2V4cHQoaHNfZXhwdCwgbm9uemVybyA9IDExMDAwKQoKdmFsaWRfd3JpdGUgPC0gc20od3JpdGVfZXhwdChoc192YWxpZCwgZXhjZWwgPSBnbHVlKCJleGNlbC9oc192YWxpZC12e3Zlcn0ueGxzeCIpKSkKYGBgCgojIFByb2plY3QgQWltcwoKVGhlIHByb2plY3Qgc2Vla3MgdG8gZGV0ZXJtaW5lIHRoZSByZWxhdGlvbnNoaXAgb2YgdGhlIGlubmF0ZSBpbW11bmUgcmVzcG9uc2UKYW5kIGluZmxhbW1hdG9yeSBzaWduYWxpbmcgdG8gdGhlIGNsaW5pY2FsIG91dGNvbWUgb2YgYW50aWxlaXNobWFuaWFsIGRydWcKdHJlYXRtZW50LiBXZSB3aWxsIHRlc3QgdGhlIGh5cG90aGVzaXMgdGhhdCB0aGUgcHJvZmlsZSBvZiBpbm5hdGUgaW1tdW5lIGNlbGwKYWN0aXZhdGlvbiBhbmQgdGhlaXIgZHluYW1pY3MgdGhyb3VnaCB0aGUgY291cnNlIG9mIHRyZWF0bWVudCBkaWZmZXIgYmV0d2VlbiBDTApwYXRpZW50cyB3aXRoIHByb3NwZWN0aXZlbHkgZGV0ZXJtaW5lZCB0aGVyYXBldXRpYyBjdXJlIG9yIGZhaWx1cmUuCgpUaGlzIHdpbGwgYmUgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgY2hhcmFjdGVyaXphdGlvbiBvZiB0aGUgaW4gdml2byBkeW5hbWljcyBvZgpibG9vZC1kZXJpdmVkIG1vbm9jeXRlLCBuZXV0cm9waGlsIGFuZCBlb3Npbm9waGlsIHRyYW5zY3JpcHRvbWUgYmVmb3JlLCBkdXJpbmcKYW5kIGF0IHRoZSBlbmQgb2YgdHJlYXRtZW50IGluIENMIHBhdGllbnRzLiBDZWxsLXR5cGUgc3BlY2lmaWMgdHJhbnNjcmlwdG9tZXMsCmNvbXBvc2l0ZSBzaWduYXR1cmVzIGFuZCB0aW1lLXJlc3BvbnNlIGV4cHJlc3Npb24gcHJvZmlsZXMgd2lsbCBiZSBjb250cmFzdGVkCmFtb25nIHBhdGllbnRzIHdpdGggdGhlcmFwZXV0aWMgY3VyZSBvciBmYWlsdXJlLgoKIyMgUHJlcGFyYXRpb24KClRvIGFkZHJlc3MgdGhlc2UsIEkgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgc2FtcGxlIHNoZWV0IGNvbHVtbnMgbmFtZWQKJ2NvbmRpdGlvbicsICdiYXRjaCcsICdkb25vcicsIGFuZCAndGltZScuICBUaGVzZSBhcmUgZmlsbGVkIGluIHdpdGggc2hvcnRoYW5kCnZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlIGFib3ZlLgoKIyMgR2xvYmFsIHZpZXcKCkJlZm9yZSBhZGRyZXNzaW5nIHRoZSBxdWVzdGlvbnMgZXhwbGljaXRseSBieSBzdWJzZXR0aW5nIHRoZSBkYXRhLCBJIHdhbnQgdG8gZ2V0CmEgbG9vayBhdCB0aGUgc2FtcGxlcyBhcyB0aGV5IGFyZS4KCmBgYHtyIHByZV9xdWVzdGlvbnN9Cm5ld19uYW1lcyA8LSBwRGF0YShoc192YWxpZClbWyJzYW1wbGVuYW1lIl1dCmhzX3ZhbGlkIDwtIGhzX3ZhbGlkICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJjZWxsc3NvdXJjZSIpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJ0eXBlb2ZjZWxscyIpICU+JQogIHNldF9leHB0X3NhbXBsZW5hbWVzKG5ld25hbWVzID0gbmV3X25hbWVzKQoKYWxsX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQoaHNfdmFsaWQsIHRyYW5zZm9ybSA9ICJsb2cyIiwgbm9ybSA9ICJxdWFudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSkpCgphbGxfcGNhIDwtIHBsb3RfcGNhKGFsbF9ub3JtLCBwbG90X2xhYmVscyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgIHBsb3RfdGl0bGUgPSAiUENBIC0gQ2VsbCB0eXBlIiwgc2l6ZV9jb2x1bW4gPSAidmlzaXRudW1iZXIiKQpwcChmaWxlID0gZ2x1ZSgiaW1hZ2VzL3RtcmMzX3BjYV9ub2xhYmVscy12e3Zlcn0ucG5nIiksIGltYWdlID0gYWxsX3BjYSRwbG90KQoKd3JpdGUuY3N2KGFsbF9wY2EkdGFibGUsIGZpbGUgPSAiY29vcmRzL2hzX2Rvbm9yX3BjYV9jb29yZHMuY3N2IikKcGxvdF9jb3JoZWF0KGFsbF9ub3JtLCBwbG90X3RpdGxlID0gIkhlaXJhcmNoaWNhbCBjbHVzdGVyaW5nOgogICAgICAgICBjZWxsIHR5cGVzIikkcGxvdApgYGAKCiMjIEV4YW1pbmUgc2FtcGxlcyByZWxldmFudCB0byBjbGluaWNhbCBvdXRjb21lCgpOb3cgbGV0IHVzIGNvbnNpZGVyIG9ubHkgdGhlIHNhbXBsZXMgZm9yIHdoaWNoIHdlIGhhdmUgYSBjbGluaWNhbCBvdXRjb21lLgpUaGVzZSBmYWxsIHByaW1hcmlseSBpbnRvIGVpdGhlciAnY3VyZWQnIG9yICdmYWlsZWQnLCBidXQgc29tZSBwZW9wbGUgaGF2ZSBub3QKeWV0IHJldHVybmVkIHRvIHRoZSBjbGluaWMgYWZ0ZXIgdGhlIGZpcnN0IG9yIHNlY29uZCB2aXNpdC4gIFRoZXNlIGFyZSBkZWVtZWQKJ2xvc3QnLgoKYGBge3IgYWxsX2NsaW5pY2FsfQpoc19jbGluaWNhbCA8LSBoc192YWxpZCAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3QgPSAiY2xpbmljYWxvdXRjb21lIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInR5cGVvZmNlbGxzIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gInR5cGVvZmNlbGxzIT0ncGJtY3MnJnR5cGVvZmNlbGxzIT0nbWFjcm9waGFnZXMnIikKCmNob3Nlbl9jb2xvcnMgPC0gYygiI0Q5NUYwMiIsICIjNzU3MEIzIiwgIiMxQjlFNzciLCAiI0ZGMDAwMCIsICIjRkYwMDAwIikKbmFtZXMoY2hvc2VuX2NvbG9ycykgPC0gYygiY3VyZSIsICJmYWlsdXJlIiwgImxvc3QiLCAibnVsbCIsICJub3RhcHBsaWNhYmxlIikKaHNfY2xpbmljYWwgPC0gc2V0X2V4cHRfY29sb3JzKGhzX2NsaW5pY2FsLCBjb2xvcnMgPSBjaG9zZW5fY29sb3JzKQoKbmV3bmFtZXMgPC0gbWFrZS5uYW1lcyhwRGF0YShoc19jbGluaWNhbClbWyJzYW1wbGVuYW1lIl1dLCB1bmlxdWUgPSBUUlVFKQpoc19jbGluaWNhbCA8LSBzZXRfZXhwdF9zYW1wbGVuYW1lcyhoc19jbGluaWNhbCwgbmV3bmFtZXMgPSBuZXduYW1lcykKCmhzX2NsaW5pY2FsX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQoaHNfY2xpbmljYWwsIGZpbHRlciA9IFRSVUUsIHRyYW5zZm9ybSA9ICJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ID0gImNwbSIsIG5vcm0gPSAicXVhbnQiKSkKY2xpbmljYWxfcGNhIDwtIHBsb3RfcGNhKGhzX2NsaW5pY2FsX25vcm0sIHBsb3RfbGFiZWxzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX2NvbHVtbiA9ICJ2aXNpdG51bWJlciIsIGNpcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICBwbG90X3RpdGxlID0gIlBDQSAtIGNsaW5pY2FsIHNhbXBsZXMiKQpwcChmaWxlID0gZ2x1ZSgiaW1hZ2VzL2FsbF9jbGluaWNhbF9ub2JhdGNoX3BjYS12e3Zlcn0ucG5nIiksIGltYWdlID0gY2xpbmljYWxfcGNhJHBsb3QsCiAgIGhlaWdodCA9IDgsIHdpZHRoID0gMjApCmBgYAoKIyMjIFJlcGVhdCB3aXRob3V0IHRoZSBiaW9wc3kgc2FtcGxlcwoKYGBge3IgaWJpZF9ub2Jpb3BzeX0KaHNfY2xpbmljYWxfbm9iaW9wIDwtIGhzX2NsaW5pY2FsICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJ0eXBlb2ZjZWxscyE9J2Jpb3BzeSciKQoKaHNfY2xpbmljYWxfbm9iaW9wX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQoaHNfY2xpbmljYWxfbm9iaW9wLCBmaWx0ZXIgPSBUUlVFLCB0cmFuc2Zvcm0gPSAibG9nMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQgPSAiY3BtIiwgbm9ybSA9ICJxdWFudCIpKQpjbGluaWNhbF9ub2Jpb3BfcGNhIDwtIHBsb3RfcGNhKGhzX2NsaW5pY2FsX25vYmlvcF9ub3JtLCBwbG90X2xhYmVscyA9IEZBTFNFLCBjaXMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RfdGl0bGUgPSAiUENBIC0gY2xpbmljYWwgc2FtcGxlcyB3aXRob3V0IGJpb3BzaWVzIikKcHAoZmlsZSA9IGdsdWUoImltYWdlcy9hbGxfY2xpbmljYWxfbm9iaW9wX25vYmF0Y2hfcGNhLXZ7dmVyfS5wbmciKSwKICAgaW1hZ2UgPSBjbGluaWNhbF9ub2Jpb3BfcGNhJHBsb3QpCmBgYAoKIyMjIEF0dGVtcHQgdG8gY29ycmVjdCBmb3IgdGhlIHN1cnJvZ2F0ZSB2YXJpYWJsZXMKCkF0IHRoaXMgdGltZSB3ZSBoYXZlIHR3byBwcmltYXJ5IGRhdGEgc3RydWN0dXJlcyBvZiBpbnRlcmVzdDogaHNfY2xpbmljYWwgYW5kIGhzX2NsaW5pY2FsX25vYmlvcAoKYGBge3IgY2xpbmljYWxfc3ZhfQpoc19jbGluaWNhbF9uYiA8LSBub3JtYWxpemVfZXhwdChoc19jbGluaWNhbCwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIpCmNsaW5pY2FsX2JhdGNoX3BjYSA8LSBwbG90X3BjYShoc19jbGluaWNhbF9uYiwgcGxvdF9sYWJlbHMgPSBGQUxTRSwgY2lzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfY29sdW1uID0gInZpc2l0bnVtYmVyIiwgcGxvdF90aXRsZSA9ICJQQ0EgLSBjbGluaWNhbCBzYW1wbGVzIikKY2xpbmljYWxfYmF0Y2hfcGNhJHBsb3QKCmhzX2NsaW5pY2FsX25vYmlvcF9uYiA8LSBzbShub3JtYWxpemVfZXhwdChoc19jbGluaWNhbF9ub2Jpb3AsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIikpCmNsaW5pY2FsX25vYmlvcF9iYXRjaF9wY2EgPC0gcGxvdF9wY2EoaHNfY2xpbmljYWxfbm9iaW9wX25iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RfdGl0bGUgPSAiUENBIC0gY2xpbmljYWwgc2FtcGxlcyB3aXRob3V0IGJpb3BzaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90X2xhYmVscyA9IEZBTFNFKQpwcChmaWxlID0gImltYWdlcy9jbGluaWNhbF9iYXRjaC5wbmciLCBpbWFnZSA9IGNsaW5pY2FsX25vYmlvcF9iYXRjaF9wY2EkcGxvdCkKdGVzdCA8LSBwbG90X3BjYShoc19jbGluaWNhbF9ub2Jpb3BfbmIsIHNpemVfY29sdW1uID0gInZpc2l0bnVtYmVyIiwKICAgICAgICAgICAgICAgICBwbG90X3RpdGxlID0gIlBDQSAtIGNsaW5pY2FsIHNhbXBsZXMgd2l0aG91dCBiaW9wc2llcyIsCiAgICAgICAgICAgICAgICAgcGxvdF9sYWJlbHMgPSBGQUxTRSkKdGVzdCRwbG90CgpjbGluaWNhbF9ub2Jpb3BfYmF0Y2hfdHNuZSA8LSBwbG90X3RzbmUoaHNfY2xpbmljYWxfbm9iaW9wX25iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdF90aXRsZSA9ICJ0U05FIC0gY2xpbmljYWwgc2FtcGxlcyB3aXRob3V0IGJpb3BzaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RfbGFiZWxzID0gRkFMU0UpCmNsaW5pY2FsX25vYmlvcF9iYXRjaF90c25lJHBsb3QKYGBgCgojIyMjIExvb2sgYXQgcmVtYWluaW5nIHZhcmlhbmNlIHdpdGggdmFyaWFuY2VQYXJ0aXRpb24KCmBgYHtyIHZhcmlhbmNlX3BhcnRpdGlvbn0KdGVzdCA8LSBzaW1wbGVfdmFycGFydChoc19jbGluaWNhbF9ub2Jpb3ApCnRlc3QkcGFydGl0aW9uX3Bsb3QKYGBgCgojIyBQZXJmb3JtIERFIG9mIHRoZSBjbGluaWNhbCBzYW1wbGVzIGN1cmUgdnMuIGZhaWwKCmBgYHtyIGNsaW5pY2FsX2RlLCBmaWcuc2hvdz0iaGlkZSJ9CmluZGl2aWR1YWxfY2VsbHR5cGVzIDwtIHN1YnNldF9leHB0KGhzX2NsaW5pY2FsX25vYmlvcCwgc3Vic2V0PSJjb25kaXRpb24hPSdsb3N0JyIpCmhzX2NsaW5pY19kZSA8LSBzbShhbGxfcGFpcndpc2UoaW5kaXZpZHVhbF9jZWxsdHlwZXMsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpKQoKaHNfY2xpbmljX3RhYmxlIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogICAgaHNfY2xpbmljX2RlLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9pbmRpdmlkdWFsX2NlbGx0eXBlc190YWJsZS12e3Zlcn0ueGxzeCIpKSkKCmhzX2NsaW5pY19zaWcgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIGhzX2NsaW5pY190YWJsZSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvaW5kaXZpZHVhbF9jZWxsdHlwZXNfc2lnLXZ7dmVyfS54bHN4IikpKQoKaHNfY2xpbmljX3NpZ1tbInN1bW1hcnlfZGYiXV0KYGBgCgpgYGB7ciBkZV9oZWF0bWFwfQpoc19jbGluaWNfZGVbWyJjb21wYXJpc29uIl1dW1siaGVhdCJdXQpgYGAKCiMjIyBQZXJmb3JtIExSVCB3aXRoIHRoZSBjbGluaWNhbCBzYW1wbGVzCgpJIGFtIG5vdCBzdXJlIGlmIHdlIGhhdmUgZW5vdWdoIHNhbXBsZXMgYWNyb3NzIHRoZSB0aHJlZSB2aXNpdCB0bwpjb21wbGV0ZWx5IHdvcmsgYXMgd2VsbCBhcyB3ZSB3b3VsZCBsaWtlLCBidXQgdGhlcmUgaXMgb25seSAxIHdheSB0bwpmaW5kIG91dCEgIE5vdyB0aGF0IEkgdGhpbmsgYWJvdXQgaXQsIG9uZSB0aGluZyB3aGljaCBtaWdodCBiZSBhd2Vzb21lCmlzIHRvIHVzZSBjZWxsIHR5cGUgYXMgYW4gaW50ZXJhY3RpbmcgZmFjdG9yLi4uCgojIyMjIFdpdGggYmlvcHN5IHNhbXBsZXMKCkkgZmlndXJlIHRoaXMgbWlnaHQgYmUgYSBwbGFjZSB3aGVyZSB0aGUgYmlvcHN5IHNhbXBsZXMgbWlnaHQgcHJvdmUgdXNlZnVsLgoKYGBge3IgbHJ0X3Rlc3R9CmNsaW5pY2FsX25vbG9zdCA8LSBzdWJzZXRfZXhwdChoc19jbGluaWNhbCwgc3Vic2V0PSJjb25kaXRpb24hPSdsb3N0JyIpCmxydF92aXNpdF9jbGluaWNhbF90ZXN0IDwtIGRlc2VxX2xydChjbGluaWNhbF9ub2xvc3QsIHRyYW5zZm9ybSA9ICJ2c3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rvcl9jb2x1bW4gPSAidmlzaXRudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RfY29sdW1uID0gImNsaW5pY2Fsb3V0Y29tZSIpCmxydF92aXNpdF9jbGluaWNhbF90ZXN0W1siZmF2b3JpdGVfZ2VuZXMiXV0KCmxydF9jZWxsdHlwZV9jbGluaWNhbF90ZXN0IDwtIGRlc2VxX2xydChjbGluaWNhbF9ub2xvc3QsIHRyYW5zZm9ybSA9ICJ2c3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rvcl9jb2x1bW4gPSAidHlwZW9mY2VsbHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RfY29sdW1uID0gImNsaW5pY2Fsb3V0Y29tZSIpCmxydF9jZWxsdHlwZV9jbGluaWNhbF90ZXN0W1siZmF2b3JpdGVfZ2VuZXMiXV0KYGBgCgojIyMgTG9vayBhdCBvbmx5IHRoZSBkaWZmZXJlbnRpYWwgZ2VuZXMKCkEgZ29vZCBzdWdnZXN0aW9uIGZyb20gVGhlcmVzYSB3YXMgdG8gZXhhbWluZSBvbmx5IHRoZSBtb3N0IHZhcmlhbnQKZ2VuZXMgZnJvbSBmYWlsdXJlIHZzLiBjdXJlIGFuZCBzZWUgaG93IHRoZXkgY2hhbmdlIHRoZSBjbHVzdGVyaW5nL2V0YwpyZXN1bHRzLiAgVGhpcyBpcyBteSBhdHRlbXB0IHRvIGFkZHJlc3MgdGhpcyBxdWVyeS4KCmBgYHtyIHNtYWxsX2V4cGxvcmV9CmhzX2NsaW5pY190b3BuIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoaHNfY2xpbmljX3RhYmxlLCBuID0gMTAwKSkKdGFibGUgPC0gImZhaWx1cmVfdnNfY3VyZSIKd2FudGVkIDwtIHJiaW5kKGhzX2NsaW5pY190b3BuW1siZGVzZXEiXV1bWyJ1cHMiXV1bW3RhYmxlXV0sCiAgICAgICAgICAgICAgICBoc19jbGluaWNfdG9wbltbImRlc2VxIl1dW1siZG93bnMiXV1bW3RhYmxlXV0pCgpzbWFsbF9leHB0IDwtIGV4Y2x1ZGVfZ2VuZXNfZXhwdChoc19jbGluaWNhbF9ub2Jpb3AsIGlkcyA9IHJvd25hbWVzKHdhbnRlZCksIG1ldGhvZCA9ICJrZWVwIikKc21hbGxfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChzbWFsbF9leHB0LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkpCnBsb3RfcGNhKHNtYWxsX25vcm0pJHBsb3QKCnNtYWxsX25iIDwtIG5vcm1hbGl6ZV9leHB0KHNtYWxsX2V4cHQsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKcGxvdF9wY2Eoc21hbGxfbmIpJHBsb3QKYGBgCgpgYGB7ciBjbGluaWNhbF9wbG90fQojIyBERVNlcTIgTUEgcGxvdCBvZiBmYWlsdXJlIC8gY3VyZQpoc19jbGluaWNfdGFibGVbWyJwbG90cyJdXVtbImZhaWx1cmVfdnNfY3VyZSJdXVtbImRlc2VxX21hX3Bsb3RzIl1dJHBsb3QKCiMjIERFU2VxMiBWb2xjYW5vIHBsb3Qgb2YgZmFpbHVyZSAvIGN1cmUKaHNfY2xpbmljX3RhYmxlW1sicGxvdHMiXV1bWyJmYWlsdXJlX3ZzX2N1cmUiXV1bWyJkZXNlcV92b2xfcGxvdHMiXV0kcGxvdApgYGAKCiMjIyBnOlByb2ZpbGVyIHJlc3VsdHMgdXNpbmcgdGhlIHNpZ25pZmljYW50IHVwIGFuZCBkb3duIGdlbmVzCgpgYGB7ciBwZXJmb3JtX2dwcm9maWxlcn0KdXBzIDwtIGhzX2NsaW5pY19zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbMV1dCmRvd25zIDwtIGhzX2NsaW5pY19zaWdbWyJkZXNlcSJdXVtbImRvd25zIl1dW1sxXV0KCmhzX2NsaW5pY19ncHJvZmlsZXJfdXBzIDwtIHNpbXBsZV9ncHJvZmlsZXIodXBzKQpoc19jbGluaWNfZ3Byb2ZpbGVyX3Vwc1tbInB2YWx1ZV9wbG90cyJdXVtbImJwcF9wbG90X292ZXIiXV0KaHNfY2xpbmljX2dwcm9maWxlcl91cHNbWyJwdmFsdWVfcGxvdHMiXV1bWyJtZnBfcGxvdF9vdmVyIl1dCmhzX2NsaW5pY19ncHJvZmlsZXJfdXBzW1sicHZhbHVlX3Bsb3RzIl1dW1sicmVhY3RvbWVfcGxvdF9vdmVyIl1dCgojI2hzX3RyeTIgPC0gc2ltcGxlX2dwcm9maWxlcjIodXBzKQoKaHNfY2xpbmljX2dwcm9maWxlcl9kb3ducyA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGRvd25zKQpoc19jbGluaWNfZ3Byb2ZpbGVyX2Rvd25zW1sicHZhbHVlX3Bsb3RzIl1dW1siYnBwX3Bsb3Rfb3ZlciJdXQpoc19jbGluaWNfZ3Byb2ZpbGVyX2Rvd25zW1sicHZhbHVlX3Bsb3RzIl1dW1sibWZwX3Bsb3Rfb3ZlciJdXQpoc19jbGluaWNfZ3Byb2ZpbGVyX2Rvd25zW1sicHZhbHVlX3Bsb3RzIl1dW1sicmVhY3RvbWVfcGxvdF9vdmVyIl1dCmBgYAoKIyMgUGVyZm9ybSBHU1ZBIG9uIHRoZSBjbGluaWNhbCBzYW1wbGVzCgpgYGB7ciBnc3ZhLCBmaWcuc2hvdyA9ICJoaWRlIn0KaHNfY2VsbHR5cGVfZ3N2YV9jMiA8LSBzbShzaW1wbGVfZ3N2YShpbmRpdmlkdWFsX2NlbGx0eXBlcykpCmhzX2NlbGx0eXBlX2dzdmFfYzJfc2lnIDwtIHNtKGdldF9zaWdfZ3N2YV9jYXRlZ29yaWVzKAogICAgaHNfY2VsbHR5cGVfZ3N2YV9jMiwKICAgIGV4Y2VsID0gImV4Y2VsL2luZGl2aWR1YWxfY2VsbHR5cGVzX2dzdmFfYzIueGxzeCIpKQoKYnJvYWRfYzcgPC0gR1NFQUJhc2U6OmdldEdtdCgicmVmZXJlbmNlL21zaWdkYi9jNy5hbGwudjcuMi5lbnRyZXouZ210IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uVHlwZSA9IEdTRUFCYXNlOjpCcm9hZENvbGxlY3Rpb24oY2F0ZWdvcnkgPSAiYzciKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lSWRUeXBlID0gR1NFQUJhc2U6OkVudHJleklkZW50aWZpZXIoKSkKaHNfY2VsbHR5cGVfZ3N2YV9jNyA8LSBzbShzaW1wbGVfZ3N2YShpbmRpdmlkdWFsX2NlbGx0eXBlcywgc2lnbmF0dXJlcyA9IGJyb2FkX2M3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zaWdfeG1sID0gInJlZmVyZW5jZS9tc2lnZGJfdjcuMi54bWwiLCBjb3JlcyA9IDEwKSkKaHNfY2VsbHR5cGVfZ3N2YV9jN19zaWcgPC0gc20oZ2V0X3NpZ19nc3ZhX2NhdGVnb3JpZXMoCiAgICBoc19jZWxsdHlwZV9nc3ZhX2M3LAogICAgZXhjZWwgPSAiZXhjZWwvaW5kaXZpZHVhbF9jZWxsdHlwZXNfZ3N2YV9jNy54bHN4IikpCmBgYAoKIyMjIFByaW50IHNvbWUgcGxvdHMgb2YgdGhlIEdTVkEgb3V0cHV0cwoKYGBge3IgZ3N2YV9wbG90c30KIyMgVGhlIHJhdyBoZWF0bWFwIG9mIHRoZSBDMiB2YWx1ZXMKaHNfY2VsbHR5cGVfZ3N2YV9jMl9zaWdbWyJyYXdfcGxvdCJdXQojIyBUaGUgJ3NpZ25pZmljYW5jZScgc2NvcmVzIG9mIHRoZSBDMiB2YWx1ZXMKaHNfY2VsbHR5cGVfZ3N2YV9jMl9zaWdbWyJzY29yZV9wbG90Il1dCiMjIFRoZSBzdWJzZXQgb2Ygc2NvcmVzIGZvciBjYXRlZ29yaWVzIGRlZW1lZCBzaWduaWZpY2FudGx5IGRpZmZlcmVudC4KaHNfY2VsbHR5cGVfZ3N2YV9jMl9zaWdbWyJzdWJzZXRfcGxvdCJdXQoKIyMgVGhlIHJhdyBoZWF0bWFwIG9mIHRoZSBDNyB2YWx1ZXMKaHNfY2VsbHR5cGVfZ3N2YV9jN19zaWdbWyJyYXdfcGxvdCJdXQojIyBUaGUgJ3NpZ25pZmljYW5jZScgc2NvcmVzIG9mIHRoZSBDNyB2YWx1ZXMKaHNfY2VsbHR5cGVfZ3N2YV9jN19zaWdbWyJzY29yZV9wbG90Il1dCiMjIFRoZSBzdWJzZXQgb2Ygc2NvcmVzIGZvciBjYXRlZ29yaWVzIGRlZW1lZCBzaWduaWZpY2FudGx5IGRpZmZlcmVudC4KaHNfY2VsbHR5cGVfZ3N2YV9jN19zaWdbWyJzdWJzZXRfcGxvdCJdXQpgYGAKCiMgSW5kaXZpZHVhbCBDZWxsIHR5cGVzCgpUaGUgZm9sbG93aW5nIGJsb2NrcyBzcGxpdCB0aGUgc2FtcGxlcyBpbnRvIGEgZmV3IGdyb3VwcyBieSBzYW1wbGUgdHlwZSBhbmQgbG9vawphdCB0aGUgZGlzdHJpYnV0aW9ucyBiZXR3ZWVuIHRoZW0uCgojIyBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzCgpHZXQgdG9wL2JvdHRvbSBuIGdlbmVzIGZvciBlYWNoIGNlbGwgdHlwZSwgdXNpbmcgY2xpbmljYWwgb3V0Y29tZSBhcyB0aGUgZmFjdG9yIG9mIGludGVyZXN0LgpGb3IgdGhlIG1vbWVudCwgdXNlIHN2YSBmb3IgdGhlIERFIGFuYWx5c2lzLgpQcm92aWRlIGNwbXMgZm9yIHRoZSB0b3AvYm90dG9tIG4gZ2VuZXMuCgpTdGFydCB3aXRoIHRvcC9ib3R0b20gMjAwLgpQZXJmb3JtIGRlZmF1bHQgbG9nRkMgYW5kIHAtdmFsdWUgYXMgd2VsbC4KCiMjIyBTaGFyZWQgY29udHJhc3RzCgpIZXJlIGlzIHRoZSBjb250cmFzdCB3ZSB3aWxsIHVzZSB0aHJvdWdocHV0LCBJIGFtIGxlYXZpbmcgb3BlbiB0aGUgb3B0aW9uIHRvIGFkZCBtb3JlLgoKYGBge3Iga2VlcGVyc30Ka2VlcGVycyA8LSBsaXN0KAogICJmYWlsX3ZzX2N1cmUiID0gYygiZmFpbHVyZSIsICJjdXJlIikpCmBgYAoKIyMgTW9ub2N5dGVzCgojIyMgRXZhbHVhdGUgTW9ub2N5dGUgc2FtcGxlcwoKYGBge3IgbW9ub2N5dGVzfQptb25vIDwtIHN1YnNldF9leHB0KGhzX3ZhbGlkLCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdtb25vY3l0ZXMnIikgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gImNsaW5pY2Fsb3V0Y29tZSIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJkb25vciIpICU+JQogIHNldF9leHB0X2NvbG9ycyhjb2xvcnMgPSBjaG9zZW5fY29sb3JzKQojIyBGSVhNRSBzZXRfZXhwdF9jb2xvcnMgc2hvdWxkIHNwZWFrIHVwIGlmIHRoZXJlIGFyZSBtaXNtYXRjaGVzIGhlcmUhISEKCnNhdmVfcmVzdWx0IDwtIHNhdmUobW9ubywgZmlsZSA9ICJyZGEvbW9ub2N5dGVfZXhwdC5yZGEiKQptb25vX25vcm0gPC0gbm9ybWFsaXplX2V4cHQobW9ubywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gImxvZzIiLCBub3JtID0gInF1YW50IikKcGx0IDwtIHBsb3RfcGNhKG1vbm9fbm9ybSwgcGxvdF9sYWJlbHMgPSBGQUxTRSkkcGxvdApwcChmaWxlID0gZ2x1ZSgiaW1hZ2VzL21vbm9fcGNhX25vcm1hbGl6ZWQtdnt2ZXJ9LnBkZiIpLCBpbWFnZSA9IHBsdCkKCm1vbm9fbmIgPC0gbm9ybWFsaXplX2V4cHQobW9ubywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgYmF0Y2ggPSAic3Zhc2VxIikKcGx0IDwtIHBsb3RfcGNhKG1vbm9fbmIsIHBsb3RfbGFiZWxzID0gRkFMU0UpJHBsb3QKcHAoZmlsZSA9IGdsdWUoImltYWdlcy9tb25vX3BjYV9ub3JtYWxpemVkX2JhdGNoLXZ7dmVyfS5wZGYiKSwgaW1hZ2UgPSBwbHQpCmBgYAoKIyMjIERFIG9mIE1vbm9jeXRlIHNhbXBsZXMKCiMjIyMgV2l0aG91dCBzdmEKCmBgYHtyIGRlX21vbm9jeXRlLCBmaWcuc2hvdyA9ICJoaWRlIn0KbW9ub19kZSA8LSBzbShhbGxfcGFpcndpc2UobW9ubywgbW9kZWxfYmF0Y2ggPSBGQUxTRSwgZmlsdGVyID0gVFJVRSkpCm1vbm9fdGFibGVzIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogICAgbW9ub19kZSwga2VlcGVycyA9IGtlZXBlcnMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL21vbm9jeXRlX2NsaW5pY2FsX2FsbF90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhID0gbW9ub190YWJsZXNbWyJkYXRhIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL21vbm9jeXRlX2NsaW5pY2FsX3RhYmxlLXZ7dmVyfS54bHN4IikpCm1vbm9fc2lnIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMobW9ub190YWJsZXMsIGFjY29yZGluZ190byA9ICJkZXNlcSIpKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goZGF0YSA9IG1vbm9fc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvbW9ub2N5dGVfY2xpbmljYWxfc2lndXAtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGEgPSBtb25vX3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvbW9ub2N5dGVfY2xpbmljYWxfc2lnZG93bi12e3Zlcn0ueGxzeCIpKQoKbW9ub19wY3Rfc2lnIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMobW9ub190YWJsZXMsIG4gPSAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxmYyA9IE5VTEwsIHAgPSBOVUxMLCBhY2NvcmRpbmdfdG8gPSAiZGVzZXEiKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGEgPSBtb25vX3BjdF9zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9tb25vY3l0ZV9jbGluaWNhbF9zaWd1cF9wY3Qtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGEgPSBtb25vX3BjdF9zaWdbWyJkZXNlcSJdXVtbImRvd25zIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL21vbm9jeXRlX2NsaW5pY2FsX3NpZ2Rvd25fcGN0LXZ7dmVyfS54bHN4IikpCm1vbm9fc2lnJHN1bW1hcnlfZGYKCiMjIFByaW50IG91dCBhIHRhYmxlIG9mIHRoZSBjcG0gdmFsdWVzIGZvciBvdGhlciBleHBsb3JhdGlvbnMuCm1vbm9fY3BtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KG1vbm8sIGNvbnZlcnQgPSAiY3BtIikpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhID0gZXhwcnMobW9ub19jcG0pLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9tb25vY3l0ZV9jcG1fYmVmb3JlX2JhdGNoLXZ7dmVyfS54bHN4IikpCm1vbm9fYmNwbSA8LSBzbShub3JtYWxpemVfZXhwdChtb25vLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gImNwbSIsIGJhdGNoID0gInN2YXNlcSIpKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goZGF0YSA9IGV4cHJzKG1vbm9fYmNwbSksCiAgICAgICAgICAgICAgICAgICAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL21vbm9jeXRlX2NwbV9hZnRlcl9iYXRjaC12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyMgV2l0aCBzdmEKCmBgYHtyIGRlX21vbm9fc3ZhLCBmaWcuc2hvdyA9ICJoaWRlIn0KbW9ub19kZV9zdmEgPC0gc20oYWxsX3BhaXJ3aXNlKG1vbm8sIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpKQptb25vX3RhYmxlc19zdmEgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgICBtb25vX2RlX3N2YSwga2VlcGVycyA9IGtlZXBlcnMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL21vbm9jeXRlX2NsaW5pY2FsX2FsbF90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpKQptb25vX3NpZ19zdmEgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIG1vbm9fdGFibGVzX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvbW9ub2N5dGVfY2xpbmljYWxfc2lnX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSwKICAgIGFjY29yZGluZ190byA9ICJkZXNlcSIpKQpgYGAKCiMjIyMgTW9ub2N5dGUgREUgcGxvdHMKCkZpcnN0IHByaW50IG91dCB0aGUgREUgcGxvdHMgd2l0aG91dCBhbmQgdGhlbiB3aXRoIHN2YSBlc3RpbWF0ZXMuCgpgYGB7ciBtb25vX2RlX3Bsb3RzfQojIyBERVNlcTIgTUEgcGxvdCBvZiBmYWlsdXJlIC8gY3VyZQptb25vX3RhYmxlc1tbInBsb3RzIl1dW1siZmFpbF92c19jdXJlIl1dW1siZGVzZXFfbWFfcGxvdHMiXV0kcGxvdAoKIyMgREVTZXEyIFZvbGNhbm8gcGxvdCBvZiBmYWlsdXJlIC8gY3VyZQptb25vX3RhYmxlc1tbInBsb3RzIl1dW1siZmFpbF92c19jdXJlIl1dW1siZGVzZXFfdm9sX3Bsb3RzIl1dJHBsb3QKCiMjIERFU2VxMiBNQSBwbG90IG9mIGZhaWx1cmUgLyBjdXJlIHdpdGggc3Zhc2VxCm1vbm9fdGFibGVzX3N2YVtbInBsb3RzIl1dW1siZmFpbF92c19jdXJlIl1dW1siZGVzZXFfbWFfcGxvdHMiXV0kcGxvdAoKIyMgREVTZXEyIFZvbGNhbm8gcGxvdCBvZiBmYWlsdXJlIC8gY3VyZSB3aXRoIHN2YXNlcQptb25vX3RhYmxlc19zdmFbWyJwbG90cyJdXVtbImZhaWxfdnNfY3VyZSJdXVtbImRlc2VxX3ZvbF9wbG90cyJdXSRwbG90CmBgYAoKIyMjIyBNb25vY3l0ZSBvbnRvbG9neSBzZWFyY2gKCmBgYHtyIG1vbm9fZ3Byb2ZpbGVyfQp1cHMgPC0gbW9ub19zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbImZhaWxfdnNfY3VyZSJdXQpkb3ducyA8LSBtb25vX3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bWyJmYWlsX3ZzX2N1cmUiXV0KCm1vbm9fdXBfZ3AgPC0gc2ltcGxlX2dwcm9maWxlcihzaWdfZ2VuZXMgPSB1cHMpCm1vbm9fdXBfZ3BbWyJwdmFsdWVfcGxvdHMiXV1bWyJicHBfcGxvdF9vdmVyIl1dCm1vbm9fdXBfZ3BbWyJwdmFsdWVfcGxvdHMiXV1bWyJtZnBfcGxvdF9vdmVyIl1dCm1vbm9fdXBfZ3BbWyJwdmFsdWVfcGxvdHMiXV1bWyJyZWFjdG9tZV9wbG90X292ZXIiXV0KCm1vbm9fZG93bl9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHNpZ19nZW5lcyA9IGRvd25zKQptb25vX2Rvd25fZ3BbWyJwdmFsdWVfcGxvdHMiXV1bWyJicHBfcGxvdF9vdmVyIl1dCm1vbm9fZG93bl9ncFtbInB2YWx1ZV9wbG90cyJdXVtbIm1mcF9wbG90X292ZXIiXV0KbW9ub19kb3duX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1sicmVhY3RvbWVfcGxvdF9vdmVyIl1dCmBgYAoKIyMjIyBNb25vY3l0ZSBNU2lnREIgcXVlcnkKCmBgYHtyIG1zaWdfbW9ub19nb3NlcSwgZmlnLnNob3cgPSAiaGlkZSJ9CmJyb2FkX2M3IDwtIEdTRUFCYXNlOjpnZXRHbXQoInJlZmVyZW5jZS9tc2lnZGIvYzcuYWxsLnY3LjIuZW50cmV6LmdtdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvblR5cGUgPSBHU0VBQmFzZTo6QnJvYWRDb2xsZWN0aW9uKGNhdGVnb3J5ID0gImM3IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZUlkVHlwZSA9IEdTRUFCYXNlOjpFbnRyZXpJZGVudGlmaWVyKCkpCgptb25vX3VwX2dvc2VxX21zaWcgPC0gZ29zZXFfbXNpZ2RiKHNpZ19nZW5lcyA9IHVwcywgc2lnbmF0dXJlcyA9IGJyb2FkX2M3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZV9jYXRlZ29yeSA9ICJjNyIsIGxlbmd0aF9kYiA9IGhzX2xlbmd0aCkKCm1vbm9fZG93bl9nb3NlcV9tc2lnIDwtIGdvc2VxX21zaWdkYihzaWdfZ2VuZXMgPSBkb3ducywgc2lnbmF0dXJlcyA9IGJyb2FkX2M3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlX2NhdGVnb3J5ID0gImM3IiwgbGVuZ3RoX2RiID0gaHNfbGVuZ3RoKQpgYGAKCiMjIyMgUGxvdCBvZiBzaW1pbGFyIGV4cGVyaW1lbnRzCgpgYGB7ciBtc2lnX3Bsb3RzfQojIyBNb25vY3l0ZSBnZW5lcyB3aXRoIGluY3JlYXNlZCBleHByZXNzaW9uIGluIHRoZSBmYWlsZWQgc2FtcGxlcwojIyBzaGFyZSBnZW5lcyB3aXRoIHRoZSBmb2xsb3dpbmcgZXhwZXJpbWVudHMKbW9ub191cF9nb3NlcV9tc2lnW1sicHZhbHVlX3Bsb3RzIl1dW1sibWZwX3Bsb3Rfb3ZlciJdXQoKIyMgTW9ub2N5dGUgZ2VuZXMgd2l0aCBpbmNyZWFzZWQgZXhwcmVzc2lvbiBpbiB0aGUgY3VyZWQgc2FtcGxlcwojIyBzaGFyZSBnZW5lcyB3aXRoIHRoZSBmb2xsb3dpbmcgZXhwZXJpbWVudHMKbW9ub19kb3duX2dvc2VxX21zaWdbWyJwdmFsdWVfcGxvdHMiXV1bWyJtZnBfcGxvdF9vdmVyIl1dCmBgYAoKIyMjIEV2YWx1YXRlIE5ldXRyb3BoaWwgc2FtcGxlcwoKYGBge3IgbmV1dHJvcGhpbHN9Cm5ldXQgPC0gc3Vic2V0X2V4cHQoaHNfdmFsaWQsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscz09J25ldXRyb3BoaWxzJyIpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJjbGluaWNhbG91dGNvbWUiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAiZG9ub3IiKSAlPiUKICBzZXRfZXhwdF9jb2xvcnMoY29sb3JzID0gY2hvc2VuX2NvbG9ycykKCnNhdmVfcmVzdWx0IDwtIHNhdmUobmV1dCwgZmlsZSA9ICJyZGEvbmV1dHJvcGhpbF9leHB0LnJkYSIpCm5ldXRfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChuZXV0LCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIHRyYW5zZm9ybSA9ICJsb2cyIikpCnBsdCA8LSBwbG90X3BjYShuZXV0X25vcm0sIHBsb3RfbGFiZWxzID0gRkFMU0UpJHBsb3QKcHAoZmlsZSA9IGdsdWUoImltYWdlcy9uZXV0X3BjYV9ub3JtYWxpemVkLXZ7dmVyfS5wZGYiKSwgaW1hZ2UgPSBwbHQpCgpuZXV0X25iIDwtIHNtKG5vcm1hbGl6ZV9leHB0KG5ldXQsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGJhdGNoID0gInN2YXNlcSIpKQpwbHQgPC0gcGxvdF9wY2EobmV1dF9uYiwgcGxvdF9sYWJlbHMgPSBGQUxTRSkkcGxvdApwcChmaWxlID0gZ2x1ZSgiaW1hZ2VzL25ldXRfcGNhX25vcm1hbGl6ZWRfc3Zhc2VxLXZ7dmVyfS5wZGYiKSwgaW1hZ2UgPSBwbHQpCmBgYAoKIyMjIERFIG9mIE5ldHJvcGhpbCBzYW1wbGVzCgojIyMjIFdpdGhvdXQgc3ZhCgpgYGB7ciBuZXV0cm9waGlsX2RlLCBmaWcuc2hvdyA9ICJoaWRlIn0KbmV1dF9kZSA8LSBzbShhbGxfcGFpcndpc2UobmV1dCwgbW9kZWxfYmF0Y2ggPSBGQUxTRSwgZmlsdGVyID0gVFJVRSkpCm5ldXRfdGFibGVzIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogICAgbmV1dF9kZSwga2VlcGVycyA9IGtlZXBlcnMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL25ldXRyb3BoaWxfY2xpbmljYWxfYWxsX3RhYmxlcy12e3Zlcn0ueGxzeCIpKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGEgPSBuZXV0X3RhYmxlc1tbImRhdGEiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvbmV1dHJvcGhpbF9jbGluaWNhbF90YWJsZS12e3Zlcn0ueGxzeCIpKQpuZXV0X3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKG5ldXRfdGFibGVzLCBhY2NvcmRpbmdfdG8gPSAiZGVzZXEiKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGEgPSBuZXV0X3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL25ldXRyb3BoaWxfY2xpbmljYWxfc2lndXAtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGEgPSBuZXV0X3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvbmV1dHJvcGhpbF9jbGluaWNhbF9zaWdkb3duLXZ7dmVyfS54bHN4IikpCgpuZXV0X3BjdF9zaWcgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhuZXV0X3RhYmxlcywgbiA9IDIwMCwgbGZjID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IE5VTEwsIGFjY29yZGluZ190byA9ICJkZXNlcSIpKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goZGF0YSA9IG5ldXRfc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvbmV1dHJvcGhpbF9jbGluaWNhbF9zaWd1cF9wY3Qtdnt2ZXJ9Lnhsc3giKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGEgPSBuZXV0X3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvbmV1dHJvcGhpbF9jbGluaWNhbF9zaWdkb3duX3BjdC12e3Zlcn0ueGxzeCIpKQpuZXV0X2NwbSA8LSBzbShub3JtYWxpemVfZXhwdChuZXV0LCBjb252ZXJ0ID0gImNwbSIpKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goZGF0YSA9IGV4cHJzKG5ldXRfY3BtKSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvbmV1dHJvcGhpbF9jcG1fYmVmb3JlX2JhdGNoLXZ7dmVyfS54bHN4IikpCm5ldXRfYmNwbSA8LSBzbShub3JtYWxpemVfZXhwdChuZXV0LCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiLCBjb252ZXJ0ID0gImNwbSIpKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goZGF0YSA9IGV4cHJzKG5ldXRfYmNwbSksCiAgICAgICAgICAgICAgICAgICAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL25ldXRyb3BoaWxfY3BtX2FmdGVyX2JhdGNoLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIyBXaXRoIHN2YQoKYGBge3IgZGVfbmV1dF9zdmEsIGZpZy5zaG93ID0gImhpZGUifQpuZXV0X2RlX3N2YSA8LSBzbShhbGxfcGFpcndpc2UobmV1dCwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkpCm5ldXRfdGFibGVzX3N2YSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICAgIG5ldXRfZGVfc3ZhLCBrZWVwZXJzID0ga2VlcGVycywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvbmV1dHJvcGhpbF9jbGluaWNhbF9hbGxfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKSkKbmV1dF9zaWdfc3ZhIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICBuZXV0X3RhYmxlc19zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL25ldXRyb3BoaWxfY2xpbmljYWxfc2lnX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSwKICAgIGFjY29yZGluZ190byA9ICJkZXNlcSIpKQpgYGAKCiMjIyMgTmV1dHJvcGhpbCBERSBwbG90cwoKYGBge3IgbmV1dF9kZV9wbG90c30KIyMgREVTZXEyIE1BIHBsb3Qgb2YgZmFpbHVyZSAvIGN1cmUKbmV1dF90YWJsZXNbWyJwbG90cyJdXVtbImZhaWxfdnNfY3VyZSJdXVtbImRlc2VxX21hX3Bsb3RzIl1dJHBsb3QKCiMjIERFU2VxMiBWb2xjYW5vIHBsb3Qgb2YgZmFpbHVyZSAvIGN1cmUKbmV1dF90YWJsZXNbWyJwbG90cyJdXVtbImZhaWxfdnNfY3VyZSJdXVtbImRlc2VxX3ZvbF9wbG90cyJdXSRwbG90CgojIyBERVNlcTIgTUEgcGxvdCBvZiBmYWlsdXJlIC8gY3VyZSB3aXRoIHN2YQpuZXV0X3RhYmxlc19zdmFbWyJwbG90cyJdXVtbImZhaWxfdnNfY3VyZSJdXVtbImRlc2VxX21hX3Bsb3RzIl1dJHBsb3QKCiMjIERFU2VxMiBWb2xjYW5vIHBsb3Qgb2YgZmFpbHVyZSAvIGN1cmUgd2l0aCBzdmEKbmV1dF90YWJsZXNfc3ZhW1sicGxvdHMiXV1bWyJmYWlsX3ZzX2N1cmUiXV1bWyJkZXNlcV92b2xfcGxvdHMiXV0kcGxvdApgYGAKCiMjIyMgTmV1dHJvcGhpbCBvbnRvbG9neSBzZWFyY2gKCmBgYHtyIG5ldXRfZ3B9CnVwcyA8LSBuZXV0X3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1siZmFpbF92c19jdXJlIl1dCmRvd25zIDwtIG5ldXRfc2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbImZhaWxfdnNfY3VyZSJdXQoKbmV1dF91cF9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHNpZ19nZW5lcyA9IHVwcykKbmV1dF91cF9ncFtbInB2YWx1ZV9wbG90cyJdXVtbImJwcF9wbG90X292ZXIiXV0KbmV1dF91cF9ncFtbInB2YWx1ZV9wbG90cyJdXVtbIm1mcF9wbG90X292ZXIiXV0KbmV1dF91cF9ncFtbInB2YWx1ZV9wbG90cyJdXVtbInJlYWN0b21lX3Bsb3Rfb3ZlciJdXQoKbmV1dF9kb3duX2dwIDwtIHNpbXBsZV9ncHJvZmlsZXIoZG93bnMpCm5ldXRfZG93bl9ncFtbInB2YWx1ZV9wbG90cyJdXVtbImJwcF9wbG90X292ZXIiXV0KbmV1dF9kb3duX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1sibWZwX3Bsb3Rfb3ZlciJdXQpuZXV0X2Rvd25fZ3BbWyJwdmFsdWVfcGxvdHMiXV1bWyJyZWFjdG9tZV9wbG90X292ZXIiXV0KYGBgCgojIyMjIE5ldXRyb3BoaWwgR1NWQSBxdWVyeQoKYGBge3IgbXNpZ19uZXV0X2dvc2VxLCBmaWcuc2hvdyA9ICJoaWRlIn0KbmV1dF91cF9nb3NlcV9tc2lnIDwtIGdvc2VxX21zaWdkYihzaWdfZ2VuZXMgPSB1cHMsIHNpZ25hdHVyZXMgPSBicm9hZF9jNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVfY2F0ZWdvcnkgPSAiYzciLCBsZW5ndGhfZGIgPSBoc19sZW5ndGgpCgpuZXV0X2Rvd25fZ29zZXFfbXNpZyA8LSBnb3NlcV9tc2lnZGIoc2lnX2dlbmVzID0gZG93bnMsIHNpZ25hdHVyZXMgPSBicm9hZF9jNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZV9jYXRlZ29yeSA9ICJjNyIsIGxlbmd0aF9kYiA9IGhzX2xlbmd0aCkKYGBgCgojIyMjIFBsb3Qgb2Ygc2ltaWxhciBleHBlcmltZW50cwoKYGBge3IgbXNpZ19wbG90c19uZXV0fQojIyBOZXV0cm9waGlsIGdlbmVzIHdpdGggaW5jcmVhc2VkIGV4cHJlc3Npb24gaW4gdGhlIGZhaWxlZCBzYW1wbGVzCiMjIHNoYXJlIGdlbmVzIHdpdGggdGhlIGZvbGxvd2luZyBleHBlcmltZW50cwpuZXV0X3VwX2dvc2VxX21zaWdbWyJwdmFsdWVfcGxvdHMiXV1bWyJtZnBfcGxvdF9vdmVyIl1dCgojIyBOZXV0cm9waGlsIGdlbmVzIHdpdGggaW5jcmVhc2VkIGV4cHJlc3Npb24gaW4gdGhlIGN1cmVkIHNhbXBsZXMKIyMgc2hhcmUgZ2VuZXMgd2l0aCB0aGUgZm9sbG93aW5nIGV4cGVyaW1lbnRzCm5ldXRfZG93bl9nb3NlcV9tc2lnW1sicHZhbHVlX3Bsb3RzIl1dW1sibWZwX3Bsb3Rfb3ZlciJdXQpgYGAKCiMjIEVvc2lub3BoaWxzCgojIyMgRXZhbHVhdGUgRW9zaW5vcGhpbCBzYW1wbGVzCgpgYGB7ciBlb3Npbm9waGlsc30KZW8gPC0gc3Vic2V0X2V4cHQoaHNfdmFsaWQsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscz09J2Vvc2lub3BoaWxzJyIpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJjbGluaWNhbG91dGNvbWUiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAiZG9ub3IiKSAlPiUKICBzZXRfZXhwdF9jb2xvcnMoY29sb3JzID0gY2hvc2VuX2NvbG9ycykKCnNhdmVfcmVzdWx0IDwtIHNhdmUoZW8sIGZpbGUgPSAicmRhL2Vvc2lub3BoaWxfZXhwdC5yZGEiKQplb19ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGVvLCBjb252ZXJ0ID0gImNwbSIsIHRyYW5zZm9ybSA9ICJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkpCnBsdCA8LSBwbG90X3BjYShlb19ub3JtLCBwbG90X2xhYmVscyA9IEZBTFNFKSRwbG90CnBwKGZpbGUgPSBnbHVlKCJpbWFnZXMvZW9fcGNhX25vcm1hbGl6ZWQtdnt2ZXJ9LnBkZiIpLCBpbWFnZSA9IHBsdCkKCmVvX25iIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGVvLCBjb252ZXJ0ID0gImNwbSIsIHRyYW5zZm9ybSA9ICJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikpCnBsb3RfcGNhKGVvX25iKSRwbG90CmBgYAoKIyMjIERFIG9mIEVvc2lub3BoaWwgc2FtcGxlcwoKIyMjIyBXaXRob3V0aCBzdmEKCmBgYHtyIGVvc2lub3BoaWxfZGUsIGZpZy5zaG93ID0gImhpZGUifQplb19kZSA8LSBzbShhbGxfcGFpcndpc2UoZW8sIG1vZGVsX2JhdGNoID0gRkFMU0UsIGZpbHRlciA9IFRSVUUpKQplb190YWJsZXMgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgICBlb19kZSwga2VlcGVycyA9IGtlZXBlcnMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL2Vvc2lub3BoaWxfY2xpbmljYWxfYWxsX3RhYmxlcy12e3Zlcn0ueGxzeCIpKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGEgPSBlb190YWJsZXNbWyJkYXRhIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL2Vvc2lub3BoaWxfY2xpbmljYWxfdGFibGUtdnt2ZXJ9Lnhsc3giKSkKZW9fc2lnIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoZW9fdGFibGVzLCBhY2NvcmRpbmdfdG8gPSAiZGVzZXEiKSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGEgPSBlb19zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9lb3Npbm9waGlsX2NsaW5pY2FsX3NpZ3VwLXZ7dmVyfS54bHN4IikpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhID0gZW9fc2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9lb3Npbm9waGlsX2NsaW5pY2FsX3NpZ2Rvd24tdnt2ZXJ9Lnhsc3giKSkKCmVvX3BjdF9zaWcgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhlb190YWJsZXMsIG4gPSAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZmMgPSBOVUxMLCBwID0gTlVMTCwgYWNjb3JkaW5nX3RvID0gImRlc2VxIikpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhID0gZW9fcGN0X3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL2Vvc2lub3BoaWxfY2xpbmljYWxfc2lndXBfcGN0LXZ7dmVyfS54bHN4IikpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhID0gZW9fcGN0X3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvZW9zaW5vcGhpbF9jbGluaWNhbF9zaWdkb3duX3BjdC12e3Zlcn0ueGxzeCIpKQoKZW9fY3BtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGVvLCBjb252ZXJ0ID0gImNwbSIpKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goZGF0YSA9IGV4cHJzKGVvX2NwbSksCiAgICAgICAgICAgICAgICAgICAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL2Vvc2lub3BoaWxfY3BtX2JlZm9yZV9iYXRjaC12e3Zlcn0ueGxzeCIpKQplb19iY3BtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGVvLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiLCBjb252ZXJ0ID0gImNwbSIpKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goZGF0YSA9IGV4cHJzKGVvX2JjcG0pLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9lb3Npbm9waGlsX2NwbV9hZnRlcl9iYXRjaC12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyMgV2l0aCBzdmEKCmBgYHtyIGRlX2VvX3N2YSwgZmlnLnNob3cgPSAiaGlkZSJ9CmVvX2RlX3N2YSA8LSBzbShhbGxfcGFpcndpc2UoZW8sIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpKQplb190YWJsZXNfc3ZhIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogICAgZW9fZGVfc3ZhLCBrZWVwZXJzID0ga2VlcGVycywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvZW9zaW5vcGhpbF9jbGluaWNhbF9hbGxfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKSkKZW9fc2lnX3N2YSA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgZW9fdGFibGVzX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvZW9zaW5vcGhpbF9jbGluaWNhbF9zaWdfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpLAogICAgYWNjb3JkaW5nX3RvID0gImRlc2VxIikpCmBgYAoKIyMjIyBFb3Npbm9waGlsIERFIHBsb3RzCgpgYGB7ciBlb19kZV9wbG90c30KIyMgREVTZXEyIE1BIHBsb3Qgb2YgZmFpbHVyZSAvIGN1cmUKZW9fdGFibGVzW1sicGxvdHMiXV1bWyJmYWlsX3ZzX2N1cmUiXV1bWyJkZXNlcV9tYV9wbG90cyJdXSRwbG90CgojIyBERVNlcTIgVm9sY2FubyBwbG90IG9mIGZhaWx1cmUgLyBjdXJlCmVvX3RhYmxlc1tbInBsb3RzIl1dW1siZmFpbF92c19jdXJlIl1dW1siZGVzZXFfdm9sX3Bsb3RzIl1dJHBsb3QKCiMjIERFU2VxMiBNQSBwbG90IG9mIGZhaWx1cmUgLyBjdXJlIHdpdGggc3ZhCmVvX3RhYmxlc19zdmFbWyJwbG90cyJdXVtbImZhaWxfdnNfY3VyZSJdXVtbImRlc2VxX21hX3Bsb3RzIl1dJHBsb3QKCiMjIERFU2VxMiBWb2xjYW5vIHBsb3Qgb2YgZmFpbHVyZSAvIGN1cmUgd2l0aCBzdmEKZW9fdGFibGVzX3N2YVtbInBsb3RzIl1dW1siZmFpbF92c19jdXJlIl1dW1siZGVzZXFfdm9sX3Bsb3RzIl1dJHBsb3QKYGBgCgojIyMjIEVvc2lub3BoaWwgb250b2xvZ3kgc2VhcmNoCgpgYGB7ciBlb19ncHJvZmlsZXJ9CnVwcyA8LSBlb19zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbImZhaWxfdnNfY3VyZSJdXQpkb3ducyA8LSBlb19zaWdbWyJkZXNlcSJdXVtbImRvd25zIl1dW1siZmFpbF92c19jdXJlIl1dCgplb191cF9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHNpZ19nZW5lcyA9IHVwcykKZW9fdXBfZ3BbWyJwdmFsdWVfcGxvdHMiXV1bWyJicHBfcGxvdF9vdmVyIl1dCmVvX3VwX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1sibWZwX3Bsb3Rfb3ZlciJdXQplb191cF9ncFtbInB2YWx1ZV9wbG90cyJdXVtbInJlYWN0b21lX3Bsb3Rfb3ZlciJdXQoKZW9fZG93bl9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGRvd25zKQplb19kb3duX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1siYnBwX3Bsb3Rfb3ZlciJdXQplb19kb3duX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1sibWZwX3Bsb3Rfb3ZlciJdXQplb19kb3duX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1sicmVhY3RvbWVfcGxvdF9vdmVyIl1dCmBgYAoKIyMjIyBFb3Npbm9waGlsIE1TaWdEQiBxdWVyeQoKYGBge3IgbXNpZ19lb19nb3NlcSwgZmlnLnNob3cgPSAiaGlkZSJ9CmVvX3VwX2dvc2VxX21zaWcgPC0gZ29zZXFfbXNpZ2RiKHNpZ19nZW5lcyA9IHVwcywgc2lnbmF0dXJlcyA9IGJyb2FkX2M3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVfY2F0ZWdvcnkgPSAiYzciLCBsZW5ndGhfZGIgPSBoc19sZW5ndGgpCgplb19kb3duX2dvc2VxX21zaWcgPC0gZ29zZXFfbXNpZ2RiKHNpZ19nZW5lcyA9IGRvd25zLCBzaWduYXR1cmVzID0gYnJvYWRfYzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlX2NhdGVnb3J5ID0gImM3IiwgbGVuZ3RoX2RiID0gaHNfbGVuZ3RoKQpgYGAKCiMjIyMgUGxvdCBvZiBzaW1pbGFyIGV4cGVyaW1lbnRzCgpgYGB7ciBtc2lnX3Bsb3RzX2VvfQojIyBFb3Npbm9waGlsIGdlbmVzIHdpdGggaW5jcmVhc2VkIGV4cHJlc3Npb24gaW4gdGhlIGZhaWxlZCBzYW1wbGVzCiMjIHNoYXJlIGdlbmVzIHdpdGggdGhlIGZvbGxvd2luZyBleHBlcmltZW50cwplb191cF9nb3NlcV9tc2lnW1sicHZhbHVlX3Bsb3RzIl1dW1sibWZwX3Bsb3Rfb3ZlciJdXQoKIyMgRW9zaW5vcGhpbCBnZW5lcyB3aXRoIGluY3JlYXNlZCBleHByZXNzaW9uIGluIHRoZSBjdXJlZCBzYW1wbGVzCiMjIHNoYXJlIGdlbmVzIHdpdGggdGhlIGZvbGxvd2luZyBleHBlcmltZW50cwplb19kb3duX2dvc2VxX21zaWdbWyJwdmFsdWVfcGxvdHMiXV1bWyJtZnBfcGxvdF9vdmVyIl1dCmBgYAoKIyMgQmlvcHNpZXMKCiMjIyBFdmFsdWF0ZSBCaW9wc3kgc2FtcGxlcwoKYGBge3IgYmlvcHNpZXN9CmJpb3AgPC0gc3Vic2V0X2V4cHQoaHNfdmFsaWQsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscz09J2Jpb3BzeSciKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3QgPSAiY2xpbmljYWxvdXRjb21lIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gImRvbm9yIikgJT4lCiAgc2V0X2V4cHRfY29sb3JzKGNvbG9ycyA9IGNob3Nlbl9jb2xvcnMpCgpzYXZlX3Jlc3VsdCA8LSBzYXZlKGJpb3AsIGZpbGUgPSAicmRhL2Jpb3BzeV9leHB0LnJkYSIpCmJpb3Bfbm9ybSA8LSBub3JtYWxpemVfZXhwdChiaW9wLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIG5vcm0gPSAicXVhbnQiKQpwbHQgPC0gcGxvdF9wY2EoYmlvcF9ub3JtLCBwbG90X2xhYmVscyA9IEZBTFNFKSRwbG90CnBwKGZpbGUgPSBnbHVlKCJpbWFnZXMvYmlvcF9wY2Ffbm9ybWFsaXplZC12e3Zlcn0ucGRmIiksIGltYWdlID0gcGx0KQoKYmlvcF9uYiA8LSBzbShub3JtYWxpemVfZXhwdChiaW9wLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gImxvZzIiLCBiYXRjaCA9ICJzdmFzZXEiKSkKcGx0IDwtIHBsb3RfcGNhKGJpb3BfbmIsIHBsb3RfbGFiZWxzID0gRkFMU0UpJHBsb3QKcHAoZmlsZSA9IGdsdWUoImltYWdlcy9iaW9wX3BjYV9ub3JtYWxpemVkX3N2YXNlcS12e3Zlcn0ucGRmIiksIGltYWdlID0gcGx0KQpgYGAKCiMjIyBERSBvZiBCaW9wc3kgc2FtcGxlcwoKIyMjIyBXaXRob3V0IHN2YQoKYGBge3IgZGVfYmlvcHN5LCBmaWcuc2hvdyA9ICJoaWRlIn0KYmlvcF9kZSA8LSBzbShhbGxfcGFpcndpc2UoYmlvcCwgbW9kZWxfYmF0Y2ggPSBGQUxTRSwgZmlsdGVyID0gVFJVRSkpCmJpb3BfdGFibGVzIDwtIGNvbWJpbmVfZGVfdGFibGVzKGJpb3BfZGUsIGtlZXBlcnMgPSBrZWVwZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL2Jpb3BzeV9jbGluaWNhbF9hbGxfdGFibGVzLXZ7dmVyfS54bHN4IikpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhID0gYmlvcF90YWJsZXNbWyJkYXRhIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL2Jpb3BzeV9jbGluaWNhbF90YWJsZS12e3Zlcn0ueGxzeCIpKQpiaW9wX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKGJpb3BfdGFibGVzLCBhY2NvcmRpbmdfdG8gPSAiZGVzZXEiKQojI3dyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhID0gYmlvcF9zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbMV1dLAojIyAgICAgICAgICAgICAgICAgICAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL2Jpb3BzeV9jbGluaWNhbF9zaWd1cC12e3Zlcn0ueGxzeCIpKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goZGF0YSA9IGJpb3Bfc2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9iaW9wc3lfY2xpbmljYWxfc2lnZG93bi12e3Zlcn0ueGxzeCIpKQpiaW9wX3BjdF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhiaW9wX3RhYmxlcywgbiA9IDIwMCwgbGZjID0gTlVMTCwgcCA9IE5VTEwsIGFjY29yZGluZ190byA9ICJkZXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhID0gYmlvcF9wY3Rfc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvYmlvcHN5X2NsaW5pY2FsX3NpZ3VwX3BjdC12e3Zlcn0ueGxzeCIpKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goZGF0YSA9IGJpb3BfcGN0X3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvYmlvcHN5X2NsaW5pY2FsX3NpZ2Rvd25fcGN0LXZ7dmVyfS54bHN4IikpCgpiaW9wX2NwbSA8LSBzbShub3JtYWxpemVfZXhwdChiaW9wLCBjb252ZXJ0ID0gImNwbSIpKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goZGF0YSA9IGV4cHJzKGJpb3BfY3BtKSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvYmlvcHN5X2NwbV9iZWZvcmVfYmF0Y2gtdnt2ZXJ9Lnhsc3giKSkKYmlvcF9iY3BtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGJpb3AsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIsIGNvbnZlcnQgPSAiY3BtIikpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeChkYXRhID0gZXhwcnMoYmlvcF9iY3BtKSwKICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvYmlvcHN5X2NwbV9hZnRlcl9iYXRjaC12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyMgd2l0aCBzdmEKCmBgYHtyIGRlX2Jpb3BzeV9zdmEsIGZpZy5zaG93ID0gImhpZGUifQpiaW9wX2RlX3N2YSA8LSBzbShhbGxfcGFpcndpc2UoYmlvcCwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkpCmJpb3BfdGFibGVzX3N2YSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICAgIGJpb3BfZGVfc3ZhLCBrZWVwZXJzID0ga2VlcGVycywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvYmlvcHN5X2NsaW5pY2FsX2FsbF90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpKQpiaW9wX3NpZ19zdmEgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIGJpb3BfdGFibGVzX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvYmlvcHN5X2NsaW5pY2FsX3NpZ190YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IiksCiAgICBhY2NvcmRpbmdfdG8gPSAiZGVzZXEiKSkKYGBgCgojIyMjIEJpb3BzeSBERSBwbG90cwoKYGBge3IgYmlvcF9kZV9wbG90c30KIyMgREVTZXEyIE1BIHBsb3Qgb2YgZmFpbHVyZSAvIGN1cmUKYmlvcF90YWJsZXNbWyJwbG90cyJdXVtbImZhaWxfdnNfY3VyZSJdXVtbImRlc2VxX21hX3Bsb3RzIl1dJHBsb3QKCiMjIERFU2VxMiBWb2xjYW5vIHBsb3Qgb2YgZmFpbHVyZSAvIGN1cmUKYmlvcF90YWJsZXNbWyJwbG90cyJdXVtbImZhaWxfdnNfY3VyZSJdXVtbImRlc2VxX3ZvbF9wbG90cyJdXSRwbG90CgojIyBERVNlcTIgTUEgcGxvdCBvZiBmYWlsdXJlIC8gY3VyZQpiaW9wX3RhYmxlc19zdmFbWyJwbG90cyJdXVtbImZhaWxfdnNfY3VyZSJdXVtbImRlc2VxX21hX3Bsb3RzIl1dJHBsb3QKCiMjIERFU2VxMiBWb2xjYW5vIHBsb3Qgb2YgZmFpbHVyZSAvIGN1cmUKYmlvcF90YWJsZXNfc3ZhW1sicGxvdHMiXV1bWyJmYWlsX3ZzX2N1cmUiXV1bWyJkZXNlcV92b2xfcGxvdHMiXV0kcGxvdApgYGAKCiMgTG9vayBmb3Igc2hhcmVkIGdlbmVzIGFtb25nIE1vbm9jeXRlcy9OZXV0cm9waGlscy9Fb3Npbm9waGlscwoKV2UgaGF2ZSB0aHJlZSB2YXJpYWJsZXMgY29udGFpbmluZyB0aGUgJ3NpZ25pZmljYW50JyBERSBnZW5lcyBmb3IgdGhlCnRocmVlIGNlbGwgdHlwZXMuICBGb3IgdGhpcyBJIGFtIGNob29zaW5nIChmb3IgdGhlIG1vbWVudCkgdG8gdXNlIHRoZQpzdmEgZGF0YS4KCmBgYHtyIHNoYXJlZF9ieV90eXBlfQojIyBtb25vX3NpZ19zdmEsIG5ldXRfc2lnX3N2YSwgZW9fc2lnX3N2YQpzaWdfdmVjdG9ycyA8LSBsaXN0KAogICAgIm1vbm9jeXRlcyIgPSBjKHJvd25hbWVzKG1vbm9fc2lnX3N2YVtbImRlc2VxIl1dW1sidXBzIl1dW1siZmFpbF92c19jdXJlIl1dKSwKICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhtb25vX3NpZ19zdmFbWyJkZXNlcSJdXVtbImRvd25zIl1dW1siZmFpbF92c19jdXJlIl1dKSksCiAgICAibmV1dHJvcGhpbHMiID0gYyhyb3duYW1lcyhuZXV0X3NpZ19zdmFbWyJkZXNlcSJdXVtbInVwcyJdXVtbImZhaWxfdnNfY3VyZSJdXSksCiAgICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhuZXV0X3NpZ19zdmFbWyJkZXNlcSJdXVtbImRvd25zIl1dW1siZmFpbF92c19jdXJlIl1dKSksCiAgICAiZW9zaW5vcGhpbHMiID0gIGMocm93bmFtZXMoZW9fc2lnX3N2YVtbImRlc2VxIl1dW1sidXBzIl1dW1siZmFpbF92c19jdXJlIl1dKSwKICAgICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhlb19zaWdfc3ZhW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbImZhaWxfdnNfY3VyZSJdXSkpKQoKc2hhcmVkX3ZlY3RvciA8LSBWZW5uZXJhYmxlOjpWZW5uKFNldHMgPSBzaWdfdmVjdG9ycykKVmVubmVyYWJsZTo6cGxvdChzaGFyZWRfdmVjdG9yLCBkb1dlaWdodHMgPSBGQUxTRSkKCnNoYXJlZF9pZHMgPC0gc2hhcmVkX3ZlY3RvckBJbnRlcnNlY3Rpb25TZXRzW1siMTExIl1dCnNoYXJlZF9leHB0IDwtIGV4Y2x1ZGVfZ2VuZXNfZXhwdChoc19jbGluaWNhbCwgaWRzID0gc2hhcmVkX2lkcywgbWV0aG9kID0gImtlZXAiKQpzaGFyZWRfd3JpdHRlbiA8LSB3cml0ZV9leHB0KHNoYXJlZF9leHB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvc2hhcmVkX2Fjcm9zc19jZWxsdHlwZXMtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIE1vbm9jeXRlcyBieSB2aXNpdAoKIDEuIENhbiB5b3UgcGxlYXNlIHNoYXJlIHdpdGggdXMgYSBQQ0EgKFNWQSBhbmQgbm9uLVNWQSkgb2YgdGhlCiAgICBtb25vY3l0ZXMgb2YgdGhlIFRNUkMzIHByb2plY3QsIGJ1dCBsYWJlbGluZyB0aGVtIGJhc2VkIG9uIHRoZSB2aXNpdAogICAgKFYxLCBWMiwgVjMpPwogMi4gQ2FuIHlvdSBwbGVhc2Ugc2hhcmUgREUgbGlzdHMgb2YgVjEgdnMgVjIsIFYxIHZzIFYzLCBWMSB2cy4gVjIrVjMKICAgIGFuZCBWMiB2cyBWMz8KCmBgYHtyIG1vbm9jeXRlc19ieV92aXNpdH0KdmlzaXRfY29sb3JzIDwtIGNob3Nlbl9jb2xvcnMgPC0gYygiI0Q5NUYwMiIsICIjNzU3MEIzIiwgIiMxQjlFNzciKQpuYW1lcyh2aXNpdF9jb2xvcnMpIDwtIGMoMSwgMiwgMykKbW9ub192aXNpdCA8LSBzdWJzZXRfZXhwdChoc192YWxpZCwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbW9ub2N5dGVzJyIpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJ2aXNpdG51bWJlciIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJjbGluaWNhbG91dGNvbWUiKSAlPiUKICBzZXRfZXhwdF9jb2xvcnMoY29sb3JzID0gY2hvc2VuX2NvbG9ycykKCm1vbm9fdmlzaXRfbm9ybSA8LSBub3JtYWxpemVfZXhwdChtb25vX3Zpc2l0LCBmaWx0ZXIgPSBUUlVFLCBub3JtID0gInF1YW50IiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gImxvZzIiKQptb25vX3Zpc2l0X3BjYSA8LSBwbG90X3BjYShtb25vX3Zpc2l0X25vcm0pCnBwKGZpbGUgPSAiaW1hZ2VzL21vbm9jeXRlX2J5X3Zpc2l0LnBuZyIsIGltYWdlID0gbW9ub192aXNpdF9wY2EkcGxvdCkKCm1vbm9fdmlzaXRfbmIgPC0gbm9ybWFsaXplX2V4cHQobW9ub192aXNpdCwgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoID0gInN2YXNlcSIsIHRyYW5zZm9ybSA9ICJsb2cyIikKbW9ub192aXNpdF9uYl9wY2EgPC0gcGxvdF9wY2EobW9ub192aXNpdF9uYikKcHAoZmlsZSA9ICJpbWFnZXMvbW9ub2N5dGVfYnlfdmlzaXRfbmIucG5nIiwgaW1hZ2UgPSBtb25vX3Zpc2l0X25iX3BjYSRwbG90KQoKdGFibGUocERhdGEobW9ub192aXNpdF9ub3JtKSRiYXRjaCkKYGBgCgpgYGB7ciBtb25vX3Zpc2l0X2RlLCBmaWcuc2hvdyA9ICJoaWRlIn0Ka2VlcGVycyA8LSBsaXN0KAogICAgInNlY29uZF92c19maXJzdCIgPSBjKCJjMiIsICJjMSIpLAogICAgInRoaXJkX3ZzX3NlY29uZCIgPSBjKCJjMyIsICJjMiIpLAogICAgInRoaXJkX3ZzX2ZpcnN0IiA9IGMoImMzIiwgImMxIikpCm1vbm9fdmlzaXRfZGUgPC0gYWxsX3BhaXJ3aXNlKG1vbm9fdmlzaXQsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCgptb25vX3Zpc2l0X3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIG1vbm9fdmlzaXRfZGUsCiAgICBrZWVwZXJzID0ga2VlcGVycywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvbW9ub192aXNpdF90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkKYGBgCgpgYGB7ciB2MV92c19hbGx9Cm5ld19mYWN0b3IgPC0gYXMuY2hhcmFjdGVyKHBEYXRhKG1vbm9fdmlzaXQpW1sidmlzaXRudW1iZXIiXV0pCm5vdF9vbmVfaWR4IDwtIG5ld19mYWN0b3IgIT0gMQpuZXdfZmFjdG9yW25vdF9vbmVfaWR4XSA8LSAibm90XzEiCm1vbm9fb25lX3ZzIDwtIHNldF9leHB0X2NvbmRpdGlvbnMobW9ub192aXNpdCwgbmV3X2ZhY3RvcikKCm1vbm9fb25lX3ZzX2RlIDwtIGFsbF9wYWlyd2lzZShtb25vX29uZV92cywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKCm1vbm9fb25lX3ZzX3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIG1vbm9fb25lX3ZzX2RlLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9tb25vX29uZV92c190YWJsZXMtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIFRlc3QgVFNQCgpJbiB3cml0aW5nIHRoZSBmb2xsb3dpbmcsIEkgcXVpY2tseSByZWFsaXplZCB0aGF0IHRzcGFpciB3YXMgbm90Cmpva2luZyB3aGVuIGl0IHNhaWQgaXQgaXMgaW50ZW5kZWQgZm9yIHNtYWxsIG51bWJlcnMgb2YgZ2VuZXMuICBGb3IgYQpmdWxsIGV4cHJlc3Npb25zZXQgb2YgaHVtYW4gZGF0YSBpdCBpcyBzdHJ1Z2dsaW5nLiAgSSBsaWtlIHRoZSBpZGVhLAppdCBtYXkgcHJvdmUgd29ydGggd2hpbGUgdG8gc3BlbmQgc29tZSB0aW1lIG9wdGltaXppbmcgdGhlIHBhY2thZ2Ugc28KdGhhdCBpdCBpcyBtb3JlIHVzYWJsZS4KCmBgYHtyIHRzcCwgZXZhbCA9IEZBTFNFfQpleHB0IDwtIGhzX2NsaW5pY2FsX25vYmlvcAoKc2ltcGxlX3RzcCA8LSBmdW5jdGlvbihleHB0LCBjb2x1bW4gPSAiY29uZGl0aW9uIikgewogIGZhY3RzIDwtIGxldmVscyhhcy5mYWN0b3IocERhdGEoZXhwdClbW2NvbHVtbl1dKSkKICByZXRsaXN0IDwtIGxpc3QoKQogIGlmIChsZW5ndGgoZmFjdHMpIDwgMikgewogICAgc3RvcCgiVGhpcyByZXF1aXJlcyBmYWN0b3JzIHdpdGggYXQgbGVhc3QgMiBsZXZlbHMuIikKICB9IGVsc2UgaWYgKGxlbmd0aChmYWN0cykgPT0gMikgewogICAgcmV0bGlzdCA8LSBzaW1wbGVfdHNwX3BhaXIoZXhwdCwgY29sdW1uID0gY29sdW1uKQogIH0gZWxzZSB7CiAgICBmb3IgKGZpcnN0IGluIDE6KGxlbmd0aChmYWN0cykgLSAxKSkgewogICAgICBmb3IgKHNlY29uZCBpbiAyOihsZW5ndGgoZmFjdHMpKSkgewogICAgICAgIGlmIChmaXJzdCA8IHNlY29uZCkgewogICAgICAgICAgbmFtZSA8LSBnbHVlOjpnbHVlKCJ7ZmFjdHNbZmlyc3RdfV92c197ZmFjdHNbc2Vjb25kXX0iKQogICAgICAgICAgbWVzc2FnZSgiU3RhcnRpbmcgIiwgbmFtZSwgIi4iKQogICAgICAgICAgc3Vic3RyaW5nIDwtIGdsdWU6OmdsdWUoIntjb2x1bW59PT0ne2ZhY3RzW2ZpcnN0XX0nfHtjb2x1bW59PT0ne2ZhY3RzW3NlY29uZF19JyIpCiAgICAgICAgICBzdWJieSA8LSBzdWJzZXRfZXhwdChleHB0LCBzdWJzZXQ9YXMuY2hhcmFjdGVyKHN1YnN0cmluZykpCiAgICAgICAgICByZXRsaXN0W1tuYW1lXV0gPC0gc2ltcGxlX3RzcF9wYWlyKHN1YmJ5LCBjb2x1bW4gPSBjb2x1bW4pCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgpzaW1wbGVfdHNwX3BhaXIgPC0gZnVuY3Rpb24oc3ViYnksIGNvbHVtbiA9ICJjb25kaXRpb24iLCByZXBldGl0aW9ucyA9IDUwKSB7CiAgdHNwX2lucHV0IDwtIHN1YmJ5W1siZXhwcmVzc2lvbnNldCJdXQogIHRzcF9vdXRwdXQgPC0gdHNwY2FsYyh0c3BfaW5wdXQsIGNvbHVtbikKICB0c3Bfc2NvcmVzIDwtIHRzcHNpZyh0c3BfaW5wdXQsIGNvbHVtbiwgQiA9IHJlcGV0aXRpb25zKQp9Cgp0c3AxIDwtIHRzcGNhbGModHNwX2lucHV0LCAiY29uZGl0aW9uIikKCmBgYAoKYGBge3Igc2F2ZW1lfQppZiAoIWlzVFJVRShnZXQwKCJza2lwX2xvYWQiKSkpIHsKICBwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQogIG1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQogIG1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgc2F2ZWZpbGUpKQogIHRtcCA8LSBzbShzYXZlbWUoZmlsZW5hbWUgPSBzYXZlZmlsZSkpCn0KYGBgCgpgYGB7ciBsb2FkbWVfYWZ0ZXIsIGV2YWwgPSBGQUxTRX0KdG1wIDwtIGxvYWRtZShmaWxlbmFtZSA9IHNhdmVmaWxlKQpgYGAK