Summary

In September 2020, the Ecopetrol group offered its stake in certain assets in the prolific basins of Los Llanos, Valle Superior del Magdalena and Valle Medio del Magdalena.

This document shows the application of the production forecast model in order to estimate the remaining value of the portfolio assets for fields includes in Colombia Ecopetrol Fields Round 2020.

The result shows a ranking in terms of net present value and proven developed reserves for each field included in Ecopetrol’s offer.

Introduction

The production forecast model allows estimating the remaining reserves of an oil field based on its production history.

The system makes the best fit of the production history and the generated model allows forecasting the future behavior of the field.

The volumes estimated by the system are considered as proven developed reserves.

Proved Developed Reserves are those Proved Reserves that can be expected to be recovered through existing wells and facilities and by existing operating methods.

The system performs the economic evaluation of the estimated volumes by calculating the net present value of the field.

The use of uniform parameters in the model makes it possible to evaluate the fields included in Ecopetrol’s offer with similar criteria. This was done with the purpose of having uniform criteria for ranking all fields, obviously a future use of the system allows applying different criteria for each field.

The data used in this report was obtained from the Ecopetrol website.

The results of the application of the model to the Colombia 2020 Round are shown below.

Ecopetrol Asset Details

Ecopetrol published details of the assets included in the round, the following table shows the data.

Ecopetrol Asset Details
Assets OOIP RF Production API Operator
Upia 145 37 536 21-30 Hocol
Rancho Hermoso 135 25 938 18-36 Canacol
La Punta 39 41 1225 35-36 Hocol
Andalucia 57 20 86 33 Hocol
Totare 11 8 70 21 Hocol
Toy 11 10 119 18 Hocol
San Luis 61 2 0 36 Ecopetrol
Tenerife 27 2 0 20 Ecopetrol
Lebrija 10 8 0 27 Ecopetrol

Units description:
OOIP: Original oil in place in millions oil barrels
RF: % Recovery factor @ 2019
Production: barrel oil per days @ April-2020
API: API degree
Operator

Fields Evaluation

The evaluation of each field includes three aspects:

  • Production forecast
  • Economic evaluation
  • Field summary

Although uniform criteria are used for the evaluation of all fields, it is possible to apply specific values for each field, such as, for example, cut-off of minimum production; price of oil taking into consideration the API oil, among others.

The system requires in addition to the production of the field, a variable defined as forecast production time (FPT) to carry out the forecast.

On the other hand, the system determines the field daily production rate at FPT period, which is closely related to the economic limit of the field.

Field: Rancho Hermoso

Production Forecast

The following figures show the results of the system.

  • Q: Cumulative oil production, units: mb (thousand oil barrels)
  • Qf: Forecast cumulative oil production, units: mb (thousand oil barrels)
  • q: Daily oil production, units: bpd (barrels per days)
  • qf: Forecast Daily oil production, units: bpd (barrels per days)

Economic Evaluation

The economic evaluation calculates the net present value (NPV) from the production profile estimated by the production forecast model.

The following table shows the parameters used for the economic evaluation and the results obtained by the production forecast model.

Economic Evaluation Parameters & Results
Fields Parameters Units Values
ranchohermoso Oil Price USD/b 46.5
ranchohermoso Opex (Fix) USD/months 522.2
ranchohermoso Opex (Variable) USD/b 11.1
ranchohermoso Royalty % 8.0
ranchohermoso Tax % 39.5
ranchohermoso Discount Rate % 15.0
ranchohermoso Proved developed reserves (Model forecast) mb 1459.0
ranchohermoso NPV before tax mmUSD 40.6
ranchohermoso NPV after tax mmUSD 24.5
ranchohermoso Forecast production time (FPT) Years 5.0
ranchohermoso Field daily production rate at FPT bpd 615.0

Units description:

USD/b: US dollar per oil barrels
USD/months: US dollar per months
% : Percentage
mb: Thousands oil barrels
mmUSD: Millions US dollars
Years: Years
bpd: Barrels oil per days
FPT: Forecast production time (years)

Field Summary

The following figure shows the results of the production forecast model.

  • Field: Rancho Hermoso
  • Operator: Canacol, Hocol
  • Production: 938 bpd - Abr 2020
  • OOIP: 135 mmbp, FR: 25%
  • API: 18-36 API

# save ftwv - rancho hermoso model
setwd("~/Documents/R/julio/data/processed")
saveRDS(ftwv, file = "ranchohermoso_model_19nov20")

Field: Santiago (Upia)

Production Forecast

The following figures show the results of the system.

  • Q: Cumulative oil production, units: mb (thousand oil barrels)
  • Qf: Forecast cumulative oil production, units: mb (thousand oil barrels)
  • q: Daily oil production, units: bpd (barrels per days)
  • qf: Forecast Daily oil production, units: bpd (barrels per days)

Economic Evaluation

The economic evaluation calculates the net present value (NPV) from the production profile estimated by the production forecast model.

The following table shows the parameters used for the economic evaluation and the results obtained by the production forecast model.

Economic Evaluation Parameters & Results
Fields Parameters Units Values
santiago Oil Price USD/b 46.5
santiago Opex (Fix) USD/months 522.2
santiago Opex (Variable) USD/b 11.1
santiago Royalty % 8.0
santiago Tax % 39.5
santiago Discount Rate % 15.0
santiago Proved developed reserves (Model forecast) mb 767.0
santiago NPV before tax mmUSD 20.5
santiago NPV after tax mmUSD 12.4
santiago Forecast production time (FPT) Years 5.0
santiago Field daily production rate at FPT bpd 294.0

Units description:

USD/b: US dollar per oil barrels
USD/months: US dollar per months
% : Percentage
mb: Thousands oil barrels
mmUSD: Millions US dollars
Years: Years
bpd: Barrels oil per days
FPT: Forecast production time (years)

Field Summary

The following figure shows the results of the production forecast model.

  • Field: Santiago (Upia)
  • Operator: Hocol
  • Production: 536 bpd - Abr 2020
  • OOIP: 145 mmbp, FR: 37%
  • API: 21-30 API

Field: La Punta

Production Forecast

The following figures show the results of the system.

  • Q: Cumulative oil production, units: mb (thousand oil barrels)
  • Qf: Forecast cumulative oil production, units: mb (thousand oil barrels)
  • q: Daily oil production, units: bpd (barrels per days)
  • qf: Forecast Daily oil production, units: bpd (barrels per days)

Economic Evaluation

The economic evaluation calculates the net present value (NPV) from the production profile estimated by the production forecast model.

The following table shows the parameters used for the economic evaluation and the results obtained by the production forecast model.

Economic Evaluation Parameters & Results
Fields Parameters Units Values
lapunta Oil Price USD/b 46.5
lapunta Opex (Fix) USD/months 522.2
lapunta Opex (Variable) USD/b 11.1
lapunta Royalty % 8.0
lapunta Tax % 39.5
lapunta Discount Rate % 15.0
lapunta Proved developed reserves (Model forecast) mb 506.0
lapunta NPV before tax mmUSD 13.2
lapunta NPV after tax mmUSD 8.0
lapunta Forecast production time (FPT) Years 5.0
lapunta Field daily production rate at FPT bpd 252.0

Units description:

USD/b: US dollar per oil barrels
USD/months: US dollar per months
% : Percentage
mb: Thousands oil barrels
mmUSD: Millions US dollars
Years: Years
bpd: Barrels oil per days
FPT: Forecast production time (years)

Field Summary

The following figure shows the results of the production forecast model.

  • Field: La Punta
  • Operator: Hocol
  • Production: 1225 bpd - Abr 2020
  • OOIP: 39 mmbp, FR: 41%
  • API: 35-36 API

Field: Santo Domingo

Production Forecast

The following figures show the results of the system.

  • Q: Cumulative oil production, units: mb (thousand oil barrels)
  • Qf: Forecast cumulative oil production, units: mb (thousand oil barrels)
  • q: Daily oil production, units: bpd (barrels per days) (barrels per days)
  • qf: Forecast Daily oil production, units: bpd (barrels per days)

Economic Evaluation

The economic evaluation calculates the net present value (NPV) from the production profile estimated by the production forecast model.

The following table shows the parameters used for the economic evaluation and the results obtained by the production forecast model.

Economic Evaluation Parameters & Results
Fields Parameters Units Values
santodomingo Oil Price USD/b 46.5
santodomingo Opex (Fix) USD/months 522.2
santodomingo Opex (Variable) USD/b 11.1
santodomingo Royalty % 8.0
santodomingo Tax % 39.5
santodomingo Discount Rate % 15.0
santodomingo Proved developed reserves (Model forecast) mb 676.0
santodomingo NPV before tax mmUSD 16.5
santodomingo NPV after tax mmUSD 10.0
santodomingo Forecast production time (FPT) Years 5.0
santodomingo Field daily production rate at FPT bpd 182.0

Units description:

USD/b: US dollar per oil barrels
USD/months: US dollar per months
% : Percentage
mb: Thousands oil barrels
mmUSD: Millions US dollars
Years: Years
bpd: Barrels oil per days
FPT: Forecast production time (years)

Field Summary

The following figure shows the results of the production forecast model.

  • Field: Totare
  • Operator: Hocol
  • Production: 1225 bpd - Abr 2020
  • OOIP: 39 mmbp, FR: 41%
  • API: 35-36 API

Field: Totare

Production Forecast

The following figures show the results of the system.

  • Q: Cumulative oil production, units: mb (thousand oil barrels)
  • Qf: Forecast cumulative oil production, units: mb (thousand oil barrels)
  • q: Daily oil production, units: bpd (barrels per days)
  • qf: Forecast Daily oil production, units: bpd (barrels per days)

Economic Evaluation

The economic evaluation calculates the net present value (NPV) from the production profile estimated by the production forecast model.

The following table shows the parameters used for the economic evaluation and the results obtained by the production forecast model.

Economic Evaluation Parameters & Results
Fields Parameters Units Values
totare Oil Price USD/b 46.5
totare Opex (Fix) USD/months 522.2
totare Opex (Variable) USD/b 11.1
totare Royalty % 8.0
totare Tax % 39.5
totare Discount Rate % 15.0
totare Proved developed reserves (Model forecast) mb 54.0
totare NPV before tax mmUSD 1.4
totare NPV after tax mmUSD 0.8
totare Forecast production time (FPT) Years 5.0
totare Field daily production rate at FPT bpd 24.0

Units description:

USD/b: US dollar per oil barrels
USD/months: US dollar per months
% : Percentage
mb: Thousands oil barrels
mmUSD: Millions US dollars
Years: Years
bpd: Barrels oil per days
FPT: Forecast production time (years)

Field Summary

The following figure shows the results of the production forecast model.

  • Field: Totare
  • Operator: Hocol
  • Production: 70 bpd - Abr 2020
  • OOIP: 11 mmbp, FR: 8%
  • API: 21 API

Field: Andalucia Sur

Production Forecast

The following figures show the results of the system.

  • Q: Cumulative oil production, units: mb (thousand oil barrels)
  • Qf: Forecast cumulative oil production, units: mb (thousand oil barrels)
  • q: Daily oil production, units: bpd (barrels per days)
  • qf: Forecast Daily oil production, units: bpd (barrels per days)

Economic Evaluation

The economic evaluation calculates the net present value (NPV) from the production profile estimated by the production forecast model.

The following table shows the parameters used for the economic evaluation and the results obtained by the production forecast model.

Economic Evaluation Parameters & Results
Fields Parameters Units Values
andaluciasur Oil Price USD/b 46.5
andaluciasur Opex (Fix) USD/months 522.2
andaluciasur Opex (Variable) USD/b 11.1
andaluciasur Royalty % 8.0
andaluciasur Tax % 39.5
andaluciasur Discount Rate % 15.0
andaluciasur Proved developed reserves (Model forecast) mb 75.0
andaluciasur NPV before tax mmUSD 2.2
andaluciasur NPV after tax mmUSD 1.4
andaluciasur Forecast production time (FPT) Years 5.0
andaluciasur Field daily production rate at FPT bpd 37.0

Units description:

USD/b: US dollar per oil barrels
USD/months: US dollar per months
% : Percentage
mb: Thousands oil barrels
mmUSD: Millions US dollars
Years: Years
bpd: Barrels oil per days
FPT: Forecast production time (years)

