Introduction

The following workflow was used to analyze the data and generate the figures for our paper “Broad immune activation underlies shared set point signatures for vaccine responsiveness in healthy individuals and disease activity in lupus patients” published in Nature Medicine in 2020.

To avoid inavailability or version change in R packages we recommend to run the workflow using our Singularity container.

Prepare the working directory

Before running the workflow prepare the working directory with the following subfloders:

data
figure_generation
generated_data
R

Using Singularity container

If you are using Singularity on NIAID HPC, follow these steps to start the container and run R

    $ cd /hpcdata/sg/sg_data/singularity/baseline
    $ singularity shell -B \
             /full_path_to_the_working_dir/:/var/workflow1 \
              baseline_rstudio_r_3.4.1.img
    $ cd /var/workflow1
    $ R


For outside usage check that Singularity is installed and works properly. Singularity installation and usage guide can be found at https://sylabs.io/docs/.

Using R without Singularity container

If Singularity is not available, it is possible to use standalone R but we cannot guarantee the error-free flow and the exact results.


Our pipeline requires the following R packages:

# CRAN:
install.packages(c("plyr", "tidyverse", "data.table", "pROC", "lme4", "limma", "tmod", "MASS", "latex2exp", "gplots", "GGally", "effects", "car", "effsize", "cowplot", "circlize"))

# Bioconductor:
source("http://bioconductor.org/biocLite.R")
biocLite()
biocLite(c("WGCNA", "tmod", "fgsea", "ComplexHeatmap", "DEseq2", "hgu133plus2.db"))

# older version of MetaDE
install.packages("https://cran.r-project.org/src/contrib/Archive/MetaDE/MetaDE_1.0.5.tar.gz", repos = NULL, type = "source")


# GitHub (ImmuneSpaceR and ImmSig2 packages have to be installed before ImmuneSignatures. Currently the latest development versions of these packages are required to download HIPC data). We do not include this packages in the Singularity container, since this version once outdated most probably will not not work with ImmuneSpace server.
install.packages("devtools")
devtools::install_github("rglab/ImmuneSpaceR")
devtools::install_github("ehfhcrc/ImmSig2")
devtools::install_github("rglab/ImmuneSignatures", build_vignettes = FALSE)


Notes

If while running some scripts you get X11 forwarding related error, check if you have X11 forwarding turned on (in Putty it is in Connection-SSH-X11) and turn it off. Sometime an error may appear due to a conflict between R packages. In this case restart R and rerun the script that previously returned the error.


CHI data analysis

Input data

Input data are stored in data folder:

  • Demographics (gender, age, ethnicity)
    • data/CHI/phenotypes/CHI_demographics.txt
  • Microneutralization titer, processed
    • data/CHI/phenotypes/titer_processed.txt
  • Expression data after correction of batch effect (hybridization date) downloaded from https://chi.niaid.nih.gov/
    • data/CHI/expression/corrected.batch.txt
    • data/CHI/expression/affy_hugene_1.0_ID_unique_PC1.txt (probeset-gene mapping)
  • Flow cytometry (cell counts of selected cell populations exported from FlowJo v9.9.3)
    • data/CHI/flow/bp_flow_data.txt
  • Visual quality assessment of cell viability and the detection of CD38 marker (pass or fail)
    • data/CHI/flow/bp_flow_sample_flagged.txt

