RNA-Seq Data Network Analysis
Cytoscape is an open source software platform for integrating,
visualizing, and analysing measurement data in the context of
networks.
This protocol describes a network analysis workflow in Cytoscape for
differentially expressed genes from an RNA-Seq experiment. Overall
workflow:
• Finding a set of differentially expressed genes.
•
Retrieving relevant networks from public databases.
•
Integration and visualization of experimental data.
• Network
functional enrichment analysis.
• Exporting network
visualizations.
Setup
Install the (stringApp) from the
Cytoscape App Store, or via Apps → App Store → Show App
Store.
OR
Just visit the Cytoscape App store and
install/download it from there.
Experimental Data
For this exercise, we will use a dataset comparing transcriptomic
differences between bladder cancer and normal tissue. The study has been
published by Radvanyi F et al., and we will get a summarized dataset
with fold change and p-value from the EBI Gene Expression
Atlas. Array-express ID is E-MTAB-1940.
- link to the publication and data : (Here..!)
- Download the data: Transcriptomic analysis of bladder cancer reveals
convergent molecular pathology. (Here..!).
First Select all the contents (by holding control + A or Command + A
(Mac-users)) and Save the file by right-clicking the mouse button and
using save-as option.
- To open the tsv data file in Excel, first launch Excel and open a
blank workbook. Next, go to Data → Get External Data → Import
Text File….
- In the import wizard, select Delimited and in the
next step select Tab.
- In the third step, you can select the Data Format
for every column. The file has 4 columns of data: Gene ID, Gene
Name, fold change and p-value. Make sure to change the
format for the second column, Gene Name, to Text. You will have
to scroll to the right to see the second column.
- Click Finish to complete the import.
Editing experimental data
We are going to define a set of up-regulated genes from the full
dataset by filtering for fold change and p-value.
For this
reason we will need to edit the raw downloaded file to obtain expression
information for the features specific to bladder cancer.
Download the following file (Here..!)
and open in Microsoft Excel.
• Select the row containing data value headers (row 4) and
select Data → Filter.
• In the drop-down for
the fold change column, set a filter for fold change greater than 2.
This should result in 263 genes.
• Next, one
would normally filter out non-significant changes by filtering on the
p-value as well, for example setting p-value less than 0.05. But in this
case, all genes with a fold change greater than 2 already meet that
cutoff.
• With the filter active, select and copy all entries
in the Gene Name column.

Retrieve Networks from STRING
To identify a relevant network, we will use the
STRING database to find a network relevant to the list
of up-regulated genes.
• Launch Cytoscape. In the
Network Search bar at the top of the Network
Panel, select STRING protein query from the
drop-down, and paste in the list of 263 up-regulated genes.
•
Open the options panel and confirm you are searching Homo
sapiens with a Confidence cutoff of 0.40 and
0 Maximum additional interactors.
• Click the
search icon to search. If any of the search terms are
ambiguous, a Resolve Ambiguous Terms dialog will
appear. Click Import to continue with the import using
the default choices. The resulting network will load automatically, and
should have around 173 nodes.
STRING Network Up-Regulated Genes
The resulting network contains up-regulated genes recognized by
STRING, and interactions between them with a confidence score of 0.4 or
greater.

The networks consist of one large connected component, several
smaller networks, and some unconnected nodes. We will use only the
largest connected component for the rest of the tutorial.
• To select the largest connected component, select Select →
Nodes → Largest subnetwork.
• Select File →
New Network → From Selected Nodes, All Edges.

Data Integration
Next we will import the RNA-Seq data and use them to create a
visualization.
• Load the downloaded E-MTAB-1940-query-results.tsv
file under File menu by selecting Import → Table from
File….. Alternatively, drag and drop the data file directly
onto the Node Table.
• In Advanced Options…,
in the Ignore Lines Starting With field, enter #, to
exclude the additional lines at the beginning of the data file.
• Select the query term column as the Key
column for Network and select the Gene Name
column as the key column by clicking on the header and selecting the key
symbol.
• Click OK to import. Two new columns
of data will be added to the Node Table.
Visualization
Next, we will create a visualization of the imported data on the
network. For more detailed information on data visualization, see the
Visualizing Data tutorial.
• In the Style tab of the Control
Panel, switch the style from STRING style to
default in the drop-down at the top.
• Change
the default node Shape to ellipse and
check Lock node width and height.
• Set the
default node Size to 50.
•
Set the default node Fill Color to light
gray.
• Set the default Border Width
to 2, and make the default Border Paint dark
gray.

