Fred
0.2.2
OTRS GmbH
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Insert a profiling function.
Improved the package settings.
First modular version.
Remove modperl reload informations from the fred log.
Added Database::SlowLog feature.
Improved the config description.
No longer crashes if HTML::Lint is not installed but HTML-checker is active.
Improved output.
First version especially for testing and as proof of concept.
A tool to support the developer by his development.
Ein Entwicklertool welches dem Entwickler zur Laufzeit bei der Entwicklung unterstützen soll.
2.2.x
2.3.x
2007-09-24 16:35:17
opms.otrs.com
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9PdXRwdXRGaWx0ZXJGcmVkLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE91dHB1dEZpbHRlckZyZWQucG0sdiAxLjcgMjAwNy8wOS8yNCAxNDozMjoxOCB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS43ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQKCj1oZWFkMSBTWU5PUFNJUwoKYSBvdXRwdXQgZmlsdGVyIG1vZHVsZSBzcGVjaWFsbHkgZm9yIGRldmVsb3BlcgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhNYWluT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgKSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICRTZWxmLT57RnJlZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RnJlZC0+bmV3KCAleyRTZWxmfSApOwoKICAgIGlmICggJFBhcmFte0xheW91dE9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9ID0gJFBhcmFte0xheW91dE9iamVjdH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBpbnNlcnQgTGF5b3V0T2JqZWN0IGVudHJ5IGluIEZpbHRlckNvbnRlbnQgZnVuY3Rpb24gb2YgdGhlIExheW91dC5wbQogICAgICAgICMgdGhpcyBoYXBwZW5zIG9ubHkgaW4gT1RSUyAyLjIKICAgICAgICAkU2VsZi0+e0ZyZWRPYmplY3R9LT5JbnNlcnRMYXlvdXRPYmplY3QoKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGlzIGEgY2hlY2sgYmVjYXVzZSBPVFJTMi4yIGRvbid0IGRlbGl2ZXIgaGVyZSBhIExheW91dE9iamVjdAogICAgaWYgKCAhJFNlbGYtPntMYXlvdXRPYmplY3R9ICkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZG8gbm90aGluZyBpZiBpdCBpcyBhIHJlZGlyZWN0CiAgICBpZiAoICAgJHsgJFBhcmFte0RhdGF9IH0gPX4gL15TdGF0dXM6IDMwMiBNb3ZlZC9taQogICAgICAgICYmICR7ICRQYXJhbXtEYXRhfSB9ID1+IC9ebG9jYXRpb246L21pCiAgICAgICAgJiYgbGVuZ3RoKCAkeyAkUGFyYW17RGF0YX0gfSApIDwgODAwICkKICAgIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGdldCBhbGwgYWN0aXZhdGVkIG1vZHVsZXMKICAgIG15ICRNb2R1bGVGb3JSZWYgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcmVkOjpNb2R1bGUnKTsKICAgIG15ICRNb2R1bGVzRGF0YVJlZiA9IHt9OwogICAgZm9yIG15ICRNb2R1bGUgKCBrZXlzICV7JE1vZHVsZUZvclJlZn0gKSB7CiAgICAgICAgaWYgKCAkTW9kdWxlRm9yUmVmLT57JE1vZHVsZX0tPntBY3RpdmV9ICkgewogICAgICAgICAgICAkTW9kdWxlc0RhdGFSZWYtPnskTW9kdWxlfSA9IHt9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvYWQgdGhlIGFjdGl2YXRlZCBtb2R1bGVzCiAgICAkU2VsZi0+e0ZyZWRPYmplY3R9LT5EYXRhR2V0KAogICAgICAgIEZyZWRNb2R1bGVzUmVmID0+ICRNb2R1bGVzRGF0YVJlZiwKICAgICAgICBIVE1MRGF0YVJlZiAgICA9PiAkUGFyYW17RGF0YX0sCiAgICApOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DcmVhdGVGcmVkT3V0cHV0KCBGcmVkTW9kdWxlc1JlZiA9PiAkTW9kdWxlc0RhdGFSZWYgKTsKCiAgICAjIGJ1aWxkIHRoZSBjb250ZW50IHN0cmluZwogICAgbXkgJE91dHB1dCA9ICcnOwogICAgaWYgKCRNb2R1bGVzRGF0YVJlZi0+e0NvbnNvbGV9LT57T3V0cHV0fSkgewogICAgICAgICRPdXRwdXQgLj0gJE1vZHVsZXNEYXRhUmVmLT57Q29uc29sZX0tPntPdXRwdXR9OwogICAgICAgIGRlbGV0ZSAkTW9kdWxlc0RhdGFSZWYtPntDb25zb2xlfTsKICAgIH0KICAgIGZvciBteSAkTW9kdWxlICggJXskTW9kdWxlc0RhdGFSZWZ9ICkgewogICAgICAgIGlmICggJE1vZHVsZXNEYXRhUmVmLT57JE1vZHVsZX0tPntPdXRwdXR9ICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRNb2R1bGVzRGF0YVJlZi0+eyRNb2R1bGV9LT57T3V0cHV0fTsKICAgICAgICB9CiAgICB9CgogICAgIyBpbmNsdWRlIHRoZSBmcmVkIG91dHB1dCBpbiB0aGUgb3JpZ2luYWwgb3V0cHV0CiAgICBpZiAoICR7ICRQYXJhbXtEYXRhfSB9ICF+IHMvKFw8Ym9keSh8Lis/KVw+KS8kMVxuJE91dHB1dFxuXG5cblxuL214ICkgewogICAgICAgICR7ICRQYXJhbXtEYXRhfSB9ID1+IHMvXiguKS9cbiRPdXRwdXRcblxuXG5cbiQxL214CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS43ICQgJERhdGU6IDIwMDcvMDkvMjQgMTQ6MzI6MTggJAoKPWN1dA==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkSFRNTENoZWNrLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWRIVE1MQ2hlY2sucG0sdiAxLjEgMjAwNy8wOS8yMSAwNzo0NjowOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRIVE1MQ2hlY2s7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZEhUTUxDaGVjayAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBIVE1MIGNoZWNrIG9iamVjdAoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTVERFUlJMb2ctPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSBTVERFUlIgbG9nCgogICAgJExheW91dE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCgKICAgICAgICBNb2R1bGVzUmVmID0+ICRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICRTZWxmICAgICAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSAgICAgPSBAXzsKICAgIG15ICRIVE1MTGluZXMgPSAnJzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIE1vZHVsZVJlZiEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICgkeyRQYXJhbXtNb2R1bGVSZWZ9IH17RGF0YX0pIHsKICAgICAgICBmb3IgbXkgJExpbmUgKCByZXZlcnNlIEB7ICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17RGF0YX0gfSApIHsKICAgICAgICAgICAgJExpbmUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoVGV4dCA9PiAkTGluZSk7CiAgICAgICAgICAgICRIVE1MTGluZXMgLj0gIiAgICAgICAgPHRyPjx0ZD4kTGluZTwvdGQ+PC90cj5cbiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoJEhUTUxMaW5lcykgewogICAgICAgICAgICAkeyAkUGFyYW17TW9kdWxlUmVmfSB9e091dHB1dH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkSFRNTENoZWNrJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7IEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA3LzA5LzIxIDA3OjQ2OjA5ICQKCj1jdXQK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkU1RERVJSTG9nLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWRTVERFUlJMb2cucG0sdiAxLjEgMjAwNy8wOS8yMSAwODowOTowOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTVERFUlJMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNUREVSUkxvZyAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBTVERFUlIgbG9nIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkU1RERVJSTG9nLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ3JlYXRlRnJlZE91dHB1dCgpCgpjcmVhdGUgdGhlIG91dHB1dCBvZiB0aGUgU1RERVJSIGxvZwoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgTW9kdWxlc1JlZiA9PiAkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgQ3JlYXRlRnJlZE91dHB1dCB7CiAgICBteSAkU2VsZiAgICAgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gICAgID0gQF87CiAgICBteSAkSFRNTExpbmVzID0gJyc7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVSZWZ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBNb2R1bGVSZWYhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgbXkgJExpbmUgKCByZXZlcnNlIEB7ICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17RGF0YX0gfSApIHsKICAgICAgICAkSFRNTExpbmVzIC49ICIgICAgICAgIDx0cj48dGQ+JExpbmU8L3RkPjwvdHI+IjsKICAgIH0KCiAgICBpZiAoJEhUTUxMaW5lcykgewogICAgICAgICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17T3V0cHV0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZFNUREVSUkxvZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7IEhUTUxMaW5lcyA9PiAkSFRNTExpbmVzLCB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDcvMDkvMjEgMDg6MDk6MDkgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkQ29uc29sZS5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBGcmVkQ29uc29sZS5wbSx2IDEuMSAyMDA3LzA5LzI0IDE0OjMyOjU0IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZENvbnNvbGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZENvbnNvbGUgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgY29uc29sZSBvYmplY3QKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGcmVkQ29uc29sZS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENyZWF0ZUZyZWRPdXRwdXQoKQoKY3JlYXRlIHRoZSBvdXRwdXQgb2YgdGhlIFNUREVSUiBsb2cKCiAgICAkTGF5b3V0T2JqZWN0LT5DcmVhdGVGcmVkT3V0cHV0KAogICAgICAgIE1vZHVsZXNSZWYgPT4gJE1vZHVsZXNSZWYsCiAgICApOwoKPWN1dAoKc3ViIENyZWF0ZUZyZWRPdXRwdXQgewogICAgbXkgJFNlbGYgICAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgICA9IEBfOwogICAgbXkgJEhUTUxMaW5lcyA9ICcnOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgTW9kdWxlUmVmISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIGNvbnNvbGUgdGFibGUKICAgIG15ICRDb25zb2xlID0gJ0FjdGl2YXRlZCBtb2R1bGVzOiAnOwogICAgZm9yIG15ICRNb2R1bGUgKEB7ICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17RGF0YX0gfSkgewogICAgICAgICRDb25zb2xlIC49ICRNb2R1bGUgLiAiIC0gIjsKICAgIH0KICAgICRDb25zb2xlID1+IHMvIC0gJC8vOwoKICAgIGlmICggJHsgJFBhcmFte01vZHVsZVJlZn0gfXtTdGF0dXN9ICkgewogICAgICAgIGlmICggJHsgJFBhcmFte01vZHVsZVJlZn0gfXtTZXR0aW5nfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NldHRpbmcnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtPdXRwdXR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkQ29uc29sZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBUZXh0ICAgID0+ICRDb25zb2xlLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDcvMDkvMjQgMTQ6MzI6NTQgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9GcmVkU21hbGxQcm9mLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWRTbWFsbFByb2YucG0sdiAxLjEgMjAwNy8wOS8yNCAxNDozMjoxOCB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZyZWRTbWFsbFByb2Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNtYWxsUHJvZiAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBTbWFsbFByb2Ygb2JqZWN0Cgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZFNUREVSUkxvZy0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENyZWF0ZUZyZWRPdXRwdXQoKQoKY3JlYXRlIHRoZSBvdXRwdXQgb2YgdGhlIFNUREVSUiBsb2cKCiAgICAkTGF5b3V0T2JqZWN0LT5DcmVhdGVGcmVkT3V0cHV0KAogICAgICAgIE1vZHVsZXNSZWYgPT4gJE1vZHVsZXNSZWYsCiAgICApOwoKPWN1dAoKc3ViIENyZWF0ZUZyZWRPdXRwdXQgewogICAgbXkgJFNlbGYgICAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgICA9IEBfOwogICAgbXkgJEhUTUxMaW5lcyA9ICcnOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlUmVmfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgTW9kdWxlUmVmISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIG15ICRMaW5lICggQHsgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtEYXRhfSB9ICkgewoKICAgICAgICBmb3IgbXkgJFREIChAeyRMaW5lfSkgewogICAgICAgICAgICAkVEQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoVGV4dCA9PiAkVEQpOwogICAgICAgIH0KICAgICAgICAkSFRNTExpbmVzIC49ICIgICAgICAgIDx0cj5cbiIKICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkIGFsaWduPVwicmlnaHRcIj4kTGluZS0+WzJdPC90ZD5cbiIKICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkIGFsaWduPVwicmlnaHRcIj4kTGluZS0+WzNdPC90ZD5cbiIKICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkIGFsaWduPVwicmlnaHRcIj4kTGluZS0+WzRdPC90ZD5cbiIKICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bMF08L3RkPlxuIgogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgICA8dGQgYWxpZ249XCJyaWdodFwiPiRMaW5lLT5bMV06PC90ZD5cbiIKICAgICAgICAgICAgICAgICAgICAuICIgICAgICAgICAgPHRkPiRMaW5lLT5bNV08L3RkPlxuIgogICAgICAgICAgICAgICAgICAgIC4gIiAgICAgICAgPC90cj4iOwogICAgfQoKICAgIGlmICgkSFRNTExpbmVzKSB7CiAgICAgICAgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtPdXRwdXR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkU21hbGxQcm9mJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsgSFRNTExpbmVzID0+ICRIVE1MTGluZXMsIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwNy8wOS8yNCAxNDozMjoxOCAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRGcmVkLnBtIC0gcHJvdmlkZXMgZ2VuZXJpYyBIVE1MIG91dHB1dCBmb3IgZnJlZAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBMYXlvdXRGcmVkLnBtLHYgMS4xIDIwMDcvMDkvMjEgMDc6NDg6MjkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXRGcmVkOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aXRlbSBDcmVhdGVGcmVkT3V0cHV0KCkKCmNyZWF0ZSB0aGUgb3V0cHV0IG9mIHRoZSBzZXZlcmFsIGZyZWQgbW9kdWxlcwoKICAgICRMYXlvdXRPYmplY3QtPkNyZWF0ZUZyZWRPdXRwdXQoCiAgICAgICAgRnJlZE1vZHVsZXNSZWYgPT4gJEZyZWRNb2R1bGVzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBDcmVhdGVGcmVkT3V0cHV0IHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtGcmVkTW9kdWxlc1JlZn0gfHwgcmVmKCAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9ICkgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBGcmVkTW9kdWxlc1JlZiEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGZvciBteSAkTW9kdWxlTmFtZSAoIGtleXMgJXsgJFBhcmFte0ZyZWRNb2R1bGVzUmVmfSB9ICkgewoKICAgICAgICAjIGxvYWQgYmFja2VuZAogICAgICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkTGF5b3V0QmFja2VuZCggTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSApOwoKICAgICAgICAjIGdldCBtb2R1bGUgZGF0YQogICAgICAgIGlmICgkQmFja2VuZE9iamVjdCkgewogICAgICAgICAgICAkQmFja2VuZE9iamVjdC0+Q3JlYXRlRnJlZE91dHB1dCggTW9kdWxlUmVmID0+ICRQYXJhbXtGcmVkTW9kdWxlc1JlZn0tPnskTW9kdWxlTmFtZX0gKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9Mb2FkTGF5b3V0QmFja2VuZCgpCgpsb2FkIGEgc3BlY2lhbCBmcmVkIGxheW91dCBiYWNrZW5kcwoKICAgICRCYWNrZW5kT2JqZWN0ID0gJExheW91dE9iamVjdC0+X0xvYWRMYXlvdXRCYWNrZW5kKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIF9Mb2FkTGF5b3V0QmFja2VuZCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJEJhY2tlbmRPYmplY3Q7CgogICAgIyBtb2R1bGUgcmVmCiAgICBpZiAoICEkUGFyYW17TW9kdWxlTmFtZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgTW9kdWxlTmFtZSEiICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgdXNlIHRoZSBjYWNoaW5nIG1lY2hhbmlzbSBsYXRlciBpZiByZXF1aXJlZAoKICAgICMgY2hlY2sgaWYgb2JqZWN0IGlzIGNhY2hlZAogICAgI2lmICggJFNlbGYtPnsgJ0NhY2hlOjpfTG9hZFhNTFR5cGVCYWNrZW5kOjonIC4gJFBhcmFte1R5cGV9IH0gKSB7CiAgICAjICAgIHJldHVybiAkU2VsZi0+eyAnQ2FjaGU6Ol9Mb2FkWE1MVHlwZUJhY2tlbmQ6OicgLiAkUGFyYW17VHlwZX0gfTsKICAgICN9CgogICAgIyBjcmVhdGUgbmV3IGluc3RhbmNlCiAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RnJlZCRQYXJhbXtNb2R1bGVOYW1lfSI7CiAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fSA9ICRTZWxmOwogICAgICAgICRCYWNrZW5kT2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0sICVQYXJhbSwgKTsKICAgIH0KCiAgICAjIGNhY2hlIG9iamVjdAogICAgI2lmICgkQmFja2VuZE9iamVjdCkgewogICAgIyAgICAkU2VsZi0+eyAnX0xvYWRYTUxUeXBlQmFja2VuZDo6JyAuICRQYXJhbXtUeXBlfSB9ID0gJEJhY2tlbmRPYmplY3Q7CiAgICAjfQoKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDA3LzA5LzIxIDA3OjQ4OjI5ICQKCj1jdXQK
IyAtLQojIERldmVsRnJlZENvbnNvbGUuZHRsIC0gYSBodG1sIGNvbnNvbGUgZm9yIGEgYmV0dGVyIGZyZWQgaGFuZGxpbmcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkQ29uc29sZS5kdGwsdiAxLjEgMjAwNy8wOS8yMSAwNzo0OToyNiB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KPHRhYmxlIGJnY29sb3I9IiMwMDAwMDAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5GcmVkLUNvbnNvbGU8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgJERhdGF7IlRleHQifQogICAgICAgICAgPC90ZD4KICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPgo8IS0tIGR0bDpibG9jazpTZXR0aW5nIC0tPgogICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPURldmVsRnJlZCZTdWJhY3Rpb249U2V0dGluZyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9J1NldHRpbmcnOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7IiBvbkNsaWNrPSJ3aW5kb3cub3BlbignJywgJ3NldHRpbmcnLCAndG9vbGJhcj1ubyxsb2NhdGlvbj1ubyxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMsd2lkdGg9NTAwLGhlaWdodD00NDAsbGVmdD01MDAsdG9wPTQ1MCcpOyIgdGFyZ2V0PSJzZXR0aW5nIj5zZXR0aW5nPC9hPgo8IS0tIGR0bDpibG9jazpTZXR0aW5nIC0tPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KIyBqdXN0IGEgc21hbGwgc3BhY2UKPHRhYmxlIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogIDx0cj48dGQ+PC90ZD48L3RyPgo8L3RhYmxlPg==
IyAtLQojIERldmVsRnJlZEhUTUxDaGVjay5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIEhUTUwtQ2hlY2sgcmVzdWx0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBEZXZlbEZyZWRIVE1MQ2hlY2suZHRsLHYgMS4xIDIwMDcvMDkvMjEgMDc6NTE6MDYgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjx0YWJsZSBiZ2NvbG9yPSIjMDAwMDAwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICA8dHI+CiAgICA8dGQgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgPHRhYmxlIGJnY29sb3I9IiNmZmZmZmYiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICAgICAgICA8Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+RnJlZC1IVE1MQ2hlY2s8L2ZvbnQ+PC9iPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgokRGF0YXsiSFRNTExpbmVzIn0KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
IyAtLQojIERldmVsRnJlZFNldHRpbmcuZHRsIC0gYSBmcm9udGVuZCBmb3IgYSBmYXN0IGZyZWQgc2V0dGluZyBoYW5kbGluZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBEZXZlbEZyZWRTZXR0aW5nLmR0bCx2IDEuMyAyMDA3LzA5LzI0IDE0OjMyOjE4IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iRGV2ZWxGcmVkU2V0dGluZyI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iRGV2ZWxGcmVkIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZXR0aW5nQWN0aW9uIj4KICAgICAgICA8dGFibGUgYmdjb2xvcj0iI2ZmZmZmZiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBiZ2NvbG9yPSJiYTBmMGYiPgogICAgICAgICAgICAgIDxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5GcmVkLVNldHRpbmc8L2ZvbnQ+PC9iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RnJlZE1vZHVsZSAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iRnJlZE1vZHVsZSIgdmFsdWU9IiRRRGF0YXsiRnJlZE1vZHVsZSJ9IiAkRGF0YXsiQ2hlY2tlZCJ9PgogICAgICAgICAgICAgICRRRGF0YXsiRnJlZE1vZHVsZSJ9CjwhLS0gZHRsOmJsb2NrOkNvbmZpZyAtLT4KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFkbWluU3lzQ29uZmlnJlN1YmFjdGlvbj1FZGl0JlN5c0NvbmZpZ1N1Ykdyb3VwPVNtYWxsUHJvZiZTeXNDb25maWdHcm91cD1GcmVkIj4oJFRleHR7IkNvbmZpZyJ9KTwvYT4KPCEtLSBkdGw6YmxvY2s6Q29uZmlnIC0tPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6RnJlZE1vZHVsZSAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTYXZlIn0iIGNsYXNzPSJidXR0b24iIG9uQ2xpY2s9IndpbmRvdy5jbG9zZSgpIj4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo=
IyAtLQojIERldmVsRnJlZFNUREVSUkxvZy5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIFNUREVSUiBsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkU1RERVJSTG9nLmR0bCx2IDEuMSAyMDA3LzA5LzIxIDA3OjQ5OjI2IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDx0YWJsZSBiZ2NvbG9yPSIjZmZmZmZmIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgICAgICAgPGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkZyZWQtU1RERVJSTG9nPC9mb250PjwvYj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KJERhdGF7IkhUTUxMaW5lcyJ9CiAgICAgIDwvdGFibGU+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+Cg==
IyAtLQojIERldmVsRnJlZFNtYWxsUHJvZi5kdGwgLSBhIGZyb250ZW5kIHRvIHNob3cgdGhlIFNtYWxsUHJvZiByZXN1bHQgdGFibGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogRGV2ZWxGcmVkU21hbGxQcm9mLmR0bCx2IDEuMSAyMDA3LzA5LzI0IDE0OjMyOjE4IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQo8dGFibGUgYmdjb2xvcj0iIzAwMDAwMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgPHRyPgogICAgPHRkIGJnY29sb3I9ImJhMGYwZiI+CiAgICAgIDx0YWJsZSBiZ2NvbG9yPSIjZmZmZmZmIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iNiIgYmdjb2xvcj0iYmEwZjBmIj4KICAgICAgICAgICAgPGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkZyZWQtU21hbGxQcm9mPC9mb250PjwvYj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUZXh0eyJDYWxscyJ9CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICAkVGV4dHsiVGltZSBleGVjdXRpbmcgKG1zKSJ9CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkPgogICAgICAgICAgICAkVGV4dHsiVGltZSBleHBlbmRlZCAobXMpIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUZXh0eyJGaWxlIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUZXh0eyJMaW5lIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICRUZXh0eyJUZXh0In0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KJERhdGF7IkhUTUxMaW5lcyJ9CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNvbHNwYW49IjYiPgogICAgICAgICAgICAkVGV4dHsiRm9yIG1vcmUgaW5mb3JtYXRpb24sIGVzcGVjaWFsbHkgJ3RpbWUgZXhlY3V0aW9uJyBhbmQgJ3RpbWUgZXhwZW5kZWQnIHJlYWQgcGVybGRvYyBTbWFsbFByb2YhIn0KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4K
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IEZyZWQueG1sLHYgMS44IDIwMDcvMDkvMjQgMTQ6MzI6MTggdHIgRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpPdXRwdXQ6OkZpbHRlckNvbnRlbnQjIyNGcmVkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U3Vic2NyaWJlIHRoZSBvdXRwdXQgZmlsdGVyIGF0IHRoZSBzeXN0ZW0uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk1lbGRldCBkZW4gT3V0cHV0RmlsdGVyRnJlZCBhbSBTeXN0ZW0gYW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6T3V0cHV0RmlsdGVyRnJlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVidWciPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpNb2R1bGUjIyNDb25zb2xlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VHVybiBvbiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGZyZWQgY29uc29sZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBha3RpdmllcmVuLCB3ZW5uIG1hbiBkaWUgRnJlZC1Db25zb2xlIG51dHplbiBt9mNodGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDwhLS08SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQ8L0l0ZW0+LS0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6Ok1vZHVsZSMjI1NtYWxsUHJvZiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBTbWFsbFByb2YgcHJvZmlsaW5nIGZ1bmN0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGFrdGl2aWVyZW4sIHdlbm4gbWFuIGRpZSBTbWFsbFByb2YtUHJvZmlsaW5nIEZ1bmt0aW9uIG51dHplbiBt9mNodGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDwhLS08SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQ8L0l0ZW0+LS0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6Ok1vZHVsZSMjI0hUTUxDaGVjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgYW4gcmVhbHRpbWUgSFRNTC1jaGVja2VyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGFrdGl2aWVyZW4gd2VubiB6dXIgTGF1ZnplaXQgZWluIEhUTUwtQ2hlY2tlciBhdXNnZWb8aHJ0IHdlcmRlbiBzb2xsLiBXSUNIVElHOiBEYXMgQ3Bhbi1Nb2R1bCBIVE1MOjpsaW50IGlzdCBoaWVyZvxyIG5vdHdlbmRpZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPCEtLTxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6T3V0cHV0RmlsdGVyRnJlZDwvSXRlbT4tLT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWN0aXZlIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJlZDo6TW9kdWxlIyMjU1RERVJSTG9nIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VHVybiBvbiBpZiB5b3Ugd2FudCB0byBzZWUgdGhlIFNUREVSUkxvZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBha3RpdmllcmVuIHdlbm4gbWFuIHp1ciBMYXVmemVpdCBkYXMgU1RERVJSTG9nIHNlaGVuIHdpbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDwhLS08SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQ8L0l0ZW0+LS0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2ZSI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNEZXZlbEZyZWQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgZGV2ZWwgZnJlZCBvYmplY3QgaW4gdGhlIGFkbWluIGFyZWEuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBFbnR3aWNrbGVyLU9iamVrdHMgRnJlZCBpbSBBZG1pbi1CZXJlaWNoLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDwhLS0gPEdyb3VwPmFkbWluPC9Hcm91cD4gLS0+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+QWRtaW48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkZyZWQtRGV2ZWxvcGVydG9vbHM8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+RnJlZDwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+QmxvY2s0PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8UHJpbz45OTk8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpTbWFsbFByb2YjIyNTaG93bkxpbmVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+SGVyZSB5b3UgY2FuIGluc2VydCB0aGUgbnVtYmVyIG9mIHNob3duIHByb2ZpbGluZyBsaW5lcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBrYW5uIGRpZSBBbnphaGwgZGVyIGFuZ2V6ZWlndGVuIGF1c2dld2VydGV0ZW4gWmVpbGVuIGFuZ2VnZWJlbiB3ZXJkZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPlNtYWxsUHJvZjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MTU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcmVkOjpTbWFsbFByb2YjIyNPcmRlckJ5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+V2hpY2ggb3JkZXIgc2hvdWxkIHRoZSBwcm9maWxpbmcgZGF0YSBoYXZlPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5OYWNoIHdlbGNoZXIgUmVpaGVuZm9sZ2Ugc29sbGVuIGRpZSBQcm9maWxpbmdkYXRlbiBnZW9yZG5ldCB3ZXJkZW4/PC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJlZDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPlNtYWxsUHJvZjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMyI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPkxpbmU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiPkNhbGxzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzIj5UaW1lIGV4ZWN1dGluZzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+VGltZSBleHBlbmRlZDwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8IS0tICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OkNWU0ZpbHRlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgdG8gYWxsb3cgdGhlIENWU0ZpbHRlciByZWFsdGltZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBha3RpdmllcmVuIHVtIHp1ciBMYXVmemVpdCBiZXJlaXRzIGRpZSBDVlMtRmlsdGVyIHp1IHRlc3Rlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OlBhdGhUb0NWU0ZpbHRlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlBhdGggdG8gdGhlIGN2cyBmaWx0ZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlBmYWQgenVtIENWUy1GaWx0ZXIuIEJlaW0gQ1ZTLUZpbHRlciBoYW5kZWx0IGVzIHNpY2ggdW0gZGllIGZpbHRlci1leHRlbmRlZC5wbCBkZXMgQ1ZTUk9PVC1SZXBvc2l0aW9yeSBkZXMgaW50ZXJuZW4gQ1ZTLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4vaG9tZS90ci9zcmMvQ1ZTUk9PVC1pbnQ8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJEYXRhYmFzZTo6U2xvd0xvZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRvIGVuYWJsZSBzbG93IHNxbCBsb2cgKHRvIGxvZyBhbGwgc3FsIHF1ZXJpZXMgd2hpY2ggdGFrZSBsb25nZXIgdGhlIDQgc2VjLikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlVtIFNsb3cgU1FMIHp1IGFrdGl2aWVyZW4gKG1pdHNjaG5laWRlciBhbGxlciBTUUwtQWJmcmFnZW4gd2VsY2hlIGxhZW5nZXIgNCBTZWsuIGJyYXVjaGVuKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4gLS0+Cjwvb3Ryc19jb25maWc+Cg==
IyAtLQojIEFBQUZyZWQucG0gLSB0aGUgY29uZmlnIHRvIGJpbmQgU1RERVJSIHRvIGFuIGxvZyBmaWxlIHVzYWJsZSBmb3IgZnJlZAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBQUFGcmVkLnBtLHYgMS4zIDIwMDcvMDkvMjEgMDc6NDQ6MTUgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgppZiAoJEVOVntIVFRQX1VTRVJfQUdFTlR9KSB7CiAgICAjIGNoZWNrIGxvZyBmaWxlIHNpemUKICAgIG15ICRTaXplID0gLXMgJFNlbGYtPntIb21lfS4iL3Zhci9mcmVkLmxvZyI7CiAgICBpZiAoJFNpemUgPiAyMCoxMDI0KjEwMjQpIHsKICAgICAgICB1bmxpbmsgJFNlbGYtPntIb21lfS4iL3Zhci9mcmVkLmxvZyI7CiAgICB9CgogICAgIyBtb3ZlIFNURE9VVCB0byB0bXAgZmlsZQogICAgaWYgKCFvcGVuKFNUREVSUiwgJz4+JywgIiRTZWxmLT57SG9tZX0vdmFyL2ZyZWQubG9nIikpIHsKICAgICAgICBwcmludCBTVERFUlIgIkVSUk9SOiBDYW4ndCB3cml0ZSAkU2VsZi0+e0hvbWV9L3Zhci9mcmVkLmxvZzogJCEiOwogICAgfQp9CjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC5wbSAtIGFsbCBmcmVkIGNvcmUgZnVuY3Rpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEZyZWQucG0sdiAxLjIgMjAwNy8wOS8yNCAxNDozMjoxOCB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjIgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RnJlZCAtIGZyZWQgY29yZSBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGZyZWQgc3RhbmRhcmQgY29yZSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiMgICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiMgICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAojICAgICAgICBMb2dPYmplY3QgPT4gJExvZ09iamVjdCwKIyAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIERhdGFHZXQoKQoKRXZhbHVhdGUgdGhlIHNldmVyYWwgZGF0YSBvZiBhbGwgZnJlZCBtb2R1bGVzIGFuZCBhZGQgdGhlbQpvbiB0aGUgRnJlZE1vZHVsZXMgcmVmZXJlbmNlLgoKICAgICRGcmVkT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIEZyZWRNb2R1bGVzUmVmID0+ICRGcmVkTW9kdWxlc1JlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17RnJlZE1vZHVsZXNSZWZ9IHx8IHJlZiggJFBhcmFte0ZyZWRNb2R1bGVzUmVmfSApIG5lICdIQVNIJyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgRnJlZE1vZHVsZXNSZWYhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICggISRQYXJhbXtIVE1MRGF0YVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEhUTUxEYXRhUmVmISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIG15ICRNb2R1bGVOYW1lICgga2V5cyAleyAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9IH0gKSB7CiAgICAgICAgIyBsb2FkIGJhY2tlbmQKICAgICAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUgKTsKCiAgICAgICAgIyBnZXQgbW9kdWxlIGRhdGEKICAgICAgICBpZiAoJEJhY2tlbmRPYmplY3QpIHsKICAgICAgICAgICAgJEJhY2tlbmRPYmplY3QtPkRhdGFHZXQoCiAgICAgICAgICAgICAgICBNb2R1bGVSZWYgICAgICA9PiAkUGFyYW17RnJlZE1vZHVsZXNSZWZ9LT57JE1vZHVsZU5hbWV9LAogICAgICAgICAgICAgICAgSFRNTERhdGFSZWYgICAgPT4gJFBhcmFte0hUTUxEYXRhUmVmfSwKICAgICAgICAgICAgICAgIEZyZWRNb2R1bGVzUmVmID0+ICRQYXJhbXtGcmVkTW9kdWxlc1JlZn0KICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBhY3RpdmF0ZSBhIGZyZWQgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5BY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIEFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgbXkgJFNlbGYgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZU5hbWV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBNb2R1bGVOYW1lISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkQmFja2VuZCggTW9kdWxlTmFtZSA9PiAkUGFyYW17TW9kdWxlTmFtZX0gKTsKCiAgICAjIGdldCBtb2R1bGUgZGF0YQogICAgaWYgKCRCYWNrZW5kT2JqZWN0KSB7CiAgICAgICAgIyBGSVhNRSBFcnJvcmhhbmRsaW5nCiAgICAgICAgJEJhY2tlbmRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRGVhY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVhY3RpdmF0ZSBhIGZyZWQgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVhY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVOYW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgTW9kdWxlTmFtZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoIE1vZHVsZU5hbWUgPT4gJFBhcmFte01vZHVsZU5hbWV9ICk7CgogICAgIyBnZXQgbW9kdWxlIGRhdGEKICAgIGlmICgkQmFja2VuZE9iamVjdCkgewogICAgICAgICMgRklYTUUgRXJyb3JoYW5kbGluZwogICAgICAgICRCYWNrZW5kT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0xvYWRCYWNrZW5kKCkKCmxvYWQgYSB4bWwgaXRlbSBtb2R1bGUKCiAgICAkQmFja2VuZE9iamVjdCA9ICRGcmVkT2JqZWN0LT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgX0xvYWRCYWNrZW5kIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkQmFja2VuZE9iamVjdDsKCiAgICAjIG1vZHVsZSByZWYKICAgIGlmICggISRQYXJhbXtNb2R1bGVOYW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCBNb2R1bGVOYW1lISIgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB1c2UgdGhlIGNhY2hpbmcgbWVjaGFuaXNtIGxhdGVyIGlmIHJlcXVpcmVkCgogICAgIyBjaGVjayBpZiBvYmplY3QgaXMgY2FjaGVkCiAgICAjaWYgKCAkU2VsZi0+eyAnQ2FjaGU6Ol9Mb2FkWE1MVHlwZUJhY2tlbmQ6OicgLiAkUGFyYW17VHlwZX0gfSApIHsKICAgICMgICAgcmV0dXJuICRTZWxmLT57ICdDYWNoZTo6X0xvYWRYTUxUeXBlQmFja2VuZDo6JyAuICRQYXJhbXtUeXBlfSB9OwogICAgI30KCiAgICAjIGNyZWF0ZSBuZXcgaW5zdGFuY2UKICAgIG15ICRHZW5lcmljTW9kdWxlID0gIktlcm5lbDo6U3lzdGVtOjpGcmVkOjokUGFyYW17TW9kdWxlTmFtZX0iOwogICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKICAgICAgICAkQmFja2VuZE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9LCAlUGFyYW0sICk7CiAgICB9CgogICAgIyBjYWNoZSBvYmplY3QKICAgICNpZiAoJEJhY2tlbmRPYmplY3QpIHsKICAgICMgICAgJFNlbGYtPnsgJ19Mb2FkWE1MVHlwZUJhY2tlbmQ6OicgLiAkUGFyYW17VHlwZX0gfSA9ICRCYWNrZW5kT2JqZWN0OwogICAgI30KCiAgICAjIHJldHVybiBvYmplY3QKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKPWl0ZW0gSW5zZXJ0TGF5b3V0T2JqZWN0KCkKCkZSQU1FV09SSy0yLjIgc3BlY2lmaWMgYmVjYXVzZSB0aGVyZSBpcyBubyBMYXlvdXRPYmplY3QgaW50ZWdyYXRpb24gZm9yCkZSRUQgaW4gT1RSUzIuMiBMYXlvdXQucG0KCiAgICAkRnJlZE9iamVjdC0+SW5zZXJ0TGF5b3V0T2JqZWN0KCk7Cgo9Y3V0CgojIEZSQU1FV09SSy0yLjIgc3BlY2lmaWMgYmVjYXVzZSB0aGVyZSBpcyBubyBMYXlvdXRPYmplY3QgaW50ZWdyYXRpb24gZm9yCiMgRlJFRCBpbiBPVFJTMi4yIExheW91dC5wbQoKc3ViIEluc2VydExheW91dE9iamVjdCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15IEBMaW5lcyA9ICgpOwogICAgbXkgJEZpbGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICIvS2VybmVsL091dHB1dC9IVE1ML0xheW91dC5wbSI7CgogICAgaWYgKCAtbCAiJEZpbGUiICkgewogICAgICAgIGRpZSAnQ2FuXCd0IG1hbmlwdWxhdGUgJEZpbGUgYmVjYXVzZSBpdCBpcyBhIHN5bWxpbmshJzsKICAgIH0KCiAgICBteSAkSW5TdWI7CiAgICBvcGVuIG15ICRGaWxlaGFuZGxlLCAnPCcsICRGaWxlICB8fCBkaWUgIkZJTFRFUjogQ2FuJ3Qgb3BlbiAkRmlsZSAhXG4iOwogICAgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgcHVzaCBATGluZXMsICRMaW5lOwogICAgICAgIGlmICggJExpbmUgPX4gL3N1YiBQcmludCB7LyApIHsKICAgICAgICAgICAgJEluU3ViID0gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkSW5TdWIgJiYgJExpbmUgPX4gL0RlYnVnID0+IFwkU2VsZi0+e0RlYnVnfSwvICkgewogICAgICAgICAgICBwdXNoIEBMaW5lcywgIiMgRlJFRCAtIG1hbmlwdWxhdGVkXG4iOwogICAgICAgICAgICBwdXNoIEBMaW5lcywgIiAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+IFwkU2VsZixcbiI7CiAgICAgICAgICAgIHB1c2ggQExpbmVzLCAiIyBGUkVEIC0gbWFuaXB1bGF0ZWRcbiI7CiAgICAgICAgICAgICRJblN1YiA9IDA7CiAgICAgICAgfQogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGU7CgogICAgb3BlbiBteSAkRmlsZWhhbmRsZUlJLCAnPicsICRGaWxlIHx8IGRpZSAiRklMVEVSOiBDYW4ndCB3cml0ZSAkRmlsZSAhXG4iOwogICAgZm9yIG15ICRMaW5lIChATGluZXMpIHsKICAgICAgICBwcmludCAkRmlsZWhhbmRsZUlJICRMaW5lOwogICAgfQogICAgY2xvc2UgJEZpbGVoYW5kbGVJSTsKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgTWVzc2FnZSAgPT4gJ0ZSRUQgbWFuaXB1bGF0ZWQgdGhlICRGaWxlIScsCiAgICApOwogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4yICQgJERhdGU6IDIwMDcvMDkvMjQgMTQ6MzI6MTggJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9IVE1MQ2hlY2sucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSFRNTENoZWNrLnBtLHYgMS4yIDIwMDcvMDkvMjQgMTQ6MzI6MTkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpIVE1MQ2hlY2s7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4yICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkhUTUxDaGVjawoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIEhUTUw6OiBsaW50IGNoZWNrCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gRGF0YUdldCgpCgpHZXQgdGhlIGRhdGEgZm9yIHRoaXMgZnJlZCBtb2R1bGUuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KQW5kIGFkZCB0aGUgZGF0YSB0byB0aGUgbW9kdWxlIHJlZi4KCiAgICAkQmFja2VuZE9iamVjdC0+RGF0YUdldCgKICAgICAgICBNb2R1bGVSZWYgPT4gJE1vZHVsZVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRGF0YUdldCB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJFBhcmFtUmVmIChxdyggTW9kdWxlUmVmIEhUTUxEYXRhUmVmICkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JFBhcmFtUmVmfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJFBhcmFtUmVmISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBDaGVjayB0aGUgSFRNTC1PdXRwdXQgd2l0aCBIVE1MOjpMaW50CiAgICBteSBASFRNTExpbnRNZXNzYWdlczsKICAgIGlmICgkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCdIVE1MOjpMaW50JykpIHsKICAgICAgICBIVE1MOjpMaW50LT5pbXBvcnQoKTsKICAgICAgICBteSAkSFRNTExpbnRPYmplY3QgPSBIVE1MOjpMaW50LT5uZXcoIG9ubHlfdHlwZXMgPT4gSFRNTDo6TGludDo6RXJyb3ItPlNUUlVDVFVSRSApOwogICAgICAgICRIVE1MTGludE9iamVjdC0+cGFyc2UgKCR7ICRQYXJhbXtIVE1MRGF0YVJlZn0gfSk7CgogICAgICAgIG15ICRFcnJvckNvdW50ZXIgPSAkSFRNTExpbnRPYmplY3QtPmVycm9yczsKICAgICAgICBmb3IgbXkgJEVycm9yICgkSFRNTExpbnRPYmplY3QtPmVycm9ycykgewogICAgICAgICAgICBteSAkU3RyaW5nIC49ICRFcnJvci0+YXNfc3RyaW5nOwogICAgICAgICAgICBpZiAoJFN0cmluZyAhfiAvSW52YWxpZCBjaGFyYWN0ZXIgLisgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgLykgewogICAgICAgICAgICAgICAgcHVzaCBASFRNTExpbnRNZXNzYWdlcywgJFN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgbXkgJFRleHQgPSAnVGhlIEhUTUwtY2hlY2tlciBvZiBGcmVkIHJlcXVpcmVzIEhUTUw6OkxpbnQgdG8gYmUgaW5zdGFsbGVkIScKICAgICAgICAgICAgLiAnUGxlYXNlIGluc3RhbGwgSFRNTDo6TGludCB2aWEgQ1BBTiBvciBkZWFjdGl2YXRlIHRoZSBIVE1MLWNoZWNrZXIgdmlhIFN5c0NvbmZpZy4nOwogICAgICAgIHB1c2ggQEhUTUxMaW50TWVzc2FnZXMsICRUZXh0OwogICAgfQoKICAgIGlmIChASFRNTExpbnRNZXNzYWdlcykgewogICAgICAgICR7ICRQYXJhbXtNb2R1bGVSZWZ9IH17RGF0YX0gPSBcQEhUTUxMaW50TWVzc2FnZXM7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5BY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIEFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgbXkgJFNlbGYgID0gc2hpZnQ7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIERlYWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGRlYWN0aXZhdGUgdGhpcyBzcGVjaWFsIG1vZHVsZS4KCiAgICAkRnJlZE9iamVjdC0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZU5hbWUsCiAgICApOwoKPWN1dAoKc3ViIERlYWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMiAkICREYXRlOiAyMDA3LzA5LzI0IDE0OjMyOjE5ICQKCj1jdXQ=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9TVERFUlJMb2cucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogU1RERVJSTG9nLnBtLHYgMS4yIDIwMDcvMDkvMjQgMTQ6MzI6MTkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTVERFUlJMb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4yICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNUREVSUkxvZwoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIFNUREVSUiBsb2cgZGF0YQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtNb2R1bGVSZWZ9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBNb2R1bGVSZWYhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIG9wZW4gdGhlIGZyZWQubG9nIGZpbGUgdG8gZ2V0IHRoZSBTVERFUlIgbWVzc2FnZXMKICAgIG15ICRGaWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICIvdmFyL2ZyZWQubG9nIjsKICAgIGlmICggb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSApIHsKICAgICAgICBteSBAUm93ICAgICAgICA9IDwkRmlsZWhhbmRsZT47CiAgICAgICAgbXkgQFJldmVyc2VSb3cgPSByZXZlcnNlKEBSb3cpOwogICAgICAgIG15IEBMb2dNZXNzYWdlczsKICAgICAgICBmb3IgbXkgJExpbmUgKEBSZXZlcnNlUm93KSB7CiAgICAgICAgICAgIGlmICggJExpbmUgPX4gL0ZSRUQvICkgewogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRMaW5lICF+IC9TdWJyb3V0aW5lIC4rPyByZWRlZmluZWQgYXQvICkgewogICAgICAgICAgICAgICAgcHVzaCBATG9nTWVzc2FnZXMsICRMaW5lOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwcmludCBTVERFUlIgIkZSRURcbiI7CiAgICAgICAgY2xvc2UgJEZpbGVoYW5kbGU7CiAgICAgICAgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtEYXRhfSA9IFxATG9nTWVzc2FnZXM7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRGVhY3RpdmF0ZU1vZHVsZVRvZG9zKCkKCkRvIGFsbCBqb2JzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVhY3RpdmF0ZSB0aGlzIHNwZWNpYWwgbW9kdWxlLgoKICAgICRGcmVkT2JqZWN0LT5EZWFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgRGVhY3RpdmF0ZU1vZHVsZVRvZG9zIHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4yICQgJERhdGU6IDIwMDcvMDkvMjQgMTQ6MzI6MTkgJAoKPWN1dA==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9Db25zb2xlLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IENvbnNvbGUucG0sdiAxLjEgMjAwNy8wOS8yNCAxNDozMjoxOSB0ciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkZyZWQ6OkNvbnNvbGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNtYWxsUHJvZgoKPWhlYWQxIFNZTk9QU0lTCgpnaXZlcyB5b3UgYWxsIGZ1bmN0aW9ucyB3aGljaCBhcmUgbmVlZGVkIGZvciB0aGUgY29uc29sZQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkUmVmIChxdyhNb2R1bGVSZWYgSFRNTERhdGFSZWYgRnJlZE1vZHVsZXNSZWYpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRSZWZ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkUmVmISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgQE1vZHVsZXMgPSAoKTsKICAgIGZvciBteSAkTW9kdWxlIChrZXlzICV7JFBhcmFte0ZyZWRNb2R1bGVzUmVmfX0pIHsKICAgICAgICBpZiAoJE1vZHVsZSBuZSAnQ29uc29sZScpIHsKICAgICAgICAgICAgcHVzaCBATW9kdWxlcywgJE1vZHVsZTsKICAgICAgICB9CiAgICB9CgogICAgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtEYXRhfSA9IFxATW9kdWxlczsKCiAgICBpZiAoJHskUGFyYW17SFRNTERhdGFSZWZ9fSAhfiAvRnJlZC1TZXR0aW5nLyAmJiAkeyRQYXJhbXtIVE1MRGF0YVJlZn19ID1+IC9cPGJvZHkuKj9cPi8gKSB7CiAgICAgICAgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtTdGF0dXN9ID0gMTsKICAgIH0KCiAgICBpZiAoICR7JFBhcmFte0hUTUxEYXRhUmVmfX0gIX4gL25hbWU9IkFjdGlvbiIgdmFsdWU9IkxvZ2luIi8gKSB7CiAgICAgICAgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtTZXR0aW5nfSA9IDE7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15IEBMaW5lcyA9ICgpOwogICAgbXkgJEZpbGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICIvYmluL2NnaS1iaW4vaW5kZXgucGwiOwoKICAgIGlmICggLWwgIiRGaWxlIiApIHsKICAgICAgICBkaWUgJ0NhblwndCBtYW5pcHVsYXRlICRGaWxlIGJlY2F1c2UgaXQgaXMgYSBzeW1saW5rISc7CiAgICB9CgogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSAgfHwgZGllICJGSUxURVI6IENhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIHB1c2ggQExpbmVzLCAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkZJTFRFUjogQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMhL3Vzci9iaW4vcGVybCAtdyAtZDpTbWFsbFByb2ZcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKICAgIGZvciBteSAkTGluZSAoQExpbmVzKSB7CiAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlSUk7CiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICdGUkVEIG1hbmlwdWxhdGVkIHRoZSAkRmlsZSEnLAogICAgKTsKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBEZWFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBkZWFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkRlYWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBEZWFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgbXkgJFNlbGYgID0gc2hpZnQ7CiAgICBteSBATGluZXMgPSAoKTsKICAgIG15ICRGaWxlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAiL2Jpbi9jZ2ktYmluL2luZGV4LnBsIjsKCiAgICBpZiAoIC1sICIkRmlsZSIgKSB7CiAgICAgICAgZGllICdDYW5cJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEnOwogICAgfQoKICAgICMgcmVhZCB0aGUgaW5kZXgucGwgZmlsZQogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSAgfHwgZGllICJGSUxURVI6IENhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIHB1c2ggQExpbmVzLCAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgICMgcmVtb3ZlIHRoZSBtYW5pcHVsYXRlZCBsaW5lcwogICAgaWYgKCRMaW5lc1swXSA9fiAvIyFcL3VzclwvYmluXC9wZXJsIC13IC1kOlNtYWxsUHJvZi8pIHsKICAgICAgICBzaGlmdCBATGluZXM7CiAgICB9CiAgICBpZiAoJExpbmVzWzBdID1+IC8jIEZSRUQgLSBtYW5pcHVsYXRlZC8pIHsKICAgICAgICBzaGlmdCBATGluZXM7CiAgICB9CgogICAgIyBzYXZlIHRoZSBpbmRleC5wbCBmaWxlCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlSUksICc+JywgJEZpbGUgfHwgZGllICJGSUxURVI6IENhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAnRlJFRCBtYW5pcHVsYXRlZCB0aGUgJEZpbGUhJywKICAgICk7CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwNy8wOS8yNCAxNDozMjoxOSAkCgo9Y3V0
IyAtLQojIEtlcm5lbC9TeXN0ZW0vRnJlZC9TbWFsbFByb2YucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogU21hbGxQcm9mLnBtLHYgMS4xIDIwMDcvMDkvMjQgMTQ6MzI6MTkgdHIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpGcmVkOjpTbWFsbFByb2Y7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkZyZWQ6OlNtYWxsUHJvZgoKPWhlYWQxIFNZTk9QU0lTCgpoYW5kbGUgdGhlIFNtYWxsUHJvZiBwcm9maWxpbmcgZGF0YQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBEYXRhR2V0KCkKCkdldCB0aGUgZGF0YSBmb3IgdGhpcyBmcmVkIG1vZHVsZS4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgpBbmQgYWRkIHRoZSBkYXRhIHRvIHRoZSBtb2R1bGUgcmVmLgoKICAgICRCYWNrZW5kT2JqZWN0LT5EYXRhR2V0KAogICAgICAgIE1vZHVsZVJlZiA9PiAkTW9kdWxlUmVmLAogICAgKTsKCj1jdXQKCnN1YiBEYXRhR2V0IHsKICAgIG15ICRTZWxmICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkUGF0aCAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLiAiL2Jpbi9jZ2ktYmluLyI7CiAgICBteSAkQ29uZmlnX1JlZiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcmVkOjpTbWFsbFByb2YnKTsKICAgIG15IEBMaW5lczsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte01vZHVsZVJlZn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIE1vZHVsZVJlZiEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHN5c3RlbSAiY3AgJFBhdGgvc21hbGxwcm9mLm91dCAkUGF0aC9GcmVkU21hbGxQcm9mLm91dCI7CiAgICBpZiAoIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc8JywgJFBhdGggLiAnRnJlZFNtYWxsUHJvZi5vdXQnICkgewogICAgICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgICAgICBpZiAoJExpbmUgPX4gL15cLy8pIHsKICAgICAgICAgICAgICAgIGlmICgkTGluZSA9fiAvXi4qP2NnaS1iaW5cL1wuXC5cL1wuXC5cLyguKz8pOihcZCs/KTooXGQrPyk6KFxkKz8pOihcZCs/KTpccyooLio/KSQvKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATGluZXMsIFskMSwgJDIsICQzLCAkNCwgJDUsICQ2XTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGFsdGVybmF0aXZlIHNvbHV0aW9uIDIKICAgICAgICAgICAgICAgICMgbXkgQEVsZW1lbnRzID0gc3BsaXQgKCc6JywkTGluZSk7CiAgICAgICAgICAgICAgICAjICRFbGVtZW50c1swXSA9fiBzL14uKj9jZ2ktYmluXC9cLlwuXC9cLlwuXC8vLzsKICAgICAgICAgICAgICAgICMgcHVzaCBATGluZXMsIFxARWxlbWVudHM7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIEBMaW5lcyA9IHNvcnQgeyRiLT5bJENvbmZpZ19SZWYtPntPcmRlckJ5fV0gPD0+ICRhLT5bJENvbmZpZ19SZWYtPntPcmRlckJ5fV19IEBMaW5lczsKCiAgICAgICAgaWYgKCRDb25maWdfUmVmLT57T3JkZXJCeX0gPT0gMSkgewogICAgICAgICAgICBATGluZXMgPSByZXZlcnNlIEBMaW5lczsKICAgICAgICB9CgogICAgICAgIHNwbGljZSBATGluZXMsICRDb25maWdfUmVmLT57U2hvd25MaW5lc307CiAgICAgICAgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtEYXRhfSA9IFxATGluZXM7CgogICAgICAgICMgYWx0ZXJuYXRpdmUgc29sdXRpb24gMQogICAgICAgICMgd2hpbGUgKCBteSAkTGluZSA9IDwkRmlsZWhhbmRsZT4gKSB7CiAgICAgICAgIyAgICAgaWYgKCRMaW5lID1+IC9eXHMqP1sxLTldLykgewogICAgICAgICMgICAgICAgICBpZiAoJExpbmUgPX4gL15ccyo/KFxkKz8pXHMrPyhcZC4rPylccys/KFxkLis/KVxzKz8oXGQrPyk6KC4qPykkLykgewogICAgICAgICMgICAgICAgICAgICAgcHVzaCBATGluZXMsIFskMSwgJDIsICQzLCAkNCwgJDVdOwogICAgICAgICMgICAgICAgICB9CiAgICAgICAgIyAgICAgfQogICAgICAgICMgfQogICAgICAgICMgQExpbmVzID0gc29ydCB7JGItPlsxXSA8PT4gJGEtPlsxXX0gQExpbmVzOwogICAgICAgICMgJHsgJFBhcmFte01vZHVsZVJlZn0gfXtEYXRhfSA9IFxATGluZXM7CiAgICAgICAgY2xvc2UgJEZpbGVoYW5kbGU7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQWN0aXZhdGVNb2R1bGVUb2RvcygpCgpEbyBhbGwgam9icyB3aGljaCBhcmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkFjdGl2YXRlTW9kdWxlVG9kb3MoCiAgICAgICAgTW9kdWxlTmFtZSA9PiAkTW9kdWxlTmFtZSwKICAgICk7Cgo9Y3V0CgpzdWIgQWN0aXZhdGVNb2R1bGVUb2RvcyB7CiAgICBteSAkU2VsZiAgPSBzaGlmdDsKICAgIG15IEBMaW5lcyA9ICgpOwogICAgbXkgJEZpbGUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICIvYmluL2NnaS1iaW4vaW5kZXgucGwiOwoKICAgIGlmICggLWwgIiRGaWxlIiApIHsKICAgICAgICBkaWUgJ0NhblwndCBtYW5pcHVsYXRlICRGaWxlIGJlY2F1c2UgaXQgaXMgYSBzeW1saW5rISc7CiAgICB9CgogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSAgfHwgZGllICJGSUxURVI6IENhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIHB1c2ggQExpbmVzLCAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIG9wZW4gbXkgJEZpbGVoYW5kbGVJSSwgJz4nLCAkRmlsZSB8fCBkaWUgIkZJTFRFUjogQ2FuJ3Qgd3JpdGUgJEZpbGUgIVxuIjsKICAgIHByaW50ICRGaWxlaGFuZGxlSUkgIiMhL3Vzci9iaW4vcGVybCAtdyAtZDpTbWFsbFByb2ZcbiI7CiAgICBwcmludCAkRmlsZWhhbmRsZUlJICIjIEZSRUQgLSBtYW5pcHVsYXRlZFxuIjsKICAgIGZvciBteSAkTGluZSAoQExpbmVzKSB7CiAgICAgICAgcHJpbnQgJEZpbGVoYW5kbGVJSSAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlSUk7CiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICdGUkVEIG1hbmlwdWxhdGVkIHRoZSAkRmlsZSEnLAogICAgKTsKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBEZWFjdGl2YXRlTW9kdWxlVG9kb3MoKQoKRG8gYWxsIGpvYnMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBkZWFjdGl2YXRlIHRoaXMgc3BlY2lhbCBtb2R1bGUuCgogICAgJEZyZWRPYmplY3QtPkRlYWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGVOYW1lLAogICAgKTsKCj1jdXQKCnN1YiBEZWFjdGl2YXRlTW9kdWxlVG9kb3MgewogICAgbXkgJFNlbGYgID0gc2hpZnQ7CiAgICBteSBATGluZXMgPSAoKTsKICAgIG15ICRGaWxlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAiL2Jpbi9jZ2ktYmluL2luZGV4LnBsIjsKCiAgICBpZiAoIC1sICIkRmlsZSIgKSB7CiAgICAgICAgZGllICdDYW5cJ3QgbWFuaXB1bGF0ZSAkRmlsZSBiZWNhdXNlIGl0IGlzIGEgc3ltbGluayEnOwogICAgfQoKICAgICMgcmVhZCB0aGUgaW5kZXgucGwgZmlsZQogICAgb3BlbiBteSAkRmlsZWhhbmRsZSwgJzwnLCAkRmlsZSAgfHwgZGllICJGSUxURVI6IENhbid0IG9wZW4gJEZpbGUgIVxuIjsKICAgIHdoaWxlICggbXkgJExpbmUgPSA8JEZpbGVoYW5kbGU+ICkgewogICAgICAgIHB1c2ggQExpbmVzLCAkTGluZTsKICAgIH0KICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgICMgcmVtb3ZlIHRoZSBtYW5pcHVsYXRlZCBsaW5lcwogICAgaWYgKCRMaW5lc1swXSA9fiAvIyFcL3VzclwvYmluXC9wZXJsIC13IC1kOlNtYWxsUHJvZi8pIHsKICAgICAgICBzaGlmdCBATGluZXM7CiAgICB9CiAgICBpZiAoJExpbmVzWzBdID1+IC8jIEZSRUQgLSBtYW5pcHVsYXRlZC8pIHsKICAgICAgICBzaGlmdCBATGluZXM7CiAgICB9CgogICAgIyBzYXZlIHRoZSBpbmRleC5wbCBmaWxlCiAgICBvcGVuIG15ICRGaWxlaGFuZGxlSUksICc+JywgJEZpbGUgfHwgZGllICJGSUxURVI6IENhbid0IHdyaXRlICRGaWxlICFcbiI7CiAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgIHByaW50ICRGaWxlaGFuZGxlSUkgJExpbmU7CiAgICB9CiAgICBjbG9zZSAkRmlsZWhhbmRsZUlJOwogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAnRlJFRCBtYW5pcHVsYXRlZCB0aGUgJEZpbGUhJywKICAgICk7CiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjEgJCAkRGF0ZTogMjAwNy8wOS8yNCAxNDozMjoxOSAkCgo9Y3V0
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0RldmVsRnJlZC5wbSAtIGEgc3BlY2lhbCBkZXZlbG9wZXIgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERldmVsRnJlZC5wbSx2IDEuMiAyMDA3LzA5LzI0IDE0OjMyOjE4IHRyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkRldmVsRnJlZDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjIgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCiN1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RnJlZDsKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwoKICAgICMgY2hlY2sgbmVlZGVkIE9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdygKICAgICAgICBQYXJhbU9iamVjdCBEQk9iamVjdCAgICAgTG9nT2JqZWN0IENvbmZpZ09iamVjdAogICAgICAgIE1haW5PYmplY3QgIExheW91dE9iamVjdCBUaW1lT2JqZWN0CiAgICApKSB7CiAgICAgICAgaWYgKCRQYXJhbXskT2JqZWN0fSkgewogICAgICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkdvdCBubyAkT2JqZWN0ISIpOwogICAgICAgIH0KICAgIH0KIyAgICAkU2VsZi0+e1hNTE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoJXskU2VsZn0pOwogICAgJFNlbGYtPntDb25maWdUb29sT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDb25maWctPm5ldygleyRTZWxmfSk7CiAgICAkU2VsZi0+e0ZyZWRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkZyZWQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U3ViYWN0aW9ufSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnU3ViYWN0aW9uJyk7CiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNob3cgdGhlIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCEkU2VsZi0+e1N1YmFjdGlvbn0pIHsKICAgIH0KIyAgICAgICAgbXkgJE91dHB1dCAgID0gJyc7CiMKIyAgICAgICAgbXkgQFRyYW5zbGF0aW9uV2hpdGVMaXN0ID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoR2V0KAojICAgICAgICAgICAgVHlwZSA9PiAnRnJlZC1UcmFuc2xhdGlvbicsCiMgICAgICAgICAgICBLZXkgID0+IDEsCiMgICAgICAgICAgICBDYWNoZSA9PiAwLAojICAgICAgICApOwojCiMgICAgICAgIG15ICVXaGl0ZUxpc3Q7CiMgICAgICAgIGZvciBteSAkQ29udGVudCAoQHskVHJhbnNsYXRpb25XaGl0ZUxpc3RbMV17VHJhbnNsYXRpb259fSkgewojICAgICAgICAgICAgaWYgKCRDb250ZW50LT57Q29udGVudH0pIHsKIyAgICAgICAgICAgICAgICAjIGFkZCBhZGQgYmxvY2sKIyAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAojICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5lJywKIyAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiMgICAgICAgICAgICAgICAgICAgICAgICBXb3JkID0+ICRDb250ZW50LT57Q29udGVudH0sCiMgICAgICAgICAgICAgICAgICAgIH0sCiMgICAgICAgICAgICAgICAgKTsKIyAgICAgICAgICAgIH0KIyAgICAgICAgfQojCiMgICAgICAgICMgYnVpbGQgb3V0cHV0CiMgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gIkZyZWQtT3ZlcnZpZXciKTsKIyAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKIyAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKIyAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiMgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0RldmVsRnJlZCcsCiMgICAgICAgICk7CiMgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKIyAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiMgICAgfQojICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgICAgIyBoYW5kbGUgdGhlIHRyYW5zbGF0aW9uIGxvZwojICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVHJhbnNsYXRpb24nKSB7CiMgICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnVmFsdWUnKTsKIwojICAgICAgICBteSBARGF0YSA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEdldCgKIyAgICAgICAgICAgIFR5cGUgPT4gJ0ZyZWQtVHJhbnNsYXRpb24nLAojICAgICAgICAgICAgS2V5ICA9PiAxLAojICAgICAgICAgICAgQ2FjaGUgPT4gMCwKIyAgICAgICAgKTsKIwojICAgICAgICBpZiAoIUBEYXRhKSB7CiMgICAgICAgICAgICBteSBASGFzaDsKIwojICAgICAgICAgICAgJEhhc2hbMV17VHJhbnNsYXRpb259WzFde0NvbnRlbnR9ID0gJFZhbHVlOwojICAgICAgICAgICAgJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoQWRkKAojICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ0ZyZWQtVHJhbnNsYXRpb24nLAojICAgICAgICAgICAgICAgIEtleSAgICAgPT4gMSwKIyAgICAgICAgICAgICAgICBYTUxIYXNoID0+IFxASGFzaCwKIyAgICAgICAgICAgICk7CiMgICAgICAgIH0KIyAgICAgICAgZWxzZSB7CiMgICAgICAgICAgICBwdXNoIEB7JERhdGFbMV17VHJhbnNsYXRpb259fSwge0NvbnRlbnQgPT4gJFZhbHVlfTsKIyAgICAgICAgICAgICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaFVwZGF0ZSgKIyAgICAgICAgICAgICAgICBUeXBlID0+ICdGcmVkLVRyYW5zbGF0aW9uJywKIyAgICAgICAgICAgICAgICBLZXkgPT4gJzEnLAojICAgICAgICAgICAgICAgIFhNTEhhc2ggPT4gXEBEYXRhLAojICAgICAgICAgICAgKTsKIwojICAgICAgICB9CiMKIyAgICAgICAgbXkgJFJlZmVyZXIgPSAkRU5We0hUVFBfUkVGRVJFUn07CiMgICAgICAgIGlmICgkUmVmZXJlciA9fiAvXD8oLispJC8pIHsKIyAgICAgICAgICAgICRSZWZlcmVyID0gJDE7CiMgICAgICAgIH0KIwojICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAkUmVmZXJlcik7CiMgICAgfQojICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RyYW5zbGF0aW9uRGVsZXRlJykgewojICAgICAgICBteSBARGF0YSA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaERlbGV0ZSgKIyAgICAgICAgICAgIFR5cGUgPT4gJ0ZyZWQtVHJhbnNsYXRpb24nLAojICAgICAgICAgICAgS2V5ICA9PiAxLAojICAgICAgICApOwojCiMgICAgICAgIG15ICRSZWZlcmVyID0gJEVOVntIVFRQX1JFRkVSRVJ9OwojICAgICAgICBpZiAoJFJlZmVyZXIgPX4gL1w/KC4rKSQvKSB7CiMgICAgICAgICAgICAkUmVmZXJlciA9ICQxOwojICAgICAgICB9CiMKIyAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gJFJlZmVyZXIpOwojICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGZhc3QgaGFuZGxlIGZvciBmcmVkIHNldHRpbmdzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2V0dGluZycpIHsKICAgICAgICBteSAkTW9kdWxlRm9yUmVmID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZyZWQ6Ok1vZHVsZScpOwogICAgICAgIGRlbGV0ZSAkTW9kdWxlRm9yUmVmLT57Q29uc29sZX07CiAgICAgICAgZm9yIG15ICRNb2R1bGUgKGtleXMgJXskTW9kdWxlRm9yUmVmfSkgewogICAgICAgICAgICBteSAkQ2hlY2tlZCA9ICcnOwogICAgICAgICAgICBpZiAoJE1vZHVsZUZvclJlZi0+eyRNb2R1bGV9LT57QWN0aXZlfSkgewogICAgICAgICAgICAgICAgJENoZWNrZWQgPSAnY2hlY2tlZD0iY2hlY2tlZCInOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRnJlZE1vZHVsZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBGcmVkTW9kdWxlID0+ICRNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2tlZCAgICA9PiAkQ2hlY2tlZCwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiRnJlZDo6JE1vZHVsZSIpKSB7CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDb25maWcnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBGcmVkTW9kdWxlID0+ICRNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gIkZyZWQtU2V0dGluZyIpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnRGV2ZWxGcmVkU2V0dGluZycsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGZhc3QgaGFuZGxlIGZvciBmcmVkIHNldHRpbmdzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2V0dGluZ0FjdGlvbicpIHsKICAgICAgICBteSAkTW9kdWxlRm9yUmVmID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZyZWQ6Ok1vZHVsZScpOwogICAgICAgIG15IEBTZWxlY3RlZEZyZWRNb2R1bGVzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KFBhcmFtID0+ICdGcmVkTW9kdWxlJyk7CiAgICAgICAgbXkgJVNlbGVjdGVkTW9kdWxlcyA9IG1hcCB7ICRfID0+IDE7IH0gQFNlbGVjdGVkRnJlZE1vZHVsZXM7CiAgICAgICAgbXkgJFVwZGF0ZUZsYWc7CiAgICAgICAgZGVsZXRlICRNb2R1bGVGb3JSZWYtPntDb25zb2xlfTsKCiAgICAgICAgZm9yIG15ICRNb2R1bGUgKGtleXMgJXskTW9kdWxlRm9yUmVmfSkgewogICAgICAgICAgICAjIHVwZGF0ZSB0aGUgc3lzY29uZmlnIHNldHRpbmdzCiAgICAgICAgICAgIGlmICgkTW9kdWxlRm9yUmVmLT57JE1vZHVsZX0tPntBY3RpdmV9ICYmICEkU2VsZWN0ZWRNb2R1bGVzeyRNb2R1bGV9IHx8CiAgICAgICAgICAgICAgICAhJE1vZHVsZUZvclJlZi0+eyRNb2R1bGV9LT57QWN0aXZlfSAmJiAkU2VsZWN0ZWRNb2R1bGVzeyRNb2R1bGV9CiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdUb29sT2JqZWN0fS0+Q29uZmlnSXRlbVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgICAgIEtleSA9PiAiRnJlZDo6TW9kdWxlIyMjJE1vZHVsZSIsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAnQWN0aXZlJyA9PiAkU2VsZWN0ZWRNb2R1bGVzeyRNb2R1bGV9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICMgJ01vZHVsZScgPT4gJE1vZHVsZUZvclJlZi0+eyRNb2R1bGV9LT57TW9kdWxlfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFVwZGF0ZUZsYWcgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFjdGl2ZSBmcmVkIG1vZHVsZSB0b2RvcwogICAgICAgICAgICBpZiAoISRNb2R1bGVGb3JSZWYtPnskTW9kdWxlfS0+e0FjdGl2ZX0gJiYgJFNlbGVjdGVkTW9kdWxlc3skTW9kdWxlfSkgewogICAgICAgICAgICAgICAgIyBGSVhNRSBFcnJvcmhhbmRsaW5nIQogICAgICAgICAgICAgICAgJFNlbGYtPntGcmVkT2JqZWN0fS0+QWN0aXZhdGVNb2R1bGVUb2RvcygKICAgICAgICAgICAgICAgICAgICBNb2R1bGVOYW1lID0+ICRNb2R1bGUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGRlYWN0aXZhdGUgZnJlZG1vZHVsZSB0b2RvcwogICAgICAgICAgICBpZiAoJE1vZHVsZUZvclJlZi0+eyRNb2R1bGV9LT57QWN0aXZlfSAmJiAhJFNlbGVjdGVkTW9kdWxlc3skTW9kdWxlfSkgewogICAgICAgICAgICAgICAgIyBGSVhNRSBFcnJvcmhhbmRsaW5nIQogICAgICAgICAgICAgICAgJFNlbGYtPntGcmVkT2JqZWN0fS0+RGVhY3RpdmF0ZU1vZHVsZVRvZG9zKAogICAgICAgICAgICAgICAgICAgIE1vZHVsZU5hbWUgPT4gJE1vZHVsZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgIyB0aGlzIGZ1bmN0aW9uIGlzIG5lc2VjY2FyeSB0byBmaW5pc2ggdGhlIHN5c2NvbmZpZyB1cGRhdGUKICAgICAgICBpZiAoJFVwZGF0ZUZsYWcpIHsKICAgICAgICAgICAgJFNlbGYtPntDb25maWdUb29sT2JqZWN0fS0+Q29uZmlnSXRlbVVwZGF0ZUZpbmlzaCgpOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiTm93IHRoZSBicm93c2VyIHNob3VsZCBiZSBjbG9zZWQiKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoxOwo=