<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>CustomerMultitenancy</Name>
    <Version>11.0.4</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.io/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-04-27 14:07:55" Version="11.0.4">Update to OTOBO 11.0.16.</ChangeLog>
    <ChangeLog Date="2025-02-26 13:48:09" Version="11.0.3">Updated to OTOBO 11.0.8.</ChangeLog>
    <ChangeLog Date="2024-10-07 08:38:09" Version="11.0.2">Updated to OTOBO 11.0.6.</ChangeLog>
    <ChangeLog Date="2024-04-02 13:45:01" Version="11.0.1">Initial Release on OTOBO 11.</ChangeLog>
    <Description Lang="en">Group-based multitenancy for customer and customer user.</Description>
    <Description Lang="de">Gruppenbasierte Mandantenfähigkeit für Kunden und Kundenbenutzer.</Description>
    <Framework>11.0.x</Framework>
    <BuildCommitID>b0fbe78c06caf964467614d79d8f238a58c740e0</BuildCommitID>
    <BuildDate>2026-04-27 14:07:58</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/Modules/AdminCustomerCompany.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL01vZHVsZXMvQWRtaW5DdXN0b21lckNvbXBhbnkucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluQ3VzdG9tZXJDb21wYW55OwoKdXNlIHY1LjI0Owp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBuYW1lc3BhY2U6OmF1dG9jbGVhbjsKCiMgY29yZSBtb2R1bGVzCnVzZSBMaXN0OjpVdGlsIHF3KGFueSk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHslUGFyYW19LCAkVHlwZTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgKTsKCiAgICAjIHNldCBwcmVmIGZvciBjb2x1bW5zIGtleQogICAgJFNlbGYtPntQcmVmS2V5SW5jbHVkZUludmFsaWR9ID0gJ0luY2x1ZGVJbnZhbGlkJyAuICctJyAuICRTZWxmLT57QWN0aW9ufTsKCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA9ICRQcmVmZXJlbmNlc3sgJFNlbGYtPntQcmVmS2V5SW5jbHVkZUludmFsaWR9IH07CgogICAgJFNlbGYtPntEeW5hbWljRmllbGRMb29rdXB9ID0geyBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc30gfTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJE5hdiAgICAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05hdicgKSB8fCAwOwogICAgbXkgJE5hdmlnYXRpb25CYXJUeXBlID0gJE5hdiBlcSAnQWdlbnQnID8gJ0N1c3RvbWVycycgOiAnQWRtaW4nOwogICAgbXkgJFNlYXJjaCAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlYXJjaCcgKTsKICAgICRTZWFyY2gKICAgICAgICB8fD0gJENvbmZpZ09iamVjdC0+R2V0KCdBZG1pbkN1c3RvbWVyQ29tcGFueTo6UnVuSW5pdGlhbFdpbGRjYXJkU2VhcmNoJykgPyAnKicgOiAnJzsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpOwoKICAgIG15ICVHZXRQYXJhbTsKICAgICRHZXRQYXJhbXtTb3VyY2V9ICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU291cmNlJyApIHx8ICdDdXN0b21lckNvbXBhbnknOwogICAgJEdldFBhcmFte0luY2x1ZGVJbnZhbGlkfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJbmNsdWRlSW52YWxpZCcgKTsKCiAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte0luY2x1ZGVJbnZhbGlkfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57UHJlZktleUluY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgVmFsdWUgID0+ICRHZXRQYXJhbXtJbmNsdWRlSW52YWxpZH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntJbmNsdWRlSW52YWxpZH0gPSAkR2V0UGFyYW17SW5jbHVkZUludmFsaWR9OwogICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gc2V0IG11bHRpdGVuYW5jeS4KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3knKSApIHsKICAgICAgICBteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKCiAgICAgICAgbXkgJE11bHRpdGVuYW5jeUdyb3VwSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgIEdyb3VwID0+ICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5OjpQZXJtaXNzaW9uR3JvdXAnKSwKICAgICAgICApOwoKICAgICAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICApOwoKICAgICAgICBpZiAoICRHcm91cHN7JE11bHRpdGVuYW5jeUdyb3VwSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e011bHRpdGVuYW5jeVBlcm1pc3Npb259ID0gMTsKICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNoYW5nZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZScgKSB7CiAgICAgICAgbXkgJEN1c3RvbWVySUQgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lcklEJyApICAgfHwgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApIHx8ICcnOwogICAgICAgIG15ICROb3RpZmljYXRpb24gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTm90aWZpY2F0aW9uJyApIHx8ICcnOwogICAgICAgIG15ICVEYXRhICAgICAgICAgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgKTsKICAgICAgICAkRGF0YXtDdXN0b21lckNvbXBhbnlJRH0gPSAkQ3VzdG9tZXJJRDsKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKAogICAgICAgICAgICBUeXBlID0+ICROYXZpZ2F0aW9uQmFyVHlwZSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+IFRyYW5zbGF0YWJsZSgnQ3VzdG9tZXIgY29tcGFueSB1cGRhdGVkIScpICkKICAgICAgICAgICAgaWYgKCAkTm90aWZpY2F0aW9uICYmICROb3RpZmljYXRpb24gZXEgJ1VwZGF0ZScgKTsKICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIEFjdGlvbiA9PiAnQ2hhbmdlJywKICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICVEYXRhLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5DdXN0b21lckNvbXBhbnknLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjaGFuZ2UgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJUVycm9yczsKICAgICAgICAkR2V0UGFyYW17Q3VzdG9tZXJDb21wYW55SUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyQ29tcGFueUlEJyApOwoKICAgICAgICBteSBAQ3VzdG9tZXJDb21wYW55TWFwID0gJENvbmZpZ09iamVjdC0+R2V0KCAkR2V0UGFyYW17U291cmNlfSApLT57TWFwfS0+QCo7CgogICAgICAgICMgVGhlIHJlYWRvbmx5IGZpZWxkcyBzaG91bGQgbm90IGJlIHNldHRhYmxlIGZyb20gdGhlIFdlYkFwcC4KICAgICAgICAjIFNvIHVwZGF0ZSB3aXRoIHRoZSBvbGQgdmFsdWVzLCByZWdhcmRsZXNzIHdoYXQgd2FzIHBhc3NlZCBmcm9tIHRoZSBjbGllbnQuCiAgICAgICAgIyBUaGUgb2xkIGRhdGEgaXMgb25seSBuZWVkZWQgd2hlbiB0aGVyZSBhcmUgYW55IHJlYWRvbmx5IGZpZWxkcy4KICAgICAgICBteSAlT2xkRGF0YTsKICAgICAgICBpZiAoIGFueSB7ICRfLT5bN10gfSBAQ3VzdG9tZXJDb21wYW55TWFwICkgewogICAgICAgICAgICAlT2xkRGF0YSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEdldFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgR2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QuCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgICAgIEVOVFJZOgogICAgICAgIGZvciBteSAkRW50cnkgKEBDdXN0b21lckNvbXBhbnlNYXApIHsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRHluYW1pY0ZpZWxkICRFbnRyeS0+WzJdIG5vdCBmb3VuZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIHN0b3JhYmxlIHZhbHVlIG9mIGR5bmFtaWMgZmllbGQgZWRpdCBmaWVsZAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmV1c2UgdGhlIG9sZCBkYXRhIGZvciByZWFkb25seSBmaWVsZAogICAgICAgICAgICBlbHNpZiAoICRFbnRyeS0+WzddICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRW50cnktPlswXSB9ID0gJE9sZERhdGF7ICRFbnRyeS0+WzBdIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcmVtYWluaW5nIG5vbi1keW5hbWljLWZpZWxkIG1hbmRhdG9yeSBmaWVsZHMKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkRW50cnktPlswXSApIC8vICcnOwogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkRW50cnktPlswXSB9ICYmICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0N1c3RvbWVySUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGUgZW50cmllcwogICAgICAgIGlmICggJEdldFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSBuZSAkR2V0UGFyYW17Q3VzdG9tZXJJRH0gKSB7CgogICAgICAgICAgICAjIGdldCBDdXN0b21lckNvbXBhbnkgbGlzdAogICAgICAgICAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHVwbGljYXRlIGZpZWxkCiAgICAgICAgICAgIGlmICggJUxpc3QgJiYgJExpc3R7ICRHZXRQYXJhbXtDdXN0b21lcklEfSB9ICkgewogICAgICAgICAgICAgICAgJEVycm9yc3tEdXBsaWNhdGV9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgIyB1cGRhdGUgZ3JvdXAKICAgICAgICAgICAgbXkgJFVwZGF0ZSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueVVwZGF0ZSggJUdldFBhcmFtLCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9ICk7CgogICAgICAgICAgICBpZiAoJFVwZGF0ZSkgewoKICAgICAgICAgICAgICAgIG15ICRTZXRERkVycm9yOwoKICAgICAgICAgICAgICAgICMgc2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICAgICAgICAgICAgICBFTlRSWToKICAgICAgICAgICAgICAgIGZvciBteSAkRW50cnkgKEBDdXN0b21lckNvbXBhbnlNYXApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIG5lICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNldERGRXJyb3IgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0R5bmFtaWMgZmllbGQgJXMgbm90IGZvdW5kIScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVudHJ5LT5bMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZVNldCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICAgICA9PiAkR2V0UGFyYW17Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFZhbHVlU2V0ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2V0REZFcnJvciAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIHNldCB2YWx1ZSBmb3IgZHluYW1pYyBmaWVsZCAlcyEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRDb250aW51ZUFmdGVyU2F2ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKSB8fCAwOwoKICAgICAgICAgICAgICAgICMgaWYgc2V0IERGIGVycm9yIGV4aXN0cywgY3JlYXRlIG5vdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgaWYgKCRTZXRERkVycm9yKSB7CgogICAgICAgICAgICAgICAgICAgICMgaWYgdGhlIHVzZXIgd291bGQgbGlrZSB0byBjb250aW51ZSBlZGl0aW5nIHRoZSBjdXN0b21lciBjb21wYW55LCBqdXN0IHJlZGlyZWN0IHRvIHRoZSBlZGl0IHNjcmVlbgogICAgICAgICAgICAgICAgICAgIGlmICggJENvbnRpbnVlQWZ0ZXJTYXZlIGVxICcxJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uID0+ICdDaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMgPT4gXCVFcnJvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiBUcmFuc2xhdGFibGUoJ0N1c3RvbWVyIGNvbXBhbnkgdXBkYXRlZCEnKSApOwogICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNldERGRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5DdXN0b21lckNvbXBhbnknLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBpZiB0aGUgdXNlciB3b3VsZCBsaWtlIHRvIGNvbnRpbnVlIGVkaXRpbmcgdGhlIGN1c3RvbWVyIGNvbXBhbnksIGp1c3QgcmVkaXJlY3QgdG8gdGhlIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICAgICBpZiAoICRDb250aW51ZUFmdGVyU2F2ZSBlcSAnMScgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVySUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJJRCcgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgIE9QID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249Q2hhbmdlO0N1c3RvbWVySUQ9IiAuICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJEN1c3RvbWVySUQpIC4gIjtOYXY9JE5hdjtOb3RpZmljYXRpb249VXBkYXRlIgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UgcmV0dXJuIHRvIG92ZXJ2aWV3CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtOb3RpZmljYXRpb249VXBkYXRlIiApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvbWV0aGluZyB3ZW50IHdyb25nCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIFByaW9yaXR5ID0+ICdFcnJvcicgKTsKCiAgICAgICAgIyBzZXQgbm90aWZpY2F0aW9uIGZvciBkdXBsaWNhdGUgZW50cnkKICAgICAgICBpZiAoICRFcnJvcnN7RHVwbGljYXRlfSApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDdXN0b21lciBDb21wYW55ICVzIGFscmVhZHkgZXhpc3RzIScsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uID0+ICdDaGFuZ2UnLAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgRXJyb3JzID0+IFwlRXJyb3JzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyQ29tcGFueScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZCcgKSB7CiAgICAgICAgJEdldFBhcmFte05hbWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05hbWUnICk7CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIEFjdGlvbiA9PiAnQWRkJywKICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZEFjdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICVFcnJvcnM7CgogICAgICAgIG15ICRDdXN0b21lckNvbXBhbnlLZXkgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICRHZXRQYXJhbXtTb3VyY2V9ICktPntDdXN0b21lckNvbXBhbnlLZXl9OwogICAgICAgIG15ICRDdXN0b21lckNvbXBhbnlJRDsKCiAgICAgICAgIyBHZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdC4KICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCggJEdldFBhcmFte1NvdXJjZX0gKS0+e01hcH0gfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRHluYW1pY0ZpZWxkICRFbnRyeS0+WzJdIG5vdCBmb3VuZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIHN0b3JhYmxlIHZhbHVlIG9mIGR5bmFtaWMgZmllbGQgZWRpdCBmaWVsZAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcmVtYWluaW5nIG5vbi1keW5hbWljLWZpZWxkIG1hbmRhdG9yeSBmaWVsZHMKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkRW50cnktPlswXSApIC8vICcnOwogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkRW50cnktPlswXSB9ICYmICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgY3VzdG9tZXIgY29tcGFueSBrZXkgZm9yIGNoZWNraW5nIGR1cGxpY2F0ZQogICAgICAgICAgICBpZiAoICRFbnRyeS0+WzJdIGVxICRDdXN0b21lckNvbXBhbnlLZXkgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJDb21wYW55SUQgPSAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IEN1c3RvbWVyQ29tcGFueSBsaXN0CiAgICAgICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlMaXN0KAogICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZHVwbGljYXRlIGZpZWxkCiAgICAgICAgaWYgKCAlTGlzdCAmJiAkTGlzdHskQ3VzdG9tZXJDb21wYW55SUR9ICkgewogICAgICAgICAgICAkRXJyb3Jze0R1cGxpY2F0ZX0gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgIyBhZGQgY29tcGFueQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlBZGQoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KAogICAgICAgICAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICAgICAgICAgIFNlYXJjaCA9PiAkU2VhcmNoLAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gam9pbiAnJywKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdDdXN0b21lciBjb21wYW55IGFkZGVkIScpLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgZHluYW1pYyBmaWVsZCB2YWx1ZXMKICAgICAgICAgICAgICAgIEVOVFJZOgogICAgICAgICAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCggJEdldFBhcmFte1NvdXJjZX0gKS0+e01hcH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIG5lICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRHluYW1pYyBmaWVsZCAlcyBub3QgZm91bmQhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJFZhbHVlU2V0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRHZXRQYXJhbXtDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVmFsdWVTZXQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBzZXQgdmFsdWUgZm9yIGR5bmFtaWMgZmllbGQgJXMhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvbWV0aGluZyB3ZW50IHdyb25nCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIFByaW9yaXR5ID0+ICdFcnJvcicgKTsKCiAgICAgICAgIyBzZXQgbm90aWZpY2F0aW9uIGZvciBkdXBsaWNhdGUgZW50cnkKICAgICAgICBpZiAoICRFcnJvcnN7RHVwbGljYXRlfSApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDdXN0b21lciBDb21wYW55ICVzIGFscmVhZHkgZXhpc3RzIScsCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyQ29tcGFueUlELAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uID0+ICdBZGQnLAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgRXJyb3JzID0+IFwlRXJyb3JzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyQ29tcGFueScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgbXkgJE91dHB1dCAgICAgICA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgIG15ICROb3RpZmljYXRpb24gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTm90aWZpY2F0aW9uJyApIHx8ICcnOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiBUcmFuc2xhdGFibGUoJ0N1c3RvbWVyIGNvbXBhbnkgdXBkYXRlZCEnKSApCiAgICAgICAgICAgIGlmICggJE5vdGlmaWNhdGlvbiAmJiAkTm90aWZpY2F0aW9uIGVxICdVcGRhdGUnICk7CgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9FZGl0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdVcGRhdGUnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBzZW5kIHBhcmFtZXRlciBSZWFkT25seSB0byBKUyBvYmplY3QKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnUmVhZE9ubHknLAogICAgICAgIFZhbHVlID0+ICRDb25maWdPYmplY3QtPnsgJFBhcmFte1NvdXJjZX0gfS0+e1JlYWRPbmx5fSwKICAgICk7CgogICAgIyBHZXQgdmFsaWQgb2JqZWN0LgogICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CgogICAgJFBhcmFteydWYWxpZE9wdGlvbid9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiB7ICRWYWxpZE9iamVjdC0+VmFsaWRMaXN0KCksIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWYWxpZElEfSwKICAgICk7CgogICAgIyBHZXQgbmVlZGVkIG9iamVjdHMuCiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e01hcH0gfSApIHsKICAgICAgICBpZiAoICRFbnRyeS0+WzBdICkgewoKICAgICAgICAgICAgIyBIYW5kbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgICAgICMgR2V0IEhUTUwgZm9yIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9ID8gJFBhcmFteyAkRW50cnktPlswXSB9IDogdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCgogICAgICAgICAgICAgICAgICAgICMgU2VydmVyIGVycm9yLCBpZiBhbnkKICAgICAgICAgICAgICAgICAgICAleyAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSB9IH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2tpcCBmaWVsZHMgZm9yIHdoaWNoIEhUTUwgY291bGQgbm90IGJlIHJldHJpZXZlZAogICAgICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZEhUTUwpOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ByZWZlcmVuY2VzR2VuZXJpYycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEJsb2NrID0gJ0lucHV0JzsKCiAgICAgICAgICAgICMgYnVpbGQgc2VsZWN0aW9ucyBvciBpbnB1dCBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntTZWxlY3Rpb25zfS0+eyAkRW50cnktPlswXSB9ICkgewogICAgICAgICAgICAgICAgbXkgJE9wdGlvblJlcXVpcmVkID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25SZXF1aXJlZCA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBidWlsZCBWYWxpZElEIHN0cmluZwogICAgICAgICAgICAgICAgJEJsb2NrID0gJ09wdGlvbic7CiAgICAgICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57U2VsZWN0aW9uc30KICAgICAgICAgICAgICAgICAgICAgICAgLT57ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gIiRPcHRpb25SZXF1aXJlZCBNb2Rlcm5pemUgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgU29ydCAgICAgICAgPT4gJ0FscGhhbnVtZXJpY0tleScsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDM1LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRW50cnktPlswXSA9fiBtL15DdXN0b21lckNvbXBhbnlDb3VudHJ5L2kgKSB7CgogICAgICAgICAgICAgICAgIyBidWlsZCBDb3VudHJ5IHNlbGVjdGlvbiB3aXRoIEVuZ2xpc2ggbmFtZXMKICAgICAgICAgICAgICAgICRCbG9jayA9ICdPcHRpb24nOwogICAgICAgICAgICAgICAgbXkgJE9wdGlvblJlcXVpcmVkID0gJEVudHJ5LT5bNF0gPyAnVmFsaWRhdGVfUmVxdWlyZWQnIDogJyc7CiAgICAgICAgICAgICAgICBteSAkQ291bnRyeUxpc3Q7CiAgICAgICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnUmVmZXJlbmNlRGF0YTo6VHJhbnNsYXRlZENvdW50cnlOYW1lcycpICkgewoKICAgICAgICAgICAgICAgICAgICAjIEZsYWcrTmFtZSA9PiBjb2RlCiAgICAgICAgICAgICAgICAgICAgJENvdW50cnlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlZmVyZW5jZURhdGEnKS0+Q0xEUkNvdW50cnlMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICBMYW5ndWFnZSA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckxhbmd1YWdlfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSBwcmV2aW91cyB2YWx1ZSBleGlzdHMgaW4gdGhlIHNlbGVjdGlvbiBsaXN0IGV2ZW4gaWYgaXQgaXNuJ3QgYSBjb3VudHJ5IGNvZGUuCiAgICAgICAgICAgICAgICAgICAgbXkgJFByZXZpb3VzQ291bnRyeSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgICAgICAgICAgICAgICAgICBpZiAoJFByZXZpb3VzQ291bnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ291bnRyeUxpc3QtPnskUHJldmlvdXNDb3VudHJ5fSAvLz0gJFByZXZpb3VzQ291bnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyBFbmdsaXNoIG5hbWUgPT4gRW5nbGlzaCBuYW1lCiAgICAgICAgICAgICAgICAgICAgJENvdW50cnlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlZmVyZW5jZURhdGEnKS0+Q291bnRyeUxpc3Q7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFBhcmFte09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENvdW50cnlMaXN0LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gIiRPcHRpb25SZXF1aXJlZCBNb2Rlcm5pemUgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gKCAkUGFyYW17ICRFbnRyeS0+WzBdIH0gLy8gMSApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRFbnRyeS0+WzBdID1+IG0vXlZhbGlkSUQvaSApIHsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIFZhbGlkSUQgc3RyaW5nCiAgICAgICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKICAgICAgICAgICAgICAgIG15ICRPcHRpb25SZXF1aXJlZCA9ICRFbnRyeS0+WzRdID8gJ1ZhbGlkYXRlX1JlcXVpcmVkJyA6ICcnOwogICAgICAgICAgICAgICAgJFBhcmFte09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICA9PiB7ICRWYWxpZE9iamVjdC0+VmFsaWRMaXN0KCksIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gIiRPcHRpb25SZXF1aXJlZCBNb2Rlcm5pemUgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gZGVmaW5lZCggJFBhcmFteyAkRW50cnktPlswXSB9ICkgPyAkUGFyYW17ICRFbnRyeS0+WzBdIH0gOiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICAgICAjIEJ1aWxkIHRoZSBncm91cCBmaWVsZC4KICAgICAgICAgICAgZWxzaWYgKCAkRW50cnktPlswXSA9fiAvXlVzZXJHcm91cElEJC9pICkgewogICAgICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgdGhlIHBlcm1pc3Npb24gdG8gc2VlL2NoYW5nZSB0aGUgbXVsdGl0ZW5hbmN5IGZpZWxkLgogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNdWx0aXRlbmFuY3lQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAjIEJ1aWxkIHRoZSBmaWVsZC4KICAgICAgICAgICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRFbnRyeS0+WzBdLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgJyAuICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtWYWx1ZX0gPSAkUGFyYW17ICRFbnRyeS0+WzBdIH0gfHwgJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyByZXF1aXJlZCBmbGFnCiAgICAgICAgICAgIGlmICggJEVudHJ5LT5bNF0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17TWFuZGF0b3J5Q2xhc3N9ID0gJ2NsYXNzPSJNYW5kYXRvcnkiJzsKICAgICAgICAgICAgICAgICRQYXJhbXtTdGFyTGFiZWx9ICAgICAgPSAnPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4nOwogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkQ2xhc3N9ICA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17TWFuZGF0b3J5Q2xhc3N9ID0gJyc7CiAgICAgICAgICAgICAgICAkUGFyYW17U3RhckxhYmVsfSAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWlyZWRDbGFzc30gID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyByZWFkb25seSBmbGFnCiAgICAgICAgICAgIGlmICggJEVudHJ5LT5bN10gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlUeXBlfSA9ICdyZWFkb25seSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlUeXBlfSA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBmb3JtIG9wdGlvbgogICAgICAgICAgICBpZiAoICRQYXJhbXtUeXBlfSAmJiAkUGFyYW17VHlwZX0gZXEgJ2hpZGRlbicgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UHJlZmVyZW5jZXN9IC49ICRQYXJhbXtWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcmVmZXJlbmNlc0dlbmVyaWMnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBJdGVtID0+ICRFbnRyeS0+WzFdLAogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gIlByZWZlcmVuY2VzR2VuZXJpYyRCbG9jayIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbSAgICAgICAgID0+ICRFbnRyeS0+WzFdLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICA9PiAkUGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRGaWVsZCA9PiAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkRW50cnktPls0XSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiUHJlZmVyZW5jZXNHZW5lcmljJHtCbG9ja31SZXF1aXJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdJbmNsdWRlSW52YWxpZCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEluY2x1ZGVJbnZhbGlkICAgICAgICA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgSW5jbHVkZUludmFsaWRDaGVja2VkID0+ICRTZWxmLT57SW5jbHVkZUludmFsaWR9ID8gJ2NoZWNrZWQnIDogJycsCiAgICAgICAgfSwKICAgICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FjdGlvblNlYXJjaCcsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBteSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpOwoKICAgICMgZ2V0IHdyaXRhYmxlIGRhdGEgc291cmNlcwogICAgbXkgJUN1c3RvbWVyQ29tcGFueVNvdXJjZSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QoCiAgICAgICAgUmVhZE9ubHkgPT4gMCwKICAgICk7CgogICAgIyBvbmx5IHNob3cgQWRkIG9wdGlvbiBpZiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSB3cml0YWJsZSBiYWNrZW5kCiAgICBpZiAoIHNjYWxhciBrZXlzICVDdXN0b21lckNvbXBhbnlTb3VyY2UgKSB7CiAgICAgICAgJFBhcmFte1NvdXJjZU9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiB7ICVDdXN0b21lckNvbXBhbnlTb3VyY2UsIH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1NvdXJjZScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1NvdXJjZX0gfHwgJycsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbkFkZCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgdGhlcmUgYXJlIGFueSByZWdpc3RyaWVzIHRvIHNlYXJjaCwgdGhlIHRhYmxlIGlzIGZpbGxlZCBhbmQgc2hvd24KICAgIGlmICggJFBhcmFte1NlYXJjaH0gKSB7CgogICAgICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBzYW1lIExpbWl0IGFzICRTZWxmLT57Q3VzdG9tZXJDb21wYW55fS0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaExpc3RMaW1pdH0KICAgICAgICAjIHNtYWxsZXN0IExpbWl0IGZyb20gYWxsIHNvdXJjZXMKICAgICAgICBteSAkTGltaXQ7CiAgICAgICAgU09VUkNFOgogICAgICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CiAgICAgICAgICAgIG15ICRDdXN0b21lclVzZXJNYXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyQ29tcGFueSRDb3VudCIpOwogICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJEN1c3RvbWVyVXNlck1hcC0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaExpc3RMaW1pdH07CiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJExpbWl0IHx8ICRDdXN0b21lclVzZXJNYXAtPntDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0TGltaXR9IDwgJExpbWl0ICkgewogICAgICAgICAgICAgICAgJExpbWl0ID0gJEN1c3RvbWVyVXNlck1hcC0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaExpc3RMaW1pdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXMgZmFsbGJhY2sgdGFrZSB0aGUgaGFyZGNvZGVkIGxpbWl0IG9mIEtlcm5lbC9TeXN0ZW0vQ3VzdG9tZXJDb21wYW55L0RCLnBtCiAgICAgICAgJExpbWl0IC8vPSA1MDAwMDsKCiAgICAgICAgbXkgJUxpc3RBbGxJdGVtcyA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgICAgIFNlYXJjaCA9PiAkUGFyYW17U2VhcmNofSwKICAgICAgICAgICAgTGltaXQgID0+ICRMaW1pdCArIDEsCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICk7CgogICAgICAgIGlmICgga2V5cyAlTGlzdEFsbEl0ZW1zIDw9ICRMaW1pdCApIHsKICAgICAgICAgICAgbXkgJExpc3RBbGxJdGVtcyA9IGtleXMgJUxpc3RBbGxJdGVtczsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0hlYWRlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBMaXN0QWxsID0+ICRMaXN0QWxsSXRlbXMsCiAgICAgICAgICAgICAgICAgICAgTGltaXQgICA9PiAkTGltaXQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlMaXN0KAogICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIFZhbGlkICA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA/IDAgOiAxLAogICAgICAgICk7CgogICAgICAgIGlmICgga2V5cyAlTGlzdEFsbEl0ZW1zID4gJExpbWl0ICkgewogICAgICAgICAgICBteSAkTGlzdEFsbEl0ZW1zICAgPSBrZXlzICVMaXN0QWxsSXRlbXM7CiAgICAgICAgICAgIG15ICRTZWFyY2hMaXN0U2l6ZSA9IGtleXMgJUxpc3Q7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3SGVhZGVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFNlYXJjaExpc3RTaXplID0+ICRTZWFyY2hMaXN0U2l6ZSwKICAgICAgICAgICAgICAgICAgICBMaXN0QWxsICAgICAgICA9PiAkTGlzdEFsbEl0ZW1zLAogICAgICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgID0+ICRMaW1pdCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdmFsaWQgbGlzdAogICAgICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CgogICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e1BhcmFtc30tPntGb3JlaWduREJ9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnTG9jYWxEQicgKTsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhlcmUgYXJlIHJlc3VsdHMgdG8gc2hvdwogICAgICAgIGlmICglTGlzdCkgewogICAgICAgICAgICBmb3IgbXkgJExpc3RLZXkgKCBzb3J0IHsgJExpc3R7JGF9IGNtcCAkTGlzdHskYn0gfSBrZXlzICVMaXN0ICkgewoKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55R2V0KCBDdXN0b21lcklEID0+ICRMaXN0S2V5ICk7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE5hdiAgICA9PiAkUGFyYW17TmF2fSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntQYXJhbXN9LT57Rm9yZWlnbkRCfSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9jYWxEQlJvdycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gJFZhbGlkTGlzdHsgJERhdGF7VmFsaWRJRH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG90aGVyd2lzZSBpdCBkaXNwbGF5cyBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ05vRGF0YUZvdW5kTXNnJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgdGhlcmUgaXMgbm90aGluZyB0byBzZWFyY2ggaXQgc2hvd3MgYSBtZXNzYWdlCiAgICBlbHNlCiAgICB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vU2VhcmNoVGVybXMnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/AdminCustomerUser.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL01vZHVsZXMvQWRtaW5DdXN0b21lclVzZXIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluQ3VzdG9tZXJVc2VyOwoKdXNlIHY1LjI0Owp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBuYW1lc3BhY2U6OmF1dG9jbGVhbjsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgc2V0IHByZWYgZm9yIGNvbHVtbnMga2V5CiAgICAkU2VsZi0+e1ByZWZLZXlJbmNsdWRlSW52YWxpZH0gPSAnSW5jbHVkZUludmFsaWQnIC4gJy0nIC4gJFNlbGYtPntBY3Rpb259OwoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICRTZWxmLT57SW5jbHVkZUludmFsaWR9ID0gJFByZWZlcmVuY2VzeyAkU2VsZi0+e1ByZWZLZXlJbmNsdWRlSW52YWxpZH0gfTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgKTsKCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZExvb2t1cH0gPSB7IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSBAeyREeW5hbWljRmllbGRDb25maWdzfSB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkTmF2ICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmF2JyApICAgIHx8ICcnOwogICAgbXkgJFNvdXJjZSAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvdXJjZScgKSB8fCAnQ3VzdG9tZXJVc2VyJzsKICAgIG15ICRTZWFyY2ggICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWFyY2gnICk7CiAgICBteSAkSW5jbHVkZUludmFsaWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSW5jbHVkZUludmFsaWQnICk7CgogICAgaWYgKCBkZWZpbmVkICRJbmNsdWRlSW52YWxpZCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57UHJlZktleUluY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgVmFsdWUgID0+ICRJbmNsdWRlSW52YWxpZCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA9ICRJbmNsdWRlSW52YWxpZDsKICAgIH0KICAgICRTZWFyY2gKICAgICAgICB8fD0gJENvbmZpZ09iamVjdC0+R2V0KCdBZG1pbkN1c3RvbWVyVXNlcjo6UnVuSW5pdGlhbFdpbGRjYXJkU2VhcmNoJykgPyAnKicgOiAnJzsKCiAgICAjIGNyZWF0ZSBsb2NhbCBvYmplY3QKICAgIG15ICRDaGVja0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyk7CgogICAgbXkgJE5hdkJhciAgICAgICA9ICcnOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgJE5hdkJhciA9ICRMYXlvdXRPYmplY3QtPkhlYWRlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTmF2QmFyID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE5hdkJhciAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKAogICAgICAgICAgICBUeXBlID0+ICROYXYgZXEgJ0FnZW50JyA/ICdDdXN0b21lcnMnIDogJ0FkbWluJywKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IGxpc3Qgb2YgdmFsaWQgSURzLgogICAgbXkgQFZhbGlkSURMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CgogICAgIyBjaGVjayB0aGUgcGVybWlzc2lvbiBmb3IgdGhlIFN3aXRjaFRvQ3VzdG9tZXIgZmVhdHVyZQogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N3aXRjaFRvQ3VzdG9tZXInKSApIHsKCiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgICAgICMgZ2V0IHRoZSBncm91cCBpZCB3aGljaCBpcyBhbGxvd2VkIHRvIHVzZSB0aGUgc3dpdGNoIHRvIGN1c3RvbWVyIGZlYXR1cmUKICAgICAgICBteSAkU3dpdGNoVG9DdXN0b21lckdyb3VwSUQgPSAkR3JvdXBPYmplY3QtPkdyb3VwTG9va3VwKAogICAgICAgICAgICBHcm91cCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N3aXRjaFRvQ3VzdG9tZXI6OlBlcm1pc3Npb25Hcm91cCcpLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHVzZXIgZ3JvdXBzLCB3aGVyZSB0aGUgdXNlciBoYXMgdGhlIHJ3IHByaXZpbGVnZQogICAgICAgIG15ICVHcm91cHMgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICApOwoKICAgICAgICAjIGlmIHRoZSB1c2VyIGlzIGEgbWVtYmVyIGluIHRoaXMgZ3JvdXAgaGUgY2FuIGFjY2VzcyB0aGUgZmVhdHVyZQogICAgICAgIGlmICggJEdyb3Vwc3skU3dpdGNoVG9DdXN0b21lckdyb3VwSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1N3aXRjaFRvQ3VzdG9tZXJQZXJtaXNzaW9ufSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CiAgICBteSAkTWFpbk9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHNldCBtdWx0aXRlbmFuY3kuCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5JykgKSB7CiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgICAgIG15ICRNdWx0aXRlbmFuY3lHcm91cElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgICAgICBHcm91cCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeTo6UGVybWlzc2lvbkdyb3VwJyksCiAgICAgICAgKTsKCiAgICAgICAgbXkgJUdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkR3JvdXBzeyRNdWx0aXRlbmFuY3lHcm91cElEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntNdWx0aXRlbmFuY3lQZXJtaXNzaW9ufSA9IDE7CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyAgc3dpdGNoIHRvIGN1c3RvbWVyCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntTdWJhY3Rpb259IGVxICdTd2l0Y2gnCiAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdTd2l0Y2hUb0N1c3RvbWVyJykKICAgICAgICAmJiAkU2VsZi0+e1N3aXRjaFRvQ3VzdG9tZXJQZXJtaXNzaW9ufQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgbXkgJFVzZXJJRCAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApIHx8ICcnOwogICAgICAgIG15ICVVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgID0+ICRVc2VySUQsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHNlc3Npb24gaWQKICAgICAgICBteSAkTmV3U2Vzc2lvbklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPkNyZWF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICBVc2VyTGFzdFJlcXVlc3QgPT4gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPlRvRXBvY2goKSwKICAgICAgICAgICAgVXNlclR5cGUgICAgICAgID0+ICdDdXN0b21lcicsCiAgICAgICAgICAgIFNlc3Npb25Tb3VyY2UgICA9PiAnQ3VzdG9tZXJJbnRlcmZhY2UnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIGludGVyZmFjZSBzZXNzaW9uIG5hbWUKICAgICAgICBteSAkU2Vzc2lvbk5hbWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxTZXNzaW9uTmFtZScpIHx8ICdDU0lEJzsKCiAgICAgICAgIyBjcmVhdGUgYSBuZXcgTGF5b3V0T2JqZWN0IHdpdGggU2Vzc2lvbklEQ29va2llCiAgICAgICAgbXkgJEV4cGlyZXMgPSAnKycgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25NYXhUaW1lJykgLiAncyc7CiAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uVXNlQ29va2llQWZ0ZXJCcm93c2VyQ2xvc2UnKSApIHsKICAgICAgICAgICAgJEV4cGlyZXMgPSAnJzsKICAgICAgICB9CgogICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0LT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICBTZXNzaW9uSUQgICA9PiAkTmV3U2Vzc2lvbklELAogICAgICAgICAgICBTZXNzaW9uTmFtZSA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25OYW1lJyksCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRDb29raWUoCiAgICAgICAgICAgIEtleSAgICAgPT4gJ1Nlc3Npb25JRENvb2tpZScsCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFNlc3Npb25OYW1lLAogICAgICAgICAgICBWYWx1ZSAgID0+ICROZXdTZXNzaW9uSUQsCiAgICAgICAgICAgIEV4cGlyZXMgPT4gJEV4cGlyZXMsCiAgICAgICAgKTsKCiAgICAgICAgIyBsb2cgZXZlbnQKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAiU3dpdGNoZWQgZnJvbSBBZ2VudCB0byBDdXN0b21lciAoJFNlbGYtPntVc2VyTG9naW59IC09PiAkVXNlckRhdGF7VXNlckxvZ2lufSkiLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgVVJMIHRvIGN1c3RvbWVyIGludGVyZmFjZQogICAgICAgIG15ICRVUkwgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0h0dHBUeXBlJykKICAgICAgICAgICAgLiAnOi8vJwogICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgnRlFETicpCiAgICAgICAgICAgIC4gJy8nCiAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpCiAgICAgICAgICAgIC4gJ2N1c3RvbWVyLnBsJzsKCiAgICAgICAgIyBpZiBubyBzZXNzaW9ucyBhcmUgdXNlZCB3ZSBhdHRhY2ggdGhlIHNlc3Npb24gYXMgVVJMIHBhcmFtZXRlcgogICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZScpICkgewogICAgICAgICAgICAkVVJMIC49ICI/JFNlc3Npb25OYW1lPSROZXdTZXNzaW9uSUQiOwogICAgICAgIH0KCiAgICAgICAgIyByZWRpcmVjdCB0byBjdXN0b21lciBpbnRlcmZhY2Ugd2l0aCBuZXcgc2Vzc2lvbiBpZAogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICRVUkwgKTsKICAgIH0KCiAgICAjIHNlYXJjaCB1c2VyIGxpc3QKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZWFyY2gnICkgewogICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICApOwogICAgICAgIG15ICRPdXRwdXQgPSAkTmF2QmFyOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZG93bmxvYWQgZmlsZSBwcmVmZXJlbmNlcwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rvd25sb2FkJyApIHsKICAgICAgICBteSAkR3JvdXAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnR3JvdXAnICkgfHwgJyc7CiAgICAgICAgbXkgJFVzZXIgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApICAgIHx8ICcnOwoKICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICBteSAlVXNlckRhdGEgICAgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRVc2VyICk7CiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclByZWZlcmVuY2VzR3JvdXBzJykgfTsKICAgICAgICBteSAkTW9kdWxlICAgICAgPSAkUHJlZmVyZW5jZXN7JEdyb3VwfS0+e01vZHVsZX07CiAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgfQogICAgICAgIG15ICRPYmplY3QgPSAkTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICBDb25maWdJdGVtID0+ICRQcmVmZXJlbmNlc3skR3JvdXB9LAogICAgICAgICAgICBVc2VyT2JqZWN0ID0+ICRDdXN0b21lclVzZXJPYmplY3QsCiAgICAgICAgICAgIERlYnVnICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgKTsKICAgICAgICBteSAlRmlsZSA9ICRPYmplY3QtPkRvd25sb2FkKCBVc2VyRGF0YSA9PiBcJVVzZXJEYXRhICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KCVGaWxlKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNoYW5nZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZScgKSB7CiAgICAgICAgbXkgJFVzZXIgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSAgICAgICAgICAgfHwgJyc7CiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOb3RpZmljYXRpb24nICkgfHwgJyc7CgogICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgIG15ICVVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFVzZXIgKTsKCiAgICAgICAgbXkgJE91dHB1dCA9ICROYXZCYXI7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdDdXN0b21lciB1cGRhdGVkIScpICkKICAgICAgICAgICAgaWYgKCAkTm90aWZpY2F0aW9uICYmICROb3RpZmljYXRpb24gZXEgJ1VwZGF0ZScgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgIEFjdGlvbiA9PiAnQ2hhbmdlJywKICAgICAgICAgICAgU291cmNlID0+ICRTb3VyY2UsCiAgICAgICAgICAgIFNlYXJjaCA9PiAkU2VhcmNoLAogICAgICAgICAgICBJRCAgICAgPT4gJFVzZXIsCiAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICApOwoKICAgICAgICBpZiAoICROYXYgZXEgJ05vbmUnICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjaGFuZ2UgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyB1cGRhdGUgb25seSB0aGUgcHJlZmVyZW5jZXMgYW5kIGR5bmFtaWMgZmllbGRzLCBpZiB0aGUgc291cmNlIGlzIHJlYWRvbmx5IG9yIGEgbGRhcCBiYWNrZW5kCiAgICAgICAgbXkgJFVwZGF0ZU9ubHlQcmVmZXJlbmNlczsKCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntSZWFkT25seX0gfHwgJENvbmZpZ09iamVjdC0+R2V0KCRTb3VyY2UpLT57TW9kdWxlfSA9fiAvTERBUC9pICkgewogICAgICAgICAgICAkVXBkYXRlT25seVByZWZlcmVuY2VzID0gMTsKICAgICAgICB9CgogICAgICAgIG15ICROb3RlID0gJyc7CiAgICAgICAgbXkgKCAlR2V0UGFyYW0sICVFcnJvcnMgKTsKCiAgICAgICAgIyBHZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdC4KICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e01hcH0gfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRHluYW1pY0ZpZWxkICRFbnRyeS0+WzJdIG5vdCBmb3VuZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIHN0b3JhYmxlIHZhbHVlIG9mIGR5bmFtaWMgZmllbGQgZWRpdCBmaWVsZAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcmVtYWluaW5nIG5vbi1keW5hbWljLWZpZWxkIG1hbmRhdG9yeSBmaWVsZHMKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkRW50cnktPlswXSApIHx8ICcnOwoKICAgICAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgJFVwZGF0ZU9ubHlQcmVmZXJlbmNlczsKCiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gJiYgJEVudHJ5LT5bNF0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yc3sgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJEdldFBhcmFte0lEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSB8fCAnJzsKCiAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcwogICAgICAgICAgICAmJiAkR2V0UGFyYW17VXNlckVtYWlsfQogICAgICAgICAgICAmJiAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkR2V0UGFyYW17VXNlckVtYWlsfSApCiAgICAgICAgICAgICYmIGdyZXAgeyAkXyBlcSAkR2V0UGFyYW17VmFsaWRJRH0gfSBAVmFsaWRJRExpc3QKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yc3tVc2VyRW1haWxJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICRFcnJvcnN7RXJyb3JUeXBlfSAgICAgICAgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICB9CgogICAgICAgICMgR2V0IHRoZSBjdXJyZW50IHVzZXIgZGF0YSBmb3Igc29tZSBjaGVja3MuCiAgICAgICAgbXkgJUN1cnJlbnRVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJEdldFBhcmFte0lEfSwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIEN1c3RvbWVySUQsIGlmIEN1c3RvbWVyQ29tcGFueVN1cHBvcnQgaXMgZW5hYmxlZCBhbmQgdGhlIFVzZXJDdXN0b21lcklEIHdhcyBjaGFuZ2VkLgogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCRTb3VyY2UpLT57Q3VzdG9tZXJDb21wYW55U3VwcG9ydH0KICAgICAgICAgICAgJiYgJEdldFBhcmFte1VzZXJDdXN0b21lcklEfQogICAgICAgICAgICAmJiAkQ3VycmVudFVzZXJEYXRhe1VzZXJDdXN0b21lcklEfSBuZSAkR2V0UGFyYW17VXNlckN1c3RvbWVySUR9CiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICBteSAlQ29tcGFueSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKS0+Q3VzdG9tZXJDb21wYW55R2V0KAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkR2V0UGFyYW17VXNlckN1c3RvbWVySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJUNvbXBhbnkgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3Jze1VzZXJDdXN0b21lcklESW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlmIG5vIGVycm9ycyBvY2N1cnJlZAogICAgICAgIGlmICggISVFcnJvcnMgKSB7CgogICAgICAgICAgICBteSAkVXBkYXRlU3VjY2VzczsKICAgICAgICAgICAgaWYgKCAhJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyApIHsKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNjZXNzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyVXBkYXRlKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VXNlclBhc3N3b3JkfSAmJiAoICRDdXJyZW50VXNlckRhdGF7VXNlclBhc3N3b3JkfSAvLyAnJyApIG5lICRHZXRQYXJhbXtVc2VyUGFzc3dvcmR9ICkgewoKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNjZXNzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+RGVsZXRlT25lUHJlZmVyZW5jZSgKICAgICAgICAgICAgICAgICAgICBLZXkgICAgPT4gJ1VzZXJMYXN0UHdDaGFuZ2VUaW1lJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJEdldFBhcmFte0lEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRVcGRhdGVTdWNjZXNzIHx8ICRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZHluYW1pYyBmaWVsZCB2YWx1ZXMKICAgICAgICAgICAgICAgIEVOVFJZOgogICAgICAgICAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e01hcH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIG5lICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE5vdGUgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0R5bmFtaWMgZmllbGQgJXMgbm90IGZvdW5kIScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVudHJ5LT5bMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJFZhbHVlU2V0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRHZXRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEdldFBhcmFteyAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggISRWYWx1ZVNldCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE5vdGUgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBzZXQgdmFsdWUgZm9yIGR5bmFtaWMgZmllbGQgJXMhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdXBkYXRlIHByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUHJlZmVyZW5jZXNHcm91cHMnKSB9OwogICAgICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEdyb3VwICggc29ydCBrZXlzICVQcmVmZXJlbmNlcyApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEdST1VQIGlmICRHcm91cCBlcSAnUGFzc3dvcmQnOwoKICAgICAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRHZXRQYXJhbXtVc2VyTG9naW59CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSAkTW9kdWxlID0gJFByZWZlcmVuY2VzeyRHcm91cH0tPntNb2R1bGV9OwogICAgICAgICAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCRNb2R1bGUpICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkUHJlZmVyZW5jZXN7JEdyb3VwfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlck9iamVjdCA9PiAkQ3VzdG9tZXJVc2VyT2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgQFBhcmFtcyA9ICRPYmplY3QtPlBhcmFtKAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YSA9PiBcJVVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lciA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKEBQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtSXRlbSAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgQEFycmF5ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtSXRlbS0+e05hbWV9ICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRQYXJhbUl0ZW0tPntOYW1lfSB9ID0gXEBBcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFBhcmFtID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGEgPT4gXCVVc2VyRGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTm90ZSAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIEluZm8gPT4gJE9iamVjdC0+RXJyb3IoKSApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2xlYXIgY3VzdG9tZXIgdXNlciBjYWNoZQogICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQ2FjaGVDbGVhcigKICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJEdldFBhcmFte1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YSBhbmQgc2hvdyBzY3JlZW4gYWdhaW4KICAgICAgICAgICAgICAgIGlmICggISROb3RlICkgewoKICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSB1c2VyIHdvdWxkIGxpa2UgdG8gY29udGludWUgZWRpdGluZyB0aGUgcHJpb3JpdHksIGp1c3QgcmVkaXJlY3QgdG8gdGhlIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKSBlcSAnMScgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPUNoYW5nZTtJRD0kSUQ7U2VhcmNoPSRTZWFyY2g7TmF2PSROYXY7Tm90aWZpY2F0aW9uPVVwZGF0ZSIKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSByZXR1cm4gdG8gb3ZlcnZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtOb3RpZmljYXRpb249VXBkYXRlIiApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggUHJpb3JpdHkgPT4gJ0Vycm9yJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZwogICAgICAgIG15ICRPdXRwdXQgPSAkTmF2QmFyOwogICAgICAgICRPdXRwdXQgLj0gJE5vdGU7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBBY3Rpb24gPT4gJ0NoYW5nZScsCiAgICAgICAgICAgIFNvdXJjZSA9PiAkU291cmNlLAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgRXJyb3JzID0+IFwlRXJyb3JzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQWRkJyApIHsKICAgICAgICBteSAlR2V0UGFyYW07CiAgICAgICAgJEdldFBhcmFte1VzZXJMb2dpbn0gID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1VzZXJMb2dpbicgKSAgfHwgJyc7CiAgICAgICAgJEdldFBhcmFte0N1c3RvbWVySUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgbXkgJE91dHB1dCA9ICROYXZCYXI7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBBY3Rpb24gPT4gJ0FkZCcsCiAgICAgICAgICAgIFNvdXJjZSA9PiAkU291cmNlLAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZCBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBZGRBY3Rpb24nICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAkTm90ZSA9ICcnOwogICAgICAgIG15ICggJUdldFBhcmFtLCAlRXJyb3JzICk7CgogICAgICAgIG15ICRBdXRvTG9naW5DcmVhdGlvbiA9ICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e0F1dG9Mb2dpbkNyZWF0aW9ufTsKCiAgICAgICAgIyBHZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdC4KICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e01hcH0gfSApIHsKCiAgICAgICAgICAgICMgZG9uJ3QgdmFsaWRhdGUgVXNlckxvZ2luIGlmIEF1dG9Mb2dpbkNyZWF0aW9uIGlzIGNvbmZpZ3VyZWQKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAoICRBdXRvTG9naW5DcmVhdGlvbiAmJiAkRW50cnktPlswXSBlcSAnVXNlckxvZ2luJyApOwoKICAgICAgICAgICAgIyBjaGVjayBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICBpZiAoICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJyApIHsKCiAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGRMb29rdXB9LT57ICRFbnRyeS0+WzJdIH07CgogICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJEeW5hbWljRmllbGQgJEVudHJ5LT5bMl0gbm90IGZvdW5kISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgPT4gJEVudHJ5LT5bNF0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yc3sgJEVudHJ5LT5bMF0gfSA9ICRWYWxpZGF0aW9uUmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2VuZXJhdGUgc3RvcmFibGUgdmFsdWUgb2YgZHluYW1pYyBmaWVsZCBlZGl0IGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRW50cnktPlswXSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayByZW1haW5pbmcgbm9uLWR5bmFtaWMtZmllbGQgbWFuZGF0b3J5IGZpZWxkcwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRFbnRyeS0+WzBdICkgfHwgJyc7CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gJiYgJEVudHJ5LT5bNF0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yc3sgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgIGlmICgKICAgICAgICAgICAgJEdldFBhcmFte1VzZXJFbWFpbH0KICAgICAgICAgICAgJiYgISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEdldFBhcmFte1VzZXJFbWFpbH0gKQogICAgICAgICAgICAmJiBncmVwIHsgJF8gZXEgJEdldFBhcmFte1ZhbGlkSUR9IH0gQFZhbGlkSURMaXN0CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRFcnJvcnN7VXNlckVtYWlsSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkRXJyb3Jze0Vycm9yVHlwZX0gICAgICAgID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKSAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIEN1c3RvbWVySUQsIGlmIEN1c3RvbWVyQ29tcGFueVN1cHBvcnQgaXMgZW5hYmxlZC4KICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e0N1c3RvbWVyQ29tcGFueVN1cHBvcnR9ICYmICRHZXRQYXJhbXtVc2VyQ3VzdG9tZXJJRH0gKSB7CgogICAgICAgICAgICBteSAlQ29tcGFueSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKS0+Q3VzdG9tZXJDb21wYW55R2V0KAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkR2V0UGFyYW17VXNlckN1c3RvbWVySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJUNvbXBhbnkgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3Jze1VzZXJDdXN0b21lcklESW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlmIG5vIGVycm9ycyBvY2N1cnJlZAogICAgICAgIGlmICggISVFcnJvcnMgKSB7CgogICAgICAgICAgICAjIGFkZCB1c2VyCiAgICAgICAgICAgIG15ICRVc2VyID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQWRkKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAkU291cmNlCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkVXNlcikgewoKICAgICAgICAgICAgICAgIEVOVFJZOgogICAgICAgICAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e01hcH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIHVubGVzcyAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7CgogICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZExvb2t1cH0tPnsgJEVudHJ5LT5bMl0gfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEeW5hbWljIGZpZWxkICVzIG5vdCBmb3VuZCEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAkVmFsdWVTZXQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lICAgICAgICAgPT4gJFVzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFZhbHVlU2V0ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTm90ZSAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIHNldCB2YWx1ZSBmb3IgZHluYW1pYyBmaWVsZCAlcyEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdXBkYXRlIHByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUHJlZmVyZW5jZXNHcm91cHMnKSB9OwogICAgICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEdyb3VwICggc29ydCBrZXlzICVQcmVmZXJlbmNlcyApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEdST1VQIGlmICRHcm91cCBlcSAnUGFzc3dvcmQnOwoKICAgICAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRVc2VyLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRQcmVmZXJlbmNlc3skR3JvdXB9LT57TW9kdWxlfTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gJFByZWZlcmVuY2VzeyRHcm91cH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJPYmplY3QgPT4gJEN1c3RvbWVyVXNlck9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15IEBQYXJhbXMgPSAkT2JqZWN0LT5QYXJhbSgKICAgICAgICAgICAgICAgICAgICAgICAgJXsgJFByZWZlcmVuY2VzeyRHcm91cH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGEgPT4gXCVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbUl0ZW0gKEBQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15IEBBcnJheSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbUl0ZW0tPntOYW1lfSApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkUGFyYW1JdGVtLT57TmFtZX0gfSA9IFxAQXJyYXk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhID0+IFwlVXNlckRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5vdGUgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+ICRPYmplY3QtPkVycm9yKCkgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEgYW5kIHNob3cgc2NyZWVuIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICEkTm90ZSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBpbiBib3Jyb3dlZCB2aWV3LCB0YWtlIHRoZSBuZXcgY3JlYXRlZCBjdXN0b21lciBvdmVyIGludG8gdGhlIG5ldyB0aWNrZXQKICAgICAgICAgICAgICAgICAgICBpZiAoICROYXYgZXEgJ05vbmUnICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJE5hdkJhcjsKCiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21lcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJ05hdicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTmF2LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KAogICAgICAgICAgICAgICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJE91dHB1dCAgICAgICAgPSAkTmF2QmFyIC4gJE5vdGU7CiAgICAgICAgICAgICAgICAgICAgbXkgJFVSTCAgICAgICAgICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICBteSAkVXNlckhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJFVzZXIpOwogICAgICAgICAgICAgICAgICAgIG15ICRVc2VyUXVvdGUgICAgID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkVXNlciApOwogICAgICAgICAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFBob25lfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFVSTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gIjxhIGhyZWY9XCIkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9QWN0aW9uPUFnZW50VGlja2V0UGhvbmU7U3ViYWN0aW9uPVN0b3JlTmV3O0V4cGFuZEN1c3RvbWVyTmFtZT0yO0N1c3RvbWVyVXNlcj0kVXNlckhUTUxRdW90ZTskTGF5b3V0T2JqZWN0LT57Q2hhbGxlbmdlVG9rZW5QYXJhbX1cIj4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTmV3IHBob25lIHRpY2tldCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICI8L2E+IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0RW1haWx9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFVSTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVSTCAuPSAiIC0gIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkVVJMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAiPGEgaHJlZj1cIiRMYXlvdXRPYmplY3QtPntCYXNlbGlua31BY3Rpb249QWdlbnRUaWNrZXRFbWFpbDtTdWJhY3Rpb249U3RvcmVOZXc7RXhwYW5kQ3VzdG9tZXJOYW1lPTI7Q3VzdG9tZXJVc2VyPSRVc2VySFRNTFF1b3RlOyRMYXlvdXRPYmplY3QtPntDaGFsbGVuZ2VUb2tlblBhcmFtfVwiPiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdOZXcgZW1haWwgdGlja2V0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIjwvYT4iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJFVSTCkgewogICAgICAgICAgICAgICAgICAgICAgICAkT3V0cHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDdXN0b21lciAlcyBhZGRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRVc2VyUXVvdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiAoICRVUkwgKSEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRPdXRwdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0N1c3RvbWVyICVzIGFkZGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVzZXJRdW90ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiISIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggUHJpb3JpdHkgPT4gJ0Vycm9yJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZwogICAgICAgIG15ICRPdXRwdXQgPSAkTmF2QmFyIC4gJE5vdGU7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBBY3Rpb24gPT4gJ0FkZCcsCiAgICAgICAgICAgIFNvdXJjZSA9PiAkU291cmNlLAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgRXJyb3JzID0+IFwlRXJyb3JzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewogICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICApOwoKICAgICAgICBteSAkTm90aWZpY2F0aW9uID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05vdGlmaWNhdGlvbicgKSB8fCAnJzsKICAgICAgICBteSAkT3V0cHV0ICAgICAgID0gJE5hdkJhcjsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiBUcmFuc2xhdGFibGUoJ0N1c3RvbWVyIHVzZXIgdXBkYXRlZCEnKSApCiAgICAgICAgICAgIGlmICggJE5vdGlmaWNhdGlvbiAmJiAkTm90aWZpY2F0aW9uIGVxICdVcGRhdGUnICk7CgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdJbmNsdWRlSW52YWxpZCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEluY2x1ZGVJbnZhbGlkICAgICAgICA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgSW5jbHVkZUludmFsaWRDaGVja2VkID0+ICRTZWxmLT57SW5jbHVkZUludmFsaWR9ID8gJ2NoZWNrZWQnIDogJycsCiAgICAgICAgfSwKICAgICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FjdGlvblNlYXJjaCcsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwoKICAgICMgZ2V0IHdyaXRhYmxlIGRhdGEgc291cmNlcwogICAgbXkgJUN1c3RvbWVyU291cmNlID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTb3VyY2VMaXN0KAogICAgICAgIFJlYWRPbmx5ID0+IDAsCiAgICApOwoKICAgICMgb25seSBzaG93IEFkZCBvcHRpb24gaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgd3JpdGFibGUgYmFja2VuZAogICAgaWYgKCBzY2FsYXIga2V5cyAlQ3VzdG9tZXJTb3VyY2UgKSB7CiAgICAgICAgJFBhcmFte1NvdXJjZU9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiB7ICVDdXN0b21lclNvdXJjZSwgfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnU291cmNlJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17U291cmNlfSB8fCAnJywKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uQWRkJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17U2VhcmNofSApIHsKCiAgICAgICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICAgICAjIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSB0byBzaG93LCBhIG1lc3NhZ2UgaXMgZGlzcGxheWVkIG9uIHRoZSB0YWJsZSB3aXRoIHRoaXMgY29sc3BhbgogICAgICAgIG15ICRDb2xTcGFuID0gNjsKCiAgICAgICAgIyBzYW1lIExpbWl0IGFzICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaExpc3RMaW1pdH0KICAgICAgICAjIHNtYWxsZXN0IExpbWl0IGZyb20gYWxsIHNvdXJjZXMKICAgICAgICBteSAkTGltaXQ7CiAgICAgICAgU09VUkNFOgogICAgICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJVc2VyJENvdW50Iik7CiAgICAgICAgICAgIG15ICRDdXN0b21lclVzZXJNYXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpOwogICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJEN1c3RvbWVyVXNlck1hcC0+e0N1c3RvbWVyVXNlclNlYXJjaExpc3RMaW1pdH07CiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJExpbWl0IHx8ICRDdXN0b21lclVzZXJNYXAtPntDdXN0b21lclVzZXJTZWFyY2hMaXN0TGltaXR9IDwgJExpbWl0ICkgewogICAgICAgICAgICAgICAgJExpbWl0ID0gJEN1c3RvbWVyVXNlck1hcC0+e0N1c3RvbWVyVXNlclNlYXJjaExpc3RMaW1pdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXMgZmFsbGJhY2sgdGFrZSB0aGUgaGFyZGNvZGVkIGxpbWl0IG9mIEtlcm5lbC9TeXN0ZW0vQ3VzdG9tZXJVc2VyL0RCLnBtCiAgICAgICAgJExpbWl0IC8vPSAyNTA7CgogICAgICAgIG15ICVMaXN0QWxsSXRlbXMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgU2VhcmNoID0+ICRQYXJhbXtTZWFyY2h9LAogICAgICAgICAgICBMaW1pdCAgPT4gJExpbWl0ICsgMSwKICAgICAgICAgICAgVmFsaWQgID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBrZXlzICVMaXN0QWxsSXRlbXMgPD0gJExpbWl0ICkgewogICAgICAgICAgICBteSAkTGlzdEFsbEl0ZW1zID0ga2V5cyAlTGlzdEFsbEl0ZW1zOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3SGVhZGVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExpc3RBbGwgPT4gJExpc3RBbGxJdGVtcywKICAgICAgICAgICAgICAgICAgICBMaW1pdCAgID0+ICRMaW1pdCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIFZhbGlkICA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA/IDAgOiAxLAogICAgICAgICk7CgogICAgICAgIGlmICgga2V5cyAlTGlzdEFsbEl0ZW1zID4gJExpbWl0ICkgewogICAgICAgICAgICBteSAkTGlzdEFsbEl0ZW1zICAgPSBrZXlzICVMaXN0QWxsSXRlbXM7CiAgICAgICAgICAgIG15ICRTZWFyY2hMaXN0U2l6ZSA9IGtleXMgJUxpc3Q7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3SGVhZGVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFNlYXJjaExpc3RTaXplID0+ICRTZWFyY2hMaXN0U2l6ZSwKICAgICAgICAgICAgICAgICAgICBMaXN0QWxsICAgICAgICA9PiAkTGlzdEFsbEl0ZW1zLAogICAgICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgID0+ICRMaW1pdCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N3aXRjaFRvQ3VzdG9tZXInKSAmJiAkU2VsZi0+e1N3aXRjaFRvQ3VzdG9tZXJQZXJtaXNzaW9ufSAmJiAkUGFyYW17TmF2fSBuZSAnTm9uZScgKQogICAgICAgIHsKICAgICAgICAgICAgJENvbFNwYW4gPSA3OwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0U3dpdGNoVG9DdXN0b21lcicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHRoZXJlIGFyZSByZXN1bHRzIHRvIHNob3cKICAgICAgICBpZiAoJUxpc3QpIHsKCiAgICAgICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICAgICAgbXkgJVZhbGlkTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgICAgICAgICAgZm9yIG15ICRMaXN0S2V5ICggc29ydCB7IGxjKCRhKSBjbXAgbGMoJGIpIH0ga2V5cyAlTGlzdCApIHsKCiAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRMaXN0S2V5ICk7CiAgICAgICAgICAgICAgICAkVXNlckRhdGF7VXNlckZ1bGxuYW1lfSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyTmFtZSgKICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFVzZXJEYXRhe1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0Um93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgICAgICAgPT4gJFZhbGlkTGlzdHsgJFVzZXJEYXRhe1ZhbGlkSUR9IHx8ICcnIH0gfHwgJy0nLAogICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggICAgICA9PiAkUGFyYW17U2VhcmNofSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgPT4gJExpc3RLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte05hdn0gZXEgJ05vbmUnICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFJvd0xpbmtOb25lJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggICAgICA9PiAkUGFyYW17U2VhcmNofSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ID0+ICRMaXN0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHRSb3dMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggICAgICA9PiAkUGFyYW17U2VhcmNofSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdiAgICAgICAgID0+ICRQYXJhbXtOYXZ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgPT4gJExpc3RLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdTd2l0Y2hUb0N1c3RvbWVyJykKICAgICAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e1N3aXRjaFRvQ3VzdG9tZXJQZXJtaXNzaW9ufQogICAgICAgICAgICAgICAgICAgICYmICRQYXJhbXtOYXZ9IG5lICdOb25lJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHRSb3dTd2l0Y2hUb0N1c3RvbWVyJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvdGhlcndpc2UgaXQgZGlzcGxheXMgYSBubyBkYXRhIGZvdW5kIG1lc3NhZ2UKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdOb0RhdGFGb3VuZE1zZycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDb2xTcGFuID0+ICRDb2xTcGFuLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIHNlYXJjaCBpdCBzaG93cyBhIG1lc3NhZ2UKICAgIGVsc2UKICAgIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9TZWFyY2hUZXJtcycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgS2V5ICAgPT4gJ05hdicsCiAgICAgICAgVmFsdWUgPT4gJFBhcmFte05hdn0sCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIF9FZGl0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBHZXQgbGF5b3V0IG9iamVjdC4KICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdBY3Rpb25PdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld1VwZGF0ZScsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtBY3Rpb259IGVxICdDaGFuZ2UnICkgewoKICAgICAgICAjIHNob3dzIGVkaXQgaGVhZGVyCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0hlYWRlckVkaXQnICk7CgogICAgICAgICMgc2hvd3MgZWZmZWN0aXZlIHBlcm1pc3Npb25zIG1hdHJpeAogICAgICAgICRTZWxmLT5fRWZmZWN0aXZlUGVybWlzc2lvbnMoJVBhcmFtKTsKICAgIH0KCiAgICAjIHNob3dzIGFkZCBoZWFkZXIKICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdIZWFkZXJBZGQnICk7CiAgICB9CgogICAgbXkgJFVwZGF0ZU9ubHlQcmVmZXJlbmNlczsKCiAgICAjIEdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHVwZGF0ZSB1c2VyCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57UmVhZE9ubHl9CiAgICAgICAgfHwKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntNb2R1bGV9ID1+IC9MREFQL2kKICAgICAgICApCiAgICB7CiAgICAgICAgJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyA9IDE7CiAgICB9CgogICAgIyBHZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdC4KICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgISRFbnRyeS0+WzBdOwoKICAgICAgICAjIEhhbmRsZSBkeW5hbWljIGZpZWxkcwogICAgICAgIGlmICggJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnICkgewoKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAjIEdldCBIVE1MIGZvciBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSA/ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSA6IHVuZGVmLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAoKICAgICAgICAgICAgICAgICMgU2VydmVyIGVycm9yLCBpZiBhbnkKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtFcnJvcnN9LT57ICRFbnRyeS0+WzBdIH0gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2tpcCBmaWVsZHMgZm9yIHdoaWNoIEhUTUwgY291bGQgbm90IGJlIHJldHJpZXZlZAogICAgICAgICAgICBuZXh0IEVOVFJZIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkSFRNTCk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgIH0KCiAgICAgICAgbXkgJEJsb2NrID0gJ0lucHV0JzsKCiAgICAgICAgIyBjaGVjayBpbnB1dCB0eXBlCiAgICAgICAgaWYgKCAkRW50cnktPlswXSA9fiAvXlVzZXJQYXNzd29yL2kgKSB7CiAgICAgICAgICAgICRCbG9jayA9ICdQYXNzd29yZCc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGxvZ2luIGF1dG8gY3JlYXRpb24KICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e0F1dG9Mb2dpbkNyZWF0aW9ufSAmJiAkRW50cnktPlswXSBlcSAnVXNlckxvZ2luJyApIHsKICAgICAgICAgICAgJEJsb2NrID0gJ0lucHV0SGlkZGVuJzsKICAgICAgICB9CgogICAgICAgIGlmICggJEVudHJ5LT5bN10gfHwgJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyApIHsKICAgICAgICAgICAgJFBhcmFte1JlYWRPbmx5fSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17UmVhZE9ubHl9ID0gMDsKICAgICAgICB9CgogICAgICAgICMgc2hvdyByZXF1aXJlZCBmbGFnCiAgICAgICAgaWYgKCAkRW50cnktPls0XSApIHsKICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkQ2xhc3N9ICAgICAgICAgID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkTGFiZWxDbGFzc30gICAgID0gJ01hbmRhdG9yeSc7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZExhYmVsQ2hhcmFjdGVyfSA9ICcqJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZENsYXNzfSAgICAgICAgICA9ICcnOwogICAgICAgICAgICAkUGFyYW17UmVxdWlyZWRMYWJlbENsYXNzfSAgICAgPSAnJzsKICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkTGFiZWxDaGFyYWN0ZXJ9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBlbXB0eSBzdHJpbmcKICAgICAgICAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9IHx8PSAnJzsKCiAgICAgICAgIyBhZGQgY2xhc3MgdG8gdmFsaWRhdGUgZW1haWxzCiAgICAgICAgaWYgKCAkRW50cnktPlswXSBlcSAnVXNlckVtYWlsJyApIHsKICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkQ2xhc3N9IC49ICcgVmFsaWRhdGVfRW1haWwnOwogICAgICAgIH0KCiAgICAgICAgIyBCdWlsZCBzZWxlY3Rpb25zIG9yIGlucHV0IGZpZWxkcy4KICAgICAgICAjIEFuIGV4cGxpY2l0IHNlbGVjdGlvbiBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntTZWxlY3Rpb25zfS0+eyAkRW50cnktPlswXSB9ICkgewogICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKCiAgICAgICAgICAgICMgQ2hhbmdlIHRoZSB2YWxpZGF0aW9uIGNsYXNzCiAgICAgICAgICAgIGlmICggJFBhcmFte1JlcXVpcmVkQ2xhc3N9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkQ2xhc3N9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgdGhlIGRhdGEgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uCiAgICAgICAgICAgIG15ICRTZWxlY3Rpb25zRGF0YSA9ICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e1NlbGVjdGlvbnN9LT57ICRFbnRyeS0+WzBdIH07CgogICAgICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgZW5jb2Rpbmcgc3RhbXAgaXMgc2V0CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JFNlbGVjdGlvbnNEYXRhfSApIHsKICAgICAgICAgICAgICAgICRTZWxlY3Rpb25zRGF0YS0+eyRLZXl9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5FbmNvZGVJbnB1dCggJFNlbGVjdGlvbnNEYXRhLT57JEtleX0gKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBidWlsZCBvcHRpb24gc3RyaW5nCiAgICAgICAgICAgICRQYXJhbXtPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkU2VsZWN0aW9uc0RhdGEsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkUGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAiJFBhcmFte1JlcXVpcmVkQ2xhc3N9IE1vZGVybml6ZSAiIC4gJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSwKICAgICAgICAgICAgICAgIERpc2FibGVkICAgID0+ICRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgPyAxIDogMCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAkRW50cnktPlswXSA9fiBtL15Vc2VyQ291bnRyeS9pCiAgICAgICAgICAgICYmCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnUmVmZXJlbmNlRGF0YTo6VHJhbnNsYXRlZENvdW50cnlOYW1lcycpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRCbG9jayA9ICdPcHRpb24nOwoKICAgICAgICAgICAgbXkgJENvdW50cnlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlZmVyZW5jZURhdGEnKS0+Q0xEUkNvdW50cnlMaXN0KAogICAgICAgICAgICAgICAgTGFuZ3VhZ2UgPT4gJExheW91dE9iamVjdC0+e1VzZXJMYW5ndWFnZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSBwcmV2aW91cyB2YWx1ZSBleGlzdHMgaW4gdGhlIHNlbGVjdGlvbiBsaXN0IGV2ZW4gaWYgaXNuJ3QgYSBjb3VudHJ5IGNvZGUuCiAgICAgICAgICAgIG15ICRQcmV2aW91c0NvdW50cnkgPSAkUGFyYW17ICRFbnRyeS0+WzBdIH07CiAgICAgICAgICAgIGlmICgkUHJldmlvdXNDb3VudHJ5KSB7CiAgICAgICAgICAgICAgICAkQ291bnRyeUxpc3QtPnskUHJldmlvdXNDb3VudHJ5fSAvLz0gJFByZXZpb3VzQ291bnRyeTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ291bnRyeUxpc3QsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRFbnRyeS0+WzBdLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICIkUGFyYW17UmVxdWlyZWRDbGFzc30gTW9kZXJuaXplICIgLiAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICggJFBhcmFteyAkRW50cnktPlswXSB9IC8vIDEgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRW50cnktPlswXSA9fiBtL15WYWxpZElEL2kgKSB7CgogICAgICAgICAgICAjIENoYW5nZSB0aGUgdmFsaWRhdGlvbiBjbGFzcwogICAgICAgICAgICBpZiAoICRQYXJhbXtSZXF1aXJlZENsYXNzfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZENsYXNzfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYnVpbGQgVmFsaWRJRCBzdHJpbmcKICAgICAgICAgICAgJEJsb2NrID0gJ09wdGlvbic7CiAgICAgICAgICAgICRQYXJhbXtPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IHsgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpLCB9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gZGVmaW5lZCggJFBhcmFteyAkRW50cnktPlswXSB9ICkgPyAkUGFyYW17ICRFbnRyeS0+WzBdIH0gOiAxLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAiJFBhcmFte1JlcXVpcmVkQ2xhc3N9IE1vZGVybml6ZSAiIC4gJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSwKICAgICAgICAgICAgICAgIERpc2FibGVkICAgPT4gJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyA/IDEgOiAwLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICRFbnRyeS0+WzBdID1+IG0vXlVzZXJDdXN0b21lcklEJC9pCiAgICAgICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e0N1c3RvbWVyQ29tcGFueVN1cHBvcnR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRDdXN0b21lckNvbXBhbnlPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55Jyk7CiAgICAgICAgICAgIG15ICVDb21wYW55TGlzdCAgICAgICAgICAgPSAoCiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlMaXN0KCBMaW1pdCA9PiAwICksCiAgICAgICAgICAgICAgICAnJyA9PiAnLScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJFBhcmFteyAkRW50cnktPlswXSB9ICkgewogICAgICAgICAgICAgICAgbXkgJUNvbXBhbnkgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkUGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJUNvbXBhbnkgKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbXBhbnlMaXN0eyAkUGFyYW17ICRFbnRyeS0+WzBdIH0gfSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSAuICcgKC0pJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKCiAgICAgICAgICAgICMgQ2hhbmdlIHRoZSB2YWxpZGF0aW9uIGNsYXNzCiAgICAgICAgICAgIGlmICggJFBhcmFte1JlcXVpcmVkQ2xhc3N9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkQ2xhc3N9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFVzZUF1dG9Db21wbGV0ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQWRtaW5DdXN0b21lclVzZXI6OlVzZUF1dG9Db21wbGV0ZScpOwoKICAgICAgICAgICAgaWYgKCRVc2VBdXRvQ29tcGxldGUpIHsKCiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkUGFyYW17ICRFbnRyeS0+WzBdIH0gfHwgJFBhcmFte0N1c3RvbWVySUR9OwogICAgICAgICAgICAgICAgJFZhbHVlID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICJbJSBEYXRhLlZhbHVlIHwgaHRtbCAlXSIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICc8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IlVzZXJDdXN0b21lcklEIiBuYW1lPSJVc2VyQ3VzdG9tZXJJRCIgdmFsdWU9IicgLiAkVmFsdWUgLiAnIgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJXNTBwYyBDdXN0b21lckF1dG9Db21wbGV0ZVNpbXBsZSAnCiAgICAgICAgICAgICAgICAgICAgLiAkUGFyYW17UmVxdWlyZWRDbGFzc30gLiAnICcKICAgICAgICAgICAgICAgICAgICAuICRQYXJhbXtFcnJvcnN9LT57ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0KICAgICAgICAgICAgICAgICAgICAuICciIGRhdGEtY3VzdG9tZXItc2VhcmNoLXR5cGU9IkN1c3RvbWVySUQiIC8+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJUNvbXBhbnlMaXN0LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICA9PiA4MCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSB8fCAkUGFyYW17Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAiJFBhcmFte1JlcXVpcmVkQ2xhc3N9IE1vZGVybml6ZSAiIC4gJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSwKICAgICAgICAgICAgICAgICAgICBEaXNhYmxlZCAgID0+ICRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgPyAxIDogMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17QWN0aW9ufSBlcSAnQWRkJyAmJiAkRW50cnktPlswXSA9fiAvXlVzZXJDdXN0b21lcklEJC9pICkgewoKICAgICAgICAgICAgIyBVc2UgQ3VzdG9tZXJJRCBwYXJhbSBpZiBjYWxsZWQgZnJvbSBDSUMuCiAgICAgICAgICAgICRQYXJhbXtWYWx1ZX0gPSAkUGFyYW17ICRFbnRyeS0+WzBdIH0gfHwgJFBhcmFte0N1c3RvbWVySUR9IHx8ICcnOwogICAgICAgIH0KIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICAgICAjIEJ1aWxkIHRoZSBncm91cCBmaWVsZC4KICAgICAgICBlbHNpZiAoICRFbnRyeS0+WzBdID1+IC9eVXNlckdyb3VwSUQkL2kgKSB7CiAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHRoZSBwZXJtaXNzaW9uIHRvIHNlZS9jaGFuZ2UgdGhlIG11bHRpdGVuYW5jeSBmaWVsZC4KICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNdWx0aXRlbmFuY3lQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAjIEJ1aWxkIHRoZSBmaWVsZC4KICAgICAgICAgICAgICAgICRCbG9jayA9ICdPcHRpb24nOwogICAgICAgICAgICAgICAgJFBhcmFte09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSAnIC4gKCAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9IHx8ICcnICksCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBEaXNhYmxlZCAgICAgPT4gJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyA/IDEgOiAwLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17VmFsdWV9ID0gJFBhcmFteyAkRW50cnktPlswXSB9IHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgZm9ybSBvcHRpb24KICAgICAgICBpZiAoICRQYXJhbXtUeXBlfSAmJiAkUGFyYW17VHlwZX0gZXEgJ2hpZGRlbicgKSB7CiAgICAgICAgICAgICRQYXJhbXtQcmVmZXJlbmNlc30gLj0gJFBhcmFte1ZhbHVlfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJlZmVyZW5jZXNHZW5lcmljJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEVudHJ5LT5bMV0sCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gIlByZWZlcmVuY2VzR2VuZXJpYyRCbG9jayIsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBJdGVtICAgICAgICAgPT4gJEVudHJ5LT5bMV0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRFbnRyeS0+WzBdLAogICAgICAgICAgICAgICAgICAgIEludmFsaWRGaWVsZCA9PiAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCB0aGUgY29ycmVjdCBjbGllbnQgc2lkZSBlcnJvciBtc2cKICAgICAgICAgICAgaWYgKCAkQmxvY2sgZXEgJ0lucHV0JyAmJiAkRW50cnktPlswXSBlcSAnVXNlckVtYWlsJyApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ByZWZlcmVuY2VzVXNlckVtYWlsRXJyb3JNc2cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyBOYW1lID0+ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiUHJlZmVyZW5jZXNHZW5lcmljRXJyb3JNc2ciLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyBOYW1lID0+ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCB0aGUgY29ycmVjdCBzZXJ2ZXIgZXJyb3IgbXNnCiAgICAgICAgICAgIGlmICggJEJsb2NrIGVxICdJbnB1dCcgJiYgJFBhcmFte1VzZXJFbWFpbH0gJiYgJEVudHJ5LT5bMF0gZXEgJ1VzZXJFbWFpbCcgKSB7CgogICAgICAgICAgICAgICAgIyBkaXNwbGF5IHNlcnZlciBlcnJvciBtc2cgYWNjb3JkaW5nIHdpdGggdGhlIG9jY3VycmVkIGVtYWlsIGVycm9yIHR5cGUKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ByZWZlcmVuY2VzVXNlckVtYWlsJyAuICggJFBhcmFte0Vycm9yc30tPntFcnJvclR5cGV9IHx8ICcnICksCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7IE5hbWUgPT4gJEVudHJ5LT5bMF0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICJQcmVmZXJlbmNlc0dlbmVyaWNTZXJ2ZXJFcnJvck1zZyIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7IE5hbWUgPT4gJEVudHJ5LT5bMF0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJFByZWZlcmVuY2VzVXNlZCA9ICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e0FkbWluU2V0UHJlZmVyZW5jZXN9OwogICAgaWYgKCAoIGRlZmluZWQgJFByZWZlcmVuY2VzVXNlZCAmJiAkUHJlZmVyZW5jZXNVc2VkICE9IDAgKSB8fCAhZGVmaW5lZCAkUHJlZmVyZW5jZXNVc2VkICkgewoKICAgICAgICBteSAlRGF0YTsKICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUHJlZmVyZW5jZXNHcm91cHMnKSB9OwoKICAgICAgICBHUk9VUDoKICAgICAgICBmb3IgbXkgJEdyb3VwICggc29ydCBrZXlzICVQcmVmZXJlbmNlcyApIHsKCiAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRHcm91cDsKCiAgICAgICAgICAgIG15ICRQcmVmZXJlbmNlc0dyb3VwID0gJFByZWZlcmVuY2VzeyRHcm91cH07CgogICAgICAgICAgICBuZXh0IEdST1VQIGlmICEkUHJlZmVyZW5jZXNHcm91cDsKICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiByZWYgJFByZWZlcmVuY2VzR3JvdXAgbmUgJ0hBU0gnOwoKICAgICAgICAgICAgaWYgKCAkRGF0YXsgJFByZWZlcmVuY2VzR3JvdXAtPntQcmlvfSB9ICkgewoKICAgICAgICAgICAgICAgIENPVU5UOgogICAgICAgICAgICAgICAgZm9yICggMSAuLiAxNTEgKSB7CgogICAgICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlc0dyb3VwLT57UHJpb30rKzsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJERhdGF7ICRQcmVmZXJlbmNlc0dyb3VwLT57UHJpb30gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7ICRQcmVmZXJlbmNlc0dyb3VwLT57UHJpb30gfSA9ICRHcm91cDsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBDT1VOVDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICREYXRheyAkUHJlZmVyZW5jZXNHcm91cC0+e1ByaW99IH0gPSAkR3JvdXA7CiAgICAgICAgfQoKICAgICAgICAjIHNvcnQKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlRGF0YSApIHsKICAgICAgICAgICAgJERhdGF7IHNwcmludGYgIiUwN2QiLCAkS2V5IH0gPSAkRGF0YXskS2V5fTsKICAgICAgICAgICAgZGVsZXRlICREYXRheyRLZXl9OwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGVhY2ggcHJlZmVyZW5jZXMgc2V0dGluZwogICAgICAgIFBSSU86CiAgICAgICAgZm9yIG15ICRQcmlvICggc29ydCBrZXlzICVEYXRhICkgewoKICAgICAgICAgICAgbXkgJEdyb3VwID0gJERhdGF7JFByaW99OwogICAgICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT57Q3VzdG9tZXJQcmVmZXJlbmNlc0dyb3Vwc30tPnskR3JvdXB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBQUklPOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAlUHJlZmVyZW5jZSA9ICV7ICRDb25maWdPYmplY3QtPntDdXN0b21lclByZWZlcmVuY2VzR3JvdXBzfS0+eyRHcm91cH0gfTsKICAgICAgICAgICAgaWYgKCAkR3JvdXAgZXEgJ1Bhc3N3b3JkJyApIHsKICAgICAgICAgICAgICAgIG5leHQgUFJJTzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRQcmVmZXJlbmNle01vZHVsZX0gfHwgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpDdXN0b21lclByZWZlcmVuY2VzR2VuZXJpYyc7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiBcJVByZWZlcmVuY2UsCiAgICAgICAgICAgICAgICAgICAgVXNlck9iamVjdCA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyksCiAgICAgICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSBAUGFyYW1zID0gJE9iamVjdC0+UGFyYW0oCiAgICAgICAgICAgICAgICAgICAgVXNlckRhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lciA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbUl0ZW0gKEBQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiAkUGFyYW1JdGVtLT57RGF0YX0gZXEgJ0hBU0gnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByZWYgJFByZWZlcmVuY2V7RGF0YX0gZXEgJ0hBU0gnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICVCdWlsZFNlbGVjdGlvblBhcmFtcyA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUHJlZmVyZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRQYXJhbUl0ZW19LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRCdWlsZFNlbGVjdGlvblBhcmFtc3tDbGFzc30gPSBqb2luKCAnICcsICRCdWlsZFNlbGVjdGlvblBhcmFtc3tDbGFzc30gLy8gJycsICdNb2Rlcm5pemUnICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFtSXRlbS0+e09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlQnVpbGRTZWxlY3Rpb25QYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFtSXRlbS0+e0Jsb2NrfSB8fCAkUHJlZmVyZW5jZXtCbG9ja30gfHwgJ09wdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCA9PiAkR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVQcmVmZXJlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JFBhcmFtSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdOYXYnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtOYXZ9LAogICAgKTsKCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5DdXN0b21lclVzZXInLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKc3ViIF9FZmZlY3RpdmVQZXJtaXNzaW9ucyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgb25seSBpZiBjdXN0b21lciBncm91cCBmZWF0dXJlIGlzIGFjdGl2ZQogICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdDdXN0b21lckdyb3VwU3VwcG9ydCcpICkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDdXN0b21lckdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnKTsKCiAgICAjIHNob3cgdGFibGVzCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdFZmZlY3RpdmVQZXJtaXNzaW9ucycsCiAgICApOwoKICAgIG15ICVHcm91cHM7CiAgICBteSAlUGVybWlzc2lvbnM7CgogICAgIyBnbyB0aHJvdWdoIHBlcm1pc3Npb24gdHlwZXMKICAgIG15IEBUeXBlcyA9IEB7ICRDb25maWdPYmplY3QtPkdldCgnU3lzdGVtOjpDdXN0b21lcjo6UGVybWlzc2lvbicpIH07CiAgICBmb3IgbXkgJFR5cGUgKEBUeXBlcykgewoKICAgICAgICAjIHNob3cgaGVhZGVyCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gIkhlYWRlckdyb3VwUGVybWlzc2lvblR5cGUiLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZ3JvdXBzIG9mIHRoZSB1c2VyCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkQ3VzdG9tZXJHcm91cE9iamVjdC0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkUGFyYW17SUR9LAogICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgUmVzdWx0ICAgICAgICAgPT4gJ0hBU0gnLAogICAgICAgICAgICBSYXdQZXJtaXNzaW9ucyA9PiAwLCAgICAgICAgICAgICMgZ2V0IGVmZmVjdGl2ZSBwZXJtaXNzaW9ucwogICAgICAgICk7CgogICAgICAgICMgc3RvcmUgZGF0YSBpbiBsb29rdXAgaGFzaGVzCiAgICAgICAgZm9yIG15ICRHcm91cElEICggc29ydCBrZXlzICVVc2VyR3JvdXBzICkgewogICAgICAgICAgICAkR3JvdXBzeyRHcm91cElEfSA9ICRVc2VyR3JvdXBzeyRHcm91cElEfTsKICAgICAgICAgICAgJFBlcm1pc3Npb25zeyRHcm91cElEfXskVHlwZX0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgbWVzc2FnZSBpZiBubyBwZXJtaXNzaW9ucyBmb3VuZAogICAgaWYgKCAhJVBlcm1pc3Npb25zICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0dyb3VwUGVybWlzc2lvbnNGb3VuZE1zZycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdvIHRocm91Z2ggZ3JvdXBzLCBzb3J0IGJ5IG5hbWUKICAgIGVsc2UgewogICAgICAgIGZvciBteSAkR3JvdXBJRCAoIHNvcnQgeyB1YyggJEdyb3Vwc3skYX0gKSBjbXAgdWMoICRHcm91cHN7JGJ9ICkgfSBrZXlzICVHcm91cHMgKSB7CgogICAgICAgICAgICAjIHNob3cgdGFibGUgcm93cwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0dyb3VwUGVybWlzc2lvblRhYmxlUm93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIElEICAgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkR3JvdXBzeyRHcm91cElEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgcGVybWlzc2lvbiBtYXJrcwogICAgICAgICAgICBmb3IgbXkgJFR5cGUgKEBUeXBlcykgewogICAgICAgICAgICAgICAgbXkgJFBlcm1pc3Npb25NYXJrID0gJFBlcm1pc3Npb25zeyRHcm91cElEfXskVHlwZX0gPyAnT24nICAgICAgICA6ICdPZmYnOwogICAgICAgICAgICAgICAgbXkgJEhpZ2hsaWdodE1hcmsgID0gJFR5cGUgZXEgJ3J3JyAgICAgICAgICAgICAgICAgPyAnSGlnaGxpZ2h0JyA6ICcnOwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnR3JvdXBQZXJtaXNzaW9uTWFyaycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnR3JvdXBQZXJtaXNzaW9uTWFyaycgLiAkUGVybWlzc2lvbk1hcmssCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2hsaWdodCA9PiAkSGlnaGxpZ2h0TWFyaywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhbGwgYWNjZXNzaWJsZSBjdXN0b21lcnMgb2YgdGhlIHVzZXIKICAgIG15ICVDdXN0b21lcnMgPSAkQ3VzdG9tZXJHcm91cE9iamVjdC0+R3JvdXBDb250ZXh0Q3VzdG9tZXJzKAogICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRQYXJhbXtJRH0sCiAgICApOwoKICAgICMgc2hvdyBtZXNzYWdlIGlmIG5vIGN1c3RvbWVycyBmb3VuZAogICAgaWYgKCAhJUN1c3RvbWVycyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9DdXN0b21lckFjY2Vzc0ZvdW5kTXNnJywKICAgICAgICApOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZ2V0IHBlcm1pc3Npb24gY29udGV4dHMKICAgIG15ICRDb250ZXh0Q29uZmlnICAgICAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyR3JvdXBQZXJtaXNzaW9uQ29udGV4dCcpOwogICAgbXkgJERpcmVjdEFjY2Vzc0NvbnRleHRLZXkgICA9ICcwMDEtQ3VzdG9tZXJJRC1zYW1lJzsKICAgIG15ICRJbmRpcmVjdEFjY2Vzc0NvbnRleHRLZXkgPSAnMTAwLUN1c3RvbWVySUQtb3RoZXInOwoKICAgICMgdXNlIGRlZmF1bHQgY29udGV4dCBpZiBub25lIGFyZSBmb3VuZAogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJENvbnRleHRDb25maWcpICkgewogICAgICAgICRDb250ZXh0Q29uZmlnID0gewogICAgICAgICAgICAkRGlyZWN0QWNjZXNzQ29udGV4dEtleSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lID0+IFRyYW5zbGF0YWJsZSgnU2FtZSBDdXN0b21lcicpLAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBzaG93IGRlZmF1bHQgYW5kIGV4dHJhIGNvbnRleHQgaGVhZGVycyBpZiBhdmFpbGFibGUKICAgIGlmICggJENvbnRleHRDb25maWctPnskRGlyZWN0QWNjZXNzQ29udGV4dEtleX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0hlYWRlckN1c3RvbWVyQWNjZXNzQ29udGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ0RpcmVjdCcpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRDb250ZXh0Q29uZmlnLT57JEluZGlyZWN0QWNjZXNzQ29udGV4dEtleX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0hlYWRlckN1c3RvbWVyQWNjZXNzQ29udGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ0luZGlyZWN0JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRldGVybWluZSBjdXN0b21lcnMgZm9yIGRpcmVjdCBhbmQgaW5kaXJlY3QgYWNjZXNzCiAgICBteSBAVXNlckN1c3RvbWVySURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lcklEcygKICAgICAgICBVc2VyID0+ICRQYXJhbXtJRH0sCiAgICApOwogICAgbXkgJUV4dHJhQ3VzdG9tZXJJRHM7CiAgICBpZiAoICRDb250ZXh0Q29uZmlnLT57JEluZGlyZWN0QWNjZXNzQ29udGV4dEtleX0gKSB7CiAgICAgICAgbXkgJEV4dHJhQ29udGV4dE5hbWUgPSAkQ3VzdG9tZXJHcm91cE9iamVjdC0+R3JvdXBDb250ZXh0TmFtZUdldCgKICAgICAgICAgICAgU3lzQ29uZmlnTmFtZSA9PiAkSW5kaXJlY3RBY2Nlc3NDb250ZXh0S2V5LAogICAgICAgICk7CgogICAgICAgICMgZm9yIGFsbCBDdXN0b21lcklEcyBnZXQgZ3JvdXBzIHdpdGggZXh0cmEgYWNjZXNzCiAgICAgICAgbXkgJUV4dHJhUGVybWlzc2lvbkdyb3VwczsKICAgICAgICBDVVNUT01FUklEOgogICAgICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoQFVzZXJDdXN0b21lcklEcykgewogICAgICAgICAgICBteSAlR3JvdXBMaXN0ID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPkdyb3VwQ3VzdG9tZXJMaXN0KAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIENvbnRleHQgICAgPT4gJEV4dHJhQ29udGV4dE5hbWUsCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBDVVNUT01FUklEIGlmICElR3JvdXBMaXN0OwoKICAgICAgICAgICAgIyBhZGQgdG8gZ3JvdXBzCiAgICAgICAgICAgICVFeHRyYVBlcm1pc3Npb25Hcm91cHMgPSAoCiAgICAgICAgICAgICAgICAlRXh0cmFQZXJtaXNzaW9uR3JvdXBzLAogICAgICAgICAgICAgICAgJUdyb3VwTGlzdCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYWRkIGFsbCB1bmlxdWUgYWNjZXNzaWJsZSBHcm91cDwtPkN1c3RvbWVyIGNvbWJpbmF0aW9ucwogICAgICAgIEdST1VQSUQ6CiAgICAgICAgZm9yIG15ICRHcm91cElEICggc29ydCBrZXlzICVFeHRyYVBlcm1pc3Npb25Hcm91cHMgKSB7CiAgICAgICAgICAgIG15IEBHcm91cEN1c3RvbWVySURzID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPkdyb3VwQ3VzdG9tZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR3JvdXBJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0lEJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBHUk9VUElEIGlmICFAR3JvdXBDdXN0b21lcklEczsKCiAgICAgICAgICAgICMgYWRkIHRvIEV4dHJhQ3VzdG9tZXJJRHMKICAgICAgICAgICAgJUV4dHJhQ3VzdG9tZXJJRHMgPSAoCiAgICAgICAgICAgICAgICAlRXh0cmFDdXN0b21lcklEcywKICAgICAgICAgICAgICAgIG1hcCB7ICRfID0+IDEgfSBAR3JvdXBDdXN0b21lcklEcywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnbyB0aHJvdWdoIGN1c3RvbWVycwogICAgQ1VTVE9NRVJJRDoKICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoIHNvcnQga2V5cyAlQ3VzdG9tZXJzICkgewoKICAgICAgICAjIHNob3cgdGFibGUgcm93cwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lckFjY2Vzc1RhYmxlUm93JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBJRCAgID0+ICRDdXN0b21lcklELAogICAgICAgICAgICAgICAgTmFtZSA9PiAkQ3VzdG9tZXJzeyRDdXN0b21lcklEfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjICdTYW1lIEN1c3RvbWVyJwogICAgICAgIGlmICggJENvbnRleHRDb25maWctPnskRGlyZWN0QWNjZXNzQ29udGV4dEtleX0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHdlIHNob3VsZCBzaG93IGNoZWNrIG1hcmsgZm9yICdTYW1lIEN1c3RvbWVyJwogICAgICAgICAgICBteSAkQWNjZXNzTWFyayA9ICggZ3JlcCB7ICRfIGVxICRDdXN0b21lcklEIH0gQFVzZXJDdXN0b21lcklEcyApID8gJ09uJyA6ICdPZmYnOwoKICAgICAgICAgICAgIyBzaG93IGJsb2NrcwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyQWNjZXNzTWFyaycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJBY2Nlc3NNYXJrJyAuICRBY2Nlc3NNYXJrLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyAnT3RoZXIgQ3VzdG9tZXJzJwogICAgICAgIG5leHQgQ1VTVE9NRVJJRCBpZiAhJENvbnRleHRDb25maWctPnskSW5kaXJlY3RBY2Nlc3NDb250ZXh0S2V5fTsKCiAgICAgICAgIyBjaGVjayBpZiB3ZSBzaG91bGQgc2hvdyBjaGVjayBtYXJrIGZvciAnT3RoZXIgQ3VzdG9tZXJzJwogICAgICAgIG15ICRBY2Nlc3NNYXJrID0gJEV4dHJhQ3VzdG9tZXJJRHN7JEN1c3RvbWVySUR9ID8gJ09uJyA6ICdPZmYnOwoKICAgICAgICAjIHNob3cgYmxvY2tzCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyQWNjZXNzTWFyaycsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJBY2Nlc3NNYXJrJyAuICRBY2Nlc3NNYXJrLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/System/CustomerCompany/DB.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBhYjc4ZTcwMDdjMzI3Y2I3MDcwMmVmZjJmYTNiNjY1YWQ5ZTcxZmMyIC0gS2VybmVsL1N5c3RlbS9DdXN0b21lckNvbXBhbnkvREIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55OjpEQjsKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OkNvbmZpZycsCiMgRU8gUm90aGVyIE9TUwogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKIyBFTyBSb3RoZXIgT1NTCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICMgZ2V0IGN1c3RvbWVyIGNvbXBhbnkgbWFwCiAgICAjIGFjdHVhbGx5IHRoZSBwYXJhbWV0ZXIgQ3VzdG9tZXJDb21wYW55TWFwIGluY2x1ZGVzIHRoZSBjb21wbGV0ZSBjb25maWcgb2YgdGhlIGJhY2tlbmQKICAgICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfSA9ICRQYXJhbXtDdXN0b21lckNvbXBhbnlNYXB9IHx8IGRpZSAiR290IG5vIEN1c3RvbWVyQ29tcGFueU1hcCEiOwoKICAgICMgY29uZmlnIG9wdGlvbnMKICAgICRTZWxmLT57Q3VzdG9tZXJDb21wYW55VGFibGV9ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57UGFyYW1zfS0+e1RhYmxlfQogICAgICAgIHx8IGRpZSAiTmVlZCBDdXN0b21lckNvbXBhbnktPlBhcmFtcy0+VGFibGUgaW4gS2VybmVsL0NvbmZpZy5wbSEiOwogICAgJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q3VzdG9tZXJDb21wYW55S2V5fQogICAgICAgIHx8IGRpZSAiTmVlZCBDdXN0b21lckNvbXBhbnktPkN1c3RvbWVyQ29tcGFueUtleSBpbiBLZXJuZWwvQ29uZmlnLnBtISI7CiAgICAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueVZhbGlkfSA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+eydDdXN0b21lckNvbXBhbnlWYWxpZCd9OwogICAgJFNlbGYtPntTZWFyY2hMaXN0TGltaXR9ICAgICAgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPnsnQ3VzdG9tZXJDb21wYW55U2VhcmNoTGlzdExpbWl0J30gfHwgNTAwMDA7CiAgICAkU2VsZi0+e1NlYXJjaFByZWZpeH0gICAgICAgICA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+eydDdXN0b21lckNvbXBhbnlTZWFyY2hQcmVmaXgnfTsKCiAgICBpZiAoICFkZWZpbmVkKCAkU2VsZi0+e1NlYXJjaFByZWZpeH0gKSApIHsKICAgICAgICAkU2VsZi0+e1NlYXJjaFByZWZpeH0gPSAnJzsKICAgIH0KICAgICRTZWxmLT57U2VhcmNoU3VmZml4fSA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+eydDdXN0b21lckNvbXBhbnlTZWFyY2hTdWZmaXgnfTsKICAgIGlmICggIWRlZmluZWQoICRTZWxmLT57U2VhcmNoU3VmZml4fSApICkgewogICAgICAgICRTZWxmLT57U2VhcmNoU3VmZml4fSA9ICcqJzsKICAgIH0KCiAgICAjIGNyZWF0ZSBjYWNoZSBvYmplY3QsIGJ1dCBvbmx5IGlmIENhY2hlVFRMIGlzIHNldCBpbiBjdXN0b21lciBjb25maWcKICAgIGlmICggJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q2FjaGVUVEx9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgJFNlbGYtPntDYWNoZVR5cGV9ICAgPSAnQ3VzdG9tZXJDb21wYW55JyAuICRQYXJhbXtDb3VudH07CiAgICAgICAgJFNlbGYtPntDYWNoZVRUTH0gICAgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDYWNoZVRUTH0gfHwgMDsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgZGIgY29ubmVjdCBpZiBEU04gaXMgZ2l2ZW4KICAgIGlmICggJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57UGFyYW1zfS0+e0RTTn0gKSB7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICAgICAgRGF0YWJhc2VEU04gICAgICAgICAgICAgPT4gJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57UGFyYW1zfS0+e0RTTn0sCiAgICAgICAgICAgIEF0dHJpYnV0ZSAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntBdHRyaWJ1dGV9LAogICAgICAgICAgICBEYXRhYmFzZVVzZXIgICAgICAgICAgICA9PiAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntQYXJhbXN9LT57VXNlcn0sCiAgICAgICAgICAgIERhdGFiYXNlUHcgICAgICAgICAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntQYXNzd29yZH0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntUeXBlfSB8fCAnJywKICAgICAgICAgICAgRGlzY29ubmVjdE9uRGVzdHJ1Y3Rpb24gPT4gMSwKICAgICAgICApIHx8IGRpZSgnQ2FuXCd0IGNvbm5lY3QgdG8gZGF0YWJhc2UhJyk7CgogICAgICAgICMgcmVtZW1iZXIgdGhhdCB3ZSBoYXZlIHRoZSBEQk9iamVjdCBub3QgZnJvbSBwYXJlbnQgY2FsbAogICAgICAgICRTZWxmLT57Tm90UGFyZW50REJPYmplY3R9ID0gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57REJPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICB9CgogICAgIyB0aGlzIHNldHRpbmcgc3BlY2lmaWVzIGlmIHRoZSB0YWJsZSBoYXMgdGhlIGNyZWF0ZV90aW1lLAogICAgIyBjcmVhdGVfYnksIGNoYW5nZV90aW1lIGFuZCBjaGFuZ2VfYnkgZmllbGRzIG9mIE9UT0JPCiAgICAkU2VsZi0+e0ZvcmVpZ25EQn0gPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntQYXJhbXN9LT57Rm9yZWlnbkRCfSA/IDEgOiAwOwoKICAgICMgZGVmaW5lcyBpZiB0aGUgZGF0YWJhc2Ugc2VhcmNoIHdpbGwgYmUgcGVyZm9ybWVuZCBjYXNlIHNlbnNpdGl2ZSAoMSkgb3Igbm90ICgwKQogICAgJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntTZWFyY2hDYXNlU2Vuc2l0aXZlfQogICAgICAgIC8vICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntDYXNlU2Vuc2l0aXZlfSB8fCAwOwoKICAgICMgZmV0Y2ggbmFtZXMgb2YgY29uZmlndXJlZCBkeW5hbWljIGZpZWxkcwogICAgbXkgQER5bmFtaWNGaWVsZE1hcEVudHJpZXMgPSBncmVwIHsgJF8tPls1XSBlcSAnZHluYW1pY19maWVsZCcgfSBAeyAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9IH07CiAgICAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30gPSB7IG1hcCB7ICRfLT5bMl0gPT4gMSB9IEBEeW5hbWljRmllbGRNYXBFbnRyaWVzIH07CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgbXkgJExheW91dFBhcmFtID0gJEtlcm5lbDo6T00tPntQYXJhbX0tPnsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCd9OwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBDaGVjayBpZiBtdWx0aXRlbmFuY3kgaXMgZW5hYmxlZCBhbmQgdGhlIHJlcXVlc3QgaXMgY29taW5nIGZyb20gYSB1c2VyLgogICAgaWYgKCAkTGF5b3V0UGFyYW0tPntVc2VyVHlwZX0gJiYgJExheW91dFBhcmFtLT57VXNlclR5cGV9IGVxICdVc2VyJyAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeScpICkgewoKICAgICAgICAjIFNhdmUgdGhlIFVzZXJJRCBhbmQgYWxsIGdyb3VwcyB0aGUgdXNlciBoYXMgJ3JvJyBwZXJtaXNzaW9uIG9uLgogICAgICAgIGlmICggJExheW91dFBhcmFtLT57VXNlcklEfSApIHsKICAgICAgICAgICAgIyBPbmx5IGdldCB0aGUgZ3JvdXAgbGlzdCBvbmNlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgogICAgICAgICAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgVGhlIGxpbWl0IGRvZXMgbm90IGNvdW50IGZvciBtZW1iZXJzIG9mIGEgc3BlY2lmaWMgZ3JvdXAuCiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uR3JvdXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeTo6UGVybWlzc2lvbkdyb3VwJykgfHwgJyc7CiAgICAgICAgICAgIG15ICVHcm91cHNSZXZlcnNlICAgPSByZXZlcnNlICVHcm91cHM7CgogICAgICAgICAgICBpZiAoICEkR3JvdXBzUmV2ZXJzZXskUGVybWlzc2lvbkdyb3VwfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TXVsdGl0ZW5hbmN5fSA9ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cElEc30gPSBbIHNvcnQga2V5cyAlR3JvdXBzIF07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cHN9ICAgPSBbIHZhbHVlcyAlR3JvdXBzIF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBDdXN0b21lckNvbXBhbnlMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIG15ICRWYWxpZCA9IDE7CiAgICBpZiAoICEkUGFyYW17VmFsaWR9ICYmIGRlZmluZWQoICRQYXJhbXtWYWxpZH0gKSApIHsKICAgICAgICAkVmFsaWQgPSAwOwogICAgfQoKICAgIG15ICRMaW1pdCA9ICRQYXJhbXtMaW1pdH0gLy8gJFNlbGYtPntTZWFyY2hMaXN0TGltaXR9OwoKICAgIG15ICRDYWNoZVR5cGU7CiAgICBteSAkQ2FjaGVLZXk7CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKCiAgICAgICAgJENhY2hlVHlwZSA9ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJDb21wYW55TGlzdCc7CiAgICAgICAgJENhY2hlS2V5ICA9ICJDdXN0b21lckNvbXBhbnlMaXN0Ojoke1ZhbGlkfTo6JHtMaW1pdH06OiIgLiAoICRQYXJhbXtTZWFyY2h9IHx8ICcnICk7CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBVc2UgY2FjaGUgZm9yIG11bHRpdGVuYW5jeS4KICAgICAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICAgICAgJENhY2hlS2V5IC49IGpvaW4gJycsIG1hcCB7ICc6Okdyb3VwSUQ9JyAuICRfIH0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH07CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICV7JERhdGF9IGlmIHJlZiAkRGF0YSBlcSAnSEFTSCc7CiAgICB9CgogICAgbXkgJEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHMgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzfTsKICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkcykgKSB7CiAgICAgICAgJEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHMgPSBbICdjdXN0b21lcl9pZCcsICduYW1lJywgXTsKICAgIH0KCiAgICAjIHJlbW92ZSBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkcwogICAgIyBhcyB0aGV5IGNhbm5vdCBiZSBoYW5kbGVkIGhlcmUKICAgIG15IEBDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzfTsKCiAgICAjIHdoYXQgaXMgdGhlIHJlc3VsdAogICAgbXkgJFdoYXQgPSBqb2luKAogICAgICAgICcsICcsCiAgICAgICAgQEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkcwogICAgKTsKCiAgICAjIGFkZCB2YWxpZCBvcHRpb24gaWYgcmVxdWlyZWQKICAgIG15ICRTUUw7CiAgICBteSBAQmluZDsKICAgIG15IEBDb25kaXRpb25zOwoKICAgIGlmICggJFZhbGlkICYmICRTZWxmLT57Q3VzdG9tZXJDb21wYW55VmFsaWR9ICkgewoKICAgICAgICAjIGdldCB2YWxpZCBvYmplY3QKICAgICAgICBteSAkVmFsaWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKCiAgICAgICAgcHVzaCBAQ29uZGl0aW9ucywgIiRTZWxmLT57Q3VzdG9tZXJDb21wYW55VmFsaWR9IElOICggJHtcKGpvaW4gJywgJywgJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpKX0gKSI7CiAgICB9CgogICAgIyB3aGVyZQogICAgaWYgKCAkUGFyYW17U2VhcmNofSApIHsKCiAgICAgICAgIyByZW1vdmUgZHluYW1pYyBmaWVsZCBuYW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIEN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcwogICAgICAgICMgYXMgdGhleSBjYW5ub3QgYmUgcmV0cmlldmVkIGhlcmUKICAgICAgICBteSBAQ3VzdG9tZXJDb21wYW55U2VhcmNoRmllbGRzID0gZ3JlcCB7ICFleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0KICAgICAgICAgICAgQHsgJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q3VzdG9tZXJDb21wYW55U2VhcmNoRmllbGRzfSB9OwoKICAgICAgICBteSAlUXVlcnlDb25kaXRpb24gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVlcnlDb25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gXEBDdXN0b21lckNvbXBhbnlTZWFyY2hGaWVsZHMsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIFNlYXJjaFByZWZpeCAgPT4gJFNlbGYtPntTZWFyY2hQcmVmaXh9LAogICAgICAgICAgICBTZWFyY2hTdWZmaXggID0+ICRTZWxmLT57U2VhcmNoU3VmZml4fSwKICAgICAgICAgICAgQ2FzZVNlbnNpdGl2ZSA9PiAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9LAogICAgICAgICAgICBCaW5kTW9kZSAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkUXVlcnlDb25kaXRpb257U1FMfSApIHsKICAgICAgICAgICAgcHVzaCBAQ29uZGl0aW9ucywgIiAkUXVlcnlDb25kaXRpb257U1FMfSI7CiAgICAgICAgICAgIHB1c2ggQEJpbmQsICAgICAgIEB7ICRRdWVyeUNvbmRpdGlvbntWYWx1ZXN9IH07CiAgICAgICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICAgICAjIERvbid0IHNlYXJjaCBmb3IgY3VzdG9tZXIgd2l0aG91dCBncm91cCBwZXJtaXNzaW9uLgogICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgICAgICAjIEdldCB0aGUgY29sdW1uIG5hbWUgd2hlcmUgdGhlIGdyb3VwIElEIGlzIHN0b3JlZC4KICAgICAgICAgICAgbXkgJEdyb3VwSURDb2w7CiAgICAgICAgICAgIGZvciBteSAkTWFwICggQHsgJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57TWFwfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkTWFwLT5bMF0gZXEgJ1VzZXJHcm91cElEJyApIHsKICAgICAgICAgICAgICAgICAgICAkR3JvdXBJRENvbCA9ICRNYXAtPlsyXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRHcm91cElEQ29sKSB7CiAgICAgICAgICAgICAgICBteSBAVXNlckdyb3VwSURzID0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH07ICAjIE5vdCBzYXZpbmcgdGhpcyBpbiBhbiBhcnJheSBjYW4gY2F1c2UgYW4gdW5rb3duIGVycm9yIGluIGEgbGF0ZXIgaXRlcmF0aW9uLgogICAgICAgICAgICAgICAgbXkgJFVzZXJHcm91cElEU3luYyA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1VzZXJHcm91cElEU3luY307CiAgICAgICAgICAgICAgICBpZiAoICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgZ3JvdXAgSURzIG9yIG5hbWVzIHNob3VsZCBiZSBjaGVja2VkLgogICAgICAgICAgICAgICAgICAgIGlmICggJFVzZXJHcm91cElEU3luYy0+e1VzZUdyb3VwTmFtZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJHcm91cElEICggQFVzZXJHcm91cElEcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRHcm91cE5hbWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkVXNlckdyb3VwSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVzZXJHcm91cElEID0gJEdyb3VwTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFJlcGxhY2UgdGhlIGxvY2FsIGdyb3VwIHdpdGggdGhlIGFzc29jaWF0ZWQgcmVtb3RlIGdyb3VwLgogICAgICAgICAgICAgICAgZm9yIG15ICRSZW1vdGVHcm91cCAoIGtleXMgJXsgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRMb2NhbEdyb3VwID0gJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfXskUmVtb3RlR3JvdXB9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJHcm91cElEICggQFVzZXJHcm91cElEcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkVXNlckdyb3VwSUQgZXEgJExvY2FsR3JvdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVXNlckdyb3VwSUQgPSAkUmVtb3RlR3JvdXA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEluQ29uZGl0aW9uID0gJFNlbGYtPntEQk9iamVjdH0tPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEdyb3VwSURDb2wsCiAgICAgICAgICAgICAgICAgICAgVmFsdWVzICAgPT4gXEBVc2VyR3JvdXBJRHMsCiAgICAgICAgICAgICAgICAgICAgQmluZE1vZGUgPT4gMCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJEluQ29uZGl0aW9uIC49ICIgT1IgKCRHcm91cElEQ29sIElTIE5VTEwgT1IgJEdyb3VwSURDb2wgPSAnJykiOwogICAgICAgICAgICAgICAgcHVzaCBAQ29uZGl0aW9ucywgIiAoJEluQ29uZGl0aW9uKSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgIH0KCiAgICAjIGR5bmFtaWMgZmllbGQgaGFuZGxpbmcKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3MgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJDb21wYW55JywKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICApOwogICAgbXkgJUR5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWUgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc307CgogICAgbXkgQEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHNEeW5hbWljRmllbGRzID0gZ3JlcCB7IGV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzfTsKCiAgICAjIHNxbAogICAgbXkgJENvbXBsZXRlU1FMID0gIlNFTEVDVCAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueUtleX0sICRXaGF0IEZST00gJFNlbGYtPntDdXN0b21lckNvbXBhbnlUYWJsZX0iOwoKICAgIGlmIChAQ29uZGl0aW9ucykgewogICAgICAgICRTUUwgPSBqb2luKCAnIEFORCAnLCBAQ29uZGl0aW9ucyApOwogICAgICAgICRDb21wbGV0ZVNRTCAuPSAiIFdIRVJFICRTUUwiOwogICAgfQoKICAgICMgZ2V0IGRhdGEgZnJvbSBjdXN0b21lciBjb21wYW55IHRhYmxlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkQ29tcGxldGVTUUwsCiAgICAgICAgQmluZCAgPT4gXEBCaW5kLAogICAgICAgIExpbWl0ID0+ICRMaW1pdCwKICAgICk7CgogICAgbXkgQEN1c3RvbWVyQ29tcGFueURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQEN1c3RvbWVyQ29tcGFueURhdGEsIFtAUm93XTsKICAgIH0KCiAgICBteSAlTGlzdDsKCiAgICBDVVNUT01FUkNPTVBBTllEQVRBOgogICAgZm9yIG15ICRDdXN0b21lckNvbXBhbnlEYXRhIChAQ3VzdG9tZXJDb21wYW55RGF0YSkgewogICAgICAgIG15ICRDdXN0b21lckNvbXBhbnlJRCA9IHNoaWZ0IEB7JEN1c3RvbWVyQ29tcGFueURhdGF9OwogICAgICAgIG5leHQgQ1VTVE9NRVJDT01QQU5ZREFUQSBpZiAkTGlzdHskQ3VzdG9tZXJDb21wYW55SUR9OwoKICAgICAgICBteSAlQ29tcGFueVN0cmluZ1BhcnRzOwoKICAgICAgICBteSAkRmllbGRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJEZpZWxkICggQHskQ3VzdG9tZXJDb21wYW55RGF0YX0gKSB7CiAgICAgICAgICAgICRDb21wYW55U3RyaW5nUGFydHN7ICRDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHNbJEZpZWxkQ291bnRlcl0gfSA9ICRGaWVsZDsKICAgICAgICAgICAgJEZpZWxkQ291bnRlcisrOwogICAgICAgIH0KCiAgICAgICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIHZhbHVlcywgaWYgY29uZmlndXJlZAogICAgICAgIGlmIChAQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkc0R5bmFtaWNGaWVsZHMpIHsKICAgICAgICAgICAgRFlOQU1JQ0ZJRUxETkFNRToKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGROYW1lIChAQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkc0R5bmFtaWNGaWVsZHMpIHsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxETkFNRSBpZiAhZXhpc3RzICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfTsKCiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lICAgICAgICAgPT4gJEN1c3RvbWVyQ29tcGFueUlELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRE5BTUUgaWYgIWRlZmluZWQgJFZhbHVlOwoKICAgICAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkVmFsdWUpICkgewogICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9IFskVmFsdWVdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15IEBWYWx1ZXM7CgogICAgICAgICAgICAgICAgVkFMVUU6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRWYWx1ZSAoIEB7JFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IFZBTFVFIGlmICFkZWZpbmVkICRDdXJyZW50VmFsdWUgfHwgIWxlbmd0aCAkQ3VycmVudFZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBteSAkUmVhZGFibGVWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5SZWFkYWJsZVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JER5bmFtaWNGaWVsZE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEN1cnJlbnRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBuZXh0IFZBTFVFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkUmVhZGFibGVWYWx1ZSkgfHwgIWRlZmluZWQgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX07CgogICAgICAgICAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRHluYW1pY0ZpZWxkTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRQb3NzaWJsZVZhbHVlcy0+eyAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9ID0gJFBvc3NpYmxlVmFsdWVzLT57ICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9IH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQFZhbHVlcywgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJENvbXBhbnlTdHJpbmdQYXJ0c3skRHluYW1pY0ZpZWxkTmFtZX0gPSBqb2luICcgJywgQFZhbHVlczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhc3NlbWJsZSBjb21wYW55IHN0cmluZwogICAgICAgIG15IEBDb21wYW55U3RyaW5nUGFydHM7CiAgICAgICAgQ1VTVE9NRVJDT01QQU5ZTElTVEZJRUxEOgogICAgICAgIGZvciBteSAkQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkICggQHskQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkc30gKSB7CiAgICAgICAgICAgIG5leHQgQ1VTVE9NRVJDT01QQU5ZTElTVEZJRUxECiAgICAgICAgICAgICAgICBpZiAhZXhpc3RzICRDb21wYW55U3RyaW5nUGFydHN7JEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZH0KICAgICAgICAgICAgICAgIHx8ICFkZWZpbmVkICRDb21wYW55U3RyaW5nUGFydHN7JEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZH0KICAgICAgICAgICAgICAgIHx8ICFsZW5ndGggJENvbXBhbnlTdHJpbmdQYXJ0c3skQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkfTsKICAgICAgICAgICAgcHVzaCBAQ29tcGFueVN0cmluZ1BhcnRzLCAkQ29tcGFueVN0cmluZ1BhcnRzeyRDdXN0b21lckNvbXBhbnlMaXN0RmllbGR9OwogICAgICAgIH0KCiAgICAgICAgJExpc3R7JEN1c3RvbWVyQ29tcGFueUlEfSA9IGpvaW4gJyAnLCBAQ29tcGFueVN0cmluZ1BhcnRzOwogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkQ2FjaGVUeXBlLAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFwlTGlzdCwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJUxpc3Q7Cn0KCnN1YiBDdXN0b21lckNvbXBhbnlTZWFyY2hEZXRhaWwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoIHJlZiAkUGFyYW17U2VhcmNoRmllbGRzfSBuZSAnQVJSQVknICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VhcmNoRmllbGRzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFZhbGlkID0gZGVmaW5lZCAkUGFyYW17VmFsaWR9ID8gJFBhcmFte1ZhbGlkfSA6IDE7CgogICAgJFBhcmFte0xpbWl0fSAvLz0gJyc7CgogICAgIyBTcGxpdCB0aGUgc2VhcmNoIGZpZWxkcyBpbiBzY2FsYXIgYW5kIGFycmF5IGZpZWxkcy4KICAgIG15IEBTY2FsYXJTZWFyY2hGaWVsZHMgPSBncmVwIHsgJ0lucHV0JyBlcSAkXy0+e1R5cGV9IH0gQHsgJFBhcmFte1NlYXJjaEZpZWxkc30gfTsKICAgIG15IEBBcnJheVNlYXJjaEZpZWxkcyAgPSBncmVwIHsgJ1NlbGVjdGlvbicgZXEgJF8tPntUeXBlfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CgogICAgIyBWZXJpZnkgdGhhdCBhbGwgcGFzc2VkIGFycmF5IHBhcmFtZXRlcnMgY29udGFpbiBhbiBhcnJheXJlZi4KICAgIEFSR1VNRU5UOgogICAgZm9yIG15ICRBcmd1bWVudCAoQEFycmF5U2VhcmNoRmllbGRzKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17ICRBcmd1bWVudC0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXsgJEFyZ3VtZW50LT57TmFtZX0gfSB8fD0gW107CgogICAgICAgICAgICBuZXh0IEFSR1VNRU5UOwogICAgICAgIH0KCiAgICAgICAgaWYgKCByZWYgJFBhcmFteyAkQXJndW1lbnQtPntOYW1lfSB9IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkQXJndW1lbnQtPntOYW1lfSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgU2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlLgogICAgbXkgJFJlc3VsdCA9ICRQYXJhbXtSZXN1bHR9IHx8ICdBUlJBWSc7CgogICAgIyBTcGVjaWFsIGhhbmRsaW5nIGlmIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CgogICAgICAgICMgSWdub3JlIHRoZSBwYXJhbWV0ZXIgJ0xpbWl0JyB3aGVuIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcuCiAgICAgICAgJFBhcmFte0xpbWl0fSA9ICcnOwoKICAgICAgICAjIERlbGV0ZSB0aGUgT3JkZXJCeSBwYXJhbWV0ZXIgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgICAgICAkUGFyYW17T3JkZXJCeX0gPSBbXTsKICAgIH0KCiAgICAjIERlZmluZSBvcmRlciB0YWJsZSBmcm9tIHRoZSBzZWFyY2ggZmllbGRzLgogICAgbXkgJU9yZGVyQnlUYWJsZSA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8tPntEYXRhYmFzZUZpZWxkfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CgogICAgZm9yIG15ICRGaWVsZCAoQEFycmF5U2VhcmNoRmllbGRzKSB7CgogICAgICAgIG15ICRTZWxlY3Rpb25zRGF0YSA9ICRGaWVsZC0+e1NlbGVjdGlvbnNEYXRhfTsKCiAgICAgICAgZm9yIG15ICRTZWxlY3RlZFZhbHVlICggQHsgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9IH0gKSB7CgogICAgICAgICAgICAjIENoZWNrIGlmIHRoZSBzZWxlY3RlZCB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgZmllbGQgaXMgdmFsaWQuCiAgICAgICAgICAgIGlmICggISRTZWxlY3Rpb25zRGF0YS0+eyRTZWxlY3RlZFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBzZWxlY3RlZCB2YWx1ZSAkRmllbGQtPntOYW1lfSBpcyBub3QgdmFsaWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJFNlbGYtPntEQk9iamVjdH07CgogICAgIyBBc3NlbWJsZSB0aGUgY29uZGl0aW9ucyB1c2VkIGluIHRoZSBXSEVSRSBjbGF1c2UuCiAgICBteSBAU1FMV2hlcmU7CgogICAgZm9yIG15ICRGaWVsZCAoQFNjYWxhclNlYXJjaEZpZWxkcykgewoKICAgICAgICAjIFNlYXJjaCBmb3Igc2NhbGFyIGZpZWxkcyAod2lsZGNhcmRzIGFyZSBhbGxvd2VkKS4KICAgICAgICBpZiAoICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSApIHsKCiAgICAgICAgICAgICMgR2V0IGxpa2UgZXNjYXBlIHN0cmluZyBuZWVkZWQgZm9yIHNvbWUgZGF0YWJhc2VzIChlLmcuIG9yYWNsZSkuCiAgICAgICAgICAgIG15ICRMaWtlRXNjYXBlU3RyaW5nID0gJERCT2JqZWN0LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdMaWtlRXNjYXBlU3RyaW5nJyk7CgogICAgICAgICAgICAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gPSAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0sICdMaWtlJyApOwoKICAgICAgICAgICAgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ID1+IHN7IFwqKyB9eyV9eG1zZzsKCiAgICAgICAgICAgICMgSWYgdGhlIGZpZWxkIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmx5ICclJy4KICAgICAgICAgICAgaWYgKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gIX4gbXsgXEEgJSogXHogfXhtcyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFNRTFdoZXJlLAogICAgICAgICAgICAgICAgICAgICJMT1dFUigkRmllbGQtPntEYXRhYmFzZUZpZWxkfSkgTElLRSBMT1dFUignJFBhcmFteyAkRmllbGQtPntOYW1lfSB9JykgJExpa2VFc2NhcGVTdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZHluYW1pYyBmaWVsZCBoYW5kbGluZwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgKTsKCiAgICBteSAkU1FMRHluYW1pY0ZpZWxkRnJvbSAgICAgPSAnJzsKICAgIG15ICRTUUxEeW5hbWljRmllbGRXaGVyZSAgICA9ICcnOwogICAgbXkgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyID0gMTsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JER5bmFtaWNGaWVsZENvbmZpZ3N9ICkgewoKICAgICAgICBteSAkU2VhcmNoUGFyYW0gPSAkUGFyYW17ICJEeW5hbWljRmllbGRfIiAuICREeW5hbWljRmllbGQtPntOYW1lfSB9OwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoICEkU2VhcmNoUGFyYW0gKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoIHJlZiAkU2VhcmNoUGFyYW0gbmUgJ0hBU0gnICk7CgogICAgICAgIG15ICROZWVkSm9pbjsKCiAgICAgICAgZm9yIG15ICRPcGVyYXRvciAoIHNvcnQga2V5cyAleyRTZWFyY2hQYXJhbX0gKSB7CgogICAgICAgICAgICBteSBAU2VhcmNoUGFyYW1zID0gKCByZWYgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSBlcSAnQVJSQVknICkKICAgICAgICAgICAgICAgID8gQHsgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSB9CiAgICAgICAgICAgICAgICA6ICggJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSApOwoKICAgICAgICAgICAgbXkgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyc7CiAgICAgICAgICAgIGlmICgkU1FMRHluYW1pY0ZpZWxkV2hlcmUpIHsKICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiA9ICcgQU5EICgnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyAoJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICBURVhUOgogICAgICAgICAgICBmb3IgbXkgJFRleHQgKEBTZWFyY2hQYXJhbXMpIHsKICAgICAgICAgICAgICAgIG5leHQgVEVYVCBpZiAoICFkZWZpbmVkICRUZXh0IHx8ICRUZXh0IGVxICcnICk7CgogICAgICAgICAgICAgICAgJFRleHQgPX4gcy9cKi8lL2dpOwoKICAgICAgICAgICAgICAgICMgQ2hlY2sgc2VhcmNoIGF0dHJpYnV0ZSwgd2UgZG8gbm90IG5lZWQgdG8gc2VhcmNoIGZvciAnKicuCiAgICAgICAgICAgICAgICBuZXh0IFRFWFQgaWYgJFRleHQgPX4gL15cJXsxLDN9JC87CgogICAgICAgICAgICAgICAgbXkgJFZhbGlkYXRlU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0gfHwgMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkVmFsaWRhdGVTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VhcmNoIG5vdCBleGVjdXRlZCBkdWUgdG8gaW52YWxpZCB2YWx1ZSAnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkVGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJyBvbiBmaWVsZCAnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkRHluYW1pY0ZpZWxkLT57TmFtZX0gLiAiJyEiLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgLj0gJyBPUiAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViIC49ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5TZWFyY2hTUUxHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVGFibGVBbGlhcyAgICAgICAgID0+ICJkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIiLAogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yICAgICAgICAgICA9PiAkT3BlcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgU2VhcmNoVGVybSAgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiAuPSAnKSAnOwoKICAgICAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmUgLj0gJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViOwogICAgICAgICAgICAgICAgJE5lZWRKb2luID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCROZWVkSm9pbikgewogICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkRnJvbSAuPSAiCiAgICAgICAgICAgICAgICBJTk5FUiBKT0lOIGR5bmFtaWNfZmllbGRfdmFsdWUgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyCiAgICAgICAgICAgICAgICAgICAgT04gKGRmX29ial9pZF9uYW1lLm9iamVjdF9pZCA9IGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5vYmplY3RfaWQKICAgICAgICAgICAgICAgICAgICAgICAgQU5EIGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5maWVsZF9pZCA9ICIKICAgICAgICAgICAgICAgIC4gJERCT2JqZWN0LT5RdW90ZSggJER5bmFtaWNGaWVsZC0+e0lEfSwgJ0ludGVnZXInICkgLiAiKQogICAgICAgICAgICAiOwoKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgRXhlY3V0ZSBhIGR5bmFtaWMgZmllbGQgc2VhcmNoLCBpZiBhIGR5bmFtaWMgZmllbGQgd2hlcmUgc3RhdGVtZW50IGV4aXN0cy4KICAgIGlmICggJFNRTER5bmFtaWNGaWVsZEZyb20gJiYgJFNRTER5bmFtaWNGaWVsZFdoZXJlICkgewoKICAgICAgICBteSBARHluYW1pY0ZpZWxkQ3VzdG9tZXJJRHM7CgogICAgICAgICMgU3FsIHVlcnkgZm9yIHRoZSBkeW5hbWljIGZpZWxkcy4KICAgICAgICBteSAkU1FMRHluYW1pY0ZpZWxkID0gIlNFTEVDVCBESVNUSU5DVChkZl9vYmpfaWRfbmFtZS5vYmplY3RfbmFtZSkgRlJPTSBkeW5hbWljX2ZpZWxkX29ial9pZF9uYW1lIGRmX29ial9pZF9uYW1lICIKICAgICAgICAgICAgLiAkU1FMRHluYW1pY0ZpZWxkRnJvbQogICAgICAgICAgICAuICIgV0hFUkUgIgogICAgICAgICAgICAuICRTUUxEeW5hbWljRmllbGRXaGVyZTsKCiAgICAgICAgbXkgJFVzZWRDYWNoZTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsRHluYW1pY0ZpZWxkcycsCiAgICAgICAgICAgICAgICBLZXkgID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoIGRlZmluZWQgJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSApIHsKICAgICAgICAgICAgICAgIGlmICggcmVmICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkQ3VzdG9tZXJJRHMgPSBAeyREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGF9OwoKICAgICAgICAgICAgICAgICAgICAjIFNldCB0aGUgdXNlZCBjYWNoZSBmbGFnLgogICAgICAgICAgICAgICAgICAgICRVc2VkQ2FjaGUgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIHJlZiAnIC4gcmVmKCREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEpIC4gJyEnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgR2V0IHRoZSBkYXRhIG9ubHkgZnJvbSBkYXRhYmFzZSwgaWYgbm8gY2FjaGUgZW50cnkgZXhpc3RzLgogICAgICAgIGlmICggISRVc2VkQ2FjaGUgKSB7CgogICAgICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCA9PiAkU1FMRHluYW1pY0ZpZWxkLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRDdXN0b21lcklEcywgJFJvd1swXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbER5bmFtaWNGaWVsZHMnLAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gXEBEeW5hbWljRmllbGRDdXN0b21lcklEcywKICAgICAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEFkZCB0aGUgdXNlciBsb2dpbnMgZnJvbSB0aGUgZHluYW1pYyBmaWVsZHMsIGlmIGEgc2VhcmNoIHJlc3VsdCBleGlzdHMgZnJvbSB0aGUgZHluYW1pYyBmaWVsZCBzZWFyY2gKICAgICAgICAjICAgb3Igc2tpcCB0aGUgc2VhcmNoIGFuZCByZXR1cm4gYSBlbXB0cnkgYXJyYXkgcmVmIChvciB6ZXJvIGZvciB0aGUgcmVzdWx0ICdDT1VOVCcsIGlmIG5vIHVzZXIgbG9naW5zIGV4aXN0cwogICAgICAgICMgICBmcm9tIHRoZSBkeW5hbWljIGZpZWxkIHNlYXJjaC4KICAgICAgICBpZiAoQER5bmFtaWNGaWVsZEN1c3RvbWVySURzKSB7CgogICAgICAgICAgICBteSAkU1FMUXVlcnlJbkNvbmRpdGlvbiA9ICREQk9iamVjdC0+UXVlcnlJbkNvbmRpdGlvbigKICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55S2V5fSwKICAgICAgICAgICAgICAgIFZhbHVlcyAgID0+IFxARHluYW1pY0ZpZWxkQ3VzdG9tZXJJRHMsCiAgICAgICAgICAgICAgICBCaW5kTW9kZSA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsICRTUUxRdWVyeUluQ29uZGl0aW9uOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRSZXN1bHQgZXEgJ0NPVU5UJyA/IDAgOiBbXTsKICAgICAgICB9CiAgICB9CgogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkIChAQXJyYXlTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgbmV4dCBGSUVMRCBpZiAhQHsgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9IH07CgogICAgICAgIG15ICRTUUxRdWVyeUluQ29uZGl0aW9uID0gJERCT2JqZWN0LT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICA9PiAkRmllbGQtPntEYXRhYmFzZUZpZWxkfSwKICAgICAgICAgICAgVmFsdWVzICAgPT4gJFBhcmFteyAkRmllbGQtPntOYW1lfSB9LAogICAgICAgICAgICBCaW5kTW9kZSA9PiAwLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAkU1FMUXVlcnlJbkNvbmRpdGlvbjsKICAgIH0KCiAgICAjIEFkZCB0aGUgdmFsaWQgb3B0aW9uIGlmIG5lZWRlZC4KICAgIGlmICggJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q3VzdG9tZXJWYWxpZH0gJiYgJFZhbGlkICkgewoKICAgICAgICBteSAkVmFsaWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsCiAgICAgICAgICAgICIkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDdXN0b21lclZhbGlkfSBJTiAoIiAuIGpvaW4oICcsICcsICRWYWxpZE9iamVjdC0+VmFsaWRJRHNHZXQoKSApIC4gIikgIjsKICAgIH0KCiAgICAjIENoZWNrIGlmIE9yZGVyQnkgY29udGFpbnMgb25seSB1bmlxdWUgdmFsaWQgdmFsdWVzLgogICAgbXkgJU9yZGVyQnlTZWVuOwogICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CgogICAgICAgIGlmICggISRPcmRlckJ5IHx8ICRPcmRlckJ5U2VlbnskT3JkZXJCeX0gKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiT3JkZXJCeSBjb250YWlucyBpbnZhbGlkIHZhbHVlICckT3JkZXJCeScgIgogICAgICAgICAgICAgICAgICAgIC4gJ29yIHRoZSB2YWx1ZSBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgUmVtZW1iZXIgdGhlIHZhbHVlIHRvIGNoZWNrIGlmIGl0IGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UuCiAgICAgICAgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSA9IDE7CiAgICB9CgogICAgIyBDaGVjayBpZiBPcmRlckJ5RGlyZWN0aW9uIGFycmF5IGNvbnRhaW5zIG9ubHkgJ1VwJyBvciAnRG93bicuCiAgICBESVJFQ1RJT046CiAgICBmb3IgbXkgJERpcmVjdGlvbiAoIEB7ICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAjIE9ubHkgJ1VwJyBvciAnRG93bicgYWxsb3dlZC4KICAgICAgICBuZXh0IERJUkVDVElPTiBpZiAkRGlyZWN0aW9uIGVxICdVcCc7CiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnRG93bic7CgogICAgICAgICMgZm91bmQgYW4gZXJyb3IKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnlEaXJlY3Rpb24gY2FuIG9ubHkgY29udGFpbiAnVXAnIG9yICdEb3duJyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgQnVpbGQgdGhlIHNxbCBzdGF0ZW1lbnQgZm9yIHRoZSBzZWFyY2guCiAgICBteSAkU1FMID0gIlNFTEVDVCBESVNUSU5DVCgkU2VsZi0+e0N1c3RvbWVyQ29tcGFueUtleX0pIjsKCiAgICAjIE1vZGlmeSBTUUwgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewogICAgICAgICRTUUwgPSAiU0VMRUNUIENPVU5UKERJU1RJTkNUKCRTZWxmLT57Q3VzdG9tZXJDb21wYW55S2V5fSkpIjsKICAgIH0KCiAgICBteSBAU1FMT3JkZXJCeTsKCiAgICAjIFRoZSBPcmRlciBieSBjbGF1c2UgaXMgbm90IG5lZWRlZCBmb3IgdGhlIHJlc3VsdCB0eXBlICdDT1VOVCcuCiAgICBpZiAoICRSZXN1bHQgbmUgJ0NPVU5UJyApIHsKCiAgICAgICAgbXkgJENvdW50ID0gMDsKCiAgICAgICAgT1JERVJCWToKICAgICAgICBmb3IgbXkgJE9yZGVyQnkgKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApIHsKCiAgICAgICAgICAgICMgU2V0IHRoZSBkZWZhdWx0IG9yZGVyIGRpcmVjdGlvbi4KICAgICAgICAgICAgbXkgJERpcmVjdGlvbiA9ICdERVNDJzsKCiAgICAgICAgICAgICMgQWRkIHRoZSBnaXZlbiBvcmRlciBkaXJlY3Rpb24uCiAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSApIHsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnVXAnICkgewogICAgICAgICAgICAgICAgICAgICREaXJlY3Rpb24gPSAnQVNDJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnRG93bicgKSB7CiAgICAgICAgICAgICAgICAgICAgJERpcmVjdGlvbiA9ICdERVNDJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJENvdW50Kys7CgogICAgICAgICAgICBuZXh0IE9SREVSQlkgaWYgISRPcmRlckJ5VGFibGV7JE9yZGVyQnl9OwoKICAgICAgICAgICAgcHVzaCBAU1FMT3JkZXJCeSwgIiRPcmRlckJ5VGFibGV7JE9yZGVyQnl9ICREaXJlY3Rpb24iOwoKICAgICAgICAgICAgbmV4dCBPUkRFUkJZIGlmICRPcmRlckJ5IGVxICdDdXN0b21lcklEJzsKCiAgICAgICAgICAgICRTUUwgLj0gIiwgJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0iOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIG9yZGVyaW5nIGlzIG5vdCBkZXRlcm1pbmVkCiAgICAgICAgIyAgIHdlIGFkZCBhbiBkZXNjZW5kaW5nIG9yZGVyaW5nIGJ5IGlkLgogICAgICAgIGlmICggIWdyZXAgeyAkXyBlcSAnQ3VzdG9tZXJJRCcgfSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgKSB7CiAgICAgICAgICAgIHB1c2ggQFNRTE9yZGVyQnksICIkU2VsZi0+e0N1c3RvbWVyQ29tcGFueUtleX0gREVTQyI7CiAgICAgICAgfQogICAgfQoKICAgICMgQWRkIGZvcm0gdG8gdGhlIFNRTCBhZnRlciB0aGUgb3JkZXIgYnkgY3JlYXRpb24uCiAgICAkU1FMIC49ICIgRlJPTSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueVRhYmxlfSAiOwoKICAgIGlmIChAU1FMV2hlcmUpIHsKICAgICAgICBteSAkU1FMV2hlcmVTdHJpbmcgPSBqb2luICcgQU5EICcsIG1hcCB7IiggJF8gKSJ9IEBTUUxXaGVyZTsKICAgICAgICAkU1FMIC49ICJXSEVSRSAkU1FMV2hlcmVTdHJpbmcgIjsKICAgIH0KCiAgICBpZiAoQFNRTE9yZGVyQnkpIHsKICAgICAgICBteSAkT3JkZXJCeVN0cmluZyA9IGpvaW4gJywgJywgQFNRTE9yZGVyQnk7CiAgICAgICAgJFNRTCAuPSAiT1JERVIgQlkgJE9yZGVyQnlTdHJpbmciOwogICAgfQoKICAgICMgQ2hlY2sgaWYgYSBjYWNoZSBleGlzdHMgYmVmb3JlIHdlIGFzayB0aGUgZGF0YWJhc2UuCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewoKICAgICAgICBteSAkQ2FjaGVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCcsCiAgICAgICAgICAgIEtleSAgPT4gJFNRTCAuICRQYXJhbXtMaW1pdH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRDYWNoZURhdGEgKSB7CiAgICAgICAgICAgIGlmICggcmVmICRDYWNoZURhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkQ2FjaGVEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggcmVmICRDYWNoZURhdGEgZXEgJycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJENhY2hlRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCByZWYgJyAuIHJlZigkQ2FjaGVEYXRhKSAuICchJwogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSwKICAgICk7CgogICAgbXkgQElEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQElEcywgJFJvd1swXTsKICAgIH0KCiAgICAjIEhhbmRsZSB0aGUgZGlmZnJlbnQgcmVzdWx0IHR5cGVzLgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CgogICAgICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCcsCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkU1FMIC4gJFBhcmFte0xpbWl0fSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRJRHNbMF0sCiAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkSURzWzBdOwogICAgfQoKICAgIGVsc2UgewoKICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lckNvbXBhbnlTZWFyY2hEZXRhaWwnLAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJFNRTCAuICRQYXJhbXtMaW1pdH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBcQElEcywKICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFxASURzOwogICAgfQp9CgpzdWIgQ3VzdG9tZXJDb21wYW55R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICJDdXN0b21lckNvbXBhbnlHZXQ6OiRQYXJhbXtDdXN0b21lcklEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJXskRGF0YX0gaWYgcmVmICREYXRhIGVxICdIQVNIJzsKICAgIH0KCiAgICAjIGJ1aWxkIHNlbGVjdAogICAgbXkgQEZpZWxkczsKICAgIG15ICVGaWVsZHNNYXA7CgogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwogICAgICAgIHB1c2ggQEZpZWxkcywgJEVudHJ5LT5bMl07CiAgICAgICAgJEZpZWxkc01hcHsgJEVudHJ5LT5bMl0gfSA9ICRFbnRyeS0+WzBdOwogICAgfQogICAgbXkgJFNRTCA9ICdTRUxFQ1QgJyAuIGpvaW4oICcsICcsIEBGaWVsZHMgKTsKCiAgICBpZiAoICEkU2VsZi0+e0ZvcmVpZ25EQn0gKSB7CiAgICAgICAgJFNRTCAuPSAiLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5IjsKICAgIH0KCiAgICAjIHRoaXMgc2VlbXMgdG8gYmUgbGVnYWN5LCBpZiBOYW1lIGlzIHBhc3NlZCBpdCBzaG91bGQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgQ3VzdG9tZXJJRAogICAgbXkgJEN1c3RvbWVySUQgPSAkUGFyYW17TmFtZX0gfHwgJFBhcmFte0N1c3RvbWVySUR9OwoKICAgICRTUUwgLj0gIiBGUk9NICRTZWxmLT57Q3VzdG9tZXJDb21wYW55VGFibGV9IFdIRVJFICI7CgogICAgaWYgKCAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ICkgewogICAgICAgICRTUUwgLj0gIiRTZWxmLT57Q3VzdG9tZXJDb21wYW55S2V5fSA9ID8iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNRTCAuPSAiTE9XRVIoJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9KSA9IExPV0VSKCA/ICkiOwogICAgfQoKICAgICMgZ2V0IGluaXRpYWwgZGF0YQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbIFwkQ3VzdG9tZXJJRCBdCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJURhdGE7CiAgICBST1c6CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAkTWFwQ291bnRlciA9IDA7CgogICAgICAgIGZvciBteSAkRmllbGQgKEBGaWVsZHMpIHsKICAgICAgICAgICAgJERhdGF7ICRGaWVsZHNNYXB7JEZpZWxkfSB9ID0gJFJvd1skTWFwQ291bnRlcl07CiAgICAgICAgICAgICRNYXBDb3VudGVyKys7CiAgICAgICAgfQoKICAgICAgICBuZXh0IFJPVyBpZiAkU2VsZi0+e0ZvcmVpZ25EQn07CgogICAgICAgIGZvciBteSAkS2V5IChxdyhDcmVhdGVUaW1lIENyZWF0ZUJ5IENoYW5nZVRpbWUgQ2hhbmdlQnkpKSB7CiAgICAgICAgICAgICREYXRheyRLZXl9ID0gJFJvd1skTWFwQ291bnRlcl07CiAgICAgICAgICAgICRNYXBDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICJDdXN0b21lckNvbXBhbnlHZXQ6OiRQYXJhbXtDdXN0b21lcklEfSIsCiAgICAgICAgICAgIFZhbHVlID0+IFwlRGF0YSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJldHVybiBkYXRhCiAgICByZXR1cm4gKCVEYXRhKTsKfQoKc3ViIEN1c3RvbWVyQ29tcGFueUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcm8vcncKICAgIGlmICggJFNlbGYtPntSZWFkT25seX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDdXN0b21lckNvbXBhbnkgYmFja2VuZCBpcyByZWFkIG9ubHkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15IEBGaWVsZHM7CiAgICBteSBAUGxhY2Vob2xkZXJzOwogICAgbXkgQFZhbHVlczsKCiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9IH0gKSB7CgogICAgICAgICMgaWdub3JlIGR5bmFtaWMgZmllbGRzIGhlcmUKICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgcHVzaCBARmllbGRzLCAgICAgICAkRW50cnktPlsyXTsKICAgICAgICBwdXNoIEBQbGFjZWhvbGRlcnMsICc/JzsKICAgICAgICBwdXNoIEBWYWx1ZXMsICAgICAgIFwkUGFyYW17ICRFbnRyeS0+WzBdIH07CiAgICB9CiAgICBpZiAoICEkU2VsZi0+e0ZvcmVpZ25EQn0gKSB7CiAgICAgICAgcHVzaCBARmllbGRzLCAgICAgICBxdyhjcmVhdGVfdGltZSBjcmVhdGVfYnkgY2hhbmdlX3RpbWUgY2hhbmdlX2J5KTsKICAgICAgICBwdXNoIEBQbGFjZWhvbGRlcnMsIHF3KGN1cnJlbnRfdGltZXN0YW1wID8gY3VycmVudF90aW1lc3RhbXAgPyk7CiAgICAgICAgcHVzaCBAVmFsdWVzLCAoIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9ICk7CiAgICB9CgogICAgIyBidWlsZCBpbnNlcnQKICAgIG15ICRTUUwgPSAiSU5TRVJUIElOVE8gJFNlbGYtPntDdXN0b21lckNvbXBhbnlUYWJsZX0gKCI7CiAgICAkU1FMIC49IGpvaW4oICcsICcsIEBGaWVsZHMgKSAuICIgKSBWQUxVRVMgKCAiIC4gam9pbiggJywgJywgQFBsYWNlaG9sZGVycyApIC4gIiApIjsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQFZhbHVlcywKICAgICk7CgogICAgIyBsb2cgbm90aWNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgIkN1c3RvbWVyQ29tcGFueTogJyRQYXJhbXtDdXN0b21lckNvbXBhbnlOYW1lfS8kUGFyYW17Q3VzdG9tZXJJRH0nIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5ICgkUGFyYW17VXNlcklEfSkhIiwKICAgICk7CgogICAgJFNlbGYtPl9DdXN0b21lckNvbXBhbnlDYWNoZUNsZWFyKCBDdXN0b21lcklEID0+ICRQYXJhbXtDdXN0b21lcklEfSApOwoKICAgIHJldHVybiAkUGFyYW17Q3VzdG9tZXJJRH07Cn0KCnN1YiBDdXN0b21lckNvbXBhbnlVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHJvL3J3CiAgICBpZiAoICRTZWxmLT57UmVhZE9ubHl9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ3VzdG9tZXIgYmFja2VuZCBpcyByZWFkIG9ubHkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBGSUVMRDoKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgbmV4dCBGSUVMRCBpZiAkUGFyYW17ICRFbnRyeS0+WzBdIH07ICAgICAgICAgICAgICMgd29ycnkgb25seSBhYm91dCBlbXB0eSBmaWVsZHMsICcwJyBpcyBjb25zaWRlcmVkIGFzIGJlaW5nIGVtcHR5CiAgICAgICAgbmV4dCBGSUVMRCBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7ICAgICMgZG8gbm90IGNvbXBsYWluIGFib3V0IG1pc3NpbmcgZHluYW1pYyBmaWVsZHMKICAgICAgICBuZXh0IEZJRUxEIGlmICEkRW50cnktPls0XTsgICAgICAgICAgICAgICAgICAgICAgIyBjb21wbGFpbiBvbmx5IGFib3V0IG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzCiAgICAgICAgbmV4dCBGSUVMRCBpZiAkRW50cnktPlswXSBlcSAnVXNlclBhc3N3b3JkJzsgICAgICMgZG8gbm90IGNvbXBsYWluIGFib3V0IG1pc3NpbmcgcGFzc3dvcmQgZmllbGQKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRFbnRyeS0+WzBdISIKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBDb2xsZWN0IHRoZSBpbmZvIG5lZWRlZCBmb3IgdGhlIFNRTCBVUERBVEUgc3RhdGVtZW50CiAgICAjIFRoZSByZWFkb25seSBmbGFnIGlzIG5vdCBob25vcmVkIGhlcmUuCiAgICBteSAoIEBGaWVsZHMsIEBWYWx1ZXMgKTsKICAgIEZJRUxEOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH0gfSApIHsKICAgICAgICBuZXh0IEZJRUxEIGlmICRFbnRyeS0+WzBdID1+IG0vXlVzZXJQYXNzd29yZCQvaTsgICAgIyBza2lwIHRoZSBwYXNzd29yZCBmaWVsZAogICAgICAgIG5leHQgRklFTEQgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOyAgICAgICAjIHNraXAgZHluYW1pYyBmaWVsZHMKICAgICAgICBwdXNoIEBGaWVsZHMsICRFbnRyeS0+WzJdIC4gJyA9ID8nOwogICAgICAgIHB1c2ggQFZhbHVlcywgXCRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgIH0KICAgIGlmICggISRTZWxmLT57Rm9yZWlnbkRCfSApIHsKICAgICAgICBwdXNoIEBGaWVsZHMsICggJ2NoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAnLCAnY2hhbmdlX2J5ID0gPycgKTsKICAgICAgICBwdXNoIEBWYWx1ZXMsIFwkUGFyYW17VXNlcklEfTsKICAgIH0KCiAgICAjIGNyZWF0ZSBTUUwgc3RhdGVtZW50CiAgICBteSAkU1FMID0gIlVQREFURSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueVRhYmxlfSBTRVQgIjsKICAgICRTUUwgLj0gam9pbiggJywgJywgQEZpZWxkcyApOwoKICAgIGlmICggJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSApIHsKICAgICAgICAkU1FMIC49ICIgV0hFUkUgJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9ID0gPyI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU1FMIC49ICIgV0hFUkUgTE9XRVIoJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9KSA9IExPV0VSKCA/ICkiOwogICAgfQogICAgcHVzaCBAVmFsdWVzLCBcJFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfTsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQFZhbHVlcywKICAgICk7CgogICAgIyBsb2cgbm90aWNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgIkN1c3RvbWVyQ29tcGFueTogJyRQYXJhbXtDdXN0b21lckNvbXBhbnlOYW1lfS8kUGFyYW17Q3VzdG9tZXJJRH0nIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5ICgkUGFyYW17VXNlcklEfSkhIiwKICAgICk7CgogICAgJFNlbGYtPl9DdXN0b21lckNvbXBhbnlDYWNoZUNsZWFyKCBDdXN0b21lcklEID0+ICRQYXJhbXtDdXN0b21lcklEfSApOwogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJDb21wYW55SUR9IG5lICRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAkU2VsZi0+X0N1c3RvbWVyQ29tcGFueUNhY2hlQ2xlYXIoIEN1c3RvbWVySUQgPT4gJFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0N1c3RvbWVyQ29tcGFueUNhY2hlQ2xlYXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57Q2FjaGVPYmplY3R9OwoKICAgIGlmICggISRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICJDdXN0b21lckNvbXBhbnlHZXQ6OiRQYXJhbXtDdXN0b21lcklEfSIsCiAgICApOwoKICAgICMgZGVsZXRlIGFsbCBzZWFyY2ggY2FjaGUgZW50cmllcwogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyQ29tcGFueUxpc3QnLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lckNvbXBhbnlTZWFyY2hEZXRhaWwnLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbER5bmFtaWNGaWVsZHMnLAogICAgKTsKCiAgICBmb3IgbXkgJEZ1bmN0aW9uIChxdyhDdXN0b21lckNvbXBhbnlMaXN0KSkgewogICAgICAgIGZvciBteSAkVmFsaWQgKCAwIC4uIDEgKSB7CiAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgIEtleSAgPT4gIiR7RnVuY3Rpb259Ojoke1ZhbGlkfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgREVTVFJPWSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgZGlzY29ubmVjdCBpZiBpdCdzIG5vdCBhIHBhcmVudCBEQk9iamVjdAogICAgaWYgKCAkU2VsZi0+e05vdFBhcmVudERCT2JqZWN0fSApIHsKICAgICAgICBpZiAoICRTZWxmLT57REJPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RGlzY29ubmVjdCgpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/System/CustomerUser/DB.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA4MjNhYTI1ZDI2ZTE5MWMyYWRmNjljMWNmZGUyZjQ1MTBlMjQ2OTliIC0gS2VybmVsL1N5c3RlbS9DdXN0b21lclVzZXIvREIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOjpEQjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCnVzZSBEaWdlc3Q6OlNIQSAoKTsKCiMgQ1BBTiBtb2R1bGVzCnVzZSBDcnlwdDo6UGFzc3dkTUQ1IHF3KGFwYWNoZV9tZDVfY3J5cHQgdW5peF9tZDVfY3J5cHQpOwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Okxhbmd1YWdlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAojIEVPIFJvdGhlciBPU1MKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkVmFsdWVPYmplY3ROYW1lJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICMgY2hlY2sgbmVlZGVkIGRhdGEKICAgIGZvciBteSAkTmVlZGVkIChxdyggUHJlZmVyZW5jZXNPYmplY3QgQ3VzdG9tZXJVc2VyTWFwICkpIHsKICAgICAgICAkU2VsZi0+eyROZWVkZWR9ID0gJFBhcmFteyROZWVkZWR9IHx8IGRpZSAiR290IG5vICROZWVkZWQhIjsKICAgIH0KCiAgICAjIG1heCBzaG93biB1c2VyIHBlciBzZWFyY2ggbGlzdAogICAgJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaExpc3RMaW1pdH0gfHwgMjUwOwoKICAgICMgY29uZmlnIG9wdGlvbnMKICAgICRTZWxmLT57Q3VzdG9tZXJUYWJsZX0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57VGFibGV9CiAgICAgICAgfHwgZGllICJOZWVkIEN1c3RvbWVyVXNlci0+UGFyYW1zLT5UYWJsZSBpbiBLZXJuZWwvQ29uZmlnLnBtISI7CiAgICAkU2VsZi0+e0N1c3RvbWVyS2V5fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyS2V5fQogICAgICAgIHx8ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0tleX0KICAgICAgICB8fCBkaWUgIk5lZWQgQ3VzdG9tZXJVc2VyLT5DdXN0b21lcktleSBpbiBLZXJuZWwvQ29uZmlnLnBtISI7CiAgICAkU2VsZi0+e0N1c3RvbWVySUR9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJJRH0KICAgICAgICB8fCBkaWUgIk5lZWQgQ3VzdG9tZXJVc2VyLT5DdXN0b21lcklEIGluIEtlcm5lbC9Db25maWcucG0hIjsKICAgICRTZWxmLT57UmVhZE9ubHl9ICAgICAgICAgICAgICAgICA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1JlYWRPbmx5fTsKICAgICRTZWxmLT57RXhjbHVkZVByaW1hcnlDdXN0b21lcklEfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlckV4Y2x1ZGVQcmltYXJ5Q3VzdG9tZXJJRH0gfHwgMDsKICAgICRTZWxmLT57U2VhcmNoUHJlZml4fSAgICAgICAgICAgICA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaFByZWZpeH07CgogICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e1NlYXJjaFByZWZpeH0gKSB7CiAgICAgICAgJFNlbGYtPntTZWFyY2hQcmVmaXh9ID0gJyc7CiAgICB9CiAgICAkU2VsZi0+e1NlYXJjaFN1ZmZpeH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hTdWZmaXh9OwogICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e1NlYXJjaFN1ZmZpeH0gKSB7CiAgICAgICAgJFNlbGYtPntTZWFyY2hTdWZmaXh9ID0gJyonOwogICAgfQoKICAgICMgY2hlY2sgaWYgQ3VzdG9tZXJLZXkgaXMgdmFyIG9yIGludAogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIGlmICggJEVudHJ5LT5bMF0gZXEgJ1VzZXJMb2dpbicgJiYgJEVudHJ5LT5bNV0gPX4gL15pbnQkL2kgKSB7CiAgICAgICAgICAgICRTZWxmLT57Q3VzdG9tZXJLZXlJbnRlZ2VyfSA9IDE7CiAgICAgICAgICAgIGxhc3QgRU5UUlk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGNhY2hlIHR5cGUKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdDdXN0b21lclVzZXInIC4gJFBhcmFte0NvdW50fTsKCiAgICAjIGNyZWF0ZSBjYWNoZSBvYmplY3QsIGJ1dCBvbmx5IGlmIENhY2hlVFRMIGlzIHNldCBpbiBjdXN0b21lciBjb25maWcKICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IGRiIGNvbm5lY3QgaWYgRFNOIGlzIGdpdmVuCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntEU059ICkgewogICAgICAgICRTZWxmLT57REJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgICAgIERhdGFiYXNlRFNOICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57RFNOfSwKICAgICAgICAgICAgRGF0YWJhc2VVc2VyID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntVc2VyfSwKICAgICAgICAgICAgRGF0YWJhc2VQdyAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntQYXNzd29yZH0sCiAgICAgICAgICAgICV7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30gfSwKICAgICAgICAgICAgRGlzY29ubmVjdE9uRGVzdHJ1Y3Rpb24gPT4gMSwKICAgICAgICApIHx8IGRpZSgnQ2FuXCd0IGNvbm5lY3QgdG8gZGF0YWJhc2UhJyk7CgogICAgICAgICMgcmVtZW1iZXIgdGhhdCB3ZSBoYXZlIHRoZSBEQk9iamVjdCBub3QgZnJvbSBwYXJlbnQgY2FsbAogICAgICAgICRTZWxmLT57Tm90UGFyZW50REJPYmplY3R9ID0gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57REJPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICB9CgogICAgIyB0aGlzIHNldHRpbmcgc3BlY2lmaWVzIGlmIHRoZSB0YWJsZSBoYXMgdGhlIGNyZWF0ZV90aW1lLAogICAgIyBjcmVhdGVfYnksIGNoYW5nZV90aW1lIGFuZCBjaGFuZ2VfYnkgZmllbGRzIG9mIE9UT0JPCiAgICAkU2VsZi0+e0ZvcmVpZ25EQn0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57Rm9yZWlnbkRCfSA/IDEgOiAwOwoKICAgICMgZGVmaW5lcyBpZiB0aGUgZGF0YWJhc2Ugc2VhcmNoIHdpbGwgYmUgcGVyZm9ybWVuZCBjYXNlIHNlbnNpdGl2ZSAoMSkgb3Igbm90ICgwKQogICAgJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntTZWFyY2hDYXNlU2Vuc2l0aXZlfQogICAgICAgIC8vICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntDYXNlU2Vuc2l0aXZlfSB8fCAwOwoKICAgICMgZmV0Y2ggbmFtZXMgb2YgY29uZmlndXJlZCBkeW5hbWljIGZpZWxkcwogICAgbXkgQER5bmFtaWNGaWVsZE1hcEVudHJpZXMgPSBncmVwIHsgJF8tPls1XSBlcSAnZHluYW1pY19maWVsZCcgfSBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH07CiAgICAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30gPSB7IG1hcCB7ICRfLT5bMl0gPT4gMSB9IEBEeW5hbWljRmllbGRNYXBFbnRyaWVzIH07CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgbXkgJExheW91dFBhcmFtID0gJEtlcm5lbDo6T00tPntQYXJhbX0tPnsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCd9OwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBDaGVjayBpZiBtdWx0aXRlbmFuY3kgaXMgZW5hYmxlZCBhbmQgdGhlIHJlcXVlc3QgaXMgY29taW5nIGZyb20gYSB1c2VyLgogICAgaWYgKCAkTGF5b3V0UGFyYW0tPntVc2VyVHlwZX0gJiYgJExheW91dFBhcmFtLT57VXNlclR5cGV9IGVxICdVc2VyJyAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeScpICkgewoKICAgICAgICAjIFNhdmUgdGhlIFVzZXJJRCBhbmQgYWxsIGdyb3VwcyB0aGUgdXNlciBoYXMgJ3JvJyBwZXJtaXNzaW9uIG9uLgogICAgICAgIGlmICggJExheW91dFBhcmFtLT57VXNlcklEfSApIHsKICAgICAgICAgICAgIyBPbmx5IGdldCB0aGUgZ3JvdXAgbGlzdCBvbmNlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgogICAgICAgICAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgVGhlIGxpbWl0IGRvZXMgbm90IGNvdW50IGZvciBtZW1iZXJzIG9mIGEgc3BlY2lmaWMgZ3JvdXAuCiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uR3JvdXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeTo6UGVybWlzc2lvbkdyb3VwJykgfHwgJyc7CiAgICAgICAgICAgIG15ICVHcm91cHNSZXZlcnNlICAgPSByZXZlcnNlICVHcm91cHM7CgogICAgICAgICAgICBpZiAoICEkR3JvdXBzUmV2ZXJzZXskUGVybWlzc2lvbkdyb3VwfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TXVsdGl0ZW5hbmN5fSA9ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cElEc30gPSBbIHNvcnQga2V5cyAlR3JvdXBzIF07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cHN9ICAgPSBbIHZhbHVlcyAlR3JvdXBzIF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBDdXN0b21lck5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJMb2dpbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJE5hbWUgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAiQ3VzdG9tZXJOYW1lOjokUGFyYW17VXNlckxvZ2lufSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJE5hbWUgaWYgZGVmaW5lZCAkTmFtZTsKICAgIH0KCiAgICBteSAkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcyA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlck5hbWVGaWVsZHN9OwogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCRDdXN0b21lclVzZXJOYW1lRmllbGRzKSApIHsKICAgICAgICAkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcyA9IFsgJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgXTsKICAgIH0KCiAgICAjIHJlbW92ZSBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcwogICAgIyBhcyB0aGV5IGNhbm5vdCBiZSBoYW5kbGVkIGhlcmUKICAgIG15IEBDdXN0b21lclVzZXJOYW1lRmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lclVzZXJOYW1lRmllbGRzfTsKCiAgICAjIGJ1aWxkIFNRTCBzdHJpbmcgMS8yCiAgICBteSAkU1FMID0gIlNFTEVDVCAiOwoKICAgICRTUUwgLj0gam9pbiggIiwgIiwgQEN1c3RvbWVyVXNlck5hbWVGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkcyApOwogICAgJFNRTCAuPSAiIEZST00gJFNlbGYtPntDdXN0b21lclRhYmxlfSBXSEVSRSAiOwoKICAgICMgY2hlY2sgQ3VzdG9tZXJLZXkgdHlwZQogICAgbXkgJFVzZXJMb2dpbiA9ICRQYXJhbXtVc2VyTG9naW59OwogICAgaWYgKCAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ICkgewogICAgICAgICRTUUwgLj0gIiRTZWxmLT57Q3VzdG9tZXJLZXl9ID0gPyI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU1FMIC49ICJMT1dFUigkU2VsZi0+e0N1c3RvbWVyS2V5fSkgPSBMT1dFUig/KSI7CiAgICB9CgogICAgbXkgJU5hbWVQYXJ0czsKCiAgICAjIGdldCBkYXRhIGZyb20gY3VzdG9tZXIgdXNlciB0YWJsZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtVc2VyTG9naW59IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJEZpZWxkQ291bnRlciA9IDA7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGZvciBteSAkRmllbGQgKEBSb3cpIHsKICAgICAgICAgICAgJE5hbWVQYXJ0c3sgJEN1c3RvbWVyVXNlck5hbWVGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkc1skRmllbGRDb3VudGVyXSB9ID0gJEZpZWxkOwogICAgICAgICAgICAkRmllbGRDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgZmV0Y2ggZHluYW1pYyBmaWVsZCB2YWx1ZXMsIGlmIGNvbmZpZ3VyZWQKICAgIG15IEBEeW5hbWljRmllbGRDdXN0b21lclVzZXJOYW1lRmllbGRzID0gZ3JlcCB7IGV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lclVzZXJOYW1lRmllbGRzfTsKICAgIGlmIChARHluYW1pY0ZpZWxkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcykgewogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICBEWU5BTUlDRklFTEROQU1FOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoQER5bmFtaWNGaWVsZEN1c3RvbWVyVXNlck5hbWVGaWVsZHMpIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFkZWZpbmVkICRWYWx1ZTsKCiAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkVmFsdWUpICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gWyRWYWx1ZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15IEBSZW5kZXJlZFZhbHVlczsKCiAgICAgICAgICAgIFZBTFVFOgogICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRWYWx1ZSAoIEB7JFZhbHVlfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVkFMVUUgaWYgIWRlZmluZWQgJEN1cnJlbnRWYWx1ZSB8fCAhbGVuZ3RoICRDdXJyZW50VmFsdWU7CgogICAgICAgICAgICAgICAgbXkgJFJlbmRlcmVkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UmVhZGFibGVWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEN1cnJlbnRWYWx1ZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJFJlbmRlcmVkVmFsdWUpIHx8ICFkZWZpbmVkICRSZW5kZXJlZFZhbHVlLT57VmFsdWV9OwoKICAgICAgICAgICAgICAgIHB1c2ggQFJlbmRlcmVkVmFsdWVzLCAkUmVuZGVyZWRWYWx1ZS0+e1ZhbHVlfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE5hbWVQYXJ0c3skRHluYW1pY0ZpZWxkTmFtZX0gPSBqb2luICcgJywgQFJlbmRlcmVkVmFsdWVzOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzc2VtYmxlIG5hbWUKICAgIG15IEBOYW1lUGFydHM7CiAgICBDVVNUT01FUlVTRVJOQU1FRklFTEQ6CiAgICBmb3IgbXkgJEN1c3RvbWVyVXNlck5hbWVGaWVsZCAoIEB7JEN1c3RvbWVyVXNlck5hbWVGaWVsZHN9ICkgewogICAgICAgIG5leHQgQ1VTVE9NRVJVU0VSTkFNRUZJRUxECiAgICAgICAgICAgIGlmICFleGlzdHMgJE5hbWVQYXJ0c3skQ3VzdG9tZXJVc2VyTmFtZUZpZWxkfQogICAgICAgICAgICB8fCAhZGVmaW5lZCAkTmFtZVBhcnRzeyRDdXN0b21lclVzZXJOYW1lRmllbGR9CiAgICAgICAgICAgIHx8ICFsZW5ndGggJE5hbWVQYXJ0c3skQ3VzdG9tZXJVc2VyTmFtZUZpZWxkfTsKICAgICAgICBwdXNoIEBOYW1lUGFydHMsICROYW1lUGFydHN7JEN1c3RvbWVyVXNlck5hbWVGaWVsZH07CiAgICB9CgogICAgbXkgJEpvaW5DaGFyYWN0ZXIgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJOYW1lRmllbGRzSm9pbn0gLy8gJyAnOwogICAgbXkgJE5hbWUgICAgICAgICAgPSBqb2luICRKb2luQ2hhcmFjdGVyLCBATmFtZVBhcnRzOwoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICJDdXN0b21lck5hbWU6OiRQYXJhbXtVc2VyTG9naW59IiwKICAgICAgICAgICAgVmFsdWUgPT4gJE5hbWUsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuICROYW1lOwp9CgpzdWIgQ3VzdG9tZXJTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlVXNlcnM7CiAgICBteSAkVmFsaWQgPSAkUGFyYW17VmFsaWR9IC8vIDE7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICgKICAgICAgICAhJFBhcmFte1NlYXJjaH0KICAgICAgICAmJiAhJFBhcmFte1VzZXJMb2dpbn0KICAgICAgICAmJiAhJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9CiAgICAgICAgJiYgISRQYXJhbXtDdXN0b21lcklEfQogICAgICAgICYmICEkUGFyYW17Q3VzdG9tZXJJRFJhd30KICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFNlYXJjaCwgVXNlckxvZ2luLCBQb3N0TWFzdGVyU2VhcmNoLCBDdXN0b21lcklEUmF3IG9yIEN1c3RvbWVySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSBqb2luICc6OicsIG1hcCB7ICRfIC4gJz0nIC4gJFBhcmFteyRffSB9IHNvcnQga2V5cyAlUGFyYW07CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIFVzZSBjYWNoZSBmb3IgbXVsdGl0ZW5hbmN5LgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgJENhY2hlS2V5IC49IGpvaW4gJycsIG1hcCB7ICc6Okdyb3VwSUQ9JyAuICRfIH0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH07CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJFVzZXJzID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoJywKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJXskVXNlcnN9IGlmIHJlZiAkVXNlcnMgZXEgJ0hBU0gnOwogICAgfQoKICAgIG15ICRDdXN0b21lclVzZXJMaXN0RmllbGRzID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyTGlzdEZpZWxkc307CiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoJEN1c3RvbWVyVXNlckxpc3RGaWVsZHMpICkgewogICAgICAgICRDdXN0b21lclVzZXJMaXN0RmllbGRzID0gWyAnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnLCAnZW1haWwnLCBdOwogICAgfQoKICAgICMgcmVtb3ZlIGR5bmFtaWMgZmllbGQgbmFtZXMgdGhhdCBhcmUgY29uZmlndXJlZCBpbiBDdXN0b21lclVzZXJMaXN0RmllbGRzCiAgICAjIGFzIHRoZXkgY2Fubm90IGJlIGhhbmRsZWQgaGVyZQogICAgbXkgQEN1c3RvbWVyVXNlckxpc3RGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkcyA9IGdyZXAgeyAhZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9IEB7JEN1c3RvbWVyVXNlckxpc3RGaWVsZHN9OwoKICAgICMgYnVpbGQgU1FMIHN0cmluZyAxLzIKICAgIG15ICRTUUwgPSAiU0VMRUNUICRTZWxmLT57Q3VzdG9tZXJLZXl9ICI7CiAgICBteSBAQmluZDsKICAgICRTUUwgLj0gJywgJyAuICggam9pbiAnLCAnLCBAQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc1dpdGhvdXREeW5hbWljRmllbGRzICk7CgogICAgIyBnZXQgbGlrZSBlc2NhcGUgc3RyaW5nIG5lZWRlZCBmb3Igc29tZSBkYXRhYmFzZXMgKGUuZy4gb3JhY2xlKQogICAgbXkgJExpa2VFc2NhcGVTdHJpbmcgPSAkU2VsZi0+e0RCT2JqZWN0fS0+R2V0RGF0YWJhc2VGdW5jdGlvbignTGlrZUVzY2FwZVN0cmluZycpOwoKICAgICMgYnVpbGQgU1FMIHN0cmluZyAyLzIKICAgICRTUUwgLj0gIiBGUk9NICRTZWxmLT57Q3VzdG9tZXJUYWJsZX0gV0hFUkUgIjsKICAgIGlmICggJFBhcmFte1NlYXJjaH0gKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICAgICAiTmVlZCBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMgaW4gQ3VzdG9tZXJVc2VyIGNvbmZpZywgdW5hYmxlIHRvIHNlYXJjaCBmb3IgJyRQYXJhbXtTZWFyY2h9JyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBteSAkU2VhcmNoID0gJFNlbGYtPntEQk9iamVjdH0tPlF1ZXJ5U3RyaW5nRXNjYXBlKCBRdWVyeVN0cmluZyA9PiAkUGFyYW17U2VhcmNofSApOwoKICAgICAgICAjIHJlbW92ZSBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzCiAgICAgICAgIyBhcyB0aGV5IGNhbm5vdCBiZSByZXRyaWV2ZWQgaGVyZQogICAgICAgIG15IEBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfQogICAgICAgICAgICBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hGaWVsZHN9IH07CgogICAgICAgIGlmICggJFBhcmFte0N1c3RvbWVyVXNlck9ubHl9ICkgewogICAgICAgICAgICBAQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzID0gZ3JlcCB7ICRfIG5lICdjdXN0b21lcl9pZCcgfSBAQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzOwogICAgICAgIH0KCiAgICAgICAgbXkgJVF1ZXJ5Q29uZGl0aW9uID0gJFNlbGYtPntEQk9iamVjdH0tPlF1ZXJ5Q29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICAgICAgID0+IFxAQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzLCAgICAjJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzfSwKICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAkU2VhcmNoLAogICAgICAgICAgICBTZWFyY2hQcmVmaXggID0+ICRTZWxmLT57U2VhcmNoUHJlZml4fSwKICAgICAgICAgICAgU2VhcmNoU3VmZml4ICA9PiAkU2VsZi0+e1NlYXJjaFN1ZmZpeH0sCiAgICAgICAgICAgIENhc2VTZW5zaXRpdmUgPT4gJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSwKICAgICAgICAgICAgQmluZE1vZGUgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTUUwgLj0gJFF1ZXJ5Q29uZGl0aW9ue1NRTH07CiAgICAgICAgcHVzaCBAQmluZCwgQHsgJFF1ZXJ5Q29uZGl0aW9ue1ZhbHVlc30gfTsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBEb24ndCBzZWFyY2ggZm9yIGN1c3RvbWVyIHVzZXJzIHdpdGhvdXQgZ3JvdXAgcGVybWlzc2lvbi4KICAgICAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lckNvbXBhbnlTdXBwb3J0fSApIHsKICAgICAgICAgICAgICAgICMgVE9ETzogV29ya2Fyb3VuZCB1bnRpbCB0aGUgc2VhcmNoIGdldHMgY2hhbmdlZC4KICAgICAgICAgICAgICAgICRQYXJhbXtMaW1pdH0gPSAxMDAwMDA7CiAgICAgICAgICAgICAgICAjIE5vcm1hbGx5LCB3ZSBzaG91bGQgaW5uZXIgam9pbiBhbGwgY3VzdG9tZXIgY29tcGFuaWVzIHRvIHNlZSBpZiB0aGUgYWdlbnQgaGFzIHBlcm1pc3Npb24gdG8gc2VlIHRoZSBjdXN0b21lciAoY3VycmVudGx5IHdvcmtpbmcpIG9yIHRoZSBjdXN0b21lciBjb21wYW55IChpdGVyYXRlIHRocm91Z2ggYWxsIERCIGJhY2stZW5kcykuCiAgICAgICAgICAgICAgICAjIElmIHRoZSBhZ2VudCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gb24gdGhlIGN1c3RvbWVyIGNvbXBhbnkgYnV0IHRoZSBjdXN0b21lciB1c2VyLCB0aGUgcXVlcnkgc2hvdWxkbid0IHJldHVybiB0aGUgY3VzdG9tZXIgdXNlci4KICAgICAgICAgICAgICAgICMgQ3VycmVudGx5LCB3ZSBhcmUgbG9va2luZyBmb3IgZXZlcnl0aGluZyBhbmQgZmlsdGVyaW5nIHRoZSByZXN1bHQsIHdoaWNoIGlzIG5vdCBvcHRpbWFsLiBUaGUgcmVhbCBsaW1pdCBzaG91bGQgc3RpbGwgYmUgYXBwbGllZCBpbiB0aGUgU3lzdGVtL0N1c3RvbWVyVXNlci5wbS4KICAgICAgICAgICAgICAgICMgVGhlIHNhbWUgYXBwbGllcyBmb3IgdGhlIEN1c3RvbWVyVXNlci9MREFQLnBtCiAgICAgICAgICAgICAgICAjIFNFTEVDVCAqIEZST00gY3VzdG9tZXJfdXNlciBjdQogICAgICAgICAgICAgICAgIyBKT0lOIGN1c3RvbWVyX2NvbXBhbnkgY3AgT04gY3UuY3VzdG9tZXJfaWQgPSBjcC5jdXN0b21lcl9pZAogICAgICAgICAgICAgICAgIyBXSEVSRSAoKGNwLmdyb3VwX2lkIElOICgxKSBPUiBjcC5ncm91cF9pZCBJUyBOVUxMIE9SIGNwLmdyb3VwX2lkID0gJycpCiAgICAgICAgICAgICAgICAjICAgICBBTkQgKGN1Lmdyb3VwX2lkIElTIE5VTEwgT1IgY3UuZ3JvdXBfaWQgPSAnJykpCiAgICAgICAgICAgICAgICAjIE9SIChjdS5ncm91cF9pZCBJTiAoMSkpCiAgICAgICAgICAgICAgICAjIFVOSU9OCiAgICAgICAgICAgICAgICAjIFNFTEVDVCAqIEZST00gY3VzdG9tZXJfdXNlciBjdQogICAgICAgICAgICAgICAgIyBKT0lOIGN1c3RvbWVyX2NvbXBhbnlfMiBjcCBPTiBjdS5jdXN0b21lcl9pZCA9IGNwLmN1c3RvbWVyX2lkCiAgICAgICAgICAgICAgICAjIFdIRVJFICgoY3AuZ3JvdXBfaWQgSU4gKDEpIE9SIGNwLmdyb3VwX2lkIElTIE5VTEwgT1IgY3AuZ3JvdXBfaWQgPSAnJykKICAgICAgICAgICAgICAgICMgICAgIEFORCAoY3UuZ3JvdXBfaWQgSVMgTlVMTCBPUiBjdS5ncm91cF9pZCA9ICcnKSkKICAgICAgICAgICAgICAgICMgT1IgKGN1Lmdyb3VwX2lkIElOICgxKSkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBHZXQgdGhlIGNvbHVtbiBuYW1lIHdoZXJlIHRoZSBncm91cCBJRCBpcyBzdG9yZWQuCiAgICAgICAgICAgIG15ICRHcm91cElEQ29sOwogICAgICAgICAgICBmb3IgbXkgJE1hcCAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICAgICAgICAgIGlmICggJE1hcC0+WzBdIGVxICdVc2VyR3JvdXBJRCcgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdyb3VwSURDb2wgPSAkTWFwLT5bMl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgVGhlIHNvdXJjZSBzdXBwb3J0cyBtdWx0aXRlbmFuY3kuCiAgICAgICAgICAgIGlmICgkR3JvdXBJRENvbCkgewogICAgICAgICAgICAgICAgbXkgJFVzZXJHcm91cElEU3luYyA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1VzZXJHcm91cElEU3luY307CiAgICAgICAgICAgICAgICAjIENoZWNrIGlmIHdlIG1hdGNoIGZvciBncm91cCBJRHMgb3IgZ3JvdXAgbmFtZXMuCiAgICAgICAgICAgICAgICBteSBAVXNlckdyb3VwcyA9ICRVc2VyR3JvdXBJRFN5bmMtPntVc2VHcm91cE5hbWVzfSA/IEB7ICRTZWxmLT57VXNlckdyb3Vwc30gfSA6IEB7ICRTZWxmLT57VXNlckdyb3VwSURzfSB9OwoKICAgICAgICAgICAgICAgICMgUmVtYXAgbG9jYWwgZ3JvdXBzIHRvIHJlbW90ZSBncm91cHMuCiAgICAgICAgICAgICAgICBmb3IgbXkgJFJlbW90ZUdyb3VwICgga2V5cyAleyAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJExvY2FsR3JvdXAgPSAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9eyRSZW1vdGVHcm91cH07CgogICAgICAgICAgICAgICAgICAgIEBVc2VyR3JvdXBzID0gbWFwIHsgJF8gZXEgJExvY2FsR3JvdXAgPyAkUmVtb3RlR3JvdXAgOiAkXyB9IEBVc2VyR3JvdXBzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRJbkNvbmRpdGlvbiA9ICRTZWxmLT57REJPYmplY3R9LT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRHcm91cElEQ29sLAogICAgICAgICAgICAgICAgICAgIFZhbHVlcyAgID0+IFxAVXNlckdyb3VwcywKICAgICAgICAgICAgICAgICAgICBCaW5kTW9kZSA9PiAwLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIElmIHRoZSBmaWVsZCBpcyBlbXB0eSwgd2UgaGF2ZSBhY2Nlc3MgYnkgZGVmYXVsdC4KICAgICAgICAgICAgICAgICRJbkNvbmRpdGlvbiAuPSAiIE9SICgkR3JvdXBJRENvbCBJUyBOVUxMIE9SICRHcm91cElEQ29sID0gJycpIjsKICAgICAgICAgICAgICAgICRTUUwgLj0gIiBBTkQgKCRJbkNvbmRpdGlvbikiOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgICRTUUwgLj0gJyAnOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17UG9zdE1hc3RlclNlYXJjaH0gKSB7CiAgICAgICAgaWYgKCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJQb3N0TWFzdGVyU2VhcmNoRmllbGRzfSApIHsKCiAgICAgICAgICAgICMgcmVtb3ZlIGR5bmFtaWMgZmllbGQgbmFtZXMgdGhhdCBhcmUgY29uZmlndXJlZCBpbiBDdXN0b21lclVzZXJQb3N0TWFzdGVyU2VhcmNoRmllbGRzCiAgICAgICAgICAgICMgYXMgdGhleSBjYW5ub3QgYmUgcmV0cmlldmVkIGhlcmUKICAgICAgICAgICAgbXkgQEN1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfQogICAgICAgICAgICAgICAgQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkc30gfTsKCiAgICAgICAgICAgIG15ICRTUUxFeHQgPSAnJzsKCiAgICAgICAgICAgICMgZm9yIG15ICRGaWVsZCAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHN9IH0gKSB7CiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKEBDdXN0b21lclVzZXJQb3N0TWFzdGVyU2VhcmNoRmllbGRzKSB7CiAgICAgICAgICAgICAgICBpZiAoJFNRTEV4dCkgewogICAgICAgICAgICAgICAgICAgICRTUUxFeHQgLj0gJyBPUiAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXkgJFBvc3RNYXN0ZXJTZWFyY2ggPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSApOwogICAgICAgICAgICAgICAgcHVzaCBAQmluZCwgXCRQb3N0TWFzdGVyU2VhcmNoOwoKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSApIHsKICAgICAgICAgICAgICAgICAgICAkU1FMRXh0IC49ICIgJEZpZWxkID0gPyAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFNRTEV4dCAuPSAiIExPV0VSKCRGaWVsZCkgPSBMT1dFUig/KSAiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRTUUwgLj0gJFNRTEV4dDsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtVc2VyTG9naW59ICkgewoKICAgICAgICBteSAkVXNlckxvZ2luID0gJFBhcmFte1VzZXJMb2dpbn07CgogICAgICAgICMgY2hlY2sgQ3VzdG9tZXJLZXkgdHlwZQogICAgICAgIGlmICggJFNlbGYtPntDdXN0b21lcktleUludGVnZXJ9ICkgewoKICAgICAgICAgICAgIyByZXR1cm4gaWYgbG9naW4gaXMgbm8gaW50ZWdlcgogICAgICAgICAgICByZXR1cm4gaWYgJFBhcmFte1VzZXJMb2dpbn0gIX4gL14oXCt8XC18KVxkezEsMTZ9JC87CgogICAgICAgICAgICAkU1FMIC49ICIkU2VsZi0+e0N1c3RvbWVyS2V5fSA9ID8iOwogICAgICAgICAgICBwdXNoIEBCaW5kLCBcJFVzZXJMb2dpbjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRVc2VyTG9naW4gPSAnJScgLiAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRVc2VyTG9naW4sICdMaWtlJyApIC4gJyUnOwogICAgICAgICAgICAkVXNlckxvZ2luID1+IHMvXCovJS9nOwogICAgICAgICAgICBwdXNoIEBCaW5kLCBcJFVzZXJMb2dpbjsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ICkgewogICAgICAgICAgICAgICAgJFNRTCAuPSAiJFNlbGYtPntDdXN0b21lcktleX0gTElLRSA/ICRMaWtlRXNjYXBlU3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTUUwgLj0gIkxPV0VSKCRTZWxmLT57Q3VzdG9tZXJLZXl9KSBMSUtFIExPV0VSKD8pICRMaWtlRXNjYXBlU3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFBhcmFte0N1c3RvbWVySUR9ICkgewoKICAgICAgICBteSAkQ3VzdG9tZXJJRCA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSggJFBhcmFte0N1c3RvbWVySUR9LCAnTGlrZScgKTsKICAgICAgICAkQ3VzdG9tZXJJRCA9fiBzL1wqLyUvZzsKICAgICAgICBwdXNoIEBCaW5kLCBcJEN1c3RvbWVySUQ7CgogICAgICAgIGlmICggJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSApIHsKICAgICAgICAgICAgJFNRTCAuPSAiJFNlbGYtPntDdXN0b21lcklEfSBMSUtFID8gJExpa2VFc2NhcGVTdHJpbmciOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNRTCAuPSAiTE9XRVIoJFNlbGYtPntDdXN0b21lcklEfSkgTElLRSBMT1dFUig/KSAkTGlrZUVzY2FwZVN0cmluZyI7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17Q3VzdG9tZXJJRFJhd30gKSB7CgogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q3VzdG9tZXJJRFJhd307CgogICAgICAgIGlmICggJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSApIHsKICAgICAgICAgICAgJFNRTCAuPSAiJFNlbGYtPntDdXN0b21lcklEfSA9ID8gIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTUUwgLj0gIkxPV0VSKCRTZWxmLT57Q3VzdG9tZXJJRH0pID0gTE9XRVIoPykgIjsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgdmFsaWQgb3B0aW9uCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVmFsaWR9ICYmICRWYWxpZCApIHsKCiAgICAgICAgIyBnZXQgdmFsaWQgb2JqZWN0CiAgICAgICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CgogICAgICAgICRTUUwgLj0gJyBBTkQgJwogICAgICAgICAgICAuICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVmFsaWR9CiAgICAgICAgICAgIC4gJyBJTiAoJyAuIGpvaW4oICcsICcsICRWYWxpZE9iamVjdC0+VmFsaWRJRHNHZXQoKSApIC4gJykgJzsKICAgIH0KCiAgICAjIGR5bmFtaWMgZmllbGQgaGFuZGxpbmcKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIG15ICREeW5hbWljRmllbGRDb25maWdzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIE9iamVjdFR5cGUgPT4gJ0N1c3RvbWVyVXNlcicsCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgKTsKICAgIG15ICVEeW5hbWljRmllbGRDb25maWdzQnlOYW1lID0gbWFwIHsgJF8tPntOYW1lfSA9PiAkXyB9IEB7JER5bmFtaWNGaWVsZENvbmZpZ3N9OwoKICAgIG15IEBDdXN0b21lclVzZXJMaXN0RmllbGRzRHluYW1pY0ZpZWxkcyA9IGdyZXAgeyBleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0gQHskQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc307CgogICAgIyBnZXQgZGF0YSBmcm9tIGN1c3RvbWVyIHVzZXIgdGFibGUKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBcQEJpbmQsCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSB8fCAkU2VsZi0+e1VzZXJTZWFyY2hMaXN0TGltaXR9LAogICAgKTsKCiAgICBteSBAQ3VzdG9tZXJVc2VyRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ3VzdG9tZXJVc2VyRGF0YSwgW0BSb3ddOwogICAgfQoKICAgIENVU1RPTUVSVVNFUkRBVEE6CiAgICBmb3IgbXkgJEN1c3RvbWVyVXNlckRhdGEgKEBDdXN0b21lclVzZXJEYXRhKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyS2V5ID0gc2hpZnQgQHskQ3VzdG9tZXJVc2VyRGF0YX07CiAgICAgICAgbmV4dCBDVVNUT01FUlVTRVJEQVRBIGlmICRVc2Vyc3skQ3VzdG9tZXJLZXl9OwoKICAgICAgICBteSAlVXNlclN0cmluZ1BhcnRzOwoKICAgICAgICBteSAkRmllbGRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJEZpZWxkICggQHskQ3VzdG9tZXJVc2VyRGF0YX0gKSB7CiAgICAgICAgICAgICRVc2VyU3RyaW5nUGFydHN7ICRDdXN0b21lclVzZXJMaXN0RmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHNbJEZpZWxkQ291bnRlcl0gfSA9ICRGaWVsZDsKICAgICAgICAgICAgJEZpZWxkQ291bnRlcisrOwogICAgICAgIH0KCiAgICAgICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIHZhbHVlcywgaWYgY29uZmlndXJlZAogICAgICAgIGlmIChAQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc0R5bmFtaWNGaWVsZHMpIHsKICAgICAgICAgICAgRFlOQU1JQ0ZJRUxETkFNRToKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGROYW1lIChAQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc0R5bmFtaWNGaWVsZHMpIHsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxETkFNRSBpZiAhZXhpc3RzICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfTsKCiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lICAgICAgICAgPT4gJEN1c3RvbWVyS2V5LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRE5BTUUgaWYgIWRlZmluZWQgJFZhbHVlOwoKICAgICAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkVmFsdWUpICkgewogICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9IFskVmFsdWVdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15IEBWYWx1ZXM7CgogICAgICAgICAgICAgICAgVkFMVUU6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRWYWx1ZSAoIEB7JFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IFZBTFVFIGlmICFkZWZpbmVkICRDdXJyZW50VmFsdWUgfHwgIWxlbmd0aCAkQ3VycmVudFZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBteSAkUmVhZGFibGVWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5SZWFkYWJsZVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JER5bmFtaWNGaWVsZE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEN1cnJlbnRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBuZXh0IFZBTFVFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkUmVhZGFibGVWYWx1ZSkgfHwgIWRlZmluZWQgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX07CgogICAgICAgICAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRHluYW1pY0ZpZWxkTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRQb3NzaWJsZVZhbHVlcy0+eyAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9ID0gJFBvc3NpYmxlVmFsdWVzLT57ICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9IH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQFZhbHVlcywgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFVzZXJTdHJpbmdQYXJ0c3skRHluYW1pY0ZpZWxkTmFtZX0gPSBqb2luICcgJywgQFZhbHVlczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhc3NlbWJsZSB1c2VyIHN0cmluZwogICAgICAgIG15IEBVc2VyU3RyaW5nUGFydHM7CiAgICAgICAgQ1VTVE9NRVJVU0VSTElTVEZJRUxEOgogICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkICggQHskQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc30gKSB7CiAgICAgICAgICAgIG5leHQgQ1VTVE9NRVJVU0VSTElTVEZJRUxECiAgICAgICAgICAgICAgICBpZiAhZXhpc3RzICRVc2VyU3RyaW5nUGFydHN7JEN1c3RvbWVyVXNlckxpc3RGaWVsZH0KICAgICAgICAgICAgICAgIHx8ICFkZWZpbmVkICRVc2VyU3RyaW5nUGFydHN7JEN1c3RvbWVyVXNlckxpc3RGaWVsZH0KICAgICAgICAgICAgICAgIHx8ICFsZW5ndGggJFVzZXJTdHJpbmdQYXJ0c3skQ3VzdG9tZXJVc2VyTGlzdEZpZWxkfTsKICAgICAgICAgICAgcHVzaCBAVXNlclN0cmluZ1BhcnRzLCAkVXNlclN0cmluZ1BhcnRzeyRDdXN0b21lclVzZXJMaXN0RmllbGR9OwogICAgICAgIH0KCiAgICAgICAgJFVzZXJzeyRDdXN0b21lcktleX0gPSBqb2luICcgJywgQFVzZXJTdHJpbmdQYXJ0czsKICAgICAgICAkVXNlcnN7JEN1c3RvbWVyS2V5fSA9fiBzL14oLiopXHMoLis/XEAuKz9cLi4rPykoXHN8KSQvIiQxIiA8JDI+LzsKICAgIH0KCiAgICAjIGNhY2hlIHJlcXVlc3QKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaCcsCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVVc2VycywKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gJVVzZXJzOwp9CgpzdWIgQ3VzdG9tZXJTZWFyY2hEZXRhaWwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoIHJlZiAkUGFyYW17U2VhcmNoRmllbGRzfSBuZSAnQVJSQVknICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VhcmNoRmllbGRzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBSZXR1cm4gb25seSB2YWxpZCB1c2VycyBwZXIgZGVmYXVsdAogICAgbXkgJFZhbGlkID0gJFBhcmFte1ZhbGlkfSAvLyAxOwoKICAgICRQYXJhbXtMaW1pdH0gLy89ICcnOwoKICAgICMgU3BsaXQgdGhlIHNlYXJjaCBmaWVsZHMgaW4gc2NhbGFyIGFuZCBhcnJheSBmaWVsZHMsIGJlZm9yZSB0aGUgZGlmZnJlbnQgaGFuZGxpbmcuCiAgICBteSBAU2NhbGFyU2VhcmNoRmllbGRzID0gZ3JlcCB7ICdJbnB1dCcgZXEgJF8tPntUeXBlfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CiAgICBteSBAQXJyYXlTZWFyY2hGaWVsZHMgID0gZ3JlcCB7ICdTZWxlY3Rpb24nIGVxICRfLT57VHlwZX0gfSBAeyAkUGFyYW17U2VhcmNoRmllbGRzfSB9OwoKICAgICMgVmVyaWZ5IHRoYXQgYWxsIHBhc3NlZCBhcnJheSBwYXJhbWV0ZXJzIGNvbnRhaW4gYW4gYXJyYXlyZWYuCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKEBBcnJheVNlYXJjaEZpZWxkcykgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyAkQXJndW1lbnQtPntOYW1lfSB9ICkgewogICAgICAgICAgICAkUGFyYW17ICRBcmd1bWVudC0+e05hbWV9IH0gfHw9IFtdOwoKICAgICAgICAgICAgbmV4dCBBUkdVTUVOVDsKICAgICAgICB9CgogICAgICAgIGlmICggcmVmICRQYXJhbXsgJEFyZ3VtZW50LT57TmFtZX0gfSBuZSAnQVJSQVknICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEFyZ3VtZW50LT57TmFtZX0gbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIFNldCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgZm9yIHRoZSByZXR1cm4gdHlwZS4KICAgIG15ICRSZXN1bHQgPSAkUGFyYW17UmVzdWx0fSB8fCAnQVJSQVknOwoKICAgICMgU3BlY2lhbCBoYW5kbGluZyBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewoKICAgICAgICAjIElnbm9yZSB0aGUgcGFyYW1ldGVyICdMaW1pdCcgd2hlbiByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLgogICAgICAgICRQYXJhbXtMaW1pdH0gPSAnJzsKCiAgICAgICAgIyBEZWxldGUgdGhlIE9yZGVyQnkgcGFyYW1ldGVyIHdoZW4gdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcuCiAgICAgICAgJFBhcmFte09yZGVyQnl9ID0gW107CiAgICB9CgogICAgIyBEZWZpbmUgb3JkZXIgdGFibGUgZnJvbSB0aGUgc2VhcmNoIGZpZWxkcy4KICAgIG15ICVPcmRlckJ5VGFibGUgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfLT57RGF0YWJhc2VGaWVsZH0gfSBAeyAkUGFyYW17U2VhcmNoRmllbGRzfSB9OwoKICAgIGZvciBteSAkRmllbGQgKEBBcnJheVNlYXJjaEZpZWxkcykgewoKICAgICAgICBteSAkU2VsZWN0aW9uc0RhdGEgPSAkRmllbGQtPntTZWxlY3Rpb25zRGF0YX07CgogICAgICAgIGZvciBteSAkU2VsZWN0ZWRWYWx1ZSAoIEB7ICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSB9ICkgewoKICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgc2VsZWN0ZWQgdmFsdWUgZm9yIHRoZSBjdXJyZW50IGZpZWxkIGlzIHZhbGlkLgogICAgICAgICAgICBpZiAoICEkU2VsZWN0aW9uc0RhdGEtPnskU2VsZWN0ZWRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgc2VsZWN0ZWQgdmFsdWUgJEZpZWxkLT57TmFtZX0gaXMgbm90IHZhbGlkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICREQk9iamVjdCA9ICRTZWxmLT57REJPYmplY3R9OwoKICAgICMgQXNzZW1ibGUgdGhlIGNvbmRpdGlvbnMgdXNlZCBpbiB0aGUgV0hFUkUgY2xhdXNlLgogICAgbXkgQFNRTFdoZXJlOwoKICAgIGZvciBteSAkRmllbGQgKEBTY2FsYXJTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgIyBTZWFyY2ggZm9yIHNjYWxhciBmaWVsZHMgKHdpbGRjYXJkcyBhcmUgYWxsb3dlZCkuCiAgICAgICAgaWYgKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gKSB7CgogICAgICAgICAgICAjIEdldCBsaWtlIGVzY2FwZSBzdHJpbmcgbmVlZGVkIGZvciBzb21lIGRhdGFiYXNlcyAoZS5nLiBvcmFjbGUpLgogICAgICAgICAgICBteSAkTGlrZUVzY2FwZVN0cmluZyA9ICREQk9iamVjdC0+R2V0RGF0YWJhc2VGdW5jdGlvbignTGlrZUVzY2FwZVN0cmluZycpOwoKICAgICAgICAgICAgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ID0gJERCT2JqZWN0LT5RdW90ZSggJFBhcmFteyAkRmllbGQtPntOYW1lfSB9LCAnTGlrZScgKTsKCiAgICAgICAgICAgICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSA9fiBzeyBcKisgfXslfXhtc2c7CgogICAgICAgICAgICAjIElmIHRoZSBmaWVsZCBjb250YWlucyBtb3JlIHRoYW4gb25seSAlLgogICAgICAgICAgICBpZiAoICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSAhfiBteyBcQSAlKiBceiB9eG1zICkgewogICAgICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsCiAgICAgICAgICAgICAgICAgICAgIkxPV0VSKCRGaWVsZC0+e0RhdGFiYXNlRmllbGR9KSBMSUtFIExPV0VSKCckUGFyYW17ICRGaWVsZC0+e05hbWV9IH0nKSAkTGlrZUVzY2FwZVN0cmluZyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIENoZWNrIGFsbCBjb25maWd1cmVkIGNoYW5nZSBkeW5hbWljIGZpZWxkcywgYnVpbGQgbG9va3VwIGhhc2ggYnkgbmFtZS4KICAgIG15ICVDdXN0b21lclVzZXJEeW5hbWljRmllbGROYW1lMkNvbmZpZzsKICAgIG15ICRDdXN0b21lclVzZXJEeW5hbWljRmllbGRzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgKTsKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskQ3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkc30gKSB7CiAgICAgICAgJEN1c3RvbWVyVXNlckR5bmFtaWNGaWVsZE5hbWUyQ29uZmlneyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGQ7CiAgICB9CgogICAgbXkgJFNRTER5bmFtaWNGaWVsZEZyb20gICAgID0gJyc7CiAgICBteSAkU1FMRHluYW1pY0ZpZWxkV2hlcmUgICAgPSAnJzsKICAgIG15ICREeW5hbWljRmllbGRKb2luQ291bnRlciA9IDE7CgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyRDdXN0b21lclVzZXJEeW5hbWljRmllbGRzfSApIHsKCiAgICAgICAgbXkgJFNlYXJjaFBhcmFtID0gJFBhcmFteyAiRHluYW1pY0ZpZWxkXyIgLiAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgKCAhJFNlYXJjaFBhcmFtICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgKCByZWYgJFNlYXJjaFBhcmFtIG5lICdIQVNIJyApOwoKICAgICAgICBteSAkTmVlZEpvaW47CgogICAgICAgIGZvciBteSAkT3BlcmF0b3IgKCBzb3J0IGtleXMgJXskU2VhcmNoUGFyYW19ICkgewoKICAgICAgICAgICAgbXkgQFNlYXJjaFBhcmFtcyA9ICggcmVmICRTZWFyY2hQYXJhbS0+eyRPcGVyYXRvcn0gZXEgJ0FSUkFZJyApCiAgICAgICAgICAgICAgICA/IEB7ICRTZWFyY2hQYXJhbS0+eyRPcGVyYXRvcn0gfQogICAgICAgICAgICAgICAgOiAoICRTZWFyY2hQYXJhbS0+eyRPcGVyYXRvcn0gKTsKCiAgICAgICAgICAgIG15ICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiA9ICcnOwogICAgICAgICAgICBpZiAoJFNRTER5bmFtaWNGaWVsZFdoZXJlKSB7CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgPSAnIEFORCAoJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiA9ICcgKCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICAgICAgVEVYVDoKICAgICAgICAgICAgZm9yIG15ICRUZXh0IChAU2VhcmNoUGFyYW1zKSB7CiAgICAgICAgICAgICAgICBuZXh0IFRFWFQgaWYgKCAhZGVmaW5lZCAkVGV4dCB8fCAkVGV4dCBlcSAnJyApOwoKICAgICAgICAgICAgICAgICRUZXh0ID1+IHMvXCovJS9naTsKCiAgICAgICAgICAgICAgICAjIENoZWNrIHNlYXJjaCBhdHRyaWJ1dGUsIHdlIGRvIG5vdCBuZWVkIHRvIHNlYXJjaCBmb3IgJyonLgogICAgICAgICAgICAgICAgbmV4dCBURVhUIGlmICRUZXh0ID1+IC9eXCV7MSwzfSQvOwoKICAgICAgICAgICAgICAgIG15ICRWYWxpZGF0ZVN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9IHx8IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFZhbGlkYXRlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlNlYXJjaCBub3QgZXhlY3V0ZWQgZHVlIHRvIGludmFsaWQgdmFsdWUgJyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFRleHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIicgb24gZmllbGQgJyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJER5bmFtaWNGaWVsZC0+e05hbWV9IC4gIichIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgLj0gJyBPUiAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViIC49ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5TZWFyY2hTUUxHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVGFibGVBbGlhcyAgICAgICAgID0+ICJkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIiLAogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yICAgICAgICAgICA9PiAkT3BlcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgU2VhcmNoVGVybSAgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiAuPSAnKSAnOwoKICAgICAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmUgLj0gJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViOwogICAgICAgICAgICAgICAgJE5lZWRKb2luID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCROZWVkSm9pbikgewogICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkRnJvbSAuPSAiCiAgICAgICAgICAgICAgICBJTk5FUiBKT0lOIGR5bmFtaWNfZmllbGRfdmFsdWUgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyCiAgICAgICAgICAgICAgICAgICAgT04gKGRmX29ial9pZF9uYW1lLm9iamVjdF9pZCA9IGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5vYmplY3RfaWQKICAgICAgICAgICAgICAgICAgICAgICAgQU5EIGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5maWVsZF9pZCA9ICIKICAgICAgICAgICAgICAgIC4gJERCT2JqZWN0LT5RdW90ZSggJER5bmFtaWNGaWVsZC0+e0lEfSwgJ0ludGVnZXInICkgLiAiKQogICAgICAgICAgICAiOwoKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgRXhlY3V0ZSBhIGR5bmFtaWMgZmllbGQgc2VhcmNoLCBpZiBhIGR5bmFtaWMgZmllbGQgd2hlcmUgc3RhdGVtZW50IGV4aXN0cy4KICAgIGlmICgkU1FMRHluYW1pY0ZpZWxkV2hlcmUpIHsKCiAgICAgICAgbXkgQER5bmFtaWNGaWVsZFVzZXJMb2dpbnM7CgogICAgICAgIG15ICRTUUxEeW5hbWljRmllbGQgPSAiU0VMRUNUIERJU1RJTkNUKGRmX29ial9pZF9uYW1lLm9iamVjdF9uYW1lKSBGUk9NIGR5bmFtaWNfZmllbGRfb2JqX2lkX25hbWUgZGZfb2JqX2lkX25hbWUgIgogICAgICAgICAgICAuICRTUUxEeW5hbWljRmllbGRGcm9tCiAgICAgICAgICAgIC4gIiBXSEVSRSAiCiAgICAgICAgICAgIC4gJFNRTER5bmFtaWNGaWVsZFdoZXJlOwoKICAgICAgICBteSAkVXNlZENhY2hlOwoKICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewoKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2hEZXRhaWxEeW5hbWljRmllbGRzJywKICAgICAgICAgICAgICAgIEtleSAgPT4gJFNRTER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkRHluYW1pY0ZpZWxkU2VhcmNoQ2FjaGVEYXRhICkgewogICAgICAgICAgICAgICAgaWYgKCByZWYgJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRVc2VyTG9naW5zID0gQHskRHluYW1pY0ZpZWxkU2VhcmNoQ2FjaGVEYXRhfTsKCiAgICAgICAgICAgICAgICAgICAgJFVzZWRDYWNoZSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ludmFsaWQgcmVmICcgLiByZWYoJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSkgLiAnIScKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBHZXQgdGhlIGRhdGEgb25seSBmcm9tIGRhdGFiYXNlLCBpZiBubyBjYWNoZSBlbnRyeSBleGlzdHMuCiAgICAgICAgaWYgKCAhJFVzZWRDYWNoZSApIHsKCiAgICAgICAgICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgICAgICAgICAgU1FMID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZFVzZXJMb2dpbnMsICRSb3dbMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2hEZXRhaWxEeW5hbWljRmllbGRzJywKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkU1FMRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IFxARHluYW1pY0ZpZWxkVXNlckxvZ2lucywKICAgICAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEFkZCB0aGUgdXNlciBsb2dpbnMgZnJvbSB0aGUgZHluYW1pYyBmaWVsZHMsIGlmIGEgc2VhcmNoIHJlc3VsdCBleGlzdHMgZnJvbSB0aGUgZHluYW1pYyBmaWVsZCBzZWFyY2gKICAgICAgICAjICAgb3Igc2tpcCB0aGUgc2VhcmNoIGFuZCByZXR1cm4gYSBlbXB0cnkgYXJyYXkgcmVmLCBpZiBubyB1c2VyIGxvZ2lucyBleGlzdHMgZnJvbSB0aGUgZHluYW1pYyBmaWVsZCBzZWFyY2guCiAgICAgICAgaWYgKEBEeW5hbWljRmllbGRVc2VyTG9naW5zKSB7CgogICAgICAgICAgICBteSAkU1FMUXVlcnlJbkNvbmRpdGlvbiA9ICREQk9iamVjdC0+UXVlcnlJbkNvbmRpdGlvbigKICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJLZXl9LAogICAgICAgICAgICAgICAgVmFsdWVzICAgPT4gXEBEeW5hbWljRmllbGRVc2VyTG9naW5zLAogICAgICAgICAgICAgICAgQmluZE1vZGUgPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQFNRTFdoZXJlLCAkU1FMUXVlcnlJbkNvbmRpdGlvbjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkUmVzdWx0IGVxICdDT1VOVCcgPyAwIDogW107CiAgICAgICAgfQogICAgfQoKICAgIEZJRUxEOgogICAgZm9yIG15ICRGaWVsZCAoQEFycmF5U2VhcmNoRmllbGRzKSB7CgogICAgICAgIG5leHQgRklFTEQgaWYgIUB7ICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSB9OwoKICAgICAgICBteSAkU1FMUXVlcnlJbkNvbmRpdGlvbiA9ICREQk9iamVjdC0+UXVlcnlJbkNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgICAgPT4gJEZpZWxkLT57RGF0YWJhc2VGaWVsZH0sCiAgICAgICAgICAgIFZhbHVlcyAgID0+ICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSwKICAgICAgICAgICAgQmluZE1vZGUgPT4gMCwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgJFNRTFF1ZXJ5SW5Db25kaXRpb247CiAgICB9CgogICAgIyBTcGVjaWFsIHBhcmFtZXRlciBmb3IgQ3VzdG9tZXJJRHMgZnJvbSBhIGN1c3RvbWVyIGNvbXBhbnkgc2VhcmNoIHJlc3VsdC4KICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17Q3VzdG9tZXJDb21wYW55U2VhcmNoQ3VzdG9tZXJJRHN9ICkgKSB7CgogICAgICAgIG15ICRTUUxRdWVyeUluQ29uZGl0aW9uID0gJERCT2JqZWN0LT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICA9PiAkU2VsZi0+e0N1c3RvbWVySUR9LAogICAgICAgICAgICBWYWx1ZXMgICA9PiAkUGFyYW17Q3VzdG9tZXJDb21wYW55U2VhcmNoQ3VzdG9tZXJJRHN9LAogICAgICAgICAgICBCaW5kTW9kZSA9PiAwLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAkU1FMUXVlcnlJbkNvbmRpdGlvbjsKICAgIH0KCiAgICAjIFNwZWNpYWwgcGFyYW1ldGVyIHRvIGV4Y2x1ZGUgc29tZSB1c2VyIGxvZ2lucyBmcm9tIHRoZSBzZWFyY2ggcmVzdWx0LgogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtFeGNsdWRlVXNlckxvZ2luc30gKSApIHsKCiAgICAgICAgbXkgJFNRTFF1ZXJ5SW5Db25kaXRpb24gPSAkREJPYmplY3QtPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJLZXl9LAogICAgICAgICAgICBWYWx1ZXMgICA9PiAkUGFyYW17RXhjbHVkZVVzZXJMb2dpbnN9LAogICAgICAgICAgICBCaW5kTW9kZSA9PiAwLAogICAgICAgICAgICBOZWdhdGUgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAkU1FMUXVlcnlJbkNvbmRpdGlvbjsKICAgIH0KCiAgICAjIEFkZCB0aGUgdmFsaWQgb3B0aW9uIGlmIG5lZWRlZC4KICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJWYWxpZH0gJiYgJFZhbGlkICkgewoKICAgICAgICBteSAkVmFsaWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsCiAgICAgICAgICAgICIkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclZhbGlkfSBJTiAoIiAuIGpvaW4oICcsICcsICRWYWxpZE9iamVjdC0+VmFsaWRJRHNHZXQoKSApIC4gIikgIjsKICAgIH0KCiAgICAjIENoZWNrIGlmIE9yZGVyQnkgY29udGFpbnMgb25seSB1bmlxdWUgdmFsaWQgdmFsdWVzLgogICAgbXkgJU9yZGVyQnlTZWVuOwogICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CgogICAgICAgIGlmICggISRPcmRlckJ5IHx8ICRPcmRlckJ5U2VlbnskT3JkZXJCeX0gKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiT3JkZXJCeSBjb250YWlucyBpbnZhbGlkIHZhbHVlICckT3JkZXJCeScgb3IgdGhlIHZhbHVlIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBSZW1lbWJlciB0aGUgdmFsdWUgdG8gY2hlY2sgaWYgaXQgYXBwZWFycyBtb3JlIHRoYW4gb25jZS4KICAgICAgICAkT3JkZXJCeVNlZW57JE9yZGVyQnl9ID0gMTsKICAgIH0KCiAgICAjIENoZWNrIGlmIE9yZGVyQnlEaXJlY3Rpb24gYXJyYXkgY29udGFpbnMgb25seSAnVXAnIG9yICdEb3duJy4KICAgIERJUkVDVElPTjoKICAgIGZvciBteSAkRGlyZWN0aW9uICggQHsgJFBhcmFte09yZGVyQnlEaXJlY3Rpb259IH0gKSB7CgogICAgICAgICMgT25seSAnVXAnIG9yICdEb3duJyBhbGxvd2VkLgogICAgICAgIG5leHQgRElSRUNUSU9OIGlmICREaXJlY3Rpb24gZXEgJ1VwJzsKICAgICAgICBuZXh0IERJUkVDVElPTiBpZiAkRGlyZWN0aW9uIGVxICdEb3duJzsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPcmRlckJ5RGlyZWN0aW9uIGNhbiBvbmx5IGNvbnRhaW4gJ1VwJyBvciAnRG93bichIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIEJ1aWxkIHRoZSBzcWwgc3RhdGVtZW50IGZvciB0aGUgc2VhcmNoLgogICAgbXkgJFNRTCA9ICJTRUxFQ1QgRElTVElOQ1QoJFNlbGYtPntDdXN0b21lcktleX0pIjsKCiAgICAjIE1vZGlmeSBTUUwgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewogICAgICAgICRTUUwgPSAiU0VMRUNUIENPVU5UKERJU1RJTkNUKCRTZWxmLT57Q3VzdG9tZXJLZXl9KSkiOwogICAgfQoKICAgICMgQXNzZW1ibGUgdGhlIE9SREVSIEJZIGNsYXVzZS4KICAgIG15IEBTUUxPcmRlckJ5OwoKICAgICMgVGhlIE9yZGVyIGJ5IGNsYXVzZSBpcyBub3QgbmVlZGVkIGZvciB0aGUgcmVzdWx0IHR5cGUgJ0NPVU5UJy4KICAgIGlmICggJFJlc3VsdCBuZSAnQ09VTlQnICkgewoKICAgICAgICBteSAkQ291bnQgPSAwOwoKICAgICAgICBPUkRFUkJZOgogICAgICAgIGZvciBteSAkT3JkZXJCeSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgewoKICAgICAgICAgICAgbXkgJERpcmVjdGlvbiA9ICdERVNDJzsKCiAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSApIHsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnVXAnICkgewogICAgICAgICAgICAgICAgICAgICREaXJlY3Rpb24gPSAnQVNDJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnRG93bicgKSB7CiAgICAgICAgICAgICAgICAgICAgJERpcmVjdGlvbiA9ICdERVNDJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJENvdW50Kys7CgogICAgICAgICAgICBuZXh0IE9SREVSQlkgaWYgISRPcmRlckJ5VGFibGV7JE9yZGVyQnl9OwoKICAgICAgICAgICAgcHVzaCBAU1FMT3JkZXJCeSwgIiRPcmRlckJ5VGFibGV7JE9yZGVyQnl9ICREaXJlY3Rpb24iOwoKICAgICAgICAgICAgbmV4dCBPUkRFUkJZIGlmICRPcmRlckJ5IGVxICdVc2VyTG9naW4nOwoKICAgICAgICAgICAgJFNRTCAuPSAiLCAkT3JkZXJCeVRhYmxleyRPcmRlckJ5fSI7CiAgICAgICAgfQoKICAgICAgICAjIElmIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCB0aGUgb3JkZXJpbmcgaXMgbm90IGRldGVybWluZWQKICAgICAgICAjICAgd2UgYWRkIGFuIGRlc2NlbmRpbmcgb3JkZXJpbmcgYnkgaWQuCiAgICAgICAgaWYgKCAhZ3JlcCB7ICRfIGVxICdVc2VyTG9naW4nIH0gKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApICkgewogICAgICAgICAgICBwdXNoIEBTUUxPcmRlckJ5LCAiJFNlbGYtPntDdXN0b21lcktleX0gREVTQyI7CiAgICAgICAgfQogICAgfQoKICAgICRTUUwgLj0gIiBGUk9NICRTZWxmLT57Q3VzdG9tZXJUYWJsZX0gIjsKCiAgICBpZiAoQFNRTFdoZXJlKSB7CiAgICAgICAgbXkgJFNRTFdoZXJlU3RyaW5nID0gam9pbiAnIEFORCAnLCBtYXAgeyIoICRfICkifSBAU1FMV2hlcmU7CiAgICAgICAgJFNRTCAuPSAiV0hFUkUgJFNRTFdoZXJlU3RyaW5nICI7CiAgICB9CiAgICBpZiAoQFNRTE9yZGVyQnkpIHsKICAgICAgICBteSAkT3JkZXJCeVN0cmluZyA9IGpvaW4gJywgJywgQFNRTE9yZGVyQnk7CiAgICAgICAgJFNRTCAuPSAiT1JERVIgQlkgJE9yZGVyQnlTdHJpbmciOwogICAgfQoKICAgICMgQ2hlY2sgaWYgYSBjYWNoZSBleGlzdHMgYmVmb3JlIHdlIGFzayB0aGUgZGF0YWJhc2UuCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewoKICAgICAgICBteSAkQ2FjaGVEYXRhID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsJywKICAgICAgICAgICAgS2V5ICA9PiAkU1FMIC4gJFBhcmFte0xpbWl0fSwKICAgICAgICApOwoKICAgICAgICBpZiAoIGRlZmluZWQgJENhY2hlRGF0YSApIHsKICAgICAgICAgICAgaWYgKCByZWYgJENhY2hlRGF0YSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRDYWNoZURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCByZWYgJENhY2hlRGF0YSBlcSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkQ2FjaGVEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIHJlZiAnIC4gcmVmKCRDYWNoZURhdGEpIC4gJyEnCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBMaW1pdCA9PiAkUGFyYW17TGltaXR9LAogICAgKTsKCiAgICBteSBASURzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBASURzLCAkUm93WzBdOwogICAgfQoKICAgICMgSGFuZGxlIHRoZSBkaWZmcmVudCByZXN1bHQgdHlwZXMuCiAgICBpZiAoICRSZXN1bHQgZXEgJ0NPVU5UJyApIHsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2hEZXRhaWwnLAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJFNRTCAuICRQYXJhbXtMaW1pdH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkSURzWzBdLAogICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRJRHNbMF07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2hEZXRhaWwnLAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJFNRTCAuICRQYXJhbXtMaW1pdH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBcQElEcywKICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBcQElEczsKICAgIH0KfQoKc3ViIEN1c3RvbWVySURMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFZhbGlkICAgICAgPSBkZWZpbmVkICRQYXJhbXtWYWxpZH0gPyAkUGFyYW17VmFsaWR9IDogMTsKICAgIG15ICRTZWFyY2hUZXJtID0gJFBhcmFte1NlYXJjaFRlcm19IHx8ICcnOwoKICAgIG15ICRDYWNoZVR5cGUgPSAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVySURMaXN0JzsKICAgIG15ICRDYWNoZUtleSAgPSAiQ3VzdG9tZXJJRExpc3Q6OiR7VmFsaWR9OjokU2VhcmNoVGVybSI7CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkQ2FjaGVUeXBlLAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiBAeyRSZXN1bHR9IGlmIHJlZiAkUmVzdWx0IGVxICdBUlJBWSc7CiAgICB9CgogICAgbXkgJFNRTCA9ICIKICAgICAgICBTRUxFQ1QgRElTVElOQ1QoJFNlbGYtPntDdXN0b21lcklEfSkKICAgICAgICBGUk9NICRTZWxmLT57Q3VzdG9tZXJUYWJsZX0KICAgICAgICBXSEVSRSAxID0gMSAiOwogICAgbXkgQEJpbmQ7CgogICAgIyBhZGQgdmFsaWQgb3B0aW9uCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVmFsaWR9ICYmICRWYWxpZCApIHsKCiAgICAgICAgIyBnZXQgdmFsaWQgb2JqZWN0CiAgICAgICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CgogICAgICAgIG15ICRWYWxpZElEcyA9IGpvaW4oICcsICcsICRWYWxpZE9iamVjdC0+VmFsaWRJRHNHZXQoKSApOwogICAgICAgICRTUUwgLj0gIgogICAgICAgICAgICBBTkQgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJWYWxpZH0gSU4gKCRWYWxpZElEcykgIjsKICAgIH0KCiAgICAjIGFkZCBzZWFyY2ggdGVybQogICAgaWYgKCRTZWFyY2hUZXJtKSB7CiAgICAgICAgbXkgJFNlYXJjaFRlcm1Fc2NhcGVkID0gJFNlbGYtPntEQk9iamVjdH0tPlF1ZXJ5U3RyaW5nRXNjYXBlKCBRdWVyeVN0cmluZyA9PiAkU2VhcmNoVGVybSApOwoKICAgICAgICAkU1FMIC49ICcgQU5EICc7CiAgICAgICAgbXkgJVF1ZXJ5Q29uZGl0aW9uID0gJFNlbGYtPntEQk9iamVjdH0tPlF1ZXJ5Q29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gJFNlYXJjaFRlcm1Fc2NhcGVkLAogICAgICAgICAgICBTZWFyY2hQcmVmaXggID0+ICRTZWxmLT57U2VhcmNoUHJlZml4fSwKICAgICAgICAgICAgU2VhcmNoU3VmZml4ICA9PiAkU2VsZi0+e1NlYXJjaFN1ZmZpeH0sCiAgICAgICAgICAgIENhc2VTZW5zaXRpdmUgPT4gJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSwKICAgICAgICAgICAgQmluZE1vZGUgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNRTCAuPSAkUXVlcnlDb25kaXRpb257U1FMfTsKICAgICAgICBwdXNoIEBCaW5kLCBAeyAkUXVlcnlDb25kaXRpb257VmFsdWVzfSB9OwoKICAgICAgICAkU1FMIC49ICcgJzsKICAgIH0KCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgbXkgQFJlc3VsdDsKCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQFJlc3VsdCwgJFJvd1swXTsKICAgIH0KCiAgICAjIGNhY2hlIHJlcXVlc3QKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJENhY2hlVHlwZSwKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcQFJlc3VsdCwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gQFJlc3VsdDsKfQoKc3ViIEN1c3RvbWVySURzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VyfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlciEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkQ3VzdG9tZXJJRHMgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAiQ3VzdG9tZXJJRHM6OiRQYXJhbXtVc2VyfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gQHskQ3VzdG9tZXJJRHN9IGlmIHJlZiAkQ3VzdG9tZXJJRHMgZXEgJ0FSUkFZJzsKICAgIH0KCiAgICAjIGdldCBjdXN0b21lciBkYXRhCiAgICBteSAlRGF0YSA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgIFVzZXIgPT4gJFBhcmFte1VzZXJ9LAogICAgKTsKCiAgICAjIHRoZXJlIGFyZSBtdWx0aSBjdXN0b21lciBpZHMKICAgIG15IEBDdXN0b21lcklEczsKICAgIGlmICggJERhdGF7VXNlckN1c3RvbWVySURzfSApIHsKCiAgICAgICAgIyB1c2VkIHNlcGFyYXRvcnMKICAgICAgICBTRVBBUkFUT1I6CiAgICAgICAgZm9yIG15ICRTZXBhcmF0b3IgKCAnOycsICcsJywgJ3wnICkgewoKICAgICAgICAgICAgbmV4dCBTRVBBUkFUT1IgaWYgJERhdGF7VXNlckN1c3RvbWVySURzfSAhfiAvXFEkU2VwYXJhdG9yXEUvOwoKICAgICAgICAgICAgIyBzcGxpdCBpdAogICAgICAgICAgICBteSBASURzID0gc3BsaXQgL1xRJFNlcGFyYXRvclxFLywgJERhdGF7VXNlckN1c3RvbWVySURzfTsKCiAgICAgICAgICAgIGZvciBteSAkSUQgKEBJRHMpIHsKICAgICAgICAgICAgICAgICRJRCA9fiBzL15ccysvL2c7CiAgICAgICAgICAgICAgICAkSUQgPX4gcy9ccyskLy9nOwogICAgICAgICAgICAgICAgcHVzaCBAQ3VzdG9tZXJJRHMsICRJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGFzdCBTRVBBUkFUT1I7CiAgICAgICAgfQoKICAgICAgICAjIGZhbGxiYWNrIGlmIG5vIHNlcGFyYXRvciBnb3QgZm91bmQKICAgICAgICBpZiAoICFAQ3VzdG9tZXJJRHMgKSB7CiAgICAgICAgICAgICREYXRhe1VzZXJDdXN0b21lcklEc30gPX4gcy9eXHMrLy9nOwogICAgICAgICAgICAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9ID1+IHMvXHMrJC8vZzsKICAgICAgICAgICAgcHVzaCBAQ3VzdG9tZXJJRHMsICREYXRhe1VzZXJDdXN0b21lcklEc307CiAgICAgICAgfQogICAgfQoKICAgICMgdXNlIGFsc28gdGhlIHByaW1hcnkgY3VzdG9tZXIgaWQKICAgIGlmICggJERhdGF7VXNlckN1c3RvbWVySUR9ICYmICEkU2VsZi0+e0V4Y2x1ZGVQcmltYXJ5Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgcHVzaCBAQ3VzdG9tZXJJRHMsICREYXRhe1VzZXJDdXN0b21lcklEfTsKICAgIH0KCiAgICAjIGNhY2hlIHJlcXVlc3QKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tZXJJRHM6OicgLiAkUGFyYW17VXNlcn0sCiAgICAgICAgICAgIFZhbHVlID0+IFxAQ3VzdG9tZXJJRHMsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBAQ3VzdG9tZXJJRHM7Cn0KCnN1YiBDdXN0b21lclVzZXJEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VyfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlciEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgYnVpbGQgc2VsZWN0CiAgICBteSAkU1FMID0gJ1NFTEVDVCAnOwogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewoKICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgJFNRTCAuPSAiICRFbnRyeS0+WzJdLCAiOwogICAgfQoKICAgIGlmICggISRTZWxmLT57Rm9yZWlnbkRCfSApIHsKICAgICAgICAkU1FMIC49ICJjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5LCAiOwogICAgfQoKICAgICRTUUwgLj0gJFNlbGYtPntDdXN0b21lcktleX0gLiAiIEZST00gJFNlbGYtPntDdXN0b21lclRhYmxlfSBXSEVSRSAiOwoKICAgICMgY2hlY2sgY2FjaGUKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAiQ3VzdG9tZXJVc2VyRGF0YUdldDo6JFBhcmFte1VzZXJ9IiwKICAgICAgICApOwogICAgICAgIHJldHVybiAleyREYXRhfSBpZiByZWYgJERhdGEgZXEgJ0hBU0gnOwogICAgfQoKICAgICMgY2hlY2sgY3VzdG9tZXIga2V5IHR5cGUKICAgIG15ICRVc2VyID0gJFBhcmFte1VzZXJ9OwoKICAgIGlmICggJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSApIHsKICAgICAgICAkU1FMIC49ICIkU2VsZi0+e0N1c3RvbWVyS2V5fSA9ID8iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNRTCAuPSAiTE9XRVIoJFNlbGYtPntDdXN0b21lcktleX0pID0gTE9XRVIoPykiOwogICAgfQoKICAgICMgYXNrIHRoZSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFsgXCRVc2VyIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlRGF0YTsKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIG15ICRNYXBDb3VudGVyID0gMDsKCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwoKICAgICAgICAgICAgJERhdGF7ICRFbnRyeS0+WzBdIH0gPSAkUm93WyRNYXBDb3VudGVyXTsKICAgICAgICAgICAgJE1hcENvdW50ZXIrKzsKICAgICAgICB9CgogICAgICAgIG5leHQgUk9XIGlmICRTZWxmLT57Rm9yZWlnbkRCfTsKCiAgICAgICAgZm9yIG15ICRLZXkgKHF3KENyZWF0ZVRpbWUgQ3JlYXRlQnkgQ2hhbmdlVGltZSBDaGFuZ2VCeSkpIHsKICAgICAgICAgICAgJERhdGF7JEtleX0gPSAkUm93WyRNYXBDb3VudGVyXTsKICAgICAgICAgICAgJE1hcENvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBkYXRhCiAgICBpZiAoICEkRGF0YXtVc2VyTG9naW59ICkgewoKICAgICAgICAjIGNhY2hlIHJlcXVlc3QKICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICAgICAgS2V5ICAgPT4gIkN1c3RvbWVyVXNlckRhdGFHZXQ6OiRQYXJhbXtVc2VyfSIsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiB7fSwKICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRDdXN0b21lclVzZXJMaXN0RmllbGRzTWFwID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyTGlzdEZpZWxkc307CiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoJEN1c3RvbWVyVXNlckxpc3RGaWVsZHNNYXApICkgewogICAgICAgICRDdXN0b21lclVzZXJMaXN0RmllbGRzTWFwID0gWyAnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnLCAnZW1haWwnLCBdOwogICAgfQoKICAgICMgT3JkZXIgZmllbGRzIGJ5IEN1c3RvbWVyVXNlckxpc3RGaWVsZHMgKHNlZSBidWcjMTM4MjEpLgogICAgbXkgQEN1c3RvbWVyVXNlckxpc3RGaWVsZHM7CiAgICBmb3IgbXkgJEZpZWxkICggQHskQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc01hcH0gKSB7CiAgICAgICAgbXkgQEZpZWxkTmFtZXMgPSBtYXAgeyAkXy0+WzBdIH0gZ3JlcCB7ICRfLT5bMl0gZXEgJEZpZWxkIH0gQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9OwogICAgICAgIHB1c2ggQEN1c3RvbWVyVXNlckxpc3RGaWVsZHMsICRGaWVsZE5hbWVzWzBdOwogICAgfQoKICAgIG15ICRVc2VyTWFpbFN0cmluZyA9ICcnOwogICAgbXkgQFVzZXJNYWlsU3RyaW5nUGFydHM7CgogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkIChAQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcykgewogICAgICAgIG5leHQgRklFTEQgaWYgISREYXRheyRGaWVsZH07CgogICAgICAgIHB1c2ggQFVzZXJNYWlsU3RyaW5nUGFydHMsICREYXRheyRGaWVsZH07CiAgICB9CiAgICAkVXNlck1haWxTdHJpbmcgPSBqb2luICcgJywgQFVzZXJNYWlsU3RyaW5nUGFydHM7CiAgICAkVXNlck1haWxTdHJpbmcgPX4gcy9eKC4qKVxzKC4rP1xALis/XC4uKz8pKFxzfCkkLyIkMSIgPCQyPi87CgogICAgIyBhZGQgdGhlIFVzZXJNYWlsU3RyaW5nIHRvIHRoZSBkYXRhIGhhc2gKICAgICREYXRhe1VzZXJNYWlsU3RyaW5nfSA9ICRVc2VyTWFpbFN0cmluZzsKCiAgICAjIGNvbXBhdCEKICAgICREYXRhe1VzZXJJRH0gPSAkRGF0YXtVc2VyTG9naW59OwoKICAgICMgZ2V0IHByZWZlcmVuY2VzCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VsZi0+R2V0UHJlZmVyZW5jZXMoIFVzZXJJRCA9PiAkRGF0YXtVc2VySUR9ICk7CgogICAgIyBhZGQgbGFzdCBsb2dpbiB0aW1lc3RhbXAKICAgIGlmICggJFByZWZlcmVuY2Vze1VzZXJMYXN0TG9naW59ICkgewoKICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIEVwb2NoID0+ICRQcmVmZXJlbmNlc3tVc2VyTGFzdExvZ2lufSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkUHJlZmVyZW5jZXN7VXNlckxhc3RMb2dpblRpbWVzdGFtcH0gPSAkRGF0ZVRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CgogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICJDdXN0b21lclVzZXJEYXRhR2V0OjokUGFyYW17VXNlcn0iLAogICAgICAgICAgICBWYWx1ZSA9PiB7ICVEYXRhLCAlUHJlZmVyZW5jZXMgfSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICggJURhdGEsICVQcmVmZXJlbmNlcyApOwp9CgpzdWIgQ3VzdG9tZXJVc2VyQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayByby9ydwogICAgaWYgKCAkU2VsZi0+e1JlYWRPbmx5fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0N1c3RvbWVyIGJhY2tlbmQgaXMgcmVhZCBvbmx5IScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICBpZiAoICEkUGFyYW17ICRFbnRyeS0+WzBdIH0gJiYgJEVudHJ5LT5bNF0gKSB7CgogICAgICAgICAgICAjIHNraXAgVXNlckxvZ2luLCB3aWxsIGJlIGNoZWNrZWQgbGF0ZXIKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAoICRFbnRyeS0+WzBdIGVxICdVc2VyTG9naW4nICk7CgogICAgICAgICAgICAjIGlnbm9yZSBkeW5hbWljIGZpZWxkcyBoZXJlCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEVudHJ5LT5bMF0hIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGlmIG5vIFVzZXJMb2dpbiBpcyBnaXZlbgogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gJiYgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57QXV0b0xvZ2luQ3JlYXRpb259ICkgewoKICAgICAgICAjIGdldCB0aW1lIG9iamVjdAogICAgICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwogICAgICAgIG15ICREYXRlVGltZVN0cmluZyA9ICREYXRlVGltZU9iamVjdC0+Rm9ybWF0KCBGb3JtYXQgPT4gJyVZJW0lZCVIJU0nICk7CgogICAgICAgIG15ICRQcmVmaXggPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntBdXRvTG9naW5DcmVhdGlvblByZWZpeH0gfHwgJ2F1dG8nOwogICAgICAgICRQYXJhbXtVc2VyTG9naW59ID0gIiRQcmVmaXgtJERhdGVUaW1lU3RyaW5nIiAuIGludCggcmFuZCg5OSkgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgbG9naW4gZXhpc3RzCiAgICBpZiAoICEkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlckxvZ2luIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzIGlmIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoICRQYXJhbXtVc2VyRW1haWx9ICYmICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlckVtYWlsVW5pcUNoZWNrfSApIHsKICAgICAgICBteSAlUmVzdWx0ID0gJFNlbGYtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICBWYWxpZCAgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIFBvc3RNYXN0ZXJTZWFyY2ggPT4gJFBhcmFte1VzZXJFbWFpbH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJVJlc3VsdCkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyktPlRyYW5zbGF0ZSgnVGhpcyBlbWFpbCBhZGRyZXNzIGlzIGFscmVhZHkgaW4gdXNlIGZvciBhbm90aGVyIGN1c3RvbWVyIHVzZXIuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2hlY2sgaXRlbSBvYmplY3QKICAgIG15ICRDaGVja0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyk7CgogICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzIG14CiAgICBpZiAoCiAgICAgICAgJFBhcmFte1VzZXJFbWFpbH0KICAgICAgICAmJiAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkUGFyYW17VXNlckVtYWlsfSApCiAgICAgICAgJiYgZ3JlcCB7ICRfIGVxICRQYXJhbXtWYWxpZElEfSB9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZElEc0dldCgpCiAgICAgICAgKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiRW1haWwgYWRkcmVzcyAoJFBhcmFte1VzZXJFbWFpbH0pIG5vdCB2YWxpZCAoIgogICAgICAgICAgICAgICAgLiAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yKCkgLiAiKSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcXVvdGUgdmFsdWVzCiAgICBteSAlVmFsdWU7CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIGlmICggJEVudHJ5LT5bNV0gPX4gL15pbnQkL2kgKSB7CiAgICAgICAgICAgIGlmICggJFBhcmFteyAkRW50cnktPlswXSB9ICkgewogICAgICAgICAgICAgICAgJFZhbHVleyAkRW50cnktPlswXSB9ID0gJFBhcmFteyAkRW50cnktPlswXSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFZhbHVleyAkRW50cnktPlswXSB9ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17ICRFbnRyeS0+WzBdIH0gKSB7CiAgICAgICAgICAgICAgICAkVmFsdWV7ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW17ICRFbnRyeS0+WzBdIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVmFsdWV7ICRFbnRyeS0+WzBdIH0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIGluc2VydAogICAgbXkgJFNRTCA9ICJJTlNFUlQgSU5UTyAkU2VsZi0+e0N1c3RvbWVyVGFibGV9ICgiOwogICAgbXkgQEJpbmQ7CiAgICBteSAlU2VlbktleTsgICAgIyBJZiB0aGUgbWFwIGNvbnRhaW5zIGR1cGxpY2F0ZWQgZmllbGQgbmFtZXMsIGluc2VydCBvbmx5IG9uY2UuCiAgICBteSBAQ29sdW1uTmFtZXM7CgogICAgTUFQRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIG5leHQgTUFQRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOyAgICAgICAgICAgICMgc2tpcCBkeW5hbWljIGZpZWxkcwogICAgICAgIG5leHQgTUFQRU5UUlkgaWYgKCBsYyggJEVudHJ5LT5bMF0gKSBlcSAidXNlcnBhc3N3b3JkIiApOwogICAgICAgIG5leHQgTUFQRU5UUlkgaWYgJFNlZW5LZXl7ICRFbnRyeS0+WzJdIH0rKzsKICAgICAgICBwdXNoIEBDb2x1bW5OYW1lcywgJEVudHJ5LT5bMl07CiAgICB9CgogICAgJFNRTCAuPSBqb2luICcsICcsIEBDb2x1bW5OYW1lczsKCiAgICBpZiAoICEkU2VsZi0+e0ZvcmVpZ25EQn0gKSB7CiAgICAgICAgJFNRTCAuPSAnLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5JzsKICAgIH0KCiAgICAkU1FMIC49ICcpIFZBTFVFUyAoJzsKCiAgICBteSAlU2VlblZhbHVlOwogICAgbXkgJEJpbmRDb2x1bW5zID0gMDsKCiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7ICAgICAgICAgICAgIyBza2lwIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbmV4dCBFTlRSWSBpZiAoIGxjKCAkRW50cnktPlswXSApIGVxICJ1c2VycGFzc3dvcmQiICk7CiAgICAgICAgbmV4dCBFTlRSWSBpZiAkU2VlblZhbHVleyAkRW50cnktPlsyXSB9Kys7CiAgICAgICAgJEJpbmRDb2x1bW5zKys7CiAgICAgICAgcHVzaCBAQmluZCwgXCRWYWx1ZXsgJEVudHJ5LT5bMF0gfTsKICAgIH0KCiAgICAkU1FMIC49IGpvaW4gJywgJywgKCc/JykgeCAkQmluZENvbHVtbnM7CgogICAgaWYgKCAhJFNlbGYtPntGb3JlaWduREJ9ICkgewogICAgICAgICRTUUwgLj0gJywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/JzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1VzZXJJRH07CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtVc2VySUR9OwogICAgfQoKICAgICRTUUwgLj0gJyknOwoKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZAogICAgKTsKCiAgICAjIGxvZyBub3RpY2UKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICBNZXNzYWdlICA9PiAiQ3VzdG9tZXJVc2VyOiAnJFBhcmFte1VzZXJMb2dpbn0nIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5ICgkUGFyYW17VXNlcklEfSkhIiwKICAgICk7CgogICAgIyBzZXQgcGFzc3dvcmQKICAgIGlmICggJFBhcmFte1VzZXJQYXNzd29yZH0gKSB7CiAgICAgICAgJFNlbGYtPlNldFBhc3N3b3JkKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0sCiAgICAgICAgICAgIFBXICAgICAgICA9PiAkUGFyYW17VXNlclBhc3N3b3JkfQogICAgICAgICk7CiAgICB9CgogICAgJFNlbGYtPl9DdXN0b21lclVzZXJDYWNoZUNsZWFyKCBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0gKTsKCiAgICByZXR1cm4gJFBhcmFte1VzZXJMb2dpbn07Cn0KCnN1YiBDdXN0b21lclVzZXJVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHJvL3J3CiAgICBpZiAoICRTZWxmLT57UmVhZE9ubHl9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ3VzdG9tZXIgYmFja2VuZCBpcyByZWFkIG9ubHkhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkUGFyYW17ICRFbnRyeS0+WzBdIH0KICAgICAgICAgICAgJiYgJEVudHJ5LT5bNV0gbmUgJ2R5bmFtaWNfZmllbGQnICAgICMgaWdub3JlIGR5bmFtaWMgZmllbGRzIGhlcmUKICAgICAgICAgICAgJiYgJEVudHJ5LT5bNF0gICAgICAgICAgICAgICAgICAgICAgICMgb25seSBjaGVjayByZXF1aXJlZCBmaWVsZHMKICAgICAgICAgICAgJiYgJEVudHJ5LT5bMF0gbmUgJ1VzZXJQYXNzd29yZCcgICAgICMgaWdub3JlIFVzZXJQYXNzd29yZCBmaWVsZAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkRW50cnktPlswXSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNoZWNrIGl0ZW0gb2JqZWN0CiAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgaWYgKAogICAgICAgICRQYXJhbXtVc2VyRW1haWx9CiAgICAgICAgJiYgISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJFBhcmFte1VzZXJFbWFpbH0gKQogICAgICAgICYmIGdyZXAgeyAkXyBlcSAkUGFyYW17VmFsaWRJRH0gfSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKQogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkVtYWlsIGFkZHJlc3MgKCRQYXJhbXtVc2VyRW1haWx9KSBub3QgdmFsaWQgKCIKICAgICAgICAgICAgICAgIC4gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvcigpIC4gIikhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBvbGQgdXNlciBkYXRhIChwdykKICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRQYXJhbXtJRH0gKTsKCiAgICAjIGlmIHdlIHVwZGF0ZSB0aGUgZW1haWwgYWRkcmVzcywgY2hlY2sgaWYgaXQgYWxyZWFkeSBleGlzdHMKICAgIGlmICgKICAgICAgICAkUGFyYW17VXNlckVtYWlsfQogICAgICAgICYmICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlckVtYWlsVW5pcUNoZWNrfQogICAgICAgICYmIGxjICRQYXJhbXtVc2VyRW1haWx9IG5lIGxjICRVc2VyRGF0YXtVc2VyRW1haWx9CiAgICAgICAgKQogICAgewogICAgICAgIG15ICVSZXN1bHQgPSAkU2VsZi0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgIFZhbGlkICAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgUG9zdE1hc3RlclNlYXJjaCA9PiAkUGFyYW17VXNlckVtYWlsfSwKICAgICAgICApOwogICAgICAgIGlmICglUmVzdWx0KSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKS0+VHJhbnNsYXRlKCdUaGlzIGVtYWlsIGFkZHJlc3MgaXMgYWxyZWFkeSBpbiB1c2UgZm9yIGFub3RoZXIgY3VzdG9tZXIgdXNlci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHF1b3RlIHZhbHVlcwogICAgbXkgJVZhbHVlOwogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICBpZiAoICRFbnRyeS0+WzVdID1+IC9eaW50JC9pICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXsgJEVudHJ5LT5bMF0gfSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZXsgJEVudHJ5LT5bMF0gfSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRWYWx1ZXsgJEVudHJ5LT5bMF0gfSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggJFBhcmFteyAkRW50cnktPlswXSB9ICkgewogICAgICAgICAgICAgICAgJFZhbHVleyAkRW50cnktPlswXSB9ID0gJFBhcmFteyAkRW50cnktPlswXSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFZhbHVleyAkRW50cnktPlswXSB9ID0gIiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB1cGRhdGUgZGIKICAgIG15ICRTUUwgPSAiVVBEQVRFICRTZWxmLT57Q3VzdG9tZXJUYWJsZX0gU0VUICI7CiAgICBteSBAQmluZDsKCiAgICBteSAlU2VlbktleTsgICAgIyBJZiB0aGUgbWFwIGNvbnRhaW5zIGR1cGxpY2F0ZWQgZmllbGQgbmFtZXMsIGluc2VydCBvbmx5IG9uY2UuCiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7ICAgICAgICAgICAgIyBza2lwIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPls3XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBza2lwIHJlYWRvbmx5IGZpZWxkcwogICAgICAgIG5leHQgRU5UUlkgaWYgKCBsYyggJEVudHJ5LT5bMF0gKSBlcSAidXNlcnBhc3N3b3JkIiApOwogICAgICAgIG5leHQgRU5UUlkgaWYgJFNlZW5LZXl7ICRFbnRyeS0+WzJdIH0rKzsKICAgICAgICAkU1FMIC49ICIgJEVudHJ5LT5bMl0gPSA/LCAiOwogICAgICAgIHB1c2ggQEJpbmQsIFwkVmFsdWV7ICRFbnRyeS0+WzBdIH07CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntGb3JlaWduREJ9ICkgewogICAgICAgICRTUUwgLj0gJ2NoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8nOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17VXNlcklEfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGNob3AgJFNRTDsKICAgICAgICBjaG9wICRTUUw7CiAgICB9CgogICAgJFNRTCAuPSAnIFdIRVJFICc7CgogICAgaWYgKCAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ICkgewogICAgICAgICRTUUwgLj0gIiRTZWxmLT57Q3VzdG9tZXJLZXl9ID0gPyI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU1FMIC49ICJMT1dFUigkU2VsZi0+e0N1c3RvbWVyS2V5fSkgPSBMT1dFUig/KSI7CiAgICB9CiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0lEfTsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQKICAgICk7CgogICAgIyBjaGVjayBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSBDdXN0b21lciBQcmVmZXJlbmNlcwogICAgaWYgKCAkUGFyYW17VXNlckxvZ2lufSBuZSAkVXNlckRhdGF7VXNlckxvZ2lufSApIHsKCiAgICAgICAgIyB1cGRhdGUgdGhlIHByZWZlcmVuY2VzCiAgICAgICAgJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlJlbmFtZVByZWZlcmVuY2VzKAogICAgICAgICAgICBOZXdVc2VySUQgPT4gJFBhcmFte1VzZXJMb2dpbn0sCiAgICAgICAgICAgIE9sZFVzZXJJRCA9PiAkVXNlckRhdGF7VXNlckxvZ2lufSwKICAgICAgICApOwogICAgfQoKICAgICMgbG9nIG5vdGljZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgIE1lc3NhZ2UgID0+ICJDdXN0b21lclVzZXI6ICckUGFyYW17VXNlckxvZ2lufScgdXBkYXRlZCBzdWNjZXNzZnVsbHkgKCRQYXJhbXtVc2VySUR9KSEiLAogICAgKTsKCiAgICAjIGNoZWNrIHB3CiAgICBpZiAoICRQYXJhbXtVc2VyUGFzc3dvcmR9ICkgewogICAgICAgICRTZWxmLT5TZXRQYXNzd29yZCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICBQVyAgICAgICAgPT4gJFBhcmFte1VzZXJQYXNzd29yZH0KICAgICAgICApOwogICAgfQoKICAgICRTZWxmLT5fQ3VzdG9tZXJVc2VyQ2FjaGVDbGVhciggVXNlckxvZ2luID0+ICRQYXJhbXtVc2VyTG9naW59ICk7CiAgICBpZiAoICRQYXJhbXtVc2VyTG9naW59IG5lICRVc2VyRGF0YXtVc2VyTG9naW59ICkgewogICAgICAgICRTZWxmLT5fQ3VzdG9tZXJVc2VyQ2FjaGVDbGVhciggVXNlckxvZ2luID0+ICRVc2VyRGF0YXtVc2VyTG9naW59ICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBTZXRQYXNzd29yZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byBLZXJuZWw6OlN5c3RlbTo6VXNlcjo6U2V0UGFzc3dvcmQoKQoKICAgICMgY2hlY2sgcm8vcncKICAgIGlmICggJFNlbGYtPntSZWFkT25seX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDdXN0b21lciBiYWNrZW5kIGlzIHJlYWQgb25seSEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkTG9naW4gPSAkUGFyYW17VXNlckxvZ2lufTsKICAgIG15ICRQdyAgICA9ICRQYXJhbXtQV30gfHwgJyc7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRMb2dpbiApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlckxvZ2luIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgVE9ETzogYWRkIGNoZWNrIHdoZXRoZXIgdGhlIEN1c3RvbWVyVXNlciBleGlzdHMKCiAgICBteSAkQ3J5cHRlZFB3ID0gJyc7CgogICAgbXkgJENvbmZpZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJENvbmZpZ1NlY3Rpb24gPSAnQ3VzdG9tZXI6OkF1dGhNb2R1bGU6OkRCJzsKCiAgICBteSAkQ3J5cHRUeXBlID0gJENvbmZpZ09iamVjdC0+R2V0KCIke0NvbmZpZ1NlY3Rpb259OjpDcnlwdFR5cGUiKSB8fCAnc2hhMic7CgogICAgbXkgJEVuY29kZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKTsKCiAgICAjIGNyeXB0IHBsYWluIChubyBjcnlwdCBhdCBhbGwpCiAgICBpZiAoICRDcnlwdFR5cGUgZXEgJ3BsYWluJyApIHsKICAgICAgICAkQ3J5cHRlZFB3ID0gJFB3OwogICAgfQoKICAgICMgY3J5cHQgd2l0aCBVTklYIGNyeXB0CiAgICBlbHNpZiAoICRDcnlwdFR5cGUgZXEgJ2NyeXB0JyApIHsKCiAgICAgICAgIyBlbmNvZGUgb3V0cHV0LCBuZWVkZWQgYnkgY3J5cHQoKSBvbmx5IG5vbiB1dGY4IHNpZ25zCiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlT3V0cHV0KCBcJFB3ICk7CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlT3V0cHV0KCBcJExvZ2luICk7CgogICAgICAgICRDcnlwdGVkUHcgPSBjcnlwdCggJFB3LCAkTG9naW4gKTsKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVJbnB1dCggXCRDcnlwdGVkUHcgKTsKICAgIH0KCiAgICAjIGNyeXB0IHdpdGggdW5peF9tZDVfY3J5cHQKICAgIGVsc2lmICggJENyeXB0VHlwZSBlcSAnbWQ1JyB8fCAhJENyeXB0VHlwZSApIHsKCiAgICAgICAgIyBlbmNvZGUgb3V0cHV0LCBuZWVkZWQgYnkgdW5peF9tZDVfY3J5cHQoKSBvbmx5IG5vbiB1dGY4IHNpZ25zCiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlT3V0cHV0KCBcJFB3ICk7CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlT3V0cHV0KCBcJExvZ2luICk7CgogICAgICAgICRDcnlwdGVkUHcgPSB1bml4X21kNV9jcnlwdCggJFB3LCAkTG9naW4gKTsKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVJbnB1dCggXCRDcnlwdGVkUHcgKTsKICAgIH0KCiAgICAjIGNyeXB0IHdpdGggbWQ1IChjb21wYXRpYmxlIHdpdGggQXBhY2hlJ3MgLmh0cGFzc3dkIGZpbGVzKQogICAgZWxzaWYgKCAkQ3J5cHRUeXBlIGVxICdhcHIxJyApIHsKCiAgICAgICAgIyBlbmNvZGUgb3V0cHV0LCBuZWVkZWQgYnkgYXBhY2hlX21kNV9jcnlwdCgpIG9ubHkgbm9uIHV0Zjggc2lnbnMKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkUHcgKTsKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkTG9naW4gKTsKCiAgICAgICAgJENyeXB0ZWRQdyA9IGFwYWNoZV9tZDVfY3J5cHQoICRQdywgJExvZ2luICk7CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlSW5wdXQoIFwkQ3J5cHRlZFB3ICk7CiAgICB9CgogICAgIyBjcnlwdCB3aXRoIHNoYTEKICAgIGVsc2lmICggJENyeXB0VHlwZSBlcSAnc2hhMScgKSB7CgogICAgICAgIG15ICRTSEFPYmplY3QgPSBEaWdlc3Q6OlNIQS0+bmV3KCdzaGExJyk7CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlT3V0cHV0KCBcJFB3ICk7CiAgICAgICAgJFNIQU9iamVjdC0+YWRkKCRQdyk7CiAgICAgICAgJENyeXB0ZWRQdyA9ICRTSEFPYmplY3QtPmhleGRpZ2VzdCgpOwogICAgfQoKICAgICMgY3J5cHQgd2l0aCBzaGE1MTIKICAgIGVsc2lmICggJENyeXB0VHlwZSBlcSAnc2hhNTEyJyApIHsKCiAgICAgICAgbXkgJFNIQU9iamVjdCA9IERpZ2VzdDo6U0hBLT5uZXcoJ3NoYTUxMicpOwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZU91dHB1dCggXCRQdyApOwogICAgICAgICRTSEFPYmplY3QtPmFkZCgkUHcpOwogICAgICAgICRDcnlwdGVkUHcgPSAkU0hBT2JqZWN0LT5oZXhkaWdlc3QoKTsKICAgIH0KCiAgICAjIGJjcnlwdAogICAgZWxzaWYgKCAkQ3J5cHRUeXBlIGVxICdiY3J5cHQnICkgewoKICAgICAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCdDcnlwdDo6RWtzYmxvd2Zpc2g6OkJjcnlwdCcpICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ3VzdG9tZXJVc2VyOiAnJExvZ2luJyB0cmllZCB0byBzdG9yZSBwYXNzd29yZCB3aXRoIGJjcnlwdCBidXQgJ0NyeXB0OjpFa3NibG93ZmlzaDo6QmNyeXB0JyBpcyBub3QgaW5zdGFsbGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIG15ICRDb3N0ID0gJENvbmZpZ09iamVjdC0+R2V0KCIke0NvbmZpZ1NlY3Rpb259OjpiY3J5cHRDb3N0IikgLy8gMTI7CgogICAgICAgICMgRG9uJ3QgYWxsb3cgdmFsdWVzIHNtYWxsZXIgdGhhbiA5IGZvciBzZWN1cml0eS4KICAgICAgICAkQ29zdCA9IDkgaWYgJENvc3QgPCA5OwoKICAgICAgICAjIEN1cnJlbnQgQ3J5cHQ6OkVrc2Jsb3dmaXNoOjpCY3J5cHQgbGltaXQgaXMgMzEuCiAgICAgICAgJENvc3QgPSAzMSBpZiAkQ29zdCA+IDMxOwoKICAgICAgICBteSAkU2FsdCA9ICRNYWluT2JqZWN0LT5HZW5lcmF0ZVJhbmRvbVN0cmluZyggTGVuZ3RoID0+IDE2ICk7CgogICAgICAgICMgcmVtb3ZlIFVURjggZmxhZywgcmVxdWlyZWQgYnkgQ3J5cHQ6OkVrc2Jsb3dmaXNoOjpCY3J5cHQKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkUHcgKTsKCiAgICAgICAgIyBjYWxjdWxhdGUgcGFzc3dvcmQgaGFzaAogICAgICAgIG15ICRPY3RldHMgPSBDcnlwdDo6RWtzYmxvd2Zpc2g6OkJjcnlwdDo6YmNyeXB0X2hhc2goCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGtleV9udWwgPT4gMSwKICAgICAgICAgICAgICAgIGNvc3QgICAgPT4gJENvc3QsCiAgICAgICAgICAgICAgICBzYWx0ICAgID0+ICRTYWx0LAogICAgICAgICAgICB9LAogICAgICAgICAgICAkUHcKICAgICAgICApOwoKICAgICAgICAjIFdlIHdpbGwgc3RvcmUgY29zdCBhbmQgc2FsdCBpbiB0aGUgcGFzc3dvcmQgc3RyaW5nIHNvIHRoYXQgaXQgY2FuIGJlIGRlY29kZWQKICAgICAgICAjICAgaW4gZnV0dXJlIGV2ZW4gaWYgd2UgdXNlIGEgaGlnaGVyIGNvc3QgYnkgZGVmYXVsdC4KICAgICAgICAkQ3J5cHRlZFB3ID0gIkJDUllQVDokQ29zdDokU2FsdDoiIC4gQ3J5cHQ6OkVrc2Jsb3dmaXNoOjpCY3J5cHQ6OmVuX2Jhc2U2NCgkT2N0ZXRzKTsKICAgIH0KCiAgICAjIGNyeXB0IHdpdGggc2hhMjU2IGFzIGZhbGxiYWNrCiAgICBlbHNlIHsKCiAgICAgICAgbXkgJFNIQU9iamVjdCA9IERpZ2VzdDo6U0hBLT5uZXcoJ3NoYTI1NicpOwoKICAgICAgICAjIGVuY29kZSBvdXRwdXQsIG5lZWRlZCBieSBzaGEyNTZfaGV4KCkgb25seSBub24gdXRmOCBzaWducwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZU91dHB1dCggXCRQdyApOwoKICAgICAgICAkU0hBT2JqZWN0LT5hZGQoJFB3KTsKICAgICAgICAkQ3J5cHRlZFB3ID0gJFNIQU9iamVjdC0+aGV4ZGlnZXN0KCk7CiAgICB9CgogICAgIyB1cGRhdGUgZGIKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgaWYgKCAkRW50cnktPlswXSA9fiAvXlVzZXJQYXNzd29yZCQvaSApIHsKICAgICAgICAgICAgJFBhcmFte1Bhc3N3b3JkQ29sfSA9ICRFbnRyeS0+WzJdOwogICAgICAgIH0KICAgICAgICBpZiAoICRFbnRyeS0+WzBdID1+IC9eVXNlckxvZ2luJC9pICkgewogICAgICAgICAgICAkUGFyYW17TG9naW5Db2x9ID0gJEVudHJ5LT5bMl07CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgbmVlZGVkIHB3IGNvbC4gZXhpc3RzIChlbHNlIHRoZXJlIGlzIG5vIHB3IGNvbC4pCiAgICBpZiAoICRQYXJhbXtQYXNzd29yZENvbH0gJiYgJFBhcmFte0xvZ2luQ29sfSApIHsKICAgICAgICBteSAkU1FMID0gIlVQREFURSAkU2VsZi0+e0N1c3RvbWVyVGFibGV9IFNFVCAiCiAgICAgICAgICAgIC4gIiAkUGFyYW17UGFzc3dvcmRDb2x9ID0gPyAiCiAgICAgICAgICAgIC4gIiBXSEVSRSAiOwoKICAgICAgICBpZiAoICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0gKSB7CiAgICAgICAgICAgICRTUUwgLj0gIiRQYXJhbXtMb2dpbkNvbH0gPSA/IjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTUUwgLj0gIkxPV0VSKCRQYXJhbXtMb2dpbkNvbH0pID0gTE9XRVIoPykiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICAgICAgQmluZCA9PiBbIFwkQ3J5cHRlZFB3LCBcJFBhcmFte1VzZXJMb2dpbn0gXSwKICAgICAgICApOwoKICAgICAgICAjIGxvZyBub3RpY2UKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDdXN0b21lclVzZXI6ICckUGFyYW17VXNlckxvZ2lufScgY2hhbmdlZCBwYXNzd29yZCBzdWNjZXNzZnVsbHkhIiwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+X0N1c3RvbWVyVXNlckNhY2hlQ2xlYXIoIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSApOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIG5lZWQgbm8gcHcgdG8gc2V0CiAgICByZXR1cm4gMTsKfQoKc3ViIEdlbmVyYXRlUmFuZG9tUGFzc3dvcmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdlbmVyYXRlZCBwYXNzd29yZHMgYXJlIGVpZ2h0IGNoYXJhY3RlcnMgbG9uZyBieSBkZWZhdWx0CiAgICBteSAkU2l6ZSA9ICRQYXJhbXtTaXplfSB8fCA4OwoKICAgIG15ICRQYXNzd29yZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkdlbmVyYXRlUmFuZG9tU3RyaW5nKAogICAgICAgIExlbmd0aCA9PiAkU2l6ZSwKICAgICk7CgogICAgcmV0dXJuICRQYXNzd29yZDsKfQoKc3ViIFNldFByZWZlcmVuY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFNlbGYtPl9DdXN0b21lclVzZXJDYWNoZUNsZWFyKCBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJJRH0gKTsKCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNldFByZWZlcmVuY2VzKCVQYXJhbSk7Cn0KCnN1YiBHZXRQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+R2V0UHJlZmVyZW5jZXMoJVBhcmFtKTsKfQoKc3ViIFNlYXJjaFByZWZlcmVuY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5TZWFyY2hQcmVmZXJlbmNlcyglUGFyYW0pOwp9CgpzdWIgX0N1c3RvbWVyVXNlckNhY2hlQ2xlYXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57Q2FjaGVPYmplY3R9OwoKICAgIGlmICggISRQYXJhbXtVc2VyTG9naW59ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VyTG9naW4hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gIkN1c3RvbWVyVXNlckRhdGFHZXQ6OiRQYXJhbXtVc2VyTG9naW59IiwKICAgICk7CiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gIkN1c3RvbWVyTmFtZTo6JFBhcmFte1VzZXJMb2dpbn0iLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAiQ3VzdG9tZXJJRHM6OiRQYXJhbXtVc2VyTG9naW59IiwKICAgICk7CgogICAgIyBkZWxldGUgYWxsIHNlYXJjaCBjYWNoZSBlbnRyaWVzCiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJJRExpc3QnLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaCcsCiAgICApOwogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsJywKICAgICk7CiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2hEZXRhaWxEeW5hbWljRmllbGRzJywKICAgICk7CgogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAnQ3VzdG9tZXJHcm91cCcsCiAgICApOwoKICAgIGZvciBteSAkRnVuY3Rpb24gKHF3KEN1c3RvbWVyVXNlckxpc3QpKSB7CiAgICAgICAgZm9yIG15ICRWYWxpZCAoIDAgLi4gMSApIHsKICAgICAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICAgICAgS2V5ICA9PiAiJHtGdW5jdGlvbn06OiR7VmFsaWR9IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBERVNUUk9ZIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBkaXNjb25uZWN0IGlmIGl0J3Mgbm90IGEgcGFyZW50IERCT2JqZWN0CiAgICBpZiAoICRTZWxmLT57Tm90UGFyZW50REJPYmplY3R9ICkgewogICAgICAgIGlmICggJFNlbGYtPntEQk9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EaXNjb25uZWN0KCk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/CustomerUser/LDAP.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL1N5c3RlbS9DdXN0b21lclVzZXIvTERBUC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI6OkxEQVA7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTmV0OjpMREFQOwp1c2UgTmV0OjpMREFQOjpVdGlsIHF3KGVzY2FwZV9maWx0ZXJfdmFsdWUpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiMgRU8gUm90aGVyIE9TUwogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgZGF0YQogICAgZm9yIG15ICROZWVkZWQgKHF3KCBQcmVmZXJlbmNlc09iamVjdCBDdXN0b21lclVzZXJNYXAgKSkgewogICAgICAgICRTZWxmLT57JE5lZWRlZH0gPSAkUGFyYW17JE5lZWRlZH0gfHwgZGllICJHb3Qgbm8gJE5lZWRlZCEiOwogICAgfQoKICAgICMgbWF4IHNob3duIHVzZXIgYSBzZWFyY2ggbGlzdAogICAgJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaExpc3RMaW1pdH0gfHwgMjAwOwoKICAgICMgZ2V0IGxkYXAgcHJlZmVyZW5jZXMKICAgICRTZWxmLT57RGllfSA9IDA7CiAgICBpZiAoIGRlZmluZWQgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0RpZX0gKSB7CiAgICAgICAgJFNlbGYtPntEaWV9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0RpZX07CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBwYXJhbXMKICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1BhcmFtc30gKSB7CiAgICAgICAgJFNlbGYtPntQYXJhbXN9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1BhcmFtc307CiAgICB9CgogICAgIyBOZXQ6OkxEQVAgbmV3IHBhcmFtcwogICAgZWxzaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoICdBdXRoTW9kdWxlOjpMREFQOjpQYXJhbXMnIC4gJFBhcmFte0NvdW50fSApICkgewogICAgICAgICRTZWxmLT57UGFyYW1zfSA9ICRDb25maWdPYmplY3QtPkdldCggJ0F1dGhNb2R1bGU6OkxEQVA6OlBhcmFtcycgLiAkUGFyYW17Q291bnR9ICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e1BhcmFtc30gPSB7fTsKICAgIH0KCiAgICAkU2VsZi0+e1N0YXJ0VExTfSA9ICRDb25maWdPYmplY3QtPkdldCggJ0F1dGhNb2R1bGU6OkxEQVA6OlN0YXJ0VExTJyAuICRQYXJhbXtDb3VudH0gKSB8fCAnJzsKCiAgICAjIGhvc3QKICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0hvc3R9ICkgewogICAgICAgICRTZWxmLT57SG9zdH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57SG9zdH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJVc2VyLT5QYXJhbXMtPkhvc3QgaW4gS2VybmVsL0NvbmZpZy5wbScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBiYXNlIGRuCiAgICBpZiAoIGRlZmluZWQgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0Jhc2VETn0gKSB7CiAgICAgICAgJFNlbGYtPntCYXNlRE59ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0Jhc2VETn07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJVc2VyLT5QYXJhbXMtPkJhc2VETiBpbiBLZXJuZWwvQ29uZmlnLnBtJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNjb3BlCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntTU0NPUEV9ICkgewogICAgICAgICRTZWxmLT57U1Njb3BlfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntTU0NPUEV9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEN1c3RvbWVyVXNlci0+UGFyYW1zLT5TU0NPUEUgaW4gS2VybmVsL0NvbmZpZy5wbScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZWFyY2ggdXNlcgogICAgJFNlbGYtPntTZWFyY2hVc2VyRE59ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1VzZXJETn0gfHwgJyc7CiAgICAkU2VsZi0+e1NlYXJjaFVzZXJQd30gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57VXNlclB3fSB8fCAnJzsKCiAgICAjIGdyb3VwIGRuCiAgICAkU2VsZi0+e0dyb3VwRE59ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0dyb3VwRE59IHx8ICcnOwoKICAgICMgY3VzdG9tZXIga2V5CiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyS2V5fSApIHsKICAgICAgICAkU2VsZi0+e0N1c3RvbWVyS2V5fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyS2V5fTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDdXN0b21lclVzZXItPkN1c3RvbWVyS2V5IGluIEtlcm5lbC9Db25maWcucG0nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3VzdG9tZXIgaWQKICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntDdXN0b21lcklEfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVySUR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEN1c3RvbWVyVXNlci0+Q3VzdG9tZXJJRCBpbiBLZXJuZWwvQ29uZmlnLnBtJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxkYXAgZmlsdGVyIGFsd2F5cyB1c2VkCiAgICAkU2VsZi0+e0Fsd2F5c0ZpbHRlcn0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57QWx3YXlzRmlsdGVyfSB8fCAnJzsKCiAgICAkU2VsZi0+e0V4Y2x1ZGVQcmltYXJ5Q3VzdG9tZXJJRH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJFeGNsdWRlUHJpbWFyeUN1c3RvbWVySUR9IHx8IDA7CiAgICAkU2VsZi0+e1NlYXJjaFByZWZpeH0gICAgICAgICAgICAgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hQcmVmaXh9OwogICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e1NlYXJjaFByZWZpeH0gKSB7CiAgICAgICAgJFNlbGYtPntTZWFyY2hQcmVmaXh9ID0gJyc7CiAgICB9CiAgICAkU2VsZi0+e1NlYXJjaFN1ZmZpeH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hTdWZmaXh9OwogICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e1NlYXJjaFN1ZmZpeH0gKSB7CiAgICAgICAgJFNlbGYtPntTZWFyY2hTdWZmaXh9ID0gJyonOwogICAgfQoKICAgICMgY2hhcnNldCBzZXR0aW5ncwogICAgJFNlbGYtPntTb3VyY2VDaGFyc2V0fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntTb3VyY2VDaGFyc2V0fSB8fCAnJzsKCiAgICAjIHNldCBjYWNoZSB0eXBlCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnQ3VzdG9tZXJVc2VyJyAuICRQYXJhbXtDb3VudH07CgogICAgIyBjcmVhdGUgY2FjaGUgb2JqZWN0LCBidXQgb25seSBpZiBDYWNoZVRUTCBpcyBzZXQgaW4gY3VzdG9tZXIgY29uZmlnCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgfQoKICAgICMgZ2V0IHZhbGlkIGZpbHRlciBpZiB1c2VkCiAgICAkU2VsZi0+e1ZhbGlkRmlsdGVyfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclZhbGlkRmlsdGVyfSB8fCAnJzsKCiAgICAjIGNvbm5lY3QgZmlyc3QgaWYgRGllIGlzIGVuYWJsZWQsIG1ha2Ugc3VyZSB0aGF0IGNvbm5lY3Rpb24gaXMgcG9zc2libGUsIGVsc2UgZGllCiAgICBpZiAoICRTZWxmLT57RGllfSApIHsKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT5fQ29ubmVjdCgpOwogICAgfQoKICAgICMgZmV0Y2ggbmFtZXMgb2YgY29uZmlndXJlZCBkeW5hbWljIGZpZWxkcwogICAgbXkgQER5bmFtaWNGaWVsZE1hcEVudHJpZXMgPSBncmVwIHsgJF8tPls1XSBlcSAnZHluYW1pY19maWVsZCcgfSBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH07CiAgICAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30gPSB7IG1hcCB7ICRfLT5bMl0gPT4gMSB9IEBEeW5hbWljRmllbGRNYXBFbnRyaWVzIH07CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgbXkgJExheW91dFBhcmFtID0gJEtlcm5lbDo6T00tPntQYXJhbX0tPnsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCd9OwoKICAgICMgQ2hlY2sgaWYgbXVsdGl0ZW5hbmN5IGlzIGVuYWJsZWQgYW5kIHRoZSByZXF1ZXN0IGlzIGNvbWluZyBmcm9tIGEgdXNlci4KICAgIGlmICggJExheW91dFBhcmFtLT57VXNlclR5cGV9ICYmICRMYXlvdXRQYXJhbS0+e1VzZXJUeXBlfSBlcSAnVXNlcicgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3knKSApIHsKCiAgICAgICAgIyBTYXZlIHRoZSBVc2VySUQgYW5kIGFsbCBncm91cHMgdGhlIHVzZXIgaGFzICdybycgcGVybWlzc2lvbiBvbi4KICAgICAgICBpZiAoICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICMgT25seSBnZXQgdGhlIGdyb3VwIGxpc3Qgb25jZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KICAgICAgICAgICAgbXkgJUdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkTGF5b3V0UGFyYW0tPntVc2VySUR9LAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFRoZSBsaW1pdCBkb2VzIG5vdCBjb3VudCBmb3IgbWVtYmVycyBvZiBhIHNwZWNpZmljIGdyb3VwLgogICAgICAgICAgICBteSAkUGVybWlzc2lvbkdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3k6OlBlcm1pc3Npb25Hcm91cCcpIHx8ICcnOwogICAgICAgICAgICBteSAlR3JvdXBzUmV2ZXJzZSAgID0gcmV2ZXJzZSAlR3JvdXBzOwoKICAgICAgICAgICAgaWYgKCAhJEdyb3Vwc1JldmVyc2V7JFBlcm1pc3Npb25Hcm91cH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e011bHRpdGVuYW5jeX0gPSAkTGF5b3V0UGFyYW0tPntVc2VySUR9OwogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyR3JvdXBJRHN9ID0gWyBzb3J0IGtleXMgJUdyb3VwcyBdOwogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyR3JvdXBzfSAgID0gWyB2YWx1ZXMgJUdyb3VwcyBdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgX0Nvbm5lY3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHJldHVybiBpZiBjb25uZWN0aW9uIGlzIGFscmVhZHkgb3BlbgogICAgcmV0dXJuIDEgaWYgJFNlbGYtPntMREFQfTsKCiAgICAjIGxkYXAgY29ubmVjdCBhbmQgYmluZCAobWF5YmUgd2l0aCBTZWFyY2hVc2VyRE4gYW5kIFNlYXJjaFVzZXJQdykKICAgICRTZWxmLT57TERBUH0gPSBOZXQ6OkxEQVAtPm5ldyggJFNlbGYtPntIb3N0fSwgJXsgJFNlbGYtPntQYXJhbXN9IH0gKTsKCiAgICBpZiAoICEkU2VsZi0+e0xEQVB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntEaWV9ICkgewogICAgICAgICAgICBkaWUgIkNhbid0IGNvbm5lY3QgdG8gJFNlbGYtPntIb3N0fTogJEAiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNvbm5lY3QgdG8gJFNlbGYtPntIb3N0fTogJEAiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkU2VsZi0+e1N0YXJ0VExTfSApIHsKICAgICAgICBteSAkU3RhcnRlZCA9ICRTZWxmLT57TERBUH0tPnN0YXJ0X3RscyggdmVyaWZ5ID0+ICRTZWxmLT57U3RhcnRUTFN9ICk7CiAgICAgICAgaWYgKCAhJFN0YXJ0ZWQgKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntEaWV9ICkgewogICAgICAgICAgICAgICAgZGllICJzdGFydF90bHMgb24gJFNlbGYtPntIb3N0fSBmYWlsZWQ6ICRAIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gInN0YXJ0X3RsczogJyRTZWxmLT57U3RhcnRUTFN9JyBvbiAkU2VsZi0+e0hvc3R9IGZhaWxlZDogJEAiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TERBUH0tPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkUmVzdWx0OwogICAgaWYgKCAkU2VsZi0+e1NlYXJjaFVzZXJETn0gJiYgJFNlbGYtPntTZWFyY2hVc2VyUHd9ICkgewogICAgICAgICRSZXN1bHQgPSAkU2VsZi0+e0xEQVB9LT5iaW5kKAogICAgICAgICAgICBkbiAgICAgICA9PiAkU2VsZi0+e1NlYXJjaFVzZXJETn0sCiAgICAgICAgICAgIHBhc3N3b3JkID0+ICRTZWxmLT57U2VhcmNoVXNlclB3fSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFJlc3VsdCA9ICRTZWxmLT57TERBUH0tPmJpbmQoKTsKICAgIH0KCiAgICBpZiAoICRSZXN1bHQtPmNvZGUoKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ZpcnN0IGJpbmQgZmFpbGVkISAnIC4gJFJlc3VsdC0+ZXJyb3IoKSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TERBUH0tPmRpc2Nvbm5lY3QoKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBDdXN0b21lck5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJMb2dpbiEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBidWlsZCBmaWx0ZXIKICAgIG15ICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJLZXl9PSIgLiBlc2NhcGVfZmlsdGVyX3ZhbHVlKCAkUGFyYW17VXNlckxvZ2lufSApIC4gJyknOwoKICAgICMgcHJlcGFyZSBmaWx0ZXIKICAgIGlmICggJFNlbGYtPntBbHdheXNGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntBbHdheXNGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkTmFtZSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICdDdXN0b21lck5hbWU6OicgLiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkTmFtZSBpZiBkZWZpbmVkICROYW1lOwogICAgfQoKICAgICMgY3JlYXRlIGxkYXAgY29ubmVjdAogICAgcmV0dXJuIGlmICEkU2VsZi0+X0Nvbm5lY3QoKTsKCiAgICAjIHBlcmZvcm0gdXNlciBzZWFyY2gKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgYmFzZSAgICAgID0+ICRTZWxmLT57QmFzZUROfSwKICAgICAgICBzY29wZSAgICAgPT4gJFNlbGYtPntTU2NvcGV9LAogICAgICAgIGZpbHRlciAgICA9PiAkRmlsdGVyLAogICAgICAgIHNpemVsaW1pdCA9PiAkU2VsZi0+e1VzZXJTZWFyY2hMaXN0TGltaXR9LAogICAgICAgIGF0dHJzICAgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJOYW1lRmllbGRzfSwKICAgICk7CgogICAgaWYgKCAkUmVzdWx0LT5jb2RlKCkgKSB7CiAgICAgICAgaWYgKCAkUmVzdWx0LT5jb2RlKCkgPT0gNCApIHsKCiAgICAgICAgICAgICMgUmVzdWx0IGNvZGUgNCAoTERBUF9TSVpFTElNSVRfRVhDRUVERUQpIGlzIG5vcm1hbCBpZiB0aGVyZQogICAgICAgICAgICAjIGFyZSBtb3JlIGl0ZW1zIGluIExEQVAgdGhhbiBzZWFyY2ggbGltaXQgZGVmaW5lZCBpbiBPVE9CTyBvcgogICAgICAgICAgICAjIGluIExEQVAgc2VydmVyLiBBdm9pZCBzcGFtbWluZyBsb2dzIHdpdGggc3VjaCBlcnJvcnMuCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdMREFQIHNpemUgbGltaXQgZXhjZWVkZWQgKCcgLiAkUmVzdWx0LT5lcnJvcigpIC4gJykuJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTZWFyY2ggZmFpbGVkISAnIC4gJFJlc3VsdC0+ZXJyb3IoKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVOYW1lUGFydHM7CgogICAgZm9yIG15ICRFbnRyeSAoICRSZXN1bHQtPmFsbF9lbnRyaWVzKCkgKSB7CgogICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJOYW1lRmllbGRzfSB9ICkgewoKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRFbnRyeS0+Z2V0X3ZhbHVlKCRGaWVsZCkgKSB7CiAgICAgICAgICAgICAgICAkTmFtZVBhcnRzeyRGaWVsZH0gPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCAkRW50cnktPmdldF92YWx1ZSgkRmllbGQpICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIHZhbHVlcywgaWYgY29uZmlndXJlZAogICAgbXkgQER5bmFtaWNGaWVsZEN1c3RvbWVyVXNlck5hbWVGaWVsZHMgPSBncmVwIHsgZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9CiAgICAgICAgQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyTmFtZUZpZWxkc30gfTsKICAgIGlmIChARHluYW1pY0ZpZWxkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcykgewogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICBEWU5BTUlDRklFTEROQU1FOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoQER5bmFtaWNGaWVsZEN1c3RvbWVyVXNlck5hbWVGaWVsZHMpIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFkZWZpbmVkICRWYWx1ZTsKCiAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkVmFsdWUpICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gWyRWYWx1ZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15IEBSZW5kZXJlZFZhbHVlczsKCiAgICAgICAgICAgIFZBTFVFOgogICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRWYWx1ZSAoIEB7JFZhbHVlfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVkFMVUUgaWYgIWRlZmluZWQgJEN1cnJlbnRWYWx1ZSB8fCAhbGVuZ3RoICRDdXJyZW50VmFsdWU7CgogICAgICAgICAgICAgICAgbXkgJFJlbmRlcmVkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UmVhZGFibGVWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEN1cnJlbnRWYWx1ZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJFJlbmRlcmVkVmFsdWUpIHx8ICFkZWZpbmVkICRSZW5kZXJlZFZhbHVlLT57VmFsdWV9OwoKICAgICAgICAgICAgICAgIHB1c2ggQFJlbmRlcmVkVmFsdWVzLCAkUmVuZGVyZWRWYWx1ZS0+e1ZhbHVlfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE5hbWVQYXJ0c3skRHluYW1pY0ZpZWxkTmFtZX0gPSBqb2luICcgJywgQFJlbmRlcmVkVmFsdWVzOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzc2VtYmxlIG5hbWUKICAgIG15IEBOYW1lUGFydHM7CiAgICBDVVNUT01FUlVTRVJOQU1FRklFTEQ6CiAgICBmb3IgbXkgJEN1c3RvbWVyVXNlck5hbWVGaWVsZCAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlck5hbWVGaWVsZHN9IH0gKSB7CiAgICAgICAgbmV4dCBDVVNUT01FUlVTRVJOQU1FRklFTEQKICAgICAgICAgICAgaWYgIWV4aXN0cyAkTmFtZVBhcnRzeyRDdXN0b21lclVzZXJOYW1lRmllbGR9CiAgICAgICAgICAgIHx8ICFkZWZpbmVkICROYW1lUGFydHN7JEN1c3RvbWVyVXNlck5hbWVGaWVsZH0KICAgICAgICAgICAgfHwgIWxlbmd0aCAkTmFtZVBhcnRzeyRDdXN0b21lclVzZXJOYW1lRmllbGR9OwogICAgICAgIHB1c2ggQE5hbWVQYXJ0cywgJE5hbWVQYXJ0c3skQ3VzdG9tZXJVc2VyTmFtZUZpZWxkfTsKICAgIH0KCiAgICBteSAkSm9pbkNoYXJhY3RlciA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlck5hbWVGaWVsZHNKb2lufSAvLyAnICc7CiAgICBteSAkTmFtZSAgICAgICAgICA9IGpvaW4gJEpvaW5DaGFyYWN0ZXIsIEBOYW1lUGFydHM7CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbWVyTmFtZTo6JyAuICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICBWYWx1ZSA9PiAkTmFtZSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICROYW1lOwp9CgpzdWIgQ3VzdG9tZXJTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICRQYXJhbXtDdXN0b21lcklEUmF3fSApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJJRH0gPSAkUGFyYW17Q3VzdG9tZXJJRFJhd307CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtTZWFyY2h9ICYmICEkUGFyYW17VXNlckxvZ2lufSAmJiAhJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9ICYmICEkUGFyYW17Q3VzdG9tZXJJRH0gKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBTZWFyY2gsIFVzZXJMb2dpbiwgUG9zdE1hc3RlclNlYXJjaCBvciBDdXN0b21lcklEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGJ1aWxkIGZpbHRlcgogICAgbXkgJEZpbHRlciA9ICcnOwogICAgaWYgKCAkUGFyYW17U2VhcmNofSApIHsKCiAgICAgICAgbXkgJENvdW50ID0gMDsKICAgICAgICBteSBAUGFydHMgPSBzcGxpdCggL1wrLywgJFBhcmFte1NlYXJjaH0sIDYgKTsKICAgICAgICBmb3IgbXkgJFBhcnQgKEBQYXJ0cykgewoKICAgICAgICAgICAgJFBhcnQgPSAkU2VsZi0+e1NlYXJjaFByZWZpeH0gLiAkUGFydCAuICRTZWxmLT57U2VhcmNoU3VmZml4fTsKICAgICAgICAgICAgJFBhcnQgPX4gcy8oXCUrKS9cJS9nOwogICAgICAgICAgICAkUGFydCA9fiBzLyhcKispXCovKi9nOwogICAgICAgICAgICAkQ291bnQrKzsKCiAgICAgICAgICAgICMgcmVtb3ZlIGR5bmFtaWMgZmllbGQgbmFtZXMgdGhhdCBhcmUgY29uZmlndXJlZCBpbiBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMKICAgICAgICAgICAgIyBhcyB0aGV5IGNhbm5vdCBiZSByZXRyaWV2ZWQgaGVyZQogICAgICAgICAgICBteSBAQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzID0gZ3JlcCB7ICFleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0KICAgICAgICAgICAgICAgIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaEZpZWxkc30gfTsKCiAgICAgICAgICAgIGlmIChAQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzKSB7CgogICAgICAgICAgICAgICAgIyBxdW90ZSBMREFQIGZpbHRlciB2YWx1ZSBidXQga2VlcCBhc3Rlcmlza3MgdW5lc2NhcGVkICh3aWxkY2FyZCkKICAgICAgICAgICAgICAgICRQYXJ0ID1+IHMvXCovZW5jb2RlZGFzdGVyaXNrMjAxNjA5MzAvZzsKICAgICAgICAgICAgICAgICRQYXJ0ID0gZXNjYXBlX2ZpbHRlcl92YWx1ZSggJFNlbGYtPl9Db252ZXJ0VG8oJFBhcnQpICk7CiAgICAgICAgICAgICAgICAkUGFydCA9fiBzL2VuY29kZWRhc3RlcmlzazIwMTYwOTMwLyovZzsKCiAgICAgICAgICAgICAgICAkRmlsdGVyIC49ICcofCc7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChAQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzKSB7CiAgICAgICAgICAgICAgICAgICAgJEZpbHRlciAuPSAiKCRGaWVsZD0iIC4gJFBhcnQgLiAnKSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRmlsdGVyIC49ICcpJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIHF1b3RlIExEQVAgZmlsdGVyIHZhbHVlIGJ1dCBrZWVwIGFzdGVyaXNrcyB1bmVzY2FwZWQgKHdpbGRjYXJkKQogICAgICAgICAgICAgICAgJFBhcnQgPX4gcy9cKi9lbmNvZGVkYXN0ZXJpc2syMDE2MDkzMC9nOwogICAgICAgICAgICAgICAgJFBhcnQgPSBlc2NhcGVfZmlsdGVyX3ZhbHVlKCRQYXJ0KTsKICAgICAgICAgICAgICAgICRQYXJ0ID1+IHMvZW5jb2RlZGFzdGVyaXNrMjAxNjA5MzAvKi9nOwoKICAgICAgICAgICAgICAgICRGaWx0ZXIgLj0gIigkU2VsZi0+e0N1c3RvbWVyS2V5fT0iIC4gJFBhcnQgLiAnKSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJENvdW50ID4gMSApIHsKICAgICAgICAgICAgJEZpbHRlciA9ICIoJiRGaWx0ZXIpIjsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSApIHsKCiAgICAgICAgIyByZW1vdmUgZHluYW1pYyBmaWVsZCBuYW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIEN1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHMKICAgICAgICAjIGFzIHRoZXkgY2Fubm90IGJlIHJldHJpZXZlZCBoZXJlCiAgICAgICAgbXkgQEN1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfQogICAgICAgICAgICBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJQb3N0TWFzdGVyU2VhcmNoRmllbGRzfSB9OwoKICAgICAgICBpZiAoQEN1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgICAgICMgcXVvdGUgTERBUCBmaWx0ZXIgdmFsdWUgYnV0IGtlZXAgYXN0ZXJpc2tzIHVuZXNjYXBlZCAod2lsZGNhcmQpCiAgICAgICAgICAgICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSA9fiBzL1wqL2VuY29kZWRhc3RlcmlzazIwMTYwOTMwL2c7CiAgICAgICAgICAgICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSA9IGVzY2FwZV9maWx0ZXJfdmFsdWUoICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSApOwogICAgICAgICAgICAkUGFyYW17UG9zdE1hc3RlclNlYXJjaH0gPX4gcy9lbmNvZGVkYXN0ZXJpc2syMDE2MDkzMC8qL2c7CgogICAgICAgICAgICAkRmlsdGVyID0gJyh8JzsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoQEN1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHMpIHsKICAgICAgICAgICAgICAgICRGaWx0ZXIgLj0gIigkRmllbGQ9JFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9KSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEZpbHRlciAuPSAnKSc7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICAkRmlsdGVyID0gIigkU2VsZi0+e0N1c3RvbWVyS2V5fT0iIC4gZXNjYXBlX2ZpbHRlcl92YWx1ZSggJFBhcmFte1VzZXJMb2dpbn0gKSAuICcpJzsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0N1c3RvbWVySUR9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJJRH09IiAuIGVzY2FwZV9maWx0ZXJfdmFsdWUoICRQYXJhbXtDdXN0b21lcklEfSApIC4gJyknOwogICAgfQoKICAgICMgcHJlcGFyZSBmaWx0ZXIKICAgIGlmICggJFNlbGYtPntBbHdheXNGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntBbHdheXNGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBhZGQgdmFsaWQgZmlsdGVyCiAgICBpZiAoICRTZWxmLT57VmFsaWRGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntWYWxpZEZpbHRlcn0pIjsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSBqb2luICc6OicsIG1hcCB7ICRfIC4gJz0nIC4gJFBhcmFteyRffSB9IHNvcnQga2V5cyAlUGFyYW07CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIFVzZSBjYWNoZSBmb3IgbXVsdGl0ZW5hbmN5LgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgJENhY2hlS2V5IC49IGpvaW4gJycsIG1hcCB7ICc6Okdyb3VwSUQ9JyAuICRfIH0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH07CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJFVzZXJzID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoJywKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJXskVXNlcnN9IGlmIHJlZiAkVXNlcnMgZXEgJ0hBU0gnOwogICAgfQoKICAgICMgY3JlYXRlIGxkYXAgY29ubmVjdAogICAgcmV0dXJuIGlmICEkU2VsZi0+X0Nvbm5lY3QoKTsKCiAgICBteSAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcyA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlckxpc3RGaWVsZHN9OwoKICAgICMgcmVtb3ZlIGR5bmFtaWMgZmllbGQgbmFtZXMgdGhhdCBhcmUgY29uZmlndXJlZCBpbiBDdXN0b21lclVzZXJMaXN0RmllbGRzCiAgICAjIGFzIHRoZXkgY2Fubm90IGJlIGhhbmRsZWQgaGVyZQogICAgbXkgQEN1c3RvbWVyVXNlckxpc3RGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkcyA9IGdyZXAgeyAhZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9IEB7JEN1c3RvbWVyVXNlckxpc3RGaWVsZHN9OwoKICAgICMgY29tYmluZSBuZWVkZWQgYXR0cnMKICAgIG15IEBBdHRyaWJ1dGVzID0gKCBAQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc1dpdGhvdXREeW5hbWljRmllbGRzLCAkU2VsZi0+e0N1c3RvbWVyS2V5fSApOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgRG9uJ3Qgc2VhcmNoIGZvciBjdXN0b21lciB1c2VycyB3aXRob3V0IGdyb3VwIHBlcm1pc3Npb24uCiAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICBteSAkR3JvdXBJREF0dHI7CiAgICAgICAgZm9yIG15ICRNYXAgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgICAgIGlmICggJE1hcC0+WzBdIGVxICdVc2VyR3JvdXBJRCcgKSB7CiAgICAgICAgICAgICAgICAkR3JvdXBJREF0dHIgPSAkTWFwLT5bMl07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgVGhlIHNvdXJjZSBzdXBwb3J0cyBtdWx0aXRlbmFuY3kuCiAgICAgICAgaWYgKCRHcm91cElEQXR0cikgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyQ29tcGFueVN1cHBvcnR9ICkgewogICAgICAgICAgICAgICAgIyBUT0RPOiBXb3JrYXJvdW5kIHVudGlsIHRoZSBzZWFyY2ggZ2V0cyBjaGFuZ2VkLiBTZWUgQ3VzdG9tZXJVc2VyL0xEQVAucG0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgICAgICAgICAkUGFyYW17TGltaXR9ID0gMTAwMDAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkVXNlckdyb3VwSURTeW5jID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57VXNlckdyb3VwSURTeW5jfTsKICAgICAgICAgICAgIyBDaGVjayBpZiB3ZSBtYXRjaCBmb3IgZ3JvdXAgSURzIG9yIGdyb3VwIG5hbWVzLgogICAgICAgICAgICBteSBAVXNlckdyb3VwcyA9ICRVc2VyR3JvdXBJRFN5bmMtPntVc2VHcm91cE5hbWVzfSA/IEB7ICRTZWxmLT57VXNlckdyb3Vwc30gfSA6IEB7ICRTZWxmLT57VXNlckdyb3VwSURzfSB9OwoKICAgICAgICAgICAgIyBSZW1hcCBsb2NhbCBncm91cHMgdG8gcmVtb3RlIGdyb3Vwcy4KICAgICAgICAgICAgZm9yIG15ICRSZW1vdGVHcm91cCAoIGtleXMgJXsgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSB9ICkgewogICAgICAgICAgICAgICAgbXkgJExvY2FsR3JvdXAgPSAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9eyRSZW1vdGVHcm91cH07CgogICAgICAgICAgICAgICAgQFVzZXJHcm91cHMgPSBtYXAgeyAkXyBlcSAkTG9jYWxHcm91cCA/ICRSZW1vdGVHcm91cCA6ICRfIH0gQFVzZXJHcm91cHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQnVpbGQgZmlsdGVyIHN0cmluZy4gSWYgdGhlIGZpZWxkIGlzIGVtcHR5LCB3ZSBoYXZlIGFjY2VzcyBieSBkZWZhdWx0LgogICAgICAgICAgICBteSAkQWRkaXRpb25hbEZpbHRlciA9ICIofCghKCRHcm91cElEQXR0cj0qKSkiOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJHcm91cCAoQFVzZXJHcm91cHMpIHsKICAgICAgICAgICAgICAgICRBZGRpdGlvbmFsRmlsdGVyIC49ICIoJEdyb3VwSURBdHRyPSRVc2VyR3JvdXApIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQWRkaXRpb25hbEZpbHRlciAuPSAnKSknOwoKICAgICAgICAgICAgIyBSZW1vdmUgdGhlIGxhc3QgY2xvc2luZyBwYXJlbnRoZXNpcyBhbmQgYWRkIHRoZSBjdXN0b20gZmlsdGVyIHRvIHRoZSBzZWFyY2guCiAgICAgICAgICAgICRGaWx0ZXIgPSBzdWJzdHIgJEZpbHRlciwgMCwgLTE7CiAgICAgICAgICAgICRGaWx0ZXIgLj0gJEFkZGl0aW9uYWxGaWx0ZXI7CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgIyBwZXJmb3JtIHVzZXIgc2VhcmNoCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPntMREFQfS0+c2VhcmNoKAogICAgICAgIGJhc2UgICAgICA9PiAkU2VsZi0+e0Jhc2VETn0sCiAgICAgICAgc2NvcGUgICAgID0+ICRTZWxmLT57U1Njb3BlfSwKICAgICAgICBmaWx0ZXIgICAgPT4gJEZpbHRlciwKICAgICAgICBzaXplbGltaXQgPT4gJFBhcmFte0xpbWl0fSB8fCAkU2VsZi0+e1VzZXJTZWFyY2hMaXN0TGltaXR9LAogICAgICAgIGF0dHJzICAgICA9PiBcQEF0dHJpYnV0ZXMsCiAgICApOwoKICAgICMgbG9nIGxkYXAgZXJyb3JzCiAgICBpZiAoICRSZXN1bHQtPmNvZGUoKSApIHsKICAgICAgICBpZiAoICRSZXN1bHQtPmNvZGUoKSA9PSA0ICkgewoKICAgICAgICAgICAgIyBSZXN1bHQgY29kZSA0IChMREFQX1NJWkVMSU1JVF9FWENFRURFRCkgaXMgbm9ybWFsIGlmIHRoZXJlCiAgICAgICAgICAgICMgYXJlIG1vcmUgaXRlbXMgaW4gTERBUCB0aGFuIHNlYXJjaCBsaW1pdCBkZWZpbmVkIGluIE9UT0JPIG9yCiAgICAgICAgICAgICMgaW4gTERBUCBzZXJ2ZXIuIEF2b2lkIHNwYW1taW5nIGxvZ3Mgd2l0aCBzdWNoIGVycm9ycy4KICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0xEQVAgc2l6ZSBsaW1pdCBleGNlZWRlZCAoJyAuICRSZXN1bHQtPmVycm9yKCkgLiAnKS4nLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NlYXJjaCBmYWlsZWQhICcgLiAkUmVzdWx0LT5lcnJvcigpLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGR5bmFtaWMgZmllbGQgaGFuZGxpbmcKICAgIG15IEBDdXN0b21lclVzZXJMaXN0RmllbGRzRHluYW1pY0ZpZWxkcyA9IGdyZXAgeyBleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0gQHskQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc307CiAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc0R5bmFtaWNGaWVsZHMgPSBtYXAgIHsgJF8gPT4gMSB9IEBDdXN0b21lclVzZXJMaXN0RmllbGRzRHluYW1pY0ZpZWxkczsKCiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICk7CiAgICBteSAlRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZSA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSBAeyREeW5hbWljRmllbGRDb25maWdzfTsKCiAgICBteSAlVXNlcnM7CiAgICBmb3IgbXkgJEVudHJ5ICggJFJlc3VsdC0+YWxsX2VudHJpZXMoKSApIHsKCiAgICAgICAgbXkgJEN1c3RvbWVyU3RyaW5nID0gJyc7CgogICAgICAgIG15ICRDdXN0b21lcktleTsKICAgICAgICBpZiAoIGRlZmluZWQgJEVudHJ5LT5nZXRfdmFsdWUoICRTZWxmLT57Q3VzdG9tZXJLZXl9ICkgKSB7CiAgICAgICAgICAgICRDdXN0b21lcktleSA9ICRTZWxmLT5fQ29udmVydEZyb20oICRFbnRyeS0+Z2V0X3ZhbHVlKCAkU2VsZi0+e0N1c3RvbWVyS2V5fSApICk7CiAgICAgICAgfQoKICAgICAgICBGSUVMRDoKICAgICAgICBmb3IgbXkgJEZpZWxkICggQHskQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc30gKSB7CgogICAgICAgICAgICAjIGR5bmFtaWMgZmllbGQgdmFsdWUKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc0R5bmFtaWNGaWVsZHN7JEZpZWxkfSApIHsKICAgICAgICAgICAgICAgIG5leHQgRklFTEQgaWYgIWRlZmluZWQgJEN1c3RvbWVyS2V5OwogICAgICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAhZXhpc3RzICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyRGaWVsZH07CgogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRmllbGR9LAogICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgRklFTEQgaWYgIWRlZmluZWQgJFZhbHVlOwoKICAgICAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkVmFsdWUpICkgewogICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9IFskVmFsdWVdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15IEBWYWx1ZXM7CgogICAgICAgICAgICAgICAgVkFMVUU6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRWYWx1ZSAoIEB7JFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IFZBTFVFIGlmICFkZWZpbmVkICRDdXJyZW50VmFsdWUgfHwgIWxlbmd0aCAkQ3VycmVudFZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBteSAkUmVhZGFibGVWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5SZWFkYWJsZVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRDdXJyZW50VmFsdWUsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJFJlYWRhYmxlVmFsdWUpIHx8ICFkZWZpbmVkICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9OwoKICAgICAgICAgICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRmllbGR9LAogICAgICAgICAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRQb3NzaWJsZVZhbHVlcy0+eyAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9ID0gJFBvc3NpYmxlVmFsdWVzLT57ICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9IH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQFZhbHVlcywgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEN1c3RvbWVyU3RyaW5nIC49ICggam9pbiAnICcsIEBWYWx1ZXMgKSAuICcgJzsKCiAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCAkRW50cnktPmdldF92YWx1ZSgkRmllbGQpICk7CgogICAgICAgICAgICBpZiAoJFZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAoICRGaWVsZCA9fiAvXnRhcmdldGFkZHJlc3MkL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJFZhbHVlID1+IHMvU01UUDooLiopLyQxLzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRDdXN0b21lclN0cmluZyAuPSAkVmFsdWUgLiAnICc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRDdXN0b21lclN0cmluZyA9fiBzL14oLiopXHMoLis/XEAuKz9cLi4rPykoXHN8KSQvIiQxIiA8JDI+LzsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRDdXN0b21lcktleSApIHsKICAgICAgICAgICAgJFVzZXJzeyRDdXN0b21lcktleX0gPSAkQ3VzdG9tZXJTdHJpbmc7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBuZWVkIHRvIGJlIGluIGEgZ3JvdXAhCiAgICBpZiAoICRTZWxmLT57R3JvdXBETn0gKSB7CgogICAgICAgIGZvciBteSAkRmlsdGVyMiAoIHNvcnQga2V5cyAlVXNlcnMgKSB7CgogICAgICAgICAgICBteSAkUmVzdWx0MiA9ICRTZWxmLT57TERBUH0tPnNlYXJjaCgKICAgICAgICAgICAgICAgIGJhc2UgICAgICA9PiAkU2VsZi0+e0dyb3VwRE59LAogICAgICAgICAgICAgICAgc2NvcGUgICAgID0+ICRTZWxmLT57U1Njb3BlfSwKICAgICAgICAgICAgICAgIGZpbHRlciAgICA9PiAnbWVtYmVyVWlkPScgLiBlc2NhcGVfZmlsdGVyX3ZhbHVlKCRGaWx0ZXIyKSwKICAgICAgICAgICAgICAgIHNpemVsaW1pdCA9PiAkUGFyYW17TGltaXR9IHx8ICRTZWxmLT57VXNlclNlYXJjaExpc3RMaW1pdH0sCiAgICAgICAgICAgICAgICBhdHRycyAgICAgPT4gWycxLjEnXSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXN1bHQyLT5hbGxfZW50cmllcygpICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRVc2Vyc3skRmlsdGVyMn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2gnLAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFwlVXNlcnMsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlVXNlcnM7Cn0KCnN1YiBDdXN0b21lclNlYXJjaERldGFpbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggcmVmICRQYXJhbXtTZWFyY2hGaWVsZHN9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTZWFyY2hGaWVsZHMgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIFJldHVybiBvbmx5IHZhbGlkIHVzZXJzIHBlciBkZWZhdWx0CiAgICBteSAkVmFsaWQgPSAkUGFyYW17VmFsaWR9IC8vIDE7CgogICAgJFBhcmFte0xpbWl0fSAvLz0gJyc7CgogICAgIyBTcGxpdCB0aGUgc2VhcmNoIGZpZWxkcyBpbiBzY2FsYXIgYW5kIGFycmF5IGZpZWxkcywgYmVmb3JlIHRoZSBkaWZmcmVudCBoYW5kbGluZy4KICAgIG15IEBTY2FsYXJTZWFyY2hGaWVsZHMgPSBncmVwIHsgJ0lucHV0JyBlcSAkXy0+e1R5cGV9IH0gQHsgJFBhcmFte1NlYXJjaEZpZWxkc30gfTsKICAgIG15IEBBcnJheVNlYXJjaEZpZWxkcyAgPSBncmVwIHsgJ1NlbGVjdGlvbicgZXEgJF8tPntUeXBlfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CgogICAgIyBWZXJpZnkgdGhhdCBhbGwgcGFzc2VkIGFycmF5IHBhcmFtZXRlcnMgY29udGFpbiBhbiBhcnJheXJlZi4KICAgIEFSR1VNRU5UOgogICAgZm9yIG15ICRBcmd1bWVudCAoQEFycmF5U2VhcmNoRmllbGRzKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17ICRBcmd1bWVudC0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXsgJEFyZ3VtZW50LT57TmFtZX0gfSB8fD0gW107CgogICAgICAgICAgICBuZXh0IEFSR1VNRU5UOwogICAgICAgIH0KCiAgICAgICAgaWYgKCByZWYgJFBhcmFteyAkQXJndW1lbnQtPntOYW1lfSB9IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkQXJndW1lbnQtPntOYW1lfSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgU2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlLgogICAgbXkgJFJlc3VsdCA9ICRQYXJhbXtSZXN1bHR9IHx8ICdBUlJBWSc7CgogICAgIyBTcGVjaWFsIGhhbmRsaW5nIGlmIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CgogICAgICAgICMgSWdub3JlIHRoZSBwYXJhbWV0ZXIgJ0xpbWl0JyB3aGVuIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcuCiAgICAgICAgJFBhcmFte0xpbWl0fSA9ICcnOwoKICAgICAgICAjIERlbGV0ZSB0aGUgT3JkZXJCeSBwYXJhbWV0ZXIgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgICAgICAkUGFyYW17T3JkZXJCeX0gPSBbXTsKICAgIH0KCiAgICAjIERlZmluZSBvcmRlciB0YWJsZSBmcm9tIHRoZSBzZWFyY2ggZmllbGRzLgogICAgbXkgJU9yZGVyQnlUYWJsZSA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8tPntEYXRhYmFzZUZpZWxkfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CgogICAgZm9yIG15ICRGaWVsZCAoQEFycmF5U2VhcmNoRmllbGRzKSB7CgogICAgICAgIG15ICRTZWxlY3Rpb25zRGF0YSA9ICRGaWVsZC0+e1NlbGVjdGlvbnNEYXRhfTsKCiAgICAgICAgZm9yIG15ICRTZWxlY3RlZFZhbHVlICggQHsgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9IH0gKSB7CgogICAgICAgICAgICAjIENoZWNrIGlmIHRoZSBzZWxlY3RlZCB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgZmllbGQgaXMgdmFsaWQuCiAgICAgICAgICAgIGlmICggISRTZWxlY3Rpb25zRGF0YS0+eyRTZWxlY3RlZFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBzZWxlY3RlZCB2YWx1ZSAkRmllbGQtPntOYW1lfSBpcyBub3QgdmFsaWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBCdWlsZCB0aGUgbGRhcCBmaWx0ZXIgZm9yIHRoZSBkaWZmcmVudCBzZWFyY2ggcGFyYW1zLgogICAgbXkgJEZpbHRlciA9ICcnOwoKICAgIGZvciBteSAkRmllbGQgKEBTY2FsYXJTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgIyBTZWFyY2ggZm9yIHNjYWxhciBmaWVsZHMgKHdpbGRjYXJkcyBhcmUgYWxsb3dlZCkuCiAgICAgICAgaWYgKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gKSB7CgogICAgICAgICAgICAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gPX4gcy8oXCUrKS9cJS9nOwogICAgICAgICAgICAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gPX4gcy8oXCorKVwqLyovZzsKCiAgICAgICAgICAgICRGaWx0ZXIgLj0gIigkRmllbGQtPntEYXRhYmFzZUZpZWxkfT0iIC4gJFNlbGYtPl9Db252ZXJ0VG8oICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSApIC4gIikiOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJEZpbHRlcikgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyKSI7CiAgICB9CgogICAgbXkgJEFycmF5RmlsdGVyID0gJyc7CgogICAgIyBTcGVjaWFsIHBhcmFtZXRlciBmb3IgQ3VzdG9tZXJJRHMgZnJvbSBhIGN1c3RvbWVyIGNvbXBhbnkgc2VhcmNoIHJlc3VsdC4KICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17Q3VzdG9tZXJDb21wYW55U2VhcmNoQ3VzdG9tZXJJRHN9ICkgKSB7CiAgICAgICAgJEFycmF5RmlsdGVyIC49ICcofCc7CiAgICAgICAgZm9yIG15ICRPbmVQYXJhbSAoIEB7ICRQYXJhbXtDdXN0b21lckNvbXBhbnlTZWFyY2hDdXN0b21lcklEc30gfSApIHsKICAgICAgICAgICAgJEFycmF5RmlsdGVyIC49ICIoJFNlbGYtPntDdXN0b21lcklEfT0iIC4gJFNlbGYtPl9Db252ZXJ0VG8oJE9uZVBhcmFtKSAuICIpIjsKICAgICAgICB9CiAgICAgICAgJEFycmF5RmlsdGVyIC49ICcpJzsKICAgIH0KCiAgICBGSUVMRDoKICAgIGZvciBteSAkRmllbGQgKEBBcnJheVNlYXJjaEZpZWxkcykgewoKICAgICAgICAjIElnbm9yZSBlbXB0eSBsaXN0cy4KICAgICAgICBuZXh0IEZJRUxEIGlmICFAeyAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gfTsKCiAgICAgICAgJEFycmF5RmlsdGVyIC49ICcofCc7CiAgICAgICAgZm9yIG15ICRPbmVQYXJhbSAoIEB7ICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSB9ICkgewogICAgICAgICAgICAkQXJyYXlGaWx0ZXIgLj0gIigkRmllbGQtPntEYXRhYmFzZUZpZWxkfT0iIC4gJFNlbGYtPl9Db252ZXJ0VG8oJE9uZVBhcmFtKSAuICIpIjsKICAgICAgICB9CiAgICAgICAgJEFycmF5RmlsdGVyIC49ICcpJzsKICAgIH0KCiAgICAjIEFkZCB0aGUgYXJyYXkgZmlsdGVyIGZpZWxkcyB0byB0aGUgbGRhcCBmaWx0ZXIuCiAgICBpZiAoJEFycmF5RmlsdGVyKSB7CiAgICAgICAgJEZpbHRlciA9ICIoJiRGaWx0ZXIkQXJyYXlGaWx0ZXIpIjsKICAgIH0KCiAgICBteSAkREJPYmplY3QgICAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIENoZWNrIGFsbCBjb25maWd1cmVkIGNoYW5nZSBkeW5hbWljIGZpZWxkcywgYnVpbGQgbG9va3VwIGhhc2ggYnkgbmFtZS4KICAgIG15ICVDdXN0b21lclVzZXJEeW5hbWljRmllbGROYW1lMkNvbmZpZzsKICAgIG15ICRDdXN0b21lclVzZXJEeW5hbWljRmllbGRzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgKTsKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskQ3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkc30gKSB7CiAgICAgICAgJEN1c3RvbWVyVXNlckR5bmFtaWNGaWVsZE5hbWUyQ29uZmlneyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGQ7CiAgICB9CgogICAgbXkgJFNRTER5bmFtaWNGaWVsZEZyb20gICAgID0gJyc7CiAgICBteSAkU1FMRHluYW1pY0ZpZWxkV2hlcmUgICAgPSAnJzsKICAgIG15ICREeW5hbWljRmllbGRKb2luQ291bnRlciA9IDE7CgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyRDdXN0b21lclVzZXJEeW5hbWljRmllbGRzfSApIHsKCiAgICAgICAgbXkgJFNlYXJjaFBhcmFtID0gJFBhcmFteyAiRHluYW1pY0ZpZWxkXyIgLiAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgKCAhJFNlYXJjaFBhcmFtICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgKCByZWYgJFNlYXJjaFBhcmFtIG5lICdIQVNIJyApOwoKICAgICAgICBteSAkTmVlZEpvaW47CgogICAgICAgIGZvciBteSAkT3BlcmF0b3IgKCBzb3J0IGtleXMgJXskU2VhcmNoUGFyYW19ICkgewoKICAgICAgICAgICAgbXkgQFNlYXJjaFBhcmFtcyA9ICggcmVmICRTZWFyY2hQYXJhbS0+eyRPcGVyYXRvcn0gZXEgJ0FSUkFZJyApCiAgICAgICAgICAgICAgICA/IEB7ICRTZWFyY2hQYXJhbS0+eyRPcGVyYXRvcn0gfQogICAgICAgICAgICAgICAgOiAoICRTZWFyY2hQYXJhbS0+eyRPcGVyYXRvcn0gKTsKCiAgICAgICAgICAgIG15ICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiA9ICcnOwogICAgICAgICAgICBpZiAoJFNRTER5bmFtaWNGaWVsZFdoZXJlKSB7CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgPSAnIEFORCAoJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiA9ICcgKCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICAgICAgVEVYVDoKICAgICAgICAgICAgZm9yIG15ICRUZXh0IChAU2VhcmNoUGFyYW1zKSB7CiAgICAgICAgICAgICAgICBuZXh0IFRFWFQgaWYgKCAhZGVmaW5lZCAkVGV4dCB8fCAkVGV4dCBlcSAnJyApOwoKICAgICAgICAgICAgICAgICRUZXh0ID1+IHMvXCovJS9naTsKCiAgICAgICAgICAgICAgICAjIENoZWNrIHNlYXJjaCBhdHRyaWJ1dGUsIHdlIGRvIG5vdCBuZWVkIHRvIHNlYXJjaCBmb3IgJyonLgogICAgICAgICAgICAgICAgbmV4dCBURVhUIGlmICRUZXh0ID1+IC9eXCV7MSwzfSQvOwoKICAgICAgICAgICAgICAgIG15ICRWYWxpZGF0ZVN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9IHx8IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFZhbGlkYXRlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlNlYXJjaCBub3QgZXhlY3V0ZWQgZHVlIHRvIGludmFsaWQgdmFsdWUgJyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFRleHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIicgb24gZmllbGQgJyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJER5bmFtaWNGaWVsZC0+e05hbWV9IC4gIichIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgLj0gJyBPUiAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViIC49ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5TZWFyY2hTUUxHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVGFibGVBbGlhcyAgICAgICAgID0+ICJkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIiLAogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yICAgICAgICAgICA9PiAkT3BlcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgU2VhcmNoVGVybSAgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiAuPSAnKSAnOwoKICAgICAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmUgLj0gJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViOwogICAgICAgICAgICAgICAgJE5lZWRKb2luID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCROZWVkSm9pbikgewogICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkRnJvbSAuPSAiCiAgICAgICAgICAgICAgICBJTk5FUiBKT0lOIGR5bmFtaWNfZmllbGRfdmFsdWUgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyCiAgICAgICAgICAgICAgICAgICAgT04gKGRmX29ial9pZF9uYW1lLm9iamVjdF9pZCA9IGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5vYmplY3RfaWQKICAgICAgICAgICAgICAgICAgICAgICAgQU5EIGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5maWVsZF9pZCA9ICIKICAgICAgICAgICAgICAgIC4gJERCT2JqZWN0LT5RdW90ZSggJER5bmFtaWNGaWVsZC0+e0lEfSwgJ0ludGVnZXInICkgLiAiKQogICAgICAgICAgICAiOwoKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgRXhlY3V0ZSBhIGR5bmFtaWMgZmllbGQgc2VhcmNoLCBpZiBhIGR5bmFtaWMgZmllbGQgd2hlcmUgc3RhdGVtZW50IGV4aXN0cy4KICAgIGlmICgkU1FMRHluYW1pY0ZpZWxkV2hlcmUpIHsKCiAgICAgICAgbXkgQER5bmFtaWNGaWVsZFVzZXJMb2dpbnM7CgogICAgICAgICMgc3FsIHVlcnkgZm9yIHRoZSBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICRTUUxEeW5hbWljRmllbGQgPSAiU0VMRUNUIERJU1RJTkNUKGRmX29ial9pZF9uYW1lLm9iamVjdF9uYW1lKSBGUk9NIGR5bmFtaWNfZmllbGRfb2JqX2lkX25hbWUgZGZfb2JqX2lkX25hbWUgIgogICAgICAgICAgICAuICRTUUxEeW5hbWljRmllbGRGcm9tCiAgICAgICAgICAgIC4gIiBXSEVSRSAiCiAgICAgICAgICAgIC4gJFNRTER5bmFtaWNGaWVsZFdoZXJlOwoKICAgICAgICBteSAkVXNlZENhY2hlOwoKICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewoKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2hEZXRhaWxEeW5hbWljRmllbGRzJywKICAgICAgICAgICAgICAgIEtleSAgPT4gJFNRTER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkRHluYW1pY0ZpZWxkU2VhcmNoQ2FjaGVEYXRhICkgewogICAgICAgICAgICAgICAgaWYgKCByZWYgJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRVc2VyTG9naW5zID0gQHskRHluYW1pY0ZpZWxkU2VhcmNoQ2FjaGVEYXRhfTsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgdGhlIHVzZWQgY2FjaGUgZmxhZwogICAgICAgICAgICAgICAgICAgICRVc2VkQ2FjaGUgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIHJlZiAnIC4gcmVmKCREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEpIC4gJyEnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgR2V0IHRoZSBkYXRhIG9ubHkgZnJvbSBkYXRhYmFzZSwgaWYgbm8gY2FjaGUgZW50cnkgZXhpc3RzLgogICAgICAgIGlmICggISRVc2VkQ2FjaGUgKSB7CgogICAgICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCA9PiAkU1FMRHluYW1pY0ZpZWxkLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRVc2VyTG9naW5zLCAkUm93WzBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsRHluYW1pY0ZpZWxkcycsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJFNRTER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiBcQER5bmFtaWNGaWVsZFVzZXJMb2dpbnMsCiAgICAgICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBBZGQgdGhlIHVzZXIgbG9naW5zIGZyb20gdGhlIGR5bmFtaWMgZmllbGRzLCBpZiBhIHNlYXJjaCByZXN1bHQgZXhpc3RzIGZyb20gdGhlIGR5bmFtaWMgZmllbGQgc2VhcmNoCiAgICAgICAgIyAgIG9yIHNraXAgdGhlIHNlYXJjaCBhbmQgcmV0dXJuIGEgZW1wdHJ5IGFycmF5IHJlZiwgaWYgbm8gdXNlciBsb2dpbnMgZXhpc3RzIGZyb20gdGhlIGR5bmFtaWMgZmllbGQgc2VhcmNoLgogICAgICAgIGlmIChARHluYW1pY0ZpZWxkVXNlckxvZ2lucykgewoKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZFVzZXJMb2dpbnNGaWx0ZXIgPSAnKHwnOwogICAgICAgICAgICBmb3IgbXkgJE9uZVBhcmFtIChARHluYW1pY0ZpZWxkVXNlckxvZ2lucykgewogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFVzZXJMb2dpbnNGaWx0ZXIgLj0gIigkU2VsZi0+e0N1c3RvbWVyS2V5fT0iIC4gJFNlbGYtPl9Db252ZXJ0VG8oJE9uZVBhcmFtKSAuICIpIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRHluYW1pY0ZpZWxkVXNlckxvZ2luc0ZpbHRlciAuPSAnKSc7CgogICAgICAgICAgICAjIEFkZCB0aGUgZHluYW1pYyBmaWVsZCB1c2VyIGxvZ2lucyBmaWx0ZXIgdG8gdGhlIGxkYXAgZmlsdGVyLgogICAgICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlciREeW5hbWljRmllbGRVc2VyTG9naW5zRmlsdGVyKSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFJlc3VsdCBlcSAnQ09VTlQnID8gMCA6IFtdOwogICAgICAgIH0KICAgIH0KCiAgICAjIFNwZWNpYWwgcGFyYW1ldGVyIHRvIGV4Y2x1ZGUgc29tZSB1c2VyIGxvZ2lucyBmcm9tIHRoZSBzZWFyY2ggcmVzdWx0LgogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtFeGNsdWRlVXNlckxvZ2luc30gKSApIHsKICAgICAgICBteSAkRXhjbHVkZVVzZXJMb2dpbnNGaWx0ZXIgPSAnKCYnOwogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17RXhjbHVkZVVzZXJMb2dpbnN9IH0gKSB7CiAgICAgICAgICAgICRFeGNsdWRlVXNlckxvZ2luc0ZpbHRlciAuPSAiKCEoJFNlbGYtPntDdXN0b21lcktleX09IiAuICRTZWxmLT5fQ29udmVydFRvKCRPbmVQYXJhbSkgLiAiKSkiOwogICAgICAgIH0KICAgICAgICAkRXhjbHVkZVVzZXJMb2dpbnNGaWx0ZXIgLj0gJyknOwoKICAgICAgICAjIEFkZCB0aGUgZXhjbHVkZSB1c2VyIGxvZ2lucyBmaWx0ZXIgdG8gdGhlIGxkYXAgZmlsdGVyLgogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJEV4Y2x1ZGVVc2VyTG9naW5zRmlsdGVyKSI7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0Fsd2F5c0ZpbHRlcn0gKSB7CiAgICAgICAgJEZpbHRlciA9ICIoJiRGaWx0ZXIkU2VsZi0+e0Fsd2F5c0ZpbHRlcn0pIjsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57VmFsaWRGaWx0ZXJ9ICYmICRWYWxpZCApIHsKICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlciRTZWxmLT57VmFsaWRGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBEZWZhdWx0IGZpbHRlciBmb3IgdGhlIHNlYXJjaCwgaWYgbm8gZmlsdGVyIGV4aXN0cy4KICAgIGlmICggISRGaWx0ZXIgKSB7CiAgICAgICAgJEZpbHRlciA9ICIoJFNlbGYtPntDdXN0b21lcktleX09KikiOwogICAgfQoKICAgICMgQ2hlY2sgaWYgT3JkZXJCeSBjb250YWlucyBvbmx5IHVuaXF1ZSB2YWxpZCB2YWx1ZXMuCiAgICBteSAlT3JkZXJCeVNlZW47CiAgICBmb3IgbXkgJE9yZGVyQnkgKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApIHsKCiAgICAgICAgaWYgKCAhJE9yZGVyQnkgfHwgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSApIHsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPcmRlckJ5IGNvbnRhaW5zIGludmFsaWQgdmFsdWUgJyRPcmRlckJ5JyBvciB0aGUgdmFsdWUgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIFJlbWVtYmVyIHRoZSB2YWx1ZSB0byBjaGVjayBpZiBpdCBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlLgogICAgICAgICRPcmRlckJ5U2VlbnskT3JkZXJCeX0gPSAxOwogICAgfQoKICAgICMgQ2hlY2sgaWYgT3JkZXJCeURpcmVjdGlvbiBhcnJheSBjb250YWlucyBvbmx5ICdVcCcgb3IgJ0Rvd24nLgogICAgRElSRUNUSU9OOgogICAgZm9yIG15ICREaXJlY3Rpb24gKCBAeyAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0gfSApIHsKCiAgICAgICAgIyBPbmx5ICdVcCcgb3IgJ0Rvd24nIGFsbG93ZWQuCiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnVXAnOwogICAgICAgIG5leHQgRElSRUNUSU9OIGlmICREaXJlY3Rpb24gZXEgJ0Rvd24nOwoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnlEaXJlY3Rpb24gY2FuIG9ubHkgY29udGFpbiAnVXAnIG9yICdEb3duJyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgQXNzZW1ibGUgdGhlIE9SREVSIEJZIGNsYXVzZS4KICAgIG15IEBPcmRlckJ5RmllbGRzOwogICAgbXkgJE9yZGVyQnlTdHJpbmcgPSAnJzsKICAgIG15ICRDb3VudCAgICAgICAgID0gMDsKCiAgICBPUkRFUkJZOgogICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CiAgICAgICAgbmV4dCBPUkRFUkJZIGlmICEkT3JkZXJCeVRhYmxleyRPcmRlckJ5fTsKCiAgICAgICAgbXkgJERpcmVjdGlvbiA9ICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gfHwgJ0Rvd24nOwoKICAgICAgICAkT3JkZXJCeVN0cmluZyAuPSAkT3JkZXJCeVRhYmxleyRPcmRlckJ5fSAuICREaXJlY3Rpb247CgogICAgICAgIHB1c2ggQE9yZGVyQnlGaWVsZHMsIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAkT3JkZXJCeSwKICAgICAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAkT3JkZXJCeVRhYmxleyRPcmRlckJ5fSwKICAgICAgICAgICAgRGlyZWN0aW9uICAgICA9PiAkRGlyZWN0aW9uLAogICAgICAgIH07CiAgICB9CiAgICBjb250aW51ZSB7CiAgICAgICAgJENvdW50Kys7CiAgICB9CgogICAgIyBJZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIG9yZGVyaW5nIGlzIG5vdCBkZXRlcm1pbmVkCiAgICAjICAgd2UgYWRkIGFuIGRlc2NlbmRpbmcgb3JkZXJpbmcgYnkgaWQuCiAgICBpZiAoICFncmVwIHsgJF8gZXEgJ1VzZXJMb2dpbicgfSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgKSB7CiAgICAgICAgcHVzaCBAT3JkZXJCeUZpZWxkcywgewogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdVc2VyTG9naW4nLAogICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICIkU2VsZi0+e0N1c3RvbWVyS2V5fSIsCiAgICAgICAgICAgIERpcmVjdGlvbiAgICAgPT4gJ0Rvd24nLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJENhY2hlS2V5ID0gJ0N1c3RvbWVyU2VhcmNoRGV0YWlsOjonIC4gJFJlc3VsdCAuICRGaWx0ZXIgLiAkUGFyYW17TGltaXR9IC4gJE9yZGVyQnlTdHJpbmc7CgogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkQ2FjaGVEYXRhID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CgogICAgICAgIGlmICggZGVmaW5lZCAkQ2FjaGVEYXRhICkgewogICAgICAgICAgICBpZiAoIHJlZiAkQ2FjaGVEYXRhIGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJENhY2hlRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIHJlZiAkQ2FjaGVEYXRhIGVxICcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRDYWNoZURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ludmFsaWQgcmVmICcgLiByZWYoJENhY2hlRGF0YSkgLiAnIScKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgISRTZWxmLT5fQ29ubmVjdCgpOwoKICAgICMgY0NtYmluZSBuZWVkZWQgYXR0cmlidXRlcy4KICAgIG15IEBBdHRyaWJ1dGVzID0gbWFwIHsgJF8tPntEYXRhYmFzZUZpZWxkfSB9IEBPcmRlckJ5RmllbGRzOwoKICAgICMgUGVyZm9ybSB0aGUgbGRhcCB1c2VyIHNlYXJjaC4KICAgIG15ICRSZXN1bHRTZWFyY2ggPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgYmFzZSAgICAgID0+ICRTZWxmLT57QmFzZUROfSwKICAgICAgICBzY29wZSAgICAgPT4gJFNlbGYtPntTU2NvcGV9LAogICAgICAgIGZpbHRlciAgICA9PiAkRmlsdGVyLAogICAgICAgIHNpemVsaW1pdCA9PiAkU2VsZi0+e1VzZXJTZWFyY2hMaXN0TGltaXR9LAogICAgICAgIGF0dHJzICAgICA9PiBcQEF0dHJpYnV0ZXMsCiAgICApOwoKICAgIGlmICggJFJlc3VsdFNlYXJjaC0+Y29kZSgpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAkUmVzdWx0U2VhcmNoLT5lcnJvcigpLAogICAgICAgICk7CiAgICB9CgogICAgbXkgQFRtcEN1c3RvbWVyVXNlcnM7CiAgICBmb3IgbXkgJEVudHJ5ICggJFJlc3VsdFNlYXJjaC0+YWxsX2VudHJpZXMoKSApIHsKCiAgICAgICAgbXkgJURhdGE7CiAgICAgICAgZm9yIG15ICRPcmRlckJ5IChAT3JkZXJCeUZpZWxkcykgewoKICAgICAgICAgICAgbXkgJEZpZWxkVmFsdWUgPSAkRW50cnktPmdldF92YWx1ZSggJE9yZGVyQnktPntEYXRhYmFzZUZpZWxkfSApOwogICAgICAgICAgICAkRmllbGRWYWx1ZSA9ICRTZWxmLT5fQ29udmVydEZyb20oJEZpZWxkVmFsdWUpOwoKICAgICAgICAgICAgJERhdGF7ICRPcmRlckJ5LT57TmFtZX0gfSA9ICRGaWVsZFZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAVG1wQ3VzdG9tZXJVc2VycywgXCVEYXRhOwogICAgfQoKICAgICMgU29ydCB0aGUgY3VzdG9tZXIgdXNlcnMuCiAgICBAVG1wQ3VzdG9tZXJVc2VycyA9IHNvcnQgeyAkU2VsZi0+X1NlYXJjaFJlc3VsdFNvcnQoQE9yZGVyQnlGaWVsZHMpIH0gQFRtcEN1c3RvbWVyVXNlcnM7CgogICAgbXkgQElEczsKCiAgICAjIENoZWNrIGlmIHVzZXIgbmVlZCB0byBiZSBpbiBhIGdyb3VwIQogICAgaWYgKCAkU2VsZi0+e0dyb3VwRE59ICkgewoKICAgICAgICBGSUxURVJJRDoKICAgICAgICBmb3IgbXkgJERhdGEgKEBUbXBDdXN0b21lclVzZXJzKSB7CgogICAgICAgICAgICBteSAkUmVzdWx0R3JvdXBETiA9ICRTZWxmLT57TERBUH0tPnNlYXJjaCgKICAgICAgICAgICAgICAgIGJhc2UgICAgICA9PiAkU2VsZi0+e0dyb3VwRE59LAogICAgICAgICAgICAgICAgc2NvcGUgICAgID0+ICRTZWxmLT57U1Njb3BlfSwKICAgICAgICAgICAgICAgIGZpbHRlciAgICA9PiAnbWVtYmVyVWlkPScgLiAkRGF0YS0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICBzaXplbGltaXQgPT4gJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSwKICAgICAgICAgICAgICAgIGF0dHJzICAgICA9PiBbJzEuMSddLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBGSUxURVJJRCBpZiAhJFJlc3VsdEdyb3VwRE4tPmFsbF9lbnRyaWVzKCk7CgogICAgICAgICAgICBwdXNoIEBJRHMsICREYXRhLT57VXNlckxvZ2lufTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBASURzID0gbWFwIHsgJF8tPntVc2VyTG9naW59IH0gQFRtcEN1c3RvbWVyVXNlcnM7CiAgICB9CgogICAgaWYgKCAkUGFyYW17TGltaXR9ICkgewogICAgICAgIHNwbGljZSBASURzLCAkUGFyYW17TGltaXR9OwogICAgfQoKICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewoKICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gc2NhbGFyIEBJRHMsCiAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzY2FsYXIgQElEczsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gXEBJRHMsCiAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBcQElEczsKICAgIH0KfQoKc3ViIEN1c3RvbWVySURMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFZhbGlkICAgICAgPSBkZWZpbmVkICRQYXJhbXtWYWxpZH0gPyAkUGFyYW17VmFsaWR9IDogMTsKICAgIG15ICRTZWFyY2hUZXJtID0gJFBhcmFte1NlYXJjaFRlcm19IHx8ICcnOwoKICAgIG15ICRDYWNoZUtleSA9ICJDdXN0b21lcklETGlzdDo6JHtWYWxpZH06OiRTZWFyY2hUZXJtIjsKCiAgICAjIGNoZWNrIGNhY2hlCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gQHskUmVzdWx0fSBpZiByZWYgJFJlc3VsdCBlcSAnQVJSQVknOwogICAgfQoKICAgICMgcHJlcGFyZSBmaWx0ZXIKICAgIG15ICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJJRH09KikiOwogICAgaWYgKCRTZWFyY2hUZXJtKSB7CgogICAgICAgIG15ICRTZWFyY2hGaWx0ZXIgPSAkU2VsZi0+e1NlYXJjaFByZWZpeH0gLiAkU2VhcmNoVGVybSAuICRTZWxmLT57U2VhcmNoU3VmZml4fTsKICAgICAgICAkU2VhcmNoRmlsdGVyID1+IHMvKFwlKykvXCUvZzsKICAgICAgICAkU2VhcmNoRmlsdGVyID1+IHMvKFwqKylcKi8qL2c7CgogICAgICAgICMgcXVvdGUgTERBUCBmaWx0ZXIgdmFsdWUgYnV0IGtlZXAgYXN0ZXJpc2tzIHVuZXNjYXBlZCAod2lsZGNhcmQpCiAgICAgICAgJFNlYXJjaEZpbHRlciA9fiBzL1wqL2VuY29kZWRhc3RlcmlzazIwMTYwOTMwL2c7CiAgICAgICAgJFNlYXJjaEZpbHRlciA9IGVzY2FwZV9maWx0ZXJfdmFsdWUoJFNlYXJjaEZpbHRlcik7CiAgICAgICAgJFNlYXJjaEZpbHRlciA9fiBzL2VuY29kZWRhc3RlcmlzazIwMTYwOTMwLyovZzsKCiAgICAgICAgJEZpbHRlciA9ICIoJFNlbGYtPntDdXN0b21lcklEfT0kU2VhcmNoRmlsdGVyKSI7CgogICAgfQoKICAgIGlmICggJFNlbGYtPntBbHdheXNGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntBbHdheXNGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBhZGQgdmFsaWQgZmlsdGVyCiAgICBpZiAoICRTZWxmLT57VmFsaWRGaWx0ZXJ9ICYmICRWYWxpZCApIHsKICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlciRTZWxmLT57VmFsaWRGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBjcmVhdGUgbGRhcCBjb25uZWN0CiAgICByZXR1cm4gaWYgISRTZWxmLT5fQ29ubmVjdCgpOwoKICAgICMgY29tYmluZSBuZWVkZWQgYXR0cnMKICAgIG15IEBBdHRyaWJ1dGVzID0gKCAkU2VsZi0+e0N1c3RvbWVyS2V5fSwgJFNlbGYtPntDdXN0b21lcklEfSApOwoKICAgICMgcGVyZm9ybSB1c2VyIHNlYXJjaAogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57TERBUH0tPnNlYXJjaCgKICAgICAgICBiYXNlICAgICAgPT4gJFNlbGYtPntCYXNlRE59LAogICAgICAgIHNjb3BlICAgICA9PiAkU2VsZi0+e1NTY29wZX0sCiAgICAgICAgZmlsdGVyICAgID0+ICRGaWx0ZXIsCiAgICAgICAgc2l6ZWxpbWl0ID0+ICRTZWxmLT57VXNlclNlYXJjaExpc3RMaW1pdH0sCiAgICAgICAgYXR0cnMgICAgID0+IFxAQXR0cmlidXRlcywKICAgICk7CgogICAgIyBsb2cgbGRhcCBlcnJvcnMKICAgIGlmICggJFJlc3VsdC0+Y29kZSgpICkgewoKICAgICAgICBpZiAoICRSZXN1bHQtPmNvZGUoKSA9PSA0ICkgewoKICAgICAgICAgICAgIyBSZXN1bHQgY29kZSA0IChMREFQX1NJWkVMSU1JVF9FWENFRURFRCkgaXMgbm9ybWFsIGlmIHRoZXJlCiAgICAgICAgICAgICMgYXJlIG1vcmUgaXRlbXMgaW4gTERBUCB0aGFuIHNlYXJjaCBsaW1pdCBkZWZpbmVkIGluIE9UT0JPIG9yCiAgICAgICAgICAgICMgaW4gTERBUCBzZXJ2ZXIuIEF2b2lkIHNwYW1taW5nIGxvZ3Mgd2l0aCBzdWNoIGVycm9ycy4KICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0xEQVAgc2l6ZSBsaW1pdCBleGNlZWRlZCAoJyAuICRSZXN1bHQtPmVycm9yKCkgLiAnKS4nLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NlYXJjaCBmYWlsZWQhICcgLiAkUmVzdWx0LT5lcnJvcigpLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlVXNlcnM7CiAgICBmb3IgbXkgJEVudHJ5ICggJFJlc3VsdC0+YWxsX2VudHJpZXMoKSApIHsKCiAgICAgICAgbXkgJEZpZWxkVmFsdWUgPSAkRW50cnktPmdldF92YWx1ZSggJFNlbGYtPntDdXN0b21lcklEfSApOwogICAgICAgICRGaWVsZFZhbHVlID0gZGVmaW5lZCAkRmllbGRWYWx1ZSA/ICRGaWVsZFZhbHVlIDogJyc7CgogICAgICAgIG15ICRLZXlWYWx1ZSA9ICRFbnRyeS0+Z2V0X3ZhbHVlKCAkU2VsZi0+e0N1c3RvbWVyS2V5fSApOwogICAgICAgICRLZXlWYWx1ZSA9IGRlZmluZWQgJEtleVZhbHVlID8gJEtleVZhbHVlIDogJyc7CiAgICAgICAgJFVzZXJzeyAkU2VsZi0+X0NvbnZlcnRGcm9tKCRLZXlWYWx1ZSkgfSA9ICRTZWxmLT5fQ29udmVydEZyb20oJEZpZWxkVmFsdWUpOwogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBuZWVkIHRvIGJlIGluIGEgZ3JvdXAhCiAgICBpZiAoICRTZWxmLT57R3JvdXBETn0gKSB7CiAgICAgICAgZm9yIG15ICRGaWx0ZXIyICggc29ydCBrZXlzICVVc2VycyApIHsKICAgICAgICAgICAgbXkgJFJlc3VsdDIgPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgICAgICAgICBiYXNlICAgICAgPT4gJFNlbGYtPntHcm91cEROfSwKICAgICAgICAgICAgICAgIHNjb3BlICAgICA9PiAkU2VsZi0+e1NTY29wZX0sCiAgICAgICAgICAgICAgICBmaWx0ZXIgICAgPT4gJ21lbWJlclVpZD0nIC4gZXNjYXBlX2ZpbHRlcl92YWx1ZSgkRmlsdGVyMiksCiAgICAgICAgICAgICAgICBzaXplbGltaXQgPT4gJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSwKICAgICAgICAgICAgICAgIGF0dHJzICAgICA9PiBbJzEuMSddLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkUmVzdWx0Mi0+YWxsX2VudHJpZXMoKSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkVXNlcnN7JEZpbHRlcjJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgbWFrZSBDdXN0b21lcklEcyB1bmlxdWUKICAgIG15ICVUbXA7CiAgICBAVG1weyB2YWx1ZXMgJVVzZXJzIH0gPSB1bmRlZjsKICAgIG15IEBSZXN1bHQgPSBrZXlzICVUbXA7CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcQFJlc3VsdCwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIEBSZXN1bHQ7Cn0KCnN1YiBDdXN0b21lcklEcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXIhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJEN1c3RvbWVySURzID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gIkN1c3RvbWVySURzOjokUGFyYW17VXNlcn0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIEB7JEN1c3RvbWVySURzfSBpZiByZWYgJEN1c3RvbWVySURzIGVxICdBUlJBWSc7CiAgICB9CgogICAgIyBnZXQgY3VzdG9tZXIgZGF0YQogICAgbXkgJURhdGEgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICBVc2VyID0+ICRQYXJhbXtVc2VyfSwKICAgICk7CgogICAgIyB0aGVyZSBhcmUgbXVsdGkgY3VzdG9tZXIgaWRzCiAgICBteSBAQ3VzdG9tZXJJRHM7CiAgICBpZiAoICREYXRhe1VzZXJDdXN0b21lcklEc30gKSB7CgogICAgICAgICMgdXNlZCBzZXBhcmF0b3JzCiAgICAgICAgU0VQQVJBVE9SOgogICAgICAgIGZvciBteSAkU2VwYXJhdG9yICggJzsnLCAnLCcsICd8JyApIHsKCiAgICAgICAgICAgIG5leHQgU0VQQVJBVE9SIGlmICREYXRhe1VzZXJDdXN0b21lcklEc30gIX4gL1xRJFNlcGFyYXRvclxFLzsKCiAgICAgICAgICAgICMgc3BsaXQgaXQKICAgICAgICAgICAgbXkgQElEcyA9IHNwbGl0IC9cUSRTZXBhcmF0b3JcRS8sICREYXRhe1VzZXJDdXN0b21lcklEc307CgogICAgICAgICAgICBmb3IgbXkgJElEIChASURzKSB7CiAgICAgICAgICAgICAgICAkSUQgPX4gcy9eXHMrLy9nOwogICAgICAgICAgICAgICAgJElEID1+IHMvXHMrJC8vZzsKICAgICAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCAkSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxhc3QgU0VQQVJBVE9SOwogICAgICAgIH0KCiAgICAgICAgIyBmYWxsYmFjayBpZiBubyBzZXBhcmF0b3IgZ290IGZvdW5kCiAgICAgICAgaWYgKCAhQEN1c3RvbWVySURzICkgewogICAgICAgICAgICAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9ID1+IHMvXlxzKy8vZzsKICAgICAgICAgICAgJERhdGF7VXNlckN1c3RvbWVySURzfSA9fiBzL1xzKyQvL2c7CiAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHVzZSBhbHNvIHRoZSBwcmltYXJ5IGN1c3RvbWVyIGlkCiAgICBpZiAoICREYXRhe1VzZXJDdXN0b21lcklEfSAmJiAhJFNlbGYtPntFeGNsdWRlUHJpbWFyeUN1c3RvbWVySUR9ICkgewogICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCAkRGF0YXtVc2VyQ3VzdG9tZXJJRH07CiAgICB9CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbWVySURzOjonIC4gJFBhcmFte1VzZXJ9LAogICAgICAgICAgICBWYWx1ZSA9PiBcQEN1c3RvbWVySURzLAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gQEN1c3RvbWVySURzOwp9CgpzdWIgQ3VzdG9tZXJVc2VyRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXIhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcGVyZm9ybSB1c2VyIHNlYXJjaAogICAgbXkgQEF0dHJpYnV0ZXM7CiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7CiAgICAgICAgcHVzaCggQEF0dHJpYnV0ZXMsICRFbnRyeS0+WzJdICk7CiAgICB9CiAgICBteSAkRmlsdGVyID0gIigkU2VsZi0+e0N1c3RvbWVyS2V5fT0iIC4gZXNjYXBlX2ZpbHRlcl92YWx1ZSggJFBhcmFte1VzZXJ9ICkgLiAnKSc7CgogICAgIyBwcmVwYXJlIGZpbHRlcgogICAgaWYgKCAkU2VsZi0+e0Fsd2F5c0ZpbHRlcn0gKSB7CiAgICAgICAgJEZpbHRlciA9ICIoJiRGaWx0ZXIkU2VsZi0+e0Fsd2F5c0ZpbHRlcn0pIjsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICREYXRhID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJ0N1c3RvbWVyVXNlckRhdGFHZXQ6OicgLiAkUGFyYW17VXNlcn0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJXskRGF0YX0gaWYgcmVmICREYXRhIGVxICdIQVNIJzsKICAgIH0KCiAgICAjIGNyZWF0ZSBsZGFwIGNvbm5lY3QKICAgIHJldHVybiBpZiAhJFNlbGYtPl9Db25uZWN0KCk7CgogICAgIyBwZXJmb3JtIHNlYXJjaAogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57TERBUH0tPnNlYXJjaCgKICAgICAgICBiYXNlICAgPT4gJFNlbGYtPntCYXNlRE59LAogICAgICAgIHNjb3BlICA9PiAkU2VsZi0+e1NTY29wZX0sCiAgICAgICAgZmlsdGVyID0+ICRGaWx0ZXIsCiAgICAgICAgYXR0cnMgID0+IFxAQXR0cmlidXRlcywKICAgICk7CgogICAgIyBsb2cgbGRhcCBlcnJvcnMKICAgIGlmICggJFJlc3VsdC0+Y29kZSgpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAkUmVzdWx0LT5lcnJvcigpLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZpcnN0IGVudHJ5CiAgICBteSAkUmVzdWx0MiA9ICRSZXN1bHQtPmVudHJ5KDApOwogICAgaWYgKCAhJFJlc3VsdDIgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGN1c3RvbWVyIHVzZXIgaW5mbwogICAgbXkgJURhdGE7CiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7CgogICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT5fQ29udmVydEZyb20oICRSZXN1bHQyLT5nZXRfdmFsdWUoICRFbnRyeS0+WzJdICkgKSB8fCAnJzsKCiAgICAgICAgaWYgKCAkVmFsdWUgJiYgJEVudHJ5LT5bMl0gPX4gL150YXJnZXRhZGRyZXNzJC9pICkgewogICAgICAgICAgICAkVmFsdWUgPX4gcy9TTVRQOiguKikvJDEvOwogICAgICAgIH0KCiAgICAgICAgaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntUcmFuc2xhdGVNYW5hZ2VyVG99ICkgKSB7CiAgICAgICAgICAgIGlmICggJFZhbHVlICYmICRFbnRyeS0+WzJdID1+IC9ebWFuYWdlciQvaSApIHsKCiAgICAgICAgICAgICAgICAjIFdlIG5lZWQgdG8gY2hlY2sgaWYgd2UgbmVlZCB0byB0cmFuc2xhdGUgdGhlIG1hbmFnZXIgZmxhZwogICAgICAgICAgICAgICAgbXkgJFRyYW5zbGF0ZVRvID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57VHJhbnNsYXRlTWFuYWdlclRvfTsKCiAgICAgICAgICAgICAgICAjIHBlcmZvcm0gc2VhcmNoCiAgICAgICAgICAgICAgICBteSAkUmVzdWx0TWFuYWdlciA9ICRTZWxmLT57TERBUH0tPnNlYXJjaCgKICAgICAgICAgICAgICAgICAgICBiYXNlICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgICAgIHNjb3BlICA9PiAnYmFzZScsCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0+ICIob2JqZWN0Q2xhc3M9KikiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBmaXJzdCBlbnRyeQogICAgICAgICAgICAgICAgbXkgJFJlc3VsdE1hbmFnZXIyID0gJFJlc3VsdE1hbmFnZXItPmVudHJ5KDApOwogICAgICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPl9Db252ZXJ0RnJvbSggJFJlc3VsdE1hbmFnZXIyLT5nZXRfdmFsdWUoJFRyYW5zbGF0ZVRvKSApIHx8ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRGF0YXsgJEVudHJ5LT5bMF0gfSA9ICRWYWx1ZTsKICAgIH0KCiAgICByZXR1cm4gaWYgISREYXRhe1VzZXJMb2dpbn07CgogICAgIyB0byBidWlsZCB0aGUgVXNlck1haWxTdHJpbmcKICAgIG15ICRVc2VyTWFpbFN0cmluZyA9ICcnOwogICAgbXkgQFVzZXJNYWlsU3RyaW5nUGFydHM7CgogICAgbXkgJEN1c3RvbWVyVXNlckxpc3RGaWVsZHNNYXAgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJMaXN0RmllbGRzfTsKICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc01hcCkgKSB7CiAgICAgICAgJEN1c3RvbWVyVXNlckxpc3RGaWVsZHNNYXAgPSBbICdmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZScsICdlbWFpbCcsIF07CiAgICB9CgogICAgZm9yIG15ICRGaWVsZCAoIEB7JEN1c3RvbWVyVXNlckxpc3RGaWVsZHNNYXB9ICkgewoKICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCAkUmVzdWx0Mi0+Z2V0X3ZhbHVlKCRGaWVsZCkgKSB8fCAnJzsKCiAgICAgICAgaWYgKCRWYWx1ZSkgewogICAgICAgICAgICBpZiAoICRGaWVsZCA9fiAvXnRhcmdldGFkZHJlc3MkL2kgKSB7CiAgICAgICAgICAgICAgICAkVmFsdWUgPX4gcy9TTVRQOiguKikvJDEvOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1c2ggQFVzZXJNYWlsU3RyaW5nUGFydHMsICRWYWx1ZTsKICAgICAgICB9CiAgICB9CiAgICAkVXNlck1haWxTdHJpbmcgPSBqb2luICcgJywgQFVzZXJNYWlsU3RyaW5nUGFydHM7CiAgICAkVXNlck1haWxTdHJpbmcgPX4gcy9eKC4qKVxzKC4rP1xALis/XC4uKz8pKFxzfCkkLyIkMSIgPCQyPi87CgogICAgIyBhZGQgdGhlIFVzZXJNYWlsU3RyaW5nIHRvIHRoZSBkYXRhIGhhc2gKICAgICREYXRhe1VzZXJNYWlsU3RyaW5nfSA9ICRVc2VyTWFpbFN0cmluZzsKCiAgICAjIGNvbXBhdCEKICAgICREYXRhe1VzZXJJRH0gPSAkRGF0YXtVc2VyTG9naW59OwoKICAgICMgZ2V0IHByZWZlcmVuY2VzCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VsZi0+R2V0UHJlZmVyZW5jZXMoIFVzZXJJRCA9PiAkRGF0YXtVc2VyTG9naW59ICk7CgogICAgIyBhZGQgbGFzdCBsb2dpbiB0aW1lc3RhbXAKICAgIGlmICggJFByZWZlcmVuY2Vze1VzZXJMYXN0TG9naW59ICkgewoKICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIEVwb2NoID0+ICRQcmVmZXJlbmNlc3tVc2VyTGFzdExvZ2lufSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkUHJlZmVyZW5jZXN7VXNlckxhc3RMb2dpblRpbWVzdGFtcH0gPSAkRGF0ZVRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CgogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21lclVzZXJEYXRhR2V0OjonIC4gJFBhcmFte1VzZXJ9LAogICAgICAgICAgICBWYWx1ZSA9PiB7ICVEYXRhLCAlUHJlZmVyZW5jZXMgfSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICggJURhdGEsICVQcmVmZXJlbmNlcyApOwp9CgpzdWIgQ3VzdG9tZXJVc2VyQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayByby9ydwogICAgaWYgKCAkU2VsZi0+e1JlYWRPbmx5fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0N1c3RvbWVyIGJhY2tlbmQgaXMgcmVhZCBvbmx5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICdOb3Qgc3VwcG9ydGVkIGZvciB0aGlzIG1vZHVsZSEnCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIEN1c3RvbWVyVXNlclVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcm8vcncKICAgIGlmICggJFNlbGYtPntSZWFkT25seX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDdXN0b21lciBiYWNrZW5kIGlzIHJlYWQgb25seSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAnTm90IHN1cHBvcnRlZCBmb3IgdGhpcyBtb2R1bGUhJwogICAgKTsKCiAgICByZXR1cm47Cn0KCnN1YiBTZXRQYXNzd29yZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQdyA9ICRQYXJhbXtQV30gfHwgJyc7CgogICAgIyBjaGVjayByby9ydwogICAgaWYgKCAkU2VsZi0+e1JlYWRPbmx5fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0N1c3RvbWVyIGJhY2tlbmQgaXMgcmVhZCBvbmx5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICdOb3Qgc3VwcG9ydGVkIGZvciB0aGlzIG1vZHVsZSEnCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIEdlbmVyYXRlUmFuZG9tUGFzc3dvcmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+R2VuZXJhdGVSYW5kb21TdHJpbmcoCiAgICAgICAgTGVuZ3RoICAgICA9PiAkUGFyYW17U2l6ZX0gfHwgOCwKICAgICAgICBEaWN0aW9uYXJ5ID0+IFsgMCAuLiA5LCAnQScgLi4gJ1onLCAnYScgLi4gJ3onLCAnLScsICdfJywgJyEnLCAnQCcsICcjJywgJyQnLCAnJScsICdeJywgJyYnLCAnKicgXSwKICAgICk7Cn0KCnN1YiBTZXRQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWNoZSByZXNldAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAiQ3VzdG9tZXJVc2VyRGF0YUdldDo6JFBhcmFte1VzZXJJRH0iLAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNldFByZWZlcmVuY2VzKCVQYXJhbSk7Cn0KCnN1YiBHZXRQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5HZXRQcmVmZXJlbmNlcyglUGFyYW0pOwp9CgpzdWIgU2VhcmNoUHJlZmVyZW5jZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNlYXJjaFByZWZlcmVuY2VzKCVQYXJhbSk7Cn0KCnN1YiBfQ29udmVydEZyb20gewogICAgbXkgKCAkU2VsZiwgJFRleHQgKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkVGV4dDsKCiAgICBpZiAoICEkU2VsZi0+e1NvdXJjZUNoYXJzZXR9ICkgewogICAgICAgIHJldHVybiAkVGV4dDsKICAgIH0KCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5Db252ZXJ0KAogICAgICAgIFRleHQgPT4gJFRleHQsCiAgICAgICAgRnJvbSA9PiAkU2VsZi0+e1NvdXJjZUNoYXJzZXR9LAogICAgICAgIFRvICAgPT4gJ3V0Zi04JywKICAgICk7Cn0KCnN1YiBfQ29udmVydFRvIHsKICAgIG15ICggJFNlbGYsICRUZXh0ICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFRleHQ7CgogICAgIyBnZXQgZW5jb2RlIG9iamVjdAogICAgbXkgJEVuY29kZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKTsKCiAgICBpZiAoICEkU2VsZi0+e1NvdXJjZUNoYXJzZXR9ICkgewogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZUlucHV0KCBcJFRleHQgKTsKICAgICAgICByZXR1cm4gJFRleHQ7CiAgICB9CgogICAgcmV0dXJuICRFbmNvZGVPYmplY3QtPkNvbnZlcnQoCiAgICAgICAgVGV4dCA9PiAkVGV4dCwKICAgICAgICBUbyAgID0+ICRTZWxmLT57U291cmNlQ2hhcnNldH0sCiAgICAgICAgRnJvbSA9PiAndXRmLTgnLAogICAgKTsKfQoKc3ViIF9DdXN0b21lclVzZXJDYWNoZUNsZWFyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0NhY2hlT2JqZWN0fTsKCiAgICBpZiAoICEkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlckxvZ2luIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICJDdXN0b21lclVzZXJEYXRhR2V0OjokUGFyYW17VXNlckxvZ2lufSIsCiAgICApOwogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICJDdXN0b21lck5hbWU6OiRQYXJhbXtVc2VyTG9naW59IiwKICAgICk7CgogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoJywKICAgICk7CgogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAnQ3VzdG9tZXJHcm91cCcsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX1NlYXJjaFJlc3VsdFNvcnQgewogICAgbXkgKCAkU2VsZiwgQE9yZGVyQnlGaWVsZHMgKSA9IEBfOwoKICAgIGZvciBteSAkT3JkZXJCeSAoQE9yZGVyQnlGaWVsZHMpIHsKICAgICAgICBteSAkQ29tcGFyZTsKCiAgICAgICAgaWYgKCAkT3JkZXJCeS0+e0RpcmVjdGlvbn0gJiYgJE9yZGVyQnktPntEaXJlY3Rpb259IGVxICdVcCcgKSB7CiAgICAgICAgICAgICRDb21wYXJlID0gbGMoICRhLT57ICRPcmRlckJ5LT57TmFtZX0gfSApIGNtcCBsYyggJGItPnsgJE9yZGVyQnktPntOYW1lfSB9ICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ29tcGFyZSA9IGxjKCAkYi0+eyAkT3JkZXJCeS0+e05hbWV9IH0gKSBjbXAgbGMoICRhLT57ICRPcmRlckJ5LT57TmFtZX0gfSApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJENvbXBhcmUgaWYgJENvbXBhcmU7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3ViIERFU1RST1kgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHRha2UgZG93biBzZXNzaW9uCiAgICBpZiAoICRTZWxmLT57TERBUH0gKSB7CiAgICAgICAgJFNlbGYtPntMREFQfS0+dW5iaW5kKCk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/System/CustomerCompany.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL1N5c3RlbS9DdXN0b21lckNvbXBhbnkucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAojIEVPIFJvdGhlciBPU1MKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlJlZmVyZW5jZURhdGEnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueSAtIGN1c3RvbWVyIGNvbXBhbnkgbGliCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBDdXN0b21lciBmdW5jdGlvbnMuIEUuZy4gdG8gYWRkIGFuZCB1cGRhdGUgY3VzdG9tZXIgY29tcGFuaWVzLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKRG9uJ3QgdXNlIHRoZSBjb25zdHJ1Y3RvciBkaXJlY3RseSwgdXNlIHRoZSBPYmplY3RNYW5hZ2VyIGluc3RlYWQ6CgogICAgbXkgJEN1c3RvbWVyQ29tcGFueU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRNYWluT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgIG15ICRMYXlvdXRQYXJhbSA9ICRLZXJuZWw6Ok9NLT57UGFyYW19LT57J0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnfTsKCiAgICAjIENoZWNrIGlmIG11bHRpdGVuYW5jeSBpcyBlbmFibGVkIGFuZCB0aGUgcmVxdWVzdCBpcyBjb21pbmcgZnJvbSBhIHVzZXIuCiAgICBpZiAoICRMYXlvdXRQYXJhbS0+e1VzZXJUeXBlfSAmJiAkTGF5b3V0UGFyYW0tPntVc2VyVHlwZX0gZXEgJ1VzZXInICYmICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5JykgKSB7CgogICAgICAgICMgU2F2ZSB0aGUgVXNlcklEIGFuZCBhbGwgZ3JvdXBzIHRoZSB1c2VyIGhhcyAncm8nIHBlcm1pc3Npb24gb24uCiAgICAgICAgaWYgKCAkTGF5b3V0UGFyYW0tPntVc2VySUR9ICkgewogICAgICAgICAgICAjIE9ubHkgZ2V0IHRoZSBncm91cCBsaXN0IG9uY2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCiAgICAgICAgICAgIG15ICVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJExheW91dFBhcmFtLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBUaGUgbGltaXQgZG9lcyBub3QgY291bnQgZm9yIG1lbWJlcnMgb2YgYSBzcGVjaWZpYyBncm91cC4KICAgICAgICAgICAgbXkgJFBlcm1pc3Npb25Hcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5OjpQZXJtaXNzaW9uR3JvdXAnKSB8fCAnJzsKICAgICAgICAgICAgbXkgJUdyb3Vwc1JldmVyc2UgICA9IHJldmVyc2UgJUdyb3VwczsKCiAgICAgICAgICAgIGlmICggISRHcm91cHNSZXZlcnNleyRQZXJtaXNzaW9uR3JvdXB9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntNdWx0aXRlbmFuY3l9ID0gJExheW91dFBhcmFtLT57VXNlcklEfTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlckdyb3VwSURzfSA9IFsga2V5cyAlR3JvdXBzIF07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cHN9ICAgPSBbIHZhbHVlcyAlR3JvdXBzIF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAjIGxvYWQgY3VzdG9tZXIgY29tcGFueSBiYWNrZW5kIG1vZHVsZXMKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHNvdXJjZS4KICAgICAgICBteSAkQ3VzdG9tZXJDb21wYW55VXNlckdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckNvbXBhbnkkQ291bnQiKS0+e0N1c3RvbWVyQ29tcGFueVVzZXJHcm91cH07CgogICAgICAgICMgVGhlIHVzZXIgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGdldCBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgc291cmNlLgogICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICYmICRDdXN0b21lckNvbXBhbnlVc2VyR3JvdXAgKSB7CiAgICAgICAgICAgIGlmICggIWdyZXAgeyAkXyA9fiAvXiRDdXN0b21lckNvbXBhbnlVc2VyR3JvdXAkLyB9IEB7ICRTZWxmLT57VXNlckdyb3Vwc30gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckNvbXBhbnkkQ291bnQiKS0+e01vZHVsZX0KICAgICAgICAgICAgfHwgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnk6OkRCJzsKICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgICAgICRNYWluT2JqZWN0LT5EaWUoIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUhICRAIik7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9ID0gJEdlbmVyaWNNb2R1bGUtPm5ldygKICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgQ3VzdG9tZXJDb21wYW55TWFwID0+ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50IiksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgJFNlbGYtPkV2ZW50SGFuZGxlckluaXQoCiAgICAgICAgQ29uZmlnID0+ICdDdXN0b21lckNvbXBhbnk6OkV2ZW50TW9kdWxlUG9zdCcsCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueUFkZCgpCgphZGQgYSBuZXcgY3VzdG9tZXIgY29tcGFueQoKICAgIG15ICRJRCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUFkZCgKICAgICAgICBDdXN0b21lcklEICAgICAgICAgICAgICA9PiAnZXhhbXBsZS5jb20nLAogICAgICAgIEN1c3RvbWVyQ29tcGFueU5hbWUgICAgID0+ICdOZXcgQ3VzdG9tZXIgSW5jLicsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55U3RyZWV0ICAgPT4gJzUyMDEgQmx1ZSBMYWdvb24gRHJpdmUnLAogICAgICAgIEN1c3RvbWVyQ29tcGFueVpJUCAgICAgID0+ICczMzEyNicsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q2l0eSAgICAgPT4gJ01pYW1pJywKICAgICAgICBDdXN0b21lckNvbXBhbnlDb3VudHJ5ICA9PiAnVVNBJywKICAgICAgICBDdXN0b21lckNvbXBhbnlVUkwgICAgICA9PiAnaHR0cDovL3d3dy5leGFtcGxlLm9yZycsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q29tbWVudCAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKTk9URTogQWN0dWFsIGZpZWxkcyBhY2NlcHRlZCBieSB0aGlzIEFQSSBjYWxsIG1heSBkaWZmZXIgYmFzZWQgb24KQ3VzdG9tZXJDb21wYW55IG1hcHBpbmcgaW4geW91ciBzeXN0ZW0gY29uZmlndXJhdGlvbi4KCj1jdXQKCnN1YiBDdXN0b21lckNvbXBhbnlBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBkZWZhdWx0cwogICAgJFBhcmFte1NvdXJjZX0gfHw9ICdDdXN0b21lckNvbXBhbnknOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KEN1c3RvbWVySUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHN0b3JlIGN1c3RvbWVyIGNvbXBhbnkgZGF0YQogICAgbXkgJEN1c3RvbWVySUQgPSAkU2VsZi0+eyAkUGFyYW17U291cmNlfSB9LT5DdXN0b21lckNvbXBhbnlBZGQoJVBhcmFtKTsKCiAgICByZXR1cm4gdW5sZXNzICRDdXN0b21lcklEOwoKICAgICMgdHJpZ2dlciBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ3VzdG9tZXJDb21wYW55QWRkJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICBOZXdEYXRhICAgID0+IFwlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQ3VzdG9tZXJJRDsKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueUdldCgpCgpnZXQgY3VzdG9tZXIgY29tcGFueSBhdHRyaWJ1dGVzCgogICAgbXkgJUN1c3RvbWVyQ29tcGFueSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICBDdXN0b21lcklEID0+IDEyMywKICAgICk7CgpSZXR1cm5zOgoKICAgICVDdXN0b21lckNvbXBhbnkgPSAoCiAgICAgICAgJ0N1c3RvbWVyQ29tcGFueU5hbWUnICAgID0+ICdDdXN0b21lciBJbmMuJywKICAgICAgICAnQ3VzdG9tZXJJRCcgICAgICAgICAgICAgPT4gJ2V4YW1wbGUuY29tJywKICAgICAgICAnQ3VzdG9tZXJDb21wYW55U3RyZWV0JyAgPT4gJzUyMDEgQmx1ZSBMYWdvb24gRHJpdmUnLAogICAgICAgICdDdXN0b21lckNvbXBhbnlaSVAnICAgICA9PiAnMzMxMjYnLAogICAgICAgICdDdXN0b21lckNvbXBhbnlDaXR5JyAgICA9PiAnTWlhbWknLAogICAgICAgICdDdXN0b21lckNvbXBhbnlDb3VudHJ5JyA9PiAnVW5pdGVkIFN0YXRlcycsCiAgICAgICAgJ0N1c3RvbWVyQ29tcGFueVVSTCcgICAgID0+ICdodHRwOi8vZXhhbXBsZS5jb20nLAogICAgICAgICdDdXN0b21lckNvbXBhbnlDb21tZW50JyA9PiAnU29tZSBDb21tZW50cycsCiAgICAgICAgJ1ZhbGlkSUQnICAgICAgICAgICAgICAgID0+ICcxJywKICAgICAgICAnQ3JlYXRlVGltZScgICAgICAgICAgICAgPT4gJzIwMTAtMTAtMDQgMTY6MzU6NDknLAogICAgICAgICdDaGFuZ2VUaW1lJyAgICAgICAgICAgICA9PiAnMjAxMC0xMC0wNCAxNjozNjoxMicsCiAgICApOwoKTk9URTogQWN0dWFsIGZpZWxkcyByZXR1cm5lZCBieSB0aGlzIEFQSSBjYWxsIG1heSBkaWZmZXIgYmFzZWQgb24KQ3VzdG9tZXJDb21wYW55IG1hcHBpbmcgaW4geW91ciBzeXN0ZW0gY29uZmlndXJhdGlvbi4KCj1jdXQKCnN1YiBDdXN0b21lckNvbXBhbnlHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBDdXN0b21lcklEISIKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBGZXRjaCBkeW5hbWljIGZpZWxkIGNvbmZpZ3VyYXRpb25zIGZvciBDdXN0b21lckNvbXBhbnkuCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICk7CgogICAgbXkgJUR5bmFtaWNGaWVsZExvb2t1cCA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSAkRHluYW1pY0ZpZWxkQ29uZmlncy0+QCo7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgc2VhcmNoIGZvciB0aGUgY29tcGFueSBpbiB0aGUgY29uZmlndXJlZCBzb3VyY2VzCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIHVubGVzcyAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifTsKCiAgICAgICAgbXkgJUNvbXBhbnkgPSAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+Q3VzdG9tZXJDb21wYW55R2V0KCAlUGFyYW0sICk7CgogICAgICAgIG5leHQgU09VUkNFIHVubGVzcyAlQ29tcGFueTsKCiAgICAgICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIHZhbHVlcwogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9ICkgKSB7CiAgICAgICAgICAgIENVU1RPTUVSQ09NUEFOWUZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVyQ29tcGFueUZpZWxkICggQHsgJFNlbGYtPnsiQ3VzdG9tZXJDb21wYW55JENvdW50In0tPntDdXN0b21lckNvbXBhbnlNYXB9LT57TWFwfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUkNPTVBBTllGSUVMRCB1bmxlc3MgJEN1c3RvbWVyQ29tcGFueUZpZWxkLT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUkNPTVBBTllGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZExvb2t1cHsgJEN1c3RvbWVyQ29tcGFueUZpZWxkLT5bMl0gfTsKCiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRMb29rdXB7ICRDdXN0b21lckNvbXBhbnlGaWVsZC0+WzJdIH0sCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRDb21wYW55e0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ29tcGFueXsgJEN1c3RvbWVyQ29tcGFueUZpZWxkLT5bMF0gfSA9ICRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBDaGVjayBwZXJtaXNzaW9uLgogICAgICAgIG15ICRVc2VyR3JvdXBJRFN5bmMgPSAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntVc2VyR3JvdXBJRFN5bmN9OwoKICAgICAgICBpZiAoICRDb21wYW55e1VzZXJHcm91cElEfSAmJiAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9ICkgewogICAgICAgICAgICAjIFJlcGxhY2UgdGhlIHJlbW90ZSBncm91cCB3aXRoIHRoZSBhc3NvY2lhdGVkIGxvY2FsIGdyb3VwLgogICAgICAgICAgICBmb3IgbXkgJFJlbW90ZUdyb3VwICgga2V5cyAleyAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRDb21wYW55e1VzZXJHcm91cElEfSBlcSAkUmVtb3RlR3JvdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJExvY2FsR3JvdXAgPSAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9eyRSZW1vdGVHcm91cH07CiAgICAgICAgICAgICAgICAgICAgJENvbXBhbnl7VXNlckdyb3VwSUR9ID0gJExvY2FsR3JvdXA7CgogICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgZ3JvdXAgSUQgb3IgZ3JvdXAgbmFtZXMgc2hvdWxkIGJlIHVzZWQuCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVXNlckdyb3VwSURTeW5jLT57VXNlR3JvdXBOYW1lc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRHcm91cElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgPT4gJExvY2FsR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAkQ29tcGFueXtVc2VyR3JvdXBJRH0gPSAkR3JvdXBJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICYmICRDb21wYW55e1VzZXJHcm91cElEfSApIHsKICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIGluZm9ybWF0aW9uLgogICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gPX4gL14kQ29tcGFueXtVc2VyR3JvdXBJRH0kLyB9IEB7ICRTZWxmLT57VXNlckdyb3VwSURzfSB9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgICMgcmV0dXJuIGRhdGEgZm9yIHRoZSBmaXJzdCBmb3VuZCBjb21wYW55CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgJUNvbXBhbnksCiAgICAgICAgICAgIFNvdXJjZSA9PiAiQ3VzdG9tZXJDb21wYW55JENvdW50IiwKICAgICAgICAgICAgQ29uZmlnID0+ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50IiksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbXBhbnkgd2FzIG5vdCBmb3VuZAogICAgcmV0dXJuOwp9Cgo9aGVhZDIgQ3VzdG9tZXJDb21wYW55VXBkYXRlKCkKCnVwZGF0ZSBjdXN0b21lciBjb21wYW55IGF0dHJpYnV0ZXMKCiAgICAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlVcGRhdGUoCiAgICAgICAgQ3VzdG9tZXJDb21wYW55SUQgICAgICAgPT4gJ29sZGV4YW1wbGUuY29tJywgIyByZXF1aXJlZCBmb3IgQ3VzdG9tZXJDb21wYW55SUQtdXBkYXRlCiAgICAgICAgQ3VzdG9tZXJJRCAgICAgICAgICAgICAgPT4gJ2V4YW1wbGUuY29tJywKICAgICAgICBDdXN0b21lckNvbXBhbnlOYW1lICAgICA9PiAnTmV3IEN1c3RvbWVyIEluYy4nLAogICAgICAgIEN1c3RvbWVyQ29tcGFueVN0cmVldCAgID0+ICc1MjAxIEJsdWUgTGFnb29uIERyaXZlJywKICAgICAgICBDdXN0b21lckNvbXBhbnlaSVAgICAgICA9PiAnMzMxMjYnLAogICAgICAgIEN1c3RvbWVyQ29tcGFueUxvY2F0aW9uID0+ICdNaWFtaScsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q291bnRyeSAgPT4gJ1VTQScsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55VVJMICAgICAgPT4gJ2h0dHA6Ly9leGFtcGxlLmNvbScsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q29tbWVudCAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRQYXJhbXtDdXN0b21lckNvbXBhbnlJRH0gfHw9ICRQYXJhbXtDdXN0b21lcklEfTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgQ3VzdG9tZXJDb21wYW55SUQgb3IgQ3VzdG9tZXJJRCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBjb21wYW55IGV4aXN0cwogICAgbXkgJUNvbXBhbnkgPSAkU2VsZi0+Q3VzdG9tZXJDb21wYW55R2V0KCBDdXN0b21lcklEID0+ICRQYXJhbXtDdXN0b21lckNvbXBhbnlJRH0gKTsKICAgIGlmICggISVDb21wYW55ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBjb21wYW55ICckUGFyYW17Q3VzdG9tZXJDb21wYW55SUR9JyEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIGNoYW5nZSB0aGUgVXNlckdyb3VwSUQuCiAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICAjIFNldCB0aGUgVXNlckdyb3VwSUQgdG8gdGhlIGN1cnJlbnQgVXNlckdyb3VwSUQuCiAgICAgICAgaWYgKCAkQ29tcGFueXtVc2VyR3JvdXBJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtVc2VyR3JvdXBJRH0gPSAkQ29tcGFueXtVc2VyR3JvdXBJRH07CiAgICAgICAgfQogICAgfQoKICAgIG15ICRVc2VyR3JvdXBJRFN5bmMgPSAkU2VsZi0+eyRDb21wYW55e1NvdXJjZX19LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1VzZXJHcm91cElEU3luY307CiAgICBpZiAoICRQYXJhbXtVc2VyR3JvdXBJRH0gKSB7CiAgICAgICAgIyBDaGVjayBpZiBncm91cCBJRCBvciBncm91cCBuYW1lcyBzaG91bGQgYmUgdXNlZC4KICAgICAgICBpZiAoICRVc2VyR3JvdXBJRFN5bmMtPntVc2VHcm91cE5hbWVzfSApIHsKICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJFBhcmFte1VzZXJHcm91cElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgUmVwbGFjZSB0aGUgbG9jYWwgZ3JvdXAgd2l0aCB0aGUgYXNzb2NpYXRlZCByZW1vdGUgZ3JvdXAuCiAgICAgICAgZm9yIG15ICRSZW1vdGVHcm91cCAoIGtleXMgJXsgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSB9ICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtVc2VyR3JvdXBJRH0gZXEgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfXskUmVtb3RlR3JvdXB9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRSZW1vdGVHcm91cDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+eyAkQ29tcGFueXtTb3VyY2V9IH0tPkN1c3RvbWVyQ29tcGFueVVwZGF0ZSglUGFyYW0pOwoKICAgIHJldHVybiB1bmxlc3MgJFJlc3VsdDsKCiAgICAjIHRyaWdnZXIgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0N1c3RvbWVyQ29tcGFueVVwZGF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBDdXN0b21lcklEICAgID0+ICRQYXJhbXtDdXN0b21lcklEfSwKICAgICAgICAgICAgT2xkQ3VzdG9tZXJJRCA9PiAkUGFyYW17Q3VzdG9tZXJDb21wYW55SUR9LAogICAgICAgICAgICBOZXdEYXRhICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgIE9sZERhdGEgICAgICAgPT4gXCVDb21wYW55LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QoKQoKcmV0dXJuIGN1c3RvbWVyIGNvbXBhbnkgc291cmNlIGxpc3QKCiAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QoCiAgICAgICAgUmVhZE9ubHkgPT4gMCAjIG9wdGlvbmFsLCAxIHJldHVybnMgb25seSBSTyBiYWNrZW5kcywgMCByZXR1cm5zIHdyaXRhYmxlLCBpZiBub3QgcGFzc2VkIHJldHVybnMgYWxsIGJhY2tlbmRzCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAlRGF0YTsKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CgogICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17UmVhZE9ubHl9ICkgewogICAgICAgICAgICBteSAkQmFja2VuZENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CiAgICAgICAgICAgIGlmICggJFBhcmFte1JlYWRPbmx5fSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkQmFja2VuZENvbmZpZy0+e1JlYWRPbmx5fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICRCYWNrZW5kQ29uZmlnLT57UmVhZE9ubHl9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRGF0YXsiQ3VzdG9tZXJDb21wYW55JENvdW50In0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyQ29tcGFueSRDb3VudCIpLT57TmFtZX0KICAgICAgICAgICAgfHwgIk5vIE5hbWUgJENvdW50IjsKICAgIH0KCiAgICByZXR1cm4gJURhdGE7Cn0KCj1oZWFkMiBDdXN0b21lckNvbXBhbnlMaXN0KCkKCmdldCBsaXN0IG9mIGN1c3RvbWVyIGNvbXBhbmllcy4KCiAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoKTsKCiAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICAgICBMaW1pdCA9PiAwLCAgICAgIyBvcHRpb25hbCwgb3ZlcnJpZGUgY29uZmlndXJlZCBzZWFyY2ggcmVzdWx0IGxpbWl0ICgwIG1lYW5zIHVubGltaXRlZCkKICAgICk7CgogICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlMaXN0KAogICAgICAgIFNlYXJjaCA9PiAnc29tZWNvbXBhbnknLAogICAgKTsKClJldHVybnM6CgogICAgJUxpc3QgPSB7CiAgICAgICAgJ2V4YW1wbGUuY29tJyA9PiAnZXhhbXBsZS5jb20gQ3VzdG9tZXIgSW5jLicsCiAgICAgICAgJ2FjbWUuY29tJyAgICA9PiAnYWNtZS5jb20gQWNtZSwgSW5jLicKICAgIH07Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJDb21wYW55TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IGR5bmFtaWMgZmllbGQgb2JqZWN0LgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJDb21wYW55JywKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICApOwoKICAgIG15ICVEeW5hbWljRmllbGRMb29rdXAgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc307CgogICAgIyBHZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdC4KICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIG15ICVEYXRhOwogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJDb21wYW55JENvdW50In07CgogICAgICAgICMgc2VhcmNoIGR5bmFtaWMgZmllbGQgdmFsdWVzLCBpZiBjb25maWd1cmVkCiAgICAgICAgbXkgJE1hcCA9ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH07CiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJE1hcCkgKSB7CgogICAgICAgICAgICAjIGZldGNoIGR5bmFtaWMgZmllbGQgbmFtZXMgdGhhdCBhcmUgY29uZmlndXJlZCBpbiBNYXAKICAgICAgICAgICAgIyBvbmx5IHRoZXNlIHdpbGwgYmUgY29uc2lkZXJlZCBmb3IgYW55IG90aGVyIHNlYXJjaCBjb25maWcKICAgICAgICAgICAgIyBbICdEeW5hbWljRmllbGRfTmFtZV9ZJywgdW5kZWYsICdOYW1lX1knLCAwLCAwLCAnZHluYW1pY19maWVsZCcsIHVuZGVmLCAwLF0sCiAgICAgICAgICAgIG15ICVEeW5hbWljRmllbGROYW1lcyA9IG1hcCB7ICRfLT5bMl0gPT4gMSB9IGdyZXAgeyAkXy0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJyB9IEB7JE1hcH07CgogICAgICAgICAgICBpZiAoJUR5bmFtaWNGaWVsZE5hbWVzKSB7CiAgICAgICAgICAgICAgICBteSAkRm91bmREeW5hbWljRmllbGRPYmplY3RJRHM7CiAgICAgICAgICAgICAgICBteSAkU2VhcmNoRmllbGRzOwogICAgICAgICAgICAgICAgbXkgJFNlYXJjaFBhcmFtOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgd2hpY2ggb2YgdGhlIGR5bmFtaWMgZmllbGRzIGNvbmZpZ3VyZWQgaW4gTWFwIGFyZSBhbHNvCiAgICAgICAgICAgICAgICAjIGNvbmZpZ3VyZWQgaW4gU2VhcmNoRmllbGRzCgogICAgICAgICAgICAgICAgIyBwYXJhbSBTZWFyY2gKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17U2VhcmNofSAmJiBsZW5ndGggJFBhcmFte1NlYXJjaH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkcyA9ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkc307CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFtICA9ICRQYXJhbXtTZWFyY2h9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2VhcmNoIGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkU2VhcmNoRmllbGRzKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAU2VhcmNoRHluYW1pY0ZpZWxkTmFtZXMgPSBncmVwIHsgZXhpc3RzICREeW5hbWljRmllbGROYW1lc3skX30gfSBAeyRTZWFyY2hGaWVsZHN9OwoKICAgICAgICAgICAgICAgICAgICBteSAlRm91bmREeW5hbWljRmllbGRPYmplY3RJRHM7CiAgICAgICAgICAgICAgICAgICAgRklFTEROQU1FOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGROYW1lIChAU2VhcmNoRHluYW1pY0ZpZWxkTmFtZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkTG9va3VweyRGaWVsZE5hbWV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRE5BTUUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZFZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNlYXJjaCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoICAgICAgICAgICAgID0+ICRTZWFyY2hQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCREeW5hbWljRmllbGRWYWx1ZXMpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRWYWx1ZSAoIEB7JER5bmFtaWNGaWVsZFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEZvdW5kRHluYW1pY0ZpZWxkT2JqZWN0SURzeyAkRHluYW1pY0ZpZWxkVmFsdWUtPntPYmplY3RJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEcyA9IFsga2V5cyAlRm91bmREeW5hbWljRmllbGRPYmplY3RJRHMgXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGV4ZWN1dGUgYmFja2VuZCBzZWFyY2ggZm9yIGZvdW5kIG9iamVjdCBJRHMKICAgICAgICAgICAgICAgICMgdGhpcyBkYXRhIGlzIGJlaW5nIG1lcmdlZCB3aXRoIHRoZSBmb2xsb3dpbmcgQ3VzdG9tZXJDb21wYW55TGlzdCBjYWxsCiAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkRm91bmREeW5hbWljRmllbGRPYmplY3RJRHMpICkgewoKICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0TmFtZXMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5PYmplY3RNYXBwaW5nR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgID0+ICRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEcywKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBteSAlU2VhcmNoUGFyYW0gPSAlUGFyYW07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRTZWFyY2hQYXJhbXtTZWFyY2h9OwogICAgICAgICAgICAgICAgICAgIG15ICVDb21wYW55TGlzdCA9ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT5DdXN0b21lckNvbXBhbnlMaXN0KCVTZWFyY2hQYXJhbSk7CgogICAgICAgICAgICAgICAgICAgIE9CSkVDVE5BTUU6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRPYmplY3ROYW1lICggdmFsdWVzICV7JE9iamVjdE5hbWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBPQkpFQ1ROQU1FIGlmIGV4aXN0cyAkRGF0YXskT2JqZWN0TmFtZX07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJUNvbXBhbnlMaXN0ICkgJiYgZXhpc3RzICRDb21wYW55TGlzdHskT2JqZWN0TmFtZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRGF0YSA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkT2JqZWN0TmFtZSA9PiAkQ29tcGFueUxpc3R7JE9iamVjdE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjb21wYW55IGxpc3QgcmVzdWx0IG9mIGJhY2tlbmQgYW5kIG1lcmdlIGl0CiAgICAgICAgbXkgJVN1YkRhdGEgPSAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+Q3VzdG9tZXJDb21wYW55TGlzdCglUGFyYW0pOwogICAgICAgICVEYXRhID0gKCAlRGF0YSwgJVN1YkRhdGEgKTsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHNlZSB0aGUgY3VzdG9tZXIgdXNlciBkYXRhLgogICAgIyBJbXByb3ZlOiBDaGVjayBldmVyeSBjb21wYW55IG9uZSBieSBvbmUgYXMgQ3VzdG9tZXJDb21wYW55TGlzdCBkb2VzIHNvbWV0aW1lcyByZXR1cm4gYSBub24gZmlsdGVyZWQgbGlzdCAoQ3VzdG9tZXJDb21wYW55IGFkZCkKICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoIGtleXMgJURhdGEgKSB7CiAgICAgICAgICAgIG15ICVDb21wYW55ID0gJFNlbGYtPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICElQ29tcGFueSB8fCAhJENvbXBhbnl7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJERhdGF7JEN1c3RvbWVySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aGVhZDIgQ3VzdG9tZXJDb21wYW55U2VhcmNoRGV0YWlsKCkKClRvIGZpbmQgY3VzdG9tZXIgY29tcGFuaWVzIGluIHRoZSBzeXN0ZW0uCgpUaGUgc2VhcmNoIGNyaXRlcmlhIGFyZSBsb2dpY2FsbHkgQU5EIGNvbm5lY3RlZC4KV2hlbiBhIGxpc3QgaXMgcGFzc2VkIGFzIGNyaXRlcmlhLCB0aGUgaW5kaXZpZHVhbCBtZW1iZXJzIGFyZSBPUiBjb25uZWN0ZWQuCldoZW4gYW4gdW5kZWYgb3IgYSByZWZlcmVuY2UgdG8gYW4gZW1wdHkgYXJyYXkgaXMgcGFzc2VkLCB0aGVuIHRoZSBzZWFyY2ggY3JpdGVyaWEKaXMgaWdub3JlZC4KClJldHVybnMgZWl0aGVyIGEgbGlzdCwgYXMgYW4gYXJyYXlyZWYsIG9yIGEgY291bnQgb2YgZm91bmQgY3VzdG9tZXIgY29tcGFueSBpZHMuClRoZSBjb3VudCBvZiByZXN1bHRzIGlzIHJldHVybmVkIHdoZW4gdGhlIHBhcmFtZXRlciBDPFJlc3VsdCA9ICdDT1VOVCc+IGlzIHBhc3NlZC4KCiAgICBteSAkQ3VzdG9tZXJDb21wYW55SURzUmVmID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55U2VhcmNoRGV0YWlsKAoKICAgICAgICAjIGFsbCBmaWVsZHMgaW4gYSBDdXN0b21lckNvbXBhbnlNYXAgYXJlIHNlYXJjaGFibGUKICAgICAgICBDdXN0b21lcklEICAgICAgICAgID0+ICdleGFtcGxlKicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEN1c3RvbWVyQ29tcGFueU5hbWUgPT4gJ05hbWUqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgYXJyYXkgcGFyYW1ldGVycyBhcmUgdXNlZCB3aXRoIGxvZ2ljYWwgT1Igb3BlcmF0b3IgKGFsbCB2YWx1ZXMgYXJlIHBvc3NpYmxlIHdoaWNoCiAgICAgICAgYXJlIGRlZmluZWQgaW4gdGhlIGNvbmZpZyBzZWxlY3Rpb24gaGFzaCBmb3IgdGhlIGZpZWxkKQogICAgICAgIEN1c3RvbWVyQ29tcGFueUNvdW50cnkgPT4gWyAnQXVzdHJpYScsICdHZXJtYW55JywgXSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgRHluYW1pY0ZpZWxkcwogICAgICAgICMgICBBdCBsZWFzdCBvbmUgb3BlcmF0b3IgbXVzdCBiZSBzcGVjaWZpZWQuIE9wZXJhdG9ycyB3aWxsIGJlIGNvbm5lY3RlZCB3aXRoIEFORCwKICAgICAgICAjICAgICAgIHZhbHVlcyBpbiBhbiBvcGVyYXRvciB3aXRoIE9SLgogICAgICAgICMgICBZb3UgY2FuIGFsc28gcGFzcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IHRvIGFuIG9wZXJhdG9yOiBbJ3ZhbHVlMScsICd2YWx1ZTInXQogICAgICAgIER5bmFtaWNGaWVsZF9GaWVsZE5hbWVYID0+IHsKICAgICAgICAgICAgRXF1YWxzICAgICAgICAgICAgPT4gMTIzLAogICAgICAgICAgICBMaWtlICAgICAgICAgICAgICA9PiAndmFsdWUqJywgICAgICAgICAgICAgICAgIyAiZXF1YWxzIiBvcGVyYXRvciB3aXRoIHdpbGRjYXJkIHN1cHBvcnQKICAgICAgICAgICAgR3JlYXRlclRoYW4gICAgICAgPT4gJzIwMDEtMDEtMDEgMDE6MDE6MDEnLAogICAgICAgICAgICBHcmVhdGVyVGhhbkVxdWFscyA9PiAnMjAwMS0wMS0wMSAwMTowMTowMScsCiAgICAgICAgICAgIFNtYWxsZXJUaGFuICAgICAgID0+ICcyMDAyLTAyLTAyIDAyOjAyOjAyJywKICAgICAgICAgICAgU21hbGxlclRoYW5FcXVhbHMgPT4gJzIwMDItMDItMDIgMDI6MDI6MDInLAogICAgICAgIH0KCiAgICAgICAgT3JkZXJCeSA9PiBbICdDdXN0b21lcklEJywgJ0N1c3RvbWVyQ29tcGFueUNvdW50cnknIF0sICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgaWYgdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgICAgICAjIGRlZmF1bHQ6IFsgJ0N1c3RvbWVySUQnIF0KICAgICAgICAjIChhbGwgZmllbGRzIHdoaWNoIGFyZSBpbiBhIEN1c3RvbWVyQ29tcGFueU1hcCBjYW4gYmUgdXNlZCBmb3Igb3JkZXJpbmcpCgogICAgICAgICMgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgT3JkZXJCeToKICAgICAgICAjIFRoZSBPcmRlckJ5RGlyZWN0aW9uIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGVhY2ggT3JkZXJCeSBhdHRyaWJ1dGUuCiAgICAgICAgIyBUaGUgcGFpcmluZyBpcyBtYWRlIGJ5IHRoZSBhcnJheSBpbmRpY2VzLgoKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsgJ0Rvd24nLCAnVXAnIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgICAgICMgKERvd24gfCBVcCkgRGVmYXVsdDogWyAnRG93bicgXQoKICAgICAgICBSZXN1bHQgPT4gJ0FSUkFZJyB8fCAnQ09VTlQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgZGVmYXVsdDogQVJSQVksIHJldHVybnMgYW4gYXJyYXkgb2YgY2hhbmdlIGlkcwogICAgICAgICMgQ09VTlQgcmV0dXJucyBhIHNjYWxhciB3aXRoIHRoZSBudW1iZXIgb2YgZm91bmQgY2hhbmdlcwoKICAgICAgICBMaW1pdCA9PiAxMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgKTsKClJldHVybnM6CgpSZXN1bHQ6ICdBUlJBWScKCiAgICBAQ3VzdG9tZXJJRHMgPSAoIDEsIDIsIDMgKTsKClJlc3VsdDogJ0NPVU5UJwoKICAgICRDdXN0b21lcklEcyA9IDEwOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IGFsbCBnZW5lcmFsIHNlYXJjaCBmaWVsZHMgKHdpdGhvdXQgYSByZXN0cmljdGlvbiB0byBhIHNvdXJjZSkuCiAgICBteSBAQWxsU2VhcmNoRmllbGRzID0gJFNlbGYtPkN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcygpOwoKICAgICMgR2VuZXJhdGUgYSBoYXNoIHdpdGggdGhlIGN1c3RvbWVyIGNvbXBhbnkgc291cmNlcyB3aGljaCBtdXN0IGJlIHNlYXJjaGVkLgogICAgbXkgJVNlYXJjaEN1c3RvbWVyQ29tcGFueVNvdXJjZXM7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifTsKCiAgICAgICAgIyBHZXQgdGhlIHNlYXJjaCBmaWVsZHMgZm9yIHRoZSBjdXJyZW50IHNvdXJjZS4KICAgICAgICBteSBAU291cmNlU2VhcmNoRmllbGRzID0gJFNlbGYtPkN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcygKICAgICAgICAgICAgU291cmNlID0+ICJDdXN0b21lckNvbXBhbnkkQ291bnQiLAogICAgICAgICk7CiAgICAgICAgbXkgJUxvb2t1cFNvdXJjZVNlYXJjaEZpZWxkcyA9IG1hcCB7ICRfLT57TmFtZX0gPT4gMSB9IEBTb3VyY2VTZWFyY2hGaWVsZHM7CgogICAgICAgICMgQ2hlY2sgaWYgYWxsIHNlYXJjaCBwYXJhbSBleGlzdHMgaW4gdGhlIHNlYXJjaCBmaWVsZHMgZnJvbSB0aGUgY3VycmVudCBzb3VyY2UuCiAgICAgICAgU0VBUkNIRklFTEQ6CiAgICAgICAgZm9yIG15ICRTZWFyY2hGaWVsZCAoQEFsbFNlYXJjaEZpZWxkcykgewoKICAgICAgICAgICAgbmV4dCBTRUFSQ0hGSUVMRCBpZiAhJFBhcmFteyAkU2VhcmNoRmllbGQtPntOYW1lfSB9OwoKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRMb29rdXBTb3VyY2VTZWFyY2hGaWVsZHN7ICRTZWFyY2hGaWVsZC0+e05hbWV9IH07CiAgICAgICAgfQogICAgICAgICRTZWFyY2hDdXN0b21lckNvbXBhbnlTb3VyY2VzeyJDdXN0b21lckNvbXBhbnkkQ291bnQifSA9IFxAU291cmNlU2VhcmNoRmllbGRzOwogICAgfQoKICAgICMgU2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlLgogICAgJFBhcmFte1Jlc3VsdH0gfHw9ICdBUlJBWSc7CgogICAgaWYgKCAkUGFyYW17UmVzdWx0fSBlcSAnQ09VTlQnICkgewoKICAgICAgICBteSAkSURzQ291bnQgPSAwOwoKICAgICAgICBTT1VSQ0U6CiAgICAgICAgZm9yIG15ICRTb3VyY2UgKCBzb3J0IGtleXMgJVNlYXJjaEN1c3RvbWVyQ29tcGFueVNvdXJjZXMgKSB7CiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyRTb3VyY2V9OwoKICAgICAgICAgICAgbXkgJFN1YklEc0NvdW50ID0gJFNlbGYtPnskU291cmNlfS0+Q3VzdG9tZXJDb21wYW55U2VhcmNoRGV0YWlsKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgU2VhcmNoRmllbGRzID0+ICRTZWFyY2hDdXN0b21lckNvbXBhbnlTb3VyY2VzeyRTb3VyY2V9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuIGlmICFkZWZpbmVkICRTdWJJRHNDb3VudDsKCiAgICAgICAgICAgICRJRHNDb3VudCArPSAkU3ViSURzQ291bnQgfHwgMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRJRHNDb3VudDsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICBteSBASURzOwoKICAgICAgICBteSAkUmVzdWx0Q291bnQgPSAwOwoKICAgICAgICBTT1VSQ0U6CiAgICAgICAgZm9yIG15ICRTb3VyY2UgKCBzb3J0IGtleXMgJVNlYXJjaEN1c3RvbWVyQ29tcGFueVNvdXJjZXMgKSB7CiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyRTb3VyY2V9OwoKICAgICAgICAgICAgbXkgJFN1YklEcyA9ICRTZWxmLT57JFNvdXJjZX0tPkN1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFNlYXJjaEZpZWxkcyA9PiAkU2VhcmNoQ3VzdG9tZXJDb21wYW55U291cmNlc3skU291cmNlfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiBpZiAhZGVmaW5lZCAkU3ViSURzOwoKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSgkU3ViSURzKTsKCiAgICAgICAgICAgIHB1c2ggQElEcywgQHskU3ViSURzfTsKCiAgICAgICAgICAgICRSZXN1bHRDb3VudCsrOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB3ZSBoYXZlIG1vcmUgdGhlbiBvbmUgc2VhcmNoIHJlc3VsdHMgZnJvbSBkaWZmcmVudCBzb3VyY2VzLCB3ZSBuZWVkIGEgcmVzb3J0aW5nCiAgICAgICAgIyAgIGFuZCBzcGxpY2UgKGZvciB0aGUgbGltaXQpIGJlY2F1c2Ugb2YgdGhlIG1lcmdlZCBzaW5nbGUgcmVzdWx0cy4KICAgICAgICBpZiAoICRSZXN1bHRDb3VudCA+IDEgKSB7CgogICAgICAgICAgICBteSBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdDsKCiAgICAgICAgICAgIGZvciBteSAkSUQgKEBJRHMpIHsKCiAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJDb21wYW55RGF0YSA9ICRTZWxmLT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdCwgXCVDdXN0b21lckNvbXBhbnlEYXRhOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkT3JkZXJCeSA9ICdDdXN0b21lcklEJzsKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtPcmRlckJ5fSApICkgewogICAgICAgICAgICAgICAgJE9yZGVyQnkgPSAkUGFyYW17T3JkZXJCeX0tPlswXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufSApICYmICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WzBdIGVxICdVcCcgKSB7CiAgICAgICAgICAgICAgICBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdCA9IHNvcnQgeyBsYyggJGEtPnskT3JkZXJCeX0gKSBjbXAgbGMoICRiLT57JE9yZGVyQnl9ICkgfSBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIEBDdXN0b21lckNvbXBhbnlhdGFMaXN0ID0gc29ydCB7IGxjKCAkYi0+eyRPcmRlckJ5fSApIGNtcCBsYyggJGEtPnskT3JkZXJCeX0gKSB9IEBDdXN0b21lckNvbXBhbnlhdGFMaXN0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRQYXJhbXtMaW1pdH0gJiYgc2NhbGFyIEBDdXN0b21lckNvbXBhbnlhdGFMaXN0ID4gJFBhcmFte0xpbWl0fSApIHsKICAgICAgICAgICAgICAgIHNwbGljZSBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdCwgJFBhcmFte0xpbWl0fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQElEcyA9IG1hcCB7ICRfLT57Q3VzdG9tZXJJRH0gfSBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBcQElEczsKICAgIH0KfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcygpCgpHZXQgYSBsaXN0IG9mIGRlZmluZWQgc2VhcmNoIGZpZWxkcyAob3B0aW9uYWwgb25seSB0aGUgcmVsZXZhbnQgZmllbGRzIGZvciB0aGUgZ2l2ZW4gc291cmNlKS4KCiAgICBteSBAU2VhY2hGaWVsZHMgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlTZWFyY2hGaWVsZHMoCiAgICAgICAgU291cmNlID0+ICdDdXN0b21lckNvbXBhbnknLCAjIG9wdGlvbmFsLCBidXQgaW1wb3J0YW50IGluIHRoZSBDdXN0b21lckNvbXBhbnlTZWFyY2hEZXRhaWwgdG8gZ2V0IHRoZSByaWdodCBkYXRhYmFzZSBmaWVsZHMKICAgICk7CgpSZXR1cm5zIGFuIGFycmF5IG9mIGhhc2ggcmVmZXJlbmNlcy4KCiAgICBAU2VhY2hGaWVsZHMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIExhYmVsID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgVHlwZSAgPT4gJ0lucHV0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0N1c3RvbWVyQ29tcGFueUNvdW50cnknLAogICAgICAgICAgICBMYWJlbCAgICAgICAgICA9PiAnQ291bnRyeScsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICBTZWxlY3Rpb25zRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAnR2VybWFueScgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgICAgICdVbml0ZWQgS2luZ2RvbScgPT4gJ1VuaXRlZCBLaW5nZG9tJywKICAgICAgICAgICAgICAgICdVbml0ZWQgU3RhdGVzJyAgPT4gJ1VuaXRlZCBTdGF0ZXMnLAogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF9CcmFuY2gnLAogICAgICAgICAgICBMYWJlbCAgICAgICAgID0+ICcnLAogICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICdCcmFuY2gnLAogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IHRoZSBzZWFyY2ggZmllbGRzIGZyb20gYWxsIGN1c3RvbWVyIGNvbXBhbnkgbWFwcyAobWVyZ2UgZnJvbSBhbGwgbWFwcyB0b2dldGhlcikuCiAgICBteSBAU2VhcmNoRmllbGRzOwoKICAgIG15ICVTZWFyY2hGaWVsZHNFeGlzdHM7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAkUGFyYW17U291cmNlfSAmJiAkUGFyYW17U291cmNlfSBuZSAiQ3VzdG9tZXJDb21wYW55JENvdW50IjsKCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH0gfSApIHsKCiAgICAgICAgICAgIG15ICRTZWFyY2hGaWVsZE5hbWUgPSAkRW50cnktPlswXTsKCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgJFNlYXJjaEZpZWxkc0V4aXN0c3skU2VhcmNoRmllbGROYW1lfTsKCiAgICAgICAgICAgICMgUmVtZWJlciB0aGUgYWxyZWFkeSBjb2xsZWN0ZWQgc2VhcmNoIGZpZWxkIG5hbWUuCiAgICAgICAgICAgICRTZWFyY2hGaWVsZHNFeGlzdHN7JFNlYXJjaEZpZWxkTmFtZX0gPSAxOwoKICAgICAgICAgICAgbXkgJUZpZWxkQ29uZmlnID0gJFNlbGYtPkdldEZpZWxkQ29uZmlnKAogICAgICAgICAgICAgICAgRmllbGROYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICAgICBTb3VyY2UgICAgPT4gJFBhcmFte1NvdXJjZX0sICAgICAjIHRvIGdldCB0aGUgcmlnaHQgZGF0YWJhc2UgZmllbGQgZm9yIHRoZSBnaXZlbiBzb3VyY2UKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgISVGaWVsZENvbmZpZzsKCiAgICAgICAgICAgIG15ICVTZWFyY2hGaWVsZERhdGEgPSAoCiAgICAgICAgICAgICAgICAlRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBOYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAlU2VsZWN0aW9uc0RhdGEgPSAkU2VsZi0+R2V0RmllbGRTZWxlY3Rpb25zKAogICAgICAgICAgICAgICAgRmllbGROYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRTZWFyY2hGaWVsZERhdGF7U3RvcmFnZVR5cGV9IGVxICdkeW5hbWljX2ZpZWxkJyApIHsKICAgICAgICAgICAgICAgICRTZWFyY2hGaWVsZERhdGF7VHlwZX0gPSAnRHluYW1pY0ZpZWxkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJVNlbGVjdGlvbnNEYXRhKSB7CiAgICAgICAgICAgICAgICAkU2VhcmNoRmllbGREYXRhe1R5cGV9ICAgICAgICAgICA9ICdTZWxlY3Rpb24nOwogICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkRGF0YXtTZWxlY3Rpb25zRGF0YX0gPSBcJVNlbGVjdGlvbnNEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkRGF0YXtUeXBlfSA9ICdJbnB1dCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgXCVTZWFyY2hGaWVsZERhdGE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBAU2VhcmNoRmllbGRzOwp9Cgo9aGVhZDIgR2V0RmllbGRDb25maWcoKQoKVGhpcyBmdW5jdGlvbiBjb2xsZWN0IHNvbWUgZmllbGQgY29uZmlnIGluZm9ybWF0aW9uIGZyb20gdGhlIGN1c3RvbWVyIHVzZXIgbWFwLgoKICAgIG15ICVGaWVsZENvbmZpZyA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkdldEZpZWxkQ29uZmlnKAogICAgICAgIEZpZWxkTmFtZSA9PiAnQ3VzdG9tZXJDb21wYW55TmFtZScsCiAgICAgICAgU291cmNlICAgID0+ICdDdXN0b21lckNvbXBhbnknLCAjIG9wdGlvbmFsCiAgICApOwoKUmV0dXJucyBzb21lIGZpZWxkIGNvbmZpZyBpbmZvcm1hdGlvbjoKCiAgICBteSAlRmllbGRDb25maWcgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAnbmFtZScsCiAgICAgICAgU3RvcmFnZVR5cGUgICA9PiAndmFyJywKICAgICk7Cgo9Y3V0CgpzdWIgR2V0RmllbGRDb25maWcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17RmllbGROYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgRmllbGROYW1lISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9OwogICAgICAgIG5leHQgU09VUkNFIGlmICRQYXJhbXtTb3VyY2V9ICYmICRQYXJhbXtTb3VyY2V9IG5lICJDdXN0b21lckNvbXBhbnkkQ291bnQiOwoKICAgICAgICAjIFNlYXJjaCB0aGUgcmlnaHQgZmllbGQgYW5kIHJldHVybiB0aGUgbGFiZWwuCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH0gfSApIHsKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkUGFyYW17RmllbGROYW1lfSBuZSAkRW50cnktPlswXTsKCiAgICAgICAgICAgIG15ICVGaWVsZENvbmZpZyA9ICgKICAgICAgICAgICAgICAgIExhYmVsICAgICAgICAgPT4gJEVudHJ5LT5bMV0sCiAgICAgICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgICA9PiAkRW50cnktPls1XSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAlRmllbGRDb25maWc7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKPWhlYWQyIEdldEZpZWxkU2VsZWN0aW9ucygpCgpUaGlzIGZ1bmN0aW9uIGNvbGxlY3QgdGhlIHNlbGVjdGlvbnMgZm9yIHRoZSBnaXZlbiBmaWVsZCBuYW1lLCBpZiB0aGUgZmllbGQgaGFzIHNvbWUgc2VsZWN0aW9ucy4KCiAgICBteSAlU2VsZWN0aW9uc0RhdGEgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5HZXRGaWVsZFNlbGVjdGlvbnMoCiAgICAgICAgRmllbGROYW1lID0+ICdDdXN0b21lckNvbXBhbnlDb3VudHJ5JywKICAgICk7CgpSZXR1cm5zIHRoZSBzZWxlY3Rpb25zIGZvciB0aGUgZ2l2ZW4gZmllbGQgbmFtZSAobWVyZ2VkIGZyb20gYWxsIHNvdXJjZXMpIG9yIGEgZW1wdHkgaGFzaDoKCiAgICBteSAlU2VsZWN0aW9uRGF0YSA9ICgKICAgICAgICAnR2VybWFueScgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAnVW5pdGVkIEtpbmdkb20nID0+ICdVbml0ZWQgS2luZ2RvbScsCiAgICAgICAgJ1VuaXRlZCBTdGF0ZXMnICA9PiAnVW5pdGVkIFN0YXRlcycsCiAgICApOwoKPWN1dAoKc3ViIEdldEZpZWxkU2VsZWN0aW9ucyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17RmllbGROYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgRmllbGROYW1lISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlU2VsZWN0aW9uc0RhdGE7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJDb21wYW55JENvdW50In0tPntDdXN0b21lckNvbXBhbnlNYXB9LT57U2VsZWN0aW9uc30tPnsgJFBhcmFte0ZpZWxkTmFtZX0gfTsKCiAgICAgICAgJVNlbGVjdGlvbnNEYXRhID0gKAogICAgICAgICAgICAlU2VsZWN0aW9uc0RhdGEsCiAgICAgICAgICAgICV7ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1NlbGVjdGlvbnN9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH0gfQogICAgICAgICk7CiAgICB9CgogICAgIyBNYWtlIHN1cmUgdGhlIGVuY29kaW5nIHN0YW1wIGlzIHNldC4KICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVTZWxlY3Rpb25zRGF0YSApIHsKICAgICAgICAkU2VsZWN0aW9uc0RhdGF7JEtleX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZUlucHV0KCAkU2VsZWN0aW9uc0RhdGF7JEtleX0gKTsKICAgIH0KCiAgICAjIERlZmF1bHQgaGFuZGxpbmcgZm9yIGZpZWxkICdDdXN0b21lckNvbXBhbnlDb3VudHJ5Jy4KICAgIGlmICggISVTZWxlY3Rpb25zRGF0YSAmJiAkUGFyYW17RmllbGROYW1lfSA9fiAvXkN1c3RvbWVyQ29tcGFueUNvdW50cnkvaSApIHsKICAgICAgICAlU2VsZWN0aW9uc0RhdGEgPSAleyAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UmVmZXJlbmNlRGF0YScpLT5Db3VudHJ5TGlzdCgpIH07CiAgICB9CgogICAgIyBEZWZhdWx0IGhhbmRsaW5nIGZvciBmaWVsZCAnVmFsaWRJRCcuCiAgICBlbHNpZiAoICElU2VsZWN0aW9uc0RhdGEgJiYgJFBhcmFte0ZpZWxkTmFtZX0gPX4gL15WYWxpZElEL2kgKSB7CiAgICAgICAgJVNlbGVjdGlvbnNEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgfQoKICAgIHJldHVybiAlU2VsZWN0aW9uc0RhdGE7Cn0KCnN1YiBERVNUUk9ZIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBleGVjdXRlIGFsbCB0cmFuc2FjdGlvbiBldmVudHMKICAgICRTZWxmLT5FdmVudEhhbmRsZXJUcmFuc2FjdGlvbigpOwoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/CustomerUser.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL1N5c3RlbS9DdXN0b21lclVzZXIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyKTsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Okxhbmd1YWdlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkVuY29kZScsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKIyBFTyBSb3RoZXIgT1NTCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKIyBFTyBSb3RoZXIgT1NTCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIC0gY3VzdG9tZXIgdXNlciBsaWIKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIGN1c3RvbWVyIHVzZXIgZnVuY3Rpb25zLiBFLiBnLiB0byBhZGQgYW5kIHVwZGF0ZSBjdXN0b21lciB1c2Vycy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCkRvbid0IHVzZSB0aGUgY29uc3RydWN0b3IgZGlyZWN0bHksIHVzZSB0aGUgT2JqZWN0TWFuYWdlciBpbnN0ZWFkOgoKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHt9LCAkVHlwZTsKCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnQ3VzdG9tZXJVc2VyJzsKICAgICRTZWxmLT57Q2FjaGVUVEx9ICA9IDYwICogNjAgKiAyNCAqIDIwOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgbG9hZCBnZW5lcmF0b3IgY3VzdG9tZXIgcHJlZmVyZW5jZXMgbW9kdWxlCiAgICBteSAkR2VuZXJhdG9yTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclByZWZlcmVuY2VzJyktPntNb2R1bGV9CiAgICAgICAgfHwgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI6OlByZWZlcmVuY2VzOjpEQic7CgogICAgIyBnZXQgbWFpbiBvYmplY3QKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICBpZiAoICRNYWluT2JqZWN0LT5SZXF1aXJlKCRHZW5lcmF0b3JNb2R1bGUpICkgewogICAgICAgICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9ID0gJEdlbmVyYXRvck1vZHVsZS0+bmV3KCk7CiAgICB9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgbXkgJExheW91dFBhcmFtID0gJEtlcm5lbDo6T00tPntQYXJhbX0tPnsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCd9OwoKICAgICMgQ2hlY2sgaWYgbXVsdGl0ZW5hbmN5IGlzIGVuYWJsZWQgYW5kIHRoZSByZXF1ZXN0IGlzIGNvbWluZyBmcm9tIGEgdXNlci4KICAgIGlmICggJExheW91dFBhcmFtLT57VXNlclR5cGV9ICYmICRMYXlvdXRQYXJhbS0+e1VzZXJUeXBlfSBlcSAnVXNlcicgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3knKSApIHsKCiAgICAgICAgIyBTYXZlIHRoZSBVc2VySUQgYW5kIGFsbCBncm91cHMgdGhlIHVzZXIgaGFzICdybycgcGVybWlzc2lvbiBvbi4KICAgICAgICBpZiAoICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICMgT25seSBnZXQgdGhlIGdyb3VwIGxpc3Qgb25jZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KICAgICAgICAgICAgbXkgJUdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkTGF5b3V0UGFyYW0tPntVc2VySUR9LAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFRoZSBsaW1pdCBkb2VzIG5vdCBjb3VudCBmb3IgbWVtYmVycyBvZiBhIHNwZWNpZmljIGdyb3VwLgogICAgICAgICAgICBteSAkUGVybWlzc2lvbkdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3k6OlBlcm1pc3Npb25Hcm91cCcpIHx8ICcnOwogICAgICAgICAgICBteSAlR3JvdXBzUmV2ZXJzZSAgID0gcmV2ZXJzZSAlR3JvdXBzOwoKICAgICAgICAgICAgaWYgKCAhJEdyb3Vwc1JldmVyc2V7JFBlcm1pc3Npb25Hcm91cH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e011bHRpdGVuYW5jeX0gPSAkTGF5b3V0UGFyYW0tPntVc2VySUR9OwogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyR3JvdXBJRHN9ID0gWyBrZXlzICVHcm91cHMgXTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlckdyb3Vwc30gICA9IFsgdmFsdWVzICVHcm91cHMgXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgICMgbG9hZCBjdXN0b21lciB1c2VyIGJhY2tlbmQgbW9kdWxlCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIHVubGVzcyAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpOwojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSBzb3VyY2UuCiAgICAgICAgbXkgJEN1c3RvbWVyVXNlckdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKS0+e0N1c3RvbWVyVXNlckdyb3VwfTsKCiAgICAgICAgIyBUaGUgdXNlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20gdGhpcyBzb3VyY2UuCiAgICAgICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gJiYgJEN1c3RvbWVyVXNlckdyb3VwICkgewogICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gPX4gL14kQ3VzdG9tZXJVc2VyR3JvdXAkLyB9IEB7ICRTZWxmLT57VXNlckdyb3Vwc30gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKS0+e01vZHVsZX07CiAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICAgICAkTWFpbk9iamVjdC0+RGllKCJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRHZW5lcmljTW9kdWxlISAkQCIpOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0gPSAkR2VuZXJpY01vZHVsZS0+bmV3KAogICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgIFByZWZlcmVuY2VzT2JqZWN0ID0+ICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LAogICAgICAgICAgICBDdXN0b21lclVzZXJNYXAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpLAogICAgICAgICk7CiAgICB9CgogICAgIyBpbml0IG9mIGV2ZW50IGhhbmRsZXIKICAgICRTZWxmLT5FdmVudEhhbmRsZXJJbml0KAogICAgICAgIENvbmZpZyA9PiAnQ3VzdG9tZXJVc2VyOjpFdmVudE1vZHVsZVBvc3QnLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBDdXN0b21lclNvdXJjZUxpc3QoKQoKcmV0dXJuIGN1c3RvbWVyIHNvdXJjZSBsaXN0CgogICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNvdXJjZUxpc3QoCiAgICAgICAgUmVhZE9ubHkgPT4gMCAjIG9wdGlvbmFsLCAxIHJldHVybnMgb25seSBSTyBiYWNrZW5kcywgMCByZXR1cm5zIHdyaXRhYmxlLCBpZiBub3QgcGFzc2VkIHJldHVybnMgYWxsIGJhY2tlbmRzCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyU291cmNlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICVEYXRhOwogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKTsKICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFte1JlYWRPbmx5fSApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyQmFja2VuZENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJVc2VyJENvdW50Iik7CiAgICAgICAgICAgIGlmICggJFBhcmFte1JlYWRPbmx5fSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkQ3VzdG9tZXJCYWNrZW5kQ29uZmlnLT57UmVhZE9ubHl9IHx8ICRDdXN0b21lckJhY2tlbmRDb25maWctPntNb2R1bGV9ICF+IC9MREFQL2k7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAkQ3VzdG9tZXJCYWNrZW5kQ29uZmlnLT57UmVhZE9ubHl9IHx8ICRDdXN0b21lckJhY2tlbmRDb25maWctPntNb2R1bGV9ID1+IC9MREFQL2k7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJERhdGF7IkN1c3RvbWVyVXNlciRDb3VudCJ9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKS0+e05hbWV9CiAgICAgICAgICAgIHx8ICJObyBOYW1lICRDb3VudCI7CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1oZWFkMiBDdXN0b21lclNlYXJjaCgpCgp0byBzZWFyY2ggdXNlcnMKCiAgICAjIHRleHQgc2VhcmNoCiAgICBteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIFNlYXJjaCA9PiAnKnNvbWUqJywgIyBhbHNvICdoYW5zK2h1YmVyJyBwb3NzaWJsZQogICAgICAgIFZhbGlkICA9PiAxLCAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQogICAgICAgIExpbWl0ICA9PiAxMDAsICAgICAgIyAob3B0aW9uYWwpIG92ZXJyaWRlcyBsaW1pdCBvZiB0aGUgY29uZmlnCiAgICApOwoKICAgICMgdXNlcm5hbWUgc2VhcmNoCiAgICBteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIFVzZXJMb2dpbiA9PiAnKnNvbWUqJywKICAgICAgICBWYWxpZCAgICAgPT4gMSwgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICApOwoKICAgICMgZW1haWwgc2VhcmNoCiAgICBteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIFBvc3RNYXN0ZXJTZWFyY2ggPT4gJ2VtYWlsQGV4YW1wbGUuY29tJywKICAgICAgICBWYWxpZCAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICApOwoKICAgICMgc2VhcmNoIGJ5IEN1c3RvbWVySUQKICAgIG15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgQ3VzdG9tZXJJRCAgICAgICA9PiAnQ3VzdG9tZXJJRDEyMycsCiAgICAgICAgVmFsaWQgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyByZW1vdmUgbGVhZGluZyBhbmQgZW5kaW5nIHNwYWNlcwogICAgaWYgKCAkUGFyYW17U2VhcmNofSApIHsKICAgICAgICAkUGFyYW17U2VhcmNofSA9fiBzL15ccysvLzsKICAgICAgICAkUGFyYW17U2VhcmNofSA9fiBzL1xzKyQvLzsKICAgIH0KCiAgICAjIEdldCBkeW5hbWljIGZpZWxkIG9iamVjdC4KICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CgogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3MgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIE9iamVjdFR5cGUgPT4gJ0N1c3RvbWVyVXNlcicsCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgKTsKCiAgICBteSAlRHluYW1pY0ZpZWxkTG9va3VwID0gbWFwIHsgJF8tPntOYW1lfSA9PiAkXyB9IEB7JER5bmFtaWNGaWVsZENvbmZpZ3N9OwoKICAgICMgR2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QuCiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICBteSAlRGF0YTsKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwoKICAgICAgICAjIHNlYXJjaCBkeW5hbWljIGZpZWxkIHZhbHVlcywgaWYgY29uZmlndXJlZAogICAgICAgIG15ICRNYXAgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9OwogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRNYXApICkgewoKICAgICAgICAgICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gTWFwCiAgICAgICAgICAgICMgb25seSB0aGVzZSB3aWxsIGJlIGNvbnNpZGVyZWQgZm9yIGFueSBvdGhlciBzZWFyY2ggY29uZmlnCiAgICAgICAgICAgICMgWyAnRHluYW1pY0ZpZWxkX05hbWVfWCcsIHVuZGVmLCAnTmFtZV9YJywgMCwgMCwgJ2R5bmFtaWNfZmllbGQnLCB1bmRlZiwgMCwgdW5kZWYsIHVuZGVmLCBdLAogICAgICAgICAgICBteSAlRHluYW1pY0ZpZWxkTmFtZXMgPSBtYXAgeyAkXy0+WzJdID0+IDEgfSBncmVwIHsgJF8tPls1XSBlcSAnZHluYW1pY19maWVsZCcgfSBAeyRNYXB9OwoKICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVEeW5hbWljRmllbGROYW1lcyApICkgewogICAgICAgICAgICAgICAgbXkgJEZvdW5kRHluYW1pY0ZpZWxkT2JqZWN0SURzOwogICAgICAgICAgICAgICAgbXkgJFNlYXJjaEZpZWxkczsKICAgICAgICAgICAgICAgIG15ICRTZWFyY2hQYXJhbTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIHdoaWNoIG9mIHRoZSBkeW5hbWljIGZpZWxkcyBjb25maWd1cmVkIGluIE1hcCBhcmUgYWxzbwogICAgICAgICAgICAgICAgIyBjb25maWd1cmVkIGluIFNlYXJjaEZpZWxkcwoKICAgICAgICAgICAgICAgICMgcGFyYW0gU2VhcmNoCiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFte1NlYXJjaH0gJiYgbGVuZ3RoICRQYXJhbXtTZWFyY2h9ICkgewogICAgICAgICAgICAgICAgICAgICRTZWFyY2hGaWVsZHMgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hGaWVsZHN9OwogICAgICAgICAgICAgICAgICAgICRTZWFyY2hQYXJhbSAgPSAkUGFyYW17U2VhcmNofTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHBhcmFtIFBvc3RNYXN0ZXJTZWFyY2gKICAgICAgICAgICAgICAgIGVsc2lmICggZGVmaW5lZCAkUGFyYW17UG9zdE1hc3RlclNlYXJjaH0gJiYgbGVuZ3RoICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VhcmNoRmllbGRzID0gJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkc307CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFtICA9ICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHNlYXJjaCBkeW5hbWljIGZpZWxkIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJFNlYXJjaEZpZWxkcykgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQFNlYXJjaER5bmFtaWNGaWVsZE5hbWVzID0gZ3JlcCB7IGV4aXN0cyAkRHluYW1pY0ZpZWxkTmFtZXN7JF99IH0gQHskU2VhcmNoRmllbGRzfTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJUZvdW5kRHluYW1pY0ZpZWxkT2JqZWN0SURzOwogICAgICAgICAgICAgICAgICAgIEZJRUxETkFNRToKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkTmFtZSAoQFNlYXJjaER5bmFtaWNGaWVsZE5hbWVzKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJER5bmFtaWNGaWVsZExvb2t1cHskRmllbGROYW1lfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEROQU1FIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZWFyY2goCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaCAgICAgICAgICAgICA9PiAkU2VhcmNoUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkVmFsdWVzKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkVmFsdWUgKCBAeyREeW5hbWljRmllbGRWYWx1ZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEc3sgJER5bmFtaWNGaWVsZFZhbHVlLT57T2JqZWN0SUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkRm91bmREeW5hbWljRmllbGRPYmplY3RJRHMgPSBbIGtleXMgJUZvdW5kRHluYW1pY0ZpZWxkT2JqZWN0SURzIF07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBleGVjdXRlIGJhY2tlbmQgc2VhcmNoIGZvciBmb3VuZCBvYmplY3QgSURzCiAgICAgICAgICAgICAgICAjIHRoaXMgZGF0YSBpcyBiZWluZyBtZXJnZWQgd2l0aCB0aGUgZm9sbG93aW5nIEN1c3RvbWVyU2VhcmNoIGNhbGwKICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEcykgKSB7CgogICAgICAgICAgICAgICAgICAgIG15ICRPYmplY3ROYW1lcyA9ICREeW5hbWljRmllbGRPYmplY3QtPk9iamVjdE1hcHBpbmdHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdElEICAgPT4gJEZvdW5kRHluYW1pY0ZpZWxkT2JqZWN0SURzLAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIE9CSkVDVE5BTUU6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRPYmplY3ROYW1lICggdmFsdWVzICV7JE9iamVjdE5hbWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBPQkpFQ1ROQU1FIGlmIGV4aXN0cyAkRGF0YXskT2JqZWN0TmFtZX07CgogICAgICAgICAgICAgICAgICAgICAgICBteSAlU2VhcmNoUGFyYW0gPSAlUGFyYW07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkU2VhcmNoUGFyYW17U2VhcmNofTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRTZWFyY2hQYXJhbXtQb3N0TWFzdGVyU2VhcmNofTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWFyY2hQYXJhbXtVc2VyTG9naW59ID0gJE9iamVjdE5hbWU7CgogICAgICAgICAgICAgICAgICAgICAgICBteSAlU3ViRGF0YSA9ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT5DdXN0b21lclNlYXJjaCglU2VhcmNoUGFyYW0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2VyTG9naW4gc2VhcmNoIGRvZXMgYSB3aWxkLWNhcmQgc2VhcmNoLCBidXQgaW4gdGhpcyBjYXNlIG9ubHkgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICMgZXhhY3QgbWF0Y2hpbmcgdXNlciBsb2dpbiBpcyByZWxldmFudAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVN1YkRhdGEgKSAmJiBleGlzdHMgJFN1YkRhdGF7JE9iamVjdE5hbWV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJURhdGEgPSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE9iamVjdE5hbWUgPT4gJFN1YkRhdGF7JE9iamVjdE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjdXN0b21lciBzZWFyY2ggcmVzdWx0IG9mIGJhY2tlbmQgYW5kIG1lcmdlIGl0CiAgICAgICAgbXkgJVN1YkRhdGEgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+Q3VzdG9tZXJTZWFyY2goJVBhcmFtKTsKCiAgICAgICAgJURhdGEgPSAoICVTdWJEYXRhLCAlRGF0YSApOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gc2VlIHRoaXMgY3VzdG9tZXIgdXNlci4KICAgICMgVE9ETzogUmVtb3ZlIHRoaXMgaWYgdGhlIERCL0xEQVAgZnVuY3Rpb24gQ3VzdG9tZXJTZWFyY2ggaXMgZnVsbHkgaW1wbGVtZW50ZWQuCiAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICBDVVNUT01FUkxPR0lOOgogICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyTG9naW4gKCBrZXlzICVEYXRhICkgewogICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJVVzZXJEYXRhICkgewogICAgICAgICAgICAgICAgZGVsZXRlICREYXRheyRDdXN0b21lclVzZXJMb2dpbn07CiAgICAgICAgICAgICAgICBuZXh0IENVU1RPTUVSTE9HSU47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICByZXR1cm4gJURhdGE7Cn0KCj1oZWFkMiBDdXN0b21lclNlYXJjaERldGFpbCgpCgpUbyBmaW5kIGN1c3RvbWVyIHVzZXJzIGluIHRoZSBzeXN0ZW0uCgpUaGUgc2VhcmNoIGNyaXRlcmlhIGFyZSBsb2dpY2FsbHkgQU5EIGNvbm5lY3RlZC4KV2hlbiBhIGxpc3QgaXMgcGFzc2VkIGFzIGNyaXRlcmlhLCB0aGUgaW5kaXZpZHVhbCBtZW1iZXJzIGFyZSBPUiBjb25uZWN0ZWQuCldoZW4gYW4gdW5kZWYgb3IgYSByZWZlcmVuY2UgdG8gYW4gZW1wdHkgYXJyYXkgaXMgcGFzc2VkLCB0aGVuIHRoZSBzZWFyY2ggY3JpdGVyaWEKaXMgaWdub3JlZC4KClJldHVybnMgZWl0aGVyIGEgbGlzdCwgYXMgYW4gYXJyYXlyZWYsIG9yIGEgY291bnQgb2YgZm91bmQgY3VzdG9tZXIgdXNlciBpZHMuClRoZSBjb3VudCBvZiByZXN1bHRzIGlzIHJldHVybmVkIHdoZW4gdGhlIHBhcmFtZXRlciBDPFJlc3VsdCA9ICdDT1VOVCc+IGlzIHBhc3NlZC4KCiAgICBteSAkQ3VzdG9tZXJVc2VySURzUmVmID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2hEZXRhaWwoCgogICAgICAgICMgYWxsIGZpZWxkcyB3aGljaCBhcmUgZGVmaW5lZCBpbiBhIEN1c3RvbWVyVXNlck1hcCwgZXhjZXB0IHBhc3N3b3JkIGZpZWxkcywgYXJlIHNlYXJjaGFibGUKICAgICAgICBVc2VyTG9naW4gICAgID0+ICdleGFtcGxlKicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAnRmlyc3RuKicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIHNlYXJjaCBmb3IgdmFsaWQgdXNlcnMgb25seSBwZXIgZGVmYXVsdCwKICAgICAgICAjIHBhc3MgMCBpbiBvcmRlciB0byBhbHNvIHNlYXJjaCBmb3IgaW52YWxpZCB1c2VycwogICAgICAgIFZhbGlkICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCgogICAgICAgICMgc3BlY2lhbCBwYXJhbWV0ZXJzCiAgICAgICAgQ3VzdG9tZXJDb21wYW55U2VhcmNoQ3VzdG9tZXJJRHMgPT4gWyAnZXhhbXBsZS5jb20nIF0sICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEV4Y2x1ZGVVc2VyTG9naW5zICAgICAgICAgICAgICAgID0+IFsgJ2V4YW1wbGUnLCAnZG9lam9obicgXSwgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBhcnJheSBwYXJhbWV0ZXJzIGFyZSB1c2VkIHdpdGggbG9naWNhbCBPUiBvcGVyYXRvciAoYWxsIHZhbHVlcyBhcmUgcG9zc2libGUgd2hpY2gKICAgICAgICAjIGFyZSBkZWZpbmVkIGluIHRoZSBjb25maWcgc2VsZWN0aW9uIGhhc2ggZm9yIHRoZSBmaWVsZCkKICAgICAgICBVc2VyQ291bnRyeSAgICAgICAgICAgICAgPT4gWyAnQXVzdHJpYScsICdHZXJtYW55JywgXSwgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgRHluYW1pY0ZpZWxkcwogICAgICAgICMgICBBdCBsZWFzdCBvbmUgb3BlcmF0b3IgbXVzdCBiZSBzcGVjaWZpZWQuIE9wZXJhdG9ycyB3aWxsIGJlIGNvbm5lY3RlZCB3aXRoIEFORCwKICAgICAgICAjICAgICAgIHZhbHVlcyBpbiBhbiBvcGVyYXRvciB3aXRoIE9SLgogICAgICAgICMgICBZb3UgY2FuIGFsc28gcGFzcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IHRvIGFuIG9wZXJhdG9yOiBbJ3ZhbHVlMScsICd2YWx1ZTInXQogICAgICAgIER5bmFtaWNGaWVsZF9GaWVsZE5hbWVYID0+IHsKICAgICAgICAgICAgRXF1YWxzICAgICAgICAgICAgPT4gMTIzLAogICAgICAgICAgICBMaWtlICAgICAgICAgICAgICA9PiAndmFsdWUqJywgICAgICAgICAgICAgICAgIyAiZXF1YWxzIiBvcGVyYXRvciB3aXRoIHdpbGRjYXJkIHN1cHBvcnQKICAgICAgICAgICAgR3JlYXRlclRoYW4gICAgICAgPT4gJzIwMDEtMDEtMDEgMDE6MDE6MDEnLAogICAgICAgICAgICBHcmVhdGVyVGhhbkVxdWFscyA9PiAnMjAwMS0wMS0wMSAwMTowMTowMScsCiAgICAgICAgICAgIFNtYWxsZXJUaGFuICAgICAgID0+ICcyMDAyLTAyLTAyIDAyOjAyOjAyJywKICAgICAgICAgICAgU21hbGxlclRoYW5FcXVhbHMgPT4gJzIwMDItMDItMDIgMDI6MDI6MDInLAogICAgICAgIH0KCiAgICAgICAgT3JkZXJCeSA9PiBbICdVc2VyTG9naW4nLCAnVXNlckN1c3RvbWVySUQnIF0sICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgICAgICMgZGVmYXVsdDogWyAnVXNlckxvZ2luJyBdCiAgICAgICAgIyAoYWxsIGZpZWxkcyB3aGljaCBhcmUgZGVmaW5lZCBpbiBhIEN1c3RvbWVyVXNlck1hcCBjYW4gYmUgdXNlZCBmb3Igb3JkZXJpbmcpCgogICAgICAgICMgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgT3JkZXJCeToKICAgICAgICAjIFRoZSBPcmRlckJ5RGlyZWN0aW9uIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGVhY2ggT3JkZXJCeSBhdHRyaWJ1dGUuCiAgICAgICAgIyBUaGUgcGFpcmluZyBpcyBtYWRlIGJ5IHRoZSBhcnJheSBpbmRpY2VzLgoKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsgJ0Rvd24nLCAnVXAnIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgaWYgdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgICAgICAjIChEb3duIHwgVXApIERlZmF1bHQ6IFsgJ0Rvd24nIF0KCiAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScgfHwgJ0NPVU5UJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBkZWZhdWx0OiBBUlJBWSwgcmV0dXJucyBhbiBhcnJheSBvZiBjaGFuZ2UgaWRzCiAgICAgICAgIyBDT1VOVCByZXR1cm5zIGEgc2NhbGFyIHdpdGggdGhlIG51bWJlciBvZiBmb3VuZCBjaGFuZ2VzCgogICAgICAgIExpbWl0ID0+IDEwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgKTsKClJldHVybnMgYSBsaXN0IG9mIGN1c3RvbWVyIHVzZXJzIHdoZW4gJFJlc3VsdCA9PiAnQVJSQVknIHdhcyBwYXNzZWQ6CgogICAgJEN1c3RvbWVyVXNlcklEcyA9IFsgJ2FkYWxkcmlkYScsICdhZGFtYW50YScsICdhZGFsZ3JpbSAnIF07CiAgICAkQ3VzdG9tZXJVc2VySURzID0gW107ICMgd2hlbiBubyBjdXN0b21lciB1c2VycyBoYWQgYmVlbiBmb3VuZAoKUmV0dXJucyBhIGNvdW50IG9mIGN1c3RvbWVyIHVzZXJzIHdoZW4gJFJlc3VsdCA9PiAnQ09VTlQnIHdhcyBwYXNzZWQ6CgogICAgJEN1c3RvbWVyVXNlcklEcyA9IDM7CiAgICAkQ3VzdG9tZXJVc2VySURzID0gMDsgIyB3aGVuIG5vIGN1c3RvbWVyIHVzZXJzIGhhZCBiZWVuIGZvdW5kCgo9Y3V0CgpzdWIgQ3VzdG9tZXJTZWFyY2hEZXRhaWwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBhbGwgZ2VuZXJhbCBzZWFyY2ggZmllbGRzICh3aXRob3V0IGEgcmVzdHJpY3Rpb24gdG8gYSBzb3VyY2UpCiAgICBteSBAQWxsU2VhcmNoRmllbGRzID0gJFNlbGYtPkN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcygpOwoKICAgICMgZ2VuZXJhdGUgYSBoYXNoIHdpdGggdGhlIGN1c3RvbWVyIHVzZXIgc291cmNlcyB3aGljaCBtdXN0IGJlIHNlYXJjaGVkCiAgICBteSAlU2VhcmNoQ3VzdG9tZXJVc2VyU291cmNlczsKCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwoKICAgICAgICAjIGdldCB0aGUgc2VhcmNoIGZpZWxkcyBmb3IgdGhlIGN1cnJlbnQgc291cmNlCiAgICAgICAgbXkgQFNvdXJjZVNlYXJjaEZpZWxkcyA9ICRTZWxmLT5DdXN0b21lclVzZXJTZWFyY2hGaWVsZHMoCiAgICAgICAgICAgIFNvdXJjZSA9PiAiQ3VzdG9tZXJVc2VyJENvdW50IiwKICAgICAgICApOwogICAgICAgIG15ICVMb29rdXBTb3VyY2VTZWFyY2hGaWVsZHMgPSBtYXAgeyAkXy0+e05hbWV9ID0+IDEgfSBAU291cmNlU2VhcmNoRmllbGRzOwoKICAgICAgICAjIGNoZWNrIGlmIGFsbCBzZWFyY2ggcGFyYW0gZXhpc3RzIGluIHRoZSBzZWFyY2ggZmllbGRzIGZyb20gdGhlIGN1cnJlbnQgc291cmNlCiAgICAgICAgU0VBUkNIRklFTEQ6CiAgICAgICAgZm9yIG15ICRTZWFyY2hGaWVsZCAoQEFsbFNlYXJjaEZpZWxkcykgewoKICAgICAgICAgICAgbmV4dCBTRUFSQ0hGSUVMRCBpZiAhJFBhcmFteyAkU2VhcmNoRmllbGQtPntOYW1lfSB9OwoKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRMb29rdXBTb3VyY2VTZWFyY2hGaWVsZHN7ICRTZWFyY2hGaWVsZC0+e05hbWV9IH07CiAgICAgICAgfQogICAgICAgICRTZWFyY2hDdXN0b21lclVzZXJTb3VyY2VzeyJDdXN0b21lclVzZXIkQ291bnQifSA9IFxAU291cmNlU2VhcmNoRmllbGRzOwogICAgfQoKICAgICMgc2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlCiAgICAkUGFyYW17UmVzdWx0fSB8fD0gJ0FSUkFZJzsKCiAgICBpZiAoICRQYXJhbXtSZXN1bHR9IGVxICdDT1VOVCcgKSB7CgogICAgICAgIG15ICRJRHNDb3VudCA9IDA7CgogICAgICAgIFNPVVJDRToKICAgICAgICBmb3IgbXkgJFNvdXJjZSAoIHNvcnQga2V5cyAlU2VhcmNoQ3VzdG9tZXJVc2VyU291cmNlcyApIHsKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57JFNvdXJjZX07CgogICAgICAgICAgICBteSAkU3ViSURzQ291bnQgPSAkU2VsZi0+eyRTb3VyY2V9LT5DdXN0b21lclNlYXJjaERldGFpbCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFNlYXJjaEZpZWxkcyA9PiAkU2VhcmNoQ3VzdG9tZXJVc2VyU291cmNlc3skU291cmNlfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiBpZiAhZGVmaW5lZCAkU3ViSURzQ291bnQ7CgogICAgICAgICAgICAkSURzQ291bnQgKz0gJFN1YklEc0NvdW50IHx8IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkSURzQ291bnQ7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgbXkgQElEczsKCiAgICAgICAgbXkgJFJlc3VsdENvdW50ID0gMDsKCiAgICAgICAgU09VUkNFOgogICAgICAgIGZvciBteSAkU291cmNlICggc29ydCBrZXlzICVTZWFyY2hDdXN0b21lclVzZXJTb3VyY2VzICkgewogICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnskU291cmNlfTsKCiAgICAgICAgICAgIG15ICRTdWJJRHMgPSAkU2VsZi0+eyRTb3VyY2V9LT5DdXN0b21lclNlYXJjaERldGFpbCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFNlYXJjaEZpZWxkcyA9PiAkU2VhcmNoQ3VzdG9tZXJVc2VyU291cmNlc3skU291cmNlfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiBpZiAhZGVmaW5lZCAkU3ViSURzOwoKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSgkU3ViSURzKTsKCiAgICAgICAgICAgIHB1c2ggQElEcywgQHskU3ViSURzfTsKCiAgICAgICAgICAgICRSZXN1bHRDb3VudCsrOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB3ZSBoYXZlIG1vcmUgdGhlbiBvbmUgc2VhcmNoIHJlc3VsdHMgZnJvbSBkaWZmcmVudCBzb3VyY2VzLCB3ZSBuZWVkIGEgcmVzb3J0aW5nCiAgICAgICAgIyBiZWNhdXNlIG9mIHRoZSBtZXJnZWQgc2luZ2xlIHJlc3VsdHMKICAgICAgICBpZiAoICRSZXN1bHRDb3VudCA+IDEgKSB7CgogICAgICAgICAgICBteSBAVXNlckRhdGFMaXN0OwoKICAgICAgICAgICAgZm9yIG15ICRJRCAoQElEcykgewoKICAgICAgICAgICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJElELAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHB1c2ggQFVzZXJEYXRhTGlzdCwgXCVVc2VyRGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE9yZGVyQnkgPSAnVXNlckxvZ2luJzsKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtPcmRlckJ5fSApICkgewogICAgICAgICAgICAgICAgJE9yZGVyQnkgPSAkUGFyYW17T3JkZXJCeX0tPlswXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufSApICYmICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WzBdIGVxICdVcCcgKSB7CiAgICAgICAgICAgICAgICBAVXNlckRhdGFMaXN0ID0gc29ydCB7IGxjKCAkYS0+eyRPcmRlckJ5fSApIGNtcCBsYyggJGItPnskT3JkZXJCeX0gKSB9IEBVc2VyRGF0YUxpc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBAVXNlckRhdGFMaXN0ID0gc29ydCB7IGxjKCAkYi0+eyRPcmRlckJ5fSApIGNtcCBsYyggJGEtPnskT3JkZXJCeX0gKSB9IEBVc2VyRGF0YUxpc3Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFBhcmFte0xpbWl0fSAmJiBzY2FsYXIgQFVzZXJEYXRhTGlzdCA+ICRQYXJhbXtMaW1pdH0gKSB7CiAgICAgICAgICAgICAgICBzcGxpY2UgQFVzZXJEYXRhTGlzdCwgJFBhcmFte0xpbWl0fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQElEcyA9IG1hcCB7ICRfLT57VXNlckxvZ2lufSB9IEBVc2VyRGF0YUxpc3Q7CiAgICAgICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICAgICAjIENoZWNrIHBlcm1pc3Npb24gZm9yIGV2ZXJ5IHNpbmdsZSBjdXN0b21lciB1c2VyLgogICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgICAgICBteSBATmV3SURTID0gQElEczsKICAgICAgICAgICAgQElEcyA9ICgpOwoKICAgICAgICAgICAgZm9yIG15ICRJRCAoQE5ld0lEUykgewogICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkSUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICglVXNlckRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBJRHMsICRJRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgICAgICByZXR1cm4gXEBJRHM7CiAgICB9Cn0KCj1oZWFkMiBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMoKQoKR2V0IGEgbGlzdCBvZiB0aGUgZGVmaW5lZCBzZWFyY2ggZmllbGRzIChvcHRpb25hbCBvbmx5IHRoZSByZWxldmFudCBmaWVsZHMgZm9yIHRoZSBnaXZlbiBzb3VyY2UpLgoKICAgIG15IEBTZWFjaEZpZWxkcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcygKICAgICAgICBTb3VyY2UgPT4gJ0N1c3RvbWVyVXNlcicsICMgb3B0aW9uYWwsIGJ1dCBpbXBvcnRhbnQgaW4gdGhlIEN1c3RvbWVyU2VhcmNoRGV0YWlsIHRvIGdldCB0aGUgcmlnaHQgZGF0YWJhc2UgZmllbGRzCiAgICApOwoKUmV0dXJucyBhbiBhcnJheSBvZiBoYXNoIHJlZmVyZW5jZXMuCgogICAgQFNlYWNoRmllbGRzID0gKAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVXNlckVtYWlsJywKICAgICAgICAgICAgTGFiZWwgICAgICAgICA9PiAnRW1haWwnLAogICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICdJbnB1dCcsCiAgICAgICAgICAgIERhdGFiYXNlRmllbGQgPT4gJ21haWwnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnVXNlckNvdW50cnknLAogICAgICAgICAgICBMYWJlbCAgICAgICAgICA9PiAnQ291bnRyeScsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICBTZWxlY3Rpb25zRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAnR2VybWFueScgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgICAgICdVbml0ZWQgS2luZ2RvbScgPT4gJ1VuaXRlZCBLaW5nZG9tJywKICAgICAgICAgICAgICAgICdVbml0ZWQgU3RhdGVzJyAgPT4gJ1VuaXRlZCBTdGF0ZXMnLAogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIERhdGFiYXNlRmllbGQgPT4gJ2NvdW50cnknLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdEeW5hbWljRmllbGRfU2t5cGVBY2NvdW50TmFtZScsCiAgICAgICAgICAgIExhYmVsICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIERhdGFiYXNlRmllbGQgPT4gJ1NreXBlQWNjb3VudE5hbWUnLAogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IHRoZSBzZWFyY2ggZmllbGRzIGZyb20gYWxsIGN1c3RvbWVyIHVzZXIgbWFwcyAobWVyZ2UgZnJvbSBhbGwgbWFwcyB0b2dldGhlcikuCiAgICBteSBAU2VhcmNoRmllbGRzOwoKICAgIG15ICVTZWFyY2hGaWVsZHNFeGlzdHM7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAkUGFyYW17U291cmNlfSAmJiAkUGFyYW17U291cmNlfSBuZSAiQ3VzdG9tZXJVc2VyJENvdW50IjsKCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKCiAgICAgICAgICAgIG15ICRTZWFyY2hGaWVsZE5hbWUgPSAkRW50cnktPlswXTsKCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgJFNlYXJjaEZpZWxkc0V4aXN0c3skU2VhcmNoRmllbGROYW1lfTsKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkU2VhcmNoRmllbGROYW1lID1+IG17KFBhc3N3b3JkfFB3KVxkKiR9c214aTsKCiAgICAgICAgICAgICMgUmVtZW1iZXIgdGhlIGFscmVhZHkgY29sbGVjdGVkIHNlYXJjaCBmaWVsZCBuYW1lLgogICAgICAgICAgICAkU2VhcmNoRmllbGRzRXhpc3RzeyRTZWFyY2hGaWVsZE5hbWV9ID0gMTsKCiAgICAgICAgICAgIG15ICVGaWVsZENvbmZpZyA9ICRTZWxmLT5HZXRGaWVsZENvbmZpZygKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSA9PiAkU2VhcmNoRmllbGROYW1lLAogICAgICAgICAgICAgICAgU291cmNlICAgID0+ICRQYXJhbXtTb3VyY2V9LCAgICAgIyB0byBnZXQgdGhlIHJpZ2h0IGRhdGFiYXNlIGZpZWxkIGZvciB0aGUgZ2l2ZW4gc291cmNlCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEVOVFJZIGlmICElRmllbGRDb25maWc7CgogICAgICAgICAgICBteSAlU2VhcmNoRmllbGREYXRhID0gKAogICAgICAgICAgICAgICAgJUZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgTmFtZSA9PiAkU2VhcmNoRmllbGROYW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJVNlbGVjdGlvbnNEYXRhID0gJFNlbGYtPkdldEZpZWxkU2VsZWN0aW9ucygKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSA9PiAkU2VhcmNoRmllbGROYW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkU2VhcmNoRmllbGREYXRhe1N0b3JhZ2VUeXBlfSBlcSAnZHluYW1pY19maWVsZCcgKSB7CiAgICAgICAgICAgICAgICAkU2VhcmNoRmllbGREYXRhe1R5cGV9ID0gJ0R5bmFtaWNGaWVsZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCVTZWxlY3Rpb25zRGF0YSkgewogICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkRGF0YXtUeXBlfSAgICAgICAgICAgPSAnU2VsZWN0aW9uJzsKICAgICAgICAgICAgICAgICRTZWFyY2hGaWVsZERhdGF7U2VsZWN0aW9uc0RhdGF9ID0gXCVTZWxlY3Rpb25zRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWFyY2hGaWVsZERhdGF7VHlwZX0gPSAnSW5wdXQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBTZWFyY2hGaWVsZHMsIFwlU2VhcmNoRmllbGREYXRhOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQFNlYXJjaEZpZWxkczsKfQoKPWhlYWQyIEdldEZpZWxkQ29uZmlnKCkKClRoaXMgZnVuY3Rpb24gY29sbGVjdCBzb21lIGZpZWxkIGNvbmZpZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjdXN0b21lciB1c2VyIG1hcC4KCiAgICBteSAlRmllbGRDb25maWcgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5HZXRGaWVsZENvbmZpZygKICAgICAgICBGaWVsZE5hbWUgPT4gJ1VzZXJFbWFpbCcsCiAgICAgICAgU291cmNlICAgID0+ICdDdXN0b21lclVzZXInLCAjIG9wdGlvbmFsCiAgICApOwoKUmV0dXJucyBzb21lIGZpZWxkIGNvbmZpZyBpbmZvcm1hdGlvbjoKCiAgICBteSAlRmllbGRDb25maWcgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICA9PiAnRW1haWwnLAogICAgICAgIERhdGFiYXNlRmllbGQgPT4gJ2VtYWlsJywKICAgICAgICBTdG9yYWdlVHlwZSAgID0+ICd2YXInLAogICAgKTsKCj1jdXQKCnN1YiBHZXRGaWVsZENvbmZpZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtGaWVsZE5hbWV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBGaWVsZE5hbWUhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgJFBhcmFte1NvdXJjZX0gJiYgJFBhcmFte1NvdXJjZX0gbmUgIkN1c3RvbWVyVXNlciRDb3VudCI7CgogICAgICAgICMgU2VhcmNoIHRoZSByaWdodCBmaWVsZCBhbmQgcmV0dXJuIHNvbWUgY29uZmlnIGluZm9ybWF0aW9uIGZyb20gdGhlIGZpZWxkLgogICAgICAgIEVOVFJZOgogICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgJFBhcmFte0ZpZWxkTmFtZX0gbmUgJEVudHJ5LT5bMF07CgogICAgICAgICAgICBteSAlRmllbGRDb25maWcgPSAoCiAgICAgICAgICAgICAgICBMYWJlbCAgICAgICAgID0+ICRFbnRyeS0+WzFdLAogICAgICAgICAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgIFN0b3JhZ2VUeXBlICAgPT4gJEVudHJ5LT5bNV0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJUZpZWxkQ29uZmlnOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0KCj1oZWFkMiBHZXRGaWVsZFNlbGVjdGlvbnMoKQoKVGhpcyBmdW5jdGlvbiBjb2xsZWN0IHRoZSBzZWxlY3Rpb25zIGZvciB0aGUgZ2l2ZW4gZmllbGQgbmFtZSwgaWYgdGhlIGZpZWxkIGhhcyBzb21lIHNlbGVjdGlvbnMuCgogICAgbXkgJVNlbGVjdGlvbnNEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+R2V0RmllbGRTZWxlY3Rpb25zKAogICAgICAgIEZpZWxkTmFtZSA9PiAnVXNlclRpdGxlJywKICAgICk7CgpSZXR1cm5zIHRoZSBzZWxlY3Rpb25zIGZvciB0aGUgZ2l2ZW4gZmllbGQgbmFtZSAobWVyZ2VkIGZyb20gYWxsIHNvdXJjZXMpIG9yIGEgZW1wdHkgaGFzaDoKCiAgICBteSAlU2VsZWN0aW9uRGF0YSA9ICgKICAgICAgICAnTXIuJyAgPT4gJ01yLicsCiAgICAgICAgJ01ycy4nID0+ICdNcnMuJywKICAgICk7Cgo9Y3V0CgpzdWIgR2V0RmllbGRTZWxlY3Rpb25zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtGaWVsZE5hbWV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBGaWVsZE5hbWUhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVTZWxlY3Rpb25zRGF0YTsKCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+e0N1c3RvbWVyVXNlck1hcH0tPntTZWxlY3Rpb25zfS0+eyAkUGFyYW17RmllbGROYW1lfSB9OwoKICAgICAgICAlU2VsZWN0aW9uc0RhdGEgPSAoCiAgICAgICAgICAgICVTZWxlY3Rpb25zRGF0YSwgJXsgJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57U2VsZWN0aW9uc30tPnsgJFBhcmFte0ZpZWxkTmFtZX0gfSB9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIE1ha2Ugc3VyZSB0aGUgZW5jb2Rpbmcgc3RhbXAgaXMgc2V0LgogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJVNlbGVjdGlvbnNEYXRhICkgewogICAgICAgICRTZWxlY3Rpb25zRGF0YXskS2V5fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlSW5wdXQoICRTZWxlY3Rpb25zRGF0YXskS2V5fSApOwogICAgfQoKICAgICMgRGVmYXVsdCBoYW5kbGluZyBmb3IgZmllbGQgJ1ZhbGlkSUQnLgogICAgaWYgKCAhJVNlbGVjdGlvbnNEYXRhICYmICRQYXJhbXtGaWVsZE5hbWV9ID1+IC9eVmFsaWRJRC9pICkgewogICAgICAgICVTZWxlY3Rpb25zRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgIH0KCiAgICByZXR1cm4gJVNlbGVjdGlvbnNEYXRhOwp9Cgo9aGVhZDIgQ3VzdG9tZXJJRExpc3QoKQoKcmV0dXJuIGEgbGlzdCBvZiB3aXRoIGFsbCBrbm93biB1bmlxdWUgQ3VzdG9tZXJJRHMgb2YgdGhlIHJlZ2lzdGVyZWQgY3VzdG9tZXJzIHVzZXJzIChubyBTZWFyY2hUZXJtKSwKb3IgYSBmaWx0ZXJlZCBsaXN0IHdoZXJlIHRoZSBDdXN0b21lcklEcyBtdXN0IGNvbnRhaW4gYSBzZWFyY2ggdGVybS4KCiAgICBteSBAQ3VzdG9tZXJJRHMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lcklETGlzdCgKICAgICAgICBTZWFyY2hUZXJtICA9PiAnc29tZWN1c3RvbWVyJywgICAgIyBvcHRpb25hbAogICAgICAgIFZhbGlkICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVySURMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQERhdGE7CiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgbGlzdCByZXN1bHQgb2YgYmFja2VuZCBhbmQgbWVyZ2UgaXQKICAgICAgICBwdXNoIEBEYXRhLCAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+Q3VzdG9tZXJJRExpc3QoJVBhcmFtKTsKICAgIH0KCiAgICAjIG1ha2UgZW50cmllcyB1bmlxdWUKICAgIG15ICVUbXA7CiAgICBAVG1we0BEYXRhfSA9IHVuZGVmOwogICAgQERhdGEgPSBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0ga2V5cyAlVG1wOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgRG9uJ3QgcmV0dXJuIGN1c3RvbWVyIElEcyBpZiB0aGUgYWdlbnQgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHZpZXcuCiAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICBteSBAQ2xlYW5lZEN1c3RvbWVySURzOwoKICAgICAgICBmb3IgbXkgJEN1c3RvbWVySUQgKCBARGF0YSApIHsKICAgICAgICAgICAgbXkgJUNvbXBhbnkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55JyktPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICVDb21wYW55ICYmICRDb21wYW55e0N1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgcHVzaCBAQ2xlYW5lZEN1c3RvbWVySURzLCAkQ3VzdG9tZXJJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgQERhdGEgPSBAQ2xlYW5lZEN1c3RvbWVySURzOwogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgcmV0dXJuIEBEYXRhOwp9Cgo9aGVhZDIgQ3VzdG9tZXJOYW1lKCkKCmdldCBjdXN0b21lciB1c2VyIG5hbWUKCiAgICBteSAkTmFtZSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyTmFtZSgKICAgICAgICBVc2VyTG9naW4gPT4gJ3NvbWUtbG9naW4nLAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lck5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKCiAgICAgICAgIyBHZXQgY3VzdG9tZXIgbmFtZSBhbmQgcmV0dXJuIGl0LgogICAgICAgIG15ICROYW1lID0gJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPkN1c3RvbWVyTmFtZSglUGFyYW0pOwogICAgICAgIGlmICgkTmFtZSkgewogICAgICAgICAgICByZXR1cm4gJE5hbWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuOwp9Cgo9aGVhZDIgQ3VzdG9tZXJJRHMoKQoKZ2V0IGN1c3RvbWVyIHVzZXIgY3VzdG9tZXIgaWRzCgogICAgbXkgQEN1c3RvbWVySURzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJJRHMoCiAgICAgICAgVXNlciA9PiAnc29tZS1sb2dpbicsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVySURzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VyfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlciEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgY3VzdG9tZXIgaWRzIChzdG9wIGFmdGVyIGZpcnN0IHNvdXJjZSB3aXRoIHJlc3VsdHMpCiAgICBteSBAQ3VzdG9tZXJJRHM7CiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgaWRzIGZyb20gc291cmNlCiAgICAgICAgbXkgQFNvdXJjZUN1c3RvbWVySURzID0gJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPkN1c3RvbWVySURzKCVQYXJhbSk7CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgIUBTb3VyY2VDdXN0b21lcklEczsKCiAgICAgICAgQEN1c3RvbWVySURzID0gQFNvdXJjZUN1c3RvbWVySURzOwogICAgICAgIGxhc3QgU09VUkNFOwogICAgfQoKICAgICMgY3JlYXRlIGhhc2ggd2l0aCBleGlzdGluZyBjdXN0b21lciBpZHMKICAgIG15ICVDdXN0b21lcklEcyA9IG1hcCB7ICRfID0+IDEgfSBAQ3VzdG9tZXJJRHM7CgogICAgIyBnZXQgcmVsYXRlZCBjdXN0b21lciBpZHMKICAgIG15IEBSZWxhdGVkQ3VzdG9tZXJJRHMgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJMaXN0KAogICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRQYXJhbXtVc2VyfSwKICAgICk7CgogICAgIyBhZGQgcmVsYXRlZCBjdXN0b21lciBpZHMgaWYgbm90IGZvdW5kIGluIHNvdXJjZQogICAgUkVMQVRFRENVU1RPTUVSSUQ6CiAgICBmb3IgbXkgJFJlbGF0ZWRDdXN0b21lcklEIChAUmVsYXRlZEN1c3RvbWVySURzKSB7CiAgICAgICAgbmV4dCBSRUxBVEVEQ1VTVE9NRVJJRCBpZiAkQ3VzdG9tZXJJRHN7JFJlbGF0ZWRDdXN0b21lcklEfTsKCiAgICAgICAgcHVzaCBAQ3VzdG9tZXJJRHMsICRSZWxhdGVkQ3VzdG9tZXJJRDsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIERvbid0IHJldHVybiBjdXN0b21lciBJRHMgaWYgdGhlIGFnZW50IGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3LgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgbXkgQENsZWFuZWRDdXN0b21lcklEczsKCiAgICAgICAgZm9yIG15ICRDdXN0b21lcklEICggQEN1c3RvbWVySURzICkgewogICAgICAgICAgICBteSAlQ29tcGFueSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKS0+Q3VzdG9tZXJDb21wYW55R2V0KAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJUNvbXBhbnkgJiYgJENvbXBhbnl7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBDbGVhbmVkQ3VzdG9tZXJJRHMsICRDdXN0b21lcklEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBAQ3VzdG9tZXJJRHMgPSBAQ2xlYW5lZEN1c3RvbWVySURzOwogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgIyByZXR1cm4gY3VzdG9tZXIgaWRzCiAgICByZXR1cm4gQEN1c3RvbWVySURzOwp9Cgo9aGVhZDIgQ3VzdG9tZXJVc2VyRGF0YUdldCgpCgpnZXQgdXNlciBkYXRhIChVc2VyTG9naW4sIFVzZXJGaXJzdG5hbWUsIFVzZXJMYXN0bmFtZSwgVXNlckVtYWlsLCAuLi4pCgogICAgbXkgJUN1c3RvbWVyVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgIFVzZXIgPT4gJ2ZyYW56JywKICAgICk7CgpXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBiYWNrZW5kcyB0aGVuIG9ubHkgdGhlIGRhdGEgZnJvbSB0aGUgZmlyc3QgYmFja2VuZCB3aGVyZSB0aGUgY3VzdG9tZXIgdXNlciBpcyBmb3VuZC4KQW4gZW1wdHkgbGlzdCBpcyByZXR1cm5lZCB3aGVuIHRoZSBjdXN0b21lciB1c2VyIHdhcyd0IGZvdW5kIGluIGFueSBiYWNrZW5kLgoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlckRhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gdW5sZXNzICRQYXJhbXtVc2VyfTsKCiAgICAjIGZldGNoIGR5bmFtaWMgZmllbGQgY29uZmlndXJhdGlvbnMgZm9yIEN1c3RvbWVyVXNlci4KICAgIG15ICREeW5hbWljRmllbGRDb25maWdzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIE9iamVjdFR5cGUgPT4gJ0N1c3RvbWVyVXNlcicsCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgKTsKCiAgICBteSAlRHluYW1pY0ZpZWxkTG9va3VwID0gbWFwIHsgJF8tPntOYW1lfSA9PiAkXyB9IEB7JER5bmFtaWNGaWVsZENvbmZpZ3N9OwoKICAgICMgR2V0IG5lZWRlZCBvYmplY3RzLgogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJEN1c3RvbWVyQ29tcGFueU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55Jyk7CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKCiAgICAgICAgbXkgJUN1c3RvbWVyID0gJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPkN1c3RvbWVyVXNlckRhdGFHZXQoJVBhcmFtKTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJUN1c3RvbWVyOwoKICAgICAgICAjIGdlbmVyYXRlIHRoZSBmdWxsIG5hbWUgYW5kIHNhdmUgaXQgaW4gdGhlIGhhc2gKICAgICAgICBteSAkVXNlckZ1bGxuYW1lID0gJFNlbGYtPkN1c3RvbWVyTmFtZSglQ3VzdG9tZXIpOwoKICAgICAgICAjIHNhdmUgdGhlIGdlbmVyYXRlZCBmdWxsbmFtZSBpbiB0aGUgaGFzaC4KICAgICAgICAkQ3VzdG9tZXJ7VXNlckZ1bGxuYW1lfSA9ICRVc2VyRnVsbG5hbWU7CgogICAgICAgICMgYWRkIHByZWZlcmVuY2VzIGRlZmF1bHRzCiAgICAgICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQcmVmZXJlbmNlc0dyb3VwcycpOwogICAgICAgIGlmICgkQ29uZmlnKSB7CiAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskQ29uZmlnfSApIHsKCiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhZGVmaW5lZCAkQ29uZmlnLT57JEtleX0tPntEYXRhU2VsZWN0ZWR9OwogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgZGVmaW5lZCAkQ3VzdG9tZXJ7ICRDb25maWctPnskS2V5fS0+e1ByZWZLZXl9IH07CgogICAgICAgICAgICAgICAgIyBzZXQgZGVmYXVsdCBkYXRhCiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJ7ICRDb25maWctPnskS2V5fS0+e1ByZWZLZXl9IH0gPSAkQ29uZmlnLT57JEtleX0tPntEYXRhU2VsZWN0ZWR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGN1c3RvbWVyIGNvbXBhbnkgc3VwcG9ydCBpcyBlbmFibGVkIGFuZCBnZXQgY29tcGFueSBkYXRhCiAgICAgICAgbXkgJUNvbXBhbnk7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyQ29tcGFueSIpCiAgICAgICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJVc2VyJENvdW50IiktPntDdXN0b21lckNvbXBhbnlTdXBwb3J0fQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAlQ29tcGFueSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVye1VzZXJDdXN0b21lcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRDb21wYW55e0N1c3RvbWVyQ29tcGFueVZhbGlkSUR9ID0gJENvbXBhbnl7VmFsaWRJRH07CiAgICAgICAgfQoKICAgICAgICAjIGZldGNoIGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gKSApIHsKICAgICAgICAgICAgQ1VTVE9NRVJVU0VSRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyRmllbGQgKCBAeyAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IENVU1RPTUVSVVNFUkZJRUxEIGlmICRDdXN0b21lclVzZXJGaWVsZC0+WzVdIG5lICdkeW5hbWljX2ZpZWxkJzsKICAgICAgICAgICAgICAgIG5leHQgQ1VTVE9NRVJVU0VSRklFTEQgaWYgISREeW5hbWljRmllbGRMb29rdXB7ICRDdXN0b21lclVzZXJGaWVsZC0+WzJdIH07CgogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkTG9va3VweyAkQ3VzdG9tZXJVc2VyRmllbGQtPlsyXSB9LAogICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICAgICA9PiAkQ3VzdG9tZXJ7VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJEN1c3RvbWVyeyAkQ3VzdG9tZXJVc2VyRmllbGQtPlswXSB9ID0gJFZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICAgICAjIENoZWNrIHBlcm1pc3Npb24uCiAgICAgICAgaWYgKCAkQ3VzdG9tZXJ7VXNlckdyb3VwSUR9ICkgewogICAgICAgICAgICBteSAkVXNlckdyb3VwSURTeW5jID0gJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57VXNlckdyb3VwSURTeW5jfTsKCiAgICAgICAgICAgICMgUmVwbGFjZSB0aGUgcmVtb3RlIGdyb3VwIHdpdGggdGhlIGFzc29jaWF0ZWQgbG9jYWwgZ3JvdXAuCiAgICAgICAgICAgIGlmICggJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSApIHsKICAgICAgICAgICAgICAgIGZvciBteSAkUmVtb3RlR3JvdXAgKCBrZXlzICV7ICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lcntVc2VyR3JvdXBJRH0gZXEgJFJlbW90ZUdyb3VwICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJ7VXNlckdyb3VwSUR9ID0gJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfXskUmVtb3RlR3JvdXB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDaGVjayBpZiBncm91cCBJRCBvciBncm91cCBuYW1lcyBzaG91bGQgYmUgbWF0Y2hlZC4KICAgICAgICAgICAgaWYgKCAkVXNlckdyb3VwSURTeW5jLT57VXNlR3JvdXBOYW1lc30gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJ7VXNlckdyb3VwSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgICAgICAgICAgICAgIEdyb3VwID0+ICRDdXN0b21lcntVc2VyR3JvdXBJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENoZWNrIGlmIGFueSBsaW1pdHMgYXJlIHNldC4KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gJiYgIWdyZXAgeyAkXyA9fiAvXiRDdXN0b21lcntVc2VyR3JvdXBJRH0kLyB9IEB7ICRTZWxmLT57VXNlckdyb3VwSURzfSB9ICkgewogICAgICAgICAgICAgICAgIyBUaGUgdXNlciBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byB0aGlzIGluZm9ybWF0aW9uLgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgSWYgdGhlcmUgYXJlIG5vIGdyb3VwIHNldHRpbmdzLCBjaGVjayBpZiBwZXJtaXNzaW9uIG9uIGN1c3RvbWVyIGNvbXBhbnkgaXMgcGVybWl0dGVkLgogICAgICAgIGVsc2lmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICYmICEkQ3VzdG9tZXJ7VXNlckdyb3VwSUR9ICYmICggISVDb21wYW55IHx8ICEkQ29tcGFueXtDdXN0b21lcklEfSApICkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgICMgcmV0dXJuIGN1c3RvbWVyIGRhdGEKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAlQ29tcGFueSwKICAgICAgICAgICAgJUN1c3RvbWVyLAogICAgICAgICAgICBTb3VyY2UgICAgICAgID0+ICJDdXN0b21lclVzZXIkQ291bnQiLAogICAgICAgICAgICBDb25maWcgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJVc2VyJENvdW50IiksCiAgICAgICAgICAgIENvbXBhbnlDb25maWcgPT4gJENvbmZpZ09iamVjdC0+R2V0KCAkQ29tcGFueXtTb3VyY2V9IC8vICdDdXN0b21lckNvbXBhbnknICksCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1oZWFkMiBDdXN0b21lclVzZXJBZGQoKQoKdG8gYWRkIG5ldyBjdXN0b21lciB1c2VycwoKICAgIG15ICRVc2VyTG9naW4gPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJBZGQoCiAgICAgICAgU291cmNlICAgICAgICAgPT4gJ0N1c3RvbWVyVXNlcicsICMgQ3VzdG9tZXJVc2VyIHNvdXJjZSBjb25maWcKICAgICAgICBVc2VyRmlyc3RuYW1lICA9PiAnTWFuZnJlZCcsCiAgICAgICAgVXNlckxhc3RuYW1lICAgPT4gJ0h1YmVyJywKICAgICAgICBVc2VyQ3VzdG9tZXJJRCA9PiAnQTEyNCcsCiAgICAgICAgVXNlckxvZ2luICAgICAgPT4gJ21odWJlcicsCiAgICAgICAgVXNlclBhc3N3b3JkICAgPT4gJ3NvbWUtcGFzcycsICMgbm90IHJlcXVpcmVkCiAgICAgICAgVXNlckVtYWlsICAgICAgPT4gJ21hbmZyZWQuaHViZXJAZXhhbXBsZS5jb20nLAogICAgICAgIFZhbGlkSUQgICAgICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lclVzZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGRhdGEgc291cmNlCiAgICBpZiAoICEkUGFyYW17U291cmNlfSApIHsKICAgICAgICAkUGFyYW17U291cmNlfSA9ICdDdXN0b21lclVzZXInOwogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBleGlzdHMKICAgIGlmICggJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkUGFyYW17VXNlckxvZ2lufSApOwogICAgICAgIGlmICglVXNlcikgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyktPlRyYW5zbGF0ZSggJ0N1c3RvbWVyIHVzZXIgIiVzIiBhbHJlYWR5IGV4aXN0cy4nLCAkUGFyYW17VXNlckxvZ2lufSApLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gYWRkIHRoZSBVc2VyR3JvdXBJRC4KICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgIGRlbGV0ZSAkUGFyYW17VXNlckdyb3VwSUR9OwogICAgfQoKICAgIG15ICRVc2VyR3JvdXBJRFN5bmMgPSAkU2VsZi0+eyRQYXJhbXtTb3VyY2V9fS0+e0N1c3RvbWVyVXNlck1hcH0tPntVc2VyR3JvdXBJRFN5bmN9OwogICAgaWYgKCAkUGFyYW17VXNlckdyb3VwSUR9ICkgewogICAgICAgICMgQ2hlY2sgaWYgZ3JvdXAgSUQgb3IgZ3JvdXAgbmFtZXMgc2hvdWxkIGJlIG1hdGNoZWQuCiAgICAgICAgaWYgKCAkVXNlckdyb3VwSURTeW5jLT57VXNlR3JvdXBOYW1lc30gKSB7CiAgICAgICAgICAgIG15ICRHcm91cE5hbWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRQYXJhbXtVc2VyR3JvdXBJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUGFyYW17VXNlckdyb3VwSUR9ID0gJEdyb3VwTmFtZTsKICAgICAgICB9CgogICAgICAgICMgUmVwbGFjZSB0aGUgbG9jYWwgZ3JvdXAgd2l0aCB0aGUgYXNzb2NpYXRlZCByZW1vdGUgZ3JvdXAuCiAgICAgICAgZm9yIG15ICRSZW1vdGVHcm91cCAoIGtleXMgJXsgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSB9ICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtVc2VyR3JvdXBJRH0gZXEgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfXskUmVtb3RlR3JvdXB9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRSZW1vdGVHcm91cDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgICMgc3RvcmUgY3VzdG9tZXIgdXNlciBkYXRhCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPnsgJFBhcmFte1NvdXJjZX0gfS0+Q3VzdG9tZXJVc2VyQWRkKCVQYXJhbSk7CiAgICByZXR1cm4gaWYgISRSZXN1bHQ7CgogICAgIyB0cmlnZ2VyIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDdXN0b21lclVzZXJBZGQnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICBOZXdEYXRhICAgPT4gXCVQYXJhbSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRSZXN1bHQ7Cgp9Cgo9aGVhZDIgQ3VzdG9tZXJVc2VyVXBkYXRlKCkKCnRvIHVwZGF0ZSBjdXN0b21lciB1c2VycwoKICAgICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlclVwZGF0ZSgKICAgICAgICBTb3VyY2UgICAgICAgID0+ICdDdXN0b21lclVzZXInLCAjIEN1c3RvbWVyVXNlciBzb3VyY2UgY29uZmlnCiAgICAgICAgSUQgICAgICAgICAgICA9PiAnbWgnICAgICAgICAgICAgIyBjdXJyZW50IHVzZXIgbG9naW4KICAgICAgICBVc2VyTG9naW4gICAgID0+ICdtaHViZXInLCAgICAgICAjIG5ldyB1c2VyIGxvZ2luCiAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAnSHViZXInLAogICAgICAgIFVzZXJMYXN0bmFtZSAgPT4gJ01hbmZyZWQnLAogICAgICAgIFVzZXJQYXNzd29yZCAgPT4gJ3NvbWUtcGFzcycsICAgICMgbm90IHJlcXVpcmVkCiAgICAgICAgVXNlckVtYWlsICAgICA9PiAnZW1haWxAZXhhbXBsZS5jb20nLAogICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJVc2VyVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VyTG9naW59ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBVc2VyTG9naW4hIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgZm9yIFVzZXJMb2dpbi1yZW5hbWluZyBhbmQgaWYgbmV3IFVzZXJMb2dpbiBhbHJlYWR5IGV4aXN0cy4uLgogICAgaWYgKCAkUGFyYW17SUR9ICYmICggbGMgJFBhcmFte1VzZXJMb2dpbn0gbmUgbGMgJFBhcmFte0lEfSApICkgewogICAgICAgIG15ICVVc2VyID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFBhcmFte1VzZXJMb2dpbn0gKTsKICAgICAgICBpZiAoJVVzZXIpIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoICdDdXN0b21lciB1c2VyICIlcyIgYWxyZWFkeSBleGlzdHMuJywgJFBhcmFte1VzZXJMb2dpbn0gKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgZXhpc3RzCiAgICBteSAlVXNlciA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRQYXJhbXtJRH0gfHwgJFBhcmFte1VzZXJMb2dpbn0gKTsKICAgIGlmICggISVVc2VyICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCB1c2VyICckUGFyYW17VXNlckxvZ2lufSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIGNoYW5nZSB0aGUgVXNlckdyb3VwSUQuCiAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICAjIFNldCB0aGUgVXNlckdyb3VwSUQgdG8gdGhlIGN1cnJlbnQgVXNlckdyb3VwSUQuCiAgICAgICAgaWYgKCAkVXNlcntVc2VyR3JvdXBJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtVc2VyR3JvdXBJRH0gPSAkVXNlcntVc2VyR3JvdXBJRH07CiAgICAgICAgfQogICAgfQoKICAgIG15ICRVc2VyR3JvdXBJRFN5bmMgPSAkU2VsZi0+eyRVc2Vye1NvdXJjZX19LT57Q3VzdG9tZXJVc2VyTWFwfS0+e1VzZXJHcm91cElEU3luY307CiAgICBpZiAoICRQYXJhbXtVc2VyR3JvdXBJRH0gKSB7CiAgICAgICAgIyBDaGVjayBpZiBncm91cCBJRCBvciBncm91cCBuYW1lcyBzaG91bGQgYmUgbWF0Y2hlZC4KICAgICAgICBpZiAoICRVc2VyR3JvdXBJRFN5bmMtPntVc2VHcm91cE5hbWVzfSApIHsKICAgICAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJFBhcmFte1VzZXJHcm91cElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQYXJhbXtVc2VyR3JvdXBJRH0gPSAkR3JvdXBOYW1lOwogICAgICAgIH0KCiAgICAgICAgIyBSZXBsYWNlIHRoZSBsb2NhbCBncm91cCB3aXRoIHRoZSBhc3NvY2lhdGVkIHJlbW90ZSBncm91cC4KICAgICAgICBmb3IgbXkgJFJlbW90ZUdyb3VwICgga2V5cyAleyAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9IH0gKSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte1VzZXJHcm91cElEfSBlcSAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9eyRSZW1vdGVHcm91cH0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17VXNlckdyb3VwSUR9ID0gJFJlbW90ZUdyb3VwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57ICRVc2Vye1NvdXJjZX0gfS0+Q3VzdG9tZXJVc2VyVXBkYXRlKCVQYXJhbSk7CiAgICByZXR1cm4gaWYgISRSZXN1bHQ7CgogICAgIyB0cmlnZ2VyIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdDdXN0b21lclVzZXJVcGRhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRQYXJhbXtJRH0gfHwgJFBhcmFte1VzZXJMb2dpbn0sCiAgICAgICAgICAgIE5ld0RhdGEgICA9PiBcJVBhcmFtLAogICAgICAgICAgICBPbGREYXRhICAgPT4gXCVVc2VyLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKPWhlYWQyIFNldFBhc3N3b3JkKCkKCnRvIHNldCBjdXN0b21lciB1c2VycyBwYXNzd29yZHMKCiAgICAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5TZXRQYXNzd29yZCgKICAgICAgICBVc2VyTG9naW4gPT4gJ3NvbWUtbG9naW4nLAogICAgICAgIFBXICAgICAgICA9PiAnc29tZS1uZXctcGFzc3dvcmQnCiAgICApOwoKPWN1dAoKc3ViIFNldFBhc3N3b3JkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VyTG9naW59ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVXNlciBVc2VyTG9naW4hJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBleGlzdHMKICAgIG15ICVVc2VyID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFBhcmFte1VzZXJMb2dpbn0gKTsKICAgIGlmICggISVVc2VyICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCB1c2VyICckUGFyYW17VXNlckxvZ2lufSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHJldHVybiAkU2VsZi0+eyAkVXNlcntTb3VyY2V9IH0tPlNldFBhc3N3b3JkKCVQYXJhbSk7Cn0KCj1oZWFkMiBHZW5lcmF0ZVJhbmRvbVBhc3N3b3JkKCkKCmdlbmVyYXRlIGEgcmFuZG9tIHBhc3N3b3JkCgogICAgbXkgJFBhc3N3b3JkID0gJEN1c3RvbWVyVXNlck9iamVjdC0+R2VuZXJhdGVSYW5kb21QYXNzd29yZCgpOwoKICAgIG9yCgogICAgbXkgJFBhc3N3b3JkID0gJEN1c3RvbWVyVXNlck9iamVjdC0+R2VuZXJhdGVSYW5kb21QYXNzd29yZCgKICAgICAgICBTaXplID0+IDE2LAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmF0ZVJhbmRvbVBhc3N3b3JkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRTZWxmLT57Q3VzdG9tZXJVc2VyfS0+R2VuZXJhdGVSYW5kb21QYXNzd29yZCglUGFyYW0pOwp9Cgo9aGVhZDIgU2V0UHJlZmVyZW5jZXMoKQoKc2V0IGN1c3RvbWVyIHVzZXIgcHJlZmVyZW5jZXMKCiAgICAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICBLZXkgICAgPT4gJ1VzZXJDb21tZW50JywKICAgICAgICBWYWx1ZSAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVXNlcklEID0+ICdzb21lLWxvZ2luJywKICAgICk7Cgo9Y3V0CgpzdWIgU2V0UHJlZmVyZW5jZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBEb24ndCBhbGxvdyBvdmVyd3JpdGluZyBvZiBuYXRpdmUgdXNlciBkYXRhLgogICAgbXkgJUJsYWNrbGlzdGVkID0gKAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgVXNlckxvZ2luICAgICAgPT4gMSwKICAgICAgICBVc2VyUGFzc3dvcmQgICA9PiAxLAogICAgICAgIFVzZXJGaXJzdG5hbWUgID0+IDEsCiAgICAgICAgVXNlckxhc3RuYW1lICAgPT4gMSwKICAgICAgICBVc2VyRnVsbG5hbWUgICA9PiAxLAogICAgICAgIFVzZXJTdHJlZXQgICAgID0+IDEsCiAgICAgICAgVXNlckNpdHkgICAgICAgPT4gMSwKICAgICAgICBVc2VyWmlwICAgICAgICA9PiAxLAogICAgICAgIFVzZXJDb3VudHJ5ICAgID0+IDEsCiAgICAgICAgVXNlckNvbW1lbnQgICAgPT4gMSwKICAgICAgICBVc2VyQ3VzdG9tZXJJRCA9PiAxLAogICAgICAgIFVzZXJUaXRsZSAgICAgID0+IDEsCiAgICAgICAgVXNlckVtYWlsICAgICAgPT4gMSwKICAgICAgICBDaGFuZ2VUaW1lICAgICA9PiAxLAogICAgICAgIENoYW5nZUJ5ICAgICAgID0+IDEsCiAgICAgICAgQ3JlYXRlVGltZSAgICAgPT4gMSwKICAgICAgICBDcmVhdGVCeSAgICAgICA9PiAxLAogICAgICAgIFVzZXJQaG9uZSAgICAgID0+IDEsCiAgICAgICAgVXNlck1vYmlsZSAgICAgPT4gMSwKICAgICAgICBVc2VyRmF4ICAgICAgICA9PiAxLAogICAgICAgIFVzZXJNYWlsU3RyaW5nID0+IDEsCiAgICAgICAgVmFsaWRJRCAgICAgICAgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIDAgaWYgJEJsYWNrbGlzdGVkeyAkUGFyYW17S2V5fSB9OwoKICAgICMgY2hlY2sgaWYgdXNlciBleGlzdHMKICAgIG15ICVVc2VyID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFBhcmFte1VzZXJJRH0gKTsKICAgIGlmICggISVVc2VyICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCB1c2VyICckUGFyYW17VXNlcklEfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhbGwgbmV3IGFwaSAoMi40LjggYW5kIGhpZ2hlcikKICAgIGlmICggJFNlbGYtPnsgJFVzZXJ7U291cmNlfSB9LT5jYW4oJ1NldFByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57ICRVc2Vye1NvdXJjZX0gfS0+U2V0UHJlZmVyZW5jZXMoJVBhcmFtKTsKICAgIH0KCiAgICAjIGNhbGwgb2xkIGFwaQogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5TZXRQcmVmZXJlbmNlcyglUGFyYW0pOwp9Cgo9aGVhZDIgR2V0UHJlZmVyZW5jZXMoKQoKZ2V0IGN1c3RvbWVyIHVzZXIgcHJlZmVyZW5jZXMKCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJ3NvbWUtbG9naW4nLAogICAgKTsKCj1jdXQKCnN1YiBHZXRQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgZXhpc3RzCiAgICBteSAlVXNlciA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRQYXJhbXtVc2VySUR9ICk7CiAgICBpZiAoICElVXNlciApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggdXNlciAnJFBhcmFte1VzZXJJRH0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWxsIG5ldyBhcGkgKDIuNC44IGFuZCBoaWdoZXIpCiAgICBpZiAoICRTZWxmLT57ICRVc2Vye1NvdXJjZX0gfS0+Y2FuKCdHZXRQcmVmZXJlbmNlcycpICkgewogICAgICAgIHJldHVybiAkU2VsZi0+eyAkVXNlcntTb3VyY2V9IH0tPkdldFByZWZlcmVuY2VzKCVQYXJhbSk7CiAgICB9CgogICAgIyBjYWxsIG9sZCBhcGkKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+R2V0UHJlZmVyZW5jZXMoJVBhcmFtKTsKfQoKPWhlYWQyIFNlYXJjaFByZWZlcmVuY2VzKCkKCnNlYXJjaCBpbiB1c2VyIHByZWZlcmVuY2VzCgogICAgbXkgJVVzZXJMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+U2VhcmNoUHJlZmVyZW5jZXMoCiAgICAgICAgS2V5ICAgPT4gJ1VzZXJTb21lS2V5JywKICAgICAgICBWYWx1ZSA9PiAnU29tZVZhbHVlJywgICAjIG9wdGlvbmFsLCBsaW1pdCB0byBhIGNlcnRhaW4gdmFsdWUvcGF0dGVybgogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhOwogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIHNlYXJjaCByZXN1bHQgb2YgYmFja2VuZCBhbmQgbWVyZ2UgaXQKICAgICAgICAjIGNhbGwgbmV3IGFwaSAoMi40LjggYW5kIGhpZ2hlcikKICAgICAgICBteSAlU3ViRGF0YTsKICAgICAgICBpZiAoICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT5jYW4oJ1NlYXJjaFByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgICAgICVTdWJEYXRhID0gJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPlNlYXJjaFByZWZlcmVuY2VzKCVQYXJhbSk7CiAgICAgICAgfQoKICAgICAgICAjIGNhbGwgb2xkIGFwaQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlU3ViRGF0YSA9ICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5TZWFyY2hQcmVmZXJlbmNlcyglUGFyYW0pOwogICAgICAgIH0KICAgICAgICAlRGF0YSA9ICggJVN1YkRhdGEsICVEYXRhICk7CiAgICB9CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aGVhZDIgVG9rZW5HZW5lcmF0ZSgpCgpnZW5lcmF0ZSBhIHJhbmRvbSB0b2tlbgoKICAgIG15ICRUb2tlbiA9ICRDdXN0b21lclVzZXJPYmplY3QtPlRva2VuR2VuZXJhdGUoCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgVG9rZW5HZW5lcmF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVXNlcklEISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkVG9rZW4gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5HZW5lcmF0ZVJhbmRvbVN0cmluZygKICAgICAgICBMZW5ndGggPT4gMTQsCiAgICApOwoKICAgICMgc2F2ZSB0b2tlbiBpbiBwcmVmZXJlbmNlcwogICAgJFNlbGYtPlNldFByZWZlcmVuY2VzKAogICAgICAgIEtleSAgICA9PiAnVXNlclRva2VuJywKICAgICAgICBWYWx1ZSAgPT4gJFRva2VuLAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRUb2tlbjsKfQoKPWhlYWQyIFRva2VuQ2hlY2soKQoKY2hlY2sgcGFzc3dvcmQgdG9rZW4KCiAgICBteSAkVmFsaWQgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0PlRva2VuQ2hlY2soCiAgICAgICAgVG9rZW4gID0+ICRUb2tlbiwKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBUb2tlbkNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUb2tlbn0gfHwgISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBUb2tlbiBhbmQgVXNlcklEISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBwcmVmZXJlbmNlcyB0b2tlbgogICAgbXkgJVByZWZlcmVuY2VzID0gJFNlbGYtPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayByZXF1ZXN0ZWQgdnMuIHN0b3JlZCB0b2tlbgogICAgcmV0dXJuIGlmICEkUHJlZmVyZW5jZXN7VXNlclRva2VufTsKICAgIHJldHVybiBpZiAkUHJlZmVyZW5jZXN7VXNlclRva2VufSBuZSAkUGFyYW17VG9rZW59OwoKICAgICMgcmVzZXQgcGFzc3dvcmQgdG9rZW4KICAgICRTZWxmLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICBLZXkgICAgPT4gJ1VzZXJUb2tlbicsCiAgICAgICAgVmFsdWUgID0+ICcnLAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDdXN0b21lclVzZXJDYWNoZUNsZWFyKCkKCmNsZWFyIGNhY2hlIG9mIGN1c3RvbWVyIHVzZXIgZGF0YQoKICAgICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckNhY2hlQ2xlYXIoCiAgICAgICAgVXNlckxvZ2luID0+ICdtaHViZXInLAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lclVzZXJDYWNoZUNsZWFyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CiAgICAgICAgJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPl9DdXN0b21lclVzZXJDYWNoZUNsZWFyKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEN1c3RvbWVyVXNlckN1c3RvbWVyTWVtYmVyQWRkKCkKCnRvIGFkZCBhIGN1c3RvbWVyIHVzZXIgdG8gYSBjdXN0b21lcgoKICAgIG15ICRTdWNjZXNzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJBZGQoCiAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gMTIzLAogICAgICAgIEN1c3RvbWVySUQgICAgID0+IDEyMywKICAgICAgICBBY3RpdmUgICAgICAgICA9PiAxLCAgICAgICAgIyBvcHRpb25hbAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ3VzdG9tZXJVc2VySUQgQ3VzdG9tZXJJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIGFmZmVjdGVkIGNhY2hlcwogICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpDdXN0b21lclVzZXJDdXN0b21lck1lbWJlckxpc3Q6Oic7CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5IC4gJ0N1c3RvbWVyVXNlcklEOjonIC4gJFBhcmFte0N1c3RvbWVyVXNlcklEfSwKICAgICk7CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5IC4gJ0N1c3RvbWVySUQ6OicgLiAkUGFyYW17Q3VzdG9tZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkZWxldGUgZXhpc3RpbmcgcmVsYXRpb24KICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NIGN1c3RvbWVyX3VzZXJfY3VzdG9tZXIKICAgICAgICAgICAgV0hFUkUgdXNlcl9pZCA9ID8KICAgICAgICAgICAgQU5EIGN1c3RvbWVyX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q3VzdG9tZXJVc2VySUR9LCBcJFBhcmFte0N1c3RvbWVySUR9IF0sCiAgICApOwoKICAgICMgcmV0dXJuIGlmIHJlbGF0aW9uIGlzIG5vdCBhY3RpdmUKICAgIHJldHVybiAxIGlmICEkUGFyYW17QWN0aXZlfTsKCiAgICAjIGluc2VydCBuZXcgcmVsYXRpb24KICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBJTlNFUlQgSU5UTyBjdXN0b21lcl91c2VyX2N1c3RvbWVyICh1c2VyX2lkLCBjdXN0b21lcl9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwKICAgICAgICAgICAgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkKICAgICAgICAgICAgVkFMVUVTICg/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDdXN0b21lclVzZXJJRH0sIFwkUGFyYW17Q3VzdG9tZXJJRH0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9LCBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEN1c3RvbWVyVXNlckN1c3RvbWVyTWVtYmVyTGlzdCgpCgpnZXQgcmVsYXRlZCBjdXN0b21lciBJRHMgb2YgYSBjdXN0b21lciB1c2VyCgogICAgbXkgQEN1c3RvbWVySURzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJMaXN0KAogICAgICAgIEN1c3RvbWVyVXNlcklEID0+IDEyMywKICAgICk7CgpSZXR1cm5zOgogICAgQEN1c3RvbWVySURzID0gKAogICAgICAgICcxMjMnLAogICAgICAgICc0NTYnLAogICAgKTsKCmdldCByZWxhdGVkIGN1c3RvbWVyIHVzZXJzIG9mIGEgY3VzdG9tZXIgSUQKCiAgICBteSBAQ3VzdG9tZXJVc2VycyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckN1c3RvbWVyTWVtYmVyTGlzdCgKICAgICAgICBDdXN0b21lcklEID0+IDEyMywKICAgICk7CgpSZXR1cm5zOgogICAgQEN1c3RvbWVyVXNlcnMgPSAoCiAgICAgICAgJzEyMycsCiAgICAgICAgJzQ1NicsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlckN1c3RvbWVyTWVtYmVyTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICYmICEkUGFyYW17Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdHb3Qgbm8gQ3VzdG9tZXJVc2VySUQgb3IgQ3VzdG9tZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICRDYWNoZUtleSA9ICdDYWNoZTo6Q3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJMaXN0OjonOwoKICAgIGlmICggJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiB0aGlzIHJlc3VsdCBpcyBwcmVzZW50IChpbiBjYWNoZSkKICAgICAgICAkQ2FjaGVLZXkgLj0gJ0N1c3RvbWVyVXNlcklEOjonIC4gJFBhcmFte0N1c3RvbWVyVXNlcklEfTsKICAgICAgICBteSAkQ2FjaGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gQHskQ2FjaGV9IGlmICRDYWNoZTsKCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgaWRzCiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PgogICAgICAgICAgICAgICAgJ1NFTEVDVCBjdXN0b21lcl9pZAogICAgICAgICAgICAgICAgRlJPTSBjdXN0b21lcl91c2VyX2N1c3RvbWVyCiAgICAgICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICAgICAgT1JERVIgQlkgY3VzdG9tZXJfaWQnLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDdXN0b21lclVzZXJJRH0sIF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgbXkgQEN1c3RvbWVySURzOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXEBDdXN0b21lcklEcywKCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIEBDdXN0b21lcklEczsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNoZWNrIGlmIHRoaXMgcmVzdWx0IGlzIHByZXNlbnQgKGluIGNhY2hlKQogICAgICAgICRDYWNoZUtleSAuPSAnQ3VzdG9tZXJJRDo6JyAuICRQYXJhbXtDdXN0b21lcklEfTsKICAgICAgICBteSAkQ2FjaGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gQHskQ2FjaGV9IGlmICRDYWNoZTsKCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgdXNlcnMKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+CiAgICAgICAgICAgICAgICAnU0VMRUNUIHVzZXJfaWQKICAgICAgICAgICAgICAgIEZST00gY3VzdG9tZXJfdXNlcl9jdXN0b21lciBXSEVSRQogICAgICAgICAgICAgICAgY3VzdG9tZXJfaWQgPSA/CiAgICAgICAgICAgICAgICBPUkRFUiBCWSB1c2VyX2lkJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q3VzdG9tZXJJRH0sIF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgbXkgQEN1c3RvbWVyVXNlcklEczsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgcHVzaCBAQ3VzdG9tZXJVc2VySURzLCAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcQEN1c3RvbWVyVXNlcklEcywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gQEN1c3RvbWVyVXNlcklEczsKICAgIH0KfQoKPWhlYWQyIERlbGV0ZU9uZVByZWZlcmVuY2UoKQoKZ2V0IGN1c3RvbWVyIHVzZXIgcHJlZmVyZW5jZXMKCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5EZWxldGVPbmVQcmVmZXJlbmNlKAogICAgICAgIFVzZXJJRCA9PiAnc29tZS1sb2dpbicsCiAgICAgICAgS2V5ICAgID0+ICdQcmVmZXJlbmNlS2V5JywKICAgICk7Cgo9Y3V0CgpzdWIgRGVsZXRlT25lUHJlZmVyZW5jZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgZXhpc3RzCiAgICBteSAlVXNlciA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRQYXJhbXtVc2VySUR9ICk7CiAgICBpZiAoICElVXNlciApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggdXNlciAnJFBhcmFte1VzZXJJRH0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWxsIG5ldyBhcGkgKDIuNC44IGFuZCBoaWdoZXIpCiAgICBpZiAoICRTZWxmLT57ICRVc2Vye1NvdXJjZX0gfS0+Y2FuKCdEZWxldGVPbmVQcmVmZXJlbmNlJykgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57ICRVc2Vye1NvdXJjZX0gfS0+RGVsZXRlT25lUHJlZmVyZW5jZSglUGFyYW0pOwogICAgfQoKICAgICMgY2FsbCBvbGQgYXBpCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPkRlbGV0ZU9uZVByZWZlcmVuY2UoJVBhcmFtKTsKfQoKc3ViIERFU1RST1kgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIGV4ZWN1dGUgYWxsIHRyYW5zYWN0aW9uIGV2ZW50cwogICAgJFNlbGYtPkV2ZW50SGFuZGxlclRyYW5zYWN0aW9uKCk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Location="Kernel/Config/Files/XML/CustomerMultitenancy.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdG9ib19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8U2V0dGluZyBOYW1lPSJNdWx0aXRlbmFuY3kiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlcyB0aGUgbXVsdGl0ZW5hbmN5IGZ1bmN0aW9uIGZvciBjdXN0b21lciBhbmQgY3VzdG9tZXIgdXNlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlBlcm1pc3Npb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJNdWx0aXRlbmFuY3k6OlBlcm1pc3Npb25Hcm91cCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TcGVjaWZpZXMgdGhlIGdyb3VwIHRoYXQgY2FuIHNldCBtdWx0aXRlbmFuY3kgZm9yIGN1c3RvbWVyLiBNdWx0aXRlbmFuY3kgZG9lcyBub3QgYXBwbHkgdG8gbWVtYmVycyBvZiB0aGlzIGdyb3VwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6UGVybWlzc2lvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPmFkbWluPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb3RvYm9fY29uZmlnPgo=</File>
        <File Location="Kernel/Language/de_CustomerMultitenancy.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0N1c3RvbWVyTXVsdGl0ZW5hbmN5OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5DdXN0b21lckNvbXBhbnkKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbWl0cyB0aGUgYWNjZXNzIG9mIGN1c3RvbWVyIGRhdGEgdG8gY2VydGFpbiBncm91cHMgKG11bHRpdGVuYW5jeSkuIFdpdGhvdXQgc2VsZWN0aW9uLCBjdXN0b21lciBkYXRhIGlzIHZpc2libGUgdG8gYWxsIGFnZW50cy4nfSA9CiAgICAgICAgJyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIG11bHRpdGVuYW5jeSBmdW5jdGlvbiBmb3IgY3VzdG9tZXIgYW5kIGN1c3RvbWVyIHVzZXIuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3BlY2lmaWVzIHRoZSBncm91cCB0aGF0IGNhbiBzZXQgbXVsdGl0ZW5hbmN5IGZvciBjdXN0b21lci4gTXVsdGl0ZW5hbmN5IGRvZXMgbm90IGFwcGx5IHRvIG1lbWJlcnMgb2YgdGhpcyBncm91cC4nfSA9CiAgICAgICAgJyc7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgKTsKCn0KCjE7Cg==</File>
        <File Location="doc/en/CustomerMultitenancy.pdf" Permission="644" Encode="Base64">JVBERi0xLjUKJeTw7fgKNCAwIG9iago8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9JbWFnZS9XaWR0aCA4MjgvSGVpZ2h0IDI1My9Db2xvclNwYWNlL0RldmljZUdyYXkvQml0c1BlckNvbXBvbmVudAo4L0RlY29kZVBhcm1zPDwvQml0c1BlckNvbXBvbmVudCA4L0NvbG9ycyAxL0NvbHVtbnMgODI4L1ByZWRpY3RvciAyPj4vRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aAoyNDQzPj4Kc3RyZWFtCnja7d2LddpYAgZgUkGYCqKtIGwFZisIqWCYCsJUsGwFw1QwuIJlKli5gpUrGKhgTQVZJ465AoORhB7X6PvOmXMSGzsaSf/VfWswAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgF5LktEwSR7/kC3WNf3K8TSp/LOr5cN1nufZ5PxnsodsnTV5EE9XJh2s19mDW/+yUzke34S/bcf1XLflz5f89P34Gq/qMP1Y8JPb1WrV1FHkr8wmS9NMBKpdzcnk0+FlS+q4bef/vOzn70dXeLbTmxIf3i4WjZQfk38ffGGTLlNJKP/wPvZw+HVRw69+eH/hL/jH9V3P0X/LfX47XzRwFNmRZ99muVyLQwnT+YejX//XvIb201+X/oY6jiK2ouo/ZX/iblL/o+fr8S/fzqXn0uTEkp1fF7JTX+vzfHakp/BlnJ+uev+yrOEfWH+48Bf8PZOdRsKz+nTyW7/P9bud7SGYfzn9zc2ojhP4okVatrYyHshOI+F57Si205V0vH72lq88FDaTeq7V7LeLojN5kJ06y7J8bf2PV77559Sj5xWnuo/vBoOHbL2q69wlk+GJ7+z+/bv0VL3iKsccQnZuT7csRsPkoGS7ndZ8HMl08PhUTz40WnZeZX1t+bK+u02ztMUh5q919kq8yey83gGfjKd7rdGmuutHyXj8saH27lVG58XQdpND2LJTJTvfPrr42E7b78jg+OD3mZwcK2rSgzHLu2X7pYzsFHiS5GfONDtOnEynTdcSrzE6d/O0g6OQnSJhyIWn8Xv5cLBPeM5FZzNNOzkM2Sn0IMnNfnvXeFV+NnsvPMXbOp3dubJTKDtJtrudPzffIk2WN8Jz2t4swPtpZ32RslOsARNqba2cqNk8/+jR23aq9Tm4nXU3BiY7xbIT5l23M8titMq3eq5wInv19uAfMdTXZKfEfbmbFLhJ2q/U17OO6yrkas9dP5Blp2B2Qm/Bu3aOcLjKNXqucUphNfk1ix3XZWWnYHbC7Kl3bR1jfpb1FS4DqdYQ/C2eZmBfsxOuQbzZyVfbtqO14DyeknWosXU+5aKv2QlRiDc7e+H5cyI5e31s3VdjZSfi7OwNoOtr21sCHUH3iewUvCcXXzrITr5DVnfB3mMngqJEdsr2s22HbR5nrr/Agyf32IlhroXslB3fabf8zzWOPXjCYyeKAS/ZKZadUOS13L2Tq7X1/cGTK0eiuFtlp9gdGW7hzy2vTgwzH/s+JzRcg00ykJ03k50wnP1Ty7WF3K4kP/V7Zk4oReIYKZadQtkJN3D7rY5wy/R7PnWoNkcyvU92Sq59a//+DVWVfo+PhqkgkWziIDtFshM+3UWRF/bi73WlLXTXR7JP7dee1gfCXqkFLkSur6uLIiYMy/a60vY1rp6C3LDF39b9rDyfH+ocLsJodic17bDurs89baHJGcu+W8/lb+/2AXuuAZztstnb9bibDp5dAXeVbxEr3dyJZpzrqULQv62PfywtO1NmJJNpfmOJjob2w3h6jxs84SS8i+aYksd6QJr28GJMHgvxg1esTcf7VenR/hZ6tW/lXlBob/V4asGuq9PcpHgfRSc18PKqko2zPi8f/Rpbc4cX1df4ouO+2TsHlp/HfHWOR6fDVc/qK+U3mKCTq3PcZr7s6tB2w4KyIztvMTuPd+60o0fPbl5Duwvv4rw679yq8Xl4f+4TXb0DtJPNEuIS+hpl5+31FXzXzayYMC7Y2xtH8RG3vV3CYwqPCkuk2RmPs2zdw6sxHI8O3+w6PXin8bF36HbRVJWdKOtsT9O1ejhu8L0g287OPEaGo/F4f8S0i+mg6mwxFh/Pc3R7F57nOkCB7QeG01n++dPBCjSV/Vx2Ilm9kxt169kahOH/fvxhkxQq+PPvkmq/1qaPOsbxnb6ufQuXolihMVqG+dTtD1AaG41xTo411wWLsfy+6q2XfObkxDinT3aKBiG3r3rryzfNBY2x/JCdwg+R0NnVdqsjLLru8Rzi+Na+yU7xCthu6XPbe4Na+7ZXdH1eyc5by064ei2fLGuu9x6+sVRcZad4dsLyzZar3LtJqn3e6yOchU0iO28tO62/J/6HsJdcr5cbx7u3oeyUuXqtNldDlS2Wmn4nQqsvkh4T2SmRnY6mxoTNsHs9/X43FSSWcXzZqZSdVmcw7bLT83dd7x77kcwfk51K2Wm1r3j3z/b7HSK7eVSxFCHtZOfbuph0cVH/6nQ6yi78FW81O8/vCux1L9v3e2Dx7UREs4dtK9l5auxetL/Z0wucNuO6ntaVpuV2tRRgtPrWwXc/fuh5dgbD6fAhjWUJQivZee4gueDiP28lUNvASqXshA0NWm60D0fjQbYaEJU2srN76V/lOZShe7KuZmKl7OjwouXshP02KzZ2c1OY62poVMrO7n/EduK0nZ1q4UmysGizy+yE8f2+v62dtrIThuMrhSe/6qy2jTaqZCeM7/e8s5jWsrO3WW3p2y6/2rm+o6yQnTAVtG+bO9BZdnJ9u+XDk2vr1NnOqJCd0FPQ+4EWWsvOXq2tXGPhaTis7hpblezkNg31Bhhay06+yfJYbE+KVnnyr5iu9+VRpbOz7Phl1/Q0O3tdZY8337xYwb33iul6W+gls9NMowvZKdtseXz0zM7fscl8f2v1Wju3SmVn/0g8dmg1O4fhGdzNX79nh7PZ++aiUyI7yWRy0+CBIDulwzO4W5yeoTWaHb7Oo+Y7NmTn9rXGV5KMDl9o1fNFNHSQnf02w1PtZ7lKj5b00xefnNUbnQIvSDzBbGbaz85guLp58bVtmmb5l+CMRqPJy5fe1P969qrZER26yM7BIGkuGtngIRsMR0ffFfWtdjep/YatmB3RoaPsHPY6F9PEoVXLTjRLFokpOy2NlQ/nX0r+xP20iYWCVbJTdFiKfthtttjafnHjxccI7tewQ2thtzMPHY60QNqc3jidF624bReLpu7X7GOpj29X87W7hb061NNMs82k1R0UiqWnweQcGW56xSZd2SyAl2aTWjdvKlpzm/58rp2zWDV6UMP56OZceB8LlPU6yzxxiOuJN5l8Oh2c5coNC6fjMx4fKfvvszQVHDjf8BiOH/97+nM6yB5SpwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDL/B9n0iy4KZW5kc3RyZWFtCmVuZG9iago1IDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlUkdCL1NNYXNrIDQgMCBSL1R5cGUvWE9iamVjdC9TdWJ0eXBlL0ltYWdlL1dpZHRoIDgyOC9IZWlnaHQgMjUzL0JpdHNQZXJDb21wb25lbnQKOC9EZWNvZGVQYXJtczw8L0JpdHNQZXJDb21wb25lbnQgOC9Db2xvcnMgMy9Db2x1bW5zIDgyOC9QcmVkaWN0b3IgMTU+Pi9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoCjE4NDg+PgpzdHJlYW0KeNrt3Gtu2zoQgNG48JK6/xVkT6qBAEZao7FEkeLM8Bz0133gOpRIfqJyfdu27QMAgNh+GQIAANEGAIBoAwAQbQAAiDYAAEQbAIBoAwBAtAEAINoAAEQbAACiDQBAtAEAINoAABBtAACiDQAA0QYAgGgDABBtAACINgAARBsAgGgDAEC0AQCINgAARBsAAKINAEC0AQAg2gAAEG0AAKINAADRBgAg2gAAEG0AAIg2AADRBgCAaAMAQLQBAIg2AABEGwAAog0AQLQBACDaAABEGwAAog0AANEGACDaAAAQbQAAiDYAANEGAIBoAwAQbQAAiDYAAEQbAIBoAwBAtAEAINoAAEQbAACiDQAA0QYAINoAABBtAACiDQAA0QYAgGgDABBtAACINgAARBsAgGgDAEC0AQCINgAARBsAAKINAEC0AQAg2gAAEG0AAKINAADRBgCAaAMAEG0AAIg2AADRBgCAaAMAQLQBABRzNwSF3W6/f/4Htu1zzR88rKpXBNPHzW8Zp8P9sG2bUVh5wa034fMWmyUYc8cUsJ7zAydtqy+1j3+30jzPXmzAcxYvniANq5mhK8/vtKWf1TLFSg0lbzxz4eTWYADrcdJmhTUmQOhJ7dzIAPLFSVvWRyjjAHgew64h2jDxUvI0CboNO4how2RDeoJuM4yINubNsWKJoHjAYmg1cwog2lBsum34JxedwDWrmW5LmQS+XHeFXJMC4y6EsWWRBWfQrd6w0Jl0HTcIg5mLr/yoOSHNQyCF52Ll4Kd5kff96qKNlMVm7gGpK2TP6qcz+oav8UzE77QVKTa/DgVU6g+aN4KGMXTMKdq4qNjkGqDbODmGuk20MXbOyDXAakmvDcKoijY8jAJY33Kkm24TbfSfKlY0AEZsGbpNtNFtknglCugMdJtoI0GxGS4AdLBow3wDoPI+snMrcdgm2mifGIoNgIDbE6LNlFBsAAxhTxFtmF0AlNpZHLaJNkwGAJwIINpMKgDotMU4XxBt7JoGig0AEG0A5H6y5TyHbaKNDhPAMRsAQboN0YYpBEACDttEGwC0JIIn276Mp2jD8woAINo88QB4suWqrcd1EW0AcKwMPNmyrLshyPWsA1ByaXKQA285aQv3EImdDFa7mfevjSadBU20ARYyuHoKPFrt64/JmIJzh+m8HhUH7Lo0/6xWLhZVl6DmW92ODqINJDWEvtWvyTVzELweBcBTE8ZZtAGAkgDRlotf+ACsbBZPEG0AVE5D6QaiLQrn/4C16226GXBEGwAkoNsQbQDQ6OIXBbqNZfmeNmjZKrzOZoX7fP+t/voF1KM/pDmIaAN2PdnbM3Crv3Zbl/+iboP/8XoUGjcV72hwq5/3CK/nH5cARFvu5RJXDRa5mY/WmwmIaAOAmXnk1A1E2/yHSIMA0HHBdNiGaAMAD7og2gBAt8Xj5FK0AcCobtMZiDY84gAAog0ASMXbatHmjgfAyjmftz2iDXMGABBtAMB4zjtFGwCc5R0Fog0PKwBAFHdDIOmgr9djj6Q3dpkfBOxNNThpc/fD2ND5yPn2qswPYlHFMIo2Os+Nx18xYShZbBlzR5xhb7I3BeT1qGca4ECxPf6uyYu9iSmctAEhYsiHBBBtgCRSbG4bEG0AJTZgZQCINoDoebT/I/mNH3cLiDYgvf1BE2onVmyL3HUg2gASd5uDnMhcHfjOV34Ak7fkWSclR4PAiY5ig7mctAGdHY2bKXuzYgueazsvkOvCUpy0AUO67VAVXXnk1tCIyiBsTINoA7i62y5It7YgUGxhW82lQbQBTOu2QenWfH4jC86P4bi7y0VBtAFM7rbviXBmbz7ZGbIAEG2AbmsMr7ch1etASLEFv6kMAqINYNQW2yWnrnlJpwkUGwTkKz8Ae+1fH1ITuItAtAF23E8fDz0NbbweBSaEkf8VERcIjnLSBjaSOUMXZ/Rcx8iD4IANnpy0AZNDYeKpmxoQkZDIbds2owDvp8pLWNhURo+wJih/FVwXEG2AaNAEQDVejwKBPKOqb71pNUC0AYytt7aGU2mAaAOY33AAC/KVHwAAog0AANEGACDaAAAQbQAAiDYAANEGAIBoAwBAtAEAiDYAAEQbAIBoAwBAtAEAINoAAEQbAACiDQAA0QYAINoAABBtAACINgAA0QYAgGgDABBtAACINgAARBsAgGgDAEC0AQAg2gAARBsAAKINAEC0AQAg2gAAEG0AAKINAADRBgCAaAMAEG0AAIg2AABEGwCAaAMAQLQBAIg2AABEGwAAog0AQLQBACDaAAAQbQAAog0AANEGACDaAAAQbQAAiDYAANEGAIBoAwBAtAEAiDYAAEQbAACiDQBAtAEAINoAAEQbAACiDQAA0QYAINoAABBtAACINgAA0QYAgGgDABBtAACINgAARBsAgGgDAEC0AQAg2gAARBsAAKINAADRBgAg2gAAEG0AAKINAIBI/gCkqoRBCmVuZHN0cmVhbQplbmRvYmoKOCAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDMxNz4+CnN0cmVhbQp42nVRzU7DMAy+8xR+gXq2EyexNPWA+BHcEL0hDu22cmFCO/H6OGnHkAClluvE/n4SOAED+WLI4h/B7ujVvcfbv/kEaJYCfHrVGcakcISYyrl4h2d4+mOKraBTBGuMiWrBApIMxYdzxqSpCtg8HAluPhzkeoDNHYNEzCUzDHMDUYOOOaCKwLB/2RIJE09KPHoe971uiSt4isR8IDYjynFp0akP29pFHMN3d+1KiWgOLTMT8T72r8NjE8AZhTU2AarukqGTjMV0FTBaH1cYJ2Bq/33nTA2y6qq1lHpy2LUQmT1Pa54bWRcycr1KjoKk5QJ/9lSFh8PZl0Nm84YiRBPXWEkoWvXfd+xzNBMpXdwwmqpUN4XQontRwuBPurCRX5WlFX5R7KSzuNLx545rX064Qd8Ovx796eoLlWuHPQplbmRzdHJlYW0KZW5kb2JqCjEyIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMzQ+PgpzdHJlYW0KeNpTKFQwVDAAQkMFcyMgMlBIzgXy3IE4nSAdyAUAh+oMRwplbmRzdHJlYW0KZW5kb2JqCjMwIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggODU0Pj4Kc3RyZWFtCnja7ZnNbtswDMfvewq9gDVS1BeBwIcBW4HduuU27JDG9i7robvs9UfJjj/UBkk677IabWLFKURS5k9/ilVPChXID6pg5BfU8VE+3cnrx7Prh716/wkVWk3WG7XvFLHRhp2qQtABWO2bbzsAgwDRAAQP8NACEE7jB6y/7z+rj3sF2kCUdwpW3m306svdCzd/jXZZszc+mQVVYWBNJvYWsT3WFSL5ZDzWVZRb2AIeUK4AyAxoSa5e7jX9WGJF70dnliFOpiRQHZ+Za9cJQlzQxrrTrE1dsbe7tEiAja1514dwaGo3RORtXZmQvmCuDQ53OQI+uCFGuW/Gvx6uOW5Zon7Gq4I2ZEoHO3hl2DSbW7KHrZWpkbQZIwdjuuExuuQl2FjHPkqUaKCjKZpj2z+99FRdfDGYuUEO2gZaGBRjdWWZh5ED2EZva3QpaRIBjnCZprP8P+2MK3BgnEbnSxISrSYK9nDwtR0ISHuZZPzpI4XawLjVXQYBtI+xsHh2qTY8NijOQrHI2X+DBQWNiCUWrWBBlBRBigmkdtK8rIUBjLVZ5zMgSSGS3jdZNc0gp0k7yNcV7XpVtImho8x84mqS1otLglb89aW/G0BvAYJFhv41BGVp6FiD4angrDjEoTTM+33Tl3x8XQlL2ePFnJ1Zs5oLoDna0d15PedzWQ4LCRtL11SaCrY36dfc1qZf2+gWdCNxma0zEFbUr2g0E5dANKN+TQecfFzrj6PLs15G43os5hY3LLbRLVhQwDJnO1pX0Qisji6ciBAPA5u+WzRmf+vzqSbsBnGbnf6Lvk3fBYEDp9NQxoX80AyZN0B8rzhnKrlSJZ0t3ezsiiJJ6HXEsenRzUWSYLYUs96OMZxf6RiIp8NeqmtTNyStR24Q4cWe1sIfY7XHwp8rMmrbO/5b/i2X+TBP/XX4p6gDTeVyxSnHRQgBoetzNzEvAngZVdDBhmLK9phZWhFXl5R1an4ucA3FziXb01jfnglhbiOSZihtbJBto9fgi5q8K/O1wGG9ypZku/C2pCIXtkBCRdNM+psbMLeJ00jGzMwGxjb6GzDmGXuGi+H6pDSxMPQ7KZb3TuTFqkeZKk4ff6qv6v4lVXJiRU6XPgQd4+l/hfZZGX3/7g8SYX9kCmVuZHN0cmVhbQplbmRvYmoKMzMgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAxMTA+PgpzdHJlYW0KeNpTKFQwVDAAQkMFcyMgMlBIzgXy3IE4HSddqKBnbGlhqlAO5OmamZnqmRubKOQqmJhZILg5CsEKgQpOIQr6boYKlnqWZkZmCiFpYA3m5noWFhYKISnRNgaGJsYgbBcb4qXgGgK3IZALAFfEH9UKZW5kc3RyZWFtCmVuZG9iagozNiAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDI3OD4+CnN0cmVhbQp42mVQu27DMAzc+xX8AStHitYDMDwUfaDdgnorOthJ3KVGkam/X0qJk6CFJZzOuiPFoyMxwT6mKLZAu8XYs+3PC94PtHliyi4HCTTMJCk5UTV0mj0N+/cOEAZPLXg0HPe9dmCrx0HBfADnDEQ9Sdqp911RgdVXddudVCEAs6/IDPBeITL2jcRsLcZcyxahlWDUc99YrWoqnQuXVG4Ou7pFZsPpjHP/MbzS40BHcj6nln5sQlEXEWkhDWklX/RG20sCllJOzsbxuaYVUAgLsVcXlJr6o2S3eVlAD9833r9427kJoXXR67n3hZ66/8u9GGJ0KaVr5khiwVps0wHwfD1PXGfVoM5HNW+1WCRrBOuDtne/5QpymgplbmRzdHJlYW0KZW5kb2JqCjM5IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMjQzPj4Kc3RyZWFtCnjabVDLTsQwDLzzFf6BhrHzlqockACJ24reEId223JhD3vi93HSbUECJdbY8fiRoSsxQQ9TFL2g80WjZ7WPAx8Gun9iyiYHCTSs+ijJuGxpmN96QBg8efCoOM7F9WDtxMGBeQHnDES3UfxUbF9ZYGcb2/cbKwRgtQ2ZAZ4dRMbSScw6YsytbSVqC0bzS6e9WlGdXGNJNbOcm4msitMN1/I+vNDjQFcyNidPX/UbzkREupALaQ8+6ZVOfzT4XdWF4E207lZ3hFvlP2p1IUaTUtr04mVuuzj2xknU/CEjkqhWqsS0AJZ//In39feFTnff43JjZwplbmRzdHJlYW0KZW5kb2JqCjQyIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggOTQ2Pj4Kc3RyZWFtCnjalVe9jtswDN77FHqBuPqXBRgeCrQFuh2arejgJM4tveGmvn5JSpTpxLm4dzFsSeTHf0pS78ooDf9GJQs/rc5vMPoOz+vd+111OUen/sLokDsfg3pTPvY8+KN+qhf15ag+fzMqdznaqI5X5a3rvEvqYFPX56COl1+D1tZoHTT8ea2nqPVp1trB3JTH38cfBGF853y0iAGf2XqAcF02pkL0VusUkY1Yvh7XGkbb2ZhYxTpa6SgEuBQ6E6M6GB27yDr2RaeTKfpOGXQOi774XZSoOjth9qFBhtSl3ldM4DMOHu+0mcx4cDoO2mRAvMIMCDGhH91Qhi6NVsOymSshzYYTPmOGBYiYOc9jGCSYSwCYR2sqwSmgAF7V14IyGcSFJ+FKGhYenMXV6YJzRVVUDMf4jZgxSollhnGQFmUWjNEzgS/QIEYYg0CLCntZG9Eyi+y+ArpY+FB74C32rrRnjoWyzrDfTa6eIEsv44EmQKS1V4o2ZJgxXQ6c0FMcmYXAErkylRlH8SUC1Byi54YCS3QyrDBj93ii+h+JiX2JHgs/XzjNyhsiz3mzEK0ckNxOBxxiRLlQvAAAjENTcm0/B6Smk7DzQVDIdhwRbCrANxVDNHsqpoTgPxyJxDUreQadBmBbEecqYv9i3VE616qySfglWZyww4JvP/Q20T4o5RICF53oJ7haCoIF7zTcbmZQEc+uL4ox8JO8si2GaAssGBR98cwuM87uybgml5OAtJLMaCo93LkaD/cvdCRaQq7VK9jbAAmrt8JOAjKHWRf4Gce6Wfg0alg4WAeIVQRzxDhEOQqnkpJh5d8dnbJaY4QSHOHmKwG3TkxO/ObHZ3tD1Y96nuyRqcvO1YpBszdjlf3TWGUvNpoy2uMDIlzvFhKQc4qbb5lttucgd5V5QSh52DoelXtmt1GuE5BIpX1GhmHRlJY2zF6Dhr2lDlGZkKGvWhLDRfhySQAEbb265SjR+bZn07f1frNIuEegY0zdsOUuJ3qCvUu2xQEPM+n2GGVjrq0FzSIF708sTQHuIqQAcZ7n5cQA24nngMT+rmPp2xAQwJ5cRDCLbDf5aN1VAJOWq54qdeG9kaTC6ZO6JriDtj06jcIP3yXaRCXPWUXb1WGBm2hb3ezdDzwhGwMaS/uQaFbEBsnC2z1btzqDTuaDDVa2fyRupdraf6PRccJTO3q/XixGiMvQsgiuCOIy43If6lUhhi453+4KdfjoQgN3CaRKcJ/p+5rw83wr4eXTP3f6+yEKZW5kc3RyZWFtCmVuZG9iago0NSAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDI2Nj4+CnN0cmVhbQp42m2RPW7DMAyF956CF5BK6ocSAUNDgbZAt6Deig52Ymdphky9finJDlK0sAWK9ntP5me4AgHqRZCc3gjHi3avus63+jTC4wuBWGHHMK760GUbxMN4+hgQHSHNEWnSOp1KGJA0iTgg0YIkgphCl8S5+KGqkIJv6jh0FTPi6lslQqRTQOemYlwSPWKSFluFGkHY9sVoVjPVk2vvcn2zHNtybtU6b3Utn+MbPI9wBeslR/iuYwSbMMEFAue9+YJ3OPxhcO8yzNEmHzbfre3Of2gZTsnmnDuv/Vt8FMsKEe8w+qUPJPwLjsgGYpurGI6hWnIxedM0BthwN7Y9ou/b7+CdwD7T4eEHBcJyZAplbmRzdHJlYW0KZW5kb2JqCjQ4IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggNDg0Pj4Kc3RyZWFtCnjatZQ9b9swEIb3/gr+AbF3vOMXEHAo0AbollZb0cGW5CzNkC79+31JUUksJ0AGxzZNH0Xfx8OXZx4NG8KbTXT4kJkeYN1i3F/Mj8bmHMT8gzVkq8GbB6MhbcYf89PcmS+j+fyNTbY5uGDGk1EnViWawUWbsjfj/OuGyDGRJ7yU6BCIjguRYO2Qy+/xe3PBakWDqz6YLWWBC7GZubs4LmVgwo95KYopufbXr+N5psFZF+KWarfOcn0RSIhsSmzgONiwBeLCNcCixflmP+cbtaCwfFMz7xUkogmlef+8FrXPvVJ47Kk+QbYMXITkBN8S2Py4fWXx7/0rSaNIjuvzljAvMzl3wjxdhLlCOBxC8HEXkzQVUOCcCzuYJyEOSswL8YQBbeEZsU/7lFoAeSEYlONwDJtjHCvn9bgdNRvqobYO8q6WO7Wxlnxc51muTNhJtpEuCM8fQjhgn+5i4po0mVeykFIluZkSG5oG+8DvAhyizdovo1O9MiyhaL3GPazlQ2B5myuss5j1lrFgqDRNuqoTCBalwg4rtqrHwwytbHcY8FalSiiDVHsug1ayE3rNRru640b7PaRFvI2Z3ySNXiU5+d6rAjaLPjWrbr7VWWszE4d9Ea01pY77RPsYd5/+Ay4jSNQKZW5kc3RyZWFtCmVuZG9iago1MSAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDI4Mj4+CnN0cmVhbQp42m2Rv07EMAzGd57CL9Bg57+lKgMSILGd6IYY2mt7CzfcxOtjJ20BgdrIdfz5S/0L3IAA5SFIVl6E81WyZ1mXIz4McP9EwIajjTCssmmz8exgmN96REtIU0AaJY5z8T2SOFH0SLQgMSMm3yRhKq5XFZJ3VR36pooRcXU1EiHS7NHasXQ2sRwxcrVVoVgQ1u/SiVdt0pM1t1kry7kua1eJ0xbX8j68wOMANzCOc4BPHcObhAmu4GPekw94hdMfBj+7uhiDSc5vfUfaOv+h1cWUTM658aKV6r84ZJOdlL8puqXNw/EXG+aNAy2zjlO6GAQHTqScihY29gdNv3dIr6XdJ7dbUPS6bw/1cQdq0lFz3IntDE53X6SgfbwKZW5kc3RyZWFtCmVuZG9iago1OCAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDIyMzg+PgpzdHJlYW0KeNrlW0tvIzcSvudX9B8Ql8Vi8QEYOiyQHWBv2fgW5CDLUi4zh8ll//5W8dXsh8dSW5YSrGfaEtlkPT5WF4tfw8P3AQbN/2Dwhv/r4fiNW1/4+mPx+X1QMToc/sutXVTW0fBtsC7Uxtfh1+GX4Z/Pwz/+BUNU0Rk3PJ8Ha1BZ9MPOeBUiDc+vvz1pbUBr0vxjtT44rV9OWiP3HeL+9+d/JxFgFVpnRMYOeDqqCFCmy3CZfoh5GkKa9vPz1EpnlHG+mllaEzs7JcnQYFmZdspVRZAViMIjia3FPuxc3LWp5JXnzzyXSINz+52B+KTh8KoBTxrgxD1GZwyAMecxGk58odfGnDVE/u5smafPWMbDAWS2SKoyZTa6Ku+MfN9rEL0vlMeLVmfzPNGT5mZhVYjF0kr9PDgJksEsLH3nSbZoi1HDqxU79zu0xFpt2MN4V4QGbulz7sleN48DX3r0rKqp991BxoiyEhhVnMVierKxWZzsTyIEWF3ggXw3FBXZ5AZi9aVOl2m8Ls0a9Pvcf6rKu5WTtee4AlCRulDu4G5IVdRZ/bjSNq1u0bVn+LJlHidwaIPUAertZVqONMZIm5hWgl72NVzEXQpJNY/N6+j8E6s85YhN8ZRmsmlVzQsVK1OAJfA8FezzMtdJGco9AH8/viY9Cck0eUSyRHgSIvHO9hp4GhdwjFe28VDny8jiiwitqOUJVZx4mLBzFV27VL2ykOz5CDpaL/EY9iloCsIt1OglLdHqE5z6w37nyzxM651slvVj8zMS+11OCzB96NGGaZRut2Qq1s+euKTojZxRxi/WKxtnc/Q2U8e8lnvYppI2miPFbGOObC6HHAWfsjjHSez9rOue5neRm4X7SRLMlx0f27U1bRky2HkODlT8H5/4Lkem8Yxii8z8GAiichc7HLIkbTOS8kQWo95/aIuiaSoMdqu4lRyw7rc8mtDlR9bQQw66PYoNijee64CzpBpq0pmCLL6k69R5uZz441zbdicJ65K+yr7fqhUFvClr3umRf6OD4T9fVjr//GOlAmBthkAFXXZ/OJ3yU3Q6LtTcQJ0UDeRmOnl/LIDlRN2yYtkaZEluZkuCtrkerDJoF67fHoJRrXEqeJrpTmVCSSA1Kvs8P7MjSe3LMfYFdeBi0xR5ixJlkbiMjX15Qvpp1Lq+EFVKSwIiYVn2kF7X9PGaoaXvZg/pjXVCcqQ+nLJ7iEiLY4KtO0tKBxOXWilmSy1V7ewAgQrEeiKwsW3jP9yWeVvpC5njqS9iakxw2NHkd4nFaSfHYj337FBh4NOJRVJc7skB6PvAw6JEE4OWhs2aPIajWo4VHhXJ1smtr9wSESxD81dXbgA/7mi6DhyO/W1tlI/8k+aPvVZSg4+jTNBUBo5Kx74jix1bX6vWsUt3MnWn9cgt5Am6TckfOnl4/L/x88xHwhoSOSK6gODlJ0k28tFFjlExRIkcqwLEayOHLWPnTEGUbWbvTYKUyp0Gae3IkLbbfH2dtFE54oPuKI1x6TRJqwA4gS4BVeYmzK5CK6PQgXD5M/gW06CVT7sGm6P4NJ2mT3rqXkJD4KzvbM36lu/6mvVxuVFukUtydyba8SaNXDJZoR/CUo1tV9IxNtcUyB7IETpTYeGDYtEo4xdicX37nEz0HAqLicbzxYW94zrQYT6qE8NgjxkKx7nfveZ7tW1GaDLO9deIfP3VR8N1fnKgK5QyauYovbH6F9mw1GKiAnBLVLZ5mJ6CdLk8tO+oXvo+SEARyKJIrYiVBiMuVrg0kG+xXjd1u6l1kkhraHIYwKuwBXdYXotK49yCtcW9TmrgDBnmUk83xY44Yvxch4l3CpiGG++i3oYuYCjGzwuYppYLeq/9Lby2sowOO7drz2q6ZndjmBtA52V2wpf8KVnMZfJLW/7Opx0e/26aBD6+eXQLV09bXF1Kd7zlcrkxk+5itlkeP1sysWxC0paMLJ/Glo2J75EbrdkApkG2gvf9FTQJsgWiyfuahrz0YrELe1vqiLxv1JbYi2UHSf4cZG69a1Nvbcm4+XpdsE5WjoLOL3zwW9dqE5LOci0rYRlJOec6INfccufsPP+/KBTbFjiRvtU9wJJasB7lu47VLdhyqUw01+8P71tOghg9zvL2mF1tuXPKe3sryzeEFHivCO1aTPmSIlJcvR8/Ro5MiA/0xQApiLjmyyX2G+KjmXlYFBnkWACzIYqMNUrHW1leQYY8sGuuWk1GhSVqkoMkFUvukbS8PN8sJfnIR0x4jBeRlwaud+JDuzMaLunk7D9z+PDBh2ZLgWflbbWhexV49URggbNPe9Xdeb6rI0D4kthRuuW124fI+gljbR3HHbzJWL9+CmPNUEhFNNFdX1zT+OL6ApLaRqvQw1sktTdz6ji9Jl57R56GvstXp1GNr04vVBd89ew1bVV6i3fcZs5XXyp5+V7bXMNXT1xqfLXHp3lLdCR4yiu3+h6TdYJmw27CMzvguNFwd54ZcI1/5W13zr+CW/KvrS/Rh601koitS3cydaf1bjzzX9zPJc/cBcSPeWYZiBrvzzMDTnlmsAueGVzPM3OrADiBLgFlG88MuIFn7kB4HM9M8hI3us/gmaeiP4Vnnqq4Gc88A+Vynnk68a/PM88c/SSeeY7KnXlm4iMVEt2bZybrOZrwkUTz1ISbMc0zsZ9DNU+V3J1rJgrKoLk310xcikOEx3HNUwM+k2ueuXpjrnkq/VFc8xLNvx/XPPPhMVwzBa6AbOyBNOOGKnDJ51poXhSSdaOaaLkfc0tO8RFtrv8i5raG+4Ms50IZyG6xvDK+t7F8C+ccOMNHuxZb13LOlfF9mC+NNV55Ti6wv3K+D4oiw1s9H7k2RFHjfW9i+ZVsrUPlAOa6t3DOhfd9gBOogaus6334GOWMqMjGhcOPoJwpggId7k05O22Udv5jlPP3gZN/oPL3YY5YuW1/IFaab/0lmzNcoXDMOc7DIRT/4WzmOn756X8UwbtkCmVuZHN0cmVhbQplbmRvYmoKNjEgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAyMjA0Pj4Kc3RyZWFtCnja5RvLbhs58r5f0T8gLotvAoYOC+wG2Nvs+DbYgy21ckkOyWV+f6pIFslmtxMrLcsGJk6rxVe9SVaxqOnbBJPEP5i8wv9yOn3F0id8Ptf3vx6nf/4HpiiiU256vGClCsJEPT2e/3iQUoGEZyvhCd9P56N5kICQwBkJMEuIUUpvchf7fNQP1EuC0am3fci9nJPyotMbQEo4G6nU0/GgfEQUTzGBpY4IAmT6fjwgrDSIMFNZBWqZT+lR6oLv5/K+HP//+N/p34/Tt0noGOz0J7FhhJd++joZF7jwZfp9+m3Ju17wfqBC4V2ZOTPb8S0v6S1NJN6PSpV64j86HHJBQg1yBXpmCR0VFJZySxIOYMkSQ9YuBFxqsbfH11kfAViIJqFAGWW5oOhRkGVAE69nEEhAkR/XVD6YEuIm0ZWaG6VLRKQxqmugTzOrmNA08Mx1TxTV0kPk0hjCmfg9F60zMSRG7baBJbJ8BtCTSaQVO6PhWSRkFGg+FmtRUXkgD2bjTDZM+jLJdFDxACJaW6yeCEf2kz0SlUnOAYryHFEZyNZJJ8lCWHmpFqnqLLdoIGR77kZmLbr8mKI/7blHVk6Ga1jqMPOMYpDIoVSBSmo0g9Qe1BFolj3PRyVTGfvLVJ/HIMom1M6WC9mq03cRyYLAypBrKslMZwjhoTfXopuoE0VZxXU+JDjLEkEruoI5i4fmRSKxTL9qmolUIuq8qdSlSXmCrl2GXvhiK2R2sz4SyWV9kQKUXXz+79NG5ffPdeU9aKGDnw4KV6BoHS3B3ybsFmnNQetJ3YYi9tH4wpXLa2FpgcDSFyxZoQACFox3pQGENlp1FXo69c0+Ch/xXxpfawMIY52PDSYEVTo2pK3uhGBb6QtjbVWygyk7rCcsaRwg65D8konD09+GzwtuO2wS2SI6g0D1W9qS6NVZjhIxxGw51oZrLQcpRuZUkagRBrlXSaS2tFSRckUWaW32sSijlIMUzuJe2qDR0zBRqQhwIboktDI2yewqaWUpdEJ4/RwcfZ36Fh7xoBbwI5g8fFHzvfgGdgroDjhTfAOrRYihbBEa6qKwB6yl1iVkh8uz1snHkDqssZj6JBStuAVfOYQcBwwGdkLVSqDvNkpkHqGux3k0g3Gc8vigr+HQYXHIt3uS0pKPdcpycLgJuHNu47Jqcsky5o8mdf7oDeE6LtHGhcYpOrBpX1D8q0hYI1FRALiVTH6Nv2T+6XG5a1/BPPrePkBYQI04I4L1BbuVxwO67PQt8rOH6R10BSe8tyu6gGxD5scUm6F3spuZQgyaP9y7Ws5T60m99InauJcOebyDOu4puVc4ttYMdqif8zuNQ4i4EEpDHtaFR5AVEzXUklo73Pukup7rRWbRY08O4F5PcV55vM/0qdM9Zpj0wkY3kLw1w66cuLhr+BXY+cYTV2OXEcndJq7RQmpUNsggXFTdDLGR/H3znO2ObFidyI6rnZ9GC6i2yjOHV95q92y1vD5TK/XUbaVQabf6OQ62NX1z+68igYjbDGxMgE3jP6+YvuPWsqR1v+WzUQ5w533LN+hijBqKt9VVbNKh0UeMKzqs/qmLADqKgCv+MFLN955XGl1WWE0rJ4tzVpf1PdNqud3cbmrs4dvgLuLimvE47oXGZ3a871eJxtx697xCRH7cR/PO/oOdGZpiEvynRavOO1u/fplThe2y4NVLigm5nbwOa8h/zt/ZnyDcxLsyxYstGKx/LyVaJawKKyUmEc/9sr0WpAd2nzIzWn8E9RI11Eedtpy7tWrfbnNxWpjAnnK/HDSr295oXGHBhJGVrf732IQwdAdrRp72b0IevTq9hntj/ysEoeIKyy4HzBBTTneTjWu2+HT5TOIAdCBiHM+2C7tGZaHg76fmRlH9erbQ2H0LxnVqsk5IsCP9+9XvQOi4hjvfYDG8TkHNwF/WUKeVtfTXIZZE7wSdnwHiLu/kF40uWGGkfcHo+CyFo74PZnAL2m9ocEu472lwK+2MGklO3jUGt4D4awb38qYWndBUlYGHmyHgIwmFgb5Weo3gwD2Ajr9D18GZtfpAOVKDS6eqjmORofJ7zWrn9I8qx7fKRmFsiZRhnkvymJPJa2u5AVoVhEdJLHGn7HGXb5IXzjhumsOQoVbBCKiBieV8X8vblox7raPvlPtaJDO96lOuXm/mx5gw2sVsaGnXAr3k8NVDTfiXcZwAdQy7JlQpK5jyz36RQUylPrGbE6ota9wlemu+LyGuCcKaHU9iLYlT290rsA81Abk7m4cf6F+re2fzImwkuaIec1zRrFJctYoSNLVQszS1RjZwsqG7Vxbvo/K3zt51BvDj7B11BFz47p29i7BI3kU15u7Qc25osJAF14uMJKQ4bYfwrs/adcy/X9ZOS1wvtXmLtN0S9Jvk7ZYobpa4G4Ty+szdcuDHT90NjL5R7m6Uyp2TdxqskPXK3gfK3mk0GwmwJgxKHBz740M+DOGzHq/7FjouUfUEdTyJsurlsyMa9bKF1nELB70/XeKAKVnvaXGsuMDMMOlNR4HN1d9OkjCly3O1rTBNnd/kLEsbL2I9OLlyHr/PkRVnBxak748gDboWdgX2HQJIDpEXhOyIHwH9HefNqOv53iuUQ72FcMUKtbmVB9qQ/Y2DRINujOMg0ajssgxB4vl2wWFDp6yIygw4pQkpgulvF+cIrr9OTRHQK2JFYxGyWwaLdJ82rG7YxhJL/fCudxk6XDa+Zmjt1GpjAUjhKvXnm5dG92FgugddLxR3V3jL/eZtjn54tTWNWYSqaYxzfAuUa9o16XDlldQ0IN9MZmDMfL3Fmwl1Y7/+3riuItq82MrUrAP8nwTwREwfDxdL6m/RH5zDGAJdm3yPvhbzTfqNXw8cnPdtqsMlZ3x1MMJSRNF+VcD30+PSuJME6HcBZfLhSmEN3Rbmy9RnVuNI9m//+Atz81LgCmVuZHN0cmVhbQplbmRvYmoKNjQgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA2NTE+PgpzdHJlYW0KeNq1Vk1v2zAMve9X6A9EI/VBWUDhw4CtwG7dcht2SGK7l/bQXfb3R0qU7XwUy9qsqaJIJvkeqSfJ5sWgAf6gSY7/wRyeeXTP7fGsfzE2Z/LmN4822QaK5tkE6trgyXw3D+bT1nz8gibbTI7MdjLBeRt8MhuXbJej2Q4/7gAcAkTgvwCwI4D9COB5bpf7n9uvJQQG6wM5iRFtSsgRvM2IGiF0feaucwCHODt+3h7zJGcdpUZUR0dMVzCOOkshmg0CWVoxFZBEgsmsGSzkBioZ9EGISAbyrNr2nK7MioXkJZ41v9pLNInssdGey22RCwdM1PO3JzTf7i9M/nq8kAAnjKk+L+RxnMC5ifvDGcwN4ByxXTjBlLSQpYQ59w6ZA47MIZfGS90j1Dl+DkgBMHjAHdYmv8WX6HZ80eYYW3kcOJvyWXVuX6UF1WULOR9DQ+LE9xEw7nvPTHaD1mHoo5aHWCGTLz2yUHAIp+QKlF9tNcmPd1kISVFYaXMcmApa1vA7FIk6xfajzMqMsKGFnLuanEbzVH3bk+asq6oIYqUa0RmxFb+ihKEPd+oSmlgUYIFN/+o6G+ksApvywr9/Bx5LjHgY/GsaG/6HxjxajPEEey2yq9fxLXu1HIhlvzutvaBmukqw3XLU7lG8KqKwEYSRFr16xBO9eiyaS8tps0I/ti95curqw/E189lOlbHYvG0f1Ghrhc+If5EpQqyC3IRyeaR34POZXMIvtSsZKauaI+p2kppLYxwUWkuUmWebaGyllxOliWNX7zG5gIoqVf2C5Wk5afpNqc3YlDSfBxdX8NLm5Nvd5y7q7U78ZuDDfL3r8LU3Eb7+I19XlPhNpOuU4nR2rj58+ANG6vw4CmVuZHN0cmVhbQplbmRvYmoKNjcgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAyODQ+PgpzdHJlYW0KeNptkb9OxDAMxneewi/QYDt/LVUZkACJ7UQ3xNDetbdww028Pk7S9kCc2sh18312/AtcgQD1IYisL8LxotmrrvMenwZ4fCEQI4EDDIv+5GScWBhOHz0iE9LkkUaN4ym7HkkrUXBINCOJIEbXJH7Kti8qJGer2vdNFQLiYmskQqSTQ+YxdxxFW4xSyxahliCs37nTWtVUOpecU9mZj3UxLxqnNS75c3iD5wGuYKwkD99lDGciRriAC2lLvuAdDv8Y/HZ1IXgTrVt9e9qcd2h1IUaTUmq82vmmeh4WNtE51dxQ2rkNJeEPIJEVhs5SZspd8G61VNwqn3XZmGPfaKuFeEO0Im/SO1xt2Psw3y6lXoayXeltPA4PP6MQgA8KZW5kc3RyZWFtCmVuZG9iago3MiAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDU4Mj4+CnN0cmVhbQp42rVVu47bMBDs8xX8ATO7y+VKBAQXAZID0l3iLkhhn6xrcsVdk9/P8CHFlu0gj4vtNUVSmtnXiO7ZsSN82XWCH7mHJ8zuYI8X47PzKVlw3zHbJK8W3ZNT6+fJN/fZ3bt3O/f2A7vkk4m53eRUgtfQuY10vk/R7cYvA5EwUSR8lGhvRIcjUcDaPm2/7j4WCFYf1CRj4NIkACL4xNwgtAcEMMYxP1oee78799LEi3Wzm2125ucJiTLiiOI2TOatkWT/BEOPv4eY/ZyJlvR4RqAE6ID/YOw+3V1ZfHm8QgkXuav7hY4nsMlEfHy4oHkFOlEvna44cykYpWcz4j1yOQViVALXN31oY2EIJ7VGPMiTDyk1bJQzDhUe0ByOgIaltEU7hKHm9cDZ5hVNcEWJacodcsuFq9QIlbVr1OimjFPCUVg8ILVpwfPCOWMaUs5Y39c0rhdfrjAF8hbjim4JDTSwbapRS7+fo18SgcDKVq4zKoGn/irPZ3Iaj1vWoXoA/NcJVMxH4hVVCTTXMlvKLcOZjiTEYkut/zDUf1ORWPJd6NcqGv+Lisx3yitOvIW2IsPc3iUtpe2qstZ+XKtoyMoxXV48pYcO8adyMhSgc3E3wUKVl96Ul/yOvOoqCjfv/zqOE3K8o4rVTB/aOF0iSl9FCAnUFm3OFchg7bbstPAwi2jL1O7NEOVxLnvNgYx0HAtxGSd0oWqbT+06r8s69TggQupjOyAsooa6nBBteusoM0LpcZRZB0X0c7vVRKx57t/8AFwdnJsKZW5kc3RyZWFtCmVuZG9iagoxNDggMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA0OTU+PgpzdHJlYW0KeNpdlE+PmzAQxe98Ch+3qlZgA3YiRUiAQcoh/bPZVXsl4KSoG4MMOeTbF+Y5q2qRgvTDw8x7kxnCcq/3tp9Z+MMN7dHM7NzbzplpuLnWsJO59DbggnV9O3uie3ttxiAsD834rbkaFv4qDvrw++vPW9/+nRrbPRfDe/f89lpzyTpzRujrfTRMeN7r432azXVvzwPb7QLGwpcl8zS7O3vKu+FkvqzPvrvOuN5e2NNbeaQnx9s4vpursTOLgiyjdBza2qEz09i0xjX2YoJdtFwZ29XLlQXGdp/OkxSvnc7tn8ZReLKEL3eerSQikABxUAzagBKi2J+lRIk/k6AtSBGlPucGlIK2RDIHlUTKa9EgCaqINgJUE+U4W1IToXoKDzmqp/BQQGcKD0UFgocSWlJ40BoED9pHwkMFZSlU1zGRpHo8qkFUj3O4lTFIgRIQckqqx2N4kBLkIxXIR1LPeOLrUXWewq0sQAWIOsgldEoN8hWog1yhg5I6yLc4UxEIORUcbdFBBUc5OqjgKEeXFBwV6KCCoxKqFTxoaFFQXT3cwscymn4G+WMiHxPMK7LEa7wfRz7aT/CnARYCYuM8I8JAiRKEv0ZQA0SChEL/X37dkXWzPxa7vTm3bBqtP+3wum69NR9fiHEY17fo9w+8MA0MCmVuZHN0cmVhbQplbmRvYmoKMTQ5IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggNTI4Pj4Kc3RyZWFtCnjaXZTNbqMwFIX3PIWXHY0qsAE7kSIkwGGUxfx00kqdJQEng6YxyMAibz9wj1NVRQrSh6/tc06uHZYHfbDdxMJfrm+OZmLnzrbOjP3sGsNO5tLZgAvWds3kid7NtR6CsPxeDz/qq2Fh8fT67c/r16e5a/6NtW0ff5vL/Fa7x5fnikvWmjOqn2+DYcLzQR9v42SuB3vu2W4XMBYu07pxcjf2kLf9yXxZv/10rXGdvbCHl/JIX47zMLyZq7ETi4Iso+U45DV9a8ahboyr7cUEu2h5MrarlicLjG0/jScppp3Ozd/aUXmylC9vnq0kIpAAcVAM2oASotiPpUSJH5OgLUgRpX7NDSgFbYmkn1eAclBJpLwyTbQRoIool0TL0kTYL4XqAspSqC72IKgusXsK1VqDoFr7SqiuYiJJufCoAtEOnMORjEEKlICwiqQdeAydUoJ8pQL5SsqFJ34/yoX7lJZAiJCSLEAFiFLiEilJDfL77YkUMpOUGd9iTEUgZKbgKEdmCo5y5KLgqIAWBUelH4OjEh4UHGl4UHCkoUzB0f6eBDwurel7kN878t7BfE8GeYX5ceSrMc75pw4WAk5iykoI9JAoQSWIg/AvCkpHxPAlKhCciA3IV5J2kUCJ0KC1UkQclUkFQuXGd3D00eF6DNf74/36aGbnlsNMlwxdE+uJ7qx5v4eGflhn0e8/n1AiAAplbmRzdHJlYW0KZW5kb2JqCjE1MCAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDQ0OD4+CnN0cmVhbQp42l2Ty2rDMBBF9/4KLVtK8UuPFoIhcZoSSh80KWTr2JPU0MhGthf5+1q6Qxc12OZII90ZXU1cbtdb244i/nBdvaNRnFrbOBq6ydUkjnRubZRmomnrkSl860vVR3H5WvVv1YVEvHw5LD+e7/Z0eL46Kic3dO7+k87TT+Xuv/abVIuGTlixv/YkMubtencdRrps7akTi0UkRDwva4fRXcXNsumOdOvH3l1DrrVncfNV7sLIbur7H7qQHUUSFUXYLkWKddfQ0Fc1ucqeKVok81OIxWZ+iohs829eGiw7nurvyvnwdD2HJ4lOC0+ZBGUgE8isQA+gNegxkOK5JYjnVoFkDiqxJ9NToHkw0AaRMlCeIJIpRSRTjjkFUoFy6OXITGsQqxsQqzNBff55kqyAXWSGdY8g1mOCgkTWErVrJtbjXViPCacrWQ/qGqSgLjcgqGsmqOdwRaFak4A0sn4AwaMMeSqcZ4ZqNc5TwU0NPcMEPQVXNPQME25BDm81Ow0fNJw2TKhPwRWN+gwTclGoyLA6PDJ8s5C1wZ6z/f7K8t30l9d33l/j1ZNzcwuE9gzN5fugtfTXwX3X+1Xh/QU++fMgCmVuZHN0cmVhbQplbmRvYmoKMTUxIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggNDIyPj4Kc3RyZWFtCnjaXZNNi8IwEIbv/RU5uizSD5tkBSlo1aWH/dSFZW81Hd2CpiWtB//9tnkHDxto4UnyzjtJZsK8WBe27kX47hqzo14ca1s56pqrMyQOdKptECeiqk3P5P/mUrZBmL+U7Wt5IRH+vBX74uNxT9/PN0f51XWNmxZ9ea7N9Gu/jZWo6AjB/taSSJiL9e7W9XQp7LERi0UgRPg5xO96dxOTZdUc6GGce3MVudqexOQr3/mZ3bVtz3Qh24soyDIfLkaGpqmoa0tDrrQnChbRMDKx2A4jC8hW/9ZTlh2O5rd04/Y4H7ZHURpnntaeFCiZYS0BpVhjgk7NQNDNlqAtdKmnWYSdTIipJOgJpEAr6DSIHUApR3kCxZ4G2wAJet0cxA5MGrQCwS/NQXOsMbE7x2R3pg1o40kilwRnl8gl3YKQi2LCnQ0CT9KTZlKIghNJ5Jkga4nMEvgp+EncvIKfZsJpNXJRHAXuClEkbl4tsZMJLybxDgrn0yDNDngVzQ54Bw0HPfflxXU0FtrYJPceMVfnhnL1neQbYazZ2tK92dqmHVX++wP8hOH0CmVuZHN0cmVhbQplbmRvYmoKMTU0IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMTM+PgpzdHJlYW0KeNqr/08d8AMAXstIMQplbmRzdHJlYW0KZW5kb2JqCjE1NSAwIG9iago8PC9MZW5ndGgxIDE4NzI3L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggODk0OT4+CnN0cmVhbQp42s18CXQbx5VgVTXQAMEDxH0DDTQOkgBPkCAlUhJI8JIoydRBiZAt8RJF2zqty5JiS46dxLbiJDsvGmeyTuKZJJrJ5M04TdmJnbF85fBzNvvG43mZbBK/2Zn16mVsb+bNy2bXnmwicP+vboAgRcmWn+NdlID+VfW76l/1/6/qpgglhFSS+4hAWm7Z1tyW3/BnHdByGb6TMyePSz3dwiQh1A/1P9l3ZO7gyb3nzkD9KUKqnXMHTu/7zeGHf0hIzX8mpP7U7bNTe+nhqW8Q0tUP+JnbocGwRuyD+j1Qj95+8Piph2srx6D+p4QYf3Xg8MxU4H/Uv0lI7yOE6B45OHXqiPBozRZCBt2ALx2aOjh7UrdxCupdhLANR47OHlmV2XyYkOFPQP/XiI51sstED33n2Ti0jKhXuoe0UeSCGIn6kQgxw4VqVTK6b2AvARp+x4Q3F0SY+3HaLBH6eexjArvMbxHIe31OQTlEDiE+u8KqCVno0j1eeI29vPAO1MML76j1Ih75i4VVS9pfWFYvjvcT8t0l46n1Ep5CUpJCxsYH8pI08gyp2TKiiNt2jSvtPqUuP7lPOj82rrDY1HeNwP/MjDztC4cVkldITu6/BDLITfY1KjSlSJP7GhWWkvZKyoujii6+61IdNeUGZgYUcWA8rAix/NZbx8Ny2Hd+XFJGR6Epm/dJShdCXfm8NK9iT+1V6qBJq0lKC/a3IOaLo+MSUHN+SlJMo+OT0CJhnwmhDEKZSd9kPp/3KTSZz8sKGR2fzecbFSElwTi62BRQps+Njit6uU8R5T7gI6/QyUZFl5KBLmnvvH66T8IepNinUoC/ijA5MKMIDWHozEnnpfMwwXyLPgZMbhmfHPVNbc2Py/lwXlKy28ahz4esafM3KvqUYsglLxGmSkqEqtwng8TlvimFTe9T6AxQoegbGhVDSkJSK3Mzz+jItIQjKNnJPKJM9nNSjalLhkqSG+hrCJdkX5FaqguTOgpNAgk54HtSGjgvT6FeuLyID2WqSD4gskglaEee6lenqLzO7UoU7iK+RdbKb6pKcYYuVZoEULZPDucbwo1KdWqesQFl71R/o1KTAkRJUqpyG/B2AOS+vFKNta1Qq4Zao2KGYWq5SCSQwAzMq9TkJqXzk5JSA0JrVGpTI9vH53V7+/NRpXpWPtWoWFIjW8ZHtqmNvjC023i7NTVPzLmx8XmzOafQqT7FnESbBUvum6/Cn2r4UagTNCHERsfnUXjAbd950C9O2xCW4bYi7FP78RZYCtiSB06GgP4haF2qqusocJ4QmwzSyilk7SVKKdeVLUXmCRvYPq6Y5T5pQKkE4zPJYHB90iRM/22LhZIa0td3fnLeKiaVh5O+CIjJDrzZko2KIzVP8eoEOePVlZoX8OpOzevw6knN6/HqTc2LePWl5g149afmjXgNpOYr8FqfkotyV8RJkLAsNSl0Ny6QRqWhrNNZ6rxL7UyWdcZLnUfVzmCKKNXJD8BfCPgLAl0S8IfXMPCH1wjwh1cZ+MNrFPjDawz4w2sc+MNrAvjDax3wh9dUSurhZtqYgmktk1IOdDuZ46qEpZdCW21KKY1JpRFWYTMsgCHpOlqUp7pk9Ig3xPAh9y0l1VKn0twwr6eOgXFwZMhga7lkru1uS0kdnN404NGBayeB1bni5NhOnE/xaNK/Vu6ab6MOZK4dBAAUr0wwrIqprkalI9Xk6mlUMu+FChY8A+idoBPijElN0hCufJDl+vPnh+QhcBXjECLAs4I7yFDqsINIu8BFOZVaQNOB14xxNKUil5w93yRLUs95GG/VUhSpSR1L0UELYErKJDqN7JbxJ5kkSL4nWVzw5vvQkRrBJ8scWx6EJZxbvh4n0ZmpcYPlJveC9eWm9kI3y035AJ5ER7b8nikgC9y7PAjKlGGGQeAPLnwWGG+FSWTVZerAS4AS9GBZ+mtGhRGRoxgnAn5HVVe5OBfofnVRDhK06uOaHOQeEFF3qUsx8v5BeQgnRe31lMSHzGgSJtvHm6QeCLlIvdYoIV1FFYgxqK0vj+6q8lYya01TMtr2mjJKckVVTWIKsJzlonrXgqNoQikOKrW58VEfhEypJ98030TtsEDXLend6htd0ptd8d4b3dGbUrqSN5qwL6WsSp4H2tC+gKnrooJCm5QmuCPHWUbbLOoEzVKGxdIE60wdtR/8DoSQIuJNGPHQh2W3yAW6qB4ZvFCZhYTzGo0D4Fu7kkU5DEJtVTIsa5LQOCkxPQRMO9QFDukFrGVbk9IO63n4Ou3rYThqtykdAG9IKZ1wGUG5DYCApUGIpUVJbUyhCSsjAG5KXQJnBcBmACgCt6QuUd4yCgBv2YI4AwBsRRwEtiEOAtsRB4Gx1JPg9XoB2gEQ5dDO1JNUbRsHSG3LIx5FaBficehWxOPQbYjHod04Zw6APTgnAhM4JwKTOCcCU4gzCMA04iAwgzgI7EUcBGY5XX0A7eN0ITTH6ULodk4XQndwuhC6k9OF0H5OF0IHOF0IHQQZry4p8BCvKWsBPKyC6wA8gkLntSzU7oIwquEcVUHEOcZxqIZzHG7uLo16gtf4HSdVEO+4WwUR/RSMoyGcVkFEOKOCiPAxwO0pjXcPr3H0e1UQ0c+qIKKfgzs1hPtUEBE+roKIcD/grimN9wCvcfRPqCCif1IFEf1TcKeG8KAKIsJDKogID6eerNCxYrLal1SMs4oQHT1VjMONoDOB1MFOTIL9WCVxkjAxPR101VaJRGhJWtPhNofFLocjHZaM6KLOTIelXQ4zaM4kaFx0WOpkekmWC5vldsbonzKdvjDt0dMvC4wVppiOXZavnpdldlKvY1f/UqA6tkN/9T4dYzsBvvpN3FuuBgouMRepJnUjSnx0PFsJRuEagVYH2ejjNTKh1vJPxcLM4ExmRDkSB0Iy6Tanw3Ip4vVG8CvLspd+2Qu/hRnMDOjCKBtf+Fv2Kowdnxf39md9BEfbiX0TDCB6C4DVpComGBzJeZH0s3hHhzqswy7KF/zBsOwPyGzc6bf5nfATcOBWl5gWfsdOsO8RLwmQWDYSoDqBbiA64EZH9xFBsI8wyim2u2WbrDd4klEcLxJPJMIGkVPf3mnLZFxtTpctlk6wExGnNWBsL/y03RCweH3Cb42S3RoyvFO445XZ3kpv2Gk7fcbm8LsrTGyH3ckctqvf+d7bhOsOJMXmQHc24icx0pFts6nUCESnF3SzBNSyG7i2j4hUrye7VUkGAoFYIJoIAx0GoI44kbyiUNNtUDPE47LsSLdlOlimo53DLJp7aM9vUb6/fz5Z11wfu/iNYGNtx9rGv36KHt7Rf/ce2cv6vPKlxgH7F+u/VBcpnGtr6Y6+BFKpg539GHuJJEhLFiyOCpQIZ4nAqMDuAdr0E0Svt48AqboJotMFdBvjiUgsEhUN3iRx2A0gsERcjoiiw+5Mt3WCflxIMLbHgYMMNrDt5lqPxdK6avD2rnNzaxqtNV6ruda8eXz669O7vz6X38jOyw67o8LVvX/g5BmX0Wlz1noNiW1fPbbvq7cmQKcox6+BHGuJh6Sy9VxuOoqC01NBKArOYiHE4rG4XQ5ArMmIYDfEicSUic+qCsySpv/w4NDQg3v+DUX2b6O7bs1fvMgu7358evrx3aqorj79yX37PllowHWA89thfok0Z1M31h4/ZwlFw1FVe1GuvbA2fbhNrTrSKiA7wvTXuCbmkQx6i1eO+Aq/fgMvb1DzMdnlkVRiwl5P6Jv4811SpMcE9PhIfTaOLYzQWT3V6YTd3MKBNAdDUnzE2yFHw6LBnbQtTmovrVGNoFd+hvP/LObxIxkDWGHrlbDXGXkLaVEpcEb43Ggvn2Yvk2ayNtsdpzo92DMTRIGJZw1UJHqdqJ8FIugEiMY/AibDPUSAS6aZNMpxsIu4Ea0HF/ISO+HKKrMnMKhMZwdfkaA6dkckNH1i5hvT09+YmVlvNofdZmtmdfbAunUHsv6sew9S/XV6Rvb+RLatmbo4PX1xqs7oNXtiRlfvoV74ZzLej65Ik98nQH4hkshGNd8wK+pZmXcAakMkaIvJtpi2Ci2q2DrCZfJDZxRG6th0JOr3RAsvxT0+GSG6Lu5hlyO+q88jXW+9xWXah7+//KVXVmkgrwAN1cSWreVmpBrQSm70leKocmmUq8+X2YGVhLJ+PoZAGSN7SqZoJZZYuw7GW2qHOGaY/gta3rNelVz9CTCvcGn0d0p29iZ7DnxXPCuHrTUmHWF0gw4CCLOP0JKgYiQaa4rpDa4yMVnAlybEeEKwlEvLZQPPmmbfj0X8fvmiyVtT7TVdlLweKeY1B42/+Gejr4Y9B9M/h2ZHP//7KjOl5iqqL+z1RYC2nCdqrirM01uqzCX6LgD/ARLNhj0mtiJ1AeKPxZdSl6BLqaJ4ZSeDsrfGJxb+KORxA2gOGOiBkJtdltxXv+uVK4z07wtjbklysyGvXGUqtNAn3BI/XuVr4lVYE2awGdQEeAbN/ME7aeYPVh/RwTqMimUmDxbfxMqsHTz6q+OPTU09tnMn/o7fn5nsWTPR0TGxpmcy87uLk5MXZ2b4b+5gdt2hXO7QuuzBnEoDyiINsrADDeDJRaoDCekIrkW2W09RJpgm040OiJOOkCMY8AGuVY4bwDxKfrLMtsFXorPk4YU+fltX123pJ1BVsveKLeZyxWxPPMEur5lb03P7mue4dsByCoqU9vvToX8syqVLqAK5ZMgg2ZAdqnczvUg3GKleBC+hOwvqQtd1lohwEekcMRiECaB30W14UIO53u5VMERHYyoajVXAYtSpxIIe4+gqSlG7s4mVxAoIwJjTpTqRtSxNNAG3x1X3wt6M5qbi2ZG4R3JW1VZXOy1uWZ7ZfKpPlXzu9OY1roQn1BTwRC2i2266+l9ULaga8UedgQ7J4zRX4zwxV6I6Zpm9sENVzo4LsxaXUFtjqTXX6G0m2snVpKpM1dXCAnsEdFVH0iSTTYchzMZQFBsgkoBZ6+ksKflyzR/V19en69tamzvkGDgkN1/QavBVM4AlPp1HYODdAQJgi1pk95qrzCG3fbg59WzAHUiCr5fab+vMJNeJgs5Y82zE6YxYX399l7fGarZW1p+NNnyvqNiu6TVtE/7UhlpzyGegusiqsL/Z/9+L8aARdMw5IYKO6ATQKJoevQe4YBOwGvwjPJPAOBnQ45pMkzY53oC250k64wnu4NtUXQGxieLqcBUDAqoMlogryLjmrxxp9UXcNnPdxvauLaM7X+87OrjucCwQcZmrvLtj6waGNu6Yax862W+KJt0Bl1wVDrbFGtPV0l+t290aD7mCLrnCITfHk6kac/OW3LqJNPARBMVsB51Alp0NotAFSDF4MOWrBoh2ErssRzVHgoG06ES0CBVmbZGI78txvz/6ZZQbvQy+w+sNXf1f3PlX4eIhqt+CHPUk+NUQzgUOi3t/cNwTpCz2gMNYdFqqzyj67qKz4G5rhzR4dsuWc4NRvzvaMFSfHGkMetlzkEg8uu2+4eH7ttE7edr9aMtIXd1IC73Tp8Zx5Pch9gIsMaDBAdZHN4DnXIxDfPW5Ewkddw9gbAIQEQeHriqr6MpnYuK7FZLVEjC+q69zWILGHz1jDFrY8xF3dc3V5212arOyfpPZF7bbCgn6c6sd564F6T4Oc9eTTU/HAlUCgaR4RAnABsMGmxHuqgQhVPThvqwT8lFIMshZrVfryGergcp6UgcWk8Acp0inAVyDsBK9roxGt3CyXvihGLRapYrPfg7otwbFHwr1Hrsk/vH9xqDNFjB+7IIYtrMXYv6KyquXLXZqt9Fc4TlgyG5h/ZUV/pjDWuihXVYHmIe18GP6ktXB5QpJKBvgcg1kvTYTUA2SZXRRsNE62NKAXg1CcdFqJLpcnVy9bKDytYjbI/+dtd7ldygXHQF3lB20FP6B2xFl1O52eWX/b34djHpVPyvDGmxiYUj3EuTTWZML9nIV4EYYCNUFQvXwdShiYAyNGDBZnSiKVt3WBcoRkEqOxWNYgIL8g5DxMt1OjqAa6RKEfD5r9/sJ8Sf88YiESWc8GjMuCbhLgp6LZ0w8E+fLOs2qcJMYpp6x5oEjvdnDuZbtgYj34a1be7Nbt/SyMBhzHjICb6B+6Ozo6Lkh2Uch1uQmhocnJ4eHJ7gMekEGG9kV2GnVkX1Zkwd2WiZNBiqLjDkxrgjghtC4FuUQQBPzQSvP6+c44pJeYC8QAKgukJDDMIEvFour7JUC0bKcENi0lvFHH1O5GvMX98PuHc2twFovsMjCKlMJv8iT7eOo5deCjYUc8oY8crsCHdN/BR0nyF6Vo9hKmzV0saHy3ZovKy/DK8aYuTKsfLYGJkmQeAxCbHRx2wk6Kzlf2N1BGG0rsqwqk5673euotdsqTImqkbEduVa36LBWewJdt7VvOpHNndrIwh0pZ7jCrNcbd48MT1QJZqPkcTd4hs9t3nJ2qGS7V7jtXrjWdgOoLa44HklWtt/wcqQVbDgEc6EVz2m4H7URX4G9wKNLjfgHsMu8b9GIVVmEQccSyGJOZS0OzRQSpbP8pQA9mYVNlsjVFsLIxPOlgAD8RUuIOkCBbdhc8Y4ytHzWHA6HE+G4Ix6PRsJ8GwbbAjWcqN7HbliWoEYN4Q6wASZF3YXvVO3I1Df59NZaR9Dv39Oy/d7+4ZO5vhODhc85qKjb0AxxpTtntggVQbvP6ZIGP7Zpx/0Dw2eGHjtoaOgpxh2qgL4byGdGFB9wGDQamCjycwYn7F/wSEkH2nVpu1hf0dpFAzGI5KyRGgzXRwZr1/CgGfpBJnNld6hYoGqIQEBBvV2GLVVUrjD4QA6O0g55WWBPa+dOqhXEZSr5b8WNwK24kjMIZeamYp1+u75SdNeyMwlXc8jtDhW+wv31NMJNI3uCITfkFaKq5y7WBXpOkk7yqWxNAkTnoYKhEvQnaP6qARYtg90cJMegbiMYLii8gmoZcqCULnjQedUVkREPBADKXxk1n3WmUoSkOlOZthaYviEek+tipvINLiZfnZnFdKzjPazeGfnC8eAdzlZBDFhMFbpbYxvWO/PpwWN9vXcNpMd9Ee8jY2O53PbtOe7Gc2dO2E2OmKHC6RKo3J1pCbWpq6EhWLnMpeP5OQirAmwlQjZ/O0SpjmrCcRG+hKFlAk89QsUk2Zd16Km6nZ/jKKw8UYiQcAw+WqJQ2gFyTizX+G/63EZUbzLTta7otH3b0ix8ev8C4XolnetyaRVmPMX6x2h6YQE0Ssi32askwt/NEUDb/1Laq1qAlzDpzVZILqNBp2Y9yI9FDU6C4FrMeUptJWeX/w7EHZnvIdW0OGFYGnYsxRVscDFLwum1PtVaJP2nNo9Tdn/hW2MeT8T+fOMdi1QXPvuqLWZzOz79PCnSSb4PdBbPJZw3OJf4vuz1RPi3NNzVR1W9CXmw7w5yT7ayEeIS3dAGa3W96tKduG71E0aDKOj1rhFI6cp9uZdgI6KIE9wzhBYxsm5sgT6Cu0WMA8UubUl3kPaY+uFL+rpavo7O21yYGlYvUfwyAzgru3Z3r2wFS2B+1l0bTR9q6F+0ZRvIJELuRFvmukdp2Lh7hsQWtc+WhDUXt4j3NHMyUTTzD2TnP9yMrDV1re4rsbmz/Toccq4s0XYtVsGa5mcePSq9juLBR6j84MOHLBJ0T3NlrfnvvN8DkdzwvSMb7xkevmfjyL3Dp+oHGhoG6tXfZ88NDp5D5zF0brR1U0PDptbWjQ0NG1u1fLAL8sEwzwchr3BDXmEqzysWU16XllMgYShtDy3lFQR7r0kayxGzoVLiWN6pCcKj5hUfSfb4A549zqKGdEuyRzXeFPcHf6HyrwmEgkB8vCKolfw14gmVpUkjWsQpS7tcy3KzpYiLaVdZH95WikjXpl2xpWnX8giUWSntipSyrtbtfiHsLqVdLki7HkOZvOzX8q6ozxUsbCoLNHxt0q/wvOvPRxTr6Pi3A5g8bPDBFRdqnjdmbeiHS0u1lJ2oOywwAkKPoMefXI6gbj80BN5DiG5SXdHFtMWn9eO6JhDDcalwofJ0RV3XEgmB/48WN7qlgxHRca390BP1ktNsExxV3pZQ0WxcO1ohCLtCIUgQpd7Gf11c0tX1SZSDB/YYL4AcMmS3Snb0Ogc6oZHio6GAHqiPLEcDnQug8zKkfLYiJSeSMn9wlMEUQ80w+HlP6dzOVTrVAsbQBRRPfGCReLw1Zoct2Nu0uaNr9fqOznxbel+g2lZjddZYV0U3+pOJzHDb6ltb+o5GJ6xea4UtFBS6AkFzrdTb2TKUiMdq7S5zZY3T2+n0mSvNUl+mdX081Yp8m+HnADtP6ks5KeyVhAf0EIQY5JfoBHgoKh7QlHJSxIL0korUIJ4tRydlyJCTLsEDDEA1MHDei1haAKsndTaekkYxgEWdjpUz0bJMVX3qRre4umNrx5owGW3CiDyE0JDTZqypqrzL5/TFOnZQu+R2hbKo7yxChV87bDo9t3/w5SbmgtW3VuXMyg+lXKXUkbtx3sjoA2WN+WyV+pQJ4o12WKVRXHpUqyaRUKNvRu4+dOgkz5lhrxHxMhdkHwfOnDlQ4HnImu7uNQDxPcLCAnsD6Kkj256O4vmQvpgpuYkeLE1PzhpEyIghT2C4btSYiE163QOw7dE/UGqHHQ9QWEcSsYTFbnFpD57U06xEHFIo0cBPi0qnRDyHcrn44dZLYd0XxZDVGLGMbbFEjNaQ+EVd2GcPiAduqU04XMZN+8WgE9jwVdQU9lodlEXfeSfKqMNKv1RZ5YnZbIXXfxqz2l6jks2myrmLy7mN3JU1eamgx4y/eEIRLSbxGmuwblbK9aNFNov7g5XQVK7bSGssHo3WxTSulyf4QaYm+MvOFrHRoirskRORoWJqb5ATjqFc+6H20RTqsLOjfZWmw533311ZoSX1Qk3Fmg2m3tadXTSKal0g6zrXrKKQPkBujGeOOzCfpxkgTwb38GdqjsweKj1HWcufo/i057ycIT9/zEsn8JEv7NRrYaHU+mq9Tjsg1sTxOa+zLH9Ad5EpCxD/dHrt2tPbt/Pf7Pr1Wfyadn1t//6v7VJ/T505efIMfnkswAUR5ufAddkYxERGN+BDCkixzgrqU5Ti8aiTOGIx7Xh08amXulI7wYzIQgTPgteaLR7ZUvMFi5ddxud23Ov+Il4Rd9X6jbsqcM5m+Pk/wHc9acomYSrwELqzxW07cq/TlT1fBh+RkBvaRe0pgPpYrx1m1Jgu0VASiMGQpr8Af1D4K2/Q+otYMtsQ6HZb/c6Y3R7f29S3N9Pbee5vD6FPkDwe21t1WyKNfQnJHXGYQ/Z4U9f02jUf736Qr8t36Bsgm3ZydkSpAZttBKemF/QGAZyaQPUCuH50buwesEpxN7g3+1IXki7hQ8SAnAkCCtXrbnyX6hjbSTswFwNLVTP7xUdA2rMD7eFOOf+dxYN5dVNEJ8aa+k6NRod9sYjb7kq2h7rk3iZ7UPBanF5T1WMvo8ukbUHJ/Sn6Nz1TnesPrraa7RF3nTkc6o5neozUGHLVOKv/EgUV9rndF9Bmd8HPcZCJH/Jg0F6Iv+GhhzWKD7fUQL74DCEYwAQwDg7eUIrixWc3HaoaqboM0+F0B9sOBDWgNy/83hk30x5byBNpKFz+Kk0hCR9HS/q47HZa6QNuWIZ//Qp/Zwd0dBXoyZDBbC5NBQO+/SJQQUfBotBj3AM6AOkbBAw/+t3F1zvKHtNnSEe0MxqDKLxc1isJu/jwLVN6nUA2YAYytn/NxrPrE9u8VbUhj9XXINUPJzekXVGP1VGZCNOQLuyiYRT5v9tsq730p2vu7M0dzbkdpmitNWDzxrOxTH9VVYWxIWDS/bvDhxz/UWVN0U/Q37MXeG6fyabBk8IqBQMCtpgwp72TsfjmwdL0u27JE08tsdR2zsiOYVn2vXM2u+7O7MCB1ekHj1dVeiMB97r9nrZsqK+vuaW3t4W+vG7/Wvi36d6h9d/6UljwBZxhg/W2bLLwlcH29kH8cr/Ss/A72P+jX1Gf1bPd17gTe2zxaQstvYoU1oyYvp0QC781BK2emPhW4R1urLexy2Fvdc3VZ61gpzXVtIBSUt896gFB1cJ8XhKHQLAmu9pbhTa5ofwYlOfj9sVdDRCSSPh8ibZEa2PSF/fFksliLl6SVecSV2uIi1qIB4EtEdvrHev2Z7P7103JjatnenpmVjXLSmdnQ31nZ31LX18LfumWbY2rJru6JldN9tj7mzpvy2Ru62zrtf23jrr6jkxdXUdB6m5IdncnG7q158kgyN+zHxX1buVHQmLZVphN4JNu/0jxTapyvdfXlem9zEd2Lu4uljCwY7nG27khoM6bQffsR9doXDWEJXpnBH9/zGr5Pnmjtq/XUe3FOZ5hwZYCdOHAQ1wH7AzUQ8vy9nzWymNeqDbgdsBA1R0Y86xqklV8IU5my+qzoVCgOrD0hz4YClgQgp/C6UUYBOhfuJv8nByFyOvPeiz8eSBQD/9mVOeVaIjgYyunZpe4ZLiwDCV7cPw8kgk4vbU2nd9hsVRWVQdTjlSbebDd5qitFpnZU2kx6Gtr7bKjM62eiayG7wvkPLDkyTqLb/5pT1uRTXz1L7OMrfwiM0vobyPv0l30EKkmQe1dwjEccTd/l3ATf5ewsl0bUBsPhxsDH/oEOtIn3o2oh1lhov1dnfbXchPmnv8NpvUmwv/p2c//B7z+ZOjhHxQihdf0LbrHAdeAkiLaferf3+m3FSILT+tbFv9CT/2wVjYM1vsrfLdyYZS3nCMm8hF+2OfICDuGa+k6/T/mZ4A3HqPnvXE+MH1tQN8zN6Dv1WvnprYPnx6k4/3gCWkVj/3TzdHA3r0+j/8vPuxWjY/fkDr2rRvzwsZunnZ2FPP/6/S99IezJz7+n5Og8C1872CFvu34zP4DjnsYdjEfpY4Ok14mXH/OG9HD+v+wtMJeLshO32D+DXjOtuzzK/685MOV0apFW6I1721Xwn9U6QI76L2pefZ9tLp/P7ZRtAF66ca80DeI56Z0+0X+1+bXn3vk5mT3QT4QjoN/yLnZZ64dH3RcRw8QPXOTZmYC+/4B2cVyZDWLgo9cRXrYRvhG///y4x/KWraQQYp/tbD881uymj7yvodpg+9acoD8CZT/+sEKbaH3LynfW16Y6abKMPvmkvKrYhFq3ndZu0L5LJS/X7no7B9S2QPlbf3osvLUdcvb5UVM3WS5U/zZYjFYb1gufLBi1BmPLCnvlJeK22+yvG06u6T8rFSuvN9S2cXLrmvKlcorVRuvU7704ZTqCJRLNZll5dLKxdy2rJy56fLLxVK7732Uk6XyTO3/tAxa/s7qtp63XrH5bZ+y/fNHVezt9kOlcuF9l8u4E2MD5HbYrf0xEWHH1kC6yafBQz1U7cQ30Pl/rrIPwgzV4aGslYcchCmxQk2FGTHSqAYLpI2mNFhH/HSPBuuJl57RYBHaL2hwDWmnCsmRw+QIOQ077TvIHFBznEjgJ1tIKxSJbIeWWbhuISegf4bsJ8fIFDlE9kLbKNxzmNwJ/TP8rl7AOQ74h6H9GNTr+GjHYfRjsLtshjIHYyDGCTJNmuCuw+QgtKrjHYVx7iaNgD0FeAcA8xBAd/Pe5hXmH4TrQWg7ALTXkxTMd7c2ukS2wljH4HuUnIRfpHUQ5jrEqdzM7wOeJP+1o0oBoOvaufrg7gNwTUNvCy/dwP0+MgBt3SvgN5buWEluxb4dnMJj0I+0SWWj32jEokxViR4DLNTcEWg7Bvcf4xJp4jqYg/5bgHM8vRh5hryydXye0s/mFar+YfuReWLoe2ooHRJIA4JPrzbGjVajYFRr/WKL6Bd5zdR3uebFihd1L4LhVEC9uu8yyfLC6wLpn4/Sh7aMK9mHxueFvf3zcaz9jfE+MLPsQzPbxxElD5+ne4x1RrtRqGp4hi58UtF9Zp6R/if1e0XS3/9/AX0VdjAKZW5kc3RyZWFtCmVuZG9iagoxNTggMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAxMz4+CnN0cmVhbQp42qv/T2XwAAAVq1EQCmVuZHN0cmVhbQplbmRvYmoKMTU5IDAgb2JqCjw8L0xlbmd0aDEgMTk1MDMvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA5NjE2Pj4Kc3RyZWFtCnja3XwHeBvHmejM7GIXWCx6YQEpAlwCIAmADQTAJgoESEokKJLqBCWKhERKsq0WWS6SE9mxHNtiyktyOV9ycVxiX+qVpRzHPtuX+PM5TvI+vzjJc5JLv7zLOX5J/J596UXg+2cWAEFRksv5ku97GBM7M/vvzN/LLGSEEUJGdAviUNvEttaOqcp7YjDzBPzN7b/+pLfn00RECNfA+IMHjh88cv38zadh/BmETO6Dh08dmE8Ofw0h87MIhayHFnLz+Eu5/4FQ9/cAPn4IJsS/Em5CqMcJ44ZDR07e+G6/+QSMuxAyPHr42P5c5YcbBhFKv4yQrvJI7sbj3AvmSYRG9ADvPZo7snDjHRN3wrgRIbLv+ImF493x8WMIZd4F9x9APPHi9yId3FskUzCT0a54L+rArTCmt9jHi5AFLrgwRJMHhubRkwj9gXAvLgsI8ffiVi/Cf0Hv4d+TJ9gjHHq1Tx+0LtRF4cm/EVhnuYu/N/818szyr2FsXP61Ni7CoaPLXeTHMP+7wvyty+2rxsX1XkH/d9V62ri0norCXhXtmBrKer2ZR5F5S0YVtk1PqZ0etTE7d8C7uGNKJf7cP+qRHu3fr+zz+HwqyqoorQyeBx6k51IRFYdV79yBiErC3nmv+uSkygemzzdiKT20f0gVhqZ8KufPbt095VN8nsUprzo5CVPJrMerdtFeVzbrXdKgc/NqI0wVRl61jd5vo5BPTk55AZvFnFeVJqfmYMZL70m0F6e9+JxnLpvNelQcymYVFU1OLWSzEZULe2Ed3p8DzHTpySlVp6RUQUkBHVkVz0VUPqwAXt75Jd2+lJfeoRh7NAzot8rNDe1XuWYf3Ex7F72LsMFSm84PRG6Zmpv05LZmp5SsL+tVk9um4J6HklbYP6LqwqqYDp1HROOUAEMlpQDHlVROJfsOqHg/YKHqmiOqGPZSVI3p/Y/yaJ+XrqAm57IUZG6QoaoPnxeNKD2UavaVeG8Ir5aFpK2CQ4BCGuie8w4tKjkqF8Yv5KE8Vb0eQLKIJUhHyQ1qWxgv87jaAE8hzwpp5Q/JYUbQeaPEgbA9ii/b7IuopvASIUPqfG4woprDAOj1qnJ6lD4OHSWVVU10tBVGJhhFVAssY2Us8QIH9sO+qjk9512c86pmYFpEtYYz26eW+PnBbINqWlBujKi2cGbLVGabNunxwbyDzdvDS8iS3jG1ZLGkVZxLqZYQ1VnQ5NSSTL9M8KViN0iC809OLVHmAbWpRZAv3bbZp8Bjxb5Hu08fAVOgM1mgZCPgvxFmV4vqMgJcQsihALfSKuo/jzFmsnKE0RIiQ9unVIuS8g6pRlA+SQGFS3nnYPuHbTaMzCiVWpxbsgsh9VzIUw9scgJtjlBEdYWXML26gc/0WhFe4ui1MrzE02tVeElHr9XhJYFePeElkV5rwkt6eq0NLxnotSmsFPmuCnPAYcXbouIZaiARtbnsprt08y3azVDZzUDp5gnt5rowUk2hN0BfHdC3DvDyAn306gP66LUe6KNXBeij1wagj179QB+9BoA+eg0CffTaCPTRazjs7WNqGgnDtrY5bxpkO5dmogTTC1NdbQmrkZAaAStsBQPY6L2MFJVcl0I94hUhPJT6tpJosVttbV7SYdfQFDgySmB7OWfW3u4Ie2MM3yjA4aG1m4B1XnJzOo/cn2HRZLBf6VrqwC5KXCcwADC+NMJgFbmuiBoLt1T0RdT4q4GCBu8H8ATIBLn93hbvRmr5wMuRxcWNykZwFVMQIsCzgjuIY+xyAku7wEW5VSuA8eA1/QxMNaRDC4stitfbtwjrda8G8bZoa6k8zACkV52jTiO5Zeoh4uW8nodIgKvOpqgj1YNPVhi0MgwmnL7YHueoM9PiBknPzYP2pXPzcJukcx7oz1FHdvEzOUAL3LsyDMJUYIdhoA8ubBdY7xKbKJrL5MFLgBB0oFm6NavCipQiP0MCvic1V7myF8i+p8gHL8zqAgU+KH3Aot7SLVXP7g8rG+mmVHp9JfZRYgocRtunWrx9EHIp9oVJL8WrKALBD6OR8uiuCe9Sal2QlEJ1e30ZJumiqOZoCnAxyUXx9oOjaKFcHFat6alJD4RMb1+2ZakFO8FAN6y6u9Uzuepu8pLPXumJgbDaFbrShqmw2h1aBNyofgFRlwUFgbaoLfBEmpFMdbMoE6qWChhLC9iZtuog+B0IIUXA16HEG98svaVUUBfVp4AXKtMQX7aA4xD41q5QkQ/DMOoO+ZQCJwqUlIjeCES7NAOH9AJs2dGidoI9b7rM/Agsh50ONQb90bCagEuG8m0IGOwdhlha5NRYmKqwmoHu5vB5cFbQGYcOpp2J8HnMZiahw2a2UJgh6GylMLSzjcLQznYKQzs7wg+B1xuA3k7oYdbbFX4Ia3NT0NPmshQO0940hWO93RSO9fZQONaboXumobOX7kk7s3RP2pmje9JOjsIMQ2cfhaGd/RSGduYpDO0sMLxS0DvA8KK9gwwv2jvE8KK9qxhetHc1w4v2rmF40d5hhhftHQEe95QEeJSN1H7oHtO6G6B7nDKdjZIweguE0QLMCa1LYa5lMLgAcxIe7i2teh0bsSeu17r0iRu0LgW/EdYpAJzSuhTgtNalADcBbF9pvbeyEQN/m9al4Ge0LgW/GZ4sANyidSnA27UuBbgVYNeX1jvLRgz8Nq1Lwd+hdSn47fBkAeAOrUsB7tS6FOBc+CEDT4rJaiqk6hdUrmHyxmIcjoDMOETrRC/UY0bkRj4kPbKuwioLiGsL2aO+DpfNqfjqY7a4UIHd8ZitU/ERmI4HcUBw2RoVfF5R8uNKJyH4PsLr8vuqdPgjHCH5HOHJE8qFRUUh1+t4cuGTHObJTt2FW3hCdkH/wqdobbkZMDhH9MiEHEkr6ENFBiZcaMzvI6I7FBeU+gDsGY92uF22czaTycb+4Bs/S/v5ToSXbyJjy18h9yEZBZaE+cGkBxbGaBctS2cJ9PAEdGVk9HOiK7QkoEESiMXomi6XU1COuSucjS4nGXPYJbvDD3/w3PLPl3vQB/EFQKUq6YbHKzKwEq7CYww9Z5guJbBlEvF4CUOnICi81Sz72ymaoXT9M1aZN1qIGA0RnuJ74RctQ35gN6pdXiZXk8+jKlSDmpKBGsxzFsCUjCIeuMLjA4jjnLAnY4YzWO9QdGJVqIEiXB8IBn0iu8Y6E5juXIH9Po5cbZclC5/JPz6qd5jNgK5e74YJLObHsftdXt5kNRoeecRpljmBI7c7jYYLb/s+3omYDuwFpPaADjhRLQqgWLLDCRjhUbjD6zh+AYF4Z4CrzoyAdTo0owlp3bp1gXX+oA/wEAE75Kbo+QoS83XQoRgPKIorCjwi8Vgn9G1RYh07NZ3/BWUHNmyf7WxrGOj54Q/jQ63bdqRfeBEvTG/al7OZyC0m257J2HbHVzb8Hg9uyLcNDg6n8i9TnWlb/jU5TL6AmlBbEjQYcxhxZxBHMEfeCjjqZpFOV5MBlPlZxPO1/FggWB9QAJfqEHI5KeeCAaVeEFxOtzvakQAGVrjpPGVpACTKOEoOiwazXj85u+VsZuzs5OyE3mA2iObgifjs/bN778t1XRMiN1sNRqMuNnZuV/ZcplMn641WfbWy+8GrFv5mxluLqJwpX+8FvlpRNQonmxgfeUwZqcMcV2SkzYaQrdpWVekGQHNcAOVCbsq+MnbaKf8YA/F3zw4MnJ1bxpSFaPno9R3XbHn+efLE7L1z+++Z0Vh34eb7b91yduLCY8AvioMBcPCi1mT4yhJlZzh1Db4GTaINl5Co4nMVOzYf/i01wvcxWR5jBnke+9j1h3i81y6brBo6YA7WP9AvKkFUwEkAnDxU+2FMOEwW4A4/o8M878yA+rs4io4HVSmAjyBWFvVrZXtnyT348K/opg9hL9v8X20mM0XpMHnCZpJtf7DSnb9Ob1Fkijp0E3kGtaH+ZG8Q8zrQdULtQjgjYgHpeEG3ADjgWWAR6BLPo1lAppZxqA21KAFQlaCeapTbtUZ3GHqrlCyeiFFUAdMoudpmiRztPvDg3r0PHojtD5ptRkmf2b7jjrGxO3aEdtXfY7LbTZ/HYAKv2KS6egAC0OpKg9Vk1zWNn9ux49x4pesZ6l+KfDwBfKxDLcmQzBFAt+hCFgQdKXMigHgdWufwKw5/wVhtgsY/X7FT8GI+2iE5G7abTPb81XAx2+xmkx3f5TABQ80XboWxCTfnv2my28zkDB3lX8DVJntJtugjgJOJ+k4TZihRRbu8Z7+7uIW9tOCFW7W1lv9ITsJaPuRLrvNWGPSiDhE8CtpCnBmsUeb3BxQe9EPzjkEsulbTw1wkCEmHyUmXyWTI/+87CzSZbfgDBlAQQ/73uDJotNiMePaWL4LqMCRs5vxf4jOS3SgbfpW/p0QbXgZ87KguWcOooqiUmY8d2fydPFC42nYYX/H/ocr5YZPGzcFeq6mokhAZPlKyi++TzyGFytNrkzhMvTDmEDi5MxBGVwtUQYrLH/AXjKNoD5wQBDZwZeZBIwSOV5BngbFm+88kE5Gln1FztJlEK48FDJ6LmsoFhgoJ5O82YRkfuPAvGn6yXRTyN+BzFsJ8GrWdr4DtWEChKBfAkxTMBDxawUwCgUA9k8kqy3C7WkiZUUBQ+MrOD+ZyH9ypfSeHbpqYuGlI+/7NgzMzDx489OCePQ8e2nVuDJys9o1KfrWpEK8gCgiYB+7xiNosARdCtYOm7HjM5QJm1bpqPFUAa1cCIoim6FuVMhZF7cX4hO+bam+fSjynZRsv9Wza1PPcc+SJ6O7u7r3x/K+LIst/bPuG/vH8j1bwAW8DuVQHiiej9RCGMIvn4F1BrDq8AD6EmymP6k1NTR1NHe2tMSUAFsnUl/mRIGVXYBVyvg6GsegG3+Ku4PqJBkAO87xZL4k19ePxH1hNZie4PHP3dDQdD3dhbLF9Velr2Nz/Ytii04t63rppYrhbi7sU//ad8WTObtvS098h4TDXOBjuzlBqMGoA+RKQb4xSgjge8Rw6w9iL3wpUkFmQeE2GRVoaO2p1VBVjqFMJROoD1Le4A0Hm6yCugpRp2Aq2kIudI/WOoAcV6wiTxf881ik7ZFkav27TbOtYb3JXvPtgev01XotTlkTPdPvInqmtG6e7e69KS21RySw7pZ2DiVB3g8PRsrk3trW1KWCTjQ7R2zjQ1dNf7QpvSUW3tWk2Ww+y6QHZuKkPocznIARTQWgaAjBu5FSUBp1YUYgxJd4XnLaPNAHXnqNO4zkW675HngDjtVz4MOPmgtUkWwv+Yfk35Brmj2EvHnIS6vfAQaxED3DCYByFvVjGSO2jlEEWDIO54Gnb8I2bRm4ctllke3wmnphJWKkDNuX3jZweHj49gu9h0W5f195EYm8XHTEcFKD3BvJPqBLVJ+uchMUEyMhXXDB8V6KKYJBntgBqhxkWkNJrUnM4QFRkwc7lf8VbDQYLn/81Zze6DK+8pLPoyT/ZjKL+wq0Go2QgbxMkk9V94UmSMhjZ3uuAu58A/9WAOpKtNCPzVUvgvCCvhdhEOObDylw3fcMFPizYECj4MJFjJsBxDCFOQ8hNMaqIs0uUu8tOvs9ZDBXi3/2dwWWwwMAlS1bu6U8YHJDtfvwpvZt8zmoGX2aQHPjT+R0OwPMWQTDbJMOFp/EDToyNhvwM6XNQu42ArsvECFl4GB36bKVEdDwezaiVk1PJWgGUpCJT1Pi6jEgTpdkC5p6k7+L7lLkMiLnDWjyWTTprIQ2sDdeG/Aps4Qn4/fqS4KluxVYnDpRaEtcSvaKbxH9gNU/VfG/6mvX91wz0zVfZTHdva23d1tm5rbVlWwwvQ/jtp5qQjvQPnx4bOzXY09oPkbs1kevrmUvEZ/v6cgmgdQJojZB/K9BaVaS1ntIKBLgpKdwspaqc1lpG68X3qekUgDTNXkMrRGWNVs3XgjRdzlVhGUi2X0zrbYfXr78m1Z1bVyz1PPt6Whmtse0trdtixDh4aixz03B3a4qmSeSTzAC+3d6XV7pyvX2z8dgcI5bpIsgW/wBkG2F+7BJ1AvVedeWFAjwWQWE/2GchR3IXCq5AMLAqm6NVH0sqyuSHd29ptxglk94kW9prErs7O7LdDSGXaNPLomxu2x4dObEheTJDjK4Gl9Gu15sE0dA119M3l5CNvFkULbItWDN0emzk1CYtpmi6+ePL6qb7VXTT/abqpu0Kurm/L3VNP+hm73x1mW7CN/kxJBVTVEjDLUmgLXN6qLcV+6E+GY3n+nrnEom5XmBAiV7IrYxQgTShrmQMZqAuwGfYu2odWqBeigmKaR83C7G0lhvz+XxNvkY3rYx8LB+HnKsoJC3tW52BVEAp4YtBGgJmI+dvb9/d3zZWYZQkq+TNxTdfnxo4vL7vqhTO/2C/Ge/QdWQasc3WN5torDNYJaMU7EjdML71poGuw6OfmczoI2kFcAQ24u3kXwHrAxl1HUjHjwQRiQI6o8eiyMpRN6SJIByIO/QoASTiIiAlpQgH03Af6F0oe0KDyiZpZGlCjQ1KA8QoxSB6QnbB5dK0b02kimoOs1iA/Eg5brTZjMeplEZkq1UeGVlf02aVDCa3iXy62X/QKsvWfI7FtHttRpPl4IYhm0O26gQmjy5SC/IIoz40khxurCaCzgZoklERajQgQ6djUqjL6EE0TNFqqWiYS6hCYxEoziN9kd5YFJYIBfyRgKGUqDKZ0CyBld9anvAanCGRbQNvGVE2J3jRwAuCzdUfzy5UHe4dOpZMHhvccBW4xo/uam/flYjT7zhehhx+YvxYj73GIhokgRMNlQs7++PrNVXcEE5SNxnLrV8/FytqIkYT8PVTsDsFRZLNXq1+YdaEMT+rY6SXp+D1kIFfnIJ3aijb1ng8/P4pKov+VHOmpeTj5joI95Zs/t+ZGDwDWxrTQW1APsH823dDCbS8jAZguw+QeyGfgd2xCBJ6BmYNSxg/urysRkMAw86tHiD3AQzHznUI+gbzhTvg6yWgyYcakj5vhV7kES0smFenUezSpVRQvMhn+ws2JVbgl1wGk+H7mSIR2GeQjXbjV74dgoHxp8m/KsO/63eSwygb/+FFVMQFvQ9wKZ75ua9QGb6v/MxPW+7ClCYjLgX5RBc69dlYK0txtEjmpoamm9WLAqfTVWQg29BcYkZth7vViE5SEAFAiCCUQSSrV80j6lCLN7OaGXahBHCIypua4RXkfSnxuzS1pqnVSzsoSRuKStCXbBqJlLRhT7Rnu911vJtwx3YXdKIyta1xqDH/4hoFwU/S756meFc8nCrq7i/BZhU0+bCmuhrhFUzKJQ2uK2qwB+6sTLICrnAnmzS9PvWm9OGP7LLLJtvAYGhzW4mgBQjbR6bz32EIKxr231/BHrL4lXgXBNwvqivr3khdGUyd3LjxZEr77uvIxuNT0ehUPJ7tePj00NDpTIYm0Jk+GoBoGIrP9Wk4TIDPi4Be0Zjbm+wqJEksjgqQQ5OKsqSHsrMKj71a2rOWS5dJe3pytUWeVe/rLaU9LdtjhEvfMJq5YTDRkv8ts6t30exnsDWeb4nt7e2ZiXXO9PbujRXkfwJ4uA6dedhDI0ohYagoWXlJ1loQ0tQD0nYMcidnLlaTYqhaAVilLczp0yilacs6VOsP1DtXDuvqNSJdF7Mggbd6rUZdrck/0lqkuWJmAzFarZCnd0+3/GZFP6a6M5j5jWbIDz4JtEXZue+l69K6TPEEGMrSkBIM1TfQc994IdAU6tHgqrM6caUedRfqUZhoNgmSLPXua9uY6t22t2WiI7SrziCJRklfmQq0pslQunMwdGjz6U17DSZRkMYjoeZmiys90DTQ4GsQTbJB0HtqwuHGZpvJ29M2sHk3o4Ee2kXJIgT0XEaNMM7reN1Z8Dkcx88ILLhQKRUZ64FkggIUj4BWAaIVuFKaADlCQ0O9g/onB1STQG8xHQiszRKKWcRDNRWCXWcwed2e5uCIbLPJI1Qi80abVcZfyC8FPDqLZHZIHSA3mjGwo95jdqNsYT5n+Xf4Z/iPyIP6NW2ys8K3orzw9WiTBJ8tm8wmZXbCW+33+3Wrcs+VcpgKjI7wd2xHc3NHKFpjQ8ObQTn+CJHlhX1XXbUPV7Mo88KmTGYT7WtnGMsQ7yRUTetwNy6VwHUrJXA1qm5cKYFp3SlAxdlZVnLGK/B37fzTvEUvWfkvcFYLlMKf+jRvkYjBbDTo8516I5Yk/CzR87INispr8F8ajJquwv7kWdg/UKyDlVp5bR1cV1YHB5DfHwxUFm2HIhSkJXARsTK8tBI9Sh63cX+tgwLdzJ+9jiJp4+7h7CaDhXvHDRC49W87K7iJZDVjOd8JeEkG3Jl/FlA2GvCzgmiiGL8FhxyO/Lfwu530nGT5j/gpwoPP9yZr66uskCMUjlpL+UFDc8Pq/IBJqzORKB74VCRWMoSn7LLZ+KEPGSxGu/jgxwWHbDHcfZdkMVnEjz7ol2SH+ZkvyhbZqP/6t/SSbDd9+csmi9Go/8Y3NJ3qghxMjzpQMrm+Cut4GXSH0JNQ+qbgjCiQ8gy0tqRqVYyXHagdVKq+MVA4oS8knFq+WfIDMWGtrhWU7du2/qNDzSOVLsKZ9YKQ7NmWq9qb2DXNwna6KQPRmuhB5zZOHO+xW0xWopckTjk0rTRHD2VxlOnjNzeNNqUDuNlkgyyN1gi/ghqhHsdZVMU4p+VwJMhyOFLM4SAGJSAO1rDzVU/hnREjrYa9MsKz9PURFHBWMHirx1rtdgKgOUDfGbnLAiKlmIUZ7Zgt+p3DifiRiYkjicSRiZ0zMzt3zMzskPY+cPDQR/fOPHDo4AN7++8/t3j//Yvn7mf6S38E/DL5HHKjyqTLKhG8CSbBeAtZIk3U7CvWWlCDeCIRr/iRxWE22d8miiZwQp+UzKClcuFceWSUd8qimT8gELrHOBArAZ2NqDPZXg3ypQkp5jHhzxQLPEozz5cdrzeiYFBp7qRWsnLADvpXJLWESbE+F0Uf/h04tPw5s13/k6741pH2zQ6jxejUC9WH+hdO9A09iqM9NtkEkccoLffNtgyOt7bZrZJg1cf7jmYT1449VzhL+Dp5AmLPCS3PDBZVESo2HnNY5A6CNgozSBCcqx1fBOIU5ngoZDF94K3wAASvy8FrjjyKOjr9PvqSSUs0S8lE2blqMYcoWKCvcFSpWV8Ux3O9A8cHQ5M1Zrssm5pH27a2tU+E5YBOtkifz/+UOnk8abVIjwj48c75wcGre2tqJLPsMkbCkx2JUUUEXZeepyeb9Fj2WdBLeo5KgAc12tumOvaGWAeWCIkBBOGDqPxMdV0tO1SAcCSWsgGlkAfENKFp72VsUV/Uhl8BdNJ2+pruO7JdxCkwLls6/9/+A1tpvHmMqs9jgIce/40MpnUCJ0EmieU8/iHgE0ejyY1RzIkNgBF9g34ZdguCbgZ4vsJuTaXiKNaQUPxKcA2vi8wucntFvxL0hLT4HlKkie/6g70DJ0ebt9UJok02GqvX13Vn2/dtrYv5KkWLA4cIsDtCmZ5/sb56ox9/rftgcvhYf001bxElh8HphjRvbMZukR0mHYetkoW+uHzOZNf8Af4t+RrwM4T2PFzF2K4lD9U6SPE4ngBx9P0LzQpW9K6aZmxnSxDlN7NJB8taQ7XNDfVUTo2r3osUEuuVAxSRJa2rc9b52Vj3fH/mUHTT4qxeZ7JXTr67et2O9q5p/3Bb53hz41gUP568urf3YP/widSOf36ggVgtLr3v43uVpvx1MyOR8bbWibbwaESrCfuWL+AX2Bl9UzIAnoAYtV9DQG9Ge9lXkpcbOf0XH11TbSoaAP6Whcu/xFsNsgMUIf95punHyRNWWWe4cLPBaJUhidrNjuw5NLj8W/yK9h4aJdD6ZI/HRPUZHBHidYQ/KODCS2DnqtPO5uaamuZEc7y9taappjEcLh6drXAvscoXQ0lZqk1Aj1bxMorPb+je39u7r7u/rTEe2x2P7+5MND4wFtjQ0LDBP9Y3uLN5Y1PTcPOOQTyW7YpNd3ZOx3p2Vrq2RWO7Ojp2xTon3bhutDe4vr5+fbB39MI/bO4LJv3+ZLBvs1bTJJZ/A/rzRVbTxJNgbFSB6Bsz+pb4IMvi6RuzmoxG2+p6pqmxTDOK2g+6UVZ/rSlnZg5FN75zVs+bHJVb31lVu6O9d2+8e6G/fbwJtKJlU1PDcDv5ImjF9s/d00DsJpde+fBuX3DDVVRZ8je0TLSCWjSPtUU2t2r4w/dtkDPRuhDiIY1/TA4sweRmaVR0cVo8rLPWVroA0BSj8dCu/c6HZbrU/ZCLxiN2u020rf7C9zvtLrsL/rM787NOu9vuZF8spzuH7kYDkDj2Pmwv1NYSWKGN/d7oWLFeBffnoU4co9vKprIP+0P1HGiJu6Cw8XgxaImF1M51d23YZbRILp3ZIktWo9zgqvZVdfuNUHMInOixGs0GyWz3+Go1udJM4iz73ZaHZpmULXi0xB3nKu7IkGnLHrnKaQNwqYFyJw7JLt0WMk1FuIgzGQ4qMasVG7HDZbfbBcoa4WkXfszhrrDnh11PlzGG2W8nfL8d7QPWa7+XYr+8Krxdo+Kgv5fquGiT4RLTGbcZ3+la+uUz+PdcHdRKtclq9gOuUTp9lq54EtazIWuQY+kOCyIFL0UdQaWVxw+JFiOk6/nNolm61Qa2zs2YjBbZYPjjR2WJ4RpbTuLd5CnIFR0s2NYUCvl1jTSt4TW/v+L86EtK5uhxj/702XecEkVY7tD1J6+WzfKTfP8r71n82SbeJpkNfd85ddP3ugWrsfAusHp5AA+Qf4Z9NJ7UlP2GrApVrivRENdq0mK0of5CUJospkPXX3cVpNB68fRtt98o6j+/ehN+w8vvWfz5Rp7t1YN+gjfjemRC6wq/f6OnbHiGsY/6ARMydtIN44GiDKgIRq1WE3vJ/y8/oT8HsJfeY64jMroLcK9GNckquyYDehpP5ikhkAJqymwvvQbRGBXtSBSKzdi6cmU2m5gykwPdDau12ca0GWwL9rub7Xdp24I4wF47l9nWylTJtuyv0baK6Fx1aXTAthqX93Ifgdx0AmzpF9qpvtWLJeL3mDheSmFB5EY9bIorn8pqoG1IRAIShTNGSGcxgkLqEIz1gn4/5B+GWRkbDKB0kkRmWXUl0WMYLzzX+ZqeY0c09GGkPZtMQFEpEU4685q31Z7MZqle7pnesQ3oHA82BAKNDaCHJrG2LBWgueXqg3lqGqxAdTnL89BShLvUL+rssc5SvKMg5O/v2dJ/ZCAUw1z9Qrw5HRg4muoYNku8x4NbscfesqVt9I7pcz+4eeh9R6ObY2FBkAVi33Bg9JZPjL/nl3eFktH4tpZEU8uefkye2f6eqa33zrcEDLqq3mQ405K8czoeSXqqRD7/vM5QVbXz3MbxU+mjz71z+/unLW43ZxY4s6HOd+jjuQ/++03528ydGzLHovH+5EJn4d87Fv4V46yl71fAbXZs/d8f/4v30uvzG889nb9juVHn54/AkJ7Cax/6uwL27yJ12+D+V3X+lX85qX3IFrIJ6pdv0t+8Lt+EXln+ObkD1aI/4Ye8E+0l70Ztl73/HPvt1pXX6Hp1mDeMXxzwe+QK+H31Env//s3DhzygrUWcr21NrveN7U3yl6fxz/Eh21foIPdcmSbSgRpe9/p7aO14mXtf/q/TJ7b+h5DCPUN/l/ImrzuNIn9SGU2jCShbI28EHxL+r8UV51AtOXyF/bvoe4mLPt9k7zP/8x/wo6V9KljWo31eKOtfzn7fq+FFUpfA70qy2Panlf1r0Y2SLN5+ZVrwN1Dz65LtNvrO4gp7d78+3r1u2myQG7681ufgH6P6S+rVG9kjsTYOg4wTkDjr4N440aMI2FA98aMEqYI/AfWRGBokTaw2/f/r8zjQ9FSB3//Iakzt8zCr8dbyTkL6V9Wh61EM/qrXzN8Odctr+TwF/htw4p79s3CkEf760RxaRI/RlxBvqE3hv1/VXr64kZ7X1U6TH5Q3rrHUxl9TuwvaM2sbX3mFNv0mtY/SptNf1I5ftn1sVXvx9TUhIJx5ze2Xb6yJh8Vny5t+cFW77/U1g2y4c1V7vtReeA3tP2iTulibXtNekF4wDl6m3f4mtRdok7df1D576WbyXtSufp3tU2a+1EbN519D+1KxWSRLn+X9Vqd1j/WrtpTtjO1l++SfrH3A/j379xz1rG0qazeuaX/r+F/F5pQu0VLOxT9Hc91JK1yoKa+GKvj9iP5isBn1oneCt3y/yQ1jWv/q0QGopjFvAG9vZ5U17WNkh5HWJ8iMGwp9DnXhjkKfR/X46kJfh6rxuwp9AeY/VuibUSf+EkqjY+g4OoVOoKvQQXQInURe1AEVVjs0L9oOMwtw3YKug/v70TXoWpRDR9E8zE3CM8cA/wWYp08NAMxJgD8G89fCuJGtdhJWvxYiVSu0g7AGhbgO7UMt8NQxdARmtfVOwDo3QGZ4HMYH0WGAPAq9G9jd1kvsPwzXIzB3GHBvQmHY74bC6l60Fda6Fv5OoOvhm+I6DHsdZViOs+eAJm/N2lW9tYDX2r3oegdh9jCMT6AowLSx1gs8OICGAKL3Ek9FLnruUjxcDbGT4XwtQFFsvWU7vfrqRV5rnL4WYKlEj8PctbDKtYxTLUw2B+H+BHCEnqRmHkVf2jq1hPF7sirW/gcPx5eQmPrMxmgdh5pp95EefUBv13N6bTQotAk1AhtJqSfMTxqe5J8EhTLA2JR6AiVZY2MODS414Du3TKnJO6eWuPnBpQAdPaa/BdQveef+7VMUJAufR/r0jXqnnpObH8XL71D5dy8RNPiQbl5Ag4P/D/C2+lMKZW5kc3RyZWFtCmVuZG9iagoxNjEgMCBvYmoKPDwvU3VidHlwZS9DSURGb250VHlwZTBDL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMzgxOT4+CnN0cmVhbQp42m1YCVwTV7efAJlBiKDGUV+id4JaEVRc0FbBnxWLuKNWUNsqryABIghIEmQpe9iURZKwVYEq7gqonU/BujytVT5bWxWXam19Fe1i+RStesZe+nvvToIkvvfNDxLO3Dvnnnvu//zPf5BQTk6URCIZEqJePS81Sf2ePkmbkDThfXW0Pi48SRwJFIYLI7bIkIAogZMIKgfBw1EY6VQik8yWOfbswGV/3flrkXQERUma3cmnAzsQ3GUjyV9yg2y0eKO/7C3K2YGSUO7UYGo45SFxkXCS8ZIpby4VEJkQoV4QqY7XaXSpU3wmTZr6XkJiapImOkanmjJp0tvjxc8ZqqiEJBUJVSXGqlKn6NTxWk1CvFYVkaqa46NaGL4uNmGTNlajCo+PVC30WeKjCk7YRG5qVGMT4lUR6pjwuChVQpTFhV6rTtKqopMS9IlaLx9VSIxGq9qUkBSrIt9J6jh1uFYdqdLHR6qTVLoYtWpe6IoQVVBCvE61WLOOLKtWTZigUmnValWMTpfoN3GiTh/tk5AUPTGKzNFOjLNO0k4Un5sQtDQ4ZMLiBe/NDV4x10eXorPsI1KtC9fEaX3+berfuBmckLQhPI4i1whqNOVJjaW8KG9qHDWe8qEmUpOoyZQvNY2aTvlTM6lZVAA1h3qPmk8toBZRi6klVDC1nHqfWkGFUiupVdR/Uh9T4VQEtY6KpDTUemoDFU8lUBupTVSaIzkkck2iJonH5UQVUf+SrJSckTx2UDqUObx0ZB1jHW86FTjdlY6QbqXltJm+xzgwC5lG5g9nT+ed/ab32+4yyEXt0ujyq+sa1/2uIBssM8v+6l/lNt4t0e2sO+ee6/6ze/eAeQOOD3SFALd0PomHQB6G8YM6eLjAyz8RjnzG1uQaU1EoNNDX5p3xiVqYmRKCsgvzDTmKbHNuJdpSUVJeghpv761oUV4/tf5DLpDZtixu61olHjht2VRObnj30qrfrl7cfb4dyQPnP2LqzMZaDrv9wsoPLZ4fqg1UBoU1nbnUcezF8S/yc1s4awxPLTE840Hg5SnCEYhiYcD4LuwWsCI28AME+8YzqbmGzAyzoY4721MfSvdZjzpp+aG5Jy5qritB1tUNA7mIAtbLb4b32Jk/dnffufv4yW2/UchtdPKruE0SaOIdBc9RbK1ha0opii3T7WlSQADDZ3+2vhEdaqz6jBfNpp17Dpah+lLj1lpFda7pk5CP1y5DOICJ0iZFF6H0zXmGTEWGKX/bZtRS1LgxWkGGlh1be+5Ts6m6b6ED4kJgYGvzKtJLUHSZdneL6PrCx20hn+TmZWUYC+qL0cGinYka8fGIquRDWrRem50cIZoaXWJsEUopNhRkKLLMeZ+eO9Z2AZGnDzfuailD20pMxhqFGx7Av1LwEjhEVlo+2npm3q8UXbSYb9HiMPo7DpDF5vqmH+Qd4ToewL6Kw0jMaUammMWuvxXedJ9FjkQw8pJLvOBCnB94wVblmbIMhcV5BrQodPXGICV28XwGMu4aA64Pu8DxwQ8rg8tReokxr1pZazTXceDE1BnMmRmG3FQUz7SuWdq4QImVKuyKh3HTGawEd+wOw79u39V2Eu1urN5eqRCXlPCSezz8iyx5sJOtzDXnGIqK8/LQR6uWaOcosWTWzefgcOsmONy7Fr6ynEsrrTDUKGvE5X5h6q2rpaBMpiUitD5YiRXjxuNhePDvE2Ho5csNzae5vfWf1lWTtLHJ0EIOqBn+g51BL8JV0tTCSuLIbKowl3NuW3hBz0v+5OE+CWM7GNkvGfAYA06YRTjRhrqmHr3GZkEiDWw3OMFILiKX9fD1Goewt6CHUTT0u+Hh9QbEL/HwSiyzH16XmXBxvM3TWZxNX/tw+aHZSuzq7YndSTVh964x4HrzYvPVE6SepvTVEywhBeXp7+flOfPuUxHo3bf9CdADk19lbRoEUj6VJ9U0kJevEdJhLXtH04w99iBM70huOKU4/+WJK+3n46K3ovTSivzeLF5k6vLNGZmGnJTNKHqvrjKs3PmM7RhXMe/kLF32nmJOswaGJiEYqK3XhSgWLwl7G8kPBcw/fKyQqysuMGYqxdncTCbVmFsrukXbmN3xZ3Vtxc7Y1XYTXJmnVV+fvyOeO8zhwZuXkGx/xLYV1WccQj9F+58ep8SDPX1wfzzk5WhQ/gKyE81VBBIFhcUFBi523Rz9EiWm/K88z+AISNkeF/rXuo6vupRdN5ZN2sa5gS//hLg8B9fZ6hxzNuqJp7Nzc7MIf1VxQjxdVWmu4rDKqco2lp1lG6sWcQCdPIwhBZNGgHBE+I6tzDdmlaGK2CCjWjl50co5XLCvjZM6caeXHR6u0tsrXxdhEHTCcruiXN5On2ptvrzjaFHRHvRFfumWLYpqwhwiSGAxD0csdedKFr0AaSJEUhBeaeeaw970xhUxeauUeLTvTzCcu86A9MFzcHvQEbG6HKWVVOTZqiLflGE5vAymJSykjtTgWyNJDXJcAIOnvHgLpv/zcl2TyCy1TL2VJIJ5GMLDMz7RAtQHvHy0cEHwsCJ1/HRafvfbsJX7STFKfVTYGTv/pgJpx9kDl1u5Ucy80JB5CDvbhUrTpw5vP9zM7T9Yc4BXyOOEsWdfgxevYH1mT/XxmX3/EZIP/v1G5++Prk/1Rm73kgXXTRIhD8pZU6HRUIZwN/hLS4uKthQps3Nys/O2GoxFHFzCXpj8Sg1FBYY8RXZlTlVZWUlpGQJxtrGs3GhSuEEVAcAuOGgNvmeMLTBhTC8nWotdpEQh/bPeXHOkbjm63npcKRzusM99jx5zdnYHXVdp9UPA8tuTQVD2JJCXtwtbXzubKsiwr90DLrgTT7Wz/7Y6kE/CU4Rmdq9+Z0IiUTKJO3V79uzcuRu9DpCcym4RhUNgra0g8VS8W9D/wdiQlWHz/EePfpzNEv3U927ULraLeIpdLP166v9dbL0xdPCCG3n6YS9raQT9LhumPWnsg7vxZOiWjrV52PUmR3pZ/FmSGiDoTTT44hfSNhomwwupqUcf8OZUc19eCRQ7PodZ4s/g4fKTthCgmb6w5uTyiPXJH0SiL/SxOz9WhsenfqTh5HfPBNhKswl39oWxnQOJrTQ1ROHIT54/cnBXs7LpQEwkh6/csKVTHP3qyP7GFmXzgfVqAgTr2OuEEHK9Ihap8Lk1HOxFp1gXqedu9Kyj8VdCidTDjtnfzIa3LYzZwjoavuopkZ4R6pv+z85hEA+7eHlrnyrTgJH+ft6FKUuiUxYtR/IrV2a/sdMwWxAw1HZAYVBBy/ddbN3Xclv5z6/Uizi8RWN7juTEuqq17Z/mhalkZ22wj4VZmIIh2ANz2AEPxTPwDCDfwMEI0uyGwjQUUcLiEeMxg6WYngAMqED1G/liwPlXTOPRqLetd1iVxC4IZ0Hu+RgPxvIxpLvhgd1jQQ6Dnj4GNxQxZOw7fqNHTSfN7Ke7fz7/0X+kBf/fbbJKnPTeBJAC/Y7GS5ZL0wsK8rMVOZU5ZlRbBsP+Ie2pwRxj2X5lb3H+P06z6sthRF+qWXCd8AwPePeDxKCVSN714xsCs85OYEKoLY9ekEwvaPtyw/dEwTx6Dq5cRDHr4+/rNXZmp4XH7tx/3P39NO8+FXii3VEIG8WWby4t3oqCYEDc05eKlwf+vEK2W7q1pLRcQVpado7BkJiGArFjJHb2VIw+NPI77ISidlTmVCotfeq1s7J2R/gacthn65/PAyd0REfaoYUUC0uKSwu4q3jgfk9MKVRxo4KwGyou2FxcKAr2qkqjcc92dA0cjkK/J4QX7ydDM3F3T/iVXUJXYZM0oyKTdOWa2hIx4RDFk5YngQE8tJK0/9yb9jjaDzwSDi8+5vzbwbYvvlHcm97hjXDJG/i2T9osW9JmQxQMo2/FHA/txG87n7ceCx4mDGUX+a/yIpIE0mAC3fFt6FIr7k9LYJ2l50pYc74prRbt2Kg3xytXf5jwjg/3FDszaTl5WZmVedu5m7hzHN1nwRVSU6bqmhxTGofnwUa6Gxyad7YqdzRk6xo5g7F0s1FZbTZX9+J80K986nE4yuuPy1cLW2Ece1p3LLIRbahPMM2qccYu9ZoD7YrL7Sd/vN0ettSqbnsb6zMbCacwfHhY3TLlyJnzff1OhIGHlruW1ZC/K91Zvmtv6va4GEXA3FCfSQGnLxehbZvzTb3yCDuJUqhG1MpoH7OGv5B0hby9/Hy1i7MWDAHqplZoaZV/L+SDM3st+Ch2rUfTapcUXlQc+/LgjVtn4sNE7WY0VFtDumJRwJl52WmokDkQE/bp+0qvOR8tXNYUDSPTOaCyjseuVaxcEOmL5Kq3gw63cUZGPqAmz5xFbEtE04ktqjMk32dxWMVE/eNU2jdKkP705S1OVM3CPBgmgWQY6yi4wJ/s4Q37IlEOHbkhPipqf/xRrpI+un/fYW49ju+V1ZuLtxRuUeSYcqst0hr1NRLw58FPZAMhlAW6Zw2mbcm4Dv49+pF21FRuw9FI0pn95tDp5uzq2gpTvcgtQIT6GILlt4i7wtPknaEyp6Boc0Ee0kUGpq1QBn186DQHDZBo1yQTwZXu00XYNYCxsTbeQc9u/+j3/wb6yD4Lc+Xzkm4rzZ8nNE9e5VIsNJ+Xn2EJ7gZ+SE+eO9d3StDVhwge2vUOLIrB3llNZBamf54KUnC6fx9oMrOJec23SSLPDxKLbQ8vj7GxPNENjF0/wbW0vHVpSPCG+crV6z4/xcE5e7oiozP/a9UPl9v3nj2H5PMX3Ox1jweekggCHsie+tvpA8bts2RBRiTRt6/1HLZ77yCU6ok7pSk09oZO6Td2+sdORvA0zOyRSa/S4CfIpLyNX4U64retz6+DHSvQeBq+h6fDPekZOw3M2GZso2FZjywQvyXFcjv+yLDNXkiDWaiT1vau9wkvfEH4SWrlp3SiFJ8w4PsuUNgRO76LKeyLPIm8vUU6lyM43gIKpqCIChY7hOH+Y8aEQX9wQA8YcGiF/t3dreQFwwG5if9lGyAoZWNGUBTlJ/7nrGbQpgZhWgMMamhooJGL0/T/kfXbInPlXXjX3aYScpWWlBlPHpDJdptKRUO8zsn6C12DX7L/CzXFMcgKZW5kc3RyZWFtCmVuZG9iagoxNjMgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAyND4+CnN0cmVhbQp42mtgYGDh/H1lVsG9csYf6Y4KADNDBn0KZW5kc3RyZWFtCmVuZG9iagoxNjUgMCBvYmoKPDwvU3VidHlwZS9DSURGb250VHlwZTBDL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMzc1OT4+CnN0cmVhbQp42n1YeVhTVxZ/IdwLYkRL+lwSee+5C4qitQyVWllUQJGKSq2tWlADpLJECPsedhLWsCpLVZxRWxQ1cal1rVqtS9XBjqPtuPDp+Nk6I5/V++hllvtekMR2vnl/hHC3c+45v/M7vxcJZW9PSSQSeqXqw8D0RFVAcmJSQqJHsDYyVr1BmAjix/KuehnDMxTPSnjOjh8n5UfbG2SSXJmdr0zafwpXjrXv+HUJcKUoyZ+Gk087uzeQTDaefJPvkE0Uhn+VTaIc7CgJ5UzJKSXFSYZIXCXur9ny25iwXhW8URWvVWvTZ8/w9JwTkKBJT1RHx2i52Z6eXtOFz3e4qIREjrjKCb5yqjStKj5JnRCfxK1P5/xncIsjN2xKSE3apOYi4zdyi2csncGFJqSSQTU3NSGeW6+KiYyN4hKixCOSk1SJSVx0YkKyJsltBrcyRp3EpSYkbuLI30RVrCoySbWRS47fqErktDEqLjB8xUpuUUK8lgtRbyBmVZyHB8clqVRcjFarmTtzpjY5ekZCYvTMKLImaWasZVHSTGGfx6L3Q1d6hAQHLAxdsXCGNk0r3mOjShupjk2a8b9C/9oYRZ6xlCs1gZpITac8qJmUJ/UW5U35UO9SvpQf5U8FUIFUEBVMLaFCqFBqGRVGLadWUuHUB9QqajUVQUVSG6hoSk19SsVR8dRmKolKlZJ0kMedchcSY0+lSpwkFZJ/2222OyadIG2Q/mofD0aBSjgKzoVF8L7DGodOh6eOsUMUQ3Y4bXTa79Q3dP3QB7LJskRZ4zDXYbnO7s4RzmeGzx2+bwQ3InnEnTeCkZ+z3oSmmNBRk4R/3EE3FlVlMFFwDt8G8CcwNVeXmVdbvJVFMog7+5NBrDCUlSsOTYNtTfVbhA3su/A+mgJQK+zAU8B8m22esL2xfguLFSiCxrkQvYeOgi3QOdOUaEILTGi0yeWxGT03y7P4QwO2w+FZ1A4MRkNNneL8CtNclUdaVjSTW1xUkK/Q1RYaKysNhmpmW7fJ2Km8bNasL9KXlhezWQvA1hVx1WuVmOH83Fl53pLjG3+8fnnn2W5G7psdBJ5A+S7Rk4kP6JB3lif5K0Njdh659uAkcjhypEi3lxWikGlCKpML/7k5wSzfxd9EwfSpTw8EdTC3urqOXVRcDzvmxeAGawBOw0kkIuE2EfkGyjW9T3seswmojl7ku3I6g6fAw0gFkDeUX7hq3rCOzcZb6AUBIXMZvBF+hTIBcoPyEQh+FRHOWqLSK0aFP2qWa/ge1ED3BtyY6BeyacFi5hzaBabDNGItp6akhZjH0v42W/tPYFsPkO9a9PnJmD8rEYdGozFoHBuZR2MHTHHYYW7ohR+QwwtEIXj3wvvejHOGiZeaJGiYWcqffEQbdXWFxYUlhQXMmmX+m32Vc5ae/QE59SIpevPg4dyMz9hGXUdcsaI0Guiqq0trlU119a1VbNsjYKgxVFUqjIW1uqxCXVoJU5oDumI+bFuqxO54NB6F3aZ+v/CXn9GsS4dZ5yw0Cs1Do11QLpo2B02T3+NHXqZ3az/7lMmDn2yIiozdnvIF2wAPH+w6xF5Cp+g9lin5sk82qKyT+81CwvhkgtljJin/N/QtXdVW0dauQI7+t7GEwRorBjvFNKltQKmBiEZvIHs0fjeruURn+oNxWixxm6bEbrCXTwZoAnx+bN6cvLLssuzXstJrlqfxd0WgZjIrIZLx35CMpFozshrngRvq1V/4KjGLR5LLjydQnHrT7+lfrnbe+JZAMW22CMU2AYrzUBKNHcdx2PEPy87fQw4vXyB47/wykhcCRH8TcjdJnpt4+qCUP48+pqs7Knc0K/4x7zqW4KkkqM6YwdI785HjfTTpywN1RbW64pKyYh2z6eP3kkOU7oEXH1bpjYZ6lpeb6H4n+Peue+eeKh9dWj5Xry8kBSPgvceEJpskfdP4bnrb5JrVs3w/8M9ickLBW1ZI9cAFuAe42WD8uqXqC0nV44XwBuoBKEwscpEIcBhsugBONJzovKrcbiot3c4eLarQ6xXNjQ3NQihRiAkdOChBFIEcj3LohsLqDAZ/YJMcFm7C7mDz0qiCVUo8NODCs7aK1qp2dms3QMN2IvgUOSpNh3IzO9gt+R2asqLS6NEFNdUl1cqm+gE0Vhj1BhGN+Tk6XTpBYzbYF/Vha7ASj8NjMMCTYtlMP1CcXJacosCye77I9eL11s4rTBfyA82wnVyOdeZlJs0fNSbJL+Y37/W58pMs1DQdpnuDq7FrdgcoSQLkWIFHul32+rn7/O6rF1jtRBCYtXhloBI72tzGAd59cuNBG3ufnwpOD3DhbOxBY2oSKUo7n1U37vzSiyQvfzi9ZB4j5EQEmoQvI/E51WEJzzp4ClWCinpDXZ3iu1WHfULXaEOXMKdRvZUNtrJnLGyw1iZTo8XLCEew6+BpZGxqApe++7zljPL63pi1xeW6skJ2FdaTLWk2W9rE+6MG4sM9tE9wIJPpn2y9ET/ZcotX5fdP/rAQnHQGdwvnDCZRqDnM2Qx1v+oW6SxmLWXGDVgTofj4ny68fa/8FF8/cG08B97hZQDboBE5iXDEb9uc+2/LIXLPCN5Mb89oSYqNi4vTtmRs/3z3rj2MFeZigykkdbsOYm8UgZaiUeBLYW9zk+gTbTWzDeIIPOUOPxRM+/90ux8FnTmAxuNFIMHGyVGD1xIjtH+kGa0FhmpDtYDKmgFUqvEcgDvEOPxkUz45lmTUFLewP4kxnGYNvXBgGznQJkAiA+HZ4ppcwUs0xOLm/wrRK4eedFjSqhatd1itT4E4DT/zRs/AVMt1BDc6rPQ5cD938TgRV37iEUZ4F78ARyHKQi/IP8J6XxtQudmmWUN62zmzvEvwQiwqNTyP9pKiNdTWKo7H7PsoMipl9UfMsVzN9ghlpDptTQQrP9VwEvjZEroAgkFC38IiySuPMlm1KB/kXeeOd+3Yq/zT9s2bisuLy4vYIHwN3LReVQ2/JsvOHd+3Y59y97bETRYVEYj/TBb9xtvyQ8TbQ4Penka1ojqpF2rx3dANaUsCGPmpLdfIlX/j4dpXAy0CJgZNC7VYQzy8fXt3yyXlNwfUH+frSwdq0bZLSQYcWZ+CqkzIxYQqUyX8ff4NuqGIJH82/BYlgsp6vd7Cdbm6goxiJgQnA09xxlBlqLH05JwCYWYJmfGBKa8c+iuMxi5gttXcAxiCE0Fpvl5fKsisuqY6Y2s18y1KBo/EmfKi8pKBGaMwc4nM/GglGB+4D7mQpRaG806kY8jxnnAvGSSsz9eaJL1m3p+QWj/qoxHt8xCTKsSeOAiH4TG3ZyEH9A6aiYJQOBOZS5OZMWSO9Qz6AdkhL6JiZiHm71d9sJ3QGnkJkSxSM+9CTruJqukX87uxHZ6Ix5KGy074ix+SoEloLOnwLBNZQBM70vF46OyQb+4jgKQvkNOji8vmiLywnISUlIOZnHOXD6BvLT4zk8GFVuT/Xt9lWy+MGXgQLQeEMdGbCDx+yUbm0/NmLXBjsEKka4L6ayciwlhnHGpCtAk9F7F0zCwfwT9EVfSzoNuYmr9CsyiIkT9u+dGiIiyZIERj199K7KYN4jucxLVuq8id7vAYiXzwnuNxt5RoHLmlAo1hI3X0uHFYiqFX2LU7jHz0Ly+JaAP3zwb6MM4TU/piUyWo57yUD55Mx/XkXL2uQJPPkAgNR28zDc16fa2iTmiWGekrIhhsj6esJZ1ppALbncbTtzU1NTYMnnGFnOGIntB3NEgafZGpKS2uLFbm5OTmsbvfagpaqMBTlxPZ44K9mGKClmIBLfVNLa1fH2KI1ppylCR5pEIQgBJB/En5kZdeqbvXhZ+o7VCUCWUMZOfRAOHFwQ/R+JS94YcdEew6f+6Wonvx139gcIWVM3+fsvescsWPSPEogMbA72K+CD+FvRzPWirsI34ivdA9hGMwJJI8AyAPeOmkoMcFCjgh4f/DA7p93f7IVR9ovLA9s60XkBafnpOfLVq4KdY6aRTCgFHI1jWxqzQWVGexOBB+iTaDZ2jUwe1HlNta8pPa2MKaivIaZTOJLOucYebtiBpafgSVHpXy2xBDn12zH1ONzHtGvT61zjGlLqN9q+Lw9YO3Ort0uW1MfWF7UomiNBYUVFeX1AxonuZrg92FVHt+XkoJsyc+ckuYEkvmLPP7uCMe0dnsP/L2JagUYfPWTPMJ23OosqLJUMsI67PFbpThDcpLy3V6RYGx0NhsrGutYiobQFTnsfTLSjS898Zd1vn9lL78VEkf6ONoAS66wpJsHdOv+VcIKNKVFZNkk531NVXN9Qyv6QsBNfUVVdWKgZbTZ8+H0zsQBP1rYCKG5bmggBBJc51gZwsRdj5i2sbbpK3KyujjLWJhLszyB+Vl+ly9otBQV1gz8PohaMrnpMETeL5DoGI8TdcX1hYUEzbPZ7QR8zNWKMNUOw9WGWoNtazQGYj4H3xrJW8JHWjo7wRjIh5qJfMWkuDleBsoyy8nL6DLT6pu/xW57usUiaiIENFYs7TP26KBSEd2s7KHgIuHYFaa18LZSt9VJ76vNzRWNrI30EPwPWyz9IJMFrtb7XwhbijNKsvMVsy4HPITsn/Rg8AORtjSOSC6xHeRHpOLPMKmI4kqycHK7TfhStwM5J+FLgqOD1RGxO02G/VVFTXkderM6zwjLCvNK8/LU7xvVl25evWPZ64Ib8vBxEN5nsXgZylECkv6JrySwNjmgGsQJxDop8F3yUvAlVcNjkgpG81igj39MnAdonLipAnaHoo8D0ltDpZaNx2H2BV3q5ERrIKYw0aAur9ysGokm5Vt/bIzkNB9417cCE5A5EWstA1YIcTLtxLfnYkJUe9gO7JxoGoJyWbiux7oLjgpLheRRoI4mI2t8GW/bBKeBLCLTU/OtorYJZCX8q2gacCa8CvcCF4pm+xKUdRc4Ve1wy6p7fzb7cilvb0dMk723v+RDdHLhpqczEN3Gg3kqTAY6r7aI5PtrKsQvgvP17Jh/M9vvqT/C3JvDvAKZW5kc3RyZWFtCmVuZG9iagoxNjcgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAyMz4+CnN0cmVhbQp42mtgYOCR4J0w4+Ot9w4X0wIBKGcGXAplbmRzdHJlYW0KZW5kb2JqCjEwIDAgb2JqCjw8L1R5cGUvT2JqU3RtL04gMTM3L0ZpcnN0IDExNDcvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAzODA3Pj4Kc3RyZWFtCnja1Vtbc9vGGX3vr8BbxGQE7v2S8XAqWZWjiR07tlI7YfBAiZDMViI1JJXa/77n212QAAnQVMK2qcacBfbyXc539oq1z1jGZeZ0xvFP4sVkQqmM+0xqlwmWKYuEZ9ojEZlFgUB9qVAt81pnAu2YRWoyzj3LhIUczjPhMq5QKDxEK5NJDtnGZmjJrWKZRD3HZIZH7pzLlIRSzTNUFQyyFRQxZzMtoN4wGAD9UG3wLmGlgWjFfGZgl3KwDKq10rAQpsBmK2EC0xmKhMM7XJRMw3QHUyDHc6TOw4dMCvjhYaKU5AwyFINVzBEGyIE30kAe5wpmGzjCUeSMJ4/hABMZJ6QYVYZJigcwkAPPM08ZZKDJlECmtUihCDYpAccsygVaOtSXKOdwTgVLOGpKQ2gjhb0OqChotJQq4AcrkaIAsCk44NBSAzvApjSAg3tKQy7Cogzc8QKpNJmHQGNgGgQZZHrUt4JchiCrEDm4pCws5hQhx1AV1joJRzlKnCEzqQSaOJijPNGHUdQojgx2eNgFYuABAIAfmhEziElME14SD1QFFNEchhNmWiAaHPW0gnQOT7Q2JvBSWwQexMq0s/QgQAggx0EveAY5kqghSLLLjAwsBEmUoQcLtsBnDlBBDcpRmfGEoIRtHNTioKGlaHBJ1KEYE9sVsQXWE5k5UgDJ4aA1iCvIYC3JUKjoYL2klGiF2FLPgCTHiCAIEEMMOfqV42hBqQhdCymCqhl1KJcRO8EdVAQbFNCHPU6jIxAHDBAxFGJLKtHSQi4o6KymDJQ4OMxJmQcHKfgIL0fMEWgO0Z6ow1HZW4Kb4GQCZOeEMFNwmRhlifkUIObQnGhMsjn5LwhLTVmKRFLkLYzSxFQHZ6mXoh+gLqEjBHommYZeSmWUpak/U6gdcH/2rP/h9dU/yuslni7uEWKMRW8Hg/75bEpZ53Av5byZz67flcth/83Zef+y/LRE/dFt+TwmpzG5KAaDv6Ddkypffn4o+yfT6WzZf/d4taS3l5PpP/uns/m4nA8ZDGBF/7v+Rf/5kMeXEzR7138xu5z1z46uP44eluU85z2Y+Ra+DMFOLV1OPR7ByMEirVlupD6wRtHQyE0e4ux8LmnMdLnl9kAaF1AymU1zUfPSmdwrYq7KJdjGjc5lNAP99OB6xaZe5UUuiWXa5lIGMxw7vL9yS69juaSZkLlcomOSHU6LA4dW1kOLATxXNMBxlVuaSyzLvVQH9lVux1Ypk2uayIAxBuZgCIbcgyveDq5UOQ0cGtwSNLPZHAuCA2OsGhhzkRsMkQI8shjOsW7JMYkd2FXVgjHD0OBpJWRzi5ER017ONT+wr7ruq7QYG2g417kGylhX5ELKA7uqt12VxuRO0LQJGnGyw+fCuoMr3qITxok8rNXAo7CmMxgzROXxxmTTP5c0s/2OaecPzlrbzdsnx/+hTX8WbP58dvTPNa15wlNY4fzfCP8vI/iUbo7FZMarbv7T2wv6Hd2PJnfL2bcfy7u72V9ny9nVLB+Xqx6PBS3GcdpryFzSAtdiCsG+SGOwc9wcyoiPy+XD4tt+f0u/d7mmLRRWYYarqB6rZ2x9cmbsoWPxcnI/WS6GR2ez6+N3y9F82Tt6QDGG3qL/w+i+bBTZwKBqSvgalayu51CGaWSInrWNDNnDvFHPUD3swOoZuudYyEh2OBqq326YG8tYZWzN2qoEe6W1EEhRXVJEEiI3ZIieM2sRsudslwSVJOgNCarn/FqC7nnWJcEkCW5DgulhY72SYHu+5pTrefVFZEjg95PxYuhCoOjgghLPY6K7BPheY1XXtMr3vF3bMel5V3vDa3Q6tf8aQNIZQy0rbALomKCZR/XERp7s0eFBPU+Gtm2e11eDjfXSyvp6DTpfqMtVQa7dIZfWI401wpZcHWQ03A8V6RinRe7jVc2pILyZU9ewWZeOUIKazSZ0pPJFXbKhS+3UhRBwvalLJSNMWwEZYb8YoG39gai0uiJu0oFZTFVKXU1k5LSILDaxAtOpoq8qDk147H/4+ZeMNrhW5opn08e7u2KzTFmQ0lVlUqzL6MjGYvFXlSleb0cnXlWB7SjQsqPAdBb4vVpoKXP04dYyZXWOnliVmW6H6so2y7oMlHqPgi1hbj9Ut8rUjjLbXabZjjK5A5Ad7YzczxZiG7ZlrqMMe0TO28uUNFh3VGVc7ecD7fFFrtuLBEwRvM09EU4jYEC7SM9qZjbbSTqm8R28bHS0ugt1rqAbn5WL5SKce4elS1hYTZZ35bOb8uaGMYWtrdGMWYkUP7RlxjM6X2RWxWeDeqYc7DhRezOal9NlOIslO37AiigcC7erNEkN5iwzTuptVBPyrwY7D7ZWylRdmWlXBtlREfl3lZ5t5fNg50nWhqI38/K3cA5e02o7tBJyLiFJLtHHh3FElSygPELXolywhD6hbFK+XdczerDz3Kvdyi44ZFRKCm0KPcUgGCESLKRY14zX6ziZMhkoBzuOO88n88VyBdXL0WIFVf/57BHGHstNyiSzZR1ct4OyPNlP4UxcCiBugbU5q9cR8zVtkndou44aFScy7ZYuWqRHxySrqxIdqijq14kJVQe53q1Sdqvsckhs9IgUVqN29Ih07pgCm7yJgU0T+XZgXd1l+YWx4GbNrbVBg51nkRuKEoN8N/EDuVUkt2WDHYe6FYF93U9Z91N0ELg+JsmuAXCcOtj1eoxtOM5TGjprd/zVJqFlfWyS9hDaGZOj+AsjqU7hGqd2MnU7vw4hsbgKaSvSW8vSbQ8SgzsGMSVrk4V+qoWDnae+FcNNPfK2PfKd8ZVrNGhED7ptQkPUBq8aajQA62qwNTU/9DoaW4Nb45C8srw+6KaXZDnv4Gyjo7ov+7QaeMMkMth5tLzCqq5EdSxGdM3xvYKmN9hTHwlkx0igqimj4qca7DiOr1CtjwTR/C+MBHVyVMOJrIfG1YToWO9tuZg9zq/LRRbVhROwN9jzr1SoarCdLvGO/Vltw7ZuHfenezSPO9ywj+Npa5d2esGALK4a6V5JSOJmMLqRxaEui5N8FhccWZzls0ipLI6fRdO4OC/tYVycZYp4BLgIH/TXAa1aLxKC63knbXPC9lWm7WpMVCtYMVBt9qgNe2R7e7tve9PaPrFpj/a+vb3cs70StfZbAKp2AGPI4ziSRc5mircbYroM0RuG6Pb2ft/27azXYs/2ut1+va9+7Z4OZAxGFvehWdw2Z7qdUabTEdM0xLQ7YvS+7dt7hHH7tl8dQQ1t9Mjylh5v5Z7yrNjo8XZHj2/HOe6gs7hZzuKZTGb8roBxnY7FYgepOk4V98rMov+qHE9Gp7NP4dODwdhpfXWl4Pm8HC1n86OXo8vyQ/avyfJj9hF65vPyprc1j1pd24Dd1DbB4nesDR+XH2fzav6sprVq+5mE0uJCpUUw/cK7TYpJqQufNMaP1+X86NP4t8nD+Ob+U/brkWBC0H7w114vuohJ92y0LI/OvkWRwV7CYja02n3D5FeMfdWLaLx+KKcnYYZOp1vnk2URMH81G5f9nxbl68fl3WSKEFDmy9FVebdAux8e7xdDFubis8FAhIf5YKCqHIAdT1DDBTUSXMlZT74U2BUlQqyfj5aju9ktsVQNjfSFFEP6+mSELRQbWq4L5YfaisKKoUbnM94Ujgp84fRQWF1wZqik4NwMHbI5d0MrkS9RTePdGDBPIkU+iXa24NYOtUfq2dAIg9Sil+hCCD6ki49eSTw71DGFIM2wQzjocayQnA0Vt6CxxDPqOAOr5VBIpErBFnihLGxDXW2GXgikUZa00McVXPNDJZFyixFTFErgnflCSdgF+5QRQ2scUhffodtoCSw4tc8kRgct6bIfXdqkO2I+03T7Db1JO7o85gqtYRPd4ARGWvuhUL6A/ZiqTFEEuJWNcPMsyI6oEtzQHOA2gFsHuAULcGsGuNGygl0m2BGtALcxAW5ylRuPeixCTeEhqJmKUHMZoTZ0Z7SCWEWItQkQS02XEVmEGAYFiFFHKg5XeIQaYQ5QywQ1T1BbF6DWsJ6glk5HqBEaglrKBDW9Gz6kqzlWIwyGwgFoCXqyxdgAuaYLrnRHytC9MEY3KjO6U6jpnhjd1YMfgDtAzulupFd4NniO0HPHC9SBHlFoq4bS0iVYlcLBCg1sON00RDuMC0MPviNEsBSL7kKamIS3rOUHuzeLCs1DIxgUkihCr0QUIFhIdL0lRX31qLdkOt6o7Jptve60j7NVGZ4bfoA/0UTOo7cYLEJK/rtVK7kWgLivHu1w099tR9WWH7bpx9rTwgaNxPiGo9siXDTWr4AvfDKfJXfaXa65qxtuF6vpj75trz6qP784o3cqEP3T0aIMpe9PX529+vDNj4+T638uRtPx8ensbhwanpWL6/nkAdNduIEaZvCLs3efF8vy/mJ6Mwtz/+1ksZx/PjoZz67KXv81fbGfTG+PLsaYsSfLzz1of3i4K+9pAmcY1s/eoyfK/vtwBTaJvJy9uDh7NXroV61qE3jTkP7J4josBTCx0Yl3eDnGUNJ/B6P+TvceMQ08fFdObj+mWie/3b6fjDFPo8MFaac0sx/TNfpjyegScrhM7GTRv8D8Mbk+md7elRnrn9+NbhfY7wgexH/G1P4M0850tiifserPscbfIF2XpcmrA1mCsKTFSLpCgtrnk7tSIEdvrIIa0aMc9qWw/W16PRsD/xWSx98lmMYj6JmFxVdc5FzOfppOULukG2C7FLfT5vTHDy9+rusHFR7vRvNt5pgDMoeJwBx7eOY4200cpWrEkdaiHadb8OHKtewgjunkjN7BmU5YV7RxW7TxT6BNp/x9mJM+Gzeo4/ekTs2Gk+8/nLx58Q0W0C8+z8vnj/PFbN7w84/xZJOA6Vsb6CMcI/oY0WLzNlMcV2uicGcSURSvEYXqrHlifY0nWujAL/ofKPQ/c3g7TewOmvhOmuyEsOIGxra4cVyRx8gnUGWXjuMaS/ZhThzaGszR7OnM+eX1xeXFjxsmRVT/E8RRm8Qxf4g4Yk/iYMSMxOFYfW8R55iLijr8d3FnF4h16ugmdewTqLNDxZOZsz1d6eqD178BvcPJgAplbmRzdHJlYW0KZW5kb2JqCjE2OCAwIG9iago8PC9UeXBlL1hSZWYvSURbPGMxMzFkZWZlZjc2MDcwMDQ2YWVmN2NjMTZhNmQ1ZDdiPjxjMTMxZGVmZWY3NjA3MDA0NmFlZjdjYzE2YTZkNWQ3Yj5dL1Jvb3QKMSAwIFIvSW5mbyAyIDAgUi9TaXplIDE2OS9XWzEgMiAyXS9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDM5OD4+CnN0cmVhbQp42iXS2VaSURTA8bOx1MhEjYoggYAGMRqoEA1FNJwaqNSwtAHLckgzNFNTGxyyq96Ai+68yNUL+Axetsx38KYHsO+/9s1v7f/+zvpuzjHG7O/bjN3MwgfIiXEYI/YFY8hPsChVPzWNbNbpNCjOoE4CL8EGRfAVPsMBOAjFUAKlcAjscBjK4AiUi/O7/tkBr8QV0qyA1+L6o1kJw+KOalbBiHhGNY/CmPhymk54I/7fmsdgXAI7msdhAlZhGdZhTUJxPXICJiWS0HTBO4l5NU9CXuJ7mm6YBg+ckoaMfqiGOrgNF+ESXIYrEIV68MJ1iIEPGuAG+CEBjXAamiAJzRCAIKQgDRGIQwu0wk3ohBB0wS04A7VwAc5CG7TDOeiAq3ANzkMNhOEOPIe78AAycA/uQx88hG7ogV7IwgD0wyN4DM/gCTyFGRiCFzAKb+E9TEnir/Vskzzq1JBF65hexRLMSTpr7dIbuvsC8zL8z9qNpHW3Ij/COn2UQl6nb1LY1mlBfu1ah7fmjPkPd7ZDPgplbmRzdHJlYW0KZW5kb2JqCnN0YXJ0eHJlZgo0ODUwNQolJUVPRgo=</File>
    </Filelist>
    <DatabaseInstall Type="post">
        <TableAlter Type="post" Name="customer_user">
            <ColumnAdd Name="group_id" Required="false" Size="100" Type="VARCHAR"></ColumnAdd>
        </TableAlter>
        <TableAlter Type="post" Name="customer_company">
            <ColumnAdd Name="group_id" Required="false" Size="100" Type="VARCHAR"></ColumnAdd>
        </TableAlter>
    </DatabaseInstall>
    <DatabaseUninstall Type="pre">
        <TableAlter Type="pre" Name="customer_user">
            <ColumnDrop Name="group_id"></ColumnDrop>
        </TableAlter>
        <TableAlter Type="pre" Name="customer_company">
            <ColumnDrop Name="group_id"></ColumnDrop>
        </TableAlter>
    </DatabaseUninstall>
</otrs_package>