Today, we’ll be looking at three things:

  1. Basic exposure to the wonderful world of plain text
    • With a focus on authoring with markdown
  2. Version control with GitHub
    • Fundamental concepts in version control through GitHub
  3. Collaboration with GitHub Moved to cm004.
    • Workflows to optimize collaboration

To participate in today’s lecture, you should have:

Reflections on the Shell from last time:

1 The Wonderful World of Plain Text

1.1 Learning Objectives: Plain Text

By the end of today’s class, students are expected to be able to:

  • Name three key uses of plain text, and some types of plain text for each
  • Author basic documents in ordinary markdown (easier than you think!) with RStudio
  • Render a markdown document to html and pdf using RStudio
  • Choose whether html or pdf is an appropriate output

1.2 Orientation to Plain Text

Three uses of plain text relevant to data analytic work:

  • authoring
  • data storage
  • scripts

Motivation for plain text:

  • authoring:
    • Delegating the formatting saves time and is distraction-free
    • Automate numbering
    • Automate changes to the formatting
    • Less error-prone (eg. matching font sizes)
  • data storage and scripts:
    • always machine readable

Types of plain text for each, with typical file extensions. STAT 545 focusses on those in bold:

  • authoring
    • markdown (.md) (and family!)
    • LaTeX (.tex)
    • You could say HTML, too…
  • data storage
    • csv/comma-separated values (.csv)
    • tsv/tab-separated values (.tsv)
    • JSON (.json)
    • XML (.xml) (although not its only use)
  • scripts
    • R (.r) – Next week
    • python (.py)
    • javascript (.js)

Some noteworthy things:

  • Rich text is different from syntax highlighting
  • The file viewer is independent from the file
    • Less so with proprietary software such as Word.
  • With plain text, the file extension doesn’t really matter.

1.3 Markdown Crash Course

Live coding activity:

  1. Open RStudio, and open a new text file.
  2. Save the file, and call it md_explorer.md
  3. Add content to the document, using some markdown syntax such as:
    • Headers
    • Bold, Italics
    • Code font
    • Hyperlinks
  4. Click Preview to convert the md file to HTML. Try pdf, too!
    • Which to use? In general: printing to the page, pdf. Viewing on the screen, HTML.

Notable “flavours”/extensions to the basic markdown:

  • GitHub-flavoured Markdown (Assignment 1)
  • R Markdown (A future lesson)

Resources:

2 Version Control with GitHub

2.1 Learning Objectives: Version Control with GitHub

The concepts we’ll be looking at are:

  • Commits
  • Diffs
  • Commit History
  • Branches
  • Merging
  • Merge Conflicts

Specifically, by the end of today’s class, students are expected to be able to:

  • Describe the difference between git and GitHub, and name similar software
  • Edit plain text files on different branches on GitHub
  • Navigate the commit history of various repository branches on GitHub
  • Visualize a tree diagram of commits across branches
  • Merge repository branches via pull requests on GitHub, resolving merge conflicts if necessary

GitHub offers a nice tutorial on getting started with GitHub that you might find useful.

2.2 About Version Control

What is version control?

Why bother with version control?

  • Don’t fret removing stuff
  • Leave a breadcrumb trail for troubleshooting
  • “Undo” to a previous state
  • Helps you define your work

What software is associated with version control?

  • git, subversion, GitHub, GitLab, Bitbucket, …

2.3 Live-Coding: Making a new repo

To demonstrate version control concepts, we’ll create a new GitHub repository, which will showcase our markdown exploration.

  1. Create a new repository called stat545_md_explorer.
    • Counts towards participation, so please keep this repo until the course is complete.
  2. Say YES to initializing with a README.
  3. Edit the README with something descriptive, like:
    • This repo is part of a STAT 545 exercise to explore GitHub and markdown.

  4. Commit the changes, adding a commit message.
  5. Drag and drop the .md, .html, and .pdf files that you made earlier in class onto the main repo page.
  6. Explore the files in your repo. What’s viewable? What’s not?

You should now have a repo called stat545_md_explorer with a README file, and your .md, .pdf, and .html files from before.

2.4 Commits

