Support
0.1.10
OTRS GmbH
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Complete Win32 compat.
Fixed bug in Hardware.pm.
Fixed Bug in Support.xml.
Support Modul review.
Add new database checks.
Added more database checks.
Improved notifications.
Added init apache checks.
Added init mysql and oracle checks.
Add new admin checks and quote xml input.
Fixed xml and formatting bug.
Init release.
A admin support tool.
Ein Admin Support Tool.
2.1.x
2.2.x
The Support application will be found at the admin navigation bar in the fourth column and can be used for system checks to find setup errors.
Die Support Applikation ist in der Admin-Navigationsleiste, in der vierten Spalte zu finden. Mit ihr koennen System-Checks ausgeführt werden um Fehler im Setup zu finden.
2007-10-04 09:03:39
opms.otrs.com
IyAtLQojIEFkbWluU3VwcG9ydC5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFkbWluU3VwcG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pblN1cHBvcnQuZHRsLHYgMS4zIDIwMDcvMDYvMTIgMTM6MDE6NTkgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPiRFbnZ7IkJveDAifSRUZXh0eyJBZG1pbiBTdXBwb3J0IEluZm8ifSRFbnZ7IkJveDEifTwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1HZXRSZXF1aXJlZEluZm8iPkNyZWF0ZSBTdXBwb3J0IFBhY2thZ2U8L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGUgLS0+CiAgICAgIDx0YWJsZSB3aWR0aD0iODAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRRRGF0YXsiTW9kdWxlIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IkNoZWNrIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjUwIj4kVGV4dHsiRGVzY3JpcHRpb24ifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDb21tZW50In08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iNTAiPiRUZXh0eyJTdGF0ZSJ9PC90ZD4KICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPdmVydmlld01vZHVsZVJvdyAtLT4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFFEYXRheyJOYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPiREYXRheyJEZXNjcmlwdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kRGF0YXsiQ29tbWVudCJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij48Zm9udCBjb2xvcj0iJFFEYXRheyJGb250Q29sb3IifSI+JFFEYXRheyJDaGVjayJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGVSb3cgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CiAgICAgIDwvdGFibGU+CiAgICAgIDxicj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGUgLS0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkIC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4kRW52eyJCb3gwIn0kVGV4dHsiQWRtaW4gU3VwcG9ydCBJbmZvIn0kRW52eyJCb3gxIn08L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iQ29uZmlkZW50aWFsIj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwcHgiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkSW5mbyAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJjb250ZW50aGVhZCI+JFFEYXRheyJDb25maWdNb2R1bGUifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjgwMHB4IiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZEluZm9Sb3cgLS0+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkSW5mb1Jvd1RleHQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjI1JSI+JFFEYXRheyJOYW1lIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSIzNSUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSIkUURhdGF7IktleSJ9IiB2YWx1ZT0iJFFEYXRheyJWYWx1ZSJ9IiBzaXplPSIkUURhdGF7IlNpemUifSI+PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4gKCogJFFEYXRheyJEZXNjcmlwdGlvbiJ9PC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZEluZm9Sb3dUZXh0IC0tPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZEluZm9Sb3dTZWxlY3QgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjI1JSI+JFFEYXRheyJOYW1lIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSIzNSUiPiREYXRheyJTZWxlY3RTdHJnIn08L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiAoKiAkUURhdGF7IkRlc2NyaXB0aW9uIn08L2ZvbnQ+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkSW5mb1Jvd1NlbGVjdCAtLT4KPCEtLSBkdGw6YmxvY2s6UmVxdWlyZWRJbmZvUm93IC0tPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZEluZm8gLS0+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJOZXh0Li4uIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UmVxdWlyZWQgLS0+CjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbCAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JEVudnsiQm94MCJ9JFRleHR7IkFkbWluIFN1cHBvcnQgSW5mbyJ9JEVudnsiQm94MSJ9PC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlVwbG9hZFN1cHBvcnRJbmZvIj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwcHgiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJDb25maWRlbnRpYWwgaW5mb3JtYXRpb24ifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KCjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbEhpZGRlbiAtLT4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSIkUURhdGF7Ik5hbWUifSIgdmFsdWU9IiRRRGF0YXsiVmFsdWUifSI+CjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbEhpZGRlbiAtLT4KCiAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSI4MDBweCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiQ29uZmlkZW50aWFsIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSIgY29sc3Bhbj0iMiI+CiAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJDb25maWRlbnRpYWwiIHJvd3M9IjQiIGNvbHM9Ijc4Ij4KQW55IGFuZCBhbGwgaW5mb3JtYXRpb24gZGlzY2xvc2VkIHRvIE9UUlMgd2lsbCBiZSBrZXB0IHN0cmljdGx5IGNvbmZpZGVudGlhbCBhbmQgYXJlIG9ubHkgdXNlZCBmb3IgcHJvdmlkaW5nIGJldHRlciBzdXBwb3J0IHNlcnZpY2VzIHRvIG91ciBjdXN0b21lcnMuCiAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQ29tbWVyY2lhbCBzdXBwb3J0In08L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiQ29tbWVyY2lhbCBzdXBwb3J0IElEIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSJTdXBwb3J0SUQiIHZhbHVlPSIiIHNpemU9IjQwIj48L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiAoKiAkVGV4dHsiaWYgeW91IGFyZSBhbHJlYWR5IGEgY29tbWVyY2lhbCBzdXBwb3J0IGN1c3RvbWVyLCBwbGVhc2UgYWRkIHlvdXIgc3VwcG9ydCBpZC4gKG5vdCByZXF1aXJlZCEpIn0pPC9mb250PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkRvd25sb2FkIiB2YWx1ZT0iJFRleHR7IkRvd25sb2FkIn0iPgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlNlbmQiIHZhbHVlPSIkVGV4dHsiU2VuZCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbCAtLT4K
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFN1cHBvcnQucG0sdiAxLjcgMjAwNy8xMC8wMiAxMjo0MjowNCBzciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ7Cgp1c2Ugc3RyaWN0OwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW1haWw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKdXNlIE1JTUU6OkJhc2U2NDsKdXNlIEFyY2hpdmU6OlRhcjsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuNyAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0IC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN1cHBvcnQgaW5mb3JtYXRpb25zIHRvIGEgcnVubmluZyBPVFJTIHN5c3RlbS4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIFN1cHBvcnQgb2JqZWN0Cgp1c2UgS2VybmVsOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwpteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwpteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCik7CgokU3VwcG9ydE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0LT5uZXcoCiAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAopOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KICAgICRTZWxmLT57WE1MT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntEQk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgIE1haW5PYmplY3QgPT4gJFNlbGYtPntNYWluT2JqZWN0fSwKICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAoKICAgICk7CiAgICAkU2VsZi0+e1RpbWVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntFbWFpbE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RW1haWwtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgIE1haW5PYmplY3QgPT4gJFNlbGYtPntNYWluT2JqZWN0fSwKICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAogICAgICAgIERCT2JqZWN0ID0+ICRTZWxmLT57REJPYmplY3R9LAogICAgICAgIFRpbWVPYmplY3QgPT4gJFNlbGYtPntUaW1lT2JqZWN0fSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBTdXBwb3J0Q29uZmlnSGFzaEdldCgpCgpnZXQgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIHJlcXVpcmVkIGNvbmZpZyBpbmZvcm1hdGlvbi4KCiAgICAkU3VwcG9ydC0+U3VwcG9ydENvbmZpZ0hhc2hHZXQoCiAgICAgICAgQ29uZmlnSGFzaCA9PiAkSGFzaFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU3VwcG9ydENvbmZpZ0hhc2hHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KENvbmZpZ0hhc2gpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNoZWNrIGlmICRDb25maWdIYXNoIG5lIGEgSGFzaFJlZgogICAgaWYgKHJlZigkUGFyYW17Q29uZmlnSGFzaH0pIG5lICdIQVNIJykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIkNvbmZpZ0hhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgICMgZ2V0IHRoZSBkaXJlY3RvcnkgbmFtZQogICAgbXkgJERpck5hbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLicvS2VybmVsL1N5c3RlbS9TdXBwb3J0Lyc7CiAgICAjIHJlYWQgYWxsIGF2YWlsaWJsZSBtb2R1bGVzIGluIEBMaXN0CiAgICBteSBATGlzdCA9IGdsb2IoJERpck5hbWUuIi8qLnBtIik7CiAgICBmb3JlYWNoIG15ICRGaWxlIChATGlzdCkgewogICAgICAgICMgcmVtb3ZlIC5wbQogICAgICAgICRGaWxlID1+IHMvXi4qXC8oLis/KVwucG0kLyQxLzsKICAgICAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6JEZpbGUiOwogICAgICAgICMgbG9hZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUgYW5kIGNoZWNrIGlmIGxvYWRhYmxlCiAgICAgICAgaWYgKCRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpKXsKICAgICAgICAgICAgIyBjcmVhdGUgbmV3IG9iamVjdAogICAgICAgICAgICBteSAkU3VwcG9ydE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoJXskU2VsZn0pOwogICAgICAgICAgICBpZiAoJFN1cHBvcnRPYmplY3QpIHsKICAgICAgICAgICAgICAgIG15ICRBcnJheVJlZiA9ICRTdXBwb3J0T2JqZWN0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKICAgICAgICAgICAgICAgIGlmICgkQXJyYXlSZWYgJiYgcmVmKCRBcnJheVJlZikgZXEgJ0FSUkFZJykgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtDb25maWdIYXNofS0+eyRGaWxlfSA9ICRBcnJheVJlZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBTdXBwb3J0SW5mb0dldCgpCgpnZXQgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIHN1cHBvcnQgaW5mb3JtYXRpb24uCgogICAgJFN1cHBvcnQtPlN1cHBvcnRJbmZvR2V0KAogICAgICAgIERhdGFIYXNoID0+ICREYXRhSGFzaCwKICAgICAgICBJbnB1dEhhc2ggPT4gJElucHV0SGFzaCwKICAgICk7Cgo9Y3V0CgpzdWIgU3VwcG9ydEluZm9HZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KERhdGFIYXNoIElucHV0SGFzaCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgY2hlY2sgaWYgJERhdGFIYXNoIGFuZCAkSW5wdXRIYXNoIG5lIGEgSGFzaFJlZgogICAgaWYgKHJlZigkUGFyYW17RGF0YUhhc2h9KSBuZSAnSEFTSCcgfHwgcmVmKCRQYXJhbXtJbnB1dEhhc2h9KSBuZSAnSEFTSCcpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJEYXRhSGFzaCBhbmQgSW5wdXRIYXNoIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgdGhlIGRpcmVjdG9yeSBuYW1lCiAgICBteSAkRGlyTmFtZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykuJy9LZXJuZWwvU3lzdGVtL1N1cHBvcnQvJzsKCiAgICAjIHJlYWQgYWxsIGF2YWlsaWJsZSBtb2R1bGVzIGluIEBMaXN0CiAgICBteSBATGlzdCA9IGdsb2IoJERpck5hbWUuIi8qLnBtIik7CiAgICBmb3JlYWNoIG15ICRGaWxlIChATGlzdCkgewogICAgICAgICMgcmVtb3ZlIC5wbQogICAgICAgICRGaWxlID1+IHMvXi4qXC8oLis/KVwucG0kLyQxLzsKICAgICAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6JEZpbGUiOwogICAgICAgICMgbG9hZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUgYW5kIGNoZWNrIGlmIGxvYWRhYmxlCiAgICAgICAgaWYgKCRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpKXsKICAgICAgICAgICAgIyBjcmVhdGUgbmV3IG9iamVjdAogICAgICAgICAgICBteSAkU3VwcG9ydE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoJXskU2VsZn0pOwogICAgICAgICAgICBpZiAoJFN1cHBvcnRPYmplY3QgJiYgJFBhcmFte0lucHV0SGFzaH0tPnskRmlsZX0pIHsKICAgICAgICAgICAgICAgIG15ICRBcnJheVJlZiA9ICRTdXBwb3J0T2JqZWN0LT5TdXBwb3J0SW5mb0dldCgKICAgICAgICAgICAgICAgICAgICBNb2R1bGVJbnB1dEhhc2ggPT4gJFBhcmFte0lucHV0SGFzaH0tPnskRmlsZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgIyBjaGVjayBpZiByZXR1cm4gdmFsdWUgaXMgdmFsaWQgYSBhcnJheXJlZgogICAgICAgICAgICAgICAgaWYgKEB7JEFycmF5UmVmfSkgewogICAgICAgICAgICAgICAgICAgIG15ICRTdHJ1Y3R1cmVPSyA9IDE7CiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiB0aGUgYXJyYXlyZWYgaW5jbHVkZXMgb25seSB2YWxpZCBoYXNocmVmcwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJEVsZW1lbnQgKEB7JEFycmF5UmVmfSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmKCRFbGVtZW50KSBuZSAnSEFTSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTdHJ1Y3R1cmVPSyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRTdHJ1Y3R1cmVPSyBlcSAiMSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0RhdGFIYXNofS0+eyRGaWxlfSA9ICRBcnJheVJlZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKZ2V0IGEgaGFzaCByZWZlcmVuY2Ugd2l0aCBwb3NzaWJpbGl0eSBjaGVja3MuCgogICAgbXkgJExpc3QgPSAkU3VwcG9ydC0+QWRtaW5DaGVja3NHZXQoRGF0YUhhc2ggPT4gJERhdGFIYXNoKTsKCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoRGF0YUhhc2gpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNoZWNrIGlmICREYXRhSGFzaCBuZSBhIEhhc2hSZWYKICAgIGlmIChyZWYoJFBhcmFte0RhdGFIYXNofSkgbmUgJ0hBU0gnKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiRGF0YUhhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgICMgZ2V0IHRoZSBkaXJlY3RvcnkgbmFtZQogICAgbXkgJERpck5hbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLicvS2VybmVsL1N5c3RlbS9TdXBwb3J0Lyc7CgogICAgIyByZWFkIGFsbCBhdmFpbGlibGUgbW9kdWxlcyBpbiBATGlzdAogICAgbXkgQExpc3QgPSBnbG9iKCREaXJOYW1lLiIvKi5wbSIpOwogICAgZm9yZWFjaCBteSAkRmlsZSAoQExpc3QpIHsKICAgICAgICAjIHJlbW92ZSAucG0KICAgICAgICAkRmlsZSA9fiBzL14uKlwvKC4rPylcLnBtJC8kMS87CiAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OiRGaWxlIjsKICAgICAgICAjIGxvYWQgbW9kdWxlICRHZW5lcmljTW9kdWxlIGFuZCBjaGVjayBpZiBsb2FkYWJsZQogICAgICAgIGlmICgkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSl7CiAgICAgICAgICAgICMgY3JlYXRlIG5ldyBvYmplY3QKICAgICAgICAgICAgbXkgJFN1cHBvcnRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KCV7JFNlbGZ9KTsKICAgICAgICAgICAgaWYgKCRTdXBwb3J0T2JqZWN0KSB7CiAgICAgICAgICAgICAgICBteSAkQXJyYXlSZWYgPSAkU3VwcG9ydE9iamVjdC0+QWRtaW5DaGVja3NHZXQoKTsKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgcmV0dXJuIHZhbHVlIGlzIHZhbGlkIGEgYXJyYXlyZWYKICAgICAgICAgICAgICAgIGlmIChAeyRBcnJheVJlZn0pIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3RydWN0dXJlT0sgPSAxOwogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlIGFycmF5cmVmIGluY2x1ZGVzIG9ubHkgdmFsaWQgaGFzaHJlZnMKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRFbGVtZW50IChAeyRBcnJheVJlZn0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZigkRWxlbWVudCkgbmUgJ0hBU0gnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RydWN0dXJlT0sgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkU3RydWN0dXJlT0sgZXEgIjEiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhSGFzaH0tPnskRmlsZX0gPSAkQXJyYXlSZWY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFhNTFN0cmluZ0NyZWF0ZSgpCgpyZXR1cm5zIGEgc3RyaW5nIHdpdGggeG1sLgoKICAgIG15ICRMaXN0ID0gJFN1cHBvcnQtPlhNTFN0cmluZ0NyZWF0ZShEYXRhID0+ICREYXRhKTsKCjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KPFN1cHBvcnRJbmZvPgogICAgPEhhcmR3YXJlPgogICAgICAgIDxNZW1vcnlTd2FwQ2hlY2s+CiAgICAgICAgICAgIDxDaGVjaz5PSzwvQ2hlY2s+CiAgICAgICAgICAgIDxDb21tZW50PlRoZSBIb3N0IFN5c3RlbSBoYXMgMTAxMSBNQiBNZW1vcnkgdG90YWwuIDEwOCBNQiBNZW1vcnkgZnJlZS4gNjQzIE1CIFN3YXAgdG90YWwuIDY0MyBNQiBTd2FwIGZyZWUuIDwvQ29tbWVudD4KICAgICAgICAgICAgPERlc2NyaXB0aW9uPkEgTWVtb3J5IENoZWNrLiBXZSB0cnkgdG8gZmluZCBvdXQgaWYgU3dhcEZyZWUgOiBTd2FwVG90YWwgJmx0OyA2MCAlIG9yIGlmIG1vcmUgdGhhbiAyMDAgTUIgU3dhcCBpcyB1c2VkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgIDxOYW1lPk1lbW9yeSBTd2FwIENoZWNrPC9OYW1lPgogICAgICAgICAgICA8S2V5Pk1lbW9yeVN3YXBDaGVjazwvS2V5PgogICAgICAgIDwvTWVtb3J5U3dhcENoZWNrPgogICAgPC9IYXJkd2FyZT4KPC9TdXBwb3J0SW5mbz4KCj1jdXQKCnN1YiBYTUxTdHJpbmdDcmVhdGUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KERhdGFIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlZigkUGFyYW17RGF0YUhhc2h9KSBuZSAnSEFTSCcpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJEYXRhSGFzaCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRYTUxIYXNoID0gW107CiAgICBmb3JlYWNoIG15ICRNb2R1bGUgKGtleXMgJXskUGFyYW17RGF0YUhhc2h9fSkgewogICAgICAgIGZvcmVhY2ggbXkgJERhdGFIYXNoUm93IChAeyRQYXJhbXtEYXRhSGFzaH0tPnskTW9kdWxlfX0pIHsKICAgICAgICAgICAgbXkgJERhdGEgPSB7fTsKICAgICAgICAgICAgZm9yZWFjaCBteSAkRWxlbWVudCAoa2V5cyAleyREYXRhSGFzaFJvd30pIHsKICAgICAgICAgICAgICAgIGlmICgkRWxlbWVudCBlcSAnS2V5JykgewogICAgICAgICAgICAgICAgICAgIG5leHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjIHJlbW92ZSBuZXdsaW5lcwogICAgICAgICAgICAgICAgJERhdGFIYXNoUm93LT57JEVsZW1lbnR9ID1+IHMvXDAxNVwwMTJ8XDAxMnxcMDE1Ly9nOwogICAgICAgICAgICAgICAgJERhdGEtPnskRWxlbWVudH0tPlsxXS0+e0NvbnRlbnR9ID0gJERhdGFIYXNoUm93LT57JEVsZW1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRYTUxIYXNoLT5bMV0tPntTdXBwb3J0SW5mb30tPlsxXS0+eyRNb2R1bGV9LT5bMV0tPnskRGF0YUhhc2hSb3ctPntLZXl9fS0+WzFdID0gJERhdGE7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRYTUxTdHJpbmcgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2gyWE1MKEB7JFhNTEhhc2h9KTsKCiAgICByZXR1cm4gJFhNTFN0cmluZzsKfQoKc3ViIFRhclBhY2thZ2VXcml0ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KE91dHB1dE5hbWUgT3V0cHV0UGF0aCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBta2RpciAoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKS4iL3Zhci90bXAvc3VwcG9ydCIpOwoKICAgICRTZWxmLT57VGFyT2JqZWN0fSA9IEFyY2hpdmU6OlRhci0+bmV3KCk7CgogICAgaWYgKCRQYXJhbXtEaXJOYW1lfSkgewogICAgICAgICMgYWRkIGZpbGVzIHRvIHRoZSB0YXIgYXJjaGl2ZQogICAgICAgICRTZWxmLT57VGFyT2JqZWN0fS0+YWRkX2ZpbGVzKCRTZWxmLT5SZWFkVHJlZShUcmVlID0+ICRQYXJhbXtEaXJOYW1lfSkpIG9yIHJldHVybjsKICAgIH0gZWxzaWYgKCRQYXJhbXtGaWxlTmFtZX0pIHsKICAgICAgICAjIGFkZCBmaWxlcyB0byB0aGUgdGFyIGFyY2hpdmUKICAgICAgICAkU2VsZi0+e1Rhck9iamVjdH0tPmFkZF9maWxlcygkUGFyYW17RmlsZU5hbWV9KSBvciByZXR1cm47CiAgICB9CiAgICAjIHdyaXRlIHRhciBhcmNoaXYgdG8gT1RSU19IT01FL3Zhci90bXAvb3Ryc2tlcm5lbC50YXIKICAgICRTZWxmLT57VGFyT2JqZWN0fS0+d3JpdGUoJFBhcmFte091dHB1dFBhdGh9LiRQYXJhbXtPdXRwdXROYW1lfSwgMCkgb3IgcmV0dXJuOyAjIEFyY2hpdmUgc2NocmVpYmVuCgogICAgcmV0dXJuICRQYXJhbXtPdXRwdXROYW1lfTsKfQoKc3ViIFJlYWRUcmVlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhUcmVlKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJGFrdGRpciA9ICRQYXJhbXtUcmVlfTsKICAgIGxvY2FsICpESVI7CiAgICBteSBAZmxpc3QgID0gKCk7CgogICAgb3BlbmRpcihESVIsJGFrdGRpcikgb3IgZG8gewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsICJFcnJvciByZWFkaW5nIGRpcmVjdG9yeSAnJGFrdGRpcic6ICRfISIpOwogICAgICAgIHJldHVybjsKICAgIH07CgogICAgd2hpbGUobXkgJGVudHJ5ID0gcmVhZGRpcihESVIpKSB7CiAgICAgICAgbmV4dCBpZiAkZW50cnkgZXEgIi4iIHx8ICRlbnRyeSBlcSAiLi4iOwoKICAgICAgICBpZigtZCAkYWt0ZGlyLiIvIi4kZW50cnkpIHsKICAgICAgICAgICAgcHVzaCBAZmxpc3QsICRTZWxmLT5SZWFkVHJlZShUcmVlID0+ICRha3RkaXIuIi8iLiRlbnRyeSk7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBmbGlzdCwkYWt0ZGlyLiIvIi4kZW50cnk7CiAgICB9CgogICAgY2xvc2VkaXIoRElSKTsKCiAgICByZXR1cm4gQGZsaXN0Owp9CgpzdWIgQ3JlYXRlUGFja2FnZVRvU2VuZCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KERhdGFIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJFhNTFN0cmluZyA9ICRTZWxmLT5YTUxTdHJpbmdDcmVhdGUoCiAgICAgICAgICAgIERhdGFIYXNoID0+ICRQYXJhbXtEYXRhSGFzaH0sCiAgICApOwogICAgbXkgJFRtcFhNTDsKICAgIG9wZW4gKCRUbXBYTUwsICc+JywgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKS4iL3Zhci90bXAvc3VwcG9ydC9jaGVjay54bWwiKTsKICAgIHByaW50ICRUbXBYTUwgJFhNTFN0cmluZzsKICAgIGNsb3NlICgkVG1wWE1MKTsKCiAgICAjIGFkZCBmaWxlcyB0byB0aGUgdGFyIGFyY2hpdmUKICAgICRTZWxmLT57VGFyT2JqZWN0fSA9IEFyY2hpdmU6OlRhci0+bmV3KCk7CiAgICAkU2VsZi0+e1Rhck9iamVjdH0tPmFkZF9maWxlcygkU2VsZi0+UmVhZFRyZWUoVHJlZSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLiIvdmFyL3RtcC9zdXBwb3J0LyIpKSBvciBkaWUgIkNvdWxkIG5vdCBhZGQ6ICRfISI7CiAgICAkU2VsZi0+e1Rhck9iamVjdH0tPndyaXRlKCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykuIi92YXIvdG1wL3N1cHBvcnQudGFyIiwgMCkgb3IgZGllICJDb3VsZCBub3Qgd3JpdGU6ICRfISI7ICMgQXJjaGl2ZSBzY2hyZWliZW4KCiAgICBteSAkR3ppcDsKICAgIG9wZW4gKCRHemlwLCAnPCcsICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykuIi92YXIvdG1wL3N1cHBvcnQudGFyIik7CiAgICBiaW5tb2RlKCRHemlwKTsKCiAgICAgICAgbXkgJFRtcEd6aXAgPSAnJzsKICAgICAgICB3aGlsZSAoPCRHemlwPikgewogICAgICAgICAgICAkVG1wR3ppcCAuPSAkXzsKICAgICAgICB9CiAgICBjbG9zZSAoJEd6aXApOwogICAgaWYgKCRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoIkNvbXByZXNzOjpabGliIikpIHsKICAgICAgICBteSAkR3pDb250ZW50ID0gQ29tcHJlc3M6OlpsaWI6Om1lbUd6aXAoJFRtcEd6aXApOwogICAgICAgIHJldHVybiAkR3pDb250ZW50OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRUbXBHemlwOwogICAgfQp9CgpzdWIgU3VwcG9ydFNlbmRJbmZvIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRNZXNzYWdlID0gIiI7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoU3VwcG9ydFN0cmluZykpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgc2VuZCBtYWlsIHRvIGdhdGV3YXkKICAgIGlmICgkU2VsZi0+e0VtYWlsT2JqZWN0fS0+U2VuZCgKICAgICAgICBGcm9tID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBZG1pbkVtYWlsJyksCiAgICAgICAgVG8gPT4gJ3N1cHBvcnRAb3Rycy5jb20nLAogICAgICAgIFN1YmplY3QgPT4gJ0N1c3RvbWVyIFN5c3RlbUluZm8gZnJvbScsCiAgICAgICAgVHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgQ2hhcnNldCA9PiAndXRmLTgnLAogICAgICAgIEJvZHkgPT4gJ0N1c3RvbWVyIFN1cHBvcnRJbmZvJywKICAgICAgICBMb29wID0+IDEsICMgbm90IHJlcXVpcmVkLCByZW1vdmVzIHNtdHAgZnJvbQogICAgICAgIEF0dGFjaG1lbnQgPT4gW3sKICAgICAgICBGaWxlbmFtZSAgICA9PiAiJFBhcmFte1N1cHBvcnRJRH0iLAogICAgICAgIENvbnRlbnQgICAgID0+ICIkUGFyYW17U3VwcG9ydFN0cmluZ30iLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAiYXBwbGljYXRpb24vdGFyLmd6IiwKICAgICAgICAgICAgfV0sCiAgICAgICAgKSkgewogICAgICAgICAgICAkTWVzc2FnZSA9ICJFbWFpbCBzZW50IHRvIHRoZSAoKG90cnMpKSBzdXBwb3J0IHRlYW0uXG4iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE1lc3NhZ2UgPSAnQ2FuXCd0IHNlbmQgZW1haWwgdG8gdGhlICgob3RycykpIHN1cHBvcnQgdGVhbSEnLiJcblxuIi4KICAgICAgICAgICAgIllvdSB3aWxsIGZvdW5kIHRoZSBvdHJzIHN5c3RlbSBpbmZvcm1hdGlvbiBwYWNrYWdlIGF0XG4iLgogICAgICAgICAgICAiSWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIE9UUlMgc3VwcG9ydCBzZXJ2aWNlcyBwbGVhc2Ugc2VuZCB0aGUgcGFja2FnZSB0byBzdXBwb3J0XEBvdHJzLmNvbSBvciBjYWxsXG4iLgogICAgICAgICAgICAib3VyIHN1cHBvcnQgdGVhbSBwZXIgcGhvbmUgdG8gcmV2aWV3IHRoZSBuZXh0IHN0ZXBcblxuIi4KICAgICAgICAgICAgIiBNb3JlIGFib3V0IE9UUlMgc3VwcG9ydCBvciBmYWNlLXRvLWZhY2UgY29udGFjdCBpbmZvcm1hdGlvbiB5b3Ugd2lsbCBmb3VuZCBhdFxuIi4KICAgICAgICAgICAgJ2h0dHA6Ly93d3cub3Rycy5jb20vJy4iXG5cbiI7CiAgICB9CiAgICByZXR1cm4gJE1lc3NhZ2U7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS43ICQgJERhdGU6IDIwMDcvMTAvMDIgMTI6NDI6MDQgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERhdGFiYXNlLnBtLHYgMS42IDIwMDcvMDkvMjcgMTA6MDg6MzIgc3IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTsKCnVzZSBzdHJpY3Q7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjYgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2UgLSBnbG9iYWwgc3lzdGVtIGluZm9ybWF0aW9ucwoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9ucyB0byBhIHJ1bm5pbmcgT1RSUyBob3N0LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgRGF0YWJhc2UgaW5mbyBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCiAgICAkU3lzdGVtSW5mb09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgREJPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBTdXBwb3J0Q29uZmlnQXJyYXlHZXQoKQoKcmV0dXJuIGFuIGFycmF5IHJlZmVyZW5jZSB3aXRoIHJlcXVpcmVkIGNvbmZpZyBpbmZvcm1hdGlvbi4KCiAgICAkQXJyYXlSZWYgPSAkU3VwcG9ydC0+U3VwcG9ydENvbmZpZ0FycmF5R2V0KCk7CgogICAgbXkgJENvbmZpZ0FycmF5ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdUaWNrZXREdW1wJywKICAgICAgICAgICAgTmFtZSA9PiAnRHVtcCBUaWNrZXRzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIGhvdyBtYW55IGxhdGVzdCBUaWNrZXRzIHdlIHNodXQgZHVtcD8nLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZWxlY3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWxsID0+ICdBbGwnLAogICAgICAgICAgICAgICAgICAgIDAgPT4gJzAnLAogICAgICAgICAgICAgICAgICAgIDEwID0+ICdMYXN0IDEwJywKICAgICAgICAgICAgICAgICAgICAxMDAgPT4gJ0xhc3QgMTAwJywKICAgICAgICAgICAgICAgICAgICAxMDAwID0+ICdMYXN0IDEwMDAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdBcGFjaGVIb21lJywKICAgICAgICAgICAgTmFtZSA9PiAnQXBhY2hlIEhvbWUgRGlyZWN0b3J5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIHRoZSBwYXRoIHRvIHRoZSBBcGFjaGUgaG9tZSBkaXJlY3RvcnkgKC9ldGMvYXBhY2hlMiknLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgPT4gNDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgU3VwcG9ydENvbmZpZ0FycmF5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGRhdGFiYXNlcwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgY3JlYXRlIGNvbmZpZyBhcnJheQogICAgbXkgJENvbmZpZ0FycmF5ID1bXTsKIyAgICBteSAkQ29uZmlnQXJyYXkgPSBbCiMgICAgICAgIHsKIyAgICAgICAgICAgIEtleSA9PiAnVGlja2V0RHVtcCcsCiMgICAgICAgICAgICBOYW1lID0+ICdEdW1wIFRpY2tldHMnLAojICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIGhvdyBtYW55IGxhdGVzdCBUaWNrZXRzIHdlIHNodXQgZHVtcD8nLAojICAgICAgICAgICBJbnB1dCA9PiB7CiMgICAgICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0JywKIyAgICAgICAgICAgICAgICBEYXRhID0+IHsKIyAgICAgICAgICAgICAgICAgIEFsbCA9PiAnQWxsJywKIyAgICAgICAgICAgICAgICAgICAwID0+ICcwJywKIyAgICAgICAgICAgICAgICAgICAgMTAgPT4gJ0xhc3QgMTAnLAojICAgICAgICAgICAgICAgICAgICAxMDAgPT4gJ0xhc3QgMTAwJywKIyAgICAgICAgICAgICAgICAgICAxMDAwID0+ICdMYXN0IDEwMDAnLAojICAgICAgICAgICAgICAgIH0sCiMgICAgICAgICAgICB9LAojICAgICAgICB9LAojICAgIF07CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdXNlZCBkYXRhYmFzZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgdHJ5IHRvIGZpbmQgb3V0IHdoaWNoIHRpY2tldCBkYXRhYmFzZSBpcyBjb25maWd1cmVkCiAgICBteSAkRGF0YWJhc2VUeXBlID0gJFNlbGYtPntEQk9iamVjdH0tPnsnREI6OlR5cGUnfTsKCiAgICAjIHRyeSB0byBnZXQgYXZhaWxpYmxlIG1vZHVsZXMgYW5kIHRoZSBkaXJlY3RvcnkgbmFtZQogICAgbXkgJERpck5hbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLiIvS2VybmVsL1N5c3RlbS9TdXBwb3J0L0RhdGFiYXNlIjsKICAgICMgcmVhZCBhbGwgYXZhaWxpYmxlIG1vZHVsZXMgaW4gQExpc3QKICAgIG15IEBMaXN0ID0gZ2xvYigkRGlyTmFtZS4iLyoucG0iKTsKICAgIGZvcmVhY2ggbXkgJEZpbGUgKEBMaXN0KSB7CiAgICAgICAgIyByZW1vdmUgLnBtCiAgICAgICAgJEZpbGUgPX4gcy9eLipcLyguKz8pXC5wbSQvJDEvOwogICAgICAgIGlmICgkRGF0YWJhc2VUeXBlID1+IC9PREJDL2kpIHsKICAgICAgICAgICAgJERhdGFiYXNlVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEYXRhYmFzZTo6VHlwZScpOwogICAgICAgIH0KICAgICAgICBpZiAoJERhdGFiYXNlVHlwZSBlcSAkRmlsZSkgewogICAgICAgICAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2U6OiRGaWxlIjsKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZSAkR2VuZXJpY01vZHVsZSBhbmQgY2hlY2sgaWYgbG9hZGFibGUKICAgICAgICAgICAgaWYgKCRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpKXsKICAgICAgICAgICAgICAgICMgY3JlYXRlIG5ldyBvYmplY3QKICAgICAgICAgICAgICAgIG15ICRTdXBwb3J0T2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldygleyRTZWxmfSk7CiAgICAgICAgICAgICAgICBpZiAoJFN1cHBvcnRPYmplY3QpIHsKICAgICAgICAgICAgICAgICAgICBteSAkQXJyYXlSZWYgPSAkU3VwcG9ydE9iamVjdC0+U3VwcG9ydENvbmZpZ0FycmF5R2V0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBcnJheVJlZiAmJiByZWYoJEFycmF5UmVmKSBlcSAnQVJSQVknKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggKEB7JENvbmZpZ0FycmF5fSwgQHskQXJyYXlSZWZ9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAjIHJldHVybiBjb25maWcgYXJyYXkKICAgIHJldHVybiAkQ29uZmlnQXJyYXk7Cn0KCj1pdGVtIFN1cHBvcnRJbmZvR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBzdXBwb3J0IGluZm9ybWF0aW9uLgoKJERhdGFiYXNlQXJyYXkgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnTGludXgnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKCj1jdXQKCnN1YiBTdXBwb3J0SW5mb0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoTW9kdWxlSW5wdXRIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlZigkUGFyYW17TW9kdWxlSW5wdXRIYXNofSkgbmUgJ0hBU0gnKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTW9kdWxlSW5wdXRIYXNoIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGRhdGFiYXNlcwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygKIyAgICAgICAgVHlwZSA9PiAkUGFyYW17TW9kdWxlSW5wdXRIYXNofS0+e1R5cGV9IHx8ICcnLAojICAgICk7CiMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCBpbmZvcm1hdGlvbiBhYm91dCB1c2VkIGRhdGFiYXNlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyB0cnkgdG8gZmluZCBvdXQgd2hpY2ggdGlja2V0IGRhdGFiYXNlIGlzIGNvbmZpZ3VyZWQKICAgIG15ICREYXRhYmFzZVR5cGUgPSAkU2VsZi0+e0RCT2JqZWN0fS0+eydEQjo6VHlwZSd9OwoKICAgICMgdHJ5IHRvIGdldCBhdmFpbGlibGUgbW9kdWxlcyBhbmQgdGhlIGRpcmVjdG9yeSBuYW1lCiAgICBteSAkRGlyTmFtZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykuIi9LZXJuZWwvU3lzdGVtL1N1cHBvcnQvRGF0YWJhc2UiOwogICAgIyByZWFkIGFsbCBhdmFpbGlibGUgbW9kdWxlcyBpbiBATGlzdAogICAgbXkgQExpc3QgPSBnbG9iKCREaXJOYW1lLiIvKi5wbSIpOwogICAgZm9yZWFjaCBteSAkRmlsZSAoQExpc3QpIHsKICAgICAgICAjIHJlbW92ZSAucG0KICAgICAgICAkRmlsZSA9fiBzL14uKlwvKC4rPylcLnBtJC8kMS87CiAgICAgICAgaWYgKCREYXRhYmFzZVR5cGUgPX4gL09EQkMvaSkgewogICAgICAgICAgICAkRGF0YWJhc2VUeXBlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RhdGFiYXNlOjpUeXBlJyk7CiAgICAgICAgfQogICAgICAgIGlmICgkRGF0YWJhc2VUeXBlIGVxICRGaWxlKSB7CiAgICAgICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gIktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTo6JEZpbGUiOwogICAgICAgICAgICAjIGxvYWQgbW9kdWxlICRHZW5lcmljTW9kdWxlIGFuZCBjaGVjayBpZiBsb2FkYWJsZQogICAgICAgICAgICBpZiAoJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkpewogICAgICAgICAgICAgICAgIyBjcmVhdGUgbmV3IG9iamVjdAogICAgICAgICAgICAgICAgbXkgJFN1cHBvcnRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KCV7JFNlbGZ9KTsKICAgICAgICAgICAgICAgIGlmICgkU3VwcG9ydE9iamVjdCkgewogICAgICAgICAgICAgICAgICAgIG15ICRBcnJheVJlZiA9ICRTdXBwb3J0T2JqZWN0LT5TdXBwb3J0SW5mb0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlSW5wdXRIYXNoID0+ICRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBcnJheVJlZiAmJiByZWYoJEFycmF5UmVmKSBlcSAnQVJSQVknKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggKEB7JERhdGFBcnJheX0sIEB7JEFycmF5UmVmfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkRGF0YUFycmF5Owp9Cgo9aXRlbSBBZG1pbkNoZWNrc0dldCgpCgpyZXR1cm5zIGEgYXJyYXkgcmVmZXJlbmNlIHdpdGggQWRtaW5DaGVja3MgaW5mb3JtYXRpb24uCgokRGF0YWJhc2VBcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnb3BlblNVU0UgMTAuMicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICBdOwoKPWN1dAoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGRhdGFiYXNlcwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygpOwojICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdXNlZCBkYXRhYmFzZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgICMgdHJ5IHRvIGZpbmQgb3V0IHdoaWNoIHRpY2tldCBkYXRhYmFzZSBpcyBjb25maWd1cmVkCiAgICBteSAkRGF0YWJhc2VUeXBlID0gJFNlbGYtPntEQk9iamVjdH0tPnsnREI6OlR5cGUnfTsKICAgICMgdHJ5IHRvIGdldCBhdmFpbGlibGUgbW9kdWxlcyBhbmQgdGhlIGRpcmVjdG9yeSBuYW1lCiAgICBteSAkRGlyTmFtZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykuIi9LZXJuZWwvU3lzdGVtL1N1cHBvcnQvRGF0YWJhc2UiOwogICAgIyByZWFkIGFsbCBhdmFpbGlibGUgbW9kdWxlcyBpbiBATGlzdAogICAgbXkgQExpc3QgPSBnbG9iKCREaXJOYW1lLiIvKi5wbSIpOwogICAgZm9yZWFjaCBteSAkRmlsZSAoQExpc3QpIHsKICAgICAgICAjIHJlbW92ZSAucG0KICAgICAgICAkRmlsZSA9fiBzL14uKlwvKC4rPylcLnBtJC8kMS87CiAgICAgICAgaWYgKCREYXRhYmFzZVR5cGUgPX4gL09EQkMvaSkgewogICAgICAgICAgICAkRGF0YWJhc2VUeXBlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RhdGFiYXNlOjpUeXBlJyk7CiAgICAgICAgfQogICAgICAgIGlmICgkRGF0YWJhc2VUeXBlID1+IC9eJEZpbGUvaSkgewogICAgICAgICAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2U6OiRGaWxlIjsKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZSAkR2VuZXJpY01vZHVsZSBhbmQgY2hlY2sgaWYgbG9hZGFibGUKICAgICAgICAgICAgaWYgKCRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpKXsKICAgICAgICAgICAgICAgICMgY3JlYXRlIG5ldyBvYmplY3QKICAgICAgICAgICAgICAgIG15ICRTdXBwb3J0T2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldygleyRTZWxmfSk7CiAgICAgICAgICAgICAgICBpZiAoJFN1cHBvcnRPYmplY3QpIHsKICAgICAgICAgICAgICAgICAgICBteSAkQXJyYXlSZWYgPSAkU3VwcG9ydE9iamVjdC0+QWRtaW5DaGVja3NHZXQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFycmF5UmVmICYmIHJlZigkQXJyYXlSZWYpIGVxICdBUlJBWScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgQHskQXJyYXlSZWZ9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfQoKICAgIHJldHVybiAkRGF0YUFycmF5Owp9Cgo9aXRlbSBDaGVjaygpCgpyZXR1cm5zIGEgaGFzaCByZWZlcmVuY2Ugd2l0aCBDaGVjayBpbmZvcm1hdGlvbi4KCiRDaGVja0hhc2ggPT4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9OwoKIyBjaGVjayBpZiBjb25maWcgdmFsdWUgYXZhaWxpYmxlCmlmICgkUGFyYW17VHlwZX0pIHsKICAgIHByaW50IFNUREVSUiAiVFlQRTogIiAuICRQYXJhbXtUeXBlfTsKfQoKPWN1dAoKc3ViIENoZWNrIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRSZXR1cm5IYXNoID0ge307CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCReTyA9fiAvbGludXgvIHx8IC91bml4LyB8fCAvbmV0YnNkLyB8fCAvZnJlZWJzZC8gfHwgL0Rhcndpbi8pIHsKCiAgICB9CiAgICBlbHNpZiAoJF5PID1+IC93aW4vaSkgeyMgVE9ETyAvIEF1c2dhYmUgdW50ZXIgV2luZG93cyBub2NoIHBydWVmZW4KCiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS42ICQgJERhdGU6IDIwMDcvMDkvMjcgMTA6MDg6MzIgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9PUy5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE9TLnBtLHYgMS40IDIwMDcvMTAvMDQgMDc6MDI6NDggc3IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpPUzsKCnVzZSBzdHJpY3Q7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjQgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6T1MgLSBnbG9iYWwgc3lzdGVtIGluZm9ybWF0aW9ucwoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9ucyB0byBhIHJ1bm5pbmcgT1RSUyBob3N0LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgT1MgaW5mbyBvYmplY3QKCnVzZSBLZXJuZWw6OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7Cm15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7Cm15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKKTsKCiRTeXN0ZW1JbmZvT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6Ok9TLT5uZXcoCiAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAopOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBTdXBwb3J0Q29uZmlnQXJyYXlHZXQoKQoKcmV0dXJuIGFuIGFycmF5IHJlZmVyZW5jZSB3aXRoIHJlcXVpcmVkIGNvbmZpZyBpbmZvcm1hdGlvbi4KCiAgICAkQXJyYXlSZWYgPSAkU3VwcG9ydC0+U3VwcG9ydENvbmZpZ0FycmF5R2V0KCk7CgogICAgbXkgJENvbmZpZ0FycmF5ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdUaWNrZXREdW1wJywKICAgICAgICAgICAgTmFtZSA9PiAnRHVtcCBUaWNrZXRzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIGhvdyBtYW55IGxhdGVzdCBUaWNrZXRzIHdlIHNodXQgZHVtcD8nLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZWxlY3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWxsID0+ICdBbGwnLAogICAgICAgICAgICAgICAgICAgIDAgPT4gJzAnLAogICAgICAgICAgICAgICAgICAgIDEwID0+ICdMYXN0IDEwJywKICAgICAgICAgICAgICAgICAgICAxMDAgPT4gJ0xhc3QgMTAwJywKICAgICAgICAgICAgICAgICAgICAxMDAwID0+ICdMYXN0IDEwMDAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdBcGFjaGVIb21lJywKICAgICAgICAgICAgTmFtZSA9PiAnQXBhY2hlIEhvbWUgRGlyZWN0b3J5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIHRoZSBwYXRoIHRvIHRoZSBBcGFjaGUgaG9tZSBkaXJlY3RvcnkgKC9ldGMvYXBhY2hlMiknLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgPT4gNDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgU3VwcG9ydENvbmZpZ0FycmF5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNyZWF0ZSBjb25maWcgYXJyYXkKICAgIG15ICRDb25maWdBcnJheSA9IFsKCiAgICBdOwogICAgIyByZXR1cm4gY29uZmlnIGFycmF5CiAgICByZXR1cm4gJENvbmZpZ0FycmF5Owp9Cgo9aXRlbSBTdXBwb3J0SW5mb0dldCgpCgpyZXR1cm5zIGEgYXJyYXkgcmVmZXJlbmNlIHdpdGggc3VwcG9ydCBpbmZvcm1hdGlvbi4KCiRPU0FycmF5ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdvcGVuU1VTRSAxMC4yJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07Cgo9Y3V0CgpzdWIgU3VwcG9ydEluZm9HZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGFBcnJheSA9IFtdOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KE1vZHVsZUlucHV0SGFzaCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmIChyZWYoJFBhcmFte01vZHVsZUlucHV0SGFzaH0pIG5lICdIQVNIJykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk1vZHVsZUlucHV0SGFzaCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwogICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPkRpc3RyaWJ1dGlvbkNoZWNrKAogICAgICAgIFR5cGUgPT4gJFBhcmFte01vZHVsZUlucHV0SGFzaH0tPntUeXBlfSB8fCAnJywKICAgICk7CiAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwogICAgJE9uZUNoZWNrID0gJFNlbGYtPktlcm5lbEluZm9DaGVjaygKICAgICAgICBUeXBlID0+ICRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9LT57VHlwZX0gfHwgJycsCiAgICApOwogICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIEFkbWluQ2hlY2tzIGluZm9ybWF0aW9uLgoKJE9TQXJyYXkgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnTGludXgnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSBARGF0YUFycmF5ID0gKCk7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiAgICBteSAkT25lQ2hlY2sgPSAkU2VsZi0+RGlzdHJpYnV0aW9uQ2hlY2soKTsKICAgIHB1c2ggKEBEYXRhQXJyYXksICRPbmVDaGVjayk7CgogICAgJE9uZUNoZWNrID0gJFNlbGYtPktlcm5lbEluZm9DaGVjaygpOwogICAgcHVzaCAoQERhdGFBcnJheSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gXEBEYXRhQXJyYXk7Cn0KCj1pdGVtIERpc3RyaWJ1dGlvbkNoZWNrKCkKCnJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIERpc3RyaWJ1dGlvbkNoZWNrIGluZm9ybWF0aW9uLgoKJERpc3RyaWJ1dGlvbkNoZWNrID0+CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfTsKCiMgY2hlY2sgaWYgY29uZmlnIHZhbHVlIGF2YWlsaWJsZQppZiAoJFBhcmFte1R5cGV9KSB7CiAgICBwcmludCBTVERFUlIgIlRZUEU6ICIgLiAkUGFyYW17VHlwZX07Cn0KCj1jdXQKCnN1YiBEaXN0cmlidXRpb25DaGVjayB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICgkXk8gPX4gLyhsaW51eHx1bml4fG5ldGJzZHxmcmVlYnNkfGRhcndpbikvaSkgewogICAgICAgIG15ICRUbXBMaW5lID0gIiI7CiAgICAgICAgbXkgJERpc3RyaWJ1dGlvbjsKICAgICAgICBpZiAob3BlbigkRGlzdHJpYnV0aW9uLCAnPCcsICIvZXRjL2lzc3VlIikpIHsKICAgICAgICAgICAgd2hpbGUoPCREaXN0cmlidXRpb24+KSB7CiAgICAgICAgICAgICAgICAkVG1wTGluZSAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSgkRGlzdHJpYnV0aW9uKTsKICAgICAgICAgICAgaWYoJFRtcExpbmUpIHsKICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXFwuKi8vOwogICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9cbi8vZzsKICAgICAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnRGlzdHJpYnV0aW9uQ2hlY2snLAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0Rpc3RyaWJ1dGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIlNob3dzIHRoZSB1c2VkIGRpc3RyaWJ1dGlvbi4gXG4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIlwiJFRtcExpbmVcIiBpcyB1c2VkLiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgS2V5ID0+ICdEaXN0cmlidXRpb25DaGVjaycsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEaXN0cmlidXRpb24nLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIlNob3dzIHRoZSB1c2VkIGRpc3RyaWJ1dGlvbi4gXG4iLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAiQ2FutFwndCBmaW5kIC9ldGMvaXNzdWUuLi4gXG4iLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ0ZhaWxlZCcsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCReTyA9fiAvd2luL2kpIHsjIFRPRE8gLyBBdXNnYWJlIHVudGVyIFdpbmRvd3Mgbm9jaCBwcnVlZmVuCiAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgIEtleSA9PiAnRGlzdHJpYnV0aW9uQ2hlY2snLAogICAgICAgICAgICBOYW1lID0+ICdEaXN0cmlidXRpb24nLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU2hvd3MgdGhlIHVzZWQgZGlzdHJpYnV0aW9uLiBcbiIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiReTyBpcyB1c2VkLiIsCiAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKc3ViIEtlcm5lbEluZm9DaGVjayB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICgkXk8gPX4gLyhsaW51eHx1bml4fG5ldGJzZHxmcmVlYnNkfGRhcndpbikvaSkgewogICAgICAgIG15ICRUbXBMaW5lID0gIiI7CiAgICAgICAgbXkgJEtlcm5lbEluZm87CiAgICAgICAgaWYgKG9wZW4oJEtlcm5lbEluZm8sICJ1bmFtZSAtYSB8IikpIHsKICAgICAgICAgICAgd2hpbGUoPCRLZXJuZWxJbmZvPikgewogICAgICAgICAgICAgICAgJFRtcExpbmUgLj0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoJEtlcm5lbEluZm8pOwogICAgICAgICAgICBpZigkVG1wTGluZSkgewogICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9ccyskLy9nOwogICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9eXHMrLy9nOwogICAgICAgICAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdLZXJuZWxWZXJzaW9uQ2hlY2snLAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0tlcm5lbCBWZXJzaW9uJywKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU2hvd3MgdGhlIHVzZWQgS2VybmVsIHZlcnNpb24uIFxuIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICJcIiRUbXBMaW5lXCIgaXMgdXNlZC4iLAogICAgICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgIEtleSA9PiAnS2VybmVsVmVyc2lvbkNoZWNrJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0tlcm5lbCBWZXJzaW9uJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJTaG93cyB0aGUgdXNlZCBLZXJuZWwgdmVyc2lvbi4gXG4iLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAiQ2FutFwndCBleGVjdXRlIHVuYW1lIC1hLi4uIFxuIiwKICAgICAgICAgICAgICAgIENoZWNrID0+ICdGYWlsZWQnLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICgkXk8gPX4gL3dpbi9pKSB7IyBUT0RPIC8gQXVzZ2FiZSB1bnRlciBXaW5kb3dzIG5vY2ggcHJ1ZWZlbgoKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjQgJCAkRGF0ZTogMjAwNy8xMC8wNCAwNzowMjo0OCAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9Dcm9uLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQ3Jvbi5wbSx2IDEuMS4xLjEgMjAwNy8wNS8wNyAxODo0Nzo1NSBzciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkNyb247Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xLjEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpDcm9uIC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMgdG8gYSBydW5uaW5nIE9UUlMgaG9zdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIENyb24gaW5mbyBvYmplY3QKCiAgdXNlIEtlcm5lbDo6Q29uZmlnOwogIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgKTsKCiAgJFN5c3RlbUluZm9PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6Q3Jvbi0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFN1cHBvcnRDb25maWdBcnJheUdldCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggcmVxdWlyZWQgY29uZmlnIGluZm9ybWF0aW9uLgoKICAgICRBcnJheVJlZiA9ICRTdXBwb3J0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKICAgIAogICAgbXkgJENvbmZpZ0FycmF5ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdUaWNrZXREdW1wJywKICAgICAgICAgICAgTmFtZSA9PiAnRHVtcCBUaWNrZXRzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIGhvdyBtYW55IGxhdGVzdCBUaWNrZXRzIHdlIHNodXQgZHVtcD8nLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZWxlY3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWxsID0+ICdBbGwnLAogICAgICAgICAgICAgICAgICAgIDAgPT4gJzAnLAogICAgICAgICAgICAgICAgICAgIDEwID0+ICdMYXN0IDEwJywKICAgICAgICAgICAgICAgICAgICAxMDAgPT4gJ0xhc3QgMTAwJywKICAgICAgICAgICAgICAgICAgICAxMDAwID0+ICdMYXN0IDEwMDAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdBcGFjaGVIb21lJywKICAgICAgICAgICAgTmFtZSA9PiAnQXBhY2hlIEhvbWUgRGlyZWN0b3J5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIHRoZSBwYXRoIHRvIHRoZSBBcGFjaGUgaG9tZSBkaXJlY3RvcnkgKC9ldGMvYXBhY2hlMiknLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgPT4gNDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgU3VwcG9ydENvbmZpZ0FycmF5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNyZWF0ZSBjb25maWcgYXJyYXkKICAgIG15ICRDb25maWdBcnJheSA9IFsKCiAgICBdOwogICAgIyByZXR1cm4gY29uZmlnIGFycmF5CiAgICByZXR1cm4gJENvbmZpZ0FycmF5Owp9Cgo9aXRlbSBTdXBwb3J0SW5mb0dldCgpCgpyZXR1cm5zIGEgYXJyYXkgcmVmZXJlbmNlIHdpdGggc3VwcG9ydCBpbmZvcm1hdGlvbi4KCiRDcm9uQXJyYXkgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnTGludXgnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdvcGVuU1VTRSAxMC4yJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICBdOwogICAgICAgIAo9Y3V0CgpzdWIgU3VwcG9ydEluZm9HZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGFBcnJheSA9IFtdOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KE1vZHVsZUlucHV0SGFzaCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmIChyZWYoJFBhcmFte01vZHVsZUlucHV0SGFzaH0pIG5lICdIQVNIJykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk1vZHVsZUlucHV0SGFzaCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygKIyAgICAgICAgVHlwZSA9PiAkUGFyYW17TW9kdWxlSW5wdXRIYXNofS0+e1R5cGV9IHx8ICcnLAojICAgICk7CiMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIEFkbWluQ2hlY2tzIGluZm9ybWF0aW9uLgoKJENyb25BcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygpOwojICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIENoZWNrKCkKCnJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIENoZWNrIGluZm9ybWF0aW9uLgoKJENoZWNrSGFzaCA9PiAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfTsKCiMgY2hlY2sgaWYgY29uZmlnIHZhbHVlIGF2YWlsaWJsZQppZiAoJFBhcmFte1R5cGV9KSB7CiAgICBwcmludCBTVERFUlIgIlRZUEU6ICIgLiAkUGFyYW17VHlwZX07Cn0KICAgICAgICAKPWN1dAoKc3ViIENoZWNrIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRSZXR1cm5IYXNoID0ge307CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICgkXk8gPX4gL2xpbnV4LyB8fCAvdW5peC8gfHwgL25ldGJzZC8gfHwgL2ZyZWVic2QvIHx8IC9EYXJ3aW4vKSB7CiAgICAgIAogICAgfQogICAgZWxzaWYgKCReTyA9fiAvd2luL2kpIHsjIFRPRE8gLyBBdXNnYWJlIHVudGVyIFdpbmRvd3Mgbm9jaCBwcnVlZmVuCiAgICAgICAgCiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCjE7
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9IYXJkd2FyZS5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEhhcmR3YXJlLnBtLHYgMS44IDIwMDcvMTAvMDQgMDc6MDI6MzMgc3IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpIYXJkd2FyZTsKCnVzZSBzdHJpY3Q7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjggJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6SGFyZHdhcmUgLSBnbG9iYWwgc3lzdGVtIGluZm9ybWF0aW9ucwoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9ucyB0byBhIHJ1bm5pbmcgT1RSUyBob3N0LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgaGFyZHdhcmUgaW5mbyBvYmplY3QKCnVzZSBLZXJuZWw6OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7Cm15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7Cm15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKKTsKCiRTeXN0ZW1JbmZvT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkhhcmR3YXJlLT5uZXcoCiAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAopOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBTdXBwb3J0Q29uZmlnQXJyYXlHZXQoKQoKcmV0dXJuIGFuIGFycmF5IHJlZmVyZW5jZSB3aXRoIHJlcXVpcmVkIGNvbmZpZyBpbmZvcm1hdGlvbi4KCiRBcnJheVJlZiA9ICRTdXBwb3J0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKCm15ICRDb25maWdBcnJheSA9IFsKICAgIHsKICAgICAgICBLZXkgPT4gJ1RpY2tldER1bXAnLAogICAgICAgIE5hbWUgPT4gJ0R1bXAgVGlja2V0cycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIGhvdyBtYW55IGxhdGVzdCBUaWNrZXRzIHdlIHNodXQgZHVtcD8nLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQWxsID0+ICdBbGwnLAogICAgICAgICAgICAgICAgMCA9PiAnMCcsCiAgICAgICAgICAgICAgICAxMCA9PiAnTGFzdCAxMCcsCiAgICAgICAgICAgICAgICAxMDAgPT4gJ0xhc3QgMTAwJywKICAgICAgICAgICAgICAgIDEwMDAgPT4gJ0xhc3QgMTAwMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdBcGFjaGVIb21lJywKICAgICAgICBOYW1lID0+ICdBcGFjaGUgSG9tZSBEaXJlY3RvcnknLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgdGVsbCBtZSB0aGUgcGF0aCB0byB0aGUgQXBhY2hlIGhvbWUgZGlyZWN0b3J5ICgvZXRjL2FwYWNoZTIpJywKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICBTaXplID0+IDQwLAogICAgICAgIH0sCiAgICB9LApdOwoKPWN1dAoKc3ViIFN1cHBvcnRDb25maWdBcnJheUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBjcmVhdGUgY29uZmlnIGFycmF5CiAgICBteSAkQ29uZmlnQXJyYXkgPSBbXTsKICAgICMgcmV0dXJuIGNvbmZpZyBhcnJheQogICAgcmV0dXJuICRDb25maWdBcnJheTsKfQoKPWl0ZW0gU3VwcG9ydEluZm9HZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIHN1cHBvcnQgaW5mb3JtYXRpb24uCgokSGFyZHdhcmVBcnJheSA9PiBbCiAgICB7CiAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgQ29tbWVudCA9PiAnTGludXgnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsCiAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgIH0sCiAgICB7CiAgICAgICAgS2V5ID0+ICdWZXJzaW9uJywKICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICBDb21tZW50ID0+ICdvcGVuU1VTRSAxMC4yJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgIENoZWNrID0+ICdPSycsCiAgICB9LApdOwoKPWN1dAoKc3ViIFN1cHBvcnRJbmZvR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhNb2R1bGVJbnB1dEhhc2gpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAocmVmKCRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9KSBuZSAnSEFTSCcpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJNb2R1bGVJbnB1dEhhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwogICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPk1lbW9yeVN3YXBDaGVjaygKICAgICAgICBUeXBlID0+ICRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9LT57VHlwZX0gfHwgJycsCiAgICApOwogICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwogICAgJE9uZUNoZWNrID0gJFNlbGYtPkNQVUxvYWRDaGVjaygKICAgICAgICBUeXBlID0+ICRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9LT57VHlwZX0gfHwgJycsCiAgICApOwogICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIEFkbWluQ2hlY2tzIGluZm9ybWF0aW9uLgoKJEhhcmR3YXJlQXJyYXkgPT4gWwogICAgewogICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICBOYW1lID0+ICdQbGF0dGZvcm0nLAogICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgIENoZWNrID0+ICdPSycsCiAgICB9LAogICAgewogICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgTmFtZSA9PiAnVmVyc2lvbicsCiAgICAgICAgQ29tbWVudCA9PiAnb3BlblNVU0UgMTAuMicsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICBDaGVjayA9PiAnT0snLAogICAgfSwKXTsKCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiAgICBteSAkT25lQ2hlY2sgPSAkU2VsZi0+TWVtb3J5U3dhcENoZWNrKCk7CiAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgICRPbmVDaGVjayA9ICRTZWxmLT5DUFVMb2FkQ2hlY2soKTsKICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgJE9uZUNoZWNrID0gJFNlbGYtPkRpc2tVc2FnZUNoZWNrKCk7CiAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgIHJldHVybiAkRGF0YUFycmF5Owp9Cgo9aXRlbSBNZW1vcnlTd2FwQ2hlY2soKQoKcmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIHdpdGggTWVtb3J5U3dhcENoZWNrIGluZm9ybWF0aW9uLgoKJE1lbW9yeVN3YXBDaGVja0hhc2ggPT4KICAgIHsKICAgICAgICBLZXkgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywKICAgICAgICBDaGVjayA9PiAnT0snLAogICAgfTsKCiMgY2hlY2sgaWYgY29uZmlnIHZhbHVlIGF2YWlsaWJsZQppZiAoJFBhcmFte1R5cGV9KSB7CiAgICBwcmludCBTVERFUlIgIlRZUEU6ICIgLiAkUGFyYW17VHlwZX07Cn0KCj1jdXQKCnN1YiBNZW1vcnlTd2FwQ2hlY2sgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJFJldHVybkhhc2ggPSB7fTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkTWVtSW5mb0ZpbGU7CiAgICBteSAlTWVtVG1wSW5mbyA9ICgpOwogICAgIyBJZiB1c2VkIE9TIGlzIGEgbGludXggc3lzdGVtCiAgICBpZiAoJF5PID1+IC8obGludXh8dW5peHxuZXRic2R8ZnJlZWJzZHxkYXJ3aW4pL2kpIHsKICAgICAgICBpZiAoLWUgIi9wcm9jL21lbWluZm8iKSB7CiAgICAgICAgICAgIG9wZW4oJE1lbUluZm9GaWxlLCAnPCcsICIvcHJvYy9tZW1pbmZvIik7CiAgICAgICAgICAgIHdoaWxlKDwkTWVtSW5mb0ZpbGU+KSB7CiAgICAgICAgICAgICAgICBteSAkVG1wTGluZSA9ICRfOwogICAgICAgICAgICAgICAgaWYgKCRUbXBMaW5lID1+IC9NZW1Ub3RhbC8pIHsKICAgICAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL14uKj8oXGQrKS4qJC8kMS87CiAgICAgICAgICAgICAgICAgICAgJE1lbVRtcEluZm97TWVtb3J5U3dhcENoZWNrfXtNZW1Ub3RhbH0gPSBpbnQoJFRtcExpbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCRUbXBMaW5lID1+IC9NZW1GcmVlLykgewogICAgICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXi4qPyhcZCspLiokLyQxLzsKICAgICAgICAgICAgICAgICAgICAkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e01lbUZyZWV9ID0gaW50KCRUbXBMaW5lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkVG1wTGluZSA9fiAvU3dhcFRvdGFsLykgewogICAgICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXi4qPyhcZCspLiokLyQxLzsKICAgICAgICAgICAgICAgICAgICAkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBUb3RhbH0gPSBpbnQoJFRtcExpbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCRUbXBMaW5lID1+IC9Td2FwRnJlZS8pIHsKICAgICAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL14uKj8oXGQrKS4qJC8kMS87CiAgICAgICAgICAgICAgICAgICAgJE1lbVRtcEluZm97TWVtb3J5U3dhcENoZWNrfXtTd2FwRnJlZX0gPSBpbnQoJFRtcExpbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKCRNZW1JbmZvRmlsZSk7CgogICAgICAgICAgICAjIGJ1aWxkIHJldHVybiBoYXNoCiAgICAgICAgICAgIG15ICREZXNjcmlidGlvbiA9ICJUaGUgSG9zdCBTeXN0ZW0gaGFzOiBcbiIKICAgICAgICAgICAgICAgIC5pbnQoJE1lbVRtcEluZm97TWVtb3J5U3dhcENoZWNrfXtNZW1Ub3RhbH0gLyAxMDI0KSAuICIgTUIgTWVtb3J5IHRvdGFsIFxuIgogICAgICAgICAgICAgICAgLmludCgkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e01lbUZyZWV9IC8gMTAyNCkgLiAiIE1CIE1lbW9yeSBmcmVlIFxuIgogICAgICAgICAgICAgICAgLmludCgkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBUb3RhbH0gLyAxMDI0KSAuICIgTUIgU3dhcCB0b3RhbCBcbiIKICAgICAgICAgICAgICAgIC5pbnQoJE1lbVRtcEluZm97TWVtb3J5U3dhcENoZWNrfXtTd2FwRnJlZX0gLyAxMDI0KSAuICIgTUIgU3dhcCBmcmVlICI7CgogICAgICAgICAgICBpZiAoISRNZW1UbXBJbmZve01lbW9yeVN3YXBDaGVja317U3dhcFRvdGFsfSl7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01lbW9yeVN3YXBDaGVjaycsCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTWVtb3J5IFN3YXAgQ2hlY2snLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJBIE1lbW9yeSBDaGVjay4gV2UgdHJ5IHRvIGZpbmQgb3V0IGlmIFxuIgogICAgICAgICAgICAgICAgICAgICAgICAuIlN3YXBGcmVlIDogU3dhcFRvdGFsIDwgNjAgJSBcbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiIgb3IgaWYgbW9yZSB0aGFuIDIwMCBNQiBTd2FwIGlzIHVzZWQuIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICJObyBTd2FwIGVuYWJsZWQhIiwKICAgICAgICAgICAgICAgICAgICBDaGVjayA9PiAnRmFpbGVkJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCgoJE1lbVRtcEluZm97TWVtb3J5U3dhcENoZWNrfXtTd2FwRnJlZX0pLygkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBUb3RhbH0pIDwgNjApIHx8CiAgICAgICAgICAgICAgICAoKCRNZW1UbXBJbmZve01lbW9yeVN3YXBDaGVja317U3dhcFRvdGFsfSktKCRNZW1UbXBJbmZve01lbW9yeVN3YXBDaGVja317U3dhcEZyZWV9KSA+IDIwMDAwKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnTWVtb3J5U3dhcENoZWNrJywKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdNZW1vcnkgU3dhcCBDaGVjaycsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkEgTWVtb3J5IENoZWNrLiBXZSB0cnkgdG8gZmluZCBvdXQgaWYgXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIC4iU3dhcEZyZWUgOiBTd2FwVG90YWwgPCA2MCAlIFxuIgogICAgICAgICAgICAgICAgICAgICAgICAuIiBvciBpZiBtb3JlIHRoYW4gMjAwIE1CIFN3YXAgaXMgdXNlZC4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlidGlvbiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ01lbW9yeVN3YXBDaGVjaycsCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTWVtb3J5IFN3YXAgQ2hlY2snLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJBIE1lbW9yeSBDaGVjay4gV2UgdHJ5IHRvIGZpbmQgb3V0IGlmIFxuIgogICAgICAgICAgICAgICAgICAgICAgICAuIlN3YXBGcmVlIDogU3dhcFRvdGFsIDwgNjAgJSBcbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiIgb3IgaWYgbW9yZSB0aGFuIDIwMCBNQiBTd2FwIGlzIHVzZWQuIiwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICIkRGVzY3JpYnRpb24iLAogICAgICAgICAgICAgICAgICAgIENoZWNrID0+ICdGYWlsZWQnLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICgkXk8gPX4gL3dpbi9pKSB7IyBUT0RPIC8gQXVzZ2FiZSB1bnRlciBXaW5kb3dzIG5vY2ggcHJ1ZWZlbgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCnN1YiBDUFVMb2FkQ2hlY2sgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJFJldHVybkhhc2ggPSB7fTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSBAU3BsaXRBcnJheSA9IHt9OwogICAgIyBJZiB1c2VkIE9TIGlzIGEgbGludXggc3lzdGVtCiAgICBpZiAoJF5PID1+IC8obGludXh8dW5peHxuZXRic2R8ZnJlZWJzZHxkYXJ3aW4pL2kpIHsKICAgICAgICBpZiAoLWUgIi9wcm9jL2xvYWRhdmciKSB7CiAgICAgICAgICAgIG15ICRMb2FkRmlsZTsKICAgICAgICAgICAgb3BlbigkTG9hZEZpbGUsICc8JywgIi9wcm9jL2xvYWRhdmciKTsKICAgICAgICAgICAgd2hpbGUoPCRMb2FkRmlsZT4pIHsKICAgICAgICAgICAgICAgIEBTcGxpdEFycmF5ID0gc3BsaXQgKCIgIiwgJF8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKCRMb2FkRmlsZSk7CgogICAgICAgICAgICAjIGJ1aWxkIHJldHVybiBoYXNoCiAgICAgICAgICAgIG15ICREZXNjcmlidGlvbiA9ICJUaGUgSG9zdCBTeXN0ZW0gaGFzIGEgbG9hZDogXG4iCiAgICAgICAgICAgICAgICAuICRTcGxpdEFycmF5WzBdIC4gIiBpbiB0aGUgbGFzdCAxIG1pbnV0ZSBcbiIKICAgICAgICAgICAgICAgIC4gJFNwbGl0QXJyYXlbMV0gLiAiIGluIHRoZSBsYXN0IDUgbWludXRlcyBcbiIKICAgICAgICAgICAgICAgIC4gJFNwbGl0QXJyYXlbMl0gLiAiIGluIHRoZSBsYXN0IDE1IG1pbnV0ZXMiOwoKICAgICAgICAgICAgaWYgKCRTcGxpdEFycmF5WzJdIDwgJzEuMDAnKSB7CiAgICAgICAgICAgICAgICAkUmV0dXJuSGFzaCA9IHsKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0NQVUxvYWRDaGVjaycsCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ1BVIExvYWQnLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJBIENQVSBsb2FkIGNoZWNrLiBXZSB0cnkgdG8gZmluZCBvdXQgaWYgXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIC4idGhlIHN5c3RlbSBsb2FkIGluIHRoZSBsYXN0IDE1IG1pbnV0ZXMgPiAxLiBcbiIsCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAiJERlc2NyaWJ0aW9uIiwKICAgICAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnQ1BVTG9hZENoZWNrJywKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDUFUgTG9hZCcsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkEgQ1BVIGxvYWQgY2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiBcbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiJ0aGUgc3lzdGVtIGxvYWQgaW4gdGhlIGxhc3QgMTUgbWludXRlcyA8IDEgXG4iLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlidGlvbiIsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ0ZhaWxlZCcsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCReTyA9fiAvd2luL2kpIHsjIFRPRE8gLyBBdXNnYWJlIHVudGVyIFdpbmRvd3Mgbm9jaCBwcnVlZmVuCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcmV0dXJuICRSZXR1cm5IYXNoOwp9CgpzdWIgRGlza1VzYWdlQ2hlY2sgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGEgPSB7fTsKICAgIG15ICRDaGVjayA9ICdPSyc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwoKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCReTyA9fiAvKGxpbnV4fHVuaXh8bmV0YnNkfGZyZWVic2R8ZGFyd2luKS9pKSB7CiAgICAgICAgbXkgJEluOwogICAgICAgIGlmIChvcGVuKCRJbiwgImRmIC1sIHwiKSkgewogICAgICAgICAgICB3aGlsZSg8JEluPikgewogICAgICAgICAgICAgICAgaWYgKCRfID1+IC9eKC4rPylccy4qXHMoXGRcZFxkfFxkXGR8XGQpJS4rPyQvKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCQyID4gOTApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkQ2hlY2sgbmUgJ0ZhaWxlZCcgJiYgJDIgPiA4NSkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiwiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSAuPSAiJDFcWyQyJVxdIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSgkSW4pOwogICAgICAgICAgICBpZiAoJENoZWNrIGVxICdGYWlsZWQnKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICJEaXNrIGlzdCBmdWxsICgkTWVzc2FnZSkuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIkRpc2sgdXNhZ2UgKCRNZXNzYWdlKS4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICREYXRhID0gewogICAgICAgICAgICBLZXkgPT4gJ2Rpc2sgdXNhZ2UnLAogICAgICAgICAgICBOYW1lID0+ICdkaXNrIHVzYWdlJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIGRpc2sgdXNhZ2UuIiwKICAgICAgICAgICAgQ29tbWVudCA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgQ2hlY2sgPT4gJENoZWNrLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuICREYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuOCAkICREYXRlOiAyMDA3LzEwLzA0IDA3OjAyOjMzICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9PVFJTLnBtIC0gYWxsIHJlcXVpcmVkIG90cnMgaW5mb3JtYXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE9UUlMucG0sdiAxLjcgMjAwNy8wOS8yNyAxMjoxMDozMyBzciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6Ok9UUlM7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ7CnVzZSBzdHJpY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS43ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IERCT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICRTZWxmLT57U3VwcG9ydE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0LT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBTdXBwb3J0Q29uZmlnQXJyYXlHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgY3JlYXRlIGNvbmZpZyBhcnJheQogICAgbXkgJENvbmZpZ0FycmF5ID0gWwoKICAgIF07CiAgICAjIHJldHVybiBjb25maWcgYXJyYXkKICAgIHJldHVybiAkQ29uZmlnQXJyYXk7Cn0KCnN1YiBTdXBwb3J0SW5mb0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoTW9kdWxlSW5wdXRIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlZigkUGFyYW17TW9kdWxlSW5wdXRIYXNofSkgbmUgJ0hBU0gnKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTW9kdWxlSW5wdXRIYXNoIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBteSAkT25lQ2hlY2sgPSAkU2VsZi0+T1RSU0xvZ0dldCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9LT57VHlwZX0gfHwgJycsCiAgICApOwogICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICAkT25lQ2hlY2sgPSAkU2VsZi0+T1RSU0tlcm5lbEdldCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9LT57VHlwZX0gfHwgJycsCiAgICApOwogICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICAkT25lQ2hlY2sgPSAkU2VsZi0+T1RSU0NoZWNrU3VtR2V0KAogICAgICAgIFR5cGUgPT4gJFBhcmFte01vZHVsZUlucHV0SGFzaH0tPntUeXBlfSB8fCAnJywKICAgICk7CiAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwogICAgICAgICRPbmVDaGVjayA9ICRTZWxmLT5PVFJTQ2hlY2tNb2R1bGVzR2V0KAogICAgICAgIFR5cGUgPT4gJFBhcmFte01vZHVsZUlucHV0SGFzaH0tPntUeXBlfSB8fCAnJywKICAgICk7CiAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgICRPbmVDaGVjayA9ICRTZWxmLT5PcGVuVGlja2V0Q2hlY2soKTsKICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgJE9uZUNoZWNrID0gJFNlbGYtPlRpY2tldEluZGV4TW9kdWxlQ2hlY2soKTsKICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygKIyAgICAgICAgVHlwZSA9PiAkUGFyYW17TW9kdWxlSW5wdXRIYXNofS0+e1R5cGV9IHx8ICcnLAojICAgICk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPk9wZW5UaWNrZXRDaGVjaygpOwogICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICAkT25lQ2hlY2sgPSAkU2VsZi0+VGlja2V0SW5kZXhNb2R1bGVDaGVjaygpOwogICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKc3ViIE9UUlNMb2dHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJFJldHVybkhhc2ggPSB7fTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkTG9nU3RyaW5nID0gJFNlbGYtPntMb2dPYmplY3R9LT5HZXRMb2coTGltaXQgPT4gMTAwMCk7CiAgICBteSAkVG1wTG9nOwogICAgb3BlbiAoJFRtcExvZywgJz4nLCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLiIvdmFyL3RtcC90bXBsb2ciKTsKICAgIHByaW50ICRUbXBMb2cgJExvZ1N0cmluZzsKICAgIGNsb3NlICgkVG1wTG9nKTsKCiAgICBteSAkRmlsZW5hbWUgPSAkU2VsZi0+e1N1cHBvcnRPYmplY3R9LT5UYXJQYWNrYWdlV3JpdGUoCiAgICAgICAgRmlsZU5hbWUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKS4iL3Zhci90bXAvdG1wbG9nIiwKICAgICAgICBPdXRwdXRQYXRoID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykuIi92YXIvdG1wL3N1cHBvcnQvIiwKICAgICAgICBPdXRwdXROYW1lID0+ICdvdHJzLmxvZy50YXInLAogICAgKTsKICAgICMgcmVtb3ZlIHRtcCBmaWxlCiAgICB1bmxpbmsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKS4iL3Zhci90bXAvdG1wbG9nIjsKCiAgICBpZigkRmlsZW5hbWUpIHsKICAgICAgICAkUmV0dXJuSGFzaCA9CiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ09UUlNMb2cnLAogICAgICAgICAgICBOYW1lID0+ICdPVFJTTG9nJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnVGhlIE9UUlMgTG9nJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gICRGaWxlbmFtZSwKICAgICAgICAgICAgQ2hlY2sgPT4gJ1BhY2thZ2UnLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCnN1YiBPVFJTS2VybmVsR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRSZXR1cm5IYXNoID0ge307CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRoZSBkaXJlY3RvcnkgbmFtZQogICAgbXkgJERpck5hbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLicvS2VybmVsLyc7CgogICAgbXkgJEZpbGVuYW1lID0gJFNlbGYtPntTdXBwb3J0T2JqZWN0fS0+VGFyUGFja2FnZVdyaXRlKAogICAgICAgIERpck5hbWUgPT4gJERpck5hbWUsCiAgICAgICAgT3V0cHV0UGF0aCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLiIvdmFyL3RtcC9zdXBwb3J0LyIsCiAgICAgICAgT3V0cHV0TmFtZSA9PiAna2VybmVsLnRhcicsCiAgICApOwoKICAgIGlmKCRGaWxlbmFtZSkgewogICAgICAgICRSZXR1cm5IYXNoID0KICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnT1RSU0tlcm5lbCcsCiAgICAgICAgICAgIE5hbWUgPT4gJ09UUlNLZXJuZWwnLAogICAgICAgICAgICBDb21tZW50ID0+ICdUaGUgT1RSUyBLZXJuZWwgJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEZpbGVuYW1lLAogICAgICAgICAgICBDaGVjayA9PiAnUGFja2FnZScsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKc3ViIE9UUlNDaGVja1N1bUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVG1wU3VtU3RyaW5nOwogICAgbXkgJFRtcExvZzsKICAgIG9wZW4gKCRUbXBTdW1TdHJpbmcsICJwZXJsICIuJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKS4iL2Jpbi9DaGVja1N1bS5wbCB8Iik7CiAgICBvcGVuICgkVG1wTG9nLCAnPicsICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykuIi92YXIvdG1wL0NoZWNrU3VtLmxvZyIpOwoKICAgIHdoaWxlICg8JFRtcFN1bVN0cmluZz4pIHsKICAgICAgICBwcmludCAkVG1wTG9nICRfOwogICAgfQogICAgY2xvc2UgKCRUbXBTdW1TdHJpbmcpOwogICAgY2xvc2UgKCRUbXBMb2cpOwoKICAgIG15ICRGaWxlbmFtZSA9ICRTZWxmLT57U3VwcG9ydE9iamVjdH0tPlRhclBhY2thZ2VXcml0ZSgKICAgICAgICBGaWxlTmFtZSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLiIvdmFyL3RtcC9DaGVja1N1bS5sb2ciLAogICAgICAgIE91dHB1dFBhdGggPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKS4iL3Zhci90bXAvc3VwcG9ydC8iLAogICAgICAgIE91dHB1dE5hbWUgPT4gJ0NoZWNrU3VtLmxvZy50YXInLAogICAgKTsKICAgICMgcmVtb3ZlIHRtcCBmaWxlCiAgICB1bmxpbmsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKS4iL3Zhci90bXAvQ2hlY2tTdW0ubG9nIjsKCiAgICBpZigkRmlsZW5hbWUpIHsKICAgICAgICAkUmV0dXJuSGFzaCA9CiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ09UUlNDaGVja1N1bScsCiAgICAgICAgICAgIE5hbWUgPT4gJ09UUlNDaGVja1N1bScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1RoZSBPVFJTIENoZWNrU3VtLicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICAkRmlsZW5hbWUsCiAgICAgICAgICAgIENoZWNrID0+ICdQYWNrYWdlJywKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuICRSZXR1cm5IYXNoOwp9CgpzdWIgT1RSU0NoZWNrTW9kdWxlc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVG1wU3VtU3RyaW5nOwogICAgbXkgJFRtcExvZzsKICAgIG9wZW4gKCRUbXBTdW1TdHJpbmcsICJwZXJsICIuJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKS4iL2Jpbi9vdHJzLmNoZWNrTW9kdWxlcyB8Iik7CiAgICBvcGVuICgkVG1wTG9nLCAnPicsICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykuIi92YXIvdG1wL0NoZWNrTW9kdWxlcy5sb2ciKTsKCiAgICB3aGlsZSAoPCRUbXBTdW1TdHJpbmc+KSB7CiAgICAgICAgcHJpbnQgJFRtcExvZyAkXzsKICAgIH0KICAgIGNsb3NlICgkVG1wU3VtU3RyaW5nKTsKICAgIGNsb3NlICgkVG1wTG9nKTsKCiAgICBteSAkRmlsZW5hbWUgPSAkU2VsZi0+e1N1cHBvcnRPYmplY3R9LT5UYXJQYWNrYWdlV3JpdGUoCiAgICAgICAgRmlsZU5hbWUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKS4iL3Zhci90bXAvQ2hlY2tNb2R1bGVzLmxvZyIsCiAgICAgICAgT3V0cHV0UGF0aCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLiIvdmFyL3RtcC9zdXBwb3J0LyIsCiAgICAgICAgT3V0cHV0TmFtZSA9PiAnQ2hlY2tNb2R1bGVzLmxvZy50YXInLAogICAgKTsKICAgICMgcmVtb3ZlIHRtcCBmaWxlCiAgICB1bmxpbmsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKS4iL3Zhci90bXAvQ2hlY2tNb2R1bGVzLmxvZyI7CgogICAgaWYoJEZpbGVuYW1lKSB7CiAgICAgICAgJFJldHVybkhhc2ggPQogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdPVFJTQ2hlY2tTdW0nLAogICAgICAgICAgICBOYW1lID0+ICdPVFJTQ2hlY2tTdW0nLAogICAgICAgICAgICBDb21tZW50ID0+ICdUaGUgT1RSUyBDaGVja1N1bS4nLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAgJEZpbGVuYW1lLAogICAgICAgICAgICBDaGVjayA9PiAnUGFja2FnZScsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKc3ViIFRpY2tldEluZGV4TW9kdWxlQ2hlY2sgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIFRpY2tldDo6SW5kZXhNb2R1bGUgY2hlY2sKICAgIG15ICRDaGVjayA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgIG15ICRNb2R1bGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpJbmRleE1vZHVsZScpOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICJTRUxFQ1QgY291bnQoKikgZnJvbSB0aWNrZXQiKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIGlmICgkUm93WzBdID4gODAwMDApIHsKICAgICAgICAgICAgaWYgKCRNb2R1bGUgPX4gL1J1bnRpbWVEQi8pIHsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiWW91IHNob3VsZCB1c2UgdGhlIFN0YXRpY0RCIGJhY2tlbmQuIFNlZSBhZG1pbiBtYW51YWwgKFBlcmZvcm1hbmNlIFR1bmluZykgZm9yIG1vcmUgaW5mb3JtYXRpb24uIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkUm93WzBdID4gNjAwMDApIHsKICAgICAgICAgICAgaWYgKCRNb2R1bGUgPX4gL1J1bnRpbWVEQi8pIHsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICJZb3Ugc2hvdWxkIHVzZSB0aGUgU3RhdGljREIgYmFja2VuZC4gU2VlIGFkbWluIG1hbnVhbCAoUGVyZm9ybWFuY2UgVHVuaW5nKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlID0gIllvdSBhcmUgdXNpbmcgJE1vZHVsZSwgdGhhdCdzIGZpbmUgZm9yICRSb3dbMF0gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4iOwogICAgICAgIH0KICAgIH0KICAgICREYXRhID0gewogICAgICAgIEtleSA9PiAnVGlja2V0OjpJbmRleE1vZHVsZScsCiAgICAgICAgTmFtZSA9PiAnVGlja2V0OjpJbmRleE1vZHVsZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIFRpY2tldDo6SW5kZXhNb2R1bGUgc2V0dGluZy4iLAogICAgICAgIENvbW1lbnQgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgPT4gJENoZWNrLAogICAgfSwKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIE9wZW5UaWNrZXRDaGVjayB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgT3BlblRpY2tldENoZWNrIGNoZWNrCiAgICBteSAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBteSBAVGlja2V0SURzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZWFyY2goCiAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScsCiAgICAgICAgU3RhdGVUeXBlID0+ICdPcGVuJywKICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICBQZXJtaXNzaW9uID0+ICdybycsCiAgICAgICAgTGltaXQgPT4gOTk5OTk5OTksCiAgICApOwogICAgaWYgKCQjVGlja2V0SURzID4gMTAwMDApIHsKICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAkTWVzc2FnZSA9ICJZb3Ugc2hvdWxkIG5vdCBoYXZlIG1vcmUgdGhlbiA4MDAwIG9wZW4gdGlja2V0cyBpbiB5b3VyIHN5c3RlbS4gWW91IGN1cnJlbnRseSBoYXZlICIuCiAgICAgICAgICAgICQjVGlja2V0SURzLiIuIEluIGNhc2UgeW91IHdhbnQgdG8gaW1wcm92ZSB5b3VyIHBlcmZvcm1hbmNlLCBjbG9zZSBub3QgbmVlZGVkIG9wZW4gdGlja2V0cy4iOwoKICAgIH0KICAgIGVsc2lmICgkI1RpY2tldElEcyA+IDgwMDApIHsKICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICRNZXNzYWdlID0gIllvdSBzaG91bGQgbm90IGhhdmUgbW9yZSB0aGVuIDgwMDAgb3BlbiB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiBZb3UgY3VycmVudGx5IGhhdmUgIi4KICAgICAgICAgICAgJCNUaWNrZXRJRHMuIi4gSW4gY2FzZSB5b3Ugd2FudCB0byBpbXByb3ZlIHlvdXIgcGVyZm9ybWFuY2UsIGNsb3NlIG5vdCBuZWVkZWQgb3BlbiB0aWNrZXRzLiI7CgogICAgfQogICAgZWxzZSB7CiAgICAgICAgJENoZWNrID0gJ09LJzsKICAgICAgICAkTWVzc2FnZSA9ICJZb3UgaGF2ZSAiLiQjVGlja2V0SURzLiIgb3BlbiB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiI7CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBLZXkgPT4gJ09wZW5UaWNrZXRDaGVjaycsCiAgICAgICAgTmFtZSA9PiAnT3BlblRpY2tldENoZWNrJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgb3BlbiB0aWNrZXRzIGluIHlvdXIgc3lzdGVtLiIsCiAgICAgICAgQ29tbWVudCA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayA9PiAkQ2hlY2ssCiAgICB9LAogICAgcmV0dXJuICREYXRhOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIvSUlTLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSUlTLnBtLHYgMS4yIDIwMDcvMDUvMjMgMTg6MTI6MDIgc3IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpXZWJzZXJ2ZXI6OklJUzsKCnVzZSBzdHJpY3Q7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjIgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6V2Vic2VydmVyOjpJSVMgLSBJSVMgaW5mb3JtYXRpb24KCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMgdG8gYSBydW5uaW5nIE9UUlMgaG9zdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIFdlYnNlcnZlciBpbmZvIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwoKICAgICRTeXN0ZW1JbmZvT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gU3VwcG9ydENvbmZpZ0FycmF5R2V0KCkKCnJldHVybiBhbiBhcnJheSByZWZlcmVuY2Ugd2l0aCByZXF1aXJlZCBjb25maWcgaW5mb3JtYXRpb24uCgogICAgJEFycmF5UmVmID0gJFN1cHBvcnQtPlN1cHBvcnRDb25maWdBcnJheUdldCgpOwoKICAgIG15ICRDb25maWdBcnJheSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnVGlja2V0RHVtcCcsCiAgICAgICAgICAgIE5hbWUgPT4gJ0R1bXAgVGlja2V0cycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgdGVsbCBtZSBob3cgbWFueSBsYXRlc3QgVGlja2V0cyB3ZSBzaHV0IGR1bXA/JywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFsbCA9PiAnQWxsJywKICAgICAgICAgICAgICAgICAgICAwID0+ICcwJywKICAgICAgICAgICAgICAgICAgICAxMCA9PiAnTGFzdCAxMCcsCiAgICAgICAgICAgICAgICAgICAgMTAwID0+ICdMYXN0IDEwMCcsCiAgICAgICAgICAgICAgICAgICAgMTAwMCA9PiAnTGFzdCAxMDAwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnQXBhY2hlSG9tZScsCiAgICAgICAgICAgIE5hbWUgPT4gJ0FwYWNoZSBIb21lIERpcmVjdG9yeScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgdGVsbCBtZSB0aGUgcGF0aCB0byB0aGUgQXBhY2hlIGhvbWUgZGlyZWN0b3J5ICgvZXRjL2FwYWNoZTIpJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBTaXplID0+IDQwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICBdOwoKPWN1dAoKc3ViIFN1cHBvcnRDb25maWdBcnJheUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQp9Cgo9aXRlbSBTdXBwb3J0SW5mb0dldCgpCgpyZXR1cm5zIGEgYXJyYXkgcmVmZXJlbmNlIHdpdGggc3VwcG9ydCBpbmZvcm1hdGlvbi4KCiRXZWJzZXJ2ZXJBcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnb3BlblNVU0UgMTAuMicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICBdOwoKPWN1dAoKc3ViIFN1cHBvcnRJbmZvR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhNb2R1bGVJbnB1dEhhc2gpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAocmVmKCRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9KSBuZSAnSEFTSCcpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJNb2R1bGVJbnB1dEhhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIpOwogICAgICAgIHJldHVybjsKICAgIH0KIyAgICAjIHBsZWFzZSBhZGQgZm9yIGVhY2ggbmV3IGNoZWNrIGEgcGFydCBsaWtlIHRoaXMKIyAgICBteSAkT25lQ2hlY2sgPSAkU2VsZi0+Q2hlY2soCiMgICAgICAgIFR5cGUgPT4gJFBhcmFte01vZHVsZUlucHV0SGFzaH0tPntUeXBlfSB8fCAnJywKIyAgICApOwojICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIEFkbWluQ2hlY2tzR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBBZG1pbkNoZWNrcyBpbmZvcm1hdGlvbi4KCiRXZWJzZXJ2ZXJBcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnb3BlblNVU0UgMTAuMicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICBdOwoKPWN1dAoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiMgICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiMgICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPkNoZWNrKCk7CiMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKPWl0ZW0gQ2hlY2soKQoKcmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIHdpdGggQ2hlY2sgaW5mb3JtYXRpb24uCgokQ2hlY2tIYXNoID0+CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfTsKCiMgY2hlY2sgaWYgY29uZmlnIHZhbHVlIGF2YWlsaWJsZQppZiAoJFBhcmFte1R5cGV9KSB7CiAgICBwcmludCBTVERFUlIgIlRZUEU6ICIgLiAkUGFyYW17VHlwZX07Cn0KCj1jdXQKCnN1YiBDaGVjayB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICgkXk8gPX4gL2xpbnV4LyB8fCAvdW5peC8gfHwgL25ldGJzZC8gfHwgL2ZyZWVic2QvIHx8IC9EYXJ3aW4vKSB7CgogICAgfQogICAgZWxzaWYgKCReTyA9fiAvd2luL2kpIHsjIFRPRE8gLyBBdXNnYWJlIHVudGVyIFdpbmRvd3Mgbm9jaCBwcnVlZmVuCgogICAgfQogICAgcmV0dXJuICRSZXR1cm5IYXNoOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMiAkICREYXRlOiAyMDA3LzA1LzIzIDE4OjEyOjAyICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIvQXBhY2hlLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQXBhY2hlLnBtLHYgMS41IDIwMDcvMDkvMjcgMTI6MTM6MzIgc3IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpXZWJzZXJ2ZXI6OkFwYWNoZTsKCnVzZSBzdHJpY3Q7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjUgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFN1cHBvcnRDb25maWdBcnJheUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQp9CgpzdWIgU3VwcG9ydEluZm9HZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGFBcnJheSA9IFtdOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KE1vZHVsZUlucHV0SGFzaCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmIChyZWYoJFBhcmFte01vZHVsZUlucHV0SGFzaH0pIG5lICdIQVNIJykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk1vZHVsZUlucHV0SGFzaCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5BcGFjaGVEQklDaGVjaygpOwogICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICAkT25lQ2hlY2sgPSAkU2VsZi0+QXBhY2hlUmVsb2FkQ2hlY2soKTsKICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgJE9uZUNoZWNrID0gJFNlbGYtPk1vZFBlcmxWZXJzaW9uQ2hlY2soKTsKICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygKIyAgICAgICAgVHlwZSA9PiAkUGFyYW17TW9kdWxlSW5wdXRIYXNofS0+e1R5cGV9IHx8ICcnLAojICAgICk7CiMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkT25lQ2hlY2sgPSAkU2VsZi0+QXBhY2hlREJJQ2hlY2soKTsKICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgJE9uZUNoZWNrID0gJFNlbGYtPkFwYWNoZVJlbG9hZENoZWNrKCk7CiAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgICRPbmVDaGVjayA9ICRTZWxmLT5Nb2RQZXJsVmVyc2lvbkNoZWNrKCk7CiAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgIHJldHVybiAkRGF0YUFycmF5Owp9CgpzdWIgQXBhY2hlREJJQ2hlY2sgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIGNoZWNrIGlmIEFwYWNoZTo6REJJIGlzIGxvYWRlZAogICAgbXkgJEFwYWNoZURCSSA9IDA7CiAgICBteSAkQ2hlY2sgPSAnJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CgogICAgZm9yZWFjaCBteSAkTW9kdWxlIChrZXlzICVJTkMpIHsKICAgICAgICAkTW9kdWxlID1+IHMvXC8vOjovZzsKICAgICAgICAkTW9kdWxlID1+IHMvXC5wbSQvL2c7CiAgICAgICAgaWYgKCRNb2R1bGUgZXEgJ0FwYWNoZTo6REJJJyB8fCAkTW9kdWxlIGVxICdBcGFjaGUyOjpEQkknKSB7CiAgICAgICAgICAgICRBcGFjaGVEQkkgPSAkTW9kdWxlOwogICAgICAgIH0KICAgIH0KICAgIGlmICghJEFwYWNoZURCSSkgewogICAgICAgICRDaGVjayA9ICdDcml0aWNhbCc7CiAgICAgICAgJE1lc3NhZ2UgPSAnQXBhY2hlOjpEQkkgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGEgYmV0dGVyIHBlcmZvcm1hbmNlIChwcmUgZXN0YWJsaXNoIGRhdGFiYWJhc2UgY29ubmVjdGlvbnMpLic7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgPSAnT0snOwogICAgICAgICRNZXNzYWdlID0gIiRBcGFjaGVEQkkiOwogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgS2V5ID0+ICdBcGFjaGU6OkRCSScsCiAgICAgICAgTmFtZSA9PiAnQXBhY2hlOjpEQkknLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayB1c2VkIEFwYWNoZTo6REJJLiIsCiAgICAgICAgQ29tbWVudCA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayA9PiAkQ2hlY2ssCiAgICB9LAogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgQXBhY2hlUmVsb2FkQ2hlY2sgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHJlbG9hZCBjaGVjawogICAgbXkgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICBteSAkTWVzc2FnZSA9ICcnOwogICAgaWYgKCRFTlZ7TU9EX1BFUkx9KSB7CiAgICAgICAgZXZhbCAicmVxdWlyZSBtb2RfcGVybCI7CiAgICAgICAgaWYgKGRlZmluZWQgJG1vZF9wZXJsOjpWRVJTSU9OKSB7CiAgICAgICAgICAgIGlmICgkbW9kX3Blcmw6OlZFUlNJT04gPj0gMS45OSkgewogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBBcGFjaGU6OlJlbG9hZCBpcyBsb2FkZWQKICAgICAgICAgICAgICAgIG15ICRBcGFjaGVSZWxvYWQgPSAwOwogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkTW9kdWxlIChrZXlzICVJTkMpIHsKICAgICAgICAgICAgICAgICAgICAkTW9kdWxlID1+IHMvXC8vOjovZzsKICAgICAgICAgICAgICAgICAgICAkTW9kdWxlID1+IHMvXC5wbSQvL2c7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRNb2R1bGUgZXEgJ0FwYWNoZTo6UmVsb2FkJyB8fCAkTW9kdWxlIGVxICdBcGFjaGUyOjpSZWxvYWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBcGFjaGVSZWxvYWQgPSAkTW9kdWxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghJEFwYWNoZVJlbG9hZCkgewogICAgICAgICAgICAgICAgICAgICRDaGVjayA9ICdDcml0aWNhbCc7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAnQXBhY2hlOjpSZWxvYWQgb3IgQXBhY2hlMjo6UmVsb2FkIHNob3VsZCBiZSB1c2VkIGFzIFBlcmxNb2R1bGUgYW5kIFBlcmxJbml0SGFuZGxlciBpbiBBcGFjaGUgY29uZmlnIGZpbGUuJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiJEFwYWNoZVJlbG9hZCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICRNZXNzYWdlID0gJ1lvdSBzaG91bGQgdXNlIG1vZF9wZXJsIHRvIGluY3JlYXNlIHlvdXIgcGVyZm9ybWFuY2UgdmVyeSBzdHJvbmchJzsKICAgIH0KICAgICREYXRhID0gewogICAgICAgIEtleSA9PiAnQXBhY2hlOjpSZWxvYWQnLAogICAgICAgIE5hbWUgPT4gJ0FwYWNoZTo6UmVsb2FkJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgdXNlZCBBcGFjaGU6OlJlbG9hZC9BcGFjaGUyOjpSZWxvYWQuIiwKICAgICAgICBDb21tZW50ID0+ICRNZXNzYWdlLAogICAgICAgIENoZWNrID0+ICRDaGVjaywKICAgIH0sCiAgICByZXR1cm4gJERhdGE7Cn0KCnN1YiBNb2RQZXJsVmVyc2lvbkNoZWNrIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICREYXRhID0ge307CgogICAgIyBjaGVjayBtb2RfcGVybCB2ZXJzaW9uCiAgICBteSAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICBpZiAoJEVOVntNT0RfUEVSTH0pIHsKICAgICAgICBpZiAoJEVOVntNT0RfUEVSTH0gPX4gL1wvMS45OS8pIHsKICAgICAgICAgICAgJENoZWNrID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiWW91IHVzZSBhIGJldGEgdmVyc2lvbiBvZiBtb2RfcGVybCAoJEVOVntNT0RfUEVSTH0pLCB5b3Ugc2hvdWxkIHVwZ3JhZGUgdG8gYSBzdGFibGUgdmVyc2lvbi4iOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoJEVOVntNT0RfUEVSTH0gPX4gL1wvMS8pIHsKICAgICAgICAgICAgJENoZWNrID0gJ0NyaXRpY2FsJzsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiWW91IHNob3VsZCB1cGRhdGUgbW9kX3BlcmwgdG8gMi54ICgkRU5We01PRF9QRVJMfSkuIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgICAgICRNZXNzYWdlID0gIiRFTlZ7TU9EX1BFUkx9IjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ2hlY2sgPSAnQ3JpdGljYWwnOwogICAgICAgICRNZXNzYWdlID0gJ1lvdSBzaG91bGQgdXNlIG1vZF9wZXJsIHRvIGluY3JlYXNlIHlvdXIgcGVyZm9ybWFuY2UuJzsKICAgIH0KICAgICREYXRhID0gewogICAgICAgIEtleSA9PiAnbW9kX3BlcmwgdmVyc2lvbicsCiAgICAgICAgTmFtZSA9PiAnbW9kX3BlcmwgdmVyc2lvbicsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIHVzZWQgbW9kX3BlcmwgdmVyc2lvbi4iLAogICAgICAgIENvbW1lbnQgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgPT4gJENoZWNrLAogICAgfSwKICAgIHJldHVybiAkRGF0YTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9vcmFjbGUucG0gLSBhbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBvcmFjbGUucG0sdiAxLjYgMjAwNy8wOS8yNyAxMjoxMjo1OCBzciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkRhdGFiYXNlOjpvcmFjbGU7Cgp1c2Ugc3RyaWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuNiAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgREJPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgJFNlbGYtPntYTUxPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgU3VwcG9ydENvbmZpZ0FycmF5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9Cn0KCnN1YiBTdXBwb3J0SW5mb0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoTW9kdWxlSW5wdXRIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlZigkUGFyYW17TW9kdWxlSW5wdXRIYXNofSkgbmUgJ0hBU0gnKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTW9kdWxlSW5wdXRIYXNoIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPlRhYmxlQ2hlY2soKTsKICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgJE9uZUNoZWNrID0gJFNlbGYtPk5MU0xhbmdDaGVjaygpOwogICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICAkT25lQ2hlY2sgPSAkU2VsZi0+TkxTRGF0ZUZvcm1hdENoZWNrKCk7CiAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgICRPbmVDaGVjayA9ICRTZWxmLT5PcmFjbGVIb21lQ2hlY2soKTsKICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygKIyAgICAgICAgVHlwZSA9PiAkUGFyYW17TW9kdWxlSW5wdXRIYXNofS0+e1R5cGV9IHx8ICcnLAojICAgICk7CiMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15IEBEYXRhQXJyYXkgPSAoKTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkT25lQ2hlY2sgPSAkU2VsZi0+VGFibGVDaGVjaygpOwogICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICAkT25lQ2hlY2sgPSAkU2VsZi0+TkxTTGFuZ0NoZWNrKCk7CiAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgICRPbmVDaGVjayA9ICRTZWxmLT5OTFNEYXRlRm9ybWF0Q2hlY2soKTsKICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgJE9uZUNoZWNrID0gJFNlbGYtPk9yYWNsZUhvbWVDaGVjaygpOwogICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKc3ViIE9yYWNsZUhvbWVDaGVjayB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgY2hlY2sgT1JBQ0xFX0hPTUUKICAgIG15ICRDaGVjayA9ICdGYWlsZWQnOwogICAgbXkgJE1lc3NhZ2UgPSAnTm8gT1JBQ0xFX0hPTUUgZm91bmQhJzsKICAgIGlmICgkRU5We09SQUNMRV9IT01FfSkgewogICAgICAgIGlmICghIC1lICRFTlZ7T1JBQ0xFX0hPTUV9KSB7CiAgICAgICAgICAgICRNZXNzYWdlID0gIk9SQUNMRV9IT01FIGRvbid0IGV4aXN0cyAoJEVOVntPUkFDTEVfSE9NRX0pIjsKICAgICAgICAgICAgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTWVzc2FnZSA9ICIkRU5We09SQUNMRV9IT01FfSI7CiAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgS2V5ID0+ICdPUkFDTEVfSE9NRScsCiAgICAgICAgTmFtZSA9PiAnT1JBQ0xFX0hPTUUnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBPUkFDTEVfSE9NRS4iLAogICAgICAgIENvbW1lbnQgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgPT4gJENoZWNrLAogICAgfSwKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIE5MU0xhbmdDaGVjayB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgY2hlY2sgTkxTX0xBTkcKICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgJE1lc3NhZ2UgPSAnTm8gTkxTX0xBTkcgZm91bmQhJzsKICAgIGlmICgkRU5We05MU19MQU5HfSkgewogICAgICAgIGlmICgkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSA9fiAvdXRmKFwtOHw4KS9pKSB7CiAgICAgICAgICAgIGlmICgkRU5We05MU19MQU5HfSAhfiAvdXRmKFwtOHw4KS8pIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRFTlZ7TkxTX0xBTkd9LCBuZWVkIC51dGY4IGluIE5MU19MQU5HIChlLiBnLiBnZXJtYW5fZ2VybWFueS51dGY4KSI7CiAgICAgICAgICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRFTlZ7TkxTX0xBTkd9IjsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRNZXNzYWdlID0gIiRFTlZ7TkxTX0xBTkd9IjsKICAgICAgICAgICAgJENoZWNrID0gJ09LJzsKICAgICAgICB9CiAgICB9CiAgICAkRGF0YSA9IHsKICAgICAgICBLZXkgPT4gJ05MU19MQU5HJywKICAgICAgICBOYW1lID0+ICdOTFNfTEFORycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIE5MU19MQU5HLiIsCiAgICAgICAgQ29tbWVudCA9PiAkTWVzc2FnZSwKICAgICAgICBDaGVjayA9PiAkQ2hlY2ssCiAgICB9LAogICAgcmV0dXJuICREYXRhOwp9CgpzdWIgTkxTRGF0ZUZvcm1hdENoZWNrIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICREYXRhID0ge307CgogICAgIyBjaGVjayBOTFNfREFURV9GT1JNQVQKICAgICRDaGVjayA9ICdGYWlsZWQnOwogICAgJE1lc3NhZ2UgPSAnTm8gTkxTX0RBVEVfRk9STUFUIGZvdW5kISc7CiAgICBpZiAoJEVOVntOTFNfREFURV9GT1JNQVR9KSB7CiAgICAgICAgaWYgKCRFTlZ7TkxTX0RBVEVfRk9STUFUfSBuZSAiWVlZWS1NTS1ERCBISDI0Ok1JOlNTIikgewogICAgICAgICAgICAkTWVzc2FnZSA9ICIkRU5We05MU19EQVRFX0ZPUk1BVH0sIG5lZWQgJ1lZWVktTU0tREQgSEgyNDpNSTpTUycgZm9yIE5MU19EQVRFX0ZPUk1BVCAobm90ICRFTlZ7TkxTX0RBVEVfRk9STUFUfSkiOwogICAgICAgICAgICAkQ2hlY2sgPSAnRmFpbGVkJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRNZXNzYWdlID0gIiRFTlZ7TkxTX0RBVEVfRk9STUFUfSI7CiAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgfQogICAgfQogICAgJERhdGEgPSB7CiAgICAgICAgS2V5ID0+ICdOTFNfREFURV9GT1JNQVQnLAogICAgICAgIE5hbWUgPT4gJ05MU19EQVRFX0ZPUk1BVCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIE5MU19EQVRFX0ZPUk1BVC4iLAogICAgICAgIENvbW1lbnQgPT4gJE1lc3NhZ2UsCiAgICAgICAgQ2hlY2sgPT4gJENoZWNrLAogICAgfSwKICAgIHJldHVybiAkRGF0YTsKfQoKc3ViIFRhYmxlQ2hlY2sgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGEgPSB7fTsKCiAgICAjIHRhYmxlIGNoZWNrCiAgICBteSAkRmlsZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykuIi9zY3JpcHRzL2RhdGFiYXNlL290cnMtc2NoZW1hLnhtbCI7CiAgICBpZiAoLWYgJEZpbGUpIHsKICAgICAgICBteSAkQ291bnQgPSAwOwogICAgICAgIG15ICRDaGVjayA9ICdGYWlsZWQnOwogICAgICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICAgICAgbXkgJENvbnRlbnQgPSAnJzsKICAgICAgICBteSAkSW47CiAgICAgICAgaWYgKG9wZW4oJEluLCAnPCcsICIkRmlsZSIpKSB7CiAgICAgICAgICAgIHdoaWxlICg8JEluPikgewogICAgICAgICAgICAgICAgJENvbnRlbnQgLj0gJF87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UgKCRJbik7CiAgICAgICAgICAgIG15IEBYTUxIYXNoID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxQYXJzZTJYTUxIYXNoKFN0cmluZyA9PiAkQ29udGVudCk7CgogICAgICAgICAgICBmb3JlYWNoIG15ICRUYWJsZSAoQHskWE1MSGFzaFsxXS0+e2RhdGFiYXNlfS0+WzFdLT57VGFibGV9fSkgewogICAgICAgICAgICAgICAgaWYgKCRUYWJsZSkgewogICAgICAgICAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgIGlmICgkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gInNlbGVjdCAqIGZyb20gJFRhYmxlLT57TmFtZX0iLCBMaW1pdCA9PiAxKSkgewogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UgLj0gIiRUYWJsZS0+e05hbWV9LCAiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIlRhYmxlIGRvc24ndCBleGlzdHM6ICRNZXNzYWdlIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDaGVjayA9ICdPSyc7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSA9ICIkQ291bnQgVGFibGVzIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVGFibGUnLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGFibGUnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAkQ2hlY2ssCiAgICAgICAgICAgIH0sCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRGF0YSA9IHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVGFibGUnLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGFibGUnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gIkNoZWNrIGV4aXN0aW5nIGZyYW1ld29yayB0YWJsZXMuIiwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gIkNhbid0IG9wZW4gZmlsZSAkRmlsZTogJCEiLAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJENoZWNrLAogICAgICAgICAgICB9LAogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICREYXRhID0gewogICAgICAgICAgICBLZXkgPT4gJ1RhYmxlJywKICAgICAgICAgICAgTmFtZSA9PiAnVGFibGUnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4iLAogICAgICAgICAgICBDb21tZW50ID0+ICJDYW4ndCBmaW5kIGZpbGUgJEZpbGUhIiwKICAgICAgICAgICAgQ2hlY2sgPT4gJ0ZhaWxlZCcsCiAgICAgICAgfSwKICAgIH0KICAgIHJldHVybiAkRGF0YTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9tc3NxbC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IG1zc3FsLnBtLHYgMS4zIDIwMDcvMDkvMjcgMTI6MTA6NDkgc3IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZTo6bXNzcWw7Cgp1c2Ugc3RyaWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMyAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgREJPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgJFNlbGYtPntYTUxPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgU3VwcG9ydENvbmZpZ0FycmF5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9Cn0KCnN1YiBTdXBwb3J0SW5mb0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoTW9kdWxlSW5wdXRIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlZigkUGFyYW17TW9kdWxlSW5wdXRIYXNofSkgbmUgJ0hBU0gnKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTW9kdWxlSW5wdXRIYXNoIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPlRhYmxlQ2hlY2soKTsKICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygKIyAgICAgICAgVHlwZSA9PiAkUGFyYW17TW9kdWxlSW5wdXRIYXNofS0+e1R5cGV9IHx8ICcnLAojICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5UYWJsZUNoZWNrKCk7CiAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgIHJldHVybiAkRGF0YUFycmF5Owp9CgpzdWIgVGFibGVDaGVjayB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YSA9IHt9OwoKICAgICMgdGFibGUgY2hlY2sKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKS4iL3NjcmlwdHMvZGF0YWJhc2Uvb3Rycy1zY2hlbWEueG1sIjsKICAgIGlmICgtZiAkRmlsZSkgewogICAgICAgIG15ICRDb3VudCA9IDA7CiAgICAgICAgbXkgJENoZWNrID0gJ0ZhaWxlZCc7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgICAgICBteSAkQ29udGVudCA9ICcnOwogICAgICAgIG15ICRJbjsKICAgICAgICBpZiAob3BlbigkSW4sICc8JywgIiRGaWxlIikpIHsKICAgICAgICAgICAgd2hpbGUgKDwkSW4+KSB7CiAgICAgICAgICAgICAgICAkQ29udGVudCAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSAoJEluKTsKICAgICAgICAgICAgbXkgQFhNTEhhc2ggPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTFBhcnNlMlhNTEhhc2goU3RyaW5nID0+ICRDb250ZW50KTsKCiAgICAgICAgICAgIGZvcmVhY2ggbXkgJFRhYmxlIChAeyRYTUxIYXNoWzFdLT57ZGF0YWJhc2V9LT5bMV0tPntUYWJsZX19KSB7CiAgICAgICAgICAgICAgICBpZiAoJFRhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAic2VsZWN0ICogZnJvbSAkVGFibGUtPntOYW1lfSIsIExpbWl0ID0+IDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZSAuPSAiJFRhYmxlLT57TmFtZX0sICI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkTWVzc2FnZSkgewogICAgICAgICAgICAgICAgJE1lc3NhZ2UgPSAiVGFibGUgZG9zbid0IGV4aXN0czogJE1lc3NhZ2UiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENoZWNrID0gJ09LJzsKICAgICAgICAgICAgICAgICRNZXNzYWdlID0gIiRDb3VudCBUYWJsZXMiOwogICAgICAgICAgICB9CiAgICAgICAgICAgICREYXRhID0gewogICAgICAgICAgICAgICAgS2V5ID0+ICdUYWJsZScsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUYWJsZScsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4iLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgIENoZWNrID0+ICRDaGVjaywKICAgICAgICAgICAgfSwKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICREYXRhID0gewogICAgICAgICAgICAgICAgS2V5ID0+ICdUYWJsZScsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUYWJsZScsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAiQ2hlY2sgZXhpc3RpbmcgZnJhbWV3b3JrIHRhYmxlcy4iLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAiQ2FuJ3Qgb3BlbiBmaWxlICRGaWxlOiAkISIsCiAgICAgICAgICAgICAgICBDaGVjayA9PiAkQ2hlY2ssCiAgICAgICAgICAgIH0sCiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERhdGEgPSB7CiAgICAgICAgICAgIEtleSA9PiAnVGFibGUnLAogICAgICAgICAgICBOYW1lID0+ICdUYWJsZScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICJDaGVjayBleGlzdGluZyBmcmFtZXdvcmsgdGFibGVzLiIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIkNhbid0IGZpbmQgZmlsZSAkRmlsZSEiLAogICAgICAgICAgICBDaGVjayA9PiAnRmFpbGVkJywKICAgICAgICB9LAogICAgfQogICAgcmV0dXJuICREYXRhOwp9CjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS9wb3N0Z3Jlc3FsLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogcG9zdGdyZXNxbC5wbSx2IDEuNCAyMDA3LzA5LzI3IDEyOjEzOjE2IHNyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2U6OnBvc3RncmVzcWw7Cgp1c2Ugc3RyaWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuNCAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgREJPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgJFNlbGYtPntYTUxPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgU3VwcG9ydENvbmZpZ0FycmF5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9Cn0KCnN1YiBTdXBwb3J0SW5mb0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoTW9kdWxlSW5wdXRIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgIC