Workflow Overview
Objectives
- List some applications of scRNA-Seq.
- Compare and contrast the capabilities and challenges in scRNA-Seq vs
bulk RNA-Seq approaches.
- Introduce a specific experimental model to guide discussion and
learning.
- Outline the abstract approach to single-cell sequencing and consider
the 10x Genomics platform in more detail.
- Consider common challenges in executing these initial steps.
Overview of bulk RNA-seq and scRNA-Seq
Next Generation Sequencing (NGS) enables many powerful experimental
designs and analysis approaches including variant identification,
chromatin accessibility, gene expression, and more. Before we dive into
the complexities of single-cell RNA-Seq analysis, it’s beneficial to
review the new perspectives afforded by a scRNA-Seq single cell approach
and helpful to consider scRNA-Seq alongside a traditional bulk RNA-Seq
approach.
Bulk RNA-Seq approach
|
|
Bulk RNA-seq typically involves comparing the expression levels of genes
between sets of tissues, e.g. untreated and treated mice. This enables
researchers to characterize distinct expression patterns for a specific
gene and also expression changes across functionally related genes or
pathways. This is valuable because it provides an overall snapshot of
the average expression program across the sample. However, considering
the sample a single homogeneous population of cells can obscure subtle
changes or patterns in expression.
|
Single-cell RNA-Seq approach
|
|
Instead of looking at the whole forest, that is to say, the average
of the gene expression in a tissue or a biofluid, single cell
illuminates expression for a collection of individual cells (i.e. you
can now see consider individual trees). This enables similar
perspectives to bulk (e.g. insight into biological mechanisms and
distinct response to interventions) but also new views informed by
cellular heterogeneity:
- What kinds of cells are present in this sample?
- How does the cell population structure change between
groups/conditions?
- What are the expression patterns between cell types or between
groups/conditions?
- How do cells change over time and how might we affect that
development?
|
Consider a specific scRNA-Seq experiment
These concepts can be abstract. Acknowledging that the basic concepts
are broadly applicable, it’s helpful to ground the conversation in a
specific scRNA-Seq experiment.
Consider a specific experiment
|
|
In this workshop we will be focusing on an experiment conducted at UM
on a mouse model where a soft tissue injury is followed by an aberrant
injury response that generates bone tissue. For more details on this
experiment, it’s original analysis and the biology of heterotopic
ossification, see the full paper [1].
- A simplified version of the experiment:
- A sample of mouse tissue is extracted from a healthy mouse.
- The researcher induces a burn at the sample site.
- The researchers re-sample tissue from the site at several time
points.
- Each sample undergoes scRNA-Seq prep and analysis. (This is
replicated across four mice.)
- The scRNA-Seq analysis of this sample can reveal the population of
cell types present and also the gene expression patterns of each cell
time over time.
|
How scRNA-Seq works
It’s also useful to orient on how scRNA-Seq works at an abstract
level. There are many different platforms and protocols, but many have
steps similar to below.
Single cell protocol (from 30k feet)
|
|
- Sample tissue (or biofluid) is collected.
- Tissue is dissociated into a suspension of healthy,
intact cells
- Cells are physically isolated.
- Cell transcripts converted to cDNA labeled with their cell of
origin.
- cDNAs from all cells is pooled
- cDNAs undergo library prep and are sequenced
- The resulting transcript sequences can be partitioned into
(putative) cells computationally.
|
10x Genomics 3’ gene expression
It’s useful to elaborate how transcripts are labeled with their cell
of origin because this will help us understand how downstream QC and
analysis works. The specifics of the steps depend on the platform and
the specific library prep protocol. We will focus on the 10x
Genomics 3’ gene expression approach[2].
A 10x Genomics single cell protocol (from 10k feet)
|
|
- 10x Genomics uses microfluidics to combine an isolated cell with a
manufactured oligo-bead in an aqueous droplet in an oil emulsion. The
oil isolates each droplet, effectively creating a reaction vessel for
each cell-bead dyad.
- Ideally, each droplet contains reaction enzymes (carried in the
aqueous solution), a single bead and a single healthy, intact cell. The
cell is lysed to release the mRNA transcripts into the droplet.
- The beads are covered with a lawn of millions of oligos. Each oligo
is designed to interact with poly-A tailed mRNAs and the enzymes to
produce a complementary DNA molecule (cDNA).
- Each cDNA contains:
- the sequence of an individual mRNA transcript (from the cell)
- flanking sequence added for downstream library prep
- a 12bp Unique Molecular Identifier (UMI): the UMIs are unique for
each of the oligos on the bead ensuring each UMI represents a
single mRNA. (This enables reliable de-duplication following
sequencing.)
- 16 bp barcode sequence: all barcodes are identical for a given bead,
so the barcode sequence acts as a molecular label for each transcript;
each barcode represent a distinct cell of origin for that
mRNA.
|
Consider (just) two droplets
|
|
- Each droplet converts mRNAs into cDNAs that contain the oligo
sequence and the mRNA sequence.
- Each mRNA sequence will get a distinct UMI, so one UMI = one
mRNA.
- For a single droplet, the cell barcodes will all match. Cell
barcodes will be distinct across droplets.
|
From droplets to matrix
|
|
- Once mRNA transcripts have been converted to barcode-labeled cDNA
the oil emulsion can be broken and the cDNA molecules are pooled
together.
- cDNA molecules undergo several conventional library prep steps to
enable sequencing.
- The sequencer calls bases for each sequence. For a large sequencing
run, this might contain many samples, several experiments, and even
multiple experiment types.
- The resulting 10x FASTQ files have a specific structure.
- Read2 represents the mRNA sequence.
- Read1 represents the barcode and UMI
- Specialized software bins each distinct barcode into a putative cell
and aligns the mRNA sequence against a genome build.
- Alignments for features (genes) are quantified across all barcodes
to create a feature barcode matrix.
|
Common problems and challenges
Some droplets don’t work as intended
|
|
- Interpreting the sequencing outputs is simplest when each droplet
contains a single bead and a single healthy cell. The system is
optimized for this outcome and typically the majority of droplets will
follow this pattern. However, in each run there are always a few
complicating edge cases to consider.
- Sometimes a droplet contains a bead but no cell. This is actually
common but it’s impact is slight because in the absence of mRNA, the
enzymes won’t produce cDNA. In effect, the droplet appears empty and is
discarded.
- Sometimes two beads land in the same droplet with a cell. In theory,
the cells mRNA would appear to come from two droplets (i.e. two cells)
each with half the expected expression levels. In practice this rarely
happens because the microfluidics are tuned to avoid this.
- Sometimes two cells join with a single bead in a droplet creating a
doublet. This happens when some of the cells are not
fully dissociated from each other. In this case, the mRNAs from two
cells will receive the same label; the expression programs are merged
and the overall expected expression is roughly doubled.
- Sometimes the stress of the protocol induces cells to start
apoptosis. This confounds analysis because the expression programs
aren’t about the model biology but instead artifacts from the
experimental platform.
- Sometimes dissociated cells become so stressed they start to break
down in the suspension. When that happens, the mRNAs from the popped
cell’s combine together in the aqueous flow to create a soup of ambient
RNA. This appears as a droplet with extremely low expression.
|
Contrasting bulk RNA-seq with scRNA-Seq
Bulk and single-cell approaches are fundamentally complementary
approaches where bulk RNA-Seq provides a “forest-level” view while
scRNA-Seq shows the individual trees. Compared to bulk RNA-Seq,
scRNA-Seq provides powerful new perspectives. But it isn’t without
challenges or downsides.
Bulk vs. Single-Cell
|
|
- Single-cell is less mature than bulk.
- Single-cell sample prep is more complex than bulk.
- Single-cell typically sees only the subset of highly expressed
genes.
- Single cell analysis is typically more complex.
- Single cell analysis costs more than bulk analysis.
|
Summary
- scRNA-seq offers a powerful and nuanced approach to studying gene
expression at the cellular level. This technique can illuminate
biological mechanisms of healthy tissue or disease as well as extend our
understanding of cellular heterogeneity, responses to interventions, and
the cell state dynamics.
- scRNA-Seq experiments are typically more complex and often more
expensive than bulk RNA-Seq.
scRNA-Seq steps in summary
|
|
- A sample of tissue is extracted
- Tissue is dissociated into a clean suspension of healthy cells
- A reaction creates a cDNA molecule which combines a barcode label
with mRNA sequence.
- cDNAs are pooled together, library prep’ed and sequenced
- Computationally connect all the mRNAs back to a distinct cell of
origin
- Align the mRNA sequences to create a count matrix across all the
features and all the cells
- Bioinformatically separate the healthy cells from the experimental
artifacts
The last three steps are complex and also computationally demanding.
In 10x Genomics experiments, they are typically expedited by the tool
Cell Ranger which we cover in detail in the next
lesson.
|
LS0tCnRpdGxlOiAiT3JpZW50aW5nIG9uIHNjUk5BLVNlcSIKYXV0aG9yOiAiVU0gQmlvaW5mb3JtYXRpY3MgQ29yZSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgICAgICAgaHRtbF9kb2N1bWVudDoKICAgICAgICAgICAgaW5jbHVkZXM6CiAgICAgICAgICAgICAgICBpbl9oZWFkZXI6IGhlYWRlci5odG1sCiAgICAgICAgICAgIHRoZW1lOiBwYXBlcgogICAgICAgICAgICB0b2M6IHRydWUKICAgICAgICAgICAgdG9jX2RlcHRoOiA0CiAgICAgICAgICAgIHRvY19mbG9hdDogdHJ1ZQogICAgICAgICAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlCiAgICAgICAgICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICAgICAgICAgIG1hcmtkb3duOiBHRk0KICAgICAgICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICAgZm9udC1zaXplOiAxOHB4Owp9CmNvZGUucnsKICBmb250LXNpemU6IDEycHg7Cn0KcHJlIHsKICBmb250LXNpemU6IDEycHgKfQoKdGFibGUuZmlnLCB0aC5maWcsIHRkLmZpZyB7CiAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICBwYWRkaW5nOiAxNXB4Owp9CiAgCjwvc3R5bGU+CgojIFdvcmtmbG93IE92ZXJ2aWV3IHsudW5saXN0ZWQgLnVubnVtYmVyZWR9Cgo8YnIvPgo8aW1nIHNyYz0iaW1hZ2VzL3dheWZpbmRlci93YXlmaW5kZXIucG5nIiBhbHQ9IndheWZpbmRlciIgc3R5bGU9ImhlaWdodDogNDAwcHg7Ii8+Cjxici8+Cjxici8+CgojIE9iamVjdGl2ZXMKCi0gTGlzdCBzb21lIGFwcGxpY2F0aW9ucyBvZiBzY1JOQS1TZXEuCi0gQ29tcGFyZSBhbmQgY29udHJhc3QgdGhlIGNhcGFiaWxpdGllcyBhbmQgY2hhbGxlbmdlcyBpbiBzY1JOQS1TZXEgdnMgYnVsayBSTkEtU2VxIGFwcHJvYWNoZXMuCi0gSW50cm9kdWNlIGEgc3BlY2lmaWMgZXhwZXJpbWVudGFsIG1vZGVsIHRvIGd1aWRlIGRpc2N1c3Npb24gYW5kIGxlYXJuaW5nLgotIE91dGxpbmUgdGhlIGFic3RyYWN0IGFwcHJvYWNoIHRvIHNpbmdsZS1jZWxsIHNlcXVlbmNpbmcgYW5kIGNvbnNpZGVyIHRoZSAxMHggR2Vub21pY3MgcGxhdGZvcm0gaW4gbW9yZSBkZXRhaWwuCi0gQ29uc2lkZXIgY29tbW9uIGNoYWxsZW5nZXMgaW4gZXhlY3V0aW5nIHRoZXNlIGluaXRpYWwgc3RlcHMuCgo8YnIvPgo8YnIvPgoKIyBPdmVydmlldyBvZiBidWxrIFJOQS1zZXEgYW5kIHNjUk5BLVNlcQoKTmV4dCBHZW5lcmF0aW9uIFNlcXVlbmNpbmcgKE5HUykgZW5hYmxlcyBtYW55IHBvd2VyZnVsIGV4cGVyaW1lbnRhbCBkZXNpZ25zIGFuZAphbmFseXNpcyBhcHByb2FjaGVzIGluY2x1ZGluZyB2YXJpYW50IGlkZW50aWZpY2F0aW9uLCBjaHJvbWF0aW4gYWNjZXNzaWJpbGl0eSwgCmdlbmUgZXhwcmVzc2lvbiwgYW5kIG1vcmUuIEJlZm9yZSB3ZSBkaXZlIGludG8gdGhlIGNvbXBsZXhpdGllcyBvZiBzaW5nbGUtY2VsbApSTkEtU2VxIGFuYWx5c2lzLCBpdCdzIGJlbmVmaWNpYWwgdG8gcmV2aWV3IHRoZSBuZXcgcGVyc3BlY3RpdmVzIGFmZm9yZGVkIGJ5CmEgc2NSTkEtU2VxIHNpbmdsZSBjZWxsIGFwcHJvYWNoIGFuZCBoZWxwZnVsIHRvIGNvbnNpZGVyIHNjUk5BLVNlcSBhbG9uZ3NpZGUgYQp0cmFkaXRpb25hbCBidWxrIFJOQS1TZXEgYXBwcm9hY2guCgo8dGFibGUgY2xhc3M9J2ZpZyc+PHRyPjx0aCBjbGFzcz0nZmlnJz5CdWxrIFJOQS1TZXEgYXBwcm9hY2g8L3RoPjwvdHI+Cjx0cj48dGQgY2xhc3M9J2ZpZyc+IVtdKGltYWdlcy8wMEEtT3JpZW50aW5nT25TY1JOQVNlcS9idWxrUk5BLVNlcS1jYXBhYmlsaXRpZXMucG5nKTwvdGQ+PC90cj4KPHRyPjx0ZCBjbGFzcz0nZmlnJz4KQnVsayBSTkEtc2VxIHR5cGljYWxseSBpbnZvbHZlcyBjb21wYXJpbmcgdGhlIGV4cHJlc3Npb24gbGV2ZWxzIG9mIGdlbmVzIGJldHdlZW4Kc2V0cyBvZiB0aXNzdWVzLCBlLmcuIHVudHJlYXRlZCBhbmQgdHJlYXRlZCBtaWNlLiBUaGlzIGVuYWJsZXMgcmVzZWFyY2hlcnMgdG8gCmNoYXJhY3Rlcml6ZSBkaXN0aW5jdCBleHByZXNzaW9uIHBhdHRlcm5zIGZvciBhIHNwZWNpZmljIGdlbmUgYW5kIGFsc28gCmV4cHJlc3Npb24gY2hhbmdlcyBhY3Jvc3MgZnVuY3Rpb25hbGx5IHJlbGF0ZWQgZ2VuZXMgb3IgcGF0aHdheXMuIFRoaXMgaXMgCnZhbHVhYmxlIGJlY2F1c2UgaXQgcHJvdmlkZXMgYW4gb3ZlcmFsbCBzbmFwc2hvdCBvZiB0aGUgYXZlcmFnZSBleHByZXNzaW9uIApwcm9ncmFtIGFjcm9zcyB0aGUgc2FtcGxlLiBIb3dldmVyLCBjb25zaWRlcmluZyB0aGUgc2FtcGxlIGEgc2luZ2xlIGhvbW9nZW5lb3VzCnBvcHVsYXRpb24gb2YgY2VsbHMgY2FuIG9ic2N1cmUgc3VidGxlIGNoYW5nZXMgb3IgcGF0dGVybnMgaW4gZXhwcmVzc2lvbi4KPC90ZD48L3RyPgo8L3RhYmxlPgo8YnIvPgo8YnIvPgo8dGFibGUgY2xhc3M9J2ZpZyc+PHRyPjx0aCBjbGFzcz0nZmlnJz5TaW5nbGUtY2VsbCBSTkEtU2VxIGFwcHJvYWNoPC90aD48L3RyPgo8dHI+PHRkIGNsYXNzPSdmaWcnPiFbXShpbWFnZXMvMDBBLU9yaWVudGluZ09uU2NSTkFTZXEvc2NSTkEtU2VxLWNhcGFiaWxpdGllcy5wbmcpPC90ZD48L3RyPgo8dHI+PHRkIGNsYXNzPSdmaWcnPgpJbnN0ZWFkIG9mIGxvb2tpbmcgYXQgdGhlIHdob2xlIGZvcmVzdCwgdGhhdCBpcyB0byBzYXksIHRoZSBhdmVyYWdlIG9mIHRoZSBnZW5lIApleHByZXNzaW9uIGluIGEgdGlzc3VlIG9yIGEgYmlvZmx1aWQsIHNpbmdsZSBjZWxsIGlsbHVtaW5hdGVzIGV4cHJlc3Npb24gZm9yIGEgCmNvbGxlY3Rpb24gb2YgaW5kaXZpZHVhbCBjZWxscyAoaS5lLiB5b3UgY2FuIG5vdyBzZWUgY29uc2lkZXIgaW5kaXZpZHVhbCB0cmVlcykuClRoaXMgZW5hYmxlcyBzaW1pbGFyIHBlcnNwZWN0aXZlcyB0byBidWxrIChlLmcuIGluc2lnaHQgaW50byBiaW9sb2dpY2FsIAptZWNoYW5pc21zIGFuZCBkaXN0aW5jdCByZXNwb25zZSB0byBpbnRlcnZlbnRpb25zKSBidXQgYWxzbyBuZXcgdmlld3MgaW5mb3JtZWQKYnkgY2VsbHVsYXIgaGV0ZXJvZ2VuZWl0eToKCjEuIFdoYXQga2luZHMgb2YgY2VsbHMgYXJlIHByZXNlbnQgaW4gdGhpcyBzYW1wbGU/IAoxLiBIb3cgZG9lcyB0aGUgY2VsbCBwb3B1bGF0aW9uIHN0cnVjdHVyZSBjaGFuZ2UgYmV0d2VlbiBncm91cHMvY29uZGl0aW9ucz8KMS4gV2hhdCBhcmUgdGhlIGV4cHJlc3Npb24gcGF0dGVybnMgYmV0d2VlbiBjZWxsIHR5cGVzIG9yIGJldHdlZW4gZ3JvdXBzL2NvbmRpdGlvbnM/CjEuIEhvdyBkbyBjZWxscyBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBob3cgbWlnaHQgd2UgYWZmZWN0IHRoYXQgZGV2ZWxvcG1lbnQ/Cgo8L3RkPjwvdHI+CjwvdGFibGU+Cgo8YnIvPgo8YnIvPgoKIyBDb25zaWRlciBhIHNwZWNpZmljIHNjUk5BLVNlcSBleHBlcmltZW50CgpUaGVzZSBjb25jZXB0cyBjYW4gYmUgYWJzdHJhY3QuIEFja25vd2xlZGdpbmcgdGhhdCB0aGUgYmFzaWMgY29uY2VwdHMgYXJlCmJyb2FkbHkgYXBwbGljYWJsZSwgaXQncyBoZWxwZnVsIHRvIGdyb3VuZCB0aGUgY29udmVyc2F0aW9uIGluIGEgc3BlY2lmaWMgCnNjUk5BLVNlcSBleHBlcmltZW50LgoKPHRhYmxlIGNsYXNzPSdmaWcnPjx0cj48dGggY2xhc3M9J2ZpZyc+Q29uc2lkZXIgYSBzcGVjaWZpYyBleHBlcmltZW50PC90aD48L3RyPgo8dHI+PHRkIGNsYXNzPSdmaWcnPiFbXShpbWFnZXMvMDBBLU9yaWVudGluZ09uU2NSTkFTZXEvc3BlY2lmaWMtZXhwZXJpbWVudC5wbmcpPC90ZD48L3RyPgo8dHI+PHRkIGNsYXNzPSdmaWcnPgpJbiB0aGlzIHdvcmtzaG9wIHdlIHdpbGwgYmUgZm9jdXNpbmcgb24gYW4gZXhwZXJpbWVudCBjb25kdWN0ZWQgYXQgVU0gb24gYSBtb3VzZSAKbW9kZWwgd2hlcmUgYSBzb2Z0IHRpc3N1ZSBpbmp1cnkgaXMgZm9sbG93ZWQgYnkgYW4gYWJlcnJhbnQgaW5qdXJ5IHJlc3BvbnNlCnRoYXQgZ2VuZXJhdGVzIGJvbmUgdGlzc3VlLiBGb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMgZXhwZXJpbWVudCwgaXQncyBvcmlnaW5hbAphbmFseXNpcyBhbmQgdGhlIGJpb2xvZ3kgb2YgaGV0ZXJvdG9waWMgb3NzaWZpY2F0aW9uLCBzZWUgdGhlIGZ1bGwgcGFwZXIgW1sxXV0oI3JlZmVyZW5jZXMpLgoKCkEpIEEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBleHBlcmltZW50OgoKMS4gQSBzYW1wbGUgb2YgbW91c2UgdGlzc3VlIGlzIGV4dHJhY3RlZCBmcm9tIGEgaGVhbHRoeSBtb3VzZS4KMS4gVGhlIHJlc2VhcmNoZXIgaW5kdWNlcyBhIGJ1cm4gYXQgdGhlIHNhbXBsZSBzaXRlLgoxLiBUaGUgcmVzZWFyY2hlcnMgcmUtc2FtcGxlIHRpc3N1ZSBmcm9tIHRoZSBzaXRlIGF0IHNldmVyYWwgdGltZSBwb2ludHMuCjEuIEVhY2ggc2FtcGxlIHVuZGVyZ29lcyBzY1JOQS1TZXEgcHJlcCBhbmQgYW5hbHlzaXMuCihUaGlzIGlzIHJlcGxpY2F0ZWQgYWNyb3NzIGZvdXIgbWljZS4pCgpCKSBUaGUgc2NSTkEtU2VxIGFuYWx5c2lzIG9mIHRoaXMgc2FtcGxlIGNhbiByZXZlYWwgdGhlIHBvcHVsYXRpb24gb2YgY2VsbCB0eXBlcwpwcmVzZW50IGFuZCBhbHNvIHRoZSBnZW5lIGV4cHJlc3Npb24gcGF0dGVybnMgb2YgZWFjaCBjZWxsIHRpbWUgb3ZlciB0aW1lLgoKPC90ZD48L3RyPgo8L3RhYmxlPgoKCjxici8+Cjxici8+CgojIEhvdyBzY1JOQS1TZXEgd29ya3MKCkl0J3MgYWxzbyB1c2VmdWwgdG8gb3JpZW50IG9uIGhvdyBzY1JOQS1TZXEgd29ya3MgYXQgYW4gYWJzdHJhY3QgbGV2ZWwuIFRoZXJlIAphcmUgbWFueSBkaWZmZXJlbnQgcGxhdGZvcm1zIGFuZCBwcm90b2NvbHMsIGJ1dCBtYW55IGhhdmUgc3RlcHMgc2ltaWxhciB0byBiZWxvdy4KCjx0YWJsZSBjbGFzcz0nZmlnJz48dHI+PHRoIGNsYXNzPSdmaWcnPlNpbmdsZSBjZWxsIHByb3RvY29sIChmcm9tIDMwayBmZWV0KTwvdGg+PC90cj4KPHRyPjx0ZCBjbGFzcz0nZmlnJz4hW10oaW1hZ2VzLzAwQS1PcmllbnRpbmdPblNjUk5BU2VxL3NjUk5BLVNlcS1mcm9tLTMway5wbmcpPC90ZD48L3RyPgo8dHI+PHRkIGNsYXNzPSdmaWcnPgoKQSkgU2FtcGxlIHRpc3N1ZSAob3IgYmlvZmx1aWQpIGlzIGNvbGxlY3RlZC4gPGJyLz4KQikgVGlzc3VlIGlzIGRpc3NvY2lhdGVkIGludG8gYSBzdXNwZW5zaW9uIG9mICoqaGVhbHRoeSwgaW50YWN0KiogY2VsbHMKQykgQ2VsbHMgYXJlIHBoeXNpY2FsbHkgaXNvbGF0ZWQuCkQpIENlbGwgdHJhbnNjcmlwdHMgY29udmVydGVkIHRvIGNETkEgbGFiZWxlZCB3aXRoIHRoZWlyIGNlbGwgb2Ygb3JpZ2luLgpFKSBjRE5BcyBmcm9tIGFsbCBjZWxscyBpcyBwb29sZWQKRikgY0ROQXMgdW5kZXJnbyBsaWJyYXJ5IHByZXAgYW5kIGFyZSBzZXF1ZW5jZWQKRykgVGhlIHJlc3VsdGluZyB0cmFuc2NyaXB0IHNlcXVlbmNlcyBjYW4gYmUgcGFydGl0aW9uZWQgaW50byAocHV0YXRpdmUpIGNlbGxzIGNvbXB1dGF0aW9uYWxseS4gCgo8L3RkPjwvdHI+CjwvdGFibGU+Cgo8YnIvPgo8YnIvPgoKIyMgMTB4IEdlbm9taWNzIDMnIGdlbmUgZXhwcmVzc2lvbgoKSXQncyB1c2VmdWwgdG8gZWxhYm9yYXRlIGhvdyB0cmFuc2NyaXB0cyBhcmUgbGFiZWxlZCB3aXRoIHRoZWlyIGNlbGwgb2Ygb3JpZ2luCmJlY2F1c2UgdGhpcyB3aWxsIGhlbHAgdXMgdW5kZXJzdGFuZCBob3cgZG93bnN0cmVhbSBRQyBhbmQgYW5hbHlzaXMgd29ya3MuIFRoZQpzcGVjaWZpY3Mgb2YgdGhlIHN0ZXBzIGRlcGVuZCBvbiB0aGUgcGxhdGZvcm0gYW5kIHRoZSBzcGVjaWZpYyBsaWJyYXJ5IHByZXAgCnByb3RvY29sLiBXZSB3aWxsIGZvY3VzIG9uIHRoZSAqKjEweCBHZW5vbWljcyAzJyBnZW5lIGV4cHJlc3Npb24qKiBhcHByb2FjaFtbMl1dKCNyZWZlcmVuY2VzKS4KCjx0YWJsZSBjbGFzcz0nZmlnJz48dHI+PHRoIGNsYXNzPSdmaWcnPkEgMTB4IEdlbm9taWNzIHNpbmdsZSBjZWxsIHByb3RvY29sIChmcm9tIDEwayBmZWV0KTwvdGg+PC90cj4KPHRyPjx0ZCBjbGFzcz0nZmlnJz4hW10oaW1hZ2VzLzAwQS1PcmllbnRpbmdPblNjUk5BU2VxLzEweC1nZW5vbWljcy1zY1JOQS1TZXEtZnJvbS0xMGsucG5nKTwvdGQ+PC90cj4KPHRyPjx0ZCBjbGFzcz0nZmlnJz4KCkEpIDEweCBHZW5vbWljcyB1c2VzIG1pY3JvZmx1aWRpY3MgdG8gY29tYmluZSBhbiBpc29sYXRlZCBjZWxsIHdpdGggYSAKbWFudWZhY3R1cmVkIG9saWdvLWJlYWQgaW4gYW4gYXF1ZW91cyBkcm9wbGV0IGluIGFuIG9pbCBlbXVsc2lvbi4gVGhlIG9pbCAKaXNvbGF0ZXMgZWFjaCBkcm9wbGV0LCBlZmZlY3RpdmVseSBjcmVhdGluZyBhIHJlYWN0aW9uIHZlc3NlbCBmb3IgZWFjaCBjZWxsLWJlYWQgCmR5YWQuCkIpIElkZWFsbHksIGVhY2ggZHJvcGxldCBjb250YWlucyByZWFjdGlvbiBlbnp5bWVzIChjYXJyaWVkIGluIHRoZSBhcXVlb3VzIApzb2x1dGlvbiksIGEgc2luZ2xlIGJlYWQgYW5kIGEgc2luZ2xlIGhlYWx0aHksIGludGFjdCBjZWxsLiBUaGUgY2VsbCBpcyBseXNlZCB0bwpyZWxlYXNlIHRoZSBtUk5BIHRyYW5zY3JpcHRzIGludG8gdGhlIGRyb3BsZXQuCkMpIFRoZSBiZWFkcyBhcmUgY292ZXJlZCB3aXRoIGEgbGF3biBvZiBtaWxsaW9ucyBvZiBvbGlnb3MuIEVhY2ggb2xpZ28gaXMgCmRlc2lnbmVkIHRvIGludGVyYWN0IHdpdGggcG9seS1BIHRhaWxlZCBtUk5BcyBhbmQgdGhlIGVuenltZXMgdG8gcHJvZHVjZSBhIApjb21wbGVtZW50YXJ5IEROQSBtb2xlY3VsZSAoY0ROQSkuCkQpIEVhY2ggY0ROQSBjb250YWluczoKICAtIHRoZSBzZXF1ZW5jZSBvZiBhbiBpbmRpdmlkdWFsIG1STkEgdHJhbnNjcmlwdCAoZnJvbSB0aGUgY2VsbCkKICAtIGZsYW5raW5nIHNlcXVlbmNlIGFkZGVkIGZvciBkb3duc3RyZWFtIGxpYnJhcnkgcHJlcAogIC0gYSAxMmJwIFVuaXF1ZSBNb2xlY3VsYXIgSWRlbnRpZmllciAoVU1JKTogdGhlIFVNSXMgYXJlIHVuaXF1ZSBmb3IgZWFjaCBvZiB0aGUKICAgIG9saWdvcyBvbiB0aGUgYmVhZCBlbnN1cmluZyAqKmVhY2ggVU1JIHJlcHJlc2VudHMgYSBzaW5nbGUgbVJOQSoqLgogICAgKFRoaXMgZW5hYmxlcyByZWxpYWJsZSBkZS1kdXBsaWNhdGlvbiBmb2xsb3dpbmcgc2VxdWVuY2luZy4pCiAgLSAxNiBicCBiYXJjb2RlIHNlcXVlbmNlOiBhbGwgYmFyY29kZXMgYXJlIGlkZW50aWNhbCBmb3IgYSBnaXZlbiBiZWFkLCBzbyB0aGUKICAgIGJhcmNvZGUgc2VxdWVuY2UgYWN0cyBhcyBhIG1vbGVjdWxhciBsYWJlbCBmb3IgZWFjaCB0cmFuc2NyaXB0OyAKICAgICoqZWFjaCBiYXJjb2RlIHJlcHJlc2VudCBhIGRpc3RpbmN0IGNlbGwgb2Ygb3JpZ2luIGZvciB0aGF0IG1STkEqKi4KPC90ZD48L3RyPgo8L3RhYmxlPgoKPGJyLz4KPGJyLz4KCjx0YWJsZSBjbGFzcz0nZmlnJz48dHI+PHRoIGNsYXNzPSdmaWcnPkNvbnNpZGVyIChqdXN0KSB0d28gZHJvcGxldHM8L3RoPjwvdHI+Cjx0cj48dGQgY2xhc3M9J2ZpZyc+IVtdKGltYWdlcy8wMEEtT3JpZW50aW5nT25TY1JOQVNlcS90d28tZHJvcGxldHMucG5nKTwvdGQ+PC90cj4KPHRyPjx0ZCBjbGFzcz0nZmlnJz4KCi0gRWFjaCBkcm9wbGV0IGNvbnZlcnRzIG1STkFzIGludG8gY0ROQXMgdGhhdCBjb250YWluIHRoZSBvbGlnbyBzZXF1ZW5jZSBhbmQgdGhlIAptUk5BIHNlcXVlbmNlLgotIEVhY2ggbVJOQSBzZXF1ZW5jZSB3aWxsIGdldCBhIGRpc3RpbmN0IFVNSSwgc28gb25lIFVNSSA9IG9uZSBtUk5BLgotIEZvciBhIHNpbmdsZSBkcm9wbGV0LCB0aGUgY2VsbCBiYXJjb2RlcyB3aWxsIGFsbCBtYXRjaC4gQ2VsbCBiYXJjb2RlcyB3aWxsIGJlIAogIGRpc3RpbmN0IGFjcm9zcyBkcm9wbGV0cy4KCjwvdGQ+PC90cj4KPC90YWJsZT4KCjxici8+Cjxici8+CgoKPHRhYmxlIGNsYXNzPSdmaWcnPjx0cj48dGggY2xhc3M9J2ZpZyc+RnJvbSBkcm9wbGV0cyB0byBtYXRyaXg8L3RoPjwvdHI+Cjx0cj48dGQgY2xhc3M9J2ZpZyc+IVtdKGltYWdlcy8wMEEtT3JpZW50aW5nT25TY1JOQVNlcS9kcm9wbGV0cy10by1tYXRyaXgucG5nKTwvdGQ+PC90cj4KPHRyPjx0ZCBjbGFzcz0nZmlnJz4KCkEpIE9uY2UgbVJOQSB0cmFuc2NyaXB0cyBoYXZlIGJlZW4gY29udmVydGVkIHRvIGJhcmNvZGUtbGFiZWxlZCBjRE5BIHRoZSBvaWwKZW11bHNpb24gY2FuIGJlIGJyb2tlbiBhbmQgdGhlIGNETkEgbW9sZWN1bGVzIGFyZSBwb29sZWQgdG9nZXRoZXIuCkIpIGNETkEgbW9sZWN1bGVzIHVuZGVyZ28gc2V2ZXJhbCBjb252ZW50aW9uYWwgbGlicmFyeSBwcmVwIHN0ZXBzIHRvIGVuYWJsZQpzZXF1ZW5jaW5nLgpDKSBUaGUgc2VxdWVuY2VyIGNhbGxzIGJhc2VzIGZvciBlYWNoIHNlcXVlbmNlLiBGb3IgYSBsYXJnZSBzZXF1ZW5jaW5nIHJ1biwgdGhpcwptaWdodCBjb250YWluIG1hbnkgc2FtcGxlcywgc2V2ZXJhbCBleHBlcmltZW50cywgYW5kIGV2ZW4gbXVsdGlwbGUgZXhwZXJpbWVudCAKdHlwZXMuCkQpIFRoZSByZXN1bHRpbmcgMTB4IEZBU1RRIGZpbGVzIGhhdmUgYSBzcGVjaWZpYyBzdHJ1Y3R1cmUuIAotIFJlYWQyIHJlcHJlc2VudHMgdGhlIG1STkEgc2VxdWVuY2UuCi0gUmVhZDEgcmVwcmVzZW50cyB0aGUgYmFyY29kZSBhbmQgVU1JCkUpIFNwZWNpYWxpemVkIHNvZnR3YXJlIGJpbnMgZWFjaCBkaXN0aW5jdCBiYXJjb2RlIGludG8gYSBwdXRhdGl2ZSBjZWxsIGFuZAphbGlnbnMgdGhlIG1STkEgc2VxdWVuY2UgYWdhaW5zdCBhIGdlbm9tZSBidWlsZC4KRikgQWxpZ25tZW50cyBmb3IgZmVhdHVyZXMgKGdlbmVzKSBhcmUgcXVhbnRpZmllZCBhY3Jvc3MgYWxsIGJhcmNvZGVzIHRvIGNyZWF0ZQphIGZlYXR1cmUgYmFyY29kZSBtYXRyaXguCjwvdGQ+PC90cj4KPC90YWJsZT4KCjxici8+Cjxici8+CgojIENvbW1vbiBwcm9ibGVtcyBhbmQgY2hhbGxlbmdlcwoKPHRhYmxlIGNsYXNzPSdmaWcnPjx0cj48dGggY2xhc3M9J2ZpZyc+U29tZSBkcm9wbGV0cyBkb24ndCB3b3JrIGFzIGludGVuZGVkPC90aD48L3RyPgo8dHI+PHRkIGNsYXNzPSdmaWcnPiFbXShpbWFnZXMvMDBBLU9yaWVudGluZ09uU2NSTkFTZXEvcHJvYmxlbS1kcm9wbGV0cy5wbmcpPC90ZD48L3RyPgo8dHI+PHRkIGNsYXNzPSdmaWcnPgoKQSkgSW50ZXJwcmV0aW5nIHRoZSBzZXF1ZW5jaW5nIG91dHB1dHMgaXMgc2ltcGxlc3Qgd2hlbiBlYWNoIGRyb3BsZXQgY29udGFpbnMgYSAKc2luZ2xlIGJlYWQgYW5kIGEgc2luZ2xlIGhlYWx0aHkgY2VsbC4gVGhlIHN5c3RlbSBpcyBvcHRpbWl6ZWQgZm9yIHRoaXMgb3V0Y29tZQphbmQgdHlwaWNhbGx5IHRoZSBtYWpvcml0eSBvZiBkcm9wbGV0cyB3aWxsIGZvbGxvdyB0aGlzIHBhdHRlcm4uIEhvd2V2ZXIsIGluIAplYWNoIHJ1biB0aGVyZSBhcmUgYWx3YXlzIGEgZmV3IGNvbXBsaWNhdGluZyBlZGdlIGNhc2VzIHRvIGNvbnNpZGVyLiAKQikgU29tZXRpbWVzIGEgZHJvcGxldCBjb250YWlucyBhIGJlYWQgYnV0IG5vIGNlbGwuIFRoaXMgaXMgYWN0dWFsbHkgY29tbW9uIGJ1dAppdCdzIGltcGFjdCBpcyBzbGlnaHQgYmVjYXVzZSBpbiB0aGUgYWJzZW5jZSBvZiBtUk5BLCB0aGUgZW56eW1lcyB3b24ndCBwcm9kdWNlCmNETkEuIEluIGVmZmVjdCwgdGhlIGRyb3BsZXQgYXBwZWFycyBlbXB0eSBhbmQgaXMgZGlzY2FyZGVkLgpDKSBTb21ldGltZXMgdHdvIGJlYWRzIGxhbmQgaW4gdGhlIHNhbWUgZHJvcGxldCB3aXRoIGEgY2VsbC4gSW4gdGhlb3J5LCB0aGUgCmNlbGxzIG1STkEgd291bGQgYXBwZWFyIHRvIGNvbWUgZnJvbSB0d28gZHJvcGxldHMgKGkuZS4gdHdvIGNlbGxzKSBlYWNoIHdpdGggCmhhbGYgdGhlIGV4cGVjdGVkIGV4cHJlc3Npb24gbGV2ZWxzLiBJbiBwcmFjdGljZSB0aGlzIHJhcmVseSBoYXBwZW5zIGJlY2F1c2UgdGhlCm1pY3JvZmx1aWRpY3MgYXJlIHR1bmVkIHRvIGF2b2lkIHRoaXMuCkQpIFNvbWV0aW1lcyB0d28gY2VsbHMgam9pbiB3aXRoIGEgc2luZ2xlIGJlYWQgaW4gYSBkcm9wbGV0IGNyZWF0aW5nIGEgCioqZG91YmxldCoqLiBUaGlzIGhhcHBlbnMgd2hlbiBzb21lIG9mIHRoZSBjZWxscyBhcmUgbm90IGZ1bGx5IGRpc3NvY2lhdGVkIGZyb20gCmVhY2ggb3RoZXIuIEluIHRoaXMgY2FzZSwgdGhlIG1STkFzIGZyb20gdHdvIGNlbGxzIHdpbGwgcmVjZWl2ZSB0aGUgc2FtZSBsYWJlbDsgCnRoZSBleHByZXNzaW9uIHByb2dyYW1zIGFyZSBtZXJnZWQgYW5kIHRoZSBvdmVyYWxsIGV4cGVjdGVkIGV4cHJlc3Npb24gaXMgCnJvdWdobHkgZG91YmxlZC4KRSkgU29tZXRpbWVzIHRoZSBzdHJlc3Mgb2YgdGhlIHByb3RvY29sIGluZHVjZXMgY2VsbHMgdG8gc3RhcnQgYXBvcHRvc2lzLiBUaGlzIApjb25mb3VuZHMgYW5hbHlzaXMgYmVjYXVzZSB0aGUgZXhwcmVzc2lvbiBwcm9ncmFtcyBhcmVuJ3QgYWJvdXQgdGhlIG1vZGVsIApiaW9sb2d5IGJ1dCBpbnN0ZWFkIGFydGlmYWN0cyBmcm9tIHRoZSBleHBlcmltZW50YWwgcGxhdGZvcm0uCkYpIFNvbWV0aW1lcyBkaXNzb2NpYXRlZCBjZWxscyBiZWNvbWUgc28gc3RyZXNzZWQgdGhleSBzdGFydCB0byBicmVhayBkb3duIGluIAp0aGUgc3VzcGVuc2lvbi4gV2hlbiB0aGF0IGhhcHBlbnMsIHRoZSBtUk5BcyBmcm9tIHRoZSBwb3BwZWQgY2VsbCdzIGNvbWJpbmUKdG9nZXRoZXIgaW4gdGhlIGFxdWVvdXMgZmxvdyB0byBjcmVhdGUgYSBzb3VwIG9mIGFtYmllbnQgUk5BLiBUaGlzIGFwcGVhcnMgYXMgYSAKZHJvcGxldCB3aXRoIGV4dHJlbWVseSBsb3cgZXhwcmVzc2lvbi4KPC90ZD48L3RyPgo8L3RhYmxlPgoKPGJyLz4KPGJyLz4KCiMjIENvbnRyYXN0aW5nIGJ1bGsgUk5BLXNlcSB3aXRoIHNjUk5BLVNlcQoKQnVsayBhbmQgc2luZ2xlLWNlbGwgYXBwcm9hY2hlcyBhcmUgZnVuZGFtZW50YWxseSBjb21wbGVtZW50YXJ5IGFwcHJvYWNoZXMgd2hlcmUKYnVsayBSTkEtU2VxIHByb3ZpZGVzIGEgImZvcmVzdC1sZXZlbCIgdmlldyB3aGlsZSBzY1JOQS1TZXEgc2hvd3MgdGhlIGluZGl2aWR1YWwgCnRyZWVzLiBDb21wYXJlZCB0byBidWxrIFJOQS1TZXEsIHNjUk5BLVNlcSBwcm92aWRlcyBwb3dlcmZ1bCBuZXcgcGVyc3BlY3RpdmVzLiAKQnV0IGl0IGlzbid0IHdpdGhvdXQgY2hhbGxlbmdlcyBvciBkb3duc2lkZXMuCgo8dGFibGUgY2xhc3M9J2ZpZyc+PHRyPjx0aCBjbGFzcz0nZmlnJz5CdWxrIHZzLiBTaW5nbGUtQ2VsbDwvdGg+PC90cj4KPHRyPjx0ZCBjbGFzcz0nZmlnJz4hW10oaW1hZ2VzLzAwQS1PcmllbnRpbmdPblNjUk5BU2VxL2J1bGtfdl9zYy5wbmcpPC90ZD48L3RyPgo8dHI+PHRkIGNsYXNzPSdmaWcnPgoKMS4gU2luZ2xlLWNlbGwgaXMgbGVzcyBtYXR1cmUgdGhhbiBidWxrLgoxLiBTaW5nbGUtY2VsbCBzYW1wbGUgcHJlcCBpcyBtb3JlIGNvbXBsZXggdGhhbiBidWxrLgoxLiBTaW5nbGUtY2VsbCB0eXBpY2FsbHkgc2VlcyBvbmx5IHRoZSBzdWJzZXQgb2YgaGlnaGx5IGV4cHJlc3NlZCBnZW5lcy4KMS4gU2luZ2xlIGNlbGwgYW5hbHlzaXMgaXMgdHlwaWNhbGx5IG1vcmUgY29tcGxleC4KMS4gU2luZ2xlIGNlbGwgYW5hbHlzaXMgY29zdHMgbW9yZSB0aGFuIGJ1bGsgYW5hbHlzaXMuCgo8L3RkPjwvdHI+CjwvdGFibGU+Cgo8YnIvPgo8YnIvPgoKCiMgU3VtbWFyeQoKLSBzY1JOQS1zZXEgb2ZmZXJzIGEgcG93ZXJmdWwgYW5kIG51YW5jZWQgYXBwcm9hY2ggdG8gc3R1ZHlpbmcgZ2VuZSBleHByZXNzaW9uIGF0CnRoZSBjZWxsdWxhciBsZXZlbC4gVGhpcyB0ZWNobmlxdWUgY2FuIGlsbHVtaW5hdGUgYmlvbG9naWNhbCBtZWNoYW5pc21zIG9mIApoZWFsdGh5IHRpc3N1ZSBvciBkaXNlYXNlIGFzIHdlbGwgYXMgZXh0ZW5kIG91ciB1bmRlcnN0YW5kaW5nIG9mIGNlbGx1bGFyCmhldGVyb2dlbmVpdHksIHJlc3BvbnNlcyB0byBpbnRlcnZlbnRpb25zLCBhbmQgdGhlIGNlbGwgc3RhdGUgZHluYW1pY3MuCi0gc2NSTkEtU2VxIGV4cGVyaW1lbnRzIGFyZSB0eXBpY2FsbHkgbW9yZSBjb21wbGV4IGFuZCBvZnRlbiBtb3JlIGV4cGVuc2l2ZSB0aGFuCmJ1bGsgUk5BLVNlcS4KCjx0YWJsZSBjbGFzcz0nZmlnJz48dHI+PHRoIGNsYXNzPSdmaWcnPnNjUk5BLVNlcSBzdGVwcyBpbiBzdW1tYXJ5PC90aD48L3RyPgogIDx0cj48dGQgY2xhc3M9J2ZpZyc+IVtdKGltYWdlcy8wMEEtT3JpZW50aW5nT25TY1JOQVNlcS9zdW1tYXJ5LnBuZyk8L3RkPjwvdHI+Cjx0cj48dGQgY2xhc3M9J2ZpZyc+CgpBKSBBIHNhbXBsZSBvZiB0aXNzdWUgaXMgZXh0cmFjdGVkCkIpIFRpc3N1ZSBpcyBkaXNzb2NpYXRlZCBpbnRvIGEgY2xlYW4gc3VzcGVuc2lvbiBvZiBoZWFsdGh5IGNlbGxzCkMpIEEgcmVhY3Rpb24gY3JlYXRlcyBhIGNETkEgbW9sZWN1bGUgd2hpY2ggY29tYmluZXMgYSBiYXJjb2RlIGxhYmVsIHdpdGggbVJOQSBzZXF1ZW5jZS4gCkQpIGNETkFzIGFyZSBwb29sZWQgdG9nZXRoZXIsIGxpYnJhcnkgcHJlcCdlZCBhbmQgc2VxdWVuY2VkCkUpIENvbXB1dGF0aW9uYWxseSBjb25uZWN0IGFsbCB0aGUgbVJOQXMgYmFjayB0byBhIGRpc3RpbmN0IGNlbGwgb2Ygb3JpZ2luCkYpIEFsaWduIHRoZSBtUk5BIHNlcXVlbmNlcyB0byBjcmVhdGUgYSBjb3VudCBtYXRyaXggYWNyb3NzIGFsbCB0aGUgZmVhdHVyZXMgYW5kIGFsbCB0aGUgY2VsbHMKRykgQmlvaW5mb3JtYXRpY2FsbHkgc2VwYXJhdGUgdGhlIGhlYWx0aHkgY2VsbHMgZnJvbSB0aGUgZXhwZXJpbWVudGFsIGFydGlmYWN0cwoKVGhlIGxhc3QgdGhyZWUgc3RlcHMgYXJlIGNvbXBsZXggYW5kIGFsc28gY29tcHV0YXRpb25hbGx5IGRlbWFuZGluZy4gSW4gMTB4IApHZW5vbWljcyBleHBlcmltZW50cywgdGhleSBhcmUgdHlwaWNhbGx5IGV4cGVkaXRlZCBieSB0aGUgdG9vbCAqKkNlbGwgUmFuZ2VyKiogd2hpY2gKd2UgY292ZXIgaW4gZGV0YWlsIGluIHRoZSBuZXh0IGxlc3Nvbi4KCjwvdGQ+PC90cj4KPC90YWJsZT4KCjxici8+Cjxici8+CgojIFJlZmVyZW5jZXMKCjEuIFNvcmtpbiwgTWljaGFlbCBldCBhbC4gKirigJxSZWd1bGF0aW9uIG9mIGhldGVyb3RvcGljIG9zc2lmaWNhdGlvbiBieSBtb25vY3l0ZXMgaW4gYSBtb3VzZSBtb2RlbCBvZiBhYmVycmFudCB3b3VuZCBoZWFsaW5nLuKAnSoqCiAgIE5hdHVyZSBjb21tdW5pY2F0aW9ucyB2b2wuIDExLDEgNzIyLiA1IEZlYi4gMjAyMC48YnIvPgogICBbaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8zMjAyNDgyNV0oaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8zMjAyNDgyNSl7dGFyZ2V0PSJfYmxhbmsifQoyLiBbMTB4IEdlbm9taWNzIDMnIGdlbmUgZXhwcmVzc2lvbl0oaHR0cHM6Ly93d3cuMTB4Z2Vub21pY3MuY29tL3N1cHBvcnQvc2luZ2xlLWNlbGwtZ2VuZS1leHByZXNzaW9uL2RvY3VtZW50YXRpb24vc3RlcHMvZXhwZXJpbWVudGFsLWRlc2lnbi1hbmQtcGxhbm5pbmcvZ2V0dGluZy1zdGFydGVkLXNpbmdsZS1jZWxsLTMtZ2VuZS1leHByZXNzaW9uKXt0YXJnZXQ9Il9ibGFuayJ9Cjxici8+Cjxici8+Cjxoci8+CnwgW0JhY2sgdG8gaW50cm9kdWN0aW9uXSh3b3Jrc2hvcF9pbnRyby5odG1sKSB8IFtUb3Agb2YgdGhpcyBsZXNzb25dKCN0b3ApIHwgW05leHQgbGVzc29uXSgwMS1HZXR0aW5nU3RhcnRlZC5odG1sKSB8CnwgOi0tLSB8IDotLS0tOiB8IC0tLTogfAoKCg==