Commits, diffs, and commit history.

2.5 Live-Coding: Branching and Merging

The notion of branching and merging shows up seemingly everywhere in version control. You’ll encounter merge conflicts, too.

To demonstrate concepts, let’s look at a repository branch. There are other types of branches, as we’ll see. For more info on this, see the GitHub documentation.

NOTE: I’m deferring the motivation for repo branching until later.

  1. Create a new branch via the home page of your repo (find the “branch” button). Call it test1.
  2. To the README on the test1 branch, add a relative link to the other .md file in the repo (using markdown syntax).
  3. Explore:
    • switch between branches to see that the repo structure is different.
    • Diagram of commit history for both branches.
  4. Merge the branch to “master”.

Part 2:

  1. Make a new branch called test2.
  2. Edit line 1 of the README on both branches to something different in both cases.
  3. Try merging. You’ll get a merge conflict – go ahead and resolve it, then merge.

3 If we finish early

3.1 csv files

  • Their use for tabular data
  • Their structure
  • Editing them by hand

3.2 More Markdown

Let’s learn more about markdown, with a think-pair-share activity.

  1. Form groups of size n (determined in-class)
  2. “Think”-iteration: Each person is responsible for learning about a different type of markdown formatting, for 3 minutes:
    • Inserting images
    • Lists
    • Blockquotes
    • Code blocks
  3. “Pair”-iteration: For max 1 minute per person, each person either:
    • teaches the other group members how to use the formatting they learned, OR
    • if you’re lost, ask your group members for help on the basics.
      • Don’t feel bad! This happens and is normal, and is also useful for your team members.
  4. “Share”-iteration: Volunteer to share something that you learned!