Field Summary

The following figure shows the results of the production forecast model.

  • Field: Andalucia Sur
  • Operator: Hocol
  • Production: 86 bpd - Abr 2020
  • OOIP: 57 mmbp, FR: 20%
  • API: 33 API

Field: San Luis - Colorado

Production Forecast

The following figures show the results of the system.

  • Q: Cumulative oil production, units: mb (thousand oil barrels)
  • Qf: Forecast cumulative oil production, units: mb (thousand oil barrels)
  • q: Daily oil production, units: bpd (barrels per days)
  • qf: Forecast Daily oil production, units: bpd (barrels per days)

Economic Evaluation

The economic evaluation calculates the net present value (NPV) from the production profile estimated by the production forecast model.

The following table shows the parameters used for the economic evaluation and the results obtained by the production forecast model.

Economic Evaluation Parameters & Results
Fields Parameters Units Values
sanluiscolorado Oil Price USD/b 46.5
sanluiscolorado Opex (Fix) USD/months 522.2
sanluiscolorado Opex (Variable) USD/b 11.1
sanluiscolorado Royalty % 8.0
sanluiscolorado Tax % 39.5
sanluiscolorado Discount Rate % 15.0
sanluiscolorado Proved developed reserves (Model forecast) mb 82.0
sanluiscolorado NPV before tax mmUSD 2.0
sanluiscolorado NPV after tax mmUSD 1.2
sanluiscolorado Forecast production time (FPT) Years 5.0
sanluiscolorado Field daily production rate at FPT bpd 38.0

Units description:

USD/b: US dollar per oil barrels
USD/months: US dollar per months
% : Percentage
mb: Thousands oil barrels
mmUSD: Millions US dollars
Years: Years
bpd: Barrels oil per days
FPT: Forecast production time (years)

Field Summary

The following figure shows the results of the production forecast model.

  • Field: San Luis - Colorado
  • Operator: Ecopetrol
  • Production: 0 bpd - Abr 2020
  • OOIP: 61 mmbp, FR: 2%
  • API: 36 API

Field: Ortega (Toy)

Production Forecast

The following figures show the results of the system.

  • Q: Cumulative oil production, units: mb (thousand oil barrels)
  • Qf: Forecast cumulative oil production, units: mb (thousand oil barrels)
  • q: Daily oil production, units: bpd (barrels per days)
  • qf: Forecast Daily oil production, units: bpd (barrels per days)

Economic Evaluation

The economic evaluation calculates the net present value (NPV) from the production profile estimated by the production forecast model.

The following table shows the parameters used for the economic evaluation and the results obtained by the production forecast model.

Economic Evaluation Parameters & Results
Fields Parameters Units Values
ortega Oil Price USD/b 46.5
ortega Opex (Fix) USD/months 522.2
ortega Opex (Variable) USD/b 11.1
ortega Royalty % 8.0
ortega Tax % 39.5
ortega Discount Rate % 15.0
ortega Proved developed reserves (Model forecast) mb 302.0
ortega NPV before tax mmUSD 8.5
ortega NPV after tax mmUSD 5.1
ortega Forecast production time (FPT) Years 5.0
ortega Field daily production rate at FPT bpd 139.0

Units description:

USD/b: US dollar per oil barrels
USD/months: US dollar per months
% : Percentage
mb: Thousands oil barrels
mmUSD: Millions US dollars
Years: Years
bpd: Barrels oil per days
FPT: Forecast production time (years)

Field Summary

The following figure shows the results of the production forecast model.

  • Field: Ortega (Toy)
  • Operator: Hocol
  • Production: 119 bpd - Abr 2020
  • OOIP: 11 mmbp, FR: 10%
  • API: 18 API

Field: Doña Maria (Lebrija)

Production Forecast

The following figures show the results of the system.

  • Q: Cumulative oil production, units: mb (thousand oil barrels)
  • Qf: Forecast cumulative oil production, units: mb (thousand oil barrels)
  • q: Daily oil production, units: bpd (barrels per days)
  • qf: Forecast Daily oil production, units: bpd (barrels per days)

Economic Evaluation

The economic evaluation calculates the net present value (NPV) from the production profile estimated by the production forecast model.

The following table shows the parameters used for the economic evaluation and the results obtained by the production forecast model.

Economic Evaluation Parameters & Results
Fields Parameters Units Values
donamaria Oil Price USD/b 46.5
donamaria Opex (Fix) USD/months 522.2
donamaria Opex (Variable) USD/b 11.1
donamaria Royalty % 8.0
donamaria Tax % 39.5
donamaria Discount Rate % 15.0
donamaria Proved developed reserves (Model forecast) mb 29.0
donamaria NPV before tax mmUSD 0.7
donamaria NPV after tax mmUSD 0.4
donamaria Forecast production time (FPT) Years 5.0
donamaria Field daily production rate at FPT bpd 11.0

Units description:

USD/b: US dollar per oil barrels
USD/months: US dollar per months
% : Percentage
mb: Thousands oil barrels
mmUSD: Millions US dollars
Years: Years
bpd: Barrels oil per days
FPT: Forecast production time (years)

Field Summary

The following figure shows the results of the production forecast model.

  • Field: Doña Maria (Lebrija)
  • Operator: Ecopetrol
  • Production: 0 bpd - Abr 2020
  • OOIP: 10 mmbp, FR: 8%
  • API: 27 API

Fields Ranking

Proved Developed Reserves

The following figure shows the results of the application of the model to estimate the volumes of proven developed reserves in the fields associated with the round.

NPV after tax

The following figure shows the results of the estimation of the net present value of the fields associated with the round.

Field daily production forecast

The following figure shows the results of the estimation of the Field daily production rate at forecast production time of the fields associated with the round.

Fields Summary Evaluation

Summary All Fields
Parameters Units andaluciasur donamaria lapunta ortega ranchohermoso sanluiscolorado santiago santodomingo totare
Discount Rate % 15.0 15.0 15.0 15.0 15.0 15.0 15.0 15.0 15.0
Field daily production rate at FPT bpd 37.0 11.0 252.0 139.0 615.0 38.0 294.0 182.0 24.0
Forecast production time (FPT) Years 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0
NPV after tax mmUSD 1.4 0.4 8.0 5.1 24.5 1.2 12.4 10.0 0.8
NPV before tax mmUSD 2.2 0.7 13.2 8.5 40.6 2.0 20.5 16.5 1.4
Oil Price USD/b 46.5 46.5 46.5 46.5 46.5 46.5 46.5 46.5 46.5
Opex (Fix) USD/months 522.2 522.2 522.2 522.2 522.2 522.2 522.2 522.2 522.2
Opex (Variable) USD/b 11.1 11.1 11.1 11.1 11.1 11.1 11.1 11.1 11.1
Proved developed reserves (Model forecast) mb 75.0 29.0 506.0 302.0 1459.0 82.0 767.0 676.0 54.0
Royalty % 8.0 8.0 8.0 8.0 8.0 8.0 8.0 8.0 8.0
Tax % 39.5 39.5 39.5 39.5 39.5 39.5 39.5 39.5 39.5

Units description:

