Fred
0.1.4
OTRS GmbH
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
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
2007-07-02 14:19:05
opms.otrs.com
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9PdXRwdXRGaWx0ZXJGcmVkLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IE91dHB1dEZpbHRlckZyZWQucG0sdiAxLjQgMjAwNy8wNC8xNiAxNTo1MTo1MiBvdCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQ7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuNCAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KE1haW5PYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJFRleHQgPSAnJzsKICAgIG15ICRIb21lID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKCiAgICAjIGRvIG5vdGluZyBvbiByZWRpcmVjdHMKICAgIGlmICgkeyRQYXJhbXtEYXRhfX0gPX4gL15TdGF0dXM6IDMwMiBNb3ZlZC9taSAmJiAkeyRQYXJhbXtEYXRhfX0gPX4gL15sb2NhdGlvbjovbWkgJiYgbGVuZ3RoKCR7JFBhcmFte0RhdGF9fSkgPCA4MDAgKSB7CiAgICAgICAgIyBkbyBub3RoaW5nCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBDaGVjayB0aGUgSFRNTC1PdXRwdXQgd2l0aCBIVE1MOjpMaW50CiAgICBpZiAoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZyZWQ6OkhUTUxDaGVjaycpKSB7CiAgICAgICAgbXkgJEhUTUxUZXh0ID0gJyc7CiAgICAgICAgaWYgKCRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJ0hUTUw6OkxpbnQnKSkgewogICAgICAgICAgICBIVE1MOjpMaW50LT5pbXBvcnQoKTsKICAgICAgICAgICAgbXkgJEhUTUxMaW50T2JqZWN0ID0gSFRNTDo6TGludC0+bmV3KCBvbmx5X3R5cGVzID0+IEhUTUw6OkxpbnQ6OkVycm9yLT5TVFJVQ1RVUkUgKTsKICAgICAgICAgICAgJEhUTUxMaW50T2JqZWN0LT5wYXJzZSAoJHskUGFyYW17RGF0YX19KTsKCiAgICAgICAgICAgIG15ICRFcnJvckNvdW50ZXIgPSAkSFRNTExpbnRPYmplY3QtPmVycm9yczsKICAgICAgICAgICAgZm9yZWFjaCBteSAkRXJyb3IgKCRIVE1MTGludE9iamVjdC0+ZXJyb3JzKSB7CiAgICAgICAgICAgICAgICBteSAkU3RyaW5nIC49ICRFcnJvci0+YXNfc3RyaW5nOwogICAgICAgICAgICAgICAgaWYgKCRTdHJpbmcgIX4gL0ludmFsaWQgY2hhcmFjdGVyIC4rIHNob3VsZCBiZSB3cml0dGVuIGFzIC8pIHsKICAgICAgICAgICAgICAgICAgICAkSFRNTFRleHQgLj0gICRTdHJpbmcgLiAiXG4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJEhUTUxUZXh0ID0gJ1RoZSBIVE1MLWNoZWNrZXIgb2YgRnJlZCByZXF1aXJlcyBIVE1MOjpMaW50IHRvIGJlIGluc3RhbGxlZCEnCiAgICAgICAgICAgICAgICAuICdQbGVhc2UgaW5zdGFsbCBIVE1MOjpMaW50IG9yIGRlYWN0aXZhdGUgdGhlIEhUTUwtY2hlY2tlciB2aWEgU3lzQ29uZmlnLic7CiAgICAgICAgfQoKICAgICAgICBpZiAoJEhUTUxUZXh0KSB7CiAgICAgICAgICAgICRUZXh0IC49ICRTZWxmLT5fSFRNTFF1b3RlKAogICAgICAgICAgICAgICAgVGV4dCA9PiAkSFRNTFRleHQsCiAgICAgICAgICAgICAgICBUaXRsZSA9PiAiSFRNTC1DaGVja2VyIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBTZWFyY2ggZm9yIHN0ZGVyciBtZXNzYWdlcwogICAgaWYgKCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcmVkOjpTVERFUlJMb2cnKSkgewogICAgICAgIGlmIChvcGVuIChPVVRQVVQsICI8ICIuJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKS4iL3Zhci9mcmVkLmxvZyIpKSB7CiAgICAgICAgICAgIG15ICRFcnJvckxvZ1RleHQgPSAnJzsKICAgICAgICAgICAgbXkgQFJvdyA9IDxPVVRQVVQ+OwogICAgICAgICAgICBteSBAUmV2ZXJzZVJvdyA9IHJldmVyc2UoQFJvdyk7CiAgICAgICAgICAgIGZvcmVhY2ggKEBSZXZlcnNlUm93KSB7CiAgICAgICAgICAgICAgICBpZiAoJF8gPX4gL0ZSRUQvKSB7CiAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRFcnJvckxvZ1RleHQgLj0gJF87CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHByaW50IFNUREVSUiAiRlJFRFxuIjsKCiAgICAgICAgICAgIGNsb3NlIChPVVRQVVQpOwoKICAgICAgICAgICAgaWYgKCRFcnJvckxvZ1RleHQpIHsKICAgICAgICAgICAgICAgICRUZXh0IC49ICRTZWxmLT5fSFRNTFF1b3RlKAogICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJEVycm9yTG9nVGV4dCwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAiU1RERVJSIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAjIHVzZSB0aGUgY3ZzIGNoZWNrcwojICAgICBpZiAoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZyZWQ6OkNWU0ZpbHRlcicpKSB7CiMgICAgICAgICBteSAkUGF0aFRvQ1ZTRmlsdGVyID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZyZWQ6OlBhdGhUb0NWU0ZpbHRlcicpOwojICAgICAgICAgaWYgKCR7JFBhcmFte0RhdGF9fSA9fiAvTm90aWZ5Lis/QWN0aW9uLis/dmFsdWU9IiguKz8pIj4uKj8kL214cykgewojICAgICAgICAgICAgIG15ICRBY3Rpb24gPSAkMTsKIyAgICAgICAgICAgICBteSAkRmlsdGVyVGV4dCA9ICcnOwojICAgICAgICAgICAgIGlmICgtZSAiJEhvbWUvS2VybmVsL01vZHVsZXMvJEFjdGlvbi5wbSIpIHsKIyAgICAgICAgICAgICAgICAgaWYgKG9wZW4gKE9VVFBVVCwgInBlcmwgJFBhdGhUb0NWU0ZpbHRlci9maWx0ZXItZXh0ZW5kZWQucGwgJEhvbWUvS2VybmVsL01vZHVsZXMgJEhvbWUvS2VybmVsL01vZHVsZXMvJEFjdGlvbi5wbSB8IikpIHsKIyAgICAgICAgICAgICAgICAgICAgIG15ICRNZXJnZSA9IDA7CiMgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoPE9VVFBVVD4pIHsKIyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF8hfiAvXk5PVElDRS8pIHsKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEZpbHRlclRleHQgLj0gJF87CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRNZXJnZSA9IDE7CiMgICAgICAgICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgICAgICAgY2xvc2UgKE9VVFBVVCk7CiMgICAgICAgICAgICAgICAgICAgICBpZiAoJE1lcmdlKSB7CiMgICAgICAgICAgICAgICAgICAgICAgICAgJEZpbHRlclRleHQgPSAkQWN0aW9uIC4gIi5wbVxuIiAuICRGaWx0ZXJUZXh0OwojICAgICAgICAgICAgICAgICAgICAgfQojICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgfQojCiMgICAgICAgICAgICAgbXkgJFN5c3RlbU1vZHVsZSA9ICcnOwojICAgICAgICAgICAgIGlmICgkQWN0aW9uID1+IC8oQWdlbnR8QWRtaW58Q3VzdG9tZXJ8UHVibGljKSguKykkLykgewojICAgICAgICAgICAgICAgICAkU3lzdGVtTW9kdWxlID0gJDI7CiMgICAgICAgICAgICAgfQojCiMgICAgICAgICAgICAgaWYgKC1lICIkSG9tZS9LZXJuZWwvU3lzdGVtLyRTeXN0ZW1Nb2R1bGUucG0iKSB7CiMgICAgICAgICAgICAgICAgIGlmIChvcGVuIChPVVRQVVQsICJwZXJsICRQYXRoVG9DVlNGaWx0ZXIvZmlsdGVyLWV4dGVuZGVkLnBsICRIb21lL0tlcm5lbC9TeXN0ZW0gJEhvbWUvS2VybmVsL1N5c3RlbS8kU3lzdGVtTW9kdWxlLnBtIHwiKSkgewojICAgICAgICAgICAgICAgICAgICAgbXkgJE1lcmdlID0gMDsKIyAgICAgICAgICAgICAgICAgICAgIHdoaWxlICg8T1VUUFVUPikgewojICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkXyF+IC9eTk9USUNFLykgewojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRmlsdGVyVGV4dCAuPSAkXzsKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE1lcmdlID0gMTsKIyAgICAgICAgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgICAgICBjbG9zZSAoT1VUUFVUKTsKIyAgICAgICAgICAgICAgICAgICAgIGlmICgkTWVyZ2UpIHsKIyAgICAgICAgICAgICAgICAgICAgICAgICAkRmlsdGVyVGV4dCA9ICRTeXN0ZW1Nb2R1bGUgLiAiLnBtXG4iIC4gJEZpbHRlclRleHQ7CiMgICAgICAgICAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgICAgIH0KIyAgICAgICAgICAgICB9CiMgICAgICAgICAgICAgaWYgKCRGaWx0ZXJUZXh0KSB7CiMgICAgICAgICAgICAgICAgICRUZXh0IC49ICRTZWxmLT5fSFRNTFF1b3RlKAojICAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkRmlsdGVyVGV4dCwKIyAgICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICJmaWx0ZXItZXh0ZW5kZWQucGwiLAojICAgICAgICAgICAgICAgICApOwojICAgICAgICAgICAgIH0KIyAgICAgICAgIH0KIyAgICAgfQogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgaWYgKCRUZXh0KSB7CiAgICAgICAgaWYgKCR7JFBhcmFte0RhdGF9fSA9fiBzLyhcPGJvZHkofC4rPylcPikvJDFcbiRUZXh0XG5cblxuXG4vbXgpIHsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfSFRNTFF1b3RlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRPdXRwdXQgPSAnJzsKICAgICRQYXJhbXtUZXh0fSA9fiBzLyYvJmFtcDsvZzsKICAgICRQYXJhbXtUZXh0fSA9fiBzLzwvJmx0Oy9nOwogICAgJFBhcmFte1RleHR9ID1+IHMvPi8mZ3Q7L2c7CiAgICAkUGFyYW17VGV4dH0gPX4gcy9cbi9cblw8YnJcPi9nOwogICAgIyBzaG93biBtZXNzYWdlCiAgICAkT3V0cHV0IC49ICI8dGFibGUgYmdjb2xvcj1cIiMwMDAwMDBcIiBjZWxsc3BhY2luZz1cIjNcIiBjZWxscGFkZGluZz1cIjBcIiB3aWR0aD1cIjEwMCVcIj5cbiI7CiAgICAkT3V0cHV0IC49ICI8dHI+XG4iOwogICAgJE91dHB1dCAuPSAiPHRkIGJnY29sb3I9XCJiYTBmMGZcIj5cbiI7CiAgICAkT3V0cHV0IC49ICI8dGFibGUgYmdjb2xvcj1cIiNmZmZmZmZcIiBjZWxsc3BhY2luZz1cIjBcIiBjZWxscGFkZGluZz1cIjJcIiB3aWR0aD1cIjEwMCVcIj5cbiI7CiAgICAkT3V0cHV0IC49ICI8dHI+XG4iOwogICAgJE91dHB1dCAuPSAiPHRkIGJnY29sb3I9XCJiYTBmMGZcIj5cbiI7CiAgICAkT3V0cHV0IC49ICI8Yj48Zm9udCBjb2xvcj1cIiNmZmZmZmZcIj5GcmVkOiAkUGFyYW17VGl0bGV9PC9mb250PjwvYj5cbiI7CiAgICAkT3V0cHV0IC49ICI8L3RkPlxuIjsKICAgICRPdXRwdXQgLj0gIjwvdHI+XG4iOwogICAgJE91dHB1dCAuPSAiPHRyPlxuIjsKICAgICRPdXRwdXQgLj0gIjx0ZD5cbiI7CiAgICAkT3V0cHV0IC49ICI8Zm9udCBzaXplPVwiLTJcIj4iIC4gJFBhcmFte1RleHR9IC4iPC9mb250PiI7CiAgICAkT3V0cHV0IC49ICI8L3RkPlxuIjsKICAgICRPdXRwdXQgLj0gIjwvdHI+XG4iOwogICAgJE91dHB1dCAuPSAiPC90YWJsZT5cbiI7CiAgICAkT3V0cHV0IC49ICI8L3RkPlxuIjsKICAgICRPdXRwdXQgLj0gIjwvdHI+XG4iOwogICAgJE91dHB1dCAuPSAiPC90YWJsZT5cbiI7CiAgICAjIGp1c3QgYSBzbWFsbCBzcGFjZQogICAgJE91dHB1dCAuPSAiPHRhYmxlIGNlbGxzcGFjaW5nPVwiMVwiIGNlbGxwYWRkaW5nPVwiMFwiIHdpZHRoPVwiMTAwJVwiPlxuIjsKICAgICRPdXRwdXQgLj0gIjx0cj5cbiI7CiAgICAkT3V0cHV0IC49ICI8dGQ+XG4iOwogICAgJE91dHB1dCAuPSAiPC90ZD5cbiI7CiAgICAkT3V0cHV0IC49ICI8L3RyPlxuIjsKICAgICRPdXRwdXQgLj0gIjwvdGFibGU+XG4iOwogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IEZyZWQueG1sLHYgMS41IDIwMDcvMDYvMjcgMDk6MTA6MDUgbWFydGluIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJDb250ZW50IyMjRnJlZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlN1YnNjcmliZSB0aGUgb3V0cHV0IGZpbHRlciBhdCB0aGUgc3lzdGVtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5NZWxkZXQgZGVuIE91dHB1dEZpbHRlckZyZWQgYW0gU3lzdGVtIGFuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlYnVnIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPCEtLQogICAgICAgICRTZWxmLT57J0Zyb250ZW5kOjpPdXRwdXQ6OkZpbHRlckNvbnRlbnQnfS0+eydGcmVkJ30gPSB7CiAgICAgICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok91dHB1dEZpbHRlckZyZWQnLAogICAgICAgICAgICBEZWJ1ZyA9PiAwLAogICAgICAgIH07CiAgICAtLT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OkhUTUxDaGVjayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgYW4gcmVhbHRpbWUgSFRNTC1jaGVja2VyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5IaWVyIGFrdGl2aWVyZW4gd2VubiB6dXIgTGF1ZnplaXQgZWluIEhUTUwtQ2hlY2tlciBhdXNnZWZocnQgd2VyZGVuIHNvbGwuIFdJQ0hUSUc6IERhcyBDcGFuLU1vZHVsIEhUTUw6OmxpbnQgaXN0IGhpZXJmdWVyIG5vdHdlbmRpZy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OlNUREVSUkxvZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgdG8gc2VlIHRoZSBTVERFUlJMb2cuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkhpZXIgYWt0aXZpZXJlbiB3ZW5uIG1hbiB6dXIgTGF1ZnplaXQgZGFzIFNUREVSUkxvZyBzZWhlbiB3aWxsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8IS0tICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OkNWU0ZpbHRlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlR1cm4gb24gaWYgeW91IHdhbnQgdG8gYWxsb3cgdGhlIENWU0ZpbHRlciByZWFsdGltZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SGllciBha3RpdmllcmVuIHVtIHp1ciBMYXVmemVpdCBiZXJlaXRzIGRpZSBDVlMtRmlsdGVyIHp1IHRlc3Rlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyZWQ6OlBhdGhUb0NWU0ZpbHRlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlBhdGggdG8gdGhlIGN2cyBmaWx0ZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlBmYWQgenVtIENWUy1GaWx0ZXIuIEJlaW0gQ1ZTLUZpbHRlciBoYW5kZWx0IGVzIHNpY2ggdW0gZGllIGZpbHRlci1leHRlbmRlZC5wbCBkZXMgQ1ZTUk9PVC1SZXBvc2l0aW9yeSBkZXMgaW50ZXJuZW4gQ1ZTLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyZWQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4vaG9tZS90ci9zcmMvQ1ZTUk9PVC1pbnQ8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+LS0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJEYXRhYmFzZTo6U2xvd0xvZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRvIGVuYWJsZSBzbG93IHNxbCBsb2cgKHRvIGxvZyBhbGwgc3FsIHF1ZXJpZXMgd2hpY2ggdGFrZSBsb25nZXIgdGhlIDQgc2VjLikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlVtIFNsb3cgU1FMIHp1IGFrdGl2aWVyZW4gKG1pdHNjaG5laWRlciBhbGxlciBTUUwtQWJmcmFnZW4gd2VsY2hlIGxhZW5nZXIgNCBTZWsuIGJyYXVjaGVuKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmVkPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
IyAtLQojIEFBQUZyZWQucG0gLSB0aGUgY29uZmlnIHRvIGJpbmQgU1RERVJSIHRvIGFuIGxvZyBmaWxlIHVzYWJsZSBmb3IgZnJlZAojIENvcHlyaWdodCAoQykgMjAwMy0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMuY29tLwojIC0tCiMgJElkOiBBQUFGcmVkLnBtLHYgMS4xIDIwMDcvMDIvMjcgMjA6NDg6MzggbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKICAgIGlmICgkRU5We0hUVFBfVVNFUl9BR0VOVH0pIHsKICAgICAgICAjIGNoZWNrIGxvZyBmaWxlIHNpemUKICAgICAgICBteSAkU2l6ZSA9IC1zICRTZWxmLT57SG9tZX0uIi92YXIvZnJlZC5sb2ciOwogICAgICAgIGlmICgkU2l6ZSA+IDIwKjEwMjQqMTAyNCkgewogICAgICAgICAgICB1bmxpbmsgJFNlbGYtPntIb21lfS4iL3Zhci9mcmVkLmxvZyI7CiAgICAgICAgfQogICAgICAgICMgY3JlYXRlIHRtcCBmaWxlIGhhbmRsZQogICAgICAgIG9wZW4oT0xET1VULCAiPiZTVERFUlIiKTsKICAgICAgICAjIG1vdmUgU1RET1VUIHRvIHRtcCBmaWxlCiAgICAgICAgaWYgKCFvcGVuKFNUREVSUiwgIj4+ICIuJFNlbGYtPntIb21lfS4iL3Zhci9mcmVkLmxvZyIpKSB7CiAgICAgICAgICAgIHByaW50IFNUREVSUiAiRVJST1I6IENhbid0IHdyaXRlICRTZWxmLT57SG9tZX0vdmFyL2ZyZWQubG9nOiAkISI7CiAgICAgICAgfQogICAgICAgICMgcmVzdG9yZSBTVERPVVQgZmlsZSBoYW5kbGUKIyAgICAgICBvcGVuKFNURE9VVCwgIj4mT0xET1VUIik7CiAgICAgICAgY2xvc2UoT0xET1VUKTsKICAgIH0KCjE7Cg==