Creative Commons License

1 The UPS DIA Spike in A vs B dataset

The DIA case-study is a subset of Staes et al. (Staes et al. 2024). They spiked digested UPS proteins at five different concentrations in a yeast digest background. We will only use the data of two spikin concentrations, which we refer to as condition A and B.

  • The subset of the dia-nn data can be downloaded zip file with data. The report file can be found in data/quantification/ups_spikein_dia-nn.

If you use the GUI for the first time we suggest to first follow the DDA cptac vignette study prior to this DIA vignette: cptac vignette.

2 Data preprocessing

Before analysing the data, we must perform data preprocessing. The will ensure the data meet our model assumptions. Data import and preprocessing is performed by the QFeaturesGUI application.

2.1 Open QFeaturesGUI

Run the following command (like above):

QFeaturesGUI::importQFeatures()

2.2 Import the data

Our MS-based proteomics data analysis workflows always start with 2 pieces of data:

  1. The search engine output. In this tutorial, we will use the identified and quantified peptide data by DIA-NN, called peptides.txt.

  2. An annotation file describing the experimental design. Each line corresponds to a sample and each column provides a sample annotation.

The main difference with the peptide.txt file of MaxQuant is that the DIA-NN report file is a flat file while the MaxQuant peptide.txt file is a wide file.

This will involve an additional step in the data preprocessing.

When importing a flat file in the QFeaturesGUI will store the data of each run in a separate assay.

We will then join the assays of each of the runs in a separate assay.

Similarly as in the CPTAC vignette, we will

  1. first import the DIA-NN data in the assayData tab: report_libfree2023_2-4_small.tsv and

  2. The corresponding experimental annotation file report_libfree2023_2-4_annotation_Precursor.Quantity.tsv in the colData tab. The annotation file contains a variable quantCols that refers to the Precursor.Quantity column from DIA-NN, which provide the MS2 quantifications. If you want to work with the MS1 quantifications you need to use Ms1.Area in the variable quantCols (see report_libfree2023_2-4_annotation_Ms1.Area). Because the DIA-NN report file is a flat file the annotation file also have to provide a column with the information of the run names in the annotation file. The name of the latter column has to be runCol.

  3. Finaly we import the data in a QFeatures object using the QFeatures converter tab. Note, in the QFeatures tab we also have to indicate the name of the run column in the assayData for files in a flat format. For DIA-NN data this column is named run.

Figure 1. The QFeatures object is successfully converted Note, that multiple assays are created. One for each run.

2.3 Configuring the preprocessing worflow

Move to the next table by clicking on “Pre-Processing Configuration” in the menu to the left. Click on the green button “+” to add a step. In this tutorial, you will need to add 9 steps in total. Two steps more then for the cptac vignette:

  • An additional feature filtering step to retain precursors that have not been identified, which have a low Q value (low FDR for identification) or a low protein group Q value.

  • A step to join the assays of the different runs in a single assay.

You should parameterise them as follows:

  1. Feature filtering
  2. Join assays
  3. Log Transformation
  4. Add Annotations
  5. Features filtering
  6. Normalisation
  7. Aggregation
  8. Add Annotations
  9. Features filtering

You can now click the “Confirm Current Workflow” button. On the left menu, you will see that the 3rd entry now mentions “3 Pre-processing (9 Steps)”. We will now configure and run each of these steps.

Figure 2. The preprocessing workflow upon configuration
Figure 2. The preprocessing workflow upon configuration

2.4 Step 1: Feature filtering

Note that the PCA plots will fail because every run only contains information about 1 run.

Add three filtering boxes.

  1. Box to retain precursors that have been identified: Precursor.Id !=
  2. Box to retain precursors with a Q-value below 0.01: Q.Value <= 0.01
  3. Box to retain precursors with a Q-value below 0.01: PG.Q.Value <= 0.01

Then we perform the filtering and save the assay: 4. Click apply filters 5. Click save the processed assays

2.5 Step 2: Assay joining

  1. Click Load assays from previous steps
  2. Select the Precursor.Id column as the annotation name
  3. Click join assays
  4. Click save the processed assays
Figure 3. Assay joining
Figure 3. Assay joining

2.6 Step 3: Log transformation

Similar to the cptac vignette we log transform the data.

Once you are done, click the “Save the processed data” button.

2.7 Step 4: add annotations