USD/bp: US dollar per oil barrels
USD/months: US dollar per months
% : Percentage
mb: Thousands oil barrels
mmUSD: Millions US dollars
Years: Years
bpd: Barrels per days
FPT: Forecast production time (years)
LS0tCnRpdGxlOiAiQ29sb21iaWEgRWNvcGV0cm9sIEZpZWxkcyBSb3VuZCAyMDIwIgphdXRob3I6ICJFdWxlckVuZXJneUBnbWFpbC5jb20iCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IAogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0aGVtZTogc2ltcGxleAogICAgY3NzOiB+L0RvY3VtZW50cy9SL01QUC9zY3JpcHMvc3R5bGUuY3NzCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwotLS0KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFKQpgYGAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CiMjIyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGNsZWFyIHdvcmtzcGFjZQpybShsaXN0ID0gbHMoKSkKc3RhcnRfdGltZSA8LSBTeXMudGltZSgpCgojIHNvdXJjZSBzZXZlcmFsIGZ1bmN0aW9ucyAmIGxpYnJhcmllcwpzb3VyY2UoIn4vRG9jdW1lbnRzL1IvY29sb21iaWEvUi9wZm1fY29sb21iaWFfZnVuY3Rpb25zLjEuUiIpCgojIyMjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbG9nb19sZW9wYXJkdXMgPC0gaW1hZ2VfcmVhZCgifi9Eb2N1bWVudHMvZXVsZXIgZW5lcmd5L2xvZ29fbGVvcGFyZHVzLjEucG5nIikKbG9nb19ldWxlcmVuZXJneSA8LSBpbWFnZV9yZWFkKCJ+L0RvY3VtZW50cy9ldWxlciBlbmVyZ3kvbG9nb19FdWxlckVuZXJneS5wbmciKQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgZm9yZWNhc3QgcHJvZHVjdGlvbiB0aW1lIApmcHQgPC0gNjAKIyBkaXNjb3VudCByYXRlIGZyZXF1ZW5jeQpkcmZxID0gMTIKIyBvaWwgcHJpY2UKcHJpY2UgPSA0Ni41CiMgYW5udWFsIGRpc2NvdW50IHJhdGUKYWRyID0gMC4xNQojIHRheAp0YXggPSAwLjM5NQojIHJveWFsdGllcwpyb3kgPSAwLjA4CiMgb3BleF92YXIgdXNkL2JwCm9wZXhfdmFyID0gMTEuMTEKIyBvcGV4X2ZpeCB1c2QvbW9udGhzCm9wZXhfZml4ID0gNTIyLjIzCiMgZmFjdG9yIHRvIGNvbnZlcnQgYnBkIChtb250aGx5KSB0byBicGQgKGRhaXJ5IGJhc2UpCnltbWQgPC0gMzAuNDE2NjcKYGBgCgojIFN1bW1hcnkgIAoKSW4gU2VwdGVtYmVyIDIwMjAsIHRoZSBFY29wZXRyb2wgZ3JvdXAgb2ZmZXJlZCBpdHMgc3Rha2UgaW4gY2VydGFpbiBhc3NldHMgaW4gdGhlIHByb2xpZmljIGJhc2lucyBvZiBMb3MgTGxhbm9zLCBWYWxsZSBTdXBlcmlvciBkZWwgTWFnZGFsZW5hIGFuZCBWYWxsZSBNZWRpbyBkZWwgTWFnZGFsZW5hLiAKClRoaXMgZG9jdW1lbnQgc2hvd3MgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSAqKnByb2R1Y3Rpb24gZm9yZWNhc3QgbW9kZWwqKiBpbiBvcmRlciB0byBlc3RpbWF0ZSB0aGUgcmVtYWluaW5nIHZhbHVlIG9mIHRoZSBwb3J0Zm9saW8gYXNzZXRzIGZvciBmaWVsZHMgaW5jbHVkZXMgaW4gKipDb2xvbWJpYSBFY29wZXRyb2wgRmllbGRzIFJvdW5kIDIwMjAqKi4KClRoZSByZXN1bHQgc2hvd3MgYSByYW5raW5nIGluIHRlcm1zIG9mICoqbmV0IHByZXNlbnQgdmFsdWUqKiBhbmQgKipwcm92ZW4gZGV2ZWxvcGVkIHJlc2VydmVzKiogZm9yIGVhY2ggZmllbGQgaW5jbHVkZWQgaW4gRWNvcGV0cm9sJ3Mgb2ZmZXIuCgojIEludHJvZHVjdGlvbiAgCgpUaGUgKipwcm9kdWN0aW9uIGZvcmVjYXN0IG1vZGVsKiogYWxsb3dzIGVzdGltYXRpbmcgdGhlIHJlbWFpbmluZyByZXNlcnZlcyBvZiBhbiBvaWwgZmllbGQgYmFzZWQgb24gaXRzIHByb2R1Y3Rpb24gaGlzdG9yeS4gCgpUaGUgc3lzdGVtIG1ha2VzIHRoZSAqKmJlc3QgZml0Kiogb2YgdGhlIHByb2R1Y3Rpb24gaGlzdG9yeSBhbmQgdGhlIGdlbmVyYXRlZCBtb2RlbCBhbGxvd3MgKipmb3JlY2FzdGluZyoqIHRoZSBmdXR1cmUgYmVoYXZpb3Igb2YgdGhlIGZpZWxkLiAgCgpUaGUgdm9sdW1lcyBlc3RpbWF0ZWQgYnkgdGhlIHN5c3RlbSBhcmUgY29uc2lkZXJlZCBhcyAqKnByb3ZlbiBkZXZlbG9wZWQgcmVzZXJ2ZXMqKi4KCioqUHJvdmVkIERldmVsb3BlZCBSZXNlcnZlcyoqIGFyZSB0aG9zZSBQcm92ZWQgUmVzZXJ2ZXMgdGhhdCBjYW4gYmUgZXhwZWN0ZWQgdG8gYmUgcmVjb3ZlcmVkIHRocm91Z2ggZXhpc3Rpbmcgd2VsbHMgYW5kIGZhY2lsaXRpZXMgYW5kIGJ5IGV4aXN0aW5nIG9wZXJhdGluZyBtZXRob2RzLgoKVGhlIHN5c3RlbSBwZXJmb3JtcyB0aGUgZWNvbm9taWMgZXZhbHVhdGlvbiBvZiB0aGUgZXN0aW1hdGVkIHZvbHVtZXMgYnkgY2FsY3VsYXRpbmcgdGhlICoqbmV0IHByZXNlbnQgdmFsdWUqKiBvZiB0aGUgZmllbGQuCgpUaGUgdXNlIG9mIHVuaWZvcm0gcGFyYW1ldGVycyBpbiB0aGUgbW9kZWwgbWFrZXMgaXQgcG9zc2libGUgdG8gZXZhbHVhdGUgdGhlIGZpZWxkcyBpbmNsdWRlZCBpbiBFY29wZXRyb2wncyBvZmZlciB3aXRoIHNpbWlsYXIgY3JpdGVyaWEuIFRoaXMgd2FzIGRvbmUgd2l0aCB0aGUgcHVycG9zZSBvZiBoYXZpbmcgdW5pZm9ybSBjcml0ZXJpYSBmb3IgcmFua2luZyBhbGwgZmllbGRzLCBvYnZpb3VzbHkgYSBmdXR1cmUgdXNlIG9mIHRoZSBzeXN0ZW0gYWxsb3dzIGFwcGx5aW5nIGRpZmZlcmVudCBjcml0ZXJpYSBmb3IgZWFjaCBmaWVsZC4KClRoZSBkYXRhIHVzZWQgaW4gdGhpcyByZXBvcnQgd2FzIG9idGFpbmVkIGZyb20gdGhlIEVjb3BldHJvbCB3ZWJzaXRlLiAgCgpUaGUgcmVzdWx0cyBvZiB0aGUgYXBwbGljYXRpb24gb2YgdGhlIG1vZGVsIHRvIHRoZSAqKkNvbG9tYmlhIDIwMjAgUm91bmQqKiBhcmUgc2hvd24gYmVsb3cuCgojIEVjb3BldHJvbCBBc3NldCBEZXRhaWxzICAgCgpFY29wZXRyb2wgcHVibGlzaGVkIGRldGFpbHMgb2YgdGhlIGFzc2V0cyBpbmNsdWRlZCBpbiB0aGUgcm91bmQsIHRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgdGhlIGRhdGEuICAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRhdGEgPC0gdGliYmxlKAogIEFzc2V0cyA9IGMoIlVwaWEiLCAiUmFuY2hvIEhlcm1vc28iLCAiTGEgUHVudGEiLAogICAgICAgICAgICAiQW5kYWx1Y2lhIiwgIlRvdGFyZSIsICJUb3kiLAogICAgICAgICAgICAiU2FuIEx1aXMiLCAiVGVuZXJpZmUiLCAiTGVicmlqYSIpLAogIFByb2R1Y3Rpb24gPSBjKDUzNiwgOTM4LCAxMjI1LAogICAgICAgICAgICAgICAgIDg2LCA3MCwgMTE5LCAKICAgICAgICAgICAgICAgICAwLCAwLCAwKSwKICBPT0lQID0gYygxNDUsIDEzNSwgMzksCiAgICAgICAgICAgNTcsIDExLCAxMSwgCiAgICAgICAgICAgNjEsIDI3LCAxMCksCiAgUkYgPSBjKDM3LCAyNSwgNDEsCiAgICAgICAgIDIwLCA4LCAxMCwgCiAgICAgICAgIDIsIDIsIDgpLAogIEFQSSA9IGMoIjIxLTMwIiwgIjE4LTM2IiwgIjM1LTM2IiwKICAgICAgICAgICIzMyIsICIyMSIsICIxOCIsCiAgICAgICAgICAiMzYiLCAiMjAiLCAiMjciKSwKICBPcGVyYXRvciA9IGMoIkhvY29sIiwgIkNhbmFjb2wiLCAiSG9jb2wiLAogICAgICAgICAgICAgICAiSG9jb2wiLCJIb2NvbCIsICJIb2NvbCIsIAogICAgICAgICAgICAgICAiRWNvcGV0cm9sIiwgIkVjb3BldHJvbCIsICJFY29wZXRyb2wiKSkKCmRhdGEgPC0gZGF0YSAlPiUgCiAgbXV0YXRlKFJlc2VydmVzID0gT09JUCAqIFJGLzEwMCkgJT4lCiAgc2VsZWN0KEFzc2V0cywgT09JUCwgUkYsIFByb2R1Y3Rpb24sIEFQSSwgT3BlcmF0b3IpCgpwcmludF90YWJsZShkYXRhLCAiRWNvcGV0cm9sIEFzc2V0IERldGFpbHMiLCAxLCAKICAgICAgICAgICAgIk9PSVA6IE9yaWdpbmFsIG9pbCBpbiBwbGFjZSBpbiBtaWxsaW9ucyBvaWwgYmFycmVscwogICAgICAgICAgICBSRjogJSBSZWNvdmVyeSBmYWN0b3IgQCAyMDE5CiAgICAgICAgICAgIFByb2R1Y3Rpb246IGJhcnJlbCBvaWwgcGVyIGRheXMgQCBBcHJpbC0yMDIwCiAgICAgICAgICAgIEFQSTogQVBJIGRlZ3JlZQogICAgICAgICAgICBPcGVyYXRvciIpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyBydW4gZGF0YSB3cmFuZ2xpbmcgZnVuY3Rpb24KZGYgPC0gZGF0YV93cmFuZ2xpbmcuZigpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyBjaG9vc2UgZmllbGQgdG8gYW5hbHl6ZQpGaWVsZCA8LSAicmFuY2hvaGVybW9zbyIKIyBkZWZpbmUgVGl0bGUgb2JqZWN0ClRpdGxlID0gcGFzdGUoIkZpZWxkOiIsIHRvdXBwZXIoRmllbGQpKQojIHJ1biBtb2RlbApydW5fbW9kZWwuZigpCiMgcGxvdCBwcm9kdWN0aW9uIGZvcmVjYXN0CnBmX3Bsb3QgPC0gZ2dhcnJhbmdlKHBsb3RfUV9RZiwgcGxvdF9xX3FmLAogICAgICAgICAgICAgICAgICAgICBuY29sID0gMiwgbnJvdyA9IDEsCiAgICAgICAgICAgICAgICAgICAgIHdpZHRocyA9IGMoMSwgMSksICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBoZWlnaHRzID0gYygxLCAxKSkKCiMgZWNvbm9taWMgZXZhbHVhdGlvbiByZXN1bHQgc3VtbWFyeQpyaF9lZXIgPC0gZWVyX3N1bShwZHIsIG5wdiwgcWUpCiMgcGxvdCBzdW1tYXJ5IGZpZWxkCnBzZl9wbG90IDwtIGdnYXJyYW5nZShwbG90X3FfcWYsIHBsb3RfbnB2LAogICAgICAgICAgICAgICAgICAgICBuY29sID0gMiwgbnJvdyA9IDEsCiAgICAgICAgICAgICAgICAgICAgIHdpZHRocyA9IGMoMSwgMSksICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBoZWlnaHRzID0gYygxLCAxKSkKYGBgCgojIEZpZWxkcyBFdmFsdWF0aW9uICAKClRoZSBldmFsdWF0aW9uIG9mIGVhY2ggZmllbGQgaW5jbHVkZXMgdGhyZWUgYXNwZWN0czogIAoKLSBQcm9kdWN0aW9uIGZvcmVjYXN0ICAKLSBFY29ub21pYyBldmFsdWF0aW9uICAKLSBGaWVsZCBzdW1tYXJ5ICAKCkFsdGhvdWdoIHVuaWZvcm0gY3JpdGVyaWEgYXJlIHVzZWQgZm9yIHRoZSBldmFsdWF0aW9uIG9mIGFsbCBmaWVsZHMsIGl0IGlzIHBvc3NpYmxlIHRvIGFwcGx5IHNwZWNpZmljIHZhbHVlcyBmb3IgZWFjaCBmaWVsZCwgc3VjaCBhcywgZm9yIGV4YW1wbGUsIGN1dC1vZmYgb2YgbWluaW11bSBwcm9kdWN0aW9uOyBwcmljZSBvZiBvaWwgdGFraW5nIGludG8gY29uc2lkZXJhdGlvbiB0aGUgQVBJIG9pbCwgYW1vbmcgb3RoZXJzLiAgCgpUaGUgc3lzdGVtIHJlcXVpcmVzIGluIGFkZGl0aW9uIHRvIHRoZSBwcm9kdWN0aW9uIG9mIHRoZSBmaWVsZCwgYSB2YXJpYWJsZSBkZWZpbmVkIGFzICoqZm9yZWNhc3QgcHJvZHVjdGlvbiB0aW1lKiogKEZQVCkgdG8gY2Fycnkgb3V0IHRoZSBmb3JlY2FzdC4gCgpPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIHN5c3RlbSBkZXRlcm1pbmVzIHRoZSAqKmZpZWxkIGRhaWx5IHByb2R1Y3Rpb24gcmF0ZSoqIGF0IEZQVCBwZXJpb2QsIHdoaWNoIGlzIGNsb3NlbHkgcmVsYXRlZCB0byB0aGUgKiplY29ub21pYyBsaW1pdCoqIG9mIHRoZSBmaWVsZC4gCgojIyBGaWVsZDogUmFuY2hvIEhlcm1vc28KCiMjIyBQcm9kdWN0aW9uIEZvcmVjYXN0ICAKClRoZSBmb2xsb3dpbmcgZmlndXJlcyBzaG93IHRoZSByZXN1bHRzIG9mIHRoZSBzeXN0ZW0uICAKCi0gUTogQ3VtdWxhdGl2ZSBvaWwgcHJvZHVjdGlvbiwgdW5pdHM6IG1iICh0aG91c2FuZCBvaWwgYmFycmVscykKLSBRZjogRm9yZWNhc3QgY3VtdWxhdGl2ZSBvaWwgcHJvZHVjdGlvbiwgdW5pdHM6IG1iICh0aG91c2FuZCBvaWwgYmFycmVscykgCi0gcTogRGFpbHkgb2lsIHByb2R1Y3Rpb24sIHVuaXRzOiBicGQgKGJhcnJlbHMgcGVyIGRheXMpIAotIHFmOiBGb3JlY2FzdCBEYWlseSBvaWwgcHJvZHVjdGlvbiwgdW5pdHM6IGJwZCAoYmFycmVscyBwZXIgZGF5cykgIAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9M30KIyBwbG90IHByb2R1Y3Rpb24gZm9yZWNhc3QKcGZfcGxvdApncmlkOjpncmlkLnJhc3Rlcihsb2dvX2xlb3BhcmR1cywgeCA9IDAuMSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdsZWZ0JywgJ2JvdHRvbScpLCAKICAgICAgICAgICAgICAgICAgd2lkdGggPSB1bml0KDEsICdpbmNoZXMnKSkKZ3JpZDo6Z3JpZC5yYXN0ZXIobG9nb19ldWxlcmVuZXJneSwgeCA9IDAuOTUsIHkgPSAuOTUsIAogICAgICAgICAgICAgICAgICBqdXN0ID0gYygncmlnaHQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpgYGAKCiMjIyBFY29ub21pYyBFdmFsdWF0aW9uICAKClRoZSBlY29ub21pYyBldmFsdWF0aW9uIGNhbGN1bGF0ZXMgdGhlICoqbmV0IHByZXNlbnQgdmFsdWUqKiAoTlBWKSBmcm9tIHRoZSBwcm9kdWN0aW9uIHByb2ZpbGUgZXN0aW1hdGVkIGJ5IHRoZSBwcm9kdWN0aW9uIGZvcmVjYXN0IG1vZGVsLiAgICAKClRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgdGhlIHBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIGVjb25vbWljIGV2YWx1YXRpb24gYW5kIHRoZSByZXN1bHRzIG9idGFpbmVkIGJ5IHRoZSBwcm9kdWN0aW9uIGZvcmVjYXN0IG1vZGVsLiAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgcHJpbnQgZWNvbm9taWMgZXZhbHVhdGlvbiByZXN1bHQgc3VtbWFyeQpwdF9lZXIocmhfZWVyKQpgYGAKCiMjIyBGaWVsZCBTdW1tYXJ5CgpUaGUgZm9sbG93aW5nIGZpZ3VyZSBzaG93cyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJvZHVjdGlvbiBmb3JlY2FzdCBtb2RlbC4gCgogIC0gRmllbGQ6IFJhbmNobyBIZXJtb3NvICAKICAtIE9wZXJhdG9yOiBDYW5hY29sLCBIb2NvbCAgIAogIC0gUHJvZHVjdGlvbjogOTM4IGJwZCAtIEFiciAyMDIwICAKICAtIE9PSVA6IDEzNSBtbWJwLCBGUjogMjUlICAKICAtIEFQSTogMTgtMzYgQVBJICAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTN9CiMgcGxvdCBzdW1tYXJ5IGZpZWxkCnBzZl9wbG90CmdyaWQ6OmdyaWQucmFzdGVyKGxvZ29fbGVvcGFyZHVzLCB4ID0gMC4xLCB5ID0gLjk1LCAKICAgICAgICAgICAgICAgICAganVzdCA9IGMoJ2xlZnQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpncmlkOjpncmlkLnJhc3Rlcihsb2dvX2V1bGVyZW5lcmd5LCB4ID0gMC45NSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdyaWdodCcsICdib3R0b20nKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gdW5pdCgxLCAnaW5jaGVzJykpCmBgYAoKYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIHNhdmUgZnR3diAtIHJhbmNobyBoZXJtb3NvIG1vZGVsCnNldHdkKCJ+L0RvY3VtZW50cy9SL2p1bGlvL2RhdGEvcHJvY2Vzc2VkIikKc2F2ZVJEUyhmdHd2LCBmaWxlID0gInJhbmNob2hlcm1vc29fbW9kZWxfMTlub3YyMCIpCmBgYAoKIyMgRmllbGQ6IFNhbnRpYWdvIChVcGlhKSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD0zfQojIGNob29zZSBmaWVsZCB0byBhbmFseXplCkZpZWxkIDwtICJzYW50aWFnbyIKIyBkZWZpbmUgVGl0bGUgb2JqZWN0ClRpdGxlID0gcGFzdGUoIkZpZWxkOiIsIHRvdXBwZXIoRmllbGQpKQoKcnVuX21vZGVsLmYoKQoKIyBwbG90IHByb2R1Y3Rpb24gZm9yZWNhc3QKcGZfcGxvdCA8LSBnZ2FycmFuZ2UocGxvdF9RX1FmLCBwbG90X3FfcWYsCiAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLCBucm93ID0gMSwKICAgICAgICAgICAgICAgICAgICAgd2lkdGhzID0gYygxLCAxKSwgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIGhlaWdodHMgPSBjKDEsIDEpKQoKIyBlY29ub21pYyBldmFsdWF0aW9uIHJlc3VsdCBzdW1tYXJ5CnNfZWVyIDwtIGVlcl9zdW0ocGRyLCBucHYsIHFlKQojIHBsb3Qgc3VtbWFyeSBmaWVsZApwc2ZfcGxvdCA8LSBnZ2FycmFuZ2UocGxvdF9xX3FmLCBwbG90X25wdiwKICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAxLAogICAgICAgICAgICAgICAgICAgICB3aWR0aHMgPSBjKDEsIDEpLCAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0cyA9IGMoMSwgMSkpCmBgYAoKIyMjIFByb2R1Y3Rpb24gRm9yZWNhc3QgICAKClRoZSBmb2xsb3dpbmcgZmlndXJlcyBzaG93IHRoZSByZXN1bHRzIG9mIHRoZSBzeXN0ZW0uICAKCi0gUTogQ3VtdWxhdGl2ZSBvaWwgcHJvZHVjdGlvbiwgdW5pdHM6IG1iICh0aG91c2FuZCBvaWwgYmFycmVscykKLSBRZjogRm9yZWNhc3QgY3VtdWxhdGl2ZSBvaWwgcHJvZHVjdGlvbiwgdW5pdHM6IG1iICh0aG91c2FuZCBvaWwgYmFycmVscykgCi0gcTogRGFpbHkgb2lsIHByb2R1Y3Rpb24sIHVuaXRzOiBicGQgKGJhcnJlbHMgcGVyIGRheXMpIAotIHFmOiBGb3JlY2FzdCBEYWlseSBvaWwgcHJvZHVjdGlvbiwgdW5pdHM6IGJwZCAoYmFycmVscyBwZXIgZGF5cykgIAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9M30KIyBwbG90IHByb2R1Y3Rpb24gZm9yZWNhc3QKcGZfcGxvdApncmlkOjpncmlkLnJhc3Rlcihsb2dvX2xlb3BhcmR1cywgeCA9IDAuMSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdsZWZ0JywgJ2JvdHRvbScpLCAKICAgICAgICAgICAgICAgICAgd2lkdGggPSB1bml0KDEsICdpbmNoZXMnKSkKZ3JpZDo6Z3JpZC5yYXN0ZXIobG9nb19ldWxlcmVuZXJneSwgeCA9IDAuOTUsIHkgPSAuOTUsIAogICAgICAgICAgICAgICAgICBqdXN0ID0gYygncmlnaHQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpgYGAKCiMjIyBFY29ub21pYyBFdmFsdWF0aW9uICAKClRoZSBlY29ub21pYyBldmFsdWF0aW9uIGNhbGN1bGF0ZXMgdGhlICoqbmV0IHByZXNlbnQgdmFsdWUqKiAoTlBWKSBmcm9tIHRoZSBwcm9kdWN0aW9uIHByb2ZpbGUgZXN0aW1hdGVkIGJ5IHRoZSBwcm9kdWN0aW9uIGZvcmVjYXN0IG1vZGVsLiAgICAKClRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgdGhlIHBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIGVjb25vbWljIGV2YWx1YXRpb24gYW5kIHRoZSByZXN1bHRzIG9idGFpbmVkIGJ5IHRoZSBwcm9kdWN0aW9uIGZvcmVjYXN0IG1vZGVsLiAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgcHJpbnQgZWNvbm9taWMgZXZhbHVhdGlvbiByZXN1bHQgc3VtbWFyeQpwdF9lZXIoc19lZXIpCmBgYAoKIyMjIEZpZWxkIFN1bW1hcnkKClRoZSBmb2xsb3dpbmcgZmlndXJlIHNob3dzIHRoZSByZXN1bHRzIG9mIHRoZSBwcm9kdWN0aW9uIGZvcmVjYXN0IG1vZGVsLgoKICAtIEZpZWxkOiBTYW50aWFnbyAoVXBpYSkgIAogIC0gT3BlcmF0b3I6IEhvY29sICAKICAtIFByb2R1Y3Rpb246IDUzNiBicGQgLSBBYnIgMjAyMCAgCiAgLSBPT0lQOiAxNDUgbW1icCwgRlI6IDM3JSAgCiAgLSBBUEk6IDIxLTMwIEFQSSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD0zfQojIHBsb3Qgc3VtbWFyeSBmaWVsZApwc2ZfcGxvdApncmlkOjpncmlkLnJhc3Rlcihsb2dvX2xlb3BhcmR1cywgeCA9IDAuMSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdsZWZ0JywgJ2JvdHRvbScpLCAKICAgICAgICAgICAgICAgICAgd2lkdGggPSB1bml0KDEsICdpbmNoZXMnKSkKZ3JpZDo6Z3JpZC5yYXN0ZXIobG9nb19ldWxlcmVuZXJneSwgeCA9IDAuOTUsIHkgPSAuOTUsIAogICAgICAgICAgICAgICAgICBqdXN0ID0gYygncmlnaHQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpgYGAKCiMjIEZpZWxkOiBMYSBQdW50YSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD0zfQojIGNob29zZSBmaWVsZCB0byBhbmFseXplCkZpZWxkIDwtICJsYXB1bnRhIgojIGRlZmluZSBUaXRsZSBvYmplY3QKVGl0bGUgPSBwYXN0ZSgiRmllbGQ6IiwgdG91cHBlcihGaWVsZCkpCnJ1bl9tb2RlbC5mKCkKIyBwbG90IHByb2R1Y3Rpb24gZm9yZWNhc3QKcGZfcGxvdCA8LSBnZ2FycmFuZ2UocGxvdF9RX1FmLCBwbG90X3FfcWYsCiAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLCBucm93ID0gMSwKICAgICAgICAgICAgICAgICAgICAgd2lkdGhzID0gYygxLCAxKSwgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIGhlaWdodHMgPSBjKDEsIDEpKQojIGVjb25vbWljIGV2YWx1YXRpb24gcmVzdWx0IHN1bW1hcnkKbHBfZWVyIDwtIGVlcl9zdW0ocGRyLCBucHYsIHFlKQojIHBsb3Qgc3VtbWFyeSBmaWVsZApwc2ZfcGxvdCA8LSBnZ2FycmFuZ2UocGxvdF9xX3FmLCBwbG90X25wdiwKICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAxLAogICAgICAgICAgICAgICAgICAgICB3aWR0aHMgPSBjKDEsIDEpLCAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0cyA9IGMoMSwgMSkpCmBgYAoKIyMjIFByb2R1Y3Rpb24gRm9yZWNhc3QgICAKClRoZSBmb2xsb3dpbmcgZmlndXJlcyBzaG93IHRoZSByZXN1bHRzIG9mIHRoZSBzeXN0ZW0uICAKCi0gUTogQ3VtdWxhdGl2ZSBvaWwgcHJvZHVjdGlvbiwgdW5pdHM6IG1iICh0aG91c2FuZCBvaWwgYmFycmVscykKLSBRZjogRm9yZWNhc3QgY3VtdWxhdGl2ZSBvaWwgcHJvZHVjdGlvbiwgdW5pdHM6IG1iICh0aG91c2FuZCBvaWwgYmFycmVscykgCi0gcTogRGFpbHkgb2lsIHByb2R1Y3Rpb24sIHVuaXRzOiBicGQgKGJhcnJlbHMgcGVyIGRheXMpIAotIHFmOiBGb3JlY2FzdCBEYWlseSBvaWwgcHJvZHVjdGlvbiwgdW5pdHM6IGJwZCAoYmFycmVscyBwZXIgZGF5cykgIAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9M30KIyBwbG90IHByb2R1Y3Rpb24gZm9yZWNhc3QKcGZfcGxvdCAKZ3JpZDo6Z3JpZC5yYXN0ZXIobG9nb19sZW9wYXJkdXMsIHggPSAwLjEsIHkgPSAuOTUsIAogICAgICAgICAgICAgICAgICBqdXN0ID0gYygnbGVmdCcsICdib3R0b20nKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gdW5pdCgxLCAnaW5jaGVzJykpCmdyaWQ6OmdyaWQucmFzdGVyKGxvZ29fZXVsZXJlbmVyZ3ksIHggPSAwLjk1LCB5ID0gLjk1LCAKICAgICAgICAgICAgICAgICAganVzdCA9IGMoJ3JpZ2h0JywgJ2JvdHRvbScpLCAKICAgICAgICAgICAgICAgICAgd2lkdGggPSB1bml0KDEsICdpbmNoZXMnKSkKYGBgCgojIyMgRWNvbm9taWMgRXZhbHVhdGlvbiAgCgpUaGUgZWNvbm9taWMgZXZhbHVhdGlvbiBjYWxjdWxhdGVzIHRoZSAqKm5ldCBwcmVzZW50IHZhbHVlKiogKE5QVikgZnJvbSB0aGUgcHJvZHVjdGlvbiBwcm9maWxlIGVzdGltYXRlZCBieSB0aGUgcHJvZHVjdGlvbiBmb3JlY2FzdCBtb2RlbC4gICAgCgpUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIHRoZSBwYXJhbWV0ZXJzIHVzZWQgZm9yIHRoZSBlY29ub21pYyBldmFsdWF0aW9uIGFuZCB0aGUgcmVzdWx0cyBvYnRhaW5lZCBieSB0aGUgcHJvZHVjdGlvbiBmb3JlY2FzdCBtb2RlbC4gCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIHByaW50IGVjb25vbWljIGV2YWx1YXRpb24gcmVzdWx0IHN1bW1hcnkKcHRfZWVyKGxwX2VlcikKYGBgCgojIyMgRmllbGQgU3VtbWFyeQoKVGhlIGZvbGxvd2luZyBmaWd1cmUgc2hvd3MgdGhlIHJlc3VsdHMgb2YgdGhlIHByb2R1Y3Rpb24gZm9yZWNhc3QgbW9kZWwuICAKCiAgLSBGaWVsZDogTGEgUHVudGEgIAogIC0gT3BlcmF0b3I6IEhvY29sICAgCiAgLSBQcm9kdWN0aW9uOiAxMjI1IGJwZCAtIEFiciAyMDIwICAKICAtIE9PSVA6IDM5IG1tYnAsIEZSOiA0MSUgIAogIC0gQVBJOiAzNS0zNiBBUEkgIAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9M30KIyBwbG90IHN1bW1hcnkgZmllbGQKcHNmX3Bsb3QKZ3JpZDo6Z3JpZC5yYXN0ZXIobG9nb19sZW9wYXJkdXMsIHggPSAwLjEsIHkgPSAuOTUsIAogICAgICAgICAgICAgICAgICBqdXN0ID0gYygnbGVmdCcsICdib3R0b20nKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gdW5pdCgxLCAnaW5jaGVzJykpCmdyaWQ6OmdyaWQucmFzdGVyKGxvZ29fZXVsZXJlbmVyZ3ksIHggPSAwLjk1LCB5ID0gLjk1LCAKICAgICAgICAgICAgICAgICAganVzdCA9IGMoJ3JpZ2h0JywgJ2JvdHRvbScpLCAKICAgICAgICAgICAgICAgICAgd2lkdGggPSB1bml0KDEsICdpbmNoZXMnKSkKYGBgCgojIyBGaWVsZDogU2FudG8gRG9taW5nbyAgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIGNob29zZSBmaWVsZCB0byBhbmFseXplCkZpZWxkIDwtICJzYW50b2RvbWluZ28iCiMgZGVmaW5lIFRpdGxlIG9iamVjdApUaXRsZSA9IHBhc3RlKCJGaWVsZDoiLCB0b3VwcGVyKEZpZWxkKSkKcnVuX21vZGVsLmYoKQojIHBsb3QgcHJvZHVjdGlvbiBmb3JlY2FzdApwZl9wbG90IDwtIGdnYXJyYW5nZShwbG90X1FfUWYsIHBsb3RfcV9xZiwKICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAxLAogICAgICAgICAgICAgICAgICAgICB3aWR0aHMgPSBjKDEsIDEpLCAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0cyA9IGMoMSwgMSkpCiMgZWNvbm9taWMgZXZhbHVhdGlvbiByZXN1bHQgc3VtbWFyeQpzZF9lZXIgPC0gZWVyX3N1bShwZHIsIG5wdiwgcWUpCiMgcGxvdCBzdW1tYXJ5IGZpZWxkCnBzZl9wbG90IDwtIGdnYXJyYW5nZShwbG90X3FfcWYsIHBsb3RfbnB2LAogICAgICAgICAgICAgICAgICAgICBuY29sID0gMiwgbnJvdyA9IDEsCiAgICAgICAgICAgICAgICAgICAgIHdpZHRocyA9IGMoMSwgMSksICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBoZWlnaHRzID0gYygxLCAxKSkKYGBgCgojIyMgUHJvZHVjdGlvbiBGb3JlY2FzdCAgIAoKVGhlIGZvbGxvd2luZyBmaWd1cmVzIHNob3cgdGhlIHJlc3VsdHMgb2YgdGhlIHN5c3RlbS4gIAoKLSBROiBDdW11bGF0aXZlIG9pbCBwcm9kdWN0aW9uLCB1bml0czogbWIgKHRob3VzYW5kIG9pbCBiYXJyZWxzKQotIFFmOiBGb3JlY2FzdCBjdW11bGF0aXZlIG9pbCBwcm9kdWN0aW9uLCB1bml0czogbWIgKHRob3VzYW5kIG9pbCBiYXJyZWxzKSAKLSBxOiBEYWlseSBvaWwgcHJvZHVjdGlvbiwgdW5pdHM6IGJwZCAoYmFycmVscyBwZXIgZGF5cykgKGJhcnJlbHMgcGVyIGRheXMpCi0gcWY6IEZvcmVjYXN0IERhaWx5IG9pbCBwcm9kdWN0aW9uLCB1bml0czogYnBkIChiYXJyZWxzIHBlciBkYXlzKSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD0zfQojIHBsb3QgcHJvZHVjdGlvbiBmb3JlY2FzdApwZl9wbG90CmdyaWQ6OmdyaWQucmFzdGVyKGxvZ29fbGVvcGFyZHVzLCB4ID0gMC4xLCB5ID0gLjk1LCAKICAgICAgICAgICAgICAgICAganVzdCA9IGMoJ2xlZnQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpncmlkOjpncmlkLnJhc3Rlcihsb2dvX2V1bGVyZW5lcmd5LCB4ID0gMC45NSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdyaWdodCcsICdib3R0b20nKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gdW5pdCgxLCAnaW5jaGVzJykpCmBgYAoKIyMjIEVjb25vbWljIEV2YWx1YXRpb24gIAoKVGhlIGVjb25vbWljIGV2YWx1YXRpb24gY2FsY3VsYXRlcyB0aGUgKipuZXQgcHJlc2VudCB2YWx1ZSoqIChOUFYpIGZyb20gdGhlIHByb2R1Y3Rpb24gcHJvZmlsZSBlc3RpbWF0ZWQgYnkgdGhlIHByb2R1Y3Rpb24gZm9yZWNhc3QgbW9kZWwuICAgIAoKVGhlIGZvbGxvd2luZyB0YWJsZSBzaG93cyB0aGUgcGFyYW1ldGVycyB1c2VkIGZvciB0aGUgZWNvbm9taWMgZXZhbHVhdGlvbiBhbmQgdGhlIHJlc3VsdHMgb2J0YWluZWQgYnkgdGhlIHByb2R1Y3Rpb24gZm9yZWNhc3QgbW9kZWwuIAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBwcmludCBlY29ub21pYyBldmFsdWF0aW9uIHJlc3VsdCBzdW1tYXJ5CnB0X2VlcihzZF9lZXIpCmBgYAoKIyMjIEZpZWxkIFN1bW1hcnkgIAoKVGhlIGZvbGxvd2luZyBmaWd1cmUgc2hvd3MgdGhlIHJlc3VsdHMgb2YgdGhlIHByb2R1Y3Rpb24gZm9yZWNhc3QgbW9kZWwuICAKCiAgLSBGaWVsZDogVG90YXJlICAKICAtIE9wZXJhdG9yOiBIb2NvbCAgCiAgLSBQcm9kdWN0aW9uOiAxMjI1IGJwZCAtIEFiciAyMDIwICAKICAtIE9PSVA6IDM5IG1tYnAsIEZSOiA0MSUgIAogIC0gQVBJOiAzNS0zNiBBUEkgICAgCiAgCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTN9CiMgcGxvdCBzdW1tYXJ5IGZpZWxkCnBzZl9wbG90CmdyaWQ6OmdyaWQucmFzdGVyKGxvZ29fbGVvcGFyZHVzLCB4ID0gMC4xLCB5ID0gLjk1LCAKICAgICAgICAgICAgICAgICAganVzdCA9IGMoJ2xlZnQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpncmlkOjpncmlkLnJhc3Rlcihsb2dvX2V1bGVyZW5lcmd5LCB4ID0gMC45NSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdyaWdodCcsICdib3R0b20nKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gdW5pdCgxLCAnaW5jaGVzJykpCmBgYAoKIyMgRmllbGQ6IFRvdGFyZSAgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIGNob29zZSBmaWVsZCB0byBhbmFseXplCkZpZWxkIDwtICJ0b3RhcmUiCiMgZGVmaW5lIFRpdGxlIG9iamVjdApUaXRsZSA9IHBhc3RlKCJGaWVsZDoiLCB0b3VwcGVyKEZpZWxkKSkKIyBydW4gbW9kZWwKcnVuX21vZGVsLmYoKQojIHBsb3QgcHJvZHVjdGlvbiBmb3JlY2FzdApwZl9wbG90IDwtIGdnYXJyYW5nZShwbG90X1FfUWYsIHBsb3RfcV9xZiwKICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAxLAogICAgICAgICAgICAgICAgICAgICB3aWR0aHMgPSBjKDEsIDEpLCAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0cyA9IGMoMSwgMSkpCiMgZWNvbm9taWMgZXZhbHVhdGlvbiByZXN1bHQgc3VtbWFyeQp0b19lZXIgPC0gZWVyX3N1bShwZHIsIG5wdiwgcWUpCiMgcGxvdCBzdW1tYXJ5IGZpZWxkCnBzZl9wbG90IDwtIGdnYXJyYW5nZShwbG90X3FfcWYsIHBsb3RfbnB2LAogICAgICAgICAgICAgICAgICAgICBuY29sID0gMiwgbnJvdyA9IDEsCiAgICAgICAgICAgICAgICAgICAgIHdpZHRocyA9IGMoMSwgMSksICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBoZWlnaHRzID0gYygxLCAxKSkKYGBgCgojIyMgUHJvZHVjdGlvbiBGb3JlY2FzdCAgIAoKVGhlIGZvbGxvd2luZyBmaWd1cmVzIHNob3cgdGhlIHJlc3VsdHMgb2YgdGhlIHN5c3RlbS4gIAoKLSBROiBDdW11bGF0aXZlIG9pbCBwcm9kdWN0aW9uLCB1bml0czogbWIgKHRob3VzYW5kIG9pbCBiYXJyZWxzKQotIFFmOiBGb3JlY2FzdCBjdW11bGF0aXZlIG9pbCBwcm9kdWN0aW9uLCB1bml0czogbWIgKHRob3VzYW5kIG9pbCBiYXJyZWxzKSAKLSBxOiBEYWlseSBvaWwgcHJvZHVjdGlvbiwgdW5pdHM6IGJwZCAoYmFycmVscyBwZXIgZGF5cykgCi0gcWY6IEZvcmVjYXN0IERhaWx5IG9pbCBwcm9kdWN0aW9uLCB1bml0czogYnBkIChiYXJyZWxzIHBlciBkYXlzKSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD0zfQojIHBsb3QgcHJvZHVjdGlvbiBmb3JlY2FzdApwZl9wbG90CmdyaWQ6OmdyaWQucmFzdGVyKGxvZ29fbGVvcGFyZHVzLCB4ID0gMC4xLCB5ID0gLjk1LCAKICAgICAgICAgICAgICAgICAganVzdCA9IGMoJ2xlZnQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpncmlkOjpncmlkLnJhc3Rlcihsb2dvX2V1bGVyZW5lcmd5LCB4ID0gMC45NSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdyaWdodCcsICdib3R0b20nKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gdW5pdCgxLCAnaW5jaGVzJykpCmBgYAoKIyMjIEVjb25vbWljIEV2YWx1YXRpb24gIAoKVGhlIGVjb25vbWljIGV2YWx1YXRpb24gY2FsY3VsYXRlcyB0aGUgKipuZXQgcHJlc2VudCB2YWx1ZSoqIChOUFYpIGZyb20gdGhlIHByb2R1Y3Rpb24gcHJvZmlsZSBlc3RpbWF0ZWQgYnkgdGhlIHByb2R1Y3Rpb24gZm9yZWNhc3QgbW9kZWwuICAgIAoKVGhlIGZvbGxvd2luZyB0YWJsZSBzaG93cyB0aGUgcGFyYW1ldGVycyB1c2VkIGZvciB0aGUgZWNvbm9taWMgZXZhbHVhdGlvbiBhbmQgdGhlIHJlc3VsdHMgb2J0YWluZWQgYnkgdGhlIHByb2R1Y3Rpb24gZm9yZWNhc3QgbW9kZWwuIAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBwcmludCBlY29ub21pYyBldmFsdWF0aW9uIHJlc3VsdCBzdW1tYXJ5CnB0X2Vlcih0b19lZXIpCmBgYAoKIyMjIEZpZWxkIFN1bW1hcnkgIAoKVGhlIGZvbGxvd2luZyBmaWd1cmUgc2hvd3MgdGhlIHJlc3VsdHMgb2YgdGhlIHByb2R1Y3Rpb24gZm9yZWNhc3QgbW9kZWwuICAKCiAgLSBGaWVsZDogVG90YXJlICAKICAtIE9wZXJhdG9yOiBIb2NvbCAgIAogIC0gUHJvZHVjdGlvbjogNzAgYnBkIC0gQWJyIDIwMjAgIAogIC0gT09JUDogMTEgbW1icCwgRlI6IDglICAKICAtIEFQSTogMjEgQVBJICAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTN9CiMgcGxvdCBzdW1tYXJ5IGZpZWxkCnBzZl9wbG90CmdyaWQ6OmdyaWQucmFzdGVyKGxvZ29fbGVvcGFyZHVzLCB4ID0gMC4xLCB5ID0gLjk1LCAKICAgICAgICAgICAgICAgICAganVzdCA9IGMoJ2xlZnQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpncmlkOjpncmlkLnJhc3Rlcihsb2dvX2V1bGVyZW5lcmd5LCB4ID0gMC45NSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdyaWdodCcsICdib3R0b20nKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gdW5pdCgxLCAnaW5jaGVzJykpCmBgYAoKIyMgRmllbGQ6IEFuZGFsdWNpYSBTdXIKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CiMgY2hvb3NlIGZpZWxkIHRvIGFuYWx5emUKRmllbGQgPC0gImFuZGFsdWNpYXN1ciIKIyBkZWZpbmUgVGl0bGUgb2JqZWN0ClRpdGxlID0gcGFzdGUoIkZpZWxkOiIsIHRvdXBwZXIoRmllbGQpKQojIHJ1biBtb2RlbApydW5fbW9kZWwuZigpCiMgcGxvdCBwcm9kdWN0aW9uIGZvcmVjYXN0CnBmX3Bsb3QgPC0gZ2dhcnJhbmdlKHBsb3RfUV9RZiwgcGxvdF9xX3FmLAogICAgICAgICAgICAgICAgICAgICBuY29sID0gMiwgbnJvdyA9IDEsCiAgICAgICAgICAgICAgICAgICAgIHdpZHRocyA9IGMoMSwgMSksICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBoZWlnaHRzID0gYygxLCAxKSkKIyBlY29ub21pYyBldmFsdWF0aW9uIHJlc3VsdCBzdW1tYXJ5CmFzX2VlciA8LSBlZXJfc3VtKHBkciwgbnB2LCBxZSkKIyBwbG90IHN1bW1hcnkgZmllbGQKcHNmX3Bsb3QgPC0gZ2dhcnJhbmdlKHBsb3RfcV9xZiwgcGxvdF9ucHYsCiAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLCBucm93ID0gMSwKICAgICAgICAgICAgICAgICAgICAgd2lkdGhzID0gYygxLCAxKSwgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIGhlaWdodHMgPSBjKDEsIDEpKQoKYGBgCgojIyMgUHJvZHVjdGlvbiBGb3JlY2FzdCAgIAoKVGhlIGZvbGxvd2luZyBmaWd1cmVzIHNob3cgdGhlIHJlc3VsdHMgb2YgdGhlIHN5c3RlbS4gIAoKLSBROiBDdW11bGF0aXZlIG9pbCBwcm9kdWN0aW9uLCB1bml0czogbWIgKHRob3VzYW5kIG9pbCBiYXJyZWxzKQotIFFmOiBGb3JlY2FzdCBjdW11bGF0aXZlIG9pbCBwcm9kdWN0aW9uLCB1bml0czogbWIgKHRob3VzYW5kIG9pbCBiYXJyZWxzKSAKLSBxOiBEYWlseSBvaWwgcHJvZHVjdGlvbiwgdW5pdHM6IGJwZCAoYmFycmVscyBwZXIgZGF5cykgCi0gcWY6IEZvcmVjYXN0IERhaWx5IG9pbCBwcm9kdWN0aW9uLCB1bml0czogYnBkIChiYXJyZWxzIHBlciBkYXlzKSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD0zfQojIHBsb3QgcHJvZHVjdGlvbiBmb3JlY2FzdApwZl9wbG90CmdyaWQ6OmdyaWQucmFzdGVyKGxvZ29fbGVvcGFyZHVzLCB4ID0gMC4xLCB5ID0gLjk1LCAKICAgICAgICAgICAgICAgICAganVzdCA9IGMoJ2xlZnQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpncmlkOjpncmlkLnJhc3Rlcihsb2dvX2V1bGVyZW5lcmd5LCB4ID0gMC45NSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdyaWdodCcsICdib3R0b20nKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gdW5pdCgxLCAnaW5jaGVzJykpCmBgYAoKIyMjIEVjb25vbWljIEV2YWx1YXRpb24gIAoKVGhlIGVjb25vbWljIGV2YWx1YXRpb24gY2FsY3VsYXRlcyB0aGUgKipuZXQgcHJlc2VudCB2YWx1ZSoqIChOUFYpIGZyb20gdGhlIHByb2R1Y3Rpb24gcHJvZmlsZSBlc3RpbWF0ZWQgYnkgdGhlIHByb2R1Y3Rpb24gZm9yZWNhc3QgbW9kZWwuICAgIAoKVGhlIGZvbGxvd2luZyB0YWJsZSBzaG93cyB0aGUgcGFyYW1ldGVycyB1c2VkIGZvciB0aGUgZWNvbm9taWMgZXZhbHVhdGlvbiBhbmQgdGhlIHJlc3VsdHMgb2J0YWluZWQgYnkgdGhlIHByb2R1Y3Rpb24gZm9yZWNhc3QgbW9kZWwuIAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBwcmludCBlY29ub21pYyBldmFsdWF0aW9uIHJlc3VsdCBzdW1tYXJ5CnB0X2Vlcihhc19lZXIpCmBgYAoKIyMjIEZpZWxkIFN1bW1hcnkgIAoKVGhlIGZvbGxvd2luZyBmaWd1cmUgc2hvd3MgdGhlIHJlc3VsdHMgb2YgdGhlIHByb2R1Y3Rpb24gZm9yZWNhc3QgbW9kZWwuICAgIAoKICAtIEZpZWxkOiBBbmRhbHVjaWEgU3VyICAgCiAgLSBPcGVyYXRvcjogSG9jb2wgICAKICAtIFByb2R1Y3Rpb246IDg2IGJwZCAtIEFiciAyMDIwICAKICAtIE9PSVA6IDU3IG1tYnAsIEZSOiAyMCUgIAogIC0gQVBJOiAzMyBBUEkgIAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9M30KIyBwbG90IHN1bW1hcnkgZmllbGQKcHNmX3Bsb3QKZ3JpZDo6Z3JpZC5yYXN0ZXIobG9nb19sZW9wYXJkdXMsIHggPSAwLjEsIHkgPSAuOTUsIAogICAgICAgICAgICAgICAgICBqdXN0ID0gYygnbGVmdCcsICdib3R0b20nKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gdW5pdCgxLCAnaW5jaGVzJykpCmdyaWQ6OmdyaWQucmFzdGVyKGxvZ29fZXVsZXJlbmVyZ3ksIHggPSAwLjk1LCB5ID0gLjk1LCAKICAgICAgICAgICAgICAgICAganVzdCA9IGMoJ3JpZ2h0JywgJ2JvdHRvbScpLCAKICAgICAgICAgICAgICAgICAgd2lkdGggPSB1bml0KDEsICdpbmNoZXMnKSkKYGBgCgojIyBGaWVsZDogU2FuIEx1aXMgLSBDb2xvcmFkbwoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyBjaG9vc2UgZmllbGQgdG8gYW5hbHl6ZQpGaWVsZCA8LSAic2FubHVpc2NvbG9yYWRvIgojIGRlZmluZSBUaXRsZSBvYmplY3QKVGl0bGUgPSBwYXN0ZSgiRmllbGQ6IiwgdG91cHBlcihGaWVsZCkpCiMgcnVuIG1vZGVsCnJ1bl9tb2RlbC5mKCkKIyBwbG90IHByb2R1Y3Rpb24gZm9yZWNhc3QKcGZfcGxvdCA8LSBnZ2FycmFuZ2UocGxvdF9RX1FmLCBwbG90X3FfcWYsCiAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLCBucm93ID0gMSwKICAgICAgICAgICAgICAgICAgICAgd2lkdGhzID0gYygxLCAxKSwgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIGhlaWdodHMgPSBjKDEsIDEpKQojIGVjb25vbWljIGV2YWx1YXRpb24gcmVzdWx0IHN1bW1hcnkKc2xjX2VlciA8LSBlZXJfc3VtKHBkciwgbnB2LCBxZSkKIyBwbG90IHN1bW1hcnkgZmllbGQKcHNmX3Bsb3QgPC0gZ2dhcnJhbmdlKHBsb3RfcV9xZiwgcGxvdF9ucHYsCiAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLCBucm93ID0gMSwKICAgICAgICAgICAgICAgICAgICAgd2lkdGhzID0gYygxLCAxKSwgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIGhlaWdodHMgPSBjKDEsIDEpKQpgYGAKCiMjIyBQcm9kdWN0aW9uIEZvcmVjYXN0ICAgCgpUaGUgZm9sbG93aW5nIGZpZ3VyZXMgc2hvdyB0aGUgcmVzdWx0cyBvZiB0aGUgc3lzdGVtLiAgCgotIFE6IEN1bXVsYXRpdmUgb2lsIHByb2R1Y3Rpb24sIHVuaXRzOiBtYiAodGhvdXNhbmQgb2lsIGJhcnJlbHMpCi0gUWY6IEZvcmVjYXN0IGN1bXVsYXRpdmUgb2lsIHByb2R1Y3Rpb24sIHVuaXRzOiBtYiAodGhvdXNhbmQgb2lsIGJhcnJlbHMpIAotIHE6IERhaWx5IG9pbCBwcm9kdWN0aW9uLCB1bml0czogYnBkIChiYXJyZWxzIHBlciBkYXlzKSAKLSBxZjogRm9yZWNhc3QgRGFpbHkgb2lsIHByb2R1Y3Rpb24sIHVuaXRzOiBicGQgKGJhcnJlbHMgcGVyIGRheXMpICAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTN9CiMgcGxvdCBwcm9kdWN0aW9uIGZvcmVjYXN0CnBmX3Bsb3QKZ3JpZDo6Z3JpZC5yYXN0ZXIobG9nb19sZW9wYXJkdXMsIHggPSAwLjEsIHkgPSAuOTUsIAogICAgICAgICAgICAgICAgICBqdXN0ID0gYygnbGVmdCcsICdib3R0b20nKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gdW5pdCgxLCAnaW5jaGVzJykpCmdyaWQ6OmdyaWQucmFzdGVyKGxvZ29fZXVsZXJlbmVyZ3ksIHggPSAwLjk1LCB5ID0gLjk1LCAKICAgICAgICAgICAgICAgICAganVzdCA9IGMoJ3JpZ2h0JywgJ2JvdHRvbScpLCAKICAgICAgICAgICAgICAgICAgd2lkdGggPSB1bml0KDEsICdpbmNoZXMnKSkKYGBgCgojIyMgRWNvbm9taWMgRXZhbHVhdGlvbiAgCgpUaGUgZWNvbm9taWMgZXZhbHVhdGlvbiBjYWxjdWxhdGVzIHRoZSAqKm5ldCBwcmVzZW50IHZhbHVlKiogKE5QVikgZnJvbSB0aGUgcHJvZHVjdGlvbiBwcm9maWxlIGVzdGltYXRlZCBieSB0aGUgcHJvZHVjdGlvbiBmb3JlY2FzdCBtb2RlbC4gICAgCgpUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIHRoZSBwYXJhbWV0ZXJzIHVzZWQgZm9yIHRoZSBlY29ub21pYyBldmFsdWF0aW9uIGFuZCB0aGUgcmVzdWx0cyBvYnRhaW5lZCBieSB0aGUgcHJvZHVjdGlvbiBmb3JlY2FzdCBtb2RlbC4gCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIHByaW50IGVjb25vbWljIGV2YWx1YXRpb24gcmVzdWx0IHN1bW1hcnkKcHRfZWVyKHNsY19lZXIpCmBgYAoKIyMjIEZpZWxkIFN1bW1hcnkgIAoKVGhlIGZvbGxvd2luZyBmaWd1cmUgc2hvd3MgdGhlIHJlc3VsdHMgb2YgdGhlIHByb2R1Y3Rpb24gZm9yZWNhc3QgbW9kZWwuICAgCgogIC0gRmllbGQ6IFNhbiBMdWlzIC0gQ29sb3JhZG8gCiAgLSBPcGVyYXRvcjogRWNvcGV0cm9sICAgCiAgLSBQcm9kdWN0aW9uOiAwIGJwZCAtIEFiciAyMDIwICAKICAtIE9PSVA6IDYxIG1tYnAsIEZSOiAyJSAgCiAgLSBBUEk6IDM2IEFQSSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD0zfQojIHBsb3Qgc3VtbWFyeSBmaWVsZApwc2ZfcGxvdApncmlkOjpncmlkLnJhc3Rlcihsb2dvX2xlb3BhcmR1cywgeCA9IDAuMSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdsZWZ0JywgJ2JvdHRvbScpLCAKICAgICAgICAgICAgICAgICAgd2lkdGggPSB1bml0KDEsICdpbmNoZXMnKSkKZ3JpZDo6Z3JpZC5yYXN0ZXIobG9nb19ldWxlcmVuZXJneSwgeCA9IDAuOTUsIHkgPSAuOTUsIAogICAgICAgICAgICAgICAgICBqdXN0ID0gYygncmlnaHQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpgYGAKCiMjIEZpZWxkOiBPcnRlZ2EgKFRveSkgIAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyBjaG9vc2UgZmllbGQgdG8gYW5hbHl6ZQpGaWVsZCA8LSAib3J0ZWdhIgojIGRlZmluZSBUaXRsZSBvYmplY3QKVGl0bGUgPSBwYXN0ZSgiRmllbGQ6IiwgdG91cHBlcihGaWVsZCkpCiMgc2F2ZSBkZgpkdSA8LSBkZgojIGZpbHRlciBmaWVsZCBkYXRhCmRmIDwtIGRmICU+JSAKICBmaWx0ZXIoZmllbGQgJWluJSBGaWVsZCkgJT4lCiAgZmlsdGVyKGRhdGUgPiAiMjAxOC0xMC0wMSIpCiMgcnVuIG1vZGVsCnJ1bl9tb2RlbC5mKCkKIyBwbG90IHByb2R1Y3Rpb24gZm9yZWNhc3QKcGZfcGxvdCA8LSBnZ2FycmFuZ2UocGxvdF9RX1FmLCBwbG90X3FfcWYsCiAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyLCBucm93ID0gMSwKICAgICAgICAgICAgICAgICAgICAgd2lkdGhzID0gYygxLCAxKSwgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIGhlaWdodHMgPSBjKDEsIDEpKQojIGVjb25vbWljIGV2YWx1YXRpb24gcmVzdWx0IHN1bW1hcnkKb3JfZWVyIDwtIGVlcl9zdW0ocGRyLCBucHYsIHFlKQojIHBsb3Qgc3VtbWFyeSBmaWVsZApwc2ZfcGxvdCA8LSBnZ2FycmFuZ2UocGxvdF9xX3FmLCBwbG90X25wdiwKICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAxLAogICAgICAgICAgICAgICAgICAgICB3aWR0aHMgPSBjKDEsIDEpLCAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0cyA9IGMoMSwgMSkpCmBgYAoKIyMjIFByb2R1Y3Rpb24gRm9yZWNhc3QgICAKClRoZSBmb2xsb3dpbmcgZmlndXJlcyBzaG93IHRoZSByZXN1bHRzIG9mIHRoZSBzeXN0ZW0uICAKCi0gUTogQ3VtdWxhdGl2ZSBvaWwgcHJvZHVjdGlvbiwgdW5pdHM6IG1iICh0aG91c2FuZCBvaWwgYmFycmVscykKLSBRZjogRm9yZWNhc3QgY3VtdWxhdGl2ZSBvaWwgcHJvZHVjdGlvbiwgdW5pdHM6IG1iICh0aG91c2FuZCBvaWwgYmFycmVscykgCi0gcTogRGFpbHkgb2lsIHByb2R1Y3Rpb24sIHVuaXRzOiBicGQgKGJhcnJlbHMgcGVyIGRheXMpIAotIHFmOiBGb3JlY2FzdCBEYWlseSBvaWwgcHJvZHVjdGlvbiwgdW5pdHM6IGJwZCAoYmFycmVscyBwZXIgZGF5cykgIAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9M30KIyBwbG90IHByb2R1Y3Rpb24gZm9yZWNhc3QKcGZfcGxvdApncmlkOjpncmlkLnJhc3Rlcihsb2dvX2xlb3BhcmR1cywgeCA9IDAuMSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdsZWZ0JywgJ2JvdHRvbScpLCAKICAgICAgICAgICAgICAgICAgd2lkdGggPSB1bml0KDEsICdpbmNoZXMnKSkKZ3JpZDo6Z3JpZC5yYXN0ZXIobG9nb19ldWxlcmVuZXJneSwgeCA9IDAuOTUsIHkgPSAuOTUsIAogICAgICAgICAgICAgICAgICBqdXN0ID0gYygncmlnaHQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpgYGAKCgojIyMgRWNvbm9taWMgRXZhbHVhdGlvbiAgCgpUaGUgZWNvbm9taWMgZXZhbHVhdGlvbiBjYWxjdWxhdGVzIHRoZSAqKm5ldCBwcmVzZW50IHZhbHVlKiogKE5QVikgZnJvbSB0aGUgcHJvZHVjdGlvbiBwcm9maWxlIGVzdGltYXRlZCBieSB0aGUgcHJvZHVjdGlvbiBmb3JlY2FzdCBtb2RlbC4gICAgCgpUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIHRoZSBwYXJhbWV0ZXJzIHVzZWQgZm9yIHRoZSBlY29ub21pYyBldmFsdWF0aW9uIGFuZCB0aGUgcmVzdWx0cyBvYnRhaW5lZCBieSB0aGUgcHJvZHVjdGlvbiBmb3JlY2FzdCBtb2RlbC4gCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIHByaW50IGVjb25vbWljIGV2YWx1YXRpb24gcmVzdWx0IHN1bW1hcnkKcHRfZWVyKG9yX2VlcikKYGBgCgojIyMgRmllbGQgU3VtbWFyeSAgCgpUaGUgZm9sbG93aW5nIGZpZ3VyZSBzaG93cyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJvZHVjdGlvbiBmb3JlY2FzdCBtb2RlbC4gIAoKICAtIEZpZWxkOiBPcnRlZ2EgKFRveSkgIAogIC0gT3BlcmF0b3I6IEhvY29sICAKICAtIFByb2R1Y3Rpb246IDExOSBicGQgLSBBYnIgMjAyMCAgCiAgLSBPT0lQOiAxMSBtbWJwLCBGUjogMTAlICAKICAtIEFQSTogMTggQVBJICAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTN9CiMgcGxvdCBzdW1tYXJ5IGZpZWxkCnBzZl9wbG90CmdyaWQ6OmdyaWQucmFzdGVyKGxvZ29fbGVvcGFyZHVzLCB4ID0gMC4xLCB5ID0gLjk1LCAKICAgICAgICAgICAgICAgICAganVzdCA9IGMoJ2xlZnQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpncmlkOjpncmlkLnJhc3Rlcihsb2dvX2V1bGVyZW5lcmd5LCB4ID0gMC45NSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdyaWdodCcsICdib3R0b20nKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gdW5pdCgxLCAnaW5jaGVzJykpCmBgYAoKIyMgRmllbGQ6IERvw7FhIE1hcmlhIChMZWJyaWphKSAgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIGNob29zZSBmaWVsZCB0byBhbmFseXplCkZpZWxkIDwtICJkb25hbWFyaWEiCiMgZGVmaW5lIFRpdGxlIG9iamVjdApUaXRsZSA9IHBhc3RlKCJGaWVsZDoiLCB0b3VwcGVyKEZpZWxkKSkKIyByZXRyaWV2YWwgZGYKZGYgPC0gZHUKIyBydW4gbW9kZWwKcnVuX21vZGVsLmYoKQojIHBsb3QgcHJvZHVjdGlvbiBmb3JlY2FzdApwZl9wbG90IDwtIGdnYXJyYW5nZShwbG90X1FfUWYsIHBsb3RfcV9xZiwKICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAxLAogICAgICAgICAgICAgICAgICAgICB3aWR0aHMgPSBjKDEsIDEpLCAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0cyA9IGMoMSwgMSkpCiMgZWNvbm9taWMgZXZhbHVhdGlvbiByZXN1bHQgc3VtbWFyeQpkbV9lZXIgPC0gZWVyX3N1bShwZHIsIG5wdiwgcWUpCiMgcGxvdCBzdW1tYXJ5IGZpZWxkCnBzZl9wbG90IDwtIGdnYXJyYW5nZShwbG90X3FfcWYsIHBsb3RfbnB2LAogICAgICAgICAgICAgICAgICAgICBuY29sID0gMiwgbnJvdyA9IDEsCiAgICAgICAgICAgICAgICAgICAgIHdpZHRocyA9IGMoMSwgMSksICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBoZWlnaHRzID0gYygxLCAxKSkKYGBgCgojIyMgUHJvZHVjdGlvbiBGb3JlY2FzdCAgIAoKVGhlIGZvbGxvd2luZyBmaWd1cmVzIHNob3cgdGhlIHJlc3VsdHMgb2YgdGhlIHN5c3RlbS4gIAoKLSBROiBDdW11bGF0aXZlIG9pbCBwcm9kdWN0aW9uLCB1bml0czogbWIgKHRob3VzYW5kIG9pbCBiYXJyZWxzKQotIFFmOiBGb3JlY2FzdCBjdW11bGF0aXZlIG9pbCBwcm9kdWN0aW9uLCB1bml0czogbWIgKHRob3VzYW5kIG9pbCBiYXJyZWxzKSAKLSBxOiBEYWlseSBvaWwgcHJvZHVjdGlvbiwgdW5pdHM6IGJwZCAoYmFycmVscyBwZXIgZGF5cykgCi0gcWY6IEZvcmVjYXN0IERhaWx5IG9pbCBwcm9kdWN0aW9uLCB1bml0czogYnBkIChiYXJyZWxzIHBlciBkYXlzKSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD0zfQojIHBsb3QgcHJvZHVjdGlvbiBmb3JlY2FzdApwZl9wbG90CmdyaWQ6OmdyaWQucmFzdGVyKGxvZ29fbGVvcGFyZHVzLCB4ID0gMC4xLCB5ID0gLjk1LCAKICAgICAgICAgICAgICAgICAganVzdCA9IGMoJ2xlZnQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpncmlkOjpncmlkLnJhc3Rlcihsb2dvX2V1bGVyZW5lcmd5LCB4ID0gMC45NSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdyaWdodCcsICdib3R0b20nKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gdW5pdCgxLCAnaW5jaGVzJykpCmBgYAoKCiMjIyBFY29ub21pYyBFdmFsdWF0aW9uICAKClRoZSBlY29ub21pYyBldmFsdWF0aW9uIGNhbGN1bGF0ZXMgdGhlICoqbmV0IHByZXNlbnQgdmFsdWUqKiAoTlBWKSBmcm9tIHRoZSBwcm9kdWN0aW9uIHByb2ZpbGUgZXN0aW1hdGVkIGJ5IHRoZSBwcm9kdWN0aW9uIGZvcmVjYXN0IG1vZGVsLiAgICAKClRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgdGhlIHBhcmFtZXRlcnMgdXNlZCBmb3IgdGhlIGVjb25vbWljIGV2YWx1YXRpb24gYW5kIHRoZSByZXN1bHRzIG9idGFpbmVkIGJ5IHRoZSBwcm9kdWN0aW9uIGZvcmVjYXN0IG1vZGVsLiAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgcHJpbnQgZWNvbm9taWMgZXZhbHVhdGlvbiByZXN1bHQgc3VtbWFyeQpwdF9lZXIoZG1fZWVyKQpgYGAKCiMjIyBGaWVsZCBTdW1tYXJ5ICAKClRoZSBmb2xsb3dpbmcgZmlndXJlIHNob3dzIHRoZSByZXN1bHRzIG9mIHRoZSBwcm9kdWN0aW9uIGZvcmVjYXN0IG1vZGVsLiAgCgogIC0gRmllbGQ6IERvw7FhIE1hcmlhIChMZWJyaWphKSAgIAogIC0gT3BlcmF0b3I6IEVjb3BldHJvbCAgIAogIC0gUHJvZHVjdGlvbjogMCBicGQgLSBBYnIgMjAyMCAgCiAgLSBPT0lQOiAxMCBtbWJwLCBGUjogOCUgIAogIC0gQVBJOiAyNyBBUEkgICAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTN9CiMgcGxvdCBzdW1tYXJ5IGZpZWxkCnBzZl9wbG90CmdyaWQ6OmdyaWQucmFzdGVyKGxvZ29fbGVvcGFyZHVzLCB4ID0gMC4xLCB5ID0gLjk1LCAKICAgICAgICAgICAgICAgICAganVzdCA9IGMoJ2xlZnQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpncmlkOjpncmlkLnJhc3Rlcihsb2dvX2V1bGVyZW5lcmd5LCB4ID0gMC45NSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdyaWdodCcsICdib3R0b20nKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gdW5pdCgxLCAnaW5jaGVzJykpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgc3VtbWFyeSBldmFsdWF0aW9uIGFsbCBmaWVsZHMKZHcgPC0gYmluZF9yb3dzKGFzX2VlciwgbHBfZWVyLCByaF9lZXIsIHNfZWVyLCAKICAgICAgICAgICAgICAgIHNkX2Vlciwgc2xjX2VlciwgdG9fZWVyLCBkbV9lZXIsIG9yX2VlcikKZHMgPC0gZHcgJT4lIHNwcmVhZChGaWVsZHMsIFZhbHVlcykKYGBgCgojIEZpZWxkcyBSYW5raW5nICAKCiMjIFByb3ZlZCBEZXZlbG9wZWQgUmVzZXJ2ZXMgIAoKVGhlIGZvbGxvd2luZyBmaWd1cmUgc2hvd3MgdGhlIHJlc3VsdHMgb2YgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBtb2RlbCB0byBlc3RpbWF0ZSB0aGUgdm9sdW1lcyBvZiAqKnByb3ZlbiBkZXZlbG9wZWQgcmVzZXJ2ZXMqKiBpbiB0aGUgZmllbGRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcm91bmQuCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD0zfQojIGJhciBwbG90IFByb3ZlZCBkZXZlbG9wZWQgcmVzZXJ2ZXMgKE1vZGVsIGZvcmVjYXN0KQpUaXRsZSA8LSAiQ29sb21iaWEgUm91bmQgMjAyMCIKcGFyYW1ldGVyIDwtICJQcm92ZWQgZGV2ZWxvcGVkIHJlc2VydmVzIChNb2RlbCBmb3JlY2FzdCkiClggPSAiRmllbGRzIgpZID0gIm1iOiBUaG91c2FuZHMgb2lsIGJhcnJlbHMiCiMgcnVuIGJhciBwbG90IGZ1bmN0aW9uCmJhcl9wbG90KGR3LCBwYXJhbWV0ZXIpCmdyaWQ6OmdyaWQucmFzdGVyKGxvZ29fbGVvcGFyZHVzLCB4ID0gMC4xLCB5ID0gLjk1LCAKICAgICAgICAgICAgICAgICAganVzdCA9IGMoJ2xlZnQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpncmlkOjpncmlkLnJhc3Rlcihsb2dvX2V1bGVyZW5lcmd5LCB4ID0gMC45NSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdyaWdodCcsICdib3R0b20nKSwgCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gdW5pdCgxLCAnaW5jaGVzJykpCmBgYAoKIyMgTlBWIGFmdGVyIHRheCAKClRoZSBmb2xsb3dpbmcgZmlndXJlIHNob3dzIHRoZSByZXN1bHRzIG9mIHRoZSBlc3RpbWF0aW9uIG9mIHRoZSAqKm5ldCBwcmVzZW50IHZhbHVlKiogb2YgdGhlIGZpZWxkcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJvdW5kLgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9M30KIyBiYXIgcGxvdCBOUFYgYWZ0ZXIgdGF4ClggPSAiRmllbGRzIgpZID0gIm1tVVNEOiBNaWxsaW9ucyBVUyBkb2xsYXJzIgpiYXJfcGxvdChkdywgIk5QViBhZnRlciB0YXgiKQpncmlkOjpncmlkLnJhc3Rlcihsb2dvX2xlb3BhcmR1cywgeCA9IDAuMSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdsZWZ0JywgJ2JvdHRvbScpLCAKICAgICAgICAgICAgICAgICAgd2lkdGggPSB1bml0KDEsICdpbmNoZXMnKSkKZ3JpZDo6Z3JpZC5yYXN0ZXIobG9nb19ldWxlcmVuZXJneSwgeCA9IDAuOTUsIHkgPSAuOTUsIAogICAgICAgICAgICAgICAgICBqdXN0ID0gYygncmlnaHQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpgYGAKCiMjIEZpZWxkIGRhaWx5IHByb2R1Y3Rpb24gZm9yZWNhc3QKClRoZSBmb2xsb3dpbmcgZmlndXJlIHNob3dzIHRoZSByZXN1bHRzIG9mIHRoZSBlc3RpbWF0aW9uIG9mIHRoZSAqKkZpZWxkIGRhaWx5IHByb2R1Y3Rpb24gcmF0ZSoqIGF0ICoqZm9yZWNhc3QgcHJvZHVjdGlvbiB0aW1lKiogb2YgdGhlIGZpZWxkcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJvdW5kLgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9M30KIyBiYXIgcGxvdCBGaWVsZCBkYWlseSBwcm9kdWN0aW9uIHJhdGUgYXQgRlBUCnBhcmFtZXRlciA8LSAiRmllbGQgZGFpbHkgcHJvZHVjdGlvbiByYXRlIGF0IEZQVCIKWCA9ICJGaWVsZHMiClkgPSAiYnBkOiBCYXJyZWxzIHBlciBkYXlzIgpiYXJfcGxvdChkdywgcGFyYW1ldGVyKQpncmlkOjpncmlkLnJhc3Rlcihsb2dvX2xlb3BhcmR1cywgeCA9IDAuMSwgeSA9IC45NSwgCiAgICAgICAgICAgICAgICAgIGp1c3QgPSBjKCdsZWZ0JywgJ2JvdHRvbScpLCAKICAgICAgICAgICAgICAgICAgd2lkdGggPSB1bml0KDEsICdpbmNoZXMnKSkKZ3JpZDo6Z3JpZC5yYXN0ZXIobG9nb19ldWxlcmVuZXJneSwgeCA9IDAuOTUsIHkgPSAuOTUsIAogICAgICAgICAgICAgICAgICBqdXN0ID0gYygncmlnaHQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpgYGAKCiMgRmllbGRzIFN1bW1hcnkgRXZhbHVhdGlvbiAgCgpgYGB7ciBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD03fQpwcmludF90YWJsZShkcywgIlN1bW1hcnkgQWxsIEZpZWxkcyIsIDEsIAogICAgICAgICAgICAiXG5VU0QvYnA6IFVTIGRvbGxhciBwZXIgb2lsIGJhcnJlbHMKICAgICAgICAgICAgVVNEL21vbnRoczogVVMgZG9sbGFyIHBlciBtb250aHMKICAgICAgICAgICAgJSA6IFBlcmNlbnRhZ2UKICAgICAgICAgICAgbWI6IFRob3VzYW5kcyBvaWwgYmFycmVscwogICAgICAgICAgICBtbVVTRDogTWlsbGlvbnMgVVMgZG9sbGFycwogICAgICAgICAgICBZZWFyczogWWVhcnMKICAgICAgICAgICAgYnBkOiBCYXJyZWxzIHBlciBkYXlzCiAgICAgICAgICAgIEZQVDogRm9yZWNhc3QgcHJvZHVjdGlvbiB0aW1lICh5ZWFycykiKQpgYGAKCgpgYGB7ciBldmFsPUZBTFNFLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD0zLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIENvbXBhcmlzb246IENvbG9tYmlhIFJvdW5kIDIwMjAgLSBMZW9wYXJkdXMgRmllbGQgIApwYXIxIDwtICJQcm92ZWQgZGV2ZWxvcGVkIHJlc2VydmVzIChNb2RlbCBmb3JlY2FzdCkiCnBhcjIgPC0gIk5QViBhZnRlciB0YXgiCgpwMSA8LSBkdyAlPiUgCiAgZmlsdGVyKFBhcmFtZXRlcnMgPT0gcGFyMSkgJT4lCiAgcmVuYW1lKFBEUiA9IFZhbHVlcykgJT4lCiAgc2VsZWN0KEZpZWxkcywgUERSKQoKcDIgPC0gZHcgJT4lIAogIGZpbHRlcihQYXJhbWV0ZXJzID09IHBhcjIpICU+JQogIHJlbmFtZShOUFYgPSBWYWx1ZXMpICU+JQogIHNlbGVjdChGaWVsZHMsIE5QVikKCmxlbyA8LSBkYXRhLmZyYW1lKEZpZWxkcyA9ICJMZW9wYXJkdXMiLCBQRFIgPSAxMDM1LCBOUFYgPSAxNC4wOCkKCnAgPC0gcDEgJT4lIGZ1bGxfam9pbihwMikKcCA8LSBwICU+JSBmdWxsX2pvaW4obGVvKSAlPiUKICBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCByb3VuZCwgMSkpCgpwbHQgPC0gZ2dwbG90KHApICsgZ2VvbV9wb2ludChhZXMoUERSLCBOUFYsIGNvbCA9IEZpZWxkcykpICsKICBnZ3RpdGxlKCJDb2xvbWJpYSBSb3VuZCAyMDIwIFxuIE5QViBhZnRlciBUYXggdnMgUHJvdmVkIERldmVsb3BlZCBSZXNlcnZlcyIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZSA9IDE2KSkgKwogIHhsYWIoIlByb3ZlZCBEZXZlbG9wZWQgUmVzZXJ2ZXMgXG5UaG91c2FuZHMgb2lsIGJhcnJlbHMiKSArCiAgeWxhYigiTlBWIGFmdGVyIFRheCBcbk1pbGxpb25zIFVTIERvbGxhcnMiKQpncmlkOjpncmlkLnJhc3Rlcihsb2dvX2xlb3BhcmR1cywgeCA9IDAuMSwgeSA9IC45LCAKICAgICAgICAgICAgICAgICAganVzdCA9IGMoJ2xlZnQnLCAnYm90dG9tJyksIAogICAgICAgICAgICAgICAgICB3aWR0aCA9IHVuaXQoMSwgJ2luY2hlcycpKQpncmlkOjpncmlkLnJhc3Rlcihsb2dvX2V1bGVyZW5lcmd5LCB4ID0gMC45NSwgeSA9IC45LCAKICAgICAgICAgICAgICAgICAganVzdCA9IGMoJ3JpZ2h0JywgJ2JvdHRvbScpLCAKICAgICAgICAgICAgICAgICAgd2lkdGggPSB1bml0KDEsICdpbmNoZXMnKSkKCmdncGxvdGx5KHBsdCkKCiMgcCAlPiUgaGNoYXJ0KCJzY2F0dGVyIiwgaGNhZXMoeCA9IFBEUiwgeSA9IE5QViwgZ3JvdXAgPSBGaWVsZHMpKQpgYGAKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmVuZF90aW1lIDwtIFN5cy50aW1lKCkKZW5kX3RpbWUgLSBzdGFydF90aW1lCmBgYA==