<– Home

Setting up RStudio

Congratulations! You have downloaded R and RStudio.

This is an R Markdown Notebook (“.Rmd”). If you are reading this on the workshop website, you are looking at the HTML (website) version. Make sure you have the .Rmd file as well, which you can download by right-clicking here and saving as Setting_Up.Rmd. You can also click the “Code” dropdown menu in the upper right corner of this page and select “Download .Rmd”

The HTML (web) version can serve as an easy-to-read but static copy. You can only run the code if you open the .Rmd file using RStudio, since it is the code that built the static version.

When you execute code within the .Rmd notebook while you’re using RStudio, the results appear beneath the code. This will be handy for working through the material outside of class and when you work on your own code in the future.

File structure

Before we get started in RStudio, make sure you have a folder dedicated to the workshop.

Quick aside: Just so we’re all on the same page… computers are designed to act like old-school filing systems. They’re all structured like a filing cabinet where each drawer has folders, and inside those folders can be smaller folders, and your papers can be filed in any of these locations. On a computer, there are folders which can contain files or more folders, which can in turn can contain files or even more folders. To identify where a file is located in the computer’s structure, every file has a “file path”, which is a list of folders one would need to pass through to access the file.

You will be running something called an RStudio project (.Rproj), which will house all of the files and code we work with during the workshop. Here’s an example image of what your file structure should look like. I’ve called the folder “AdventuresInR”, and it contains three other folders: “data”, “scripts”, and “figures”.

Save the .Rmd file directly into AdventuresInR and open it in RStudio.

Preparing RStudio

If you are currently reading this in RStudio, try executing this chunk by clicking the Run button within the chunk (the green triangle in the top right corner of the grey cell below) or by placing your cursor inside it and pressing Cmd+Shift+Enter (Mac) or Ctrl+Shift+Enter (Windows). If you are currently reading this using a web browser, you can hide or show the code that produces various outputs by clicking the Hide/Code button on the top right of the code “cell”, but you cannot execute the code. It may help to have this notebook open in RStudio and a browser window at the same time, so you can navigate between them.

Execute this code now, then save this file (Cmd+s on Mac, CTRL+s on Windows). Once you have done that, a graph will appear below in RStudio.

plot(cars)

This graph was generated using some data that comes pre-loaded with the basic R software. However, to use R you will need to:

  1. install
  2. load, and
  3. run

packages that do not automatically come with the basic R software. These packages contain important additions to the basic software that allow you to perform sophisticated analyses and produce clear, beautiful visualisations, among many other things. Some packages can take a while to install, depending on the speed of your internet connection. Therefore, you must install these packages before the first day of the workshop. Please contact one of us well in advance of the workshop if you encounter any problems with installation.

1. Installing

Installing a package only needs to be done once (per computer). This is because installation is equivalent of downloading a file from the internet and storing it on your hard drive (e.g., Local Disk or C: drive on Windows or /Downloads/ folder on Mac). Once a package has been downloaded, it exists on your computer and does not need to be re-downloaded later.

First, make sure you are connected to the internet. Install the following packages now, by executing the code below as you did in the previous cell.

install.packages("tidyverse")
install.packages("knitr")
install.packages("cowplot")
install.packages("ordinal")
install.packages("broom")
install.packages("emmeans")
install.packages("Hmisc")
install.packages("corrplot")

If you get an error or if nothing seems to be happening, you may need to respond to the program like below (type yes and hit Enter).

Would you like to use a personal library instead? (yes/No/cancel) yes

While this code is running, a red square (the ‘stop’ symbol) will appear in the upper right corner of the code cell. When it has finished running, the green triangle (the ‘run’ symbol) will reappear. Wait for the code to finish before moving on. This may take a while. Make sure to give yourself plenty of time to run this code, and if you have any trouble, contact one of the workshop organisers.

2. Loading

Loading a package is an entirely different action from installing a package. By telling R to load a package, you are instructing it to look for the file you downloaded during installation and sort of “wake it up” while you have R open. When you close R, the package will go back to sleep and you’ll have to reload it again. (You will not have to download and install it again, although you may need to download updates periodically.)

