About
An R Notebook is an R Markdown document with chunks that can be executed independently and interactively, with output visible immediately beneath the input. R Notebooks are a method of literate programming that allows for direct interaction with R while creating a reproducible document with publication-quality output.
A notebook for this class will consist of comments and directions followed by a chunk of code that can be ran independently in order for students to see the examples and follow along with the lessons.
The course focus is on problem solving. The programming part using R/RStudio should be viewed more as a tool to solve a problem and learned as we go. For this reason it is important, prior to answering any questions or solving a problem, you carefully read each document, and sequentially execute any existing code chunks as part of the walk-thru examples.
Setup
To use R Notebooks, first R Studio must be opened. To create an R Notebook in RStudio, go to File -> New File -> R Notebook. In this course though, the notebooks will be created before the start of class and students will edit them throughout the lab.
Typically, a data set or notebook will be downloaded and it is important to set this folder as the working directory for the project prior to any coding. This can be done by going to Session -> Set Working Directory -> To Source File Location
Inserting Chunks of Code
Notebook chunks can be inserted quickly using the keyboard shortcut Ctrl + Alt + I (OS X: Cmd + Option + I), or via the Insert command in the editor toolbar found at the top.

A chunk of empty code looks like this in the notebook before it is published:

It will always begin with they ``` symbol followed by the {r} and ending with the ```. In this light grey box, you can code after the {r} and before the second ``` symbol. You can insert as many chunks of code as you would like as it is user preference. Typically, in an R Notebook, we aspire to have one output per chunk of code. If there will be more than one output, it is best to split the code.
Executing Code
In order to run the code, you have several options.
Use Ctrl + Shift * Enter (OS X: Cmd + Shift + Enter) or the Run Chunk command,
, to run the current chunk.
Press Ctrl + Enter (OS X: Cmd + Enter) to run just the current statement. Running a single statement is much like running an entire chunk consisting only of that statement.
Use the Run All and Run All Chunks Above commands to run all chunks or a batch of chunks found above.

Example Executing Code
After downloading a data set, we must read the data in. So, create an R code chunk in the R Notebook and write the code to read in the file. To make sure the file is read correctly, run the chunk. The code should look something like this.
read.csv(file = "example csv.csv")
NA

The green triangle with the red square around button is the ‘run’ button. If selected, this button runs the code. If we push it, we should obtain the following result.

This is the output. If the output is not what you want, or if there is an error, you can simply go back to the code chunk, edit the code, and rerun it.
Errors
When coding, there are often small errors that are made. With R Notebooks, the message will display exactly what line your error is on, which allows you to fix it.
In the example below, we see that the error is made because we forgot to set the working directory. This is a very common mistake and as a programmer, we will learn to identify these errors quickly.

Inserting Images
Throughout the lab sessions, you will be asked to take screenshots of your work and upload them to the lab before submitting your work. Additionally, it may be nice to add images to your notebook to enhance your code or understanding of the project.
To add a picture, use the following command and preview it


<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyAhW0ltYWdlIFRlc3RdKGpha2UucG5nKVxuXG5gYGAifQ== -->
```r
# 
Below is an example of how this is done. The assumption in this case is that the image is located in same location or folder as tis file.
Submitting Your Work
After completing and answering all questions in your R Notebook or R Markdown file, review your work to make sure you have safely executed all the code chunks in the notebook, and there are no errors or missed code chunks not executed. Otherwise results won’t appear in your submitted file. At the top left, there is a button that says “Preview”. You want to click the “Preview” button or select the “Preview Notebook” from the dropdown. Other options in the dropdown may or not appear depending on your particular installation and configuration.