Similar to the cptac vignette we add the annotation on the missing values.

2.8 Step 5: precursor filtering

  1. We filter the precursors based on the number of NAs. Again we want only precursors that were observed in at least 3 runs so nNA has to be smaller or equal to than 6-3 = 3 . nNA <= 3

  2. With DIA-NN you can keep the precursors that only map to one protein: Proteotypic == 1

  3. In the “Filtering Summary” tile, click the “Apply Filters” button.

  4. Click the button to save the processed data.

2.9 Step 6: Normalisation

Again we normalise the data as in the previous vignette by using median centering.

2.10 Step 7: Summarisation

Again we summarize the data as in the previous vignette us Protein.Ids to aggregate the precursor-level data in a protein-level expression value.

2.11 Step 8: add annotations

Repeat step 2, this will allow to perform a filtering on missing, but at the protein-level instead of peptide-level.

2.12 Step 9: protein filtering

Again, we will remove proteins that were identified in less than 4 samples so that for most proteins at least two protein-level expression values are observed in each treatment group.

So we will tolerate at most 6-4 = 2 missing values at the protein-level.

2.13 Save your progress

You now have completed the data processing. You can move to the Summary tab (in the left menu). There you will find an overview of the data and the data processing steps.

Go to the bottom of the page and click on the “Download QFeatures” button. A pop up windown will ask you to select a directory to store the resulting file. By default the file is called qfeatures_object.rds, but feel free to rename as you wish but you cannot change the file extension (.rds).

You can now close the application.

3 Statistical analysis

3.1 Open msqrob2gui

The differential analysis in the msqrob2gui remains similar to the previous vignette and tutorials.