Let’s load the packaged called ggplot2 right now by executing the following code.

library(ggplot2)

If this code was successful, it will appear as though nothing happened. To show you what an error looks like, run the following code.

library(Ggplot2)

Hopefully, this code produced text that reads:

Error in library(Ggplot2) : there is no package called ‘Ggplot2’

Uh oh! Looks like capitalisation is important in R. That will be something to remember for later.

3. Running

By this point, you have installed and loaded the three packages you will need for the first day of the workshop. Before you’re done setting up RStudio, though, you should make sure that the packages are running properly. Let’s produce that first graph again, but this time using code only available when ‘ggplot2’ is installed and loaded.

ggplot(cars, aes(x=speed, y=dist)) + geom_point(size=3, shape=1) + theme_bw()

If everything has gone to plan, you should now see a second graph that looks very much like the first graph. Don’t worry about how we made it yet! That will be something we explain during the workshop. Right now, we just want to make sure that you are ready to hit the ground running on the first day.

If you run into any trouble before the workshop, please email one of the instructors in advance. We can help you troubleshoot and get your tools working before the workshop. During the workshop, we will have limited ability to help, which could slow you down or interfere with the workshop.

To be safe, you may also want to create an account at Posit Cloud: https://posit.co/products/cloud/cloud/

If you do this in advance, and something goes wrong on the day of the workshop, you will not need to lose any time with troubleshooting!

See you soon!

