introduction
So far you’ve seen R Markdown used to produce HTML documents. This chapter gives a brief overview of some of the many other types of output you can produce with R Markdown. There are two ways to set the output of a document:
- Permanently, by modifying the YAML header:
title: “Viridis Demo” output: html_document
- Transiently, by calling rmarkdown::render() by hand:
rmarkdown::render(“diamond-sizes.Rmd”, output_format = “word_document”)
This is useful if you want to programmatically produce multiple types of output.
RStudio’s knit button renders a file to the first format listed in its output field. You can render to additional formats by clicking the dropdown menu beside the knit button.
***
Output Options
Each output format is associated with an R function. You can either write foo or pkg::foo. If you omit, pkg the default is assumed to be rmarkdown. It’s important to know the name of the function that makes the output because that’s where you get help. For example, to figure out what parameters you can set with html_document, look at ?rmarkdown::html_document
To override the default parameter values, you need to use an expanded output field. For example, if you wanted to render an html_document with a floating table of contents, you’d use:
output: html_document: toc: true toc_float: true
You can even render to multiple outputs by supplying a list of formats: output:
html_document: toc: true toc_float: true pdf_document: default
Documents
The previous chapter focussed on the default html_document output. There are number of basic variations on that theme, generating different types of documents:
pdf_document makes a PDF with LaTeX (an open source document layout system), which you’ll need to install. RStudio will prompt you if you don’t already have it.
word_document for Microsoft Word documents (.docx).
odt_document for OpenDocument Text documents (.odt).
rtf_document for Rich Text Format (.rtf) documents.
md_document for a Markdown document. This isn’t typically useful by itself, but you might use it if, for example, your corporate CMS or lab wiki uses markdown.
github_document: this is a tailored version of md_document designed for sharing on GitHub.
Remember, when generating a document to share with decision makers, you can turn off the default display of code by setting global options in the setup chunk:
knitr::opts_chunk$set(echo = FALSE)
For html_documents another option is to make the code chunks hidden by default, but visible with a click:
output: html_document: code_folding: hide
Notebooks
A notebook, html_notebook, is a variation on a html_document. The rendered outputs are very similar, but the purpose is different. A html_document is focussed on communicating with decision makers, while a notebook is focussed on collaborating with other data scientists. These different purposes lead to using the HTML output in different ways. Both HTML outputs will contain the fully rendered output, but the notebook also contains the full source code. That means you can use the .nb.html generated by the notebook in two ways:
You can view it in a web browser, and see the rendered output. Unlike html_document, this rendering always includes an embedded copy of the source code that generated it.
You can edit it in RStudio. When you open an .nb.html file, RStudio will automatically recreate .Rmd file that generated it. In the future, you will also be able include supporting files (e.g. .csv data files), which will be automatically extracted when needed.
Emailing .nb.html files is a simple way to share analyses with your colleagues. But things will get painful as soon as they want to make changes. If this starts to happen, it’s a good time to learn Git and GitHub. Learning Git and GitHub is definitely painful at first, but the collaboration payoff is huge. As mentioned earlier, Git and GitHub are outside the scope of the book, but there’s one tip that’s useful if you’re already using them: use both html_notebook and github_document outputs:
Output: html_notebook: default github_document: default
html_notebook gives you a local preview, and a file that you can share via email. github_document creates a minimal md file that you can check into git. You can easily see how the results of your analysis (not just the code) change over time, and GitHub will render it for you nicely online.
Presentations
You can also use R Markdown to produce presentations. You get less visual control than with a tool like Keynote or PowerPoint, but automatically inserting the results of your R code into a presentation can save a huge amount of time. Presentations work by dividing your content into slides, with a new slide beginning at each first (#) or second (##) level header. You can also insert a horizontal rule (***) to create a new slide without a header.
R Markdown comes with three presentations formats built-in:
ioslides_presentation - HTML presentation with ioslides
slidy_presentation - HTML presentation with W3C Slidy
beamer_presentation - PDF presentation with LaTeX Beamer.
Two other popular formats are provided by packages:
revealjs::revealjs_presentation - HTML presentation with reveal.js. Requires the revealjs package.
rmdshower, https://github.com/MangoTheCat/rmdshower, provides a wrapper around the shower, https://github.com/shower/shower, presentation engine
Dashboards
Dashboards are a useful way to communicate large amounts of information visually and quickly. Flexdashboard makes it particularly easy to create dashboards using R Markdown and a convention for how the headers affect the layout:
- Each level 1 header (#) begins a new page in the dashboard.
- Each level 2 header (##) begins a new column.
- Each level 3 header (###) begins a new row.
For example, you can produce this dashboard: 
Interactivity
Any HTML format (document, notebook, presentation, or dashboard) can contain interactive components.
Shiny
htmlwidgets provide client-side interactivity - all the interactivity happens in the browser, independently of R. On one hand, that’s great because you can distribute the HTML file without any connection to R. However, that fundamentally limits what you can do to things that have been implemented in HTML and JavaScript. An alternative approach is to use shiny, a package that allows you to create interactivity using R code, not JavaScript.
To call Shiny code from an R Markdown document, add runtime: shiny to the header: > title: “shiny Web app” output: html_document runtime: shiny
Then you can use the “input” functions to add interactive components to the document:
library(shiny) textInput(“name”, “What is your name?”) numericInput(“age”, “How old are you ?”, NA, min=0, max= 150)

You can then refer to the values with input\(name and input\)age, and the code that uses them will be automatically re-run whenever they change.
I can’t show you a live shiny app here because shiny interactions occur on the server-side. This means you can write interactive apps without knowing JavaScript, but it means that you need a server to run it on. This introduces a logistical issue: Shiny apps need a Shiny server to be run online. When you run shiny apps on your own computer, shiny automatically sets up a shiny server for you, but you need a public facing shiny server if you want to publish this sort of interactivity online. That’s the fundamental trade-off of shiny: you can do anything in a shiny document that you can do in R, but it that requires someone to be running R.
Learn more about Shiny at
http://shiny.rstudio.com/.
Websites
With a little additional infrastructure you can use R Markdown to generate a complete website:
name: “my-website” navbar: title: “My Website” left: - text: “Home” href: index.html - text: “Viridis Colors” href: 1-example.html - text: “Terrain Colors” href: 3-inline.html
Execute rmarkdown::render_site() to build _site, a directory of files ready to deploy as a standalone static website, or if you use an RStudio Project for your website directory. RStudio will add a Build tab to the IDE that you can use to build and preview your site.
Read more at
http://rmarkdown.rstudio.com/rmarkdown_websites.html.
Learning More
To learn more about effective communication in these different formats I recommend the following resources:
To improve your presentation skills, I recommend Presentation Patterns, by Neal Ford, Matthew McCollough, and Nathaniel Schutta. It provides a set of effective patterns (both low- and high-level) that you can apply to improve your presentations.
If you give academic talks, I recommend reading the Leek group guide to giving talks.
I haven’t taken it myself, but I’ve heard good things about Matt McGarrity’s online course on public speaking: https://www.coursera.org/learn/public-speaking.
If you are creating a lot of dashboards, make sure to read Stephen Few’s Information Dashboard Design: The Effective Visual Communication of Data. It will help you create dashboards that are truly useful, not just pretty to look at.
Effectively communicating your ideas often benefits from some knowledge of graphic design. The Non-Designer’s Design Book is a great place to start.
LS0tDQp0aXRsZTogIlIgRm9yIERhdGEgU2NpZW5jZSBDaGFwdGVyIDIzIE1hcmtkb3duIEZvcm1hdHMiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCi0tLQ0KIyBpbnRyb2R1Y3Rpb24NCg0KU28gZmFyIHlvdSd2ZSBzZWVuIFIgTWFya2Rvd24gdXNlZCB0byBwcm9kdWNlIEhUTUwgZG9jdW1lbnRzLiBUaGlzIGNoYXB0ZXIgZ2l2ZXMgYSBicmllZiBvdmVydmlldyBvZiBzb21lIG9mIHRoZSBtYW55IG90aGVyIHR5cGVzIG9mIG91dHB1dCB5b3UgY2FuIHByb2R1Y2Ugd2l0aCBSIE1hcmtkb3duLiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gc2V0IHRoZSBvdXRwdXQgb2YgYSBkb2N1bWVudDoNCg0KMS4gUGVybWFuZW50bHksIGJ5IG1vZGlmeWluZyB0aGUgWUFNTCBoZWFkZXI6DQoNCj4gdGl0bGU6ICJWaXJpZGlzIERlbW8iIDwvYnI+DQpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQgPC9icj4NCg0KMi4gVHJhbnNpZW50bHksIGJ5IGNhbGxpbmcgcm1hcmtkb3duOjpyZW5kZXIoKSBieSBoYW5kOg0KDQo+IHJtYXJrZG93bjo6cmVuZGVyKCJkaWFtb25kLXNpemVzLlJtZCIsIG91dHB1dF9mb3JtYXQgPSAid29yZF9kb2N1bWVudCIpDQoNClRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHByb2dyYW1tYXRpY2FsbHkgcHJvZHVjZSBtdWx0aXBsZSB0eXBlcyBvZiBvdXRwdXQuDQoNClJTdHVkaW8ncyBrbml0IGJ1dHRvbiByZW5kZXJzIGEgZmlsZSB0byB0aGUgZmlyc3QgZm9ybWF0IGxpc3RlZCBpbiBpdHMgb3V0cHV0IGZpZWxkLiBZb3UgY2FuIHJlbmRlciB0byBhZGRpdGlvbmFsIGZvcm1hdHMgYnkgY2xpY2tpbmcgdGhlIGRyb3Bkb3duIG1lbnUgYmVzaWRlIHRoZSBrbml0IGJ1dHRvbi4gPC9wPg0KDQo8aW1nIHNyYz0iaHR0cDovL3I0ZHMuaGFkLmNvLm56L3NjcmVlbnNob3RzL3JtYXJrZG93bi1rbml0LnBuZyIgLz4gDQoqKioNCg0KIyMgT3V0cHV0IE9wdGlvbnMNCkVhY2ggb3V0cHV0IGZvcm1hdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gUiBmdW5jdGlvbi4gWW91IGNhbiBlaXRoZXIgd3JpdGUgZm9vIG9yIHBrZzo6Zm9vLiBJZiB5b3Ugb21pdCwgcGtnIHRoZSBkZWZhdWx0IGlzIGFzc3VtZWQgdG8gYmUgcm1hcmtkb3duLiBJdCdzIGltcG9ydGFudCB0byBrbm93IHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0aGF0IG1ha2VzIHRoZSBvdXRwdXQgYmVjYXVzZSB0aGF0J3Mgd2hlcmUgeW91IGdldCBoZWxwLiBGb3IgZXhhbXBsZSwgdG8gZmlndXJlIG91dCB3aGF0IHBhcmFtZXRlcnMgeW91IGNhbiBzZXQgd2l0aCBodG1sX2RvY3VtZW50LCBsb29rIGF0ID9ybWFya2Rvd246Omh0bWxfZG9jdW1lbnQNCg0KVG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcywgeW91IG5lZWQgdG8gdXNlIGFuIGV4cGFuZGVkIG91dHB1dCBmaWVsZC4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gcmVuZGVyIGFuIGh0bWxfZG9jdW1lbnQgd2l0aCBhIGZsb2F0aW5nIHRhYmxlIG9mIGNvbnRlbnRzLCB5b3UnZCB1c2U6DQoNCj4gb3V0cHV0OiA8L2JyPg0KICBodG1sX2RvY3VtZW50OjwvYnI+DQogICAgdG9jOiB0cnVlPC9icj4NCiAgICB0b2NfZmxvYXQ6IHRydWU8L3A+DQogICAgDQpZb3UgY2FuIGV2ZW4gcmVuZGVyIHRvIG11bHRpcGxlIG91dHB1dHMgYnkgc3VwcGx5aW5nIGEgbGlzdCBvZiBmb3JtYXRzOg0Kb3V0cHV0Og0KICANCj4gIGh0bWxfZG9jdW1lbnQ6PC9icj4NCiAgICB0b2M6IHRydWU8L2JyPg0KICAgIHRvY19mbG9hdDogdHJ1ZSA8L2JyPg0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQgPC9wPiAgDQogIA0KKioqDQoNCiMgRG9jdW1lbnRzDQpUaGUgcHJldmlvdXMgY2hhcHRlciBmb2N1c3NlZCBvbiB0aGUgZGVmYXVsdCBodG1sX2RvY3VtZW50IG91dHB1dC4gVGhlcmUgYXJlIG51bWJlciBvZiBiYXNpYyB2YXJpYXRpb25zIG9uIHRoYXQgdGhlbWUsIGdlbmVyYXRpbmcgZGlmZmVyZW50IHR5cGVzIG9mIGRvY3VtZW50czoNCg0KKiBwZGZfZG9jdW1lbnQgbWFrZXMgYSBQREYgd2l0aCBMYVRlWCAoYW4gb3BlbiBzb3VyY2UgZG9jdW1lbnQgbGF5b3V0IHN5c3RlbSksIHdoaWNoIHlvdSdsbCBuZWVkIHRvIGluc3RhbGwuIFJTdHVkaW8gd2lsbCBwcm9tcHQgeW91IGlmIHlvdSBkb24ndCBhbHJlYWR5IGhhdmUgaXQuDQoNCiogd29yZF9kb2N1bWVudCBmb3IgTWljcm9zb2Z0IFdvcmQgZG9jdW1lbnRzICguZG9jeCkuDQoNCiogb2R0X2RvY3VtZW50IGZvciBPcGVuRG9jdW1lbnQgVGV4dCBkb2N1bWVudHMgKC5vZHQpLg0KDQoqIHJ0Zl9kb2N1bWVudCBmb3IgUmljaCBUZXh0IEZvcm1hdCAoLnJ0ZikgZG9jdW1lbnRzLg0KDQoqIG1kX2RvY3VtZW50IGZvciBhIE1hcmtkb3duIGRvY3VtZW50LiBUaGlzIGlzbid0IHR5cGljYWxseSB1c2VmdWwgYnkgaXRzZWxmLCBidXQgeW91IG1pZ2h0IHVzZSBpdCBpZiwgZm9yIGV4YW1wbGUsIHlvdXIgY29ycG9yYXRlIENNUyBvciBsYWIgd2lraSB1c2VzIG1hcmtkb3duLg0KDQoqIGdpdGh1Yl9kb2N1bWVudDogdGhpcyBpcyBhIHRhaWxvcmVkIHZlcnNpb24gb2YgbWRfZG9jdW1lbnQgZGVzaWduZWQgZm9yIHNoYXJpbmcgb24gR2l0SHViLg0KDQpSZW1lbWJlciwgd2hlbiBnZW5lcmF0aW5nIGEgZG9jdW1lbnQgdG8gc2hhcmUgd2l0aCBkZWNpc2lvbiBtYWtlcnMsIHlvdSBjYW4gdHVybiBvZmYgdGhlIGRlZmF1bHQgZGlzcGxheSBvZiBjb2RlIGJ5IHNldHRpbmcgZ2xvYmFsIG9wdGlvbnMgaW4gdGhlIHNldHVwIGNodW5rOg0KDQo+IGtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpDQoNCg0KRm9yIGh0bWxfZG9jdW1lbnRzIGFub3RoZXIgb3B0aW9uIGlzIHRvIG1ha2UgdGhlIGNvZGUgY2h1bmtzIGhpZGRlbiBieSBkZWZhdWx0LCBidXQgdmlzaWJsZSB3aXRoIGEgY2xpY2s6DQoNCj4gb3V0cHV0OiA8L2JyPg0KICBodG1sX2RvY3VtZW50OiA8L2JyPg0KICAgIGNvZGVfZm9sZGluZzogaGlkZSA8L3A+DQogICAgDQojIE5vdGVib29rcw0KQSBub3RlYm9vaywgaHRtbF9ub3RlYm9vaywgaXMgYSB2YXJpYXRpb24gb24gYSBodG1sX2RvY3VtZW50LiBUaGUgcmVuZGVyZWQgb3V0cHV0cyBhcmUgdmVyeSBzaW1pbGFyLCBidXQgdGhlIHB1cnBvc2UgaXMgZGlmZmVyZW50LiBBIGh0bWxfZG9jdW1lbnQgaXMgZm9jdXNzZWQgb24gY29tbXVuaWNhdGluZyB3aXRoIGRlY2lzaW9uIG1ha2Vycywgd2hpbGUgYSBub3RlYm9vayBpcyBmb2N1c3NlZCBvbiBjb2xsYWJvcmF0aW5nIHdpdGggb3RoZXIgZGF0YSBzY2llbnRpc3RzLiBUaGVzZSBkaWZmZXJlbnQgcHVycG9zZXMgbGVhZCB0byB1c2luZyB0aGUgSFRNTCBvdXRwdXQgaW4gZGlmZmVyZW50IHdheXMuIEJvdGggSFRNTCBvdXRwdXRzIHdpbGwgY29udGFpbiB0aGUgZnVsbHkgcmVuZGVyZWQgb3V0cHV0LCBidXQgdGhlIG5vdGVib29rIGFsc28gY29udGFpbnMgdGhlIGZ1bGwgc291cmNlIGNvZGUuIFRoYXQgbWVhbnMgeW91IGNhbiB1c2UgdGhlIC5uYi5odG1sIGdlbmVyYXRlZCBieSB0aGUgbm90ZWJvb2sgaW4gdHdvIHdheXM6DQoNCjEuIFlvdSBjYW4gdmlldyBpdCBpbiBhIHdlYiBicm93c2VyLCBhbmQgc2VlIHRoZSByZW5kZXJlZCBvdXRwdXQuIFVubGlrZSBodG1sX2RvY3VtZW50LCB0aGlzIHJlbmRlcmluZyBhbHdheXMgaW5jbHVkZXMgYW4gZW1iZWRkZWQgY29weSBvZiB0aGUgc291cmNlIGNvZGUgdGhhdCBnZW5lcmF0ZWQgaXQuDQoNCjIuIFlvdSBjYW4gZWRpdCBpdCBpbiBSU3R1ZGlvLiBXaGVuIHlvdSBvcGVuIGFuIC5uYi5odG1sIGZpbGUsIFJTdHVkaW8gd2lsbCBhdXRvbWF0aWNhbGx5IHJlY3JlYXRlIC5SbWQgZmlsZSB0aGF0IGdlbmVyYXRlZCBpdC4gSW4gdGhlIGZ1dHVyZSwgeW91IHdpbGwgYWxzbyBiZSBhYmxlIGluY2x1ZGUgc3VwcG9ydGluZyBmaWxlcyAoZS5nLiAuY3N2IGRhdGEgZmlsZXMpLCB3aGljaCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZXh0cmFjdGVkIHdoZW4gbmVlZGVkLg0KDQpFbWFpbGluZyAubmIuaHRtbCBmaWxlcyBpcyBhIHNpbXBsZSB3YXkgdG8gc2hhcmUgYW5hbHlzZXMgd2l0aCB5b3VyIGNvbGxlYWd1ZXMuIEJ1dCB0aGluZ3Mgd2lsbCBnZXQgcGFpbmZ1bCBhcyBzb29uIGFzIHRoZXkgd2FudCB0byBtYWtlIGNoYW5nZXMuIElmIHRoaXMgc3RhcnRzIHRvIGhhcHBlbiwgaXQncyBhIGdvb2QgdGltZSB0byBsZWFybiBHaXQgYW5kIEdpdEh1Yi4gTGVhcm5pbmcgR2l0IGFuZCBHaXRIdWIgaXMgZGVmaW5pdGVseSBwYWluZnVsIGF0IGZpcnN0LCBidXQgdGhlIGNvbGxhYm9yYXRpb24gcGF5b2ZmIGlzIGh1Z2UuIEFzIG1lbnRpb25lZCBlYXJsaWVyLCBHaXQgYW5kIEdpdEh1YiBhcmUgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhlIGJvb2ssIGJ1dCB0aGVyZSdzIG9uZSB0aXAgdGhhdCdzIHVzZWZ1bCBpZiB5b3UncmUgYWxyZWFkeSB1c2luZyB0aGVtOiB1c2UgYm90aCBodG1sX25vdGVib29rIGFuZCBnaXRodWJfZG9jdW1lbnQgb3V0cHV0czogDQoNCj4gT3V0cHV0OiA8L2JyPg0KICBodG1sX25vdGVib29rOiBkZWZhdWx0IDwvYnI+DQogIGdpdGh1Yl9kb2N1bWVudDogZGVmYXVsdCA8L3A+DQogIA0KaHRtbF9ub3RlYm9vayBnaXZlcyB5b3UgYSBsb2NhbCBwcmV2aWV3LCBhbmQgYSBmaWxlIHRoYXQgeW91IGNhbiBzaGFyZSB2aWEgZW1haWwuIGdpdGh1Yl9kb2N1bWVudCBjcmVhdGVzIGEgbWluaW1hbCBtZCBmaWxlIHRoYXQgeW91IGNhbiBjaGVjayBpbnRvIGdpdC4gWW91IGNhbiBlYXNpbHkgc2VlIGhvdyB0aGUgcmVzdWx0cyBvZiB5b3VyIGFuYWx5c2lzIChub3QganVzdCB0aGUgY29kZSkgY2hhbmdlIG92ZXIgdGltZSwgYW5kIEdpdEh1YiB3aWxsIHJlbmRlciBpdCBmb3IgeW91IG5pY2VseSBvbmxpbmUuDQoNCiMgUHJlc2VudGF0aW9ucw0KDQpZb3UgY2FuIGFsc28gdXNlIFIgTWFya2Rvd24gdG8gcHJvZHVjZSBwcmVzZW50YXRpb25zLiBZb3UgZ2V0IGxlc3MgdmlzdWFsIGNvbnRyb2wgdGhhbiB3aXRoIGEgdG9vbCBsaWtlIEtleW5vdGUgb3IgUG93ZXJQb2ludCwgYnV0IGF1dG9tYXRpY2FsbHkgaW5zZXJ0aW5nIHRoZSByZXN1bHRzIG9mIHlvdXIgUiBjb2RlIGludG8gYSBwcmVzZW50YXRpb24gY2FuIHNhdmUgYSBodWdlIGFtb3VudCBvZiB0aW1lLiBQcmVzZW50YXRpb25zIHdvcmsgYnkgZGl2aWRpbmcgeW91ciBjb250ZW50IGludG8gc2xpZGVzLCB3aXRoIGEgbmV3IHNsaWRlIGJlZ2lubmluZyBhdCBlYWNoIGZpcnN0ICgjKSBvciBzZWNvbmQgKCMjKSBsZXZlbCBoZWFkZXIuIFlvdSBjYW4gYWxzbyBpbnNlcnQgYSBob3Jpem9udGFsIHJ1bGUgKCoqKikgdG8gY3JlYXRlIGEgbmV3IHNsaWRlIHdpdGhvdXQgYSBoZWFkZXIuIDwvcD4NCg0KUiBNYXJrZG93biBjb21lcyB3aXRoIHRocmVlIHByZXNlbnRhdGlvbnMgZm9ybWF0cyBidWlsdC1pbjoNCg0KMS4gaW9zbGlkZXNfcHJlc2VudGF0aW9uIC0gSFRNTCBwcmVzZW50YXRpb24gd2l0aCBpb3NsaWRlcw0KDQoyLiBzbGlkeV9wcmVzZW50YXRpb24gLSBIVE1MIHByZXNlbnRhdGlvbiB3aXRoIFczQyBTbGlkeQ0KDQozLiBiZWFtZXJfcHJlc2VudGF0aW9uIC0gUERGIHByZXNlbnRhdGlvbiB3aXRoIExhVGVYIEJlYW1lci4NCg0KVHdvIG90aGVyIHBvcHVsYXIgZm9ybWF0cyBhcmUgcHJvdmlkZWQgYnkgcGFja2FnZXM6DQoNCjEuIHJldmVhbGpzOjpyZXZlYWxqc19wcmVzZW50YXRpb24gLSBIVE1MIHByZXNlbnRhdGlvbiB3aXRoIHJldmVhbC5qcy4gUmVxdWlyZXMgdGhlIHJldmVhbGpzIHBhY2thZ2UuDQoNCjIuIHJtZHNob3dlciwgaHR0cHM6Ly9naXRodWIuY29tL01hbmdvVGhlQ2F0L3JtZHNob3dlciwgcHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgc2hvd2VyLCBodHRwczovL2dpdGh1Yi5jb20vc2hvd2VyL3Nob3dlciwgcHJlc2VudGF0aW9uIGVuZ2luZQ0KDQojIERhc2hib2FyZHMNCg0KRGFzaGJvYXJkcyBhcmUgYSB1c2VmdWwgd2F5IHRvIGNvbW11bmljYXRlIGxhcmdlIGFtb3VudHMgb2YgaW5mb3JtYXRpb24gdmlzdWFsbHkgYW5kIHF1aWNrbHkuIEZsZXhkYXNoYm9hcmQgbWFrZXMgaXQgcGFydGljdWxhcmx5IGVhc3kgdG8gY3JlYXRlIGRhc2hib2FyZHMgdXNpbmcgUiBNYXJrZG93biBhbmQgYSBjb252ZW50aW9uIGZvciBob3cgdGhlIGhlYWRlcnMgYWZmZWN0IHRoZSBsYXlvdXQ6DQoNCiogRWFjaCBsZXZlbCAxIGhlYWRlciAoIykgYmVnaW5zIGEgbmV3IHBhZ2UgaW4gdGhlIGRhc2hib2FyZC4NCiogRWFjaCBsZXZlbCAyIGhlYWRlciAoIyMpIGJlZ2lucyBhIG5ldyBjb2x1bW4uDQoqIEVhY2ggbGV2ZWwgMyBoZWFkZXIgKCMjIykgYmVnaW5zIGEgbmV3IHJvdy4NCg0KRm9yIGV4YW1wbGUsIHlvdSBjYW4gcHJvZHVjZSB0aGlzIGRhc2hib2FyZDoNCjxpbWcgc3JjPSJodHRwOi8vcjRkcy5oYWQuY28ubnovc2NyZWVuc2hvdHMvcm1hcmtkb3duLWZsZXhkYXNoYm9hcmQucG5nIiAvPg0KDQoNCg0KIyBJbnRlcmFjdGl2aXR5IA0KDQpBbnkgSFRNTCBmb3JtYXQgKGRvY3VtZW50LCBub3RlYm9vaywgcHJlc2VudGF0aW9uLCBvciBkYXNoYm9hcmQpIGNhbiBjb250YWluIGludGVyYWN0aXZlIGNvbXBvbmVudHMuIDwvcD4NCg0KIyMgaHRtbHdpZGdldHMNCkhUTUwgaXMgYW4gaW50ZXJhY3RpdmUgZm9ybWF0LCBhbmQgeW91IGNhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGF0IGludGVyYWN0aXZpdHkgd2l0aCBodG1sd2lkZ2V0cywgUiBmdW5jdGlvbnMgdGhhdCBwcm9kdWNlIGludGVyYWN0aXZlIEhUTUwgdmlzdWFsaXNhdGlvbnMuIEZvciBleGFtcGxlLCB0YWtlIHRoZSBsZWFmbGV0IG1hcCBiZWxvdy4gSWYgeW91J3JlIHZpZXdpbmcgdGhpcyBwYWdlIG9uIHRoZSB3ZWIsIHlvdSBjYW4gZHJhZyB0aGUgbWFwIGFyb3VuZCwgem9vbSBpbiBhbmQgb3V0LCBldGMuIFlvdSBvYnZpb3VzbHkgY2FuJ3QgZG8gdGhhdCBvbiBhIGJvb2ssIHNvIHJtYXJrZG93biBhdXRvbWF0aWNhbGx5IGluc2VydHMgYSBzdGF0aWMgc2NyZWVuc2hvdCBmb3IgeW91Lg0KDQo8aW1nIHNyYz0iaHR0cDovL2MudGlsZS5vcGVuc3RyZWV0bWFwLm9yZy8xNi82NDU4My8zOTk5OS5wbmciIC8+DQoNClRoZSBncmVhdCB0aGluZyBhYm91dCBodG1sd2lkZ2V0cyBpcyB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgSFRNTCBvciBKYXZhU2NyaXB0IHRvIHVzZSB0aGVtLiBBbGwgdGhlIGRldGFpbHMgYXJlIHdyYXBwZWQgaW5zaWRlIHRoZSBwYWNrYWdlLCBzbyB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBpdC4gPC9wPg0KDQpUaGVyZSBhcmUgbWFueSBwYWNrYWdlcyB0aGF0IHByb3ZpZGUgaHRtbHdpZGdldHMsIGluY2x1ZGluZzoNCg0KKiBkeWdyYXBocywgaHR0cDovL3JzdHVkaW8uZ2l0aHViLmlvL2R5Z3JhcGhzLywgZm9yIGludGVyYWN0aXZlIHRpbWUgc2VyaWVzIHZpc3VhbGlzYXRpb25zLg0KDQoqIERULCBodHRwOi8vcnN0dWRpby5naXRodWIuaW8vRFQvLCBmb3IgaW50ZXJhY3RpdmUgdGFibGVzLg0KDQoqIHRocmVlanMsIGh0dHBzOi8vZ2l0aHViLmNvbS9id2xld2lzL3J0aHJlZWpzIGZvciBpbnRlcmFjdGl2ZSAzZCBwbG90cy4NCg0KKiBEaWFncmFtbWVSLCBodHRwOi8vcmljaC1pYW5ub25lLmdpdGh1Yi5pby9EaWFncmFtbWVSLyBmb3IgZGlhZ3JhbXMgKGxpa2UgZmxvdyBjaGFydHMgYW5kIHNpbXBsZSBub2RlLWxpbmsgZGlhZ3JhbXMpLg0KDQpUbyBsZWFybiBtb3JlIGFib3V0IGh0bWx3aWRnZXRzIGFuZCBzZWUgYSBtb3JlIGNvbXBsZXRlIGxpc3Qgb2YgcGFja2FnZXMgdGhhdCBwcm92aWRlIHRoZW0gdmlzaXQgaHR0cDovL3d3dy5odG1sd2lkZ2V0cy5vcmcvLiA8L3A+DQoNCiMgU2hpbnkNCg0KaHRtbHdpZGdldHMgcHJvdmlkZSBjbGllbnQtc2lkZSBpbnRlcmFjdGl2aXR5IC0gYWxsIHRoZSBpbnRlcmFjdGl2aXR5IGhhcHBlbnMgaW4gdGhlIGJyb3dzZXIsIGluZGVwZW5kZW50bHkgb2YgUi4gT24gb25lIGhhbmQsIHRoYXQncyBncmVhdCBiZWNhdXNlIHlvdSBjYW4gZGlzdHJpYnV0ZSB0aGUgSFRNTCBmaWxlIHdpdGhvdXQgYW55IGNvbm5lY3Rpb24gdG8gUi4gSG93ZXZlciwgdGhhdCBmdW5kYW1lbnRhbGx5IGxpbWl0cyB3aGF0IHlvdSBjYW4gZG8gdG8gdGhpbmdzIHRoYXQgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGluIEhUTUwgYW5kIEphdmFTY3JpcHQuIEFuIGFsdGVybmF0aXZlIGFwcHJvYWNoIGlzIHRvIHVzZSBzaGlueSwgYSBwYWNrYWdlIHRoYXQgYWxsb3dzIHlvdSB0byBjcmVhdGUgaW50ZXJhY3Rpdml0eSB1c2luZyBSIGNvZGUsIG5vdCBKYXZhU2NyaXB0LiA8L3A+DQoNClRvIGNhbGwgU2hpbnkgY29kZSBmcm9tIGFuIFIgTWFya2Rvd24gZG9jdW1lbnQsIGFkZCBydW50aW1lOiBzaGlueSB0byB0aGUgaGVhZGVyOg0KPiB0aXRsZTogInNoaW55IFdlYiBhcHAiIDwvYnI+DQpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQgPC9icj4NCnJ1bnRpbWU6IHNoaW55IDwvcD4NCg0KVGhlbiB5b3UgY2FuIHVzZSB0aGUgImlucHV0IiBmdW5jdGlvbnMgdG8gYWRkIGludGVyYWN0aXZlIGNvbXBvbmVudHMgdG8gdGhlIGRvY3VtZW50Og0KDQo+IGxpYnJhcnkoc2hpbnkpIDwvYnI+DQp0ZXh0SW5wdXQoIm5hbWUiLCAiV2hhdCBpcyB5b3VyIG5hbWU/IikgPC9icj4NCm51bWVyaWNJbnB1dCgiYWdlIiwgIkhvdyBvbGQgYXJlIHlvdSA/IiwgTkEsIG1pbj0wLCBtYXg9IDE1MCkgPC9wPg0KDQo8aW1nIHNyYz0iaHR0cDovL3I0ZHMuaGFkLmNvLm56L3NjcmVlbnNob3RzL3JtYXJrZG93bi1zaGlueS5wbmciIC8+DQoNCllvdSBjYW4gdGhlbiByZWZlciB0byB0aGUgdmFsdWVzIHdpdGggaW5wdXQkbmFtZSBhbmQgaW5wdXQkYWdlLCBhbmQgdGhlIGNvZGUgdGhhdCB1c2VzIHRoZW0gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlLXJ1biB3aGVuZXZlciB0aGV5IGNoYW5nZS4NCg0KSSBjYW4ndCBzaG93IHlvdSBhIGxpdmUgc2hpbnkgYXBwIGhlcmUgYmVjYXVzZSBzaGlueSBpbnRlcmFjdGlvbnMgb2NjdXIgb24gdGhlIHNlcnZlci1zaWRlLiBUaGlzIG1lYW5zIHlvdSBjYW4gd3JpdGUgaW50ZXJhY3RpdmUgYXBwcyB3aXRob3V0IGtub3dpbmcgSmF2YVNjcmlwdCwgYnV0IGl0IG1lYW5zIHRoYXQgeW91IG5lZWQgYSBzZXJ2ZXIgdG8gcnVuIGl0IG9uLiBUaGlzIGludHJvZHVjZXMgYSBsb2dpc3RpY2FsIGlzc3VlOiBTaGlueSBhcHBzIG5lZWQgYSBTaGlueSBzZXJ2ZXIgdG8gYmUgcnVuIG9ubGluZS4gV2hlbiB5b3UgcnVuIHNoaW55IGFwcHMgb24geW91ciBvd24gY29tcHV0ZXIsIHNoaW55IGF1dG9tYXRpY2FsbHkgc2V0cyB1cCBhIHNoaW55IHNlcnZlciBmb3IgeW91LCBidXQgeW91IG5lZWQgYSBwdWJsaWMgZmFjaW5nIHNoaW55IHNlcnZlciBpZiB5b3Ugd2FudCB0byBwdWJsaXNoIHRoaXMgc29ydCBvZiBpbnRlcmFjdGl2aXR5IG9ubGluZS4gVGhhdCdzIHRoZSBmdW5kYW1lbnRhbCB0cmFkZS1vZmYgb2Ygc2hpbnk6IHlvdSBjYW4gZG8gYW55dGhpbmcgaW4gYSBzaGlueSBkb2N1bWVudCB0aGF0IHlvdSBjYW4gZG8gaW4gUiwgYnV0IGl0IHRoYXQgcmVxdWlyZXMgc29tZW9uZSB0byBiZSBydW5uaW5nIFIuDQoNCkxlYXJuIG1vcmUgYWJvdXQgU2hpbnkgYXQgaHR0cDovL3NoaW55LnJzdHVkaW8uY29tLy4NCjwvcD4NCg0KIyBXZWJzaXRlcw0KDQpXaXRoIGEgbGl0dGxlIGFkZGl0aW9uYWwgaW5mcmFzdHJ1Y3R1cmUgeW91IGNhbiB1c2UgUiBNYXJrZG93biB0byBnZW5lcmF0ZSBhIGNvbXBsZXRlIHdlYnNpdGU6IDwvYnI+DQoNCiogUHV0IHlvdXIgLlJtZCBmaWxlcyBpbiBhIHNpbmdsZSBkaXJlY3RvcnkuIGluZGV4LlJtZCB3aWxsIGJlY29tZSB0aGUgaG9tZSBwYWdlLg0KDQoqIEFkZCBhIFlBTUwgZmlsZSBuYW1lZCBfc2l0ZS55bWwgcHJvdmlkZXMgdGhlIG5hdmlnYXRpb24gZm9yIHRoZSBzaXRlLiBGb3IgZXhhbXBsZTogPC9icj4NCg0KbmFtZTogIm15LXdlYnNpdGUiDQpuYXZiYXI6DQogIHRpdGxlOiAiTXkgV2Vic2l0ZSINCiAgbGVmdDoNCiAgICAtIHRleHQ6ICJIb21lIg0KICAgICAgaHJlZjogaW5kZXguaHRtbA0KICAgIC0gdGV4dDogIlZpcmlkaXMgQ29sb3JzIg0KICAgICAgaHJlZjogMS1leGFtcGxlLmh0bWwNCiAgICAtIHRleHQ6ICJUZXJyYWluIENvbG9ycyINCiAgICAgIGhyZWY6IDMtaW5saW5lLmh0bWwNCiAgICAgIA0KICAgICAgDQpFeGVjdXRlIHJtYXJrZG93bjo6cmVuZGVyX3NpdGUoKSB0byBidWlsZCBfc2l0ZSwgYSBkaXJlY3Rvcnkgb2YgZmlsZXMgcmVhZHkgdG8gZGVwbG95IGFzIGEgc3RhbmRhbG9uZSBzdGF0aWMgd2Vic2l0ZSwgb3IgaWYgeW91IHVzZSBhbiBSU3R1ZGlvIFByb2plY3QgZm9yIHlvdXIgd2Vic2l0ZSBkaXJlY3RvcnkuIFJTdHVkaW8gd2lsbCBhZGQgYSBCdWlsZCB0YWIgdG8gdGhlIElERSB0aGF0IHlvdSBjYW4gdXNlIHRvIGJ1aWxkIGFuZCBwcmV2aWV3IHlvdXIgc2l0ZS4gPC9wPg0KDQpSZWFkIG1vcmUgYXQgaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbS9ybWFya2Rvd25fd2Vic2l0ZXMuaHRtbC4gPC9wPg0KDQojIE90aGVyIGZvcm1hdHMNCk90aGVyIHBhY2thZ2VzIHByb3ZpZGUgZXZlbiBtb3JlIG91dHB1dCBmb3JtYXRzOg0KDQoqIFRoZSBib29rZG93biBwYWNrYWdlLCBodHRwczovL2dpdGh1Yi5jb20vcnN0dWRpby9ib29rZG93biwgbWFrZXMgaXQgZWFzeSB0byB3cml0ZSBib29rcywgbGlrZSB0aGlzIG9uZS4gVG8gbGVhcm4gbW9yZSwgcmVhZCBBdXRob3JpbmcgQm9va3Mgd2l0aCBSIE1hcmtkb3duLCBieSBZaWh1aSBYaWUsIHdoaWNoIGlzLCBvZiBjb3Vyc2UsIHdyaXR0ZW4gaW4gYm9va2Rvd24uIFZpc2l0IGh0dHA6Ly93d3cuYm9va2Rvd24ub3JnIHRvIHNlZSBvdGhlciBib29rZG93biBib29rcyB3cml0dGVuIGJ5IHRoZSB3aWRlciBSIGNvbW11bml0eS4NCg0KKiBUaGUgcHJldHR5ZG9jIHBhY2thZ2UsIGh0dHBzOi8vZ2l0aHViLmNvbS95aXh1YW4vcHJldHR5ZG9jLywgcHJvdmlkZXMgbGlnaHR3ZWlnaHQgZG9jdW1lbnQgZm9ybWF0cyB3aXRoIGEgcmFuZ2Ugb2YgYXR0cmFjdGl2ZSB0aGVtZXMuDQoNCiogVGhlIHJ0aWNsZXMgcGFja2FnZSwgaHR0cHM6Ly9naXRodWIuY29tL3JzdHVkaW8vcnRpY2xlcywgY29tcGlsZXMgYSBzZWxlY3Rpb24gb2YgZm9ybWF0cyB0YWlsb3JlZCBmb3Igc3BlY2lmaWMgc2NpZW50aWZpYyBqb3VybmFscy4NCg0KU2VlIGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vZm9ybWF0cy5odG1sIGZvciBhIGxpc3Qgb2YgZXZlbiBtb3JlIGZvcm1hdHMuIFlvdSBjYW4gYWxzbyBjcmVhdGUgeW91ciBvd24gYnkgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbnMgYXQgaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbS9kZXZlbG9wZXJfY3VzdG9tX2Zvcm1hdHMuaHRtbC4NCg0KIyBMZWFybmluZyBNb3JlDQoNClRvIGxlYXJuIG1vcmUgYWJvdXQgZWZmZWN0aXZlIGNvbW11bmljYXRpb24gaW4gdGhlc2UgZGlmZmVyZW50IGZvcm1hdHMgSSByZWNvbW1lbmQgdGhlIGZvbGxvd2luZyByZXNvdXJjZXM6DQoNCiogVG8gaW1wcm92ZSB5b3VyIHByZXNlbnRhdGlvbiBza2lsbHMsIEkgcmVjb21tZW5kIFByZXNlbnRhdGlvbiBQYXR0ZXJucywgYnkgTmVhbCBGb3JkLCBNYXR0aGV3IE1jQ29sbG91Z2gsIGFuZCBOYXRoYW5pZWwgU2NodXR0YS4gSXQgcHJvdmlkZXMgYSBzZXQgb2YgZWZmZWN0aXZlIHBhdHRlcm5zIChib3RoIGxvdy0gYW5kIGhpZ2gtbGV2ZWwpIHRoYXQgeW91IGNhbiBhcHBseSB0byBpbXByb3ZlIHlvdXIgcHJlc2VudGF0aW9ucy4NCg0KKiBJZiB5b3UgZ2l2ZSBhY2FkZW1pYyB0YWxrcywgSSByZWNvbW1lbmQgcmVhZGluZyB0aGUgTGVlayBncm91cCBndWlkZSB0byBnaXZpbmcgdGFsa3MuDQoNCiogSSBoYXZlbid0IHRha2VuIGl0IG15c2VsZiwgYnV0IEkndmUgaGVhcmQgZ29vZCB0aGluZ3MgYWJvdXQgTWF0dCBNY0dhcnJpdHkncyBvbmxpbmUgY291cnNlIG9uIHB1YmxpYyBzcGVha2luZzogaHR0cHM6Ly93d3cuY291cnNlcmEub3JnL2xlYXJuL3B1YmxpYy1zcGVha2luZy4NCg0KKiBJZiB5b3UgYXJlIGNyZWF0aW5nIGEgbG90IG9mIGRhc2hib2FyZHMsIG1ha2Ugc3VyZSB0byByZWFkIFN0ZXBoZW4gRmV3J3MgSW5mb3JtYXRpb24gRGFzaGJvYXJkIERlc2lnbjogVGhlIEVmZmVjdGl2ZSBWaXN1YWwgQ29tbXVuaWNhdGlvbiBvZiBEYXRhLiBJdCB3aWxsIGhlbHAgeW91IGNyZWF0ZSBkYXNoYm9hcmRzIHRoYXQgYXJlIHRydWx5IHVzZWZ1bCwgbm90IGp1c3QgcHJldHR5IHRvIGxvb2sgYXQuDQoNCiogRWZmZWN0aXZlbHkgY29tbXVuaWNhdGluZyB5b3VyIGlkZWFzIG9mdGVuIGJlbmVmaXRzIGZyb20gc29tZSBrbm93bGVkZ2Ugb2YgZ3JhcGhpYyBkZXNpZ24uIFRoZSBOb24tRGVzaWduZXIncyBEZXNpZ24gQm9vayBpcyBhIGdyZWF0IHBsYWNlIHRvIHN0YXJ0Lg0KDQo=