• For node Fill Color,
create a continuous mapping for ‘NMIBC’ vs ‘normal’
.foldChange.
• Double-click the color mapping to open the
Continuous Mapping Editor and click the Current
Palette. Select the ColorBrewer yellow-orange-red
shades gradient.
• Finally, for node
Label, set a passthrough mapping for display
name.
• Save your new visualization under Copy
Style… in the Options menu of the
Style interface, and name it de genes up.
Apply the Prefuse Force Directed layout by clicking
the Apply Preferred Layout button in the toolbar. The
network will now look something like this:
LS0tCnRpdGxlOiAiUk5BLVNlcSBEYXRhIE5ldHdvcmsgQW5hbHlzaXMgLSBTZXNzaW9uIDItQSIKYXV0aG9yOiAiQWtzaGF5IEJoYXQiCmRhdGU6ICdgciBmb3JtYXQoU3lzLnRpbWUoKSwgIkxhc3QgbW9kaWZpZWQ6ICVkICViICVZIilgJwpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgICBjc3M6IHN0eWxlc2hlZXRzL3N0eWxlcy5jc3MKLS0tCjxpbWcgc3JjPSJpbWFnZXMvbG9nby1zbS5wbmciIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NDBweDtyaWdodDoxMHB4OyIgd2lkdGg9IjIwMCIgLz4KCgojIFBhcnQgQToKCgojIFJOQS1TZXEgRGF0YSBOZXR3b3JrIEFuYWx5c2lzCkN5dG9zY2FwZSBpcyBhbiBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBwbGF0Zm9ybSBmb3IgaW50ZWdyYXRpbmcsIHZpc3VhbGl6aW5nLCBhbmQgYW5hbHlzaW5nIG1lYXN1cmVtZW50IGRhdGEgaW4gdGhlIGNvbnRleHQgb2YgbmV0d29ya3MuPGJyPjwvYnI+CiAgCiAgVGhpcyBwcm90b2NvbCBkZXNjcmliZXMgYSBuZXR3b3JrIGFuYWx5c2lzIHdvcmtmbG93IGluIEN5dG9zY2FwZSBmb3IgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGZyb20gYW4gUk5BLVNlcSBleHBlcmltZW50LiBPdmVyYWxsIHdvcmtmbG93Ojxicj48L2JyPgogIAogIOKAoglGaW5kaW5nIGEgc2V0IG9mIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcy4gPGJyPjwvYnI+CiAg4oCiCVJldHJpZXZpbmcgcmVsZXZhbnQgbmV0d29ya3MgZnJvbSBwdWJsaWMgZGF0YWJhc2VzLiA8YnI+PC9icj4KICDigKIJSW50ZWdyYXRpb24gYW5kIHZpc3VhbGl6YXRpb24gb2YgZXhwZXJpbWVudGFsIGRhdGEuIDxicj48L2JyPgogIOKAoglOZXR3b3JrIGZ1bmN0aW9uYWwgZW5yaWNobWVudCBhbmFseXNpcy4gPGJyPjwvYnI+CiAg4oCiCUV4cG9ydGluZyBuZXR3b3JrIHZpc3VhbGl6YXRpb25zLiA8YnI+PC9icj4KICAKICAKIyMgU2V0dXAKICAKICBJbnN0YWxsIHRoZSAoW3N0cmluZ0FwcF0oaHR0cDovL2FwcHMuY3l0b3NjYXBlLm9yZy9hcHBzL3N0cmluZ2FwcCkpIGZyb20gdGhlIEN5dG9zY2FwZSBBcHAgU3RvcmUsIG9yIHZpYSAqKkFwcHMg4oaSIEFwcCBTdG9yZSDihpIgU2hvdyBBcHAgU3RvcmUuKiogPGJyPjwvYnI+CiAgCiMjIE9SIDxicj48L2JyPgogIApKdXN0IHZpc2l0IHRoZSAqKkN5dG9zY2FwZSBBcHAgc3RvcmUqKiBhbmQgaW5zdGFsbC9kb3dubG9hZCBpdCBmcm9tIHRoZXJlLgo8YnI+PC9icj48YnI+PC9icj4KICAhW10oaW1hZ2VzL1N0cmluZ0FwcC5wbmcpCjxicj48L2JyPjxicj48L2JyPgogIAojIyBFeHBlcmltZW50YWwgRGF0YQogIEZvciB0aGlzIGV4ZXJjaXNlLCB3ZSB3aWxsIHVzZSBhIGRhdGFzZXQgY29tcGFyaW5nIHRyYW5zY3JpcHRvbWljIGRpZmZlcmVuY2VzIGJldHdlZW4gYmxhZGRlciBjYW5jZXIgYW5kIG5vcm1hbCB0aXNzdWUuIFRoZSBzdHVkeSBoYXMgYmVlbiBwdWJsaXNoZWQgYnkgUmFkdmFueWkgRiBldCBhbC4sIGFuZCB3ZSB3aWxsIGdldCBhIHN1bW1hcml6ZWQgZGF0YXNldCB3aXRoIGZvbGQgY2hhbmdlIGFuZCBwLXZhbHVlIGZyb20gdGhlICoqRUJJIEdlbmUgRXhwcmVzc2lvbiBBdGxhcyoqLiBBcnJheS1leHByZXNzIElEIGlzICoqRS1NVEFCLTE5NDAqKi4gIAogIAoqIGxpbmsgdG8gdGhlIHB1YmxpY2F0aW9uIGFuZCBkYXRhIDogKFtIZXJlLi4hXShodHRwczovL3d3dy5lYmkuYWMudWsvYmlvc3R1ZGllcy9hcnJheWV4cHJlc3Mvc3R1ZGllcy9FLU1UQUItMTk0MD9xdWVyeT1FLU1UQUItMTk0MCkpCiAgCiAgCjxicj48L2JyPgogIDxicj48L2JyPgogIAoqIERvd25sb2FkIHRoZSBkYXRhOiBUcmFuc2NyaXB0b21pYyBhbmFseXNpcyBvZiBibGFkZGVyIGNhbmNlciByZXZlYWxzIGNvbnZlcmdlbnQgbW9sZWN1bGFyIHBhdGhvbG9neS4gKFtIZXJlLi4hXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYTFha3MvQ3l0b3NjYXBlX0NvdXJzZS9tYWluL0RhdGFfRmlsZXMvQkNMQS1hbGwudHN2KSkuICBGaXJzdCBTZWxlY3QgYWxsIHRoZSBjb250ZW50cyAoYnkgaG9sZGluZyBjb250cm9sICsgQSBvciBDb21tYW5kICsgQSAoTWFjLXVzZXJzKSkgYW5kIFNhdmUgdGhlIGZpbGUgYnkgcmlnaHQtY2xpY2tpbmcgdGhlIG1vdXNlIGJ1dHRvbiBhbmQgdXNpbmcgc2F2ZS1hcyBvcHRpb24uICA8YnI+PC9icj4KKiBUbyBvcGVuIHRoZSB0c3YgZGF0YSBmaWxlIGluIEV4Y2VsLCBmaXJzdCBsYXVuY2ggRXhjZWwgYW5kIG9wZW4gYSBibGFuayB3b3JrYm9vay4gTmV4dCwgZ28gdG8gKipEYXRhIOKGkiBHZXQgRXh0ZXJuYWwgRGF0YSDihpIgSW1wb3J0IFRleHQgRmlsZS4uLi4qKiA8YnI+PC9icj4KKiBJbiB0aGUgaW1wb3J0IHdpemFyZCwgc2VsZWN0ICoqRGVsaW1pdGVkKiogYW5kIGluIHRoZSBuZXh0IHN0ZXAgc2VsZWN0IFRhYi4KPGJyPjwvYnI+CiogSW4gdGhlIHRoaXJkIHN0ZXAsIHlvdSBjYW4gc2VsZWN0IHRoZSAqKkRhdGEgRm9ybWF0KiogZm9yIGV2ZXJ5IGNvbHVtbi4gVGhlIGZpbGUgaGFzIDQgY29sdW1ucyBvZiBkYXRhOiAqKkdlbmUgSUQsIEdlbmUgTmFtZSwgZm9sZCBjaGFuZ2UgYW5kIHAtdmFsdWUqKi4gKipNYWtlIHN1cmUgdG8gY2hhbmdlIHRoZSBmb3JtYXQgZm9yIHRoZSBzZWNvbmQgY29sdW1uLCBHZW5lIE5hbWUsIHRvIFRleHQuKiogWW91IHdpbGwgaGF2ZSB0byBzY3JvbGwgdG8gdGhlIHJpZ2h0IHRvIHNlZSB0aGUgc2Vjb25kIGNvbHVtbi4KPGJyPjwvYnI+CiogQ2xpY2sgKipGaW5pc2gqKiB0byBjb21wbGV0ZSB0aGUgaW1wb3J0LgoKPGJyPjwvYnI+CiAgCiMjIEVkaXRpbmcgZXhwZXJpbWVudGFsIGRhdGEKICBXZSBhcmUgZ29pbmcgdG8gZGVmaW5lIGEgc2V0IG9mIHVwLXJlZ3VsYXRlZCBnZW5lcyBmcm9tIHRoZSBmdWxsIGRhdGFzZXQgYnkgZmlsdGVyaW5nIGZvciBmb2xkIGNoYW5nZSBhbmQgcC12YWx1ZS4KPGJyPjwvYnI+CkZvciB0aGlzIHJlYXNvbiB3ZSB3aWxsIG5lZWQgdG8gZWRpdCB0aGUgcmF3IGRvd25sb2FkZWQgZmlsZSB0byBvYnRhaW4gZXhwcmVzc2lvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGZlYXR1cmVzIHNwZWNpZmljIHRvIGJsYWRkZXIgY2FuY2VyLiAKCkRvd25sb2FkIHRoZSBmb2xsb3dpbmcgZmlsZSAoW0hlcmUuLiFdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hMWFrcy9DeXRvc2NhcGVfQ291cnNlL21haW4vRGF0YV9GaWxlcy9FLU1UQUItMTk0MC1xdWVyeS1yZXN1bHRzLnRzdikpIGFuZCBvcGVuIGluIE1pY3Jvc29mdCBFeGNlbC4gCgo8YnI+PC9icj4KICDigKIJU2VsZWN0IHRoZSByb3cgY29udGFpbmluZyBkYXRhIHZhbHVlIGhlYWRlcnMgKHJvdyA0KSBhbmQgc2VsZWN0ICoqRGF0YSDihpIgRmlsdGVyLioqPGJyPjwvYnI+CiAg4oCiCUluIHRoZSBkcm9wLWRvd24gZm9yIHRoZSBmb2xkIGNoYW5nZSBjb2x1bW4sIHNldCBhIGZpbHRlciBmb3IgZm9sZCBjaGFuZ2UgZ3JlYXRlciB0aGFuIDIuIFRoaXMgc2hvdWxkIHJlc3VsdCBpbiAqKjI2MyoqIGdlbmVzLjxicj48L2JyPgogIOKAoglOZXh0LCBvbmUgd291bGQgbm9ybWFsbHkgZmlsdGVyIG91dCBub24tc2lnbmlmaWNhbnQgY2hhbmdlcyBieSBmaWx0ZXJpbmcgb24gdGhlIHAtdmFsdWUgYXMgd2VsbCwgZm9yIGV4YW1wbGUgc2V0dGluZyBwLXZhbHVlIGxlc3MgdGhhbiAwLjA1LiBCdXQgaW4gdGhpcyBjYXNlLCBhbGwgZ2VuZXMgd2l0aCBhIGZvbGQgY2hhbmdlIGdyZWF0ZXIgdGhhbiAyIGFscmVhZHkgbWVldCB0aGF0IGN1dG9mZi48YnI+PC9icj4KICDigKIJV2l0aCB0aGUgZmlsdGVyIGFjdGl2ZSwgc2VsZWN0IGFuZCBjb3B5IGFsbCBlbnRyaWVzIGluIHRoZSAqKkdlbmUgTmFtZSoqIGNvbHVtbi48YnI+PC9icj4KICA8YnI+PC9icj48YnI+PC9icj4KICAhW10oaW1hZ2VzL0V4cF9kYXRhLnBuZykKCjxicj48L2JyPjxicj48L2JyPgogIAojIyBSZXRyaWV2ZSBOZXR3b3JrcyBmcm9tIFNUUklORwogIAogIFRvIGlkZW50aWZ5IGEgcmVsZXZhbnQgbmV0d29yaywgd2Ugd2lsbCB1c2UgdGhlICoqU1RSSU5HKiogZGF0YWJhc2UgdG8gZmluZCBhIG5ldHdvcmsgcmVsZXZhbnQgdG8gdGhlIGxpc3Qgb2YgdXAtcmVndWxhdGVkIGdlbmVzLgo8YnI+PC9icj48YnI+PC9icj4KICDigKIJTGF1bmNoIEN5dG9zY2FwZS4gSW4gdGhlICoqTmV0d29yayBTZWFyY2gqKiBiYXIgYXQgdGhlIHRvcCBvZiB0aGUgKipOZXR3b3JrIFBhbmVsKiosIHNlbGVjdCAqKlNUUklORyBwcm90ZWluIHF1ZXJ5KiogZnJvbSB0aGUgZHJvcC1kb3duLCBhbmQgcGFzdGUgaW4gdGhlIGxpc3Qgb2YgMjYzIHVwLXJlZ3VsYXRlZCBnZW5lcy48YnI+PC9icj4KICDigKIJT3BlbiB0aGUgb3B0aW9ucyBwYW5lbCAgYW5kIGNvbmZpcm0geW91IGFyZSBzZWFyY2hpbmcgKipIb21vIHNhcGllbnMqKiB3aXRoIGEgKipDb25maWRlbmNlIGN1dG9mZiBvZiAwLjQwKiogYW5kICoqMCBNYXhpbXVtIGFkZGl0aW9uYWwgaW50ZXJhY3RvcnMuKio8YnI+PC9icj4KICDigKIJQ2xpY2sgdGhlICoqc2VhcmNoIGljb24qKiB0byBzZWFyY2guIElmIGFueSBvZiB0aGUgc2VhcmNoIHRlcm1zIGFyZSBhbWJpZ3VvdXMsIGEgKipSZXNvbHZlIEFtYmlndW91cyBUZXJtcyoqIGRpYWxvZyB3aWxsIGFwcGVhci4gQ2xpY2sgKipJbXBvcnQqKiB0byBjb250aW51ZSB3aXRoIHRoZSBpbXBvcnQgdXNpbmcgdGhlIGRlZmF1bHQgY2hvaWNlcy4gVGhlIHJlc3VsdGluZyBuZXR3b3JrIHdpbGwgbG9hZCBhdXRvbWF0aWNhbGx5LCBhbmQgc2hvdWxkIGhhdmUgYXJvdW5kICoqMTczKiogbm9kZXMuIDxicj48L2JyPgogIAogIDxicj48L2JyPgogIAogICFbXShpbWFnZXMvU3RyaW5nLUltcG9ydC5wbmcpCjxicj48L2JyPjxicj48L2JyPgogIAojIyBTVFJJTkcgTmV0d29yayBVcC1SZWd1bGF0ZWQgR2VuZXMKICAKICBUaGUgcmVzdWx0aW5nIG5ldHdvcmsgY29udGFpbnMgdXAtcmVndWxhdGVkIGdlbmVzIHJlY29nbml6ZWQgYnkgU1RSSU5HLCBhbmQgaW50ZXJhY3Rpb25zIGJldHdlZW4gdGhlbSB3aXRoIGEgY29uZmlkZW5jZSBzY29yZSBvZiAwLjQgb3IgZ3JlYXRlci4KPGJyPjwvYnI+PGJyPjwvYnI+CiAgCiAgIVtdKGltYWdlcy9TdHJpbmctSW1hZ2UxLnBuZykKCgo8YnI+PC9icj48YnI+PC9icj4KICAKICBUaGUgbmV0d29ya3MgY29uc2lzdCBvZiBvbmUgbGFyZ2UgY29ubmVjdGVkIGNvbXBvbmVudCwgc2V2ZXJhbCBzbWFsbGVyIG5ldHdvcmtzLCBhbmQgc29tZSB1bmNvbm5lY3RlZCBub2Rlcy4gV2Ugd2lsbCB1c2Ugb25seSB0aGUgbGFyZ2VzdCBjb25uZWN0ZWQgY29tcG9uZW50IGZvciB0aGUgcmVzdCBvZiB0aGUgdHV0b3JpYWwuPGJyPjwvYnI+CiAgCiAg4oCiCVRvIHNlbGVjdCB0aGUgbGFyZ2VzdCBjb25uZWN0ZWQgY29tcG9uZW50LCBzZWxlY3QgKipTZWxlY3Qg4oaSIE5vZGVzIOKGkiBMYXJnZXN0IHN1Ym5ldHdvcmsuKio8YnI+PC9icj4KICDigKIJU2VsZWN0ICoqRmlsZSDihpIgTmV3IE5ldHdvcmsg4oaSIEZyb20gU2VsZWN0ZWQgTm9kZXMsIEFsbCBFZGdlcy4qKjxicj48L2JyPgogIDxicj48L2JyPjxicj48L2JyPgogICFbXShpbWFnZXMvU3RyaW5nLUltYWdlMi5wbmcpCgo8YnI+PC9icj4KCiMjIERhdGEgSW50ZWdyYXRpb24KICAKICBOZXh0IHdlIHdpbGwgaW1wb3J0IHRoZSBSTkEtU2VxIGRhdGEgYW5kIHVzZSB0aGVtIHRvIGNyZWF0ZSBhIHZpc3VhbGl6YXRpb24uPGJyPjwvYnI+CiAgCiAg4oCiCUxvYWQgdGhlIGRvd25sb2FkZWQgKipFLU1UQUItMTk0MC1xdWVyeS1yZXN1bHRzLnRzdioqIGZpbGUgdW5kZXIgRmlsZSBtZW51IGJ5IHNlbGVjdGluZyAqKkltcG9ydCDihpIgVGFibGUgZnJvbSBGaWxlLi4uLi4qKiBBbHRlcm5hdGl2ZWx5LCBkcmFnIGFuZCBkcm9wIHRoZSBkYXRhIGZpbGUgZGlyZWN0bHkgb250byB0aGUgTm9kZSBUYWJsZS48YnI+PC9icj4KICDigKIJSW4gKipBZHZhbmNlZCBPcHRpb25zKiouLi4sIGluIHRoZSAqKklnbm9yZSBMaW5lcyBTdGFydGluZyBXaXRoIGZpZWxkKiosIGVudGVyICMsIHRvIGV4Y2x1ZGUgdGhlIGFkZGl0aW9uYWwgbGluZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF0YSBmaWxlLjxicj48L2JyPgrigKIJU2VsZWN0IHRoZSAqKnF1ZXJ5IHRlcm0qKiBjb2x1bW4gYXMgdGhlICoqS2V5IGNvbHVtbiBmb3IgTmV0d29yayoqIGFuZCBzZWxlY3QgdGhlICoqR2VuZSBOYW1lKiogY29sdW1uIGFzIHRoZSBrZXkgY29sdW1uIGJ5IGNsaWNraW5nIG9uIHRoZSBoZWFkZXIgYW5kIHNlbGVjdGluZyB0aGUga2V5IHN5bWJvbC48YnI+PC9icj4KICDigKIJQ2xpY2sgKipPSyoqIHRvIGltcG9ydC4gVHdvIG5ldyBjb2x1bW5zIG9mIGRhdGEgd2lsbCBiZSBhZGRlZCB0byB0aGUgKipOb2RlIFRhYmxlLioqPGJyPjwvYnI+CiAgCiAgPGJyPjwvYnI+PGJyPjwvYnI+CiAgIVtdKGltYWdlcy9JbXBvcnQtZGF0YS1pbnQucG5nKQohW10oaW1hZ2VzL0ltcG9ydC1Db2x1bW5zLnBuZykKPGJyPjwvYnI+PGJyPjwvYnI+CiAgCiAgCiMjIFZpc3VhbGl6YXRpb24KICBOZXh0LCB3ZSB3aWxsIGNyZWF0ZSBhIHZpc3VhbGl6YXRpb24gb2YgdGhlIGltcG9ydGVkIGRhdGEgb24gdGhlIG5ldHdvcmsuIEZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGRhdGEgdmlzdWFsaXphdGlvbiwgc2VlIHRoZSBWaXN1YWxpemluZyBEYXRhIHR1dG9yaWFsLjxicj48L2JyPgogIAogIOKAoglJbiB0aGUgKipTdHlsZSoqIHRhYiBvZiB0aGUgKipDb250cm9sIFBhbmVsKiosIHN3aXRjaCB0aGUgc3R5bGUgZnJvbSAqKlNUUklORyoqIHN0eWxlIHRvICoqZGVmYXVsdCoqIGluIHRoZSBkcm9wLWRvd24gYXQgdGhlIHRvcC48YnI+PC9icj4KICDigKIJQ2hhbmdlIHRoZSBkZWZhdWx0IG5vZGUgKipTaGFwZSoqIHRvICoqZWxsaXBzZSoqIGFuZCAqKmNoZWNrIExvY2sgbm9kZSB3aWR0aCBhbmQgaGVpZ2h0LioqPGJyPjwvYnI+CiAg4oCiCVNldCB0aGUgZGVmYXVsdCBub2RlICoqU2l6ZSoqIHRvICoqNTAuKio8YnI+PC9icj4KICDigKIJU2V0IHRoZSBkZWZhdWx0IG5vZGUgKipGaWxsIENvbG9yKiogdG8gKipsaWdodCBncmF5KiouPGJyPjwvYnI+CiAg4oCiCVNldCB0aGUgZGVmYXVsdCAqKkJvcmRlciBXaWR0aCoqIHRvIDIsIGFuZCBtYWtlIHRoZSBkZWZhdWx0ICoqQm9yZGVyIFBhaW50KiogZGFyayBncmF5Ljxicj48L2JyPgogIDxicj48L2JyPjxicj48L2JyPgogICFbXShpbWFnZXMvVmlzdWFsaXphdGlvbi1TdHlsZXMucG5nKQoKPC9icj48YnI+PC9icj48YnI+PC9icj4KICDigKIJRm9yIG5vZGUgKipGaWxsIENvbG9yKiosIGNyZWF0ZSBhIGNvbnRpbnVvdXMgbWFwcGluZyBmb3IgJ05NSUJDJyB2cyAnbm9ybWFsJyAuZm9sZENoYW5nZS48YnI+PC9icj4KICDigKIJRG91YmxlLWNsaWNrIHRoZSBjb2xvciBtYXBwaW5nIHRvIG9wZW4gdGhlICoqQ29udGludW91cyBNYXBwaW5nIEVkaXRvcioqIGFuZCBjbGljayB0aGUgKipDdXJyZW50IFBhbGV0dGUqKi4gU2VsZWN0IHRoZSBDb2xvckJyZXdlciAqKnllbGxvdy1vcmFuZ2UtcmVkIHNoYWRlcyBncmFkaWVudCoqLjxicj48L2JyPgogIOKAoglGaW5hbGx5LCBmb3Igbm9kZSAqKkxhYmVsKiosIHNldCBhIHBhc3N0aHJvdWdoIG1hcHBpbmcgZm9yIGRpc3BsYXkgbmFtZS48YnI+PC9icj4KICDigKIJU2F2ZSB5b3VyIG5ldyB2aXN1YWxpemF0aW9uIHVuZGVyICoqQ29weSBTdHlsZS4uLioqIGluIHRoZSAqKk9wdGlvbnMqKiBtZW51IG9mIHRoZSAqKlN0eWxlKiogaW50ZXJmYWNlLCBhbmQgbmFtZSBpdCBkZSBnZW5lcyB1cC48YnI+PC9icj4KICA8YnI+PC9icj48YnI+PC9icj4KICAhW10oaW1hZ2VzL1N0eWxlLW9wdGlvbnMucG5nKQo8YnI+PC9icj48YnI+PC9icj4KICAKICAKICBBcHBseSB0aGUgKipQcmVmdXNlIEZvcmNlIERpcmVjdGVkKiogbGF5b3V0IGJ5IGNsaWNraW5nIHRoZSAqKkFwcGx5IFByZWZlcnJlZCBMYXlvdXQqKiBidXR0b24gaW4gdGhlIHRvb2xiYXIuIFRoZSBuZXR3b3JrIHdpbGwgbm93IGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKICA8YnI+PC9icj48YnI+PC9icj4KICAhW10oaW1hZ2VzL1ByZWZ1c2UtZm9yY2UtbGF5b3V0LnBuZykKPGJyPjwvYnI+PGJyPjwvYnI+Cgo8ZGl2IGNsYXNzPSJleGVyY2lzZSI+CiMgRXhlcmNpc2UKCiMjIGEuIFNUUklORyBFbnJpY2htZW50CgpUaGUgU1RSSU5HIGFwcCBoYXMgYnVpbHQtaW4gZW5yaWNobWVudCBhbmFseXNpcyBmdW5jdGlvbmFsaXR5LCB3aGljaCBpbmNsdWRlcyBlbnJpY2htZW50IGZvciBHZW5lIE9udG9sb2d5LCBJbnRlclBybywgS0VHRyBQYXRod2F5cywgYW5kIFBGQU0uPGJyPjwvYnI+CgoqCVVzaW5nIHRoZSBTVFJJTkcgdGFiIG9mIHRoZSBSZXN1bHRzIFBhbmVsLCBjbGljayB0aGUgKipGdW5jdGlvbmFsIEVucmljaG1lbnQgYnV0dG9uKiouIEtlZXAgdGhlIGRlZmF1bHQgc2V0dGluZ3MuIFdoYXQgZG8geW91IHNlZS48YnI+PC9icj4KICAgICFbXShpbWFnZXMvRnVuY3Rpb25hbEVucmljaG1lbnRCdXR0b24ucG5nKQogIAogIDxicj48L2JyPjxicj48L2JyPgoKKiBXaGVuIHRoZSBlbnJpY2htZW50IGFuYWx5c2lzIGlzIGNvbXBsZXRlLCBhIG5ldyB0YWIgdGl0bGVkICoqU1RSSU5HKiogKipFbnJpY2htZW50Kiogd2lsbCBvcGVuIGluIHRoZSAqKlRhYmxlIFBhbmVsKiouPGJyPjwvYnI+CgoqIFRoZSBTVFJJTkcgYXBwIGluY2x1ZGVzIHNldmVyYWwgb3B0aW9ucyBmb3IgZmlsdGVyaW5nIGFuZCBkaXNwbGF5aW5nIHRoZSBlbnJpY2htZW50IHJlc3VsdHMuIFRoZSBmZWF0dXJlcyBhcmUgYWxsIGF2YWlsYWJsZSBhdCB0aGUgdG9wIG9mIHRoZSAqKlNUUklORyBFbnJpY2htZW50IHRhYioqLiBGaWx0ZXIgdGhlIHRhYmxlIHRvIG9ubHkgc2hvdyAqKkdPIEJpb2xvZ2ljYWwgUHJvY2Vzcy4qKjxicj48L2JyPgogICAKKiBBdCB0aGUgdG9wIGxlZnQgb2YgdGhlIFNUUklORyBlbnJpY2htZW50IHRhYiwgY2xpY2sgdGhlIGZpbHRlciBpY29uIGByIGljb25zOjpmb250YXdlc29tZSgiZmlsdGVyIiwgc3R5bGUgPSAic29saWQiKWAgLiBTZWxlY3QgKipHTyBCaW9sb2dpY2FsIFByb2Nlc3MqKiBhbmQgY2hlY2sgdGhlICoqUmVtb3ZlIHJlZHVuZGFudCB0ZXJtcyBjaGVjay1ib3gqKi4gVGhlbiBjbGljayAqKk9LLioqPGJyPjwvYnI+CiogTmV4dCwgYWRkIGEgc3BsaXQgZG9udXQgY2hhcnQgdG8gdGhlIG5vZGVzIHJlcHJlc2VudGluZyB0aGUgdG9wIHRlcm1zIGJ5IGNsaWNraW5nIG9uIDxicj48L2JyPgoqIEV4cGxvcmUgY3VzdG9tIHNldHRpbmdzIHZpYSAgIGluIHRoZSB0b3AgcmlnaHQgb2YgdGhlIFNUUklORyBlbnJpY2htZW50IHRhYi48YnI+PC9icj4gICAKICAgIAojIyMgYi4gUmVwZWF0IHRoZSB3aG9sZSBleHBlcmltZW50IHVzaW5nICJkb3duLXJlZ3VsYXRlZCIgZ2VuZXMuIAoKIyMjIGMuIEV4cG9ydCB5b3VyIE5ldHdvcmtzCgojIyMgZC4gKipTYXZlIGluIGFueSBvZiB0aGUgZm9ybWF0cyBhbmQgYmUgcmVhZHkgZm9yIHB1Ymxpc2hpbmcuKioKICAKICA8L2Rpdj4KICAKICAKIyMjIFdlIHdpbGwgbm93IGdvIHRvIHRoZSBuZXh0IHNlc3Npb24gW3Nlc3Npb24gKDJCKV0oc2Vzc2lvbjJiLm5iLmh0bWwpIHRvIHVuZGVyc3RhbmQgaG93IHRvIHBlcmZvcm0gRnVuY3Rpb25hbCBFbnJpY2htZW50LiAgICAKICA=