LS0tCnRpdGxlOiAiQWR2ZW50dXJlcyBpbiBSOiBQcmUtd29ya3Nob3AgcHJlcGFyYXRpb24iCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCi0tLQpbPC0tIEhvbWVdKGh0dHBzOi8vdmVyYmluZ25vdW5zLmdpdGh1Yi5pby9BZHZlbnR1cmVzSW5SLykKCiMgU2V0dGluZyB1cCBSU3R1ZGlvCgpDb25ncmF0dWxhdGlvbnMhIFlvdSBoYXZlIGRvd25sb2FkZWQgW1JdKGh0dHBzOi8vd3d3LnN0YXRzLmJyaXMuYWMudWsvUi8pIGFuZCBbUlN0dWRpb10oaHR0cHM6Ly9wb3NpdC5jby9kb3dubG9hZC9yc3R1ZGlvLWRlc2t0b3AvI2Rvd25sb2FkKS4KClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rICgiLlJtZCIpLiBJZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyBvbiB0aGUgd29ya3Nob3Agd2Vic2l0ZSwgeW91IGFyZSBsb29raW5nIGF0IHRoZSBIVE1MICh3ZWJzaXRlKSB2ZXJzaW9uLiBNYWtlIHN1cmUgeW91IGhhdmUgdGhlIGAuUm1kYCBmaWxlIGFzIHdlbGwsIHdoaWNoIHlvdSBjYW4gZG93bmxvYWQgYnkgcmlnaHQtY2xpY2tpbmcgW2hlcmVdKFNldHRpbmdfVXAuUm1kKSBhbmQgc2F2aW5nIGFzIGBTZXR0aW5nX1VwLlJtZGAuIFlvdSBjYW4gYWxzbyBjbGljayB0aGUgIkNvZGUiIGRyb3Bkb3duIG1lbnUgaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lciBvZiB0aGlzIHBhZ2UgYW5kIHNlbGVjdCAiRG93bmxvYWQgLlJtZCIKClRoZSBIVE1MICh3ZWIpIHZlcnNpb24gY2FuIHNlcnZlIGFzIGFuIGVhc3ktdG8tcmVhZCBidXQgc3RhdGljIGNvcHkuIFlvdSBjYW4gb25seSBydW4gdGhlIGNvZGUgaWYgeW91IG9wZW4gdGhlIGAuUm1kYCBmaWxlIHVzaW5nIFJTdHVkaW8sIHNpbmNlIGl0IGlzIHRoZSBjb2RlIHRoYXQgYnVpbHQgdGhlIHN0YXRpYyB2ZXJzaW9uLgoKV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgLlJtZCBub3RlYm9vayB3aGlsZSB5b3UncmUgdXNpbmcgUlN0dWRpbywgdGhlIHJlc3VsdHMgYXBwZWFyIGJlbmVhdGggdGhlIGNvZGUuIFRoaXMgd2lsbCBiZSBoYW5keSBmb3Igd29ya2luZyB0aHJvdWdoIHRoZSBtYXRlcmlhbCBvdXRzaWRlIG9mIGNsYXNzIGFuZCB3aGVuIHlvdSB3b3JrIG9uIHlvdXIgb3duIGNvZGUgaW4gdGhlIGZ1dHVyZS4KCiMjIEZpbGUgc3RydWN0dXJlCgpCZWZvcmUgd2UgZ2V0IHN0YXJ0ZWQgaW4gUlN0dWRpbywgbWFrZSBzdXJlIHlvdSBoYXZlIGEgZm9sZGVyIGRlZGljYXRlZCB0byB0aGUgd29ya3Nob3AuIAoKCioqUXVpY2sgYXNpZGU6KiogKkp1c3Qgc28gd2UncmUgYWxsIG9uIHRoZSBzYW1lIHBhZ2UuLi4gY29tcHV0ZXJzIGFyZSBkZXNpZ25lZCB0byBhY3QgbGlrZSBvbGQtc2Nob29sIGZpbGluZyBzeXN0ZW1zLiBUaGV5J3JlIGFsbCBzdHJ1Y3R1cmVkIGxpa2UgYSBmaWxpbmcgY2FiaW5ldCB3aGVyZSBlYWNoIGRyYXdlciBoYXMgZm9sZGVycywgYW5kIGluc2lkZSB0aG9zZSBmb2xkZXJzIGNhbiBiZSBzbWFsbGVyIGZvbGRlcnMsIGFuZCB5b3VyIHBhcGVycyBjYW4gYmUgZmlsZWQgaW4gYW55IG9mIHRoZXNlIGxvY2F0aW9ucy4gT24gYSBjb21wdXRlciwgdGhlcmUgYXJlIGZvbGRlcnMgd2hpY2ggY2FuIGNvbnRhaW4gZmlsZXMgb3IgbW9yZSBmb2xkZXJzLCB3aGljaCBjYW4gaW4gdHVybiBjYW4gY29udGFpbiBmaWxlcyBvciBldmVuIG1vcmUgZm9sZGVycy4gVG8gaWRlbnRpZnkgd2hlcmUgYSBmaWxlIGlzIGxvY2F0ZWQgaW4gdGhlIGNvbXB1dGVyJ3Mgc3RydWN0dXJlLCBldmVyeSBmaWxlIGhhcyBhICJmaWxlIHBhdGgiLCB3aGljaCBpcyBhIGxpc3Qgb2YgZm9sZGVycyBvbmUgd291bGQgbmVlZCB0byBwYXNzIHRocm91Z2ggdG8gYWNjZXNzIHRoZSBmaWxlLioKCgpZb3Ugd2lsbCBiZSBydW5uaW5nIHNvbWV0aGluZyBjYWxsZWQgYW4gUlN0dWRpbyAqKnByb2plY3QqKiAoYC5ScHJvamApLCB3aGljaCB3aWxsIGhvdXNlIGFsbCBvZiB0aGUgZmlsZXMgYW5kIGNvZGUgd2Ugd29yayB3aXRoIGR1cmluZyB0aGUgd29ya3Nob3AuIEhlcmUncyBhbiBleGFtcGxlIGltYWdlIG9mIHdoYXQgeW91ciBmaWxlIHN0cnVjdHVyZSBzaG91bGQgbG9vayBsaWtlLiBJJ3ZlIGNhbGxlZCB0aGUgZm9sZGVyICJBZHZlbnR1cmVzSW5SIiwgYW5kIGl0IGNvbnRhaW5zIHRocmVlIG90aGVyIGZvbGRlcnM6ICJkYXRhIiwgInNjcmlwdHMiLCBhbmQgImZpZ3VyZXMiLgoKIVtdKGltYWdlcy93aW5kb3dzLWZpbGVzLnBuZykKCiFbXShpbWFnZXMvbWFjLWZpbGVzLnBuZykKClNhdmUgdGhlIGAuUm1kYCBmaWxlIGRpcmVjdGx5IGludG8gYEFkdmVudHVyZXNJblJgIGFuZCBvcGVuIGl0IGluIFJTdHVkaW8uCgojIFByZXBhcmluZyBSU3R1ZGlvCgpJZiB5b3UgYXJlIGN1cnJlbnRseSByZWFkaW5nIHRoaXMgaW4gKipSU3R1ZGlvKiosIHRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgKHRoZSBncmVlbiB0cmlhbmdsZSBpbiB0aGUgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUgZ3JleSBjZWxsIGJlbG93KSBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgYENtZCtTaGlmdCtFbnRlcmAgKE1hYykgb3IgYEN0cmwrU2hpZnQrRW50ZXJgIChXaW5kb3dzKS4gSWYgeW91IGFyZSBjdXJyZW50bHkgcmVhZGluZyB0aGlzIHVzaW5nIGEgKip3ZWIgYnJvd3NlcioqLCB5b3UgY2FuIGhpZGUgb3Igc2hvdyB0aGUgY29kZSB0aGF0IHByb2R1Y2VzIHZhcmlvdXMgb3V0cHV0cyBieSBjbGlja2luZyB0aGUgKkhpZGUqLypDb2RlKiBidXR0b24gb24gdGhlIHRvcCByaWdodCBvZiB0aGUgY29kZSAiY2VsbCIsIGJ1dCB5b3UgY2Fubm90IGV4ZWN1dGUgdGhlIGNvZGUuIEl0IG1heSBoZWxwIHRvIGhhdmUgdGhpcyBub3RlYm9vayBvcGVuIGluIFJTdHVkaW8gYW5kIGEgYnJvd3NlciB3aW5kb3cgYXQgdGhlIHNhbWUgdGltZSwgc28geW91IGNhbiBuYXZpZ2F0ZSBiZXR3ZWVuIHRoZW0uCgpFeGVjdXRlIHRoaXMgY29kZSBub3csIHRoZW4gc2F2ZSB0aGlzIGZpbGUgKGBDbWQrc2Agb24gTWFjLCBgQ1RSTCtzYCBvbiBXaW5kb3dzKS4gT25jZSB5b3UgaGF2ZSBkb25lIHRoYXQsIGEgZ3JhcGggd2lsbCBhcHBlYXIgYmVsb3cgaW4gUlN0dWRpby4KCmBgYHtyLCBldmFsPVRSVUV9CnBsb3QoY2FycykKYGBgCgpUaGlzIGdyYXBoIHdhcyBnZW5lcmF0ZWQgdXNpbmcgc29tZSBkYXRhIHRoYXQgY29tZXMgcHJlLWxvYWRlZCB3aXRoIHRoZSBiYXNpYyBSIHNvZnR3YXJlLiBIb3dldmVyLCB0byB1c2UgUiB5b3Ugd2lsbCBuZWVkIHRvOgoKMS4gKippbnN0YWxsKioKMi4gKipsb2FkKiosIGFuZAozLiAqKnJ1bioqCgpwYWNrYWdlcyB0aGF0IGRvIG5vdCBhdXRvbWF0aWNhbGx5IGNvbWUgd2l0aCB0aGUgYmFzaWMgUiBzb2Z0d2FyZS4gVGhlc2UgcGFja2FnZXMgY29udGFpbiBpbXBvcnRhbnQgYWRkaXRpb25zIHRvIHRoZSBiYXNpYyBzb2Z0d2FyZSB0aGF0IGFsbG93IHlvdSB0byBwZXJmb3JtIHNvcGhpc3RpY2F0ZWQgYW5hbHlzZXMgYW5kIHByb2R1Y2UgY2xlYXIsIGJlYXV0aWZ1bCB2aXN1YWxpc2F0aW9ucywgYW1vbmcgbWFueSBvdGhlciB0aGluZ3MuIFNvbWUgcGFja2FnZXMgY2FuIHRha2UgYSB3aGlsZSB0byBpbnN0YWxsLCBkZXBlbmRpbmcgb24gdGhlIHNwZWVkIG9mIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvbi4gVGhlcmVmb3JlLCB5b3UgbXVzdCBpbnN0YWxsIHRoZXNlIHBhY2thZ2VzIGJlZm9yZSB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3b3Jrc2hvcC4gUGxlYXNlIGNvbnRhY3Qgb25lIG9mIHVzIHdlbGwgaW4gYWR2YW5jZSBvZiB0aGUgd29ya3Nob3AgaWYgeW91IGVuY291bnRlciBhbnkgcHJvYmxlbXMgd2l0aCBpbnN0YWxsYXRpb24uCgojIyAxLiBJbnN0YWxsaW5nCgoqKkluc3RhbGxpbmcqKiBhIHBhY2thZ2Ugb25seSBuZWVkcyB0byBiZSBkb25lIG9uY2UgKHBlciBjb21wdXRlcikuIFRoaXMgaXMgYmVjYXVzZSBpbnN0YWxsYXRpb24gaXMgZXF1aXZhbGVudCBvZiBkb3dubG9hZGluZyBhIGZpbGUgZnJvbSB0aGUgaW50ZXJuZXQgYW5kIHN0b3JpbmcgaXQgb24geW91ciBoYXJkIGRyaXZlIChlLmcuLCBMb2NhbCBEaXNrIG9yIEM6IGRyaXZlIG9uIFdpbmRvd3Mgb3IgL0Rvd25sb2Fkcy8gZm9sZGVyIG9uIE1hYykuIE9uY2UgYSBwYWNrYWdlIGhhcyBiZWVuIGRvd25sb2FkZWQsIGl0IGV4aXN0cyBvbiB5b3VyIGNvbXB1dGVyIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlLWRvd25sb2FkZWQgbGF0ZXIuCgpGaXJzdCwgbWFrZSBzdXJlIHlvdSBhcmUgY29ubmVjdGVkIHRvIHRoZSBpbnRlcm5ldC4gSW5zdGFsbCB0aGUgZm9sbG93aW5nIHBhY2thZ2VzIG5vdywgYnkgZXhlY3V0aW5nIHRoZSBjb2RlIGJlbG93IGFzIHlvdSBkaWQgaW4gdGhlIHByZXZpb3VzIGNlbGwuCgpgYGB7ciwgZXZhbD1GQUxTRX0KaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikKaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQppbnN0YWxsLnBhY2thZ2VzKCJjb3dwbG90IikKaW5zdGFsbC5wYWNrYWdlcygib3JkaW5hbCIpCmluc3RhbGwucGFja2FnZXMoImJyb29tIikKaW5zdGFsbC5wYWNrYWdlcygiZW1tZWFucyIpCmluc3RhbGwucGFja2FnZXMoIkhtaXNjIikKaW5zdGFsbC5wYWNrYWdlcygiY29ycnBsb3QiKQpgYGAKCklmIHlvdSBnZXQgYW4gZXJyb3Igb3IgaWYgbm90aGluZyBzZWVtcyB0byBiZSBoYXBwZW5pbmcsIHlvdSBtYXkgbmVlZCB0byByZXNwb25kIHRvIHRoZSBwcm9ncmFtIGxpa2UgYmVsb3cgKHR5cGUgYHllc2AgYW5kIGhpdCBgRW50ZXJgKS4KYGBgCldvdWxkIHlvdSBsaWtlIHRvIHVzZSBhIHBlcnNvbmFsIGxpYnJhcnkgaW5zdGVhZD8gKHllcy9Oby9jYW5jZWwpIHllcwoKYGBgCgpXaGlsZSB0aGlzIGNvZGUgaXMgcnVubmluZywgYSByZWQgc3F1YXJlICh0aGUgJ3N0b3AnIHN5bWJvbCkgd2lsbCBhcHBlYXIgaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lciBvZiB0aGUgY29kZSBjZWxsLiBXaGVuIGl0IGhhcyBmaW5pc2hlZCBydW5uaW5nLCB0aGUgZ3JlZW4gdHJpYW5nbGUgKHRoZSAncnVuJyBzeW1ib2wpIHdpbGwgcmVhcHBlYXIuIFdhaXQgZm9yIHRoZSBjb2RlIHRvIGZpbmlzaCBiZWZvcmUgbW92aW5nIG9uLiBUaGlzIG1heSB0YWtlIGEgd2hpbGUuIE1ha2Ugc3VyZSB0byBnaXZlIHlvdXJzZWxmIHBsZW50eSBvZiB0aW1lIHRvIHJ1biB0aGlzIGNvZGUsIGFuZCBpZiB5b3UgaGF2ZSBhbnkgdHJvdWJsZSwgY29udGFjdCBvbmUgb2YgdGhlIHdvcmtzaG9wIG9yZ2FuaXNlcnMuCgojIyAyLiBMb2FkaW5nCgpMb2FkaW5nIGEgcGFja2FnZSBpcyBhbiBlbnRpcmVseSBkaWZmZXJlbnQgYWN0aW9uIGZyb20gaW5zdGFsbGluZyBhIHBhY2thZ2UuIEJ5IHRlbGxpbmcgUiB0byBsb2FkIGEgcGFja2FnZSwgeW91IGFyZSBpbnN0cnVjdGluZyBpdCB0byBsb29rIGZvciB0aGUgZmlsZSB5b3UgZG93bmxvYWRlZCBkdXJpbmcgaW5zdGFsbGF0aW9uIGFuZCBzb3J0IG9mICJ3YWtlIGl0IHVwIiB3aGlsZSB5b3UgaGF2ZSBSIG9wZW4uIFdoZW4geW91IGNsb3NlIFIsIHRoZSBwYWNrYWdlIHdpbGwgZ28gYmFjayB0byBzbGVlcCBhbmQgeW91J2xsIGhhdmUgdG8gcmVsb2FkIGl0IGFnYWluLiAoWW91IHdpbGwgbm90IGhhdmUgdG8gZG93bmxvYWQgYW5kIGluc3RhbGwgaXQgYWdhaW4sIGFsdGhvdWdoIHlvdSBtYXkgbmVlZCB0byBkb3dubG9hZCB1cGRhdGVzIHBlcmlvZGljYWxseS4pCgpMZXQncyBsb2FkIHRoZSBwYWNrYWdlZCBjYWxsZWQgKmdncGxvdDIqIHJpZ2h0IG5vdyBieSBleGVjdXRpbmcgdGhlIGZvbGxvd2luZyBjb2RlLgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKYGBgCgpJZiB0aGlzIGNvZGUgd2FzIHN1Y2Nlc3NmdWwsIGl0IHdpbGwgYXBwZWFyIGFzIHRob3VnaCBub3RoaW5nIGhhcHBlbmVkLiBUbyBzaG93IHlvdSB3aGF0ICoqYW4gZXJyb3IqKiBsb29rcyBsaWtlLCBydW4gdGhlIGZvbGxvd2luZyBjb2RlLgoKYGBge3IsIGV2YWw9RkFMU0V9CmxpYnJhcnkoR2dwbG90MikKYGBgCgpIb3BlZnVsbHksIHRoaXMgY29kZSBwcm9kdWNlZCB0ZXh0IHRoYXQgcmVhZHM6CgogICAgRXJyb3IgaW4gbGlicmFyeShHZ3Bsb3QyKSA6IHRoZXJlIGlzIG5vIHBhY2thZ2UgY2FsbGVkIOKAmEdncGxvdDLigJkKICAgIApVaCBvaCEgTG9va3MgbGlrZSAqY2FwaXRhbGlzYXRpb24qIGlzIGltcG9ydGFudCBpbiBSLiBUaGF0IHdpbGwgYmUgc29tZXRoaW5nIHRvIHJlbWVtYmVyIGZvciBsYXRlci4KCiMjIDMuIFJ1bm5pbmcKCkJ5IHRoaXMgcG9pbnQsIHlvdSBoYXZlICoqaW5zdGFsbGVkKiogYW5kICoqbG9hZGVkKiogdGhlIHRocmVlIHBhY2thZ2VzIHlvdSB3aWxsIG5lZWQgZm9yIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdvcmtzaG9wLiBCZWZvcmUgeW91J3JlIGRvbmUgc2V0dGluZyB1cCBSU3R1ZGlvLCB0aG91Z2gsIHlvdSBzaG91bGQgbWFrZSBzdXJlIHRoYXQgdGhlIHBhY2thZ2VzIGFyZSAqKnJ1bm5pbmcqKiBwcm9wZXJseS4gTGV0J3MgcHJvZHVjZSB0aGF0IGZpcnN0IGdyYXBoIGFnYWluLCBidXQgdGhpcyB0aW1lIHVzaW5nIGNvZGUgb25seSBhdmFpbGFibGUgd2hlbiAnZ2dwbG90MicgaXMgaW5zdGFsbGVkIGFuZCBsb2FkZWQuCgpgYGB7ciwgZXZhbD1UUlVFfQpnZ3Bsb3QoY2FycywgYWVzKHg9c3BlZWQsIHk9ZGlzdCkpICsgZ2VvbV9wb2ludChzaXplPTMsIHNoYXBlPTEpICsgdGhlbWVfYncoKQpgYGAKCklmIGV2ZXJ5dGhpbmcgaGFzIGdvbmUgdG8gcGxhbiwgeW91IHNob3VsZCBub3cgc2VlIGEgc2Vjb25kIGdyYXBoIHRoYXQgbG9va3MgdmVyeSBtdWNoIGxpa2UgdGhlIGZpcnN0IGdyYXBoLiBEb24ndCB3b3JyeSBhYm91dCBob3cgd2UgbWFkZSBpdCB5ZXQhIFRoYXQgd2lsbCBiZSBzb21ldGhpbmcgd2UgZXhwbGFpbiBkdXJpbmcgdGhlIHdvcmtzaG9wLiBSaWdodCBub3csIHdlIGp1c3Qgd2FudCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgYXJlIHJlYWR5IHRvIGhpdCB0aGUgZ3JvdW5kIHJ1bm5pbmcgb24gdGhlIGZpcnN0IGRheS4KCklmIHlvdSBydW4gaW50byBhbnkgdHJvdWJsZSBiZWZvcmUgdGhlIHdvcmtzaG9wLCAqcGxlYXNlKiBlbWFpbCBvbmUgb2YgdGhlIGluc3RydWN0b3JzIGluIGFkdmFuY2UuIFdlIGNhbiBoZWxwIHlvdSB0cm91Ymxlc2hvb3QgYW5kIGdldCB5b3VyIHRvb2xzIHdvcmtpbmcgYmVmb3JlIHRoZSB3b3Jrc2hvcC4gRHVyaW5nIHRoZSB3b3Jrc2hvcCwgd2Ugd2lsbCBoYXZlIGxpbWl0ZWQgYWJpbGl0eSB0byBoZWxwLCB3aGljaCBjb3VsZCBzbG93IHlvdSBkb3duIG9yIGludGVyZmVyZSB3aXRoIHRoZSB3b3Jrc2hvcC4KClRvIGJlIHNhZmUsIHlvdSBtYXkgYWxzbyB3YW50IHRvIGNyZWF0ZSBhbiBhY2NvdW50IGF0IFBvc2l0IENsb3VkOiBbaHR0cHM6Ly9wb3NpdC5jby9wcm9kdWN0cy9jbG91ZC9jbG91ZC9dKGh0dHBzOi8vcG9zaXQuY28vcHJvZHVjdHMvY2xvdWQvY2xvdWQvKQoKSWYgeW91IGRvIHRoaXMgaW4gYWR2YW5jZSwgYW5kIHNvbWV0aGluZyBnb2VzIHdyb25nIG9uIHRoZSBkYXkgb2YgdGhlIHdvcmtzaG9wLCB5b3Ugd2lsbCBub3QgbmVlZCB0byBsb3NlIGFueSB0aW1lIHdpdGggdHJvdWJsZXNob290aW5nIQoKPiAqKlNlZSB5b3Ugc29vbiEqKg==