The notebook is more of a visualization workshop using polling data as working examples. It is NOT meant to provide any in-depth political insights, nor is it to draw any solid conclusion on the result of the election.


Prerequisites

Platform

The source data contains traditional Chinese characters encoded in UTF-8. To avoid troublesome encoding issues (especially in a Windows platform with a default CP1252 code page), the codes in this notebook are only tested on Ubuntu and macOS. Codes are in general still working under Windows. Just that some code chunks may not be able to print out unicode characters nicely.

Data

Election Data

We use minimally pre-processed data for our analytics. Please refer to the repo TW_Presidential_Election_2020 for details about the pre-processing logic. To directly download the archives please visit here. We put the uncompressed files under data/processed at our project root directory.

Map Data

For Taiwan map information, the shp file (shapefile) can be downloaded at GADM.org. We put the unzipped files under data/map at our project root directory.

Dependencies

Additional dependencies are required for Linux machine in order to do map plotting. Here is the instruction for Ubuntu.

Install gdal:

sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable
sudo apt update
sudo apt install libgdal-dev

Install ubunits:

sudo apt install libudunits2-dev

After installation of the above packages, we can then install and import the following R packages for this project:

library(data.table)

# For viualization.
library(ggplot2)
library(ggrepel)
library(plotly)
library(RColorBrewer)
library(patchwork)

# Fix macOS ggplot device to locate a Chinese font.
# To make `knitr` aware of this we also need to speficy `fig.showtext=TRUE` for chunks with ggplot output.
library(showtext)
font_add_google("Noto Serif", "noto")
showtext_auto()

# For spatial data visualization.
library(sf)

# For linear modeling with robust std err.
library(lmtest)
library(sandwich)

# To crawl wikipage to get all party representative colors.
library(rvest)

Plotting Devices

We use ggplot2 and plotly throughout the entire notebook. The former is the go-to library for static visualization using R. The latter is a modern interactive visualization framework built on top of d3.js. We can easily convert a static ggplot graph into an interactive plotly graph via the ggplotly API in R. But we can also code directly with the plot_ly API to enjoy all the supported interaction features.

In all the plotting examples we will choose either of the approach, just for fun. Really. :)

References on R Packages

Berger, Susanne, Nathaniel Graham, and Achim Zeileis. 2017. “Various Versatile Variances: An Object-Oriented Implementation of Clustered Covariances in R.” Working Paper 2017-12. Working Papers in Economics; Statistics, Research Platform Empirical; Experimental Economics, Universität Innsbruck. http://EconPapers.RePEc.org/RePEc:inn:wpaper:2017-12.

Dowle, Matt, and Arun Srinivasan. 2019. Data.table: Extension of ‘Data.frame‘. https://CRAN.R-project.org/package=data.table.

Neuwirth, Erich. 2014. RColorBrewer: ColorBrewer Palettes. https://CRAN.R-project.org/package=RColorBrewer.

Pebesma, Edzer. 2018. “Simple Features for R: Standardized Support for Spatial Vector Data.” The R Journal 10 (1): 439–46. https://doi.org/10.32614/RJ-2018-009.

Qiu, Yixuan, and authors/contributors of the included software. See file AUTHORS for details. 2019. Showtext: Using Fonts More Easily in R Graphs. https://CRAN.R-project.org/package=showtext.

Sievert, Carson. 2018. Plotly for R. https://plotly-r.com.

Slowikowski, Kamil. 2019. Ggrepel: Automatically Position Non-Overlapping Text Labels with ’Gplot2’. https://CRAN.R-project.org/package=ggrepel.

Wickham, Hadley. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.

———. 2019. Rvest: Easily Harvest (Scrape) Web Pages. https://CRAN.R-project.org/package=rvest.

Zeileis, Achim, and Torsten Hothorn. 2002. “Diagnostic Checking in Regression Relationships.” R News 2 (3): 7–10. https://CRAN.R-project.org/doc/Rnews/.

