Introduction

The following document shows an analysis of the data associated with the coronavirus pandemic (Covid19).

The analysis is divided into two parts, the first comprises general graphs of the data and then a numerical simulation is performed using the logistic growth model (LGM) in order to forecast the possible total number of cases by country.

The data used for this analysis are updated daily and are stored in Data Repository by Johns Hopkins CSSE

Terms used

Recovery ratio (RR)

The proportion of people recovered from a specified disease among all individuals diagnosed with the disease over a certain period of time.

\[RecoveryRatio (RR) = \frac{Recovered}{Confirmed}\]

Case Fatality ratio (CFR)

Case fatality rate, also called case fatality ratio, in epidemiology, the proportion of people who die from a specified disease among all individuals diagnosed with the disease over a certain period of time.

https://www.britannica.com/science/case-fatality-rate

\[Case Fatality Ratio (CFR) = \frac{Deaths}{Confirmed}\]

Logistic Growth Model (LGM)

Clark (2011) propose a new empirical model based on logistic growth models.

A nonlinear model formula including variables and parameters.

\[ProjectedCases = \frac{(K * t ^ n)}{(a + t ^ n)}\]

Where:

Cases = Projected Case
K = Carrying capacity
n = Hyperbolic exponent
a = Constant
t = Time

The best-fit nonlineal model is obtained by an iterative least-squared method.

The logistic growth model was used to project the progression of the disease in certain countries.

The most relevant result of the model corresponds to the projected cases, this term is associated with the maximum number of cases estimated by the model for each country, where the model is executed.

Projected - Confirmed Cases Ratio

Assuming that the total number of projected cases corresponds to the maximum number of cases that would occur in a given country, the projected - confirmed cases ratio is calculated using the following expression.

