<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>OneTimeAuthentificationLink</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-07-22 09:40:37" Version="11.0.4">Updated to OTOBO 11.0.17.</ChangeLog>
    <ChangeLog Date="2025-02-26 14:07:23" Version="11.0.3">Update to OTOBO 11.0.8.</ChangeLog>
    <ChangeLog Date="2024-10-07 08:56:43" Version="11.0.2">Updated to OTOBO 11.0.6.</ChangeLog>
    <ChangeLog Date="2024-04-02 14:10:20" Version="11.0.1">Initial Release on OTOBO 11.</ChangeLog>
    <Description Lang="en">Automatically creates customer users and gives them access via one time authentification tokens.</Description>
    <Framework>11.0.x</Framework>
    <BuildCommitID>8df0d920482cb3b3dc1eeec75dd694dc886e5de4</BuildCommitID>
    <BuildDate>2026-07-22 09:40:41</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/System/CustomerAuth.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL1N5c3RlbS9DdXN0b21lckF1dGgucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJBdXRoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtTWFpbnRlbmFuY2UnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGggLSBjdXN0b21lciBhdXRoZW50aWNhdGlvbiBtb2R1bGUuCgo9aGVhZDEgREVTQ1JJUFRJT04KClRoZSBhdXRoZW50aWNhdGlvbiBtb2R1bGUgZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2UuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpEb24ndCB1c2UgdGhlIGNvbnN0cnVjdG9yIGRpcmVjdGx5LCB1c2UgdGhlIE9iamVjdE1hbmFnZXIgaW5zdGVhZDoKCiAgICBteSAkQ3VzdG9tZXJBdXRoT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJE1haW5PYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGxvYWQgYXV0aCBtb2R1bGVzCiAgICBDT1VOVDoKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyOjpBdXRoTW9kdWxlJENvdW50Iik7CgogICAgICAgIG5leHQgQ09VTlQgaWYgISRHZW5lcmljTW9kdWxlOwoKICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgICAgICRNYWluT2JqZWN0LT5EaWUoIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUhICRAIik7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+eyJBdXRoQmFja2VuZCRDb3VudCJ9ID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0sIENvdW50ID0+ICRDb3VudCApOwogICAgfQoKICAgICMgbG9hZCAyZmFjdG9yIGF1dGggbW9kdWxlcwogICAgQ09VTlQ6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lcjo6QXV0aFR3b0ZhY3Rvck1vZHVsZSRDb3VudCIpOwoKICAgICAgICBuZXh0IENPVU5UIGlmICEkR2VuZXJpY01vZHVsZTsKCiAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICAgICAkTWFpbk9iamVjdC0+RGllKCJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRHZW5lcmljTW9kdWxlISAkQCIpOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPnsiQXV0aFR3b0ZhY3RvckJhY2tlbmQkQ291bnQifSA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9LCBDb3VudCA9PiAkQ291bnQgKTsKICAgIH0KCiAgICAjIEluaXRpYWxpemUgbGFzdCBlcnJvciBtZXNzYWdlCiAgICAkU2VsZi0+e0xhc3RFcnJvck1lc3NhZ2V9ID0gJyc7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgR2V0T3B0aW9uKCkKCkdldCBtb2R1bGUgb3B0aW9ucy4gQ3VycmVudGx5IHRoZXJlIGlzIGp1c3Qgb25lIG9wdGlvbiwgIlByZUF1dGgiLgoKICAgIGlmICggJEF1dGhPYmplY3QtPkdldE9wdGlvbiggV2hhdCA9PiAnUHJlQXV0aCcgKSApIHsKICAgICAgICBwcmludCAiTm8gbG9naW4gc2NyZWVuIGlzIG5lZWRlZC4gQXV0aGVudGljYXRpb24gaXMgYmFzZWQgb24gc29tZSBvdGhlciBvcHRpb25zLiBFLiBnLiAkRU5We1JFTU9URV9VU0VSfVxuIjsKICAgIH0KCj1jdXQKCnN1YiBHZXRPcHRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPntBdXRoQmFja2VuZH0tPkdldE9wdGlvbiglUGFyYW0pOwp9CgojIFJvdGhlciBPU1MgLyBPbmVUaW1lQXV0aGVudGljYXRpb25MaW5rCgo9Zm9yIHN0b3B3b3JkcyBhdXRoZW50aWZpY2F0aW9uCgo9aGVhZDIgRXh0ZW5kZWRQYXJhbU5hbWVzKCkKCkdldCBuYW1lcyBvZiBleHRlbmRlZCBwYXJhbXMgd2hpY2ggcHJvdmlkZSBhdXRoZW50aWZpY2F0aW9uIGluZm9ybWF0aW9uCgogICAgbXkgQFBhcmFtTmFtZXMgPSAkQXV0aE9iamVjdC0+RXh0ZW5kZWRQYXJhbU5hbWVzKCk7Cgo9Y3V0CgpzdWIgRXh0ZW5kZWRQYXJhbU5hbWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJU5hbWVzOwogICAgQ09VTlQ6CiAgICBmb3IgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICBuZXh0IENPVU5UIGlmICEkU2VsZi0+eyJBdXRoQmFja2VuZCRfIn07CiAgICAgICAgbmV4dCBDT1VOVCBpZiAhJFNlbGYtPnsiQXV0aEJhY2tlbmQkXyJ9LT5jYW4oJ0V4dGVuZGVkUGFyYW1OYW1lcycpOwoKICAgICAgICBmb3IgbXkgJEV4dE5hbWUgKCAkU2VsZi0+eyJBdXRoQmFja2VuZCRfIn0tPkV4dGVuZGVkUGFyYW1OYW1lcygpICkgewogICAgICAgICAgICAkTmFtZXN7JEV4dE5hbWV9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICgga2V5cyAlTmFtZXMgKTsKfQojIEVPIE9uZVRpbWVBdXRoZW50aWNhdGlvbkxpbmsKCj1oZWFkMiBBdXRoKCkKClRoZSBhdXRoZW50aWNhdGlvbiBmdW5jdGlvbi4KCiAgICBpZiAoICRBdXRoT2JqZWN0LT5BdXRoKCBVc2VyID0+ICRVc2VyLCBQdyA9PiAkUHcgKSApIHsKICAgICAgICBwcmludCAiQXV0aCBvayFcbiI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBwcmludCAiQXV0aCBpbnZhbGlkIVxuIjsKICAgIH0KCj1jdXQKCnN1YiBBdXRoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY3VzdG9tZXIgdXNlciBvYmplY3QKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHVzZSBhbGwgMTEgYXV0aCBiYWNrZW5kcyBhbmQgcmV0dXJuIG9uIGZpcnN0IHRydWUKICAgIG15ICRVc2VyOwogICAgQ09VTlQ6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgICMgbmV4dCBvbiBubyBjb25maWcgc2V0dGluZwogICAgICAgIG5leHQgQ09VTlQgaWYgISRTZWxmLT57IkF1dGhCYWNrZW5kJENvdW50In07CgogICAgICAgICMgY2hlY2sgYXV0aCBiYWNrZW5kCiAgICAgICAgJFVzZXIgPSAkU2VsZi0+eyJBdXRoQmFja2VuZCRDb3VudCJ9LT5BdXRoKCVQYXJhbSk7CgojIFJvdGhlciBPU1MgLyBPbmVUaW1lQXV0aGVudGljYXRpb25MaW5rCiAgICAgICAgaWYgKCByZWYgJFVzZXIgJiYgcmVmICRVc2VyIGVxICdIQVNIJyAmJiAkVXNlci0+e0Vycm9yfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXN0RXJyb3JNZXNzYWdlfSA9ICRVc2VyLT57RXJyb3J9OwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQojIEVPIE9uZVRpbWVBdXRoZW50aWNhdGlvbkxpbmsKCiAgICAgICAgIyBuZXh0IG9uIG5vIHN1Y2Nlc3MKICAgICAgICBpZiAoICEkVXNlciApIHsKCiAgICAgICAgICAgICMgZ2V0IGVycm9yIG1lc3NhZ2Ugb2YgYXV0aCBiYWNrZW5kIGlmIHByZXNlbnQKICAgICAgICAgICAgaWYgKCAkU2VsZi0+eyJBdXRoQmFja2VuZCRDb3VudCJ9LT57QXV0aEVycm9yfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGFzdEVycm9yTWVzc2FnZX0gPSAkU2VsZi0+eyJBdXRoQmFja2VuZCRDb3VudCJ9LT57QXV0aEVycm9yfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBDT1VOVDsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgMmZhY3RvciBhdXRoIGJhY2tlbmRzCiAgICAgICAgbXkgJFR3b0ZhY3RvckF1dGg7CiAgICAgICAgVFdPRkFDVE9SU09VUkNFOgogICAgICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgICAgICMgcmV0dXJuIG9uIG5vIGNvbmZpZyBzZXR0aW5nCiAgICAgICAgICAgIG5leHQgVFdPRkFDVE9SU09VUkNFIGlmICEkU2VsZi0+eyJBdXRoVHdvRmFjdG9yQmFja2VuZCRDb3VudCJ9OwoKICAgICAgICAgICAgIyAyZmFjdG9yIGJhY2tlbmQKICAgICAgICAgICAgbXkgJEF1dGhPayA9ICRTZWxmLT57IkF1dGhUd29GYWN0b3JCYWNrZW5kJENvdW50In0tPkF1dGgoCiAgICAgICAgICAgICAgICBUd29GYWN0b3JUb2tlbiA9PiAkUGFyYW17VHdvRmFjdG9yVG9rZW59LAogICAgICAgICAgICAgICAgVXNlciAgICAgICAgICAgPT4gJFVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRUd29GYWN0b3JBdXRoID0gJEF1dGhPayA/ICdwYXNzZWQnIDogJ2ZhaWxlZCc7CgogICAgICAgICAgICBsYXN0IFRXT0ZBQ1RPUlNPVVJDRSBpZiAkQXV0aE9rOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBhdCBsZWFzdCBvbmUgMmZhY3RvciBhdXRoIGJhY2tlbmQgd2FzIGNoZWNrZWQgYnV0IG5vbmUgd2FzIHN1Y2Nlc3NmdWwsCiAgICAgICAgIyBpdCBjb3VudHMgYXMgYSBmYWlsZWQgbG9naW4KICAgICAgICBpZiAoICRUd29GYWN0b3JBdXRoICYmICRUd29GYWN0b3JBdXRoIG5lICdwYXNzZWQnICkgewogICAgICAgICAgICAkVXNlciA9IHVuZGVmOwogICAgICAgICAgICBsYXN0IENPVU5UOwogICAgICAgIH0KCiAgICAgICAgIyByZW1lbWJlciBhdXRoIGJhY2tlbmQKICAgICAgICBpZiAoJFVzZXIpIHsKICAgICAgICAgICAgJEN1c3RvbWVyVXNlck9iamVjdC0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJ1VzZXJBdXRoQmFja2VuZCcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VyLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbGFzdCBDT1VOVDsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiByZWNvcmQgZXhpc3RzCiAgICBpZiAoICEkVXNlciApIHsKICAgICAgICBteSAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkUGFyYW17VXNlcn0gKTsKICAgICAgICBpZiAoJUN1c3RvbWVyRGF0YSkgewogICAgICAgICAgICBteSAkQ291bnQgPSAkQ3VzdG9tZXJEYXRhe1VzZXJMb2dpbkZhaWxlZH0gfHwgMDsKICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgICRDdXN0b21lclVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VyTG9naW5GYWlsZWQnLAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkQ3VzdG9tZXJEYXRhe1VzZXJMb2dpbn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgaXMgdmFsaWQKICAgIG15ICVDdXN0b21lckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRVc2VyICk7CiAgICBpZiAoIGRlZmluZWQgJEN1c3RvbWVyRGF0YXtWYWxpZElEfSAmJiAkQ3VzdG9tZXJEYXRhe1ZhbGlkSUR9IG5lIDEgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ3VzdG9tZXJVc2VyOiAnJFVzZXInIGlzIHNldCB0byBpbnZhbGlkLCBjYW4ndCBsb2dpbiEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkVXNlciBpZiAhJUN1c3RvbWVyRGF0YTsKCiAgICAjIHJlc2V0IGZhaWxlZCBsb2dpbnMKICAgICRDdXN0b21lclVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgIEtleSAgICA9PiAnVXNlckxvZ2luRmFpbGVkJywKICAgICAgICBWYWx1ZSAgPT4gMCwKICAgICAgICBVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59LAogICAgKTsKCiAgICAjIG9uIHN5c3RlbSBtYWludGVuYW5jZSBjdXN0b21lcnMKICAgICMgc2hvdWxkbid0IGJlIGFsbG93ZWQgZ2V0IGludG8gdGhlIHN5c3RlbQogICAgbXkgJEFjdGl2ZU1haW50ZW5hbmNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbU1haW50ZW5hbmNlJyktPlN5c3RlbU1haW50ZW5hbmNlSXNBY3RpdmUoKTsKCiAgICAjIGNoZWNrIGlmIHN5c3RlbSBtYWludGVuYW5jZSBpcyBhY3RpdmUKICAgIGlmICgkQWN0aXZlTWFpbnRlbmFuY2UpIHsKCiAgICAgICAgJFNlbGYtPntMYXN0RXJyb3JNZXNzYWdlfSA9CiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnU3lzdGVtTWFpbnRlbmFuY2U6OklzQWN0aXZlRGVmYXVsdExvZ2luRXJyb3JNZXNzYWdlJykKICAgICAgICAgICAgfHwgVHJhbnNsYXRhYmxlKCJJdCBpcyBjdXJyZW50bHkgbm90IHBvc3NpYmxlIHRvIGxvZ2luIGR1ZSB0byBhIHNjaGVkdWxlZCBzeXN0ZW0gbWFpbnRlbmFuY2UuIik7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxhc3QgbG9naW4gcHJlZmVyZW5jZXMgdXBkYXRlCiAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKCiAgICAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICBLZXkgICAgPT4gJ1VzZXJMYXN0TG9naW4nLAogICAgICAgIFZhbHVlICA9PiAkRGF0ZVRpbWVPYmplY3QtPlRvRXBvY2goKSwKICAgICAgICBVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59LAogICAgKTsKCiAgICByZXR1cm4gJFVzZXI7Cn0KCj1oZWFkMiBQcmVBdXRoKCkKCkNhbGwgdGhlIFByZUF1dGggbWV0aG9kIG9mIHRoZSBBdXRoQmFja2VuZAoKICAgIG15ICRQcmVBdXRoSW5mbyA9ICRBdXRoT2JqZWN0LT5QcmVBdXRoKAogICAgICAgIFJlcXVlc3RlZFVSTCA9PiAkUmVxdWVzdGVkVVJMLAogICAgKTsKCj1jdXQKCnN1YiBQcmVBdXRoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0F1dGhCYWNrZW5kfS0+Y2FuKCdQcmVBdXRoJyk7CgogICAgcmV0dXJuICRTZWxmLT57QXV0aEJhY2tlbmR9LT5QcmVBdXRoKCVQYXJhbSk7Cn0KCj1oZWFkMiBQb3N0QXV0aCgpCgpDYWxsIHRoZSBQb3N0QXV0aCBtZXRob2Qgb2YgdGhlIEF1dGhCYWNrZW5kCgogICAgbXkgJFBvc3RBdXRoSW5mbyA9ICRBdXRoT2JqZWN0LT5Qb3N0QXV0aCgpOwoKPWN1dAoKc3ViIFBvc3RBdXRoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0F1dGhCYWNrZW5kfS0+Y2FuKCdQb3N0QXV0aCcpOwoKICAgIHJldHVybiAkU2VsZi0+e0F1dGhCYWNrZW5kfS0+UG9zdEF1dGgoJVBhcmFtKTsKfQoKPWhlYWQyIExvZ291dCgpCgpDYWxsIHRoZSBMb2dvdXQgbWV0aG9kIG9mIHRoZSBBdXRoQmFja2VuZAoKICAgIG15ICRMb2dvdXRJbmZvID0gJEF1dGhPYmplY3QtPkxvZ291dCgpOwoKPWN1dAoKc3ViIExvZ291dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJFNlbGYtPntBdXRoQmFja2VuZH0tPmNhbignTG9nb3V0Jyk7CgogICAgcmV0dXJuICRTZWxmLT57QXV0aEJhY2tlbmR9LT5Mb2dvdXQoJVBhcmFtKTsKfQoKPWhlYWQyIEdldExhc3RFcnJvck1lc3NhZ2UoKQoKUmV0cmlldmUgJFNlbGYtPntMYXN0RXJyb3JNZXNzYWdlfSBjb250ZW50LgoKICAgIG15ICRBdXRoRXJyb3JNZXNzYWdlID0gJEF1dGhPYmplY3QtPkdldExhc3RFcnJvck1lc3NhZ2UoKTsKCiAgICBSZXN1bHQ6CgogICAgICAgICRBdXRoRXJyb3JNZXNzYWdlID0gIkFuIGVycm9yIHN0cmluZyBtZXNzYWdlLiI7Cgo9Y3V0CgpzdWIgR2V0TGFzdEVycm9yTWVzc2FnZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e0xhc3RFcnJvck1lc3NhZ2V9Owp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/TemplateGenerator.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA4YzdkZmMyYzc2NDA2OTljOGUwMmMwYmFiNzI4MTNhNGE3YjgzNDVhIC0gS2VybmVsL1N5c3RlbS9UZW1wbGF0ZUdlbmVyYXRvci5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcjsKCiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RPQk86OlBlcmw6OkxheW91dE9iamVjdCkKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKCiMgQ1BBTiBtb2R1bGVzCnVzZSBVUkk6OkVzY2FwZSBxdyh1cmlfZXNjYXBlX3V0ZjggdXJpX3VuZXNjYXBlKTsgICAgIyMgbm8gcGVybGltcG9ydHMsIG1ldGhvZHMgYXJlIHVzZWQgaW4gYSBzdWJzdGl0dXRpb24KCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpMYW5ndWFnZSAgICAgICAgICAgICAgKCk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6QXV0b1Jlc3BvbnNlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q29tbXVuaWNhdGlvbkNoYW5uZWwnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAojIFJvdGhlciBPU1MgLyBPbmVUaW1lQXV0aGVudGljYXRpb25MaW5rCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aDo6T25lVGltZUF1dGhMaW5rJywKIyBFTyBPbmVUaW1lQXV0aGVudGljYXRpb25MaW5rCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkVuY29kZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U2FsdXRhdGlvbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNpZ25hdHVyZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCiAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3IgLSB0ZW1wbGF0ZSBnZW5lcmF0b3IgbGliCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCB0ZW1wbGF0ZSBnZW5lcmF0b3IgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKRG9uJ3QgdXNlIHRoZSBjb25zdHJ1Y3RvciBkaXJlY3RseSwgdXNlIHRoZSBPYmplY3RNYW5hZ2VyIGluc3RlYWQ6CgogICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHt9LCAkVHlwZTsKCiAgICAkU2VsZi0+e1JpY2hUZXh0fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0Jyk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgU2FsdXRhdGlvbigpCgpnZW5lcmF0ZSBzYWx1dGF0aW9uCgogICAgbXkgJFNhbHV0YXRpb24gPSAkVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QtPlNhbHV0YXRpb24oCiAgICAgICAgVGlja2V0SUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgID0+IDEyMywKICAgICAgICBEYXRhICAgICA9PiAkQXJ0aWNsZUhhc2hSZWYsCiAgICApOwoKcmV0dXJucwogICAgVGV4dAogICAgQ29udGVudFR5cGUKCj1jdXQKCnN1YiBTYWx1dGF0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaWNrZXRJRCBEYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IHRpY2tldC4KICAgIG15ICVUaWNrZXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKCiAgICAjIEdldCBxdWV1ZS4KICAgIG15ICVRdWV1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUdldCgKICAgICAgICBJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgKTsKCiAgICAjIEdldCBzYWx1dGF0aW9uLgogICAgbXkgJVNhbHV0YXRpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2FsdXRhdGlvbicpLT5TYWx1dGF0aW9uR2V0KAogICAgICAgIElEID0+ICRRdWV1ZXtTYWx1dGF0aW9uSUR9LAogICAgKTsKCiAgICAjIGRvIHRleHQvcGxhaW4gdG8gdGV4dC9odG1sIGNvbnZlcnQKICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gJiYgJFNhbHV0YXRpb257Q29udGVudFR5cGV9ID1+IC90ZXh0XC9wbGFpbi9pICkgewogICAgICAgICRTYWx1dGF0aW9ue0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICRTYWx1dGF0aW9ue1RleHR9ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgICAgICBTdHJpbmcgPT4gJFNhbHV0YXRpb257VGV4dH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRvIHRleHQvaHRtbCB0byB0ZXh0L3BsYWluIGNvbnZlcnQKICAgIGlmICggISRTZWxmLT57UmljaFRleHR9ICYmICRTYWx1dGF0aW9ue0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvaHRtbC9pICkgewogICAgICAgICRTYWx1dGF0aW9ue0NvbnRlbnRUeXBlfSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAkU2FsdXRhdGlvbntUZXh0fSAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvQXNjaWkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkU2FsdXRhdGlvbntUZXh0fSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGxpc3QgdW5zdXBwb3J0ZWQgdGFncyBmb3Igc3RhbmRhcmQgdGVtcGxhdGUKICAgIG15IEBMaXN0T2ZVblN1cHBvcnRlZFRhZyA9IHF3KE9UT0JPX0FHRU5UX1NVQkpFQ1QgT1RPQk9fQUdFTlRfQk9EWSBPVE9CT19DVVNUT01FUl9CT0RZIE9UT0JPX0NVU1RPTUVSX1NVQkpFQ1QpOwoKICAgIG15ICRTYWx1dGF0aW9uVGV4dCA9ICRTZWxmLT5fUmVtb3ZlVW5TdXBwb3J0ZWRUYWcoCiAgICAgICAgVGV4dCAgICAgICAgICAgICAgICAgPT4gJFNhbHV0YXRpb257VGV4dH0gfHwgJycsCiAgICAgICAgTGlzdE9mVW5TdXBwb3J0ZWRUYWcgPT4gXEBMaXN0T2ZVblN1cHBvcnRlZFRhZywKICAgICk7CgogICAgIyByZXBsYWNlIHBsYWNlIGhvbGRlciBzdHVmZgogICAgJFNhbHV0YXRpb25UZXh0ID0gJFNlbGYtPl9SZXBsYWNlKAogICAgICAgIFJpY2hUZXh0ICAgPT4gJFNlbGYtPntSaWNoVGV4dH0sCiAgICAgICAgVGV4dCAgICAgICA9PiAkU2FsdXRhdGlvblRleHQsCiAgICAgICAgVGlja2V0RGF0YSA9PiBcJVRpY2tldCwKICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtEYXRhfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGFkZCB1cmxzCiAgICBpZiAoICRTZWxmLT57UmljaFRleHR9ICkgewogICAgICAgICRTYWx1dGF0aW9uVGV4dCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+TGlua1F1b3RlKAogICAgICAgICAgICBTdHJpbmcgPT4gJFNhbHV0YXRpb25UZXh0LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTYWx1dGF0aW9uVGV4dDsKfQoKPWhlYWQyIFNpZ25hdHVyZSgpCgpnZW5lcmF0ZSBzYWx1dGF0aW9uCgogICAgbXkgJFNpZ25hdHVyZSA9ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdC0+U2lnbmF0dXJlKAogICAgICAgIFRpY2tldElEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxMjMsCiAgICAgICAgRGF0YSAgICAgPT4gJEFydGljbGVIYXNoUmVmLAogICAgKTsKCm9yCgogICAgbXkgJFNpZ25hdHVyZSA9ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdC0+U2lnbmF0dXJlKAogICAgICAgIFF1ZXVlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgPT4gMTIzLAogICAgICAgIERhdGEgICAgPT4gJEFydGljbGVIYXNoUmVmLAogICAgKTsKCnJldHVybnMKICAgIFRleHQKICAgIENvbnRlbnRUeXBlCgo9Y3V0CgpzdWIgU2lnbmF0dXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhEYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG5lZWQgdGlja2V0IGlkIG9yIHF1ZXVlIGlkCiAgICBpZiAoICEkUGFyYW17VGlja2V0SUR9ICYmICEkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFRpY2tldElEIG9yIFF1ZXVlSUQhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgR2V0IHRpY2tldCBkYXRhLgogICAgbXkgJVRpY2tldDsKICAgIGlmICggJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZXQgcXVldWUuCiAgICBteSAlUXVldWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVHZXQoCiAgICAgICAgSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSB8fCAkUGFyYW17UXVldWVJRH0sCiAgICApOwoKICAgICMgR2V0IHNpZ25hdHVyZS4KICAgIG15ICVTaWduYXR1cmUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2lnbmF0dXJlJyktPlNpZ25hdHVyZUdldCgKICAgICAgICBJRCA9PiAkUXVldWV7U2lnbmF0dXJlSUR9LAogICAgKTsKCiAgICAjIGRvIHRleHQvcGxhaW4gdG8gdGV4dC9odG1sIGNvbnZlcnQKICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gJiYgJFNpZ25hdHVyZXtDb250ZW50VHlwZX0gPX4gL3RleHRcL3BsYWluL2kgKSB7CiAgICAgICAgJFNpZ25hdHVyZXtDb250ZW50VHlwZX0gPSAndGV4dC9odG1sJzsKICAgICAgICAkU2lnbmF0dXJle1RleHR9ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgICAgICBTdHJpbmcgPT4gJFNpZ25hdHVyZXtUZXh0fSwKICAgICAgICApOwogICAgfQoKICAgICMgZG8gdGV4dC9odG1sIHRvIHRleHQvcGxhaW4gY29udmVydAogICAgaWYgKCAhJFNlbGYtPntSaWNoVGV4dH0gJiYgJFNpZ25hdHVyZXtDb250ZW50VHlwZX0gPX4gL3RleHRcL2h0bWwvaSApIHsKICAgICAgICAkU2lnbmF0dXJle0NvbnRlbnRUeXBlfSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAkU2lnbmF0dXJle1RleHR9ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9Bc2NpaSgKICAgICAgICAgICAgU3RyaW5nID0+ICRTaWduYXR1cmV7VGV4dH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBsaXN0IHVuc3VwcG9ydGVkIHRhZ3MgZm9yIHN0YW5kYXJkIHRlbXBsYXRlCiAgICBteSBATGlzdE9mVW5TdXBwb3J0ZWRUYWcgPSBxdyhPVE9CT19BR0VOVF9TVUJKRUNUIE9UT0JPX0FHRU5UX0JPRFkgT1RPQk9fQ1VTVE9NRVJfQk9EWSBPVE9CT19DVVNUT01FUl9TVUJKRUNUKTsKCiAgICBteSAkU2lnbmF0dXJlVGV4dCA9ICRTZWxmLT5fUmVtb3ZlVW5TdXBwb3J0ZWRUYWcoCiAgICAgICAgVGV4dCAgICAgICAgICAgICAgICAgPT4gJFNpZ25hdHVyZXtUZXh0fSB8fCAnJywKICAgICAgICBMaXN0T2ZVblN1cHBvcnRlZFRhZyA9PiBcQExpc3RPZlVuU3VwcG9ydGVkVGFnLAogICAgKTsKCiAgICAjIHJlcGxhY2UgcGxhY2UgaG9sZGVyIHN0dWZmCiAgICAkU2lnbmF0dXJlVGV4dCA9ICRTZWxmLT5fUmVwbGFjZSgKICAgICAgICBSaWNoVGV4dCAgID0+ICRTZWxmLT57UmljaFRleHR9LAogICAgICAgIFRleHQgICAgICAgPT4gJFNpZ25hdHVyZVRleHQsCiAgICAgICAgVGlja2V0RGF0YSA9PiBcJVRpY2tldCwKICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtEYXRhfSwKICAgICAgICBRdWV1ZUlEICAgID0+ICRQYXJhbXtRdWV1ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGFkZCB1cmxzCiAgICBpZiAoICRTZWxmLT57UmljaFRleHR9ICkgewogICAgICAgICRTaWduYXR1cmVUZXh0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5MaW5rUXVvdGUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkU2lnbmF0dXJlVGV4dCwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkU2lnbmF0dXJlVGV4dDsKfQoKPWhlYWQyIFNlbmRlcigpCgpnZW5lcmF0ZSBzZW5kZXIgYWRkcmVzcyAoRlJPTSBzdHJpbmcpIGZvciBlbWFpbHMKCiAgICBteSAkU2VuZGVyID0gJFRlbXBsYXRlR2VuZXJhdG9yT2JqZWN0LT5TZW5kZXIoCiAgICAgICAgUXVldWVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICA9PiAxMjMsCiAgICApOwoKcmV0dXJuczoKCiAgICBKb2huIERvZSBhdCBTdXBlciBTdXBwb3J0IDxzZXJ2aWNlQGV4YW1wbGUuY29tPgoKYW5kIGl0IHJldHVybnMgdGhlIHF1b3RlZCByZWFsIG5hbWUgaWYgbmVjZXNzYXJ5CgogICAgIkpvaG4gRG9lLCBTdXBwb3J0IiA8c2VydmljZUBleGFtcGxlLnRsZD4KCj1jdXQKCnN1YiBTZW5kZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KCBVc2VySUQgUXVldWVJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBzZW5kZXIgYXR0cmlidXRlcwogICAgbXkgJUFkZHJlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0U3lzdGVtQWRkcmVzcygKICAgICAgICBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSwKICAgICk7CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjaGVjayBjb25maWcgZm9yIGFnZW50IHJlYWwgbmFtZQogICAgbXkgJFVzZUFnZW50UmVhbE5hbWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RGVmaW5lRW1haWxGcm9tJyk7CiAgICBpZiAoICRVc2VBZ2VudFJlYWxOYW1lICYmICRVc2VBZ2VudFJlYWxOYW1lID1+IC9eKEFnZW50TmFtZXxBZ2VudE5hbWVTeXN0ZW1BZGRyZXNzTmFtZSkkLyApIHsKCiAgICAgICAgIyBnZXQgZGF0YSBmcm9tIGN1cnJlbnQgYWdlbnQKICAgICAgICBteSAlVXNlckRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgTm9PdXRPZk9mZmljZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgc2V0IHJlYWwgbmFtZSB3aXRoIHVzZXIgbmFtZQogICAgICAgIGlmICggJFVzZUFnZW50UmVhbE5hbWUgZXEgJ0FnZW50TmFtZScgKSB7CgogICAgICAgICAgICAjIGNoZWNrIGZvciB1c2VyIGRhdGEKICAgICAgICAgICAgaWYgKCAkVXNlckRhdGF7VXNlckZ1bGxuYW1lfSApIHsKCiAgICAgICAgICAgICAgICAjIHJld3JpdGUgUmVhbE5hbWUKICAgICAgICAgICAgICAgICRBZGRyZXNze1JlYWxOYW1lfSA9ICIkVXNlckRhdGF7VXNlckZ1bGxuYW1lfSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IHJlYWwgbmFtZSB3aXRoIHVzZXIgbmFtZQogICAgICAgIGlmICggJFVzZUFnZW50UmVhbE5hbWUgZXEgJ0FnZW50TmFtZVN5c3RlbUFkZHJlc3NOYW1lJyApIHsKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIHVzZXIgZGF0YQogICAgICAgICAgICBpZiAoICRVc2VyRGF0YXtVc2VyRnVsbG5hbWV9ICkgewoKICAgICAgICAgICAgICAgICMgcmV3cml0ZSBSZWFsTmFtZQogICAgICAgICAgICAgICAgbXkgJFNlcGFyYXRvciA9ICcgJyAuICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpEZWZpbmVFbWFpbEZyb21TZXBhcmF0b3InKQogICAgICAgICAgICAgICAgICAgIHx8ICcnOwogICAgICAgICAgICAgICAgJEFkZHJlc3N7UmVhbE5hbWV9ID0gJFVzZXJEYXRhe1VzZXJGdWxsbmFtZX0gLiAkU2VwYXJhdG9yIC4gJyAnIC4gJEFkZHJlc3N7UmVhbE5hbWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgRm9ybWF0IHNlbmRlciByZWFsIG5hbWUgYW5kIGFkZHJlc3MgY29tcGxpYW50IHRvIFJGQyA1MzIyLiBUaGlzIGlzIHJlbGV2YW50IHdoZW4gdGhlIHJlYWwgbmFtZSBjb250YWluIGNvbW1hcwogICAgIyBvciBvdGhlciBzcGVjaWFsIHN5bWJvbHMuCiAgICByZXR1cm4gTWFpbDo6QWRkcmVzcy0+bmV3KCAkQWRkcmVzc3tSZWFsTmFtZX0sICRBZGRyZXNze0VtYWlsfSApLT5mb3JtYXQoKTsKfQoKPWhlYWQyIFRlbXBsYXRlKCkKCmdlbmVyYXRlIHRlbXBsYXRlCgogICAgbXkgJFRlbXBsYXRlID0gJFRlbXBsYXRlR2VuZXJhdG9yT2JqZWN0LT5UZW1wbGF0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBUaWNrZXRJRCAgID0+IDEyMywgICAgICAgICAgICAgICAgICAjIE9wdGlvbmFsCiAgICAgICAgRGF0YSAgICAgICA9PiAkQXJ0aWNsZUhhc2hSZWYsICAgICAgIyBPcHRpb25hbAogICAgICAgIFVzZXJJRCAgICAgPT4gMTIzLAogICAgKTsKClJldHVybnM6CgogICAgJFRlbXBsYXRlID0gJ1NvbWUgdGV4dCc7Cgo9Y3V0CgpzdWIgVGVtcGxhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnKTsKCiAgICBteSAlVGVtcGxhdGUgPSAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdC0+U3RhbmRhcmRUZW1wbGF0ZUdldCgKICAgICAgICBJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICApOwoKICAgICMgZG8gdGV4dC9wbGFpbiB0byB0ZXh0L2h0bWwgY29udmVydAogICAgaWYgKAogICAgICAgICRTZWxmLT57UmljaFRleHR9CiAgICAgICAgJiYgJFRlbXBsYXRle0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvcGxhaW4vaQogICAgICAgICYmICRUZW1wbGF0ZXtUZW1wbGF0ZX0KICAgICAgICApCiAgICB7CiAgICAgICAgJFRlbXBsYXRle0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICRUZW1wbGF0ZXtUZW1wbGF0ZX0gICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgU3RyaW5nID0+ICRUZW1wbGF0ZXtUZW1wbGF0ZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRvIHRleHQvaHRtbCB0byB0ZXh0L3BsYWluIGNvbnZlcnQKICAgIGlmICgKICAgICAgICAhJFNlbGYtPntSaWNoVGV4dH0KICAgICAgICAmJiAkVGVtcGxhdGV7Q29udGVudFR5cGV9ID1+IC90ZXh0XC9odG1sL2kKICAgICAgICAmJiAkVGVtcGxhdGV7VGVtcGxhdGV9CiAgICAgICAgKQogICAgewogICAgICAgICRUZW1wbGF0ZXtDb250ZW50VHlwZX0gPSAndGV4dC9wbGFpbic7CiAgICAgICAgJFRlbXBsYXRle1RlbXBsYXRlfSAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9Bc2NpaSgKICAgICAgICAgICAgU3RyaW5nID0+ICRUZW1wbGF0ZXtUZW1wbGF0ZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEdldCB1c2VyIGxhbmd1YWdlLgogICAgbXkgJExhbmd1YWdlOwogICAgbXkgJVRpY2tldDsKICAgIGlmICggZGVmaW5lZCAkUGFyYW17VGlja2V0SUR9ICkgewoKICAgICAgICAjIEdldCB0aWNrZXQgZGF0YS4KICAgICAgICAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgR2V0IHJlY2lwaWVudC4KICAgICAgICBteSAlVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICApOwogICAgICAgICRMYW5ndWFnZSA9ICRVc2Vye1VzZXJMYW5ndWFnZX07CiAgICB9CgogICAgIyBJZiB0ZW1wbGF0ZSB0eXBlIGlzICdDcmVhdGUnIGFuZCB0aGVyZSBpcyBjdXN0b21lciB1c2VyIGluZm9ybWF0aW9uLCB0cmVhdCBpdCBhcyBhIHRpY2tldCBwYXJhbSBpbiBvcmRlciB0bwogICAgIyBjb3JyZWN0bHkgcmVwbGFjZSBjdXN0b21lciB1c2VyIHRhZ3MuIFNlZSBidWcjMTQ0NTUuCiAgICBpZiAoICRUZW1wbGF0ZXtUZW1wbGF0ZVR5cGV9IGVxICdDcmVhdGUnICYmICRQYXJhbXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJFRpY2tldHtDdXN0b21lclVzZXJJRH0gPSAkUGFyYW17Q3VzdG9tZXJVc2VySUR9OwogICAgfQoKICAgICMgaWYgY3VzdG9tZXIgbGFuZ3VhZ2UgaXMgbm90IGRlZmluZWQsIHNldCBkZWZhdWx0IGxhbmd1YWdlCiAgICAkTGFuZ3VhZ2UgLy89ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRGVmYXVsdExhbmd1YWdlJykgfHwgJ2VuJzsKCiAgICAjIGdldCBsaXN0IHVuc3VwcG9ydGVkIHRhZ3MgZm9yIHN0YW5kYXJkIHRlbXBsYXRlCiAgICBteSBATGlzdE9mVW5TdXBwb3J0ZWRUYWcgPSBxdyhPVE9CT19BR0VOVF9TVUJKRUNUIE9UT0JPX0FHRU5UX0JPRFkgT1RPQk9fQ1VTVE9NRVJfQk9EWSBPVE9CT19DVVNUT01FUl9TVUJKRUNUKTsKCiAgICBteSAlU3VwcG9ydGVkVHlwZXMgPSAoCiAgICAgICAgQW5zd2VyICA9PiAxLAogICAgICAgIEZvcndhcmQgPT4gMSwKICAgICAgICBOb3RlICAgID0+IDEsCiAgICApOwoKICAgIG15ICRUZW1wbGF0ZVRleHQgPSAkVGVtcGxhdGV7VGVtcGxhdGV9IHx8ICcnOwogICAgbXkgJFRlbXBsYXRlVHlwZSA9ICRUZW1wbGF0ZXtUZW1wbGF0ZVR5cGV9OwoKICAgICMgUmVtb3ZlIHVuc3VwcG9ydGVkIHRhZ3Mgb25seSBmb3Igc29tZSB0ZW1wbGF0ZSB0eXBlcy4KICAgIGlmICggISRTdXBwb3J0ZWRUeXBlc3sgJFRlbXBsYXRle1RlbXBsYXRlVHlwZX0gfSApIHsKICAgICAgICAkVGVtcGxhdGVUZXh0ID0gJFNlbGYtPl9SZW1vdmVVblN1cHBvcnRlZFRhZygKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgICAgICAgPT4gJFRlbXBsYXRle1RlbXBsYXRlfSB8fCAnJywKICAgICAgICAgICAgTGlzdE9mVW5TdXBwb3J0ZWRUYWcgPT4gXEBMaXN0T2ZVblN1cHBvcnRlZFRhZywKICAgICAgICApOwoKICAgICAgICAjIFJlc2V0IHRlbXBsYXRlIHR5cGUgZm9yIHVuc3VwcG9ydGVkIHRhZy4KICAgICAgICAkVGVtcGxhdGVUeXBlID0gJyc7CiAgICB9CgogICAgIyByZXBsYWNlIHBsYWNlIGhvbGRlciBzdHVmZgogICAgJFRlbXBsYXRlVGV4dCA9ICRTZWxmLT5fUmVwbGFjZSgKICAgICAgICBSaWNoVGV4dCAgID0+ICRTZWxmLT57UmljaFRleHR9LAogICAgICAgIFRleHQgICAgICAgPT4gJFRlbXBsYXRlVGV4dCB8fCAnJywKICAgICAgICBUaWNrZXREYXRhID0+IFwlVGlja2V0LAogICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte0RhdGF9IHx8IHt9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgTGFuZ3VhZ2UgICA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgVGVtcGxhdGUgICA9PiAkVGVtcGxhdGVUeXBlLAogICAgKTsKCiAgICBpZiAoICRTZWxmLT57UmljaFRleHR9ICkgewogICAgICAgICRUZW1wbGF0ZVRleHQgPX4gcy8mbHQ7LzwvZzsKICAgICAgICAkVGVtcGxhdGVUZXh0ID1+IHMvJmd0Oy8+L2c7CiAgICAgICAgJFRlbXBsYXRlVGV4dCA9fiBzLyZxdW90Oy8iL2c7CiAgICAgICAgJFRlbXBsYXRlVGV4dCA9fiBzLyZhcG9zOy8nL2c7CiAgICAgICAgJFRlbXBsYXRlVGV4dCA9fiBzLyZuYnNwOy8gL2c7CiAgICB9CgogICAgcmV0dXJuICRUZW1wbGF0ZVRleHQ7Cn0KCj1oZWFkMiBHZW5lcmljQWdlbnRBcnRpY2xlKCkKCmdlbmVyYXRlIGludGVybmFsIG9yIGV4dGVybmFsIG5vdGVzCgogICAgbXkgJEdlbmVyaWNBZ2VudEFydGljbGUgPSAkVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QtPkdlbmVyaWNBZ2VudEFydGljbGUoCiAgICAgICAgTm90aWZpY2F0aW9uID0+ICROb3RpZmljYXRpb25EYXRhSGFzaFJlZiwKICAgICAgICBUaWNrZXRJRCAgICAgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxMjMsCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRBcnRpY2xlSGFzaFJlZiwgICAgICAgICAgICAgIyBPcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmljQWdlbnRBcnRpY2xlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaWNrZXRJRCBOb3RpZmljYXRpb24gVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVRlbXBsYXRlID0gJXsgJFBhcmFte05vdGlmaWNhdGlvbn0gfTsKCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgR2V0IHRpY2tldCBkYXRhLgogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKCiAgICAjIGRvIHRleHQvcGxhaW4gdG8gdGV4dC9odG1sIGNvbnZlcnQKICAgIGlmICgKICAgICAgICAkU2VsZi0+e1JpY2hUZXh0fQogICAgICAgICYmICRUZW1wbGF0ZXtDb250ZW50VHlwZX0gPX4gL3RleHRcL3BsYWluL2kKICAgICAgICAmJiAkVGVtcGxhdGV7Qm9keX0KICAgICAgICApCiAgICB7CiAgICAgICAgJFRlbXBsYXRle0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICRUZW1wbGF0ZXtCb2R5fSAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgU3RyaW5nID0+ICRUZW1wbGF0ZXtCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgICMgZG8gdGV4dC9odG1sIHRvIHRleHQvcGxhaW4gY29udmVydAogICAgaWYgKAogICAgICAgICEkU2VsZi0+e1JpY2hUZXh0fQogICAgICAgICYmICRUZW1wbGF0ZXtDb250ZW50VHlwZX0gPX4gL3RleHRcL2h0bWwvaQogICAgICAgICYmICRUZW1wbGF0ZXtCb2R5fQogICAgICAgICkKICAgIHsKICAgICAgICAkVGVtcGxhdGV7Q29udGVudFR5cGV9ID0gJ3RleHQvcGxhaW4nOwogICAgICAgICRUZW1wbGF0ZXtCb2R5fSAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvQXNjaWkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkVGVtcGxhdGV7Qm9keX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJlcGxhY2UgcGxhY2UgaG9sZGVyIHN0dWZmCiAgICAkVGVtcGxhdGV7Qm9keX0gPSAkU2VsZi0+X1JlcGxhY2UoCiAgICAgICAgUmljaFRleHQgICA9PiAkU2VsZi0+e1JpY2hUZXh0fSwKICAgICAgICBUZXh0ICAgICAgID0+ICRUZW1wbGF0ZXtCb2R5fSwKICAgICAgICBSZWNpcGllbnQgID0+ICRQYXJhbXtSZWNpcGllbnR9LAogICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte0RhdGF9IHx8IHt9LAogICAgICAgIFRpY2tldERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CiAgICAkVGVtcGxhdGV7U3ViamVjdH0gPSAkU2VsZi0+X1JlcGxhY2UoCiAgICAgICAgUmljaFRleHQgICA9PiAwLAogICAgICAgIFRleHQgICAgICAgPT4gJFRlbXBsYXRle1N1YmplY3R9LAogICAgICAgIFJlY2lwaWVudCAgPT4gJFBhcmFte1JlY2lwaWVudH0sCiAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17RGF0YX0gfHwge30sCiAgICAgICAgVGlja2V0RGF0YSA9PiBcJVRpY2tldCwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAkVGVtcGxhdGV7U3ViamVjdH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICBTdWJqZWN0ICAgICAgPT4gJFRlbXBsYXRle1N1YmplY3R9IHx8ICcnLAogICAgICAgIFR5cGUgICAgICAgICA9PiAnTmV3JywKICAgICk7CgogICAgIyBhZGQgVVJMcyBhbmQgdmVyaWZ5IHRvIGJlIGZ1bGwgSFRNTCBkb2N1bWVudAogICAgaWYgKCAkU2VsZi0+e1JpY2hUZXh0fSApIHsKCiAgICAgICAgJFRlbXBsYXRle0JvZHl9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5MaW5rUXVvdGUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkVGVtcGxhdGV7Qm9keX0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJVRlbXBsYXRlOwp9Cgo9aGVhZDIgQXR0cmlidXRlcygpCgptb2RpZmllcyBpbnBsYWNlIHRoZSBwYXNzZWQgaW4gQzxEYXRhPiBoYXNoIHJlZmVyZW5jZSBhbmQgcmV0dXJucyB0aGUgZW5yaWNoZWQgZGF0YS4KCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBTdWJqZWN0ID0+ICdXaGF0IGRvIHlvdSB3YW50IHRvIHRhbGsgYWJvdXQ/JwogICAgKTsKCiAgICBteSAlRW5yaWNoZWREYXRhID0gJFRlbXBsYXRlR2VuZXJhdG9PYmplY3QtPkF0dHJpYnV0ZXMoCiAgICAgICAgVGlja2V0SUQgICA9PiAxMjMsCiAgICAgICAgRGF0YSAgICAgICA9PiBcJURhdGEsICAgICMgJERhdGF7U3ViamVjdH0gaXMgdXNlZCBhcyBpbnB1dCBmb3IgZmluZGluZyB0aGUgbmV3IHN1YmplY3QKICAgICAgICBVc2VySUQgICAgID0+IDEyMywKICAgICAgICBBY3Rpb24gICAgID0+ICdGb3J3YXJkJywgIyBSZWxldmFudCBmb3IgdGhlIHN1YmplY3QuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUG9zc2libGUgdmFsdWVzIGFyZSAnUmVwbHknIGFuZCAnRm9yd2FyZCcsICdSZXBseScgaXMgZXZlbnR1YWxseSB0aGUgZGVmYXVsdC4KICAgICk7CgpSZXR1cm5zIHRoZSBtb2RpZmllZCBoYXNoIHJlZmVyZW5jZSBhcyBrZXkgdmFsdWUgcGFpcnMuIFRoZSBwb3RlbnRpYWxseSBhZGRlZCBvciBjaGFuZ2VkIGl0ZW0gYXJlOgoKPW92ZXIgNAoKPWl0ZW0gU3ViamVjdAoKPWl0ZW0gRnJvbQoKPWJhY2sKCj1jdXQKCnN1YiBBdHRyaWJ1dGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaWNrZXRJRCBEYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgZ2V0IHRpY2tldCBkYXRhLCBpbmNsdWRpbmcgdGhlIHF1ZXVlIGlkCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICApOwoKICAgICMgcHJlcGFyZSBzdWJqZWN0IC4uLgogICAgJFBhcmFte0RhdGF9LT57U3ViamVjdH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICBTdWJqZWN0ICAgICAgPT4gJFBhcmFte0RhdGF9LT57U3ViamVjdH0gfHwgJycsCiAgICAgICAgQWN0aW9uICAgICAgID0+ICRQYXJhbXtBY3Rpb259ICAgICAgICAgIHx8ICcnLCAgICAjIFRpY2tldFN1YmplY3RCdWlsZCgpIGZhbGxzIGJhY2sgdG8gdGhlIGRlZmF1bHQgJ1JlcGx5JwogICAgKTsKCiAgICAjIGdldCBzZW5kZXIgYWRkcmVzcwogICAgJFBhcmFte0RhdGF9LT57RnJvbX0gPSAkU2VsZi0+U2VuZGVyKAogICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICBVc2VySUQgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFBhcmFte0RhdGF9LT4lKjsKfQoKPWhlYWQyIEF1dG9SZXNwb25zZSgpCgpnZW5lcmF0ZSByZXNwb25zZQoKQXV0b1Jlc3BvbnNlCiAgICBUaWNrZXRJRAogICAgICAgIE93bmVyCiAgICAgICAgUmVzcG9uc2libGUKICAgICAgICBDVVNUT01FUl9EQVRBCiAgICBBcnRpY2xlSUQKICAgICAgICBDVVNUT01FUl9TVUJKRUNUCiAgICAgICAgQ1VTVE9NRVJfRU1BSUwKICAgIFVzZXJJRAoKICAgIFRvCiAgICBDYwogICAgQmNjCiAgICBTdWJqZWN0CiAgICBCb2R5CiAgICBDb250ZW50VHlwZQoKICAgIG15ICVBdXRvUmVzcG9uc2UgPSAkVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QtPkF1dG9SZXNwb25zZSgKICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+IDEyMywKICAgICAgICBPcmlnSGVhZGVyICAgICAgID0+IHt9LAogICAgICAgIEF1dG9SZXNwb25zZVR5cGUgPT4gJ2F1dG8gcmVwbHknLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBBdXRvUmVzcG9uc2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFRpY2tldElEIEF1dG9SZXNwb25zZVR5cGUgT3JpZ0hlYWRlciBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIEdldCB0aWNrZXQgZGF0YS4KICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgIyBnZXQgYXV0byBkZWZhdWx0IHJlc3BvbnNlcwogICAgbXkgJUF1dG9SZXNwb25zZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRvUmVzcG9uc2UnKS0+QXV0b1Jlc3BvbnNlR2V0QnlUeXBlUXVldWVJRCgKICAgICAgICBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgVHlwZSAgICA9PiAkUGFyYW17QXV0b1Jlc3BvbnNlVHlwZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJUF1dG9SZXNwb25zZTsKCiAgICAjIGdldCBvbGQgYXJ0aWNsZSBmb3IgcXVvdGluZwogICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CiAgICBteSBAQXJ0aWNsZUxpc3QgICA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICBUaWNrZXRJRCAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgU2VuZGVyVHlwZSA9PiAnY3VzdG9tZXInLAogICAgICAgIE9ubHlMYXN0ICAgPT4gMSwKICAgICk7CgogICAgaWYgKCAhQEFydGljbGVMaXN0ICkgewogICAgICAgIEBBcnRpY2xlTGlzdCA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgT25seUxhc3QgICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIGlmIChAQXJ0aWNsZUxpc3QpIHsKICAgICAgICBteSAlQXJ0aWNsZSA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSggJXsgJEFydGljbGVMaXN0WzBdIH0gKS0+QXJ0aWNsZUdldCggJXsgJEFydGljbGVMaXN0WzBdIH0gKTsKCiAgICAgICAgZm9yIG15ICRLZXkgKHF3KEZyb20gVG8gQ2MgU3ViamVjdCBCb2R5KSkgewogICAgICAgICAgICBpZiAoICEkUGFyYW17T3JpZ0hlYWRlcn0tPnskS2V5fSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtPcmlnSGVhZGVyfS0+eyRLZXl9ID0gJEFydGljbGV7JEtleX0gfHwgJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2hvbXAgJFBhcmFte09yaWdIZWFkZXJ9LT57JEtleX07CiAgICAgICAgfQogICAgfQoKICAgICMgZm9ybWF0IGJvZHkgKG9ubHkgaWYgbG9uZ2VyIHRoYW4gODYgY2hhcnMpCiAgICBpZiAoICRQYXJhbXtPcmlnSGVhZGVyfS0+e0JvZHl9ICkgewogICAgICAgIGlmICggbGVuZ3RoICRQYXJhbXtPcmlnSGVhZGVyfS0+e0JvZHl9ID4gODYgKSB7CiAgICAgICAgICAgIG15IEBMaW5lcyA9IHNwbGl0IC9cbi8sICRQYXJhbXtPcmlnSGVhZGVyfS0+e0JvZHl9OwogICAgICAgICAgICBMSU5FOgogICAgICAgICAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgICAgICAgICAgbXkgJExpbmVXcmFwcGVkID0gJExpbmUgPX4gcy8oXj4uK3wuezQsODZ9KSg/OlxzfFx6KS8kMVxuL2dtOwoKICAgICAgICAgICAgICAgIG5leHQgTElORSBpZiAkTGluZVdyYXBwZWQ7CgogICAgICAgICAgICAgICAgIyBpZiB0aGUgcmVnZXggZG9lcyBub3QgbWF0Y2ggdGhlbiB3ZSBuZWVkCiAgICAgICAgICAgICAgICAjIHRvIGFkZCB0aGUgbWlzc2luZyBuZXcgbGluZSBvZiB0aGUgc3BsaXQKICAgICAgICAgICAgICAgICMgZWxzZSB3ZSB3aWxsIGxvc2UgZS5nLiBlbXB0eSBsaW5lcyBvZiB0aGUgYm9keS4KICAgICAgICAgICAgICAgICMgKGJ1ZyMxMDY3OSkKICAgICAgICAgICAgICAgICRMaW5lIC49ICJcbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte09yaWdIZWFkZXJ9LT57Qm9keX0gPSBqb2luICcnLCBATGluZXM7CiAgICAgICAgfQogICAgfQoKICAgICMgZmlsbCB1cCByZXF1aXJlZCBhdHRyaWJ1dGVzCiAgICBmb3IgbXkgJEtleSAocXcoU3ViamVjdCBCb2R5KSkgewogICAgICAgIGlmICggISRQYXJhbXtPcmlnSGVhZGVyfS0+eyRLZXl9ICkgewogICAgICAgICAgICAkUGFyYW17T3JpZ0hlYWRlcn0tPnskS2V5fSA9ICJObyAkS2V5IjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcmVjaXBpZW50CiAgICBteSAlVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICBVc2VyID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCB1c2VyIGxhbmd1YWdlCiAgICBteSAkTGFuZ3VhZ2UgPSAkVXNlcntVc2VyTGFuZ3VhZ2V9IHx8ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRGVmYXVsdExhbmd1YWdlJykgfHwgJ2VuJzsKCiAgICAjIGRvIHRleHQvcGxhaW4gdG8gdGV4dC9odG1sIGNvbnZlcnQKICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gJiYgJEF1dG9SZXNwb25zZXtDb250ZW50VHlwZX0gPX4gL3RleHRcL3BsYWluL2kgKSB7CiAgICAgICAgJEF1dG9SZXNwb25zZXtDb250ZW50VHlwZX0gPSAndGV4dC9odG1sJzsKICAgICAgICAkQXV0b1Jlc3BvbnNle1RleHR9ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgICAgICBTdHJpbmcgPT4gJEF1dG9SZXNwb25zZXtUZXh0fSwKICAgICAgICApOwogICAgfQoKICAgICMgZG8gdGV4dC9odG1sIHRvIHRleHQvcGxhaW4gY29udmVydAogICAgaWYgKCAhJFNlbGYtPntSaWNoVGV4dH0gJiYgJEF1dG9SZXNwb25zZXtDb250ZW50VHlwZX0gPX4gL3RleHRcL2h0bWwvaSApIHsKICAgICAgICAkQXV0b1Jlc3BvbnNle0NvbnRlbnRUeXBlfSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAkQXV0b1Jlc3BvbnNle1RleHR9ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9Bc2NpaSgKICAgICAgICAgICAgU3RyaW5nID0+ICRBdXRvUmVzcG9uc2V7VGV4dH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJlcGxhY2UgcGxhY2UgaG9sZGVyIHN0dWZmCiAgICAkQXV0b1Jlc3BvbnNle1RleHR9ID0gJFNlbGYtPl9SZXBsYWNlKAogICAgICAgIFJpY2hUZXh0ID0+ICRTZWxmLT57UmljaFRleHR9LAogICAgICAgIFRleHQgICAgID0+ICRBdXRvUmVzcG9uc2V7VGV4dH0sCiAgICAgICAgRGF0YSAgICAgPT4gewogICAgICAgICAgICAleyAkUGFyYW17T3JpZ0hlYWRlcn0gfSwKICAgICAgICAgICAgRnJvbSA9PiAkUGFyYW17T3JpZ0hlYWRlcn0tPntUb30sCiAgICAgICAgICAgIFRvICAgPT4gJFBhcmFte09yaWdIZWFkZXJ9LT57RnJvbX0sCiAgICAgICAgfSwKICAgICAgICBUaWNrZXREYXRhICAgICAgPT4gXCVUaWNrZXQsCiAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIExhbmd1YWdlICAgICAgICA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgQWRkVGltZXpvbmVJbmZvID0+IHsKICAgICAgICAgICAgQXV0b1Jlc3BvbnNlID0+IDEsCiAgICAgICAgfSwKICAgICk7CiAgICAkQXV0b1Jlc3BvbnNle1N1YmplY3R9ID0gJFNlbGYtPl9SZXBsYWNlKAogICAgICAgIFJpY2hUZXh0ID0+IDAsCiAgICAgICAgVGV4dCAgICAgPT4gJEF1dG9SZXNwb25zZXtTdWJqZWN0fSwKICAgICAgICBEYXRhICAgICA9PiB7CiAgICAgICAgICAgICV7ICRQYXJhbXtPcmlnSGVhZGVyfSB9LAogICAgICAgICAgICBGcm9tID0+ICRQYXJhbXtPcmlnSGVhZGVyfS0+e1RvfSwKICAgICAgICAgICAgVG8gICA9PiAkUGFyYW17T3JpZ0hlYWRlcn0tPntGcm9tfSwKICAgICAgICB9LAogICAgICAgIFRpY2tldERhdGEgICAgICA9PiBcJVRpY2tldCwKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgTGFuZ3VhZ2UgICAgICAgID0+ICRMYW5ndWFnZSwKICAgICAgICBBZGRUaW1lem9uZUluZm8gPT4gewogICAgICAgICAgICBBdXRvUmVzcG9uc2UgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICAkQXV0b1Jlc3BvbnNle1N1YmplY3R9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgU3ViamVjdCAgICAgID0+ICRBdXRvUmVzcG9uc2V7U3ViamVjdH0sCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOZXcnLAogICAgICAgIE5vQ2xlYW51cCAgICA9PiAxLAogICAgKTsKCiAgICAjIGdldCBzZW5kZXIgYXR0cmlidXRlcyBiYXNlZCBvbiBhdXRvIHJlc3BvbnNlIHR5cGUKICAgIGlmICggJEF1dG9SZXNwb25zZXtTeXN0ZW1BZGRyZXNzSUR9ICkgewoKICAgICAgICBteSAlQWRkcmVzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NHZXQoCiAgICAgICAgICAgIElEID0+ICRBdXRvUmVzcG9uc2V7U3lzdGVtQWRkcmVzc0lEfSwKICAgICAgICApOwoKICAgICAgICAkQXV0b1Jlc3BvbnNle1NlbmRlckFkZHJlc3N9ICA9ICRBZGRyZXNze05hbWV9OwogICAgICAgICRBdXRvUmVzcG9uc2V7U2VuZGVyUmVhbG5hbWV9ID0gJEFkZHJlc3N7UmVhbG5hbWV9OyAgICAjIG5vdGUgdGhhdCBTeXN0ZW1BZGRyZXNzKCkgZG9lcyBub3QgY2FwaXRhbGl6ZSB0aGUgJ24nCiAgICB9CgogICAgIyBnZXQgc2VuZGVyIGF0dHJpYnV0ZXMgYmFzZWQgb24gcXVldWUKICAgIGVsc2UgewoKICAgICAgICBteSAlQWRkcmVzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5HZXRTeXN0ZW1BZGRyZXNzKAogICAgICAgICAgICBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgJEF1dG9SZXNwb25zZXtTZW5kZXJBZGRyZXNzfSAgPSAkQWRkcmVzc3tFbWFpbH07CiAgICAgICAgJEF1dG9SZXNwb25zZXtTZW5kZXJSZWFsbmFtZX0gPSAkQWRkcmVzc3tSZWFsTmFtZX07CiAgICB9CgogICAgIyBhZGQgdXJscyBhbmQgdmVyaWZ5IHRvIGJlIGZ1bGwgaHRtbCBkb2N1bWVudAogICAgaWYgKCAkU2VsZi0+e1JpY2hUZXh0fSApIHsKCiAgICAgICAgJEF1dG9SZXNwb25zZXtUZXh0fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+TGlua1F1b3RlKAogICAgICAgICAgICBTdHJpbmcgPT4gJEF1dG9SZXNwb25zZXtUZXh0fSwKICAgICAgICApOwoKICAgICAgICAkQXV0b1Jlc3BvbnNle1RleHR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Eb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICBTdHJpbmcgPT4gJEF1dG9SZXNwb25zZXtUZXh0fSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlQXV0b1Jlc3BvbnNlOwp9Cgo9aGVhZDIgTm90aWZpY2F0aW9uRXZlbnQoKQoKcmVwbGFjZSBhbGwgT1RPQk8gc21hcnQgdGFncyBpbiB0aGUgbm90aWZpY2F0aW9uIGJvZHkgYW5kIHN1YmplY3QKCiAgICBteSAlTm90aWZpY2F0aW9uRXZlbnQgPSAkVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QtPk5vdGlmaWNhdGlvbkV2ZW50KAogICAgICAgIFRpY2tldERhdGEgICAgICAgICAgICA9PiAkVGlja2V0RGF0YUhhc2hSZWYsCiAgICAgICAgUmVjaXBpZW50ICAgICAgICAgICAgID0+ICRVc2VyRGF0YUhhc2hSZWYsICAgICAgICAgICMgQWdlbnQgb3IgQ3VzdG9tZXIgZGF0YSBnZXQgcmVzdWx0CiAgICAgICAgTm90aWZpY2F0aW9uICAgICAgICAgID0+ICROb3RpZmljYXRpb25EYXRhSGFzaFJlZiwKICAgICAgICBDdXN0b21lck1lc3NhZ2VQYXJhbXMgPT4gJEFydGljbGVIYXNoUmVmLCAgICAgICAgICAgIyBvcHRpb25hbAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIE5vdGlmaWNhdGlvbkV2ZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaWNrZXREYXRhIE5vdGlmaWNhdGlvbiBSZWNpcGllbnQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17Tm90aWZpY2F0aW9ufSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm90aWZpY2F0aW9uIGlzIGludmFsaWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlTm90aWZpY2F0aW9uID0gJXsgJFBhcmFte05vdGlmaWNhdGlvbn0gfTsKCiAgICAjIGV4Y2hhbmdpbmcgb3JpZ2luYWwgcmVmZXJlbmNlIHByZXZlbnQgaXQgdG8gZ3JvdyB1cAogICAgaWYgKCByZWYgJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30gJiYgcmVmICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9IGVxICdIQVNIJyApIHsKICAgICAgICBteSAlTG9jYWxDdXN0b21lck1lc3NhZ2VQYXJhbXMgPSAleyAkUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfSB9OwogICAgICAgICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9ID0gXCVMb2NhbEN1c3RvbWVyTWVzc2FnZVBhcmFtczsKICAgIH0KCiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICAjIEdldCBsYXN0IGFydGljbGUgZnJvbSBjdXN0b21lci4KICAgIG15IEBDdXN0b21lckFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldERhdGF9LT57VGlja2V0SUR9LAogICAgICAgIFNlbmRlclR5cGUgPT4gJ2N1c3RvbWVyJywKICAgICAgICBPbmx5TGFzdCAgID0+IDEsCiAgICApOwoKICAgIG15ICVDdXN0b21lckFydGljbGU7CgogICAgQVJUSUNMRToKICAgIGZvciBteSAkQXJ0aWNsZSAoQEN1c3RvbWVyQXJ0aWNsZXMpIHsKICAgICAgICBuZXh0IEFSVElDTEUgaWYgISRBcnRpY2xlLT57QXJ0aWNsZUlEfTsKCiAgICAgICAgJUN1c3RvbWVyQXJ0aWNsZSA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSggJXskQXJ0aWNsZX0gKS0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgJXskQXJ0aWNsZX0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IGxhc3QgYXJ0aWNsZSBmcm9tIGFnZW50LgogICAgbXkgQEFnZW50QXJ0aWNsZXMgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgVGlja2V0SUQgICA9PiAkUGFyYW17VGlja2V0RGF0YX0tPntUaWNrZXRJRH0sCiAgICAgICAgU2VuZGVyVHlwZSA9PiAnYWdlbnQnLAogICAgICAgIE9ubHlMYXN0ICAgPT4gMSwKICAgICk7CgogICAgbXkgJUFnZW50QXJ0aWNsZTsKCiAgICBBR0VOVEFSVElDTEU6CiAgICBmb3IgbXkgJEFydGljbGUgKEBBZ2VudEFydGljbGVzKSB7CiAgICAgICAgbmV4dCBBR0VOVEFSVElDTEUgaWYgISRBcnRpY2xlLT57QXJ0aWNsZUlEfTsKCiAgICAgICAgJUFnZW50QXJ0aWNsZSA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSggJXskQXJ0aWNsZX0gKS0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgJXskQXJ0aWNsZX0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIEluY2x1ZGUgdGhlIHRyYW5zbWlzc2lvbiBzdGF0dXMsIGlmIGFydGljbGUgaXMgYW4gZW1haWwuCiAgICAgICAgbXkgJUNvbW11bmljYXRpb25DaGFubmVsID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNvbW11bmljYXRpb25DaGFubmVsJyktPkNoYW5uZWxHZXQoCiAgICAgICAgICAgIENoYW5uZWxJRCA9PiAkQXJ0aWNsZS0+e0NvbW11bmljYXRpb25DaGFubmVsSUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkQ29tbXVuaWNhdGlvbkNoYW5uZWx7Q2hhbm5lbE5hbWV9IGVxICdFbWFpbCcgKSB7CiAgICAgICAgICAgIG15ICRUcmFuc21pc3Npb25TdGF0dXMgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7JEFydGljbGV9ICktPkFydGljbGVUcmFuc21pc3Npb25TdGF0dXMoCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGUtPntBcnRpY2xlSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRUcmFuc21pc3Npb25TdGF0dXMgJiYgJFRyYW5zbWlzc2lvblN0YXR1cy0+e01lc3NhZ2V9ICkgewogICAgICAgICAgICAgICAgJEFnZW50QXJ0aWNsZXtUcmFuc21pc3Npb25TdGF0dXNNZXNzYWdlfSA9ICRUcmFuc21pc3Npb25TdGF0dXMtPntNZXNzYWdlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIEFSVElDTEU6CiAgICBmb3IgbXkgJEFydGljbGVEYXRhICggXCVDdXN0b21lckFydGljbGUsIFwlQWdlbnRBcnRpY2xlICkgewogICAgICAgIG5leHQgQVJUSUNMRSBpZiAhJEFydGljbGVEYXRhLT57VGlja2V0SUR9OwogICAgICAgIG5leHQgQVJUSUNMRSBpZiAhJEFydGljbGVEYXRhLT57QXJ0aWNsZUlEfTsKCiAgICAgICAgIyBHZXQgYXJ0aWNsZSBwcmV2aWV3IGluIHBsYWluIHRleHQgYW5kIHN0b3JlIGl0IGFzIEJvZHkga2V5LgogICAgICAgICRBcnRpY2xlRGF0YS0+e0JvZHl9ID0gJExheW91dE9iamVjdC0+QXJ0aWNsZVByZXZpZXcoCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJEFydGljbGVEYXRhLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgID0+ICRBcnRpY2xlRGF0YS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIFJlc3VsdFR5cGUgPT4gJ3BsYWluJywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhY2NvdW50ZWQgdGltZQogICAgICAgIG15ICRBY2NvdW50ZWRUaW1lID0gJEFydGljbGVPYmplY3QtPkFydGljbGVBY2NvdW50ZWRUaW1lR2V0KAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVEYXRhLT57QXJ0aWNsZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aGUgYWNjb3VudGVkIHRpbWUgYXMgcGFydCBvZiB0aGUgYXJ0aWNsZXMgaW5mb3JtYXRpb24KICAgICAgICAkQXJ0aWNsZURhdGEtPntUaW1lVW5pdH0gPSAkQWNjb3VudGVkVGltZTsKICAgIH0KCiAgICAjIFBvcHVsYXRlIHRoZSBoYXNoICdDdXN0b21lck1lc3NhZ2VQYXJhbXMnIHdpdGggYWxsIHRoZSBjdXN0b21lci1hcnRpY2xlIGRhdGEKICAgICMgYW5kIG92ZXJ3cml0ZSBpdCB3aXRoICdDdXN0b21lck1lc3NhZ2VQYXJhbXMnIHBhc3NlZCBpbiB0aGUgUGFyYW1zIChidWcgIzEzMzI1KS4KICAgICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9ID0gewogICAgICAgICVDdXN0b21lckFydGljbGUsCiAgICAgICAgJXsgJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30gfHwge30gfSwKICAgIH07CgogICAgIyBnZXQgc3lzdGVtIGRlZmF1bHQgbGFuZ3VhZ2UKICAgIG15ICREZWZhdWx0TGFuZ3VhZ2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0RlZmF1bHRMYW5ndWFnZScpIHx8ICdlbic7CgogICAgbXkgJExhbmd1YWdlcyA9IFsgJFBhcmFte1JlY2lwaWVudH0tPntVc2VyTGFuZ3VhZ2V9LCAkRGVmYXVsdExhbmd1YWdlLCAnZW4nIF07CgogICAgbXkgJExhbmd1YWdlOwogICAgTEFOR1VBR0U6CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyRMYW5ndWFnZXN9ICkgewogICAgICAgIG5leHQgTEFOR1VBR0UgaWYgISRJdGVtOwogICAgICAgIG5leHQgTEFOR1VBR0UgaWYgISROb3RpZmljYXRpb257TWVzc2FnZX0tPnskSXRlbX07CgogICAgICAgICMgc2V0IGxhbmd1YWdlCiAgICAgICAgJExhbmd1YWdlID0gJEl0ZW07CiAgICAgICAgbGFzdCBMQU5HVUFHRTsKICAgIH0KCiAgICAjIGlmIG5vIGxhbmd1YWdlLCB0aGVuIHRha2UgdGhlIGZpcnN0IG9uZSBhdmFpbGFibGUKICAgIGlmICggISRMYW5ndWFnZSApIHsKICAgICAgICBteSBATm90aWZpY2F0aW9uTGFuZ3VhZ2VzID0gc29ydCBrZXlzICV7ICROb3RpZmljYXRpb257TWVzc2FnZX0gfTsKICAgICAgICAkTGFuZ3VhZ2UgPSAkTm90aWZpY2F0aW9uTGFuZ3VhZ2VzWzBdOwogICAgfQoKICAgICMgY29weSB0aGUgY29ycmVjdCBsYW5ndWFnZSBtZXNzYWdlIGF0dHJpYnV0ZXMgdG8gYSBmbGF0IHN0cnVjdHVyZQogICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KFN1YmplY3QgQm9keSBDb250ZW50VHlwZSkpIHsKICAgICAgICAkTm90aWZpY2F0aW9ueyRBdHRyaWJ1dGV9ID0gJE5vdGlmaWNhdGlvbntNZXNzYWdlfS0+eyRMYW5ndWFnZX0tPnskQXR0cmlidXRlfTsKICAgIH0KCiAgICAjIEdldCBjdXN0b21lciBhcnRpY2xlIGZpZWxkcy4KICAgIG15ICVDdXN0b21lckFydGljbGVGaWVsZHM7CgogICAgaWYgKCVDdXN0b21lckFydGljbGUpIHsKICAgICAgICAlQ3VzdG9tZXJBcnRpY2xlRmllbGRzID0gJExheW91dE9iamVjdC0+QXJ0aWNsZUZpZWxkcygKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRDdXN0b21lckFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEN1c3RvbWVyQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBBUlRJQ0xFX0ZJRUxEOgogICAgZm9yIG15ICRBcnRpY2xlRmllbGQgKCBzb3J0IGtleXMgJUN1c3RvbWVyQXJ0aWNsZUZpZWxkcyApIHsKICAgICAgICBuZXh0IEFSVElDTEVfRklFTEQgaWYgIWRlZmluZWQgJEN1c3RvbWVyQXJ0aWNsZUZpZWxkc3skQXJ0aWNsZUZpZWxkfS0+e1ZhbHVlfTsKCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfS0+eyRBcnRpY2xlRmllbGR9ICkgewogICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfS0+eyRBcnRpY2xlRmllbGR9ID0gJEN1c3RvbWVyQXJ0aWNsZUZpZWxkc3skQXJ0aWNsZUZpZWxkfS0+e1ZhbHVlfTsKICAgICAgICB9CiAgICAgICAgY2hvbXAgJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30tPnskQXJ0aWNsZUZpZWxkfTsKICAgIH0KCiAgICAjIGZvcm1hdCBib2R5IChvbmx5IGlmIGxvbmdlciB0aGUgODYgY2hhcnMpCiAgICBpZiAoICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9LT57Qm9keX0gKSB7CiAgICAgICAgaWYgKCBsZW5ndGggJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30tPntCb2R5fSA+IDg2ICkgewogICAgICAgICAgICBteSBATGluZXMgPSBzcGxpdCAvXG4vLCAkUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfS0+e0JvZHl9OwogICAgICAgICAgICBMSU5FOgogICAgICAgICAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgICAgICAgICAgbXkgJExpbmVXcmFwcGVkID0gJExpbmUgPX4gcy8oXj4uK3wuezQsODZ9KSg/OlxzfFx6KS8kMVxuL2dtOwoKICAgICAgICAgICAgICAgIG5leHQgTElORSBpZiAkTGluZVdyYXBwZWQ7CgogICAgICAgICAgICAgICAgIyBpZiB0aGUgcmVnZXggZG9lcyBub3QgbWF0Y2ggdGhlbiB3ZSBuZWVkCiAgICAgICAgICAgICAgICAjIHRvIGFkZCB0aGUgbWlzc2luZyBuZXcgbGluZSBvZiB0aGUgc3BsaXQKICAgICAgICAgICAgICAgICMgZWxzZSB3ZSB3aWxsIGxvc2UgZS5nLiBlbXB0eSBsaW5lcyBvZiB0aGUgYm9keS4KICAgICAgICAgICAgICAgICMgKGJ1ZyMxMDY3OSkKICAgICAgICAgICAgICAgICRMaW5lIC49ICJcbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30tPntCb2R5fSA9IGpvaW4gJycsIEBMaW5lczsKICAgICAgICB9CiAgICB9CgogICAgIyBmaWxsIHVwIHJlcXVpcmVkIGF0dHJpYnV0ZXMKICAgIGZvciBteSAkVGV4dCAocXcoU3ViamVjdCBCb2R5KSkgewogICAgICAgIGlmICggISRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9LT57JFRleHR9ICkgewoKICAgICAgICAgICAgIyBTZXQgdG8gbGFzdCBjdXN0b21lciBhcnRpY2xlIGF0dHJpYnV0ZSBpZiBpdCBpcyBlbXB0eSBzdHJpbmcuCiAgICAgICAgICAgICMgRm9yIGV4YW1wbGUsIGlmIEJvZHkgaXMgZW1wdHkgc3RyaW5nIChub3QgdW5kZWYhKSwgaXQgaXMgbWF5YmUgc2VudCBmcm9tIE5vdGlmaWNhdGlvbk93bmVyVXBkYXRlIGV2ZW50CiAgICAgICAgICAgICMgYW5kIG92ZXJyaWRlcyBsYXN0IGN1c3RvbWVyIGFydGljbGUgYm9keSAoaW4gJUN1c3RvbWVyQXJ0aWNsZSkgYWJvdmUgLSBzZWUgYnVnIzE0Njc4LgogICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfS0+eyRUZXh0fSA9ICRDdXN0b21lckFydGljbGV7JFRleHR9IHx8ICJObyAkVGV4dCI7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTdGFydCA9ICc8JzsKICAgIG15ICRFbmQgICA9ICc+JzsKICAgIGlmICggJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0gPX4gbXt0ZXh0XC9odG1sfSApIHsKICAgICAgICAkU3RhcnQgPSAnJmx0Oyc7CiAgICAgICAgJEVuZCAgID0gJyZndDsnOwogICAgfQoKICAgICMgcmVwbGFjZSA8T1RPQk9fQ1VTVE9NRVJfREFUQV8qPiB0YWdzIGVhcmx5IGZyb20gQ3VzdG9tZXJNZXNzYWdlUGFyYW1zLCB0aGUgcmVzdHMgd2lsbCBiZSByZXBsYWNlZAogICAgIyBieSB0aWNrZXQgY3VzdG9tZXIgdXNlcgogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30gfHwge30gfSApIHsKCiAgICAgICAgbmV4dCBLRVkgaWYgISRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9LT57JEtleX07CgogICAgICAgICROb3RpZmljYXRpb257Qm9keX0gICAgPX4gcy8ke1N0YXJ0fU9UT0JPX0NVU1RPTUVSX0RBVEFfJEtleSR7RW5kfS8kUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfS0+eyRLZXl9L2dpOwogICAgICAgICROb3RpZmljYXRpb257U3ViamVjdH0gPX4gcy88T1RPQk9fQ1VTVE9NRVJfREFUQV8kS2V5Pi8kUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfS0+eyRLZXl9eyRLZXl9L2dpOwogICAgfQoKICAgICMgZG8gdGV4dC9wbGFpbiB0byB0ZXh0L2h0bWwgY29udmVydAogICAgaWYgKCAkU2VsZi0+e1JpY2hUZXh0fSAmJiAkTm90aWZpY2F0aW9ue0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvcGxhaW4vaSApIHsKICAgICAgICAkTm90aWZpY2F0aW9ue0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICROb3RpZmljYXRpb257Qm9keX0gICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoCiAgICAgICAgICAgIFN0cmluZyA9PiAkTm90aWZpY2F0aW9ue0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkbyB0ZXh0L2h0bWwgdG8gdGV4dC9wbGFpbiBjb252ZXJ0CiAgICBpZiAoICEkU2VsZi0+e1JpY2hUZXh0fSAmJiAkTm90aWZpY2F0aW9ue0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvaHRtbC9pICkgewogICAgICAgICROb3RpZmljYXRpb257Q29udGVudFR5cGV9ID0gJ3RleHQvcGxhaW4nOwogICAgICAgICROb3RpZmljYXRpb257Qm9keX0gICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0FzY2lpKAogICAgICAgICAgICBTdHJpbmcgPT4gJE5vdGlmaWNhdGlvbntCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG5vdGlmeSB0ZXh0cwogICAgZm9yIG15ICRUZXh0IChxdyhTdWJqZWN0IEJvZHkpKSB7CiAgICAgICAgaWYgKCAhJE5vdGlmaWNhdGlvbnskVGV4dH0gKSB7CiAgICAgICAgICAgICROb3RpZmljYXRpb257JFRleHR9ID0gIk5vIE5vdGlmaWNhdGlvbiAkVGV4dCBmb3IgJFBhcmFte1R5cGV9IGZvdW5kISI7CiAgICAgICAgfQogICAgfQoKICAgICMgcmVwbGFjZSBwbGFjZSBob2xkZXIgc3R1ZmYKICAgICROb3RpZmljYXRpb257Qm9keX0gPSAkU2VsZi0+X1JlcGxhY2UoCiAgICAgICAgUmljaFRleHQgICAgICAgID0+ICRTZWxmLT57UmljaFRleHR9LAogICAgICAgIFRleHQgICAgICAgICAgICA9PiAkTm90aWZpY2F0aW9ue0JvZHl9LAogICAgICAgIFJlY2lwaWVudCAgICAgICA9PiAkUGFyYW17UmVjaXBpZW50fSwKICAgICAgICBEYXRhICAgICAgICAgICAgPT4gJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30sCiAgICAgICAgRGF0YUFnZW50ICAgICAgID0+IFwlQWdlbnRBcnRpY2xlLAogICAgICAgIFRpY2tldERhdGEgICAgICA9PiAkUGFyYW17VGlja2V0RGF0YX0sCiAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIExhbmd1YWdlICAgICAgICA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgQWRkVGltZXpvbmVJbmZvID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRXZlbnQgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICAkTm90aWZpY2F0aW9ue1N1YmplY3R9ID0gJFNlbGYtPl9SZXBsYWNlKAogICAgICAgIFJpY2hUZXh0ICAgICAgICA9PiAwLAogICAgICAgIFRleHQgICAgICAgICAgICA9PiAkTm90aWZpY2F0aW9ue1N1YmplY3R9LAogICAgICAgIFJlY2lwaWVudCAgICAgICA9PiAkUGFyYW17UmVjaXBpZW50fSwKICAgICAgICBEYXRhICAgICAgICAgICAgPT4gJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30sCiAgICAgICAgRGF0YUFnZW50ICAgICAgID0+IFwlQWdlbnRBcnRpY2xlLAogICAgICAgIFRpY2tldERhdGEgICAgICA9PiAkUGFyYW17VGlja2V0RGF0YX0sCiAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIExhbmd1YWdlICAgICAgICA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgQWRkVGltZXpvbmVJbmZvID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRXZlbnQgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIEtlZXAgdGhlICJvcmlnaW5hbCIgKHVubW9kaWZpZWQpIHN1YmplY3QgYW5kIGJvZHkgZm9yIGxhdGVyIHVzZS4KICAgICROb3RpZmljYXRpb257T3JpZ2luYWxTdWJqZWN0fSA9ICROb3RpZmljYXRpb257U3ViamVjdH07CiAgICAkTm90aWZpY2F0aW9ue09yaWdpbmFsQm9keX0gICAgPSAkTm90aWZpY2F0aW9ue0JvZHl9OwoKICAgICROb3RpZmljYXRpb257U3ViamVjdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFN1YmplY3RCdWlsZCgKICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFBhcmFte1RpY2tldERhdGF9LT57VGlja2V0TnVtYmVyfSwKICAgICAgICBTdWJqZWN0ICAgICAgPT4gJE5vdGlmaWNhdGlvbntTdWJqZWN0fSB8fCAnJywKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05ldycsCiAgICApOwoKICAgICMgYWRkIFVSTHMgYW5kIHZlcmlmeSB0byBiZSBmdWxsIEhUTUwgZG9jdW1lbnQKICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gKSB7CgogICAgICAgICROb3RpZmljYXRpb257Qm9keX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPkxpbmtRdW90ZSgKICAgICAgICAgICAgU3RyaW5nID0+ICROb3RpZmljYXRpb257Qm9keX0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJU5vdGlmaWNhdGlvbjsKfQoKPWJlZ2luIEludGVybmFsOgoKPWhlYWQyIF9SZXBsYWNlKCkKCnJlcGxhY2UgdGhlIHBsYWNlaG9sZGVycyBpbiB0aGUgdGV4dAoKPWN1dAoKc3ViIF9SZXBsYWNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoVGV4dCBSaWNoVGV4dCBEYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBmb3IgbWFpbHRvIGxpbmtzCiAgICAjIHNpbmNlIHRoZSBzdWJqZWN0IGFuZCBib2R5IG9mIHRob3NlIG1haWx0byBsaW5rcyBhcmUKICAgICMgdXJpIGVzY2FwZWQgd2UgaGF2ZSB0byB1cmkgdW5lc2NhcGUgdGhlbSwgcmVwbGFjZQogICAgIyBwb3NzaWJsZSBwbGFjZWhvbGRlcnMgYW5kIHRoZW4gcmUtdXJpIGVzY2FwZSB0aGVtCiAgICAkUGFyYW17VGV4dH0gPX4gc3sKICAgICAgICAoaHJlZj0ibWFpbHRvOlteXD9dK1w/KShbXiJdKyIpCiAgICB9CiAgICB7CiAgICAgICAgbXkgJE1haWxUb0hyZWYgICAgICAgID0gJDE7CiAgICAgICAgbXkgJE1haWxUb0hyZWZDb250ZW50ID0gJDI7CgogICAgICAgICMgTmVzdGVkIHMvLy9lZ3ghCiAgICAgICAgJE1haWxUb0hyZWZDb250ZW50ID1+IHN7CiAgICAgICAgICAgICgoPzpzdWJqZWN0fGJvZHkpPSkoLis/KSgifCYpCiAgICAgICAgfQogICAgICAgIHsKICAgICAgICAgICAgbXkgJFN1YmplY3RPckJvZHlQcmVmaXggID0gJDE7CiAgICAgICAgICAgIG15ICRTdWJqZWN0T3JCb2R5Q29udGVudCA9ICQyOwogICAgICAgICAgICBteSAkU3ViamVjdE9yQm9keVN1ZmZpeCAgPSAkMzsKCiAgICAgICAgICAgIG15ICRTdWJqZWN0T3JCb2R5Q29udGVudFVuZXNjYXBlZCA9IHVyaV91bmVzY2FwZSgkU3ViamVjdE9yQm9keUNvbnRlbnQpOwoKICAgICAgICAgICAgbXkgJFN1YmplY3RPckJvZHlDb250ZW50UmVwbGFjZWQgPSAkU2VsZi0+X1JlcGxhY2UoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUZXh0ICAgICA9PiAkU3ViamVjdE9yQm9keUNvbnRlbnRVbmVzY2FwZWQsCiAgICAgICAgICAgICAgICBSaWNoVGV4dCA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFN1YmplY3RPckJvZHlDb250ZW50RXNjYXBlZCA9IHVyaV9lc2NhcGVfdXRmOCgkU3ViamVjdE9yQm9keUNvbnRlbnRSZXBsYWNlZCk7CgogICAgICAgICAgICAkU3ViamVjdE9yQm9keVByZWZpeCAuICRTdWJqZWN0T3JCb2R5Q29udGVudEVzY2FwZWQgLiAkU3ViamVjdE9yQm9keVN1ZmZpeDsKICAgICAgICB9ZWd4OwoKICAgICAgICAkTWFpbFRvSHJlZiAuICRNYWlsVG9IcmVmQ29udGVudDsKICAgIH1lZ3g7CgogICAgbXkgKCAkU3RhcnQsICRFbmQgKSA9ICggJzwnLCAnPicgKTsKICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKICAgICAgICAoICRTdGFydCwgJEVuZCApID0gKCAnJmx0OycsICcmZ3Q7JyApOwogICAgICAgICRQYXJhbXtUZXh0fSA9fiBzLyhcbnxccikvL2c7CiAgICB9CgogICAgbXkgJVRpY2tldDsKICAgIGlmICggJFBhcmFte1RpY2tldERhdGF9ICkgewogICAgICAgICVUaWNrZXQgPSAkUGFyYW17VGlja2V0RGF0YX0tPiUqOwogICAgfQoKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CgogICAgIyBEZXRlcm1pbmUgcmVjaXBpZW50J3MgdGltZXpvbmUgaWYgbmVlZGVkLgogICAgbXkgJFJlY2lwaWVudFRpbWVab25lOwogICAgaWYgKCAkUGFyYW17QWRkVGltZXpvbmVJbmZvfSApIHsKICAgICAgICAkUmVjaXBpZW50VGltZVpvbmUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+T1RPQk9UaW1lWm9uZUdldCgpOwoKICAgICAgICBteSAlQ3VzdG9tZXJVc2VyOwogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoIFwlVGlja2V0ICkgJiYgJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICVDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICk7CiAgICAgICAgfQoKICAgICAgICBteSAlVXNlclByZWZlcmVuY2VzOwoKICAgICAgICBpZiAoICRQYXJhbXtBZGRUaW1lem9uZUluZm99LT57Tm90aWZpY2F0aW9uRXZlbnR9ICYmICRQYXJhbXtSZWNpcGllbnR9LT57VHlwZX0gZXEgJ0FnZW50JyApIHsKICAgICAgICAgICAgJVVzZXJQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtSZWNpcGllbnR9LT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAkUGFyYW17QWRkVGltZXpvbmVJbmZvfS0+e05vdGlmaWNhdGlvbkV2ZW50fQogICAgICAgICAgICAmJiAkUGFyYW17UmVjaXBpZW50fS0+e1R5cGV9IGVxICdDdXN0b21lcicKICAgICAgICAgICAgJiYgJFBhcmFte1JlY2lwaWVudH0tPntVc2VySUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICVVc2VyUHJlZmVyZW5jZXMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5HZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17UmVjaXBpZW50fS0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgKICAgICAgICAgICAgJFBhcmFte0FkZFRpbWV6b25lSW5mb30tPntBdXRvUmVzcG9uc2V9CiAgICAgICAgICAgICYmICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9CiAgICAgICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCBcJUN1c3RvbWVyVXNlciApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICVVc2VyUHJlZmVyZW5jZXMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5HZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJFVzZXJQcmVmZXJlbmNlc3tVc2VyVGltZVpvbmV9ICkgewogICAgICAgICAgICAkUmVjaXBpZW50VGltZVpvbmUgPSAkVXNlclByZWZlcmVuY2Vze1VzZXJUaW1lWm9uZX07CiAgICAgICAgfQogICAgfQoKICAgICMgUmVwbGFjZSBVbml4IHRpbWUgZm9ybWF0IHRhZ3MuCiAgICAjIElmIGxhbmd1YWdlIGlzIGRlZmluZWQsIHRoZXkgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhIGNvcnJlY3QgZm9ybWF0IGluIGJlbG93IElGIHN0YXRlbWVudC4KICAgIGZvciBteSAkVW5peEZvcm1hdFRpbWUgKAogICAgICAgIHF3KFJlYWxUaWxsVGltZU5vdFVzZWQgRXNjYWxhdGlvblJlc3BvbnNlVGltZSBFc2NhbGF0aW9uVXBkYXRlVGltZSBFc2NhbGF0aW9uU29sdXRpb25UaW1lKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICRUaWNrZXR7JFVuaXhGb3JtYXRUaW1lfSApIHsKICAgICAgICAgICAgJFRpY2tldHskVW5peEZvcm1hdFRpbWV9ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBFcG9jaCA9PiAkVGlja2V0eyRVbml4Rm9ybWF0VGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApLT5Ub1N0cmluZygpOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRyYW5zbGF0ZSB0aWNrZXQgdmFsdWVzIGlmIG5lZWRlZAogICAgaWYgKCAkUGFyYW17TGFuZ3VhZ2V9ICkgewoKICAgICAgICBteSAkTGFuZ3VhZ2VPYmplY3QgPSBLZXJuZWw6Okxhbmd1YWdlLT5uZXcoCiAgICAgICAgICAgIFVzZXJMYW5ndWFnZSA9PiAkUGFyYW17TGFuZ3VhZ2V9LAogICAgICAgICk7CgogICAgICAgICMgVHJhbnNsYXRlIHRoZSBkaWZmZXJlbnQgdmFsdWVzLgogICAgICAgIGZvciBteSAkRmllbGQgKHF3KFR5cGUgU3RhdGUgU3RhdGVUeXBlIExvY2sgUHJpb3JpdHkpKSB7CiAgICAgICAgICAgICRUaWNrZXR7JEZpZWxkfSA9ICRMYW5ndWFnZU9iamVjdC0+VHJhbnNsYXRlKCAkVGlja2V0eyRGaWVsZH0gKTsKICAgICAgICB9CgogICAgICAgICMgVHJhbnNmb3JtIHRoZSBkYXRlIHZhbHVlcyBmcm9tIHRoZSB0aWNrZXQgZGF0YSAoYnV0IG5vdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZXMpLgogICAgICAgIEFUVFJJQlVURToKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAlVGlja2V0ICkgewogICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAkQXR0cmlidXRlID1+IG17IFxBIER5bmFtaWNGaWVsZF8gfXhtczsKICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgISRUaWNrZXR7JEF0dHJpYnV0ZX07CgogICAgICAgICAgICBpZiAoICRUaWNrZXR7JEF0dHJpYnV0ZX0gPX4gbXtcQShcZFxkXGRcZCktKFxkXGQpLShcZFxkKVxzKFxkXGQpOihcZFxkKTooXGRcZClcen14aSApIHsKCiAgICAgICAgICAgICAgICAjIENoYW5nZSB0aW1lIHRvIHJlY2lwaWVudCdzIHRpbWV6b25lIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgIyBhbmQgbGF0ZXIgYXBwZW5kIHRpbWV6b25lIGluZm9ybWF0aW9uLgogICAgICAgICAgICAgICAgIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwKICAgICAgICAgICAgICAgICMgc2VlIGJ1ZyMxMzg2NSAoaHR0cHM6Ly9idWdzLm90cnMub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzg2NSkKICAgICAgICAgICAgICAgICMgYW5kIGJ1ZyMxNDI3MCAoaHR0cHM6Ly9idWdzLm90cnMub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDI3MCkuCiAgICAgICAgICAgICAgICBpZiAoJFJlY2lwaWVudFRpbWVab25lKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFRpY2tldHskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICREYXRlVGltZU9iamVjdC0+VG9UaW1lWm9uZSggVGltZVpvbmUgPT4gJFJlY2lwaWVudFRpbWVab25lICk7CiAgICAgICAgICAgICAgICAgICAgJFRpY2tldHskQXR0cmlidXRlfSA9ICREYXRlVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkVGlja2V0eyRBdHRyaWJ1dGV9ID0gJExhbmd1YWdlT2JqZWN0LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXQnLAogICAgICAgICAgICAgICAgICAgICdOb1NlY29uZHMnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIEFwcGVuZCB0aW1lem9uZSBpbmZvcm1hdGlvbiBpZiBuZWVkZWQuCiAgICAgICAgICAgICAgICBpZiAoJFJlY2lwaWVudFRpbWVab25lKSB7CiAgICAgICAgICAgICAgICAgICAgJFRpY2tldHskQXR0cmlidXRlfSAuPSAiICgkUmVjaXBpZW50VGltZVpvbmUpIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJExvY2FsTGF5b3V0T2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dC0+bmV3KAogICAgICAgICAgICBMYW5nID0+ICRQYXJhbXtMYW5ndWFnZX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBDb252ZXJ0IHRhZ3MgaW4gc2Vjb25kcyB0byBtb3JlIHJlYWRhYmxlIGFwcHJvcHJpYXRlIGZvcm1hdCBpZiBsYW5ndWFnZSBpcyBkZWZpbmVkLgogICAgICAgIGZvciBteSAkVGltZUluU2Vjb25kcyAoCiAgICAgICAgICAgIHF3KFVudGlsVGltZSBFc2NhbGF0aW9uVGltZVdvcmtpbmdUaW1lIEVzY2FsYXRpb25UaW1lIEZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUgRmlyc3RSZXNwb25zZVRpbWUgVXBkYXRlVGltZVdvcmtpbmdUaW1lCiAgICAgICAgICAgIFVwZGF0ZVRpbWUgU29sdXRpb25UaW1lV29ya2luZ1RpbWUgU29sdXRpb25UaW1lKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBpZiAoICRUaWNrZXR7JFRpbWVJblNlY29uZHN9ICkgewogICAgICAgICAgICAgICAgJFRpY2tldHskVGltZUluU2Vjb25kc30gPSAkTG9jYWxMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlKAogICAgICAgICAgICAgICAgICAgIEFnZSAgID0+ICRUaWNrZXR7JFRpbWVJblNlY29uZHN9LAogICAgICAgICAgICAgICAgICAgIFNwYWNlID0+ICcgJwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAlUXVldWU7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAlUXVldWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVHZXQoCiAgICAgICAgICAgIElEID0+ICRQYXJhbXtRdWV1ZUlEfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgUmVwbGFjZSBjb25maWcgb3B0aW9ucy4KICAgIG15ICRUYWcgPSAkU3RhcnQgLiAnT1RPQk9fQ09ORklHXyc7CiAgICAkUGFyYW17VGV4dH0gPX4gc3sKICAgICAgICAkVGFnCiAgICAgICAgICAgICMgdGhlIGtleSBmb3IgdGhlIGNvbmZpZwogICAgICAgICAgICAoPzxrZXk+Lis/KQogICAgICAgICRFbmQKICAgIH0KICAgIHsKICAgICAgICBteSAkS2V5ICAgPSAkK3trZXl9OwogICAgICAgIG15ICRWYWx1ZSA9ICRDb25maWdPYmplY3QtPkdldCgkS2V5KSAvLyAnJzsKCiAgICAgICAgIyBNYXNrIHNlbnNpdGl2ZSBjb25maWcgb3B0aW9ucy4KICAgICAgICBteSAkUmVwbGFjZSA9ICRTZWxmLT5fTWFza1NlbnNpdGl2ZVZhbHVlKAogICAgICAgICAgICBLZXkgICAgICA9PiAkS2V5LAogICAgICAgICAgICBWYWx1ZSAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIElzQ29uZmlnID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFJlcGxhY2U7CiAgICB9ZWd4OwoKICAgICMgY2xlYW51cAogICAgJFBhcmFte1RleHR9ID1+IHMvJFRhZy4rPyRFbmQvLS9naTsKCiAgICBteSAlUmVjaXBpZW50ID0gJXsgJFBhcmFte1JlY2lwaWVudH0gfHwge30gfTsKCiAgICAjIGdldCB1c2VyIG9iamVjdAogICAgbXkgJFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgIGlmICggISVSZWNpcGllbnQgJiYgJFBhcmFte1JlY2lwaWVudElEfSApIHsKCiAgICAgICAgJVJlY2lwaWVudCA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17UmVjaXBpZW50SUR9LAogICAgICAgICAgICBOb091dE9mT2ZmaWNlID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG1vZGlmeSAkUGFyYW17VGV4dH0KICAgIG15ICRIYXNoR2xvYmFsUmVwbGFjZSA9IHN1YiB7CiAgICAgICAgbXkgKCAkVGFnLCAlSCApID0gQF87CgogICAgICAgICMgR2VuZXJhdGUgb25lIHNpbmdsZSBtYXRjaGluZyBzdHJpbmcgZm9yIGFsbCBrZXlzIHRvIHNhdmUgcGVyZm9ybWFuY2UuCiAgICAgICAgbXkgJEtleXMgPSBqb2luICd8JywgbWFwIHtxdW90ZW1ldGF9IGdyZXAgeyBkZWZpbmVkICRIeyRffSB9IGtleXMgJUg7CgogICAgICAgICMgU2V0IGFsbCBrZXlzIGFzIGxvd2VyY2FzZSB0byBiZSBhYmxlIHRvIG1hdGNoIGNhc2UgaW5zZW5zaXRpdmUsCiAgICAgICAgIyAgIGUuIGcuIDxPVE9CT19DVVNUT01FUl9Gcm9tPiBhbmQgPE9UT0JPX0NVU1RPTUVSX0ZST00+LgogICAgICAgICMgICBBbHNvIG1hc2sgYW55IHZhbHVlcyBjb250YWluaW5nIHNlbnNpdGl2ZSBkYXRhLgogICAgICAgICVIID0gbWFwIHsKICAgICAgICAgICAgbGMgJF8gPT4gJFNlbGYtPl9NYXNrU2Vuc2l0aXZlVmFsdWUoCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkXywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRIeyRffSwKICAgICAgICAgICAgKQogICAgICAgIH0gc29ydCBrZXlzICVIOwoKICAgICAgICAjIElmIHRhZyBpcyAnT1RPQk9fQ1VTVE9NRVJfJyBhZGQgdGhlIGJvZHkgYWxpYXMgJ2VtYWlsL25vdGUnIHRvIGJlIHJlcGxhY2VkLgogICAgICAgIGlmICggJFRhZyA9fiBtL09UT0JPXyhDVVNUT01FUnxBR0VOVClfLyApIHsKICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAocXcoIGVtYWlsIG5vdGUgKSkgewogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJEh7JEtleX07CgogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgZGVmaW5lZCgkVmFsdWUpOwoKICAgICAgICAgICAgICAgICRIeyRLZXl9ID0gJEh7J2JvZHknfTsKICAgICAgICAgICAgICAgICRLZXlzIC49ICd8JyAuIHVjZmlyc3QgJEtleTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1RleHR9ID1+IHN7CiAgICAgICAgICAgICMgZ3JvdXBpbmcgcmVxdWlyZWQgaGVyZSwgYXMgd2UgbWlnaHQgaGF2ZSBhbHRlcm5hdGlvbnMKICAgICAgICAgICAgKD86JFRhZykKICAgICAgICAgICAgICAgICMgY2FzZSBpbnNlbnNpdGl2IGtleXMKICAgICAgICAgICAgICAgICg/PGtleT4kS2V5cykKICAgICAgICAgICAgJEVuZAogICAgICAgIH0KICAgICAgICB7CiAgICAgICAgICAgIG15ICRLZXkgPSAkK3trZXl9OwogICAgICAgICAgICAkSHsgbGMgJEtleSB9CiAgICAgICAgfXhpZWc7CiAgICB9OwoKICAgICMgZ2V0IHJlY2lwaWVudCBkYXRhIGFuZCByZXBsYWNlIGl0IHdpdGggPE9UT0JPXy4uLgogICAgJFRhZyA9ICRTdGFydCAuICdPVE9CT18nOwoKICAgICMgaW5jbHVkZSBtb3JlIHJlYWRhYmxlIHRhZyA8T1RPQk9fTk9USUZJQ0FUSU9OX1JFQ0lQSUVOVAogICAgbXkgJFJlY2lwaWVudFRhZyA9ICRTdGFydCAuICdPVE9CT19OT1RJRklDQVRJT05fUkVDSVBJRU5UXyc7CgogICAgaWYgKCVSZWNpcGllbnQpIHsKCiAgICAgICAgIyBIVE1MIHF1b3Rpbmcgb2YgY29udGVudAogICAgICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKICAgICAgICAgICAgQVRUUklCVVRFOgogICAgICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAlUmVjaXBpZW50ICkgewogICAgICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgISRSZWNpcGllbnR7JEF0dHJpYnV0ZX07CiAgICAgICAgICAgICAgICAkUmVjaXBpZW50eyRBdHRyaWJ1dGV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRSZWNpcGllbnR7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkSGFzaEdsb2JhbFJlcGxhY2UtPiggIiRUYWd8JFJlY2lwaWVudFRhZyIsICVSZWNpcGllbnQgKTsKICAgIH0KCiAgICAjIGNsZWFudXAKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRSZWNpcGllbnRUYWcuKz8kRW5kLy0vZ2k7CgogICAgIyBnZXQgb3duZXIgZGF0YSBhbmQgcmVwbGFjZSBpdCB3aXRoIDxPVE9CT19PV05FUl8uLi4KICAgICRUYWcgPSAkU3RhcnQgLiAnT1RPQk9fT1dORVJfJzsKCiAgICAjIGluY2x1ZGUgbW9yZSByZWFkYWJsZSB2ZXJzaW9uIDxPVE9CT19USUNLRVRfT1dORVIKICAgIG15ICRPd25lclRhZyA9ICRTdGFydCAuICdPVE9CT19USUNLRVRfT1dORVJfJzsKCiAgICBpZiAoICRUaWNrZXR7T3duZXJJRH0gKSB7CgogICAgICAgIG15ICVPd25lciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVGlja2V0e093bmVySUR9LAogICAgICAgICAgICBOb091dE9mT2ZmaWNlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBodG1sIHF1b3Rpbmcgb2YgY29udGVudAogICAgICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKCiAgICAgICAgICAgIEFUVFJJQlVURToKICAgICAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJU93bmVyICkgewogICAgICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgISRPd25lcnskQXR0cmlidXRlfTsKICAgICAgICAgICAgICAgICRPd25lcnskQXR0cmlidXRlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkT3duZXJ7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkSGFzaEdsb2JhbFJlcGxhY2UtPiggIiRUYWd8JE93bmVyVGFnIiwgJU93bmVyICk7CiAgICB9CgogICAgIyBjbGVhbnVwCiAgICAkUGFyYW17VGV4dH0gPX4gcy8kVGFnLis/JEVuZC8tL2dpOwogICAgJFBhcmFte1RleHR9ID1+IHMvJE93bmVyVGFnLis/JEVuZC8tL2dpOwoKICAgICMgZ2V0IG93bmVyIGRhdGEgYW5kIHJlcGxhY2UgaXQgd2l0aCA8T1RPQk9fUkVTUE9OU0lCTEVfLi4uCiAgICAkVGFnID0gJFN0YXJ0IC4gJ09UT0JPX1JFU1BPTlNJQkxFXyc7CgogICAgIyBpbmNsdWRlIG1vcmUgcmVhZGFibGUgdmVyc2lvbiA8T1RPQk9fVElDS0VUX1JFU1BPTlNJQkxFCiAgICBteSAkUmVzcG9uc2libGVUYWcgPSAkU3RhcnQgLiAnT1RPQk9fVElDS0VUX1JFU1BPTlNJQkxFXyc7CgogICAgaWYgKCAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9ICkgewogICAgICAgIG15ICVSZXNwb25zaWJsZSA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICBOb091dE9mT2ZmaWNlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBIVE1MIHF1b3Rpbmcgb2YgY29udGVudAogICAgICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKCiAgICAgICAgICAgIEFUVFJJQlVURToKICAgICAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJVJlc3BvbnNpYmxlICkgewogICAgICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgISRSZXNwb25zaWJsZXskQXR0cmlidXRlfTsKICAgICAgICAgICAgICAgICRSZXNwb25zaWJsZXskQXR0cmlidXRlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUmVzcG9uc2libGV7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkSGFzaEdsb2JhbFJlcGxhY2UtPiggIiRUYWd8JFJlc3BvbnNpYmxlVGFnIiwgJVJlc3BvbnNpYmxlICk7CiAgICB9CgogICAgIyBjbGVhbnVwCiAgICAkUGFyYW17VGV4dH0gPX4gcy8kVGFnLis/JEVuZC8tL2dpOwogICAgJFBhcmFte1RleHR9ID1+IHMvJFJlc3BvbnNpYmxlVGFnLis/JEVuZC8tL2dpOwoKICAgICRUYWcgPSAkU3RhcnQgLiAnT1RPQk9fQWdlbnRfJzsKICAgIG15ICRUYWcyICAgICAgICA9ICRTdGFydCAuICdPVE9CT19DVVJSRU5UXyc7CiAgICBteSAlQ3VycmVudFVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBOb091dE9mT2ZmaWNlID0+IDEsCiAgICApOwoKICAgICMgSFRNTCBxdW90aW5nIG9mIGNvbnRlbnQKICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKCiAgICAgICAgQVRUUklCVVRFOgogICAgICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVDdXJyZW50VXNlciApIHsKICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgISRDdXJyZW50VXNlcnskQXR0cmlidXRlfTsKICAgICAgICAgICAgJEN1cnJlbnRVc2VyeyRBdHRyaWJ1dGV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEN1cnJlbnRVc2VyeyRBdHRyaWJ1dGV9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAkSGFzaEdsb2JhbFJlcGxhY2UtPiggIiRUYWd8JFRhZzIiLCAlQ3VycmVudFVzZXIgKTsKCiAgICAjIHJlcGxhY2Ugb3RoZXIgbmVlZGVkIHN0dWZmCiAgICAkUGFyYW17VGV4dH0gPX4gcy8kU3RhcnQgT1RPQk9fRklSU1RfTkFNRSAkRW5kLyRDdXJyZW50VXNlcntVc2VyRmlyc3RuYW1lfS9neG1zOwogICAgJFBhcmFte1RleHR9ID1+IHMvJFN0YXJ0IE9UT0JPX0xBU1RfTkFNRSAkRW5kLyRDdXJyZW50VXNlcntVc2VyTGFzdG5hbWV9L2d4bXM7CgogICAgIyBjbGVhbnVwCiAgICAkUGFyYW17VGV4dH0gPX4gcy8kVGFnMi4rPyRFbmQvLS9naTsKCiMgUm90aGVyIE9TUyAvIE9uZVRpbWVBdXRoZW50aWNhdGlvbkxpbmsKICAgICMgUmVwbGFjZSBjb25maWcgb3B0aW9ucy4KICAgICRUYWcgPSAkU3RhcnQgLiAnT1RPQk9fT1RBQ3VzdG9tZXJUaWNrZXRMaW5rJzsKICAgICRQYXJhbXtUZXh0fSA9fiBzeyRUYWckRW5kfXsKICAgICAgICBteSAkUmVwbGFjZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGg6Ok9uZVRpbWVBdXRoTGluaycpLT5UaWNrZXRMaW5rKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICBVc2VyICAgICAgICAgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgJFJlcGxhY2U7CiAgICB9ZWd4OwojIEVPIE9uZVRpbWVBdXRoZW50aWNhdGlvbkxpbmsKCiAgICAjIHRpY2tldCBkYXRhCiAgICAkVGFnID0gJFN0YXJ0IC4gJ09UT0JPX1RJQ0tFVF8nOwoKICAgICMgaHRtbCBxdW90aW5nIG9mIGNvbnRlbnQKICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKCiAgICAgICAgQVRUUklCVVRFOgogICAgICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVUaWNrZXQgKSB7CiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkVGlja2V0eyRBdHRyaWJ1dGV9OwogICAgICAgICAgICAkVGlja2V0eyRBdHRyaWJ1dGV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFRpY2tldHskQXR0cmlidXRlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBEcm9wZG93biwgQ2hlY2tib3ggYW5kIE11bHRpU2VsZWN0IER5bmFtaWNGaWVsZHMsIGNhbiBzdG9yZSB2YWx1ZXMgKGtleXMpIHRoYXQgYXJlCiAgICAjIGRpZmZlcmVudCBmcm9tIHRoZSB2YWx1ZXMgdG8gZGlzcGxheQogICAgIyA8T1RPQk9fVElDS0VUX0R5bmFtaWNGaWVsZF9OYW1lWD4gcmV0dXJucyB0aGUgc3RvcmVkIGtleQogICAgIyA8T1RPQk9fVElDS0VUX0R5bmFtaWNGaWVsZF9OYW1lWF9WYWx1ZT4gcmV0dXJucyB0aGUgZGlzcGxheSB2YWx1ZQoKICAgIG15ICVEeW5hbWljRmllbGRzOwoKICAgICMgRm9yIHN5c3RlbXMgd2l0aCBtYW55IER5bmFtaWMgZmllbGRzIHdlIGRvIG5vdCB3YW50IHRvIGxvYWQgdGhlbSBhbGwgdW5sZXNzIG5lZWRlZAogICAgIyBGaW5kIHdoYXQgRHluYW1pYyBGaWVsZCBWYWx1ZXMgYXJlIHJlcXVlc3RlZAogICAgd2hpbGUgKCAkUGFyYW17VGV4dH0gPX4gbS8kVGFnIER5bmFtaWNGaWVsZF8oXFMrPykoX1ZhbHVlKT8gJEVuZC9naXhtcyApIHsKICAgICAgICAkRHluYW1pY0ZpZWxkc3skMX0gPSAxOwogICAgfQoKICAgICMgdG8gc3RvcmUgYWxsIHRoZSByZXF1aXJlZCBEeW5hbWljRmllbGQgZGlzcGxheSB2YWx1ZXMKICAgIG15ICVEeW5hbWljRmllbGREaXNwbGF5VmFsdWVzOwoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgb2JqZWN0cwogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGRMaXN0ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSA9PiBbJ1RpY2tldCddLAogICAgKSB8fCBbXTsKCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkTGlzdH0gKSB7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyB3ZSBvbmx5IGxvYWQgdGhlIG9uZXMgcmVxdWVzdGVkCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKCiAgICAgICAgbXkgJExhbmd1YWdlT2JqZWN0OwoKICAgICAgICAjIHRyYW5zbGF0ZSB2YWx1ZXMgaWYgbmVlZGVkCiAgICAgICAgaWYgKCAkUGFyYW17TGFuZ3VhZ2V9ICkgewogICAgICAgICAgICAkTGFuZ3VhZ2VPYmplY3QgPSBLZXJuZWw6Okxhbmd1YWdlLT5uZXcoCiAgICAgICAgICAgICAgICBVc2VyTGFuZ3VhZ2UgPT4gJFBhcmFte0xhbmd1YWdlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICREYXRlVGltZU9iamVjdDsKCiAgICAgICAgIyBDaGFuZ2UgRGF0ZVRpbWUgREYgdmFsdWUgZm9yIHRpY2tldCBpZiBuZWVkZWQuCiAgICAgICAgaWYgKAogICAgICAgICAgICBkZWZpbmVkICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgICAgICYmICREeW5hbWljRmllbGRDb25maWctPntGaWVsZFR5cGV9IGVxICdEYXRlVGltZScKICAgICAgICAgICAgJiYgJFJlY2lwaWVudFRpbWVab25lCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJERhdGVUaW1lT2JqZWN0LT5Ub1RpbWVab25lKCBUaW1lWm9uZSA9PiAkUmVjaXBpZW50VGltZVpvbmUgKTsKICAgICAgICAgICAgJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRGF0ZVRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgZGlzcGxheSB2YWx1ZSBmb3IgZWFjaCBkeW5hbWljIGZpZWxkCiAgICAgICAgbXkgJERpc3BsYXlWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEtleSAgICAgICAgICAgICAgICA9PiAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgTGFuZ3VhZ2VPYmplY3QgICAgID0+ICRMYW5ndWFnZU9iamVjdCwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgcmVhZGFibGUgdmFsdWUgKHZhbHVlKSBmb3IgZWFjaCBkeW5hbWljIGZpZWxkCiAgICAgICAgbXkgJERpc3BsYXlWYWx1ZVN0cmcgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UmVhZGFibGVWYWx1ZVJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRGlzcGxheVZhbHVlLAogICAgICAgICk7CgogICAgICAgICMgZmlsbCB0aGUgRHluYW1pY0ZpZWxkRGlzcGxheVZhbHVlcwogICAgICAgIGlmICgkRGlzcGxheVZhbHVlU3RyZykgewogICAgICAgICAgICAkRHluYW1pY0ZpZWxkRGlzcGxheVZhbHVlc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ19WYWx1ZScgfSA9ICREaXNwbGF5VmFsdWVTdHJnLT57VmFsdWV9OwoKICAgICAgICAgICAgIyBBZGQgdGltZXpvbmUgaW5mbyBpZiBuZWVkZWQuCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICAgICAgICAgICYmIGxlbmd0aCAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfQogICAgICAgICAgICAgICAgJiYgJER5bmFtaWNGaWVsZENvbmZpZy0+e0ZpZWxkVHlwZX0gZXEgJ0RhdGVUaW1lJwogICAgICAgICAgICAgICAgJiYgJFJlY2lwaWVudFRpbWVab25lCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGREaXNwbGF5VmFsdWVzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAnX1ZhbHVlJyB9CiAgICAgICAgICAgICAgICAgICAgLj0gIiAoJFJlY2lwaWVudFRpbWVab25lKSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSByZWFkYWJsZSB2YWx1ZSAoa2V5KSBmb3IgZWFjaCBkeW5hbWljIGZpZWxkCiAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5SZWFkYWJsZVZhbHVlUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICk7CgogICAgICAgICMgcmVwbGFjZSB0aWNrZXQgY29udGVudCB3aXRoIHRoZSB2YWx1ZSBmcm9tIFJlYWRhYmxlVmFsdWVSZW5kZXIgKGlmIGFueSkKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRWYWx1ZVN0cmcpICkgewogICAgICAgICAgICAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRWYWx1ZVN0cmctPntWYWx1ZX07CgogICAgICAgICAgICAjIEFkZCB0aW1lem9uZSBpbmZvIGlmIG5lZWRlZC4KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfQogICAgICAgICAgICAgICAgJiYgbGVuZ3RoICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgICAgICAgICAmJiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57RmllbGRUeXBlfSBlcSAnRGF0ZVRpbWUnCiAgICAgICAgICAgICAgICAmJiAkUmVjaXBpZW50VGltZVpvbmUKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gLj0gIiAoJFJlY2lwaWVudFRpbWVab25lKSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyByZXBsYWNlIGl0CiAgICAkSGFzaEdsb2JhbFJlcGxhY2UtPiggJFRhZywgJVRpY2tldCwgJUR5bmFtaWNGaWVsZERpc3BsYXlWYWx1ZXMgKTsKCiAgICAjIENPTVBBVAogICAgJFBhcmFte1RleHR9ID1+IHMvJFN0YXJ0IE9UT0JPX1RJQ0tFVF9JRCAkRW5kLyRUaWNrZXR7VGlja2V0SUR9L2dpeG1zOwogICAgJFBhcmFte1RleHR9ID1+IHMvJFN0YXJ0IE9UT0JPX1RJQ0tFVF9OVU1CRVIgJEVuZC8kVGlja2V0e1RpY2tldE51bWJlcn0vZ2l4bXM7CiAgICBpZiAoICRUaWNrZXR7VGlja2V0SUR9ICkgewogICAgICAgICRQYXJhbXtUZXh0fSA9fiBzLyRTdGFydCBPVE9CT19RVUVVRSAkRW5kLyRUaWNrZXR7UXVldWV9L2dpeG1zOwogICAgfQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgJFBhcmFte1RleHR9ID1+IHMvJFN0YXJ0IE9UT0JPX1RJQ0tFVF9RVUVVRSAkRW5kLyRRdWV1ZXtOYW1lfS9naXhtczsKICAgIH0KCiAgICAjIGNsZWFudXAKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRUYWcuKz8kRW5kLy0vZ2k7CgogICAgIyBGb2xsb3ctdXAgZm9yIGJ1ZyMxMDgyNS4KICAgICMgU2V0IGRhdGEgZm9yIHJlcGxhY2luZyBvZiBzcGVjaWZpYyB0YWdzIGluIFRlbXBsYXRlczoKICAgICMgLSBPVE9CT19BR0VOVF9TVUJKRUNULCBPVE9CT19BR0VOVF9CT0RZIC0gc3ViamVjdC9ib2R5IG9mIHRoZSBDVVJSRU5UL0xBVEVTVCBhZ2VudCBhcnRpY2xlCiAgICAjIC0gT1RPQk9fQ1VTVE9NRVJfU1VCSkVDVCwgT1RPQk9fQ1VTVE9NRVJfQk9EWSAtIHN1YmplY3QvYm9keSBvZiB0aGUgQ1VSUkVOVC9MQVRFU1QgY3VzdG9tZXIgYXJ0aWNsZQogICAgIyAtIE9UT0JPX0FHRU5UX1NVQkpFQ1Rbbl0gICAgLSBmaXJzdCBuIGNoYXJhY3RlcnMgb2YgdGhlIHN1YmplY3Qgb2YgdGhlIENVUlJFTlQvTEFURVNUIGFnZW50IGFydGljbGUKICAgICMgLSBPVE9CT19BR0VOVF9CT0RZW25dICAgICAgIC0gZmlyc3QgbiBsaW5lcyBvZiB0aGUgYm9keSBvZiB0aGUgQ1VSUkVOVC9MQVRFU1QgYWdlbnQgYXJ0aWNsZQogICAgIyAtIE9UT0JPX0NVU1RPTUVSX1NVQkpFQ1Rbbl0gLSBmaXJzdCBuIGNoYXJhY3RlcnMgb2YgdGhlIHN1YmplY3Qgb2YgdGhlIENVUlJFTlQvTEFURVNUIGN1c3RvbWVyIGFydGljbGUKICAgICMgLSBPVE9CT19DVVNUT01FUl9CT0RZW25dICAgIC0gZmlyc3QgbiBsaW5lcyBvZiB0aGUgYm9keSBvZiB0aGUgQ1VSUkVOVC9MQVRFU1QgY3VzdG9tZXIgYXJ0aWNsZQogICAgIwogICAgIyBGb3IgTm90ZSB0ZW1wbGF0ZSB3ZSBuZWVkIHRoZSBsYXN0IGFydGljbGUuCiAgICAjIEZvciBBbnN3ZXIsICRQYXJhbXtEYXRhfSBoYXMgc2VsZWN0ZWQgb3IgbGFzdCBhcnRpY2xlIGRhdGEsIGRlcGVuZHMgd2hldGhlciBBcnRpY2xlSUQgaXMgc2VudCBvciBub3QuCiAgICAjIEZvciBGb3J3YXJkLCAkUGFyYW17RGF0YX0gaGFzIHRoZSBmb2xsb3dpbmcgYXJ0aWNsZSBkYXRhOgogICAgIyAtIGlmIEFydGljbGVJRCBpcyBzZW50LCBkYXRhIGlzIGZyb20gc2VsZWN0ZWQgYXJ0aWNsZS4KICAgICMgLSBpZiBBcnRpY2xlSUQgaXMgbm90IHNlbnQsIGRhdGEgaXMgZnJvbSBsYXN0IGN1c3RvbWVyL2FnZW50L2FueSBhcnRpY2xlLgogICAgaWYgKCAkUGFyYW17VGVtcGxhdGV9ICYmICRUaWNrZXR7VGlja2V0SUR9ICkgewogICAgICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwoKICAgICAgICBpZiAoICRQYXJhbXtUZW1wbGF0ZX0gZXEgJ05vdGUnICkgewoKICAgICAgICAgICAgIyBHZXQgbGFzdCBhcnRpY2xlIGZyb20gYWdlbnQuCiAgICAgICAgICAgIG15IEBBZ2VudEFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkUGFyYW17VGlja2V0RGF0YX0tPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlID0+ICdhZ2VudCcsCiAgICAgICAgICAgICAgICBPbmx5TGFzdCAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoQEFnZW50QXJ0aWNsZXMpIHsKICAgICAgICAgICAgICAgIG15ICVBZ2VudEFydGljbGUgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7ICRBZ2VudEFydGljbGVzWzBdIH0gKS0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgICAgICAgICAleyAkQWdlbnRBcnRpY2xlc1swXSB9LAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFBhcmFte0RhdGFBZ2VudH0tPntTdWJqZWN0fSA9ICRBZ2VudEFydGljbGV7U3ViamVjdH07CiAgICAgICAgICAgICAgICAkUGFyYW17RGF0YUFnZW50fS0+e0JvZHl9ICAgID0gJEFnZW50QXJ0aWNsZXtCb2R5fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBHZXQgbGFzdCBhcnRpY2xlIGZyb20gY3VzdG9tZXIuCiAgICAgICAgICAgIG15IEBDdXN0b21lckFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkUGFyYW17VGlja2V0RGF0YX0tPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlID0+ICdjdXN0b21lcicsCiAgICAgICAgICAgICAgICBPbmx5TGFzdCAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoQEN1c3RvbWVyQXJ0aWNsZXMpIHsKICAgICAgICAgICAgICAgIG15ICVDdXN0b21lckFydGljbGUgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7ICRDdXN0b21lckFydGljbGVzWzBdIH0gKS0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgICAgICAgICAleyAkQ3VzdG9tZXJBcnRpY2xlc1swXSB9LAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57U3ViamVjdH0gPSAkQ3VzdG9tZXJBcnRpY2xle1N1YmplY3R9OwogICAgICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57Qm9keX0gICAgPSAkQ3VzdG9tZXJBcnRpY2xle0JvZHl9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte1RlbXBsYXRlfSBlcSAnQW5zd2VyJyB8fCAkUGFyYW17VGVtcGxhdGV9IGVxICdGb3J3YXJkJyApIHsKCiAgICAgICAgICAgICMgSWYgJFBhcmFte0RhdGF9IGhhcyBhZ2VudCBhcnRpY2xlIGRhdGEsIHdlIHdpbGwgc2V0IHN1YmplY3QgYW5kIGJvZHkgaW4gJFBhcmFte0RhdGFBZ2VudH0KICAgICAgICAgICAgIyB0byB2YWx1ZXMgZnJvbSAkUGFyYW17RGF0YX0gaW4gb3JkZXIgdG8gcmlnaHQgcmVwbGFjaW5nIG9mIE9UT0JPX0FHRU5UX1NVQkpFQ1QvQk9EWSB0YWdzLgogICAgICAgICAgICBpZiAoICRQYXJhbXtEYXRhfS0+e1NlbmRlclR5cGV9ICYmICRQYXJhbXtEYXRhfS0+e1NlbmRlclR5cGV9IGVxICdhZ2VudCcgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17RGF0YUFnZW50fS0+e1N1YmplY3R9ID0gJFBhcmFte0RhdGF9LT57U3ViamVjdH07CiAgICAgICAgICAgICAgICAkUGFyYW17RGF0YUFnZW50fS0+e0JvZHl9ICAgID0gJFBhcmFte0RhdGF9LT57Qm9keX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY3VzdG9tZXIgYW5kIGFnZW50IHBhcmFtcyBhbmQgcmVwbGFjZSBpdCB3aXRoIDxPVE9CT19DVVNUT01FUl8uLi4gb3IgPE9UT0JPX0FHRU5UXy4uLgogICAgbXkgJUFydGljbGVEYXRhID0gKAogICAgICAgICdPVE9CT19DVVNUT01FUl8nID0+ICRQYXJhbXtEYXRhfSAgICAgIHx8IHt9LAogICAgICAgICdPVE9CT19BR0VOVF8nICAgID0+ICRQYXJhbXtEYXRhQWdlbnR9IHx8IHt9LAogICAgKTsKCiAgICAjIHVzZSBhIGxpc3QgdG8gZ2V0IGN1c3RvbWVyIGZpcnN0CiAgICBmb3IgbXkgJERhdGFUeXBlIChxdyhPVE9CT19DVVNUT01FUl8gT1RPQk9fQUdFTlRfKSkgewogICAgICAgIG15ICVEYXRhID0gJXsgJEFydGljbGVEYXRheyREYXRhVHlwZX0gfTsKCiAgICAgICAgIyBIVE1MIHF1b3Rpbmcgb2YgY29udGVudAogICAgICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKCiAgICAgICAgICAgIEFUVFJJQlVURToKICAgICAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJURhdGEgKSB7CiAgICAgICAgICAgICAgICBuZXh0IEFUVFJJQlVURSB1bmxlc3MgJERhdGF7JEF0dHJpYnV0ZX07CgogICAgICAgICAgICAgICAgJERhdGF7JEF0dHJpYnV0ZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJURhdGEpIHsKCiAgICAgICAgICAgICMgcmVwbGFjZSA8T1RPQk9fQ1VTVE9NRVJfKj4gYW5kIDxPVE9CT19BR0VOVF8qPiB0YWdzCiAgICAgICAgICAgICRUYWcgPSAkU3RhcnQgLiAkRGF0YVR5cGU7CiAgICAgICAgICAgICRIYXNoR2xvYmFsUmVwbGFjZS0+KCAkVGFnLCAlRGF0YSApOwoKICAgICAgICAgICAgIyBwcmVwYXJlIGJvZHkgKGluc2VydCBvbGQgZW1haWwpIDxPVE9CT19DVVNUT01FUl9FTUFJTFtuXT4sIDxPVE9CT19DVVNUT01FUl9OT1RFW25dPgogICAgICAgICAgICAjICAgPE9UT0JPX0NVU1RPTUVSX0JPRFlbbl0+LCA8T1RPQk9fQUdFTlRfRU1BSUxbbl0+Li4uLCA8T1RPQk9fQ09NTUVOVD4KCiAgICAgICAgICAgICMgSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBudW1iZXIgb2YgaW5jbHVkZWQgbGluZXMgY2FuIGJlIHNwZWNpZmllZC4KICAgICAgICAgICAgIyBUaGUgc2FtZSBrZXkgY2FuIG9jY3VyIG11bHRpcGxlIHRpbWVzLCBwb3NzaWJseSB3aXRoIGEgZGlmZmVyZW50IG51bWJlciBvZiBsaW5lcy4KICAgICAgICAgICAgIyBUaGUgbGFzdCBjdXN0b21lciBtYWlsIGlzIHVzZWQgZm9yIDxPVE9CT19DT01NRU5UPiBvciA8T1RPQk9fQ09NTUVOVFsxMjNdPgogICAgICAgICAgICAjIGFzIHRoZSBsb29wIHJlcGxhY2VzIHRoZSBjdXN0b21lciBtYWlsIGZpcnN0LgogICAgICAgICAgICAkUGFyYW17VGV4dH0gPX4gc3sKICAgICAgICAgICAgICAgICRTdGFydAogICAgICAgICAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgICAgICAgICAjIGUuZy4gT1RPQk9fQ09NTUVOVFsxM10sIE9UT0JPX0FHRU5UX0JPRFlbM10sIE9UT0JPX0NVU1RPTUVSX0JPRFlbMF0KICAgICAgICAgICAgICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVE9CT19DT01NRU5UCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7RGF0YVR5cGV9KD86RU1BSUx8Tk9URXxCT0RZKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXFsoPzxjbnQ+Lis/KVxdCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAjIGEgc3BlY2lhbCBjYXNlIGFzIE9UT0JPX0NPTU1FTlQgd2l0aG91dCBxdWFudGlmaWVyIGlzIGhhbmRsZWQgbm93aGVyZSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIE9UT0JPX0NPTU1FTlQKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAkRW5kCiAgICAgICAgICAgIH0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyBmb3IgPE9UT0JPX0NPTU1FTlQ+IHRydW5jYXRlIHBlciBkZWZhdWx0IGEgbG9uZyBtYWlsIGF0IDI1MDAKICAgICAgICAgICAgICAgICMgPE9UT0JPX0NVU1RPTUVSX0JPRFlbMF0gd291bGQgYWxzbyB5aWVsZCAyNTAwIGxpbmVzCiAgICAgICAgICAgICAgICBteSAkTnVtSGVhZExpbmVzID0gJCt7Y250fSB8fCAyNTAwOwoKICAgICAgICAgICAgICAgIG15ICROZXdPbGRCb2R5ICAgPSAnJzsKICAgICAgICAgICAgICAgIG15IEBCb2R5ICAgICAgICAgPSBzcGxpdCAvXG4vLCAkRGF0YXtCb2R5fTsKICAgICAgICAgICAgICAgIG15ICROdW1Cb2R5TGluZXMgPSBzY2FsYXIgQEJvZHk7CgogICAgICAgICAgICAgICAgQ09VTlRFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkQ291bnRlciAoIDAgLi4gJE51bUhlYWRMaW5lcyAtIDEgKSB7CgogICAgICAgICAgICAgICAgICAgICMgZG8gbm90IGdvIGJleW9uZCB0aGUgY29tcGxldGUgYm9keQogICAgICAgICAgICAgICAgICAgIGxhc3QgQ09VTlRFUiBpZiAkQ291bnRlciA+PSAkTnVtQm9keUxpbmVzOwoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBubyBxdW90ZSBjaGFyLCBkbyBpdCBsYXRlciBieSB1c2luZyBEb2N1bWVudENsZWFudXAoKQogICAgICAgICAgICAgICAgICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE5ld09sZEJvZHkgLj0gJEJvZHlbJENvdW50ZXJdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgIj4gIiBhcyBxdW90ZSBjaGFyCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdPbGRCb2R5IC49ICI+ICRCb2R5WyRDb3VudGVyXSI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBuZXcgbGluZSwgdW5sZXNzIHdlIGFyZSBhdCB0aGUgbGFzdCBpbmNsdWRlZCBsaW5lCiAgICAgICAgICAgICAgICAgICAgIyBub3Qgc3VyZSB3aHkgdGhlIGxhc3QgbGluZSBoYXMgYSBuZXdsaW5lIHdoZW4gdGhlCiAgICAgICAgICAgICAgICAgICAgIyB0aGUgYm9keSBoYXMgbGVzcyBsaW5lcyB0aGFuIHRoZSBzcGVjaWZpZWQgbGluZSBjb3VudAogICAgICAgICAgICAgICAgICAgIGlmICggJENvdW50ZXIgPCAoICROdW1IZWFkTGluZXMgLSAxICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdPbGRCb2R5IC49ICJcbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNob21wICROZXdPbGRCb2R5OwoKICAgICAgICAgICAgICAgICMgSFRNTCBxdW90aW5nIG9mIGNvbnRlbnQKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSAmJiAkTmV3T2xkQm9keSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgbmV3IGxpbmVzCiAgICAgICAgICAgICAgICAgICAgZm9yICggMSAuLiAxMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE5ld09sZEJvZHkgPX4gcy8oPGJyXC8+KVxzezAsMjB9JC8vZ3M7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBxdW90ZQogICAgICAgICAgICAgICAgICAgICROZXdPbGRCb2R5ID0gIjxibG9ja3F1b3RlIHR5cGU9XCJjaXRlXCI+JE5ld09sZEJvZHk8L2Jsb2NrcXVvdGU+IjsKICAgICAgICAgICAgICAgICAgICAkTmV3T2xkQm9keSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+RG9jdW1lbnRDbGVhbnVwKAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJE5ld09sZEJvZHksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHRoZSByZXBsYWNlbWVudAogICAgICAgICAgICAgICAgJE5ld09sZEJvZHkKICAgICAgICAgICAgfXhlZzsgICAgIyBhIHNpbmdsZSBwYXNzIG92ZXIgdGhlIG1hY3JvcyBpbiAkUGFyYW17VGV4dH0KCiAgICAgICAgICAgICMgcmVwbGFjZSA8T1RPQk9fQ1VTVE9NRVJfU1VCSkVDVFtdPiAgYW5kICA8T1RPQk9fQUdFTlRfU1VCSkVDVFtdPiB0YWdzCiAgICAgICAgICAgICRUYWcgPSAiJFN0YXJ0JERhdGFUeXBlIiAuICdTVUJKRUNUJzsKICAgICAgICAgICAgaWYgKCAkUGFyYW17VGV4dH0gPX4gLyRUYWdcWyguKz8pXF0kRW5kL2cgKSB7CgogICAgICAgICAgICAgICAgbXkgJFN1YmplY3RDaGFyID0gJDE7CiAgICAgICAgICAgICAgICBteSAkU3ViamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICAgICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkRGF0YXtTdWJqZWN0fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFN1YmplY3QgPX4gcy9eKC57JFN1YmplY3RDaGFyfSkuKiQvJDEgWy4uLl0vOwogICAgICAgICAgICAgICAgJFBhcmFte1RleHR9ID1+IHMvJFRhZ1xbLis/XF0kRW5kLyRTdWJqZWN0L2c7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJERhdGFUeXBlIGVxICdPVE9CT19DVVNUT01FUl8nICkgewoKICAgICAgICAgICAgICAgICMgR2V0IDxPVE9CT19FTUFJTF9EQVRFW10+IGZyb20gYm9keSBhbmQgcmVwbGFjZSB3aXRoIHJlY2VpdmVkIGRhdGUuCiAgICAgICAgICAgICAgICAjIFRPRE86IENsYXJpZnksIGFzIGl0IHJhdGhlciBsb29rcyBsaWtlIHRoZSBjdXJyZW50IGRhdGUgaXMgdXNlZC4KICAgICAgICAgICAgICAgICMgVGhpcyB0YWcgd2lsbCBiZSBhYmxlIHRvIHVzZSB3aXRoIHN1cHBvcnRlZCBPVE9CTyB0aW1lIHpvbmVzCiAgICAgICAgICAgICAgICAjICAgKCBlLmcuIDxPVE9CT19FTUFJTF9EQVRFW0V1cm9wZS9CZXJsaW5dPiwgPE9UT0JPX0VNQUlMX0RBVEVbQXNpYS9Ub2t5b10+LAogICAgICAgICAgICAgICAgIyAgIDxPVE9CT19FTUFJTF9EQVRFW0FtZXJpY2EvRGVudmVyXT4gLCAuLi4pLgogICAgICAgICAgICAgICAgIyBJZiB5b3UgdXNlIHRhZyB3aXRob3V0IHRpbWUgaW4gc2ltcGxlIGZvcm1hdCBhcyA8T1RPQk9fRU1BSUxfREFURT4sCiAgICAgICAgICAgICAgICAjICB0aW1lIHdpbGwgYmUgdHJhbnNmb3JtZWQgaW50byBPVE9CTyBTeXN0ZW1UaW1lWm9uZS4KICAgICAgICAgICAgICAgICRUYWcgPSAkU3RhcnQgLiAnT1RPQk9fRU1BSUxfREFURSc7CgogICAgICAgICAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICAgICAgICAgICAgICBteSAkU3lzdGVtVGltZVpvbmUgPSAkRGF0ZVRpbWVPYmplY3QtPk9UT0JPVGltZVpvbmVHZXQoKTsKCiAgICAgICAgICAgICAgICAkUGFyYW17VGV4dH0gPX4gc3sKICAgICAgICAgICAgICAgICAgICAkU3RhcnQKICAgICAgICAgICAgICAgICAgICAgICAgT1RPQk9fRU1BSUxfREFURQogICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSB0aW1lIHpvbmUgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcWyg/PHR6Pi4rPylcXQogICAgICAgICAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgICAgICRFbmQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkVGltZVpvbmUgPSAkK3t0en07CgogICAgICAgICAgICAgICAgICAgIGlmICggJFRpbWVab25lICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkVGltZVpvbmVWYWxpZCA9ICREYXRlVGltZU9iamVjdC0+SXNUaW1lWm9uZVZhbGlkKCBUaW1lWm9uZSA9PiAkVGltZVpvbmUgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRUaW1lWm9uZVZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0ZVRpbWVPYmplY3QtPlRvVGltZVpvbmUoIFRpbWVab25lID0+ICRUaW1lWm9uZSApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RheSBhdCB0aGUgc3lzdGVtIHRpbWUgem9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVab25lID0gJFN5c3RlbVRpbWVab25lOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVab25lID0gJFN5c3RlbVRpbWVab25lOwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0ZVRpbWVPYmplY3QtPlRvVGltZVpvbmUoIFRpbWVab25lID0+ICRUaW1lWm9uZSApOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjb25zdHJ1Y3QgdGhlIHJlcGxhY2VtZW50CiAgICAgICAgICAgICAgICAgICAgbXkgJEVtYWlsRGF0ZSA9ICREYXRlVGltZU9iamVjdC0+Rm9ybWF0KCBGb3JtYXQgPT4gJyVBLCAlQiAlZSwgJVkgYXQgJVQgJyApOwogICAgICAgICAgICAgICAgICAgICRFbWFpbERhdGUgLj0gIigkVGltZVpvbmUpIjsKCiAgICAgICAgICAgICAgICAgICAgIyB0aGUgcmVwbGFjZW1lbnQKICAgICAgICAgICAgICAgICAgICAkRW1haWxEYXRlOwogICAgICAgICAgICAgICAgfXhlZzsgICAgIyBhIHNpbmdsZSBwYXNzIG92ZXIgdGhlIG1hY3JvcyBpbiAkUGFyYW17VGV4dH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkRGF0YVR5cGUgZXEgJ09UT0JPX0NVU1RPTUVSXycgKSB7CgogICAgICAgICAgICAjIGdldCBhbmQgcHJlcGFyZSByZWFsIG5hbWUKICAgICAgICAgICAgJFRhZyA9ICRTdGFydCAuICdPVE9CT19DVVNUT01FUl9SRUFMTkFNRSc7CiAgICAgICAgICAgIGlmICggJFBhcmFte1RleHR9ID1+IC8kVGFnJEVuZC9pICkgewoKICAgICAgICAgICAgICAgIG15ICRGcm9tOwoKICAgICAgICAgICAgICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CgogICAgICAgICAgICAgICAgICAgICRGcm9tID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJOYW1lKAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdHJ5IHRvIGdldCB0aGUgcmVhbCBuYW1lIGRpcmVjdGx5IGZyb20gdGhlIGRhdGEKICAgICAgICAgICAgICAgICRGcm9tIC8vPSAkUmVjaXBpZW50e1JlYWxuYW1lfTsKCiAgICAgICAgICAgICAgICAjIGdldCByZWFsIG5hbWUgYmFzZWQgb24gcmVwbHktdG8KICAgICAgICAgICAgICAgIGlmICggISRGcm9tICYmICREYXRhe1JlcGx5VG99ICkgewoKICAgICAgICAgICAgICAgICAgICAkRnJvbSA9ICREYXRhe1JlcGx5VG99OwoKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBlbWFpbCBhZGRyZXNzZXMKICAgICAgICAgICAgICAgICAgICAkRnJvbSA9fiBzLyZsdDsuKiZndDt8PC4qPnxcKC4qXCl8XCJ8JnF1b3Q7fDt8LC8vZzsKCiAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgbGVhZGluZy90cmFpbGluZyBzcGFjZXMKICAgICAgICAgICAgICAgICAgICAkRnJvbSA9fiBzL15ccysvL2c7CiAgICAgICAgICAgICAgICAgICAgJEZyb20gPX4gcy9ccyskLy9nOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2VuZXJhdGUgcmVhbCBuYW1lIGJhc2VkIG9uIHNlbmRlciBsaW5lCiAgICAgICAgICAgICAgICBpZiAoICEkRnJvbSApIHsKICAgICAgICAgICAgICAgICAgICAkRnJvbSA9ICREYXRhe1RvfSB8fCAnJzsKCiAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgZW1haWwgYWRkcmVzc2VzCiAgICAgICAgICAgICAgICAgICAgJEZyb20gPX4gcy8mbHQ7LiomZ3Q7fDwuKj58XCguKlwpfFwifCZxdW90O3w7fCwvL2c7CgogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgICAgICAgICAgJEZyb20gPX4gcy9eXHMrLy9nOwogICAgICAgICAgICAgICAgICAgICRGcm9tID1+IHMvXHMrJC8vZzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgPE9UT0JPX0NVU1RPTUVSX1JFQUxOQU1FPiB3aXRoIGZyb20KICAgICAgICAgICAgICAgICRQYXJhbXtUZXh0fSA9fiBzLyRUYWckRW5kLyRGcm9tL2c7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY3VzdG9tZXIgZGF0YSBhbmQgcmVwbGFjZSBpdCB3aXRoIDxPVE9CT19DVVNUT01FUl9EQVRBXy4uLgogICAgJFRhZyAgPSAkU3RhcnQgLiAnT1RPQk9fQ1VTVE9NRVJfJzsKICAgICRUYWcyID0gJFN0YXJ0IC4gJ09UT0JPX0NVU1RPTUVSX0RBVEFfJzsKCiAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9IHx8ICRQYXJhbXtEYXRhfS0+e0N1c3RvbWVyVXNlcklEfSApIHsKCiAgICAgICAgbXkgJEN1c3RvbWVyVXNlcklEID0gJFBhcmFte0RhdGF9LT57Q3VzdG9tZXJVc2VySUR9IHx8ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9OwoKICAgICAgICBteSAlQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBIVE1MIHF1b3Rpbmcgb2YgY29udGVudAogICAgICAgIGlmICggJFBhcmFte1JpY2hUZXh0fSApIHsKCiAgICAgICAgICAgIEFUVFJJQlVURToKICAgICAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJUN1c3RvbWVyVXNlciApIHsKICAgICAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkQ3VzdG9tZXJVc2VyeyRBdHRyaWJ1dGV9OwogICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlcnskQXR0cmlidXRlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQ3VzdG9tZXJVc2VyeyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZXBsYWNlIGl0CiAgICAgICAgJEhhc2hHbG9iYWxSZXBsYWNlLT4oICIkVGFnfCRUYWcyIiwgJUN1c3RvbWVyVXNlciApOwogICAgfQoKICAgICMgQ2xlYW4gdXAgYWxsIG5vdCBuZWVkZWQgJzxPVE9CT19DVVNUT01FUl8nIGFuZCAnPE9UT0JPX0NVU1RPTUVSX0RBVEFfJyB0YWdzLgogICAgIyBOb3RlIHRoYXQgdGhpcyBpbmNsdWRlcyB0aGUgdGFncyB3aGljaCBiZWNhbWUgcGFydCBvZiB0aGUgcmVwbGFjZSB0ZXh0CiAgICAjIGJlY2F1c2UgdGhleSB3ZXJlIHByZXNlbnQgaW4gdGhlIG1hY3JvIHZhbHVlcy4KICAgICRQYXJhbXtUZXh0fSA9fiBzLyg/OiRUYWd8JFRhZzIpLis/JEVuZC8tL2dpOwoKICAgICMgY2xlYW51cCBhbGwgbm90IG5lZWRlZCA8T1RPQk9fQUdFTlRfIHRhZ3MKICAgICRUYWcgPSAkU3RhcnQgLiAnT1RPQk9fQUdFTlRfJzsKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRUYWcuKz8kRW5kLy0vZ2k7CgogICAgcmV0dXJuICRQYXJhbXtUZXh0fTsKfQoKPWhlYWQyIF9SZW1vdmVVblN1cHBvcnRlZFRhZygpCgpjbGVhbiB1cCBhbGwgbm90IHN1cHBvcnRlZCB0YWdzLiBUaGUgbm90IHN1cHBvcnRlZCB0YWdzIGFyZSByZXBsYWNlZAp3aXRoIHRoZSBtaW51cyBjaGFyYWN0ZXIgJy0nLgoKICAgIG15ICRUZXh0ID0gJFRlbXBsYXRlR2VuZXJhdG9yT2JqZWN0LT5fUmVtb3ZlVW5TdXBwb3J0ZWRUYWcoCiAgICAgICAgVGV4dCAgICAgICAgICAgICAgICAgPT4gJFNvbWVUZXh0V2l0aFRhZ3MsCiAgICAgICAgTGlzdE9mVW5TdXBwb3J0ZWRUYWcgPT4gXEBMaXN0T2ZVblN1cHBvcnRlZFRhZywKICAgICk7Cgo9Y3V0CgpzdWIgX1JlbW92ZVVuU3VwcG9ydGVkVGFnIHsKCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEl0ZW0gKHF3KFRleHQgTGlzdE9mVW5TdXBwb3J0ZWRUYWcpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JEl0ZW19ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkSXRlbSEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFN0YXJ0ID0gJzwnOwogICAgbXkgJEVuZCAgID0gJz4nOwogICAgaWYgKCAkU2VsZi0+e1JpY2hUZXh0fSApIHsKICAgICAgICAkU3RhcnQgPSAnJmx0Oyc7CiAgICAgICAgJEVuZCAgID0gJyZndDsnOwogICAgICAgICRQYXJhbXtUZXh0fSA9fiBzLyhcbnxccikvL2c7CiAgICB9CgogICAgIyBDbGVhbnVwIGFsbCBub3Qgc3VwcG9ydGVkIHRhZ3Mgd2l0aCBhbmQgd2l0aG91dCBudW1iZXIsIGUuZy4gT1RPQk9fQ1VTVE9NRVJfQk9EWSBhbmQgT1RPQk9fQ1VTVE9NRVJfQk9EWVtuXS4KICAgICMgU2VlIGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQzNjkgYW5kIGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTA4MjUuCiAgICBteSAkTm90U3VwcG9ydGVkVGFnID0gJFN0YXJ0IC4gIig/OiIgLiBqb2luKCAifCIsIEB7ICRQYXJhbXtMaXN0T2ZVblN1cHBvcnRlZFRhZ30gfSApIC4gIikoXFxbLio/XFxdKT8iIC4gJEVuZDsKICAgICRQYXJhbXtUZXh0fSA9fiBzLyROb3RTdXBwb3J0ZWRUYWcvLS9naTsKCiAgICByZXR1cm4gJFBhcmFte1RleHR9Owp9Cgo9aGVhZDIgX01hc2tTZW5zaXRpdmVWYWx1ZSgpCgpNYXNrIHNlbnNpdGl2ZSB2YWx1ZSwgaS5lLiBhIHBhc3N3b3JkLCBhIHNlY3VyaXR5IHRva2VuLCBldGMuCgogICAgbXkgJE1hc2tlZFZhbHVlID0gJFNlbGYtPl9NYXNrU2Vuc2l0aXZlVmFsdWUoCiAgICAgICAgS2V5ICAgICAgPT4gJ0RhdGFiYXNlUGFzc3dvcmQnLCAjIChyZXF1aXJlZCkgTmFtZSBvZiB0aGUgZmllbGQva2V5LgogICAgICAgIFZhbHVlICAgID0+ICdzZWNyZXR2YWx1ZScsICAgICAgIyAob3B0aW9uYWwpIFZhbHVlIHRvIHBvdGVudGlhbGx5IG1hc2suCiAgICAgICAgSXNDb25maWcgPT4gMSwgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgV2hldGhlciB0aGUgdmFsdWUgaXMgYSBjb25maWcgb3B0aW9uLCBkZWZhdWx0OiAwLgogICAgKTsKClJldHVybnMgbWFza2VkIHZhbHVlIGluIGNhc2UgdGhlIGtleSBpcyBtYXRjaGVkOgoKICAgJE1hc2tlZFZhbHVlID0gJ3h4eCc7Cgo9Y3V0CgpzdWIgX01hc2tTZW5zaXRpdmVWYWx1ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhJFBhcmFte0tleX0gfHwgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKCiAgICAjIFNraXAgbWFza2luZyBzZW5zaXRpdmUgdmFsdWVzIGZvciBEeW5hbWljIEZpZWxkcy4KICAgIHJldHVybiAkUGFyYW17VmFsdWV9IGlmICRQYXJhbXtLZXl9ID1+IHFyeyBkeW5hbWljZmllbGQgfXhpOwoKICAgICMgTWF0Y2ggZ2VuZXJhbCBrZXkgbmFtZXMsIGkuZS4gZnJvbSB0aGUgdXNlciBwcmVmZXJlbmNlcy4KICAgIG15ICRNYXRjaCA9IHFyeyBjb25maWd8c2VjcmV0fHBhc3N3fHVzZXJwd3xhdXRofHRva2VuIH14aTsKCiAgICAjIE1hdGNoIGZvcmJpZGRlbiBjb25maWcga2V5cy4KICAgIGlmICggJFBhcmFte0lzQ29uZmlnfSApIHsKICAgICAgICAkTWF0Y2ggPSBxcnsgKD86cGFzc3dvcmR8cHcpIFxkKiAkIH1zbXhpOwogICAgfQoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9IGlmICRQYXJhbXtLZXl9ICF+ICRNYXRjaDsKCiAgICByZXR1cm4gJ3h4eCc7Cn0KCj1lbmQgSW50ZXJuYWw6Cgo9Y3V0CgoxOwo=</File>
        <File Location="Custom/Kernel/System/Web/InterfaceCustomer.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL1N5c3RlbS9XZWIvSW50ZXJmYWNlQ3VzdG9tZXIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpJbnRlcmZhY2VDdXN0b21lcjsKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgbmFtZXNwYWNlOjphdXRvY2xlYW47CnVzZSB1dGY4OwoKIyBjb3JlIG1vZHVsZXMKdXNlIFRpbWU6OkhpUmVzICgpOwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoSXNBcnJheVJlZldpdGhEYXRhIElzSGFzaFJlZldpdGhEYXRhKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUgICAgICAoKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkVtYWlsJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNjaGVkdWxlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXNwb25zZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6V2ViOjpJbnRlcmZhY2VDdXN0b21lciAtIHRoZSBjdXN0b21lciB3ZWIgaW50ZXJmYWNlCgo9aGVhZDEgU1lOT1BTSVMKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6SW50ZXJmYWNlQ3VzdG9tZXI7CgogICAgIyBhIFBsYWNrIHJlcXVlc3QgaGFuZGxlcgogICAgbXkgJEFwcCA9IHN1YiB7CiAgICAgICAgbXkgJEVudiA9IHNoaWZ0OwoKICAgICAgICBteSAkSW50ZXJmYWNlID0gS2VybmVsOjpTeXN0ZW06OldlYjo6SW50ZXJmYWNlQ3VzdG9tZXItPm5ldygKICAgICAgICAgICAgIyBEZWJ1ZyA9PiAxCiAgICAgICAgICAgIFBTR0lFbnYgICAgPT4gJEVudiwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIGNvbnRlbnQgKGFjdHVhbGx5IGhlYWRlcnMgYXJlIGdlbmVyYXRlZCBhcyBhIHNpZGUgZWZmZWN0KQogICAgICAgIG15ICRDb250ZW50ID0gJEludGVyZmFjZS0+Q29udGVudCgpOwoKICAgICAgICAjIGFzc3VtaW5nIGFsbCB3ZW50IHdlbGwgYW5kIEhUTUwgd2FzIGdlbmVyYXRlZAogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICcyMDAnLAogICAgICAgICAgICBbICdDb250ZW50LVR5cGUnID0+ICd0ZXh0L2h0bWwnIF0sCiAgICAgICAgICAgICRDb250ZW50CiAgICAgICAgXTsKICAgIH07Cgo9aGVhZDEgREVTQ1JJUFRJT04KClRoaXMgbW9kdWxlIGdlbmVyYXRlcyB0aGUgSFRUUCByZXNwb25zZSBmb3IgRjxjdXN0b21lci5wbD4uClRoaXMgY2xhc3MgaXMgbWVhbnQgdG8gYmUgdXNlZCB3aXRoaW4gYSBQbGFjayByZXF1ZXN0IGhhbmRsZXIuClNlZSBGPGJpbi9wc2dpLWJpbi9vdG9iby5wc2dpPiBmb3IgdGhlIHJlYWwgbGl2ZSB1c2FnZS4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCmNyZWF0ZSB0aGUgd2ViIGludGVyZmFjZSBvYmplY3QgZm9yIEY8Y3VzdG9tZXIucGw+LgoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc3RhcnQgd2l0aCBhbiBlbXB0eSBoYXNoIGZvciB0aGUgbmV3IG9iamVjdAogICAgbXkgJFNlbGYgPSBibGVzcyB7fSwgJFR5cGU7CgogICAgIyBzZXQgZGVidWcgbGV2ZWwKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgICMgcGVyZm9ybWFuY2UgbG9nIGJhc2VkIG9uIGhpZ2ggcmVzb2x1dGlvbiB0aW1lc3RhbXBzCiAgICAkU2VsZi0+e1BlcmZvcm1hbmNlTG9nU3RhcnR9ID0gVGltZTo6SGlSZXM6OnRpbWUoKTsKCiAgICAjIHJlZ2lzdGVyIG9iamVjdCBwYXJhbXMKICAgICRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycgPT4gewogICAgICAgICAgICBMb2dQcmVmaXggPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdDR0lMb2dQcmVmaXgnKSB8fCAnQ3VzdG9tZXInLAogICAgICAgIH0sCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnID0+IHsKICAgICAgICAgICAgUFNHSUVudiA9PiAkUGFyYW17UFNHSUVudn0gfHwgMCwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGRlYnVnIGluZm8KICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdHbG9iYWwgaGFuZGxlIHN0YXJ0ZWQuLi4nLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgQ29udGVudCgpCgpleGVjdXRlIHRoZSBvYmplY3QuClNldCBoZWFkZXJzIGluIEtlcm5lbHM6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0IHNpbmdsZXRvbiBhcyBzaWRlIGVmZmVjdC4KCiAgICBteSAkQ29udGVudCA9ICRJbnRlcmZhY2UtPkNvbnRlbnQoKTsKCj1jdXQKCnN1YiBDb250ZW50IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgQ2hlY2sgaWYgaHR0cHMgZm9yY2luZyBpcyBhY3RpdmUsIGFuZCByZWRpcmVjdCBpZiBuZWVkZWQuCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnSFRUUFNGb3JjZVJlZGlyZWN0JykgJiYgISRQYXJhbU9iamVjdC0+SHR0cHNJc09uICkgewogICAgICAgIG15ICRIb3N0ICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkhlYWRlcignSG9zdCcpIHx8ICRDb25maWdPYmplY3QtPkdldCgnRlFETicpOwogICAgICAgIG15ICRSZXF1ZXN0VVJJICAgPSAkUGFyYW1PYmplY3QtPlJlcXVlc3RVUkkoKTsKICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggRXh0VVJMID0+ICJodHRwczovLyRIb3N0JFJlcXVlc3RVUkkiICk7ICAgICMgdGhyb3cgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24gZXhjZXB0aW9uCiAgICB9CgogICAgIyBnZXQgY29tbW9uIGZyYW1ld29yayBwYXJhbXMKICAgIG15ICVQYXJhbTsKICAgICRQYXJhbXtTZXNzaW9uTmFtZX0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxTZXNzaW9uTmFtZScpICAgICAgICAgfHwgJ0NTSUQnOwogICAgJFBhcmFte1Nlc3Npb25JRH0gICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtTZXNzaW9uTmFtZX0gKSB8fCAnJzsKCiAgICAjIGRyb3Agb2xkIHNlc3Npb24gaWQgKGlmIGV4aXN0cykKICAgIG15ICRRdWVyeVN0cmluZyA9ICRQYXJhbU9iamVjdC0+UXVlcnlTdHJpbmcoKSB8fCAnJzsKICAgICRRdWVyeVN0cmluZyA9fiBzLyhcP3wmfDt8KSRQYXJhbXtTZXNzaW9uTmFtZX0oPSZ8PTt8PS4rPyZ8PS4rPyQpLzsvZzsKCiAgICAjIGRlZmluZSBmcmFtZXdvcmsgcGFyYW1zCiAgICB7CiAgICAgICAgbXkgJUZyYW1ld29ya1BhcmFtcyA9ICgKICAgICAgICAgICAgTGFuZyAgICAgICAgID0+ICcnLAogICAgICAgICAgICBBY3Rpb24gICAgICAgPT4gJycsCiAgICAgICAgICAgIFN1YmFjdGlvbiAgICA9PiAnJywKICAgICAgICAgICAgUmVxdWVzdGVkVVJMID0+ICRRdWVyeVN0cmluZywKICAgICAgICApOwogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVGcmFtZXdvcmtQYXJhbXMgKSB7CiAgICAgICAgICAgICRQYXJhbXskS2V5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKSB8fCAkRnJhbWV3b3JrUGFyYW1zeyRLZXl9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHZhbGlkYXRlIGxhbmd1YWdlCiAgICBpZiAoICRQYXJhbXtMYW5nfSAmJiAkUGFyYW17TGFuZ30gIX4gbXtcQVthLXpdezJ9KD86X1tBLVpdezJ9KT9cen14bXMgKSB7CiAgICAgICAgZGVsZXRlICRQYXJhbXtMYW5nfTsKICAgIH0KCiAgICAjIENoZWNrIGlmIHRoZSBicm93c2VyIHNlbmRzIHRoZSBTZXNzaW9uSUQgY29va2llIGFuZCBzZXQgdGhlIFNlc3Npb25JRC1jb29raWUKICAgICMgYXMgU2Vzc2lvbklEISBHRVQgb3IgUE9TVCBTZXNzaW9uSUQgaGF2ZSB0aGUgbG93ZXN0IHByaW9yaXR5LgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWUnKSApIHsKICAgICAgICAkUGFyYW17U2Vzc2lvbklEQ29va2llfSA9ICRQYXJhbU9iamVjdC0+R2V0Q29va2llKCBLZXkgPT4gJFBhcmFte1Nlc3Npb25OYW1lfSApOwogICAgICAgIGlmICggJFBhcmFte1Nlc3Npb25JRENvb2tpZX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtTZXNzaW9uSUR9ID0gJFBhcmFte1Nlc3Npb25JRENvb2tpZX07CiAgICAgICAgfQogICAgfQoKICAgICRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcgPT4gewogICAgICAgICAgICBMYW5nID0+ICRQYXJhbXtMYW5nfSwKICAgICAgICB9LAogICAgICAgICdLZXJuZWw6Okxhbmd1YWdlJyA9PiB7CiAgICAgICAgICAgIFVzZXJMYW5ndWFnZSA9PiAkUGFyYW17TGFuZ30KICAgICAgICB9LAogICAgKTsKCiAgICBteSAkREJDYW5Db25uZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkNvbm5lY3QoKTsKCiAgICBpZiAoICEkREJDYW5Db25uZWN0IHx8ICRQYXJhbU9iamVjdC0+RXJyb3IoKSApIHsKICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgICAgIGlmICggISREQkNhbkNvbm5lY3QgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICB9CiAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkVycm9yKCkgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFBhcmFtT2JqZWN0LT5FcnJvcigpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOyAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjb21tb24gYXBwbGljYXRpb24gYW5kIGFkZC1vbiBhcHBsaWNhdGlvbiBwYXJhbXMKICAgIG15ICVDb21tb25PYmplY3RQYXJhbSA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6Q29tbW9uUGFyYW0nKSB9OwogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJUNvbW1vbk9iamVjdFBhcmFtICkgewogICAgICAgICRQYXJhbXskS2V5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKSB8fCAkQ29tbW9uT2JqZWN0UGFyYW17JEtleX07CiAgICB9CgogICAgIyBzZWN1cml0eSBjaGVjayBBY3Rpb24gUGFyYW0gKHJlcGxhY2Ugbm9uLXdvcmQgY2hhcnMpCiAgICAkUGFyYW17QWN0aW9ufSA9fiBzL1xXLy9nOwoKICAgIG15ICRTZXNzaW9uT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyk7CiAgICBteSAkVXNlck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICAjIGNoZWNrIHJlcXVlc3QgdHlwZQogICAgaWYgKCAkUGFyYW17QWN0aW9ufSBlcSAnUHJlTG9naW4nICkgewogICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICAgICAgJFBhcmFte1JlcXVlc3RlZFVSTH0gfHw9ICdBY3Rpb249Q3VzdG9tZXJEYXNoYm9hcmQnOwoKICAgICAgICAjIGxvZ2luIHNjcmVlbgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICBUaXRsZSA9PiAnTG9naW4nLAogICAgICAgICAgICBNb2RlICA9PiAnUHJlTG9naW4nLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FjdGlvbn0gZXEgJ0xvZ2luJyApIHsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFBvc3RVc2VyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1VzZXInICkgfHwgJyc7CgogICAgICAgIG15ICRQcmV2ZW50QnJ1dGVGb3JjZUNvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnU2ltcGxlQnJ1dGVGb3JjZVByb3RlY3Rpb246OkdlbmVyYWxTZXR0aW5ncycpOwoKICAgICAgICAjIGlmIHNpbXBsZWJydXRlZm9yY2Vjb25maWcgaXMgdmFsaWQKICAgICAgICBpZiAoICRQcmV2ZW50QnJ1dGVGb3JjZUNvbmZpZyAmJiAkUG9zdFVzZXIgKSB7CgogICAgICAgICAgICAjIGNoZWNrIGlmIHRoZSBsb2dpbiBpcyBiYW5uZWQKICAgICAgICAgICAgbXkgJENhY2hlT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgICAgICAgICAgbXkgJENoZWNrSGFzaFVzZXIgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0Jhbm5lZExvZ2luc0N1c3RvbWVyJywKICAgICAgICAgICAgICAgIEtleSAgPT4gJFBvc3RVc2VyLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBDYWNoZSBDaGVja0hhc2hVc2VyIGV4aXN0cwogICAgICAgICAgICBpZiAoJENoZWNrSGFzaFVzZXIpIHsKICAgICAgICAgICAgICAgIG15ICVCYW5TdGF0dXMgPSAkU2VsZi0+X0NoZWNrQW5kUmVtb3ZlRnJvbUJhbm5lZExpc3QoCiAgICAgICAgICAgICAgICAgICAgUG9zdFVzZXIgICAgICAgICAgICAgICAgPT4gJFBvc3RVc2VyLAogICAgICAgICAgICAgICAgICAgIFByZXZlbnRCcnV0ZUZvcmNlQ29uZmlnID0+ICRQcmV2ZW50QnJ1dGVGb3JjZUNvbmZpZywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkQmFuU3RhdHVze0Jhbm5lZH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgb3V0cHV0IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdMb2dpbicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RvbyBtYW55IGZhaWxlZCBsb2dpbiBhdHRlbXB0cywgcGxlYXNlIHJldHJ5IGluICVzIHMuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRCYW5TdGF0dXN7UmVzaWR1YWxUaW1lfQogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICBMb2dpbkZhaWxlZCA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVHlwZSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyICAgICAgICA9PiAkUG9zdFVzZXIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJFBvc3RQdyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgICAgIFBhcmFtID0+ICdQYXNzd29yZCcsCiAgICAgICAgICAgIFJhdyAgID0+IDEKICAgICAgICApIHx8ICcnOwogICAgICAgIG15ICRQb3N0VHdvRmFjdG9yVG9rZW4gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgICAgICBQYXJhbSA9PiAnVHdvRmFjdG9yVG9rZW4nLAogICAgICAgICAgICBSYXcgICA9PiAxCiAgICAgICAgKSB8fCAnJzsKCiAgICAgICAgIyBjcmVhdGUgQXV0aE9iamVjdAogICAgICAgIG15ICRBdXRoT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aCcpOwoKIyBSb3RoZXIgT1NTIC8gT25lVGltZUF1dGhlbnRpY2F0aW9uTGluawogICAgICAgIG15ICVFeHRlbmRlZEF1dGhQYXJhbXM7CiAgICAgICAgZm9yIG15ICROYW1lICggJEF1dGhPYmplY3QtPkV4dGVuZGVkUGFyYW1OYW1lcygpICkgewogICAgICAgICAgICAkRXh0ZW5kZWRBdXRoUGFyYW1zeyROYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAkTmFtZSwKICAgICAgICAgICAgICAgIFJhdyAgID0+IDEKICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICB9CiMgRU8gT25lVGltZUF1dGhlbnRpY2F0aW9uTGluawoKICAgICAgICAjIGNoZWNrIHN1Ym1pdHRlZCBkYXRhCiAgICAgICAgbXkgJFVzZXIgPSAkQXV0aE9iamVjdC0+QXV0aCgKICAgICAgICAgICAgVXNlciAgICAgICAgICAgPT4gJFBvc3RVc2VyLAogICAgICAgICAgICBQdyAgICAgICAgICAgICA9PiAkUG9zdFB3LAogICAgICAgICAgICBUd29GYWN0b3JUb2tlbiA9PiAkUG9zdFR3b0ZhY3RvclRva2VuLAojIFJvdGhlciBPU1MgLyBPbmVUaW1lQXV0aGVudGljYXRpb25MaW5rCiAgICAgICAgICAgICVFeHRlbmRlZEF1dGhQYXJhbXMsCiMgRU8gT25lVGltZUF1dGhlbnRpY2F0aW9uTGluawogICAgICAgICk7CgogICAgICAgICMgYWRkaXRpb25hbCB0YXNrcyAvIGluZm8KICAgICAgICBteSAkUG9zdEF1dGggPSAkQXV0aE9iamVjdC0+UG9zdEF1dGgoKTsKCiAgICAgICAgaWYgKCRQb3N0QXV0aCkgewogICAgICAgICAgICAkUGFyYW17UmVxdWVzdGVkVVJMfSA9ICRQb3N0QXV0aC0+e1JlcXVlc3RlZFVSTH0gLy8gJFBhcmFte1JlcXVlc3RlZFVSTH07CiAgICAgICAgfQoKICAgICAgICAjIGxvZ2luIGlzIGludmFsaWQKICAgICAgICBpZiAoICEkVXNlciApIHsKCiAgICAgICAgICAgIG15ICRFeHBpcmVzID0gJysnIC4gJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uTWF4VGltZScpIC4gJ3MnOwogICAgICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWVBZnRlckJyb3dzZXJDbG9zZScpICkgewogICAgICAgICAgICAgICAgJEV4cGlyZXMgPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0ZW50YXRpdmVseSBzZXQgYW4gdXNlbGVzcyBjb29raWUsIGZvciBjaGVja2luZyBjb29raWUgc3VwcG9ydAogICAgICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRDb29raWUoCiAgICAgICAgICAgICAgICBLZXkgICAgID0+ICdPVE9CT0Jyb3dzZXJIYXNDb29raWUnLAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAnT1RPQk9Ccm93c2VySGFzQ29va2llJywKICAgICAgICAgICAgICAgIFZhbHVlICAgPT4gMSwKICAgICAgICAgICAgICAgIEV4cGlyZXMgPT4gJEV4cGlyZXMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGFsdGVybmF0ZSBsb2dpbgogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWVzdGVkVVJMfSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ICk7CgogICAgICAgICAgICAgICAgIyB0aHJvdyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbiB0aGF0IHJlZGlyZWN0cwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgRXh0VVJMID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykgLiAiP1JlYXNvbj1Mb2dpbkZhaWxlZCZSZXF1ZXN0ZWRVUkw9JFBhcmFte1JlcXVlc3RlZFVSTH0iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUHJldmVudEJydXRlRm9yY2VDb25maWcgJiYgJFBvc3RVc2VyICkgewoKICAgICAgICAgICAgICAgICMgcHJldmVudCBicnV0ZSBmb3JjZQogICAgICAgICAgICAgICAgbXkgJEJhbm5lZCA9ICRTZWxmLT5fU3RvcmVGYWlsZWRMb2dpbnMoCiAgICAgICAgICAgICAgICAgICAgUG9zdFVzZXIgICAgICAgICAgICAgICAgPT4gJFBvc3RVc2VyLAogICAgICAgICAgICAgICAgICAgIFByZXZlbnRCcnV0ZUZvcmNlQ29uZmlnID0+ICRQcmV2ZW50QnJ1dGVGb3JjZUNvbmZpZywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCRCYW5uZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdMb2dpbicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RvbyBtYW55IGZhaWxlZCBsb2dpbiBhdHRlbXB0cywgcGxlYXNlIHJldHJ5IGluICVzIHMuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQcmV2ZW50QnJ1dGVGb3JjZUNvbmZpZy0+e0JhbkR1cmF0aW9ufQogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICBMb2dpbkZhaWxlZCA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVHlwZSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyICAgICAgICA9PiAkUG9zdFVzZXIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IG5vcm1hbCBsb2dpbgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJEF1dGhPYmplY3QtPkdldExhc3RFcnJvck1lc3NhZ2UoKQogICAgICAgICAgICAgICAgICAgIHx8ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+R2V0TG9nRW50cnkoCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ0luZm8nLAogICAgICAgICAgICAgICAgICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgfHwgVHJhbnNsYXRhYmxlKCdMb2dpbiBmYWlsZWQhIFlvdXIgdXNlciBuYW1lIG9yIHBhc3N3b3JkIHdhcyBlbnRlcmVkIGluY29ycmVjdGx5LicpLAogICAgICAgICAgICAgICAgTG9naW5GYWlsZWQgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXIgICAgICAgID0+ICRQb3N0VXNlciwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbG9naW4gaXMgc3VjY2Vzc2Z1bAogICAgICAgIG15ICVVc2VyRGF0YSA9ICRVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyICA9PiAkVXNlciwKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIGNvb2tpZXMKICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0Q29va2llKCBLZXkgPT4gJ09UT0JPQnJvd3Nlckhhc0Nvb2tpZScgKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnID0+IHsKICAgICAgICAgICAgICAgICAgICBCcm93c2VySGFzQ29va2llID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBuZWVkZWQgZGF0YQogICAgICAgIGlmICggISRVc2VyRGF0YXtVc2VySUR9IHx8ICEkVXNlckRhdGF7VXNlckxvZ2lufSApIHsKCiAgICAgICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGFsdGVybmF0ZSBsb2dpbgogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykgKSB7CgogICAgICAgICAgICAgICAgIyB0aHJvdyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbiB0aGF0IHJlZGlyZWN0cwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgRXh0VVJMID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykgLiAnP1JlYXNvbj1TeXN0ZW1FcnJvcicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgbmVlZCB1c2VyIGRhdGEgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdBdXRoZW50aWNhdGlvbiBzdWNjZWVkZWQsIGJ1dCBubyBjdXN0b21lciByZWNvcmQgaXMgZm91bmQgaW4gdGhlIGN1c3RvbWVyIGJhY2tlbmQuIFBsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgZGF0ZXRpbWUgb2JqZWN0CiAgICAgICAgbXkgJFNlc3Npb25EVE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwoKICAgICAgICAjIFJlbW92ZSBjZXJ0YWluIHVzZXIgYXR0cmlidXRlcyB0aGF0IGFyZSBub3QgbmVlZGVkIHRvIGJlIHN0b3JlZCBpbiB0aGUgc2Vzc2lvbi4KICAgICAgICAjICAgLSBTTUlNRSBDZXJ0aWZpY2F0ZSBjb3VsZCBiZSBpbiBiaW5hcnkgZm9ybWF0LCBpZiBzZXNzaW9uIGJhY2tlbmQgaW4gREIgKGRlZmF1bHQpCiAgICAgICAgIyAgIGl0IHdvbnQgYmUgcG9zc2libGUgdG8gYmUgc2F2ZWQgaW4gY2VydGFpbiBkYXRhYmFzZXMgKHNlZSBidWcjMTQ0MDUpLgogICAgICAgIG15ICVVc2VyU2Vzc2lvbkRhdGEgPSAlVXNlckRhdGE7CiAgICAgICAgZGVsZXRlICRVc2VyU2Vzc2lvbkRhdGF7VXNlclNNSU1FQ2VydGlmaWNhdGV9OwoKICAgICAgICAjIGNyZWF0ZSBuZXcgc2Vzc2lvbiBpZAogICAgICAgIG15ICROZXdTZXNzaW9uSUQgPSAkU2Vzc2lvbk9iamVjdC0+Q3JlYXRlU2Vzc2lvbklEKAogICAgICAgICAgICAlVXNlclNlc3Npb25EYXRhLAogICAgICAgICAgICBVc2VyTGFzdFJlcXVlc3QgPT4gJFNlc3Npb25EVE9iamVjdC0+VG9FcG9jaCgpLAogICAgICAgICAgICBVc2VyVHlwZSAgICAgICAgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgU2Vzc2lvblNvdXJjZSAgID0+ICdDdXN0b21lckludGVyZmFjZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UgaWYgbm8gc2Vzc2lvbiBpZCBoYXMgYmVlbiBjcmVhdGVkCiAgICAgICAgaWYgKCAhJE5ld1Nlc3Npb25JRCApIHsKCiAgICAgICAgICAgICMgZ2V0IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgbXkgJEVycm9yID0gJFNlc3Npb25PYmplY3QtPlNlc3Npb25JREVycm9yTWVzc2FnZSgpIHx8ICcnOwoKICAgICAgICAgICAgIyBvdXRwdXQgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTG9naW4oCiAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdMb2dpbicsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRFcnJvciwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZXhlY3V0aW9uIGluIDIwIHNlY29uZHMKICAgICAgICBteSAkRXhlY3V0aW9uVGltZU9iaiA9ICRTZXNzaW9uRFRPYmplY3QtPkNsb25lKCk7CiAgICAgICAgJEV4ZWN1dGlvblRpbWVPYmotPkFkZCggU2Vjb25kcyA9PiAyMCApOwogICAgICAgIG15ICRFeGVjdXRpb25UaW1lID0gJEV4ZWN1dGlvblRpbWVPYmotPlRvU3RyaW5nKCk7CgogICAgICAgICMgYWRkIGEgYXN5bmNocm9ub3VzIGV4ZWN1dG9yIHNjaGVkdWxlciB0YXNrIHRvIGNvdW50IHRoZSBjb25jdXJyZW50IHVzZXIKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2NoZWR1bGVyJyktPlRhc2tBZGQoCiAgICAgICAgICAgIEV4ZWN1dGlvblRpbWUgICAgICAgICAgICA9PiAkRXhlY3V0aW9uVGltZSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICdBc3luY2hyb25vdXNFeGVjdXRvcicsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICAgICA9PiAnUGx1Z2luQXN5bmNocm9ub3VzOjpDb25jdXJyZW50VXNlcicsCiAgICAgICAgICAgIE1heGltdW1QYXJhbGxlbEluc3RhbmNlcyA9PiAxLAogICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0ICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpTdXBwb3J0RGF0YUNvbGxlY3Rvcjo6UGx1Z2luQXN5bmNocm9ub3VzOjpPVE9CTzo6Q29uY3VycmVudFVzZXJzJywKICAgICAgICAgICAgICAgIEZ1bmN0aW9uID0+ICdSdW5Bc3luY2hyb25vdXMnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIG15ICRVc2VyVGltZVpvbmUgPSAkU2VsZi0+X1VzZXJUaW1lWm9uZUdldCglVXNlckRhdGEpOwoKICAgICAgICAkU2Vzc2lvbk9iamVjdC0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJE5ld1Nlc3Npb25JRCwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdVc2VyVGltZVpvbmUnLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFVzZXJUaW1lWm9uZSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHRoZSB0aW1lIHpvbmUgb2Zmc2V0IHJlcG9ydGVkIGJ5IHRoZSB1c2VyJ3MgYnJvd3NlciBkaWZmZXJzIGZyb20gdGhhdAogICAgICAgICMgb2YgdGhlIE9UT0JPIHVzZXIncyB0aW1lIHpvbmUgb2Zmc2V0CiAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBUaW1lWm9uZSA9PiAkVXNlclRpbWVab25lLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJE9UT0JPVXNlclRpbWVab25lT2Zmc2V0ID0gJERhdGVUaW1lT2JqZWN0LT5Gb3JtYXQoIEZvcm1hdCA9PiAnJXtvZmZzZXR9JyApIC8gNjA7CiAgICAgICAgbXkgJEJyb3dzZXJUaW1lWm9uZU9mZnNldCAgID0gKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGltZVpvbmVPZmZzZXQnICkgfHwgMCApICogLTE7CgogICAgICAgICMgVGltZVpvbmVPZmZzZXREaWZmZXJlbmNlIGNvbnRhaW5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoZSB0aW1lIHpvbmUgb2Zmc2V0IGJldHdlZW4KICAgICAgICAjIHRoZSB1c2VyJ3MgT1RPQk8gdGltZSB6b25lIHNldHRpbmcgYW5kIHRoZSBvbmUgcmVwb3J0ZWQgYnkgdGhlIHVzZXIncyBicm93c2VyLgogICAgICAgICMgSWYgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGl0IGNhbiBiZSBldmFsdWF0ZWQgbGF0ZXIgdG8gZS4gZy4gc2hvdyBhIG1lc3NhZ2UKICAgICAgICAjIGZvciB0aGUgdXNlciB0byBjaGVjayBoaXMgT1RPQk8gdGltZSB6b25lIHNldHRpbmcuCiAgICAgICAgbXkgJFVzZXJUaW1lWm9uZU9mZnNldERpZmZlcmVuY2UgPSBhYnMoICRPVE9CT1VzZXJUaW1lWm9uZU9mZnNldCAtICRCcm93c2VyVGltZVpvbmVPZmZzZXQgKTsKICAgICAgICAkU2Vzc2lvbk9iamVjdC0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJE5ld1Nlc3Npb25JRCwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdVc2VyVGltZVpvbmVPZmZzZXREaWZmZXJlbmNlJywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRVc2VyVGltZVpvbmVPZmZzZXREaWZmZXJlbmNlLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGEgbmV3IExheW91dE9iamVjdCB3aXRoIFNlc3Npb25JRENvb2tpZQogICAgICAgIG15ICRFeHBpcmVzID0gJysnIC4gJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uTWF4VGltZScpIC4gJ3MnOwogICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZUFmdGVyQnJvd3NlckNsb3NlJykgKSB7CiAgICAgICAgICAgICRFeHBpcmVzID0gJyc7CiAgICAgICAgfQoKICAgICAgICAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyA9PiB7CiAgICAgICAgICAgICAgICBTZXRDb29raWVzICA9PiB7fSwKICAgICAgICAgICAgICAgIFNlc3Npb25JRCAgID0+ICROZXdTZXNzaW9uSUQsCiAgICAgICAgICAgICAgICBTZXNzaW9uTmFtZSA9PiAkUGFyYW17U2Vzc2lvbk5hbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQtPlNldENvb2tpZSgKICAgICAgICAgICAgUmVnaXN0ZXJJbk9NID0+IDEsCiAgICAgICAgICAgIEtleSAgICAgICAgICA9PiAnU2Vzc2lvbklEQ29va2llJywKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRQYXJhbXtTZXNzaW9uTmFtZX0sCiAgICAgICAgICAgIFZhbHVlICAgICAgICA9PiAkTmV3U2Vzc2lvbklELAogICAgICAgICAgICBFeHBpcmVzICAgICAgPT4gJEV4cGlyZXMsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGhlIE9UT0JPQnJvd3Nlckhhc0Nvb2tpZSBjb29raWUKICAgICAgICBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0LT5TZXRDb29raWUoCiAgICAgICAgICAgIFJlZ2lzdGVySW5PTSA9PiAxLAogICAgICAgICAgICBLZXkgICAgICAgICAgPT4gJ09UT0JPQnJvd3Nlckhhc0Nvb2tpZScsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT1RPQk9Ccm93c2VySGFzQ29va2llJywKICAgICAgICAgICAgVmFsdWUgICAgICAgID0+ICcnLAogICAgICAgICAgICBFeHBpcmVzICAgICAgPT4gJy0xeScsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWRpcmVjdCB3aXRoIG5ldyBzZXNzaW9uIGlkIGFuZCBvbGQgcGFyYW1zCiAgICAgICAgIyBwcmVwYXJlIG9sZCByZWRpcmVjdCBVUkwgLS0gZG8gbm90IHJlZGlyZWN0IHRvIExvZ2luIG9yIExvZ291dCAobG9vcCkhCiAgICAgICAgaWYgKCAkUGFyYW17UmVxdWVzdGVkVVJMfSA9fiAvQWN0aW9uPShMb2dvdXR8TG9naW58TG9zdFBhc3N3b3JkfFByZUxvZ2luKS8gKSB7CiAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjIHJlZGlyZWN0IHdpdGggbmV3IHNlc3Npb24gaWQKICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgICAgPT4gJFBhcmFte1JlcXVlc3RlZFVSTH0sCiAgICAgICAgICAgIExvZ2luID0+IDEsCiAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgIH0KCiAgICAjIGxvZ291dAogICAgZWxzaWYgKCAkUGFyYW17QWN0aW9ufSBlcSAnTG9nb3V0JyApIHsKCiAgICAgICAgIyBjaGVjayBzZXNzaW9uIGlkCiAgICAgICAgaWYgKCAhJFNlc3Npb25PYmplY3QtPkNoZWNrU2Vzc2lvbklEKCBTZXNzaW9uSUQgPT4gJFBhcmFte1Nlc3Npb25JRH0gKSApIHsKCiAgICAgICAgICAgICMgbmV3IGxheW91dCBvYmplY3QKICAgICAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gYWx0ZXJuYXRlIGxvZ2luCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsTG9naW5VUkwnKSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSggJFBhcmFte1JlcXVlc3RlZFVSTH0gKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBFeHRVUkwgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsTG9naW5VUkwnKQogICAgICAgICAgICAgICAgICAgICAgICAuICI/UmVhc29uPUludmFsaWRTZXNzaW9uSUQ7UmVxdWVzdGVkVVJMPSRQYXJhbXtSZXF1ZXN0ZWRVUkx9IiwKICAgICAgICAgICAgICAgICk7ICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBsb2dpbiBzY3JlZW4KICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTG9naW4oCiAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdMb2dvdXQnLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1Nlc3Npb24gaW52YWxpZC4gUGxlYXNlIGxvZyBpbiBhZ2Fpbi4nKSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlc3Npb24gZGF0YQogICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZXNzaW9uT2JqZWN0LT5HZXRTZXNzaW9uSUREYXRhKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFBhcmFte1Nlc3Npb25JRH0sCiAgICAgICAgKTsKCiAgICAgICAgJFVzZXJEYXRhe1VzZXJUaW1lWm9uZX0gPSAkU2VsZi0+X1VzZXJUaW1lWm9uZUdldCglVXNlckRhdGEpOwoKICAgICAgICAjIGNyZWF0ZSBhIG5ldyBMYXlvdXRPYmplY3Qgd2l0aCAnJVBhcmFtJyBhbmQgJyVVc2VyRGF0YScKICAgICAgICAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyA9PiB7CiAgICAgICAgICAgICAgICBTZXRDb29raWVzID0+IHt9LAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRoZSBPVE9CTyBzZXNzaW9uIGNvb2tpZQogICAgICAgIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQtPlNldENvb2tpZSgKICAgICAgICAgICAgUmVnaXN0ZXJJbk9NID0+IDEsCiAgICAgICAgICAgIEtleSAgICAgICAgICA9PiAnU2Vzc2lvbklEQ29va2llJywKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRQYXJhbXtTZXNzaW9uTmFtZX0sCiAgICAgICAgICAgIFZhbHVlICAgICAgICA9PiAnJywKICAgICAgICAgICAgRXhwaXJlcyAgICAgID0+ICctMXknLAogICAgICAgICk7CgogICAgICAgICRLZXJuZWw6Ok9NLT5PYmplY3RzRGlzY2FyZCggT2JqZWN0cyA9PiBbJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnXSApOwogICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgICMgcmVtb3ZlIHNlc3Npb24gaWQKICAgICAgICBpZiAoICEkU2Vzc2lvbk9iamVjdC0+UmVtb3ZlU2Vzc2lvbklEKCBTZXNzaW9uSUQgPT4gJFBhcmFte1Nlc3Npb25JRH0gKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpCiAgICAgICAgICAgICk7ICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgfQoKICAgICAgICAjIHJlZGlyZWN0IHRvIGFsdGVybmF0ZSBsb2dpbgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsTG9nb3V0VVJMJykgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgRXh0VVJMID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ291dFVSTCcpLAogICAgICAgICAgICApOyAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgIH0KCiAgICAgICAgIyB0cnkgYXV0aCBtb2R1bGUgc3BlY2lmaWMgbG9nb3V0CiAgICAgICAgbXkgJExvZ291dEluZm8gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJBdXRoJyktPkxvZ291dCgpOwogICAgICAgIGlmICggJExvZ291dEluZm8gJiYgJExvZ291dEluZm8tPntMb2dvdXRVUkx9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIEV4dFVSTCA9PiAkTG9nb3V0SW5mby0+e0xvZ291dFVSTH0sCiAgICAgICAgICAgICk7ICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgfQoKICAgICAgICAjIHNob3cgbG9nb3V0IHNjcmVlbgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICBUaXRsZSAgICAgICA9PiAnTG9nb3V0JywKICAgICAgICAgICAgTWVzc2FnZSAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdMb2dvdXQgc3VjY2Vzc2Z1bC4nKSwKICAgICAgICAgICAgTWVzc2FnZVR5cGUgPT4gJ1N1Y2Nlc3MnLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGxvc3QgcGFzc3dvcmQKICAgIGVsc2lmICggJFBhcmFte0FjdGlvbn0gZXEgJ0N1c3RvbWVyTG9zdFBhc3N3b3JkJyApIHsKCiAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgIyBjaGVjayBmZWF0dXJlCiAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsTG9zdFBhc3N3b3JkJykgKSB7CgogICAgICAgICAgICAjIHNob3cgbm9ybWFsIGxvZ2luCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnTG9naW4nLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0ZlYXR1cmUgbm90IGFjdGl2ZSEnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRVc2VyICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdVc2VyJyApICB8fCAnJzsKICAgICAgICBteSAkVG9rZW4gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVG9rZW4nICkgfHwgJyc7CgogICAgICAgICMgZ2V0IHVzZXIgbG9naW4gYnkgdG9rZW4KICAgICAgICBpZiAoICEkVXNlciAmJiAkVG9rZW4gKSB7CgogICAgICAgICAgICAjIFByZXZlbnQgZXh0cmFjdGluZyBwYXNzd29yZCByZXNldCB0b2tlbiBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIHZpYSB3aWxkY2FyZCBpbmplY3Rpb24KICAgICAgICAgICAgIyBUaGUgd2lsZCBjYXJkIGNoYXJhY3RlcnMgIiUiIGFuZCAiXyIgY291bGQgYmUgdXNlZCB0byBtYXRjaCBhcmJpdHJhcnkgY2hhcmFjdGVyLgogICAgICAgICAgICBpZiAoICRUb2tlbiAhfiBte1xBICg/OiBbYS16QS1aXSB8IFxkICkrIFx6fXhtcyApIHsKCiAgICAgICAgICAgICAgICAjIFNlY3VyaXR5OiBwcmV0ZW5kIHRoYXQgcGFzc3dvcmQgcmVzZXQgaW5zdHJ1Y3Rpb25zIHdlcmUgYWN0dWFsbHkgc2VudCB0bwogICAgICAgICAgICAgICAgIyAgIG1ha2Ugc3VyZSB0aGF0IHVzZXJzIGNhbm5vdCBmaW5kIG91dCB2YWxpZCB1c2VybmFtZXMgYnkKICAgICAgICAgICAgICAgICMgICBqdXN0IHRyeWluZyBhbmQgY2hlY2tpbmcgdGhlIHJlc3VsdCBtZXNzYWdlLgogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkxvZ2luKAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgID0+ICdMb2dpbicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgICAgPT4gVHJhbnNsYXRhYmxlKCdTZW50IHBhc3N3b3JkIHJlc2V0IGluc3RydWN0aW9ucy4gUGxlYXNlIGNoZWNrIHlvdXIgZW1haWwuJyksCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVR5cGUgPT4gJ1N1Y2Nlc3MnLAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICVVc2VyTGlzdCA9ICRVc2VyT2JqZWN0LT5TZWFyY2hQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIEtleSAgID0+ICdVc2VyVG9rZW4nLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFRva2VuLAogICAgICAgICAgICApOwogICAgICAgICAgICBVU0VSX0lEOgogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCVVc2VyRGF0YSkgewogICAgICAgICAgICAgICAgICAgICRVc2VyID0gJFVzZXJEYXRhe1VzZXJMb2dpbn07CgogICAgICAgICAgICAgICAgICAgIGxhc3QgVVNFUl9JRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJFVzZXIsCiAgICAgICAgKTsKCiAgICAgICAgIyB2ZXJpZnkgY3VzdG9tZXIgdXNlciBpcyB2YWxpZCB3aGVuIHJlcXVlc3RpbmcgcGFzc3dvcmQgcmVzZXQKICAgICAgICBteSBAVmFsaWRJRHMgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKICAgICAgICBteSAkVXNlcklzVmFsaWQgPSBncmVwIHsgJFVzZXJEYXRhe1ZhbGlkSUR9ICYmICRVc2VyRGF0YXtWYWxpZElEfSA9PSAkXyB9IEBWYWxpZElEczsKICAgICAgICBpZiAoICEkVXNlckRhdGF7VXNlcklEfSB8fCAhJFVzZXJJc1ZhbGlkICkgewoKICAgICAgICAgICAgIyBTZWN1cml0eTogcHJldGVuZCB0aGF0IHBhc3N3b3JkIHJlc2V0IGluc3RydWN0aW9ucyB3ZXJlIGFjdHVhbGx5IHNlbnQgdG8KICAgICAgICAgICAgIyAgIG1ha2Ugc3VyZSB0aGF0IHVzZXJzIGNhbm5vdCBmaW5kIG91dCB2YWxpZCB1c2VybmFtZXMgYnkKICAgICAgICAgICAgIyAgIGp1c3QgdHJ5aW5nIGFuZCBjaGVja2luZyB0aGUgcmVzdWx0IG1lc3NhZ2UuCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgID0+IFRyYW5zbGF0YWJsZSgnU2VudCBwYXNzd29yZCByZXNldCBpbnN0cnVjdGlvbnMuIFBsZWFzZSBjaGVjayB5b3VyIGVtYWlsLicpLAogICAgICAgICAgICAgICAgTWVzc2FnZVR5cGUgPT4gJ1N1Y2Nlc3MnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgZW1haWwgb2JqZWN0CiAgICAgICAgbXkgJEVtYWlsT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsJyk7CgogICAgICAgICMgc2VuZCBwYXNzd29yZCByZXNldCB0b2tlbgogICAgICAgIGlmICggISRUb2tlbiApIHsKCiAgICAgICAgICAgICMgZ2VuZXJhdGUgdG9rZW4KICAgICAgICAgICAgJFVzZXJEYXRhe1Rva2VufSA9ICRVc2VyT2JqZWN0LT5Ub2tlbkdlbmVyYXRlKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VyRGF0YXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZW5kIHRva2VuIG5vdGlmeSBlbWFpbCB3aXRoIGxpbmsKICAgICAgICAgICAgbXkgJEJvZHkgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxCb2R5TG9zdFBhc3N3b3JkVG9rZW4nKQogICAgICAgICAgICAgICAgfHwgJ0VSUk9SOiBDdXN0b21lclBhbmVsQm9keUxvc3RQYXNzd29yZFRva2VuIGlzIG1pc3NpbmchJzsKICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxTdWJqZWN0TG9zdFBhc3N3b3JkVG9rZW4nKQogICAgICAgICAgICAgICAgfHwgJ0VSUk9SOiBDdXN0b21lclBhbmVsU3ViamVjdExvc3RQYXNzd29yZFRva2VuIGlzIG1pc3NpbmchJzsKICAgICAgICAgICAgZm9yICggc29ydCBrZXlzICVVc2VyRGF0YSApIHsKICAgICAgICAgICAgICAgICRCb2R5ID1+IHMvPE9UT0JPXyRfPi8kVXNlckRhdGF7JF99L2dpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRTZW50ID0gJEVtYWlsT2JqZWN0LT5TZW5kKAogICAgICAgICAgICAgICAgVG8gICAgICAgPT4gJFVzZXJEYXRhe1VzZXJFbWFpbH0sCiAgICAgICAgICAgICAgICBTdWJqZWN0ICA9PiAkU3ViamVjdCwKICAgICAgICAgICAgICAgIENoYXJzZXQgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICAgICBNaW1lVHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICBCb2R5ICAgICA9PiAkQm9keQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkU2VudC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOyAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgID0+ICdMb2dpbicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgICA9PiBUcmFuc2xhdGFibGUoJ1NlbnQgcGFzc3dvcmQgcmVzZXQgaW5zdHJ1Y3Rpb25zLiBQbGVhc2UgY2hlY2sgeW91ciBlbWFpbC4nKSwKICAgICAgICAgICAgICAgIE1lc3NhZ2VUeXBlID0+ICdTdWNjZXNzJywKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcmVzZXQgcGFzc3dvcmQKICAgICAgICAjIGNoZWNrIGlmIHRva2VuIGlzIHZhbGlkCiAgICAgICAgbXkgJFRva2VuVmFsaWQgPSAkVXNlck9iamVjdC0+VG9rZW5DaGVjaygKICAgICAgICAgICAgVG9rZW4gID0+ICRUb2tlbiwKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VyRGF0YXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRUb2tlblZhbGlkICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdJbnZhbGlkIFRva2VuIScpLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbmV3IHBhc3N3b3JkCiAgICAgICAgJFVzZXJEYXRhe05ld1BXfSA9ICRVc2VyT2JqZWN0LT5HZW5lcmF0ZVJhbmRvbVBhc3N3b3JkKCk7CgogICAgICAgICMgdXBkYXRlIG5ldyBwYXNzd29yZAogICAgICAgIG15ICRTdWNjZXNzID0gJFVzZXJPYmplY3QtPlNldFBhc3N3b3JkKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFVzZXIsCiAgICAgICAgICAgIFBXICAgICAgICA9PiAkVXNlckRhdGF7TmV3UFd9CiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnTG9naW4nLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1Jlc2V0IHBhc3N3b3JkIHVuc3VjY2Vzc2Z1bC4gUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICBVc2VyICAgID0+ICRVc2VyLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZW5kIG5vdGlmeSBlbWFpbAogICAgICAgIG15ICRCb2R5ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsQm9keUxvc3RQYXNzd29yZCcpCiAgICAgICAgICAgIHx8ICdOZXcgUGFzc3dvcmQgaXM6IDxPVE9CT19ORVdQVz4nOwogICAgICAgIG15ICRTdWJqZWN0ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsU3ViamVjdExvc3RQYXNzd29yZCcpCiAgICAgICAgICAgIHx8ICdOZXcgUGFzc3dvcmQhJzsKICAgICAgICBmb3IgKCBzb3J0IGtleXMgJVVzZXJEYXRhICkgewogICAgICAgICAgICAkQm9keSA9fiBzLzxPVE9CT18kXz4vJFVzZXJEYXRheyRffS9naTsKICAgICAgICB9CiAgICAgICAgbXkgJFNlbnQgPSAkRW1haWxPYmplY3QtPlNlbmQoCiAgICAgICAgICAgIFRvICAgICAgID0+ICRVc2VyRGF0YXtVc2VyRW1haWx9LAogICAgICAgICAgICBTdWJqZWN0ICA9PiAkU3ViamVjdCwKICAgICAgICAgICAgQ2hhcnNldCAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgTWltZVR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICBCb2R5ICAgICA9PiAkQm9keQogICAgICAgICk7CgogICAgICAgIGlmICggISRTZW50LT57U3VjY2Vzc30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICB9CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICdTZW50IG5ldyBwYXNzd29yZCB0byAlcy4gUGxlYXNlIGNoZWNrIHlvdXIgZW1haWwuJywKICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJFbWFpbH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTG9naW4oCiAgICAgICAgICAgIFRpdGxlICAgICAgID0+ICdMb2dpbicsCiAgICAgICAgICAgIE1lc3NhZ2UgICAgID0+ICRNZXNzYWdlLAogICAgICAgICAgICBVc2VyICAgICAgICA9PiAkVXNlciwKICAgICAgICAgICAgTWVzc2FnZVR5cGUgPT4gJ1N1Y2Nlc3MnLAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IGN1c3RvbWVyIGFjY291bnQKICAgIGVsc2lmICggJFBhcmFte0FjdGlvbn0gZXEgJ0N1c3RvbWVyQ3JlYXRlQWNjb3VudCcgKSB7CgogICAgICAgICMgbmV3IGxheW91dCBvYmplY3QKICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICAgICAjIGNoZWNrIGZlYXR1cmUKICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxDcmVhdGVBY2NvdW50JykgKSB7CgogICAgICAgICAgICAjIHNob3cgbm9ybWFsIGxvZ2luCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnTG9naW4nLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0ZlYXR1cmUgbm90IGFjdGl2ZSEnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICVHZXRQYXJhbXM7CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJVc2VyJyktPntNYXB9IH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXN7ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkRW50cnktPlsxXSApCiAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICB9CiAgICAgICAgJEdldFBhcmFtc3tWYWxpZElEfSA9IDE7CgogICAgICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgICAgIGlmICggISRHZXRQYXJhbXN7VXNlckN1c3RvbWVySUR9ICkgewogICAgICAgICAgICAkR2V0UGFyYW1ze1VzZXJDdXN0b21lcklEfSA9ICRHZXRQYXJhbXN7VXNlckVtYWlsfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJEdldFBhcmFtc3tVc2VyTG9naW59ICkgewogICAgICAgICAgICAkR2V0UGFyYW1ze1VzZXJMb2dpbn0gPSAkR2V0UGFyYW1ze1VzZXJFbWFpbH07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBuZXcgcGFzc3dvcmQKICAgICAgICAkR2V0UGFyYW1ze1VzZXJQYXNzd29yZH0gPSAkVXNlck9iamVjdC0+R2VuZXJhdGVSYW5kb21QYXNzd29yZCgpOwoKICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICBteSAlVXNlckRhdGEgPSAkVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkR2V0UGFyYW1ze1VzZXJMb2dpbn0gKTsKICAgICAgICBpZiAoICRVc2VyRGF0YXtVc2VySUR9IHx8ICEkR2V0UGFyYW1ze1VzZXJMb2dpbn0gKSB7CgogICAgICAgICAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgICAgICBLZXkgICA9PiAnU2lnbnVwRXJyb3InLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnTG9naW4nLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1RoaXMgZS1tYWlsIGFkZHJlc3MgYWxyZWFkeSBleGlzdHMuIFBsZWFzZSBsb2cgaW4gb3IgcmVzZXQgeW91ciBwYXNzd29yZC4nKSwKICAgICAgICAgICAgICAgIFVzZXJUaXRsZSAgICAgPT4gJEdldFBhcmFtc3tVc2VyVGl0bGV9LAogICAgICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAkR2V0UGFyYW1ze1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgVXNlckxhc3RuYW1lICA9PiAkR2V0UGFyYW1ze1VzZXJMYXN0bmFtZX0sCiAgICAgICAgICAgICAgICBVc2VyRW1haWwgICAgID0+ICRHZXRQYXJhbXN7VXNlckVtYWlsfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZm9yIG1haWwgYWRkcmVzcyByZXN0cmljdGlvbnMKICAgICAgICBteSBAV2hpdGVsaXN0ID0gQHsKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsQ3JlYXRlQWNjb3VudDo6TWFpbFJlc3RyaWN0aW9uczo6V2hpdGVsaXN0JykgLy8gW10KICAgICAgICB9OwogICAgICAgIG15IEBCbGFja2xpc3QgPSBAewogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxDcmVhdGVBY2NvdW50OjpNYWlsUmVzdHJpY3Rpb25zOjpCbGFja2xpc3QnKSAvLyBbXQogICAgICAgIH07CgogICAgICAgIG15ICRXaGl0ZWxpc3RNYXRjaGVkOwogICAgICAgIGZvciBteSAkV2hpdGVsaXN0RW50cnkgKEBXaGl0ZWxpc3QpIHsKICAgICAgICAgICAgbXkgJFJlZ2V4ID0gZXZhbCB7cXIvJFdoaXRlbGlzdEVudHJ5L2l9OwogICAgICAgICAgICBpZiAoJEApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBjdXN0b21lciBwYW5lbCBtYWlsIGFkZHJlc3Mgd2hpdGVsaXN0IGNvbnRhaW5zIHRoZSBpbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiAkV2hpdGVsaXN0RW50cnksIHBsZWFzZSBjaGVjayBhbmQgY29ycmVjdCBpdC4nCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFtc3tVc2VyRW1haWx9ID1+ICRSZWdleCApIHsKICAgICAgICAgICAgICAgICRXaGl0ZWxpc3RNYXRjaGVkKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbXkgJEJsYWNrbGlzdE1hdGNoZWQ7CiAgICAgICAgZm9yIG15ICRCbGFja2xpc3RFbnRyeSAoQEJsYWNrbGlzdCkgewogICAgICAgICAgICBteSAkUmVnZXggPSBldmFsIHtxci8kQmxhY2tsaXN0RW50cnkvaX07CiAgICAgICAgICAgIGlmICgkQCkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIGN1c3RvbWVyIHBhbmVsIG1haWwgYWRkcmVzcyBibGFja2xpc3QgY29udGFpbnMgdGhlIGludmFsaWQgcmVndWxhciBleHByZXNzaW9uICRCbGFja2xpc3RFbnRyeSwgcGxlYXNlIGNoZWNrIGFuZCBjb3JyZWN0IGl0LicKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW1ze1VzZXJFbWFpbH0gPX4gJFJlZ2V4ICkgewogICAgICAgICAgICAgICAgJEJsYWNrbGlzdE1hdGNoZWQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAoIEBXaGl0ZWxpc3QgJiYgISRXaGl0ZWxpc3RNYXRjaGVkICkgfHwgKCBAQmxhY2tsaXN0ICYmICRCbGFja2xpc3RNYXRjaGVkICkgKSB7CgogICAgICAgICAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgICAgICBLZXkgICA9PiAnU2lnbnVwRXJyb3InLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnTG9naW4nLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1RoaXMgZW1haWwgYWRkcmVzcyBpcyBub3QgYWxsb3dlZCB0byByZWdpc3Rlci4gUGxlYXNlIGNvbnRhY3Qgc3VwcG9ydCBzdGFmZi4nKSwKICAgICAgICAgICAgICAgIFVzZXJUaXRsZSAgICAgPT4gJEdldFBhcmFtc3tVc2VyVGl0bGV9LAogICAgICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAkR2V0UGFyYW1ze1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgVXNlckxhc3RuYW1lICA9PiAkR2V0UGFyYW1ze1VzZXJMYXN0bmFtZX0sCiAgICAgICAgICAgICAgICBVc2VyRW1haWwgICAgID0+ICRHZXRQYXJhbXN7VXNlckVtYWlsfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGFjY291bnQKICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKCiAgICAgICAgbXkgJE5vdyA9ICREYXRlVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKCiAgICAgICAgbXkgJEFkZCA9ICRVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJBZGQoCiAgICAgICAgICAgICVHZXRQYXJhbXMsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQWRkZWQgdmlhIEN1c3RvbWVyIFBhbmVsICglcyknLCAkTm93ICksCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICApOwogICAgICAgIGlmICggISRBZGQgKSB7CgogICAgICAgICAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgICAgICBLZXkgICA9PiAnU2lnbnVwRXJyb3InLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnTG9naW4nLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0N1c3RvbWVyIHVzZXIgY2FuXCd0IGJlIGFkZGVkIScpLAogICAgICAgICAgICAgICAgVXNlclRpdGxlICAgICA9PiAkR2V0UGFyYW1ze1VzZXJUaXRsZX0sCiAgICAgICAgICAgICAgICBVc2VyRmlyc3RuYW1lID0+ICRHZXRQYXJhbXN7VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICRHZXRQYXJhbXN7VXNlckxhc3RuYW1lfSwKICAgICAgICAgICAgICAgIFVzZXJFbWFpbCAgICAgPT4gJEdldFBhcmFtc3tVc2VyRW1haWx9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZW5kIG5vdGlmeSBlbWFpbAogICAgICAgIG15ICRFbWFpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbCcpOwogICAgICAgIG15ICRCb2R5ICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbEJvZHlOZXdBY2NvdW50JykKICAgICAgICAgICAgfHwgJ05vIENvbmZpZyBPcHRpb24gZm91bmQhJzsKICAgICAgICBteSAkU3ViamVjdCA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFN1YmplY3ROZXdBY2NvdW50JykKICAgICAgICAgICAgfHwgJ05ldyBPVE9CTyBBY2NvdW50ISc7CiAgICAgICAgZm9yICggc29ydCBrZXlzICVHZXRQYXJhbXMgKSB7CiAgICAgICAgICAgICRCb2R5ID1+IHMvPE9UT0JPXyRfPi8kR2V0UGFyYW1zeyRffS9naTsKICAgICAgICB9CgogICAgICAgICMgc2VuZCBhY2NvdW50IGluZm8KICAgICAgICBteSAkU2VudCA9ICRFbWFpbE9iamVjdC0+U2VuZCgKICAgICAgICAgICAgVG8gICAgICAgPT4gJEdldFBhcmFtc3tVc2VyRW1haWx9LAogICAgICAgICAgICBTdWJqZWN0ICA9PiAkU3ViamVjdCwKICAgICAgICAgICAgQ2hhcnNldCAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgTWltZVR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICBCb2R5ICAgICA9PiAkQm9keQogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbnQtPntTdWNjZXNzfSApIHsKICAgICAgICAgICAgcmV0dXJuIGpvaW4gJycsCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgICAgICAgICBBcmVhICA9PiAnQ29yZScsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJ0Vycm9yJwogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyV2FybmluZygKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnQ2FuXCd0IHNlbmQgYWNjb3VudCBpbmZvIScpCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBzZW50IGFjY291bnQgaW5mbwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsTG9naW5VUkwnKSApIHsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gYWx0ZXJuYXRlIGxvZ2luCiAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSggJFBhcmFte1JlcXVlc3RlZFVSTH0gKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgRXh0VVJMID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykKICAgICAgICAgICAgICAgICAgICAuICI/UmVxdWVzdGVkVVJMPSRQYXJhbXtSZXF1ZXN0ZWRVUkx9O1VzZXI9JEdldFBhcmFtc3tVc2VyTG9naW59OyIKICAgICAgICAgICAgICAgICAgICAuICJFbWFpbD0kR2V0UGFyYW1ze1VzZXJFbWFpbH07UmVhc29uPU5ld0FjY291bnRDcmVhdGVkIiwKICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICB9CgogICAgICAgIG15ICRBY2NvdW50Q3JlYXRlZE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICdOZXcgYWNjb3VudCBjcmVhdGVkLiBTZW50IGxvZ2luIGluZm9ybWF0aW9uIHRvICVzLiBQbGVhc2UgY2hlY2sgeW91ciBlbWFpbC4nLAogICAgICAgICAgICAkR2V0UGFyYW1ze1VzZXJFbWFpbH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBsb2dpbiBzY3JlZW4KICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgTWVzc2FnZSAgICAgPT4gJEFjY291bnRDcmVhdGVkTWVzc2FnZSwKICAgICAgICAgICAgVXNlciAgICAgICAgPT4gJEdldFBhcmFtc3tVc2VyTG9naW59LAogICAgICAgICAgICBNZXNzYWdlVHlwZSA9PiAnU3VjY2VzcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgbG9naW4gc2l0ZQogICAgZWxzaWYgKCAhJFBhcmFte1Nlc3Npb25JRH0gKSB7CgogICAgICAgICMgY3JlYXRlIEF1dGhPYmplY3QKICAgICAgICBteSAkQXV0aE9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aCcpOwogICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICAgICAgaWYgKCAkQXV0aE9iamVjdC0+R2V0T3B0aW9uKCBXaGF0ID0+ICdQcmVBdXRoJyApICkgewoKICAgICAgICAgICAgIyBhdXRvbWF0aWMgbG9naW4KICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RlZFVSTH0gPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCAkUGFyYW17UmVxdWVzdGVkVVJMfSApOwoKICAgICAgICAgICAgbXkgJFByZUF1dGggPSAkQXV0aE9iamVjdC0+UHJlQXV0aCgKICAgICAgICAgICAgICAgIFJlcXVlc3RlZFVSTCA9PiAkUGFyYW17UmVxdWVzdGVkVVJMfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFByZUF1dGggJiYgJFByZUF1dGgtPntSZWRpcmVjdFVSTH0gKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWUnKSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBhbHdheXMgc2V0IGEgY29va2llLCBzbyB0aGF0CiAgICAgICAgICAgICAgICAgICAgIyB3ZSBrbm93IGFscmVhZHkgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgY29va2llcy4KICAgICAgICAgICAgICAgICAgICAjICggdGhlIHNlc3Npb24gY29va2llIGlzbid0IGF2YWlsYWJsZSBhdCB0aGF0IHRpbWUgKS4KCiAgICAgICAgICAgICAgICAgICAgbXkgJEV4cGlyZXMgPSAnKycgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25NYXhUaW1lJykgLiAncyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uVXNlQ29va2llQWZ0ZXJCcm93c2VyQ2xvc2UnKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEV4cGlyZXMgPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgc2V0IGEgY29va2llIHRlbnRhdGl2ZWx5IGZvciBjaGVja2luZyBjb29raWUgc3VwcG9ydAogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlNldENvb2tpZSgKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICA9PiAnT1RPQk9Ccm93c2VySGFzQ29va2llJywKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICA9PiAnT1RPQk9Ccm93c2VySGFzQ29va2llJywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBFeHBpcmVzID0+ICRFeHBpcmVzLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgRXh0VVJMID0+ICRQcmVBdXRoLT57UmVkaXJlY3RVUkx9LAogICAgICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPVByZUxvZ2luJlJlcXVlc3RlZFVSTD0kUGFyYW17UmVxdWVzdGVkVVJMfSIsCiAgICAgICAgICAgICk7ICAgICAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykgKSB7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGFsdGVybmF0ZSBsb2dpbgogICAgICAgICAgICAkUGFyYW17UmVxdWVzdGVkVVJMfSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIEV4dFVSTCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxMb2dpblVSTCcpCiAgICAgICAgICAgICAgICAgICAgLiAiP1JlcXVlc3RlZFVSTD0kUGFyYW17UmVxdWVzdGVkVVJMfSIsCiAgICAgICAgICAgICk7ICAgICAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIE9uZVRpbWVBdXRoZW50aWNhdGlvbkxpbmsKICAgICAgICBteSAlRXh0ZW5kZWRBdXRoUGFyYW1zOwogICAgICAgIGZvciBteSAkTmFtZSAoICRBdXRoT2JqZWN0LT5FeHRlbmRlZFBhcmFtTmFtZXMoKSApIHsKICAgICAgICAgICAgbXkgJEV4dFBhcmFtID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICROYW1lLAogICAgICAgICAgICAgICAgUmF3ICAgPT4gMQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEV4dFBhcmFtICkgewogICAgICAgICAgICAgICAgJEV4dGVuZGVkQXV0aFBhcmFtc3skTmFtZX0gPSAkRXh0UGFyYW07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVkaXJlY3QgZGlyZWN0bHkgdG8gTG9naW4gaWYgbmVjZXNzYXJ5IHBhcmFtZXRlcnMgYXJlIHByZXNlbnQKICAgICAgICBpZiAoICVFeHRlbmRlZEF1dGhQYXJhbXMgKSB7CiAgICAgICAgICAgIG15ICRMb2dpblN0cmluZyA9ICdBY3Rpb249TG9naW4nOwogICAgICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJUV4dGVuZGVkQXV0aFBhcmFtcyApIHsKICAgICAgICAgICAgICAgICRMb2dpblN0cmluZyAuPSAiOyRLZXk9JEV4dGVuZGVkQXV0aFBhcmFtc3skS2V5fSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSggJFBhcmFte1JlcXVlc3RlZFVSTH0gKTsKICAgICAgICAgICAgcHJpbnQgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiJExvZ2luU3RyaW5nO1JlcXVlc3RlZFVSTD0kUGFyYW17UmVxdWVzdGVkVVJMfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQojIEVPIE9uZVRpbWVBdXRoZW50aWNhdGlvbkxpbmsKCiAgICAgICAgIyBsb2dpbiBzY3JlZW4KICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgVGl0bGUgPT4gJ0xvZ2luJywKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBydW4gbW9kdWxlcyBpZiBhIHZlcnNpb24gdmFsdWUgZXhpc3RzCiAgICBlbHNpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoIktlcm5lbDo6TW9kdWxlczo6JFBhcmFte0FjdGlvbn0iKSApIHsKCiAgICAgICAgIyBjaGVjayBzZXNzaW9uIGlkCiAgICAgICAgaWYgKCAhJFNlc3Npb25PYmplY3QtPkNoZWNrU2Vzc2lvbklEKCBTZXNzaW9uSUQgPT4gJFBhcmFte1Nlc3Npb25JRH0gKSApIHsKCiAgICAgICAgICAgICMgY3JlYXRlIG5ldyBMYXlvdXRPYmplY3Qgd2l0aCBuZXcgJyVQYXJhbScKICAgICAgICAgICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnID0+IHsKICAgICAgICAgICAgICAgICAgICBTZXRDb29raWVzID0+IHt9LAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRlbGV0ZSB0aGUgT1RPQk8gc2Vzc2lvbiBjb29raWUKICAgICAgICAgICAgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dC0+U2V0Q29va2llKAogICAgICAgICAgICAgICAgUmVnaXN0ZXJJbk9NID0+IDEsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgPT4gJ1Nlc3Npb25JRENvb2tpZScsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFBhcmFte1Nlc3Npb25OYW1lfSwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIEV4cGlyZXMgICAgICA9PiAnLTF5JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaWYgdGhlIHdyb25nIHNjaGVtZSBpcyB1c2VkLCBkZWxldGUgYWxzbyB0aGUgIm90aGVyIiBjb29raWUgLSBpc3N1ZSAjMjUxCiAgICAgICAgICAgIG15ICgkUmVxdWVzdFNjaGVtZSkgPSBzcGxpdCAvXC8vLCAkUGFyYW1PYmplY3QtPlNlcnZlclByb3RvY29sLCAyOwogICAgICAgICAgICBpZiAoICRSZXF1ZXN0U2NoZW1lIG5lICRDb25maWdPYmplY3QtPkdldCgnSHR0cFR5cGUnKSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTZXRDb29raWVzID0+IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBkZWxldGUgdGhlIE9UT0JPIHNlc3Npb24gY29va2llCiAgICAgICAgICAgICAgICAjIFRPRE86IHRoZSBOYW1lIGlzIHVzZWQgdHdpY2UKICAgICAgICAgICAgICAgIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQtPlNldENvb2tpZSgKICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckluT00gPT4gMSwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgPT4gJ1Nlc3Npb25JRENvb2tpZWh0dHAnLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkUGFyYW17U2Vzc2lvbk5hbWV9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBFeHBpcmVzICAgICAgPT4gJy0xeScsCiAgICAgICAgICAgICAgICAgICAgU2VjdXJlICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQtPlNldENvb2tpZSgKICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckluT00gPT4gMSwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgPT4gJ1Nlc3Npb25JRENvb2tpZWh0dHBzJywKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFBhcmFte1Nlc3Npb25OYW1lfSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgRXhwaXJlcyAgICAgID0+ICctMXknLAogICAgICAgICAgICAgICAgICAgIFNlY3VyZSAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKCBPYmplY3RzID0+IFsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCddICk7CiAgICAgICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgICAgICAjIGNyZWF0ZSBBdXRoT2JqZWN0CiAgICAgICAgICAgIG15ICRBdXRoT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aCcpOwogICAgICAgICAgICBpZiAoICRBdXRoT2JqZWN0LT5HZXRPcHRpb24oIFdoYXQgPT4gJ1ByZUF1dGgnICkgKSB7CgogICAgICAgICAgICAgICAgIyBhdXRvbWF0aWMgcmUtbG9naW4KICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSggJFBhcmFte1JlcXVlc3RlZFVSTH0gKTsKCiAgICAgICAgICAgICAgICBteSAkUHJlQXV0aCA9ICRBdXRoT2JqZWN0LT5QcmVBdXRoKAogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RlZFVSTCA9PiAkUGFyYW17UmVxdWVzdGVkVVJMfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkUHJlQXV0aCAmJiAkUHJlQXV0aC0+e1JlZGlyZWN0VVJMfSApIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWUnKSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWx3YXlzIHNldCBhIGNvb2tpZSwgc28gdGhhdAogICAgICAgICAgICAgICAgICAgICAgICAjIHdlIGtub3cgYWxyZWFkeSBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBjb29raWVzLgogICAgICAgICAgICAgICAgICAgICAgICAjICggdGhlIHNlc3Npb24gY29va2llIGlzbid0IGF2YWlsYWJsZSBhdCB0aGF0IHRpbWUgKS4KCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFeHBpcmVzID0gJysnIC4gJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uTWF4VGltZScpIC4gJ3MnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWVBZnRlckJyb3dzZXJDbG9zZScpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEV4cGlyZXMgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBzZXQgYSBjb29raWUgdGVudGF0aXZlbHkgZm9yIGNoZWNraW5nIGNvb2tpZSBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlNldENvb2tpZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgPT4gJ09UT0JPQnJvd3Nlckhhc0Nvb2tpZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgID0+ICdPVE9CT0Jyb3dzZXJIYXNDb29raWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwaXJlcyA9PiAkRXhwaXJlcywKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgICAgICBFeHRVUkwgPT4gJFByZUF1dGgtPntSZWRpcmVjdFVSTH0sCiAgICAgICAgICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBPUCA9PiAiP0FjdGlvbj1QcmVMb2dpbiZSZXF1ZXN0ZWRVUkw9JFBhcmFte1JlcXVlc3RlZFVSTH0iLAogICAgICAgICAgICAgICAgKTsgICAgICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxMb2dpblVSTCcpICkgewoKICAgICAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gYWx0ZXJuYXRlIGxvZ2luCiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWVzdGVkVVJMfSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgRXh0VVJMID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykKICAgICAgICAgICAgICAgICAgICAgICAgLiAiP1JlYXNvbj1JbnZhbGlkU2Vzc2lvbklEJlJlcXVlc3RlZFVSTD0kUGFyYW17UmVxdWVzdGVkVVJMfSIsCiAgICAgICAgICAgICAgICApOyAgICAgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGxvZ2luCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnTG9naW4nLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJFNlc3Npb25PYmplY3QtPlNlc3Npb25JREVycm9yTWVzc2FnZSgpICksCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzZXNzaW9uIGRhdGEKICAgICAgICBteSAlVXNlckRhdGEgPSAkU2Vzc2lvbk9iamVjdC0+R2V0U2Vzc2lvbklERGF0YSgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRQYXJhbXtTZXNzaW9uSUR9LAogICAgICAgICk7CgogICAgICAgICRVc2VyRGF0YXtVc2VyVGltZVpvbmV9ID0gJFNlbGYtPl9Vc2VyVGltZVpvbmVHZXQoJVVzZXJEYXRhKTsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQgZGF0YQogICAgICAgIGlmICggISRVc2VyRGF0YXtVc2VySUR9IHx8ICEkVXNlckRhdGF7VXNlckxvZ2lufSB8fCAkVXNlckRhdGF7VXNlclR5cGV9IG5lICdDdXN0b21lcicgKSB7CgogICAgICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICAgICAgICAgIyByZWRpcmVjdCB0byBhbHRlcm5hdGUgbG9naW4KICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxMb2dpblVSTCcpICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgRXh0VVJMID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykgLiAnP1JlYXNvbj1TeXN0ZW1FcnJvcicsCiAgICAgICAgICAgICAgICApOyAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgbG9naW4gc2NyZWVuCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0Vycm9yOiBpbnZhbGlkIHNlc3Npb24uJyksCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG1vZHVsZSByZWdpc3RyeQogICAgICAgIG15ICRNb2R1bGVSZWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRQYXJhbXtBY3Rpb259IH07CiAgICAgICAgaWYgKCAhJE1vZHVsZVJlZyApIHsKCiAgICAgICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICJNb2R1bGUgS2VybmVsOjpNb2R1bGVzOjokUGFyYW17QWN0aW9ufSBub3QgcmVnaXN0ZXJlZCBpbiBLZXJuZWwvQ29uZmlnLnBtISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7ICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgfQoKICAgICAgICAjIG1vZHVsZSBwZXJtaXNzaW9uIGNoZWNrIGZvciBhY3Rpb24KICAgICAgICBpZiAoCiAgICAgICAgICAgIHJlZiAkTW9kdWxlUmVnLT57R3JvdXBSb30gZXEgJ0FSUkFZJwogICAgICAgICAgICAmJiAhc2NhbGFyIEB7ICRNb2R1bGVSZWctPntHcm91cFJvfSB9CiAgICAgICAgICAgICYmIHJlZiAkTW9kdWxlUmVnLT57R3JvdXB9IGVxICdBUlJBWScKICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkTW9kdWxlUmVnLT57R3JvdXB9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFte0FjY2Vzc1JvfSA9IDE7CiAgICAgICAgICAgICRQYXJhbXtBY2Nlc3NSd30gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICggJFBhcmFte0FjY2Vzc1JvfSwgJFBhcmFte0FjY2Vzc1J3fSApID0gJFNlbGYtPl9DaGVja01vZHVsZVBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBNb2R1bGVSZWcgPT4gJE1vZHVsZVJlZywKICAgICAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRQYXJhbXtBY2Nlc3NSb30gKSB7CgogICAgICAgICAgICAgICAgIyBuZXcgbGF5b3V0IG9iamVjdAogICAgICAgICAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05vIFBlcm1pc3Npb24gdG8gdXNlIHRoaXMgZnJvbnRlbmQgYWN0aW9uIG1vZHVsZSEnCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOyAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgbXkgJE5hdmlnYXRpb25Db25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok5hdmlnYXRpb24nKS0+eyAkUGFyYW17QWN0aW9ufSB9OwoKICAgICAgICAjIG1vZHVsZSBwZXJtaXNzaW9uIGNoZWNrIGZvciBzdWJtZW51IGl0ZW0KICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCROYXZpZ2F0aW9uQ29uZmlnKSApIHsKCiAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskTmF2aWdhdGlvbkNvbmZpZ30gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5ICAgICAgICAgICAgICAgICAhfiBtL15cZCsvaTsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ICF+IG0vU3ViYWN0aW9uL2k7CgogICAgICAgICAgICAgICAgbXkgQE1vZHVsZU5hdmlnYXRpb25Db25maWdzOwoKICAgICAgICAgICAgICAgICMgRklYTUU6IFN1cHBvcnQgYm90aCBvbGQgKEhBU0gpIGFuZCBuZXcgKEFSUkFZIG9mIEhBU0gpIG5hdmlnYXRpb24gY29uZmlndXJhdGlvbnMsIGZvciByZWFzb25zIG9mCiAgICAgICAgICAgICAgICAjICAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIE9uY2Ugd2UgYXJlIHN1cmUgZXZlcnl0aGluZyBoYXMgYmVlbiBtaWdyYXRlZCBjb3JyZWN0bHksIHN1cHBvcnQgZm9yCiAgICAgICAgICAgICAgICAjICAgSEFTSC1vbmx5IGNvbmZpZ3VyYXRpb24gY2FuIGJlIGRyb3BwZWQgaW4gZnV0dXJlIG1ham9yIHJlbGVhc2UuCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkTmF2aWdhdGlvbkNvbmZpZy0+eyRLZXl9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATW9kdWxlTmF2aWdhdGlvbkNvbmZpZ3MsICROYXZpZ2F0aW9uQ29uZmlnLT57JEtleX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJE5hdmlnYXRpb25Db25maWctPnskS2V5fSApICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQE1vZHVsZU5hdmlnYXRpb25Db25maWdzLCBAeyAkTmF2aWdhdGlvbkNvbmZpZy0+eyRLZXl9IH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBTa2lwIGluY29tcGF0aWJsZSBjb25maWd1cmF0aW9uLgogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBLRVk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgSVRFTToKICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbSAoQE1vZHVsZU5hdmlnYXRpb25Db25maWdzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0xpbmt9ICF+IG0vU3ViYWN0aW9uPS9pCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRJdGVtLT57TGlua30gIX4gbS8kUGFyYW17U3ViYWN0aW9ufS9pCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgSVRFTTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0FjY2Vzc1JvfSA9IDA7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0FjY2Vzc1J3fSA9IDA7CgogICAgICAgICAgICAgICAgICAgICMgbW9kdWxlIHBlcm1pc3Npb24gY2hlY2sgZm9yIHN1Ym1lbnUgaXRlbQogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgcmVmICRJdGVtLT57R3JvdXBSb30gZXEgJ0FSUkFZJwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc2NhbGFyIEB7ICRJdGVtLT57R3JvdXBSb30gfQogICAgICAgICAgICAgICAgICAgICAgICAmJiByZWYgJEl0ZW0tPntHcm91cH0gZXEgJ0FSUkFZJwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc2NhbGFyIEB7ICRJdGVtLT57R3JvdXB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0FjY2Vzc1JvfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtBY2Nlc3NSd30gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICggJFBhcmFte0FjY2Vzc1JvfSwgJFBhcmFte0FjY2Vzc1J3fSApID0gJFNlbGYtPl9DaGVja01vZHVsZVBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVSZWcgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17QWNjZXNzUm99ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbmV3IGxheW91dCBvYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdObyBQZXJtaXNzaW9uIHRvIHVzZSB0aGlzIGZyb250ZW5kIHN1YmFjdGlvbiBtb2R1bGUhJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOyAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBuZXcgTGF5b3V0T2JqZWN0IHdpdGggbmV3ICclUGFyYW0nIGFuZCAnJVVzZXJEYXRhJwogICAgICAgICRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICAgICAgICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICAgICAgICAgIE1vZHVsZVJlZyA9PiAkTW9kdWxlUmVnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRLZXJuZWw6Ok9NLT5PYmplY3RzRGlzY2FyZCggT2JqZWN0cyA9PiBbJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnXSApOwoKICAgICAgICAjIHVwZGF0ZSBsYXN0IHJlcXVlc3QgdGltZQogICAgICAgIGlmICgKICAgICAgICAgICAgISRQYXJhbU9iamVjdC0+SXNBSkFYUmVxdWVzdCgpCiAgICAgICAgICAgIHx8ICRQYXJhbXtBY3Rpb259IGVxICdDdXN0b21lclZpZGVvQ2hhdCcKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CgogICAgICAgICAgICAkU2Vzc2lvbk9iamVjdC0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRQYXJhbXtTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICdVc2VyTGFzdFJlcXVlc3QnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICREYXRlVGltZU9iamVjdC0+VG9FcG9jaCgpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcmUgYXBwbGljYXRpb24gbW9kdWxlCiAgICAgICAgbXkgJFByZU1vZHVsZSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFByZUFwcGxpY2F0aW9uTW9kdWxlJyk7CiAgICAgICAgaWYgKCAkUGFyYW17QWN0aW9ufSBuZSAnQ3VzdG9tZXJHZW5lcmljQ29udGVudCcgJiYgJFByZU1vZHVsZSApIHsKICAgICAgICAgICAgbXkgJVByZU1vZHVsZUxpc3Q7CiAgICAgICAgICAgIGlmICggcmVmICRQcmVNb2R1bGUgZXEgJ0hBU0gnICkgewogICAgICAgICAgICAgICAgJVByZU1vZHVsZUxpc3QgPSAleyRQcmVNb2R1bGV9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFByZU1vZHVsZUxpc3R7SW5pdH0gPSAkUHJlTW9kdWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBNT0RVTEU6CiAgICAgICAgICAgIGZvciBteSAkUHJlTW9kdWxlS2V5ICggc29ydCBrZXlzICVQcmVNb2R1bGVMaXN0ICkgewogICAgICAgICAgICAgICAgbXkgJFByZU1vZHVsZSA9ICRQcmVNb2R1bGVMaXN0eyRQcmVNb2R1bGVLZXl9OwogICAgICAgICAgICAgICAgbmV4dCBNT0RVTEUgaWYgISRQcmVNb2R1bGU7CiAgICAgICAgICAgICAgICBuZXh0IE1PRFVMRSBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgkUHJlTW9kdWxlKTsKCiAgICAgICAgICAgICAgICAjIGRlYnVnIGluZm8KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDdXN0b21lclBhbmVsUHJlQXBwbGljYXRpb24gbW9kdWxlICRQcmVNb2R1bGUgaXMgdXNlZC4iLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgICAgICAgICAjIHVzZSBtb2R1bGUKICAgICAgICAgICAgICAgIG15ICRQcmVNb2R1bGVPYmplY3QgPSAkUHJlTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICVVc2VyRGF0YSwKCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRQcmVNb2R1bGVPYmplY3QtPlByZVJ1bigpOwoKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0IGlmICRPdXRwdXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZGVidWcgaW5mbwogICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdLZXJuZWw6Ok1vZHVsZXM6OicgLiAkUGFyYW17QWN0aW9ufSAuICctPm5ldycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRnJvbnRlbmRPYmplY3QgPSAoICdLZXJuZWw6Ok1vZHVsZXM6OicgLiAkUGFyYW17QWN0aW9ufSApLT5uZXcoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICBNb2R1bGVSZWcgPT4gJE1vZHVsZVJlZywKICAgICAgICAgICAgRGVidWcgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICk7CgogICAgICAgICMgZGVidWcgaW5mbwogICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdLZXJuZWw6Ok1vZHVsZXM6OicgLiAkUGFyYW17QWN0aW9ufSAuICctPnJ1bicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIC0+UnVuICRBY3Rpb24gd2l0aCAkRnJvbnRlbmRPYmplY3QKICAgICAgICBteSAkT3V0cHV0ID0gJEZyb250ZW5kT2JqZWN0LT5SdW4oKTsKCiAgICAgICAgIyBsb2cgcmVxdWVzdCB0aW1lIGZvciBBZG1pblBlcmZvcm1hbmNlTG9nCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1BlcmZvcm1hbmNlTG9nJykgKSB7CiAgICAgICAgICAgIG15ICRGaWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCdQZXJmb3JtYW5jZUxvZzo6RmlsZScpOwoKICAgICAgICAgICAgIyBXcml0ZSB0byBQZXJmb3JtYW5jZUxvZyBmaWxlIG9ubHkgaWYgaXQgaXMgc21hbGxlciB0aGFuIHNpemUgbGltaXQgKHNlZSBidWcjMTQ3NDcpLgogICAgICAgICAgICBpZiAoIC1zICRGaWxlIDwgKCAxMDI0ICogMTAyNCAqICRDb25maWdPYmplY3QtPkdldCgnUGVyZm9ybWFuY2VMb2c6OkZpbGVNYXgnKSApICkgewogICAgICAgICAgICAgICAgaWYgKCBvcGVuIG15ICRPdXQsICc+PicsICRGaWxlICkgeyAgICAjIyBubyBjcml0aWMgcXcoT1RPQk86OlByb2hpYml0T3BlbikKCiAgICAgICAgICAgICAgICAgICAgIyBhIGZhbGxiYWNrIGZvciB0aGUgcXVlcnkgc3RyaW5nIHdoZW4gdGhlIGFjdGlvbiBpcyBtaXNzaW5nCiAgICAgICAgICAgICAgICAgICAgaWYgKCAoICEkUXVlcnlTdHJpbmcgJiYgJFBhcmFte0FjdGlvbn0gKSB8fCAkUXVlcnlTdHJpbmcgIX4gL0FjdGlvbj0vICkgewogICAgICAgICAgICAgICAgICAgICAgICAkUXVlcnlTdHJpbmcgPSAnQWN0aW9uPScgLiAkUGFyYW17QWN0aW9ufSAuICc7U3ViYWN0aW9uPScgLiAkUGFyYW17U3ViYWN0aW9ufTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICROb3cgPSBUaW1lOjpIaVJlczo6dGltZSgpOwogICAgICAgICAgICAgICAgICAgIHByaW50ICRPdXQgam9pbiAnOjonLAogICAgICAgICAgICAgICAgICAgICAgICAkTm93LAogICAgICAgICAgICAgICAgICAgICAgICAnQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgICAgICAgICAoICROb3cgLSAkU2VsZi0+e1BlcmZvcm1hbmNlTG9nU3RhcnR9ICksCiAgICAgICAgICAgICAgICAgICAgICAgICRVc2VyRGF0YXtVc2VyTG9naW59LCAgICAjIG5vdCB1c2VkIGluIHRoZSBBZG1pblBlcmZvcm1hbmNlTG9nIGZyb250ZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICIkUXVlcnlTdHJpbmdcbiI7CiAgICAgICAgICAgICAgICAgICAgY2xvc2UgJE91dDsKCiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdSZXNwb25zZTo6Q3VzdG9tZXI6ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gKCAkTm93IC0gJFNlbGYtPntQZXJmb3JtYW5jZUxvZ1N0YXJ0fSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJzIHRha2VuIChVUkw6JFF1ZXJ5U3RyaW5nOiRVc2VyRGF0YXtVc2VyTG9naW59KSIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3Qgd3JpdGUgJEZpbGU6ICQhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUGVyZm9ybWFuY2VMb2cgZmlsZSAnJEZpbGUnIGlzIHRvbyBsYXJnZSwgeW91IG5lZWQgdG8gcmVzZXQgaXQgaW4gUGVyZm9ybWFuY2VMb2cgcGFnZSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgIG15ICVEYXRhID0gJFNlc3Npb25PYmplY3QtPkdldFNlc3Npb25JRERhdGEoCiAgICAgICAgU2Vzc2lvbklEID0+ICRQYXJhbXtTZXNzaW9uSUR9LAogICAgKTsKICAgICREYXRhe1VzZXJUaW1lWm9uZX0gPSAkU2VsZi0+X1VzZXJUaW1lWm9uZUdldCglRGF0YSk7CiAgICAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlRGF0YSwKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICApOwp9Cgo9aGVhZDIgUmVzcG9uc2UoKQoKR2VuZXJhdGUgYSBQU0dJIFJlc3BvbnNlIG9iamVjdCBmcm9tIHRoZSBjb250ZW50IGdlbmVyYXRlZCBieSBDPENvbnRlbnQoKT4uCgogICAgbXkgJFJlc3BvbnNlID0gJEludGVyZmFjZS0+UmVzcG9uc2UoKTsKCj1jdXQKCnN1YiBSZXNwb25zZSB7CiAgICBteSAoJFNlbGYpID0gQF87CgogICAgIyBOb3RlIHRoYXQgdGhlIGxheW91dCBvYmplY3QgbXVzdG4ndCBiZSBjcmVhdGVkIGJlZm9yZSBjYWxsaW5nIENvbnRlbnQoKS4KICAgICMgVGhpcyBpcyBiZWNhdXNlIENvbnRlbnQoKSBtaWdodCB3YW50IHRvIHNldCBvYmplY3QgcGFyYW1zIGJlZm9yZSB0aGUgaW5pdGlhbCBjcmVhdGlvbnMuCiAgICAjIEEgbm90YWJsZSBleGFtcGxlIGlzIHRoZSBTZXRDb29raWVzIHBhcmFtZXRlci4KICAgIG15ICRDb250ZW50ID0gJFNlbGYtPkNvbnRlbnQoKTsKCiAgICAjIFRoZSBmaWx0ZXJlZCBjb250ZW50IGlzIGEgc3RyaW5nLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIG9yaWdpbmFsIGNvbnRlbnQgaXMKICAgICMgYSBzdHJpbmcsIGFuIGFycmF5IHJlZmVyZW5jZSwgb3IgYSBmaWxlIGhhbmRsZS4KICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICAkQ29udGVudCA9ICRMYXlvdXRPYmplY3QtPkFwcGx5T3V0cHV0RmlsdGVycyggT3V0cHV0ID0+ICRDb250ZW50ICk7CgogICAgIyBUaGUgSFRUUCBoZWFkZXJzIG9mIHRoZSBPVE9CTyB3ZWIgcmVzcG9uc2Ugb2JqZWN0IGFscmVhZHkgaGF2ZSBiZWVuIHNldCB1cC4KICAgICMgRW5oYW5jZSBpdCB3aXRoIHRoZSBIVFRQIHN0YXR1cyBjb2RlIGFuZCB0aGUgY29udGVudC4KICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXNwb25zZScpLT5GaW5hbGl6ZSggQ29udGVudCA9PiAkQ29udGVudCApOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9aGVhZDIgX1N0b3JlRmFpbGVkTG9naW5zKCkKCj1jdXQKCnN1YiBfU3RvcmVGYWlsZWRMb2dpbnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRDdXJyZW50VGltZU9iamVjdCAgID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICBteSAkQ3VycmVudE5ld1RpbWVTdGFtcCA9ICRDdXJyZW50VGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgIG15ICRDYWNoZU9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICBteSAkQ2hlY2tIYXNoICAgICAgICAgICA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJ0ZhaWxlZExvZ2luc0N1c3RvbWVyJywKICAgICAgICBLZXkgID0+ICRQYXJhbXtQb3N0VXNlcn0sCiAgICApOwoKICAgIGlmICggISRDaGVja0hhc2ggKSB7CiAgICAgICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICdGYWlsZWRMb2dpbnNDdXN0b21lcicsCiAgICAgICAgICAgIEtleSAgID0+ICRQYXJhbXtQb3N0VXNlcn0sCiAgICAgICAgICAgIFZhbHVlID0+IFskQ3VycmVudE5ld1RpbWVTdGFtcF0sCiAgICAgICAgICAgIFRUTCAgID0+ICRQYXJhbXtQcmV2ZW50QnJ1dGVGb3JjZUNvbmZpZ317S2VlcENhY2hlRHVyYXRpb259LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIG15IEBMb2dpblRyeUFycmF5ID0gQHskQ2hlY2tIYXNofTsKCiAgICAjIGRlbGV0ZSBleHBpcmVkIGNhY2hlIGVudHJpZXMKICAgIExPR0lOOgogICAgZm9yIG15ICRMb2dpblRpbWUgKCBAeyRDaGVja0hhc2h9ICkgewogICAgICAgIG15ICRMb2dpblRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkTG9naW5UaW1lLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJE9mZnNldCA9ICRDdXJyZW50VGltZU9iamVjdC0+RGVsdGEoCiAgICAgICAgICAgIERhdGVUaW1lT2JqZWN0ID0+ICRMb2dpblRpbWVPYmplY3QsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkT2Zmc2V0LT57QWJzb2x1dGVTZWNvbmRzfSA+ICRQYXJhbXtQcmV2ZW50QnJ1dGVGb3JjZUNvbmZpZ30tPntLZWVwQ2FjaGVEdXJhdGlvbn0gKSB7CiAgICAgICAgICAgIHNoaWZ0IEBMb2dpblRyeUFycmF5OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbGFzdCBMT0dJTjsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgbmV3IGZhaWxlZCBsb2dpbiB0byBjYWNoZQogICAgcHVzaCBATG9naW5UcnlBcnJheSwgJEN1cnJlbnROZXdUaW1lU3RhbXA7CiAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICBUeXBlICA9PiAnRmFpbGVkTG9naW5zQ3VzdG9tZXInLAogICAgICAgIEtleSAgID0+ICRQYXJhbXtQb3N0VXNlcn0sCiAgICAgICAgVmFsdWUgPT4gXEBMb2dpblRyeUFycmF5LAogICAgICAgIFRUTCAgID0+ICRQYXJhbXtQcmV2ZW50QnJ1dGVGb3JjZUNvbmZpZ317S2VlcENhY2hlRHVyYXRpb259LAogICAgKTsKCiAgICBpZiAoIHNjYWxhciBATG9naW5UcnlBcnJheSA+PSAkUGFyYW17UHJldmVudEJydXRlRm9yY2VDb25maWd9e01heEF0dGVtcHR9ICkgewogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAnQmFubmVkTG9naW5zQ3VzdG9tZXInLAogICAgICAgICAgICBLZXkgICA9PiAkUGFyYW17UG9zdFVzZXJ9LAogICAgICAgICAgICBWYWx1ZSA9PiAkQ3VycmVudE5ld1RpbWVTdGFtcCwKICAgICAgICAgICAgVFRMICAgPT4gJFBhcmFte1ByZXZlbnRCcnV0ZUZvcmNlQ29uZmlnfXtCYW5EdXJhdGlvbn0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKc3ViIF9DaGVja0FuZFJlbW92ZUZyb21CYW5uZWRMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY2FjaGUKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgIG15ICRCYW5UaW1lID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgVHlwZSA9PiAnQmFubmVkTG9naW5zQ3VzdG9tZXInLAogICAgICAgIEtleSAgPT4gJFBhcmFte1Bvc3RVc2VyfSwKICAgICk7CgogICAgaWYgKCAhJEJhblRpbWUgKSB7CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgQmFubmVkID0+IDAsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNhbGN1bGF0ZSBlbGFwc2VkIHRpbWUKICAgIG15ICRDdXJUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICBteSAkQmFuVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nID0+ICRCYW5UaW1lLAogICAgICAgIH0sCiAgICApOwogICAgbXkgJE9mZnNldCA9ICRDdXJUaW1lT2JqZWN0LT5EZWx0YSgKICAgICAgICBEYXRlVGltZU9iamVjdCA9PiAkQmFuVGltZU9iamVjdCwKICAgICk7CgogICAgIyBpZiB0aGUgYmFuIGR1cmF0aW9uIGhhcyBiZWVuIHN1cnBhc3NlZCwgZGVsZXRlIHRoZSBjYWNoZSBlbnRyeQogICAgaWYgKCAkT2Zmc2V0LT57QWJzb2x1dGVTZWNvbmRzfSA+ICRQYXJhbXtQcmV2ZW50QnJ1dGVGb3JjZUNvbmZpZ317QmFuRHVyYXRpb259ICkgewogICAgICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICdCYW5uZWRMb2dpbnNDdXN0b21lcicsCiAgICAgICAgICAgIEtleSAgPT4gJFBhcmFte1Bvc3RVc2VyfSwKICAgICAgICApOwogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIEJhbm5lZCA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICgKICAgICAgICBCYW5uZWQgICAgICAgPT4gMSwKICAgICAgICBSZXNpZHVhbFRpbWUgPT4gJFBhcmFte1ByZXZlbnRCcnV0ZUZvcmNlQ29uZmlnfXtCYW5EdXJhdGlvbn0gLSAkT2Zmc2V0LT57QWJzb2x1dGVTZWNvbmRzfSwKICAgICk7Cn0KCj1oZWFkMiBfQ2hlY2tNb2R1bGVQZXJtaXNzaW9uKCkKCm1vZHVsZSBwZXJtaXNzaW9uIGNoZWNrCgogICAgKCRBY2Nlc3NSbywgJEFjY2Vzc1J3ID0gJEF1dG9SZXNwb25zZU9iamVjdC0+X0NoZWNrTW9kdWxlUGVybWlzc2lvbigKICAgICAgICBNb2R1bGVSZWcgPT4gJE1vZHVsZVJlZywKICAgICAgICAlVXNlckRhdGEsCiAgICApOwoKPWN1dAoKc3ViIF9DaGVja01vZHVsZVBlcm1pc3Npb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQWNjZXNzUm8gPSAwOwogICAgbXkgJEFjY2Vzc1J3ID0gMDsKCiAgICBQRVJNSVNTSU9OOgogICAgZm9yIG15ICRQZXJtaXNzaW9uIChxdyhHcm91cFJvIEdyb3VwKSkgewogICAgICAgIG15ICRBY2Nlc3NPayA9IDA7CiAgICAgICAgbXkgJEdyb3VwICAgID0gJFBhcmFte01vZHVsZVJlZ30tPnskUGVybWlzc2lvbn07CgogICAgICAgIG5leHQgUEVSTUlTU0lPTiBpZiAhJEdyb3VwOwoKICAgICAgICBteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cCcpOwoKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkR3JvdXApICkgewogICAgICAgICAgICBHUk9VUDoKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHskR3JvdXB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAhJEl0ZW07CiAgICAgICAgICAgICAgICBuZXh0IEdST1VQIGlmICEkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25DaGVjaygKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgR3JvdXBOYW1lID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAkUGVybWlzc2lvbiBlcSAnR3JvdXBSbycgPyAncm8nIDogJ3J3JywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJEFjY2Vzc09rID0gMTsKICAgICAgICAgICAgICAgIGxhc3QgR1JPVVA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRIYXNQZXJtaXNzaW9uID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uQ2hlY2soCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICBHcm91cE5hbWUgPT4gJEdyb3VwLAogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICRQZXJtaXNzaW9uIGVxICdHcm91cFJvJyA/ICdybycgOiAncncnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJEhhc1Blcm1pc3Npb24pIHsKICAgICAgICAgICAgICAgICRBY2Nlc3NPayA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkUGVybWlzc2lvbiBlcSAnR3JvdXAnICYmICRBY2Nlc3NPayApIHsKICAgICAgICAgICAgJEFjY2Vzc1JvID0gMTsKICAgICAgICAgICAgJEFjY2Vzc1J3ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGVybWlzc2lvbiBlcSAnR3JvdXBSbycgJiYgJEFjY2Vzc09rICkgewogICAgICAgICAgICAkQWNjZXNzUm8gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKCAkQWNjZXNzUm8sICRBY2Nlc3NSdyApOwp9Cgo9aGVhZDIgX1VzZXJUaW1lWm9uZUdldCgpCgpHZXQgdGltZSB6b25lIGZvciB0aGUgY3VycmVudCB1c2VyLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdmFsaWRhdGUgcGFzc2VkIHRpbWUgem9uZSBwYXJhbWV0ZXIgYW5kIHJldHVybiBkZWZhdWx0IHVzZXIgdGltZQp6b25lIGlmIGl0J3Mgbm90IHZhbGlkLgoKICAgIG15ICRVc2VyVGltZVpvbmUgPSAkU2VsZi0+X1VzZXJUaW1lWm9uZUdldCgKICAgICAgICBVc2VyVGltZVpvbmUgPT4gJ0V1cm9wZS9CZXJsaW4nLAogICAgKTsKCj1jdXQKCnN1YiBfVXNlclRpbWVab25lR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFVzZXJUaW1lWm9uZTsKCiAgICAjIFJldHVybiBwYXNzZWQgdGltZSB6b25lIG9ubHkgaWYgaXQncyB2YWxpZC4gSXQgY2FuIGhhcHBlbiB0aGF0IHVzZXIgcHJlZmVyZW5jZXMgb3Igc2Vzc2lvbiBzdG9yZSBhbiBvbGQtc3R5bGUKICAgICMgICBvZmZzZXQgd2hpY2ggaXMgbm90IHZhbGlkIGFueW1vcmUuIEluIHRoaXMgY2FzZSwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgogICAgIyAgIFBsZWFzZSBzZWUgYnVnIzEzMzc0IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgaWYgKAogICAgICAgICRQYXJhbXtVc2VyVGltZVpvbmV9CiAgICAgICAgJiYgS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lLT5Jc1RpbWVab25lVmFsaWQoIFRpbWVab25lID0+ICRQYXJhbXtVc2VyVGltZVpvbmV9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFVzZXJUaW1lWm9uZSA9ICRQYXJhbXtVc2VyVGltZVpvbmV9OwogICAgfQoKICAgICRVc2VyVGltZVpvbmUgfHw9IEtlcm5lbDo6U3lzdGVtOjpEYXRlVGltZS0+VXNlckRlZmF1bHRUaW1lWm9uZUdldCgpOwoKICAgIHJldHVybiAkVXNlclRpbWVab25lOwp9Cgo9ZW5kIEludGVybmFsOgoKPWN1dAoKMTsK</File>
        <File Location="Kernel/Config/Files/XML/OneTimeAuthentificationLink.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdG9ib19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8U2V0dGluZyBOYW1lPSJPbmVUaW1lQXV0aDo6Q3VzdG9tZXJFcnJvck1lc3NhZ2VSZWZyZXNoRmFpbGVkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoZSBtZXNzYWdlIHdoaWNoIHdpbGwgYmUgc2VudCB0byB0aGUgY3VzdG9tZXIgaWYgYSBsaW5rIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpBdXRoOjpDdXN0b21lcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPkxpbmsga29ubnRlIG5pY2h0IGVyemV1Z3Qgd2VyZGVuLCBiaXR0ZSBzZW5kZW4gU2llIGVpbmUgZW1haWwgYW4gc3VwcG9ydEB3ZS5jb20uPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJPbmVUaW1lQXV0aDo6Q3VzdG9tZXJFcnJvck1lc3NhZ2VMaW5rRXhwaXJlZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGUgbWVzc2FnZSB3aGljaCB0aGUgY3VzdG9tZXIgdXNlciB3aWxsIHNlZSBpZiBoZSB1c2VzIGFuIGludmFsaWQgdG9rZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpBdXRoOjpDdXN0b21lcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPklociBMaW5rIHZlcndlaXN0IGF1ZiBrZWluIG5vY2ggZ8O8bHRpZ2VzIFRpY2tldC48L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9Ik9uZVRpbWVBdXRoOjpDdXN0b21lckVycm9yTWVzc2FnZVdyb25nTGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGUgbWVzc2FnZSB3aGljaCB0aGUgY3VzdG9tZXIgdXNlciB3aWxsIHNlZSBpZiBoZSB1c2VzIGFuIG9sZCB0b2tlbiB3aXRoIGFuIGFjdGl2ZSBvbmUgYWxyZWFkeSBiZWluZyBwcmVzZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6QXV0aDo6Q3VzdG9tZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj5BdXMgU2ljaGVyaGVpdHNncsO8bmRlbiBtw7xzc2VuIFNpZSBkZW4gbmV1ZXN0ZW4gSWhuZW4genVnZXNhbmR0ZW4gTGluayBudXR6ZW4gdW0gYXVmIGRpZXNlcyBUaWNrZXQgenV6dWdyZWlmZW4uPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJPbmVUaW1lQXV0aDo6Q3VzdG9tZXJFcnJvck1lc3NhZ2VOZXdMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoZSBtZXNzYWdlIHdoaWNoIHRoZSBjdXN0b21lciB1c2VyIHdpbGwgc2VlIGlmIGEgbmV3IG9uZSBpcyBzZW50IHRvIGhpcyBlbWFpbCBhZGRyZXNzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6QXV0aDo6Q3VzdG9tZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj5JaHJlIFNlc3Npb24gaXN0IGxlaWRlciBhYmdlbGF1ZmVuIC0gZWluIG5ldWVyIExpbmsgd3VyZGUgYW4gSWhyZSBFbWFpbC1BZHJlc3NlIGdlc2VuZGV0LjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iT25lVGltZUF1dGg6OkFjY2Vzc0RheXNBZnRlckNsb3NlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoZSBudW1iZXIgb2YgZGF5cyBjdXN0b21lciB1c2VycyBjYW4gdXNlIGRpcmVjdCBsaW5rcyB0byBvcGVuIHRpY2tldHMgYWZ0ZXIgdGhleSBhcmUgY2xvc2VkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6QXV0aDo6Q3VzdG9tZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXlxkKiQiPjE0PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJPbmVUaW1lQXV0aDo6VG9rZW5SZWZyZXNoTm90aWZpY2F0aW9uSUQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2VuZCB0aGUgdGV4dCBvZiBhIG5vdGlmaWNhdGlvbiB0byB0aGUgY3VzdG9tZXIgdXNlciBpZiBoZSByZWZyZXNocyBoaXMgdG9rZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpBdXRoOjpDdXN0b21lcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeXGQqJCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6UHJlRmlsdGVyTW9kdWxlIyMjMDAwLUNyZWF0ZUN1c3RvbWVyVXNlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5DcmVhdGUgYSBDdXN0b21lclVzZXIgaW4gYSBzcGVjaWZpYyBiYWNrZW5kIGlmIG5vbmUgZXhpc3RzIGZvciB0aGUgc2VuZGVyIGVtYWlsLiBDdXN0b21lckhlYWRlclNwb29mUHJvdGVjdGlvbiBzZXRzIChhbmQgcG9zc2libHkgb3ZlcndyaXRlcykgdGhlIFgtT1RPQk8tQ3VzdG9tZXIgaGVhZGVyIGlmIGEgY3VzdG9tZXIgdXNlciBleGlzdHMgZm9yIGFuIGVtYWlsIGFkZHJlc3MgdG8gcHJldmVudCBzcG9vZmluZy4gQ3VzdG9tZXJVc2VyQmFja2VuZCBkZWZpbmVzIHRoZSBiYWNrZW5kIGluIHdoaWNoIHRoZSBDdXN0b21lclVzZXIgd2lsbCBiZSBjcmVhdGVkLCBpZiBTZXRDaGVja0JveE5hbWUgaXMgc2V0IHRvIHRoZSBuYW1lIG9mIGEgZHluYW1pYyBmaWVsZCBvZiB0aGUgdHlwZSBjaGVja2JveCwgaXQgd2lsbCBiZSBzZXQgdG8gY2hlY2tlZCBmb3IgdGlja2V0cyBjcmVhdGVkIGJ5IGN1c3RvbWVyIHVzZXJzIGZyb20gdGhpcyBiYWNrZW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpDcmVhdGVOZXdDdXN0b21lclVzZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1c3RvbWVySGVhZGVyU3Bvb2ZQcm90ZWN0aW9uIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21lclVzZXJCYWNrZW5kIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNldENoZWNrQm94TmFtZSI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkRhZW1vbjo6U2NoZWR1bGVyQ3JvblRhc2tNYW5hZ2VyOjpUYXNrIyMjRGVsZXRlRXhwaXJlZE9UQVRva2VucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIiBDb25maWdMZXZlbD0iMTAwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWxldGVzIE9UQSBUb2tlbnMgb2YgY2xvc2VkIHRpY2tldHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5EYWVtb246OlNjaGVkdWxlckNyb25UYXNrTWFuYWdlcjo6VGFzazwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXNrTmFtZSI+RGVsZXRlRXhwaXJlZE9UQVRva2VuczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2NoZWR1bGUiPjAgNCAqICogKjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJBdXRoOjpPbmVUaW1lQXV0aExpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZ1bmN0aW9uIj5EZWFjdGl2YXRlQ2xvc2VkVGlja2V0czwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQYXJhbXMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KPC9vdG9ib19jb25maWc+Cg==</File>
        <File Location="Kernel/System/Console/Command/Maint/CustomerAuth/DeleteExpiredOTATokens.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpNYWludDo6Q3VzdG9tZXJBdXRoOjpEZWxldGVFeHBpcmVkT1RBVG9rZW5zOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6QmFzZUNvbW1hbmQpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aDo6T25lVGltZUF1dGhMaW5rJywKKTsKCnN1YiBDb25maWd1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+RGVzY3JpcHRpb24oJ0RlbGV0ZXMgZXhwaXJlZCBPbmVUaW1lQXV0aGVudGlmaWNhdGlvblRva2Vucy4nKTsKCiAgICByZXR1cm47Cn0KCnN1YiBQcmVSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm47Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGg6Ok9uZVRpbWVBdXRoTGluaycpLT5EZWFjdGl2YXRlQ2xvc2VkVGlja2V0cygpOwoKICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkRvbmUuPC9ncmVlbj5cblxuIik7CiAgICAgICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZU9rKCk7CiAgICB9CgogICAgJFNlbGYtPlByaW50RXJyb3IoIkZhaWxlZC5cblxuIik7CiAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlRXJyb3IoKTsKfQoKMTsK</File>
        <File Location="Kernel/System/CustomerAuth/OneTimeAuthLink.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGg6Ok9uZVRpbWVBdXRoTGluazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW1haWwnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgJFNlbGYtPntEQk9iamVjdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAkU2VsZi0+e1RhYmxlfSA9ICdvdGFfdG9rZW5zJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBHZXRPcHRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1doYXR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBXaGF0ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIG1vZHVsZSBvcHRpb25zCiAgICBteSAlT3B0aW9uID0gKAogICAgICAgIFByZUF1dGggPT4gMCwKICAgICk7CgogICAgIyByZXR1cm4gb3B0aW9uCiAgICByZXR1cm4gJE9wdGlvbnsgJFBhcmFte1doYXR9IH07Cn0KCnN1YiBFeHRlbmRlZFBhcmFtTmFtZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gcXcvT1RBVG9rZW4vOwp9CgpzdWIgQXV0aCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17T1RBVG9rZW59ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gVG9rZW4gcHJvdmlkZWQhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gIlNFTEVDVCB1c2VkLHVzZXIsdGlja2V0X251bWJlciBGUk9NICRTZWxmLT57VGFibGV9IFdIRVJFIHRva2VuID0gPyIsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17T1RBVG9rZW59IF0sCiAgICApOwoKICAgIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpOwogICAgbXkgKCAkVXNlZCwgJFVzZXIsICRUaWNrZXROdW1iZXIgKSA9ICgwKTsKCiAgICBpZiAoQFJvdykgewogICAgICAgICggJFVzZWQsICRVc2VyLCAkVGlja2V0TnVtYmVyICkgPSBAUm93OwogICAgfQoKICAgIGlmICggISRVc2VkIHx8ICEkVXNlciApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBFcnJvciA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ09uZVRpbWVBdXRoOjpDdXN0b21lckVycm9yTWVzc2FnZUxpbmtFeHBpcmVkJykgfHwgJ0lociBMaW5rIHZlcndlaXN0IGF1ZiBrZWluIG5vY2ggZ8O8bHRpZ2VzIFRpY2tldC4nLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICAjIHNlbmQgb3V0IG5ldyBlbWFpbCBpZiB0aGUgdGlja2V0IGlzIHN0aWxsIGNvbnNpZGVyZWQgYWN0aXZlIGJ1dCBubyBjdXJyZW50IGxpbmsgZXhpc3RzCiAgICBpZiAoICRVc2VkID09IDEgKSB7CgogICAgICAgICMgc3RvcmUgZmFpbGVkIGxvZ2luIGNvdW50CiAgICAgICAgbXkgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFBhcmFte1VzZXJ9ICk7CiAgICAgICAgaWYgKCVDdXN0b21lckRhdGEpIHsKICAgICAgICAgICAgbXkgJENvdW50ID0gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW5GYWlsZWR9IHx8IDA7CiAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgICAgICAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlckxvZ2luRmFpbGVkJywKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB3aGV0aGVyIGFjdGl2ZSBsb2dpbiBsaW5rIHN0aWxsIGV4aXN0cwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgID0+ICJTRUxFQ1QgdXNlciBGUk9NICRTZWxmLT57VGFibGV9IFdIRVJFIHRpY2tldF9udW1iZXIgPSA/IEFORCB1c2VkID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFRpY2tldE51bWJlciwgXDIgXSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDdXN0b21lclVzZXIgJyRVc2VyJyB0cmllZCB0byBsb2cgaW4gd2l0aCBhbiBvbGQgdG9rZW4uIE5ldyB0b2tlbiBleGlzdHMgLSBub3RoaW5nIHRvIGRvLiIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ09uZVRpbWVBdXRoOjpDdXN0b21lckVycm9yTWVzc2FnZVdyb25nTGluaycpCiAgICAgICAgICAgICAgICAgICAgfHwgJ0F1cyBTaWNoZXJoZWl0c2dyw7xuZGVuIG3DvHNzZW4gU2llIGRlbiBuZXVlc3RlbiBJaG5lbiB6dWdlc2FuZHRlbiBMaW5rIG51dHplbiB1bSBhdWYgZGllc2VzIFRpY2tldCB6dXp1Z3JlaWZlbi4nLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkN1c3RvbWVyVXNlciAnJFVzZXInIHRyaWVkIHRvIGxvZyBpbiB3aXRoIGFuIG9sZCB0b2tlbi4gTm8gYWN0aXZlIHRva2VuIGxlZnQgLSBzZW5kaW5nIGEgbmV3IG9uZSB2aWEgbWFpbC4iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+U2VuZE5ld1Rva2VuKAogICAgICAgICAgICAgICAgVXNlciAgICAgICAgID0+ICRVc2VyLAogICAgICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdPbmVUaW1lQXV0aDo6Q3VzdG9tZXJFcnJvck1lc3NhZ2VOZXdMaW5rJykKICAgICAgICAgICAgICAgICAgICB8fCAnSWhyZSBTZXNzaW9uIGlzdCBsZWlkZXIgYWJnZWxhdWZlbiAtIGVpbiBuZXVlciBMaW5rIHd1cmRlIGFuIElocmUgRW1haWwtQWRyZXNzZSBnZXNlbmRldC4nLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFVzZWQgPT0gMiApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkN1c3RvbWVyVXNlciAnJFVzZXInIGxvZ2dlZCBpbiB2aWEgdG9rZW4uIgogICAgICAgICk7CgogICAgICAgICRTZWxmLT5EZWFjdGl2YXRlVGlja2V0VG9rZW5zKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldE51bWJlciwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFVzZXI7CiAgICB9CgogICAgcmV0dXJuOwp9CgpzdWIgR2VuZXJhdGVUb2tlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcvVXNlciBUaWNrZXROdW1iZXIvKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlYWN0aXZhdGUgYWxsIG90aGVyIHRva2VucyBmb3IgdGhpcyB0aWNrZXQKICAgICRTZWxmLT5EZWFjdGl2YXRlVGlja2V0VG9rZW5zKAogICAgICAgIFRpY2tldE51bWJlciA9PiAkUGFyYW17VGlja2V0TnVtYmVyfSwKICAgICk7CgogICAgbXkgJE9UQVRva2VuTGVuZ3RoID0gMjQ7CiAgICBteSAkUmFuZG9tU3RyaW5nOwoKICAgIG15ICRUcnkgPSAxOwogICAgd2hpbGUgKCRUcnkpIHsKICAgICAgICAkUmFuZG9tU3RyaW5nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+R2VuZXJhdGVSYW5kb21TdHJpbmcoCiAgICAgICAgICAgIExlbmd0aCA9PiAkT1RBVG9rZW5MZW5ndGgsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayB3aGV0aGVyIHRoZSBzdHJpbmcgYWxyZWFkeSBleGlzdHMKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICA9PiAiU0VMRUNUIHVzZXIgRlJPTSAkU2VsZi0+e1RhYmxlfSBXSEVSRSB0b2tlbiA9ID8iLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtPVEFUb2tlbn0gXSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRUcnkrKzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRUcnkgPSAwOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkVHJ5ID4gNSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBnZW5lcmF0ZSBhIHVuaXF1ZSByYW5kb20gc3RyaW5nIGFmdGVyIGZpdmUgcmV0cmllcyAtIHNvbWV0aGluZyBpcyBub3QgcmlnaHQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiSU5TRVJUIElOVE8gJFNlbGYtPntUYWJsZX0gKCB0b2tlbiwgdGlja2V0X251bWJlciwgdXNlZCwgdXNlciwgY3JlYXRlX3RpbWUsIGNoYW5nZV90aW1lICkKICAgICAgICAgICAgVkFMVUVTICggPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsIGN1cnJlbnRfdGltZXN0YW1wICkiLAogICAgICAgIEJpbmQgPT4gWyBcJFJhbmRvbVN0cmluZywgXCRQYXJhbXtUaWNrZXROdW1iZXJ9LCBcMiwgXCRQYXJhbXtVc2VyfSBdLAogICAgKTsKCiAgICByZXR1cm4gJFJhbmRvbVN0cmluZzsKfQoKc3ViIERlYWN0aXZhdGVUaWNrZXRUb2tlbnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3L1RpY2tldE51bWJlci8pIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gIlVQREFURSAkU2VsZi0+e1RhYmxlfSBTRVQgdXNlZCA9IDEsIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAgV0hFUkUgdGlja2V0X251bWJlciA9ID8gQU5EIHVzZWQgPSAyIiwKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUaWNrZXROdW1iZXJ9IF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgRGVsZXRlVGlja2V0VG9rZW5zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdy9UaWNrZXROdW1iZXIvKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSAkU2VsZi0+e1RhYmxlfSBXSEVSRSB0aWNrZXRfbnVtYmVyID0gPyIsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGlja2V0TnVtYmVyfSBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIFRpY2tldExpbmsgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3L1RpY2tldE51bWJlciBVc2VyLykgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJENvbmZpZ09iamVjdC0+R2V0KCdPbmVUaW1lQXV0aDo6Q3VzdG9tZXJFcnJvck1lc3NhZ2VSZWZyZXNoRmFpbGVkJykgLy8gJ0xpbmsgY291bGQgbm90IGJlIGdlbmVyYXRlZCwgcGxlYXNlIGNvbnRhY3QgdXMgZGlyZWN0bHkhJzsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFRpY2tldExpbmsgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0h0dHBUeXBlJykgLiAnOi8vJyAuICRDb25maWdPYmplY3QtPkdldCgnRlFETicpIC4gJy9vdG9iby9jdXN0b21lci5wbCc7CiAgICAkVGlja2V0TGluayAuPSAiP0FjdGlvbj1DdXN0b21lclRpY2tldFpvb207VGlja2V0TnVtYmVyPSRQYXJhbXtUaWNrZXROdW1iZXJ9IjsKCiAgICAjIGNoZWNrIGlmIHRoZSB1c2VyIGFscmVhZHkgaGFzIGEgcGFzc3N3b3JkIC0gdGhlbiBubyBkaXJlY3QgbGluayBpcyBuZWVkZWQKICAgIG15ICVVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgIFVzZXIgPT4gJFBhcmFte1VzZXJ9LAogICAgKTsKCiAgICBpZiAoICEkVXNlcntVc2VyUGFzc3dvcmR9ICkgewoKICAgICAgICAjIGdlbmVyYXRlIHRva2VuCiAgICAgICAgbXkgJFRva2VuID0gJFNlbGYtPkdlbmVyYXRlVG9rZW4oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVG9rZW4gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFcnJvciBpbiB0b2tlbiBnZW5lcmF0aW9uISIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkQ29uZmlnT2JqZWN0LT5HZXQoJ09uZVRpbWVBdXRoOjpDdXN0b21lckVycm9yTWVzc2FnZScpIC8vICdMaW5rIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQsIHBsZWFzZSBjb250YWN0IHVzIGRpcmVjdGx5ISc7CiAgICAgICAgfQoKICAgICAgICAkVGlja2V0TGluayAuPSAiO09UQVRva2VuPSRUb2tlbiI7CiAgICB9CgogICAgcmV0dXJuICI8YSBocmVmPSckVGlja2V0TGluaycgdGFyZ2V0PSdfYmxhbmsnPiRUaWNrZXRMaW5rPC9hPiI7Cn0KCnN1YiBEZWFjdGl2YXRlQ2xvc2VkVGlja2V0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdldCB0aGUgY29tcGFyZSB0aW1lIGlmIGEgZGVsYXkgaXMgZ2l2ZW4KICAgIG15ICREZWxheSAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnT25lVGltZUF1dGg6OkFjY2Vzc0RheXNBZnRlckNsb3NlJykgfHwgMDsKICAgIG15ICRTdGlsbE9LVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Ub0Vwb2NoKCkgLSAyNCAqIDYwICogNjAgKiAkRGVsYXk7CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgRElTVElOQ1QodGlja2V0X251bWJlcikgRlJPTSAkU2VsZi0+e1RhYmxlfSIsCiAgICApOwoKICAgIG15IEBUaWNrZXROdW1iZXJzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBUaWNrZXROdW1iZXJzLCAkUm93WzBdOwogICAgfQoKICAgIFRJQ0tFVDoKICAgIGZvciBteSAkVE4gKEBUaWNrZXROdW1iZXJzKSB7CiAgICAgICAgbXkgJFRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0SURMb29rdXAoCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVE4sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICk7CgogICAgICAgICMgcmVtb3ZlIG9sZCB0b2tlbnMKICAgICAgICBpZiAoICRUaWNrZXR7U3RhdGVUeXBlfSBlcSAnY2xvc2VkJyB8fCAkVGlja2V0e1N0YXRlVHlwZX0gZXEgJ3JlbW92ZWQnIHx8ICRUaWNrZXR7U3RhdGVUeXBlfSBlcSAnbWVyZ2VkJyApIHsKICAgICAgICAgICAgaWYgKCREZWxheSkgewogICAgICAgICAgICAgICAgbXkgJExhc3RDaGFuZ2VkVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRUaWNrZXR7Q2hhbmdlZH0sCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKS0+VG9FcG9jaCgpOwoKICAgICAgICAgICAgICAgIG5leHQgVElDS0VUIGlmICRMYXN0Q2hhbmdlZFRpbWUgPiAkU3RpbGxPS1RpbWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT5EZWxldGVUaWNrZXRUb2tlbnMoCiAgICAgICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFROLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIFNlbmROZXdUb2tlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcvVGlja2V0TnVtYmVyIFVzZXIvKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwogICAgbXkgJFRpY2tldE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICBteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRJRExvb2t1cCgKICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFBhcmFte1RpY2tldE51bWJlcn0sCiAgICApOwogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICApOwogICAgbXkgJVVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgVXNlciA9PiAkUGFyYW17VXNlcn0sCiAgICApOwoKICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwogICAgbXkgJFNlbmRlciAgICAgICAgICAgID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5TZW5kZXIoCiAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgbXkgJE5vdGlmaWNhdGlvbklEID0gJENvbmZpZ09iamVjdC0+R2V0KCdPbmVUaW1lQXV0aDo6VG9rZW5SZWZyZXNoTm90aWZpY2F0aW9uSUQnKTsKCiAgICBteSAoICRCb2R5LCAkU3ViamVjdCApOwoKICAgIGlmICgkTm90aWZpY2F0aW9uSUQpIHsKICAgICAgICBteSAlTm90aWZpY2F0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok5vdGlmaWNhdGlvbkV2ZW50JyktPk5vdGlmaWNhdGlvbkdldCgKICAgICAgICAgICAgSUQgPT4gJE5vdGlmaWNhdGlvbklELAogICAgICAgICk7CgogICAgICAgIG15ICVMYW5ndWFnZXMgPSBtYXAgeyAkXyA9PiAkXyB9IEB7ICROb3RpZmljYXRpb257RGF0YX17TGFuZ3VhZ2VJRH0gfTsKICAgICAgICBteSAkTGFuZ3VhZ2UgID0gJExhbmd1YWdlc3tkZX0gfHwgJExhbmd1YWdlc3tlbn0gfHwgJE5vdGlmaWNhdGlvbntEYXRhfXtMYW5ndWFnZUlEfVswXTsKCiAgICAgICAgIyByZXBsYWNlIHBsYWNlIGhvbGRlciBzdHVmZgogICAgICAgICRCb2R5ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5fUmVwbGFjZSgKICAgICAgICAgICAgUmljaFRleHQgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpLAogICAgICAgICAgICBUZXh0ICAgICAgID0+ICROb3RpZmljYXRpb257TWVzc2FnZX17JExhbmd1YWdlfXtCb2R5fSwKICAgICAgICAgICAgRGF0YSAgICAgICA9PiB7fSwKICAgICAgICAgICAgVGlja2V0RGF0YSA9PiBcJVRpY2tldCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTdWJqZWN0ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5fUmVwbGFjZSgKICAgICAgICAgICAgUmljaFRleHQgICA9PiAwLAogICAgICAgICAgICBUZXh0ICAgICAgID0+ICROb3RpZmljYXRpb257TWVzc2FnZX17JExhbmd1YWdlfXtTdWJqZWN0fSwKICAgICAgICAgICAgRGF0YSAgICAgICA9PiB7fSwKICAgICAgICAgICAgVGlja2V0RGF0YSA9PiBcJVRpY2tldCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgZWxzZSB7CiAgICAgICAgbXkgJFRpY2tldExpbmsgPSAkU2VsZi0+VGlja2V0TGluayglUGFyYW0pOwoKICAgICAgICAkU3ViamVjdCA9ICJOZXVlciBBdXRoZW50aWZpemllcnVuZ3NsaW5rIGbDvHIgVGlja2V0IyRUaWNrZXR7VGlja2V0TnVtYmVyfSI7CiAgICAgICAgJEJvZHkgICAgPSAiR3V0ZW4gVGFnPGJyLz5JaHIgYWt0dWVsbGVyIExpbmsgdW0gYXVmIFRpY2tldCMkVGlja2V0e1RpY2tldE51bWJlcn0genVncmVpZmVuIHp1IGvDtm5uZW4gbGF1dGV0Ojxici8+JFRpY2tldExpbmsiOwogICAgfQoKICAgIG15ICRFbWFpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbCcpOwogICAgbXkgJFNlbnQgICAgICAgID0gJEVtYWlsT2JqZWN0LT5TZW5kKAogICAgICAgIEZyb20gICAgID0+ICRTZW5kZXIsCiAgICAgICAgVG8gICAgICAgPT4gJFVzZXJ7VXNlckVtYWlsfSwKICAgICAgICBTdWJqZWN0ICA9PiAkU3ViamVjdCwKICAgICAgICBDaGFyc2V0ICA9PiAndXRmLTgnLAogICAgICAgIE1pbWVUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgIEJvZHkgICAgID0+ICRCb2R5LAogICAgKTsKCiAgICBpZiAoICEkU2VudCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBzZW5kIG5ldyB0b2tlbiB0byAkUGFyYW17VXNlcn0gZm9yIFRpY2tldCMkUGFyYW17VGlja2V0TnVtYmVyfSEiCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="Kernel/System/PostMaster/Filter/CreateNewCustomerUser.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OkNyZWF0ZU5ld0N1c3RvbWVyVXNlcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBwYXJzZXIgb2JqZWN0CiAgICAkU2VsZi0+e1BhcnNlck9iamVjdH0gPSAkUGFyYW17UGFyc2VyT2JqZWN0fSB8fCBkaWUgIkdvdCBubyBQYXJzZXJPYmplY3QhIjsKCiAgICAjIEdldCBjb21tdW5pY2F0aW9uIGxvZyBvYmplY3QuCiAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9ID0gJFBhcmFte0NvbW11bmljYXRpb25Mb2dPYmplY3R9IHx8IGRpZSAiR290IG5vIENvbW11bmljYXRpb25Mb2dPYmplY3QhIjsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG9ubHkgbmVlZGVkIGZvciBuZXcgdGlja2V0cwogICAgcmV0dXJuIDEgaWYgJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhHZXRQYXJhbSBKb2JDb25maWcpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpDcmVhdGVOZXdDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiTmVlZCAkXyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15IEBFbWFpbEFkZHJlc3NPbkZpZWxkID0gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5TcGxpdEFkZHJlc3NMaW5lKAogICAgICAgIExpbmUgPT4gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5HZXRQYXJhbSggV0hBVCA9PiAnRnJvbScgKSwKICAgICk7CgogICAgbXkgJEluY29taW5nTWFpbEFkZHJlc3M7CgogICAgZm9yIG15ICRFbWFpbEFkZHJlc3MgKEBFbWFpbEFkZHJlc3NPbkZpZWxkKSB7CiAgICAgICAgJEluY29taW5nTWFpbEFkZHJlc3MgPSAkU2VsZi0+e1BhcnNlck9iamVjdH0tPkdldEVtYWlsQWRkcmVzcygKICAgICAgICAgICAgRW1haWwgPT4gJEVtYWlsQWRkcmVzcywKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxIGlmICEkSW5jb21pbmdNYWlsQWRkcmVzczsKCiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwoKICAgIG15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgUG9zdE1hc3RlclNlYXJjaCA9PiBsYygkSW5jb21pbmdNYWlsQWRkcmVzcyksCiAgICAgICAgVmFsaWQgICAgICAgICAgICA9PiAwLAogICAgKTsKCiAgICAjIHVzZXIgYWxyZWFkeSBleGlzdHMKICAgIGlmICglTGlzdCkgewoKICAgICAgICAjIHJldHVybiBpZiBubyBYLU9UT0JPLUN1c3RvbWVyVXNlciBzcG9vZmluZyBpcyBwb3NzaWJsZS9kYW5nZXJvdXMKICAgICAgICByZXR1cm4gMSBpZiAhJFBhcmFte0pvYkNvbmZpZ317Q3VzdG9tZXJIZWFkZXJTcG9vZlByb3RlY3Rpb259ICYmICEkUGFyYW17Sm9iQ29uZmlnfXtTZXRDaGVja0JveE5hbWV9OwoKICAgICAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgICAgIExPR0lOOgogICAgICAgIGZvciBteSAkVXNlckxvZ2luICggc29ydCBrZXlzICVMaXN0ICkgewogICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJFVzZXJMb2dpbiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlcntWYWxpZElEfSA9PSAxICkgewogICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICVDdXN0b21lclVzZXI7CiAgICAgICAgICAgICAgICBsYXN0IExPR0lOOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlmIHVzZXIgZXhpc3RzIGJ1dCBpcyBub3QgdmFsaWQsIGRvIG5vdGhpbmcKICAgICAgICByZXR1cm4gMSBpZiAhJUN1c3RvbWVyRGF0YTsKCiAgICAgICAgaWYgKCAkUGFyYW17Sm9iQ29uZmlnfXtTZXRDaGVja0JveE5hbWV9ICYmICRDdXN0b21lckRhdGF7U291cmNlfSBlcSAoICRQYXJhbXtKb2JDb25maWd9e0N1c3RvbWVyVXNlckJhY2tlbmR9IHx8ICdDdXN0b21lclVzZXInICkgKSB7CiAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX17ICdYLU9UT0JPLUR5bmFtaWNGaWVsZC0nIC4gJFBhcmFte0pvYkNvbmZpZ317U2V0Q2hlY2tCb3hOYW1lfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAxIGlmICEkUGFyYW17Sm9iQ29uZmlnfXtDdXN0b21lckhlYWRlclNwb29mUHJvdGVjdGlvbn07CgogICAgICAgICMgdGFrZSBDdXN0b21lcklEIGZyb20gY3VzdG9tZXIgYmFja2VuZCBsb29rdXAgb3IgZnJvbSBmcm9tIGZpZWxkCiAgICAgICAgaWYgKCAkQ3VzdG9tZXJEYXRhe1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX17J1gtT1RPQk8tQ3VzdG9tZXJVc2VyJ30gPSAkQ3VzdG9tZXJEYXRhe1VzZXJMb2dpbn07CgogICAgICAgICAgICAjIG5vdGljZSB0aGF0IFVzZXJMb2dpbiBpcyBmcm9tIGN1c3RvbWVyIHNvdXJjZSBiYWNrZW5kCiAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnTm90aWNlJywKICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OkNyZWF0ZU5ld0N1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJUYWtlIFVzZXJMb2dpbiAoJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59KSBmcm9tICIKICAgICAgICAgICAgICAgICAgICAuICJjdXN0b21lciBzb3VyY2UgYmFja2VuZCBiYXNlZCBvbiAoJEluY29taW5nTWFpbEFkZHJlc3MpLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICggJEN1c3RvbWVyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX17J1gtT1RPQk8tQ3VzdG9tZXJObyd9ID0gJEN1c3RvbWVyRGF0YXtVc2VyQ3VzdG9tZXJJRH07CgogICAgICAgICAgICAjIG5vdGljZSB0aGF0IFVzZXJDdXN0b21lcklEIGlzIGZyb20gY3VzdG9tZXIgc291cmNlIGJhY2tlbmQKICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdOb3RpY2UnLAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZpbHRlcjo6Q3JlYXRlTmV3Q3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIlRha2UgVXNlckN1c3RvbWVySUQgKCRDdXN0b21lckRhdGF7VXNlckN1c3RvbWVySUR9KSIKICAgICAgICAgICAgICAgICAgICAuICIgZnJvbSBjdXN0b21lciBzb3VyY2UgYmFja2VuZCBiYXNlZCBvbiAoJEluY29taW5nTWFpbEFkZHJlc3MpLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdXNlciBkb2VzIG5vdCB5ZXQgZXhpc3QgLSBjcmVhdGUgaXQhCiAgICBlbHNlIHsKICAgICAgICBteSAkVXNlckxvZ2luID0gbGMoJEluY29taW5nTWFpbEFkZHJlc3MpOwoKICAgICAgICBteSAkU3VjY2VzcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckFkZCgKICAgICAgICAgICAgU291cmNlICAgICAgICAgPT4gJFBhcmFte0pvYkNvbmZpZ317Q3VzdG9tZXJVc2VyQmFja2VuZH0gfHwgJ0N1c3RvbWVyVXNlcicsCiAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgID0+ICcgJywKICAgICAgICAgICAgVXNlckxhc3RuYW1lICAgPT4gJyAnLAogICAgICAgICAgICBVc2VyQ3VzdG9tZXJJRCA9PiAkVXNlckxvZ2luLAogICAgICAgICAgICBVc2VyTG9naW4gICAgICA9PiAkVXNlckxvZ2luLAogICAgICAgICAgICBVc2VyRW1haWwgICAgICA9PiAkVXNlckxvZ2luLAogICAgICAgICAgICBWYWxpZElEICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICgkU3VjY2VzcykgewoKICAgICAgICAgICAgIyBub3RpY2UgdGhhdCBVc2VyTG9naW4gaXMgZnJvbSBjdXN0b21lciBzb3VyY2UgYmFja2VuZAogICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ05vdGljZScsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpDcmVhdGVOZXdDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiQ3JlYXRlIGFuZCBzZXQgbmV3IFVzZXJMb2dpbiAoJFVzZXJMb2dpbikuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX17J1gtT1RPQk8tQ3VzdG9tZXJVc2VyJ30gPSAkVXNlckxvZ2luOwogICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19eydYLU9UT0JPLUN1c3RvbWVyTm8nfSAgID0gJFVzZXJMb2dpbjsKCiAgICAgICAgICAgIGlmICggJFBhcmFte0pvYkNvbmZpZ317U2V0Q2hlY2tCb3hOYW1lfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX17ICdYLU9UT0JPLUR5bmFtaWNGaWVsZC0nIC4gJFBhcmFte0pvYkNvbmZpZ317U2V0Q2hlY2tCb3hOYW1lfSB9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgcHJlZmVyZW5jZXMKICAgICAgICAgICAgJEN1c3RvbWVyVXNlck9iamVjdC0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlclRpbWVab25lJywKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAnRXVyb3BlL0JlcmxpbicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRDdXN0b21lclVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJ1VzZXJTaG93VGlja2V0cycsCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJzI1JywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEN1c3RvbWVyVXNlck9iamVjdC0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlclJlZnJlc2hUaW1lJywKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAnMCcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="doc/en/OneTimeAuthentificationLink.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/gCkqoRBCmVuZHN0cmVhbQplbmRvYmoKOCAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDMyOD4+CnN0cmVhbQp42nVSy07EMAy88xX+gWZtJ05iqeoB8RDcVvSGOLTblgsV2hO/j5MWFglQaznjxjMeq3AGArSHILG9CKfV0L3F67/5DE41evgw1KgLUWCFEPMXeIMnOP7RRZqdSXitihELIAaO6tiaU3JRYhng8LAi3LwbyXUPhzsCDi7lRNAvQOyd5AANkR2YoZ+eW8RsVDEi0dwFMTzOSMFbLZQaIoZOW6RRkIYJyc+1XFsKLlfn0m43F3+ppY0W47DT2R3J3Uv/WOei5JgklLnYo5lP0HByWWUfa9AutJuUjB1hPXeNb3cZ2jDn8mU+1WBeLI97XqpY45OjsmEK5DTqhd7M1il/ulI1yqTbWnCkErsIBi1L6RqyPlwQBS9ujFqEi5tsC4/RzAg6CbTLFfdlg2Zl46d5qsE8fJuY6vA1L1S5b/tfP8Px6hMGZ4zaCmVuZHN0cmVhbQplbmRvYmoKMTIgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAzND4+CnN0cmVhbQp42lMoVDBUMABCQwVzIyAyUEjOBfLcgTidIB3IBQCH6gxHCmVuZHN0cmVhbQplbmRvYmoKMjggMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA3NjQ+PgpzdHJlYW0KeNrtmclu2zAQhu99Cr6A2Fm4DWDoUKAN0Fta34oeHMvqpTmkl75+h9rF2HCQuJdWSGJSTDCLNB//oWKeDBrQLzSR9BvM8VGv7vTnx7Pxw968/4QGnWUXyOxbw0KWxJsqRhtBzL75tgMgBEgEEAPAwwmAcZ4/YP19/9l83BuwBEk/OTr9dCmYL3dnFn9NfsVKoJDdgqkwimVKvUc8HesKkUN2nuoq6RKeAA+oIwCKADrWMeha0881VwxhCmad4uxKE7XpmbvTbZLQECw5P1pt6kqC2+WbBNi4WnZ9Coem9kNGwdUVxfwLkZpwWJUE+OCHHHWdpr8exi5vvUW9xRclTUxlgC28Mm1e2NbqEefUNLKlKXMgaofH6HOU4FKd+ixRs4GW52yOp/7p5afq09lklg4lWhd55VCd1ZUTGWYeYJv9X7NrRZMJ8IzrMl3U/7gz3oAD8hZ9KEnItFJS7OEQajcQkPcyrfjxkmNNMG1110EAG1IqPF68VRseGxQXoVjV7N/BgqNFxBKLk2LBnBVBmwnk06x5nRZGIOc6ne8AyQqR9b7pVJMGOc3awaGueNerossMHdXyyNUsrVdvCTqNN5TxbgD9DxCsKvTNEJStoRcLJHPDWUnUhgiOvtvrc4s7akDX1V2o1bKr4y7yle2WbtnVRbCS3BT2sq8LYWhtO71q+pZVwtU7riaZfWF7Q2yb3Q7oxFLW7gKLG6paIissJR7NpGqE48lUl0OHd9wNpCyOQsUhthc3OEhuDTu8OAwnw+VpMPQd5EtkzSfd5LgIeGPuX6v4VTm+ueILCWNwNvk4FrtGGCWXKWiHBm1fvLmwtQd7iXR5V5ps3Q2VizHYhNMbiXapXAwFmsrfdCC7EP7SR2IrUPrYaNpmr2PXCZb1ukDhdmrFlGwMsUSiezUhuZlrmlldurMWXn23ehaLpZ8Ni232FixWNXsGi2F8MpYlefM7K1UI3kZ25lHtpPnyp/lq7s+JkbfBqXyGGG1K4z8FHJe+7t/9ASd1mQYKZW5kc3RyZWFtCmVuZG9iagozMSAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDExMD4+CnN0cmVhbQp42lMoVDBUMABCQwVzIyAyUEjOBfLcgTgdJ12ooGdsaWGqUA7k6ZqZmeqZG5so5CqYmFkguDkKwQqBCk4hCvpuhgqWepZmRmYKIWlgDebmehYWFgohKdE2BoYmxiBsFxvipeAaArchkAsAV8Qf1QplbmRzdHJlYW0KZW5kb2JqCjM0IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMjg2Pj4Kc3RyZWFtCnjaZVHLboQwDLz3K/wDZG3HOImEOFR9qL2tyq3qAXahl6JqT/39OuGxq1YQmTEejzOGCxCgPQSB7UU4zYae7Xzu8b6DwxNBcklZoZuA6+gwBeDoJHnozu8NYmQkVSQaWxHDw4gk3nKSc4goLWGDNNRI/RnJjyVfOBnn2jHzrXTy11xY+qL2az+rqSMy923FIZlSn1oTLM3qYRGxISrfrI1owRzzn/FUDvNkcVjj1H50r/DYwQWcT7GGH7s4iwsYYAbRuIEveIPjboyZl6KzAX0qJipmQAzkxalAVRLZ0sPLjPDwfcP9G2+VK9XaBS+r9g4X9X/ryIQQXIxxXQVTWQcGLWtAT9fvgcpdRcX5IMYtFLNks2Ab6Hj3C/nPd2sKZW5kc3RyZWFtCmVuZG9iagozNyAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDI1MT4+CnN0cmVhbQp42m1Qu27DMAzc+xX8AaskRb0Aw0OBtkC3oN6KDnYsZ2mGTPn9UJKdFGghCdSdeCR1cAEC1EUQWDfC8azoXc/pHl9GeH4jSCZ59jCuSnI0kiyMy1ePGBnJeyTKg4jiOSOJVU4Kh4gyEPZIs0OaFiSbK181BZfcXPSautoHF1pd9NNWT3NcROZp6Dgk7TSlQRvWYm5uTXSIzvZbIWqYY3nJx3qYV43zFtfhe/yA1xEuYGyKDq7ld2ICBjiD+LiDH/iEwx9rfqs6750JVjbdHTblPyZ2PgQTY2w2Ul7qLELOCAd9b+4yVYcx+OosWnrcZ9rH3wc6PN0Aj6VoNQplbmRzdHJlYW0KZW5kb2JqCjQwIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMzg0Pj4Kc3RyZWFtCnjadVPJTsQwDL3zFf6BBjuLk0hVDkiAxG1Eb4jDLB0uzGFO/D7O1nZY2ka1X+znF8uBKxCgvARey4dwvIj3LOvj1/8KKkY28CXeEJVlBxewHLrzCa+wg4cJ7p8IooqsGaYzWG2UNR4G7VWIDqbT24ioCdGhPBZxz4iHGdEIto/pfXopFGSVsawzh5hRW6EwKhI1iqARPee0kvI43SpkrTT7LrF5Nxo3BYx3iphhIGTFXWOomg5U9e6jaHar3mxXEU2z2Rx7WCidVz7Yxok2xRHp4JD2p+TElK4TSxfOJkNIVv5SrPjukFeiHHeySVqox7JLMSZN2Z7TYMaenWyBxKRtcKlGS0CrWAKFpwX2oIp2is7NLDu+IWR81Xn8q2I+hJkrynZLkrWUNTc9vYQQFUKJ6kgRyfWAFenNqdJX3k1DN4V5TZh57WjHKv0qeWmMC0nrcUNCqPW5T9jmLpgYXJs0dsobu4xac/+7DzKKOcrLdQihjgXN888Ku7tv5j/MOgplbmRzdHJlYW0KZW5kb2JqCjQzIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMjczPj4Kc3RyZWFtCnjabZG/TsQwDMZ3nsIv0GA7iZNIVQYkQGI70Q0xtHftLdxwE6+P86cHAtRG1ud+tuNf4QoEqA9BYH0RjhdVz3rOt/gwwf0TQTJJWGDaNMnRuGRhOr2NiJGRRJBozc6pXlYkZzXnSg4RXSYckRaPNJ+Q7Frztabo4l1LvVo3+50LrS/K3Pupx0dknvPAIemkOWUdWJv5pQ3RSwx27I2oaY7ly3qsh3nTuPS45ffpBR4nuIKxKXr4LNs5EzDABZzEXXzAKxz+oPlZNYh4E6zrdTfZKv+BOEgIJsbYMO53sT4ZUbbY6TJVYnWhVIll33dOqYPoe+VBfPkBHPMQu6cywOJtEJP8BrwT2Hc63H0B8993MgplbmRzdHJlYW0KZW5kb2JqCjQ2IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggNDg0Pj4Kc3RyZWFtCnjatZQ9b9swEIb3/gr+AbF3vOMXEHAo0AbollZb0cGW5CzNkC79+31JUUksJ0AGxzZNH0Xfx8OXZx4NG8KbTXT4kJkeYN1i3F/Mj8bmHMT8gzVkq8GbB6MhbcYf89PcmS+j+fyNTbY5uGDGk1EnViWawUWbsjfj/OuGyDGRJ7yU6BCIjguRYO2Qy+/xe3PBakWDqz6YLWWBC7GZubs4LmVgwo95KYopufbXr+N5psFZF+KWarfOcn0RSIhsSmzgONiwBeLCNcCixflmP+cbtaCwfFMz7xUkogmlef+8FrXPvVJ47Kk+QbYMXITkBN8S2Py4fWXx7/0rSaNIjuvzljAvMzl3wjxdhLlCOBxC8HEXkzQVUOCcCzuYJyEOSswL8YQBbeEZsU/7lFoAeSEYlONwDJtjHCvn9bgdNRvqobYO8q6WO7Wxlnxc51muTNhJtpEuCM8fQjhgn+5i4po0mVeykFIluZkSG5oG+8DvAhyizdovo1O9MiyhaL3GPazlQ2B5myuss5j1lrFgqDRNuqoTCBalwg4rtqrHwwytbHcY8FalSiiDVHsug1ayE3rNRru640b7PaRFvI2Z3ySNXiU5+d6rAjaLPjWrbr7VWWszE4d9Ea01pY77RPsYd5/+Ay4jSNQKZW5kc3RyZWFtCmVuZG9iago0OSAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDI5MD4+CnN0cmVhbQp42m1Ry07EMAy88xX+gQbbeUtVDkiAxG1Fb4hDu033wh72xO/jPFpWArWR5bFnHE/gBgQoH4Fn+RHOV8le5VyO+DTB4wtBVNGxg2kTkIMyUcO0foyIgZGcQ6KcjJF8yUhGC2YKhogmEY5Ii0WaVySdK145JS+9ufClddO/mG+66OauJz02IPOcBvZRJs0xycAqZpc2RC4x6LELUcs5lEo+18O8SVx63NLn9AbPE9xA6RgsfJftjPLo4QrGhT35gnc4/bHmnjU4Z5XXpvOOtDH/MXFw3qsQQrORNqp30RhV0FJu5jJVw+o+sRqWbF85xu4D5bWskwZnq/9CWU0qheLAHcOZnSFcpl0ntLcpHhecj+77d0oDNcXdsd2D08MPeXuCigplbmRzdHJlYW0KZW5kb2JqCjUyIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggOTkyPj4Kc3RyZWFtCnja3VjNbtswDL7vKfQC0Uj9WkDgw4CtwG7dcht2SOKkl/XQXfb6IyVZkh1nyBYXKNbWdSyR4kfyE8VYvAgUQL8ovKI/EMdnenqg6+ni/iJkCE6LX/S0CdI4K56Fcd348EN8FY/iw068/4QiyOCUE7uzMEpLo73YKC+7YMVu+LYFUAhggX4MwN4BHE4Amsb2of+++xyXQCO1cYrX2CCpaxkQszqLs/o+JDWNUe3jborSKamcH2HmpwnOxohRSqInOQQnXTZ0tH1ge8hQe0sfTWjNlSBJJHeBDGj6rx2KLw8Lgz+fFgwTUPRpPhrF0wmUOtP9eGFmBXOcD+tmNtlDxBPgfgA8WMDgXsM2uarASNvpuavDq7hqZVBmZpO5h8R1dI7s0qV9322z16FHRSJnnSJh9CjaE3+ZCURQs02h0i7dSUmpPMZrElfo83r+oAzWlvBpLwEvmDKsz5hqVnUyaDWzXcLYuK9UiBfvFYQcU46jbuZYL44jz/GeSiE2JZr37q1afDhgTkehBLrLeaf8GJMKSUxytn4f8FiL+F5ikuID4LNMVMV+4zPHiHoYUuzAZzod6bPbZ1g0Zrt5QKKbeuZm54nrtTwycvaSaKu3FeQIoLsAwJIM+Zh12TwzWZc1cjyaVXm+iYi5TGVedBSqozqbYjP2wFcxk+WqGZbRLj8R7OJUidg44mt6G112eLo2yxDg4liGPsId/a+KUcmkmCXIFQ7N+nRx2nHbRpq3ZUnfXTzWCiSdpW+fx1QhbVMh2+rIaoQETNcr2E6iGdHGtPtb6K6NldDhq/J9mZ5wbu3cSKg7ts418jOqpkQ0y/I6vDRhjq76cSkW5ckKdOpMk8Wyt6YnYskssX09ZntPp7NZgdmHE4GFHEoKSnss38JLXwKUbJ7Sab7QDlD7Sf2nuqk0G6DG06hZoxV99NdrayYFDXBzMlDeTdi2uWMg16ribU68Bl2XK/2ExLOl26J5JTG5EC+X5gbOLOWrMdRoI72xKzAUTO4PYXJKEJNiCnmr4ZD195jkY+BaRqRazGV8LJwx37jUdi4S0tI3NvhDs+ASeHYoVYg2lxPecSGIwHECfMzWP9JmcvJm6la6VtkGRMxASyU2nTaLuqyWZoLygv/xuHMjj9o9Op4SzLRy0pOVWDcL6HTUkKKep21hh5kUuTQRNasbbRxzOa+pXrcKm0ANP9i3319Me+O01qBTwkYSqL9qJiw6actXhP+5eZ5BaFeekreyPoU6wjsO/UjRcT/V5uK2MlzfJenQ2fyWxlnptSmvafLjtfdJTkmtkeSobei6Ln8TPqu5jcd3vwEMCChxCmVuZHN0cmVhbQplbmRvYmoKNTUgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAxMzQ4Pj4Kc3RyZWFtCnja1VjLrtw2DN33K/wD45KULNmA4UWANkB3aWdXdHFnxtNNs0g2/f2KIilLHt9k0iSLINfx6ME3eUS5+9BhB+kfdpHSH3TX92n0Nj1/l/ebc/fzr9hN/RQodOd7mqSx95Przrc/Z4CRAEMAxHXxPo0vK6B3ac7zHAD4BWEGvAyALzdAt+b5TMNj3rsyfdp6d9tcFL4QXpRf2jOMQPSynChOSdLLtCSBmdlwESFJiZOblRHKmEZeWa/5Ibqn90Xf9+Wv82/dL+fuQ9e7aRy6f9k630eI3fvOh9EG/3R/dO821/SYXAE9BZf+dwG7398eTH48dN6JB1/hPKIpP0Co88hryzCrz4QUp7TFYX6nZyHSdZ6PuieT4nKK6jIXF5zEjSwWbuuSvNmQs7Yu7sNifmySxrV2O98HUrvZTkmEFJ/AIsNOpfFRJd15VVqWnpIm/baVLb04RXI+QOMj/+AjJh3nbVOZzeRXFTNccoqZGN23ieE9LtioNazmzIblPdm0EGwP65T4ZzvjZk3RNzk4B0DqxnQ27cTsQ855xE6wqrretGZq0ZqBFQM2mKOOu5rCCHjzRgt3UcnyIMWK8yDFGrGfhkGCjVOomW3eUARIpbhPny8uMJFHmmkj9hBRpa+rFvvN3g/SvoFUB/00jq3oXKFSciV8pXq5NFMaZq9qipW1lyBVz7SSublkC6pptWuufq3vmiJFiL0jg6cnFPFFkVr/xmbwo9mY4aRRX8CIBXDm46AVY9XAHtseRm57yHvx8Capwv6i2DMweW2L/wksQ5dCP1ZhrouFshLJmLlSJOkWB11wMc4PivnPKyYstNyMjTAMiktTUGyC+mTVvVywBREYU3DeKpHdL3wMzWTEazVICKf0i183zV614YSCj0brQikApashWmew1qG2NZh2+zK5L6eQnfmECwd4RDDLV++P8Aou6kdmxU+yoqQ0WjVsOVzDqzgqSQOqTGPPEJhnIKlCyQeK1Op58PMmVQ5BYckgy+0NrzP0CutI2dprgwQnb+cjH/q+qQPmR+5eVKvjwLJhdVJSI+UDNx3RC+vMLQqkP36XkvtkPZkIY+8fPG/mlkQDZ4nMv545tWXj/tRW8pKbr0S4SdkSGD28q5SliPWBGvEwIet92cb4eNxt/Is9NtGejtmfVVTljCzEu8zk6taGLFeFC+7/AIsEuAYG2gGDdlMaQRO7tTR42H19Dm625mnz72F3t+dfxzRUKPylcOqOmjznqPQ2NmJNjvqhqr4wyt3E+QZDmTwjigCB6Gl3IHFMdj9nBKKkLcSgaedNCShZayrV4KIzW2o5t4+IbAkPjK2v35TNdShW526vpZK4mIQ1lPuXNa+y0LA8UIRnmLWcV4dFKtGvHZXN48BUvtL7IM0F8NLIHfXuedbCKqMGoKPblycda1HyWHKYHlDDzduJsKdpTknZ+lRymSQ2IHfg8UmkFLIWKWvpbneyBW80FjXLu+LBTxT1d+jmCX1PU3itnV+/Uzs/0k400KiWyxFgXVFpe3OV1+nCDW14aGgFcHF/rV64xvnUTSyqLxgMD9ZyWx2mexbBQd99QPxtbwfkoR/8+AP7o7lOJAvyt48Gwta6ucvXNG5yGae4DqprDWc7d0ukeg78Bi9vFk1weH3PxfTEHYPC0BMMxdn5m8jrqmqJ0ty0cKaUrrBaOL2ulla+ofcGMirSmtMWk57AuiNcqD+6nUKyNjqvn93KUD68HeViiLEfR81FTIcWc3cjMc+0vjUF1mpPYX9zlu+ICinpTjFwqypNwuEHqJ3+7376DxabuOIKZW5kc3RyZWFtCmVuZG9iago2MCAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDU4MT4+CnN0cmVhbQp42rVVy27bMBC89yv4A2b3QVIkYOhQoA3QW1rfih4sS8olOSSX/H6GFKXasgz0kdpeUySlmZ19iObZsCF82TSCH5nTE2Z3sIer8dnYlIKaV8x2ybrgzZNxIc6TR/Pd3JtPB/PxC5tkU5BgDqNxotZpY3bS2Ji8OfQ/9kTCRJ7wcUTHQNQNRIq1Y2p/Hr4WCHZWXZCM4W3TMBDUJuaK4GKbMEQhOvnlwc+HSz+DWAnN7GidXXh6RuMYSryYHVOwofJkD8GxEHXDTLQEyDKkEqAV/xrYfLvbWHx52KCEi9xM+4WOh5FERoynK5p3oJOA+9yKMyeDkXwOgfjYE41KjFzg+qYPdSwMepZt6EGcrKZUsZEXv5/gAc06ABqWUouC0JrAjrPNKy7BFUdMY66RWy5sUkMqu6ZSo54yTpHjYL5DaJcyQaw4R8xpyhGLcQrjevFlg0nJBu9XdIs00MBycWbVEo+z+iUQEFa2cp6RCTz1V3G+aKh+aNntJw9ofCehKBdPvKIqQnMus6VcMpzpSNQXW3L9h1L/rYskJNtoXHdR/1+6KFqfZMVJfd+K7ufyLmEpZTd11tqPrYxq7pzglhdPqaHO/+qcDAXonNydBp3ay91sL/md9ppWkbh5P+uQmzrOyPGOKjZFuqvjeI0ocWpCtMBUotW5Aqmh3padFt7PTdQy1XszRHmcy151ICMNfSEu44gqdG6aj1Kv+60SwAGhKfp6QAQcLuqWE6JObx1mOEE83p+hQUPEudpGt6a4//AG6jicBQplbmRzdHJlYW0KZW5kb2JqCjE1MCAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDUwOD4+CnN0cmVhbQp42l2UQW+jMBCF7/wKH7taVWCD7USKkADDKoftbjeteibgZNE2gAw55N8vzHOqqkhB+vB45r3J2GGxN/u+m1n42w3Nwc7s1PWts9NwdY1lR3vu+oAL1nbN7InezaUeg7D4WY9P9cWy8O3t6Uf2/P352jX/prpvH/PhvX18fam4Yq09IfTlNlomPO/N4TbN9rLvTwPb7QLGwj9L5ml2N/aQtcPRflu//XKtdV1/Zg+vxYG+HK7j+G4vtp9ZFKQppePQ1gytnca6sa7uzzbYRcuTsl21PGlg+/bLeqKx7Xhq/taOwpMlfHnzdCURgQSIg2LQBpQQxX5NEiV+TYG2IE0kfc4NSIK2REqBMlAGKoi0V2ZAPrIk2ghQRZRhbSlEBC0SjjJokXCUQ7WEo7wEwVEBZRKOjAHBkfGRcFRCmYSHKiZSVI9HFYjqcQ7vKgZpUAJCTkX1eAwPSoF8pAb5SOogT3w9qs4l3KoclIOog1xBpzIgX4E6yDU6qKiDfIs1HYGQU8PRFh3UcJShgxqOMnRJw1GODmo4KqBaw4OBag0PBso0PJR373C1jK2fT36f1vt085IM8gr748hHY11+GW4hID2m8RIC4yUKEOSJGIS/TVBzRIL0wnwWs56m9Q74uAKaq3PLmaSLgk77ejC73n7cJeMwrrvo9x/kixVVCmVuZHN0cmVhbQplbmRvYmoKMTUxIDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggNTAzPj4Kc3RyZWFtCnjaXZTLjqMwEEX3fIWX3Rq1gg3YRIqQeEpZzJPukWZJwEmj6RhkYJG/H6jrRKNGCsqhyq57Cxe7/FgcTT+z3Q87tLWe2bk3ndXTsNhWs5O+9MbjgnV9Ozuie3ttRm+Xf23Gb81Vs/Vf/Tv98+Xn0rd/p8Z0L7/0Zflo7Mvba8Ul6/QZ2a+3UTPh+FjUt2nW16M5D+xw8Bjbrcv6abY39pR2w0k/b8++207b3lzY01te05N6GccPfdVmZr6XJLQdh7x26PQ0Nq22jblo7+CvV8IO1Xolnjbdp3gYYNnp3L43ltLDNX2982Qj4YMEiIMCUAwKiQIXi4hCF5OgPUgRRW7PmEhJUEkUC1BFlCK2LiDCLhG0ZKgXQUtWgqAlj0DQUhQgaClcJrSUAQhaKpAk79yvQFSPc6iWAUiBQhD2lFSPB1AtJchlKpDLpHo8dPX2RBF6JjNQBsqJJN6KLECuAvWMK/RMUs/4HjHlg9AzBQ8peqbgIUVfFDxk6JmCh9zF4CGHagUPBVQreCigTMFDeff+cFUhHuzp+Llzxu+n7n5KeUl2eQUvge+yEY8/HVIhYCtIE6KUSOQgvDZBzREBbIkKBCMiBrlMEipCCBXUYhFjz9D/X/Y2P9vgP+a+Xaxdp5C+DjTf2yj2Rj8+IOMwbqvo9w8QmhQICmVuZHN0cmVhbQplbmRvYmoKMTU0IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMTM+PgpzdHJlYW0KeNqr/08d8AMAXstIMQplbmRzdHJlYW0KZW5kb2JqCjE1NSAwIG9iago8PC9MZW5ndGgxIDE5Mzc5L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggOTM1ND4+CnN0cmVhbQp42s18CXRcR5VoVb3e1JK61fve/bpfL1J3a22pJVuS1VJrsyXb8q52Ymu3knjFWxyT2CEBEkzYDgGGCZAZSGYyHCY8OQkJxEkI2wnDP2T4h+FD+Pz5n58zwBzmzGGGH4YBt/699V63WrLsLD+TPyrrvVtV91Xdre69Ve/JhBJCqsndRCAt23c1txW2/HkHtFyB3+m5s6fFnm5hmhDqh/qfHDqxePTs/MXzUH+SkFrn4pE7Dh34Sfq9hJj+CyFpzS0LM/P0+MxjhGz8W8DP3gIN+l7dACHdBqhHbzl6+txHflgtQz1NiOHXR47PzZzW3v1bQgbdhGgeODpz7oTwSdMOQkYfAXzx2MzRhbOa8Rmof4sQtuXEyYUTG7LbjhMyVgf9XyAa1smuEC30XWKT0DKm3OlB0kaRC4LT4o9IiBluVK2SiUND8+TPCPkDE365rIO5H6bNIqEfxz4msCv8EYG83s85KMfIMcRnr7JaQpa7NA8Xf8C+s/wa1MPLryn1Eh75y+UNq9pfWFMvjfdD8tVV4yn1Mp5M0qJM9kwOFURx7Bli2jEm63btn5TbfXJ9YfqQeGnPpMxiM181AP9zc9KsLxyWSUEmeWnwMsggPz3QKNO0LE4fapRZWpwX5a9PyJr4/sv11JgfmhuSdUOTYVmIFXbeNBmWwr5Lk6I8MQFNuYJPlLsQ6ioUxCUFe2ZerocmtSbKLdjfgphfn5gUgZpLM6JsnJichhYR+4wIZRHKTvumC4WCT6apQkGSycTkQqHQKAtpEcbRxGaAMm1+YlLWSgOyThoAPgoynW6UNWkJ6BLnl7SzAyL2IMU+hQK8ysL00JwsJMPQmRcviZdggqUWbQyY3DE5PeGb2VmYlArhgijndk1Cnw9ZU+dvlLVpWZ9PXSZMkZQOqtKABBKXBmZkNntIpnNAhaxNNsr6tIikVufnntGQWRFHkHPTBUSZHuSkGtKX9dUkPzSQDJdlX5VerQujMgpNAQl54HtaHLokzaBeuLyID2Uqiz4gskQlaEeaGVSmqL7O43IUniK+FdYqH6pJc4YuVxsFULZPCheS4Ua5Nr3E2JA8PzPYKJvSgCiKck1+Cz4OgDRQkGuxthNqtVBrlM0wTB0XiQgSmIN5ZVN+Wrw0LcomEFqjXJce2z25pJkfLETl2gXpXKNsSY/tmBzbpTT6wtBu4+3W9BIx5/dMLpnNeZnODMjmFNosWPLAUg1eauEiUydoQohNTC6h8IDbgUugX5w2GZbgsRLsU/rxEVgK2FIATkaA/hFoXa2q6yhwiRCbBNLKy2TTZUop15UtTZYIG9o9KZulAXFIrgbjM0pgcAPiNEz/lMVCiYkMDFyaXrLqUvIHUr4IiMkOvNlSjbIjvUTx7gQ5492VXhLw7k4vafDuSS9p8e5NL+nw7ksv6fHuTy8Z8B5IL1XhvSEtleQu66ZBwpLYJNMDuEAa5WRFp7Pc+S6lM1XRGS93nlQ6g2ki16beAn8h4C8IdInAH97DwB/eI8Af3iXgD+9R4A/vMeAP73HgD+8J4A/v9cAf3tNpsYebaWMaprVMi3nQ7XSeqxKWXhpttSktN6bkRliFzbAARsTraFGa6ZLQI94Qw4fct5RVS51yc3JJSx1Dk+DIkMHWSslc292WFjs4vRnAo0PXTgKrc93JsZ04n+TRZHCT1LXURh3IXDsIAChen2BYFTNdjXJHusnV0yhnXw8VLHgO0DtBJ8QZE5vEEVz5IMvNly6NSCPgKiYhRIBnBXeQpdRhB5F2gYtyynWApgGvGeNoclU+tXCpSRLFnksw3obVKGKTMpasgRbAFOVpdBq5HZNPMFEQfU+wuOAtDKAjNYBPlji2NAxLOL92PU6jM1PiBstPz4P15WfmoZvlZ3wAT6MjW/vMDJAF7l0aBmVKMMMw8Ac3PguMt84kkuIyNeAlQAlasCztNaPCiMhRjBMB1wnFVa7MBbrfWJKDCK3auCoHqQdE1F3ukg28f1gawUlRez1l8SEzqoTJ7skmsQdCLlKvNopIV0kFuhjUNldGd0V565m1qikJbbu3gpJ8SVXTmAKsZbmk3k3gKJpQisNyXX5ywgchU+wpNC01UTss0L5VvTt9E6t6c+s+e6Mn+tNyV+pGEw6k5Q2pS0Ab2hcwdV1UUGiT3ARP5DnLaJslnaBZSrBYmmCdKaMOgt+BEFJCfBNGPPJ22S1ygS6qRwIvVGEh4YJK4xD41q5USQ7DUNuQCkuqJFROykyPANMOZYFDegFr2dYkt8N6Hr1O+2YYjtptcgfAW9JyJ9zGUG5DIGBxGGJpSVLjaTRheQzArenL4KwA2AYARWB7+jLlLRMA8JYdiDMEwE7EQWAX4iCwG3EQ2JN+ArxeP0B7AaIc2pd+giptkwApbQXEowjtRzwO3YR4HLoZ8Th0AOfMA3AQ50RgCudEYBrnRGAGcYYBmEUcBOYQB4F5xEFggdM1ANAhThdCi5wuhG7hdCF0K6cLods4XQgd5nQhdITThdBRkPHGsgKP8Zq8CcDjCtgH4AkUOq/loPYuCKMqzkkFRJxTHIeqOKfh4e7yqGd4jT9xVgHxidsVENHPwTgqwh0KiAjnFRAR3g24PeXx7uQ1jn6XAiL6BQVE9IvwpIpwtwIiwnsUEBHuAdze8nj38hpHf68CIvr7FBDR3w9Pqgj3KSAi3K+AiPCB9BNVGlZKVgdSsmFBFqIT50pxuBF0JpB62ImJsB+rJk4SJsang666Gh0RWlLWTLjNYbFL4UiHJatzUWe2w9IuhRk0ZxM0rnNY6iV6WZKK26R2xuifMY22OOvR0s8KjBVnmIZdka5ekiR2VqthV/9KoBq2V3v1bg1j+wC++kXcW24ECi4zF6kl9WNyfGIyVw1G4RqDVgcZ9/EamVJqhSdjYaZ3prI6KRIHQrKZNqfDcjni9UbwV5IkL/2sF67FOcwM6PIEm1z+PnsZxo4v6eYHcz6Co+3DvikGEN0OYC2piQl6R2pJRwZZvKNDGdZh10kP+oNhyR+Q2KTTb/M74RJw4FaXGJf/wM6wbxAvCZBYLhKgGoFuIRrgRkMPEUGwjzHKKba7JZuk1XtSURwvEk8kwnodp76905bNutqcLlssk2BnIk5rwNBe/FG7PmDx+oTfG0S7NaR/rXjrSwv91d6w03bHeZvD764ysr12J3PYrn7lG/9IuO5AUmwRdGcjfhIjHbk2m0KNQDRaQbNAQC0HgGv7mI5qteSAIslAIBALRBNhoEMP1BEnklcSaqYNavp4XJIcmbZsB8t2tHOYRfP3H/w9yvePz6fqmxtijz4WbKzr2NT410/S43sHbz8oedmAV7rcOGT/dMNn6iPFi20t3dEXQSr1sLPfw14kCdKSA4ujAiXCBSIwKrA7gTbtFNFq7WNAqmaKaDQBzXg8EYlFojq9N0Ucdj0ILBGXIjqdw+7MtHWCflxIMLbHgYMsNrDd5jqPxdK6YfiWrouLvY1Wk9dqrjNvm5x9ZPbAI4uFcXZJctgdVa7uw0Nnz7sMTpuzzqtP7Pr8qUOfvykBOkU5fgHkWEc8JJ1r4HLTUBSclgpCSXAWCyEWj8XtcgCiKasDuyFOJKZCfFZFYJYM/bv7RkbuO/jPKLJ/nth/U+HRR9mVAw/Pzj58QBHV1affd+jQ+4pJXAc4vx3mF0lzLn1j7fFzllA0HFW0F+XaC6vTh9uUqiOjAJIjTH+Da2IJyaDbvVLEV/zNz/H2c2o+Jbk8okJM2OsJfREvXyUleoxAj4805OLYwghd0FKNRjjALRxIczAkxUe8HVI0rNO7U7aVSe3lNaoS9NKPcf4fxzx+JGMIK2yzHPY6I79CWhQKnBE+N9rLB9l3SDPZlOuOU40W7JkJOoHpLuipjmg1Ou0CEEGnQDT+MTAZ7iECXDLNpFGKg13EDWg9uJBX2QlXVoU9gUFlOzv4igTVsVsjodkzc4/Nzj42N7fZbA67zdbsxtyRvr4jOX/OfRCpfoSel7w/lGy9M4/Ozj46U2/wmj0xg6v/WD/8MxruQVekyu+9IL8QSeSiqm9Y0GlZhXcAakMkaItJtpi6Ci2K2DrCFfJDZxRG6thsJOr3RIsvxj0+CSHaF/ewKxHf1eeRrl/9ist0AK//8A9eSaGBvAQ01BJbro6bkWJA67nRl0qjSuVRrj6v6IL+DMbwk/pcDHhCO7gAyoexKBWmNLA4AgKy4ie+uBTX6l0pZzzBxYnSBvFmy3PgMnlqNlQTt3uDtnpPoEOMe/yRHIitOWm1uKWg1RzM+Okj3EZv7rmtr8IOrSSU83MeBMoYOVheClZiibVrgJ/V6wDnC9NfoOU/61XEpT0D5h0uc/da2c5/yZ4D3xnPSWGryagBHrdoIIABi7SsqBiJxppiyN2KmizgyxO6eEKwVGrLZQPPnmHfjEX8fulRo9dU6zU+Kno9YsxrDhpe+Z8Gn4k9B9M/h1zSj/+xxkypuYZqi/O+CNCW90TNNcUlur3GXKbvQeA/QKK5sMfI1qUuQPyx+GrqEnQ1VRTv7GxQ8pp8uuLHQh43gOaAnh4JudkV0X31q16pykD/a3GPWxTdbMQr1RiLLfRxt8iPd/mafBnWpBlsFjUBnkldfuAd1eUHqy6iAT8Q1VUsOVhxTaxitUFEeXnyoZmZh/btw+vkPdnpnt6pjo6p3p7p7B8enZ5+dG6OX/NHc33H8vljfbmjeYUGlEUGZGEHGiCS6KgGJKQh6AvYAS1VjdJBxx0Qpx0hRzDgA1yrFNeDeZT9dMXaAl+NzpqHN/rwzV1dN2ceR1VJ3ldtMZcrZnv8cXald7G355be57h2wHKKspjx+zOhn5Xk0iXUgFyyZJhsyY00uJlWR7cYqFYHXkoDK4Wi67xAdHDT0UWi1wtTQO+K2/KgBvP93RtgiI7GdDQaqwJnoFGIBT3G0VWVs4bOJlYWKyAAY05llXVuYhmiCrg9rrg39stofiaeG4t7RGdNXW2tE9aYNLft3IAi+fwd23pdCU+oKeCJWnRuu/Hqf1O0oGjEH3XCCvU4zbU4T8yVqI1ZFh7cqyhn74MLFpdQZ7LUmU1am5F2cjUpKlN0tbzMHgBd1ZMMyeYyYQjzMRTFFohkYNZaukDKsUT1hw0NDZmGttbmDikGDtHNF7QS/JUMZFVM4RkA8O4AAbAVLbK7zDXmkNs+2px+NuAOpCDWiO03d2ZTfTpBYzA9G3E6I9af/nS/12Q1W6sbLkST3ygptmu2t23Kn95SZw759FQT2RD2N/v/dykeNYKOOSdE0BCNABpF06N3AhdsClaDf4xnMhinA1pckxnSJsWTaHuetR4RiE2UVoerFJBQZbBEXEHGNf/qiVZfxG0z14+3d+2Y2PfTgZPDfcdjgYjLXOM9EOsbGhnfu9g+cnbQGE25Ay6pJhxsizVmasUv9R1ojYdcQZdU5ZCa46m0ydy8I983lQE+gqCY3aATyPJzQRS6cAD9d2nVANFOYpekqOpIMJCXnIgaIcOsLRLxfTbu90c/i3KjV8B3eL2hq7/lwacGFw9R/BbkyGfBr4ZwLnBYPPqA454iFbEPHMaK01J8RjlWVMQOtlccvrBjx8XhqN8dTY40pMYag172HASJT+66e3T07l30Np72f7JlrL5+rIXe5lPyCOT3fvYCLDGgwQHWR7eA51yJg3z1uRMJDXcPYGwCEBEHh64oq+TK52K631WJVkvA8DttvcMSNHz3GUPQwp6PuGtNV5+32anNygaNZl/Ybism6E+sdpy7DqT7MMzdQLY+HQvUCASS8jE5ABscG2yGuKsShFDJh/tyTsiHIckhF9RetaOQqwUqG0g9WEwCc6wSnXpwDcJ69LqyKt3C2Qbh27qg1SpWffgjQL81qPu20OCxi7pP3GMI2mwBw7sf1IXt7IWYv6r66hWLndptNF98DhiyW9hgdZU/5rAWe2iX1QHmYS1+j75odXC5QhLMhrhcAzmvzQhUg2QZXRFstB62VKBXvVBatCqJLlcnVy8bqv5BxO2R/tba4PI75EcdAXeUHbUU/47bEWXU7nZ5Jf+//iYY9Sp+VoI12MTCkG4myAdzRhfsJavAjTAQqguE6uHrUIeBMTSmx2R5qiRaZVsZqERAKjkWj2EBCvIPQsbNNPs4gmKkqxAKhZzd74csJ+GPR0RMeuPRmGFVwF0V9Fw8Y+M7Ab6sM6wGN6lh6tnTPHSiP3c837I7EPF+YOfO/tzOHf0sDMZcgIzAG2gYuTAxcXFE8lGINfmp0dHp6dHRKS6DfpDBOHsVczFyKGf0wE7PqMpAYZExJ8YVAdwQGteKHAJoYj5o5fuKRY64qhfYCwQAqg8kpDDmcrFYXGGvHIjW5KTAprWCP/qQwtUef2k/7t7b3Aqs9QOLLKwwlfDreLJ/GrX8g2BjMY+8IY/crkDH9J9Axwkyr3AUW2+ziC42VLlb9OWkNXilGLNYgVXImWCSBInHIMRGV7a9oLOy84XdJYTRthLLijLpxVu8jjq7rcqYqBnbszff6tY5rLWeQNfN7VvP5PLnxlm4I+0MV5m1WsOBsdGpGsFsED3upGf04rYdF0bKtvsqt90Hr7XdAGqLK45HkvXtN7wWaR0bDsFcaMWLKu47bcSvwl7kk6uN+Fuwy717xYgVWYRBxyLIYlFhLQ7NFBKlC/yjBC1ZgE2ejqstpGwyCN9j+GAfVULUAApsAxdLT1SgFXLmcDicCMcd8Xg0EubbQNgWKOFE8T52/ZoENaoPd4ANMDHqLn6lZm+2ocmntdY5gn7/wZbddw2Ons0PnBkufsRBdZotzRBXuvNmi1AVtPucLnH43Vv33jM0en7koaP6ZE8p7lAZ9J0kHxqTfcBh0KBnOh0/53DC/gWPtDSgXZe6i/aVrF2nJ3oduWCgev31kcHaVTxohn6QyWLFEwoWqBq/9kiSBrsEW7qoVKX3gRwc5R36msCeUc+9FCuIS1T034QbgZtwJWcRyi7OxDr9dm21zl3HzidczSG3O1T8HPfXswg3jR0MhtyQV+gUPXexLtBzinSS9+dMCRCdhwr6atCfoPqrJCxaBrs5SI5B3QYwXFB4FVUz5EA5XfCg86ovISMeCACUvz5qIedMpwlJd6azbS0wfTIek+pjxsoNNiZfndmVdKzjdazeGfnU6eCtzlZBF7AYqzQ3xbZsdhYyw6cG+t81lJn0RbwP7NmTz+/eneduPH/+jN3oiOmrnC6BSt3ZllCbshqSweo1Lh3P70FYVWArEbLtqRClGqoKx0X4EoaWKTx1CZWSZF/OoaXKccIiR2GViUKEhGPwoyYK5R0g58Ryjf+mz42jelPZrr6S0/btyrDwHYeXCdcr6ezLZxSY8RTrZ9HM8jJolJCn2Mskwr8NEkDbvyjvVS3AS5j056pEl0GvUbIe5MeiBCdBcK3kPOW2srMrfAXijsT3kEpanNCvDjuW0grWu5gl4fRan2wtkf4jm8cpuT/15T0eT8T+fOOtK1QXP/yyLWZzOz74PCnRSb4JdJbORZw3OBf5puT1RPhvebirn1T0JhTAvjvInbnqRohLdEsbrNXNikt34rrVThn0OkGrdY1BSlfpy70EGxFFN8U9Q2gFI+fGFugjuFvEOFDqUpd0B2mPKT98SV9Xy9fReZsLU8PaVYpfYwAXJNeB7vWtYBXMz9rropljycEVW7aBTCLkNrRlrnuUho27Z0hsUftsVVhzcYt4XTMnUyUzf0t2/u1tyFpT18aBMpv72q/DIefKEm1XYxWsaX7m0aPQ6ygdfIQqDz58yCJB97RY0Vr4yhs9EMmP3jU2fufo6J3jY3eNnmsYSiaHGpTrsxeHhy+i8xi5ONG6NZnc2to6nkyOt6r5YBfkg2GeD0Je4Ya8wliZV6ykvC41p0DCUNoeWs4rCPZekzRWIuZC5cSxslMVhEfJK96R7PFbPHtcQA1pVmWPSrwp7Q/+UuFfFQgFgfh4RVAqhWvEE6pIk8bUiFORdrnW5GarEVfSroo+fKwcka5Nu2Kr0661ESi7XtoVKWddrbv9QthdTrtckHY9hDL5jl/Nu6I+V7C4tSLQ8LVJP8fzrr8Yk60Tk08FMHnY4oM7LtQCb8zZ0A+Xl2o5O1F2WGAEhJ5Ajz+9FkHZfqgIvIcQzbSyoktpi0/tx3VNIIbjUuFC5emKsq5FEgL/Hy1tdMsHIzrHtfZDzzSITrNNcNR4W0Ils3HtbYUg7AqFIEEU+xv/aWVJ1zakUA4e2GO8AHLIkgMK2dHrHOiExkqvpgJaoD6yFg10LoDOK5AKuaq0lEhJ/MVVFlMMJcPg5z3lcztX+VQLGEMXUDrxgUXi8ZrMDluwv2lbR9fGzR2dhbbMoUCtzWR1mqwbouP+VCI72rbxppaBk9Epq9daZQsFha5A0Fwn9ne2jCTisTq7y1xtcno7nT5ztVkcyLZujqdbkW8zXI6wS6ShnJPCXkm4VwtBiEF+iU6Ah6LSAU05J0UsSC+pjup1FyrRSQUy5KSr8AADUPUMnPcKlhrAGki9jaekUQxgUadj/Uy0IlNV3vrRHa7u2KY9TZiMNmFEHkFoxGkzmGqq3+Vz+mIde6lddLtCOdR3DqHibxw2jZbbP/hyI3PB6tukcGblh1KucurI3ThvZPTeisZCrkZ5ywXxRj2sUikuvypWkkio0V9Gbj927CzPmWGvEfEyF2QfR86fP1LkeUhvd3cvQHyPsLzMfg701JNdT0fxfEhbypTcRAuWpiUX9DrIiCFPYLhulJiITVrNvbDt0d5bbocdD1BYTxKxhMVucakvvpTTrEQcUiidnp8WlU+JeA7lcvHDrRfDmk/rQlZDxLJnhyVisIZ0n9aEffaA7sj2uoTDZdh6WBd0Ahu+KlNx3uqgLPraa1FGHVb6meoaT8xmK/70RzGr7QdUtNm4nS0X6Y+BryjZkKuCQKrn71MUzmoFbjjl/I/XK3K/aDK2Ovcrn3onVh8fYfpHfxx3BeznzlR5TI64+YMfrY25A/Z3n7QF3GHTpY9ut3ui3k98oqZWdNitX3yizu6RPJ/+lC/scFoee0Kxhy5uD23kXTmjlwpa3JmUTlKipc2GqgJY3+vtSaIldZT2MeuhKdppI62xeDRaH1O1s3YjEmTKRmTNGSg2WhTDeuBMZKS0BdFLCcdIvv1Y+0Qaba2zo32Damv77rm9ukrdfAimqt4txv7WfV00iua3TPo6ezdQSHMgh8ez0b2476BZIE8CN/bnSi7P7i+/79nE3/f41PfhnCE/fx1Op/DVeICO18GCrvPVeZ12QDTF8X24syLPQbeWrQhkf3/Hpk137N7Nr7nNm3P4a9z/hcOHv7BfuZ47f/bsefzlMQsXbpifV9fnYhC7wZDwZQqkghcE5W1P6RjXSRyxmHqMu/J2TvEonWAzZDmCZ9abzBaPZDF9yuJlV/D9Jo8Or8Sr4q46v2F/Fc7ZDJd/B74bSFMuBVOBJ9NcKB0vIPcaTcV7ePBlCSnZrlPfViivH8FeS0yXaSgLRK/P0FfAbxW/5A1aX4mlcslAt9vqd8bs9vh808B8tr/z4vePoe8SPR7br+p3RBoHEqI74jCH7PGmrtlNve/pvo/7j9foz0E27eTCmGwCm20E56sVtHoBnK9AtQKEKHTC7E6wSt0BcMP21a4uU8aHyAa5HQQ+qtXc+CnFgbeTdmAuBpaq7EBWXlWp7zjUl1CV/HeWXiAoq5dO7WkaODcRHfXFIm67K9Ue6pL6m+xBwWtxeo01D30HXTttC4ru99Ov9cx0bj660Wq2R9z15nCoO57tMVBDyGVy1v4VCirsc7sfRJvdD5fT/F11CLUX4l/CaGGN4ks4JeFYedcRDCivrKWovpxtlN4xdShqpMoyzIQzHWw3EJTEqFP8ozNupj22kCeSLF75PE0jCe9BS3qP5HZa6b1uWIZ//RL/tgl0dBXoyZLhXD5DBT1+JSRQQUPBotBj3Ak6AOnrBQyT2gOlz2AqPmfIko5oZzQG2cJaWa8n7JK7zJY/u5D0mCntOdw7fmFzYpe3pi7ksfqSYsNoakvGFfVYHdWJMA1pwi4aRpH/m8220Ut/1Htbf/5k3u0wRuusAZs3notlB2tqqgzJgFHzbw4fcvyxalPJT9A/shf4HiSby4AnhVUKBgRsMWFR/XZl5QuN1duE+lVvZtUEWHXxyI5+zS5h30Ku77bc0JGNmftO11R7IwF332FPWy40MNDc0t/fQr/Td3gT/Nt618jmL38mLPgCzrDeenMuVfzccHv7MP5yv9Kz/Adm4X5F+aaAHbjGndhjK2+FaPmTrbBqxPQfE7ri7/VBqyem+1XxNW6sN7MrYW+t6eqzVrBTUy0topSUb7R6QFB1MJ+XxCEQ9OY2emvQJrdUHtfyfYN9ZfcFhCQSPl+iLdHamPLFfbFUqrRnKMuqc5Wr1cd1aioCAlsltp929B3O5Q73zUiNG+d6euY2NEtyZ2eyobOzoWVgoAV/6Y5djRumu7qmN0z32AebOm/OZm/ubOu3/a+O+oaObH19R1HsTqa6u1PJbvW9Nwjyj+y7Jb1b+dGVrmLLzqbwjbx/rPTFWaXeG+or9F7hIztXdkGrGNi7VuPt3BBQ582ge/bdazSuGMIqvTOC1++xOr6fH1fPHzRU/cCQZ4Kw9QFdOPCw2QE7GOVwtbK9kLPymBeqC7gdMFBtB8Y8q5IMlj4clNia+kIoFKgNrL7Q+0IBC0JwKd6xAoMA/cu3k5+QkxB5/TmPhb+3BOrh35zivBLJCL5ec6p2iUuGC0tftgfHTyLZgNNbZ9P4HRZLdU1tMO1It5mH222OulodM3uqLXptXZ1dcnRmFH1G4fIxsNExsp08kDP2U0OVDwJuKSNqsJh1kKMK/PufxWpaVWUfM9XVCnq9YarGyAyG0BjuCvhGL4ENvJMY9Les86CKWchFxmG1jW8f375tK0y8ZXiwr3fjhva2aDgakxxSNGzVB1JUX9oIrPi3SlDdNawA2VKKWAkqQ+jhSRYPNsP+0NVvF3x2d4DWPWIX/HYXAFFsziq9ObXX/AW11yxh83PBR4L06cdDLqf/rM0ddFdpDp61u0Jug+YgtvGOk0rH/pNKx37e8fjj/FtXSl4gl8BsPDln6StU9c07mhJ+hppdYzqFFYNZZSNt5Hd0Pz1GaklQ/a51D454gH/XupV/11rdrg6ojofD7YE49TgGq8d/F1EONsNE/RtP9S83p8w9/weW7y8R/ptnP/5RvP9w5APfKkaKP9C2aB4GXD1aI1GfU/4WVLurGFl+Wtuy8teiyg9rZaPgIX6N3/kuT/CWi8RI3sEf9hEyxk6hv7pO//f4efCNx+h5fZy3TF8b0PfMDeh7+dq5qe3/nR5Wv3pOpOONPCdkFDz292+OBva76/P4/+OH3aTy8a+knn35xrywPW+ednYS91jX6XvxP86e+Ph/QYLCl/EblHX6duP3G29x3OOwU3wndXSc9DPh+nPeiB42+B9LK+yXg+yOG8y/Bc9c1/z8mr87e3tltGHFlqjp9e1K+FOFLrCD/jc1z6F3VvdvxDZKNkAv35gX+nPieVO6/TT/nw+uP/fYm5PdW/mBcHyN/6C/IOa3a272oWvHBx3X0yNEy9ykmRnBvr9F9rM82cii4CM3kB42Dr/R/1x+/G1ZyxYyTPEvaCpl8RTkxL8nG+kDb3iYNvjdRI6QP4HyP95aoS30nlXlG2sLM76pMsq+uKr8ulQE0+uWbWq5sE75vvB9jfU6ZffbVD6n+Zw2qf3omvLb6xVdclU58ibLF/XuirLzhuWHb60YBg1yZanKriqPvbliTBqfryzV7nKJvuFyjpc/XVtqolAeuE75729PqZ2F8i+ms2vKv6xfzCfXlK+92VIXL5fzdf/++sViLJdxy/str1jnrV+yBW3nbLLdaz/9jpWXHEwtTzpeeaPFiV/KETZEboHd2ieIDnZsSdJNPgge6v5aJ/41Av+Pfg5BmKEaPPi28pCDMCVWqCkwIwYaVWGBtNG0CmuInx5UYS3x0vMqrIP2B1XYRNqpTPLkODlB7iAnya1kEag5TUTwky2kFYpIdkPLAtx3kDPQP0cOk1Nkhhwj89A2Ac8cJ7dB/xx/qh9wTgP+cWg/BfV6PtppGP0U7C6boSzCGIhxhsySJnjqODkKrcp4J2Gc20kjYM8A3hHAPAbQ7by3eZ35h+F+FNqOAO0NJA3z3a6OLpKdMNYp+D1JzsIVaR2GuY5xKrfx54An0X/tqGIA6Lp2rgF4+gjcM9Dbwks3cH+IDEFb9zr4jeUn1pNbqW8vp/AU9CNtYsXoNxqxJFNFoqcACzV3AtpOwfOnuESauA4WoX87cI6nF2PPkJd2Ti5R+uGCTJX/ZOHEEtEPPDmSCQkkieDTGw1xg9UgGJTaoK5F59fxmnHgiunrVV/XfB0MpwrqtQNXSI4XXhfI4FKU3r9jUs7dP7kkzA8uxbH2NcPdYGa5++d2TyJKAX6e7jHUG+wGoSb5DF1+n6z50BIjg09o53VkcPD/Aq+a56gKZW5kc3RyZWFtCmVuZG9iagoxNTggMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAxMz4+CnN0cmVhbQp42qv/T2XwAAAVq1EQCmVuZHN0cmVhbQplbmRvYmoKMTU5IDAgb2JqCjw8L0xlbmd0aDEgMTg1MzkvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA5MDg4Pj4Kc3RyZWFtCnja3XsJeBvHeejM7GIXWCzugwdIEeAC4AGANwBeokCAh0hQJCXqICTxgERKsu7I8iE5kR3LiS3meEn6mjqNY8dHm+tru5Tj2i9WE39u4hyfGyd5uQ+neU0df+nz95I2dyLw/TMLgCB12HKdvH4PI2JnZv+d+e9jFkIYIWREdyEOtUxMNbdNlz8YhZlL8De//9bT3u5PEBEhXAXj+w+cPHjs1oU7z8L4kwiZ3AePnjnw7Pc/eDdC5ucRqps/tJhdwF/I/hNCsTDAxw7BhPgXwknoLsDYf+jY6dvP98ufhvF9CBkeOXpif7bipN+JUALgdeXHsref5F4yTyI0OADw3uPZY4u33zsBsIPwPNl38tTiya7Y+AmEhr8A9x9FPPHi9yAd3Fsi0zCT1q54FrXhZhjTW+zjRcgCF5wfoskDsOIzCP2ecC+vCAjxD+FmL8J/Ru/h35FL7BEOvdqnF1on6qTw5F8IrLPSyT+U+yp5buVXMDau/EobF+DQ8ZVO8mOY/21+/u6V1jXjwno/R/9nzXrauLieisJeFe2YHsx4vemnkHlrWhWmdk+rHR61PjN/wLu0Y1olgez/0CM92r9f2efx+VSUUVFKGbgIPEjNJyMqDqve+QMRlYS9C171mUmVD+6+WI+l1OD+QVUYnPapXCCzbc+0T/F5lqa96uQkTCUyHq/aSXudmYx3WYPOLqj1MJUfedUWer+FQj4zOe0FbJayXlWanJ6HGS+9J9FejPZi8575TCbjUXEok1FUNDm9mMlEVC7shXX4QBYw06Ump1WdklQFJQl0ZFQ8H1H5sAJ4eReWdfuSXnqHYuzRMKDfKjc/uF/lGn1wM+Vd8i7BBsstugAQuXV6ftKT3ZaZVjK+jFdNTE3DPQ8lLb9/RNWFVTEVuoiIxikBhkpSAY4ryaxK9h1Q8X7AQtU1RlQx7KWoGlP7n+LRPi9dQU3MZyjI/ABDVR++KBpRajDZ6Cvy3hBeKwtJWwWHAIUU0D3vHVxSslQujF/IQ3mqej2AZAFLkI6SHdC2MF7jcdUPTyHPKmmlD8lhRtBFo8SBsD2KL9Poi6im8DIhg+pCdiCimsMA6PWqcmqUPg4dJZlRTXS0DUYmGEVUCyxjZSzxAgf2w76qOTXvXZr3qmZgWkS1htPbp5f5hYGMXzUtKrdHVFs4vXU6PaVNenww72Dz9vAysqR2TC9bLCkVZ5OqJUR1FjQ5uSzTLxN8qdgNkuACk9PLlHlAbXIJ5Eu3bfQp8Fih79Hu00fAFOhMBigZBvyHYXatqK4hwGWEHApwK6WivosYYyYrRxgtIzK4fVq1KEnvoGoE5ZMUULikdx62f8Jmw8iMksml+WW7EFIvhDy1wCYn0OYIRVRXeBnTqxv4TK9l4WWOXsvDyzy9VoSXdfRaGV4W6NUTXhbptSq8rKfX6vCygV4bwkqB76owDxxWvE0qnqEGElEbS266izffpN0MldwMFm+e0m5uCCPVFHod9NUAfRsALy/QR68+oI9ea4E+elWAPnr1A330GgD66DUI9NFrHdBHr/VAH72Gw95epqaRMGxrm/emQLbzKSZKML0w1dWmsBoJqRGwwmYwgGHvNaSoZDsV6hGvC+Gh1LcURYvdanPjsg67BqfBkVECW0s5c+XttrA3yvBtBzg8eOUmYJ1X3ZzOI/cnWTQZ6FM6l9uwixLXAQwAjK+OMFhFtjOiRsNNZb0RNfZqoKDB+wE8DjJB7oC3yTtMLR94ObK0NKwMg6uYhhABnhXcQQxjlxNY2gkuyq1aAYwHrxlgYKohFVpcalK83t4lWK9rLYi3SVtL5WEGIL3qPHUaia3TjxMv5/U8ToJcZSZJHakefLLCoJUhMOHUenucp85MixskNb8A2pfKLsBtksp6oD9PHdn6Z7KAFrh3ZQiEqcAOQ0AfXNgusN5VNlE0l8mDlwAh6ECzdFesCitSigIMCfie1Fzl6l4g++4CH7wwqwvm+aD0Aot6irdUPbs/pAzTTan0eovso8TkOYy2Tzd5eyHkUuzzk16KV0EEQgBGI6XRXRPe1dQ6LymF6vbGEkxSBVHN0xRgPckF8faBo2iiXBxSranpSQ+ETG9vpmm5CTvBQDetubvNM7nmbuKqz17vif6w2hm63obJsNoVWgLcqH4BUdcEBYE2qU3wRIqRTHWzIBOqlgoYSxPYmbbqAPgdCCEFwBtQ4uE3Sm8pFdRF9SrghUo0xJfJ4zgIvrUzVODDEIy6Qj4lz4k8JUWih4Fol2bgkF6ALTua1A6w583XmB+B5bDToUahPxpW43BJU74NAoO9QxBLC5waC1MVVtPQ3RK+CM4KOuPQwbQzEb6I2cwkdNjMVgozCJ1tFIZ2pigM7WynMLSzI/w4eL1+6O2EHma9XeHHsTY3DT1tLkPhMO3tpnCst4fCsd5eCsd6M3TPFHRm6Z60M0f3pJ15uiftZCnMEHT2URja2U9haGeBwtDOIsMrCb0DDC/aO8jwor1DDC/au4nhRXuHGV60d4ThRXtHGV60dwx43F0U4HE2Uvuge0LrboLuScp0NkrA6E0QRvMwp7QuhbmZweA8zGl4uKe46i1sxJ64VevSJ27TuhT8dlgnD3BG61KAs1qXAtwBsL3F9d7MRgz8LVqXgp/TuhT8TngyD3CX1qUAb9W6FOBugN1YXO88GzHwe7QuBX+b1qXgb4cn8wD3al0KcJ/WpQAXwo8beFJIVpMhVb+ocv7J2wtxOAIy41A9VGJeqMeMyI18SHpyQ5lVFhDXErK3+9pcNqfiq43aYkIZdseitg7FR2A6VoeDgstWr+CLipIbVzoIwR8mvC63r0KHP8QRkssSnlxSLi8pCrlVx5PLH+MwT3bqLt/FE7IL+pc/TmvLLYDBBaJHJuRIWEEfytIw4UJjAR8R3aGYoNQGYc9Ye5vbZbtgM5ls7A++8fO0n+tAeOUOMrbyZfJhJKPgsrAwkPDAwhjtomXpHIEenoCujIwBTnSFlgU0QILRKF3T5XIKygl3mbPe5SRjDrtkdwTgD9iBqldWyGHyGVSBqlBDIliFec4CK5FRxAPWPD6AOM6ZJpgh66yrdSg6sSLkpwvWBuvqfCK7RjvimOJehgM+jhy2y5KFT+eeHtU7zGZQdL3eDRNYzI1j9zu9vMlqNDz5pNMscwJH3u40Gi6/5Qd4J2IymgWk9oKMnKgaBVE00eYEjPAo3OF1HL+IgP0zQLUzLWCdDs1oTNywYUNwQ6DOB3iIgB1yU/R8eY762uhQjAUVxdUei0VJLNoBfVs7sY6d2Z37D8pebNg+19Hi7+/+4Q9jg81TO1IvvYwXd2/el7WZyF0m297J6HbHlzf9Dg9syrUMDAwlcz+jMm2BSv4o+RxqQC0J0DDMYcSdQxzBHHkz4KibQzpdVRpQ5ucQz1fzY8G62qACuFSGkMtJOVcXVGoFweV0u9vb4sDAMjedpywNguAYR8lR0WDW6yfntp5Pj52fnJvQG8wG0Vx3Kjb38Nzsh7OdR0LkTqvBaNRFxy7sylxId+hkvdGqr1T2PHbT4l/NeKsRlTPl60PAVyuqROFEA+MjjykjdZjjCoy02RCyVdoqyt0AaI4JoEfITdlXwk475R9jIP7e+f7+8/MrmLIQrRy/te3I1q9/nVyae2h+/4MzGusu3/nw3VvPT1z+FPCL4mAAHLyoORG+vkTZGUuN3+fXJOq/ikQVn6vQsfnwb6iRvJfJ8gQzmIvYx64/xOM9dtlk1dABq7L+nn5RCaI8TgLg5KHaD2PCYbIId/gZHeZ5ZxrU38VRdDyoQgF8BLG8oF+r2zuL5uvDv6SbPo69bPN/tpnMFKWj5JLNJNt+b6U7f43eosgUdOgO8hxqQX2JnjrM60DXCbUL4ZyIBaTjBd0i4IDngEWgSzyP5gCZasahFtSkBEFV6vRUo9yuK3SHobdGyWLxKEUVMG0nh22WyPGuA4/Nzj52ILq/zmwzSvr09h33jo3duyO0q/ZBk91u+gwGE/i5TaqpBSAArSw3WE12XcP4hR07LoyXu56jbqrAx1PAxxrUlAjJHAF0Cy5kUdCREicCiNegDY6A4gjkjdUmaPzzFTp5P+ijHZK1YbvJZM8dhovZZjeb7Pj9DhMw1Hz5bhibcGPumya7zUzO0VHuJVxpsq/K9izgVIX8CV+5RBDBozy4bOJM4yIuVcgTqHPpxDKGiebWcIlE28owQ+OIxW4STXxuymaUrTbZqsd/Z5XJJat8+S6LTeBJ8vILRqvVSM6brcbLT5MO2crsjsr3yyBfCxBdk6ii2p4XJVhdXpTBYLCWB73yr5Ge29VESgQHjuvLO+/PZu/fqX0nBu+YmLhjUPv+9WMzM48dPPTY3r2PHdp1YQwcgfaNirbfkPep4KkEzAN3eET1ioCaU37QtA+PuVzAlWpXlacCYO1KUITQVLB/pYQn7faCD8Ufnm5tnY6/oEWsV7o3b+5+4QVyqX1PV9dsLPergqbn/nr7pr7x3I9W8QGLgHjchmKJ9lpwlZjFHPAAIDYdXgQ952ZKI09DQ0NbQ1trc1QJgtaU0wDEdL2Osiu4BjlfG8NYdIP+u8u4PqIBkKM8b9ZLYlXteOxFq8nsBLM0d+1uT8XCnRhbbF9Rev1b+l4OW3R6Uc9bN08MdWmxgeLfujOWyNptW7v72iQc5uoHwl1pSg1GfpAvAflGKSWI4xHPoXOMvfjNQAWZA4lXpVk0oP6tWkd1Loo6lGCkNkj13x2sY/YIvh+kTF1rXRNZb8DUgkEPyjYQJov/eaJDdsiyNH7L5rnmsZ7ErljXwdTGI16LU5ZEz+7Wkb3T24Z3d/XclJJa2iWz7JR2DsRDXX6Ho2lLT3Rbc0PQJhsdore+v7O7r9IV3ppsn2rRbKYWZNMNsoEMKbGBMp+DMEEFoWkIwLiRU1H8eYNxlihG3rH4SANw7QVqrC8wf/x9sBKTyXL5g4ybi1YTMw1qnyu/JkeYz4C9wDBpEAB2lXg4cBRgHKvGqdlHwT8UDIPZ527b0O2bR24fsllke2wmFp+JW6mTMOX2jZwdGjo7gh9kHnlf52w8PttJRwwHBei9jfwDKke1iRonYX4LXARDpeAiylFZXR3PbAHUDguaj8hLzeEAUZFFO5f7JW81GCx87lec3egy/PwVnUVP/sFmFPWX7zYYJQN5iyCZrO7Lz5Ckwcj23gDc/Sj5NPKjtkQzzRp8lRIH+QNkO+CrQI8gnVzrrPxIcdX5g/kgJHLMBDiOIcRpCLkpRmUxdmnn3m8nP+AshjLxb/7G4DJYYOCSJSv32Y8aHJCRfeRZvZt82mo2Xb7LIDnwJ3I7HIDnXYJgtkmGy5/FjzoxNhpyM6TXwXRj5Q+kF3JFhcpL8Vba9DrqUjlcgqS/0e+nviyQV10NOcgPHdwqw6j0nCJHoqJDthi+/S2DRbaIP/pfdCR965tGiJTijyKS3gzKE8h9H5CRJNyG2/SSbJdz38N+k8WoN+b+ifqSCNifTIzgxsPo0N+Dk9fxeDStlk9OJ6oFUNyydMEKa9IiTTDm8oh6Er7196nAGRBz0dV4LJNwVkP6VB2uDgUUGimCgYC+NFJEo2sDLqWQxLQEqeC68e9ZLl+x0JM6srHvSH/vQoXN9MBUc/NUR8dUc9NUFK9A2Oqj2pmK9A2dHRs7M9Dd3AcRrzme7e2ej8fmenuzcaB1AmiNkH/J01pRoLWW0goEuCkp3BylqpTWakbr+vvUnPNAmrVdQWsgENRo1fw/aJjLuSY8A8n29bTec3TjxiPJruyGQgnj2dfdzGiNbm9qnooS48CZsfQdQ13NSZpekI8xo/xOa29O6cz29M7FovOMWGYfIFv8Isg2wnzrVfJr6lFrShNseCyCwgHwGfncwp0vVIJ1wTVZEDRNC0vkh/dsbbUYJZPeJFtaq+J7OtoyXf6QS7TpZVE2t2xvHzm1KXE6TYwuv8to1+tNgmjonO/unY/LRt4sihbZVlc1eHZs5MxmLc5puvnja+qm+1V00/2G6qbtOrq5vzd5pA90s2ehskQ34Zv82Ga6PE2FNNSUANrSZwd7mnEA8vrRWLa3Zz4en+8BBhTpxSsgLy9URJ2JKMxAPo3PsXewOrRIPScTFNM+bg7iezU35vP5Gnz1blpR+FgeCwl1QUian1ibFZVBCu6LQmoEZiPn3t66p69lrMwoSVbJm41tuTXZf3Rj701JnHtxvxnv0LWl67HN1jsXr68xWCWjVNeWvG182x39nUdHPzmZ1kdSCuAIbMTbyT8D1gfS6gaQTgAJIhIFdE6PRZGVce40B8USgliIUBnVOBcBKSkFOJiG+0DvYskTGlQmQaNdA6r3K36Im4pB9ITsgsulad8V0bNdc+KFxP1HykmjzWY8SaU0Ilut8sjIxqoWq2QwuU3kE42Bg1ZZtuayLM4+ZDOaLAc3DdocslUnMHl0kmqQRxj1opHEUH0lEXQ2QJOMilDbABk6HZNCTVoPomGKVk1Fw1xCBRqLQFEb6Y30RNthiVAwEAkatMBTiMQ0c2Flq5a7vAZnSGRb/5tGlC1xXjTwgmBz9cUyixVHewZPJBInBjbdBK7xkV2trbviMfodwys2c25i/ES3vcoiGiSBEw3lizv7Yhs1VdwUTlA3Gc1u3DgfLWgiRhPw9VOwOwVFEo1ezEoRZk0Y83M6RvpqLaKg2gCYjlCkTHNxGsq2Kzweft80lUVfsjHdVPRx822Ee1Mm969MDJ7+rfWpOm1APsr82/dCcbSygvphu/9OHoIcC3bHIkjoOZg1LGP81MqK2h6iuO+Ar1cAdx+tWbxlepFH9PiDeW8arfIeApyzwmt5MFWUOnGdbw7kbUcsw6+4DCbDD9IFZLHPIBvtxi9/JwQD408Tf1GCZ+dvJYdRNv7dy5r/BVzQewGXwpmV+zpnVu8tPbPSlrs8rcmCS0Iu04nO/H20maVXWsRyU4PSzelFgdPpytKQ6WiuL622wt1KRCcpiAAgRBBKIBKVa+YRdZyFmxnN3DpRHDhE5UrN7TpyvZqYXZr60rTulR2UpE0FYfcmGkYiRanvbe/ebned7CLciT152Zcnp+oH63MvX6EI+Bn63d0Q64yFkwUd/QXYpoImn9BUVCO8jEm5qKk1BU31wJ3VSVY85u9kEqYbU2NKH/7QLrtssvUPhLa0FAlahPB8bHfuuwxhRcP+B6vYQwWxGtfqAPd1NW3N66lp65Knh4dPJ7Xv3rZMLDbd3j4di2Xanjg7OHg2nabJe7qXBhoabmLzvRoOE+DbIqBXNLb2JDrzyRCLlwIt8ctKkhvKzgo89mrpzZVcukZ6052tLvCscl9PMb1p2h4lXOq20fRtA/Gm3G+YXb2TZjkDzbFcU3S2p3sm2jHT0zMbzcv/FPBwAzr3hIdGjnxiUFa08qKstWCjqQeUDBjkTs6tV5NCSFoFWKMtzLnTaKRpywZUHQjWOlcPs2o1Il3rWRDH27xWo67aFBhpLtBcNrOJGK1WSMu7djf9elU/prvSmPmNRsgDPga0tbNz0avXxDXpwgkplMQhpS5U66fnorF8QMnXwnVrzrLE1VrYna+FYaLRJEiy1LOvZTjZMzXbNNEW2lVjkESjpC9PBptTZDDVMRA6tOXs5lmDSRSk8UiosdHiSvU39Pt9ftEkGwS9pyocrm+0mbzdLf1b9jAa6KFWO1mCwJ1NqxHGeR2vOw8+h+P4GYEFESqlAmM9kDRQAMhSwWFD5lAKiFbhiukA5AJ+f62D+icHVLJAbyHsB6/MBgrZwuNVZYJdZzB53Z7GuhHZZpNHqEQWjDarjD+XWw56dBbJ7JDaQG40M2BHoSfsRtnCfM7Kb/G/4T8gD+rTtMnOiu6y0qLbo00SfL5kMpOQ2QloZSAQWHNSVlKKU4HREf6u7Xh2/hhFa2xwaAsoxx8gsry076ab9uFKFmVe2pxOb6Z97fxkBeKdhCppTenGxfK7ZrX8rkSV9avlN615Bah2O0rK3VgZ/p6d/yxv0UtW/nOc1QJl+Mc/wVskYjAbDfpch96IoYR8nuh52QYF7RH85wajpquwP3ke9g8WanClWr6yBq8pqcGDKBCoC5YXbIciVEfL7wJiJXjlq13ytI37S53VYDDz52+hSNq4Bzm7yWDh3nYbBG79W84LbiJZzVjOdQBekgF35J4HlI0G/LwgmijGb8IhhyP3Lfwup1aH42cJDz7fm6iurbBCjpAvw8tKyvC1+UG+Co8XDpvK4qsZwrN22Wz8wAcMFqNdfOwjAq3JH3i/ZDFZxEceC0iyw/zc52WLbNR/7Vu0Ajd98YtQfxv13/iGplOdkGvpURtKJDZWYB0vg+4A94CTgNA5USClmWZ1UdUqGC/bUCuoVG19MH+CnU8stbyy6AeiwpW6lle279j6jg82jpS7CGfWC0KieypbMRvftZuF7VRDGqI10YPODU+c7LZbTFailyROObRbaWw/lMHtTB+/uXm0IRXEjSYbZGO0Fvgl1AK1OMaiKsZZLVcjdSxXI8VcjaA4xMEqdrbryb9TYaRVsVcqeI6+XoFCzQoGb/VYK91OADQH6TsVd0lApBSzMKMd8bV/92g8dmxi4lg8fmxi58zMzh0zMzuk2UcPHnpkdubRQwcfne17+MLSww8vXXiY6S/9EevPyKeRG5UnXFaJ4M0wCcabzxJpomZftda8GsTi8VjZjywOs8n+FlE0gRP6mGQGLZUvs1ckZGSUd8qimT8gELrHOBArAZ31qCPRWgnypQkp5jHhzxUKOUozz5e8valHdXVKYwe1ktWXN6B/BVKLmBTqcFH04d+CQ8tdMNv1P+mMbRtp3eIwWoxOvVB5qG/xVO/gU7i92yabIPIYpZXeuaaB8eYWu1USrPpY7/FM/OaxF/JnBl8jlyD2nNLyzLqCKkJlxmMOi9xB0EZhBgmCc63ji0CcwhwPBSumD7wZHoDgdS14zZG3o7aOgI++hNESzWIyUXKmW8gh8hboyx+TatbXjmPZnv6TA6HJKrNdlk2Noy3bWlonwnJQJ1ukz+R+Sp08nrRapCcF/HTHwsDA4Z6qKsksu4yR8GRbfFQRQdelr9NTVXok/DzoJT3DJey9B3sbU8PeoOrAEiExgCB8EJWe526oZocHEI7EYjag5POAqCY0rNldu6/dhn8O6KTs9DXWd2W7iJNgXLZU7r/9O7bSePMpqj6fAjz0+K9kMK1TOAEyia/k8A8BnxgaTQy3Y070A0b0DfM12C0Iuhng+Sq7NZWKoag/rgSUuit4XWB2gdur+hWnp7OF93QiTXw3HuzpPz3aOFUjiDbZaKzcWNOVad23rSbqKxctDhwiwO4IZXru5drK4QD+atfBxNCJvqpK3iJKDoPTDWne2IzdIjtMOg5bJQt9sfeCya75A/wb8lXgZwjtfaKCsV1LHip1kOJxPAHi6LsfmhWs6l0lzdjOFyFKb2YSDpa1hqob/bVUTvVr3snkE+vVgxKRJa1rc9aFuWjXQl/6UPvmpTm9zmQvn3xX5YYdrZ27A0MtHeON9WPt+OnE4Z6eg31Dp5I7/vFRP7FaXHrfR2aVhtwtMyOR8ZbmiZbwaESrCXtXLuOX2PuBhkQQPAExar8WgN6MdhBclJcbOQPrj82pNhUMAH/LwuVe4a0G2QGKkPsM0/ST9JWaznD5ToPRKkMStYe9LqC8/TXw9vMs348lQBEpc+mbLPqG8SDLcOmbrKq0xri1uX5DfQnXCpoBfCupTa5I9WcOtQ+/Y07Pmxzl295RUb2jtWc21rXY1zreABxr2tzgH2olnweObf/0g35iN7n0ygf3+Oo23UQZmbutaaIZWNY41hLZ0szqFXpEdg/kE7RmglhBYwMTMku+uDkaMVycFitqrNXlLgA0RWmssGu/4WBZIDVNsm48YrfbRNvaL/yw0+6yu+Cf3Zmbc9rddif7YvnOBfQA6oekqucJe77ulEBDbey3JCcKtRy4Bg91cBjdUzKVeSIQquUgAXTnhUl1TzM4MZ/2uB6oDruMFsmlM1tkyWqU/a5KX0VXwAj5uMCJHqvRbJDMdo+vWtOnDvh+K9oH5FYk3IVfsuTfNFEW0J+ytK0jeahIKKOQ0UrX0q+cw7/jaiB3r05Ush/EjNLp83TF07CeDVnrOBZ+mVPLWw1VzHIrjx8XLUZIH3NbRLN0tw10j5sxGS2ywfCHR2SJ4RpdSeA95FnIXRzM+VflC8sN9TTM8pofWjVG+sKOOR7crT97/m1nRBGWO3Tr6cOyWX6G7/v5u5f+bTNvk8yG3u+eueP7XYLVmH8vVrnSj/vJP8I+Gk+q0pSCCsaTClS+oUhDTKuRCt6PRlFBabCYDt16y02Q0unFs/e8/XZR/5m1m/Cbfvbupf89zLO9utFP8BZci0xoQ/73RPTUB88w9tEfLZmQsYNuGAsWZEBFMGq1mr5Nnf23f0J/TWHPv9MjqH5llvsQ5AoToN3/oZ2mWr1YIgGPieOlJBZEbtTDprjSqYwG2oJEJCBROGeE9AIjSGwPwVgv6PdDPDDMydhgAKZLEplj2a5Ey2IvPNfxmp5jJTN9GGnPJuKQ5EuEk8695m21J6GKBrns3b1jCugcr/MHg/V+kINJrC5xzTTWrz0QparBCgaXszQvKJ6GXO0XQPZoRwGGgZC/fXBr37H+UBRztYuxxlSw/3iybcgs8R4PbsYee9PWltF7d1948c7B9x5v3xINC4IsEPumA6N3fXT83b94fyjRHptqijc07e3D5Lnt757e9tBCU9Cgq+hJhNNNift2xyIJT4XI576uM1RU7LwwPH4mdfyFd2x/326L282ZBc5sqPEd+kj2/n+9I3ePuWNT+kR7rC+x2JH//1P5/xU1Z+n9JXCbHSN+6ek/ew+9fn34wmdz967U6wL8MRjS00/tQ98xs/9npZuC+1/RBVb/J5b2IUNkM+ST36S/oVu5g83ci6rRn/BD3oFmybtQyzXvv0B/0/Aqa3S+Oszrxi8G+D15Hfy+8sfb+z+F97dvDC+SuzaN/0/w376KP3nw+rSQNuS/4fX30lz+Gve++MeVKfkAUrjn6G8U1s3PXhun17TubhT5k8poN5qAMiLyevAh4T8urjiLqsnR6+zfSc+J132+yd4jvbE8KmNRX/u8VNK/xod7j4YXSV4Fv+vtM/Wnlf1r0Y2iLN56fVrwN1DjDcl2ip4hX2fvrhvj3Q3TZkN+8rMrfQ7+Maq9ql69nj3iV8ZhkHEcEkcd3BsnehQBG6olARQnFfAnIO31TQOrh/7/+jwNND17FR//BKtxruSdhPSvqkO3oij8VV4x/3bUzT3/X4j2evbdh+bRErSvvb6G6/G5Ne2Z9Q2S9Rtpo+Rv17TfvHGN675Ge/Mb1D5LG9+4rr3vmu0LpU0n3WDbrPtwsf30+k2Yf53t22LnmqaWNr18g+12/S9KmyFRbNtec7uftU+tb9IQtMeu0V56Y5pxiLVPrm2y+xrtrnXtSzfWTJJpodg+bra/hlZfbIfND5j/3XLacsnaYn3E+qL1RVvfn6zdbftSsf1stdm9V7Tt9qViu/hfpzlUWs1C/XgYKt73IfqrrEbUg94B3vJ9JjeMaa2rRwegcsa8ATy7nVXRtI+RHUZanyAz9uf7HOrEbfk+j2rx4XxfhyrxO/N9Aeb/Ot83ow78BZRCJ9BJdAadQjehg+gQOo28qA2qqVZoXrQdZhbhuhXdAvf3oyPoZpRFx9ECzE3CMycA/0WYp0/1A8xpgD8B8zfDuJ6tdhpWvxl1o2ZoB2ENCnEL2oea4KkT6BjMauudgnVugyzwJIwPoqMAeRx6t7G7zVfZfwiux2DuKODegMKw32351b1oG6x1M/ydQrfCN8V1CPY6zrAcZ88BTd6qK1f1VgNeV+5F1zsIs0dhfAq1A0wLaz3AgwNoECB6rvJUZN1zV+PhWoidDOebAYpi6y3Z6dVXL/Ba4/TNAEslehLmboZVbmacamKyOQj3J4Aj9NQw/RT6wrbpZYzfnVGx9p/DTy4jMfnJ4fYaDjXS7pPd+qDeruf02mhAaBGqBDaSkpfMzxie4Z8BhTLA2JS8hBKssTGHBpb9+L6t02rivullbmFgOUhHn9LfBeqXuG//9mkKkoHPk736er1Tz8mNT+GVt6n8u5YJGnhctyCggYH/C6DPfJ8KZW5kc3RyZWFtCmVuZG9iagoxMCAwIG9iago8PC9UeXBlL09ialN0bS9OIDEzNy9GaXJzdCAxMTUzL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMzc2Nj4+CnN0cmVhbQp42t1b23LbRhJ936/AW8SkBM79knKxVrZWiWp9i+3EyTJ4oERI5oYiVSSVtf9+T88A5IAEKNrLqvVuysoAmJnu06d7ei4EfMYyLjOnM45/EjcmE0pl3GdSu0ywTFkUPNMehcgsKgTaS4Vmmdc6E+jHLEqTce5ZJizkcJ4Jn3ElRYZ/XDMNcSiNy6SDDi0zxTNuoY2UWeehJ+NOi0wDg4dQNOHeuUwDEDMAQDCgVgOAMDbDIyG9ygwhoXsLKBBiAcGgv8Vzy2RG0KxDif4Owh1Bg16Heu9EBhWSKZcBguTSZp4gA68HZDTMYLeUFuAYKpQBKggFN2S2yaQxdIG+Foo4RxsHZRwKpEdvzi0sBVWcu0wJ1DuYLGAc+ikBMAb3EpJAjZIS96BCwmgjUKLeQYACHstRwkEWzxXIsKBQQZhFf81VBohKK3gI/TVIcHAdOQ0mKgPnAJUyGj7Dc4OHAKcsZ5nHcwunwCBlAQaUKov/ech18DiciwvyCgNCBxo5einPyN+Q4SUZByEeiDmAKA8VHOGkGcUUY7hQRBt8yGAFZ3Ai8wgPWKU54sVblAglPNMcOEGyFpzIwwMhoYgCUKAFR+xpCeuIUngbQihUNCRwYNWWcEKi9sqEcDZMeopH0Ek+RDAajSDjElosYQB6y8hMxKcVjgR6xAxFK4LBWgpjIHCMURsPOoGFB75IssCFYwQMzDHiBHHtOWmHL7ygqFZEMiKMYzR5hTCRCC6iBi01oVIw3dB4AOsWjbiiC6CDAd4hwIHWe6gCEI+LLMhnTFOQEbHAr8hTnIKLOBfEA+lmkjzi6AIBoQP7iqgj9uFQroIfLHFHF44eUXNjCBi5zQI/CXc00snn8AGn0Qmi0ZL6cYPRSC5g4IwTv0IQ5+QmGg1ku4HbkQCIMkZDn9wDlE+e9H99dfXP8nqFq8s7YERGejMY9C/mM3p0QWLik9eL+fXbcjXsvz6/6L8rP67QfnRbPovF01hcFoPBX9Dvsxq/+3Rf9s9ms/mq//bhakV3zyezP/pP54txuRgyAGBF/8f+Zf/ZkMebM3R72/9h/m7ePz+5/jC6X5WLnPcA8w1sGRKh0uXckbN4TrGpWW6kPrJG0dDITS4QLtz5HI7QwuWW2yNpXELJZD7LRWKlM7mnaGIql8iByOu5jDCsEUfXK7b1Ki9ySaGsbY4hQjAcO769ckevY7mk+ZC5XGIAEQ5MXUd2rUxdi4yfK0fDjyBQ6mY5ksqRbZW7vlXK5JrmdulzJnwAgtx0dMW7zpUqR24RAk6luU1Z6FdH5lg1OOYiNyGx6VxDNabpHInwyKaqFo4ZUgNNYQrccgICR2h+dMU7HGOtkluaOUBumN4Zz7mvLd7KwP0LSWn7C3Lxf5jKd7u3zxj/RUxfCzf/dzi+XNDnDBtGC5t62Pz85pL+Tu5Gk+lq/v2Hcjqd/3W+ml/N83G5HkFYYyFZ0CJX5pJWvhZzINbMWNjljptjgfiwWt0vv+/3d/R7l2N9janI54arqB6rQg1YzNhjk/l8cjdZLYcn5/Pr07er0WLVq1Pot0hnRf/l6K5sVIMRqEkbYVGPJ1vyNgunZEWzFrepNToVhzbG7JEme0mC35Eme9hqpdJUD3uuXWn3sJ+AhVJu5FTPLQ9Cwp3oWbG5kz3bZmvC3Vrk3yfj5RArNrSmDSwVlsVCdUFSVX+9BUn1rNmA0D1ruySYSoLdkmB61m8k2J5jXRJcJcFvSXA9lxDhe052SZj06onp29TlVZ3TGykT3EbDkg7O7qGnIThQbIPHae8fiki4cy0y0mVuY+25hpi28CwFFtp5vleq7DVWWy1SZc/LhlRq59UeqbR6aqwvdqRSC98gMbTzdo9UFaQ+XCUy2migZj6GzVZj3qPNf0uF6NFhwGPc72oOrvQhwOh4JhTRsXQ40yKvKUJGoeuHyEossWe7MZ1T1OCbfejgol1b0m5Xm2oqa7SlU5YWZapHy7JHdekdXaZTl+7R+U2LLtOj85xHddkdXb5Tl+3RyVCLLtejk6KWCt+jk6MvcKWv44NO5WJI+FhyUZXplBGzQowhVzVksmq4HhVDGZjq//rbP+j8zWKfiVQ0e5hOC9T5TZ3I6NymqlC6o0LzrgrbUSG7nh9SsQPYHGbMdp0Se+r0njrXXZdSsVOn9tTZw7DQeRY2Va6jjiH78fY6JQ0WdHUdV4fZQPpkrnhHnZQ5ElZrnbJYsbmOOtqJivY6iY247MAisShF+LfWCaVyRHoL182QbFQY4bD77gDpfW47BBptOhwr6GQ3x9KntU55lVvfPjy2iLbbZHLX5rzUOIz/83K5WoZD+bAaDmv1yWpaPrkpb24YU9iSG82YlSjxh77MeJSM0XlouDZoZ8rBnpPA16NFOVuFc1/C8RKL7HBM3a7SVGowaZpxpd5GNeH51WDvgdxamUiVqXZlkB0VkX1X1bWtbR7sPYHbUvR6Uf4ZzuUTrbpDKzHnKibJJNyLcWSVENAzYteiXrCKfWLZVM/tpp3Rg73nde0ou+iQUSkptJXryQcBhKhoIcU6Aa83fjJlBVAO9hzTXkwWy9Waquej5Zqq/rP5A8Ceyu2QqWDzlFzTbUPAqSJOywZ7D/nWmkwqvGs83EQjSYGu478yXlXE2Mq7chT/lKye16TeJIENAlVVBjKrIFfjzbgL3k/iUpWbQaGuKwxl28DYXlyl1vrEWsm/Xmt1HWImCUEZdVKqCG0J13XVTu1nQbWwEKNLptlJiuNRomsarjajZK9ZZUVNLd9UZUVNM/GivadEvd9s3W12OqjisulIkVDnVdn0bphT+CbRhHZmk3BCRMjKozcVLXq/eabbvHQakOorHtaNoVz1d9WkkObaRzxtu6lI5yapv+IxbzdtA5bPzHSum4KuAJDJAkM3Y/jzLW5B1zgO2MyBVc6Jc6BszIFmY4FL/Wb2rGRuNogCv7w5lZN166SUTOnKbHJoYxSOK8uqqbTOsUJu/vBv/UdrGCWTUOUbeY/FiK4TYBeDjT1u4t8uQjpdWq9XkokjJeVxEve7N13iSJu616bu5dvurZY4jXl536qcJ0uvapyszaizrqtTRtN/dYZNx5hWG1ND+qkpKrdWxWJrYkv6pHFR7xzWOus46ExrMfeQTBp1bZPm7op850gqDYz/Kfb2B5VMg8qnQeUPCKrHhkhAWecAW41T0b7YoK1Auniprap9ZOSePYlsbgAahriODYBJR4ftSH56exIZ7HmXoFafDk7RUC869h/pWkKxx0m1arO9tGqw94fwWqNKl6GqYxmqE+aD4V378K0fvbeURLNU1/KfkNdTtm6xoPH2QMVqFFaxWp2YPcJqEp21axpCWCJExXZvyuX8YXFdLrMYQ+H3xdej23Jjoap6zVa4Xw7T0+NN73gqe0B3vj5XH8Zz2YxXx6vx0DRalEXgWQyULO5ws7jbzuIWN4vmZjH6iiYccag1MVyL+JPqMrw5t3Fh3XtZcbYZTCqaGw5960PeWKhWeqrFcwse08QjeXt/fWj/Dv3u0P7pDziHEhBdFlfFmTStCKpwbkFgmwgUa++vDu0v2/vbQ/ubL2Agxm4cpZnSrQg060LgthD49v7ywP5atPc3h/Zf4x/q+GuY9i1jzPAD5Rm2Ncb8njGmWglWFY44yOLRbqb3xiqX1c83MXLqUK8dXsMs+i/K8WT0dP4xvDxhOL3wXL9592xRjlbzxcnz0bvy1+xfk9WH7AP0LBblTe+LN3vp+d5BpxLbG7aH1Yf5op6/RHLE4TZzGa0uVHWIR3/h3lagaN3lwgsb44frcnHycfzn5H58c/cx+/1EMCHoaPL3Xi+aj0nvfLQqT86/R5WBcMG8Yop9x+Q3jH3Ti0y9ui9nZ2GGrH5iupisiuCPF/Nx2f95Wb56WE0nM7iHHj4fXZXTJfq9fLhbDlmYC88HAxEuFoOBqp/AEfGnwPDuNgmu5WwmP3L6OlxCHDwbrUbT+S1FsBoa6QsphvRujRG2UGxouS6UH2orCiuG2ojMeFM4qvCF00NhdcEZarRAaahFwbkZOlRz7oZWol6iuca9MQhwiRLPSYWzBbd2qD1Kz4ZGGJR2aJkuhOBDY13mlcS1QxtTCEIAPMJBj2OF5GyouM2MlLhGG2eAXg6FRKkUsMAaZYERbbUZeiFQRlnSQh9XMNEjDaLkFiNHFErgnvlCSeACPmXE0BqHkuptFp5Bv9ESvHCSgTSukHFMpukbDeYw2DzGHX09gZK+olCu0Bq4rMyILw0MxuNa+QJ2ICWaogj0Kxvp51mQH1km+oEg0G9Avw70Cxb5FS7ya0zgl2zjxoM7FrklfxC3TEVuuYzcGnrvHZwKi7qaWxW51SZwK+lLCcEit0AQuEWbwC38GriVFbe84ta6wK0GTOJWOh25hS+IWykrbunecCRgeuNfVPyCR+KaMBgb+NX0KQi9X2zonWqWARv49PQhAn2vUGAMA68M/HL4h3uFa49rXmijIV8U2ipM1vCTVRXfrMDgH3oEdbFOiPS+1vpFsWeX53RPFaL/dLQsQ+379y9/OPvpu58eJtd/LEez8enT+XQcOp6Xy+vF5B4JMLyCH3L65fnbT8tVeXc5u5mH2eB2slwtPp2cjedXZa//it5Cm8xuTy7HyOGT1acetN/fT8s7SukMg/n8PeiX/ffhjf9K5Lv5D5fnL0b3/bpXktKbQPpny+swOSCd0U9u4eZUaNZ/C1C/0AvjGPz3P5aT2w9Vq7M/b99PxsjcYDtIe0q5/pS+QjqVTNLBJn2B4mTRv0TWmFyfzW6nZcb6F9PR7ZI+/eFB/Cck+ydINrP5snzC6v8ca/w3qL4zoJTVwSxRWAJb9fsktb6YTEv6qGl77dnwHj1hj7ntb7Pr+Rj8r5k8/bGiaTyCnjlNx3HW7L+b/zyboHVJX1PtU9weNs9evP3l7LdEP0LhYTpa7EaOOWLkMBEixx4/cpztDhylksChT7dOBacX2OmbEy47Asd0xozeEzOdtK7Dxu2Ejf+MsOmUf0jkcLcbOvWW99+9pLDsCmVuZHN0cmVhbQplbmRvYmoKMTYwIDAgb2JqCjw8L1R5cGUvWFJlZi9JRFs8ZDEyNDc5YmI2YzgxNDhiNzYzMzk0Mjk5Y2IzMTIxMzY+PGQxMjQ3OWJiNmM4MTQ4Yjc2MzM5NDI5OWNiMzEyMTM2Pl0vUm9vdAoxIDAgUi9JbmZvIDIgMCBSL1NpemUgMTYxL1dbMSAyIDJdL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMzQ0Pj4Kc3RyZWFtCnjaJdK1UgNAFEDRfThBggSCuwcCBHd39+Du7u46FFR8AT/CV0BNRUNDTxFyZ5sz776d2WZXKeVwuCiDuoJLWBVlVEoMZ0qR93ArQW86lZx+62lNTFY9CWyAC7jCEzyAG7iDB3iCF3iDAXzAV0yv+j4/2BLzh05/2JawJ51G2JHwH50BsCeRFp2BsC9RvzqD4EBiGnUGw5HEbeo0wbHEf+oMgRNJ/tMZCmdghjCx3OuDcMiHXoiAHMiFSLBBHkRBIRRBMURDDJRAKcRCGZRDHFRAJcRDLWRDASRAIlRBNSRBDdRBMtRDN6RAD7RDB6RCGnRCF6RDAzRCBjRBM1igBVqhDTIhC6zQByvQD3YYgEEYggUYhnmYghEYhTEYhwmYhBmYhjmYhWVYhCW4gE1Yh104hHM4FSs/O6dHP+MdXIvtxbmzfendI9zI0LtzZw908uxQ6h/Rij2uCmVuZHN0cmVhbQplbmRvYmoKc3RhcnR4cmVmCjM1NTgzCiUlRU9GCg==</File>
    </Filelist>
    <DatabaseInstall Type="pre">
        <TableCreate Type="pre" Name="ota_tokens">
            <Column Name="token" Required="true" Size="64" Type="VARCHAR"></Column>
            <Column Name="ticket_number" Required="true" Size="64" Type="VARCHAR"></Column>
            <Column Name="user" Required="true" Size="191" Type="VARCHAR"></Column>
            <Column Name="used" Required="true" Type="INTEGER"></Column>
            <Column Name="change_time" Required="true" Type="DATE"></Column>
            <Column Name="create_time" Required="true" Type="DATE"></Column>
        </TableCreate>
    </DatabaseInstall>
    <DatabaseUninstall Type="pre">
        <TableDrop Type="pre" Name="ota_tokens">
        </TableDrop>
    </DatabaseUninstall>
</otrs_package>