Benchmark 1.2.1 OTRS GmbH http://otrs.org/ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Updated to 2.2 framework. A simple benchmark application. Ein einfache Benchmark Applikation. 2.2.x 2007-03-07 23:03:49 opms.otrs.com PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8b3Ryc19jb25maWcgdmVyc2lvbj0iMS4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8Q1ZTPiRJZDogQmVuY2htYXJrLnhtbCx2IDEuMyAyMDA3LzAxLzE5IDE4OjEzOjE2IG1oIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWRtaW5CZW5jaG1hcmsiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5CZW5jaCBvYmplY3QgIGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+RGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWRtaW5CZW5jaC1PYmpla3RzIGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj5EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+QmVuY2htYXJrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8VGl0bGU+QmVuY2htYXJrPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxHcm91cD5hZG1pbjwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+QWRtaW4tQmVuY2g8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+QmVuY2htYXJrPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5CbG9jazQ8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjIxMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+ IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluQmVuY2htYXJrLnBtIC0gYSBiZW5jaCBtYXJrIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pbkJlbmNobWFyay5wbSx2IDEuMyAyMDA3LzAzLzA3IDIxOjAzOjQyIG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkJlbmNobWFyazsKCnVzZSBzdHJpY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RmlsZVRlbXA7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4zICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICBmb3JlYWNoIChrZXlzICVQYXJhbSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBPcGplY3RzCiAgICBmb3JlYWNoIChxdyhQYXJhbU9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBpZiAoISRTZWxmLT57JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIik7CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57RmlsZVRlbXBPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkZpbGVUZW1wLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU1FMJykgewogICAgICAgIG15ICRJbnNlcnQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0luc2VydCcpOwogICAgICAgIG15ICRVcGRhdGUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1VwZGF0ZScpOwogICAgICAgIG15ICRTZWxlY3QgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1NlbGVjdCcpOwogICAgICAgIG15ICRNb2RlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdNb2RlJyk7CiAgICAgICAgZm9yZWFjaCAoMS4uJE1vZGUpIHsKICAgICAgICAgICAgJFNlbGYtPnsiREJPYmplY3QkXyJ9ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoJXskU2VsZn0pOwogICAgICAgIH0KICAgICAgICAkUGFyYW17SW5zZXJ0VGltZX0gPSAwOwogICAgICAgICRQYXJhbXtVcGRhdGVUaW1lfSA9IDA7CiAgICAgICAgJFBhcmFte1NlbGVjdFRpbWV9ID0gMDsKICAgICAgICAkUGFyYW17RGVsZXRlVGltZX0gPSAwOwogICAgICAgIG15ICRUaW1lU3RhcnQgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICAgICAgJFNlbGYtPl9TUUxJbnNlcnQoJEluc2VydCwgJE1vZGUpOwogICAgICAgIG15ICRUaW1lMSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKTsKICAgICAgICAkU2VsZi0+X1NRTFVwZGF0ZSgkVXBkYXRlLCAkTW9kZSk7CiAgICAgICAgbXkgJFRpbWUyID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgICAgICRTZWxmLT5fU1FMU2VsZWN0KCRTZWxlY3QsICRNb2RlKTsKICAgICAgICBteSAkVGltZTMgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICAgICAgJFNlbGYtPl9TUUxEZWxldGUoKTsKICAgICAgICBteSAkVGltZTQgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICAgICAgJFBhcmFte0luc2VydFRpbWV9ID0gJFBhcmFte0luc2VydFRpbWV9KyRUaW1lMS0kVGltZVN0YXJ0OwogICAgICAgICRQYXJhbXtVcGRhdGVUaW1lfSA9ICRQYXJhbXtVcGRhdGVUaW1lfSskVGltZTItJFRpbWUxOwogICAgICAgICRQYXJhbXtTZWxlY3RUaW1lfSA9ICRQYXJhbXtTZWxlY3RUaW1lfSskVGltZTMtJFRpbWUyOwogICAgICAgICRQYXJhbXtEZWxldGVUaW1lfSA9ICRQYXJhbXtEZWxldGVUaW1lfSskVGltZTQtJFRpbWUzOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3VsdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgSGVhZCA9PiAnU1FMJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICgoJFBhcmFte0luc2VydFRpbWV9LyRNb2RlKSooMTAwMDAvJEluc2VydCkgPCAzKSB7CiAgICAgICAgICAgICRQYXJhbXtJbnNlcnRNb29kfSA9ICc6LSknOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoKCRQYXJhbXtJbnNlcnRUaW1lfS8kTW9kZSkqKDEwMDAwLyRJbnNlcnQpIDwgNCkgewogICAgICAgICAgICAkUGFyYW17SW5zZXJ0TW9vZH0gPSAnOi18JzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtJbnNlcnRNb29kfSA9ICc6LSgnOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXN1bHRSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEtleSA9PiAnSW5zZXJ0IFRpbWUnLAogICAgICAgICAgICAgICAgVGltZSA9PiAiJFBhcmFte0luc2VydFRpbWV9IHMgJFBhcmFte0luc2VydE1vb2R9IiwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICgkSW5zZXJ0KiRNb2RlKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICgoJFBhcmFte1VwZGF0ZVRpbWV9LyRNb2RlKSooMTAwMDAvJFVwZGF0ZSkgPCA0KSB7CiAgICAgICAgICAgICRQYXJhbXtVcGRhdGVNb29kfSA9ICc6LSknOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoKCRQYXJhbXtVcGRhdGVUaW1lfS8kTW9kZSkqKDEwMDAwLyRVcGRhdGUpIDwgNSkgewogICAgICAgICAgICAkUGFyYW17VXBkYXRlTW9vZH0gPSAnOi18JzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtVcGRhdGVNb29kfSA9ICc6LSgnOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXN1bHRSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVXBkYXRlIFRpbWUnLAogICAgICAgICAgICAgICAgVGltZSA9PiAiJFBhcmFte1VwZGF0ZVRpbWV9IHMgJFBhcmFte1VwZGF0ZU1vb2R9IiwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICgkVXBkYXRlKiRNb2RlKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICgoJFBhcmFte1NlbGVjdFRpbWV9LyRNb2RlKSooMTAwMDAvJFNlbGVjdCkgPCA1KSB7CiAgICAgICAgICAgICRQYXJhbXtTZWxlY3RNb29kfSA9ICc6LSknOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoKCRQYXJhbXtTZWxlY3RUaW1lfS8kTW9kZSkqKDEwMDAwLyRTZWxlY3QpIDwgNikgewogICAgICAgICAgICAkUGFyYW17U2VsZWN0TW9vZH0gPSAnOi18JzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtTZWxlY3RNb29kfSA9ICc6LSgnOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXN1bHRSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEtleSA9PiAnU2VsZWN0IFRpbWUnLAogICAgICAgICAgICAgICAgVGltZSA9PiAiJFBhcmFte1NlbGVjdFRpbWV9IHMgJFBhcmFte1NlbGVjdE1vb2R9IiwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICgkU2VsZWN0KiRNb2RlKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICgoJFBhcmFte0RlbGV0ZVRpbWV9LyRNb2RlKSA8IDEuNSkgewogICAgICAgICAgICAkUGFyYW17RGVsZXRlTW9vZH0gPSAnOi0pJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCgkUGFyYW17RGVsZXRlVGltZX0vJE1vZGUpIDwgMi41KSB7CiAgICAgICAgICAgICRQYXJhbXtEZWxldGVNb29kfSA9ICc6LXwnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte0RlbGV0ZU1vb2R9ID0gJzotKCc7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3VsdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ID0+ICdEZWxldGUgVGltZScsCiAgICAgICAgICAgICAgICBUaW1lID0+ICIkUGFyYW17RGVsZXRlVGltZX0gcyAkUGFyYW17RGVsZXRlTW9vZH0iLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3VsdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ID0+ICdNdWx0aXBsaWVyJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICIqICRNb2RlIiwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkJlbmNobWFyaycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Zyb250ZW5kJykgewogICAgICAgIG15ICRNb2R1bGUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ01vZHVsZScpOwogICAgICAgIG15ICRUaW1lcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnVGltZXMnKTsKCiAgICAgICAgIyBjaGVjayBtb2R1bGUgcmVnaXN0cnkKICAgICAgICBteSAkTW9kdWxlUmVnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyRNb2R1bGV9OwogICAgICAgICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJ0tlcm5lbDo6TW9kdWxlczo6Jy4kTW9kdWxlKTsKICAgICAgICAjIHByb3ZlIG9mIGNvbmNlcHQhIC0gY3JlYXRlICRHZW5lcmljT2JqZWN0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzdWx0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBIZWFkID0+ICdGcm9udGVuZCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAkVGltZVN0YXJ0ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwoKICAgICAgICAjIGNyZWF0ZSB0bXAgZmlsZSBoYW5kbGUKICAgICAgICBvcGVuKE9MRE9VVCwgIj4mU1RET1VUIik7CiAgICAgICAgIyBtb3ZlIFNURE9VVCB0byB0bXAgZmlsZQogICAgICAgIG15ICgkRkgsICRGaWxlbmFtZSkgPSAkU2VsZi0+e0ZpbGVUZW1wT2JqZWN0fS0+VGVtcEZpbGUoKTsKICAgICAgICBvcGVuKFNURE9VVCwgIj4gJEZpbGVuYW1lIik7CgogICAgICAgIGZvcmVhY2ggKDEuLiRUaW1lcykgewogICAgICAgICAgICBteSAkVGltZVN0YXJ0ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgICAgICAgICBteSAkR2VuZXJpY09iamVjdCA9ICgnS2VybmVsOjpNb2R1bGVzOjonLiRNb2R1bGUpLT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIE1vZHVsZVJlZyA9PiAkTW9kdWxlUmVnLAogICAgICAgICAgICApOwogICAgICAgICAgICAjIC0+UnVuICRBY3Rpb24gd2l0aCAkR2VuZXJpY09iamVjdAojICAgICAgICAgICAgJE91dHB1dCAuPSAkR2VuZXJpY09iamVjdC0+UnVuKCk7CiAgICAgICAgICAgICRHZW5lcmljT2JqZWN0LT5SdW4oKTsKICAgICAgICAgICAgbXkgJFRpbWUxID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgICAgICAgICBteSAkVGltZSA9ICRUaW1lMS0kVGltZVN0YXJ0OwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVzdWx0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnUmVxdWVzdCcsCiAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAiJFRpbWUgcyIsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gIiRfIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICMgcmVzdG9yZSBTVERPVVQgZmlsZSBoYW5kbGUKICAgICAgICBvcGVuKFNURE9VVCwgIj4mT0xET1VUIik7CiAgICAgICAgY2xvc2UoT0xET1VUKTsKCiAgICAgICAgbXkgJFRpbWUxID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgICAgICRQYXJhbXtUaW1lfSA9ICRUaW1lMS0kVGltZVN0YXJ0OwoKICAgICAgICBpZiAoKCRQYXJhbXtUaW1lfS8kVGltZXMpIDwgMikgewogICAgICAgICAgICAkUGFyYW17TW9vZH0gPSAnOi0pJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCgkUGFyYW17VGltZX0vJFRpbWVzKSA8IDMpIHsKICAgICAgICAgICAgJFBhcmFte01vb2R9ID0gJzotfCc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17TW9vZH0gPSAnOi0oJzsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3VsdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ID0+ICdNb2R1bGUnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gIiRNb2R1bGUiLAogICAgICAgICAgICAgICAgVGltZSA9PiAiJFBhcmFte1RpbWV9IHMgJFBhcmFte01vb2R9IiwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5CZW5jaG1hcmsnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17J01vZGVTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEgKiBOb3JtYWwnLAogICAgICAgICAgICAgICAgMyA9PiAnMyAqIEhpZ2gnLAogICAgICAgICAgICAgICAgNSA9PiAnNSAqIEhlYXZ5JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTmFtZSA9PiAnTW9kZScsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17J01vZHVsZSd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpDb21tb25QYXJhbScpLT57QWN0aW9ufTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkJlbmNobWFyaycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9TUUxJbnNlcnQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICRDb3VudCA9IHNoaWZ0OwogICAgbXkgJE1vZGUgPSBzaGlmdDsKICAgIGZvcmVhY2ggbXkgJEMgKDEuLiRDb3VudCkgewogICAgICAgIGZvcmVhY2ggbXkgJE0gKDEuLiRNb2RlKSB7CiAgICAgICAgICAgICRTZWxmLT57IkRCT2JqZWN0JE0ifS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIGJlbmNoX3Rlc3QgKG5hbWVfYSwgbmFtZV9iKSB2YWx1ZXMgKCdhYWEkQy0kTScsICdiYmInKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfU1FMVXBkYXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkQ291bnQgPSBzaGlmdDsKICAgIG15ICRNb2RlID0gc2hpZnQ7CiAgICBmb3JlYWNoIG15ICRDICgxLi4kQ291bnQpIHsKICAgICAgICBmb3JlYWNoIG15ICRNICgxLi4kTW9kZSkgewogICAgICAgICAgICAkU2VsZi0+eyJEQk9iamVjdCRNIn0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgYmVuY2hfdGVzdCBTRVQgbmFtZV9hID0gJzExMScsIG5hbWVfYiA9ICcyMjInIFdIRVJFIG5hbWVfYSA9ICdhYWEkQy0kTSciLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1NRTFNlbGVjdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJENvdW50ID0gc2hpZnQ7CiAgICBteSAkTW9kZSA9IHNoaWZ0OwogICAgZm9yZWFjaCBteSAkQyAoMS4uJENvdW50KSB7CiAgICAgICAgZm9yZWFjaCBteSAkTSAoMS4uJE1vZGUpIHsKICAgICAgICAgICAgJFNlbGYtPnsiREJPYmplY3QkTSJ9LT5QcmVwYXJlKAogICAgICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgbmFtZV9hLCBuYW1lX2IgRlJPTSBiZW5jaF90ZXN0IFdIRVJFIG5hbWVfYSA9ICdhYWEkQy0kTSciLAogICAgICAgICAgICApOwogICAgICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57IkRCT2JqZWN0JE0ifS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICAgICAjIGRvIG5vdGhpbmcKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1NRTERlbGV0ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gYmVuY2hfdGVzdCIsCiAgICApOwogICAgcmV0dXJuIDE7Cn0KCjE7Cg== IyAtLQojIEFkbWluQmVuY2htYXJrLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgYmVuY2ggbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFkbWluQmVuY2htYXJrLmR0bCx2IDEuMiAyMDA3LzAxLzE5IDE4OjEzOjE2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKPCEtLSBzdGFydCBmb3JtIC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkJlbmNobWFyayJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxicj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlNRTCI+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkJlbmNobWFyayJ9OiAkVGV4dHsiU1FMIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPkluc2VydDo8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjgwJSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ikluc2VydCIgdmFsdWU9IjEwMDAwIiBzaXplPSI2MCI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+VXBkYXRlOjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVXBkYXRlIiB2YWx1ZT0iMTAwMDAiIHNpemU9IjYwIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5TZWxlY3Q6PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTZWxlY3QiIHZhbHVlPSIxMDAwMCIgc2l6ZT0iNjAiPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPk11bHRpcGxpZXI6PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJNb2RlU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgICA8YnI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkZyb250ZW5kIj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQmVuY2htYXJrIn06ICRUZXh0eyJGcm9udGVuZCJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiTW9kdWxlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI4MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJNb2R1bGUiIHZhbHVlPSIkUURhdGF7Ik1vZHVsZSJ9IiBzaXplPSI2MCI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlJlcXVlc3RzIn06PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJUaW1lcyIgdmFsdWU9IjEwIiBzaXplPSI2MCI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KPCEtLSBkdGw6YmxvY2s6UmVzdWx0IC0tPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIiBhbGlnbj0iY2VudGVyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJSZXN1bHQifTogJFRleHR7IiRRRGF0YXsiSGVhZCJ9In08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJLZXkifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjQwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJWYWx1ZSJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNDAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlRpbWUifTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVzdWx0Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJLZXkifTo8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiVmFsdWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJUaW1lIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlc3VsdFJvdyAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UmVzdWx0IC0tPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZW5kIGZvcm0gLS0+Cg==