LS0tCnRpdGxlOiAiVmlzdWFsaXphdGlvbiBmb3IgVFcgR2VuZXJhbCBFbGVjdGlvbiIKc3VidGl0bGU6ICIyMDIwIFByZXNpZGVudGlhbCBhbmQgTGVnaXNsYXRpdmUgUmVzdWx0cyIKYXV0aG9yOgotIG5hbWU6IEt5bGUgQ2h1bmcKICBhZmZpbGlhdGlvbjoKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJWIgJVknKWAgTGFzdCBVcGRhdGVkICgxOSBKYW4gMjAyMCBGaXJzdCBVcGxvYWRlZCkiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBmaWdfd2lkdGg6IDguMzMKICAgIGZpZ19oZWlnaHQ6IDYuMjUKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGluY2x1ZGVzOgogICAgICBpbl9oZWFkZXI6IC90bXAvbWV0YV9oZWFkZXIuaHRtbAogICAgdGhlbWU6IHBhcGVyCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBjb2RlX2Rvd25sb2FkOiB0cnVlCmJpYmxpb2dyYXBoeTogdHdfZWxlY3Rpb25fMjAyMC5iaWIKbm9jaXRlOiB8CiAgQGRhdGEudGFibGUKICBAZ2dwbG90MgogIEBnZ3JlcGVsCiAgQHBsb3RseQogIEBSQ29sb3JCcmV3ZXIKICBAc2hvd3RleHQKICBAc2YKICBAbG10ZXN0CiAgQHNhbmR3aWNoCiAgQHJ2ZXN0CmxpbmstY2l0YXRpb25zOiB5ZXMKYWJzdHJhY3Q6IHwKICBUaGUgbm90ZWJvb2sgcHJvdmlkZXMgYSBuZWFybHktbmV1dHJhbCB2aXN1YWwgZGVzY3JpcHRpb24gb24gdGhlIDIwMjAgVGFpd2FuZXNlIHByZXNpZGVudGlhbCBhbmQgbGVnaXNsYXRpdmUgZWxlY3Rpb24gcmVzdWx0cy4gVGhlIHBvbGxpbmcgdG9vayBwbGFjZSBhdCAyMDIwLTAxLTExIGFuZCBkYXRhIGhhcyBiZWVuIGNvbGxlY3RlZCBieSBDZW50cmFsIEVsZWN0aW9uIENvbW1pc2lvbiAoQ0VDKSBhdCB0aGUgcG9sbGluZyBwbGFjZSBsZXZlbC4KLS0tCgpgYGB7ciBtZXRhLCBpbmNsdWRlPUZBTFNFfQptZXRhX2hlYWRlcl9maWxlIDwtIGZpbGUoIi90bXAvbWV0YV9oZWFkZXIuaHRtbCIpCgojIEFkZCBvcGVuIGdyYXBoIG1ldGEuCm1ldGEgPC0gYygKICAnPG1ldGEgbmFtZT0iYXV0aG9yIiBjb250ZW50PSJLeWxlIENodW5nIj4nLAogICc8bWV0YSBwcm9wZXJ0eT0ib2c6dGl0bGUiIGNvbnRlbnQ9IjIwMjAgVGFpd2FuZXNlIFByZXNpZGVudGlhbCBFbGVjdGlvbiBEYXRhIj4nLAogICc8bWV0YSBwcm9wZXJ0eT0ib2c6dHlwZSIgY29udGVudD0iYXJ0aWNsZSI+JywKICAnPG1ldGEgcHJvcGVydHk9Im9nOnVybCIgY29udGVudD0iaHR0cHM6Ly9ldmVyZGFyay5naXRodWIuaW8vazkvcHJvamVjdHMvdHdfZWxlY3Rpb25fMjAyMC90d19lbGVjdGlvbl8yMDIwLm5iLmh0bWwiPicsCiAgJzxtZXRhIHByb3BlcnR5PSJvZzppbWFnZSIgY29udGVudD0iaHR0cHM6Ly9ldmVyZGFyay5naXRodWIuaW8vazkvYXNzZXRzL3R3X2VsZWN0aW9uXzIwMjAucG5nIj4nLAogICc8bWV0YSBwcm9wZXJ0eT0ib2c6ZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgZGF0YSBzY2llbmNlIG5vdGVib29rIGFib3V0IDIwMjAgVGFpd2FuZXNlIHByZXNpZGVudGlhbCBlbGVjdGlvbi4iPicKKQpjb250ZW50cyA8LSBtZXRhCgojIEFkZCBHaXRodWIgY29ybmVyLgpnaXRodWJfY29ybmVyX3N2ZyA8LSAiLi4vLi4vYXNzZXRzL2dpdGh1Yl9jb3JuZXIuaHRtbCIKZ2l0aHViX2Nvcm5lcl9jb25mIDwtIGxpc3QoZ2l0aHViX2xpbms9Imh0dHBzOi8vZ2l0aHViLmNvbS9ldmVyZGFyay9rOS90cmVlL21hc3Rlci9wcm9qZWN0cy90d19lbGVjdGlvbl8yMDIwIikKY29udGVudHMgPC0gYyhjb250ZW50cywgc3RyaW5ncjo6c3RyX2ludGVycChyZWFkTGluZXMoZ2l0aHViX2Nvcm5lcl9zdmcpLCBnaXRodWJfY29ybmVyX2NvbmYpKQp3cml0ZUxpbmVzKGNvbnRlbnRzLCBtZXRhX2hlYWRlcl9maWxlKQoKY2xvc2UobWV0YV9oZWFkZXJfZmlsZSkKYGBgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy5hbGlnbj0iY2VudGVyIikKCiMgQ3VycmVudCBpc3N1ZXM6CiMgMS4gZmlnLmNhcCBkb2Vzbid0IHNlZW0gdG8gd29yayBmb3IgcGxvdGx5IHVuZGVyIGh0bWwgbm90ZWJvb2suIChXb3JrcyBmb3IgcHVyZSBodG1sIHRob3VnaC4pCiMKIyAyLiBwbG90bHkgd2l0aCBsb25nLWVub3VnaCB1bmljb2RlIGNoYXJhY3RlcnMgd2lsbCBjYXVzZSB0aGUgcmVuZGVyaW5nIGZhaWxlZC4KIyAgICBBIHdvcmthcm91bmQgaGFzIGJlZW4gaW1wbGVtZW50ZWQgaW4gdGhlIHJlbmRlciBzY3JpcHQuCiMgICAgaHR0cHM6Ly9naXRodWIuY29tL3JzdHVkaW8vcm1hcmtkb3duL2lzc3Vlcy8xNzYyCiMgMy4gcm1hcmtkb3duIDIuMCBjYW5ub3QgcmVuZXIgY2l0YXRpb24gZm9yIGh0bWwgbm90ZWJvb2suIFRoaXMgaXMgZml4ZWQgaW4gdGhlIGN1cnJlbnQgZGV2LgojIDQuIHBsb3RseTo6YWRkX2xpbmVzIGFsd2F5cyBhY3RzIGFzIGlmIGl0IGlzIGluICJtYXJrZXJzK2xpbmVzIiBtb2RlLiBBIGJ1Zz8KYGBgCgotLS0KCioqVGhlIG5vdGVib29rIGlzIG1vcmUgb2YgYSB2aXN1YWxpemF0aW9uIHdvcmtzaG9wIHVzaW5nIHBvbGxpbmcgZGF0YSBhcyB3b3JraW5nIGV4YW1wbGVzLioqCioqSXQgaXMgTk9UIG1lYW50IHRvIHByb3ZpZGUgYW55IGluLWRlcHRoIHBvbGl0aWNhbCBpbnNpZ2h0cywqKgoqKm5vciBpcyBpdCB0byBkcmF3IGFueSBzb2xpZCBjb25jbHVzaW9uIG9uIHRoZSByZXN1bHQgb2YgdGhlIGVsZWN0aW9uLioqCgotLS0KCiMgUHJlcmVxdWlzaXRlcyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIFBsYXRmb3JtCgpUaGUgc291cmNlIGRhdGEgY29udGFpbnMgdHJhZGl0aW9uYWwgQ2hpbmVzZSBjaGFyYWN0ZXJzIGVuY29kZWQgaW4gVVRGLTguClRvIGF2b2lkIHRyb3VibGVzb21lIGVuY29kaW5nIGlzc3VlcyAoZXNwZWNpYWxseSBpbiBhIFdpbmRvd3MgcGxhdGZvcm0gd2l0aCBhIGRlZmF1bHQgYENQMTI1MmAgY29kZSBwYWdlKSwKdGhlICoqY29kZXMgaW4gdGhpcyBub3RlYm9vayBhcmUgb25seSB0ZXN0ZWQgb24gVWJ1bnR1IGFuZCBtYWNPUy4qKgpDb2RlcyBhcmUgaW4gZ2VuZXJhbCBzdGlsbCB3b3JraW5nIHVuZGVyIFdpbmRvd3MuCkp1c3QgdGhhdCBzb21lIGNvZGUgY2h1bmtzIG1heSBub3QgYmUgYWJsZSB0byBwcmludCBvdXQgdW5pY29kZSBjaGFyYWN0ZXJzIG5pY2VseS4KCiMjIERhdGEKCiMjIyBFbGVjdGlvbiBEYXRhIHstfQoKV2UgdXNlIG1pbmltYWxseSBwcmUtcHJvY2Vzc2VkIGRhdGEgZm9yIG91ciBhbmFseXRpY3MuClBsZWFzZSByZWZlciB0byB0aGUgcmVwbyBbVFdfUHJlc2lkZW50aWFsX0VsZWN0aW9uXzIwMjBdKGh0dHBzOi8vZ2l0aHViLmNvbS9ldmVyZGFyay9UV19QcmVzaWRlbnRpYWxfRWxlY3Rpb25fMjAyMCkgZm9yIGRldGFpbHMgYWJvdXQgdGhlIHByZS1wcm9jZXNzaW5nIGxvZ2ljLgpUbyBkaXJlY3RseSBkb3dubG9hZCB0aGUgYXJjaGl2ZXMgcGxlYXNlIHZpc2l0IFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vZXZlcmRhcmsvVFdfUHJlc2lkZW50aWFsX0VsZWN0aW9uXzIwMjAvcmVsZWFzZXMvbGF0ZXN0KS4KV2UgcHV0IHRoZSB1bmNvbXByZXNzZWQgZmlsZXMgdW5kZXIgYGRhdGEvcHJvY2Vzc2VkYCBhdCBvdXIgcHJvamVjdCByb290IGRpcmVjdG9yeS4KCiMjIyBNYXAgRGF0YSB7LX0KCkZvciBUYWl3YW4gbWFwIGluZm9ybWF0aW9uLAp0aGUgYHNocGAgZmlsZSAoW3NoYXBlZmlsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2hhcGVmaWxlKSkgY2FuIGJlIGRvd25sb2FkZWQgYXQgW0dBRE0ub3JnXShodHRwczovL2dhZG0ub3JnL2Rvd25sb2FkX2NvdW50cnlfdjMuaHRtbCkuCldlIHB1dCB0aGUgdW56aXBwZWQgZmlsZXMgdW5kZXIgYGRhdGEvbWFwYCBhdCBvdXIgcHJvamVjdCByb290IGRpcmVjdG9yeS4KCiMjIERlcGVuZGVuY2llcwoKQWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgYXJlIHJlcXVpcmVkIGZvciBMaW51eCBtYWNoaW5lIGluIG9yZGVyIHRvIGRvIG1hcCBwbG90dGluZy4KSGVyZSBpcyB0aGUgaW5zdHJ1Y3Rpb24gZm9yIFVidW50dS4KCkluc3RhbGwgW2BnZGFsYF0oaHR0cHM6Ly9nZGFsLm9yZy8pOgoKYGBgc2gKc3VkbyBhZGQtYXB0LXJlcG9zaXRvcnkgcHBhOnVidW50dWdpcy91YnVudHVnaXMtdW5zdGFibGUKc3VkbyBhcHQgdXBkYXRlCnN1ZG8gYXB0IGluc3RhbGwgbGliZ2RhbC1kZXYKYGBgCgpJbnN0YWxsIGB1YnVuaXRzYDoKCmBgYHNoCnN1ZG8gYXB0IGluc3RhbGwgbGlidWR1bml0czItZGV2CmBgYAoKQWZ0ZXIgaW5zdGFsbGF0aW9uIG9mIHRoZSBhYm92ZSBwYWNrYWdlcywKd2UgY2FuIHRoZW4gaW5zdGFsbCBhbmQgaW1wb3J0IHRoZSBmb2xsb3dpbmcgUiBwYWNrYWdlcyBmb3IgdGhpcyBwcm9qZWN0OgoKYGBge3IgaW1wb3J0LCByZXN1bHRzPSJoaWRlIiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgY2xhc3Muc291cmNlPSJmb2xkLXNob3cifQpsaWJyYXJ5KGRhdGEudGFibGUpCgojIEZvciB2aXVhbGl6YXRpb24uCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3JlcGVsKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkocGF0Y2h3b3JrKQoKIyBGaXggbWFjT1MgZ2dwbG90IGRldmljZSB0byBsb2NhdGUgYSBDaGluZXNlIGZvbnQuCiMgVG8gbWFrZSBga25pdHJgIGF3YXJlIG9mIHRoaXMgd2UgYWxzbyBuZWVkIHRvIHNwZWZpY3kgYGZpZy5zaG93dGV4dD1UUlVFYCBmb3IgY2h1bmtzIHdpdGggZ2dwbG90IG91dHB1dC4KbGlicmFyeShzaG93dGV4dCkKZm9udF9hZGRfZ29vZ2xlKCJOb3RvIFNlcmlmIiwgIm5vdG8iKQpzaG93dGV4dF9hdXRvKCkKCiMgRm9yIHNwYXRpYWwgZGF0YSB2aXN1YWxpemF0aW9uLgpsaWJyYXJ5KHNmKQoKIyBGb3IgbGluZWFyIG1vZGVsaW5nIHdpdGggcm9idXN0IHN0ZCBlcnIuCmxpYnJhcnkobG10ZXN0KQpsaWJyYXJ5KHNhbmR3aWNoKQoKIyBUbyBjcmF3bCB3aWtpcGFnZSB0byBnZXQgYWxsIHBhcnR5IHJlcHJlc2VudGF0aXZlIGNvbG9ycy4KbGlicmFyeShydmVzdCkKYGBgCgojIyBQbG90dGluZyBEZXZpY2VzCgpXZSB1c2UgW2BnZ3Bsb3QyYF0oaHR0cHM6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcpIGFuZCBbYHBsb3RseWBdKGh0dHBzOi8vcGxvdC5seS8pIHRocm91Z2hvdXQgdGhlIGVudGlyZSBub3RlYm9vay4KVGhlIGZvcm1lciBpcyB0aGUgZ28tdG8gbGlicmFyeSBmb3Igc3RhdGljIHZpc3VhbGl6YXRpb24gdXNpbmcgUi4KVGhlIGxhdHRlciBpcyBhIG1vZGVybiBpbnRlcmFjdGl2ZSB2aXN1YWxpemF0aW9uIGZyYW1ld29yayBidWlsdCBvbiB0b3Agb2YgYGQzLmpzYC4KV2UgY2FuIGVhc2lseSBjb252ZXJ0IGEgc3RhdGljIGBnZ3Bsb3RgIGdyYXBoIGludG8gYW4gaW50ZXJhY3RpdmUgYHBsb3RseWAgZ3JhcGggdmlhIHRoZSBgZ2dwbG90bHlgIEFQSSBpbiBSLgpCdXQgd2UgY2FuIGFsc28gY29kZSBkaXJlY3RseSB3aXRoIHRoZSBgcGxvdF9seWAgQVBJIHRvIGVuam95IGFsbCB0aGUgc3VwcG9ydGVkIGludGVyYWN0aW9uIGZlYXR1cmVzLgoKSW4gYWxsIHRoZSBwbG90dGluZyBleGFtcGxlcyB3ZSB3aWxsIGNob29zZSBlaXRoZXIgb2YgdGhlIGFwcHJvYWNoLApqdXN0IGZvciBmdW4uClJlYWxseS4gOikKCiMgQmFja2dyb3VuZAoKKyBbMjAyMCAxNXRoIFRhaXdhbmVzZSBQcmVzaWRlbnRpYWwgRWxlY3Rpb25dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLzIwMjBfVGFpd2FuZXNlX3ByZXNpZGVudGlhbF9lbGVjdGlvbikKKyBbMjAyMCAxMHRoIFRhaXdhbmVzZSBMZWdpc2xhdGl2ZSBFbGVjdGlvbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvMjAyMF9UYWl3YW5lc2VfbGVnaXNsYXRpdmVfZWxlY3Rpb24pCgojIFZpc3VhbCBBbmFseXRpY3Mgb24gRWxlY3Rpb24gUmVzdWx0cyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxscyAjaGVhZH0KCiMjIOesrOWNgeS6lOWxhue4vee1semBuOiIiee1kOaenCBUaGUgMTV0aCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gUmVzdWx0cyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIyDmnInmlYjnpaggVmFsaWQgVm90ZSBDb3VudHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgpgYGB7ciBwYXJzZV90d19jb3VudHlfbWFwfQojIFJlYWQgc2hhcGVmaWxlIGZvciBzcGF0aWFsIGluZm9ybWF0aW9uIGFib3V0IGNvdW50aWVzIGluIFRhaXdhbi4KdHdfY291bnR5X3NmIDwtIHNmOjpzdF9yZWFkKCJkYXRhL21hcC9nYWRtMzZfVFdOXzIuc2hwIiwgcXVpZXQ9VFJVRSkKCiMgQWxpZ24gY291bnR5IG5hbWluZy4KdHdfY291bnR5X3NmJE5MX05BTUVfMiA8LSBnc3ViKCLlj7DkuK0iLCAi5Y+w5Lit5biCIiwgdHdfY291bnR5X3NmJE5MX05BTUVfMikKdHdfY291bnR5X3NmJE5MX05BTUVfMiA8LSBnc3ViKCLlj7DljZciLCAi5Y+w5Y2X5biCIiwgdHdfY291bnR5X3NmJE5MX05BTUVfMikKdHdfY291bnR5X3NmJE5MX05BTUVfMiA8LSBnc3ViKCLppqznpZbliJfls7YiLCAi6YCj5rGf57ijIiwgdHdfY291bnR5X3NmJE5MX05BTUVfMikKYGBgCgpgYGB7ciBwcm9jZXNzX3ByZXNpZGVudGlhbF9jb3VudHksIHJlc3VsdHM9ImhpZGUifQojIHByb2Nlc3MgY291bnR5LWxldmVsIHByZXNpZGVudGlhbCBlbGVjdGlvbiByZXN1bHRzLgpwX2NvdW50eSA8LSBmcmVhZCgiZGF0YS9wcm9jZXNzZWQvcHJlc2lkZW50aWFsL3ByZXNpZGVudGlhbF9jb3VudGllcy5jc3YiLCBlbmNvZGluZz0iVVRGLTgiKQpwX2NvdW50eSA8LSBwX2NvdW50eVssIFJlZ2lvbjo9dHJpbXdzKFJlZ2lvbiwgd2hpdGVzcGFjZT0iW1xcaFxcdl0iKV0gICMgVHJpbSBmdWxsLXdpZHRoIHdoaXRlIHNwYWNlLgpwX2NvdW50eSA8LSBwX2NvdW50eVssIFJlZ2lvbjo9Z3N1Yigi6Ie6IiwgIuWPsCIsIFJlZ2lvbildICAjIEFsaWduIGNoYXJhY3RlciB3aXRoIHNoYXBlZmlsZS4Kc2V0bmFtZXMocF9jb3VudHksICLmipXnpajnjodIIEg9Q8O3RyIsICJUdXJub3V0IikKCiMgRmluYWwgY291bnRzLgpjb2xzX2NhbmRpZGF0ZSA8LSBjKCIoMSkg5a6L5qWa55GcIOS9mea5mCIsICIoMikg6Z+T5ZyL55GcIOW8teWWhOaUvyIsICIoMykg6JSh6Iux5paHIOiztOa4heW+tyIpCnBfZmluYWwgPC0gYXMuZGF0YS50YWJsZShjb2xTdW1zKHBfY291bnR5WywgY29sc19jYW5kaWRhdGUsIHdpdGg9RkFMU0VdKSwga2VlcC5yb3duYW1lcz1UUlVFKQpzZXRuYW1lcyhwX2ZpbmFsLCBjKCJDYW5kaWRhdGUiLCAiVm90ZXMiKSkKcF9maW5hbCA8LSBwX2ZpbmFsWywgU2hhcmU6PVZvdGVzIC8gc3VtKFZvdGVzKV0KCiMgTWVyZ2Ugd2l0aCBzaHAgdG8gZ2V0IEVuZ2xpc2ggY291bnR5IG5hbWUuCnBfY291bnR5IDwtIG1lcmdlKHBfY291bnR5LCB0d19jb3VudHlfc2ZbLCBjKCJOTF9OQU1FXzIiLCAiTkFNRV8yIildLAogICAgICAgICAgICAgICAgICBieS55PSJOTF9OQU1FXzIiLCBieS54PSJSZWdpb24iKQpwX2NvdW50eSRnZW9tZXRyeSA8LU5VTEwKc2V0bmFtZXMocF9jb3VudHksICJOQU1FXzIiLCAiUmVnaW9uRW4iKQpwX2NvdW50eSA8LSBwX2NvdW50eVssIENvdW50eTo9cGFzdGUoUmVnaW9uLCBSZWdpb25FbildCgojIE1lbHQgZnJvbSB3aWRlIHRvIGxvbmcgZm9yIHBsb3R0aW5nIHB1cnBvc2UuCmNvbHNfcmVnaW9uIDwtIGMoIkNvdW50eSIsICJSZWdpb24iLCAiUmVnaW9uRW4iKQpwX2NvdW50eV9sIDwtIG1lbHQocF9jb3VudHlbLCBjKGNvbHNfcmVnaW9uLCBjb2xzX2NhbmRpZGF0ZSksIHdpdGg9RkFMU0VdLAogICAgICAgICAgICAgICAgICAgaWQudmFycz1jb2xzX3JlZ2lvbiwgdmFyaWFibGUubmFtZT0iQ2FuZGlkYXRlIiwgdmFsdWUubmFtZT0iVm90ZXMiKQpwX2NvdW50eV9sIDwtIHBfY291bnR5X2xbLCBDYW5kaWRhdGU6PWZhY3RvcihDYW5kaWRhdGUpXSAgIyBMZXZlbCBieSBjYW5kaWRhdGUgbnVtYmVyLgoKIyBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBEUFAgYW5kIEtNVCBieSBjb3VudHkuCnNldG9yZGVyKHBfY291bnR5X2wsIENvdW50eSwgQ2FuZGlkYXRlKQpwX2NvdW50eV9sIDwtIHBfY291bnR5X2xbLCBWb3Rlc19EaWZmOj1Wb3Rlc1szXSAtIFZvdGVzWzJdLCBieT0uKENvdW50eSldCgojIENvbXB1dGUgdG90YWwgdm90ZXMgYnkgY291bnR5LgpwX2NvdW50eV9sIDwtIHBfY291bnR5X2xbLCBUb3RhbF9Wb3Rlczo9c3VtKFZvdGVzKSwgYnk9LihDb3VudHkpXQoKIyBDb21wdXRlIHNoYXJlIGJ5IGNvdW50eS4KcF9jb3VudHlfbCA8LSBwX2NvdW50eV9sWywgVm90ZXNfU2hhcmU6PVZvdGVzIC8gVG90YWxfVm90ZXNdCnBfY291bnR5X2wgPC0gcF9jb3VudHlfbFssIFNoYXJlX0RpZmY6PVZvdGVzX1NoYXJlWzNdIC0gVm90ZXNfU2hhcmVbMl0sIGJ5PS4oQ291bnR5KV0KcF9jb3VudHlfZGlmZiA8LSB1bmlxdWUocF9jb3VudHlfbCwgYnk9IkNvdW50eSIpWwogICwgYyhjb2xzX3JlZ2lvbiwgIlRvdGFsX1ZvdGVzIiwgIlNoYXJlX0RpZmYiKSwgd2l0aD1GQUxTRV0KcF9jb3VudHlfZGlmZiA8LSBwX2NvdW50eV9kaWZmWywgZHBwX3dpbjo9U2hhcmVfRGlmZiA+IDBdCgojIEpvaW4gc2hhcmUgZGlmZiB0byBzcGF0aWFsIGRhdGFmcmFtZS4KdHdfY291bnR5X3NmIDwtIG1lcmdlKHR3X2NvdW50eV9zZiwgcF9jb3VudHlfZGlmZiwgYnkueD0iTkxfTkFNRV8yIiwgYnkueT0iUmVnaW9uIikKCiMgSm9pbiB0dXJub3V0IHRvIHNwYXRpYWwgZGF0YWZyYW1lLgp0d19jb3VudHlfc2YgPC0gbWVyZ2UodHdfY291bnR5X3NmLCBwX2NvdW50eVssIC4oUmVnaW9uLCBUdXJub3V0KV0sIGJ5Lng9Ik5MX05BTUVfMiIsIGJ5Lnk9IlJlZ2lvbiIpCgojIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIERQUCBhbmQgS01UIG9uIHRoZSB3aWRlIGRhdGEgYXMgd2VsbC4KcF9jb3VudHkgPC0gcF9jb3VudHlbLCBWb3RlX0RpZmY6PWdldCgiKDMpIOiUoeiLseaWhyDos7TmuIXlvrciKSAtIGdldCgiKDIpIOmfk+Wci+eRnCDlvLXlloTmlL8iKV0KcF9jb3VudHkgPC0gcF9jb3VudHlbLCBTaGFyZV9EaWZmOj1Wb3RlX0RpZmYgLyBnZXQoIuacieaViOelqOaVuEEgQT0xKzIrLi4uK04iKV0KCiMgQ29sb3IgY29uZmlndXJhdGlvbiBmb3IgbWFpbiBwYXJ0aWVzLgptYWluX3BhcnR5X2NvbG9ycyA8LSBjKCJkYXJrb3JhbmdlIiwgImRvZGdlcmJsdWUiLCAiZ3JlZW4zIikKYGBgCgpgYGB7ciBwcmVzaWRlbnRpYWxfZmluYWxfcmVzdWx0LCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmhlaWdodD00LCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBGaW5hbCBPdXRjb21lIn0KZ2dwbG90KHBfZmluYWwsIGFlcyh4PUNhbmRpZGF0ZSwgeT1Wb3RlcywgZmlsbD1DYW5kaWRhdGUpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgbGFicyh4PSLlgJnpgbjkuroiLCB5PSLlvpfnpajmlbgiLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjntZDmnpwiKSArCiAgZ2VvbV90ZXh0KGFlcyh4PUNhbmRpZGF0ZSwgeT1Wb3RlcyAvIDIsCiAgICAgICAgICAgICAgICBsYWJlbD1zcHJpbnRmKCIlc1xuKCVzKSIsIHNjYWxlczo6Y29tbWEoVm90ZXMpLCBzY2FsZXM6OnBlcmNlbnQoU2hhcmUpKSksCiAgICAgICAgICAgIHNpemU9NSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1tYWluX3BhcnR5X2NvbG9ycykgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9c2NhbGVzOjpjb21tYSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBjb29yZF9mbGlwKCkKYGBgCgojIyMjIEJ5IENvdW50eSDkvp3nuKPluIIKClRoZSBwcmUtcHJvY2Vzc2VkIGNvdW50eSByZXN1bHQgZm9yIHByZXNpZGVudGlhbCBlbGVjdGlvbiBpcyBhICp3aWRlKiBmb3JtYXQgYnkgY291bnR5OgoKYGBge3Igc2hvd19wcmVzaWRlbnRpYWxfY291bnR5X3Jlc3VsdH0KaGVhZChwX2NvdW50eVssIC1jKDE6MyldKQpgYGAKCkFuZCB3ZSd2ZSByZXNoYXBlZCBpdCBpbnRvIGEgKmxvbmcqIGZvcm1hdCBmb3IgZWFzZSBvZiBwbG90dGluZzoKCmBgYHtyIHNob3dfcHJlc2lkZW50aWFsX3RhaWVwaX0KIyBTaG93IHJlc3VsdCBmb3IgVGFpcGVpLgpwX2NvdW50eV9sW1JlZ2lvbiA9PSAi5Y+w5YyX5biCIl0KYGBgCgpQbG90IHZvdGUgY291bnRzIGJ5IGNvdW50eToKCmBgYHtyIHByZXNpZGVudGlhbF9jb3VudHlfYmFyLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlIENvdW50cyBieSBDb3VudHkifQpwIDwtIGdncGxvdChwX2NvdW50eV9sLCBhZXMoeD1yZW9yZGVyKENvdW50eSwgVG90YWxfVm90ZXMpLCB5PVZvdGVzLCBmaWxsPUNhbmRpZGF0ZSkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIsIHdpZHRoPS44KSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZT0i5YCZ6YG45Lq6IiwgdmFsdWVzPW1haW5fcGFydHlfY29sb3JzKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmNvbW1hKSArCiAgbGFicyh4PSLnuKPluILvvIjkvp3nuL3npajmlbjmjpLluo/vvIkiLCB5PSLlvpfnpajmlbgiLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlgJnpgbjkurrlkITnuKPluILvvJrlvpfnpajmlbgiKSArCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKVGhvdWdoIGl0J3MgY29udmVuaWVudCB0byBjb252ZXJ0IGEgYGdncGxvdGAgaW50byBgcGxvdGx5YCB3aXRoIGEgc2luZ2xlIGNhbGwgb2YgYGdncGxvdGx5YCwKc29tZSBuaWNlIGludGVyYWN0aW9uIGZlYXR1cmVzIHdvbid0IGJlIHN1cHBvcnRlZC4KRm9yIGV4YW1wbGUgdG8gaW50ZXJhY3Qgd2l0aCBzdGFja2VkIGJhcnMgYSBuYXRpdmUgYHBsb3RseWAgb3V0cHV0IGNhbiBiZSBuaWNlciBzaW5jZSBpdCB3aWxsICpyZS1zdGFjayogdGhlIGJhciBmb3IgZ3JvdXBzIHRoYXQgYXJlIG5vdCBkaXNhYmxlZCBieSB1c2VyIGNsaWNrczoKCmBgYHtyIHByZXNpZGVudGlhbF9jb3VudHlfYmFyX3Bsb3RseSwgZmcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlIENvdW50cyBieSBDb3VudHkifQojIExldCdzIHRyeSB0aGUgbmF0aXZlIHBsb3RseSBhcyB3ZWxsLgojIFNvbWUgbmljZSBpbnRlcmFjdGlvbiBvbmx5IHdvcmtzIHdoZW4gdGhlIHBsb3QgaXMgY29uc3RydWN0ZWQgYnkgdGhlIG5hdGl2ZSBBUEkuCnBsb3RfbHkocF9jb3VudHlfbCwgeT1+cmVvcmRlcihDb3VudHksIFRvdGFsX1ZvdGVzKSwgeD1+Vm90ZXMsCiAgICAgICAgdHlwZT0iYmFyIiwgIG9yaWVudGF0aW9uPSJoIiwKICAgICAgICBjb2xvcj1+Q2FuZGlkYXRlLCBjb2xvcnM9bWFpbl9wYXJ0eV9jb2xvcnMsCiAgICAgICAgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwKSAlPiUKICBsYXlvdXQoYmFybW9kZT0ic3RhY2siLAogICAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWAmemBuOS6uuWQhOe4o+W4gu+8muW+l+elqOaVuCIsCiAgICAgICAgIHlheGlzPWxpc3QodGl0bGU9Iue4o+W4gu+8iOS+nee4veelqOaVuOaOkuW6j++8iSIpLAogICAgICAgICB4YXhpcz1saXN0KHRpdGxlPSLlvpfnpajmlbgiKSwKICAgICAgICAgbWFyZ2luPWxpc3QodD01MCkpCmBgYAoKQW5kIGFsc28gdm90ZSBzaGFyZXMgKHZvdGUgY291bnRzIC8gdG90YWwgdmFsaWQgdm90ZXMpOgoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV9iYXJfcGN0LCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlIFNoYXJlcyBieSBDb3VudHkifQpwIDwtIGdncGxvdChwX2NvdW50eV9sLCBhZXMoeD1yZW9yZGVyKENvdW50eSwgVG90YWxfVm90ZXMpLCB5PVZvdGVzX1NoYXJlLCBmaWxsPUNhbmRpZGF0ZSkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJzdGFjayIsIHdpZHRoPS44KSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoVm90ZXNfU2hhcmUpKSwgcG9zaXRpb249cG9zaXRpb25fc3RhY2sodmp1c3Q9LjUpLCBzaXplPTIpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lPSLlgJnpgbjkuroiLCB2YWx1ZXM9bWFpbl9wYXJ0eV9jb2xvcnMpICsKICBsYWJzKHg9Iue4o+W4gu+8iOS+nee4veelqOaVuOaOkuW6j++8iSIsIHk9IuW+l+elqOeOhyIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWAmemBuOS6uuWQhOe4o+W4gu+8muW+l+elqOeOhyIpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikKCmdncGxvdGx5KHAsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKYGBgCgpTaW5jZSB0aGUgbWFpbiBwYXJ0aWVzIGFyZSBERFAgYW5kIEtNVCwKd2UgZGVmaW5lIHZvdGUgc2hhcmUgZGlmZmVyZW5jZSBhcyB2b3RlIHNoYXJlIG9mIEREUCBtaW51cyB0aGF0IG9mIEtNVC4KVGhlIGZvbGxvd2luZyBiYXJwbG90IGdpdmVzIHVzIGEgY2xlYXIgdmlldyBvZiB3aGljaCBjb3VudHkgRFBQIHdvbiB0aGUgbW9zdC4KCmBgYHtyIHByZXNpZGVudGlhbF9jb3VudHlfYmFyX3BjdF9kaWZmLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlIFNoYXJlIERpZmZlcmVuY2UgKERQUCdzIC0gS01UJ3MpIGJ5IENvdW50eSJ9CnAgPC0gZ2dwbG90KHBfY291bnR5X2RpZmYsIGFlcyh4PXJlb3JkZXIoQ291bnR5LCBTaGFyZV9EaWZmKSwgZmlsbD1kcHBfd2luLCB5PVNoYXJlX0RpZmYpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0uOCwgY29sb3I9ImJsYWNrIiwgYWxwaGE9LjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZG9kZ2VyYmx1ZSIsICJncmVlbjMiKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXNjYWxlczo6cGVyY2VudChTaGFyZV9EaWZmKSksIHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0PS41KSwgc2l6ZT0yLjUpICsKICBsYWJzKHg9Iue4o+W4gu+8iOS+neW+l+elqOeOh+W3ruaOkuW6j++8iSIsIHk9Iue2oOiXjeW+l+elqOeOh+W3riIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8mue2oOiXjeW+l+elqOeOh+W3riIpICsKICBjb29yZF9mbGlwKCkKCmdncGxvdGx5KHAsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKYGBgCgpXZSBjYW4gYWxzbyB2aXN1YWxpemUgdGhlIGFib3ZlIHJhbmtpbmcgd2l0aCBhIGNob3JvcGxldGggbWFwOgoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV9tYXAsIGZpZy5jYXA9IkNob3JvcGxldGggTWFwIGZvciBWb3RlIFNoYXJlIERpZmZlcmVuY2VzIChEUFAncyAtIEtNVCdzKSJ9CnAgPC0gZ2dwbG90KHR3X2NvdW50eV9zZiwgYWVzKHRleHQ9Q291bnR5KSkgKwogIGdlb21fc2YoYWVzKGZpbGw9U2hhcmVfRGlmZikpICsKICBjb29yZF9zZih4bGltPWMoMTE4LCAxMjIuNSksIHlsaW09YygyMS41LCAyNi41KSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKG5hbWU9Iue2oOiXjeW+l+elqOeOh+W3riIsIGxvdz0iZGFya2JsdWUiLCBoaWdoPSJkYXJrZ3JlZW4iLCBtaWQ9IndoaXRlIikgKwogIGxhYnModGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrntqDol43lvpfnpajnjoflt64iKQoKZ2dwbG90bHkocCwgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwKQpgYGAKCkFwcGFyZW50bHkgRFBQIHdvbiBtb3N0IGNvdW50aWVzIGJlc2lkZXMgbWFpbnRhaW4gYW5kIG91dGx5aW5nIGlzbGFuZCBhcmVhcy4KCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMjIEJ5IENvdW50eSBTdWItUmVnaW9uIOS+nemEiemOruW4guWNgCB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCmBgYHtyIHByb2Nlc3NfcHJlc2lkZW50aWFsX3JlZ2lvbiwgcmVzdWx0cz0iaGlkZSJ9CiMgUmVhZCBjb3VudHkgc3VicmVnaW9uLWxldmVsIHByZXNpZGVudGlhbCBlbGVjdGlvbiByZXN1bHRzLgpwX3JlZ2lvbiA8LSBmcmVhZCgiZGF0YS9wcm9jZXNzZWQvcHJlc2lkZW50aWFsL3ByZXNpZGVudGlhbF9yZWdpb25zLmNzdiIsIGVuY29kaW5nPSJVVEYtOCIpCnBfcmVnaW9uIDwtIHBfcmVnaW9uWywgUmVnaW9uOj10cmltd3MoUmVnaW9uLCB3aGl0ZXNwYWNlPSJbXFxoXFx2XSIpXSAgIyBUcmltIGZ1bGwtd2lkdGggd2hpdGUgc3BhY2UuCnNldG5hbWVzKHBfcmVnaW9uLCAi5oqV56Wo546HSCBIPUPDt0ciLCAiVHVybm91dCIpCgojIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIERQUCBhbmQgS01UIGJ5IHJlZ2lvbi4KcF9yZWdpb24gPC0gcF9yZWdpb25bLCBWb3RlX0RpZmY6PWdldCgiKDMpIOiUoeiLseaWhyDos7TmuIXlvrciKSAtIGdldCgiKDIpIOmfk+Wci+eRnCDlvLXlloTmlL8iKV0KcF9yZWdpb24gPC0gcF9yZWdpb25bLCBTaGFyZV9EaWZmOj1Wb3RlX0RpZmYgLyBnZXQoIuacieaViOelqOaVuEEgQT0xKzIrLi4uK04iKV0KCiMgV2lkZSB0byBsb25nLgpwX3JlZ2lvbl9sIDwtIG1lbHQocF9yZWdpb25bLCBjKCJCeSIsICJSZWdpb24iLCBjb2xzX2NhbmRpZGF0ZSksIHdpdGg9RkFMU0VdLAogICAgICAgICAgICAgICAgICAgaWQudmFycz1jKCJCeSIsICJSZWdpb24iKSwgdmFyaWFibGUubmFtZT0iQ2FuZGlkYXRlIiwgdmFsdWUubmFtZT0iVm90ZXMiKQpwX3JlZ2lvbl9sIDwtIHBfcmVnaW9uX2xbLCBDYW5kaWRhdGU6PWZhY3RvcihDYW5kaWRhdGUpXSAgIyBMZXZlbCBieSBjYW5kaWRhdGUgbnVtYmVyLgpwX3JlZ2lvbl9sIDwtIHBfcmVnaW9uX2xbcF9yZWdpb24sIFNoYXJlX0RpZmY6PWkuU2hhcmVfRGlmZiwgb249LihSZWdpb24pXQoKc2V0b3JkZXIocF9yZWdpb24sIC1TaGFyZV9EaWZmKQoKIyBHcm91cCBjb3VudGllcyBpbnRvIGFyZWFzLgpub3J0aF9jb3VudGllcyA8LSBjKCLoh7rljJfluIIiLCAi5paw5YyX5biCIiwgIuWfuumahuW4giIsICLmlrDnq7nluIIiLCAi5qGD5ZyS5biCIiwgIuaWsOeruee4oyIsICLlrpzomK3nuKMiKQpjZW50cmFsX2NvdW50aWVzIDwtIGMoIuiHuuS4reW4giIsICLoi5fmoJfnuKMiLCAi5b2w5YyW57ijIiwgIuWNl+aKlee4oyIsICLpm7LmnpfnuKMiKQpzb3V0aF9jb3VudGllcyA8LSBjKCLpq5jpm4TluIIiLCAi6Ie65Y2X5biCIiwgIuWYiee+qeW4giIsICLlmInnvqnnuKMiLCAi5bGP5p2x57ijIiwgIua+jua5lue4oyIpCmVhc3RfY291bnRpZXMgPC0gYygi6Iqx6JOu57ijIiwgIuiHuuadsee4oyIpCmlzbGFuZF9jb3VudGllcyA8LSBjKCLph5HploDnuKMiLCAi6YCj5rGf57ijIikKCiMgSGVscGVyIGZ1bmN0aW9uIGZvciBzaGFyZSBkaWZmZXJlbmNlIGJhciBwbG90LgpwbG90X3JlZ2lvbl9zaGFyZV9kaWZmIDwtIGZ1bmN0aW9uKGNvdW50aWVzLCB0aXRsZSkgewogIERUIDwtIHBfcmVnaW9uW0J5ICVpbiUgY291bnRpZXNdCiAgRFRbLCBCeTo9ZmFjdG9yKEJ5LCBsZXZlbHM9Y291bnRpZXMpXSAgIyBGaXggb3JkZXIgZm9yIGZhY2V0IGdyaWRzLgogIERUWywgUmVnaW9uMjo9cGFzdGUoQnksIFJlZ2lvbildICAjIEZpeGVkIG9yZGVyIHdpdGhpbiBmYWNldCAoc2FtZS1uYW1lIHJlZ2lvbiBmb3IgZGlmZmVyZW50IGNvdW50aWVzKS4KICBEVFssIGRwcF93aW46PVNoYXJlX0RpZmYgPiAwXQogIHAgPC0gZ2dwbG90KERULCBhZXMoeD1yZW9yZGVyKFJlZ2lvbjIsIFNoYXJlX0RpZmYpLCB5PVNoYXJlX0RpZmYsIGZpbGw9ZHBwX3dpbikpICsKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9LjgsIGNvbG9yPSJibGFjayIsIGFscGhhPS41KSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZG9kZ2VyYmx1ZSIsICJncmVlbjMiKSkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoU2hhcmVfRGlmZikpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9Mi41KSArCiAgICBsYWJzKHg9IiIsIHk9IiIsIHRpdGxlPXRpdGxlKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgZmFjZXRfZ3JpZChCeSB+IC4sIHNjYWxlcz0iZnJlZV95Iiwgc3BhY2U9ImZyZWVfeSIpCiAgcAp9CmBgYAoKVm90ZSBzaGFyZSBkaWZmZXJlbmNlIChEUFAgdi5zLiBLTVQpIHJhbmtlZCBieSByZWdpb24gYWNyb3NzIHRoZSBuYXRpb246CgpgYGB7ciBzaGFyZV9kaWZmX3JhbmtfYnlfcmVnaW9ufQpwX3JlZ2lvbl9yYW5rIDwtIHBfcmVnaW9uWywgLihCeSwgUmVnaW9uLCBTaGFyZV9EaWZmLCBWb3RlX0RpZmYpXQpwX3JlZ2lvbl9yYW5rIDwtIHBfcmVnaW9uX3JhbmtbLCBTaGFyZV9EaWZmOj1zY2FsZXM6OnBlcmNlbnQoU2hhcmVfRGlmZiwgLjAwMSldCnBfcmVnaW9uX3JhbmsgPC0gcF9yZWdpb25fcmFua1ssIGk6PS5JXQpzZXRjb2xvcmRlcihwX3JlZ2lvbl9yYW5rLCAiaSIpCnNldG5hbWVzKHBfcmVnaW9uX3JhbmssIGMoIuaOkuW6jyIsICLnuKPluIIiLCAi6YSJ6Y6u5biC5Y2AIiwgIue2oOiXjeW+l+elqOeOh+W3riIsICLntqDol43lvpfnpajmlbjlt64iKSkKcF9yZWdpb25fcmFua1tdCmBgYAoKV2UgYmFyLXBsb3QgdGhlIGFib3ZlIHJhbmtpbmcgYnkgcmVnaW9uIGJ5IGNvdW50eToKCiMjIyMjIE5vcnRoIFRhaXdhbiDljJflj7DngaMKCmBgYHtyIHByZXNpZGVudGlhbF9ub3J0aF9yZWdpb25fYmFyX3BjdF9kaWZmLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmhlaWdodD0xNywgZmlnLndpZHRoPTh9CnBsb3RfcmVnaW9uX3NoYXJlX2RpZmYoCiAgbm9ydGhfY291bnRpZXMsCiAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjljJfpg6jlnLDljYDvvIjphInpjq7luILljYDvvInvvJrntqDol43lvpfnpajnjoflt64iKQpgYGAKCiMjIyMjIENlbnRyYWwgVGFpd2FuIOS4reWPsOeBowoKYGBge3IgcHJlc2lkZW50aWFsX2NlbnRyYWxfcmVnaW9uX2Jhcl9wY3RfZGlmZiwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5oZWlnaHQ9MjAsIGZpZy53aWR0aD04fQpwbG90X3JlZ2lvbl9zaGFyZV9kaWZmKAogIGNlbnRyYWxfY291bnRpZXMsCiAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjkuK3pg6jlnLDljYDvvIjphInpjq7luILljYDvvInvvJrntqDol43lvpfnpajnjoflt64iKQpgYGAKCiMjIyMjIFNvdXRoIFRhaXdhbiDljZfoh7rngaMKCmBgYHtyIHByZXNpZGVudGlhbF9zb3V0aF9yZWdpb25fYmFyX3BjdF9kaWZmLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmhlaWdodD0yMiwgZmlnLndpZHRoPTh9CnBsb3RfcmVnaW9uX3NoYXJlX2RpZmYoCiAgc291dGhfY291bnRpZXMsCiAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjljZfpg6jlnLDljYDvvIjphInpjq7luILljYDvvInvvJrntqDol43lvpfnpajnjoflt64iKQpgYGAKCiMjIyMjIEVhc3QgVGFpd2FuIOadseWPsOeBowoKYGBge3IgcHJlc2lkZW50aWFsX2Vhc3RfcmVnaW9uX2Jhcl9wY3RfZGlmZiwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9CnBsb3RfcmVnaW9uX3NoYXJlX2RpZmYoCiAgZWFzdF9jb3VudGllcywKICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOadsemDqOWcsOWNgO+8iOmEiemOruW4guWNgO+8ie+8mue2oOiXjeW+l+elqOeOh+W3riIpCmBgYAoKIyMjIyMgT3V0bHlpbmcgSXNsYW5kcyDpm6Lls7YKCmBgYHtyIHByZXNpZGVudGlhbF9pc2xhbmRfcmVnaW9uX2Jhcl9wY3RfZGlmZiwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTh9CnBsb3RfcmVnaW9uX3NoYXJlX2RpZmYoCiAgaXNsYW5kX2NvdW50aWVzLAogIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG46Zui5bO25Zyw5Y2A77yI6YSJ6Y6u5biC5Y2A77yJ77ya57ag6JeN5b6X56Wo546H5beuIikKYGBgCgojIyMg54Sh5pWI56WoIEludmFsaWQgVm90ZSBDb3VudHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgpbSW52YWxpZCB2b3Rlc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3BvaWx0X3ZvdGUpIGFyZSB2b3RlcyBjYXN0IGJ1dCBkZWNsYXJlZCBpbnZhbGlkLgpUaGVyZSBpcyBubyB3YXkgdG8gb2JqZWN0aXZlbHkgcmVjb3JkIHRoZSBpbnRlbnRpb24gb2YgYW4gaW52YWxpZCB2b3RlLApoZXJlIHdlIHNpbXBseSBzdGF0aXN0aWNhbGx5IGRlc2NyaWJlIHRoZSBzaGFyZSBvZiBpbnZhbGlkIHZvdGVzIGZyb20gdG90YWwgdm90ZXMgY2FzdC4KCiMjIyMgQnkgQ291bnR5IOS+nee4o+W4ggoKYGBge3IgcHJvY2Vzc19wcmVzaWRlbnRpYWxfaW52YWxpZF92b3Rlc19jb3VudHksIHJlc3VsdHM9ImhpZGUifQojIFByb2Nlc3MgaW52YWxpZCB2b3RlcyBieSBjb3VudHkuCnBfY291bnR5IDwtIHBfY291bnR5WywgSW52YWxpZF9Wb3Rlc19TaGFyZTo9Z2V0KCLnhKHmlYjnpajmlbhCIikgLyBnZXQoIuaKleelqOaVuEMgQz1BK0IiKV0KcF9jb3VudHkgPC0gcF9jb3VudHlbLCBJbnZhbGlkX1ZvdGVzX1NoYXJlUDo9SW52YWxpZF9Wb3Rlc19TaGFyZSAqIDEwMF0KCiMgSm9pbiBpbnZhbGlkIHZvdGUgc2hhcmVzIHRvIHNwYXRpYWwgZGF0YWZyYW1lLgp0d19jb3VudHlfc2YgPC0gbWVyZ2UodHdfY291bnR5X3NmLCBwX2NvdW50eVssIC4oUmVnaW9uLCBJbnZhbGlkX1ZvdGVzX1NoYXJlUCldLCBieS54PSJOTF9OQU1FXzIiLCBieS55PSJSZWdpb24iKQpgYGAKCmBgYHtyIHByZXNpZGVudGlhbF9jb3VudHlfYmFyX3BjdF9pbnZhbGlkLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBJbnZhbGlkIFZvdGUgU2hhcmVzIGJ5IENvdW50eSJ9CnAgPC0gZ2dwbG90KHBfY291bnR5LCBhZXMoeD1yZW9yZGVyKENvdW50eSwgSW52YWxpZF9Wb3Rlc19TaGFyZSksIHk9SW52YWxpZF9Wb3Rlc19TaGFyZVApKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0uOCwgZmlsbD0id2hpdGUiLCBjb2xvcj0iYmxhY2siKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoSW52YWxpZF9Wb3Rlc19TaGFyZSkpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9Mi41KSArCiAgbGFicyh4PSLnuKPluILvvIjkvp3lu6LnpajnjofmjpLluo/vvIkiLCB5PSLlu6LnpajnjofvvIUiLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrlu6LnpajnjociKSArCiAgY29vcmRfZmxpcCgpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKVG8gc2VlIHRoZSBnZW9sb2NhdGlvbmFsIGRpZmZlcmVuY2VzLAphZ2FpbiB3ZSBwbG90IHRoZSBjaG9yb3BsZXRoIG1hcC4KQnV0IHRoaXMgdGltZSB3ZSB0cnkgdG8gcGxvdCB0aGUgb3V0bHlpbmcgaXNsYW5kcyBhcyBpbnNldCBtYXA6CgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X21hcF9pbnZhbGlkLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iQ2hvcm9wbGV0aCBNYXAgZm9yIEludmFsaWQgVm90ZSBTaGFyZXMifQojIFNlcGFyYXRlIHNwYXRpYWwgZnJhbWUgdG8gY3JlYXRlIGluc2V0IG1hcCBmb3Igb3V0bHlpbmcgaXNsYW5kcy4KIyBPdGhlcndpc2UgdGhleSB3aWxsIGJlIHRvbyBzbWFsbCB0byBzZWUuCmlzbGFuZF9jb3VudGllcyA8LSBjKCJLaW5tZW4iLCAiTGllbmtpYW5nIikKdHdfY291bnR5X3NmX2tpbm1lbiA8LSB0d19jb3VudHlfc2ZbdHdfY291bnR5X3NmJFJlZ2lvbkVuID09ICJLaW5tZW4iLF0KdHdfY291bnR5X3NmX2xpZW5raWFuZyA8LSB0d19jb3VudHlfc2ZbdHdfY291bnR5X3NmJFJlZ2lvbkVuID09ICJMaWVua2lhbmciLF0KdHdfY291bnR5X3NmX21haW5sYW5kIDwtIHR3X2NvdW50eV9zZlshdHdfY291bnR5X3NmJFJlZ2lvbkVuICVpbiUgaXNsYW5kX2NvdW50aWVzLF0KCiMgRml4IHRoZSBncmFkaWVudCBzY2FsZSBmb3IgYWxsIHN1YnBsb3RzLgppbnZhbGlkX3ZvdGVzaGFyZV9zY2FsZSA8LSByYW5nZSh0d19jb3VudHlfc2YkSW52YWxpZF9Wb3Rlc19TaGFyZVApCmdyYWRfc2NhbGUgPC0gc2NhbGVfZmlsbF9ncmFkaWVudChuYW1lPSLlu6LnpajnjofvvIUiLCBsb3c9IndoaXRlIiwgaGlnaD0iYmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWludmFsaWRfdm90ZXNoYXJlX3NjYWxlKQoKIyBQbG90IGVhY2ggaXNsYW5kcyBpbmRpdmlkdWFsbHkgZmlyc3QuCnBfbWFpbmxhbmQgPC0gZ2dwbG90KHR3X2NvdW50eV9zZl9tYWlubGFuZCwgYWVzKHRleHQ9Q291bnR5KSkgKwogIGdlb21fc2YoYWVzKGZpbGw9SW52YWxpZF9Wb3Rlc19TaGFyZVApKSArCiAgY29vcmRfc2YoeGxpbT1jKDExOS4yNSwgMTIyKSwgeWxpbT1jKDIyLCAyNS4yNSkpICsKICBncmFkX3NjYWxlICsKICBsYWJzKHN1YnRpdGxlPSLlj7DngaMgVGFpd2FuIikKCnBfa2lubWVuIDwtIGdncGxvdCh0d19jb3VudHlfc2Zfa2lubWVuLCBhZXModGV4dD1Db3VudHkpKSArCiAgZ2VvbV9zZihhZXMoZmlsbD1TaGFyZV9EaWZmKSkgKwogIGNvb3JkX3NmKGRhdHVtPU5BKSArCiAgZ3JhZF9zY2FsZSArCiAgbGFicyhzdWJ0aXRsZT0i6YeR6ZaA57ijIEtpbm1lbiIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKcF9saWVua2lhbmcgPC0gZ2dwbG90KHR3X2NvdW50eV9zZl9saWVua2lhbmcsIGFlcyh0ZXh0PUNvdW50eSkpICsKICBnZW9tX3NmKGFlcyhmaWxsPVNoYXJlX0RpZmYpKSArCiAgY29vcmRfc2YoZGF0dW09TkEpICsKICBncmFkX3NjYWxlICsKICBsYWJzKHN1YnRpdGxlPSLpgKPmsZ/nuKMgTGllbmtpYW5nIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgojIENvbWJpbmUuCmxheW91dCA8LSAiCkFDQ0MKQkNDQwojQ0NDCiIKcCA8LSBwX2tpbm1lbiArIHBfbGllbmtpYW5nICsgcF9tYWlubGFuZCArCiAgcGxvdF9sYXlvdXQoZ3VpZGVzPSJjb2xsZWN0IiwgZGVzaWduPWxheW91dCkKcCArIHBsb3RfYW5ub3RhdGlvbih0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8muW7ouelqOeOhyIpCmBgYAoKQ2hlY2sgaWYgdGhlcmUgaXMgYW55IGNvcnJlbGF0aW9uIGJldHdlZW4gaW52YWxpZCB2b3RlcyBhbmQgdGhlIERQUC1LTVQgZGlmZmVyZW5jZXM6CgpgYGB7ciBwcmVzaWRlbnRpYWxfaW52YWxpZF92c2RfY291bnR5LCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gSW52YWxpZCBWb3RlIFNoYXJlcyB2cyBEUFAtS01UIFNoYXJlIERpZmZlcmVuY2VzIGJ5IENvdW50eSJ9CmdncGxvdChwX2NvdW50eSwgYWVzKHg9SW52YWxpZF9Wb3Rlc19TaGFyZSwgeT1TaGFyZV9EaWZmLCBsYWJlbD1Db3VudHkpKSArCiAgZ2VvbV9wb2ludChzaGFwZT00LCBzaXplPTQsIHN0cm9rZT0yKSArCiAgbGFicyh4PSLlu6LnpajnjociLCB5PSLntqDol43lvpfnpajnjoflt64iLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrlu6LnpajnjofvvLjntqDol43lvpfnpajnjoflt64iKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGNvbG9yPSJncmV5NDAiKQpgYGAKCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMjIEJ5IENvdW50eSBTdWItUmVnaW9uIOS+nemEiemOruW4guWNgAoKYGBge3IgcHJvY2Vzc19wcmVzaWRlbnRpYWxfaW52YWxpZF92b3Rlc19yZWdpb24sIHJlc3VsdHM9ImhpZGUifQojIFByb2Nlc3MgaW52YWxpZCB2b3RlcyBieSByZWdpb24uCnBfcmVnaW9uIDwtIHBfcmVnaW9uWywgSW52YWxpZF9Wb3Rlc19TaGFyZTo9Z2V0KCLnhKHmlYjnpajmlbhCIikgLyBnZXQoIuaKleelqOaVuEMgQz1BK0IiKV0KcF9yZWdpb24gPC0gcF9yZWdpb25bLCBJbnZhbGlkX1ZvdGVzX1NoYXJlUDo9SW52YWxpZF9Wb3Rlc19TaGFyZSAqIDEwMF0KYGBgCgpgYGB7ciBwcmVzaWRlbnRpYWxfaW52YWxpZF92c2RfcmVnaW9uLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBJbnZhbGlkIFZvdGUgU2hhcmVzIHZzIERQUC1LTVQgU2hhcmUgRGlmZmVyZW5jZXMgYnkgUmVnaW9uIn0KcCA8LSBnZ3Bsb3QocF9yZWdpb24sIGFlcyh4PUludmFsaWRfVm90ZXNfU2hhcmUsIHk9U2hhcmVfRGlmZiwgbGFiZWw9cGFzdGUoQnksIFJlZ2lvbikpKSArCiAgZ2VvbV9wb2ludChzaGFwZT00LCBzaXplPTQpICsKICBsYWJzKHg9IuW7ouelqOeOhyIsIHk9Iue2oOiXjeW+l+elqOeOh+W3riIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOmEiemOruW4guWNgO+8muW7ouelqOeOh++8uOe2oOiXjeW+l+elqOeOh+W3riIpICsKICAgICAgIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBjb2xvcj0iYmxhY2siKQpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKQSBzaW1wbGUgbGluZWFyIG1vZGVsIG9uIGludmFsaWQgdm90ZSBzaGFyZXMgYWdhaW5zdCBEUFAtS01UIHNoYXJlIGRpZmZlcmVuY2VzIHN1Z2dlc3RzIHRoZSBjb3JyZWxhdGlvbiBpcyBhdCBsZWFzdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LgpCdXQgc3VjaCBjb3JyZWxhdGlvbiBtYXkgYmUgWypzcHVyaW91cypdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NwdXJpb3VzX3JlbGF0aW9uc2hpcCkgc28gdGhlIGludGVycHJldGF0aW9uIHNoYWxsIGJlIGNhdXRpb3VzLgpBcyB3ZSB3aWxsIHNlZSBsYXR0ZXIgYXMgd2UgZGlnIGludG8gdGhlIHBvbGxpbmcgcGxhY2UgbGV2ZWwsCnN1Y2ggY29ycmVsYXRpb24gYmVjb21lcyB3ZWFrZXIgKGFuZCBpbmRlZWQgYmVjb21lcyBuZWdhdGl2ZSkuCgpgYGB7ciBsbV9pbnZhbGlkfQpsbV9pbnZhbGlkIDwtIGxtKFNoYXJlX0RpZmYgfiBJbnZhbGlkX1ZvdGVzX1NoYXJlUCwgZGF0YT1wX3JlZ2lvbikKY29lZnRlc3QobG1faW52YWxpZCwgdmNvdj12Y292SEMobG1faW52YWxpZCwgdHlwZT0iSEMwIikpCmBgYAoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMjIyMgQnkgUG9sbGluZyBQbGFjZSDkvp3mipXplovnpajmiYAKCmBgYHtyIHByb2Nlc3NfaW52YWxpZF9wcGxhY2UsIHJlc3VsdHM9ImhpZGUifQojIFJlYWQgY291bnR5IHN1YnJlZ2lvbi1sZXZlbCBwcmVzaWRlbnRpYWwgZWxlY3Rpb24gcmVzdWx0cy4KcF9wbGFjZSA8LSBmcmVhZCgiZGF0YS9wcm9jZXNzZWQvcHJlc2lkZW50aWFsL3ByZXNpZGVudGlhbF9wcGxhY2VzLmNzdiIsIGVuY29kaW5nPSJVVEYtOCIpCnBfcGxhY2UgPC0gcF9wbGFjZVssIFJlZ2lvbjo9dHJpbXdzKFJlZ2lvbiwgd2hpdGVzcGFjZT0iW1xcaFxcdl0iKV0gICMgVHJpbSBmdWxsLXdpZHRoIHdoaXRlIHNwYWNlLgpzZXRuYW1lcyhwX3BsYWNlLCAi5oqV56Wo546HSCBIPUPDt0ciLCAiVHVybm91dCIpCnBfcGxhY2UgPC0gcF9wbGFjZVssIEludmFsaWRfVm90ZXNfU2hhcmU6PWdldCgi54Sh5pWI56Wo5pW4QiIpIC8gZ2V0KCLmipXnpajmlbhDIEM9QStCIildCnBfcGxhY2UgPC0gcF9wbGFjZVssIEludmFsaWRfVm90ZXNfU2hhcmVQOj1JbnZhbGlkX1ZvdGVzX1NoYXJlICogMTAwXQoKIyBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBEUFAgYW5kIEtNVCBieSByZWdpb24uCnBfcGxhY2UgPC0gcF9wbGFjZVssIFZvdGVfRGlmZjo9Z2V0KCIoMykg6JSh6Iux5paHIOiztOa4heW+tyIpIC0gZ2V0KCIoMikg6Z+T5ZyL55GcIOW8teWWhOaUvyIpXQpwX3BsYWNlIDwtIHBfcGxhY2VbLCBTaGFyZV9EaWZmOj1Wb3RlX0RpZmYgLyBnZXQoIuacieaViOelqOaVuEEgQT0xKzIrLi4uK04iKV0KCiMgV2lkZSB0byBsb25nLgpwX3BsYWNlX2wgPC0gbWVsdChwX3BsYWNlWywgYygiQnkiLCAiUmVnaW9uIiwgIlZpbGxhZ2UiLCAiUGxhY2UiLCBjb2xzX2NhbmRpZGF0ZSksIHdpdGg9RkFMU0VdLAogICAgICAgICAgICAgICAgICBpZC52YXJzPWMoIkJ5IiwgIlJlZ2lvbiIsICJWaWxsYWdlIiwgIlBsYWNlIiksCiAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWU9IkNhbmRpZGF0ZSIsIHZhbHVlLm5hbWU9IlZvdGVzIikKcF9wbGFjZV9sIDwtIHBfcGxhY2VfbFssIENhbmRpZGF0ZTo9ZmFjdG9yKENhbmRpZGF0ZSldICAjIExldmVsIGJ5IGNhbmRpZGF0ZSBudW1iZXIuCnBfcGxhY2VfbCA8LSBwX3BsYWNlX2xbcF9wbGFjZSwgYDo9YChTaGFyZV9EaWZmPWkuU2hhcmVfRGlmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR1cm5vdXQ9aS5UdXJub3V0KSwgb249LihCeSwgUmVnaW9uLCBWaWxsYWdlLCBQbGFjZSldCnBfcGxhY2VfbCA8LSBwX3BsYWNlX2xbLCBWb3Rlc19TaGFyZTo9Vm90ZXMgLyBzdW0oVm90ZXMpLCBieT0uKEJ5LCBSZWdpb24sIFZpbGxhZ2UsIFBsYWNlKV0KYGBgCgpMZXQncyB0cnkgYSBuYXRpdmUgYHBsb3RseWAgc2NhdHRlciBwbG90IHRoaXMgdGltZS4KU2luY2UgdGhlIGRhdGEgcG9pbnRzIGFyZSBxdWl0ZSBhIGxvdCBhbHJlYWR5IGF0IHRoZSBwb2xsaW5nIHBsYWNlIGxldmVsLApmb3Igc2NhbGFiaWxpdHkgd2Ugd2lsbCB1c2UgYFdlYkdMYCBpbnN0ZWFkIG9mIGBTVkdgIHRvIHJlbmRlciB0aGUgaW50ZXJhY3RpdmUgcGxvdDoKCmBgYHtyIHByZXNpZGVudGlhbF9pbnZhbGlkX3ZzZF9wbGFjZSwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gSW52YWxpZCBWb3RlIFNoYXJlcyB2cyBEUFAtS01UIFNoYXJlIERpZmZlcmVuY2VzIGJ5IFBvbGxpbmcgUGxhY2UifQojIFRPRE86CiMgYWRkX2xpbmVzIGFsd2F5cyBwbG90IG1hcmtlcnMgYXMgd2VsbC4gQSBidWc/CmZpdCA8LSBsbShTaGFyZV9EaWZmIH4gSW52YWxpZF9Wb3Rlc19TaGFyZSwgZGF0YT1wX3BsYWNlKQpwX3BsYWNlIDwtIHBfcGxhY2VbLCBsYWJlbDo9cGFzdGUoUmVnaW9uLCBWaWxsYWdlLCBQbGFjZSldCnBsb3RfbHkocF9wbGFjZSwgeD1+SW52YWxpZF9Wb3Rlc19TaGFyZSwgeT1+U2hhcmVfRGlmZiwgdGV4dD1+bGFiZWwsCiAgICAgICAgY29sb3I9fkJ5LCBjb2xvcnM9Y29sb3JSYW1wUGFsZXR0ZShicmV3ZXIucGFsKG49MTEsIG5hbWU9IlNwZWN0cmFsIikpKDIyKSwKICAgICAgICB0eXBlPSJzY2F0dGVyIiwgbW9kZT0ibWFya2VycyIsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkgJT4lCiAgYWRkX2xpbmVzKHg9fkludmFsaWRfVm90ZXNfU2hhcmUsIHk9Zml0dGVkKGZpdCksIGNvbG9yPUkoImJsYWNrIiksIHNob3dsZWdlbmQ9RkFMU0UpICU+JQogIGxheW91dCh0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOmEiemOruW4guWNgO+8muW7ouelqOeOh++8uOe2oOiXjeW+l+elqOeOh+W3riIsCiAgICAgICAgIHlheGlzPWxpc3QodGl0bGU9Iue2oOiXjeW+l+elqOeOh+W3riIpLAogICAgICAgICB4YXhpcz1saXN0KHRpdGxlPSLlu6LnpajnjociKSwKICAgICAgICAgcGxvdF9iZ2NvbG9yPSJsaWdodGdyZXkiLAogICAgICAgICBtYXJnaW49bGlzdCh0PTUwKSkgJT4lCiAgdG9XZWJHTCgpCmBgYAoKKEJlIGF3YXJlIHRoYXQgdGhlIHJlZ3Jlc3Npb24gbGluZSBpcyBiYXNlZCBvbiBmdWxsIGRhdGEgYW5kIGRvZXNuJ3QgcmVmbGVjdCBhbnkgdXNlciBpbnRlcmFjdGlvbiBjaGFuZ2luZ3RoZSBkaXNwbGF5ZWQgY291bnRpZXMuKQoKIyMjIOaKleelqOeOhyBWb3RlciBUdXJub3V0IHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKW1ZvdGVyIHR1cm5vdXRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZvdGVyX3R1cm5vdXQpIGlzIGRlZmluZWQgYXMgdG90YWwgdm90ZXMgY2FzdCAodmFsaWQgYW5kIGludmFsaWQpIGRpdmlkZWQgYnkgbGVnaXRpbWF0ZSB2b3RlcnMuClRoZSBpbmZvcm1hdGlvbiBpcyByZWFkaWx5IGF2YWlsYWJsZSBpbiB0aGUgc291cmNlIGRhdGEgZnJvbSB0aGUgY29sdW1uIGDmipXnpajnjodIIEg9Q8O3R2AuCkluIHRoaXMgc2VjdGlvbiB3ZSBleHBsb3JlIHRoZSBwb3NzaWJsZSByZWxhdGlvbiBiZXR3ZWVuIHR1cm5vdXQgYW5kIHZvdGUgY291bnRzLgoKIyMjIyBCeSBDb3VudHkg5L6d57ij5biCCgpgYGB7ciBwcm9jZXNzX3ByZXNpZGVudGlhbF9jb3VudHlfdHVybm91dCwgcmVzdWx0cz0iaGlkZSJ9CiMgR2V0IHZvdGluZyByYXRlIGZyb20gd2lkZSBkYXRhIHRvIGxvbmcuCnBfY291bnR5X2wgPC0gcF9jb3VudHlfbFtwX2NvdW50eSwgVHVybm91dDo9aS5UdXJub3V0LCBvbj0uKENvdW50eSldCmBgYAoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV90dXJub3V0X2JhciwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVm90ZXIgVHVybm91dCBieSBDb3VudHkifQpwIDwtIGdncGxvdChwX2NvdW50eSwgYWVzKHg9cmVvcmRlcihDb3VudHksIFR1cm5vdXQpLCB5PVR1cm5vdXQpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0uOCwgZmlsbD0id2hpdGUiLCBjb2xvcj0iYmxhY2siKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wYXN0ZShUdXJub3V0LCAiJSIpKSwgcG9zaXRpb249cG9zaXRpb25fc3RhY2sodmp1c3Q9LjUpLCBzaXplPTIuNSkgKwogIGxhYnMoeD0i57ij5biC77yI5L6d5oqV56Wo546H5o6S5bqP77yJIiwgeT0i5oqV56Wo546HIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya5oqV56Wo546HIikgKwogIGNvb3JkX2ZsaXAoKQoKZ2dwbG90bHkocCwgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwLCB0b29sdGlwPU5VTEwpCmBgYAoKRm9yIGNob3JvcGxldGggbWFwIHRoaXMgdGltZSB3ZSB0cnkgYSBuYXRpdmUgYHBsb3RseWAgYXBwcm9hY2g6CgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X3R1cm5vdXRfbWFwLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlciBUdXJub3V0OiBDb3VudHkgTWFwIiwgbWVzc2FnZT1GQUxTRX0KcGxvdF9seSh0d19jb3VudHlfc2YsIHNwbGl0PX5Db3VudHksIGNvbG9yPX5UdXJub3V0LCB0ZXh0PX5wYXN0ZShDb3VudHksIFR1cm5vdXQpLAogICAgICAgIHNob3dsZWdlbmQ9RkFMU0UsIGNvbG9ycz0iUmVkcyIsCiAgICAgICAgaG92ZXJvbj0iZmlsbHMiLCBob3ZlcmluZm89InRleHQiLAogICAgICAgIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkgJT4lCiAgbGF5b3V0KHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya5oqV56Wo546HIiwKICAgICAgICAgbGVnZW5kPWxpc3QobmFtZT0i5oqV56Wo546H77yFIiksCiAgICAgICAgIHhheGlzPWxpc3QocmFuZ2U9YygxMTgsIDEyMi41KSksCiAgICAgICAgIHlheGlzPWxpc3QocmFuZ2U9YygyMS41LCAyNi41KSksCiAgICAgICAgIG1hcmdpbj1saXN0KHQ9NTApKQpgYGAKCkl0IGlzIHdpZGVseSBzdWdnZXN0ZWQgdGhhdCBhbiBpbmNyZWFzaW5nIHZvdGVyIHR1cm5vdXQgZHVlIHRvIHlvdW5nZXIgZ2VuZXJhdGlvbiB0aGlzIHRpbWUgY2FuIGh1Z2VseSBpbXBhY3QgdGhlIHJlc3VsdHMuCkhlcmUgd2UgcGxvdCB0aGUgdHVybm91dCBhZ2FpbnN0IERQUC1LTVQgc2hhcmUgZGlmZmVyZW5jZXMgYnkgY291bnR5OgoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV90dXJub3V0X3ZzZCwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGVyIFR1cm5vdXQgYnkgQ291bnR5In0KZ2dwbG90KHBfY291bnR5LCBhZXMoeD1UdXJub3V0IC8gMTAwLCB5PVNoYXJlX0RpZmYsIGxhYmVsPUNvdW50eSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLjM1LCAuOCkpICsKICBnZW9tX3JlY3QoZGF0YT1wX2NvdW50eVsxXSwKICAgICAgICAgICAgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49MCwgeW1heD1JbmYpLCBmaWxsPSJsaWdodGdyZWVuIiwgYWxwaGE9LjgpICsKICBnZW9tX3JlY3QoZGF0YT1wX2NvdW50eVsxXSwKICAgICAgICAgICAgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49LUluZiwgeW1heD0wKSwgZmlsbD0ibGlnaHRibHVlIiwgYWxwaGE9LjgpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTApLCBjb2xvcj0icmVkIikgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsKICBnZW9tX3RleHQoY2hlY2tfb3ZlcmxhcD1UUlVFLCBjb2xvcj0iZ3JleTQwIikgKwogIGxhYnMoeD0i5oqV56Wo546HIiwgeT0i57ag6JeN5b6X56Wo546H5beuIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya5oqV56Wo546H77y46JeN57ag5b6X56Wo546H5beuIikKYGBgCgpXZSB6b29tLWluIGluIHRoZSBmb2xsb3dpbmcgcGxvdCBmb3IgdGhvc2Ugd2l0aCB0dXJub3V0ID4gNzAlOgoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV90dXJub3V0NzBfdnNkLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVm90ZXIgVHVybm91dCAoPjcwJSkgYnkgQ291bnR5In0KZ2dwbG90KHBfY291bnR5W1R1cm5vdXQgPiA3MF0sIGFlcyh4PVR1cm5vdXQgLyAxMDAsIHk9U2hhcmVfRGlmZiwgbGFiZWw9Q291bnR5KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YyguNywgLjgpKSArCiAgZ2VvbV9yZWN0KGRhdGE9cF9jb3VudHlbVHVybm91dCA+IDcwXVsxXSwKICAgICAgICAgICAgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49MCwgeW1heD1JbmYpLCBmaWxsPSJsaWdodGdyZWVuIiwgYWxwaGE9LjgpICsKICBnZW9tX3JlY3QoZGF0YT1wX2NvdW50eVtUdXJub3V0ID4gNzBdWzFdLAogICAgICAgICAgICBhZXMoeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PTApLCBmaWxsPSJsaWdodGJsdWUiLCBhbHBoYT0uOCkgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9MCksIGNvbG9yPSJyZWQiKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3RleHRfcmVwZWwoY29sb3I9ImdyZXk0MCIpICsKICBsYWJzKHg9IuaKleelqOeOhyIsIHk9Iue2oOiXjeW+l+elqOeOh+W3riIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8muaKleelqOeOhyg+NzAlKe+8uOe2oOiXjeW+l+elqOeOh+W3riIpCmBgYAoKV2UgY2FuIGFsc28gdmlzdWFsaXplIHRoZSB0dXJub3V0IHJlbGF0aW9uIG9uIGVhY2ggcGFydHkgY2FuZGlkYXRlIGluc3RlYWQ6CgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X3R1cm5vdXRfdnMsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0zLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlciBUdXJub3V0IHZzIENhbmRpZGF0ZSBWb3RlIFNoYXJlcyBieSBDb3VudHkifQpnZ3Bsb3QocF9jb3VudHlfbCwgYWVzKHg9VHVybm91dCAvIDEwMCwgeT1Wb3Rlc19TaGFyZSkpICsKICBnZW9tX3JlY3QoZGF0YT11bmlxdWUocF9jb3VudHlfbCwgYnk9IkNhbmRpZGF0ZSIpLCBhZXMoZmlsbD1DYW5kaWRhdGUpLAogICAgICAgICAgICB4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPS1JbmYsIHltYXg9SW5mLCBhbHBoYT0uNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1tYWluX3BhcnR5X2NvbG9ycykgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBjb2xvcj0iYmxhY2siKSArCiAgZmFjZXRfZ3JpZCh+IENhbmRpZGF0ZSkgKwogIGxhYnMoeD0i5oqV56Wo546HIiwgeT0i5b6X56Wo546HIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya5oqV56Wo546H77y45b6X56Wo546HIikKYGBgCgpbR28gQmFjayB0byBUb3BdKCNoZWFkKQoKIyMjIyBCeSBDb3VudHkgU3ViLVJlZ2lvbiDkvp3phInpjq7luILljYAKCmBgYHtyIHByb2Nlc3NfcHJlc2lkZW50aWFsX3JlZ2lvbl90dXJub3V0fQojIENvbXB1dGUgcmVnaW9uLWxldmVsIHZvdGluZyByYXRlIGFuZCB2b3RlIHNoYXJlcyBpbiB0aGUgbG9uZyBkYXRhLgpwX3JlZ2lvbl9sIDwtIHBfcmVnaW9uX2xbcF9yZWdpb24sIFR1cm5vdXQ6PWkuVHVybm91dCwgb249LihSZWdpb24pXQpwX3JlZ2lvbl9sIDwtIHBfcmVnaW9uX2xbLCBWb3Rlc19TaGFyZTo9Vm90ZXMgLyBzdW0oVm90ZXMpLCBieT0uKFJlZ2lvbildCmBgYAoKRnJvbSB0aGUgcHJldmlvdXMgY291bnR5LWxldmVsIHZpc3VhbGl6YXRpb24gd2UgcmVhbGl6ZWQgdGhhdCB0dXJub3V0IG1heSBiZSByZWxhdGVkIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gRERQIGFuZCBLTVQgY2FuZGlkYXRlcy4KSGVyZSB3ZSB1c2UgYSBzaW1wbGUgbGluZWFyIG1vZGVsIHRvIHRlc3QgdGhlIGNvcnJlbGF0aW9uIGJhc2VkIG9uIHJlZ2lvbi1sZXZlbCBkYXRhOgoKYGBge3IgbG1fdHVybm91dF92c2R9CmxtX3R1cm5vdXQgPC0gbG0oU2hhcmVfRGlmZiB+IEkoVHVybm91dC8xMDApLCBkYXRhPXBfcmVnaW9uX2wpCmNvZWZ0ZXN0KGxtX3R1cm5vdXQsIHZjb3Y9dmNvdkhDKGxtX3R1cm5vdXQsIHR5cGU9IkhDMCIpKQpgYGAKCkFwcGFyZW50bHkgdGhlIGNvcnJlbGF0aW9uIGlzIHNpZ25pZmljYW50LgpMZXQncyBhbHNvIGdlbmVyYXRlIHRoZSByZWdpb24tbGV2ZWwgc2NhdHRlcnBsb3Q6CgpgYGB7ciBwcmVzaWRlbnRpYWxfcmVnaW9uX3R1cm5vdXRfdnNkLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVm90ZXIgVHVybm91dCBieSBSZWdpb24ifQpnZ3Bsb3QocF9yZWdpb24sIGFlcyh4PVR1cm5vdXQsIHk9U2hhcmVfRGlmZikpICsKICBnZW9tX3JlY3QoZGF0YT1wX3JlZ2lvblsxXSwgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49MCwgeW1heD1JbmYpLAogICAgICAgICAgICBmaWxsPSJsaWdodGdyZWVuIiwgYWxwaGE9LjgpICsKICBnZW9tX3JlY3QoZGF0YT1wX3JlZ2lvblsxXSwgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49LUluZiwgeW1heD0wKSwKICAgICAgICAgICAgZmlsbD0ibGlnaHRibHVlIiwgYWxwaGE9LjgpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTApLCBjb2xvcj0icmVkIikgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsKICBsYWJzKHg9IuaKleelqOeOh++8hSIsIHk9Iue2oOiXjeW+l+elqOeOh+W3riIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOmEiemOruW4guWNgO+8muaKleelqOeOh++8uOe2oOiXjeW+l+elqOeOh+W3riIpCmBgYAoKQWdhaW4gd2l0aCBhZGRpdGlvbmFsIHpvb20taW46CgpgYGB7ciBwcmVzaWRlbnRpYWxfcmVnaW9uX3R1cm5vdXQ3MF92c2QsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlciBUdXJub3V0ICg+NzAlKSBieSBSZWdpb24ifQpnZ3Bsb3QocF9yZWdpb25bVHVybm91dCA+IDcwXSwgYWVzKHg9VHVybm91dCwgeT1TaGFyZV9EaWZmLCBsYWJlbD1SZWdpb24pKSArCiAgZ2VvbV9yZWN0KGRhdGE9cF9yZWdpb25bMV0sIGFlcyh4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPTAsIHltYXg9SW5mKSwKICAgICAgICAgICAgZmlsbD0ibGlnaHRncmVlbiIsIGFscGhhPS44KSArCiAgZ2VvbV9yZWN0KGRhdGE9cF9yZWdpb25bMV0sIGFlcyh4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPS1JbmYsIHltYXg9MCksCiAgICAgICAgICAgIGZpbGw9ImxpZ2h0Ymx1ZSIsIGFscGhhPS44KSArCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD0wKSwgY29sb3I9InJlZCIpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBzZT1GQUxTRSkgKwogIGdlb21fdGV4dChjaGVja19vdmVybGFwPVRSVUUsIG51ZGdlX3k9LS4wMzUsIGNvbG9yPSJkYXJrZ3JleSIpICsKICBsYWJzKHg9IuaKleelqOeOh++8hSIsIHk9Iue2oOiXjeW+l+elqOeOh+W3riIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOmEiemOruW4guWNgO+8muaKleelqOeOhyg+NzAlKe+8uOe2oOiXjeW+l+elqOeOh+W3riIpCmBgYAoKYGBge3IgcHJlc2lkZW50aWFsX3JlZ2lvbl90dXJub3V0X3ZzLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9MywgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVm90ZXIgVHVybm91dCB2cyBDYW5kaWRhdGUgVm90ZSBTaGFyZXMgYnkgUmVnaW9uIn0KZ2dwbG90KHBfcmVnaW9uX2wsIGFlcyh4PVR1cm5vdXQgLyAxMDAsIHk9Vm90ZXNfU2hhcmUpKSArCiAgZ2VvbV9yZWN0KGRhdGE9dW5pcXVlKHBfcmVnaW9uX2wsIGJ5PSJDYW5kaWRhdGUiKSwgYWVzKGZpbGw9Q2FuZGlkYXRlKSwKICAgICAgICAgICAgeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PUluZiwgYWxwaGE9LjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9bWFpbl9wYXJ0eV9jb2xvcnMpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgY29sb3I9ImJsYWNrIikgKwogIGZhY2V0X2dyaWQofiBDYW5kaWRhdGUpICsKICBsYWJzKHg9IuaKleelqOeOhyIsIHk9IuW+l+elqOeOhyIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8muaKleelqOeOhyBYIOW+l+elqOeOhyIpCmBgYAoKV2UgY2FuIGFsc28gdGVzdCB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiB0dXJub3V0IGFuZCB2b3RlIHNoYXJlIG9mIGVhY2ggcGFydHkncyBjYW5kaWRhdGVzOgoKYGBge3IgbG1fdnJfdnN9CmZvciAoIGNhbmRpZGF0ZSBpbiB1bmlxdWUocF9yZWdpb25fbCRDYW5kaWRhdGUpICkgewogIGxtX3R1cm5vdXRfY2FuZGlkaWF0ZSA8LSBsbShWb3Rlc19TaGFyZSB+IEkoVHVybm91dCAvIDEwMCksIGRhdGE9cF9yZWdpb25fbFtDYW5kaWRhdGUgPT0gY2FuZGlkYXRlXSkKICBtZXNzYWdlKHJlcCgiLSIsIDgwKSkKICBtZXNzYWdlKCJUZXN0IGNvcnJlbGF0aW9uIGJldHdlZW4gdm90ZSBzaGFyZXMgYW5kIHZvdGVyIHR1cm5vdXQuIikKICBtZXNzYWdlKHNwcmludGYoIkZvciAlczoiLCBjYW5kaWRhdGUpKQogIHByaW50KGNvZWZ0ZXN0KGxtX3R1cm5vdXRfY2FuZGlkaWF0ZSwgdmNvdj12Y292SEMobG1fdHVybm91dF9jYW5kaWRpYXRlLCB0eXBlPSJIQzAiKSkpCn0KYGBgCgpJbnRlcmVzdGluZ2x5LApzdWNoIGNvcnJlbGF0aW9uIGlzIG5vdCBmb3VuZCBmb3IgUEZQIGNhbmRpZGF0ZXMuCgpbR28gQmFjayB0byBUb3BdKCNoZWFkKQoKIyMjIyBCeSBQb2xsaW5nIFBsYWNlIOS+neaKlemWi+elqOaJgAoKYGBge3IgcHJlc2lkZW50aWFsX3BsYWNlX3R1cm5vdXRfdnNkLCBtZXNzYWdlPUZBTFNFfQpwX3BsYWNlX2wgPC0gcF9wbGFjZV9sWywgbGFiZWw6PXBhc3RlKFJlZ2lvbiwgVmlsbGFnZSwgUGxhY2UpXQpmaXQwIDwtIGxtKFNoYXJlX0RpZmYgfiBJKFR1cm5vdXQgLyAxMDApLCBkYXRhPXBfcGxhY2VfbCkKCnBsb3RfbHkoCiAgcF9wbGFjZV9sLCB4PX4oVHVybm91dCAvIDEwMCksIHk9flNoYXJlX0RpZmYsIHRleHQ9fmxhYmVsLCBtYXJrZXI9bGlzdChzaXplPTMpLAogIHR5cGU9InNjYXR0ZXIiLCBtb2RlPSJtYXJrZXJzIiwgY29sb3I9fkJ5LAogIGNvbG9ycz1jb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwobj0xMSwgbmFtZT0iU3BlY3RyYWwiKSkoMjIpLAogIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkgJT4lCiAgYWRkX3RyYWNlKG1vZGU9ImxpbmVzIiwgbGluZT1saXN0KGNvbG9yPSJibGFjayIpLAogICAgICAgICAgICB4PX4oVHVybm91dCAvIDEwMCksIHk9Zml0dGVkKGZpdDApLCBzaG93bGVnZW5kPUZBTFNFKSAlPiUKICBsYXlvdXQodGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITmipXplovnpajmiYDvvJrmipXnpajnjocgWCDol43ntqDlvpfnpajnjoflt64iLAogICAgICAgICB5YXhpcz1saXN0KHRpdGxlPSLol43ntqDlvpfnpajnjoflt64iKSwKICAgICAgICAgeGF4aXM9bGlzdCh0aXRsZT0i5oqV56Wo546HIiksCiAgICAgICAgIHBsb3RfYmdjb2xvcj0ibGlnaHRncmV5IiwKICAgICAgICAgbWFyZ2luPWxpc3QodD01MCkpICU+JQogIHRvV2ViR0woKQpgYGAKCkp1c3QgYSBzaWRlIG5vdGUsCmNvcnJlbGF0aW9uIGJldHdlZW4gdHVybm91dCBhbmQgdm90ZSBzaGFyZSBmb3IgUEZQIGNhbmRpZGF0ZSBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGF0IHRoZSBwb2xsaW5nIHBsYWNlIGxldmVsLApidXQgbm90IGVjb25vbWljYWxseSBzaWduaWZpY2FudCAoaW4gdGVybXMgb2YgZWZmZWN0IHNpemUpLgoKYGBge3IgdHVybm91dF9vbl9wZnBfdm90ZV9zaGFyZX0KZml0MSA8LSBsbShWb3Rlc19TaGFyZSB+IEkoVHVybm91dCAvIDEwMCksIGRhdGE9cF9wbGFjZV9sMSA8LSBwX3BsYWNlX2xbQ2FuZGlkYXRlID09ICIoMSkg5a6L5qWa55GcIOS9mea5mCJdKQpmaXQyIDwtIGxtKFZvdGVzX1NoYXJlIH4gSShUdXJub3V0IC8gMTAwKSwgZGF0YT1wX3BsYWNlX2wyIDwtIHBfcGxhY2VfbFtDYW5kaWRhdGUgPT0gIigyKSDpn5PlnIvnkZwg5by15ZaE5pS/Il0pCmZpdDMgPC0gbG0oVm90ZXNfU2hhcmUgfiBJKFR1cm5vdXQgLyAxMDApLCBkYXRhPXBfcGxhY2VfbDMgPC0gcF9wbGFjZV9sW0NhbmRpZGF0ZSA9PSAiKDMpIOiUoeiLseaWhyDos7TmuIXlvrciXSkKCmNvZWZ0ZXN0KGZpdDEsIHZjb3Y9dmNvdkhDKGZpdDEsIHR5cGU9IkhDMCIpKQpgYGAKCkEgMSUgaW5jcmVhc2UgaW4gdHVybm91dCBpcyBvbmx5IGFzc29jaWF0ZWQgd2l0aCAwLjAxJSBpbmNyZWFzZSBpbiB2b3RlIHNoYXJlLgpTdWNoIHNpemUgZWZmZWN0IGZvciBEUFAgY2FuZGlkYXRlIGlzIGEgY29uc2lkZXJhYmxlIDAuNTElOgoKYGBge3IgdHVybm91dF9vbl9kcHBfdm90ZV9zaGFyZX0KY29lZnRlc3QoZml0MywgdmNvdj12Y292SEMoZml0MywgdHlwZT0iSEMwIikpCmBgYAoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMjIOesrOWNgeWxhueri+azleWnlOWToemBuOiIiee1kOaenCBUaGUgMTB0aCBMZWdpc2xhdGl2ZSBFbGVjdGlvbiBSZXN1bHRzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKIyMjIOS4jeWIhuWNgOeri+WnlCBQYXJ0eSBMaXN0IHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKYGBge3IgcHJvY2Vzc19wYXJ0eV9saXN0X3Jlc3VsdHMsIHJlc3VsdHM9ImhpZGUifQojIFByb2Nlc3MgcGFydHktbGlzdCByZXN1bHRzLgojIE5vdGUgdGhhdCB0aGUgdGFibGUgaXMgZG93biB0byBwb2xsaW5nIHBsYWNlIGxldmVsLgpwYXJ0eWxpc3QgPC0gZnJlYWQoImRhdGEvcHJvY2Vzc2VkL2xlZ2lzbGF0aXZlL2xlZ2lzbGF0aXZlX3BhcnR5bGlzdC5jc3YiLCBlbmNvZGluZz0iVVRGLTgiKQpwYXJ0eWxpc3QgPC0gcGFydHlsaXN0WywgUmVnaW9uOj10cmltd3MoUmVnaW9uLCB3aGl0ZXNwYWNlPSJbXFxoXFx2XSIpXSAgIyBUcmltIGZ1bGwtd2lkdGggd2hpdGUgc3BhY2UuCmNvbHNfYXJlYSA8LSBjKCJCeSIsICJSZWdpb24iLCAiVmlsbGFnZSIsICJQbGFjZSIpCmNvbHNfcGFydHkgPC0gbmFtZXMocGFydHlsaXN0KVs3OjI1XSAgIyBUaGVyZSBhcmUgMTkgcGFydGllcyBpbiB0b3RhbC4KcGFydHlsaXN0X2wgPC0gbWVsdChwYXJ0eWxpc3RbLCBjKGNvbHNfYXJlYSwgY29sc19wYXJ0eSksIHdpdGg9RkFMU0VdLAogICAgICAgICAgICAgICAgICAgaWQudmFycz1jb2xzX2FyZWEsIHZhcmlhYmxlLm5hbWU9IlBhcnR5IiwgdmFsdWUubmFtZT0iVm90ZXMiKQpwYXJ0eWxpc3RfbCA8LSBwYXJ0eWxpc3RfbFssIFBhcnR5Oj1mYWN0b3IoUGFydHkpXQpwYXJ0eWxpc3RfZmluYWwgPC0gcGFydHlsaXN0X2xbLCAuKFZvdGVzPXN1bShWb3RlcykpLCBieT0uKFBhcnR5KV0KcGFydHlsaXN0X2ZpbmFsIDwtIHBhcnR5bGlzdF9maW5hbFssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyldCmBgYAoKRm9yIHBhcnR5IGxpc3QgdG8gc2VjdXJlIGF0IGxlYXN0IG9uZSBzZWF0IGluIFtMZWdpc2xhdGl2ZSBZdWFuXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZWdpc2xhdGl2ZV9ZdWFuKSwKaXQgbXVzdCBvYnRhaW4gbWluaW1hbGx5IDUlIG9mIHBhcnR5LWxpc3Qgdm90ZXMuCklmIGEgcGFydHkgY2Fubm90IHBhc3MgdGhlIDUlIHRocmVzaG9sZCBidXQgcGFzcyB0aGUgMyUgdGhyZXNob2xkLAppdCB3aWxsIGJlIHNwb25zb3JlZCBieSB0aGUgZ292ZXJubWVudCBpbiB0aGUgZm9sbG93aW5nIDQgeWVhcnMgKGJhc2VkIG9uIG51bWJlciBvZiB2b3RlcyBvYnRhaW5lZCkuClRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3Igc21hbGwgcGFydGllcyB0byBjb3ZlciB0aGVpciBvcGVyYXRpbmcgY29zdHMuCgpgYGB7ciBwYXJ0eWxpc3RfZmluYWxfcmVzdWx0LCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iMjAyMCBMZWdpc2xhdGl2ZSBFbGVjdGlvbiBQYXJ0eSBMaXN0IEZpbmFsIE91dGNvbWUifQp0aHJlc18wMDMgPC0gc3VtKHBhcnR5bGlzdF9maW5hbCRWb3RlcykgKiAuMDMKdGhyZXNfMDA1IDwtIHN1bShwYXJ0eWxpc3RfZmluYWwkVm90ZXMpICogLjA1CgpnZ3Bsb3QocGFydHlsaXN0X2ZpbmFsLCBhZXMoeD1yZW9yZGVyKFBhcnR5LCBWb3RlcyksIHk9Vm90ZXMpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgbGFicyh4PSLmlL/pu6giLCB5PSLlvpfnpajmlbgiLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPkuI3liIbljYDnq4vlp5TpgbjoiInntZDmnpwiKSArCiAgZ2VvbV90ZXh0KGFlcyh4PVBhcnR5LCB5PVZvdGVzLAogICAgICAgICAgICAgICAgbGFiZWw9c3ByaW50ZigiJXMgKCVzKSIsIHNjYWxlczo6Y29tbWEoVm90ZXMpLCBzY2FsZXM6OnBlcmNlbnQoU2hhcmUsIC4wMSkpKSwKICAgICAgICAgICAgc2l6ZT0zLCBoanVzdD0tLjA1KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmNvbW1hLCBsaW1pdHM9YygwLCBtYXgocGFydHlsaXN0X2ZpbmFsJFZvdGVzKSAqIDEuMjUpKSArCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD10aHJlc18wMDMsIGNvbG9yPSLoo5zliqkgU3BvbnNvcnNoaXAiKSwgbGluZXR5cGU9MykgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9dGhyZXNfMDA1LCBjb2xvcj0i5bit5qyhIFNlYXRzIiksIGxpbmV0eXBlPTMpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKG5hbWU9IumWgOaquyBUaHJlc2hvbGQiLCB2YWx1ZXM9YygicmVkIiwgImdyZWVuIikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsKICBjb29yZF9mbGlwKCkKYGBgCgojIyMjIEJ5IENvdW50eSDkvp3nuKPluIIKCldlIGdyb3VwIHBhcnRpZXMgd2l0aCBsZXNzIHRoYW4gMiUgdm90ZXMgaW50byAib3RoZXJzIiB0byBtYWtlIHRoZSByZXN0IG9mIHRoZSBwbG90cyBlYXNpZXIgdG8gcmVhZC4KCmBgYHtyIHByb2Nlc3NfcGFydHlfbGlzdF9jb3VudHksIHJlc3VsdHM9ImhpZGUifQpwYXJ0eWxpc3RfY291bnR5IDwtIHBhcnR5bGlzdF9sWywgLihWb3Rlcz1zdW0oVm90ZXMpKSwgYnk9LihCeSwgUGFydHkpXQpzbWFsbF9wYXJ0aWVzIDwtIHBhcnR5bGlzdF9maW5hbFtTaGFyZSA8IC4wMiwgUGFydHldCgojIENvbXB1dGUgc2hhcmVzIGZvciBhbGwgcGFydGllcy4KcGFydHlsaXN0X2NvdW50eSA8LSBwYXJ0eWxpc3RfY291bnR5WywgUGFydHk6PWZhY3RvcihQYXJ0eSldCnBhcnR5bGlzdF9jb3VudHkgPC0gcGFydHlsaXN0X2NvdW50eVssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyksIGJ5PS4oQnkpXQoKIyBBYnNvcmIgc21hbGwgcGFydGllcyBhbmQgcmUtY29tcHV0ZSBzaGFyZXMuCnBhcnR5bGlzdF9jb3VudHkyIDwtIGNvcHkocGFydHlsaXN0X2NvdW50eSkKcGFydHlsaXN0X2NvdW50eTIgPC0gcGFydHlsaXN0X2NvdW50eTJbUGFydHkgJWluJSBzbWFsbF9wYXJ0aWVzLCBQYXJ0eTo9IuWFtuS7liJdCnBhcnR5bGlzdF9jb3VudHkyIDwtIHBhcnR5bGlzdF9jb3VudHkyWywgUGFydHk6PWZhY3RvcihQYXJ0eSldCnBhcnR5bGlzdF9jb3VudHkyIDwtIHBhcnR5bGlzdF9jb3VudHkyWywgLihWb3Rlcz1zdW0oVm90ZXMpKSwgYnk9LihCeSwgUGFydHkpXSAgIyBSZS1ncm91cC4KcGFydHlsaXN0X2NvdW50eTIgPC0gcGFydHlsaXN0X2NvdW50eTJbLCBTaGFyZTo9Vm90ZXMgLyBzdW0oVm90ZXMpLCBieT0uKEJ5KV0KCiMgQ29tcHV0ZSBEUFAtS01UIHNoYXJlIGRpZmZlcmVuY2VzLgpwYXJ0eWxpc3RfY291bnR5X2diIDwtIHBhcnR5bGlzdF9jb3VudHlbUGFydHkgJWluJSBjKCIoMTQpICDmsJHkuLvpgLLmraXpu6giLCAiKDkpICDkuK3lnIvlnIvmsJHpu6giKV0Kc2V0b3JkZXIocGFydHlsaXN0X2NvdW50eV9nYiwgQnksIFBhcnR5KQpwYXJ0eWxpc3RfY291bnR5X2diX2RpZmYgPC0gcGFydHlsaXN0X2NvdW50eV9nYlssIC4oU2hhcmVfRGlmZj1TaGFyZVsyXSAtIFNoYXJlWzFdKSwgYnk9LihCeSldCnBhcnR5bGlzdF9jb3VudHlfZ2JfZGlmZiA8LSBwYXJ0eWxpc3RfY291bnR5X2diX2RpZmZbLCBkcHBfd2luOj1TaGFyZV9EaWZmID4gMF0KYGBgCgpgYGB7ciBwYXJ0eV9saXN0X2NvdW50eSwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5jYXA9IjIwMjAgTGVnaXNsYXRpdmUgRWxlY3Rpb24gUGFydHkgTGlzdCBWb3RlIFNoYXJlcyBieSBDb3VudHkifQpwYXJ0eV9jb2xvcnMgPC0gYygiZGFya29yYW5nZSIsICJkYXJrZ3JlZW4iLCAieWVsbG93IiwgImRvZGdlcmJsdWUiLCAiZ3JlZW4iLCAiZ3JlZW4zIiwgImxpZ2h0Ymx1ZSIsICJncmV5IikKZ2dwbG90KHBhcnR5bGlzdF9jb3VudHkyLCBhZXMoeD1yZW9yZGVyKEJ5LCBWb3RlcyksIHk9U2hhcmUsIGZpbGw9UGFydHkpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0ic3RhY2siLCB3aWR0aD0uOCkgKwogIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KFNoYXJlLCAuMDEpKSwgcG9zaXRpb249cG9zaXRpb25fc3RhY2sodmp1c3Q9LjUpLCBzaXplPTIsIGFuZ2xlPTIwKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZT0i5pS/6buoIiwgdmFsdWVzPXBhcnR5X2NvbG9ycykgKwogIGxhYnMoeD0i57ij5biC77yI5L6d57i956Wo5pW45o6S5bqP77yJIiwgeT0i5b6X56Wo546HIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj5LiN5YiG5Y2A56uL5aeU5ZCE57ij5biC5pS/6buo5b6X56Wo546HIikgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQpgYGAKCk9yIHRvIGluY29ycG9yYXRlIGFsbCBwYXJ0aWVzIGludG8gb25lIHBsb3QsCndlIGNhbiBwbG90IHRoZSBpbnRlcmFjdGl2ZSB2ZXJzaW9uIHdpdGggbm8gYW5ub3RhdGlvbiBidXQgZGV0YWlsZWQgaG92ZXItb24gaW5mbzoKCmBgYHtyIHBhcnR5X2xpc3RfY291bnR5X2Jhcl9wbG90bHksIGZnLmNhcD0iMjAyMCBMZWdpc2xhdGl2ZSBFbGVjdGlvbiBQYXJ0eSBMaXN0IFZvdGUgU2hhcmVzIGJ5IENvdW50eSJ9CiMgSGFuZGxlIGJhciBjb2xvcmluZy4gKFF1aXRlIGFuIGVmZm9ydCEpCiMgV2UgYm9ycm93IHRoZSByZXByZXNlbnRpbmcgY29sb3JzIGZyb20gd2lraSBwYWdlICh3aGljaCBzZWVtcyB0byBiZSBiYXNlZCBvbiBwYXJ0eSBsb2dvKS4KcGFnZSA8LSByZWFkX2h0bWwoImh0dHBzOi8vemgud2lraXBlZGlhLm9yZy93aWtpLzIwMjDlubTkuK3oj6/msJHlnIvnq4vms5Xlp5Tlk6HpgbjoiIkiKQpub2RlcyA8LSBodG1sX25vZGVzKHBhZ2UsIHhwYXRoPSIvL3RhYmxlW2NvbnRhaW5zKEBjbGFzcywgJ3dpa2l0YWJsZSBzb3J0YWJsZScpIGFuZCBjb250YWlucyguLCAnMjAyMOW5tOS4reiPr+awkeWci+eri+azleWnlOWToeaUv+m7qOaPkOWQjeWQjemhjScpXS8vdHIvdGRbMV0iKQp3X2NvbG9ycyA8LSBnc3ViKCIuKlsgXXw7IiwgIiIsICBodG1sX2F0dHIobm9kZXMsICJzdHlsZSIpKQp3X3BhcnR5X25hbWVzIDwtIGh0bWxfdGV4dChub2RlcywgdHJpbT1UUlVFKQphbGxfcGFydHlfY29sb3JzIDwtIGRhdGEudGFibGUocD13X3BhcnR5X25hbWVzLCBjb2xvcj13X2NvbG9ycykKcGFydHlfbmFtZV93X251bSA8LSBkYXRhLnRhYmxlKFBhcnR5PWxldmVscyhwYXJ0eWxpc3RfY291bnR5JFBhcnR5KSkKcGFydHlfbmFtZV93X251bSA8LSBwYXJ0eV9uYW1lX3dfbnVtWywgcDo9Z3N1YigiLipbIF0iLCAiIiwgUGFydHkpXQpwYXJ0eV9uYW1lX3dfbnVtIDwtIG1lcmdlKHBhcnR5X25hbWVfd19udW0sIGFsbF9wYXJ0eV9jb2xvcnMsIGJ5PSJwIikKCiMgQWxpZ24gcGxvdGx5IGludGVybmFsIG9yZGVyaW5nIG9mIGdyb3VwaW5nLiAoSXQgZG9lc24ndCByZXNwZWN0IGZhY3RvciBsZXZlbC4pCnBhcnR5X25hbWVfd19udW0gPC0gcGFydHlfbmFtZV93X251bVssIGk6PWFzLmludGVnZXIoIGdzdWIoIl5cXCh8XFwpLioiLCAiIiwgUGFydHkpKV0Kc2V0b3JkZXIocGFydHlfbmFtZV93X251bSwgaSkKCiMgRmluYWxseS4uLgpwbG90X2x5KHBhcnR5bGlzdF9jb3VudHksIHk9fnJlb3JkZXIoQnksIFZvdGVzKSwgeD1+U2hhcmUsIHRleHQ9flZvdGVzLAogICAgICAgIHR5cGU9ImJhciIsICBvcmllbnRhdGlvbj0iaCIsCiAgICAgICAgY29sb3I9flBhcnR5LCBjb2xvcnM9cGFydHlfbmFtZV93X251bSRjb2xvciwKICAgICAgICB3aWR0aD04MDAsIGhlaWdodD02MDApICU+JQogIGxheW91dChiYXJtb2RlPSJzdGFjayIsCiAgICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj5LiN5YiG5Y2A56uL5aeU5ZCE57ij5biC5pS/6buo5b6X56Wo546HIiwKICAgICAgICAgeWF4aXM9bGlzdCh0aXRsZT0i57ij5biC77yI5L6d57i956Wo5pW45o6S5bqP77yJIiksCiAgICAgICAgIHhheGlzPWxpc3QodGl0bGU9IiIpLAogICAgICAgICBsZWdlbmQ9bGlzdChvcmllbnRhdGlvbj0iaCIpLAogICAgICAgICBtYXJnaW49bGlzdCh0PTUwKSkKYGBgCgpgYGB7ciBwYXJ0eV9saXN0X2RwcF9rbXRfZGlmZiwgZmlnLmNhcD0iMjAyMCBMZWdpc2xhdGl2ZSBFbGVjdGlvbiBQYXJ0eSBMaXN0IERQUC1LTVQgU2hhcmUgRGlmZmVyZW5jZSBieSBDb3VudHkifQpwIDwtIGdncGxvdChwYXJ0eWxpc3RfY291bnR5X2diX2RpZmYsIGFlcyh4PXJlb3JkZXIoQnksIFNoYXJlX0RpZmYpLCBmaWxsPWRwcF93aW4sIHk9U2hhcmVfRGlmZikpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPS44LCBjb2xvcj0iYmxhY2siLCBhbHBoYT0uNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJkb2RnZXJibHVlIiwgImdyZWVuMyIpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KFNoYXJlX0RpZmYpKSwgcG9zaXRpb249cG9zaXRpb25fc3RhY2sodmp1c3Q9LjUpLCBzaXplPTIuNSkgKwogIGxhYnMoeD0i57ij5biC77yI5L6d5b6X56Wo546H5beu5o6S5bqP77yJIiwgeT0i57ag6JeN5b6X56Wo546H5beuIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj5LiN5YiG5Y2A56uL5aeU5ZCE57ij5biC77ya57ag6JeN5b6X56Wo546H5beuIikgKwogIGNvb3JkX2ZsaXAoKQoKZ2dwbG90bHkocCwgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwKQpgYGAKCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMjIEJ5IENvdW50eSBTdWItUmVnaW9uIOS+nemEiemOruW4guWNgAoKYGBge3IgcHJvY2Vzc19wYXJ0eV9saXN0X3JlZ2lvbiwgcmVzdWx0cz0iaGlkZSJ9CiMgUHJvY2VzcyByZWdpb24tbGV2ZWwgcGFydHkgbGlzdCByZXN1bHRzLgpwYXJ0eWxpc3RfcmVnaW9uIDwtIHBhcnR5bGlzdF9sWywgLihWb3Rlcz1zdW0oVm90ZXMpKSwgYnk9LihCeSwgUmVnaW9uLCBQYXJ0eSldCnBhcnR5bGlzdF9yZWdpb24gPC0gcGFydHlsaXN0X3JlZ2lvblssIFBhcnR5Oj1mYWN0b3IoUGFydHkpXSAgIyBSZW5ldyBsZXZlbC4KcGFydHlsaXN0X3JlZ2lvbiA8LSBwYXJ0eWxpc3RfcmVnaW9uWywgU2hhcmU6PVZvdGVzIC8gc3VtKFZvdGVzKSwgYnk9LihCeSwgUmVnaW9uKV0KcGFydHlsaXN0X3JlZ2lvbiA8LSBwYXJ0eWxpc3RfcmVnaW9uWyFQYXJ0eSAlaW4lIHNtYWxsX3BhcnRpZXNdICAjIElnbm9yZSBzbWFsbCBwYXJ0aWVzLgoKIyBHZXQgcHJlc2lkZW50aWFsIGludmFsaWQgdm90ZSBzaGFyZSBhbmQgdHVybm91dC4KcGFydHlsaXN0X3JlZ2lvbiA8LSBwYXJ0eWxpc3RfcmVnaW9uW3BfcmVnaW9uLCBgOj1gKAogIFBfSW52YWxpZF9Wb3Rlc19TaGFyZT1pLkludmFsaWRfVm90ZXNfU2hhcmUsCiAgUF9UdXJub3V0PWkuVHVybm91dAogICksIG9uPS4oQnksIFJlZ2lvbildCgojIEdldCBwcmVzaWRlbnRpYWwgdm90ZSByZXN1bHRzLgpwX3JlZ2lvbl9sIDwtIHBfcmVnaW9uX2xbLCBQX1NoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyksIGJ5PS4oQnksIFJlZ2lvbildCnBhcnR5bGlzdF9yZWdpb24gPC0gbWVyZ2UocGFydHlsaXN0X3JlZ2lvbiwgcF9yZWdpb25fbFssIC4oQnksIFJlZ2lvbiwgQ2FuZGlkYXRlLCBQX1NoYXJlLCBTaGFyZV9EaWZmKV0sIGJ5PWMoIkJ5IiwgIlJlZ2lvbiIpLCBhbGxvdy5jYXJ0ZXNpYW49VFJVRSkKCiMgSGVscGVyIGZ1bmN0aW9uIGZvciBzY2F0dGVyIHBsb3QuCnNjYXR0ZXJwbG90IDwtIGZ1bmN0aW9uKCkgewogIGdncGxvdChwYXJ0eWxpc3RfcmVnaW9uLCBhZXMoeD1TaGFyZSwgeT1QX1NoYXJlLCBjb2xvcj1DYW5kaWRhdGUpKSArCiAgICBnZW9tX3JlY3QoZGF0YT11bmlxdWUocGFydHlsaXN0X3JlZ2lvbiwgYnk9YygiUGFydHkiLCAiQ2FuZGlkYXRlIikpLCBhZXMoZmlsbD1QYXJ0eSksCiAgICAgICAgICAgICAgeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PUluZiwgYWxwaGE9LjI1KSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cGFydHlfY29sb3JzKSArCiAgICBnZW9tX3BvaW50KHNpemU9LjUpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBhZXMoY29sb3I9Q2FuZGlkYXRlKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1tYWluX3BhcnR5X2NvbG9ycykgKwogICAgbGFicyh4PSLnuL3ntbHlgJnpgbjkurrlvpfnpajnjociLCB5PSLkuI3liIbljYDmlL/pu6jlvpfnpajnjociLAogICAgICAgICB0aXRsZT0iMjAyMOe4vee1seWAmemBuOS6uuW+l+elqOeOh++8uOS4jeWIhuWNgOaUv+m7qOW+l+elqOeOhyIpICsKICAgIGZhY2V0X3dyYXAoUGFydHkgfiBDYW5kaWRhdGUsIG5jb2w9Mywgc2NhbGVzPSJmcmVlIikKfQpgYGAKCldlIGNhbiBwbG90IHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHByZXNpZGVudGlhbCBjYW5kaWRhdGUgdm90ZSBzaGFyZXMgYW5kIHBhcnR5IHZvdGUgc2hhcmVzIGF0IHJlZ2lvbiBsZXZlbC4KQnV0IHdlIG11c3QgYmUgdmVyeSBjYXJlZnVsIGluIGludGVycHJldGluZyB0aGUgcmVsYXRpb24gc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgZGlyZWN0aW9uIG9mIHN1Y2ggcmVsYXRpb24sIGlmIGFueS4KU3RyaWN0bHkgc3BlYWtpbmcsCndlIGRvbid0IGV2ZW4ga25vdyB3aGV0aGVyIHRoZXkgYXJlIGNhdXNhbGx5IHJlbGF0ZWQgYXQgYWxsLgoKYGBge3IsIGZpZy5oZWlnaHQ9MTUsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSIyMDIwIExlZ2lzbGF0aXZlIEVsZWN0aW9uIFBhcnR5IExpc3QgU2hhcmVzIHYucy4gUHJlc2lkZW50aWFsIFZvdGVzIn0Kc2NhdHRlcnBsb3QoKQpgYGAKCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMg5YiG5Y2A56uL5aeUIENvbnN0aXR1ZW5jeSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIyMgT3ZlcmFsbCDmpoLmi6wKCmBgYHtyIHByb2Nlc3NfY29uc3RpdHVlbmN5LCByZXN1bHRzPSJoaWRlIn0KIyBQcm9jZXNzIGNvbnN0aXR5ZW5jeSByZXN1bHRzLgojIE5vdGUgdGhhdCBlYWNoIGRpc3RyaWN0IGNhbiBoYXZlIGEgdmFyeWluZyBudW1iZXIgb2YgY2FuZGlkYXRlcy4KaW5maWxlc19jb25zdGl0dWVuY3kgPC0gZ3JlcCgKICAiY29uc3RpdHVlbmN5IixkaXIoImRhdGEvcHJvY2Vzc2VkL2xlZ2lzbGF0aXZlLyIsIGZ1bGwubmFtZXM9VFJVRSksIHZhbHVlPVRSVUUpCgpjX2FsbCA8LSBsYXBwbHkoaW5maWxlc19jb25zdGl0dWVuY3ksIGZyZWFkLCBlbmNvZGluZz0iVVRGLTgiKQpuYW1lcyhjX2FsbCkgPC0gZ3N1YigibGVnaXNsYXRpdmVfY29uc3RpdHVlbmN5XyIsICIiLAogICAgICAgICAgICAgICAgICAgICB0b29sczo6ZmlsZV9wYXRoX3NhbnNfZXh0KGJhc2VuYW1lKGluZmlsZXNfY29uc3RpdHVlbmN5KSkpCgojIENvbnZlcnQgYWxsIHRhYmxlIGZyb20gd2lkZSB0byBsb25nLgp3aWRlX3RvX2xvbmcgPC0gZnVuY3Rpb24oRFQpIHsKICBjYW5kaWRhdGVfc3RhcnRfaW5kIDwtIDcKICBjYW5kaWRhdGVfZW5kX2luZCA8LSBuY29sKERUKSAtIDgKICBjb2xzX2NhbmRpZGF0ZSA8LSBuYW1lcyhEVClbY2FuZGlkYXRlX3N0YXJ0X2luZDpjYW5kaWRhdGVfZW5kX2luZF0KICBjb2xzX3JlZ2lvbiA8LSBjKCJCeSIsICJSZWdpb24iLCAiVmlsbGFnZSIsICJQbGFjZSIpCiAgb3V0IDwtIG1lbHQoRFRbLCBjKGNvbHNfcmVnaW9uLCBjb2xzX2NhbmRpZGF0ZSksIHdpdGg9RkFMU0VdLAogICAgICAgICAgICAgIGlkLnZhcnM9Y29sc19yZWdpb24sIHZhcmlhYmxlLm5hbWU9IkNhbmRpZGF0ZSIsIHZhbHVlLm5hbWU9IlZvdGVzIikKICBvdXQKfQoKY19sIDwtIHJiaW5kbGlzdChsYXBwbHkoY19hbGwsIHdpZGVfdG9fbG9uZykpCmNfbCA8LSBjX2xbLCBSZWdpb246PXRyaW13cyhSZWdpb24sIHdoaXRlc3BhY2U9IltcXGhcXHZdIildICAjIFRyaW0gZnVsbC13aWR0aCB3aGl0ZQoKIyBFeHRyYWN0IGNhbmRpZGF0ZSBwYXJ0eSBmb3IgYWxsIGRpc3RyaWN0cy4KY19sIDwtIGNfbFssIFBhcnR5Oj1nc3ViKCIuKlsgXSIsICIiLCBDYW5kaWRhdGUpXQoKIyBTdW0gYnkgcGFydHkuCmNfcGFydHkgPC0gY19sWywgLihWb3Rlcz1zdW0oVm90ZXMpKSwgYnk9LihQYXJ0eSldCmNfcGFydHkgPC0gY19wYXJ0eVssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyldCmBgYAoKQ2hlY2sgbnVtYmVyIG9mIHBvbGxpbmcgcGxhY2VzIGZvciBlYWNoIGRpc3RyaWN0OgoKYGBge3IgbnVtYmVyX29mX3BwbGFjZV9ieV9kaXN0cmljdH0KY19wcGxhY2VfY250IDwtIGNfbFssIC5OLCBieT0uKEJ5KV0Kc2V0b3JkZXIoY19wcGxhY2VfY250LCBCeSkKc2V0bmFtZXMoY19wcGxhY2VfY250LCBjKCJEaXN0cmljdCIsICJOdW0gb2YgUG9sbGluZyBQbGFjZSIpKQpjX3BwbGFjZV9jbnRbXQpgYGAKCmBgYHtyIGNvbnN0aXR1ZW5jeV9wYXJ0eV9yZXN1bHQsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9OC4zMywgZmlnLmNhcD0iMjAyMCBMZWdpc2xhdGl2ZSBFbGVjdGlvbiBDb25zdGl0dWVuY3kgT3V0Y29tZSBieSBQYXJ0eSJ9CmdncGxvdChjX3BhcnR5LCBhZXMoeD1yZW9yZGVyKFBhcnR5LCBWb3RlcyksIHk9Vm90ZXMpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgbGFicyh4PSLmlL/pu6giLCB5PSLlvpfnpajmlbgiLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPliIbljYDnq4vlp5TpgbjoiInntZDmnpw65L6d5YCZ6YG45Lq65pS/6buoIikgKwogIGdlb21fdGV4dChhZXMoeD1QYXJ0eSwgeT1Wb3RlcywKICAgICAgICAgICAgICAgIGxhYmVsPXNwcmludGYoIiVzICglcykiLCBzY2FsZXM6OmNvbW1hKFZvdGVzKSwgc2NhbGVzOjpwZXJjZW50KFNoYXJlLCAuMDEpKSksCiAgICAgICAgICAgIHNpemU9MywgaGp1c3Q9LS4wNSkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9c2NhbGVzOjpjb21tYSwgbGltaXRzPWMoMCwgbWF4KGNfcGFydHkkVm90ZXMpICogMS4yKSkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMjIEJ5IENvdW50eSDkvp3nuKPluIIKCmBgYHtyIHByb2Nlc3NfY29uc3RpdHVlbmN5X2J5X3BhcnR5X2J5X2NvdW50eSwgcmVzdWx0cz0iaGlkZSJ9CiMgS2VlcCBvbmx5IHRoZSB0b3AgZmV3IHBhcnRpZXMuCmNfdG9wX3BhcnR5IDwtIGNfcGFydHlbU2hhcmUgPiAuMDEsIFBhcnR5XQpjX3BhcnR5X2NvbG9ycyA8LSBjKCJkb2RnZXJibHVlIiwgImdyZWVuMyIsICJibGFjayIsICJ5ZWxsb3ciLCAibGlnaHRibHVlIiwgImRhcmtncmVlbiIsICJkYXJrZ3JleSIpCgojIFN1bSBieSBwYXJ0eSBieSBjb3VudHkuCmNfbCA8LSBjX2xbLCBDb3VudHk6PWdzdWIoIijnrKxbMC05XSspP+mBuOiIieWNgCIsICIiLCBCeSldCmNfcGFydHlfY291bnR5IDwtIGNvcHkoY19sKQpjX3BhcnR5X2NvdW50eSA8LSBjX3BhcnR5X2NvdW50eVshUGFydHkgJWluJSBjX3RvcF9wYXJ0eSwgUGFydHk6PSLlhbbku5YiXQpjX3BhcnR5X2NvdW50eSA8LSBjX3BhcnR5X2NvdW50eVssIC4oVm90ZXM9c3VtKFZvdGVzKSksIGJ5PS4oQ291bnR5LCBQYXJ0eSldCmNfcGFydHlfY291bnR5IDwtIGNfcGFydHlfY291bnR5WywgU2hhcmU6PVZvdGVzIC8gc3VtKFZvdGVzKSwgYnk9LihDb3VudHkpXQpjX3BhcnR5X2NvdW50eVssIFBhcnR5Oj1mYWN0b3IoUGFydHksIGxldmVsPWMoY190b3BfcGFydHksICLlhbbku5YiKSldCgojIE9yZGVyIGNvdW50eSBieSB0b3RhbCB2b3Rlcy4KY291bnR5X3ZfY250IDwtIGNfbFssIC4oVm90ZXM9c3VtKFZvdGVzKSksIGJ5PS4oQ291bnR5KV0Kc2V0b3JkZXIoY291bnR5X3ZfY250LCAtVm90ZXMpCmNfcGFydHlfY291bnR5IDwtIGNfcGFydHlfY291bnR5WywgQ291bnR5Oj1mYWN0b3IoQ291bnR5LCBjb3VudHlfdl9jbnQkQ291bnR5KV0KCiMgQ29tcHV0ZSBEUFAtS01UIHNoYXJlIGRpZmZlcmVuY2VzLgpjX3BhcnR5X2NvdW50eV9nYiA8LSBjX3BhcnR5X2NvdW50eVtQYXJ0eSAlaW4lIGMoIuawkeS4u+mAsuatpem7qCIsICLkuK3lnIvlnIvmsJHpu6giKV0Kc2V0b3JkZXIoY19wYXJ0eV9jb3VudHlfZ2IsIENvdW50eSwgUGFydHkpCiMgTm90ZSB0aGF0IERQUCBoYXMgbm8gY2FuZGlkYXRlIGZvciAxIGNvdW50eS4gV2UgY291bnQgdGhlIHNoYXJlIGFzIDAuCmNfcGFydHlfY291bnR5X2diX2RpZmYgPC0gY19wYXJ0eV9jb3VudHlfZ2JbCiAgLCAuKFNoYXJlX0RpZmY9aWZlbHNlKGlzLm5hKFNoYXJlWzJdKSwgMCwgU2hhcmVbMl0pIC0gU2hhcmVbMV0pLCBieT0uKENvdW50eSldCmNfcGFydHlfY291bnR5X2diX2RpZmYgPC0gY19wYXJ0eV9jb3VudHlfZ2JfZGlmZlssIGRwcF93aW46PVNoYXJlX0RpZmYgPiAwXQpgYGAKCldlIHBsb3QgYWxsIHBhcnRpZXMgd2l0aCBtb3JlIHRoYW4gMSUgdm90ZSBzaGFyZSBieSBjb3VudHk6CgpgYGB7ciBjb25zdGl0dWVuY3lfcGFydHlfY291bnR5LCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmhlaWdodD0xNSwgZmlnLndpZHRoPTguMzMsIGZpZy5jYXA9IjIwMjAgTGVnaXNsYXRpdmUgRWxlY3Rpb24gQ29uc3RpdHVlbmN5IFNoYXJlcyBieSBQYXJ0eSBieSBDb3VudHkifQpnZ3Bsb3QoY19wYXJ0eV9jb3VudHksIGFlcyh4PXJlb3JkZXIoUGFydHksIFZvdGVzKSwgeT1TaGFyZSwgZmlsbD1QYXJ0eSkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIsIHdpZHRoPS43NSkgKwogIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KFNoYXJlLCAuMDEpKSwKICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpLCBzaXplPTMsIGhqdXN0PS0uMSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxKSwgYnJlYWtzPXNlcSgwLCAxLCAuMikpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lPSLmlL/pu6giLCB2YWx1ZXM9Y19wYXJ0eV9jb2xvcnMpICsKICBsYWJzKHg9IuaUv+m7qCIsIHk9IuW+l+elqOeOhyIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+WIhuWNgOeri+WnlOWQhOe4o+W4guaUv+m7qOW+l+elqOeOhyIpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBmYWNldF93cmFwKENvdW50eSB+IC4sIG5jb2w9NSkKYGBgCgpBbHNvIGV4YW1pbmUgdGhlIERQUC1LTVQgZGlmZmVyZW5jZSBmb3IgY29uc3RpdHVlbmN5IHZvdGVzIGJ5IGNvdW50eToKCmBgYHtyIGNvbnN0aXR1ZW5jeV9kcHBfa210X2RpZmYsIGZpZy5jYXA9IjIwMjAgTGVnaXNsYXRpdmUgRWxlY3Rpb24gQ29uc3RpdHVlbmN5IERQUC1LTVQgU2hhcmUgRGlmZmVyZW5jZSBieSBDb3VudHkifQpwIDwtIGdncGxvdChjX3BhcnR5X2NvdW50eV9nYl9kaWZmLCBhZXMoeD1yZW9yZGVyKENvdW50eSwgU2hhcmVfRGlmZiksIGZpbGw9ZHBwX3dpbiwgeT1TaGFyZV9EaWZmKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9LjgsIGNvbG9yPSJibGFjayIsIGFscGhhPS41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImRvZGdlcmJsdWUiLCAiZ3JlZW4zIikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoU2hhcmVfRGlmZikpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9Mi41KSArCiAgbGFicyh4PSLnuKPluILvvIjkvp3lvpfnpajnjoflt67mjpLluo/vvIkiLCB5PSLntqDol43lvpfnpajnjoflt64iLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPliIbljYDnq4vlp5TlkITnuKPluILvvJrntqDol43lvpfnpajnjoflt64iKSArCiAgY29vcmRfZmxpcCgpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMjIyMgVGFpY2h1bmcgM3JkIERpc3RyaWN0IOWPsOS4reW4guesrOS4iemBuOWNgAoKYGBge3IgcHJvY2Vzc190YWljaHVuZ18zLCByZXN1bHRzPSJoaWRlIn0KIyBDb25zb2xpZGF0ZSBib3RoIHBhcnR5LWxpc3QgYW5kIGNvbnN0aXR1ZW5jeSByZXN1bHRzIGZvciBUYWljaHVuZyBkaXN0cmljdCAzLgp0YzMgPC0gY19sW0J5ID09ICLoh7rkuK3luILnrKwz6YG46IiJ5Y2AIl0KdGMzIDwtIHRjM1ssIENfU2hhcmU6PVZvdGVzIC8gc3VtKFZvdGVzKV0KCiMgQ29tcHV0ZSBwYXJ0eS1saXN0IHZvdGUgc2hhcmVzIGJ5IHBvbGxpbmcgcGxhY2UuCnRjM19wbCA8LSBwYXJ0eWxpc3RfbFtCeSA9PSB0YzMkQ291bnR5WzFdICYgUmVnaW9uICVpbiUgdGMzJFJlZ2lvbl0KdGMzX3BsIDwtIHRjM19wbFssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyksIGJ5PS4oUGxhY2UpXQp0YzNfY2FuZGlkYXRlcyA8LSBjKCIoMykg5rSq5oWI5bq4IOeEoSIsICIoNCkg5by1552/5YCJIOWPsOeBo+awkeecvum7qCIsICIoNikg5qWK55OK55OUIOS4reWci+Wci+awkem7qCIpCnRjM19maW5hbCA8LSBtZXJnZSh0YzNfcGwsIHRjM1tDYW5kaWRhdGUgJWluJSB0YzNfY2FuZGlkYXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4oUGxhY2UsIENhbmRpZGF0ZSwgQ19TaGFyZSldLAogICAgICAgICAgICAgICAgICAgYnk9IlBsYWNlIiwgYWxsb3cuY2FydGVzaWFuPVRSVUUpCmBgYAoKYGBge3IgdGFpY2h1bmdfM19jYW5kaWRhdGVfcmVzdWx0LCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iVGFpY2h1bmcgM3JkIERpc3RyaWN0OiBDb25zdGl0dWVuY3kgQ2FuZGlkYXRlIFNoYXJlIn0KdGMzciA8LSB0YzNbLCAuKFZvdGVzPXN1bShWb3RlcykpLCBieT0uKENhbmRpZGF0ZSldCnRjM3IgPC0gdGMzclssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyldCmdncGxvdCh0YzNyLCBhZXMoeD1yZW9yZGVyKENhbmRpZGF0ZSwgVm90ZXMpLCB5PVZvdGVzKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogIGxhYnMoeD0i5YCZ6YG45Lq6IiwgeT0i5b6X56Wo5pW4IiwgdGl0bGU9IuiHuuS4reW4guesrDPpgbjoiInljYDntZDmnpwiKSArCiAgZ2VvbV90ZXh0KGFlcyh4PXJlb3JkZXIoQ2FuZGlkYXRlLCBWb3RlcyksIHk9Vm90ZXMsCiAgICAgICAgICAgICAgICBsYWJlbD1zcHJpbnRmKCIlc1xuKCVzKSIsIHNjYWxlczo6Y29tbWEoVm90ZXMpLCBzY2FsZXM6OnBlcmNlbnQoU2hhcmUpKSksCiAgICAgICAgICAgIHNpemU9NSwgaGp1c3Q9LS4xKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmNvbW1hLCBsaW1pdHM9YygwLCBtYXgodGMzciRWb3RlcykgKiAxLjIpKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKYGBge3IsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSJUYWljaHVuZyAzcmQgRGlzdHJpY3Q6IFBhcnR5LUxpc3QgU2hhcmUifQp0YzNfcGxyIDwtIHRjM19wbFssIC4oVm90ZXM9c3VtKFZvdGVzKSksIGJ5PS4oUGFydHkpXQp0YzNfcGxyIDwtIHRjM19wbHJbLCBTaGFyZTo9Vm90ZXMgLyBzdW0oVm90ZXMpXQp0YzNfcGxyIDwtIHRjM19wbHJbU2hhcmUgPiAuMDFdCnNldG9yZGVyKHRjM19wbHIsIC1Wb3RlcykKdGMzX3BsciA8LSB0YzNfcGxyWywgUGFydHk6PWZhY3RvcihQYXJ0eSldCmdncGxvdCh0YzNfcGxyLCBhZXMoeD1yZW9yZGVyKFBhcnR5LCBWb3RlcyksIHk9Vm90ZXMsIGZpbGw9UGFydHkpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImRhcmtvcmFuZ2UiLCAiZGFya2dyZWVuIiwgInllbGxvdyIsICJkb2RnZXJibHVlIiwgImdyZWVuIiwgImdyZWVuMyIsICJsaWdodGJsdWUiKSkgKwogIGxhYnMoeD0i5pS/6buoIiwgeT0i5b6X56Wo5pW4IiwgdGl0bGU9IuiHuuS4reW4guesrDPpgbjoiInljYDkuI3liIbljYDmlL/pu6jntZDmnpwiKSArCiAgZ2VvbV90ZXh0KGFlcyh4PXJlb3JkZXIoUGFydHksIFZvdGVzKSwgeT1Wb3RlcywKICAgICAgICAgICAgICAgIGxhYmVsPXNwcmludGYoIiVzXG4oJXMpIiwgc2NhbGVzOjpjb21tYShWb3RlcyksIHNjYWxlczo6cGVyY2VudChTaGFyZSkpKSwKICAgICAgICAgICAgc2l6ZT00LCBoanVzdD0tLjEpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6Y29tbWEsIGxpbWl0cz1jKDAsIG1heCh0YzNfcGxyJFZvdGVzKSAqIDEuMikpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmBgYAoKYGBge3IgdGFpY2h1bmdfM19wYXJ0eWxpc3RfeF9jYW5kaWRhdGUsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuaGVpZ2h0PTMwLCBmaWcud2lkdGg9Ni41LCBmaWcuY2FwPSJUYWljaHVuZyAzcmQgRGlzdHJpY3Q6IFBhcnR5LUxpc3QgU2hhcmUgdnMgQ29uc3RpdHVlbmN5IENhbmRpZGF0ZSBTaGFyZSJ9CmdncGxvdCh0YzNfZmluYWwsIGFlcyh4PVNoYXJlLCB5PUNfU2hhcmUpKSArCiAgZ2VvbV9wb2ludChzaXplPS41KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsKICBsYWJzKHg9IuS4jeWIhuWNgOaUv+m7qOW+l+elqOeOhyIsIHk9Iueri+WnlOWAmemBuOS6uuW+l+elqOeOhyIsCiAgICAgICB0aXRsZT0i6Ie65Lit5biC56ysM+mBuOiIieWNgOS4jeWIhuWNgOaUv+m7qOW+l+elqOeOh++8uOWAmemBuOS6uuW+l+elqOeOhyIpICsKICBmYWNldF93cmFwKFBhcnR5IH4gQ2FuZGlkYXRlLCBuY29sPTMsIHNjYWxlcz0iZnJlZSIpCmBgYAoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMgUmVmZXJlbmNlcyBvbiBSIFBhY2thZ2VzCg==