LS0tCnRpdGxlOiAiU1RBVCA1NDUgQ2xhc3MgTWVldGluZyAwMjogTWFya2Rvd24gYW5kIEdpdEh1YiIKb3V0cHV0OgogICAgaHRtbF9ub3RlYm9vazoKICAgICAgICB0b2M6IHRydWUKICAgICAgICB0aGVtZTogY2VydWxlYW4KICAgICAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgpUb2RheSwgd2UnbGwgYmUgbG9va2luZyBhdCB0aHJlZSB0aGluZ3M6CgoxLiBCYXNpYyBleHBvc3VyZSB0byB0aGUgd29uZGVyZnVsIHdvcmxkIG9mIHBsYWluIHRleHQKICAgIC0gV2l0aCBhIGZvY3VzIG9uIGF1dGhvcmluZyB3aXRoIG1hcmtkb3duCjIuIFZlcnNpb24gY29udHJvbCB3aXRoIEdpdEh1YgogICAgLSBGdW5kYW1lbnRhbCBjb25jZXB0cyBpbiB2ZXJzaW9uIGNvbnRyb2wgdGhyb3VnaCBHaXRIdWIKMy4gfn5Db2xsYWJvcmF0aW9uIHdpdGggR2l0SHVifn4gTW92ZWQgdG8gY20wMDQuIAogICAgLSB+fldvcmtmbG93cyB0byBvcHRpbWl6ZSBjb2xsYWJvcmF0aW9ufn4KClRvIHBhcnRpY2lwYXRlIGluIHRvZGF5J3MgbGVjdHVyZSwgeW91IHNob3VsZCBoYXZlOgoKLSBBIEdpdEh1YiBhY2NvdW50Ci0gUlN0dWRpbyBpbnN0YWxsZWQKClJlZmxlY3Rpb25zIG9uIHRoZSBTaGVsbCBmcm9tIGxhc3QgdGltZToKCi0gV2luZG93cyBoYXMgaXRzIG93biBsYW5ndWFnZSBmb3IgdGhlIFNoZWxsLiBUaGFua3MgdG8gdGhvc2Ugc3R1ZGVudHMgY29udHJpYnV0aW5nIHRoZWlyIFdpbmRvd3Mga25vd2xlZGdlIGluIFtEaXNjdXNzaW9uLUludGVybmFsIElzc3VlICM1XShodHRwczovL2dpdGh1Yi5jb20vU1RBVDU0NS1VQkMvRGlzY3Vzc2lvbi1JbnRlcm5hbC9pc3N1ZXMvNSkhCgojIFRoZSBXb25kZXJmdWwgV29ybGQgb2YgUGxhaW4gVGV4dAoKIyMgTGVhcm5pbmcgT2JqZWN0aXZlczogUGxhaW4gVGV4dAoKQnkgdGhlIGVuZCBvZiB0b2RheSdzIGNsYXNzLCBzdHVkZW50cyBhcmUgZXhwZWN0ZWQgdG8gYmUgYWJsZSB0bzoKCi0gTmFtZSB0aHJlZSBrZXkgdXNlcyBvZiBwbGFpbiB0ZXh0LCBhbmQgc29tZSB0eXBlcyBvZiBwbGFpbiB0ZXh0IGZvciBlYWNoCi0gQXV0aG9yIGJhc2ljIGRvY3VtZW50cyBpbiBvcmRpbmFyeSBtYXJrZG93biAoZWFzaWVyIHRoYW4geW91IHRoaW5rISkgd2l0aCBSU3R1ZGlvCi0gUmVuZGVyIGEgbWFya2Rvd24gZG9jdW1lbnQgdG8gaHRtbCBhbmQgcGRmIHVzaW5nIFJTdHVkaW8KLSBDaG9vc2Ugd2hldGhlciBodG1sIG9yIHBkZiBpcyBhbiBhcHByb3ByaWF0ZSBvdXRwdXQKCiMjIE9yaWVudGF0aW9uIHRvIFBsYWluIFRleHQKClRocmVlIHVzZXMgb2YgcGxhaW4gdGV4dCByZWxldmFudCB0byBkYXRhIGFuYWx5dGljIHdvcms6CgotIGF1dGhvcmluZwotIGRhdGEgc3RvcmFnZQotIHNjcmlwdHMKCk1vdGl2YXRpb24gZm9yIHBsYWluIHRleHQ6CgotIGF1dGhvcmluZzogCiAgICAtIERlbGVnYXRpbmcgdGhlIGZvcm1hdHRpbmcgc2F2ZXMgdGltZSBhbmQgaXMgZGlzdHJhY3Rpb24tZnJlZQogICAgLSBBdXRvbWF0ZSBudW1iZXJpbmcKICAgIC0gQXV0b21hdGUgY2hhbmdlcyB0byB0aGUgZm9ybWF0dGluZwogICAgLSBMZXNzIGVycm9yLXByb25lIChlZy4gbWF0Y2hpbmcgZm9udCBzaXplcykKICAgIC0gLi4uCi0gZGF0YSBzdG9yYWdlIGFuZCBzY3JpcHRzOgogICAgLSBhbHdheXMgbWFjaGluZSByZWFkYWJsZQoKVHlwZXMgb2YgcGxhaW4gdGV4dCBmb3IgZWFjaCwgd2l0aCB0eXBpY2FsIGZpbGUgZXh0ZW5zaW9ucy4gU1RBVCA1NDUgZm9jdXNzZXMgb24gdGhvc2UgaW4gX19ib2xkX186CgotIGF1dGhvcmluZwogICAgLSBfX21hcmtkb3duX18gKGAubWRgKSAoYW5kIGZhbWlseSEpCiAgICAtIExhVGVYIChgLnRleGApCiAgICAtIFlvdSBjb3VsZCBzYXkgSFRNTCwgdG9vLi4uCi0gZGF0YSBzdG9yYWdlCiAgICAtIF9fY3N2L2NvbW1hLXNlcGFyYXRlZCB2YWx1ZXNfXyAoYC5jc3ZgKQogICAgLSB0c3YvdGFiLXNlcGFyYXRlZCB2YWx1ZXMgKGAudHN2YCkKICAgIC0gSlNPTiAoYC5qc29uYCkKICAgIC0gWE1MIChgLnhtbGApIChhbHRob3VnaCBub3QgaXRzIG9ubHkgdXNlKQotIHNjcmlwdHMKICAgIC0gX19SX18gKGAucmApIC0tIF9OZXh0IHdlZWtfCiAgICAtIHB5dGhvbiAoYC5weWApCiAgICAtIGphdmFzY3JpcHQgKGAuanNgKQoKU29tZSBub3Rld29ydGh5IHRoaW5nczoKCi0gUmljaCB0ZXh0IGlzIGRpZmZlcmVudCBmcm9tIHN5bnRheCBoaWdobGlnaHRpbmcKLSBUaGUgX2ZpbGUgdmlld2VyXyBpcyBpbmRlcGVuZGVudCBmcm9tIHRoZSBfZmlsZV8KICAgIC0gTGVzcyBzbyB3aXRoIHByb3ByaWV0YXJ5IHNvZnR3YXJlIHN1Y2ggYXMgV29yZC4gCi0gV2l0aCBwbGFpbiB0ZXh0LCB0aGUgZmlsZSBleHRlbnNpb24gZG9lc24ndCByZWFsbHkgbWF0dGVyLiAKCiMjIE1hcmtkb3duIENyYXNoIENvdXJzZQoKTGl2ZSBjb2RpbmcgYWN0aXZpdHk6CgoxLiBPcGVuIFJTdHVkaW8sIGFuZCBvcGVuIGEgbmV3IHRleHQgZmlsZS4gCjIuIFNhdmUgdGhlIGZpbGUsIGFuZCBjYWxsIGl0IGBtZF9leHBsb3Jlci5tZGAKMy4gQWRkIGNvbnRlbnQgdG8gdGhlIGRvY3VtZW50LCB1c2luZyBzb21lIG1hcmtkb3duIHN5bnRheCBzdWNoIGFzOgogICAgLSBIZWFkZXJzCiAgICAtIEJvbGQsIEl0YWxpY3MKICAgIC0gQ29kZSBmb250CiAgICAtIEh5cGVybGlua3MKNC4gQ2xpY2sgYFByZXZpZXdgIHRvIGNvbnZlcnQgdGhlIG1kIGZpbGUgdG8gSFRNTC4gVHJ5IHBkZiwgdG9vIQogICAgLSBXaGljaCB0byB1c2U/IEluIGdlbmVyYWw6IHByaW50aW5nIHRvIHRoZSBwYWdlLCBwZGYuIFZpZXdpbmcgb24gdGhlIHNjcmVlbiwgSFRNTC4KCk5vdGFibGUgImZsYXZvdXJzIi9leHRlbnNpb25zIHRvIHRoZSBiYXNpYyBtYXJrZG93bjoKCi0gR2l0SHViLWZsYXZvdXJlZCBNYXJrZG93biAoQXNzaWdubWVudCAxKQotIFIgTWFya2Rvd24gKEEgZnV0dXJlIGxlc3NvbikKClJlc291cmNlczoKCi0gW09yaWdpbmFsIE1hcmtkb3duIHN5bnRheF0oaHR0cHM6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vc3ludGF4KS4KLSBbQ2hlYXRzaGVldF0oaHR0cHM6Ly9ndWlkZXMuZ2l0aHViLmNvbS9wZGZzL21hcmtkb3duLWNoZWF0c2hlZXQtb25saW5lLnBkZikgZm9yIG1kIGFuZCBnaC1mbGF2b3VyZWQgbWQuIAotIFtUdXRvcmlhbF0oaHR0cHM6Ly9jb21tb25tYXJrLm9yZy9oZWxwL3R1dG9yaWFsLykgZm9yIGxlYXJuaW5nIG1hcmtkb3duLgoKIyBWZXJzaW9uIENvbnRyb2wgd2l0aCBHaXRIdWIKCiMjIExlYXJuaW5nIE9iamVjdGl2ZXM6IFZlcnNpb24gQ29udHJvbCB3aXRoIEdpdEh1YgoKVGhlIGNvbmNlcHRzIHdlJ2xsIGJlIGxvb2tpbmcgYXQgYXJlOgoKLSBDb21taXRzCi0gRGlmZnMKLSBDb21taXQgSGlzdG9yeQotIEJyYW5jaGVzCi0gTWVyZ2luZwotIE1lcmdlIENvbmZsaWN0cwoKU3BlY2lmaWNhbGx5LCBieSB0aGUgZW5kIG9mIHRvZGF5J3MgY2xhc3MsIHN0dWRlbnRzIGFyZSBleHBlY3RlZCB0byBiZSBhYmxlIHRvOgoKLSBEZXNjcmliZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGdpdCBhbmQgR2l0SHViLCBhbmQgbmFtZSBzaW1pbGFyIHNvZnR3YXJlCi0gRWRpdCBwbGFpbiB0ZXh0IGZpbGVzIG9uIGRpZmZlcmVudCBicmFuY2hlcyBvbiBHaXRIdWIKLSBOYXZpZ2F0ZSB0aGUgY29tbWl0IGhpc3Rvcnkgb2YgdmFyaW91cyByZXBvc2l0b3J5IGJyYW5jaGVzIG9uIEdpdEh1YgotIFZpc3VhbGl6ZSBhIHRyZWUgZGlhZ3JhbSBvZiBjb21taXRzIGFjcm9zcyBicmFuY2hlcwotIE1lcmdlIHJlcG9zaXRvcnkgYnJhbmNoZXMgdmlhIHB1bGwgcmVxdWVzdHMgb24gR2l0SHViLCByZXNvbHZpbmcgbWVyZ2UgY29uZmxpY3RzIGlmIG5lY2Vzc2FyeQoKR2l0SHViIG9mZmVycyBbYSBuaWNlIHR1dG9yaWFsXShodHRwczovL2d1aWRlcy5naXRodWIuY29tL2FjdGl2aXRpZXMvaGVsbG8td29ybGQvKSBvbiBnZXR0aW5nIHN0YXJ0ZWQgd2l0aCBHaXRIdWIgdGhhdCB5b3UgbWlnaHQgZmluZCB1c2VmdWwuCgojIyBBYm91dCBWZXJzaW9uIENvbnRyb2wKCldoYXQgaXMgdmVyc2lvbiBjb250cm9sPwoKV2h5IGJvdGhlciB3aXRoIHZlcnNpb24gY29udHJvbD8KCi0gRG9uJ3QgZnJldCByZW1vdmluZyBzdHVmZgotIExlYXZlIGEgYnJlYWRjcnVtYiB0cmFpbCBmb3IgdHJvdWJsZXNob290aW5nCi0gIlVuZG8iIHRvIGEgcHJldmlvdXMgc3RhdGUKLSBIZWxwcyB5b3UgZGVmaW5lIHlvdXIgd29yawotIC4uLgoKV2hhdCBzb2Z0d2FyZSBpcyBhc3NvY2lhdGVkIHdpdGggdmVyc2lvbiBjb250cm9sPwoKLSBnaXQsIHN1YnZlcnNpb24sIEdpdEh1YiwgR2l0TGFiLCBCaXRidWNrZXQsIC4uLgoKIyMgTGl2ZS1Db2Rpbmc6IE1ha2luZyBhIG5ldyByZXBvCgpUbyBkZW1vbnN0cmF0ZSB2ZXJzaW9uIGNvbnRyb2wgY29uY2VwdHMsIHdlJ2xsIGNyZWF0ZSBhIG5ldyBHaXRIdWIgcmVwb3NpdG9yeSwgd2hpY2ggd2lsbCBzaG93Y2FzZSBvdXIgbWFya2Rvd24gZXhwbG9yYXRpb24uIAoKCjEuIENyZWF0ZSBhIG5ldyByZXBvc2l0b3J5IGNhbGxlZCBgc3RhdDU0NV9tZF9leHBsb3JlcmAuCiAgICAtIENvdW50cyB0b3dhcmRzIHBhcnRpY2lwYXRpb24sIHNvIHBsZWFzZSBrZWVwIHRoaXMgcmVwbyB1bnRpbCB0aGUgY291cnNlIGlzIGNvbXBsZXRlLgoyLiBTYXkgWUVTIHRvIGluaXRpYWxpemluZyB3aXRoIGEgUkVBRE1FLgozLiBFZGl0IHRoZSBSRUFETUUgd2l0aCBzb21ldGhpbmcgZGVzY3JpcHRpdmUsIGxpa2U6CiAgICAtID4gVGhpcyByZXBvIGlzIHBhcnQgb2YgYSBTVEFUIDU0NSBleGVyY2lzZSB0byBleHBsb3JlIEdpdEh1YiBhbmQgbWFya2Rvd24uCjQuIF9Db21taXRfIHRoZSBjaGFuZ2VzLCBhZGRpbmcgYSBfY29tbWl0IG1lc3NhZ2VfLgo1LiBEcmFnIGFuZCBkcm9wIHRoZSBgLm1kYCwgYC5odG1sYCwgYW5kIGAucGRmYCBmaWxlcyB0aGF0IHlvdSBtYWRlIGVhcmxpZXIgaW4gY2xhc3Mgb250byB0aGUgbWFpbiByZXBvIHBhZ2UuCjYuIEV4cGxvcmUgdGhlIGZpbGVzIGluIHlvdXIgcmVwby4gV2hhdCdzIHZpZXdhYmxlPyBXaGF0J3Mgbm90PwogICAgLSBGb29kIGZvciB0aG91Z2h0OiBKZW5ueSBCcnlhbiBvbiByZXBvIGJyb3dzYWJpbGl0eTogW2hhcHB5Z2l0d2l0aHIgcmVwby1icm93c2FiaWxpdHldKGh0dHA6Ly9oYXBweWdpdHdpdGhyLmNvbS9yZXBvLWJyb3dzYWJpbGl0eS5odG1sKS4KCllvdSBzaG91bGQgbm93IGhhdmUgYSByZXBvIGNhbGxlZCBgc3RhdDU0NV9tZF9leHBsb3JlcmAgd2l0aCBhIFJFQURNRSBmaWxlLCBhbmQgeW91ciBgLm1kYCwgYC5wZGZgLCBhbmQgYC5odG1sYCBmaWxlcyBmcm9tIGJlZm9yZS4gCgojIyBDb21taXRzCgpDb21taXRzLCBkaWZmcywgYW5kIGNvbW1pdCBoaXN0b3J5LgoKIyMgTGl2ZS1Db2Rpbmc6IEJyYW5jaGluZyBhbmQgTWVyZ2luZwoKVGhlIG5vdGlvbiBvZiBfYnJhbmNoaW5nXyBhbmQgX21lcmdpbmdfIHNob3dzIHVwIHNlZW1pbmdseSBldmVyeXdoZXJlIGluIHZlcnNpb24gY29udHJvbC4gWW91J2xsIGVuY291bnRlciBfbWVyZ2UgY29uZmxpY3RzXywgdG9vLgoKVG8gZGVtb25zdHJhdGUgY29uY2VwdHMsIGxldCdzIGxvb2sgYXQgYSBfcmVwb3NpdG9yeSBicmFuY2hfLiBUaGVyZSBhcmUgb3RoZXIgdHlwZXMgb2YgYnJhbmNoZXMsIGFzIHdlJ2xsIHNlZS4gRm9yIG1vcmUgaW5mbyBvbiB0aGlzLCBzZWUgW3RoZSBHaXRIdWIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vYXJ0aWNsZXMvY3JlYXRpbmctYW5kLWRlbGV0aW5nLWJyYW5jaGVzLXdpdGhpbi15b3VyLXJlcG9zaXRvcnkvKS4gCgpOT1RFOiBJJ20gZGVmZXJyaW5nIHRoZSBtb3RpdmF0aW9uIGZvciByZXBvIGJyYW5jaGluZyB1bnRpbCBsYXRlci4gCgoxLiBDcmVhdGUgYSBuZXcgYnJhbmNoIHZpYSB0aGUgaG9tZSBwYWdlIG9mIHlvdXIgcmVwbyAoZmluZCB0aGUgImJyYW5jaCIgYnV0dG9uKS4gQ2FsbCBpdCBgdGVzdDFgLgoyLiBUbyB0aGUgUkVBRE1FIG9uIHRoZSBgdGVzdDFgIGJyYW5jaCwgYWRkIGEgcmVsYXRpdmUgbGluayB0byB0aGUgb3RoZXIgYC5tZGAgZmlsZSBpbiB0aGUgcmVwbyAodXNpbmcgbWFya2Rvd24gc3ludGF4KS4KMy4gRXhwbG9yZTogCiAgICAtIHN3aXRjaCBiZXR3ZWVuIGJyYW5jaGVzIHRvIHNlZSB0aGF0IHRoZSByZXBvIHN0cnVjdHVyZSBpcyBkaWZmZXJlbnQuCiAgICAtIERpYWdyYW0gb2YgY29tbWl0IGhpc3RvcnkgZm9yIGJvdGggYnJhbmNoZXMuCjQuIE1lcmdlIHRoZSBicmFuY2ggdG8gIm1hc3RlciIuCgpQYXJ0IDI6IAoKMS4gTWFrZSBhIG5ldyBicmFuY2ggY2FsbGVkIGB0ZXN0MmAuCjIuIEVkaXQgbGluZSAxIG9mIHRoZSBSRUFETUUgX29uIGJvdGggYnJhbmNoZXNfIHRvIHNvbWV0aGluZyBkaWZmZXJlbnQgaW4gYm90aCBjYXNlcy4KMy4gVHJ5IG1lcmdpbmcuIFlvdSdsbCBnZXQgYSBfbWVyZ2UgY29uZmxpY3RfIC0tIGdvIGFoZWFkIGFuZCByZXNvbHZlIGl0LCB0aGVuIG1lcmdlLiAKCiMgSWYgd2UgZmluaXNoIGVhcmx5CgojIyBjc3YgZmlsZXMKCi0gVGhlaXIgdXNlIGZvciB0YWJ1bGFyIGRhdGEKLSBUaGVpciBzdHJ1Y3R1cmUKLSBFZGl0aW5nIHRoZW0gYnkgaGFuZAoKIyMgTW9yZSBNYXJrZG93bgoKTGV0J3MgbGVhcm4gbW9yZSBhYm91dCBtYXJrZG93biwgd2l0aCBhIHRoaW5rLXBhaXItc2hhcmUgYWN0aXZpdHkuCgoxLiBGb3JtIGdyb3VwcyBvZiBzaXplIGBuYCAoZGV0ZXJtaW5lZCBpbi1jbGFzcykKMi4gIlRoaW5rIi1pdGVyYXRpb246IEVhY2ggcGVyc29uIGlzIHJlc3BvbnNpYmxlIGZvciBsZWFybmluZyBhYm91dCBhIGRpZmZlcmVudCB0eXBlIG9mIG1hcmtkb3duIGZvcm1hdHRpbmcsIGZvciAzIG1pbnV0ZXM6CiAgICAtIEluc2VydGluZyBpbWFnZXMKICAgIC0gTGlzdHMKICAgIC0gQmxvY2txdW90ZXMKICAgIC0gQ29kZSBibG9ja3MKMy4gIlBhaXIiLWl0ZXJhdGlvbjogRm9yIG1heCAxIG1pbnV0ZSBwZXIgcGVyc29uLCBlYWNoIHBlcnNvbiBlaXRoZXI6CiAgICAtIHRlYWNoZXMgdGhlIG90aGVyIGdyb3VwIG1lbWJlcnMgaG93IHRvIHVzZSB0aGUgZm9ybWF0dGluZyB0aGV5IGxlYXJuZWQsIE9SCiAgICAtIGlmIHlvdSdyZSBsb3N0LCBhc2sgeW91ciBncm91cCBtZW1iZXJzIGZvciBoZWxwIG9uIHRoZSBiYXNpY3MuIAogICAgICAgIC0gRG9uJ3QgZmVlbCBiYWQhIFRoaXMgaGFwcGVucyBhbmQgaXMgbm9ybWFsLCBhbmQgaXMgYWxzbyB1c2VmdWwgZm9yIHlvdXIgdGVhbSBtZW1iZXJzLiAKNC4gIlNoYXJlIi1pdGVyYXRpb246IFZvbHVudGVlciB0byBzaGFyZSBzb21ldGhpbmcgdGhhdCB5b3UgbGVhcm5lZCE=