In this module, we will:

Great Lakes - Sneak Peek

So far, we’ve briefly described Great Lakes as a general-purpose High-Performance Compute (HPC) cluster.

In this module we’ll start to get a feel for what it’s like to use an HPC cluster. It’s not intended to be a deep dive, but rather to use some of the quickest ways to get started in order to start getting some experience with this system.

Using an HPC Cluster - Must Request Resources

When using an HPC cluster, there is a pattern that is quite different from our typical interactions with a computer system - we must ask for resources before we are able to use them. This is a characteristic of a shared, large, multi-user system like Great Lakes. Within the entirety of the system, we have an enormous amount of computing power, but at the same time, we need to allow equal access to this resource to the whole university. Therefore, we use this pattern of requesting resources and receiving them before we begin our computing tasks.

Several ways to access Great Lakes

  • For compute access:
    • Secure Shell (ssh)
    • Web-based shell
    • OpenOnDemand interactive apps (e.g. RStudio, Basic Desktop)
  • For file access:
    • Web-based file browser
    • Globus
    • Direct (it’s directly connected to Great Lakes)
    • Remote mount (it can be network-connected to your workstation)
    • scp, rsync, etc.

Using the web-based access methods

The web-based tools that provide access to Great Lakes and other ARC resources are a quick and easy way to get started. We’ll use these in our upcoming exercises to make our first foray into using the Great Lakes HPC. Additionally, the ‘Interactive Apps’ with ARC’s Open On Demand service offer a unique solution for when we need to run graphical applications. We’ll preview this and give some practical tips for using the RStudio and the Basic Desktop apps.


Sneak preview of the web-based file browser


Sneak preview of the web-based shell


Sneak preview of a web-based RStudio session


Sneak preview of a web-based Basic Desktop session


Quick Review or Crash Course on the Nano Editor

Before we dive into some of the exercises in this module, we should do a quick review or crash course on the nano text editor, which is a command-line-based text editor. In some of the upcoming exercises, we will be connected to Great Lakes via the web-based shell, which means that we will be limited to using command-line tools. During that time, we’ll use nano to edit READMEs and script files. Nano, along with other command-line-based text editor tools, use the keyboard as the main way of interfacing with the software. This means we will use various keystrokes to carry out tasks like saving the file and exiting the tool, which may take some practice to get comfortable with. Thankfully, nano is relatively intuitive and easy to use, which is one reason why we’ve chosen to use it for this workshop.

The basic layout of the nano editor is shown below. A helpful list of common tasks and their keyboard shortcuts is found at the bottom. The title bar and the status bar provide some additional context about the file we’re interacting with and feedback messages from nano, respectively.


Exercise - View Transferred Files

Following along with the instructor, we’ll use the web-based file browser to confirm that we’ve transferred the data files to our turbo space

Exercise - Connect with the Web-Based Shell

Following along with the instructor, we’ll use the web-based shell to connect to Great Lakes. Once there, we’ll run an introductory script, and take another look at our transferred files.

Exercise - Launch an RStudio Instance on OpenOnDemand

Following along with the instructor, we’ll use OpenOnDemand to launch an RStudio instance. Once there, we’ll run a basic R script as a quick demonstration of these capabilities.

Exercise - Launch a Basic Desktop Instance and Verify File Integrity

Following along with the instructor, we’ll use OpenOnDemand to launch a Basic Desktop instance. Once there, we’ll open a terminal and use the md5sum utility to verify file integrity of the data that we recently transferred to our Turbo location.

Note: Using an OpenOnDemand Basic Desktop instance in order to run a command line application can be a bit of an odd pattern. We do this here primarily as a means for requesting and receiving the proper computational resources for this task. In the next module, we’ll learn about some other patterns for requesting resources and running command-line utilities which may be better choices going forward.

Exercise - Write a README File

Following along with the instructor, we will use the nano utility to write the beginnings of a README for our project as it exists so far.

Write a README - Solution

source /nfs/turbo/umms-bioinf-wkshp/workshop/home/${USER}/source_me_for_shortcut.txt

cd ${WORKSHOP_HOME}/project_analysis

nano README.txt

Exercise - Organize your project