Staes, An, Teresa Maia, Sara Dufour, Robbin Bouwmeester, Ralf Gabriels, Lennart Martens, Kris Gevaert, Francis Impens, and Simon Devos. 2024. “Benefit of in Silico Predicted Spectral Libraries in Data‑independent Acquisition Data Analysis Workflows.” Journal of Proteome Research 23 (6): 2078–89. https://doi.org/10.1021/acs.jproteome.4c00048.
LS0tCnRpdGxlOiAiSW50cm9kdWN0aW9uIHRvIHByb3Rlb21pY3MgZGF0YSBhbmFseXNpcyIKc3VidGl0bGU6ICJJbXBhY3Qgb2Ygc3VtbWFyaXNhdGlvbiIKYXV0aG9yOiAiTGlldmVuIENsZW1lbnQiCmRhdGU6ICJzdGF0T21pY3MsIEdoZW50IFVuaXZlcnNpdHkgKGh0dHBzOi8vc3RhdG9taWNzLmdpdGh1Yi5pbykiCm91dHB1dDoKICAgIGh0bWxfZG9jdW1lbnQ6CiAgICAgIHRoZW1lOiBmbGF0bHkgICAgICAKICAgICAgY29kZV9kb3dubG9hZDogZmFsc2UKICAgICAgdG9jOiBmYWxzZQogICAgICB0b2NfZmxvYXQ6IGZhbHNlCiAgICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UKYmlibGlvZ3JhcGh5OiBtc3Fyb2IyLmJpYgotLS0KCjxhIHJlbD0ibGljZW5zZSIgaHJlZj0iaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLXNhLzQuMCI+PGltZyBhbHQ9IkNyZWF0aXZlIENvbW1vbnMgTGljZW5zZSIgc3R5bGU9ImJvcmRlci13aWR0aDowIiBzcmM9Imh0dHBzOi8vaS5jcmVhdGl2ZWNvbW1vbnMub3JnL2wvYnktbmMtc2EvNC4wLzg4eDMxLnBuZyIgLz48L2E+CgojIyBUaGUgVVBTIERJQSBTcGlrZSBpbiBBIHZzIEIgZGF0YXNldAoKVGhlIERJQSBjYXNlLXN0dWR5IGlzIGEgc3Vic2V0IG9mIFN0YWVzIGV0IGFsLiBbQFN0YWVzMjAyNF0uIApUaGV5IHNwaWtlZCBkaWdlc3RlZCBVUFMgcHJvdGVpbnMgYXQgZml2ZSBkaWZmZXJlbnQgY29uY2VudHJhdGlvbnMgaW4gYSB5ZWFzdCBkaWdlc3QgYmFja2dyb3VuZC4gCldlIHdpbGwgb25seSB1c2UgdGhlIGRhdGEgb2YgdHdvIHNwaWtpbiBjb25jZW50cmF0aW9ucywgd2hpY2ggd2UgcmVmZXIgdG8gYXMgY29uZGl0aW9uIEEgYW5kIEIuIAoKLSBUaGUgc3Vic2V0IG9mIHRoZSBkaWEtbm4gZGF0YSBjYW4gYmUgZG93bmxvYWRlZCBbemlwIGZpbGUgd2l0aCAKICBkYXRhXShodHRwczovL2dpdGh1Yi5jb20vc3RhdE9taWNzL1BEQTI1RUJJL2FyY2hpdmUvcmVmcy9oZWFkcy9kYXRhLnppcCkuCiAgVGhlIHJlcG9ydCBmaWxlIGNhbiBiZSBmb3VuZCBpbiAKICBgZGF0YS9xdWFudGlmaWNhdGlvbi91cHNfc3Bpa2Vpbl9kaWEtbm5gLgogIApJZiB5b3UgdXNlIHRoZSBHVUkgZm9yIHRoZSBmaXJzdCB0aW1lIHdlIHN1Z2dlc3QgdG8gZmlyc3QgZm9sbG93IHRoZSBEREEgY3B0YWMgdmlnbmV0dGUgc3R1ZHkgcHJpb3IgdG8gdGhpcyBESUEgdmlnbmV0dGU6IFtjcHRhYyB2aWduZXR0ZV0oLi9jcHRhY19yb2J1c3RfZ3VpLmh0bWwpLiAKCgojIyBEYXRhIHByZXByb2Nlc3NpbmcKCkJlZm9yZSBhbmFseXNpbmcgdGhlIGRhdGEsIHdlIG11c3QgcGVyZm9ybSBkYXRhIHByZXByb2Nlc3NpbmcuIFRoZQp3aWxsIGVuc3VyZSB0aGUgZGF0YSBtZWV0IG91ciBtb2RlbCBhc3N1bXB0aW9ucy4gRGF0YSBpbXBvcnQgYW5kCnByZXByb2Nlc3NpbmcgaXMgcGVyZm9ybWVkIGJ5IHRoZSBgUUZlYXR1cmVzR1VJYCBhcHBsaWNhdGlvbi4KCiMjIyBPcGVuIGBRRmVhdHVyZXNHVUlgIAoKUnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZCAobGlrZSBhYm92ZSk6CgpgYGB7ciwgZXZhbD1GQUxTRX0KUUZlYXR1cmVzR1VJOjppbXBvcnRRRmVhdHVyZXMoKQpgYGAKCgojIyMgSW1wb3J0IHRoZSBkYXRhCgpPdXIgTVMtYmFzZWQgcHJvdGVvbWljcyBkYXRhIGFuYWx5c2lzIHdvcmtmbG93cyBhbHdheXMgc3RhcnQgd2l0aCAyIApwaWVjZXMgb2YgZGF0YTogCgoxLiBUaGUgc2VhcmNoIGVuZ2luZSBvdXRwdXQuIEluIHRoaXMgdHV0b3JpYWwsIHdlIHdpbGwgdXNlIHRoZQogICBpZGVudGlmaWVkIGFuZCBxdWFudGlmaWVkIHBlcHRpZGUgZGF0YSBieSBESUEtTk4sIGNhbGxlZAogICBgcGVwdGlkZXMudHh0YC4KICAgCjIuIEFuIGFubm90YXRpb24gZmlsZSBkZXNjcmliaW5nIHRoZSBleHBlcmltZW50YWwgZGVzaWduLiBFYWNoIGxpbmUKICAgY29ycmVzcG9uZHMgdG8gYSBzYW1wbGUgYW5kIGVhY2ggY29sdW1uIHByb3ZpZGVzIGEgc2FtcGxlIAogICBhbm5vdGF0aW9uLgoKVGhlIG1haW4gZGlmZmVyZW5jZSB3aXRoIHRoZSBwZXB0aWRlLnR4dCBmaWxlIG9mIE1heFF1YW50IGlzIHRoYXQgdGhlIERJQS1OTiByZXBvcnQgZmlsZSBpcyBhIGZsYXQgZmlsZSB3aGlsZSB0aGUgTWF4UXVhbnQgcGVwdGlkZS50eHQgZmlsZSBpcyBhIHdpZGUgZmlsZS4gCgpUaGlzIHdpbGwgaW52b2x2ZSBhbiBhZGRpdGlvbmFsIHN0ZXAgaW4gdGhlIGRhdGEgcHJlcHJvY2Vzc2luZy4gCgpXaGVuIGltcG9ydGluZyBhIGZsYXQgZmlsZSBpbiB0aGUgUUZlYXR1cmVzR1VJIHdpbGwgc3RvcmUgdGhlIGRhdGEgb2YgZWFjaCBydW4gaW4gYSBzZXBhcmF0ZSBhc3NheS4gCgpXZSB3aWxsIHRoZW4gam9pbiB0aGUgYXNzYXlzIG9mIGVhY2ggb2YgdGhlIHJ1bnMgaW4gYSBzZXBhcmF0ZSBhc3NheS4gCgpTaW1pbGFybHkgYXMgaW4gdGhlIENQVEFDIHZpZ25ldHRlLCB3ZSB3aWxsIAoKMS4gZmlyc3QgaW1wb3J0IHRoZSBESUEtTk4gZGF0YSBpbiB0aGUgYXNzYXlEYXRhIHRhYjogYHJlcG9ydF9saWJmcmVlMjAyM18yLTRfc21hbGwudHN2YCBhbmQgCjIuIFRoZSBjb3JyZXNwb25kaW5nIGV4cGVyaW1lbnRhbCBhbm5vdGF0aW9uIGZpbGUgYHJlcG9ydF9saWJmcmVlMjAyM18yLTRfYW5ub3RhdGlvbl9QcmVjdXJzb3IuUXVhbnRpdHkudHN2YCBpbiB0aGUgY29sRGF0YSB0YWIuIFRoZSBhbm5vdGF0aW9uIGZpbGUgY29udGFpbnMgYSB2YXJpYWJsZSBxdWFudENvbHMgdGhhdCByZWZlcnMgdG8gdGhlIFByZWN1cnNvci5RdWFudGl0eSBjb2x1bW4gZnJvbSBESUEtTk4sIHdoaWNoIHByb3ZpZGUgdGhlIE1TMiBxdWFudGlmaWNhdGlvbnMuIElmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCB0aGUgTVMxIHF1YW50aWZpY2F0aW9ucyB5b3UgbmVlZCB0byB1c2UgYE1zMS5BcmVhYCBpbiB0aGUgdmFyaWFibGUgcXVhbnRDb2xzIChzZWUgcmVwb3J0X2xpYmZyZWUyMDIzXzItNF9hbm5vdGF0aW9uX01zMS5BcmVhKS4gQmVjYXVzZSB0aGUgRElBLU5OIHJlcG9ydCBmaWxlIGlzIGEgZmxhdCBmaWxlIHRoZSBhbm5vdGF0aW9uIGZpbGUgYWxzbyBoYXZlIHRvIHByb3ZpZGUgYSBjb2x1bW4gd2l0aCB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIHJ1biBuYW1lcyBpbiB0aGUgYW5ub3RhdGlvbiBmaWxlLiBUaGUgbmFtZSBvZiB0aGUgbGF0dGVyIGNvbHVtbiBoYXMgdG8gYmUgYHJ1bkNvbGAuIAoKMy4gRmluYWx5IHdlIGltcG9ydCB0aGUgZGF0YSBpbiBhIFFGZWF0dXJlcyBvYmplY3QgdXNpbmcgdGhlIFFGZWF0dXJlcyBjb252ZXJ0ZXIgdGFiLiAKTm90ZSwgaW4gdGhlIFFGZWF0dXJlcyB0YWIgd2UgYWxzbyBoYXZlIHRvIGluZGljYXRlIHRoZSBuYW1lIG9mIHRoZSBydW4gY29sdW1uIGluIHRoZSBhc3NheURhdGEgZm9yIGZpbGVzIGluIGEgZmxhdCBmb3JtYXQuIEZvciBESUEtTk4gZGF0YSB0aGlzIGNvbHVtbiBpcyBuYW1lZCBgcnVuYC4KCgohW0ZpZ3VyZSAxLiBUaGUgUUZlYXR1cmVzIG9iamVjdCBpcyBzdWNjZXNzZnVsbHkgY29udmVydGVkXSguL2ZpZ3VyZXMvcWZlYXR1cmVzX2ltcG9ydGVkX2RpYW5uLnBuZykKTm90ZSwgdGhhdCBtdWx0aXBsZSBhc3NheXMgYXJlIGNyZWF0ZWQuIE9uZSBmb3IgZWFjaCBydW4uIAoKIyMjIENvbmZpZ3VyaW5nIHRoZSBwcmVwcm9jZXNzaW5nIHdvcmZsb3cKCk1vdmUgdG8gdGhlIG5leHQgdGFibGUgYnkgY2xpY2tpbmcgb24gIlByZS1Qcm9jZXNzaW5nIENvbmZpZ3VyYXRpb24iCmluIHRoZSBtZW51IHRvIHRoZSBsZWZ0LiBDbGljayBvbiB0aGUgZ3JlZW4gYnV0dG9uICIrIiB0byBhZGQgYSBzdGVwLgpJbiB0aGlzIHR1dG9yaWFsLCB5b3Ugd2lsbCBuZWVkIHRvIGFkZCA5IHN0ZXBzIGluIHRvdGFsLiAKVHdvIHN0ZXBzIG1vcmUgdGhlbiBmb3IgdGhlIGNwdGFjIHZpZ25ldHRlOiAKCi0gQW4gYWRkaXRpb25hbCBmZWF0dXJlIGZpbHRlcmluZyBzdGVwIHRvIHJldGFpbiBwcmVjdXJzb3JzIHRoYXQgaGF2ZSBub3QgYmVlbiBpZGVudGlmaWVkLCB3aGljaCBoYXZlIGEgbG93IFEgdmFsdWUgKGxvdyBGRFIgZm9yIGlkZW50aWZpY2F0aW9uKSBvciBhIGxvdyBwcm90ZWluIGdyb3VwIFEgdmFsdWUuIAoKLSBBIHN0ZXAgdG8gam9pbiB0aGUgYXNzYXlzIG9mIHRoZSBkaWZmZXJlbnQgcnVucyBpbiBhIHNpbmdsZSBhc3NheS4gCgpZb3Ugc2hvdWxkCnBhcmFtZXRlcmlzZSB0aGVtIGFzIGZvbGxvd3M6CgoxLiBGZWF0dXJlIGZpbHRlcmluZwoyLiBKb2luIGFzc2F5cwozLiBMb2cgVHJhbnNmb3JtYXRpb24KNC4gQWRkIEFubm90YXRpb25zCjUuIEZlYXR1cmVzIGZpbHRlcmluZwo2LiBOb3JtYWxpc2F0aW9uCjcuIEFnZ3JlZ2F0aW9uCjguIEFkZCBBbm5vdGF0aW9ucwo5LiBGZWF0dXJlcyBmaWx0ZXJpbmcKCgpZb3UgY2FuIG5vdyBjbGljayB0aGUgIkNvbmZpcm0gQ3VycmVudCBXb3JrZmxvdyIgYnV0dG9uLiBPbiB0aGUgbGVmdAptZW51LCB5b3Ugd2lsbCBzZWUgdGhhdCB0aGUgM3JkIGVudHJ5IG5vdyBtZW50aW9ucyAiMyBQcmUtcHJvY2Vzc2luZwooOSBTdGVwcykiLiBXZSB3aWxsIG5vdyBjb25maWd1cmUgYW5kIHJ1biBlYWNoIG9mIHRoZXNlIHN0ZXBzLgoKCiFbRmlndXJlIDIuIFRoZSBwcmVwcm9jZXNzaW5nIHdvcmtmbG93IHVwb24gY29uZmlndXJhdGlvbl0oLi9maWd1cmVzL3ByZXByb2Nlc3NpbmdfY29uZmlndXJhdGlvbl9kaWFubi5wbmcpCgojIyMgU3RlcCAxOiBGZWF0dXJlIGZpbHRlcmluZyAKCk5vdGUgdGhhdCB0aGUgUENBIHBsb3RzIHdpbGwgZmFpbCBiZWNhdXNlIGV2ZXJ5IHJ1biBvbmx5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IDEgcnVuLiAKCkFkZCB0aHJlZSBmaWx0ZXJpbmcgYm94ZXMuIAoKMS4gQm94IHRvIHJldGFpbiBwcmVjdXJzb3JzIHRoYXQgaGF2ZSBiZWVuIGlkZW50aWZpZWQ6IGBQcmVjdXJzb3IuSWQgIT0gYCAKMi4gQm94IHRvIHJldGFpbiBwcmVjdXJzb3JzIHdpdGggYSBRLXZhbHVlIGJlbG93IDAuMDE6IGBRLlZhbHVlIDw9IDAuMDFgCjMuIEJveCB0byByZXRhaW4gcHJlY3Vyc29ycyB3aXRoIGEgUS12YWx1ZSBiZWxvdyAwLjAxOiBgUEcuUS5WYWx1ZSA8PSAwLjAxYAoKVGhlbiB3ZSBwZXJmb3JtIHRoZSBmaWx0ZXJpbmcgYW5kIHNhdmUgdGhlIGFzc2F5OiAKNC4gQ2xpY2sgYGFwcGx5IGZpbHRlcnNgCjUuIENsaWNrIGBzYXZlIHRoZSBwcm9jZXNzZWQgYXNzYXlzYAoKIyMjIFN0ZXAgMjogQXNzYXkgam9pbmluZwoKMS4gQ2xpY2sgYExvYWQgYXNzYXlzIGZyb20gcHJldmlvdXMgc3RlcHNgCjIuIFNlbGVjdCB0aGUgYFByZWN1cnNvci5JZGAgY29sdW1uIGFzIHRoZSBhbm5vdGF0aW9uIG5hbWUKMy4gQ2xpY2sgYGpvaW4gYXNzYXlzYAo0LiBDbGljayBgc2F2ZSB0aGUgcHJvY2Vzc2VkIGFzc2F5c2AKCiFbRmlndXJlIDMuIEFzc2F5IGpvaW5pbmddKC4vZmlndXJlcy9hc3NheWpvaW5pbmcucG5nKQoKIyMjIFN0ZXAgMzogTG9nIHRyYW5zZm9ybWF0aW9uCgpTaW1pbGFyIHRvIHRoZSBjcHRhYyB2aWduZXR0ZSB3ZSBsb2cgdHJhbnNmb3JtIHRoZSBkYXRhLiAKCk9uY2UgeW91IGFyZSBkb25lLCBjbGljayB0aGUgIlNhdmUgdGhlIHByb2Nlc3NlZCBkYXRhIiBidXR0b24uIAoKIyMjIFN0ZXAgNDogYWRkIGFubm90YXRpb25zCgpTaW1pbGFyIHRvIHRoZSBjcHRhYyB2aWduZXR0ZSB3ZSBhZGQgdGhlIGFubm90YXRpb24gb24gdGhlIG1pc3NpbmcgdmFsdWVzLiAKCiMjIyBTdGVwIDU6IHByZWN1cnNvciBmaWx0ZXJpbmcKCjEuIFdlIGZpbHRlciB0aGUgcHJlY3Vyc29ycyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIE5Bcy4gCkFnYWluIHdlIHdhbnQgb25seSBwcmVjdXJzb3JzIHRoYXQgd2VyZSBvYnNlcnZlZCBpbiBhdCBsZWFzdCAzIHJ1bnMgc28gbk5BIGhhcyB0byBiZSBzbWFsbGVyIG9yIGVxdWFsIHRvIHRoYW4gNi0zID0gMyAuIApgbk5BIDw9IDNgCgoyLiBXaXRoIERJQS1OTiB5b3UgY2FuIGtlZXAgdGhlIHByZWN1cnNvcnMgdGhhdCBvbmx5IG1hcCB0byBvbmUgcHJvdGVpbjogCmBQcm90ZW90eXBpYyA9PSAxYAozLiBJbiB0aGUgIkZpbHRlcmluZyBTdW1tYXJ5IiB0aWxlLCBjbGljayB0aGUgIkFwcGx5IEZpbHRlcnMiIGJ1dHRvbi4KNC4gQ2xpY2sgdGhlIGJ1dHRvbiB0byBzYXZlIHRoZSBwcm9jZXNzZWQgZGF0YS4KCgojIyMgU3RlcCA2OiBOb3JtYWxpc2F0aW9uCgpBZ2FpbiB3ZSBub3JtYWxpc2UgdGhlIGRhdGEgYXMgaW4gdGhlIHByZXZpb3VzIHZpZ25ldHRlIGJ5IHVzaW5nIG1lZGlhbiBjZW50ZXJpbmcuIAoKIyMjIFN0ZXAgNzogU3VtbWFyaXNhdGlvbgoKQWdhaW4gd2Ugc3VtbWFyaXplIHRoZSBkYXRhIGFzIGluIHRoZSBwcmV2aW91cyB2aWduZXR0ZSB1cyBgUHJvdGVpbi5JZHNgIHRvIGFnZ3JlZ2F0ZSB0aGUgcHJlY3Vyc29yLWxldmVsIGRhdGEgaW4gYSBwcm90ZWluLWxldmVsIGV4cHJlc3Npb24gdmFsdWUuIAoKIyMjIFN0ZXAgODogYWRkIGFubm90YXRpb25zCgpSZXBlYXQgc3RlcCAyLCB0aGlzIHdpbGwgYWxsb3cgdG8gcGVyZm9ybSBhIGZpbHRlcmluZyBvbiBtaXNzaW5nLCBidXQKYXQgdGhlIHByb3RlaW4tbGV2ZWwgaW5zdGVhZCBvZiBwZXB0aWRlLWxldmVsLgoKIyMjIFN0ZXAgOTogcHJvdGVpbiBmaWx0ZXJpbmcKCkFnYWluLCB3ZSB3aWxsIHJlbW92ZSBwcm90ZWlucyB0aGF0IHdlcmUgaWRlbnRpZmllZCBpbiBsZXNzCnRoYW4gNCBzYW1wbGVzIHNvIHRoYXQgZm9yIG1vc3QgcHJvdGVpbnMgYXQgbGVhc3QgdHdvIHByb3RlaW4tbGV2ZWwgZXhwcmVzc2lvbiB2YWx1ZXMgYXJlIG9ic2VydmVkIGluIGVhY2ggdHJlYXRtZW50IGdyb3VwLiAKClNvIHdlIHdpbGwgdG9sZXJhdGUgYXQgbW9zdCA2LTQgPSAyIG1pc3NpbmcgdmFsdWVzIGF0IHRoZSBwcm90ZWluLWxldmVsLiAKCiMjIyBTYXZlIHlvdXIgcHJvZ3Jlc3MKCllvdSBub3cgaGF2ZSBjb21wbGV0ZWQgdGhlIGRhdGEgcHJvY2Vzc2luZy4gWW91IGNhbiBtb3ZlIHRvIHRoZQpTdW1tYXJ5IHRhYiAoaW4gdGhlIGxlZnQgbWVudSkuIFRoZXJlIHlvdSB3aWxsIGZpbmQgYW4gb3ZlcnZpZXcgb2YgdGhlCmRhdGEgYW5kIHRoZSBkYXRhIHByb2Nlc3Npbmcgc3RlcHMuCgpHbyB0byB0aGUgYm90dG9tIG9mIHRoZSBwYWdlIGFuZCBjbGljayBvbiB0aGUgIkRvd25sb2FkIFFGZWF0dXJlcyIKYnV0dG9uLiBBIHBvcCB1cCB3aW5kb3duIHdpbGwgYXNrIHlvdSB0byBzZWxlY3QgYSBkaXJlY3RvcnkgdG8gc3RvcmUKdGhlIHJlc3VsdGluZyBmaWxlLiBCeSBkZWZhdWx0IHRoZSBmaWxlIGlzIGNhbGxlZApgcWZlYXR1cmVzX29iamVjdC5yZHNgLCBidXQgZmVlbCBmcmVlIHRvIHJlbmFtZSBhcyB5b3Ugd2lzaCBidXQgeW91CmNhbm5vdCBjaGFuZ2UgdGhlIGZpbGUgZXh0ZW5zaW9uIChgLnJkc2ApLgoKWW91IGNhbiBub3cgY2xvc2UgdGhlIGFwcGxpY2F0aW9uLgoKIyMgU3RhdGlzdGljYWwgYW5hbHlzaXMKCiMjIyBPcGVuIGBtc3Fyb2IyZ3VpYCAKClRoZSBkaWZmZXJlbnRpYWwgYW5hbHlzaXMgaW4gdGhlIG1zcXJvYjJndWkgcmVtYWlucyBzaW1pbGFyIHRvIHRoZSBwcmV2aW91cyB2aWduZXR0ZSBhbmQgdHV0b3JpYWxzLiAK