\[ProjectedConfirmedCases Ratio = 100 - (100 * \frac{(max(Projected Case) - max(Confirmed))}{ max(Projected Case)}\]

Global Case

Average Cases (Last Three Days)

Global Case Summary

Country Cases

China

The Americas

Confirmed Case

Confirmed Case - Average Last Three Days

Confirmed Case - Cases Last Days

Mexico

Mexico & Other Countries

United State (US)

Argentina

Brazil

Canada

Colombia

Ecuador

Chile

Panama

Peru

Venezuela

Europe

Confirmed Case

Confirmed Case - Average Last Three Days

Italy

Spain

United Kingdom

France

Germany

Netherlands

Switzerland

Norway

Portugal

Other Countries

Japan

Korea, South

Iran

Russia

Israel

References

Source data: https://github.com/CSSEGISandData/COVID-19.git

Clark, A.J. (2011). “Decline Curve Analysis in Unconventional Resource Plays Using Logistic Growth Models.” M.S. Thesis, The University of Texas at Austin, August 2011.

LS0tCnRpdGxlOiAiQ292aWQxOSBQcm9qZWN0ZWQgQ2FzZXMgYnkgQ291bnRyaWVzIgphdXRob3I6ICJBbmRyZXMgUEVOQSBhbmRyZXNwZW5hQGdtYWlsLmNvbSIKZGF0ZTogIjAxLzQvMjAyMCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMgICAgCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKCWVjaG8gPSBUUlVFLAoJbWVzc2FnZSA9IEZBTFNFLAoJd2FybmluZyA9IEZBTFNFCikKYGBgCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoKYm9keXsgLyogTm9ybWFsICAqLwogICAgICBmb250LXNpemU6IDE2cHg7CiAgfQp0ZCB7ICAvKiBUYWJsZSAgKi8KICBmb250LXNpemU6IDE0cHg7Cn0KaDEudGl0bGUgewogIGZvbnQtc2l6ZTogMzhweDsKICBjb2xvcjogRGFya1JlZDsKfQpoMSB7IC8qIEhlYWRlciAxICovCiAgZm9udC1zaXplOiAyOHB4OwogIGNvbG9yOiBCbHVlOwp9CmgyIHsgLyogSGVhZGVyIDIgKi8KICAgIGZvbnQtc2l6ZTogMjRweDsKICBjb2xvcjogRGFya0JsdWU7Cn0KaDMgeyAvKiBIZWFkZXIgMyAqLwogIGZvbnQtc2l6ZTogMjBweDsKICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICBjb2xvcjogRGFya0JsdWU7Cn0KY29kZS5yeyAvKiBDb2RlIGJsb2NrICovCiAgICBmb250LXNpemU6IDEycHg7Cn0KcHJlIHsgLyogQ29kZSBibG9jayAtIGRldGVybWluZXMgY29kZSBzcGFjaW5nIGJldHdlZW4gbGluZXMgKi8KICAgIGZvbnQtc2l6ZTogMTRweDsKfQo8L3N0eWxlPgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kcm0obGlzdCA9IGxzKCkpCmxpYnJhcnkoInRpZHl2ZXJzZSIpCmxpYnJhcnkoImNvd3Bsb3QiKQpsaWJyYXJ5KCJtaW5wYWNrLmxtIikKbGlicmFyeSgiYnJvb20iKQpsaWJyYXJ5KCJzaW9wIikKbGlicmFyeSgia2FibGVFeHRyYSIpCmxpYnJhcnkoInBsb3RseSIpCmBgYAoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgdXBkYXRlIGRhdGEgd2l0aCBzb21lIGNoYXJnZWQgY29sdW1uIG5hbWVzCgpjb3ZpZDE5IDwtIHJlYWRfY3N2KCJ+L0RvY3VtZW50cy9DT1ZJRC0xOS1tYXN0ZXIvZGF0YS9DT1ZJRC0xOS1tYXN0ZXIgMjAyMC0wNC0wMS9jc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV9kYWlseV9yZXBvcnRzLzAzLTMxLTIwMjAuY3N2IikKCnNldHdkKCJ+L0RvY3VtZW50cy9DT1ZJRC0xOS1tYXN0ZXIvZGF0YS9DT1ZJRC0xOS1tYXN0ZXIgMjAyMC0wNC0wMS9jc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV90aW1lX3NlcmllcyIpCgp0c3IgPC0gcmVhZF9jc3YoInRpbWVfc2VyaWVzX2NvdmlkMTlfcmVjb3ZlcmVkX2dsb2JhbC5jc3YiKQoKdHNjIDwtIHJlYWRfY3N2KCJ0aW1lX3Nlcmllc19jb3ZpZDE5X2NvbmZpcm1lZF9nbG9iYWwuY3N2IikKCnRzZCA8LSByZWFkX2NzdigidGltZV9zZXJpZXNfY292aWQxOV9kZWF0aHNfZ2xvYmFsLmNzdiIpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIycgQHRpdGxlIEEgd3JhbmdsX2NvdmlkMTkgZnVuY3Rpb24KIycgQHBhcmFtIGNvdmlkMTkgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHdyYW5nbF9jb3ZpZDE5CiMnIEBleHBvcnQgd3JhbmdsX2NvdmlkMTkKIycgQGtleXdvcmRzIHdyYW5nbF9jb3ZpZDE5CiMnCndyYW5nbF9jb3ZpZDE5IDwtIGZ1bmN0aW9uKGNvdmlkMTkpIHsKY292aWQxOSAlPiUgCiAgcmVuYW1lKHN0YXRlID0gIlByb3ZpbmNlX1N0YXRlIiwgCiAgICAgICAgIGNvdW50cnkgPSAiQ291bnRyeV9SZWdpb24iLAogICAgICAgICBsYXN0X3VwZCA9ICJMYXN0X1VwZGF0ZSIpICU+JQogIHN1bW1hcmlzZShjb25maXJtZWQgPSBzdW0oQ29uZmlybWVkLCBuYS5ybSA9IFQpLAogICAgICAgICAgICByZWNvdmVyZWQgPSBzdW0oUmVjb3ZlcmVkLCBuYS5ybSA9IFQpLCAgICAgICAgICAgICAgICAKICAgICAgICAgICAgZGVhdGhzID0gc3VtKERlYXRocywgbmEucm0gPSBUKSwKICAgICAgICAgICAgUlIgPSByb3VuZCgxMDAgKiByZWNvdmVyZWQvY29uZmlybWVkLCAwKSwKICAgICAgICAgICAgQ0ZSID0gcm91bmQoMTAwICogZGVhdGhzL2NvbmZpcm1lZCwgMCkpICAgIAp9CgojJyBAdGl0bGUgQSB3cmFuZ2xfdHNjIGZ1bmN0aW9uCiMnIEBwYXJhbSB0c2MgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHdyYW5nbF90c2MKIycgQGV4cG9ydCB3cmFuZ2xfdHNjCiMnIEBrZXl3b3JkcyB3cmFuZ2xfdHNjCiMnCndyYW5nbF90c2MgPC0gZnVuY3Rpb24odHNjKSB7CnRzYyAlPiUgcmVuYW1lKHN0YXRlID0gIlByb3ZpbmNlL1N0YXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gIkNvdW50cnkvUmVnaW9uIiwKICAgICAgICAgICAgICAgICAgICAgIGxhdCA9IExhdCwgbG9uZyA9IExvbmcpICAKfQoKIycgQHRpdGxlIEEgd3JhbmdsX3RzYyBmdW5jdGlvbgojJyBAcGFyYW0gdHNkIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHJldHVybiB3cmFuZ2xfdHNkCiMnIEBleHBvcnQgd3JhbmdsX3RzZAojJyBAa2V5d29yZHMgd3JhbmdsX3RzZAojJwp3cmFuZ2xfdHNkIDwtIGZ1bmN0aW9uKHRzZCkgewp0c2QgJT4lIHJlbmFtZShzdGF0ZSA9ICJQcm92aW5jZS9TdGF0ZSIsIAogICAgICAgICAgICAgICAgICAgICAgY291bnRyeSA9ICJDb3VudHJ5L1JlZ2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICBsYXQgPSBMYXQsIGxvbmcgPSBMb25nKQp9CgojJyBAdGl0bGUgQSB3cmFuZ2xfdHNyIGZ1bmN0aW9uCiMnIEBwYXJhbSB0c3IgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHdyYW5nbF90c3IKIycgQGV4cG9ydCB3cmFuZ2xfdHNyCiMnIEBrZXl3b3JkcyB3cmFuZ2xfdHNyCiMnCndyYW5nbF90c3IgPC0gZnVuY3Rpb24odHNyKSB7CnRzciAlPiUgcmVuYW1lKHN0YXRlID0gIlByb3ZpbmNlL1N0YXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gIkNvdW50cnkvUmVnaW9uIiwKICAgICAgICAgICAgICAgICAgICAgIGxhdCA9IExhdCwgbG9uZyA9IExvbmcpCn0KCiMnIEB0aXRsZSBBIHRpZHlfam9pbl9mdW5fbWF4IGJ5IGNvdW50cnkgZnVuY3Rpb24KIycgQHBhcmFtIHRpZHlfam9pbiAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEByZXR1cm4gdGlkeV9qb2luX2Z1bl9tYXgKIycgQGV4cG9ydCB0aWR5X2pvaW5fZnVuX21heAojJyBAa2V5d29yZHMgdGlkeV9qb2luX2Z1bl9tYXgKIycKdGlkeV9qb2luX2Z1bl9tYXggPC0gZnVuY3Rpb24odGlkeV9qb2luKSB7CnRpZHlfam9pbiAlPiUgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKGNvbmZpcm1lZCA9IG1heChjb25maXJtZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHJlY292ZXJlZCA9IG1heChyZWNvdmVyZWQsIG5hLnJtID0gVCksICAgICAgICAgICAgICAgIAogICAgICAgICAgICBkZWF0aHMgPSBtYXgoZGVhdGgsIG5hLnJtID0gVCksCiAgICAgICAgICAgIFJSID0gcm91bmQoMTAwICogcmVjb3ZlcmVkL2NvbmZpcm1lZCwgMCksCiAgICAgICAgICAgIENGUiA9IHJvdW5kKDEwMCAqIGRlYXRocy9jb25maXJtZWQsIDApKSAlPiUKICBhcnJhbmdlKC1jb25maXJtZWQpICAKfQoKIycgQHRpdGxlIEEgZ2F0aGVyIGZ1bmN0aW9uCiMnIEBwYXJhbSBkYXRhIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHBhcmFtIHZhciAtICB4IGlucHV0IGRhdGEKIycgQHJldHVybiBnYXRoZXJfZnVuCiMnIEBleHBvcnQgZ2F0aGVyX2Z1bgojJyBAa2V5d29yZHMgZ2F0aGVyX2Z1bgojJyAKZ2F0aGVyX2Z1biA8LSBmdW5jdGlvbihkYXRhLCB2YXIpIHsKICB2YXIgPC0gZW5xdW8odmFyKQogIGRhdGEgJT4lIGdhdGhlcihkYXRlLCAhIXZhciwgLWxhdCwgLWxvbmcsIC1zdGF0ZSwgLWNvdW50cnkpICU+JSAgCiAgbXV0YXRlKGRhdGUgPSBhcy5EYXRlKGRhdGUsICIlbS8lZC8leSIpKQp9CgojJyBAdGl0bGUgdGlkeV9qb2luX2Z1bgojJyBAcmV0dXJuIHRpZHlfam9pbgojJyBAZXhwb3J0IHRpZHlfam9pbgojJyBAa2V5d29yZHMgdGlkeV9qb2luX2Z1bgojJyAKdGlkeV9qb2luX2Z1biA8LSBmdW5jdGlvbigpIHsKICAKIyBSdW4gZ2F0aGVyIGZ1bmN0aW9uCnRzY190aWR5IDwtIGdhdGhlcl9mdW4odHNjLCBjb25maXJtZWQpCnRzZF90aWR5IDwtIGdhdGhlcl9mdW4odHNkLCBkZWF0aCkKdHNyX3RpZHkgPC0gZ2F0aGVyX2Z1bih0c3IsIHJlY292ZXJlZCkKCiMgSm9pbiBkYXRhIGZyYW1lcwp0aWR5X2pvaW4gPC0gZnVsbF9qb2luKHRzY190aWR5LCB0c2RfdGlkeSwgCiAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJzdGF0ZSIsICJjb3VudHJ5IiwgImxhdCIsICJsb25nIiwgImRhdGUiKSkgCnRpZHlfam9pbiA8LSBmdWxsX2pvaW4odGlkeV9qb2luLCB0c3JfdGlkeSwgCiAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJzdGF0ZSIsICJjb3VudHJ5IiwgImxhdCIsICJsb25nIiwgImRhdGUiKSkgCgojIENvbnZlcnQgdG8gbnVtZXJpYwp0aWR5X2pvaW4kY29uZmlybWVkIDwtIGFzLm51bWVyaWModGlkeV9qb2luJGNvbmZpcm1lZCkKdGlkeV9qb2luJGRlYXRoIDwtIGFzLm51bWVyaWModGlkeV9qb2luJGRlYXRoKQp0aWR5X2pvaW4kcmVjb3ZlcmVkIDwtIGFzLm51bWVyaWModGlkeV9qb2luJHJlY292ZXJlZCkKCiMgQ2FsY3VsYXRlIGFkZGl0aW9uYWwgdmFyaWFibGVzCnRpZHlfam9pbiA8LSB0aWR5X2pvaW4gJT4lIAojIFJlY292ZXJ5IFJhdGlvICglKSAmIENhc2UgRmF0YWxpdHkgUmF0aW8gKCUpICAgICAgICAgCiAgbXV0YXRlKFJSID0gcm91bmQoMTAwICogcmVjb3ZlcmVkL2NvbmZpcm1lZCwgMCksCiAgICAgICBDRlIgPSByb3VuZCgxMDAgKiBkZWF0aC9jb25maXJtZWQsIDEpKSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUgCiMgbWVhbiBjb25maXJtZWQgY2FzZSBsYXN0IDMgZGF5cyAgICAgICAgCiAgbXV0YXRlKGMzZCA9IG1lYW4odGFpbChjb25maXJtZWQsIDNMKSksCiAgICAgICAgIGQzZCA9IG1lYW4odGFpbChkZWF0aCwgM0wpKSwKICAgICAgICAgcjNkICA9IG1lYW4odGFpbChyZWNvdmVyZWQsIDNMKSksCiAgICAgICAgIHN0YXRlID0gaWZlbHNlKGlzLm5hKHN0YXRlKSwgImFsbHMiLCBzdGF0ZSksCiAgICAgICAgIENvbmZpcm1lZF9kYXkgPSAoY29uZmlybWVkIC0gbGFnKGNvbmZpcm1lZCwgMUwpKSkgJT4lCiAgdW5ncm91cCgpCn0KCiMnIEB0aXRsZSBwbG90X2VucXVvIGZ1bmN0aW9uCiMnIEBwYXJhbSBkYXRhIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHBhcmFtIHggLSAgeCBpbnB1dCBkYXRhCiMnIEBwYXJhbSB5IC0gIHkgaW5wdXQgZGF0YQojJyBAcGFyYW0gVGl0bGUgLSAgdGl0bGUKIycgQHJldHVybiBwbG90CiMnIEBleHBvcnQgcGxvdCBwbG90IGdyYXBoCiMnIEBrZXl3b3JkcyBwbG90CiMnIApwbG90X2VucXVvIDwtIGZ1bmN0aW9uKC5kYXRhLCB4LCB5LCBUaXRsZSkKewogIHggPC0gZW5xdW8oeCkKICB5IDwtIGVucXVvKHkpCiAgZ2dwbG90KC5kYXRhLCBhZXMoISF4LCAhIXkpKSArCiAgICBnZW9tX3BvaW50KGFlcyhhbHBoYSA9IDAuNiwgY29sb3IgPSAhIXkpKSArIAogICAgZ2VvbV9saW5lKGFlcyhhbHBoYSA9IDAuNiwgY29sb3IgPSAhIXkpKSArCiAgICBsYWJzKHRpdGxlID0gVGl0bGUsIHggPSAiIiwgeSA9ICIiKSAgKwogICAgdGhlbWVfbWluaW1hbF9ncmlkKDEyKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCn0KCiMnIEB0aXRsZSBnbG9iYWxfY2FzZSBmdW5jdGlvbgojJyBAcGFyYW0gZGF0YSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEBwYXJhbSBjb25maXJtZWQgLSAgY29uZmlybWVkIGlucHV0IGRhdGEKIycgQHBhcmFtIHJlY292ZXJlZCAtICByZWNvdmVyZWQgaW5wdXQgZGF0YQojJyBAcGFyYW0gZGVhdGggLSAgZGVhdGhzIGlucHV0IGRhdGEKIycgQHJldHVybiBnbG9iYWxfY2FzZQojJyBAZXhwb3J0IGdsb2JhbF9jYXNlIHBsb3QgZ3JhcGgKIycgQGtleXdvcmRzIGdsb2JhbF9jYXNlCiMnIApnbG9iYWxfY2FzZSA8LSBmdW5jdGlvbihkYXRhLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpIHsKICBjb25maXJtZWQgPC0gZW5xdW8oY29uZmlybWVkKQogIHJlY292ZXJlZCA8LSBlbnF1byhyZWNvdmVyZWQpCiAgZGVhdGggPC0gZW5xdW8oZGVhdGgpICAgIAogIApkYXRhICU+JSAKICBncm91cF9ieShkYXRlKSAlPiUKICBzdW1tYXJpc2UoY29uZmlybWVkID0gc3VtKCEhY29uZmlybWVkLCBuYS5ybSA9IFQpLAogICAgICAgICAgICByZWNvdmVyZWQgPSBzdW0oISFyZWNvdmVyZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIGRlYXRoID0gc3VtKCEhZGVhdGgsIG5hLnJtID0gVCksIAogICAgICAgICAgICBSUiA9IHJvdW5kKDEwMCAqIHJlY292ZXJlZCAvIGNvbmZpcm1lZCwgMSksCiAgICAgICAgICAgIENGUiA9IHJvdW5kKDEwMCAqIGRlYXRoIC8gY29uZmlybWVkLCAxKSkgCn0KCiMnIEB0aXRsZSBwbG90X2dyaWRfZ2xvYmFsCiMnIEBwYXJhbSB0aWR5X2pvaW4gLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHBsb3RfZ3JpZF9nbG9iYWwKIycgQGV4cG9ydCBwbG90X2dyaWRfZ2xvYmFsCiMnIEBrZXl3b3JkcyBwbG90X2dyaWRfZ2xvYmFsCiMnIApwbG90X2dyaWRfZ2xvYmFsIDwtIGZ1bmN0aW9uKHRpZHlfam9pbil7CiAgZGF0YSA8LSBnbG9iYWxfY2FzZSh0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkgCiAgcDEgPC0gcGxvdF9lbnF1byhkYXRhLCBkYXRlLCBjb25maXJtZWQsICJDb25maXJtZWQiKQogIHAyIDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgcmVjb3ZlcmVkLCAiUmVjb3ZlcmVkIikKICBwMyA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIGRlYXRoLCAiRGVhdGhzIikKICBwNCA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIFJSLCAiUmVjb3ZlcnkgUmF0aW8gKCUpIikKICBwNSA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIENGUiwgIkNhc2UgRmF0YWxpdHkgUmF0aW8gKCUpIikKICAKdGl0bGVfZ2cgPC0gZ2dwbG90KCkgKyAKICBsYWJzKHRpdGxlID0gIkdsb2JhbCBDYXNlcyIsIAogICAgICAgc3VidGl0bGUgPSBwYXN0ZSgiUmVwb3J0IGRhdGU6IiwgU3lzLkRhdGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgbWluKGRhdGEkZGF0ZVtkYXRhJGNvbmZpcm1lZCA+PSAxXSwgbmEucm0gPSBUKSkpICsKICB0aGVtZV9taW5pbWFsX2dyaWQoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAKCiAgcGxvdF9ncmlkKHRpdGxlX2dnLCBwMSwgcDIsIHAzLCBwNCwgcDUsIG5jb2wgPSAzKSAgIAp9CgojJyBAdGl0bGUgcGxvdF9ncmlkX2NvdW50cnkKIycgQHBhcmFtIGNvdW50cnkgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcGFyYW0gdGlkeV9qb2luIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHJldHVybiBwbG90X2dyaWRfY291bnRyeQojJyBAZXhwb3J0IHBsb3RfZ3JpZF9jb3VudHJ5CiMnIEBrZXl3b3JkcyBwbG90X2dyaWRfY291bnRyeQojJyAgIApwbG90X2dyaWRfY291bnRyeSA8LSBmdW5jdGlvbihjb3VudHJ5LCB0aWR5X2pvaW4pewogIGNvdW50cnkgPC0gZW5xdW8oY291bnRyeSkgIAogIGRhdGEgPC0gY291bnRyeV9jYWxjKCEhY291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpIAogIHAxIDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgY29uZmlybWVkLCAiQ29uZmlybWVkIikKICBwMiA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIENvbmZpcm1lZF9kYXksICJDb25maXJtZWRfZGF5IikgIAogIHAzIDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgZGVhdGgsICJEZWF0aHMiKQogIHA0IDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgUlIsICJSZWNvdmVyeSBSYXRpbyAoJSkiKQogIHA1IDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgQ0ZSLCAiQ2FzZSBGYXRhbGl0eSBSYXRpbyAoJSkiKQogIAojIEZpcnN0IGNhc2UgZGF0ZQp0aXRsZV9nZyA8LSBnZ3Bsb3QoKSArIAogIGxhYnModGl0bGUgPSBwYXN0ZSgiQ291bnRyeToiLCBDb3VudHJ5KSwKICAgICAgIHN1YnRpdGxlID0gcGFzdGUoIlJlcG9ydCBkYXRlOiIsIFN5cy5EYXRlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJcbkZpcnN0IGNhc2UgZGF0ZToiLCAKICAgICAgICAgICAgICAgICAgICAgICAgbWluKGRhdGEkZGF0ZVtkYXRhJGNvbmZpcm1lZCA+PSAxXSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgICAgICAgIlxuQ29uZmlybWVkLmxhc3QuMy5kYXlzOiIsIAogICAgICAgICAgICAgICAgICAgICAgICByb3VuZChtZWFuKGhlYWQoZGF0YSRDb25maXJtZWRfZGF5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVCwgMykpLCAwKSksCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIiIsIHkgPSAiIikgKwogIHRoZW1lX21pbmltYWxfZ3JpZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpIAoKICBwbG90X2dyaWQodGl0bGVfZ2csIHAxLCBwMiwgcDMsIHA0LCBwNSwgbmNvbCA9IDMpICAgICAKfQoKIycgQHRpdGxlIENvdW50cnkgQ2FzZSBDYWxjdWxhdGlvbnMKIycgQHBhcmFtIGNvdW50cnkgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcGFyYW0gZGF0YSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEBwYXJhbSBjb25maXJtZWQgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gcmVjb3ZlcmVkIC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIGRlYXRoIC0gIGlucHV0IGRhdGEKIycgQHJldHVybiBjb3VudHJ5X2NhbGMKIycgQGV4cG9ydCBjb3VudHJ5X2NhbGMKIycgQGtleXdvcmRzIGNvdW50cnlfY2FsYwojJyAKY291bnRyeV9jYWxjIDwtIGZ1bmN0aW9uKGNvdW50cnksIGRhdGEsIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkgewogIGNvdW50cnkgPC0gZW5xdW8oY291bnRyeSkKICBjb25maXJtZWQgPC0gZW5xdW8oY29uZmlybWVkKQogIHJlY292ZXJlZCA8LSBlbnF1byhyZWNvdmVyZWQpCiAgZGVhdGggPC0gZW5xdW8oZGVhdGgpICAgIAogIApkYXRhICU+JSBmaWx0ZXIoY291bnRyeSA9PSAhIWNvdW50cnkpICU+JQogIGdyb3VwX2J5KGRhdGUpICU+JQogIHN1bW1hcmlzZShjb25maXJtZWQgPSBzdW0oISFjb25maXJtZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHJlY292ZXJlZCA9IHN1bSghIXJlY292ZXJlZCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgZGVhdGggPSBzdW0oISFkZWF0aCwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgIFJSID0gcm91bmQoMTAwICogcmVjb3ZlcmVkIC8gY29uZmlybWVkLCAxKSwKICAgICAgICAgICAgQ0ZSID0gcm91bmQoMTAwICogZGVhdGggLyBjb25maXJtZWQsIDEpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKENvbmZpcm1lZF9kYXkgPSAoY29uZmlybWVkIC0gbGFnKGNvbmZpcm1lZCwgMUwpKSkgJT4lCiAgYXJyYW5nZShkZXNjKGRhdGUpKSAgCn0gICAgCgojJyBAdGl0bGUgcmVzdW1lIENhbGN1bGF0aW9ucwojJyBAcGFyYW0gY291bnRyeSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEByZXR1cm4gcmVzdW1lCiMnIEBleHBvcnQgcmVzdW1lCiMnIEBrZXl3b3JkcyByZXN1bWUKIycgCnJlc3VtZSA8LSBmdW5jdGlvbihDb3VudHJ5KSB7CiAgCnRpZHlfam9pbiAlPiUgCiAgZmlsdGVyKGNvdW50cnkgPT0gQ291bnRyeSAmIGRhdGUgPT0gbWF4KGRhdGUpKSAlPiUgCiAgc3VtbWFyaXNlKGRhdGUgPSBtYXgoZGF0ZSksCiAgICAgICAgICAgIENvbmZpcm1lZCA9IHN1bShjb25maXJtZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIFJlY292ZXJlZCA9IHN1bShyZWNvdmVyZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIERlYXRoID0gc3VtKGRlYXRoLCBuYS5ybSA9IFQpLCAKICAgICAgICAgICAgQ0ZSID0gaGVhZChDRlIsIDEpKQp9CgojJyBAdGl0bGUgbG9naXN0aWNfZ3Jvd3RoX2RhdGFfcHJlcCBjYWxjdWxhdGlvbnMKIycgQHBhcmFtIGNvdW50cnkgLSAgaW5wdXQgZGF0YQojJyBAcmV0dXJuIGxvZ2lzdGljX2dyb3d0aF9kYXRhX3ByZXAKIycgQGV4cG9ydCBsb2dpc3RpY19ncm93dGhfZGF0YV9wcmVwCiMnIEBrZXl3b3JkcyBsb2dpc3RpY19ncm93dGhfZGF0YV9wcmVwCiMnIApsb2dpc3RpY19ncm93dGhfZGF0YV9wcmVwIDwtIGZ1bmN0aW9uKENvdW50cnksIGN1dG9mZikgewogIAojIFByZXBhcmUgZGF0YSAgCnRpZHlfam9pbiAlPiUgCiAgZmlsdGVyKGNvdW50cnkgPT0gQ291bnRyeSkgJT4lIAogIGdyb3VwX2J5KGNvdW50cnksIGRhdGUpICU+JSAKICBzdW1tYXJpc2UoY29uZmlybWVkID0gc3VtKGNvbmZpcm1lZCwgbmEucm0gPSBUKSkgJT4lCiMgIHN1bW1hcmlzZShjb25maXJtZWQgPSBzdW0oZGVhdGgsIG5hLnJtID0gVCkpICU+JSAgICAKICBkcGx5cjo6ZmlsdGVyKGNvbmZpcm1lZCA+IGN1dG9mZikgJT4lCiAgdW5ncm91cCgpICU+JQogIGRwbHlyOjptdXRhdGUodCA9IDE6bigpKQp9CgojJyBAdGl0bGUgbG9naXN0aWNfZ3Jvd3RoX21vZGVsIENhbGN1bGF0aW9ucwojJyBAcGFyYW0gY291bnRyeSAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSBkYXRhIC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIGN1dG9mZiAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSB0cmFjZSAtICBpbnB1dCBkYXRhIHRyYWNlIG1vZGVsCiMnIEBwYXJhbSB0bWF4IC0gIGlucHV0IGRhdGEKIycgQHJldHVybiBsb2dpc3RpY19ncm93dGhfbW9kZWwKIycgQGV4cG9ydCBsb2dpc3RpY19ncm93dGhfbW9kZWwKIycgQGtleXdvcmRzIGxvZ2lzdGljX2dyb3d0aF9tb2RlbAojJyAKbG9naXN0aWNfZ3Jvd3RoX21vZGVsIDwtIGZ1bmN0aW9uKENvdW50cnksIGN1dG9mZiwgdHJhY2UsIHRtYXgpIHsKCiMgUHJlcGFyZSBkYXRhCmRhdGEgPC0gbG9naXN0aWNfZ3Jvd3RoX2RhdGFfcHJlcChDb3VudHJ5LCBjdXRvZmYpICAKICAKIyBTZXQgaW5wdXQgbW9kZWwgcGFyYW1ldGVycyAgICAgIApzZXQuc2VlZCgxNykKbWF4aXRlciA8LSAxMDI0CnBhcm1zIDwtIGMoSyA9IG1heChkYXRhJGNvbmZpcm1lZCwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgYSA9IG1heChkYXRhJGNvbmZpcm1lZCwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgbiA9IDEpCmNvbnRyb2wgPC0gYyhubHMuY29udHJvbChtYXhpdGVyID0gbWF4aXRlcikpICAgIAogICAgCiMgUnVuIExvZ2lzdGljIG1vZGVsICAgCnRyeUNhdGNoKHsKbW9kZWwgPC0gbWlucGFjay5sbTo6bmxzTE0oY29uZmlybWVkIH4gKEsgKiB0IF4gbikgLyAoYSArIHQgXiBuKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcGFybXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gY29udHJvbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlID0gdHJhY2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSkKCiMgU3RvcmUgbG9naXN0aWMgcGFyYW1ldGVyIHJlc3VsdHMKbW9kZWxfcGFybSA8LSBkYXRhLmZyYW1lKGNvdW50cnkgPSBDb3VudHJ5LCAKICAgICAgICAgICAgICAgICAgICAgICAgIEsgPSBjb2VmKG1vZGVsKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBjb2VmKG1vZGVsKVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBjb2VmKG1vZGVsKVszXSwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKCiMgQ3JlYXRlIHRpbWUgdmVjdG9yIGEgc2xpZ2h0bHkgbGFyZ2VyIHRvIHJlYWwgZGF0YSAKdCA8LSAxOnRtYXgKCiMgQ2FsY3VsYXRlIGNvbmZpcm1lZF9MR00gZnJvbSBtb2RlbApQcm9qZWN0ZWRfTEdNID0gKG1vZGVsX3Bhcm0kSyAqIHQgXiBtb2RlbF9wYXJtJG4pIC8gCiAgICAgICAgICAgICAgICAgIChtb2RlbF9wYXJtJGEgKyB0IF4gbW9kZWxfcGFybSRuKQoKIyBDcmVhdGUgZGF0YSB0byBzdG9yZSBMR00gY2FsY3VsYXRpb24KZm9vIDwtIGRhdGFfZnJhbWUodCA9IHQsIAogICAgICAgICAgICAgICAgICBQcm9qZWN0ZWRfTEdNID0gUHJvamVjdGVkX0xHTSAgICAgICAgICAgICAgICAgCikKCiMgSm9pbiBjYWxjdWxhdGUgZGF0YSB3aXRoIHJlYWwgZGF0YQpkYXRhIDwtIGxlZnRfam9pbihmb28sIGRhdGEsIGJ5ID0gInQiKQoKIyBDb21wbGV0ZSBkYXRlIGNvbHVtbgpkYXRhJGRhdGUgPC0gc2VxKGFzLkRhdGUobWluKGRhdGEkZGF0ZSwgbmEucm0gPSBUKSksIAogICAgYXMuRGF0ZShtaW4oZGF0YSRkYXRlLCBuYS5ybSA9IFQpICsgdG1heCAtIDEpLCAiZGF5cyIpCgojIENvbXBsZXRlIGNvdW50cnkgY29sdW1uCmRhdGEkY291bnRyeSA8LSBDb3VudHJ5CgojIENyZWF0ZSBsYWJlbCBkYXRhIGZyYW1lCmFubm90YXRpb24gPC0gZGF0YS5mcmFtZSgKICB4ID0gdG1heCArIDUsCiAgeSA9IG1heChkYXRhJFByb2plY3RlZF9MR00sIG5hLnJtID0gVCksCiAgbGFiZWwgPSBwYXN0ZSgiUHJvamVjdGVkIGNhc2VzID0iLCAKICAgICAgICAgICAgICAgIHJvdW5kKG1vZGVsX3Bhcm0kSywgMCkpLAojIFByb2plY3RlZCAtIENvbmZpcm1lZCBDYXNlcyBSYXRpbyBjYWxjdWxhdGlvbiAgCiAgcmF0aW8gPSByb3VuZCgxMDAgLSAoMTAwICogCiAgICAgICAgICAgICAgICAgIChtYXgobW9kZWxfcGFybSRLLCBuYS5ybSA9IFQpIC0gCiAgICAgICAgICAgICAgICAgIG1heChkYXRhJGNvbmZpcm1lZCwgbmEucm0gPSBUKSkgLyAKICAgICAgICAgICAgICAgICAgcm91bmQobW9kZWxfcGFybSRLLCAwKSkpKQoKIyBQcmVwYXJlIG91dHB1dCBkYXRhIGZyYW1lCm91dHB1dCA8LSBsaXN0KCJtb2RlbCIgPSBtb2RlbCwgCiAgICAgICAgICAgICAgICJkYXRhIiA9IGRhdGEsIAogICAgICAgICAgICAgICAiYW5ub3RhdGlvbiIgPSBhbm5vdGF0aW9uKQojIE91dHB1dCByZXN1bHRzCnJldHVybihvdXRwdXQpCn0sIGVycm9yID0gZnVuY3Rpb24oZSl7Y2F0KCJFUlJPUiA6Iixjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCn0KCiMnIEB0aXRsZSBsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdAojJyBAcGFyYW0gY291bnRyeSAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSBkYXRhMSAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSB0IC0gIGlucHV0IGRhdGEgdGltZQojJyBAcGFyYW0geV9wcm95IC0gIGlucHV0IHkgcHJveWVjdGVkCiMnIEBwYXJhbSB5X3Byb2YgLSAgaW5wdXQgZGF0YSAKIycgQHBhcmFtIGRhdGEyIC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIHggLSAgaW5wdXQgZGF0YSB4CiMnIEBwYXJhbSB5IC0gIGlucHV0IGRhdGEgeQojJyBAcGFyYW0gbGFiZWwgLSAgaW5wdXQgZGF0YSBsYWJlbAojJyBAcmV0dXJuIGxvZ2lzdGljX2dyb3d0aF9tb2RlbAojJyBAZXhwb3J0IGxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90CiMnIEBrZXl3b3JkcyBsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdAojJwpsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdCA8LSBmdW5jdGlvbiguZGF0YTEsIHQsIHlfcHJveSwgeV9jb25mLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEyLCB4LCB5LCBsYWJlbCkgewp0IDwtIGVucXVvKHQpICAKeV9wcm95IDwtIGVucXVvKHlfcHJveSkKeV9jb25mIDwtIGVucXVvKHlfY29uZikKeCA8LSBlbnF1byh4KQp5IDwtIGVucXVvKHkpCmxhYmVsIDwtIGVucXVvKGxhYmVsKQoKZ2dwbG90KGRhdGEgPSAuZGF0YTEpICsKICBnZW9tX2xpbmUoYWVzKCEhdCwgISF5X3Byb3ksIGNvbG91ciA9ICJQcm9qZWN0ZWQiKSkgKyAgCiAgZ2VvbV9wb2ludChhZXMoISF0LCAhIXlfcHJveSwgY29sb3VyID0gIlByb2plY3RlZCIpKSArCiAgZ2VvbV9wb2ludChkYXRhID0gLmRhdGExLCAKICAgICAgICAgICAgIGFlcyghIXQsICEheV9jb25mLCBjb2xvdXIgPSAiQ29uZmlybWVkIikpICsKICBnZW9tX2xhYmVsKGRhdGEgPSAuZGF0YTIsIAogICAgICAgICAgICBhZXMoIHggPSAhIXgsIHkgPSAhIXksIGxhYmVsID0gISFsYWJlbCksIAogICAgICAgICAgICBmaWxsID0gImxpZ2h0Ymx1ZSIsCiAgICAgICAgICAgIG51ZGdlX3ggPSAtMjUsICAgICAgICAgICAgCiAgICAgICAgICAgIHNpemUgPSA1LjAsCiAgICAgICAgICAgIGZvbnRmYWNlID0gImJvbGQiKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKENvdW50cnksICItIENvdmlkLTE5IC0gTG9naXN0aWMgR3Jvd3RoIE1vZGVsIChMR00pIiksCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlKCJDb25maXJtZWQgLyBQcm9qZWN0ZWQgQ2FzZXMgUmF0aW8gOiIsCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhMiRyYXRpbywgIiUiKSwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLAogICAgICAgIlxuQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiRGF5cyIsIAogICAgICAgeSA9ICJOdW1iZXIgb2YgQ29uZmlybWVkIENhc2VzIikgKwogIHRoZW1lX21pbmltYWxfZ3JpZCgxNCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSAgICAKfSAKCiMnIEB0aXRsZSBiYXJfZ3JhcGgKIycgQHBhcmFtIHRpZHlfam9pbiAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSB5IC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIHRpdGxlIC0gIGlucHV0IGRhdGEKIycgQHJldHVybiBiYXJfZ3JhcGgKIycgQGV4cG9ydCBiYXJfZ3JhcGgKIycgQGtleXdvcmRzIGJhcl9ncmFwaAojJyAKYmFyX2dyYXBoIDwtIGZ1bmN0aW9uKHRpZHlfam9pbiwgeSwgdGl0bGUsIHN1YnRpdGxlKSB7CnkgPC0gZW5xdW8oeSkgIAp0aWR5X2pvaW4gJT4lIGdyb3VwX2J5KGNvdW50cnkpICU+JSAKICBzdW1tYXJpc2UoeSA9IG1heCghIXkpKSAlPiUgCiAgdG9wX24oMTApICU+JSBhcnJhbmdlKHkpICU+JQogIGdncGxvdChhZXMoeCA9IGFzX2ZhY3Rvcihjb3VudHJ5KSwgeSA9IHkpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIAogICAgICAgICAgIGZpbGwgPSAibGlnaHRibHVlIiwgCiAgICAgICAgICAgYWxwaGEgPSAwLjYpICsgCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKHksIDApKSwgCiAgICAgICAgICAgIGhqdXN0ID0gInJpZ3RoIiwKICAgICAgICAgICAgc2l6ZSA9IDQuNSwKICAgICAgICAgICAgZm9udGZhY2UgPSAiYm9sZCIpICsKICBsYWJzKHRpdGxlID0gdGl0bGUsCiAgICAgICBzdWJ0aXRsZSA9IHN1YnRpdGxlLAogICAgICAgY2FwdGlvbiA9IHBhc3RlKCJTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsCiAgICAgICAiXG5BdXRob3I6IEBQZW5hQW5kcmVzIiksIAogICAgICAgeCA9ICIiLCB5ID0gIiIpICsKICBjb29yZF9mbGlwKCkgKyB0aGVtZV9taW5pbWFsX2dyaWQoMTQpICAKfQoKIycgQHRpdGxlIHBsb3RseQojJyBAcGFyYW0gdGlkeV9qb2luIC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIHkgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gdGl0bGUgLSAgaW5wdXQgZGF0YQojJyBAcmV0dXJuIHBsb3RseQojJyBAZXhwb3J0IHBsb3RseQojJyBAa2V5d29yZHMgcGxvdGx5CiMnIApwbG90bHkgPC0gZnVuY3Rpb24oZGF0YSwgdCwgY29uZmlybWVkLCBQcm9qZWN0ZWRfTEdNLCB0aXRsZSkgewpmaWcgPC0gcGxvdF9seShkYXRhLCB4ID0gdCkKZmlnIDwtIGZpZyAlPiUgYWRkX3RyYWNlKHkgPSBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICdjb25maXJtZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICdsaW5lcyttYXJrZXJzJykKZmlnICU+JSBhZGRfdHJhY2UoeSA9IFByb2plY3RlZF9MR00sIAogICAgICAgICAgICAgICAgICBuYW1lID0gJ1Byb2plY3RlZF9MR00nLCAKICAgICAgICAgICAgICAgICAgbW9kZSA9ICdsaW5lcyttYXJrZXJzJykgJT4lIAogIGxheW91dCh0aXRsZSA9IHRpdGxlKQp9CgpgYGAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CiMgUnVuIHRpZHlfam9pbl9mdW4gZnVuY3Rpb24KY292aWQxOSA8LSB3cmFuZ2xfY292aWQxOShjb3ZpZDE5KQp0c2MgPC0gd3JhbmdsX3RzYyh0c2MpCnRzZCA8LSB3cmFuZ2xfdHNjKHRzZCkKdHNyIDwtIHdyYW5nbF90c2ModHNyKQp0aWR5X2pvaW4gPC0gdGlkeV9qb2luX2Z1bigpCmBgYAoKIyBJbnRyb2R1Y3Rpb24gIAoKVGhlIGZvbGxvd2luZyBkb2N1bWVudCBzaG93cyBhbiBhbmFseXNpcyBvZiB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcm9uYXZpcnVzIHBhbmRlbWljIChDb3ZpZDE5KS4KClRoZSBhbmFseXNpcyBpcyBkaXZpZGVkIGludG8gdHdvIHBhcnRzLCB0aGUgZmlyc3QgY29tcHJpc2VzIGdlbmVyYWwgZ3JhcGhzIG9mIHRoZSBkYXRhIGFuZCB0aGVuIGEgbnVtZXJpY2FsIHNpbXVsYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIHRoZSBsb2dpc3RpYyBncm93dGggbW9kZWwgKExHTSkgaW4gb3JkZXIgdG8gZm9yZWNhc3QgdGhlIHBvc3NpYmxlIHRvdGFsIG51bWJlciBvZiBjYXNlcyBieSBjb3VudHJ5LiAgCgpUaGUgZGF0YSB1c2VkIGZvciB0aGlzIGFuYWx5c2lzIGFyZSB1cGRhdGVkIGRhaWx5IGFuZCBhcmUgc3RvcmVkIGluICoqRGF0YSBSZXBvc2l0b3J5IGJ5IEpvaG5zIEhvcGtpbnMgQ1NTRSoqCgojIFRlcm1zIHVzZWQgICAgCgojIyMgUmVjb3ZlcnkgcmF0aW8gKFJSKSAgICAgCgpUaGUgcHJvcG9ydGlvbiBvZiBwZW9wbGUgcmVjb3ZlcmVkIGZyb20gYSBzcGVjaWZpZWQgZGlzZWFzZSBhbW9uZyBhbGwgaW5kaXZpZHVhbHMgZGlhZ25vc2VkIHdpdGggdGhlIGRpc2Vhc2Ugb3ZlciBhIGNlcnRhaW4gcGVyaW9kIG9mIHRpbWUuICAgIAoKJCRSZWNvdmVyeVJhdGlvIChSUikgPSBcZnJhY3tSZWNvdmVyZWR9e0NvbmZpcm1lZH0kJCAgCgojIyMgQ2FzZSBGYXRhbGl0eSByYXRpbyAoQ0ZSKSAgICAKCkNhc2UgZmF0YWxpdHkgcmF0ZSwgYWxzbyBjYWxsZWQgY2FzZSBmYXRhbGl0eSByYXRpbywgaW4gZXBpZGVtaW9sb2d5LCB0aGUgcHJvcG9ydGlvbiBvZiBwZW9wbGUgd2hvIGRpZSBmcm9tIGEgc3BlY2lmaWVkIGRpc2Vhc2UgYW1vbmcgYWxsIGluZGl2aWR1YWxzIGRpYWdub3NlZCB3aXRoIHRoZSBkaXNlYXNlIG92ZXIgYSBjZXJ0YWluIHBlcmlvZCBvZiB0aW1lLiAgCgpodHRwczovL3d3dy5icml0YW5uaWNhLmNvbS9zY2llbmNlL2Nhc2UtZmF0YWxpdHktcmF0ZQoKJCRDYXNlIEZhdGFsaXR5IFJhdGlvIChDRlIpID0gXGZyYWN7RGVhdGhzfXtDb25maXJtZWR9JCQgIAoKIyMjIExvZ2lzdGljIEdyb3d0aCBNb2RlbCAoTEdNKSAgICAgIAoKQ2xhcmsgKDIwMTEpIHByb3Bvc2UgYSBuZXcgZW1waXJpY2FsIG1vZGVsIGJhc2VkIG9uIGxvZ2lzdGljIGdyb3d0aCBtb2RlbHMuICAKCkEgbm9ubGluZWFyIG1vZGVsIGZvcm11bGEgaW5jbHVkaW5nIHZhcmlhYmxlcyBhbmQgcGFyYW1ldGVycy4gIAoKJCRQcm9qZWN0ZWRDYXNlcyA9IFxmcmFjeyhLICogdCBeIG4pfXsoYSArIHQgXiBuKX0kJCAgICAKCldoZXJlOiAgCgpDYXNlcyA9IFByb2plY3RlZCBDYXNlICAgCksgPSBDYXJyeWluZyBjYXBhY2l0eSAgCm4gPSBIeXBlcmJvbGljIGV4cG9uZW50ICAKYSA9IENvbnN0YW50ICAKdCAgPSBUaW1lICAKClRoZSBiZXN0LWZpdCBub25saW5lYWwgbW9kZWwgaXMgb2J0YWluZWQgYnkgYW4gaXRlcmF0aXZlIGxlYXN0LXNxdWFyZWQgbWV0aG9kLgoKVGhlIGxvZ2lzdGljIGdyb3d0aCBtb2RlbCB3YXMgdXNlZCB0byBwcm9qZWN0IHRoZSBwcm9ncmVzc2lvbiBvZiB0aGUgZGlzZWFzZSBpbiBjZXJ0YWluIGNvdW50cmllcy4KClRoZSBtb3N0IHJlbGV2YW50IHJlc3VsdCBvZiB0aGUgbW9kZWwgY29ycmVzcG9uZHMgdG8gdGhlICoqcHJvamVjdGVkIGNhc2VzKiosIHRoaXMgdGVybSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1heGltdW0gbnVtYmVyIG9mIGNhc2VzIGVzdGltYXRlZCBieSB0aGUgbW9kZWwgZm9yIGVhY2ggY291bnRyeSwgd2hlcmUgdGhlIG1vZGVsIGlzIGV4ZWN1dGVkLiAgCgojIyMgUHJvamVjdGVkIC0gQ29uZmlybWVkIENhc2VzIFJhdGlvICAKCkFzc3VtaW5nIHRoYXQgdGhlIHRvdGFsIG51bWJlciBvZiAqKnByb2plY3RlZCBjYXNlcyoqIGNvcnJlc3BvbmRzIHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjYXNlcyB0aGF0IHdvdWxkIG9jY3VyIGluIGEgZ2l2ZW4gY291bnRyeSwgdGhlIHByb2plY3RlZCAtIGNvbmZpcm1lZCBjYXNlcyByYXRpbyBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbi4KCiQkUHJvamVjdGVkQ29uZmlybWVkQ2FzZXMgUmF0aW8gPSAxMDAgLSAoMTAwICogXGZyYWN7KG1heChQcm9qZWN0ZWQgQ2FzZSkgLSBtYXgoQ29uZmlybWVkKSl9eyAKICAgICAgICAgICAgICAgICAgbWF4KFByb2plY3RlZCBDYXNlKX0kJAogICAgICAgICAgICAgICAgICAKIyBHbG9iYWwgQ2FzZSAgCgojIyBBdmVyYWdlIENhc2VzIChMYXN0IFRocmVlIERheXMpCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBCYXIgZ3JhcGggQXZlcmFnZSBDb25maXJtZWQgQ2FzZXMgKExhc3QgdGhyZWUgZGF5cykKYmFyX2dyYXBoKHRpZHlfam9pbiwgYzNkLCAKICAgICAgICAgICAgICAgICAgIkdsb2JhbCBDYXNlcyAtIENvbmZpcm1lZCBDYXNlIiwgCiAgICAgICAgICAgICAgICAgICJBdmVyYWdlIExhc3QgVGhyZWUgRGF5cyIpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmJhcl9ncmFwaCh0aWR5X2pvaW4sIGQzZCwgCiAgICAgICAgICAgICAgICAgICJHbG9iYWwgQ2FzZXMgLSBEZWF0aHMiLCAKICAgICAgICAgICAgICAgICAgIkF2ZXJhZ2UgTGFzdCBUaHJlZSBEYXlzIikKYGBgCgojIyBHbG9iYWwgQ2FzZSBTdW1tYXJ5ICAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdmlkMTkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBsb3RfZ3JpZF9nbG9iYWwodGlkeV9qb2luKQpgYGAKCiMjIENvdW50cnkgQ2FzZXMKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnRpZHlfam9pbl9mdW5fbWF4KHRpZHlfam9pbikKYGBgCgojIyBDaGluYSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJDaGluYSIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQptbyA8LSBsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgY3V0b2ZmID0gNTAwLCB0cmFjZSA9IEYsIHRtYXggPSA2MCkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyBUaGUgQW1lcmljYXMgIAoKIyMgQ29uZmlybWVkIENhc2UKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJFY3VhZG9yfENoaWxlfFBlcnV8UGFuYW1hfEFyZ2VudGluYXxDb2xvbWJpYXxCcmF6aWx8TWV4aWNvfFZlbmV6dWVsYSIpCmZvbyA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikKYmFyX2dyYXBoKGZvbywgY29uZmlybWVkLCAgCiAgICAgICAgICAgICAgICAgICJUaGUgQW1lcmljYXMgLSBDb25maXJtZWQgQ2FzZXMiLCAKICAgICAgICAgICAgICAgICAgcGFzdGUoIk51bWJlciBvZiBDYXNlcyIsIFN5cy5EYXRlKCkpKQpgYGAKCiMjIENvbmZpcm1lZCBDYXNlIC0gQXZlcmFnZSBMYXN0IFRocmVlIERheXMKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJFY3VhZG9yfENoaWxlfFBlcnV8UGFuYW1hfEFyZ2VudGluYXxDb2xvbWJpYXxCcmF6aWx8TWV4aWNvfFZlbmV6dWVsYSIpCmZvbyA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikKYmFyX2dyYXBoKGZvbywgYzNkLCAgCiAgICAgICAgICAgICAgICAgICJUaGUgQW1lcmljYXMgLSBDb25maXJtZWQgQ2FzZSIsIAogICAgICAgICAgICAgICAgICBwYXN0ZSgiQXZlcmFnZSBMYXN0IFRocmVlIERheXMiLCBTeXMuRGF0ZSgpKSkKYGBgCgojIyBDb25maXJtZWQgQ2FzZSAtIENhc2VzIExhc3QgRGF5cwoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkVjdWFkb3J8Q2hpbGV8UGVydXxQYW5hbWF8QXJnZW50aW5hfENvbG9tYmlhfEJyYXppbHxNZXhpY298VmVuZXp1ZWxhIikKZm9vIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKSAlPiUKICBhcnJhbmdlKGRlc2MoZGF0ZSkpCmJhcl9ncmFwaChmb28sIGhlYWQoQ29uZmlybWVkX2RheSwgMSksICAKICAgICAgICAgICAgICAgICAgIlRoZSBBbWVyaWNhcyAtIENvbmZpcm1lZCBDYXNlIiwgCiAgICAgICAgICAgICAgICAgIHBhc3RlKCJDYXNlcyBMYXN0IERheXMiLCBTeXMuRGF0ZSgpKSkKYGBgCgojIyBNZXhpY28gIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiTWV4aWNvIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSA2LCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gNTApCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90KG1vJGRhdGEsIHQsIFByb2plY3RlZF9MR00sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vJGFubm90YXRpb24sIHgsIHksIGxhYmVsKQpwbG90bHkobW8kZGF0YSwgfmRhdGUsIH5jb25maXJtZWQsIH5Qcm9qZWN0ZWRfTEdNLCAKICAgICAgIHBhc3RlKENvdW50cnksICItIE1vZGVsIFJlc3VsdHMgLSIsIG1vJGFubm90YXRpb24kbGFiZWwpKQpgYGAKCiMjIE1leGljbyAmIE90aGVyIENvdW50cmllcwoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY291bnRyaWVzIDwtICgiQnJhemlsfE1leGljb3xLb3JlYSwgU291dGh8UGVydXxBcmdlbnRpbmF8Q2hpbGV8Q29sb21iaWEiKQp0aXRsZSA8LSAiTWV4aWNvIGFuZCBPdGhlciBDb3VudHJpZXMiCnN1YnRpdGxlIDwtICJDdW11bGF0aXZlIENvbmZpcm1lZCBDYXNlcyIKIyBTZWxlY3QgZGF0YQpkZiA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikgJT4lCiAgZmlsdGVyKENvbmZpcm1lZF9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNvbmZpcm1lZCkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IHZhbHVlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fbGluZShhZXMoY29sb3IgPSBjb3VudHJ5KSkgKyAgIAogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsgICAgCiAgdGhlbWVfbWluaW1hbF9ncmlkKDEzKSArICAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gdGl0bGUsCiAgICAgICBzdWJ0aXRsZSA9IHN1YnRpdGxlLAogICAgICAgY2FwdGlvbiA9IHBhc3RlKCJTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsCiAgICAgICAiXG5BdXRob3I6IEBQZW5hQW5kcmVzIiksIAogICAgICAgeCA9ICJEYXlzIiwgeSA9ICJOdW1iZXIgb2YgQ2FzZXMiKQpgYGAKCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJCcmF6aWx8TWV4aWNvfFBlcnV8QXJnZW50aW5hfENoaWxlfEtvcmVhLCBTb3V0aHxFY3VhZG9yfFVTIikKdGl0bGUgPC0gIk1leGljbyBhbmQgT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ3VtdWxhdGl2ZSBDb25maXJtZWQgQ2FzZXMgLSBMb2cgc2NhbGUiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihDb25maXJtZWRfZGF5ID49IDEpICU+JQogIHNlbGVjdChjb3VudHJ5LCBkYXRlLCBjb25maXJtZWQpICU+JQogIGdhdGhlcihrZXkgPSAidmFyaWFibGUiLCB2YWx1ZSA9ICJ2YWx1ZSIsIC1kYXRlLCAtY291bnRyeSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKGRheSA9IDE6bigpKQoKIyBQbG90CgpnZ3Bsb3QoZGYsIGFlcyh4ID0gZGF5LCB5ID0gbG9nKHZhbHVlKSkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb3VudHJ5KSkgKyAKICBnZW9tX3Ntb290aChhZXMoY29sID0gY291bnRyeSksIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRikgKwogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9taW5pbWFsX2dyaWQoMTIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gdGl0bGUsCiAgICAgICBzdWJ0aXRsZSA9IHN1YnRpdGxlLAogICAgICAgY2FwdGlvbiA9IHBhc3RlKCJTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsCiAgICAgICAiXG5BdXRob3I6IEBQZW5hQW5kcmVzIiksIAogICAgICAgeCA9ICJEYXlzIiwgeSA9ICJsb2coTnVtYmVyIG9mIENhc2VzKSIpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY291bnRyaWVzIDwtICgiQnJhemlsfE1leGljb3xQZXJ1fEFyZ2VudGluYXxDaGlsZXxLb3JlYSwgU291dGh8RWN1YWRvciIpCnRpdGxlIDwtICJNZXhpY28gYW5kIE90aGVyIENvdW50cmllcyIKc3VidGl0bGUgPC0gIkNvbmZpcm1lZCBDYXNlcyBieSBEYXlzIgojIFNlbGVjdCBkYXRhCmRmIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKSAlPiUKICBmaWx0ZXIoQ29uZmlybWVkX2RheSA+PSAxKSAlPiUKICBzZWxlY3QoY291bnRyeSwgZGF0ZSwgQ29uZmlybWVkX2RheSkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IHZhbHVlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnksIGFscGhhID0gMC4xNSkpICsgCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbCA9IGNvdW50cnkpLCBtZXRob2QgPSAiYXV0byIsIHNlID0gRikgKwogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsgIAogIHRoZW1lX21pbmltYWxfZ3JpZCgxMykgKyAgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9IHRpdGxlLAogICAgICAgc3VidGl0bGUgPSBzdWJ0aXRsZSwKICAgICAgIGNhcHRpb24gPSBwYXN0ZSgiU291cmNlIGRhdGE6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLAogICAgICAgIlxuQXV0aG9yOiBAUGVuYUFuZHJlcyIpLCAKICAgICAgIHggPSAiRGF5cyIsIHkgPSAiTnVtYmVyIG9mIENhc2VzIikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJCcmF6aWx8TWV4aWNvfFBlcnV8QXJnZW50aW5hfENoaWxlfEtvcmVhLCBTb3V0aHxFY3VhZG9yfFVTIikKdGl0bGUgPC0gIk1leGljbyBhbmQgT3RoZXIgQ291bnRyaWVzIgpzdWJ0aXRsZSA8LSAiQ29uZmlybWVkIENhc2VzIGJ5IERheXMgLSBMb2cgc2NhbGUiCiMgU2VsZWN0IGRhdGEKZGYgPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpICU+JQogIGZpbHRlcihDb25maXJtZWRfZGF5ID49IDEpICU+JQogIHNlbGVjdChjb3VudHJ5LCBkYXRlLCBDb25maXJtZWRfZGF5KSAlPiUKICBnYXRoZXIoa2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsdWUiLCAtZGF0ZSwgLWNvdW50cnkpICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIG11dGF0ZShkYXkgPSAxOm4oKSkKCiMgUGxvdApnZ3Bsb3QoZGYsIGFlcyh4ID0gZGF5LCB5ID0gbG9nKHZhbHVlKSkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb3VudHJ5KSkgKyAKICBnZW9tX3Ntb290aChhZXMoY29sID0gY291bnRyeSksIG1ldGhvZCA9ICJhdXRvIiwgc2UgPSBGKSArCiAgZmFjZXRfZ3JpZCgufmNvdW50cnksIHNjYWxlcyA9ICJmcmVlIikgKyAgCiAgdGhlbWVfbWluaW1hbF9ncmlkKDEzKSArICAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gdGl0bGUsCiAgICAgICBzdWJ0aXRsZSA9IHN1YnRpdGxlLAogICAgICAgY2FwdGlvbiA9IHBhc3RlKCJTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsCiAgICAgICAiXG5BdXRob3I6IEBQZW5hQW5kcmVzIiksIAogICAgICAgeCA9ICJEYXlzIiwgeSA9ICJsb2coTnVtYmVyIG9mIENhc2VzKSIpCmBgYAoKIyMgVW5pdGVkIFN0YXRlIChVUykKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgaHR0cHM6Ly9jb3ZpZDE5LmhlYWx0aGRhdGEub3JnCiMgaHR0cDovL3d3dy5oZWFsdGhkYXRhLm9yZy9zaXRlcy9kZWZhdWx0L2ZpbGVzL2ZpbGVzL3Jlc2VhcmNoX2FydGljbGVzLzIwMjAvY292aWRfcGFwZXJfTUVEUlhJVi0yMDIwLTA0Mzc1MnYxLU11cnJheS5wZGYKCkNvdW50cnkgPC0gIlVTIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAxNTAsIHRyYWNlID0gRiwgdG1heCA9IDQ4KQpsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdChtbyRkYXRhLCB0LCBQcm9qZWN0ZWRfTEdNLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtbyRhbm5vdGF0aW9uLCB4LCB5LCBsYWJlbCkKcGxvdGx5KG1vJGRhdGEsIH5kYXRlLCB+Y29uZmlybWVkLCB+UHJvamVjdGVkX0xHTSwgCiAgICAgICBwYXN0ZShDb3VudHJ5LCAiLSBNb2RlbCBSZXN1bHRzIC0iLCBtbyRhbm5vdGF0aW9uJGxhYmVsKSkKYGBgCgojIyBBcmdlbnRpbmEgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiQXJnZW50aW5hIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAxMCwgdHJhY2UgPSBGLCB0bWF4ID0gMjUpCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90KG1vJGRhdGEsIHQsIFByb2plY3RlZF9MR00sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vJGFubm90YXRpb24sIHgsIHksIGxhYmVsKQpgYGAKCiMjIEJyYXppbCAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJCcmF6aWwiCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbW8gPC0gbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDEyLCB0cmFjZSA9IEYsIHRtYXggPSA0MCkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyMgQ2FuYWRhCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJDYW5hZGEiCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbW8gPC0gbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDMwLCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gNTApCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90KG1vJGRhdGEsIHQsIFByb2plY3RlZF9MR00sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vJGFubm90YXRpb24sIHgsIHksIGxhYmVsKQpgYGAKCiMjIENvbG9tYmlhICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkNvbG9tYmlhIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAwLCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gNjApCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90KG1vJGRhdGEsIHQsIFByb2plY3RlZF9MR00sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vJGFubm90YXRpb24sIHgsIHksIGxhYmVsKQpgYGAKCiMjIEVjdWFkb3IgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiRWN1YWRvciIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQptbyA8LSBsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgY3V0b2ZmID0gMzAsIHRyYWNlID0gRkFMU0UsIHRtYXggPSA0MCkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyMgQ2hpbGUgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiQ2hpbGUiCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbW8gPC0gbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDQsIHRyYWNlID0gRkFMU0UsIHRtYXggPSA0MCkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyMgUGFuYW1hICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlBhbmFtYSIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQptbyA8LSBsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgY3V0b2ZmID0gMCwgdHJhY2UgPSBGQUxTRSwgdG1heCA9IDQwKQpsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdChtbyRkYXRhLCB0LCBQcm9qZWN0ZWRfTEdNLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtbyRhbm5vdGF0aW9uLCB4LCB5LCBsYWJlbCkKYGBgCgojIyBQZXJ1ICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlBlcnUiCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbW8gPC0gbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDQsIHRyYWNlID0gRkFMU0UsIHRtYXggPSA0MCkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyMgVmVuZXp1ZWxhICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlZlbmV6dWVsYSIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQptbyA8LSBsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgY3V0b2ZmID0gMSwgdHJhY2UgPSBGQUxTRSwgdG1heCA9IDI1KQpsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdChtbyRkYXRhLCB0LCBQcm9qZWN0ZWRfTEdNLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtbyRhbm5vdGF0aW9uLCB4LCB5LCBsYWJlbCkKYGBgCgojIEV1cm9wZSAgCgojIyBDb25maXJtZWQgQ2FzZSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY291bnRyaWVzIDwtICgiSXRhbHl8U3BhaW58RnJhbmNlfEdlcm1hbnl8Tm9yd2F5fFVuaXRlZCBLaW5nZG9tfE5ldGhlcmxhbmRzfFN3aXR6ZXJsYW5kfFBvcnR1Z2FsIikKZm9vIDwtIHRpZHlfam9pbiAlPiUKICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChjb3VudHJ5LCBjb3VudHJpZXMpICYgc3RhdGUgPT0gImFsbHMiKQpiYXJfZ3JhcGgoZm9vLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAiRXVyb3BlIC0gQ29uZmlybWVkIENhc2UiLCAKICAgICAgICAgICAgICAgICAgcGFzdGUoIk51bWJlciBvZiBDYXNlcyIsIFN5cy5EYXRlKCkpKQpgYGAKCiMjIENvbmZpcm1lZCBDYXNlIC0gQXZlcmFnZSBMYXN0IFRocmVlIERheXMKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3VudHJpZXMgPC0gKCJJdGFseXxTcGFpbnxGcmFuY2V8R2VybWFueXxOb3J3YXl8VW5pdGVkIEtpbmdkb218TmV0aGVybGFuZHN8U3dpdHplcmxhbmR8UG9ydHVnYWwiKQpmb28gPC0gdGlkeV9qb2luICU+JQogIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGNvdW50cnksIGNvdW50cmllcykgJiBzdGF0ZSA9PSAiYWxscyIpCmJhcl9ncmFwaChmb28sIGMzZCwgIAogICAgICAgICAgICAgICAgICAiRXVyb3BlIC0gQ29uZmlybWVkIENhc2UiLCAKICAgICAgICAgICAgICAgICAgcGFzdGUoIkF2ZXJhZ2UgTGFzdCBUaHJlZSBEYXlzIiwgU3lzLkRhdGUoKSkpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkl0YWx5fFNwYWlufEtvcmVhLCBTb3V0aHxHZXJtYW55fFVuaXRlZCBLaW5nZG9tfEZyYW5jZSIpCnRpdGxlIDwtICJFdXJvcGEiCnN1YnRpdGxlIDwtICJDdW11bGF0aXZlIENvbmZpcm1lZCBDYXNlcyIKIyBTZWxlY3QgZGF0YQpkZiA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikgJT4lCiAgZmlsdGVyKENvbmZpcm1lZF9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNvbmZpcm1lZCkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IHZhbHVlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fbGluZShhZXMoY29sb3IgPSBjb3VudHJ5KSkgKyAgIAogIGdlb21fc21vb3RoKGFlcyhjb2wgPSBjb3VudHJ5KSwgbWV0aG9kID0gImF1dG8iLCBzZSA9IFQpICsgIAogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsgICAgCiAgdGhlbWVfbWluaW1hbF9ncmlkKDEzKSArICAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gdGl0bGUsCiAgICAgICBzdWJ0aXRsZSA9IHN1YnRpdGxlLAogICAgICAgY2FwdGlvbiA9IHBhc3RlKCJTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsCiAgICAgICAiXG5BdXRob3I6IEBQZW5hQW5kcmVzIiksIAogICAgICAgeCA9ICJEYXlzIiwgeSA9ICJOdW1iZXIgb2YgQ2FzZXMiKQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkl0YWx5fFNwYWlufEtvcmVhLCBTb3V0aHxHZXJtYW55fFVuaXRlZCBLaW5nZG9tfEZyYW5jZXxTd2l0emVybGFuZCIpCnRpdGxlIDwtICJFdXJvcGUiCnN1YnRpdGxlIDwtICJDdW11bGF0aXZlIENvbmZpcm1lZCBDYXNlcyAtIExvZyBzY2FsZSIKIyBTZWxlY3QgZGF0YQpkZiA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikgJT4lCiAgZmlsdGVyKENvbmZpcm1lZF9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNvbmZpcm1lZCkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKCmdncGxvdChkZiwgYWVzKHggPSBkYXksIHkgPSBsb2codmFsdWUpKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fc21vb3RoKGFlcyhjb2wgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGKSArCiAgZmFjZXRfZ3JpZCgufmNvdW50cnksIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX21pbmltYWxfZ3JpZCgxMikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSB0aXRsZSwKICAgICAgIHN1YnRpdGxlID0gc3VidGl0bGUsCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIkRheXMiLCB5ID0gImxvZyhOdW1iZXIgb2YgQ2FzZXMpIikKYGBgCgojIyBJdGFseSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJJdGFseSIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQptbyA8LSBsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgY3V0b2ZmID0gMTAwLCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gNDApCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90KG1vJGRhdGEsIHQsIFByb2plY3RlZF9MR00sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vJGFubm90YXRpb24sIHgsIHksIGxhYmVsKQpgYGAKCiMjIFNwYWluICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlNwYWluIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAxMDAsIHRyYWNlID0gRkFMU0UsIHRtYXggPSA0MCkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyMgVW5pdGVkIEtpbmdkb20gIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiVW5pdGVkIEtpbmdkb20iCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbW8gPC0gbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDIwMCwgdHJhY2UgPSBGQUxTRSwgdG1heCA9IDM1KQpsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdChtbyRkYXRhLCB0LCBQcm9qZWN0ZWRfTEdNLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtbyRhbm5vdGF0aW9uLCB4LCB5LCBsYWJlbCkKYGBgCgojIyBGcmFuY2UgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiRnJhbmNlIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAxMDAsIHRyYWNlID0gRkFMU0UsIHRtYXggPSAzNSkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyMgR2VybWFueSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJHZXJtYW55IgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAxMDAsIHRyYWNlID0gRkFMU0UsIHRtYXggPSAzNSkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyMgTmV0aGVybGFuZHMKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIk5ldGhlcmxhbmRzIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCAyMCwgdHJhY2UgPSBGLCB0bWF4ID0gMzUpCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90KG1vJGRhdGEsIHQsIFByb2plY3RlZF9MR00sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vJGFubm90YXRpb24sIHgsIHksIGxhYmVsKQpgYGAKCiMjIFN3aXR6ZXJsYW5kICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlN3aXR6ZXJsYW5kIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCA1MCwgdHJhY2UgPSBGQUxTRSwgdG1heCA9IDM1KQpsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdChtbyRkYXRhLCB0LCBQcm9qZWN0ZWRfTEdNLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtbyRhbm5vdGF0aW9uLCB4LCB5LCBsYWJlbCkKYGBgCgojIyBOb3J3YXkgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiTm9yd2F5IgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCAxMCwgdHJhY2UgPSBGQUxTRSwgdG1heCA9IDM1KQpsb2dpc3RpY19ncm93dGhfbW9kZWxfcGxvdChtbyRkYXRhLCB0LCBQcm9qZWN0ZWRfTEdNLCBjb25maXJtZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtbyRhbm5vdGF0aW9uLCB4LCB5LCBsYWJlbCkKYGBgCgojIyBQb3J0dWdhbCAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJQb3J0dWdhbCIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQptbyA8LSBsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgMzUsIHRyYWNlID0gRkFMU0UsIHRtYXggPSAzNSkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCmBgYAoKIyBPdGhlciBDb3VudHJpZXMKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIkphcGFufEtvcmVhLCBTb3V0aHxJcmFufFJ1c3NpYXxJc3JhZWx8SW5kaWF8VHVya2V5fFNhdWRpIEFyYWJpYXxQYWtpc3RhbiIpCmZvbyA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikKYmFyX2dyYXBoKGZvbywgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgIk90aGVyIENvdW50cmllcyAtIENvbmZpcm1lZCBDYXNlIiwgCiAgICAgICAgICAgICAgICAgIHBhc3RlKCJOdW1iZXIgb2YgQ2FzZXMiLCBTeXMuRGF0ZSgpKSkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIklyYW58VHVya2V5fEtvcmVhLCBTb3V0aHxJc3JhZWx8SmFwYW58UnVzc2lhfFNhdWRpIEFyYWJpYSIpCnRpdGxlIDwtICJPdGhlciBDb3VudHJpZXMiCnN1YnRpdGxlIDwtICJDdW11bGF0aXZlIENvbmZpcm1lZCBDYXNlcyIKIyBTZWxlY3QgZGF0YQpkZiA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikgJT4lCiAgZmlsdGVyKENvbmZpcm1lZF9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNvbmZpcm1lZCkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKZ2dwbG90KGRmLCBhZXMoeCA9IGRheSwgeSA9IHZhbHVlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fbGluZShhZXMoY29sb3IgPSBjb3VudHJ5KSkgKyAgIAogIGdlb21fc21vb3RoKGFlcyhjb2wgPSBjb3VudHJ5KSwgbWV0aG9kID0gImF1dG8iLCBzZSA9IFQpICsgIAogIGZhY2V0X2dyaWQoLn5jb3VudHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsgICAgCiAgdGhlbWVfbWluaW1hbF9ncmlkKDEzKSArICAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gdGl0bGUsCiAgICAgICBzdWJ0aXRsZSA9IHN1YnRpdGxlLAogICAgICAgY2FwdGlvbiA9IHBhc3RlKCJTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsCiAgICAgICAiXG5BdXRob3I6IEBQZW5hQW5kcmVzIiksIAogICAgICAgeCA9ICJEYXlzIiwgeSA9ICJOdW1iZXIgb2YgQ2FzZXMiKQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvdW50cmllcyA8LSAoIklyYW58VHVya2V5fEtvcmVhLCBTb3V0aHxJc3JhZWx8SmFwYW58UnVzc2lhfFNhdWRpIEFyYWJpYSIpCnRpdGxlIDwtICJPdGhlciBDb3VudHJpZXMiCnN1YnRpdGxlIDwtICJDdW11bGF0aXZlIENvbmZpcm1lZCBDYXNlcyAtIExvZyBzY2FsZSIKIyBTZWxlY3QgZGF0YQpkZiA8LSB0aWR5X2pvaW4gJT4lCiAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoY291bnRyeSwgY291bnRyaWVzKSAmIHN0YXRlID09ICJhbGxzIikgJT4lCiAgZmlsdGVyKENvbmZpcm1lZF9kYXkgPj0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIGRhdGUsIGNvbmZpcm1lZCkgJT4lCiAgZ2F0aGVyKGtleSA9ICJ2YXJpYWJsZSIsIHZhbHVlID0gInZhbHVlIiwgLWRhdGUsIC1jb3VudHJ5KSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBtdXRhdGUoZGF5ID0gMTpuKCkpCgojIFBsb3QKCmdncGxvdChkZiwgYWVzKHggPSBkYXksIHkgPSBsb2codmFsdWUpKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvdW50cnkpKSArIAogIGdlb21fc21vb3RoKGFlcyhjb2wgPSBjb3VudHJ5KSwgbWV0aG9kID0gImxvZXNzIiwgc2UgPSBGKSArCiAgZmFjZXRfZ3JpZCgufmNvdW50cnksIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX21pbmltYWxfZ3JpZCgxMikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSB0aXRsZSwKICAgICAgIHN1YnRpdGxlID0gc3VidGl0bGUsCiAgICAgICBjYXB0aW9uID0gcGFzdGUoIlNvdXJjZSBkYXRhOiBodHRwczovL2dpdGh1Yi5jb20vQ1NTRUdJU2FuZERhdGEvQ09WSUQtMTkuZ2l0IiwKICAgICAgICJcbkF1dGhvcjogQFBlbmFBbmRyZXMiKSwgCiAgICAgICB4ID0gIkRheXMiLCB5ID0gImxvZyhOdW1iZXIgb2YgQ2FzZXMpIikKYGBgCgojIyBKYXBhbiAgICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkphcGFuIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAyNSwgdHJhY2UgPSBGLCB0bWF4ID0gNjApCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90KG1vJGRhdGEsIHQsIFByb2plY3RlZF9MR00sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vJGFubm90YXRpb24sIHgsIHksIGxhYmVsKQpgYGAKCiMjIEtvcmVhLCBTb3V0aCAgICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIktvcmVhLCBTb3V0aCIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQptbyA8LSBsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgY3V0b2ZmID0gNTAsIHRyYWNlID0gRkFMU0UsIHRtYXggPSA0NSkKbG9naXN0aWNfZ3Jvd3RoX21vZGVsX3Bsb3QobW8kZGF0YSwgdCwgUHJvamVjdGVkX0xHTSwgY29uZmlybWVkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8kYW5ub3RhdGlvbiwgeCwgeSwgbGFiZWwpCnBsb3RseShtbyRkYXRhLCB+dCwgfmNvbmZpcm1lZCwgflByb2plY3RlZF9MR00sIAogICAgICAgcGFzdGUoQ291bnRyeSwgIi0gTW9kZWwgUmVzdWx0cyAtIiwgbW8kYW5ub3RhdGlvbiRsYWJlbCkpCmBgYAoKIyMgSXJhbiAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJJcmFuIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCm1vIDwtIGxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAwLCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gNDUpCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90KG1vJGRhdGEsIHQsIFByb2plY3RlZF9MR00sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vJGFubm90YXRpb24sIHgsIHksIGxhYmVsKQpgYGAKCiMjIFJ1c3NpYSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJSdXNzaWEiCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbW8gPC0gbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDEwLCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gMzUpCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90KG1vJGRhdGEsIHQsIFByb2plY3RlZF9MR00sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vJGFubm90YXRpb24sIHgsIHksIGxhYmVsKQpgYGAKCiMjIElzcmFlbCAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJJc3JhZWwiCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbW8gPC0gbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDE1LCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gNDApCmxvZ2lzdGljX2dyb3d0aF9tb2RlbF9wbG90KG1vJGRhdGEsIHQsIFByb2plY3RlZF9MR00sIGNvbmZpcm1lZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vJGFubm90YXRpb24sIHgsIHksIGxhYmVsKQpgYGAKCiMgUmVmZXJlbmNlcyAgCgpTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCAgCgpDbGFyaywgQS5KLiAoMjAxMSkuICJEZWNsaW5lIEN1cnZlIEFuYWx5c2lzIGluIFVuY29udmVudGlvbmFsIFJlc291cmNlIFBsYXlzCiAgICBVc2luZyBMb2dpc3RpYyBHcm93dGggTW9kZWxzLiIgTS5TLiAKICAgIFRoZXNpcywgVGhlIFVuaXZlcnNpdHkgb2YgVGV4YXMgYXQgQXVzdGluLCBBdWd1c3QgMjAxMS4gCgoK