General
Sucursal
|
Volatilidad SLA
|
Máx SLA
|
Mín SLA
|
Mediana
|
BHI
|
0.1968333
|
0.981
|
0.337
|
0.8090
|
COR
|
0.1284420
|
0.991
|
0.388
|
0.9690
|
RAF
|
0.0163998
|
0.999
|
0.909
|
0.9900
|
RCU
|
0.0851386
|
0.999
|
0.339
|
0.9840
|
RDI
|
0.0375445
|
0.997
|
0.747
|
0.9850
|
ROS
|
0.0855564
|
0.997
|
0.465
|
0.9905
|
SFN
|
0.0589408
|
0.997
|
0.581
|
0.9840
|
VMA
|
0.1146156
|
0.997
|
0.260
|
0.9885
|
ZUL
|
0.0144724
|
0.999
|
0.903
|
0.9930
|
Según los datos de SLA del último trimestre, se observa volatilidad
en los niveles de servicio en Bahía Blanca (BHI),
Córdoba (COR) y Villa María (VMA). Al
ser las sucursales con mayor desvío operativo hace que
el riesgo de incumplimiento sea alto en fechas de alta demanda. Entre
estas tres Sucursales se concentra el 37% de la distribución de Mercado
Libre, COR representa un share de 19%, BHI 12% y VMA 6%
respectivamente.
Por otro lado, estan las sucursales de Azul (ZUL),
Rafaela (RAF) y Sarandí (GBAS) cuyo
nivel de varianza en los niveles de servicio es bajo, por lo que
estan en mejor condición de afrontar eventos de mayor
demanda. Estas sucursales concentran un 24% de participación:
RDI 11%, ZUL 7% y RAF 6%.
Se pasara a un detalle por sucursal de las principales casuísticas de
desvíos a través de los distintos indicadores que hoy acompañan a la
operación para control de los interno del SLA de Meli.

Árboles de Casuística
1. Córdoba (COR)
El Ausentismo es el indicador que mejor explica la variabilidad en el
SLA en COR, para lograr un SLA óptimo del 98% este indicador el
Ausentismo NP no debe superar el 3.3% y Reencaminado debe ser menor al
1.5%. A su vez, Un Ausentismo por encima del punto de corte (20%) deriva
en un SLA promedio de 59%.
1.1. Ranking de Indicadores
1.2. Estimación del árbol
2. Bahía Blanca (BHI)

2.1. Ranking de Indicadores
2.2. Estimación del árbol
3. Villa María (VMA)

3.1. Ranking de Indicadores
3.2. Estimación del árbol
4. Río Cuarto (RCU)

4.1. Ranking de Indicadores
5. Rosario (ROS)

5.1. Ranking de Indicadores
6. Rafaela (RAF)

6.1. Ranking de Indicadores
7. Azul (ZUL)

7.1. Ranking de Indicadores
8. Sarandí (RDI)

8.1. Ranking de Indicadores
8.2. Estimación del árbol
9. Santa Fe (SFN)

9.1. Ranking de Indicadores
9.2. Estimación del árbol
GridSearch
## [,1]
## error_cor 0.06161054
## error_bhi 0.26891462
## error_vma 0.14440632
## error_rcu 0.12776663
## error_ros 0.14954527
## error_raf 0.13876944
## error_zul 0.14139168
## error_rdi 0.13513099
## error_sfn 0.13092494

LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZSBTdWN1cnNhbGVzIE1lbGkiDQphdXRob3I6ICJDdXN0b21lciBJbnRlbGxpZ2VuY2UiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpzZXR3ZCgiQzovVXNlcnMvYW5kZXIvRGVza3RvcCIpDQpgYGANCg0KPGJyPg0KPGJyPg0KDQojIEdlbmVyYWwNCg0KPGJyPg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KdDAgIDwtIFN5cy50aW1lKCkNCmRhdGFzZXQgPC0gcmVhZC5jc3YoImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kL2UvMlBBQ1gtMXZUb0h0TjI3RFlQaFN1NExocl81OHd1MS01WVQ1MjdDQjBGUnR4MXlzTTBUMTh5RlRISEFnRndSWFl4c0VFemNuano3c0prdXdwVGQwSDMvcHViP2dpZD0zMjUxMjM5NzQmc2luZ2xlPXRydWUmb3V0cHV0PWNzdiIpDQp0MSAgPC0gU3lzLnRpbWUoKQ0KZGVsdGEgIDwtIGFzLm51bWVyaWMoICB0MSAtIHQwLCB1bml0cyA9ICJzZWNzIikgICNjYWxjdWxvIGxhIGRpZmVyZW5jaWEgZGUgdGllbXBvcw0KcHJpbnQoZGVsdGEpICNpbXByaW1vDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCg0KbGlicmFyeSggImRhdGEudGFibGUiKSANCmxpYnJhcnkoTUFTUykNCmxpYnJhcnkoImxlYXBzIikgDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KHpvbykNCg0KDQpkZiA8LSBmcmVhZCgiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvZS8yUEFDWC0xdlRvSHROMjdEWVBoU3U0TGhyXzU4d3UxLTVZVDUyN0NCMEZSdHgxeXNNMFQxOHlGVEhIQWdGd1JYWXhzRUV6Y25qejdzSmt1d3BUZDBIMy9wdWI/Z2lkPTMyNTEyMzk3NCZzaW5nbGU9dHJ1ZSZvdXRwdXQ9Y3N2IikNCg0KDQpkZjIgPC0gZGF0YS5mcmFtZSh0KGRmKSkgI1RyYXNwb25lciBEYXRhc2V0DQpjb2xuYW1lcyhkZjIpIDwtIGRmMlsyLF0gI1RvbWFyIGxhIDJkYSBmaWxhIGNvbW8gbm9tYnJlIGRlIGNvbHVtbmFzDQpkZjIgPC0gZGYyWy0xOi0yLF0gI3NhY2FyIDFyYSB5IDJkYSBjb2x1bW5hDQoNCg0KZGYyIDwtIGRmMlsxMTE6bnJvdyhkZjIpLF0gI2ZpbHRyYXIgZGVzZGUgbGEgZmlsYSAxMTEgDQpjb2xuYW1lcyhkZjIpWzFdIDwtICJGZWNoYSIgI2NhbWJpYXIgbm9tYnJlIGRlIDFyYSBjb2x1bW5hDQpjb2xuYW1lcyhkZjIpWzJdIDwtICJuZXdfY29sMiIgI2NhbWJpYXIgbm9tYnJlIGRlIDJkYWNvbHVtbmENCmRmMiA8LSBhcy5kYXRhLnRhYmxlKGRmMikgI2NvbnZlcnRpciBvYmpldG8gZW4gdW4gZGF0YSB0YWJsZQ0KDQoNCg0KZGYyWyAsZmlsdHJhciA6PSBpZmVsc2UgKG5ld19jb2wyICVsaWtlJSAiVG90YWwiLDEsMCldDQpkZjIgPC0gIGRmMltmaWx0cmFyPT0wXQ0KDQojPT1FbGltaW5hciBjb2x1bW5hcyBpbnV0aWxlcz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCg0KZGYyWyAsJzo9JyhuZXdfY29sMiA9IE5VTEwsIEtQSSA9IE5VTEwsICJDSVRBQ0lPTiBUUkFOU1BPUlRJU1RBUyIgPSBOVUxMLCJFUlJPUiBBQlNPTFVUTyBGT1JFQ0FTVCIgPSBOVUxMLCJJU1NVRSBMT0ciID0gTlVMTCxUcm9uY2FsZXMgPSBOVUxMLCAiQ2FpZGFzIHNhcC50bXMgb3Ryb3MuIiA9IE5VTEwsIEdyZW1pb3MgPSBOVUxMLCJDb3J0ZSBsdXosIGludGVybmV0IG90cm9zLiIgPSBOVUxMLERFU1BBQ0hPUyA9IE5VTEwsIiUgVmVoaWN1bG9zIGRlc3BhY2hhZG9zIHBvciBob3JhIj1OVUxMLCBUUk9OQ0FMRVM9TlVMTCwiQ2FudGlkYWQgZGUgdHJvbmNhbGVzIHRvdGFsZXMiPU5VTEwsICIlIFVTTyBQT0QiID0gTlVMTCwgIkhvcmEgZXNwZXJhIHByb21lZGlvIj0gTlVMTCwgIlRvdGFsIHRyb25jYWxlcyBPY2FzYSBjb24gZW52w61vcyBNZWxpIj1OVUxMLCAgICJUcm9uY2FsZXMgT2Nhc2EgZGVtb3JhZG9zIChlbnbDrW9zIE1lbGkpIj1OVUxMLCAiQWRoZXNpw7NuIGEgbGEgcHJvZ3JhbWFjaW9uIj1OVUxMLCAiREVTVklPIENBUEFDSURBRCB2cyBSRUNJQklETyI9TlVMTCwgIkRFU1ZJTyBGT1JFQ0FTVCB2cyBWT0wuIFJFQ0lCSURPIj1OVUxMLCJQUk9CQUJJTElEQUQgREUgRkxPVEEiPU5VTEwsDQoiRVFVSVBPUyBQT1IgUkVDT1JSSURPIj1OVUxMLCJDQVBBQ0lEQUQgQUpVU1RBREEiPU5VTEwsIGBBZGhlc2lDM24gYSBsYSBwcm9ncmFtYWNpb25gPU5VTEwpXSANCg0KDQoNCiM9PUVsaW1pbmFyIHJlZ2lzdHJvcyB2YWNpb3M9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCg0KZGYyIDwtIGRmMlsgLDE6MThdDQpkZjIgPC0gZGYyWyEoU0xBPT0iInxTTEE9PSItIiksXQ0KZGYyIDwtIGRmMltTVUNVUlNBTCE9IiJdDQpkZjIgPC0gZGYyW0ZlY2hhIT0iIl0NCg0KIz09Rm9ybWF0byBkZSBudW1lcm9zPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmRmMlsgLFNMQTo9YXMubnVtZXJpYyhzdHJfYygiMC4iLHN0cl9zdWIoU0xBLDEsMiksc3RyX3N1YihTTEEsNCw1KSkpXQ0KZGYyWyAsJzo9JyggRk9SRUNBU1QgPSBhcy5udW1lcmljKEZPUkVDQVNUKSwNCiAgICAgICAgICAgIENBUEFDSURBRCA9IGFzLm51bWVyaWMoQ0FQQUNJREFEKSwNCiAgICAgICAgICAgYFZPTFVNRU4gUkVDSUJJRE9gPSBhcy5udW1lcmljKGBWT0xVTUVOIFJFQ0lCSURPYCksDQogICAgICAgICAgIGBFTlRSRUdBRE8gRlZgPSBhcy5udW1lcmljKHN0cl9jKCIwLiIsc3RyX3N1YihgRU5UUkVHQURPIEZWYCwxLDIpLHN0cl9zdWIoYEVOVFJFR0FETyBGVmAsNCw1KSkpLCANCiAgICAgICAgICAgIEJBQ0tMT0cgPSBhcy5udW1lcmljKEJBQ0tMT0cpLA0KICAgICAgICAgICAgQ2l0YWRvcz1hcy5udW1lcmljKENpdGFkb3MpLCBgTm8gY2l0YWRvc2A9IGFzLm51bWVyaWMoYE5vIGNpdGFkb3NgKSwgQ29uZmlybWFkb3MgPSBhcy5udW1lcmljKENvbmZpcm1hZG9zKSwNCiAgICAgICAgICAgIEF1c2VudGlzbW8gPSBhcy5udW1lcmljKHN0cl9zdWIoQXVzZW50aXNtbywxLDMpKS8xMDAsDQogICAgICAgICAgIGBBdXNlbnRpc21vIE5QYCA9IGFzLm51bWVyaWMoc3RyX3N1YihgQXVzZW50aXNtbyBOUGAsMSwzKSkvMTAwLA0KICAgICAgICAgICBgUGFyYWRhIE1lZGlhYD0gYXMubnVtZXJpYyhgUGFyYWRhIE1lZGlhYCksDQogICAgICAgICAgIGBIb3JhcyB0cmFiYWphZGFzYD0gYXMubnVtZXJpYyhzdHJfc3ViKGBIb3JhcyB0cmFiYWphZGFzYCwxLDEpKSArIGFzLm51bWVyaWMoc3RyX3N1YihgSG9yYXMgdHJhYmFqYWRhc2AsLTIsLTEpKS82MCwNCiAgICAgICAgICAgYEJ1bHRvcyBwb3IgcGFyYWRhYD0gYXMubnVtZXJpYyhgQnVsdG9zIHBvciBwYXJhZGFgKSwNCiAgICAgICAgICAgYEttIHBvciBwYXJhZGFgPSBhcy5udW1lcmljKGBLbSBwb3IgcGFyYWRhYCksDQogICAgICAgICAgICBSZWVuY2FtaW5hZG89YXMubnVtZXJpYyhzdHJfc3ViKFJlZW5jYW1pbmFkbywxLDMpKS8xMDApXQ0KDQojLS1GZWF0dXJlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KZGYyW2lzLm5hKGRmMildID0gMA0KZGYyWyAsIGRlc3Zpb19jYXBhY2lkYWQgOj0gKGBWT0xVTUVOIFJFQ0lCSURPYC9DQVBBQ0lEQUQpXQ0KZGYyWyAsIGRlc3Zpb19mb3JlY2FzdCA6PSAoYFZPTFVNRU4gUkVDSUJJRE9gL0ZPUkVDQVNUKV0NCmRmMlsgLCBJRCA6PSBpbmRleChkZjIpXQ0KI2RmMlsgLCBWb2x1bWVuX05vX0NpdGFkbyA6PSAoYFZPTFVNRU4gUkVDSUJJRE9gL2BObyBjaXRhZG9zYCldDQojZGYyWyAsIFZvbHVtZW5fUHJlc2VudGVzIDo9IChgVk9MVU1FTiBSRUNJQklET2AvQ29uZmlybWFkb3MpXQ0KI2RmMlsgLCBWb2x1bWVuX1ByZXNlbnRlcyA6PSAoYFZPTFVNRU4gUkVDSUJJRE9gL0NpdGFkb3MpXQ0KI2RmMlsgLCBQcmVzZW50ZXMgOj0gKENpdGFkb3MqQXVzZW50aXNtbyldDQpkZjJbICwgYEhvcmFzIHRyYWJhamFkYXMgdnMgS21gIDo9IChgS20gcG9yIHBhcmFkYWAvYEhvcmFzIHRyYWJhamFkYXNgKV0NCmRmMlsgLCBGZWNoYSA6PSBhcy5EYXRlKChzdHJfYygiMjAyMiIsc3RyX3N1YihGZWNoYSw0LDUpLHN0cl9zdWIoRmVjaGEsMSwyKSkpLCAiJVklbSVkIildDQpkZjJbICwnOj0nKENBUEFDSURBRD1OVUxMLEZPUkVDQVNUPU5VTEwpXQ0KZGYyWyAsJzo9JyhDb25maXJtYWRvcz1OVUxMLCdObyBjaXRhZG9zJz1OVUxMLCBDaXRhZG9zPU5VTEwpXQ0KDQojLS1MYWdzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCmNvbHNfbGFndWVhYmxlcyAgPC0gY29weSggIHNldGRpZmYoIGNvbG5hbWVzKGRmMiksIGMoIkZlY2hhIiwgIlNVQ1VSU0FMIiwiSUQiKSAgKSApDQoNCiNvcmRlbm8gZWwgZGF0YXNldCBwb3IgPG51bWVyb19kZV9jbGllbnRlLCBmb3RvX21lcz4gcGFyYSBwb2RlciBoYWNlciBsYWdzDQojICBlcyBNVVkgIGltcG9ydGFudGUgZXN0YSBsaW5lYQ0Kc2V0b3JkZXIoIGRmMiwgU1VDVVJTQUwsIElEICkNCg0KI2NyZW8gbG9zIGNhbXBvcyBsYWdzIGRlIG9yZGVuIDENCmRmMlsgLCBwYXN0ZTAoIGNvbHNfbGFndWVhYmxlcywgIiAodC0xKSIpIDo9IHNoaWZ0KC5TRCwgMSwgTkEsICJsYWciKSwNCiAgICAgICAgICAgLlNEY29scz0gY29sc19sYWd1ZWFibGVzIF0NCg0KDQojZGYyWywgU0xBX2NsYXNlIDo9IGlmZWxzZShTTEE+PTAuOTcsIlNMQT4wLjk3IiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoU0xBPDAuOTcmU0xBPj0wLjkwLCJTTEE+PTAuOTAiLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoU0xBPDAuOTAsIlNMQTw9MC44OSIsMCkpKV0NCg0KZGYyWywgU0xBX2NsYXNlIDo9IGlmZWxzZShTTEE+PTAuOTcsIkN1bXBsaW1pZW50byAoU0xBIDAuOTcpIiwiSW5jdW1wbGltaWVudG8iKV0NCiNkZjJbLCBTTEFfY2xhc2UgOj0gaWZlbHNlKFNMQT49MC45NywiU0xBPjAuOTciLCAiU0xBPDAuOTciKV0NCmRmMlssIFNMQV9sYWcxOj0gKGBTTEEgKHQtMSlgPU5VTEwpXQ0KDQoNCmRpci5jcmVhdGUoICJDOi9Vc2Vycy9hbmRlci9EZXNrdG9wIiwgIHNob3dXYXJuaW5ncyA9IEZBTFNFICkgDQpkaXIuY3JlYXRlKCAiLi9leHAvRkU3MTUwLyIsIHNob3dXYXJuaW5ncyA9IEZBTFNFICkNCnNldHdkKCJDOi9Vc2Vycy9hbmRlci9EZXNrdG9wIikNCmZ3cml0ZSggZGYyLA0KICAgICAgICAiZGF0YXNldF83MTMwLmNzdiIsDQogICAgICAgIGxvZ2ljYWwwMT0gVFJVRSwNCiAgICAgICAgc2VwPSAiLCIgKQ0KDQphcy5kYXRhLmZyYW1lKGNvbG5hbWVzKGRmMikpDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NX0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShocmJydGhlbWVzKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShwbG90bHkpDQojaW5zdGFsbC5wYWNrYWdlcygia2FibGVFeHRyYSIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCg0KIyBjcmVhdGUgYSBkYXRhc2V0DQpkYXRhIDwtIGFzLmRhdGEuZnJhbWUoZGYyW1NVQ1VSU0FMIT0iTFBHIl0pDQpjb2xuYW1lcyhkYXRhKVsyXTwtICJTdWN1cnNhbCINCg0KdGFiMDE8LSBkYXRhICU+JSBncm91cF9ieShTdWN1cnNhbCkgJT4lIHN1bW1hcmlzZSgnVm9sYXRpbGlkYWQgU0xBJz1zZChTTEEpLCAnTcOheCBTTEEnID0gbWF4KFNMQSksJ03DrW4gU0xBJyA9IG1pbihTTEEpLCBNZWRpYW5hPW1lZGlhbihTTEEpKSAlPiUgYXJyYW5nZShkZXNjKCdWb2xhdGlsaWRhZCBTTEEnKSkNCg0KIyBUYWJsYQ0KDQprYmwodGFiMDEpICU+JQ0KICBrYWJsZV9zdHlsaW5nKA0KICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLA0KICAgIGZ1bGxfd2lkdGggPSBGLA0KICAgIHBvc2l0aW9uID0gImZsb2F0X3JpZ2h0Ig0KICApICU+JQ0KICBjb2x1bW5fc3BlYygxLCBjb2xvciA9ICJibGFjayIsIGJvbGQgPSBUUlVFKSAlPiUNCiAgY29sdW1uX3NwZWMoDQogICAgMiwNCiAgICBjb2xvciA9ICJ3aGl0ZSIsDQogICAgYmFja2dyb3VuZCA9IHNwZWNfY29sb3IoMToxMCwgZW5kID0gMC45LCBvcHRpb24gPSAiMyIsIGRpcmVjdGlvbiA9IDEpLA0KICAgIHBvcG92ZXIgPSBwYXN0ZSh0YWIwMVssIDFdKQ0KICApDQoNCmBgYA0KDQpTZWfDum4gbG9zIGRhdG9zIGRlIFNMQSBkZWwgw7psdGltbyB0cmltZXN0cmUsIHNlIG9ic2VydmEgdm9sYXRpbGlkYWQgZW4gbG9zIG5pdmVsZXMgZGUgc2VydmljaW8gZW4gKipCYWjDrWEgQmxhbmNhIChCSEkpKiosICoqQ8OzcmRvYmEgKENPUikqKiB5ICoqVmlsbGEgTWFyw61hIChWTUEpKiouIEFsIHNlciBsYXMgKipzdWN1cnNhbGVzIGNvbiBtYXlvciBkZXN2w61vIG9wZXJhdGl2byoqIGhhY2UgcXVlIGVsIHJpZXNnbyBkZSBpbmN1bXBsaW1pZW50byBzZWEgYWx0byBlbiBmZWNoYXMgZGUgYWx0YSBkZW1hbmRhLiBFbnRyZSBlc3RhcyB0cmVzIFN1Y3Vyc2FsZXMgc2UgY29uY2VudHJhIGVsIDM3JSBkZSBsYSBkaXN0cmlidWNpw7NuIGRlIE1lcmNhZG8gTGlicmUsIENPUiByZXByZXNlbnRhIHVuIHNoYXJlIGRlIDE5JSwgQkhJIDEyJSB5IFZNQSA2JSByZXNwZWN0aXZhbWVudGUuDQoNClBvciBvdHJvIGxhZG8sIGVzdGFuIGxhcyBzdWN1cnNhbGVzIGRlICoqQXp1bCAoWlVMKSoqLCAqKlJhZmFlbGEgKFJBRikqKiB5ICoqU2FyYW5kw60gKEdCQVMpKiogY3V5byBuaXZlbCBkZSB2YXJpYW56YSBlbiBsb3Mgbml2ZWxlcyBkZSBzZXJ2aWNpbyBlcyBiYWpvLCBwb3IgbG8gcXVlICoqZXN0YW4gZW4gbWVqb3IgY29uZGljacOzbiBkZSBhZnJvbnRhciBldmVudG9zIGRlIG1heW9yIGRlbWFuZGEqKi4gRXN0YXMgc3VjdXJzYWxlcyBjb25jZW50cmFuIHVuIDI0JSBkZSBwYXJ0aWNpcGFjacOzbjogUkRJIDExJSwgWlVMIDclIHkgUkFGIDYlLg0KDQpTZSBwYXNhcmEgYSB1biBkZXRhbGxlIHBvciBzdWN1cnNhbCBkZSBsYXMgcHJpbmNpcGFsZXMgY2FzdcOtc3RpY2FzIGRlIGRlc3bDrW9zIGEgdHJhdsOpcyBkZSBsb3MgZGlzdGludG9zIGluZGljYWRvcmVzIHF1ZSBob3kgYWNvbXBhw7FhbiBhIGxhIG9wZXJhY2nDs24gcGFyYSBjb250cm9sIGRlIGxvcyBpbnRlcm5vIGRlbCBTTEEgZGUgTWVsaS4NCg0KPGJyPiANCjxicj4NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTExLCBmaWcuaGVpZ2h0PTZ9DQojIE11bHRpLWxpbmVhDQoNCmRhdGEgPC0gYXMuZGF0YS5mcmFtZShkZjJbU1VDVVJTQUwhPSJMUEciXSkNCnRtcCA8LSBkYXRhICU+JQ0KICBtdXRhdGUobmFtZTI9U1VDVVJTQUwpDQoNCiAgICBnZ3Bsb3QodG1wLCBhZXMoeD1JRCwgeT1TTEEpKSArDQogICAgZ2VvbV9saW5lKCBkYXRhPXRtcCAlPiUgZHBseXI6OnNlbGVjdCgtU1VDVVJTQUwpLCBhZXMoZ3JvdXA9bmFtZTIpLCBjb2xvcj0iZ3JleSIsIHNpemU9MC43LCBhbHBoYT0wLjUpICsNCiAgICBnZW9tX2xpbmUoIGFlcyhjb2xvciA9IFNVQ1VSU0FMKSwgY29sb3I9ICIjMmNhZjkyIiwgc2l6ZT0xLjAzICkrDQogICAgc2NhbGVfY29sb3JfdmlyaWRpcyhkaXNjcmV0ZSA9IFRSVUUpICsNCiAgICAjdGhlbWVfYncoKSArDQogICAgbGFicyh0aXRsZSA9ICJUcmVuZCBkaWFyaW8gZGVsIFNMQSIsIHN1YnRpdGxlID0gIlBlcmlvZG8gMTggQWdvIC0gNiBEaWMiKSArDQogICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsNCiANCiAgIHhsYWIoICIgVGVuZGVuY2lhIGRpYXJpYSBTTEEiKSsNCiAgIA0KICAgIGZhY2V0X3dyYXAoflNVQ1VSU0FMKQ0KDQpgYGANCg0KPGJyPg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD01LCBpbmNsdWRlPUZBTFNFfQ0KDQpsaWJyYXJ5KGdncmlkZ2VzKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShocmJydGhlbWVzKQ0KDQojIFBsb3QNCmc8LWdncGxvdChkYXRhLCBhZXMoeCA9IFNMQSwgeSA9IFNVQ1VSU0FMLCBmaWxsID0gU0xBKSkgKw0KICBnZW9tX2RlbnNpdHlfcmlkZ2VzX2dyYWRpZW50KHNjYWxlID0gMywgcmVsX21pbl9oZWlnaHQgPSAwLjAwMSkrDQogICBnZ3RpdGxlKCJEaXNwZXJzacOzbiBwb3IgU3VjdXJzYWwgZGVsIFNMQSAoYWdvOm5vdikiKSArDQogICBzY2FsZV9maWxsX3ZpcmlkaXNfYygpICsNCiAgdGhlbWVfaXBzdW0oZ3JpZF9jb2wgPSAiZ3JleSIpICsNCiAgICB0aGVtZSgNCiAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsDQogICAgICBwYW5lbC5zcGFjaW5nID0gdW5pdCgwLjIsICJsaW5lcyIpLA0KICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyKQ0KICAgICkgDQogIA0KZw0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQoNCiNjYXJnbyBsaWJyZXJpYXMNCmxpYnJhcnkoImRhdGEudGFibGUiKQ0KbGlicmFyeSgiUk9DUiIpDQpsaWJyYXJ5KCJycGFydCIpDQpsaWJyYXJ5KCJycGFydC5wbG90IikNCmxpYnJhcnkoImNhcmV0IikNCg0KDQpzdWN1cnNhbCA9IGMoIkNPUiIsIkJISSIsIlZNQSIsIlJPUyIsIlJESSIsIlJDVSIsIlNGTiIsIlJBRiIsICJaVUwiKQ0KDQpjb3IgPC0gZGYyW1NVQ1VSU0FMPT0iQ09SIixdDQpjb3IgPC0gY29yWzI6bnJvdyhjb3IpICwxOm5jb2woY29yKSBdDQpjb3IgPC0gYXMuZGF0YS5mcmFtZShjb3JbICwgJzo9JyAoIElEPU5VTEwsICJTTEFfY2xhc2UiPU5VTEwsIkJBQ0tMT0ciPU5VTEwsICJTTEEgKHQtMSkiPU5VTEwpXSkNCg0KDQpiaGkgPC0gZGYyW1NVQ1VSU0FMPT0iQkhJIixdDQpiaGkgPC0gYmhpWzI6bnJvdyhiaGkpICwxOm5jb2woYmhpKSBdDQpiaGkgPC0gYXMuZGF0YS5mcmFtZShiaGlbICwgJzo9JyAoIElEPU5VTEwsICJTTEFfY2xhc2UiPU5VTEwsIkJBQ0tMT0ciPU5VTEwsICJTTEEgKHQtMSkiPU5VTEwpXSkNCg0KDQp2bWEgPC0gZGYyW1NVQ1VSU0FMPT0iVk1BIixdDQp2bWEgPC0gdm1hWzI6bnJvdyh2bWEpICwxOm5jb2wodm1hKSBdDQp2bWEgPC0gYXMuZGF0YS5mcmFtZSh2bWFbICwgJzo9JyAoSUQ9TlVMTCwgIlNMQV9jbGFzZSI9TlVMTCwiQkFDS0xPRyI9TlVMTCwgIlNMQSAodC0xKSI9TlVMTCldKQ0KDQoNCnJvcyA8LSBkZjJbU1VDVVJTQUw9PSJST1MiLF0NCnJvcyA8LSByb3NbMjpucm93KHJvcykgLDE6bmNvbChyb3MpIF0NCnJvcyA8LSBhcy5kYXRhLmZyYW1lKHJvc1sgLCAnOj0nIChJRD1OVUxMLCAiU0xBX2NsYXNlIj1OVUxMLCJCQUNLTE9HIj1OVUxMLCAiU0xBICh0LTEpIj1OVUxMKV0pDQoNCg0KcmRpIDwtIGRmMltTVUNVUlNBTD09IlJESSIsXQ0KcmRpIDwtIHJkaVsyOm5yb3cocmRpKSAsMTpuY29sKHJkaSkgXQ0KcmRpIDwtIGFzLmRhdGEuZnJhbWUocmRpWyAsICc6PScgKElEPU5VTEwsICJTTEFfY2xhc2UiPU5VTEwsIkJBQ0tMT0ciPU5VTEwsICJTTEEgKHQtMSkiPU5VTEwpXSkNCg0KDQpyY3UgPC0gZGYyW1NVQ1VSU0FMPT0iUkNVIixdDQpyY3UgPC0gcmN1WzI6bnJvdyhyY3UpICwxOm5jb2wocmN1KSBdDQpyY3UgPC0gYXMuZGF0YS5mcmFtZShyY3VbICwgJzo9JyAoSUQ9TlVMTCwgIlNMQV9jbGFzZSI9TlVMTCwiQkFDS0xPRyI9TlVMTCwgIlNMQSAodC0xKSI9TlVMTCldKQ0KDQoNCnNmbiA8LSBkZjJbU1VDVVJTQUw9PSJTRk4iLF0NCnNmbiA8LSBzZm5bMjpucm93KHNmbikgLDE6bmNvbChzZm4pIF0NCnNmbiA8LSBhcy5kYXRhLmZyYW1lKHNmblsgLCAnOj0nIChJRD1OVUxMLCAiU0xBX2NsYXNlIj1OVUxMLCJCQUNLTE9HIj1OVUxMLCAiU0xBICh0LTEpIj1OVUxMKV0pDQoNCg0KcmFmIDwtIGRmMltTVUNVUlNBTD09IlJBRiIsXQ0KcmFmIDwtIHJhZlsyOm5yb3cocmFmKSAsMTpuY29sKHJhZikgXQ0KcmFmIDwtIGFzLmRhdGEuZnJhbWUocmFmWyAsICc6PScgKElEPU5VTEwsICJTTEFfY2xhc2UiPU5VTEwsIkJBQ0tMT0ciPU5VTEwsICJTTEEgKHQtMSkiPU5VTEwpXSkNCg0KDQp6dWwgPC0gZGYyW1NVQ1VSU0FMPT0iWlVMIixdDQp6dWwgPC0genVsWzI6bnJvdyh6dWwpICwxOm5jb2woenVsKSBdDQp6dWwgPC0gYXMuZGF0YS5mcmFtZSh6dWxbICwgJzo9JyAoSUQ9TlVMTCwgIlNMQV9jbGFzZSI9TlVMTCwiQkFDS0xPRyI9TlVMTCwgIlNMQSAodC0xKSI9TlVMTCldKQ0KDQoNCmBgYA0KDQo8YnI+DQoNCjxicj4NCg0KIyDDgXJib2xlcyBkZSBDYXN1w61zdGljYQ0KDQojIyAxLiAgQ8OzcmRvYmEgKENPUikNCg0KPGJyPg0KDQpFbCBBdXNlbnRpc21vIGVzIGVsIGluZGljYWRvciBxdWUgbWVqb3IgZXhwbGljYSBsYSB2YXJpYWJpbGlkYWQgZW4gZWwgU0xBIGVuIENPUiwgcGFyYSBsb2dyYXIgdW4gU0xBIMOzcHRpbW8gZGVsIDk4JSBlc3RlIGluZGljYWRvciBlbCBBdXNlbnRpc21vIE5QIG5vIGRlYmUgc3VwZXJhciBlbCAzLjMlIHkgUmVlbmNhbWluYWRvICBkZWJlIHNlciBtZW5vciBhbCAxLjUlLiBBIHN1IHZleiwgVW4gQXVzZW50aXNtbyBwb3IgZW5jaW1hIGRlbCBwdW50byBkZSBjb3J0ZSAoMjAlKSBkZXJpdmEgZW4gdW4gU0xBIHByb21lZGlvIGRlIDU5JS4gDQoNCjxicj4NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCg0KDQpkYXRhIDwtY29yDQpkYXRhX21vZGVsIDwtIGRhdGFbMzpuY29sKGRhdGEpXQ0KDQptb2RlbG8gICA8LSAgcnBhcnQoICJTTEF+IC4iLCAjcXVpZXJvIHByZWRlY2lyIGNsYXNlX3Rlcm5hcmlhIGEgcGFydGlyIGRlIGVsIHJlc3RvIGRlIGxhcyB2YXJpYWJsZXMNCiAgICAgICAgICAgICBkYXRhID0gZGF0YV9tb2RlbCwgICNsb3MgZGF0b3MgZG9uZGUgdm95IGEgZW50cmVuYXINCiAgICAgICAgICAgICB4dmFsPSAgICAgIDAsDQogICAgICAgICAgICAgY3A9ICAgICAgICAwLCAgICNlc3RvIHNpZ25pZmljYSBubyBsaW1pdGFyIGxhIGNvbXBsZWppZGFkIGRlIGxvcyBzcGxpdHMNCiAgICAgICAgICAgICBtaW5zcGxpdD0gIDQsICAgICAjbWluaW1hIGNhbnRpZGFkIGRlIHJlZ2lzdHJvcyBwYXJhIHF1ZSBzZSBoYWdhIGVsIHNwbGl0DQogICAgICAgICAgICAgbWluYnVja2V0PSA0LCAgICAgI3RhbWHDsW8gbWluaW1vIGRlIHVuYSBob2phDQogICAgICAgICAgICAgbWF4ZGVwdGg9ICA1ICkgICAgI3Byb2Z1bmRpZGFkIG1heGltYSBkZWwgYXJib2wNCg0KDQoNCg0KcHJlZGljY2lvbiA8LSBwcmVkaWN0KG1vZGVsbywgZGF0YSkNCnByZWRpY2Npb24gPC0gYXMuZGF0YS5mcmFtZShwcmVkaWNjaW9uKQ0KcHJlZGljY2lvbiA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKHByZWRpY2Npb24sZGF0YSRGZWNoYSxkYXRhJFNMQSwgKHByZWRpY2Npb24tY29yJFNMQSleMikpDQpjb2xuYW1lcyhwcmVkaWNjaW9uKVsyXSA8LSAiRmVjaGEiDQpjb2xuYW1lcyhwcmVkaWNjaW9uKVszXSA8LSAiU0xBX3JlYWwiDQpjb2xuYW1lcyhwcmVkaWNjaW9uKVs0XSA8LSAiRXJyb3IyIg0KDQplcnJvcl9jb3I8LSBzcXJ0KG1lYW4ocHJlZGljY2lvbiRFcnJvcjIpKQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTUuNX0NCg0KIy0gICBFcnJvciBwcm9tZWRpbzokYHIgc3FydChtZWFuKHByZWRpY2Npb24kRXJyb3IyKSlgJA0KDQpsaWJyYXJ5KHRpYmJsZSkNCmxpYnJhcnkoZ2dwbG90MikNCg0KDQojICBBcmJvbCBnZW5lcmFkbw0KDQpycGFydC5wbG90KG1vZGVsbywgDQogICAgICAgICAgICAgICAgICAgICMgc2hvdyBmaXR0ZWQgY2xhc3MsIHByb2JzLCBwZXJjZW50YWdlcw0KICAgICAgICAgICBib3gucGFsZXR0ZSA9ICJHbkJ1IiwgIyBjb2xvciBzY2hlbWUNCiAgICAgICAgICAgYnJhbmNoLmx0eSA9IDMsICAgICAgICMgZG90dGVkIGJyYW5jaCBsaW5lcw0KICAgICAgICAgICBzaGFkb3cuY29sID0gImdyZXkiLCAgIyBzaGFkb3dzIHVuZGVyIHRoZSBub2RlIGJveGVzDQogICAgICAgICAgIG5uID0gVFJVRSkgICAgICAgICAgICAjIGRpc3BsYXkgdGhlIG5vZGUgbnVtYmVycyANCg0KDQoNCmBgYA0KPGJyPg0KDQojIyMjICoqMS4xLioqIFJhbmtpbmcgZGUgSW5kaWNhZG9yZXMNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LjV9DQojIEltcG9ydGFuY2lhDQppbXBvcnRhbmNpYV9wcmVkIDwtIG1vZGVsbyR2YXJpYWJsZS5pbXBvcnRhbmNlICU+JQ0KICAgICAgICAgICAgICAgICAgICBlbmZyYW1lKG5hbWUgPSAicHJlZGljdG9yIiwgdmFsdWUgPSAiaW1wb3J0YW5jaWEiKQ0KDQojIEdyw6FmaWNvDQpwMjwtIGdncGxvdCgNCiAgZGF0YSA9IGltcG9ydGFuY2lhX3ByZWQsDQogIGFlcyh4ICAgID0gcmVvcmRlcihwcmVkaWN0b3IsIGltcG9ydGFuY2lhKSwNCiAgICAgIHkgICAgPSBpbXBvcnRhbmNpYSwNCiAgICAgIGZpbGwgPSBpbXBvcnRhbmNpYSkNCikgKyAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KZ2VvbV9jb2woKSArDQpjb29yZF9mbGlwKCkgKw0KdGhlbWVfY2xhc3NpYygpICsgDQpsYWJzKHggPSBOVUxMLCB5PSJJbXBvcnRhbmNpYSIpDQoNCg0KZ2dwbG90bHkocDIpDQoNCmBgYA0KDQo8YnI+DQoNCg0KIyMjIyAqKjEuMi4qKiBFc3RpbWFjacOzbiBkZWwgw6FyYm9sDQoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Mi41fQ0KDQojLS1HcmFmaWNvcyBkZSBMaW5lYS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCnBsb3RfbHkoKSAlPiUNCiAgYWRkX2xpbmVzKHggPSB+cHJlZGljY2lvbiRGZWNoYSwgeSA9IH5wcmVkaWNjaW9uJFNMQV9yZWFsLCBuYW1lID0gIlNMQSByZWFsIiwgZmlsbCA9ICd0b3plcm95Jyxjb2xvcj0iOSIpICU+JQ0KICBhZGRfbGluZXMoeCA9IH5wcmVkaWNjaW9uJEZlY2hhLCB5ID0gfnByZWRpY2Npb24kcHJlZGljY2lvbiwgbmFtZSA9ICJTTEEgUHJlZGljdCIsIGZpbGwgPSAndG96ZXJveScsY29sb3I9IjEiKSAlPiUNCiAgbGF5b3V0KHhheGlzID0gbGlzdCh0aXRsZSA9ICdGZWNoYSAoRGlhKScpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJ1NMQScpKQ0KICAgICAgDQoNCmBgYA0KDQoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Mi41fQ0KDQoNCiMtLUdyYWZpY29zIGRlIGRlbnNpZGFkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KU0xBIDwtIHByZWRpY2Npb24kU0xBX3JlYWwNClNMQV9wcmVkaWN0IDwtIHByZWRpY2Npb24kcHJlZGljY2lvbg0KZGVuc2lkYWQuU0xBIDwtIGRlbnNpdHkocHJlZGljY2lvbiRTTEFfcmVhbCwgbmEucm0gPSBUUlVFKQ0KZGVuc2lkYWQuU0xBX3ByZWRpY3Q8LSBkZW5zaXR5KHByZWRpY2Npb24kcHJlZGljY2lvbiwgbmEucm0gPSBUUlVFKQ0KDQoNCnBsb3RfbHkoKSAlPiUNCiAgYWRkX2xpbmVzKHggPSB+ZGVuc2lkYWQuU0xBJHgsIHkgPSB+ZGVuc2lkYWQuU0xBJHksIG5hbWUgPSAiU0xBIHJlYWwiLCBmaWxsID0gJ3RvemVyb3knLGNvbG9yPSI5IikgJT4lDQogIGFkZF9saW5lcyh4ID0gfmRlbnNpZGFkLlNMQV9wcmVkaWN0JHgsIHkgPSB+ZGVuc2lkYWQuU0xBX3ByZWRpY3QkeSwgbmFtZSA9ICJTTEEgUHJlZGljdCIsIGZpbGwgPSAndG96ZXJveScsY29sb3I9IjEiKSU+JQ0KICBsYXlvdXQoeGF4aXMgPSBsaXN0KHRpdGxlID0gJ1NMQScpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJ0RlbnNpZGFkJykpDQoNCmBgYA0KPGJyPg0KPGJyPg0KDQoNCg0KDQoNCiMjIDIuIEJhaMOtYSBCbGFuY2EgKEJISSkNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCg0KDQpkYXRhIDwtYmhpDQpkYXRhX21vZGVsIDwtIGRhdGFbMzpuY29sKGRhdGEpXQ0KDQptb2RlbG8gICA8LSAgcnBhcnQoICJTTEF+IC4iLCAjcXVpZXJvIHByZWRlY2lyIGNsYXNlX3Rlcm5hcmlhIGEgcGFydGlyIGRlIGVsIHJlc3RvIGRlIGxhcyB2YXJpYWJsZXMNCiAgICAgICAgICAgICBkYXRhID0gZGF0YV9tb2RlbCwgICNsb3MgZGF0b3MgZG9uZGUgdm95IGEgZW50cmVuYXINCiAgICAgICAgICAgICB4dmFsPSAgICAgIDAsDQogICAgICAgICAgICAgY3A9ICAgICAgICAwLCAgICNlc3RvIHNpZ25pZmljYSBubyBsaW1pdGFyIGxhIGNvbXBsZWppZGFkIGRlIGxvcyBzcGxpdHMNCiAgICAgICAgICAgICBtaW5zcGxpdD0gIDQsICAgICAjbWluaW1hIGNhbnRpZGFkIGRlIHJlZ2lzdHJvcyBwYXJhIHF1ZSBzZSBoYWdhIGVsIHNwbGl0DQogICAgICAgICAgICAgbWluYnVja2V0PSA0LCAgICAgI3RhbWHDsW8gbWluaW1vIGRlIHVuYSBob2phDQogICAgICAgICAgICAgbWF4ZGVwdGg9ICA2ICkgICAgI3Byb2Z1bmRpZGFkIG1heGltYSBkZWwgYXJib2wNCg0KDQoNCg0KcHJlZGljY2lvbiA8LSBwcmVkaWN0KG1vZGVsbywgZGF0YSkNCnByZWRpY2Npb24gPC0gYXMuZGF0YS5mcmFtZShwcmVkaWNjaW9uKQ0KcHJlZGljY2lvbiA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKHByZWRpY2Npb24sZGF0YSRGZWNoYSxkYXRhJFNMQSwgKHByZWRpY2Npb24tY29yJFNMQSleMikpDQpjb2xuYW1lcyhwcmVkaWNjaW9uKVsyXSA8LSAiRmVjaGEiDQpjb2xuYW1lcyhwcmVkaWNjaW9uKVszXSA8LSAiU0xBX3JlYWwiDQpjb2xuYW1lcyhwcmVkaWNjaW9uKVs0XSA8LSAiRXJyb3IyIg0KDQplcnJvcl9iaGk8LSBzcXJ0KG1lYW4ocHJlZGljY2lvbiRFcnJvcjIpKQ0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NS41fQ0KDQojLSAgIEVycm9yIHByb21lZGlvOiRgciBzcXJ0KG1lYW4ocHJlZGljY2lvbiRFcnJvcjIpKWAkDQoNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQoNCiMgIEFyYm9sIGdlbmVyYWRvDQoNCnJwYXJ0LnBsb3QobW9kZWxvLCANCiAgICAgICAgICAgICAgICAgICAgIyBzaG93IGZpdHRlZCBjbGFzcywgcHJvYnMsIHBlcmNlbnRhZ2VzDQogICAgICAgICAgIGJveC5wYWxldHRlID0gIkduQnUiLCAjIGNvbG9yIHNjaGVtZQ0KICAgICAgICAgICBicmFuY2gubHR5ID0gMywgICAgICAgIyBkb3R0ZWQgYnJhbmNoIGxpbmVzDQogICAgICAgICAgIHNoYWRvdy5jb2wgPSAiZ3JleSIsICAjIHNoYWRvd3MgdW5kZXIgdGhlIG5vZGUgYm94ZXMNCiAgICAgICAgICAgbm4gPSBUUlVFKSAgICAgICAgICAgICMgZGlzcGxheSB0aGUgbm9kZSBudW1iZXJzIA0KDQoNCg0KYGBgDQoNCg0KIyMjIyAqKjIuMS4qKiBSYW5raW5nIGRlIEluZGljYWRvcmVzDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NC41fQ0KIyBJbXBvcnRhbmNpYQ0KaW1wb3J0YW5jaWFfcHJlZCA8LSBtb2RlbG8kdmFyaWFibGUuaW1wb3J0YW5jZSAlPiUNCiAgICAgICAgICAgICAgICAgICAgZW5mcmFtZShuYW1lID0gInByZWRpY3RvciIsIHZhbHVlID0gImltcG9ydGFuY2lhIikNCg0KIyBHcsOhZmljbw0KcDI8LSBnZ3Bsb3QoDQogIGRhdGEgPSBpbXBvcnRhbmNpYV9wcmVkLA0KICBhZXMoeCAgICA9IHJlb3JkZXIocHJlZGljdG9yLCBpbXBvcnRhbmNpYSksDQogICAgICB5ICAgID0gaW1wb3J0YW5jaWEsDQogICAgICBmaWxsID0gaW1wb3J0YW5jaWEpDQopICsgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsNCmdlb21fY29sKCkgKw0KY29vcmRfZmxpcCgpICsNCnRoZW1lX2NsYXNzaWMoKSArIA0KbGFicyh4ID0gTlVMTCwgeT0iSW1wb3J0YW5jaWEiKQ0KDQoNCmdncGxvdGx5KHAyKQ0KDQpgYGANCg0KPGJyPg0KDQoNCiMjIyMgKioyLjIuKiogRXN0aW1hY2nDs24gZGVsIMOhcmJvbA0KDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTIuNX0NCg0KIy0tR3JhZmljb3MgZGUgTGluZWEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpwbG90X2x5KCkgJT4lDQogIGFkZF9saW5lcyh4ID0gfnByZWRpY2Npb24kRmVjaGEsIHkgPSB+cHJlZGljY2lvbiRTTEFfcmVhbCwgbmFtZSA9ICJTTEEgcmVhbCIsIGZpbGwgPSAndG96ZXJveScsY29sb3I9IjkiKSAlPiUNCiAgYWRkX2xpbmVzKHggPSB+cHJlZGljY2lvbiRGZWNoYSwgeSA9IH5wcmVkaWNjaW9uJHByZWRpY2Npb24sIG5hbWUgPSAiU0xBIFByZWRpY3QiLCBmaWxsID0gJ3RvemVyb3knLGNvbG9yPSIxIikgJT4lDQogIGxheW91dCh4YXhpcyA9IGxpc3QodGl0bGUgPSAnRmVjaGEgKERpYSknKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdTTEEnKSkNCiAgICAgIA0KDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTIuNX0NCg0KDQojLS1HcmFmaWNvcyBkZSBkZW5zaWRhZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClNMQSA8LSBwcmVkaWNjaW9uJFNMQV9yZWFsDQpTTEFfcHJlZGljdCA8LSBwcmVkaWNjaW9uJHByZWRpY2Npb24NCmRlbnNpZGFkLlNMQSA8LSBkZW5zaXR5KHByZWRpY2Npb24kU0xBX3JlYWwsIG5hLnJtID0gVFJVRSkNCmRlbnNpZGFkLlNMQV9wcmVkaWN0PC0gZGVuc2l0eShwcmVkaWNjaW9uJHByZWRpY2Npb24sIG5hLnJtID0gVFJVRSkNCg0KDQpwbG90X2x5KCkgJT4lDQogIGFkZF9saW5lcyh4ID0gfmRlbnNpZGFkLlNMQSR4LCB5ID0gfmRlbnNpZGFkLlNMQSR5LCBuYW1lID0gIlNMQSByZWFsIiwgZmlsbCA9ICd0b3plcm95Jyxjb2xvcj0iOSIpICU+JQ0KICBhZGRfbGluZXMoeCA9IH5kZW5zaWRhZC5TTEFfcHJlZGljdCR4LCB5ID0gfmRlbnNpZGFkLlNMQV9wcmVkaWN0JHksIG5hbWUgPSAiU0xBIFByZWRpY3QiLCBmaWxsID0gJ3RvemVyb3knLGNvbG9yPSIxIiklPiUNCiAgbGF5b3V0KHhheGlzID0gbGlzdCh0aXRsZSA9ICdTTEEnKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdEZW5zaWRhZCcpKQ0KDQpgYGANCg0KPGJyPg0KPGJyPg0KDQojIyAzLiBWaWxsYSBNYXLDrWEgKFZNQSkNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCg0KDQpkYXRhIDwtdm1hDQpkYXRhX21vZGVsIDwtIGRhdGFbMzpuY29sKGRhdGEpXQ0KDQptb2RlbG8gICA8LSAgcnBhcnQoICJTTEF+IC4iLCAjcXVpZXJvIHByZWRlY2lyIGNsYXNlX3Rlcm5hcmlhIGEgcGFydGlyIGRlIGVsIHJlc3RvIGRlIGxhcyB2YXJpYWJsZXMNCiAgICAgICAgICAgICBkYXRhID0gZGF0YV9tb2RlbCwgICNsb3MgZGF0b3MgZG9uZGUgdm95IGEgZW50cmVuYXINCiAgICAgICAgICAgICB4dmFsPSAgICAgIDAsDQogICAgICAgICAgICAgY3A9ICAgICAgICAwLCAgICNlc3RvIHNpZ25pZmljYSBubyBsaW1pdGFyIGxhIGNvbXBsZWppZGFkIGRlIGxvcyBzcGxpdHMNCiAgICAgICAgICAgICBtaW5zcGxpdD0gIDQsICAgICAjbWluaW1hIGNhbnRpZGFkIGRlIHJlZ2lzdHJvcyBwYXJhIHF1ZSBzZSBoYWdhIGVsIHNwbGl0DQogICAgICAgICAgICAgbWluYnVja2V0PSA0LCAgICAgI3RhbWHDsW8gbWluaW1vIGRlIHVuYSBob2phDQogICAgICAgICAgICAgbWF4ZGVwdGg9ICA1ICkgICAgI3Byb2Z1bmRpZGFkIG1heGltYSBkZWwgYXJib2wNCg0KDQoNCg0KcHJlZGljY2lvbiA8LSBwcmVkaWN0KG1vZGVsbywgZGF0YSkNCnByZWRpY2Npb24gPC0gYXMuZGF0YS5mcmFtZShwcmVkaWNjaW9uKQ0KcHJlZGljY2lvbiA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKHByZWRpY2Npb24sZGF0YSRGZWNoYSxkYXRhJFNMQSwgKHByZWRpY2Npb24tY29yJFNMQSleMikpDQpjb2xuYW1lcyhwcmVkaWNjaW9uKVsyXSA8LSAiRmVjaGEiDQpjb2xuYW1lcyhwcmVkaWNjaW9uKVszXSA8LSAiU0xBX3JlYWwiDQpjb2xuYW1lcyhwcmVkaWNjaW9uKVs0XSA8LSAiRXJyb3IyIg0KDQplcnJvcl92bWE8LSBzcXJ0KG1lYW4ocHJlZGljY2lvbiRFcnJvcjIpKQ0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NS41fQ0KDQojLSAgIEVycm9yIHByb21lZGlvOiRgciBzcXJ0KG1lYW4ocHJlZGljY2lvbiRFcnJvcjIpKWAkDQoNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQoNCiMgIEFyYm9sIGdlbmVyYWRvDQoNCnJwYXJ0LnBsb3QobW9kZWxvLCANCiAgICAgICAgICAgICAgICAgICAgIyBzaG93IGZpdHRlZCBjbGFzcywgcHJvYnMsIHBlcmNlbnRhZ2VzDQogICAgICAgICAgIGJveC5wYWxldHRlID0gIkduQnUiLCAjIGNvbG9yIHNjaGVtZQ0KICAgICAgICAgICBicmFuY2gubHR5ID0gMywgICAgICAgIyBkb3R0ZWQgYnJhbmNoIGxpbmVzDQogICAgICAgICAgIHNoYWRvdy5jb2wgPSAiZ3JleSIsICAjIHNoYWRvd3MgdW5kZXIgdGhlIG5vZGUgYm94ZXMNCiAgICAgICAgICAgbm4gPSBUUlVFKSAgICAgICAgICAgICMgZGlzcGxheSB0aGUgbm9kZSBudW1iZXJzIA0KDQoNCg0KYGBgDQoNCg0KIyMjIyAqKjMuMS4qKiBSYW5raW5nIGRlIEluZGljYWRvcmVzDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NC41fQ0KIyBJbXBvcnRhbmNpYQ0KaW1wb3J0YW5jaWFfcHJlZCA8LSBtb2RlbG8kdmFyaWFibGUuaW1wb3J0YW5jZSAlPiUNCiAgICAgICAgICAgICAgICAgICAgZW5mcmFtZShuYW1lID0gInByZWRpY3RvciIsIHZhbHVlID0gImltcG9ydGFuY2lhIikNCg0KIyBHcsOhZmljbw0KcDI8LSBnZ3Bsb3QoDQogIGRhdGEgPSBpbXBvcnRhbmNpYV9wcmVkLA0KICBhZXMoeCAgICA9IHJlb3JkZXIocHJlZGljdG9yLCBpbXBvcnRhbmNpYSksDQogICAgICB5ICAgID0gaW1wb3J0YW5jaWEsDQogICAgICBmaWxsID0gaW1wb3J0YW5jaWEpDQopICsgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsNCmdlb21fY29sKCkgKw0KY29vcmRfZmxpcCgpICsNCnRoZW1lX2NsYXNzaWMoKSArIA0KbGFicyh4ID0gTlVMTCwgeT0iSW1wb3J0YW5jaWEiKQ0KDQoNCmdncGxvdGx5KHAyKQ0KDQpgYGANCg0KPGJyPg0KDQoNCiMjIyMgKiozLjIuKiogIEVzdGltYWNpw7NuIGRlbCDDoXJib2wNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Mi41fQ0KDQojLS1HcmFmaWNvcyBkZSBMaW5lYS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCnBsb3RfbHkoKSAlPiUNCiAgYWRkX2xpbmVzKHggPSB+cHJlZGljY2lvbiRGZWNoYSwgeSA9IH5wcmVkaWNjaW9uJFNMQV9yZWFsLCBuYW1lID0gIlNMQSByZWFsIiwgZmlsbCA9ICd0b3plcm95Jyxjb2xvcj0iOSIpICU+JQ0KICBhZGRfbGluZXMoeCA9IH5wcmVkaWNjaW9uJEZlY2hhLCB5ID0gfnByZWRpY2Npb24kcHJlZGljY2lvbiwgbmFtZSA9ICJTTEEgUHJlZGljdCIsIGZpbGwgPSAndG96ZXJveScsY29sb3I9IjEiKSAlPiUNCiAgbGF5b3V0KHhheGlzID0gbGlzdCh0aXRsZSA9ICdGZWNoYSAoRGlhKScpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJ1NMQScpKQ0KICAgICAgDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Mi41fQ0KDQoNCiMtLUdyYWZpY29zIGRlIGRlbnNpZGFkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KU0xBIDwtIHByZWRpY2Npb24kU0xBX3JlYWwNClNMQV9wcmVkaWN0IDwtIHByZWRpY2Npb24kcHJlZGljY2lvbg0KZGVuc2lkYWQuU0xBIDwtIGRlbnNpdHkocHJlZGljY2lvbiRTTEFfcmVhbCwgbmEucm0gPSBUUlVFKQ0KZGVuc2lkYWQuU0xBX3ByZWRpY3Q8LSBkZW5zaXR5KHByZWRpY2Npb24kcHJlZGljY2lvbiwgbmEucm0gPSBUUlVFKQ0KDQoNCnBsb3RfbHkoKSAlPiUNCiAgYWRkX2xpbmVzKHggPSB+ZGVuc2lkYWQuU0xBJHgsIHkgPSB+ZGVuc2lkYWQuU0xBJHksIG5hbWUgPSAiU0xBIHJlYWwiLCBmaWxsID0gJ3RvemVyb3knLGNvbG9yPSI5IikgJT4lDQogIGFkZF9saW5lcyh4ID0gfmRlbnNpZGFkLlNMQV9wcmVkaWN0JHgsIHkgPSB+ZGVuc2lkYWQuU0xBX3ByZWRpY3QkeSwgbmFtZSA9ICJTTEEgUHJlZGljdCIsIGZpbGwgPSAndG96ZXJveScsY29sb3I9IjEiKSU+JQ0KICBsYXlvdXQoeGF4aXMgPSBsaXN0KHRpdGxlID0gJ1NMQScpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJ0RlbnNpZGFkJykpDQoNCmBgYA0KDQo8YnI+DQo8YnI+DQoNCiMjIDQuIFLDrW8gQ3VhcnRvIChSQ1UpDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQoNCg0KZGF0YSA8LXJjdQ0KZGF0YV9tb2RlbCA8LSBkYXRhWzM6bmNvbChkYXRhKV0NCg0KbW9kZWxvICAgPC0gIHJwYXJ0KCAiU0xBfiAuIiwgI3F1aWVybyBwcmVkZWNpciBjbGFzZV90ZXJuYXJpYSBhIHBhcnRpciBkZSBlbCByZXN0byBkZSBsYXMgdmFyaWFibGVzDQogICAgICAgICAgICAgZGF0YSA9IGRhdGFfbW9kZWwsICAjbG9zIGRhdG9zIGRvbmRlIHZveSBhIGVudHJlbmFyDQogICAgICAgICAgICAgeHZhbD0gICAgICAwLA0KICAgICAgICAgICAgIGNwPSAgICAgICAgMCwgICAjZXN0byBzaWduaWZpY2Egbm8gbGltaXRhciBsYSBjb21wbGVqaWRhZCBkZSBsb3Mgc3BsaXRzDQogICAgICAgICAgICAgbWluc3BsaXQ9ICA0LCAgICAgI21pbmltYSBjYW50aWRhZCBkZSByZWdpc3Ryb3MgcGFyYSBxdWUgc2UgaGFnYSBlbCBzcGxpdA0KICAgICAgICAgICAgIG1pbmJ1Y2tldD0gNCwgICAgICN0YW1hw7FvIG1pbmltbyBkZSB1bmEgaG9qYQ0KICAgICAgICAgICAgIG1heGRlcHRoPSAgNSApICAgICNwcm9mdW5kaWRhZCBtYXhpbWEgZGVsIGFyYm9sDQoNCg0KDQoNCnByZWRpY2Npb24gPC0gcHJlZGljdChtb2RlbG8sIGRhdGEpDQpwcmVkaWNjaW9uIDwtIGFzLmRhdGEuZnJhbWUocHJlZGljY2lvbikNCnByZWRpY2Npb24gPC0gYXMuZGF0YS5mcmFtZShjYmluZChwcmVkaWNjaW9uLGRhdGEkRmVjaGEsZGF0YSRTTEEsIChwcmVkaWNjaW9uLWNvciRTTEEpXjIpKQ0KY29sbmFtZXMocHJlZGljY2lvbilbMl0gPC0gIkZlY2hhIg0KY29sbmFtZXMocHJlZGljY2lvbilbM10gPC0gIlNMQV9yZWFsIg0KY29sbmFtZXMocHJlZGljY2lvbilbNF0gPC0gIkVycm9yMiINCg0KZXJyb3JfcmN1PC0gc3FydChtZWFuKHByZWRpY2Npb24kRXJyb3IyKSkNCg0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTUuNX0NCg0KIy0gICBFcnJvciBwcm9tZWRpbzokYHIgc3FydChtZWFuKHByZWRpY2Npb24kRXJyb3IyKSlgJA0KDQpsaWJyYXJ5KHRpYmJsZSkNCmxpYnJhcnkoZ2dwbG90MikNCg0KDQojICBBcmJvbCBnZW5lcmFkbw0KDQpycGFydC5wbG90KG1vZGVsbywgDQogICAgICAgICAgICAgICAgICAgICMgc2hvdyBmaXR0ZWQgY2xhc3MsIHByb2JzLCBwZXJjZW50YWdlcw0KICAgICAgICAgICBib3gucGFsZXR0ZSA9ICJHbkJ1IiwgIyBjb2xvciBzY2hlbWUNCiAgICAgICAgICAgYnJhbmNoLmx0eSA9IDMsICAgICAgICMgZG90dGVkIGJyYW5jaCBsaW5lcw0KICAgICAgICAgICBzaGFkb3cuY29sID0gImdyZXkiLCAgIyBzaGFkb3dzIHVuZGVyIHRoZSBub2RlIGJveGVzDQogICAgICAgICAgIG5uID0gVFJVRSkgICAgICAgICAgICAjIGRpc3BsYXkgdGhlIG5vZGUgbnVtYmVycyANCg0KDQoNCmBgYA0KDQoNCiMjIyMgKio0LjEuKiogUmFua2luZyBkZSBJbmRpY2Fkb3Jlcw0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQuNX0NCiMgSW1wb3J0YW5jaWENCmltcG9ydGFuY2lhX3ByZWQgPC0gbW9kZWxvJHZhcmlhYmxlLmltcG9ydGFuY2UgJT4lDQogICAgICAgICAgICAgICAgICAgIGVuZnJhbWUobmFtZSA9ICJwcmVkaWN0b3IiLCB2YWx1ZSA9ICJpbXBvcnRhbmNpYSIpDQoNCiMgR3LDoWZpY28NCnAyPC0gZ2dwbG90KA0KICBkYXRhID0gaW1wb3J0YW5jaWFfcHJlZCwNCiAgYWVzKHggICAgPSByZW9yZGVyKHByZWRpY3RvciwgaW1wb3J0YW5jaWEpLA0KICAgICAgeSAgICA9IGltcG9ydGFuY2lhLA0KICAgICAgZmlsbCA9IGltcG9ydGFuY2lhKQ0KKSArICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrDQpnZW9tX2NvbCgpICsNCmNvb3JkX2ZsaXAoKSArDQp0aGVtZV9jbGFzc2ljKCkgKyANCmxhYnMoeCA9IE5VTEwsIHk9IkltcG9ydGFuY2lhIikNCg0KDQpnZ3Bsb3RseShwMikNCg0KYGBgDQoNCjxicj4NCg0KDQojIyMjICoqNC4yLioqRXN0aW1hY2nDs24gZGVsIMOhcmJvbA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0yLjV9DQoNCiMtLUdyYWZpY29zIGRlIExpbmVhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KcGxvdF9seSgpICU+JQ0KICBhZGRfbGluZXMoeCA9IH5wcmVkaWNjaW9uJEZlY2hhLCB5ID0gfnByZWRpY2Npb24kU0xBX3JlYWwsIG5hbWUgPSAiU0xBIHJlYWwiLCBmaWxsID0gJ3RvemVyb3knLGNvbG9yPSI5IikgJT4lDQogIGFkZF9saW5lcyh4ID0gfnByZWRpY2Npb24kRmVjaGEsIHkgPSB+cHJlZGljY2lvbiRwcmVkaWNjaW9uLCBuYW1lID0gIlNMQSBQcmVkaWN0IiwgZmlsbCA9ICd0b3plcm95Jyxjb2xvcj0iMSIpICU+JQ0KICBsYXlvdXQoeGF4aXMgPSBsaXN0KHRpdGxlID0gJ0ZlY2hhIChEaWEpJyksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnU0xBJykpDQogICAgICANCg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0yLjV9DQoNCg0KIy0tR3JhZmljb3MgZGUgZGVuc2lkYWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpTTEEgPC0gcHJlZGljY2lvbiRTTEFfcmVhbA0KU0xBX3ByZWRpY3QgPC0gcHJlZGljY2lvbiRwcmVkaWNjaW9uDQpkZW5zaWRhZC5TTEEgPC0gZGVuc2l0eShwcmVkaWNjaW9uJFNMQV9yZWFsLCBuYS5ybSA9IFRSVUUpDQpkZW5zaWRhZC5TTEFfcHJlZGljdDwtIGRlbnNpdHkocHJlZGljY2lvbiRwcmVkaWNjaW9uLCBuYS5ybSA9IFRSVUUpDQoNCg0KcGxvdF9seSgpICU+JQ0KICBhZGRfbGluZXMoeCA9IH5kZW5zaWRhZC5TTEEkeCwgeSA9IH5kZW5zaWRhZC5TTEEkeSwgbmFtZSA9ICJTTEEgcmVhbCIsIGZpbGwgPSAndG96ZXJveScsY29sb3I9IjkiKSAlPiUNCiAgYWRkX2xpbmVzKHggPSB+ZGVuc2lkYWQuU0xBX3ByZWRpY3QkeCwgeSA9IH5kZW5zaWRhZC5TTEFfcHJlZGljdCR5LCBuYW1lID0gIlNMQSBQcmVkaWN0IiwgZmlsbCA9ICd0b3plcm95Jyxjb2xvcj0iMSIpJT4lDQogIGxheW91dCh4YXhpcyA9IGxpc3QodGl0bGUgPSAnU0xBJyksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnRGVuc2lkYWQnKSkNCg0KYGBgDQoNCjxicj4NCjxicj4NCg0KIyMgNS4gUm9zYXJpbyAoUk9TKQ0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KDQoNCmRhdGEgPC1yb3MNCmRhdGFfbW9kZWwgPC0gZGF0YVszOm5jb2woZGF0YSldDQoNCm1vZGVsbyAgIDwtICBycGFydCggIlNMQX4gLiIsICNxdWllcm8gcHJlZGVjaXIgY2xhc2VfdGVybmFyaWEgYSBwYXJ0aXIgZGUgZWwgcmVzdG8gZGUgbGFzIHZhcmlhYmxlcw0KICAgICAgICAgICAgIGRhdGEgPSBkYXRhX21vZGVsLCAgI2xvcyBkYXRvcyBkb25kZSB2b3kgYSBlbnRyZW5hcg0KICAgICAgICAgICAgIHh2YWw9ICAgICAgMCwNCiAgICAgICAgICAgICBjcD0gICAgICAgIDAsICAgI2VzdG8gc2lnbmlmaWNhIG5vIGxpbWl0YXIgbGEgY29tcGxlamlkYWQgZGUgbG9zIHNwbGl0cw0KICAgICAgICAgICAgIG1pbnNwbGl0PSAgNCwgICAgICNtaW5pbWEgY2FudGlkYWQgZGUgcmVnaXN0cm9zIHBhcmEgcXVlIHNlIGhhZ2EgZWwgc3BsaXQNCiAgICAgICAgICAgICBtaW5idWNrZXQ9IDQsICAgICAjdGFtYcOxbyBtaW5pbW8gZGUgdW5hIGhvamENCiAgICAgICAgICAgICBtYXhkZXB0aD0gIDQgKSAgICAjcHJvZnVuZGlkYWQgbWF4aW1hIGRlbCBhcmJvbA0KDQoNCg0KDQpwcmVkaWNjaW9uIDwtIHByZWRpY3QobW9kZWxvLCBkYXRhKQ0KcHJlZGljY2lvbiA8LSBhcy5kYXRhLmZyYW1lKHByZWRpY2Npb24pDQpwcmVkaWNjaW9uIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQocHJlZGljY2lvbixkYXRhJEZlY2hhLGRhdGEkU0xBLCAocHJlZGljY2lvbi1jb3IkU0xBKV4yKSkNCmNvbG5hbWVzKHByZWRpY2Npb24pWzJdIDwtICJGZWNoYSINCmNvbG5hbWVzKHByZWRpY2Npb24pWzNdIDwtICJTTEFfcmVhbCINCmNvbG5hbWVzKHByZWRpY2Npb24pWzRdIDwtICJFcnJvcjIiDQoNCmVycm9yX3JvczwtIHNxcnQobWVhbihwcmVkaWNjaW9uJEVycm9yMikpDQoNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD01LjV9DQoNCiMtICAgRXJyb3IgcHJvbWVkaW86JGByIHNxcnQobWVhbihwcmVkaWNjaW9uJEVycm9yMikpYCQNCg0KbGlicmFyeSh0aWJibGUpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCg0KIyAgQXJib2wgZ2VuZXJhZG8NCg0KcnBhcnQucGxvdChtb2RlbG8sIA0KICAgICAgICAgICAgICAgICAgICAjIHNob3cgZml0dGVkIGNsYXNzLCBwcm9icywgcGVyY2VudGFnZXMNCiAgICAgICAgICAgYm94LnBhbGV0dGUgPSAiR25CdSIsICMgY29sb3Igc2NoZW1lDQogICAgICAgICAgIGJyYW5jaC5sdHkgPSAzLCAgICAgICAjIGRvdHRlZCBicmFuY2ggbGluZXMNCiAgICAgICAgICAgc2hhZG93LmNvbCA9ICJncmV5IiwgICMgc2hhZG93cyB1bmRlciB0aGUgbm9kZSBib3hlcw0KICAgICAgICAgICBubiA9IFRSVUUpICAgICAgICAgICAgIyBkaXNwbGF5IHRoZSBub2RlIG51bWJlcnMgDQoNCg0KDQpgYGANCg0KDQojIyMjICoqNS4xLioqIFJhbmtpbmcgZGUgSW5kaWNhZG9yZXMNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LjV9DQojIEltcG9ydGFuY2lhDQppbXBvcnRhbmNpYV9wcmVkIDwtIG1vZGVsbyR2YXJpYWJsZS5pbXBvcnRhbmNlICU+JQ0KICAgICAgICAgICAgICAgICAgICBlbmZyYW1lKG5hbWUgPSAicHJlZGljdG9yIiwgdmFsdWUgPSAiaW1wb3J0YW5jaWEiKQ0KDQojIEdyw6FmaWNvDQpwMjwtIGdncGxvdCgNCiAgZGF0YSA9IGltcG9ydGFuY2lhX3ByZWQsDQogIGFlcyh4ICAgID0gcmVvcmRlcihwcmVkaWN0b3IsIGltcG9ydGFuY2lhKSwNCiAgICAgIHkgICAgPSBpbXBvcnRhbmNpYSwNCiAgICAgIGZpbGwgPSBpbXBvcnRhbmNpYSkNCikgKyAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KZ2VvbV9jb2woKSArDQpjb29yZF9mbGlwKCkgKw0KdGhlbWVfY2xhc3NpYygpICsgDQpsYWJzKHggPSBOVUxMLCB5PSJJbXBvcnRhbmNpYSIpDQoNCg0KZ2dwbG90bHkocDIpDQoNCmBgYA0KDQo8YnI+DQoNCg0KIyMjIyAqKjUuMi4qKkVzdGltYWNpw7NuIGRlbCDDoXJib2wNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Mi41fQ0KDQojLS1HcmFmaWNvcyBkZSBMaW5lYS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCnBsb3RfbHkoKSAlPiUNCiAgYWRkX2xpbmVzKHggPSB+cHJlZGljY2lvbiRGZWNoYSwgeSA9IH5wcmVkaWNjaW9uJFNMQV9yZWFsLCBuYW1lID0gIlNMQSByZWFsIiwgZmlsbCA9ICd0b3plcm95Jyxjb2xvcj0iOSIpICU+JQ0KICBhZGRfbGluZXMoeCA9IH5wcmVkaWNjaW9uJEZlY2hhLCB5ID0gfnByZWRpY2Npb24kcHJlZGljY2lvbiwgbmFtZSA9ICJTTEEgUHJlZGljdCIsIGZpbGwgPSAndG96ZXJveScsY29sb3I9IjEiKSAlPiUNCiAgbGF5b3V0KHhheGlzID0gbGlzdCh0aXRsZSA9ICdGZWNoYSAoRGlhKScpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJ1NMQScpKQ0KICAgICAgDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9Mi41fQ0KDQoNCiMtLUdyYWZpY29zIGRlIGRlbnNpZGFkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KU0xBIDwtIHByZWRpY2Npb24kU0xBX3JlYWwNClNMQV9wcmVkaWN0IDwtIHByZWRpY2Npb24kcHJlZGljY2lvbg0KZGVuc2lkYWQuU0xBIDwtIGRlbnNpdHkocHJlZGljY2lvbiRTTEFfcmVhbCwgbmEucm0gPSBUUlVFKQ0KZGVuc2lkYWQuU0xBX3ByZWRpY3Q8LSBkZW5zaXR5KHByZWRpY2Npb24kcHJlZGljY2lvbiwgbmEucm0gPSBUUlVFKQ0KDQoNCnBsb3RfbHkoKSAlPiUNCiAgYWRkX2xpbmVzKHggPSB+ZGVuc2lkYWQuU0xBJHgsIHkgPSB+ZGVuc2lkYWQuU0xBJHksIG5hbWUgPSAiU0xBIHJlYWwiLCBmaWxsID0gJ3RvemVyb3knLGNvbG9yPSI5IikgJT4lDQogIGFkZF9saW5lcyh4ID0gfmRlbnNpZGFkLlNMQV9wcmVkaWN0JHgsIHkgPSB+ZGVuc2lkYWQuU0xBX3ByZWRpY3QkeSwgbmFtZSA9ICJTTEEgUHJlZGljdCIsIGZpbGwgPSAndG96ZXJveScsY29sb3I9IjEiKSU+JQ0KICBsYXlvdXQoeGF4aXMgPSBsaXN0KHRpdGxlID0gJ1NMQScpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJ0RlbnNpZGFkJykpDQoNCmBgYA0KDQo8YnI+DQo8YnI+DQoNCiMjIDYuIFJhZmFlbGEgKFJBRikNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCg0KDQpkYXRhIDwtcmFmDQpkYXRhX21vZGVsIDwtIGRhdGFbMzpuY29sKGRhdGEpXQ0KDQptb2RlbG8gICA8LSAgcnBhcnQoICJTTEF+IC4iLCAjcXVpZXJvIHByZWRlY2lyIGNsYXNlX3Rlcm5hcmlhIGEgcGFydGlyIGRlIGVsIHJlc3RvIGRlIGxhcyB2YXJpYWJsZXMNCiAgICAgICAgICAgICBkYXRhID0gZGF0YV9tb2RlbCwgICNsb3MgZGF0b3MgZG9uZGUgdm95IGEgZW50cmVuYXINCiAgICAgICAgICAgICB4dmFsPSAgICAgIDAsDQogICAgICAgICAgICAgY3A9ICAgICAgICAwLCAgICNlc3RvIHNpZ25pZmljYSBubyBsaW1pdGFyIGxhIGNvbXBsZWppZGFkIGRlIGxvcyBzcGxpdHMNCiAgICAgICAgICAgICBtaW5zcGxpdD0gIDQsICAgICAjbWluaW1hIGNhbnRpZGFkIGRlIHJlZ2lzdHJvcyBwYXJhIHF1ZSBzZSBoYWdhIGVsIHNwbGl0DQogICAgICAgICAgICAgbWluYnVja2V0PSA0LCAgICAgI3RhbWHDsW8gbWluaW1vIGRlIHVuYSBob2phDQogICAgICAgICAgICAgbWF4ZGVwdGg9ICA1ICkgICAgI3Byb2Z1bmRpZGFkIG1heGltYSBkZWwgYXJib2wNCg0KDQoNCg0KcHJlZGljY2lvbiA8LSBwcmVkaWN0KG1vZGVsbywgZGF0YSkNCnByZWRpY2Npb24gPC0gYXMuZGF0YS5mcmFtZShwcmVkaWNjaW9uKQ0KcHJlZGljY2lvbiA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKHByZWRpY2Npb24sZGF0YSRGZWNoYSxkYXRhJFNMQSwgKHByZWRpY2Npb24tY29yJFNMQSleMikpDQpjb2xuYW1lcyhwcmVkaWNjaW9uKVsyXSA8LSAiRmVjaGEiDQpjb2xuYW1lcyhwcmVkaWNjaW9uKVszXSA8LSAiU0xBX3JlYWwiDQpjb2xuYW1lcyhwcmVkaWNjaW9uKVs0XSA8LSAiRXJyb3IyIg0KDQplcnJvcl9yYWY8LSBzcXJ0KG1lYW4ocHJlZGljY2lvbiRFcnJvcjIpKQ0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NS41fQ0KDQojLSAgIEVycm9yIHByb21lZGlvOiRgciBzcXJ0KG1lYW4ocHJlZGljY2lvbiRFcnJvcjIpKWAkDQoNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQoNCiMgIEFyYm9sIGdlbmVyYWRvDQoNCnJwYXJ0LnBsb3QobW9kZWxvLCANCiAgICAgICAgICAgICAgICAgICAgIyBzaG93IGZpdHRlZCBjbGFzcywgcHJvYnMsIHBlcmNlbnRhZ2VzDQogICAgICAgICAgIGJveC5wYWxldHRlID0gIkduQnUiLCAjIGNvbG9yIHNjaGVtZQ0KICAgICAgICAgICBicmFuY2gubHR5ID0gMywgICAgICAgIyBkb3R0ZWQgYnJhbmNoIGxpbmVzDQogICAgICAgICAgIHNoYWRvdy5jb2wgPSAiZ3JleSIsICAjIHNoYWRvd3MgdW5kZXIgdGhlIG5vZGUgYm94ZXMNCiAgICAgICAgICAgbm4gPSBUUlVFKSAgICAgICAgICAgICMgZGlzcGxheSB0aGUgbm9kZSBudW1iZXJzIA0KDQoNCg0KYGBgDQoNCg0KIyMjIyAqKjYuMS4qKiBSYW5raW5nIGRlIEluZGljYWRvcmVzDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NC41fQ0KIyBJbXBvcnRhbmNpYQ0KaW1wb3J0YW5jaWFfcHJlZCA8LSBtb2RlbG8kdmFyaWFibGUuaW1wb3J0YW5jZSAlPiUNCiAgICAgICAgICAgICAgICAgICAgZW5mcmFtZShuYW1lID0gInByZWRpY3RvciIsIHZhbHVlID0gImltcG9ydGFuY2lhIikNCg0KIyBHcsOhZmljbw0KcDI8LSBnZ3Bsb3QoDQogIGRhdGEgPSBpbXBvcnRhbmNpYV9wcmVkLA0KICBhZXMoeCAgICA9IHJlb3JkZXIocHJlZGljdG9yLCBpbXBvcnRhbmNpYSksDQogICAgICB5ICAgID0gaW1wb3J0YW5jaWEsDQogICAgICBmaWxsID0gaW1wb3J0YW5jaWEpDQopICsgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsNCmdlb21fY29sKCkgKw0KY29vcmRfZmxpcCgpICsNCnRoZW1lX2NsYXNzaWMoKSArIA0KbGFicyh4ID0gTlVMTCwgeT0iSW1wb3J0YW5jaWEiKQ0KDQoNCmdncGxvdGx5KHAyKQ0KDQpgYGANCg0KPGJyPg0KDQoNCiMjIyMgKio2LjIuKipFc3RpbWFjacOzbiBkZWwgw6FyYm9sDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTIuNX0NCg0KIy0tR3JhZmljb3MgZGUgTGluZWEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpwbG90X2x5KCkgJT4lDQogIGFkZF9saW5lcyh4ID0gfnByZWRpY2Npb24kRmVjaGEsIHkgPSB+cHJlZGljY2lvbiRTTEFfcmVhbCwgbmFtZSA9ICJTTEEgcmVhbCIsIGZpbGwgPSAndG96ZXJveScsY29sb3I9IjkiKSAlPiUNCiAgYWRkX2xpbmVzKHggPSB+cHJlZGljY2lvbiRGZWNoYSwgeSA9IH5wcmVkaWNjaW9uJHByZWRpY2Npb24sIG5hbWUgPSAiU0xBIFByZWRpY3QiLCBmaWxsID0gJ3RvemVyb3knLGNvbG9yPSIxIikgJT4lDQogIGxheW91dCh4YXhpcyA9IGxpc3QodGl0bGUgPSAnRmVjaGEgKERpYSknKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdTTEEnKSkNCiAgICAgIA0KDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTIuNX0NCg0KDQojLS1HcmFmaWNvcyBkZSBkZW5zaWRhZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClNMQSA8LSBwcmVkaWNjaW9uJFNMQV9yZWFsDQpTTEFfcHJlZGljdCA8LSBwcmVkaWNjaW9uJHByZWRpY2Npb24NCmRlbnNpZGFkLlNMQSA8LSBkZW5zaXR5KHByZWRpY2Npb24kU0xBX3JlYWwsIG5hLnJtID0gVFJVRSkNCmRlbnNpZGFkLlNMQV9wcmVkaWN0PC0gZGVuc2l0eShwcmVkaWNjaW9uJHByZWRpY2Npb24sIG5hLnJtID0gVFJVRSkNCg0KDQpwbG90X2x5KCkgJT4lDQogIGFkZF9saW5lcyh4ID0gfmRlbnNpZGFkLlNMQSR4LCB5ID0gfmRlbnNpZGFkLlNMQSR5LCBuYW1lID0gIlNMQSByZWFsIiwgZmlsbCA9ICd0b3plcm95Jyxjb2xvcj0iOSIpICU+JQ0KICBhZGRfbGluZXMoeCA9IH5kZW5zaWRhZC5TTEFfcHJlZGljdCR4LCB5ID0gfmRlbnNpZGFkLlNMQV9wcmVkaWN0JHksIG5hbWUgPSAiU0xBIFByZWRpY3QiLCBmaWxsID0gJ3RvemVyb3knLGNvbG9yPSIxIiklPiUNCiAgbGF5b3V0KHhheGlzID0gbGlzdCh0aXRsZSA9ICdTTEEnKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdEZW5zaWRhZCcpKQ0KDQpgYGANCg0KPGJyPg0KPGJyPg0KDQojIyA3LiBBenVsIChaVUwpDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQoNCg0KZGF0YSA8LXp1bA0KZGF0YV9tb2RlbCA8LSBkYXRhWzM6bmNvbChkYXRhKV0NCg0KbW9kZWxvICAgPC0gIHJwYXJ0KCAiU0xBfiAuIiwgI3F1aWVybyBwcmVkZWNpciBjbGFzZV90ZXJuYXJpYSBhIHBhcnRpciBkZSBlbCByZXN0byBkZSBsYXMgdmFyaWFibGVzDQogICAgICAgICAgICAgZGF0YSA9IGRhdGFfbW9kZWwsICAjbG9zIGRhdG9zIGRvbmRlIHZveSBhIGVudHJlbmFyDQogICAgICAgICAgICAgeHZhbD0gICAgICAwLA0KICAgICAgICAgICAgIGNwPSAgICAgICAgMCwgICAjZXN0byBzaWduaWZpY2Egbm8gbGltaXRhciBsYSBjb21wbGVqaWRhZCBkZSBsb3Mgc3BsaXRzDQogICAgICAgICAgICAgbWluc3BsaXQ9ICA0LCAgICAgI21pbmltYSBjYW50aWRhZCBkZSByZWdpc3Ryb3MgcGFyYSBxdWUgc2UgaGFnYSBlbCBzcGxpdA0KICAgICAgICAgICAgIG1pbmJ1Y2tldD0gNCwgICAgICN0YW1hw7FvIG1pbmltbyBkZSB1bmEgaG9qYQ0KICAgICAgICAgICAgIG1heGRlcHRoPSAgNSApICAgICNwcm9mdW5kaWRhZCBtYXhpbWEgZGVsIGFyYm9sDQoNCg0KDQoNCnByZWRpY2Npb24gPC0gcHJlZGljdChtb2RlbG8sIGRhdGEpDQpwcmVkaWNjaW9uIDwtIGFzLmRhdGEuZnJhbWUocHJlZGljY2lvbikNCnByZWRpY2Npb24gPC0gYXMuZGF0YS5mcmFtZShjYmluZChwcmVkaWNjaW9uLGRhdGEkRmVjaGEsZGF0YSRTTEEsIChwcmVkaWNjaW9uLWNvciRTTEEpXjIpKQ0KY29sbmFtZXMocHJlZGljY2lvbilbMl0gPC0gIkZlY2hhIg0KY29sbmFtZXMocHJlZGljY2lvbilbM10gPC0gIlNMQV9yZWFsIg0KY29sbmFtZXMocHJlZGljY2lvbilbNF0gPC0gIkVycm9yMiINCg0KZXJyb3JfenVsPC0gc3FydChtZWFuKHByZWRpY2Npb24kRXJyb3IyKSkNCg0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTUuNX0NCg0KIy0gICBFcnJvciBwcm9tZWRpbzokYHIgc3FydChtZWFuKHByZWRpY2Npb24kRXJyb3IyKSlgJA0KDQpsaWJyYXJ5KHRpYmJsZSkNCmxpYnJhcnkoZ2dwbG90MikNCg0KDQojICBBcmJvbCBnZW5lcmFkbw0KDQpycGFydC5wbG90KG1vZGVsbywgDQogICAgICAgICAgICAgICAgICAgICMgc2hvdyBmaXR0ZWQgY2xhc3MsIHByb2JzLCBwZXJjZW50YWdlcw0KICAgICAgICAgICBib3gucGFsZXR0ZSA9ICJHbkJ1IiwgIyBjb2xvciBzY2hlbWUNCiAgICAgICAgICAgYnJhbmNoLmx0eSA9IDMsICAgICAgICMgZG90dGVkIGJyYW5jaCBsaW5lcw0KICAgICAgICAgICBzaGFkb3cuY29sID0gImdyZXkiLCAgIyBzaGFkb3dzIHVuZGVyIHRoZSBub2RlIGJveGVzDQogICAgICAgICAgIG5uID0gVFJVRSkgICAgICAgICAgICAjIGRpc3BsYXkgdGhlIG5vZGUgbnVtYmVycyANCg0KDQoNCmBgYA0KDQoNCiMjIyMgKio3LjEuKiogUmFua2luZyBkZSBJbmRpY2Fkb3Jlcw0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQuNX0NCiMgSW1wb3J0YW5jaWENCmltcG9ydGFuY2lhX3ByZWQgPC0gbW9kZWxvJHZhcmlhYmxlLmltcG9ydGFuY2UgJT4lDQogICAgICAgICAgICAgICAgICAgIGVuZnJhbWUobmFtZSA9ICJwcmVkaWN0b3IiLCB2YWx1ZSA9ICJpbXBvcnRhbmNpYSIpDQoNCiMgR3LDoWZpY28NCnAyPC0gZ2dwbG90KA0KICBkYXRhID0gaW1wb3J0YW5jaWFfcHJlZCwNCiAgYWVzKHggICAgPSByZW9yZGVyKHByZWRpY3RvciwgaW1wb3J0YW5jaWEpLA0KICAgICAgeSAgICA9IGltcG9ydGFuY2lhLA0KICAgICAgZmlsbCA9IGltcG9ydGFuY2lhKQ0KKSArICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrDQpnZW9tX2NvbCgpICsNCmNvb3JkX2ZsaXAoKSArDQp0aGVtZV9jbGFzc2ljKCkgKyANCmxhYnMoeCA9IE5VTEwsIHk9IkltcG9ydGFuY2lhIikNCg0KDQpnZ3Bsb3RseShwMikNCg0KYGBgDQoNCjxicj4NCg0KDQojIyMjICoqNy4yLioqRXN0aW1hY2nDs24gZGVsIMOhcmJvbA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0yLjV9DQoNCiMtLUdyYWZpY29zIGRlIExpbmVhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KcGxvdF9seSgpICU+JQ0KICBhZGRfbGluZXMoeCA9IH5wcmVkaWNjaW9uJEZlY2hhLCB5ID0gfnByZWRpY2Npb24kU0xBX3JlYWwsIG5hbWUgPSAiU0xBIHJlYWwiLCBmaWxsID0gJ3RvemVyb3knLGNvbG9yPSI5IikgJT4lDQogIGFkZF9saW5lcyh4ID0gfnByZWRpY2Npb24kRmVjaGEsIHkgPSB+cHJlZGljY2lvbiRwcmVkaWNjaW9uLCBuYW1lID0gIlNMQSBQcmVkaWN0IiwgZmlsbCA9ICd0b3plcm95Jyxjb2xvcj0iMSIpICU+JQ0KICBsYXlvdXQoeGF4aXMgPSBsaXN0KHRpdGxlID0gJ0ZlY2hhIChEaWEpJyksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnU0xBJykpDQogICAgICANCg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0yLjV9DQoNCg0KIy0tR3JhZmljb3MgZGUgZGVuc2lkYWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpTTEEgPC0gcHJlZGljY2lvbiRTTEFfcmVhbA0KU0xBX3ByZWRpY3QgPC0gcHJlZGljY2lvbiRwcmVkaWNjaW9uDQpkZW5zaWRhZC5TTEEgPC0gZGVuc2l0eShwcmVkaWNjaW9uJFNMQV9yZWFsLCBuYS5ybSA9IFRSVUUpDQpkZW5zaWRhZC5TTEFfcHJlZGljdDwtIGRlbnNpdHkocHJlZGljY2lvbiRwcmVkaWNjaW9uLCBuYS5ybSA9IFRSVUUpDQoNCg0KcGxvdF9seSgpICU+JQ0KICBhZGRfbGluZXMoeCA9IH5kZW5zaWRhZC5TTEEkeCwgeSA9IH5kZW5zaWRhZC5TTEEkeSwgbmFtZSA9ICJTTEEgcmVhbCIsIGZpbGwgPSAndG96ZXJveScsY29sb3I9IjkiKSAlPiUNCiAgYWRkX2xpbmVzKHggPSB+ZGVuc2lkYWQuU0xBX3ByZWRpY3QkeCwgeSA9IH5kZW5zaWRhZC5TTEFfcHJlZGljdCR5LCBuYW1lID0gIlNMQSBQcmVkaWN0IiwgZmlsbCA9ICd0b3plcm95Jyxjb2xvcj0iMSIpJT4lDQogIGxheW91dCh4YXhpcyA9IGxpc3QodGl0bGUgPSAnU0xBJyksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnRGVuc2lkYWQnKSkNCg0KYGBgDQoNCjxicj4NCjxicj4NCg0KIyMgOC4gU2FyYW5kw60gKFJESSkNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCg0KDQpkYXRhIDwtcmRpDQpkYXRhX21vZGVsIDwtIGRhdGFbMzpuY29sKGRhdGEpXQ0KDQptb2RlbG8gICA8LSAgcnBhcnQoICJTTEF+IC4iLCAjcXVpZXJvIHByZWRlY2lyIGNsYXNlX3Rlcm5hcmlhIGEgcGFydGlyIGRlIGVsIHJlc3RvIGRlIGxhcyB2YXJpYWJsZXMNCiAgICAgICAgICAgICBkYXRhID0gZGF0YV9tb2RlbCwgICNsb3MgZGF0b3MgZG9uZGUgdm95IGEgZW50cmVuYXINCiAgICAgICAgICAgICB4dmFsPSAgICAgIDAsDQogICAgICAgICAgICAgY3A9ICAgICAgICAwLCAgICNlc3RvIHNpZ25pZmljYSBubyBsaW1pdGFyIGxhIGNvbXBsZWppZGFkIGRlIGxvcyBzcGxpdHMNCiAgICAgICAgICAgICBtaW5zcGxpdD0gIDQsICAgICAjbWluaW1hIGNhbnRpZGFkIGRlIHJlZ2lzdHJvcyBwYXJhIHF1ZSBzZSBoYWdhIGVsIHNwbGl0DQogICAgICAgICAgICAgbWluYnVja2V0PSA0LCAgICAgI3RhbWHDsW8gbWluaW1vIGRlIHVuYSBob2phDQogICAgICAgICAgICAgbWF4ZGVwdGg9ICA1ICkgICAgI3Byb2Z1bmRpZGFkIG1heGltYSBkZWwgYXJib2wNCg0KDQoNCg0KcHJlZGljY2lvbiA8LSBwcmVkaWN0KG1vZGVsbywgZGF0YSkNCnByZWRpY2Npb24gPC0gYXMuZGF0YS5mcmFtZShwcmVkaWNjaW9uKQ0KcHJlZGljY2lvbiA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKHByZWRpY2Npb24sZGF0YSRGZWNoYSxkYXRhJFNMQSwgKHByZWRpY2Npb24tY29yJFNMQSleMikpDQpjb2xuYW1lcyhwcmVkaWNjaW9uKVsyXSA8LSAiRmVjaGEiDQpjb2xuYW1lcyhwcmVkaWNjaW9uKVszXSA8LSAiU0xBX3JlYWwiDQpjb2xuYW1lcyhwcmVkaWNjaW9uKVs0XSA8LSAiRXJyb3IyIg0KDQplcnJvcl9yZGk8LSBzcXJ0KG1lYW4ocHJlZGljY2lvbiRFcnJvcjIpKQ0KDQpgYGANCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NS41fQ0KDQojLSAgIEVycm9yIHByb21lZGlvOiRgciBzcXJ0KG1lYW4ocHJlZGljY2lvbiRFcnJvcjIpKWAkDQoNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQoNCiMgIEFyYm9sIGdlbmVyYWRvDQoNCnJwYXJ0LnBsb3QobW9kZWxvLCANCiAgICAgICAgICAgICAgICAgICAgIyBzaG93IGZpdHRlZCBjbGFzcywgcHJvYnMsIHBlcmNlbnRhZ2VzDQogICAgICAgICAgIGJveC5wYWxldHRlID0gIkduQnUiLCAjIGNvbG9yIHNjaGVtZQ0KICAgICAgICAgICBicmFuY2gubHR5ID0gMywgICAgICAgIyBkb3R0ZWQgYnJhbmNoIGxpbmVzDQogICAgICAgICAgIHNoYWRvdy5jb2wgPSAiZ3JleSIsICAjIHNoYWRvd3MgdW5kZXIgdGhlIG5vZGUgYm94ZXMNCiAgICAgICAgICAgbm4gPSBUUlVFKSAgICAgICAgICAgICMgZGlzcGxheSB0aGUgbm9kZSBudW1iZXJzIA0KDQoNCg0KYGBgDQoNCg0KIyMjIyAqKjguMS4qKiBSYW5raW5nIGRlIEluZGljYWRvcmVzDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NC41fQ0KIyBJbXBvcnRhbmNpYQ0KaW1wb3J0YW5jaWFfcHJlZCA8LSBtb2RlbG8kdmFyaWFibGUuaW1wb3J0YW5jZSAlPiUNCiAgICAgICAgICAgICAgICAgICAgZW5mcmFtZShuYW1lID0gInByZWRpY3RvciIsIHZhbHVlID0gImltcG9ydGFuY2lhIikNCg0KIyBHcsOhZmljbw0KcDI8LSBnZ3Bsb3QoDQogIGRhdGEgPSBpbXBvcnRhbmNpYV9wcmVkLA0KICBhZXMoeCAgICA9IHJlb3JkZXIocHJlZGljdG9yLCBpbXBvcnRhbmNpYSksDQogICAgICB5ICAgID0gaW1wb3J0YW5jaWEsDQogICAgICBmaWxsID0gaW1wb3J0YW5jaWEpDQopICsgIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsNCmdlb21fY29sKCkgKw0KY29vcmRfZmxpcCgpICsNCnRoZW1lX2NsYXNzaWMoKSArIA0KbGFicyh4ID0gTlVMTCwgeT0iSW1wb3J0YW5jaWEiKQ0KDQoNCmdncGxvdGx5KHAyKQ0KDQpgYGANCg0KPGJyPg0KDQoNCiMjIyMgKio4LjIuKiogRXN0aW1hY2nDs24gZGVsIMOhcmJvbA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0yLjV9DQoNCiMtLUdyYWZpY29zIGRlIExpbmVhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KcGxvdF9seSgpICU+JQ0KICBhZGRfbGluZXMoeCA9IH5wcmVkaWNjaW9uJEZlY2hhLCB5ID0gfnByZWRpY2Npb24kU0xBX3JlYWwsIG5hbWUgPSAiU0xBIHJlYWwiLCBmaWxsID0gJ3RvemVyb3knLGNvbG9yPSI5IikgJT4lDQogIGFkZF9saW5lcyh4ID0gfnByZWRpY2Npb24kRmVjaGEsIHkgPSB+cHJlZGljY2lvbiRwcmVkaWNjaW9uLCBuYW1lID0gIlNMQSBQcmVkaWN0IiwgZmlsbCA9ICd0b3plcm95Jyxjb2xvcj0iMSIpICU+JQ0KICBsYXlvdXQoeGF4aXMgPSBsaXN0KHRpdGxlID0gJ0ZlY2hhIChEaWEpJyksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnU0xBJykpDQogICAgICANCg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0yLjV9DQoNCg0KIy0tR3JhZmljb3MgZGUgZGVuc2lkYWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpTTEEgPC0gcHJlZGljY2lvbiRTTEFfcmVhbA0KU0xBX3ByZWRpY3QgPC0gcHJlZGljY2lvbiRwcmVkaWNjaW9uDQpkZW5zaWRhZC5TTEEgPC0gZGVuc2l0eShwcmVkaWNjaW9uJFNMQV9yZWFsLCBuYS5ybSA9IFRSVUUpDQpkZW5zaWRhZC5TTEFfcHJlZGljdDwtIGRlbnNpdHkocHJlZGljY2lvbiRwcmVkaWNjaW9uLCBuYS5ybSA9IFRSVUUpDQoNCg0KcGxvdF9seSgpICU+JQ0KICBhZGRfbGluZXMoeCA9IH5kZW5zaWRhZC5TTEEkeCwgeSA9IH5kZW5zaWRhZC5TTEEkeSwgbmFtZSA9ICJTTEEgcmVhbCIsIGZpbGwgPSAndG96ZXJveScsY29sb3I9IjkiKSAlPiUNCiAgYWRkX2xpbmVzKHggPSB+ZGVuc2lkYWQuU0xBX3ByZWRpY3QkeCwgeSA9IH5kZW5zaWRhZC5TTEFfcHJlZGljdCR5LCBuYW1lID0gIlNMQSBQcmVkaWN0IiwgZmlsbCA9ICd0b3plcm95Jyxjb2xvcj0iMSIpJT4lDQogIGxheW91dCh4YXhpcyA9IGxpc3QodGl0bGUgPSAnU0xBJyksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnRGVuc2lkYWQnKSkNCg0KYGBgDQoNCg0KPGJyPg0KPGJyPg0KDQojIyA5LiBTYW50YSBGZSAoU0ZOKQ0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KDQoNCmRhdGEgPC1zZm4NCmRhdGFfbW9kZWwgPC0gZGF0YVszOm5jb2woZGF0YSldDQoNCm1vZGVsbyAgIDwtICBycGFydCggIlNMQX4gLiIsICNxdWllcm8gcHJlZGVjaXIgY2xhc2VfdGVybmFyaWEgYSBwYXJ0aXIgZGUgZWwgcmVzdG8gZGUgbGFzIHZhcmlhYmxlcw0KICAgICAgICAgICAgIGRhdGEgPSBkYXRhX21vZGVsLCAgI2xvcyBkYXRvcyBkb25kZSB2b3kgYSBlbnRyZW5hcg0KICAgICAgICAgICAgIHh2YWw9ICAgICAgMCwNCiAgICAgICAgICAgICBjcD0gICAgICAgIDAsICAgI2VzdG8gc2lnbmlmaWNhIG5vIGxpbWl0YXIgbGEgY29tcGxlamlkYWQgZGUgbG9zIHNwbGl0cw0KICAgICAgICAgICAgIG1pbnNwbGl0PSAgNCwgICAgICNtaW5pbWEgY2FudGlkYWQgZGUgcmVnaXN0cm9zIHBhcmEgcXVlIHNlIGhhZ2EgZWwgc3BsaXQNCiAgICAgICAgICAgICBtaW5idWNrZXQ9IDQsICAgICAjdGFtYcOxbyBtaW5pbW8gZGUgdW5hIGhvamENCiAgICAgICAgICAgICBtYXhkZXB0aD0gIDUgKSAgICAjcHJvZnVuZGlkYWQgbWF4aW1hIGRlbCBhcmJvbA0KDQoNCg0KDQpwcmVkaWNjaW9uIDwtIHByZWRpY3QobW9kZWxvLCBkYXRhKQ0KcHJlZGljY2lvbiA8LSBhcy5kYXRhLmZyYW1lKHByZWRpY2Npb24pDQpwcmVkaWNjaW9uIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQocHJlZGljY2lvbixkYXRhJEZlY2hhLGRhdGEkU0xBLCAocHJlZGljY2lvbi1jb3IkU0xBKV4yKSkNCmNvbG5hbWVzKHByZWRpY2Npb24pWzJdIDwtICJGZWNoYSINCmNvbG5hbWVzKHByZWRpY2Npb24pWzNdIDwtICJTTEFfcmVhbCINCmNvbG5hbWVzKHByZWRpY2Npb24pWzRdIDwtICJFcnJvcjIiDQoNCmVycm9yX3NmbjwtIHNxcnQobWVhbihwcmVkaWNjaW9uJEVycm9yMikpDQoNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD01LjV9DQoNCiMtICAgRXJyb3IgcHJvbWVkaW86JGByIHNxcnQobWVhbihwcmVkaWNjaW9uJEVycm9yMikpYCQNCg0KbGlicmFyeSh0aWJibGUpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCg0KIyAgQXJib2wgZ2VuZXJhZG8NCg0KcnBhcnQucGxvdChtb2RlbG8sIA0KICAgICAgICAgICAgICAgICAgICAjIHNob3cgZml0dGVkIGNsYXNzLCBwcm9icywgcGVyY2VudGFnZXMNCiAgICAgICAgICAgYm94LnBhbGV0dGUgPSAiR25CdSIsICMgY29sb3Igc2NoZW1lDQogICAgICAgICAgIGJyYW5jaC5sdHkgPSAzLCAgICAgICAjIGRvdHRlZCBicmFuY2ggbGluZXMNCiAgICAgICAgICAgc2hhZG93LmNvbCA9ICJncmV5IiwgICMgc2hhZG93cyB1bmRlciB0aGUgbm9kZSBib3hlcw0KICAgICAgICAgICBubiA9IFRSVUUpICAgICAgICAgICAgIyBkaXNwbGF5IHRoZSBub2RlIG51bWJlcnMgDQoNCg0KDQpgYGANCg0KDQojIyMjICoqOS4xLioqIFJhbmtpbmcgZGUgSW5kaWNhZG9yZXMNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LjV9DQojIEltcG9ydGFuY2lhDQppbXBvcnRhbmNpYV9wcmVkIDwtIG1vZGVsbyR2YXJpYWJsZS5pbXBvcnRhbmNlICU+JQ0KICAgICAgICAgICAgICAgICAgICBlbmZyYW1lKG5hbWUgPSAicHJlZGljdG9yIiwgdmFsdWUgPSAiaW1wb3J0YW5jaWEiKQ0KDQojIEdyw6FmaWNvDQpwMjwtIGdncGxvdCgNCiAgZGF0YSA9IGltcG9ydGFuY2lhX3ByZWQsDQogIGFlcyh4ICAgID0gcmVvcmRlcihwcmVkaWN0b3IsIGltcG9ydGFuY2lhKSwNCiAgICAgIHkgICAgPSBpbXBvcnRhbmNpYSwNCiAgICAgIGZpbGwgPSBpbXBvcnRhbmNpYSkNCikgKyAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KZ2VvbV9jb2woKSArDQpjb29yZF9mbGlwKCkgKw0KdGhlbWVfY2xhc3NpYygpICsgDQpsYWJzKHggPSBOVUxMLCB5PSJJbXBvcnRhbmNpYSIpDQoNCg0KZ2dwbG90bHkocDIpDQoNCmBgYA0KDQo8YnI+DQoNCg0KIyMjIyAqKjkuMi4qKiBFc3RpbWFjacOzbiBkZWwgw6FyYm9sDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTIuNX0NCg0KIy0tR3JhZmljb3MgZGUgTGluZWEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpwbG90X2x5KCkgJT4lDQogIGFkZF9saW5lcyh4ID0gfnByZWRpY2Npb24kRmVjaGEsIHkgPSB+cHJlZGljY2lvbiRTTEFfcmVhbCwgbmFtZSA9ICJTTEEgcmVhbCIsIGZpbGwgPSAndG96ZXJveScsY29sb3I9IjkiKSAlPiUNCiAgYWRkX2xpbmVzKHggPSB+cHJlZGljY2lvbiRGZWNoYSwgeSA9IH5wcmVkaWNjaW9uJHByZWRpY2Npb24sIG5hbWUgPSAiU0xBIFByZWRpY3QiLCBmaWxsID0gJ3RvemVyb3knLGNvbG9yPSIxIikgJT4lDQogIGxheW91dCh4YXhpcyA9IGxpc3QodGl0bGUgPSAnRmVjaGEgKERpYSknKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdTTEEnKSkNCiAgICAgIA0KDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTIuNX0NCg0KDQojLS1HcmFmaWNvcyBkZSBkZW5zaWRhZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClNMQSA8LSBwcmVkaWNjaW9uJFNMQV9yZWFsDQpTTEFfcHJlZGljdCA8LSBwcmVkaWNjaW9uJHByZWRpY2Npb24NCmRlbnNpZGFkLlNMQSA8LSBkZW5zaXR5KHByZWRpY2Npb24kU0xBX3JlYWwsIG5hLnJtID0gVFJVRSkNCmRlbnNpZGFkLlNMQV9wcmVkaWN0PC0gZGVuc2l0eShwcmVkaWNjaW9uJHByZWRpY2Npb24sIG5hLnJtID0gVFJVRSkNCg0KDQpwbG90X2x5KCkgJT4lDQogIGFkZF9saW5lcyh4ID0gfmRlbnNpZGFkLlNMQSR4LCB5ID0gfmRlbnNpZGFkLlNMQSR5LCBuYW1lID0gIlNMQSByZWFsIiwgZmlsbCA9ICd0b3plcm95Jyxjb2xvcj0iOSIpICU+JQ0KICBhZGRfbGluZXMoeCA9IH5kZW5zaWRhZC5TTEFfcHJlZGljdCR4LCB5ID0gfmRlbnNpZGFkLlNMQV9wcmVkaWN0JHksIG5hbWUgPSAiU0xBIFByZWRpY3QiLCBmaWxsID0gJ3RvemVyb3knLGNvbG9yPSIxIiklPiUNCiAgbGF5b3V0KHhheGlzID0gbGlzdCh0aXRsZSA9ICdTTEEnKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdEZW5zaWRhZCcpKQ0KDQpgYGANCg0KDQojIyBHcmlkU2VhcmNoDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCg0KIz09RnVuY2lvbiBkZSBjb3N0b3M9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KDQpkYXRhIDwtIGJoaQ0KZHRyYWluIDwtZGF0YVszOm5jb2woZGF0YSldDQpkdGVzdCA8LWRhdGFbMzpuY29sKGRhdGEpXQ0KDQoNCiMgRnVuY2lvbiBxdWUgZW50cmVuYSBlbCBhcmJvbCB5IGx1ZWdvIGRldGVybWluYSBsYSBnYW5hbmNpYSBzb2JyZSBlbCBzZXQgZGUgdGVzdA0KbW9kZWxvX3JwYXJ0X2dhbmFuY2lhID0gZnVuY3Rpb24oIHB0cmFpbiwgcHRlc3QsIHBtYXhkZXB0aCwgcG1pbmJ1Y2tldCwgcG1pbnNwbGl0LCBwY3AgKQ0Kew0KDQogIG1vZGVsbyAgIDwtICBycGFydCgiU0xBIH4gLiIsICAgZGF0YSA9IHB0cmFpbiwgIHh2YWw9MCwgbWF4ZGVwdGg9cG1heGRlcHRoLCBtaW5idWNrZXQ9cG1pbmJ1Y2tldCwgbWluc3BsaXQ9cG1pbnNwbGl0LCBjcD1wY3ApDQoNCiAgI2FwbGljbyBlbCBtb2RlbG8gYSBkYXRvcyBudWV2b3MNCiAgdGVzdGluZ19wcmVkaWNjaW9uICA8LSBwcmVkaWN0KG1vZGVsbywgcHRlc3QpDQogIHRlc3RpbmdfcHJlZGljY2lvbiA8LSBhcy5kYXRhLmZyYW1lKHRlc3RpbmdfcHJlZGljY2lvbikNCiAgdGVzdGluZ19wcmVkaWNjaW9uIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQodGVzdGluZ19wcmVkaWNjaW9uLGRhdGEkRmVjaGEsZGF0YSRTTEEsICh0ZXN0aW5nX3ByZWRpY2Npb24tZGF0YSRTTEEpXjIpKQ0KICBjb2xuYW1lcyh0ZXN0aW5nX3ByZWRpY2Npb24pWzJdIDwtICJGZWNoYSINCiAgY29sbmFtZXModGVzdGluZ19wcmVkaWNjaW9uKVszXSA8LSAiU0xBX3JlYWwiDQogIGNvbG5hbWVzKHRlc3RpbmdfcHJlZGljY2lvbilbNF0gPC0gIkVycm9yMiINCiAgICANCiAgcmV0dXJuKHNxcnQobWVhbih0ZXN0aW5nX3ByZWRpY2Npb24kRXJyb3IyKSkpDQogIA0KDQp9DQogICAgIA0KDQojLS1HcmlkU2VhcmNoLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KI0N1ZW50YSBsb3MgbW9kZWxvcyBwcm9iYWRvcw0KbGluZWEgPC0gMQ0KDQojRXN0YWJsZWNlIHVuYSBnYW5hbmNpYSBpbmljaWFsIG11eSBiYWphIGEgc3VwZXJhcg0KbWluX2Vycm9yIDwtIDAuMw0KDQojRm9yIGFuaWRhZG9zIHBhcmEgZ3JpZCBzZWFyY2ggDQpmb3IoIHZjcCBpbiBjKCAwLCAwLjAxLCAwLjAwMSkpICNDb21wbGV4aXR5IEZhY3Rvcg0KZm9yKCB2bWF4ZGVwdGggaW4gIDI6MTUgKSAjbWF4IERlcHRoDQpmb3IoIHZtaW5zcGxpdCBpbiAgNDoxNSApICNNaW4gU3BsaXQNCmZvciggdm1pbmJ1Y2tldCAgaW4gNDoxNSApICNNaW4gQnVja2V0DQp7IA0KDQogICAgI011ZXN0cmEgbG9zIHBhcmFtZXRyb3MgYSB0ZXN0ZWFyDQogICAgI21lc3NhZ2UocGFzdGUoJ0ludGVudGFuZG8nLHZjcCx2bWluc3BsaXQsdm1pbmJ1Y2tldCx2bWF4ZGVwdGgpKQ0KICAgICNMbGFtYSBhIGxhIGZ1bmNpb24gcXVlIGVudHJlbmEgZWwgbW9kZWxvIHkgY2FsY3VsYSBsYSBnYW5hbmNpYSBwYXJhIGVzb3MgcGFyYW1ldHJvcw0KICAgIHJlcyA8LSBtb2RlbG9fcnBhcnRfZ2FuYW5jaWEoIGR0cmFpbiwgZHRlc3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtYXhkZXB0aD12bWF4ZGVwdGgsIHBtaW5idWNrZXQ9dm1pbmJ1Y2tldCwgcG1pbnNwbGl0PXZtaW5zcGxpdCwgcGNwPXZjcCApDQoNCiAgDQogICAgI1ZlcmlmaWNhIHNpIHNlIHN1cGVybyBsYSBtZWpvciBnYW5hbmNpYSBoYXN0YSBlbCBtb21lbnRvLiBFbiBjYXNvIGRlIGhhYmVybGEgc3VwZXJhZG8gZ3JhYmEgbG9zIGhpcGVycGFyYW1ldHJvcyBudWV2b3MNCiAgICBpZiAocmVzPG1pbl9lcnJvcikgew0KICAgICAgbWluX2Vycm9yIDwtIHJlcw0KICAgICAgbWVzc2FnZShwYXN0ZSgiTnVldm8gRXJyb3IgTWluOiAiLCByZXMqMTAwLCB2Y3Asdm1pbnNwbGl0LHZtaW5idWNrZXQsdm1heGRlcHRoKSkNCiAgICAgIHBjcDwtdmNwDQogICAgICBwbWluc3BsaXQ8LXZtaW5zcGxpdA0KICAgICAgcG1pbmJ1Y2tldDwtdm1pbmJ1Y2tldA0KICAgICAgcG1heGRlcHRoPC12bWF4ZGVwdGgNCiAgfQ0KICAjTXVlc3RyYSBhbCBnYW5hbmNpYSBkZSBsYSBpdGVyYWNpb24NCiAgI21lc3NhZ2UocGFzdGUoJ0Vycm9yOicscmVzKjEwMCwnRXJyb3IgTWluaW1vJyxtaW5fZXJyb3IqMTAwKSkNCiAgICANCiAgbGluZWEgPC0gbGluZWErMQ0KDQoNCn0NCiAgICAgICAgIA0KI3Bhc3RlKCJOdWV2byBFcnJvciBNaW46ICIsIHJlcyoxMDAsIHZjcCx2bWluc3BsaXQsdm1pbmJ1Y2tldCx2bWF4ZGVwdGgpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KZXJyb3IgPC0gcmJpbmQoZXJyb3JfY29yLGVycm9yX2JoaSxlcnJvcl92bWEsZXJyb3JfcmN1LGVycm9yX3JvcyxlcnJvcl9yYWYsZXJyb3JfenVsLGVycm9yX3JkaSxlcnJvcl9zZm4pDQplcnJvcg0KYGBgDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9MTV9DQojIERhdGE6IG51bWVyaWMgdmFyaWFibGVzIG9mIHRoZSBuYXRpdmUgbXRjYXJzIGRhdGFzZXQNCmRhdGEgPC0gYXMuZGF0YS50YWJsZShkZjJbICwgYygzOjE4KV0pDQpkYXRhIDwtIGRhdGFbLCAnOj0nKElEPU5VTEwsIGBTTEEgKHQtMSlgPU5VTEwpXQ0KZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGRhdGEpDQoNCiMgUGxvdA0KbGlicmFyeShQZXJmb3JtYW5jZUFuYWx5dGljcykNCg0KY2hhcnQuQ29ycmVsYXRpb24oZGF0YSwgaGlzdG9ncmFtID0gVFJVRSwgbWV0aG9kID0gInBlYXJzb24iKQ0KYGBgDQoNCg==