All data except flow are available on the CHI data portal (https://chi.niaid.nih.gov/web/new/data.html)

Step 1. Data formatting and preparation

```r
source(\R/chi_signature_analysis/cd38_10gene_random_sig_FIGURE.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Output will be saved to ./generated_data/CHI/.
<br/>

## Step 2. Calculate and plot correlation between titer response and percent of CD38 high cells for 3 baseline time points


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9jaGlfc2lnbmF0dXJlX2FuYWx5c2lzL2NkMzhfMjBnZW5lc19zaW5nbGUuZ2VuZS5hdWNfYmFycGxvdF9GSUdVUkUuclxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
source(\R/chi_signature_analysis/cd38_20genes_single.gene.auc_barplot_FIGURE.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>It will generate the following figure (Ext. Data Fig. 1b)

./figure_generation/CHI_flow_vs_respones_3time_p.pdf

<br/>

## Step 3. Compare newly gated cell populations with previous gates by predictive power (AUC) and temporal stability:


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9jaGlfc2lnbmF0dXJlX2FuYWx5c2lzL2NkMzhfMTBnZW5lX3NpZ19ybV9nZW5lc19GSUdVUkVTLnJcXClcbmBgYFxuYGBgIn0= -->

```r
```r
source(\R/chi_signature_analysis/cd38_10gene_sig_rm_genes_FIGURES.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>The script generates two plots for Figure 1b.

./figure_generation/CHI_flow_selected_gates_AUC.pdf ./figure_generation/CHI_flow_selected_gates_ISV.pdf

<br/>

## Step 4. Calculate inter-subject variation (ISV) of expression of individual genes to quantify their stability across baseline time points (days -7, 0, and 70):


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9jaGlfc2lnbmF0dXJlX2FuYWx5c2lzL2NkMzhfMTBnZW5lX3NpZ19hbmFseXNpc19GSUdVUkVTX3dpdGhfbWlkLnJcXClcbmBgYFxuYGBgIn0= -->

```r
```r
source(\R/chi_signature_analysis/cd38_10gene_sig_analysis_FIGURES_with_mid.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>The script generates a table of gene stability metrics:

./generated_data/CHI/CHI_genes_stability.txt

<br/>

## Step 5. Analysis of correlation between gene expression and percentage of CD38 high cells:

Correlation using stable genes only

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9oaXBjX2RhdGFwcmVwL2hpcGNfZGF0YV9mcm9tX0lTX3ByZWxvYWRlZC5yXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
source(\R/hipc_dataprep/hipc_data_from_IS_preloaded.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Correlation using all genes to generate correlations with CD20+CD38++ B cells for futher test of random signatures

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9oaXBjX2RhdGFwcmVwL2hpcGNfZGF0YXByZXAuclxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
source(\R/hipc_dataprep/hipc_dataprep.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>The scripts adds percent of CD38++ cells to sample information table 

./generated_data/CHI/CHI_sample_info_2_CD38hi.txt

and generates the following files with robust correlation results:

./generated_data/CHI/robust_corr_genes.txt ./generated_data/CHI/robust_corr_all.genes.txt


<br/>Testing correlations using 500 random signatures computed by permuting subject labels for flow data. At each iteration the correlation computed exactly the same way as for the real data. **Long computation!**

source(“R/chi_signature_analysis/rand.sig_generate.r”)

The output file with correlation data for each iteration is store as ```./generated_data/CHI/gene_sig_random_500_from_all.txt```. 
Instead you can download pre-computed random signatures generated previously and put it into the data folder. 

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi95Zl9kYXRhcHJlcC95Zl9kYXRhX2Zyb21fYXB0LnJcXClcbnNvdXJjZShcXFIveWZfZGF0YXByZXAveWZfcHJvYmVzMmdlbmVzLnJcXClcbnNvdXJjZShcXFIveWZfZGF0YXByZXAveWZfc2FtcGxlX2ZpbHRlcmluZy5yXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
source(\R/yf_dataprep/yf_data_from_apt.r\)
source(\R/yf_dataprep/yf_probes2genes.r\)
source(\R/yf_dataprep/yf_sample_filtering.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


The scripts generate a table and AUC table, as well as a plot for Ext. Data Fig. 2e:

./generated_data/CHI/chi_random.sig.500_3times.rds ./generated_data/figure_generation

<br/>

## Step 6. Determine the optimal number of genes as expression surrogate signature for CD20+CD38++ B cells. 

Evaluate prediction power of titer response for top 20 individual genes (Fig. 1d): 

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi95Zl9zaWduYXR1cmVfYW5hbHlzaXMveWZfY2QzOF8xMGdlbmVfc2lnX2FuYWx5c2lzX0ZJR1VSRVNfd2l0aF9taWQuclxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
source(\R/yf_signature_analysis/yf_cd38_10gene_sig_analysis_FIGURES_with_mid.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Evaluate prediction power of titer response for different number of genes in the signature (Ext. Data Fig. 2c):

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9zbGVfZGF0YXByZXAvc2xlX2RhdGFwcmVwLnJcXClcbnNvdXJjZShcXFIvc2xlX2RhdGFwcmVwL3NsZV9wcm9iZXMyZ2VuZXMuclxcKVxuc291cmNlKFxcUi9zbGVfZGF0YXByZXAvc2xlX2FkZF9EQV9hbmRfUEcuclxcKVxuc291cmNlKFxcUi9zbGVfZGF0YXByZXAvc2xlX3NhbXBsZV9maWx0ZXJpbmcuclxcKVxuc291cmNlKFxcUi9zbGVfZGF0YXByZXAvc2xlX2dlLm1lYW5fYnlfc3ViamVjdC5yXFwpXG5zb3VyY2UoXFxSL3NsZV9kYXRhcHJlcC9zbGVfc2xlZGFpLmxvd0RBLm1lYW5fYnlfc3ViamVjdC5yXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
source(\R/sle_dataprep/sle_dataprep.r\)
source(\R/sle_dataprep/sle_probes2genes.r\)
source(\R/sle_dataprep/sle_add_DA_and_PG.r\)
source(\R/sle_dataprep/sle_sample_filtering.r\)
source(\R/sle_dataprep/sle_ge.mean_by_subject.r\)
source(\R/sle_dataprep/sle_sledai.lowDA.mean_by_subject.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Generate ROC for titer response prediction based on 10-gene signature, and box plot comparing low- and high- responders based on TGSig for day 0, day -7 and day 70 (Fig. 1e-f). Output the TGSig scores for low and high responders for these time points.

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9zbGVfZXhhbXBsZV9wcm9maWxlL1NMRV9TTEVEQUlfVElNRV9wcm9maWxlcy5yXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
source(\R/sle_example_profile/SLE_SLEDAI_TIME_profiles.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Effect on AUC after removal of individual genes in TGSig (Ext. Data Fig. 2g): 

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9zbGVfZGF0YXByZXAvc2xlX2dlbmVfc3RhYmlsaXR5LnJcXClcbmBgYFxuYGBgIn0= -->

```r
```r
source(\R/sle_dataprep/sle_gene_stability.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Check stability of relative rank of CD38++ signature genes applying different ISV threshold (Ext. Data Fig. 2f):

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9zbGVfc2lnbmF0dXJlX2FuYWx5c2lzL3NsZV9sb3dEQV9jZDM4X3Njb3JlLnJcXClcbmBgYFxuYGBgIn0= -->

```r
```r
source(\R/sle_signature_analysis/sle_lowDA_cd38_score.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Save the final gene lists for both TGSig and plasmablast signature: 

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9zbGVfc2lnbmF0dXJlX2FuYWx5c2lzL3NsZV9sb3dEQV9QQl9zY29yZS5yXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
source(\R/sle_signature_analysis/sle_lowDA_PB_score.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Generate box plots comparing  low-, middle- and high- responders based on TGSig score for day 0 (Ext. Data Fig. 3b):

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9zbGVfc2lnbmF0dXJlX2FuYWx5c2lzL3NsZV9QQl9zY29yZV9mcm9tX21peGVkX21vZGVsLnJcXClcbmBgYFxuYGBgIn0= -->

```r
```r
source(\R/sle_signature_analysis/sle_PB_score_from_mixed_model.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Generate box plots comparing  male and female subject based on TGSig score for day 0 (Ext. Data Fig. 10b-e): 

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9zbGVfc2lnbmF0dXJlX2FuYWx5c2lzL3NsZV9QQi5TTEVEQUkuY29ycl92c19DRDM4Lm1lYW4uc2NvcmVfRklHVVJFLnJcXClcbnNvdXJjZShcXFIvc2xlX3NpZ25hdHVyZV9hbmFseXNpcy9zbGVfUEIuU0xFREFJLmNvcnJfdnNfQ0QzOC5tZWFuLnNjb3JlX3RhYmxlLnJcXClcbmBgYFxuYGBgIn0= -->

```r
```r
source(\R/sle_signature_analysis/sle_PB.SLEDAI.corr_vs_CD38.mean.score_FIGURE.r\)
source(\R/sle_signature_analysis/sle_PB.SLEDAI.corr_vs_CD38.mean.score_table.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Generated data files and figures are saved in ```./generated_data/CHI``` and ```./figure_generation```, respectively. The signature files are saved in ```./generated_data/signatures```.
<br/>

## Step 7. Analyze blood transcription module genes enrichment in genes correlated with percentage of CD38-high cells varying selection threshold for gene inter-subject variation.

Run GSEA on “LI” and “DC” modules separately and save the results in RDS file.

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9zbGVfc2lnbmF0dXJlX2FuYWx5c2lzL3NsZV9QQi5TTEVEQUkuY29ycl92c19QQi5sb3dEQS5tZWFuLnNjb3JlX0ZJR1VSRS5yXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
source(\R/sle_signature_analysis/sle_PB.SLEDAI.corr_vs_PB.lowDA.mean.score_FIGURE.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Generated RDS files are saved in ```./generated_data/fgsea_with_btm_modules```.
<br/>

---

# HIPC data analysis

## Input data

HAI expression and titer data were downloaded from [ImmuneSpace](http://immunespace.org) and pre-processed using part of the R script to reproduce figures for HIPC meta-analysis paper [Multicohort analysis reveals baseline transcriptional predictors of influenza vaccination responses. Sci Immunol. 2017 Aug 25;2(14)](https://immunology.sciencemag.org/content/2/14/eaal4656). The script downloads the data, corrects the labels for swapped samples, and calculates adjMFC titers.
For SDY404 we use locally computed adjMFC in ```./data/SDY404_young_hai_titer_table_2016.txt```. 

**Required file from previous analysis**

./generated_data/signatures/CD38_ge_sig.txt




## Step 1. Data formatting and preparation

Load the data preloaded from ImmuneSpace

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9zbGVfc2lnbmF0dXJlX2FuYWx5c2lzL3NsZV9CVE1fc2NvcmVfZnJvbV9EQS5kZWx0YS5yXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
source(\R/sle_signature_analysis/sle_BTM_score_from_DA.delta.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


To load the data directly from ImmuneSpace we run this script. The script requires creating account and configuration file to access Immunespace. We cannot guarantee that the script will continue working in the future.

source(“R/hipc_dataprep/hipc_data_from_IS.r”)


<br/>Prepare data files for young subjects with titer response

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9QQi1zY29yZS12cy1XR0NOQS1tb2R1bGVzL3NjcmlwdC5SXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
source(\R/PB-score-vs-WGCNA-modules/script.R\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Mapping probes to genes

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9mZ3NlYV93aXRoX3dnY25hX21vZHVsZXMvY2hpX0NEMzhfY29yX2J5X0lTVl9mZ3NlYV9sZWFkaW5nRWRnZS5yXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
source(\R/fgsea_with_wgcna_modules/chi_CD38_cor_by_ISV_fgsea_leadingEdge.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Filter baseline (day 0) samples and subjects with low and high response 

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9mZ3NlYV93aXRoX3dnY25hX21vZHVsZXMvY2hpX0NEMzhfY29yX2J5X0lTVl9mZ3NlYV9GSUdVUkUuclxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
source(\R/fgsea_with_wgcna_modules/chi_CD38_cor_by_ISV_fgsea_FIGURE.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Generated data files are saved in ```./generated_data/HIPC```.
<br/>

## Step 2. Validation of prediction power of CD38 signature in HIPC datasets (young subjects only)

<br/>Calculate TGSig scores using data from day 0

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9mZ3NlYV93aXRoX3dnY25hX21vZHVsZXMvYnJvd24tbGVhZGluZy1lZGdlLUJUTS10YWJsZS5SXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
source(\R/fgsea_with_wgcna_modules/brown-leading-edge-BTM-table.R\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Generate ROC for titer response prediction based on 10-gene signature, and box plot comparing low- and high- responders based on TGSig:

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9XR0NOQS1tb2R1bGVzLWZyb20tU0xFLWxvdy1EQS10bW9kL3NjcmlwdC5SXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
source(\R/WGCNA-modules-from-SLE-low-DA-tmod/script.R\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Generate box plots comparing low-, middle- and high- responders based on TGSig:

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9NZXRhREUtZmx1LXRpdGVyLXJlc3BvbnNlLWZyb20tZXhwcmVzc2lvbi1pbi1mb3VyLWNvaG9ydHMvc2NyaXB0LlJcXClcbmBgYFxuYGBgIn0= -->

```r
```r
source(\R/MetaDE-flu-titer-response-from-expression-in-four-cohorts/script.R\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Generated data files and figures (Fig. 2a and Ext. Data Fig. 3b) are saved in ```./generated_data/HIPC``` and ```./figure_generation```, respectively.
<br/>

---

# Emory data analysis

## Input data

* Microarray (downloaded from GEO) and antibody titer data wre proprocessed outside of the workflow
  * data/Emory/GSE29619.RData
  * data/Emory/GSE74817_healthy.RData
<br/>

## Testing prediction power of CD38 signature


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9NZXRhREVfZm9yZXN0X3Bsb3QvRmx1X21ldGFfZm9yZXN0X3Bsb3QuclxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
source(\R/MetaDE_forest_plot/Flu_meta_forest_plot.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Output figure is saved in ```figure_generation```.
<br/>

---

# Yellow Fever data analysis

## Input data

* Sample information from GEO including Neutralization antibody titer data
  * data/YF/expression/sample_info.txt
* Expression data from GEO processed by RMA-sketch (Affymetrix Power Tools)
  * data/YF/expression/rma-sketch.summary.txt
* Probeset-gene mapping (for reproducibility, originally obtained using hgu133plus2.db R package)
  * data/YF/expression/YF_probe_map.txt
<br/>

## Step 1. Data formatting and preparation


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9ZRjEtZWZmZWN0LXNpemVzL3NjcmlwdC5SXFwpXG5zb3VyY2UoXFxSL01ldGFERV9mb3Jlc3RfcGxvdC9ZRjFfZWZmZWN0X3NpemVfcGxvdC5yXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
source(\R/YF1-effect-sizes/script.R\)
source(\R/MetaDE_forest_plot/YF1_effect_size_plot.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

<br/>

# Step 2. Validation of prediction power of CD38 signature in yellow fever datasets

Calculate TGSig scores using data from day 0

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9HU0VBLXVzaW5nLWdlbmVzLWNvbW1vbi10by1zdGFibGUtU0xFLWxvdy1EQS1hbmQtNGZsdS9zY3JpcHQuUlxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
source(\R/GSEA-using-genes-common-to-stable-SLE-low-DA-and-4flu/script.R\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Generate ROC for titer response prediction based on 10-gene signature, and box plot comparing low- and high- responders based on TGSig (trials 1 for Figure 2b, and trial 2 for Ext. Data Fig. 4a):

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9icm93bi1tb2R1bGUtbGVhZGluZy1nZW5lcy1sb3ctbWlkLWhpZ2gtZWlnZW5nZW5lL3NjcmlwdC5SXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
source(\R/brown-module-leading-genes-low-mid-high-eigengene/script.R\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Generate box plot comparing low-, middle- and high- responders based on TGSig in trial 1 (Ext. Data Fig. 3d):

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9yZWNhbGMtYW5kLWNoZWNrLTEwZ2VuZS1DRDM4cGx1c1NpZy9zY3JpcHQuUlxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
source(\R/recalc-and-check-10gene-CD38plusSig/script.R\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Generated data files and figures are saved in ```./generated_data/YF``` and ```./figure_generation```, respectively.
<br/>

---

# SLE data analysis

## Input data

* Expression data downloaded from http://websle.com (Data tab) -- Batch-corrected, probe filtered, latest probe-gene annotation.
  * data/SLE/expression/SLE_Longitudinal_972_eset.RData
* Subjects assignment to patient groups (from the SLE paper, figure 6A)
  * data/SLE/SLE_SUBJECT_PG.txt
<br/>

## Step 1. Data formatting and preparation


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9icm93bi1tb2QtbWludXMtbGVhZGluZy1lZGdlL3NjcmlwdC5SXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
source(\R/brown-mod-minus-leading-edge/script.R\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Generate figure of SLEDAI change at different visit for a single patient (Fig. 2d):

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9icm93bi1tb2QtbWludXMtbGVhZGluZy1lZGdlLWNvbWJpbmVkL3NjcmlwdC5SXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
source(\R/brown-mod-minus-leading-edge-combined/script.R\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

<br/>

## Step 2. Calculate inter-subject variation (ISV) of expression of individual genes to quantify their stability across visits with low disease activity


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9JRk5fc2lnbmF0dXJlX2FuYWx5c2lzL3NldHVwLnJcXClcbnNvdXJjZShcXFIvSUZOX3NpZ25hdHVyZV9hbmFseXNpcy9jaGlfSUZOMjZfc2lnX2FuYWx5c2lzX0ZJR1VSRVMyLnJcXClcbnNvdXJjZShcXFIvSUZOX3NpZ25hdHVyZV9hbmFseXNpcy9oaXBjX2QwX0lGTjI2X3Njb3JlLnJcXClcbnNvdXJjZShcXFIvSUZOX3NpZ25hdHVyZV9hbmFseXNpcy9zbGVfbG93REFfSUZOMjZfc2NvcmUuclxcKVxuc291cmNlKFxcUi9JRk5fc2lnbmF0dXJlX2FuYWx5c2lzL2xvZ2lzdGljX3JlZ3JfNGZsdS5yXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
source(\R/IFN_signature_analysis/setup.r\)
source(\R/IFN_signature_analysis/chi_IFN26_sig_analysis_FIGURES2.r\)
source(\R/IFN_signature_analysis/hipc_d0_IFN26_score.r\)
source(\R/IFN_signature_analysis/sle_lowDA_IFN26_score.r\)
source(\R/IFN_signature_analysis/logistic_regr_4flu.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

<br/>Generated data files and figures are saved in ```./generated_data/SLE``` and ```./figure_generation```, respectively.
<br/>

## Step 3. Calculate TGSig and Plasmablast signature scores

<br/>Calculate TGSig scores using data from low-disease-activity samples

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9STkFzZXEvQmNlbGxfY29tcGFyaXNpb25fREVzZXEuclxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
source(\R/RNAseq/Bcell_comparision_DEseq.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Calculate Plasmablast signature scores using data from low-disease-activity samples

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc291cmNlKFxcUi9STkFzZXEvYnJvd24tbW9kLWxlYWRpbmctZWRnZS1lbnJpY2htZW50LnJcXClcbmBgYFxuYGBgIn0= -->

```r
```r
source(\R/RNAseq/brown-mod-leading-edge-enrichment.r\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


<br/>Calculate DaCP using mixed-effect model

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc291cmNlKFwiUi9zbGVfc2lnbmF0dXJlX2FuYWx5c2lzL3NsZV9QQl9zY29yZV9mcm9tX21peGVkX21vZGVsLnJcIilcbmBgYCJ9 -->

```r
source("R/sle_signature_analysis/sle_PB_score_from_mixed_model.r")


Generate scatter plot between DaCP and average TGSig scores for low-disease-activity samples (Fig. 2e) and the table of correlation data

source("R/sle_signature_analysis/sle_PB.SLEDAI.corr_vs_CD38.mean.score_FIGURE.r")
source("R/sle_signature_analysis/sle_PB.SLEDAI.corr_vs_CD38.mean.score_table.r")


Generate scatter plot between DaCP and average Plasmablast signature scores for low-disease-activity samples (Fig. 2f)

source("R/sle_signature_analysis/sle_PB.SLEDAI.corr_vs_PB.lowDA.mean.score_FIGURE.r")


Generate scatter plot between DaCP and average Plasmablast signature scores for low-disease-activity samples analyzing correlation at different DaCP thresholds (Ext. Data Fig. 5c-d)

source("R/sle_signature_analysis/sle_PB.SLEDAI.corr_vs_CD38.mean.score_thresholds.r")


Generated data files and figures are saved in ./generated_data/SLE and ./figure_generation, respectively.

Analysis of the blood gene expression signatures associated with disease activity/flares


Correlation between DaCP and delta in Plasmablast score (Ext. Data Fig. 5b):

source("R/sle_signature_analysis/sle_DaCP_vs_dPB.r")


Heatmaps of blood gene expression signatures association with disease activity/flares (Fig. 2c and Ext. Data Fig. 5a):

source("R/sle_signature_analysis/sle_BTM_score_from_DA.delta.r")


Generated plots are stored in ./figure_generation.


Discovery of co-expression module in SLE datasets

Input data:

  • Gene stability table
    • ./generated_data/SLE_lowDA_genes_stability.txt
  • Gene expression table by subjects (average across low-disease-activity visits)
    • ./generated_data/SLE_lowDA_PG234_ge.mean_matrix.txt

Step 1. Apply WGCNA analysis to split genes to discover expression modules.


Gene modules discovery by WGCNA

source("R/WGCNA-modules-from-SLE-low-DA/script.R")


Generate Eigengene heatmap

source("R/WGCNA-eigengene-heatmap/script.R")


The generated figures (Fig. 3a) are saved in ./figure_generation/SLE_Sig.

Step 2. Assess correlation between gene modules and DaCP.

source("R/PB-score-vs-WGCNA-modules/script.R")


The generated figures (Fig. 3b-c) are saved in ./figure_generation/SLE-Sig. Table with correlation data for all modules is saved in ./generated_data/PB-score-vs-WGCNA-modules.

Step 3. Perform GSEA analysis with WGCNA modules and extract the brown module leading edge genes (SLE-Sig).

source("R/fgsea_with_wgcna_modules/chi_CD38_cor_by_ISV_fgsea_leadingEdge.r")


Generate a barplot (Fig. 3e) to show enrichment of brown module (with the enrichment plot) and blood transcriptome modules in genes ranked by correlation of their intensity with CD38++ cell frequency. The genes were filtered with ISV >= 0.5. The previously generated data (step 7 in CHI data analysis) were used for GSEA results of BTM enrichment.

source("R/fgsea_with_wgcna_modules/chi_CD38_cor_by_ISV_fgsea_FIGURE.r")


Generate table of three BTM module genes in SLE-Sig (Fig. 3f)

source("R/fgsea_with_wgcna_modules/brown-leading-edge-BTM-table.R")

Output files: ./generated_data/fgsea_with_wgcna_modules/ The generated figure is saved as ./figure_generation/SLE-Sig

Step 4. Analysis of enrichment of Blood Transcription Modules genes in WGCNA modules. Generate the heatmap of enrichment p-values (-log10) - Supplemental Figure 1c.

source("R/WGCNA-modules-from-SLE-low-DA-tmod/script.R")

The generated figure is saved as ./figure_generation/SLE-Sig/WGCNA-BTM-enrichment-p.adjust.pdf.

Output files are saved in ./generated_data/WGCNA-modules-from-SLE-low-DA-tmod

Output table to Fig. 3f is saved as ./generated_data/fgsea_with_wgcna_modules/brown-mod-m75-m150-m165-genes-short.csv


Meta analysis of gene expression in vaccination datasets and the analysis of brown module

Input data:

  • Gene expression tables for all datasets (gene vs. subjects at day0)
  • Sample information with titer response

Step 1. Perform meta-analysis of 4 flu datasets. Generates table of genes with effect size (with regard to titer response).

source("R/MetaDE-flu-titer-response-from-expression-in-four-cohorts/script.R")

Output files are saved in ./generated_data/MetaDE.

Step 2. Generate forest plot for meta-analysis of 4 flu datasets (Ext. Data Fig 4b).

source("R/MetaDE_forest_plot/Flu_meta_forest_plot.r")

The generated figure is saved in ./figure_generation/MetaDE.

Step 3. Calculate effect sizes and generate effect size plot for trial 1 cohort of Yellow Fever dataset (Ext. Data Fig 4c).

source("R/YF1-effect-sizes/script.R")
source("R/MetaDE_forest_plot/YF1_effect_size_plot.r")

The output files are saved in ./generated_data/MetaDE. The generated figure is saved in ./figure_generation/MetaDE.

Step 4. GSEA analyses of vaccine response genes from meta analysis. WGCNA modules against flu response genes

source("R/GSEA-using-genes-common-to-stable-SLE-low-DA-and-4flu/script.R")

The output files are saved in ./generated_data/MetaDE. The generated figure (Fig. 3d) is saved in ./figure_generation/MetaDE.

Step 5. Predictive profiles of select signatures for influenza vaccine response

source("R/brown-module-leading-genes-low-mid-high-eigengene/script.R")

Output files are saved in ./generated_data/brown-module-leading-genes-low-mid-high-eigengene.

source("R/recalc-and-check-10gene-CD38plusSig/script.R")

Output figures (Ext. Data Fig. 6 a-b, e) are saved in ./figure_generation/SLE-Sig.

Test removing SLE-Sig genes from brown module

source("R/brown-mod-minus-leading-edge/script.R")

Output files are saved in ./generated_data/brown-mod-minus-leading-edge/.

source("R/brown-mod-minus-leading-edge-combined/script.R")

Output figure (Ext. Data Fig. 6d) is saved in ./figure_generation/SLE-Sig.


Analysis of IFN-I-DC signature

source("R/IFN_signature_analysis/setup.r")
source("R/IFN_signature_analysis/chi_IFN26_sig_analysis_FIGURES2.r")
source("R/IFN_signature_analysis/hipc_d0_IFN26_score.r")
source("R/IFN_signature_analysis/sle_lowDA_IFN26_score.r")
source("R/IFN_signature_analysis/logistic_regr_4flu.r")

Output files are saved in ./generated_data/IFN26.

Output figures (Ext. Data Fig. 6c,f) are saved in ./figure_generation/IFN26.


Analysis of RNAseq data from sorted B cell subsets

Compare CD20+CD38++ B cells with CD20+ B cells with DEseq2:

source("R/RNAseq/Bcell_comparision_DEseq.r")

Output files are saved in ./generated_data/RNAseq. Output figures (incl. Ext. Data Fig. 7b) are saved in ./figure_generation/RNAseq.


Enrichment analysis of SLE-Sig genes and genes correlated with CD20+CD38++ B cells (at different TSM) against genes ranked by differential expression from RNAseq:

source("R/RNAseq/brown-mod-leading-edge-enrichment.r")

Output files are saved in ./generated_data/RNAseq. Output figures (Ext. Data Fig. 7c-e) are saved in ./figure_generation/RNAseq.




LS0tDQp0aXRsZTogIlJlcHJvZHVjaWJsZSB3b3JrZmxvdyBmb3IgdGhlIHByb2plY3QiDQpzdWJ0aXRsZTogIlwiQnJvYWQgaW1tdW5lIGFjdGl2YXRpb24gdW5kZXJsaWVzIHNoYXJlZCBzZXQgcG9pbnQgc2lnbmF0dXJlcyBmb3IgdmFjY2luZSByZXNwb25zaXZlbmVzcyBpbiBoZWFsdGh5IGluZGl2aWR1YWxzIGFuZCBkaXNlYXNlIGFjdGl2aXR5IGluIHBhdGllbnRzIHdpdGggbHVwdXNcIiINCmF1dGhvcjogIll1cmkgS290bGlhcm92LCBZb25nIEx1LCBKb2huIFMuIFRzYW5nIg0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazogDQogICAgdG9jOiB5ZXMNCi0tLQ0KDQojIyBJbnRyb2R1Y3Rpb24NCg0KVGhlIGZvbGxvd2luZyB3b3JrZmxvdyB3YXMgdXNlZCB0byBhbmFseXplIHRoZSBkYXRhIGFuZCBnZW5lcmF0ZSB0aGUgZmlndXJlcyBmb3Igb3VyIHBhcGVyICJCcm9hZCBpbW11bmUgYWN0aXZhdGlvbiB1bmRlcmxpZXMgc2hhcmVkIHNldCBwb2ludCBzaWduYXR1cmVzIGZvciB2YWNjaW5lIHJlc3BvbnNpdmVuZXNzIGluIGhlYWx0aHkgaW5kaXZpZHVhbHMgYW5kIGRpc2Vhc2UgYWN0aXZpdHkgaW4gbHVwdXMgcGF0aWVudHMiIHB1Ymxpc2hlZCBpbiBOYXR1cmUgTWVkaWNpbmUgaW4gMjAyMC4NCg0KVG8gYXZvaWQgaW5hdmFpbGFiaWxpdHkgb3IgdmVyc2lvbiBjaGFuZ2UgaW4gUiBwYWNrYWdlcyB3ZSByZWNvbW1lbmQgdG8gcnVuIHRoZSB3b3JrZmxvdyB1c2luZyBvdXIgU2luZ3VsYXJpdHkgY29udGFpbmVyLiANCjxici8+DQoNCiMjIFByZXBhcmUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5DQoNCkJlZm9yZSBydW5uaW5nIHRoZSB3b3JrZmxvdyBwcmVwYXJlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aXRoIHRoZSBmb2xsb3dpbmcgc3ViZmxvZGVyczoNCg0KYGBgDQpkYXRhDQpmaWd1cmVfZ2VuZXJhdGlvbg0KZ2VuZXJhdGVkX2RhdGENClINCmBgYA0KDQoqIERvd25sb2FkIHRoZSBhcmNoaXZlZCBkYXRhIGZvbGRlciBmcm9tIFtGaWdzaGFyZSByZXBvc2l0b3J5XShodHRwczovL2RvaS5vcmcvMTAuMzUwOTIveWhqYy5jLjQ3NTM3NzIpIGFuZCB1bnBhY2sgaXQgaW50byB0aGUgYGBgZGF0YWBgYCBmb2xkZXIgDQoqIERvd25sb2FkIHRoZSBhcmNoaXZlZCBkaXJlY3Rvcnkgd2l0aCBSIGNvZGUgYW5kIHVucGFjayBpdCBpbnRvIHRoZSBgYGBSYGBgIGZvbGRlci4gDQoqIE1ha2Ugc3VyZSB0byBwdXQgdGhlIGBgYC5ScHJvZmlsZWBgYCBmaWxlIGludG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGl0c2VsZi4gTW9kaWZ5IHRoZSBgYGBQUk9KRUNUX0RJUmBgYCB2YXJpYWJsZSB3aXRoIHRoZSBmdWxsIHBhdGggdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5Lg0KKiBDcmVhdGUgZW1wdHkgZm9sZGVycyBnZW5lcmF0ZWRfZGF0YSBhbmQgZmlndXJlX2dlbmVyYXRpb24uDQoqIElmIHlvdSBhcmUgZ29pbmcgdG8gdXNlIHRoZSBTaW5ndWxhcml0eSBjb250YWluZXIgZG93bmxvYWQgaXQgZnJvbSBbRmlnc2hhcmUgcmVwb3NpdG9yeV0oaHR0cHM6Ly9kb2kub3JnLzEwLjM1MDkyL3loamMuYy40NzUzNzcyKS4gSXQgc2hvdWxkIGJlIGxvY2F0ZWQgb3V0c2lkZSBvZiB0aGUgd29ya2luZyBkaXJlY3RvcnkuIA0KDQojIyBVc2luZyBTaW5ndWxhcml0eSBjb250YWluZXINCg0KSWYgeW91IGFyZSB1c2luZyBTaW5ndWxhcml0eSBvbiBOSUFJRCBIUEMsIGZvbGxvdyB0aGVzZSBzdGVwcyB0byBzdGFydCB0aGUgY29udGFpbmVyIGFuZCBydW4gUg0KYGBgDQogICAgJCBjZCAvaHBjZGF0YS9zZy9zZ19kYXRhL3Npbmd1bGFyaXR5L2Jhc2VsaW5lDQogICAgJCBzaW5ndWxhcml0eSBzaGVsbCAtQiBcDQogICAgICAgICAgICAgL2Z1bGxfcGF0aF90b190aGVfd29ya2luZ19kaXIvOi92YXIvd29ya2Zsb3cxIFwNCiAgICAgICAgICAgICAgYmFzZWxpbmVfcnN0dWRpb19yXzMuNC4xLmltZw0KICAgICQgY2QgL3Zhci93b3JrZmxvdzENCiAgICAkIFINCmBgYA0KPGJyLz5Gb3Igb3V0c2lkZSB1c2FnZSBjaGVjayB0aGF0IFNpbmd1bGFyaXR5IGlzIGluc3RhbGxlZCBhbmQgd29ya3MgcHJvcGVybHkuIFNpbmd1bGFyaXR5IGluc3RhbGxhdGlvbiBhbmQgdXNhZ2UgZ3VpZGUgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vc3lsYWJzLmlvL2RvY3MvLg0KPGJyLz4NCg0KIyMgVXNpbmcgUiB3aXRob3V0IFNpbmd1bGFyaXR5IGNvbnRhaW5lcg0KDQpJZiBTaW5ndWxhcml0eSBpcyBub3QgYXZhaWxhYmxlLCBpdCBpcyBwb3NzaWJsZSB0byB1c2Ugc3RhbmRhbG9uZSBSIGJ1dCB3ZSBjYW5ub3QgZ3VhcmFudGVlIHRoZSBlcnJvci1mcmVlIGZsb3cgYW5kIHRoZSBleGFjdCByZXN1bHRzLiANCg0KPGJyLz5PdXIgcGlwZWxpbmUgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBSIHBhY2thZ2VzOg0KDQpgYGANCiMgQ1JBTjoNCmluc3RhbGwucGFja2FnZXMoYygicGx5ciIsICJ0aWR5dmVyc2UiLCAiZGF0YS50YWJsZSIsICJwUk9DIiwgImxtZTQiLCAibGltbWEiLCAidG1vZCIsICJNQVNTIiwgImxhdGV4MmV4cCIsICJncGxvdHMiLCAiR0dhbGx5IiwgImVmZmVjdHMiLCAiY2FyIiwgImVmZnNpemUiLCAiY293cGxvdCIsICJjaXJjbGl6ZSIpKQ0KDQojIEJpb2NvbmR1Y3RvcjoNCnNvdXJjZSgiaHR0cDovL2Jpb2NvbmR1Y3Rvci5vcmcvYmlvY0xpdGUuUiIpDQpiaW9jTGl0ZSgpDQpiaW9jTGl0ZShjKCJXR0NOQSIsICJ0bW9kIiwgImZnc2VhIiwgIkNvbXBsZXhIZWF0bWFwIiwgIkRFc2VxMiIsICJoZ3UxMzNwbHVzMi5kYiIpKQ0KDQojIG9sZGVyIHZlcnNpb24gb2YgTWV0YURFDQppbnN0YWxsLnBhY2thZ2VzKCJodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy9zcmMvY29udHJpYi9BcmNoaXZlL01ldGFERS9NZXRhREVfMS4wLjUudGFyLmd6IiwgcmVwb3MgPSBOVUxMLCB0eXBlID0gInNvdXJjZSIpDQoNCg0KIyBHaXRIdWIgKEltbXVuZVNwYWNlUiBhbmQgSW1tU2lnMiBwYWNrYWdlcyBoYXZlIHRvIGJlIGluc3RhbGxlZCBiZWZvcmUgSW1tdW5lU2lnbmF0dXJlcy4gQ3VycmVudGx5IHRoZSBsYXRlc3QgZGV2ZWxvcG1lbnQgdmVyc2lvbnMgb2YgdGhlc2UgcGFja2FnZXMgYXJlIHJlcXVpcmVkIHRvIGRvd25sb2FkIEhJUEMgZGF0YSkuIFdlIGRvIG5vdCBpbmNsdWRlIHRoaXMgcGFja2FnZXMgaW4gdGhlIFNpbmd1bGFyaXR5IGNvbnRhaW5lciwgc2luY2UgdGhpcyB2ZXJzaW9uIG9uY2Ugb3V0ZGF0ZWQgbW9zdCBwcm9iYWJseSB3aWxsIG5vdCBub3Qgd29yayB3aXRoIEltbXVuZVNwYWNlIHNlcnZlci4NCmluc3RhbGwucGFja2FnZXMoImRldnRvb2xzIikNCmRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigicmdsYWIvSW1tdW5lU3BhY2VSIikNCmRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiZWhmaGNyYy9JbW1TaWcyIikNCmRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigicmdsYWIvSW1tdW5lU2lnbmF0dXJlcyIsIGJ1aWxkX3ZpZ25ldHRlcyA9IEZBTFNFKQ0KYGBgDQo8YnIvPg0KDQojIyMgTm90ZXMNCklmIHdoaWxlIHJ1bm5pbmcgc29tZSBzY3JpcHRzIHlvdSBnZXQgWDExIGZvcndhcmRpbmcgcmVsYXRlZCBlcnJvciwgY2hlY2sgaWYgeW91IGhhdmUgWDExIGZvcndhcmRpbmcgdHVybmVkIG9uIChpbiBQdXR0eSBpdCBpcyBpbiBDb25uZWN0aW9uLVNTSC1YMTEpIGFuZCB0dXJuIGl0IG9mZi4gDQpTb21ldGltZSBhbiBlcnJvciBtYXkgYXBwZWFyIGR1ZSB0byBhIGNvbmZsaWN0IGJldHdlZW4gUiBwYWNrYWdlcy4gSW4gdGhpcyBjYXNlIHJlc3RhcnQgUiBhbmQgcmVydW4gdGhlIHNjcmlwdCB0aGF0IHByZXZpb3VzbHkgcmV0dXJuZWQgdGhlIGVycm9yLg0KPGJyLz4NCg0KLS0tDQoNCiMgQ0hJIGRhdGEgYW5hbHlzaXMNCg0KIyMgSW5wdXQgZGF0YQ0KDQpJbnB1dCBkYXRhIGFyZSBzdG9yZWQgaW4gZGF0YSBmb2xkZXI6DQoNCiAgKiBEZW1vZ3JhcGhpY3MgKGdlbmRlciwgYWdlLCBldGhuaWNpdHkpDQogICAgKiBkYXRhL0NISS9waGVub3R5cGVzL0NISV9kZW1vZ3JhcGhpY3MudHh0DQogICogTWljcm9uZXV0cmFsaXphdGlvbiB0aXRlciwgcHJvY2Vzc2VkDQogICAgKiBkYXRhL0NISS9waGVub3R5cGVzL3RpdGVyX3Byb2Nlc3NlZC50eHQNCiAgKiBFeHByZXNzaW9uIGRhdGEgYWZ0ZXIgY29ycmVjdGlvbiBvZiBiYXRjaCBlZmZlY3QgKGh5YnJpZGl6YXRpb24gZGF0ZSkgZG93bmxvYWRlZCBmcm9tIGh0dHBzOi8vY2hpLm5pYWlkLm5paC5nb3YvDQogICAgKiBkYXRhL0NISS9leHByZXNzaW9uL2NvcnJlY3RlZC5iYXRjaC50eHQNCiAgICAqIGRhdGEvQ0hJL2V4cHJlc3Npb24vYWZmeV9odWdlbmVfMS4wX0lEX3VuaXF1ZV9QQzEudHh0IChwcm9iZXNldC1nZW5lIG1hcHBpbmcpDQogICogRmxvdyBjeXRvbWV0cnkgKGNlbGwgY291bnRzIG9mIHNlbGVjdGVkIGNlbGwgcG9wdWxhdGlvbnMgZXhwb3J0ZWQgZnJvbSBGbG93Sm8gdjkuOS4zKQ0KICAgICogZGF0YS9DSEkvZmxvdy9icF9mbG93X2RhdGEudHh0DQogICogVmlzdWFsIHF1YWxpdHkgYXNzZXNzbWVudCBvZiBjZWxsIHZpYWJpbGl0eSBhbmQgdGhlIGRldGVjdGlvbiBvZiBDRDM4IG1hcmtlciAocGFzcyBvciBmYWlsKQ0KICAgICogZGF0YS9DSEkvZmxvdy9icF9mbG93X3NhbXBsZV9mbGFnZ2VkLnR4dA0KICAgIA0KQWxsIGRhdGEgZXhjZXB0IGZsb3cgYXJlIGF2YWlsYWJsZSBvbiB0aGUgQ0hJIGRhdGEgcG9ydGFsIChodHRwczovL2NoaS5uaWFpZC5uaWguZ292L3dlYi9uZXcvZGF0YS5odG1sKQ0KPGJyLz4NCg0KIyMgU3RlcCAxLiBEYXRhIGZvcm1hdHRpbmcgYW5kIHByZXBhcmF0aW9uDQoNCmBgYHtyfQ0Kc291cmNlKCJSL2NoaV9kYXRhcHJlcC9jaGlfZGF0YV9mcm9tX3B1YmxpYy5yIikNCnNvdXJjZSgiUi9jaGlfZGF0YXByZXAvY2hpX3Byb2JlczJnZW5lcy5yIikNCnNvdXJjZSgiUi9jaGlfZGF0YXByZXAvY2hpX2FkZF9kZW1vX2FuZF90aXRlci5yIikNCnNvdXJjZSgiUi9jaGlfZGF0YXByZXAvY2hpX2Zsb3dfcHJvY2VudHMuciIpDQpzb3VyY2UoIlIvY2hpX2RhdGFwcmVwL2NoaV9mbG93X2ZpbHRlcmluZy5yIikNCg0KYGBgDQoNCk91dHB1dCB3aWxsIGJlIHNhdmVkIHRvIC4vZ2VuZXJhdGVkX2RhdGEvQ0hJLy4NCjxici8+DQoNCiMjIFN0ZXAgMi4gQ2FsY3VsYXRlIGFuZCBwbG90IGNvcnJlbGF0aW9uIGJldHdlZW4gdGl0ZXIgcmVzcG9uc2UgYW5kIHBlcmNlbnQgb2YgQ0QzOCBoaWdoIGNlbGxzIGZvciAzIGJhc2VsaW5lIHRpbWUgcG9pbnRzDQoNCmBgYHtyfQ0Kc291cmNlKCJSL2NoaV9mbG93LXRpdGVyX2NvcnJlbGFyaW9uL2NoaV9mbG93X3RpdGVyX2NvcnJfd2l0aF9yb2NfcC5yIikNCg0KYGBgDQoNCjxici8+SXQgd2lsbCBnZW5lcmF0ZSB0aGUgZm9sbG93aW5nIGZpZ3VyZSAoRXh0LiBEYXRhIEZpZy4gMWIpDQpgYGANCi4vZmlndXJlX2dlbmVyYXRpb24vQ0hJX2Zsb3dfdnNfcmVzcG9uZXNfM3RpbWVfcC5wZGYNCmBgYA0KPGJyLz4NCg0KIyMgU3RlcCAzLiBDb21wYXJlIG5ld2x5IGdhdGVkIGNlbGwgcG9wdWxhdGlvbnMgd2l0aCBwcmV2aW91cyBnYXRlcyBieSBwcmVkaWN0aXZlIHBvd2VyIChBVUMpIGFuZCB0ZW1wb3JhbCBzdGFiaWxpdHk6DQoNCmBgYHtyfQ0Kc291cmNlKCJSL2NoaV9mbG93X2FuYWx5c2lzL3NlbGVjdGVkX2dhdGVzX2F1Yy5yIikNCnNvdXJjZSgiUi9jaGlfZmxvd19hbmFseXNpcy9zZWxlY3RlZF9nYXRlc19zdGFiaWxpdHkuciIpDQoNCmBgYA0KDQo8YnIvPlRoZSBzY3JpcHQgZ2VuZXJhdGVzIHR3byBwbG90cyBmb3IgRmlndXJlIDFiLg0KDQpgYGANCi4vZmlndXJlX2dlbmVyYXRpb24vQ0hJX2Zsb3dfc2VsZWN0ZWRfZ2F0ZXNfQVVDLnBkZg0KLi9maWd1cmVfZ2VuZXJhdGlvbi9DSElfZmxvd19zZWxlY3RlZF9nYXRlc19JU1YucGRmDQpgYGANCjxici8+DQoNCiMjIFN0ZXAgNC4gQ2FsY3VsYXRlIGludGVyLXN1YmplY3QgdmFyaWF0aW9uIChJU1YpIG9mIGV4cHJlc3Npb24gb2YgaW5kaXZpZHVhbCBnZW5lcyB0byBxdWFudGlmeSB0aGVpciBzdGFiaWxpdHkgYWNyb3NzIGJhc2VsaW5lIHRpbWUgcG9pbnRzIChkYXlzIC03LCAwLCBhbmQgNzApOg0KDQpgYGB7cn0NCnNvdXJjZSgiUi9jaGlfc3RhYmlsaXR5L2NoaV9nZW5lX3N0YWJpbGl0eS5yIikNCmBgYA0KDQo8YnIvPlRoZSBzY3JpcHQgZ2VuZXJhdGVzIGEgdGFibGUgb2YgZ2VuZSBzdGFiaWxpdHkgbWV0cmljczoNCmBgYA0KLi9nZW5lcmF0ZWRfZGF0YS9DSEkvQ0hJX2dlbmVzX3N0YWJpbGl0eS50eHQNCmBgYA0KPGJyLz4NCg0KIyMgU3RlcCA1LiBBbmFseXNpcyBvZiBjb3JyZWxhdGlvbiBiZXR3ZWVuIGdlbmUgZXhwcmVzc2lvbiBhbmQgcGVyY2VudGFnZSBvZiBDRDM4IGhpZ2ggY2VsbHM6DQoNCkNvcnJlbGF0aW9uIHVzaW5nIHN0YWJsZSBnZW5lcyBvbmx5DQpgYGB7cn0NCnNvdXJjZSgiUi9jaGlfZmxvdy1nZV9jb3JyZWxhcmlvbi9jaGlfZ2VfZmxvd19jb3JyZWxhdGlvbi5yIikgDQpgYGANCg0KPGJyLz5Db3JyZWxhdGlvbiB1c2luZyBhbGwgZ2VuZXMgdG8gZ2VuZXJhdGUgY29ycmVsYXRpb25zIHdpdGggQ0QyMCtDRDM4KysgQiBjZWxscyBmb3IgZnV0aGVyIHRlc3Qgb2YgcmFuZG9tIHNpZ25hdHVyZXMNCmBgYHtyfQ0Kc291cmNlKCJSL2NoaV9mbG93LWdlX2NvcnJlbGFyaW9uL2NoaV9nZV9mbG93X2NvcnJlbGF0aW9uX2FsbC5nZW5lcy5yIikNCmBgYA0KDQo8YnIvPlRoZSBzY3JpcHRzIGFkZHMgcGVyY2VudCBvZiBDRDM4KysgY2VsbHMgdG8gc2FtcGxlIGluZm9ybWF0aW9uIHRhYmxlIA0KYGBgDQouL2dlbmVyYXRlZF9kYXRhL0NISS9DSElfc2FtcGxlX2luZm9fMl9DRDM4aGkudHh0DQpgYGANCmFuZCBnZW5lcmF0ZXMgdGhlIGZvbGxvd2luZyBmaWxlcyB3aXRoIHJvYnVzdCBjb3JyZWxhdGlvbiByZXN1bHRzOg0KYGBgDQouL2dlbmVyYXRlZF9kYXRhL0NISS9yb2J1c3RfY29ycl9nZW5lcy50eHQNCi4vZ2VuZXJhdGVkX2RhdGEvQ0hJL3JvYnVzdF9jb3JyX2FsbC5nZW5lcy50eHQNCmBgYA0KDQo8YnIvPlRlc3RpbmcgY29ycmVsYXRpb25zIHVzaW5nIDUwMCByYW5kb20gc2lnbmF0dXJlcyBjb21wdXRlZCBieSBwZXJtdXRpbmcgc3ViamVjdCBsYWJlbHMgZm9yIGZsb3cgZGF0YS4gQXQgZWFjaCBpdGVyYXRpb24gdGhlIGNvcnJlbGF0aW9uIGNvbXB1dGVkIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIGZvciB0aGUgcmVhbCBkYXRhLiAqKkxvbmcgY29tcHV0YXRpb24hKioNCg0KYGBgDQpzb3VyY2UoIlIvY2hpX3NpZ25hdHVyZV9hbmFseXNpcy9yYW5kLnNpZ19nZW5lcmF0ZS5yIikNCmBgYA0KVGhlIG91dHB1dCBmaWxlIHdpdGggY29ycmVsYXRpb24gZGF0YSBmb3IgZWFjaCBpdGVyYXRpb24gaXMgc3RvcmUgYXMgYGBgLi9nZW5lcmF0ZWRfZGF0YS9DSEkvZ2VuZV9zaWdfcmFuZG9tXzUwMF9mcm9tX2FsbC50eHRgYGAuIA0KSW5zdGVhZCB5b3UgY2FuIGRvd25sb2FkIHByZS1jb21wdXRlZCByYW5kb20gc2lnbmF0dXJlcyBnZW5lcmF0ZWQgcHJldmlvdXNseSBhbmQgcHV0IGl0IGludG8gdGhlIGRhdGEgZm9sZGVyLiANCmBgYHtyfQ0Kc291cmNlKCJSL2NoaV9zaWduYXR1cmVfYW5hbHlzaXMvY2QzOF8xMGdlbmVfcmFuZG9tX3NpZ19GSUdVUkUuciIpDQpgYGANCg0KVGhlIHNjcmlwdHMgZ2VuZXJhdGUgYSB0YWJsZSBhbmQgQVVDIHRhYmxlLCBhcyB3ZWxsIGFzIGEgcGxvdCBmb3IgRXh0LiBEYXRhIEZpZy4gMmU6DQpgYGANCi4vZ2VuZXJhdGVkX2RhdGEvQ0hJL2NoaV9yYW5kb20uc2lnLjUwMF8zdGltZXMucmRzDQouL2dlbmVyYXRlZF9kYXRhL2ZpZ3VyZV9nZW5lcmF0aW9uDQpgYGANCjxici8+DQoNCiMjIFN0ZXAgNi4gRGV0ZXJtaW5lIHRoZSBvcHRpbWFsIG51bWJlciBvZiBnZW5lcyBhcyBleHByZXNzaW9uIHN1cnJvZ2F0ZSBzaWduYXR1cmUgZm9yIENEMjArQ0QzOCsrIEIgY2VsbHMuIA0KDQpFdmFsdWF0ZSBwcmVkaWN0aW9uIHBvd2VyIG9mIHRpdGVyIHJlc3BvbnNlIGZvciB0b3AgMjAgaW5kaXZpZHVhbCBnZW5lcyAoRmlnLiAxZCk6IA0KYGBge3J9DQpzb3VyY2UoIlIvY2hpX3NpZ25hdHVyZV9hbmFseXNpcy9jZDM4XzIwZ2VuZXNfc2luZ2xlLmdlbmUuYXVjX2JhcnBsb3RfRklHVVJFLnIiKQ0KYGBgDQoNCjxici8+RXZhbHVhdGUgcHJlZGljdGlvbiBwb3dlciBvZiB0aXRlciByZXNwb25zZSBmb3IgZGlmZmVyZW50IG51bWJlciBvZiBnZW5lcyBpbiB0aGUgc2lnbmF0dXJlIChFeHQuIERhdGEgRmlnLiAyYyk6DQpgYGB7cn0NCnNvdXJjZSgiUi9jaGlfc2lnbmF0dXJlX2FuYWx5c2lzL2NkMzhfTmdlbmVfc2lnX2FuYWx5c2lzX0ZJR1VSRS5yIikNCmBgYA0KDQo8YnIvPkdlbmVyYXRlIFJPQyBmb3IgdGl0ZXIgcmVzcG9uc2UgcHJlZGljdGlvbiBiYXNlZCBvbiAxMC1nZW5lIHNpZ25hdHVyZSwgYW5kIGJveCBwbG90IGNvbXBhcmluZyBsb3ctIGFuZCBoaWdoLSByZXNwb25kZXJzIGJhc2VkIG9uIFRHU2lnIGZvciBkYXkgMCwgZGF5IC03IGFuZCBkYXkgNzAgKEZpZy4gMWUtZikuIE91dHB1dCB0aGUgVEdTaWcgc2NvcmVzIGZvciBsb3cgYW5kIGhpZ2ggcmVzcG9uZGVycyBmb3IgdGhlc2UgdGltZSBwb2ludHMuDQpgYGB7cn0NCnNvdXJjZSgiUi9jaGlfc2lnbmF0dXJlX2FuYWx5c2lzL2NkMzhfMTBnZW5lX3NpZ19hbmFseXNpc19GSUdVUkVTX3dpdGhfcm9jX3AuciIpDQpgYGANCg0KPGJyLz5FZmZlY3Qgb24gQVVDIGFmdGVyIHJlbW92YWwgb2YgaW5kaXZpZHVhbCBnZW5lcyBpbiBUR1NpZyAoRXh0LiBEYXRhIEZpZy4gMmcpOiANCmBgYHtyfQ0Kc291cmNlKCJSL2NoaV9zaWduYXR1cmVfYW5hbHlzaXMvY2QzOF8xMGdlbmVfc2lnX3JtX2dlbmVzX0ZJR1VSRVMuciIpDQpgYGANCg0KPGJyLz5DaGVjayBzdGFiaWxpdHkgb2YgcmVsYXRpdmUgcmFuayBvZiBDRDM4Kysgc2lnbmF0dXJlIGdlbmVzIGFwcGx5aW5nIGRpZmZlcmVudCBJU1YgdGhyZXNob2xkIChFeHQuIERhdGEgRmlnLiAyZik6DQpgYGB7cn0NCnNvdXJjZSgiUi9jaGlfc2lnbmF0dXJlX2FuYWx5c2lzL2NkMzguY29yX3JlbC5yYW5rX3ZzX0lTVi50aF9GSUdVUkVTLnIiKQ0KYGBgDQoNCjxici8+U2F2ZSB0aGUgZmluYWwgZ2VuZSBsaXN0cyBmb3IgYm90aCBUR1NpZyBhbmQgcGxhc21hYmxhc3Qgc2lnbmF0dXJlOiANCmBgYHtyfQ0Kc291cmNlKCJSL2NoaV9zaWduYXR1cmVfYW5hbHlzaXMvZ2Vfc2lnX3ByZXAuciIpDQpgYGANCg0KPGJyLz5HZW5lcmF0ZSBib3ggcGxvdHMgY29tcGFyaW5nICBsb3ctLCBtaWRkbGUtIGFuZCBoaWdoLSByZXNwb25kZXJzIGJhc2VkIG9uIFRHU2lnIHNjb3JlIGZvciBkYXkgMCAoRXh0LiBEYXRhIEZpZy4gM2IpOg0KYGBge3J9DQpzb3VyY2UoIlIvY2hpX3NpZ25hdHVyZV9hbmFseXNpcy9jZDM4XzEwZ2VuZV9zaWdfYW5hbHlzaXNfRklHVVJFU193aXRoX21pZC5yIikNCmBgYA0KDQo8YnIvPkdlbmVyYXRlIGJveCBwbG90cyBjb21wYXJpbmcgIG1hbGUgYW5kIGZlbWFsZSBzdWJqZWN0IGJhc2VkIG9uIFRHU2lnIHNjb3JlIGZvciBkYXkgMCAoRXh0LiBEYXRhIEZpZy4gMTBiLWUpOiANCmBgYHtyfQ0Kc291cmNlKCJSL2NoaV9zaWduYXR1cmVfYW5hbHlzaXMvY2QzOF8xMGdlbmVfc2lnX2FuYWx5c2lzX0ZJR1VSRVNfZ2VuZGVyLnIiKQ0Kc291cmNlKCJSL2NoaV9zaWduYXR1cmVfYW5hbHlzaXMvVEdTaWdfdnNfZ2VuZGVyX0hMLnIiKQ0Kc291cmNlKCJSL2NoaV9zaWduYXR1cmVfYW5hbHlzaXMvVEdTaWdfdnNfZ2VuZGVyX0hNTC5yIikNCmBgYA0KDQo8YnIvPkdlbmVyYXRlZCBkYXRhIGZpbGVzIGFuZCBmaWd1cmVzIGFyZSBzYXZlZCBpbiBgYGAuL2dlbmVyYXRlZF9kYXRhL0NISWBgYCBhbmQgYGBgLi9maWd1cmVfZ2VuZXJhdGlvbmBgYCwgcmVzcGVjdGl2ZWx5LiBUaGUgc2lnbmF0dXJlIGZpbGVzIGFyZSBzYXZlZCBpbiBgYGAuL2dlbmVyYXRlZF9kYXRhL3NpZ25hdHVyZXNgYGAuDQo8YnIvPg0KDQojIyBTdGVwIDcuIEFuYWx5emUgYmxvb2QgdHJhbnNjcmlwdGlvbiBtb2R1bGUgZ2VuZXMgZW5yaWNobWVudCBpbiBnZW5lcyBjb3JyZWxhdGVkIHdpdGggcGVyY2VudGFnZSBvZiBDRDM4LWhpZ2ggY2VsbHMgdmFyeWluZyBzZWxlY3Rpb24gdGhyZXNob2xkIGZvciBnZW5lIGludGVyLXN1YmplY3QgdmFyaWF0aW9uLg0KDQpSdW4gR1NFQSBvbiDigJxMSeKAnSBhbmQg4oCcREPigJ0gbW9kdWxlcyBzZXBhcmF0ZWx5IGFuZCBzYXZlIHRoZSByZXN1bHRzIGluIFJEUyBmaWxlLg0KYGBge3J9DQpzb3VyY2UoIlIvZmdzZWFfd2l0aF9idG1fbW9kdWxlcy9jaGlfQ0QzOF9jb3JfYnlfSVNWX2Znc2VhX0JUTS5yIikNCmBgYA0KDQpHZW5lcmF0ZWQgUkRTIGZpbGVzIGFyZSBzYXZlZCBpbiBgYGAuL2dlbmVyYXRlZF9kYXRhL2Znc2VhX3dpdGhfYnRtX21vZHVsZXNgYGAuDQo8YnIvPg0KDQotLS0NCg0KIyBISVBDIGRhdGEgYW5hbHlzaXMNCg0KIyMgSW5wdXQgZGF0YQ0KDQpIQUkgZXhwcmVzc2lvbiBhbmQgdGl0ZXIgZGF0YSB3ZXJlIGRvd25sb2FkZWQgZnJvbSBbSW1tdW5lU3BhY2VdKGh0dHA6Ly9pbW11bmVzcGFjZS5vcmcpIGFuZCBwcmUtcHJvY2Vzc2VkIHVzaW5nIHBhcnQgb2YgdGhlIFIgc2NyaXB0IHRvIHJlcHJvZHVjZSBmaWd1cmVzIGZvciBISVBDIG1ldGEtYW5hbHlzaXMgcGFwZXIgW011bHRpY29ob3J0IGFuYWx5c2lzIHJldmVhbHMgYmFzZWxpbmUgdHJhbnNjcmlwdGlvbmFsIHByZWRpY3RvcnMgb2YgaW5mbHVlbnphIHZhY2NpbmF0aW9uIHJlc3BvbnNlcy4gU2NpIEltbXVub2wuIDIwMTcgQXVnIDI1OzIoMTQpXShodHRwczovL2ltbXVub2xvZ3kuc2NpZW5jZW1hZy5vcmcvY29udGVudC8yLzE0L2VhYWw0NjU2KS4gVGhlIHNjcmlwdCBkb3dubG9hZHMgdGhlIGRhdGEsIGNvcnJlY3RzIHRoZSBsYWJlbHMgZm9yIHN3YXBwZWQgc2FtcGxlcywgYW5kIGNhbGN1bGF0ZXMgYWRqTUZDIHRpdGVycy4NCkZvciBTRFk0MDQgd2UgdXNlIGxvY2FsbHkgY29tcHV0ZWQgYWRqTUZDIGluIGBgYC4vZGF0YS9TRFk0MDRfeW91bmdfaGFpX3RpdGVyX3RhYmxlXzIwMTYudHh0YGBgLiANCg0KKipSZXF1aXJlZCBmaWxlIGZyb20gcHJldmlvdXMgYW5hbHlzaXMqKg0KYGBgDQouL2dlbmVyYXRlZF9kYXRhL3NpZ25hdHVyZXMvQ0QzOF9nZV9zaWcudHh0DQpgYGANCg0KDQoNCiMjIFN0ZXAgMS4gRGF0YSBmb3JtYXR0aW5nIGFuZCBwcmVwYXJhdGlvbg0KDQpMb2FkIHRoZSBkYXRhIHByZWxvYWRlZCBmcm9tIEltbXVuZVNwYWNlDQpgYGB7cn0NCnNvdXJjZSgiUi9oaXBjX2RhdGFwcmVwL2hpcGNfZGF0YV9mcm9tX0lTX3ByZWxvYWRlZC5yIikNCmBgYA0KDQpUbyBsb2FkIHRoZSBkYXRhIGRpcmVjdGx5IGZyb20gSW1tdW5lU3BhY2Ugd2UgcnVuIHRoaXMgc2NyaXB0LiBUaGUgc2NyaXB0IHJlcXVpcmVzIGNyZWF0aW5nIGFjY291bnQgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBhY2Nlc3MgSW1tdW5lc3BhY2UuIFdlIGNhbm5vdCBndWFyYW50ZWUgdGhhdCB0aGUgc2NyaXB0IHdpbGwgY29udGludWUgd29ya2luZyBpbiB0aGUgZnV0dXJlLg0KYGBgDQpzb3VyY2UoIlIvaGlwY19kYXRhcHJlcC9oaXBjX2RhdGFfZnJvbV9JUy5yIikNCmBgYA0KDQo8YnIvPlByZXBhcmUgZGF0YSBmaWxlcyBmb3IgeW91bmcgc3ViamVjdHMgd2l0aCB0aXRlciByZXNwb25zZQ0KYGBge3J9DQpzb3VyY2UoIlIvaGlwY19kYXRhcHJlcC9oaXBjX2RhdGFwcmVwLnIiKQ0KYGBgDQoNCjxici8+TWFwcGluZyBwcm9iZXMgdG8gZ2VuZXMNCmBgYHtyfQ0Kc291cmNlKCJSL2hpcGNfZGF0YXByZXAvaGlwY19nZW5lcmF0ZV9wcm9iZTJnZW5lX21hcC5yIikNCnNvdXJjZSgiUi9oaXBjX2RhdGFwcmVwL2hpcGNfcHJvYmVzMmdlbmVzLnIiKQ0KYGBgDQoNCjxici8+RmlsdGVyIGJhc2VsaW5lIChkYXkgMCkgc2FtcGxlcyBhbmQgc3ViamVjdHMgd2l0aCBsb3cgYW5kIGhpZ2ggcmVzcG9uc2UgDQpgYGB7cn0NCnNvdXJjZSgiUi9oaXBjX2RhdGFwcmVwL2hpcGNfc2FtcGxlX2ZpbHRlcmluZy5yIikNCmBgYA0KDQo8YnIvPkdlbmVyYXRlZCBkYXRhIGZpbGVzIGFyZSBzYXZlZCBpbiBgYGAuL2dlbmVyYXRlZF9kYXRhL0hJUENgYGAuDQo8YnIvPg0KDQojIyBTdGVwIDIuIFZhbGlkYXRpb24gb2YgcHJlZGljdGlvbiBwb3dlciBvZiBDRDM4IHNpZ25hdHVyZSBpbiBISVBDIGRhdGFzZXRzICh5b3VuZyBzdWJqZWN0cyBvbmx5KQ0KDQo8YnIvPkNhbGN1bGF0ZSBUR1NpZyBzY29yZXMgdXNpbmcgZGF0YSBmcm9tIGRheSAwDQpgYGB7cn0NCnNvdXJjZSgiUi9oaXBjX3NpZ25hdHVyZV9hbmFseXNpcy9oaXBjX2QwX2NkMzhfc2NvcmUuciIpDQpgYGANCg0KPGJyLz5HZW5lcmF0ZSBST0MgZm9yIHRpdGVyIHJlc3BvbnNlIHByZWRpY3Rpb24gYmFzZWQgb24gMTAtZ2VuZSBzaWduYXR1cmUsIGFuZCBib3ggcGxvdCBjb21wYXJpbmcgbG93LSBhbmQgaGlnaC0gcmVzcG9uZGVycyBiYXNlZCBvbiBUR1NpZzoNCmBgYHtyfQ0Kc291cmNlKCJSL2hpcGNfc2lnbmF0dXJlX2FuYWx5c2lzL2hpcGNfY2QzOF8xMGdlbmVfc2lnX2FuYWx5c2lzX0ZJR1VSRS5yIikNCmBgYA0KDQo8YnIvPkdlbmVyYXRlIGJveCBwbG90cyBjb21wYXJpbmcgbG93LSwgbWlkZGxlLSBhbmQgaGlnaC0gcmVzcG9uZGVycyBiYXNlZCBvbiBUR1NpZzoNCmBgYHtyfQ0Kc291cmNlKCJSL2hpcGNfc2lnbmF0dXJlX2FuYWx5c2lzL2hpcGNfY2QzOF8xMGdlbmVfc2lnX2FuYWx5c2lzX0ZJR1VSRV93aXRoX21pZC5yIikNCmBgYA0KDQo8YnIvPkdlbmVyYXRlZCBkYXRhIGZpbGVzIGFuZCBmaWd1cmVzIChGaWcuIDJhIGFuZCBFeHQuIERhdGEgRmlnLiAzYikgYXJlIHNhdmVkIGluIGBgYC4vZ2VuZXJhdGVkX2RhdGEvSElQQ2BgYCBhbmQgYGBgLi9maWd1cmVfZ2VuZXJhdGlvbmBgYCwgcmVzcGVjdGl2ZWx5Lg0KPGJyLz4NCg0KLS0tDQoNCiMgRW1vcnkgZGF0YSBhbmFseXNpcw0KDQojIyBJbnB1dCBkYXRhDQoNCiogTWljcm9hcnJheSAoZG93bmxvYWRlZCBmcm9tIEdFTykgYW5kIGFudGlib2R5IHRpdGVyIGRhdGEgd3JlIHByb3Byb2Nlc3NlZCBvdXRzaWRlIG9mIHRoZSB3b3JrZmxvdw0KICAqIGRhdGEvRW1vcnkvR1NFMjk2MTkuUkRhdGENCiAgKiBkYXRhL0Vtb3J5L0dTRTc0ODE3X2hlYWx0aHkuUkRhdGENCjxici8+DQoNCiMjIFRlc3RpbmcgcHJlZGljdGlvbiBwb3dlciBvZiBDRDM4IHNpZ25hdHVyZQ0KDQpgYGB7cn0NCnNvdXJjZSgiUi9lbW9yeS9lbW9yeV9jZDM4XzEwZ2VuZV9zaWdfYW5hbHlzaXNfRklHVVJFLnIiKQ0KYGBgDQoNCk91dHB1dCBmaWd1cmUgaXMgc2F2ZWQgaW4gYGBgZmlndXJlX2dlbmVyYXRpb25gYGAuDQo8YnIvPg0KDQotLS0NCg0KIyBZZWxsb3cgRmV2ZXIgZGF0YSBhbmFseXNpcw0KDQojIyBJbnB1dCBkYXRhDQoNCiogU2FtcGxlIGluZm9ybWF0aW9uIGZyb20gR0VPIGluY2x1ZGluZyBOZXV0cmFsaXphdGlvbiBhbnRpYm9keSB0aXRlciBkYXRhDQogICogZGF0YS9ZRi9leHByZXNzaW9uL3NhbXBsZV9pbmZvLnR4dA0KKiBFeHByZXNzaW9uIGRhdGEgZnJvbSBHRU8gcHJvY2Vzc2VkIGJ5IFJNQS1za2V0Y2ggKEFmZnltZXRyaXggUG93ZXIgVG9vbHMpDQogICogZGF0YS9ZRi9leHByZXNzaW9uL3JtYS1za2V0Y2guc3VtbWFyeS50eHQNCiogUHJvYmVzZXQtZ2VuZSBtYXBwaW5nIChmb3IgcmVwcm9kdWNpYmlsaXR5LCBvcmlnaW5hbGx5IG9idGFpbmVkIHVzaW5nIGhndTEzM3BsdXMyLmRiIFIgcGFja2FnZSkNCiAgKiBkYXRhL1lGL2V4cHJlc3Npb24vWUZfcHJvYmVfbWFwLnR4dA0KPGJyLz4NCg0KIyMgU3RlcCAxLiBEYXRhIGZvcm1hdHRpbmcgYW5kIHByZXBhcmF0aW9uDQoNCmBgYHtyfQ0Kc291cmNlKCJSL3lmX2RhdGFwcmVwL3lmX2RhdGFfZnJvbV9hcHQuciIpDQpzb3VyY2UoIlIveWZfZGF0YXByZXAveWZfcHJvYmVzMmdlbmVzLnIiKQ0Kc291cmNlKCJSL3lmX2RhdGFwcmVwL3lmX3NhbXBsZV9maWx0ZXJpbmcuciIpDQpgYGANCjxici8+DQoNCiMgU3RlcCAyLiBWYWxpZGF0aW9uIG9mIHByZWRpY3Rpb24gcG93ZXIgb2YgQ0QzOCBzaWduYXR1cmUgaW4geWVsbG93IGZldmVyIGRhdGFzZXRzDQoNCkNhbGN1bGF0ZSBUR1NpZyBzY29yZXMgdXNpbmcgZGF0YSBmcm9tIGRheSAwDQpgYGB7cn0NCnNvdXJjZSgiUi95Zl9zaWduYXR1cmVfYW5hbHlzaXMveWZfZDBfY2QzOF9zY29yZS5yIikNCmBgYA0KDQo8YnIvPkdlbmVyYXRlIFJPQyBmb3IgdGl0ZXIgcmVzcG9uc2UgcHJlZGljdGlvbiBiYXNlZCBvbiAxMC1nZW5lIHNpZ25hdHVyZSwgYW5kIGJveCBwbG90IGNvbXBhcmluZyBsb3ctIGFuZCBoaWdoLSByZXNwb25kZXJzIGJhc2VkIG9uIFRHU2lnICh0cmlhbHMgMSBmb3IgRmlndXJlIDJiLCBhbmQgdHJpYWwgMiBmb3IgRXh0LiBEYXRhIEZpZy4gNGEpOg0KYGBge3J9DQpzb3VyY2UoIlIveWZfc2lnbmF0dXJlX2FuYWx5c2lzL3lmX2NkMzhfMTBnZW5lX3NpZ19hbmFseXNpc19GSUdVUkVTX3dpdGhfcm9jX3AuciIpDQpgYGANCg0KPGJyLz5HZW5lcmF0ZSBib3ggcGxvdCBjb21wYXJpbmcgbG93LSwgbWlkZGxlLSBhbmQgaGlnaC0gcmVzcG9uZGVycyBiYXNlZCBvbiBUR1NpZyBpbiB0cmlhbCAxIChFeHQuIERhdGEgRmlnLiAzZCk6DQpgYGB7cn0NCnNvdXJjZSgiUi95Zl9zaWduYXR1cmVfYW5hbHlzaXMveWZfY2QzOF8xMGdlbmVfc2lnX2FuYWx5c2lzX0ZJR1VSRVNfd2l0aF9taWQuciIpDQpgYGANCg0KPGJyLz5HZW5lcmF0ZWQgZGF0YSBmaWxlcyBhbmQgZmlndXJlcyBhcmUgc2F2ZWQgaW4gYGBgLi9nZW5lcmF0ZWRfZGF0YS9ZRmBgYCBhbmQgYGBgLi9maWd1cmVfZ2VuZXJhdGlvbmBgYCwgcmVzcGVjdGl2ZWx5Lg0KPGJyLz4NCg0KLS0tDQoNCiMgU0xFIGRhdGEgYW5hbHlzaXMNCg0KIyMgSW5wdXQgZGF0YQ0KDQoqIEV4cHJlc3Npb24gZGF0YSBkb3dubG9hZGVkIGZyb20gaHR0cDovL3dlYnNsZS5jb20gKERhdGEgdGFiKSAtLSBCYXRjaC1jb3JyZWN0ZWQsIHByb2JlIGZpbHRlcmVkLCBsYXRlc3QgcHJvYmUtZ2VuZSBhbm5vdGF0aW9uLg0KICAqIGRhdGEvU0xFL2V4cHJlc3Npb24vU0xFX0xvbmdpdHVkaW5hbF85NzJfZXNldC5SRGF0YQ0KKiBTdWJqZWN0cyBhc3NpZ25tZW50IHRvIHBhdGllbnQgZ3JvdXBzIChmcm9tIHRoZSBTTEUgcGFwZXIsIGZpZ3VyZSA2QSkNCiAgKiBkYXRhL1NMRS9TTEVfU1VCSkVDVF9QRy50eHQNCjxici8+DQoNCiMjIFN0ZXAgMS4gRGF0YSBmb3JtYXR0aW5nIGFuZCBwcmVwYXJhdGlvbg0KDQpgYGB7cn0NCnNvdXJjZSgiUi9zbGVfZGF0YXByZXAvc2xlX2RhdGFwcmVwLnIiKQ0Kc291cmNlKCJSL3NsZV9kYXRhcHJlcC9zbGVfcHJvYmVzMmdlbmVzLnIiKQ0Kc291cmNlKCJSL3NsZV9kYXRhcHJlcC9zbGVfYWRkX0RBX2FuZF9QRy5yIikNCnNvdXJjZSgiUi9zbGVfZGF0YXByZXAvc2xlX3NhbXBsZV9maWx0ZXJpbmcuciIpDQpzb3VyY2UoIlIvc2xlX2RhdGFwcmVwL3NsZV9nZS5tZWFuX2J5X3N1YmplY3QuciIpDQpzb3VyY2UoIlIvc2xlX2RhdGFwcmVwL3NsZV9zbGVkYWkubG93REEubWVhbl9ieV9zdWJqZWN0LnIiKQ0KYGBgDQoNCjxici8+R2VuZXJhdGUgZmlndXJlIG9mIFNMRURBSSBjaGFuZ2UgYXQgZGlmZmVyZW50IHZpc2l0IGZvciBhIHNpbmdsZSBwYXRpZW50IChGaWcuIDJkKToNCmBgYHtyfQ0Kc291cmNlKCJSL3NsZV9leGFtcGxlX3Byb2ZpbGUvU0xFX1NMRURBSV9USU1FX3Byb2ZpbGVzLnIiKQ0KYGBgDQo8YnIvPg0KDQojIyBTdGVwIDIuIENhbGN1bGF0ZSBpbnRlci1zdWJqZWN0IHZhcmlhdGlvbiAoSVNWKSBvZiBleHByZXNzaW9uIG9mIGluZGl2aWR1YWwgZ2VuZXMgdG8gcXVhbnRpZnkgdGhlaXIgc3RhYmlsaXR5IGFjcm9zcyB2aXNpdHMgd2l0aCBsb3cgZGlzZWFzZSBhY3Rpdml0eQ0KDQpgYGB7cn0NCnNvdXJjZSgiUi9zbGVfZGF0YXByZXAvc2xlX2dlbmVfc3RhYmlsaXR5LnIiKQ0KYGBgDQo8YnIvPkdlbmVyYXRlZCBkYXRhIGZpbGVzIGFuZCBmaWd1cmVzIGFyZSBzYXZlZCBpbiBgYGAuL2dlbmVyYXRlZF9kYXRhL1NMRWBgYCBhbmQgYGBgLi9maWd1cmVfZ2VuZXJhdGlvbmBgYCwgcmVzcGVjdGl2ZWx5Lg0KPGJyLz4NCg0KIyMgU3RlcCAzLiBDYWxjdWxhdGUgVEdTaWcgYW5kIFBsYXNtYWJsYXN0IHNpZ25hdHVyZSBzY29yZXMNCg0KPGJyLz5DYWxjdWxhdGUgVEdTaWcgc2NvcmVzIHVzaW5nIGRhdGEgZnJvbSBsb3ctZGlzZWFzZS1hY3Rpdml0eSBzYW1wbGVzDQpgYGB7cn0NCnNvdXJjZSgiUi9zbGVfc2lnbmF0dXJlX2FuYWx5c2lzL3NsZV9sb3dEQV9jZDM4X3Njb3JlLnIiKQ0KYGBgDQoNCjxici8+Q2FsY3VsYXRlIFBsYXNtYWJsYXN0IHNpZ25hdHVyZSBzY29yZXMgdXNpbmcgZGF0YSBmcm9tIGxvdy1kaXNlYXNlLWFjdGl2aXR5IHNhbXBsZXMNCmBgYHtyfQ0Kc291cmNlKCJSL3NsZV9zaWduYXR1cmVfYW5hbHlzaXMvc2xlX2xvd0RBX1BCX3Njb3JlLnIiKQ0KYGBgDQoNCjxici8+Q2FsY3VsYXRlIERhQ1AgdXNpbmcgbWl4ZWQtZWZmZWN0IG1vZGVsDQpgYGB7cn0NCnNvdXJjZSgiUi9zbGVfc2lnbmF0dXJlX2FuYWx5c2lzL3NsZV9QQl9zY29yZV9mcm9tX21peGVkX21vZGVsLnIiKQ0KYGBgDQoNCjxici8+R2VuZXJhdGUgc2NhdHRlciBwbG90IGJldHdlZW4gRGFDUCBhbmQgYXZlcmFnZSBUR1NpZyBzY29yZXMgZm9yIGxvdy1kaXNlYXNlLWFjdGl2aXR5IHNhbXBsZXMgKEZpZy4gMmUpIGFuZCB0aGUgdGFibGUgb2YgY29ycmVsYXRpb24gZGF0YQ0KYGBge3J9DQpzb3VyY2UoIlIvc2xlX3NpZ25hdHVyZV9hbmFseXNpcy9zbGVfUEIuU0xFREFJLmNvcnJfdnNfQ0QzOC5tZWFuLnNjb3JlX0ZJR1VSRS5yIikNCnNvdXJjZSgiUi9zbGVfc2lnbmF0dXJlX2FuYWx5c2lzL3NsZV9QQi5TTEVEQUkuY29ycl92c19DRDM4Lm1lYW4uc2NvcmVfdGFibGUuciIpDQpgYGANCg0KPGJyLz5HZW5lcmF0ZSBzY2F0dGVyIHBsb3QgYmV0d2VlbiBEYUNQIGFuZCBhdmVyYWdlIFBsYXNtYWJsYXN0IHNpZ25hdHVyZSBzY29yZXMgZm9yIGxvdy1kaXNlYXNlLWFjdGl2aXR5IHNhbXBsZXMgKEZpZy4gMmYpDQpgYGB7cn0NCnNvdXJjZSgiUi9zbGVfc2lnbmF0dXJlX2FuYWx5c2lzL3NsZV9QQi5TTEVEQUkuY29ycl92c19QQi5sb3dEQS5tZWFuLnNjb3JlX0ZJR1VSRS5yIikNCmBgYA0KDQo8YnIvPkdlbmVyYXRlIHNjYXR0ZXIgcGxvdCBiZXR3ZWVuIERhQ1AgYW5kIGF2ZXJhZ2UgUGxhc21hYmxhc3Qgc2lnbmF0dXJlIHNjb3JlcyBmb3IgbG93LWRpc2Vhc2UtYWN0aXZpdHkgc2FtcGxlcyBhbmFseXppbmcgY29ycmVsYXRpb24gYXQgZGlmZmVyZW50IERhQ1AgdGhyZXNob2xkcyAoRXh0LiBEYXRhIEZpZy4gNWMtZCkNCmBgYHtyfQ0Kc291cmNlKCJSL3NsZV9zaWduYXR1cmVfYW5hbHlzaXMvc2xlX1BCLlNMRURBSS5jb3JyX3ZzX0NEMzgubWVhbi5zY29yZV90aHJlc2hvbGRzLnIiKQ0KYGBgDQoNCjxici8+R2VuZXJhdGVkIGRhdGEgZmlsZXMgYW5kIGZpZ3VyZXMgYXJlIHNhdmVkIGluIGBgYC4vZ2VuZXJhdGVkX2RhdGEvU0xFYGBgIGFuZCBgYGAuL2ZpZ3VyZV9nZW5lcmF0aW9uYGBgLCByZXNwZWN0aXZlbHkuDQo8YnIvPg0KDQoNCiMjIEFuYWx5c2lzIG9mIHRoZSBibG9vZCBnZW5lIGV4cHJlc3Npb24gc2lnbmF0dXJlcyBhc3NvY2lhdGVkIHdpdGggZGlzZWFzZSBhY3Rpdml0eS9mbGFyZXMNCg0KPGJyLz5Db3JyZWxhdGlvbiBiZXR3ZWVuIERhQ1AgYW5kIGRlbHRhIGluIFBsYXNtYWJsYXN0IHNjb3JlIChFeHQuIERhdGEgRmlnLiA1Yik6DQpgYGB7cn0NCnNvdXJjZSgiUi9zbGVfc2lnbmF0dXJlX2FuYWx5c2lzL3NsZV9EYUNQX3ZzX2RQQi5yIikNCmBgYA0KDQo8YnIvPkhlYXRtYXBzIG9mIGJsb29kIGdlbmUgZXhwcmVzc2lvbiBzaWduYXR1cmVzIGFzc29jaWF0aW9uIHdpdGggZGlzZWFzZSBhY3Rpdml0eS9mbGFyZXMgKEZpZy4gMmMgYW5kIEV4dC4gRGF0YSBGaWcuIDVhKToNCmBgYHtyfQ0Kc291cmNlKCJSL3NsZV9zaWduYXR1cmVfYW5hbHlzaXMvc2xlX0JUTV9zY29yZV9mcm9tX0RBLmRlbHRhLnIiKQ0KYGBgDQoNCjxici8+R2VuZXJhdGVkIHBsb3RzIGFyZSBzdG9yZWQgaW4gYGBgLi9maWd1cmVfZ2VuZXJhdGlvbmBgYC4NCjxici8+DQoNCi0tLQ0KDQojIERpc2NvdmVyeSBvZiBjby1leHByZXNzaW9uIG1vZHVsZSBpbiBTTEUgZGF0YXNldHMNCg0KIyMgSW5wdXQgZGF0YToNCg0KKiBHZW5lIHN0YWJpbGl0eSB0YWJsZSANCiAgKiAuL2dlbmVyYXRlZF9kYXRhL1NMRV9sb3dEQV9nZW5lc19zdGFiaWxpdHkudHh0DQoqIEdlbmUgZXhwcmVzc2lvbiB0YWJsZSBieSBzdWJqZWN0cyAoYXZlcmFnZSBhY3Jvc3MgbG93LWRpc2Vhc2UtYWN0aXZpdHkgdmlzaXRzKQ0KICAqIC4vZ2VuZXJhdGVkX2RhdGEvU0xFX2xvd0RBX1BHMjM0X2dlLm1lYW5fbWF0cml4LnR4dA0KPGJyLz4NCg0KIyMgU3RlcCAxLiBBcHBseSBXR0NOQSBhbmFseXNpcyB0byBzcGxpdCBnZW5lcyB0byBkaXNjb3ZlciBleHByZXNzaW9uIG1vZHVsZXMuDQoNCjxici8+R2VuZSBtb2R1bGVzIGRpc2NvdmVyeSBieSBXR0NOQQ0KYGBge3J9DQpzb3VyY2UoIlIvV0dDTkEtbW9kdWxlcy1mcm9tLVNMRS1sb3ctREEvc2NyaXB0LlIiKQ0KYGBgDQoNCjxici8+R2VuZXJhdGUgRWlnZW5nZW5lIGhlYXRtYXANCmBgYHtyfQ0Kc291cmNlKCJSL1dHQ05BLWVpZ2VuZ2VuZS1oZWF0bWFwL3NjcmlwdC5SIikNCmBgYA0KDQo8YnIvPlRoZSBnZW5lcmF0ZWQgZmlndXJlcyAoRmlnLiAzYSkgYXJlIHNhdmVkIGluIGBgYC4vZmlndXJlX2dlbmVyYXRpb24vU0xFX1NpZ2BgYC4NCjxici8+DQoNCiMjIFN0ZXAgMi4gQXNzZXNzIGNvcnJlbGF0aW9uIGJldHdlZW4gZ2VuZSBtb2R1bGVzIGFuZCBEYUNQLg0KDQpgYGB7cn0NCnNvdXJjZSgiUi9QQi1zY29yZS12cy1XR0NOQS1tb2R1bGVzL3NjcmlwdC5SIikNCmBgYA0KDQo8YnIvPlRoZSBnZW5lcmF0ZWQgZmlndXJlcyAoRmlnLiAzYi1jKSBhcmUgc2F2ZWQgaW4gYGBgLi9maWd1cmVfZ2VuZXJhdGlvbi9TTEUtU2lnYGBgLg0KVGFibGUgd2l0aCBjb3JyZWxhdGlvbiBkYXRhIGZvciBhbGwgbW9kdWxlcyBpcyBzYXZlZCBpbiBgYGAuL2dlbmVyYXRlZF9kYXRhL1BCLXNjb3JlLXZzLVdHQ05BLW1vZHVsZXNgYGAuDQo8YnIvPg0KDQojIyBTdGVwIDMuIFBlcmZvcm0gR1NFQSBhbmFseXNpcyB3aXRoIFdHQ05BIG1vZHVsZXMgYW5kIGV4dHJhY3QgdGhlIGJyb3duIG1vZHVsZSBsZWFkaW5nIGVkZ2UgZ2VuZXMgKFNMRS1TaWcpLg0KDQpgYGB7cn0NCnNvdXJjZSgiUi9mZ3NlYV93aXRoX3dnY25hX21vZHVsZXMvY2hpX0NEMzhfY29yX2J5X0lTVl9mZ3NlYV9sZWFkaW5nRWRnZS5yIikNCmBgYA0KDQo8YnIvPkdlbmVyYXRlIGEgYmFycGxvdCAoRmlnLiAzZSkgdG8gc2hvdyBlbnJpY2htZW50IG9mIGJyb3duIG1vZHVsZSAod2l0aCB0aGUgZW5yaWNobWVudCBwbG90KSBhbmQgYmxvb2QgdHJhbnNjcmlwdG9tZSBtb2R1bGVzIGluIGdlbmVzIHJhbmtlZCBieSBjb3JyZWxhdGlvbiBvZiB0aGVpciBpbnRlbnNpdHkgd2l0aCBDRDM4KysgY2VsbCBmcmVxdWVuY3kuIFRoZSBnZW5lcyB3ZXJlIGZpbHRlcmVkIHdpdGggSVNWID49IDAuNS4gVGhlIHByZXZpb3VzbHkgZ2VuZXJhdGVkIGRhdGEgKHN0ZXAgNyBpbiBDSEkgZGF0YSBhbmFseXNpcykgd2VyZSB1c2VkIGZvciBHU0VBIHJlc3VsdHMgb2YgQlRNIGVucmljaG1lbnQuIA0KDQpgYGB7cn0NCnNvdXJjZSgiUi9mZ3NlYV93aXRoX3dnY25hX21vZHVsZXMvY2hpX0NEMzhfY29yX2J5X0lTVl9mZ3NlYV9GSUdVUkUuciIpDQpgYGANCg0KPGJyLz5HZW5lcmF0ZSB0YWJsZSBvZiB0aHJlZSBCVE0gbW9kdWxlIGdlbmVzIGluIFNMRS1TaWcgKEZpZy4gM2YpIA0KYGBge3J9DQpzb3VyY2UoIlIvZmdzZWFfd2l0aF93Z2NuYV9tb2R1bGVzL2Jyb3duLWxlYWRpbmctZWRnZS1CVE0tdGFibGUuUiIpDQpgYGANCk91dHB1dCBmaWxlczogYGBgLi9nZW5lcmF0ZWRfZGF0YS9mZ3NlYV93aXRoX3dnY25hX21vZHVsZXMvYGBgDQpUaGUgZ2VuZXJhdGVkIGZpZ3VyZSBpcyBzYXZlZCBhcyBgYGAuL2ZpZ3VyZV9nZW5lcmF0aW9uL1NMRS1TaWdgYGANCjxici8+DQoNCiMjIFN0ZXAgNC4gQW5hbHlzaXMgb2YgZW5yaWNobWVudCBvZiBCbG9vZCBUcmFuc2NyaXB0aW9uIE1vZHVsZXMgZ2VuZXMgaW4gV0dDTkEgbW9kdWxlcy4gR2VuZXJhdGUgdGhlIGhlYXRtYXAgb2YgZW5yaWNobWVudCBwLXZhbHVlcyAoLWxvZzEwKSAtIFN1cHBsZW1lbnRhbCBGaWd1cmUgMWMuDQpgYGB7cn0NCnNvdXJjZSgiUi9XR0NOQS1tb2R1bGVzLWZyb20tU0xFLWxvdy1EQS10bW9kL3NjcmlwdC5SIikNCmBgYA0KVGhlIGdlbmVyYXRlZCBmaWd1cmUgaXMgc2F2ZWQgYXMgYGBgLi9maWd1cmVfZ2VuZXJhdGlvbi9TTEUtU2lnL1dHQ05BLUJUTS1lbnJpY2htZW50LXAuYWRqdXN0LnBkZmBgYC4NCg0KT3V0cHV0IGZpbGVzIGFyZSBzYXZlZCBpbiBgYGAuL2dlbmVyYXRlZF9kYXRhL1dHQ05BLW1vZHVsZXMtZnJvbS1TTEUtbG93LURBLXRtb2RgYGANCjxici8+DQoNCk91dHB1dCB0YWJsZSB0byBGaWcuIDNmIGlzIHNhdmVkIGFzIGBgYC4vZ2VuZXJhdGVkX2RhdGEvZmdzZWFfd2l0aF93Z2NuYV9tb2R1bGVzL2Jyb3duLW1vZC1tNzUtbTE1MC1tMTY1LWdlbmVzLXNob3J0LmNzdmBgYA0KPGJyLz4NCg0KLS0tDQoNCiMgTWV0YSBhbmFseXNpcyBvZiBnZW5lIGV4cHJlc3Npb24gaW4gdmFjY2luYXRpb24gZGF0YXNldHMgYW5kIHRoZSBhbmFseXNpcyBvZiBicm93biBtb2R1bGUNCg0KIyMgSW5wdXQgZGF0YToNCg0KKiBHZW5lIGV4cHJlc3Npb24gdGFibGVzIGZvciBhbGwgZGF0YXNldHMgKGdlbmUgdnMuIHN1YmplY3RzIGF0IGRheTApDQoqIFNhbXBsZSBpbmZvcm1hdGlvbiB3aXRoIHRpdGVyIHJlc3BvbnNlDQoNCiMjIFN0ZXAgMS4gUGVyZm9ybSBtZXRhLWFuYWx5c2lzIG9mIDQgZmx1IGRhdGFzZXRzLiBHZW5lcmF0ZXMgdGFibGUgb2YgZ2VuZXMgd2l0aCBlZmZlY3Qgc2l6ZSAod2l0aCByZWdhcmQgdG8gdGl0ZXIgcmVzcG9uc2UpLg0KDQpgYGB7cn0NCnNvdXJjZSgiUi9NZXRhREUtZmx1LXRpdGVyLXJlc3BvbnNlLWZyb20tZXhwcmVzc2lvbi1pbi1mb3VyLWNvaG9ydHMvc2NyaXB0LlIiKQ0KYGBgDQpPdXRwdXQgZmlsZXMgYXJlIHNhdmVkIGluIGBgYC4vZ2VuZXJhdGVkX2RhdGEvTWV0YURFYGBgLg0KPGJyLz4NCg0KIyMgU3RlcCAyLiBHZW5lcmF0ZSBmb3Jlc3QgcGxvdCBmb3IgbWV0YS1hbmFseXNpcyBvZiA0IGZsdSBkYXRhc2V0cyAoRXh0LiBEYXRhIEZpZyA0YikuIA0KDQpgYGB7cn0NCnNvdXJjZSgiUi9NZXRhREVfZm9yZXN0X3Bsb3QvRmx1X21ldGFfZm9yZXN0X3Bsb3QuciIpDQpgYGANClRoZSBnZW5lcmF0ZWQgZmlndXJlIGlzIHNhdmVkIGluIGBgYC4vZmlndXJlX2dlbmVyYXRpb24vTWV0YURFYGBgLg0KPGJyLz4NCg0KIyMgU3RlcCAzLiBDYWxjdWxhdGUgZWZmZWN0IHNpemVzIGFuZCBnZW5lcmF0ZSBlZmZlY3Qgc2l6ZSBwbG90IGZvciB0cmlhbCAxIGNvaG9ydCBvZiBZZWxsb3cgRmV2ZXIgZGF0YXNldCAoRXh0LiBEYXRhIEZpZyA0YykuIA0KYGBge3J9DQpzb3VyY2UoIlIvWUYxLWVmZmVjdC1zaXplcy9zY3JpcHQuUiIpDQpzb3VyY2UoIlIvTWV0YURFX2ZvcmVzdF9wbG90L1lGMV9lZmZlY3Rfc2l6ZV9wbG90LnIiKQ0KYGBgDQpUaGUgb3V0cHV0IGZpbGVzIGFyZSBzYXZlZCBpbiBgYGAuL2dlbmVyYXRlZF9kYXRhL01ldGFERWBgYC4NClRoZSBnZW5lcmF0ZWQgZmlndXJlIGlzIHNhdmVkIGluIGBgYC4vZmlndXJlX2dlbmVyYXRpb24vTWV0YURFYGBgLg0KPGJyLz4NCg0KIyMgU3RlcCA0LiBHU0VBIGFuYWx5c2VzIG9mIHZhY2NpbmUgcmVzcG9uc2UgZ2VuZXMgZnJvbSBtZXRhIGFuYWx5c2lzLiBXR0NOQSBtb2R1bGVzIGFnYWluc3QgZmx1IHJlc3BvbnNlIGdlbmVzDQpgYGB7cn0NCnNvdXJjZSgiUi9HU0VBLXVzaW5nLWdlbmVzLWNvbW1vbi10by1zdGFibGUtU0xFLWxvdy1EQS1hbmQtNGZsdS9zY3JpcHQuUiIpDQpgYGAgICAgDQpUaGUgb3V0cHV0IGZpbGVzIGFyZSBzYXZlZCBpbiBgYGAuL2dlbmVyYXRlZF9kYXRhL01ldGFERWBgYC4NClRoZSBnZW5lcmF0ZWQgZmlndXJlIChGaWcuIDNkKSBpcyBzYXZlZCBpbiBgYGAuL2ZpZ3VyZV9nZW5lcmF0aW9uL01ldGFERWBgYC4NCjxici8+DQoNCg0KIyMgU3RlcCA1LiBQcmVkaWN0aXZlIHByb2ZpbGVzIG9mIHNlbGVjdCBzaWduYXR1cmVzIGZvciBpbmZsdWVuemEgdmFjY2luZSByZXNwb25zZQ0KYGBge3J9DQpzb3VyY2UoIlIvYnJvd24tbW9kdWxlLWxlYWRpbmctZ2VuZXMtbG93LW1pZC1oaWdoLWVpZ2VuZ2VuZS9zY3JpcHQuUiIpDQpgYGANCk91dHB1dCBmaWxlcyBhcmUgc2F2ZWQgaW4gYGBgLi9nZW5lcmF0ZWRfZGF0YS9icm93bi1tb2R1bGUtbGVhZGluZy1nZW5lcy1sb3ctbWlkLWhpZ2gtZWlnZW5nZW5lYGBgLiANCjxici8+DQoNCmBgYHtyfQ0Kc291cmNlKCJSL3JlY2FsYy1hbmQtY2hlY2stMTBnZW5lLUNEMzhwbHVzU2lnL3NjcmlwdC5SIikNCmBgYA0KT3V0cHV0IGZpZ3VyZXMgKEV4dC4gRGF0YSBGaWcuIDYgYS1iLCBlKSBhcmUgc2F2ZWQgaW4gYGBgLi9maWd1cmVfZ2VuZXJhdGlvbi9TTEUtU2lnYGBgLg0KPGJyLz4NCg0KVGVzdCByZW1vdmluZyBTTEUtU2lnIGdlbmVzIGZyb20gYnJvd24gbW9kdWxlDQpgYGB7cn0NCnNvdXJjZSgiUi9icm93bi1tb2QtbWludXMtbGVhZGluZy1lZGdlL3NjcmlwdC5SIikNCmBgYA0KT3V0cHV0IGZpbGVzIGFyZSBzYXZlZCBpbiBgYGAuL2dlbmVyYXRlZF9kYXRhL2Jyb3duLW1vZC1taW51cy1sZWFkaW5nLWVkZ2UvYGBgLg0KPGJyLz4NCg0KYGBge3J9DQpzb3VyY2UoIlIvYnJvd24tbW9kLW1pbnVzLWxlYWRpbmctZWRnZS1jb21iaW5lZC9zY3JpcHQuUiIpDQpgYGANCk91dHB1dCBmaWd1cmUgKEV4dC4gRGF0YSBGaWcuIDZkKSBpcyBzYXZlZCBpbiBgYGAuL2ZpZ3VyZV9nZW5lcmF0aW9uL1NMRS1TaWdgYGAuDQo8YnIvPg0KDQotLS0NCg0KIyBBbmFseXNpcyBvZiBJRk4tSS1EQyBzaWduYXR1cmUNCmBgYHtyfQ0Kc291cmNlKCJSL0lGTl9zaWduYXR1cmVfYW5hbHlzaXMvc2V0dXAuciIpDQpzb3VyY2UoIlIvSUZOX3NpZ25hdHVyZV9hbmFseXNpcy9jaGlfSUZOMjZfc2lnX2FuYWx5c2lzX0ZJR1VSRVMyLnIiKQ0Kc291cmNlKCJSL0lGTl9zaWduYXR1cmVfYW5hbHlzaXMvaGlwY19kMF9JRk4yNl9zY29yZS5yIikNCnNvdXJjZSgiUi9JRk5fc2lnbmF0dXJlX2FuYWx5c2lzL3NsZV9sb3dEQV9JRk4yNl9zY29yZS5yIikNCnNvdXJjZSgiUi9JRk5fc2lnbmF0dXJlX2FuYWx5c2lzL2xvZ2lzdGljX3JlZ3JfNGZsdS5yIikNCmBgYA0KT3V0cHV0IGZpbGVzIGFyZSBzYXZlZCBpbiBgYGAuL2dlbmVyYXRlZF9kYXRhL0lGTjI2YGBgLg0KDQpPdXRwdXQgZmlndXJlcyAoRXh0LiBEYXRhIEZpZy4gNmMsZikgYXJlIHNhdmVkIGluIGBgYC4vZmlndXJlX2dlbmVyYXRpb24vSUZOMjZgYGAuDQo8YnIvPg0KDQotLS0NCg0KIyBBbmFseXNpcyBvZiBSTkFzZXEgZGF0YSBmcm9tIHNvcnRlZCBCIGNlbGwgc3Vic2V0cw0KDQpDb21wYXJlIENEMjArQ0QzOCsrIEIgY2VsbHMgd2l0aCBDRDIwKyBCIGNlbGxzIHdpdGggREVzZXEyOg0KDQpgYGB7cn0NCnNvdXJjZSgiUi9STkFzZXEvQmNlbGxfY29tcGFyaXNpb25fREVzZXEuciIpDQpgYGANCg0KT3V0cHV0IGZpbGVzIGFyZSBzYXZlZCBpbiBgYGAuL2dlbmVyYXRlZF9kYXRhL1JOQXNlcWBgYC4NCk91dHB1dCBmaWd1cmVzIChpbmNsLiBFeHQuIERhdGEgRmlnLiA3YikgYXJlIHNhdmVkIGluIGBgYC4vZmlndXJlX2dlbmVyYXRpb24vUk5Bc2VxYGBgLg0KDQo8YnIvPg0KDQpFbnJpY2htZW50IGFuYWx5c2lzIG9mIFNMRS1TaWcgZ2VuZXMgYW5kIGdlbmVzIGNvcnJlbGF0ZWQgd2l0aCBDRDIwK0NEMzgrKyBCIGNlbGxzIChhdCBkaWZmZXJlbnQgVFNNKSBhZ2FpbnN0IGdlbmVzIHJhbmtlZCBieSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBmcm9tIFJOQXNlcToNCg0KYGBge3J9DQpzb3VyY2UoIlIvUk5Bc2VxL2Jyb3duLW1vZC1sZWFkaW5nLWVkZ2UtZW5yaWNobWVudC5yIikNCmBgYA0KDQpPdXRwdXQgZmlsZXMgYXJlIHNhdmVkIGluIGBgYC4vZ2VuZXJhdGVkX2RhdGEvUk5Bc2VxYGBgLg0KT3V0cHV0IGZpZ3VyZXMgKEV4dC4gRGF0YSBGaWcuIDdjLWUpIGFyZSBzYXZlZCBpbiBgYGAuL2ZpZ3VyZV9nZW5lcmF0aW9uL1JOQXNlcWBgYC4NCg0KPGJyLz4NCjxici8+DQoNCi0tLQ0K