If this is the first time, you will probably get a pop-up window asking you to install the required packages. Answer ‘Yes’.
Once the preview file is rendered, it will create a corresponding HTML document with a file name that reads like \(\it lab01.nb.html\). In preview mode only any homework question and associated grade points will be marked in red.
After completing a lab, and once satisfied with all executed code chunks and answers you will need to submit the HTML file \(\it lab01.nb.html\) in Sakai for evaluation. It is a simple process of uploading a file
Overall Impact
R Notebooks are powerful. They allow students to edit sections of the file and see the immediate changes in the output without having to run the entire code. Please refer to this guide and other shared references for more guidance.
source: http://rmarkdown.rstudio.com/r_notebooks.html
LS0tDQp0aXRsZTogIkJ1c2luZXNzIEFuYWx5dGljcyBXb3Jrc2hlZXQgMSINCmF1dGhvcjogIlVyaWVsIFJleWVzIFZhenF1ZXoiDQpkYXRlOiAiU3ByaW5nIDIwMjAiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0Kc3VidGl0bGU6IEJTQUQzNDMsIEJ1c2luZXNzIEFuYWx5dGljcywgU3ByaW5nIDIwMjANCi0tLQ0KYGBge3J9DQoNCmBgYA0KDQojIyMgIEFib3V0DQoNCkFuIFIgTm90ZWJvb2sgaXMgYW4gUiBNYXJrZG93biBkb2N1bWVudCB3aXRoIGNodW5rcyB0aGF0IGNhbiBiZSBleGVjdXRlZCBpbmRlcGVuZGVudGx5IGFuZCBpbnRlcmFjdGl2ZWx5LCB3aXRoIG91dHB1dCB2aXNpYmxlIGltbWVkaWF0ZWx5IGJlbmVhdGggdGhlIGlucHV0LiBSIE5vdGVib29rcyBhcmUgYSBtZXRob2Qgb2YgbGl0ZXJhdGUgcHJvZ3JhbW1pbmcgdGhhdCBhbGxvd3MgZm9yIGRpcmVjdCBpbnRlcmFjdGlvbiB3aXRoIFIgd2hpbGUgY3JlYXRpbmcgYSByZXByb2R1Y2libGUgZG9jdW1lbnQgd2l0aCBwdWJsaWNhdGlvbi1xdWFsaXR5IG91dHB1dC4gDQoNCkEgbm90ZWJvb2sgZm9yIHRoaXMgY2xhc3Mgd2lsbCBjb25zaXN0IG9mIGNvbW1lbnRzIGFuZCBkaXJlY3Rpb25zIGZvbGxvd2VkIGJ5IGEgY2h1bmsgb2YgY29kZSB0aGF0IGNhbiBiZSByYW4gaW5kZXBlbmRlbnRseSBpbiBvcmRlciBmb3Igc3R1ZGVudHMgdG8gc2VlIHRoZSBleGFtcGxlcyBhbmQgZm9sbG93IGFsb25nIHdpdGggdGhlIGxlc3NvbnMuDQoNClRoZSBjb3Vyc2UgZm9jdXMgaXMgb24gcHJvYmxlbSBzb2x2aW5nLiAgVGhlIHByb2dyYW1taW5nIHBhcnQgdXNpbmcgUi9SU3R1ZGlvIHNob3VsZCBiZSB2aWV3ZWQgbW9yZSBhcyBhIHRvb2wgdG8gc29sdmUgYSBwcm9ibGVtIGFuZCBsZWFybmVkIGFzIHdlIGdvLiAgRm9yIHRoaXMgcmVhc29uIGl0IGlzIGltcG9ydGFudCwgcHJpb3IgdG8gYW5zd2VyaW5nIGFueSBxdWVzdGlvbnMgb3Igc29sdmluZyBhIHByb2JsZW0sIHlvdSAgY2FyZWZ1bGx5IHJlYWQgZWFjaCBkb2N1bWVudCwgYW5kIHNlcXVlbnRpYWxseSBleGVjdXRlIGFueSBleGlzdGluZyBjb2RlIGNodW5rcyBhcyBwYXJ0IG9mIHRoZSB3YWxrLXRocnUgZXhhbXBsZXMuDQoNCiMjIyBTZXR1cA0KDQpUbyB1c2UgUiBOb3RlYm9va3MsIGZpcnN0IFIgU3R1ZGlvIG11c3QgYmUgb3BlbmVkLiBUbyBjcmVhdGUgYW4gUiBOb3RlYm9vayBpbiBSU3R1ZGlvLCBnbyB0byBGaWxlIC0+IE5ldyBGaWxlIC0+IFIgTm90ZWJvb2suIEluIHRoaXMgY291cnNlIHRob3VnaCwgdGhlIG5vdGVib29rcyB3aWxsIGJlIGNyZWF0ZWQgYmVmb3JlIHRoZSBzdGFydCBvZiBjbGFzcyBhbmQgc3R1ZGVudHMgd2lsbCBlZGl0IHRoZW0gdGhyb3VnaG91dCB0aGUgbGFiLg0KDQpUeXBpY2FsbHksIGEgZGF0YSBzZXQgb3Igbm90ZWJvb2sgd2lsbCBiZSBkb3dubG9hZGVkIGFuZCBpdCBpcyBpbXBvcnRhbnQgdG8gc2V0IHRoaXMgZm9sZGVyIGFzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIHByb2plY3QgcHJpb3IgdG8gYW55IGNvZGluZy4gVGhpcyBjYW4gYmUgZG9uZSBieSBnb2luZyB0byBTZXNzaW9uIC0+IFNldCBXb3JraW5nIERpcmVjdG9yeSAtPiBUbyBTb3VyY2UgRmlsZSBMb2NhdGlvbg0KDQoNCiFbIlNldHRpbmcgV29ya2luZyBEaXJlY3RvcnkiXShpbWcwMS5wbmcpDQoNCg0KDQojIyMgSGVhZGVyDQoNClRoZSBoZWFkZXIgaXMgdGhlIHZlcnkgZmlyc3QgZmV3IGxpbmVzIG9mIGNvZGUgdGhhdCBnaXZlIGltcG9ydGFudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZG9jdW1lbnQuIEl0IGlzIGVzc2VudGlhbCB0byBlZGl0IHRoaXMgaW5mb3JtYXRpb24gZXZlcnl0aW1lIHRvIGVuc3VyZSB5b3UgYXJlIGNyZWRpdGVkIGZvciB5b3VyIHdvcmsgYW5kIHNvIHBlb3BsZSBsb29raW5nIGF0IHlvdXIgY29kZSBrbm93IHdoZW4gYW5kIHdoZXJlIGl0IGlzIGNvbWluZyBmcm9tLiANCg0KIVtdKGltZzAyLnBuZykNCg0KIyMjIEluc2VydGluZyBDaHVua3Mgb2YgQ29kZQ0KDQpOb3RlYm9vayBjaHVua3MgY2FuIGJlIGluc2VydGVkIHF1aWNrbHkgdXNpbmcgdGhlIGtleWJvYXJkIHNob3J0Y3V0IEN0cmwgKyBBbHQgKyBJIChPUyBYOiBDbWQgKyBPcHRpb24gKyBJKSwgb3IgdmlhIHRoZSBJbnNlcnQgY29tbWFuZCBpbiB0aGUgZWRpdG9yIHRvb2xiYXIgZm91bmQgYXQgdGhlIHRvcC4NCg0KIVtdKGltZzAzLnBuZykNCg0KQSBjaHVuayBvZiBlbXB0eSBjb2RlIGxvb2tzIGxpa2UgdGhpcyBpbiB0aGUgbm90ZWJvb2sgYmVmb3JlIGl0IGlzIHB1Ymxpc2hlZDoNCg0KIVtdKGltZzA0LnBuZykNCg0KSXQgd2lsbCBhbHdheXMgYmVnaW4gd2l0aCB0aGV5IFxgXGBcYCBzeW1ib2wgZm9sbG93ZWQgYnkgdGhlIGB7cn1gIGFuZCBlbmRpbmcgd2l0aCB0aGUgXGBcYFxgLiBJbiB0aGlzIGxpZ2h0IGdyZXkgYm94LCB5b3UgY2FuIGNvZGUgYWZ0ZXIgdGhlIGB7cn1gIGFuZCBiZWZvcmUgdGhlIHNlY29uZCBcYFxgXGAgc3ltYm9sLiAgWW91IGNhbiBpbnNlcnQgYXMgbWFueSBjaHVua3Mgb2YgY29kZSBhcyB5b3Ugd291bGQgbGlrZSBhcyBpdCBpcyB1c2VyIHByZWZlcmVuY2UuIFR5cGljYWxseSwgaW4gYW4gUiBOb3RlYm9vaywgd2UgYXNwaXJlIHRvIGhhdmUgb25lIG91dHB1dCBwZXIgY2h1bmsgb2YgY29kZS4gSWYgdGhlcmUgd2lsbCBiZSBtb3JlIHRoYW4gb25lIG91dHB1dCwgaXQgaXMgYmVzdCB0byBzcGxpdCB0aGUgY29kZS4gDQoNCiMjIyBFeGVjdXRpbmcgQ29kZQ0KDQpJbiBvcmRlciB0byBydW4gdGhlIGNvZGUsIHlvdSBoYXZlIHNldmVyYWwgb3B0aW9ucy4NCg0KMS4gVXNlIEN0cmwgKyBTaGlmdCAqIEVudGVyIChPUyBYOiBDbWQgKyBTaGlmdCArIEVudGVyKSBvciB0aGUgUnVuIENodW5rIGNvbW1hbmQsICFbXShpbWcwNS5wbmcpLCB0byBydW4gdGhlIGN1cnJlbnQgY2h1bmsuDQoNCjIuIFByZXNzIEN0cmwgKyBFbnRlciAoT1MgWDogQ21kICsgRW50ZXIpIHRvIHJ1biBqdXN0IHRoZSBjdXJyZW50IHN0YXRlbWVudC4gUnVubmluZyBhIHNpbmdsZSBzdGF0ZW1lbnQgaXMgbXVjaCBsaWtlIHJ1bm5pbmcgYW4gZW50aXJlIGNodW5rIGNvbnNpc3Rpbmcgb25seSBvZiB0aGF0IHN0YXRlbWVudC4NCg0KMy4gVXNlIHRoZSBSdW4gQWxsIGFuZCBSdW4gQWxsIENodW5rcyBBYm92ZSBjb21tYW5kcyB0byBydW4gYWxsIGNodW5rcyBvciBhIGJhdGNoIG9mIGNodW5rcyBmb3VuZCBhYm92ZS4gDQoNCiFbXShpbWcwNi5wbmcpDQoNCiMjIyMgRXhhbXBsZSBFeGVjdXRpbmcgQ29kZQ0KDQpBZnRlciBkb3dubG9hZGluZyBhIGRhdGEgc2V0LCB3ZSBtdXN0IHJlYWQgdGhlIGRhdGEgaW4uIFNvLCBjcmVhdGUgYW4gUiBjb2RlIGNodW5rIGluIHRoZSBSIE5vdGVib29rIGFuZCB3cml0ZSB0aGUgY29kZSB0byByZWFkIGluIHRoZSBmaWxlLiBUbyBtYWtlIHN1cmUgdGhlIGZpbGUgaXMgcmVhZCBjb3JyZWN0bHksIHJ1biB0aGUgY2h1bmsuIFRoZSBjb2RlIHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXMuIA0KYGBge3J9DQpyZWFkLmNzdihmaWxlID0gImV4YW1wbGUgY3N2LmNzdiIpDQoNCmBgYA0KDQohW10oaW1nMDcucG5nKQ0KDQpUaGUgZ3JlZW4gdHJpYW5nbGUgd2l0aCB0aGUgcmVkIHNxdWFyZSBhcm91bmQgYnV0dG9uIGlzIHRoZSAncnVuJyBidXR0b24uIElmIHNlbGVjdGVkLCB0aGlzIGJ1dHRvbiBydW5zIHRoZSBjb2RlLiBJZiB3ZSBwdXNoIGl0LCB3ZSBzaG91bGQgb2J0YWluIHRoZSBmb2xsb3dpbmcgcmVzdWx0LiANCg0KIVtdKGltZzA4LnBuZykNCg0KVGhpcyBpcyB0aGUgb3V0cHV0LiBJZiB0aGUgb3V0cHV0IGlzIG5vdCB3aGF0IHlvdSB3YW50LCBvciBpZiB0aGVyZSBpcyBhbiBlcnJvciwgeW91IGNhbiBzaW1wbHkgZ28gYmFjayB0byB0aGUgY29kZSBjaHVuaywgZWRpdCB0aGUgY29kZSwgYW5kIHJlcnVuIGl0LiANCg0KIyMjIEVycm9ycw0KDQpXaGVuIGNvZGluZywgdGhlcmUgYXJlIG9mdGVuIHNtYWxsIGVycm9ycyB0aGF0IGFyZSBtYWRlLiBXaXRoIFIgTm90ZWJvb2tzLCB0aGUgbWVzc2FnZSB3aWxsIGRpc3BsYXkgZXhhY3RseSB3aGF0IGxpbmUgeW91ciBlcnJvciBpcyBvbiwgd2hpY2ggYWxsb3dzIHlvdSB0byBmaXggaXQuIA0KDQpJbiB0aGUgZXhhbXBsZSBiZWxvdywgd2Ugc2VlIHRoYXQgdGhlIGVycm9yIGlzIG1hZGUgYmVjYXVzZSB3ZSBmb3Jnb3QgdG8gc2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeS4gVGhpcyBpcyBhIHZlcnkgY29tbW9uIG1pc3Rha2UgYW5kIGFzIGEgcHJvZ3JhbW1lciwgd2Ugd2lsbCBsZWFybiB0byBpZGVudGlmeSB0aGVzZSBlcnJvcnMgcXVpY2tseS4gDQoNCiFbXShpbWcwOS5wbmcpDQoNCiMjIyBJbnNlcnRpbmcgQ29tbWVudHMNCg0KV2hlbiB3b3JraW5nIG9uIGEgbGFiLCBpdCBpcyBpbXBvcnRhbnQgdG8gbGVhdmUgY29tbWVudHMgd2l0aGluIHlvdXIgY29kZSB0byB1bmRlcnN0YW5kIHdoYXQgeW91IGFyZSBkb2luZyB3aGVuIHlvdSByZWZlciB0byBpdCBsYXRlci4gQSBjb21tZW50IGlzIG1hZGUgaW4gdGhlIGdyZXkgY29kZSBjaHVuayBib3ggYnkgcHV0dGluZyBhICJcIyIgc3ltYm9sIGluIGZyb250IG9mIHRleHQuIFRoaXMgaXMgd2hhdCBhIGNvbW1lbnQgd2lsbCBsb29rIGxpa2U6DQoNCiFbXShpbWcxMC5wbmcpDQpgYGB7cn0NCiMgVGhpcyBpcyBhIGNvbW1lbnQuDQpgYGANCg0KIyMjIEluc2VydGluZyBJbWFnZXMNCg0KVGhyb3VnaG91dCB0aGUgbGFiIHNlc3Npb25zLCB5b3Ugd2lsbCBiZSBhc2tlZCB0byB0YWtlIHNjcmVlbnNob3RzIG9mIHlvdXIgd29yayBhbmQgdXBsb2FkIHRoZW0gdG8gdGhlIGxhYiBiZWZvcmUgc3VibWl0dGluZyB5b3VyIHdvcmsuIEFkZGl0aW9uYWxseSwgaXQgbWF5IGJlIG5pY2UgdG8gYWRkIGltYWdlcyB0byB5b3VyIG5vdGVib29rIHRvIGVuaGFuY2UgeW91ciBjb2RlIG9yIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHByb2plY3QuIA0KDQpgYGB7cn0NCg0KYGBgDQoNClRvIGFkZCBhIHBpY3R1cmUsIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgYW5kIHByZXZpZXcgaXQNCg0KYGBgDQohW0NhcHRpb24gZm9yIHRoZSBwaWN0dXJlLl0oL3BhdGgvdG8vaW1hZ2UpDQoNCiFbSW1hZ2UgVGVzdF0oSmFrZS5wbmcpDQoNCmBgYHtyfQ0KIyAhW0ltYWdlIFRlc3RdKGpha2UucG5nKQ0KDQpgYGANCg0KQmVsb3cgaXMgYW4gZXhhbXBsZSBvZiBob3cgdGhpcyBpcyBkb25lLiBUaGUgYXNzdW1wdGlvbiBpbiB0aGlzIGNhc2UgaXMgdGhhdCB0aGUgaW1hZ2UgaXMgbG9jYXRlZCBpbiBzYW1lIGxvY2F0aW9uIG9yIGZvbGRlciBhcyB0aXMgZmlsZS4NCg0KIVtUaW50aW4gJiBNaWxvdV0oaW1nMTEucG5nKSANCg0KIyMjIFN1Ym1pdHRpbmcgWW91ciBXb3JrDQoNCkFmdGVyIGNvbXBsZXRpbmcgYW5kIGFuc3dlcmluZyBhbGwgcXVlc3Rpb25zIGluIHlvdXIgUiBOb3RlYm9vayBvciBSIE1hcmtkb3duIGZpbGUsIHJldmlldyB5b3VyIHdvcmsgdG8gbWFrZSBzdXJlIHlvdSBoYXZlIHNhZmVseSBleGVjdXRlZCBhbGwgdGhlIGNvZGUgY2h1bmtzIGluIHRoZSBub3RlYm9vaywgYW5kIHRoZXJlIGFyZSBubyBlcnJvcnMgb3IgbWlzc2VkIGNvZGUgY2h1bmtzIG5vdCBleGVjdXRlZC4gT3RoZXJ3aXNlIHJlc3VsdHMgd29uJ3QgYXBwZWFyIGluIHlvdXIgc3VibWl0dGVkIGZpbGUuIEF0IHRoZSB0b3AgbGVmdCwgdGhlcmUgaXMgYSBidXR0b24gdGhhdCBzYXlzICJQcmV2aWV3Ii4gWW91IHdhbnQgdG8gY2xpY2sgIHRoZSAiUHJldmlldyIgYnV0dG9uIG9yIHNlbGVjdCB0aGUgIlByZXZpZXcgTm90ZWJvb2siIGZyb20gdGhlIGRyb3Bkb3duLiANCk90aGVyIG9wdGlvbnMgaW4gdGhlIGRyb3Bkb3duIG1heSBvciBub3QgYXBwZWFyIGRlcGVuZGluZyBvbiB5b3VyIHBhcnRpY3VsYXIgaW5zdGFsbGF0aW9uIGFuZCBjb25maWd1cmF0aW9uLg0KDQoNCiFbXShpbWcxMi5wbmcpDQoNCjxicj4NCg0KSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSwgeW91IHdpbGwgcHJvYmFibHkgZ2V0IGEgcG9wLXVwIHdpbmRvdyBhc2tpbmcgeW91IHRvIGluc3RhbGwgdGhlIHJlcXVpcmVkIHBhY2thZ2VzLiBBbnN3ZXIgJ1llcycuDQoNCiFbXShpbWcxMy5wbmcpDQo8YnI+DQoNCk9uY2UgdGhlIHByZXZpZXcgZmlsZSBpcyByZW5kZXJlZCwgaXQgd2lsbCBjcmVhdGUgYSBjb3JyZXNwb25kaW5nIEhUTUwgZG9jdW1lbnQgd2l0aCBhIGZpbGUgbmFtZSB0aGF0IHJlYWRzIGxpa2UgDQokXGl0IGxhYjAxLm5iLmh0bWwkLiAgSW4gcHJldmlldyBtb2RlIG9ubHkgYW55IGhvbWV3b3JrIHF1ZXN0aW9uIGFuZCBhc3NvY2lhdGVkIGdyYWRlIHBvaW50cyB3aWxsIGJlIG1hcmtlZCBpbiByZWQuDQoNCiFbQmFsZCBFYWdsZV0odGVzdC5qcGcpDQoNCkFmdGVyIGNvbXBsZXRpbmcgYSBsYWIsIGFuZCBvbmNlIHNhdGlzZmllZCB3aXRoIGFsbCBleGVjdXRlZCBjb2RlIGNodW5rcyBhbmQgYW5zd2VycyB5b3Ugd2lsbCBuZWVkIHRvIHN1Ym1pdCB0aGUgSFRNTCBmaWxlICRcaXQgbGFiMDEubmIuaHRtbCQgaW4gU2FrYWkgZm9yIGV2YWx1YXRpb24uIEl0IGlzIGEgc2ltcGxlIHByb2Nlc3Mgb2YgdXBsb2FkaW5nIGEgZmlsZQ0KDQojIyMgT3ZlcmFsbCBJbXBhY3QNCg0KUiBOb3RlYm9va3MgYXJlIHBvd2VyZnVsLiBUaGV5IGFsbG93IHN0dWRlbnRzIHRvIGVkaXQgc2VjdGlvbnMgb2YgdGhlIGZpbGUgYW5kIHNlZSB0aGUgaW1tZWRpYXRlIGNoYW5nZXMgaW4gdGhlIG91dHB1dCB3aXRob3V0IGhhdmluZyB0byBydW4gdGhlIGVudGlyZSBjb2RlLiBQbGVhc2UgcmVmZXIgdG8gdGhpcyBndWlkZSBhbmQgb3RoZXIgc2hhcmVkIHJlZmVyZW5jZXMgZm9yIG1vcmUgZ3VpZGFuY2UuDQoNCnNvdXJjZTogW2h0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vcl9ub3RlYm9va3MuaHRtbF0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbS9yX25vdGVib29rcy5odG1sKQ0KDQoNCg0KDQoNCg==