Following along with the instructor, we’ll organize the files that are in our $WORKSHOP_HOME directory.

Organize Your Project - Solution

cd ${WORKSHOP_HOME}/project_analysis

mv 0042-WS input_bams

mkdir logs

mkdir scripts


Review


LS0tCnRpdGxlOiAiU25lYWsgcGVlazogR3JlYXQgTGFrZXMiCmF1dGhvcjogIlVNIEJpb2luZm9ybWF0aWNzIENvcmUiCm91dHB1dDoKICAgICAgICBodG1sX2RvY3VtZW50OgogICAgICAgICAgICBpbmNsdWRlczoKICAgICAgICAgICAgICAgIGluX2hlYWRlcjogaGVhZGVyLmh0bWwKICAgICAgICAgICAgdGhlbWU6IHBhcGVyCiAgICAgICAgICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UKICAgICAgICAgICAgZmlnX2NhcHRpb246IHRydWUKICAgICAgICAgICAgbWFya2Rvd246IEdGTQogICAgICAgICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5eyAvKiBOb3JtYWwgICovCiAgICAgIGZvbnQtc2l6ZTogMTRwdDsKICB9CnByZSB7CiAgZm9udC1zaXplOiAxMnB0Cn0KPC9zdHlsZT4KCkluIHRoaXMgbW9kdWxlLCB3ZSB3aWxsOgoKKiB0YWtlIGFuIGludHJvZHVjdG9yeSBsb29rIGF0IHRoZSBHcmVhdCBMYWtlcyBIUEMgY2x1c3RlcgoqIGRpc2N1c3MgdGhlIG5lZWQgZm9yIHJlcXVlc3RpbmcgY29tcHV0ZSByZXNvdXJjZXMKKiBsZWFybiBhYm91dCBzZXZlcmFsIHdheXMgdG8gYWNjZXNzIEdyZWF0IExha2VzCiogdXNlIHRoZSB3ZWItYmFzZWQgZmlsZSBicm93c2VyIGZvciBHcmVhdCBMYWtlcwoqIGludHJvZHVjZSBvciByZXZpZXcgdGhlIG5hbm8gdGV4dCBlZGl0b3IKKiB1c2UgdGhlIE9wZW5PbkRlbWFuZCBzZXJ2aWNlIHRvIGxhdW5jaCBhIHdlYi1iYXNlZCBpbnRlcmFjdGl2ZSBqb2IKCiMjIEdyZWF0IExha2VzIC0gU25lYWsgUGVlawoKU28gZmFyLCB3ZSd2ZSBicmllZmx5IGRlc2NyaWJlZCBHcmVhdCBMYWtlcyBhcyBhIGdlbmVyYWwtcHVycG9zZSBIaWdoLVBlcmZvcm1hbmNlIENvbXB1dGUgKEhQQykgY2x1c3Rlci4gCgpJbiB0aGlzIG1vZHVsZSB3ZSdsbCBzdGFydCB0byBnZXQgYSBmZWVsIGZvciB3aGF0IGl0J3MgbGlrZSB0byB1c2UgYW4gSFBDIGNsdXN0ZXIuIEl0J3Mgbm90IGludGVuZGVkIHRvIGJlIGEgZGVlcCBkaXZlLCBidXQgcmF0aGVyIHRvIHVzZSBzb21lIG9mIHRoZSBxdWlja2VzdCB3YXlzIHRvIGdldCBzdGFydGVkIGluIG9yZGVyIHRvIHN0YXJ0IGdldHRpbmcgc29tZSBleHBlcmllbmNlIHdpdGggdGhpcyBzeXN0ZW0uCgojIyMgVXNpbmcgYW4gSFBDIENsdXN0ZXIgLSBNdXN0IFJlcXVlc3QgUmVzb3VyY2VzCgohW10oaW1hZ2VzL01vZHVsZTAzYV9hc2tfZm9yX3Jlc291cmNlcy5wbmcpCgpXaGVuIHVzaW5nIGFuIEhQQyBjbHVzdGVyLCB0aGVyZSBpcyBhIHBhdHRlcm4gdGhhdCBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSBvdXIgdHlwaWNhbCBpbnRlcmFjdGlvbnMgd2l0aCBhIGNvbXB1dGVyIHN5c3RlbSAtIHdlIG11c3QgYXNrIGZvciByZXNvdXJjZXMgYmVmb3JlIHdlIGFyZSBhYmxlIHRvIHVzZSB0aGVtLiBUaGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMgb2YgYSBzaGFyZWQsIGxhcmdlLCBtdWx0aS11c2VyIHN5c3RlbSBsaWtlIEdyZWF0IExha2VzLiBXaXRoaW4gdGhlIGVudGlyZXR5IG9mIHRoZSBzeXN0ZW0sIHdlIGhhdmUgYW4gZW5vcm1vdXMgYW1vdW50IG9mIGNvbXB1dGluZyBwb3dlciwgYnV0IGF0IHRoZSBzYW1lIHRpbWUsIHdlIG5lZWQgdG8gYWxsb3cgZXF1YWwgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UgdG8gdGhlIHdob2xlIHVuaXZlcnNpdHkuIFRoZXJlZm9yZSwgd2UgdXNlIHRoaXMgcGF0dGVybiBvZiByZXF1ZXN0aW5nIHJlc291cmNlcyBhbmQgcmVjZWl2aW5nIHRoZW0gYmVmb3JlIHdlIGJlZ2luIG91ciBjb21wdXRpbmcgdGFza3MuCgojIyMgU2V2ZXJhbCB3YXlzIHRvIGFjY2VzcyBHcmVhdCBMYWtlcwoKLSBGb3IgY29tcHV0ZSBhY2Nlc3M6CiAgICAtIFNlY3VyZSBTaGVsbCAoc3NoKQogICAgLSBXZWItYmFzZWQgc2hlbGwKICAgIC0gT3Blbk9uRGVtYW5kIGludGVyYWN0aXZlIGFwcHMgKGUuZy4gUlN0dWRpbywgQmFzaWMgRGVza3RvcCkKLSBGb3IgZmlsZSBhY2Nlc3M6CiAgICAtIFdlYi1iYXNlZCBmaWxlIGJyb3dzZXIKICAgIC0gR2xvYnVzCiAgICAtIERpcmVjdCAoaXQncyBkaXJlY3RseSBjb25uZWN0ZWQgdG8gR3JlYXQgTGFrZXMpCiAgICAtIFJlbW90ZSBtb3VudCAoaXQgY2FuIGJlIG5ldHdvcmstY29ubmVjdGVkIHRvIHlvdXIgd29ya3N0YXRpb24pCiAgICAtIGBzY3BgLCBgcnN5bmNgLCBldGMuCgojIyMgVXNpbmcgdGhlIHdlYi1iYXNlZCBhY2Nlc3MgbWV0aG9kcwoKVGhlIHdlYi1iYXNlZCB0b29scyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIEdyZWF0IExha2VzIGFuZCBvdGhlciBBUkMgcmVzb3VyY2VzIGFyZSBhIHF1aWNrIGFuZCBlYXN5IHdheSB0byBnZXQgc3RhcnRlZC4gV2UnbGwgdXNlIHRoZXNlIGluIG91ciB1cGNvbWluZyBleGVyY2lzZXMgdG8gbWFrZSBvdXIgZmlyc3QgZm9yYXkgaW50byB1c2luZyB0aGUgR3JlYXQgTGFrZXMgSFBDLiBBZGRpdGlvbmFsbHksIHRoZSAnSW50ZXJhY3RpdmUgQXBwcycgd2l0aCBBUkMncyBPcGVuIE9uIERlbWFuZCBzZXJ2aWNlIG9mZmVyIGEgdW5pcXVlIHNvbHV0aW9uIGZvciB3aGVuIHdlIG5lZWQgdG8gcnVuIGdyYXBoaWNhbCBhcHBsaWNhdGlvbnMuIFdlJ2xsIHByZXZpZXcgdGhpcyBhbmQgZ2l2ZSBzb21lIHByYWN0aWNhbCB0aXBzIGZvciB1c2luZyB0aGUgUlN0dWRpbyBhbmQgdGhlIEJhc2ljIERlc2t0b3AgYXBwcy4KCjxicj4KClNuZWFrIHByZXZpZXcgb2YgdGhlIHdlYi1iYXNlZCBmaWxlIGJyb3dzZXIKIVtdKGltYWdlcy9Nb2R1bGUwM2FfYWNjZXNzaW5nX3dlYl9iYXNlZF9maWxlX2Jyb3dzZXIucG5nKQohW10oaW1hZ2VzL01vZHVsZTAzYV9wcmV2aWV3X3dlYl9iYXNlZF9maWxlX2Jyb3dzZXIucG5nKQoKPGJyPgoKU25lYWsgcHJldmlldyBvZiB0aGUgd2ViLWJhc2VkIHNoZWxsCiFbXShpbWFnZXMvTW9kdWxlMDNhX2FjY2Vzc2luZ193ZWJfYmFzZWRfc2hlbGwucG5nKQohW10oaW1hZ2VzL01vZHVsZTAzYV9wcmV2aWV3X3dlYl9iYXNlZF9zaGVsbC5wbmcpCgo8YnI+CgpTbmVhayBwcmV2aWV3IG9mIGEgd2ViLWJhc2VkIFJTdHVkaW8gc2Vzc2lvbgohW10oaW1hZ2VzL01vZHVsZTAzYV9hY2Nlc3NpbmdfaW50ZXJhY3RpdmVfcnN0dWRpby5wbmcpCiFbXShpbWFnZXMvTW9kdWxlMDNhX3ByZXZpZXdfaW50ZXJhY3RpdmVfcnN0dWRpby5wbmcpCgo8YnI+CgpTbmVhayBwcmV2aWV3IG9mIGEgd2ViLWJhc2VkIEJhc2ljIERlc2t0b3Agc2Vzc2lvbgohW10oaW1hZ2VzL01vZHVsZTAzYV9hY2Nlc3NpbmdfaW50ZXJhY3RpdmVfYmFzaWNfZGVza3RvcC5wbmcpCiFbXShpbWFnZXMvTW9kdWxlMDNhX3ByZXZpZXdfaW50ZXJhY3RpdmVfYmFzaWNfZGVza3RvcC5wbmcpCgo8YnI+CgojIyBRdWljayBSZXZpZXcgb3IgQ3Jhc2ggQ291cnNlIG9uIHRoZSBOYW5vIEVkaXRvcgoKQmVmb3JlIHdlIGRpdmUgaW50byBzb21lIG9mIHRoZSBleGVyY2lzZXMgaW4gdGhpcyBtb2R1bGUsIHdlIHNob3VsZCBkbyBhIHF1aWNrIHJldmlldyBvciBjcmFzaCBjb3Vyc2Ugb24gdGhlIG5hbm8gdGV4dCBlZGl0b3IsIHdoaWNoIGlzIGEgY29tbWFuZC1saW5lLWJhc2VkIHRleHQgZWRpdG9yLiBJbiBzb21lIG9mIHRoZSB1cGNvbWluZyBleGVyY2lzZXMsIHdlIHdpbGwgYmUgY29ubmVjdGVkIHRvIEdyZWF0IExha2VzIHZpYSB0aGUgd2ViLWJhc2VkIHNoZWxsLCB3aGljaCBtZWFucyB0aGF0IHdlIHdpbGwgYmUgbGltaXRlZCB0byB1c2luZyBjb21tYW5kLWxpbmUgdG9vbHMuIER1cmluZyB0aGF0IHRpbWUsIHdlJ2xsIHVzZSBuYW5vIHRvIGVkaXQgUkVBRE1FcyBhbmQgc2NyaXB0IGZpbGVzLiBOYW5vLCBhbG9uZyB3aXRoIG90aGVyIGNvbW1hbmQtbGluZS1iYXNlZCB0ZXh0IGVkaXRvciB0b29scywgdXNlIHRoZSBrZXlib2FyZCBhcyB0aGUgbWFpbiB3YXkgb2YgaW50ZXJmYWNpbmcgd2l0aCB0aGUgc29mdHdhcmUuIFRoaXMgbWVhbnMgd2Ugd2lsbCB1c2UgdmFyaW91cyBrZXlzdHJva2VzIHRvIGNhcnJ5IG91dCB0YXNrcyBsaWtlIHNhdmluZyB0aGUgZmlsZSBhbmQgZXhpdGluZyB0aGUgdG9vbCwgd2hpY2ggbWF5IHRha2Ugc29tZSBwcmFjdGljZSB0byBnZXQgY29tZm9ydGFibGUgd2l0aC4gVGhhbmtmdWxseSwgbmFubyBpcyByZWxhdGl2ZWx5IGludHVpdGl2ZSBhbmQgZWFzeSB0byB1c2UsIHdoaWNoIGlzIG9uZSByZWFzb24gd2h5IHdlJ3ZlIGNob3NlbiB0byB1c2UgaXQgZm9yIHRoaXMgd29ya3Nob3AuCgpUaGUgYmFzaWMgbGF5b3V0IG9mIHRoZSBuYW5vIGVkaXRvciBpcyBzaG93biBiZWxvdy4gQSBoZWxwZnVsIGxpc3Qgb2YgY29tbW9uIHRhc2tzIGFuZCB0aGVpciBrZXlib2FyZCBzaG9ydGN1dHMgaXMgZm91bmQgYXQgdGhlIGJvdHRvbS4gVGhlIHRpdGxlIGJhciBhbmQgdGhlIHN0YXR1cyBiYXIgcHJvdmlkZSBzb21lIGFkZGl0aW9uYWwgY29udGV4dCBhYm91dCB0aGUgZmlsZSB3ZSdyZSBpbnRlcmFjdGluZyB3aXRoIGFuZCBmZWVkYmFjayBtZXNzYWdlcyBmcm9tIG5hbm8sIHJlc3BlY3RpdmVseS4KCiFbXShpbWFnZXMvTW9kdWxlMDNhX25hbm9fZWRpdG9yX2xheW91dC5wbmcpCgo8YnI+CgojIyBIYW5keSBsaW5rcyBmb3IgR3JlYXQgTGFrZXMKCi0gW0xpbmsgdG8gQVJDJ3MgR3JlYXQgTGFrZXMgb3ZlcnZpZXcgcGFnZV0oaHR0cHM6Ly9hcmMudW1pY2guZWR1L2dyZWF0bGFrZXMvKQotIFtMaW5rIHRvIEdyZWF0IExha2VzIERhc2hib2FyZF0oaHR0cHM6Ly9ncmVhdGxha2VzLmFyYy10cy51bWljaC5lZHUpCgo8YnI+CgojIyBFeGVyY2lzZSAtIFZpZXcgVHJhbnNmZXJyZWQgRmlsZXMKCkZvbGxvd2luZyBhbG9uZyB3aXRoIHRoZSBpbnN0cnVjdG9yLCB3ZSdsbCB1c2UgdGhlIHdlYi1iYXNlZCBmaWxlIGJyb3dzZXIgdG8gY29uZmlybSB0aGF0IHdlJ3ZlIHRyYW5zZmVycmVkIHRoZSBkYXRhIGZpbGVzIHRvIG91ciB0dXJibyBzcGFjZQoKIyMgRXhlcmNpc2UgLSBDb25uZWN0IHdpdGggdGhlIFdlYi1CYXNlZCBTaGVsbAoKRm9sbG93aW5nIGFsb25nIHdpdGggdGhlIGluc3RydWN0b3IsIHdlJ2xsIHVzZSB0aGUgd2ViLWJhc2VkIHNoZWxsIHRvIGNvbm5lY3QgdG8gR3JlYXQgTGFrZXMuIE9uY2UgdGhlcmUsIHdlJ2xsIHJ1biBhbiBpbnRyb2R1Y3Rvcnkgc2NyaXB0LCBhbmQgdGFrZSBhbm90aGVyIGxvb2sgYXQgb3VyIHRyYW5zZmVycmVkIGZpbGVzLgoKIyMgRXhlcmNpc2UgLSBMYXVuY2ggYW4gUlN0dWRpbyBJbnN0YW5jZSBvbiBPcGVuT25EZW1hbmQKCkZvbGxvd2luZyBhbG9uZyB3aXRoIHRoZSBpbnN0cnVjdG9yLCB3ZSdsbCB1c2UgT3Blbk9uRGVtYW5kIHRvIGxhdW5jaCBhbiBSU3R1ZGlvIGluc3RhbmNlLiBPbmNlIHRoZXJlLCB3ZSdsbCBydW4gYSBiYXNpYyBSIHNjcmlwdCBhcyBhIHF1aWNrIGRlbW9uc3RyYXRpb24gb2YgdGhlc2UgY2FwYWJpbGl0aWVzLgoKIyMgRXhlcmNpc2UgLSBMYXVuY2ggYSBCYXNpYyBEZXNrdG9wIEluc3RhbmNlIGFuZCBWZXJpZnkgRmlsZSBJbnRlZ3JpdHkKCkZvbGxvd2luZyBhbG9uZyB3aXRoIHRoZSBpbnN0cnVjdG9yLCB3ZSdsbCB1c2UgT3Blbk9uRGVtYW5kIHRvIGxhdW5jaCBhIEJhc2ljIERlc2t0b3AgaW5zdGFuY2UuIE9uY2UgdGhlcmUsIHdlJ2xsIG9wZW4gYSB0ZXJtaW5hbCBhbmQgdXNlIHRoZSBgbWQ1c3VtYCB1dGlsaXR5IHRvIHZlcmlmeSBmaWxlIGludGVncml0eSBvZiB0aGUgZGF0YSB0aGF0IHdlIHJlY2VudGx5IHRyYW5zZmVycmVkIHRvIG91ciBUdXJibyBsb2NhdGlvbi4KCj5Ob3RlOiBVc2luZyBhbiBPcGVuT25EZW1hbmQgQmFzaWMgRGVza3RvcCBpbnN0YW5jZSBpbiBvcmRlciB0byBydW4gYSBjb21tYW5kIGxpbmUgYXBwbGljYXRpb24gY2FuIGJlIGEgYml0IG9mIGFuIG9kZCBwYXR0ZXJuLiBXZSBkbyB0aGlzIGhlcmUgcHJpbWFyaWx5IGFzIGEgbWVhbnMgZm9yIHJlcXVlc3RpbmcgYW5kIHJlY2VpdmluZyB0aGUgcHJvcGVyIGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIGZvciB0aGlzIHRhc2suIEluIHRoZSBuZXh0IG1vZHVsZSwgd2UnbGwgbGVhcm4gYWJvdXQgc29tZSBvdGhlciBwYXR0ZXJucyBmb3IgcmVxdWVzdGluZyByZXNvdXJjZXMgYW5kIHJ1bm5pbmcgY29tbWFuZC1saW5lIHV0aWxpdGllcyB3aGljaCBtYXkgYmUgYmV0dGVyIGNob2ljZXMgZ29pbmcgZm9yd2FyZC4KCiMjIEV4ZXJjaXNlIC0gV3JpdGUgYSBSRUFETUUgRmlsZQoKRm9sbG93aW5nIGFsb25nIHdpdGggdGhlIGluc3RydWN0b3IsIHdlIHdpbGwgdXNlIHRoZSBgbmFub2AgdXRpbGl0eSB0byB3cml0ZSB0aGUgYmVnaW5uaW5ncyBvZiBhIFJFQURNRSBmb3Igb3VyIHByb2plY3QgYXMgaXQgZXhpc3RzIHNvIGZhci4KCjxkZXRhaWxzPgo8c3VtbWFyeT5Xcml0ZSBhIFJFQURNRSAtIFNvbHV0aW9uPC9zdW1tYXJ5PgoKYHNvdXJjZSAvbmZzL3R1cmJvL3VtbXMtYmlvaW5mLXdrc2hwL3dvcmtzaG9wL2hvbWUvJHtVU0VSfS9zb3VyY2VfbWVfZm9yX3Nob3J0Y3V0LnR4dGAKCmBjZCAke1dPUktTSE9QX0hPTUV9L3Byb2plY3RfYW5hbHlzaXNgCgpgbmFubyBSRUFETUUudHh0YAoKPC9kZXRhaWxzPgoKIyMgRXhlcmNpc2UgLSBPcmdhbml6ZSB5b3VyIHByb2plY3QKCkZvbGxvd2luZyBhbG9uZyB3aXRoIHRoZSBpbnN0cnVjdG9yLCB3ZSdsbCBvcmdhbml6ZSB0aGUgZmlsZXMgdGhhdCBhcmUgaW4gb3VyIGAkV09SS1NIT1BfSE9NRWAgZGlyZWN0b3J5LgoKPGRldGFpbHM+CjxzdW1tYXJ5Pk9yZ2FuaXplIFlvdXIgUHJvamVjdCAtIFNvbHV0aW9uPC9zdW1tYXJ5PgoKYGNkICR7V09SS1NIT1BfSE9NRX0vcHJvamVjdF9hbmFseXNpc2AKCmBtdiAwMDQyLVdTIGlucHV0X2JhbXNgCgpgbWtkaXIgbG9nc2AKCmBta2RpciBzY3JpcHRzYAoKPC9kZXRhaWxzPgoKPGJyPgoKIyMgUmV2aWV3CgotIExlYXJuZWQgYWJvdXQgZGlmZmVyZW50IHdheXMgb2YgYWNjZXNzaW5nIHRoZSBHcmVhdCBMYWtlcyBIUEMgY2x1c3RlcgotIEV4cGVyaWVuY2VkIHVzaW5nIHRoZSB3ZWItYmFzZWQgYWNjZXNzIG1ldGhvZHMKICAtIFdpdGggd2ViLWJhc2VkIGZpbGUgYnJvd3NlciwgZXhhbWluZWQgdGhlIGRhdGEgdGhhdCB3ZSBwcmV2aW91c2x5IHRyYW5zZmVycmVkCiAgLSBXaXRoIHdlYi1iYXNlZCBzaGVsbCBhY2Nlc3MsIHdlIHJhbiBhbiBpbnRyb2R1Y3Rvcnkgc2NyaXB0IGFuZCB1c2VkIENMSSBjb21tYW5kcyB0byBleGFtaW5lIHRoZSBkYXRhIHRoYXQgd2UgcHJldmlvdXNseSB0cmFuc2ZlcnJlZAogIC0gV2l0aCBPcGVuT25EZW1hbmQgUlN0dWRpbywgd2UgcmFuIGFuIGludHJvZHVjdG9yeSBSIHNjcmlwdAogIC0gV2l0aCBPcGVuT25EZW1hbmQgQmFzaWMgRGVza3RvcCwgd2UgdmVyaWZpZWQgZmlsZSBpbnRlZ3JpdHkgb2YgZGF0YSB0aGUgd2UgcHJldmlvdXNseSB0cmFuc2ZlcnJlZCwgYW5kIHVzZWQgYG5hbm9gIHRvIHdyaXRlIGEgUkVBRE1FIGZpbGUKCjxicj4KCiMjIyBIYW5keSBMaW5rcwoKLSBbTGluayB0byBBUkMncyBHcmVhdCBMYWtlcyBvdmVydmlldyBwYWdlIChzYW1lIGFzIGFib3ZlKV0oaHR0cHM6Ly9hcmMudW1pY2guZWR1L2dyZWF0bGFrZXMvKQotIFtMaW5rIHRvIEdyZWF0IExha2VzIERhc2hib2FyZCAoc2FtZSBhcyBhYm92ZSldKGh0dHBzOi8vZ3JlYXRsYWtlcy5hcmMtdHMudW1pY2guZWR1KQotIFtsaW5rIGZyb20gQUdDIG9uIHZhbGlkYXRpbmcgZmlsZSBpbnRlZ3JpdHkgdXNpbmcgbWQ1c3VtXShodHRwOi8vbWljaG1lZC5vcmcvYWdjLW1kNXN1bSkKCgp8IFtQcmV2aW91cyBsZXNzb25dKE1vZHVsZTAyX3RyYW5zZmVycmluZ19kYXRhX2dsb2J1cy5odG1sKSB8IFtUb3Agb2YgdGhpcyBsZXNzb25dKCN0b3ApIHwgW05leHQgbGVzc29uXShNb2R1bGUwM2JfZ3JlYXRfbGFrZXNfY2x1c3Rlci5odG1sKSB8CnwgOi0tLSB8IDotLS0tOiB8IC0tLTogfAo=